PVOL1BACKUP D%B1111001001 1Pe _vߋt ***THIS VOLUME DOES NOT CONTAIN A HARDWARE BOOTABLE SYSTEM *** && d W c W  5 E 5ΉU d`\ 7|P   w6և  @ B     Rd    77 Շ&j 3R 5@:$3 \Vܢ^܎Zܷ3 ~& L xPHDR1RSX11MPBL40 00010001000100 00000 00000 000000DECFILE11A PPHDR2U0414404144 M 00 PPRSX11MPBL40RSX11MPBL40W  088<T$DMPQR16SEP87104856DECNPL[!sߕE T~ 6   w5 %LefAEȋA$%@ %A  r  ؁rP͕9Y 5:5 " @U   `"2@@ArB rP5 U5DE  XX X!e 90 4B! 0~1   Y   % %           i RSX11MPBL40ȥ04SEP87100832U RSX11MPBL40 [001,001] DECFILE11A qPUFDNNzPsz0 µ1!0  5 55   e5& Y5 T SP K  E > 5&@@   ) % e  C   r  &V p 0 p 0    5wr     @  ppp 0 0 0  1 1 1 veN*PU5PUFDOOzP rxl^?rl^@rl^Arl^Brl^Crl^Dr[qEr[qFr\KGr]KHr[qyI8xrl^J8l^K8[qL8[qyMt^^Nt^8^OM^PZg9;^QZg8^RZgd^SZg^TZg^uPUFDOPzPUysdVOlysWOlydXxXYkz?TZr8[ Ԁ\_Mp:Ԁ]t:z8xrl^J8l^K8[qL8[qyMt^^Nt^8^OM^PZg9;^QZg8^RZgd^SZg^TZg^uPUFDOQzPPUFD ORzPPUFD OTzP^""_M"_""_Mc""Zr8[ Ԁ\_Mp:Ԁ]t:z8xrl^J8l^K8[qL8[qyMt^^Nt^8^OM^PZg9;^QZg8^RZgd^SZg^TZg^uPUFD OUzPPUFD OvzPPUFD Owz PPUFDOzPrddlddddddddddo0 dd ddddcdd_ddeddmddaddddddg&dd,ddddddddd`ddddddddm%dddddd)!dd"dd&Mdd&Qdd&Rdd&xdd &(dd &sddx'dd'dd(ddfR)ddw*?Tdd2dde4dd8dd8%dd8(dd8[qddy:dd:dd:dd:ddbKddYMdd}MddMddkQddykQ_dqQddiQddQddQddvQddpDRddSddaTddj Xddr[qxQ?8[qxQxe_+xel_,f_-Ol_.Ol_/ q_0r_1rl_2s_3v_4x_5x_6}_7~_8T_9_:_;_~rrys^Zl^sZl^___ ___e_PUFDOz,PPUFDPz,P :}}szKvssyzzyyyyK Ky!"Ts#Tsy$s%sy&s'sy(s)sy* s+ sy,s-sy.Ls/Lsy0s1sy2_3s4sy5Ms6Msy7LSs8LSsy9Tsy?dYs@dYsyAKg_BKg_yC$qsD$qsyE$syF$sG% yH% IsJsyK &[qL &[qyM vLN vL9OsQkQPUFDQz,P@Lyw*?Tyyr[qysKywyxyy(?[q}~K$v("[q _ema a(Aa[q(8[q(;[q&,,(%,[q(6[qD(1%(2[q!(B[q)!)!())![q"GS#Y`EY#ZFb#l&Mx' x'(/x'[q'(((9([qR)w*?T22((2[q488(:8[qy::::(=:[q::(7:[qbKbK(4bK[qYMMM(>M[qkQ kQ(-kQ[qoQCQQQQQ%Q+QDRHRlSaTkQ9KkQ9kQlkQ[skQs zkQskQ̖skQؖHqkQ skQ\skQęskQƙp:kQЙHqkQԙh~kQrjL_04SEP8710105704SEP87101039ܐ.'ffPr8_04SEP8710110604SEP87101058em .(#Q"S04SEP8710112004SEP87101108c(.)FFF#jL_04SEP8710112804SEP87101121E`.*MMX_04SEP8710113604SEP87101130L.+++6&jL_04SEP8710114204SEP87101137*8.,))+jL_04SEP8710114704SEP87101143(8.-..86&M_04SEP8710115204SEP87101148-GA..W"S04SEP8710115604SEP87101154u ./rkQ"S04SEP8710121104SEP87101157.0.'kQ"S04SEP8710121404SEP87101213D^.1 &(04SEP8710121604SEP87101216L.2z &(y04SEP8710121704SEP87101216M.3#$ &[q04SEP8710121804SEP87101218"O .4|  &[qy04SEP8710121904SEP87101219 r.5L &^04SEP8710122104SEP87101220~g.6 &aT^04SEP8710122304SEP87101222.7!! &Q^04SEP8710122404SEP87101224 .8 &Y^#^04SEP8710122604SEP87101225<.9 &_M#^04SEP8710122704SEP871012275.:"" &(K#^04SEP8710122904SEP87101228!.;F BuWTkQ04SEP8710123004SEP87101230 ".<z r(^04SEP8710123104SEP87101230 ).=G4rxrl^04SEP8710123204SEP87101232S.>GVrxl^04SEP8710123304SEP87101233.?WVV.rl^04SEP8710123404SEP87101233U-.@Y&rl^04SEP8710123504SEP87101234mn.AYrl^04SEP8710123604SEP87101235to.BYrl^04SEP8710123704SEP87101236ws.C^rl^04SEP8710123704SEP87101237}s.Dr[q04SEP8710123804SEP87101238S>.E/0r[q04SEP8710123904SEP87101238.?r.Fr\K04SEP8710124004SEP87101239+.G r]K04SEP8710124004SEP87101240..HzZr[qy04SEP8710124104SEP871012410.IML8xrl^04SEP8710124304SEP87101243.JY8l^04SEP8710124404SEP87101243.K'(8[q04SEP8710124504SEP87101244&.Lb8[qy04SEP8710124604SEP87101245 .MTt^^04SEP8710124704SEP87101247 .NJt^8^04SEP8710124804SEP87101248 $ .OM^04SEP8710125004SEP871012492 | .PZg9;^04SEP8710125104SEP87101251B .QFZg8^04SEP8710125204SEP87101252J .RTZgd^04SEP8710125404SEP87101253 P .SrZg^04SEP8710125504SEP87101254^ .TrZg^04SEP8710125604SEP87101256a " PUFDOPzP.UKysd04SEP8710125904SEP87101258d oI.VKOlys04SEP8710130104SEP87101300l xA.WLtOlyd04SEP8710130204SEP87101302p 0.X>:xX04SEP8710130404SEP87101303q .Y@kz?T04SEP8710130504SEP87101305r *.Z"Zr804SEP8710130704SEP87101306 %.[B( Ԁ04SEP8710130804SEP87101308 y.\B(_Mp:Ԁ04SEP8710131004SEP87101309 .]klt:z04SEP8710131704SEP87101311j! PUFDOQzPPUFD ORzPPUFD OTzP.^""_M"04SEP8710132304SEP87101320  z ._cd""_Mc""04SEP8710132504SEP87101324b QPUFD OUzPPUFD OvzPPUFD Owz PPUFDOzP.r] dd04SEP8710134504SEP87101344 \ .l1dd04SEP8710134004SEP87101339F.;dd04SEP8710150004SEP87101500.Qdd04SEP8710144204SEP87101441n.<dd04SEP8710145904SEP87101459 .;dd04SEP8710141404SEP87101413Nk.oK0 dd04SEP8710134204SEP87101342Q.= dd04SEP8710142204SEP87101421.Hdd04SEP8710141504SEP87101414Q .cRdd04SEP8710133304SEP87101332^.:_dd04SEP8710151304SEP87101513J} .*edd04SEP8710143404SEP871014335".Pbmdd04SEP8710151904SEP87101518p].aadd04SEP8710143604SEP87101436e'.U @dd04SEP8710143804SEP87101437 ~.Zdd04SEP8710143704SEP87101436|&.gJ&dd04SEP8710133604SEP871013354.V(,dd04SEP8710142704SEP87101426.` xdd04SEP8710145704SEP87101456 u!.dP*dd04SEP8710133304SEP87101333%.Wdd04SEP8710143304SEP87101432K(.`&dd04SEP8710133004SEP87101330 h.Bxdd04SEP8710142604SEP87101425.W dd04SEP8710150304SEP87101503 .Ndd04SEP8710141804SEP87101417c.m>%dd04SEP8710134004SEP87101340J.\ dd04SEP8710141904SEP87101419tK#.X//dd04SEP8710142904SEP87101429.L.j )!dd04SEP8710144404SEP87101444 '.L|"dd04SEP8710144304SEP87101443V#.R &Mdd04SEP8710144704SEP87101447 |.X\&Qdd04SEP8710151104SEP87101510.[&Rdd04SEP8710150904SEP87101509Ɗ.[ &xdd04SEP8710151004SEP87101509 .IB &(dd04SEP8710150104SEP87101500|F.S &sdd04SEP8710145104SEP87101451 %f.\Px'dd04SEP8710145804SEP87101458<.I:'dd04SEP8710142304SEP87101423 1.U(dd04SEP8710150604SEP87101506T*.f1LR)dd04SEP8710133504SEP871013352L#.Iw*?Tdd04SEP8710151204SEP87101511*z.g z2dd04SEP8710145704SEP87101457 =.eI4dd04SEP8710133404SEP87101334,)2.O 8dd04SEP8710144604SEP87101445 B.Pd8%dd04SEP8710144504SEP87101444Ia.r8(dd04SEP8710135704SEP87101356 IN.r8[qdd04SEP8710135904SEP87101359.U Xy:dd04SEP8710143804SEP87101438 ^B.4(:dd04SEP8710141504SEP87101415U4.^:dd04SEP8710150304SEP87101502J.Or:dd04SEP8710152004SEP87101519t>._bKdd04SEP8710143904SEP87101439_.SYMdd04SEP8710143504SEP87101435`qM.}6.Mdd04SEP8710135304SEP87101353G.W2Mdd04SEP8710145404SEP87101454PAb.X"kQdd04SEP8710143404SEP87101434N\.yXlkQ_d04SEP8710135004SEP87101350q.qQQdd04SEP8710134404SEP87101343YL.i6$Qdd04SEP8710133704SEP87101337:L.L bQdd04SEP8710142004SEP87101420 ||O.c Qdd04SEP8710145604SEP87101455 j[.v&Qdd04SEP8710134804SEP87101347xN.pM.DRdd04SEP8710134304SEP87101342UkL.RSdd04SEP8710144204SEP871014421S.QaTdd04SEP8710150404SEP87101504Oa.j<8 Xdd04SEP8710133804SEP87101338<i.M 6zdd04SEP8710134504SEP87101345gu.;nzdd04SEP8710142104SEP87101421ir.D}dd04SEP8710150204SEP871015010w.M f~dd04SEP8710150504SEP87101505 .\0~%dd04SEP8710143004SEP87101429 .>~dd04SEP8710150804SEP87101508V.44dd04SEP8710144104SEP87101440}.<RTdd04SEP8710142804SEP87101428&.K\|dd04SEP8710151804SEP87101517k\.e dd04SEP8710142504SEP87101424  .J dd04SEP8710145204SEP87101452 2˔.u1Ndd04SEP8710134704SEP87101347u.Pdd04SEP8710151604SEP87101515`.Ixd04SEP8710151704SEP87101516e`.Cz|d_04SEP8710145004SEP871014498 PUFDOzP.; Y04SEP8710171104SEP87101711V.7 ^Z04SEP8710170904SEP87101709`].7 Z04SEP8710171304SEP87101712W.;Y04SEP8710201104SEP87102010aW.9Y04SEP8710201304SEP87102013Z.A^Z04SEP8710200904SEP87102008_.9bZ04SEP8710201504SEP87102015].A Z04SEP8710201704SEP87102017_.<8[q04SEP8710170404SEP87101703z.;Y04SEP8710231504SEP87102315d.:^Z04SEP8710231304SEP871023135c.:Z04SEP8710231804SEP87102317#g.;Y04SEP8710244604SEP871024467i.:^Z04SEP8710244404SEP87102444'Wh.:Z04SEP8710244804SEP87102448>l.;Y04SEP8710214604SEP87102145g.:^Z04SEP8710214404SEP87102143Jf.LZ04SEP8710214804SEP87102148k.?J<9Y04SEP8710260904SEP87102609Fي.:$<9^Z04SEP8710261104SEP87102611L'.:J<9Z04SEP8710261304SEP87102613].aGr%04SEP8710155104SEP87101550 Z.kKr\K04SEP8710155304SEP87101552.n9r]K04SEP8710155304SEP87101553.bMr[q04SEP8710155204SEP87101551.*tsY04SEP8710183304SEP87101833S.*s^Z04SEP8710183104SEP87101830Ѿ.*sZ04SEP8710183504SEP87101835G.G* Yl^04SEP8710171204SEP87101712).G* ^Zl^04SEP8710171004SEP87101710.GJ Zl^04SEP8710171404SEP87101713.Y zYl^04SEP8710201204SEP87102011 ʫ.CYl^04SEP8710201404SEP87102014;.C^Zl^04SEP8710201004SEP87102009.CbZl^04SEP8710201604SEP871020166.C0Zl^04SEP8710201904SEP87102018  .;8[ql^04SEP8710170504SEP871017043.AYl^04SEP8710231604SEP87102316 C.A2^Zl^04SEP8710231404SEP871023145.ABZl^04SEP8710231904SEP87102318$~.JYl^04SEP8710244704SEP871024478κ.J^Zl^04SEP8710244504SEP8710244519.J4Zl^04SEP8710244904SEP87102449?.GYl^04SEP8710214704SEP87102147.G^Zl^04SEP8710214504SEP871021440.GZl^04SEP8710214904SEP87102149.WH<9Yl^04SEP8710261004SEP87102610G.E<9^Zl^04SEP8710261204SEP87102612M[.N<9Zl^04SEP8710261404SEP87102614^.{I rl^04SEP8710163604SEP87101635{.xL$r\Kl^04SEP8710163004SEP87101630EM.zMr]Kl^04SEP8710163104SEP87101631Oz.|Lrl^l^04SEP8710163704SEP87101636I5.wM(r[ql^04SEP8710162904SEP87101629>d?.G`sYl^04SEP8710183404SEP87101834.G`s^Zl^04SEP8710183204SEP87101832u.GsZl^04SEP8710183604SEP87101836!.~~_04SEP8710273404SEP87102723}vj.@_04SEP8710274004SEP87102738Uc.00_04SEP8710274804SEP87102743/|.&&> _04SEP8710275304SEP87102749%8~._04SEP8710275804SEP87102756^h.<<_04SEP8710280604SEP87102801;o΋.**8e_04SEP8710283004SEP87102808)..a_04SEP8710284904SEP87102833X.._04SEP8710285404SEP87102851v.%%J,_04SEP8710290004SEP87102856$π. ((_04SEP8710290604SEP87102902'ׂ. 77R_04SEP8710291504SEP871029096. ]_04SEP8710301504SEP87102917III. @@:p_04SEP8710302404SEP87103018?@D. 11_04SEP8710303004SEP871030260ۓ._04SEP8710304404SEP87103032.cc%_04SEP8710305504SEP87103047bU.99_04SEP8710310104SEP871030578r.xx.jL_04SEP8710312904SEP87103103wG.AAF"_04SEP8710313704SEP87103131@i.T"_04SEP8710315304SEP87103139.eeL&_04SEP8710320504SEP87103156d>.&_04SEP8710322004SEP87103208.2x'_04SEP8710323204SEP87103223;[.<<'_04SEP8710324004SEP87103235;8.jj(_04SEP8710325104SEP87103242i . dw*?T_04SEP8710325504SEP87103253t.08Z_04SEP8710330804SEP87103257} t.WWy:_04SEP8710331804SEP87103310V .33:_04SEP8710332504SEP871033212g .N:_04SEP8710333804SEP87103328 .&1KX_04SEP8710334204SEP87103341&!.FFbK_04SEP8710335304SEP87103345E;!A. MMYM_04SEP8710340204SEP87103355L!.!66M_04SEP8710340804SEP871034035!."kQ_04SEP8710342104SEP87103411"6.#;;Q_04SEP8710344404SEP87103424":#.${{fDR_04SEP8710345404SEP87103446z#$.%J4SJ_04SEP8710350604SEP87103456P$.&ffTaT_04SEP8710351704SEP87103509e$.'8QXx_04SEP8710352104SEP87103519 <%8.(__04SEP8710353504SEP87103523J%N].)""w!!r[qxQ04SEP8710402004SEP87104020 0 S.?wx8[qxQ04SEP8710402204SEP87104021!0PUFDOz,PPUFDPz,P.,PGG( :}}16SEP8710433416SEP87104333F.,sz04SEP8711020804SEP87105222JJ6., !04SEP8710522404SEP87105224<.,K04SEP8710522504SEP87105225\1.,56v04SEP8710522704SEP871052264b.,s04SEP8710522804SEP87105228.,zsy04SEP8710522904SEP87105229H7.,z04SEP8710523104SEP87105230 8@.,z4zy04SEP8710523104SEP87105231FL., 04SEP8710523304SEP87105232 L.,z,y04SEP8710523304SEP87105233X̿.,04SEP8710523504SEP87105234\.,z\y04SEP8710523504SEP87105235b.,04SEP8710523704SEP87105236d.,$y04SEP8710523704SEP87105237fv.,K04SEP8710523904SEP87105238gVG. ,z @Ky04SEP8710524004SEP87105239 xn=.!,04SEP8710524104SEP87105240.", Ts04SEP8710524204SEP87105242u.#,zTsy04SEP8710524404SEP87105243,j.$,s04SEP8710524504SEP87105244w.%,z|sy04SEP8710524604SEP87105246cl.&,s04SEP8710524704SEP87105247/x.',z$sy04SEP8710524904SEP87105248/o.(,s04SEP8710525004SEP87105250]t.),zsy04SEP8710525104SEP87105251Ri.*, s04SEP8710525304SEP87105252x.+,z< sy04SEP8710525404SEP87105254m.,, s04SEP8710525504SEP87105255n}.-,zsy04SEP8710525704SEP871052569q..,Ls04SEP8710525804SEP87105258 ./,zLsy04SEP8710525904SEP87105259ɏas.0,s04SEP8710530104SEP87105300ˏmq.1,zLsy04SEP8710530204SEP87105302.2,_04SEP8710530404SEP87105303t)D.3, s04SEP8710530504SEP87105305ҏy.4,zsy04SEP8710530604SEP87105306ڏ6m.5,Ms04SEP8710530804SEP87105307ۏG.6,z4Msy04SEP8710530904SEP87105308ߏT.7, LSs04SEP8710531004SEP87105310.8,zLSsy04SEP8710531104SEP87105311|.9, ,zTsy04SEP8710531904SEP87105319.?,dYs04SEP8710532004SEP87105320 X.@,zdYsy04SEP8710532204SEP87105321 å.A,Kg_04SEP8710532304SEP87105323(.B,zKg_y04SEP8710532404SEP87105324.C,$qs04SEP8710532604SEP871053250.D,z,$qsy04SEP8710532704SEP871053265.E,z$sy04SEP8710532804SEP87105328..F, $s04SEP8710532904SEP87105329#y.G,z% y04SEP8710533104SEP87105330B8.H, % 04SEP8710533204SEP87105332C.I,s04SEP8710533304SEP87105333K.J,z4sy04SEP8710533404SEP87105334P.K,#$ &[q04SEP8710533604SEP87105336"Q.L,|  &[qy04SEP8710533704SEP87105337 tށ.M,N vL04SEP8710533904SEP87105339s.N,  vL904SEP8710534004SEP87105340KT.O,N&&BsQkQ04SEP8710534204SEP87105342%PUFDQz,P.@,:L04SEP8710450904SEP87104508uA.,zPy04SEP8710420404SEP871042044.,zw*?Tyy04SEP8710425404SEP87104254RB.,zr[qy04SEP8710415004SEP871041503Na.,zsKy04SEP8710415104SEP871041510 3.,zwy04SEP8710421604SEP871042168.,zxy04SEP8710432204SEP87104321^K .,z 0y04SEP8710422104SEP87104221 $9l.,`a04SEP8710431704SEP87104317_YJ.,89(04SEP8710435104SEP871043517fQ .?,9:[q04SEP8710442104SEP871044218XUY.,#$04SEP8710415704SEP87104156"84.,;<}04SEP8710421904SEP87104218:8lJ.,)*~K04SEP8710432404SEP87104324(yKN.$,)*v04SEP8710435604SEP87104356( S.,-.04SEP8710431904SEP87104319,J.,04SEP8710415604SEP87104156'4v.,(04SEP8710432304SEP87104322`Kr.", [q04SEP8710435504SEP87104354R'.,9: 04SEP8710425204SEP871042518}A4.,04SEP8710415804SEP87104157[4.,UV04SEP8710423504SEP87104234T;@.,!"_04SEP8710421904SEP87104219 8 .,e04SEP8710430204SEP87104301D3.,m04SEP8710422004SEP871042209.,a04SEP8710431604SEP87104315eI}. ,a(04SEP8710435204SEP87104352Qt.A,a[q04SEP8710442404SEP871044241Y .,xy04SEP8710430504SEP87104304wE!.,ef(04SEP8710434704SEP87104346dfPGG.8,fg[q04SEP8710441504SEP87104414e#W.,:;04SEP8710430804SEP871043089tGk.,(04SEP8710434504SEP87104344Pd.;,[q04SEP8710441804SEP871044172XL.,NO&04SEP8710423404SEP87104233M;.,./,04SEP8710420904SEP87104208-5.,,(04SEP8710432604SEP87104326KN.%,,[q04SEP8710435704SEP871043573SH.,)*04SEP8710425604SEP87104256(B*.,(04SEP8710434104SEP87104340O,.6,[q04SEP8710441304SEP87104412VE.,BC04SEP8710431204SEP87104312AHs.,04SEP8710421204SEP87104211N6N7\.,-.04SEP8710415504SEP87104155,3.D,04SEP8710442704SEP87104427Z.,LM04SEP8710424704SEP87104246Kh@.,,-(04SEP8710433704SEP87104336+oN..1,2304SEP8710440904SEP871044081.Vh.,VW04SEP8710424504SEP87104244U? .,MN%04SEP8710425504SEP87104255LSB.,CD04SEP8710424604SEP87104245B%@+.,#$(04SEP8710433704SEP87104337"N.2,)*[q04SEP8710440904SEP87104409(`Ve.,04SEP8710425904SEP87104258ۜC.!,(04SEP8710435404SEP871043532R.B,[q04SEP8710442604SEP87104425Y.,89)!04SEP8710422504SEP8710422579.,)!(04SEP8710432904SEP87104328 L.),)![q04SEP8710440004SEP87104400S8O.,23"04SEP8710422504SEP8710422419.G,/0S#Y`04SEP8710443004SEP87104429.Ze.E, Y#Z04SEP8710442804SEP87104428 Z:.F, b#l04SEP8710442904SEP87104428Z.,*+&M04SEP8710420604SEP87104205)5!.,x'04SEP8710424304SEP87104242?!?. ,GHx'(04SEP8710433204SEP87104331FwL2./,bcx'[q04SEP8710440704SEP87104406aU&.,FG'04SEP8710430904SEP87104309EG .,bc(04SEP8710430604SEP87104305aEFR!.,IJ((04SEP8710434604SEP87104345HP>.9,JK([q04SEP8710441604SEP87104415IW .,R)04SEP8710420704SEP87104206D5., w*?T04SEP8710425204SEP87104252 A.,CD204SEP8710422404SEP87104223Bg9>.,*+2(04SEP8710432804SEP87104328)KO&.(,*+2[q04SEP8710440004SEP87104359)tSu.,bc404SEP8710423604SEP87104235aN<r%.,st804SEP8710430404SEP87104303rZE?.,^_8(04SEP8710434404SEP87104343]O}a.:,_`8[q04SEP8710441704SEP87104416^W.,:;y:04SEP8710422704SEP871042279#:.,+,:04SEP8710420104SEP87104200*4.,xy:04SEP8710431104SEP87104311w-HuH.,UV:(04SEP8710434904SEP87104348TP`.=,WX:[q04SEP8710441904SEP87104419VdX.,./:04SEP8710430304SEP87104302-,E.,:(04SEP8710434304SEP87104342O.7,:[q04SEP8710441404SEP87104413 WUk.,QRbK04SEP8710424904SEP87104248P@3.,()bK(04SEP8710433904SEP87104339'NA.4,34bK[q04SEP8710441104SEP871044112V.,12YM04SEP8710420304SEP8710420204.,DEM04SEP8710431304SEP87104313CH).,M(04SEP8710434904SEP871043497Q_;.>,M[q04SEP8710442004SEP87104420Xӂ.,_`kQ04SEP8710423804SEP87104237^<A. ,GHkQ(04SEP8710433204SEP87104332FL].-,GHkQ[q04SEP8710440504SEP87104404FT.,!"oQ04SEP8710423704SEP87104236 <.C,Q04SEP8710442704SEP87104426Zz.,Q04SEP8710421404SEP871042147~.,Q04SEP8710415804SEP87104158y4Sl.,Q04SEP8710415904SEP87104159}4rn.,Q%04SEP8710420204SEP871042014.,Q+04SEP8710420004SEP871042004+.,Q04SEP8710420304SEP871042034A.,DR04SEP8710425804SEP87104257BX.H, Rl04SEP8710443104SEP87104430 [J.,56S04SEP8710422804SEP871042284]:.,WXaT04SEP8710423304SEP87104232VT;<.,9:7fHd?tNH001001SYSTEMSYSTEM SYSTEM SY00Qz200001USER USER A.NEW SY00QJ00DATADATADATADATADATADATADATADATADATADATA00' 1g00/ 5TADATADATADATADATADATADATADATADATA.;C.;***************************************************************** .;* *3.;* RSX-11M-PLUS distribution kit. * .;* *.;* **.;* Version 4.0 Base level 40 *.;* *4.;* Created on 04-SEP-87 at 10:09:20 *.;* *..;* Created by KITBUILD version 06.05 *.;* *4.;* This kit is labelled RSX11MPBL40 *.;* *C.;*****************************************************************E.; .ENABLE GLOBAL* .ENABLE SUBSTITUTION* .SETS $V30LV "K,"***** .;* *3.;* RSX-11M-PLUS distribution kit. * .;* *.;* **.;* Version 4.0 Base level 40 *.;* *4.;* Created on 04-SEP-87 at 10:09:20 *.;* *..;* Created by KITBUILD version 06.05 *.;* *4.;* This kit is labelled RSX11MPBL40 *.;* *C.;*****************************************************************E00!7"8 1g .; Title: VERSION.CMD .;E< .; This file defines the system version number for BASTART. .;  .ENABLE GLOBAL .SETS $VERSN "4.0" .SETS $BLVL "40" *.;* **.;* Version 4.0 Base level 40 *.;* *4.;* Created on 04-SEP-87 at 10:09:20 *.;* *..;* Created by KITBUILD version 06.05 *.;* *4.;* This kit is labelled RSX11MPBL40 *.;* *C.;*****************************************************************E<0W .9$8,(;+K,[,[-^[.F648h/4;h.(4Kh.5[05[/v5[0@L 81tL ;10L K1r /1r /2vr 024/ && "!~8!"!K+$M+)}E8OF: &O 683X6;26K3)4)4)4b/7/8 08[5[6[6w8:;9K9ύ؍N8:;;K;%  Ct<Ct<fCt=&==^ >)>)>)>f/?/?Z 0@8@;@KAΫϫ~zxnB{nAPnBqg;qz8OC;OBhKOC*:#"ة*r(*:**{"z/D/E@ 0F[C[DB[D ksztG tFtF8hG;hGxKhG22/G2/H2 0H`[ R t!!H!!I!! IN'!)J$'!)I'!)J6!8J6!;K6!KKP[!8K[!;L[!KLq!tMVq!tM*q!tMs!8hNs!;hMs!KhNj""D #)Ov #)N2 #)N #8Pp #;O0 #KO#8Qv#;P#KP#HR#HQ# IRB & &Q !&9!&Jt"& "&)"&)"&Hb"& I"&z/&&#/&)V/&9h/&Jh2&2& ^3&^)jI&  I&8RI&;SI&KS:&^&b&: &{; (^(8(z\(S(8TX(UH;,xR.8dR.;cR.Kc./d./e,. 0e.g8.f . f.xUh.{Ug.UgR.Hj.Hi. Ii3  4^B 4bR9tk9tk9tkT:ksL;{ KkK,2M "=M{^$xQkxQ8lxQlRST8m@T;lTKmwx w{ ~w <x/x/x 0x8h yS0y hyyBy Cy:Eyx Ey{ Ey lNy8Ny;NyKj00"?5TADATADATADATADATADATADATADATADATARyx xRy{ 2Ry Wy[4Wy[Wy[yx y{ y Hyx y{ y Jy)y)y)Ty8by;yKyx ,y{ y y)|y)*y)y}8yxUvy{UFyUyayay by8hVy;hyKhfyx#fy{#y#4z,4z4zDzHjDzH Dz Ikz8Pkz;kzKf}x "}{ "} #~/T~/N~ 0h~[~[~[[X3c')')')`I8h,I;hIKhL:L8hL;hLKhS8S;SKSzTSzS {S8S;vSKH|x |{ "| T 8bSb P58h5;h5Kh}>// 0laxa4 bx#{##b\,E\tHH\ Ila w,"JwtRj\a e^a ><^ .BLKB NFILES*S.BFHD+B .IFF .BLKB NFILES*T .ENDC .PSECT PSECTL .ENDM FSRSZ$fW  .MACRO FDBDF$ .MCALL FDBSZ$ FDBSZ$B ...PC1=.L .BLKB S.FDB .ENDM FDBDF$EW 00"O5TADATADATADATADATADATADATADATADATA' .MACRO FDAT$A RTYP,RATT,RSIZ,CNTG,ALOC .MCALL FDOFF$,CBYTE$,CWORD$ FDOFF$ DEF$L, CBYTE$ ,F.RTYPA CBYTE$ ,F.RATTC CWORD$ ,F.RSIZD CWORD$ ,F.CNTG CWORD$ ,F.ALOCS .ENDM FDAT$AW  .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$AW ( .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$ACW ! .MACRO FDBF$A EFN,OVBS,MBCT,MBFG  .MCALL FDOFF$,CBYTE$,CWORD$ FDOFF$ DEF$L CBYTE$ ,F.EFNC CWORD$ ,F.OVBSD CBYTE$ ,F.MBCTO CBYTE$ ,F.MBFGC .ENDM FDBF$AOW , .MACRO FDBK$A BKAD,BKSZ,BKVB,BKEF,BKST,BKDN .MCALL FDOFF$,CBYTE$,CWORD$ FDOFF$ DEF$LF CWORD$ ,F.BKDS+2$ CWORD$ ,F.BKDS  CWORD$ ,F.BKVB+2U CBYTE$ ,F.BKEFP CWORD$ ,F.BKSTN CWORD$ ,F.BKDNC .ENDM FDBK$ACW + .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$RBW ! .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$RFW , .MACRO FDOP$R FDB,LUN,FNPT,DFNB,FACC,FACTRL .MCALL LDFDB$,CMOV$W,CMOV$B LDFDB$ FDB CMOV$B LUN,F.LUNT CMOV$W FNPT,F.DSPT, CMOV$W DFNB,F.DFNBD CMOV$B FACC,F.FACCL CMOV$W FACTRL,F.ACTLP .ENDM FDOP$R$W % .MACRO FDBF$R FDB,EFN,OVBS,MBCT,MBFGC .MCALL LDFDB$,CMOV$W,CMOV$B LDFDB$ FDB CMOV$B EFN,F.EFNR CMOV$W OVBS,F.OVBSA CMOV$B MBCT,F.MBCT$ CMOV$B MBFG,F.MBFGB .ENDM FDBF$R W 0 .MACRO FDBK$R FDB,BKAD,BKSZ,BKVB,BKEF,BKST,BKDN# .MCALL LDFDB$,CMOV$B,CMOV$W,CMOV$2P LDFDB$ FDBP CMOV$W BKAD,F.BKDS+2C CMOV$W BKSZ,F.BKDSV CMOV$2 BKVB,F.BKVBO CMOV$B BKEF,F.BKEF$ CMOV$W BKST,F.BKST$ CMOV$W BKDN,F.BKDN$ .ENDM FDBK$R~W  .MACRO FDBSZ$ .IIF DF,S.FDB,.MEXIT .MCALL FDOFF$,DEF$L FDOFF$ DEF$NC DEF$L S.FDB .ENDM FDBSZ$BRW  .MACRO FDOF$L .MCALL FDOFF$ FDOFF$ DEF$L .ENDM FDOF$LCW + .MACRO NMBLK$ FNAME,FTYPE,VERS,DEVNAM,UNITD .MCALL RAD50$,CWORD$,NBOFF$ NBOFF$ DEF$LL .IIF NDF,...PC1,...PC1=0$ ...PC3=...PC1 ...PC1=.K .=...PC1+N.FNAM RAD50$ ,S.FNAM/2 .=...PC1+N.FTYP RAD50$ ,S.FTYP/2 CWORD$ ,N.FVERK .IF NB,DEVNAM .=...PC1+N.DVNM .WORD "DEVNAM .ENDC CWORD$ ,N.UNITI .=...PC1+S.FNB$ ...PC1=...PC3 .ENDM NMBLK$SRW  .MACRO NBOF$L .MCALL NBOFF$ NBOFF$ DEF$LD .ENDM NBOF$LEW  .MACRO LDFDB$ FDB .IIF B,FDB,.MEXIT .NTYPE PAR$$$,FDB .IIF EQ,PAR$$$,.MEXIT MOV FDB,R0 .ENDM LDFDB$W  .MACRO CMOV$W VAR,OFFSET. .IF IDN,<#0>,. CLR OFFSET(R0)A .MEXITM .ENDC .IIF NB,VAR, MOV VAR,OFFSET(R0) .ENDM CMOV$WVW  .MACRO CMOV$B VAR,OFFSETM .IF IDN,<#0>,N CLRB OFFSET(R0) .MEXIT .ENDC! .IIF NB,VAR, MOVB VAR,OFFSET(R0)B .ENDM CMOV$BW  .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$2RW  .MACRO CBYTE$ VAR,OFFSET .IF NB,VAR ...PC2=.V .=...PC1+OFFSET .BYTE VAR .=...PC2R .ENDC .ENDM CBYTE$W  .MACRO CWORD$ VAR,OFFSETN .IF NB,VAR ...PC2=. .=...PC1+OFFSET .WORD VAR .=...PC2< .ENDC .ENDM CWORD$T"W & .MACRO CSTRG$ VAR,OFFSET,MAXLG,FILL=0 .IF NB, .NCHR ...PC3, .IF GE MAXLG-...PC3F ...PC2=., .=...PC1+OFFSET .ASCII ^VAR^F .REPT MAXLG-...PC3 .BYTE FILLS .ENDR .=...PC2R .IFF .ER00"W8 1gROR .ENDCB .ENDC .ENDM CSTRG$NZW  .MACRO CGET$B OFFSET,VARV" .IIF NB MOVB OFFSET(R0),VAR .ENDMZW  .MACRO CGET$W OFFSET,VARF! .IIF NB MOV OFFSET(R0),VARS .ENDMHW  .MACRO FCSBT$ GLOBL .MCALL DEFIN$ ...GBL=0R" .IIF IDN,,,...GBL=1 DEFIN$ FD.FTN,1 DEFIN$ FD.CR,2 DEFIN$ FD.PRN,4 DEFIN$ FD.BLK,10 DEFIN$ FD.RWM,1 DEFIN$ FD.RAN,2 DEFIN$ FD.PLC,4 DEFIN$ FD.INS,10L DEFIN$ FD.REC,1 DEFIN$ FD.CCL,2 DEFIN$ FD.TTY,4 DEFIN$ FD.DIR,10C DEFIN$ FD.SDI,20 DEFIN$ FD.SQD,40B DEFIN$ FD.ISP,2000B DEFIN$ FD.OSP,4000) DEFIN$ FD.PSE,10000 DEFIN$ FD.COM,20000 DEFIN$ FD.F11,40000 DEFIN$ FD.MNT,100000, DEFIN$ NB.VER,1 DEFIN$ NB.TYP,2 DEFIN$ NB.NAM,4 DEFIN$ NB.SVR,10. DEFIN$ NB.STP,20G DEFIN$ NB.SNM,40L DEFIN$ NB.DIR,100 DEFIN$ NB.DEV,200 DEFIN$ NB.SD1,400 DEFIN$ NB.SD2,1000F DEFIN$ NB.ANS,2000  DEFIN$ NB.WCH,4000P DEFIN$ R.FIX,1I DEFIN$ R.VAR,2D DEFIN$ R.SEQ,3D DEFIN$ R.STM,4D DEFIN$ FA.RD,1D DEFIN$ FA.WRT,2 DEFIN$ FA.EXT,4 DEFIN$ FA.CRE,10N DEFIN$ FA.TMP,20F DEFIN$ FA.SHR,40D DEFIN$ FA.APD,100 DEFIN$ FA.NSP,100 DEFIN$ FO.RD,FA.RD0# DEFIN$ FO.WRT,FA.WRT!FA.EXT!FA.CREV# DEFIN$ FO.APD,FA.WRT!FA.EXT!FA.APDM DEFIN$ FO.MFY,FA.WRT DEFIN$ FO.UPD,FA.WRT!FA.EXT DEFIN$ FA.ENB,100000R DEFIN$ FA.SEQ,40000 DEFIN$ FA.WCK,20000 DEFIN$ FA.POS,10000 DEFIN$ FA.RWD,4000  DEFIN$ FA.EXL,4000P DEFIN$ FA.LKL,2000D DEFIN$ FA.EXC,2000N DEFIN$ FA.DLK,1000. DEFIN$ CH.AND,1 DEFIN$ FD.RAH,1 DEFIN$ FD.WBH,2 DEFIN$ FL.AEX,1;E DEFIN$ FF.RWD,1 DEFIN$ FF.POE,2 DEFIN$ FF.NV,3  DEFIN$ FF.SPC,4 DEFIN$ FF.CHR,5 DEFIN$ FF.RWF,6 DEFIN$ FT.ANI,1 DEFIN$ FT.BBF,2 DEFIN$ FT.MBF,4 .MACRO FCSBT$ ARG .ENDM FCSBT$Y .ENDM FCSBT$NfW  .MACRO DEFIN$ SYM,VAL .IIF EQ,...GBL-1,.GLOBL SYM SYM=^O .ENDM DEFIN$AW  .MACRO FDOFF$ OFFSET  .MCALL OFFSET,DEF$I,NBOFF$2 NBOFF$ OFFSET DEF$I 0 OFFSET F.RTYP,1 OFFSET F.RATT,1 OFFSET F.RSIZ,2 OFFSET F.HIBK,4 OFFSET F.EFBK,4 OFFSET F.FFBY,2 OFFSET S.FATT OFFSET F.RACC,1 OFFSET F.RCTL,1 OFFSET F.BKDS OFFSET F.URBD,4 OFFSET F.BKST OFFSET F.NRBD,2 OFFSET F.BKDN OFFSET ,2 OFFSET F.OVBS OFFSET F.NREC,2 OFFSET F.EOBB,2 OFFSET F.CNTG OFFSET F.RCNM,2 OFFSET F.STBK OFFSET ,2 OFFSET F.ALOC,2 OFFSET F.LUN,1M OFFSET F.FACC,1 OFFSET F.DSPT,2 OFFSET F.DFNB,2 OFFSET F.BKEF OFFSET F.EFN,1F OFFSET F.BKP1,1 OFFSET F.ERR,21 OFFSET F.MBCT,1 OFFSET F.MBC1,1 OFFSET F.MBFG,1 OFFSET F.BGBC,1 OFFSET F.VBSZ,2 OFFSET F.BBFS,2 OFFSET F.BKVB OFFSET F.VBN,41 OFFSET F.BDB,2 OFFSET F.EXT4 OFFSET F.SPDV,2 OFFSET F.FLG2 OFFSET F.SPUN,1 OFFSET F.CHR,1E OFFSET F.ACTL,2 OFFSET F.SEQN,2 OFFSET F.FNB,S.FNBN! .IIF IDN,,,.MEXITK .IF IDN,,C* .GLOBL F.FNAM,F.FTYP,F.FVER,F.DVNM,F.UNIT .ENDC F.FNAM=N.FNAM+F.FNB F.FTYP=N.FTYP+F.FNB F.FVER=N.FVER+F.FNB F.DVNM=N.DVNM+F.FNB F.UNIT=N.UNIT+F.FNB OFFSET S.FDB1 DEF$I 0 OFFSET FX.LEN,2 OFFSET FX.DMX,1 OFFSET FX.DLN,1 OFFSET FX.DIR,2 .MACRO FDOFF$ ARG .ENDM FDOFF$ .ENDM FDOFF$EW  .MACRO BDOFF$ OFFSET2 .MCALL OFFSET,DEF$I DEF$I 0 OFFSET ,4 OFFSET B.VBN,4E OFFSET B.BBFS,2 OFFSET B.NXBD,2 OFFSET ,1 OFFSET B.BFST,1 OFFSET ,2 OFFSET S.BFHD! .IIF IDN,,,.MEXITD .MACRO BDOFF$ ARG .ENDM BDOFF$F .ENDM BDOFF$.vW  .MACRO NBOFF$ OFFSET= .MCALL OFFSET,DEF$I,DEF$L DEF$I 0 OFFSET S.FNAM OFFSET S.FTYP OFFSET S.FNTY OFFSET S.FNBW OFFSET S.ANM1 OFFSET S.ANM2 S.FNAM=6F S.FTYP=2N S.ANM1=12.. S.ANM2=5. S.FNTY=/2  OFFSET N.FID,2. OFFSET N.ANM1,4 OFFSET N.FNAM,S.FNAM OFFSET N.FTYP,S.FTYPE OFFSET N.FVER,2 OFFSET S.NFEN DEF$L S.NFEN  OFFSET N.STAT,2 OFFSET N.NEXT,2 OFFSET N.ANM2 OFFSET N.DID,6I OFFSET N.DVNM,2 OFFSET N.UNIT,2 OFFSET S.FNBF DEF$L S.FNB S.FNBW=S.FNB/2B! .IIF IDN,,,.ME00"_5TADATADATADATADATADATADATADATADATAXITD .MACRO NBOFF$ ARG .ENDM NBOFF$F .ENDM NBOFF$F2W  .MACRO FSROF$ OFFSET1 .MCALL OFFSET,DEF$I,DEF$L DEF$I 0 OFFSET ,4 OFFSET A.BFSR,2 OFFSET A.EFSR,2 OFFSET A.OWUI,2 OFFSET A.FIPR,2 OFFSET A.DPB,24.. OFFSET A.IOST,4 OFFSET A.DFDR,26. OFFSET A.DFBC,2 OFFSET A.DFUI,2 OFFSET A.JUMP,4 OFFSET A.MODE,2 OFFSET A.EXDS,12. .IF DF L$$GCL OFFSET A.LGBK,50. S.LGBK=50.F OFFSET A.PRS,28.E S.PRS=28. .ENDC OFFSET S.FSR2 DEF$L S.FSR2, DEF$I 0 OFFSET A.OUBK,80. OFFSET A.LODV,6 OFFSET A.LODI,42. OFFSET A.LIDV,6 OFFSET A.LIDI,42. S.LDV=6 S.LDI=42. OFFSET A.LDVL,2 OFFSET A.LDVA,2 OFFSET A.LDIL,2 OFFSET A.LDIA,2 OFFSET S.FSR5 DEF$I 0 OFFSET ,16. OFFSET D.DFID,6 OFFSET D.DFDV,2 OFFSET D.DFUN,2! .IIF IDN,,,.MEXITF .MACRO FSROF$ ARG .ENDM FSROF$O .ENDM FSROF$.W  .MACRO FDSOF$ OFFSET5 .MCALL OFFSET,DEF$I,DEF$L DEF$I 0 OFFSET N.DEVD,4 OFFSET N.DIRD,4 OFFSET N.FNMD,4 OFFSET S.FIDS .IF IDN,,6 DEF$L S.FIDSI .MEXITF .ENDC .MACRO FDSOF$ ARG .ENDM FDSOF$ .ENDM FDSOF$FrW  .MACRO DEF$G VAR,SIZ. .MCALL DEF$L  .IIF NB,VAR,.GLOBL VAR DEF$L VAR,SIZ .ENDM DEF$GVW  .MACRO DEF$N VAR,SIZF .MCALL DEF$L, DEF$L ,SIZE .ENDM DEF$NFW  .MACRO DEF$I IVAL ...TPC=^O .ENDM DEF$IW  .MACRO DEF$L SYM,SIZI .IF NB,SYMI SYM=^O<...TPC>D .ENDC .IF NB,SIZ ...TPC=^O<...TPC+SIZ> .ENDC .ENDM DEF$LW  .MACRO RAD50$ STRING,MAXWRD ...PC2=.D .RAD50 /STRING/ .IF GT,<.-...PC2>-^O<2*MAXWRD>3 .ERROR ;STRING RAD50 - STRING TOO LONG, TRUNCATED  .=^O<...PC2+<2*MAXWRD>> .MEXIT .ENDC .REPT ^O/2>> .WORD 0 .ENDR .ENDM RAD50$F@W  .MACRO CALL ADR JSR PC,ADR .ENDM CALL.<W  .MACRO RETURN RTS PC .ENDM RETURN$>W  .MACRO CALLR ADRT JMP ADR .ENDM CALLRW  .MACRO ABRT$C TSK,PSCT,ERRL .MCALL ABRT$,DIR$ .IF NDF $$$GLBR .PSECT $DPB$.,D$$$=.. .IFTF ABRT$ TSK .IFT. .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM ABRT$C W  .MACRO ABRT$S NADR,ERRD .MCALL RFA$,DIR$C RFA$ NADR MOV (PC)+,-(SP) .BYTE 83.,3 DIR$ ,ERR .ENDM ABRT$SW  .MACRO ABRT$ TSKR .MCALL R50$,OFF$L .IF NDF $$$GLB .BYTE 83.,3 R50$ TSKP .ENDC .IF NDF A.BTTN .NLIST OFF$R OFF$ A.BTTN,4 .LIST .ENDC .ENDM ABRT$vW & .MACRO ACHN$ MOD,TBMSK,LUN,FSBUF,FSSZ .MCALL OFF$,LNMOD$. .IF NDF $$$GLB$ LNMOD$F .BYTE 207.,5 .BYTE 6 .BYTE MOD .BYTE LUN .BYTE TBMSK .WORD FSBUF .WORD FSSZ .ENDC .IF NDF A.LFUNR6 .IRP X,<,,,,> OFF$ X3 .ENDM .IRP X,<,> OFF$ XA .ENDM .ENDC .ENDM ACHN$W . .MACRO ACHN$C MOD,TBMSK,LUN,FSBUF,FSSZ,CS,ERR .MCALL ACHN$,DIR$ .IF NDF $$$GLBT .PSECT $DPB$.,D$$$=.N .IFTF ACHN$ MOD,TBMSK,LUN,FSBUF,FSSZ  .IFTS .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ACHN$C$W + .MACRO ACHN$S MOD,TBMSK,LUN,FSBUF,FSSZ,ERRN .MCALL DIR$,MOV$,MVB$,LNMOD$. LNMOD$ MOV$ FSSZ MOV$ FSBUFR MVB$ LUN,TBMSKU MVB$ #6,MOD MOV (PC)+,-(SP) .BYTE 207.,53 DIR$ ,ERR .ENDM ACHN$S2W # .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$CKW  .MACRO ALTP$S NAME,PRI,ERR$ .MCALL MOV$,RFA$,DIR$ MOV$ PRI RFA$ NAME MOV (PC)+,-(SP) .BYTE 9.,4B DIR$ ,ERR .ENDM ALTP$SMW  .MACRO ALTP$ NAME,PRI .MCALL R50$,OFF$U .IF NDF $$$GLB6 .BYTE 9.,4C R50$ NAME .WORD PRI .ENDC .IF NDF A.LTTN$ .NLIST OFF$ OFF$ A.LTTN,4 OFF$ A.LTPR,2 .LIST .ENDC .ENDM ALTP$W  .MACRO ALUN$C LUN,DA,DU,CS,ERR .MCALL ALUN$,DIR$ .IF NDF $$$GLBS .PSECT $DPB$.,D$$$=.C .IFTF ALUN$ LUN,D00"g8 1gA,DU .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ALUN$CIW  .MACRO ALUN$S LUN,DA,DU,ERR .MCALL MOV$,DIR$E MOV$ DU MOV$ DA MOV$ LUN MOV (PC)+,-(SP) .BYTE 7,4 DIR$ ,ERR .ENDM ALUN$SFRW  .MACRO ALUN$ LUN,DA,DUP .MCALL OFF$ .IF NDF $$$GLB. .BYTE 7,4 .WORD LUN .IF B  .WORD 0 .IFF .NCHR $$$T1,$$$$T2=. .ASCII /DA/ .=$$$T2+2L .ENDC .WORD DU. .ENDC .IF NDF A.LULUF .NLIST+ .IRP X,<,,,>D OFF$ XF .ENDM .LIST .ENDC .ENDM ALUN$W  .MACRO ASTX$C PSCT,ERR  .MCALL ASTX$,DIR$ .IF NDF $$$GLBR .PSECT $DPB$.,D$$$=.M .IFTF ASTX$ .IFTS .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM ASTX$CW  .MACRO ASTX$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 115.,1L DIR$F .IIF NB , JSR PC,ERR .ENDM ASTX$SAZW  .MACRO ASTX$T .IF NDF $$$GLBO .BYTE 115.,1 .ENDC .ENDM ASTX$W  .MACRO ATRG$ RDB, .MCALL OFF$ .IF NDF $$$GLB .BYTE 57.,2 .WORD RDB .ENDC .IF NDF A.TRBAA OFF$X OFF$ A.TRBA,2 .ENDC .ENDM ATRG$W  .MACRO ATRG$C RDB,CS,ERRF .MCALL ATRG$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=.A .IFTF ATRG$ RDB .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ATRG$C.W  .MACRO ATRG$S RDB,ERR .MCALL DIR$,MOV$$ MOV$ RDB MOV (PC)+,-(SP) .BYTE 57.,2 DIR$ ,ERR .ENDM ATRG$SW 0 .MACRO CINT$C VEC,BASE,ISR,DSI,PSW,AST,PSCT,ERR .MCALL CINT$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.N .IFTF CINT$ VEC,BASE,ISR,DSI,PSW,ASTC .IFTM .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM CINT$CW + .MACRO CINT$S VEC,BASE,ISR,DSI,PSW,AST,ERR .MCALL RVP$,DIR$ RVP$ VEC,BASE,ISR,DSI,PSW,AST MOV (PC)+,-(SP) .BYTE 129.,7 DIR$ ,ERR .ENDM CINT$SRLW & .MACRO CINT$ VEC,BASE,ISR,DSI,PSW,AST .MCALL OFF$ .IF NDF $$$GLBM .BYTE 129.,7 .WORD VEC .WORD BASEC .WORD ISR .WORD DSI .WORD PSW .WORD AST .ENDC .IF NDF C.INVE OFF$  OFF$ C.INVE,2 OFF$ C.INBA,2 OFF$ C.INIS,2 OFF$ C.INDI,2 OFF$ C.INPS,2 OFF$ C.INAS,2 .ENDC .ENDM CINT$W  .MACRO CLEF$C EFN,CS,ERR, .MCALL CLEF$,DIR$ .IF NDF $$$GLBR .PSECT $DPB$.,D$$$=.I .IFTF CLEF$ EFN .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CLEF$CW  .MACRO CLEF$S EFN,ERR .MCALL MOV$,DIR$$ MOV$ EFN$ MOV (PC)+,-(SP) .BYTE 31.,2 DIR$ ,ERR .ENDM CLEF$SRW  .MACRO CLEF$ EFN .MCALL OFF$ .IF NDF $$$GLB .BYTE 31.,2 .WORD EFN .ENDC .IF NDF C.LEEFO .NLISTI OFF$F OFF$ C.LEEF,2 .LIST .ENDC .ENDM CLEF$2W , .MACRO CLON$ MOD,PRMLST,LNS,LNSSZ,ENS,ENSSZ .MCALL OFF$,LNMOD$R .IF NDF $$$GLBD LNMOD$ .BYTE 207.,7E .BYTE 11. .BYTE MOD $$$ARG = 0 .IRP SYM .BYTE SYM$$$ARG=$$$ARG+1A .ENDM .IIF LT 2-$$$ARG,.ERROR .IF GT 2-$$$ARG .REPT <2-$$$ARG>. .BYTE 0 .ENDR .ENDC .WORD LNS .WORD LNSSZ .WORD ENS .WORD ENSSZ .ENDC .IF NDF C.LFUN$A .IRP X,<,,,,,> OFF$ XO .ENDM* .IRP X,<,,> OFF$ X .ENDM .ENDC .ENDM CLON$W 4 .MACRO CLON$C MOD,PRMLST,LNS,LNSSZ,ENS,ENSSZ,CS,ERR .MCALL CLON$,DIR$ .IF NDF $$$GLBA .PSECT $DPB$.,D$$$=.> .IFTF' CLON$ MOD,,LNS,LNSSZ,ENS,ENSSZ2 .IFT, .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CLON$CEW 1 .MACRO CLON$S MOD,PRMLST,LNS,LNSSZ,ENS,ENSSZ,ERRZ .MCALL DIR$,MOV$,MVB$,LNMOD$R LNMOD$L MOV$ ENSSZD MOV$ ENS, MOV$ LNSSZ, MOV$ LNS MVB$ PRMLST MVB$ #11.,MOD MOV (PC)+,-(SP) .BYTE 207.,7 DIR$ ,ERR .ENDM CLON$S.0W , .MACRO CLOG$ MOD,PRMLST,LNS,LNSSZ,ENS,ENSSZ .MCALL OFF$,LNMOD$. .IF NDF $$$GLB LNMOD$$ .BYTE 207.,7  .BYTE 0 .BYTE MOD $$$ARG = 0 .IRP SYM .BYTE SYM$$$ARG=$$$ARG+1  .ENDM .IIF LT 2-$$$ARG,.ERROR .IF GT 2-$$$ARG .REPT <2-$$$ARG>L .BYTE 0 .ENDR .EN00"o5TADATADATADATADATADATADATADATADATADC .WORD LNS .WORD LNSSZ .WORD ENS .WORD ENSSZ .ENDC .IF NDF C.LFUN A .IRP X,<,,,,,>( OFF$ X) .ENDM* .IRP X,<,,> OFF$ X .ENDM .ENDC .ENDM CLOG$W 4 .MACRO CLOG$C MOD,PRMLST,LNS,LNSSZ,ENS,ENSSZ,CS,ERR .MCALL CLOG$,DIR$ .IF NDF $$$GLBA .PSECT $DPB$.,D$$$=.> .IFTF' CLOG$ MOD,,LNS,LNSSZ,ENS,ENSSZ2 .IFT, .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CLOG$CEW 1 .MACRO CLOG$S MOD,PRMLST,LNS,LNSSZ,ENS,ENSSZ,ERRZ .MCALL DIR$,MOV$,MVB$,LNMOD$R LNMOD$L MOV$ ENSSZD MOV$ ENS, MOV$ LNSSZ, MOV$ LNS( MVB$ PRMLST MVB$ #0,MOD MOV (PC)+,-(SP) .BYTE 207.,7> DIR$ ,ERR .ENDM CLOG$SW  .MACRO CMKT$C EFN,AST,PSCT,ERRP .MCALL CMKT$,DIR$ .IF NDF $$$GLBC .PSECT $DPB$.,D$$$=.$ .IFTF CMKT$ EFN,AST .IFT> .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM CMKT$C.W  .MACRO CMKT$S EFN,AST,ERR .MCALL DIR$,RVP$ $$$T1=0 .IIF NB EFN $$$T1=1 .IIF NB AST $$$T1=1 .IF EQ $$$T1  MOV (PC)+,-(SP) .BYTE 27.,1 .IFF RVP$ EFN,ASTN MOV (PC)+,-(SP) .BYTE 27.,3 .ENDC DIR$ ,ERR .ENDM CMKT$S+>W  .MACRO CMKT$ EFN,ASTM .MCALL OFF$ .IF NDF $$$GLBA $$$T1=0 .IIF NB EFN $$$T1=1 .IIF NB AST $$$T1=1 .IF EQ $$$T1. .BYTE 27.,1 .IFF$ .BYTE 27.,3 .WORD EFN .WORD AST .ENDC .ENDC .IF NDF C.MKEF .NLISTK OFF$ OFF$ C.MKEF,2 OFF$ C.MKAE,2 .LIST .ENDC .ENDM CMKT$W  .MACRO CNCT$ TNAME,EFN,EAST,ESB .MCALL OFF$,R50$ .IF NDF $$$GLB .BYTE 143.,6. R50$ TNAMEF .WORD EFN .WORD EAST .WORD ESB .ENDC .IF NDF C.NCTNN6 .IRP X,<,,,,> OFF$ X$ .ENDM .ENDC .ENDM CNCT$W ( .MACRO CNCT$C TNAME,EFN,EAST,ESB,CS,ERR .MCALL CNCT$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=.N .IFTF CNCT$ TNAME,EFN,EAST,ESBS .IFTF .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CNCT$CW % .MACRO CNCT$S TNAME,EFN,EAST,ESB,ERRA .MCALL DIR$,MOV$,RFA$,MVB$. MOV$ ESBL MOV$ EAST MOV$ EFN0 RFA$ TNAMEO MOV (PC)+,-(SP) .BYTE 143.,6 DIR$ ,ERR .ENDM CNCT$S.W  .MACRO CPCR$ NAME .MCALL R50$,OFF$F .IF NDF $$$GLBN .BYTE 205.,3$ R50$ NAME .ENDC .IF NDF C.PCNMA OFF$E OFF$ C.PCNM,2 .ENDC .ENDM CPCR$W  .MACRO CPCR$C NAME,CS,ERR .MCALL CPCR$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.E .IFTF CPCR$ NAMEC .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CPCR$CRW  .MACRO CPCR$S NAME,ERRL .MCALL DIR$,MOV$,RFA$ RFA$ NAME MOV (PC)+,-(SP) .BYTE 205.,3, DIR$ ,ERR .ENDM CPCR$S$W  .MACRO CRAW$ WDBA .MCALL OFF$ .IF NDF $$$GLBF .BYTE 117.,2E .WORD WDB .ENDC .IF NDF C.RABAF OFF$A OFF$ C.RABA,2 .ENDC .ENDM CRAW$W  .MACRO CRAW$C WDB,CS,ERRM .MCALL CRAW$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.D .IFTF CRAW$ WDB .IFTM .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CRAW$CNW  .MACRO CRAW$S WDB,ERR .MCALL DIR$,MOV$L MOV$ WDB, MOV (PC)+,-(SP) .BYTE 117.,2) DIR$ ,ERR .ENDM CRAW$SRW  .MACRO CRGF$C GROUP,CS,ERRW .MCALL CRGF$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.W .IFTF CRGF$ GROUP .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CRGF$CW  .MACRO CRGF$S GROUP,ERR .MCALL MOV$,DIR$F MOV$ GROUP MOV (PC)+,-(SP) .BYTE 157.,2 DIR$ ,ERR .ENDM CRGF$S W  .MACRO CRGF$ GROUP$ .MCALL OFF$ .IF NDF $$$GLBR .BYTE 157.,2. .WORD GROUP .ENDC .IF NDF C.RGRP+ .NLIST. OFF$7 OFF$ C.RGRP,2 .LIST .ENDC .ENDM CRGF$W  .MACRO CRRG$ RDB. .MCALL OFF$ .IF NDF $$$GLBL .BYTE 55.,2 .WORD RDB .ENDC .IF NDF C.RRBA OFF$ OFF$ C.RRBA,2 .ENDC .ENDM CRRG$W  .MACRO CRRG$C RDB,CS,ERRS .MCALL CRRG$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=. .IFTF CRRG$ RDB .IFT .PSECT CS DIR$ #$$$,ERR00"w8 1g .ENDC .ENDM CRRG$CUW  .MACRO CRRG$S RDB,ERR .MCALL DIR$,MOV$O MOV$ RDB MOV (PC)+,-(SP) .BYTE 55.,2 DIR$ ,ERR .ENDM CRRG$SW ! .MACRO CRVT$ IAST,OAST,AAST,MLEN .MCALL OFF$ .IF NDF $$$GLB$ .BYTE 149.,5. .WORD IASTB .WORD OASTF .WORD AAST .WORD MLEN  .ENDC .IF NDF C.RVIAC6 .IRP X,<,,,,> OFF$ X, .ENDM .ENDC .ENDM CRVT$W ) .MACRO CRVT$C IAST,OAST,AAST,MLEN,CS,ERRD .MCALL CRVT$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.  .IFTF CRVT$ IAST,OAST,AAST,MLEN .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CRVT$CNW & .MACRO CRVT$S IAST,OAST,AAST,MLEN,ERR .MCALL DIR$,MOV$$ MOV$ MLEN MOV$ AAST MOV$ OAST MOV$ IAST MOV (PC)+,-(SP) .BYTE 149.,5O DIR$ ,ERR .ENDM CRVT$SCW  .MACRO CSRQ$C TT,RT,CS,ERR, .MCALL CSRQ$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=. .IFTF CSRQ$ TT,RT .IFT, .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CSRQ$CFW  .MACRO CSRQ$S TN,RN,ERR .MCALL RFA$,DIR$S RFA$ TN MOV (PC)+,-(SP) .BYTE 25.,3 DIR$ ,ERR .ENDM CSRQ$SW  .MACRO CSRQ$ TT,RTT .MCALL R50$,OFF$C .IF NDF $$$GLBM .BYTE 25.,3 R50$ TT .ENDC .IF NDF C.SRTNV .NLISTS OFF$Y OFF$ C.SRTN,4 OFF$ C.SRRN,4 .LIST .ENDC .ENDM CSRQ$W  .MACRO DECL$C EFN,PSCT,ERR. .MCALL DECL$,DIR$ .IF NDF $$$GLB= .PSECT $DPB$.,D$$$=. .IFTF DECL$ EFN .IFT$ .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM DECL$CAtW  .MACRO DECL$S EFN,ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 35.,1 DIR$ ,ERR .ENDM DECL$S\W  .MACRO DECL$ EFN. .IF NDF $$$GLB .BYTE 35.,1 .ENDC .ENDM DECL$HW ! .MACRO DLON$ MOD,TBNUM,LNS,LNSSZF .MCALL OFF$,LNMOD$R .IF NDF $$$GLBN LNMOD$M .BYTE 207.,5 .BYTE 12. .BYTE MOD .BYTE TBNUM .BYTE 0 .WORD LNS .WORD LNSSZ .ENDC .IF NDF D.LFUN=A .IRP X,<,,,,,>C OFF$ XD .ENDM .ENDC .ENDM DLON$W ) .MACRO DLON$C MOD,TBNUM,LNS,LNSSZ,CS,ERR. .MCALL DLON$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.  .IFTF DLON$ MOD,TBNUM,LNS,LNSSZ .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM DLON$C,W & .MACRO DLON$S MOD,TBNUM,LNS,LNSSZ,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$E LNMOD$Y MOV$ LNSSZE MOV$ LNSY MOV$ TBNUML MVB$ #12.,MOD MOV (PC)+,-(SP) .BYTE 207.,5 DIR$ ,ERR .ENDM DLON$SDFW ! .MACRO DLOG$ MOD,TBNUM,LNS,LNSSZ. .MCALL OFF$,LNMOD$ .IF NDF $$$GLB. LNMOD$N .BYTE 207.,5S .BYTE 2 .BYTE MOD .BYTE TBNUM .BYTE 0 .WORD LNS .WORD LNSSZ .ENDC .IF NDF D.LFUNDA .IRP X,<,,,,,>M OFF$ X .ENDM .ENDC .ENDM DLOG$W ) .MACRO DLOG$C MOD,TBNUM,LNS,LNSSZ,CS,ERRL .MCALL DLOG$,DIR$ .IF NDF $$$GLBV .PSECT $DPB$.,D$$$=. .IFTF DLOG$ MOD,TBNUM,LNS,LNSSZ .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM DLOG$COW & .MACRO DLOG$S MOD,TBNUM,LNS,LNSSZ,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$Y LNMOD$Y MOV$ LNSSZE MOV$ LNSY MOV$ TBNUML MVB$ #2,MOD MOV (PC)+,-(SP) .BYTE 207.,5R DIR$ ,ERR .ENDM DLOG$S,W  .MACRO DSAR$C PSCT,ERR .MCALL DSAR$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.C .IFTF DSAR$ .IFT, .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM DSAR$CDpW  .MACRO DSAR$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 99.,1 DIR$ ,ERR .ENDM DSAR$SXW  .MACRO DSAR$M .IF NDF $$$GLBZ .BYTE 99.,1 .ENDC .ENDM DSAR$W  .MACRO DSCP$C PSCT,ERR  .MCALL DSCP$,DIR$ .IF NDF $$$GLB) .PSECT $DPB$.,D$$$=.E .IFTF DSCP$ .IFT .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM DSCP$C,pW  .MACRO DSCP$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 95.,1 DIR$ ,ERR .ENDM DSCP$SXW  .MACRO DSCP$ .IF NDF $$$GLBR .BYTE 95.,1 .ENDC .ENDM DSCP$00"5TADATADATADATADATADATADATADATADATAW  .MACRO DTRG$ RDB .MCALL OFF$ .IF NDF $$$GLBR .BYTE 59.,2 .WORD RDB .ENDC .IF NDF D.TRBAD OFF$ OFF$ D.TRBA,2 .ENDC .ENDM DTRG$W  .MACRO DTRG$C RDB,CS,ERRS .MCALL DTRG$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.R .IFTF DTRG$ RDB .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM DTRG$CLW  .MACRO DTRG$S RDB,ERR .MCALL DIR$,MOV$C MOV$ RDB MOV (PC)+,-(SP) .BYTE 59.,2 DIR$ ,ERR .ENDM DTRG$SW  .MACRO ELAW$ WDB .MCALL OFF$ .IF NDF $$$GLBF .BYTE 119.,2$ .WORD WDB .ENDC .IF NDF E.LABAC OFF$N OFF$ E.LABA,2 .ENDC .ENDM ELAW$W  .MACRO ELAW$C WDB,CS,ERR  .MCALL ELAW$,DIR$ .IF NDF $$$GLB$ .PSECT $DPB$.,D$$$=.C .IFTF ELAW$ WDB .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ELAW$CNW  .MACRO ELAW$S WDB,ERR .MCALL DIR$,MOV$ MOV$ WDB$ MOV (PC)+,-(SP) .BYTE 119.,2S DIR$ ,ERR .ENDM ELAW$SRW  .MACRO ELGF$C GROUP,CS,ERRW .MCALL ELGF$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.W .IFTF ELGF$ GROUP .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ELGF$CW  .MACRO ELGF$S GROUP,ERR .MCALL MOV$,DIR$F MOV$ GROUP MOV (PC)+,-(SP) .BYTE 159.,2 DIR$ ,ERR .ENDM ELGF$S W  .MACRO ELGF$ GROUP$ .MCALL OFF$ .IF NDF $$$GLBL .BYTE 159.,2. .WORD GROUP .ENDC .IF NDF E.LGRP+ .NLIST. OFF$9 OFF$ E.LGRP,2 .LIST .ENDC .ENDM ELGF$W  .MACRO ELVT$ UNUM .MCALL OFF$ .IF NDF $$$GLBL .BYTE 151.,2B .WORD UNUM .ENDC .IF NDF E.LVNMF OFF$S OFF$ E.LVNM,2 .ENDC .ENDM ELVT$W  .MACRO ELVT$C UNUM,CS,ERR .MCALL ELVT$,DIR$ .IF NDF $$$GLBU .PSECT $DPB$.,D$$$=.Y .IFTF ELVT$ UNUMR .IFTM .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ELVT$C.W  .MACRO ELVT$S UNUM,ERR. .MCALL DIR$,MOV$N MOV$ UNUM MOV (PC)+,-(SP) .BYTE 151.,2 DIR$ ,ERR .ENDM ELVT$S.W  .MACRO EMST$ TNAME,STATUS .MCALL OFF$,R50$. .IF NDF $$$GLB. .BYTE 147.,4. R50$ TNAME. .WORD STATUSE .ENDC .IF NDF E.MSTNV OFF$. OFF$ E.MSTN,4 OFF$ E.MSST,2 .ENDC .ENDM EMST$W " .MACRO EMST$C TNAME,STATUS,CS,ERR .MCALL EMST$,DIR$ .IF NDF $$$GLBU .PSECT $DPB$.,D$$$=. .IFTF EMST$ TNAME,STATUSM .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM EMST$CLW  .MACRO EMST$S TNAME,STATUS,ERR1 .MCALL DIR$,MOV$,RFA$ MOV$ STATUS RFA$ TNAME MOV (PC)+,-(SP) .BYTE 147.,4C DIR$ ,ERR .ENDM EMST$S$W  .MACRO ENAR$C PSCT,ERRS .MCALL ENAR$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.  .IFTF ENAR$ .IFTM .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM ENAR$C,rW  .MACRO ENAR$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 101.,1$ DIR$ ,ERR .ENDM ENAR$SSZW  .MACRO ENAR$. .IF NDF $$$GLB .BYTE 101.,1. .ENDC .ENDM ENAR$W  .MACRO ENCP$C PSCT,ERRT .MCALL ENCP$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=. .IFTF ENCP$ .IFT .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM ENCP$C$pW  .MACRO ENCP$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 97.,1 DIR$ ,ERR .ENDM ENCP$SNXW  .MACRO ENCP$A .IF NDF $$$GLB. .BYTE 97.,1 .ENDC .ENDM ENCP$W  .MACRO EXIF$C EFN,CS,ERR .MCALL EXIF$,DIR$ .IF NDF $$$GLB$ .PSECT $DPB$.,D$$$=.N .IFTF EXIF$ EFN .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM EXIF$C$W  .MACRO EXIF$S EFN,ERR .MCALL MOV$,DIR$ MOV$ EFNS MOV (PC)+,-(SP) .BYTE 53.,2 DIR$ ,ERR .ENDM EXIF$SW  .MACRO EXIF$ EFNI .MCALL OFF$ .IF NDF $$$GLB. .BYTE 53.,2 .WORD EFN .ENDC .IF NDF E.XFEF. .NLISTP OFF$F OFF$ E.XFEF,2 .LIST .ENDC .ENDM EXIF$W  .MACRO EXIT$C PSCT,ERR, .MCALL EXIT$,DIR$ .IF NDF $$$GLB$ .PSECT $DPB$.,D$$$=.$ .IFTF EXIT$ .IFTN .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM EXIT$CEW  .00"8 1gMACRO EXIT$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 51.,1 DIR$+ .IIF NB , CALL ERR .ENDM EXIT$SEXW  .MACRO EXIT$  .IF NDF $$$GLBL .BYTE 51.,1 .ENDC .ENDM EXIT$W  .MACRO EXST$C STS,CS,ERRL .MCALL EXST$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF EXST$ STS .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM EXST$C.W  .MACRO EXST$S STS,ERR .MCALL MOV$,DIR$,OFF$ MOV$ STS MOV (PC)+,-(SP) .BYTE 29.,2 DIR$ ,ERR .NLISTT$$$OST=05 .IRP X,<,,,>I OFF$ X> .ENDM .LIST .ENDM EXST$SW  .MACRO EXST$ STSF .MCALL OFF$ .IF NDF $$$GLB .BYTE 29.,2 .WORD STS .ENDC .IF NDF E.XSTSC .NLIST. OFF$X OFF$ E.XSTS,2$$$OST=05 .IRP X,<,,,> OFF$ XS .ENDM .LIST .ENDC .ENDM EXST$W  .MACRO EXTK$C INC,CS,ERR .MCALL EXTK$,DIR$ .IF NDF $$$GLBM .PSECT $DPB$.,D$$$=.. .IFTF EXTK$ INC .IFT$ .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM EXTK$CEW  .MACRO EXTK$S INC,ERR .MCALL MOV$,DIR$ CLR -(SP) MOV$ INC  MOV (PC)+,-(SP) .BYTE 89.,3 DIR$ ,ERR .ENDM EXTK$SSW  .MACRO EXTK$ INC. .MCALL OFF$ .IF NDF $$$GLBT .BYTE 89.,3 .WORD INC .WORD 0 .ENDC .IF NDF E.XTINO .NLIST. OFF$. OFF$ E.XTIN,2 .LIST .ENDC .ENDM EXTK$W  .MACRO FEAT$ FEAT .MCALL OFF$,FEADF$$ .IF NDF $$$GLBB .BYTE 177.,2. .WORD FEATI .ENDC .IF NDF F.EAF OFF$$ OFF$ F.EAF,2 .IF DF $$$GLB FEADF$ ,<=> .IFFA FEADF$S .ENDC .ENDC .ENDM FEAT$W  .MACRO FEAT$C FEAT,CS,ERR .MCALL FEAT$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.  .IFTF FEAT$ FEATF .IFTF .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMW  .MACRO FEAT$S FEAT,ERRO .MCALL MOV$,DIR$2 MOV$ FEAT MOV (PC)+,-(SP) .BYTE 177.,2. DIR$ ,ERR .ENDMW + .MACRO FSS$ FSBUF,FSSZ,PRSBLK,PRSSZ,RESERVO .MCALL OFF$ .IF NDF $$$GLBF .IIF NB RESERV, .ERROR .BYTE 207.,7 .BYTE 5 .BYTE 0 .WORD 0 .WORD FSBUF .WORD FSSZA .WORD PRSBLK .WORD PRSSZ .ENDC .IF NDF F.RSV1LA .IRP X,<,,,,,>F OFF$ XF .ENDM .IRP X,<,>N OFF$ XM .ENDM .ENDC .ENDM FSS$EW 3 .MACRO FSS$C FSBUF,FSSZ,PRSBLK,PRSSZ,RESERV,CS,ERRE .MCALL FSS$,DIR$R .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.B .IFTF$ FSS$ FSBUF,FSSZ,PRSBLK,PRSSZ,RESERV .IFT$ .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM FSS$CW 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$SW * .MACRO GCCI$ CBUF,CBFL,IBUF,IBFL,ADDR,NCP .MCALL OFF$ .IF NDF $$$GLB. .BYTE 127.,7. .BYTE NCP .BYTE 0 .WORD ADDRD .WORD CBUFF .WORD CBFLU .WORD IBUF, .WORD IBFL .ENDC .IF NDF G.CCNC A .IRP X,<,,,,,>U OFF$ XS .ENDM OFF$ G.CCIL,2$$$OST=0K .IRP X,<,,,,,> OFF$ XU .ENDM$$$OST=0@ .IRP X,<,,,,> OFF$ X .ENDM .IRP X,<,> OFF$ XN .ENDM .IF DF $$$GLB# .GLOBL GC.CND,GC.CST,GC.CEX,GC.CCSP .ENDC GC.CND=200 GC.CST=002 GC.CEX=001 GC.CCS=000 .ENDC .ENDM GCCI$W 2 .MACRO GCCI$C CBUF,CBFL,IBUF,IBFL,ADDR,NCP,CS,ERR .MCALL GCCI$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.$ .IFTF# GCCI$ CBUF,CBFL,IBUF,IBFL,ADDR,NCPA .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMW / .MACRO GCCI$S CBUF,CBFL,IBUF,IBFL,ADDR,NCP,ERR> .MCALL MOV$,MVB$,DIR$ MOV$ IBFL MOV$ IBUF MOV$ CBFL MOV$ CBUF MOV$ ADDR MVB$ NCP,#0 MOV (PC)+,-(SP) .BYTE 127.,7. DIR$ ,ERR .ENDMW # .MACRO GCII$ BUF,BUFL,CLI00"5TADATADATADATADATADATADATADATADATA,DEV,UNITG .MCALL OFF$,R50$ .IF NDF $$$GLBC .BYTE 173.,7. .WORD BUF .WORD BUFLC R50$ CLII$$$T2=.N .ASCII /DEV/S .=$$$T2+2D .BYTE UNIT,0F .ENDC .IF NDF G.CIBFB;AA .IRP X,<,,,,,> OFF$ X .ENDM$$$OST=0@ .IRP X,<,,,,> OFF$ X  .ENDM! .IRP X,<,>M OFF$ X0 .ENDM .ENDC .ENDM GCII$W + .MACRO GCII$C BUF,BUFL,CLI,DEV,UNIT,CS,ERRU .MCALL GCII$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D .IFTF$$$=. GCII$ BUF,BUFL,CLI,DEV,UNIT .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMW ( .MACRO GCII$S BUF,BUFL,CLI,DEV,UNIT,ERR .MCALL MOV$,MVB$,DIR$,RFA$V MVB$ UNIT,#0 MOV$ DEV RFA$ CLIO MOV$ BUFL MOV$ BUF4 MOV (PC)+,-(SP) .BYTE 173.,7. DIR$ ,ERR .ENDM GCII$SNFW ! .MACRO GDIR$ MOD,ENS,ENSSZ,RSIZEN .MCALL OFF$,LNMOD$I .IF NDF $$$GLB LNMOD$R .BYTE 207.,6. .BYTE 4 .BYTE MOD .WORD 0 .WORD ENS .WORD ENSSZ .WORD RSIZE .ENDC .IF NDF G.DFUNGA .IRP X,<,,,,,>N OFF$ XM .ENDM .ENDC .ENDM GDIR$W ) .MACRO GDIR$C MOD,ENS,ENSSZ,RSIZE,CS,ERR .MCALL GDIR$,DIR$ .IF NDF $$$GLBO .PSECT $DPB$.,D$$$=. .IFTF GDIR$ MOD,ENS,ENSSZ,RSIZE .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GDIR$COW & .MACRO GDIR$S MOD,ENS,ENSSZ,RSIZE,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$Y LNMOD$Y MOV$ RSIZED MOV$ ENSSZS MOV$ ENSS MOV$ #0 MVB$ #4,MOD MOV (PC)+,-(SP) .BYTE 207.,6D DIR$ ,ERR .ENDM GDIR$S>W $ .MACRO GDVI$C LUN,BUFA,BUFL,CS,ERR .MCALL GDVI$,DIR$ .IF NDF $$$GLBD .PSECT $DPB$.,D$$$=.C .IFTF GDVI$ LUN,BUFA,BUFL .IFT$ .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GDVI$CD6W  .MACRO GDVI$S LUN,BUFA,BUFL,ERR .MCALL MOV$,DIR$,OFF$ MOV$ BUFL MOV$ BUFA MOV$ LUNM MOV (PC)+,-(SP) .BYTE 5,4 DIR$ ,ERR .IF NDF G.DVNAM .NLISTV$$$OST=0A .IRP X,<,,,,> OFF$ X7 .ENDM .LIST .ENDC .ENDM GDVI$SW  .MACRO GDVI$ LUN,BUFA,BUFLR .MCALL OFF$ .IF NDF $$$GLB$ .BYTE 5,4 .WORD LUN .WORD BUFAF .WORD BUFLN .ENDC .IF NDF G.DVLUC .NLISTR+ .IRP X,<,,,> OFF$ X. .ENDM .IF NDF G.DVNAL$$$OST=0B .IRP X,<,,,,> OFF$ XY .ENDM .ENDC .LIST .ENDC .ENDM GDVI$hW - .MACRO GIN$C SFCN,P1,P2,P3,P4,P5,P6,P7,P8,P9, .MCALL GIN$,DIR$,GFN$,OFF$M .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF GFN$ .NARG $$$NA $$$I=$$$NC .BYTE 169.,$$$N+1. .IRP $$$PRM, .IF EQ $$$I .MEXITF .IFFD $$$I=$$$I-1R .ENDC .WORD $$$PRM< .ENDR .IF NDF G.INSFO .NLIST.6 .IRP X,<,,,,> OFF$ X< .ENDR* .IRP X,<,,> OFF$ X .ENDR* .IRP X,<,,> OFF$ X  .ENDR .ENDC .IFTP .PSECT CS DIR$ #$$$ .ENDC .ENDM GIN$C<W - .MACRO GIN$S SFCN,P1,P2,P3,P4,P5,P6,P7,P8,P9A .MCALL MOV$,DIR$,OFF$,MVB$,GFN$ GFN$$ .NARG $$$N, $$$I=$$$N,$$$K=9.P. .IRP $$$PRM, .IF GT $$$I-$$$K$ MOV$ $$$PRM .ENDC $$$K=$$$K-1L .ENDR MOV (PC)+,-(SP) .BYTE 169.,$$$N+1 DIR$P .ENDM GIN$SW , .MACRO GIN$ SFCN,P1,P2,P3,P4,P5,P6,P7,P8,P9 .MCALL OFF$,GFN$< .IF NDF $$$GLB, GFN$P .NARG $$$N $$$I=$$$N .BYTE 169.,$$$N+1. .IRP $$$PRM, .IF EQ $$$I .MEXIT$ .IFFP $$$I=$$$I-1, .ENDC .WORD $$$PRMO .ENDR .ENDC .IF NDF G.INSF. .NLIST,6 .IRP X,<,,,,> OFF$ XS .ENDM* .IRP X,<,,> OFF$ X .ENDR* .IRP X,<,,> OFF$ XG .ENDR .ENDC .ENDM GIN$RW  .MACRO GLUN$C LUN,BUFA,CS,ERR$ .MCALL GLUN$,DIR$00"8 1g .IF NDF $$$GLBA .PSECT $DPB$.,D$$$=.Y .IFTF GLUN$ LUN,BUFAP .IFTN .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GLUN$C$LW  .MACRO GLUN$S LUN,BUFA,ERR .MCALL MOV$,DIR$,OFF$ MOV$ BUFA MOV$ LUNR MOV (PC)+,-(SP) .BYTE 5,3 DIR$ ,ERR .IF NDF G.LUNAS .NLIST$$$OST=06 .IRP X,<,,,> OFF$ XP .ENDM$$$OST=1 .IRP X,<> OFF$ X. .ENDM .LIST .ENDC .ENDM GLUN$S.W  .MACRO GLUN$ LUN,BUFA .MCALL OFF$ .IF NDF $$$GLBS .BYTE 5,3 .WORD LUN .WORD BUFAL .ENDC .IF NDF G.LULU  .NLIST + .IRP X,<,,,> OFF$ XA .ENDM .IF NDF G.LUNA$$$OST=06 .IRP X,<,,,> OFF$ X3 .ENDM$$$OST=1 .IRP X,<> OFF$ X0 .ENDM .ENDC .LIST .ENDC .ENDM GLUN$W  .MACRO GMCR$C CS,ERR. .MCALL GMCR$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.U .IFTF GMCR$ .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GMCR$CLW  .MACRO GMCR$D .MCALL OFF$ .IF NDF $$$GLB  .BYTE 127.,41. .BLKW 40. .ENDC .IF NDF G.MCRB .NLISTA OFF$M OFF$ G.MCRB,80. .LIST .ENDC .ENDM GMCR$W  .MACRO GMCX$ WVEC .MCALL OFF$ .IF NDF $$$GLBR .BYTE 113.,2> .WORD WVEC. .ENDC .IF NDF G.MCVAN OFF$N OFF$ G.MCVA,2 .ENDC .ENDM GMCX$W  .MACRO GMCX$C WVEC,CS,ERR .MCALL GMCX$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.  .IFTF GMCX$ WVEC. .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GMCX$CCW  .MACRO GMCX$S WVEC,ERR  .MCALL DIR$,MOV$C MOV$ WVEC MOV (PC)+,-(SP) .BYTE 113.,2. DIR$ ,ERR .ENDM GMCX$S.W  .MACRO GPRT$C PRT,BUF,CS,ERR .MCALL GPRT$,DIR$ .IF NDF $$$GLBE .PSECT $DPB$.,D$$$=.. .IFTF GPRT$ PRT,BUF .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GPRT$CW  .MACRO GPRT$S PRT,BUF,ERR .MCALL MOV$,RFA$,DIR$,OFF$C MOV$ BUF RFA$ PRTF MOV (PC)+,-(SP) .BYTE 65.,4 DIR$ ,ERR .IF NDF G.PRPB .NLISTC$$$OST=0* .IRP X,<,,> OFF$ XM .ENDM .LIST .ENDC .ENDM GPRT$SYBW  .MACRO GPRT$ PRT,BUF .MCALL OFF$,R50$A .IF NDF $$$GLBF .BYTE 65.,4 R50$ PRTI .WORD BUF .ENDC .IF NDF G.PRPND .NLIST OFF$ OFF$ G.PRPN,4 OFF$ G.PRBA,2 .IF NDF G.PRPBR$$$OST=0* .IRP X,<,,> OFF$ XB .ENDM .ENDC .LIST .ENDC .ENDM GPRT$HW  .MACRO GREG$ RID,BUF6 .MCALL OFF$ .IF NDF $$$GLBP .BYTE 65.,4 .WORD 0,RID .WORD BUF .ENDC .IF NDF G.RGID> .NLISTM OFF$M OFF$ ,2 OFF$ G.RGID,2 OFF$ G.RGBA,2 .IF NDF G.RGRB $$$OST=0* .IRP X,<,,> OFF$ X. .ENDM .ENDC .LIST .ENDC .ENDM GREG$W  .MACRO GREG$C RID,BUF,CS,ERR. .MCALL GREG$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=., .IFTF GREG$ RID,BUF .IFTM .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GREG$CW  .MACRO GREG$S RID,BUF,ERR .MCALL MOV$,DIR$,OFF$ MOV$ BUFD MOV$ RIDO CLR -(SP) MOV (PC)+,-(SP) .BYTE 65.,4 DIR$ ,ERR .IF NDF G.RGRBD .NLIST $$$OST=0* .IRP X,<,,> OFF$ XR .ENDM .LIST .ENDC .ENDM GREG$SNW  .MACRO GSSW$C PSCT,ERR .MCALL GSSW$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=.F .IFTF GSSW$ .IFTD .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM GSSW$CCrW  .MACRO GSSW$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 125.,1F DIR$ ,ERR .ENDM GSSW$S$ZW  .MACRO GSSW$S .IF NDF $$$GLBS .BYTE 125.,14 .ENDC .ENDM GSSW$W  .MACRO GTIM$C BUFA,CS ERR .MCALL GTIM$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.. .IFTF GTIM$ BUFA .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GTIM$CFVW  .MACRO GTIM$S BUFA,ERRF .MCALL MOV$,DIR$,OFF$ MOV$ BUFA MOV (PC)+,-(SP) .BYTE 61.,2 DIR$ ,ERR .IF NDF G.TIYRR .NLISTE$$$OST=05 .IRP X,<<00"5TADATADATADATADATADATADATADATADATAG.TIYR,2>,,,>. OFF$ X$ .ENDM5 .IRP X,<,,,>1 OFF$ X. .ENDM .LIST .ENDC .ENDM GTIM$S.tW  .MACRO GTIM$ BUFA .MCALL OFF$ .IF NDF $$$GLBC .BYTE 61.,2 .WORD BUFA .ENDC .IF NDF G.TIBAS .NLISTD OFF$$ OFF$ G.TIBA,2 .IF NDF G.TIYR$$$OST=05 .IRP X,<,,,>M OFF$ X .ENDM5 .IRP X,<,,,>. OFF$ X$ .ENDM .ENDC .LIST .ENDC .ENDM GTIM$W  .MACRO GTSK$C BUFA,CS,ERR .MCALL GTSK$,DIR$ .IF NDF $$$GLBC .PSECT $DPB$.,D$$$=. .IFT GTSK$ BUFAM .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GTSK$C$W  .MACRO GTSK$S BUFA,ERRF .MCALL MOV$,DIR$,OFF$ MOV$ BUFA MOV (PC)+,-(SP) .BYTE 63.,2 DIR$ ,ERR .IF NDF G.TSTN  .NLISTR$$$OST=0@ .IRP X,<,,,,> OFF$ X, .ENDM@ .IRP X,<,,,,> OFF$ X .ENDM OFF$ G.TSVL,2 OFF$ G.TSTS,2 OFF$ G.TSSY,2 OFF$ G.TSDU,2$$$OST=05 .IRP X,<,,,>. OFF$ X  .ENDM .LIST .ENDC .ENDM GTSK$S$W  .MACRO GTSK$ BUFA .MCALL OFF$ .IF NDF $$$GLB$ .BYTE 63.,2 .WORD BUFAS .ENDC .IF NDF G.TSBAE .NLISTN OFF$T OFF$ G.TSBA,2 .IF NDF G.TSTN<$$$OST=0@ .IRP X,<,,,,> OFF$ X. .ENDM@ .IRP X,<,,,,> OFF$ XL .ENDM OFF$ G.TSVL,2 OFF$ G.TSTS,2 OFF$ G.TSSY,2 OFF$ G.TSDU,2$$$OST=05 .IRP X,<,,,>. OFF$ XN .ENDM .ENDC .LIST .ENDC .ENDM GTSK$^W  .MACRO IHAR$C PSCT,ERR .MCALL DSAR$C DSAR$C PSCT,ERR .ENDM IHAR$CBTW  .MACRO IHAR$S ERR .MCALL DSAR$S DSAR$S ERR. .ENDM IHAR$S4HW  .MACRO IHAR$> .MCALL DSAR$O DSAR$ .ENDM IHAR$W  .MACRO MAP$ WDB .MCALL OFF$ .IF NDF $$$GLBL .BYTE 121.,2 .WORD WDB .ENDC .IF NDF M.APBAY OFF$F OFF$ M.APBA,2 .ENDC .ENDM MAP$DW  .MACRO MAP$C WDB,CS,ERR .MCALL MAP$,DIR$C .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF MAP$ WDBC .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM MAP$CW  .MACRO MAP$S WDB,ERR .MCALL DIR$,MOV$A MOV$ WDB. MOV (PC)+,-(SP) .BYTE 121.,2. DIR$ ,ERR .ENDM MAP$SW " .MACRO MRKT$C EF,TM,TU,AST,CS,ERR .MCALL MRKT$,DIR$ .IF NDF $$$GLBL .PSECT $DPB$.,D$$$=.W .IFTF MRKT$ EF,TM,TU,AST .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM MRKT$CW  .MACRO MRKT$S EF,TM,TU,AST,ERR. .MCALL RVP$,DIR$S RVP$ EF,TM,TU,AST MOV (PC)+,-(SP) .BYTE 23.,5 DIR$ ,ERR .ENDM MRKT$S.W  .MACRO MRKT$ EFN,TM,TU,ASTA .MCALL OFF$ .IF NDF $$$GLBA .BYTE 23.,5 .WORD EFN .WORD TME .WORD TUD .WORD AST .ENDC .IF NDF M.KTEF .NLISTR6 .IRP X,<,,,,> OFF$ XL .ENDM .LIST .ENDC .ENDM MRKT$W  .MACRO MSDS$ MASK .MCALL OFF$ .IF NDF $$$GLBM .BYTE 201.,2. .WORD MASK. .ENDC .IF NDF M.SDMA, .IRP X,<,>S OFF$ XF .ENDM .ENDC .ENDM MSDS$W  .MACRO MSDS$C MASK,CS,ERR .MCALL MSDS$,DIR$ .IF NDF $$$GLB, .PSECT $DPBD$ D$$$=.N .IFTF MSDS$ MASK. .IFTO .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMW  .MACRO MSDS$S MASK,ERR, .MCALL MOV$,DIR$G MOV$ MASK MOV (PC)+,-(SP) .BYTE 201.,2. DIR$ ,ERR .ENDMW  .MACRO MVTS$ ACTION,ADDR,VAL. .MCALL OFF$ .IF NDF $$$GLB. .BYTE 203.,4. .WORD ACTIONN .WORD ADDRM .WORD VAL .ENDC .IF NDF M.VTAC 6 .IRP X,<,,,,> OFF$ XC .ENDM $$$=05 .IRP X,<,,,>$ OFF$ XF .ENDM5 .IRP X,<,,,>. OFF$ X .ENDM .ENDC .ENDM MVTS$W 00"8 1g% .MACRO MVTS$C ACTION,ADDR,VAL,CS,ERR) .MCALL MVTS$,DIR$ .IF NDF $$$GLB .PSECT $DPBD$ D$$$=.  .IFTF MVTS$ ACTION,ADDR,VAL .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMW " .MACRO MVTS$S ACTION,ADDR,VAL,ERR .MCALL MOV$,DIR$, MOV$ VAL2 MOV$ ADDR MOV$ ACTION MOV (PC)+,-(SP) .BYTE 203.,4. DIR$ ,ERR .ENDMW V .MACRO PFCS$ MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFNBK,DFNSZ,RSMSK .MCALL OFF$,LNMOD$ .IF NDF $$$GLB LNMOD$ .BYTE 207.,13.C .BYTE 8.R .BYTE MOD .BYTE LUN .BYTE TBMSK .WORD PRBUF .WORD PRSZ$ .WORD RSBUF .WORD RSSZA .WORD RSLEN .WORD PRSBLKC .WORD PRSSZ .WORD DFNBK .WORD DFNSZ .WORD RSMSK .ENDC .IF NDF F.LMODR6 .IRP X,<,,,,> OFF$ XN .ENDM5 .IRP X,<,,,> OFF$ X .ENDM5 .IRP X,<,,,>P OFF$ XK .ENDM .IRP X,<,>N OFF$ X .ENDM .ENDC .ENDM PFCS$HW ^ .MACRO PFCS$C MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFNBK,DFNSZ,RSMSK,CS,ERR .MCALL PFCS$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=. .IFTFO PFCS$ MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFNBK,DFNSZ,RSMSKL .IFTO .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM PFCS$CRW [ .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$SKW U .MACRO PRMS$ MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFBUF,DFSZ,RSMSKN .MCALL OFF$,LNMOD$ .IF NDF $$$GLB. LNMOD$S .BYTE 207.,13.P .BYTE 7 .BYTE MOD .BYTE LUN .BYTE TBMSK .WORD PRBUF .WORD PRSZ$ .WORD RSBUF .WORD RSSZ .WORD RSLEN .WORD PRSBLK .WORD PRSSZ .WORD DFBUF .WORD DFSZ .WORD RSMSK .ENDC .IF NDF R.LFUN6 .IRP X,<,,,,> OFF$ X( .ENDM5 .IRP X,<,,,> OFF$ X .ENDM5 .IRP X,<,,,>K OFF$ XB .ENDM .IRP X,<,>F OFF$ XL .ENDM .ENDC .ENDM PRMS$FW ] .MACRO PRMS$C MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFBUF,DFSZ,RSMSK,CS,ERRR .MCALL PRMS$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=. .IFTFN PRMS$ MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFBUF,DFSZ,RSMSK .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM PRMS$C.~W Z .MACRO PRMS$S MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFBUF,DFSZ,RSMSK,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$, LNMOD$F MOV$ RSMSK MOV$ DFSZ MOV$ DFBUF MOV$ PRSSZ MOV$ PRSBLK MOV$ RSLENN MOV$ RSSZ MOV$ RSBUFL MOV$ PRSZ MOV$ PRBUFZ MVB$ LUN,TBMSK. MVB$ #7,MOD MOV (PC)+,-(SP) .BYTE 207.,13.. DIR$ ,ERR .ENDM PRMS$SMW 6 .MACRO QIO$C FNC,LUN,EFN,PRI,IOST,AST,PRMLST,PSCT,ERR .MCALL QDPB$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=. .IFTF* QDPB$ 1,FNC,LUN,EFN,PRI,IOST,AST, .IFTS .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM QIO$CW 1 .MACRO QIO$S FNC,LUN,EFN,PRI,IOST,AST,PRMLST,ERRU .MCALL QDPB$S/ QDPB$S 1,FNC,LUN,EFN,PRI,IOST,AST,,ERRS .ENDM QIO$SW , .MACRO QIO$ FNC,LUN,EFN,PRI,IOST,AST,PRMLST .MCALL QDPB$,* QDPB$ 1,FNC,LUN,EFN,PRI,IOST,AST, .ENDM QIO$RW 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$CIW 2 .MACRO QIOW$S FNC,LUN,EFN,PRI,IOST,AST,PRMLST,ERR .MCALL QDPB$S/ QDPB$S 3,FNC,LUN,EFN,PRI,IOST,AST,,ERR .ENDM Q00"5TADATADATADATADATADATADATADATADATAIOW$S$W - .MACRO QIOW$ FNC,LUN,EFN,PRI,IOST,AST,PRMLSTN .MCALL QDPB$S* QDPB$ 3,FNC,LUN,EFN,PRI,IOST,AST, .ENDM QIOW$vW 6 .MACRO QDPB$S DIC,FNC,LUN,EFN,PRI,IOST,AST,PRMLST,ERR .MCALL RVP$,MVB$,DIR$ .NLIST$$$ARG=0 .IRP X,$$$ARG=$$$ARG+1M .ENDM .LIST .IF GT 6-$$$ARG .REPT <6-$$$ARG>. CLR -(SP) .ENDR .ENDC .IIF NB , RVP$ PRMLST RVP$ IOST,AST MVB$ EFN, RVP$ FNC,LUNP MOV (PC)+,-(SP) .BYTE DIC,12. DIR$ ,ERR .ENDM QDPB$S"W 1 .MACRO QDPB$ DIC,FNC,LUN,EFN,PRI,IOST,AST,PRMLSTC .MCALL OFF$ .IF NDF $$$GLBN .BYTE DIC,12. .WORD FNC .WORD LUN .BYTE EFN,0 .WORD IOSTB .WORD AST .NLISTI$$$ARG=0 .LIST .IRP X, .WORD X .NLIST$$$ARG=$$$ARG+1, .LIST .ENDM .IF GT 6-$$$ARG .REPT <6-$$$ARG>- .WORD 0 .ENDR .ENDC .ENDC .IF NDF Q.IOFNN .NLIST 6 .IRP X,<,,,,> OFF$ XU .ENDM( .IRP X,<,,> OFF$ XP .ENDM .LIST .ENDC .ENDM QDPB$W  .MACRO RCST$ TNAME,BUFL .MCALL OFF$,R50$$ .IF NDF $$$GLB1 .BYTE 139.,4 R50$ TNAME. .WORD BUF .ENDC .IF NDF R.CSTN OFF$I OFF$ R.CSTN,4 OFF$ R.CSBF,2 .ENDC .ENDM RCST$W  .MACRO RCST$C TNAME,BUF,CS,ERRA .MCALL RCST$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=.N .IFTF RCST$ TNAME,BUF .IFTQ .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RCST$CUW  .MACRO RCST$S TNAME,BUF,ERR .MCALL DIR$,MOV$,RFA$ MOV$ BUFC RFA$ TNAME$ MOV (PC)+,-(SP) .BYTE 139.,4 DIR$ ,ERR .ENDM RCST$S0W  .MACRO RDAF$C BA,CS,ERR .MCALL RDAF$,DIR$ .IF NDF $$$GLBR .PSECT $DPB$.,D$$$=.S .IFTF RDAF$ BA2 .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RDAF$CAW  .MACRO RDAF$S BA,ERRN .MCALL MOV$,DIR$  MOV$ BA MOV (PC)+,-(SP) .BYTE 39.,2 DIR$ ,ERR .ENDM RDAF$S W  .MACRO RDAF$ BA .MCALL OFF$ .IF NDF $$$GLBT .BYTE 39.,2 .WORD BA$ .ENDC .IF NDF R.DABAR .NLIST$ OFF$( OFF$ R.DABA,2.E .LIST .ENDC .ENDM RDAF$W " .MACRO RDBBK$ SIZ,NAM,PAR,STS,PRO .MCALL RDBDF$,R50$F RDBDF$L .WORD 0 .WORD SIZ R50$ NAMF R50$ PARB .WORD STS .WORD PRO .ENDM RDBBK$"W  .MACRO RDBDF$ GBL .MCALL .BLKW.,.BLK. .BLK. .BLKW. 1,R.GID,GBLV .BLKW. 1,R.GSIZ,GBL .BLKW. 2,R.GNAM,GBL .BLKW. 2,R.GPAR,GBL .BLKW. 1,R.GSTS,GBL .BLKW. 1,R.GPRO,GBL .BLKW. 0,R.GLGH,GBL .IF IDN ,1 .GLOBL RS.CRR,RS.UNM,RS.MDL,RS.NDL,RS.ATT,RS.NEXF# .GLOBL RS.DEL,RS.EXT,RS.WRT,RS.REDR .ENDCRS.CRR=^O<100000>ARS.UNM=^O<40000>RS.MDL=^O<200>RS.NDL=^O<100> RS.ATT=^O<40>. RS.NEX=^O<20>S RS.DEL=^O<10> RS.EXT=^O<4> RS.WRT=^O<2> RS.RED=^O<1> .MACRO RDBDF$ X .ENDM .ENDM RDBDF$$W  .MACRO RDEF$C EFN,CS,ERR, .MCALL RDEF$,DIR$ .IF NDF $$$GLBL .PSECT $DPB$.,D$$$=.  .IFTF RDEF$ EFN .IFTS .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RDEF$CW  .MACRO RDEF$S EFN,ERR .MCALL MOV$,DIR$S MOV$ EFNF MOV (PC)+,-(SP) .BYTE 37.,2 DIR$ ,ERR .ENDM RDEF$S0W  .MACRO RDEF$ EFN0 .MCALL OFF$ .IF NDF $$$GLB0 .BYTE 37.,2 .WORD EFN .ENDC .IF NDF R.DEEFS .NLIST> OFF$D OFF$ R.DEEF,2.D .LIST .ENDC .ENDM RDEF$W  .MACRO RDXF$C BA,CS,ERR .MCALL RDXF$,DIR$ .IF NDF $$$GLBL .PSECT $DPB$.,D$$$=.= .IFTF RDXF$ BAE .IFTF .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RDXF$C$W  .MACRO RDXF$S BA,ERRE .MCALL MOV$,DIR$R CLR -(SP) MOV$ BA MOV (PC)+,-(SP) .BYTE 39.,3.E DIR$ ,ERR .ENDM RDXF$SW  .MACRO RDXF$ BA .MCALL OFF$ .IF NDF $$$GLBE .BYTE 39.,3.E .WORD BA .WORD 0 .ENDC .IF NDF R.DABA .NLISTE OFF$ OFF$ R.DABA,2.. .LIST .ENDC .ENDM RDXF$W  .MACRO RCVD$C TN,BA,CS,ERR. .MCALL RCVD$,DIR$ .IF NDF $$$GLB= .PSECT $DPB$.,D$$$=.. .IFTF RCVD$ TN,BA .IFTE .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM R00"8 1gCVD$CRW  .MACRO RCVD$S TN,BA,ERR .MCALL MOV$,DIR$, RFA$+ MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 75.,4 DIR$ ,ERR .ENDM RCVD$SDW  .MACRO RCVD$ TN,BA .MCALL OFF$, R50$ .IF NDF $$$GLB .BYTE 75.,4 R50$ TN .WORD BA .ENDC .IF NDF R.VDTN .NLIST. .IRP X,<,,> OFF$ XR .ENDM .LIST .ENDC .ENDM RCVD$W  .MACRO RCVX$C TN,BA,CS,ERR. .MCALL RCVX$,DIR$ .IF NDF $$$GLBC .PSECT $DPB$.,D$$$=.N .IFTF RCVX$ TN,BA .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RCVX$C,W  .MACRO RCVX$S TN,BA,ERR .MCALL MOV$,DIR$, RFA$R MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 77.,4 DIR$ ,ERR .ENDM RCVX$S.W  .MACRO RCVX$ TN,BA .MCALL OFF$, R50$ .IF NDF $$$GLB .BYTE 77.,4 R50$ TN .WORD BAD .ENDC .IF NDF R.VXTN .NLIST. .IRP X,<,,> OFF$ XR .ENDM .LIST .ENDC .ENDM RCVX$W ? .MACRO RLON$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMODS .MCALL OFF$,LNMOD$R .IF NDF $$$GLBR LNMOD$ .BYTE 207.,10.. .BYTE 14. .BYTE MOD .WORD TBMSK .WORD LNS .WORD LNSSZ .WORD ENS .WORD ENSSZ .WORD RSIZE .WORD RTBMODM .WORD STATUS .ENDC .IF NDF R.LFUN A .IRP X,<,,,,,>N OFF$ XB .ENDM@ .IRP X,<,,,,> OFF$ X .ENDM .ENDC .ENDM RLON$W G .MACRO RLON$C MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,CS,ERR .MCALL RLON$,DIR$ .IF NDF $$$GLBR .PSECT $DPB$.,D$$$=.0 .IFTF8 RLON$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RLON$C.@W D .MACRO RLON$S MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$. LNMOD$R MOV$ STATUS MOV$ RTBMOD MOV$ RSIZEL MOV$ ENSSZS MOV$ ENS MOV$ LNSSZ. MOV$ LNSM MVB$ TBMSK,#0 MVB$ #14.,MOD MOV (PC)+,-(SP) .BYTE 207.,10., DIR$ ,ERR .ENDM RLON$SRW ? .MACRO RLOG$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMODM .MCALL OFF$,LNMOD$N .IF NDF $$$GLBZ LNMOD$ .BYTE 207.,10.S .BYTE 10. .BYTE MOD .WORD TBMSK .WORD LNS .WORD LNSSZ .WORD ENS .WORD ENSSZ .WORD RSIZE .WORD RTBMODT .WORD STATUSL .ENDC .IF NDF R.LFUNA .IRP X,<,,,,,>M OFF$ X .ENDM@ .IRP X,<,,,,> OFF$ X2 .ENDM .ENDC .ENDM RLOG$W G .MACRO RLOG$C MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,CS,ERR .MCALL RLOG$,DIR$ .IF NDF $$$GLBZ .PSECT $DPB$.,D$$$=.0 .IFTF8 RLOG$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RLOG$C.@W D .MACRO RLOG$S MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$. LNMOD$R MOV$ STATUS MOV$ RTBMOD MOV$ RSIZEL MOV$ ENSSZS MOV$ ENS MOV$ LNSSZ. MOV$ LNSM MVB$ TBMSK,#0 MVB$ #10.,MOD MOV (PC)+,-(SP) .BYTE 207.,10., DIR$ ,ERR .ENDM RLOG$SRdW  .MACRO RMAF$S ERR MOV (PC)+,-(SP) .BYTE 163.,1F DIR$ ,ERR .ENDM RMAF$S,W N .MACRO RPOI$ TNAME,PN,PR,UGC,UMC,PARENT,BUFADR,BUFLEN,SC,DNAM,UNIT,TASK,OCBAD .MCALL R50$,OFF$R .IF NDF $$$GLBK .BYTE 11.,16. R50$ TNAMES .BLKW 3 .BYTE UMC,UGC R50$ PARENT .WORD OCBAD .WORD BUFADRS .WORD BUFLEN .BYTE UNIT .BYTE SCS .IF NB DNAM$$$T2=.S .ASCII /DNAM/ .=$$$T2+2, .IFFB .WORD .ENDC R50$ TASK .ENDC .IF NDF R.POTK B .IRP X,<,,,,,> OFF$ X .ENDM@ .IRP X,<,,,,> OFF$ XN .ENDM OFF$ R.POTN,2 .IF DF $$$GLB .GLOBL RP.OEX,RP.OAL,RP.ONX .ENDC RP.OEX=200 RP.OAL=001 RP.ONX=002 .ENDC .ENDM RPOI$8W V .MACRO RPOI$C TNAME,PN,PR,UGC,UMC,PARENT,BUFADR,BUFLEN,SC,DNAM,UNIT,TASK,OCBAD,CS,ERR .MCALL RPOI$,DIR$00"5TADATADATADATADATADATADATADATADATA .IF NDF $$$GLB= .PSECT $DPB$.,D$$$=. .IFTFG RPOI$ TNAME,PN,PR,UGC,UMC,PARENT,BUFADR,BUFLEN,SC,DNAM,UNIT,TASK,OCBAD. .IFT, .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RPOI$C<fW S .MACRO RPOI$S TNAME,PN,PR,UGC,UMC,PARENT,BUFADR,BUFLEN,SC,DNAM,UNIT,TASK,OCBAD,ERRB .MCALL MVB$,MOV$,RFA$,DIR$X RFA$ TASK MOV$ DNAM MVB$ UNIT,SCX MOV$ BUFLEN MOV$ BUFADR MOV$ OCBAD RFA$ PARENT MVB$ UMC,UGCR CLR -(SP) CLR -(SP) CLR -(SP) RFA$ TNAMEC MOV (PC)+,-(SP) .BYTE 11.,16. DIR$ ,ERR .ENDM RPOI$SBW # .MACRO RQST$C TN,PN,PR,GC,P,CS,ERR, .MCALL RQST$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=.R .IFTF RQST$ TN,PN,PR,GC,P .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMW  .MACRO RQST$S TN,PN,PR,GC,P,ERR .MCALL MVB$,RFA$,DIR$ MVB$ P,GC CLR -(SP) RFA$N RFA$ TN MOV (PC)+,-(SP) .BYTE 11.,7 DIR$ ,ERR .ENDM RQST$SA*W  .MACRO RQST$ TN,PN,PR,GC,PC .MCALL R50$,OFF$M .IF NDF $$$GLBS .BYTE 11.,7 R50$ TN .WORD 0,0 .WORD 0 .BYTE P,GC .ENDC .IF NDF R.QSTNN .NLISTCA .IRP X,<,,,,,>= OFF$ XF .ENDM .LIST .ENDC .ENDM RQST$W  .MACRO RREF$ WDB .MCALL OFF$ .IF NDF $$$GLBS .BYTE 81.,2 .WORD WDB .ENDC .IF NDF R.REBA, OFF$R OFF$ R.REBA,2 .ENDC .ENDM RREF$W  .MACRO RREF$C WDB,CS,ERRA .MCALL RREF$,DIR$ .IF NDF $$$GLBP .PSECT $DPB$.,D$$$=.O .IFTF RREF$ WDB .IFTY .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RREF$CGW  .MACRO RREF$S WDB,ERR .MCALL DIR$,MOV$< MOV$ WDBR MOV (PC)+,-(SP) .BYTE 81.,2 DIR$ ,ERR .ENDM RREF$SW  .MACRO RSUM$C TN,CS,ERR .MCALL RSUM$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.. .IFTF RSUM$ TN. .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RSUM$C$W  .MACRO RSUM$S TN,ERR, .MCALL RFA$,DIR$, RFA$ TN MOV (PC)+,-(SP) .BYTE 47.,3 DIR$ ,ERR .ENDM RSUM$SW  .MACRO RSUM$ TN .MCALL R50$,OFF$$ .IF NDF $$$GLB .BYTE 47.,3 R50$ TN .ENDC .IF NDF R.SUTNM .NLIST OFF$C OFF$ R.SUTN,4 .LIST .ENDC .ENDM RSUM$W / .MACRO RUN$C TN,PN,PR,UG,UP,SM,SU,RM,RU,CS,ERR$ .MCALL RUN$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.. .IFTF RUN$ TN,PN,PR,UG,UP,SM,SU,RM,RU .IFTN .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RUN$CW , .MACRO RUN$S TN,PN,PR,UG,UP,SM,SU,RM,RU,ERR .MCALL RVP$,MVB$,RFA$,DIR$ RVP$ SM,SU,RM,RU. MVB$ UP,UGN CLR -(SP) RFA$$ RFA$ TN MOV (PC)+,-(SP) .BYTE 17.,11. DIR$ ,ERR .ENDM RUN$SW & .MACRO RUN$ TN,PN,PR,GC,P,SM,SU,RM,RU .MCALL R50$,OFF$ .IF NDF $$$GLB  .BYTE 17.,11. R50$ TN .WORD 0,0 .WORD 0 .BYTE P,GCN .WORD SM .WORD SUB .WORD RM. .WORD RUR .ENDC .IF NDF R.UNTNR .NLISTFA .IRP X,<,,,,,> OFF$ XR .ENDM5 .IRP X,<,,,>D OFF$ XP .ENDM .LIST .ENDC .ENDM RUN$SW  .MACRO SCAA$ AST) .MCALL OFF$ .IF NDF $$$GLB. .BYTE 173.,2. .WORD AST .ENDC .IF NDF S.CAAEC OFF$U OFF$ S.CAAE,2 .ENDC .ENDMW  .MACRO SCAA$C AST,CS,ERRD .MCALL SCAA$,DIR$ .IF NDF $$$GLBS .PSECT $DPB$.,D$$$=.. .IFTF SCAA$ AST .IFTN .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SCAA$C4W  .MACRO SCAA$S AST,ERR .MCALL MOV$,DIR$ MOV$ AST2 MOV (PC)+,-(SP) .BYTE 173.,2. DIR$ ,ERR .ENDM SCAA$STW  .MACRO SCAL$S SRAD,CRAD .MCALL DIR$,MOV$. MOV$ CRAD MOV$ SRAD MOV (PC)+,-(SP) .BYTE 155.,3 DIR$ ,ERR .ENDM SCAL$SOW  .MACRO SCLI$ CLI,DEV,UNIT .MCALL R50$,OFF$C .IF NDF $$$GLB .BYTE 173.,5.$$$T2=.N .ASCII /DEV/S .=$$$T2+2D .BYTE UNIT,0F R50$ CLIT .ENDC .IF NDF S.CIDVR+ .IRP X,<,,,> OFF$ X. .ENDM .ENDC .ENDM SCLI$W " .MACRO SCLI$C CLI,DEV,UNIT,CS,ERR .MCALL SCLI$,DIR$00"8 1g .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.S .IFTF SCLI$ CLI,DEV,UNIT. .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SCLI$CW  .MACRO SCLI$S CLI,DEV,UNIT,ERRR .MCALL MOV$,RFA$,DIR$,MVB$ RFA$ CLI MVB$ UNIT,#0 MOV$ DEV3 MOV (PC)+,-(SP) .BYTE 173.,5. DIR$ ,ERR .ENDMW  .MACRO SDAT$C TN,BA,EFN,CS,ERR, .MCALL SDAT$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF SDAT$ TN,BA,EFN .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SDAT$C$W  .MACRO SDAT$S TN,BA,EFN,ERR .MCALL MOV$,RFA$,DIR$ MOV$ EFN MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 71.,5 DIR$ ,ERR .ENDM SDAT$SCW  .MACRO SDAT$ TN,BA,EFNI .MCALL R50$,OFF$ .IF NDF $$$GLB .BYTE 71.,5 R50$ TN .WORD BAE .WORD EFN .ENDC .IF NDF S.DATN .NLIST+ .IRP X,<,,,>T OFF$ X. .ENDM .LIST .ENDC .ENDM SDAT$&W  .MACRO SDIR$ MOD,ENS,ENSSZS .MCALL OFF$,LNMOD$N .IF NDF $$$GLB$ LNMOD$ .BYTE 207.,5. .BYTE 3 .BYTE MOD .WORD 0 .WORD ENS .WORD ENSSZ .ENDC .IF NDF S.DFUNV6 .IRP X,<,,,,> OFF$ X .ENDM .ENDC .ENDM SDIR$W # .MACRO SDIR$C MOD,ENS,ENSSZ,CS,ERR .MCALL SDIR$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=.L .IFTF SDIR$ MOD,ENS,ENSSZ .IFT, .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SDIR$CNW  .MACRO SDIR$S MOD,ENS,ENSSZ,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$F LNMOD$L MOV$ ENSSZ MOV$ ENS, MOV$ #0 MVB$ #3,MOD MOV (PC)+,-(SP) .BYTE 207.,5S DIR$ ,ERR .ENDM SDIR$SV4W $ .MACRO SDRC$ TNAME,BUF,EFN,EAST,ESB .MCALL OFF$,R50$ .IF NDF $$$GLBI .BYTE 141.,7 R50$ TNAME .WORD BUF .WORD EFN .WORD EAST .WORD ESB .ENDC .IF NDF S.DRTN A .IRP X,<,,,,,> OFF$ X$ .ENDM .ENDC .ENDM SDRC$W , .MACRO SDRC$C TNAME,BUF,EFN,EAST,ESB,CS,ERR .MCALL SDRC$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=.0 .IFTF SDRC$ TNAME,BUF,EFN,EAST,ESBE .IFTS .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SDRC$CAW ) .MACRO SDRC$S TNAME,BUF,EFN,EAST,ESB,ERRF .MCALL DIR$,MOV$,RFA$,MVB$0 MOV$ ESB. MOV$ EAST MOV$ EFN. MOV$ BUF RFA$ TNAME. MOV (PC)+,-(SP) .BYTE 141.,7, DIR$ ,ERR .ENDM SDRC$SEW 6 .MACRO SDRP$ TASK,BUFADR,BUFLEN,EFN,FLAG,PARENT,OCBAD .MCALL R50$,OFF$R .IF NDF $$$GLBF .BYTE 141.,9. R50$ TASK .WORD BUFADR. .BYTE EFN,FLAG. .IF NB BUFLEN .WORD BUFLEN .IFFT .WORD 13. .ENDC R50$ PARENT .WORD OCBAD .ENDC .IF NDF S.DRTKMA .IRP X,<,,,,,>R OFF$ XL .ENDM .IRP X,<,>  OFF$ XV .ENDM .IF DF $$$GLB .GLOBL SD.REX,SD.RAL,SD.RNX .ENDC SD.REX=200 SD.RAL=001 SD.RNX=002 .ENDC .ENDM SDRP$W > .MACRO SDRP$C TASK,BUFADR,BUFLEN,EFN,FLAG,PARENT,OCBAD,CS,ERR .MCALL SDRP$,DIR$ .IF NDF $$$GLBO .PSECT $DPB$.,D$$$=.A .IFTF/ SDRP$ TASK,BUFADR,BUFLEN,EFN,FLAG,PARENT,OCBAD. .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SDRP$CW ; .MACRO SDRP$S TASK,BUFADR,BUFLEN,EFN,FLAG,PARENT,OCBAD,ERR. .MCALL MVB$,MOV$,RFA$,DIR$D MOV$ OCBADF RFA$ PARENT MOV$ BUFLEN MVB$ EFN,FLAG MOV$ BUFADR RFA$ TASK MOV (PC)+,-(SP) .BYTE 141.,9. DIR$ ,ERR .ENDM SDRP$SW  .MACRO SETF$C EFN,CS,ERR, .MCALL SETF$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=.L .IFTF SETF$ EFN .IFTA .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SETF$C,W  .MACRO SETF$S EFN,ERR .MCALL MOV$,DIR$R MOV$ EFN MOV (PC)+,-(SP) .BYTE 33.,2 DIR$ ,ERR .ENDM SETF$SNW  .MACRO SETF$ EFND .MCALL OFF$ .IF NDF $$$GLBT .BYTE 33.,2 .WORD EFN .ENDC .IF NDF S.ETEF  .NLISTV OFF$- OFF$ S.ETEF,2 .LIST .ENDC .ENDM SETF$W  .MACRO SFPA$C AST,CS,ERRR .MCALL SFPA$,DIR$ .IF NDF $$$GLBL .PSECT $DPB$.,D$$$=.= .IFTF SFPA$ AST00"5TADATADATADATADATADATADATADATADATA .IFTF .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SFPA$C$W  .MACRO SFPA$S AST,ERR .MCALL MOV$,DIR$R MOV$ ASTF MOV (PC)+,-(SP) .BYTE 111.,22 DIR$ ,ERR .ENDM SFPA$SNW  .MACRO SFPA$ ASTD .MCALL OFF$ .IF NDF $$$GLBT .BYTE 111.,2 .WORD AST .ENDC .IF NDF S.FPAE .NLIST OFF$ OFF$ S.FPAE,2 .LIST .ENDC .ENDM SFPA$<W  .MACRO SMSG$ TGT,BUF,LEN,PRMLST .MCALL OFF$ .NLIST$ .IF NDF S.MTGTD OFF$3 .IRP X,<,,,>  OFF$ X .ENDM .IF DF $$$GLB .GLOBL SM.SER .ENDCSM.SER=1 .ENDC .IF NDF $$$GLBR$$$ARG=0 .IRP X,$$$ARG=$$$ARG+12 .ENDM .IF NB TGTS .IF IDN TGT SM.SER .IF LT,$$$ARG-4 $$$ARG=4L .ENDC .ENDC .ENDC .LIST .BYTE 171.,4+$$$ARG .BYTE TGT .BYTE 0 .WORD BUF .WORD LEN .IRP X,$$$ARG=$$$ARG-1M .WORD X .ENDM .REPT $$$ARG  .WORD .ENDR .ENDC .ENDMW ( .MACRO SMSG$C TGT,BUF,LEN,PRMLST,CS,ERR .MCALL SMSG$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.  .IFTF SMSG$ TGT,BUF,LEN,R .IFTN .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMW % .MACRO SMSG$S TGT,BUF,LEN,PRMLST,ERRT .MCALL MVB$,MOV$,RVP$,DIR$$$$$ARG=0$$$=0 .IRP X,$$$ARG=$$$ARG+1, .ENDM .IF NB TGT .IF IDN TGT #SM.SER .IF LT,$$$ARG-4 $$$=4-$$$ARG .REPT $$$ CLR -(SP) .ENDR .ENDC .ENDC .ENDC RVP$ PRMLST MOV$ LEN MOV$ BUF MVB$ TGTR MOV (PC)+,-(SP) .BYTE 171.,4+$$$ARG+$$$ DIR$ ,ERR .ENDM,W  .MACRO SNXC$ DEVICE,UNITS .MCALL OFF$ .IF NDF $$$GLBF .BYTE 127.,3. .IF B DEVICE .WORD 0 .IFF $$$T2=. .ASCII /DEVICE/ .=$$$T2+2 .ENDC .BYTE UNITL .BYTE 0 .ENDC .IF NDF S.NXDV$ .IRP X,<,,> OFF$ X. .ENDM .ENDC .ENDM SNXC$W ! .MACRO SNXC$C DEVICE,UNIT,CS,ERR$ .MCALL SNXC$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.V .IFTF SNXC$ DEVICE,UNIT .IFTV .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SNXC$CW  .MACRO SNXC$S DEVICE,UNIT,ERR .MCALL DIR$,MOV$. MOV$ UNIT MOV$ DEVICE MOV (PC)+,-(SP) .BYTE 127.,3. DIR$ ,ERR .ENDM SNXC$SVW  .MACRO SPEA$C AST,CS,ERRE .MCALL SPEA$,DIR$ .IF NDF $$$GLB, .PSECT $DPB$.,D$$$=. .IFTF SPEA$ AST .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SPEA$C,W  .MACRO SPEA$S AST,ERR .MCALL MOV$,DIR$D MOV$ AST= MOV (PC)+,-(SP) .BYTE 165.,2. DIR$ ,ERR .ENDM SPEA$S$W  .MACRO SPEA$ AST .MCALL OFF$ .IF NDF $$$GLB, .BYTE 165.,2L .WORD AST .ENDC .IF NDF S.PEAEE .NLISTC OFF$) OFF$ S.PEAE,2 .LIST .ENDC .ENDM SPEA$W  .MACRO SPND$C PSCT,ERRE .MCALL SPND$,DIR$ .IF NDF $$$GLB, .PSECT $DPB$.,D$$$=. .IFTF SPND$ .IFT. .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM SPND$C$pW  .MACRO SPND$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 45.,1 DIR$ ,ERR .ENDM SPND$SXW  .MACRO SPND$ .IF NDF $$$GLBR .BYTE 45.,1 .ENDC .ENDM SPND$W  .MACRO SPRA$C AST,CS,ERR .MCALL SPRA$,DIR$ .IF NDF $$$GLBO .PSECT $DPB$.,D$$$=.N .IFTF SPRA$ AST .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SPRA$C$W  .MACRO SPRA$S AST,ERR .MCALL MOV$,DIR$ MOV$ ASTS MOV (PC)+,-(SP) .BYTE 109.,2 DIR$ ,ERR .ENDM SPRA$SW  .MACRO SPRA$ AST$ .MCALL OFF$ .IF NDF $$$GLB1 .BYTE 109.,2. .WORD AST .ENDC .IF NDF S.PRAER .NLIST OFF$F OFF$ S.PRAE,2 .LIST .ENDC .ENDM SPRA$W F .MACRO SPWN$ TNAME,PN,PR,UGC,UMC,EFN,EAST,ESB,CMDLIN,CMDLEN,UNIT,DNAM .MCALL OFF$,R50$ .IF NDF $$$GLBT .IF B DNAMS .BYTE 11.,13. .IFF .BYTE 11.,14. .ENDC R50$ TNAME .BLKW 3 .BYTE UMC,UGC .WORD EFN .WORD EASTV .WORD ESB .WORD CMDLIN. .WORD CMDLEND .WORD UNITN .IF NB DNAM$$$T2=. .ASCII /DNAM/ .=$$$T2+2. .ENDC .ENDC .IF NDF S.PWTNYA .IRP X,<,,,,,> OFF$ XR .ENDM@ .IRP X,<,,,,> OFF$ X, .ENDM .IRP X,<> OFF$ XM .ENDR $$$OST=256.*8.F OFF$ SP.WX8 .ENDC .ENDM SPWN$$W N .MACRO SPWN$C TNAME,PN,PR,UGC,UMC,EFN,EAST,ESB,CMDLIN,CMDLEN,UNIT,DNAM,CS,ERR .MCALL SPWN$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=.N .IFTF; SPWN$ TNAME,,,UGC,UMC,EFN,EAST,ESB,CMDLIN,CMDLEN,UNIT,DNAM .IFTF .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SPWN$C>W K .MACRO SPWN$S TNAME,PN,PR,UGC,UMC,EFN,EAST,ESB,CMDLIN,CMDLEN,UNIT,DNAM,ERR> .MCALL DIR$,MOV$,MVB$,RFA$M .IF NB DNAM MOV$ DNAM .ENDC MOV$ UNIT MOV$ CMDLEN MOV$ CMDLIN MOV$ ESBN MOV$ EAST MOV$ EFN MVB$ UMC,UGCN CLR -(SP) CLR -(SP) CLR -(SP) RFA$ TNAME, MOV (PC)+,-(SP) .IF B DNAM, .BYTE 11.,13. .IFF .BYTE 11.,14. .ENDC DIR$ ,ERR .ENDM SPWN$SCW  .MACRO SRDA$C AST,CS,ERR. .MCALL SRDA$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=. .IFTF SRDA$ AST .IFTT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SRDA$CDW  .MACRO SRDA$S AST,ERR .MCALL MOV$,DIR$N MOV$ AST MOV (PC)+,-(SP) .BYTE 107.,2M DIR$ ,ERR .ENDM SRDA$STW  .MACRO SRDA$ ASTS .MCALL OFF$ .IF NDF $$$GLBA .BYTE 107.,2( .WORD AST .ENDC .IF NDF S.RDAE1 .NLIST OFF$E OFF$ S.RDAE,2 .LIST .ENDC .ENDM SRDA$W  .MACRO SREA$C AST,CS,ERR .MCALL SREA$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF SREA$ AST .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SREA$CW  .MACRO SREA$S AST,ERR .MCALL MOV$,DIR$ MOV$ AST MOV (PC)+,-(SP) .BYTE 167.,2 DIR$ ,ERR .ENDM SREA$SW  .MACRO SREA$ AST .MCALL OFF$ .IF NDF $$$GLB .BYTE 167.,2 .WORD AST .ENDC .IF NDF S.REAE .NLIST OFF$ OFF$ S.REAE,2 .LIST .ENDC .ENDM SREA$W  .MACRO SREF$ TASK,WDB,EFN .MCALL R50$,OFF$ .IF NDF $$$GLB .BYTE 69.,5 R50$ TASK .WORD EFN .WORD WDB .ENDC .IF NDF S.RETN$+ .IRP X,<,,,> OFF$ X  .ENDM .ENDC .ENDM SREF$W " .MACRO SREF$C TASK,WDB,EFN,CS,ERR .MCALL SREF$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF SREF$ TASK,WDB,EFN .IFTE .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SREF$CLW ! .MACRO SREF$S TSKADR,WDB,EFN,ERRS .MCALL DIR$,MOV$,RFA$ MOV$ WDBF MOV$ EFNE RFA$ TSKADR MOV (PC)+,-(SP) .BYTE 69.,5 DIR$ ,ERR .ENDM SREF$SDW  .MACRO SREX$C AST,BUF,CS,ERR  .MCALL SREX$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.C .IFTF SREX$ AST,BUF .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SREX$C,W  .MACRO SREX$S AST,BUF,ERR .MCALL MOV$,DIR$T CLR -(SP) MOV$ AST. MOV (PC)+,-(SP) .BYTE 167.,3 DIR$ ,ERR .ENDM SREX$SW  .MACRO SREX$ AST,BUF .MCALL OFF$ .IF NDF $$$GLBD .BYTE 167.,3 .WORD AST .WORD 0 .ENDC .IF NDF S.REAED .NLIST OFF$S OFF$ S.REAE,2 .LIST .ENDC .ENDM SREX$W  .MACRO SRRA$ ASTN .MCALL OFF$ .IF NDF $$$GLB$ .BYTE 21.,2 .WORD AST .ENDC .IF NDF S.RRAED .NLISTE OFF$N OFF$ S.RRAE,2 .LIST .ENDC .ENDM SRRA$W  .MACRO SRRA$C AST,CS,ERR- .MCALL SRRA$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=. .IFTF SRRA$ AST .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SRRA$CFW  .MACRO SRRA$S AST,ERR .MCALL MOV$,DIR$N MOV$ AST MOV (PC)+,-(SP) .BYTE 21.,2 DIR$ ,ERR .ENDM SRRA$SEW  .MACRO STAF$C AFF,CS,ERRC .MCALL STAF$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=.. .IFTF STAF$ AFF .IFTO .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM STAF$CW  .MACRO STAF$S AFF,ERR .MCALL DIR$,MOV$,AFF$ AFF$F MOV$ AFF. MOV (PC)+,-(SP) .BYTE 161.,2. DIR$ ,ERR .ENDM STAF$SSW  .MACRO STAF$ AFF$ .MCALL AFF$,OFF$ .IF NDF $$$GBLA AFF$ .BYTE 161.,2. .WORD AFF .ENDC .IF NDF S00"5TADATADATADATADATADATADATADATADATA.AFAFY .NLIST OFF$E OFF$ S.AFAF,2 .LIST .ENDC .ENDM STAF$W  .MACRO STIM$C NBUF,OBUF,CS,ERR$ .MCALL STIM$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.S .IFTF STIM$ NBUF,OBUF .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM STIM$CEfW  .MACRO STIM$S NBUF,OBUF,ERR .MCALL MOV$,DIR$,OFF$ MOV$ OBUF MOV$ NBUF MOV (PC)+,-(SP) .BYTE 61.,3 DIR$ ,ERR .IF NDF S.TIYRF .NLIST$$$OST=05 .IRP X,<,,,>F OFF$ XA .ENDM5 .IRP X,<,,,>A OFF$ X .ENDM .LIST .ENDC .ENDM STIM$S,W  .MACRO STIM$ NBUF,OBUF .MCALL OFF$ .IF NDF $$$GLBF .BYTE 61.,3 .WORD NBUF .WORD OBUFD .ENDC .IF NDF S.TIBAN .NLISTE OFF$ OFF$ S.TIBA,2 OFF$ S.TIBO,2 .IF NDF S.TIYR $$$OST=05 .IRP X,<,,,>6 OFF$ XR .ENDM5 .IRP X,<,,,>2 OFF$ X, .ENDM .ENDC .LIST .ENDC .ENDM STIM$W  .MACRO STLO$ GRP,MSK, .MCALL OFF$ .IF NDF $$$GLB .BYTE 137.,3 .WORD GRP .WORD MSK .ENDC .IF NDF S.TLGRB OFF$ OFF$ S.TLGR,2 OFF$ S.TLMS,2 .ENDC .ENDM STLO$W  .MACRO STLO$C GRP,MSK,CS,ERR. .MCALL STLO$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=.  .IFTF STLO$ GRP,MSK .IFT, .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM STLO$CMW  .MACRO STLO$S GRP,MSK,ERR .MCALL DIR$,MOV$, MOV$ MSK. .IF NB GRP MOV #GRP,-(SP)I .IFF CLR -(SP) .ENDC MOV (PC)+,-(SP) .BYTE 137.,3. DIR$ ,ERR .ENDM STLO$S,W  .MACRO STSE$ EFN. .MCALL OFF$ .IF NDF $$$GLB. .BYTE 135.,2. .WORD EFN .ENDC .IF NDF S.TSEF OFF$ OFF$ S.TSEF,2 .ENDC .ENDM STSE$W  .MACRO STSE$C EFN,CS,ERRB .MCALL STSE$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.  .IFTF STSE$ EFN .IFTL .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM STSE$CW  .MACRO STSE$S EFN,ERR .MCALL DIR$,MOV$I MOV$ EFNC MOV (PC)+,-(SP) .BYTE 135.,2) DIR$ ,ERR .ENDM STSE$SRZW  .MACRO STOP$ .IF NDF $$$GLBF .BYTE 131.,1$ .ENDC .ENDM STOP$W  .MACRO STOP$C CS,ERRF .MCALL STOP$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=. .IFTF STOP$ .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM STOP$CrW  .MACRO STOP$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 131.,1N DIR$ ,ERR .ENDM STOP$SW  .MACRO SVDB$C AD,LN,CS,ERRM .MCALL SVDB$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=. .IFTF SVDB$ AD,LN .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SVDB$C$W  .MACRO SVDB$S AD,LN,ERR .MCALL MOV$,DIR$F MOV$ LN MOV$ AD MOV (PC)+,-(SP) .BYTE 103.,3. DIR$ ,ERR .ENDM SVDB$SW  .MACRO SVDB$ A,L. .MCALL OFF$ .IF NDF $$$GLB .BYTE 103.,3  .WORD A .WORD L .ENDC .IF NDF S.VDTA. .NLIST, .IRP X,<,,> OFF$ X .ENDM .LIST .ENDC .ENDM SVDB$W  .MACRO SVTK$C ADR,LEN,CS,ERR. .MCALL SVTK$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.$ .IFTF SVTK$ ADR,LEN .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SVTK$COW  .MACRO SVTK$S ADR,LEN,ERR .MCALL MOV$,DIR$D MOV$ LEN. MOV$ ADR MOV (PC)+,-(SP) .BYTE 105.,3 DIR$ ,ERR .ENDM SVTK$SFW  .MACRO SVTK$ TA,TLO .MCALL OFF$ .IF NDF $$$GLB .BYTE 105.,3 .WORD TA, .WORD TL2 .ENDC .IF NDF S.VTTAI .NLISTC .IRP X,<,,> OFF$ XV .ENDM .LIST .ENDC .ENDM SVTK$LW  .MACRO SWST$ BASE,ADDR= .MCALL OFF$ .IF NDF $$$GLBF .BYTE 175.,3. .WORD BASER .WORD ADDRN .ENDC .IF NDF S.WBAS .IRP X,<,,> OFF$ X$ .ENDM $$$OST=2@ .IRP X,<,,,,> OFF$ X .ENDM OFF$ S.WSR5,2 .ENDC .ENDM SWST$W  .MACRO SWST$C BASE,ADDR,CS,ERR .MCALL SWST$,DIR$ .IF NDF $$$GLB .PSECT 00"8 1g$DPB$.,D$$$=.T .IFTF SWST$ BASE,ADDR .IFTM .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SWST$C.W  .MACRO SWST$S BASE,ADDR,ERR .MCALL DIR$,MOV$, MOV$ ADDR MOV$ BASE MOV (PC)+,-(SP) .BYTE 175.,3. DIR$ ,ERR .ENDM SWST$SDW ? .MACRO TLON$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMODR .MCALL OFF$,LNMOD$F .IF NDF $$$GLBF LNMOD$2 .BYTE 207.,10.S .BYTE 13. .BYTE MOD .WORD TBMSK .WORD LNS .WORD LNSSZ .WORD ENS .WORD ENSSZ .WORD RSIZE .WORD RTBMODT .WORD STATUS$ .ENDC .IF NDF T.LFUNCA .IRP X,<,,,,,>A OFF$ XS .ENDM@ .IRP X,<,,,,> OFF$ XE .ENDM .ENDC .ENDM TLON$W G .MACRO TLON$C MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,CS,ERR .MCALL TLON$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.0 .IFTF8 TLON$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM TLON$C.@W D .MACRO TLON$S MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$. LNMOD$R MOV$ STATUS MOV$ RTBMOD MOV$ RSIZEL MOV$ ENSSZS MOV$ ENS MOV$ LNSSZ. MOV$ LNSM MVB$ TBMSK,#0 MVB$ #13.,MOD MOV (PC)+,-(SP) .BYTE 207.,10., DIR$ ,ERR .ENDM TLON$SRW ? .MACRO TLOG$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMODM .MCALL OFF$,LNMOD$N .IF NDF $$$GLBZ LNMOD$ .BYTE 207.,10.S .BYTE 9.$ .BYTE MOD .WORD TBMSK .WORD LNS .WORD LNSSZ .WORD ENS .WORD ENSSZ .WORD RSIZE .WORD RTBMODT .WORD STATUSL .ENDC .IF NDF T.LFUNA .IRP X,<,,,,,>M OFF$ X .ENDM@ .IRP X,<,,,,> OFF$ X2 .ENDM .ENDC .ENDM TLOG$W G .MACRO TLOG$C MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,CS,ERR .MCALL TLOG$,DIR$ .IF NDF $$$GLBZ .PSECT $DPB$.,D$$$=.0 .IFTF8 TLOG$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM TLOG$C.@W D .MACRO TLOG$S MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$. LNMOD$R MOV$ STATUS MOV$ RTBMOD MOV$ RSIZEL MOV$ ENSSZS MOV$ ENS MOV$ LNSSZ. MOV$ LNSM MVB$ TBMSK,#0 MVB$ #9.,MODR MOV (PC)+,-(SP) .BYTE 207.,10., DIR$ ,ERR .ENDM TLOG$SRW  .MACRO ULGF$C CS,ERR .MCALL ULGF$,DIR$ .IF NDF $$$GLBO .PSECT $DPB$.,D$,$$$=.S .IFTF ULGF$ .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ULGF$CMrW  .MACRO ULGF$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 159.,1, DIR$ ,ERR .ENDM ULGF$SVZW  .MACRO ULGF$T .IF NDF $$$GLBD .BYTE 159.,1 .ENDC .ENDM ULGF$W  .MACRO UMAP$ WDBB .MCALL OFF$ .IF NDF $$$GLBC .BYTE 123.,2E .WORD WDB .ENDC .IF NDF U.MABAR OFF$ OFF$ U.MABA,2 .ENDC .ENDM UMAP$W  .MACRO UMAP$C WDB,CS,ERRD .MCALL UMAP$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.$ .IFTF UMAP$ WDB .IFTM .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM UMAP$C$W  .MACRO UMAP$S WDB,ERR .MCALL DIR$,MOV$V MOV$ WDB MOV (PC)+,-(SP) .BYTE 123.,2$ DIR$ ,ERR .ENDM UMAP$SNW  .MACRO USTP$ TNAMEA .MCALL OFF$,R50$C .IF NDF $$$GLBF .BYTE 133.,3E R50$ TNAMEO .ENDC .IF NDF U.STTNU OFF$ OFF$ U.STTN,2 .ENDC .ENDM USTP$W  .MACRO USTP$C TNAME,CS,ERR, .MCALL USTP$,DIR$ .IF NDF $$$GLB$ .PSECT $DPB$.,D$$$=.$ .IFTF USTP$ TNAME .IFTF .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM USTP$C$W  .MACRO USTP$S TNAME,ERR .MCALL DIR$,RFA$V RFA$ TNAME MOV (PC)+,-(SP) .BYTE 133.,3 DIR$ ,ERR .ENDM USTP$SW % .MACRO VRCD$C TN,BA,BL=13.,TI,CS,ERRC .MCALL VRCD$,DIR$ .IF NDF $$$GLBR .PSECT $DPB$.,D$$$=.N .IFTF VRCD$ TN,BA,BL,TI .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM VRCD$CPW 00"5TADATADATADATADATADATADATADATADATA# .MACRO VRCD$S TN,BA,BL=#13.,TI,ERR .MCALL MOV$,DIR$, RFA$ MOV$ TI MOV$ BL MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 75.,6.U DIR$ ,ERR .ENDM VRCD$S."W  .MACRO VRCD$ TN,BA,BL=13.,TI  .MCALL OFF$, R50$ .IF NDF $$$GLB, .BYTE 75.,6. R50$ TN .WORD BA .WORD BL .WORD TID .ENDC .IF NDF R.VDTNC .NLIST 6 .IRP X,<,,,,> OFF$ XV .ENDM .LIST .ENDC .ENDM VRCD$W % .MACRO VRCS$C TN,BA,BL=13.,TI,CS,ERR .MCALL VRCS$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF VRCS$ TN,BA,BL,TI .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM VRCS$C.W # .MACRO VRCS$S TN,BA,BL=#13.,TI,ERR1 .MCALL MOV$,DIR$, RFA$$ MOV$ TI MOV$ BL MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 139.,6. DIR$ ,ERR .ENDM VRCS$SV"W  .MACRO VRCS$ TN,BA,BL=13.,TIR .MCALL OFF$, R50$ .IF NDF $$$GLBM .BYTE 139.,6. R50$ TN .WORD BA .WORD BL .WORD TIS .ENDC .IF NDF R.VSTN .NLIST 6 .IRP X,<,,,,> OFF$ XV .ENDM .LIST .ENDC .ENDM VRCS$W % .MACRO VRCX$C TN,BA,BL=13.,TI,CS,ERR .MCALL VRCX$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF VRCX$ TN,BA,BL,TI .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM VRCX$C.W # .MACRO VRCX$S TN,BA,BL=#13.,TI,ERR1 .MCALL MOV$,DIR$, RFA$$ MOV$ TI MOV$ BL MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 77.,6.O DIR$ ,ERR .ENDM VRCX$SV"W  .MACRO VRCX$ TN,BA,BL=13.,TIR .MCALL OFF$, R50$ .IF NDF $$$GLBM .BYTE 77.,6.C R50$ TN .WORD BA .WORD BL .WORD TIX .ENDC .IF NDF R.VXTN .NLIST 6 .IRP X,<,,,,> OFF$ XV .ENDM .LIST .ENDC .ENDM VRCX$W . .MACRO VSDA$C TN,BA,BL=13.,EFN,SPRI,TI,CS,ERR .MCALL VSDA$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=.I .IFTF VSDA$ TN,BA,BL,EFN,SPRI,TI( .IFTS .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM VSDA$CW , .MACRO VSDA$S TN,BA,BL=#13.,EFN,SPRI,TI,ERR .MCALL MOV$,RFA$,DIR$ MOV$ TI MOV$ SPRI MOV$ BL MOV$ EFN MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 71.,8.R DIR$ ,ERR .ENDM VSDA$S,xW & .MACRO VSDA$ TN,BA,BL=13.,EFN,SPRI,TI .MCALL R50$,OFF$ .IF NDF $$$GLBR .BYTE 71.,8.B R50$ TN .WORD BAE .WORD EFN .WORD BL .WORD SPRIL .WORD TI  .ENDC .IF NDF S.DABL .NLIST,+ .IRP X,<,,,>  OFF$ X .ENDM* .IRP X,<,,> OFF$ XA .ENDM .LIST .ENDC .ENDM VSDA$VW + .MACRO VSRC$ TNAME,BUF,BUFLEN,EFN,EAST,ESBA .MCALL OFF$,R50$C .IF NDF $$$GLB7 .BYTE 141.,8. R50$ TNAMED .WORD BUF .WORD EFN .WORD BUFLENN .WORD EASTN .WORD ESB .ENDC .IF NDF V.SRTNFL .IRP X,<,,,,,,> OFF$ X. .ENDM .ENDC .ENDM VSRC$W 3 .MACRO VSRC$C TNAME,BUF,BUFLEN,EFN,EAST,ESB,CS,ERR .MCALL VSRC$,DIR$ .IF NDF $$$GLB> .PSECT $DPB$.,D$$$=.. .IFTF$ VSRC$ TNAME,BUF,BUFLEN,EFN,EAST,ESB .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM VSRC$CLW 0 .MACRO VSRC$S TNAME,BUF,BUFLEN,EFN,EAST,ESB,ERR .MCALL DIR$,MOV$,RFA$,MVB$E MOV$ ESBE MOV$ EAST MOV$ BUFLEN MOV$ EFNS MOV$ BUF RFA$ TNAME> MOV (PC)+,-(SP) .BYTE 141.,8. DIR$ ,ERR .ENDM VSRC$SFW * .MACRO WDBBK$ APR,SIZ,RID,OFF,LEN,STS,SRB .MCALL WDBDF$ WDBDF$F .BYTE 0,APR .WORD 0 .WORD SIZ .WORD RID .WORD OFF .WORD LEN .WORD STS .WORD SRB .ENDM WDBBK$F8W  .MACRO WDBDF$ GBL .MCALL .BLKW.,.BLKB.,.BLK.M .BLK. .BLKB. 1,W.NID,GBL. .BLKB. 1,W.NAPR,GBL .BLKW. 1,W.NBAS,GBL .BLKW. 1,W.NSIZ,GBL .BLKW. 1,W.NRID,GBL .BLKW. 1,W.NOFF,GBL .BLKW. 1,W.NLEN,GBL .BLKW. 1,W.NSTS,GBL .BLKW. 1,W.NSRB,GBL .BLKW. 0,W.NLGH,GBL .IF IDN ,1 .GLOBL WS.CRW,WS.UNM,WS.ELW,WS.RRF,WS.64B,WS.SISS1 .GLOBL WS.MAP,WS.RCX,WS.DEL,WS.EXT,WS.WRT,WS.RED0* .GLOB00"8 1gL WS.BPS,WS.NBP,WS.UDS,WS.NAT,WS.RES .ENDCWS.CRW=^O<100000>BWS.UNM=^O<40000>WS.ELW=^O<20000>WS.RRF=^O<10000>WS.BPS=^O<4000>.WS.NBP=^O<4000>LWS.RES=^O<2000>IWS.NAT=^O<1000>,WS.64B=^O<400>WS.MAP=^O<200>WS.RCX=^O<100> WS.SIS=^O<40> WS.UDS=^O<20>. WS.DEL=^O<10>G WS.EXT=^O<4> WS.WRT=^O<2> WS.RED=^O<1>WS.EDS=WS.SIS!WS.UDS .MACRO WDBDF$ X .ENDM .ENDM WDBDF$$0W , .MACRO WIMP$C SFCN,P1,P2,P3,P4,P5,P6,CS,ERR .MCALL DIR$,GFN$,OFF$ .IF NDF $$$GLBW .PSECT $DPB$.,D$$$=.. .IFTF GFN$A .NARG $$$NN $$$I=$$$N^ .BYTE 169.,$$$N+1% .IRP $$$PRM,0 .IF EQ $$$I .MEXIT .IFF^ $$$I=$$$I-1R .ENDC .WORD $$$PRM< .ENDR .IF NDF W.IMSFS .NLIST06 .IRP X,<,,,,> OFF$ XG .ENDR* .IRP X,<,,> OFF$ XU .ENDR OFF$ W.IP07,2 .ENDC .IFTB .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM WIMP$C3.W % .MACRO WIMP$S SFCN,P1,P2,P3,P4,P5,P6W .MCALL MOV$,DIR$,OFF$,MVB$,GFN$ GFN$A .NARG $$$NN $$$I=$$$N^$$$K=6.1% .IRP $$$PRM,, .IF GT $$$I-$$$K MOV$ $$$PRM .ENDC $$$K=$$$K-1R .ENDR MOV (PC)+,-(SP) .BYTE 169.,$$$N+1 DIR$. .ENDM WIMP$S,W $ .MACRO WIMP$ SFCN,P1,P2,P3,P4,P5,P6 .MCALL OFF$,GFN$< .IF NDF $$$GLB, GFN$P .NARG $$$N $$$I=$$$N .BYTE 169.,$$$N+1% .IRP $$$PRM, .IF EQ $$$I .MEXIT .IFF $$$I=$$$I-1A .ENDC .WORD $$$PRM3 .ENDR .ENDC .IF NDF W.INSF$ .NLIST$6 .IRP X,<,,,,> OFF$ X, .ENDM* .IRP X,<,,> OFF$ X .ENDR .ENDC .ENDM WIMP$W  .MACRO WSIG$C PSCT,ERRM .MCALL WSIG$,DIR$ .IF NDF $$$GLBI .PSECT $DPB$.,D$$$=.6 .IFTF WSIG$ .IFT. .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM WSIG$CYpW  .MACRO WSIG$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 49.,1 DIR$ ,ERR .ENDM WSIG$S.XW  .MACRO WSIG$F .IF NDF $$$GLBL .BYTE 49.,1 .ENDC .ENDM WSIG$W  .MACRO WTLO$C SET,MASK,CS,ERR .MCALL WTLO$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF WTLO$ SET, .IFTA .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM WTLO$C$zW  .MACRO WTLO$S SET,MSK,ERR .MCALL MOV$,DIR$ $$$T1=1R .IF EQ SET-4N$$$T1=0M .IRP X, $$$T1=$$$T1+1A .ENDM .IF NE $$$T1-1I) .ERROR SET ;UNSUPPORTED EXECUTIVE OPTIONE .ENDC .ENDC .IF EQ $$$T1-1 MOV$ MSK .IF NE SETN MOV #SET,-(SP)E .IFF CLR -(SP) .ENDC MOV (PC)+,-(SP) .BYTE 43.,3 .ENDC DIR$ ,ERR .ENDM WTLO$SI.W  .MACRO WTLO$ SET,MASK .IF NDF $$$GLBL$$$T1=1A .IF EQ SET-4.$$$T1=0 .IRP X, $$$T1=$$$T1+1W .ENDM .IF NE $$$T1-1) .ERROR SET ;UNSUPPORTED EXECUTIVE OPTIONR .ENDC .ENDC .IF EQ $$$T1-1T .BYTE 43.,3 .WORD SET .WORD MASK. .ENDC .ENDC .ENDM WTLO$W  .MACRO WTSE$C EF,CS,ERR .MCALL WTSE$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=., .IFTF WTSE$ EFR .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM WTSE$CRW  .MACRO WTSE$S EF,ERR .MCALL MOV$,DIR$A MOV$ EF MOV (PC)+,-(SP) .BYTE 41.,2 DIR$ ,ERR .ENDM WTSE$SSW  .MACRO WTSE$ EFN$ .MCALL OFF$ .IF NDF $$$GLBD .BYTE 41.,2 .WORD EFN .ENDC .IF NDF W.TSEFT .NLIST4 OFF$. OFF$ W.TSEF,2 .LIST .ENDC .ENDM WTSE$W  .MACRO DIR$ ADR,ERR .IF NB C MOV ADR,-(SP) .ENDC EMT ^O<377> .IIF NB , .MCALL ERR$ .IIF NB , ERR$ ERR .ENDM DIR$$*W  .MACRO ERR$ ERR .IF NB . .NLISTE .NTYPE $$$T1,ERR  .LIST .IIF EQ ^O<$$$T1-27>, BCC .+6 .IIF EQ ^O<$$$T1-37>, BCC .+6 .IF GE ^O<$$$T1-60> BCC .+6 .IFFE .IF NE ^O<$$$T1-27> .IIF NE ^O<$$$T1-37>, BCC .+4 .ENDC .ENDC CALL ERRF .ENDC .ENDM ERR$OW  .MACRO MVB$ LOW,HIGHN .IF B .IF B . CLR -(SP) .IFF CLRB -(SP)C MOVB HIGH,1(SP) .ENDC .IFF< .IF00"5TADATADATADATADATADATADATADATADATA B < CLR -(SP) MOVB LOW,(SP) .IFF  MOVB LOW,-(SP)D MOVB HIGH,1(SP) .ENDC .ENDC .ENDM MVB$NW  .MACRO OFF$ SYMB,LEN. .IF B <'SYMB'LEN>$$$OST=2 .MEXIT. .ENDC .IF NB  .IF NDF $$$GLB$ SYMB=$$$OSTC .IFF. SYMB==$$$OST .ENDC .ENDC .IF NB -$$$OST = ^O<$$$OST+LEN>N .ENDC .ENDM OFF$CW  .MACRO RFA$ ADR .IF NB H .NLISTF .NTYPE $$$T2,ADRI .LIST .IF LT $$$T2-6 MOV 2(ADR),-(SP)  MOV (ADR),-(SP) .IFF< MOV ADR,-(SP) MOV @(SP),-(SP) ADD #2,2(SP)F MOV @2(SP),2(SP)D .ENDC .IFFS CLR -(SP) CLR -(SP) .ENDC .ENDM RFA$W * .MACRO RVP$ P0,P1,P2,P3,P4,P5,P6,P7,P8,P9 .MCALL MOV$ .NLIST .NARG $$$ARGF .LIST .IIF GT $$$ARG-9., MOV$ $ .IIF GT $$$ARG-8., MOV$ L .IIF GT $$$ARG-7, MOV$  .IIF GT $$$ARG-6, MOV$  .IIF GT $$$ARG-5, MOV$  .IIF GT $$$ARG-4, MOV$  .IIF GT $$$ARG-3, MOV$  .IIF GT $$$ARG-2, MOV$  .IIF GT $$$ARG-1, MOV$  .IIF GT $$$ARG, MOV$ .ENDM RVP$(W  .MACRO R50$ NAMEF .NLIST- .NCHR $$$T1,NAME. .LIST .IF EQ $$$T1 .WORD 0,0 .IFFR .IF GT $$$T1-63 $$$T4=.+47 .IFTF .RAD50 /NAME/ .IFT.=$$$T4$ .ENDC .IIF LT $$$T1-4, .WORD 0O .ENDC .ENDM R50$$W  .MACRO MOV$ ARG .IF NB . .IF DIF ,<#0>  MOV ARG,-(SP) .MEXITM .ENDC .ENDC CLR -(SP) .ENDM MOV$.W  .MACRO .BLKB. NUM,SYM,GBL .IF NB I .IF IDN ,SYM==$$$ .IFF,SYM=$$$> .ENDC .ENDC $$$=$$$+NUM .ENDM .BLKB.$W  .MACRO .BLKW. NUM,SYM,GBL .IF NB  .IF IDN ,SYM==$$$ .IFFTSYM=$$$. .ENDC .ENDC$$$=$$$+<2*NUM>$ .ENDM .BLKW..8W  .MACRO .BLK.$$$=0R .ENDM .BLK.tW  .MACRO LNMOD$ LM.USR=128. LT.USR=2. SD.LOG=3. SD.BYE=4. GD.LOG=5. SD.TI=6. .ENDMW  .MACRO AFF$CPA=1ACPB=2KCPC=4SCPD=10UBE=20UBF=40UBH=100<UBJ=200BUBK=400$UBL=1000UBM=2000UBN=4000 UBP=10000= UBR=20000. UBS=40000$ UBT=100000 .ENDM AFF$W  .MACRO GFN$GI.GAS=0GI.UIC=1GI.DEF=2GI.FMK=3GI.QMC=4GI.UAB=5GI.DEV=6 GI.SPR=7.+ GI.REN=8.. GI.APR=9.. GI.TSK=10. GI.SPM=11. GI.CFG=12. GI.SSN=13. GI.ABO=14. GI.VEC=15. GI.MSD=16. GI.UPD=17. GI.DVJ=18. .ENDMW  .MACRO QIOSY$ $$$GBL,$$$MSG) .IIF IDN,<$$$GBL>,, .GLOBL QI.VERP .IF IDN,<$$$MSG>,0 $$$MAX=0B $$MSG=1 .IFFB $$MSG=0 .ENDC .MCALL IOERR$ IOERR$ $$$GBL .MCALL DRERR$ DRERR$ $$$GBL .IF DIF,<$$$MSG>, .MCALL FILIO$ FILIO$ $$$GBL .MCALL SPCIO$ SPCIO$ $$$GBL .MACRO QIOSY$ ARG,ARG1,ARG2 .ENDM QIOSY$7 .ENDC .ENDM QIOSY$9 W  .MACRO IOERR$ $$$GBLI .MCALL .IOER.,DEFIN$I .IF IDN,<$$$GBL>,D ...GBL=1J .IFF. ...GBL=0 .ENDC .IIF NDF,$$MSG,$$MSG=0, .IOER. IE.BAD,-01.$ .IOER. IE.IFC,-02.Q .IOER. IE.DNR,-03.M .IOER. IE.VER,-04.= .IOER. IE.ONP,-05. .IOER. IE.SPC,-06.C .IOER. IE.DNA,-07.$ .IOER. IE.DAA,-08. .IOER. IE.DUN,-09.D .IOER. IE.EOF,-10. .IOER. IE.EOV,-11.O .IOER. IE.WLK,-12.I .IOER. IE.DAO,-13.. .IOER. IE.SRE,-14., .IOER. IE.ABO,-15. .IOER. IE.PRI,-16.9 .IOER. IE.RSU,-17.. .IOER. IE.OVR,-18. .IOER. IE.BYT,-19.I .IOER. IE.BLK,-20.D .IOER. IE.MOD,-21.. .IOER. IE.CON,-22.N .IOER. IE.BBE,-56.$ .IOER. IE.STK,-58.D .IOER. IE.FHE,-59.C .IOER. IE.EOT,-62.R .IOER. IE.OFL,-65.R .IOER. IE.BCC,-66.P+ .IOER. IE.NFW,-69. ;-+ .IOER. IE.DIS,-69. ;9 .IOER. IE.PNT,-71.01 .IOER. IE.NDR,-72. ;O) .IOER. IE.TMO,-95. ;O .IOER. IE.CNR,-96.O .IOER. IE.MII,-99.O .IOER. IE.SPI,-100.5 .IOER. IE.FER,-101. ;- .IOER. IE.NOD,-23.- .IOER. IE.DFU,-24.- .IOER. IE.IFU,-25.- .IOER. IE.NSF,-26.- .IOER. IE.LCK,-27.- .IOER. IE.HFU,-28.- .IOER. IE.WAC,-29.- .IOER. IE.CKS,-30.- .IOER. IE.WAT,-00"8 1g31.- .IOER. IE.RER,-32.r .IOER. IE.WER,-33.S .IOER. IE.ALN,-34.p .IOER. IE.SNC,-35.P .IOER. IE.SQC,-36.N .IOER. IE.NLN,-37.s .IOER. IE.CLO,-38.O .IOER. IE.DUP,-57.e .IOER. IE.BVR,-63.O .IOER. IE.BHD,-64.O .IOER. IE.EXP,-75.O .IOER. IE.BTF,-76.O .IOER. IE.ALC,-84.r .IOER. IE.ULK,-85.t .IOER. IE.WCK,-86.D .IOER. IE.DSQ,-90.U: .IOER. IE.PIO,-104. ; .IOER. IE.NBF,-39.  .IOER. IE.RBG,-40.  .IOER. IE.NBK,-41.  .IOER. IE.ILL,-42.  .IOER. IE.BTP,-43.  .IOER. IE.RAC,-44.  .IOER. IE.RAT,-45.  .IOER. IE.RCN,-46.  .IOER. IE.2DV,-48.  .IOER. IE.FEX,-49.  .IOER. IE.BDR,-50.  .IOER. IE.RNM,-51.  .IOER. IE.BDI,-52.  .IOER. IE.FOP,-53.  .IOER. IE.BNM,-54.  .IOER. IE.BDV,-55.  .IOER. IE.NFI,-60.  .IOER. IE.ISQ,-61.  .IOER. IE.NNC,-77.  .IOER. IE.NNN,-68.  .IOER. IE.BLB,-70.  .IOER. IE.URJ,-73.s .IOER. IE.NRJ,-74.n .IOER. IE.NDA,-78.F .IOER. IE.IQU,-91.G .IOER. IE.RES,-92.K .IOER. IE.TML,-93.L .IOER. IE.NNT,-94.P .IOER. IE.UKN,-97.C= .IOER. IE.IRR,-102. ;2& .IOER. IE.SIU,-103. ; .IOER. IE.NLK,-79.  .IOER. IE.NST,-80.  .IOER. IE.FLN,-81.  .IOER. IE.IES,-82.  .IOER. IE.PES,-83.  .IOER. IE.ICE,-47.  .IOER. IE.ONL,-67.  .IOER. IE.SZE,-98.  .IOER. IE.NTR,-87.  .IOER. IE.REJ,-88.  .IOER. IE.FLG,-89.  DEFIN$ IS.PND,+00.  DEFIN$ IS.SUC,+01.  DEFIN$ IS.RDD,+02.  DEFIN$ IS.TNC,+02.  DEFIN$ IS.CHW,+04.  DEFIN$ IS.BV,+05. DEFIN$ IS.DAO,+02.R DEFIN$ IS.CR,<15*400+1> DEFIN$ IS.ESC,<33*400+1>e DEFIN$ IS.CC,<3*400+1> DEFIN$ IS.ESQ,<233*400+1> DEFIN$ IS.PES,<200*400+1> DEFIN$ IS.EOT,<4*400+1> DEFIN$ IS.TAB,<11*400+1>O DEFIN$ IS.TMO,+2. DEFIN$ IS.OOB,+3. DEFIN$ IS.TMM,+4.' DEFIN$ IS.RVI,+2. ; DATA SUCC. XMITTED8' DEFIN$ IS.CNV,+3. ; DATA SUCC. XMITTED- DEFIN$ IS.XPT,+5. DEFIN$ SB.KIL,-1. DEFIN$ SB.ACK,-2. DEFIN$ SB.NAK,-3. DEFIN$ SB.ENQ,-4. DEFIN$ SB.BOF,-5. DEFIN$ SB.TMO,-6. DEFIN$ SB.DIS,-7.+; THE NEXT AVAILABLE ERROR NUMBER IS: -105.;F .IF EQ,$$MSG4 .MACRO IOERR$ A .ENDM IOERR$ .ENDC .ENDM IOERR$+W  .MACRO DRERR$ $$$GBLS .MCALL .QIOE.,DEFIN$  .IF IDN,<$$$GBL>, ...GBL=1 .IFF ...GBL=0 .ENDC .IIF NDF,$$MSG,$$MSG=0I3 .QIOE. IE.UPN,-01. ;  .QIOE. IE.INS,-02.N .QIOE. IE.PTS,-03.  .QIOE. IE.UNS,-04.B .QIOE. IE.ULN,-05.N .QIOE. IE.HWR,-06.Q .QIOE. IE.ACT,-07.- .QIOE. IE.ITS,-08.. .QIOE. IE.FIX,-09. .QIOE. IE.CKP,-10.E .QIOE. IE.TCH,-11. .QIOE. IE.RBS,-15. .QIOE. IE.PRI,-16.N .QIOE. IE.RSU,-17.. .QIOE. IE.NSW,-18. .QIOE. IE.ILV,-19.R .QIOE. IE.ITN,-20.Q .QIOE. IE.LNF,-21.N .QIOE. IE.AST,-80.. .QIOE. IE.MAP,-81.. .QIOE. IE.IOP,-83.  .QIOE. IE.ALG,-84.. .QIOE. IE.WOV,-85.n .QIOE. IE.NVR,-86.o .QIOE. IE.NVW,-87.S .QIOE. IE.ITP,-88.S .QIOE. IE.IBS,-89.S .QIOE. IE.LNL,-90.N .QIOE. IE.IUI,-91.R .QIOE. IE.IDU,-92.T .QIOE. IE.ITI,-93.S .QIOE. IE.PNS,-94.X .QIOE. IE.IPR,-95.P .QIOE. IE.ILU,-96.H .QIOE. IE.IEF,-97.S .QIOE. IE.ADP,-98.I .QIOE. IE.SDP,-99.U DEFIN$ IS.CLR,0 DEFIN$ IS.SET,2 DEFIN$ IS.SPD,2 DEFIN$ IS.SUP,3 DEFIN$ IS.WAT,4 .IF EQ,$$MSGE .MACRO DRERR$ A .ENDM DRERR$ .ENDC .ENDM DRERR$.W  .MACRO FILIO$ $$$GBL .MCALL .WORD.,DEFIN$. .IF IDN,<$$$GBL>, ...GBL=1S .IFFE ...GBL=09 .ENDC .WORD. IQ.X,001,000 .WORD. IQ.Q,002,000 .WORD. IQ.S,004,000 .WORD. IQ.UMD,004,000 .WORD. IQ.LCK,200,000 .WORD. IO.KIL,012,000 .WORD. IO.RDN,022,000 .WORD. IO.UNL,042,000 .WORD. IO.LTK,050,000 .WORD. IO.RTK,060,000 .WORD. IO.SET,030,000 .WORD. IO.WLB,000,001 .WORD. IO.RLB,000,002 .WORD. IO.LOV,010,002 .WORD. IO.LDO,110,002 .WORD. IO.ATT,000,003 .WORD. IO.DET,000,004 .WORD. IO.FNA,000,011 .WORD. IO.RNA,000,013 .WORD. IO.ENA,000,014 .WORD. IO.CLN,000,007 .WORD. IO.ULK,000,012 .WORD. IO.ACR,000,015 .WORD. IO.ACW,000,016 .WORD. IO.ACE,000,017 .WORD. IO.DAC,000,020 .00"5TADATADATADATADATADATADATADATADATAWORD. IO.RVB,000,021 .WORD. IO.WVB,000,022 .WORD. IO.EXT,000,023 .WORD. IO.CRE,000,024 .WORD. IO.DEL,000,025 .WORD. IO.RAT,000,026 .WORD. IO.WAT,000,027 .WORD. IO.APV,010,030 .WORD. IO.APC,000,030 .MACRO FILIO$ A .ENDM FILIO$ .ENDM FILIO$0W  .MACRO SPCIO$ $$$GBLO .MCALL .WORD.,DEFIN$O .IF IDN,<$$$GBL>,A ...GBL=1. .IFFO ...GBL=07 .ENDC .WORD. IO.WLV,100,001 .WORD. IO.WLS,010,001 .WORD. IO.WNS,020,001 .WORD. IO.WAL,010,001 .WORD. IO.WMS,020,001 .WORD. IO.CCO,040,001 .WORD. IO.WBT,100,001 .WORD. IO.WLT,010,001 .WORD. IO.WLC,020,001 .WORD. IO.WPB,040,001 .WORD. IO.WDD,140,001 .WORD. IO.RSN,140,002 .WORD. IO.RLV,100,002 .WORD. IO.RST,001,002 .WORD. IO.RAL,010,002 .WORD. IO.RNE,020,002 .WORD. IO.RNC,040,002 .WORD. IO.RTM,200,002 .WORD. IO.RDB,200,002 .WORD. IO.SCF,200,002 .WORD. IO.RHD,010,002 .WORD. IO.RNS,020,002 .WORD. IO.CRC,040,002 .WORD. IO.RPB,040,002 .WORD. IO.RDF,240,002 .WORD. IO.RLC,020,002 .WORD. IO.ATA,010,003 .WORD. IO.GTS,000,005 .WORD. IO.R1C,000,005 .WORD. IO.INL,000,005 .WORD. IO.TRM,010,005 .WORD. IO.RWD,000,005 .WORD. IO.SPB,020,005 .WORD. IO.RPL,020,005 .WORD. IO.SPF,040,005 .WORD. IO.STC,100,005 .WORD. IO.SMD,110,005 .WORD. IO.SEC,120,005 .WORD. IO.RWU,140,005 .WORD. IO.SMO,160,005 .WORD. IO.HNG,000,006 .WORD. IO.HLD,100,006 .WORD. IO.BRK,200,006 .WORD. IO.RBC,000,006 .WORD. IO.MOD,000,006 .WORD. IO.HDX,010,006 .WORD. IO.FDX,020,006 .WORD. IO.SYN,040,006 .WORD. IO.EOF,000,006 .WORD. IO.ERS,020,006 .WORD. IO.DSE,040,006 .WORD. IO.RTC,000,007 .WORD. IO.SAO,000,010 .WORD. IO.SSO,000,011 .WORD. IO.RPR,000,011 .WORD. IO.MSO,000,012 .WORD. IO.RTT,001,012 .WORD. IO.SLO,000,013 .WORD. IO.MLO,000,014 .WORD. IO.LED,000,024 .WORD. IO.SDO,000,025 .WORD. IO.SDI,000,026 .WORD. IO.SCS,000,026 .WORD. IO.REL,000,027 .WORD. IO.MCS,000,027 .WORD. IO.ADS,000,030 .WORD. IO.CCI,000,030 .WORD. IO.LOD,000,030 .WORD. IO.MDI,000,031 .WORD. IO.DCI,000,031 .WORD. IO.PAD,000,031 .WORD. HT.RPP,010,000 .WORD. IO.XMT,000,031 .WORD. IO.XNA,010,031 .WORD. IO.INI,000,031 .WORD. IO.HIS,000,032 .WORD. IO.RCI,000,032 .WORD. IO.RCV,000,032 .WORD. IO.CLK,000,032 .WORD. IO.CSR,000,032 .WORD. IO.MDO,000,033 .WORD. IO.CTI,000,033 .WORD. IO.CON,000,033 .WORD. IO.ORG,010,033 .WORD. IO.ANS,020,033 .WORD. IO.STA,000,033 .WORD. IO.DTI,000,034 .WORD. IO.DIS,000,034 .WORD. IO.MDA,000,034 .WORD. IO.DPT,010,034 .WORD. IO.RTI,000,035 .WORD. IO.CTL,000,035 .WORD. IO.STP,000,035 .WORD. IO.SWI,000,035 .WORD. IO.CNT,000,036 .WORD. IO.ITI,000,036 .WORD. IO.EIO,000,037;0; DISK VOLUME PROCESSING;) DEFIN$ VV$SET,1 ; SET/CLEAR VOLUME VALID0( DEFIN$ VV$UNL,2 ; LOAD/UNLOAD THE DRIVE" DEFIN$ VV$SIZ,-1 ; SIZE THE DRIVE .WORD. IO.RSD,030,014 .WORD. IO.WSD,010,013 DEFIN$ SD.TXT,0 DEFIN$ SD.GDS,1 .WORD. SB.PRT,020,003 .WORD. SB.CLR,010,036 .WORD. SB.RDY,010,033 .WORD. SB.NRD,020,033 .WORD. IO.LBK,000,035 .WORD. SB.CBL,010,035 .WORD. SB.CLK,020,035 .WORD. IO.CPR,010,033 .WORD. IO.CAS,020,033 .WORD. IO.CRJ,040,033 .WORD. IO.CBO,110,033 .WORD. IO.CTR,210,033 .WORD. IO.GNI,010,035 .WORD. IO.GLI,020,035 .WORD. IO.GLC,030,035 .WORD. IO.GRI,040,035 .WORD. IO.GRC,050,035 .WORD. IO.GRN,060,035 .WORD. IO.CSM,070,035 .WORD. IO.CIN,100,035 .WORD. IO.SPW,110,035 .WORD. IO.CPW,120,035 .WORD. IO.NLB,130,035 .WORD. IO.DLB,140,035 .WORD. IO.CTY,000,007 .WORD. IO.DTY,000,015 .WORD. IO.LDI,000,016 .WORD. IO.UDI,010,023 .WORD. IO.LTI,000,017 .WORD. IO.UTI,020,023 .WORD. IO.LTY,000,020 .WORD. IO.UTY,030,023 .WORD. IO.LKE,000,024 .WORD. IO.UER,040,023 .WORD. IO.NLK,000,023 .WORD. IO.ONL,000,037 .WORD. IO.FLN,000,025 .WORD. IO.RAD,000,021 .WORD. IO.MAO,010,007 .WORD. IO.LEI,010,017 .WORD. IO.RDD,010,020 .WORD. IO.RMT,020,020 .WORD. IO.LSI,000,022 .WORD. IO.UEI,050,023 .WORD. IO.USI,060,023 .WORD. IO.CSI,000,026 .WORD. IO.DSI,000,027 .00"8 1gWORD. IO.RAM,000,032 .WORD. IO.RLK,000,013 .WORD. IO.EBT,000,011 .WORD. IO.ATX,000,001 .WORD. IO.ATF,000,002 .WORD. IO.CRX,000,031 .WORD. IO.DRX,000,032 .WORD. IO.RTF,000,033 .MACRO SPCIO$ A .ENDM SPCIO$ .ENDM SPCIO$0\W  .MACRO UMDIO$ $$$GBLO .MCALL .WORD.,DEFIN$O .IF IDN <$$$GBL>,I...GBL=1 .IFF ...GBL=0 .ENDC .WORD. IQ.UMD,004,000 .WORD. IO.HMS,000,010 .WORD. IO.BLS,010,010 .WORD. IO.OFF,020,010 .WORD. IO.RDH,030,010 .WORD. IO.WDH,040,010 .WORD. IO.WCK,050,010 .WORD. IO.RNF,060,010 .WORD. IO.RNR,070,010 .WORD. IO.LPC,100,010 .WORD. IO.RTD,120,010 .WORD. IO.WTD,130,010 .WORD. IO.TDD,140,010 .WORD. IO.DGN,150,010 .WORD. IO.WPD,160,010 .WORD. IO.RPD,170,010 .WORD. IO.CER,200,010 .WORD. IO.CEW,210,010 .MACRO UMDIO$ A .ENDM .ENDM UMDIO$GW  .MACRO .IOER. SYM,LO,MSGD DEFIN$ SYM,LO .IF GT,$$MSGS .MCALL .IOMG. .IOMG. SYM,LO, .ENDC .ENDM .IOER.OW  .MACRO .QIOE. SYM,LO,MSG. DEFIN$ SYM,LO .IF GT,$$MSGO .MCALL .IOMG. .IOMG. SYM,,  .ENDC .ENDM .QIOE. W  .MACRO .IOMG. SYM,LO,MSGD .WORD -^O .ENABL LC .ASCIZ ^MSG^. .DSABL LC .EVEN' .IIF LT,^O<$$$MAX+>,$$$MAX=-^O2 .ENDM .IOMG. VW  .MACRO .WORD. SYM,LO,HI DEFIN$ SYM, .ENDM .WORD.IW  .MACRO SNPDF$ GBL .IF IDN ,7 .GLOBL SB.CTL,SB.DEV,SB.UNT,SB.EFN,SB.ID,SB.LM1,SB.PMD1 .GLOBL SC.HDR,SC.LUN,SC.OVL,SC.STK,SC.WRD,SC.BYTO .ENDC$ SB.CTL = 0 SB.DEV = 2 SB.UNT = 4#SB.DSW = 5 ;DIRECTIVE STATUS WORD SB.EFN = 6SB.ID = ^O<10>ISB.LM1 = ^O<12>SB.PMD = ^O<32>. SC.HDR = 1 SC.LUN = 2 SC.OVL = 4SC.STK = ^O<10>TSC.WRD = ^O<20>$SC.BYT = ^O<40>. .MACRO SNPDF$ X .ENDM .ENDM SNPDF$WW : .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$AW < .MACRO SNAP$ CTL,EFN,ID,L1,H1,L2,H2,L3,H3,L4,H4,?LBL1,?LBL2* .MCALL SNPDF$,WTSE$S,SDAT$S,RQST$S,CLEF$S SNPDF$.% .IIF NB , MOV CTL,..SPBK+SB.CTLC% .IIF NB , MOV EFN,..SPBK+SB.EFN" .IIF NB , MOV ID,..SPBK+SB.IDC MOVB @#$DSW,..SPBK+SB.DSW ;MOVE REQUESTING TASK'S DSW TO SNAP BLOC...SNP = SB.LM1E! .IRP X, .IF NB E MOV X,..SPBK+...SNP .ENDC...SNP = ...SNP+2 .ENDM CLEF$S ..SPBK+SB.EFNO BCS LBL2. SDAT$S #..SPBK+SB.PMD,#..SPBK BCS LBL2 RQST$S #..SPBK+SB.PMD BCC LBL11 CMP #IE.ACT,@#$DSWB BEQ LBL1. SEC BR LBL2LBL1: WTSE$S ..SPBK+SB.EFNLBL2: .ENDM SNAP$W  .MACRO ISTAT$ STTBL,KEYTBL,DEBUG .MCALL MTRAN$ .IF DF $RONLY .PSECT $STATE,D,ROV .IFFW .PSECT $STATE,D .ENDCSTTBL::K .IF DF $RONLY .PSECT $KTAB,D,RO .IFFR .PSECT $KTAB,DL .ENDCKEYTBL:: .IF DF $RONLY .PSECT $KSTR,D,RO .IFFS .PSECT $KSTR,D. .ENDC .IF IDN ,<$DEBUG>L .MACRO DBGTP$ .LIST .=. .NLISTL .ENDM .IFFS .MACRO DBGTP$ .ENDM .ENDC $$$KEY = -1 $$$FLG = -1 $EXIT = 0 $LAMDA = 300. $NUMBR = 302B $STRNG = 304A $BLANK = 306 $SUBXP = 310T $EOS = 312L $DNUMB = 314 $RAD50 = 316 $ANY = 320 $ALPHA = 322. $DIGIT = 324S .PSECT. .ENDM ISTAT$W .MACRO STATE$ LABEL. .PSECT $STATE $$$FLG = $$$FLG!200 MTRAN$D .IF NB LABELCLABEL: .ENDC $$$FLG = -1 .PSECT .ENDM STATE$W (.MACRO TRAN$ TYPE,LABEL,ACTION,MASK,ADDR .PSECT $STATE MTRAN$. DBGTP$T .IF NB ACTION $$$FLG = $$$FLG!2 .MACRO $$$ACT .WORD ACTION .ENDM $$$ACT  .ENDC .IF NB MASK $$$FLG = $$$FLG!30U .IF B ADDR$" .ERROR "MASK ADDRESS NOT PRESENT" .ENDC .MACRO $$$BIT00"5TADATADATADATADATADATADATADATADATA .WORD MASK,ADDR .ENDM $$$BIT .ENDC .IF NB LABEL $$$FLG = $$$FLG!4 $$$STA = LABEL. .ENDC .IRPC $$$$$X, .IF IDN <$$$$$X>,<">F .PSECT $KSTRE $$$TMP = .$ .ASCII TYPE<377> .PSECT $KTAB .WORD $$$TMP .MACRO $$$TYP .BYTE $$$KEY!200S .ENDM $$$TYP  $$$KEY = $$$KEY+1 .IF GT $$$KEY-63. .ERROR "TOO MANY KEYWORDS"R .ENDC .MEXITA .ENDC .IF IDN <$$$$$X>, $$$FLG = $$$FLG!1 .MACRO $$$EXT .WORD 0'TYPE. .ENDM $$$EXTR .MACRO $$$TYP .BYTE $SUBXPR .ENDM $$$TYPD .MEXITR .ENDC .MACRO $$$TYP .BYTE TYPEE .ENDM $$$TYP$ .MEXIT$ .ENDM .PSECT. .ENDM TRAN$$xW  .MACRO MTRAN$" .PSECT $STATE .IF EQ $$$FLG+1 $$$FLG = 03 .MEXITS .ENDC $$$TYPD .BYTE $$$FLGR .IF NE $$$FLG&1 $$$EXTS .ENDC .IF NE $$$FLG&2 $$$ACT1 .ENDC .IF NE $$$FLG&10O $$$BITN .ENDC .IF NE $$$FLG&4 .WORD $$$STA. .IFF< .IF EQ $$$FLG&200 .ERROR "BAD DEFAULT TRANSITION" .ENDC .ENDC $$$FLG = 0. .ENDM MTRAN$W  .MACRO TTSYM$ $$$GBL .MCALL DEFIN$ ...GBL=0Y .IF IDN,<$$$GBL>,. ...GBL=1N .ENDC DEFIN$ TC.WID,1. DEFIN$ TC.LPP,2.M DEFIN$ TC.RSP,3.C DEFIN$ TC.XSP,4.$ DEFIN$ TC.STB,5.3 DEFIN$ TC.ISL,6. DEFIN$ TC.RAT,7.$ DEFIN$ TC.TTP,8.G DEFIN$ TC.SCR,9.C DEFIN$ TC.SCP,10. DEFIN$ TC.HFL,11. DEFIN$ TC.VFL,12. DEFIN$ TC.NL ,13. DEFIN$ TC.SFF,14. DEFIN$ TC.HFF,15. DEFIN$ TC.LVF,16. DEFIN$ TC.HHT,17. DEFIN$ TC.NST,18. DEFIN$ TC.BSP,19. DEFIN$ TC.ACR,20. DEFIN$ TC.SMR,21. DEFIN$ TC.SMP,22. DEFIN$ TC.SMO,23. DEFIN$ TC.CCF,24. DEFIN$ TC.ALT,25. DEFIN$ TC.IMG,26. DEFIN$ TC.NKB,27. DEFIN$ TC.NPR,28. DEFIN$ TC.ESQ,29. DEFIN$ TC.LCP,30. DEFIN$ TC.PAR,31. DEFIN$ TC.EPA,32. DEFIN$ TC.DLU,33. DEFIN$ TC.BLK,34. DEFIN$ TC.FRM,35. DEFIN$ TC.HLD,36. DEFIN$ TC.TAP,37. DEFIN$ TC.CEQ,38. DEFIN$ TC.NEC,39. DEFIN$ TC.SLV,40. DEFIN$ TC.PRI,41. DEFIN$ TC.UC0,42. DEFIN$ TC.UC1,43. DEFIN$ TC.UC2,44. DEFIN$ TC.UC3,45. DEFIN$ TC.UC4,46. DEFIN$ TC.UC5,47. DEFIN$ TC.UC6,48. DEFIN$ TC.UC7,49. DEFIN$ TC.UC8,50. DEFIN$ TC.UC9,51. DEFIN$ TC.FDX,52. DEFIN$ TC.BIN,53. DEFIN$ TC.REM,54. DEFIN$ TC.8BC,55. DEFIN$ TC.P8B,56. DEFIN$ TC.TBF,57. DEFIN$ TC.CTS,58. DEFIN$ TC.ANS,59. DEFIN$ TC.CSQ,60. DEFIN$ TC.CTC,61. DEFIN$ TC.ASP,62. DEFIN$ TC.ABD,63. DEFIN$ TC.TBS,64. DEFIN$ TC.TBM,65. DEFIN$ TC.NBR,66. DEFIN$ TC.ACD,67. DEFIN$ TC.ARC,68. DEFIN$ TC.TRN,69. DEFIN$ TC.XMM,70. DEFIN$ TC.FSZ,71. DEFIN$ XT.DLM,72. DEFIN$ XT.DMD,73. DEFIN$ XT.DTT,74. DEFIN$ XT.DIT,75. DEFIN$ XT.MTP,76. DEFIN$ XT.SDE,77. DEFIN$ XT.TAK,78. DEFIN$ XT.GOV,79. DEFIN$ XT.TSP,80. DEFIN$ XT.TTO,81. DEFIN$ TC.ANI,82. DEFIN$ TC.AVO,83. DEFIN$ TC.DEC,84. DEFIN$ TC.EDT,85. DEFIN$ TC.RGS,86. DEFIN$ TC.INT,87. DEFIN$ TC.TLC,88. DEFIN$ TC.SFC,89. DEFIN$ TC.HSY,90. DEFIN$ XT.TIM,91. DEFIN$ XT.CPD,92. DEFIN$ XT.VER,93. DEFIN$ XT.REV,94. DEFIN$ XT.THS,95. DEFIN$ TC.OOB,96. DEFIN$ TC.ICS,97. DEFIN$ TC.SSC,98. DEFIN$ TC.TMM,99. DEFIN$ TC.TSY,100.  DEFIN$ TC.MHU,101.T DEFIN$ TC.PTH,102.S DEFIN$ TC.PPT,103.K: DEFIN$ TC.SXL,104. ; PRINTER SUPPORTS SIXEL GRAPHICS> DEFIN$ TC.CLC,105. ; ^C AST NOTIFICATION FOR UNATTATCHED TASK, DEFIN$ TC.CLN,106. ; 7-BIT CHARACTER LENGTH? DEFIN$ TC.QDP,107. ; CONNECT/DISCONNECT/QUEUE DEPTH (GET ONLY)C! DEFIN$ TC.MAP,108. ; LAT MAPPINGND DEFIN$ TC.MAX,109. ;++286 THIS MUST BE ONE GREATER THAN THE HIGHEST ; VALUE USED FOR A SYMBOL  DEFIN$ SE.ICN,1.  DEFIN$ SE.FIX,2.  DEFIN$ SE.BIN,3.  DEFIN$ SE.VAL,4.N DEFIN$ SE.TER,5.F DEFIN$ SE.SPD,6.D DEFIN$ SE.SPL,7. DEFIN$ SE.PAR,8.  DEFIN$ SE.LPR,9.O DEFIN$ SE.NSC,10. DEFIN$ SE.UPN,11. DEFIN$ SE.NIH,12.=; DEFIN$ SE.ATA,13. ; TERMINAL ATTACHED WITH AST NOTIFICATIONE* DEFIN$ SE.NAT,14. ; TERMINAL NOT ATTACHED DEFIN$ SE.IAA,15. DEFIN$ SF.SSC, 2400!020 DEFIN$ SF.SMC, 2400!040 DEFIN$ SF.RDF, 2400!060 DEFIN$ SF.STT, 2400!100 DEFIN$ SF.STS, 2400!120 DEFIN$ SF.GSC, 2400!140 DEFIN$ 00"'8 1gSF.GMC, 2400!160 DEFIN$ SF.GAC, 2400!200 DEFIN$ SF.SAC, 2400!220 DEFIN$ SF.DEF, 010E DEFIN$ S.0 ,1.E DEFIN$ S.50 ,2.E DEFIN$ S.75 ,3.E DEFIN$ S.100 ,4.E DEFIN$ S.110 ,5.E DEFIN$ S.134 ,6.E DEFIN$ S.150 ,7.S DEFIN$ S.200 ,8.L DEFIN$ S.300 ,9.N DEFIN$ S.600 ,10. DEFIN$ S.1200,11. DEFIN$ S.1800,12. DEFIN$ S.2000,13. DEFIN$ S.2400,14. DEFIN$ S.3600,15. DEFIN$ S.4800,16. DEFIN$ S.7200,17. DEFIN$ S.9600,18. DEFIN$ S.EXTA,19. DEFIN$ S.EXTB,20. DEFIN$ S.19.2,21. DEFIN$ S.38.4,22. DEFIN$ T.UNK0,0.0 DEFIN$ T.AS33,1.C DEFIN$ T.KS33,2.  DEFIN$ T.AS35,3.N DEFIN$ T.L30S,4.N DEFIN$ T.L30P,5.N DEFIN$ T.LA36,6.N DEFIN$ T.VT05,7.N DEFIN$ T.VT50,8.N DEFIN$ T.VT52,9.N DEFIN$ T.VT55,10. DEFIN$ T.VT61,11. DEFIN$ T.L180,12. DEFIN$ T.V100,13. DEFIN$ T.L120,14. DEFIN$ T.SCR0,15. DEFIN$ T.LA12,16. DEFIN$ T.L100,17. DEFIN$ T.LA34,18. DEFIN$ T.LA38,19. DEFIN$ T.V101,20. DEFIN$ T.V102,21. DEFIN$ T.V105,22. DEFIN$ T.V125,23. DEFIN$ T.V131,24. DEFIN$ T.V132,25. DEFIN$ T.LA50,26. DEFIN$ T.LQP1,27. DEFIN$ T.LQP2,28. DEFIN$ T.BMP1,29. DEFIN$ T.V2XX,30. DEFIN$ T.LN03,31. DEFIN$ T.DTC1,32. DEFIN$ T.L210,33. DEFIN$ T.LQP3,34. DEFIN$ T.LA75,35. ; LA75& DEFIN$ T.L2XX,36. ; LA200 SERIES/ DEFIN$ T.LCG1,37. ;++100 LCG01 GRAPICS PRINTER  DEFIN$ T.USR0,128.. DEFIN$ T.USR1,T.USR0+11 DEFIN$ T.USR2,T.USR1+1D DEFIN$ T.USR3,T.USR2+1  DEFIN$ T.USR4,T.USR3+12 DEFIN$ XT.DIA,0 DEFIN$ XT.DTM,1 DEFIN$ XT.D20,2 DEFIN$ XT.OHS,3 DEFIN$ XT.VOI,0 DEFIN$ XT.SER,1 DEFIN$ XT.ENC,2 DEFIN$ XT.DTD,3 DEFIN$ XTM.NO,-1. DEFIN$ XTM.FS,0 DEFIN$ XTM.PS,1 DEFIN$ XTM.21,5 DEFIN$ XTM.M1,6 DEFIN$ XTM.M2,7 DEFIN$ XTM.US,10  DEFIN$ XTU.UI,0 DEFIN$ XTU.CD,2 DEFIN$ XTU.CL,4 DEFIN$ XTU.DR,6 DEFIN$ XTU.OF,8.C DEFIN$ XTU.ON,10. DEFIN$ XTU.RI,12. DEFIN$ XTU.TU,14. DEFIN$ XTU.TD,16. DEFIN$ XTC.DT,1 DEFIN$ XTC.EN,2 DEFIN$ XTC.SE,4 DEFIN$ XTC.VO,10N DEFIN$ F1.ACR,000001D DEFIN$ F1.BTW,000002 DEFIN$ F1.BUF,000004N DEFIN$ F1.UIA,000010S DEFIN$ F1.CCO,000020 DEFIN$ F1.ESQ,000040N DEFIN$ F1.HLD,000100T DEFIN$ F1.LWC,0002001 DEFIN$ F1.RNE,000400F DEFIN$ F1.RPR,001000T DEFIN$ F1.RST,0020001 DEFIN$ F1.RUB,004000D DEFIN$ F1.SYN,010000  DEFIN$ F1.TRW,020000R DEFIN$ F1.UTB,040000 DEFIN$ F1.VBF,100000F DEFIN$ F2.SCH,000001  DEFIN$ F2.GCH,000002. DEFIN$ F2.DCH,0000041 DEFIN$ F2.DKL,000010F DEFIN$ F2.ALT,000020T DEFIN$ F2.SFF,000040R DEFIN$ F2.CUP,000100W DEFIN$ F2.FDX,000200F DEFIN$ F2.EIO,000400A DEFIN$ F2.NCT,001000O DEFIN$ TF.RST,001 DEFIN$ TF.BIN,002 DEFIN$ TF.RAL,010 DEFIN$ TF.RNE,020 DEFIN$ TF.XOF,100 DEFIN$ TF.TMO,200 DEFIN$ TF.RCU,001 DEFIN$ TF.WAL,010 DEFIN$ TF.WMS,020 DEFIN$ TF.CCO,040 DEFIN$ TF.WBT,100 DEFIN$ TF.SYN,200 DEFIN$ TF.XCC,001 DEFIN$ TF.NOT,002 DEFIN$ TF.AST,010 DEFIN$ TF.ESQ,020 DEFIN$ TF.UCH,TF.NOT1 DEFIN$ TF.WLB,001 DEFIN$ TF.RLB,002 DEFIN$ TF.WIR,200 DEFIN$ TF.RTT,400 DEFIN$ TF.RLU,1000F DEFIN$ TF.RPR,2000D DEFIN$ TF.RPT,4000 DEFIN$ TF.RES,10000 DEFIN$ TF.RNF,20000 DEFIN$ TF.TNE,40000 DEFIN$ TF.RDI,100000N .MACRO TTSYM$ NULL  .ENDM .ENDM TTSYM$TW  .MACRO FHDOF$ GLOBALL .MCALL FHDO1$ ...GBL=0D .IF B,GLOBAL0 FHDO1$ DEF$LT .IFFD .IF IDN,,F ...GBL=1D .ENDC FHDO1$ GLOBAL .ENDC .IF DIF,,D .MACRO FHDOF$ ARG1 .ENDM FHDOF$0 .ENDC .ENDM FHDOF$W  .MACRO FHDO1$ OFFSETD .MCALL DEF$I,OFFSET,DEFIN$F DEF$I 0 OFFSET H.IDOF,1 OFFSET H.MPOF,1 OFFSET H.FNUM,2 OFFSET H.FSEQ,2 OFFSET H.FLEV,2 OFFSET H.FOWN OFFSET H.PROG,1 OFFSET H.PROJ,1 OFFSET H.FPRO,2 DEFIN$ FP.RDV,1 DEFIN$ FP.WRV,2 DEFIN$ FP.EXT,4 DEFIN$ FP.DEL,10F OFFSET H.FCHA OFFSET H.UCHA,1 DEFIN$ UC.CON,200 DEFIN$ UC.DLK,100 DEFIN$ UC.CNB,40L DEFIN$ UC.WCK,20D DEFIN$ UC.RCK,10D DEFIN$ UC.WBC,4 DEFIN$ UC.NIB,2 OFFSET H.SCHA,1 DEFIN$ SC.MDL,200 DEFIN$ SC.BAD,100 DEFIN$ SC.DIR,40  DEFIN$ SC00"/5TADATADATADATADATADATADATADATADATA.SPL,20F OFFSET H.UFAT,32. OFFSET S.HDHD DEF$I 0 OFFSET I.FNAM,6 OFFSET I.FTYP,2 OFFSET I.FVER,2 OFFSET I.RVNO,2 OFFSET I.RVDT,7 OFFSET I.RVTI,6 OFFSET I.CRDT,7 OFFSET I.CRTI,6 OFFSET I.EXDT,7 OFFSET ,1 OFFSET S.IDHD DEFIN$ I.DASZ,7 DEFIN$ I.TISZ,6 DEF$I 0 OFFSET M.ESQN,1 OFFSET M.ERVN,1 OFFSET M.EFNU,2 OFFSET M.EFSQ,2 OFFSET M.CTSZ,1 OFFSET M.LBSZ,1 OFFSET M.USE,1C OFFSET M.MAX,1. OFFSET M.RTRV OFFSET S.MPHD DEFIN$ H.CKSM,510.N .IF DIF,,L .MACRO FHDO1$ ARG13 .ENDM FHDO1$D .ENDC .ENDM FHDO1$.W  .MACRO HMBOF$ GLOBAL2 .MCALL HMBO1$ ...GBL=0 .IF B,GLOBALE HMBO1$ DEF$LF .IFFR .IF IDN,,F ...GBL=17 .ENDC HMBO1$ GLOBAL .ENDC .IF DIF,,I .MACRO HMBOF$ ARG1E .ENDM HMBOF$F .ENDC .ENDM HMBOF$.W  .MACRO HMBO1$ OFFSET1 .MCALL DEF$I,OFFSET,DEFIN$. DEF$I 0 OFFSET H.IBSZ,2 OFFSET H.IBLB,4 OFFSET H.FMAX,2 OFFSET H.SBCL,2 OFFSET H.DVTY,2 OFFSET H.VLEV,2 OFFSET H.VNAM,12. OFFSET ,4 OFFSET H.VOWN,2 OFFSET H.VPRO,2 OFFSET H.VCHA,2 DEFIN$ CH.SDI,400 OFFSET H.DFPR,2 OFFSET ,6 OFFSET H.WISZ,1 OFFSET H.FIEX,1 OFFSET H.LRUC,1 OFFSET H.REVD,7 OFFSET H.REVC,2 OFFSET ,2 OFFSET H.CHK1,2 OFFSET H.VDAT,14. OFFSET ,382.H OFFSET H.PKSR,4 OFFSET ,12. OFFSET H.INDN,12. OFFSET H.INDO,12. OFFSET H.INDF,12. OFFSET ,2 OFFSET H.CHK2,2 .IF DIF,, .MACRO HMBO1$ ARG1F .ENDM HMBO1$O .ENDC .ENDM HMBO1$ W  .MACRO CSI$1 CSBLK,BUFF,LEN .GLOBL .CSI1F .MCALL CSI$,LDR0$ .IF NDF C.SIZEN CSI$I .ENDC LDR0$ CSBLK .IF NB  MOV BUFF,C.CMLD+2(R0) .ENDC .IF NB C MOV LEN,C.CMLD(R0) .ENDC JSR PC,.CSI1E .ENDMW  .MACRO CSI$2 CSBLK,IO,SWTAB .GLOBL .CSI2K .MCALL CSI$,LDR0$ .IF NDF C.SIZE. CSI$E .ENDC LDR0$ CSBLK .IF NB  .IF IDN ,2 MOVB #CS.INP,(R0) .IFFN .IF IDN , MOVB #CS.OUT,(R0) .IFF.# .ERROR ;INCORRECT REQUEST TO .CSI2R .ENDC .ENDC .ENDC .IF NB . MOV SWTAB,C.SWAD(R0)N .ENDC JSR PC,.CSI2N .ENDMW # .MACRO CSI$4 CSBLK,IO,SWTAB,DSCBLKC .GLOBL .CSI4C .MCALL CSI$,LDR0$ .IF NDF C.SIZEP CSI$E .ENDC LDR0$ CSBLK .IF NB  .IF IDN ,. MOVB #CS.INP,(R0) .IFFL .IF IDN , MOVB #CS.OUT,(R0) .IFFK .ERROR  .ENDC .ENDC .ENDC .IF NB N MOV SWTAB,C.SWAD(R0)N .ENDC MOV R1,-(SP)C .IF NB  MOV DSCBLK,R1 .IFFQ CLR R1C .ENDC MOV R2,-(SP). MOV #.FSR5,R2 JSR PC,.CSI4T MOV (SP)+,R2 MOV (SP)+,R1, .ENDMVW , .MACRO CSI$SW SW,MK,MKW,CLR,NEGS,VALTAB,LNG .IF B,SWI .ERROR ;MISSING SWITCH NAME .IFFZ .EVEN .NCHR SIZ$$,SW$ .IF GT,SIZ$$-2I .IF B,LNG SIZ$$=2 .ENDC .ENDC CNT$$=0 .IRPC CHR$$$,SW CHR$$=''CHR$$$V CNT$$=CNT$$+1 .IF GE,>. .IF LE,>B CHR$$=CHR$$-^O40A .ENDC .ENDC .IF LE,CNT$$-SIZ$$N $$=0L .IF NB,LNGL .IF IDN,, .IF GT,CNT$$&1( .IF GE,CNT$$+1-SIZ$$J $$=^O200T .ENDC .IFF .IF LT,CNT$$-SIZ$$N $$=^O200 .ENDC .ENDC .IFFW .IF IDN,,T .IF EQ,CNT$$&1I .IF LT,CNT$$-SIZ$$I $$=^O200. .ENDC .ENDC .IFFZ- .ERROR ;ILLEGAL "LONG" OR "EXACT" SPECIFIER .ENDC .ENDC .ENDC .BYTE CHR$$!$$W .ENDC .ENDM .EVEN .ENDC .IF NB MK .WORD MK^ .IFF .WORD 0 .ENDC$$=0 .IF NB CLRR .IF IDN ,$$=1 .IFF$ .IF IDN , .IFFL .ERROR ;INVALID SET/CLEAR SPEC, .ENDC .ENDC .ENDC .WORD MKW+$$O$$=0 .IF NB NEGS .IF IDN ,$$=1 .IFF. .ERROR ;INVALID NEGATE SPEC .ENDC .ENDC .WORD VALTAB+$$ .ENDM4W  .MACRO CSI$ND .WORD 0 .ENDM$W # .MACRO CSI$SV TYPE,ADDR,LEN,VALTAB. .IF NB VALTABVALTAB:$ .ENDC .IF NB TYPE .IF IDN ,K .BYTE 1 .IFFF .IF IDN , .BYTE 2 .IFFF .IF IDN , .BYTE 2 .IFF< .IF IDN00"7"8 1g ,  .BYTE 3 .IFFR .ERROR ;INVALID CONVERSION TYPE .ENDC .ENDC .ENDC .ENDC .IFFI .BYTE 1 .ENDC .IF NB LEN .BYTE LEN .IFFG .ERROR ;LENGTH MISSING .BYTE 0 .ENDC .IF NB ADDR .WORD ADDR. .IFFS .ERROR ;VALUE ADDRESS MISSING .WORD 0 .ENDC .ENDM|W  .MACRO LDR0$ ARG .IIF B,ARG,.MEXIT .NTYPE PAR$$$,ARG .IIF EQ,PAR$$$,.MEXIT MOV ARG,R0. .ENDMW  .MACRO CSI$ GBL .IF IDN ,E.GLOBL C.TYPR,C.STAT,C.CMLD,C.DEVD,C.DIRD,C.FILD,C.SWAD,C.MKW1,C.MKW2OL.GLOBL C.SIZE,C.DSDS,CS.INP,CS.OUT,C.IDVL,C.IDVA,C.IDIL,C.IDIA,C.ODVL,C.EXPS7.GLOBL CS.NMF,CS.DIF,CS.DVF,CS.WLD,CS.MOR,CS.EQU,CS.LOG  .ENDC C.TYPR =0 C.STAT =1F C.CMLD =2. C.DEVD =6C.DIRD =^O<12>C.FILD =^O<16>C.SWAD =^O<22>C.MKW1 =^O<24>C.MKW2 =^O<26>C.IDVL =^O<30>C.IDVA =^O<32>C.IDIL =^O<34>C.IDIA =^O<36>C.ODVL =^O<40>C.EXPS =^O<60>RC.SIZE =^O<54>C.DSDS =C.DEVD CS.INP =1G CS.OUT =2N CS.NMF =1$ CS.DIF =2C CS.DVF =4TCS.WLD =^O<10>CS.MOR =^O<20>CS.EQU =^O<40>CS.LOG =^O<100>, .MACRO CSI$ X .ENDM CSI$. .ENDM CSI$.LW @ .MACRO GCMLB$ MAXD,PRMPT,UBUF,LUN,PDL,SIZE=80.,?PDL1,?DFNB,?BUF1 .MCALL FDBDF$,FDAT$A,FDOP$A,NMBLK$,FDBF$A,CBYTE$. FDBDF$1 FDAT$A 2= .IF NB = FDOP$A LUN,,DFNB2 .IFFK FDOP$A 1,,DFNBL .ENDC FDBF$A ,,13% CBYTE$ ,F.RCTLD .MCALL GCMLD$ GCMLD$0 .BYTE 0 .IF LE " .BYTE GE.COM!GE.IND!GE.CLO!GE.SIZ .IFFS) .BYTE GE.COM!GE.IND!GE.CLO!GE.CON!GE.SIZR .ENDC .BLKW 4 .BYTE -1,MAXD .IF B .WORD PDL1. .IFFI .WORD PDL .ENDC .IF NB .WORD UBUF$ .IFFR .WORD BUF .ENDC$$$=.P .ASCII <15><12> .IF NB $ .ASCII /PRMPT>/ .IFFY .ASCII / >/ .ENDC.=$$$+6NDFNB: NMBLK$ CMI,CMD .WORD SIZEKG.LPDL=*<6+<5*2>> .IF B PDL1: .BLKB G.LPDL .ENDC .IF B CBUF: .BLKB SIZE+2. .ENDC .ENDM GCMLB$Z W  .MACRO GCML$ NAME,ADPR,LNPR .MCALL GCMLD$,LDR0$ GCMLD$ DEF$LN LDR0$ NAMEN .IF NB  MOV LNPR,G.PSDS(R0) .IIF B , .ERROR& .IIF NB , MOV ADPR,G.PSDS+2(R0) .ENDC .IIF B , CLR G.PSDS(R0) .GLOBL .GCML1 JSR PC,.GCML1 .ENDM GCML$rW  .MACRO RCML$ NAME .MCALL LDR0$$ LDR0$ NAMEM .GLOBL .GCML2 JSR PC,.GCML2 .ENDM RCML$pW  .MACRO CCML$ BLK. .MCALL LDR0$. LDR0$ BLK .GLOBL .GCML3 JSR PC,.GCML3 .ENDM CCML$W  .MACRO GCMLD$ GBL .IF NDF S.FDB .MCALL FDBSZ$ FDBSZ$E .ENDC .MCALL GCML$D GCML$D GBLM .MACRO GCMLD$ X .ENDM .ENDM GCMLD$RNW  .MACRO GCML$D GBL .IF IDN ,7 .GLOBL G.ERR,G.MODE,G.PSDS,G.CMLD,G.RBUF,G.DPRM,G.SIZEM0 .GLOBL GE.COM,GE.IND,GE.CLO,GE.LC,GE.CON,GE.SIZ1 .GLOBL GE.IOR,GE.OPR,GE.BIF,GE.MDE,GE.EOF,GE.RBGG .ENDC G.ERR = S.FDBG.MODE = G.ERR+1G.PSDS = G.ERR+2G.CMLD = G.ERR+6G.RBUF = G.ERR+14. G.ISIZ = 16.G.DPRM = G.ERR+G.ISIZG.SIZE = G.DPRM+6+S.FNBL GE.COM = 1 GE.IND = 2 GE.CLO = 4 GE.LC = 10 GE.CON = 20C GE.SIZ = 40G GE.IOR = -1. GE.OPR = -2X GE.BIF = -3N GE.MDE = -4 GE.EOF = -10. GE.RBG = -40.G .MACRO GCML$D X .ENDM .ENDM GCML$D,W . .MACRO PRINT$ FDB,ERR,?LBL,A,B,C,D,E,F,?LBL2 .MCALL CALL,CLOSE$,LDR0$,GLUN$S% LDR0$ FDB ;LOAD FDB ADDRESS INTO R0. TST F.BDB(R0) BEQ LBL MOV R1,-(SP)E MOV R2,-(SP)G MOV R3,-(SP)=/ MOV SP,R1 ;SAVE POINTER TO END OF SEND BUFFERM/ SUB #<8.*2>,SP ;ALLOCATE A GET LUN INFO BUFFERM MOV SP,R2 MOVB F.LUN(R0),R3 GLUN$S R3,R2N% MOV G.LUCW(R2),R3 ;SAVE CHAR. WORD 1O MOV R0,R2 ;COPY FDB ADDRESS=4 ADD #F.FNB+N.DID+6,R2 ;POINT TO END OF DIRECTORY ID$ MOV -(R2),-(R1) ; PUSH DIRECTORY ID MOV -(R2),-(R1) ; MOV -(R2),-(R1) ;/ ADD #N.FID+6-N.DID,R2 ;POINT TO END OF FILE IDL MOV -(R2),-(R1) ;PUSH FILE ID MOV -(R2),-(R1) ; MOV -(R2),-(R1) ;' CLRB -(R1) ;CLEAR LUN INFO FLAGS BYTEM@ ADD #N.FVER+2-N.FID,R2 ;POINT TO END OF FILENAME, TYPE, VERSION* MOV -(R2),-(SP) ;PUSH FILE VERSION NUMBER MOV -(R2),-(SP) ;00"?5TADATADATADATADATADATADATADATADATAPUSH FILE TYPE MOV -(R2),-(SP) ;PUSH FILENAMEW MOV -(R2),-(SP) ; MOV -(R2),-(SP) ;' MOV SP,R1 ;SET POINTER TO SEND BUFFERI CLOSE$ R0 ;CLOSE FILER BCS LBL2I: BIT #FD.REC!FD.OSP,R3 ;RECORD ORIENTED OR SPOOLED DEVICE? BNE LBL2 ;IF NE YESO MOV R0,R2 ;SAVE FDB ADDRESSR# MOV #^RPRT,R0 ;GET "PRT" IN RAD-50, CALL $DSPAT ;SEND DATA TO ...PRT OR PRT...$ MOV R0,F.ERR(R2) ;GET RETURN STATUS MOV R2,R0 ;RESTORE FDB ADDRESSLBL2: ROR R1 ;SAVE CARRY; ADD #<13.*2>,SP ;CLEAN STACK- ROL R1 ;RESTORE CARRYE MOV (SP)+,R3S MOV (SP)+,R2M MOV (SP)+,R1- .IF NB ERR- BCC LBL CALL ERR, .ENDCLBL: .ENDM PRINT$EW  .MACRO COMDF$ DEF .NLIST# .IF IDN ,8.GLOBL B.OT,B.UN,B.RC,B.RN,B.RP,B.RU,B.NA,B.UA,B.MN,B.MX.GLOBL CT.IN,CT.CN,LB.N,LB.E.GLOBL NT.IN,NT.NS.GLOBL CR.UR,CR.NR,CR.MXD.GLOBL CR.N0,CR.N1,CR.N2,CR.N3,CR.N4,CR.N5,CR.N6,CR.N9,CR.N10,CR.N11.GLOBL CR.N7,CR.N8.GLOBL CR.DI,CR.DT,CR.DA".GLOBL IA.ISM,IA.ABO,IA.DIS,IA.NFW.GLOBL CN.IN,CN.OU,CN.UT,CN.NTB.GLOBL OB.TA,OB.FS,OB.SQ,OB.BO,OB.TC,OB.RD,OB.RA,OB.ND,OB.DD,OB.BM<.GLOBL OB.TH,OB.TB,OB.TI,OB.CR,OB.LP,OB.PR,OB.PP,OB.PL,OB.MT*.GLOBL OB.DT,OB.CS,OB.CP,OB.FH,OB.MH,OB.FL .ENDC B.OT = 0> B.UN = 1O B.RC = B.OT+2 B.RN = B.RC+2 B.RP = B.RN+4 B.RU = B.RP+4 B.NA = B.RU+4 B.UA = B.NA+2 B.MN = B.UA B.MX = B.MN+10O NT.IN = 101 NT.NS = 1 CR.UR = 2 CR.NR = 3 CR.MX = 6 CR.N0 = 0. CR.N1 = 1O CR.N2 = 2T CR.N3 = 3L CR.N4 = 4O CR.N5 = 5W CR.N6 = 6N CR.N7 = 7C CR.N8 = 8. CR.N9 = 11 CR.N10 = 12O CR.N11 = 13D CR.DI = 4 CR.DT = 5 CR.DA = 6 LB.N=0O LB.E=2R CT.IN = 0 CT.CN = 1 IA.ABO = -5 IA.DIS = -7 IA.NFW = 177673 IA.ISM = 1 CN.IN = 1 CN.OU = 2 CN.UT = 4 CN.NT = 10 OB.TA = 0 OB.FS = 1 OB.SQ = 2 OB.BO = 3 OB.TC = 4 OB.RD = 5 OB.RA = 6 OB.ND = 7 OB.DD = 10S OB.BM = 11= OB.TH = 203 OB.TB = 21 OB.TI = 22 OB.CR = 23 OB.LP = 24 OB.PR = 25 OB.PP = 26 OB.PL = 27 OB.MT = 30 OB.DT = 31 OB.CS = 32 OB.CP = 33 OB.FH = 34O OB.MH = 351 OB.FL = 364 .MACRO COMDF$ A .ENDM .LIST .ENDMW  .MACRO EGCMI$ .MACRO GCMLD$ GLOB .ASECT  .=0G.MODE: .BLKW 2C GE.COM = 1. GE.IND = 2T GE.CLO = 4= GE.LC = 10 GE.CON = 20 GE.XXX = 40 GE.MUL = 100. GE.LIB = 200= GE.MCR = 400 GE.IEF = 1000 GE.RWD = 2000 GE.FOP = 4000 GE.RPR = 10000 GE.SDE = 20000O GE.SER = 40000P GE.SLB = 100000 ; G2.XXX = 1G.IMPS: .BLKB 1G.OVBC: .BLKB 1.G.FILE: .BLKW 1=G.ERR: .BLKB 1 GE.IOR = -1 GE.OPR = -2 GE.BIF = -3 GE.MDE = -4 GE.CMD = -5 GE.VRS = -6 GE.EOF = -10. GE.RBG = -40.G.CDEP: .BLKB 1LG.FUNC: .BLKB 1 G.MAXD: .BLKB 1BG.TERM: .BLKB 1 G.TIOS: .BLKB 1G.TIOP: .BLKW 1.G.PRMP: .BLKW 2 G.CMLD: .BLKW 20G.FRAG: .BLKW 2G.BUFF: .BLKW 2GG.DFPR: .BLKB 6.G.CSIB: .BLKW 1WG.PPTR: .BLKW 1 G.SWIT: .BLKW 1 G.LBMN: .BLKB 6 G.FQFN: .BLKW 1 G.DDIR: .BLKW 2 AG.DEFT: .WORD ^RCMD ; DEFAULT TYPE TO LOAD INTO DEFAULT FILENAMEB) ; BLOCK. INDIRECT WILL MODIFY THISPG.ISIZ:G .ASECT3 .=0G.SUSR: .BLKW 1 G.SDID: .BLKW 56G.SVER: .BLKW 1G.STYP: .BLKW 1.G.SNAM: .BLKW 3.G.SFID: .BLKW 3.G.SRAT: .BLKB 16.EG.SPOS: .BLKW 3IG.SBST: .BLKW 1IG.SRWP: .BLKW 3RG.PLFS:  .PSECTD .MACRO GCMLD$ X .ENDM .ENDMN .MACRO ECMLB$ FILE,LUN=1,MAXD=3,PRMP=< >,BFAD,BFSZ=80.,PDL,SWIT,?GF,?GB,?GS# .MCALL GCMLD$,CWORD$,CBYTE$,CSTRG$  .MCALL CSI$SW,CSI$SV,CSI$ND .IIF NDF FCS$$ FCS$$=1P GCMLD$ ...PC1=.T .BLKB G.ISIZ  CBYTE$ ,G.IMPS , CWORD$ ,G.MODE CBYTE$ ,G.MAXDK CBYTE$ <15>,G.DFPR CBYTE$ <12>,G.DFPR+1N CSTRG$ ,G.DFPR+2,3  CBYTE$ <-1>,G.CDEPE CBYTE$ ,G.TIOST CWORD$ <0>,G.TIOP CWORD$ <0>,G.FQFN CBYTE$ <0>,G.OVBC .IF B  ...TMP = <*G.PLFS>,...PDL: .BLKB ...TMP CWORD$ <...PDL+...TMP>,G.PPTR .IFF. .ENDC .IF B TGB: .BLKB BFSZ+2 CWORD$ ,G.BUFF+2 .IFFD CWORD$ ,G.BUFF+2  .ENDC CWO00"G8 1gRD$ ,G.BUFF+0Y .IF B I...SWI: GCMSW$ ...PC1,GS CWORD$ <...SWI>,G.SWIT .IFF  CWORD$ ,G.SWIT  .ENDC .IF NB  CWORD$ ,G.FILEP .IFFD CWORD$ ,G.FILE> .IF DF FCS$$E* .MCALL FDBDF$,FDAT$A,FDOP$A,NMBLK$,FDBF$A GF: FDBDF$ FDAT$A 2  FDOP$A LUN,,...FNAD FDBF$A ,,1 % CBYTE$ ,F.RCTLP...FNA: NMBLK$ CMI,CMD .IFFR .IF DF RMS$$C .MCALL FAB$B,RAB$B,NAM$B GF: .WORD 1,...RAB .WORD 1,...FABD ...RAB: RAB$B> R$FAB ...FABN R$RAC RB$SEQS RAB$E ...FAB: FAB$BW F$DNA ...DNA+3S F$DNS 7 F$FNA ...FNA. F$FAC FB$GET. F$LCH LUN F$NAM ...NAM F$ORG FB$SEQN F$RAT 0 F$RFM FB$VARG FAB$E ...NAM: NAM$B N$ESS 34. NAM$E...DNA: .ASCII /SY:CMI.CMD/$...FNA: .ASCII /CMI/ .BLKB 29. .IFF$ .ERRORO .ENDC .ENDC .ENDC .ENDM6 .MACRO GCMLB$ MAXD=1,PRMP=< >,UBUF,LUN,PDL,SIZE=80. .MCALL ECMLB$$ ECMLB$ ,LUN,MAXD,PRMP,UBUF,SIZE,PDL .ENDM .MACRO GCMSW$ GCMB,?VAL .MCALL CSI$SW,CSI$SV,CSI$ND CSI$SW LB,GE.SLB,,SET,,VALR CSI$SW ER,GE.SER,,SET,NEG CSI$SW DE,GE.SDE,,CLEAR,NEG CSI$NDFVAL: CSI$SV ASCII,GCMB+G.LBMN,6. CSI$NDF .ENDM .MACRO GCML$ GCMB,PRAD,PRLN .MCALL GCMLD$,LDR0$ GCMLD$ DEF$LN LDR0$ GCMB  CLRB G.FUNC(R0) .IF NB  MOV PRLN,G.PRMP(R0) .IF B O .ERROR .IFF MOV PRAD,G.PRMP+2(R0) .ENDC .IFFR CLR G.PRMP(R0), .ENDC .GLOBL $GCMLC JSR PC,$GCMLL .ENDM .MACRO RCML$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$LC LDR0$ GCMBI MOVB #1,G.FUNC(R0)B .GLOBL $GCMLA JSR PC,$GCMLG .ENDM .MACRO CCML$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$LS LDR0$ GCMBG MOVB #2,G.FUNC(R0). .GLOBL $GCMLC JSR PC,$GCMLP .ENDM .MACRO MCML$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$L. LDR0$ GCMBF MOVB #3,G.FUNC(R0), .GLOBL $GCMLF JSR PC,$GCMLR .ENDM .MACRO FCML$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$L( LDR0$ GCMB MOVB #4,G.FUNC(R0)P .GLOBL $GCMLM JSR PC,$GCML  .ENDM .MACRO LCML$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$L1 LDR0$ GCMB MOVB #5,G.FUNC(R0)P .GLOBL $GCMLM JSR PC,$GCML  .ENDM .MACRO ECML$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$L2 LDR0$ GCMB MOVB #6,G.FUNC(R0)P .GLOBL $GCMLM JSR PC,$GCML  .ENDM .MACRO DCML$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$L3 LDR0$ GCMB MOVB #7,G.FUNC(R0)P .GLOBL $GCMLM JSR PC,$GCML  .ENDM .MACRO GCMM$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$L4 LDR0$ GCMB MOV G.FILE(R0),R0 .GLOBL .MARKN JSR PC,.MARKL .ENDM .MACRO GCMP$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$L LDR0$ GCMBP MOV G.FILE(R0),R0 .GLOBL .POINT JSR PC,.POINT .ENDM, .MACRO CMSET$ GCMB,TSUB,TVFC,FQFN,TTMO,OVBC" .MCALL LDR0$,CMOV$B,CMOV$W,GCMLD$ GCMLD$ DEF$LP LDR0$ GCMBN CMOV$B TSUB,G.TIOSB CMOV$B TVFC,G.TIOP+1 CMOV$B TTMO,G.TIOP+0G CMOV$W FQFN,G.FQFN( CMOV$B OVBC,G.OVBC .ENDM+ .MACRO CMGET$ GCMB,TERM,FILE,FQFN,OVBC,ERRC" .MCALL LDR0$,CGET$B,CGET$W,GCMLD$ GCMLD$ DEF$LL LDR0$ GCMBL CGET$B G.TERM,TERMM CGET$W G.FILE,FILE  CGET$B G.ERR,ERR  CGET$W G.FQFN,FQFN  CGET$B G.OVBC,OVBC .ENDM .MACRO EGCMI$ .ENDM .ENDMVW  .MACRO .PICOD NAME=PIC$IT .PSECT NAME RO,I,LCL,REL,CON0 .ENDMVW  .MACRO .PCODE NAME=PUR$I .PSECT NAME RO,I,LCL,REL,CONV .ENDMVW  .MACRO .IDATA NAME=IMP$DF .PSECT NAME RW,D,LCL,REL,CONN .ENDMVW  .MACRO .PDATA NAME=PUR$DC .PSECT NAME RO,D,LCL,REL,CON .ENDMVW  .MACRO .ODATA NAME=IMP$DO .PSECT NAME RW,D,LCL,REL,OVRR .ENDM0W < .MACRO HLPDF$ FILLUN,TILUN,EFN,NAME,FDBIN,DSP,MODULE,FDBOUT$HFDB:: .WORD FDBIN .IF NB FDBOUT .WORD FDBOUTS .IFFE .WORD 0 .ENDC$HLUN1 == FILLUN$HLUN2 == TILUN $HEFN == EFN$HDSP:: .WORD DSPR$HMOD:: .RAD50 /MODULE/$HNAME::.ASCII /NAME/R .EVEN .ENDM HLPDF$.`W ! .MACRO OVAST$ SENSE,?LABL,?LABL2 MOV @#.NOVPT,-(SP)$ BEQ LABL  ADD #N.FAST,(SP) .IF IDN , BICB #^O200,@(SP)+M .IFF. .IF IDN , BISB #^O200,@(SP)+ .IFF.00"O5TADATADATADATADATADATADATADATADATA0 .ERROR ; PARAMETER MUST BE "ALLOW" OR "INHIBIT" .ENDC .ENDC BR LABL2ILABL:F INC (SP)+LABL2: .ENDM OVAST$W  .MACRO CSM$ SUPVR .IF IDN <(SP)+>, .WORD 007026R .IFF MOV SUPVR,-(SP) .WORD 007026: .ENDC .ENDM CSM$N W  .MACRO FEADF$,L,B .MCALL DEFIN$ .IF NB L'BL ...GBL=1  .IFFP ...GBL=0B .ENDC DEFIN$ FE$EXT,1 DEFIN$ FE$MUP,2 DEFIN$ FE$EXV,3 DEFIN$ FE$DRV,4 DEFIN$ FE$PLA,5 DEFIN$ FE$CAL,6 DEFIN$ FE$PKT,7 DEFIN$ FE$EXP,8.O DEFIN$ FE$LSI,9.B DEFIN$ FE$OFF,10. DEFIN$ FE$FDT,11. DEFIN$ FE$X25,12. DEFIN$ FE$DYM,13. DEFIN$ FE$CEX,14. DEFIN$ FE$MXT,15. DEFIN$ FE$NLG,16. DEFIN$ FE$DAS,17. DEFIN$ FE$LIB,18. DEFIN$ FE$MP,19.) DEFIN$ FE$EVT,20. DEFIN$ FE$ACN,21. DEFIN$ FE$SDW,22. DEFIN$ FE$POL,23. DEFIN$ FE$WND,24. DEFIN$ FE$DPR,25. DEFIN$ FE$IRR,26. DEFIN$ FE$GGF,27. DEFIN$ FE$RAS,28. DEFIN$ FE$AHR,29. DEFIN$ FE$RBN,30. DEFIN$ FE$SWP,31. DEFIN$ FE$STP,32. DEFIN$ FE$CRA,33. DEFIN$ FE$XCR,34. DEFIN$ FE$EIS,35. DEFIN$ FE$STM,36. DEFIN$ FE$UDS,37. DEFIN$ FE$PRO,38. DEFIN$ FE$XHR,39. DEFIN$ FE$AST,40. DEFIN$ FE$11S,41. DEFIN$ FE$CLI,42. DEFIN$ FE$TCM,43. DEFIN$ FE$PMN,44. DEFIN$ FE$WAT,45. DEFIN$ FE$RLK,46. DEFIN$ FE$SHF,47. DEFIN$ FE$CXD,49. DEFIN$ FE$XT,50.N DEFIN$ FE$ERL,51. DEFIN$ FE$PTY,52. DEFIN$ FE$DVN,53. DEFIN$ FE$LCD,54. DEFIN$ FE$NIM,55. DEFIN$ FE$CHE,56. DEFIN$ FE$LOG,57. DEFIN$ FE$NAM,58. DEFIN$ FE$FMP,59. DEFIN$ FE$DCL,60. DEFIN$ FE$DDS,61. DEFIN$ FE$ACD,62. DEFIN$ FE$NCT,63. DEFIN$ FE$LSD,64. ; Word 5 DEFIN$ FE$PC3,65.5 DEFIN$ FE$DFB,66. ; System supports deferred binding4% DEFIN$ FE$RTB,67. ; Run time binding44 DEFIN$ FE$ODB,68. ; Deferred binding is overridable5 DEFIN$ FE$XDJ,69. ; XDT is doing I/O via TPRs on KXJN) DEFIN$ FE$NSY,70. ; No local system diskE% DEFIN$ FE$NCO,71. ; No local consoleE) DEFIN$ FE$RTK,72. ; Remote task servicesG- DEFIN$ FE$RDR,73. ; Remote directory storageD+ DEFIN$ FE$RLG,74. ; Remote logical support ' DEFIN$ FE$VTL,75. ; VT logins disabledE DEFIN$ HF$UBM,-1. DEFIN$ HF$EIS,-2. DEFIN$ HF$QB,-3.6 DEFIN$ HF$DSP,-4.4 DEFIN$ HF$SWR,-5. ; Processor has a switch register) DEFIN$ HF$KXJ,-6. ; Processor type KXJ11 $ DEFIN$ HF$RMT,-7. ; Remote services DEFIN$ HF$CIS,-8. DEFIN$ HF$FPP,-16.  DEFIN$ HF$NVR,-17.  DEFIN$ HF$INV,-18.  DEFIN$ HF$CLK,-19.  DEFIN$ HF$ITF,-20.R DEFIN$ HF$PRO,-21.s DEFIN$ HF$BRG,-32.R DEFIN$ T2$WFR,1 DEFIN$ T2$WFA,2 DEFIN$ T2$SPN,3 DEFIN$ T2$SPA,4 DEFIN$ T2$STP,5 DEFIN$ T2$STA,6 DEFIN$ T2$ABO,7 DEFIN$ T2$AFF,9.D DEFIN$ T2$SIO,10. DEFIN$ T2$SEF,12. DEFIN$ T2$REX,13. DEFIN$ T2$CHK,14. DEFIN$ T2$DST,15. DEFIN$ T2$AST,16. DEFIN$ T3$GFL,17. DEFIN$ T3$SWS,18. DEFIN$ T3$CMD,19. DEFIN$ T3$MPC,20. DEFIN$ T3$NET,21. DEFIN$ T3$ROV,22. DEFIN$ T3$CAL,23. DEFIN$ T3$NSD,24. DEFIN$ T3$RST,25. DEFIN$ T3$CLI,26. DEFIN$ T3$SLV,27. DEFIN$ T3$MCR,28. DEFIN$ T3$PRV,29. DEFIN$ T3$REM,30. DEFIN$ T3$PMD,31. DEFIN$ T3$ACP,32. DEFIN$ T4$SNC,33. DEFIN$ T4$DSP,34. DEFIN$ T4$PRV,35. DEFIN$ T4$PRO,36. DEFIN$ T4$LDD,37. DEFIN$ T4$MUT,38. DEFIN$ T4$CTC,39. DEFIN$ T4$FMP,40./ DEFIN$ T4$DFB,41. ; Task has deferred binding1 .MACRO FEADF$ X,Y .ENDM FEADF$C .ENDM FEADF$ W  .MACRO LNBDF$,L,B,SYSDEFV .SAVE .ASECTC LT.SYS='B'0N LT.GRP='B'1 LT.USR='B'2T LT.TSK='B'3 LT.SES='B'4D LT.INV='B'62 LT.APP='B'53 LS.TRM='B'1F LS.PRV='B'2. LB.LOC='B'1R LB.LOG='B'2N IN.TSK='B'1 IN.SES='B'20 IN.GRP='B'4 IN.SYS='B'10.=0 O$STAT:'L' .BLKW 1O$FLAG:'L' .BLKW 1O$NODS:'L' .BLKW 1O$NODA:'L' .BLKW 1O$DEVS:'L' .BLKW 1O$DEVA:'L' .BLKW 1O$DIRS:'L' .BLKW 1O$DIRA:'L' .BLKW 1O$NAMS:'L' .BLKW 1O$NAMA:'L' .BLKW 1O$TYPS:'L' .BLKW 1O$TYPA:'L' .BLKW 1O$VERS:'L' .BLKW 1O$VERA:'L' .BLKW 1O$TRLS:'L' .BLKW 1O$TRLA:'L' .BLKW 1O$ACCS:'L' .BLKW 1O$ACCA:'L' .BLKW 1O$LTYP:'L' .BLKB 1 .BLKB 1' O$PLEN='B'.' SU$SUC ='B'1*SU$DID ='B'2 ;Directory ID alr00"W#\ 1geady foundER$NOD ='B'175550GER$DEV ='B'177100'ER$DIR ='B'177060'ER$FNM ='B'176420'ER$TYP ='B'174540'ER$VER ='B'174460'ER$ESS ='B'176640'ER$XTR ='B'174340'ER$BEQ ='B'177510'ER$TRN ='B'174550'ER$FTB ='B'176364'FS$NOD ='B'400FS$DEV ='B'200FS$DIR ='B'100FS$QUO ='B'2000W FS$NAM ='B'4 FS$TYP ='B'2 FS$VER ='B'1FS$WCH ='B'4000WFS$WDI ='B'1000L FS$WNA ='B'40' FS$WTY ='B'20A FS$WVE ='B'10$FS$NDF ='B'10000 P.LNON ='B'0 P.LNAM ='B'1 P.LDEV ='B'2 P.LNOD ='B'3 .RESTORED .MACRO LNBDF$ X,Y,Z .ENDM .ENDMW  .MACRO BOM$C STS,FLG,CS,ERR .MCALL BOM$,DIR$B .IF NDF $$$GLB= .PSECT $DPB$.,D$$$=.6 .IFTF BOM$ STS,FLG' .IFTQ .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM BOM$CW  .MACRO BOM$S STS,FLG,ERRB .MCALL MOV$,DIR$,OFF$ MOV$ FLG4 MOV$ STSB MOV (PC)+,-(SP) .BYTE 211.,3W DIR$ ,ERR .ENDM BOM$S W  .MACRO BOM$ STS,FLG .MCALL OFF$ .IF NDF $$$GLB0 .BYTE 211.,3 .WORD STS .IF NB FLG3 .WORD FLG .IFFR .WORD 0 .ENDC .ENDC .IF NDF B.OMCD .NLISTA$$$OST=0 OFF$, OFF$ B.OMCD,2 OFF$ B.OMFL,2 .LIST .ENDC .ENDM BOM$DvW  .MACRO BOMDF$ .NLIST. S.BUNK=-128. S.BFEI=0. S.BOVL=1.N S.BBIF=1. .LIST .ENDM BOMDF$ W  .MACRO TFEA$ FEAT .MCALL OFF$,FEADF$V .IF NDF $$$GLB+ .BYTE 209.,2. .WORD FEAT  .ENDC .IF NDF F.TEAF OFF$ OFF$ F.TEAF,2 .IF DF $$$GLB FEADF$ ,<=> .IFFL FEADF$E .ENDC .ENDC .ENDM TFEA$W  .MACRO TFEA$C FEAT,CS,ERR .MCALL TFEA$,DIR$ .IF NDF $$$GLBO .PSECT $DPB$$$$$=.M .IFTF TFEA$ FEAT .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMW  .MACRO TFEA$S FEAT,ERR0 .MCALL MOV$,DIR$B MOV$ FEAT MOV (PC)+,-(SP) .BYTE 209.,2. DIR$ ,ERR .ENDMW  .MACRO RRST$ WDB$ .MCALL OFF$ .IF NDF $$$GLBA .BYTE 213.,2F .WORD WDB .ENDC .IF NDF R.RSBA OFF$  OFF$ R.RSBA,2 .ENDC .ENDM RRST$W  .MACRO RRST$C WDB,CS,ERR .MCALL RRST$,DIR$ .IF NDF $$$GLBL .PSECT $DPB$$$$$=.$ .IFTF RRST$ WDB .IFT= .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RRST$C W  .MACRO RRST$S WDB,ERR .MCALL DIR$,MOV$A MOV$ WDBC MOV (PC)+,-(SP) .BYTE 213.,2( DIR$ ,ERR .ENDM RRST$S DIR$ ,ERR .ENDMW  .MACRO RRST$ WDB$ .MCALL OFF$ .IF NDF $$$GLBA .BYTE 213.,2F .WORD WDB .ENDC .IF NDF R.RSBA OFF$  OFF$ R.RSBA,2 .ENDC .ENDM RRST$W  .MACRO RRST$C WDB,CS,ERR .<0W  Z&Ts(W3f4fnF F VN@r + (L .J %L 2&L (L PdL (L L :L `L XL iL tL qL |L (J ,L 8L 8L VNJ SJ i^L v^L wJ yJ \}J J .J 5J qJ J e^L L L xsL pJ L(LTLL,`T(tL0 }$0$Cpp_MjfMj%L+})WJ)WJ))XJ)XJ)ZJ)ZJ, J,!J,R"J,(J,CMJ,NJ,SJ,yJ,\}J-DJ-EJ.J.J.J.J2J2.J2pJ2J2J2J2ًJ3^sJ3sJ:K_MfM{y2+d6&Ld&Ld(Ll(JlCMJlNJlSJl\}JtpJ!!'!%6!}F[!}<q!q!yj+"Y J+"J+"zJ+"K"J+"'J+"(J+"YJ+"J+"J+"ZJ+"2J #n~#}#Oq#z#""J00#_5TADATADATADATADATADATADATADATADATA#wJ# zJ#J#J#.J#J#yJ#yJ#N&J#yJ#v~J%L%L%L%r!L%#L% #L%#L%LL%ZL%kfL% qL%tL%wL%xL%L%CL%L<&kL<&DL<&%L<&L<&zL<&(L<&w*L<&:L<&H;L<&SL<&`L<&eL<&fL<&fL<&pL<&pL<&KqL<&%tL<&iwL<&lyL<&9L<&LI&}c&Jc&Jc&Jc&L Jc&Jc&Jc&Jc&Jc&Jc&Jc&;Jc&Jc&Jc&Jc&Jc&Jc&~Jc&Jc& Jc&"Jc&"Jc&#Jc&#Jc&#Jc&4&Jc&'Jc&,Jc&";Jc&|KJc&jLJc&_MJc&MJc&NJc&SJc&TJc&UJc&WJc&XJc& XJc&XJc&gYJc&ZJc&b^Jc&^Jc&dJc&eJc&eJc&fJc&dfJc&fJc&9gJc&pJc&pJc&2qJc&grJc&krJc&sJc&sJc&wwJc&xJc&yJc&yJc&hzJc&}Jc&Jc&Jc&Jc&Jc&Jc&Jc&RJc& Jc&#Jc&Jp&p&L&ZL&]fL&tL&tL&CyL|' L'd'e'L'IRL' qL'ąL'L((J(zJ(WJ(&XJ(YJ(mJ(J(ZJ(@J(iJ(J(J(5J(yL( L(QL\)zL\)L\) L\)KL)L))[ML) L)PL),L)nEL)sEL)EL)_GL)GL)2HL)4L)ZL)p )'L)TyL)L)0J)%L)'L)^L)PsL) L)L)%L)LL)WL)WL)L)ZL)8L)x)` )VJ)J)(J)VNJ)SJ)CTJ)VdJ)[dJ)jdJ)fJ)fJ)gJ)pJ)nrJ)sJ)wJ)yJ)\}J)pL) L) L)w L)pL)KqL)L)%)5)L)t L)L)L)BxL)OzJ)PzJ)L)!L)dL)VgL)[}L)p )))XL)pL)L)Lt*[bt*[bt*[bt*G[bt*I"[bt*3[bt*N[bt*r[bt*s[bt*s[bt*s[bt*z[bt*[bt*[bt*b[bt*։[b*4[b*[b*[b*[b* [b*8&[b*@,[b* X[b*@w[b*w[bT,KJT,JT,JT,J,,1,f,VN",Q,:d~,Oq`,u~,.,J-.Q#0J#0J#0J#0J#09J#0DJ#0LJ#0MJ#0vJ#0J#0)J#04J#0J#0J#0TJ#0UJ#0J#0J#0xJ#08J#08J#08J#08J#08J#08J#08J#08J#0:J#0k;J#0;J#0;J$0!J$0R"J$0(J$0SJ$0sJ,0J,0J,0σJ,02J,05J,0qJ,0J-0J-01J00pJ00qJ00sJ00sJ00sJ20,J20,J20,-J20.J20.J408J408J408J408J409J40Q:J40W:J40;;J40:<J40wJ40uwJ40wJ40wJ40xJ40xJ40CyJ40NyJ40RyJ40yJ40yJ40yJ40yJ401zJ40w[b:Kw[b:iw[b:ow[b:w[b:w[b:x[b:x[b:x[b:By[b:Fy[b:Wy[b:y[b:y[b:y[b:y[b:az[b:z[b:}[b:[b:[b:[b:[b:+[b:|[b:A[b:i[b:y[b:[b:[b:$[b:C[b:d[b:h[b:[b:[b:[b:[b:[b:ۑ[b:[b:B[b:D[b:[b:[b:2[b:[b:1[b:$;K[b;@j[b;v[b;L[b;[b@;(T;[bT;8[bT;[bT;[bT;[bT;[bT;7[bT;![bT;;"[bT;I"[bT;`[bT;d[bT;4f[bT;$q[bT;s[bT;w[bT;Dy[bT; z[bT;z[bT;*}[bT;[bT;[bT;3[bT;[bT;[blK[MJlK_MJKpNfJNJ{[b?{0[b?{p[b?{[b?{[b?{p[b?{N[b?{@[b@{0[b@{N[b@{N[bA{0[bA{[bA{[bB{N[bC{[bD{0[bE{[bE{[bG{[b}[b}[b}[b}4[b}y[b}[b} [b}H [b} [b} [b}k[b}[b}>[b}[b}[b}[b}[b}[b}[b}[b}[b}[b}![b}I"[b}8&[b}]([b}([b}2[b}2[b}T3[b}3[b}5[b}8[b}O:[b}:[b}D;[b}K[b}M[b}vN[b}xQ[b}Q[b}R[b}W[b}KX[b}:Y[b}`Y[b}Z[b}Z[b}`[b}:d[b}f[b}f[b}(g[b}i[b}j[b}p[b}Uq[b}q[b}s[b}Hw[b}Jw[b}w[b}w[b}x[b}x[b}x[b}x[b}y[b}y[b}z[b}8}[b}V}[b}]}[b}c}[b}~[b}[b}[b}[b}0[b}փ[b}׃[b}؃[b}ك[b}ڃ[b}ۃ[b}܃[b}݃[b}ރ[b}߃[b}|[b},[b}[b}[b}[b}@ ~L [b ~ [b ~G[b ~I"[b ~Y[b ~p[b ~ q[b ~)q[b ~[q[b ~br[b ~ur[b ~r[b ~r[b ~s[b ~s[b ~s[b ~s[b ~z[b ~[b ~5[b ~[b ~[b ~$[b ~:[b ~[b ~ۑ[b ~{[b ~^[b_M,fM,a |[ba |[bbS[bd}[bk |[bl8 [bl [bl [bl [bl [bl+ [bl[bl!JlR"Jl(JlCMJlNJlSJlQ\[bll[bll[bll[blsJlsJlyJl\}Jl[bl[bl[bl[bl[bl[bl[bs[buVY[buy[buy[buy[buy[buy[bvӁ[bv[bv[bv[bv[bv[bv[bv[bv[bv[bv[bv[bv[bJ6JL J J J`qJwJ7xJAyJNyJyJyJJJCJCJCJCJC,JCQJCSJC\XJC|ZJC fJCfJCUqJCrJCsJCxJCkzJkJkJkJk'JkKJkTJkfJkfJkxJ'%}LdJ.JSSvS|@p w[b Bx[b |[bi`` 8Tō,ōwȍ8 ȍȍ`ʍ8TˍsˍH}~`h`hÐHXԒJԒJԒJԒ7!JԒ#JԒxQJԒWJԒWJԒqJԒLqJԒ[qJԒVsJԒ;xJԒJԒ}JԒJԒRJ:v.J. J.8J.KJ. LJ.^J.qJ.BxJ.yJ.yJ4wJ#[b#֯[b#[b#[b-[b-'[b-([b-?[b-[b-[[b-[b5|[b5[b5[b5^[b5f[b5ٱ[b5$[b55[b5Q[b5 5!Bj<t!;P2;VNn`=@=4=K`rD&K4'6֯}F>deJ47 4}4vdx8 8 XF>X:&@9@p:hpKsu9 \q Pw x z ?S@SAS} ,l;,z;4u~D 8r? &KlE<61Kj1oj1pF1qF1rF1sF1tF1uF1vF1wF4}j6L j6xQj9`j=Krj?yj?jBjC\}jCj\D&\^Whp!h!h&h'}sI:2r/KrJrPr:?ձWCֱfaD oE 4v0 r0# r0r2XED&`;G`2&D &D (D faD e;G*:Ѳ:Hܲ""ܲ#&ܲ#&ܲ`ܲ)dVܲGdVܲ@w$aK3a[M3aVNnaZb2bG3c2 74cIqcd?!4d)&=dd;5@de&74e&74eM6eM6eM6eM6eZXe$3e?3f4vft:Xfy::&gg<gggggg,gCgRggggg}:i iHiWlmlE<mo<p# Iph<p &>pJ,?LpK,?pZ piw=dpvwI:pw ,pep?Lev?$ep!e$DfT?afZ kf`;@kfKqA<f; AhfvBDf]\g \ghydkz[b q}z q_M2qWB7q7qqB7qs{IqCVqMC\qTsrr%:s@84sUs%s"&JtL tyD $t_3ukM@3u^3u_3uIq44u%!4u;;R4uH;5uZp5up5u%6u" \6ut:7u`"9uX|>u0>uz~>uF>u#>uu'r>uU(>uT[>uN`>uIq>uTq$>u!t>uAy\>u>u>u%?ud@u# @u`$BuW!Buq!BBu"BuCuzLDusEudGuv vqZvXuEvP9wKrw^rwdw7xsTx+yZAyNy SyTy`y%y%2y]ydy@D_M,EKqF>!0! &b!p:>Ld `}`(}BS|@h~FDHG`YGwl}G6d (_HaH9}w * 8B pB  0 B o`$s}2d?!:fNW 42l'4D  D"0NW 42n X4D  D"0W 4ӭJz'4ӭDs.@ft:@  D"0d;h  D"Jĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ z ds.| DEe    *1  ˕03 "   ˔Ӕ ʥ7ft: W  ZW D`@o@d?!@aVN@  D"04'h  D"8w *eB 8  oaVN"`0d?!W  ӵR0!# ӵD  D"0eMheMheMheMh  D" W  R!  D  D"0le&he&hc2 h\s2 h.  D"p *) l0, *) $ )*)0,40,6 W  -Z#t! -De?@o@ft:@s}@  D"0H4h  D"Lw *f f ! fP ŀ)Bos}ft::e?W  mz &@ mD@`@:@}s@ձS@}@@@e;@h&@ձ@h'@ X@zձW@X@e@,l@,z@}@4@ 8r@֯}@'@B(>D  D"0yuhW  Ӎbu'x ӍD @q:@w@i@o@  D"04@h  D"8w ! & &  e o w$i0q:BW  Z&`; Ds@; @o@  D"0Xhfy:h   D"w DB C DBe ?De(e$2e (%[]%<> o s@s| 1 > ; vW >ƭZ(#>ƭD  D"0yyphyyW 4R,h4Dph@d;@aVN@  D"0|g}h  D"* 5)%Eefffff f% EDD%][%><  1 aVNXd;^phW 4J,l4Dg}@o@  D"0 ,lh  D"w  wo g}W 4J,z4Dg}@o@  D"0,zh  D" w w00#\ 1go g}W  JRK Dq:@i@  D"0mlEh  D" Mwiq:W  :SKq D  D"0&moh  D"*  DP5R RRR W  RT DmlE@o@aVN@  D"0*lEh  D".w *eB 8  oaVN*mlE W 4mJ:dh4mDs@d;@  D"0phh  D"e( 1  `((   >: 5s<w $o|d;`| w1  %,,:4  ph`W ?WJdv?WD&s@s@  D"0p &h  D"ef  Ee2 UfD Ԕ %:ԕ: f& sV|f&f& & Ε lle  NsW  ΥBep ΥD @  D"08pJ,h  D"< 8   **$ W  ΥJev ΥD @  D"00pK,hskh&  D"4 8  ** W  ΥjDfT ΥD @pZ@o@r,}@f@  D"0D 8rh.:h  D"Hw ) * w46l0 o pZ,r,}0fW  ΥZkf`; ΥD @d;@m @  D"0pE 5  e0Ґ W  :vXu D  D"0oh  D" &ff W  J D`@f@  D"0"2Xh  D"& 8 !Հ)w*w`$fW  rKq DeZ@o@rS@aVN@ft:@  D"0,ձSh Xh֯}h  D"0w ww ww w8o aVNeZoaVN rS$o(aVN.ft:W  rh~ Ds@xk@s@4}@f@  D"0Zwh2wh"q:h   D"^0+1e  %p*w f( f)f sxk"s.f\4}W  RH Dw@w@o@  D"0`;h  D"w wwoww|W  :Y D  D"0wth  D",*1W  j} DrC@w@r@aK@o@s2 @  D"0Te;h  D"Xw $0,0w 46  )0406 0 *&o rCr s2 .aK4wW  Z(_ Ds@s@  D"0Vxkhxkhih>  D"Z8Ae f"( UCɗ+e$&% 8sDsW  Ra Dq:@i@o@  D"0Ѳ:h  D""w *D  woi q:W 4εj:dvw4εDs@s@o@aVN@\D@  D"0pvwh vwh  D"w *D YTfe<ӕ_ S :ӕ: & "& Ε4'o0s|sx| *'**UqqC ӥ:  Ce   *ssP\DhaVNW  z:dw D&p &@s@[;@piw@pvw@pw@o@aVN@  D"0}sh p# h*s}h  D"eB  8 $&w *<S1   K U U@  f&"  aVN&oR[;fpwxp &r|')'* *%0*ND   EU   ,sssJaVNbpvwhpiwnpwW ?WJ#L?WDp &@s@  D"00eh  D"4&ff  'p &"sW  ej &( eDs@  D"0yyph &hByy y y((  BBFF y W >b=>D&p &@s@@$9pw@00#\ 1g@=@ Cx0,=h Cx eeȵe ~  DE  ȵ2e &e  %'@^e5 *@=Xp &`$9pwbs|5@558Beeȵee& q1B$8e q1 B  .W  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 qH'ąH |H)H#)H4)H%H PdH :H )_GH))HWH)TyH$'IRH&{ZHzWzH@'H)H0)GH%wH@%xH [#H%CH )2HH4) H,)BxH) H-<&%tH<&9H `H$z)[MH &H %HB)pH<&pH<&pHWwH (H 2&H(d(HWwH i^HV v^HPt!H)w H.z)H)PH8)KqH'HF xsH[YHtw(@w BwDwFwHw&-H 6lF8sW 4=J@4=D X@K@  D"0'h  D" 8eB   XK0W 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"^wwwwwww22XlE K'ձW:syh^`;hԱ(hh`rhBiwh2 hb:hjvwh6hp!hyh*:_hwh:2Xh w:6  66,6^% N a W vz(jLvD:(}@:`@@fa@`@:@}s@GP}@\@Ѳ:@:Z@ձS@z:@}@@@e;B F{H$9KH}xH$9;H%{!H:GH H}D;H:qH:Hz:qH,wfH:"qH:&qH:&H:$qH:.qH:(qH$9YH}H&$9 H$9YH:WHP:a H$9YHz,w{H ~sH:TqH:RH$9H}HU$9ZZH:H :H:t H:qH:H8:H$9CfH$9DfHz ~H:H:H ~sH$9Z&H$9bH$9`&H ~H$9kH$9{H<H$9~ZH,wH:q!H $9ZHz$9ZH}`H`:-HA{0H $9ZH:x HvH;LH}4H ~sH:H:H wvH:!H:-Hz:}H`}Hj$9[H$9'H$93H$9[H$9H$9H,wWH:H$91H$93gH:H:-H ~$H@z:H5^HlH5fH :#"HuVYH}yHR}H;E{H?{pH$9rH$9&H}Hi:brH:crHz$9fHt*bH@:krH $9H:vrH@t*H5ٱH w+H:rH}pHk |H:rH :rH :rH:rH0z:2H:rH8:rH} HD$9BH5$HlH55H}8}H%$9g'H$9n'H<_Ht*zH$9sH$9Hz$9H?{pH ~:H:[KHkZH}qHV?{Ht*GH$9'H$9H$9H$9H$9 H}V}H9}H H>z:sH :sHx}]}HA}UqH6: sH:#H:sH }c}H@*@wH5QHw:dH:KH?{@H:KH$9Hz}H:} HS:3H@:{3H:|sH }H<:sH`:sH*wH }H=:sH:sH:sH:sH0:sH z ~HT;8H:sH:KHlH $9CH:KHH}!H :H$9VH$9XH ~ۑH:sHP$9|H:4Hz:tHT;wH$9.H:-tH`:,dH:1H}|H :74HwHwH-[H}`YH :vH$9H$9H:n'Hl+ H#$98H$9Hz:owHvӁH:H}HT:wHP:H:wHt*H }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" 00#\ 1g, 0o4[F[KrJ[}N 8W >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$[`ws KW >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 TW >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 bW >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 KrW >j6a>D[`@ Kr4BɪKrhɪK'h 4lwh4K0 KrF5  5 2  UE   pE U 5@*& E& & f&ËDef Ë )̋U<[`W tXz9axtXD @[Kr@[}@[@[@o@[`@ Kr4ɪ3qhɪ2qhɪ#qhZɪ;rhɪJrhɪKrh 4Twh4P t t tK0 Kr1 5  B5BUW/ - ',  wE5  [}<[\[}\|  wE5 E  W5  ,E @[ EWX 52 / & 4 &9 &9U3uE uUw [|5   uE uU5`AU & E& & E& De&fr[`` $̋"5 & & & & De&fH ̋E U6[`T)aw00#5TADATADATADATADATADATADATADATADATA 6  w  e 1 w 0" , 0o4[F[KrJ[}N >W tXz9atXDs@[@[`@ Kr4ɪ3qhɪ2qhɪJrhɪKrh 4Bwh4 K0 Kr5  <5<UW) ' !  wE5   8[L|wE5 E  W5  ,E 0[ EWO ,) &  4 &9U3uE uUw5  [|  uE uU5`AU & E& & E& De&f $̋"5`[`N & & & & De&fH ̋E U$[`ws KW tXj9atXD[`@ Kr4>ɪ3qhɪKrh 4wh4K0 KrB5  5U   E5@? & E& & E& De&f $̋"5 & & & & De&fH2[`r[`| ̋U bW Tz3ax}TD @[Kr@[}@[@[@o@[`@ Kr4ɪ;rhɪJrhɪKrhB 4wh4P t t tK0 Kr1 5  .5.UW  ,   wE5 E [}<[\[}4|  WLJ5  ,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 W Tz3aTDs@[@[`@ Kr4ɪJrhɪKrh 4wh4 K0 Kr5  (5(UW      wE5 E  8[$|W͇5  ,E [ E U &W)& #  4 &9U3uE uU.5`.[b|U & E& & f&ËDef Ë )̋E U*[`ws KjW Tb3a~TD[`@ Kr4>ɪKrh 4pwh4K0 KrB5  5U   tE U *5@*& E& & f&ËDef Ë )̋U@[`fW  b& Ds@s@; @o@  D"0Xhfy:h   D"w OB C DBe ?De(e$2e (%[]%<> o s@s2| 1 >ߋ J ; (sFW  Υj7qs ΥDs@ @xk@s@i@  D"0rChwh*  D" 8   *  4 6 BeeD&& \Е- Е-' Vw D  &pWtЕ. ce  Е:   B%  & G`ЕJЕAЕNЕFЕEЕBЕMЕi>:<XݪKAЕRЕAЕPЕRЕMЕAЕYЕJЕUЕNЕJЕUЕLЕAЕUЕGЕSЕEЕPЕOЕCЕTЕNЕOЕVЕDlЕEЕCW z.D:`@:Z@:@Aׁ  `)9H%EKQNdi%vhlAP AЕ Bf  & e6& e/& e*AHŀ ȕ Е Е Е & e & <:: ,: 6<( x:`j teЕ A %& eA Е A EA EЕ A A   $Е. : :_x *: 2[(}Ha}T@Qf[(}~[(}0 AЕ;    :ZW t0: t0D ,@,hC,h 0e   W XzNy XDNHQHHNBxH BxHQHN:dHBxHHN H  :\}hNt!ht!hN\}h\}ht!hW t02xxt0D "$CTh & @ @W B*`Dܲ`@ ke(0sh ke( Sw ܲ`W XBWXDܲ#@ܲGd@ <Wh @ Av wܲGd>ܲ#W B3DܲGd@ ke(03h ke( C &qFre @AE2cD! D2rܲGd|8 HW J4fDܲ#@ܲGd@ ke(0"4fh ke(& & CC w ܲGd$ܲ#rW t0: t0D  @,hC,h eW JF Dܲ#@ܲGd@ ke(0.F h ke(2> qqqQѕwܲGd0ܲ#W J;VNDܲ#@ܲGd@ ke(0F VNh ke( RRRwܲGdܲ#W rr +Dܲ#@ ke(0D+h!!hh2+h xQh}h$r +h ke(H97; uwy{D& fW#v&wFܲ#W Rbs;D00#5TADATADATADATADATADATADATADATADATA V9phBYh@;(hv8h:h Z L@W @@@ 8@ A Be   @  @ A@@K@P @W ByXDܲ`@ ke(0,h ke( w ܲ`W HJTHDܲ#@ܲGd@ ke(0 `Th ke($ & w ܲGd"ܲ#W JDܲ#@ܲGd@ ke(0{h ke( _w ܲGdܲ#W  J֯L Dܲ#@ܲGd@ ke(0q!yh ke( ew ܲGdܲ#W J֯Dܲ#@ܲGd@ ke(0q!h ke( aw ܲGdܲ#2W  ~ Q Q Q IwܲGd<ܲ#W XJ_MXDܲ#@ܲGd@ L_MhfMh P   x qqfII1 qq  wܲGdNܲ#W XJ_MXDܲ#@ܲGd@ 6_MhfMh :  Q Q QwܲGd8ܲ#W XBwXDܲ#@ܲGd@00#\ 1g (wh , Qѕf IwܲGd*ܲ#W tXB,tXDܲ#@ܲGd@ (,h , Qѕf IwܲGd*ܲ#W XJ q_MXDܲ#@ܲGd@ L q_Mh qfMh P   x qqfII1 qq  wܲGdNܲ#W Ju~Dܲ#@ܲGd@ ke(0 zQDh ke($&  RRRI! wܲGd"ܲ#2W R\MD,0z@ܲGd@)` @@ |S]h  Ε 4e   e  f &f& %&ܲGd.,0z2)` @l,0zp)` |s"W XR5dXDܲ""@ܲ#@ܲGd@ f &hfrh  e I I & # I  a(Ia(I BCD"C" wܲGd|ܲ# | ܲ""W Z PwDs@ ( Pwh xh h zh \qh ,& & & & Aff& sW BD Pw@4u~@ ,ysh 0 fB A  & & fw4u~. PwW B,H:DݪK@d;@ :4u~h >W &=e e@ B  $ݪK6d;W RD z@*@ \q@4u~@ <}h @& %NBwA & fww z4u~2 \q>*W RsD,0z@ܲ#@ܲGd@)%@ Zgh ^&  & e mw&f&fe  s&ܲGd,0z)%,ܲ#B,0zF)%W BձDܲGd@ ke(0pIqh ke(t   _(  ?f'& f' ?E@@ a B 0e  ܲGdW RձDs@ܲGd@ ke(04Kq hKq^h ke(8KM & & &&& ܲGd4sW BsrDܲGd@ ke(0.srh ke(2 e@AB ܲGdW J#DܲGd@ܲ@w@ ke(0Yqh ke(  wܲGdܲ@wW XRUs%XDܲ#@ܲGd@ ke(0(cs}hUs%h ke(,Q &wܲGd*ܲ#W BձzDܲ`@ ke(0[qMh ke( /w ܲ`W zxDlOpH)H)H)H)xH)p H)%H[ H)` H)p H)5H  W XJx+XDܲ""@ܲ#@ܲGd@ vx+h z W#0A %+B%&AB`B`D&  B~> ee Jb"b "╫w HܲGdpܲ#xܲ""W J XDܲ#@ܲGd@ ke(0&wh ke(* GwܲGd(ܲ#W RyDܲ#@ܲGd@C,@ ke(0$yh ke((  w00#5TADATADATADATADATADATADATADATADATAܲGdC,&ܲ#W  Ry Ds@ܲ#@ ke(0@Iqh0y}h ke(D B (W/ D  7 f& }w(sBܲ#W Jy%Dܲ#@ܲGd@ ke(02y%h ke(6 @  EwܲGd4ܲ#W XZ #XDܲ#@ܲGd@ Zg(0y@h.yhX:` Zg( e2w 7 Nw&f&fCDEe  > ܲGd X:`0ܲ#:ܲGd>X:`BX:`HNPܲ# dX:`(|   cs X:` W B zDܲGd@ܲ@w@ 2sh 6 X eETETwܲGd4ܲ@wW B 4fDܲ#@ܲGd@ z4fh  -w ܲGdܲ#VW 뀻bjM뀻Dܲ""@ܲ#@$99@ `h&`hy`h y`h & @EA:% NP& @5A E& B _"E@  D Q 5E,|w+w E  ܲ#ܲ#$99(ܲ""|W :xDܲ#@  ÐHXh & 1w ܲ#vW 2*D *h )vW <:ܲ""<D ke(0ܲ""h ke(& W Jܲ#Ds@ ke(0ܲ#hܲ#h ke(sW Jܲ`Dܲ#@ܲGd@ ke(0ܲ`h ke( &w ܲGdܲ#W Jܲ)dDܲ""@ ke(0Lܲ)dhܲGdh ke(PC & ` `Ba#   L Lܲ""W Bܲ@wDܲ#@ ke(0(ܲ@wh ke(,CC    &w*ܲ#^W ~R~Dܲ#@ܲGd@ .Qh,1hHwh ` e BBCC w qqq0 fqC Q IܲGd4ܲ#VܲGd4|w C Q Qqwܲ#ܲGd2ܲ#tW r}Ds@ܲ#@ܲGd@L @$9΅@w@C,@ 0h}h  j  2@  e ' w  /*jܲGd"C,8w>L lܲ#ps |<   e$9΅W XJXDs@ܲGd@ ke(0,Cph ke(0 & & &&&ܲGd,sW J%Dܲ#@ܲGd@C,@ %h "  w ܲGdC, ܲ#W z}Ds@N@N]@ܲ#@ܲGd@ X@NBx@N{8@N{@$9΅@C,@ }h    *e  f w  NܲGdC,N X$NBxDN{PN]ZN{8^fhܲ#lsrs~$9΅ | e W XR1yXDN@ݩ%@ XN]hN{8hN{h 00#\ 1g\&&&f&f   ` % s*N.ݩ%$W J` Ds@# z@$9@ s&   (w  *ܲGdC,$(*ܲ#.s4N8ݩ%W J[!}Dܲ#@ܲGd@C,@ 2[!}h 6  2 w ܲGdC,4ܲ#W B#yDݩ%@@ RL h V&f&f   /<    sݩ%W tbf]tDs@G> @$9s@GVN@:$@:4F@ Rh &)_& & &  & && && Ε 61& 1)ȋ& & & ,s.G> 2GVN6:$B$9sZG> nG> T|& & & & & & Ε 1 &  a@ G> GVN:4F6G> W J q}Dܲ#@ܲGd@C,@ 2 q}h 6  2 w ܲGdC,4ܲ#W Jr%Dܲ#@ܲGd@C,@ r%h   w ܲGdC,ܲ#W tBs@8tDܲ#@ܲGd@ s@8h   eCBBaIBBJbCBB ɒɐBܲGd| & &  wܲ#W R9wKDܲ#@E4d@ܲGd@C,@ (9wKh ,  wܲGdC, E4d*ܲ#W tBrwdtDܲ#@ܲGd@ drwdh h e ICBBaI    B wܲGdfܲ#W XJ u~XDܲ#@ܲGd@ &,u~hwu~h * =w =w ܲGdܲ# ܲGd(ܲ#zW rrwDs@ܲ#@ܲGd@L @$9΅@w@C,@ rwhrwh  p`  2@  e *  w  *pܲGd"C,8w>L rܲ#vs&|/<   e$9΅W rAyDs@ܲ#@ܲGd@L @$9΅@w@C,@ AyhAyh       2@  e 9ܲGd"C,zw|2       w   /<  L Vܲ#Zs|$9΅ e<W jSyD5!@5 @ @@@  Xhݩ%hwh<  ,#b3!  b3!a & > >265 : FX |>W 00#5TADATADATADATADATADATADATADATADATAXzTy`XDNHQHHNBxH BxHQHN:dHBxHH N H  :\}h>Nt!h>t!hN\}h\}ht!h   >>> >|tld2W Jy%Dܲ#@ܲGd@C,@ y%h    w ܲGdC,ܲ#W By]Dܲ""@ܲ#@ Xy]h \@$A E& & B ?E@  D Q w% Nܲ#Xܲ""W BydDܲ#@ܲGd@ ydh  w ܲGdܲ#W Jy@Dܲ#@ܲGd@C,@ y@h "  w ܲGdC, ܲ#W XBT,XDܲ#@ܲGd@ '%h  w ܲGdܲ#zW X:LdXDܲ`@ Ldh  w ܲ`W ZSDܲ#@ܲGd@C,@ TShSvhSh  XKM&     2 &wܲGd&C,Vܲ#W XB|@XDܲ#@ܲGd@ @|@h D &  eq B C1GwܲGdBܲ#W trtDs@ܲ#@ܲGd@L @$9΅@w@C,@ hh  x  2@  e .  w *xܲGd"C,8w>L zܲ#~s.| /<  e$$9΅W tb!tD)@4@@W@<&e@)p@ 4@h 8w &&E  AHW )p)p<&e)"4&<&e().)p2)p$W Xz!p:XD$9 @)Bx@)p@W@t<@ @)@)Ps@:@ @h Dw   . ʥ:W:t<) )Bx$ *)p<$9 >)PsW tz! &tD)@)Bx@$9~Z@)p@W@<&e@ @)@)Ps@t @)p@:@ 4h w    j2-  (@ep@ D  e  ` e RW $9~Z")Ps.:4<&e6):t <)B)BxJ)pP)pT b:F| 00#\ 1g    R#R- )Bx:& ,)pW B @~D  D"06ݪKhih  D":&  m  f A N  %2W |R:=|RD Cx0=h Cxf&f ` *  !נ נ  נננ"D נaנz E ѐEp(p| נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$tנ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:Dl  Dנ"  0W |RB@=|RDd@ Cx0@=h Cxf&f E^`  UQ  UQ ËUI U `e |ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRtpBC5D  KR΋KBAE:D0CĊ f eB  Dҁ CSĊ  |dȀWC E Cs Ε f)& 6 l(*  E 'W " =lN  W :+W = 1 #W ,W / %W %W *Հ W <W [W >W ] v(* 6 eW XB%PsXDs@ K0 ""h K$'1sW N@B:h;N@D  D"0@d;hm h  D"D&   `@ ` B   & A @    W ΚXb9}ΚXDi(Pi Zi di .tՕ: @e e0e0UiW Xz ]XD1o@ sJhab1vh 1ph1sh1uh 1wh1qh"1th1rhc0Z aX cXb $*J c c c c c c c$ c*c^   fwvAAU Xs s00#5TADATADATADATADATADATADATADATADATAsss$s *s 0s@a VaZ1oW XB XD `E4dhEdhHʫh~h d% & ^UU U U UUUN a  W 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`ݪMW ΚXBתZΚXD Zg`0תZhabh$ Zg`4JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECW X:i XD Zg(06i h Zg(:&f!  E D  E E C B Ί AW XzXDfH`fHH fHH p&H fHjzHxfHfHKH fH " 5H fH@ W NBi(ND@ Zg(0ni(h Zg(r AUUUU    T T T T ee(e(e(e(T $)T T TU U U U  ~W 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[(}nW t02#}t0D yh &3W <0z[ S<0D:}s@Ѳ:@s@l@:br@@:s@ @o@T; z@ 8r@g@z'@g<@g@g@g@$9!@:@gC@gR@g@g@g@g@w@:@:NK@ Zg(0`۩ ShghVg,hJ Zg(w T&:)uE@ %:a `u>MN[[e D(e:(C(  5oNltT; z|@5*6 T @2ȋ eT5 N ) @   J 5 w DC u $g2gCXgbgCtgw  E  @e:(w5 CD>%  6  p + k5e d .gJgXgfgt^ [U5@ D( G uɥ;5<5-Ԩ  5@ u $9!*gR.g:gvg5 Fɥ@5ub , 5w E 5 @  @8jMAB *g:g<V`NKj$9!lAe @&PPP@C&5A  88Ue  28:sDѲ:HT; zP$9!\:hѲ:l:brxѲ:|8 "@0 *_%`AB w@ 8 T; z( N$9!Z$9!ngW <0z[ @S<0D:s00#\ 1g@$9W@@@`@}s@Ѳ:@s@c&_M@@9x@h'@T;w@zu@ (@X@o@Ա2&@ 8r@$9pw@'@=@@=@=@$9!@g@:@g,@jw@ Zg(0Llh ghg<hghgChgRhghngh2gh Zg(u j  5 , ɥ/b J  1ECe, e   g,Ng|' @%7U @ E $  , D(@e , 5@@e,C& n: K s@w@&p > :%%ȕp*f  D9x9x*@:=Hc&_MT$9pwVs\T;w^stux=tȕp* eBEETH EBe Z5    O 2e(5 @&B &@=DgT'Zgdz`B 2=2 D(:(@$8 &SY e2edE_$8$8$8lw $9!D}sJwRoVsZ (`Xh}s~Ա2&du46 D A(! ! (*A8 @&s eB<B7 pB!# Zp *pB   dw ɥ ɥ   ɥ ɥ ɥ@ɥ/ h' $9W" 8r4:W <0z[ AS<0D:s@$9p@}s@Ѳ:@s@d@ 8r@'@:@w@ Zg(0*ghghZghghB Zg(5 A&)f  u BA U` B`CAB5 b| Rusx$9p|ABAB6C4 Е/ЕLЕBЕ:Ae,P   S  ɥ ɥ    d ɥ ɥ ɥ@ɥ/ W |Xz S|XDs@:G@<&Kq@`@$9p@)@}s@Ѳ:@)Ty@-0@s@<&9@z:t @)p@)P@)@h'@ @ (@)W@X@o@:@ 8r@=@)'@@=@b)Ps@' q@$9!@)p@:@<&D@ Zg(0l@ShASh?Sh Zg(w 5 funhj uhdB 0jwaw<  vw &  AdBbA>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'zs00#5TADATADATADATADATADATADATADATADATA. ePa-eP BAnB X/   @   RՀaePÕwePP6 -0P -0Pd-0Ph$9p p-0Pz-0P\)K@>W 0R40D\s!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 eW NBݪMND@ Zg(0TݪMh Zg(X @    e  T T T T H1CdT T L $)dL t dL d  FW X*ZKXD \W j\DDs@c&~@T;@o@  D"0DhDh\Dh  D"% w &Ba +- ʥ# . U 0   b c&~T;s$o*|  `     JW 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  W XZ7aXD@S@?S@o@ N.D,hD,h ۩"S Rw w &e`` a  `e`P D 2o ?So@S ۩"S` ,۩"S :۩"S`W XzR:XD<&`@<&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@ ~wW 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~ ,  W zBa8"D c[H [xQH[KrH[KH[}H[yH[L H [\}H[H [`H[oHzW t:ͫetD  ̅ ͫeh  ̅enW 0R 0DB,0zH*sH&5 H.sH([H, W < z`}< Dȍ`Hȍ8 H8THʍ8TH HōwH`H`HiHHˍsHȍH"ō,HˍHH *W < z`(}< D # ZT`8Ti w s,`: H8 `#5!h #  ZT  ` 8T i   w    s   , `  H 8    `W J DݪK@W@ <GP}hZg(0?Th Zg`*ABDEFIMNOPQRSTUXYZ<>zv      " $  &" (&$ &~4& B( >*  l,  x. 0 2 4 6 8 :*: < 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 00#7\ 1g Zцw    T߇ B܇7ق&7 %n)p)p }P "Zg`$)p*)p.}4Zg`D)pJ)pPZg`fZg`pZg`tZg`i wVȥ ȥ ȥ*  ȥ$ȥ/ ̥/   7    . Zg`i P)p)p2Zg`dZg`zZ ¥ ¥ p R $  ~ P$ &)p*)Ty.)'2' q4)8' q:)><&e@) DZg`F)pL)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`>W tR$ep!tDs@tCyH c&|KH6T,HkxH!)pH ,R"H L H0{mH`qH a9H"-DH)XHaKH #{8Hz)jdH 7{ HT,KHc&RH'(ZH0{HtyH(zH@.8H,yH .Hc&H0{DHlSHc&WH:z#0H#0H4{*LH#0Hs,XH@#09H [t{8H3^s00#?5TADATADATADATADATADATADATADATADATAH)VHc&XHGc& XH?tBxH.yH (H)\}Hz-EH#{8HtsH3sH0{9H#0HtsH.{H)ZH #z zH.yH #0LHc&dHAkH'-0Hz0{H0{Ht H#0DH0{Ht8Hs`XHn]H #0vH# zH0{nHl!H #0MH c&jLH#""Hz#0H)VNHԒLqH4{MHԒ[qH-01H40wHn^HlyH(WH 3jHc&pH#0)H c&HK#04H zc&pH#{mHT,HԒqH@CkzHc&XH7Ԓ7!H c& H2uNEDH NW NE2>uU(NED©#H NW NE2>uTqNEDOH NW NE2>uu'NEDH NW NE2>u!tNEDuT[NEDH NW NE2>uAyNEDȫ H NW NE2>uIqNED H N00#O5TADATADATADATADATADATADATADATADATAW NE2>uNEDjuNEDpŜH NW NE2>u#NEDH NW NE2>uN`NED(XH NW NE2>uNEDJH NW NE2>uzNEDi5uH NW NE2>u%NEDt!H :W NEz3u^NED5 @@@ dhPhHh hHh Wh hRWh  h  @ &e6% 4% 4%04 f   w eF w 5 >RX5 fW N:7xsND5 @ $7sh (e6@a "H5 W  :,d D  D"0aZh  D" =p!Օ^PW  bK VN Ds@s@o@f@  D"0;VNhaVNh  D"w BC "& @SY*p0p210=E%0=w*e "fo6sffjs&| D CB.EW  ΥZ  ΥD @f@  D"0ziWhrwh`i h  D"~46f %8 E D/D!D l0l8epl0pɥ.ɕ wx |f W 4(rw4(Ds@r"&@q:@w@i@o@f@  D"0`h  D"w *8I *=)98 eB &&  U **o"w8ihq:|e *Nlv ΋*.2  & #!)&ePe && >2i^s(e >E p* wq:"r"&&f W  %b& %D @q:@i@o@  D"0tch`rh  D"xw  )  fU %  BA `6p 4p`4 %60 4o $i6q:^W  ӬZe ӬDs@q:@i@f@  D"0cIqh  D"M=f& e %&&eH =&e0  U   E >  sXi8|>E=uf p  wq:6fW  Zz Dq:@i@  D"0HeZhrShft:h   D"L   f >5>Eu    i:q:nW  : & D  D"0h  D" zW  ,z, ,De&@py@r@r@pJ,@o@mo@s2 @f@  D"0l}h   D"w ) 8C 8* ) *w*   ep &o pJ, rNfbpyre&|p  އ#= EW9ť^*0 ` Ca C  = L  0* = Eե^ A e@ ߇ = Ep2!t)8eE`l0  0 0/ &l0 `p l064p 4 p  ,Vs2  J *` C#   D @)  6?000#W#\ 1gD)&rBmofW  ,z,hy ,De&@r@pK,@o@mo@sk@s2 @f@  D"0d h  D"w ) 8C $* ) *w*  ep p   o pK, rNf^e&|#= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0 t 0 0/ &l0 `p l064p 4 p  8 V Bs2 x*`)w C#   D @)  6?0D)skr:mo W 4=zE`W4=Db@mlE@eZ@s@r"&@r@q:@i@o@d?!@rS@r,}@Rf@@ft:@fy:@cIq@s}@  D"0Fhp!h  D"w  D 8#"#)%ĥ ĥ wn 0 o sfy:|*0 @Q$    0 40 60)) L \# U&* =w `p!22s}Jft: EW!p0p2 ׇ#( P) @#**fff  &*wj cIq:eZ`d?!peZt. nB58e$8w2A&e 4p8q  (#5=A#s6s>@)) *R*)@#0l C# 028 00ĥۇ rbblAĥĊ  000 0 @0 &*0 @ u # eB&B B *&,r,}JiVq:lrStmlExr"& eBe>  # #D #=0/H#@&0 id# = e0   0@e 6=#02/002# @#4q:j?@#040 6w/!0/ l0/!p!0 .=p0p2 f^W 4=zE`PZ4=Db@mlE@eZ@s@r"&@r@q:@i@o@d?!@rS@r,}@baVN@f@@ft:@fy:@cIq@s}@  D"0b^Whh!h  D"w & w  D  8#"#)%ĥ ĥ oos fy:|w~ 0 *0 @Q$    0 40 60))  eB L \# U&* =Bs}NaVNfft:w `p!2 EW!p0p2 ׇ#( P) @#**fff   # #D #= rSmlEr"&$id0/H#@&0 # = e0   0@e 6=#02/002Pq:# @#?@#040 6w/!0/ l0/!p!0 .=p0  # # r,}.i:q:>r"&JilD #=0/H#@&0 # = e0   0@vq:e 6=#02/002# @#?@#040 6w/!0/ lbf0d0/!p!0 .=p0p2&W 4=zF`W4=Db@mlE@eZ@s@r"&@r@q:@i@o@d?!@rS@r,}@RaVN@f@@ft:@fy:@cIq@  D"0Lh'h  D"w  D 8#"#)%ĥ ĥ wt 0 o sfy:|*0 @Q$    0 40 60))eB L \# U&* =w `p!28aVNPft: EW!p0p2 ׇ#( P) @#**fff  &*w&cIq@eZfd?!veZtj. nB58e$8w2A&e 4p8q  (#5=As<sD#@)) *R*)@#0l C# 028 00ĥrhblۇAĥĊ  000 0 @0 &*0 @ u # eB&B B &2r,}Pi\q:rrSzmlE~r"&* eBe>  # #D #=0/H#@&id0 # = e0   0@e 6=#02/002# :q:p@#?@#040 6w/!0/ l0/!p!0 .=p0p2&fW  =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 ˥"   ˥" (Ք     Օ W  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&W  ez\g eD @e&@py@r@r@w@w@pJ,@o00#g\ 1g@mo@i@aZ@2r,}@f@  D"0@}h  D"w n832cd& & & B  2OΕ   N Υ$Ε  2o pJ,|2Υ   v Ε f e * e*w@) mo>wTr,}` pf *0,   ) )(   =  l 0l pyr0e&> t  4/ e&=Ba@a e0b e aZbie@ ` Y= E8 el0  & 0 l0`p l064p 4 elp )wV%  ,  N w"  J B # :aZHaZVr,}^wjr\ f  `* w)0406 l0 mo. 2fW  ez\ghy eD @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&& naZt 0/ e&=Ba@a e0b ee@ ^Ji W= E8 el0  & 0 l0`p l064p 4 ep )lwn%  ,  w>  JwB # f  &"aZ0aZ:r,}BwNskhmo@`* w)0406 l0  fDW  z7q Db@wt@rk@wL @iW@rw@bG@s2 @  D"0\rhrh   D"`e6p 4 8 81416   2s2 "b*iW@bGDrkNwL Vwt\rwW  :\q D  D"0r,}h  D"> =00l&8el2 0 |*W  Js"& Ds@@  D"0Nr"&h  D"R82e& 0 0 0 80 B0 0 0 0)#0.s"W  (ZtL (Dxk@q:@i@  D"00rkhwkh  D"4 U8UMw wi&q:2xk~W  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 = aKPwW  Jw Dw@f@  D"0BwL h  D"F B 00fep=& /e`pwwDfW 4Ψz4ΨDb@wt@rw@bG@wk@a[M@f@  D"0whwh  D" ..8em,00#o$pTADATADATADATADATADATADATADATADATA0l0!D0e6p 4.) &f   bG`a[Mlwkprw|wt8|e) .  e6p 4 08*w,b6fW  Rd DbG@w@aZ@  D"0Pwh  D"T)"(. = . B  E (.bGFaZJwwhwh  D" ..8em,<0W 6 ^&= s(W3f4fnF F VN@r + (L .J %L 2&L (L PdL (L L :L `L XL iL tL qL |L (J ,L 8L 8L VNJ SJ i^L v^L wJ yJ \}J J .J 5J qJ J e^L L L xsL pJ L(LTLL,`T(tL0 }$0$Cpp_MjfMj%L+})WJ)WJ))XJ)XJ)ZJ)ZJ, J,!J,R"J,(J,CMJ,NJ,SJ,yJ,\}J-DJ-EJ.J.J.J.J2J2.J2pJ2J2J2J2ًJ3^sJ3sJ:K_MfM{y2+d6&Ld&Ld(Ll(JlCMJlNJlSJl\}JtpJ!!'!%6!}F[!}<q!q!yj+"Y J+"J+"zJ+"K"J+"'J+"(J+"YJ+"J+"J+"ZJ+"2J #n~#}#Oq#z#""J#wJ# zJ#J#J#.J#J#yJ#yJ#N&J#yJ#v~J%L%L%L%r!L%#L% #L%#L%LL%ZL%kfL% qL%tL%wL%xL%L%CL%L<&kL<&DL<&%L<&L<&zL<&(L<&w*L<&:L<&H;L<&SL<&`L<&eL<&fL<&fL<&pL<&pL<&KqL<&%tL<&iwL<&lyL<&9L<&LI&}c&Jc&Jc&Jc&L Jc&Jc&Jc&Jc&Jc&Jc&Jc&;Jc&Jc&Jc&Jc&Jc&Jc&~Jc&Jc& Jc&"Jc&"Jc&#Jc&#Jc&#Jc&4&Jc&'Jc&,Jc&";Jc&|KJc&jLJc&_MJc&MJc&NJc&SJc&TJc&UJc&WJc&XJc& XJc&XJc&gYJc&ZJc&b^Jc&^Jc&dJc&eJc&eJc&fJc&dfJc&fJc&9gJc&pJc&pJc&2qJc&grJc&krJc&sJc&sJc&wwJc&xJc&yJc&yJc&hzJc&}Jc&Jc&Jc&Jc&Jc&Jc&Jc&RJc& Jc&#Jc&Jp&p&L&ZL&]fL&tL&tL&CyL|' L'd'e'L'IRL' qL'ąL'L((J(zJ(WJ(&XJ(YJ(mJ(J(ZJ(@J(iJ(J(J(5J(yL( L(QL\)zL\)L\) L\)KL)L))[ML) L)PL),L)nEL)sEL)EL)_GL)GL)2HL)4L)ZL)p )'L)TyL)L)0J)%L)'L)^L)PsL) L)L)%L)LL)WL)WL)L)ZL)8L)x)` )VJ)J)(J)VNJ)SJ)CTJ)VdJ)[dJ)jdJ)fJ)fJ)gJ)pJ)nrJ)sJ)wJ)yJ)\}J)pL) L) L)w L)pL)KqL)L)%)5)L)t L)L)L)BxL)OzJ)PzJ)L)!L)dL)VgL)[}L)p )))XL)pL)L)Lt*[bt*[bt*[bt*G[bt*I"[bt*3[bt*N[bt*r[bt*s[bt*s[bt*s[bt*z[bt*[bt*[bt*b[b00$w\ 1gt*։[b*4[b*[b*[b*[b* [b*8&[b*@,[b* X[b*@w[b*w[bT,KJT,JT,JT,J,,1,f,VN",Q,:d~,Oq`,u~,.,J-.Q#0J#0J#0J#0J#09J#0DJ#0LJ#0MJ#0vJ#0J#0)J#04J#0J#0J#0TJ#0UJ#0J#0J#0xJ#08J#08J#08J#08J#08J#08J#08J#08J#0:J#0k;J#0;J#0;J$0!J$0R"J$0(J$0SJ$0sJ,0J,0J,0σJ,02J,05J,0qJ,0J-0J-01J00pJ00qJ00sJ00sJ00sJ20,J20,J20,-J20.J20.J408J408J408J408J409J40Q:J40W:J40;;J40:<J40wJ40uwJ40wJ40wJ40xJ40xJ40CyJ40NyJ40RyJ40yJ40yJ40yJ40yJ401zJ40w[b:Kw[b:iw[b:ow[b:w[b:w[b:x[b:x[b:x[b:By[b:Fy[b:Wy[b:y[b:y[b:y[b:y[b:az[b:z[b:}[b:[b:[b:[b:[b:+[b:|[b:A[b:i[b:y[b:[b:[b:$[b:C[b:d[b:h[b:[b:[b:[b:[b:[b:ۑ[b:[b:B[b:D[b:[b:[b:2[b:[b:1[b:$;K[b;@j[b;v[b;L[b;[b@;(T;[bT;8[bT;[bT;[bT;[bT;[bT;7[bT;![bT;;"[bT;I"[bT;`[bT;d[bT;4f[bT;$q[bT;s[bT;w[bT;Dy[bT; z[bT;z[bT;*}[bT;[bT;[bT;3[bT;[bT;[blK[MJlK_MJKpNfJNJ{[b?{0[b?{p[b?{[b?{[b?{p[b?{N[b?{@[b@{0[b@{N[b@{N[bA{0[bA{[bA{[bB{N[bC{[bD{0[bE{[bE{[bG{[b}[b}[b}[b}4[b}y[b}[b} [b}H [b} [b} [b}k[b}[b}>[b}[b}[b}[b}[b}[b}[b}[b}[b}[b}![b}I"[b}8&[b}]([b}([b}2[b}2[b}T3[b}3[b}5[b}8[b}O:[b}:[b}D;[b}K[b}M[b}vN[b}xQ[b}Q[b}R[b}W[b}KX[b}:Y[b}`Y[b}Z[b}Z[b}`[b}:d[b}f[b}f[b}(g[b}i[b}j[b}p[b}Uq[b}q[b}s[b}Hw[b}Jw[b}w[b}w[b}x[b}x[b}x[b}x[b}y[b}y[b}z[b}8}[b}V}[b}]}[b}c}[b}~[b}[b}[b}[b}0[b}փ[b}׃[b}؃[b}ك[b}ڃ[b}ۃ[b}܃[b}݃[b}ރ[b}߃[b}|[b},[b}[b}[b}[b}@ ~L [b ~ [b ~G[b ~I"[b ~Y[b ~p[b ~ q[b ~)q[b ~[q[b ~br[b ~ur[b ~r[b ~r[b ~s[b ~s[b ~s[b ~s[b ~z[b ~[b ~5[b ~[b ~[b ~$[b ~:[b ~[b ~ۑ[b ~{[b ~^[b_M,fM,a |[ba |[bbS[b00$\ 1gd}[bk |[bl8 [bl [bl [bl [bl [bl+ [bl[bl!JlR"Jl(JlCMJlNJlSJlQ\[bll[bll[bll[blsJlsJlyJl\}Jl[bl[bl[bl[bl[bl[bl[bs[buVY[buy[buy[buy[buy[buy[bvӁ[bv[bv[bv[bv[bv[bv[bv[bv[bv[bv[bv[bv[bJ6JL J J J`qJwJ7xJAyJNyJyJyJJJCJCJCJCJC,JCQJCSJC\XJC|ZJC fJCfJCUqJCrJCsJCxJCkzJkJkJkJk'JkKJkTJkfJkfJkxJ'%}LdJ.JSSvS|@p w[b Bx[b |[bi`` 8Tō,ōwȍ8 ȍȍ`ʍ8TˍsˍH}~`h`hÐHXԒJԒJԒJԒ7!JԒ#JԒxQJԒWJԒWJԒqJԒLqJԒ[qJԒVsJԒ;xJԒJԒ}JԒJԒRJ:v.J. J.8J.KJ. LJ.^J.qJ.BxJ.yJ.yJ4wJ#[b#֯[b#[b#[b-[b-'[b-([b-?[b-[b-[[b-[b5|[b5[b5[b5^[b5f[b5ٱ[b5$[b55[b5Q[b5 5!Bj<t!;P2;VN8`=@=4=K`rD&K4'6֯}F>deJ47 4}4vdx8 XF>X:&@9@p:hpKsu9 \q Pw x z ?S@SAS} ,l;,z;4u~D 8r? &KlE<61Kj1oj1pF1qF1rF1sF1tF1uF1vF1wF4}j6L j6xQj9`j=Krj?yj?jBjC\}jCj\D&\^W@hp!2h!@h&h'}sI:2r/KrJrPr:?ձWCֱfaD oE 4v0 r0# r0r2XED&`;G`2&D &D (D faD e;G*:Ѳ:Hܲ""ܲ#&ܲ#&ܲ`ܲ)dVܲGdVܲ@w$aK3a[M3aVN8b2bG3c2 74cIqcd?!4d)&=dd;5@de&74e&74eM6eM6eM6eM6eZe$3e?3f4vft:fy::&gg<gggggg,gCgRggggg}:iHlmlE<mo<p# Iph<p &>pJ,?LpK,?00$pTADATADATADATADATADATADATADATADATApZpiw=dpvwI:pwpep?Lev?$ep!e$DfT?afZkf`;@kfKqA<f; AhfvBDf]\g \ghy kz[b q}z q_M2qWB7q 7qqB7qs{IqCVqMC\q srr%:s@84sUs%s"& tL tyD $t_ @3ukM@3u^3u_3uIq44u%!4u;;R4uH;5uZp5up5u%6u" \6ut:7u`"9uX|>u0>uz~>uF>u#>uu'r>uU(>uT[>uN`>uIq>uTq$>u!t>uAy\>u>u>u%?ud@u# @u`$BuW!Buq!BBu"BuCuzLDusEudGuv vqZvXuEvP9wKrw^rwdw7xsTx+yZAyNy SyTy`y%y%2y]ydy@D_M,EKqF>!0! &b!p:>Ld `}`(}BS|@h~FDHG`YGw }GLd t(_HaH9}w * 8B pB  0 B o`$s}2d?!:fNW 42l'4D  D"0NW 42n X4D  D"0W 4ӭJz'4ӭDs.@ft:@  D"0d;h  D"Jĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ z ds.| DEe    *1  ˕03 "   ˔Ӕ ʥ7ft: W  ZW D`@o@d?!@aVN@  D"04'h  D"8w *eB 8  oaVN"`0d?!W  ӵR0!# ӵD  D"0eMheMheMheMh  D" W  R!  D  D"0le&he&hc2 h\s2 h.  D"p *) l0, *) $ )*)0,40,6 W  -Z#t! -De?@o@ft:@s}@  D"0H4h  D"Lw *f f ! fP ŀ)Bos}f00$\ 1gt::e?W  mz &@ mD@`@:@}s@ձS@}@@@e;@h&@ձ@h'@ X@zձW@X@e@,l@,z@}@4@ 8r@֯}@'@B(>D  D"0yuhW  Ӎbu'x ӍD @q:@w@i@o@  D"04@h  D"8w ! & &  e o w$i0q:BW  Z&`; Ds@; @o@  D"0Xhfy:h   D"w DB C DBe ?De(e$2e (%[]%<> o s@s| 1 > ; vW >ƭZ(#>ƭD  D"0yyphyyW 4R,h4Dph@d;@aVN@  D"0|g}h  D"* 5)%Eefffff f% EDD%][%><  1 aVNXd;^phW 4J,l4Dg}@o@  D"0 ,lh  D"w  wo g}W 4J,z4Dg}@o@  D"0,zh  D" w wo g}W  JRK Dq:@i@  D"0mlEh  D" Mwiq:W  :SKq D  D"0&moh  D"*  DP5R RRR W  RT DmlE@o@aVN@  D"0*lEh  D".w *eB 8  oaVN*mlE W 4mJ:dh4mDs@d;@  D"0phh  D"e( 1  `((   >: 5s<w $o|d;`| w1  %,,:4  ph`W ?WJdv?WD&s@s@  D"0p &h  D"ef  Ee2 UfD Ԕ %:ԕ: f& sV|f&f& & Ε lle  NsW  ΥBep ΥD @  D"08pJ,h  D"< 8   **$ W  ΥJev ΥD @  D"00pK,hskh&  D"4 8  ** W  ΥjDfT ΥD @pZ@o@r,}@f00$pTADATADATADATADATADATADATADATADATA@  D"0D 8rh.:h  D"Hw ) * w46l0 o pZ,r,}0fW  ΥZkf`; ΥD @d;@m @  D"0pE 5  e0Ґ W  :vXu D  D"0oh  D" &ff W  J D`@f@  D"0"2Xh  D"& 8 !Հ)w*w`$fW  rKq DeZ@o@rS@aVN@ft:@  D"0,ձSh Xh֯}h  D"0w ww ww w8o aVNeZoaVN rS$o(aVN.ft:W  rh~ Ds@xk@s@4}@f@  D"0Zwh2wh"q:h   D"^0+1e  %p*w f( f)f sxk"s.f\4}W  RH Dw@w@o@  D"0`;h  D"w wwoww|W  :Y D  D"0wth  D",*1W  j} DrC@w@r@aK@o@s2 @  D"0Te;h00$\ 1g  D"Xw $0,0w 46  )0406 0 *&o rCr s2 .aK4wW  Z(_ Ds@s@  D"0Vxkhxkhih>  D"Z8Ae f"( UCɗ+e$&% 8sDsW  Ra Dq:@i@o@  D"0Ѳ:h  D""w *D  woi q:W 4εj:dvw4εDs@s@o@aVN@\D@  D"0pvwh vwh  D"w *D YTfe<ӕ_ S :ӕ: & "& Ε4'o0s|sx| *'**UqqC ӥ:  Ce   *ssP\DhaVNW  z:dw D&p &@s@[;@piw@pvw@pw@o@aVN@  D"0}sh p# h*s}h  D"eB  8 $&w *<S1   K U U@  f&"  aVN&oR[;fpwxp &r|')'* *%0*ND   EU   ,sssJaVNbpvwhpiwnpwW ?WJ#L?WDp &@s@  D"00eh  D"4&ff  'p &"sW  ej &( eDs@  D"0yyph &hByy y y((  BBFF y W >b=>D&p &@s@@$9pw@@=@ Cx0,=h Cx eeȵe ~  DE  ȵ2e &e  %'@^e5 *@=Xp &`$9pwbs|5@558Beeȵee& q1B$8e q1 B  .W  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 qH'ąH |H)H#)H4)H%H PdH :H )_GH))HWH)TyH$'IRH&{ZHzWzH@'H)H0)GH%wH@%xH [#H%CH )2HH4) H,)BxH) H-<&%tH<&9H `H$z)[MH &H %HB)pH<&pH<&pHWwH (H 2&H(d(HWwH i^HV v^HPt!H)w H.z)H)PH8)KqH'HF xsH[YHtw(@w BwDwFwHw&-H 6lF8sW 4=J@4=D X@K@  D"0'h  D" 8eB   XK0W 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"^wwwwwww22XlE K'ձW:syh^`;hԱ(hh`rhBiwh2 hb:hjvwh6hp!hyh*:_hwh:2Xh w:6  66,6^% N a W vz(jLvD:(}@:`@@fa@`@:@}s@GP}@\@Ѳ:@:Z@ձS@z:@}@@@e;B F{H$9KH}xH$9;H%{!H:GH H}D;H:qH:Hz:qH,wfH:"qH:&qH:&H:$qH:.qH:(qH$9YH}H&$9 H$9YH:WHP:a H$9YHz,w{H ~sH:TqH:RH$9H}HU$9ZZH:H :H:t H:qH:H8:H$9CfH$9DfHz ~H:H:H ~sH$9Z&H$9bH$9`&H ~H$9kH$9{H<H$9~ZH,wH:q!H $9ZHz$9ZH}`H`:-HA{0H $9ZH:x HvH;LH}4H ~sH:H:H wvH:!H:-Hz:}H`}Hj$9[H$9'H$93H$9[H$9H$9H,wWH:H$91H$93gH:H:-H ~$H@z:H5^HlH5fH :#"HuVYH}yHR}H;E{H?{p00$pTADATADATADATADATADATADATADATADATAH$9rH$9&H}Hi:brH:crHz$9fHt*bH@:krH $9H:vrH@t*H5ٱH w+H:rH}pHk |H:rH :rH :rH:rH0z:2H:rH8:rH} HD$9BH5$HlH55H}8}H%$9g'H$9n'H<_Ht*zH$9sH$9Hz$9H?{pH ~:H:[KHkZH}qHV?{Ht*GH$9'H$9H$9H$9H$9 H}V}H9}H H>z:sH :sHx}]}HA}UqH6: sH:#H:sH }c}H@*@wH5QHw:dH:KH?{@H:KH$9Hz}H:} HS:3H@:{3H:|sH }H<:sH`:sH*wH }H=:sH:sH:sH:sH0:sH z ~HT;8H:sH:KHlH $9CH:KHH}!H :H$9VH$9XH ~ۑH:sHP$9|H:4Hz:tHT;wH$9.H:-tH`:,dH:1H}|H :74HwHwH-[H}`YH :vH$9H$9H:n'Hl+ H#$98H$9Hz:owHvӁH:H}HT:wHP:H:wHt*H }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 8W >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$[`ws KW >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 TW >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)00$pTADATADATADATADATADATADATADATADATAaw 6  w  e 1 w 0" , 0o4[F[KrJ[}N bW >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 KrW >j6a>D[`@ Kr4BɪKrhɪK'h 4lwh4K0 KrF5  5 2  UE   pE U 5@*& E& & f&ËDef Ë )̋U<[`W tXz9axtXD @[Kr@[}@[@[@o@[`@ Kr4ɪ3qhɪ2qhɪ#qhZɪ;rhɪJrhɪKrh 4Twh4P t t tK0 Kr1 5  B5BUW/ - ',  wE5  [}<[\[}\|  wE5 E  W5  ,E @[ 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 >W tXz9atXDs@[@[`@ Kr4ɪ3qhɪ2qhɪJrhɪKrh 4Bwh4 K0 Kr5  <5<UW) ' !  wE5   8[L|wE5 E  W5  ,E 0[ EWO ,) &  4 &9U3uE uUw5  [|  uE uU5`AU & E& & E& De&f $̋"5`[`N & & & & De&fH ̋E U$[`ws KW tXj9atXD[`@ Kr4>ɪ3qhɪKrh 4wh4K0 KrB5  5U   E5@? & E& & E& De&f $̋"5 & & & & De&fH2[`r[`| ̋U bW Tz3ax}TD @[Kr@[}@[@[@o@[`@ Kr4ɪ;rhɪJrhɪKrhB 4wh4P t t tK0 Kr1 5  .5.UW  ,   wE5 E [}<[\[}4|  WLJ5  ,E [ E U &W2/ , & 4 &9 &9U3uE uU[t|.5`.U & E& & f&ËDef Ë )̋00$\ 1gE U<[`T)aw 6  w  e 1 w 0" , 0o4[F[KrJ[}N W Tz3aTDs@[@[`@ Kr4ɪJrhɪKrh 4wh4 K0 Kr5  (5(UW      wE5 E  8[$|W͇5  ,E [ E U &W)& #  4 &9U3uE uU.5`.[b|U & E& & f&ËDef Ë )̋E U*[`ws KjW Tb3a~TD[`@ Kr4>ɪKrh 4pwh4K0 KrB5  5U   tE U *5@*& E& & f&ËDef Ë )̋U@[`fW  b& Ds@s@; @o@  D"0Xhfy:h   D"w OB C DBe ?De(e$2e (%[]%<> o s@s2| 1 >ߋ J ; (sFW  Υj7qs ΥDs@ @xk@s@i@  D"0rChwh*  D" 8   *  4 6 BeeD&& \Е- Е-' Vw D  &pWtЕ. ce  Е:   B%  & G`ЕJЕAЕNЕFЕEЕBЕMЕi>:<XݪKAЕRЕAЕPЕRЕMЕAЕYЕJЕUЕNЕJЕUЕLЕAЕUЕGЕSЕEЕPЕOЕCЕTЕNЕOЕVЕDlЕEЕCW z.D:`@:Z@:@Aׁ  `)9H%EKQNdi%vhlAP AЕ Bf  & e6& e/& e*AHŀ ȕ Е Е Е & e & <:: ,: 6<( x:`j teЕ A %& eA Е A EA EЕ A A   $Е. : :_x *: 2[(}Ha}T@Qf[(}~[(}00$pTADATADATADATADATADATADATADATADATA0 AЕ;    :ZW t0: t0D ,@,hC,h 0e   W XzNy XDNHQHHNBxH BxHQHN:dHBxHHN H  :\}hNt!ht!hN\}h\}ht!hW t02xxt0D "$CTh & @ @W B*`Dܲ`@ ke(0sh ke( Sw ܲ`W XBWXDܲ#@ܲGd@ <Wh @ Av wܲGd>ܲ#W B3DܲGd@ ke(03h ke( C &qFre @AE2cD! D2rܲGd|8 HW J4fDܲ#@ܲGd@ ke(0"4fh ke(& & CC w ܲGd$ܲ#rW t0: t0D  @,hC,h eW JF Dܲ#@ܲGd@ ke(0.F h ke(2> qqqQѕwܲGd0ܲ#W J;VNDܲ#@ܲGd@ ke(0F VNh ke( RRRwܲGdܲ#W rr +Dܲ#@ ke(0D+h!!hh2+h xQh}h$r +h ke(H97; uwy{D& fW#v&wFܲ#W Rbs;D V9phBYh@;(hv8h:h Z L@W @@@ 8@ A Be   @  @ A@@K@P @W ByXDܲ`@ ke(0,h ke( w ܲ`W HJTHDܲ#@ܲGd@ ke(0 `Th ke($ & w ܲGd"ܲ#W JDܲ#@ܲGd@ ke(0{h ke( _w ܲGdܲ#W  J֯L Dܲ#@ܲGd@ ke(0q!yh ke( ew ܲGdܲ#W J֯Dܲ#@ܲGd@ ke(0q!h ke( aw ܲGdܲ#2W  ~ Q Q Q IwܲGd<ܲ#W XJ_MXDܲ#@ܲGd@ L_MhfMh P   x qqfII1 qq  wܲGdNܲ#W XJ_MXDܲ#@ܲGd@ 6_MhfMh :  Q Q QwܲGd8ܲ#W XBwXDܲ#@ܲGd@ (wh , Qѕf IwܲGd*ܲ#W tXB,tXDܲ#@ܲGd@ (,h , Qѕf IwܲGd*ܲ#W XJ q_MXDܲ#@ܲGd@ L q_Mh qfMh P   x qqfII1 qq  wܲGdNܲ#W Ju~Dܲ#@ܲGd@ ke(0 zQDh ke($&  RRRI! wܲGd"ܲ#2W R\MD,0z@ܲGd@)` @@ |S]h  Ε 4e   e  f &f& %&ܲGd.,0z2)` @l,0zp)` |s"W XR5dXDܲ""@ܲ#@ܲGd@ f &hfrh  e I I & # I  a(Ia(I BCD"C" wܲGd|ܲ# | ܲ""W Z PwDs@ ( Pwh xh h zh \qh ,& & & & Aff& sW BD Pw@4u~@ ,ysh 0 fB A  & & fw4u~. PwW B,H:DݪK@d;@ :4u~h >W &=e e@ B  $ݪK6d;W RD z@*@ \q@4u~@ <}h @& %NBwA & fww z4u~2 \q>*W Rs00$pTADATADATADATADATADATADATADATADATAD,0z@ܲ#@ܲGd@)%@ Zgh ^&  & e mw&f&fe  s&ܲGd,0z)%,ܲ#B,0zF)%W BձDܲGd@ ke(0pIqh ke(t   _(  ?f'& f' ?E@@ a B 0e  ܲGdW RձDs@ܲGd@ ke(04Kq hKq^h ke(8KM & & &&& ܲGd4sW BsrDܲGd@ ke(0.srh ke(2 e@AB ܲGdW J#DܲGd@ܲ@w@ ke(0Yqh ke(  wܲGdܲ@wW XRUs%XDܲ#@ܲGd@ ke(0(cs}hUs%h ke(,Q &wܲGd*ܲ#W BձzDܲ`@ ke(0[qMh ke( /w ܲ`W zxDlOpH)H)H)H)xH)p H)%H[ H)` H)p H)5H  W XJx+XDܲ""@ܲ#@ܲGd@ vx+h z W#0A %+B%&AB`B`D&  B~> ee Jb"b "╫w HܲGdpܲ#xܲ""W J XDܲ#@ܲGd@ ke(0&wh ke(* GwܲGd(ܲ#W RyDܲ#@ܲGd@C,@ ke(0$yh ke((  wܲGdC,&ܲ#W  Ry Ds@ܲ#@ ke(0@Iqh0y}h ke(D B (W/ D  7 f& }w(sBܲ#W Jy%Dܲ#@ܲGd@ ke(02y%h ke(6 @  EwܲGd4ܲ#W XZ #XDܲ#@ܲGd@ Zg(0y@h.yhX:` Zg( e2w 7 Nw&f&fCDEe  > ܲGd X:`0ܲ#:ܲGd>X:`BX:`HNPܲ# dX:`(|   cs X:` W B zDܲGd@ܲ@w@ 2sh 6 X eETETwܲGd4ܲ@wW B 4fDܲ#@ܲGd@ z4fh  -w ܲGdܲ#VW 뀻bjM뀻Dܲ""@ܲ#@$99@ `h&`hy`h y`h & @EA:% NP& @5A E& B _"E@  D Q 5E,|w+w E  ܲ#ܲ#$99(ܲ""|W :xDܲ#@  ÐHXh & 1w ܲ#vW 2*D *h )vW <:ܲ""<D ke(0ܲ""h ke(& W Jܲ#Ds@ ke(0ܲ#hܲ#h ke(sW Jܲ`Dܲ#@ܲGd@ ke(00$\ 1g0ܲ`h ke( &w ܲGdܲ#W Jܲ)dDܲ""@ ke(0Lܲ)dhܲGdh ke(PC & ` `Ba#   L Lܲ""W Bܲ@wDܲ#@ ke(0(ܲ@wh ke(,CC    &w*ܲ#^W ~R~Dܲ#@ܲGd@ .Qh,1hHwh ` e BBCC w qqq0 fqC Q IܲGd4ܲ#VܲGd4|w C Q Qqwܲ#ܲGd2ܲ#tW r}Ds@ܲ#@ܲGd@L @$9΅@w@C,@ 0h}h  j  2@  e ' w  /*jܲGd"C,8w>L lܲ#ps |<   e$9΅W XJXDs@ܲGd@ ke(0,Cph ke(0 & & &&&ܲGd,sW J%Dܲ#@ܲGd@C,@ %h "  w ܲGdC, ܲ#W z}Ds@N@N]@ܲ#@ܲGd@ X@NBx@N{8@N{@$9΅@C,@ }h    *e  f w  NܲGdC,N X$NBxDN{PN]ZN{8^fhܲ#lsrs~$9΅ | e W XR1yXDN@ݩ%@ XN]hN{8hN{h \&&&f&f   ` % s*N.ݩ%$W J` Ds@# z@$9@ s&   (w  *ܲGdC,$(*ܲ#.s4N8ݩ%W J[!}Dܲ#@ܲGd@C,@ 2[!}h 6  2 w ܲGdC,4ܲ#W B#yDݩ%@@ RL h V&f&f   /<    sݩ%W tbf]tDs@G> @$9s@GVN@:$@:4F@ Rh &)_& & &  & && && Ε 61& 1)ȋ& & & ,s.G> 2GVN6:$B$9sZG> nG> T|& & & & & & Ε 1 &  a@ G> GVN:4F6G> W J q}Dܲ#@ܲGd@C,@ 2 q}h 6  2 w ܲGdC,4ܲ#W Jr%Dܲ#@ܲGd@C,@ r%h   w ܲGdC,ܲ#W tBs@800$pTADATADATADATADATADATADATADATADATAtDܲ#@ܲGd@ s@8h   eCBBaIBBJbCBB ɒɐBܲGd| & &  wܲ#W R9wKDܲ#@E4d@ܲGd@C,@ (9wKh ,  wܲGdC, E4d*ܲ#W tBrwdtDܲ#@ܲGd@ drwdh h e ICBBaI    B wܲGdfܲ#W XJ u~XDܲ#@ܲGd@ &,u~hwu~h * =w =w ܲGdܲ# ܲGd(ܲ#zW rrwDs@ܲ#@ܲGd@L @$9΅@w@C,@ rwhrwh  p`  2@  e *  w  *pܲGd"C,8w>L rܲ#vs&|/<   e$9΅W rAyDs@ܲ#@ܲGd@L @$9΅@w@C,@ AyhAyh       2@  e 9ܲGd"C,zw|2       w   /<  L Vܲ#Zs|$9΅ e<W jSyD5!@5 @ @@@  Xhݩ%hwh<  ,#b3!  b3!a & > >265 : FX |>W XzTy`XDNHQHHNBxH BxHQHN:dHBxHH N H  :\}h>Nt!h>t!hN\}h\}ht!h   >>> >|tld2W Jy%Dܲ#@ܲGd@C,@ y%h    w ܲGdC,ܲ#W By]Dܲ""@ܲ#@ Xy]h \@$A E& & B ?E@  D Q w% Nܲ#Xܲ""W BydDܲ#@ܲGd@ ydh  w ܲGdܲ#W Jy@Dܲ#@ܲGd@C,@ y@h "  w ܲGdC, ܲ#W X00$\ 1gBT,XDܲ#@ܲGd@ '%h  w ܲGdܲ#zW X:LdXDܲ`@ Ldh  w ܲ`W ZSDܲ#@ܲGd@C,@ TShSvhSh  XKM&     2 &wܲGd&C,Vܲ#W XB|@XDܲ#@ܲGd@ @|@h D &  eq B C1GwܲGdBܲ#W trtDs@ܲ#@ܲGd@L @$9΅@w@C,@ hh  x  2@  e .  w *xܲGd"C,8w>L zܲ#~s.| /<  e$$9΅W tb!tD)@4@@W@<&e@)p@ 4@h 8w &&E  AHW )p)p<&e)"4&<&e().)p2)p$W Xz!p:XD$9 @)Bx@)p@W@t<@ @)@)Ps@:@ @h Dw   . ʥ:W:t<) )Bx$ *)p<$9 >)PsW tz! &tD)@)Bx@$9~Z@)p@W@<&e@ @)@)Ps@t @)p@:@ 4h w    j2-  (@ep@ D  e  ` e RW $9~Z")Ps.:4<&e6):t <)B)BxJ)pP)pT b:F|     R#R- )Bx:& ,)pW B @~D  D"06ݪKhih  D":&  m  f A N  %2W |R:=|RD Cx0=h Cxf&f ` *  !נ נ  נננ"D נaנz E ѐEp(p| נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$tנ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:Dl  Dנ"  0W |RB@=|RDd@ Cx0@=h Cxf&f E^`  UQ  UQ ËUI U `e |ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRtpBC5D  KR΋KBAE:D0CĊ f eB  Dҁ CSĊ  |dȀWC E Cs Ε f)& 6 l(*  E 'W " =lN  W :+W = 1 #W ,W / %W %W *Հ W <W [W >W ] v(* 6 eW XB%PsXDs00$pTADATADATADATADATADATADATADATADATA@ K0 ""h K$'1sW N@B:h;N@D  D"0@d;hm h  D"D&   `@ ` B   & A @    W ΚXb9}ΚXDi(Pi Zi di .tՕ: @e e0e0UiW 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 VaZ1oW XB XD `E4dhEdhHʫh~h d% & ^UU U U UUUN a  W 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`ݪMW ΚXBתZΚXD Zg`0תZhabh$ Zg`4JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECW X:i XD Zg(06i h Zg(:&f!  E D  E E C B Ί AW XzXDfH`fHH fHH p&H fHjzHxfHfHKH fH " 5H fH@ W NBi(ND@ Zg(0ni(h Zg(r AUUUU    T T T T ee(e(e(e(T $)T T TU U U U  ~W Xz#'XD)@:Z@)Ty@:@[Y@[Y@)@)Z@)W@)W@[<}@o@:Ա2&@[(}@)X@ Zg(0dh Zg(w EH 00$'\ 1g 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[(}nW t02#}t0D yh &3W <0z[ S<0D:}s@Ѳ:@s@l@:br@@:s@ @o@T; z@ 8r@g@z'@g<@g@g@g@$9!@:@gC@gR@g@g@g@g@w@:@:NK@ Zg(0`۩ ShghVg,hJ Zg(w T&:)uE@ %:a `u>MN[[e D(e:(C(  5oNltT; z|@5*6 T @2ȋ eT5 N ) @   J 5 w DC u $g2gCXgbgCtgw  E  @e:(w5 CD>%  6  p + k5e d .gJgXgfgt^ [U5@ D( G uɥ;5<5-Ԩ  5@ u $9!*gR.g:gvg5 Fɥ@5ub , 5w E 5 @  @8jMAB *g:g<V`NKj$9!lAe @&PPP@C&5A  88Ue  28:sDѲ:HT; zP$9!\:hѲ:l:brxѲ:|8 "@0 *_%`AB w@ 8 T; z( N$9!Z$9!ngW <0z[ @S<0D:s@$9W@@@`@}s@Ѳ:@s@c&_M@@9x@h'@T;w@zu@ (@X@o@Ա2&@ 8r@$9pw@'@=@@=@=@$9!@g@:@g,@jw@ Zg(0Llh ghg<hghgChgRhghngh2gh Zg(u j  5 , ɥ/b J  1ECe, e   g,Ng|' @%7U @ E $  , D(@e , 5@@e,C& n: K s@w@&p > :%%ȕp*f  D9x9x*@:=Hc&_MT$9pwVs\T;w^stux=tȕp* eBEETH EBe Z5    O 2e(5 @&B &@=DgT'Zgdz`B 2=2 D(:(@$8 &SY e2edE_$8$8$8lw $9!D}sJwRoVsZ (`Xh}s~Ա2&du46 D A(! ! (*A8 @&s eB<B7 pB!# Zp *pB   dw ɥ ɥ   ɥ ɥ ɥ@ɥ/ h' $9W" 8r4:W <0z[ AS<0D:s@$9p@}s@Ѳ:@s@d@ 8r@'@:@w@ Zg(0*ghghZghghB Zg(5 A&)f  u BA U` B`00$/pTADATADATADATADATADATADATADATADATACAB5 b| Rusx$9p|ABAB6C4 Е/ЕLЕBЕ:Ae,P   S  ɥ ɥ    d ɥ ɥ ɥ@ɥ/ W |Xz S|XDs@:G@<&Kq@`@$9p@)@}s@Ѳ:@)Ty@-0@s@<&9@z:t @)p@)P@)@h'@ @ (@)W@X@o@:@ 8r@=@)'@@=@b)Ps@' q@$9!@)p@:@<&D@ Zg(0l@ShASh?Sh Zg(w 5 funhj uhdB 0jwaw<  vw &  AdBbA>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@>W 0R40D\s!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 eW NBݪMND@ Zg(0TݪMh Zg(X @    e  T T T T H1CdT T L $)dL t dL d  FW X*ZKXD \W j\DDs@c&~@T;@o@  D"0DhDh\Dh  D"% w &Ba +- ʥ# 00$7\ 1g. U 0   b c&~T;s$o*|  `     JW 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  W XZ7aXD@S@?S@o@ N.D,hD,h ۩"S Rw w &e`` a  `e`P D 2o ?So@S ۩"S` ,۩"S :۩"S`W XzR:XD<&`@<&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@ ~wW 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~ ,  W00$?pTADATADATADATADATADATADATADATADATA zBa8"D c[H [xQH[KrH[KH[}H[yH[L H [\}H[H [`H[oHzW t:ͫetD  ̅ ͫeh  ̅enW 0R 0DB,0zH*sH&5 H.sH([H, W < z`}< Dȍ`Hȍ8 H8THʍ8TH HōwH`H`HiHHˍsHȍH"ō,HˍHH *W < z`(}< D # ZT`8Ti w s,`: H8 `#5!h #  ZT  ` 8T i   w    s   , `  H 8    `W J DݪK@W@ <GP}hZg(0?Th Zg`*ABDEFIMNOPQRSTUXYZ<>zv      " $  &" (&$ &~4& B( >*  l,  x. 0 2 4 6 8 :*: < 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` tZg00$OpTADATADATADATADATADATADATADATADATA`^( 4A Е.) ыѝѝɝwы@>4 t&R Zg`()Ps Zg`A: "Zg`)0M4M8MH:2JZg`@ NZg`>W tR$ep!tDs@tCyH c&|KH6T,HkxH!)pH ,R"H L H0{mH`qH a9H"-DH)XHaKH #{8Hz)jdH 7{ HT,KHc&RH'(ZH0{HtyH(zH@.8H,yH .Hc&H0{DHlSHc&WH:z#0H#0H4{*LH#0Hs,XH@#09H [t{8H3^sH)VHc&XHGc& XH?tBxH.yH (H)\}Hz-EH#{8HtsH3sH0{9H#0HtsH.{H)ZH #z zH.yH #0LHc&dHAkH'-0Hz0{H0{Ht H#0DH0{Ht8Hs`XHn]H #0vH# zH0{nHl!H #0MH c&jLH#""Hz#0H)VNHԒLqH4{MHԒ[qH-01H40wHn^HlyH(WH 3jHc&pH#0)H c&HK#04H zc&pH#{mHT,HԒqH@CkzHc&XH7Ԓ7!H c& H2uNEDH NW NE2>uU(NED©#H NW NE2>uTqNEDOH NW NE2>uu'NEDH NW NE2>u!tNEDuT[NEDH NW NE2>uAyNEDȫ H NW NE2>uIqNED H NW NE2>uNEDjuNEDpŜH NW NE2>u#NEDH NW NE2>uN`NED(XH NW NE2>uNEDJH NW NE2>uzNEDi5uH NW NE2>u%NEDt!H :W NEz3u^NED5 @@@ dhPhHh hHh Wh hRWh  h  @ &e6% 4% 4%04 f   w eF w 5 >RX5 fW N:7xsND5 @ $7sh (e6@a "H5 NW  2,d D  D"0LW  bK VN Ds@s@o@f@  D"0;VNhaVNh  D"w BC "& <SY*p0p21E%0*w*e "fo6sbffs"| D CB.ENW  Υ2  ΥD  D"0W 4'rw4'Ds@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"&fW  %b& %D @00$g\ 1gq:@i@o@  D"04ch`rh  D"8w  )  U o $i4q:W  ӧZe ӧDs@q:@i@f@  D"0vcIqh  D"z0f& e %&&eH U   Ef p  ws8i`q:xfW  Zz Dq:@i@  D"06eZhrShft:h   D":    f u    i(q:lW  : & D  D"0h  D" W  'z, 'De&@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 *` |r:tC#   D moW  'r,hy 'De&@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 rskxr6tC#   D moW 4=zE`W4=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))  :# 3&*w #( P) @#2s}Jft:XcIqreZ**fff  &*wL. P358e$8w22&e  d?!,eZPsnsvt%p8q #) *R*)@#0l C# 028 0&r|b0ĥۇAĥĊ  000 0 @0 &*0 @ u # eBFr,}dipq:l&B B * eBe>  # #D #&0  rSmlEr"&"id#   0@e 6@#040 6w!p2$q:NfFW 4=zE`PZ4=Db@mlE@eZ@s@r"&@r@q:@i@o@d?!@rS@r,}@baVN@f@@ft:@fy:@cIq@s}@  D"0d^Whh!h  D"w & w  D  8#"#)%ĥ ĥ oos fy:|w 0 *0 @Q$    0 40 60))  eB  :# 3&*w #(Bs}NaVNfft:tcIq P) @#**fff  &*wL. P358e$8w200$o$pTADATADATADATADATADATADATADATADATAeZ8d?!HeZlst2&e %p8q #) *R*)@#0l C# 02sBr돀8 00ĥۇAĥĊ  000 0 @0 &*0 @ bbr,}lu # eB&B B * eBe>  # #D&iq:&rS.mlE2r"&>i #&0 #   0@e 6@#040 6w!p2@q:jf8W 4=zF`84=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 &*   w6 . 2358e$8aVNxs8w22&e %p8q #) *R*)@#0l Cs"Nr돀t# 028 00ĥۇAĥĊ  000 0 @0 (bnr,}&*0 @ u * eBe>  # #D #iq: r"&,inl&0 #   0@e 6@#040 6w!p2.q:XfW 4=zF`W4=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  :# 3&*w #( P) @8aVNPft:^cIqxeZ#**fff  &*wL. P358e$8w22&e  "d?!2eZVsts|t%p8q #) *R*)@#0l C# 028,r돀 00ĥۇAĥĊ  000 0 @0 &*0 @ u # bLr,}jivq:leB&B B * eBe>  # #D #&rSmlEr"&(ij0 #   0@e 6@#040 6w!p2*q:Tf.W  =Z:dw =Ds.@D@o@  D"0zpwh wh  D"w *  )Ĕ%.&%;D  5)5@DD ͥ*Ce a%wUX5@ o^D|5U U*U  5@XU@5 U*U  ʥ*%C!.D` *weC5U5  5 5@e s. t* W  jafZ De&@e&@r@c2 @w@aK@  D"0`pZh  D"d 6 p 4 0`p f 64 46 e*w & e&,w:c2 HaKNr\e&W  ez\g eD @e&@py@r@r@w@w@pJ,@o@mo@r,}@f@"  D"0}h  D"w n83200$w\ 1gcd& & & B  2OΕ   N Υ$Ε  2o pJ,|2Υ   v Ε f e * e*w &mo>wTr,}` pf|py*0, L  ) )    l 0l  r*e&8 t   ee@ x0 j) E ep )w ,  N w  J B # f  `* w (r,}0wwTr,}` pf|rH  ) )    l 0l   e& t  ee@ t. f' E ep )w ,  w  JwB # f  `* w)0406 & r,}w sk:mo` dfll0 W  r7q Db@wt@rk@wL @bG@s2 @  D"0<rhrh  D"@e6p 4 8  &s2 "b*bG.rk2wL :wtW  :\q D  D"0hr,}h  D"l. 00l  0 *W  Js"& Ds@@  D"0Nr"&h  D"R82e& 0 0 0 80 B0 0 0 0)#0.s"W  'RtL 'Dq:@i@  D"0 rkhwkh  D"$ U4 6wi"q:fW  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 @wW  Jw Dw@f@  D"0wL h  D"" Bfep`pww f(W 4Χr4ΧDb@wt@bG@wk@a[M@f@  D"0`whwh  D"d ) !f  e) . e6p 4 08*w&bGa[M&wk2wtXbbfW  Bd Dw@  D"0wh  D" ) . .w D"" Bfep`pww f(W 4Χr4ΧDb@wt@bG@wk@a[M@f@  D"0`whwh  D"d ) !f  e) . e6p 4 08*w&bGa[M&wk2wtXbbfW  Bd Dw@  D"0wh  D" ) . .00%pTADATADATADATADATADATADATADATADATA<0W %6@-v"L3Љ6sBKBv#xx'e.`X.`0y: ty: y:x Te 60qX H0q8 >s88  ` ~HW Xb"LXD#@?T@{@©2@*@ Zg#0*kh Zg#.f  eE   *©2#Ԃ{?T:W 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?h2W 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?h2TjDZjDW tX:#xxtXD Zg#0"h Zg#&e?E? & f Y<W Xj'eXD?hk@?hu~@?hT[@A-@A-@R@ Zg#0Nh Zg#R  0 B ` TR RA-?hT[ ?hT[?hu~&A-:A-?hT[ @?hT[F?hkLRN?hu~W 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|DW 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?hcM00%\ 1g\?hu~j3el?hyrj/dvA-~?hk(| `   ?hT[?hT[?hBx©2FW LRy:LDs@@ X:0Zg#0R68h X:A? Zg#VeE & m*  * * *bFX: X: s $X: *X:*6X:*>X:*HX:*&W <0zy:<0D#@@$9@W@A-@A-@h'@R@?hBx@jTG@lE@©2@:[/d@k@ X:Zg#06;h X:# Zg#vw 7 7 7  W, 7 7 # %* 7 7 W A-A-R©2&[/d?hBx 0k4A-8?hBx ?hcM ?hcM&*03e2?hyXW 0z0qX0D#@?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?TW 0z0q8 0D#@?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:0?h24jTGFX:LX:V{#h Z?TW LXB>sLXD@ Zg#04h Zg#8B B  @`   B`.W 0z` 0DVN@3eH Q?hcMH?hkH?hu~H?h2H?hT[H?hBxH?hyHX:j2hA-hA-hRhjTGh X:     &,,:VN>W 0z8 0DVN@3eH Q?hcMH?hkH?hu~H?h2H?hT[H?hBxH?hyHX:xRhhA-hA-hRhjDh jTGhjGhjjHh X: &&::VN.W Xj~XDGG@@jS@N`r@ Zg#0\=HhNcMhhB Zg#`   00%&TADATADATADATADATADATADATADATADATAv  m ` @ 8N`r GGN`r jS6N`r:jSNN`rZN`r?hT[H?hBxH?hyHX:xRhhA-hA-hRhjDh jTGhjGhjjHh X: &&::VN.W Xj~XDGG@@jS@N`r@ Zg#0\=HhNcMhhB Zg#`   <0W  1>+"+"+"+"+".+"1+"y+"+"L +"r +"w +"Y +"K+"R+"n+"+"+"+"+"J+"+" +"+"+"B+"+"+"++"6+"+"+"+"z+" +"1+"6+"B+"+"0+"X+"!+"!+"!+"9"+"D"+"K"+"#+"#+"%+"%+"%+"`&+"&+"g'+"k'+"'+"'+"'+"'+"'+"(+"(+"(+"v8+"8+"99+"`:+"y:+":+";+"A;+"E+"E+"G+"G+"6K+"\K+"iK+"K+"K+"jL+"[M+"xQ+"R+"R+"T+"#T+"W+"W+"NX+"\X+"X+"Y+"Y+" Z+"N`+"`+"`+"e+"e+"kf+"f+"f+"p+"p+"p+"p+"Zq+"`q+"qq+"}q+"kr+"r+"r+"r+"r+" s+"fs+"ys+"s+"s+"s+"s+"s+"t+"w+"x+"Bx+"y+"z+"z+"+"+"+"+"+"R+"Z+"+"<+"+"+"L+"*+"2%% % %k%n%D%%%]%%%%&%'%'%(%,%5%8%@%Q%R%NX%X%kf%f%\g%Iq%Kq%Tq%t%'t%iw%w%ly%y%z% %%%%%ą%Ʌ%%s%%%((z(W(Y(Z(m((Z(@(i(((5WnWWzWWWmWWZW@WiWWW5a8a0MaMaMaMa@`a a8aGaGaGaGaHa0MaMa(dafa a`^aaapaxaaaa!a"a"a"a`'a8a;a#;aWaxZaaЉaa avaxayaaa" a> a? a8a:a:aLaWaWaxZa@`a  b?  bp  b  b0  b% b& b' b' b' b' bP2 b: b: bK b@` bU݁?UKHU-x4j jXHv f.O'6W(h(h(hVVWVXHNVOV1ZX1w2!z&#$${$8$!%V"%#%&&u'&U(&,+.v:-,T[&E`/:d/H\g/q6q6Iq44KqdTq&Uq0Vq0|!t1 Hwdww5)x6x-,7x@xAy&yyyy5ą6^644`{.xbK|`"  !!VH!W!<4`T(l*!*&*'*R*r*Z*o*+d".8}@v~ë~ëKqȫ (ȫ`T(ȫLqoT˫e|@ KA,dLB:L0-s"K<"YT}6RY}6RYZGHjHj<l jl jt!s WT XT VN00&TADATADATADATADATADATADATADATADATA @~D:h;rw Xrx Pry rz 2r{ r| rz4sZ1u1uTK1ucK1uKt1uwL1ux1ul1und1uo1us3u^3u v3uG!3uK3ukM!z3uS".3u^!3u_#3uIq$3u|q3uIt44u%!$4u;;$84uH;$4ug,5uZ%V5up%5u|q5u˖5u5u$%5u%%5u>n6u" &6ut:&6uMq'66uw(6uw(7u(h7u`"+7ub"+~7u2g,9u,9uf',9uS9uX-,=ul(=u=ux=u=u=u=u<-=u==u'-\=uYH-?ud/?ud@u# /H@u~q@u`/Bu0<Bu0BuW!0Buq!0|Bu"1 BuK1BuM2Bu9T3Bu;TfBu=T3Buw3JBuwBuwBBuz}3Bu}3BujBuBu44Bu64Bu+Bu5,Bu*Bu 5zCu 5Cuz5Dus5EukYEud6^Gu6Gub Gur Guc}6RHud[uE6[ukM8[u`8[uq9X[u|q9\u%!9\u;;9_ud_u`"_uw::fu[:gud;hud;huw=Zhu>hu`?ju[KVlus@mudA,mudB:ou~B@u'Bu#C@ukMCu`CuqDTu|qDu%!Du;;Eu$Exut:Fu`"uwHuC^HudJuwK<u`KHudL0ueu[MMudMFu'OufsPpuLyQuySukMSpu`S uqTu|qTHu%!Tu;;UuNbuwVut:VLu2XWu HB bpH%HpYMHp[MH@b&HavHpcMH zky:H%\gHk:HkJH bفH!k:H b4H%&H+"(HkH%'HaH8+"H` bH,(YHz(HpYYH% H a؁H: bH@aH< bH0%Hp;YH b؁H.a(H> b(H2+"EHP+"xQHbp HzaPH@+"HbYH%'H@ bPH4(ZHbxH2p Hk4KHkH bpH bpqH%H%HWnH z bxH6%H bvHpYHb`Hk^KH bH<pWHpnHPplH%tHb`H b`H bH>%'tHz bHb`H bH8a8Hb`H bȂH:b`H%HkWH pH#z zH+"RH@k,Hk+dH+"LHzpٚH@b00&\ 1ghH +"H+"H%(H%@H pwHaGH1aGH(p7[H aGH&%5H0(WHaH&aH&zb H axHaGH&a!H+"HaH(kHH8+"RHWiHW@Hbp HpH%ɅH +"HPb`rH$z+"JHpHa(dH%ąH b0 Ha@`H b@`HbHH&bIH+"GH@b[H+"H+"wH+"GH0p`Hz bHa;H bxH+"BxH+"HaHH%QHa8H +"#THayHk<H+" H(Ha"H+"xHza"H a"H2+"THkyqH+"1H bӞH+".H bQ HP+"HpH b` Ha#;H %H b`rH6%H!z+"Hk%H+"v8H%H@WmHb H+"`H0+"yH+"N`HPa HB bpRX5 frUOr3uSOD 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Ê֥  PzUNE:3u_NEDS~@ &h  0w S~UNEJ3uIqNEDJ@S~@ h WTl  WTjjJ w S~zUNE:4u%!NEDS~@ h  Dw S~zUNE:4u;;NEDS~@ {h  4w S~UNEJ4uH;NEDS~@pŜ@ h WTd  WTbbpŜ $w S~UNEJ5uZNEDi5u@S~@ !h WTn  WTlli5u w S~UNEJ5upNEDi5u@S~@ "h WTn  WTlli5u w S~NUNE25u$NED 5u$ UNEJ5u%NEDS~@@ #h WTf  WTdd (w S~,UNEz6u" NED@S~@ȫ @@©#@  T[hu'h U(hAyhTqh WT^   WTRR ©#VV ZZȫ $P TX`dw"S~zUNE:6ut:NEDS~@ &h  Hw S~UQz6uMqQDN@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œE00&\ 1g¥" t4 w  LnN r@.ub  e t 4 @eLW-, t 4  && 4l HTZXNUNE26uwNED 6uw NUNE26uwNED 6uw UREz7uREDs@&@\g@o@E`@,@&@@:d@@ 7u @"hhh 7uw 0 00 ppM $w`w \    .%w0"0o| ep" lp0  *" ` D `WaWz 0,\g:,wɥ;&ww%7   Hw ŀ&  Հt &^&` `^V `W-ŀ `w4wrw xo ɥ@0 p @ @  ^ 0 00lw&^&` `^w T-00 00000Uj0 0000% w  \" 0 U%  "o>&deE 4`0  (e)Ej0`0^ 0n5j ^h h :&X:dp|E`dU% e)0)f  2נ/נ נ   נ נ RՀC$szUNE:7u`"NEDS~@ ,h  8w S~>UOR7ub"ODɪh@9@ZX@ 7ub" ݩ[}h 7ub"  "` &&   f&& ע , , A` 9ZX@ɪh | & ɪhUOEB7u2gOED 7u2g dhکGh 7u2gh   eAm:CEeB@ & &  CR  &VPNUNE29uNED 9u NUNE29uf'NED 9uf' lUNE:9uXNED 6xhv:h UN:=u<ND =u< \̪a h =u<` +3 3@    NUNE2=u'NED =u' UNEz=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~UNER?udNEDS~@(X@pŜ@ E`h WTj  WThh (XbbpŜ w S~zUNE:@u# NEDS~@ :dh  w S~zUNE:@u`NEDS~@ 00&TADATADATADATADATADATADATADATADATA\gh  <w S~NUNE2BuNED Bu NUNE2BuNED Bu UNEJBuW!NEDi5u@S~@ Uqh WTn  WTlli5u w S~UNEJBuq!NEDi5u@S~@ Vqh WTn  WTlli5u  w S~UNEJBu"NEDS~@<@ !th WTZ  WTXX< \w S~UPjBuKPD5 @l @l @V@L@ BuK hZXh BuK#  0 µ1!0  5 55   e5& Y55 `l fl | T SP K  E > 5&@@   ) % e  C:LXV   r  &V p 0 p 0    5ztw     @  ppp 0 0 0  1 1 1 l &UPZBuMPD5 @@ɪh@ZX@ BuM |wh BuM (f& 1, 1, & 4 A`!  && &V 5 ɪh`ɪhfrZXNUNE2Bu9TNED Bu9T NUNE2Bu=TNED Bu=T NUNE2BuwNED Buw NUNE2Buz}NED Buz} NUNE2Bu}NED Bu} UNEZBuNEDj<@S~@ @ Iqhh WTb  WT^^ j<hlwS~6UNERBu6NED`T@@x@©#@ Bu6  4 C:Cm@ 4w4 4  BlW.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:UO:huwOD huw S"h huw@u>u<5256758*A-<?A-<9¥e¥  )`T|e¥ B< Bm>   u:Am<p u@nUNEjhuNEDت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 ɪhUNrhu`NDBK@q@@.@USZ@@x@CO @S"@ hu` U݁h hu`4  S(wG0-"0-$0-& 44 4 00&TADATADATADATADATADATADATADATADATA! + S"USZ "@.TCO zq<|efff@e w  EwBK  @.:@xUNZlusNDȫ`T@W@@x@ZX@ lus h lus@ZT O   ALA4  42$"2&' 1 Ɋ:ȫ`TZ| 8 4 &  5 4 uw$ZX0WX@xUObmudODت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 VWUNZmudND@.@@x@ K@S"@ mud Vh mudZ 5.5-@p7 !w 4 w%S"< K6 @@.X@xNUNE2ou~NED ou~ UQZu'QDl @@ɪh@9@ u' Th u'̥ q"q $e$q "f&   5 f   e v 89Hɪh|," ,$    ," ,$ p $p"$"    l v &V NUNE2u#NED u# NUNE2ukMNED ukM xUPEju`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;EMNUNE2uqNED uq NUNE2u|qNED u|q UPRu%!PDɪh@@x@X@ u%! fePh u%!j@5 N&]0N  m  4  LuLuNw6ɪhNXh@xUOBu;;ODc%@ u;; i{h u;; ( wc% UQzu$QD5 @}@T@ɪh@X@j@Ӫz@X@ u$ }h u$̥ &$ &"& & & ,.6.  .( 66  5 \5 n}|5-6@eL 555 VL <$p"r U 4  e4  TPӪz^Xrj(  L t X ɪhUTzut:TDdw@ɪh@@x@X@y@y@y@é"@("@X@93@ "ut: R@Xh>\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(yV00&\ 1gXj93nXxɪht2 5 ȵȵ-55 ȵȵ et w@ȵ ȵP f 4 U@LuLuNfLV L5 NE@4 4 5 5 5 5 &5 ( L`LXUPBuwPD uw xé"h멀"h uw|0W& 55Be,( * E    RR @LUSEzuC^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\bZXUNEzudNEDDZ@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~ UPBuwPD uw "hS"h uw 0W:@Ae,( * EQ    QQQ *A-<|A-<LUPru`PD@X@ɪh@@x@j@S"@̪a @X@ u` Uh u` w4 4  W mѕ0Q<Q=0 )CmѐѐCB" B  S"(@X2ɪh~̪a |C<B> 4   4 4 e t L@uLuNw4 4 5 5 5 5 &5 (4 ̪a  X\@x  jUQbudQDɪ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@xUSzu[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}USBu'SDɪh@ u00&TADATADATADATADATADATADATADATADATA' 6`Th u':& B  p p- ɪh*UORufsODɪ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 fUzJuLyzD@̪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¥ @@`pUP:uyPD uy #sh uy 4 UNEJukMNEDs@DZ@ ukM (Dbh ukM,   m@ w$s*DZUPzu`PD@s@;OM@;EM@@@x@" @9@93@ u` ;_hG\h u`   w ?  l@ 4( AN &f 6 t%w,93" ;OM"" @s`|@xP|        l@  w 939&BsN;EMNUNE2uqNED uq NUNE2u|qNED u|q UOzu%!OD0 @ë@@.@w@s`"@ɪh@@x@©%@ u%!  e-Ph u%! n&  w5 A@,   K  C.`,U@ ”Ee 1s`"0 ë @.N0 Vɪh|>& & Д 1  #.504  @0A.B> @m: 554  6wL©%zw4w@x UOju;;ODs@c%@@9@93@ u;; Pi{hi|h u;;T  l@      Ü( w s"9349BRc%UNEBuwNEDK@ uw  s`"h uw$5 5 5 ,25 4\w"KUOEzut:OED2g@©w@@.@©E@w@ީ@@x@©qq@w@93@ ut: |\h ut: +www @ 55w  4 wkw©w @.,©E& 0@.6©qq0 :@.L2gbީf93vw~@xUOzu2XODG@G@w@ɪh@کG@8@ݩ[}@ u2X CWThlhC{Qhr  u2X5 84 595 - 9\  I' Q5KA@!Af9f:00&\ 1g: 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ɪht5UOruB@ t 5 : ݩ[}.ɪh68tUPzu=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<u> 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 UPrurPD5 @,#@w@@ɪh@ZX@ݩ[}@ ur ©,`h ur&D4 4  Bm@.C@# UE;C@ @<’ <,#^5 x| 4-   t4      && 5fLV & ݩ[}ɪh>wF,#ZfZX(UNjuVsND0 @5 @w@ɪh@©s@93@ uVs h©qqh uVsl@ A B4tE@P 4    5 <fLV &*0 :w@93D©sNɪhT5 USjufsSD0 @5 @w@ɪh@ZX@©%@ ufs &©sh ufsf@&  E `9J@m:ȵPD& & EeeҔ ȵ    &70 *©%|4  v&  - @eL4  0 e0wT5 jwt5 2&& @  fLV ZX(ɪhUNRu}sND0 @5 @Oy@ u}s L©wh u}sP@4 @0 5 354444w0 5 NOy>UPzu`"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@xwUNzuEND5 @@Cz@4}@ɪh@YT}@900&TADATADATADATADATADATADATADATADATA@ZX@ uE ,#h uE   "`   %+%0   C@ % & 94YT}:4}JɪhNCzT5 H|    "`&& %` fLV .ZXUNJusNDުE@̪a @ us 2gh usBm:@@4 Ee4 e @EC% >@t<@  ` 0̪a |ުEv|'t< 4  t t  t. t0 t24445 5 55B> ުEUNBuwND uw 0`"hwh uw4 55 596UOEZuOED2g@w@ɪh@̪a @ u Kqh uP 5@=  (4    A@ ɪh2gLw|uw̪a U{zuE{D3@8^@`T@@.@w@@e@ɪh@ɪh@ @CWT@ުE@b`@ݩ[}@̪a @ uE @Wh.h@Yh@`h3(#hxh uEA65 6  ,L6w,wBwE8 @@8A6 Bɪh832 <@.P8^J T@.j |w t 6      33 p6p8 w4  YC+ݩ[}ɪh*`Tbe f@.@    tt  0wE8 1 h@8A6 &t 6E1CWT08^" 4@.J `ݩ[}nɪht w564  5 6e&V B@    ,#ѐ+`T `x @.,wTw   ` , C@ E ,,-B mf m C:  p̪a *ުE<̪a z̪a Rl0ѐeBe. ,,ѐeBe2  ̪a J̪a NުEUObuHOD@W@@Y@ȫLq@@`@x@ uH 3h uHB@ Ev .Ba ,` m62Ba ,,` m6 Bm:e6,m xRAm6u-:6  , f6,N &0  (GBt0%,, B:m ,, , #s&U|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 E00&\ 1g`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 UORuODɪ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ުElmv` r19  CCeeu,B``(̪a vl ѕQ,5,6 r :5:B:m e e e m mw̪a UORuODȫ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,UN:uNqND uNq $0 h uNq(& 5@ \UybuLyyD@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 UREJu;;RED̪a @ u;; HȫLqhުEh u;;L b @@& e$cÒE eccBm>  B̪a URzu,FRD8^@,#@`T@@.@w@@ɪh@ @Ӫz@ݩ[}@ZX@̪a @" u,F Ӫ8h u,FC@f44 4 00&TADATADATADATADATADATADATADATADATA wt& 24w@C@5-wC@E8- %$,#^8^X b@.~ |Cu6.u80wC@E8- +C@  L"u.6u08wC@Ef885- 8<8^ @.2 V8^ Z@.x - wrC@œ @8A6 b & p- C@W-  u62u840ݩ[}>`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ɪhUORuLODɪh@ݩ[}@ uL 0GhGh uL4   t "ݩ[}0ɪhjUNEzudNEDs@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 ֵ$UOZuwOD0 @+d@ުE@EH@ uw S`"h uw00&\ 1g@Du>u<*A-<[A-<U   ¥A-<@p-<\0 |< 9   9&  595 44 4 4 4 44  +d&EHHުE USEzu`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ɪhUOzu,`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*UNRueND0 @ɪh@ëKq@ ue Kh ue5 =7 3 -:p-:& B6`Ee & &   t u6:u6. 0 $ɪh8ëKq|0NUNE2ueNED ue UwZu[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(EHUOErulEOED0 @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ɪhUN:uGND uG ëKqh uGC:6`” A@µEe   A@ ˊפ ` El |`: UvEbuLyvEDG@ɪh@@@̪a @ uLy ˫eh uLy00&TADATADATADATADATADATADATADATADATAtF 6    33 ,B:m`6 v: p: p0ɪhp̪a | ,1e B:`C:p: e&@@ʵ, p0 ,u-6: G^̪a "Am: Am6 GUOzu8OD5 @@.@w@@©,`@3(#@ZG@@ u8 h u8 A@A 85 : "` 9pL5 N w,  &&A1©,`0`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@.VUTzufsTDw@@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*hwVUPRuwPD0 @K@+d@ uw "h uw5 4\ lB  u>u<¥*A-<'A-<!  Kz0 >| ¥A-< p-< 4 (+dUNZuLNDw@4}@YT}@ݩ[}@ uL tZGh uLxff f4  e4     "`  4  $wB4}Vݩ[}`wpYT}UNEzBu;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 |yUSzudMSD5 @}@@Cz@4}@s@ɪh@YT}@9@ZX@Ӫz@ u[M ,h u[M00&\ 1g@L& &2LwF8W8  `     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}USEzulSED0 @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ɪhUOzu8OD5 @@.@w@@s@©,`@3(#@ZG@@ u8 h  u8     85 : "` 9pL5 N w,  &1"©,`4@ZG\3(#V `@.t5 4|&A6 5 6 4 & w w2sfUUzudUD0 @5 @ë@@.@w@@h @ɪh@@x@"@ZG@;8@RӪ8@ëKq@EH@@EH@@ ud Z-h ud w u4t@m:e &@@u-,  95 4w6 & , w&  uLu"ɪhHEH|Nw 5 , 595!t wf65 6, v 5@4u<u>`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 6EHL00&TADATADATADATADATADATADATADATADATAë. P@.hUNz3uKNDs@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@xUNz3u|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 8UNj3uItNDDZ@7x@@x@V@:@,Pd@ 3uIt 8J|h 3uIt< &&e eLPuw w&,Pd:7x.DZ6V:@xUShz4ugShD:p@@Cz@4}@ɪh@7x@@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ɪhHCzUNz5u|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ΪWp58500&'\ 1gΥ  ` % 51 1 5BBl>ʥ]ʥ: N('.rl Nҕ. L&Bl.0Ҕ lȊ `Ewe  w @ ( CBojyZ a   e%/e.Ґqӥ0    eTUQz5u>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ӪzfUNEJ9uSNED 9uS  ZTT VNhRrQhRUOz=ulOD:@@.@7x@@x@©#@,Pd@ =ul ȫ`Thȫ h `Thh&  =ulG "Q5 ,,@  4  ,  LB&   wW-L0p©#j t@.P| uLuNw p H Wp&V @x ,Pd,:07xUNz?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~"UNzBuwND5 @v~@$9΅@L@@.@Dq@s@]f@ Buw shzshRshshsh@haeh`"h DZhP7wh@.hC29h;PMhbZhLsh ɪhhz@xhn7xhɪhhVh|h$@S~h,@R~h" hx.hjVhzC8hDZhT.h\,Pdh2yhH  BuwveN*PU5D e0  S  ,rw ` 4@  %P $ :v~|N05E65Q M ̥ I5 5A@p 8 ȥ 45  % D`P`_ ,/O&PXVUTSEEuB 5 =/5 *@ %E E E  Mt͊    ` ͊ udEE5 p U 5@\ .% - / ,3e"5550% @L @ R , %P Eewu00&/TADATADATADATADATADATADATADATADATAp1 b5 6L^]fl E #  *  P P 1u A  ) DqDqLsV$9΅fL H@ D,  4     &f 5 FP5 z5 dD̥  w f 2 & 2r  4  8 <0w d& l   &ap aB#E   *   uD5e`w e\E< .f 2  , ,p l J a b!. UNrBuND5 @}@l @@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 BBd00&7\ 1g5; ' Ee0 TT;VslsnT;wV &  N #  e0 `IҐ `e   8(UPbEukYPD5 @7x@Y}@:+@,Pd@ EukY vLh EukYz 1  ̥ @ $ ! 1  ŀ f&& pp   5 Y}X,Pd\:+l7xUN(RGur N(D7x@:@,Pd@ Gur PYh Gur T& e &  eL5 N.,Pd6:@7xUNEzueNEDT@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||UNEB=uNEDrQ@ =u  ZTT  ZTRRrQ`UNzBuwND5 @W@v~@Hw@$9΅@L@v@@.@Dq@s@]f@z Buw shshBshsh@hDaeh`"h DZh7wh@.hC29h;PMhZhzshɪhh@xh7xhɪhhVhlh@S~hx@R~h" hh.hZVhjC8hDZhyh8".hL,Pdh"sh BuwveN*PU5D e0  S  ,rw( ` u J AeLKUˊ#:v~|E@ * P5" < 05EB5 J HˋQ M ̥ I5 5A@p 8 ȥ 45  % D`P`_ ,/O&PXVUTSEEutB 5 =/5 *@ %E E E  M͊    ` ͊ ugEE5 p U H  5@\ .% - / &,3e"5550% @Ll @   %P Eewup1  5 E #  | * j L.]f^DqjDqP PJ!  e.( 3  H 1u= (  4 F!$Hw HsR$9΅rDq dHE} H A  )   Hs3(f A-fL* H@ Dq"WDvVv~t5  D,*SAe@``f A 4     &f D>H5 r5 \̥  w f 2 & 2r  4  8 <0w d& l   &ap aB#E   *   uD5e`w eE< ~T.f 2  , ,p l J a b!.UOEJGub OED@@ Gub YT}hY}hV Gub @ BeE3   0 f   @ B fE 2 >@|  WNR1uND 1u ldwhyh8yhyhR 1up  C A @   f A #  &  m 5 f eC tWPEz_u`"PED5 @q@N@SZ@@.@@x@00&?TADATADATADATADATADATADATADATADATAé"@"@ک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@xWSEz_udSEDتW@q@W@X@W@CO @ZX@̪a @ _ud jSZhکKh  _ud @31  4 UB8 _3% C7 B" 2ZX>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 \ 8wwLWRzu`"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   @xdjfWEzuED8^@ȫLq@`T@@.@w@#e@"s@ɪh@=x@ @CWT@=h@JZX@ݩ[}@̪a @s@ u Fh=h u5,ww,w.wf,5-  w,, x@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 ,,w8ZXt4t2t0t. 4 u6  ,  wHw.Bm:e%8CWTHwTs> X@.6la ,4  u6  w4 L5-efLV B@ ѕ̪a .CWT@wbeQ- ,ѕѕ Ce QQCB <̪a ^̪a WOzuNOD5 @w@©,`@ZG@YT}@ëKq@@93@̪a @ uN l,xh 00&G\ 1g uN5 0 ; : .984   5 : 58U B@ "`B@-   ,w6©,`F93RzYT}|w p-x9#W-00A@  V x9 @Q0 A@B6`ZG^ëKqrëKqeõE`e& N e @,A6`B:` pf:` 6 d w B6J2ҵ  H̪a zt 0 4 fNfL %fLV Ee& &   t 5 6wXWNz1unNDS~@[@)x@[o@ @($HrQ@ 1uo :KqhxR~h ZT&  1uo>w & 7.*.e.J [[o)x.* [o&)x.([o0)x<)x. ZT"" 1uo 1uoWNz5uNDt!@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&KqxWNz=uND.@`"@[@Z@@R~@[o@ =u \WhL}hR~hXv~h>JHwhTvhPh hT.h6DqhHh]fh  =u`n flf ws$e$fL " . {"{^{`ww& .Z*[.[oZ`"^@R~l WOz@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~Zae6s00&OTADATADATADATADATADATADATADATADATA8$99FɪhL.  1 1 &V l ZXWNzueNDs@}@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}00&W\ 1g\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 ɪhWNrrw NDJ@i5u@R'@DMw@@G@Ӫ@(X@pŜ@ $rw  ( wwwwwwww2 @GR'i5u(XJpŜ"DMw&ӪWNzrx NDt!@@@j<@ݩ݁@@@G@ȫ @ @]\@@G]\@JU݁@i{@<@eO@©#@Db@ Lrx  P wwwwwwwwwwwwwwwwwwn @GDbG]\i{eO"]\&ݩ݁*U݁.2©#6:ȫ >B<F Jj<Nt!2WNzry ND@JE$@ݩ@@G@\@@G\@U@eP@i{@(E$@ 0ry  4 wwwwwwwwwwwD @G(E$JE$G\i{eP"\&ݩ*U.2WNjrz NDDb@ݩ-@@G@\@G\@i{@(m$@  rz  $ wwwwwww, @G(m$DbG\i{\"ݩ-WNRr{ ND-@@G@U-@e-P@ r{   wwww @Ge-PU--WNZr| NDJm$@@@G@,@=@ r|   wwwww  @G=,Jm$WN:=u=ND =u< \̪u h =u<` +3 3@    vWEzuED8^@ȫLq@`T@@.@w@#e@s@"s@ɪh@=x@ @CWT@R=h@ZX@ݩ[}@̪a @s@ u Hh=h u5,ww,w.wf,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 ,,w8ZXt4t2t0t. 4 u6  ,  wHw.Bm:e%8CWTHwTs> X@.6la ,4  u6  w4 L5-efL wB@ ѕ̪a .CWT@wbsdeQ- ,ѕѕ Ce QQCB >̪a `̪a WNz1ulNDS~@1o@ XT@ WT@ N@)x@rQ@ 1uo KqhxR~h ZT` WT 1uo .w4 .C3 3  ,, UEs3w&&D1o)x.1o N4)x.61o:1oz)x&~)x&|1o ZTPP8 1uo8XX> 1uo>\\ WT XT WT WNz1uoNDt!@@j<@J00&_TADATADATADATADATADATADATADATADATA@i5u@S~@R'@@DMw@[@ȫ @ @z@@)x@Ӫ@[o@ @($HpŜ@<@(X@rQ@©#@O@ 1uo :zKqhxR~h ZT& WTtBu;T xUqhIqhd{h0&hDT[h\\gh8u'hThHhlh 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~WNz1usNDy@S~@ XT@ WT@rQ@ 1uo KqhxR~h ZT` WT 1uow v y ZTZ Z$ 1uo WT XT WT WNz5u˖NDt!@5!@Kq@R~@R'@DMw@[@[L @Ӫ@xR~@ 5u˖ zS~h WTt WTh XT XTh YT ZTd)xh HT{{{{{{"{{{  WTff R'n nt!DMwӪ XT  ZT  5u˖  WT ( ( 5u˖666 { { { {  XT 5u˖TT`` 5u˖ 5u˖{  {   {  { 5u˖&f B%p  * ͋'% ͥ!ͥE%,  D5  PB   ZT|2 +%ppJ͵  ) ċ5J J J  v   @VKqKEQI@375J JD4 5@  4 J @ Eͥ ADR~JxR~tA   e@f&f 6 UJ F ^ !EJ s&ՀJ.  ZT 6 ZTT ZTJp[x[L | ZTJ*e Jc&ŀ ZTJ[$[L WNz=uNDs@.@ 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  fuNe.e.(P(eXwZ $^`ߥ(1& & & &   e[K [qr& & a9 e ڇ %  N,%$$9΅s.te% P   w z ,`"%  .wfwwXa ^ @ .=uf@R~=uX< w B x H y N z T { Z | |     $$ ((  ,0<84Xt@D, H   00&g'm 1g WNz=uND.@ 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   hWNz=uNDs@.@ 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 ^ @ .=u @R~=u< w B x H y N z T { Z | |     $$ ((  ,0<84Xt@D, H    WSzBuSD5 @:2@:s@ɪh@7x@Y}@.@:+@,Pd@ Bu l h$*l h$4}h hh Bu jP PH  HP PH f  %5w  # :s>:2T7xlY}r.|5 ȥ ȋ5ȋ1 1 "#Հ && pp f N5 h,Pdx:+~7x'`0  0   &f 0 &V &jɪh&t  K&1 ɪh,PdjP PH  HP PH f  %5w  # :s>:2T7xlY}r.|5 ȥ ȋ5ȋ<0V 0 fP{&{/{S{hgZ&l" T^VM&lsssssr&lq&lDC< $JC8C29D0X^DZDZDbDq$JDMwFo'&lF'&lFr&lF2DFdG?f&lGEf&lLyqDLUsDad^awe^aeaf^ah&le6Vea6Ve6Ve6Vt[S&ltS~$JxR~^x_~$JDZs6Vr;6V4D<&l&l.68D7w@R~@S~}[&l$JӪD00'oTADATADATADATADATADATADATADATADATA۪s,&l۪.&l[S&l &lf&l($VR'RJR|dDRd6VR&l6Vv$J..^W$J[l&lQm&ln&l.$JKqVw6V@xy f&l`"T^V;^hijkl~$Jƫ8DƫDƫD̫&lͫ[S&l00'wm 1g|#|8e|:eZ|vw x 1u,YX1u.Z1u/\1u3_1u`D1uV1ubV1ue*3u|K3u[4u$J4u%=u\HD>ur'D>uT(X>u\(6V>ud(&l@utqRJBu^BuBuswButw!00'TADATADATADATADATADATADATADATADATAUĎ|#ĎL {4fC~w  ~@h"h@{80{&h{ShUĎ|8eĎL {Jw  5E5 ettCtt@@ii@{8F{/hUĎ|:eĎL {Jw5’6t @ vtB@A  6t@@P5 ii@{8F{hghUĎ*|vĎL({8F*kh*hhjhih  {*f f &f$& &ff  UNEzx NEDRd@r;@e@ea@e@e@@G@@s@ (x  ,wwwwwwwww8 @GRdeeea"e&r;*s UNb3u|KNDs@s@@x@V@ 3uK ^DbhDMwh 3uKb  ͥ#@>E5uu  5 w 5uV:sBsJ@xRUNJ3u[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<<UNEr=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~.UNzBu00'm 1gswND5 @v~@.@Dq@]f@ Buw shshshxshshz.haeh`"hDZh7whC29hZh@xhVh&h@S~h@R~h" h".hVh$"C8hDZhyh BuwN*PU5D e0  S  ,rwt ` 4@  %P $ 05.v~|E65Q M ̥ I5 5A@p 8 ȥ 45  % D`P`_ ,/O&PXVUTSEEuB 5 =/5 *@ %E E E  M͊  t  ` ͊ uEE5 p U  Jwup 2E #  *P]flDqxDq&f D̥  w f 2 & 2r  5 l4  8 <0w d& l   &ap aB#E   *   uD5e`w eE< .f 2  , ,p l 4.(dJ a b!HUNEzw NEDR|d@@F2@68@@G@ƫ8@4@ƫ@Lyq@@ƫ@LUs@ 8w  <wwwwwwwwwwwwJ @G4F2R|dƫ"Lyq&LUs*ƫ8.ƫ2686BUNzBuNDs@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 4UNzBuNDs@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  )   Hs3( Aw*SAe@``f D&DqW:vJl~Rt5 ̥  h5uu <#A0< 5 E # *A(lDqt w D j!55 8 8"4 p  0 4 5   N" ; B  ,B D!5 4e ! D5e`w eE< .f .2  , ll,p l J a b!&f vUNzButwND5 @v~@.@Dq@]f@ Buw shshHshshshz.hRaeh.`"hDZh7whC29hZh@xhVhrh@S~h@R~h<" hn.h`Vhp"C8hDZhyh> BuwN*PU5D e0  S  ,rw ` u J AeLKUˊ#E@.v~| * P5" < "05EB5 J HˋQ00'TADATADATADATADATADATADATADATADATA M ̥ I5 5A@p 8 ȥ 45  % D`P`_ ,/O&PXVUTSEEuB 5 t=/5 *@ %E E E  M͊    ` ͊ uEE5 p U H   Jwup 2E #  *&f D̥  ]fud(@QL L{;$        ! "3    .    1 0  (   2\ ((  ) 8  v4()      * .3256 5      EA) ('1PH |?1[ $?1@ 0@` $`B 0 $Gt0 Dz $2/     ( h :   n    z5 @awe@T@T@x_~@@@Rd@4@R|d@ƫ@Lyq@LUs@ƫ8@ƫ@A        6 G(wKB`C E ej$@` e" l0@`2L $ )     ̋ e. (x_~6x_~ @`e leN dBb& " w@ e" ``Je $   e x_~i  @`e leN Bb& ef@W,TwB & NSRf e00'm 1g @   5 BiF5 2Հ$ ʕT2 wAB & NS& N D` 4Հ̕$ x_~,j05 ̕ T4 w@` @E ,Tɕ wA1@ & 2 T1 x_~h5 RhV5 w)v& 0 cfp    e$  wB E ] D! jBTRT 1 0 0&   1  0 5 L& LAa  51 e!   51 0 0e <a  |  sppp PL{;p0)p1(e   K / 5 L   L * a $L{;LTXT| !  5NUpN>!     $ 0 e  x_~8x_~Vx_~l 5N5OUNT  5 N5OU N> ! 5!N5OU0N$ " A ̵W ̵ W ̵  @N   Lew|hdAB T@` ȕȕ ȕ w)v0 0 5 L5 N5 5 5 Tj 0 4Na:Naea>  7@E (   &   "P 4x_~nx_~\@E ,  &    tmE& e w,0 5 L5 N  5CeL&x_~P{/.e6`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_~8  @` WtmN&E& e &     L0 6  *{/@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 ! ! H !!jx_~ze@e@ea@F2@e@68@@r;@s@{/@j@i@h@L{;XFo'hzF'hrhhh:Frh}[hMhnͫ[Sht[ShRh[Sh6̫hN hnh fh[lh(>!!!> 2  L{;NN0 PX R T( V` X Z^ \     " T  Z  `  f  l  r  G>J  N ( P ~ \ ($   2dV@Z۪.hQmh۪s,hG?fhGEfhRG8bahhqh <h hfhlV @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( xX @Hd GrwfBe6     @LE  `  ein`Etm e۪.l `Je̫  `r % f@ I,f 1  @`  A1 Հ @0 @0 w6 6 ̫  4ftj, @6 &` e@`e$۪s,( P2lf& & & &`E5  6e eah0 ~@`e۪s,| lv6eE! 66! 66   v- 6 ah w(5  6 6  ;  6   fla(aa &"~"a @,*,,e,e w@ 5=t"a@` ҁ-&E& e ~E&E&  q`{/ e U& EU& %\ ,tc&E& 6 t*a@`E{/\{/v& 6"]"eE EU E   ̵EU6  & %UE     {/a6 e etm6 e 5  w5  -Le&w uljn >  `5 @t> 6 m @tm&fE"m Et&E e|{hg !cȋ e   oet6 /a mm  Q < 2f0- v`@a> v  v`00'm 1g@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 >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 E00'TADATADATADATADATADATADATADATADATA!!  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.V #@Q>ur'#@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 |00'm 1ga  @6av e a efA 2  fAqLq a ae a T e6v aa  qtqf ea ewABa 6a  @6       q iLq     &        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 6@`TB` e6 6    mW XW UW:HW"Fm6 -:!6 amZ6-E U@ @`-Y3 6V-"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{;8V 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 ˋ˥ ˥ V Nz1uNDRd@r;@@e@ea@F2@e@S~@e@68@[@@zƫ8@ XT@ WT@4@ƫ@Lyq@@ƫ@)x@tS~@LUs@[o@ @($HrQ@Js@R|d@ 1uo LKqh ZT` VT& WT 1uoP 5 5 & 7.<.e.P tS~"[*[o,)x.0<2[o8)x.:[oB)xN)x. ZT"" 1uo 1uo\\t$ WTt XT WTr VV  VT VT*tRde e eae4F2R|dƫLyqLUsƫ8 ƫ"68$&r;(sV NE>uT(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( xX @Hd GL D0Xad:5 @D0X@ad@L{;whG8ahhVV Nz1u,NDS~@lS~@1o@ XT@ WT@ N@)x@rQ@ 1uo Kqh ZT` VT& WT 1uo .> 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   VTV Nz1u.NDS~@lS~@1o@[@ XT00'm 1g@ 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   VTV Nz1u/NDt!@@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~0V Nz1u3NDy@S~@lS~@1o@ XT@ WT@)x@rQ@ 1uo Kqh ZT` VT& WT 1uo 5V .* 54 .C3 3  ,, UE:y1o)x.* 1o$lS~F)x.H1oL1o$|s3w&& v  )x&)x&1o ZTPPJ 1uoJX XP0 1uoP 1uo WT  XT WT VV   VTV Nz1uNDRd@r;@@e@ea@F2@e@S~@e@1o@[@@zƫ8@ XT@ WT@ƫ@Lyq@@ N@ƫ@)x@tS~@LUs@[o@rQ@s@68@J4@R|d@ 1uo Kqh ZT` VT& WT 1uo .* 5 54 .C3 3  ,, UE:1o)x.*1o N$tS~F)x.H1oL1oP|s3w&& & 7..e.Z)x&)x&1o"[*[o,)x.02[o8)x.:[oB)xN)x. ZT"" 1uo 1uoPPJ 1uoJXXP 1uoP\\  WT XT WT VV  VT VT*tRde e eae4F2R|dƫLyqLUsƫ8 ƫ"68$&r;(sV Nz1uNDt!@Rd@r;@@@e@ea@J@F2@e@i5u@S~@zR'@e@@68@DMw@[@@ƫ8@ȫ @ XT@ WT@4@ƫ@ @Lyq@z@@ƫ@@)x@tS~@Ӫ@LUs@[o@ @($HpŜ@<@(X@rQ@zs@©#@O@j<@00'(TADATADATADATADATADATADATADATADATAR|d@ 1uo LKqh ZT` VT& WTBu;T xUqhIqhd{h0z&hDT[h\\gh8u'hThHhlh !thXU(hLhhwhE`h,h4h(!hZ&h,Ayh`hąh<"h #h$:dhVqhTqhPh@ 1uoP 5 5 & 7.<.e.P tS~"[*[o,)x.0<2[o8)x.:[oB)xN)x. ZT"" 1uo 1uo\\t$ WTt XT WTr VV  VT VT*|Rde e eae4F2R|dƫLyqLUsƫ8 ƫ"68$&r;(s WTP(Pv©#O  <ȫ  j<pŜR'(XJ i5u"t!$DMw&ӪBu;T|531/-+)'%#!   erwzS~&V Nz1uNDRd@r;@@e@ea@y@F2@e@S~@e@68@[@z@ƫ8@ XT@ WT@4@ƫ@Lyq@@ƫ@)x@tS~@LUs@[o@rQ@s@BR|d@ 1uo VKqh ZT` VT& WT 1uoZ 5 5 & 7.<.e. v PytS~"[*[o,)x.0<2[o8)x.:[oB)xN)x. ZT"" 1uo 1uoZ ZL( 1uoL WT XT WT VV  VT VT*tRde e eae4F2R|dƫLyqLUsƫ8 ƫ"68$&r;(sKqh ZT` VT& WT 1uoZ 5 5 & 7.<.e. v PytS~"[*[o<0W ,@  P> WT  Hz I|S:    :R  D  3 Tz {N` ! " !w* 2 #N5 %b; , G - \K .zK [=M RK ZaT h_ E^T` ~zd 2d e 7f Jq`0:w =x Xx ,My xMy3yHz Jz} @ \ kTW  .MACRO CUCDF$ X,Y .ASECT .= U.CW2+2U.ACUR:'X .BLKW 1U.NSYN:'X .BLKB 1U.NSYC:'X .BLKB 1 .= U.VCB+2U.PHDR:'X .BLKW 1U.RCHK:'X .BLKW 1 U.QSYN:'XU.RCAC:'X .BLKW 1U.RBUF:'X .BLKW 2U.RCNT:'X .BLKW 1U.SVC:'X .BLKW 1 U.TXCT:'XU.INTP:'X .BLKW 1U.SYNC:'X .BLKB 1U.MPN:'X .BLKB 1U.RFRK:'X .BLKW 1U.RFPC:'X .BLKW 1U.RFR5:'X .BLKW 1U.RFR4:'X .BLKW 1U.RFCT='Y U.TXCT+1 .PSECTU2.HDX='Y 100000U2.LIN='Y 40000U2.CTS='Y 20000U2.SWC='Y 10000U2.ONL='Y 4000U2.HPT='Y 1000U2.HRC='Y 400U2.RCV='Y 200U2.ACU='Y 100U2.MPT='Y 40U2.FTM='Y 20U2.SFL='Y 10U2.RFK='Y 4U2.SYC='Y 3U2.TXA='Y 2U2.SNC='Y 1 US.SYN='Y 1TU3.LOK='Y 100000U3.RPD='Y 400U3.RAC='Y 200U3.SND='Y 1 .MACRO CUCDF$ A,B .ENDM .ENDM4W  .MACRO CVCDF$ X,Y .ASECTK .= V.IFWI4V.CPRT:'X .BLKW 1TV.CLUN:'X .BLKB 1CV.CMPN:'X .BLKB 10V.CSTS:'X .BLKW 1V.CST1:'X .BLKB 12V.CNID:'X 00(m 1g.BLKB 1OV.CUCB:'X .BLKW 1TV.CMPL:'X .BLKW 1'V.CNPN:'X .BLKW 1 V.CMBC:'X .BLKW 1 V.CRED:'X .BLKW 1 V.CNHD:'X .BLKW 10V.CTBL:'X .BLKW 1V.CRBL:'X .BLKW 12V.NXHD:'X .BLKW 1TV.CDBC:'X .BLKW 1CV.CIAD:'X .BLKW 1'V.CICT:'X .BLKW 10V.CSAD:'X .BLKW 10V.CSCT:'X .BLKW 1V.CMXI:'X .BLKW 1.V.CMXO:'X .BLKW 1.V.CTDH:'X .BLKW 1V.CTDT:'X .BLKW 1 V.CSTQ:'X .BLKW 2KV.CLMT:'X .BLKB 1TV.CTMA:'X .BLKB 1NV.CLMR:'X .BLKB 1NV.CRMA:'X .BLKB 1SV.CMCT:'X .BLKW 21V.CRPC:'X .BLKB 1DV.CRPL:'X .BLKB 1BV.CRTM:'X .BLKW 1LV.CREP:'X .BLKW 1NV.CBCC:'X .BLKW 1CV.CDCC:'X .BLKW 1DV.CURH:'X .BLKW 1DV.CDLE:'X .BLKW 1LV.COVR:'X .BLKW 1LV.CRST:'X .BLKW 1DV.CALF:'X .BLKW 1CV.CREA:'X .BLKB 1D .BLKB 1 .IF DF C$$ACUV.CTPN:'X .BLKB 12.K .ENDCV.CLEN:'X .BLKW 1. .PSECTB VS.SEL='Y 100000VS.FIN='Y 40000VS.REP='Y 20000VS.RTR='Y 10000VS.STK='Y 4000VS.STR='Y 2000VS.ACK='Y 1000VS.NAK='Y 400VS.MPT='Y 200VS.DIS='Y 200VS.CTL='Y 100VS.DAT='Y 40VS.SYN='Y 20VS.POL='Y 10VS.ONL='Y 4VS.BOO='Y 2VS.TRN='Y 1 .MACRO CVCDF$ A,B .ENDM .ENDM4 W  .MACRO F11DF$,L,B,SYSDEFA .ASECTK.=0V.TRCT:'L'.BLKW 1V.TYPE:'L'.BLKB 1$ VT.FOR='B' 0 VT.SL1='B' 1N VT.SL2='B' 2B VT.ANS='B' 10 VT.UNL='B' 11V.VCHA:'L'.BLKB 14 VC.SLK='B' 1 VC.HLK='B' 2' VC.DEA='B' 4K VC.PUB='B' 10& VC.DUP='B' 20 ; Duplicate volume name VC.SIL='B' 40 ; Silent modeV.LABL:'L'.BLKB 14V.PKSR:'L'.BLKW 2T V.SLEN:'L'V.IFWI:'L'.BLKW 1SV.FCB:'L'.BLKW 2V.IBLB:'L'.BLKB 1BV.IBSZ:'L'.BLKB 1N .BLKW 1V.FMAX:'L'.BLKW 1BV.WISZ:'L'.BLKB 1V.SBCL:'L'.BLKB 1AV.SBSZ:'L'.BLKW 1EV.SBLB:'L'.BLKB 1V.FIEX:'L'.BLKB 1 .BLKW 1V.VOWN:'L'.BLKW 1BV.VPRO:'L'.BLKW 1NV.FPRO:'L'.BLKW 1VV.FRBK:'L'.BLKB 1NV.LRUC:'L'.BLKB 1' .BLKW 1V.STS:'L'.BLKB 1 VS.IFW='B' 1V VS.BMW='B' 2VV.FFNU:'L'.BLKB 1UV.EXT:'L'.BLKW 1V.HBLB:'L'.BLKW 2.V.HBCS:'L'.BLKW 2 V.LGTH:'L' .ASECT .=0.M.LNK:'L'.BLKW 1M.TYPE:'L'.BLKB 1' MT.MLS='B' 1CM.ACC:'L'.BLKB 1M.DEV:'L'.BLKW 1M.TI:'L'.BLKW 1 M.LEN:'L'. .ASECTB.=0BF.LINK:'L'.BLKW 1F.FNUM:'L'.BLKW 1AF.FSEQ:'L'.BLKW 1E .BLKB 1F.FSQN:'L'.BLKB 1'F.FOWN:'L'.BLKW 11F.FPRO:'L'.BLKW 1BF.UCHA:'L'.BLKB 1NF.SCHA:'L'.BLKB 1VF.HDLB:'L'.BLKW 2NF.LBN:'L'.BLKW 2F.SIZE:'L'.BLKW 2:F.NACS:'L'.BLKB 1=F.NLCK:'L'.BLKB 1 S.STBK='B'.-F.LBN F.STAT:'L'F.NWAC:'L'.BLKB 1' .BLKB 1 FC.WAC='B' 100000 FC.DIR='B' 40000  FC.CEF='B' 20000L FC.FCO='B' 10000KF.DREF:'L'.BLKW 1CF.DRNM:'L'.BLKW 1F.FEXT:'L'.BLKW 1.F.FVBN:'L'.BLKW 2EF.LKL:'L'.BLKW 1F.WIN:'L'.BLKW 1 F.LGTH:'L' .ASECTK.=0 W.ACT:'L'B W.BLKS:'L'W.CTL:'L'.BLKW 1 WI.RDV='B' 400' WI.WRV='B' 1000 WI.EXT='B' 2000 WI.LCK='B' 4000 WI.DLK='B' 10000D WI.PND='B' 20000B WI.EXL='B' 40000E WI.WCK='B' 100000W.IOC:'L'.BLKB 1W.STS:'L'.BLKB 1 WS.MDL='B'1W.FCB:'L'.BLKW 1W.TCB:'L'.BLKW 1W.UCB:'L'.BLKW 1W.LKL:'L'.BLKW 1W.WIN:'L'.BLKW 1 .IF NB,SYSDEF .IF NDF,P$$WNDKW.VBN:'L'.BLKB 1 W.MAP:'L''W.WISZ:'L'.BLKB 1' .BLKW 1 W.RTRV:'L' W.SLEN='B'-4 .IFFLW.MAP:'L'.BLKW 1 W.SLEN:'L'.=0 ASSUME W.CTL,0. .BLKB 1W.USE:'L'.BLKB 1W.VBN:'L'.BLKB 1W.WISZ:'L'.BLKB 1= .BLKW 1 W.RTRV:'L' .ENDC .ENDC .ASECTW.=0=L.LNK:'L'.BLKW 1L.WI1:'L'.BLKW 1L.VB1:'L'.BLKB 1L.CNT:'L'.BLKB 1 .BLKW 1 L.LKSZ:'L' .PSECTB .MACRO F11DF$ X,Y,Z .ENDM F11DF$. .ENDM F11DF$p W  .MACRO CCBDF$ L,B,LST .IIF NB LST .LIST .SAVE .ASECTP.=-2C.URM:'L' .BLKW 1C.LNK:'L' .BLKW 1'C.RSV:'L' .BLKB 11C.BID:'L' .BLKB 1N C.XACP:'L'C.NSP:'L' .BLKW 11C.LIN:'L' .BLKB 1C.STA:'L' .BLKB 1.C.FNC:'L' .BLKB 1LC.MOD:'L' .BLKB 1BC.STS:'L' .BLKW 1 C.BUF1:'L'C.BUF:'L' .BLKW 2C C.CNT1:'L'C.CNT:'L' .BLKW 1: C.FLG1:'L'C.FLG:'L' .BLKW 1.C.BUF2:'L' .BLKW 2C.CNT2:'L' .BLKW 1C.FLG2:'L' .BLKW 1.$$$$.=.C.ADD:'L' .BLKW 3.C.PRO:'L' .BLKW 1M.=.$$$$.C.XPT:'L' .BLKB 1.C.XID:'L' .BLKB 1TC.X25:'L' .BLKB 1TC.XT00(TADATADATADATADATADATADATADATADATAC:'L' .BLKB 1C.XPLI:'L' .BLKW 1 C.XLEN:'L'CB.XLB='B' 000001:CB.CCB='B' 000002:CB.RDB='B' 000004PCB.SDB='B' 000010KCB.DLC='B' 000020KCB.DDM='B' 000040KCB.SLI='B' 000100KCC.LLC='B' 000200KCS.ENA='B' 000001KCS.CES='B' 000002.CS.STR='B' 000004.CS.CMP='B' 000200 CS.SHU='B' 000001'CS.HCR='B' 000001.CS.DEV='B' 0000022CS.ROV='B' 0000041CS.XUR='B' CS.ROV1CS.RNG='B' 000010LCS.ENB='B' 000020LCS.DIS='B' 000040.CS.ABO='B' 000100.CS.BUF='B' 000200TCS.DCR='B' 000400TCS.FTL='B' 001000CS.HFE='B' 0020001CS.MTL='B' 004000BCS.RSN='B' 010000BCS.TMO='B' 020000BCS.LST='B' 040000BCS.ERR='B' 100000CCS.SID='B' 000002MCE.RTE='B' 100376ICE.TMO='B' 100374CCE.MOP='B' 100372ACE.ERR='B' 100370SCE.DIS='B' 100366RCE.SRC='B' 100364PCE.ABO='B' 100362UCE.NTE='B' 100361RCE.LTO='B' 100356VCE.TME='B' 100354VCE.STP='B' 100352RCE.ILN='B' 100350GCE.DAO='B' 100346BCE.UNS='B' 100344SCS.SUC='B' 000001OCS.BRO='B' 000002FCS.DEF='B' 000004RCS.CHN='B' 000010LCF.CHN='B' 000001ECF.LIN='B' 000002LCF.EOM='B' 000004NCF.SOM='B' 000010OCF.HDR='B' 000020TCF.SYN='B' 000040RCF.TRN='B' 000100DCF.LB='B' 100000CP.HDL='B' 000007TCP.2FR='B' 000030MCP.DCF='B' 000040ECP.XCF='B' 000100DCP.PSI='B' 000200SCP.PS='B' 177400 FC.XME='B' 0 FC.RCE='B' 2 FC.KIL='B' 4 FC.CTL='B' 6 FC.TIM='B' 100 FC.XCP='B' 12' FC.RCP='B' 14N FC.KCP='B' 16E FC.CCP='B' 20B FC.PWR='B' 220 FC.MAN='B' 24' FC.MLD='B' 26O FC.PCT='B' 30SFS.RTN='B' 2*400FS.DVC='B' 2*400FS.CIB='B' 4*400FS.KIL='B' 0*400FS.CRA='B' 2*400FS.XKL='B' 4*400FS.AST='B' 0*400FS.INI='B' 0*400FS.STR='B' 2*400FS.STP='B' 4*400FS.TRM='B' 6*400FS.MNT='B' 10*400PFS.SET='B' 12*400PFS.GET='B' 14*400PFS.XON='B' 16*400PFS.XOF='B' 20*400PFS.RNG='B' 22*400XFS.ENB='B' 24*400'FS.DIS='B' 26*400CFS.MSN='B' 30*400'FS.STM='B' 0*400FS.LTM='B' 2*400FS.RET='B' 0*400FS.REA='B' 2*400FS.ZER='B' 4*400FS.REZ='B' 6*400FS.SFS='B' 10*400'FS.SFC='B' 12*4002FS.SFR='B' 14*4004FS.SPW='B' 100*400FS.LCL='B' 200*400FS.RST='B' 0*400FS.EXI='B' 2*400CM.LIN='B' 000000SCM.CIR='B' 000002SCM.FMT='B' 100000PCM.LOO='B' 000001'CM.HRD='B' 000002'CM.XLO='B' 000004'FS.HLT='B' 0*400FS.WLB='B' 2*400FS.RLB='B' 4*400 .RESTORE0 .IIF NB LST .NLISTX .ENDM CCBDF$*W  .MACRO SLTDF$ L,B,LST .SAVE .ASECT4.=-2 .IIF NB LST .LISTL.CVA:'B' .BLKW 1AL.FLG:'B' .BLKW 1'L.DDM:'B' .BLKB 1'L.DLC:'B' .BLKB 11L.DDS:'B' .BLKW 11L.DLM:'B' .BLKW 11L.DLS:'B' .BLKW 11L.CTL:'B' .BLKB 12L.UNT:'B' .BLKB 10L.NSTA:'B' .BLKB 1L.COST:'B' .BLKB 1L.KRBA:'B' .BLKW 1L.NMST:'B' .BLKB 1L.OWNR:'B' .BLKB 1 L.MPF:'B'' L.LEN='L'.LF.X2P='L'000000LF.BWT='L'000007LF.TIM='L'000010LF.MTP='L'000020LF.SER='L'000040LF.MDC='L'000100LF.PAC='L'000200LF.BRO='L'000400LF.LPB='L'001000LF.ENA='L'002000LF.MFL='L'004000LF.REA='L'010000LF.UNL='L'020000LF.RDY='L'040000LF.ACT='L'100000 LN.STA='L'17 LN.SUB='L'360 LN.ON='L'0 LN.OFF='L'1 LN.SER='L'2 LN.OAU='L'3T LN.OOP='L'42 LN.CLO='L'0B LN.OPE='L'1A LN.REF='L'2 LN.LOO='L'3L LN.LOA='L'4' LN.DUM='L'5. LN.TRI='L'6B .=0S.FLG:'B' .BLKB 1.S.COST:'B' .BLKB 1S.NMST:'B' .BLKB 1S.OWNR:'B' .BLKB 1 S.LEN:'B'0SF.ACT='L'000200SF.ENA='L'000100SF.UNL='L'000040SF.MFL='L'000040SF.PAC='L'000020SF.REA='L'000010SF.LPB='L'000004SF.SVC='L'000002SF.SER='L'000001 .RESTORE' .IIF NB LST .NLIST4 .ENDM SLTDF$'W  .MACRO PDVDF$ L,B,LST .RADIX 8O .SAVE .ASECT'.=0.IIF NB LST .LISTPZ.DSP:'B' .BLKW 1B .BLKW 1 .IF DF X$$MCBZ.QUE:'B' .BLKW 1N .ENDCZ.NAM:'B' .BLKW 1NZ.LLN:'B' .BLKB 1.Z.SCH:'B' .BLKB 1.Z.FLG:'B' .BLKW 1.Z.PCB:'B' .BLKW 1.Z.AVL:'B' .BLKW 1.Z.LEN='L' .-Z.DSP'Z.DAT:'B' .BLKW 10 Z.MAP:'B'LZF.X3P='L' 0ZF.DDM='L' 1ZF.DLC='L' 2ZF.LLC='L' 4ZF.MFL='L' 10ZF.KMX='L' 20ZF.MUX='L' 40ZF.LMC='L' 100ZF.TIM='L' 200ZF.MTM='L' 400ZF.COU='L'1000ZF.PSE='L'2000ZF.DIA='L'4000ZF.SLI='L'10000.ZF.MAN='L'00(m 1g20000=ZF.INI='L'40000LZF.DVP='L'100000ZS.ASN='L'100000ZS.BSY='L'140000.IIF NB LST .NLIST .RESTORE: .ENDM PDVDF$.W  .MACRO OPTDF$ L,B,LST .IIF NB LST .LIST CF.MDM='L'1. CF.DDM='L'2B CF.DYN='L'4= CF.EIS='L'10 CF.LOG='L'20 CF.TIM='L'400LCF.FRK='L'100000 .IIF NB LST .NLISTC .ENDM OPTDF$CW  .MACRO SYNDF$ L,B,LST .IIF NB LST .LIST $SYNC='B' 226T $SYNCT='B' 8.M $PAD='B' 377 $PADSH='B' 2$PADKL='B' 10. .IIF NB LST .NLISTI .ENDM SYNDF$M@W  .MACRO ABODF$,L,B S.CACT='B'-4.A S.CEXT='B'-2.S S.COAD='B'0. S.CSGF='B'2. S.CBPT='B'4. S.CIOT='B'6. S.CILI='B'8. S.CEMT='B'10.A S.CTRP='B'12.L S.CFLT='B'14.T S.CSST='B'16.' S.CAST='B'18.' S.CABO='B'20.= S.CLRF='B'22. S.CCRF='B'24.F S.IOMG='B'26.F S.PRTY='B'28. S.CPMD='B'30.L S.CELV='B'32.T S.CINS='B'34. S.CAFF='B'36. S.CCSM='B'38. S.COTL='B'40.I S.CTKN='B'42.2S.BUNK='B'-128.M S.BFEI='B'0. S.BOVL='B'1. S.BHI='B'1.1 S.BBIF='B'1. T.NDNR='B'0. T.NDSE='B'2 T.NCWF='B'4 T.NCRE='B'6B T.NDMO='B'8. T.NUER='B'10.E T.NLDN='B'12.O T.NLUP='B'14.F T.NCFI='B'16.' T.NUDE='B'18.' T.NMPE='B'20.. T.NKLF='B'22.A T.NAAF='B'24.L T.NTAF='B'26.T T.NDEB='B'28.' T.NRCT='B'30.' T.NWBL='B'32.= T.NVER='B'34. T.NIOS='B'36.F T.NIOR='B'38.F .MACRO ABODF$ X,Y .ENDM .ENDM`W  .MACRO CLKDF$,L,B' C.MRKT='B'0' C.SCHD='B'2L C.SSHT='B'4T C.SYST='B'6. C.SYTK='B'8. C.CSTP='B'10. .ASECT'.=0.C.LNK:'L' .BLKW 1'C.RQT:'L' .BLKB 1C.EFN:'L' .BLKB 1FC.TCB:'L' .BLKW 1BC.TIM:'L' .BLKW 2U .=C.TIM+4C.AST:'L' .BLKW 1LC.SRC:'L' .BLKW 1'C.DST:'L' .BLKW 18 .BLKW 1 .=C.TIM+4.C.RSI:'L' .BLKW 2FC.UIC:'L' .BLKW 1'C.UAB:'L'.BLKW 1 .=C.TIM+4' .BLKW 2 .BLKW 1 .BLKW 1 .=C.TIM+4.C.SUB:'L' .BLKW 1RC.AR5:'L' .BLKW 1BC.URM:'L'.BLKW 1 .BLKW 1 C.LGTH='B'.C.NAM='B'C.EFNC.CTX='B'C.UIC .PSECTC .MACRO CLKDF$ X,Y .ENDM .ENDM W  .MACRO DCBDF$,L,B,SYSDEF. .ASECTL.=0KD.LNK:'L' .BLKW 1KD.UCB:'L' .BLKW 1KD.NAM:'L' .BLKW 1KD.UNIT:'L' .BLKB 1 .BLKB 1D.UCBL:'L' .BLKW 1D.DSP:'L' .BLKW 1BD.MSK:'L' .BLKW 1B .BLKW 1 .BLKW 1 .BLKW 1 .BLKW 1 .BLKW 1 .BLKW 1 .BLKW 1D.PCB:'L' .BLKW 1= .PSECT D.VDEB='B'-2 D.VCHK='B'-4 D.VNXC='B'-4 D.VTOU='B'-10 D.VTIN='B'-6 D.VINI='B'0R D.VCAN='B'2 D.VOUT='B'4G D.VPWF='B'6A D.VKRB='B'10 D.VUCB='B'12 .IF NB SYSDEF D.VINT='B'14 .ENDC .MACRO DCBDF$,X,Y,Z .ENDM .ENDMW  .MACRO DEVDF$,L,B .MCALL DCBDF$ DCBDF$ , .MCALL UCBDF$ UCBDF$ ,L .MCALL SCBDF$ SCBDF$ ,1 .MCALL KRBDF$ KRBDF$ ,B .MCALL CTBDF$ CTBDF$ ,W .MCALL LCBDF$ LCBDF$ , .MACRO DEVDF$,X,Y .ENDM .ENDM W  .MACRO EPKDF$,L,B .ASECT. U.=01E$HLGH:'L' .BLKW 1E$HSBF:'L' .BLKW 1E$HSYS:'L' .BLKB 1E$HIDN:'L' .BLKB 1E$HSID:'L' .BLKB 4E$HCTX:'L' .BLKB 1E$HFLG:'L' .BLKB 1E$HENS:'L' .BLKW 1E$HERS:'L' .BLKW 1 E$HENC:'L'E$HTYC:'L' .BLKB 1E$HTYS:'L' .BLKB 1E$HTIM:'L' .BLKB 6E$HPTY:'L' .BLKB 1 .BLKB 1E$HURM:'L' .BLKW 1 .EVENB E$HLEN:'L' D SM.ERR ='B' 1 SM.HDR ='B' 1F SM.TSK ='B' 2C SM.DID ='B' 4 SM.DOP ='B' 10 SM.DAC ='B' 20  SM.DAT ='B' 40P SM.MBC ='B' 20000 SM.CMD ='B' 40000W SM.ZER ='B' 1000001 EH$FOR ='B' 2 ES.INI ='B' 1$ ES.DAT ='B' 2C ES.LIM ='B' 4G ES.LOG ='B' 10' . E$CCMD ='B' 1L E$SSTA ='B' 1T E$SSWI ='B' 2S E$SAPP ='B' 3' E$SBAC ='B' 4' E$SSHO ='B' 5 E$SCHL ='B' 6  E$CERR ='B' 2D E$SDVH ='B' 1 E$SDVS ='B' 2F E$STMO ='B' 3 E$SUNS ='B' 4 E$STMS ='B' 5 E$CDVI ='B' 3S E$SDVI ='B' 1S E$CDCI ='B' 4 E$SMOU ='B' 1 E$SDMO ='B' 2 E$SRES ='B' 3 E$SRCT ='B' 4 E$CMEM ='B' 5 E$SMEM ='B' 1 E$CSYS ='B' 6 E$SPWR ='B' 1  E$CCTL ='B' 7  E$STIM ='B' 1  E$SCRS ='B' 2  E$S00(TADATADATADATADATADATADATADATADATALOA ='B' 3  E$SUNL ='B' 4  E$SHRC ='B' 5  E$SMES ='B' 6  E$CCPU ='B' 10  E$SINT ='B' 1 ; E$SINT ='B' 2  E$CSDE ='B' 11  E$SABO ='B' 1  EH$NOR ='B' 1  EH$STA ='B' 2  EH$CRS ='B' 3  EH$VIR ='B' 1  EH$EXT ='B' 2  EH$COU ='B' 4  EH$QBS ='B' 10 EH$LMR ='B' 20  .=0EE$TLGH:'L' .BLKW 1E$TTSK:'L' .BLKW 2E$TUIC:'L' .BLKW 1E$TTID:'L' .BLKB 2E$TTIU:'L' .BLKB 1E$TFLG:'L' .BLKB 1 .EVEN E$TLEN:'L' ET$PRV ='B' 1  ET$PRI ='B' 2   .=0EE$ILGH:'L' .BLKW 1E$ILDV:'L' .BLKW 1E$ILUN:'L' .BLKB 1E$IPCO:'L' .BLKB 1E$IPUN:'L' .BLKB 1E$IPSU:'L' .BLKB 1 .IF DF R$$MPL'E$IPDV:'L' .BLKW 1 .ENDC E$IFLG:'L' .BLKB 1 .BLKB 1IE$IVOL:'L' .BLKB 12.E$IPAK:'L' .BLKB 4 E$IDEV:'L'E$IDCL:'L' .BLKW 1E$IDTY:'L' .BLKW 2E$IOPR:'L' .BLKW 2E$IERS:'L' .BLKB 1E$IERH:'L' .BLKB 1 .IF DF R$$MPLWE$IBLK:'L' .BLKW 2E$ICYL:'L' .BLKW 2 .ENDCG .EVEN E$ILEN:'L' EI$SUB ='B' 1  .IF DF R$$MPL$ EI$NUX ='B' 2 .ENDC$ H.=0.E$OLGN:'L' .BLKW 1E$OTSK:'L' .BLKW 2E$OUIC:'L' .BLKW 1E$OTID:'L' .BLKB 2E$OTIU:'L' .BLKB 1 .BLKB 1IE$OFNC:'L' .BLKW 1E$OFLG:'L' .BLKB 1 .BLKB 1'E$OADD:'L' .BLKW 2E$OSIZ:'L' .BLKW 1E$ORTY:'L' .BLKB 1$ .BLKB 11 .EVEN E$OLEN:'L' EO$TRA ='B' 1 EO$DMA ='B' 2$ EO$EXT ='B' 4I EO$PIP ='B' 10' EO$IIO ='B' 20.=0DE$ALGH:'L' .BLKW 1 .=0UE$ALDV:'L' .BLKW 1E$ALUN:'L' .BLKB 1E$APCO:'L' .BLKB 1E$APUN:'L' .BLKB 1E$APSU:'L' .BLKB 1 .IF DF R$$MPLE$APDV:'L' .BLKW 1 .ENDC'E$ADFG:'L' .BLKB 1E$ATIU:'L' .BLKB 1E$ATSK:'L' .BLKW 2E$AUIC:'L' .BLKW 1E$ATID:'L' .BLKW 1E$AFNC:'L' .BLKW 1E$AFLG:'L' .BLKB 1 .BLKB 1BE$AADD:'L' .BLKW 2E$ASIZ:'L' .BLKW 1 .EVEN E$ALEN:'L' EA$SUB ='B' 1E .IF DF R$$MPL$ EA$NUX ='B' 2 .ENDC' EA$TRA ='B' 1O EA$DMA ='B' 2 EA$EXT ='B' 4W EA$PIP ='B' 10 EA$IIO ='B' 20 .PSECT. EL.ICM ='B' 1 EL.SEF ='B' 2 EL.MOU ='B' 4 .MACRO EPKDF$ X,Y .ENDM .ENDMW  .MACRO EVNDF$ L,B,LST .IIF NB LST .LIST .ASECT .=0E.VLNK:'L' .BLKW 1E.VSIZ:'L' .BLKB 1E.VTYP:'L' .BLKB 1E.VUCB:'L' .BLKW 1 ET.LOW='B'0' ET.QIO='B'0$ ET.BND='B'2W ET.UNB='B'4$ ET.BCP='B'6$ ET.REJ='B'10 ET.DIS='B'12 ET.DCP='B'14 ET.ICS='B'16 ET.OOB='B'20 ET.ONO='B'22 ET.PHO='B'24 ET.HI='B'24 .=E.VUCB+2'E.VBCT:'L' .BLKW 1E.VBND:'L' .BLKB 6 E.VBLN:'L' .=E.VUCB+2E.VAPR:'L' .BLKW 1E.VADR:'L' .BLKW 1E.VFLG:'L' .BLKW 1 .=E.VFLG+2X E.VSLN:'L' .=E.VFLG+2E.VOBM:'L' .BLKW 6E.VHDR:'L' .BLKW 2E.VTAB:'L' .BLKB 10. E.VOLN:'L' .=E.VFLG+2WE.VSWC:'L' .BLKW 1 E.VTLN:'L' EF.NCO='B'1. EF.NOI='B'2W EF.AST='B'10 EF.LCK='B'40 EF.QUE='B'100W EF.MDE='B'200 .=E.VUCB+2 E.VULN:'L' .=E.VUCB+22E.VRR:'L' .BLKW 1I E.VRLN:'L' .=E.VUCB+2TE.VRD:'L' .BLKW 1' E.VDLN:'L' .=E.VUCB+2V E.VDCL:'L' .PSECTL .IF NB LST .NLISTB.IFF .MACRO EVNDF$ .ENDM.ENDC' .ENDM EVNDF$AFW  .MACRO HDRDF$,L,B .ASECTX.=0SH.CSP:'L'.BLKW 1H.HDLN:'L'.BLKW 1WH.SMAP:'L'.BLKB 1WH.DMAP:'L'.BLKB 1BH.FMAP:'L'.BLKW 1.H.CUIC:'L'.BLKW 1'H.DUIC:'L'.BLKW 1'H.IPS:'L'.BLKW 1H.IPC:'L'.BLKW 1H.ISP:'L'.BLKW 1H.ODVA:'L'.BLKW 1WH.ODVL:'L'.BLKW 1.H.TKVA:'L'.BLKW 1'H.TKVL:'L'.BLKW 1.H.PFVA:'L'.BLKW 1.H.FPVA:'L'.BLKW 1+H.RCVA:'L'.BLKW 1 H.EFSV:'L'.BLKW 1EH.FPSA:'L'.BLKW 1'H.WND:'L'.BLKW 1H.DSW:'L'.BLKW 1H.FCS:'L'.BLKW 1H.FORT:'L'.BLKW 1.H.OVLY:'L'.BLKW 1H.VEXT:'L'.BLKW 1 H.SPRI:'L'.BLKB 1XH.NML:'L'.BLKB 1H.RRVA:'L'.BLKW 1BH.X25:'L'.BLKB 1 .BLKB 1 ;3 RESERVED BYTES .BLKW 1 ;K6H.LUTE:'L'.BLKW 1 ;POINTER TO LUT EXTENSION OF HEADER0H.GARD:'L'.BLKW 1 ;POINTER TO HEADER GUARD WORDH.NLUN:'L'.BLKW 1LH.LUN:'L'.BLKW 2H.FPSL='B'25.*2..=0'W.BPCB:'L'.BLKW 1'W.BLVR:'L'.BLKW 1'W.BHVR:'L'.BLKW 1'W.BATT:'L'.BLKW 1'W.BSIZ:'L'.BLKW 1'W.BOFF:'L'.BLKW 00(m 1g1LW.BFPD:'L'.BLKB 1.W.BNPD:'L'.BLKB 1LW.BLPD:'L'.BLKW 1K W.BLGH:'L' WB.NBP='B'20 WB.BPS='B'40 .PSECTP .MACRO HDRDF$ X,Y .ENDM .ENDMv W  .MACRO HWDDF$,L,B,SYSDEF  .MACRO CRESET NAM,ADDRW$$$=0 .REPT 8.B CRENAM NAM,ADDR+<$$$*2>,\$$$N $$$=$$$+1 .ENDR .ENDM .MACRO CRENAM NAM,ADDR,N 'NAM''N'==ADDR .ENDMMPCSR='B'1777462MPAR='B'172100PIRQ='B'177772PR0='B'0 PR1='B'40' PR4='B'200 PR5='B'240 PR6='B'300 PR7='B'340 PS='B'177776 SWR='B'177570F TPS='B'177564.KXCSRA='B'177520 ;KXJ CSR AKXCSRD='B'177530 ;KXJ CSR D#KXJQIR='B'177532 ;KXJ QIR REGISTERKXCSRF='B'177534 ;KXJ CSR FKXCSRH='B'177536 ;KXJ CSR H .IF DF E$$EAE AC='B'177302 MQ='B'177304 SC='B'177310 .ENDC .IF NB B CRESET KINAR,172340 CRESET KINDR,172300 CRESET KDSAR,172360 CRESET KDSDR,172320 CRESET SISAR,172240 CRESET SISDR,172200 CRESET SDSAR,172260 CRESET SDSDR,172220 CRESET UINAR,177640 CRESET UINDR,177600 CRESET UDSAR,177660 CRESET UDSDR,177620 .ENDC .IF NB SYSDEF .IF DF K$$DAS CRESET KISAR,172360 CRESET KISDR,172320 .IFF  CRESET KISAR,172340 CRESET KISDR,172300 .ENDC .IF DF U$$DAS CRESET UISAR,177660 CRESET UISDR,177620 .IFF3 CRESET UISAR,177640 CRESET UISDR,177600 .ENDC .ENDCUBMPR='B'1702003CMODE='B'140000,PMODE='B'30000CSMODE='B'40000EPSMODE='B'10000 SR0='B'1775727 SR3='B'172516DCPUERR='B'177766MEMERR='B'177744MEMCTL='B'177746N.KEY='B'1730547N.UPT='B'173064AN.DZA='B'173074 N.DWA='B'173104NN.DAY='B'173114FN.MON='B'173116N.YEA='B'1731203 FE.EXT='B'1I FE.MUP='B'2. FE.EXV='B'4 FE.DRV='B'10 FE.PLA='B'20 FE.CAL='B'40 FE.PKT='B'100S FE.EXP='B'200, FE.LSI='B'400 FE.OFF='B'1000FE.FDT='B'2000FE.X25='B'4000FE.DYM='B'10000FE.CEX='B'20000BFE.MXT='B'40000MFE.NLG='B'100000 F2.DAS='B'1 F2.LIB='B'20 F2.MP='B'4 F2.EVT='B'10 F2.ACN='B'20 F2.SDW='B'40 F2.POL='B'1006 F2.WND='B'2007 F2.DPR='B'4007F2.IRR='B'1000F2.GGF='B'2000F2.RAS='B'4000F2.AHR='B'10000=F2.RBN='B'20000=F2.SWP='B'40000=F2.STP='B'100000 F3.CRA='B'1E F3.XCR='B'2E F3.EIS='B'4E F3.STM='B'10 F3.UDS='B'20 F3.PRO='B'40 F3.XHR='B'100P F3.AST='B'200E F3.11S='B'400LF3.CLI='B'1000F3.TCM='B'2000F3.PMN='B'4000F3.WAT='B'10000MF3.RLK='B'20000XF3.SHF='B'40000T F4.CXD='B'1E F4.XT='B'2 F4.ERL='B'4' F4.PTY='B'10 F4.DVN='B'20 F4.LCD='B'40 F4.NIM='B'100 F4.CHE='B'2002 F4.LOG='B'4002F4.NAM='B'1000F4.FMP='B'2000F4.DCL='B'4000F4.DDS='B'10000RF4.ACD='B'20000RF4.NCT='B'40000NF4.LSD='B'100000;+; FIFTH FEATURE MASK BITS3;- F5.PRO='B'1R*F5.DFB='B'2 ;SYSTEM HAS DEFERRED BINDINGF5.RTB='B'4 ;RUN TIME BINDINGP3F5.ODB='B'10 ;USER CAN OVERRRIDE DEFERRED BINDINGT2F5.XDJ='B'20 ;XDT IS USING KXJ INTERFACE FOR I/O$F5.NSY='B'40 ;NO LOCAL SYSTEM DISK!F5.NCO='B'100 ;NO LOCAL CONSOLEP%F5.RTK='B'200 ;REMOTE TASK SERVICES4)F5.RDR='B'400 ;REMOTE DIRECTORY STORAGE2(F5.RLG='B'1000 ;REMOTE LOGICAL SUPPORT&F5.LDR='B'2000 ;REMOTE LOAD/OVERLAYS2F5.VTL='B'4000 ;VIRTUAL TERMINAL LOGONS DISABLED HF.UBM='B'1B HF.EIS='B'2P HF.QB='B'4 HF.DSP='B'10<HF.SWR='B'20 ;SYSTEM HAS SWITCH REGISTER HARDWARE PRESENT'HF.KXJ='B'40 ;PROCESSOR TYPE IS KXJ11E)HF.RMT='B'100 ;REMOTE SERVICES REQUIREDJ HF.CIS='B'200IHF.FPP='B'100000 H2.NVR='B'1S H2.INV='B'2N H2.CLK='B'4N H2.ITF='B'10 H2.PRO='B'20H2.BRG='B'100000 SF.STD='B'15 SF.PGN='B'2 MP.CRH='B'100000MP.PWF='B'40000'MP.RSM='B'20000LMP.NOP='B'100005 MP.STP='B'4 MP.INT='B'7777 .MACRO HWDDF$ X,Y,Z .ENDM .ENDMW  .MACRO ITBDF$ L,B,SYSDEF' .IF DF A$$TRP .MCALL PKTDF$ PKTDF$0 .ENDC .ASECTW .=0X.LNK:'L' .BLKW 1EX.JSR:'L' JSR R5,@#0X.PSW:'L' .BLKB 1X .BLKB 1X.ISR:'L' .BLKW 1 X.FORK:'L' .BLKW 1 .BLKW 1 .BLKW 1 .BLKW 1 .IF DF M$$MGEX.REL:'L' .BLKW 1K .ENDCX.DSI:'L' .BLKW 1OX.TCB:'L' .BLKW 10 .IF NB SYSDEF .IF DF A$$TRP .BLKW 1X.AST:'L' .BLKB A.PRM0 .ENDCX.VEC:'L' .BLKW 1PX.VPC:'L' .BLKW 1' X.LEN:'L'T .ENDC .PSECT .MACRO ITBDF$ X,00(TADATADATADATADATADATADATADATADATAY,Z .ENDM ITBDF$ .ENDM ITBDF$W  .MACRO KRBDF$,L,B,SYSDEFC .ASECT$.=177770K.PRM:'L' .BLKW 1K.PRI:'L' .BLKB 1KK.VCT:'L' .BLKB 1 K.CON:'L' .BLKB 1BK.IOC:'L' .BLKB 1.K.STS:'L' .BLKW 1.K.CSR:'L' .BLKW 1K.OFF:'L' .BLKW 1K.HPU:'L' .BLKB 1$ .BLKB 1K.OWN:'L' .BLKW 1NK.CRQ:'L' .BLKW 2 K.URM:'L' .BLKW 1 K.FRK:'L' .BLKW 1.=-20.KE.UMH:'L'.BLKW 2.KE.UMC:'L'.BLKW 10.=177776KE.RHB:'L'.BLKW 1KE.UCB:'L'.BLKW 1 .PSECTT KS.OFL='B'1S KS.MOF='B'2I KS.UOP='B'4 KS.MBC='B'10 KS.SDX='B'20 KS.POE='B'40 KS.UCB='B'100D KS.DIP='B'200 KS.PDF='B'4007KS.EXT='B'1000KS.SLO='B'2000 .ASECTK.=177762S.PRI:'L' .BLKB 1LS.VCT:'L' .BLKB 1LS.CON:'L' .BLKB 1L .BLKB 1 .BLKW 1S.CSR:'L' .BLKW 1L .BLKW 1 .BLKB 1 .BLKB 1S.OWN:'L' .BLKW 1L .ASECTN.=-4K1.CON:'L'.BLKB 1R .BLKB 1K1.STS:'L'.BLKW 1KK1.MAS:'L'.BLKW 1HK1.OWN:'L'.BLKW 1CK1.CRQ:'L'.BLKW 27 K1.UCB:'L' .PSECT .MACRO KRBDF$,X,Y,Z .ENDM .ENDM W  .MACRO LBLDF$ L,B .ASECT0.=0SR$LNAM:'L'.BLKW 2'R$LSA:'L' .BLKW 1R$LHGV:'L'.BLKW 1PR$LMXV:'L'.BLKW 1'R$LLDZ:'L'.BLKW 10R$LMXZ:'L'.BLKW 17R$LOFF:'L'.BLKW 1 R$LWND:'L'.BLKW 1 R$LSEG:'L'.BLKW 1 R$LFLG:'L'.BLKW 1WR$LDAT:'L'.BLKW 3 R$LSIZ:'L'.BLKW 0BLD$ACC='B'100000LD$RSV='B'040000LD$CLS='B'020000LD$SUP='B'000010LD$REL='B'000004LD$TYP='B'000002.=0KL$BTSK:'L'.BLKW 2KL$BPAR:'L'.BLKW 2KL$BSA:'L' .BLKW 1.L$BHGV:'L'.BLKW 1DL$BMXV:'L'.BLKW 1.L$BLDZ:'L'.BLKW 1L$BMXZ:'L'.BLKW 1LL$BOFF:'L'.BLKW 1L$BWND:'L'.BLKB 1L$BSYS:'L'.BLKB 1L$BSEG:'L'.BLKW 1L$BFLG:'L'.BLKW 1L$BDAT:'L'.BLKW 3!L$BLIB:'L'.BLKW <7.*>+1 L$BPRI:'L'.BLKW 1 L$BXFR:'L'.BLKW 1 L$BEXT:'L'.BLKW 1 L$BSGL:'L'.BLKW 1 L$BHRB:'L'.BLKW 1 L$BBLK:'L'.BLKW 10L$BLUN:'L'.BLKW 1L$BROB:'L'.BLKW 1DL$BROL:'L'.BLKW 1RL$BRDL:'L'.BLKW 1PL$BHDB:'L'.BLKW 1$L$BDHV:'L'.BLKW 1$L$BDMV:'L'.BLKW 1$L$BDLZ:'L'.BLKW 1$L$BDMZ:'L'.BLKW 1$ .BLKW <512.-.>/2$L$BASG:'L'.BLKW 0$$LBXL='B'<8.*>.=772KL$BFL2:'L'.BLKW 1KL$BLRL:'L'.BLKW 1KL$AME:'L' .BLKW 1K; .IIF NE .-1000 .ERROR DEFINITIONS OVERLAP NEXT LABEL BLOCK LB$REV='B'000400TS$PIC='B'100000TS$NHD='B'040000TS$ACP='B'020000TS$PMD='B'010000TS$SLV='B'004000TS$NSD='B'002000TS$PRV='B'000400TS$CMP='B'000200TS$CHK='B'000100TS$RES='B'000040TS$IOP='B'000020TS$SUP='B'000010TS$XHR='B'000004TS$NXH='B'000002TS$NEW='B'000001T2$FMP='B'000002T2$CLI='B'000001 .PSECT. .MACRO LBLDF$ X,Y .ENDM .ENDM W  .MACRO PCBDF$ L,B,SYSDEFL .ASECTK.=0P.LNK:'L'.BLKW 1 .BLKW 1P.NAM:'L'.BLKW 2P.SUB:'L'.BLKW 1P.MAIN:'L'.BLKW 1BP.REL:'L'.BLKW 1 P.BLKS:'L'P.SIZE:'L'.BLKW 10P.WAIT:'L'.BLKW 2 .BLKW 2P.STAT:'L'.BLKW 10P.ST2:'L' .BLKW 10 .BLKW 3P.HDLN:'L'.BLKB 1'P.IOC:'L' .BLKB 1'$$$=.P.RRM:'L'.BLKW 1 .IF NDF M$$PRO.=$$$' .ENDC .IF NB SYSDEF P.LGTH='B'.' .ENDC.=0WP.LNK:'L'.BLKW 1P.PRI:'L'.BLKB 1P.RMCT:'L'.BLKB 1.P.NAM:'L'.BLKW 2P.SUB:'L'.BLKW 1P.MAIN:'L'.BLKW 1P.REL:'L'.BLKW 1 P.BLKS:'L'P.SIZE:'L'.BLKW 1: .BLKW 1P.SWSZ:'L'.BLKW 1LP.DPCB:'L'.BLKW 1.P.TCB:'L'.BLKW 1P.STAT:'L'.BLKW 1.P.HDR:'L' .BLKW 1 .BLKW 1P.ATT:'L' .BLKW 2'P.HDLN:'L'.BLKB 1P.IOC:'L' .BLKB 1$$$=.LP.RRM:'L'.BLKW 1 .IF NDF M$$PROK.=$$$. .ENDC.=0 P.LNK:'L'.BLKW 1P.PRI:'L'.BLKB 1P.RMCT:'L'.BLKB 1P.NAM:'L'.BLKW 2P.SUB:'L'.BLKW 1P.MAIN:'L'.BLKW 1NP.REL:'L'.BLKW 1 P.BLKS:'L'P.SIZE:'L'.BLKW 1.P.CBDL:'L'.BLKW 1 P.CSBA:'L'P.SWSZ:'L'.BLKW 1KP.DPCB:'L'.BLKW 1WP.OWN:'L' .BLKW 1IP.STAT:'L'.BLKW 1LP.ST2:'L' .BLKW 1KP.PRO:'L' .BLKW 1KP.ATT:'L' .BLKW 2WP.HDLN:'L'.BLKB 1 P.IOC:'L' .BLKB 1 $$$=.LP.RRM:'L'.BLKW 1 .IF NDF M$$PRO'.=$$$ .ENDC .PSECT PS.OUT='B'100000PS.CKP='B'40000NPS.CKR='B'20000.PS.CHK='B'10000.PS.FXD='B'4000PS.CAF='B'2000PS.LIO='B'1000 PS.NSF='B'400. PS.COM='B'200L PS.LFR='B'100N PS.PER='B'40 PS.NWB='B'20 PS.DEL='B'10 PS.AST='B'4B PS.CSA='B'2LPR.UBT='B'100000PR.U00(m 1gBS='B'40000'PR.UBR='B'20000'PR.UBP='B'10000:PR.UBN='B'4000PR.UBM='B'2000PR.UBL='B'1000 PR.UBK='B'400 PR.UBJ='B'200: PR.UBH='B'100. PR.UBF='B'40 PR.UBE='B'20 PR.CPD='B'10 PR.CPC='B'4. PR.CPB='B'2N PR.CPA='B'1=P2.LMA='B'40000SP2.CPC='B'200000P2.CHE='B'100000P2.SEC='B'4000P2.PAR='B'2000P2.POL='B'1000 P2.CPU='B'400F P2.PIC='B'200O P2.RON='B'100F P2.DRV='B'40 P2.LDD='B'20 P2.APR='B'7 .ASECT'.=0SP.LNK:'L' .BLKW 1'P.UCB:'L' .BLKW 1P.LBN:'L' .BLKW 1T .BLKW 1P.SUB:'L' .BLKW 1P.MAIN:'L' .BLKW 1P.REL:'L' .BLKW 1UP.SIZE:'L' .BLKW 1 P.DLGH='B'.L.=00 .BLKW 4P.SUB:'L' .BLKW 1'P.MAIN:'L' .BLKW 1P.REL:'L' .BLKW 1UP.SIZE:'L' .BLKW 1.=0RP.FID1:'L' .BLKW 1P.UCB:'L' .BLKW 1P.LBN:'L' .BLKW 12 .BLKW 1P.IID='B' P.LBN0P.FID2:'L' .BLKW 1P.MAIN:'L'.BLKW 12P.REL:'L' .BLKW 1UP.FID3:'L' .BLKW 1 .ASECTR.=0'A.PCBL:'L'.BLKW 1A.PRI:'L'.BLKB 1A.IOC:'L'.BLKB 1A.TCB:'L'.BLKW 1A.TCBL:'L'.BLKW 1 A.STAT:'L'.BLKB 1 A.MPCT:'L'.BLKB 1A.PCB:'L'.BLKW 1 A.LGTH='B'.. .PSECT. AS.PRO='B'100U AS.SBP='B'20 AS.RBP='B'40 AS.DEL='B'10 AS.EXT='B'4U AS.WRT='B'2' AS.RED='B'1. .MACRO PCBDF$ X,Y,Z .ENDM .ENDM W  .MACRO PKTDF$,L,B,SYSDEF  .ASECT.=177774A.KSR5:'L' .BLKW 1A.DQSR:'L' .BLKW 1 .BLKW 1A.CBL:'L' .BLKW 1BA.BYT:'L' .BLKW 1BA.AST:'L' .BLKW 1.A.NPR:'L' .BLKW 1=A.PRM:'L' .BLKW 1 AS.FPA='B'1. AS.RCA='B'2: AS.RRA='B'3. AS.PEA='B'41 AS.REA='B'5B AS.PFA='B'6T AS.CAA='B'7 AF.XCC='B'1K AF.NOT='B'2L AF.OOB='B'4G AF.AST='B'10 AF.ESQ='B'20 AF.LCK='B'40 AF.QUE='B'100' AF.MDE='B'200' AB.NPV='B'1' AB.TYP='B'2' AB.CTC='B'4' A.PLGH='B'70 A.DUCB='B'10 A.DLGH='B'10. AK.BUF='B'200 AK.OCB='B'201L AK.GBI='B'202S AK.TBT='B'203 AK.DIO='B'204W AK.GGF='B'205.SF.PRV='B'100000SF.IN='B' 40000B.=0YG.LNK:'L'.BLKW 1G.GRP:'L'.BLKB 1G.STAT:'L'.BLKB 1G.CNT:'L'.BLKW 1G.EFLG:'L'.BLKW 2R G.LGTH='B'.R GS.DEL='B'1P PC.HIH='B'1R PC.LOW='B'2P PC.ALF='B'4C PC.XIT='B'200CPC.NRM='B'PC.HIH*400PC.ALM='B'PC.LOW*400 PF.INS='B'40 PF.LOG='B'100' PF.REQ='B'2000PF.ALL='B'177777.=0NO.LNK:'L'.BLKW 1O.MCRL:'L'.BLKW 1O.PTCB:'L'.BLKW 1BO.AST:'L'.BLKW 1O.EFN:'L'.BLKW 1O.ESB:'L'.BLKW 1O.STAT:'L'.BLKW 8. O.LGTH='B'. .ASECT'.=0I.LNK:'L' .BLKW 1PI.PRI:'L' .BLKB 1=I.EFN:'L' .BLKB 1.I.TCB:'L' .BLKW 1RI.LN2:'L' .BLKW 1TI.UCB:'L' .BLKW 1:I.FCN:'L' .BLKW 1'I.IOSB:'L' .BLKW 1 .BLKW 1 .BLKW 1I.AST:'L' .BLKW 1WI.PRM:'L' .BLKW 1C .BLKW 6 .BLKW 1IP.FAK ='B' 20IP.ABO ='B' 40IP.PND ='B' 100'IP.UMR ='B'200 I.ATTL='B'.'I.AADA:'L' .BLKW 2 I.LGTH='B'..I.ATRL='B'6*8. .ASECT'.= 0I.XLNK:'L' .BLKW 1BI.XIOP:'L' .BLKW 1.I.XTCB:'L' .BLKW 1:I.XMOD:'L' .BLKW 2'I.XRBF:'L' .BLKW 2I.XRBL:'L' .BLKW 1NI.XTMO:'L' .BLKW 1:I.XPBF:'L' .BLKW 2LI.XPBL:'L' .BLKW 1 I.XPBV:'L' .BLKW 1BI.XTTB:'L' .BLKW 2KI.XTTL:'L' .BLKW 1 I.XDBF:'L' .BLKW 21I.XDBL:'L' .BLKW 1 I.XLEN='B'.K.=0C.PTCB:'L' .BLKW 1C.PNAM:'L' .BLKW 2C.PSTS:'L' .BLKW 1C.PDPL:'L' .BLKB 1C.PCPL:'L' .BLKB 1 C.PRMT:'L' CP.NUL='B'1A CP.MSG='B'2 CP.LGO='B'4 CP.DSB='B'10 CP.PRV='B'20 CP.SGL='B'40 CP.NIO='B'100I CP.RST='B'200. CP.EXT='B'400LCP.POL='B'1000CP.CTC='B'2000.=0'C.CLK:'L' .BLKW 1C.CTCB:'L' .BLKW 1C.CUCB:'L' .BLKW 1C.CCT:'L' .BLKW 1C.CSTS:'L' .BLKW 1 C.CMCD:'L'C.CSO:'L' .BLKW 1C.CTR:'L' .BLKB 1C.CBLK:'L' .BLKB 1 C.CTXT:'L' CC.MCR='B'1' CC.PRM='B'2 CC.EXT='B'4 CC.KIL='B'10 CC.CLI='B'20 CC.MSG='B'40 CC.TTD='B'100. CC.CTC='B'200' CM.INE='B'1. CM.IND='B'2B CM.CEN='B'3' CM.CDS='B'4A CM.ELM='B'5 CM.EXT='B'6 CM.LKT='B'70 CM.RMT='B'8. CM.MSG='B'9..=0NA.REL:'L' .BLKW 1'A.DIS:'L' .BLKW 10A.MAS:'L' .BLKW 2A.NUM:'L' .BLKB 1'A.FLEN:'L'.BLKB 11A.LIN:'L' .BLKW 11A.ACC:'L' .BLKB 11A.STA:'L' .BLKB 11 A.PLEN='B'...=A.LIN.A.IMAP:'L' .BLKW 1A.IBUF:'L' .BLKW 1A.ILEN:'L' .BLKW 1A.SMAP:'L' .BLKW 1A.SBUF:'L' .BLKW 1A.SLEN:'L' .BLKW 1A.IOS:'L' .BLKW 2C A.RES='B'. UA.ACC='B'1 UA.PRO00(TADATADATADATADATADATADATADATADATA='B'2. UA.ECH='B'40 UA.TYP='B'10 UA.SPE='B'20 UA.PUT='B'40 UA.CAL='B'100A UA.COM='B'200 UA.ALL='B'400MUA.TRN='B'1000UA.TRA='B'2000.=0.A.ACCE:'L' .BLKW 1A.DEQU:'L' .BLKW 1A.POWE:'L' .BLKW 1A.INPU:'L' .BLKW 1A.OUTP:'L' .BLKW 1A.CONN:'L' .BLKW 1A.DISC:'L' .BLKW 1A.RECE:'L' .BLKW 1A.PROC:'L' .BLKW 1A.TRAN:'L' .BLKW 1A.CALL:'L' .BLKW 1 AS.DLT='B'1. AS.DIS='B'2W .PSECTP .MACRO PKTDF$ X,Y,Z .ENDM .ENDM\W  .MACRO SCBDF$,L,B,SYSDEF. .IF NB SYSDEF .ASECT'.=0AS.LHD:'L' .BLKW 2' S.URM:'L'E .IF DF M$$PRO .BLKW 1 .ENDCS.FRK:'L' .BLKW 1 .BLKW 1 .BLKW 1 .BLKW 1 .IF DF L$$DRVS.KS5:'L' .BLKW 1. .ENDCS.PKT:'L' .BLKW 1S.CTM:'L' .BLKB 1S.ITM:'L' .BLKB 1S.STS:'L' .BLKB 1S.ST3:'L'.BLKB 1S.ST2:'L' .BLKW 11S.KRB:'L' .BLKW 11S.RCNT:'L'.BLKB 11S.ROFF:'L'.BLKB 11S.EMB:'L'.BLKW 1S.KTB:'L' .BLKW 1S .PSECTWS.PORT='B'S.EMB+2 S.PBIA='B'S.EMB+4MS.QST='B'S.EMB+6S.BSYU='B'S.EMB+10 .IFFB S2.EIP='B'1F S2.ENB='B'2. S2.LOG='B'4 S2.MAD='B'10 S2.LDS='B'40 S2.OPT='B'100P S2.CON='B'200. S2.OP1='B'400 S2.OP2='B'1000S2.ACT='B'2000S2.XHR='B'4000S2.KRQ='B'10000 S3.DRL='B'1N S3.NRL='B'2 S3.SIP='B'4T S3.ATN='B'10 S3.SLV='B'20 S3.SPA='B'40 S3.SPB='B'100. S3.OPT='B'200S3.SPU='B'S3.SPA!S3.SPB: KP.OFL='B'1 .ASECT'.=0 M.LNK:'L' .BLKW 1M.UMRA:'L' .BLKW 1M.UMRN:'L' .BLKW 1M.UMVL:'L' .BLKW 1M.UMVH:'L' .BLKB 1M.BFVH:'L' .BLKB 1M.BFVL:'L' .BLKW 1 M.LGTH='B'.F .ENDC .PSECT .MACRO SCBDF$,X,Y,Z .ENDM .ENDM W  .MACRO TCBDF$,L,B,SYSDEF0 .ASECT1.=00T.LNK:'L' .BLKW 1T.PRI:'L' .BLKB 1XT.IOC:'L' .BLKB 1'T.PCBV:'L' .BLKW 1T.NAM:'L' .BLKW 23T.RCVL:'L' .BLKW 2T.ASTL:'L' .BLKW 2T.EFLG:'L' .BLKW 2T.UCB:'L' .BLKW 1'T.TCBL:'L' .BLKW 1T.STAT:'L' .BLKW 1T.ST2:'L' .BLKW 1 T.ST3:'L' .BLKW 11T.DPRI:'L' .BLKB 1T.LBN:'L' .BLKB 31.T.IID='B' T.LBN+1 ;IMAGE INDEX FOR CPR SYSTEMT.LDV:'L' .BLKW 1LT.PCB:'L' .BLKW 1HT.MXSZ:'L' .BLKW 1T.ACTL:'L' .BLKW 1T.ATT:'L' .BLKW 2NT.ST4:'L' .BLKW 1T.HDLN:'L' .BLKB 1 .BLKB 1T.GGF:'L' .BLKB 1NT.TIO:'L' .BLKB 1RT.EFLM:'L' .BLKW 2T.TKSZ:'L' .BLKW 1$$$=..T.OFF:'L' .BLKW 1B .BLKB 1T.SRCT:'L' .BLKB 1T.RRFL:'L' .BLKW 2 .IF NDF P$$LAS.=$$$L .ENDC .IF NB SYSDEF$$$=.T.CTX:'L' .BLKW 1 .IF NDF N$$DIR .=$$$: .ENDC$$$=..T.OCBH:'L' .BLKW 2T.RDCT:'L' .BLKW 1 .IF NDF P$$OFF;.=$$$N .ENDCT.SAST:'L' .BLKW 1$$$=. T.RRM:'L'.BLKW 1T.IRM:'L'.BLKW 1T.CPU:'L'.BLKB 1 .BLKB 1 .IF NDF M$$PRON.=$$$: .ENDC$$$=..T.ACN:'L'.BLKW 1 .IF NDF A$$CNTL.=$$$  .ENDC$$$=.BT.ISIZ:'L'.BLKW 1. .IF NDF U$$DAS'.=$$$1 .ENDC T.LGTH='B'.B T.EXT='B'0 .IFF.TS.EXE='B'100000TS.RDN='B'400002TS.MSG='B'20000TS.CIP='B'10000TS.RUN='B'40006TS.RSW='B'2000 ;TASK IS WAITING FOR A REMOTE SERVICETS.STP='B'1000 TS.CKR='B'1002 TS.BLC='B'37TS.BLK='B'177777T2.AST='B'100000T2.DST='B'40000.T2.CHK='B'20000.T2.REX='B'10000.T2.SEF='B'4000T2.SIO='B'1000 T2.AFF='B'400F T2.HLT='B'200= T2.ABO='B'100$ T2.STP='B'40 T2.STP='B'20 T2.SPN='B'10 T2.SPN='B'4C T2.WFR='B'2S T2.WFR='B'1.T3.ACP='B'100000T3.PMD='B'40000T3.REM='B'20000XT3.PRV='B'10000ST3.MCR='B'4000T3.SLV='B'2000T3.CLI='B'1000 T3.RST='B'4000 T3.NSD='B'200' T3.CAL='B'100' T3.ROV='B'40 T3.NET='B'20 T3.MPC='B'10 T3.CMD='B'4' T3.SWS='B'2' T3.GFL='B'1C2T4.LRW='B'2000 ;TASK IS WAITING FOR A LOCAL RING4T4.LBW='B'1000 ;TASK IS WAITING FOR A LOCAL BUFFER2T4.DFB='B'400 ;TASK HAS DEFERRED BINDING ENABLED T4.FMP='B'2000 T4.CTC='B'1000 T4.MUT='B'40 T4.LDD='B'20 T4.PRO='B'10 T4.PRV='B'4S T4.DSP='B'2. T4.SNC='B'10TR.UBT='B'100000TR.UBS='B'400000TR.UBR='B'200000TR.UBP='B'100000TR.UBN='B'4000TR.UBM='B'2000TR.UBL='B'1000 TR.UBK='B'4000 TR.UBJ='B'2000 TR.UBH='B'1000 TR.UBF='B'40 TR.UBE='B'20 TR.CPD='B'10 TR.CPC='B'4' TR.CPB='B'2C TR.CPA='B'10 .ENDC .PSECTT .MACRO TCBDF$ X,Y,Z .ENDM .ENDMW  .MACRO CTBDF$,L,B,SYSDEF' .ASECTT.=177700(m 1g56L.CLK:'L' .BLKW 8.L.ICB:'L' .BLKW 1L.LNK:'L' .BLKW 1ML.NAM:'L' .BLKW 1'L.DCB:'L' .BLKW 14L.NUM:'L' .BLKB 1'L.STS:'L' .BLKB 1L.KRB:'L' .BLKW 1R .PSECT0 LS.CLK='B'1' LS.MDC='B'2U LS.CBL='B'4 LS.CIN='B'10 LS.NET'B'=20 CI.CSR='B'-6 CI.KRB='B'-4 CI.PWF='B'-2 CI.INT='B'0U CI.DCB='B'2R .MACRO CTBDF$,X,Y,Z .ENDM .ENDMW  .MACRO OLRDF$ $$$GBL0 .MCALL .WORD.,DEFIN$A .IF IDN <$$$GBL>,....GBL=1 .IFF...GBL=0 .ENDC .MACRO FUNC NAME,SUBF,FUN,MASK6 .WORD. IO.'NAME,SUBF,FUN: FUNCA NAME, .ENDM .MACRO FUNCA NAME,MSK PARCT=0 DESCT=0 .IRP X,K .IIF IDN ,

PARCT=PARCT+1L .IIF IDN , DESCT=DESCT+1'2 .IIF GT .ERROR INVALID PARAMETER COUNT3 .IIF GT .ERROR INVALID DESCRIPTOR COUNTT .ENDR TEMP=+$( .WORD. IO$'NAME,<>,TEMP .ENDM .WORD. IO.MFC,000,001 .WORD. IO.RSC,000,002 .WORD. IO.WSC,000,006 FUNC ONL,001,006,. FUNC OFL,002,006,U FUNC MAI,003,006,' FUNC CAC,004,006,<> FUNC MEM,005,006,<> FUNC STN,006,006,P FUNC HRC,007,006,, FUNC ONE,010,006,  FUNC STA,011,006,D FUNC IF ,012,006, FUNC RLI,013,006,V FUNC RUL,014,006,T' FUNC MBO,015,006,N FUNC RSW,016,006,P FUNC WAT,017,006,A FUNC RAT,020,006,P' FUNC MBF,021,006, IO$MAX=21 DEFIN$ IS.HRG,6.0 .MACRO OLREM$ $$$VAL=-256..& .IOER. IE$DAL," .IOER. IE$DNL, .IOER. IE$PRM, .IOER. IE$SYN,,' .IOER. IE$AFE,TD .IOER. IE$TMU,( .IOER. IE$CAB,1 .IOER. IE$TRP,D+ .IOER. IE$ALG,23 .IOER. IE$TQU, # .IOER. IE$EPO,A$ .IOER. IE$EUO,* .IOER. IE$ECO,$ .IOER. IE$EPF,% .IOER. IE$EUF,x+ .IOER. IE$ECF,r< .IOER. IE$CFU,; .IOER. IE$CSR,RC .IOER. IE$SWF,b? .IOER. IE$ICE,e8 .IOER. IE$SCE,6 .IOER. IE$MDE,6 .IOER. IE$NFW,: .IOER. IE$CXT,* .IOER. IE$IDU,8 .IOER. IE$UNK,= .IOER. IE$SZE,nF .IOER. IE$POB,F .IOER. IE$NLB,C .IOER. IE$OMP,t= .IOER. IE$POC,v- .IOER. IE$DFE,i5 .IOER. IE$IDS,s= .IOER. IE$UOE,o .ENDM CO$ONL = 1R CO$OFL = 2o CO$UNK = 3e CO$ACC = 4e CO$ANY = 5E CO$MAI = 6C CO$MAX = 6 CD$STO = 2i CD$GOT = 4 CD$CON = 6 CD$MAX = 6. M$LOG = 1 M$INIT = 2N M$DEBG = 4n M$EXIT = 10 .ASECTP .=0C$DTYP: .BLKB 1a ET$HDR = 1 ET$END = 2s ET$DEV = 'AC$DECT: .BLKB 1tC$DVER: .BLKB 1 C$DSTD: .BLKB 1C$DMUB: .BLKB 1RC$DMCT: .BLKB 1a .EVENC$DFAC: .BLKW 2SC$DIDN: .BLKW 9.C$STD: .=0C$DTYP:C$DNAM: .BLKW 1RC$DPUN: .BLKB 1 C$DLUN: .BLKB 1nC$DSCT: .BLKB 1C$DEVT: .BLKB 1$C$DSTS: .BLKW 1 CS$ATR=1C CS$EXF=76 CS$SUB=100$ ;CS$XXX=200 CS$OFL=400$ CS$PDF=1000 CS$POR=2000 CS$MBD=4000 CS$UNK=10000G CS$ACC=20000 CS$MTD=40000n CS$DRV=100000C$DST2: .BLKW 1$ CS$PUN=20 CS$CRD=40 CS$PRC=100 CS$CTL=200 00(TADATADATADATADATADATADATADATADATA CS$DCL=3400 DC$UNI = 0V DC$CTL = 1 DC$MKU = 2 DC$MKC = 3B DC$SBU = 4T DC$SBC = 5. DC$CPU = 6 ;DC$XXX = 7C$DDAT: .BLKW 2TC$SME: .=C$SMEC$DKPO: .BLKW 1RC$SCT: .=C$SMEC$DCTN: .BLKW 1nC$DUPO: .BLKW 1C$SUN: .=C$SMEC$DCPO: .BLKW 1 C$SCP: .=C$SMEC$DCTN: .BLKW 10 .BLKW 4C$SMB: CP$OFL=400 CP$XXX=1000 CP$CUR=2000 CP$XXX=4000 CP$XXX=10000 CP$ACC=20000 CP$MTD=40000 CP$XXX=100000 .MACRO ATT NAME,SIZ $$$TMP=$$$TMP+1! DEFIN$ DA$'NAME,$$$TMP!<400*SIZ>C .ENDM $$$TMP=0V ATT CSR,2 ATT VEC,2 ATT UBR,2 ATT TYP,2 ATT VOL,12. ATT ERR,10$ ATT PRI,2 ATT MBP,6 ATT STE,2 ATT SAL,2 ATT DSN,2 ATT CSN,10  .ASECT: .=0C$MBAS: .BLKW 1KC$MINT: .BLKB 1K .BLKB 1C$MSIZ: .BLKW 1CC$MGRN: .BLKW 1CC$MDSC:S .PSECTN .MACRO OLRDF$ X .ENDM .MACRO ATT X .ENDM .ENDMW  .MACRO DEVCD$ $$$GBL .MCALL DEFIN$ .IF IDN <$$$GBL>,0...GBL=1 .IFF ...GBL=0 .ENDC .MACRO DEV XN DEFIN$ D$'X,$$$TMP0 $$$TMP=$$$TMP+1 .ENDM $$$TMP = 0 DEV UDET DEV UKNO DEV RK03 DEV RK05. DEV RK5F1 DEV RX01I DEV RX02P DEV RL01E DEV RL02L DEV RP02N DEV RP03N DEV RP04C DEV RP05$ DEV RP06 DEV RP07 DEV RK06. DEV RK07S DEV RM02C DEV RM03B DEV RM05D DEV RM80C DEV RS03 DEV RS04. DEV RF11R DEV TK25. DEV TK50M DEV TU10 DEV TU16A DEV TU45$ DEV TU77C DEV TU78 DEV TS11$ DEV TSU0G DEV TSV01 DEV TU80. DEV TU81N DEV TM02 DEV TM03F DEV TM78$ DEV TU56M DEV TU58 DEV TU60$ DEV MSCPD DEV RA60D DEV RA80D DEV RA81D DEV RC25D DEV RD50D DEV RD51D DEV RX50D DEV ML11D DEV TERMD $$$TMP=370V DEV USR0V DEV USR1V DEV USR2V DEV USR3V DEV USR4V DEV USR5V DEV USR6V DEV USR7V .MACRO DEVCD$ .ENDM .MACRO DEV X0 .ENDM .ENDM W  .MACRO ACNDF$,L,B .ASECT.=0TB.LNK:'L'.BLKW 1B.TYP:'L'.BLKB 1B.LEN:'L'.BLKB 1B.TIM:'L'.BLKW 3 B.HID='B'.B.UID:'L'.BLKW 2B.ACN:'L'.BLKW 1B.TID:'L'.BLKB 1 .BLKB 1 B.HEND='B'.$$$HLN=.B.CPU:'L'.BLKW 2B.DIR:'L'.BLKW 2B.QIO:'L'.BLKW 2B.TAS:'L'.BLKW 2B.MEM:'L'.BLKW 3B.BEG:'L'.BLKW 3B.CPUL:'L'.BLKW 2MB.PNT:'L'.BLKW 1B.STM:'L'.BLKB 1$$$TLN=..=$$$TLNB.USE:'L'.BLKB 1B.ACT:'L'.BLKW 1B.UUIC:'L'.BLKW 1 B.UCB:'L'.BLKW 1B.LGO:'L'.BLKW 3B.ULNK:'L'.BLKW 1B.RNA:'L'.BLKW 3B.NAM:'L'.BLKB 14. .BLKB 1 .BLKB 1B.LDS:'L'.BLKB 10. B.ULEN='B'..$$$= <.+77>/100..=$$$TLNB.PRI:'L'.BLKB 1B.TNAM:'L'.BLKW 2.B.TCB:'L' .BLKW 1LB.TST3:'L'.BLKW 1E .BLKW 1B.CUIC:'L'.BLKW 1LB.PUIC:'L'.BLKW 1WB.CTXT:'L'.BLKW 22B.TCKP:'L'.BLKW 2B.OVLY:'L'.BLKW 2.B.EXST:'L'.BLKW 2P B.TLEN='B'.MB.TBLK='B'<.+77>/100.=$$$TLNB.SHDN:'L'.BLKB 1$B.UHD:'L'.BLKW 1B.ULO:'L'.BLKW 1B.ULT:'L'.BLKW 2B.CKP:'L'.BLKW 2B.SHF:'L'.BLKW 2B.RND:'L'.BLKW 2B.FID:'L'.BLKW 3B.DVNM:'L'.BLKB 2.B.UNIT:'L'.BLKW 1B.EXTS:'L'.BLKW 1.B.LSCN:'L'.BLKW 3'B.SCNR:'L'.BLKW 1.B.DSCN:'L'.BLKW 1LB.STSP:'L'.BLKW 2'B.SYSM:'L'.BLKW 1 B.CKUS:'L'.BLKW 3'B.CKSP:'L'.BLKW 21B.CKAL:'L'.BLKW 1L B.SLEN='B'.BB.CPUT:'L'.BLKW 8.B.CTXP:'L'.BLKW 8.B.IDCT:'L'.BLKW 8.B.QIOC:'L'.BLKW 8.B.MIOC:'L'.BLKW 8.B.AIOC:'L'.BLKW 8.B.IPSN:'L'.BLKW 8.B.IPRC:'L'.BLKW 8.B.CKEX:'L'.BLKW 2LB.CFCL:'L'.BLKW 2.B.CFRK:'L'.BLKW 2LB.TLOD:'L'.BLKW 2WB.RLOD:'L'.BLKW 22 .BLKB 82.B.SSBL=.-B.SLEN'$$$= <.+77>/100' .= $$$HLN B.SSLN='B' . .= $$$HLNNB.CTLS:'L'.BLKW 3RB.CSRT:'L'.BLKW 1NB.CRSN:'L'.BLKB 60.' B.CLEN='B'.. .= $$$HLNKB.INAM:'L'.BLKB 14. B.IUIC:'L'.BLKB 6.B.IPSW:'L'.BLKB 6. B.ILEN='B'.' .= $$$HLN'B.DNAM:'L'.BLKW 1'B.DUNT:'L'.BLKB 1' B.DLEN='B'.. .BLKB 1B.DLBL:'L'.BLKW 6BB.DMST:'L'.BLKW 1BB.DUIC:'L'.BLKW 1BB.DVPR:'L'.BLKW 1BB.DACP:'L'.BLKW 2B B.MLEN='B'.L BM.SHR='B'1 BM.NOS='B'2K BM.SYS='B'4' BM.FOR='B'10 .= $$$HLNKB.TOLD:'L'.BLKB 6.B.TNEW:'L'.BLKB 6= B.TMLN='B'. .= $$$HLNB.PNAM:'L'.BLKW 3$B.PPGS:'L'.BLKW 1KB.PNFI:'L'.BLKW 1KB.PFRM:'L'.BLKB 1KB.PPRI:'L'.BLKB 1.B.PDEV:'L'.BLKW 1MB.PPUN:'00('m 1gL'.BLKB 1U B.PLEN='B'.. .= $$$HLN'B.RNAM:'L'.BLKW 3'B.RCDS:'L'.BLKW 1NB.RDEV:'L'.BLKW 1UB.RUNT:'L'.BLKB 1LB.RSOP:'L'.BLKB 1 B.RLEN='B'.K .= $$$HLNTB.LUIC:'L'.BLKW 1CB.LNAM:'L'.BLKB 14.' .BLKB 1 B.LLEN='B'.B.=$$$HLNB.OFID:'L'.BLKW 3'B.ODNM:'L'.BLKB 2B.OUNT:'L'.BLKW 1RB.NFID:'L'.BLKW 3B.NDNM:'L'.BLKB 2B.NUNT:'L'.BLKW 1B.OEXS:'L'.BLKW 1$B.NEXS:'L'.BLKW 1KB.OSCR:'L'.BLKW 1KB.NSCR:'L'.BLKW 1KB.ODSC:'L'.BLKW 1KB.NDSC:'L'.BLKW 1K B.RTLN='B'.' BT.SAB='B'1. BT.UAB='B'2 BT.TAB='B'3' BT.SS='B'11' BT.INV='B'12 BT.TIM='B'13 BT.ALL='B'14 BT.DEA='B'15 BT.MOU='B'16 BT.DMO='B'17 BT.PRT='B'20 BT.DIR='B'21 BT.VOL='B'22 BT.LOG='B'23 BT.CRH='B'24 BT.DST='B'25 BT.RTP='B'26 BT.INP='B'27 BS.ACT='B'200' BS.CRH='B'100D BS.LGO='B'40 BS.CO='B'40B BS.TML='B'20 BS.SIL='B'20 BS.ZER='B'10 BS.SCN='B'4'BF.DST='B'40000SBF.WRT='B'2000BF.SCN='B'1000 BF.SLR='B'400K BF.ERR='B'200' BF.STR='B'100C BF.LSS='B'40 BF.TRN='B'10 BF.XTK='B'4' BF.TSK='B'2' BF.XAC='B'1'B.MAXL='B'128.B.MINL='B'$$$HLN .PSECT' .MACRO ACNDF$ X,Y .ENDM .ENDMFW  .MACRO ACTDF$,L,B .ASECT'.=0TA.GRP:'L' .BLKB 3'A.MBR:'L' .BLKB 3A.PSWD:'L' .BLKB 6A.LNM:'L' .BLKB 14.A.FNM:'L' .BLKB 12.'A.LDAT:'L' .BLKB 6A.NLOG:'L' .BLKB 2A.SYDV:'L' .BLKB 4A.ACN:'L' .BLKW 1A.CLI:'L' .BLKW 2 .BLKW 2DA.LPRV:'L' .BLKW 1A.SID:'L' .BLKW 1'A.DDS:'L' .BLKB 11. .BLKB 10A.FPRO:'L' .BLKW 1FA.RLVL:'L' .BLKW 1 AR.LVL='B'401'A.SALT:'L' .BLKW 1A.ENCT:'L' .BLKB 1 .BLKB 1IA.HPW:'L' .BLKW 4C .IF DF A$$LOG$A.TTY:'L' .BLKB 5MA.PRID:'L' .BLKB 1A.SECD:'L' .BLKB 1A.PRIT:'L' .BLKW 1A.SECT:'L' .BLKW 1 A.RLEN ='B' . .ENDC'A.LEN ='B' 128.L AL.SLV='B' 1 AL.DDS='B' 2 AL.SIL='B' 4 .IF DF A$$LOGL AL.AUT='B' 10 AL.BND='B' 20B AL.RMT='B' 40BAL.NET='B' 100AL.DIS='B' 200AL.PRI='B' 400AL.SEC='B' 1000: .ENDC  .PSECT: .ENDMW  .MACRO SHDDF$,L,B,SYSDEFL PKTDF$L .ASECTL.=0'M.LNK:'L' .BLKW 1LM.LHD:'L' .BLKW 1LM.UCBS:'L'.BLKW 2.M.STS:'L' .BLKW 1 M.LBN:'L' .BLKB 1T .BLKB 1 .BLKW 1M.LGH=.1 .PSECT' MS.MDA'B'=1. MS.CHP'B'=2W .ASECTT.=0.ML.LNK:'L' .BLKW 1ML.LEN:'L' .BLKB 1ML.TYP:'L' .BLKB 1ML.DNC:'L' .BLKB 1 .BLKB 1ML.PRI:'L' .BLKW 1ML.PKT:'L' .BLKB I.LGTH2ML.LGH=. .PSECT MT.PKT'B'=10 I.R0'B'=I.PRM0I.R1'B'=I.PRM+2 .PSECT'ML.FID'B'=ML.PKT+I.IOSB:ML.FSEQ'B'=ML.PKT+I.IOSB+2ML.LBN'B'=ML.PKT+I.PRM+10ML.CNT'B'=ML.PKT+I.PRM+4ML.TCB'B'=ML.PKT+I.TCBML.SR0'B'=ML.PKT+I.R0'ML.SR1'B'=ML.PKT+I.R1BML.PR0'B'=ML.PKT+I.PRM+14ML.PR1'B'=ML.PKT+I.PRM+16G .MACRO SHDDF$,X,Y,Z .ENDM .ENDMW  .MACRO MKDEF$ $$$GBL .MCALL .WORD.,DEFIN$T .IF IDN <$$$GBL>,....GBL=1 .IFF ...GBL=0 .ENDC .WORD. IO.GRN 0,6.B .WORD. IO.SIZ 0,7.. .WORD. IO.ORG 0,9. .WORD. IO.INT 0,24. .WORD. IO.IIN 0,25. .WORD. IO.PRG 0,26. .WORD. IO.ERR 0,27. .WORD. IO.RSA 0,28. .WORD. IO.CST 0,29. .WORD. IO.MSK 0,30. .WORD. IO.CLM 0,31. .WORD. IO.SSI 1,7.' .WORD. IO.SOR 1,9.R .WORD. IO.SIN 1,24. .WORD. IO.SII 1,25. .WORD. IO.SMA 1,26. .WORD. IO.SER 1,27. .WORD. IO.SMK 1,30. .WORD. IO.CII 3,25. .WORD. IO.CMA 3,26. .WORD. IO.CER 3,27. IE.IDS=-25. IS.MAN=2 EPT=1 MS.SET=2. MS.CLR=4D .ENDMW  .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 .ENDMW  .MACRO UCBDF$,L,B,TTDEF,SYSDEF. .ASECT .=177772 .IF NB SYSDEF .IF DF A$$CNT.=.-2R .ENDC .IF DF L$$GCL.=.-2. .ENDC.=.-22 .IF DF N$$DIR.=.-2. .ENDC U.UAB:'L'2 .IF DF A$$CNT .BLKW 1 .ENDC U.LOG:'L'= .IF DF L$$GCL. .BLKW 1 .ENDC U.FPRO:'L' .BLKW 1 U.CTX:'L'9 .IF DF N$$DIR .BLKW 1 .ENDC .ENDCU.MUP:'L' .BLKW 1LU.LUIC:'L' .BLKW 1U.OWN:'L' .BLKW 1KU.DCB:'L' .BLKW 1KU.RED:'L' .BLKW 1.U.CTL:'L' .BLKB 1AU.STS:'L' .BLKB 00(/TADATADATADATADATADATADATADATADATA1NU.UNIT:'L' .BLKB 1U.ST2:'L' .BLKB 1CU.CW1:'L' .BLKW 1EU.CW2:'L' .BLKW 17U.CW3:'L' .BLKW 1U.CW4:'L' .BLKW 1-U.SCB:'L' .BLKW 1 U.ATT:'L' .BLKW 1NU.BUF:'L' .BLKW 1  .BLKW 1U.CNT:'L' .BLKW 1:U.UCBX='B'U.CNT+2TU.ACP='B'U.CNT+4U.VCB='B'U.CNT+6U.CBF='B'U.CNT+2U.UMB='B'U.CNT+10OU.PRM='B'U.CNT+12TU.ICSR='B'U.CNT+16U.SLT='B'U.CNT+20CU.SPRM='B'U.CNT+22U.UTIL='B'U.CNT+16 UU.SER ='B'1 UU.RCT ='B'2 UU.AVN ='B'4 UU.GUS ='B'10L UU.ONL ='B'20T UU.SPC ='B'40UU.ATN ='B'100UU.RDY ='B'200UU.ABO ='B'400 UU.SIO ='B'1000LUU.IOS ='B'2000:UU.BLK ='B'4000U.BPKT='B'U.CNT+20U.MEDI='B'U.BPKTU.UC2X='B'U.CNT+24U.SNUM='B'U.CNT+10U.FCDE='B'U.CNT+12U.KRB1='B'U.CNT+14.=0: .BLKW 9.'X.NAME:'L' .BLKW 2X.IOC:'L' .BLKW 2CX.ERSL:'L' .BLKB 1X.ERHL:'L' .BLKB 1X.ERSC:'L' .BLKB 1X.ERHC:'L' .BLKB 1X.WCNT:'L' .BLKW 2X.CYLC:'L' .BLKW 2X.CCYL:'L' .BLKW 1X.FCUR:'L' .BLKB 1 X.FLIM:'L'X.DSKD:'L' .BLKB 1X.DNAM:'L' .BLKW 1X.UNIT:'L' .BLKB 1X.CSTS:'L' .BLKB 1X.CPCB:'L' .BLKW 1X.CSBA:'L' .BLKW 1X.CCED:'L' .BLKW 2X.XDAT:'L' .BLKB 1X.XRDA:'L' .BLKB 1X.XDIR:'L' .BLKB 1X.XLOG:'L' .BLKB 1X.XOVR:'L' .BLKB 1X.CST2:'L' .BLKB 1 X.LGTH='B'.' X.DFFL='B'10. X.DFSL='B'8. X.DFHL='B'5. XC.ENA='B'200B XC.ACT='B'100' XC.DFR='B'040R XC.DIR='B'020 XC.OVR='B'010B XC.DAT='B'004. XC.LOG='B'002' XC.RDA='B'001Y X2.DEA='B'12XX.MAX='B'127. XX.DAT='B'5. XX.RDA='B'5. XX.DIR='B'1. XX.LOG='B'1. XX.OVR='B'4..=01X.MLUN:'L'.BLKW 11X.UNFL:'L'.BLKW 11 .BLKW 2X.UNTI:'L'.BLKW 4'X.MEDI:'L'.BLKW 2'X.SHUN:'L'.BLKW 1'X.SHST:'L'.BLKW 1'X.TRCK:'L'.BLKW 1'X.GRP:'L'.BLKW 1X.CYL:'L'.BLKW 1X.USVR:'L'.BLKB 1SX.UHVR:'L'.BLKB 1GX.RCTS:'L'.BLKW 1'X.RBNS:'L'.BLKB 1X.RCTC:'L'.BLKB 1AX.UNSZ:'L'.BLKW 2'X.VSER:'L'.BLKW 2R X.DUSZ='B'.2 .IF NB TTDEF1.=U.BUFT U.TAPR:'L'U.TUX:'L' .BLKW 1AU.TSTA:'L' .BLKW 4U.UIC:'L' .BLKW 1U.TFRQ:'L' .BLKW 1U.TFLK:'L' .BLKW 1U.TCHP:'L' .BLKB 1U.TCVP:'L' .BLKB 1U.TTYP:'L' .BLKB 1U.TMTI:'L' .BLKB 1U.TTAB:'L' .BLKW 1 .=.-2U.TECO:'L' .BLKB 1U.TBSZ:'L' .BLKB 1U.TLPP:'L' .BLKW 1U.TST5:'L' .BLKW 1U.TST6:'L' .BLKW 1U.TIXL:'L' .BLKW 1U.ACB:'L' .BLKW 1RU.AFLG:'L' .BLKW 1U.ADMA:'L' .BLKW 1U.LINS:'L' .BLKB 1U.CREN:'L' .BLKB 1U.SRVN:'L' .BLKW 1U.SESN:'L' .BLKB 1U.SLSZ:'L' .BLKB 1U.RSBB:'L' .BLKW 1U.RBHA:'L' .BLKW 1U.RSDV:'L' .BLKW 1U.TRLH:'L' .BLKW 1U.TRSC:'L' .BLKW 1U.CCBA:'L' .BLKW 1 UL.TRS='B'1' UL.TDA='B'2. UL.LST='B'4B UL.RDA='B'10 UL.ECH='B'20 UL.RSS='B'100 UL.LEN='B'200W LE.HIP='B'20 LE.TDC='B'40 LE.CIP='B'100. S1.RST='B'1P S1.ESC='B'2 S1.RSP='B'4L S1.PTH='B'10 S1.RNE='B'20 S1.TSY='B'40 S1.OBY='B'100B S1.IBY='B'200' S1.DPR='B'400DS1.DEC='B'1000S1.IBF='B'2000S1.DSI='B'4000S1.RES='B'10000'S1.RNF='B'20000'S1.TNE='B'40000ZS1.USI='B'100000 S2.RCU='B'11 S2.WRA='B'6. S2.WRB='B'2V S2.WAL='B'10 S2.BRQ='B'20 S2.SRQ='B'40 S2.ORQ='B'100C S2.IRQ='B'200 S2.FLF='B'400LS2.ELF='B'1000 S2.CR='B'2000AS2.OBF='B'4000S2.PCU='B'100000S2.BEL='B'20000WS2.CTO='B'40000ES2.CTS='B'100000 S3.ACR='B'1R S3.TAB='B'2E S3.CTC='B'4R S3.RAL='B'10 S3.NEC='B'20 S3.TSY='B'40 S3.8BC='B'100Y S3.FDX='B'200Y S3.MHE='B'400RS3.ICE='B'1000S3.TME='B'2000S3.PTH='B'4000S3.RES='B'10000'S3.PPT='B'20000'S3.RUB='B'40000' S4.HFL='B'7U S4.VFL='B'10 S4.HFF='B'20 S4.HHT='B'40 S4.DLO='B'1002 S4.HSY='B'200B S4.ANI='B'400QS4.AVO='B'1000S4.BLK='B'2000S4.DEC='B'4000S4.EDT='B'10000'S4.RGS='B'200000S4.SFC='B'400000S4.ABD='B'100000 S5.SW1='B'10 S5.TMM='B'2' S5.XOF='B'4C S5.XON='B'10 S5.HPC='B'14 S5.HPO='B'20 S5.OXF='B'40 S5.ITI='B'1003 S5.DEP='B'200T S5.DMA='B'400CS5.CLN='B'1000S5.RPO='B'2000S5.DWA='B'4000S5.VER='B'10000'S5.BCC='B'20000'S5.DAO='B'400000S5.ABP='B'100000 S6.LAT='B'1' S6.EIO='B'400LS6.RLU='B'1000S6.RDI='B'100000 .ENDC.=U.UNITU.OCNT:'L'.BLKB 1Y.=U.BUFU.RPKT:'L'.BLKW 1AU.WPKT:'L'.BLKW 1'U.IAST:'L'.BLKW 10U.OAST:'L'.BLKW 1'U.AAST:'L'.BLKW 1 .IF NB TTDEF0.IIF N00(7m 1gE U.AAST+2-U.UIC .ERROR0 .ENDC .=U.AAST+4U.PTCB:'L'.BLKW 1' .=U.BUF+2'U.CTCB:'L' .BLKW 1U.COTQ:'L' .BLKW 2U.RED2:'L' .BLKW 1 .PSECTD DV.REC='B'15 DV.CCL='B'2 DV.TTY='B'40 DV.DIR='B'10 DV.SDI='B'20 DV.SQD='B'40 DV.MSD='B'100D DV.UMD='B'2005 DV.MBC='B'400 DV.EXT='B'4006DV.SWL='B'1000DV.ISP='B'2000DV.OSP='B'4000DV.PSE='B'10000DV.COM='B'20000YDV.F11='B'40000TDV.MNT='B'100000U2.DH1='B'100000U2.DJ1='B'40000U2.RMT='B'20000'U2.HFF='B'10000 U2.L8S='B'100000U2.NEC='B'4000U2.CRT='B'2000U2.ESC='B'1000 U2.LOG='B'400' U2.SLV='B'200U U2.DZ1='B'100' U2.HLD='B'40 U2.AT.='B'20 U2.PRV='B'10 U2.L3S='B'4C U2.VT5='B'2' U2.LWC='B'1' UM.OVR='B'1' UM.CLI='B'36 UM.DSB='B'2000 UM.NBR='B'400UM.CNT='B'1000UM.CMD='B'2000UM.SER='B'4000UM.KIL='B'10000VU2.R04='B'100000U2.7CH='B'10000PU3.UPC='B'20000'U3.PAR='B'40000'U3.OPA='B'100000 U3.FDX='B'1M U3.DBF='B'2 U3.RPR='B'40 U4.CR='B'100 UC.ALG='B'200' UC.NPR='B'100F UC.QUE='B'40 UC.PWF='B'20 UC.ATT='B'10 UC.KIL='B'4' UC.LGH='B'3' US.BSY='B'200' US.MNT='B'100' US.FOR='B'40 US.MDM='B'20 US.PWF='B'10 US.ABO='B'1P US.MDE='B'2L US.WCK='B'10 US.SPU='B'2L US.VV='B'1 US.CRW='B'4M US.DSB='B'2M US.OIU='B'1 US.FRK='B'2 US.SHR='B'10 US.LAB='B'4' US.OFL='B'1' US.RED='B'2L US.PUB='B'42 US.UMD='B'10 US.PDF='B'20 US.MUN='B'40 US.TRN='B'100R US.SIO='B'200O UD.UNS='B'0 UD.200='B'1 UD.556='B'2 UD.800='B'3 UD.160='B'4 UD.625='B'5' UD.8K='B'6 .MACRO UCBDF$,X,Y,Z,A .ENDM .ENDMW  .MACRO MTADF$,L,B .ASECT0.=0SV.TCNT:'L' .BLKW 1V.TYPE:'L' .BLKB 1V.VCHA:'L' .BLKB 1V.LABL:'L' .BLKB 12.V.NXT:'L' .BLKW 1SV.MVL:'L' .BLKW 11V.UVL:'L' .BLKW 1DV.ATL:'L' .BLKW 1'V.UCB:'L' .BLKW 1SV.RVOL:'L' .BLKB 1V.MOU:'L' .BLKB 1V.TCHR:'L' .BLKW 1V.SEQN:'L' .BLKW 1V.SECN:'L' .BLKW 1V.TPOS:'L' .BLKB 1V.PSTA:'L' .BLKB 1V.TIMO:'L' .BLKW 1V.STAT:'L' .BLKW 3V.TRTB:'L' .BLKB 1V.EFTV:'L' .BLKB 1V.BLKL:'L' .BLKW 1V.RECL:'L' .BLKW 1V.FNAM:'L' .BLKW 3V.FTYP:'L' .BLKW 1V.FVER:'L' .BLKW 1V.CDAT:'L' .BLKW 2V.EDAT:'L' .BLKW 2V.BLKC:'L' .BLKW 2V.RTYP:'L' .BLKB 1V.FATT:'L' .BLKB 1 .BLKB 30..V.WIND:'L' .BLKW 4.V.MST2:'L' .BLKW 1:V.FABY:'L' .BLKB 1L .BLKB 1V.ANSN:'L' .BLKB 17.V.BOFF:'L' .BLKB 1.V.DENS:'L' .BLKB 1.V.DRAT:'L' .BLKB 1.V.DBLK:'L' .BLKW 1.V.DREC:'L' .BLKW 1. S.VSCB='B'.' .PSECT1 .ASECT'.=0L W.CTL:'L'.BLKW 1L V.WINC='B'V.WIND+W.CTL .PSECT' .ASECT.=0L .IF DF R$$11MM.NXT:'L' .BLKW 1. .ENDCM.UIC:'L' .BLKW 1'M.CH:'L' .BLKW 1M.PROT:'L' .BLKW 1 .IF NDF R$$11MC .BLKW 22M.NXT:'L' .BLKW 11 .ENDCM.RVOL:'L' .BLKB 1M.STAT:'L' .BLKB 1M.VIDP:'L' .BLKW 1M.UCB:'L' .BLKW 1Y S.MVL='B'. .PSECTB .ASECT..=0'L.NXT:'L' .BLKW 1FL.VOL1:'L' .BLKB 1L.VOL2:'L' .BLKB 1L.VID1:'L' .BLKB 6L.VID2:'L' .BLKB 6 S.UVL='B'. .PSECT.VM.OLD ='B' 200.VM.BYP ='B' 100VM.ULB ='B' 40VM.FSC ='B' 20VM.EXC ='B' 10 V2.INI ='B' 1. V2.XH2 ='B' 2. V2.XH3 ='B' 4.V2.NH3 ='B' 10V2.OAC ='B' 20 VP.RM ='B' 2 VP.WM ='B' 4 VP.UCM ='B' 6. VP.SM ='B' 10FVP.MOU ='B' 20VP.RWD ='B' 40VP.VFY ='B' VP.RWDVP.POS ='B' 100 VP.TO='B'1LWI.RDV ='B' 400.WI.WRV ='B' 1000WI.EXT ='B' 2000WI.LCK ='B' 4000MS.VER ='B' 200: MS.RID ='B' 1. MS.NMO ='B' 21 MS.TMO ='B' 4LMS.EXP ='B' 10 MO.OVR ='B' 12 MO.UIC ='B' 2. MO.PRO ='B' 4CMO.160 ='B' 10 .ENDMW  .MACRO UDADF$,L,B .ASECT.=0CP.CRF:'L'.BLKB 4P.UNIT:'L'.BLKB 2  .BLKB 2P.OPCD:'L'.BLKB 1B .BLKB 1P.MOD:'L'.BLKB 2P.BCNT:'L'.BLKB 44P.BUFF:'L'.BLKB 12.SP.LBN:'L'.BLKB 4 .BLKB 16. P.END:'L'0 P.LENG='B'. .=P.BCNTP.OTRF:'L'.BLKB 4..=P.BCNT .BLKB 2P.UNFL:'L'.BLKB 2 .BLKB 12.P.DVPM:'L'.BLKB 4=P.SHUN:'L'.BLKB 2BP.CPSP:'L'.BLKB 2 .=P.BCNT .BLKB 2P.UNFL:'L'.BLKB 2E .BLKB 12. .BLKB 4P.FORM:'L'.BLKB 2.P.SPED:'L'.BLKB 2O.=P.BCNTP.RBN:'L'.BLKB 4.=P.BCNT .BLKB 4 .BLKB 12.P.FMTI:'L'.BLKB 4R.=P.BCNTP.RECC:'L'.BLKB 4 P.TMGC:'L'.BLKB 4D.=P.BC00(?TADATADATADATADATADATADATADATADATANTP.VRSN:'L'.BLKB 2:P.CNTF:'L'.BLKB 2'P.HTMO:'L'.BLKB 2' .BLKB 2P.TIME:'L'.BLKB 8.P.CNTP:'L'.BLKB 4: .=P.OPCD+1P.FLGS:'L'.BLKB 1.P.STS:'L'.BLKB 2 .=P.BCNT+16.P.FBBK:'L'.BLKB 4K.=P.BCNTP.OTRF:'L'.BLKB 4BP.CMST:'L'.BLKB 2B.=P.BCNTP.MLUN:'L'.BLKB 2=P.UNFL:'L'.BLKB 2. .BLKB 4P.UNTI:'L'.BLKB 8.P.MEDI:'L'.BLKB 4'P.SHUN:'L'.BLKB 2'P.SHST:'L'.BLKB 2P.TRCK:'L'.BLKB 2=P.GRP:'L'.BLKB 2P.CYL:'L'.BLKB 2P.USVR:'L'.BLKB 1CP.UHVR:'L'.BLKB 1 P.RCTS:'L'.BLKB 2 P.RBNS:'L'.BLKB 1NP.RCTC:'L'.BLKB 1F.=P.SHUNP.FORM:'L'.BLKB 2 P.SPED:'L'.BLKB 2EP.FMEM:'L'.BLKB 2P.=P.TRCKP.UNSZ:'L'.BLKB 4LP.VSER:'L'.BLKB 4T.=P.FMEMP.MXWR:'L'.BLKB 4.P.NREC:'L'.BLKB 2=.=P.BCNTP.VRSN:'L'.BLKB 2.P.CNTF:'L'.BLKB 2=P.CTMO:'L'.BLKB 2BP.CSVR:'L'.BLKB 1BP.CHVR:'L'.BLKB 1.P.CNTI:'L'.BLKB 8..=P.BCNTP.RCSK:'L'.BLKB 4BP.TMSK:'L'.BLKB 4B.=0L.CRF:'L'.BLKB 4L.UNIT:'L'.BLKB 22L.SEQ:'L'.BLKB 2L.FMT:'L'.BLKB 1L.FLGS:'L'.BLKB 1 L.EVNT:'L'.BLKB 2 L.CNTI:'L'.BLKB 8.L.CSVR:'L'.BLKB 1 L.CHVR:'L'.BLKB 1ML.MLUN:'L'.BLKB 2DL.UNTI:'L'.BLKB 8.L.USVR:'L'.BLKB 1RL.UHVR:'L'.BLKB 1  .BLKB 2L.VSER:'L'.BLKB 4M .BLKB 16. L.LENG='B'.. .=L.MLUN+2L.BADR:'L'.BLKB 4R .=L.UHVR+1L.LVL:'L'.BLKB 1L.RTRY:'L'.BLKB 1KL.VSER:'L'.BLKB 4KL.HDCD:'L'.BLKB 4KL.SDI:'L'.BLKB 12. .=L.UHVR+1L.SCYL:'L'.BLKB 2 .=L.UHVR+1L.FMTD:'L' .BLKB 2L.GPCT:'L' .BLKB 4L.FSVR:'L' .BLKB 1L.FHVR:'L' .BLKB 1.=L.FMTD .BLKB 10.KL.STI:'L' .BLKB 62..=P.MEDIP.POS:'L' .BLKB 4.=P.FORMP.TRBC:'L' .BLKB 4 .PSECTN OP.ABO='B'1. OP.ACC='B'16. OP.AVL='B'8. OP.CCD='B'17.R OP.CMP='B'32.. OP.DAP='B'11.' OP.ERS='B'18.L OP.FMT='B'47.' OP.FLU='B'19.2 OP.GCS='B'2. OP.GUS='B'3. OP.ONL='B'9. OP.RD='B'33. OP.REP='B'37. OP.RPL='B'20. OP.SCC='B'4. OP.SUC='B'10.: OP.WR='B'34. OP.WTM='B'36.COP.END='B'128. OP.SEX='B'7. OP.AVA='B'64.2 OP.DUP='B'65.L OP.ACP='B'66.' OP.ERG='B'26MD.CSE='B'20000=MD.CMP='B'40000 MD.EXP='B'100000MD.ERR='B'10000I MD.OBC='B'4. MD.REV='B'10 MD.RWD='B'2' MD.UNL='B'20MD.SCH='B'4000MD.SCL='B'2000MD.SEC='B'1000 MD.SER='B'400R MD.SSH='B'200. MD.WBN='B'100' MD.WBV='B'40 MD.SEQ='B'20 MD.DLE='B'200' MD.EXC='B'40 MD.IMM='B'100' MD.ALL='B'2' MD.SPD='B'13 MD.FEU='B'1' MD.VOL='B'2' MD.NXU='B'1C MD.RIP='B'1C MD.IMF='B'2W MD.CWB='B'10 MD.SWP='B'4P MD.SHD='B'20 MD.PRI='B'1 EF.BBR='B'200 EF.BBU='B'100 EF.LOG='B'40 EF.SEX='B'20 EF.EOT='B'10 EF.PLS='B'4' CF.ATN='B'200P CF.MSC='B'100E CF.OTH='B'40 CF.THS='B'20CF.RPL='B'100000 CF.SHD='B'2U CF.576='B'1S UF.CMR='B'1D UF.CMW='B'2UF.RPL='B'100000UF.INA='B'40000S UF.RMV='B'200WUF.SCH='B'4000UF.SCL='B'2000 UF.WBN='B'100'UF.WPH='B'20000'UF.WPS='B'10000' UF.576='B'4' UF.VSS='B'40 UF.VSU='B'20 FM.CNT='B'0' FM.BAD='B'1C FM.DSK='B'2C FM.SDI='B'3W FM.SDE='B'40 FM.TPE='B'5P FM.DEL='B'70 FM.FEL='B'10 FM.STI='B'60 LF.SUC='B'2000 LF.CON='B'1000 LF.SNR='B'10 ST.MSK='B'37 ST.SUB='B'40 ST.SUC='B'00 ST.CMD='B'1' ST.ABO='B'2' ST.OFL='B'3' ST.AVL='B'4' ST.MFE='B'5S ST.WPR='B'65 ST.CMP='B'7C ST.DAT='B'8. ST.HST='B'9. ST.CNT='B'10.F ST.DRV='B'11. ST.DIA='B'31. ST.BOT='B'15 ST.FMT='B'14 ST.LED='B'23 ST.POL='B'21 ST.RDT='B'20 ST.SEX='B'22 ST.TM ='B'16 ST.SUB='B'40 TF.800='B'1 TF.PE='B'2 TF.GCR='B'4C TF.BLK='B'10ST.NML='B'0*ST.SUB+ST.SUC0ST.SDI='B'1*ST.SUB+ST.SUC0ST.CON='B'2*ST.SUB+ST.SUC0ST.DUP='B'4*ST.SUB+ST.SUC'ST.ONL='B'8.*ST.SUB+ST.SUCST.SON='B'16.*ST.SUB+ST.SUC'ST.IPT='B'0*ST.SUB+ST.CMD'ST.UNK='B'0*ST.SUB+ST.OFL'ST.VOL='B'1*ST.SUB+ST.OFL'ST.IOP='B'2*ST.SUB+ST.OFL'ST.DPU='B'4.*ST.SUB+ST.OFLST.DIS='B'8.*ST.SUB+ST.OFLST.HWP='B'256.*ST.SUB+ST.WPRST.SWP='B'128.*ST.SUB+ST.WPRST.FER='B'0*ST.SUB+ST.DAT'ST.CTO='B'0*ST.SUB+ST.CNT'ST.FDC='B'1.*ST.SUB+ST.MFEST.FSH='B'2.*ST.SUB+ST.MFEST.FST='B'3.*ST.SUB+ST.MFEST.576='B'5.*ST.SUB+ST.MFEST.FCT='B'6.*ST.SUB+ST.MFEST.FEC='B'7.*ST.SUB+ST.MFEST.ISH='B'2.*ST.SUB+ST.DATST.DST='B'3.*ST.SUB+ST.DATST.ECC='B'7.*ST.SUB+ST.DATEV.ISH='B'00(Gm 1g2.*ST.SUB+ST.DATEV.DST='B'3.*ST.SUB+ST.DATEV.ECC='B'7.*ST.SUB+ST.DATEV.EC1='B'8.*ST.SUB+ST.DATEV.EC2='B'9.*ST.SUB+ST.DATEV.EC3='B'10.*ST.SUB+ST.DATTEV.EC4='B'11.*ST.SUB+ST.DATTEV.EC5='B'12.*ST.SUB+ST.DATAEV.EC6='B'13.*ST.SUB+ST.DAT'EV.EC7='B'14.*ST.SUB+ST.DATEV.EC8='B'15.*ST.SUB+ST.DATTST.ODA='B'1.*ST.SUB+ST.HSTST.ODB='B'2.*ST.SUB+ST.HSTST.NXM='B'3.*ST.SUB+ST.HSTST.PAR='B'4.*ST.SUB+ST.HSTST.SDS='B'1.*ST.SUB+ST.CNTST.EDC='B'2.*ST.SUB+ST.CNTST.IDS='B'3.*ST.SUB+ST.CNTEV.SDS='B'1.*ST.SUB+ST.CNTEV.EDC='B'2.*ST.SUB+ST.CNTEV.IDS='B'3.*ST.SUB+ST.CNTST.SRT='B'1.*ST.SUB+ST.DRVST.SRI='B'2.*ST.SUB+ST.DRVST.POE='B'3.*ST.SUB+ST.DRVST.RDY='B'4.*ST.SUB+ST.DRVST.CLK='B'5.*ST.SUB+ST.DRVST.RSP='B'6.*ST.SUB+ST.DRVST.SUR='B'7.*ST.SUB+ST.DRVST.PSP='B'8.*ST.SUB+ST.DRVEV.SRT='B'1.*ST.SUB+ST.DRVEV.SRI='B'2.*ST.SUB+ST.DRVEV.POE='B'3.*ST.SUB+ST.DRVEV.RDY='B'4.*ST.SUB+ST.DRVEV.CLK='B'5.*ST.SUB+ST.DRVEV.RSP='B'6.*ST.SUB+ST.DRVEV.SUR='B'7.*ST.SUB+ST.DRVEV.PSP='B'8.*ST.SUB+ST.DRV MSCNT='B' 1E DISK='B' 2 DISKLT='B' 4 RSVD.0='B' 0.U HSC50 ='B' 1.T UDA50 ='B' 2.T RC25 ='B' 3.' VMS ='B' 4.V TU81 ='B' 5.S UDA5A ='B' 6.T RD.RX ='B' 7.U T1020 ='B' 8.K TK50 ='B' 9.TRUX50 ='B' 10.QDA50 ='B' 13.TK70 ='B' 14.RRD50 ='B' 16.RQDX3 ='B' 19. RA80 ='B' 1 RC25 ='B' 2 RCF25 ='B' 3 RA60 ='B' 4 RA81 ='B' 5 RD51 ='B' 6 RX50 ='B' 7 RD52 ='B' 10+ RD53 ='B' 11' RX33 ='B' 12D RA82 ='B' 13. RD31 ='B' 14 RD54 ='B' 15. RRD50 ='B' 16P RX31 ='B' 17+ RX32 ='B' 20B RX18 ='B' 2127; THEREFORE "DURA 80" IS ENCODED AS .WORD 022544,010120' .MACRO UDADF$ X,Y .ENDM .ENDMW  .MACRO SPMDF$,L,B .MCALL SPMHK$ .MACRO $DFINI TYPE,INIVAL TYPE'VAL=INIVAL TYPE'MIN=INIVAL .ENDM $DFINI5 .MACRO $DFN TYPE,SYM,LEN TYPE'SYM=TYPE'VAL TYPE'VAL=TYPE'VAL+1 .IIF NB LEN TYPE'SYM'L=LEND .ENDM $DFN .MACRO $DFN2 TYPE,SYM TYPE'SYM=TYPE'VAL TYPE'VAL=TYPE'VAL+2 .ENDM $DFN2  .MACRO $DFEND TYPE1 TYPE'MAX=TYPE'VAL .ENDM $DFEND SPMHK$' .PSECT8 .MACRO SPMDF$ X,Y .ENDM .ENDM SPMDF$DRW  .MACRO SPMHK$,L,B$ .ASECTN $DFINI H$,2 $DFN2 H$,CDRP $DFN2 H$,RTSK $DFN2 H$,XTSK $DFN2 H$,SCTX $DFN2 H$,LCTX $DFN2 H$,ACRG $DFN2 H$,USTP $DFN2 H$,QAST $DFN2 H$,EXTK $DFN2 H$,QPAR $DFN2 H$,QLDR $DFN2 H$,GLDR $DFN2 H$,FLDR $DFN2 H$,RLPR $DFN2 H$,QDRV $DFN2 H$,GPKT $DFN2 H$,IODN $DFN2 H$,IOFN $DFN2 H$,QAC1 $DFN2 H$,QAC2 $DFN2 H$,GACP $DFN2 H$,CRVT $DFN2 H$,ELVT $DFN2 H$,OVLY $DFN2 H$,SYEN $DFN2 H$,SYXT $DFN2 H$,EIDL $DFN2 H$,XIDL $DFN2 H$,USER $DFEND H$ .PSECT, .MACRO SPMHK$ X,Y .ENDM .ENDM SPMHK$W  .MACRO BGCK$A FAC,ERR,TYPE ...FLG = -1 .IF B TYPEC EMT 374 ...FLG=0$ .ENDC .IF IDN , EMT 375 BR .+6, ...FLG=02 .IFFR .IF IDN , EMT 374 ...FLG=0 .IFF .IF IDN , HALT$ ...FLG=0F .IFF$! .IF IDN ,2 ...FLG=1 .IFF& .IF IDN , ...FLG=2, .IFF .IF IDN , ...FLG=3$ .ENDC .ENDC .ENDC .ENDC .ENDCP .ENDC- .IIF LT ...FLG, .ERROR BGCK$A - UNKNOWN TYPEA .IIF LT ...FLG, .MEXIT .IF B FAC .ERROR  .MEXIT  .ENDC .IF B ERR .ERROR  .MEXIT .ENDC .IF EQ ...FLG .WORD FAC .WORD ERR .ENDC .IF GE ...FLG -1F MOV #FAC,@#$BCFAC MOV #ERR,@#$BCERR .ENDC .IF EQ ...FLG -1  .WORD MOV!0737,$BCPCF JMP @#$CRENTT .ENDC .IF EQ ...FLG-3 .WORD MOV!0737,$BCPC  JMP @#$CRAL2 .ENDC .ENDM BGCK$A W  .MACRO BGCK$R FAC,ERR,TYPE ...FLG=-1 .IF NB FAC .IF IDN , .IF NDF X$$DBTK .IF NDF R$$PRO ...FLG=0 .ENDCO .IFF ...FLG=0R .ENDC .IFF .IF NDF X$$DBT. .IF DF R$$PRON ...FLG=1 .IFF ...FLG=0 .ENDC. 00(OTADATADATADATADATADATADATADATADATA .IFF- ...FLG=03 .ENDC .ENDC .ENDC .IF EQ ...FLG MOV FAC,@#$BCFACB .ENDC .IF EQ ...FLG-1 MOV FAC,R0C .ENDC ...FLG=-1 .IF NB ERRG .IF IDN , .IF NDF X$$DBT  .IF NDF R$$PRO ...FLG=0 .ENDC .IFF  ...FLG=0 .ENDC .IFF .IF NDF X$$DBT  .IF DF R$$PRO  ...FLG=1 .IFF ...FLG=0 .ENDC .IFF  ...FLG=0 .ENDC .ENDC- .ENDC .IF EQ ...FLG MOV ERR,@#$BCERR .ENDC .IF EQ ...FLG-1 MOV ERR,R1C .ENDC ...FLG = -1 .IF DF R$$PRO .IF NDF X$$DBT .MCALL BTJMP$ BTJMP$R ...FLG=0F .ENDC  .ENDC .IF LT ...FLG ...FLG = -1 .IF B TYPE  EMT 374 ...FLG=0. .ENDC .IF IDN , EMT 375 ...FLG=0F .IFF$ .IF IDN , EMT 374 ...FLG=0 .IFF .IF IDN , HALTE ...FLG=0 .IFFL! .IF IDN ,N JMP @#$CRENTF ...FLG=1 .IFF& .IF IDN , ...FLG=2O .ENDC .ENDCT .ENDC .ENDC  .ENDC .ENDC- .IIF LT ...FLG, .ERROR BGCK$R - UNKNOWN TYPE .IIF LT ...FLG, .MEXIT. .ENDM BGCK$RC`W  .MACRO REBOT$ .MCALL BTJMP$ CLR R0 CLR R1D BTJMP$< .ENDM REBOT$4DW  .MACRO BTJMP$ MOV @#$RBTAD,PC .ENDM BTJMP$ <W  .MACRO BCKDF$ L,B .ASECTTBE.ODD ='B' 000100BE.SGF ='B' 000102BE.BPT ='B' 000104BE.IOT ='B' 000106BE.ILI ='B' 000110BE.EMT ='B' 000112BE.TRP ='B' 000114BE.STK ='B' 000116BE.NPA ='B' 000200BE.SGN ='B' 000201BE.2FR ='B' 000202BE.ISR ='B' 000203BE.FHW ='B' 000204BE.CSR ='B' 000205BE.IDC ='B' 000206BE.ACP ='B' 000207BE.HSP ='B' 000210BE.NCT ='B' 000211BE.NPL ='B' 000300BE.DDA ='B' 000301BE.SIZ ='B' 000302BE.BAK ='B' 000303BE.POV ='B' 000304BE.FSI ='B' 000305BE.GGF ='B' 000400BF.PKS ='B' 000100BF.TTD ='B' 000200BF.EXE ='B' 000300BF.XDT ='B' 000301BF.MP ='B' 000302 BE.NDS ='B' 100100= BE.NCK ='B' 100200B BE.URM ='B' 100300  BE.WTL ='B' 1004000 BE.UNO ='B' 1005002 BE.ILC ='B' 1006002 BE.LNS ='B' 100700 BE.OCP ='B' 101000E BE.MLK ='B' 101100I BE.NIN ='B' 101200P BE.UNP ='B' 101300=BF.POL ='B' 000303BF.ERR ='B' 000304BF.INT ='B' 000305BF.INI ='B' 000306BF.DVI ='B' 000307BF.PAR ='B' 000310BF.XIT ='B' 000311BF.QIO ='B' 000312BF.OPT ='B' 000313BF.ACC ='B' 000314BF.KAS ='B' 000315BF.DIR ='B' 000316BF.SAN ='B' 000317BF.UP ='B' 000400 BE.IN1 ='B' 100100  BE.SP1 ='B' 100200  BE.SP2 ='B' 100300  BE.FNF ='B' 100400 BF.PTS ='B' 100400 .PSECT0 .MACRO BCKDF$ X,Y .ENDM BCKDF$ .ENDM BCKDF$B W  .MACRO CHEDF$,L,B VV$CHE='B'4' .SAVE .ASECTL.=0 H.CSTS:'L'.BLKB 1 H.IIOC:'L'.BLKB 1 H.PAVL:'L'.BLKW 3 H.PKTQ:'L'.BLKW 2 H.CMDH:'L'.BLKW 2 H.CEDH:'L'.BLKW 2 H.TMP1:'L'.BLKW 1 H.TMP2:'L'.BLKW 1 CS.REQ='B'000001CS.RUN='B'000002CS.DNF='B'000004CD.ERR='B'100000CD.DRV='B'040000CD.FIN='B'020000CD.WIP='B'010000CD.DFR='B'004000.=0 E.BNXT:'L'.BLKW 10E.BPRV:'L'.BLKW 10E.PHYA:'L'.BLKW 10E.SIZE:'L'.BLKB 1AE.ST2: 'L'.BLKB 1NE.ANXT:'L'.BLKW 1BE.APRV:'L'.BLKW 1E.LBNH:'L'.BLKW 1$ .BLKB 1 .BLKB 1E.LBNL:'L'.BLKW 1=E.LNXT:'L'.BLKW 1 E.LPRV:'L'.BLKW 1 E.IOPA:'L'E.ATTL:'L'.BLKW 1'E.PCNT:'L'.BLKB 1'E.STAT:'L'.BLKB 1'E.UCB: 'L'.BLKW 1'E.MBXC:'L'.BLKB 1' .BLKB 1 E.LGTH='B'.0 ES.DEL='B'200' ES.ERR='B'100' ES.RIP='B'040R ES.XIP='B'010D ES.WDF='B'004D ES.WIP='B'002.=0PA.ANXT:'L'.BLKW 1'A.IOPA:'L'.BLKW 1N A.LGTH='B'.0 ..=0'S.DAT:'L' .BLKW 2'S.RDA:'L' .BLKW 2'S.DIR:'L' .BLKW 2'S.LOG:'L' .BLKW 2'S.OVR:'L' .BLKW 2'$$$= ..=0.S.LNK:'L' .BLKW 1.S.UCB:'L' .BLKW 1.S.RTOT:'L' .BLKB $$$S.RHIT:'L' .BLKB $$$S.RLOD:'L' .BLKB $$$S.RLAP:'L' .BLKB $$$S.RBIG:'L' .BLKB $$$S.WTOT:'L' .BLKB $$$S.WHIT:'L' .BLKB $$$S.WLAP:'L' .BLKB $$$S.PO00(Wm 1gL:'L' .BLKW 2SS.PSP:'L' .BLKW 2RS.RLE:'L' .BLKW 2'S.WDFR:'L' .BLKW 2 S.SIZE='B'.0 DC$ENA='B'1' DC$DIS='B'2. DC$ACT='B'3 DC$DAC='B'4' DC$RCS='B'5G DC$SET='B'6 DC$CSB='B'7L DC$RSB='B'10DC$CRE='B'100000DC$PAR='B'40000' .RESTORE  .MACRO CHEDF$ Y,Z .ENDM .ENDMW  .MACRO LNMDF$,L,B,SYSDEF. .SAVE .ASECTB.=0L.NLNK:'L' .BLKW 1L.NTBL:'L' .BLKB 1L.NBLK:'L' .BLKB 1L.NSTS:'L' .BLKB 1L.NGRP:'L' .BLKB 1 L.NUCB:'L'L.NTCB:'L' .BLKW 1L.NLNS:'L' .BLKB 1L.NENS:'L' .BLKB 1 L.NNAM:'L' L.NHSZ='B'.L LT.SYS='B'0' LT.GRP='B'1. LT.USR='B'2E LT.TSK='B'3A LT.SES='B'4S LT.INV='B'6T LT.APP='B'5C LS.TRM='B'1S LS.PRV='B'2T LB.LOC='B'1B LB.LOG='B'2B IN.TSK='B'1E IN.SES='B'20 IN.GRP='B'4' IN.SYS='B'10.=0RC.REF:'L' .BLKB 1MC.DDSL:'L' .BLKB 1C.CUIC:'L' .BLKW 1 C.FIXL='B'.. C.DDS:'L'..=0BO$STAT:'L' .BLKW 1O$FLAG:'L' .BLKW 1O$NODS:'L' .BLKW 1O$NODA:'L' .BLKW 1O$DEVS:'L' .BLKW 1O$DEVA:'L' .BLKW 1O$DIRS:'L' .BLKW 1O$DIRA:'L' .BLKW 1O$NAMS:'L' .BLKW 1O$NAMA:'L' .BLKW 1O$TYPS:'L' .BLKW 1O$TYPA:'L' .BLKW 1O$VERS:'L' .BLKW 1O$VERA:'L' .BLKW 1O$TRLS:'L' .BLKW 1O$TRLA:'L' .BLKW 1O$ACCS:'L' .BLKW 1O$ACCA:'L' .BLKW 1O$LTYP:'L' .BLKB 1 .BLKB 1G O$PLEN='B'.S SU$SUC ='B'1ER$NOD ='B'175550MER$DEV ='B'1771001ER$DIR ='B'1770601ER$FNM ='B'176420DER$TYP ='B'174540TER$VER ='B'174460GER$ESS ='B'176640SER$XTR ='B'174340AER$BEQ ='B'177510SER$TRN ='B'174550AER$FTB ='B'176364SFS$NOD ='B'400FS$DEV ='B'200FS$DIR ='B'100FS$QUO ='B'2000. FS$NAM ='B'4 FS$TYP ='B'2 FS$VER ='B'1FS$WCH ='B'4000.FS$WDI ='B'1000' FS$WNA ='B'40S FS$WTY ='B'20$ FS$WVE ='B'101FS$NDF ='B'10000 P.LNON ='B'0 P.LNAM ='B'1 P.LDEV ='B'2 P.LNOD ='B'3 .RESTORES .MACRO LNMDF$ X,Y,Z .ENDM .ENDM~W  .MACRO PRTDF$ L,B .ASECTB.=02P.RIDN:'L' .BLKW 1 PI.LVL='B'401P.ROFF:'L' .BLKW 1P.RSTA:'L' .BLKW 2P.RABO:'L' .BLKW 2P.RRES:'L' .BLKW 2P.RSTO:'L' .BLKW 2P.RMTI:'L' .BLKW 2P.RCPU:'L' .BLKW 2P.RUPU:'L' .BLKW 2P.RCON:'L' .BLKW 2P.RCOF:'L' .BLKW 2P.RUON:'L' .BLKW 2P.RUOF:'L' .BLKW 2P.RLPA:'L' .BLKW 2.=177774P.TTSN:'L' .BLKW 1P.TTDA:'L' .BLKW 1P.TTIN:'L' .BLKW 1P.TTCN:'L' .BLKW 1P.TTTM:'L' .BLKW 1P.TTPW:'L' .BLKW 1P.TTKR:'L' .BLKW 1P.TTUC:'L' .BLKW 1P.TTII:'L' .BLKW 1P.TTOI:'L' .BLKW 1P.TTFP:'L' .BLKW 1 .PSECTP .MACRO PRTDF$ .ENDM PRTDF$1 .ENDM PRTDF$LZW  .MACRO CPRDF$,L,B,SYSDEF .ASECT'.=0WR$FLAG:'L'.BLKW 1W R$LEN:'L''R$OPC:'L' .BLKW 1'R$ADDR:'L'.BLKW 1' R$SIZE'B'= . .PSECT.RF$SYN'B'=100000RF$IMM'B'= 40000RF$LST'B'= 20000RF$IDS'B'= 10000RI$XDR'B'=140003RI$XDW'B'=40002'RI$XDA'B'=20004'RI$XDD'B'=120005RI$CRH'B'=100001RI$BLY'B'=60006.RI$RIN'B'=160007RI$CON'B'=100101 .ASECT'.=0LH$LEN:'L' .BLKB 1LH$TKI:'L' .BLKB 1LH$TYPE:'L' .BLKB 1H$ICNT:'L'.BLKB 1AH$TCB:'L' .BLKW 1PH$TIUC:'L'.BLKW 1FH$VUCB:'L' .BLKW 2H$BIAS:'L' .BLKW 1H$RET:'L' .BLKW 1H$FLAG:'L'.BLKW 1KH$LINK:'L'.BLKW 1$H$STAT:'L'.BLKW 2$ H$SIZE='B'. HF$SHR'B'=1= HF$AST'B'=2 HF$RSP'B'=40 HF$BLK'B'=8= P$BLEN='B'.T P$IID='B'. P$LUN='B'. P$TKI='B'. P$ALEN='B'.I P$DPB='B'. P$UIC='B'. P$LST='B'.P$NAM:'L' .BLKB 1CP$FLG:'L' .BLKB 1Y P$IOP='B'. P$NLUN='B'.0P$LEN:'L' .BLKW 11 P$ADDR='B'.=P$FUNC:'L'.BLKW 1 P$PARM:'L'.BLKW 1 P$BLK:'L' .BLKW 1B .PSECTT HT$TKN='B'1 HT$ADQ='B'2K HT$RUN='B'3' HT$DIR='B'4$ HT$VMS='B'5W HT$PMT='B'6' HT$QIO='B'7E HT$PSB='B'10 HT$RMS='B'11 HT$HLS='B'12 HT$BYE='B'13 HT$SYS='B'100 HT$ACS='B'101 HT$CKR='B'102 HT$CKW='B'103F HT$ILD='B'104B HT$LOV='B'105N HT$BKR='B'106B HT$BKW='B'107 HT$INS='B'110L HT$REM='B'111= HT$GET='B'112. HT$SET='B'113$ HT$VNS='B'114C HT$DOG='B'115K HT$ABO='B'201. HT$RSX='B'202 HT$UCA='B'203  .ASECTR.=0=I$BUF:'L' .BLKW 1 I$LEN:'L' .BLKB 1 I$ID:'L' .BLKB 1B .PSECTT II$DIR='B'1 II$UIC='B'2K II$DNA='B'3' II$ESA='B'4$ II$FAB='B'5W II$FNA='B'6' II$KEY='B'7E II$NAM='B'10 II$RAB='B'11 II$RBK='B'12 II$RBF='B'13 II$R00(_)`TADATADATADATADATADATADATADATADATASA='B'14 II$VFC='B'15 II$UBF='B'16 II$XAB='B'17 II$XBK='B'20 AL$SWS='B'0T AL$BCK='B'1 AL$IMP='B'2B AL$XXD='B'40 SF$BLK='B'1' SF$BIA='B'2' SF$HDR='B'4T SF$AST='B'10 SF$RSP='B'20 SF$IRT='B'40 SF$DRF='B'100SN$TSK='B'SF$BLK!SF$HDR!SF$AST,SN$DIR='B'SF$BLK!SF$BIA!SF$HDR!SF$AST!SF$DRF%SN$IMP='B'SF$BLK!SF$BIA!SF$HDR!SF$ASTKSN$QIO='B'SF$BIA!SF$HDR'SN$PSR='B'SF$BLK!SF$HDR!SF$IRTSN$RSP='B'SF$RSP!SF$IRTWSN$DET='B'SF$HDR!SF$IRT' .PSECTM .MACRO CPRDF$ X,Y,Z .ENDM .ENDM$RBF='B'13 II$R<0W 8@#@?FF$Z$$$LL $LI"$LK$LQ$LY$L`$Lm$L{$$w$,$,$:^$d}$; $;X:$;kz$;ę$T $T $T {$T $T #$T ($T d$T d$T f$T p$T p$T Iq$T Lq$T Qs$T w$T $ 8$ =$ T[$ y$ `$ ,$ `$ _$ !$ 8;$ ;;$ L$ Jm$ $ K$ $ K$ xQ$ Z$ 8^$ A`$ `$ y$ .$ p:$ 8 $ d$ f$ H$ p$ $ $ K$ L$ ]a$ q$ r$ r$ $ !$ 8"$ $ K$ xQ$ (}$ <}$ $ $ p$d $d $d $d $d $d \!$d &$d '$d ($d ,$d 5$d 8$d #:$d ):$d :$d :$d J;$d CM$d +S$d X$d X$d 3X$d X$d Z$d Z$d H^$d d^$d nf$d w$d w$d Bx$d _y$d `y$d y$d $d $d $d $d $d $ $ z$ $ y$ ""$ #$ y:$ :$ D$ N$ S$ T`$ :d$ e$ df$ 3g$ k$ v$ Fw$ x$ y$ $ $ $$ $ $ +$ $ |$ +$'$Y$x$z$$$$'L$Fw$4x$$Z$,$$$z$$ $:$:$_M$S$f$s$v$y$*}$u~$j$$$$:$X $&$[($D$E$@G$G$H$K$Hg$Tg$\g$s$y$~$Ѐ$Ԁ$$$;$\K$K$LT$W$Fw$$$$$ $3$8$t!$8$$K$W$f$g$g$$$p!$.$K$W$8Y$Fw$$ $H!$|:$:$K$H$=$$#$&$Jw$$=$$#$&$Jw$$y$$]($K$W$yX$Z$+e$f$Vg$q$$:$:$s$$K$\M$W$W$ X$(y$~$$$2$2$K$x$$$E$8 $k$$$8$H:$K$\M$.S$W$_X$_$z$$$2$8$K$;M$XM$ N$X$w$$T$T$T#$T4F$TQ$T?T$Tf$T$$|$|$|""$|&$|8$iw$D$Dz$D:$DG$Dg$$s$$-!$#$t:$u:$L$?T$r$U""$\$\$\#$\'L$\?T$\X$\Z$\df$\f$\s$\w$e^$6$Yq$s$!u$!y$#k$#$#L$#Q$#y$#y$#y$#z}$#$#$#Ԁ$#$#$$$$$$y$%'$& <$,.$,8Y$-Lr$.H$0L$0$00)gm 1g0W$0r$0y$0z}$20 $2`m$2(x$3$3p$3x$3$3L$3k$4$4H:$5$58$5r$$$$+${$q!$:d$ q$zs$w$D$%$z$#$w*$H;$Q$S$6/K$A6$D6p!$D6{:$J6`"$K6U<$K6<}$L6$L6;$L6(F$L6Ş$N6$c6$c63$c63$c6G$c6Q$c6@y$c6y$c6$d6($d6xQ$d6Xz$d6$d6$e6($f6$f6$f6 9$f6K$f6xQ$f6Q$f6Z$f6`$f6fa$f6f$f6f$f6g$f6qg$f6w$g6 $h6$i6b$i6$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$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$q8$qU:$q N$qz$ry$r&$r$rq$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$w2$w$;$ws$wp:$w&e$wf$wy$;x. $;x/ $;x0 $;x1 $;x2 $;x3 $;x4 $;x5 $;x$;x$;x$;x$;x$;x$;x$;x$x$x+$x<$xl$xh$x""$x2$xQ$x$xZ$ y$ yz$ yX:$ y g$ yk$ ys$ y$y$y$#z z$jz$"{ $"{Q&$"{h3$"{zH H:GxHdh LHT#HT dH(YH(HԃH@#HH#T[H< NH"{IyH7WH5HdOHzԃH TSH@shҒHH2/Ip&H(HH8Hz0rH U H |RH@H%T|sH|sH@za(H <H8H{dH{`H@{HGHlHHJwH5TUyH8HH4THTHԃ4FHT7xHp!HHz3HTTgHT[(H HPTdH#HTH\gHrXMH8HB8 HTTH H!H"H@HzZH2H6;HH:KHTH:HX H(\H8HHZ;MHBHqH5yHL8H zT^HH8TJgHԃ LHHH:dH@t!HT=_H8YH.H<8H fHTHFwH^H\z_H_XHHPH:H*}H[(H&H2H5EHsH\MHHЀHDHpz2HB NH:HgHfHVgH H&HKH~H&H\MHWHHyXHzHHfKHrH(xHzH+eH=H00)*TADATADATADATADATADATADATADATADATA"WHxHEHdWHKHV:H2H6(yHzYHH#H&.SHKH!KH,KH,:HH gH&XHR](HH$FwHV XHFzLTH"'HH0vH:H#g'H ""H:H yH KH#_MH#s!H +H#H(H zxZHxQH H#zHjHH$H HxlH4xHH.|:H#,xH,H HzWH H##"HKH yH@#9gHx2H H@sH xH=H FwHFwH# LH#H zH# HH +HJwH*zHH WH#!H T"y:Hu~H H'LH SHHz HH@ HfHZH# qH #H#}~H {#ewH -H{"fHT"<H#H HxhHz# gH{#H#l~H#8H#RH#4H#H#u~H#H{#""HT"_MH#H#yH#:H{#Hz{#H#yH#gH#KH#KH#g'H #H#YMH MH#VNH#azH 'H{#RH#u~H{#zHz jHxH@#H# H#H #|H{#yH#HT"uLH#&LHx""H#dH#SH#H#[qHz#xH YH#H# LH#RH#H yH#Hy#KHd J;Hy# LH#}~H y#VNH#R`H"d :HFzd &H##"H&d d^H@y#KH#KH0H#BxH#sH!#H!H zH#g'Hd \!HJy#H ZHz#l~H#Hy#BxHy#l~H#KH #H#Hy#H H#KH#kH(ZHy#H #g'H y#dHz#dHxeH! H#VgH# LHy#VgHy#}~H #3dH Hd HL!xeH{"fHhLHDhyH 3kHLh(FH;5_HMzhsH;5zH@9hKHtp!HtH;5rH ;5OHGz<H;5wHKD6p!H9zH;5zH;5fH>6/KHA6HFhHH:hLH Ah8H;5H;5nMHEDhp!HrH zD6{:H yH ysH0;5$:HD9%H;kzH yX:H99"Hw Hw2H;X:H91H9H;5HwsHz;5UqHI9sH ;5,HJ9pH 9'H;5HA9pH ;5:HH9[HwH@w$;H yH$;ęH9ysH 9HZ9*H y gH%; H9WH ykH yzHO;5HwkH9pH 9hKHtp!HtH;5rH ;5OHGz<H;5wHKD6p!H9zH;5zH;5fH>6/KHA6HFhHH:hLH Ah8H;5H;5nMHEDhp!HrH zD6{:H yH ysH0;5$:HD9%H;kzH yX:H99"Hw Hw2H;X:H91H9H;5HwsHz;5UqHI9sH ;5,HJ9pH 9'H;5HA9pH ;5:HH9[HwH@w$;H yH$;ęH9ysH 9HZ9*H y gH%; H9<0W 4&/M00*m 1g|:hy$t^8=t^s56JhW zDs@$9)@:t @2Hq:@i@    \~h\h}h}h( BBBBBBBBB,4X`hpxJ (B*B,B.B0B2B4B6B8Bp,rt4vXx`zh|p~x(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  $| B` :%dZ vw 700*TADATADATADATADATADATADATADATADATA7TM7HU@E 7tz   p e 77Ɓ 0׭U >sfr7 ($ĝ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ѕ & v5vѕ0 tEe0v V&  r 00*m 1ge.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  fHW 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  $| B` :%dZ vw 77TM7HU@E 7tz   p e 77Ɓ 0׭U >sfr7 ($ĝw)t!MC w7i   e0B7P pJflH l: j@ 7w>MPODcJ BE7IOIL00*TADATADATADATADATADATADATADATADATALsVsjEMTRFPzw 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ѕ & v5vѕ0 tEe0v V&  r e.e e ~&f &ѕ  D~ѕ( ѕ)  < X ѕ@ Ý r Ý`  | ѕ+ѕ#ѕ- & D ! !E7QN09t$v J~ %  6!   6!    D   !?t7Qf  +-'00*m 1g"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"W 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 6nT* wd  4b  $rl B` B% w 777UE 7| b  \ .eT7D7>9Ɓ 0׭'  Dsl"Uh`^7 0>$ĝw)t!MC w 7   e0B7Plr x t: r@ 7fw>4.(MP^[ODPc00*TADATADATADATADATADATADATADATADATA .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 tpeJ ѕ,F2L@4hJzFR  єєєє &&f L$q   D!De /*f   R|:.7 @ D!wwD     ѕ+ : $ .ѕB:ѕ   ѕ & v5vѕ0 tEe0v &> r e.e d>&e ~&f 00*m 1g &ѕ  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  (fW 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 8 |X8, 767 4w  $b   B` % D _ & >   w 777UE   l f <eb7Rls7LGǁ 0f׭5.&Uvnl7 8L#ĝw)t!T fxTTE w7 f f e0B7  : @ PJDMP|00*TADATADATADATADATADATADATADATADATAyODnc, 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@\W Vϳrt^8VϳDs@:t @T(@:@T(@ }\~h\h|}  |}( }00 (LTd\b |}(*,.0246 n|}  p|} r|}( t|}L v|}T x|}d ||}\ nD 6 | @( (LTdl\ DHv <|}D >|}6 @|} B|} D|}| L|}  N|} P|}( R|}L T|}T V|}d X|}l Z|}\dDhHH=HggV01234567SWAMLHCQFXBGIRVEDNV |} |} |} |} |} |} |} |}ATfx}~\/'"% ^_@><$=CQ.;-+*,BDEFGIKLNOPRSUVWXZt&Tfx  "ztztt*2z |}z |}t |}z |}t |}t |} |} |} |} |}* |}2 |} |} |} |}"6RLZdT:\pz |} |} |}6 |}R |}L |}Z |}d |} |}T |} |}: |} |}\ |}p |}v LdlZ |} |}v |}  |}L |} |}d |} |} |} |}l|}^7 @7  0 R767>7 R OD T:  Rz}@ }}}}} }0"}R(},}0}2}66}>>}RX}RZ? 72 " 74  7 &   R 7 R  7 " R w B ,7 nz }}}2} }4(} .46} :}R@}R H}T}Z}b}R ~}n R De@y >%"e0Dl b w  5W 4 T @  Z Z} }@ }y} (}0 .}8} B} T}T n}|}R ;t  3   D b #E = e0,  @ NL (: },}Z} ^}j}Np}Lv}n06  w ? J06 87 _ 67  77  ҇  y~ }0 } }6} }  (}0,}.00*m 1g}66}B}J}N} V}X} j}8w7  !7 77w77%5 f  z} }}}"}*} :}<}P}T}X}\}`}l} ~}d  7m P   D 77 w z}}}}"}(}*}.}0}8}@} F}N}T}X} $b   B` T%/     wz D _ &R}}}:}@}H} P} X} `} l} >  wb 7>77U@E@  @>  eB5p(}>,}2}6}<}@@}H}@T}@X}>\}b}f}r}Btsp  & 77 0f׭U@>@7 f>z} }}} ,}f0}8}>}D}@J}>N}@V}\}b}l}>|x7ĝ( @f&w-t!TTE w>7 f f e0B7 H~} }}T(}@$T( (}8}<}>} H}T\}>`} d}f j}ft}t D: B@ MPODc BE7IOILFP|}} }$}*}0}8}>sHsJ}NsR}X}\}d}l}` EMTRw 7J wH  6        % "b} }}}}*}J2}H8}>}D}F}6 ~}"R  J .3  V   F  r 6 @ \@ R v N D F" }p}Dt}v}XB<<f&fP ( JTaAxa  ts}B }}< }< } &}P2(4} <}JB}T} \}T d}xr} TaAx  % !   %&4T xa fB }T }x F} b}Tf}  h} n}x ~}f~P 7`-J D@@@PF@ @em 7D wFHw    xz }}}}J&}D0}F>}H}DP}FT}HX}^}h}p} v}@f   m77  ` `  V0@7=E `   ыJ} }}}"}&}0}j}r}TF%0%7 75  X5z }0} }}} }} }$}(}.}6} :}H}N}  5??5  %]   f& ׭ 0w h}}}}$}(}4} B} H}N}T} X} jsx J4482 47H82) D4 DwlHE ~ :t  }4:}4}}8 }26}4:}H>}B}8 F}2T}D^}4f}Dp}H FE  $ az +& (%0%%"$ `%T 0 fU  N, Z}F }E }}F} L}0 R} `}T h}0 n}f z} @ e0 , @y P  Ne0, 7N 7 N7N&e N @ e0  w 2 }00*+TADATADATADATADATADATADATADATADATA }y }P:}NH}NL}N~  @f A N  % e ee e d    , }j} |}  B      }W XZXDs@ t2VNh ѱXhY8 h< <( t <^ @ZL 8-7>7 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 gR^ PCPCPC PCPCPC PCPCPC PSPSPS DSDSDS R0R <>\2@R H<^S0R0 R1R1R1 R2R2R2 R3R3R3 R4R4R4 R5R5R5 SPSPSP TOSTOS >><0T 3,  #+ S'  g' ; Bx' 0' P' 8T' ++^q+ +dkW.^qt9?9@;M>8>DXH8HKJKNt Xt .0) %RZJwx{(KXYqsOy*}d|&s)|&,&&&&<&,&.& N&Z)|&N`&4d&f&\g&p&s&x&x&Fy&Ny&c& c&c&=c&c&%c&&c&b'c&d'c&'c&](c&(c&8c&>9c&X:c&y:c&:c&:c&vLc&Yc&{Zc&yc&r&%)|&})|&.})|&4})|&a )|&0M)|c'kM)|e'W)|o'd)|'a )|'~)|(})|(})|(4})|(~)|U(4})|U(0)|(Xa)|(^)|(_)|(` )|(s:( z(b (DG(Z(T[(f(w(w(y(Ry([()Bx)04)W)S)p!)H)H)!)Bx))r) S;4S;S;S;S;""S;2S;3S;:S; NS; RS;YS;JwS;wy<yODOXJOH"='' A> ' Dp' :Bx' P' >d' >8' >r' K<}' Kօ' L ' Ls' Ly' .)|@q%@r%r&>Xu$vu$wu$xu$yu$zu${u$|u$}u$u$u$u$u$u$u$u$ v$Hv$w%Ry&>(Ǝ((6&6&<' 6&""$6&f&>6&w~%'v(3)|00+TADATADATADATADATADATADATADATADATA-T Oسz6&OسDc&yHc&y:Hvu@u@5 @zu@xu@wu@{u@c&X:HS;3H)sE@zc&rHS;Hyu@c&:H(b HXu@`@d@u@u@z>P@c&:HHv@)@}s@|H@([H v@Hd8T@>r@KXH$98@ձ@c&Hh'@$9.@zS;Hc&d'HHc&=Hc&b'HsH(ZHc&'H@(fHc&HƎ@0@(T[Hc&(Hz(H@Kօ@tHdH(wH c&](H)W@)p@S;""H@@q@(wHS;:HLy@P@z.H@@r@(yHRH(RyH)'@JwH@)Ps@' q@S;4H; Bx@K<}@w@.H0Hz`;@S;YH^qHS;H+H9HzS;2HRy@}u@|u@  )!H)BxH) H )WH)rH)HH)p!H )HH z)04H)SH)H)BxH&&fH&\gH &sH&H&<H& NH&xH&N`H&xH$&,Hz&NyH"&FyH &.H&,H&4dH &H&pH&H&Hͫ( zH(s:H$;ONHDOXHz>OHJOH"HXt H JKH>HNt H H8H>8HDXH9@H9?H HKH;MH 5Dez~<~<HJrd&  N  w ~FR  ($.(l,0F2h4h68:>@dBD& F HJ L NN P RTV  >EuB AeueOu%UU"wMe 5 %& 05 :ue jN  5  Aej~UU dBeXPCeL eVe 0 BCe~U   L L  >E  dBe$R~ D~ & 5F*5% 6  %P P  0 F5@ @A- 5 B5%6B0JFT@B@mBAmBu     U  E~  50 \  h ` @ ~ "4VƎ`wdlx>R  u  :  X 5     c7[H[24B[132C[6n8[[c[?"T@q @ ɋ ;B  0 9 f e 0`  w %@mB    @q,@q6 E~  w@0  ` Ce2`54 `  E@t0  t0 500+m 1g 6U& t0 5NB& E% W @&  &D5@  $D  K s.e~ ~ e 4w D4 %56 9 (   h~fe &4~ L5 U5&Ǝ@  eP ~  E  ҁ B~e• D`~ E5@  wPƎ& KmB3eC-4  wB6 % RR D~ D~ 80 C2 4QA8B 5@  ` ` VD45@ +  b  &f  m ~ 8C~meI~ ~ 5!6̇U DE5`u-   t   4 z5@ & B2   nꆇe B` . . 2@   @ B` :Ǝ 톇   ҋ  %UU >u A ˥*  :0e L= : 0  1 hL= x <  l  81@ "B8  5 ZTC2 4 C@ xL=wd 2 l5C@  1e1 1   0   f W W C@& L=@0e r $.    "f $ & H  @2"e $5@  0 &  L=eH~ l   N    4&@`  L  4  lw `ҔD~ LLj &    .&@`  O Z r t w C`~ D~    6OPz  eC~L=l f5@ &- @ P ;  B r 5 : @ w J D-x  2 L=6  w  C~ D-6L=66  h  wB,r @ʢ    1w l ^ w b f #N :B` e~ 0H 2 C6"    e a~ 0 e    D4 R fj D-65@  5   E  C` \ w ” B  ~azT 5@0!0:Aw B5  4DV , 5B~mB`B~ 4~Ǝb ~5>5  ѥ ~eB'@ J~! X  e Ǝ @ f ~ z 5@  14575+5õ@ $ - N 0  ;BC@Ǝb-jZ m õ<  f @   5  N .  E BVfP  %l <|l!t-<%%  <%#t-<. C@%C@ &C@ 0XR wNe B ѥ. ~APBV1 2 UE U@E122A& `1e2ƎS Q$ A5 W RW  W 5W F h &5-5 r'm!WB<&S @q(R.4@FFLJ q~  ,& FB<C Q~f:  t-<0Am< ^5  5t-<5 5@  %6U T5  05  P @0w 5@  25@ 4XuXu\B$L=%5@ & l 6 6w F"5@ 00+TADATADATADATADATADATADATADATADATA 5@ RuVL=6 6d5@   D5@   $ 5@ ,uLul v:     |t-< R w B> <t-< e ` J &Hv@r$@q8RvuVw B> <e ` $  >`  <  <  < < <E Bm< 5#5 \wu`Ǝ2A< C~ f: ( % R A<C~  H5 , 45 f: h  nUzxu~Ǝ`!~B-< F UUw 5 Ue B` B`  JEf:fBAe*BҥƎ6* ~ N5 U v% BEAe ,  w f:Ae$  j 4`yud` X 5 0UC2 hEC@ 0w   5E5 <e  U5<eJ"`  B<w! Lu :u ; w f: 5  0E  &f@ D~ U  r  !: 5 :A4Cz9`NX Am< U E5   4  eы. 4z `&,26ZƎ^Am> e$   AZa%z 09  *zuV{uv|uzƎ-+ +- . Ѡ~ z l   ~5 5  >}uLuPƎ.(C2L=  5 f   F5 : uuuew %UU  ~U@  z %RF 5 :&- *; j  H X:>RDFV-  `w  d1 0 C    e0 e0 ;= u- @e5 5 f@  B $      Bɋ W]W: mKɋ Ry:$9rxP|P~%& ppe ' $%%b'  1  z 1 BrztH0)sE)sE")2H*)2H.ձ4`;B`JPbPf`A1d^w *AHCCHeEfD & pe ͇ ʇ%FuJ< K<}$>PN)sER)sEZ)2Hb)2Hfձl`;v `Dw E) B ",e$FFJ% ~4 C-C`Ale &>8^>Pl:Bxr:BxC ",e%uDH UBE`JF R5H&   5 V5 Z8Th>dp)Pz)pn   @,e fe N,Nv v  1  J jDpn:s ~r zL ~L v|  << & & & & & f& Ε &f  8L L }V}$r @DpDwxb5 f8TT Oγz6&fOγDs@:G@='@$9Y@ ~@@$9΅@Dp@  rhRyh  w ѰB   f& & & & && f& Ε `  ,& & & & f& f& Ε.<='@DpD:G ~ x='|DpH| f& &  ׭W1 ":G ~ $s&$9΅,$9YT Oγz6&<OγD5!@='H<&%t@A> HDpH NTPHLsH >dH >rHz SHL H:BxH>8HKօH gHLyHK<}H  WT WT WT2 WT WT" WT"& WT&WT$  WT226 6DD <&%t^^ tJJ" "ZZ&& b'SYT OγJ'vOγD  LhƎhh, Pf& f& &f&f T Oγz3OγD&ZH&f@&\g@&s@&@&<@& N@&x@&N`@&,@&Fy@&Ny@z&.@&,@&4d@3@&@&p@&@&@   (_hn'~h.h(}h(4}hzU(4}h&o'dhc'kMh(~he'WhU(0h8'a h(XahJ(` h&%h&a h`&}h*&.}h<&4}hN&sh"&0Mhr(^h\(}h   7 7 7 7 7 7 7 P3 &3*3-&,<3?&N3Q&,`3c&<r3u&.7 7 7 7 7 7 7 V3 &3&s,3/&N`>3A&<P3S&fb3e&t3w&\g7 7 7 7 7 7 7 V 3 &4d3& N.31&p@3C&sR3U&xd3g&Fyv3y&Nyz7  3Q&,`3c&<r3u&.7 7 7 7 7 7 7 V3 &3&s,3/&N`>3A&<P3S&fb3e&t3w&\g<0T 4  &)00,TADATADATADATADATADATADATADATADATA S% g%; Bx%0%P%8T%++^q+ +dkW.^qt9?9@;M>8>DXH8HKJKNt Xt .0) %RZJwx{(KXYqsOy*}d|&s'l&,&&&&<&,&.& N&Z'l&N`&4d&f&\g&p&s&x&x&Fy&Ny&c& c&c&=c&c&%c&&c&b'c&d'c&'c&](c&(c&8c&>9c&X:c&y:c&:c&:c&vLc&Yc&{Zc&yc&r&%'l&}'l&.}'l&4}'l&a 'l&0M'lc'kM'le'W'lo'd'l'a 'l'~'l(}'l(}'l(4}'l(~'lU(4}'lU(0'l(Xa'l(^'l(_'l(` 'l(s:( z(b (DG(Z(T[(f(w(w(y(Ry([()Bx)04)W)S)p!)H)H)!)Bx))r) S;4S;S;S;S;""S;2S;3S;:S; NS; RS;YS;JwS;wy<yODOXJOH"='%A> %Dp%:Bx%P%>d%>8%>r%K<}%Kօ%L %Ls%Ly%.'l@q#@r#r%.Xu#vu#wu#xu#yu#zu#{u#|u#}u#u#u#u#u#u#u#u# v#Hv#w#Ry%.'Ǝ''00,' 1g6&6&<%6&""#6&f%.6&w~#'v'3'l*T Oسz6&OسDc&yHc&y:Hvu@u@5 @zu@xu@wu@{u@c&X:HS;3H)sE@zc&rHS;Hyu@c&:H(b HXu@`@d@u@u@z>P@c&:HHv@)@}s@|H@([H v@H48T@>r@KXH$98@ձ@c&Hh'@$9.@zS;Hc&d'HHc&=Hc&b'HsH(ZHc&'H@(fHc&HƎ@0@(T[Hc&(Hz(H@Kօ@tHdH(wH c&](H)W@)p@S;""H@@q@(wHS;:HP@Ly@z.H@@r@(yHRH(RyH)'@JwH@)Ps@' q@S;4H; Bx@K<}@.H0H`;@zS;YH^qHS;H+H9HS;2HzRy@}u@|u@  )!H)BxH) H )WH)rH)HH)p!H )HH )04Hz)SH)H)BxH&&fH&\gH &sH&H&<H& NH&xH&N`H&xH$&,H&NyH"z&FyH &.H&,H&4dH &H&pH&H&Hͫ( zH(s:H$;ONHDOXH>OHzJOH"HXt H JKH>HNt H H8H>8HDXH9@H9?H HKH;MH 5De~<~<HJ fv2 w EuB AeueOu%UU"wMe 5 HZ n Lz4>   f v"2 &%& v 5 :ue  5  Aej~UU *BeXPCeLvt eVe 0 BCe~U    r E 6Be$R~ D~ & v@A- 5 B5-B@mBAmBu #    U   E~ NV ltl 50  P  w %@mB     $E~  w@0  ` Ce2`54 `  E@t0  t0 5 6U& t0 5NB& dE% W @&  &D5@  $D  K se~ ~ e 4w D4vƎ %56 9 (   n~fe &4~ R5 U5@  eP ~  \E  ҁ B~e• D`~ E5@  w KmB3eC-4  w$ƎB6 % RR D~ D~ 80 C2 4QA8B 5@ T ` ` VD45@ +  b  &f  m ~ 8C~meI~ ~ 5!6̇U DE5`u-   t  < 4 z5@ & B2  L nꆇe B`  . 2@   @ B` 톇   ҋ  Ǝ%UU Du A  ˥*  :0e L=  0  1 hL= Dx <  l  N1@ "B8  5pjC2 4 C@ xL=wd t l5C@  1e1 1 ~ 0 RR$ T   j W *dfRhjRl$ nT p r t vj <W C@& L=@0e  : @2"e 5@   \ F &  L=eH~ l     "4 & C` L  w `ҔD~ >    & r b <w C`~ &n D~    eC~L=l 5w  e~@~ V, w  2 L=6 T w ^ C~ D-6L=66  h  8 *wB@ʢ |   1w l w f #N :B` 0<T$ e~ v C6"    e a~ 0 e  z  D4r  R D-65@  5   E  C`  w ” B  ~` az 5@0!0:Aw B5  DV , 5B~mB`@ B~  ~575 ѥ ~eB#@ P~ r e Ǝ$Ǝ  "@ ~ 5@  f @ 5  < .  E BVfP   %,!t-<%%  <00,7 1g%#t-<. C@%C@ &C@ ,"6^  wNe B ѥ. ~APBV1 2 UE U@E122A& `1eƎ2' Q$ A5 W W  W H5W  h L&5-5 r'm!W& '@q.4:HFLRB< q~ ,& FB<C Q~f: v Rt-<0Am< 5 ~ 5t-<5 5@  %6U 05  05  P @ w 5@  2:Xu^ub5@ $L=%5@ & l b6 6w ""5@  L5@Xu\x L=6 6@5@   t 5@    52uRur v@  ~    Xt-< . w B> <t-< e ` &Hv@r*@q>Xvu\p w B> <e `   >`  <  <  <  <E PBm< 5bwufƎ#5A< C~ f:  % R A<C~ H5 , 45 f:  :U~h`!~B-< UUw 5 Ue B` B`  8Ef:fBAe*BxuƎ"Ǝ<ҥ ~ N5 U v% BEAe ,  Xw f:Ae$  :fyuj`6 f " \5 0 UC2 * .Ew   5E5 <e  U5<e` b> B<w *u :u ; w f: 5  E   D~U  b 5 :AC9.brx~XN*Xnn Am< U EF5   4  eыAm> e$ *nn<Ǝ@F  AZa%z 09  -+ +- . zu8{uX|u\ƎP Ѡ~ z l   ~5 5  .(C2& }u.u2ƎluruvL=  5 f   F5 : uew %UU  nU frH@  2% 5 :&# e de X: `w  d1 0 C  2#`   e0 e0 ;= u- @e5 5 f@  B XRy@      Bɋ W]W: mKɋ F&&pe  D rJPNPR0b)sEh)sEp)2Hx)2H|ձ8 $%%b'  1  z 1 BrA1tnw *AHC2`;`P4P8`XK<}jr>PCHeEfD & pe ͇ ʇ%FuJ `Dw E) B "6 )sE$)sE,)2H4)2H8ձ>`;^t>80,e$FFJ% ~4 C-C`AleC ",e%uDH U0>P>:BxD:BxBE`JF R5H&   5   @,e 8(5 ,8T:>dB)PL)pf jDpn:s ~r zL ~L v|  << & & & & & f& Ε &f  8L L }V}$r @DpDwxb5 f8TT Oγz6&fOγDs@:G@='@$9Y@ ~@@$9΅@Dp@  rhRyh  w ѰB   f& & & & && f& Ε `  ,& & & & f& f& Ε.<='@DpD:G ~ x='|DpH| f& &  ׭W1 ":G ~ $s&$9΅,$9YT Oγz6&<OγD5!@='H<&%t@A> HDpH NTPHLsH >dH >rHz SHL H:BxH>8HKօH gHLyHK<}H  WT WT WT2 WT WT" WT"& WT&WT$  WT226 6DD <&%t^^ tJJ" "ZZ&& b'SYT OγJ'vOγD  LhƎhh, Pf& f& &f&f T Oγz3OγD&ZH&f@&\g@&s@&@&<@& N@&x@&N`@&,@&Fy@&Ny@z&.@&,@&4d@3@&@&p@&@&@   (_hn'~h.h(}h(4}hzU(4}h&o'dhc'kMh(~he'WhU(0h8'a h(XahJ(` h&%h&a h`&}h*&.}h<&4}hN&sh"&0Mhr(^h\(}h   7 7 7 7 7 7 7 P3 &3*3-&,<3?&N3Q&,`3c&<r3u&.7 7 7 7 7 7 7 V3 &3&s,3/&N`>3A&<P3S&fb3e&t3w&\g7 7 7 7 7 7 7 V 3 &4d3& N.31&p@3C&sR3U&xd3g&Fyv3y&Nyz7  3Q&,`3c&00-G 1g<0R    .8 S) g); Bx)0)P)8T)++^q+ +dkW.^qt9?9@;M>8>DXH8HKJKNt Xt .0) %RZJwx{(KXYqsOy*}d|&s,X&,&&&&<&,&.& N&Z,X&N`&4d&f&\g&p&s&x&x&Fy&Ny&c& c&c&=c&c&%c&&c&b'c&d'c&'c&](c&(c&8c&>9c&X:c&y:c&:c&:c&vLc&Yc&{Zc&yc&r&%,X&},X&.},X&4},X&a ,X&0M,Xc'kM,Xe'W,Xo'd,X'a ,X'~,X(},X(},X(4},X(~,XU(4},XU(0,X(Xa,X(^,X(_,X(` ,X(s:( z(b (DG(Z(T[(f(w(w(y(Ry([()Bx)04)W)S)p!)H)H)!)Bx))r) S;4S;S;S;S;""S;2S;3S;:S; NS; RS;YS;JwS;wy<yODOXJOH"=')A> )Dp):Bx))>P)>d)>8)>r)J)K<})Kօ)L )Ls)Ly).,X@q'@r'r(Xu&0vu&0wu&0xu&0yu&0zu&0{u&0|u&0}u&0u&0u&0u&0u&0u&0u&0u&0 v&0Hv&0w'Ry(+Ǝ++00-OTADATADATADATADATADATADATADATADATA6&6&<)6&""&06&f(6&w~''v+3,X01R Oγ*6&OγL b@c&yH*c&y:Hvu@u@5 @zu@*xu@wu@{u@c&X:HS;3H*c&rHS;Hyu@c&:HIq@*(b HXu@b&@u@u@*u@u@>d@u@u@*>P@c&:HHv@|H@([H* v@Hd8T@>r@KXH*+^qHS; NH c&vLHS; RH(H*aG@*}Hc& H:Bx@H *WH dHkHa@`@ b@`@*YqHc&%Hc&YHS;JwHc&&H*8T@+ H{HS;wHZH*c&{ZH8@c&HS;H*c&d'HHc&=Hc&b'HsH*>@J@(ZHc&'H@*(fHc&HƎ@0@(T[H*c&(H(H@Kօ@+"Z@*tHb(x@dH(wH c&](H*S;""H@@q@(wHS;:HaW@*+"iK@E`@Ly@P@+"K@*.H@@@r@(yHRH*(RyH&@JwH@b@S;4H* bz@; Bx@axZ@K<}@.H*0HS;YH+"@^qH+"z@*S;H+H9HS;2HRy@ bp @+"'@*}u@|u@( )!H*)BxH) H )WH)rH)HH*)p!H )HH )04H)SH*)H)BxH&fH&\gH *&sH&H&<H& NH&xH*&N`H&xH$&,H&NyH"&FyH *&.H&,H&00-W 1g4dH &H&pH*&H&Hͫ( zH(s:H*$;ONHDOXH>OHJOH"H*Xt H JKH>HNt H *H8H>8HDXH9@H9?H *HKH;MH 5De~<~<HJ5 %& (*: R5 :ue *`( 5  Aej~*UU BeXPCeL* eVe 0 B*Ce~U  0 j *j  E  Be$*R~ *D~ "& @*DA- 5 B5JB@m*jBAmBu @  0  U h* E~  BJ5*56 0P F5 60&F*@  f50 b  @(@q*0 9 f e 0` 2 *(w $%@mB   0*N ( "E~  w@0 *t ` Ce2`54 *`  E@t0  t0 5* 6U& t0 *5NB& E% W @&*   &D5@  $*2D  K se~ ~*X e 4w D4 Ǝ*~ %56 9 (   ~*fe &4~ 5 U5@*  eP ~ * E  ҁ B~(Ǝ*e• D`~ E5@  *<w KmB3eC-4*b  wB6 %* RR D~ *D~ 80 C2 *4QA8B 5@  `* ` VD45@ +  b *   &f  m ~ 8C~*FmeI~ ~ 5!6*l̇U DE5`u- *  t   4* z5@ & B2 *  nꆇe B` .Ǝ* . 2@   @** B` 톇   *Pҋ  %UU Bu *vA ˥*  :0e* L=  0  1* hL= x <*  l  <1*@ "B8  5^*4XC2 4 C@ xL=*Zwd 2 l5C@ * 1e1 1*  0  : 0  * :  0 " $ & ( *W W C@& $*L=@0e v* (@2"e*>  $5@  4 *d &  L=e* H~ l   *   4&@`*   L  4 L* lw `ҔD~ & *"    .&@` 00-_TADATADATADATADATADATADATADATADATA*H O ^ r t w   O$*n C`~ D~   *  eC~L=* l f5@ &- @"-* T ;  F r 5 : @ * w J 2 L=6 *,  w  C~ D-*R 6L=66  h*x  wB@ʢ*    1w "* l ^ w b f * #N :B` e~ * 2 C6"  *6  e a~ 0 e*\  $  D4 * R D-65@  * 5   E  C` \*  w ” B  ~* az 5@0* !0:Aw B5 *@ 4DV , 5*f B~mB`B~  Ǝ* ~5>5   Ǝ* ѥ ~eB'@ J~!* X  e *  @ j ~ ~ 5@ *$ 14575+5Ǝ*Jõ@ ( - R ,0  ; -,*pBC  m õ<  $<*f @   5  R *.  E BVfP* " %!t-<% (*%.  <%2#t-< .2*.. C@%C@*T &C@  wN*ze B ѥ. ~APBV1 Ǝ*2 UE U@E122*A& `1e2*S Q$ A5 W pS @q(p*W  W 5W d  d&*8h &5-5 r'm!*^WB< q~  ,& FB*<C Q~f:  t-<*0Am< ^5  5*t-<5 5@ * %6U X5 "Xu* 05  P @4w  u$*B5@  25@ $*hL=%5@ & l *6 6w $u(* J"5@  5@ *L=6 6*h5@   Hu(u*&5@   ( " v*L5@     Hv"@r*r   t-<  @q*V w B> <t-< vu*e ` J w B> < *e ` $  >` * " <  <  < @&wu*0 <E Bm< 5#5A<Ǝ*V C~ f: ( % R *|A<C~  H5 , *45 f: h  rU(xu*`!~B-< Ǝ$Ǝ*B UUw 5 U*e B` B`  JEf:*:fBAe*Bҥ ~ N5*` DU r%  *BEAe ,  w &yu*f:Ae$  j > T *5 0UC2 dE*C@ ,w   5E*5 <e  U5<e*D`  B<w! Lu  !*j:u ; w f: 5  0E*  &f@ D~ U * r 5 :AVC9 V$*NX Am<  *U E5   Ǝ*( 4  eыAm> e*N$00-g 1g   AZzu*ta%z 09{u*  -|uƎ*+ +- . Ѡ~* z l }uu"Ǝ*   ~5 5  *2.(C2L=uu*X  5 f *~   F5 :* uew %UU &* zU@  z %p$p*d 5 :&- *; j d-*  H X: `w (*< d1 0 C   *b e0 e0 ;=* u- @e5 5 *f@  BRy*     ?+"iK* Br55 f:Bx>r(P* 1A% & C *$%%b' P 0*F  1 8 ^ 1 P&P*l Br A1$K<}*w AHCCH>P*eEA& fD  ؇%F*uJ `Dw E) *ȇB ",e$F>8**FJ% ~4 C->P(:Bx*PC`AleC ",e:Bx*v%uDH UBE`J*F Q5H& 5  8T*  5 >d*  @,e   EPLyLy8T*ZF 0 JEJ@JeJF * @J J F F5 H *  e  &  Ǝ Ǝ*   b $B* f&: EBa & :*& ̋•v ` !A[*>$%././0: fE V4 U Kօ$Kօ*d& DU E Kօ&+"z(+"(Ӌ 0 0 &+"'+"Z+"iK +"K>$aW*H11 ff eA axZ ba@`E`( b*$ $$$$$*3 f e  >b&J b@`&&* 22 0   bb(x> b&$a@`*Ff e& b&*l&pf&( Jb(x bp aGaG bz" e< Iq bK<}R Oγ*6&""OγL(گt*vuhwuhuhxuh zuh*}uhW{uh0yuh |uhAXuh*uhuhouhuhuh*uhHvh vh 0 گt*NO HELP AVAILABLEALPHABETIC*& REQUIREDNUMERIC REQUIREDALPHANUMERI*LC REQUIREDSIGNED NUMERIC REQUIREDNON*r-DISPLAYABLE CHARACTERFULL FIELD REQUIREDINPUT REQUIREDR Oγ*6&w~OγL:G@5 @*wx@Ls@='@8T@ ~r@*r@ ~@L @}V}@:s@*A> @Dp@((@qh:@rhwh *&  & & & & & f& Εr&='*&   & & "Dp:G ~ L $r*L&& && f& Ε (LsL A> Dp":s ~r *r <  << L  L L $L (}V}* & & & & & f& Εr A> $Dp(wx* &f  5 $8T R Oγ*6&fOγLs@:G@*='@$9Y00-o.uTADATADATADATADATADATADATADATADATA@ ~@@$9΅@*Dp@((rhRyh  *w ѰB   f& *&& & & && f& Ε `='Dp:G ~ *L  ,& & & & f& f& *rΕ f& &  =' Dp:G ~ * ׭W1 s $9΅$9YR Oγ*6&<OγL5!@='H*)x@G]\@i{@A> H($@*DpHDb@(NT>PH*LsH >dH >rH SHL H*:BxH>8H>HJHKօH* gHLyHK<}H>"8 8TT ~%~P . . SY:.FLB  WT ($ Db G]\  i{WT R Oγ*'vOγL((L"hƎhh, *f& f& *&&f&f R Oγ*3OγL&ZH&f@*&\g@&s@&@&<@& N@*&x@&N`@&,@&Fy@&Ny@*&.@&,@&4d@3@&@*&p@&@&@( (*(_hn'~h.h(}h(4}h*U(4}h&o'dhc'kMh(~he'Wh*U(0h8'a h(XahJ(` h&%h*&a h`&}h*&.}h<&4}hN&sh"&0Mhr(^h\(}h   *7 7 7 3 &3*,7 7 3&,3&(3*R7 7 &,3&<&3)&.*x7 7 3&$3'&s*7 7 3&N`"3%&<*7 7 3&f 3#&*7 7  3&\g3!&4d*7 7  3 & N3&p*67 7 3 &s3&x*\7 7 7 3 &Fy3&Ny37 3&$3'&s*7 7 3&N`"3%&<*7 7 3&f 3#&*<0T  @<  !  00.w 1gT .MACRO DLXDF$,L,B,LST .IIF NB .LIST;; DEFINE THE QIO FUNCTION CODES;IO.XTM='B'<31*400> ; TRANSMITIO.XRC='B'<32*400> ; RECEIVE!IO.XOP='B'<33*400> ; OPEN A LINEIO.XTR='B'<34*400> ; TERMINATE IO.XIN='B'<35*400> ; INITIALISEIO.XTL='B'<36*400> ; CONTROL%IO.XCH='B'<37*400> ; CHARACTERISTICS;; DEFINE SUBFUNCTION CODES;; IO.XTR SUBFUNCTIONS;'XF.STP='B'10 ; STOP ONLY, NO DEASSIGN6XF.STD='B'200 ; STOP & DISABLE, CLOSE LUN & DEASSIGN;; IO.XTL SUBFUNCTIONSA; XF.ON='B'0 ; TURN A LINE-ID ON#XF.OFF='B'10 ; TURN A LINE-ID OFFE#XF.REA='B'20 ; REASSIGN A LINE-IDT!XF.ASS='B'30 ; ASSIGN A LINE-IDO#XF.DEA='B'40 ; DEASSIGN A LINE-IDX;'; IO.XCH SUBFUNCTIONS;O,XF.SMC='B'0 ; SET MULTIPLE CHARACTERISTICS-XF.GMC='B'10 ; GET MULTIPLE CHARACTERISTICSE;T ; DEFINE COMPOUND FUNCTION CODES;&IO.XSP='B'IO.XTL!XF.OFF ; STOP A LINE&IO.XST='B'IO.XTL!XF.ON ; START A LINE"IO.XHG='B'IO.XTR ; HANG UP A LINE-IO.XCL='B'IO.XTR!XF.STP!XF.STD ; CLOSE A LINEF7IO.XSC='B'IO.XCH!XF.SMC ; SET MULTIPLE CHARACTERISTICSI7IO.XGC='B'IO.XCH!XF.GMC ; GET MULTIPLE CHARACTERISTICS';0'; DEFINE MAXIMUM DLC PROTOCOL OVERHEADSD;S2PRO$OV=0 ; NO LONGER NEEDED - DEFINED TO ZERO TO7CRC$OV=0 ; RESOLVE ANY REFERENCES TO THESE SYMBOLS;;T; DEFINE DEVICE TYPE CODES6; (RETURNED IN HIGH BYTE OF I/O STATUS WORD 1 ON OPEN);X,XV.OTH='B' 000000 ; 'OTHERS' - NON-ETHERNET&XV.BRO='B' 000001 ; BROADCAST CHANNEL .IIF NB .NLISTO .ENDM DLXDF$ST .MACRO DLXBUF,LABEL,SIZE; .MCALL DLXDF$ DLXDF$T .BLKB PRO$OV' .IF NB cGd .SETN EXTK EXTK+(DALTBL*12.) ! Add space for direct access label tbloeHf .SETN EXTK EXTK+((MXEXQT+1)*4) ! Add space for XQT exit status blocksgGh .SETN EXTK EXTK+((MXSUBR+1)*10) ! Add space for GOSUB nesting framesiGj .SETN EXTK EXTK+((MXMAXD+1)*60) ! Add space for nested command filesikFk .SETN EXTK EXTK+((MXMAXD-1)*32) ! Add space for file context blockskIl .SETN EXTK EXTK+((MXSTRG+2)+(2*(MXSTRG+4))+(MXSTRG+0)) ! Add space ford#m.; ! ...scratch bufsbn.o .SETN EXTK EXTK+EXTBUF ! Add space for FMSpDq .SETN EXTK EXTK+((3*6)+MXSTRG) ! Add space for other startup reqsrDs .SETN EXTK (EXTK+77)&177700 ! Round up to 32. word block boundaryt(u .SETN EXTK EXTK/2 ! Convert to wordsvw.; Compute number of LUNs.xy .SETN LUNCTR 6.+DATFIL z{.; Create ICMBLD.CMD.K| } .OPEN '$CL'ICM'$TYP1'BLD.CMD ~ .DATA ;s6 .DATA ; TKB .CMD file for ICP variant "ICM'$TYP1'" .DATA ; '$COM').IFF $FCSTK .DATA ; linking to '$RSLIB'4 .DATA ; created by '$BLDID' at '' '

le, ~ n n-n n-n n%l   ~%wt    ho -hl[  %-Pl Y Ne e -.l N 8 ;  $H wmmn w  -kmm-  %fW @fv1 wje  wفW @ 5 N1 4wj%% wLق ncepe :e?eeee 5xe je2 Ne7 ^e pcNehebLe7`He(ewb0`` b b e 1 wd7`d 5  5rb55ew<Bm @m  wd@P dZdVdRdRd b f Vd0d app6dH  "dadmddc acwc/ar5Lc Jc>c -@c4c \da@`B` " " c 1vc eacB f& a`cm^cZceW"      l r)bb b-b b-b zbb & b7bb   ~ b:- bhbb b w:ք  N >`eB % zw R   l&  -b_a r)r)7a a a a5a aa -aa& %_``   0a``   a7aw`aeBl " f 4a?D_@_|a a`   V O_lamjafada&^VamPa Ja`?@a00CB:TADATADATADATADATADATA6ae x`^a a a aa/^  ^^`^`m``e  f  l~e w H^@` t` n`& & %-V` 5P` B`2 &e0`(`2 f:`7 `ew]0 "`3& `?]]_ ]_b C``C C" " 7_m__ J]-_& _/0] "]~_m|_x_w]0 h_3" Z_bHe7N_`J_``   3"  r\4_ 0& \\^ \^m^^ f6 6  16d\"wt aa > wP 7N a `Ҷ -$e 3 ,% ' e~aa la3[e e [e~& T[e 4 = ;X]R]- # w(]] ]-] ]-] ] p8[e] heGv a a e N 7 Z%e5~ZZ" aa e N H 7 DZ4\Z0 0" ewZV, f  hVdV@wD ߚ\  \e B|\@m!=/Z:/Z6YBmem>\@1 &*\m&e fe\\e Hш[e:[ a p[:[4[ [ [-[ [-[ [ lZw,[ a[ ^e ewϦ)l[`@[:[X  K([$[f Zn BKZZ2 a a f eLZ Zp o^X` aa 2Z0enZ "X- N jZHZ e % efW p0 &N` pef1 w,S N`f %w\́   @  w4͂  f F  eN d %f a  $eS6, >` RR w̦)6  r) w `V451 D& *6mXXmnX m5BX  NXe- ހ` %5X -UU D& 6mWmW  We%WW  @  >%& 3%w a=˕ `& ڢ ˖%׬-  `N`c& 1c9 ac@eA&  fc c e e e   e35vR T~& 5RR~& 7 T2Rf5(R)7 "RvWpW5bT NV & ޖ% FT 2V & ޖ%w6W7 (Tf  d @w" -(T TU r) ^V6 6 n6 LVFVme8Ve ר ע   Q Iɕ @mV & N& a6!4C ע  r)' r)r)   Br)  r)  N& a e% v! ~W r) \r)fr)  r) %  -wW r) r)fr) p R %e wZ"4[3& Ν[& & & &  D& ewXEmN  E W W  E  ! aaKW/ E W W W/aaD Z"(a,a0a4a 6,6 &5,w^ (w wv6 "*e1* aa aa"  .a2a,2a Ne o a lǁ4W  N2a `af f(a& e f, e 5,@aaHNatLa@`& Ɩ%Z":a>aBaFa 6>e( 00e Z":a>aBaFa H6>ew5"  wj (w~5"?  @t@a`@ 6a`& v (" ؎.e0 Z"2a6a:a>a 66e $5$/5, -0  .6 $.0 @ \Z"2a6a:a>a .66e 5"[6 (e1.a2a2a e B  .!  00CBSBgr  ׎.0 ف2  ց W  "Z"2a6a:a>a v66e   p ( "w& 6 ( P~ 2 DZ"&   2B  &- Q<- ree)5*/  E -e Z"a a >e  %wà   , 5A C,~  fN,-& Le w N a j X   a,-& e &- -a DaN& e ~" O O N    aa  `a 2~a  faa a a fe`a Xe%eW a&-  &-T | T&- –%,-&-a deeN,- M  - M &- ZN&- ewD0a ~42- n aN& e e w 6a 0:a  5w4 aN& e M a 8  L L L - -  "aL L 8$aN& 6e 5  "J,a %aa <-XL4%D"a$a $aT f  T(a %%ew &aI 6 < x  e ewb5dI.VK+  &Hr)B 5ZI-K45J J5JH& Pe w0-H  6 J -HHJfH`H & N& 0% C r)@HeD!Da !P-VJH   |-HG I f5 J P (7 2J%JmJ x xP '3&  a` & FF a ·m Ie6  @`a`&  H v Gm  qGm-I=& ΝIR& e / -& ΝI LIVI HV 0  H7H a`7H7 hI7 H%5w&FF&` aF   `H7 rHG`lF`He  ewa % wZ& e l(El(E5 FH & Ж%7 GG7 "Hse E`6 E zW?o5k W?g W*   @ ' "  CA!f6% G&   0߷`\JTJ a e  &a  e f  fG\G l(Dl(Ce L8G& e & N ` %C.7 C5& ΟC R f`  e fd e f e`C`C ew-FCBCw| D#ׯ(C  CׯC) FD7 \D 6  a ! 6 w(ׯB(     W!w%wa E- D  hED-  ^BbE LB ~ 6a 6 . 6-B B B " ' ) A a 6   ^f %~     vp w(C 5 vpv ) @  ^ 5"I b W!e8%:BAv   lhw *A 7 $D N A  5"  & W!e @e5C%%wx e Ar і%C & & ef NC - 7 pFC-A A  TF  ږ% & zC% f z wfC ˁwj   lt tw  ` j ptte _& e PR   B  @԰tt @Ԁ 5 /   " ptt     ptt  .JOU;>&QUIT/SAVE!.TMP.TMP* $J .  ,          *::::JJJJ Zjjjjj zzzz  )9999IIII Yiiiii yyyy LF VT CRESCDELINDNELSSAESAHTSHTJVTSPLD00CB:TADATADATADATADATADATAPLURISS2SS3DCSPU1PU2STSCCHMWSPAEPACSISTOSCPMAPC!!C/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^O~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"Gŧ`y` d'@Bʚ; TvHrN @zZtH^Zb K:[?8h[?8l,,2"*Additional information available: D-C.RESETADVBACK*  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~AAAAAACEEEEIIIINOOOOOOUUUUYAAAAAACEEEEIIIINOOOOOOUUUUY  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~AAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuy6V'&1 Kl=@ Kl=@ Kl=L Kl=nc Kl=>k zK~=@ rK~=@ jK=@ bK=C ZK=C RK=D JK=lH BK=H :K=dI 2K=I *K=^K "K=V K=V K=&W K=W K=W J=X J=TY J=VY J=(Z J= [ J=d J=g J=pv J=@ J=G J=rK J=@ J=L J=@ J=@ J=r@ zJ= rJ= jJ= bJ=H ZJ=ڀ RJ=* JJ=N BJ=P :J=h 2J=؂ *J= "J= J= J= J=25ew z, Bv     5Bwn 50  (r- DUt-E D  E E ܁&wxE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&f  5 ߥ& *  + 23E Ew    Е-   0@A DW e`fÊ    E &  m  f A N  %&ff f헯 Ҕ7 EtE@ @<` 2u w7~7 x7 rtE  lt lz Vs} B} t } N y   R/ a D *j g R c ` ]Հ W :-T &&  JA #> R/ >a 7 &e& &  . ՀZ   *-   \ <& |  (55@5:7 w^ W X7 X @  lRt $ R/ j` p{N` Rw ڊ7 J/ ^ d cX s7 w5  b^/ `% wj NHHB :e, a ]B`   r7 rwz5j  ^/ _%wh    -r) 7 es ڄf ^/ R_ >r~N`a ] a& r^e w P 7  ^/T ^  q_f 0 #  V  Of  n   :7 T7f 7F / ^/ p^Nf& W  l|td 8q7  ^/ 0^ 6eMe PBf b v eJ/ ]e4 , .a ] 5 l J/ B\% a ]  e }e BdB,  ԏ`ȋȕ   R/ L]N Nf Jd peHff % BV  TR/ \e \`ȋȕ  &V o 7 w5p  ^/ \e e wZ00CBSBg >WD @  lt ĎA5 @l& f-4a-4\ Y5$5 X7 -4H5 5 67  J/ ΁% 2 (-4)W D je `B&f le    D wYa YNa& Ze t n  aaf p  e0 j % & Fn`& &Ze s j ew Y  % GE 5= 0h5 :2e $ fav1v &e r p`  B 5 ` ` w0X   %@ lt % T %B %  wW f |% w&ft& Xe ft& Xe 2ft& Xe 5&& & rfe j0"7 N k -R$7  4  g 6 5< 5 k 6 "ea XSaH z  ge / Wp aa jm% e a RaH @z  :gewd Wq vaa im% e D6  62.2a,a a5wN"a (R6 7  w^-.45pwR a V5aSݎ  a QTCe` a y "a$a P%W!< aH x N7 H @Wq w8 a a ,hm" % % wmW 6 0146 (*($,e,,a6a _5D  ( * , 6`ew5<a& X_5@a i  dew5$ae& Qe ڰ-  dU@5 B<a& ^ 65-pۺ  & j -NF 2d<5. * `(at hb% @a h eN6a h e e05F 6 t sa 7eewN`ɋɕ &&  R/ ^P d{ef@ ȋȕ f h / |R/ Pl ^   | -4  ^/@ O zN %efW  b  W f  wM 6 & 6 6  > Vb ` vaa \5 R/ Op b e 6  Iaa :\5e6 t\ & & \5H"a tf eK-r)؎# |ve V & & [ Ha f e5LJa e  a*e ew4L ^;`f uԺԖ%w5 - 2 _-& ݨe3a "L Ν3a L a Ke&- >s% -h\  lt  33N`& N `5 r)Ll( t %55 l(l(! : ce r R/ L  ew00CB:TADATADATADATADATADATAJJ 2a jL$ fR/ RL & ._ Y5e <֎ La Jf`Էa\ %a tJ uwD @af K v "R/ K  eG a $Nba &Jt  YN 6-&42 / &   b d f50 N   vV ^ew5 Pv5 NV v\a $Bӷa> u5 ,$e`Za PI ^ \ ]N^a *INna Ie N&a H5 W&a`a 6p %5" z-4  lV ]e&g Nu & ( * >5 }jat ` tt ].a`& He t \.at e Z.aja& He  e,eJwfG aa N|% 2 fe IZ8T tf pa a $|, s5 oe  %5 n\64 y($ s nfЀ77 rs w fswF R/  Z z@`ȋȕ  ^R/ FN @ ewn(<6 6 $6a a S wZ  % "T !-04( C t <- Y X &] և50 y ^/| F &q S a& TSe a ] .a& Se a ] ؤw R/f E pea J]7eef5~ a C~a Ce @`ȋȕ  lR/ EN T eq o ώ 7 W$S7 P-az }7 t--5  u Z VU̖%y--5x  u Z U̖%7 ^W,wVRB Xw,P w -<-8z.w*4@   T '& ~ !w ~W,Xw-7 -7 cv @ *` ΐ a ta t  :& DAwV ,TwX)7 R&W,ww7 x(7 "  7 7 wECW!w   lu s 3&3F3 f3333    uf` >eeJf&f` >%}v E  6B  W W d R   6! ^@ *`B af saf r w` 9&f ?ɖ%wr n*wh d$ff %7 Bd *R fG4& Ν e ew<=6 6 >5hv aa L5 5>a vV {& & K5 a LVepe5j*| x& & K5 a Ve N7 , B** nq e 7 &7 6v aa @K $a* q $Ŏ$f =%V Pee ew; @   lw ow(  = Me%& $ P Meu& "* Lu rP hN e "  lw To uu :P%w*u  lw ouuu uu 00CBSBgO%5uu O u O ud  lx nuv v v bO%5vv BO5&v 0v $O5 N Lew"A @* &f{5R 5>& DH 3v&a u% #@ 7 De C 0 K%m&7  2L J C |& * w  M: pJYV v M%vb v M%vS bv M%vy v M%v-v rM n  ww[ TL @K w  w .M%w 6w=w M L$w L K J w 0w L%2w 8w L%:wz5B>w qHww@   lx k 3&3F3 f3333 B7 , C " I%m7  J H C A A* B7  C w \I%m7  I BH C 5fPw1\w .5PfwwlwwF704 % mpw vK  -|ww VK LI%S 7 " C  H%m7  I ~G C  I.w Jf J Hw J =w fb& J He wx5  z /y  `W"#fa q%  `exf`&  5e ee w5 p R/ 6 er  7   15-5*5'-4 5 C5& 5  r^/ 6 % P i d H hN a p4"  a{ N Ge ^/ 5 `e e&&&& Zew3$e 7 T6  6 v`v V-6R -,D@mb6 >5p:552fv1:& {e %f l% c&ȼ lC1>   mÖ%5& N 5"-r vGp W!r)\ rbp 5 6K%ef  7 z 4_-ܾ4 j5f& N <_% d F ֻ r) ƻw"2)@`ȋȕ r R/ 3N w 6  w-44s,e6  va v!W  W  & Da Awpa DBaW 7  r   C  r  fer) 2`- e& FAr) ` e  ]e w05½w HIPaa ve% Pf 42r)B` Ҕ Ca  @  a w Ha a eePa a d% V D w 5v5!fa I% ɕQ& N 0T - 7*#T PS5v B3& Νbf aP "3  N S2e  C$f aWYWN WAWQ  C Pa a c% e--P{{ H B7 7 %Fwj. * d C V ,f `fa /  h3a /Z"a3& Ν4& & & & : D& xGeZ"& $ B Bea4 z/e e w-)f f< 4f f5 ,eaa Db  Vrp7f` .e%w-)  ; ,@, 6ea6a a%%"P@,`6tfZz0 J*JP``,T"",,TNoMAINPASTE line deleted lineMAIN line moved copied time line resequenced=> r (`Tz  ,4<4< ,4:HNV &, linesNoneUpperLowergeneralexactwpscase insensitivediacriticical insensitive begin end unboundedUnknow00DB:TADATADATADATADATADATAnVT52VT100Hardcopy, scroll, noscroll, eightbit, noeightbit, edit, noeditV3.10-00 COPYRIGHT DIGITAL EQUIPMENT CORPORATION 1980 & 1984 COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1980 & 1984nonumbersnoverifynotruncatenokeypadnowrapChangeLinenoquietnotabtab size ; tab level norepeatnofnfnosummarysummarynodelimiter delimiter nowps wps Help file name: autorepeatnoautorepeatInput File: Output File: **Readonly**t6"8Rp,F ":h $.$ &,GOLDW.BL.EL.L.C.UNDC.UNDW.UNDL.EX.BR.ER.CUTSR.PASTE.CUTSR=DELETE PASTE. APPENDSR.?'Search for: '."".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.SHL.FILLSR.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 ` f,~589:XFHfIKN, substitution[?3l[?3h P= H=H @= 8=f7 \  f7 & 4 4ׯ0; (ׯ"!= ~  D  ql( Zu Ps%^l( q ^ q *s0  s! w_ @ `  ҃ -& N$fe%& `e W# P% p$ ~ 0A  wt_ peMjğfuEŸZE R  H D  lP <- % ۇ^ &(P S 7(P F    ( 5.   & Ο  E 7(PeMCe B f "%    w*^df`b-F ->  "@ <.7 &W 04W 91N- 4^f- p] 0 6 6  a- \ ee7W %W AW Z W W W &W #7 W %z Vfp FVWW _kW "W '`5P_5 '7 ( * &-  ?- r7> R7 P ҁ   8`& >^ &e 7 d ` W ! Tr7p lef VFW  *p 6 -! E7 7f 6f h]p e f -te.& f [ e@ w>[  ;w lP Z 87 (B.f r7(% ~W W _[ H7% i-x-ew0k&e V%lZ N g 8% ^7= bxhwr^ph MI: % ,$p1 -  w uw vw  wu-B ,% ~- Yׯ.1x'606 6 Wpe`Na a X a- PXe   w& p7% 07%!@1 w-5j g5 7 & % Mp-xlAp `1  7    7 d,!1 ҄ 7  1q7 r oo5 ڋ7 wH  5$-:: 2.  W W W /W "W 'CC wdz߁p w2bVP $-4!-,;>00 DBSBgB r5nwH & H% 1 vt<pP| -fe V -& e Ve]WQ-@ = ~:rpA-h0 b- ^*RP1&->   -b)h%!., t *7  ewS  lU 8- 40-  T6Q`5pɵ rCE CtE &P&N`& *Te  #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 )` ,`&*)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 #" (%+% <"+`h1;90c*A4CbHu rNLQ#U27;%JS'4@^l6&pvDtn\~J&FpdXFxjZR>NV^<  p^.DVvf>(b.aCHANGEBCOPYcDEFINEaDELETEBEXITAFIND;FORAHELPsINCLUDEaINSERT1KEYaKEYPADNOKEYPADAMOVEQPRINTDQUITqREPLACERESEQUENCE2SETBSHOWSUBSTITUTEATYPERWRITEaVERIFY#*TOLTHRU-,ANEXT;AND+=.jBUFFER9ENDYBEGINILAST9ALL:IRESTkBEFOREYWHOLE/QQUERYQBRIEFSEQUENCEDUPLICATEcNOTYPEBSAVEBSTAYrNUMBERSNONUMBERSBCASEREXACTbSEARCHqGENERALrBOUNDEDUNBOUNDEDTERMINALQUPPERQLOWERANONEDVT52UVT100DHCPYaCURSORAGOLDsCONTROL"ASNOVERIFYTRUNCATENOTRUNCATErVERSIONAWRAPAWORDcNOWRAPbSCREENQLINESAMODEQMACRObENTITYCPAGESENTENCEPARAGRAPHRCLEARORIGINALQQUIETsNOQUIETaSELECT2TABSNOTABCFILLaADJUSTcDELETEcREPEATNOREPEAT3FNFUNOFNF3WPSrSUMMARYNOSUMMARYaPROMPTDLINEfKEYPADNOKEYPADHCCHANGEfINSERTwINSERTNUQUERYCTEXT3ENDBPAGEBWORDDELIMITERNODELIMITERPARAGRAPH2WPSTNOWPSAUTOREPEATNOAUTOREPEATwCOMMANDRFILESDIACRITICALINSENSITIVE"CI"DIFUNCTIONfSCROLLNOSCROLLEIGHTBITNOEIGHTBITDEDITfNOEDIT+)(?FV@<W61vd}:JAcS^ -+5. $wsh|UPG`[|v83Ml` -"Z!`Mlfq0E= =w` t ֔  37 JT p ׯ8! ܥ 5& 7  5 ^  t w-@-:& w!5567 T ă p7 -w: lrv$  -*4& t%r)Pr) t[ q Ο: q] q*7 (  f t s71(l(p) py N ׭^ ׭Z׭z7el(7`2g3& Νl(p) b7el(5 ^ ^Z V h  Nl( B C e d552  l > 5  ƁW!F & yN @4%  lxv$  5X Ğ  by%5 \ l(l) @m  ! &m - l(Z -  l %*^5 wR 8ؤZh r) l(! 7 ! 5L \00DB:TADATADATADATADATADATA, Pb7H ~v vz% -84r)j %7 -Vr)  HD > J 47 &7 7`r) ^eer) T7 er)7 nw\ a % $ 5  B  B ef ne  w[) a " r j l(@5tv v0& 5 ~W 5~ N& % G%WN  a % .W W ,W ܃5.I& N& & eN  a % %jj% j l(X5%%w %wrZ * na  h   &a Z { 6 5Z 8  9 : ;> @ wbv& e wB ^na ~ w }WW -n5 j 5 x na < h J G C-*$ f N&  ma  %C- -  Ο W  l(%;%WW W W a  W W W a  N`ew  f 587 |7 07 *prdl nwd@&X s%-  >l( 5   l)  e wW 7 f& :s-v-v q 7 %~ - Z rv xqe f& r t% B m er) &  %v $q k%-  "   lvvv p%    lvvv p% ,k-dd  Vf -V   5 -- r)+ׯ  # x  --r)   J b  \@ > N  z wU  a ~ 9 Wp B`B0 c  ? O [ ~e  ܢv#e,    f5+- ~e- v0r0 \o% \ev0v0  1 D P J&1>#&,, Ve5&3F3ȋ `&  n i%f (Y f 2yW"W"W" w h  f 5HB  o%W ^ e e@ f e h  wT)!P W  1& +W W W a --D >(W D " l)Rf  b |a  %f-R/5+--#v m N 6g; d &gr ~d7 7 w޷ޖ% -J4  D f  Я\   7  w I7  -     wH  77 -ш ~   xjr7 p-b^ XT   R NN-#x z 5^zz Nb% p| { 4b% >   & e54zz a7 ewGЄ 7& YW 0~З) 5  W  7H XW  .з`*  @ w~G >      lh} \{W AIW ^Ff|A W B>W W;<}B @`e{ C -D``7    &6  C!5 ~E`NA wF 8 =G-..C &"-  _  Z ,  x<Ў j * V w r%χ--Pl}t} _ >Z7 7 і%|} _7 Pі%wE. <:86 ke5dwT  " l} py3b, R*, +t* 5 pf w$ *@a %w7 jxfb~^7 x[\ pw e   Ae, DeVt &,6(,$ ! 8 |Je, |De  Dg y  ~,  \  Ta pwp y   r l o j ge- |  r-n f7 `R58IFE-r) wp~f z 1 njaa bv%m 7rJ "  Q ! 7r*7(z"  7` ] -- 2xؤ X r) T 7 L<- 7 .er)(5>@& D %9 Jle, B\.L e7 7  ( ,  lQ  ,  ,w  7 ̀ ewAv1v1& & ( We a A|   aea @   @     $e# 21J R< VC~e   e ew@7   {7 b`e Ph% h ~  ʠ r @m  `| *me& Ο % ߼m7˷ 6m O 0 2 lW  ,   $& ` \-X T-P J   z| w?  ,u5 p l(J Ql(:l)6v& & a&  e wh  &N  @l(e "(& & P a&  e% lN l(ewW A1W ,W N&  * ehl)fǖ%W  -Vl( N ΟH xW l(2 N $  a -l(l(l( ,5 %   5 l(l( | hY ,a N e %w=-V4 W @m     &f %     !:7 j@- bɎ & X7 jh7 f `% lW . U ׯ!  L ׯ!  T-P00$DB:TADATADATADATADATADATAa a q% V Q7  Nr O `  4QT `a L a 7 D˦ a Vaa q%`B &* v_ P7 N7 e & aa ^pa e w<-}}a =7   r  a & s-}} Ua & ewP 7 b> & X V,(7@ǀ %o   a ( a & nr%O I e I   M( rde0v rdC r e0v  r @e06!a& q% M r M f M@ Z N%w-f}} 6T Ne ew:)f H 4f f5 ,eaa n  Vp7Ŏ` j;e%w9)  `H ,@, 6ea6a Vn%%wR9(&  <& W!)H` 6_%  d w$ ׯ e7  e7 !|} Ze 7 Z} :e „:P!M!J!GA r l}r)<& 7 5 W! &*&     e h & 6&    % "a ea $86 w "G wAm Gl"~  5} 6 -4    V ` a  w   ׯ  | ׯ   j s-|4% n ,-l4. 6 M F-N4   p -24 b\ w8-4  ->: .(`r) X5whC n-r)  45g꿃 c޿r)r)Կ[J& W!  DD(& &    7 2&    57  p п ` : h  %) 2w  4~v1N   5 !"  n ew-,( XF lz~7 H  -@ 780 0F l~  |7 h6 !   v -B v1z   ^ f  +7 ( : !  !!!  l v  b |ew05 - Bw, C!!=A r  l~ g0b, J 7L,P * PP7( +  7%W!7 reaa 25 aLea 2%    V ,a"a 4.a &% a *a  l~-M x  wb,a"a % v μ2  ,a"a % q *a ZhW!)^wB ^-na 2  T   y-<*a ze, "2໲rн %& d%D R O (   V ށ E ,7 d 8 5(er) d! pw4 "  b (  g w 7     xe w ֺ !  X 4 (owֺ(er) R r)  Z] :m ;  \  \ - ܼm % r)& Οļer) 2 Οer) 1 ߠ7`ڹ Xr)ι _e w& 5   8 we  e,w/ vv  er)^ Pr) ? e v  ʹ  wX/ ҝ    v ҟ ؁ v  v  x w./     Jҁ B N`& N&  X7           D  ׁ D ew. - B-4qׯ" -r) x & Οp&  5 X  nׁ B ׯ̷ 6-ķr)2 T - J / Lׯ -r) 8  & Ο& H5    ց B   be f     , ׯ  ց -r)ׯ  f ~  z  @w -r) -ȶ)! @  00,DBSBg   ?`%r)f Zwp `N %w, r ~ @ۖ%  B  r ~ ۖ%     z # -5 xׯڵ 5ׯʵ  Z b X fr)7  -& Οf j>@`w % zw%fr)7 w ` & N 0>m7޵% ]  Rη̷ ]7tз0 NTe +H0 ew+     l~ _  Cxʐ  f 5-ִ1 6` $Na F %DW r) Rf f a V 7 R GOLDJK pqrstuvwxyQRABCDnSmlPM[>   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~AAAAAACEEEEIIIINOOOOOOUUUUYAAAAAACEEEEIIIINOOOOOOUUUUY  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~AAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuy"  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~AAAAAACEEEEIIIINOOOOOOUUUUYAAAAAACEEEEIIIINOOOOOOUUUUY=>\<[?6l)0\>DD &&&FFFFbb P2  =w`$ ^- Ѓ7 Pr)e, ` 5B5 r aa P, -8` -  N7 & 7 J6  5 r) a ~7    Z,& `e - ,, J6 v-,Z& `e  6 5 w67 wv-L-"-5 ,$a b_,,.a p^.%,$a ,_6 $a,.a ,^52 . . r)(a |M vr) f& Nf6f-5N EN N @*r) @& fr) @& @ & Be e 5 l5e-a-] f N NE&6f(C j`bf NN C<>4 N, f & ^e 5 85&  .#5! &  e &  e  5 n    lT^ l.    > 2         5 %5004DB:TADATADATADATADATADATA     6  5 5c5 _ N\   v      ! -L F 78&  de   55N \  r  5 5w5 w n 66 6 7 j 5d55 ta 65 V C5-5 @& a R 5   &  D e %5    ܍  5v5Q -d 4 -r 7  r  ~ e& Ο y6 T H %    5w55   5w:66 5 7 7 7 7 7 7 7 8  |  xLne, X5 e& Ο xFB (a 2v70 "&%55w  6    -754 "    .e& Ο$ Bx6 6` -4%     6 @!,5)   J Ne& Ο w6m(%  ,Z& We l,, z~ Z, WY ,.a V0a,& We w R . .-. 0-0 2 0a,& FWe @m7  Z, \V%%5S %  w      w w @m7  5X5~"7 nh7 b\ C  C m7 :5/  m(7  6  0 C  C        6B!7 5   5 555 55      N V7 * w6Ub 65  & toL^ nߎ & ZoN^ m & Bo 57  H   ؇z 7߷ ;߄  6  & n-P^R^ Zm5&7 F*H 7 @ P  \ * LJH߁ ew88555D7 -޸& $   憎 ޷      -vޠ jޔ޷޷7 <7 vn7 28BBގ m *޷& u fer)e2w R m r     q7\-- } 5f#݀  N -ݞ& f 2 & lZ^ Vk zqwt r-> `q \  N  4<&& & p e(& & \l- \^^^ j7  Nw܎&   e y w5r/z -)5`& d H|& k`^hD (< & kd^ Hj lp7h r-2$&   ܎ & rkf^ j7 ۷ & rwۖ% &  > 7 7e %wO ΃ f&  & j le JmH r`ۀ _-6[5  H& Bێ 8& jh^ &i#7 ہ w ڎ & djj^ h&  J eڦ&  07  e @{5j#5d & il^ zhR 6j& ip^ Xh ; v r (& & i-Jr^t^ h7  w,&  ^% &  F% - && & "e e -4r)D Z}%7 ׇwlMv P7 ` \f& h-lv^-Zx^ 4g 7 ٖ% -2  lh|^ fe f& Nh Bj% B  R-# ^ 5^^ f% ^ ~f%H F H , & i5~^^ Bf7 ef-H/5+--#^ f N ,`; ] `r t]7 7 w׷ז%--P00iw6   l^ &0 @  Aw  @    Aw  w ֿw   @  Aw ֣6 p6   wv 6 m  6 e  wb6 l `րm   ev6 " J\ m6    *\m6v6   @6 -W B  lQ Է շ\J@2  @ 26 `ȵ  - - ԃ 20B)`ˋ$  nF 2     |Է Dԁ  І5 D    5 w5w %e t Jf-  (t  - t -:4 {Ӏ   {  wG  5k i B`ʵ,  l^ {Ev LEʵf lg b b{ V X{ AC`v   6   C` v     6  ˕v  5A -^^ `X - ҷ Ӗ%wbFer)-zf,Xer) &%N,V e  xi XiBe m - %wF  \w & \<[?6l)0\  D a% D &¥  ¥ ¥/  p¥-¥N `¥O T¥J¥C D¥O(@¥R 2¥EK¥O[D Za%E  EUE  EUUEE r E U E L UEzE & U^UXENEH¥ ¥ ¥/¥ ¥=¥: ¥,  ¤  B  EDT>Invalid option switchSyntax error on command lineInvalid file nameNo input file namedJOURNALOMMANDREATEECOVEROw[e 7 7 7 7 \7 V7 P'& .(5wF'2't=L f? wB@ [e S5l5f'3   7/00DDB:TADATADATADATADATADATA%v bxtjB'.׭nb'׭R'^Y}TJ'N(7 w Ze ,_'["WJ' " ;3'& & & & & & & & & Ε f7 6 6 6 6 Z, Y7 7 \7 P7 & =6 77 7 7 7 7 7 7 7 7 P7 cc7 7 7 7 7 7 7 7 @7 FB7 @<7 :7 7 7 7 7 \7 jl(|7 7 7 7 27 p7 . 0 ,e j x7 <-ؤ :h 6 a6 aa f5 U5  = e wNPa $q B U|N3 WN&3 WNF3 WNf3 WN3 WN3 xWN3 hW**a* *N >W%V ke(w0**a* 놎*N W%**a* ~ Ն*N V%**a* R N~ V%**a* & NT |V%**a* N* PV%& & *eN z N*6a ze V \je,#߲5H" JW  =TU.&e,@ ef& & de  i R -8 N o i%5  -  5& & ce N i  5x& & ce  Ri  =p$-R-@T Jx f& & rce l i n  d f5l L6 6 N=$ a& c5 la `m  e=7 & & b5 la m  aa b na l  e7 7 e-R-PNN m g7 $7 ߖ%wR aa ڇ5%M 1 1 waa 5e31 1 w 5a a `5  3 3 ؁ e % * C*   ?[EOB] .!?  PASTEMAIN)B.JOU;[?3l[?3h Z=w ڦ*8I *=)98  eB &&  U **e *Nlv ΋*.2  & #!)&eP(e && >e >E np* wRw (DB C DBe ?D(e(e$2e (%[]%<>  1 >w **eB 8 > w ( D 8 8#"#)%ĥ ĥ wn 0 *0 @Q$    0 40 60))  L \# BU&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff H &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@)) Z *R*)@#0l C# 028 x00ĥۇAĥĊ  000 (0 @0 &*0 @ u # eB&B *B > d*  eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p282e&( 0 0 0 80 B0 0 0 0)#0.0+1(e  %&p*w f( f)f )"(. = . B  E  b00LDBSBg(.8Ae f"( UCɗ&+(e$&% **f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ  \Mwtw ֞BC "& @SY&*p0p210=E%0=w(*e "f D CB.E141612epl2l0p   f d >5>Eu l  e6p 4 68 f |81416      ^ f r&* D*> =00l&8el2 0 *w ΛeE D` bl lrw   B eE"s    s-  CslM=f(& e %&&eH =&e0   >E=uf p  weB  8 $&w F*<S1   K U U@  nf&" '&)'&&* *%0*ND   EU  $ 8e2 ..8em,0l0!D0e6p 4.) &f | D Re) .  e6p 4 08*wP=p!Օ^,*1 U8UMw w B 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ Dw4 *) l0, *) $ )*)0,40,6 (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w H *$ ':T U@% DD%][%><w  w1  %,,:4 w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce    *w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ 0,0, f 톇,, w N     .% eB U5UU plp & NeՀ)*(e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DEe    *1  ˕03 "   ˔Ӕ ʥ75%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@w    E r  l T    00TDB:TADATADATADATADATADATA       C" @@`e55  J5 N4%  File specification requiredNInput file could not be closed^Invalid entityn!Journal file could not be opened~No help available for that key/ORIGINAL line numbers no longer an EDT feature!Press the key you wish to defineSelect complete lines only5To return 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 useIE.BDR - Bad directory fileIE.OFL - Device off line+IE.BCC - Block check, CRC, or framing error V n& V 3*&j jV dV3 )#6 ` އ#6 " ҇wT e4@ x9, U === =@we8@p@pp p* 7*df ` we@  w.*( 4%%geBfe h4A : 0,! H4 (e(Nv 04A A A . z0A ; j0 52~W W f?@  A ~N 2e %!)Nv 3: /Nv 3Nv |3%@ (  @ B  Ze& / 0 /  vPe0& / v~w r B! & &  .ew r ) l8C $* ) *w*  ep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  8 V *`)w ~C#    D @)  6?0D)w Vp zn832cd& & & B  2OΕ   N Υ$Ε  22Υ   v Ε f $e * e*w@)0, *   ) )(   =  l 0l  $ 0/ e&=Ba@a ne0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  ,   w> , JwB #00dDB:TADATADATADATADATADATA  f  `* w)0406 l0 (e(BA &(e(H0 (A f( (Af((AD&()&pDCe(e$fҕ[ ,ҕ, "ҕ]e(0 >E 5  e0Ґ w *l  0,0wT  w l $0,0w. x46  )0406 0 ***0+1(e  %&p*w f( f)f )"(. = . B  E 0 (.8Ae f"( UCɗ&+(e$&%  *) l0, *) $ )*)0,40,6 e6p 4 8  81416  & L   8  **  DP5R RRR  \..8em,0l0!D0e6p 4.) <&f R  (e) .  e6p 4 08*w=p!Օ^> =00l&8el2 0 * 8   * X D 4 6 e6p 4&*&4&6= 664 wz%!64=5 2 6  l0 & Z46 64 :)0406 0 *0e6p 4 = 0,0, f 톇,, w f     .% eB U5UU plp & NeՀ)*8e2 141612epl2l0p,*1 U8UMw w B 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ ~W]~H $$C˥.˥;  P$ ɥ.  C ɥ; ~H$ ѥ; H!  B~!R~!!~ѕ. ~ѕ; ~!!H7 ww@& SY&"D pAB% b! B~7 7 AB% >AB.& .  $@eB! < fwn7*dwe7 ܰ 83@# +@  777j$ U@ ʡġ*7С L we" T@   |tlj\  R0  %# F#   ww wDe@&B#  F B   we  we"ff& & & & f e @"  wefff& & ff& xe "@ !% ХTХMȥP=  0 w q*8I  *=)98 eB &&  U **e *Nlv ΋*.2   & #!)&eP(e && >e >E p* vww p* 8B pB d 0 B w o( D ^ 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB x L \# <U&* =w `p!2 EW!p0p2 ׇ#( P) @#00lDBSBg**fff > &*wj. nB5(8e$8w2A&(e R 4p8q  (#5=A#@)) T *R*)@#0l C# 028 d00ĥۇAĥĊ  000 0 @0 &*0 @ u # eB&B $B  P* z eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2eB  8 $&w Zk*<S1   K U U@  f&" '&)'&&* *%0*ND   EU 4  R  (e(BA &(e(H0 (A f( (Af((AD&()&pDCe(e$fҕ[ ,ҕ, "ҕ]e(0 >E 5  e0Ґ w i*&fB VIB D  ? 5   ,*+*1,\\1,^^pBBpDDpFFeB >eB 4 **p**0 B1 Bw 8 !Հ)w*wlw h*D D  wX82e&( l0 0 0 80 B0 0 0 0)#0.0+1(e  %&p*w f( f)f )"(. b = . B  E B (.8Ae f"( UCɗ&+(e$&% ** b f F&* H*141612epl2l0p ~Mw   f V >5>Eu ^  e6p 4  8 X N 81416     | > =00l&8el2 0 *w eBC "& @SY&*p0p210=E%0=w(*e "f D CB.Ew deE D` bl lrw c  B eE"s    s-  Cslw ^d(DB C DBe ?D(e(e$2e (%[]%<>  1 >M=f(& e %&&eH =&e0  U   E > >E=uf p  w(ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w .b *$ ':T U@% DD%][%><w  w1  %,,:4 w ta*D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce    *w `*  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք  00tDD:TADATADATADATADATADATA   Օ 8e2 ..8em,0l0!D0e6p 4.) &f | D Re) .  e6p 4 08*wp=p!Օ^,*1 U8UMw& w .B 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ dwT *) l0, *) $ )*)0,40,6 f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ (e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DEe    *1  ˕03 "   ˔Ӕ ʥ75%& w Z&Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@0,0, f 톇,, w X     .% > eB U5UU . plp & NeՀ)*|e,i W F TITITISYLBCLOV`r&?@ `nj`i7 p7 7 7 7 J 7 7 < 7 4 7 2 7 2 7 7 , 7 . 7 , 7 * 7 ( 7  d95& D5 $9a55 5 9R 9O 0 9J5r 8C5d5X5N 9 0 80 0 852  5n 7 UZ ʴ  85 EUU5 00DBSBg5 ,5 7 U 7 v7 7 t5 f8 p8w5 P8 Z8& & 3p 2UFDDECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJAN00DD:TADATADATADATADATADATAXX=`?  7 BRU> # [000,000]BACKUP.SYS;1  RXX  l        0  L%N%VA%VR on %VA%O:%VA%D%N [%3R] %X Tape %M Disk %M . Press "RETURN" when done%NFile ID %P LBN %T.%N%NFile ID %P,%P LBN %T.%N File ID %P%NFile ID %P,%P VBN %T.%N%NFile ID %P,%P "BRU -- *FATAL* -- BRU -- *WARNING* -- BRU - I/O error code w 7 P D7  54E 55 ZRTE|,>:%:"2"E .UU X7 L $ D P7R7e  @7B7ed7f75 7w4 7   &   C R5 - pѕ"D ^w5 n 05 9 7 Ҝ7   %  ȕ]  e7 z xr, 7 f l ` ^TT LFF Z P7 ,-BP Е Е 7|  7 7 wD   % w` 7 l7 l7 fw 5w %E 7 5j64$]"5  & & 5jД  D  ( . W   " WAɥZы  efRʋ  ҋ% BOTBPIBRUEOTIDINDEXF.SYSIOMFDOPENRSXUFDVAXVBN,9^w~W`z}K# v_RuL`;,9^w~WJm9ahw~WJm9a)&pt!w:<% N t!w:<0 t %: \C^(}""` \C^K(KQox# v_RBx@}[MDv}[MDv`ԅ}[MDlr}[MD"h)""`YyHq&o~xw`}t qev_sp%e}&i'XmnL9v<I qZI9r<R qZI9r<W8 kM}X:""`8|X88? }WLH!8?}Ѕ`z;rz`uqE_sp{DvWoLYZa\gIv,{Dlr{DqE_spmy&mnL9XkLe \C^vat!^t!^UNEX"` H}`' X""`K"w:K""`K"w:N`:w:""`Iqv+_tK""`Iqv+a \C^v""`Iqv+ &""`Iqv+ &2! =rp_sp""`uL`;# #t!w:vK%K/ \C^K&Hl"Iq_sp&Hl"ZI9r&IIquqE_sp&I} uHZZ ^K&I!s!NJ"""`&I4K`H fwL&M 'K@&N`' X&N`z#"62p`[q8Z2l*"h)""`2""`e4B[MD"h)""`e4B[MDqE_sp,:Y Kw^z`)&ps:`L;!vi;)HmnL9vt:#&Hl"Iq_spt:#&WqE_spt:#vv,y:i~LQt99#"v8Wp`8;8}@:`8tvp`8:`vLT`fM+:`M sZL"K69#"_a\gUN@:"00DBSBg ""`:)e j)R:)!y;:)%:W@:)r}:)5OpMvQ1ZqQ`&Iv`ԅ4REplr4R""`R6x+_WST62K !^t:;_SZSZE~pWE} uH,]a w!@~Y \C^(}&FaY&8"' XY% mnL9|X8v +-LqY z2 & #yxfXZZ ^Exss:`L;!@~Q]:FQ%:vE`W_spa\gxxge!X[qj@5aYs:)h;?WL 2@e= 6]zp8"`Yf] y_w~Wpm}%:dF%:lvKq`?}U ,U7l$w 7l 5,5@5$5 w / 55w /^ V w"w "%N%N[%3R]%N%N%X54:5r65$2=5 *-.5 " 5 5 5,5(7^eؤ57 n 5D0^0 p w"%NTotal of %T. blocks in %M. files%N0 p  %  e  * w f    ! aW ef~ eM  $l: <7 * L`܇e _vߋt ***THIS VOLUME DOES NOT CONTAIN A HARDWARE BOOTABLE SYSTEM *** && d W c W  5 E 5ΉU d`\ 7|P   w6և  @ B     Rd    77 Շ&j 3R 5@:$3 \Vܢ^܎Zܷ3 ~& L x7" e 7Nb`̵rEۀ5h E`EX 5H E@  v5700DD:TADATADATADATADATADATA7zv7  B5 aА84~0 E p 4 4   \7 (    d  Eet b d  plh--w5 $`~  555 |5 5l 5@ 5  4 ܸl7 7 7 >ٴ%%ccld7 bv   z p r 47 (L8 ZLmp$ &"5  w ` ť ť 0B Aaw .' UD$BA !&( U BQ Е*  & & @( f  e ee e (( 4(L(^('' ( ($(      * , > J X f v        !! !*!>!L! V! b!r!!! !!!!! !" """0"D"T"d"v""""" """# ## #0#H#`#t## #"###&# $$ $ *$8$F$`$n$ x$ $$$ $$$ $$%"0%8%R%p%%%%%%%%%&&&$& 0&@& `& &&& && &$' '$'"F'V' `' l'~' ''' '' 'ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA d C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& e/& e*AHŀ ȕ Е Е Е & ed & ePЕ A %& e$A Е A bEA EЕ A A   $Е. x AЕ;     w $D&& bЕ- eaePPPЕ-$w D  &Е. ce  Е:   B'&1 DYZ |PY Z tPYt\ l\YZ d\YZ \Ys TY] LY] DYP <Y 4Y ,Y\ $Y Y5ew , Bv     5Bw =%??5  5 2  UE  8Y0< @@<6YE U 5@*& E& & f&ËDef Ë )̋Uw <*8I x*=)98  eB &&  U **e *Nlv ΋*.2 : & #!)&eP(e && >e >E p* Nwx&fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@Jĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ z  <DEe    *1  ˕03 "   ˔Ӕ ʥ7*;7#00DBSBg3w *$ ':T U@% DD%][%><w  wh1  %,,:4 w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce P e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ (e( 1  `((   >: 5 eCew $ ( D  8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB L \# v U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff  &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@)) 6 *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @  u 8 # eB&B ^B  f *  eBe>  # #D #=0/H#@&0 # = e0   b0@e 6=#02/002# @#?@#040 6wx/!0/ l0/!p!0 .=p0p2eB  8 $&w *<S1   K U U@  f&" '&)'&&* *%0*ND  8 EU  Z 0w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce (   0*M=f(& e %&&eH =&e0  RU   E > >E=uf @p  ww N(DB C DBe ?D(e(e$2e (%[]%<>  Z1 >(ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &&  m  f A N  %w eE D` bl lrw   B eE"s    s-  Csl5%& w &Ba +- ʥ# . U 0   b   `     f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ &ff w BC "& @SY&*p0p210=E%0=w(*e "f D CB.E141612epl2l0p " 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.00DD:TADATADATADATADATADATA> =00l&8el2 0 *e6p 4 8 81416 $ 4 Z  )"(. = . B  E  >(. 5 ߥ& *  + 23E Ew Z   Е-   0@A W e`fÊ    E &f ,*1 &U8UMw@ w HB 00fep=& /e`pwp46f %8 E D/D!D l0l8epl0pɥ.ɕ w8e2 *) l0, *) $ )*)0,40,6 ..8em,0l0!D0e6p 4.) &f 4  e) .  e6p 4 :08*w=p!Օ^&   `@ ` B   & A @    0,0, f 톇,, w      .% T eB U5UU R plp & NeՀ)* ZDYhY.Z88YPY0Zl8Y\Y2Z8YDY4]tYY4]YhYY>p,tYYHptYYR]2YhYtYl$YYnhYYpYYpYY}$YYYȭYYȭYYP̳L8Y7 p % \e@J "J,D B@ 5 5&F 5d&T ޭ E` e 5 "5 jw5@T $n j5!5    e1UH *E@  e  R$ R$ Ɖ |5F 0p^ tLw85@f fw& dwܪ:55 2p 4 4  Pr7 55Ҫh ̵ª5| eȳ->ʜ e R$ 5.5$̵R$ ƉH5 ةЩ Rĩ Yb Y YV Y Y& Y Y: Y Y Y:5 ȭ (U5U@ 5 Uֵ5U@ 5ĵUCR7 8N2J.5L5B  ^ b f j E@tElU f j\5 L]5l]к :54) 05" R17 7 t5jtfp DZV F5 e5U` E vEn7 BU$.߉E `L )75v )5^ ) )׭  )׭ ׉5%5U` $E E7 pwhUس곴D߉E г5;F   Ո  Ո  EeL77-ܸ߇b 7777 ԇ Yp Y2r Yu Y"x Y} Yfp Y, Yb Y Y Yj Y xY pY hYح00DBSBg l `U fm   GP  %P%ȒUʵ 5n %  J%Pf%UF 4%L "%UF 5`  )W wm 0f5Ƭ  51ܫr L t" W,COW,NT e w!LLw`Hf 5N e&w lh XE f  x:55% / 5 6)%HEЀ%ADʀ!%UF |5 %UF %HE%AD   5l5xR$* 5dHF]  o] eo]e F]*] 8e b] "!  ej] e ]  ȕ]  ew"%NVOL%M. %VA%A%VA%A%Y %3Z%N[%3R]%N%X dYb \Y TY LY DY:  ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@j aŀaj@MGbd z=bcd d2bcd N'bcd 8c  bcd    (Uf @Bmʕ 7 ̥WWWWW@ow|4HOC%w W#  B0  e ff e U  %ee e`u W.   From: To: Initialize output disk [Y/N]: BRU>LBN(s)=ddNOddYES /:,+-) 7 f wfe xS   j   `E    ` Eew W0WZW9WA &cȋPwF&3&f& v  ܀Y{ ܀Y{ ܀Y~f&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0 eeȵe ~  DE  ȵ2e &e  %&'@^e55@558Beeȵee& q1B$e q1 B  f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B 00DD:TADATADATADATADATADATAN{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 ) 8C $* ) *w*  ep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  8 V *`)w C#   D @)  6?0D)w t ) * w46l0w 0*D  w 8  \**  DP5R RRR =D `p46 f 64/=  "@) 0  8w 46 V8 Fe*w w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C w l )  fU %  BA `6p 4p`4 %60 4|~APPEND r|~BACKUP_SETz~BsBADz~BUFFERS|~COMPARE{~tsCREATED"{~DENSITY J{~ DIRECTORY`{~DISPLAYv{~@ERRORS|~EXCLUDE{~EXTEND{~ HEADERS{~IDENTIFICATION{~sIMAGE {~INITIALIZE{~INVOLUME{~LENGTH{~@MAXIMUM|~MOUNTED {~NEW_VERSION {~NOINITIALIZE |~ NOPRESERVE {~@NOSUPERSEDE |~OUTVOLUME|~sPOSITION 2|~rPROTECTION`|~tsREVISED|~REWIND||~SILENT ~|~ SUPERSEDE {~TAPE_LABEL|~@UFD|~VERIFY|~ WINDOWSGROUPOWNERSYSTEM WORLD ~BEGINNING~BLOCK~END~MIDDLE ~AUTOMATIC~MANUAL~OVERRIDEAFTERBEFORE~RESTORE~SAVERWED / .; 89.[,]@2 2 ""55 U7 n|j       @<efJw052w0E  v wE  T wމډ܏7 ։- f-[] U  < EW @ W >W EW W ŌeW |W z ȕ>hTdP\ZXVPbL^D? : |w p n mPPH~ Hx @r 8l 0w * 5̑ & & E JE >5 5x  l b_5 Z S  L5Fw<9  )`5  $5  -= ҍ 55-BU̐ ĐA5a U5 x5@ 55s5| 5˜ss:R 5 T   U>58w܌  7R  7R NN7  ތHڌ֌zҌΌ5 5UU5wh55wT5wH5tw<׽/f# 00DBSBgws  .7 fȕf ? ׽х"ąCwҜ z7̜-Ɯ -׽7B  ׽Y/s  PH  TW. @ wNW; 7>J7 7 5$55   ʊƊ55 5ԍ5ЍW/ W W 7 ~ wvp   vwTs F tFwН<ȝ4 0-.MFU 7 q7 r7 n׽- e W!Muu׽ n׽?W*s , D%  T W. W* @ u  W;  W*  H5J   J <6R 5(B7 f>2T bW(   W) uf  $wx B0 1 . ,`*`(W.w H  w> B0    `W8 W9W- w   W0W9 J5h h  ssSӁ ԋˋ bf W( & W:HW:D &W-m Hppe eXUUUW-Q  EL dI;D0-se:UUW   e < (  & <W:  <  W) f 0Օ0 uUF Jfs (W! U Jt`R& ȋ W:wNN5>} W* W]&UC s fW]5 5 f U =W,9 <MW,25 W* s V u%54 W] s00Ћ`W0 W9  s3 fw ӄ(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$5lR15Z-$~-DB9-DM5-DR1-DU-< }-DZ%-DW!-ޤ--}׭}%׭}-}zU-}׭}5 }Z}V7 TU֞7 U7 67 4 7<5@V7f7T5B&eeST ֝ҝ5^ģ 5$7$ 5 >,5ڕ-7-ؕ5ƕȕ.e< P 5 22-d -v J8F45`7 &7 $ 5N 7 5<54HD-ƝU ܢڢ f  ʝ Xw| 2 wv 2 w|x  ʋ UV $ W!f ww Oew   z- w`w h cW tԝԊ% 4 eB{7  cW tV % { NL  A B %  wᮖ 8rr r rr  Ktfb,wX eTwN 5x w82= x&" w *R%  RRRRW#W! (W#W! ,AE @@` C e@ 7w} f  D<B@|($00DBSBgU\EVܴ찱7 ԪE>̵E E TUJ!r!r! r!  r!Uֱ e X /B:E@氷@>ذ44 İȰm ?5X+? V5N5Dm@̧w Ƨ7 6ʊچ t E7 wLU w%Hw w,0(d$ e5h e w%z '5%N>%N8-6-0-* -$ -5L--- 77椇%5e v 5@E@w7:5 JF B777 Eخ7 ֮7 l ^ ؉w7e (7,$5t5^ ͉5T5T̉w5>5>ω7 U* Err7h8`4602(T $P @55xخ  B5@ЮwU5j^ mJH ʭwҭڭЭȭҭE@f ^ىt ~wxpvlz-hJD^Z<T e5 %%z %e w5 EU-555 e 5n5d 5\ UP -855 5m,,5"mw 7 hd R55@ - %DAgE@Ҭ z.7 l7 $ ^(&e Ӊw  5., &^e  5`5` ̉ ,5Dωwr56͉5( 5#vfE ee&f R ~ Ɓ5 ܫw 4 J5«  ,5@wUw5 w  w-ڪwZ |&5"5 5m^^5TmPܡw ֡7 Fʚږ ~jxd5 ʢ'5 /5 w ̵@   ae  e@`7`fw `w ww E0U (w 5@ZRRRre@E@x̵©Ud U@X5 5 5 ʊ5,tlb xډ $ Z T5 5 mw 5  5ک7 ֩ 55@$$5 5 \5V55D 5 52Ut Ed ̵7 7 t5,whxbwHtrE ơ0U%L "wwPJ5بEШ fe$ wUw`5 X5Rw&w w ‡w&50 &w& ~&w&5 5 &w& ^&wR&5> w 6< w 8‡5ܟ Z& ,&5 Ɵ5e ƇE e  5Ƨ%"%?  5 Z5T Ƈw 5565 .5(mrr5hmdw ʲڮ7 N ^jfbU z20b -Z-R DB 5vyUUm5e,w & 5@~ -:> %DAaE@f w l&|k&xk( U45*5 0 -b\X5y@55ejw d,(7 ȥ --5e*w $7  Ԥ wƤw Z7 7 x E `w e  n)hv5Ҝ5̜  t%n   7 4l.7  LƆ.VӉ4w ʾ ۇ ՇHEADDATANw   55 5 650 5$e`e07 p5HLvn-vpjE !  F``^ 0`H V *R787a> 65@ޣe*e$wm  55   22e55 ueef dԛf!3 L !5 D3 Pf)%L  ~7 xLL  `5 5 w w 2,$7 ,U ΢   7 "Pwhee 5 ^5X 5L ,ء5z¡ʲ00DD:TADATADATADATADATADATA0 `&  `e zB `h|of^RNL ^C7 jD7Af4: 7 "l7 :DӉ7 fpoJo F& & & & f& & & Ε U   wewewE J7   w`e  & & & &  do& & & Ε FFD-LD %w 躇%NFile ID %P,%P LBN %T.%NRecovered vo p p po p p$p,ppzf )z Zp[] 57 47 ,'dwV zȗҗʗƗƗ§  p5:U@,B>>:^.Z**eP$ lh R`\er•• (7 7  7 eNm HmB5Ez5 "5 N  B5:wPwF5 5ڕ f".w5@e.5 5  U  .`ʝ7 .7 ,7h7d7۔ f5 @\`E $U55z-,4 eޔؔeҔ   e7Дh54 ”7J7Hw5 5wPw wX 5ڜw5Μw"5œG7NEU5 *5 &U@62U~ Fޡء5lwEXU NF¤BГ 7`ʓ7`“5,BU( 5wE wn h7d  X]Vvpʝ5қE  \4X0 E ..($7w5- Uv  wew85L= /  ԅ  w! mb 팠 r wz t  d]byxN ` plD]B^̚Xw5wE7 %7 e7 lv 5UޑΒƒ5H-5F)# rU,*¥wp̉wjp $7*jwHwJA A ww| #5 x@# *¥7 7 |U¥nˉlޑd`& v  AfP    ŀ U( p=wΟwʟwƟ .7*t*\`2\8wawa7 J7 D7 >,2,U7 7 @5N5^ʕeʝpl5b-ޏV]ҏΏЏ̏  ` Eʝ=2 2 h51wE5ޗ78wJ 0wBƗ">E"5 U5=7  W D E E T 4 ҜΜ`wڟ .eLU*LP  ~-zr% -^XV m؍]֍w ҍ)ʍe- - & e2w ,7  @zĎ-܎8cՉw llқЛ7 ʛƛ -m7 썖U$ wa܍t ` f-bfx f e\ee`  lp , *$w  7 Ҕ x 7zȍ7 7 ح - t. t ތ΍^ƍ̉UFȌhČE*]    7 >5`%.&5 -z  \ lԋ f΋^Ƌ7 Z7 X 7 M    =eB  w5jw b^Tx5 FwJ5@:j{ ̋ ȋ $ 5s5 5UJw 7 @\` $ E e VT ( 5 51 w ܋Եw"ԋe ffV\ ww e w ꇷ7 ̵  e 5@  2E U\hXU֒ ԉwʉ w5@ 62(   CveB 00DBSBg5Z5E@R5 L JމB։:Ή `"7 \ 7 VNF @>: -0  z w mވ=܈e҈-Έ-ĈȈ  - xmv=tEMl Pw Zw TeL-H 7 <8򝦖mr  - tpmr H r$EDƐ5 v5p ^ U@5B 5nu[p 4 , $ |ȕ]  nVp f\^z܉<5@6Rydsvmg$p jf&w oRw ow ow ow o܉U@5| Et  Uh   . F(H*J, <5U@w^ZՀ UȎ  `ee   `eѕѕ   ܓ֓ғ0 f "7dwb7XwVNFD  ҕeeN e%%J L 7 w §&W @ ҄&΄" Ą 䯀5  w ̯w n5ZwjW &VR 2 @ w8w ww  fVX+d&f 7 VRRE sas Ü ceעs e ` \Q$eQ   w   ep 5DVw LdƔ\ w Dw . w 2w  w w   w  z.7 7 &>w:  6 $x5E E 6pw  2) 58r&VQoVw " ؃ `DA!  ` v  w ׭fv n W!? e@ Uw @:50*ʝd`  7ef7w `JҊRw >58 5*@`e.   "5 w -N 0>  W D E E  "84`0w* ~eL Zw t ÝE   BPE E E ,& eL  w  w # #5, 5؈& D#7 B7 @ $(&-TDX   hU5U·-  ؍-ҍYƀʇ :E0Z4 ̵7 ֍ 5< |5* 5 w7e05 5=f&& 00"(&&  v`N 6,   p` a e % % ewF5re0hB $%    :  7w *w w(  $(    `` ఐ    `d %   $)74e  $ ($) 47e  " H `A Ae  `L $)U <4-E .& e %w 5rwt~wތwj~N5ޅ @D5̅.882 ,~`%w.U5 r777ލXu}`Lʍč}݉7 E45.>7 775 ' T $ 7k 7`^w X5؄T}J} ^ 55  7 7 7 7 }E|mn 7 |7 | pw|w Rd|$d d z$ w. w(7 &$||w  E  `d $) A T  A @% A ``` ` w ̵ We0,a  C`B W  R C`B H  C@w<  w!2Aapp&~0 e   ` { {  p pm p mp  e -w w PȄ(@f ťZ+ťAť9%ť0ť$ ť  00ED:TADATADATADATADATADATAť.@&fA EAa$ ԲY ̲Y IJYP Y Y Y Y Yl Y, Yܪ Yȭ |Y tY~ lY8w * 8B ²pB  0 B 6ćw *f f ! fP ŀ)Bw w(e(BA &(e(H0 (A f( (Af((AD&()&pDCe(e$fҕ[ ,ҕ, "ҕ]e(0 >E 5  e0Ґ * 5)%Eefffff f% EDD%][%><  r1  7 5 z5$w5 lw5w~µ5 F 5>e U .q q, U7 |7 zvwv-B~ c2~Vd< w@w<602, ( $ =- 8  -  eW!cu 55  0 | -z| ^-tt!l Z 6D\ H $C7ε<7̵8ε2̵. v@pw,̵aAaef ̵`&a   ̵s ss|s-|w7 7 u 6U:} ||µ e q q,   w~w sB vs @Cmfs hs-:<-24 Ls@`   -8sw t@pw ̵\xеXx7 7 5~wE~P5 p؄,҄ 5^wĄUPmv~%Y&wE waw   5  5 НwawLw$Dw ~7w-w* w"5~|wxwrwlwlwefw5~&VQw -v 7w5z~ewڃ*w$wE B!WsSewe vw @5,~3,x &`D 3 3 D  Kӊ KӊSev#a#cv$ ӊS `@ e nvehvw e wLv ! w KӊS4v HȊe Ha` H7vev %Y |w L:n A%wtww~F t'5@l#7 twfwT )6Z%< wzt7tt\f9e U{7{7{7 Ht@w 5ns${,t6t tU{߉  w.5Fs HL PUv{w^ko(o>7p{5 s" sa5r 5 r5rwwh Pʃ 5 ؃w(5rwB@7 :5rU l܌ V-Pv׭zh%bZrmUz5(r -.r-*r-$r~5Vz"  P rm%F9 ĂȂ %̂EyTrl"5q5|qwi5nqw\PjUy >5r 5HqrU>qm56qiE,qdw nqq5q<5@Xy#5q wU>yPyq߉qq5 p ׭:y7 ,y 7 &y5@ yw` ́$%!7`q H wtUxxHq߉Pq:q \&%#7x5@x5 Ppxlx nn00 EBSBgq7`q5qwJ5 5pU 5VxP @ 5oBx 5*x   5o%Ex5 oM5o EwE w UwU ww5o  0 5^o5@ww5JoppUwwo500o5&ow r ) %`UDwp "5.w oo0wo5 w oUwxX) P 8@ rEv )  ~o"NRN P-LP(@:2׭lv"%  ~ U2v~nP~(v z%HDB%R1B4%R2B4%VOBK%L1BGbnLn5m -vBm>-pBm:-jB~m6  )  )j~d~n x p )P \ xuB nu w@5lAR$ 6׭8u   >P $%V1A"%F1AI   5ll R$ &mmUtt m5@>lFR ׭~t&  B z 4 r & d}%P|%UF@|lg  |7^lkP n j|78lg%EOd@z%F1\@%V1T@  5@-0@(,@$  {5ds EXs{{T{~{T5j U.s@skkk߉ 9*s!5j   ){{{Hk` ){%7 k5x{ Ub{rU@r`{ ErE%G5$j$5<{ 5j5Xr|7 j`{ a ){a w 5i5i 5@ rrr*rp l F 5q5zi5tiQ 5^iwdwd 5>i Di@iP5hC5h? 08R1  /00ޫRRR P      F P  p  @ty-pyP%dy׭pVy%Py  Udp  $yhgeP >Pe .x"eP eP  5g5g R$    5o( *e&z1$ Ґ*R1 z%HD%R1ޫ005g& Hl%HD %R2& (F p R$  )w#׭wwJg\gFgw%% 5bf%ngn߫ 5 nD = P5 \n~ z ' j  f  ` \  L H   z P beP XF(HU@mP%re7< 7: 7 7 P$   E m )@v 7e׉e Rwe7e7 e7 eVOL1BACKUPD%B1111001001 HDR1HDR2m*mew e5m PElm mew e&fll Rw`xew vel 5le0mlVew Te5bd5Xd5@lw<5l8UlNukk ~lUdl5^lw )EHl8uJ%i )E,luw%YMEltjkfk lUk5kw. )Ekt%1 )Ekt%#5`c-HdJdه-dԇ5k5k5 zkBE rkUnk;cccEcUTkU Lk\kU>k ڍ FE *kE&kX apEkwRU@k 6E@j`w: 5bY5b@5bhUbj `s0s5jEjwUjwv  UjX $apErjHs0NswBU \j 5@RjJ02s &ܤiE8j/52j 5 (j BEjU j-EaU jr w5iEiU iDiUi5iEi  Ui7 i5fa!5i )Eir w5i  )EpiDrU@ji w5@RiwXE&7 2rUz 5,iw5 i!%(&f$    щܕ$ wdUf &5h$%UFX5%HEP5ɉt^aoEfefE 00ED:TADATADATADATADATADATAew`g`҉Z%DA5TEf ܅  B!e7p7p7l waf7r`Bg7 ZglT`7 6g rT`|`Ӊ7 4L,^D ~& & & & f& & & Ε  E #eBae5ge0e0 w%(w $ 所5E5U5Uz 5rUjy )o %wr__n_RfEf7 f%NFile ID %P,%P LBN %T.%NdҩFllopo0lo5f$noro0no_ک lX )RoLoFow(k= )onnwW "HE7"DA%U e U eEe/%+UeE e$"UF*$EOIH^2^F# :5ewwN5 eE e5@e5 eU ze km5be  -jҩ-jک ) ) j7]]]m \*5dm L@m Hmw杦mmm $|mmmw5dwZwnXmwPm ) 00010001000100 00000 00000 000000DECFILE11A U0414404144 M 00 EOF1EOF2EOV1EOV2 |Y`^ tY] lYi dY] \Yi TYP LYȃ DY%NBackup file ID %P,%P LBN %T.%NRecovered .w rr7 tr5 {w5zs5xs5ns5hs-8r.r-(rrw-r5{ r rr r -4w.U Z{m$qw q& r-rriqq  Ҧ woooo o W!f@ݡ `%~qDݥ Dݥdq`q >-oDݥm m|>q5mr8qw 2q9m\omXo$q5JoRe Pq HqqqEpe̳ C C` fe rwr 8r -p-p-pe pw p-pp-pp7 p p |pw 擇Pr‚Ƃ%Np 5jq5^q~r|qXjpvpf%oo-*w$U Py @o>o:(iq#*$q#-o7 7 7 7 7 pqmow o%jotoHpoDЁʁ0q7 4q7 2qDow# # w Ln  .o7  o0-E  * ^7 np77a ewmw 葇  55Hnfpw %$n777 p`l 7 U lw7x7tnfjb4 p$l㉷J J ee:w 4 ,& & & &  & & & Ε w w ( x& & & & f& & & Ε Uw -N n n n̳ C C`e   E `D 7!mw!le ,m nn Hnml @ w jn5m vjjznUujjfn llllwh5uw~w~7j5nmw} w~w(~w>~5Hm 5 @m5:mwww r>jm5m(5@\u5\u (UHuZu$j j߉jm5 l7 >u5@ uU uw Uuuii߉<7i5@t45 l0iii 5t  i57} ti57}7}70}7`Xiw} 5|t>5 "lv5l 5l  T5l 5k   5k : E t hU tw5kj5k $ jj fjj5k5@sh5sh$lUssh50Rk 5Hknhdhw FhksNh5k35 ^s :h5 k5j%5j U8sh5j(@|7 |7 ||c|s5@r ̵ U@r iZiRiiE r Er *AUrrP?vgr w^00EBSBg5(j" E nrRiiNih :h>i ^-> E@r @U4r5i R$ fjUrrf5@i 5iFffFR ׭q0hHh@h h ܐh .h 5@ihf w~%UF>%HE>%AD>5 iUNq`q*fii f߉  -Fq* 5h 5h   4 4  i \7 2O  Ȉ  d  Eet b d  ZhZhZh-Z-Zw5 p5g5g&5o 5g$Fh~ |$} 5bg-o"} nngggg7 n އ>gngnng7 n Lnnn~nznpnrnjnUo 6 EoXnRnJnM% e M%H %z 78gg7 n7 m̳m 8̳~eefxetete le w`de7 eee7 ee,e(d5fddURn-\n*P 5eP 5e  Um  E mendw hdEm ʎ7 mLbt7 tDbt?b|tvUm ppc3d`Z`FR Pbaa d:b Z0b P%UF7%HE7%AD7}|c vc ̳aefa a aaw`a Baa7`aw aEaaaaaaZaaVac7 NaJaBRUBACKUPVOLr:58b fwbwrw^sT )6%|rKwnrwjrF+5a5a 5a5a >r\ 6r5@.rns9 r5@rXs9$r7Jb5a5xa\5ja\e Ui7i7 b7 b@q5i EtiqqTqqTw VE Zi7 __5@Ji ̵ 5`5@(i  R 7 __5`:5@i6_|_t_ :_ 7 x75] v t r p J_H___ %@ nU@hw w z5,`5&` 5@ fhvhrhh5 `"5`F8_^^(_5_ jCO>jNT:j , "h^^^^ F p w R$ w UgU j_g,^g(^7 gg'\6m7 m2mm.mmU`._F_ R  P  8N 7]2  P 7`]2 ] ݄l݁l@`  f  w^^^^[e^-^^ *|R f 0@Q^aU 6aFaU(a ălbY *E aE awXU@` *E@`w@ 5X\5XC5XkUX` ꄶXVFmD"HE"DA"UF,CO/,NT+ (U ta,@y    e-7 7 U 6awxwp".M  7 7 mW". e- -7 x-xnjWmhW\FW`@W P8 SYN B SY005E,E:TADATADATADATADATADATA` &IPP Version M01.02 (ANSI)IPP -- 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 foundOutput file directory not foundGet Command Line - I/O ErrorGet Command Line - Bad @ File NameGet Command Line - Max @ File Depth ExceededGet Command Line - Failed to Open @ FileSY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VAI/O Error Code %D.QI/O Error Code %D.:?TSYۡӡ 5- _  _0 b  f    w '`` ` ` ;,y"W(%vcncxd&7 .`7 ,`7 *`6 f & %1  11 1 1 11___ &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e 6 5  5*+5U5 5   BBCU% B  v $5 %aaaa 7 ^   ^RUfUhR&&^] R ]Е ȕ-ȕ       B͡QeB^5)E$ %& e e^UUΡ & ͡"e] e\^$% 5R ] ] СeH  --  ͡t] A & & & & f& & & ΝHB 4)  % *#U͡ 2P 2 Bw ]& LB&a  Z  W111 D K P] M ?  *] U%   ] vM !D  E e@P   \& SY&  \& SY& \ 5 %  x z\)^B  &j }   %v^n^ANDqASK>ASKN;ASKS=BEGINMCHAINNCLOSE@DATA4DECFDELAYVDISABLE5ENABLE6ENDJERASE?EXITKFORMXGOSUB3GOTO0IFzIFACTuIFDFoIFDISABLEDyIFENABLEDxIFFmIFINSsIFLOAvIFNACTtIFNDFnIFNINSrIFNLOAwIFTlINC9ONERRPOPENIOPENAGOPENRHORpPARSEAPAUSEOREADQRETURNSTRLENFSUCCESJSYDISK\SYMTYPESYSDEV]SYSID@SYSTEM?SYSUICcSYTYPmSYUNITDTICLPPXTICWIDYTIME`TIMOUT:TISPEDWTITYPEVTRUEOUICaVERSNnWARNINKABDEFIMNOPQRSTUXYZ<>(G KVb\ JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECZi 6\.\ 7"\ bhZw`Z&VZ7 PZ8  2Z5\.Z \LZN ߇5\\d # ` `cY\<]\8]\4]] #X  :}|Yw`Y7rYXX|Zd ~ *HYwe  8Y! 4Y ,    7AX X  . '  w;w00=EBSBg :! XX>'   x  <wT;! ?' \" " 4X:   ҕ  7X '  'WwW X  X X w2W ǠWd rWw*,VRWw* ,V2Wf|)W$W\2X.X f~ W7 WXXX X`  A5@E (/̋Vե>7W VV7r,7 VV79#7=7/7V7 Ww WmW7 Ww W~W-zW ҝQV@7%   F 7Q2V *VwW#A!RR@ Q5  D &ffE ̋E V V  w && D¥%  B&ХVA FQ C e~!  aehbE  Е%̥V A6D Ћ  AP AЕ Bf  & en6& eZ/& e(Q*AHŀ ȕ Е Е Е & e  & e Е A %& eA PP Е A EA EЕ A PA   $Е. P AЕ; ^    w 5 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f  f P aAAf@pnp C*8֋ &88*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ V ŀajTI& af* n*`V @e,w jjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@  DlljaCeH###33 & ` 8 *w  8jDl@ Z TeBT85l@ @( D `eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@w VD&& bЕ- eaePPPЕ-$w &D  &Е. ce ^ Е:   XBf&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0 Heeȵe ~  DE  ȵ2e &e T %&'@^e55@558Beeȵee& q1B$e q1 B  f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f eB  Dҁ CSĊ  WC E Cs Ε f)& 6 l(*00EE,E:TADATADATADATADATADATA  E 'W " =N  W :+W = 1 #W ,W / %W %W *Հ W <W [W >W ] v(* 6 e&f w  *8I *=)98  eB &&  U **e *Nlv ΋*.2  & #!)&eP(e && >e >E X p* w< w ) F8C 8* ) *w *    Dep p  އ#= EW9ť^*0 ` Ca C  = L  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  , J *` C#    D @)  6?0D)w ( D ` 8#"#)%ĥ ĥ wn 0 *0 @Q$    0 40 60))  L \# TU&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff  &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@))  *R*)@#0l C# 028 |00ĥۇAĥĊ  000 0 @0 &*0 @ u # eB&B <B  *  eBe>  # #D #=0/H#@&0 # = e0   D0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2w D n832cd& & & B  2OΕ   N Υ$Ε  22Υ   v Ε f Ve `* e*w@) *0,    ) b)(   =  l 0l  > 4/ e&=Ba@a e0b ee@ ` Y= E8 el0  & 0 l0`p l064p 4 ep )wV%  ,   N nw" B J B # r f  `* wr)0406 l0 (e(BA &(e(H0 (A f( (Af((AD&()&pDCe(e$fҕ[ ,ҕ, "ҕ]e(0 >E 5  e0Ґ &ff &  m  f A N  % 5 ߥ& *  + 23E Ew <   Е-   0@A lW e`fÊ    E 82e&( Z 0 0 0 80 B0 0 0 0)#0.0+1(e  %&p*w f( f)f )"(. = . B  E  (.8Ae f"( UCɗ&+(e$&% **(ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &00MEBSBgeB  8 :$&w *<S1   K U U@  f&" '&)'&&* *%0*ND   EU t  Xw *D  w w ( D  8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB  L \# U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff > &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@)) P *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ Du Z# eB&B |B ` * eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2w ) 8C $* ) *w~*  ep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  8 V *`)w  C# x   D @)  6?0D)w (DB C DBe ?D(e(e$2e (%[]%<>  1 >w ) $ * Lw46l0 *) l0, *) $ )*)0,40,6 w &  w   j  ,,  *e6p 4 b8  81416 & |   V 6 )  8   L**  DP5R RRR 141612epl2l0p Mw   f >5>Eu   f &* *> =00l&8el2 0 *w deE D` bl lrw   B eE"s    s-  CslM=f(& e %&&eH =&e0  U   E > >E=uf p  w ..8em,0l0!D0e6p 4.) &f   e) .  e6p 4 08*w=p!Օ^&   `@ ` B   & A @    8e2 w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C *;7#3w L *$ ':T U@% DD%][%><w`  w1  %,,:4 w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:00UEZE:TADATADATADATADATADATA  Ce L   &*w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ w BC "& @SY&*p0p210=E%0=wp(*e "f D CB.E 8  (**f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ =D  `p46 f 64/=  @) 0  8w( 46 8 De*wt &f D E/fC A B f&  BeA @0 (@0 a@eA  B0 AB  f  C @*,*1 U8UMw w B 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ >w.0,0, f 톇,, w      .% eB U5UU plp & NeՀ)*(e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DEe    *1  ˕03 "   ˔Ӕ ʥ75%& w t&Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@w p ) | fU %  BA `6p 4p`4 %60 4|| ,44J W W @e 4TITISYSYTISYSYSYSYSYOV>jp >00]EBSBg&$   .~%   ¥8¥9w ܄(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$w J' UD$BA &( U BQ Е*  w  ť ť 0B Aaaz   & & @( f  e ee e &3&f& v f& w ۦ&&E  Aw ڦ   j2*-  (@ep@ D  e  ` e      : R#R-w "  p. ʥ*4A8?8 +TR*DE*MC@'CL@'LO *LBER@DE : h0t:IND V9.0,NPR,FMS,MPL. Task built: + (,*SY[],,RSX11 ,SY&RSX-11M-PLUSF @   SYSYTISYSC    SYS$LOGIN:SY:SYʒʘʞ 8  b W ",<     n b'SY: ~ &00eEZE:TADATADATADATADATADATA՞ p p  p@",p8,p  e FF w|NO HELP AVAILABLEALPHABETIC REQUIREDNUMERIC REQUIREDALPHANUMERIC REQUIREDSIGNED NUMERIC REQUIREDNON-DISPLAYABLE CHARACTERFULL FIELD REQUIREDINPUT REQUIRED<)0[H[J[24B [J#5[K[B[24B[132C[[?3l[?3h#6[?5h[?5lDM '<% %0' r&(4$O[f&Mr&P%Q'R&S(&'AH&BN&C&D'f&,-^F n0 1 w p >EuB AeueOu%UU"wMe 5 %&  05 :ue  5  Aej~UU dBeXPCeL eVe 0 BCe~U   L L  >E  dBe$R~ D~ & 5*5% V  %P P  P f5` @A- 5 B5%B@mBAmBu  &   U 7 E~  50 \   h ` @ ~ R  u  :  X 5     c7[H[24B[132C[6n8[[c[? @ ɋ ;B  0 9 f e 0`  w %@mB     E~  w@0  ` Ce2`54 `  E@t0  t0 5 6U& t0 5NB& E% W @&  &D5@  $D  K se~ ~ e 4w D4 %56 9 (   h~fe &4~ L5 U5@  eP ~  E  ҁ B~4e• D`~ E5@  w KmB3eC-4  wB6 % RR D~ D~ 80 C2 4QA8B 5@  ` ` VD45@ +  b  &f  m ~ 8C~meI~ ~ 5!6̇U DE5`u-   t   4 z5@ & B2   nꆇZe B` . . 2@   @ B` 톇   ҋ  %UU  >u A ˥*  :0e L=  0  1 hL= x <  l  81@ "B8  5ZTC2 4 C@ xL=wd 2 l5C@  1e1 1  0 %<%%2W W C@& L=@0e r $@2"e $5@  0 &  L=eH~ l     4&@`  l  4  lw Z`ҔD~ &    .&@`  o Z r t w C`~ D~    eC~L=l f5@ &M @ P ;  B r 5 : @ w T J 2 L=6  w $  C~ D-6L=66  h  wB@ʢ    1w  l ^ w  b f #N :B` e~ 2 C6"    e a~ 0 e   00mEBSBg D4 R D-65@  5   E  C` \ w ” B  ~az 5@0!0:Aw , B5  4DV , 5B~mB`B~  ~5>5  ѥ ~eB'@ J~! X  e  @ f ~ z 5@  14575+5õ@ $ M N ."0  ;BC m õ\  f @   5  N .  E BVfP  %&!t-<%'%0'  <%4$#t-<. C@%'C@ &C@  wN e B ѥ. ~APBV1 2 UE U@E122A& `1e2s Q$ A5 W r&W ' W (5W 'f& h &5-5 r'm!WB< q~  ,& FB<C Q~f:  t-<0Am< ^5  5t-<5 5@  %6U Tt5  05  P @0uw $ 5@  25@ $L=%5@ & l 6 6vw F"5@  5@ L=6 6dw5@   Dx5@   $y 5@  z    B  | t-< R {w B> <t-< e ` J w B> <e ` $  >`  <  <  < <| <E Bm< 5#5A< C~ f: ( % R A<C~  H5 , 45 f: h  nU}~ `!~B-<d  F UUw b 5 Ue B` B`  JEf:fBAe*Bҥ ~ N5 U v%' BEAe ,  ~w f:Ae$  j ` X 5 0UC2 hEC@ 0w V  5E5 <e  U5<e`  B<wA Lu :u ; w f: 5  0E  &f@ D~ U  r- 5 :AT*C*9*N*X**F Am< U E6)5   4  eыAm> e$   AZa%z 09  -+ +- . Ѡ~ z lH   ~5 5  .(C2L=  5 f   F5 : uew %UU   ~U@  z %r&f& 5 :&M *; j  H X: `w * d1 0 C    e0 e0 ;= u- @e5 5 f@  B $      Bɋ W]W: mKɋ F&&p"eB& ֺ# ^*5WSWPWM Br 55 (f1A%& pp4e6 h' $%%b'  D 1  z 1  BrztA1d^w 0 *AHCCHeEfD & p4e6 ͇ ʇ%FuJ `Dw  E) B ",e$FFJ% ~4 C-C`AleC ",e%uDH UBE`JF R5H&    85"   @,e fe N,Nv v  1  EF 0 JEJ@JeJF  @J J F F5 H   e 00uEZE:TADATADATADATADATADATA &    b $B Pf&0 EBa & & ̋•v ` !A[$%././0: dE T4 U & BU E f& f& &f&f &  l& & & & & f& Ε(   0& & & & && f& Ε  <   <<9 & & & & & f& Ε  &f  w ѰB   f& & & & && f& Ε( `  ,& & & & f& f& Ε( f& &  ׭W1 w D 0 0,0w  >w ww 8   * x 4 6 "e6p 4&*&4&6= 64 wz%!64=5 2 6  l0 & Z46 ư64 :)0406 0 *0e6p 4 = wHNO HELP AVAILABLEALPHABETIC REQUIREDNUMERIC REQUIREDALPHANUMERIC REQUIREDSIGNED NUMERIC REQUIREDNON-DISPLAYABLE CHARACTERFULL FIELD REQUIREDINPUT REQUIRED [?2l \HJY7 KKBY7oYk %" r#$ 2$h&"!A$B$CL$D$P#Q%R#?&$M2$%NNR*z+ l.T^..Rw 0 EuB AeueOu%UU"wMe 5 %&  5 :ue  5  Aej~UU *BeXPCeL eVe 0 BCe~U    r E 6Be$R~ D~ & v@A- 5 B5-B@mBAmBu #   -  U   9 E~  50  P  w %@mB     $E~  w@0  ` Ce2`54 `  E@t0  t0 5 6U& t0 5NB& E% W @&  &D5@  $D  K se~ ~ e 4w D4 %56 9 (   n~fe &4~ R5 U5@  eP ~  E  ҁ B~:e• D`~ E5@  w KmB3eC-4  wB6 % RR D~ D~ 80 C2 4QA8B 5@  ` ` VD45@ +  b  &f  m ~ 8C~meI~ ~ 5!6̇U DE5`u-   t  < 4 z5@ & B2   nꆇ`e B`  . 2@   @ B` 톇   ҋ  %UU  Du A  ˥*  :0e L=  0  1 hL= x <  l  N1@ "B8  5pjC2 4 C@ xL=wd t l5C@  1e1 1 ~ 0 r#"r#Dt(4W W C@& @L=@0e  : @2"e 5@  F &  L=eH~ l     & C` L  00}EBSBgw x`ҔD~ >    & r b <w 0C`~ D~    eC~L=l 5w   e~@~ w   2 L=6 T w n ^ C~ D-6L=66  h  *wB@ʢ |   1w  l w  f #N :B` 0e~ v C6"    e a~ 0 e  z  D4 R D-65@  5   E  C`  w ” B  ~az 5@0!0:Aw v B5  DV , 5B~mB`B~  ~575 ѥ ~eB#@ P~ r e  "@ ~ 5@  f @ 5  < .  E BVfP  %L$!t-<%$%$  <%!#t-<. C@%%C@ &C@  wN e B ѥ. ~APBV1 2 UE U@E122A& `1e2G Q$ A5 W 2$W % W h&5W %&$ h L&5-5 r'm!WB< q~ ,& FB<C Q~f: v Rt-<0Am< 5 ~ 5t-<5 5@  %6U 0t5  05  P @ uw 5@  25@ $L=%5@ & l b6 6vw z ""5@  L5@ L=6 6@w5@   t x5@   y 5@  ~z     Xt t-< . {w B> <t-< e `  w R B> <e `   >`  <  <  < | <E PBm< 5#5A< C~ f:  % R A<C~ H5 , 45 f:  :U~}J `!~B-<0  UUw . 5 Ue B` B`  8Ef:fBAe*Bҥ ~ N5 U v%% BEAe ,  X~w f:Ae$  6 f " \5 0 UC2 * .Ew 4  5E5 <e  U5<e` b B<w> *u :u ; w f: 5  E   D~U  b2 5 :A'C6(9(NJ(X((6 Am< U E&f'5   4  eыAm> e$   AZa%z 09  -+ +- . Ѡ~ z l8   ~5 5  .(C2L=  5 f   F5 : uew %UU   nU@  2%2$&$ 5 :&C e de X: `w * d1 0 C    e0 e0 ;= u- @e5 5 f@  B       Bɋ W]W: mKɋ F&&p"eB& J# Ҹ*5WSWPWM* Br55 (f1A%& pp4e6 h' $%%b'  1  z 1  BrA1tnw 0 *AHCCHeEfD & p4e6 ͇ ʇ%FuJ `Dw  E) B ",e$FFJ00EZE:TADATADATADATADATADATA% ~4 C-C`AleC ",e%uDH UBE`JF R5H<&    85"   @,e fe N,Nv v  1  EF 0 JEJ@JeJF  @J J F F5 H   e  &    b $B f&x. EBa & & ̋•v ` !A[$%././0: dE T4 U & BU E f& f& &f&f &  l& & & & & f& Ε(   0& & & & && f& Ε  <   <<9 & & & & & f& Ε  &fB  w ѰB   f& & & & && f& Ε( `  ,& & & & f& f& Ε( f& &  ׭W1 w 0 0,0w  >w wlwX 8   *   4 6 e6p 4&*&4&6= Z64 wz%!64=5 .2 6  l0 & Z46 lɰ64 :)0406 0 *0e6p 4 = w T&:)uE@ %:a `u>MN[[e  D(e:(C(  5@5*6 T @2ȋ eT5 |N ) @   J 5 wL DC uw  E  @e:(w5 CD>%  6  ^p + 6k5e d ^ [U5@ D(  G "uɥ;5<5-Ԩ  5@ u5 Fɥ@5ub , H5w E 5 .@  @8jMABAe @&PPP@C&5 A  F88Ue " 8 "@0 *_%`AB wz@ 8u j  5 , ɥ/b J  1ECe, e   ' @%7U @ E $  , D(@e , 5@*@e,C& : l K ^s@w@&p > :9% %ȕp*f : xĂȕp* feBEETH EBe @Z5    *O 25W E5W sW s W ! W 8W >W EW W W W Ō $|e  eE @,&|4m    be?E? & f YBEGINENDInvalid answer or terminatorString length not in rangeValue not in range? [Y/N [S [OYNSMHENABLEDISABLEDATAGLOBALLOCALSYMBOLNumeric 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 default 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 symbol Undefined label .Data file error, Code Redefining symbol to different type Symbol type error @ Internal error, Please submit SPRFile attributes not availableLogical name translation error.EXIT without .END^0"LBTA  <SY>LLLL.ONERR COMMAN EQ=GE>=LE<=NE<>LT<GT> COMMAN COMMAN " " P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 Pausing. To continue type "" >ContinuingDelayingValue not in rangeMCR UNS MCR RES START CONTINUE '%DMOSRLZCXV.lζr|TRUEFALSE -- +-*/!&()#,4Rlƻ|,,,NSPSYSUSRi  -)4=@INDINI  *4>HR\fƊЊڊ &,6@JT^fpzċ΋؋ &08BNpxxQdsƁ{84S;" pp062ZZ L^ u~a!afa vLV Oqw<OqBx:Ayz}z8. &""b&0"bRBxzX4zyK#<}#d$&&0 zX""`w"Y<}@%w""Zb""wb""b#" a't b|~Şb8{~d*k~M*k~,*P[M ,!&r &zC;4z<@u~@P z6zF jLH _MN _M\X\ \XY V 'xx (  T[zd"a &Cy$z. Zx. ͮl̲\ˆ˘ˠX\hʒ|2vt:~nx͂DF=DL=XQ=GS=ST=CN=UI=J2n 2p FЮJ2n 2p ϼn p nt v r FФnt v r FвJ2n 2p nt v FЮJ2n jt v r FФFЮ2n FЮJ2n :t v FвJ2n :t v 2r ϼn p FЮJ2n 2p :t v Fв:t v Fв:t v FФjt v FЮJ2n 2p jt v FФFALLANYCLSCSHDATGETGSCLSTOPNPALPSCPUTRALRTNSHOSPFSPNTRM   "6Č֌ :DzČ΍΍XFMS Unable to initalize itselfFMS-11 does not support your terminal typeVT200 series terminal must be in VT100 mode for FMS-11Missing Required ParameterIllegal sub-functionVariable not found or of the wrong typeThe .NET command is not supported in this version of INDIRECTJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC">L\k|̄f~݄4Latͅ/M$Cc  00EZE:TADATADATADATADATADATA r4&x- x 5ex !7qx_v0 0  nE 7 Axw w@uww~u` w 5Tu xx 7xE8u L wxwnӥ.wXuA \פ:uM@uuuEw" uu=uw @u V.uz F.uhudu ~uZu rug .bu_ .ZRuNu*uT#u u@u7wEHt.;= "v r  u1v07v ,) ȥ|ȥ. ;w < 4Bu  v.@ VWw*vA*wwt 8ʥa ΥaE ʋŕŕ7,yw:v7Qv7Hv7Bv7?v7=v yv   0uB7 t & \׭tw, >ՇwTxw x-x5 wlf&fR AB |K5 uR 5 5xsaz & fft 6v  |% v(5 EuuE  5  K$Rꓷ4ptB vtnt7 ft`twtwrwrR JRts%ȥ -|s E nsUhs-ds5lr-%*ȥ &7rtVtBms @t +ww7=t  ȥYȥNcw*׭s 7 tvv v Gws ) ߆ &# 5Dsv.ҕ.  5$s lD.|s 7s evXv\v^s x5NsЃ $72v7/v7 (v7(v7%v7"v5rvs b [uu&  o7u @&wuru:c ,&w u]W Wwuݸru L + 7u %wuݔru = 7{u %A Ewfu  & *w[uwPu d BCu lw8u4u ¥S &u¥Mu¥H]rХ:]  Х:] qfqӕ*ӕ Х   fq "@& "׭q OtD@vtЕ ЕRЕ:Zt Е-Pt Qt&Е ЕDЕ:׭Dq0t -2qtP t  tЕ" PЕ"s5p7sЕ ЕTЕ:s E sPЕ]Е:Е PpN s E EЕ.7 m\mRm6pVmRmrsZm7 XmjsRmes_b\ !XA5sp)& +s"z'5l7!p l7 lX)7n lran  lra׭n 5m7o lwX&m R  um mm  !w ZJTn&.W;T +m Jӥ  C > l: :    n .&.#|n Tӥ   < l åaE Ѡɋ&  { y s&CBr Aƀ  .m|mbPl7 LlL 8#Yw@l 8D 4lQ m  P @   @   @ EPEE0U  L .  E U  ¥,  w %m:lkw 8 6 0G`lw l%%e @$k6k k  ` P jw!kA Vwfflwl rw!zl%wlB%>Blfl  Eޏ}x B0l ejl @ZP AЕ. Е:LlЕ<A &gA g  *lЕ>/j2Nl'j *j+ jl V kB l Dij j k  j|kj ki7 iw"bk Xhk Lkk0kwPk1 ~i*kzi|kmk%gkzi `5 Ri5Jimj   mj*i7 : n  i`@eBge$&ĝ*k e? g Ƈ7*hg j   ge, x>wZ@*< NGFF# @* :< (G3#gwf J!# V z g @f  < FeB > 4B*  4@ B f @ Bbf :  n` L ``t   ¥ ¥ ¥ ¥   Bʋҥ! B\fN Vd$Kfeևe  dUPc@ dd&dwz 3e` BJ  l    :    V>c --   [ nrc b28 L0 8 :03:c h H ab7 a 5 b` E`]~b`zbvbbы   7 .`U`w,b W7e`e7e|  &6E %IF  l ( |l. eeew@w         7dd&  ) >O&   F&   =&    f֋w & X_7U_ L_ G_:`fw:w.w:dd dd7d&  R  p Bڀ y  @:[ $/R ɕ@^ B8 08 & B`ɕ] ^B8 8 ( >+  7 ^5]U 7 j[]E[ы  ] (wvY^]]-@+% & &Y&?7]bw ]B` ]`j[`x[]-\ " 00`\`\`\`   n^]j^] p&& & & 2X ] NA %\T %[]\ @  & (-,T  ] & -T]] S 4 Sh]f]t]r] f  K[ 6Y4Y!C  ʕ !   7 [7 ^7 ^ w^ ^R w^w|^o7 t^ B!ȋ=Х! ^^X^P^ L^ F^<^6^   $^"^^ ^^ ,[7 ^[ &]] . %]] ]]-]Z m] ]  Z7 zZR 0wJZI   ,Z 6Z&& & & %Q%r%  @hX Uf Y  p w l ȥ#Ћ rSD T  S M H{ d & f&%JQ& ) \ "5@&Y " b 2 WW X dY^Y  wXCY:Y  X  w X6WC5 Z%WW& Y & & WW& & && & & & |  %JP%BP& )X "00EZE:TADATADATADATADATADATAwX,X wP lVBXxVtVZVVV`VZVTVZVTVNVe   X0&fR &"e"""VVUUW nWU U BTW-NW%e-6W P.WB`-(W  <`WB`-Wb&f ARB -fE fVwV ew!VVVmVV-VwV |T&6E %IFn P vV  lT0 0 W W DVbUw|  & #ȋ!ע:&ע0ע$עZעA ע9עaעzӋW RfE# ^U  w` bf DU  fE֭U+  'U5@SfUbU^UeXUUUU5 U5  7~U d A E5T fEwPU 6FU 0 #  ` T @ l PwU R¥;¥! J DR RTRREQT  !T w  ! wTwR ¥!w T7_T7TW7TT7 BW@T; S?f7 V7 V7 V7V0VB (Vȥa Ȉ և 6BE< C@_V?SwwSSRA:V N-VP V E d(V VЕ.R5 UU% #` R "  6  ӕ  6 JRU 7!vRpRwR7fRcUѕ    ѕ 7 4Uw 9RQwP wP  ՇU7UT Ld UUe 0T EtM M@ I`E3A >@7(Q7rQB u&fR Af f#5 5 ffP7P >  f% wPwPwPP L7 P!P PP~P rPND! -P-Pe& 7P7P7P .  * '~ 7 rP7nPhPbP<XP $KP $ wBP@P8P> V & ,& If   Iv   NK  ȥ/ȥ$ȥ. Хa flOmjO   J  R j%ʋ5MOOJO!fO.NewV0 RM( LM# BM&N RM JLM I  BNB M O(W;Nb NvN M M$M7NwMMh%  *ff& e w!6Mw!4MUU  ҋ ʋ ^N` JONe JNa ^ ^ 8& "  l@    \ G& "6>wN;w" N N@N 3 A N NPN ,NN#N{uwNw A ^5LL  7 NL ]w #& 0 J H y$09# 8wFN> # 0%eb 58F7J7J7J& 0ȥ.J¥0¥7" ¥9 ¥A¥Z¥a¥z5dH  uJ¥.¥$jJgJ 7`J XJ x ¥" NqBI : . @ B 2 8T ,RAEwIH 7I5?I< C D ( ¥!$ !C &CBE` 7 ID Ӄ C jI  C7\I w w 8IwJDw& & & & & & & 6e "& H & N "KH  7HFH  $|00EBSBg "F  4H "e  & ?DH"**E**G bX¥* &?P7G7G  DwGGG&eAG BG B: &Е, Е, Е,A E Е,GG wP ^5F6 å å  %J& & &&& & Ε 3 JF0%DF,ȥ_ 6 XA¥:tFÅE ffTF|Z w"6F& Е:Е,& Е,  F4U&& &\M | _΋<5^ Y55@dT '5 X Jg5Z W5t 5@u W5/5 5 LE:E w E w T@Е,fGE >[ȥ*HG  W .w6G)Х](  F!GD f7 D7G@, DD@bDD w^w ^C 0 3 ¥ ¥   w (7DF58DBCB@ R?&  |F & &p&f&& Ε  & &p&f&& Ε  5(F7 F>D@aJ  7wM7C 7CZ7%CCjuR RCC C|C 7 xCb@ f AbՁ E,C$C(UEGCBdAUBC&?7lA7hA7dAt: J >B&   :B w,A*AB wA =äUrBrB=Ô7fBRBNBB?(AB A@Bl@BU,B9%:%:EBb@ 7HB"C 7lB`D @8D@4D7HB5@L@L@F@>B@   7@ @ h Е    pʡ??1 `p" ??7?  7??? 7?`7?7p? ~Hd?7=7j?`7f?7R?N?7T?e7J?e$7>?e74?e7(?7= w`?: w`??? f 2ɥ@%& #> S fє1"# $ɥ. ѕ >є t%Z( CeE->->`>0 En CeE@> T 4>D|Z  > ȡB ʵu=Eʋ  $=w<ȇ w w, w"8 w^@[@ w  8   ff=& & Bf.AeJP Е,A ^8A xЕ,A lCeЕ,e  \A6 FЕ,Е,   xB~BBeʋ w ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f eB  Dҁ CSĊ 0 WC E Cs Ε f)& 6 l(*  E 'W " =N  W :+W = 1 #W ,W / %W %W *Հ W <W [W >W ] v(* 6 e (eeȵe ~  DE  ȵ2e &e  %&'@^e55@558Beeȵee& q1B$e q1 B  5  5 2  UE E U 5@*& E& & f&ËDef Ë )̋U 5 ߥ& *  + 23E Ew 4   Е-   0@A DW e`fÊ    E &  m  f A N  %w eE D` bl lrw \  B eE"s    s-  Csl&f w T *8I D*=)98  eB &&  U **e *Nlv ΋*.2 F & #!)&eP(e 00EBSBg&& >e >E p* ww 2 wpw " wfw  w^w  (DB C DBe ?D(e(e$2e (%[]%<>  1 >w r d) 8C $* ) *w *  Nep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  8 V *`)w C# t   D @)  6?0D)w  ) B* w 46l0w ( D 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB L \# X U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff " &*wj. nB5(8e$8w2A&(e L4p8q  (#5=A#@)) z *R*)@#0l C# 028 00ĥۇAĥĊ  000  0 @0 &*0 @ u # eB&B @ B J* t eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w|/!0/ l0/!p!0 .=p0p2eB  8  $&w ^*<S1   K U U@  pf&" '&)'&&* *%0*ND  R EU   &  f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ w   n832cd& & & B  2OΕ   N Υ$Ε  22Υ   v Ε f e > * e*w@)0,    D) )(   =  l 0l   0/ e&=Ba@a :e0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  ,  hw>  JwB # x f  `* w)0406 l0 &ff (e(BA &(e(H0 (A f( (Af((AD&()&pDCe(e$fҕ[ ,ҕ, "ҕ]e(0 >E 5  e0Ґ &   `@ ` B   & A @    82e&( l0 0 0 80 B0 0 0 0)#0.0+1(e  %&p*w f( f)f )"(.  = . B  E (.8Ae f"( UCɗ&+(e$&% **w 6 w ,& W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C (ef00EZE:TADATADATADATADATADATA  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &   f 4 >5>Eu <  w lBC "& @SY&*p0p210=E%0=w(*e "f D CB.E *) l0, *) $ )*)0,40,6 e6p 4 8  81416 P p  J * 8  **  DP5R RRR =D j `p46 f 64/=  @) 0  8w 46 8 e*wR > =00l&8el2 0 *141612epl2l0p Mw f &* *M=f(& e %&&eH =&e0  tU   E > >E=uf Tp  w2*;7#3w ^ *$ ':T U@% DD%][%><w   wn1  %,,:4 w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce    Z*w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce Re%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` 2*weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ  ..8em,0l0!D0e6p 4.) &f T be) .  e6p 4 n08*w=p!Օ^8e2 ,*1 @U8UMwL w TB 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ wzw  ) j @ fU P%  BA `6p 4p`4 %60 40,0, f 톇,, w      .% eB U5UU r plp & NeՀ)*(e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DEe    *1  ˕03 "   ˔Ӕ ʥ75%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@00EBSBg|,{{ W 2B  yTITISYSYSYTISYSYOVXB j0'( TITIDRDRDRTIDRDRDRh{o)X|X & & @( &f  e ee e 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 |.f, @fef 8w` ew  @fef w`ewef 6 e      w  B 5 - 5(@7ldfh(d"ZV R D & 5Af@ !* 7 w  N   @m 7  .7    rz z r f`ff |T V 7 V N 8 0 7 (( 7  Nf 0w e w&  5  `˵c5˵ x@ @@*   \w %58 @`1 f $ N V 8   f-00EZE:TADATADATADATADATADATA 2 t^  5L   >5. :5" 65 25  5 "~p &    e7 .5  & "  D  %5 7 "   Z   0% wf@m 7 @eE& j  >w`  p`wv   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  & `&  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`& d e  e  o e 7 f 5)eEef w` H0 0 e w> e xe m~`~ex reEmf7b8b-R.D& `& H e  e  e eEm7e 7 f d5~(eEef tw`~xv` 0 e f> rze m`H7 :7 h $ za?   P LD@@e fe?E?@m" & f 6Y w` X @    W  W W | de R   `w f v C W!W! mDm  D!  -m W!p  ,%w    %w eEm" 7  b m 7 - 0 $   w w А ` -  wF R  R eEB K  `wl w l wf X  a >>!ZJ"l!x!!!!$O!RRR' f RPT>fz"L Z" R"r" !j"  ERLCFLError at line '&1 x4J: x40; x4`; x4r; x4< x4< x4< x4$= x4> x4V? x4VA x4BD x4LF |4L t455ew : , Bv     5Bw$ #/''5  5 2  UE  l4"" 0('"j4E U 5@*& E& & f&ËDef Ë )̋U 5 ߥ& *  + 23E Ew    Е-   0@A DW e`fÊ    E &  m  f A N  %&f w | H) 8C $* ) *wv*  2ep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  8 V *`)wp C# t   D @)  6?0D)w  n83200EZE:TADATADATADATADATADATAcd& & & B  2OΕ   N Υ$Ε  22Υ   v Ε f e p* e*wt@)0,    ) N)(   =  l 0l   0/ e&=Ba@a e0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  ,   w>  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Հ)*8Ae f"( UCɗ&+(e$&% 0+1(e  %&p*w f( f)f 5x445<l44:5=4l44Yr|44ZrT44[r44\54l4x4]5l44e544ixt4l4ixt44lxt44pxt45txt44w 85m&&  X6e"-  C P e   e f6   f6   w &5 funhj uhdB$ 0jwaw< 8 v8w &  z1*AdBbAep& f  N1 P aAAf@pnp C*8֋ 188*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ #ŀajTI& af* n*`V @e,w Jjjlj ɥ@@aujk,bp 5f fˇ ȕ 8 ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ "DlljaCeH###33 & /8 *7x7w  8jDl@ .TeBT85l@ ""@( D ,#eB& ( & @# #& V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ ("wˀ   J 7 pDM  '  (7*,ܖ%:42 weB$& &e*aɋw "wɋ& 00EBSBg@   f 1 4@5 `7 ہl  <z<r7 x7 p7 n7 f7 \ۇwzʂ m 7 F߀ :w2 .߷,7 (߀ ]7߷߷߷ ߷߇w, Ԝ\Ԝ]^ ԕ:;& )@&f& H FJ <L 2  ԕ.N   ԕ;P 4e7݇whɀ @   B  * 1 ,7 هf   `p  JfЕ Е f& eew d|xxf e` wnȀ    A @ (*B`ʋ @ f(ʋ ·fw7 O   OOOOOOOOOOOO& 8 0e87 H0 0 7 @6( d& T D7 7 7 7 |FzBR>R:R67 4ef faO e n 7 #&fO p 7w5f B e w"~ezf   @ = , @7> :ޣ xw$޷"w ḃwCm5Cm݂  f ( ~ > f >~ wRe G @ 0 9 A Z _ a z . : ;ރ [   W] "   W" , =  h˷@f5$ O x  4 n׭/   55%%wpf0`!5 SW aW z@ ##W ' ! ʓ'W W  !   f˕  f؇wf؀`   f  O L E f&ff& &e 醦 w ADeff  W. N  5 W= W  ! W0!W9 ! B0  `%aW' @ CА '!W'@ &f eWTWF& d   D wH$ef  W   w @ 0 9  A Z _   wՂW   z@fa a P& O e  .ea a& & PƁe $G 7`w S 7`w e  e& aa : efO e  b& aa  >fO e  eeef p 4  $   4f PP  P 3 0K оe$f @5X, a a & O e  e  e5 .5 5M &  aa f =&O Be *e@e E@b   nevf 8 6e Fe ewLe @/b7 NP D`N 8 @eE@`C $P Ne  e    w* e7 w57 2P  @ 8 xern-j|@ Z`p7`l feEmZ7V&  Fv Be eE` f j%х   7!7&΀  70p0 I wܼ de eE`@  ^ wRЁ 5D2 ,P `N> ,P N  m*   f,P (e   b 1 1 D mee ҃ f  E@`ewແ5~3,P N ξ,P   mh  ,P j ,P ZLe N Ծ 6f   %ɐ 1 C m΀@`w6 5w-ξ7 NP00EZE:TADATADATADATADATADATA ̽ R Jw!w,P AaN   vvaB eE` wd.P ^` T @ P eE`ePC (  ,P  D ",P P ּN` P ¼ W  PP H  N`  B  N`    f e &N` l  &  Pf e b w w: x p w57 T » H @S (  $N   ~ N ,P hN  7 ^T J л Ȼ0T 2V \ NT 82 @ tT  ( x pT ںR  X PT NR  4T 6 ̺  &-RU xR   ,U TЀ  z ʺLU 4  T nU  ڶ . ~ef e6"e@4O 0O #O-: 19SY:.CNFSY:.SYMSY:.ICFSY:.LSTCFL>Option>/OPLITERALBORSX-11 CFL-16 V2.00PageGroup Symbol    Offset Uses Group Symbols" Group Literals Type Length ValueNUMERICSTRINGASCIIRSXTIMVMSTIMPOINTERLOGICALrPzPPPPPP '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 PQ@Q\QxQQQQQQRR8RRRvR R R R RRR SS4SPSnSSAllocation 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 4xt 4x 4y ~4yf&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f eB  Dҁ CSĊ  WC E Cs Ε f)& 6 l(*  E 'W " =N  W :+W = 1 #W ,W / %W %W *Հ W <W 00EBSBg[W >W ] v(* 6 ew *8I *=)98 h eB &&  U Z؉**e *Nlv ΋*.2  & #!)&eP(e && >e >E ׆p* @ ww (DB C DBe ?D(e(e$2e (%[]%<>  V 1 >w ( D b 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB L \# l U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff   &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@)) *R*)@#0l C# 028 R00ĥۇAĥĊ  000 0 @0 &*0 @ 4u J# eB&B TB 8 * eBe>  # #D #=0/H#@&0 # = e0   t0@e 6=#02/002# @#?@#040 6w</!0/ l0/!p!0 .=p0p2eB  8 6$&w *<S1   K U U@  f&" '&)'&&* *%0*ND   EU  *  w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce @   ~*w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` |*weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ (e(BA &(e(H0 (A f( (Af((AD&()&pDCe(e$fҕ[ ,ҕ, "ҕ]e(0 >E 5  e0Ґ w www $0,0wL 46  )0406 0 *82e&( h0 0 0 80 B0 0 0 0)#0.)"(. = . B  E (.f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ w @*D $  w8w " l) * w:46l0 Mw   f >5>Eu ˁ  f &* *w hBC "& @SY&*p0p210=E%0=wJ(*e "f D CB.Ew 6eE D` bl lrw   B eE"s    s-  CslM=f(& e %&&eH =&e0  U   E > >E=uf p  w(ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε00FZE:TADATADATADATADATADATA lle  &*;7#3w *$ ':T U@% DD%][%><w  w 1  %,,:4 5%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@ 8   * p 4 6 e6p 4&*&4&6= b64 wz%!64=5 62 6  l0 & Z46 İ64 :)0406 0 *0e6p 4 = =D `p46 Rf 664/=  @) 0  8w f46 8 je*w w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C (e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ z  BDEe    *1  ˕03 "   ˔Ӕ ʥ7w  ) Z fU j…%  BA `6p 4p`4 %60 4f)aa& & Ձ ?N  w( W  ׭ 5V(7 %5H!7 rr X ` D~<  X FN  %~ew8   d   l X  e& Ύ|  e J؇ 8ddbbC   4 { lr,?(wb$ yH  tu. Zk e " 9|~Bl ɕ 1  0M ɕ- ɕ$ ɕɕɕ T@`w@  .1 ɕwe  Վwɕ ɕ@`ȕȕɕɕ ɕ > w> RebHɕ ?? ɕ ɕwɕ .1 Nwwɕɕ 1 CS 8 V wxɕ  *1 wzɕ 4wb ^ɕ zw4qɕ Vw  +ɕɕɕɕ ɕ! p dɕ" w8 2wT8 f& wl\qRw7 *7 ( $և7 ܇7 ܇54  XU  w b ! N  $wwP-T wwy  w|yw~00 FBSBgwL|wdڇ z $0!"   dY#""\ ·&  ew wb&  V N d l)& Npr/D)l H4۰ 2{ & $ <4e 57 ۇ ҇5 .5D 5f& ` $ # D 5L 6  $Ne Ӗ%% , &'(5T D x >8P v f2( fe RN p p 3e |tY& e 0$efS Z t x  GlzYz$ $ N^$fT  4N*َ dN 0 ee  Ueև  V   W  ևwāw 5@B  eeeb&  - @ <ˎ& NrNb і% :   ذ ef ց wE 05 8˖%0 wׅW!  - -Հ 7E~lhh V^p05J5@ .X N 5e ҁ ,@ E TN e 5 !!   waԖ%f5< ` D Rr L >Z J"5N f N %w>5nւ   0 @ l~Y lY >@` lYȕȕȕ@` lYȕ ȕ ȕȕ(ȕ@` lYȕȕȕȕPȕ  ȇ-Ԩ5&  te-| *0 7 7ԇ-Ԩ /* -z| ~hdԈ0 7 T7Nԇ-FԨ J/6*  X/** .-Ԣ5J  d7 h 7Dh 7Jh 7\h 7R7 D7 F7 7 4 w2)     00FZE:TADATADATADATADATADATA^ ~ 5wR6 7Q7 -1  B:Y A ´  B`7"0%W0.W9+- -W'  -tׯ'" pP $ ̻FLUSHKEEPRSCOMMANDERRORINPUTOUTPUTREPORTUSERSS S&S.S6SCLEARDELETEFIRSTLOADMOVENEXTPREVIOUSRESETVS\SdS jS pS vS |S SCND$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$STRINGSSS S!S"S#S$S%T&T'T(&T)2T*@T0HT1TT2`T3hT4tT5~T6T7T@TATBTCTDTPTQTRTSUT UUU` Ua,Ub:UcDUpNUqZUfUpUUUUUUUUUUVVV V*V8VDVNVZVjVxVVVVVVVVV  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  00FBSBg,/>\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_S00%FZE:TADATADATADATADATADATATOP WRITE_PACKET RSX_LONGWORD DYNAMIC_TABLEstring-literalnumeric-literalliiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiij jjjj"j(j.j4j:j@jFjLjRjXj^jdjjjpjvj|jjjjjjjjjjjjjjjjjjk kkk"k*k2k:kBkJkRkZkbkjkrkzkkkkkkkkkkkkkkklll$l.l8lBlLlVl`lllxlllllllllllmmm*m8mHmXm,:N[dnty}   #%*+++06>?BDFJOOSSX]bddflptwz|             "$&(**,.022468::<>@BDDGGGGGIMRRRSSTVWXXXY[[[]___acccccfffffffiitג =°†yuuȔȔPPɤně.Rdv{ssfцg$3Ȥnwنٛ۲ țʷʷɞ .: Rd=ݨ:  :  Ƹ肙͍̄̄̄̄̄̄̄̊ j4r b4r Z4s R4r J4 v B4xt :4y 25xtw    lJt 1     8f N& `e ptht  e&       pf&& ewB dEe0 9e Ҁ e0 9e %     v  &&,Z<` Ƴ4xt 4x 4yw r  l"t <BCwL  42- n @`eBwa     Be&& ` le0  l&t 䘇  F Hf f& e  (. 4 v 4lu 4xw0)@  ls V  C @6 s1/5 \1      @D C  QP  f ne  d& \  > %ABCDEFHJKLMNPRSTUV 4f Ev5 &! V& T 7  " 5 N ӎ  Unimplemented error message-F- 45 45 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 one00-FBSBg 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 constant expression.:FUNWRONGC, Incorrect number of arguments in function call.X>>>0?p???4@v@@@&AhAAA&BLBrBBBC2CbC F<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.;BITTOOH005FZE:TADATADATADATADATADATAIG, 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.556X66667*7f7778F8888989t999>:z::::B;r;;;<w@0y 7X   l>yt   eNPT-N7 H*C>5L  f *  & ̏%&0yNm>  e7600w lLy@T ~f  f& ~ePJy&  a \ R@ !\ e `&&E ތf a Tef * f ew( a-d - m? ;&( ԍ / D!0!9"!A!Z@!a!z`!$ !.!  a %    BewJ \y&  a Њa$&6   -v    +  l he ( !0!90 !A!Z7v l " D  5 @P P P H  f PewH  l ̓     0W l & @`% . &2f@ lz 1 & \* x W  f > f f z  f ff J w& *   m  `f ew ҟ a&  vA`f f&& f& :ew& -` n h R`  @!L Ж 5f @%f e m&E&  ԝewz&  a v$          m"'  a@`Em$@ m*&fE& be e &a &ew-  6 0   lz55  5`  f w؎   &af   , ,,"  e ! \B` PD` D  ҋ  D ыR     l{D        f ›ewލ)W W W z00=FBSBgz f 6  Gl{@A P@A P@A P@A H@  @TTTR@BDQBDQBDQBBQ  6 v       Z W R Obu u u lu u lu l  - <Lz ,@- @ D V4.- @ tMDC   f %  N&&N e$ ewzf (M u u u -# Rff e w C  S   R BJJJJJJRBXXXXXX` "(&2`$bwf  B m `B l{B` ɵW e<QBaCa 5  @< &Da @ D @ D E& NUe& NU D a"K `@#  { $ew C` 5 5  (5 5 5 f l@e # -  @  0  :    5!Jפ-G`!B{Ba JȢe{ {&A#{B eפ-  ll d 5WW d5!!ע פ: F5<! ע פ:  (5< fפ  f  0W   @`%wf= ҜP eff 111f lewraf  `E{ eKkW"  aD{ E{ N eQʐN  mm Jʵ : @`C{ Ð r2 aa a T < 2< 2e  f  .{ e p  : \ \ Nw af * Bai*Cava>  5 ~ K J    D ewj     f L  `ѕ- ae{ѕ-ѕ1ѕ9 4 ѕ  ѕ: ѕ: e e/ѐe:w & * wZ   M u @ A -#  w2   @M u u u @ A B - #  wf   E D @ A s     u&@eH p p eH p eH cQ<[y1OJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw  lw x 65 awf ta H6  .C "  S   8   8 v``W  hf N&f` b |et n   |  `; `D d  L N`f& e J7B 2 Z B`  &f e ޜ   Bԗ a z %ew)& & - v6v`    nv6v` j  RE`D`  ڕ D!"6  # D!     He wЎ   ʛ  @C`B` 6   $ - . 0 ; A Z _ a zۃ [ פ] " פ" @  ^% 28R r &x4500EFZE:TADATADATADATADATADATA|(,p$ W cTITISYSYSYCLOV~d0~Z4V6|0d005.03  6 " " " "5@d5\ D "5LR T5t ^n E@7 :7\w`"   ?z7v j7dpbeBe RRRRRRRRRRw 4 E DW!d! E8 V` ~! $xP A x& & &  f&& & & Ε )!%F>6 4v 4 3 w 5 * ` w@,Arw 3&flj &5  HBBl D`7 1,1,7&&672beBe 22,5 b,# 6`  25b.f&%67~5    & : 4`    B2BSYSYSYSYTICL&3 w 0 ť ť 0B h0Aaw 0' UD$BA :H&( U BQ H9Е*  & & @( /f  e ee e ' FTB>P=Oo+[.Lh@]| " < S !A!v!!!!!*"d""""#R#### ^SY    6 DA2 LB 2 R H X xQSY dj v SPABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw +&& D¥%  B&ХVA C ed!  aeNbE  Е%̥V A600MFBSBgD Ћ  AP AЕ Bf 3 & e36& e3/& e"*AHŀ ȕ Е Е Е & eV3 & eB3Е A %& e3A Е A EA EЕ A A   $Е.  AЕ; 2    w d45 funhj uhdB$ 0jwaw< 8 v8w &  5*AdBbAep& f  ^5 P aAAf@pnp 9C*8֋ 588*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ N(ŀajTI& af* n*`V @e,w 2jjlj ɥ@@aujk,bp @5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ 'DlljaCeH###33 & 4/8 *w J1 8jDl@ ./TeBT85l@ x&@( D 'eB& 1 & @# z2& V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@w N%D&& bЕ- eaeePPPЕ-$w %D  &Е. ce $ Е:   -BSY6TDAPEAPFP@PMMPCPPFTB -- *DIAG*-Illegal Get Command Line error codeCommand syntax error%N%VARequired input file missingIllegal switch%N%VANo dy00UFZE:TADATADATADATADATADATAnamic storage availableIllegal error severity code %P %P %PCommand I/O errorIndirect file open failure%N%VAIndirect comand syntax error%N%VAIndirect file depth exceeded%N%VAI/O error on input file %XOpen failure on file %XFile %X has illegal formatModule %2R multiply defines P-section %2RModule %2R multiply defines XFR addr in seg %2RModule %2R illegally defines XFR addr %2R %PP-section %2R has overflowedModule %2R ambiguously defines symbol %2R%2NModule %2R multiply defines symbol %2RSegment %2R has address overflow: Allocation deletedAllocation failure on file %XI/O error on output file %XLoad addr out of range in module %2RTruncation error in module %2R%D undefined symbols file %XInvalid keyword identifier%N%VAOption syntax error%N%VAToo many parameters%N%VAIllegal multiple parameter sets%N%VAInsufficient parameters%N%VATask has illegal memory limitsIllegal logical unit number%N%VAIllegal number of logical units%N%VAIllegal number of active fields specified%N%VAIllegal filename%N%VAIllegal device/volume%N%VALookup failure on file %XIllegal directory%N%VAIncompatable reference to library P-section %2R%2NResident library memory allocation conflict%2N%VA%2NLookup failure resident library file - %X%2NIllegal partition/common block specified%2N%VA%2NNo memory available for library %2R%2NPIC libraries may not reference other libraries%N%VAIllegal APR reservation%N%VAI/O error library image file%n%VARequired partition not specified%2NIllegal PAR reservation%N%VAComplex relocation error-divide by zero: Module %2RResident library has incorrect address alignment%2N%VA%2NPartition %2R has illegal memory limits%2NInvalid partition/common block specified%2N%VA%2NTask requires too many window blocks%2NLibrary references overlaid library%2N%VA%2NResident library mapped array allocation too large%2N%VA%2NInvalid reference to mapped array by module%2R%2NSymbol %2R not found for patch %NLibrary not built as a supervisor mode library%N%VA%2NSupervisor-mode library reference error%N%VA%2NFTB -- *FATAL*-'&1 &[n\ [_ [[ [2f [q5ew @, Bv     5Bw f&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 e00]FBSBgf*4\55  5 2  UE [$ n66f$[E U 5@*& E& & f&ËDef Ë )̋U&  m  f A N  %&f w *8I *=)98 H eB &&  U : **e *Nlv ΋*.2  & #!)&eP(e && >e >E p* 0w w v (DB C DBe ?D(e(e$2e (%[]%<>  & 1 >w  f) 8C 8* ) *w* v   ep p  އ#= EW9ť^*0 ` Ca C  = L  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  , J *` @C# v   D @)  6?0D)w v( D 8#"#)%ĥ ĥ wn 0 *0 @Q$    0 40 60)) r L \#00eFZE:TADATADATADATADATADATA U&* =w `p!2 EW!p0p2 ׇ#( P) p@#**fff  :&*wj. nB5(8e$8w2A&(e $4p8q  (#5=A#@)) *R*)@#0l C# 028 00ĥۇAĥĊ  000 r0 @0 &*0 @ u # eB&B B J* t eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2w 0 T) * w"46l0 5 ߥ& *  + 23E Ew    Е-   0@A W e`fÊ    E 82e&( D 0 0 0 80 B0 0 0 0)#0.0+1(e  %&p*w f( f)f )"(. = . B  E h (.8Ae f"( UCɗ&+(e$&% &ff **f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ eB  8 $&w 8*<S1   K U U@  f&"  '&)'&&* *%0*ND  h EU R p  6w n*D J  w^w P( D 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB r L \# U&* =w `p!2 EW!p0p2 ׇ#( P) D@#**fff f &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@)) x *R*)@#0l C# 028 00ĥۇAĥĊ  000 F0 @0 &*0 @ u # eB&B B  * H eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6wl/!0/ l0/!p!0 .=p0p2w  j ) 8C $* ) *w*  ep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  8 V *`)w  C#    D @)  6?0D) *) l0, *) $ )*)0,40,6 w 4 X  w8 x  | l ,,  *e6p 4 b8 b 81416    )  8   ~**  DP5R RRR 141612epl2l0p Mw   f 00mFBSBg>5>Eu   f &* *> =00l&8el2 0 *w  >E=uf p  w=D * `p46 f 64/=  ~ @) 0  8w 46 8 2e*wb &   `@ ` B   & A @    8e2 ..8em,0l0!D0e6p 4.) &f p 8 Fe) .  e6p 4 08*w=p!Օ^(ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w *$ ':T U@% DD%][%><wx  w1  %,,:4 w 4*D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce d   &*w D*  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ w 0BC "& @SY&*p0p210=E%0=w(*e "f D CB.E 8  **w b w X& W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C  &f D E/fC A zB f&  bBeA @0 p (@0 ^a@eA  B0 FAB  0f  C @*,*1 U8UMw wP B 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ ww  )  fU %  BA `6p 4p`4 %60 40,0, f 톇,, w 6     .% eB U5UU plp & NeՀ)*(e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DEe    *1  ˕03 "   ˔Ӕ ʥ75%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@ [[[.[([[9[,[[P[ [[00uFZE:TADATADATADATADATADATA_]\_\V\]\_\ d\ODT.OBJLB[1,1]SYSLIB.OLBw < pwH[ `^[  $Ul[  U@P2bt7 n  w| $0 b 7H7J d ʬ 9` Bн5b>\ J\&$p$ p$ bw`9w  ~[ r:bL[ 7采eB$&5 b\<w  H 9` ,\NL0a BAbpd Ffwh` ҥ/ ʥ -ʥ*ʥ/$]`¥¥¥ ¥ ¥ef ԣU~Ј^?^& & AmRtFj 7 <7 "7 7 r7 JH7 lh  w1 F 7 ^ZX P   7 ¦7 ¦$֦$ҦЦ 7 7 Z0 b0 bhRbͫeA_w hHV7 >:$7 7 7 J7 H?:6d5b  J nwf:` HB X` e5إvn̤ p7 ¤ ^ȥ;"n ¥=7e)mt#t-e !n87  ȋ-ȥ;*E"n p l   ¥,¥! ¥;¥: 5 ( !] T"n &  ¥;¥!ww vw l , r7"7,97EX03"3,'5@5E-    B`   E  A ܡ$΋ v pp@Up 71$p B w @pdf \5 b B$ĵ4ĵ!%'% %E$e@ P  7e :e 8e & ĵ V 11@ Be R AZ    4DJȋ*& ȥ+ȥ-  U w f  u  u  ¥ ¥ ȥ ȥ  ?_?=7\b,zmt  % V 1X,5<(54$ @F5ԡ  =  wQ ޝ 5% 5r5cc=`pՀc 7c cقmc 2cc  & & X*5@td5te  N N65- 5 J!tDeJH 5  c Bc.     c w Fw@ :pp5z5 5@U@p` p`|eddd A 5z VE B B B B   c ŒcJ7be j76f SYBe 6feB e  yB,D.& C! U@5:    wp <D΢# \b V c5KUUҞ5U5ƞU@Q$@P  5U@  e)w 7 w  w eB$&wROOniRWNniSVOniPnB .ll  &• H   ; w ; !,:& u@5e, RNOWE 5& , ! [ ]   )@ 55 ,.@ i `iȕf \5 5@ ]wl $w w^ -ЋSVw ˄(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA REAa$f& &f& v 8cjc8c8c8c8c8c8c8c8cxc>c00}FBSBg8cxc>c>ci:j8ci:j8cZjZjjj8cj8cxc8cLB[1,1]wԘz@$  7"87$d7\  e ?7 PAPАP 0we)$A  6 Bppp p27b\@ ; :$5?15?-B B B @5& $= 5 5  wؘw֘wD(@Rw2Ƙw wwww#6W#w1 ]w̔&kl?  k$l#LwkzlQkxl:dkl%SkRmjLpkRm[q%lRm[qjLlRmzjL lLm[qzlLmyxlVm;}Dl^mylhm/^n Enter Options: FTB> eeȵe ~  DE  ȵ2e &e  %&'@^e55@558Beeȵee& q1B$e q1 B  w wۇw ww zwΈdE 7Bedw2w 5td 6 ܨ7:5  4 |  (Zd,*8d4 7  d7e e? m "f&$E%$| 7 dEI- q- b- *.J- r- @ C` EP" ,eB  X47 :     w`  v n  IP @mLw J>JBm4, 4 $ edB & f& & d& Td& Ε )` wģ^d0 0^d&    f2  ,w`dR ^dB1  _"_F_b`d``j_c.c2cbd44!1`w,   Bµ µ fd5 TF &8 2^dppp p  & ңB 2,2,1&LEE\d  eB  7% 25r%F 6 l5R \dڹֹ\d wCœ5.5µ tl 55U5 EE  l Pw'55 5  >^ wZd wN r z|pN d-\\d >L55 55e   5 71$p   ַ&   "55 5Ո P 5PHww C5%  H ! &$J   .C %p`$  p ݃; vp p5  :  . & 4ww 07ڠ sN0 t00FZE:TADATADATADATADATADATA00FBSBg00FZE:TADATADATADATADATADATAw 5%BE@& ŀ05  e5ĩ#w 0# ` E  R7r7lЕ \\w f5f \  df c 0e d %5Ԧw  ЦwHȦwJĦ77(7 ޥmx" Ԣ77\=] Х e>7z7`tlH` %P  V E4 L em,@7e 7`e5b $5bemN    %,  ]Хʥڥ]m mܤ  %5b@7D uCD5Ee(]B X e(]EE@Ce% &%([q  Ceu7 %CD5Efe(]m   j` TEC ” e$]T  8? d*uCD5EB r (]  (_& && & (]& ,_& Ε )$ܸ`w<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 & B7 b (b :=b (eecw w  bHb   ab  m md1c 5X  b Pc r%b 2%b c zE$ bRRJJ  b m,m(c *  eBRRR R R bx ܥxp J`  bw ZSc $E%$wFwBb -XTPSc  b RRJcwXw v - % U%@eA zD A R ^pp0 ,e U%u !  rD   ?7 e be@5e5e,e"7: l e .vD  " P  aU%ve =    }l=l ~{pne    7Բm7 7h !m  00FBSBg8_2% r%  `lmXaa  H ! JHPP A ^w   %% xh mhh8iXjhdm5@JhT ~h ֚ ~h 55Z5Rw5Ԝ@. lm7 `w kgw K_mPAQ  `RRRRRRRRRRRRRRRR w `RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR w|VL B J Bm4J wN@  ww<5 @7  Dm  jw w| mjjjjjjpkkkj mjk kkk @@lm9 R8 @@- :) . (    & @@e   AA@`(o50.o5 &fe I rw AA@`7@ lmΙ7m jҮm w\)0@   k wlll8l>l&l4l,l l"lll m mllll d. J J D(Db@T"m  H   6  J    w    @ jeA @ : @@@`"  %wT dF Ж @mx  ޭ` > 0   @ m2A @lhQQQQ~h  p`x5@ ,@w H5D  <q PE&mjee@  @m  0fE w 0%7 | f` ҋd  ` pnA0B ʋʵ#ʵ"bn4e6 (hnvq <  7 H w >w :, w 0w ,$m ew쒦f& BUE m pn@  7@ew 7 $7+wɵ#ɵ"wtpbn4e6 (hnvq ( ɕ m %Zn4e6 (^n0  < )63 wɋ w 89f"e\e!e 5f B2* eA . 5 t ćw 5@    $5l?E;C $  $ m Kl l 0 U5 %J%` 4 <` ( 5@Ē ^ `  Al m w mz $@ 7 7覡 e7    ޏ h3 3 N333  E@ (33 53 @` D`D@D& ҍE&|&  f&&  e#e|& f&&G& & & & && '&&f& P(f(*f*,f,.f.$]$]] ]]]"*_*_ p<]:]]l']]]]v\"]  ] 2_(_0_]p4_<VNTI\~TI\CL VNSYVNSY[gNSY[hNSY@GVhjTCf** aB ȏ¥*W W c@ %)Pp")&y@G0f xC>vcp(f,1z*f?y,f5!.fw 4n832cd& & & B  2OΕ   N Υ$Ε  22Υ   Ӄv Ε f t׃e * e*w@)0, 00FtG:TADATADATADATADATADATA  ) )(   =  l 0l  t 0/ e&=Ba@a Ne0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  L, >  w> | JwۇB # f  `* wDZ)0406 l0 w 0,0w  8 !Հ)wڼ*ww b L$0,0w 46  L)0406 0 * 8   *  4 6 re6p 4&*&4&6= 64 wz%!64=5 2 6  l0 & Z46 ܰ64 :)0406 0 *0e6p 4 = |,44{ W @;TITISYSYTIOVz0zVx00 & & @( nf  e ee e &f& v      W# Q ~ ,d      0 0 0  n 7 f& & A&f?A`e  P! 0 b l `Aw f hf^p  -  ~ v n` BJ  ʕ=XR  :    : w2 }w  ^ȕf  2    % Z ww 6 eB eBzw ` $&< #  D t " w   F  w  5E5 E5pE~7 x vpE   5V `2 & H  $  bɥ= <8f  8 5    w & &  fw b*wjBL CB CO DI FF LI LN MB  SL TB@ VB SP    7 CMP>00zGBSBg differences found No differences found/ TId~ &% NSY dd  d kQSYSY  1  2     z4 -- Illegal switch or switch value -- Open failure on output file -- Illegal /LI value -- Command syntax error &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e '&1 $ 0 < `! x x x& t) t) / 0 41 .0 $X!5ew , Bv     5Bw8  eeȵe ~ z DE  ȵ2e &e 8 %&'@^e55@558Beeȵee& q1B$e q1 B  00GtG:TADATADATADATADATADATA5  5 2  UE  xHE U 5@*& E& & f&ËDef Ë )̋Uw eE D` bl lrw \  B eE"s    s-  Csl&f &  m  f A N  %(ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &&ff  $`0$ <XH`&<T&<H l%Dx( $,t),t)P 2t)H f&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 00GBSBgeB  8 $&w **<S1   K U U@  f&" '&)'&&* *%0*ND  * EU   rw `BC "& @SY&*p0p210=E%0=w(*e "f D CB.E*;7#3w *$ ':T U@% DD%][%><w  wl1  %,,:4 w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce    *w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce Pe%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` 0*weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ **(e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DEe    *1  ˕03 "   ˔Ӕ ʥ75%& w $&Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@   f >5>Eu   0+1(e  @%&p*w f( f)f 8Ae f"( UCɗ&+(e$&%  H& H& T&w 2( D 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB > L \# U&* =w `p!2 EW!p0p2 bׇ#( P) @#**fff  &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@)) *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ .u R# eB&B xB  *  eBe>  # #D #=0/H#@&0 # = e0   |0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2141612epl2l0pM=f(& e %&&eH =&e0  U   E > >E=uf p  wh " f &* *   f | >5>Eu   **8Ae f"( UCɗ&+00GtG:TADATADATADATADATADATA(e$&%  Mw 0+1(e  %&p*w\ f( f)f 882e&( 0 0 0 80 B0 0 0 0)#0.> =00l&8el2 0 *w (DB C DBe ?D(e(e$2e (%[]%<>  1 >w ^BC "& @SY&*p0p210=E%0=w^(*e "f D CB.Ef&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ e6p 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 J B) 8C $* ) *w<*  bep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 2p  8 V *`)wj C#    D @)  6?0D)w n832cd& & & B  2OΕ   N Υ$Ε  22Υ   (v Ε f Fe H* Ve*w:@)0,    F) )(   =  l 0l   0/ e&=Ba@a Be0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  ,  rw> 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 & N00GBSBgeՀ)*8Ae f"( UCɗ&+(e$&% 0+1(e  %&p*w f( f)f w 2' UD$BA &( U BQ `Е*  w  ť ť 0B AaABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw >&& D¥%  B&ХVA " C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& e/& e*AHŀ ȕ Е Е Е & eb & eNЕ A %& e"A h Е A bEA EЕ A 4A   $Е.  AЕ;    w TD&& bЕ- eaePPPЕ-$w $D  &Е. ce * Е:   B 5 ߥ& *  + 23E Ew    Е-   0@A W e`fÊ    E &   `@ ` B   & A @     89f"e\e!e 5f $2* eA &3&|&  f&&  e#e|& f&&G& & & & && '&&w <*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&( 0 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Հ)*00GtG:TADATADATADATADATADATAw 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 h 8jDl@ TeBT85l@ @( D eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ x 0 < ` H& $ $X!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 *     A  5hf    0D qBCr r &   r vŝ X& N D P r 3  5  2  2 w 5f! 22 p  2  T2 @5I  Е-& r  A   Е, A   tЕ, Е,Е/Е; Д/ @f    2  ww @ 61w  @ B*w:@B 21 1ap1 6 5 5 W  x5p 1 |d1XwLe`  3 3. wك3au qss   55N; 585 ve  1 W,  "23 R23" w T3 *T3" w-@TM z7 P7 P7 P%DUD 0T00GtG:TADATADATADATADATADATA FR%DU4 T;7  6P nSEPT "V S S 7PT w`) wd$PwPT%`Zxp7k87"b$  _1%DB6%6t7 ,( BXЕ._w&_P_z T5 5 uЋ f%TL Pf  FMT -- Syntax errorDevice does not support formattingDevice not in systemFailed to attach device Start formattingDevice offlineUnrecoverable error - Device write lockedDevice not ready Start verification Operation complete Device driver missing Entering manual modeCylinder = Track = Sector = Manufacturer's Bad Sector File corruptDisk is an alignment cartridgeFatal hardware errorFailed to read Manufacturer's Bad Sector FilePrivilege violation ** WARNING - Data will be lost on : ** FMT>Invalid value for the DENSITY switchFailed to format -- volume has been alteredMedia format error -- volume has been alteredVerify Operation of FMT failedInvalid OperationParity error on deviceBad Block on deviceInvalid switch combinationCommand I/O errorCommand too long Continue? [Y OR N]: Response out of rangeMarked bad in Manufacturer's Bad Sector File Error reading dataBlock = Header compare error Error writing header Error reading header Error writing data Start badblock utilityBAD :/LI/OVRUnable to run badblock utilityError limit exceededDisplacement = No track descriptor foundInvalid switchError setting diskette densitySkip displacement = ECC position = Error reading track descriptor recordError writing track descriptor recordTrack descriptor record: Manual defect information: Unable to read any Skip Sector FileSkip Sector File is corrupt, reading nextMarked defect in Skip Sector File ** WARNING - Error rate may increase**WLT switch missingbZ&L  dL ^LЕ L `H KEHTwzOwR)00GGSBg00GtG:TADATADATADATADATADATA00GGSBg00GtG:TADATADATADATADATADATA00GGSBg F T F | F DK [DB\DB2/\DMi [DM/ [DR`7 [DR/ [DR7 \DRD/" \DRav 2 \DL( [DLP [DY\DY\DY\DP@ \DP8 \DU(\??w W      &7v Ү  %w %W % %DMx  Qk rT & ~%DRJ5 u * NRT  W Tѝɝ  䴱Q  Е.Qw: 0@` m$@ 76w4%DL%DYt" Dw |w 2w lw Q  w Tw  R j L ȥ# H F‹>7 7 h L w`Д&  m %$ 7 ̳ 3L L az Ћ w,RV pVXVxdVp %DKh%DP`  7 H 7 7!B'1<R z ew t 4 0( @R     7 7 7 nQ$W"CE f%w@B  z-%7   -x -n-h7 ` Z-V НıН ݼ w?:RL PPPP L   ew %RP ew w ' UD$BA "&( U BQ :Е*  w z ť ť 0B nAa&3'&1 ^(_ ^(_ ^(_ ^(_ ^Ve ^4_ ^4_ ^`_ ^P_ ^(_ _(_ _(_5ew 4, Bv     5Bw^ 5  5 2  UE ^[ \\0\^E U 5@*& E& & f&ËDef Ë )̋U 5 ߥ& *  + 23E Ew Z   Е-   0@A XW e`fÊ    E &f &  m  f A N  %&   `@ ` B   & A @    &ff  (_^^0(_^^3(_^^4(_X^^6(_^^7(_H ^^=(_H^^?(_H^^@(_^_A(_4^_B(_H^_C(_^^J 3L L ɋɥ ɥ ɥ ѕ 7۬ ֬Ŭw `cL c7 f  T wulxw f_7 \T75E7+%DY4A%DL,=%DU$9 %DM%DR.%DU*%DY%DU߫%DY7ѫثѫʫzëR wDYR HB%DM%DRx%DLpYWw% >7 &fw 7 7 @,q `-KacJE[ !m@  ) L R  j7j f@  &  5]U E( :&@E A  ̆  E vE c  @  . &fb     8  " .$ B  8̥ZḀ90     VEVERIFYNOVENOVERIFYMANMANUALOVRDEN00GtG:TADATADATADATADATADATASDENSITYWLTERLBADVEVERIFYDOUBLEHIGHSINGLELOWbcc ccc!c%c*c2c6c:c>cAcHcOcTc[c҂_҂__c:_/ccccccccc:dBd-c@,d4dcc`c_c_c"`c=@`c@`cV`cV`c‚d`:‚l`:‚t`:†|`cY`c`c=̆`c=̆`cw * w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C  JL  f @ 5 6w ެ ¬  f H-D ׆ >: L   L t e  x     -FL   ` 7 $ (  m|w vL   lL @  5wޥ  ۆ  7 L ,A R  -p7 L Ĥ 5w^  e ^L , T  n e7 j $L ^A  R       2 H-* 7 Z%"7 7 7 L 2 d L Z ƣ  L $䆇T ]U@@E@P -7 RT& ~D aaeL EPCDU L-H7 @  w  7 0L Z-r RجRT @W T0ɝ0ьѝ(ѝ"Iѝ e,w &  d /1 @/ 00GGSBg7צצB_  J@:_  ~B_  J_ (7 L  m L 7 n  -r7 L ƞ F6472m*, 7!$ ewm 4 LL , # 5-5-5- &f  #mm rm-xEURT EP-f_Re U -U m7 B_ 7 n7 l7 jL wp m RT FMUu     l݆xCtp R_T_ ֛ ew ' wfT_ @P j_ 0H -T7 DL <  L " -7 L dZ_T 5wj6 , ewm T   - ߫h b ,j7 b L  <L  :6   |" x , h^cX "F><7:m24 7!, ewm < TL , #5-  5-5-&f mm DeXwR -,"w x /}- U h URT EP0 0 m$7% L w  R%Uxr5 5  & N $ ԩThe RP07 is not supported at this time (_  7 H v,P d' :L ˬ-7 FwD7 V7 P $ 2F B a  w4L E   4 ֤ L U$  L  :L d > 6wЬ j L edw^eR ҆ 4$ L z ewe L 4 ` "1,1, Lee ew    ]m~ ܫ<v00GG:TADATADATADATADATADATAThe RA80 is not supported at this time (_  & & & & f&& F & ΕH 4ڬ4ҬwT¬ wDw4zw$6wwwS:M v7 _ 7 7 L  8 &  e B dw7~TQHثdwZȫwJdw:w*_ww xwhwX Pwڪ  | "<8  J Df T5 a"e@  2vp( vJ n$ 6v PAT>P^SYf  eE   1,1,J  1,1, 8J# , # zeH  &3'&1 t t       \  \    5ew , Bv     5Bw4 .00GGSBg6CSDg5  5 2  UE h 0 & f E U 5@*& E& & f&ËDef Ë )̋U&ff w eE D` bl lrw \  B eE"s    s-  Csl&f  t  < h $h  h  h  h t \  \| \< \ %\ )\ /\  2\ 7X!h w . R,2  JV$ jbL4 PJ  J χU l v ftzU@7 v7 dl <  UT:0&&e,w  @B  $&< BevX!Ah ?h \ d  Af E PAT>&ef  bpd ` $ " fB` w (@f . Bĵ'ĵ%% %e$e e e & ĵ V 11@ Be w 5 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@ 8ŀajTI& af* n*`V @e,w jjlj ɥ@@aujk,bp B5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *xw  8jDl@ pTeBT85l@ b@( D 0eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ ~ * | F  \   \ \ \ z f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 00HG:TADATADATADATADATADATAw 7 X V: %2    n  %     % "  7 w 7  # 2  "P &*2   , ,eF" t2:7    F * 277 & U :  2 \ * \ " \ X 6 w 7 H F: ~%2   ^  %    %   7  h2 2 DX h7ee%VM% \,  \ p ee@w.N^e   6 * 277 & U J \ B \ X l : f : : w 7  : &%2     %    %  7 p 7  " Z2  E A h&.7*B P  V ^740  BB#44,0ޝ  7@eeX!e\ ŗŗB  \weeeN,^e   6 * 277 & U \ \ X  w @l5   ( P"T    .w  F N V^ W! $  d\  , ? N Bw "T Nw \:? r " $ 8"  *dpa ^ [ " 6 ( J F eH $ & e77   7 >  *2eHeH5 Jp & `HP 7>W!x* B * &(  &W @E .@)  `Q@&  @m1E@c  2 h  ` \ X \ P  H \00 HGSBg&f& v f&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0 .eeȵe ~  DE  ȵ2e &e  %&'@^e55@558Beeȵee& q1B$e q1 B  f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 e(ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &w l w b& W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C eB  8 $$&w *<S1   K U U@  f&" '&)'&&* *%0*ND  t EU D b (w H*D ^  ww * (ww  ww ww BC "& @SY&*p0p210=E%0=w(*e "f D CB.E   f h >5>Eu   8Ae f"( UCɗ&+(e$&% (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w *$ ':T U@% DD%][%><wb  w1  %,,:4 w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce N   @*w ,*  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U00HG:TADATADATADATADATADATA  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ 0+1(e  %&p*w. f( f)f **(e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DDEe    *1  ˕03 "   ˔Ӕ ʥ75%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@w 2( D B 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB  L \# 6U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff x &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@))  *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ u # eB&B B  &*  eBe>  # #D #=0/H#@&0 # = e0   "0@e 6=#02/002# @#?@#040 6w8/!0/ l0/!p!0 .=p0p2w (DB C DBe ?D(e(e$2e (%[]%<>  1 >f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ w BC "& @SY&*p0p210=E%0=w(*e "f D CB.E141612epl2l0pM=f(& e %&&eH =&e0  U   E > >E=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 *e6p 4 8 81416  . T  ,*1 ,U8UMwF w NB 00fep=& /e`pwv46f %8 E D/D!D 00HGSBgl0l8epl0pɥ.ɕ w8e2 *) l0, *) $ )*)0,40,6 w 2 H) <* w46l0**=D  `p46 4f 64/=  @) 0  8w H46 8 e*w > =00l&8el2 0 *141612epl2l0p *) l0, *) $ )*)0,40,6 w  )   fU 6%  BA `6p 4p`4 %60 4e6p 4 88 481416  n  H b46f %8 E D/D!D l0l8epl0pɥ.ɕ w)"(. 8= . B  E  (.0,0, f 톇,, w B     .% eB U5UU 2 plp & NeՀ)*0+1(e  @%&p*w f( f)f z8Ae f"( UCɗ&+(e$&% ,*1 U8UMw" wf *B 00fep=& /e`pw8e2 ..8em,0l0!D0e6p 4.) &f   e) .  e6p 4 08*w=p!Օ^w 2 x) 8C $* ) *wr*  ep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 hp  8 V *`)w ,C# 2   D @)  6?0D)w n832cd& & & B  2OΕ   N Υ$Ε  22Υ   ^v Ε f |e ~* e*wp@)0,    |) J)(   =  l 0l   0/ e&=Ba@a e0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  ,  w>  JwB # $ f  `* nw^)0406 l0 &  m  f A N  %**=p!Օ^ *) 00"HG:TADATADATADATADATADATAl0, *) $ )*)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 p     .% eB U5UU plp & NeՀ)*8Ae f"( UCɗ&+(e$&% 0+1(e  %&p*w f( f)f w 2*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&( R0 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Հ)* z %NPAT -- *DIAGFATAL*- w D$ NWFk f~ b\ X PB FBlb 2)\%wzwvf& w  ť ť 0B JAa & & @( .f  e ee e ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf P & e26& e/& e*AHŀ ȕ Е Е Е & e & eЕ A %& eA Е A bEA EЕ A A   $Е.  AЕ; "    w &D&& bЕ- eaePPPЕ-$w 00*H-HSBgD  &Е. ce f Е:   B"Nl( J d ~ ;h#LuIllegal error-severity code %P %P %P %P %2NFile %X has illegal format%2NError during close: file: %X%2NError positioning file %X%2NUnable to locate module %2R%2NIncompatible reference to global symbol %2R%2NIncompatible reference to program section %2R%2NSymbol %2R is multiply defined%2NUnable to open file %X%2NUnable to find file %X%2NInput module checksum is %P%2NCorrection input file checksum is %P%2NError in file %X checksum%2NI/O error on output file %X%2NI/O error on input file %X%2NCommand line error%2N%VA%2NIllegal indirect file specification%2N%VA%2NMaximum indirect file depth exceeded%2N%VA%2NIllegal switch specified%2N%VA%2NIllegal file specification%2N%VA%2NIllegal device/volume specified%2N%VA%2NCommand syntax error%2N%VA%2NIllegal directory specification%2N%VA%2NMultiple output files specified%2N%VA%2NInvalid file specified: %X%2NRequired input file missing%2N%VA%2NCorrection input file missing%2N%VA%2NToo many input files specified%2N%VA%2NNo dynamic storage available %P %P%2N 5 ߥ& *  + 23E Ew ꅐ   Е-   0@A DW e`fÊ    E &  m  f A N  %|:,PPB W 2 ~!yTITISYTITITIOV|p !p|p N 6 H n -   d !  ` .*-P P  # B  B     6"{  ew w ew w !s ~z7 v &  X) Υ7 4 (r d# x )w 8 *: L# P 7 (       !  5w%DT6"3 y w7 Z $wee*E%,%CT 7 # j5 UR7*# D w E$% et 0# % U % 5Uw  w5Ce*5. 5@0l2p  0"0$    5 5 U5Uw43,p * 5@ 0l20,  0 436 ~% * f  V @ wEee*%%@ %@ @ 0# U002HG:TADATADATADATADATADATA@w*+5  *., * :*5 E800(.. ``00`! U(.w t  # 7 h Z7 l D D) <6   & +7%  $ )elw jw h7        N&    wt% Z@w5vOU : 8   Q$ %  e 4 H   ew  & % : N 0,<8 G Ne \w5 *E%$0l. p "p $ep ep 5%% ,. $  DCE0Ԥ 5 : 8 Hew  b , >v    % P% % ͘     , e j   ,.0 % Ԥ$   h z X0,<8 wZw%% w~",$%.e AeB p  &&e%%%.e  L  pp& %  A  B $ ! 7 x  `mh w T  w& `wwww~wBwwwwwwwwZw.w wwf& 7!PH!!   5  j0 "3 -3.` 3e3, 3*++30  3 33 @7  wf c e <J%  .<7 <d#1 )     * j v r% - d  wf6" f vv7 (  " B Q 7   |"C "B rK \ F % R  ȥ= ЋCɋP!ы  ыɋ C r! @e  z7 : 0|#|#7 H j )%wf% wb7 &&%% $ 5"db Z pw`Pew HB@@  N@e&$ :@eA AeB @  \ l$A l"p0% %    `A aB Bm D u U%'&1 % %  3 43 J2 B2 &2 H3 P3 1 2 2 2 3 N3 |2 t1 l1 d"|5 \.|5 T:j6 L:*6 D:5 <:5 4:5 ,:|5 $F&6 j6 jz9 j7 v6 v6 6 6 6 6 h8 6 7 6 7 6 6 6 6  7 7 |8 t6 l6 d6 \6 T6 L7 D7 <7 46 ,7 $z7 7 7 8 7 7 D7 7 F8 8  7 08 8 7 7 7 t7 7 *6 *j7 *>8 |66 tB:75ew , Bv     5Bw$ 00:H-HSBg5  5 2  UE ! E U 5@*& E& & f&ËDef Ë )̋U&ff 46f %8 E D/D!D l0l8epl0pɥ.ɕ w8Ae f"( UCɗ&+(e$&% 0+1(e  %&p*w. f( f)f ** $$V$$$$&(($02J (%&>"(%&2$$&*b&*Vn)*Vz,*Vb.|//p00p0(1p0x2p0P31315171D8191` ;1<|5"^<|5.=|5:>|5PF?|5hR@|5"A6jNA6^vD6^G6t^J6^L6^N6,^P60^Q7T7W6$^Y6^Z6^]6^a6t^b6^d6^*f6^6h6^Bk6\^jm>Px8` ((H@Ph08@HXABORTBADBLOCKSBUFFERSIZECOMPAREDATACONFIGURECONTROL_CDENSITYDESELECTERRORLIMITEXECUTEEXITFILES11HELPIDENTIFICATIONINTERLEAVELOGFILELOOPBACKPARAMETERLISTPATTERNPRINTSUMMARYPROCEEDRANDOMRANGERECORDSREGION_IOREPORTERRORSRESTARTRETRIESRUNTIMESELECTSPYSTARTSUMMARYTIMETEMPORARYFILEUDBVERIFYVOLUMECHECKWAITWRITECHECKUUm۶VVm[mے$II""""UU !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@@u z u z +J[g did not respond is not ready unrecoverable error at block is 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 unexpected error #Fatal file system error. F.ERR= ^COnly ^C allowed error threshold exceeded (octal) (decimal) data compare error at block Good Data: Bad Data: Word position: Buffer contained . additional errors Byte position: ,Fatal system error. DSW= PC+2= unexpected request to queue I/O - request aborted...IOX -- READWRITEREWINDWRITE CHECKWRITE REVERSEREAD REVERSESPACE REVERSEWRITE EOFUNKNOWNNo buffer space availableAborting due to user command No activity remains - abortingUnable to create/delete/map dynamic regionNo such command - type H for helpCommand not unique16.08 with terminal support and regions: j E""">#  P"< "#  "|#Q #$'$|# IOX>P IOX> 00BHG:TADATADATADATADATADATAf&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 p w f& W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C  / / / 0 / 0 1 8   * ^  4 6 e6p 4&*w 0,0wH \ w d$0,0w" 646 0 d)0406 0 *=D f `p46 f 64/=  x@) 0  8wz 46 8 e*wZ w ) H* Jw46l00,0, f 톇,, w 2     .% eB U5UU plp & NeՀ)*w  ) ^ fU n%  BA `6p 4p`4 %60 4)"(. <= . B  E (.8e2 ..8em,0l0!D0e6p 4.) &f |  Re) .  e6p 4 08*wn=p!Օ^,*1 U8UMw w^ ( ( ) 0 4eB  8 $&w &*<S1   K U U@  tf&" @'&)'&&* *%0*ND  4 EU   &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@w  w* x5)%Eefffff f% EDD%][%>< & T00JH-HSBg1     f e  C C C e`(e( 1  `((   >: 5 eCe(ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  & P ,2w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` 4*weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ  P0 H4 @ B2w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce .   **;7#3w *$ ':T U@% DD%][%><w~  w1  %,,:4 8  ** / / p0w & ) 8C $* ) *w$*  ep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 <p  8 V *`)w C# <   D @)  6?0D)  DP5R RRR  / P1 p0 1 t0 p0w  n832cd& & & B  2OΕ   N Υ$Ε  22Υ   v Ε f 8e * e*wn@)0,   ) H)(   =  l 0l   0/ e&=Ba@a e0b e00RHG:TADATADATADATADATADATAe@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  ,  Dw> L JwB # n f  `* lw\)0406 l0 =p!Օ^  DP5R RRR  x0 ~0 4 4 2M=f(& e %&&eH =&e0  U   E > >E=uf p  w , f &* *w v*eB 8  w L(DB C DBe ?D(e(e$2e (%[]%<>  z1 >82e&( :0 0 0 80 B0 0 0 0)#0. >MwV 4J& ,J% $J$& J %  % / 0 1 x0 ~0 0 V4w F( D 8#"#)%ĥ ĥ wn 0 *0 @Q$    0 40 60))  L \# ,U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff R z&*wj. nB5(8e$8w2A&(e H4p8q  (#5=A#@)) *R*)@#0l C# 028 x00ĥۇAĥĊ  000 B0 @0 &*0 @ ju # eB&B B h * 0 eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2 Mw 4J& ,J% $J$& J % / 0 1 x0 ~0 0 V4 4w F( D 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB F L \# U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff L l&*wj. nB5(8e$8w2A&(e :4p8q  (#5=A#@)) *R*)@#0l C# 028 j00ĥۇAĥĊ  000 40 @0 &*0 @ du z# eB&B B h * * eBe>  # #D #=0/H#@&0 # = e0   000ZH-HSBg@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2 Mw 4J&w *8I *=)98 @ eB &&  U 2퉝**e *Nlv ΋*.2  & #!)&eP(e && >e >E p* w 8 !Հ)w*w)"(. <= . B  E (.8e2 ..8em,0l0!D0e6p 4.) &f  e) .  e6p 4 &08*w=p!Օ^141612epl2l0p,*1 U8UMw wX0,0, f 톇,, w      .% * eB U5UU  plp & NeՀ)*8e2 141612epl2l0p *) l0, *) $ )*)0,40,6 ,*1 U8UMw ww (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA bEAa$ & & @( :f  e ee e &  m  f A N  %&f e6p 4 f8 81416   f  B 00fep=& /e`pw> =00l&8el2 0 * ..8em,0l0!D0e6p 4.) R&f j  @e) .  e6p 4 v08*w0,0, f 톇,, w      .% eB U5UU plp & NeՀ)*  &   f >5>Eu   Jĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ Nz  DDEe    *1  ˕03 "   ˔Ӕ ʥ700bHG:TADATADATADATADATADATAj 0%%u M 5   D , 8aj S L4 c4j ? ? %  : 7 # e e7 =5 *%*E -e  % PH #X  x4#  f@#7 $&@?  @ wt *w  wd7 fA 77#7 ׇ vp0 n>X% fP1 5 ߥ& *  + 23E Ew Z   Е-   0@A W e`fÊ    E &f  does not support the command&3wpwj 4we Jp6 6>:+ %@ 27*5 h5=75 "y{@  %!% %U ;@60 6 pU  %w"e ^ z T& &Y@ w` (eEA A A A w j,"we?E? @ @B"K3   b"U B" e  KE %DT!  %"U p   %DT  0 3 !w >eE D` bl lrw   B eE"s    s-  Cslw BC "& @SY&*p0p210=E%0=w(*e "f D CB.E&f >7 87 @A *C27    llC bA  e0 0 ĕ, e (3 ĕ0 7 ؇?    AmC Cm u  Mw>@zZrN vH Tʚ;@B'd e7 tf3 xԝnj< %DT 0$ s 3 3   @   2 Ees ,Ӈ,  e  7 f3  515 .7 \63'5!5z7 VN3r q gE $ ..  x3l3 px3|3l3@&2V:2N N2Fv2>b26w.B4 p  E UE@ U@E UE  U E  U 33 ڇ 3 >L,e%" 1> x%:1 1 Q$ `   :p"p$   " ," 1,$pp p"p,  % 0  a ff a Q ea e`q  ¥.Ћ $ ȥ:ȥ,Ћ ȥ; $:5 :|522NOYESMM @MFj@MUj@MS@MT, 00jH-HSBg w  ť ť 0B Aa 815%& w &Ba +- ʥ# . U 0   b   `     f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ w $ %ҥ[֥< , (e  5 s  D w&f    d# և o6 "33 y544 460 0 *% @6 l0 0 *5** U%DT *5U* "3 0 U 6"{ j%v6     h; 8U F57 v6l6 8 !  $>6 0 E Շ 2 B2 7 I/O is unsatisified at timeout - function:    Ћ &   ¥. Kȋȥ ȥ ȥ;  P6% 6@AZA Z r h¥:6" 6 p%ee>e  A@az ԋ r 1 j 1 is not configuredSyntax errorDB377: is not configured 8 6 77 N [6 :ձ%DYP \ @ l0 0  P6 0 0   %M 5 E%4 (@ wh7 d6nɇ |z* tB2 failed to detach failed to attachDriver for DB not loaded 6v6z6 @Е  d7#7JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw D&& bЕ- eaePPPЕ-$w `D  &Е. ce 2 Е:   B 3 P1&f =z6!! 2 ,: p7V:(>"j %|-T T  j $`#$  > ewL ҕ ҕ-ҕ-ҕ $ s%8:w 7 :& & A%bl7 f L & &Y R U";"w ! "  B" W b"!  "7 :t:>wf E>@b7eE@ @ @ @ 7 e 77 "b:  ԁ`Ћ@ @  Bw   eEwW w7 7 2".7 ,"(7  j7 ~ 7 x7 v7 7 r Ew. >wb: %%  " ^e@111%DT>  $ ܒ81 J& ܒ0 3System does not support AST'sCTDBDDDFDKDLDMDPDRDSDTDUDXDYEMMFMMMSMTMUSYTTA:?:00rHG:TADATADATADATADATADATA 7 mw mmw mx|w zmpt7p h X: : ; j 6:   ,K; [; m; n ~: ^ w45e e  ; , ,; %%%%  4  : '0l p p 0l"p 0l$e Xe%%% F  :!%. 5  %DT :%DT: `e: e :: >% %  J: "w  0;   ; ; ^XR ^F>6 ; <60*"; ; |  ; fU 7 ; TE  # 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 w R|5 2 43 1 1 2Summary of exerciser activity at A C C U M U L A T E D T O T A L S : - - - - - - - - - - - - - - - - - - min.. R/W requests totaling . blocks with no errorswith errors. records . bytes AST's executed: . Idle-loop iterations: Unreported error count: TIME -- Run: min. Elapsed: min. Remaining: --  >8 7 \ w  F ; A; ӷ 0#dѕ  #:5:5: #%. .#)% 5 0%DT "%$ : @%%  .X$R55: 5: 55 :  5 #: 5@: : %2 : : |%< : l?# wP7 "G  ~; 6; .ҷ Z  7FeP: ;% ;  ; : e ?   *: ; <  : :   : :% ^: V N   N<  " t" !m Q$: > DT< : 6 2 4 ^ :    @: w% :w:  43 1 ܒ0 2 |3 . -> .:.VFYSELF11COM RET WRI RAN ERR=INT=LOOPBACK = YESNO Buffer space usage= Maximum effective BUFFERSIZE= Device Mode Buffersize Filesize/Records/Range Parameters------ ---- ---------- ---------------------- ---------- Task Status Command line---- ------ ------------SV ERRORERROR WARNING SUCCESS ACTIVE QUEUED ;;;;;f"n"4"*2"Tl"~v"r"j".""$"50"="q6""*""" ","w &w w7  7wH9 *wȥ= Ћ 49.9 ؇7|@ zч C "3Z+O &%>  2 7 ,  "_9 67-" VK %DT>  ݴ9 ( ȥ=  w9НzНw Е:j 9 wz7 VNF 9 V , 9 F  9 6 9 *ҡ  00zH-HSBgw6  : F9   :5 T3 2 :|5888DISKTAPETERMINAL is already configured specified device type is inconsistent device type not specified - defaulting to 'DISK' Disks: Tapes: Terminals: DB377:`97  a wZ wr%Qf%^  Z%|R|J  ЋMm EA ,B@ " @ QeI%ɕ ̥#̕  j "" % @91181e 1e1f  J?9%8%8%8 Fw9 $)% ev9  9 z %9 .A (r9 Zj R9wJ <ޒp0 4:5 ,ޒ0 $:|5unable to executenot installedcurrently activecompleted. Status=WARNINGSEVERE ERRORSUCCESSERROREXECUTE command is not supportedInvalid task name 91999$9$9 Q|Task " " is 7 $ȋ         T8 ӡ 8 8 885 8858   %% 8 p8 88 T8 L (Q7B%< 9 &% 4#$9   E%3## .‹T  99  e@  1 2 |B2 tP3 lH3 d1VFYSELF11Mode= Function= LBN=. I/O=AST queued VBN=In progressIdle is not selected -- / ??   ȋ% Ћ ߾7 77 IOX Command Summary: ABORT ;abort exerciser run ABORT task ;abort executing task ABORT /ALL ;abort all executing tasks 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 configuration 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 error 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 ;output messages to a log file LOOPBACK YES/NO ;loop transmit/receive terminal data PARAMETERLIST ;display exerciser parameters PATTERN val ;set read/00HG:TADATADATADATADATADATAwrite data pattern PATTERN ;list available data patterns PRINTSUMMARY ;print summary report immediately PROCEED ;proceed from ^C state RANDOM YES/NO ;random disk access mode7 RANGE ddu: low:hi ;set LBN test range for NFS unit RANGE ddu: ;list a unit's LBN test range RECORDS val ;set magtape record 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 ;select 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 TEMPORARYFILE 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 idle 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."commands" are certain commands which are used to overrideexisting default parameters. ȋ (87 j8ȥ/;7  (w w  %Qv%n%|h b"w87,L7,F N  ЋХAХLХL  8"F H D%%8%%Q%%|+%|A 9 XA 8)8 F)@%  @ ޒp0 :5 ޒ0Syntax errorTask never executedNo tasks to abortCommand valid only in Interactive Mode Q|88 ABO %CT%DT W7 ! 8 Ev8 h v87Z 8N38 ^8 .8  ,e >C@B@ %% $?8 T%> ,a @ӡ 22 *43 "B2 :5 H3 :5 ,2 illegal density syntax error is already selected???? Density= BPI Characteristic Word= MM @MFj@MUj@MS@MT, :%! :_::R:ȋ ; " X : U; X; e    -U; | $ w  D  "  $ "   w     r wd G; ,@ >eE"?     /" &  0  Rw Z .  j 0w Zw \wfwVwLwBw8-" " ""e?00H-HSBgE? A Ar+  $ 735 p;=8475 u5 UD";"$2+  2 2 2 u5 w "wvv<  eSS7 %e7 SS H3 :5 :5 2Syntax errorCommand valid only in Command ModeInvalid pattern numberUnits are selected - command ignoredEffective BUFFERSIZE is too large 0 = Random Data 1 = 2 = 3 = 4 = 5 = 6 = 7 = 8 = 9 = 10 = 11 = 12 = *::; ;;;%;-;5;=;E;M;7 7   wӇ77i= u  v Uw <2 . 080`. U@ U U  U zU  << ա  |E`  77w>~=wKU >7    jo . 2wVp,b%DY \ >%  Z "u>wf %CT:%DT6 &3 05,( n> .= >åg>åG>      5 U JjE  =  N=  = ~,  60 ,w~.,0 ,w>ч %  <  P@>s3 3>  ҇ B & =@ > RG#. Al"` "D=wneEB%DT<0 T" "%DT= \ <  w= v#=%DT%CT hb7=5 R+=5 > @b< ^%DT%CT > '0 p*>"  & mw 3 :P6 2 2 3 *2 x2 2 2 "5 2 F|5 B2 3 1 1 :5 1 1 :5 |2 t1 lj3 d3 \:|5 TF5 L2 D,2*::>;;;;: :t::;:BUFFERSIZECOMPAREDATADENSITYERRORLIMITINTERLEAVELOOPBACKRANDOMRANGERECORDSRETRIESVOLUMECHECKWRITECHECK buffer size is greater than default is already selected LUN asignment failure is logged in buffer size being reduced to typeahead buffer size VOLUMECHECK failure. Unit contains a home block syntax error is not mounted or allocated for NFS operations error while reading home block is not ready illegal range illegal densitySY > 7 d "% Շ7T 7L%Dw78 b 542 5E ` 6 ,. v&( d0 ,   j(8 ^  0 0 ` 45 T ~ ӡ *?8  3 z* 2 .5 B2 3 F5 - unit now deselected is not selected7  wӇ w77 w: P wn7f7d7^:: H wJ> 0 CKU ` Vwjp4U` 4eB&:ږ<  <V2 JU ,U@ :: Ph  $  4X"Le`# x Z( ^X:wU p. 6 p, h 6 5E4 `00HG:TADATADATADATADATADATA40 4E % 0 0 T e  >J:l l X pL T采@e< \ᇇ0e2 Lه t:P6 lz* dx2 \2 T"5 LB2 D1 <:5 41 ,:5 $J% 1 j3 b + 3 :|5 ,2H9`9p9T99COMPAREDATAERRORLIMITINTERLEAVERANDOMTEMPORARYFILE syntax error failed to open temporary file is already selected LUN assignment failureSY , v" 7 z r" n"4"j"l" 99f::        6"*0"'*"$,"!."$" F z f^" """ ""   wJ   $ K %   <;9 w*w : ! wr d# 7 j t: l! `ҡ DM7U: x5 8 &3 :"$  &% @: 8::p"p$pp : BF:t: %"%$ F: %% 2:  z3 r2 jB2 b1 Z:5 R1 J2 B:5 :,2No activity to startSyntax errorCommand valid only Command ModeIOX Version Command valid only in Interactive Mode syntax error illegal range is not selectedUnits are selected - command ignoredREGION_IO command is not supported . -> . >; :j l9%e9%=9  L87 j  9 % * *9 ` 7 7  N` ` vw` eBSY_M #d"f#  * .# z88 j D9% 9 锁 F8f# $8w R|5 z* ~43 vn + n& fz+Failed to open log fileFailed to close log fileFailed to open existing log fileFailed to truncate/close log file. F.ERR= -. ******** EXERCISER STARTED ******** ******** EXERCISER TERMINATED ******** ******** EXERCISER ABORTED ******** ******** LOG FILE TERMINATED ******** ******** LOG FILE STARTED ********4$b$d \` 4< L<q<<fmb\ ȋww 5 funhj uhdB$ 0jwaw< 8 v8w &  P*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 0jjlj ɥ@@aujk,bp z5f fˇ ȕ f‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 * 98w  8jDl@ hTeBT85l@ @( D (eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ .:|5 &z* @% n + 2@% J& & $ $ &w P*D   w,Command input I/O errorFailed to open indirect command fileIndirect command file syntax errorIndirect command file nesting level exceeded00H-HSBgw ' UD$BA &( U BQ Е*   E 9  ;577 1&*#Е Е 6:1  2  *Е:   z#7l  7N6: \ ¥: :: L  W"C6: ȋ9 :w7wwD r: 9 &9eL     t`L   `W 3 s6  `W s)C(eee V C&  C&( &p( 3 `3 B2 :5 2 ,2&   `@ ` B   & A @    &f  is not selected invalid block number duplicate block number syntax error block number out of range00HH:TADATADATADATADATADATA,׿h W F6CSYSYCOSYTICLOV~Ҁ6~ZƵ|"$&~nKGOl|Ol|: CRPN SP0:[1,7]000000.XXXww ww6w  7 pk n ff%Ol%| AW  W  " s!s7%F\10\  J  wvwrnh Aff& COw ,w (ww- UB  U&NA E!5U5x5p P 2 P3 N+) :P5   rP00H-HSBgN M5 5E PN pJ rN tw5 .5gg 0 H5 6HP N0 (ֆŝ0J 0CN : ! , %20.N  w 5 XVs < Z5x@ d `E ` >7 5  NÝ  7 7 7 7 7 7 7 7 7 7 7 7 7 27 7 77 7PNBѥ_R~ ҕ ѥ ~R~ R~Na  @Ω   , DEe  Е Е-Е-Е B 15åS 2 (åFcåX 3fĩf) Bw& &f& v  w  ť ť 0B 8 Aaw ' UD$BA 4&( U BQ ^ Е*  & & @( f  e ee e ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e 6& e /& e *AHŀ ȕ Е Е Е & eT & e@ Е A %& e A Е A bEA EЕ A A   $Е.  AЕ;    w D&& bЕ- eaePPPЕ-$w x D  &Е. ce  Е:   B'&1 &&  0 ع*  @ 8 𹪺5ew < , Bv     5Bw SFЯID IDID,IDMIDID̰IDID> SFg SF SD SF SFɱSDSFSDSF7IDSSDSDSD߲SF&IDFSD\SF~cSXIllegal error message number = %M - parameter address = %PReader spooledReader unspooledJob %3R was entered in queue %2RIllegal $SUBMIT or $PRINT card - job flushing%N%7SInvalid card was "%80A"$PASSWORD card illegal or missing - job %3R flushingInvalid account was given - job %3R flushingSequence number check - job %3R flushing%N%7SInvalid card was "%80A"Job %3R flushing due to operator requestAccount file open errorAccount file close errorAccount record lockedCouldn't find physical LB:Account file read error %D.Card reader read error %D.Output file write error %D.Output file open error %D.Output file close error %D.Queue %2R does not exist - job %3R flushingQueue %2R marked for delete - job %3R flushingNo queue file space available - job %3R flushingError code %D. returned by QMG - function code of%N%7Spacket sent = %BSend directive failed - DSW=%D.Card reader not readyIllegal function code sent by QMGFailed to attach card readerExiting due to fatal errorŵ00HH:TADATADATADATADATADATAl5  5 2  UE v ƶl֮E U 5@*& E& & f&ËDef Ë )̋U&  m  f A N  % 5 ߥ& *  + 23E Ew    Е-   0@A lW e`fÊ    E w (DB C DBe ?D(e(e$2e (%[]%<>  $1 >&f f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ &ff &   `@ ` B   & A @       ̹Ř%Ŵ(ع)4h<>J&zQQAA wL^Y7  Z  f c-_~-nWh  p e H 7 D@ @=-: 92t (2-$M.-\*XS5LG@-6 -$ -;e-&&I  -  -|ڂtd Ђ:ѕ ~L:~5-4 & -&*  S -O  -5 - -  w5 |x5 jf TP  <8M7P~ 7'$! @   70]Cw7Pw L(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA ~EAa$7 &fw 7 7 @,q `-KacJE[ !m@  ) L R  j7j f@  &  5]U E( :&@E A  ̆  E vE c  @  . &fп     8  " .$ B  8̥ZḀ90     SUBMITPRINTAFTERHOLDLOGFILEQUEUERESTARTSEQUENCEUSERNAMENOHOLDNOLOGFILENOPRINTERNORESTARTNOSEQUENCEPRINTERPRIORITYAFTERCOPIESDEVICEHOLDJOBPAGEQUEUERESTARTFLAGPAGEFORMSLENGTHLOWERCASENAMEPAGECOUNTPRIORITYUPPERCASEUSERNOFLAGPAGENOHOLDNOJOBPAGENOLOWERCASENORESTARTNOUPPERCASEֿݿ (2ȁ.0ȟb0[<‚*,‚F]>ּ$'!-.޼ȁ.Ć.Ά>ȁ.̆Ի6ȁ.̆6ȁ.̆6ȁ.̆6ȁ.̆26:=.:w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C 00H-HSBgBD H ~ H E7 &fw 7 7 @,q `-KacJE[ !m@  ) L R  j7j f@  &  5]U E( :&@E A  ̆  E vE c  @  . &f2     8  " .$ B  8̥ZḀ90     PASSWORD8$ L  Rʄw  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C    6   z r ,LB6  lE6 f|!#  |  7 5< '  7 4 &15 e :~ ---eH~ n5eтt,n7 let ׭X%R &) 2 ŕJ 5< e :~ e Hw @w׭׭ 2.e0 w2> 0Wt0PWt0Pܼ [0,0]RSX11.SYS  00HH:TADATADATADATADATADATAw ( D 8#"#)%ĥ ĥ wn 0 *0 @Q$    0 40 60))  L \# 4U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff v &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@))  *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ u # eB&B B  $*  eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w6/!0/ l0/!p!0 .=p0p2w LeE D` bl lrw   B eE"s    s-  Csl141612epl2l0pM=f(& e %&&eH =&e0  U   E > >E=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 *e6p 4 n8 81416   > eB  8 $&w *<S1   K U U@  f&" '&)'&&* *%0*ND  P EU : X ,*1 BU8UMw\ w dB 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ "w8e2 *) l0, *) $ )*)0,40,6 (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w *$ ':T U@% DD%][%><w  w1  %,,:4 w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce ~   &*w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ w BC "& @SY&*p0p210=E%0=w(*e "f D CB.E(e( 00H-HSBg1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DEe    *1  ˕03 "   ˔Ӕ ʥ75%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@w *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&( ~0 0 0 80 B0 0 0 0)#0.)"(. = . B  E p (.w eE D` bl lrw   B eE"s    s-  Csl8e2 ..8em,0l0!D0e6p 4.) ^&f (  e) .  e6p 4 &08*w:=p!Օ^141612epl2l0p,*146f %8 E D/D!D l0l8epl0pɥ.ɕ nw^ U8UMw wB0,0, f 톇,, w      .%  eB U5UU  plp & NeՀ)* Е Е,ЕBН5 C~ 8 . :P~000000HPPH : LU U @  ŝnJ n|  Е.5ЕBЕAЕTЕLЕSЕT " TRDB@НL5`D 05 6=  5@7 7 MWt]PWt]Wt]PН5 НННЕw e<_ :  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2141612epl2l0p Mw   f l >5>Eu   82e&( 0 0 0 80 B0 0 0 0)#0.e6p 4 .8 d81416     0+1(e  @%&p*w, f( f)f 8Ae f"( UCɗ&+(e$&%  ` f D&* F*> =00l&8el2 0 ***w eE D` bl lrw   B eE"s    s-  CslM=f(& e %&&eH =&e0  2U   E > >E=uf bp  weB  8 $&w *<S1   K U U@  f&" '&)'&&* *%0*ND  P EU : X ,*1 U8UMw( wl 0B 00fep=& /e`pw(46f %8 E D/D!D l0l8epl0pɥ.ɕ w8e2 *) l0, *) $ )*)0,40,6 (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w *$ ':T U@% DD%][%><w  w1  %,,:4 w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce ~   &*w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ w BC "& @SY&*p0p210=E%0=w$(*e "f D CB.E(e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DEe    00H-HSBg*1  ˕03 "   ˔Ӕ ʥ75%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@w " n832cd& & & B  2OΕ   N Υ$Ε  22Υ   Rv Ε f e * e*w@) h*0, ~   X) h)(   =  l 0l   4/ e&=Ba@a ve0b ee@ ` Y= E8 el0  & 0 l0`p l064p 4 ep )wV%  ,   N w"  J rB #  f  `* wx)0406 l0 w *eB 8 N  w *8I T*=)98  eB &&  U **e *Nlv ΋*.2 V & #!)&eP(e && >e >E p* w**w ~BC "& @SY&*p0p210=E%0=w(*e "f D CB.E=p!Օ^ @ f $&* &* *) l0, *) $ )*)0,40,6  DP5R RRR  8   j**w L  Lw, * v ,,  *)  > =00l&8el2 0 *e6p 4 b8  81416   >   ..8em,0l0!D0e6p 4.) &f  b pe) .  e6p 4 08*wP82e&( 0 0 0 80 B0 0 0 0)#0.0+1(e  %&p*w f( f)f )"(. ~= . B  E  d(.8Ae f"( UCɗ&+(e$&%  Mw   f >5>Eu   =D  `p46 xf 64/=  @) 0  8w 46 V8 e*w &f D E/fC A B f&  lBeA @0 z (@0 ha@eA  B0 PAB  :f  C @*141612epl2l0p,*1 U8UMw wz B 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ &w8e2 0,0, f 톇,, w \     .% eB U5UU p plp & NeՀ)*w JeE D` bl lrw   B eE"s    s-  Cslw . 00HH:TADATADATADATADATADATA) ` fU p%  BA `6p 4p`4 %60 4 E DE \ 0 ŝDJ D   ЕЕ   ,*"ЕBНHFDН5> Ol|Ol|7%D1D ~)%. %B %D%Kvtr J w T*8I *=)98  eB &&  U **e *Nlv ΋*.2  & #!)&eP(e && >e >E jp* wN82e&( B0 0 0 80 B0 0 0 0)#0.0+1(e  %&p*w f( f)f )"(. J= . B  E  *(.8Ae f"( UCɗ&+(e$&% **w NeE D` bl lrw   B eE"s    s-  Csl8e2 ..8em,0l0!D0e6p 4.) ^&f (  e) .  e6p 4 &08*w=p!Օ^141612epl2l0p,*146f %8 E D/D!D l0l8epl0pɥ.ɕ w U8UMw w&0,0, f 톇,, w *     .% eB U5UU plp & NeՀ)*M,??0}  W FESYCOSYSYTICLOV~<0Z2|0<0$& 06     KؤOl|00H-HSBg!!!+)  Je@k6   L  8c 7ee %Ol0J%|*F$     "%{    ) \QΡ sΥ;Υ8:7  4 7  ) : ) s< )  )84 ( p Dw T7 l @pF00 E3FGOl|Ol|7 hAbo`׭b[1'&1 < < < HЫ l8 lЫ x  | t l d5ew 2, Bv     5Bw "1ة5  5 2  UE 0L 2ة̦.E U 5@*& E& & f&ËDef Ë )̋Uf&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ &ff  <0Ыp0HЫT0lijH`ijTHTЫ0xЫp 0%Ы0.Ы0048=ЫT0< ҫP pҫЫ ҫЫ1%Ol%|z_5` !D~< & 7DԬFBBF5.&""F700 Ecث*FUNBBPBBPBBP„NP8NP8PPԯPP$8P@8P@ [0"z [2"z [0"z [0"z [2"z [2"z [0"zcc[1!}c?21 J15m1;66r3g14;22;30;38;46;54;62;70;78;86;94;102;110;118;126;134;uw7 V7 T7 R7 P777 FT z H`pŀj   \ |ˋB7 & +v Tv4v*^|xt 1 1 -N7&Ρ` T% wN00HH:TADATADATADATADATADATA7 X|PH& &| HB e& NԷwA%8 .-  H  BҋB  7w7  )+  GOl|Ol|׭L &e " J7RO Բ B7;&@-L1    .7 $7  Bwŗ&ť1 !B <8,& $ ĝ 7D  7B7  Z mB`7 DW W  $ W  JW  n7   } r ln7d T ׭H < r 70&f $ @` E w wf " ŭ  2wB   e  N  Hf Be * "p -(wj@< 0 ,  W!H-ww  &f& v  5 ߥ& *  + 23E Ew    Е-   0@A DW e`fÊ    E &  m  f A N  %w *8I *=)98 0 eB &&  U "**e *Nlv ΋*.2  & #!)&eP(e && >e >E ~p* wb&f 82e&( B0 0 0 80 B0 0 0 0)#0.0+1(e  %&p*w f( f)f )"(. J= . B  E  *(.8Ae f"( UCɗ&+(e$&% **w eE D` bl lrw B  B eE"s    s-  Csl8e2 ..8em,0l0!D0e6p 4.) ^&f (  e) .  e6p 4 &08*w=p!Օ^141612epl2l0p,*146f %8 E D/D!D l0l8epl0pɥ.ɕ w U8UMw w&0,0, f 톇,, w Z     .% eB U5UU plp & NeՀ)*WTQ-2T7 (7 &  7 47 . d# *w! w  7 7 7 7 vw^JF1 @ <5+ Dvҕ[Ҕҕ]v vv    NJ1 1  V\7"7(>w WEw EwE    wP    wP    wP00H-HSBgE NT^ F`ij >Tijw *8I *=)98 $ eB &&  U **e *Nlv ΋*.2  & #!)&eP(e && >e >E rp* wVw w82e&( B0 0 0 80 B0 0 0 0)#0.0+1(e  %&p*w f( f)f )"(. J= . B  E  *(.8Ae f"( UCɗ&+(e$&% **w |eE D` bl lrw 8  B eE"s    s-  Csl8e2 ..8em,0l0!D0e6p 4.) r&f <  e) .  e6p 4 :08*w=p!Օ^&f 141612epl2l0p,*146f %8 E D/D!D l0l8epl0pɥ.ɕ w rU8UMw~ w0,0, f 톇,, w      .% eB U5UU plp & NeՀ)** 5)%Eefffff f% EDD%][%><  01 w (ww ww ww BC "& @SY&*p0p210=E%0=w(*e "f D CB.EJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ vz  DEe    *1  ˕03 "   ˔Ӕ ʥ7   f & >5>Eu .  (e( 1  `((   >: 5 eCe&fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@w J( D $ 8#"#)%ĥ ĥ w 0 *0 @Q$    0 40 60))eB &*   wT . PB5(8e$8w2A&(e 4p8q  (#5=A#@))  *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ lu &* P eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6wX/!0/ l0/!p!0 .=p0p2w BC "& @SY&*p0p210=E%0=w(*e "f D CB.Ew (DB C DBe ?D(e(e$2e (%[]%<>  (1 >> =00l&8el2 0 *e6p 4 8 81416 |  J B 00fep=& /e`pw *) l000IH:TADATADATADATADATADATA, *) $ )*)0,40,6 ŀ7<9x& & & & & & & & & Ε   )) 27?65 7 7 7 ׭u%n׭g  - & ׭9׭/ f\7 V R$z w#D>A B `E`W!H ABC 0w\ 7 7 8  7 8w H) <* w46l0**=D  `p46 4f 64/=  @) 0  8w H46 8 e*w > =00l&8el2 0 *141612epl2l0p *) l0, *) $ )*)0,40,6 w  )   fU 6%  BA `6p 4p`4 %60 4e6p 4 88 481416  n  H b46f %8 E D/D!D l0l8epl0pɥ.ɕ w)"(. 8= . B  E  (.0,0, f 톇,, w      .% eB U5UU 2 plp & NeՀ)*0+1(e  @%&p*w f( f)f z8Ae f"( UCɗ&+(e$&% ,*1 U8UMw" wf *B 00fep=& /e`pw8e2 ..8em,0l0!D0e6p 4.) &f   e) .  e6p 4 08*w=p!Օ^   ֫ .lhj7`~ $7 x  wb`NPJŗ&ť1 !  ĝ7Dӫ  Ы7B֫7 Z m~B`7 tDW W  $ W  JW  n7H  B: 63 ( "$7  ׭  r 7&f  @` Ew wf " ŭ  2w~B ֫ Z e    C@f Be & -w   , W!H-ww~  l7 f&A xx^ H  vA C H\Z HJLNP B` B׭  &)_&& & &  & && && Ε @ 61&  1 )ȋ& & & & & & & & & Ε   1 &   a@ &f& v  w  ť ť 0B Aa & & @( f  e ee e 00 I-HSBgAmҳJ%X%P:%P file ID-%6A-- Open error #%D. on file- %2A%O:%VA%6A-- Print error #%D. on file- %2A%O:%VA%6A-- I/O error #%D. on file- %2A%O:%VA%6A-- Job limit of %D. pages exceeded on file- %2A%O:%VA%6A-- Attempt to space %D. pages beyond EOF on- %2A%O:%VA%6A-- Printer hardware failure code=%D on file- %2A%O:%VA%6A-- LAT connect failure code=%D on file- %2A%O:%VAABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw B&& D¥%  B&ХVA 8 C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& e/& e&J*AHŀ ȕ Е Е Е & e & eЕ A %& eXA B Е A bEA EЕ A A   $Е.  AЕ;    w XD&& bЕ- eaePPPЕ-$w (D  &Е. ce B Е:   <B&  m  f A N  % 5 ߥ& *  + 23E Ew Z   Е-   0@A lW e`fÊ    E &f w8; ^ @U  ,(ŋ?  Ew w w c ŕ  ɕ  E!ŕ  7,@e&f@ 7@lŋ$ť1ť+׭fY ť0  ť$E`͕ w)** 0w*w   | .7 $7  Rwŗ&ť1 !R <H<6 $0ĝ0(7$Dy  v7 B|7 , Z mB`7 DW W  $ W  JW  n7    |~7t d ׭X L r 7@&f 4 @` Ew w f " ŭ  2wB |  e  ^  Xf Be : 2 -&8wzP(L @ ,0, W!H-ww  &f& v  5 ߥ& *  + 23E Ew 8   Е-   0@A DW e`fÊ    E &  m  f A N  %w |) 8C $* ) *w*  fep 00IH:TADATADATADATADATADATAp  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 6p  8 V *`)w C#    D @)  6?0D)w D z) n* wH46l0&f  *) l0, *) $ )*)0,40,6 e6p 4 8  z81416      8  H**  DP5R RRR **=D  `p46 f 64/=  8@) 0  8w 46 8 e*w> > =00l&8el2 0 *141612epl2l0p,*1 U8UMw wV B 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ w8e2 w T ) v  fU %  BA `6p 4p`4 %60 4)"(. h= . B  E 2 (.0,0, f 톇,, w T     .% eB U5UU plp & NeՀ)*8Ae f"( UCɗ&+(e$&% 0+1(e  %&p*wz f( f)f V ..8em,0l0!D0e6p 4.) ,&f f . <e) .  e6p 4 08*w=p!Օ^ \87 4`j l ^ r f =87B TG47 )&f& v  < j 01234567890123456789%4S V %4S%4S%Y%4S%3Z%X/FI:%P:%P%4S01234567890123456789COPY %D OF %DDELETION %VANOT SPECIFIEDˮ P ٮP ҫ%ˮ V!Օ ҫw\]^ Е: V Д eHeB ҫme!=  7% ҫ :@ 8eӥ. % ^ҫVڬRS 00I-HSBgVڬmm ! RS Vm 2 dʝ_ ڬm! . <2  w  ť ť 0B Aa & & @( f  e ee e ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& e/& e(M*AHŀ ȕ Е Е Е & eb & eNЕ A %& e"A Е A bEA EЕ A A   $Е.  AЕ;    w "D&& bЕ- eaePPPЕ-$w D  &Е. ce  Е:   B 5 ߥ& *  + 23E Ew Z   Е-   0@A XW e`fÊ    E &f &  m  f A N  %01234567890123456789%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 FEEDJOB CONTAINS ONE FILE/FI:%P:%PJOB CONTAINS %D FILESPECS&Ϯ P ݮP ҫ%Ϯ %Օ ҫwV*v2H2J2L  rҫme%= P F7%tҫ f "> R eHA eJA AL  >  f% ҫVڬ^RST Vڬ^mBm>m:% RST Vm 2 ʝQ4 H ڬmʝ r $^m-0 ȯ     & & @( Ff  e ee e  w  ť ť 0B AaABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw B&& D¥%  B&ХVA " C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& e/& eL*AHŀ ȕ Е Е Е & e & eЕ A %& eXA Е A bEA EЕ A tA   $Е. \ AЕ;    w XD&& bЕ- eaePPPЕ-$w (D  &Е. ce B Е:   <B&  m  f A N  % 5 ߥ& *  + 23E Ew Z   Е-   0@A lW e`fÊ    E &f .c|1!_1Cx! !B.cB]C!w1g1cB.X}1A>!c1cc1FET1*B>.:#B]FRѹ^A.Fs1z1N!!GB     `    7 ʴC &f& AZAJ090?.$8;*2:0,]<&[6 ,B$N'`!T-ZH &# df Vea00"IH:TADATADATADATADATADATADE E e0  ҀDА  %w D Е  wʴ   @fʴ   L%Fw ĝ>%! h |  ҫV X*V> @ڬ& ( ^     ʴԵ .\XZ7Pn $7 h  wRP>@:ŗ&ť1 !  ĝ7D  7B7 Z x mnB`7 dDW W  $ W  JW  n78  2* &#  7  ׭  r 7&f  @` @Ew wf " ŭ x 2wnB  J e   30f Be  -w  , W!H-wwn  &  m  f A N  %GOl|Ol| D `=1,+ q7 w(eH  % f% %MfVT% N%xQ     z7Ы׭S1ګ@|7y7ip & & & & & & & & & Ε 3w &*8I *=)98 z eB &&  U l**e *Nlv ΋*.2  & #!)&eP(e && >e >E p* bww *eB 8   w *eB 8  "82e&( 0 0 0 80 B0 0 0 0)#0.0+1(e  %&p*w f( f)f )"(. = . B  E  (.8Ae f"( UCɗ&+(e$&% ** N f &* 4*w *BC "& @SY&*p0p210=E%0=wh(*e "f D CB.E Mw*w eE D` bl lrw   B eE"s    s-  Csl8e2 ..8em,0l0!D0e6p 4.) &f  ` e) .  e6p 4 08*w=p!Օ^   f j >5>Eu r  &f 141612epl2l0p,*146f %8 E D/D!D l0l8epl0pɥ.ɕ w ^U8UMwj w0,0, f 톇,, w v     .% eB 00*IeISBg U5UU plp & NeՀ)*|a,`` W =SYTISYSYSYTIOV~ҳZ"#|ҳҳ >"!i   eAe]0^H 2 }f H P 5 W#R ~w)w8(LVv""R%" e^f' CDA>PX00lIH:TADATADATADATADATADATAMMMSMTDY^&.6> n@~f  v@.FNVR   P P n  z  NSYaSYsySYu~먫D~먓sq$CT$u~>MCCCKD8DFF~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~;'yI;U#U]RUfShShyso^?SY2 f| CDA -- Exiting due to illegal trap - Snapshot dump being attempted&.& 2LeG& & & & Le %&<)& & &  DP& & & Ε N  w  %NCDA -- Error writing analysis file%N > > > > > LIST COUNT EXPIRED%6S%P %VPf&f& 7 f&ff&f7 P 0  ee m"  &f BE 5E E&  & ` EEm  D `D E& `D p&&f eZ  f5<2 &  N 8  \  z  W xN  p \ ^T x5f-nj &f-    5 ee f&f D f&fP D Ee0 &fEB   CEX A EmH ,%F CRASH DUMP ANALYZER V %Y %2Z PAGE %D%NCDA --00tIeISBg Analysis terminated after %D. pages%N > > > > > ANALYSIS TERMINATED AFTER %D. PAGESfXjf  & V 7 heZ-*  '  %4S%P > > > > > ADDRESS OUT OF RANGE&f5  V F   e  e^ d A  T%NCDA -- Error reading crash dump%N%NCDA -- Device driver missing%Nm f 5 f% ŝť ťť &  .5 f w%NCDA -- Error reading file %X%N& 0 460 ~  R*eHj &3'&1 $) %,, %X, %/ %:4 &6 &6 &6 '6 |'6 t'6 l&'t7 d2'"7 \2' 7 T2'PL L>'8 Db': <b'; 4n'2> ,n'> $z'8 z'8 z'8 '7 '8 '> '8 '&8 '~8 ':= '7 ' 8 '7 'Z7 '7  (: (dI "(8 F%815ew , Bv     5BwD "z#5  5 2  UE $ #z#>$E U 5@*& E& & f&ËDef Ë )̋Uw (DB C DBe ?D(e(e$2e (%[]%<>  r1 >&ff  <($<( %&+d%$^%. %"%. %.%.:% %%81.%F%81t.%R% 81h.%:%!+j%$%$/^%v%%/^%%&/^%%'/ ^%%(/^%j%)+%$%+-%%,-x%%-+ %$%35%%45p%%5+D%$&6`,%&7`,p%%8+&$f&:-8&*&;-&6&<-dB&&&=,.6&N&>,.6&Z&@,.6&B&A+|r&$&C-0f&~&D-(f&r&E+&$&F,&&G,x&&H+&$ %I+&&K+&&M6&.(M6&&N6&&O6&'P6&'Q6&'R6&&'S6&2'W6&>'c6hJ'&b'kEH>'V'mEx>'J'o6h&n's6X&z'{6 &'6,&'6&'6H &'6&'6&'6 &'60&'6&'6&'6 &'6& (6$ &(6!&"(Ő6\&&X$00|IH:TADATADATADATADATADATA8Ae f"( UCɗ&+(e$&% 0+1(e  %&p*w: f( f)f  *) l0, *) $ )*)0,40,6 e6p 4 8 < 81416 v  6  141612epl2l0pw ww**8e2 46f %8 E D/D!D l0l8epl0pɥ.ɕ rwb U8UMw wv,*1 B 00fep=& /e`pw %. "%. .%.eB  8 $&w |*<S1   K U U@  f&" '&)'&&* *%0*ND  $ EU   w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce <   *5%& w &Ba +- ʥ# . U 0   b   `     (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &w PBC "& @SY&*p0p210=E%0=w(*e "f D CB.Ew P*  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce &e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@ J:%81*;7#3w * *$ ':T U@% DD%][%><w^  wR1  %,,:4 Jĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ z  DEe    *1  ˕03 "   ˔Ӕ ʥ7(e( 1  00IeISBg`((   >: 5 eCe   f l >5>Eu t  &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ w  %ҥ[֥< , (e  5 s  D w j%/ v%/ v%0 %/ %/ %/w ( D 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB 6 L \# U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff  &*wj. nB5(8e$8w2A&(e *4p8q  (#5=A#@))  *R*)@#0l C# 028 00ĥۇAĥĊ  000 40 @0 &*0 @ tu # eB&B vB  * : eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2   f >5>Eu   Mw> =00l&8el2 0 *00IH:TADATADATADATADATADATA82e&( .0 0 0 80 B0 0 0 0)#0.w eE D` bl lrw \  B eE"s    s-  Csl&f w BC "& @SY&*p0p210=E%0=w(*e "f D CB.E f &* *M=f(& e %&&eH =&e0  4U   E > >E=uf p  wX 89f"e\e!e 5f 2* eA &|&  f&&  e#e|& f&&G& & & & && '&& %- %-w *8I *=)98  eB &&  U **e *Nlv ΋*.2  & #!)&eP(e && >e >E fp* w)"(. = . B  E (.=p!Օ^82e&( .0 0 0 80 B0 0 0 0)#0.w eE D` bl lrw \  B eE"s    s-  Csl&f  T..8em,0l0!D0e6p 4.) R&f ~ Z e) .  e6p 4 Z08*w0,0, f 톇,, w 0     .% eB U5UU plp & NeՀ)*00IeISBgw ' UD$BA  &( U BQ Е*  & & @( f  e ee e  w  ť ť 0B AaABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw R && D¥%  B&ХVA " C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& e/& e*AHŀ ȕ Е Е Е & e & enЕ A %& eBA Е A bEA EЕ A tA   $Е. \ AЕ;    w hD&& bЕ- eaePPPЕ-$w 8D  &Е. ce  Е:   &B %6 %5 %5 % 6 5 ߥ& *  + 23E Ew    Е-   0@A 4W e`fÊ    E w H n832cd& & & B  2OΕ   N Υ$Ε  22Υ   v Ε f e \* e*w@)0,   V) `)(   =  l 0l   0/ e&=Ba@a Le0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  ,   w>  JwB # f  `* wt)0406 l0 8  >**  DP5R RRR  ..8em,0l0!D0e6p 4.) n&f 0  Je) .  e6p 4 08*wF> =00l&8el2 0 *w 0,0w  &4&6= 64 wz%!64=5 v2 6  l0 & Z46 64 :)0406 0 *0e6p 4 = &   `@ ` B   & A @    &  m  f A N  %&f =p!Օ^0,0, f 톇,, w      .% . eB U5UU  plp & NeՀ)* 8   * h 4 6 e6p 4&*00IH:TADATADATADATADATADATA %, &`, &,w $0,0w: 46  )0406 0 *&4&6= z64 wz%!64=5 N2 6  l0 & Z46 64 :)0406 0 *0e6p 4 = 0,0, f 톇,, w 4     .% eB U5UU plp & NeՀ)* 8   * v  4 6 e6p 4&* &- *&- 6&.w ) 8C 8* ) *wx*   Nep p  އ#= EW9ť^*0 ` Ca C  = L  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  , J *` C# <   D @)  6?0D)  DP5R RRR  8   **)  x &..8em,0l0!D0e6p 4.) R&f P , je) .  e6p 4 ,08*wf0,0, f 톇,, w      .% | eB U5UU l plp & NeՀ)* B&>. N&,. Z&,.w   w  ,,  *00IeISBg &f D E/fC A B f&  rBeA @0 (@0 na@eA  B0 VAB  @f  C @*&   `@ ` B   & A @    =D `p46 f 64/=  4@) 0  8w" 46 L8 e*w0 0,0, f 톇,, w      .% F eB U5UU 6 plp & NeՀ)*w B ) Z  fU %  BA `6p 4p`4 %60 4)"(. = . B  E (. ..8em,0l0!D0e6p 4.) &f  e) .  e6p 4 08*w=p!Օ^> =00l&8el2 0 * r&- r&- ~&-w ) 8C $* ) *wx*  bep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 2p  8 V *`)w C#   D @)  6?0D) 8  R**  DP5R RRR 00IH:TADATADATADATADATADATA &, &- &-=D `p46 f &64/=  @) 0  8w 46 x8 e*w( w ,) H* "w46l0w  ) D fU T%  BA `6p 4p`4 %60 4)"(. p= . B  E \(.=p!Օ^> =00l&8el2 0 *0,0, f 톇,, w      .%  eB U5UU plp & NeՀ)* N..8em,0l0!D0e6p 4.) &f x T e) .  e6p 4 T08*w5%& w &Ba +- ʥ# . U 0   b   `     f&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0 'Ef&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 e00IeISBg %NCDA -- Unknown get command line error%N%NCDA -- Command I/O error%N%NCDA -- Indirect file open failure%N%NCDA -- Indirect command syntax error%N%NCDA -- Maximum indirect file depth exceeded%N%VA%N* 0 b p f `ť(ť ťťť6 6 67>7&h&fn7 U w 5 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 jjlj ɥ@@aujk,bp j5f fˇ ȕ V‡ eSY e,5 funhwe,aja`W- f00IH:TADATADATADATADATADATA`nw^uhnw@ DlljaCeH###33 & 8 *99w  8jDl@ XTeBT85l@ @( D eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ `%,, X %T+ P^%L+ Hf&4+ @&+ 8&+ 0&+ (&+w &*D  w 0+1(e  @%&p*w f( f)f `8Ae f"( UCɗ&+(e$&% ** ACTIVE TASKS SYSTEM TASK DIRECTORY (PRIMARY POOL) SYSTEM TASK DIRECTORY (SECONDARY POOL)6hd 7 6Ttv6V%77&̎7 ̦̲e%77n̎hd7 ^̦V̲J̷eF̖%56e56  e5  &  6lU6  ePͳ  -EXE@ RDN MSG CIP RUN 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%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:f&f7 e5UCe"Q$"~ "| e# e$WUP e$KU8  e$|U 00IeISBg99 ~H5<ˆ Ce&ee9 B Ce&e5-e l· e eT³ e$e `4 r lCe$ fe!C  :%xO: ȅCeCeCe&e5    e   Ce : Ce(Cee: Ce : E CeD8  ; Cev8 [; 5 5* 8 f; Ce8 J< dCe069 .Q< H<̂ C5Dm AA @e% e % eƅe ^A e e~A eA ~eA jAeVƇffe w7 5@Ce5rv <<e9^ F3  Oee5V= Ń j6 z< 2 eE555(eH few7=D= w9weeQ= 7 xp= EË )%;%?%C%G%K%O%SwEU%Y%]%a%e%i wB?  b?$u?n?g?`?JY?R?K@D@(t=0@f6K@ X/t@ J(@(> eeI> vee> 5 4> f&fe;? .?E ^ec̕ %̥  W!PPb%6<%2A%O:%4>NONE f&f6&& J!eeCeCe jeC`E~J޹ *eԹ ffJ  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 ]K7CKee 5UKeeKelK <K VDL ee `e`B eeJ  %X,&  m  f A N  %MAINSUB TASK SYS RW COM RO COM DEVICE DRIVER SECPOOLCPU d[]<>!+()7/888r8 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%P<7eXT7eLm77 <07 j~%V:V:ʎ7 ʦʲ7w 6 Xm  ^   F jw fvve h QFeF%V:V:&4ʎ.*7 ʦʲ $% E 5`w e  w5dɷeɖ%%Z:Z:xɎrn7 fɦ^ɲ00IH:TADATADATADATADATADATA7*6  62e2%Z:Z:& Ɏ7 ɦɲȷeȖ%  j8- 7!-- b8 A7!  Ї 5:x8 m ԐAbA&A<${ 7$e$7  "7 &7 P .*75@  e  e*e& 5@Ue*7(7~(7e,77.7Aj8  j86;6 <6 <6 <6<6~<6<6<6<7!$5* .5U-  67!6 7!656+5'6$6565 65U - 65@~6  "&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 >D?1P?7!5 %5 e=?5 56AL?rdb@7!\"@ Pee><@BН$НН6Н1 h=&@ V  R>x@ <΂ e(  7! e eʄ ffJ  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%lfB e@eBe5q5e5fe`Ce %B BBCeeeCeC27C TCCBCeeeeCCe e8LJ J'.F V'"E#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 (Ee2Ed` CEEe   eeee 5@Ueeeee E e&E  Fee00IeISBg%6SWAIT QUEUE:&feeCEe2E  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 %4AEE&fe <eenE F %6<%2A%O:%4>NONE f&f&& F!eeCeCe VeC`EF e  %X,&  m  f A N  %777[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]%N5\ 5V HPB KH9||F9@ D D D D D D eD  \9 & @9eD  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; <% ,& n7< d w`; rew  7 * + - 00IH:TADATADATADATADATADATA 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 BYTES = %P00%6SFIRST FREE BYTE = %P00%6SLENGTH = %P00 BYTES%6SSTART ADDRESS = %P00%12SENDING ADDRESS = %P77;H ;e  <@<=eP̃ H7 F7 <0 %"7    $7    j< ` :e5@f a|= 8=e,=~eP = Ee-HB@ Pa>e B B B B B B D D D D D D `D `e?  &6&f  ^  6 e AP P z  ;R M<& 66 T  J6h X 6X .6LJJf&;7 @ ><8R$  *" @%   Z< P$ ;R 6; RS 6M<e 7  7z&f&f6 XɎ (  F6"   ( 6 C f5--H= 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 B 7!w!7w  BfB eD BB7 R$   7 7  &ff NJeDB@ Pp pB >B% ,& DaB : w`B rew  7  @ @f&  `E L\:D  % & `E <:D&  m  f A N  % 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 6ze(|z6we w-J-B e&e5wbe7F66e5,6+7el8wV5 e057+7e`e&Ce  Ce   G7e eCe$w%e& Ce  FE`5w,Cewe Ce 00IeISBgCeCe5-- ^U@-- E77 pn^ VmXB % B eB eD &f !8D8  ee weɳ efv7 7U 5 5U0w5@87 %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  "eF% p>>?6?j??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 mapping6l6tz|5lfxv%5 % |7 e7fE5 B  L7 D 7 >  0 ,6&fe AP P &  d 66R 7-7 f&667 R$   3- t#7 !f6R 66RS 67ex (7 "&f evG7ej҅26:7:7;47: 76;8=8=8&> BSY@-MNT FOR MDM OFL-RED PUB UMD PDF SIO@ TRN MUN MNT@ F11 COM PSE OSP ISP 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 00IH:TADATADATADATADATADATA%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 T9D%BB2Ŏ,(7 ŦŲ6 CeE%TTUeCee  ?^6wlETCeL55<U45|5&CeCeCe5 Ce5wC &i9o9 Zw99PCeCe J < Ce5]=65  Ce Ce 5p:Ce Ce :Ce5F:  v> 7 ef56CeD %65@>9 A @  e2<Ce E d  7 t5@xCe7 bwV5Vn=5P$5@H ċ XCeY 5(S5@ O= < ? 9Ceee ó e  eC  eC eC   Pó  %= Ce5$A=Ce& Cee%MTJee E eɅm w%ewfC5  >  n > xm mx= Vdz=x6C Ce  pe 4 ‹ECe  *v ; v;< &fPCe CeCeCe5 E5><+Cee&Z ~e eB e>0V  c<Ce n. C( feC%#eC%_e C e  %6<%2A%O:%4>NONE f&fֿ&& D!eeCeCe eC`ED~ et ffJ  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`{fIE  ؙ %X,&  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%100IeISBg0S -------------------%4SHEADER:66W%;;& ˎ7 ʦʲe%^9^9ʎ7 ʦʲʷeʖ%e5 e&e5wR6wR( 66 e&˦ e e6˳ 6 F&Ce:%e % Cee  7 ѐ%Ce7 Ce CeCeK7 CeCe$Ce<7 pCe  Ce  7 FCe$Ce:Ce.Ce07 Ce&Ce(Ce*Ce,48e ep88 5@e05 e88U e8Ce %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% ;F<<<<(=Ce 2E`5>Ce  eeCeCeCeCeCe Ce eCe Cee >+?X?e?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%Z>eq>>Ce> P eE (%  A ? 7 e &fL>z&@Ce  Ce  ef4w0? &ÁwdCeE%ICeµ`B-? :P>ee%.-n'B  H>eeeeeij    &e/e5'7 e<e&e5e mX3 3 e  < %6<%2A%O:%4>NONE f&f&& +B!eeCeCe VeC`EB> e4  %X,&  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<<<<<>>>>><7z7777 փI6H A8= eP6ťťe X%ee6  &  Eez f&f&e  eB eA eA < eA < eP\7 ҅f&f%ee eee % e8A  |7 r҅5 eT7 Jұ&   `@ ` B   & A @    00IH:TADATADATADATADATADATAQ6^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%2&6PH6 4,0(  \elC  Cex^77 %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 ;,5`I;; ;C;;e CeCe Ce<;‹;P9   x w6&eD fEEe E eD & w8 N\eD   8v& x"k6 w& Y 77 t<sE ; EE`  q<ѝxs~<$9Y E6  9Е,Е P 99< ̀= % %@& ӕ%ӕVӕA!Q q<`st< QeL< BK: eCee  Ce5 Ce 5Cmf  J<@  ˁm %e eC00JeISBg! e~< tB: @77 e*- & (<eC' B$~A` Z e< A@:  < " &:ȋЭ1Н)d%6<%2A%O:%4>NONE f&f&& A!eeCeCe xeC`EA 8e &f& v  n%X,&  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.%N5diU\& & Y5L]ez66ͷ d06 &p77  7PP'76f=ABC ̂ ́ e e< e<PU7ej75G5?N 89f"e\e!e  5f h2* eA N E  50 `& & & & & & & & & Ε &|&  f&&  e#e|& f&&G& & & & && '&& %,,%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 @@>&A 8(56565`6 4 *45  ,55@ ".5 # 6778& 667 7c777 2,*<7 7 7 7 n 2 5Mn w5Eʇ >ʇ 7ʇ 0~Ṅ5(5$z w5t5l5d D@    eE 7Nʇw75`*6\ U z 5 U@ wwN7-@ - w67ЇЇ5@p 1 1  W  n f wh>55~65t5l7 7 7 * w w w  vw  w` 5 5~ znlʇ 5 5L H<:ʇ |x.ʇ nj"ʇ5^XXTʇ5HMB >ʇ 4C5.?(ɇ 854ɇ -5)ɇ "5ɇ 5ɇ  dχ5 ww 6 E\6 1~5B(6 #0 , 0 0 6 -D >-6 6 &w̥, 6 `-m.6  6 `6 %7  wn  wbee7 &fwlh 7 `7^b @,q `-KacJE[ !m"@  ) L R  7 f@  &  5]U E :&@E A  ̆  E vE cPN 941 @  . &f ?     8  " .$  ̥ZḀ90     w (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA bEAa$EXITLIMITLINESSPMEMSIZSTBALLCLICPBATLACTSTDTCBTALHDRDEVDCBSCBUCBPCBPARPOOLPOLSECPOLTISTDSTASADVTSKTASKDMPDUMPKISKDSKMRBLCLQCTLDECNETNETCACHELOWHIGHSYS00 JH:TADATADATADATADATADATA?????@@ @ @@@@@!@%@)@-@1@5@9@=@A@F@J@Q@U@Y@]@a@e@j@n@s@w@{@@@@@@@@@@8=A,rAțC9/&AA-DA.9TAbAjAA:\AA†>9A:†L9A:†Z9AțCh9/AAA:†9A9ȁC,9A/Aʆ9$<A9A,AʄC C CCCCCC@CCCCCCCCC |CBB\C\C\CC\C\C C CCC CCCCCC@FC-6CDENSBCICCTCCYCC=C:C :0C":0C(:0C0:CC=RC:RCC&=CC=dC:dC΂l::pCC‚::†,;C:CC‚`;:†n;C:‚|;:‚;:CC†;C:‚;:†;C:‚;:† > > > > 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 = %P5w>lt%|f %|x<l  ee %`$շ@ eeee5:wJ6 :6%­ |9i9e,Ý mpʋ%hb6e9 -wD 5P66 %   9  ,7 l  K7 N {7e27 7%87  $%+ 8 8 8 |8 n8 d8 ZD8 P8eA9 eY9   h8 b8q8v   wz -5 lf |  %9'9  h7 ^7  0 ` &8%L%8 0 &f  %  C CE e) @%<%8%%$-x5x-j %ÝN m 5J  2%e&e" ,bhtz".p|4:@FLHNZ  Z2r>D LOWCORE ALPHABETIZED DUMP %2R% %7S%2R% %7S%2R% %7S%2R%????|? H>7  N? .? &? ? ?   >& x^ d^Ze TVXZD>q> >@>>?+?U?u?? ?@??'@L@@@@ A@3AeAAAA B %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. 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 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%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%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%00$JeISBg8SSYSTEM HAS COMMERCIAL INSTRUCTION SET%10SFPP%8SSYSTEM HAS ENHANCED FLOATING POINT PROCESSOR SUPPORT GROUP GLOBAL EVENT FLAGS GROUP NUMBER =%O ACCESS COUNT =%P GGEF DUMP:5w<>E805bw7޻ ee eEe 8e>%-*(8Q8 #l8  6D a Ta|88 ^ w! jP ewT E Ń  8 z19%J8~e LP wй~ă  S9 PZewEEe ex9 9%b%Z99 *: 6  eR: z6 ^e`{: Vֹ<7 :ȹe<: 2x7 e: 7 e: 7 5H  eC56Ie eCQ;ξ 7 7 7 7   w 5we` `pw-k i=fv ~aw!x^n |   R  @5B<4c; "}; ;  ;  ;ep;  e % ee =< e< %;;;5 DeDe*I ʽVIe Ce%8S%VPf&   b  N  @ @f&  `E L\N  % & `E Tpnj,B2&JR:J\d8("^|.~x*N$<HBd&F@LXR^ :\ tPJV &6*4(`rlb>tz Xbl8fn0<6jTzv,hnD$DPhvbhz 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 %PQzQQQQQ & &28,2>8>DJDJPV\bhbnhzntz (4:@FLRX ^djv"(.4:@FLR X^dj$*pv06<BT|`lrx~  &,$*06<BHNTflr8JPV\bhntz SYSTEM COMMON ALPHABETIZED DUMP %2R% %7S%2R% %7S%2R% %7S%2R%FTRT^TjT  rQ E7rR`-f:)Q p7 R-<@R -.4R R -RR  e A &f :0 w&fm-e e  z7n@`7j@`7f`b-b\ZTC P eQ VO QT| DRb JtT xT |T T @T  &R VN e w w w w wW TD# DE!T5S   "  4S%BέPw­1S%P TWWWWrWxWWW 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 LW|e*dW  ABWe*WD%̼  A8W س&  m  f A N  %00,JYJ:TADATADATADATADATADATA 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 REGION6e> 66 "vJ $D!N <!FCf&e Ve LBe!*e ,e "-e!eC7 7 7 w>x7 8 w*+8 ee5e J7we N ,  :  E   D D D D D D f& ee08dee $eE`7@6 777eA je2:`D jeD  , `D JeD   E`D eD  8n c8 f&f8P eD eD D eD  e7&  m  f A N  %|,r, QW Aja00ZJeISBgTISYSYSYOVv0jvRdLt00)LB:[1,6]ACNTRN.SYS*Hjlpx|",0Djtv".`v~ڢ+wwwlwpw\0vf h5nf R x@m|\ȕ 8pVw,f5 f *DIAG* *WARN* *ERROR* *FATAL* I/ODSW???=Ԥ -- DE-ffEĥЕЕڤ  Е Е ?d ^ P Е.Е %  `-h7be~ A & & &  && & & Ε )Fe "Z f&P&N&L&J&H&^&e\&e*+   F ߦp abneɋee R *$ ߥ PR >2ߊ5 ,ߊ5E4ߊ5?E45 @ e?Wt E54mpEfߥ)5^/ T?B Bm: _2v2 m d`5 6* *T .f~?~! ~4/U ( @U@m~tߥ.W0 2PR * *E@Dj6R&,(U  &zSY 0    f v~41& F b5bΥ: Υ ΥΥ/Υ   X~ ^  mЪ05$   Q3+ЪA  톃<" 2-BЪt"rr l v< 3 W s: w  ť ť 0B Aa & & @( f  e ee e &f& v w h ' UD$BA ~&( U BQ ~ Е* /_ ,Ry~ɠ,ɱBWݬƥ#6&8Jj}f USystem command handling errorAccounting not supported in systemPrivilege violationAccounting not activeUndefined message number %D. at PC %P Directive error. $DSW=%P PC is just before %P FCS %3A error code = %B %Nfile: %2A%O:[%3A,%3A]%X ABDEFIMNOPQRSTUXYZ<> HPjll` JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC<00bJYJ:TADATADATADATADATADATAJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA x C e!  aebE  Е%̥V A6D Ћ  AP AЕ Bf >  & e 6& e /& eh*AHŀ ȕ Е Е Е & e & e Е A %& e A Е A bEA EЕ A NA   $Е. 6 AЕ;     w D&& bЕ- eaePPPЕ-$w D  &Е. ce h Е:   vBw X&fe&  w <&ff=elC    5p   d     A &@d &@ &m rM fM` ZM`5u  F @ @ e@ M`u 5`B/W @ `u  #;eu o eA ZeS S S B DCeS S S A 2eS S S B ee *@    e  T T T T H1CdT T L $)dL t dL d  '&1 x    | t5ew , Bv     5Bw$ Dc 5  5 2  UE ` d ^E U 5@*& E& & f&ËDef Ë )̋U&  m  f A N  %&f  5 ߥ& *  + 23E Ew    Е-   0@A XW e`fÊ    E &ff 5%& w &Ba +- ʥ# . U 0   b   `     w eE D` bl lrw D  B eE"s    s-  Csl&   `@ ` B   & A @     xlxxx lx lxTl*x l1xl?xlx@H̻`DػFH\IDLhMh NhP PD,R8S UPWX$h]l̻00jJeISBg $SET SHOWSTARTSTOP ACCOUNTINGNOYES@|z_M 5 E ܼ D ' f f wvf  f! f" f# vf$ h CRASH_REASON EXTEND_SIZEFILE POOL_RESERVE SCAN_RATESTATISTICS_SCANSYSTEM_STATISTICSTASKZѥ/ d>8Ȣ   E~U(,ɥ ѥ  ѥ: 5VUNE@wwpww5*U"t8 ɥ ɥ  :707P@ ¥ ¥ t8 5Uʼ fU 8 5E 8E@85@U@ʼ $UE5\ U@5J5 U: w5.wU"@ &¥ ¥ ¥M¥SwWp<wt8¥  5 wU ʼ vw48CLEAN_UP MAINTENANCEOTHERREBOOTSCHEDULED_SHUTDOWNSHUTUPREASON FOR SHUTDOWN? Lѥ/5 2ѥ  *5(#B H, 0PU78 0wPw0w EXTEND_SIZEFILE SCAN_RATESTATISTICS_SCANTASK OPTIONS? Zlѥ c n6 ~7 H<ɥ/ ѥ  IB` R Oѥ:< jɥ ѥ 25@PU@漦e5@J5 5Uw 5Ew5UEwww DATATRIEVEDTR INFORMATIONTRANSACTION_FILE ATTRIBUTE? OUTPUT FILE? ѥ X BUɥ/ ѥ  JB t Bie 07ɥ: b7J7L7N7P7R7 &  mѥ  B 07  ɥ wFw r7 4 5w2 2 4 wh 2 wV7 ɥ ѥ  @ɥ 7 އ /:,+- 7 ɥ/ fD |2wfe ^S   P   `E   ~  x` Eew &ȋPw ZP&&fx r.tt Z BŴ B x 0   &% &)f@ɥ ɥ ȕ   ɥ!ɥ "ɥ ɥaɥz P  6  ȕ   ,Е Illegal command or parameterCommand or parameter ambiguousSyntax errorTerminal I/O errorRepeated or contradictory parameterRequired parameter missingValue out of rangeSYSLOG not active2w5w  wPzr 7 $lhfb^`\B><~8z4x6v2trW,UwT UwJW, Uw 2W"Uff t "e \ 0 we fM fU  Vpp f JVȕ ƨ\$p >(@f N#  eBB 99 f  00rJYJ:TADATADATADATADATADATA> 0ƨ&& 8#-&& FFf f   RB Ee`%>  D~%> b  >%>  ƨ fƨeq q"9q,4&& & 00  & & & & & & & Ε U)O  n<& ff& & & Ε ) *eq  f  f  f   f   >ƨ  Zf   Error bit set. Cleanup before restart.Accounting not activeIllegal filenameCan't open transaction fileCan't write transaction fileCan't init new blocksCan't init new blocks. I/O error = %BCan't write attributes. I/O error = %BCan't write attributesCan't close transaction file ̻ ػ P hw wwvw $0,0w 46  )0406 0 *0+1(e  %&p*w f( f)f  8   *   4 6 .e6p 4&*&4&6= 64 wz%!64=5 2 6  l0 & Z46 64 :)0406 0 *0e6p 4 = 0,0, f 톇,, w      .%  eB U5UU plp & NeՀ)* *) l0, *) $ )*)0,40,6 8Ae f"( UCɗ&+(e$&% **@zZrN vH Tʚ;@B'd   ACCOUNTING DATA - 00-000-00 00:00:00CURRENT FILEUNKNOWN TRANSACTION TYPE: (~ȑ5Ǥ JȲ LP^^TV\ & F&'&: :&F 8S >&a B&m&v &ȁ dž ^Ǒȕ8ɝ (ȧ <ȱ ȼ&6 & & &4b  ^  @ B!60 (:O&d.&h &v &ȁ5dž D&ȔH&ȧL&ȸ P R 4b <b^   & ^15=^B  I$P (Z&c "bq 'L@4x fQxYz' x ^ǃȇȏǔȝȣ ^DZǹǿ  ^  <$*^>&E&NfwLjǙ"&Ȫ()^*00zJeISBg"^2*B ,P &^ (l .z0Ȕ Ǯ ^ǹȽ  ^   &Bf< ge bҼ5 fBC ҼƨҼ N/&  me  ы w 5 wf< ށ 5v ƨ 5f Bw B:77   v%7 f  | + FCeJe ( ef  t n &ÿ ݜ ^ BBle eC  Е= CCaBwB eBle eC  Е= fC DDa Ble jeC N Е= CCaД% ЕTCOД f Е:Ble eC  Е= fDDa H P4@4@:  Ble eC v Е= CAAa% % %AAE & %@Е.e Bl .eC  Е= fҾAAaS fҾ  B  hw@& fBe eC Е= Е[fNa Е,` Е] CweCa% B & T 5CB (efC 4 xe  ˋД &7值`%PC&5 Z%[壿  ':值5FB f( e7wxnCB > 0Ҿ=w,&fE&.@AC   llC bA  e0> e B 0 A@|Bl &ХTХI oХSХYХSqХT ХAХSХK Х=7 f wX wL \) ,%COl 5 CmwdҼ x݇% /f& ؁wf' ؁fO ؁wmd rҼRw 7 ()7 "   mf7TҼ ܇ -&~  Ҽ5u u C0CC. C5 \<@ԀSYz_M)!ƨ2Npp f@ ց ȕ $# fA ց ױeBsssa(s s Uz5r# 2  ^^! (./23 "&A &&M*&^.n 0z Dž w (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA JEAa$I/O errorNo accounting data presentDevice specification errorTask not in memory or not activeIllegal file nameOpen error޿hР(£2±JJJJ tѪ.H@]њ|Total System StatisticsUser - Task - Accounting StartupInvalid LogonSystem Time ChangeDevice AllocationDevice DeallocationDevice MountDevice DismountPrint JobLogin - System Crash RecordDevice StatisticsReset Transaction ParametersCard Reader Spooling TransactionAccounting StartedAccounting StoppedShutdown CodeTrans File IDSeq NumDeviceStatistical Scan Rate (sec.)File Ext. SizeTime Of Last ScanScan Rate (sec)Total CPUZero CPU IntervalsTotal TasksTotal LogonsCurrent UsersCheckpointsSHF RunsDirectivesQIOSSession IDTI:AccountLogon UICLogged onLogged offBilling StoppedCPUTasks ActiveTasks RunDirectivesQIOsStatusSession IDTI:AccountCurrent UICProtection UICTask NameTask Initiation TimeTask Completion TimeCPUCPU TimelimitDirectivesQIOsTask PriorityTask Context LoadsTask CheckpointsDisk OverlaysExit StatusAbort CodeTask StatusT.ST3Accounting StartedTI:TimeNameUICOld TimeNew TimeSession IDTI:AccountTimeDeviceVol IDOwner UICACP NameVol Prot MaskStatus00JYJ:TADATADATADATADATADATASession IDTI:AccountTimeJob NamePagesFiles PrintedPrinterFormsPrioritySession IDTI:AccountLogon UICTimeTime of Last ScanScan Rate (sec)Restart TimeReasonTime of Device StatisticsDeviceIO CountWords Transferred CountSoft Error LimitSoft Error CountHard Error LimitHard Error CountCylinders Crossed CountCurrent Fairness CountFairness Count LimitOld Trans File IDSeq NumOld Device NameNew Trans File IDSeq NumNew Device NameOld Scan RateNew Scan RateOld Ext. SizeNew Ext. SizeOld Statistical Scan RateNew Statistical Scan RateSession IDTI:AccountTime of JobJob NameCards ReadCard ReaderUFD TOTALVOLUME TOTALUSER IDTI:ACCOUNTTIMEDEVICEVOL IDUFDUFDS INCLUDEDBLOCKS USEDBLOCKS ALLOCATEDNUMBER OF FILESNUMBER UFDSEMPTY UFDSNUMBER ERRORS $(,048<@DH`dLPTX\ ̻ ػ D \ \ h<(5JLPT^TV\F:8>B T8J(<64IJ T@JBJ62(.5DHLPR4T @ TT   'L@4x  T2T" TJ<*T"()T"T*,.0&( T2T Se& e F52ƨ x' \ e  ыw <wfN , Jƨ  w B7  2   vzhP CCaB  Ef&C DDa e CCaД% ЕTCOДf   efDDa   e fAAaCE Cы%f% PfAAaS    @ePPP@~LffNaЕ[ ` Е, Е]  7 dCCa% B& T 5fC4 l (  ` Д xz X <z zw~<@ԀSYz_M)!ƨ2Npp ,f@ ށ ȕ $# fA ށ ߱eBsssa(s s Ul00JeISBg5P#  TT .J2"&*.0I/O errorIllegal file nameOpen error|пHRn~~~~ƞ@\ (̻ ػ  D \ \ h ѫC z_MdѫCSYSTEM TASKS rѫCw5Hw hw nw7 ( w7|5e wr75  hawVw XwTljdfff e D  fwԾ5$r 6r ( d ( z lkzU@ D% 6 5e P ? ? E@ +)E@d   bwwT e f pf bf Lwf <w ƨ Z F f   . `pp f f ȕ P ƨ$p (f & N#    eBB 99 f * H0<@ ELB0:[1,6]SYSSCAN.TMP;1<@ SYSSCAN.TMP;2ENTER: VѫC @ 0$# F *qfI fX 4- X=B   ,($1  ƨ L*fJ  " $fK  rX    *fL   ?f9 & & & $& & Ε & & & & <& & Ε f: 2 >*  “ 1 ƨ f5 ߁ Tƨ&& 8#-&& FFf ݁ ޱ  RB Ee`%  D~% b N 6Ň%  ƨ ƨeq q"9q,4&& & 00  & & & & & & & Ε U)O  n<& f00JYJ:TADATADATADATADATADATAf& & & Ε ) *eq  :f  ܁f  ܁f  ہ f  ہAccounting already activeError spawning SYSLOGSYSLOG not installedError bit set. Cleanup before restart.Secondary pool allocation failureBad SYSLOG queueAccounting system not startedSYSLOG exit with status = %DCan't close transaction fileIllegal filenameCan't open transaction fileon scan file openCopying scan file to trans fileOn scan file closeOn scan file deleteEnter reason for the crash (Maximum 60. characters)Terminal I/O errorCannot write crash transactionCan't write transaction fileCan't init new blocksCan't init new blocks. I/O error = %BCan't write attributes. I/O error = %BCan't write attributes ̻ ػ P \ hw * 8B pB  p0 B w www $0,0w  46  )0406 0 *  f &* ***eB  8 $&w *<S1   K U U@  Nf&" '&)'&&* *%0*ND   EU   0+1(e  V%&p*w f( f)f 8   * " 4 6 e6p 4&*&4&6= 64 wz%!64=5 2 6  l0 & Z46 64 :)0406 0 *0e6p 4 = 0,0, f 톇,, w ^     .%  eB U5UU plp & NeՀ)* *) l0, *) $ )*)0,40,6 Mw*   f  >5>Eu   (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w & *$ ':T U@% DD%][%><w  wL1  %,,:4 w l*D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce   &*w |*  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce 4e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` n*weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ w hBC "& @SY&*p0p210=E%0=w(*e "f D CB.E8Ae f"( UCɗ&+(e$&% (e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ z  DEe    *1  ˕03 "   ˔Ӕ ʥ7&fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@00JeISBg)7 w 5Ff F 50f3 0w Pj5 f:@U@ 5 `? ? AmA Am E* *A  h5 E 5AmvA z Amd 6  n ~E@F r2  r 0 7 \ ~wwAccounting did not crashAccounting had a fatal error, must be cleaned up 8e2 **8Ae f"( UCɗ&+(e$&% 0+1(e  %&p*wj f( f)f F141612epl2l0pw (DB C DBe ?D(e(e$2e (%[]%<>  n1 >e6p 4 .8  81416 (  6 ~ 0 ..8em,0l0!D0e6p 4.) R&f &  e) .  e6p 4 808*wj0,0, f 톇,, w      .% P eB U5UU @ plp & NeՀ)*,*1 U8UMw wt *) l0, *) $ )*)0,40,6 |B 00fep=& /e`pw=p!Օ^82e&( ܀0 0 0 80 B0 0 0 0)#0.> =00l&8el2 0 *w  )  fU %  BA `6p 4p`4 %60 446f %8 E D/D!D l0l8epl0pɥ.ɕ wf&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f eB  Dҁ CSĊ  WC E 00JYJ:TADATADATADATADATADATACs Ε 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 w BC "& @SY&*p0p210=E%0=wl(*e "f D CB.E h h w ( D  8#"#)%ĥ ĥ wn 0 *0 @Q$    0 40 60)) L L \# U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff  &*wj. nB5(8e$8w2A&(e B4p8q  (#5=A#@)) *R*)@#0l C# 028 00ĥۇAĥĊ  000 :0 @0 &*0 @ u # eB&B vB  * | eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2   f  >5>Eu   MwM=f(& e %&&eH =&e0  xU   E > >E=uf Xp  w f &* * , 8eB  8 $&w *<S1   K U U@  f&" '&)'&&* *%0*ND   EU   &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@(ef  Ee2 UfD Ԕ %:ԕ: f& f00JeISBg&f& & Ε lle  &*;7#3w *$ ':T U@% DD%][%><w  w.1  %,,:4 f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ Jĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ z  DEe    *1  ˕03 "   ˔Ӕ ʥ7w ρ %ҥ[֥< , (e  5 s  D w(e( 1  `(( `  >: 5 eCew *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce l   ~*w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ w ( D  8#"#)%ĥ ĥ w 0 *0 @Q$    0 40 60))eB &*   wT . PB5(8e$8w2A&(e 4p8q  (#5=A#@)) j *R*)@#0l C# 028 <00ĥۇAĥĊ  000 0 @0 &*0 @ fu | n* J eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p200JJ:TADATADATADATADATADATA(e(BA &(e(H0 (A f( (Af((AD&()&pDCe(e$fҕ[ ,ҕ, "ҕ]e(0 >E 5  e0Ґ w ) <8C 8* ) *w*    ep p  އ#= EW9ť^*0 ` Ca C  = L  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  , J *` @C# |   D @)  6?0D)w 8 ^n832cd& & & B  2OΕ   N Υ$Ε  22Υ   v Ε f e N* e*wz@) *0,    ) <)(   =  l 0l  6 4/ e&=Ba@a e0b ee@ ` Y= E8 el0  & 0 l0`p l064p 4 ep )wV%  ,  N \w"  J ,B # R f  `* \wL)0406 l0  DP5R RRR  8   **w   fw  > ,,  *) V  =D  `p46 f 664/=  t@) 0  8w 46 8 ve*wr &f D E/fC A ӃB f&  BeA @0 (@0 a@eA  B0 ӀAB  xӦf  NC @*)"(. = . B  E  (.w *8I *=)98 eB &&  U **e *Nlv ΋*.2 v & #!)&eP(e && >e >E :p* "w)"(. = . B  E V(.|,== W .00JeISBgSYTISYSYTICLOV~~~Z#$|~File open failureFile read failureFile system failureFile close failureFile deletion failureFile write failure ACO -- Illegal command line SHOWSYSGENRK05RK05FRK06RK07RL01RL02DOUBLERP02RP03DSRS03DSRS03DSRS04DSRS04MMTU16MMTE16MMTU45DBRP04DBRP05DBRP06DRRM03DRRM02DRRM80DRRM05DRRPXXDRRP07MMTU16MMTE16MMTU45MMTU77MFTU78EMML11AEMML11BXXUNKNOWN  (08@HPX `"h(p)x*,AHI000023244453707A73838423-PLUSLSI-11/73KXJ11%NProcessor Type: 11/%I%NProcessor Type: %I%10SMemory Size: %M. Kw%2NOptions: Name Vector CSR Unit Type Remark Mixed MASSBUS devicesTM02TM03TM78Priority %QFailed to interruptSector interleavedDual access%2E%E %P%6S%Q%21S%N%VS%I%N%29S%5<%I%Q%5>%2S%9<%I%9>%NQ_ 6 _  I a Floating Point Processor (FP11)%N Commercial Instruction Set (CIS)%N Extended 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 Programmable Clock%N Extended Arithmetic Element (EAE)%N Parity Memory%N KW11-W Watchdog Timer%Nq O O O O ( O O O .ENABLE GLOBAL.ENABLE SUBSTITUTIONS.SETS A "A".IFF $ACFDF .SETS A "$".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 4DM <DL 4DP 4DU $MU $CT MS DT DX DY DD LP$ MT* PP0 PR6 YL< YHB YMYVH YZN R$H11R$K11R$611R$L11R$P11R$UDAR$MYAT$A11T$U58T$C11R$X11R$X21T$S11L$P11T$M11P$P11P$R11D$L11D$H11D$V11D$Z11DBDRDSEMMM@.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%200JJ:TADATADATADATADATADATAA%QD "%A".SETS %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 AB A'A' )r&&<SYSY7    w0 Q$E w   R |# ” w~( %” v w( 8” \ w M” H wa” 8 5# F”  wP 5     ~~   ; e%235> %7A F5@P~ %F 54V%Fo ~  w~8 5 ~ X 5 5 5"C0 5 C05|f~ 4 ~ Z  P 7 7 7  -e7 5< \ p%YV5" B @   x de7\ w: 0 \  N7 @>e84U(~J F   5~???,RH U\UN D~ D( 5. >5 ŜE w 5n ` ~ ~.F  25j g "4ew,($  %YHYMœ wf w 5"%YZ57 5 8%RHr $ b 0 |%YVx7 7 D74 H,RH""MF"MM %QU "DS5Ux 5UhQ~h   F~ D. 50EW A EW  5+t 5>b ,H5E5? > ;%RH86ew.%DK7 7 ew 5  % 7   W hQ5 J5@G777 7 Few 45 ewl UR|J/  5 0 2 7,  @777 7 ; 7* w7N 7 777 7 ^  5v57f|%YL r 7d Jw 5 #%DKH2D 4w*  5 |7 %RHNT 77 '5|57 `5@7w7N :e lta "|d TXs  &~ ` @)  M” 3,DK 5w ,RH w,DM 5w,DL 5w,DYw,DP 5 w,DU,MUAf E  \ A A A A E : A A A A A E E  w e@P& ,e%YV E ~e5 ef7  )fŜ &f& "  "E $ &f, 5 ec  e 瀱 p5   X~p Jx”  *+ 0f : T "e f&5,Ew7 4e E!E 57- 8T~&53Ewl7he E C~ e EE ,57- R~&f& v  w  ť ť 0B Aaw ' UD$BA &( U BQ 00KeISBgЕ*  & & @( f  e ee e ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& e/& e *AHŀ ȕ Е Е Е & e| & ehЕ A %& e<A Е A bEA EЕ A A   $Е.  AЕ;     w D&& bЕ- eaePPPЕ-$w D  &Е. ce  Е:   B'&1 x(( |x(, t(( l(( d(,5ew , Bv     5Bw !#~$5  5 2  UE l(*! $~$r!j(E U 5@*& E& & f&ËDef Ë )̋U 5 ߥ& *  + 23E Ew    Е-   0@A W e`fÊ    E w `(DB C DBe ?D(e(e$2e (%[]%<>  l1 >w ww&f &  m  f A N  %f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ &ff 0+1(e  %&p*w f( f)f &   `@ ` B   & A @    8Ae f"( UCɗ&+(e$&% ** (x(l((l(( (l(("(l((&(l(x(w ( D 0 8#"#)%ĥ ĥ wn 0 *0 @Q$    0 40 60))  L \# PU&* =w `p!2 EW!p0p2 "ׇ#( P) @#**fff  &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@)) L *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ u # eB&B 8B r |* eBe>  # #D #=0/H#@&0 # = e0   .0@e 6=#02/002# @#?@#040 6w00KJ:TADATADATADATADATADATA/!0/ l0/!p!0 .=p0p2w T*8I *=)98  eB &&  U **e *Nlv ΋*.2  & #!)&eP(e && >e >E tp* wHw zeE D` bl lrw 6  B eE"s    s-  Csl141612epl2l0pM=f(& e %&&eH =&e0  U   E > >E=uf p  w " f \&* *   f l >5>Eu   >Mwf82e&( 0 0 0 80 B0 0 0 0)#0.> =00l&8el2 0 *e6p 4 8 81416 X h  B "eB  8 P$&w *<S1   K U U@  f&" @'&)'&&* *%0*ND   EU   n)"(. <= . B  E  (.,*1 U8UMw wF B 00fep=& /e`pwZ46f %8 E D/D!D l0l8epl0pɥ.ɕ w8e2 *) l0, *) $ )*)0,40,6 (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w h *$ ':T U@% DD%][%><w^  w1  %,,:4 w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce J   &*w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ w BC "& @SY&*p0p210=E%0=wV(*e "f D CB.E 8..8em,0l0!D0e6p 4.) &f  e) .  e6p 4 08*wl=p!Օ^(e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DEe    *1  ˕03 "   ˔Ӕ ʥ75%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!000KeISBg@0,0, f 톇,, w R     .%  eB U5UU  plp & NeՀ)*w  0,0wz | , 8   * b : 4 6 e6p 4&*&4&6= 64 wz%!64=5 2 6  l0 & Z46 64 :)0406 0 *0e6p 4 = *) l0, *) $ )*)0,40,6 0,0, f 톇,, w      .% N eB U5UU N plp & NeՀ)*w n832cd& & & B  2OΕ   N Υ$Ε  22Υ   v Ε f 2e 4* e*w@)0,    2) )(   =  l 0l   0/ e&=Ba@a Pe0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  ,  ^w> : Jw@B # f  `* w)0406 l0 =p!Օ^ *) l0, *) $ )*)0,40,6  DP5R RRR  8  **> =00l&8el2 0 *e6p 4 8 81416   6  ..8em,0l0!D0e6p 4.) &f Z he) .  e6p 4 08*w141612epl2l0p,*1 U8UMw wH B 00fep=& /e`pw\46f %8 E D/D!D l0l8epl0pɥ.ɕ w8e2 0,0, f 톇,, w      .% N eB U5UU N plp & NeՀ)*kz?TLBOPzLB +00K^K`KTADATADATADATADATADATAI/O Error Code %D.QI/O Error Code %D.SY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VA++,,),!,K,C, B ( &+ +  %@8؇ (7    z)UfUhz)&& z) Е ȕ-ȕ  (   + h (B(+Qe~5)E$ %& e eTUU+ & +"e e\^$% 5R  +eH 6) -- n6)6) +)( A, n& & & & f)& & & Ν,& )  % U+( 2(f, B( &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e w FZ& LB&a  )  W111 D K  M ?   )U%    vM !D  E e)@P   & SY&  & SY& h 5 )%  ) @)H(e(BA &(e(H0 (A f( (Af((AD&()&pDCe(e$fҕ[ ,ҕ, "ҕ]e(0 >E 5  e0Ґ zx""XD<H HׯVNHگpHz6H7yHb&OHD"HRSH &""HwH]sHa}Hr?TH@QHpH &HH:<H:Hz:H:_H:`H:(}H&:H:ZHd;HiHĶm HݪKHWHnHHuHuHuXHz# zH#Hc&~H5' qH$9sH$9΅H:4FH :pH:$H@T;H[H,r<H HrH"G> HbGVNHeHr#HsH&,0zH*zTHkMHNdHPJHz}H5 H.sH(VHׯ> HׯVNHگpHz6H7yHb&OHD"HRSH &""HwH]sHa}Hr?TH@QHpH &HH:<H:Hz:H:_H:`H:(}H&:H:ZHd;HiHĶm HݪKHWHnHHuHuHuXHz# zH#|, AW  &[q W FjSYTI00bKyKSBgzjFdxr*$&)X.ơ*O:z ơʡ С ơ  ACS -- Command I/O errorACS -- Device not in systemACS -- Syntax errorACS -- Not FILES-11 deviceACS -- File I/O error ACS -- DPB errorACS -- No pool spaceACS -- Dynamic allocation of checkpoint space not supportedACS -- Privileged commandACS -- Checkpoint file already in use on deviceACS -- Checkpoint file now inactiveACS -- File not in useBLKS=̠5 F wwwnwvwlwt.5 Π \  vS:XR ۇ 2/c χ Ḟw& dž(Ň.5@l> Aq w7 p      j 7   :ww w < 6 1j *2),>* ! rw)&/#C *t VЕ.^| ޢ(L7ы wڡ)>  >eB &B   p   BI7 o5AA    & ^.  D¥8¥9dcd L|\},?L?L11 W  &[q W  *TILBSYSYTI<RH|J< Q| Account Utility options are: Add Add an account to file Delete Delete an account file entry Examine 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):00}K^K`KTADATADATADATADATADATA Password (39 chars. or fewer): Default system device ( DDU ): First name (12 chars. or fewer): Last name (14 chars. or fewer): Enter maximum number of accounts: List on 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 ( 3 chars. or fewer): Account number (4 digits or fewer): Enter user CLI (default=DCL): Enter user CLI (default=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 continue, CTRL/Z for ACNT Options Menu : Disable login/logout messages? [Y/N]: No account records matched Default file protection ([SY,OW,GR,WO]): *** Account File Maintenance Utility ***%F%Y %3Z Multiuser Account File List Page %D%N%Y %3Z Multiuser Account File List Page %D This entry ? [Y/N]: Type to leave entry unchanged Account file modification is complete Account file is now sorted by UIC Account entry and directory have been created Account 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-privileged terminal ** Use SET PASSWORD to change your password ** Owner = [%3E,%3E] Login_defaults = %4E:%11EL_name = %14E F_name = %12E Password = %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%Y %3Z%4ECharacteristics = %2ASlave %2ADef_dir_stringCharacteristics = %2ASlave %2ADef_dir_string %2ASilentNODef_ProtectionDef_Protection = [%I] 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 -- Workfile- mark delete ACNT -- Workfile- open file ACNT -- Workfile- 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 number 000000,000000 is locked. Try again. ACNT -- Listing file errorQUFD PIP *.*;*/DEL/NMPIP [0,0].DIR;*/DEL/NMUFD ADELMS"DDL ~  ~ .0 2t.& ACCOUNT.DMPSY:? p)Ot P~DD5& HX  N|z2.0 Bue• 8X• 8 w2 Nŭ UJ ^ C L @2.< x8%4 @/&2.<77 00 e p 0 7 8    E U  ~ jJj  wj:  r  J : R w7 b w<00KyKSBg@ B~ f #7  P    p    D  $  w d5` i T5W5~T JO '5fG )X K L )P )I%A )F )? x* R5 ~ʋ ~  %% w ww   wwwwwDw:wB5_ 6 V6 $ K 5 Je wT2.pN F0. $2..( 5 5  42.77 p5Ewww~   w w  w|  Pwp w@d ` 7 b wH? $ w8 "5H~ʋ 8~ %% 0 & w5 E  w v w ~ʋ ~ b%% 0   wr wh w^ t wT wJH V    w XwBwP T7 L   T  F > E@E@w7 %E  E(5wR   ^ U7 5 F     ևȥF 2<=7 & .wF u @"$# 2 $wU^e@-P6 t P~~  2~ 7  T eJ-F < L ,  h $ J - E7 @ 1 7 5Eg 5`U! h S5O ~5I5 TA n>5  5  E z."&fV R f   6 e A #( ' Z w2 :A \    ww ww~ ^  R~ p ~ < B 0 ~ F U w wɋPH]&H H F]  w J5 % w7 #s  d"p  c E @"^A 8"Z   "K " v d%bfX !(wLJD H > !DA !%& ! ! 77 wwww b _, W T Q. NI Kn H EF B Uv 4; . + ( % " & X  1  .Е, -UF   7 5E@ -   5 ы 7w @ n-w4 tw&t 7 ($  ׭JA34 - -wEN5@H ׭ A, , Pw  N v, l,~ ȋ UW [ <]> &!%p & ) ~  w7ыwd`   ȥaȥ{  % ZU@ V " 5@' 6 Mb  7R ZUX86:N w$E* YMV ` 6 z r vҕ0ҕ0  d0. v*w  V U^5b * |)M.xUr H H=2[]`Е[ pЕ]V 7  f H VU~Hʥ[ ʥ<ʕ[Е[ "ʥ] %"ʥ>ʕ] - ,r ] ȕ] wF  5  " ҕ "  j    Dҕ   0 f M   T T`7 &# 500K^K`KTADATADATADATADATADATAD  Vu  B`ʕ  H¥  w Z B`ʕ '%  wApw<z  =M,3< FTP"FB B`ʕ  p¥ w w Z¥ w *  UE EM  L UE EM@  &Ћ 7܀7杭杨AM |0 -1-  4>@ܷ=ܷ0ܷ* (ܷ%ܷܷ Е AȥZ0ȥ7!!$$''-.09AZf&ȋ &   ȋ ȥN ȥY @B~ 6 TЕ:H]5  ]Е[ Е] eee.5<^Е[BeB~Е]Е Е Е e@ 6 e eL 56R E"U5 W Ee , tR4R6R>J2 tR,   A(RA'RA&RA)RA*RA+R rtz 5<eRz 5<eR z 5<eR ,BL <d S 7  D~t "~ *   ѕR ѕW ѕE ѕD ѕ,tRB~t74  d.zr7..XT035Xe eʋReނ et 2. Bt.2 L!0# f!2.&B2. !BwR%i4 7 z  4T  Rf&.mX  eB  LE 5 &et E  b"et     <  ` wfw\w5w  w^ ~wP7 7 7 U4  j w L,@B_.% .$52e(w "ew 57- 7- Uet   "7 5B .:K f; E e\E~7 r7 p $Uh X4www  www E22 U + 5e5 e e̋D&f : 7`  l E Uw2 J =fffN N NhN N NhN NhN NhN NhN N eP% fA U4w  Uw E &. .. .[0,0]RSX11.SYS00KyKSBgM@BCAf } f&  GRR@ 3   &$&~ & e% ~ԥ ~F` F` f&Pe e  @  veT % % % %% % %@ABCD f @  f% % % % ' %&f&f`%  : BBe  *uuuuFE@aaH~6   6  < (  .   "    x  l l&f&D%% %% v  % %%% Z %% %% D   % %%% " eTTTT@A% X@Ae BA 2`u u `u @A `u u `u p B` `ee% ; vu u 5 5 w6%%% %e;u u u  x ueM u u  ueM u  ueM ue eeeeeeeeeeeeuuuu%&D   5  5  n e&f& v f& (LAt;?t;;f <  PeE  w  TE B A B` 47.pA w0> w |E p r B ` p 7A @ae  e?E? & f Y  ;0 Br ` ;Pw f  E;  jw`K`/; & D -N  D  `    w  w;      7 7 7   W,  7b 7XR ^# > %* 7 7    n ^ N pZ;4e6(^;  xH  > HT pZ;4e6(^; R ,䇷 b Z7 w e@)w 7  ; ݇B B  @`   B` l  v  m ` r@ f@eE h;&p;mD  8 0 &bZA90$ .@(w ~ f |@t@&"   @&fA F EAa @ׇ  f& ͥ`̋  @  % ff&QE eN w `NA`c<2. wՀ,ŀ(@ L @   HU@ (  u G   53 : ̋    t  6݇u    5 & 5  5  56   AAaf ΊP   @ P   6 w ̋ xe%&B  @ Хȥ   AA wAf f`E  5 _Х*  BC  5 T   f : 00KK`KTADATADATADATADATADATAazE  + $& .! _0 7 9A  F Z5  ע ע  (TI^SYSTEMOWNERGROUPWORLD #D E[RE,E,E,E](E.E.E,E )DNEDEDEDE=:RREWREERECREDRE =:REW EE@EC@EDE =:REWEEECEDE =:REW EE@EC@EDE '&15ew , Bv     5Bw FHIID-bjK ND- E %     U EU 5  5U lK.F J>JNFIE U *5@*& E& & f&ËDef Ë )̋U&f &  m  f A N  %&ff X,p T0|x ($`|g,ll W  &[q W 0TISYCOSYTICLTI00ZX 00Old password: New password: Verification: SET -- Old password validation error - password unchanged SET -- New password verification error - password unchanged SET -- Illegal password syntax SET -- Account file open failure SET -- C00KyKSBgannot file physical LB: SET -- Account file record(s) locked SET -- Timeout on response? Т Т$ 6<\Z(V• ~• x p\ `ld T DPJ- 8 (40-**  wFAw$2,LB6  lE67 wV7 fb -w&)  wV NP  w ^Uw'ҕ ( ,w%  X f^t Z  xÝmנ ננ " נ f  w7 p4  d6--- 7:f j*/e%7 et ׭%wp ) \  %AZ09$'!- . `z &f)&6& <& +h ^^)& )w^&#  ыv4 twD=xա > l lUw(( -[0,0]RSX11.SYSM@BCAf } f&  GRR@ 3   &$&~ & e% ~ԥ ~F` F` f00KK`KTADATADATADATADATADATA&Pe e  @  veT % % % %% % %@ABCD f @  f% % % % ' %&f&f`%  : BBe  *uuuuFE@aaH~6   6  < (  .   "    x  l l&f&D%% %% v  % %%% Z %% %% D   % %%% " eTTTT@A% X@Ae BA 2`u u `u @A `u u `u p B` `ee% ; vu u 5 5 w6%%% %e;u u u  x ueM u u  ueM u  ueM ue eeeeeeeeeeeeuuuu%&D   5  5  n e&f& v ('&15ew , Bv     5Bw HWXtε-Fĺ 4D- E %     U EU 5  5U ƺҵ 8XE U *5@*& E& & f&ËDef Ë )̋U&ff  |,|,8Z W  &[q W dSYSYCOSYTICLOV~dZƫ~00KyKSBg,TTDf @r:F&$y@_MLB`&JB >F0 % 7 7 $     7  l55~ Dm 8w$  4  * xe dwVL TwD  5?5 ;5@543   5 Aue  :7 wf 4%r B Dj0%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 write 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 not been turned onEInternal error, command ignored - TI: is a VT marked for deallocation-Will attempt console LUN assignment to %2A%O:”f 4ڢ*   e-"  :5 ٥ȡʡҥå5@68> " ҥD BD   ԡ '&1  ­ ­ έ ڭN r 5ew , Bv     5Bwn ūƬ5  5 2  UE  Ƭ`E U 5@*& E& & f&ËDef Ë )̋U&ff  \­Xέ ڭ d, 5 ueD!0  7 Jew|t57EDvڢ ")5(hڢeB$& %NL\# 7 (U@e& 5` 55U2  u&55@$ 5E5  Ʀe   & RD&& & & & & & Ε &  , 00KK`KTADATADATADATADATADATATT  7t: Fe@7 be7 p  ?e 7 ZH5@R,e=@5 7 (/55@ 5#ze7 58 ^5 50 Ez5 Ul7 QJ AW,VT  Pq PE 05*(|ZB ye%7 Z.CO|7 z 55<5.5& & 5  5 5U  5TT7 77 :4lefw 3%TTM:2e, z%TTMe TT7 ~ P4&B F5 5 E4FRB8_r-CO1-NL--VT)5 $C 5 &rB fFZeUe%5H7 7 7 5475:   P- 7a JB7 6.&-UUF7 &fw 7 7 @,q `-KacJE[ !m@  ) L R  j7j f@  &  5]U E( :&@E A  ̆  E vE c  @  . &fL     8  " .$ B  8̥ZḀ90     ȡCOLOGCOTERMNOCOTERMLOGFILENOLOGFILEONOFFNLX^env@=ʴ/޴⡬⡬`$⡬ڴʄ= ⡬⡬Ă:= ⡬6F$t0&Ā:[J.hV],b.h]Ā].hh]z.;@D= @ COT -- Date is 5. E&ڢ $ wJwJ-V-vL 6 n4a7 X5DR-H:09ȵ ȥ    .ȵ*Р(ȵ"Р ȵȵРȵРȵ ȵРȵР*  !  5``````5@7,R7, Leܡ&&&TTT  ~ , $E  w4z%lb^ CAB @ r86fjnA& W D4@ @ ` e ʵ        ʵ    5@Eڢ7 ڢp  ,Ul5f 5 XwJ B  e<6e*lh eB7w PX & & @( f  e ee e kz?TLBOPzLB P00KKSBgI/O Error Code %D.QI/O Error Code %D.SY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VA۱ B F &T g  %>6 d7    UfUh&&  @Е ȕ-ȕ     l  厮B{Qe~5)E$ %& e eTUU| & {"e e\^$% 5R  ~eH ή -- nήή {Pd A & & & & fP& & & Ν,& )  % &U{d 2 B &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e w 0Z& LB&a    W111 D K  M ?   PU%    vM !D  E eP@P   & SY&  & SY& h 5 P%  8 @)H&f &  m  f A N  %\ f|,H{ W  &[q W (SYSYTISYOVd(Rްd < lơ[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 file %X%N%NPMD -- Bad address %P%N%N SNAP TERMINATED - REQUESTING TASK ABORTED%N%F%25SPOST-MORTEM DUMP%3N%F%25SSNAPSHOT DUMP ID: %D%3NTASK: %2R%37STIME: %Y %2Z%N,2l"&*,0$&L\`tޢ   Y $# rw |z RR= h5L j 5< b 5, j 5  N 50 F (  dnE 00KK`KTADATADATADATADATADATA +D&55@ @ ĝ eA    P@ wˡ RJ!*R=75@ W 6Wl l p w&l  lp  w`7&E7 7  mΩz1 1   d  Z 6A&5 8JEw&e&B w7  @5$l l Ω$   5l<&l Ee & $Ω  %w F&fp@ t@l  <m:@ 7w&f(B E EtCe @7 E`7eB 7 t $ B&57  77lw |f1>?LBj f& tlE Е: @ @'&1  ޷     꽦5ew , Bv     5Bwn 5  5 2  UE ެ 6~E U 5@*& E& & f&ËDef Ë )̋U&ff   ౰  p0 ) ܫ ~7 R5 5@ 5@w&tSE* *e 5@ D ,(A LA D00KKSBg / .$Ћ~W ѕXW ѕ  NwP FwJ7 HD&5 =   B C5Cm<f&e  && V&R~ e>LR~ VN7 w<&%  > 05A<E Wt`R~7 ,w<. e> j "L  wLpmp`R~Nd50^VH7 F|f&fܧ~ B~%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%NPROCESSOR: %A%N%NEVENT FLAG MASK FOR <%D-%D> %P%N%NCURRENT UIC: [%B,%B] DSW: %D.%2N-EXERDNMSGCIPRUNBLKCKRASTDST-CHKREXSEFSIOAFFHLTABOSTPASTPSPNASPNWFRAWFRACP-PMDREMPRVMCRSLVCLIRSTNSDCALROVNETMPCCMDGFLMUTLDDPROPRVDDSPSNCd e@ZeC~e@l R C  ǵ   l% <A XA LA @A0 4Е Е l DAeu 8/eeu 8(eu 8!eeu 8ĝ  v eeu 8e u 8 eR6 ڶ  ÝÐ 4 r  r rC j \C$ T r!R" :Bfm鷗2eA,  Е   ~&f ~ & & @( f  e ee e d^,y``"daR``-w(l"  f&@e 8Cn,J R# N`E%E`A&@ C:E2 z! n C C`e` N`* N`5 J N`5 N`Е Е e $ ew& 厳//t/&,5(? A$ C 5l<% Ee?U  %2NTASK STACK%2N%5SADDRESS CONTENTS ASCII RAD50%2N%6S%P %P %2E%3S%R%N%6S%P BAD STACK ADDRESS%N  JNZ $  e  7 w e ε %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 %2B %2B %2B%18S!%2E %2E %2E %2E!%N%P %2B %2B %2B %2B%5S!%2E %2E %2E %2E!%N%N*** DUPLICATE THROUGH %P ***%2N5T~ `j X :5N($ # 5., 700KK`KTADATADATADATADATADATA7 w7 e n17l`XTwZETwP  : > 5@ Du Dr 6  | d KTew J dl$C 3 n5 d 2 E 5 d 2 F5 dlB  @ ? e7 (%2NOVERLAY SEGMENTS LOADED AND RESIDENT LIBRARIES MAPPED%2NSTARTING RELATIVE BLOCK: %P BASE: %P LENGTH: %P%NSTARTING RELATIVE BLOCK: %P BASE: %P LENGTH: %P NAME: %2R%NSTARTING RELATIVE BLOCK: %P BASE: %P LENGTH: %P D-SPACE SEGMENT%NRESIDENT LIBRARY %2R: BASE: %P LENGTH: %P NAME: %2R%N@,Qe we tDN 2-z 5@ &e 7` .7 5@ "   ( r@,e D 5@ 5owB5@ <  Em&Re wERe R- -e Re J5@ e j@e ^@e Tre HrK 5e *EmRe Re R mXe 5e%2NEXTENDED ARITHMETIC ELEMENT%2N%5SSHIFT COUNT - %P AC - %P MQ - %P%N%2NFLOATING POINT UNIT%2N%5SSTATUS - %P%2N%5SR0 - %P %P %P %P%N޽i7 e%"5 1L ܧ~n "0 ܧ  &ed E(R E~Ľ j|2,ֿL W  &[q W l+TISYCOSYTICLTIOVl^ر*6Hjnprv*,.0jDFvz"$&j/ HEL -- Command input error ޡ  ̡() AxY5 U 7Gܡ wr] ޡ7,& 5 UХL U&ȥL#ȥP5dTE BE w .XU5@ 6hwPZ5V RMH  5@  w U E 0 0 5Jm$ 00KKSBg& " `&LU :E 5@ Nwhы ȕ 4 tw T 0&f) %.YWt7 n?H0 0& , B? 2fr w[0,0]RSX11.SYSw (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$'&1  &5ew ,, Bv     5Bwn 5  5 2  UE  𱖱0E U 5@*& E& & f&ËDef Ë )̋U&f &ff   IJ#IJ |00KK`KTADATADATADATADATADATA    R  pf 4 @ HH:MM:SS =  Е: Е: ȕ Ћ 7ȕ  & +&  )@)W Е0 w!& lE !Е:    & !.  >!¥8¥9M@BCAf } f&  GRR@ 3   &$&~ & e% ~ԥ ~F` F` f&Pe e  @  veT % % % %% % %@ABCD f @  f% % % % ' %&f&f`%  : BBe  *uuuuFE@aaH~   6  < (  .   "    x  l l&f&D%% %% v  % %%% Z %% %% D   % %%% " eTTTT@A% X@Ae BA 2`u u `u @A `u u `u p B` `ee% ; vu u 5 5 w6%%% %e;u u u  x ueM u u  ueM u  ueM ue eeeeeeeeeeeeuuuu%&D   5  5  n e & & @( f  e ee e &f& v  ?$@e[ ZC  6 6 5 ?  ~fmF, d ,#ASN XXNN:=SY:/LOGINASN =SYS$LOGIN/LOGIN/FINALAccount or name: Password: V BL [XXX,XXX] ] System Logged on Terminal XXXX as XXX123456 HEL -- Privileged user logged in without UAB HEL -- Cannot allocate UAB HEL -- Account file record(s) lockedGood Morning Good Afternoon Good Evening Login user HEL -- WARNING - Unable to execute login commandfile HEL -- Syntax error HEL -- Password cannot be validated HEL -- Invalid account HEL -- Terminal allocated to other user HEL -- Other User Logged On HEL -- Account file open failure HEL -- Logins are disabled HEL -- Message file error -NNNNN HEL -- Timeout on response HEL -- CLI not in system HEL -- Cannot set CLI HEL -- Assign failure HEL -- Spawn failure HEL -- Cannot find physicaL LB: HEL -- Low pool - Nonprivileged logins disabled HEL -- Insufficient Secondary Pool for user logical table HEL -- Warning ** Default device not in system 000000 ||  Bޡ B BH^  % 7 Q|x Q|x»SY0:LB0:[1,2]LOGIN.TXTNOLOGIN.TXTBATCH.TXTQ@LOGIN.CMD [000,000][]%Y %2Z JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC[001,002]@LB:[1,2]SYSLOGIN.CMD<#d58 `wnAwb5wV$00KKSBg7 7 5@l ,VT 7 7 5. 5(0 vF  w wޡ b   ޡ6  0 wH/74/S5@K7 &.mfA'B5! 5p34m<݃4 */l  Hޡ' ޡ( wޡ|ܗ,LB6  ݀lE67 F w7 fܸ -w\T)  w   ;w  ;wm L5<eƿ ƿѥ,ɿ0 wpƿ0 w^Pѥ]7-B 5;5@w,7<74,76( "   727> w&& e5@ E 5 U@  U  U HDu www L "e.77 7  y # "1 8p R~>`E ^Е,E NVP0 OS! B9`  $   Е Е `  W W + 5@ .*:P e P Е Е[  vЕ, ݺ fЕ]Е  d f   bF  7  V  Ff& wޡ5&ƻ: 6 Е:P~ܻP~»7 &SY&--^ -F˾ 2 n  j x5 \ ~5EWE 5E   E HR 2 d L a+%%Ll 8 ^  ( %%" .Cы 7hdڿ. T $%%.Д ևG ر|ww 4 wнwwhw;wXw>{wwvrwhȼdwZVwLHw>:w0N,w"&f5< e@@ѥ]wf&& %wB~4 t 4  mɝf7 t 3 | bmÝmנ ננ ߃" נʕ 7  \[&  & 2w/W ,,/& wW ; ] //&ƿ X ÿ L !̿ӕ  ̿ h  / 5@E#  &#  ԇ  &f)&6& <& +< )& )wCЕ Н\НYНVНSЕ:Е  P~Е He ɥ P~ Е?Е?Е ePɥ ?Е ȕPNЕNȕPЋЕ ȕS5ЕNȕSЋЕ ȕT ȕBȕV &z :ʕ j VЕ AZ09$'!- . `z  A A A Eȕ0PЇ7 $4  7 7fe ̿ ---7f  j/e˂%7 et ׭%vw( T) R(:&'7ע ע/ ע`עz 7ndҔ~(X X%w=5e& ȭ Нȭ Нȭ ННННL  l ȕ & && & & @N  . & ѕ> ȥ  ~~ p p$#0ޡ X2 6E. <@ޡ ޡ` %   < d! **W -F s Е.  7 χ5~00KK`KTADATADATADATADATADATA5w  498tm 5Z525> %l  ¥/ @ .&fv v5.u0B5 25:FH6D倥D*e к~ r V R7>Bm, e0w * $&N ރd BtBm̂m/& 꺃 ް2 r d( B& 6 Z5 :%" #%5ыѝ ѝɝ x* ߡ &55e 5!\ ̿n~~ƿ|\b ˇ "0 \-* H(%sd Zg᭄|tz S  S S0 ˀ0`e c c cRɋ ы ɋ% , TȲSY:HELP[1,2]HEL -- Cannot initialize file storage region correctly HEL -- Unknown HELP qualifier HEL -- Syntax errorQ3LBSY괚޴|HLP .` (Ȳ  ޡ777|"p&x ޡZa n~ -  ޡ(`  4!/ `  wbBa jw? HEL -- Syntax error - mutually exclusive switches HEL -- Illegal switch - not logged in HEL -- Cannot open output file ??? -- HELP file nesting depth exceeded ??? -- HELP file error -NNNNN ??? -- Ambiguous HELP qualifier ??? -- Improper HELP 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 ??? -- Help file is unavailable for   LBCH.MAIN.  7 7 76<75Bjhfb| lw$xN 07 bԋ  @w67 27 * X L=7F 7 *E p <9|6q  cwh[X7Q蹑 V f4; T `  wC `θ .@ 0wr " X  !    p  цwB" P &5 P p߇ ^܇74ق&7 % @<wȥ ȥ ȥ*  "ȥ$ȥ/ ̥/  ( W 7 7     ¥ ¥ ¥/"p$&##" ȹ00L LSBgR <  p2 U H 1ȥ9C ʥ ʥ ҥ@w> fp < Z  w:ȕ eB 7 5184-*X 7 f7 d5!2* J:F  xw0  fw  l T%'* C   wJ Е. w& \^\DBw<6W! pBpDp\p^wdwb   CBw C 7ʥ ʥ ҥ=@#&   v -   7w07aA7WU7RK@7> "  4 (N Jȹ   ,@ 8|* Е.ٷ ыѝѝɝwыN4 t&7 &fw 7 7 @,q `-KacJE[ !m@  ) L R  b7b f@  &  5]U E  :&@E A  ̆  E vE c  @  . &f|F     8  " .$ :  0̥ZḀ90     w &&E  Aw    j2*-  (@ep@ D  e  ` e       R#R-w   `. f ʥ*&f& v 7 r޴  7 h ` 8/    J "$ &L v  a޴ ޴ 괂  #  &fF ݅<*  / d\ pe5 &fi D݅ 6 Jw܇ HELPLOCGROCLIMCRDCLFILOUTLQUY]aeiǀ/ǁǂǃDŽDždžLJ:Ğ:8ȟ@:Tȇ\Ƃ%Ȝ.ȮȇF_$:[8B,@B΀]F(H L8<H@D$|)!, W  &[q W ` TISYSYSYTICLTILBLBSY00 LK`KTADATADATADATADATADATAX`"n XX""_Mޤ"J @ <ڤ""* B D$ : .(0  B~ 0ޢw4Q$wvwty5`ҕҝ 5 Lҕҝ G~wC~0 E5  PwL7 wfTI f&J5`w ffwdA  -& |x U%&wwЕȕ5<ȕЕȕ5@& ȕ ЕȕЕȕ NZ5@ 7 N wT F &  BaB~5 555 5@w0@77 @ w v& RL2,0& ΕT Z&& - &- `wT & & & & ڢe -Y v-YJw &w & )5d& & +-"Yw @sXڢeK!sf )&03203277 2  2  7 x7 v ЧDȧ RRa! ȧHRa!PPH  "& +"& 7LB0:[1,6]ERRORS.LOG;0ERRORS.ACCTY@*ةLO(BA(RE(SH(HL(̩SL (ҩLI@(SW(AP(DE (NV@(ZE*UP*NE *CU*HI*Pީ 'Ī ELI>PSY: @@@AA@DD@@00(hH (*,h.0246SOPRSYMEPECOERALL %R -- %VA.0 b  `Lw*w% fV  %wV QU~Vȕ %5559{1s kjfY7 \ "\$# J%wpֱwhw`&wXwPEVB $`w*AB @5 5EU5@ 5@E@zUtpE<5 w   Bє~ B є~X Bє~P`wP. : Q:R~ʕ &: #T JB #znw <Ew0j`w \-R  ww5V2E$~5:EpE?f5UV5UHΫ-@ 5%2 25 5 .  &x5lwdw" ~ީ7 ͋W"  -W"׭" 00L LSBg`ީ  >WPWS-* P]077 ~̋ , " j  7` 7P7N7F-%16<%I%M./%M.%16>%T. %I(Offline)=zk z55 50  Ýb ~F. z *5^0"RX! F  Ý $R~zٴ z 7 7 7  Ջԋ  ( R)Fvη k26 ;9z  ~ v  :5& & &  f& & & Ε p * 5@  (Ċ %VA System %12S%VSCounts last zeroed %3Z%VS%YError Counts%20SCounts last updated %3Z%VS%Y %2A%O: Memory Parity: %M%15S Unknown Interrupts: %M %R -- %2A%O: is not in the system. %R -- %2A%O: is not an error logging device or is offline. *** SHOW ERROR command was aborted. This output file was terminated prematurely..DZ\p.CurrentHistoricalUnrecovered I/O Error Recovered I/O Error Spurious Interrupt Hard Timeout Error Soft Timeout Error Block Replacement 57Z55 b $ J "# LJ " $# ~w  J*Z t<* p>  5 "J  w*| / xp777~ԋ  !E*rBR>N: * < 7 (7 1E7  7"e  < E ` b e Pwh z# * "$# w ~5 fp0    v5B nlj-\  PLJH* * :86-(  P* * J` *Е HH-D:2es(E w ` ** -Ժ#* Е AaA . <Е ** d 7avvrw jf* *  5v  5VSp  &wp00LK`KTADATADATADATADATADATA5$& & &  f&& & & Ε p <wtf T &  m55 5 DRDBDD DL$MU(DY*DU.MS:DM<d  h#  ` "$# M "$# Df  *.f0  4fff0  ^   F w0 &f& v w 5 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f  P aAAf@pnp C*8֋ j 88*Ë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@ P DlljaCeH###33 & b 8 *,ȇw  8jDl@ & TeBT85l@ @( D feB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@(k?$   =f=v'&15ew , Bv     5Bw 00%L'LSBg-N/4 \D- E %     U EU 5  5U 62 RRЇE U *5@*& E& & f&ËDef Ë )̋U&ff 8<|  ,X $LHOl|, W  &[q W Kf SYSYSYSYCOfRD H*,$&.0`r.^ / / 0- l h d63e 5@  "nj@ p@ R 5@R> D <~zu Di b ^ $O L7J  A A 1΢d @lҢ 5XE    EPfff wr& ffGff & X0ڢ 6vڿڿüþ|ͪR΢DAb\\\ŢZ7 L WR & & s& PffG77 @J@B Σlf \rVnJJDZ>V7J0 & & efؤ@ DA$ ܤؤ 1 $  B N@wlw 7&pp6  3w|&@pa(& pH1A@ ܤܤ00-LK`KTADATADATADATADATADATAfZ &&=M T \ 077ew "w w w :w 47wVAN ffS1  e AN  eD   b e  7 p~   7)   e , $ D  d H f B B , E   ww #& &f wԋ Д  @D T P (f 'P  #Е.C #De  wf=e  d#e w&)_&& & &  & && && Ε@ 61& 1)ȋ& & & & & & & & & Ε  1 &  a@      f bB?& & &> 6& &&6> p5e ` @`  c  "#$ x&& r& h ^ \ R && L& D :W W    褗 f6w    &fؤW ܤ d  l #eq1   er1 @ fN\ N\V\   C Ce 005L'LSBg wB@   R"  w w0  f D  Re \  wf 4Re0e:R ! Q@11  : <2 & Te r7&7R feB7 7 7  * ,2   fR&%  e  ff展7 ,7 @  Re~ Հ p ; |@0  J J0 @  , e   2  5>H!1( 1* 1,1.1111&11!&11 , ` zppp2!|! !C U  & RG w׭C1COw 6! Da D` &f   \&  r H& e 77~7zPX L z pff UP7KW)? &    e &(    J"r,e @f& <%6.*eE  `e B  % ~  Q pw &&Ee E ` &Ee E `7 n4\@F7?AG pp@ +Ν5/!  ` p` ! 11  4 ff 0 @ :+BD ))@1 E@1 , E0 6 @ <CE[\? ȇCD$ 1f' ׭s1sQ1Q  B J h ns1sA1AHM   @m? 2@ i  B H De w\NQhBfR+g%  f8df TއہUqQ[!  V VH&&& SPTcD ,l4 P5^5Z A 5N5G5CS >R8U3&55]] # _Εh55 ΕipΕX & ހY4UUt ŝb<.D@<84/ * VRNJ FA< & $& ׭<Y fB w ((( %  0   |  u  m\BDM?C BÝ!׭ w@}EנT Oנ נ?Õ  ` , tåÕ {ļļļļġMN IH 0wjw >d 0 ?CEנ؂Ë         X  0 XB T p ׭@5/,) dp p Rc4ŀ & 2 (p  9`Pw  B` %0w` 4  ׭B  d  |  *7   #   eD    H  P  e  R7& V$6 6" 6#6$6 6"6#6$N6 ֆ%֋  XXXXXX4wwwww   $ 200=LK`KTADATADATADATADATADATA !%% %:< P 5 5 B 2 / &D (*,.e0 ~ vp(p*p,p.e0 P~:0 &  V 5 b& MMwBw> H7(7$7 V  3 7 0 #    T  Z  X  t\BDIJK     & d 퇇ǐ   w w ̇  ɇ  ,02%  & f w B 󐅐 <&fe0 P~(*,. lw 7, ~K G0 (0 *0 ,0 ,C.005b67 D/Hm> /Zd 귊z(v*r,n.&f Աe0P~  w  &e P U mfb-f4:&eB0 ŀ &&& & ~ ֵŀ 0 f \#Ew|& ,VT @ ,2,wef Ewf   eH0 e %H@77 e@   @zf && 'pECĔaĔ E  aa2  :< 5%% f ) %N 000"    wX\BJefV z `  r (w    ۇ  d ZwP  ͇5 ŀ Հ 5 ŀ݊ ` r% D& ^ x  H& B հ & CB J `4w   V 6K    Awf z   )*    T a F 6+wwwww7=׭7킇w ^7,"w P w Hw @w 87, 7,7,7,?XAx`NؤIqQ$IqQ$ @` 111 @`` LP :/4/Emv`! 111 @imzLB N[001,007]& 7   ,VTe ,J w eBR l# vB C*i# R`X `\XT7           7W)P2PPP7 77އL 03w (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$ & & @( ^f  e ee e &f& v KLO2BcԃԞԱHH:MM:SS QMG -- , aborted job = in queue Queue file fullI/O error on queue file, code = Exec directive failure, code = Unexpected exit processor Open job deleted: Error code PSY  h#kz?TLBOPzLB  00 MLK`KTADATADATADATADATADATA Delete file [Y/N/G/Q]? The following files have been deleted:  xQzSYt:#zSY  ~    L  PIP Version M1600 (ANSI)PIP -- SY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VA%VA%VA%II/O Error Code %D.QI/O Error Code %D.Command syntax errorIllegal switchToo many command switches - ambiguousOnly [*,*] is legal as destination UICIllegal commandIllegal "*" copy to same device and directoryBad use of wild cards/characters in destination file nameExplicit output file name requiredAllocation failure - no contiguous spaceAllocation failure - no space availableAllocation failure on output fileI/O error on input fileI/O error on output fileIllegal use of wild card version or latest versionFailed to create output UFDInput files have conflicting attributesWARNING -- File may contain corrupt data. VBN=%B,%PFile block has Forced Error Bit setOpen failure on input fileOpen failure on output fileClose failure on input fileClose failure on output fileFailed to detach output deviceDevice not mounted or other privilege violationOutput file already exists - not supersededFailed to mark file for deleteFile is lostVersion must be explicit or "*"Error from parseFailed to delete fileFailed to attach terminalIllegal response - try againCannot exclude *.*;*Cannot find directory fileFailed to attach output deviceFailed to get time parametersNot a directory deviceFailed to write attributesFailed to read attributesFile not lockedFailed to enter new file nameFailed to restore original directory entry - file is lostCannot rename from one device to anotherFailed to spool file for printingFailed to open storage bitmap fileFailed to open index fileFailed to find file(s)Cannot find file(s)No such file(s)Failed to remove directory entryDirectory write protectedNot enough buffer space availableFailed to truncate fileCannot truncate this file typeIllegal EOF valueGet Command Line - I/O ErrorGet Command Line - Bad @ File NameGet Command Line - Max @ File Depth ExceededGet Command Line - Failed to Open @ FileGet Command Line - "@ File" must be only command on line File ID %P,%P,%O%N%X Read attributes error - Storage used/allocated for Directory %2A%O:%N%Y %2Z excluded%N%N%NTotal of %T./%T. blocks in %D. files%N%NGrand total of %T./%T. blocks in %M. files in %D. directoriesDates from %Y through %YDates before %YDates after %YDay of %Y%N%12A%5A%3S;%9<%Q%3S%9>%X(%P,%P)[%O,%O](%M.)[0,0]. blocks free, . blocks used out of %N%N%2A%O: has Largest contiguous space = . blocks%N. file headers are free, . headers used out of xe?TSY****LLLL̼hߐܔZ(լѬߞڔDILIBRFUTBDESD PU@ҫRMIDTDDDDFEXUN PR@̫SPثREENMEAPUP FR@TREOUFCOSBWOGR OW@SYƫBSޫRWFIBLNVSU FO@CDLDNMSR  8<@DHPJLRT00 ULFLSBg `NABERARPYANULUGUPETCVOCE-%D7VwV! V w =(VV >7 Vf&eB =`xf =&eV5@U  =7 V% Q  & ˥"U{ 6 p Ĕĥ.ĥ;,ĥ*ĥ%  55&Ք R5 5@IU@6 UU U58U65@UUU -U]|UW * % U ]RUՕ*  e250 r p] ҥ[ ʥ* ],  ]   ͥ*D 65 7 J& .K 7 є :O&7 4P7 2P7 0PRf  f7%1  11 1 1 11OOOw Z6R5&e5 HJL   5 &1 51N 6 5  5*+5U5 5   BBCU% B  v $5 %DN5W E5W sW s W ! W 8W >W EW W W W Ō 00 ]LK`KTADATADATADATADATADATA$|e JHH "27FSY JJ 2wJ& & A&?mFIE7III7IE 7I !I 1vI 7 \I7 ZII7 I ,H$H n17Hw7 &I] IȕR N1GȕR 61oHEGG 1]H I 7 HT  EH7 H7 H7 H7 H AHHEHHHr 35tHElHhHdH`H55VH5 @E :H 8H"@   X %w b/5 f@apunhj uhlB$ waw 8 8wn&  Z/*AdBbAet& f ./ P aAAf@pnp /C*8֋ .88*ËhAB ArBpuhɥ@&@af& ѥ"N  &  @aur pɥ@x`f Va`& WaWz  ɥ"N  ajou-nhwfɥ;fa)wNנ"å.@j  a bwb@ -ŀajTI& af* *`V @e,@aw -@ajjlj ɥ@Gaujk,bp -5f f‡ ȕf  R- eSY e,5 funhw@e,aja`W- f`nwuhnw@ r,Dllja!CeH###33@# , & ,8 *8 w +@a 8jDl@ ,TeBT85l@ +@( D :,eB&< +# B,An5j)f & 2/      RՀa@>  ?0 b l f   +w *`````T&C, "p(8B`?\\?r>>>?A? ABB @BBr$?>5J@B@B@7 F  7 zF7 zF e7B  BE7PTBl " ,LBw| ? 5B J7P"B !0 >5B>EA505 fN 5058?U    E7 E5? =E7 E     lE5>U>U8>UXA  820,  4Awd58 9#A P)wt wd>A D<Е Е  PPP& Nj=j5@O (%= <P   4(@1" " " " " "  ~@TT T 3 e$ 'Е Е C7CNb5=5>Е Е H X l I> :5 @A ::  w` B@ 7`Bm:Bw Am:A:A 5 =2>7!::%Q  6wZ A95 $@4: Aw7 A5= xA A= %%ZA 7lA l 6 ^w pl$W r r59 2Aw"A A 5=ld= &-@ %Е  P "w   Rd RdRdr RdRdr 7@f=8@78R   @5< 7888  $7 v@wl p< 7*9p*)w "&C `H5K5 Ve $  5&Е( #Е, #Е) eff ]    e 5 Е/ fe e @Е CЕ @ L e 5| Е Е  a& Μ& Μ  #e &Е[ 5ЕR5ЕW5ЕE5ЕDЕ, ]&% . d % e bfe i v"e&Е Е Е  e& & fA00 eLFLSBgЕ &ɋPPЕ-PPPЕ-PPЕ PPЕ:PP& T"Е. 6">E>7 =  5w$9ww9 JUz9 9r=999b=5V9 E8w5@>9w* w5  hw5 9wX=U h=`  5R=.=` 8w5 8w~ f N   e4w P N P+ %%( P  N`  $fwfw% 4Ub<4UR<7Ť2 4587547f 95|; Ne4E 75d;5\;Z B=56w .ŝ2ť-ť*65 ";;` w> $ Nf  \ N7 65: d67 f6 r5:N6N6w5 ::` 5:wf.6 f3U 61 UE& f1  XE5vE6>  E8UUR 0E,6 f1 f1  $59 &ff1 w** ݣe JwММ $Е:5@Z122 "  T t0   Е. ^0Е;  0` 59 9 '0fNЕ \U8 5 f44 1Y 11111>   $>&  (4wX51U8 z&35  5U3lr$\&  \ 1^11Z11U3  w J7P3-<0/-60/(wn5n3 w\50 U85H3 w,H3P Nw"E(3 $50 95 3l w:lNB 5$ 1H1J1L  51N  5 1P@ 5255@ 1V1X1Z1B1D1F 5\21  *%&542 l 9l dw ^  $w>wB@EP \7F2  U1  e J7P11P JE1 1%(N x>1  8 B  71d1eU ^  1& 1 1h f څF (z  N٥ ؍w2ͥREͥWEͥEEͥCEեDE *71  U0 v 97P00P %E0 f"0e ͵@@& f e5H0  Nz  tʆ 4׻w\  U0 wV7P00P %E/0W d&B#  XB w ^    Z ! wpw7 .4 ,w5-w l/$ &v/3r/3,o, <   /w:!# F"A+p p 0 pw nw/ CC$3%~ `ew 3w 3 bf 8 >3l$ &.$3. 3,o+ "<  *J.wz!# c*p p 0 0 46 & #T.wl27 X2wT2 H2wB2  e\^ w`f  t 21 f %   Е.Е Е & & & & && & & Ε {) &  Ʃ & & & & && & & Ε O)&1(11 111 1 11  ѩ z   ~  Е.Е Е & & & & && & & Ε )& 000 00  07 p07 n07 l07 j0 `A   V x$ z!w ( ,  e0w 0    w @0-//////-////7 /7 / > UB+ A7PD+@+P F;E$+ eB  W3  q, q,# ,׭& v p   Z % w@w l Up* Be7Pr*n*P t_ER*# Y& & & &  N& & Ε c00 mLK`KTADATADATADATADATADATA&& * * *00 e p 0 -)-)$%)6) )) ` /` ' $Z  )) ~)-z) -p)ef)w d) C z7 L)7 J)7 H) Nwwr &5&5&SYZ)V)T) 5& 5& 2w$ z < w)w) ч5Z&L&J&% , 6&, J % 5"&5&w7( $0 &eBC $  d   * T7(wHA   1 P N50 E%876(7 *(((57(%(w7(h7' $5&%7' X F ݾ'ݽ''''' '''''wN7'(*"-!--& F҄̋   ԋ4 $5N$7'&=-w7&7& 7&7& 7&7&& `&5H&wxl Ev+ l+w`h+l&h+mb+b+R+F&B&E<&5%U%5# B#Y\!  Xz78" Zr,"! # v 5%* pw &3$ -5058BE%8 %05 9E"7 "E85" 5(%  "Ρ5p"U%lwXw 0 >**t+5$,w&$  * f'%y(t!?wwk#7 f))))))))) w)) e) )w ) ) ,  3*.  lX)F)T)B)H)@)D)<)** e`E8,  "5(7 #l#E((B,( #(56#  ^b ɂ \7 Z#l bE#w &w^5"  $ Bɂ w 0 >* ˤZ#B& h pe7  t ~w7P"U"5  U85 U\"" \"P b Xw7 L"D"5;eH 5 ,5!H 58-h5 50x  ! d2w.7  =5!l3-/-+5!'!#!ylz!v!-- b$ 5@! V&Fewl& Ud& G5 ! !70B&:&-2&4&.! $&"&l0e! L p    5  p#  w0 >f *ǁw5V  %7%7=% 5 eȵRRRJeb 2  EDfVX5     5 5 bR  8w5$ >E$  Z  z 0< F*5H (HwxXeH J   f&    # @    f ȁ0 @50 b   pN5  5  p# )5n# & 0  0 F# wf7=#7|#l   ! w8 55l& ֵ!l   w*w =57,""=ֵ "\ELf&'ܢ55>E# #  f"  fp"wj"7p"eBj"!t )*0 > 65 "5"U ""!& D    5l !,&P7     bBeAeB  U U w| 0 dw83.l wB@  : w4 (, E 7   7   C!C& w  l J&f f   *w `~ w x HD@wT7"L 0 * )x* -r2 &*%* *1*'&15ew , Bv     5B00 uL wLSBgwD 5  5U E U *5@*& E& & f&ËDef Ë )̋U&f 5%& w &Ba +- ʥ# . U 0   b   `     &ff &  m  f A N  % ,XX($4T\8<d| $LH0PdpT\4lt8xhL|x',$$ W  &[q W HTITISYSYSYSYSYSY0^00XXX --FLX Version 77 ;>=  ^ & )pp pp&-,1V ?w 7=? ʋ  =b;< ą=P;   ^ wB`w3 H P"D"Ddh$7(elmFLX -- Device size exceeds 65K blocks&f& v w ,(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$ & & @( ҃f  e ee e yj E ;? ;7 :C:>? G>*;e7;?x?D sKEE$s I!x?D%  W W *?x?B?@ ?$A:  $WW ?x?B? 8 :?; 0p χB` ?x?B$> ?;0p Ԃ B` C%Az9%n9%D$d9 5 z88?5x?B tx?@ b5 x?P N5WV ?D87 ?G-8  h h; 88 ? -8 8-8 5`767|8V(8 Bj:= 78 wbVj:= 777 7 #bV 7f? Fn> :7 j77 `7Wz  87%77; & V@ |77?x?D & W H7f7>  47Z7> ?x?C b& W;G Bppw>7 67 6;G00 }LK`KTADATADATADATADATADATA 7 67 6;C  830f# B $&eB G   ( Vw j: * V:`   HVj:*;=B0 4 50 $& m* :m'==ѝ 0ѝ0a(  ow_5ыwX5*;>RRR   r=$& bl 5w/ T $4VVVH;:0 $p&5353 f=$  ^}  < J} eE  = ѝ/ѝ /a( nw  7 ~3 w3 n3 w`Af; }-450 - 455  3 350 3-3j:*;= 3w52  $wxW~ w E  = % 1   7 2 Af; |-R3 5I50 d2 L~>b3?Z3%~>~>>wF3<37637 033m3"33 -22c 3 w 7 2 2 ? 8 2CD  Vx-24? x?B22F3<3 W22  @`73 & zw322;272p {ԆV EC zeFzqq5qA#eAeՕ- @ TzU0U0S >zU0U0eS-1? x?B1$2 W; 271p zVFb . w  + ++ r+%RV%V%W-Z+T+~,,CEDE j !l 7 jҋ |  b9 j,4,7 *ťť  ?j:<$:=$ ť*+ĝ1 Dj:ĥ /ĕ ĕ ĥ  <$*+@`֥ ĥĥ:ĥ ĝ0<$ĥĝ0*;<$eB  : / ĝb0=$H;&/}z/? B/-///.0/. PV.C //.E/.-V)7.-I)7.*;7 .-.." .;.C -x.  6 7 j.7 n.?x?  OW5 "!, , 5, 55,fx?  NW-- +  ?x?C--   W6   -z- e 5@6,  3 3 3 33 f&fE ueFzq 5q A#A&&e# # #  v  e :e , $33 33 w h>x,J,  Pf,>*,,}?x?C n WE,p  Hu p  duV~=*2*25  ",, 5, ?%j:?SY2 CD  ŔE @a 2j:*;%?:H;\^ &wl& & & & & & & & & Ε&P f&7 P*%CT * ?*8*5) ( ?5v)  ?5@h) w5L)w5@B)s  "EB"e DZ DUEsp% 1, B A7)7)% $%DT@@%DK5j)&@ ?5( 5(5( 78$? ??fx? e 5#MM#MT#MS#MF#MU%CT e & & &  %& & & Ε ) 7 )7 (5' y ? ?&7 5' x??8;? 0p q ~(V` ?x?  (?( @(WC BM M M M M PPDL(LPMiMXYYSSUZGB'7 >'? `+ 7 .'"'"'?*; | 111 $)> &-& HV R0&&5#/7m&5&5 57m&em07&5 t,t,5t,  Z& 00 LwLSBg/  F& L& 4& f e>&B&f> G&W ? jWf-r/W % T/% 4fmD/w `aw N Ba5l  BC G5afw RA!wX%aI3 W2wl>% em. : Ք h#f# Ք 0p n$ H:0  n  Directory (: 0p xn z$7 t$ b5!ѕ 5-7m$ $  . P t R  H  B:p nVPH e < Unused >h # VЕ.d  % b %e ee e P (@f e:  ?#-#7 #x?B?%?# #?# ?V?#M##-l#P-^# T##@ w ^ j#l? Ff#% #=L#H# .#@#$#D$6#7 .#7,# $#-# #7 # #-" #!VP? ?MaE%""% "W >W7 "-t"  -H#V  7 "V0 l L  ??Z##|R#&f9 99'# #|?=#wT!F `j"&m"%5" lxqw4H!  ]"U ; k; k& & & & & & & & & Ε b9<7 7  7 A 80 b ^@0h0f jtf+VV `nV rV vV 4 fjV     7  7 x7  7 7  7 @ȕ< Lj}@ 7 l7 D@>> l7 7 7 7 @ȕ< iP@> 4 @ @ D B57 :5@9P45@%  %j%@P55B5ZV V ZV ^V w5 RV tE  55@ 5w w ׁ7$5$55^>5U@ 5  ?:U@U@=Be 5v7 7 @0h0f Dh7 ~:rCjC:= @7tW  5 >56ZV5" J5== W EDw7VVbV; fg bg; Zg Vgb9 Ng pTJwg5 5XE PE    @^VwvfVwn5 5E  E   ^Vw6fVw.&U5? h5 5 V X5  5 7 7  @ zS=G >q  j 7 d?SY ?wp }" @}`"p"""""t"t"t"w? x? w&?wߪ"\#\#""*#""w^l ?"AV  P߇A? B)z?&>  "# t x?   ? V x? ނ  w? V f5DD  7  p--P)ZBmJ @~ c& cfe8?X >P&?$eP  H>,m  wwj: Rd:5  89f"e\e!e c 5f xd2* eA H; 7  N  ,@ R:  eB2B .`G `:AeU D7x$%bV^݇%4%&%%'t't'? ?x?Be x? W,%  U VeB eB    %\V  x? (͇x?E C Ae @  @< e 0 e ZXV C   Ff `eAaP?x? \w z? C ?x?CS8 5x? ?eDAD eD B eCeD $D Vۇ?x? Dx?B>  r |5?x? h+x?@| T!5n x?P >5x? & 00 LK`KTADATADATADATADATADATAx? VjVbK:AeU @7b>59A   E e   euea>? pVbV 5  L \7X 7 7 7 *7 7 :7 2 L< W   @ȕ< P_D7b=eP  ĵ7 5<  D7 7   2 Bᨇ- NV . |]tt]tnP-7B5 % U%  S<5' 55KU  55AUE   57wq   q ˋ \U8UVVVW "7 - GK $ eL>&P  >   5    r p 4Lׇ    0ׇH;*;5\5V ŝXĝTwo7j$Q$$P 7n7X7d7N7H H*5x+b07 x++z,++,,,+--+++++ bVw݇K7e7 7 7 P &?$ GB  @>m  C$$ " eW %G e^ \ P NHGjVV7 $-1 ;G  >$ e"N-  , , VLG>   e  ;-p 5< W  5 rw@N &wBVb7 7 ~? HG wpD>w @h@# 7`N   @B=Cw8VP f W K%Ew C $ Aw>    8 &  GEW"El \  5El F  G PPW KP edh D  . .w `wf&f hw7 B `XC   ꆇVw.rl d ŝj-5p( /|00/  & pW     8憇 w( +*  ' ## !  Ea C    ҆VwR x:9ŀ - %    6ŀ B  Z  Vwܡ   f5   4   &  -  :1 m m ŝ -` 5 M}2w  v n   ↇ ŀ   f ꆇ W W W -    ;18ҕ  zҕ  CJRa E`Daa  f @R   w f ↇ52 w/w<1$21w6 &t p 5   / X V 8;% :   -,  w  &  l  7c ^ @ B GQ N  0  e B a &  0  7    P7 w  7 7  t n -J  \ | 1P?  -(   X e B e < 7 6 : 7  Vvd  7Y  r5  w - w& D7 7 A7 5L -h ^ 7 w  >5 (    7 ` 5 U< w<% F eB 4 0 ,  7 ( &7 d ?% m -b  & ؄? e7 | 7(  e  0  B   7!p A ? &f օ70T   BwR w` 7L ` wF  P  \ C B   & J "ր0 ez  W X'$mmmm  7 0,܆w,K>?eT 7  `@m""7"V?eKW   Zb V  @m6$ J?    ? d  @>m  C$$ "(eW  *  b  f b RVv>?  b?v>f  6 @vކVVʇ.00 LwLSBg@0h0f pP7   Ɂ   > 7 <WF {ؙ9'9: XXX>PD<b<x'@8SYx']SY NTIID.>DE.>DI.>LI.>ZE.>=UI.>NU.>=SP .>FC@.>FA2>x=FB2>x=IM2>x=CO.>BL.>=BS.>|=VE .>RS@.>DO.>RT.>D0>=RW1>==$>&>=>GG?AKA ? ?....)00 LK`KTADATADATADATADATADATACommand syntax errorInvalid switchIncorrect # IN/OUT specsInvalid deviceUndiagnosable requestI/O error on command inputCan't open @ file@ file syntax error@ file nesting exceededBad list file specUnable to open list fileI/O error on list fileRequest terminated -- last block not writtenOutput file spec not allowed* in output UIC not allowed* in version number not allowedOutput device fullDT: UFD fullDevice handler missingIllegal density valueI/O error deleting linked fileUnable to open fileI/O errorUnable to allocate fileInvalid RSX file specI/O error initializing directoryI/O error on FLX temporary fileFile not foundWARNING -- Input file out of sequenceIllegal /BS size -- use 0W,VBWVBW  OPzLB  Y00 LwLSBgskz?TLBr ?qrn&he   ?x?B Φr T?-x?B W4?x? Ħ?qr&e   f?x?BNr WԦ?x?BA$\O@ J&\ x?C  Nr7 X^j6  ZY9x? ʥZux?Br ,r 8NrR$$R$"R$ R$Rf r,  ?9 ?#Vx?B  @W ? x?B 퇱r6&0e T Hwr&e 6 *w ?s&e  wf< ?= w$&&r t*&rC&rR Z:r N ? DD^ D^w`rX 0 422r)" &r3 r $rr Н^Н[НXۇ-h$% XR &772 s:@7ѕ sD9>- sD9 )@e!sD9 dt߷ r0s 1sD9 r)@e  h@e*D9's 2-: ,s  :) -" F b (B:p (VҢ  = Z(B:2sՔ ܄ Ք U 0p "(D2 :0  (  0p '^}B`R`f`f`6a6a6a6a6a*;58wBe% ڱ2.*mP*; 5 ",5,  (>   e% z m=  3МВ~ݚ?CUrݷv-P S |   @ݷ D;< V*;-   v; ( =- 5  >  - Ds  ܡ? Ns5<"fE  eq% Е tЕ-PPPPeH ^ Е   7 >7 & j? -D W  hVw 5 MA~-LAOp dx?BK &NKۃ R$ ( -~ "x?B 7 Vx?B Ȟ   mx?B?-^ T%% N E& ` -( :L F7*2@ $ 7 %O$AO- % $77   x5 U h@0h0f $=  ٴ(zVw:~Vw2 <ȕ< #e  `s :=$<& B  ;$& ##A " # Xs "7,<< #7 B7 d7 7 7 7 a7 $7 7 7 7 :<O : "5 < 89f"e\e!e ," 5f "2* eA  " ,"=6e  557   П-s-o7 7 7 ` s7 5J4- V*;j:= R 6 ^ r7 R m ( ss*> ~!:pp U-V g 7 (H h bss> 4!:pp 0wbV >W 4??-   x? L W W W w? - 00 LK`KTADATADATADATADATADATA ;  *;j:= W -tj b f;^? *;->   ㇵ ((ֵ =>  - s  - Բw@0h0f 7 w2 $$&? G-70Be7$7e7 7 e /7m H;5 1"1,51, 111 (>   ` tI%F zerԷ F>Ժ М*e (7mL   V w=Hp 7? XڇA %\ @ mӉ@  Ρwa e@  H  ;pA eA$heTB pA NV w V 7  07 $w ?x?BAJ ߇A D 7! 7?x?BAJ @ zmrD    xmLAwҫj:*;&7 >0  h=*;:  B &:$ P#? 8ачVj: 5@|0 B  ;$& @# 2 s 7Z7V7 N 5 F dV lV ؟ & ~>?  <V   F%>~>>w7A7 wЄ   VxЎ -Ϸcr w8fe  @ 87 |  ޓ x?C    .%  2 2 2 2 W  WW% ʋx?C*   & 2U ( Ue UDW + f f -5 F &e lxqUe ՝՝|     e jU ՜ ՜  W# e     wI/O Error Code %D.QI/O Error Code %D.SY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VA%VA%VA%IJan-Feb-Mar-Apr-May-Jun-Jul-Aug-Sep-Oct-Nov-Dec- ^Ky_"S"xz#a Jr" FLX -- End of volume on cassette8 Mount new cassette? (Y, Z (output only), or CR) XXX> FLX -- File not found FLX -- File already exists FLX -- Bad response%X%X-%O%D.%A<%O>%D. C Directory ^s SY%N Total of %D. blocks in %D. files%N%N %M. Free blocks*.*;s YtSY0ppppqq9q1q w H& LB&a  NW  W111 D K  M ?   WU%    vM !D  E eW@P   & SY&  p& SY& V 5 W%  lW .)6 * `& sYY  8Y V Y B \  Ys 0 V YR YY (< :1*, ) '5"z 4 4 tt < &EU z R<*8  $ffU *!f1 1    , *   5* &$& 5R f N%N 54-54- 1111 e" :f 0 C |5 333*50 5  % Ɗ&e00 LwLSBg Je" S%Ue" tK%U w Cҥ[  ,  ]   ͥ*D 5  $&  B Y >&p p   %PH Z7   ZUfUhZ&& Z Е ȕ-ȕ  0Z  p  0ZB0ZpQex5)E$ %& e eNUUp & p"e e\^$% 5R  peH pZ -- npZpZ pWZ A t & & & & fW& & & Νxr d)  % UpZ 20ZTq B0ZnqeD eZP Е;  &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e w f 5 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 jjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *}T}w L 8jDl@ TeBT85l@ H @( D N eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@('&15ew , Bv     5Bw ܅&-Vz |D- E %     U EU 5  5U * JJE U *5@*& E& & f&ËDef Ë )̋U&f &ff &  m  f A N  %5%& w &Ba +- ʥ# . U 0   b   `  00 L L`KTADATADATADATADATADATA    ,, L`  X$L8<HP4T\|t|kQ,11O W W  &[q W PĄ 7TITISYSYTICLWKOVSҳP*fj" ҳSҳf& jjV` >00 LwLSBgP 7p  MAC>  p  MAC>   ~,ܮ ,<7 B>Wednesday dd-mmm-yy hh:mmJ ij 8 L, D P8h'D\'DP8t' 8D-4-8-4-t04-34-kQSYMAC -- Errors detected: kQ gOqzw"" @PAMLENDS XR V Z ^ b f j n r v z ~         NSY^SYLINLSP@mCR0ENJDS t        " & * . 2 6 : > B F J N R V Z ^ b f j n r v z ~         ? &&&''@' ' '''' =% R G @X n@f j -w4ffw w@ 0 BtwkQ5"S .qfi -g%NL\`W N &"5@] 5U@e 5# 7\p7^l&7 H&&0#>:# D-  0 $0 &-  #  B feB&< Hf0 6e0 f "# LAF# 8i-# t*wkQ f=1 5 ܦ ` Ȧn (-w 7 X 7N"&(w).eHqq00 LL`KTADATADATADATADATADATAaaa# ABCwW!7 0.wZ *0 @ 5w(2 beB  b d `=."[.}. nw  47 8n0f0h - w4f  7 "b& ؁C z7  X7 "D&1  J7 `Z5  T,@ eB 1  d  ] |%t7 5!eH 7eH R 0 PN" -    & ڧ   5& Ƨ h I&  T ]&  @q& e (|& v x& j& E 2A q& BA |& 4 6& (&- &- -& &  D BfEhBa @ .   Zҕ ҕ A  ? "eBĔ`fe5@P^ʝ\ 0 ( %7 7e 5@< f  w  T^A 4b   7 >0 ҳ gw:ѕ a E8U2 5  7  v7 z  5@faEVUP l 7$ U(b \w  d 5@r7 Ԧ(5 (' 7 7 7  ޹ к3 b d  pe d 5ӤB    ~ wt 7~||ln\\-lPFd  f5 +' gɥa ҕ m %e  e e tX j ~ҕ h *ҕ e 2ҕ ҕ( 74* ҕ,) ef` Z X  * 4 b wD  @&  `e# 3mf Ce&&&& w b #- Cew  wzmwt& hw f 4 J  & T!J;  H w( Է7.@e'  D m7bTTTTf TTTT  Ze @  Dew   f P awwTw J ( <@n j72$ & #(, ƮY,ނ~      b7535@| njhh  5 \ 5 N FB 2$ 2  F # j2ҕ ` ̊ҋ52@ы& 2R &m  e re|&b@ ( @ !f   e ee e w ºw"b       7 7 7   W,@ 67 *7 ڝ #      0 x  t7 tX` V7 V ҲwSY0:MACTMP*** Assembler statisticsWork file reads: Work file writes: Size of work file: Words ( Pages)Size of core pool: Operating system: RSX-11M/PLUS (Under VAX/VMS) (Under RSTS/E) (Under P/OS) Elapsed time: RORWDIGBLLCLRELABSOVRCONSAVSymbol table****** P' 0 0 0 1 0 Z-, 8H|pt`00 LwLSBgw P5 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 tjjlj ɥ@@aujk,bp j5f fˇ ȕ V‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *)V)w 6 8jDl@ XTeBT85l@ @( D eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@,X L8<H!'H(kQSY kQ 2W! )jķ'  ,  b'  w hUeBUUUUU݇ "S` 0)beB ҩ' *ȕf j 8'eB$&< #  w.BU W!<& N  @B! ԫJ w! -- .INCLUDE directive file error! -- .LIBRARY directive file error, L8  n1 !+,.80 KK NW &XHX[֯֯zdzxd ձ gskQxLB"[1,1] qD~~~j(@(#(-((^IrW(,xKKMQ3fJOq` %K[MQQR Rwyz[-7  7 v7  J-%?S ! BFN%= x L< fn1C ȼ U  C 7  f7zwz&X7 FZY  RS  Ļ%\x 4 %%=, 'ŝ   @ L 0 v%,  J U    >  7  "Ý%"    Rf xr ƒ54U  h7 f n 8 ޽ W ϊ we/uf ԕ$ &7 v7q# f e0T7 B :  ޿D4 ^f) ĺ R b J U  -֯ . Ȼ ¹  : @ 8 &  " W!'   Լ ߖ f' 7  $ >7` ^ \7   w  (  -- T..* y Nb 00 LL`KTADATADATADATADATADATARRRRR @7 E > HA w  7  Z  eBb B   #    jW!$ *W!=W!: W!: ׯ.  l "U@ &  H 7 H7    .r >r j &F57 ּ! \ ȼ C F 7w f h U & 7NwN & f 6  0,    V ֹ $ 7  B f 4 0f  F     @e 4U wX    w4w(Cb d!hL  P   ʸ7 R dJhC  FRN$"  %A  w Fm ̷u vr 5 7 7  7NwNw X  и ,ҝ" 7  b ^ĝ T ʷmUT ި L R 7 -\ U@JF   ~ Ŕ U Զ 5  7  F U@U  %RR " %,  Զ5wp7 w )zv p fW"* ! ! C  7 z  5t 7UU >]@ J IU nC d \   ڵ  W!$ ȵf  6 5v@  C BW!&W!!B  C  z0.U$ ַ<  T * @B   D5L @J @J ՋC w p7 *   ڲ ` ~ > `  ` 5U`7w0 BW!< @B!  4 nJU & # &    (U& @e  W      B ~58EU@ T ȴ  Ʒ wN 7$ & ~ ^@ L   tU8 ]w  < P bw, T U߇7.* ҕ  J W U ҋ &ҕ  0 2  RZ ]5@OL jF# . , 8  ^ ^ 8-N ,  hv eBfff ڼ   e0J UU  CUއ   C!w̱ L  U"E 2 "5@P˵ ŀ Հ U. -4UN5l7 > Ьf 5EP :W!:U@ , 5 EU P5-ʭ  .5 UU5U   6 D İj]S `!W!:W!=\ (5 ^ r> fJJ RwF W!$ TW!: & z5N   ( l >  J(b w  h5U J & W!=@ үW!: ȯUfff & @ 5@ZUR& # 5 5U0U5@5 @5EPE?UW" 5 ˵`7ۇUۇf r55 U5 &  7^ ۷XwEwf & f2 A0fE D 'wT Ί 7P -  f , 0E%P%E% 5E%pE%E%% A A 5Uڇ b5UE 8ڷڀ   UE & V V   j ^    ̠  0U @ & l rVH UUW#ŀ5%   :UcW!(3Հ U ] ŀ ~ ƬW!+Հv W!+ U>5U8 PU0- ~ W!(5( 5~UU7 5UE > ŀ PU0 $ U  W!)wU؇ z d, ,˵ ˵@K00 LwLSBgQ˵ JыE F 0-˵ -7˵@1Q#ыʋ *ы   e f&  j $7270 7 ,؀ m,  ыJ ԋ  Հ  ƪ  ` 7 7 Й z!  B  P0@ P ׃Uhׇ  Нmh7~ه t7n 7  0 2Sb D  ԰ UD 5ӝ41 ʨ ְӕ ӝl   #d6 6 , bl H57 w e UNև Ba (7 H7 F 5ڞ "  6 w0  )   \ B  P@0:@0ڗ0 "`$ PUՇ  U Շ &,@@8K@BaTq rtvY.MAIN.Table of contents  $R- x. .,  & & @( f  e ee e iS@AY P@`  s@@ z@s:  D zQD n\! 0 @@ @P   eot J r@ r @ OX %@ y~T@p~@rw wss@ @t;:Y;wwwwLyz j@xS @  s:  @ @r @r OX % @w J D  @@ @v vovK M@42} wK@R@8@ @R@@Rv@R}pT@8 pTpTv[q`"\qYz d};1;B;~\E\XHi}Fދf޳֯N֯֯x֯֯ׯ}گrޯp!P$^?Ê`ޝl!nn!n%n+n,n.nKnKn Nn&XnHXn[n}n}nq%vNQFzd^zxd鰼Rvy ~ ,V %!v |1q34|@ he~|$|(d|W*|Xj|d:|hez|D0M/|D9Mo|DM?|DM|D`Y+|DiYk|DZ-|D Zm|De;|De{|D0f,|D9fl|~d=|~he}|[M |[M(`|P|P|P|P@|P|P|P|P@|,P0|,P1|,P2|,P@3|,P4|,P5|,P6|,P@7||Q%||Q(e|S|S(X|Sp|SqY|Sx}|S}Z|Td<|The||9wW"|9wXb|x!|x(a|AyW#|AyXc| zW)| zXi| zd9| zhey| bRR ԳRR ҴW    7p& & ikQ & 4 w (ԈԄ% &?fW @W >5W E5 W ! W 8W >W EW W W W Ō  $|,e f** aB f¥*W W c@ % v1&  m  f A N  %00 LL`KTADATADATADATADATADATA11?8-A8-   -- 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 file -- Insufficient dynamic memory -- I/O error on work file -- 64K storage limit exceeded?0U 0e`7 f &7 N L ` а;?<0 @`@` e eD J t 1 1 1 7w.w\< ֊ (U5ve7b Rz7 weE& & Y`-&\- bT./!/ wZ'. 1BНDНAН>P B ( Bҋ B hfwBh-@  0  6 쮇b %\V ԒBw<wz % (*շ Vw D6% hR"..> |xtwfw `mB 7 V& >0 T4 @   8 r l7%v7%r炷 l >  & 0 # X % ,  L ժՇ * ..w " 5   : 7  R T f VՇ n L-Uv<-L  Nӷ J v<-D-! W 4-A"%+%- ~J5  \ 0bab b b m %.w ށ%E  ". ( t 7`@@T@T@Th 1"3  e~ x t   5  > 8 4 e(#U2 b(J  5 p  U<-r <-  U m7 7 р7 w" 0 B $  4 $ la      b b b wR %+%-  n0W! W  U,ч Hw 5 8 L *La L   @ 7 w 20  h` hV h% h)LH.......:Yw/M .w֖& ffff Z, Mm e< e< eA ҕ:A ҕ:A ҕ.A  f=0 @4HD E& c `5%E mB- AB- ҕ &  @ҕ- ce.RRRҕ- " ҕ &  ҕ:  W ҕ0whMondayTuesdayWednesdayThursdayFridaySaturdaySundayJanFebMarAprMayJunJulAugSepOctNovDecUnknown hhT^޶ޖޮ6v>.+-2*N/ &*!+-"'%<^C.D2O6BLFTRxd@yuuuuXu0u !"#$%&'  @ @%+2@8>DK@QW]d@jpv}@@@@΀@(P00 LwLSBgx@h0X Hp8`(Px   @@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@LI<NL<CR: EN(R DS(z n , w@ .   B > w w wt EU w wC wC w wB?Ul> w> %bbgfhf6  RRRRRRRRR⋇ @GG B&  X \@$ B! z˵&ԝEԝB >7 D D ( D e$ = B  v  "  q= ?% J=  Č LB5A(K=K?  p.=,=+=+?w- = ?  j D= A@aLD < Aw 2D5A< 0ҝ<@Dċ(杬< ĝ<ĵ ҕĵ@ ^ċҝ}<ĵ ҝp<ҝm<Ίހ 7 T<   , ҝP<ҝM<ѝH< ѝAbҔҔҔҔ#> A%fC XC -@50@ @>C .C@*C@e@&m@C  @e@5@ :JUp;~@@=9A \;-΋25 B;% ?"$5?^;.;5? ; B5~?E;DMn?=h?:  :: ; 7 NA n2AV?:j %j ~H H5?  < qʕ qҕ T5@>  pҕ X5>5>  ҕ  @ .: "j ?: @ 5x>  F z":7 :7:9!EC >ы7 9R@ B ( $ 797 9@  5 ʕ'5@ʕG5ʕC  *  `   p9   \9 7 V97 V9 U49F9 <949Հ,9 4 !& RH  .E5 8 U8 ՀU~&fffff  (ʋ̋ p  R$ ^ P 7 8db(55  ( b8̵E єJ BR&  N B@   N B   E7 75  7 7w K-7 j#5E 5U755@XU@r7E@Rlb BI= = = 5@;UPU@,7 5@|; H (l8 8U 7W!. W!$U6  $  W!. U@6 " e;ş˵@ ; ;  b    #  Q  U N W!> w H& L c7 F6 (eeel7h7 `7  : 4 b   D `!?w@f   :5%~:6 wb F X 47 7`777 7 77 7d5`5 07  C   7Pp5[6w(997<  x<  \6#9 Z6 w 9-b79 7@ U4 4b 667 6 < 15~5 7 |7*1- 1B 1;^7;\ Z7Z7 E`m87 67aE`'-0-0  7B & 76 6^06 0676 `w6$7x07v06 600 LL`KTADATADATADATADATADATA  6 pbw% B0-6<0U0(0&0aA ` D`U lW!  `V6A 2  - &   ,4, %N  w 67 6   # `B w575 s<%   57 5 5@e  n 5   C [$@D"&W! |5 B7r5 4e ^ # u u   f & 0 0 0 5  574 Df4A B C b  ,9f e0R& @    &   `@ rpf0f ..f! ! VJ!@  4@ l $@ ` W f-- -& e @ >  --C0   & N`U  U` ewJ-   $ U- @J  -5 -U,--, F>J ,U,  ,7 ,,,E,,  , J , @J ŋ , ߨ,J $ ,,   8 <* * -w<    p n-w w55& )/5&03 D.00-&0Э2  7/`++--+杖+~0 F7|/     Ld+ 2+  ].+@ BJB4@CDՕ  Օ   e  wfZ/      . w ( UN* 2D  7 1v<>C!W!^ 8J! r d1 VC D \ L1C!D! 81 UU)+bP: 7++ x H 7) 7+f   eE  w d3&e\3w  FE >3 A B` 037*3pA \wR B3! B  @` 2 B`7 2m2e22w lE R 2 B ` p 2722A72 @ae 2 z2 b2  \2N 0 B>2 ` N 272' ' ' &1 &1&1' p> 4e6(B   xH 1 1J' Hp> 4e6(B  6 2.1 䇷 L1 D17 1w1 1e0)w0 7 0  dw f T`  !& fY w`V0K`5W  N  & D -N  P0  `  8 lbRR "  (r,U&R wf&&7 P, #-%-! e  CR&DSENNLINLMACRO V05.04 ABDEILMNOPQRTUZ Page  '&1 *6D "6D 6D\ 6DJ 6D 6D. 5DT 5DN 5\( 5\f( 5h 5h, 5h| 5h 5hH 5hP 5h 5h 5h 5h 5h  5h z5h* r5h j5h b5h Z5h R5h# J5h~# B5h " :5h" 25h\" *5h# "5h! 5h! 5h# 5h% 5h$ 4h~& 4hP( 4hn* 4h* 4h* 4h, 4hP+ 4ht+ 4h,, 4h:+ 4h, 4h@, 4t 4t> 4D1 40 z4`/ r4@/ j40 b40 Z4. R4. J40 B4-5ew , Bv     5BwH 5  5 2  UE E U 5@*& E& & f&ËDef Ë )̋U&f &ff  $0($00oNwLSBg|,DD W  &[q W -TITISYSYSYCLOV^*,7 d   - ee%(Е Е  + @e F7 7 5055@x1#A5h JA  5 NjA  x E4 2 w6w  t (CA J* @ p :* p5 E`E  bwE5   H B >Е Е E e@Е^5@h` Е%Е P e0Pd+5&/570c ) & 555  p *) `%"  VEw- E  0W 7e` & & @( (f  e ee e <F vX'< DMP>PH H B  B BB#CB COPzLB  00wNL`KTADATADATADATADATADATAkz?TLBDMP Version M08.01 (ANSI)DMP -- %X(%P,%P)[%O,%O](%M.)I/O Error Code %D.QI/O Error Code %D.%X(%P,%P)[%O,%O](%D.)Get Command Line - I/O ErrorGet Command Line - Bad @ File NameGet Command Line - Max @ File Depth ExceededGet Command Line - Failed to Open @ File?TSYBL HDIDMD$FI*AS`BY@BA8LBR5HXLW WDDC LIRC@SPDSBRWHFSBHSF NOCLC@   SY&SY< &   ^B&& & AL&?`5Ew w*HHi $%>w }@ 50 v h n,7 7 "7 :7 8 7  'w wH  w 0w 0w p  Bw &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e &7 .7 ,7 *F f + Z%1  11 1 1 11w 4&C `55 < e   5&Е( Е, Е) eff ]    e 5 Е/ fe e @Е CЕ @ L e 5| Е Е  G & Μ& Μ  e &Е[ 5ЕR5ЕW5ЕE5ЕDЕ, ]&% . d % e bfe O e&Е Е Е  e& & fAЕ &ɋPPЕ-PPPЕ-PPЕ PPЕ:PP& Е. є w ^& LB&a    W111 D K  M ?    U%    vM !D  E e @P   & SY&  & SY& l 5  %   D)LB  &U h    %5xmw 46 b<@5Z(   5R ABAN H @W Z%K!B&wRew5,R 0w?w` AB  ?w5ttF U<@B %w~%wzFT rˇR,N,J,4B Е Е Е ep Fw?wv 7 Bw J22 Pe wwW@  w,&@w*聇***@`?Dwl@n@@@@@ L f0 b  f f f ` w (`` ` `  , " ( %Bp 5*<8 b(&6]`5@S U75R < r Ae%'7 bB 7 e 0  vS  w * ,wRF  7 . A&" ew (A5B *|@( 0 fe57 5 %"B em5xB p@  w V-PPw***Bw`?:wn@ T  5 Uw# " -6 - eEm EeB5ew?w-TNR  ,w 5 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 jjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *6# #w  8jDl@ TeBT85l@  @( D  eB& 8  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@'&1 -1 -&5 -; -<> -> ->5ew , Bv     5Bw6 &*+00NL`KTADATADATADATADATADATA5  5 2  UE -% ,Z,,&-E U 5@*& E& & f&ËDef Ë )̋U&ff &f &  m  f A N  % |.--|.<--|. --"`:L-%>-(B- pX|, $L8<H44THEADER AREA%N H.IDOF %B%N H.MPOF %B%N H.FNUM,%N H.FSEQ (%O,%O)%N H.FLEV %O%N H.FOWN [%B,%B]%N H.FPRO [%VA]%N H.UCHA %B = %VA%N H.SCHA %B = %VA%N UC.CON! UC.DLK SC.MDL! SC.BAD H.UFAT%N F.RTYP %B = %5A%N F.RATT %B = %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%NUNDEFR.FIXR.VARR.SEQ FD.FTN! FD.CR ! FD.BLK IDENTIFICATION AREA%N I.FNAM,%N I.FTYP,%N I.FVER %3R.%R;%O%N I.RVNO %O%N I.RVDT %2A-%3A-%2A%N I.RVTI %2A:%2A:%2A%N I.CRDT %2A-%3A-%2A%N I.CRTI %2A:%2A:%2A%N I.EXDT %2A-%3A-%2A%NMAP 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.%NCHECKSUM%N H.CKSM %P%N** INVALID CHECKSUM - SHOULD BE %P%Nw tw X N J 7wH2  ߆?H |.XJeJeRRRJe Je0 z.e 2D 5ЕR5ЕW5ЕE5ЕDЕ, J `re 2 /@ e /er e 2 //@ e '/e ܇8/@e e// 0/2e 2  02 0 2 0U ` U` n/@e e e  ~ /Bee ۇ"0 D DaT 8 m0 "e eeeeeeeee e"e$e&e(e+ ,ۇ0 D Da eeee 71 e2 22e 2 2   $E e e Pp1  222 2 2 ve 1J b @d u J1 D B BaE@i*w fe. 5xeB e: \  @ @ C: >`UC (B d <`ef >  d ,    ;a @0  W f@ Е- ee0PPPЕ- Е 50e|. %< Xf< Nf D@ (Օ: 5Օ: @e Le0e0U&f!  E D  E E C B Ί A AUUUU    T T T T ee(e(e(e(T $)T T TU U U U  JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC&f& v 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@00NwLSBgUC.DLK UC.CNBUC.WCKUC.RCKUC.WBKUC.NBKSC.MDL@SC.BAD SC.DIRSC.SPL H.UFAT%N F.RTYP %B = %5A%N F.RATT %B = %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%NUNDEFR.FIXR.VARR.SEQ FD.FTN! FD.CR ! FD.BLK IDENTIFICATION AREA%N I.FNAM %20A%N I.RVNO %M%N I.CRDT %VA%N I.RVDT %VA%N I.EXDT %VA%N I.BKDT %VA%N I.ULAB %P %P %P %P %P %P %P %P%N %P %P %P %P %P %P %P %P%N %P %P %P %P %P %P %P %P%NMAP AREA%N H.USE %B = %D.%N RETRIEVAL POINTERS%N TYPE COUNT LBN%N %D %T. %T. %VP%NCHECKSUM%N H.CKSM %P%N** INVALID CHECKSUM - SHOULD BE %P%Nw wZ   7RwPԷNԀPH  l܆?H w Е C4 W!Е! DP Ad EA 1JeJeJeJeR p1RR R RRRRJe>Je<b ـe 2D@ J `22D8 r 2`1 tـeJe;re42n2 C4 rre52 2 C5 r 2 72΀PBPDPFPH ه5ЕR5ЕW5ЕE5ЕDЕ, 2@e e33 332e 2 32 3 2 3U ` U` 3@e e e   q3Bee ׇ3 D Dab eT L e 3e K `33e s 3`33 e& s 3`3 3e. vs 3` 3 $e6 54 eF X4 ef X4z և     Е  V 4HJe:2 r:  C:] D Da̲eeE?A A A R    E)W   E EW   E  Eep  RC 4z 4J  @d u J5 @AB@b>SY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VA%VA%VA%I0;(;G;?;h;`;;; 6 5  5*+5U5 5   BBCU% B  ( vf $5 %ld\$ b:7    ;UfUh;&& T; Е ȕ-ȕ  :  m  :B:";Qe~5)E$ %& e eTUU#; & ";"e e\^$% 5R  %;eH : -- :: "; b: A; & & & & f & & & Ν )  % jU";b: 2:; B:;eD e;P Е; \Failure 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 switch Illegal density valueIllegal value on /HD switchFailed to attach device *** EOF *** *** EOT *** *** EOV *** *** WARNI00NN`KTADATADATADATADATADATANG *** *** FATAL ******** This block has bad parity ***** Dump of %2A%O:Dump of %2A%O:%VA%X - File ID %O,%O,%O %N%P %P %P %P %P %P %P %P %P%N%P %N%P %R %R %R %R %R %R %R %R%N%D. %U. %U. %U. %U. %U. %U. %U. %U.Dump of %2A%O:%VA%VA%VA;%O - Rel. Filnum %ODump of %2A%O:%VA%X - Rel. Filnum %O%VA Virtual block %O,%P - Size %D. bytes%N%N%VA Logical block %O,%P - Size %D. bytes%N%N%N Starting block number = %O,%P%VA%N%VA Record number %D%D. - Size %D. bytes%N%N%VA File header%N%NFATAL - Page header line too long|,33 W  &[q W A $CLTISYSYSYSYOV8Vγ Z/(1γ8Vγ' P l,$zE$ EUwvwׯ<7Bn 7 ыw 7 w* 0KB W ɥaɥz W@ WZR w ы wwW W  ɋW W wʋR :ADDAPBEGINBLOCKBOTTOMCHANGECLOSECDLCLOSESCCDELETEDPENDEXITEDXERASERASEFINDFILEFFINSERTKILKILLLOCATELCLISTLPMMACROMCALLNEXTNPOVERLAYOUTPUTOPENSOLDPAGEPRINTPASTEPAGEPFINDPLOCATERETYPEREADRENEWSIZSIZESAVESCSPSSTOPTOFTABTYPEUCUNSAVEVERIFYWRITE r ^' '~ (' x  " 'J F >@' "| (h '"^ P V0'\>&&00NwLSBg)*XSYSY X v@SY[Page][00000 lines read in] D  D   )w(ww<07F 0 7w7:w -jZ  r  *L^wBw~w&Uw  wdw p2 7bw`7 d{wjw77t7.w,7 $2 7w7  w ww0  7w7R7X 62%e;:@09$.CCh  ɕ 7׭7h%0 w|} N7H0 <ɋwH4$7: 4  $ ɭɥ /P7v E Е Е w $Е Е Е 70ww  wt 7h7 [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&PAG% BL OFF&T&BL ON P%&N-%&N M1 5@E@-5 $d r  Z  7E@E7 7 &7 e7tCҐd#נ נ wzҕ ʕ 7w7t  wX :h U@7%E/   5   7E@E77 0 wN7 & 7&f7z $U7P !z&$W xp ! ` 0 7G7 7.0 7 U w&7( O  CCFR 7 05 5=5 5 &@$p &! 7* AQbB`ҕ ʕ $\e m7k 5 wf7UP7w773 /7w@E*7l -  7 l57 E 7(7 D7w 77 &wH7 j5 Uw 77   x b Nw  G  7 &-w +*D</0   8 6,35 %  6m)w@ Z`z59E& e ` 7D F EZ &f ' ( d    e0@[Save file doe00NN`KTADATADATADATADATADATAs not exist][MCALL file does not exist]EDI -- Bad parameters on a QIOEDI -- Invalid function code on a QIOEDI -- Device not ready EDI -- Parity error on deviceEDI -- Bad buffer address or handler not loadedEDI -- End of fileEDI -- Write attempt to locked unit EDI -- Request terminatedEDI -- Privilege violation EDI -- Caller's node exhaustedEDI -- Device fullEDI -- Index file fullEDI -- File does not existEDI -- File is locked to write access EDI -- File header fullEDI -- File accessed for write EDI -- File header checksum errorEDI -- Write attribute data format errorEDI -- File processor device read errorEDI -- File processor device write errorEDI -- Secondary file not properly closed not usableEDI -- Record is too large for user buffer EDI -- No blocks leftEDI -- Bad record type-file no longer usable EDI -- Illegal record access bits-file not usable EDI -- Illegal record attributes-file not usable EDI -- Illegal record number-file no longer usable EDI -- Rename on two different devices EDI -- Rename name already in use EDI -- Bad directory fileEDI -- Bad directory syntax EDI -- File already open EDI -- Bad device nameEDI -- Bad block on deviceEDI -- Duplicate entry in directory EDI -- Hardware error on deviceEDI -- Primary file not properly closed-not usableEDI -- Device not in system EDI -- Unexpected error-editor will abort)Ip[[[[[[[.[[[[[[Jj~6`[[[[[[-[[?[ZwX[>* W vv%*Aɋ7 ы& Ne8^(045;17 3wj  7X pf 7> T wb GV7673^&!7 :B¥a¥z   O$!  : :: e3b 3 [3) ,, ],  3 3 ¥*¥.  ¥;t  . w&  -  7 w * &&a ~a-n  /bxZT &` `87422,"> 2  %e  Eea"wK ae  B (ɋ‹7vwd‹77 7owbX&PLK LwXiwwqH7.e   >5@$ UwE@ҕ ȕ E@ w~ w we wf BUww8f7N^7" r-V\ `7F Eh @wwZOU,7 4UBw5   "77w7Pm  w< EDI> EDI -- Insufficient buffer space [Exit] [Creating new file] Input[Syntax error][Secondary file currently selected for input][Secondary file already open]  z w w   7#3700NwLSBgZ  ,  .W  7#& R7 7 7 Z7 x 7777E}O7 &7,ɥ w6* 07.^#f* 4 JDUESY7 #  7w7x# v  7\R7^N7\7^7V7X7Z777 N7 7 h޷5 7d#5 7Xm#5 j 7:C#vw@( 7 7 ɋ  7 X fffw\ыfQ$wJeDAdw >ѕ ѕ ѕ w ($$ 7 ɥ  w2 1eH f׭ h?>ww| ʝB`ҕ ҕ eb9 ʥ ʥaʥz g7%'&1 . 22 & 23  22  $22  022  <22 H22 H22 T225ew ~ , Bv     5Bw '/05  5 2  UE 2& @10P'1E U 5@*& E& & f&ËDef Ë )̋U&  m  f A N  %&ff  2 222L2222$2220222<222H22X2T2 22 2 $0d00NN`KTADATADATADATADATADATA[Exit] [Illegal file name given in close or exit] [File was not renamed]557w7B5w7 7755 D ~6* rxhd` ^7P27 x  l5 722 r  35wlE7 F7`wl 7 &7 &$ MCALL.?8b #  (7 78b  l 7*`ѕ ɕ ӕeנއb 0Xww4  b <#  07(%X&7PЁe b p n 7w7"b < b  \oBA <b b #  0Ёe 7b p | 7w76 b B Xw X  KDb #  47-7(Ёeb p x 7* ebB`ҕ ʕ 7$b > 5 XwXH #  870U5  ~E03A2?2eE 2&@2m    b|bK,KK// W  &[q W )00NwLSBgTITISYSYTICLOVTId^|GId<0 I | <5 5  5 $5@ 85 5 !wF!wIAB w IDeB$&< BI0# @I&f C&f&    `D D` A      D C   DLfE `9 L9%J|Ǫ^`kQ@-$, \w C w\ 4   % T T  % Tw HCN L$ /3#|e '&` E 3 2A 30# 0-  A w BE7 &RRw B e  ` ,20!p!7(0l8$005 B70 k8 /l8 F /l8p Bچ`whw A ^(p B7 ѥ ѥ j f e  `wp% 8  | */ 7j7f  Bw PAÝ*( w 6AÝ2($U we ?f7   $l8 zA7"x+r"| >e ` R . r1  <    A \1`w  @*5@ZjE@Rw :@$  pD= f /&  E#p0 n@4 e f` 8B 8B#0 0@  0 <( @`w  ?* w B?# DDA D  7ww ? : 0 0  /  L x 4x >(S   "#" :(mLc mD   >? <0 ?`ww l>BC%   0" ><@ >  >w $>`D BE  Aa 3  w =%@ f@A +    =E .e + 0 C@>U@ `w  h5% bB  R B  <.B$* `e&&%B%0%0#  E DN  /Bf B B!00NN`KTADATADATADATADATADATAB7 77P PPPP A1 =7  )7 J!0 t$ <  <7  <` @1wl42 r'&1d_ &7V7JL<2(:(^dkQdydw ,;Be,PW $ ,5 5 :!w7  +5;5 wx5 D 7 (ȋ  Ps P  e 7 w: wz +@555wZw U@5 7  5 (P  |L e \ e    5 %  +̥ (# # yȥ$$ $  )w7 D L( `ww L9 U     Ue  @%NModules deleted:%N%NEntry points deleted:%N%2R%Nw 8 Z  X@!A V;U@e&&   p) b% (B( % @A U@Z0 0  ,)  B(e)Bw|U@*5"   UKz.0 7w w ( )w )B%Bg&7>  *@  w n7w L(www&=&( Z @mB &mpzUww* @  U f e  w 6+ + v'w 874 L 7+  ~  w7$.(   U `d7 b>&(57 f7 d f z0( F x>w7 B  >6*wnHEw" wHw,w  w j bAB er<p z5CP 5  f5*M 5" ~ x5  @ <| 56J|p 4ӆ(* 57 L7 7  U4w`w^  % U f  * 2!ւ 2a aEe7 w  U n$ Module "%2R" replaced MACROREPTIRPCIRPENDMENDRw 3w Ldw Z |b #7 wx , "Jw  7 x */ `wB   5b ,  2*w << 2w 2  2* "P0 0  D2 2* / R2 *' lqq pp 2w < 5@   >( 1B@ B cB C <f=(TSTSTSSSKTZ  ?# 8TNTPZe $8w j 41w  BC6 0w< 0w-(w" 'wB \B T  x07 7 ~w^ 0 vwR7 d ɥɥ NEl E 4( |5,( Xwwe _7   /wND!X P T  D E %% "% %,%;8Tw   % % %,%;wDw>T4( z ( N 5   5T wLר; w  w0wC`U |W.  w 4v|E Z W:W=E U  D&fBʋRe V   aa   C W; W W  ר ע   @7 |(, ZˋTHLJ  ~8wb4( 7  Ta f%F%2NDirectory of file %X%N%VA library created by: LBR 00NwLSBgV%2R%NLast insert occurred %Y at %3Z%NMNT entries allocated: %D; Available: %D%NEPFile space available: Recoverable deleted space: words%N%2NUNI LIB DEF filetype:%R%N%N** Module:%2R Size: Inserted:%Y Ident:%R%R%N%P%N Attrib:SSContiguous, %2R OP info:%2R %2R %2R %2R%N User file attrib:%P %P %P %P%N %SObject moduleMacroUniversalw ,+ v *%0   `w`7" * ` @ e ( ( 2(( S **( V :( Z 6(  m 6( : B( %  Z`e w` 7< 5*  5ce  `wF > B 8  ( E 7  )    L .\B lN @eB N% 5>w%  D   %%  F % w 5> 89f"e\e!e &) 5f L)2* eA  (D w (( N x  (&  A (7 500 5 U    \(T T(wXX^kQؙSY:w l'0  h"   , w#Z'b ,#77 ȥ: (wz#+wR #5b @N"   @wA HB(A! , eff  wu57(w\ &zxmp lmh%b Z7 X B0 ~Q0 |(4ݸ  <&w 0w$ &%   wzb\  1& h,| %w*X 5` D% % pp R%Tw b%7  07 f w f$ J%w weff Rwt<Le e˥#   V$4&w:   n$<@ F$ b$w #(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA P#EAa$az   & & @( #f  e ee e f& &f& v **7* LBR>***SY +*+h++_"S"+++SY+++*,H,\,P-B-V-SY-,j-v---IN@00NN`KTADATADATADATADATADATA-/RP-/SZ-SS@-EP-4.&.:.SYz.N.Z...CRZ/COp/IN@/RP/SZSS@LIFULEDE /DF ~/DG *0EX/EPMH/((<BHNTZ`flr( (&(,(2(8(>(D(J(P(V(\(b(h(n(t(z((((((((((((((((((((((() ))))")().)4):)@)F)L)R)X)^)d)j)p)v)|)000 NSY0J00@1^1LIFULESP12262K2a2222233@3]3w33333 4"4:4_4|44445)5Q5t555556I6j66667/7G7d7}777Illegal Get Command Line error code%NInput error on %X%NCommand syntax error%N%VA%NOutput error on %X%NIllegal switch%N%VA%NInsufficient dynamic memory to continue%NInvalid library type specified%NCommand I/O error%NIndirect file open failure%N%VA%NIndirect command syntax error%N%VA%NBad library header%NIndirect file depth exceeded%N%VA%NI/O error on input file %X%NOpen failure on file %X%NInvalid EPT and/or MNT specification%NPositioning error on %X%NEPT or MNT exceeded in %X%NDuplicate module name "%2R" in %X%NGet Time failed%NNo module named "%2R"%NInvalid name -- "%6A"%NLibrary file specification missing%NIllegal switch combination%NNo entry point named "%2R"%NDuplicate entry point name "%2R" in %X%NToo many output files specified%NExactly one input file must appear with /CO%NFatal compress error%NEPT or MNT space exceeded in compress%NError in library tables, file %X%NInvalid format, input file %X%NOpen failure on LBR work file%NMark for delete failure on LBR work file%NToo many input files%NMissing output file specifier%NInvalid operation for object and macro libraries%NInvalid RAD50 character in %6A%NCannot modify header%NMultiple module extractions not permitted for UNI modules%NInvalid module format in %X%NRMS module cannot be extracted to record oriented devices%NInvalid filetype %3A%NIllegal filename%N%VA%NIllegal device/volume%N%VA%NIllegal directory%N%VA%NWork file I/O error%NVirtual storage requirement exceeds 65536. words%NPrivilege violation on file %X%Nw  pE 4N A B` @7:pA .wf. f 8 ́eE  B B  @`   B`F vpH,4e6(L, N d> >t pH,4e6(L,  "䇇7 .w( $e,)w 7  - ̇w FE D  B ` p 7A @ae  V,0 B ` V,hw f8 "4V, & D -N    ` 8  h ,X H w @pdf |H B$ĵ4ĵ!%'% %E$e@ P  *e ,e +e ʱ& ĵ V 11@ Be ʱ BAbpd fwphjɁ`  %/ -%/*%//$`¥¥¥  ¥ ¥ef UDZw ~ *7 *7 $7 $8 W,( 7 7 L# z %* 7 2 7 *   &?,-fW >5W E5W sW s W ! W 8W >W EW W 00NOSBgW W Ō $|e w d 5 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f  P aAAf@pnp ` C*8֋ z 88*Ë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@ DlljaCeH###33 & * 8 *??w J  8jDl@ & TeBT85l@ @( D v eB& X  & @# @ & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ --*DIAG*- --*FATAL*- LBR -- *FATAL* -- Run aborted(?h8Ah8'&15ew j, Bv     5Bw \C{G|HPIB-J ަD- E %     U EU 5  5U JB JIC4IE U *5@*& E& & f&ËDef Ë )̋U&ff &f &  m  f A N  %, |($$H8 `XL<Tt|,## W  &[q W x@00ON`KTADATADATADATADATADATASYTISYSYTICLOVOV0x^D00  R  %`!! w&) ` c 6 0` % ,  `7R w &  A z 7*@m7  ,1 C7 pM w"  7 / *w 7w n `  efA <   \wr h 7fwd  t L D v& & % N  V    . P s ew    A C < w CB R fw &eC %E`& 7 pB   2wV  cAcA & 7A ~ &e Cm  &m`e` ` f`B` Z    f  !0Ud   `p f& `,,&  mV  (B ce #M X f F 7 F݇@  e e w Kw  N q 8 5 . . +R qUq eB  Bew ( P # j\ ^ R  hwh %2R %2R%N%VA%N :RR        w%VA F R   (R00&OOSBg j $  & @N ECBN e@A f& r Ze2#AN?Nf  "eE  w xE   A B` 7pA whL w E D r B ` p B7A @ae  0 Bh ` Fw  f , E  w`JK`/ & D -N    `   6 &   vp4e6( F d> > p4e6( "䇇7 w e)w 7  I B B  @`   B`|   v  f m ` N@ Be?E? & f Yw w      7 7 7  W,( b7 V7 # %* 7 7   eE 0B&Jm    b B`  w` d w wzmtt 1,1,J 1,1,f** aB ¥*W W c@ %'&1 .! (!5ew , Bv     5Bw kQr~$CD5  5 2  UE  "DE U 5@*& E& & f&ËDef Ë )̋U&f &ff +\]    + ^    # ($ `T@hp$0HSYMBOLSYMBOL VALUE REFERENCES=%= % ****** R G RG GX *#%10<%D-%D%8>REGISTER SYMBOLSYMBOL REFERENCES #*%10<%D-%D%8>MACROMACRO NAME REFERENCES #%10<%D-%D%8>PERM00.OO`KTADATADATADATADATADATAANENT SYMBOL TABLESYMBOL REFERENCES %10<%D-%D%8>SECTIONSECTION NAME REFERENCES #%10<%D-%D%8>ERRORERROR REFERENCES #%10<%D-%D%8>GLOBALSYMBOL VALUE REFERENCES... -R # * ^ @ %2RSEGMENTSEGMENT NAME RESIDENT MODULES %2R DJ @( H6 PD X7>R `jo ` h n p v 8xbdfh$Ujp$*U[v w@z`~P+\  !!! !" CRF -- *DIAGFATAL*- < %2R > - w \D!e EW= f"!  ! B "Bj  ()Z %@80wf&V""""""#)#R#In#K#L#U#ILLEGAL ERROR-SEVERITY CODE %P %P %P %P %2NFILE %X NOT FOUND %2NOPEN FAILURE ON FILE %X%2NI/O ERROR ON FILE %X%2NNO DYNAMIC STORAGE AVAILABLE%2NINPUT FROM UNKNOWN TASK%2NINVALID OUTPUT FORMAT SPECIFIED%2NCREF INPUT FILE %X HAS ILLEGAL FORMAT%2NFAILED TO DELETE FILE %X%2NWORK FILE I/O ERROR%2NUNABLE TO OPEN WORK FILE%2NNO VIRTUAL MEMORY STORAGE AVALABLE%2NSYMBOL TABLE SEARCH STACK OVERFLOW%2N|:,?? AW XXW  &[q W  XTITISYSYTICLt0V 0t0: & & @( f  e ee e f& OPzLB 00OOSBgkz?TLBZ~'@ IPP>P SY SY IPP Version M01.02 (ANSI)IPP -- 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 foundOutput file directory not foundGet Command Line - I/O ErrorGet Command Line - Bad @ File NameGet Command Line - Max @ File Depth ExceededGet Command Line - Failed to Open @ FileSY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VAI/O Error Code %D.QI/O Error Code %D.:?TSY 5-   j0 b  f j   tw `` ` ` ;,y"W(%""#&7 7 7 >f  %1  11 1 1 11*&" &?,-fW 00OO`KTADATADATADATADATADATA>5W E5W sW s W ! W 8W >W EW W W W Ō $|e 6 5  5*+5U5 5   BBCU% B  vj $5 %H!@!8!2! 7 0   UfUh&&n  dЕ ȕ-ȕ  *    F *B*Qe5)E$ %& e etUU & "e@ e\^$% 5R   eH j -- jj  A L& & & & f& & & ΝHB 4)  % U 2*P B*w ,& LB&a    W111 D K  M ?   U%   j vM !D  E e@P   .& SY&  & SY&  5 %   )B  &j }  l %ANDqASK>ASKN;ASKS=BEGINMCHAINNCLOSE@DATA4DECFDELAYVDISABLE5ENABLE6ENDJERASE?EXITKFORMXGOSUB3GOTO0IFzIFACTuIFDFoIFDISABLEDyIFENABLEDxIFFmIFINSsIFLOAvIFNACTtIFNDFnIFNINSrIFNLOAwIFTlINC9ONERRPOPENIOPENAGOPENRHORpPARSEAPAUSEOREADQRETURNSTRLENFSUCCESJSYDISK\SYMTYPESYSDEV]SYSID@SYSTEM?SYSUICcSYTYPmSYUNITDTICLPPXTICWIDYTIME`TIMOUT:TISPEDWTITYPEVTRUEOUICaVERSNnWARNINKLi > 7 &w&7  > 5f. RL ߇5H#.  `c`\X> #  :}:w70:  *we. . ! / ,/  7  7A   . '  w;w :! vo]   x  <wT;! ?' \" " :   ҕ  7 '  'w   >  w2\> F 0w*,Vw* ,Vf|\ f~7`  A5@E (/̋ե>7W |v7,7 jc7#777G7 Tw PmL7 Dw @<-8 ҝ@7   F 7Q wW#A!@ 5  D &ffE ̋E V V  w |5 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f   P aAAf@pnp pC*8֋ J88*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ NŀajTI& af* n*`V @e,w jjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & R8 *j>w b 8jDl@ TeBT85l@ x00OOSBg@( D eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@&f &ff &  m  f A N  %  8\,X $L<H|| ,?3?3I W ``W  &[q W @ޯe 3`TITISYSYTISYSYSYSYSYOV>ޯj: >&4 0 `.~%   @¥8¥9w (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA ^EAa$az   & & @( f  e ee e &f& v f& w &&E  Aw    j2*-  N(@ep@ D  e  ` e      R#R-w   . Z ʥ*3A? +TRDEMC@CL@LO LB6ER@DE j:x 0t:IND V9.0,NPR,FMS,MPL. Task built: + (@,*SY[],,RSX11 ,SY&RSX-11M-PLUS@  R R SY2000OO`KTADATADATADATADATADATAdSYTIdSYdSCf p  ^ SYS$LOGIN:SY:SYhntz  d  dW 7< H J z j j n ~ j n b'SY  dz < < < <`+<`e ,  ,   w|NO HELP AVAILABLEALPHABETIC REQUIREDNUMERIC REQUIREDALPHANUMERIC REQUIREDSIGNED NUMERIC REQUIREDNON-DISPLAYABLE CHARACTERFULL FIELD REQUIREDINPUT REQUIRED<)0[H[J[24B [J#5[K[B[24B[132C[[?3l[?3h#6[?5h[?5lDM_ '% ~%& >&t($Ok[2&M>&P$Q'R%S%'A&B&CX&D&2&TT,-*^Pt:00w p >EuB AeueOu%UU"wMe 5 %&  05 :ue  5  Aej~UU dBeXPCeL eVe 0 BCe~U   L L  >E  dBe$R~ D~ & 5*5% "  %P P   25, @A- 5 B5%B@mBAmBu     U  E~  50 \  h ` @ ~ R  u  :  X 5     c7[H[24B[132C[6n8[[c[? @ ɋ ;B  0 9 f e 0`  w %@mB     E~  w@0  ` Ce2`54 `  E@t0  t0 5 6U& t0 5NB& E% W @&  &D5@  $D  K se~ ~ e 4w00OOSBg D4 %56 9 (   h~fe &4~ L5 U5@  eP ~  E  ҁ B~4e• D`~ E5@  w KmB3eC-4  wB6 % RR D~ D~ 80 C2 4QA8B 5@  ` ` VD45@ +  b  &f  m ~ 8C~meI~ ~ 5!6̇U DE5`u-   t   4 z5@ & B2   nꆇZe B` . . 2@   @ B` 톇   ҋ  %UU >u A ˥*  :0e L=  0  1 hL= x <  l  81@ "B8  5ZTC2 4 C@ xL=wd 2 l5C@  1e1 1  0 ~%%~%nRzW W C@& L=@0e r $@2"e $5@  0 &  L=eH~ l     4&@`  8  4  lw Z`ҔD~ &    .&@`  ; Z r t w C`~ D~    eC~L=l f5@ & @ P ;  B r 5 : @ w T J 2 L=6  w $  C~ D-6L=66  h  wB@ʢ    1w  l ^ w  b f #N :B` e~ 2 C6"    e a~ 0 e    D4 R D-65@  5   E  C` \ w ” B  ~az 5@0!0:Aw , B5  4DV , 5B~mB`B~  ~5>5  ѥ ~eB'@ J~! X  e  @ f ~ z 5@  14575+5õ@ $  N !0  ;BC m õ(  f @   5  N .  E BVfP  %X&!t-<%&%&  <%$#t-<. C@%'C@ &C@  wN e B ѥ. ~APBV1 2 UE U@E122A& `1e2? Q$ A5 W >&W ' W t(5W '2& h &5-5 r'm!WB< q~  ,& FB<C Q~f:  t-<0Am< ^5  5t-<5 5@  %6U T@5  05  P @0Aw $ 5@  25@ $L=%5@ & l 6 6Bw F"5@  5@ L=6 6dC5@   DD5@   $E 5@  F    B  | t-< R Gw B> <t-< e ` J w B> <e ` $  >`  <  <  < <H <E Bm< 5#5A< C~ f: ( % R A<C~  H5 , 45 f: h  nUI~ `!~B-<d  F UUw b 5 Ue B` B`  JEf:fBAe*Bҥ ~ N5 U 00OO`KTADATADATADATADATADATA v%' BEAe ,  Jw f:Ae$  j ` X 5 0UC2 hEC@ 0w V  5E5 <e  U5<e`  B<w  Lu :u ; w f: 5  0E  &f@ D~ U  r 5 :A *Cf*9L*Nz*X**F Am< U E6)5   4  eыAm> e$  \ AZa%z p09  -+ +- . Ѡ~ z lH   ~5 5  .(C2L=  5 f   F5 : uew %UU  ~U@  z %>&2& 5 :& *; j  H X: `w * d1 0 C    e0 e0 ;= u- @e5 5 f@  B $      Bɋ W]W: mKɋ F&&p"eB& # *5WSWPWM Br 55 (f1A%& pp4e6 h' j$%%b'  " 1  z 1  BrztA1d^w 0 *AHCCHeEfD & p4e6 ͇ ʇ%FuJ `Dw  E) B ",e$FFJ% ~4 C-C`AleC ",e%uDH UBE`JF R5H&    85"   @,e fe N,Nv v  1  EF 0 JEJ@JeJF  @J J F F5 H   e  &    b $B Pf&0 EBa & & ̋•v ` !A[$%././0: dE T4 U & BU E f& f& &f&f &  l& & & & & f& Ε(   0& & & & && f& Ε  <   <<9 & & & & & f& Ε  &f  w ѰB   f& & & & && f& Ε( `  ,& & & & f& f& Ε( f& &  ׭JW1 TwHNO HELP AVAILABLEALPHABETIC REQUIREDNUMERIC REQUIREDALPHANUMERIC REQUIREDSIGNED NUMERIC REQUIREDNON-DISPLAYABLE CHARACTERFULL FIELD REQUIREDINPUT REQUIRED [?2l \HJY7 KKBY7oY7 p%" >#$ #4&"!A#B#C$D$P#Q%R#?[#M#%*F+Z8f *|R.b.w 0 EuB AeueOu%UU"wMe 5 %& b 5 :ue  5  Aej~UU *BeXPCeL eVe 0 BCe~U    r E 6Be$R~ D~ & v@A- 5 B5-B@mBAmBu #    U   E~  50  P  w %@mB     $E~  w@0  ` Ce2`54 `  E@t0  t0 5 6U& t0 500OOSBgNB& E% W @&  &D5@  $D  K se~ ~ e 4w D4 %56 9 (   n~fe &4~ R5 U5@  eP ~  E  ҁ B~:e• D`~ E5@  w KmB3eC-4  wB6 % RR D~ D~ 80 C2 4QA8B 5@  ` ` VD45@ +  b  &f  m ~ 8C~meI~ ~ 5!6̇U DE5`u-   t  < 4 z5@ & B2   nꆇ`e B`  . 2@   @ B` 톇   ҋ  %UU Du A  ˥*  :0e L=  0  1 hL= x <  l  N1@ "B8  5pjC2 4 C@ xL=wd t l5C@  1e1 1 ~ 0 n>#">#@VW W C@& L=@0e  : @2"e 5@  F &  L=eH~ l     & C` L  w x`ҔD~ >    & r b <w 0C`~ D~    eC~L=l 5w   e~@~ w   2 L=6 T w n ^ C~ D-6L=66  h  *wB@ʢ |   1w  l w  f #N :B` 0e~ v C6"    e a~ 0 e  z  D4 R D-65@  5   E  C`  w ” B  ~az 5@0!0:Aw v B5  DV , 5B~mB`B~  ~575 ѥ ~eB#@ P~ r e  "@ ~ 5@  f @ 5  < .  E BVfP  %$!t-<%$%$  <%!#t-<. C@%p%C@ &C@  wN e B ѥ. ~APBV1 2 UE U@E122A& `1e2 Q$ A5 W #W % W 4&5W %# h L&5-5 r'm!WB< q~ ,& FB<C Q~f: v Rt-<0Am< 5 ~ 5t-<5 5@  %6U 0@5  05  P @ Aw 5@  25@ $L=%5@ & l b6 6Bw z ""5@  L5@ L=6 6@C5@   t D5@   E 5@  ~F     Xt t-< . Gw B> <t-< e `  w R B> <e `   >`  <  <  < H <E PBm< 5#5A< C~ f:  % R A<C~ H5 , 45 f:  :U~IJ `!~B-<0  UUw . 5 Ue B` B`  8Ef:fBAe*Bҥ ~ N5 U v%% BEAe ,  XJw f:00OO`KTADATADATADATADATADATAAe$  6 f " \5 0 UC2 * .Ew 4  5E5 <e  U5<e` b B<w  *u :u ; w f: 5  E   D~U  b 5 :A'C(9'N(XZ(Z(6 Am< U E&2'5   4  eыAm> e$  \ AZa%z p09  -+ +- . Ѡ~ z l8   ~5 5  .(C2L=  5 f   F5 : uew %UU  nU@  2%## 5 :& e de X: `w * d1 0 C    e0 e0 ;= u- @e5 5 f@  B       Bɋ W]W: mKɋ F&&p"eB& B# >*5WSWPWM* Br55 (f1A%& pp4e6 h' j$%%b'  1  z 1  r BrA1tnw 0 *AHCCHeEfD & p4e6 ͇ ʇ%FuJ `Dw  E) B ",e$FFJ% ~4 C-C`AleC ",e%uDH UBE`JF R5Hp&    85"   @,e fe N,Nv v  1  EF 0 JEJ@JeJF  @J J F F5 H   e  &    b $B f&D. EBa & & ̋•v ` !A[$%././0: dE T4 U & BU E f& f& &f&f &  l& & & & & f& Ε(   0& & & & && f& Ε  <   <<9 & & & & & f& Ε  &fv  w ѰB   f& & & & && f& Ε( `  ,& & & & f& f& Ε( f& &  ׭W1 Tw T&:)uE@ %:a `u>MN[[e  D(e:(C(  5@5*6 T @2ȋ eT5 |N ) @   J 5 wL DC uw  E  @e:(w5 CD>%  6  ^p + 6k5e d ^ [U5@ D(  G "uɥ;5<5-Ԩ  5@ u5 Fɥ@5ub , H5w E 5 @  F@8jMABAe @&PPP@C&5 A  88Ue  8 "@0 *_%`AB wz@ 8u j  5 , ɥ/b J  1ECe, e   ' @%7U00OOSBg @ E $  , D(@e , 5@@e,C& : K s@w@&p (> :9%>%6ȕp*f  ߂ȕp* eBEETH EBe @Z5    *O 2e(5 @&B D B 2=2뵊 D(:(@$8 &SY e2edE_$8$8$8w P 5W E5W sW s W ! W 8W >W EW W W W Ō $|e |aeE @&\ma  ta la babe?E? & f YBEGINENDInvalid answer or terminatorString length not in rangeValue not in range? [Y/N [S [OYNSMHENABLEDISABLEDATAGLOBALLOCALSYMBOLNumeric 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 default 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 symbol Undefined label .Data file error, Code Redefining symbol to different type Symbol type error @ Internal error, Please submit SPRFile attributes not availableLogical name translation error.EXIT without .END:ƻڻ LBTA  <SY((((.ONERR COMMAN EQ=GE>=LE<=NE<>LT<GT> COMMAN COMMAN " " P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 Pausing. To continue type "" >ContinuingDelayingValue not in rangeMCR UNS MCR RES START CONTINUE '%DMOSRLZCXV.֎H֪NX^dzֈքֆրTRUEFALSE -- +-*/!&()#.Htۀێۚۢ۩|,,,NSPSYSUSRi-)3=d@INDINI  *4>HR\fƪЪڪ &,6@JT^fpzīΫث &08BNpxxQdsƁ{800OO`KTADATADATADATADATADATA4S;" pp 062ZZ !L^ "u~a#!afa$ vLOqw<OqBx:Ayz}z8. &""b&0"bRBx(zX4zyK#<} #d$&&0 zX""`w"Y<}@%w""Zb%""wb&""b#" a't b'|~Şb8{~d*k~M*k~,*P[M ,!&r &zC;4z<@u~@z60zjL_M_M,\X\XY 'xx (T[zd"a &Cy$z.  Zx. H8bt|48DnXRPZJT^DF=DL=XQ=GS=ST=CN=UI=&  "&  J "J "&  J "& F "" "&  "&   "&   " " "F "&  F ""ALLANYCLSCSHDATGETGSCLSTOPNPALPSCPUTRALRTNSHOSPFSPNTRM   "6Ĭ֬ :DzĬέέXFMS Unable to initalize itselfFMS-11 does not support your terminal typeVT200 series terminal must be in VT100 mode for FMS-11Missing Required ParameterIllegal sub-functionVariable not found or of the wrong typeThe .NET command is not supported in this version of INDIRECT">L\k|̤f~ݤ4Latͥ/M$Cc   r4W-W 5eW !7XU>0 0  D 7 Ww w@UwVU` w 5T WW 7WET L WxWnӥ.wXgUA \פ:OUM@GUBU`UEw" RU.U='Uw @U V.,Uz F.uTT UT Ug .T_ .ZTTTTT T@T7VES.;= "V r  HU1}V07tV ,) ȥ|ȥ. ;w < 4Bu  v.@ Dw*,VA*ww$T 8ʥa ΥaE ʋŕŕ7XwU7U7U7U7U7UXU   0JUB7 zT & \׭rTw, >ՇwTjXw ZX-VX5 wlf&f AB C5 u 5 5 Saz & ffoT 6v  |% v(5 EݬTuE  5  C$ƳOTB TT7 SSwTwPRw^R BxS"S%ȥ -S E SUR-R5R-%*ȥ &7TSBmS S VV7S  ȥYȥNcw*׭S 7S}VwV jV GwrS ) ߆ &# 5R:V.ҕ.  5R ,MD.S 7S UUUR x5RУ $7U7U7 U7U7U7U5FRU杨R b [Uu&  o7xU @&wfUrRlU:c ,&w RU]W WwBULRFU L + 7/U %w U(R"U = 7U %A EwT  & *wTwT d BT Z@wTT ¥S T¥MT¥H]QХ:]  Х:] QPӕ*ӕ Х   fHQ "@& "׭.Q OTD@ TЕ ЕRЕ:S Е-S S&Е ЕDЕ:׭PS -PSP ݭS SЕ" PЕ"S5"P7SЕ ЕTЕ:nS ? dSPЕ]Е:Е ON >S > >Е.7 MLLOLLSL7 LRLR_b\ !AR)& +R"'5L7O VL7 VL)7bN ^LeRaLN  FLGRa׭.N 56M7LO LwX&M R   M M  !w> =T|N&.W;T L Jӥ  C > L: :     N .&.#N Tӥ   < 5L åaE Ѡɋ&  { y00OOSBg s&CBr AƠ  .M||MbK7 KL 8#YwK 8D KQ  E U  ¥,  w %LKKw 8 6 0G`|Lw vL%%e @JJ J  ` P Jw!JA VwffLwL rw!L%wLBr%>BrLK  E}x BK e(J&L @ZP :Е. Е:KЕ<A FA F  KЕ>I2KI I+IK V NKB K HRJ `J pK  PJK.J ~KWI7 ZIw"J XwH/K L'K&K0 KwPK1 IJIKK%JI `5 H5HmrJ   m\JH7 H&HmGGrI J# JH ` R  JJJ7 ZH J\H5 IILH7 NH?H;JEI \4 Е/ЕLЕBЕ: D DhI wJ , I mW7 GA` N8  !@ B82J 28 w*rI= OOȋХ  EHBwVI ::&H   V!@ 7w*IW*5HW*7IwHf ,@A f hHe,D1 THe@"$7 H   ||wrHw"pHRK JlGp 27c _7 "K5Gȕf  7ȕ 6B>: n H`@eBGe$&ĝJ e? \G Ƨ7*GLG J   4Ge, F6wZ@*< 66FF# @* :< 63#OGwf J!# V z F @F  < 5eB 5 5* > 3@ n5 4F @ AF :  @ L @t   ¥ ¥ ¥ ¥   Bʋҥ! BEN C$EE֧D   CUB@CCCwz> 2DE` <4  :4eb kE .D*D7YEVEwPEwL4Wŀ5CWWWWE  U   eF A 5ZD; `9   hD7dDew.DB > 3zBBUA7 xB7jB  XDhBTDdBPD`BLBLBw, :    C7C Te> 2T wC-C/ Ї  &C * @ b > d2`CUA7 AAwHCw>C7!A ( 7,C7pA> t2    :    VB --   [ nC >B28 / 8 /3B h H @NB7 @ 5 &B@ E~@]Bx@B BBы   7 ?UN@w,hB W7&E'@E7E|  &6E %IF  l ( |l. DݧDDw@w         7iDfD&  ) >O&   F&   =&    f֋w & >7> > >:~@fw:w.w:ݧCCCC7C&  R  p Bڠ yBw&>$>S?@@w!; / 5@>! 0B?7?C`ר->&& & &  5r>5 >@ >&a  8w<7 <  wpw jP=B (>;f 7*>@LB: C5? \-  @:[ $/R ɕ@(> 00OO`KTADATADATADATADATADATAB>8 08 & B`ɕ]=B8 8 ( *  7=52=U 7 :<=E;ы  = (>wv8<=-@+% & &Y&?7<bw v==r=( p&& & & 7 ,= +b %4 2%[]z< j+F L & (-P4  x= & -848=4=. 4 4 3<<==  f  K; 88!C  ʕ !   7 V;7 >>7 0> w&>n >R w>w>o7 > B!ȋ=Х! === = ===   === == :7 =: &== . %~=l= h=j=-f=x: mV= R=  :7 : (w9I   9 9&& & & %Q%r%  @7 4f t9 p w l ȥ#Ћ 3D T  S M H{ d & f&%n1& ) \ 5@8 " b 2  07.7 8 88  w888  x8  w p86C59%r7j7& 8 & & T7N7& & && & & & |  %n0%f0& )78 w*87 w40 6B7 6655555555e   X0&f &"e"""555❀57 7Z5 R5 B6-6%e-6 P6B`-6  <`6B`-6b&f AB n%fE fb6w^6 ew!P6j6@6m>6<6-~6wx6 |T&6E %IF P  6  lT0 0 W W 54w|  & #ȋ!ע:&ע0ע$עZעA ע9עaעzӋW RfpE#p ^^5  w` bf D5  fE֭~5+  'Y55@b3444e46545>55 ,55  75 d A E54 fEw4 64 0 #  ` T @ l Pw4 R¥;¥! J Dh2 a2c4X2x2E1p4 > >!X4 w  ! w4w2 ¥!w37376737 63;6r1/! 666' ' 67 6 63ɕ & f < 0 j6> ^3?f7 P67 R67 L67M60@6B (06ȥa Ȩ և 6BE< C@5?2ww22A5 -5P5 E !5 5Е.J25 t5n5% #` 2 "  6  ӕ  6 15 7! 22 2714ѕ    ѕ 7 4w 1r1w0 w0  ՇU744  d UUe 0\4 Et, ,@ I`E3A >@7071B u&f Af f#5 5 ffp07Y0 >  f% w0w0w00 L7 x0!t0 i000 0d.D! -J0-F0e& 7(07&07#0 .  * '~ 7 070//</ $/ $ w///> V & ,& *f   )v   *  ȥ/ȥ$ȥ. Хa f/m.   *   ʋ5-//V*.!.-ewV ,( ,# ,&|. , ), )  BR.B -.W;.b . . L- D-$<-7X.w0-.-%`& "- ׭-1+-5-5- U00OOSBg5- #,, -w- Ie   ew ~-1 &&& & & @N-B-e`f! ~ɥ ɥ  N  >  *ff& e w!,w!,UU  ҋ ʋ ^N` .*e JNa ^ ^ 8&   l@    \ G& 6>w.;w" N N@N 3 A N NPN ,`.[.#U.{uwL.w A ^5+  7 $.0, ]w j&   J H y$09# 8w-> # 0%eb 58%7f*7]*7_*& 0ȥ.M*¥0¥7" ¥9 ¥A¥Z¥a¥z5'   *¥.¥$)) 7) ) x ¥" NqBL) : . @ B 2 8T ,RAEw~)H 7~)5?r)< C D ( ¥!$ !C &CBE` 7 )D Ӄ C (  C7( w w (ww& & & & & & & 6e & |( & N B+V(  7F('  $| ">&  ' "e  & '**E**V' bX¥* &?P7z'7v'  Dwd'b''&eA<' ."6' $": &Е, Е, Е,A E Е,&& wP ^5p&6 å å  %J& & &\ZX0&& & Ε 3 %0%%,0ȥ_ 6 ¥:&E ff%|Z w"%& Е:Е,& Е,  %4U&& &\M | _΋<5^ Y55@dT '5 X Jg5Z W5t 5@u W5/5 5 $$ w E w Е,&% >[ȥ*&  W .w&)Х](  F!&b$ f7 Z$7&@, H$D$@b8$($ w^w C 0 3 ¥ ¥   w 7^$4&5#BCB@ &  & & &p&f&& Ε  & &p&f&& Ε  5%7%#@aJ  7w-7k# 7H#7%<#P#u v## ## 7 #@ f A >>%""(UEG"" U""&?7!7 7 t: n` n"&   RP" w  @" w =U""=ø7!!!V"d? Q" !!U!9%<%2E!bj 7!" 7"#$ ( #$ #7!5 ! 5U.!* SY0  5!2 <  ݬ& ^#$ X!T!%Q%PMr eD D` D`  D`: D` D`ememL B e?E? & &Y` E  xm ( w`HN   7dB @ 6Е   .d pʡh~1 `p" :07>  7 ( 7"`7 7 ~H7T7`777e7e$7e7e77*  w`: w`> 2ɥ@%& #b S fє1"# $ɥ. ѕ .є t%Z( CeE-B->`00 En CeE T D|Z 00OP`KTADATADATADATADATADATA  ȡB ʵucEʋ  $?w<ȇ w6  w  w  w, t w  N   f& & Bf.AeJP Е,A A xЕ,A lCeЕ,e  \A6 FЕ,Е,   B~BBeʋ w 0f=% Е0e f=e Q3 50 && & &   ww 7 7 7 w5 wE T "Rz    &wt w<E  wf) 8)fŕ,  P P P$ P% P% P( P Pw7!7fEeD C VЕ, w%BA%SL%IN5w V0 J+7 F7 @A 4wl0 8E mJ EJwnwL p     &5U~5pz&ʝg j w̋   Е,wf ' GD,f*E e fA A f 4v@e  -R  ew!7|w!v -%  5J n ҭ D. wl>\R& dB  &5,U5p&ʝ  3 '  \rw( ^H  1 pU4 X ¥,  L ¥, & "B  Sե  5 B \֮& |ȥ0ȥ9   A \֮ % C`\&   &%  %\֮ &   & %\֮ &   @  L%\֮\\\\&f   &fw ~ fE%`    w*1w EH\  P] A^ Е:%ʋ B$    5RЕ" eD pe d[Е"AH 2 AJ (AL Е.AN Е;AP 2      HХ"Е" Ağ%s+! YGY9_߸͏þYSΉIGOTOSETSSETNGOSUBDATADISABLEENABLESETFSETTINCSETLASKNRETURNASKSASKERASECLOSEPARSETESTFILETESTDEVICETESTPARTITIONTESTDECOPENAOPENROPENENDEXITSETOBEGINCHAINPAUSEONERRREADSETDTRANSLATEXQTWAITDELAYSTOPFORM,@~nn62'&1 < < <5ew <, Bv     5BwH 5  5 2  UE E U 5@*& E& & f&ËDef Ë )̋U&  m  f A N  %&f &ff 0($Lx $, T8<|Hlt4\|,++ W  &[q W @00POSBgTITISYSYTI0Rx')00 & & @( (f  e ee e &f& v <  'W# 'Q\ 0 0 0  7 f& & A&f?A`e  P!PN0 b `Aw f hfp '-    ` BJ  ʕ=  : : : * w2 w ȕf x( & F0 0% d&w w  6ZeB eB wZ$&< %# % V tV" %w  x Fx %w  5E5 E5pE7  EF Z5 2 & X %   $ ɥ= l h f 0Z 8 5 $ x$ p$ h$w R  p$w 4$Zwd$w 7 R    A 5n f  0D qBCr r &   r  ŝ  X& N D x  r 3  5  2  2 w 5l !2 p  2  T @5" IZЕ-& r  A "Е, A  " z Е, Е,Е/Е;Д/Z@f   2  ww @ 61w  @ "*w:@B 21 1ap1 6 5 5 W   5p   |   wt e`  & . D!wv3au qss    55T ;  5> 5 ve    W, v   ( " w N . ." l w-@ differences found No differences found/ TI&% NSY8kQSYSY  1,2>, > h+ -- 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 uhdB$ 0jwaw< 8 v8w &  h*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 ^jjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *w  8jDl@ TeBT85l@ :@( D xeB& * & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@('&15ew , Bv     5Bw 00PPSBg(w'x(L)-* ~٦D- E %     U EU 5  5U * *)0)E U *5@*& E& & f&ËDef Ë )̋U&ff &  m  f A N  % p, 80|X$L<H($|(,[[p W  &[q W J00PP`KTADATADATADATADATADATATITISYSYSYCLOVd0Zd+^-0d005.03  ,    5@d5\ D 5Lj f,t n,n E@7 :7\w`"   ? 7   7 pbeBe RRRRRRRRRRw v+ E DW!d! E` f` !e P A +& & &  f&& & & Ε )!%F>6 + + + w + * ` w@,Aw V*&v|z &5  HBBl D`7 1,1,7& &672beBe 22,5 b,# *`  25b.f&%67~5    > ) )`    T)SYSYSYSYTICLH' FTB>P #?Sp &>Y*Q!AZsI_z@r 1NAn5 ^SY*@ ^ DAZ LB Z z p xQSY d  $ SP#w #5 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 !jjlj ɥ@@aujk,bp N"5f fˇ ȕ :"‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ V!DlljaCeH###33 & @!8 *  w  8jDl@  00&PPSBg~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@SYF&DAEAFP@MMCPFTB -- *DIAG*-Illegal Get Command Line error codeCommand syntax error%N%VARequired input file missingIllegal switch%N%VANo dynamic storage availableIllegal error severity code %P %P %PCommand I/O errorIndirect file open failure%N%VAIndirect comand syntax error%N%VAIndirect file depth exceeded%N%VAI/O error on input file %XOpen failure on file %XFile %X has illegal formatModule %2R multiply defines P-section %2RModule %2R multiply defines XFR addr in seg %2RModule %2R illegally defines XFR addr %2R %PP-section %2R has overflowedModule %2R ambiguously defines symbol %2R%2NModule %2R multiply defines symbol %2RSegment %2R has address overflow: Allocation deletedAllocation failure on file %XI/O error on output file %XLoad addr out of range in module %2RTruncation error in module %2R%D undefined symbols file %XInvalid keyword identifier%N%VAOption syntax error%N%VAToo many parameters%N%VAIllegal multiple parameter sets%N%VAInsufficient parameters%N%VATask has illegal memory limitsIllegal logical unit number%N%VAIllegal number of logical units%N%VAIllegal number of active fields specified%N%VAIllegal filename%N%VAIllegal device/volume%N%VALookup failure on file %XIllegal directory%N%VAIncompatable reference to library P-section %2R%2NResident library memory allocation conflict%2N%VA%2NLookup failure resident library file - %X%2NIllegal partition/common block specified%2N%VA%2NNo memory available for library %2R%2NPIC libraries may not reference other libraries%N%VAIllegal APR reservation%N%VAI/O error library ima00.PP`KTADATADATADATADATADATAge file%n%VARequired partition not specified%2NIllegal PAR reservation%N%VAComplex relocation error-divide by zero: Module %2RResident library has incorrect address alignment%2N%VA%2NPartition %2R has illegal memory limits%2NInvalid partition/common block specified%2N%VA%2NTask requires too many window blocks%2NLibrary references overlaid library%2N%VA%2NResident library mapped array allocation too large%2N%VA%2NInvalid reference to mapped array by module%2R%2NSymbol %2R not found for patch %NLibrary not built as a supervisor mode library%N%VA%2NSupervisor-mode library reference error%N%VA%2NFTB -- *FATAL*-'&1 .6/ .l2 ,.. 8.8 8.^D5ew $ , Bv     5Bwf !c+d,5  5 2  UE .v v-- .E U 5@*& E& & f&ËDef Ë )̋U&f &ff006PPSBg  . ...$.,.".-.8.9.. . | H,X $L8<_%/'//%/'/ ,/ODT.OBJLB[1,1]SYSLIB.OLBw < pw. `.  $UJ.  U@4t7 n  w lJ0 b 47H,7J( d * 9` `5b/ /&$p$ p$ bw`9w>  ~. r5. 7采eB$&5 b.<w   9` ,\NLa \BAbpd Zfwh` ҥ/ ʥ -ʥ*ʥ/$0`¥¥¥ ¥ ¥ef UԱ[Z1?Z1& & Amμ 7 7 j7 X7 7 7   w<1  7 h P   7 7 44R7 ,7 *0 bx0 bRbͫeAd2w r7  7 7 7 7 ?߬5b    wҷp H&B X` e5 vJA p7  ^ȥ;@ ¥=7e)2@t#t-e !@87 j  ȋ-ȥ;*E@ N J   ¥,¥! ¥;¥: 5  !0 Ξ@ &  ¥;¥!ww vw lR t r7"7,97Eh03"3,'5@5E-    B`   E  A $$΋  (pp@Up b7^14p  ·w @pdf d, B$ĵ4ĵ!%'% %E$e@ P  7e :e 8e ̱& ĵ V 11@ Be ̱ AZ    4AAȋ*& ȥ+ȥ-  U w f  u  u  ¥ ¥ ȥ ȥ  ?_?=7\btm  %\ V 1t5(5|$ F5  =  wVη*Q & 5% 55ݑ66=ȸՀ6 76δ 6قm6 2܎66  & & h*5@t75t7  N N65@- 5 J!t 8JH 5  6 B6.     Ќ6 w Fw@ :pp55 5@U@p` p`|8777 A b]5 ṘE B B B B   6 Œ6J 7be 78 SYBe 8eB e  yB,D.& C! U@5    wp <D.# b V 0 c5KUU5U5U@Q$@P  5U@  e)95555u u C55a 5a d Z w%E7 \ 07 PG:A5VUR5@$5 X::*<: 56PA=2B Be@E?B B B@$5  =Cl #qw\AmgwAw`_C5 55E V,  U%P  | Z Z0EU5U Up (e)w9QQ &$&&$8& (&$% Be>w> 7 ɇw  `w eB$&w@RO@v>  &• H  00>PP`KTADATADATADATADATADATA ; w ; !,:& u@5e, RNOWE 5& , ! [ ]   )@ 55 ,.@ :Z< l<ȕf d, 5@ 0wķ lw dw^ -ЋSVw (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$f& 62666666666@666@666|<=6|<=6"="===6=6@66LB[1,1]w>Ƈ@$  7"7$7~  e ?r7n PAPАP 0we)FA  ppp zp7b@ ; :$5?15?-B B B @5 $d= 5v5n 2 wBw@wŷŇ@Rw20w wƇw&w$Ƈw#XW#wbŇ1B0w6&~>>?  >>#Lw> ?Q>?:d>X?%S>?jLp>?[q%>?[qjL>?zjL>?[qz>?yx>?;}D>@y>@/^NA Enter Options: FTB>&  m  f A N  %,T8 $[N7E 7BeN7w2w 5B<7 6 $7:5  4 | Z ("774 7  L77e e? m "f&4E%4| 7 N7EI- q- b- *.J- r- @ C` EP" ,eB  47      w`  фv n  IP *@mLw J>JBm4, 4 $ eN7B & f& & N7& 7& Ε )` w ѱ&70 0&7&    2  ,w(7R &7B1  112*3,3322555*744!1ւ`wZ,   Bµ µ .75 T n8 z&7ppp p  & р B 2,2,1&LEE$7 b eB  7% B5% ~Ђ l5R $7jf$7 wCœ5.5µ tl F55U5 EE  l w'55 5  > w"7 wN r z|pN Ѓ-\$7 L55( 55e   5 714p  D΃ f& L  "55 5Ո ` 5PHww C5%   H ! J   .C %p`$  p ݃; p p5    v & 4ww 07"· sN0 t00FPPSBg00NPP`KTADATADATADATADATADATA00VPPSBg&  m  f A N  %w &5d%Z&$E@& ŀ05  e5 #w $x0# D ` (E  77Е l/f/w p5 t`/  df c 0e Җ %5w 2 wHwJ ^777 &mH" 77/=/  e>7z7`t|H` %  V E|  pem,@7e 7`e5b $5bemhb   :%t /"/ZmRm$  %ҡ5b@7D GCD5Ee/B h e/EE@Ce% &%([q  CeH7 %4CD5Efe/m   jp TEC ” e/T  8? lGCD5EB r /  1& && & /& 1& Ε )$l`wL*** 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  B74B (5 :=5 (ee5w w 45   )5  m͊ m5 5  K5 `P6 %m5 B%5 g6 z E$4RRJJ  b mtmp6 *  eBRRR R R4 dp ` 4w d6 4E%4wFwBb -XTP6 4 R@RJ6wXw H - % U%@eA DA  pp0 te U%>H !  rD   Z?7 e ݂be@5e5e,e"7 l e pHD  " P  aU% Ie =  R }l=lN˷ I8Ae    7 ˶˸dܰmʪ7 7Ӏ !mZ  00^PP`KTADATADATADATADATADATA2B% %  `lmʇaa   H ! PP A w   %% x|;?;\;< =\;,@5@H;T F;  F; <55Z5Rw5ʪ@. lmd7 `w kgw K_mPAQ  `RRRRRRRRRRRRRRRR w `RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR w|VL B J Bm4J wN@  ww<5 @7  Dm  V=w w|?x======8>Z>z>=?===>= @@lm9 R8 @@- :) . (    & @@e   AA@`A50A5 &fe 6āI rw AA@`7@ lm7m jbmƀ w\)0@   > w>>>??>>>>>????T?d?P?^? d. J J D(Db@T"r@  H T  BI  J    w    @ eA @ : @@@`"  %wT d  @m  nׂ` 0   @ mzA @lH;QQQQF;Ă  p`*5@ @w R5P  <VD PE&mĀee@  @z@  xĂfE w 0%7 | Á ҋd   8AA0B ʋʵ#ʵ"հ*A4e6 (0A>D   7 H w >w :, w 0w ,$m ew4f& BUE mB̂ 8A@  7@ew 7 $7+wɵ#ɵ"wtp*A4e6 (0A>D | ɕ m %,"A4e6 (&A0  .< )63 wɋ wp*A4e6 (0A>D  w` )|`w^                                  )ފCsw "5@L# ` E@5X Nm 5@E5> 89f"e\e!e B 5f j2* eA  5  w 5@    $5? E;C $  @$ mܿ Kl l 0 U5T%J%` | Lт` p Z5@  ^   Al m: w m¿ $@ 7v 7xС e7ȇ    & h3 3 N333  E@ (33 53 @` D`D@D& Eξf& `8(8*8,8./$// ///"11 </://|/.///// / 1*11/1<VNTI\~TI\CL VNSYVNSY[gNSY[hNSY@GfxzdC*f** avB ¥*W W c@ %)P")&y@G8 xCHcp8,1z8?y85!8&  m  f A N  %\0t00fPPSBg|,?]?]Yu W PPW  &[q W 2 \PTITISYSYSYTISYSYOVXjll XX Z    !0 <  00nPP`KTADATADATADATADATADATA  t@'` RPT>0 < 0 < 0 < P 0 < Lkl  Fh , ,!,=<T|=TT>T?,@lHLULUOUSUWU & & @( f  e ee e  0 <  #wH 85m&&  X6e"-  C P e   e f6   f6   w t5 funhj uhdB$ 0jwaw< 8 v8w &  Z*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 jjlj ɥ@@aujk,bp 5f fˇ ȕ ‡00vPPSBg eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *nw Z 8jDl@ TeBT85l@ T@( D eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ wǀ     7 DM < 0   < 0  7*z%: nwhfeB$& e*aɋw. tw"ɋ& @   f 1 4@5 07   <<7 7 7 7 7 wł m 7  :w |z7 v ]7fb`\XVw`$ Ԝ\Ԝ]^ <ԕ:;& T@&f& H J L   ԕ.N   ԕ;P e7wĀ  @   B  * 1 :z7 4f.   `p  $$f$Е Е f& ee$w  e wÀ     A @ *B`ʋ @ ʋ LJf$wjb7 hd^  b: T11 1111& 8 de87 VH0 \0 ^7 @ f >~ we&  G @ 0 9 A Z _ a z . : ;ރ [   rW] "   XW" , =  8ķ@f5Z$ F1   4 ׭2/   55%%w~`!5 SW aW z@ ##W ' ! Ó'W W  !   ˕   w*`     Z1  E f&f& Ze 醦 wʾ Aef  W. N  5 ,,**W= W  ! xW0!W9 ! B0  (`%aW' @ CА '!W'@ &f feWTWF& 4   w|re  W   w @ 0 9  A Z _  l wW   J@fa a P& *1 e  ea a& & e $G :7`6w0* S 7`w e  e& aa : \ef"1 e  2& aa  >f:1 e  ebeef  h 8 X ,  f T`1n1   t1- w ~$$ e$f @5, a a & *1 e  e  e5F .5< 5*M &  aa f =&21 Be *e@e E*@b  h  >ef 8 6e e ewe /b7 x1 `N  @eE@`C 1 Ne ڹ `e    w^ e7 w57 1  00~PP`KTADATADATADATADATADATA  e-@ `7` ߴeEm7&  v Be eE` f j%`݅   7!D>7:tڀ  7d\0p0 I> w de eE`@   w܁ 52 Ƹ1 0N \1   mx   61 e  t l b( 1 1 D& m$ee ҃ f , E@`ew531 rN 1 `  m  x1 : h1 *e  f >  %ɐ 1 C< m:ۀ@`wj 5w- 7 .1  " w!w1 vAaN j  vvaB eE` wd1 .` $ @ "2 ε eE`e2C (  ε1 Ƶ D 1 &2 N` f&2 W  .2(2 rH  N`   N` n x ^f e &N` <  & 2 f e b dw Xw: H @ w657 $\5   4 (  N `  N N\ v1 8N^ f 7 t5   5 \ , |5   `5 ʳJ  H @5  س ( 6   86 n  t-lݰ^6 H\ r ³ 6 $.݀  J 6 < 4 $ t6 ޲"L   Nef e6"e@-: 19SY:.CNFSY:.SYMSY:.ICFSY:.LSTCFL>Option>/OPLITERAL$R1RSX-11 CFL-16 V2.00PageGroup Symbol    Offset Uses Group Symbols" Group Literals Type Length ValueNUMERICSTRINGASCIIRSXTIMVMSTIMPOINTERLOGICAL1111111 '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 42`2222223*3F3^3x3333 3 3 4 .4@4L4 `4p44444Allocation 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 U Y ~(Z vZ&  m  f A N  %48, \ TXL8<H00PPSBgf)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 9 DX     X V  ~ wXX v \?X F>Rw7 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߇00PP`KTADATADATADATADATADATA- 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 -$ 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&"500PPSBg',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  ,/>\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 00PP`KTADATADATADATADATADATA !"#$%&'()*+,-./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-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 z(Z rUw(    l^U J1     8f ƙN& `e U|U  e&   ̒  l  "f&& ewX Ee0 9e Ҁ e0 9e %     (  &&,Z<` U Y Zw6  l6U F<BCw| ě 42-  @`eBwDa     Be&& ` e0  l:U   F Hf Ęf& e  (. 0.W (V Y00PPSBgwF)@  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 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 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.;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. 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!900PPSBg0 !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 UU f 6  Gl$\@A P@A P@A P@A H@  @TTTR@BDQBDQBDQBBQ  6 v       Z W R Obu u u lu u lu l  - <LU ,@- @ h D 4.- @ DMDC 4  f %  N&&N e$ &ewUf ʒM u u u -# ff De w 0C $  S   BJJJJJJRBXXXXXX` "(&2`$b 0$7wʍf  XB m `B l\B` ɵW e<QBaCa 5  \@<  ҕ5 ~ K J    D ew     >f   `ѕ- ae\ѕ-ѕ1ѕ9 4 ѕ  ѕ: ѕ: e e00PP`KTADATADATADATADATADATA/ѐe:w Ҕ& ܔ Ҕwp   M u @ A -#  wH   @M u u u @ A B - #  wf   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 fwV  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 ]f% @f%e w`%ew~ l% @f\%e dw`P%ewHB%e 6 ne,%        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@ l @*   \#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& 00PPSBg`&  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 P22^SYf  eE   1,1,J  1,1, 8Z# < # leH  '&1   &  .  , , . 8  P f P `5ew 8, Bv     5Bw zyzFCST5  5 2  UE  2 r   E U 5@*& E& & f&ËDef Ë )̋U&ff   D    0  ,   8    $P \ $D P   |$ w . N,B  Jf 4 jbL4 PZ  Z χU j v f,(U@47 7  <  Ue,wJ  DB  $&< BeA ?  (   Af E PAT>&ef " bpd `< $ " fB` w (@f z FBĵ'ĵ%% %e$e e e & ĵ V 11@ Be zw 5 funhj uhdB$ 0jwaw< 8 v8w &  D*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 jjlj ɥ@@aujk,bp v5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ ^DlljaCeH###33 & 8 *w v 8jDl@ TeBT800PPSBg5l@ @( D ,eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ P f&f ,T8X$L<Hw 7 X V: %2 N   n  % \    % n  7 w ^7  # "B  @2P &*B( (  , ,eV2 B:7    * B77 & U                         &f LH$w 7 H F: ~%2 >   ^  % L    % ^  7  hB B h 7ee%fM% l,  l p ee@w^ne   * B77 & U >   X  X                &f $w 7  : &%2     %    %   7 p 7   ZB * E A &7B P  f .^740  BB#44,0ޝl h 7@eeh!el ŗŗB  4 lwVeee^,ne   * B77 & U L   Z  x  Z r                  &f ($w Pl5 D   P2T    .w  V ^ fn W!   dl  , ? N ^w 2T xw J? r " N 2  *dpa ^ [  6 ( Z F eH $00PP`KTADATADATADATADATADATA & e77   7 >  *BeHeH5 TZp  `HP 7>W!x B  &  &W @E . @)  `Q@&t  @mH1E@c  B&f $L0HQQV B %NPAT -- *DIAGFATAL*- w 8D$ NWF fF $ \ B Bl* 2)\%JB:w0wf&<k    9Vu ,Py,S{Illegal error-severity code %P %P %P %P %2NFile %X has illegal format%2NError during close: file: %X%2NError positioning file %X%2NUnable to locate module %2R%2NIncompatible reference to global symbol %2R%2NIncompatible reference to program section %2R%2NSymbol %2R is multiply defined%2NUnable to open file %X%2NUnable to find file %X%2NInput module checksum is %P%2NCorrection input file checksum is %P%2NError in file %X checksum%2NI/O error on output file %X%2NI/O error on input file %X%2NCommand line error%2N%VA%2NIllegal indirect file specification%2N%VA%2NMaximum indirect file depth exceeded%2N%VA%2NIllegal switch specified%2N%VA%2NIllegal file specification%2N%VA%2NIllegal device/volume specified%2N%VA%2NCommand syntax error%2N%VA%2NIllegal directory specification%2N%VA%2NMultiple output files specified%2N%VA%2NInvalid file specified: %X%2NRequired input file missing%2N%VA%2NCorrection input file missing%2N%VA%2NToo many input files specified%2N%VA%2NNo dynamic storage available %P %P%2N&f |:,@@ W  &[q W 2b !VTITISYTITITIOV&|pb >$!p|p & & @( ,f  e ee e N H n  - v  X .N*->! B  B     6!{  eRw Pw NeJw Hw F!s ~7  &  X) Υ  ~" x )wp ! P 7 ~          5wf6%DT600PPSBg!3 y w7  $wee*E%,%CT 7 `! j5 Uf7Z! D w E$% et 0# % U % 5Uw  w5Ce*5. 5@0l2p  0"0$    5 5 U5Uw43,p * ^5@ 0l20,  0 436 % *  @ wEee*%%@ %@ @ 0# U@w*+5  *., * :*5 E00(.. ``00`!F U(F.w \ ! 7  7  D" ) 6   & 7{  z )ew w 7 B B L   &  6&  x  w\% B@w.5vOU : 8 |r  Q$ %  te 4    |ew  & % * > 0,<8  >e w5 *EF%T$0l. p "p $ep ep 5%% ,.& $  DCE0Ԥ 5 : 8 e w  b , .$  8  % @% % ͘C  V   d e    ,.0D % Ԥ$  { h j X0,<8 wZw%% wn",$%.e AeB p  &&e%%%.e  L  pp& %  A  B $  7   `m w T  w `wwwwfw*wwzwnwwwwwJwwwwf& 7  PHr     5 j0 !3 -3. 3e3, 3*++30  3 33 0  wf jc \e <%  .7 "1 )     *R  v r%  d  w f6R! f vv7 (  J! B Q 7   dN!C J!B rK X  . % :  ȥ= ЋCɋы  ыɋ C  @e  z7 > 0*"*"7  j %jwN% ^wJt:7 4&&%% $ 5"  pw`ew @  N@e|z :@eA AeB @   l$A l"p0% %    `A aB Bm D u U%'&1 6p\% .pp% &p$ p~$ pb$ p% p% p$$ pT$ pZ$ p% pP% |$ |$ # & & & & p& N& d& & ~& vx' n* fj( ^ ' V x' N' Fx' >$x' 6$' .0|) &0' 0( <x' <R( Hx' l' l( xx' ' (( ( ~' x' ' x' x' ( ' ' x' @( ~( v' n( f) ^L( V' N' FX( >( 6( .' &( 6) F(  ( R( ( ( x' ' ( x' x'5ew (, Bv     5Bw~ 00PP`KTADATADATADATADATADATA=>5  5 2  UE !X8 >VE U 5@*& E& & f&ËDef Ë )̋U&ff &  m  f A N  % #d#p#ld|#@d#Dd#d#`dp&&&&P&h&Tx'x' !x'$x'l$'x'0)x'\<+x',H-x'0Tl.'H`1'HT4x'x6x'7x':x'>x't?x'Ax'Cx'Ex'Hx'J`/X|Xx`hh(@8PHp8@ xX0ABORTBADBLOCKSBUFFERSIZECOMPAREDATACONFIGURECONTROL_CDENSITYDESELECTERRORLIMITEXECUTEEXITFILES11HELPIDENTIFICATIONINTERLEAVELOGFILELOOPBACKPARAMETERLISTPATTERNPRINTSUMMARYPROCEEDRANDOMRANGERECORDSREGION_IOREPORTERRORSRESTARTRETRIESRUNTIMESELECTSPYSTARTSUMMARYTIMETEMPORARYFILEUDBVERIFYVOLUMECHECKWAITWRITECHECKUUm۶VVm[mے$II""""UU !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@@#(#(5AO.\jt -BWdz did not respond is not ready unrecoverable error at block is 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 unexpected error #Fatal file system error. F.ERR= ^COnly ^C allowed error threshold exceeded (octal) (decimal) data compare error at block Good Data: Bad Data: Word position: Buffer contained . additional errors Byte position: ,Fatal system error. DSW= PC+2= unexpected request to queue I/O - request aborted...IOX -- READWRITEREWINDWRITE CHECKWRITE REVERSEREAD REVERSESPACE REVERSEWRITE EOFUNKNOWNNo buffer space availableAborting due to user command No activity remains - abortingUnable to create/delete/map dynamic regionNo such command - type H for helpCommand not unique16.08 with terminal support and regions: j EJ!N!R!`/#  Pj!<. b!|"  f!*"Q |"X#'x#*" IOX>P IOX> 00PPSBgw (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$ 0%%u M 5   D , 8 S % & ?T ?J %  :6 2 >7 |" e e7 =5z *r%*E -Fe F \%  |"  ! " @|"7 &@?| @ w^ *wJ  wR7 f@A 767B|"<7 &f 0 does not support the commandw*w$ 4we Jp6 6+ %@ 27*5 %=75 !y{@  % %U ;@60 6 pU |%wFX!e " 4 T& &Y@ w` (eEA A A A w jX!we?E? @ @ K3   !U   e  KE %DT  % U p   %DT  0 3 ($>7 87 @A *Cl$7    llC bA  e0 0 ĕ, e $ ĕ0 7 D?    AmC Cm u  Mw>@zZrN vH Tʚ;@B'd e7 t"% ԝnj< %DT 0$ s 3 3   @   2 Ees ,Ӈ,  e  7 "% N 515 .7 \$'5!5z7 V %r q gE $ ..  4%(% p4%8%(%@#V#N  $F2$>$6w.% p  E UE@ U@E UE  U E  U %% \ % >L,e%" 1> x%:1 1 Q$ `   :p"p$   " ," 1,$pp p"p,  % 0  a ff a Q ea e`q  ¥.Ћ $ ȥ:ȥ,Ћ ȥ; N& &f$Z$NOYESMM @MFj@MUj@MS@MT, 00PP`KTADATADATADATADATADATA   " o6 !33 y544 460 0 *% f@6 00 0 *5** U%DT *5U* 3 0 U 6!{ '     ; 8U 57  '' ^ !  $& 0 E p$ p~$ l( I/O is unsatisified at timeout - function:    Ћ &   ¥. Kȋȥ ȥ ȥ;  PF'% &'@AZA Z r h¥:9'R! F' p%ee>e  A@az ԋ is not configuredSyntax errorDB377: is not configured 8 @' 77   .' %DYP v @ l0 0  P' 0 0   %M 5 E%4 0@ wh7 dZ'nه p~$ failed to detach failed to attachDriver for DB not loaded r'N&R& Е  7|"7=R& 84  \ VH+ 47*B %|-.T "T  #"$  > ewL ҕ ҕ-ҕ-ҕ # s%*w 7 L+& & A%7 L & &Y l Un!;!w"  <2 &    W !   7 @+H+`/wf  Eb/@b7eE@ @ @ @ 7 e 77 R!*  ԁ`Ћ@ b@  pBw   8eEw,W w 7 7 LJ!H7 FN!B7  .7 7 7 7 7  Ew wl* %%  R! "e@111%DT>  $ pP%System does not support AST'sCTDBDDDFDKDLDMDPDRDSDTDUDXDYEMMFMMMSMTMUSYTTAL+?L+ 7 mw mmw mw m7p h * +  ,  |* t  , ,(+ V + F , 2 ~<+ " w45e e  , , %%%%  4  B+ '0l p p 0l"p 0l$e Xe%%% F  +!%. 5  %DT [+%DT+ $e: e e+t+ % %  Jz+ w 00QPSBg +   + + xrl ^`XP + t <PJD<60+ P + @  , *U 7 , E  # 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 w & @$ pp% # # p%Summary of exerciser activity at A C C U M U L A T E D T O T A L S : - - - - - - - - - - - - - - - - - - min.. R/W requests totaling . blocks with no errorswith errors. records . bytes AST's executed: . Idle-loop iterations: Unreported error count: TIME -- Run: min. Elapsed: min. Remaining: --  XR 7 T w  > + + (|"dѕ  " "+5+5+ f "%. .")% 5 0%DT "%$ + %%  .r"l55&+ 5++ 55 0+  5 #D+ 5@5+ l?+ b%2 + R :+ @%< + 0?|" wP7 N!G   , *, zt r j7`ej + m,% v,  ,  + e ?  "N+ r,,  bP+ Z + N  S+ W+% "P+     ,  X! t" !m Q$Z+ `/ D, : 6 2 N V : p+   0 8N+ w% +w| + t  pp% # p% pP% . -> .:.VFYSELF11COM RET WRI RAN ERR=INT=LOOPBACK = YESNO Buffer space usage= Maximum effective BUFFERSIZE= Device Mode Buffersize Filesize/Records/Range Parameters------ ---- ---------- ---------------------- ---------- Task Status Command line---- ------ ------------SV ERRORERROR WARNING SUCCESS ACTIVE QUEUED [,d,R,I,I,!h!  !,$![ !t! s     4 > S   w &w w7  7w) *wȥ= Ћ )) ؇7|@ >ч C R!3Z+O &%>  2 7 ,  ") 67-R! K %DT>  ݴ* ( ȥ=  wx*НzНw Е: Nx* Fw>7 VNF L*  , T*  \* h*   w6 T `h*   N& p% p% &)&))DISKTAPETERMINAL is already configured specified device type is inconsistent device type not specified - defaulting to 'DISK' Disks: Tapes: Terminals: DB377:w `(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA BEAa$x*7  a jwZ Xwv%Qj%b  ^%|V|N  ЋMm EA ,B@ N! @ Q  eI%ɕ ̥#̕  V  "N! % @*111e 1e1f  W*%*%*%) Fw* h)00QP`KTADATADATADATADATADATA% e* !* t%* 8A 2*  *w N& &&f unable to executenot installedcurrently activecompleted. Status=WARNINGSEVERE ERRORSUCCESSERROREXECUTE command is not supportedInvalid task name 4*I*Q*<*<* Q|Task " " is 7 $ȋ         L) ) 8) g)4)5 K)0)5,) X  H%% S) 4{) o)\) >)  Q7B%< ) % !$)   E%3|"|" V‹T )) r e@  p$ p~$ p% zp% r#VFYSELF11Mode= Function= LBN=. I/O=AST queued VBN=In progressIdle is not selected -- / ??   ȋ% Ћ T' `'' IOX Command Summary: ABORT ;abort exerciser run ABORT task ;abort executing task ABORT /ALL ;abort all executing tasks 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 configuration 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 error 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 ;output 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 immediately PROCEED ;proceed from ^C state RANDOM YES/NO ;random disk access mode' RANGE ddu: low:hi ;set LBN test range for NFS unit RANGE ddu: ;list a unit's LBN test range RECORDS val ;set magtape record 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 ;select NFS unit with "commands" ;overriding existing defaults SPY ddu: ;spy on a unit's current activity SPY ;spy on all unit's00QPSBg current activity START ;start the exerciser and all tasks SUMMARYTIME val ;set summary report interval TEMPORARYFILE 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 idle 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."commands" are certain commands which are used to overrideexisting default parameters. w (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA BEAa$ȋ )7 )ȥ/;7  :w ,w  h%Qz%r%|l fN!)7,P7,J N $ ЋХAХLХL  )N!F  %%8%%Q%%|+%|A * A 8))) )@%  @ (N&&f Syntax errorTask never executedNo tasks to abortCommand valid only in Interactive Mode Q|)* ABO %CT%DT W7 ! ( EvF) h v8(Z(N( \( ( L ,e >C@B@ %% $( %> ,  8n$ 0pp% (p~$ N& p% "& ph$ illegal density syntax error is already selected???? Density= BPI Characteristic Word= MM @MFj@MUj@MS@MT, R+ -+*+*ȋ , " X" t+ + ~ + e d  V -+ @ $ w  D  <  $    wn      w( "G, ,@ >eE"?     /":&  0  Rw$ Z .  . 0w w \wfwVwLwBw8-n! ~! n!~!e?E? A Ar+  >:735 ,=8475 u5 U^n!;!>2E  2 2 2 u5 w !wV  eSS7 %e7 SS p% "& *& p%Syntax errorCommand valid only in Command ModeInvalid pattern numberUnits are selected - command ignoredEffective BUFFERSIZE is too large 0 = Random Data 1 = 2 = 3 = 4 = 5 = 6 = 7 = 8 = 9 = 10 = 11 = 12 = *++++++++++++00QP`KTADATADATADATADATADATA7 7   w77- u  v Uw:<2&.&00`. U@ U U  U U  d-L- N塇  |E`  77w>/.wKU X7    jo . 2wVp,b%DY \ */%  Z " /wf %CT:%DT6 &3 05,( nF/ .k. .å.å.      5 U JjE  ).  N-  7. ~,  60 ,w~.,0 ,w %  <  P@F/s3 3>  L B & -@ */ RG#. Al"` "4-wneEB%DTd-0 T" "%DT- \ o-  w- v-%DT%CT hb-5 R-5 2/ @b{- ^%DT%CT 0/ '0 p*/" -w2 4- < . & mw "$ & n$ p$ |% # p$ |h$ # 8& F$ & p~$ |h% # # N& # # "& $ z|# r|% j|B% b& Z& R# Jph$*8++J,,2,N+*+f+++BUFFERSIZECOMPAREDATADENSITYERRORLIMITINTERLEAVELOOPBACKRANDOMRANGERECORDSRETRIESVOLUMECHECKWRITECHECK buffer size is greater than default is already selected LUN asignment failure is logged in buffer size being reduced to typeahead buffer size VOLUMECHECK failure. Unit contains a home block syntax error is not mounted or allocated for NFS operations error while reading home block is not ready illegal range illegal densitySY 4/ 7 d <% 7T 7L%Dw78 b 542 5E ` X6 ,. :&( (0 ,  x .( "  0 0 X 45 L ~ "(  |% |h$ <& p~$ |B% & - unit now deselected is not selected7 w w77  + P wn7f7d7^<+ + @ ^wJ> 0 CKU ` wjp4U` 4eB&:ږ<  <p2 dU FU@ ** h  $  4X"Le#  ( ^*wU p. & p,  6 5E4 `40 4E % 0 0 n e  X*l d X hL L采@e< Tᇇ0e2 Dه z& rp$ j|h$ b8& Zp~$ R# JN& B# :"& 2|# *|% "|B% & ph$ `))*))COMPAREDATAERRORLIMITINTERLEAVERANDOMTEMPORARYFILE syntax error failed to open temporary file is already selected LUN assignment failureSY F $! 7 :  0 ! ! !! x*k**+         * ' $ !  F  x       wJ   6$" K %   V;V* ww * & ^w6 " 7  8* 04 $ M7* &5 8 3 Z+"00&QPSBg$  &% @R+ *Z+p"p$pp R+ B*tB+ v%"%$ FF+ b%% 2L+ J $ xF$ pp~$ h# `N& X# P$ H*& @ph$No activity to startSyntax errorCommand valid only Command ModeIOX Version Command valid only in Interactive Mode syntax error illegal range is not selectedUnits are selected - command ignoredREGION_IO command is not supported . -> . X; T l*%)%) " TB)7  ) % * ") n` F7 7  N` $ :w` eBSY_M |"d"f#  * .# z*)[) , DE*% )  F|)f# $[)w & pp%  D\Failed to open log fileFailed to close log fileFailed to open existing log fileFailed to truncate/close log file. F.ERR= -. ******** EXERCISER STARTED ******** ******** EXERCISER TERMINATED ******** ******** EXERCISER ABORTED ******** ******** LOG FILE TERMINATED ******** ******** LOG FILE STARTED ********"4b#d \` , ,,-m|v ȋ ww 5 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 6jjlj ɥ@@aujk,bp 5f fˇ ȕ n‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *))w  8jDl@ pTeBT85l@ @( D 0eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ 4& ,X $L8<HCommand input I/O errorFailed to open indirect command fileIndirect command file syntax errorIndirect command file nesting level exceeded ^ E )  ;57r7p 1b&*|"Е Е (*1  2  Е:   |"7  7(* T ¥: ,* D  W"C(* ȋ))w7wwD  * ) &9eL  b`   t`L   `W 3 s6  `W s)C(eee V C&  C&( &p( % p~$ N& p% ph$ is not selected invalid block number duplicate block number syntax error block number out of range00.QP`KTADATADATADATADATADATA006Q7QSBgM,Ct  W  &[q W F(SYCOSYSYTICLOV<0(ZZ0<0$& 06     &K짋Ol| !!!+)  b ePk6   T   @ c 7ee %Ol4J%|.F(       "%{    ) Qޡ sΥ;Υ8:7  &D 7  ) J ) sL )  )84  (  w d7  PF00 E3FGOl|(Ol|7 lAfod׭R[1  & 8B" .$d`b7Xv $7 p  wZXFHBŗ&ť1 ! < $ĝ7D  7B7 Z$ mvB`7 lDW W  $ W  JW  n7@  :2 .+ 7  ׭  r 7&f  @` Ew wf " ŭ  2wvB  $R e   ;8f Be  -w  , W!p-wwz  &f& v 00>QP`KTADATADATADATADATADATA'&1  t  ~    ,  |  5ew N, Bv     5Bwn JYZ5  5 2  UE tt ZrE U 5@*& E& & f&ËDef Ë )̋U&  m  f A N  %&ff  t t p t( t ` p 1%Ol%|5 !,x 7D~zzF5.Ա^ZZF700 E($$FU^BBPBBPBBP„&P&PPPPԴPPP [0"z [2"z [0"z [0"z [2"z [2"z [0"zcc[1!}c?21 J15m1;66r3g14;22;30;38;46;54;62;70;78;86;94;102;110;118;126;134;u w7 7 7 7 777 RC 2򷐲  `ŀ  PN |ˋz7 ^XcL tl冡bD 1 1 ,8-I7 ^ޡ % w7 |& ^|  B e& NԷ:w:A% feV    BBҋBD B:&87 w.,7 $ )00FQ7QSBgWTQ1-ZO7 `7 ^ RJD7 l7 f d# N*wH!F  w@  ,(7 7 .7 "7 &5"!wD1 | x5g ҕ[Ҕҕ]L 冡 *&"   1 1 ŀ7VY<Q9B& & & & & & & & & Ε   )) 27 7 7 7D׭C%m:% RST .m 2 ʝ_B  mʝ  6m-6 ֶ&   ̶ .c|1!_1Cx! !B.cB]C!w1g1cB.X}1A>!c1cc1FET1*B>.:#B]FRѹ^A.Fs1z1N!!GB     `    7 8C &f& AZAJ090?.8;¹2:ȹ,]Թ&[ι ,ڹ$'!- &# f eaDE E e0  ҀDА  %w D Е  w8   @f8 $  L%Fw ĝ%!  |$   X*$.~ @$f ($  6H $  & & @( f  e ee e |,S QW  &[q W Az9TISYSYSYOV0zRֱ000iQ7QSBg0)LB:[1,6]ACNTRN.SYS*Hjlpx|",0Djtv".`v~+w w w w w @f h5nf R @ml\ȕ n Hpfw,f5 f *DIAG* *WARN* *ERROR* *FATAL* I/ODSW???= -- DE- f$fEĥЕЕ Е Е Ĥ?d ^ P Е.Е %  `-h7be~ Al $& & &  &$& & & Ε )Fe Z f&P&N&L&J&H  &^&e\&e*+ F ߦp abneɋee R *$ ߥ PR >2ߊ5 ,ߊ5E4ߊ5?E45 @ e?Wt E54mpEfߥ)5^/ T?B Bm: _2v2 m d`5 6* *T .f~?~! ~4/U ( @U@m~tߥ.W0 2PR * *E@Dj6R&,(U  6zSY     f v41& F b5bΥ: Υ ΥΥ/Υ   X ^  m05$   Q3+A  톃<" 2-Bt"rr l v< 3 W s:&f& v  & & @( f  e ee e ݬ+&Hآ   E~U(,ɥ ѥ  ѥ: 5VUNE@wwpww5*U"tH ɥ ɥ  J707P@ L¥ ¥ tH 5Uڴ fU H 5E HE@H5@U@ڴ $UE5\ U@5J5 U: w5.wU"@ z¥ ¥ ¥M¥SwWp<wtH¥  5 wU ڴ vw4HCLEAN_UP MAINTENANCEOTHERREBOOTSCHEDULED_SHUTDOWNSHUTUPREASON FOR SHUTDOWN? Lѥ/5ȴ 2ѥ  *5(#B H< 0PU78 0wPw0w EXTEND_SIZEFILE SCAN_RATESTATISTICS_SCANTASK OPTIONS? ʶƷjlѥ cȴ nF ~7 H<ɥ/ ѥ  IBp R( Oѥ:< zɥ ѥ 25@PU@e5@Z5 5Uw 5Ew5UEwww DATATRIEVEDTR INFORMATIONTRANSACTION_FILE ATTRIBUTE? OUTPUT FILE? ѥ Xȴ BUɥ/ ѥ  JBĺ  Bie 07ɥ: b7J7L7N7P7R7 &  mѥ  Bк 07  ɥ wFw ޺r7 D 5w2 2 4 wh 2 wV7 ɥ ѥ  @ɥ 7 /:,+- 7 ɥ/ fD |2wfe ^S   P   `E   ~  x` Eew &ȋPw jP&&f r.tt Z R B  0   &% &)f@ɥ ɥ ȕ   ɥ!ɥ "ɥ ɥaɥz P  6  ȕ   ,Е Illegal command or parameterCommand or parameter ambiguousSyntax errorTerminal I/O errorRepeated or contradictory parameterRequired parameter missingValue out of rangeSYSLOG not active00yQ7QSBg2w5w  w`r 7 $lhfb^`\B><~8z4x6v2trW,UwT UwJW, Uw 2W"U ff t "e \ @ we fM fU  nfpp f Jfȕ ֨l$p N(Pf N#  eBB 99 f  N ֨&& 8#-&& FFf f   RB Ee`%N  D~%N b  N%N  ֨ ֨eq q"9q,4&& & 00  & & & & & & & Ε U)O  n<& ff& & & Ε ) *eq  f  f  f   f   ֨  jf   Error bit set. Cleanup before restart.Accounting not activeIllegal filenameCan't open transaction fileCan't write transaction fileCan't init new blocksCan't init new blocks. I/O error = %BCan't write attributes. I/O error = %BCan't write attributesCan't close transaction filep8<T @zZrN vH Tʚ;@B'd   ACCOUNTING DATA - 00-000-00 00:00:00CURRENT FILEUNKNOWN TRANSACTION TYPE: (5 J" L"Pn^TV \6- F676J :6V 8c >6q B6}6 6 ȿ n8 ( < 66 6 6 64rк ȿ n@% B16*@ (J_6t.6x 6 65 D6H6L6 P R, 4r <rn  $- ȿ6 nAEMn00QfQ`KTADATADATADATADATADATAR  Y$` (*j&"s "r 'L@4x fQxYz' ȿ n* n ȿ n  <-4*nN6U6^v"6()""n"(":"nB*R ,` &n (| .0 ȿ n * n   &Rf< ge b5 6RC ֨ N/&  me  ы w 5 wf<  5v ֨ 5f rRw B:77   v%7 f  | + FCeJe ( ef  Z T &ӷ ݜ  BBle eC  Е= CCaBwB eBle eC  Е= fC DDa Ble jeC N Е= CCaД% ЕTCOД f Е:Ble eC  Е= fDDa . v  Ble eC v Е= CAAa% % %AAE & %Е.e Bl .eC  Е= fAAaS f    hw& fBe eC Е= Е[fNa Е,` Е] CweCa% B & T 5CB (efC 4 ^e  ˋД &7吴`%PC&5 j%k峷  ':吴5FR ^( e7wx~CB >Ʒ 0=w,&fE&.@AC   llC bA  e0> e R 0 A@|Bl &ХTХI oХSХYХSqХT ХAХSХK Х=7 f wX wL \) ,%COl 5 Cmwd x% /f& wf' fO wmd rbw 7 ()7 "   mf7T -&~  5u u C0CC. C5 l<@ԀSYz_M)!֨2N pp f@ ށ ȕ $# fA ށ ߱eBsssa(s s U5r# R  ȿn $,n1 8.?2C "6Q &6]*6n.~ 0  w h(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA 6EAa$I/O errorNo accounting data presentDevice specification errorTask not in memory or not activeIllegal file nameOpen errorxȰ8BZZZZɄ!ɺ*>XPԼmɪό Total System StatisticsUser - Task - Accounting StartupInvalid LogonSystem Time ChangeDevice AllocationDevice DeallocationDevice MountDevice DismountPrint JobLogin - System Crash RecordDevice StatisticsReset Transaction ParametersCard Reader Spooling TransactionAccounting StartedAccounting StoppedShutdown CodeTrans File IDSeq NumDeviceStatistical Scan Rate (sec.)File Ext. SizeTime Of Last ScanScan Rate (sec)Total CPUZero CPU IntervalsTotal TasksTotal LogonsCurrent UsersCheckpointsSHF RunsDi00Q7QSBgrectivesQIOSSession IDTI:AccountLogon UICLogged onLogged offBilling StoppedCPUTasks ActiveTasks RunDirectivesQIOsStatusSession IDTI:AccountCurrent UICProtection UICTask NameTask Initiation TimeTask Completion TimeCPUCPU TimelimitDirectivesQIOsTask PriorityTask Context LoadsTask CheckpointsDisk OverlaysExit StatusAbort CodeTask StatusT.ST3Accounting StartedTI:TimeNameUICOld TimeNew TimeSession IDTI:AccountTimeDeviceVol IDOwner UICACP NameVol Prot MaskStatusSession IDTI:AccountTimeJob NamePagesFiles PrintedPrinterFormsPrioritySession IDTI:AccountLogon UICTimeTime of Last ScanScan Rate (sec)Restart TimeReasonTime of Device StatisticsDeviceIO CountWords Transferred CountSoft Error LimitSoft Error CountHard Error LimitHard Error CountCylinders Crossed CountCurrent Fairness CountFairness Count LimitOld Trans File IDSeq NumOld Device NameNew Trans File IDSeq NumNew Device NameOld Scan RateNew Scan RateOld Ext. SizeNew Ext. SizeOld Statistical Scan RateNew Statistical Scan RateSession IDTI:AccountTime of JobJob NameCards ReadCard ReaderUFD TOTALVOLUME TOTALUSER IDTI:ACCOUNTTIMEDEVICEVOL IDUFDUFDS INCLUDEDBLOCKS USEDBLOCKS ALLOCATEDNUMBER OF FILESNUMBER UFDSEMPTY UFDSNUMBER ERRORS048<@DHLPTXpt\`dhl  8<<(5лJʻLʻPd^ʻTʻV\ʻĻFĻĻ:Ļ8ʻ>ĻBĻĻĻ dʻ8Z(<Ļ6ʻĻĻĻ4¸ dʻ@ZBZ6B(Ļ.ĻĻĻ5лDĻHĻLĻPʻRʻ4ָd. P dʻd  . 'L@4x  dʻBʻʻdлл".. dʻZʻ<.*dĻĻлллл"Ļ(л)лʻʻdʻʻ"d*ʻ,ʻ.ʻ0ʻ&ʻ(ʻ dʻBʻd S.e& e F52֨  x' \ e  ыw <wfN , J֨ . w B7  ~   vhP CCaB  Ef&C DDa e CCaД% ЕTCOДf   efDDa |  e fAAaCE Cы%f% PfAAaS    \@e PPP@~ffNaЕ[ ` 00QfQ`KTADATADATADATADATADATAЕ, Е]  7 dCCa% B& T 5fC4 R (  ` Д x.  < w<@ԀSYz_M)!֨2N.pp f@  ȕ ƽ$# xfA  eBsssa(s s Ul5P#  dʻd ..Z2."Ļ&Ļ*Ļ.ʻ0ʻлI/O errorIllegal file nameOpen error<JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw &fe&  w &ff=elC    5p  d   A &@d &@ &m M M` vM`5u  b @ @ e@ M`u 5`B}W @ `u  #;eu o eBA ZeS S S JB DCeS S S A 2eS S S RB ee @    e  T T T T H1CdT T L $)dL t dL d  Xb~"Pl  8< ѫC z_MdѫCSYSTEM TASKS rѫCw5Hw hw nw7 ( w7|5e wr75  hawVw XwT|ztfff e D  fw5$r 6r* ( dƴ ( z lkU@ D% *6 5e P ? ? E@ +)E@d  * rwwT e f pf bf Lwf <w 8֨ Z F f   . pp v f ȕ ` ֨$p *(,f  N# $   eBB 99 f * H@LP ULB0:[1,6]SYSSCAN.TMP;1¹LP ιSYSSCAN.TMP;2ENTER: VѫC  @$# V *qfI fh <- Xں=B   ,($1  ֨ L*fJ  " $fK  rh    *fL   ?f9 & & & $& ܹ& Ε00Q QSBg & & & & <& ܹ& Ε f: 2 >*  ں򺓔 1 ֨ f5 * ֨&& 8#-&& FFf    RB Ee`%*  D~%* b  *%*  ֨ ֨eq q"9q,4&& & 00  & & & & & & & Ε U)O  n<& ff& & & Ε ) *eq  :f  f  f   f  Accounting already activeError spawning SYSLOGSYSLOG not installedError bit set. Cleanup before restart.Secondary pool allocation failureBad SYSLOG queueAccounting system not startedSYSLOG exit with status = %DCan't close transaction fileIllegal filenameCan't open transaction fileon scan file openCopying scan file to trans fileOn scan file closeOn scan file deleteEnter reason for the crash (Maximum 60. characters)Terminal I/O errorCannot write crash transactionCan't write transaction fileCan't init new blocksCan't init new blocks. I/O error = %BCan't write attributes. I/O error = %BCan't write attributes p8< dT)7 w 5Ff F 50f3 0wĵ Pj5 f:@U@ 5 `? ? AmA Am E* *A  h5 E 5AmvA z Amd 6  n ~E@F r2  r 0 7 \ wwAccounting did not crashAccounting had a fatal error, must be cleaned up|a,?P?PA W  &[q W SYTISYSYSYTIOVҳZ"#ҳ00 QfQ`KTADATADATADATADATADATAҳ #!i   eAe]0nX 2 }f X \P 5 W#b ~w)wd#8\f22b%" e^v' CDA>P4HMMMSMTDY8` hH@X@p x P@ (0b   P P ~   NSYaSYsySYu~먫D~먓sq$CT$u~>MCCCKD8DFF~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}r00 QQSBgrrrr|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~;'yI;U#U]RUfShShyso^?SYB f| CDA -- Exiting due to illegal trap - Snapshot dump being attempted&.& B\eG& & & & \e %&<)& & &  D`& & & Ε ^  w  %NCDA -- Error writing analysis file%N > > > > > LIST COUNT EXPIRED%6S%P %VPf&f& 7 f&ff&f7 P 0  ee m"  &f BE 5E E&  & ` EEm  D `D E& ^T p&&f eZ  f5<2 &  ^ H  l  z  W x^  p l nT x5f-nj &f-    5 ee f&f D f&fP D Ee0 &fEB   CEX A EmH ,%F CRASH DUMP ANALYZER V %Y %2Z PAGE %D%NCDA -- Analysis terminated after %D. pages%N > > > > > ANALYSIS TERMINATED AFTER %D. PAGESfhzv  & T  7 heZ-*  7  %4S%P > > > > > ADDRESS OUT OF RANGE&f5  V F   e  e^ d A  T%NCDA -- Error reading crash dump%N%NCDA -- Device driver missing%Nm f 5 f%  ŝť ťť &  .5 f w%NCDA -- Error reading file %X%N& 0 460 |  x *eHz '&1 $D& $D& $D& $D& $D& $D& $' %& %& %; %l( 2%4* 2%0+ >%- ~>%t. vJ%( nJ%( fJ%z( ^V%' VV%' Nb%J. Fn%h( >z%' 6%( .%, &%,' %' %|' %& %& %) %9 %(5ew H, Bv     5Bw 00 QfQ`KTADATADATADATADATADATAf"#5  5 2  UE $ $#$E U 5@*& E& & f&ËDef Ë )̋U&ff  D&$D&$D&$%D&$$D&$$D&$$D&$$D&$$D&$$D&$%D&$%*D&h%$2%24H%&%44p%%6D&h$>%:D&X$J%BD& $V%HD&,$b%JD&$n%SD&@ $z%ZD&P$%\D&$%_D& $%eD&$%gD& $%oD&$%qD&$%sD&$%tD&$ $%zD&!$%D&\$$4H$| 0T 00 QQSBg %NCDA -- Unknown get command line error%N%NCDA -- Command I/O error%N%NCDA -- Indirect file open failure%N%NCDA -- Indirect command syntax error%N%NCDA -- Maximum indirect file depth exceeded%N%VA%N* 0 b p f `ť(ť ťťťD& n& &&&&h&f ' Ur w 5 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 jjlj ɥ@@aujk,bp j5f fˇ ȕ V‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *`)4)w  8jDl@ XTeBT85l@ (@( D eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@,X $L8<H ACTIVE TASKS SYSTEM TASK DIRECTORY (PRIMARY POOL) SYSTEM TASK DIRECTORY (SECONDARY POOL)^H&d 7 JW&tF&V2%''& ݎ7 ݦݲe%Z'Z'܎7 ܦܷܲeܖ%5e5D&  e5~ & Z ~&UTD&  eݳ  -EXE@ RDN MSG CIP RUN 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%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%4STCB00 QfQ`KTADATADATADATADATADATA 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:f&f7 e5UCe"Q$"~ "| e# e$WUP e$KU8  e$|U p)w) H5:ӈ Ce&ee)  Ce&e5-e ҷ e eҳ e$e ` r lCe$ fe!C  )%) مCeCeCe&e5  *  e   Ce  * Ce(CeeZ* nCe * E JCe' * .Ce( * 5 5* \( fG+ Cep( J+ Ce0( .+ >,x܂ C5Dm 1|1 @e%0 eb %: eHׅe .0 $e e1 e41 eU1 o1eևffe w7 5@,Ce5r K,\,exX)^ 3  Oee5V, ,փ j6 zm, 2 eE555r(e few,, wT)weeb, X7 xp= EË )%;%?%C%G%K%O%SwEU%Y%]%a%e%i w.  .$u/n1/gE/`a/JYu/R/K/D/(t=/f6/ X/0 J(-0(NONE f&f&& ':!eeCeCe beC`E:R eH ffZ  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:6e5at ]F;f7CKee 5U00 QQSBgZ;eep;e; <; ; ee `e`B eeJ  &  m  f A N  %MAINSUB TASK SYS RW COM RO COM DEVICE DRIVER SECPOOLCPU d[]<>!+()''>(U(( 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%P&e&e 'Q' & jb%))PێJF7 >ۦ6۲&w & Xm  ^   F jw fvve h QFe%))&ڎ7 ڦڲ $%| E 5p`w e  w5dڷe ږ%%))َ7 ٦ٲ&*&  62e%))&َ7 ٦xٲlٷehٖ%  (- 7!-- <' A7!  6 5'( mxAnbfA&AJ,${&$e&  & & P .&5@  e  e*e& 5@Ue&&~&e&&&A(  (L&v+S&+Z&+a&+h&:,o&,v&:,}&:,&:,7!$5* 5U-  D&7!H& 7!v&5}&+5'&$L&5o&5 Z& 5U - h&5@~a&  "&f2-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&r-  . 5-7 2..1P7/7!5 %5 e-|/5 56ALv/rdb/7!\/ Pee><@BН$НН6Н1 -/ V  -0 J߂ e  7! e e|ڄ ffZ  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%.2 ee*2e5q5e5fe`Ce %G2 Pe22CeeeCe222 200 QfQ`KTADATADATADATADATADATA3,2CeeeeJ3Ce eׇ Z%5 R&%4#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&fT5weweweCt 4e.24d` 4+5e   eeee 5@Ueeeee w5 e&4 5e^e%6SWAIT QUEUE:&feeC4eb24  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 %4AB5z5&fe <ee 5 5 %6<%2A%O:%4>NONE f&fr&& _6!eeCeCe NeC`ER6 Te &  m  f A N  %&&&[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]%N5 5 P K(2||(@ D D D D D D eD  ( @C)eD  eEBaD CB eb  f&feD eD  MEMORY DUMP"+Zzxvtr%  \ %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,(00 QQSBg& D j 2 r+ 7!w!7w  r+fz+ eD r+z+7 R$   7 7  &ff NJeDB@ Pp p+ +% ,& +  w`z+ 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]%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 BYTES = %P00%6SFIRST FREE BYTE = %P00%6SLENGTH = %P00 BYTES%6SSTART ADDRESS = %P00%12SENDING ADDRESS = %P77~+ l+e`+p,,e8܃ H7 F7 <0 %"7    $7    A, e5@f* a- .-eN-eP t- j Ee- Pa-e4 B B B B B B D D D D D D `D `e?  &D&&f  ^  N& e AP P z  f+ R +& P&X& T  JR&h X N&X .L&LJJf& f+7 @ ><8R$  *" @%   , $f+ R D&f+ RS D&+eX 7  7z&f&fX& َ   FV&   ( X& C f5-T-, ڱ%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 1 7!w!7w  1f1 eD 117 R$   7 7  &ff NJeDB@ Pp p1 1% ,& 1  w`1 rew  7  @ @f&  `E L\3  % & 00 QfQ`KTADATADATADATADATADATA `E <3&  m  f A N  % 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 V&eD&we w-- e&e5wbe7Fb&w&e&5,&&e (wV5~e05&&ee&Ce  Ce   &e exCe$w%e& Ce  FE`5w,Cewe Ce CeCeD>580-- ^U@-- E<'g' lpn^ VmXB % B eB eD &f ''  ee we<ڳ e' 'U 5 5U0w5@A(7 %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+ +% ,& ,  w`+ 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%e-e%  .X.../:/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 mappingd& |&5|%5 4 % ' e\P'fE5 B  L7 D 7 > v 0 ,D&&f00 QQSBge AP P &  d L&D&R &-7 f&D&L&7 R$   3- `t& R!f"L& R D&L&RS D&&e (7 "&f . e&e2&1*&\*'+&* ,'*'"-(r-~(- BSY@-MNT FOR MDM OFL-RED PUB UMD PDF SIO@ TRN MUN MNT@ F11 COM PSE OSP ISP 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 (@p%b2b2Վ7 զղH& CeE%TTUeCee  ?^D&wlETCeL55<U455&CeCeCe5 Ce5wC &) ) )a)PCeCe J }, Ce5,65  Ce Ce 45 *Ce Ce )Ce5)  . 7 ef5T&CeD %X&5@( A  e,Ce E   7 t5@xCe7 bwV5Vn,5$5@ ԋ XCeY 5S5@O,\ < ? 9Ceee *Գ e  eC  eC eC   rӳ  , PCe5$,Ce& Cee%MTee E eمm w%ewfN35  7.  n >. xmP m@- Vdz-xJ&C Ce  pe 4ҋECe  *v H+ c++ &fPCe CeCeCe5 E5E.>,+Cee&ѷ ~e eѳ e>V  +Ce n. C( feC%#00 QfQ`KTADATADATADATADATADATAeC%_e C8ѱ e  %6<%2A%O:%4>NONE f&fJ&& 4!eeCeCe eC`Ez4 ,e ffZ  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`{fIf5  ؙ&  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:H&"JD&W%|+|+&ێzv7 lۦd۲eT%((Bێ<87 2ۦ*۲۷eۖ%e5 e&e5wRF&wR( W&]& e&Dܦ e ef&&ܳ y& &Ce:%te %\ Cee  & Z%Ce& 8Ce CeCe& CeCe$Ce<' Ce  Ce  _' Ce$Ce:Ce.Ce0' Ce&Ce(Ce*Ce,'eR eH (B( 5e05 e'(B(U e](Ce %XCe,ڳ 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+e0% ++.,\,,,Ce 2E`5>Ce  eeCeCeCeCeCe Ce eCe Cee .../ /#/%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%-e| .S.Ce> P eE (%  A 8/ 7 e &f-z&@Ce  Ce  efwl/ ӁwdCeE%ICeµ`B-?j :-ee%.-'  -eeeeetԳ  `  &e/e5'7 e<e&e5e mX3 3 e  < %6<%2A%O:%4>NONE f&f && 1!eeCeCe NeC`E1 e 00 QQSBg&  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<<<<<>>>>>&'4'B'B'ID& A'= \eP&ťťe X%eeR&  &  Ee f&f&Pe eB eA eA < eA < eP& Vf&f%ee eee % e'A  ^' 5 e'  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%&&hPHx& 4,0(  \eC  Cen&& Ce& CeD& & &Cee EC5eeJf ' 6Ce51Ce *C6' W'n' z&,C) &en'W'n'Ce en'efCee =|&9C3 ' NeV& ' 6'e eC` ee %5  ' ffZ  ff  C5 e `M+S+200 RfQ`KTADATADATADATADATADATAdTASKSYSTEMGROUPFinalPrivileged = 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( m+5I|++ <l;C:+:+e CeCe Ce+a+‹g+P+Ce 8+Ce + h-   x wT&&eD fEEe E eD & w\( N\eD   \(v& x"k6 w& Y 77 ,sE ^+ EE`   ,ѝxs,$(Y ED&  (Е,Е P ((', &݀, % %@& ӕ%ӕVӕA!Q  ,`s, QeG, 2K) eCee  Ce5 Ce 5CmFf  JV,60  &܁m %e eC! e, ) 077 e*- & ,|eC' B$1` Z e`g, V61@)  >w, " &)ȋЭ1Н)d%6<%2A%O:%4>NONE f&f&& O1!eeCeCe peC`EB1* de &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.%N5iU& & Y5]eX&v&\h޷ &  '7 f&^PP&D&f=ABC 0݂ &݁ e e< e<P&eNjh'5G5?^ 89f"e\e!e 5f h2* eA ^ Eh r j50R & & & & & & & & & Ε t%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 D0&0 8(5@65865`06  45  55@ .5 # T&&q'>'& w&&y' &&/'' ,<<7 ~7 ~7 |7 ~ 2 5JM~ w5:E@ۇ >2ۇ 7&ۇ 0~܇5(5$ w555 D@    eE 7ڇw75`F&\ U  5~U@t wwN7.-@ - w675@8p 1 1  W    wh>556557 j7 h7 h`00  RQSBg^* wF w< w *  vw  w` 5n 5h ڇ 5: 54 ڇ |xڇ njڇ5^XXTڇ5HMB~>zڇ 4C5.?(fڇ 854@ڇ -5),ڇ "5ڇ 5ڇ  ߇5D ww F& E\F& 1~5B(F& #0 , 0 0 P& -D >-6 L& &w̥, L& `-m.P&  P& `F& %7  w  wee7 &fwlh 7 `7^b @,q `-KacJE[ !m"@  ) L R  7 f@  &  5]U E :&@E A  ̆  E vE cPN 941 @  . &f |/     8  " .$  ̥ZḀ90     w F(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$EXITLIMITLINESSPMEMSIZSTBALLCLICPBATLACTSTDTCBTALHDRDEVDCBSCBUCBPCBPARPOOLPOLSECPOLTISTDSTASADVTSKTASKDMPDUMPKISKDSKMRBLCLQCTLDECNETNETCACHELOWHIGHSYS/////////////////////////////00 000000"0&0-01070;0@0p(= 41, 1țv3( /00-0( 001  0 :00†(0:†(0:†(0țv3) / 10,1 :†)0`)ȁv3,f)41/L1ʆf)+ \1f)d1,41ʄj3 j3 j3j3j3j3j3j3@j3j3j3j3j3j3j3j3j3 322222j322 ,3 ,3F3T3 j3b3j3j3j3j3@2-2 DENS22I22T22Y22=2:2)2)2)2)j3j3 =2:2j3,j3j3=3:3΂*: 3j3‚*:†*j3: 3j3‚*:† +j3:‚+:‚.+:@3j3†D+j3:‚Z+:†p+j3:‚+:†+j3:†+j3,41/d1ʄ+[F,3ȃ3+.+3;+3:3,3[F,3&,33X,3Ά<,3,‚^,]l,&,3;3.33|,3;33̂,,3$D&3_D&3&  m  f A N  %&f @D %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%N5UUb& & Y & fY & w`" &&= E 7 ܷz5@?D&&   `Z&  07 <@ rU 7fff7  ɥDY 7 T5b^ eB$& ( # $U6w5*# "(& eB$& [# U5 1  "(&eB$& ~6# z0,( e p 0 5r& eB$& 8# 4 2 R'*'eH , 400 RfQ`KTADATADATADATADATADATA%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  %??B!B h  r c  e # :0p YTV SHP   $d &eHD&0p |/, n)&  & & & & & & & & & Ε E@U ~& pRTeH& %NCDA -- Symbol file %X has illegal format%N%NCDA -- Symbol %2R not defined in symbol file%N5R 7 7 Q$%@7   F %J wH&  H& D ,':'J'H'H'^'J'H'R&&X1-+-(̵ %$ #-@ %$%% x T&f  & %NCDA -- Error reading symbol file %X%N   : *eH' 77 & U 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 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 = %P5bw>|%T %:V|  ee %^`@eee|et5wJP&$ F&% ­ ))eÝ mvڋ%F&er4) -Bw 5e&& "%   h)  &  &  'e7 ?'%^(7  $%D+ j( j( ' |j( nj( dj( Z' Pj(e(  e( z  ( ' (Z D  |w -l5 L|   % ((  hb' ^'  0 ` &y(%%@( 0 &f  %  C CE e) @%<%8%%$-x5-j %0ÝN m, 5  2%e&e"*0<rx2>DJPV\X^j 0.jBNT LOWCORE ALPHABETIZED DUMP %2R% %7S%2R% %7S%2R% %7S%2R%:/F/R/^// H..7  Nj/ .p/ &v/ |/ 4/ |  ..& 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. 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 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%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 CRASH00 !RfQ`KTADATADATADATADATADATA%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%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%10SFPP%8SSYSTEM HAS ENHANCED FLOATING POINT PROCESSOR SUPPORT GROUP GLOBAL EVENT FLAGS GROUP NUMBER =%O ACCESS COUNT =%P GGEF DUMP:5w<dE5w'LR tee eEe'e%-'' #( ~ V&D a a(:( ^ w!" BPewj E dփ  V( (%(e XP wDԃ  ( &PewEEe e) DL)%%)o) ) X& e) l& ^^e* J& :8e Ce ·%8S%VPf&    (>  @ @f&  `E L\d>  % & `E  f@BHN  d~(z<R.B6Zb,&JZltH82n*>:^4LXRt"*6$("VP\hbnJl,`Zf06$F: &D8p|rN$hr |Hv~@LFzd<x~T4T`xrx 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 %P:AAoAXAAA $$*606BH<BNHNTZTZ`flrxr~x~ &,8DJPV\bhntz &,28>DJPV\ b"(h.ntz4:@FLRdp|  $*"0(6<.4:@FLRX^dv|HZ`flrx~ SYSTEM COMMON ALPHABETIZED DUMP %2R% %7S%2R% %7S%2R% %7S%2R%CCCD  r@` ,E7r00 )RQSBgA`-f:@ 7 R-<@A -.4A A -AA  e A &f :0 w&fm-j̰b̨e e  z7n@`7j@`7f`b-b\ZTC P e@ > AC DAb JD D D D C h  &A V¿ e w w w w wW CD# DE!C5S   "  4S%BBPw61S%P (dDGPGaGwGGGG/G 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 FeG j AFeFD%@ 2 AF L&  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 REGIOND&e(݄$݀X&u& J $D!N <!FCf&e e Be!*e e -e!eCF' k' ' w' 7( w' ee5e J7we N ,  :  E   D D D D D D .f& ee0p(ee $eE`7&&&eA je2:`D jeD  , `D JeD   E`D eD  p( ' f&fp( eD eD D eD  '&  m  f A N  %00 1R!2R`KTADATADATADATADATADATA|,>!W W  &[q W A΍#SYSYSYSYTISYOVQ΍Z<=Q@00!9RQSBg00!AR2R`KTADATADATADATADATADATA$!~$$!~$$!~$$!~$$!~$$ |"$$) p4'V'9 j p4'J( 4'b( p4'X( p4'\( p4'Z( 4'^( 4'`( 4'n( p4'h(7A@@RTU00!IRQSBgC LB:[1,2].HLPEDTHELPEDTHELPEDTSYS LB:[1,2].EDTEDTINI.EDT00!QR2R`KTADATADATADATADATADATA4<==@PF >== >>==Z@<=>=b>x@=*>=v>@>=<>=>@=N>=>@=>=>@@W@@|@<w CdD E DdE bEbH wC D EHwr&&    dA B dB b( @ A B N  Tf f &f &ff we~fC~w  ~@w  N @Ԁ %! - mC a  v  M z  h  V  D  2   f6D~  f6D~     f  @ P ``` m  : & : 3*&j : :3 )$6 Fpއ$6 6p҇we4@ $p9, : === =@wDe8@p@pp o* 7*f  we@ fo w %%geBfe A : ." p (e(Nv XA A A . A ;  5|{W W f?@  A ~N e %!)Nv : $Nv Nv %@ (  @ B  Ze&  0   vPe0&  v~& & & & 2'P&f& Ε& Ε -dz\z^!Cפ:$P W[C W<CW>~W]~H $$C˥.˥;  P$ ɥ.  C ɥ; ~H$ ѥ; H!  B~ZV."R~""~ѕ. ~ѕ; ~"!H7 ƟwŸw@& SY&"D pAB% b! B~7 ̚7 ʚAB& >ABn& . : $@@eB! < kw7*w*e7 83@# k+@ М ̜777$ kU@ zt*7  we" T@  > 6,$   j0  %# jF# j  ww we@&B# Jj j B  lj wre  wXe"ff& & & & f e @" i wefff& & ff& xe "@ 00!YRQSBg"% ХTХMȥP=  0 YYwe@ABeE D` bl lrw8e@A f B eE&s   s-  CslB  e@<t% ?,ڛe Bf@ e&& && & &&& 4'& Ε      X'& & &  &&& 4'& Ε & & & & &&& 4'& Ε & & & & 8'& 4'& Ε ܚؚϚ>f|-|-& & & & f|-& 4'& Ε & & & &&& 4'& Ε  X-R7 JED `we>'&ÝI#B & & & & & 4'& Ε  `ʝ㙀  j/s sw\e 7 $7 $7 $7 $7 &7 $ c & . wcw-.CD$wv7 Μ Rc f =М 5؜R 2 Cw:N5  aa N5!na e (=XH Daa e5 =  n a Z%y=g i4& Νvq4& Νt xa54& Νl4& Νj Xae &4& ΝN (:!2@=XD@5we& & & & ` e(P lT-5 R5R -U F U5$ L  5ܚ$e a-r   `CeewRš    z ~ (! 5w8 70 _5 _& R? Ιx-F - *ׯ!2  5-G3& Ν %  7 j7  ZR e He De5 0׭&!  _ D. ^  @ Z  5R$ l> B (֗(җ!ʖ w w7Bw   w( ll҃ '  N l|Z#ff& & & & New:"ff& & & & *"ff& |'/"6    l (w./ 6  6   (7    "&jb"&& & ( 7ZR5C-P5 "d& "h&& &  "&& & "&& & & & & " ee3#&ff &  Fe%/#ff`X&  new z'w   l `'z(Z# (.:" "(" (#& aaff e 4  l & ("(#&f 5/$  - 7 ~ev  [ lZ#I:"F"C/ -<"& %5-  " e-5"蒦 5"& V e#&   l % "# %@ % e f  l % 8[e $%  ($  [fW  B%W ,W W W  W W )7  a a  e a &ef  ؕ  5֓ 9 wƖ7 %55!--l5\ C z  f-b0u 7 Z X&-N0u $- 7 07 .7 $7 "7 $7 "  7 w:5ʔZ  #a J! :@N \0 @ E  @1  V 1 W  A1%ef 4 .X @,--Г,&e >%f V NW @w W  5qW  g@Ҁ El^ Ne@V5tW  zf 6 -nF hCef t < l  ~> P%&< DX <@te0 9e00!aR2R`KTADATADATADATADATADATA "@Ee0 9e > w|  r e4  ؐ-Ҁ El#5~ eӦ  ԗ  ~ e@w V"-B7 <-6  (  @7  f5 A   ڑS-葺  ڑ  @7Α ȑđ|-|-~- &  e  de7 -|N H n  @7b \ | t 7 @w- N B B  r &  r fe0  |-|- |-ܑ7 ڑ%f-Α.ȑ w  5^ Z-  &  d%5f %-R 3 -^  w  & N V w 0+ ֏ @f %w6 & 6 6    l nT <() R  N(  C 5^ Z le j5 $() % ( %7 ޑKaa ( ~%7 e)7 BL & `( >0f7c Ne7 Pw  Ќ(:e(& Pe ׭! 5H( %e((܊!؊ewa  WpeBaf : Na a  %a ew|- a   ~       ` a af  W &e0  W  W   %W ӕ.% 7e|-mލ7ތ7֍e "P P w -$& R5z  5 e  "e 1 >  l   m.f N`7   ' 2N ,% #  |. . -ڌ  -ƌ < . ` b =t  aa $eew߁  & N f N jO@w6 & 6 6 5X aa 5i > "dW  f& ޾&e SW r  h  ^  T  J  @  6N`+ N` + T -J0u  @ -60u *eeewew݃  -  7  -։5  7%     7 w D A~  l4-p \  ( p-N[ `4   A B 2w B @ C @  1-f <  & -†[ @ N ^D B  HC w| tw pf |%7\-@h & >Xe- ~ < 8-4 0-, &%   ~%wہ    ʈ -ʅ[  %- Y Ne e - N 8 ;  $H wVTL w  -L F-->6w ,wA -a 5| zae "   l e@     AK  A @ D! D!1 D A ( D  A  @  - -  A e  @ew -ąHe- l)a j (΅       | x t%   d ` \e w؁ CB-HB w >80 -(7 "-(7 "- 7 - 7   w w6  6 &5 w- A  5 C  L " aa % V wZwFB` *w$w"   @pw CJ swMf  1 5rQnm 6 te" $m   66 + |%m    ^m 6 66 %    6 00!iRQSBg w w4-V w삀 ewzڂ7 ڂ7 ւ6  - --\n*v" '-7 <- Lef &5v  v"  ށ  7 ́%-,   % >F E 4F (F l-- 5 R%7 恇- ؁ 5΁ (%-0u 8-v0u , T$-    56 5*//ԃ 7 ̃7 %# C+a |+a j a  %fW @f1 we  wҁW @ 5 N1 Vw%% wn҂ | p :~? ~~ 5~ ~:3 Ne7 ~ pt|~~V|~7`~~w<|0`` | |n~ 1 w`~7`\~ 5  5{55ew^Bm @m  w0}@P }}}}} h{ f }} D{pp}H  }{v}mt}p}P} {B}wV}/zr5| || -|| \z@`B` " " } 1| ea|B f& fz|m||eW"      l )"|{ {-{ {-{ {B| & X|70|.|   ~ |z- $||{ { w\τ  N ye$ % zw R   l  -b{yZ{ ))7J{ { { {5{ {z -zz& %y``   0a``   :{74{w`0{eBl " f 4 {?xxz z`   V Orxzmzzz&^xzmz z`?zze `,xjz tz pz lzrz/x  ww0zwFzmDz@ze  f  l~e wBw@y y y& & %-y 5y y:3 &eyy:3 by7 |yew*w0 "|y3& py? wwBy vVyb C``C C" " 7ymyy v-x& x/v vxmxxwrv0 x3" ߼xbHe7x`x``   3"  u|x 0&  vvBx uVxmTxPx f6 6  :26u"wt aa > wP 70 a ˶ -~ ~(4 N% ' f~`aa a(48ue e $ue`& 6 ue 4 = ;vv- # wvw w- w w-w v ptev eGv a a e N 7 s%e5s` ^lZl wŦ)6  ) w o451 D& *6mqmq m5q  qe- ހ` %5jq -HoHo D& 6mDqmZq  Nqe%%' 3%w a=˕ `& H Ė%׬-  `N`c& 1c9 ac@eA& P c c e e e   e35k $n\& 5k\& 7 mkf5k)7 kpp5m o & ޖ% m o & ޖ%wp7 mf   @wD -mm"o ) o6 6 n6 oomeoe ר ע   Q Iɕ @mho & N& a6!4C ע  )' ))   B)  )  N& a e% v! ~W ) \)f)  ) %  -wW ) )f) p R %e w"D4Du/4& Νu& & & & t D& ewXEmN  E W W  E  ! aaKW/ E W W W/aaD "(a,a0a4a T6,6 &5,w^ (w wv6 "*e1* aa aa"  .a2a,2a Ne o a 4W  N2a af f(a& "e f e 5,@aaHNatLa@`& %":a>aBaFa 6>e( 00e ":a>aBaFa 6>ew5"  wj (w~5"?  @t@a`@ 6a`& v (" ؎.e0 "2a6a:a>a &66e $5$/5, -0  .6 $.0 @ \"2a6a:a>a 66e 5"[6 (e1.a2a2a e B  !  r  ׎.0 ف2  ց W  ""2a6a:a>a 66e   p ( "w& 6 ( P~ D"&  2B &-lj|- ree)5*/  E -e "a a 8>e  %w   0- 5A C,~  f0l-& ne w 0 a X   al-& e f-`-a fa0& e `"lh dh `h    aa  Ba λ2`a  Haa a a feBa ze%eW af- @ f-6 | 6f- 2%l-f-a dee0l- Zg `- @g f- ֺ Z0f- ewf0a 4r-  a0& 6e e w 6a R:a @ 5w4 a0& ܺe pf a 8  Tf Pf Lf - -  "a f e 8$a0& Xe 5  c,a %aa ^-e%D"a$a *$a6 f  6(a %%ew &ab X < x  e ew5b.d+  &>b)B 5b-d5`d Ld5.d b& re w0-a  6 c -NbHbdaa & N& 0% C )aeD!Da !P-ca   |-da`a Tc J'5nc 2 (7 c%cmxc x i g3&  a` & FF a ·m Dce6  @`a`&  H v `m00!yRQSBg  q`m-&QUIT/SAVE!.TMP.TMP* $J .  ,          *::::JJJJ Zjjjjj zzzz  )9999IIII Yiiiii yyyy LF VT CRESCDELINDNELSSAESAHTSHTJVTSPLDPLURISS2SS3DCSPU1PU2STSCCHMWSPAEPACSISTOSCPMAPC!!C/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^O~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"Gŧ`y` d'@Bʚ; TvHrN @zZtH^Zb K:[?8h[?8l,,2"*Additional information available: D-C.RESETADVBACK*Error:  $*0Backup past top of buffer 1Consistency check failed, please check your file0!Error opening terminal for input@/For 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 closedPrint 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 - File processor device read error%IE.2DV - Rename - 2 different devicesIE.BVR - Bad version numberIE.BHD - Bad file headerIE.TMO - Timeout on requestIE.ILU - Invalid LUN ':' required)Cannot set terminal type from change mode"!Could not align tabs with cursor2!Error opening t00!R2R`KTADATADATADATADATADATAerminal for outputBHelp file could not be closedRInput file does not existb!Invalid parameter for SET or SHOWr'Line exceeded 255 characters, truncatedNo output file written!Output file could not be createdPrint file could not be created+Sequence 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 - too large%IE.ISQ - Illegal sequential operationIE.EOT - End of tape detected'IE.NNC - Not ANSI 'D' format byte countAborted by CTRL/C/Change mode can be entered only from a terminal$CTRL/C ignored4Error reading from input fileDHelp 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 65536Unrecognized command optionIE.EOV - End of volume detected'IE.WLK - Write attempted to locked unit'IE.LCK - Locked from read/write accessIE.HFU - File header fullIE.BTP - Bad record type'IE.RAC - Illegal record access bits set'IE.FHE - Fatal harware error on device#IE.NFI - File ID was not specified)IE.EXP - File expiration date not reachedIE.BTF - Bad tape formatIE.IUI - Invalid UICIE.IDU - Invalid device or unitAdvance past bottom of bufferCommand buffer exhausted&'Destination for MOVE or COPY not found6Error reading from 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)String 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 - duplicate entry in directory-IE.STK - Not enough stack space (FCS or FCP)IE.DSQ - Disk quota exceeded 'AS' required9Command buffer exhausted during XLATE command processing(Editor aborted8Error writing to output fileH!Include file could not be closedX/Internal software error - please submit an SPRhInvalid value in SET commandxKMax line number exceeded; lines no longer ascending; resequence recommended-Now enter the definition terminated by ENTER+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.NBF - OPEN - no buffer space available for fileIE.RBG - Illegal record sizeIE.BDV - Bad device nameIE.BBE - Bad block on device#IE.NDR - No dynamic space available +Attempt to CUT or APPEND to current buffer!Command file could not be closed*1Entity must be WORD, SENTENCE, PARAGRAPH or PAGE:File attributes errorJ!Include file could not be openedZInvalid buffer namejI/O error on work filez-Max number of lines for this buffer exceededNumeric value illegalPass bad status to caller+Record too big, truncated to 255 charactersThat key is not definableWork file overflow!IE.LUN - No file accessed on LUN%IE.CLO - File was not properly closedIE.FOP - File already openIE.BNM - Bad file nameIE.ULK - Unlock failureIE.WCK - Write check failure Attempt to PASTE current buffer!Command file could not be opened,Error in command option< File name:LInclude file 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 - Device not readyIE.VER - Parity error on device#IE.SNC - File ID, file number check'IE.SQC - File ID, sequence number check00!RQSBg%IE.RNM - Can't rename old file systemIE.BDI - Bad directory syntaxIE.ALC - Allocation failureAttempt to re-enter EDTCommand file does not exist.Error in range specification>File specification requiredNInput file could not be closed^Invalid entityn!Journal file could not be opened~No help available for that key/ORIGINAL line numbers no longer an EDT feature!Press the key you wish to defineSelect complete lines only5To return 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 useIE.BDR - Bad directory fileIE.OFL - Device off line+IE.BCC - Block check, CRC, or framing error  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~AAAAAACEEEEIIIINOOOOOOUUUUYAAAAAACEEEEIIIINOOOOOOUUUUY  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~AAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuy6V'&1 zM>@ rM>@ jM>L bM>nc ZM>>k RM>@ JM>@ BM*>@ :M*>C 2M*>C *M*>D "M*>lH M*>H M*>dI M*>I M*>^K L*>V L*>V L*>&W L*>W L*>W L*>X L*>TY L*>VY L*>(Z L*> [ L*>d L*>g L*>pv L<>@ LN>G LN>rK zLN>@ rLN>L jLN>@ bLN>@ ZLN>r@5ew , Bv     5Bwn 50  (r- DUt-E D  E E ܁&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff P$d0 ,Xp l`d\f {7 EtE@ @<` \ w77 7 E  lt J{zF 4Z} B} t } | ,j y r|  `/ AP D *j g R c ` ]Հ W :-T i && } JA #>R / >A 7 fe& &  . Հ   *-   \ |& |  (55@Z5z7 w> W y7 @  lRt y$ / j@ Nr{N` Rw q7P< / > wd wc Y7 w(5  / @% wj  qze, a =B` :  Y7 w5  4/ ?%wh   p -) 7 es kf / R? Y`N`a =$ a& r>e w .q 7  / > p X_f 0 #  4p  Of    p  :7 7f 7 / / p>Nf& W  l|td X7 B / 0> peMe PBf b v e/ =e4 , na = 5  / B<% a4 = |o e }e dB,  v`ȋȕ ` / L=N Nf rh Jd VeHff f% B  / l  w08  f %@ lt k% 2k %B %  k w7 >6f dc% w&ft& 8e ft& 8e 2ft& 8e 5f& & PMe 0"7 @N R -d7 ^ 4 |w L7 Fw r7 lB@ 7P  2 @$ e%a+ r%-t Hb% Bj oF  d8 ~o$70 0e 60 et& K  QX&&& P(5  zQ-^( q% f$&& Na% #V 0Q w  N B@6 5| 5 k 6 bea X3a* ~a  xNe / Wp aa Pm% e a 2a* a  Newd Wq vaa xPm% e D6  62.2a,a G5w0"a (26 7  w^-n5wR G 5aS.ގ  a 1TCeB a _ "a$a 0%W!< a* _ 7  Wq wx a a Om"`% % wNmW 6 0:246 (j(d,e,,a6a F5  ( * , 6`ew5Z<a& 6F5@a P  Kew5$aZe& 1e Dڰ-  nKU@&5 l<a& E 65-  & Q - K|5n 2 G(at FI% @a O eN6a O e e05 6 t Za 7eew.&`ɋɕ &&  / ^0 Bbef@ ȋȕ f h /0 / 0 ^   | -  / / aN j%efW  I  W f  w- 6 & 6 6   > 4I ` vaa pC54 / / b e 6 r Iaa C5e6 RC & & B5H"a RM .eK-)َ# Z]e 4p h& & B Ha L e5LJa L  Gje ew4, xq;` f \Ԗ%w5 -F r E-& e3a ", Ν3a , a +ef-~ Z% -  lt nf 33N`& N G5 2 )(" [ %55 ((! n z ~Je  >/ ,.  ew00!RQSBg*J  2a j,d f/ R, & F @5e <׎ La *Էa %a t* \w @af + ] b/ +R  eG a $0ba &*t  ?N 6-f2 / &   b d f50 N   vV Dew5 .]5 N \\a $ӷa~ \5 ldeBZa P) ^ \ xD0^a *)0na )e 0&a (5 >&a`a W %5" a-,  lV Ce&g ,\ & ( * >5& |djat ` tt C.aB& (e t C.at e A.aja& (e  e,eJwf' aa ,c% 2 fe )xє Zf Wa a cl Z5 ^Ve  %5 Tvt _hd lZ Ljfр77 PZ kw DZw&N / <( ~w0b b5 5 <@ 5 E  Et /l /` ' Ye J Y hE F:2 ӗ aa ;eZew% > @ @`ȋȕ  / & @ ewnh<6 6 d6a a : wZ  % ; !-ph C t |- ? ? D և5p ` / & X : a& 2:e a D na& 9e a ^D 0w> /f % |Wea (D7eef5` a #`a #e @`ȋȕ   / %N T eq ^V ώ |e Q  > /` $ Ve P V0a :#  -     / p$ TVaee .h / B$ &Vr-t t `> VxB   lXu ]k7 hd^ X~zv5W,w0@   lnu \*7 7 r7 l 7 ~R7 LTWdS7 ^P-,a"z }7 t-X-P5  u A 4<̖%8y- -5  u A ;̖%7 ^W,wVRB w, w -|-xznwj4@   ; '& ~ !@w ~W,Xw"-7 - 7 cv @ (+` ΐ a [a n[  :& D!wV ;w)7 &W,ww7 h7 b \ 7 V7 wECW!w   lu Y F3f33 3334    uf` eeJf&f` %}v E  6B  W W d 9   6! ^@ 0+`B af Yaf Y w` 9$&f ɖ%w *w $ff %7 Bd 9 f4& Ν( e ew<6 6 >5&hv aa 25 5~a T= {& & 25 a *=epe5* & & 25 a 5 3ew"A @&+ &f{5 5>& "/ 3&a \% #@ 7 e C p 2%mf7 ( 3 z1 C |& rh w  3: N1YV v 4%vb v 4%vS v 4%vy v l4%v-v P4   Bww[H 23 2 w F w 4%w vw=w 3Z 2$w 3H 2 1 w 0w 3%2w 8w 3%:wz5>w qHww@   lx ^R F3f33 3334 B7 l C "\ 0%mR7  0 f/ C A A.+ B7 & C w :0%m 7  0 / C 5Pw1\w .5fwwlwwF70D4 % mpw T2  -ww 42 *0%S:8 7 b C R v/%mH7  / \. C  /.w 1f 1 /w 1¿ =ʿw f& 1 /e wx ʿ z /y  `W"#fa X%  `exf`&  5e ee  wJ </ , er  7   15-5*5'-B 5 *5& 5  /  %  P d / 0 a pb  a{ N -e /F  Ge e,&&&& @ewde Z7 6  6 Hv`v V-vR -lD@m6 >5:552f1zf ce %f l% cf J*1~   m"Ė%5& N 5"-¼r T. W!) PIp 5 2%efҿ  7 F- 5&  F% d -  ) w")Z@`ȋȕ  >/ N w 6  w-tsle6 `va v!W  W  & *a ȾAwpa DBaW 7 > r   C  r  fe) `- K& $()ֺ G e  Ce w5w &0Paa TL% P4f 4)B`Z Ҕ Ca  @  a ܼwؼ /мa a KePa a K% V p+& w 5v5>!fa 0% ɕQ& N ;̹ - 7j#T .:5 `)4& Νf aP   N :re  *$f HWYWN WANWQ>  r* Pa a J% e--P{{ h/ )7 к7 ʺ%wj * d ) V ,f Gfa   ݨ=4a "a/4& Νt& & & &  D& V.e"& < B b)eaD4 zXe e w )f D# 4f f5 ,eaa "I  Vp7` e%w )  " 0-@, 6ea6a H%%"P@,`6tfZz0 J*JP``,T"",,TNoMAINPASTE line deleted lineMAIN line moved copied time line resequenced=> r (`Tz  ,4<4< ,4:HNV &, linesNoneUpperLowergeneralexactwpscase insensitivediacriticical insensitive begin end unboundedUnknow00!RQSBgnVT52VT100Hardcopy, scroll, noscroll, eightbit, noeightbit, edit, noeditV3.10-00 COPYRIGHT DIGITAL EQUIPMENT CORPORATION 1980 & 1984 COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1980 & 1984nonumbersnoverifynotruncatenokeypadnowrapChangeLinenoquietnotabtab size ; tab level norepeatnofnfnosummarysummarynodelimiter delimiter nowps wps Help file name: autorepeatnoautorepeatInput File: Output File: **Readonly**t6"8Rp,F ":h $.$ &,GOLDW.BL.EL.L.C.UNDC.UNDW.UNDL.EX.BR.ER.CUTSR.PASTE.CUTSR=DELETE PASTE. APPENDSR.?'Search for: '."".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.SHL.FILLSR.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 ` f,~589:XFHfIKN, substitution[?3l[?3hf7 2  f7  & 4 tׯp; hׯb!=    X(, 8\ .Z%( X ^ |X Zp ~ Y! w? N@RL`  ҃ "-(& N$fe%& @e W# P% pd ~ 0A  wt? eMğuEŸE  ߈   lP z. % ۇ^Z &(P SD 7(P8 F  "  ( 5.    & Ο  E 7(PeMCe B f "%    w*>- -~  " |n7 f\W 04W 91T0:. 4>H:. p=( 0 6 6  a:. < ee7W %W AW Z W W W &W #7 W %> V0p FWW _kW "W '`5_5`'7 h j f- T ?D-. 270*> 7  ҁ   x`& >> fe \V7 d ` W ! T27 ef W  jp v -!F E7* $7f 6 f h=p e f -teD.& f ; e@ w>;  ;w lP  v7 hnf r7h% ~W W _Z[ H7&% i-$x:. ew0k&e V%lZ N g 8% ^7= bwr MIz % ,dp1 -`TZR wLuF*w vw  wu:.$ h% `:. 9ׯ.1'606 6 WpeBNa a 8 a:. P8e   w& p7P% D0>27,%&2!,@ 1 w- 5j sg5 vs7 & % Mp-A `1  7    7 dl!1 ҄ 7  1q7 r o(o5< r7 2w   5$-zz rn  W W W /W "W 'CC w*p w2 $-t!-l;~B Zr5NnHwHR & H% 800!R2R`KTADATADATADATADATADATA1 vt<pP| :.fe 6 :.& e 6e]WQ-@ = :A-0 - *1f-~|pe, W  cb`pe W  N Jw:s.w pe-4W0W -W *W W $W wj @pe- W W W W u ߊ@p-| W W hfpe W cwLJpeW W 8T 4P& z `fe 4`fe 41e e\ ׯ- -O   wpW r:~   -bV)hN%F!>.6,.& t *7  ew3  lU zn8- 40-  T6Q`5ɵ CE CtE &&N`& *4e  #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 )` ,`&*)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 #" (%+% <"+`h1;90c*A4CbHu rNLQ#U27;%JS'4@^l6&pvDtn\~J&FpdXFxjZR>NV^<  p^.DVvf>(b.aCHANGEBCOPYcDEFINEaDELETEBEXITAFIND;FORAHELPsINCLUDEaINSERT1KEYaKEYPADNOKEYPADAMOVEQPRINTDQUITqREPLACERESEQUENCE2SETBSHOWSUBSTITUTEATYPERWRITEaVERIFY#*TOLTHRU-,ANEXT;AND+=.jBUFFER9ENDYBEGINILAST9ALL:IRESTkBEFOREYWHOLE/QQUERYQBRIEFSEQUENCEDUPLICATEcNOTYPEBSAVEBSTAYrNUMBERSNONUMBERSBCASEREXACTbSEARCHqGENERALrBOUNDEDUNBOUNDEDTERMINALQUPPERQLOWERANONEDVT52UVT100DHCPYaCURSORAGOLDsCONTROL"ASNOVERIFYTRUNCATENOTRUNCATErVERSIONAWRAPAWORDcNOWRAPbSCREENQLINESAMODEQMACRObENTITYCPAGESENTENCEPARAGRAPHRCLEARORIGINALQQUIETsNOQUIETaSELECT2TABSNOTABCFILLaADJUSTcDELETEcREPEATNOREPEAT3FNFUNOFNF3WPSrSUMMARYNOSUMMARYaPROMPTDLINEfKEYPADNOKEYPADHCCHANGEfINSERTwINSERTNUQUERYCTEXT3ENDBPAGEBWORDDELIMITERNODELIMITERPARAGRAPH2WPSTNOWPSAUTOREPEATNOAUTOREPEATwCOMMANDRFILESDIACRITICALINSENSITIVE"CI"DIFUNCTIONfSCROLLNOSCROLLEIGHTBITNOEIGHTBITDEDITfNOEDIT+)(?FV@<W61vd}:JAcS^ -+5. $wsh|UPG`[|v83Ml` -"Z!`Mlfq0E=w@  {  3"7 T Nk ׯx!  5Xf 7 H 5 B [ w--zfP2 w!55v7 T j V7 -*w: lrv$  -j& [%)) [[ W Οz W] Wj7 h  ^f `[ Z71(() N` N" ׭^ ׭ Z׭z7e(7`23& Ν() I7e(5 ^  5  hW! & `N t%  lxv$  5 F@ @`%5 \ () T  ! T - y( - y S %+5 wR x< ) ((!" (7 ! 5 6- .I7 ~v ]% J -x) ^s%7 .-)   ~ 00!RQSBg(p2 7 f7`7]X`) >eB>e)8 27 &e) 7 w< a b% $ 5  B  B ef Pe  w;) a " r Q (5tv 0f 5 eW 5 N& % G%WN  a % .W W ,W ܃5nI& N& & eN  a % %% P (5%%w %wr: j Ua  h   &a Z { v 5 8  9 : ;> @ wbv& e wB 8&  %v X vR%-  b   lvvv W% 4   lvvv W% R-  f -   5 --`)+ׯV  #   --,)    b  \@ > ,i  z w5  a ~ 9 Wp B`B0 c  ? O [ ~e  ܢv#e,    f5+-@B \L-46 ,00 :V% \e00  1 D  f1~#&7-6- 6e50f33ȋ `&  U O%f @ f `W"W"W" ^ O  f N5 6 V%W ^ L e@ f L pO  w4)!P W  1& +W W W a --D >(W  " )Rf  I a  %f-/5D+-B-<#v S N N; lK Nr \K7 67 4w޷ޖ% - f D f  Я   7 |e)v7 h7 j7 ߇--)5v ,S% P\ 0  \& Vv R nM >ew2 ` (` " `  D (    %!   !  fN %  wR1mP r $ 3-& * "۷`Nf 2f 2 f) 8H "I w B` w )7  -     w(  77 -    Ѳ7 -ў     ,5-# z 5zz ,I% Nc { I%> >< >  & vL5tzz H7 ew'Є 7& ?W 0З) v5  =  7 ?W  nз`j  @ w~' > H     lh} :bW AIW ^Ff|A W B>W W;<}B @`e{ C -D``7    &6  C!5 ~E`A w& x =G-nnC fb-^^ T _ 8 Z u  _|Ў Q jJV twZ Y%T.Ї->-Pl}t} F A7 7 Җ%|} F7 і%w%. |zxv Re5dwT  " l} N`3,$ R*N,J+* 5 pf s w$ *@a %w7 jfb^7 [ w e  ds  Ae, $eΖVδ f,v(l$ ! 8 |e - |$e  "N n` * ~,  \ r Ta pwp y P   o j ge-  - 7 5xIE-RͲ) wpf z 1 jaa @]%mF 7r " q Q ! 7rj7hzb  7X` R] -"- _  )  7 |- 7 ne)h5~@&  %9 e, "n.̌ >Ne7 R7 T ( ,  J8  , H ,w  7 ̀ ew!N11& & ( We a !   aea   @     pe# 21 | VC~e   o e ew  7 "  o {7 Be .O% h e   Y6 T  ʼ Te& Ο % m07,̷ ( T l6 p r SW  ,   $&  - -   Xc w  \5 p zn( Q(z)v& & |na&  e wh  5  n(.e "h& & .n a&  e% J5 (HewW A1W ,W N&  i eh)ǖ%W  -Ǭ(  Ο xW (r N $  H -RǬ((D( ,5 %   5 ((P |PF F@ H N le %w- W @m     &f %     !z7 - Ɏ & ?7 7 xG% J> D. < \ׯ"! , h3 ׯ ! ^ .T-NPa a X% V t87 Z ,Y 6 F j TF 77 7 >e & aa / 0-@, 6ea6a 4U%%wR(&  <& W!)H` F%  d g w$ ׯ e7  e7 !} &    57     : h  %) 2w  4~1ؿ   5 ` !b  n ew-Bl( 6- lz~7  -H@ 7xp - l~  7 h6 !   v -B 1     +7 ( z !  !!!   v  b bew05 - Bw, C!!=A r  l~ N0, J 7N,P * PP7hJ+  7%W!7 Jeaa 5 aea %     ,a"a .a &% a *a  l~-RM   w,a"a % v r  ,a"a % q Լ*a ZhW!)^wB ^-a 2H  T  0 `-|*a z0e, "  ½ҽ%& d%D R O (   V ށ E ,7 8 5(e) d! pw4 "  b (  M w H7 `    _e w 82 !  > 4 Vw(e)  ) к 8D T ;  C  C - mV %L)& Οe)  Οe)  7` |?) Fe wf 5   x ^e  e,w v  e) ) & e v    wX ҝ    v ҟ0 ؁ v    x w.:4     Jҁ B N`& N&  X7           D  ׁ D ew - B-0qׯb -Z)  & Ο&  5 ߘ  nׁ B ׯ 6-)2 T - J / Lׯ -ڷ) 8 D & Ο<& H5  $  ց B   be f     l ׯT  ց -F)ׯ>   ~  z  @w ) -)! @     ^&`%)f ZRwpJ`N %w  r ~ @ۖ%  B  r ~ ۖ%00!R2R`KTADATADATADATADATADATA      # -005 xׯ 5ׯ  Z b X f)7 * -޵ڵ& Οҵf H%@`w X% w%f)7 8w & N* %m"7% DB  94 zD 70 0e 0 ew      l~ E  Cxʐ  f .5-1 G 5a F %W ) Rf f a V 7  GOLDJK pqrstuvwxyQRABCDnSmlPM[>   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~AAAAAACEEEEIIIINOOOOOOUUUUYAAAAAACEEEEIIIINOOOOOOUUUUY  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~AAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuy"  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~AAAAAACEEEEIIIINOOOOOOUUUUYAAAAAACEEEEIIIINOOOOOOUUUUY=>\<[?6l)0\>DD &&&FFFFbb P2 w@$ - j7 )e- @ 55 r aa rzl -x\ -^  N7 f 7 6 2 5 ) a d7T P B D <-& @e -  -- (n6 - -<& @e  6 5 wv7 Lwv--b8-Z5 -$a b?--.a p>..F%-$a ,?6  *$a,.a ,>52 . . )(a vcM ) f& Nf6f-5N EN N @j) @& fN) @& @ & Be xe 5 l5e- a-] f N NE&6f(C f N C|~t Nl f & ^e 5 8586&  .#5!  &  e &  e  5 n    lT^ Jw.    ~ r     J  @  5 %5.     6  5 5c5 _ \   v     00!RQSBg ! -  7x&  de  T 55N <  r  5 5w5 w  66 6 7  5d55 Rua 65 4u C5-5 u& a R 5   t&  D e %5    t  5v5Q - 4 - 7  r  \t  e& Ο `6 2t &t %    5w55   5w:66 5 7 7 7 7 7 7 7 x  |  fse- 85 e& Ο _ , Z(a ]7p bf%55wL 6    -754 "   r ne& Οd _6 6` -P%     v @!,5)   J e& Ο ^6mh% Z  -<& 7e l -- Xe < - 7Y -.a 60a -& 7e w  . .-. 0-0 2 0a -& F7e @m7 8 < - \6%%5S Z%R  w  F    w w @m7  5X5"7 7  C  C m7 z5/  mh7 Z ^NFF6  p C  C  J >    6B!7 5   5 555 55    bo  N 67 j w6U 650 8 & RVL^ T4 & 8VN^ T & V 57  H   n 7 ;߄  6  & U-P^R^ 8T5f7 j߈ 7  P  :n * ߈߁ ewxx555D7 -& $   m ߷      m- ޷޷7 |7 ޮ7 rxPނގ tT j޷f |\ pMX e)e2w 2 \ m r     X7$\-- }  5#݀  N -& f 2 & SZ^ 4R XXw r-~ >X  N  4|&& & p e(& & :S-J\^^^ Q7  Nwݎ&&   e y w5/ -)5&  H& R`^ (| & Rd^ &Q JW7 r-r$&  ZL܎ & PRf^ P7 6ܷ f4 rw,ܖ% F&  > 87 &7*e %w/ j f&  & Q Se m rۀ _-v[5` & ێ x& tQh^ P#7 Tہ6T wL>ێ & BQj^ OR&  J e>ۦ&  0*7$   e @{5#5 & Pl^ XO 6& Pp^ 6O ;  r (& & zP-r^t^ N7 RV2P wHl&  ^% N&  F%@ -6 && & "e e $ -R) 8d%7 ؇wl- 7 f& O-v^-x^ N 7 Lٖ%B -r  JO|^ Me f& ,O Q% B  v9-*# ^ 5^^ vM% g ^ \M%   , & P5^^ M7 ,ef-/5:+-8-2#^ L N G; bD Fr RD7 ,7 *w׷ז%--P^^ L F7 7 ז%^ bL7 pז%w+5wn<-& n,e -zע00!R2R`KTADATADATADATADATADATA-- Y%)a Pw6   l^ f0 @  Aw 6  *@    Aw  w ֿw   @  Aw ֣6 6   wv 6 8mL 6 :e  wb6  րm   ev6 " (C m6    Cm6v6   @6 -W B  Q >շ XշJ@2  @ 26 `ȵ RD @-< 8-4 .Ճ 20B)`ˋ$  F 2     Է ԁ  І5 D    5 w5w %e t Jf-  [  - [ -z bӀ   b  w'  5k i B`ʵ,  l^ hbEv LEʵf JN  @b  6b AC`v   6   C` v     6  ˕v  5A -^^ jG - ҷ Ӗ%wb&e)-f-e) &%N, e  VP 6Pe T - %w&  \w B& H O A5 W I1 %w. m  B @  @  6Ҁ6 m*e7 5& >6 % E 0 - -v& pDbe\!   ``D  ! !~, ) F -d *  =!   _%v6 j -b 6 [-zФ & -xV05 `fB VF %5 P-J.D J?8?2ѷ . -*  $& << `  ! !~& =6 % a 6 Z- ) -#-В-Ͼ 5 f zE %& ; +5-TZ6& DE 8G% -< V; " E * 5- & D% F @ B  11 e IM60MIM MIMJ=>\<[?6l)0\87 8607 02,7 ,*$7 $E$ UUwh U  n'7¥,¥ w:  L7¥  UwD I%w D jI%w¥ ¥  4¥/  f¥/,¥ )¥ &¥ #¥=  ¥,¥( ¥) ¥[ ¥] ¥< ¥>  D H% D &¥  ¥ ¥/  p¥-¥N `¥O T¥J¥C D¥O(@¥R 2¥EK¥O[D 8H%E  EBU8E  EUU EE r E U E L UEE & UUEE¥ ¥ ¥/¥ ¥=¥: ¥,  ¤  B  EDT>Invalid option switchSyntax error on command lineInvalid file nameNo input file namedJOURNALOMMANDREATEECOVEROw;e 7 7 7 7 7 7 Z'& twn(5 wF(r'= f? w@ e 552(s   wo% !'.׭'׭00!R"RSBg''h7 w :e lgb' b X{Ps'& & & & & & & & & Ε f7 6 6 6 6 < - 97 7 7 7 f =v 77 B7 ::67 7 4H7 F7 D@7 >7 <87 < P7 XTPcc7 7 7 27 7 $7 7 (7 7 7 |7 z7 7 7 7 7 7 (7 7 27 07 r7 7 n 0 0-e j x7 D|-RP O 6 a6 aa M5 U5>  = e wNPa X  U|NF3 7Nf3 7N3 7N3 7N3 7N3 x7N4 h7**a0+ r *NZ >7%V nRe(w0**a2+ r 놎*N 7%**a(+ \r Ն*N 6%**a*+ 0r N 6%**a,+ r N |6%**a.+ q Nj P6%H& & LN pa (,N+6a ae V :Qe,#5" (hW  =Unfe,@ ef& & dKe  P :7 -x N U dP%5` - VP  5& & Je N ^P 6 5& & Je  0P 6 =$--T (_ f& & PJe l O V6  Bp f5 *o6 6 N=,$ a& I5 la >T 5 e=7 & & I5 la S 5 aa fI na S h5 e7 7 :e--PNN S pN7 d7 ^ߖ%w2 aa n5%M 1 1 w>aa n5e31 1 w 5a a >n5  3 3 ؁ e % * C*   ?[EOB] .!?  PASTEMAIN)B.JOU;[?3l[?3h`|,,,AW  &[q$W Fj SYTIzjF@fxSYTI(,+H"|r*$&)X.ơ*O:z ơʡ С ơ  ACS --00"R$ S`KTADATADATADATADATADATA Command I/O errorACS -- Device not in systemACS -- Syntax errorACS -- Not FILES-11 deviceACS -- File I/O error ACS -- DPB errorACS -- No pool spaceACS -- Dynamic allocation of checkpoint space not supportedACS -- Privileged commandACS -- Checkpoint file already in use on deviceACS -- Checkpoint file now inactiveACS -- File not in useBLKS=̠5 F wwwnwvwlwt.5 Π \  vS:XR ۇ 2/c χ Ḟw& dž(Ň.5@l> Aq w7 p      j 7   :ww w < .6 1j *2),>* ! w)&/#C *t Е.^| ޢ(L7ы wڡ)> , D>eB &B   p   BI7 o5AA    & .  ¥8¥9&f& v ('&1    L | \  5ew b, Bv     5BwB @?@\-W D- E %     U EU 5  (5(UW       wE5 E  W ͇5  ,E ʨ@&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff  &[q &[q &r [q}Ȫ E`Wܪ||},MM66W  &[q$W  *TILBSYSYTI<RTIzKTILBSYSYTI(UVUH$<}00$ SRSBg Q| Account Utility options are: Add Add an account to file Delete Delete an account file entry Examine 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): Password (39 chars. or fewer): Default system device ( DDU ): First name (12 chars. or fewer): Last name (14 chars. or fewer): Enter maximum number of accounts: List on 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 ( 3 chars. or fewer): Account number (4 digits or fewer): Enter user CLI (default=DCL): Enter user CLI (default=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 continue, CTRL/Z for ACNT Options Menu : Disable login/logout messages? [Y/N]: No account records matched Default file protection ([SY,OW,GR,WO]): *** Account File Maintenance Utility ***%F%Y %3Z Multiuser Account File List Page %D%N%Y %3Z Multiuser Account File List Page %D This entry ? [Y/N]: Type to leave entry unchanged Account file modification is complete Account file is now sorted by UIC Account entry and directory have been created Account 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-privileged terminal ** Use SET PASSWORD to change your password ** Owner = [%3E,%3E] Login_defaults = %4E:%11EL_name = %14E F_name = %12E Password = %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%Y %3Z%4ECharacteristics = %2ASlave %2ADef_dir_stringCharacteristics = %2ASlave %2ADef_dir_string %2ASilentNODef_ProtectionDef_Protection = [%I] 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 -- Workfile- mark delete ACNT -- Workfile- open file ACNT -- Workfile- 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 number 000000,000000 is locked. Try again. ACNT -- Listing file errorQUFD PIP *.*;*/DEL/NMPIP [0,0].DIR;*/DEL/NMUFD ADELMS"DDL ~  ~ .0 2t.& ACCOUNT.DMPSY:? p)O00$S S`KTADATADATADATADATADATAt P~DD5& HX  N|z2.0 Bue• 3X• 3 w2 Nŭ UJ ^ C L @2.< X3%4 @/&2.<77 00 e p 0 7 2    E U  ~ jJj  wj:  r  J : R w2 b w<@ B~ f #7  P    p    D  $  w d5` i T5W5~T JO '5fG )X K L )P )I%A )F )? x* R5 ~ʋ ~  %% w ww   wwwwwDw:wB5_ 0 61 $ K 0 Je wT2.pN F0. $2..( n0 0  42.77 P0Ewww~   w w  w|  Pwp w@d ` 7 b wH? $ w8 "5H~ʋ 8~ %% 0 & w5 E  w v w ~ʋ ~ b%% 0   wr wh w^ t wT wJH V    w XwBwP T7 L   T  F > E@E@w7 %E  E(5wR   ^ U7 5 F     ևȥF 2<=7 & .wF u @"$# ~- $wU^e@-P6 t P~~  ,~ 7  T eJ-F < L ,  h $ J - E7 @ , 7 5Eg 5`U! h S5O ~5I5 TA n>5  5  E z."&fV R f   6 e A #( ' Z w2 :A \    ww ww~ ^  R~ p ~ < B 0 ~ F U w wɋPH]&H H F]  w J5 % w7 #s  d"p  c E @"^A 8"Z   "K " v d%bfX !(wLJD H > !DA !%& ! ! 77 wwww b _, W T Q. NI Kn H EF B Uv 4; . + ( % " & X  1  (Е, (UF   7 5E@ (   5 ы 7w @ N(w4 tw&t 7 ($  ׭JA34 ' -wEN5@H ׭ A, ' Pw  N V' L'~ ȋ UW [ <]> &!%p & ) ~  w7ыwd`   ȥaȥ{  % ZU@ V " 5@' 6 Mb  7R ZUX86:N w$E* YMV ` 6 z r vҕ0ҕ0  d0. V%w  V U^5b * |)M.xUr H H=2[]`00$SRSBgЕ[ pЕ]V 7  f H VU~Hʥ[ ʥ<ʕ[Е[ "ʥ] %"ʥ>ʕ] - ,r ] ȕ] wF  5  " ҕ "  j    Dҕ   0 f M   T T`7 &# 5D  Vu  B`ʕ  H¥  w Z B`ʕ !%  wApw<z  =M,3< FTP"FB B`ʕ  p¥ w w Z¥ w *  UE EM  L UE EM@  &Ћ 7܀7杭杨AM |0 -1-  4>@ܷ=ܷ0ܷ* (ܷ%ܷܷ Е AȥZ0ȥ7!!$$''-.09AZf&ȋ &   ȋ ȥN ȥY @B~ 6 TЕ:H]5  ]Е[ Е] eee.5<^Е[BeB~Е]Е Е Е e@ 6 e eL 56R E"U5 W Ee , tR4R6R>J2 tR,   A(RA'RA&RA)RA*RA+R rtz 5<eRz 5<eR z 5<eR ,BL <d S 7  D~t ~ *   ѕR ѕW ѕE ѕD ѕ,tRB~t74  d.zr7..XT035Xe eʋReނ et 2. Bt.2 ,0# F2.&B2. tBwR%i4 7 z  4T  Rf&.mX  eB  LE 5 &et E  b"et     <  ` wfw\w5w  w^ ~wP7 7 7 U4  j w L,@B_.% .$52e(w "ew 57- 7- Uet   "7 5B .:K f; E e\E~7 r7 p $Uh X4www  www E22 U + 5e5 e e̋D&f : 7`  l E Uw2 J =fffN N NhN N NhN NhN NhN NhN N eP% fA U4w  Uw E &. .. .[0,0]RSX11.SYS00$%S S`KTADATADATADATADATADATAM@BCAf } f&  GRR@ 3   &$&~ & e% ~ԥ ~F` F` f&Pe e  @  veT % % % %% % %@ABCD f @  f% % % % ' %&f&f`%  : BBe  *uuuuFE@aaH~6   6  < (  .   "    x  l l&f&D%% %% v  % %%% Z %% %% D   % %%% " eTTTT@A% X@Ae BA 2`u u `u @A `u u `u p B` `ee% ; vu u 5 5 w6%%% %e;u u u  x ueM u u  ueM u  ueM ue eeeeeeeeeeeeuuuu%&D   5  5  n e&f& v f& (PMAt;?t;;f <  PeE  w : TE B A B` 47.pA w0> w E p r B ` p 7A @ae  e?E? & f Y  ;0 Br ` ;Pw "f  x E;  jw`K`/; & D -N  D  `    w w;      7 7 7   W,  7b 7XR ^#  %* 7 7  `  n ^ N pZ;4e6(^;  xH  > HT pZ;4e6(^; 2 ,䇷 b Z7 w e@)w 7  ; ݇B B  @`   B` l  v  m ` r@ f@eE h;&p;mD  8 0 &bZA90$ .@(w f |@t@&"   @&fA EAa @ׇ  f& ͥ`̋  @  % ff&QE eN w `NA`c<2. wՀ,ŀ(@ L @   HU@ (  u G   53 : ̋  00$-S%3SSBg  t  6݇u    5 & 5  5  56   AAaf ΊP   @ P   6 w ̋ xe%&B  @ Хȥ   AA wAf f`E  5 _Х*  BC  5 T   f : azE  + $& .! _0 7 9A  F Z5  ע ע  (TI^SYSTEMOWNERGROUPWORLD #D E[RE,E,E,E](E.E.E,E )DNEDEDEDE=:RREWREERECREDRE =:REW EE@EC@EDE =:REWEEECEDE =:REW EE@EC@EDE '&1 :MX 2M, *M "M M Mp M M MT M M0 M| M M Mx M M( M$ M` M5ew , Bv     5BwR DGSITJpJD-µL D- E %     U EU 5  (5(UW       wE5 E  W ͇5  ,E L.FKJFTJ&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&f &  m  f A N  %&ff  &[q &[qML &r LM[q}&M LME`W:MLL,|,?`W  &[q$W dSYSYCOSYTICLOV00%5S S`KTADATADATADATADATADATA~dZ>~,TTDf @r:F&$y@_MLB`&JB >F0 % 7 7 $     7  l55~ Dm 8w$ Z 4 & * xe dwVL TwD  5?5 ;5@543   5 Aue  j7 wf %r B Dj0%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 write 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 not been turned onEInternal error, command ignored - TI: is a VT marked for deallocation-Will attempt console LUN assignment to %2A%O:”f 4ڢ*   Re-"  :5 ٥ȡʡҥå5@68> " ҥD BBD   ԡ '&1 ⮀ t | t l d, \ T* L* D⮄ << 4P ,⮬ $⮰  N X \ ` ` @ D5ew , Bv     5Bw .=>50  (r- DUt-E D  E E ܁Юƭ>ةή&wBE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff  &[q &[q`ЮЮ ЮЮt ЮЮ L* @< N`\00%=S3SSBg ̯ .,5 ueD!0 h X7 ew5@7EDڢ )5"(ڢeB$& r%NL\# f 7 U@|e~& 5`l5d5U\  u55@ 5 E5n  Ʀe    & RD&& & & & & & Ε & TT.  7گ e7 b*e:7  ?rel7 H5@,XeR=5 N7 /5$5@x 5p#ze7 ^58V ^5J 50> E5 0U7 fO AW,VT  JOq 8OE 5(B y|ev%n7 .CO|7 z 5H5B55 & 5 x 5 5U  5TT07 .(2$.77 :4ew 3%TTMe z%TTMpejTT7 ~ P&~B rFfX5 `5  E4FB 8_-CO1-NL--VT)5 $C 5 .&B FerU`eb%^57 7 7 5:75|:   P-` 7aV JB7 6.&-UU7 &fw 7 7 @,q `-KacJE[ !m@  ) L R  j7j f@  &  5]U E( :&@E A  ̆  E vE c  @  . &f  b T  8  " .$ B  8̥ZḀ90     ȡCOLOGCOTERMNOCOTERMLOGFILENOLOGFILEONOFFNL #'@=j/~LL`$Lzʄ=⡎ L:LĂ:L=LֶĶжƳL:Ā:[.],.]Ā].]. &;0>= @ COT -- Date is 5 Eڢ x wJwJ--v 6 nԯLa7 X5<DR-4H:09ȵ ȥ    .ȵ*Р(ȵ"Р ȵȵРȵРȵ ȵРȵРʯ  !  5``````5@d7,7, eܡ&&&TTT  ~ &̰ $  LHwԯ% CAB @ A& W D4@ @ ` e ʵ        ʵ    5@Eڢ7 00%ES&KS`KTADATADATADATADATADATABڢp  ,U5 5 w  ee  eB7w| & & @( f  e ee e kz?TLBOPzLB I/O Error Code %D.QI/O Error Code %D.SY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VA)!@8aY{ B  &   . % 7    UfUh&&P  @Е ȕ-ȕ  .     .B.Qe~5)E$ %& e eTUU & "e e\^$% 5R  eH n -- nnn  A & & & & f& & & Ν,& )  % U 2. 0B. &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e w 0Z& LB&a    W111 D K  M ?   U%    vM !D  E e@P   & SY&  & SY& h 5 %  ذ @)H&f &  m  f A N  % f|,LzW  &[q$W (SYSYTISYOV00&MS3SSBgd(Rԯ<SYSYTISYOV(zyH&d| f < lơ[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 file %X%N%NPMD -- Bad address %P%N%N SNAP TERMINATED - REQUESTING TASK ABORTED%N%F%25SPOST-MORTEM DUMP%3N%F%25SSNAPSHOT DUMP ID: %D%3NTASK: %2R%37STIME: %Y %2Z%N,2l"&*,0$&L\`tޢ  Y $# w |z RR= h5L 5< 5, 5  50 (   dnE  +D&55@ @ ĝ eA    P@ wˡ RJ!*R=75@ W 6Wl <l p w&l  lp  w`7&E7 7  mΩz1 1   d  Z 6A&5 8JEw&e&B w7  @5$l l Ω$   5l<&l Ee & $Ω  %w F&fp@ t@l  <m:@ 7w&f(B E EtCe @7 E`7eB 7 t $ B&57  77lw |f1>?LBj f& tlE xЕ: @ @'&1 L Dp <x 4 , $x0 x   һ    5ew , Bv     5Bw ĭӯ00&USKS`KTADATADATADATADATADATA԰50  (r- DUt-E D  E E ܁fެ\԰nd&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff  &[q &[q`xff ffԲ fxf  P l RR ) ܫ ~7 65 5@ 5@w tSE* *e 5@z Dr n7j `д 8 @,\3H<Dq$>  A A   / .$Ћ~W ѕXW ѕ  w4 w.7 ,ڵD&5 |=   B C5tCm<lf&e  && :&R~ e>LR~ VN7 fw<h f > 05A<E Wt`R~7 w< e> N L  xwLTmT`R~NH50^:,7 *`f&fܧb B~%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%NPROCESSOR: %A%N%NEVENT FLAG MASK FOR <%D-%D> %P%N%NCURRENT UIC: [%B,%B] DSW: %D.%2N-EXERDNMSGCIPRUNBLKCKRASTDST-CHKREXSEFSIOAFFHLTABOSTPASTPSPNASPNWFRAWFRACP-PMDREMPRVMCRSLVCLIRSTNSDCALROVNETMPCCMDGFLMUTLDDPROPRVDDSPSNCjH e@>eC~e@l" R C ~|ж "   nlA x2A XA LA @A0 4Е Е l (Aeu 8/eeu 8(eu 8!eeu 8ĝ,  v eeu 8e u 8 eӷR6   lÝoÐ xP r  r rCp j @C$ T r!R" &fm緗2eA, Е   ~&f b%2NEXTENDED ARITHMETIC ELEMENT%2N%5SSHIFT COUNT - %P AC - %P MQ - %P%N%2NFLOATING POINT UNIT%2N%5SSTATUS - %P%2N%5SR0 - %P %P %P %P%Nƻi7 e%"5 14 ܧ~V "0 ܧ  &ed E(R E~  & & @( zf  e ee e d^,y``"daR``-w(l3" 9 f&@e Cn,2J R? N`E%E`A&@ C:E2 ^!  C C`e| NN`F BN`5 f 2N`Q &N`Е Е e  ew& p媴//t/&,5(? A$ C 5l<% Ee?zU  %2NTASK STACK%2N%5SADDRESS CONTENTS ASCII RAD50%2N%6S%P %P %2E%3S%R%N%6S%P BAD STACK ADDRESS%N  .N> $  e  7 wҶ e  t%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 %2B %2B %2B%18S!%2E %2E %2E %2E!%N%P %2B %2B %2B %2B%5S!%2E %2E %2E %2E!%N%N*** DUPLICATE THROUGH %P ***%2N58 D < 5N  # 5, 77 w7 e n17l`XTwZETwP  : >  l H lUwR ( -[0,0]RSX11.SYS00'mS(tSSBgM@BCAf } f&  GRR@ 3   &$&~ & e% ~ԥ ~F` F` f&Pe e  @  veT % % % %% % %@ABCD f @  f% % % % ' %&f&f`%  : BBe  *uuuuFE@aaH~6   6  < (  .   "    x  l l&f&D%% %% v  % %%% Z %% %% D   % %%% " eTTTT@A% X@Ae BA 2`u u `u @A `u u `u p B` `ee% ; vu u 5 5 w6%%% %e;u u u  x ueM u u  ueM u  ueM ue eeeeeeeeeeeeuuuu%&D   5  5  n e&f& v ('&1  ڻ  ڻ|5ew r, Bv     5BwR hwxε-Fƻ D- E %     U EU 5  (5(UW       wE5 E  W ͇5  ,E Ȼҵx&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff  &[q &[qڻȻ &r Ȼ[q} ȻڻE`W|2,SW  &[q$W l+00(uSKS`KTADATADATADATADATADATATISYCOSYTICLTIOVl^VTISYCOSYTICLTIOV(_H(2|*6Hjnprv*,.0jDFvz"$&j/ HEL -- Command input error ޡ  ̡() AxY5 U 7Gܡ wr] ޡ7,& 5 UХL U&ȥL#ȥP5dTE BE d w < .XU5@ 6hw Z5V RMH  5@  w U E 0 0 5Jm$ & " `&LU :E 5@ Nw ы ȕ 4 tw T &f) %.YWt7 n?H0 0& , B? 2fr w[0,0]RSX11.SYSw 4(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$00(}StSSBg'&1  |  ,    | T t l  d \  T LDd D < ( 4 H ,V $   L 8 < H @ D $5ew , Bv     5Bw FUV50  (r- DUt-E D  E E ܁޲V&w"E U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&f &ff  &[q &[q` j ~ D22 h#2V22D2     f d @ HH:MM:SS v=  Е: Е: ȕ Ћ 7Դȕ ʴ & +&  Դ)@ʴ)W Е0 w& lE Е:    & .  t¥8¥9M@BCAf } f&  GRR@ 3   &$&~ & e% ~ԥ ~F` F` f&Pe e  @  veT % % % %% % %@ABCD f @  f% % % % ' %&f&f`%  : BBe  *uuuuFE@aaH~ض   6  < (  .   "    x  l l&f&D%% %% v  % %%% Z %% %% D   % %%% " eTTTT@A% X@Ae BA 2`u u `u @A `u u `u p B` `ee% ; vu u 5 5 w6%%% %e;u u u  x ueM u u  ueM u  ueM ue eeeeeeeeeeeeuuuu%&D   5  5  n e & & @( f  e ee e &f& v ?T@e[ C/ <6 B6 5H (?  ~fmTF, d00(SKS`KTADATADATADATADATADATA ,#ASN XXNN:=SY:/LOGINASN =SYS$LOGIN/LOGIN/FINALAccount or name: Password: V BL [XXX,XXX] ] System Logged on Terminal XXXX as XXX123456 HEL -- Privileged user logged in without UAB HEL -- Cannot allocate UAB HEL -- Account file record(s) lockedGood Morning Good Afternoon Good Evening Login user HEL -- WARNING - Unable to execute login commandfile HEL -- Syntax error HEL -- Password cannot be validated HEL -- Invalid account HEL -- Terminal allocated to other user HEL -- Other User Logged On HEL -- Account file open failure HEL -- Logins are disabled HEL -- Message file error -NNNNN HEL -- Timeout on response HEL -- CLI not in system HEL -- Cannot set CLI HEL -- Assign failure HEL -- Spawn failure HEL -- Cannot find physicaL LB: HEL -- Low pool - Nonprivileged logins disabled HEL -- Insufficient Secondary Pool for user logical table HEL -- Warning ** Default device not in system 000000 ||  ޡ  H.vz v  Q|H| Q|H’SY0:LB0:[1,2]LOGIN.TXTNOLOGIN.TXTBATCH.TXTQ@LOGIN.CMD [000,000][]%Y %2Z JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC[001,002]@LB:[1,2]SYSLOGIN.CMDRn<#45h `wAwb5w$7 .7 5@ ,VT 7 7 5^ 5X0   w wޡ b  Խ "ޡ6  0 wH/74/S5@K7 &.mA'B5! 53mlۃ4 */  xޡ' ޡ( wޡL*ۗ,LB6  2ۀlE67 F w7 ަfڸ -w\$)  w   N9w  :9wmF L5<e ѥ,0 wp0 w^ĽPѥ]Ľ7-B 595@w,7<74,76( "   727> w&& ¦e5@V E 58 U@ > U  U HDu www L "e.77 7 D y  "  R~E Е,E &P` S : B90 >T $ ]  (Е Е 0 ۾W W  5@ . P e P Е Е[  Е, ݺ Е]Е  d f     7  V  Ff&Z $wޡ5&j f Е:ĽP~P~咽7X &SY&- -. -F b n  j x5 \rĽ ~5EWE 5E   E H" hd a+%Ll h ^  X %" °ы 7hd. 8T $%¸Д ԇH ֱ00(StSSBgL2w(a$w 4 wwʿww w(wnKwhwwww|xwnjw`\wR&f5< e@@ѥ]wf&& %wĽB~4 t P2  mɝf7 t 2 | bmÝmנ ננ ߃" נʕ 7  \[&  & 2w/W ,,/& wW ; ] //&  ߀!ӕ   h  / 5@E#  &#  P҇ J އ&f)&6& <& +< )& )wЕ Н\НYНVНSЕ:Е Ľ P~Е He ɥ P~ Е?Е?Е ePɥ ?Е ȕPNЕNȕPЋЕ ȕS5ЕNȕSЋЕ ȕT ȕBȕV &z p݂ʕ j VЕ AZ09$'!- . `z  A A A Eȕ0PЇ7 $4  7 7fe  ---7f  j/e˂%7 et ׭%vw( $) R:&'7ע ע/ ע`עz 7ndҔ~X X%w=5e&W ȭ Нȭ Нȭ ННННL  l ȕ & && & & @N R n & ѕ> ȥ  ~~  p$#0ޡ 2 6E. <@ޡ 2ޡ` %   l d! **W - C Е.  7 H͇55wV  498mN V5Z525> %l  ¥/ @ ^&fv v5.u0B5 2"5:FH6D倥D*e l~ vr V 7>Bm\ e0w * $&~ ރdV Btrm˂m /V  ް2 rV d( 2B& 6V Z5 :b%j"X #%i5Bыѝ:ѝ7ɝ4  j ߡ &55e 5N!, >~R~L,2 ʇ "0 \- H(%C4 Z7᭄|tJW S  S S0 ɀ0`e c c cRɋ ы ɋ% SY:HELP[1,2]HEL -- Cannot initialize file storage region correctly HEL -- Unknown HELP qualifier HEL -- Syntax errorֶQ3LBSYjLHLP f` ( x ޡ777L"p&H Pޡa >N -  ޡX` P4!00(SKS`KTADATADATADATADATADATA/H ~` ۶w1 w2? HEL -- Syntax error - mutually exclusive switches HEL -- Illegal switch - not logged in HEL -- Cannot open output file ??? -- HELP file nesting depth exceeded ??? -- HELP file error -NNNNN ??? -- Ambiguous HELP qualifier ??? -- Improper HELP 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 ??? -- Help file is unavailable for   LBtCHx.MAIN.  7 7 76<75»Bjhfb| lw$x 07 bԋ  @w67 27 * X L=7F 7 *E p <9|6q  cwh[X7Q V f4 T `  wC `ȹ . 0wr  P !~    p  цwB P &5 P p߇ ^܇74ق&7 % @<wȥ ȥ ȥ*  "ȥ$ȥ/ ̥/  ( W 7 7     ¥ ¥ ¥/"p$&## R   p2 U H 1ȥ9C ʥ ʥ ҥ@w> 6p *  w:ȕb xeBz 7 518»4-*һX 7 f7 d5!2* J:Fx  w0  w  <z T%'*    wJx (Е.R w& X\^\DBw<6W!» pBpDp\p^wdwb   CBw C 7ʥ ʥ ҥ=#&   v -   7w07aA7WU7RK7> "  4 ( J  n , 8|* Е. ыѝѝɝwы4 t&7 &fw 7 7 @,q `-KacJE[ !m@  ) L R  b7b f@  &  5]U E  :&@E A  ̆  E vE c  @  . &f|  @ 2  8  " .$ :  0̥ZḀ90     w &&E  Aw j   j2*-  Z(@ep@ LD  &e  ` e      R#R-w   . ʥ*&f& v 7 r  7 h ` 8/`    J "$ &ƶL ƶƶ϶Ҷ  a    # & &f`v ۅ<*00(S)SSBg  / d\ pe5 &f9 tۅ  zwۇ HELPLOCGROCLIMCRDCLFILOUT!%)-159ɀjR/^ɁRɂRɃɄRɅRɆɇ:ĞR:ȟR:$ȇ,R%l~ȇʨ_$:[,΀]|)!,??W  &[q$W ` TISYSYSYTICLTILBLBSYX`"n` TISYSYSYTICLTILBLBSY(?PH)X)!|X""_Mޤ"J @ <ڤ""* B D$ : '(0  B~ 0ޢw4Q$wvwty5`ҕҝ 5 Lҕҝ G~wC~0 E5  PwL7 wfTI f&J5`w ffwdA  && |x U%&wwЕȕ5<ȕЕȕ5@& ȕ ЕȕЕȕ NZ5@ 7 N wT F &  BaB~5 555 5@w0@77 @ w v& RL2,0& ΕT Z&& - &- `wT & & & & ڢe -Y v-YJw &w & )5d& & +-"Yw @sXڢeK!sf )&03203277 2  2  7 x7 v ЧDȧ RRa! ȧHRa!PPH  "& +"& 7LB0:[1,6]ERRORS.LOG;0ERRORS.ACCTY@*ةLO(BA(RE(SH(HL(̩SL (ҩLI@(SW(AP(DE (NV@(ZE*UP*NE *CU*HI*Pީ00)SKS`KTADATADATADATADATADATA 'Ī ELI>PSY: @@@AA@DD@@00(hH (*,h.0246SOPRSYMEPECOERALL %R -- %VA.0 b  `Lw*w fV  wV QU~Vȕ 5559{1s kjfY7 \ "\$# dwpֱwhw`&wXwPEVB `w*AB @5 5EU5@ 5@E@zUtpE<5 w   Bє~ B є~X Bє~P`wP. : Q:R~ʕ &: T JB znw <Ew0j`w \-R  ww5V2E$~5:EpE?f5UV5UHΫ-@ 5%2 25 5 .  &x5lwdw ~ީ7 ͋W"  -W"׭" `ީ  >WPWS-* P]077 ~̋ , " j  7` 7P7N7F-%16<%I%M./%M.%16>%T. %I(Offline)=zk z55 50  Ýb ~F. z *5^0"RX! F  Ý $R~zٴ z 7 7 7  Ջԋ  ( R)Fvη k26 ;9z  ~   T5& & &  f& & & Ε p D 5@  (Ċ %VA System %12S%VSCounts last zeroed %3Z%VS%YError Counts%20SCounts last updated %3Z%VS%Y %2A%O: Memory Parity: 00)SSSBg%M%15S Unknown Interrupts: %M %R -- %2A%O: is not in the system. %R -- %2A%O: is not an error logging device or is offline. *** SHOW ERROR command was aborted. This output file was terminated prematurely..DZ\p.CurrentHistoricalUnrecovered I/O Error Recovered I/O Error Spurious Interrupt Hard Timeout Error Soft Timeout Error Block Replacement 57Z55 b $ J "# LJ " $# w  J*Z <* p>  5 <J , w*| / xp777~ԋ  !E*rBR>N: * < 7 (7 1E7  7"e  < E ` b e Pwh z# D "$# w ~5 fp0   v5B nlj-\  PLJH* 8 * :86-(  P* * J` *Е HH-D:2es(E w z ** -Ժ#* Е AaA . V Е ** d 7avvrw jf* *  5v 5VSp  &w 5$& & &  f&& & & Ε p V wtf T &  m55 5 DRDBDD DL$MU(DY*DU.MS:DM<d  h# 2` "$# M "$# Df  *.f0  4fff0  x  `w0 &f& v w  5 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 : jjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ jDlljaCeH###33 & |8 *,ȇw  8jDl@ @TeBT85l@ @( D eB&  & @# 00)S*S`KTADATADATADATADATADATA& V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@(k?$   =f=v'&1 B :Ө 2ӄ *Ӏ "8 <  |   Ӝ   , X  $ L H5ew , Bv     5Bwb @_`|-. D- E %     U EU 5  (5(UW       wE5 E  W ͇5  ,E 2`&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff  &[q &[q &r [q} E`WOl|,ٿW  &[q$W Kf SYSYSYSYCO00*SSSBgfRSYSYSYSYCO(fH*|OlH*,$&.0`r.^ / / 0- l h T33e 5@  "nj@ p@ R 5@R> D <~zu Di b ^ $O L7J  A A 1΢d @lҢ 5XE    EPfff wr& ffGff & X0ڢ 6vڿڿüþ|ͪR΢DAb\\\ŢZ7 L WR & & s& PffG77 @J@B Σlf \rVnJJDZ>V7J0 & & efؤ@ DA$ ܤؤ 1 $  B N@wlw 7&pp6  r0w|&@pa(& pH1A@ ܤܤ00*SS`KTADATADATADATADATADATAfZ &&=M T \ 077ew "w w w :w 47wVAN ffS1  e AN  eD   b e  7 p~   7)   e , $ D  d H f B B , E   ww $& &f wԋ Д  @D T P (f 'P  Е.C ~ De  wf=e  T e w&)_&& & &  & && && Ε@ 61& 1)ȋ& & & & & & & & & Ε  1 &  a@      f bB?& & &> 6& &&6> p5e ` @`  c  "#$ x&& r& h ^ \ R && L& D :W W    褗 f6w    &fؤW ܤ d  l #eq1   er1 @ fN\ N\V\   C Ce  wB@   R"  w w0  f D  Re \  wf 4Re0e:R ! Q@11  : <2 & Te r7&7R feB7 7 7  * ,2   fR&%  e  ff展7 ,7 @  Re~ Հ p ; |@0  J J0 @  , e   2  5>H!1( 1* 1,1.1111&11!&11 , ` zppp2!|! !C U  & RG w׭C1COw 6! Da D` &f   \&  r H& e 77~7zPX L z pff UP7KW)? &    e &(    J"r,e @f& <%6.*eE  `e B  % ~  Q pw &&Ee E ` &Ee E `7 n4\@F7?AG pp@ +Ν5/!  ` p` ! 11  4 ff 0 @ :+BD ))@1 E@1 , E0 6 @ <CE[\? ȇCD$ 100*SSSBgf' ׭s1sQ1Q  B J h ns1sA1AHM   @m? 2@ i  B H De w\NQhBfR+g%  f8df TއہUqQ[!  V VH&&& SPTcD ,l4 P5^5Z A 5N5G5CS >R8U3&55]] # _Εh55 ΕipΕX & ހY4UUt ŝb<.D@<84/ * VRNJ FA< & $& ׭<Y fB w ((( %  0   |  u  m\BDM?C BÝ!׭ w@}EנT Oנ נ?Õ  ` , tåÕ {ļļļļġMN IH 0wjw >d 0 ?CEנ؂Ë         X  0 XB T p ׭@5/,) dp p Rc4ŀ & 2 (p  9`Pw  B` %0w` 4  ׭B  d  |  *7   #   eD    H  P  e  R7& V$6 6" 6#6$6 6"6#6$N6 ֆ%֋  XXXXXX4wwwww   $ 2 !%% %:< P 5 5 B 2 / &D (*,.e0 ~ vp(p*p,p.e0 P~:0 &  V 5 b& MMwBw> H7(7$7 V  3 7 0 #    T  Z  X  t\BDIJK     & d 퇇ǐ  v  w w ̇  ɇ  ,02%  & f w B 󐅐 <&fe0 P~(*,. lw 7, ~K G0 (0 *0 ,0 ,C.005b67 D/Hm> /Zd 귊z(v*r,n.&f Աe0P~  w  &e P U mfb-f4:&eB0 ŀ &&& & ~ ֵŀ 0 f \#Ew|& ,VT @ ,2,wef Ewf   eH0 e %H@77 e@   @zf && 'pECĔaĔ E  aa2  :< 5%% f ) %N 000"    wX\BJefV z `  r (w    ۇ  d ZwP  ͇5 ŀ Հ 5 ŀ݊ ` r% D& ^ x  H& B հ & CB J `4w   V 6K    Awf z   )*    T a F 6+wwwww7=׭7킇00*S+S`KTADATADATADATADATADATAw ^7,"w P w Hw @w 87, 7,7,7,?XAxNؤIqQ$IqQ$ @` 111 @`` LP :/4/Emv`! 111 @imzLB N[001,007]& 7   ,VTe ,J w eBR l# fB C*i# B`X `\XT7           7W)P2PPP7 77އL 03w N(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$ & & @( f  e ee e &f& v KLO2BcԃԞԱHH:MM:SS QMG -- , aborted job = in queue Queue file fullI/O error on queue file, code = Exec directive failure, code = Unexpected exit processor Open job deleted: Error code .Nդ&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff &  m  f A N  %&f  &[q &[qP> &r >b[q}v >PE`W**|xe,4_W xxW  &[q$W 2ɀ)xTITISYSYSYCLOV XZ TITISYSYSYCLOV(7^xwH+ xe| xew `ۄ(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$ & & @( f  e ee e &f& v 00+SSSBgr'2 PIP>PSY  #kz?TLBOPzLB    8ڌ &[q &[q`         &  8  \  & J  x& 8    n   8   l  d  $    &   Get Command Line - I/O ErrorGet Command Line - Bad @ File NameGet Command Line - Max @ File Depth ExceededGet Command Line - Failed to Open @ FileGet Command Line - "@ File" must be only command on line`+ 7SYrn wh& & A&?mJE7D>@7>E 7* ! L R 7 7 7 ~v 7jw7 x]ºrȕ Gȕ o> ]"\ 87 LT  E7 <7 7 7  4A(Er 35E555 @E  r   X %w |5 f@apunhj uhlB$ waw 8 8wn&  *AdBbAet& f Ȗ P aAAf@pnp BC*8֋ |88*ËhAB ArBpuhɥ@&@af& ѥ"N  &  @a00+SS`KTADATADATADATADATADATAur pɥ@x`f Va`& WaWz  ɥ"N  ajou-nhwfɥ;fa)wNנ"å.@j  a bwb@ ^ŀajTI& af* *`V @e,@aw .@ajjlj ɥ@Gaujk,bp .5f f‡ ȕf  Ƃ eSY e,5 funhw@e,aja`W- f`nwuhnw@ Dllja!CeH###33@# & ƽ8 *w @a 8jDl@ HTeBT85l@ ZŇ@( D eB&< <# ŇAn5j)f & 2/      RՀa@ 0 ^0 b l f   ıw ````` x,2 " (^ 8 Phl E w`mE5hU`5 Y\\  z7 r: # . 5 * (w~ &3$ -5058BE%8 %05 9EV7 NE85F 5(  "5Utlww0 >**t+5",w&V  * f'—%y(t!?w\wk#7 fHLDH8F0>, w6 e w   43*. , l** e`E8 Թ ڼ587 @l8E&(B, 5   8 \7 l Ew ޹w5l    wظ0 >* ZàB& h e7 Nf&eB ǃ`űxf ǁf &eV5@  7 % >8  68  .J  &J  ~  w^7PfUR5  U85U&T &P p fw7 5;eH 5 R5f 58Z-h5J 50B   d2w7 =5rl3-/-+5P'!#!ClD@-v-p b$ 5  &ew( U  G5 !70|- l0e! L p    5Z p#V w0 >f 8w 5  X7P7=L 5 eȵRRRJeb 2  EDfVX5     5 5bR  8w5 LE  Z  D >< F*5 6wXeH <   f&  ā  # V v  d f 0 @50 b   pN5 ` 5X  p# )58# & 0  0 F# w7=@78l   !I w ޳55l& ֵ!l   w,*wr5n7,杖=ֵ \ELf&'€55>E# #  bfp  LfZwT7ZeBT! )j*00+SSSBg  0 > 65 5U|r&    к 5l\X !,&P7 ,    bBeAeB  U U w *0 bwl wB@  D<b wJ (,^ZE 76LJ H 7 jf C!C& wF4l J&f |  *w `w plhwj7"0 *)* -&*%* *1*   File ID %P,%P,%O%N%X Read attributes error - Storage used/allocated for Directory %2A%O:%N%Y %2Z excluded%N%N%NTotal of %T./%T. blocks in %D. files%N%NGrand total of %T./%T. blocks in %M. files in %D. directoriesDates from %Y through %YDates before %YDates after %YDay of %Y%N%12A%5A%3S;%9<%Q%3S%9>%X(%P,%P)[%O,%O](%M.)  \r>B>~z rh5~7 :  7 &7 & ؽe7z  HE7Pl  wj F 5` J7P !0 >5>E505 fN 505U    X7 R5 n67 0     5|UtU8U  820,  wR58 9# Fwt wd Е Е  PPP& Nn 5NS Ȗ% BA |  e" \5 `= @Е Е P P   31" " " " " "  "TT T 7 e( Е Е X7RE%0 A507 2 tw585E l  Nw 7 rzP 5& & & & tz& & Ε &P582 lze4 5Azbbebe 5Db550Е Е t X l Ij e5 @A   w`@ 7`mw mxA 5 7!%Q  6wZ V|9 @ 4÷ Xw7 J5F $ :  ~% 7 l $ ڼw ^l$dW r^ `5 w 5l &-  Е  P "w  Rd RdRdr RdRdr 7fff@7\R   D58 7><8  7 "wl  j7*p*)w N&C `t5w5 Ze  5&Е( Е, Е) eff ]    e 5 Е/ fe e @Е CЕ @ L e 5| Е Е  e& Μ& Μ  e &Е[ 5ЕR5ЕW5ЕE5ЕDЕ, ]&% . d % e bfe m \e&Е Е Е  e& & fAЕ &ɋPPЕ-PPPЕ-PPЕ PPЕ:PP& zЕ.00+SS`KTADATADATADATADATADATA Delete file [Y/N/G/Q]? The following files have been deleted: h tE7   ƾw$w w JUl >.5H 2E8w5@0w* Ҽw5  hw5 w$U 4:  5: wJ5 w~ f N   e4w P N P %%( P  N:  $fwfw% U.U2 5awY2y.NxSnpOQhw`q\wTGP gH ķzwE `UZU    e  1E05&f Ɂ95H Ne4E505(Z x=5w dŝť-ť*5 : w&> $ Nf ɱ \ N7 5 V7 X 5@@w5 lN: 5Xw  3U1 UE& f1  >XEvE>  E8UUR &0E,6 f1 f1  ȱ5 &ffąv ڷwз** e wММ RЕ:5@L P  T f   Е. PЕ; LJ : 5  '0fNЕ \U 5 ff&eB Bƃ`űxf ƁT &eV5@  7 @%h\X zY \X>  ҽ $>&  wN5nU8 p&35  5Ulr$\&  R  Ud z w J7PP--(wn5  ļw\5v U85 w,P Dw"E $50 95l w0lNB 5$ 1H1J1L  51N  5 1P@ 5H55@ 1V1X1Z1B1D1F 51  *%&5 l 9l Zw T  w4wB@EP R7 º U  e J7PvrP JEV f~%(N :>  8 B  71eU ^  V& N 4h f F z  D ι w(ͥREͥWEͥEEͥCEեDE 7  UV l v97PRNP %E2 ("e ͵@@& f e5  Dz  jʆ *wR  U йwV7PP %EW d&B#  ȰB w L    Z ! wpwf&eB ǃ`űxf Ɓ &eV5@  7 % xQzSYt:#zSYp L [0,0]. blocks free, . blocks used out of %N%N%2A%O: has Largest contiguous space = . blocks%N. file headers are free, . headers used out of 7 6 fw5w l0$ &N| J <  w !# "A,p p 0 w w CC,%~ `eww00+SSSBg bf ʷ Fl$, &D,@(| <  wL!# `clp p 0 0 46 & #wt7 `w\ PwJ  e\^ wҹ`¦f Ɂ $  r f ɖ%  J  Е.Е Е & & & & && & & Ε {)      & & & & && & & Ε O).0&($   $  r    ^  Е.Е Е & & & & && & & Ε )&    7 x7 v7 t7 r `A   V $ !w ~   e w     w H--7 7  U A7PP ;El eB L W3  q, q,# ׭R  : ܸ n Z % rw@w > U e7PP F_E# xY& & & & v N& & Ε c\X   00 e p 0 -p-f$%`6V RN * ʷ/` T' ~$Z   - -ew  C z7 7 7 wwD 55SYLHF 5 5 2wZ z < ww Ծ5L><% , (, ͇ 55 w7 $0 &eBC $  ( ̲  * 0 7lw~A   1 P N50 E%87"7 57%w7h7 57 X F ݪݩ |sw7k(*"-!--& ̋   ԋ4 5@7&=-w77 77 77 R5:wPIP Version M1600 (ANSI)PIP -- SY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VA%VA%VA%II/O Error Code %D.QI/O Error Code %D.Command syntax errorIllegal switchToo many command switches - ambiguousOnly [*,*] is legal as destination UICIllegal commandIllegal "*" copy to same device and directoryBad use of wild cards/characters in destination file nameExplicit output file name requiredAllocation failure - no contiguous spaceAllocation failure - no space availableAllocation failure on output fileI/O error on input fileI/O error on output fileIllegal use of wild card version or latest versionFailed to create output UFDInput files have conflicting attributesWARNING -- File may contain corrupt data. VBN=%B,%PFile block has Forced Error Bit setOpen failure on input fileOpen failure on output fileClose failure on input fileClose failure on output fileFailed to detach output deviceDevice not mounted or other privilege violationOutput file already exists - not supersededFailed to mark file for deleteFile is lostVersion must be explicit or "*"Error from parseFailed to delete fileFailed to attach terminalIllegal response - try againCannot exclude *.*;*Cannot find directory fileFailed to attach output deviceFailed to get time parametersNot a directory deviceFailed to write attributesFailed to read attributesFile not lockedFailed to enter new file nameFailed to restore original directory entry - file is lostCannot r00+TS`KTADATADATADATADATADATAename from one device to anotherFailed to spool file for printingFailed to open storage bitmap fileFailed to open index fileFailed to find file(s)Cannot find file(s)No such file(s)Failed to remove directory entryDirectory write protectedNot enough buffer space availableFailed to truncate fileCannot truncate this file typeIllegal EOF valuexe?TSY ***2ںRJbB:zڊڒDILIBRFUBTBDESD PU@"RMIDTDDDDFEXUN PR@SP(REENMEAPUP FR@TREONUFCOSBWOGR  OW@SYBS.RWFI4BLHNVSU FO@CDLDNMSR  8<@DHPJLRT 2ԪNABERARPYANULUGUPETCVOCE-%D *  Çl 8   Ç 8  29wD\77   ^lrd  p 5 ;v;  <   8 hı5R&RE%&\  ppH;D; e &   <   <  eB $e eB 58R 58R j eB 4$e ff1 1  $ eB$&e*59 8*0 /Ç59 *| *59 ** 9w 9 "f( @ 7|9wz9! n9 w 0(`9Z9  7 T9 4  & ˥"U{ 6 p Ĕĥ.ĥ;,ĥ*ĥ%  55&Ք R5 5@IU@6 88 858U65@888 -8]8W * % U ]z8Օ*  e250 r T j $  T0 L Z350 I7 7< 772 B 2 & n7 %%%}7 %%%Ee A T2    5@Е.A  $2    @a ;@ @*  %    B 6v(< 1*, ) '5"z 4 4 tt < &EUff $ 58* 5* &$& Ά5w 0f Vw%&E% 54-54- 1111 @e"%   f   C  Е[ / / /  Е]5 333*50 5  % /&e V%e" S %%Ue" K %%U w Cʥ<ʕ[fҥ>] ҥ[ ʥ* ],  ]   ͥ*D 5 ( -& \.  є h2&7 \37 Z37 X3f  %1  11 1 1 11222w P R5&e5 HJL   5 &1 51N 6 5  5*+5U5 5   BBCU% B  Tv $5 %r1j1b1 7 ,2   2UfUh&&, b ,Е ȕ-ȕ      * BQe15)E$ %& e ep1UU  & "e<1 e\^$% 5R &, , "eH 00+ T-TSBg> -- >> 0 A 0& & & & f& & & ΝD> 0)  % U 2 BeD eP Е; B  8&   L %..w J0& LB&a    W111 D K R0 M ?  ,0 U%   0 vM !D  E e@P   /& SY&  /& SY& / 5 %   |/)1 &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e '&1 2 2 , 2 X 2 X 2 ( 2 $ 2 4 x2 p2 h2  `2 T X2 P2 H2 @2 \ 82 02  (2 8 2 < 2 d 2 | 2 V 2 1 1 $ 1 L 1 H 1& l 1 x 1  1 h 1 L 1 0 1\  1 1 P 1 d 1n Z 1n Z x1 p1 h1 v `1  X1 p P1 J H1  @1 T 81  01 \ (1 4 1  1 4 1 l 1 t 1 8 0  0  0 0 0 v5ew D, Bv     5Bwn 50  (r- DUt-E D  E E ܁&w8E U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&f 5%& w &Ba +- ʥ# . U 0   b   `     &ff &  m  f A N  %|kQ,22RW W  &[q$W P 7TITISYSYTICLWKOVSҳP*fj" ҳSҳf& 00-TS`KTADATADATADATADATADATAjjV` P 7p  MAC>  p  MAC>   J*^b-Z ^~-r<7 B>Wednesday dd-mmm-yy hh:mmJ ij Jnx &[q &[q`\JJ JnJ6 J\JJ ` `(l(``p'` ---00-TTSBg-t0-t"3-88kQSYMAC -- Errors detected: kQ gOqzw"" @PAMLENDS XR V Z ^ b f j n r v z ~         NSY^SYLI`NLSP@mCRENDS         " & * . 2 6 : > B F J N R V Z ^ b f j n r v z ~         ? '''''@'' '''' =% R G @X n@f j \.w4ffwb w@ 0 BtwkQ5"S .qfi .g%NL\`W N &"5@] 5UU@e 5# /7\7^&7 H&&0## l.  0 $0 &q.  # 8 B feB&< f0 e  v# LHA<RF# 8-8# * wkQ f=1 5 0 D` n P.wb 7 HXt 7"&d(w)eHqqaaa# ABCw0W!7 & "0.wZ *0 @ 5w( beB   b d `."./ wD 7 n0f0h C. w戇4f N 7< "& ؁ z7  X7 "&1 , 7 2  T@ eB 1   J] %7 J5!6eH 72eH R 0 PN" . <72 Fj  & .   & @ & 0  '  ' e |(' ʆ x0' z El A H' A :(' 6D' |Jd'- '- -u' L ' @   BfEhBa @ B 0 ҕ ҕ A  B?t"eBNĔ`fe5@@Pʝ \" T %7 670e 5@  wd  A    7 0 & gw:ѕ a EU 5: H >7 0 ʒ7 h ,5@EU  7$ U|b w:  ^ J d5B7: (|5 |' 7 .7 p7  2  $3 b  ęe 5 Ӥd  H  ~ wt 7~||ln\\-lPFd ~ f5 ' gɥa ҕ m %e  e e t j ~ҕ h ~ҕ e ҕ ҕ(X 74~ L ҕ,) ef` Z X  ~ 44 Lb wD  @& 00-TS`KTADATADATADATADATADATA `e# 3mf Ce&&&& w  ޗ#- Cew  pwzmlwt& hw f  J  & T!J; $  w( J (7.@e'  pD m7bTTTTf TTTT  e @  ew     awwTw | @n 7x<t8 & $( Yr,ނ ~      b7535@ n  5  5  F 2x 2  F J# jҕ ` ̊ҋ5@ы& R &mR  e ƀe&b@ ( @ !f \  e ee e w bwvb       HD7 D7 >7 >  W,@ 7 ~7 .} # j    0  V 7  : 7 &wSY0:MACTMP*** Assembler statisticsWork file reads: Work file writes: Size of work file: Words ( Pages)Size of core pool: Operating system: RSX-11M/PLUS (Under VAX/VMS) (Under RSTS/E) (Under P/OS) Elapsed time: RORWDIGBLLCLRELABSOVRCONSAVSymbol table****** R( JP1 B41 :^1 21 *d1 ""-w @5 funhj uhdB$ 0jwaw< 8 v8w &  J*AdBbAep& f   P aAAf@pnp 4C*8֋ ޔ88*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ jŀajTI& af* n*`V @e,w djjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ ,DlljaCeH###33 & ^8 *))w & 8jDl@ TeBT85l@ @( D ReB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@!((kQSY kQ W! 4*jD(    D(  w UeBUUUUU݇ "S` 0V*beB v( “*ȕf j 8D(eB$&< l# h w.BUZ W!<& ~  @B! xJ w! -- .INCLUDE directive file error! -- .LIBRARY directive file error00-TTSBg T n !: +D ,M .D 8 KL KE NL W &XU HX; [; : ֯֯zdzxd ձ gskQxLB[1,1] qD~~~)@2)#P)-f)(IrW(,xKKM~Q3fJOq` %K[MQQR Rwyz[-7  7 7 D -%?S0 t! %= ̞ : C  U\ b C 7 X f7w&`X7 4Y  S "  %\x 4 %%=, 'ŝ   @X  L 0 %,  J *U ڝ    ޝ  7  vÝyv    f x .5U Z 7 f nV 8 2" W ϊ we/uf ԕ$ z7 7# tf e0T7   2 }  U8  -J֯L     @ 8 z 6  " ZW!'  X R ( Bf' 7 .  $**  7` ^ 7   Rwp h |  -@-< T.*\ Nb ,RRRRR 7 4  tA w  7   eBb B  X # T  H  W!$ ~W!=W!: lW!: bׯ:.  > l vU@ &  H 7 7   b <   z57 *!  C 7w Nf U, Ԍ& 7w & f  >  0    V * $ 7   4 f `     e 4dU0 <w V  L ww|Cb d!hL  P n  7 R dJC 0 R$"  䗇%A  w m u 6XT 5 H7 B7 @< 7ww&   h $ ,ҝvt7 P b ^ĝ T mFU 2 L 7 (-" U  r Җ Ŕ U` ( 5 `\ 7 R ޒ \U@&U  %RR v %, > (56w7 ^@ ֗ ֖ ȗU߻ ]w ^ P <bw6-r :U>߇7F~ nҕ  J W U ҋ zҕ  0 ހ b RZ L ]5@*OL 6F# - ܑ  ޑ  8- ,  eBfff    e0J U"U ފ  芇CUއ T  r00-TS`KTADATADATADATADATADATA < L 4 C!w   U "E  ^ v5@P˵ ŀ Հ @U -UnN57 $f 5EP W!:U@ ~5 HEU P<5-0ʭ)  5 UU5U  N ܾ]S !W!:W!=\ V(5  Ɛ> ߺJJ wF W!$ W!: z 5   | l  lJb }w  5U BJ 6& W!=@ &W!: Ufff ^& `}5@UR& h# 5 5UU5@5 @5EPE?UW" 5 t b˵`W7RۇU*ۇf r55 U5 &  7^ }ڷwEw & f AfE D(w Ί 7Ph }-Z  L 0<E%P%E% 5E%pE%E%% A A 5Uڇ 5UE  ڀ   UE r{&   { {     0U Z@ { z X&  ƌVH U2UW#ŀ&5%   UcW!(3Հ U ] fŀ Ҋ W!+Հ  W!+ U>5U8 PU0- ҋ W!(5( 5UU7 5UZE > lzŀL PU0 $ Rz U r W!)wdU؇ y y- ,,˵ ˵@KQ˵ JыE y y-˵-7˵@1Q#ыʋ *ы   e f&  $77 7 f׀ m  ыJ > ԋ  } Հ   ~  @y` r7 &7 $ $y Ή! ` B  P<06@. P& փUև  Н7؇ t7 Z7  Sb >rnD  ( 4UD < H5ӝ1   0  *ӕ ӝhl   ^#d6 68 bl w57 wte UՇ  (7 7  5ٞ vy  w ww H b) \ J  B  0P0@ٗ0 "`x PlUՇ ` U ԇ &,@@8K@BaTq rtvY.MAIN.Table of contents  x- p/ h/ & & @( f  e ee e i:S@AY P@`  s@@ z@s:  D zQD n.\! 0 @@ @P   eot J r@ r @ OX %@ y~T@p~@rw wss@ @t;:Y;wwwwLyz j@xS @  s:  @ @r @r OX % @w J D  @@ @v vovK M@42} wK@R@8@ @R@@Rv@R}pT@8 pTpTv[q`"\qYz d};1;B;&\Ef\XHi}ƣ֯֯֯x^֯֯ׯ}گrޯp!P$^?`ƾl!nn6n!6n%Fn+6n,6n.6nK6nK6n N6n&X6nHX6n[6n}Nn}>n6q%VvQzdzxdң鰼Ry6 & , %! |أ1q34|@ he~|$|(d|W*|Xj|d:|hez|D0M/|D9Mo|DM?|DM|D`Y+|DiYk|DZ-|D Zm|De;|De{|D0f,|D9fl|~d=|~he}|[M |[M(`|P|P|P|P@|P|P|P|P@|,P0|,P1|,P2|,P@3|,P4|,P5|,P6|,P@7||Q%||Q(e|S|S(X|Sp|SqY|Sx}|S}Z|Td<|The||9wW"|9wXb|x!|x(a|AyW#|AyXc| zW)| zXi| zd9| zhey|bRR (RR &W    7 p& & ikQ & 4 w= (% &?fW @W >5W E5 W ! W 8W >W EW W W W Ō  $|,e f** a@B Z¥*W W c@ % 2&  m  f A N  %D2D2?-A-   -- 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 file -- Insufficient dynamic memory -- I/O error on work file -- 64K storage limit exceeded?Uj2 e`7 f &7 ` ;?0 @`@`a e eD ƌ  1 1 1 7`w/ws<  U5e7 Rz7 nweE& & Y-&- bT/// wZ.1BНННP B ( Bҋ B hfLw.@  0  2q (b %Ժ 8rwkzwq % ڌڎԷ w % "// |xtwvw pmB 7 f& 0 TD\ @   (8 r |7%7%炷 " f 6 Ž& 0 }# X %  H L 4ժ.Շ * ^/:/wVu " 5 @ < 7 0 (    b ԇ ҅ -U-L t  ҷ xt--! W -A"%+%- J5  \ 0bab b b m %.w ށ%E   x7`@@T@T@Th 1"3  e~ x t   5  > 8 4 e(#U b(J  5 d  U-r -  U Pm7 \7 4Vр7\ w|" 0 B $  4 $ la      b b b wr %+%-  0W! W  UЇ w 00-TS`KTADATADATADATADATADATA5 8 L *La L ~r  ^ 7 ^Zw 0     & >*E/N//#/+/5/>/:Yw/M 4y/w:v& ffff Z, Mm e< e< eA ҕ:A ҕ:A ҕ.A  f=0 @4HD E& c `5%E m- A- ~uҕ &  @ҕ- ceR/RRRҕ- " > ҕ &  ҕ:  W ҕ0w̄MondayTuesdayWednesdayThursdayFridaySaturdaySundayJanFebMarAprMayJunJulAugSepOctNovDecUnknown hhT^f>^^v+٩-2*N/ &*!̨+ȫ-Ϋ"Ы'%<^C.D2O6BLFTRxd@yuuuuXu0u !"#$%&'  @ @%+2@8>DK@QW]d@jpv}@@@@΀@(Px@h0X Hp8`(Px   @@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@LI<NL<CR: EN(R DS(z n  w` .  J B ^ w` w w EU w w(C w*C wd w.b_Ul^ w> %bbgfhf6  RRRRRRRRR⋇ @gg &   \`$ b! z˵&ԝeԝb >7 d d ( d e$ ] b  v  "  q] _% J]  Č Lb5a(K]K_  p.],]+]+_w- ] _  j D] a@aLd \ aw 2d5a\ 0ҝ\@dċ(杬\ ĝ\ĵ ҕĵ@ ^ċҝ}\ĵ ҝp\ҝm\Ίހ 7 T\   , ҝP\ҝM\ѝH\ ѝA\w4a wa@\<\<^bҔҔҔҔ#^ a%fc Xc -`50` `>c .c`*c`e`&m`c  `e`5` :JUp[~``]9a \[-΋25 B[% _"$5_^[.[5_ [ b5~_E[DMn_=h_Z  ZZ [ 7 Na n2aV?Zj %j ~H H5_  < qʕ qҕ T5@^  pҕ X5^5^  ҕ  ` .Z "j ?Z ` 5x^  F z"Z7 Z7ZY!Ec ^ʼы7 YR@ B ( $ 7Y7 Y`  5 ʕ'5@ʕG5ʕC  *  `   pY   \Y 7 VY7 VY U4YFY  00-TTSBgw H& L c7 FV (eeelWhW `W > : 4 b   D `!_wf   Z5%~Z6 wb F X 4W 7`WW7 W W7 WdU`U 0W  C   7PpU[Vw(YY7\  x\  \V#Y ZV w Y-bWY W@ UT Tb VV7 V \ \U@T V\@7V D =*D` W! W! W!  0V VR E@J 5@5X JU 4TY:Y5|X7Y:T ^ 2Vwl*T 4 emfX VŋW! h-DXDXw!S& @e & w*X7XUS ^wT!U@S ŋŵ`  e  @J5W Z7Z RS4S@/SHS*S4S$S@S*SS fAʕ R fA eʕ Jҋ YYYY dĝX7 X ]+ T(P]TfW Tۼ bT  Tҕ-T    $ BR ?  J  bY  VY 7 QQQT  S S  @ :wS 7"Q (7S&7Q7Q Sdee & ^ P[WN[^ WW#5BQ >Q5~U 7 |W*Q- QB Q[^W[\ ZWZW E`m8W 6WaE`'-P-P  WB & WV V^PV PV7V `wV$7xP7vPV V  V pbw% BP-V  MMC0   & N`U  U` ewJM   $ UM @J  M5 MUL-ML F>J ,UL  L7 LLLELL  L J L @J ŋ L ߨLJ $ LL   <* * '.w<    p  .w wUU& )O5&P3 DN0P-&PЭR  7O`KKMMK杖K~P F7|O     LdK 2K  ].K@ BJB4@CDՕ  Օ   e  wfZO     C!W!^ 8J! r dQ VC D \ LQC!D! 8Q UUIKbP: 7KK x H 7I 7Kf   eE  w fdS&e\Sw T FE >S A B` 0S7*SpA \wR @BS! B  @` R B`7 RmReRRw E R R B ` p R7RRA7R @ae R zR bR  \RN 0 B>R ` N R7RG G G &Q &Q&QG p> 4e6(B  \ xH Q QJG Hp> 4e6(B   2.Q 䇷 LQ DQ7 QwQ Qe0)wP 7 P  w f T`  !& fY w`VPK`5W  N  & D -N  PP 00-T/U`KTADATADATADATADATADATA `   lbRR "  Hr,UFR wf&&7 PL #-%M! e  CRDSƣENLI6NḶMACRO V05.04 ABDEILMNOPQRTUZ Page  '&1 *Vn "V\$ V\0 V\ V\ Vn( Un$ Un, Un U\8 U\ UN U Un U\H U U\| U Ud Unp Unt U zU rU jUn` bU\X ZUn RU\L JU\< BU@) :U( 2UH *U "U( U U U U T T T T T\ T Tb! T6! T! Tz! TH$ T*$ T" Tf# T# T2$ zT<" rT:" jTz$ bT& ZT% RT*' JT( BT+ :TN+ 2T+ *T, "T+ T , T, T+ TP- S, S S S\ S1 S0 S/ S/ SP1 S41 Sd/ S/ S~1 S"p.5ew , Bv     5Bwn 50  (r- DUt-E D  E E ܁&wxE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&f &ff |x',>>W  &[q$W  cTITISYSYSYSYSYSYOV0b#$ 00XXX --FLX Version @ Dtj Z &  pp pp&-(1-  w  72  ʋ  @ @   :wnw<4\dLTFLX -- Device size exceeds 65K blocks&f& v w "(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA b"EAa$ & & @( :"f  e ee e ؙJ'j XXX>P00/UTSBgx'@8SYx']SY NTIIDDEDILIZEUINUSP FC@FAFBIMCOBLBSVE RS@DORTDRW6 DDD D DD  6  : ....)00/UU`KTADATADATADATADATADATAJan-Feb-Mar-Apr-May-Jun-Jul-Aug-Sep-Oct-Nov-Dec- ^Ky_"S"xz#a'&1 & & |&, t&, l& d&L \&` T& L& D&X <&$ 4& ,&L $&8 &< &H &P &4 & & &T & p'V3 p'$3 p':3 &\ & & & '4 (9 (: (= &| |(b> t$(9 l$(: d6(9 \6(h: T6(t: L&t DH(9 <H(< 4Z(9 ,l(9 $~(9 (9 V)< h): h)2; z)9 )95ew , Bv     5Bw #$50  (r- DUt-E D  E E ܁ %$$%&wBE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&f &ff &  m  f A N  % &[q &[q`&00/UTSBg%% %&%) %&%) )>&P&,&)p,&>&,&L-b&:'P&L-P&t&P&L-&P&&P&L0t&&P&L0t&&P&L0t&&P&L-`P&&P&L-lP&&P&!L-P&&P&#L-P&'P&&L-P&'P&(L-P&('P&)L-P&b&P&* 2 L'(:'+3t:'^':'-3:'p':'/3:'':'33':'':'56'':'66h'':'76'':'83:'':':3H:'':'=3l:'L':'?9()(?9($((B9(6((C9(H((E9(Z((G9l(l((H9,(~((K9x(((M9((z)(N`:((((O<;(((P<;(((Q`:P((2)(R:(((S:)(((Th<`( )(Uh<()(V`:`D)(h)(W;2)V)(Y;2)D)(Z`:(((\9l()(]9\(((`>,&)%%OPzLB  ,w b& LB&a  )  W111 D K M ?  v *U%   Z vM !D  E e*@P   & SY&  & SY& 5 *%  ) ).N-.c-.r-.-.-.-.-.-.-. ....5..L..y............ /./ .>/".t/(.>/$.R/&.R/".R/ .R/$.\/$./*./,./,.]-..N-6.-2.N-8.-2.-..-..-0..4.4...j.4..4..6..2..<. /<. /:.$/>. />.  yP-`-b- ."/"/$/$/$/ D? 7 D  DR ۀe7  D fԃsKEE$s I! D%  2..v *  BD @ D $A  $.*.   BD  8 D V 0p `χB`   B$> VӿD V0p  B` D%AJ%>%D$4ڇ 5  5 B  @ ҡ5  P 5.-    D-   rV  p P-n b-` 50L١-p ~&0 v&L0 n&r0 f'^4 ^'6 V'6 N'(7   ~7 w^-  X77 ,؇ V^- f n b7 ؂7 ׂ. '3 '5 ~(;00/UU`KTADATADATADATADATADATA r6 %7V & - 8  D v& . Z  b    C & .rVD Bppw7 7 VD 7 7 D  830f# B $&eB DD 4 > ( *-w |p'23 * -<`   t-w @5 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f  h P aAAf@pnp FC*8֋ (88*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ tŀajTI& af* n*`V @e,w djjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ 6DlljaCeH###33 & 08 */.w & 8jDl@ TeBT85l@ @( D eB& V & @# >& V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@`X 50 $& d* D' <ѝ!ѝa(  *wuыwn" RRR   r`$&  5w T :ڇ-|-t-l<0 $p&55 $  n  < Z eE  < ѝ)ѝ"a( 6w  7   w`A T-250 - 55  2 *50 ١-  w5  $w.& wE  < % 1   7 A -h 5I50 zء ^'3 ^'x5 ^'3 ^'F4 '3 '300/UTSBg1  e1n&he     B| Lԡ1 T - B ` .   B e1&e   fF  BB1  .R  BD $HJ, &. x C  B17 ^06  HZBY:9  HZ&u B1 *,1 8B1R$$R$"R$ R$Rf r,  9 #-0 B  Ҿ .  B 퇱16&0e T Hw1&e 6 *w 1&e  wf  w$&1 1C1" Z:1 N  D0 0w`1X  &1)" 13 1 $11 НJНGНDӇ >1" FLX -- End of volume on cassette8 Mount new cassette? (Y, Z (output only), or CR) XXX> FLX -- File not found FLX -- File already exists FLX -- Bad responseCommand syntax errorInvalid switchIncorrect # IN/OUT specsInvalid deviceUndiagnosable requestI/O error on command inputCan't open @ file@ file syntax error@ file nesting exceededBad list file specUnable to open list fileI/O error on list fileRequest terminated -- last block not writtenOutput file spec not allowed* in output UIC not allowed* in version number not allowedOutput device fullDT: UFD fullDevice handler missingIllegal density valueI/O error deleting linked fileUnable to open fileI/O errorUnable to allocate fileInvalid RSX file specI/O error initializing directoryI/O error on FLX temporary fileFile not foundWARNING -- Input file out of sequenceIllegal /BS size -- use 0~ s<@7ѕ `6" - c6 b@ei6 dӷ x6 y6 4@e  R@e*o6 2- t6  -n   NB<p D~-  @8 B<z6Ք ф Ք U 0p D~ <0   0p %X%X-%O%D.%A<%O>%D. C Directory (< 1*, ) '5"z 4 4 tt < &EU  <*8  $ffU !f1 1    ,D <*   5* &$& 5R pf JN%N 54-54- 1111 e" :f 0 C 65 333*50 5  % &e Je" S%Ue" tK%U w Cҥ[  ,  ]   ͥ*D H5  ̡& p 5%& w l&Ba +- ʥ# . U 0   b   `     3044643 . w , Ў xpЎ : \b%N-%-%--JDnCEDE 9!9 7 jҋ |3   *ѷ$ѱ7 χťť  $<$ ť*+ĝ Dĥ ĕ ĕ ĥ  $*+@`֥ ĥĥ<ĥ ĝ$ĥĝ$eB  <  fĝR$8kz?TLBI/O Error Code %D.QI/O Error Code %D.SY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VA%VA%VA%I 66 66A696c6[6 B 4 &5 5  %̇ 57 6   &5UfUh5&& 5 Е ȕ-ȕ  >5  L 5  >5B>55Qe5)E$ %& e ezUU5 & 5"eF e\^$% 5R  5eH ~5 -- n~5~5 5*5 A6 $& & & & f*& & & Ν,& )  % U55 2>5~6 B>56eD e5P Е;  &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e b&L- 'L- 'L- >&, 6(900/UTSBg} 303f333333? - 6-DըD"77}7 t-pf" h`D -D  6 7 67 :   . .x5 "!, , 5, 55,f   Wz}44445555558w^e% 2JFml 5 ",5,  ("    e% H m<  3МВӚ DUӷ-l S   \ӷ `X -<  0 ; (&<- 5  "   - d6  ҡ "&L- '6 '6 '6 '6 '<7 '(7 '^7    C   :˃ .%  2 2 2 2 W  V.@.4% ʋ C*  ʩ & TU J Ue 8U6 + f f -5 F e lJUe ՝՝      e U ՜ ՜  W# e     w- +    C-h   &˂.t˃   -& e (5@  3 3 3 33 f&fE 0eFL 5d A#A&&e# # #    e xe j b33 33 w  ^  z >.}667  C  .fD&p  p  -$<225  ",, 5, " %* SY2 CD  ŔE @a 2%" <\^ &wl& & & & & & & & & Ε&P f&7 %CT  " Է5B D * 5$  * 5@ w5w5@sn6  "EB"e DZ DUEsp% 1, B A7H7D% $%DT@@%DK5&@ " 5J 5\5J 7 "  f  ̀e 5#MM#MT#MS#MF#MU%CT e & & &  %& & & Ε ) 7 7 5 y555555555   &7|5 5L  D 8VD  0p ,-Ŕ`    ? .C BM M M M M PPDL(LPMiMXYYSSUZ &0N7  `+ 7   | 111 $)"  H-V - &(5#/7m55 57memv75 t,t,5t,  6   Է  f eԷ ́Nt.  .f-.: 0ԇ *fmw `aw N Ba5l  BC D5afw RA!wӇaI3 W2wl00/UU`KTADATADATADATADATADATA em ݇ < 5Ք ф Ք 0p ( n<0    Directory < 0p R 7 b5ѕ 5-7mӷ   . P t R  2B<p ~-FV6 e < Unused >v6 # VЕ.d 6 % b %e ee e P (@f e:  >75<"fE  ex% Е Е-PPPPeH  Е  H&0 @~(; 8~(; D *-7  B %D  D > VD J-P- @ wF·  l tFՄ% N=zv \nRD$d7 \7Z R՟-J87 B <- 0!VPD D JaE%"% W W7 -  -vV  7 ԩ-  7 7 V& j d- W 2 -w͎ 5 8MD -D J d BD0` lDԃ R$ ( - " B: 7  B    m B - %%  E& ` -l ~ 7nv@ hd7 b%JhD `JXT- % $(7"7   &L- &-   D ?XЗ#|Pз&fF ZFF%ЁzD =wRF X&m%5 lJw2H  ]U͇  V & & & & & & & & & Ε 7 7 7 D 80 b @0h0f Jtf+R- h`"j- Jn- :r- *4 ff-     7 7 v7 7 7 7 @ȕ> }@ 7 j7 ̷B> l7 7 7 7 @ȕ> fP̷ 4 @ @ D B57 :5@9P45>%  %j%@P55B5V-  -  V- Z- w5 N- E  55@ 5wp w` ׁ7"˔5$555U@ 5  D 8U@U@˷Be ʨ5tʚʖ7 7 @0h0f 7 |pChC< @7rW  5 <54V-5  H5< z EDw7ˡ-2-*^-"V   6Hwx &L- p'V3 '3 ^'x5 t&L- :'25 5E E    Z-wHb-w@5 5xE lE   \Z-wb-w Lp'P300/UTSBg&U5b H5 5  "5  "5:  7 07 @ G  q  7 & SY " wP }: }:::::::::w   pw wh:;;::N;::w^  :D V  0LJD  ") &d   F; ΃    -   Ƃ  w - 5D  v7 --)Bm @~ & fe8? \ $eP  d zmL  ww <5  89f"e\e!e 5f 2* eA  7   , r eBjB X`N V ˇ vL'<4 n:'2 f'5 ^&L0 V'^4 Np'V3 FL'3 >'4 6'$4 .'"5 &'4 '3<AeUZ 7lx9^-ȇ9:;99t @e  $; <$& B ~$& ~#D  f⪇ z ; `7> t7 47 V7 7 7 7 z"; SY jp'P3@0h0f 7 ^ Zw2 WVw^-w. 7 t@ȕ> LDeP  Fĵ7 : < "ʇ dž7 << D7e77 7 . $  D-7Be7tf7Xe7 7 XHJFe /78m^ 5 1"1,51, 111 (d     .I% eͷ ͺ 8e (7m  - w<`HUp 7b? ڇFD  %(\ <:8@ hmN͉@  hw a .e@ X PH . VpD  eD $eTB pD  F- w - 7  7 w r  BD J ߇D N D 7!> 72  BD J @ HmD |  $ > Nm LAw ̫ '3 p'P3 &t. &D. &L0 L'<4 t&L- p'V3 L'3 &0 &0 '500/UU`KTADATADATADATADATADATA p5J  * 4X 7 N7 F7 7 @7 7 * W  . @ȕ> 6D7 eP  2ĵ7 &5   D7 H7 >  2 |-x - t ~]px]-`Z75T % hU%  S5' 55KU  55AUE   57wF͡V    ˋ UU---- h7z- DD h e&P  &L0 '23 &,/ |'4 tp'V3 l&|0 d:'2 \'5 >  : 5> v h  J  6 (ȇ 6  2 jȇ p(`: h(: `(: X(: PD); HD); @V); 8h)`:55 ŝĝw7$Q$$P 77777ȰΡ5nx:͘7 x:;~";;:;;;;2;*;;:::: ^-w &. ~(< v(< n(<; f(<; ^(<;D7Le7B>7 <7  $ DB  @d m  C$$ " eW %D eͷ  ͷ ~D͡--7 Z-NT1 NVDB d $ De"- A+ͷ," , -Dd   2e ̷ V- 5rH W  5 rwv w- '<7 '6 '(7 L'3L͈7 j7 h ^N nwZw h@R@# 7`8 :  *,=Cw"- f  W D%̱Ew C $ Aw|d   ̇ ̷ " &  LEW"El  5El n շ RF PPW D: eN̷R̷ .  շ ̷ ̃w '$4 &0 '"5 '4 '5 :wη·f&f "wη7 ΃B &L- &t- C   ꆇ-w d ŝ-5( ;;\;;  &      &憇 w +*  ' ## !  Ea C    ҆-w x:9ŀ -. %    6ŀ n  H  -wF   f5 ( ̇ p'P3 '3 ('-00/UTSBg & -:΃mm΃ŝ-\5M}750@ B GQ  0 e B a  0  7 ̱ P7wj7 `7pXF̷ @- .̫N1P - ̷ *etp le 7  & *7 -6  7+ L'<4 L'3 T&    B-   F%w7A7 w̄   -~̎ -˷cx wle  @ : 87 , Rp'V3% -wη ΡF7=8@ B GQ (  0 e B a  0  7 α P7wr7 h7x`Nη H-$ 6ΫV1P - η 2e|x te 7  & *7 ->  73 L'<4 L'3 J5JVhwP^-w \7 7 D 7 z5-2 (7^wX́  j 5(l    7 *5Uw<%e 7 ̇ &7d ?%m-, & ? e7 F7ne  0T  B  7!:A ?l&f 70    ww*7` w|P  &̡C B   & . 2eD. ('L- '3 L'<4 L'3 '|$mpmn̓mm ͷ ͈F7> X b܆wNDV  eT 7 PH@m>""7"?eKW  .       @m ?   ?   v@d m  bC$$ "(eW   :X^ V jR ̷ 6 Ḟ- *'4 "'4 '3 &0 &L0 L'3 &0 &0    f @  .ކ--LJ&7 0  T  B &$ #D  4·-R< >5@0 B ~$& @# z2 < ~777  5L 8 0- 8-  &  b  - F j F%00/V1.V`KTADATADATADATADATADATAw(7A7 ẅ́   @-̎ -"̷c w e  @ 87 < p'V3 ('~-`@0h0f 7 X W7 Zχ - ^-w. @ȕ> JD*eaW  Fĵ7 :7 < Ӈ5l7 R7<2η. Q: 7 *  Q rfN N Xǁ t  ̀ X͍7 0,. '3 p'P3 '4 xp'V3 p&h/ h'3a7 n7 7 67 47 O$ &< N5 0< 89f"e\e!e 5f 2* eA   e  557  L  -Bs-:o7 :7 >7 ,$= 7 $54- V  R 6  r7 m ( \X=n= ><pp U- g 8 7 ~H  R<(=  <pp \0w^- 8. . D -8     ( W W . wD  -      f. -̴ b D P-   Bㇵ (r̵ <"   -< N=  - B˲w%N Total of %D. blocks in %D. files%N%N %M. Free blocks*.*; '6 ' 4 &L0 '23 '3 &,/ &t. '6 '5 '<7 '^7 '4 '(7 '5 p'V3 L'4 &h/ &|0 z'5|,?4?4W  &[q$W  3TITISYSYSYCLOV ^f0011VTSBg<F   'F DMP>PRR2  2 *2J2#P22 COPzLB   kz?TLBDMP Version M08.01 (ANSI)DMP -- %X(%P,%P)[%O,%O](%M.)I/O Error Code %D.QI/O Error Code %D.?TSYBLh HD| IDMD FI AS`BY@BA LBR5HXLW WDDC LIr RC@SPDS RWHFSB SF  OCLC@SY&SY   2&& & A&?`5Ew~ wvfHH i | $%-Hw B / V 5 *    " 7 7 7 7 7 'wx w\  w~ w w p  Z w &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e &7 7 7  f f  %1  11 1 1 11~w B&C ` 5 5 F e b  5&Е( tЕ, fЕ) eff ]    e 5 Е/ fe e @Е CЕ @ L e 5| Е Е  Q & Μ& Μ  Le &Е[ 5ЕR5ЕW5ЕE5ЕDЕ, ]&% . d % e bfe Y e&Е Е Е  e& & fAЕ &ɋPPЕ-PPPЕ-PPЕ PPЕ:PP& \Е. є w & LB&a    W111 D K M ?   U%    vM !D  E e@P   T& SY&  >& SY& $ 5 %   )B  &_ r    %w 0 5 funhj uhdB$ 0jwaw< 8 v8w &  0*AdBbAep& f   P aAAf@0019V.V`KTADATADATADATADATADATApnp *C*8֋ 88*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ ŀajTI& af* n*`V @e,w T jjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *w   8jDl@ TeBT85l@ 2@( D @eB& b & @# J& V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@'&1  p X    |  | t l, d \$ TL L8 D< <H 4  ,4 $4 | 0V!  T B| Bh# T# @ f# #   + \  , -5ew |, Bv     5Bw\ Fef50  (r- DUt-E D  E E ܁&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff &f  &[q &[q` R  f |  | | 0| B| 8T #Bf#xB<$f<$f<$Df<$fx #BT!|$ #|$$|$ '|$(D),  +-> , .2> 001AVTSBg%X(%P,%P)[%O,%O](%D.) 5xmw 46 l905(   5R 0B 1X R H0a  %K!1wewV5:,\@ .Rw  o01  :.w\5tF U/2 %w(%w$F ˇ40,2 Е Е Е ep .hw  f.7 * 2$wZ  J22 Pe1 p weD eBPw &CD 5 5 | e . 5&Е( Е, Е) eff ]    e 5 Е/ fe e Е 4CЕ @4L beE 5{ F Е Е  2 & Μ0& Μ1 e &Е[25ЕR5ЕW5ЕE5ЕDЕ, ]R%6.  %6e8 bfe6 eRЕ Е Е  neR & fAЕ &ɋPPЕ-PPPЕ-PPЕ PPЕ:PP& Е.  H-TL 7@ 0w  U@ # 555@5]/..5 L& & 5X />EU45.U.2R$&< .w!W f5 w&5@-@ - w  w5 r   w5T  wjd5P%e5@]/. 5+2/wUE@\ B R$&< :^5@ 027 7 !# H     e p 0 v B $&< # % V jUS.(*n.9.ww*/  wv/w*聇***0.wl////// 4 h- & & @( df  e ee e Get Command Line - I/O ErrorGet Command Line - Bad @ File NameGet Command Line - Max @ File Depth ExceededGet Command Line - Failed to Open @ File8  p0 b  f p  Dw `` ` `  ,!" (.!%&  m  f A N  %2H 5~z 6(&]`5@S lU75\  r o0e%'7 ~ |xp1 7 xe` 0  R]  w  w\ l 7  o0 ew 215_1 JT0(  fe57 5~ %2  zelmv5P2 L\/  w .-((w***w.w/ ( 5 -w߷# " -6 -ߎ eEm Ex߷`߂e25e.^w-,&\ l ߇ T# f#001IV.V`KTADATADATADATADATADATA7 d  - އee޷%(Е Е   Re X7 7 5r05j5@b1ps05R 0  5 80  E޷  w6w  t 0 0 @ p  5 E`Eݷ twE5  H B >Е Е E e@Е^5@R` Е%Е P e0PN4&+5/57݀c  & 555  p  r%"  hE܂w- E  0W 7e`w w X \ ` d7wRL  ߆.R zx$ r&% j$ b$%HEADER AREA%N H.IDOF %B%N H.MPOF %B%N H.FNUM,%N H.FSEQ (%O,%O)%N H.FLEV %O%N H.FOWN [%B,%B]%N H.FPRO [%VA]%N H.UCHA %B = %VA%N H.SCHA %B = %VA%N UC.CON! UC.DLK SC.MDL! SC.BAD <$JeJeRRRJe Jel $e 2D 5ЕR5ЕW5ЕE5ЕDЕ, J `re 2 $@ e $er e 2 $@ e $e : H.UFAT%N F.RTYP %B = %5A%N F.RATT %B = %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%NUNDEFR.FIXR.VARR.SEQ FD.FTN! FD.CR ! FD.BLK <$@e e$% %$2e 2  %2 % 2 %U ` U` Vr$@e e e   $Bee IDENTIFICATION AREA%N I.FNAM,%N I.FTYP,%N I.FVER %3R.%R;%O%N I.RVNO %O%N I.RVDT %2A-%3A-%2A%N I.RVTI %2A:%2A:%2A%N I.CRDT %2A-%3A-%2A%N I.CRTI %2A:%2A:%2A%N I.EXDT %2A-%3A-%2A%N<$ D Da p $ Ze eeeeeeeee e"e$e&e(e+ 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.%NCHECKSUM%N H.CKSM %P%N** INVALID CHECKSUM - SHOULD BE %P%N<$ D DaZ Peeee4 $ e2 22e 2 2   $E e e $  222 2 2 Re $J > @d u J$  B BaEw w 7wPRF  ܆.R w xЕ C4 W!Е! DP Ad EA :<& 2f% *' " %001QVTSBgHEADER 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.WCKUC.RCKUC.WBKUC.NBKSC.MDL@SC.BAD SC.DIRSC.SPL|$PJeJeJeJeR0 $RR R RRRRJe>Je< e 2D@ J `22D8 r 2`>% VeJe;re42% C4 $rre52 & C5 r _% %dۀPBPDPFPH 5ЕR5ЕW5ЕE5ЕDЕ,  H.UFAT%N F.RTYP %B = %5A%N F.RATT %B = %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%NUNDEFR.FIXR.VARR.SEQ FD.FTN! FD.CR ! FD.BLK |$@e e>%C% H%9%2e 2 M%2 U% 2 ]%U ` U` $@e e e  F  %Bee i*w fe$ 5xeB e: \  @ @ C: >`UC (B d `ef   d     ;a @&  W f@ NЕ- ee&PPPЕ- ,Е 50e|$ %< Xf< Nf D@ (Օ: 5Օ: @e e0e0U&f!  E D  E E C B Ί A AUUUU    T T T T ee(e(e(e(T $)T T TU U U U  JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC&f& v IDENTIFICATION AREA%N I.FNAM %20A%N I.RVNO %M%N I.CRDT %VA%N I.RVDT %VA%N I.EXDT %VA%N I.BKDT %VA%N I.ULAB %P %P %P %P %P %P %P %P%N %P %P %P %P %P %P %P %P%N %P %P %P %P %P %P %P %P%N ' D Da e  e 3e K `33e s 3`33 e& s 3`3 3e. vs 3` R'  e6 ' eF ' def ' D     Е  &  m  f A N  %MAP AREA%N H.USE %B = %D.%N RETRIEVAL POINTERS%N TYPE COUNT LBN%N %D %T. %T. %VP%NCHECKSUM%N H.CKSM %P%N** INVALID CHECKSUM - SHOULD BE %P%N|$|Je:2 r:  C:] D DaRݲee:E?A A A R    E)W   E EW   E  Eep  RC $ @ $J 0 @d u J$ @AB & & @( tf  e ee e -SY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VA%VA%VA%I\*T*s*k***** 6 5  5*+5U5 5001YV2`V`KTADATADATADATADATADATA   BBCU% B   vp $5 %JB:V )7    <*UfUh<*&& z<* ^Е ȕ-ȕ  )  w  )B)N*Qe~5)E$ %& e eTUUO* & N*"e e\^$% 5R  Q*eH ) -- )) N*) A* & & & & f& & & Ν )  % |UN*) 2)* nB)*eD eD*P Е; &  m  f A N  %Failure 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 switch Illegal density valueIllegal value on /HD switchFailed to attach device *** EOF *** *** EOT *** *** EOV *** *** WARNING *** *** FATAL ******** This block has bad parity ***** Dump of %2A%O:Dump of %2A%O:%VA%X - File ID %O,%O,%O %N%P %P %P %P %P %P %P %P %P%N%P %N%P %R %R %R %R %R %R %R %R%N%D. %U. %U. %U. %U. %U. %U. %U. %U.Dump of %2A%O:%VA%VA%VA;%O - Rel. Filnum %ODump of %2A%O:%VA%X - Rel. Filnum %O%VA Virtual block %O,%P - Size %D. bytes%N%N%VA Logical block %O,%P - Size %D. bytes%N%N%N Starting block number = %O,%P%VA%N%VA Record number %D%D. - Size %D. bytes%N%N%VA File header%N%NFATAL - Page header line too long|,((vW  &[q$W A*002aVTSBgCLTISYSYSYSYOV8VγZlγ8VγfV&&)SYDPSY..\:v@SY[Page][00000 lines read in]    )wP[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&PAG% BL OFF&T&BL ON P%&N-%&N M1 5@E@-5 $  7E@Ez7 7 967e7n$CҐ#נ נ w*ҕ ʕ 7'7$  w ` $$U@7` E a 5  Q7E@Ez77 v h0 ~wNn7V & 7J^&f6007* $U?67!*&$W p Z L0 77i70 7w&7*O  CCFR 705 5=65 5n&@$sp  7]* AQbB`ҕ ʕ $ e 7 5wf7U7w77 7w@E7l -  7 l57aE T7(7 D7w e7[7 &JwH7 :5 Uw77n X6 P H @ fffw2ыfQ$w eAdw ѕ ѕ ѕ w $ 7 ɥ w1e002iV`V`KTADATADATADATADATADATAf׭ >?wHwD ʝ{B`ҕ ҕ exb ʥ ʥaʥz =7` '&1 D " < $ 4 0 , "d $ F  FD  F F  F F F F F F F F: Fz F F F F F F F F | F t F l X d Xf \ X> T X L X D X0 < X, 4 Xp , X  $ X`  X  X X4  X8 X Xx X j j j j j j j j@ " " |* | "l |  t ! l  d  \  T  L  D  < ' 4 0z% , 0! $ B!  B:"  B"5ew , Bv     5Bw ,kl50  (r- DUt-E D  E E ܁~l&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff  &[q &[q` "V j F 44X44j44|44F4 T|4 |4 |4 |4 |4 `|4 |4!4 ! 0 "! B %!  002qVTSBgXB (ɋ‹7wd‹787Z 7+ \]^w`V&NJI JwVgw2woHm7VF me   >5@"  UwDE@ҕ ȕ E@ wCwmwe w| BUw.wVf7L\7p p-:J , 40  a0Y74|*wwwⷊml  w { w&Uwnww7 7.ȋ ХO ȥN ХF  ХF ɕwpUU UU E 5U w6 z  0x$ 0$ 0z%ww7 7w7Xw d{wJwwZ& Uw Xw7w 7:h0`e\7C F w70E(wZ7"ew7 777 7   7  77Ћ7VZ pbˋҔ| `  0+Vӥ  H`Ӥ` /7&2Ewr ˋҔ 0> 7E ww뷊U7 Uw5 z `7}7w7mVVa f ^w< BD# EDI> EDI -- Insufficient buffer space [Exit] [Creating new file] Input[Syntax error][Secondary file currently selected for input][Secondary file already open]b   w w  737 W  7& 7 7 7 V7 z|t 7777E}O7 7ɥ w< H7TbD  F@UESY7 6#  7s7#  7\N7^J7\7^7V7X7Z777 J7 7 d᷊5 7 5 7~5 f  7`w$. 7 7 ɋ : $70 !  ' 0%&  m  f A N  %002yV`V`KTADATADATADATADATADATA[Exit] [Illegal file name given in close or exit] [File was not renamed]x557w75TwL77B755<6 "6 ` 6tpl 7 7 X  D5 7 35wE7 7wH ' 0% 7 7 :MCALL.# z ^77n  07c*`ѕ ɕ ӕeנtއ p '^ww l\J3#  `7%&7PZe p  $ 87tw7 |  ' 0x$  + A b< #  dle 7p  67w72    w ' Z p\N#  b77fep  47o* ebB`ҕ ʕ 7 ~  '5 p wn#  $7U5n E0 '(A ? eE  &D m    b[Save file does not exist][MCALL file does not exist]EDI -- Bad parameters on a QIOEDI -- Invalid function code on a QIOEDI -- Device not ready EDI -- Parity error on deviceEDI -- Bad buffer address or handler not loadedEDI -- End of fileEDI -- Write attempt to locked unit EDI -- Request terminatedEDI -- Privilege violation EDI -- Caller's node exhaustedEDI -- Device fullEDI -- Index file fullEDI -- File does not existEDI -- File is locked to write access EDI -- File header full002VTSBgEDI -- File accessed for write EDI -- File header checksum errorEDI -- Write attribute data format errorEDI -- File processor device read errorEDI -- File processor device write errorEDI -- Secondary file not properly closed not usableEDI -- Record is too large for user buffer EDI -- No blocks leftEDI -- Bad record type-file no longer usable EDI -- Illegal record access bits-file not usable EDI -- Illegal record attributes-file not usable EDI -- Illegal record number-file no longer usable EDI -- Rename on two different devices EDI -- Rename name already in use EDI -- Bad directory fileEDI -- Bad directory syntax EDI -- File already open EDI -- Bad device nameEDI -- Bad block on deviceEDI -- Duplicate entry in directory EDI -- Hardware error on deviceEDI -- Primary file not properly closed-not usableEDI -- Device not in system EDI -- Unexpected error-editor will abort";"b"{"M'"M'M'M'"M'"M'M'# #M'M'M'M'M'M'<#\#p#####$($R${$M'M'M'M'$M'$%M'%M%%%M'%&1&M'L&i& &&&M'&0'* W vv%*Ax'ɋ7Vы& Ne*(^(045;1'7,3wf!!#7&7 w$ d77^ &|> !E$ EvUpwwFׯ6<7B "P H7 >ыw6߀ 7 w dK  W ɥaɥz W@ WZR wы wwW W  ɋW W whʋR :ADDAPBEGINBLOCKBOTTOMCHANGECLOSECDLCLOSESCCDELETEDPENDEXITEDXERASERASEFINDFILEFFINSERTKILKILLLOCATELCLISTLPMMACROMCALLNEXTNPOVERLAYOUTPUTOPENSOLDPAGEPRINTPASTEPAGEPFINDPLOCATERETYPEREADRENEWSIZSIZESAVESCSPSSTOPTOFTABTYPEUCUNSAVEVERIFYWRITE ff6^fnN\ v&~\ V.&.v6\ ~> FNw CG  7 &-w +*dD</0   8 6,35n %  pmdw䗠@ Z`z5.9E& e ` 7ۀ  E &f ' ( d    e0@&!7 B¥a¥z  : O$!  : :: e3b 3 [3) ,, ],  3 3 ¥*¥.  ¥;  . &  m  f A N  %w` PDL@<<8<0-6B&,  7 w  * &&a ޷a-  /޲ރ &` `r7nll޷f޷"xZ2  %e  E0ރea"wK ae    B T BR . 4Rw݁   * R F!  R$ W.W.W. W.  " eɋɥ ɥ ɭ>݇ʥ ʥ 004V`V`KTADATADATADATADATADATA|bK,..wW  &[q$W  4TITISYSYTICLOVTIOVdb\| d<0   5 5  5 p5@ 5 5 Jw6wPAB w DeB$&< 0# &f C&f&    `D D` A      D C   DLfE V B%J|Ǫ^kQl%6" `w  w  4   % T T  % Tw 6N L$ /3#e '&` E  A 0# 0-  A w E7 &RRw  e  ` " 0!p!w N(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$f&  L 7l  LBR>_"S" 004VTSBg   SYZ . : ,!@FLRX^djpv     " ( . 4 : @ F L R X ^ d j p v |                            $ * 0 6 < w v @pdf \ B$ĵ4ĵ!%'% %E$e@ P  *e ,e +e V& ĵ V 11@ Be &w pE 4 A B` 7pA .wf. f < eE  B< B  @`   B`. vp 4e6(  4 d> > p 4e6(   "䇇7 ~wx te|)w\ 7 Z - w > E D 4 B ` p 7A @ae   0 B `  w f< 4  & D -N  ^  ` <  P ,@ 0 '&1 ,   | 8    ( $ |8 t8P lJ d` \ TX L$ DL << 4H ,\ $ \ T n n! n# nJ!  t "     FD' Xx'5ew |, Bv     5Bw\ <[\50  (r- DUt-E D  E E ܁ &wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff &f &  m  f A N  % &[q &[q`004V`V`KTADATADATADATADATADATA l  8&L&J&&\&&n&|&&&&"&8&%&4%&d&&'& (&4)&*&"+&x,D'F&4,D'X4X40D' 4F4@6> ^dkQdydw \Be,W  5 5 :!w7  5;5 wx5 D 7 Jȋ  s   *e 7 w: wz  555wZw U@5 7  5   :L e \ e    5t %   ̥ (# # yȥ$$ $ )wZ7 H8 ( `w0w  ZU   H  Ue  @%NModules deleted:%N%NEntry points deleted:%N%2R%Nw > @   :@!A ;U@(e&& V  ,% I B( %/  @A U@0 0  I B(e)BwU@5  UCR CO IN@ RP SZSS@LIFULEDE  DF  DG  EX EPMH & & & & .& & &.Z 0 7w w  Tw ##g&7V  @   BAbpd fwh`  %/ -%/*%//$`¥¥¥  ¥ ¥ef `U w 7 7 7 < W,( T7 H7  # %* 7 7   w <5 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f  h P aAAf@pnp FC*8֋ (88*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ tŀajTI& af* n*`V @e,w `jjlj ɥ@@aujk,bp ~5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ 6DlljaCeH###33 & 8 *  w " 8jDl@ TeBT85l@ @( D ,eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@?A004VTSBgw w FwF"\" ,& $& .& & ' & ' Module "%2R" replaced MACROREPTIRPCIRPENDMENDRw $w xw h^ b 7 rw  zw 7<  */ `wj%   5b  >< *w @@ vw >  D* "0 0   6*  / *' Zqq pp w @ 5@    bB@ B cB C f=TSTSTSSSK^  ?# 8TNTP^e $w D wT BC6 w@ |w-w" w%  %   7 7 ~w^ wR7 d ɥɥ NEl E  r5 Nwwe _7   VwND! P   E %% "% %,%;w  % % %,%;wDw> p ( N 5   5 wxר; w  w\wC`U |W.  w 4E Z W:W=E U  D&fBʋRe V   aa   C W; W W  ר ע   @7 (2 ^ˋ@THLJ  w 7 5    Uaz  $$$SY*%R$$ %r%%IN@% RP% SZ%SS@%EP% & & & & .& & & & &004V`V`KTADATADATADATADATADATA 2? D%F%2NDirectory of file %X%N%VA library created by: LBR V%2R%NLast insert occurred %Y at %3Z%NMNT entries allocated: %D; Available: %D%NEPFile space available: Recoverable deleted space: words%N%2NUNI LIB DEF filetype:%R%N%N** Module:%2R Size: Inserted:%Y Ident:%R%R%N%P%N Attrib:SSContiguous, %2R OP info:%2R %2R %2R %2R%N User file attrib:%P %P %P %P%N %SObject moduleMacroUniversalw @  *%\#  " `w7," v ` " e    1  4  Zg   K  :g t   `e w` 7< 5P  58ce  `wl B F     k ]  O   P  `B l, eB N 5dw  j   %  lp  wp 5> 89f"e\e!e  5f ~2* eA  j w < N &  .&  A 7 T V5Z#\# b5 U  2 N Fw@5   U### NSY\#J0#<###LIFULESP & & & & .& ~& vX' nX (XX^kQؙSY:w 40  H"  &  w' 77 ȥ: wz+w5b @N"   H@wA B(A!  eff wu57v(whc^RMH8 "zxm:p lm2h%b Z7 X B0 0 (lD * ~w> w~ h%   wz`  1& , w 5` pp wv 7 ,* 807  w  %w, pweff nw@Pe e˥#   $ w   @@  5.  U!!!SY!!!<"Z" 0& (& .& & ' X' X (7vrl5 7\  J " :p چ`w X'004VTSBgw x ^p 7 ѥ ѥ   e  `w 8   */ 7j7f  w zÝ w `ÝU wRe ?f7  4  7"x+r" >e ` R  Xۀ <    A `w  F*5@jE@w p2  pD= f &  Ep0 4 e f`  B B0   0 < |`w  N* w x: DDA D 7ww ~ 0 0  \  x 4 S   # mc m   @0 `wLw BC%    |@@ R  Xw :8ۅ`D BE  Aa 3  w r%@ f@A &+    =E e CU@@އ`wz  *% b% J R 6%  %$N`e&&%%%0%0#  &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e  E D  .r.f P. Fp.!.7 7 P PPPP A(   & & @( f  e ee e h(((((()4)H)j))))))&*@*\******+!+J+l+++++,<,g,~,,,, -E-c-----..N.Illegal Get Command Line error code%NInput error on %X%NCommand syntax error%N%VA%NOutput error on %X%NIllegal switch%N%VA%NInsufficient dynamic memory to continue%NInvalid library type specified%NCommand I/O error%NIndirect file open failure%N%VA%NIndirect command syntax error%N%VA%NBad library header%NIndirect file depth exceeded%N%VA%NI/O error on input file %X%NOpen failure on file %X%NInvalid EPT and/or MNT specification%NPositioning error on %X%NEPT or MNT exceeded in %X%NDuplicate module name "%2R" in %X%NGet Time failed%NNo module named "%2R"%NInvalid name -- "%6A"%NLibrary file specification missing%NIllegal switch combination%NNo entry point named "%2R"%NDuplicate entry point name "%2R" in004V6V`KTADATADATADATADATADATA %X%NToo many output files specified%NExactly one input file must appear with /CO%NFatal compress error%NEPT or MNT space exceeded in compress%NError in library tables, file %X%NInvalid format, input file %X%NOpen failure on LBR work file%NMark for delete failure on LBR work file%NToo many input files%NMissing output file specifier%NInvalid operation for object and macro libraries%NInvalid RAD50 character in %6A%NCannot modify header%NMultiple module extractions not permitted for UNI modules%NInvalid module format in %X%NRMS module cannot be extracted to record oriented devices%NInvalid filetype %3A%NIllegal filename%N%VA%NIllegal device/volume%N%VA%NIllegal directory%N%VA%NWork file I/O error%NVirtual storage requirement exceeds 65536. words%NPrivilege violation on file %X%N --*DIAG*- --*FATAL*- "&  )  J!$ t   z7  n w`D'2 r'&1t'_ &7ܷV7J\' LBR -- *FATAL* -- Run aborted J& BJ!|, fW  &[q$W j@SYTISYSYTICLOVOV0j^^00~~~  R  %Z `!! w&) c 6 0` %  `7R w &  A 67*@m7  ,1 C7 pM | w"  h 7 / L *w  x7w * `  efA   \wr $7fwd  0L D v& & % N  V    . P ts ew    A C 2 w TCB  fw 8&eC %E`& 7 pB   2wV  cAcA 006VTSBg& 7A :&e Cm  &m`e` ` f`B` Z    f  !0Ud   `p f& `,,&  mV  B ce f&  ^    &hef  eE  w xE B A B` 47.pA whL w 2 E D r B ` p B7A @ae  0 B ` |w f fE  w`K`/ & D -N    `   l \ L : vp4e6(  d> >V p4e6( 6 "䇇7 w e)w 7  I |B B  @`   B` 6  v  f m ` N@ Be?E? & f Y'&1  ( $    *l  ` zT r@ jh b<` Zp R$ J0 BH :<F 2 *Nt " r* r$ 5ew r, Bv     5Bw kQr\~ 50  (r- DUt-E D  E E ܁ j &w E U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&f &ff  &[q &[qBC"&X   D   *X` 6 J `*` `0<`PN`*r` `r` SYMBOLSYMBOL VALUE REFERENCES=%= % ****** R G RG GX *#%10<%D-%D%8>REGISTER SYMBOLSYMBOL 006WV`KTADATADATADATADATADATA REFERENCES #*%10<%D-%D%8>MACROMACRO NAME REFERENCES #%10<%D-%D%8>PERMANENT SYMBOL TABLESYMBOL REFERENCES %10<%D-%D%8>SECTIONSECTION NAME REFERENCES #%10<%D-%D%8>ERRORERROR REFERENCES #%10<%D-%D%8>GLOBALSYMBOL VALUE REFERENCES... -R # * ^ @ %2RSEGMENTSEGMENT NAME RESIDENT MODULES %2R n6|2!&>FPfFTN\Vj^ x-4f. ;x Q ;Ax~ QW @`PB  X   M d P  7 :{4  e e w Kw  N q 8 5 . . +R qUq eB  Be2 A?w 8w      7 7 7  W,( L7 @7 h# %* 7 N 7 F  2eE t&|m6  * " bw x # j\ ^ R  hwj %2R %2R%N%VA%N:RR      w%VA FR  (Rj $ ( & @N ECBN e@A  1,006W7 WSBg1,J 1,1,f** atB ¥*W W c@ %    CRF -- *DIAGFATAL*- < %2R > - w De EW= f    B  Bj ()Z %D<4wf&R~ % N Ij K L U ILLEGAL ERROR-SEVERITY CODE %P %P %P %P %2NFILE %X NOT FOUND %2NOPEN FAILURE ON FILE %X%2NI/O ERROR ON FILE %X%2NNO DYNAMIC STORAGE AVAILABLE%2NINPUT FROM UNKNOWN TASK%2NINVALID OUTPUT FORMAT SPECIFIED%2NCREF INPUT FILE %X HAS ILLEGAL FORMAT%2NFAILED TO DELETE FILE %X%2NWORK FILE I/O ERROR%2NUNABLE TO OPEN WORK FILE%2NNO VIRTUAL MEMORY STORAGE AVALABLE%2NSYMBOL TABLE SEARCH STACK OVERFLOW%2N|:,BBAW hhW  &[q$W  hTITISYSYTICLt0˚V0t0: & & @( f  e ee e f& &f& v OPzLB 007WV`KTADATADATADATADATADATAkz?TLBZ~'"b IPP>PB SY SY( >ט &[q &[q &r [q} E`W.IPP Version M01.02 (ANSI)IPP -- 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 foundOutput file directory not foundGet Command Line - I/O ErrorGet Command Line - Bad @ File NameGet Command Line - Max @ File Depth ExceededGet Command Line - Failed to Open @ FileSY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VAI/O Error Code %D.QI/O Error Code %D.:?TSY 5- ?  ?0 b  f    .w "`` ` ` ;,y"W(%BBC&7 ?7 ?7 ?`f  %1  11 1 1 11L?H?D? &?,-fW 007W WSBg>5W E5W sW s W ! W 8W >W EW W W W Ō $|e 6 5  5*+5U5 5   BBCU% B  v $5 %jAbAZATA "7 R>   B>UfUh&&n=  d=Е ȕ-ȕ  L     LBLQe=5)E$ %& e e=UU & "eb= e\^$% 5R = = eH  --  "< A & & & & f& & & ΝHB 4)  % U" 2LP BLw 4=& LB&a    W111 D K < M ?  < U%   < vM !D  E e@P   P<& SY&  :<& SY& < 5 %   ;)>B  &j— }  & %==ANDqASK>ASKN;ASKS=BEGINMCHAINNCLOSE@DATA4DECFDELAYVDISABLE5ENABLE6ENDJERASE?EXITKFORMXGOSUB3GOTO0IFzIFACTuIFDFoIFDISABLEDyIFENABLEDxIFFmIFINSsIFLOAvIFNACTtIFNDFnIFNINSrIFNLOAwIFTlINC9ONERRPOPENIOPENAGOPENRHORpPARSEAPAUSEOREADQRETURNSTRLENFSUCCESJSYDISK\SYMTYPESYSDEV]SYSID@SYSTEM?SYSUICcSYTYPmSYUNITDTICLPPXTICWIDYTIME`TIMOUT:TISPEDWTITYPEVTRUEOUICaVERSNnWARNINKn:2i `<< f 7< H:w@:&6:7 0: > :5<.9 t<L9 ߇5j<<#P  `c9<=~<=z<=<` #  :}\9w@97R9\: : *(9weP P 9! 9Q ,Q  Y  7A8 8  . '  w;w :! 88]   x  <wT;! ?' \" " 8:   ҕ  77 '  '7w7   8` 8 w2~7` bh7 LR7w*,V27w* ,V7f| 77\88 f~6767777`  A5@E (/̋6ե>7W 667,7 667#777i67 v7w r7mn77 f7w b7^7-Z7 ҝ16@7  ȁ F 7Q6 6wW#A!2@ 5  D &ffE ̋E V V  w 5 funhj uhdB$ 0jwaw< 8 v8w &  p*AdBbAep& f  D 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 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *j>҇w j 8jDl@ TeBT85l@ 2007 W8#W`KTADATADATADATADATADATA@( D eB& Z & @# J& V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@'&1 : : : : x:8 p: h: `: X:\ P:, H:X @: 8:$ 0: (:L :< :H5ew `, Bv     5Bw, * -*~ ,D- E %     U EU 5  (5(UW       wE5 E  W ͇5  ,E &wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&f &ff &  m  f A N  %|,]]\xW XXW  &[q$W 2 \XTITISYSYSYTISYSYOVXȮjll XX008(W WSBg Z    !0 <  6  8@'` RPT>0 < 0 < 0 < fF>^PV 0 < Lkl 4Ҝ &[q &[q`   l !=60080W#W`KTADATADATADATADATADATAT?H@l6ZH6HLPV~lLPVllOPVllSPVllWPVl~l & & @( f  e ee e H D0 <  #w 85m&&  X6e"-  C P e   e f6   f6   w 5 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f  v P aAAf@pnp C*8֋ 688*Ë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@ ̶DlljaCeH###33 & .8 *^2w ʸ 8jDl@ TeBT85l@ 4@( D eB&  & @# & V An5jP a@@` > ~ &@ . 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 J L   ԕ.N   ԕ;P e7Vwأ  @   B  * 1 v7 pfj   `p  $$f$Е Е f& @ee$"w    e wޢ     A @ *B`ʋ @ ֱʋ Ҧf`w7 ^ P v 111111& 8 e87 H0 \0 ^7 &|x~( pt `` P7 P7 `7 f"P"L7 J $7 ef  a2 e tj 7 p#&f2 p 7@w<580(f& e we& & & f   @ = , @& 7  ww nw&Cm5Cm  f ( ~ > f >~ wŸ8e&  G @ 0 9 A Z _ a z . : ;ރ [   W] "   W" , =  t@f5$  2   4 ׭n/   55Z%%w`!5 SW aW z@ ##W ' ! ֢'W W  !   ˕  F@0088W WSBgwf2`     2 X E f&f& e 醦 w Aef  W. N  Ф5, hhffW= ȡW  ! W0!W9 ! B0  d`%aW' @ CА '!W'@ &f eWTWF& p   P we  W   ڠwJ @ 0 9  A Z _   w W   @fa a P& 1 e  :ea a& & \e $G v7`rwlf S V7`RwLF e  e& aa : ef1 e  n& aa  >f1 e  (eeef   8 ,  @f $222   .82- \w $$ @e$f @5, a a & 1 e  e  e5 .5x 5fM &  aa f =&1 Be *H7 jn2 ؕ ^ Vw!"wL2 AaN  , $vvaB eE` wdN2 j` ` @ 2 eE`e2C (  L2  D .L2 2 N` 2 Δ W  22 H  N` ʟ  N`  x f *e &N` x  & 2 \f e b w w:  | wr5.7 ` 6 Γ T L5 (  0N  "  N\ L2 tN^  7 86 V ܓ ԓP6 > h n6 " L 6  4  |6   d \6 ƒ  @6  ؒ ( -ܰ"7    L7 `j܀   ֒l7 @x p ` 7 " J : ef e6"e@-: 19SY:.CNFSY:.SYMSY:.ICFSY:.LSTCFL>Option>/OPLITERALP%2RSX-11 CFL-16 V2.00PageGroup Symbol    Offset Uses Group Symbols" Group Literals Type Length ValueNUMERICSTRINGASCIIRSXTIMVMSTIMPOINTERLOGICAL2222222 '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 References008@W#W`KTADATADATADATADATADATA  Literal Data Data Areas Variable Data  Table Data  Symbol Declaration Descriptors Conditional Descriptors  BIT and FIELD type Symbols  Data Symbols  Symbol Names 2$3`3|333333 4"4<4X4r44 4 4 4 455 $545T5p555Allocation 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 ~^V ݢZ ݢZ ݢ[&  m  f A N  %f)aa& &  ?N 4 w W  ׭ 5(7 %5!7  9 D  h9 *N4  %4~ew t  d *& "B l9  e& 0 8  إe . C   4 { l?w r tyl XZuR >k 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 5008HW WSBg2L 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   W  .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 008PW#W`KTADATADATADATADATADATA7 -:|  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 ,$ FLUSHKEEP44COMMANDERRORINPUTOUTPUTREPORTUSER444455CLEARDELETEFIRSTLOADMOVENEXTPREVIOUSRESET.545<5 B5 H5 N5 T5 ^5CND$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$STRING555 5!5"5#5$5%5&5'5(5) 6*60 61,62863@64L65V66d67r6@z6A6B6C6D6P6Q6R6S6T6U6`6a7b7c7p&7q27>7H7\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{}008XW WSBg   !"#$%&'()-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_STOP WRITE_PACKET RSX_LONGWORD DYNAMIC_TABLEstring-literalnumeric-literalDKXK\K`KdKhKlKpKtKxK|KKKKKKKKKKKKKKKKKKKKKKKKKKKKKLL LLLL$L*L0L6L?BDFJOOSSX]bddflptwz|             "$&(**,.022468::<>@BDDGGGGGIMRRRSS008`W#W`KTADATADATADATADATADATATVWXXXY[[[]___acccccfffffffiitג =°†yuuȔȔPPɤně.Rdv{ssfцg$3Ȥnwنٛ۲ țʷʷɞ .: Rd=ݨ:  :  Ƹ肙͍̄̄̄̄̄̄̄̊ T T U $T ~W `V Z PVwdn    l"V r1     8f yN& `e HV@V  e&   r  z  ^zf&& ewm RyEe0 9e Ҁ e0 9e %   y  dq  &&,Z<` B~^V :Z 2[wrn޸  lU r<BCw { 42- \r @`eBwa x     Be&& ` Zye0  lU q  F Hf xf& e  (. l~W dDW \Zwn)@  lU rV z z C @6 z U1/5 Jr1    z z @D C  QP  xz f \ye  Rz& Jx  ,y %ABCDEFHJKLMNPRSTUV 4f EN &! V& T 7  |j tN n Unimplemented error message-F- H Z p%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 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 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 f008pW#W`KTADATADATADATADATADATAile are not allowed to span blocks.4MEMINIFAI, Memory allocation initialization failure.CMEMALLFAI, Memory allocation failure - insufficient virtual memory.0j>x^LRJhwl@RV w7X   l[t p  eNP-7 *Cz5L  f x  & k%B<&[f& heRwl -  rz7,e@RV yRV `ye0#9e    @7e@w wkRVmz  Ve7rllwTk l$[@T ^of v f& geP"[&  a g R@ !\ oe `&&E "hf a 4vef * f ewlj a-d vn- fnm? ;&( i / D!0!9"!A!Z@!a!z`!$ !.!  a %    "uewi 4[&  a fa$&6   -v    +  l Hme ( !0!90 !A!Z7v l m uD v 5 @P P P H  vf 0tewh  l l     0W l l& Tg@`% . &2 Df@ l\ 1 ry& \* Vy W  f > 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 l7008xW WSBgwmf w xB m k `B l`]B` ɵW e<QBaCa 5  y@< xkDa hk@ D @ D E& NUe& NU D a"K `@#  ^] $ewl vC` 5 5  (5 5 5 f Zw@e # -  @  0  :    5!Jפ-G`!B]Ba JȢe] ]&A#y]B eפ-  ll d 5WW d5!!ע פ: F5<! ע פ:  (5< fפ  f  0W   @i@`%wjf= uP eff t111f Zuewiaf t NuE^] eKkW"  aDZ] EZ] N h eQʐN h mm Jʵ : @`Cy] Ð r2 aa va Bv < dh2< ^h2e  f  s] te p  : \ \ NwRh taf s sBai*Cava>  u5 ~ K J    D ewg     zrf :s  `ѕ- ae]ѕ-ѕ1ѕ9 4 ѕ  ѕ: ѕ: e e/ѐe:wf t& t twf   M u @ A -#  wf   @M u u u @ A B - #  wLff   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 e008W#W`KTADATADATADATADATADATA,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˵ x@ @*   \CwB %58C @`1  $ ^ BB 9 B   lB-fB X tFA6>5F $> 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 6 l d \ w h * ` w@,Aw +&v|z &5  HBBl D`7 1,1,7& &672beBe 22,5 b,# X`  25b.f&%67~5    >  `    SYSYSYSYTICLH' FTB>P #?Sp &>Y*Q!AZsI_z@r 1NAn5 ^SY*@ ^ DAZ LB Z z p xQSY d 009W#W`KTADATADATADATADATADATA $ SP#w %5 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f   P aAAf@pnp &C*8֋ X88*Ë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@ DlljaCeH###33 & 8 *  w ! 8jDl@ TeBT85l@ @( D eB& & & @# F& V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@SYF&DAEAFP@MMCPFTB -- *DIAG*-Illegal Get Command Line error codeCommand syntax error%N%VARequired input file missingIllegal switch%N%VANo dynamic storage availableIllegal error severity code %P %P %PCommand I/O errorIndirect file open failure%N%VAIndirect comand syntax error%N%VAIndirect file depth exceeded%N%VAI/O error on input file %XOpen failure on file %XFile %X has illegal formatModule %2R multiply defines P-section %2RModule %2R multiply defines XFR addr in seg %2RModule %2R illegally defines XFR addr %2R %PP-section %2R has overflowedMod009WWSBgule %2R ambiguously defines symbol %2R%2NModule %2R multiply defines symbol %2RSegment %2R has address overflow: Allocation deletedAllocation failure on file %XI/O error on output file %XLoad addr out of range in module %2RTruncation error in module %2R%D undefined symbols file %XInvalid keyword identifier%N%VAOption syntax error%N%VAToo many parameters%N%VAIllegal multiple parameter sets%N%VAInsufficient parameters%N%VATask has illegal memory limitsIllegal logical unit number%N%VAIllegal number of logical units%N%VAIllegal number of active fields specified%N%VAIllegal filename%N%VAIllegal device/volume%N%VALookup failure on file %XIllegal directory%N%VAIncompatable reference to library P-section %2R%2NResident library memory allocation conflict%2N%VA%2NLookup failure resident library file - %X%2NIllegal partition/common block specified%2N%VA%2NNo memory available for library %2R%2NPIC libraries may not reference other libraries%N%VAIllegal APR reservation%N%VAI/O error library image file%n%VARequired partition not specified%2NIllegal PAR reservation%N%VAComplex relocation error-divide by zero: Module %2RResident library has incorrect address alignment%2N%VA%2NPartition %2R has illegal memory limits%2NInvalid partition/common block specified%2N%VA%2NTask requires too many window blocks%2NLibrary references overlaid library%2N%VA%2NResident library mapped array allocation too large%2N%VA%2NInvalid reference to mapped array by module%2R%2NSymbol %2R not found for patch %NLibrary not built as a supervisor mode library%N%VA%2NSupervisor-mode library reference error%N%VA%2NFTB -- *FATAL*-'&1 / / /| / / /H / | /, t /T l /0 d /3 \ /8 T / L / D / < / 4 /$ , /$0 $ /\  /0  /f: /  / /t /E /X /L /<5ew , Bv     5Bw 009W#W`KTADATADATADATADATADATA!,-50  (r- DUt-E D  E E ܁z/v \.-v!x/&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&f &ff  &[q &[q`/z/z/ z//z// z//z/0 $0///$0///#$0-///:$0///f/f/_00000 0ODT.OBJLB[1,1]SYSLIB.OLBw < pw$$0 `$0  $UH$0  U@,f6t7 n  wX 0 b 7H7J d  9` 5br0 ~0&$p$ p$ bw`9w  ~$0 rn6@$0 7采eB$&5 bP0<w   9` ^,\NL$a BAbpd fwh` ҥ/ ʥ -ʥ*ʥ/$2`¥¥¥ ¥ ¥ef Udӱ8]2?d2& & AmP"F 7 7 7 7 N7 n7 HD  w1  | n7 ~h P   7 7 447 7 N0 b 0 bRbͫeA3w Z$27  H7 7 7 &7 $?@5b   & JwBѷp H&B X` e5vB p7  ^ȥ;4B ¥=7e)At#t-e !*B87 j  ȋ-ȥ;*E4B N J   ¥,¥! ¥;¥: 5  !2 0͞4B &  ¥;¥!ww vw l  r7"7,97Eh03"3,'5@5E-    B`   E  A $΋ R pp@Up 714p  d͇w @pdf - fB$ĵ4ĵ!%'% %E$e@ P  7e :e 8e ^˱& ĵ V 11@ Be .˱ AZ    4! ȋ*& ȥ+ȥ-  U w f  u  u  ¥ ¥ ȥ ȥ  ?_?=&7\b009WWSBgVmP  % V 145(5$ F5  =  w̷Q  5v% 5jN577=,LՀ7 78̴ 8قm8f 277  & & h*5@t&95t69  N N65- 5 J!tx9JH 5  7 B7.     7 w Fw@ :pp5V5 5@U@p` p`|99 9 9 A \5V 2ˇE B B B B   7 Œ7J7be F7j: SYBe j:eB e  yB,D.& C! U@5    wp <D# b V c5KUU5U5U@Q$@P  5U@  e)p:555X5u u C55a 5a   w%VE7 \ 07 PGRw 7 ȇw  (w eB$&wROaB=RW`B=SVaB=bBB .(@*@  &• H   ; w ; !,:& u@5e, RNOWE 5& , ! [ ]   )@ 55 ,.@ = <=ȕf - 5@ 2wH÷ w w^ -ЋSVw (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$f& l77l7l7l7l7l7l7l7l77r7l77r7r7=n>l7=n>l7>> ?0?l7(?l77l7LB[1,1]wć@$  7"67$7~  e ?7 PAPАP 0we)FA 4 @ppp px7bZ@ ; :$5?15?-B B B @5$ $= 5 5 2 wwwBķ&ć@Rw2w wćwwćw#XW#wÇ1B2w&?0@?  ?6@#Lw?@Q@@:d@@%S @dAjLp@dA[q%@dA[qjL@dAzjL@^A[qz!@^Ayx"@hA;}D$@pAy&@zA/^B Enter Options: FTB>&  m  f A N  %]8E 7Be8w2w 58 6 7:5  4 |  (8PNl84 7x  87e e? m "f&4E%4| 7 8EI- q- b- *.J- r- @ C` EP" ,eB  447b .     w`  \Єv n  IP *@mLw J>JBm4, 4 $ e8B & f& & 8& 8& Ε )` wϱ80 08&    B2  ,w8R 8B1  D3V3z344 53H7b7f7844!1Ղ`w,   Bµ µ 85 T 8 8ppp p  & π B009W#W`KTADATADATADATADATADATA 2,2,1&LEE8  neB  7% B5% ς l5R 88 w^Cœ5.5µ tl 55U5 EE  l ,w'5\5 5  >: w8 jwN r z|pN @σ-\8 L55 55e d ~ 5 v7r14p  ̃ &  "55 5Ո ` 5PHww C5% f  H ! JHJ   .C %p`$ n p ݃; Rp p5    & 4ww 07̇ sN0 t009WWSBg009W#W`KTADATADATADATADATADATA&  m  f A N  %w 5%E@& ŀ05  e5#w  0# ( ` Ep  .7N7HЕ 00w X5B 0  df c 0e @і %5w  wHwJ77L7 m" 77.1=41  e>7z7`t|H` %,  V \E. ^ pem,@7e 7`e5b $5bem*   % >1D1mm<  %jdѡ5b@R7D @ICD5Ee\1B h e\1EE@Ce% &%([q  CeI7 %CD5Efe\1m   jp TEC ” eX1T  8? @HCD5EB r \1  \3& && & \1& `3& Ε009WWSBg )$`wL*** 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  B7T6 (7 :='7 (eeH7w w T642|6   6  m̊ m@e7 54  6 `7 %6 B%6 7 z E$T6RRJJ  b mm7 *  eBRRR R RT6 p \` T6w L7 4E%4wFwBb -XTP7 T6 RRJ8wXw JJ - % U%@eA DA . :pp0 e U%I !  rD   ?t7p ref "܂be@5e5e,e"7 l eD ID  " P  aU%vJe =   }l=l^ʷ ZJBe    7ɶɸڰmɪ7 7Ҁ !m  l3B% %  `lm4ɇaa   H ! nlPP A :w t z  %% x<>A<w w|>A>>>??"????(?>A.?N?T?@:? @@lm9 R8 @@- :) . (    & @@e   AA@`\C50bC5 &fe I rw AA@`7@ lm7mn jmŀ w\)0@   (@ wL@P@N@l@r@Z@h@`@T@V@ AA>A>A@@@@ d. J J D(Db@T"A  H   J  J    w    @ FeA @ : @@@`"  %wT d @mT  ւ`  0 x  @ mA @lw :, w 0w ,$m ewȾf& BUE mʂ B@  7@ew 7 $7+wɵ#ɵ"wtpB4e6 (BE ɕ m %B4e6 (B0  < )63 wɋ w`pB4e6 (BE ( w` )`w(^                                  )ފ0Esw h"5@# ` tE@5X NmT 5@E5> 89009W:W`KTADATADATADATADATADATAf"e\e!e & 5f 2* eA " 5  هw 5@f    $5H? E;C $  Լ$ mp Kl l 0 U5%J%`  ς`  5@ ^ <  Al mν w tmV $@ 7 7 ϡ e7Ƈ     h3 3 N333  E@ (33 53 @` D`D@D& Ebf& `\:(^:*`:,b:.X1$61F1 D1H141"^3^3 <P1:81S1|[1.N1J1L1.1V1 T1 f3*\3d3D1h3<VNTI\~TI\CL VNSYVNSY[gNSY[hNSY@GfxzdC*f** a B ¥*W W c@ %)P")&y@Gd: xCIcp\:,1z^:?y`:5!b:&  m  f A N  %|| ,33LW hhW  &[q$W @ޏe 3hTITISYSYTISYSYSYSYSYOV>ޏj TITISYSYTISYSYSYSYSYOV(SONphgH:>| |&4 0 җ.~%   ¥8¥9w Մ(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA "EAa$az   & & @( f  e ee e &f& v f& w Ԧ&&E  Aw pԦ   j2*-  (@ep@ bD  e  ` e    b   R#R-w   &. ʥ*3A? +TRDEMC@CL@LO LB6ER@DE j:x 000:WWSBgt:IND V9.0,NPR,FMS,MPL. Task built: + (@,*SY[],,RSX11 ,SY&RSX-11M-PLUS@  R R SY20dSYTIdSYdSCf p  ^ SYS$LOGIN:SY:SYhntz  d  dW ,!< H J z j j n ~ j n b'SY ֌6> &[q &[q`   , >,  ,P,P,b,+,>,he vv,  ,   w|NO HELP AVAILABLEALPHABETIC REQUIREDNUMERIC REQUIREDALPHANUMERIC REQUIREDSIGNED NUMERIC REQUIREDNON-DISPLAYABLE CHARACTERFULL FIELD REQUIREDINPUT REQUIRED<)0[H[J[24B [J#5[K[B[24B[132C[[?3l[?3h#6[?5h[?5lDM <(% &' &)$O[&M&Pp%QV(R`&S&P(A&B&C&Dh'&-F.`>l&t  R1b1h w p >EuB AeueOu%UU"wMe 5 %& " 05 :ue 00:WW`KTADATADATADATADATADATA 5  Aej~UU dBeXPCeL eVe 0 BCe~U   L L  >E  dBe$R~ D~ & 5*5%   %P P   5 @A- 5 B5%B@mBAmBu  ~   U  E~  50 \ x h ` @' ~ R  u * : . X 5     c7[H[24B[132C[6n8[[c[? @ ɋ ;B  0 9 f e 0`  w %@mB     E~  w@0  ` Ce2`54 `  E@t0  t0 5 6U& t0 5NB& E% W @&  &D5@  $D  K se~ ~ e 4w D4 %56 9 (   h~fe &4~ L5 U5@  eP ~  E  ҁ B~4e• D`~ E5@  w KmB3eC-4  wB6 % RR D~ D~ 80 C2 4QA8B 5@  ` ` VD45@ +  b  &f  m ~ 8C~meI~ ~ 5!6̇U DE5`u-   t   4 z5@ & B2   nꆇZe B` . . 2@   @ B` 톇   ҋ  %UUx >u A ˥*  :0e L=  0  1 hL= x <  l  81@ "B8  5ZTC2 4 C@ xL=wd 2 l5C@  1e1 1  0 t &% &ZtW W C@& L=@0e r $@2"e $5@  0 &  L=eH~ l     4&@`    4  lw Z`ҔD~ &    .&@`   Z r t w C`~ D~    eC~L=l f5@ & @ P ;  B r 5 : @ w T J 2 L=6  w $  C~ D-6L=66  h  wB@ʢ    1w  l ^ w  b f #N :B` e~ 2 C6"    e a~ 0 e    D4 R D-65@  5   E  C` \ w ” B  ~az 5@0!0:Aw , B5  4DV , 5B~mB`B~  ~5>5  ѥ ~eB'@ J~! X  e  @ f ~ z 5@  14575+5õ@ $  N "0  ;BC m õ  f @   5  N .  E BVfP  %&!t-<%h'%'  <%$#t-<. C@%<(C@ &C@  wN e B ѥ. ~APBV1 2 UE U@E122A& `1e2 Q$ A5 W &W V( W )5W P(& h &5-5 r'm!WB< q00:WWSBg~  ,& FB<C Q~f:  t-<0Am< ^5  5t-<5 5@  %6U T5  05  P @0w $ 5@  25@ $L=%5@ & l 6 6w F"5@  5@ L=6 6d5@   D5@   $ 5@      B  | t-< R w B> <t-< e ` J w B> <e ` $  >`  <  <  < < <E Bm< 5#5A< C~ f: ( % R A<C~  H5 , 45 f: h  nU~ `!~B-<d  F UUw b 5 Ue B` B`  JEf:fBAe*Bҥ ~ N5 U v%V( BEAe ,  w f:Ae$  j ` X 5 0UC2 hEC@ 0w V  5E5 <e  U5<e`  B<w Lu :u ; w f: 5  0E  &f@ D~ U  r 5 :A*C*9*N+XJ+J+F Am< U E6"*5   4  eыAm> e$   AZa%z 09   -+ +- . Ѡ~ z# l;H   ~5 5  .U(iC2L=  5 f   F5 : uew %UUx  ~U@  z %&& 5 :& *; j  H X: `w * d1 0 C    e0 e0 ;= u- @e5 5 f@  B $      Bɋ W]W: mKɋ F&&p"eB& # *5WSWPWM Br 55 (f1A%& pp4e6 ̧' Χ$%%b'   1  z 1  BrztA1d^w 0 *AHCCHeEfD & p4e6 ͇ ʇ%FuJ `Dw  E) B ",e$FFJ% ~4 C-C`AleC ",e%uDH UBE`JF R5Hp&    85"   @,e fe N,Nv v  1  EF 0 JEJ@JeJF  @J J F F5 H   e  &    b $B Pf&D1 EBa & & ̋•v ` !A[$%././0: dE T4 U & BU E f& f& &f&f &  l& & & & & f& Ε(   0& & & & && f& Ε  <   <<9 & & & & & f& Ε  &fv  w ѰB   f& & & & && f& Ε( `  ,& & & & f& f& Ε( f& &  ׭W1 00:WW`KTADATADATADATADATADATAwHNO HELP AVAILABLEALPHABETIC REQUIREDNUMERIC REQUIREDALPHANUMERIC REQUIREDSIGNED NUMERIC REQUIREDNON-DISPLAYABLE CHARACTERFULL FIELD REQUIREDINPUT REQUIRED [?2l \HJY7 KKBY7oY %T# #H% $&0#L"A`$Bf$C$D(%P $Q&R@$?~$M$&*+<pb$V..w 0 EuB AeueOu%UU"wMe 5 %&  5 :ue  5  Aej~UU *BeXPCeL eVe 0 BCe~U    r E 6Be$R~ D~ & v@A- 5 B5-B@mBAmBu # x   U x  E~  50  P  w %@mB     $E~  w@0  ` Ce2`54 `  E@t0  t0 5 6U& t0 5NB& E% W @&  &D5@  $D  K se~ ~ e 4w D4 %56 9 (   n~fe &4~ R5 U5@  eP ~  E  ҁ B~:e• D`~ E5@  w KmB3eC-4  wB6 % RR D~ D~ 80 C2 4QA8B 5@  ` ` VD45@ +  b  &f  m ~ 8C~meI~ ~ 5!6̇U DE5`u-   t  < 4 z5@ & B2   nꆇ`e B`  . 2@   @ B` 톇   ҋ  %UUx Du A  ˥*  :0e L=  0  1 hL= x <  l  N1@ "B8  5pjC2 4 C@ xL=wd t l5C@  1e1 1 ~ 0 #T##2W W C@& L=@0e  : @2"e 5@  F &  L=eH~ l     & C` L  w x`ҔD~ >    & r b <w 0C`~ D~    eC~L=l 5w   e~@~ w   2 L=6 T w n ^ C~ D-6L=66  h  *wB@ʢ |   1w  l w  f #N :B` 0e~ v C6"    e a~ 0 e  z  D4 R D-65@  5   E  C`  w ” B  ~az 5@0!0:Aw v B5  DV , 5B~mB`B~  ~575 ѥ ~eB#@ P~ r e  "@ ~ 5@  f @ 5  < .  E BVfP  %$!t-<%(%%H%  <%L"#t-<. C@%%C@ &C@  wN e B ѥ. ~APBV1 2 UE U@E122A& `1e2 Q$ A5 W $W & W &5W &~$ h L&5-5 r'm!WB< q~ ,& FB<C Q~f: v Rt-<000:WWSBgAm< 5 ~ 5t-<5 5@  %6U 05  05  P @ w 5@  25@ $L=%5@ & l b6 6w z ""5@  L5@ L=6 6@5@   t 5@    5@  ~     Xt t-< . w B> <t-< e `  w R B> <e `   >`  <  <  <  <E PBm< 5#5A< C~ f:  % R A<C~ H5 , 45 f:  :U~J `!~B-<0  UUw . 5 Ue B` B`  8Ef:fBAe*Bҥ ~ N5 U v%& BEAe ,  Xw f:Ae$  6 f " \5 0 UC2 * .Ew 4  5E5 <e  U5<e` b B<w *u :u ; w f: 5  E   D~U  b 5 :AH(C(9t(N(X((6 Am< U E&'5   4  eыAm> e$   AZa%z 09   -+ +- . Ѡ~ z# l;8   ~5 5  .U(iC2L=  5 f   F5 : uew %UUx  nU@  2%$~$ 5 :& e de X: `w * d1 0 C    e0 e0 ;= u- @e5 5 f@  B       Bɋ W]W: mKɋ F&&p"eB& 0# ,*5WSWPWM* Br55 (f1A%& pp4e6 @' B$%%b'  1  z 1  ` BrA1tnw 0 *AHCCHeEfD & p4e6 ͇ ʇ%FuJ `Dw  E) B ",e$FFJ% ~4 C-C`AleC ",e%uDH UBE`JF R5H&    85"   @,e fe N,Nv v  1  EF 0 JEJ@JeJF  @J J F F5 H   e  &    b $B f&. EBa & & ̋•v ` !A[$%././0: dE T4 U & BU E f& f& &f&f &  l& & & & & f& Ε(   0& & & & && f& Ε  <   <<9 & & & & & f& Ε  &f  w ѰB   f& & & & && f& Ε( `  ,& & & & f& f& Ε( f& &  ׭2W1 00:XW`KTADATADATADATADATADATAw VT&:)uE@ %:a `u>MN[[e  D(e:(C(  5@5*6 T @2ȋ eT5 |N ) @   J 5 wL DC uw  E  @e:(w5 CD>%  6  ^p + 6k5e d ^ [U5@ D(  G "uɥ;5<5-Ԩ  5@ u5 Fɥ@5ub , H5w E 5 F@  @8jMABAe @&PPP@C&5 A  88Ue l \8 "@0 x*_%`AB wz@ 8u j  5 , ɥ/b J  1ECe, e   ' @%7U @ E $  , D(@e , 5@B@e,C& : $ K s@w@&p > :9%%ȕp*f  轂ȕp* ̽eBEETH EBe @Z5    *O 2Te(5 @&B 2 B 2=2"뵊 D(:(@$8 &SY e2edE_$8$8$8w 5W E5W sW s W ! W 8W >W EW W W W Ō $|e |eE @&|m  t l bbe?E? & f YBEGINENDInvalid answer or terminatorString length not in rangeValue not in range? [Y/N [S [OYNSMHENABLEDISABLEDATAGLOBALLOCALSYMBOLNumeric 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 default specificationIllegal nestingNull control stringSpawn failure. DSW = Line too longToo many con00:XWSBgcurrent .XQT'sLabel not at beginning of lineInitialization error. Code: Command file open errorSymbol table overflow Undefined symbol Undefined label .Data file error, Code Redefining symbol to different type Symbol type error @ Internal error, Please submit SPRFile attributes not availableLogical name translation error.EXIT without .END:ƛڛ LBTA  <SY((((.ONERR COMMAN EQ=GE>=LE<=NE<>LT<GT> COMMAN COMMAN " " P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 Pausing. To continue type "" >ContinuingDelayingValue not in rangeMCR UNS MCR RES START CONTINUE '%DMOSRLZCXV.HNX^dzTRUEFALSE -- +-*/!&()#.Ht|,,,NSPSYSUSRi-)3=d@INDINI  *4>HR\fƊЊڊ &,6@JT^fpzċ΋؋ &08BNpxxQdsƁ{84S;" pp 062ZZ !L^ "u~a#!afa$ vLOqw<OqBx:Ayz}z8. &""b&0"bRBx(zX4zyK#<} #d$&&0 zX""`w"Y<}@%w""Zb%""wb&""b#" a't b'|~Şb8{~d*k~M*k~,*P[M ,!&r &zC;4z<@u~@z60zjL_M_M,\X\XY 'xx (T[zd"a &Cy$z.  Zx. ͊H̎8bt|˞˸48DΠͲͰnXʪRPZJT^DF=DL=XQ=GS=ST=CN=UI=&  "Њ&  Ϙ J "ЀJ "Ў&  J "Њ& F "Ѐ"Њ "Њ&  "Ў&   Ϙ "Њ&   "Ў "Ў "ЀF "Њ&  F "Ѐ"ALLANYCLSCSHDATGETGSCLSTOPNPALPSCPUTRALRTNSHOSPFSPNTRM   "6Č֌ :DzČ΍΍XFMS Unable to initalize itselfFMS-11 does not support your terminal typeVT200 series terminal must be in VT100 mode for FMS-11Missing Required ParameterIllegal sub-functionVariable not found or of the wrong typeThe .NET command is not supported in this version of INDIRECT">L\k|̄f~݄4Latͅ/M$Cc   r4w-w 5ew !7xu>0 0  F 7 ww w@uwvu` w 5t ww 7wEt L wxwnӥ.wXguA \פ:OuM@GuBu`uEw" Ru.u='uw @u V.,uz F.utt ut ug .t_ .ZtttTt t@t7vEs.;= "v r  Hu1}v07tv ,) ȥ|ȥ. ;w < 4Bu  v.@ *Cw*,vA*ww$t 8ʥa ΥaE ʋŕŕ7xwu7u7u7u7u7uxu   0JuB7 zt & \׭rtw, >ՇwTjxw Zx-Vx5 wlf&f AB DB5 u 5 5 saz & ffot 6v  |% v(5 EݬtuE  5  A$ƓotB tt7 sswtwPrw^r NAxs"s%ȥ -s E sUr-r5r-%*ȥ &7tsBms s vv7s  ȥYȥNcw*׭s 7s}vwv jv Gwrs ) ߆ &# 5r:v.ҕ.  5r ,mD.s 7s uuur x5rЃ $7u7u7 u7u7u7u5Fru杨r b [uu&  o7xu @&wfurrlu:c ,&w Ru]W WwBuLrFu L + 7/u %w u(r"u = 7u %A Ewt 00:XW`KTADATADATADATADATADATA & *wtwt d Bt >wtt ¥S t¥Mt¥H]qХ:]  Х:] qpӕ*ӕ Х   fHq "@& "׭.q OtD@ tЕ ЕRЕ:s Е-s s&Е ЕDЕ:׭ps -psP ݭs sЕ" PЕ"s5"p7sЕ ЕTЕ:ns = dsPЕ]Е:Е oN >s ^= P=Е.7 mllollsl7 lrlr_b\ !Ar)& +r"'5l7o Vl7 Vl)7bn ^leraLn  FlGra׭.n 56m7Lo lwX&m R   m m  !w> <T|n&.W;T l Jӥ  C > l: :     n .&.#n Tӥ   < 5l åaE Ѡɋ&  { y s&CBr Aƀ  .m||mbk7 kL 8#Ywk 8D kQ  E U  ¥,  w %lkkw 8 6 0G`|lw vl%%e @jj j  ` P jw!jA Vwfflwl rw!l%wlBr%>Brlk  E}x Bk e(j&l @ZP >9Е. Е:kЕ<A fA f  kЕ>i2ki i+ik V NkB k hRj `j pk  Pjk.j ~kWi7 Ziw"j Xwh/k L'k&k0 kwPk1 ijikk%ji `5 h5hmrj   m\jh7 h&hmggri j# jh ` R  jjj7 Zh j\h5 iiLh7 Nh?h;jei \4 Е/ЕLЕBЕ: d dhi wJ , i mW7 gA` 6  !@ 62j 6 w*ri= OOȋХ  EhBwVi ::&h   V!@ \6w*iW*5hW*7iwhf ,@A f hhe,D1 The@"$7 h   ||wrhw"phRk Jlgp 5c _7 "k5gȕf  5ȕ r5B>: n h`@eBge$&ĝj e? \g Ƈ7*gLg j   4ge, 4wZ@*< 4FF# @* :< 43#Ogwf J!# V z f @f  < 4eB 4 4* > 4@ 3 4f @ af :  ` L `t   ¥ ¥ ¥ ¥   Bʋҥ! BeN c$eeևd   cUb@cccwz> 3De` 2  2eb ke .d*d7YeVewPew2Wŀ5cWWWWe  U   eF A 5Zd; `9   hd7ddew.db > 2zbbUa7 xb7jb  XdhbTddbPd`bLbLbw, :    c7c Te> 81T wc-c/ Ї  &c * @ b > 0`cUa7 aawHcw>c7!a ( 7,c7pa> 0    :    Vb --   [ nc >b28 0 8 03b h H `Nb7 ` 5 &b` E~`]bx`b bbы   7 _UN`w,hb W7&e'`e7e|  &600:XWSBgE %IF  l ( |l. dݧddw@w         7idfd&  ) >O&   F&   =&    f֋w & ^7^ ^ ^:~`fw:w.w:ݧcccc7c&  R  p Bڀ y8 08 & B`ɕ]]B8 8 ( +  7]52]U 7 Z<]E[ы  ] (>wvX\]-@+% & &Y&?7\bw \B`\`Z` [\-\ " 00`\`\`h\`  : ^v]]r]( p&& & & W ,] *b %T 2%[]z\ )F L & (-PT  x] & -8T8]4]. T 4 S\\]]  f  K[ XX!C  ʕ !   7 V[7 >^7 0^ w&^n ^R w^w^o7 ^ B!ȋ=Х! ]]] ] ]]]   ]]] ]] Z7 ]Z &]] . %~]l] h]j]-f]xZ mV] R]  Z7 Z H'wYI   Y Y&& & & %Q%r%  @W Tf tY p w l ȥ#Ћ SD T  S M H{ d & f&%nQ& ) \ 5@X " b 2  0W.W X XX  wXXX  xX  w pXVC5Y%rWjW& X & & TWNW& & && & & & |  %nP%fP& )7X w*XW w4P VBW VVUUUUUUUUe   X0&f &"e"""UUU❀UW WZU RU BV-V%e-V PVB`-V  <`VB`-Vb&f AB #fE fbVw^V ew!PVjV@Vm>VU5 ,U5  7U d A E5T fEwT 6T 0 #  ` T @ l PwT R¥;¥! J DhR aRcTXRxREQpT > V"XT w  ! wTwR ¥!wS7S7V7S7 VS;VrQ/! VVV' ' V7 V VSɕ & f < 0 jV> ^S?f7 PV7 RV7 LV7MV0@VB (0Vȥa Ȉ և 6BE< C@U?RwwRRAU MUPU E ` U UЕ.JR5 tUnU% #` R "  6  ӕ  6 QU 7! RR R7Q00: XW`KTADATADATADATADATADATATѕ    ѕ 7 Tw QrQwP wP  ՇU7TT d UUe 0\T EtL L@ I`E3A >@7P7QB u&f Af f#5 5 ffpP7YP >  f% wPwPwPP L7 xP!tP iPPP PdND! -JP-FPe& 7(P7&P7#P .  * '~ 7 P7POO<O $O $ wOOO> V & ,& Jf   Iv   J  ȥ/ȥ$ȥ. Хa fOmN   J   2ʋ5MOOVJN!NMewV L( L# L&|N L IL I  BRNB MNW;Nb N N LM DM$  *ff& e w!Lw!LUU  ҋ ʋ ^N` N*e JNa ^ ^ 8&   l@    \ G& 6>wN;w" N N@N 3 A N NPN ,`N[N#UN{uwLNw A ^5K  7 $N0L ]w .&   J H y$09# 8wM> # 0%eb 58E7fJ7]J7_J& 0ȥ.MJ¥0¥7" ¥9 ¥A¥Z¥a¥z5G   J¥.¥$II 7I I x ¥" NqBLI : . @ B 2 8T ,RAEw~IH 7~I5?rI< C D ( ¥!$ !C &CBE` 7 ID Ӄ C H  C7H w w HwBw& & & & & & & 6e & |H & N BKVH  7FHG  $| ">F  G "e  & ?G**E**VG bX¥* &?P7zG7vG  DwdGbGG&eA[ȥ*F  W .wF)Х](  F!FbD f7 ZD7F@, HDDD@b8D(D w^w C 0 3 ¥ ¥   w f7^D4F5CBCB@ >&  F & &p&f&& Ε  & &p&f&& Ε  5E7EC@aJ X 7w N7kC 7HC7%>EBB(UEGBB@UBB&?7A7@7@t: n` =nB&   PB w@@@B w@ =UBB=ø7AAAVBd?@QB@AAUA9%<:%2:EAb00:(XWSBgj@ 7AB 7BC$ (@C$@C7A5@A `5U.A* SY0  ??5A2 <  ?ݬ?& ^C$ ?XA?TA%Q%PMr eD D` D`  D`: D` D`em>emL@B@e?E? & &Y`@E@ <m>@( b w`????H>???N>?   7?dB @ Е   d pʡh?~?1 `p" :?0?7>?  7 ??(? 7"?`7 ?7? ~H>7T=7>`7>7>>7>e7>e$7>e7>e7>7*= w`>: w`>>>> 2ɥ@%& #b> S fє1"# $ɥ. ѕ .>є t%Z( CeE-B>->>`0>0 En CeE= T =D|Z  = ȡB ʵuc=Eʋ  $?=w<ȇ w  wb  wd  w ??t w  N8   f<& & Bf.AeJP Е,A 8A xЕ,A lCeЕ,e  \A6 FЕ,Е,   P B~BBeʋ w 08\R& dB;  &5,;U75;p;&ʝ:  38 '8 88 \8r:7:7w(6 H  1 pU47 X ¥,  L ¥, & "B  Sե  5 B \֎& |ȥ0ȥ9   A \֎ % C`\&   &%  %\֎ &   & %\֎ &   @  L%\֎\\\\&f   &fw5 ~ fE%`    0w*1w EH\  P] A^ 8Е:%ʋ B$ \   5RЕ" eD pe d[Е"AH 2 AJ (AL Е.AN Е;AP   /    HХ"Е" A%s+! YGY9񘏳_ߘͭÞY׮SIϥGOTOSETSSETNGOSUBDATADISABLEENABLESETFSETTINCSETLASKNRETURNASKSASKERASECLOSEPARSETESTFILETESTDEVICETESTPARTITIONTESTDECOPENAOPENROPENENDEXITSETOBEGINCHAINPAUSEONERRREADSETDTRANSLATEXQTWAITDELAYSTOPFORM,@~nn6Ȋ2'&1 < < <0 <( <$ < < <L < <x < |<$ t<, l< d<T \<8 T<< L< D<| <<H 4< ,<l $<t < < <4 < ; ; ; ;> ; ;T 00:0X;2X`KTADATADATADATADATADATA;P ;X ;h ;8 ;b ;\ ;5ew , Bv     5Bwn 50  (r- DUt-E D  E E ܁&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&  m  f A N  %&f &ff |,''vW  &[q$W @TITISYSYTIOV0V,L00 & & @( f  e ee e     W# Q l ,R p     0 0 0  n 7 f& & A&f?A`e  P! 0 b `Aw f hfLp $ -  ~ v n` BJ  ʕ=XR  : r n  : b w2 }w  Lȕf ,    % r ww 6 eB eBzw N $&< #  D  " w   h  w   5E5 E5pE~7 x pE   5V 2 &z x  | t bɥ= <8f Z 8 5   ~n vw  &  ~w B*wrBL CB CO DI FF LI LN MB  SL TB@ VB SP    v7 CMP>00;8XWSBg differences found No differences found/ TIRl &% NSY RR  Rp kQSYSY  1 n 2    ' -- Illegal switch or switch value -- Open failure on output file -- Illegal /LI value -- Command syntax error &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e '&1  p , |  t 8 l  d 0 \ | T X L $ D  < L 4 < , H $ D    D (   $ X# # % #5ew , Bv     5Bw 00;@X2X`KTADATADATADATADATADATA+,50  (r- DUt-E D  E E ܁ l&w:E U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&  m  f A N  %&ff  &[q &[q`  . DDlD w 45 funhj uhdB$ 0jwaw< 8 v8w &  V*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 x5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 * w  8jDl@ TeBT85l@ (@( D feB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@w 7 *     A  5f    0D qBCr r &   r vŝ X& N D P r 3  5  2  2 w 5! 2& p  2  T& @5:I  Е-& r  A L Е, A  2 Е, Е,Е/Е; Д/ @f    2  ww @ 61w  @ v*w:@B 21 1ap1 6 5$ 5 W  x5p |% |d|%XwLe`  & B&. w3au qss   55l; 5V5 ve  |% W,  @' '" w $' j$'" w-@ # :  tZ' Z'$ wB L~' ~'$ w <f pp  ' N'  w&f&f ************************************************** -- 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|P^SY00<PX2X`KTADATADATADATADATADATAf  |eE   1,1,J  1,1, 8Z# n< # TeH  '&1 V D | V $ V V , V T V  z 4 D 8 |D tD X lD $ dD L \D < TD H Lz  D < 4V ( , $D 0  D    5ew , Bv     5Bw FCST; 50  (r- DUt-E D  E E ܁2 2( 0 &w E U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff  &[q &[q`D 2 2  2 V 2   2 D 2  4 z h 4 Hh h 4 h h 4 h h 4 h h 4 h z h | | h   w . F,B  Jf 4 jbL4 PZ  Z χU @ v fpvU@7 r7 `@ <  UP6,""e,w  <B  $&< BeA| ?| p x x Af E PAT>&ef  bpd `$ " fB` w (@f  FBĵ'ĵ%% %e$e e e & ĵ V 11@ Be zw 5 funhj uhdB$ 0jwaw< 8 v8w &  D*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 0jjlj ɥ@@aujk,bp v5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *w  8jDl@ TeBT800<XXLXSBg5l@ @( D $eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ &f w 7 X V: %2 4  n 2 %     %   7 w ^7  # bB  2P &*B   , ,eV2 8B:7    * B77 & U l J &f w 7 H F: ~%2 4  ^ 2 %    %   7  hB `B @h d7ee%fM% l,  l p ee@w*^ne   * B77 & U l N z N N &f w 7  : &%2 4   2 %     %   7 p 7   ZB R E A d&*7&B P  f ^740  BB#44,0ޝ  7@eeh!el ŗŗB  lweee^,ne   R * B77 & U l     &f w Pl5   $ P2T    .w  V ^ fn W! 8  dl  , ? N ,w 2T w XJ? r "  42 *dpa ^ [ 6 6 ( Z @F 6eH x$00<`X=dX`KTADATADATADATADATADATA & e77   7 >  *BeHeH5 Zp ": `HP 7>W!x> B > &<  &W @E ..@)  `Q@&  @m1E@c  B&f  p %NPAT -- *DIAGFATAL*- w 8Dt$ NWF[ fp |  B pBl 2)\%wjwff&8Xu  0 J i4bA_Illegal error-severity code %P %P %P %P %2NFile %X has illegal format%2NError during close: file: %X%2NError positioning file %X%2NUnable to locate module %2R%2NIncompatible reference to global symbol %2R%2NIncompatible reference to program section %2R%2NSymbol %2R is multiply defined%2NUnable to open file %X%2NUnable to find file %X%2NInput module checksum is %P%2NCorrection input file checksum is %P%2NError in file %X checksum%2NI/O error on output file %X%2NI/O error on input file %X%2NCommand line error%2N%VA%2NIllegal indirect file specification%2N%VA%2NMaximum indirect file depth exceeded%2N%VA%2NIllegal switch specified%2N%VA%2NIllegal file specification%2N%VA%2NIllegal device/volume specified%2N%VA%2NCommand syntax error%2N%VA%2NIllegal directory specification%2N%VA%2NMultiple output files specified%2N%VA%2NInvalid file specified: %X%2NRequired input file missing%2N%VA%2NCorrection input file missing%2N%VA%2NToo many input files specified%2N%VA%2NNo dynamic storage available %P %P%2N&f |:,CCW  &[q$W 2b !XTITISYTITITIOV&|pb $!p|p & & @( f  e ee e N ,!H n ! z!-z!z! ! Z!T"  V!. *-F!F! n$ B  B    6.${  e w w e w w !s ~p 7 l z & ! X) Υ   h!$ x )w  .!0!$ P 7 !       2#  5wf6%DT600=hXLXSBg.$3 y w7 P6" $wee*E%,%CT 7 V$ j5 U 7x$ D w E$% et 0# % U % 5Uw  w5Ce*5. 5@0l2p  0"0$    5 5 U5Uw43,p * 5@ 0l20,  0 436 t% * ^  ^ @ wEee*%%@ %@ @ 0# U@w*+5  *., * :*5 E00(.. ``00`! U(.w ` $ n$ 7 ^ H P7 b D" :) 26   & !7   )ebw `w ^7        ~&    w% v @w5vOU : 8   Q$ %  e 4 >   ew  & %M  b v 0,<8   ve w5 *E%$0l. p "p $ep ep 5%% ,. $  DCE0Ԥ 5 : 8 >ew  b , f    % x% % ͘  <  0 T!H! e    ,.0 % Ԥ$  ! h 4! X0,<8 wZw%% w",$%.e AeB p  &&e%%%.e  L  pp& %  A  B $ &# v7 n  `m^ w T . Zw "`wBwwwwwwwwwwwvwwVw2w>w*f& 7&#PH#&#   5Z j0 >$3 -3. 3e3, 3*++30  3 33 h!  wf c e <@%  .27 2$1 )     *a Ra! ! v r% {! d  w`f6# f vv7 (  # B Q 7   #C #B rK   %   ȥ= ЋCɋ"ы  ыɋ C " @e  Bz7 0 0$$7 > j % w% w7 &&%% $ 5"ZX P pw`Few >86@  N@e :@eA AeB @  R l$A l"p0% %    `A aB Bm D u U%'&1 <  4  , | $     0   @' @( @&' @' @' @$( @,( @& @& @& @' @'  (  $ R' R0' dJ& |( t( l d \) TR) L) D( <( 4( ,  $N)     * , * * * ** <* <* N* N* `, `* `X+ r* r* * * * |* t** l* d(+ \ * T* L* D* < ` 4  ,* $&* &8* &2* &* &* &* &&* &+ &+ &* &>* &d* &* &f+ &6+ &,* &P+ &+ &* &* &* |&* t&* l  d D \ \ T8* L8* D8^+ <J* 4 , ,X $$ L 8 < H  \*5ew , Bv     5Bw 00=pXdX`KTADATADATADATADATADATA50  (r- DUt-E D  E E ܁!8&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff &  m  f A N  % &[q &[q`    D&.D&@.D&L.R.D&0.d.D&D.v.D&..D&`.@.((((@(` (D!*n!**#*<&*lN)*`+*\r-*$/*004*34*6*8*9*<*@*lA*&C*8E*JG*x\J*L1n0pPh 8x@ ABORTBADBLOCKSBUFFERSIZECOMPAREDATACONFIGURECONTROL_CDENSITYDESELECTERRORLIMITEXECUTEEXITFILES11HELPIDENTIFICATIONINTERLEAVELOGFILELOOPBACKPARAMETERLISTPATTERNPRINTSUMMARYPROCEEDRANDOMRANGERECORDSREGION_IOREPORTERRORSRESTARTRETRIESRUNTIMESELECTSPYSTARTSUMMARYTIMETEMPORARYFILEUDBVERIFYVOLUMECHECKWAITWRITECHECKUUm۶VVm[mے$II""""UU !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@@!!!!!!!!! ""ky  0 M did not respond is not ready unrecoverable error at block is 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 unexpected error #Fatal file system error. F.ERR= ^COnly ^C allowed error threshold exceeded (octal) (decimal) data compare error at block Good Data: Bad Data: Word position: Buffer contained . additional errors Byte position: ,Fatal system error. DSW= PC+2= unexpected request to queue I/O - request aborted...IOX -- READWRITEREWINDWRITE CHECKWRITE REVERSEREAD REVERSESPACE REVERSEWRITE EOFUNKNOWNNo buffer space availableAborting due to user command No activity remains - abortingUnable to create/delete/map dynamic regionNo such command - type H for helpCommand not unique16.08 with terminal support and regions: j E###100=xXLXSBg#  P $<. $%  $$Q %%'&$ IOX>P IOX> w (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$ 0%%u M 5   D , 8 ! S n( (! ?T ?J %  :6 2 >7  % e e7 =5z *r%*E -e  %  %  $ " @%7 &@?| @ w` *wL  wT7 ,f@A 767B%<7 &f  does not support the commandww 4we Jp6 6+ %@ 27*5 `(=75 .$y{@  s"% %U ;@60 6 pU "%w6#e $ T& &Y@ w` (eEA A A A w j#wLe?E? @ @#K3   #U # e  KE %DT4#  %V#U p   %DT  0 3 2#>7 87 @A *C '7    llC bA  e0 0 ĕ, e ' ĕ0 7 ?    AmC Cm u  Mw>@zZrN vH Tʚ;@B'd e7 t' tԝnj< %DT 0$ s 3 3 |  @   2 Ees ,Ӈ,  e  7 '  515 .7 \''5!5z7 V'r q gE $ ..  '' p'''@00=XdX`KTADATADATADATADATADATA&V&N &F&>&6w.( p  E UE@ U@E UE  U E  U @(<(  H( >L,e%" 1> x%:1 1 Q$ `   :p"p$   " ," 1,$pp p"p,  % 0  a ff a Q ea e`q  ¥.Ћ $ ȥ:ȥ,Ћ ȥ; h( `('&NOYESMM @MFj@MUj@MS@MT,    $  o6 .$33 y544 460 0 *% 8@6 0 0 *5** U%DT *5U* R3 >0 U 6.${)     ; 8U v57 ))  !  $f) 0 E  F@v' >@' 6\+ I/O is unsatisified at timeout - function:    Ћ &   h ¥. Kȋȥ ȥ ȥ;  P)% )@AZA Z h¥:)z# ) p%ee>e  A@az ԋ is not configuredSyntax errorDB377: is not configured 8 ) 7 7 ~ ) j%DYP @ l0 0  P) 0 0   %M 5 E%4 @ w`7 \)fև @' failed to detach failed to attachDriver for DB not loaded )(( Е  7%7=(&#L"  - 7^-V#!%|-BT ~T  !9&$$  > ewL ҕ ҕ-ҕ-ҕ 9& s%d@-w 7 -& & A%B7  & &Y U $;.$w6 $*&# PF40,  : 02 "# W #2#  V#7 .-T-1wf E1@b7eE00=XLXSBg@ @ @ @ 7 e 77 #j-  ԁ`Ћ@ R@  Bw   LeEw@W w47 ,7 `#\7 Z#V7  7 7 7 7 7  Ewf vwj- %%  # e@111%DT>  $ \@'System does not support AST'sCTDBDDDFDKDLDMDPDRDSDTDUDXDYEMMFMMMSMTMUSYTTA-?- 7 mw mmw mw m7p ( h x- - . ! V-  @ ,<k. *{. . ~-  w45e e  . d d. X%%%%  4  - 4'0l p p 0l"p 0l$e Xe%%% F  .!%. 5  %DT -%DT. e: e -. v% %  J. Zw  P. F  5. ".  ^tld 5. <d^XPJD7. 5.  . U 7 . E  # 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 wR n( fd& ^@( VdJ& NdD& F@'Summary of exerciser activity at A C C U M U L A T E D T O T A L S : - - - - - - - - - - - - - - - - - - min.. R/W requests totaling . blocks with no errorswith errors. records . bytes AST's executed: . Idle-loop iterations: Unreported error count: TIME -- Run: min. Elapsed: min. Remaining: --  lf T7 T w  > . Y.  (%dѕ  $% -5-5- -%%. .>%)% 5 0%DT "%$ - x%%  .N%55- B5- *55 -  5 #- 5@- - %2 - - %< - ?% wP7 #G  . n. f߷ z  7te~- @.% /   / - e ?( 4  "- /8/  - -   - -% -    f/  # t" !m Q$- L1 Dl/ : 6 2 b V N -   D 8- w% -w-  @( dJ& @' @' . -> .:.VFYSELF11COM RET WRI RAN ERR=INT=LOOPBACK = YESNO Buffer space usage= Maximum effective BUFFERSIZE= Device Mode Buffersize Filesize/Records/Range Parameters------ ---- ---------- ---------------------- ---------- Task Status Command line---- ------ ------------SV ERRORERROR WARNING SUCCESS ACTIVE QUEUED .....##D#x##### |#l#)r#~#j##h#x#p#9n#Ez#Jw &w w7   7wh, *wȥ= Ћ T,N, >؇7|@ ч C #3Z+O &%>  2 7 ,  ", 67-# K %DT>  ݴ, ( ȥ=  w-НzНw Е:! - w7 VNF , , , ~  , n , bߡ  00=XdX`KTADATADATADATADATADATAw6 J h t, 6   f( ^@0( V@' N(+++DISKTAPETERMINAL is already configured specified device type is inconsistent device type not specified - defaulting to 'DISK' Disks: Tapes: Terminals: DB377:w `(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA 2EAa$-7  a jwZ Xwv%Qj%b  ^%|V|N  ЋMm EA <,B@ # @ Q  eI%ɕ ̥#̕  j  "# % @2-111e 1e1f  ,%d,%X,%L|, Fwn(- )% e- , : 2 %R- A - ! L-w <( 4(&f unable to executenot installedcurrently activecompleted. Status=WARNINGSEVERE ERRORSUCCESSERROREXECUTE command is not supportedInvalid task name ,,,,, Q|Task " " is 7 ȋ   . 8     L, , + ++5 ++5+   %% + + ++ + `Q7:%4 , ^% $$, B  E%3%% ‹T !,,  e@  @v' @' @,( @$( dJ&VFYSELF11Mode= Function= LBN=. I/O=AST queued VBN=In progressIdle is not selected -- / ??   ȋ% :Ћ r4* j4*:* IOX Command Summary: ABORT ;abort exerciser run ABORT task ;abort executing task ABORT /ALL ;abort all executing tasks 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 configuration 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 error 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 ;output messages to a log file LOOPBACK YES/NO ;loop transmit/receive terminal data PARAMETERLIST ;display exerciser parameters PATTERN val ;set read/00=XLXSBgwrite data pattern PATTERN ;list available data patterns PRINTSUMMARY ;print summary report immediately PROCEED ;proceed from ^C state RANDOM YES/NO ;random disk access mode:* RANGE ddu: low:hi ;set LBN test range for NFS unit RANGE ddu: ;list a unit's LBN test range RECORDS val ;set magtape record 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 ;select 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 TEMPORARYFILE 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 idle 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."commands" are certain commands which are used to overrideexisting default parameters. w (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA 2EAa$ȋ A,7 ,ȥ/;7  :w ,w  |%Qz%r%|l f#,7,P7,J N 8 > ЋХAХLХL  /,#F  %%8%%Q%%|+%|A , C@B@ %% $_+ %> , x ' @( @' ( @$( ( @' illegal density syntax error is already selected???? Density= BPI Characteristic Word= MM @MFj@MUj@MS@MT, -s" ---r-ȋ 0. " X6 . "u. x. Ve  _!  -u. $ w  D  P  $ Z   w     ( 2w 6G. ,@ >eE"?     /"N&  0  Rw8 Z . & 0w w \wfwVwLwBw8-$ $ $$e?00=XdX`KTADATADATADATADATADATAE? A Ar+  RN735 .=8475 u5 Ur$;.$R2Y  2 2 2 u5 w .$wj  eRSS7 , &%e7 .SS B@$( :( 2( *@'Syntax errorCommand valid only in Command ModeInvalid pattern numberUnits are selected - command ignoredEffective BUFFERSIZE is too large 0 = Random Data 1 = 2 = 3 = 4 = 5 = 6 = 7 = 8 = 9 = 10 = 11 = 12 = *..%.-.5.=.E.M.U.].e.m.7 7 0 .  w770 u  v U2wN<2:.:00`. U@ U U  U U  // ⡇  |E`  77w10wKU l7    jo . 2wVp,b%DY \ 1%  Z "1wf %CT:%DT6 &3 05,( Nn1 .0 71å1åg1    .  5 U JjE  0  N%0  0 ~,  60 ,w~.,0 ,wvއ %  <  P@1s3 3>  ߇ B <& 50@ 1 RG#. Al"` "Hd0wneEB%DT/0 T" "%DT;0 \ /  w.0 vC0%DT%CT hbW05 RK05 1 @b0 ^%DT%CT 1 '0 p*1" 0w2 4%0 < )1 & mw l' x) ' v' |R<( tv& l@T' dR' \d& T( L& D( <@' 4R( ,vD& $L& ( T& D& ( @' RD& R' R' ( $) \& @'J--^....-,---:..BUFFERSIZECOMPAREDATADENSITYERRORLIMITINTERLEAVELOOPBACKRANDOMRANGERECORDSRETRIESVOLUMECHECKWRITECHECK buffer size is greater than default is already selected LUN asignment failure is logged in buffer size being reduced to typeahead buffer size VOLUMECHECK failure. Unit contains a home block syntax error is not mounted or allocated for NFS operations error while reading home block is not ready illegal range illegal densitySY 1 :7 \ P% 7L 7D%<w70 b 542 5E ` 6 ,. &( 0 ,  x @+   0 0 X 45 L| v < "W+ H R<( |R' t( l@' dR' \$) - unit now deselected is not selected7 : 8w,\ w7r7l - P wV7N7L7F-- @ wJ& 0 CKU ` wjp4U` 4eB&:ږ<  <2 xU ZU@ -- h  p$  4@"4e#   ^`-wU p. & p,  6 5E4 j`00=XLXSBg40 4E "% 0 0 re  lR-T d @ h4 L采(e< Tᇇe2 Dه x) @T' R' ( @' L& ( D& ( RD& R' R' ( @'h,,,t,6,COMPAREDATAERRORLIMITINTERLEAVERANDOMTEMPORARYFILE syntax error failed to open temporary file is already selected LUN assignment failureSY Z # 7 N  D# #### -,--        #*~#'x#$z#!|#r# F  h# l#p#n#j#   wJ   J$6 K %  ( j;, wbw 1- :T" w $$ 47 ! $- " ߡ |M7u- 5 8 ^3 -"$  &% @- X--p"p$pp - Bf-t- %"%$ F- %% 2-  l' & @' vD& ( dJ& @' ( @'No activity to startSyntax errorCommand valid only Command ModeIOX Version Command valid only in Interactive Mode syntax error illegal range is not selectedUnits are selected - command ignoredREGION_IO command is not supported . -> . l; h! D l,%2e,%&=, 6 &+7 *!   , % * ", ` 7 7  N`  w` eBSY_M %d"f# & * .# ++ @!  D,% ,  +f# +w ( @(Failed to open log fileFailed to close log fileFailed to open existing log fileFailed to truncate/close log file. F.ERR= -. ******** EXERCISER STARTED ******** ******** EXERCISER TERMINATED ******** ******** EXERCISER ABORTED ******** ******** LOG FILE TERMINATED ******** ******** LOG FILE STARTED ********%Hb8&d \` . /+/N/m ȋ!wJw 5 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f  V P aAAf@pnp 4C*8֋ 88*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ jŀajTI& af* n*`V @e,w &jjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ ,DlljaCeH###33 & 录8 *@,,w  8jDl@ TeBT85l@ @( D eB& l & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ (Command input I/O errorFailed to open indirect command fileIndirect command file syntax errorIndirect command file nesting level exceeded00=XdX`KTADATADATADATADATADATA : E 8,  &;57b7` 1R&*%Е Е ,1  2  Е:   %7  7, T ¥: , D  W"C, ȋI,w,w7wwD , n_, &9eL  RP @  t`L ,  `W 3 s6  `W s)C(eee jV C&  C&( >&p( ' |@' t( l@' d@' is not selected invalid block number duplicate block number syntax error block number out of range00=X>XSBgM,Iz W  &[q$W F(SYCOSYSYTICLOV<0(Zʮ2SYCOSYSYTICLOV(zyH>0<M0$& 06     &K짋Ol| !!!+)  j ePk6     c 7ee %Ol4J%|.F(      "%{    ) Qޡ sΥ;Υ8:7  &D 7  ) J ) sL )  )84  (  w 7  F00 E3FGOl|(Ol|7 lAfod׭R[1  & 8B" .$d`b7Xv $7 p  wZXFHBŗ&ť1 ! < $ĝ7D  7B7 Z$ mvB`00>XdX`KTADATADATADATADATADATA7 lDW W  $ W  JW  n7@  :2 .+ 7  ׭  r 7&f  @` Ew wf " ŭ  2wvB  $R e   ;8f Be  -w  , W!p-wwz  &f& v '&1  ڱ  ڱ   |T tH l< dH \ T챪 L$ D <L 4. ," $h `  챎   챘 N 5ew , Bv     5Bw ɮʯ50  (r- DUt-E D  E E ܁tRʯd&w"E U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&  m  f A N  %&ff  &[q &[q`  & <ڱȱȱ <ȱȱ< ȱȱ< ȱڱȱ~~ >` p>< ><1%OlJ%|D>>60"XTV5z !", ~7jTD@F5.FhF700 EDFUt^BBPBBPBBP„00>XXSBgPPP,P@TPh|PPP [0"z [2"z [0"z [0"z [2"z [2"z [0"zcc[1!}c?21 J15m1;66r3g14;22;30;38;46;54;62;70;78;86;94;102;110;118;126;134;uvw]7 7 7 7 7M7B7 2-$ ݞ `ŀ   |ˋ7 `[J 冡D$  1 1 -&H7{vޡ 4.% w뷊E7 |$& | B e& NԷwA% W  | h BҋB &7xw7  )BW=T5Q-M7 7  7 7 d# *w!  w  7 \7 7 7 Jw\D1  5 ҕ[Ҕҕ] \F冡< n   Dtplb ^1 1 Cŀ;7<9& & & & & & & & & Ε   )) 27ulk7 7 D7AD׭%׭  - & ׭s׭i 7 $ w#~xA B `E`W!p ABC w L7 L7   247 ,n gw ; 4 +  ŋ  Eww rw Fc ŕ  ɕ  E!ŕ  7,@je&f@ 7@Bŋ$ť1ť+׭</ ť0  ť$E`͕ w** 0w*wGOl|(Ol| D =a\[  7 wXeH 8 % f% %MfVT% N%xQ ,   f71׭H1@77 & & & & & & & & & Ε 3+ & GOl|(Ol|׭J $e r H7PM D n79$ηơ@-G1 7 &A B*^ H 7B8A VCDB H1 .HJLNPB B`8 l׭  8 &)_&& & &  & && && Ε @ 61&  1 )ȋ& & & & & & & & & Ε   1 &   a@ Bmú:v%X%P:%P file ID-%6A-- Open error #%D. on file- %2A%O:%VA%6A-- Print error #%D. on file- %2A%O:%VA%6A-- I/O error #%D. on file- %2A%O:%VA%6A-- Job limit of %D. pages exceeded on file- %2A%O:%VA%6A-- Attempt to space %D. pages beyond EOF on- %2A%O:%VA%6A-- Printer hardware failure code=%D on file- %2A%O:%VA%6A-- LAT connect failure code=%D on file- %2A%O:%VA ƻ̻7"7(w WEw EwE    wP    wP    00>XdX`KTADATADATADATADATADATAwPE x7   "   7 01234567890123456789%4S V %4S%4S%Y%4S%3Z%X/FI:%P:%P%4S01234567890123456789COPY %D OF %DDELETION %VANOT SPECIFIED P P >޴% !Օ >w\]^ |Е: V Д eHeB 2>me!δ= δ % 7%> :@ 6eӥ. % 2>²FRS ²Fmm ! RS δ²m= 2 JʝE NδFmK X "\ 01234567890123456789%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 FEEDJOB CONTAINS ONE FILE/FI:%P:%PJOB CONTAINS %D FILESPECS&&q8 P 4P >Z%pq n%Օ >wVF2H2J2L$  >me%F=F  7%> f"N R eHA |eJA pAL f N  %t d>²FʳRST ²FʳmBm>m:% RST F²m 2 ʝLJ<ַ F Fmʝ 5 ʳm- jF JF ` .c|1!_1Cx! !B.cB]C!w1g1cB.X}1A>!c1cc1FET1*B>.:#B]FRѹ^A.Fs1z1N!!GB 0     `    7 8C &f& AZAJ090$?.P8;V2:\,]h&[b ,n$z'!-t &# f eaDE E e0  ҀDА  %w D Е  w8   @f8 $  L%Fw pĝ"%!  |$  ,> X*$²~ @$Ff ($ ʳH $  & & @( f  e ee e 00?XXSBg|,ZQW  &[q$W Az:TISYSYSYOV0zR~TISYSYSYOV(MH?0|0)LB:[1,6]ACNTRN.SYS*Hjlpx|",0Djtv".`v~+w w w^ wr w @f h5nf R @ml\ȕ Hpfw,f5 f *DIAG* *WARN* *ERROR* *FATAL* I/ODSW???= -- DE- f$fEĥЕЕ Е Е Ĥ?d ^ P Е.Е %  `-h7be~ Al v$& & &  &$& & & Ε )Fe Z f&P&N&L&J&H  &^&e\&e*+ F ߦp abneɋee R *$ ߥ PR >2ߊ5 ,ߊ5E4ߊ5?E45 @ e?Wt E54mpEfߥ)5^/ T?B Bm: _2v2 m d`5 6* *T .f~?~! ~4/U ( @U@m~tߥ.W0 2PR * *E@Dj6R&,(U  6zSY     f v41& F b5bΥ: Υ ΥΥ/Υ   X ^  m05$   Q3+A  톃<" 2-Bt"rr l v< 3 \W s:&f& v  & & @( f  e ee e ݬ&MRtÅ+[8\y~əo׷ eęt 00?XdX`KTADATADATADATADATADATA>Q:aUSystem command handling errorAccounting not supported in systemPrivilege violationAccounting not activeUndefined message number %D. at PC %P Directive error. $DSW=%P PC is just before %P FCS %3A error code = %B %Nfile: %2A%O:[%3A,%3A]%X '&1 l l l l l ¶ Ƶ lp l8 |l< t~ ll dlT \~ Tl Ll Dl <l 4l ,l $ص ~ l  d ~d `5ew , Bv     5Bw ^}~50  (r- DUt-E D  E E ܁Z~X&w E U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&f &ff &  m  f A N  % &[q &[q`lZZ Z~Z" ZlZ6 L L L ƵLصL굢&L.L6LFF $SET SHOWSTARTSTOP ACCOUNTINGNOYESpPz_Md 5 E  D ' f f wf  f! f" f# f$  CRASH_REASON EXTEND_SIZEFILE POOL_RESERVE SCAN_RATESTATISTICS_SCANSYSTEM_STATISTICSTASK츊ع\.ѥ/ d>Hآ   E~U(,ɥ ѥ ^ ѥ: 5VUNE@wwpww5*U"tH ɥ ɥ  J707P@ ¥ ¥ tH 5U fU H 5E HE@H*5@U@ $UE5\ U@5J5 U: w5.wU"@ ¥ ¥ ¥M¥SwWp<wtH¥  5 wU  vw4HCLEAN_UP MAINTENANCEOTHERREBOOTSCHEDULED_SHUTDOWN00?XXSBgSHUTUPREASON FOR SHUTDOWN? Lѥ/5 2ѥ  *5(#BZ H 0PU7t lwPw0w EXTEND_SIZEFILE SCAN_RATESTATISTICS_SCANTASK OPTIONS? \.lѥ c nF ~7 Hxɥ/ ѥ  IB4 R Oѥ:< >ɥ ѥ 25@U@&e5@5X 5Uw\5Ew>5UEwww DATATRIEVEDTR INFORMATIONTRANSACTION_FILE ATTRIBUTE? OUTPUT FILE? ѥ X BUɥ/ ѥ  JB H Bie l7ɥ: b7J7L7N7P7R7 &  ѥ  B 07  ɥ wFw r7 B ,5wn 2 4 w 2 w7 ɥ ѥ  @ɥ 7 /:,+- 7 ɥ/ fD |2wfe ^S   P   `E   ~  x` Eew &^ȋPw .P&&fL r.tt Z d B L 0   &% &)f@ɥ ɥ ȕ   ɥ!ɥ "ɥ ɥaɥz P  6  ȕ   ,Е Illegal command or parameterCommand or parameter ambiguousSyntax errorTerminal I/O errorRepeated or contradictory parameterRequired parameter missingValue out of rangeSYSLOG not active2w5w  $w$Nr J7 $lhfb^`\B><~8z4x6v2trW,UwT UwJW, Uw 2W"Uܶff t "e \  $we fM fU  *pp f *ȕ ֨0$p (f N#  eBB 99 f   ֨&& 8#-&& FFf    RB Ee`%  D~% b  % ֻ ֨ ֨eq q"9q,4&& & 00  & & & & ܻ& & ֻ& Ε U)O  n<& ff& ڻ& ֻ& Ε ) *eq  Rf  6Իf  "Իf   f   ֨   vf   Error bit set. Cleanup before restart.Accounting not activeIllegal filenameCan't open transaction fileCan't write transaction fileCan't init new blocksCan't init new blocks. I/O error = %BCan't write attributes. I/O error = %BCan't write attributesCan't close tr00?XdX`KTADATADATADATADATADATAansaction file@zZrN vH Tʚ;@B'd  T ACCOUNTING DATA - 00-000-00 00:00:00CURRENT FILEUNKNOWN TRANSACTION TYPE: (rRre5x J LP2^TVr\ F : 8' >5 BAJ U Z 2ei8q (r{ <r… r6   46  2@ B6 (rr#8.< J U5Z DhH{L P R 46ñ <6ýr2r rr  2 r2  $$ (.&7 "6E̼ 'L@4x fQxYz' L 2W[rchqw 2  2³ r½rr <r*2":K\m"~()2"2* ,$ &2 (@ .N0h  2r™  2   &f< ge b5 fC ֨ 2/&  me  ы w 5 wf< . L5v ֨ 5f w B:77  h v%7 f  | +T FCeJe ( ef    &U ݜ  BBle eC  Е= CCaBwB eBle eC  Е= fC DDa Ble jeC N Е= CCaД% ЕTCOД f DЕ:Ble eC  Е= fDDa j ȭȭ@  ~Ble eC v Е= CAAa% % %AAE & %ȭЕ.e Bl .eC  Е= fAAaS f   nwwȭ& fBe eC Е= Е[fNa Е,` Е] CweCa% B & T 5CB (efC 4 e  ˋД &7T`%PC&5 .%/w  ':T5FT (T Te7w00?XXSBgxBCB > 0=dw,&fE&.@AC   llC bA  e0> e  0 A@|Bl &ХTХI oХSХYХSqХT ХAХSХK Х=7 f wX wL \) ,%CO 5 CmLwd % /f& ,߁wf' ߁fO ߁wBmd r&wF7 ()7 "b   m7T -&  D5u u C0CC. C5 0<@ԀSYz_M)!֨2Nbpp f@ :݁ bȕ h$# fA ݁ &ޱeBsssa(s s UNT^5#  2r2 .2 " &!*2.B 0N Y w (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$I/O errorNo accounting data presentDevice specification errorTask not in memory or not activeIllegal file nameOpen errorB b(8(Ƚ<ȽȽ64^ b(@B6(ȽȽ.5DHLPR4^Ƚ(Ƚ ȽȽ b(Ƚ(   'L@4x  b(Ƚ(" b(ȽȽȽ<Ƚ*("()("(*,.0&( b(Ƚ( Se& e Fƶ52ƶ֨ƶ \' \ e  ыw <wfN h ֨  w B7  B   vNhP CCaB  Ef&C DDa e CCaД% ЕTCOДf   efDDa   Pe fAAaCE Cы%f% PfȸAAaS  ȸ  \@eθPPP@~ffNaЕ[ ` Е, Е]  7 dCCa% B& T 5fC4 (  ` Д xN <N NwR<@ԀSYz_M)!֨2Npp f@  ȕ $# vfA  eBsssa(s s Upv5# h b(Ƚ( .2"&*.0I/O errorIllegal file nameOpen error<JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw &fe&  w r&ff=elC    5p |  d j  \  A H&@d <&@ 0&m M M` M`5u  @ @ e@ M`u 5`BAW @ `u  #;eu o eA ZeS S S B DCeS S S A 2eS S S B ee @    e  T T T T H1CdT T L $)dL t dL d  ڸP&BRRRRr0v»00?YXSBg ѫC z_MzdѫCSYSTEM TASKS rѫCw5w w w7 d Xw7|V5:e 4wr75  hawVw XwT@>8fff e D  fw5$r rr ( d ( kNVU@P % Lr 5,e 8P *? J? PE@ `+)E@d z 6w2w e f f f wNf xw> t֨ Z f  L j pp rf ȕ \֨¹$p (f N#  eBB 99 f f  LB0:[1,6]SYSSCAN.TMP;1 SYSSCAN.TMP;2ENTER: VѫC  $# R *qfI f, P- X=B   $,($1  ֨ L*fJ @ ^ $fK & r,   *fL   ?f9 & & & $& & Ε & & & & <̼& & Ε f: n z*   1 ֨ f5  ֨&& 8#-&& FFf    RB Ee`%  D~% b  %  ֨ B֨eq q"9q,4&& & 00  & & & & & & & Ε U)O  n<& ff& & & Ε ) *eq  vf  Zf  Ff  2 :f  Accounting already activeError spawning SYSLOGSYSLOG not installedError bit set. Cleanup before restart.Secondary pool allocation failureBad SYSLOG queueAccounting system not startedSYSLOG exit with status = %DCan't close transaction fileIllegal filenameCan't open transaction fileon scan file openCopying scan file to trans fileOn scan file closeOn scan file deleteEnter reason for the crash (Maximum 60. characters)Terminal I/O errorCannot write crash transactionCan't write transaction fileCan't init new blocksCan't init new blocks. I/O error = %BCan't write attributes. I/O error = %BCan't write attributes00?YA1Y`KTADATADATADATADATADATA)7 w 5f  5lf3 lw2 j5J fv|U@28 :5> ? R? XAmA Am E* *A  5 E 5AmA Am 6  E@ 2   l 7  R\ww Accounting did not crashAccounting had a fatal error, must be cleaned up|a,RRJW  &[q$W vSYTISYSYSYTIOVҳZV#$ҳҳ !i   eAe]0nX 2 }f X P 5 W#b ~w)w`8\f22b%" e^v' CDA>PxJ00A8YXSBgMMMSMTDYp`H@HP @( 8@  @X`hb   P P ~   NSYaSYsySYu~먫D~먓sq$CT$u~>MCCCKD8DFF~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~;'yI;U#U]RUfShShyso^?SYB f| CDA -- Exiting due to illegal trap - Snapshot dump being attempted&.& B\eG& & & & \e %&<)& & &  D`& & & Ε ^  w  %NCDA -- Error writing analysis file%N > > > > > LIST COUNT EXPIRED%6S%P %VPf&f& 7 f&ff&f7 P 0  ee m"  &f BE 5E E&  & ` EEm  D `D E& ZT p&&f eZ  f5<2 &  ^ H  l  z  W x^  p l nT x5f-nj &f-    5 ee f&f D f&fP D Ee0 &fEB   CEX A EmH ,%F CRASH DUMP ANALYZER V %Y %2Z 00A@Y1Y`KTADATADATADATADATADATAPAGE %D%NCDA -- Analysis terminated after %D. pages%N > > > > > ANALYSIS TERMINATED AFTER %D. PAGESfhzv  & P 7 heZ-*  7  %4S%P > > > > > ADDRESS OUT OF RANGE&f5  V F   e  e^ d A  T%NCDA -- Error reading crash dump%N%NCDA -- Device driver missing%Nm f 5 f%  ŝť ťť &  .5 f w%NCDA -- Error reading file %X%N& 0 460 x  t*eHz '&1  & %|  & % %0 % %T T&( f&( |x&( t&( l&( d&( \&T) T &, L%X D & <%$ 4%L ,%8 $%< %H &) &( &0> &* 'x, 't- ,'0 ,'0 >'* >'* >'* P') P') b'0 t'* % '* '^* '/ | &t t'p) l') d%@ \%D T &4 L') D% <':) 4(( ,% $(+ ((D; :(*5ew , Bv     5Bw U#V$50  (r- DUt-E D  E E ܁%$V$%&w E U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff  &[q &[q`%%% % &%`( %%%t( (0&&(B&0&(T&L(B&(B&f&B&(B&x&B&(B&&B&(B&&B&(B&&B&(B&&B&(B&&B&(B&&B&*(h&B&'B&26H&'B&46p&&B&6(hB&,'B&:(XB&>'B&B( B&P'B&H(,B&b'B&J(B&t'B&S(@ B&'B&Z(HB&'B&\(B&'B&_( B&'B&e(B&'B&g(B&'B&o(B&'B&q(B&(B&r(B&(B&s($ B&((B&y(!B&:(B&(\B&T&B&xJ&L(%%00AHYXSBg %NCDA -- Unknown get command line error%N%NCDA -- Command I/O error%N%NCDA -- Indirect file open failure%N%NCDA -- Indirect command syntax error%N%NCDA -- Maximum indirect file depth exceeded%N%VA%N* 0 b p f `ť(ť ťťť( ( (()&h&fN) U. w 5 funhj uhdB$ 0jwaw< 8 v8w &  6*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 jjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f00APY1Y`KTADATADATADATADATADATA`nw^uhnw@ xDlljaCeH###33 & 8 *+x+w  8jDl@ TeBT85l@ @( D eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ ACTIVE TASKS SYSTEM TASK DIRECTORY (PRIMARY POOL) SYSTEM TASK DIRECTORY (SECONDARY POOL)(d 7 (t(V%))&ڎ7 ڦڲe%))ڎ7 ڦڲzڷevږ%5fe5(  e5: &  (U(  e۳  -EXE@ RDN MSG CIP RUN 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%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:f&f7 e5UCe"Q$"~ "| e# e$WUP e$KU8  e$|U ++ H5lЈ Ce&ee+ r Ce&e5-e з e eг e$e `d r lCe$ fe!C  +%/, օCeCeCe&e5    e   Ce d, PCe(Cee, *Ce , E Ce$* , CeV* ;- 5 5* *00AXYXSBg f- Ce* J- Ce0+ .1. x.4ڂ CD5DmF H33 @e% e % eՅe >3 e e^3 ex3 e3 3eԇffe w7 5@Ce5r ..e4+^ v3  Oee5V. Ӄ j6 z. 2 eE555.(ex few/$/ w+wee1/ 7 xp= EË )%;%?%C%G%K%O%SwEU%Y%]%a%e%i w"1  B1$u_1nu1g1`1JY1R1K1D1(t=2f6+2 X/T2 J(q2(NONE f&ff&& k ee `e`B eNeJ  &  m  f A N  %MAINSUB TASK SYS RW COM RO COM DEVICE DRIVER SECPOOLCPU d[]<>!+())***R* 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%P)e4)e|M)) lB) j%6,6, َ7 ئز(w ( Xm  ^   F jw fvve h QFev%6,6,&d؎^Z7 PئHز $%8 E 5,`w e  w5d׷eז%J%:,:,׎7 צײ(*(  62eb%:,:,&P׎JF7 <צ4ײ(׷e$ז%  J*- 7!-- B* A7!  އ 5jk* m<4A*b"A&A.${)$e)  ) ) P . )5@  e  e*e& 5@Ue ))~)e )()AJ*  00A`Y1Y`KTADATADATADATADATADATAJ*(-(-(-(-(~.(^.(~.(~.(~.7!$5* ^5U-  (7!( 7!(5(+5'($(5(5 (5U - (5@~(  "&fv/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 5-7 v0$11P{17!5 %5 e/15 56AL1rdb17!\2 Pee><@BН$НН6Н1 /2 V  20X2 l݂ eX  7! eB e8؄ ffZ  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%r4 epen4e5q5e5fe`Ce %4 44CeeeCe425 45a5p4Ceeee5Ce ehՇ &8 '7#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 7e26d` #7o7e   eeee 5@Ueeeee 7 Be&6 7ee%6SWAIT QUEUE:&feeC6e26  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 %4A77&fe <eeN7 7 %6<%2A%O:%4>NONE f&f.&& 8!eeCeCe00AhYXSBg NeC`E8 e &  m  f A N  %((([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]%N5 5 xPr K(+||&+@ D D D D D D eD  <+ V @+eD  eEBaD CB e߄  f&feD eD  MEMORY DUMPf-6420.%   %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- -% ,& .  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]%6S00ApY1Y`KTADATADATADATADATADATA > > > > > 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-x (-eP-p..eڃ H7 F7 <0N %"7    $7    . je5@f a\/ hr/e\N/eP 0/ & Ee-xrp Pa/e B B B B B B D D D D D D `D `e?  &(&f  ^  ( e AP P z  - R -.& (( T  J(h X (X .(LJJf& -7 @ ><8R$  *" @%   a. $P- R (- RS (-.e 7  7z&f&f( ׎ X  F(R   ( ( C f5--(/ zر%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 3 7!w!7w  3f3 eD 337 R$   7 7  &ff NJeDB@ Pp p3 4% ,& tA4 j w`3 rew  7  @ @f&  `E L\6  % & `E <6&  m  f A N  % 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 (eX(we w-z-r e&e5wbe7F((e5,( )eL*wV5:e05( )ee&Ce  Ce   ')eB e4Ce$w%e& Ce  FE`5w,Cewe Ce CeCe5-- ^U@-- E)) (pn^ VmXB % B eB eD &f *$*  ee we׳ eV) )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]00AxYXSBgfwd7 \&fVT7RwPEHE@7 R7 P7 NE,(& D j 2 . 7!w!7w  .f . eD . .7 R$   7 7  &ff NJeDB@ Pp p. @.% ,& Rc. H w` . 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%e>0ev%D P0001J1~1Ce 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 mapping(|(5|%5 % \) e)fE5 B  L7 D 7 > 2 0 ,(&fe AP P &  d ((R (-7 f&((7 R$   3- t) !f( R ((RS ((e (7 "&f e')e2(u,(,)a-), p)-)f/`*/*0 BSY@-MNT FOR MDM OFL-RED PUB UMD PDF SIO@ TRN MUN MNT@ F11 COM PSE OSP ISP 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 00AY1Y`KTADATADATADATADATADATA %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 4+,t%44bӎ\X7 PӦHӲ( CeE%TTUeCee  ?^(wlETCeL55<U455&CeCeCe5 Ce5wC &I+O+ W++PCeCe J . Ce5=/65  Ce Ce 5P,Ce Ce +Ce5&,  V0 7 ef5(CeD %(5@+ A p  eb.Ce E B  7 t5@xCe7 bwV5Vn.5$5@x Fҋ XCeY 5XS5@PO. < ? 9Ceee ѳ e  eC  eC eC   .ѳ  / Ce5$!/Ce& Cee%MTzee E eׅm w%ewf55  {0  n 0 xm  mX/ Vdz_/x(C Ce  pe L4<ЋECe  *v - -- &fPCe CeCeCe5 E50.+Cee&Ϸ ~e erϳ e>`V  C.Ce n. C( feC%#eC%_e Cα e  %6<%2A%O:%4>NONE f&f&& 6!eeCeCe eC`E6 e ffZ  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`{fI7  ؙ&  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:((WN%--&<َ627 (٦ ٲe%>+>+؎7 ئزطeؖ%e5 e&e5wR(wR( (( e&ڦ e e(ٳ ( v&Ce:%0e % Cee  ( %Ce( Ce CeCe+) CeCe00AYXSBg$Ce<b) Ce  Ce  ) vCe$Ce:Ce.Ce0) BCe&Ce(Ce*Ce,*e eP** 5pe05 ek**U e*Ce %XCeބ׳ 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.../Ce 2E`5>Ce  eeCeCeCeCeCe Ce eCe Cee 0 181E1Q1g1%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%:0e8Q00Ce> P eE (%  A |1 7 e &f,0z&@Ce  Ce  efdw`1 VсwdCeE%ICeµ`B-?& :00ee%.-'r  (0eeeee0ҳ    &e/e5'7 e<e&e5e mX3 3 e  < %6<%2A%O:%4>NONE f&f&&  4!eeCeCe NeC`E3n ed &  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<<<<<>>>>>)Z)x)))PI(x A)= eP(ťťe X%ee(  &  Ee f&f& e <eB eA 8eA < *eA < eP( f&f%ee eee % e)A  ) 5 e) zQ6^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%b&($PHN( 00AY1Y`KTADATADATADATADATADATA4,0(  \eC  Cen(( lCe( VCe( ) <5)Cee EC5eefP) Ce51Ce *Cz) )) (,C) &en)))Ce en)eJfCee =(9C3 ) e( )  *e eC` ee %5  )* ߱ffZ  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 -\5I-- (;C~-~-e CeCe Ce--‹-P.Ce |-Ce rb@. ^ h0   x w(&eD fEEe E eD & w* N\eD   *v& x"k6 w& Y 77 T.sE - EE`  Q.ѝxs^.$*Y E(  *Е,Е P **k. ڀ. % %@& ӕ%ӕVӕA!Q Q.`sT. Qe|. rK+ eCee  Ce5 Ce 5Cmf  J.z2  فm %e eC! e. r+ 277 e*- & X.8eC' B$^3` Z e. z3@+  . " &+ȋЭ1Н)d%6<%2A%O:%4>NONE f&f>&& 3!eeCeCe peC`E3 e &f& v &  m  f A N  %00AYXSBg%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.%N5iU& & Y5|]e(($ܷ `( VP)7 F"(PP)(f=ABC ڂ ځ e e< e<P5)e &$J)5G5?^ 89f"e\e!e h 5f 2* eA ^ 8E$ * "50 & & & & & & & & & Ε %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 2pn&2 8(56565`6 d Z45  \55@ R.5 @# (())& (() (C)s)) b,Z<7 :7 :7 87 ~ 2 5M~ w5E؇ >؇ 7؇ 0~~ڇ5(5$ w555 D@    eE 7~؇w75`Z(\ U D 5:U@0 wwN7-@ - w67އއ5@p 1 1  W    wh>556557 &7 $7 $* w w w  vw  w` 5* 5$ ؇ 5 5| xlj؇ |x^؇ njR؇5^XXLTH؇5HMB:>6؇ 4C5.?("؇ 854ׇ -5)ׇ "5ׇ 5ׇ  ݇5 ww ( E\( 1~5B(( #0 , 0 0 ( -D >-6 ( &w̥, ( `-m.(  ( `( %7  w  wee7 &fwlh 7 `7^b @,q `-KacJE[ !m"@  ) L R  7 f@  &  5]U E :&@E A  ̆  E vE cPN 941 @  . &f 1     8  " .$  ̥ZḀ90     w F(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$EXITLIMITLINESSPMEMSIZSTBALLCLICPBATLACTSTDTCBTALHDRDEVDCBSCBUCBPCBPARPOOLPOLSECPOLTISTDSTASADVTSKTASKDMPDUMPKISKDSKMRBLCLQCTLDECNETNETCACHELOWHIGHSYS111111111111122 2 22222!2&2*2125292=2A2E2J2N2S2W2[2_2b2f2j2q2u2{222*= x3, R3ț5* /32-$3+ 43B3J3  2 :<32†+2:†,+2:†:+2ț5H+ /d32p3 :†`+2+ȁ5,+x3/3ʆ+. 3+3,x3ʄ5 5 555555@555555555 \544<5<5<55<5<5 p5 p5500AY1Y`KTADATADATADATADATADATA5 555555@&5-5 DENS44I44T44Y44=4:4+5,5,5,55 =25:255/55=D5:D5΂L,:P55‚,:† -5:d55‚@-:†N-5:‚\-:‚r-:55†-5:‚-:†-5:‚-:†-5:†-5,x3/3ʄ.[.5ȃ46...@.6;@.*6:5H..6[.5j.66.5Ά.6,‚.].j.6;*6.6.6."6;*6.6̂..46$(46_(46&  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%N5HU@U<& & Y & fY ( w` (&= E 7 ڷ65@?((   :)  07 @ .U 7"ff7 ɥDY 7 5^ eB$& t # xUw5# "( eB$& [# U5 1  "((eB$& 6# 0,( e p 0 5.& eB$& #  )n)eH %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 N %??B!B $  . zc r e # V0p YV zSP   $  &eH(0p /, &)&  p& & & & & & & & & Ε E@U @:( ^pRTeH( %NCDA -- Symbol file %X has illegal format%N%NCDA -- Symbol %2R not defined in symbol file%N5 7 7 Q$%@7   F %J w(  ( D p)~)))))))(&X1-+-(̵ %$ #-@ %$%% 0 (f  ( %NCDA -- Error reading symbol file %X%N   \ *eH* 77 & UA 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 = %P5w>|% %l|  ee %`T@PeHe00AYXSBg@e8e05jwJ( j(%­ \+I+e\Ý m2؋%(e.x+ -wt 5(( %   +   )  +) ~ [)eb7 )%*7  < $%+ * * ) |* n* d* Z$* P*e!+ e9+ 6  c* B*Q*   8w -(5 |   %*+  h) ^)  0 ` &*%|%* 0 &f  %  C CE e) @%<%8%%$-x5-j %ÝN m 5z  2%e&e"*0<rx2>DJPV\X^j 0.jBNT LOWCORE ALPHABETIZED DUMP %2R% %7S%2R% %7S%2R% %7S%2R%~1111\1 Hr07  N1 .1 &1 1 x1 8  r0& x d^Ze TVXZ9]99999: =:@]:: 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. 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 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%800AY1Y`KTADATADATADATADATADATASCOMMUNICATIONS 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%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%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%10SFPP%8SSYSTEM HAS ENHANCED FLOATING POINT PROCESSOR SUPPORT GROUP GLOBAL EVENT FLAGS GROUP NUMBER =%O ACCESS COUNT =%P GGEF DUMP:5w< nEh`5w) 0ee eEe)en%B-Z*1* F#L* : (D a a\*~* ^ w! P<ew& E  ԃ  * +%z*e |P w҃  3+ FPewEEe eX+ +%%++  , ( ) .e , ) 5:  eC5f:e eC1- 7 7 7 7   w 5we` `pw-k i=fv ~aw!x^ ˎ   R  @5Bː -e- $˄ e % eeP. eD_. --5 DeDe ; 6;e Ceˇ%8S%VPf&  00AYXSBg  l@  @ @f&  `E L\@  % & `E <@ f@BHN  d~(z<R.B6Zb,&JZltH82n*>:^4LXRt"*6$("VP\hbnJl,`Zf06$F: &D8p|rN$hr |Hv~@LFzd<x~T4T`xrx 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 %P~CZCCCCC $$*606BH<BNHNTZTZ`flrxr~x~ &,8DJPV\bhntz &,28>DJPV\ b"(h.ntz4:@FLRdp|  $*"0(6<.4:@FLRX^dv|HZ`flrx~ SYSTEM COMMON ALPHABETIZED DUMP %2R% %7S%2R% %7S%2R% %7S%2R%&F2F>FJF  rB E7rC`-f: C 7 R-<@C -.4C C -CC  e A &f :0 w&fm-&ʰʨe e  z7n@`7j@`7f`b-b\ZTC P eB 6A CE DCb JTF XF \F `F  F $  &C V~ e w w w w wW ED# DE!E5S   "  4S%BPw1S%P (dIIIIRIXIcIsI 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 F,IeZDI P& A"Ie> ID%  AI &  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 REGIONJ(en@<(( RJ $D!N <!FCf&e e |Be!*e \e R-e!eC) ) ) wnX) {* wZ * ee5e J7we N ,  :  E   D D D D D D f& ee0*ee $eE`7p(()eA je2:`D jeD  , `D JeD   E`D eD  * C* f&f* eD eD D eD  E)&  m  f A N  %00AYBY`KTADATADATADATADATADATA|,?a!W xW  &[q$W A΍gSYSYSYSYTISYOVQ΍Z9:Q00BYXSBg00BYY`KTADATADATADATADATADATA~!>!~!>!~!>!~!>!~!>!  <v!\!) 00BYXSBgp#$9 j p# % #"% p#% p#% p#% #% # % #.% p#(%7A@@RTUC LB:[1,2].HLPEDTHELPEDTHELPEDTSYS LB:[1,2].EDTEDTINI.EDT00BYY`KTADATADATADATADATADATAL19::܂, &[q &[q`::: :::T< :::h< <:;:<(:;:!<: ;:#<@:2;:%<:D;:'< :V;:)<|:h;:+<`:z;:-<:::/?;:;/@;;.<;|;@<;<@;;;<::@a@x@rp<Backup past top of buffer 1Consistency check failed, please check your file0!Error opening terminal for input@/For 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 closedPrint 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 - File processor device read error%IE.2DV - Rename - 2 different devicesIE.BVR - Bad version numberIE.BHD - Bad file headerIE.TMO - Timeout on requestIE.ILU - Invalid LUN< ':' required)Cannot set terminal type from change mode"!Could not align tabs with cursor2!Error opening terminal for outputBHelp file could not be closedRInput file does not existb!Invalid parameter for SET or SHOWr'Line exceeded 255 characters, truncatedNo output file written!Output file could not be createdPrint file could not be created+Sequence increment must be less than 65536Unrecognized commandIE.DAO - Data overrunIE.WAC - Accessed for write%IE.CKS - File00BYXSBg header checksum failure+IE.RAT - Illegal record attributes bits set+IE.RCN - Illegal record number - too large%IE.ISQ - Illegal sequential operationIE.EOT - End of tape detected'IE.NNC - Not ANSI 'D' format byte count<Aborted by CTRL/C/Change mode can be entered only from a terminal$CTRL/C ignored4Error reading from input fileDHelp 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 65536Unrecognized command optionIE.EOV - End of volume detected'IE.WLK - Write attempted to locked unit'IE.LCK - Locked from read/write accessIE.HFU - File header fullIE.BTP - Bad record type'IE.RAC - Illegal record access bits set'IE.FHE - Fatal harware error on device#IE.NFI - File ID was not specified)IE.EXP - File expiration date not reachedIE.BTF - Bad tape formatIE.IUI - Invalid UICIE.IDU - Invalid device or unit<Advance past bottom of bufferCommand buffer exhausted&'Destination for MOVE or COPY not found6Error reading from 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)String 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 - duplicate entry in directory-IE.STK - Not enough stack space (FCS or FCP)IE.DSQ - Disk quota exceeded< 'AS' required9Command buffer exhausted during XLATE command processing(Editor aborted8Error writing to output fileH!Include file could not be closedX/Internal software error - please submit an SPRhInvalid value in SET commandxKMax line number exceeded; lines no longer ascending; resequence recommended-Now enter the definition terminated by ENTER+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.NBF - OPEN - no buffer space available for fileIE.RBG - Illegal record sizeIE.BDV - Bad device nameIE.BBE - Bad block on device#IE.NDR - No dynamic space available< +Attempt to CUT or APPEND to current buffer!Command file could not be closed*1Entity must be WORD, SENTENCE, PARAGRAPH or PAGE:File attributes errorJ!Include file could not be openedZInvalid buffer namejI/O error on work filez-Max number of lines for this buffer exceededNumeric value illegalPass bad status to caller+Record too big, truncated to 255 charactersThat key is not definableWork file overflow!IE.LUN - No file accessed on LUN%IE.CLO - File was not properl00BYY`KTADATADATADATADATADATAy closedIE.FOP - File already openIE.BNM - Bad file nameIE.ULK - Unlock failureIE.WCK - Write check failure< Attempt to PASTE current buffer!Command file could not be opened,Error in command option< File name:LInclude file 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 - Device not readyIE.VER - Parity error on device#IE.SNC - File ID, file number check'IE.SQC - File ID, sequence number check%IE.RNM - Can't rename old file systemIE.BDI - Bad directory syntaxIE.ALC - Allocation failure<Attempt to re-enter EDTCommand file does not exist.Error in range specification>File specification requiredNInput file could not be closed^Invalid entityn!Journal file could not be opened~No help available for that key/ORIGINAL line numbers no longer an EDT feature!Press the key you wish to defineSelect complete lines only5To return 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 useIE.BDR - Bad directory fileIE.OFL - Device off line+IE.BCC - Block check, CRC, or framing errorfꗯ {7 EHE@ @<` \ w7~7 x7 rtE  lH J{z 4Z} 6 }  } | ,j R y r| P   R, A D > j g  c ` ]Հ W  T i&& v| A > R, >A 7 &e& d&  ՀZ    $   <&   55@5:7 w> W yX7 X @  l I y$ R, j@ Nr{N` Rw q7 J, > wd wcX Y7 w5  b^, @% wj NHHB q:e) a =B`   Y7 rwz5j  ^, ?%wh   p -r& 7 es kf ^, R? YN`a = a& r>e w .q 7  ^,T > p X_f 0 #  4p  Of  n  p  :7 T7f 7F / ^, p>Nf& W  lJId X7  ^, 0> peMe PBf b v eJ, =e4 , .a = 5 l J, B<% a = |o e }e BdB,  v`ȋȕ   R, L=N Nf rh Jd VeHff f% BV  TR, WD @  lPI uA5 @l& f-^a-^\ Y5$5 6n7 -^H5 5 n7  J, h% 2 (-^)W D tje `B&f ‰e    D w9a 9xa& :e zI lU  aaf nW  e0 Q % & $U& &:e s hQ ew 9  e% GE 5= O5 k :2e $ fav.v |e r p`  B 5 >l ` w08  f %@ l|I k% 2k %B %  k "P@,`6tfZz0 J*JP``,T"",,TNo ;4J ;L ;RL ;L ;hM ;M ;dP ;&Q ;rR ;R ;N ;,O ;nO ;4J ;K ;dL ;L ;N ; P ;R x;R p;4Jw6 f b% w&fV& f7e fV& L7e 2fV& 27e 5& & Ke 0"7 N pQ -7 4 w 7 w 7 "B@ 7  2 @$ e%a' Nq%-vV `dd"ޖ%T h >n  6cpn n7Zr0 Fxe ,50 "e& fJ  :P&&& z5  P-( xp% fz&& _% d#V O wN gxa n4 "R, 5  e E  5 & d    0 c g aV V O |Max& 4 e e ( 5 RwD3 & aa n%  \3eV NA ڷ kw fٷ Kwٷnl؀ 3a a ne!-<8l%*l%&!ew~25nw QPaa n% Pہf 3r&B` Ҕ Ca  @  a HwD NQ<a a mePa a `m% V M w 5v5!fa hR% ɕQ& N \8 - 7#T [5" K0& Νf aP ;  N `\e  fL$f 2jWYWN WAWQ  L Pa a \l% efl@ ȋȕ f h / FR, 16 (   F -|^  ^, 1 cN v%efW  PK  W f  w/ s;`(f `Ֆ%w5 -b  FI-*& e0a ~/ Ν0a f/ a >/e&* x]% -  lV i 00N`& N J5 N r&l%> 2_ %55 l%l%! 0p  Me  ZR, /J <  ew".J (2a / fR, / & hI D5e <0׎ La .Էa %a - 2`w @af 8/ a ~R, /n ` eG a $xba -t  ZCN L 6-^2 / &  b d f50 N   vV PHew5 `5 N >`\a 00BZY`KTADATADATADATADATADATAD$ӷa &`5 eZa , ^ \ Gx^a ,xna t,e x&a X,5 6B&a`a pZ %5" d-H^  lV FGe&g _ & ( * >5B gjaV VV TG.a& T,e V (G.aW de E.aja& ,e  e,eJw* aa f% 2 *f$e b,Ѱ <^f 0[a a ^f ^5 Ye  %5 XX >cӀ < ] kf,р77 ] mw ]MAINPASTE line deleted line moved copied timew606 $6 6 ,6 (  ~R, 8F d eU\C6  D    D=> Q 6 5 5 k 6 ea 6ar >d  8Qe / Wp aa Sm% e a 5ar c  Pewd Wq vaa 8Sm% e D6  62.2a,a J5wx"a 46 7 L w^-^50wR J f5aXSݎ  a 4TCe a b "a$a t3%W!< ar lb 7  Wq w a a Qm"% % wmW 6 0.46 ((,e,,a6a BI5  ( * , ߠ6`ew5<a& H5@a VS  vNew5$ae& 3e ٰ-  .NU@5J n<a& jH 65-0z t ,xF& T - M5 h5 J(aV ^ L% @a `R eN6a JR e e05 6 V H]a 7feew~1`ɋɕ &&  R, 3 eewf1\@  # lV~7 ~w xB   lW lk7 hd^X~zv5xW,w0@   l,W k*7 r7 f47 .JF 7 @7 W&S7 P-az }7 t--5 V P 6Kؖ%y--5z V P Jؖ%7 ^W,wVRB Zw,R w ->-:z0w,4@   J '& u !w ~W,Xw-7 -7 cv @ '` ΐ a ja pj  :& F0wV JwZ)7 T&W,ww7 z*7 $  7 7 wECW!w   l>W h 0&0F0 f0000    Vf` -eeJf&f` -%}v E  6B  W W d H   6! ^@ '`B af haf h w` 9&f .Ֆ%wt p*wj f$ff %7 Bd H fG1& Ν e ew>,6 6 >5hv aa A5 5@a VL {& & A5 a ,Lepe5l*~ z& & A5 a Ke N7 . D'' Ng e 7 (7 "6v aa A $a' f $ю$f ,%V Fee ew* * d NF V ,f dfa X,  00BZXSBg0a >,Za0& Ν& & & & D1 D& JeZ& 2 B Eea1 +xe e lineMAIN=> r (`Tz  ,4<4< ,4:HNV &,w6 6 & 6 6  > Q ` vaa ,L5 <R, 7,  e 6 y Iaa K5e6 L & & K5H"a V eK-r&ގ# fe 4w q& & BK Ha U e5pLJa U  Pe ew4 r R, 6 w0 q5 5 J@ 5 $T  T ^, R, (6 he n *h S F. ,ޗ aa IeLew3 > `O @`ȋȕ 6 R, b5 ewn<6 6 6a a >I w L: f % dI !-^ C \V <* BN >N hR և5 *o ^, 4 hf H a& He a R a& bHe a R Twb R,f 3 eea R7&eef5 a H2a 62e @`ȋȕ D R, p3N eq d  ێ e `  M R, (3 ee P 8exa 1 z -^     ^,0 2 daee t R, 2 d2*^V dV L Jeew0$ R, P2 er  7 rځ  15`-5*5'-^ 5 jF5& 5  &^, 1 %  Hl d xK x a $0  apV  Ie ^, ^1 Bce e&&&& \ew/e 7 6  6 v`v V-R -D@m6 >5$:552fv. ~e %f l% cئ| E.   Zmܖ%5& N 5"-6r J$ W!r& elp 5Z M%efF  7 . a-^ 5&  a% d rI  r& zԇw-)@`ȋȕ & R, R/N w 6  w-^se6 va v!W  W  & Fa c e  _e w,5vw KPaa h% PՁf -r&B` Ҕ Ca  @  a PwL VKDa a gePa a hg% V $G w 5v5!fa pL% ɕQ& N V@ - 7#T U5* E0& Νf aP 5  N hVe  nF$f :dWYWN WAWQ  &F Pa a df% e line resequenced substitution00BZY`KTADATADATADATADATADATAw6 @   lT pqw(  v= Ne%& $ :R FQ  nP dNew"A @' &f{5  5>H& I 30&a ~|% #@ 7 e C  NM%m7  M 4L C |& w  N: LtY`V p"S O%$Sb f,S bO%.SS 4S DO%6Sy X>S &O%@S-@FS O (  LSRS[ M L w VS N%XS ^S=dS N MnS N M |L w fzS jN%|S NS PN%Sz5S qSw@   lZT m 0&0F0 f0000 B7  C " :K%m7  K J C A A' B7  C w J%m7 H pK I C 5 S1S .5 SwSwF701 f% mS M H4 -6SS L J%S 7  C  0J%m7  J I C  J.b`S Lf L vJS pL< =DS f& HL >Je w20 D W /U  `W"#fa tx%  `ehTf`&  u5e ee w/ * d 4K V ,f hfa >1  ݮ0a $1Za0& Νz& & & & *6 D& OeZ& 7 B Jea1 0^e e linesNoneUpperLowergeneralexactwpscase insensitivediacriticical insensitive begin end unboundedUnknownVT52VT100Hardcopy, scroll, noscroll, eightbit, noeightbit, edit, noeditV3.10-00 COPYRIGHT DIGITAL EQUIPMENT CORPORATION 1980 & 1984 COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1980 & 1984nonumbersnoverifynotruncatenokeypadnowrapChangeLinenoquietnotabtab size ; tab level norepeatnofnfnosummarysummarynodelimiter delimiter nowps wps Help file name: autorepeatnoautorepeatInput File: Output File: **Readonly**t6"8Rp,F ":h $.$ &,GOLDW.BL.EL.L.C.UNDC.UNDW.UNDL.EX.BR.ER.CUTSR.PASTE.CUTSR=DELETE PASTE. APPENDSR.?'Search for: '."".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.SHL.FILLSR.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 ` f,~589:XFHfIKN,f7 \  f7 & 4 4ׯ0; (ׯ"!= ~  D  Xl% 8\ .Z%^l% X ^ |X Z0  Y! w? @ `  ҃ -& N$fe%& @e W# P% p$ ~ 0A  wt? peMjğfuEŸZE R  H D  lP z* % ۇ^ &(P S 7(P F   00BZXSBg ( 5.   & Ο  E 7(PeMCe B f "%    w*>df`b-F ->  "@ <.7 &W 04W 91x* 4>* p= 0 6 6  a* < ee7W %W AW Z W W W &W #7 W %z Vfp FVWW _kW "W '`5P_5 '7 ( * &-  ?- r7> R7 P ҁ   8`& >> &e 7 d ` W ! Tr7p lef VFW  *p 6 -! E7 7f 6f h=p e f -te+& f ; e@ w>;  ;w lP Z v7 (B.f r7(% ~W W _[ H7% i-x*ew0k&e V%lZ N g 8% ^7= bxhwr^ph MI: % ,$p1 -  w uw vw  wu*l h% * 9ׯ.1x'606 6 WpeNa a 8 a* P8e   w& p7% 07%!@1 w-5j sg5 vs7 & % Mp-xlAp `1  7    7 d,!1 ҄ 7  1q7ݷ r oo5 r7 wH  5$-:: 2.  W W W /W "W 'CC wdz܁p w2bVP $-4!-,;>B r5nwH & H% 1 vt<pP| *fe 6 *& e 6e]WQ-@ = ~:rpA-h0 b- ^*RP1&->   -b)h%!., t *7  ew3  lU zn8- 40-  T6Q`5pɵ rCE CtE &P&N`& *4e  #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 )` ,`&*)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 #" (%+% <"+`h1;90c*A4CbHu rNLQ#U27;%JS'4@^l6&pvDtn\~J&FpdXFxjZR>NV^<  p^.DVvf>(b.aCHANGEBCOPYcDEFINEaDELETEBEXITAFIND;FORAHELPsINCLUDEaINSERT1KEYaKEYPADNOKEYPADAMOVEQPRINTDQUITqREPLACERESEQUENCE2SETBSHOWSUBSTITUTEATYPERWRITEaVERIFY#*TOLTHRU-,ANEXT;AND+=.jBUFFER9ENDYBEGINILA00B ZY`KTADATADATADATADATADATAST9ALL:IRESTkBEFOREYWHOLE/QQUERYQBRIEFSEQUENCEDUPLICATEcNOTYPEBSAVEBSTAYrNUMBERSNONUMBERSBCASEREXACTbSEARCHqGENERALrBOUNDEDUNBOUNDEDTERMINALQUPPERQLOWERANONEDVT52UVT100DHCPYaCURSORAGOLDsCONTROL"ASNOVERIFYTRUNCATENOTRUNCATErVERSIONAWRAPAWORDcNOWRAPbSCREENQLINESAMODEQMACRObENTITYCPAGESENTENCEPARAGRAPHRCLEARORIGINALQQUIETsNOQUIETaSELECT2TABSNOTABCFILLaADJUSTcDELETEcREPEATNOREPEAT3FNFUNOFNF3WPSrSUMMARYNOSUMMARYaPROMPTDLINEfKEYPADNOKEYPADHCCHANGEfINSERTwINSERTNUQUERYCTEXT3ENDBPAGEBWORDDELIMITERNODELIMITERPARAGRAPH2WPSTNOWPSAUTOREPEATNOAUTOREPEATwCOMMANDRFILESDIACRITICALINSENSITIVE"CI"DIFUNCTIONfSCROLLNOSCROLLEIGHTBITNOEIGHTBITDEDITfNOEDIT+)(?FV@<W61vd}:JAcS^ -+5. $wsh|UPG`[|v83Ml` -"Z!`Mlfq0E=3w@e Fw@e  # < . ! 6 j ` l|*&j ` ` R|wb@e   wD@## ¥ ¥ ¥/0¥  ¥ (¥ %¥/"¥ D##P Je w{#f y% ~7 7 j7 j7 n7 f "ԇV7T¥=H¥,¥ m<67 64.7 .w . "7 U¥=&¥ N7 7 7 7 E UUwh U  n'7¥,¥ w:  L7¥  xUzwD I%w N D jI%w¥ ¥  4¥/  f¥/,¥ )¥ &¥ #¥=  ¥,¥( ¥) ¥[ ¥] ¥< ¥>  D H% D &¥  ¥ ¥/  p¥-¥N `¥O T¥J¥C D¥O(@¥R 2¥EK¥O[D 8H%E  EUE  EUUEE r E U E L UEzE & U^UXENEH¥ ¥ ¥/¥ ¥=¥: ¥,  ¤  B  EDT>Invalid option switchSyntax error on command lineInvalid file nameNo input file namedJOURNALOMMANDREATEECOVEROw;e 7 7 7 7 \7 V7 P$& tw.%5wF$2$t=L f? wB@ [e S5l5f$3   7/%v bxtjB$.׭nb$ބ׭R$^Y}TJ$N(7 w :e ,_'["WJ$ " ;3$& & & & & & & & & Ε f7 6 6 6 6 ) 97 7 \7 P7 & =6 77 7 7 7 7 7 7 7 7 P7 cc7 7 7 7 7 7 7 7 @7 FB7 @<7 :7 7 7 7 7 \7 jl%|7 7 7 7 27 p7 . 0 )e j x7 <* O 6 a6 aa M5 U5  = e wNPa X B U@N0 7DN&0 7FNF0 7HNf0 7NN0 7^N0 x7bN0 h7**a' r *fN >7%V nRe(w0**a' r 놎*lN 7%**a' \r Ն*rN 6%**a' 0r zN~ 6%**a' r ~NT |6%**a' q N* P6%& & LN pa N'6a ae V :Qe,#ܲ5H" (hW  =TU.&e,@ ef& & dKe  P :7 -8 N U dP%5  - z 5& & Je N ^P 6 500B(ZXSBgx& & Je  0P 6 =p$-R-@T (_ f& & PJe l O V6  Bp f5l *o6 6 N=$ a& I5 la >T 5 e=7 & & I5 la S 5 aa fI na S h5 e7 7 ew:3 aa n5%M 1 1 w:aa n5e31 1 w 5a a zn5  3 3 Ձ e % * C*   ?[EOB] .!?  PASTEMAIN)B.JOU;w CdD E DdE bEbH wC D EHwr&&    dA B dB b( @ A B N  Tf f &f &ff we~fC~w  ~@w  N @Ԁ %! - mC a  v  M z  h  V  D  2   f6D~  f6D~     f  @ P ``` m  : & : 3*&j : :3 )ڝ 6 2Wއ 6 "W҇we4@ W9, : === =@wDe8@p@pp V* 7*f  we@ RV wxtr %%geBfe A : v p (e(Nv XA A A . A ;  5|{W W f?@  A ~N e %)Nv : $Nv Nv %@ (  @ B  Ze&  0   vPe0&  v~& & & & #P&f& Ε& Ε -dz\zCפ:$P W[C W<CW>~W]~H $$C˥.˥;  P$ ɥ.  C ɥ; ~H$ ѥ; H  B~R~~ѕ. ~ѕ; ~H7 ww~@& SY&"D pAB" b B~7 7 AB" >AB.# . \:X $@eB < Rwޛ7*ԙw*e7 L 83@# R+@  7~7v7tj! R^U@ :4*7@  we" T@   ܘژ̘  Q0  %# QF# Q  wjwf we@&B# 6Q pQ B  XQ wre  wXeff& & & & f e @ P wefff& & ff& xe "@ % ХTХMȥP=  0 YYwe@ABeE D` bl lrw8e@A f B eE&s   s-  CslB ̘ e@<t% ?,e Bf@| e&& && & &&& #& Ε  N D   $& & &  &&& #& Ε & & & & 00B0ZY`KTADATADATADATADATADATA&&& #& Ε Η& & & & #& #& Ε ݘݏ>fL<*<*@& & & & f<*& #& Ε & & & &&& #& Ε  -7  we#&Ý #B & & & & & #& Ε  `ʝ  j/s Psw\e 7 7 7 7 7 7 M & . w~Mw-CDwv7 6M f = 5R 2 Cw:5 P Laa N5!na e (= aa e5 = n a Z%y=g )1& Ν611& Ν4 L5?1& Ν,G1& Ν* Ke f&G1& Ν K5 & -5v$ l%l%!=5hwe& & & & XK e(P l-5ʗR5R -|U F U5 L  5$e K-2   JCleewR    z >b \l%ƕ! 5Жw8 70 JJ5 J& @ x- -| *ׯ^!2  5-0& Ν %  Ȗ7 *7 r   e e e5 ׭!  I + jI  Z N 5$ ? B l%l%! ww7w   w( l҃ '  N l ff& & & & Newff& & & & *ȒZff& |'/"6    l (w./ 6  6   (7 T   Z&*"Z&& & b% 75C-5 Z&ޑ֑ Z&& &  Z&& & Z&& & & & & " ee3z &ff`X &  Fe%/z ff &  new z'w   l `':% J% R%Z B%z & aaff e 4  l & R%ZB%z &f 5/$  R-N 7 >ev  [ l IFZC/ -Z& %5- ZЏȏ e-5Z 5Z& V ez &   l % Zz  %@ % e f  l % 4Ee $%  ($  EfW  B%W ,W W W  W W )7 J a a  e a &ef    5 : w7 x%55v!-hj-bd,5L JC :  &-"0u 7  -0u $-̏ 7 7 7 7 7 7 ҏ 7 ȏwܑ5Z  #a J! L:@N \0 @ E  @1  V 1 W  A1%ef 4 C @--)&e >%f V A @w W  5~qW  g@Ҁ El^ Ne@V54W  :f  -.F (Cef t < l  ~> P%&< DX <@te0 9e "@Ee0 9e > w|  r e4  ߘ-Ҁ El#5> eӦ  ԗ  ~ e@w V"-7 -Ȏ Ž 莁  @7܎ ֎ f5ʏA Ə  S-z t   @7 <*~<*>* & ڎ ՎeV  T$e7 B-<  .  @7"  | t 7 w- N B B  r &  00B8ZXSBgr fe0  <*<* <*7 %f-* wx t 5 -h @ &  d%5& %-b 5 -  w  & N V w '  @f %w6 & 6 6  ֊  l nT <l%p&   Nl%  C 5^ Z ,e j5f $l%p& % l% %7 Kaa |l% ~%7 `e)7 B  ^& `l% >&7# Ne7 wv  (ej%& Pe ׭؆!҇ V 5l% %el%l%!ewa  Wpeaf : Na a  %a ewl<*Ҋ a          ` a af  W &e0  W  W   %W ӕ.% 7e<*m힊77e : ; w -^& R5:  ĉ5X Te  "e 1   l   mf N`7   ' 2N ,% # l . . -  - < p0 ` b =4  aa $eew߁  & N f d9 F:@w6 & 6 6 5 aa 5i > "dW  f& ޾&e SW r  h d ^ \ T T J L @ D 6N`' N`'  - 0u   -0u eeewew݃  -  7 n ^ -5V  7z%  p hb  7 R w LD DA>  ,4-0   ( p-[ `   A B 2ƅwą B @ C @  1-f <  & -[ j@ N ^D B  HC w< 4w 0f |%7-( & >e) ~  - - 愖%؂ & ( ~%wہ     -[  %-r Y Ne e -P N 8 ;  $H w w  - -^^-w wA )a 5| zae "   l, e@     AK  A @ D! D!1 D A ( D  A  @  - -  A e  @ew -He) ,r&a j (z    T   < 8 4%   $  e w؁ CB- w 0 -7 -7 -7 ځ-́7 Ɓ  Ɓw Pw6  6 &5 w- A  5 C  L F aa % ԀV wZwB` ww   Ҁ@pwȀ CJ swMf  1 52Q.mD 6 4e" $m   66 + |%m    ^m 6 66 %    6  w w4-^ w ewz7 7 6 ) )-n*v" '-d7 ^)  ef &56@  v"  ~ 2 7 ~%-|  |~ 6 h~% 1 ~0 1 1 lF-|-~ 5~@ R%7 ~-~| ~ 5~: (%z~-@|0u 8-6|0u , T$-Ȁ    5{ 5{/p, 7 7 {%# C'00B@ZY`KTADATADATADATADATADATAa |'a j a  %fW @fv. wրe  wҁW @ 5 N. VwȀ%% wn҂ y{p{ :{?{{{{ 5{ {/ Ne7 { p4yp{{yn{7`j{J{wx0`` x x.{ 1 w {7`{ 5  5x55ew^Bm @m  w0z@P z|zxztztz (x f xzRz xppXzH  Dzw6zm4z0zz wzwz/wr5ny ly`y -byVy \w@`B` " " y 1y eayB f& &wymy|yeW"      lJ r&xx x-x x-x xy & y7xx   ~ x:* x~xx x w\τ  N `vel % zw R   lP  -"xux r&r&7 x w w w5w ww -ww& %u``   0a``   w7ww`weBl " f 4w?fubuw w`   V O2uwmwww&uxwmrw lw`?bwXwe `t*w 4w 0w ,w2w/t  ttvtwmwwe  f  l~e wBjt@v v v& & %-xv 5rv dv/ &eRvJv/ "|\v7 wP 7x a ˶ -F{ 0 N% ' &{aa a0qe e qe& ~qe 4 = ;zsts- # wJss s-s s-s s pZqes eGv a a e N 7 p%e5pp" aa e N H 7 fp^ sp0 0" ew|l, f  ll@wf ߼r  re Br@m!=/(p:/"p6pBmem`r@1 &Lrm&e e4r(re jʈqe:r a q\qVq q q-q q-q q l qwNq aq e ew2Ȧ)q`bq\qo  KJqFqf Zn BK qq/ a a f eLq B pp on` aa 2p0ep Dn- N pjp e % efn p0 &x` " pef1 w,i N`f Ȗ%w~Ɓ   @  wVƂ  f F  eN %f a  $e:i6, >` ii wŦ)6  r& w l451 D& *6mznmn m5dn  pne- ހ` %5*n -ll D& 6mnmn  ne%mm  @  >%# 3%w a=˕ 00BHZXSBg`& 4 Ė%׬-  `N`c& 1c9 ac@eA& < c c e e e   e35h j\& 5th\& 7 jThf5Jh)7 Dhmm5j pl & ޖ% hj Tl & ޖ%wXm7 Jjf   @wDZ1s0& Ν@s& & & & D& bewXEmN H E W W  E  ! aaKW/ E W W W/aaD Z(a,a0a4a 6,6 &5,w^ (w wv6 "*e1* aa aa"  .a2a,2a Ne o a 4W  N2a af f(a& e fV e 5,@aaHNatLa@`& %Z:a>aBaFa 6>e( 00e Z:a>aBaFa N6>ew5"  wj (w~5"?  @t@a`@ 6a`& R n v (" ^ڎ.e0 * FZ2a6a:a>a 66e $5$/5, -0  .6 $.0 Z2a6a:a>a 466e 5"[6 (e1.a2a2a e B  pX! D `  r  Lَ.0 Bہ2  ׁ W  "Z2a6a:a>a |66e   ( "w& 6 ( ~  Z&   B  -h<* ee)5*/  E -e Za a >e  %fx,*& *e w x a H    a,*& ܾe &* *a "ax& e "f f f    aa a 2a v aa a a fea 6e%eW a&* &*~ 8 ~&* %,*&*a deex,* e  * x e &* x&* |ew"0a \42* L ax& e e w 6a :a  5w4 ax& e d a  d d d - -  "ad vvd $ax& e 5  b,a %aa -6d^%D"a$a $a~ "  ~(a κ%%ew &apa  x e e-:a-Pz X7 c7 c%bwڹ)f 4f f5 ,eaa p  Vbp7b` 6e%wR)  )@, 6ea6a %%w -$``a r& Zb6 6 n6 HbBbme4be ר ע   Q Iɕ @mb & N& a6!4C ע  r&' r&r&  Br&  r&  N& a e% v! XW r& zr&fr& r& %  -wW r& :r&fr& J p %e w   |) 5A C,~  ^ -`^r&] %7 r^w ` _7 ` `f& F-^-^ 7 _%_ -] _  e f& ږ% B  -]#l]  5R] ז% B  ז%^ ^ ^ , & j5(] 7 ^ef-\/5^+-^-^# ց N ; Ύ r 7 ^7 ^wZ^V^% H7 ^% 4^%wda % w& e l%Zl%Z5 ] & 4 ( @Ж%7 ]]7 ]se E`6 E zW?00BPZY`KTADATADATADATADATADATAo5k W?g W*   @ ' "  CA!f6% b]&   ޷``_ a > e  &a  e f  ]] F l%Yl%Ye L\& ( 8e & N %xY.7 lY5& Ο^Y  f je f Pe f e Y Y ewb-XXw| v :Z#ׯX  XׯX)[VZ7 Z 6  a ! 6 w(ׯX(     W!w%wa N[- Y  [Y-  X [ W ~ 8 6a 4 6 .  6-WW ߮W " ' ) W a 6   ^f %~     vp wX 5 vpv )  5"I W!e8%:Vv   lw V $ 7 Y 0 N t V  8 5"  & ( W!e @e5rY%%wx e W xі%Y & & ef lY - 7 \\Y-vW nW  [ hږ% & 4$Y% f wY fˁw   l w   j pe _& Ȱe PR   B  @԰ @Ԁ 5 /  X " p   (  p  w   E r  l            C" @@`e55  f jɖ%  X D @``   .JOU;>&QUIT/SAVE!.TMP.TMP* $J .  ,          *::::JJJJ Zjjjjj zzzz  )9999IIII Yiiiii yyyy LF VT CRESCDELINDNELSSAESAHTSHTJVTSPLDPLURISS2SS3DCSPU1PU2STSCCHMWSPAEPACSISTOSCPMAPC!!C/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^O~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"Gŧ`y` d'@Bʚ; TvHrN @zZtH^Zb K:[?8h[?8l,,2"*Additional information available:[?3l[?3hJ=>\<[?6l)0\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~AAAAAACEEEEIIIINOOOOOOUUUUYAAAAAACEEEEIIIINOOOOOOUUUUY  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~AAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuy6VError:  $*0'&1 f`: ^`: V`:P N`: F`: >`:$ 6`:d .`:0 &`: `:, `:X `:p `: _:l _:` _:d _:\ _:< _;< _ ;< _2;< _D;< _V;< _h;< _z;< _;@ _;@ _;TN _;lT ~_;P v_ <@ n_ <@ f_<G ^__: 6_:` ._: &_<@ _ 5  hW!F & `N 4%  lv$ r 5X 2  @`%5 h †l%l& T  ! T - yl%Z X- y S %'^5 wR  J 8Zh r& l%! 7 ! 5L \) .I7H w<5.+  &nr&B 5-^5 |5^<& =e w0-   6 * -~xF & N& U% C r&eD!Da !P- T  f e-  l5 v \7 %m ] '0& p\  a` & FF a Gm te6  @`a`&  f v ,m jQ  q*m-l=& ΝBv& Fe / -& Ν" ^f  ]  v [  ^\7V a`7K7 7 N%5w&:8&` :<a *<  `T7 ``He  e-r&    m ^7 77`r& ;eer& 7 ver&p7 w9 a % $ 5  B  B ef Te  wF9) a " r lO l%5tv 0 5$ cW 5 N& % G%WN  a % .bbW W ,W ܃5I& N& & eN  a % %ݖ% N l%5<ߖ%%w %w8  \Sa l h   &a  {  5 8  9 : ;> @ wbv& e wB Ra  w aWW -n5 j 85.  Ra  h J G C- f `N&  BRa R %C- -~ x Οr pW  l%Zܖ%;%WW W W a ^ W W W a : N`ew  f 57 7 7  ~w@& (X%-ی  $l%z 5  ^۷ ZۇPl&  Te m>:6er&0 *܇&  %v 4V P%-  T   lvvv U% &   l"vvv U% f B^W"00B`ZY`KTADATADATADATADATADATAW"W" ] M  f @5ztێ ( T%W ^ J e@ f J M  wD2)!P W  1& +W W W a --D >(W v " l&Rf  G a  % &z-^ He R f  Я   H7 er&7 7 7 lڇ-"-)5"v Q L P=ew0 ` (` " `  D 6    l %!   !  fN %  w/m r : 3-Z^& ַ`|zNfp |1f p1 fr& F G w `e  f(r&r&f `  r& 1& F N er&Ֆ%w2/) -^  mr&  rr&& _ pV aa j% I  fhզ p0N  Ee Fw fr& D0a a ^je Jbr& qr& ^շm  p ba%  q o%w.  f T % &F --wԎ / N >r& Dle f7 Ja <^w 6a%wp-2Ԃ & F    Cr& \ , B Ӧ  R %w - a     a ` w v    v    B ^5   \ Q l1 & r& f %57 @ׯ  -r& %     ң(ӎ & Ο a Z  e w+ ->^  ^ M (@m` r z x_ 5 Zw0er&**r& *-Ner& -f BN s5 5 _ Z  H^e w.+  5-Ѷ פ .-n^* v$ ߘ   l@y e@v@v  @w@w@x@x Vф   \  6! 2s  2, Ze s tѦ , r& ew&*-Z/ r&w & N C`% 4 ׯ    -r& w`w)& Jy*l Be me!! ҁcmHfZ `ye ~Ёp  : e  `\  p?  ߞme ! \   @?  de Z҃` % a V ׯj-7 ׯ\+  @ f7 :-.. 0ׯ  ׯ^ WZWze ͷ w.(  ͗ !    Wp `@0  ߒ > w'x|7 zn -dd  \X   Rw' >: 767 4-*&    7 -    w8'̄ 7& 2?W 0̗) Vv5  0=  7 >W  p̷`l  @ w& > J     l| |aW AIW ^F{A W B>W W;|B @`eJz C -D``7    &6  C!5 ~E`A w% z =G-ppC hd-`` V _ : Z t  ^~̎ P lLV tw\ X%V0̇w(%.  FRe5dwT  " l| _3b)v R*)d (*d 5 df s w$ *@a %w7 j fb^7 [ w e  ns  A*e) \$e ,($ t! 8 |e) $e  M ` | ~,  \ r Ta dwp y    o  j ge-   - 7 5IE-r& wpf  1 ja00BhZXSBga \%m 7r " q Q ! 7r7z  7` ] -t-lX ^L jV r&  7 <* .7 er&5@&  l%9 e) 0" e7 7 ( ,  7  ,  ,w  7 ʀ ewN!v.Dv.6& &  WDe a t!  (  aea l        pe# &.  XC~e   o e ewR \7 t  o {b7 8e N% h c  2 $Y$ S   Sde& ΟZ % Nm7~ȷ z S 5   PSW    &  - -   x .a wV  [5b p nl% Ql%l&& & na&  e wh  4  (nl%e "& & 8n a&  e% 4 l%@ewW A1W ,W N&  i ehl&Ö%W  -l%  Ο W l% N &  ZH -l%l%l% c5 %   bd5 l%fl%b ~ ? G N le %wf-^ W @m     &f %     !7 -" Ŏ & 8?7 7 G% = + L< ׯt! ~ 2 ׯ^! h T-Pa a JX% V 87  X \6 F Xm 7T Ga  a 7 Ǧ a &=aa W%  E ,77 7 e & aa Va e w-}}a 6l7 hD  ve  e a & X-P|| ;a ewP 7  & J? c7À %o   a  a & bW%O :0 e ,0  pk d4( rde0v rdC r e0v  r @e06!a& V% 4 k 4 k 3@ j B5%w-|| : 5e ew(&  <& W!)H`FD F%  d h w$ ׯ e7  e7 !"} (ie 7 tҾ&} ie R:P!M!J!GA r l*}r&<& 7 5 W! &'&     e T& &    % "a lea 6 w x. ! pw4 "  VZ (  X zw 7     `e w pNj !  X? 4 TwN(er& Y6ʷ r& $ D R ;  D  D - Tm %r&& Ο   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~AAAAAACEEEEIIIINOOOOOOUUUUYAAAAAACEEEEIIIINOOOOOOUUUUY  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~AAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuy"  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~AAAAAACEEEEIIIINOOOOOOUUUUYAAAAAACEEEEIIIINOOOOOOUUUUYASCADV APPEND&BELL"BACK CUT2-CLSS:CHGLBCHGUJCHGCDZ(DUPC`*DMOVh)DLWCp%DEFKx'DATE+DESELEX#EXTFILLHELPI$KS PASTEQUITRREF SSNSHRSHL SELSSEL"TI!TD TCTOPTAB"TADJ*,TGSELUNDW<UNDLDUNDCXLATE^*R2LT^BW%BR BLBPARBSEN!BPAGECEWEL'EREPARESEN#EPAGE L NLPARPAGE+SR SENVW &.4z(BPzvp0L`pv~&,GKEYPAD VT100 KEYPAD VT52 BACKADVJPPPXXX44hhh66>>DD &&&FFFFbb P2 00BxZXSBgw@$ ^- j7 Pr&e) @ 05B5 N aa rzP, -8` -  7 & 7 J6  5 r& a d7    )& @e - )) (n6 v-)& @e  6 5 w67 wv-L-"-5 )$a b?)).a p>.%)$a ,?6 $a).a ,>52 . . xr&(a vcM vr& f& Nf6f-5N EN N @*r& @& fr& @& @ & e xe 5 l5e-a-] f N NE&6f(C j`bf NN C<>4 N, f & :e 5 85&  #5! &  e &  e  5 n    l0\ Jw.    > 2         5 %5     6  5 5c5 _ N\   v      ! -L F 78&  @e   55N <  r  5 5w5 w n 66 6 7 j 5d55 Rua 65 4u C5-5 u& a R 5   t&   e %5    t  5v5Q -d 4 -r B7  N  \t e& Ο `6 2t &t %    5w55   5w:66 5 7 7 7 7 7 7 7 8  X  fsxLne) 85 e& Ο _FB (a ]70 "&%55w  6    -754 "  r .e& Ο$ _6 6` -^%     6 @!,5)   & Ne& Ο ^6m(%  )& 7e l)) Xe ) 7Y ).a 60a)& 7e w R . .-. 0-0 2 0a)& F7e @m7  ) \6%%5S %  w      w w @m7  5X5~"7 nh7 b\ C  C m7 :5/  m(7  6  0 C  C        6B!7 5   5 555 55    bo  N 67 * w6Ub݄ 65  & RV(\ T܎ & 8V*\ T & V 57  |   nz 7ܷ ;܄  6  & U-,\.\ 8T5&7 F*H |7 @ ,  :n  LJH܁ ew88555D7 -۸& $    m ۷     t  m-v۠ F{j۔۷۷7 <7 vn7 28BBێ tT *۷& |\ pMer&e2w 2 m r     X7\-- } 5f#ڀ  N -ڞ& f { & S6\ 4R XXwt r-> >X \  N  4<&& & Le(& & :S- 8\:\ Q7  ywَ& 00BZCZ`KTADATADATADATADATADATA e y w5r/z -)5`& d z|& R<\hD ~z< & R@\ &Q JW7h r-2$&  d َ & PRB\ P7 ط & xwؖ% &   7 7e %w/ j f&  & Q Se JmH r`؀ _-6[5  H& B؎ Zy8& tQD\ P#7 ؁ ww ׎ & BQF\ O&  & eצ&  7  e @{5j#5d & PH\ XOR xj& PL\ 6O ; v r (& & zP-JN\P\ N7  vw,&  :% &  "% - && & e ew-5vwn)& .e -^ֆ)) [%r&a @Rw6   lR\ (h0 @  Aw   @    Aw  w տw   @  Aw գ6 6   wv 6 m0 6 e  wb6  Հm   ev6 " LE m6    ,Em6v6   @6 -W B  Q "Է <ԷJ@2  @ 26 `ȵ 6( $-  - ԃ 20B)`ˋ$  F 2     ӷ hӁ  І5 D    5 w5w %e t nf-  *]  - ] -^^ dҀ   d  w)  5k i B`ʵ,  lX\ dEv LEʵf nP  dd z Zd AC`v   6   C` v     6  ˕v  5A -\\b\ I| - ѷ Җ%w(er&-f)|er& &%N)z e  zR ZRfe V - %w:(  rw && >J R D5 W L1 %w. m  B @  $  р6 me7 5& @6 % E 0 - -Z& T(Fe@!   *b`(  ! !~, ) I -H *  $?!   a%v6 j -b 6 [-^ψ & -\:05 DJ& zH %5 4-.*( nA?з  -  & `> `  ! !~& 6?6 % a 6 Z- ) -#-v-x΢ 5 hnJ G %& = +5-8>& hG \I% -  z=  >G * 5- & G% H @ B  11 e IM60MIM MIM82FaG`Q|z:dӿ W  00CZXSBgTISYSYSY<0 NTISYSYSYNC0<|Q0V`brv*0j26@DHprtvz  4$&FLVX^`bdpr46BF 7 & RRRR~/,.5 ! >:B$%e   U %   6w$ 7 7 we7DQ: Fw4k [qr'Uqv ,4F l [a'VNE`:dIqLqswyjz4};}u~K ")-6d4=y:BTqMwUxYy^yd'~+4CYZ7 DQf*5b ׭T ` E 5> 7 7 (7 " @m |  t7 7 l5@v wCmp,t7,7P5 11 ED`7:P  ¥5@U.5D 8 F5Ew* w5 g5 ߥ ߥ Uw.5! P?5@55w5 555E9 5f5j55@bU  5,ww$E7  .7   0 7 (  Ҕ~ Uhʕ H ^5 wwd Bwdw\8-wd5fwV%K5P5H%yc%y` 5 2%xX%wU" R $  ,%5 $55 ģR 6 ޣR  5 'wR 6 8h  7z%U d ^95 #l5^m:JFwQ| K|5 5(w w w55 55  ,E5U@|5  U5w-U-(lX   @5& ?5/ W5'R5l?hXޡ %|?777 N,@5 2x5 5@E@U 5wx rA w>(  m @m 7 54w$        s7wȡ   DEm5 \e `e ~5 ӕӕ[e 2 ơ)f%& +p5 7 ơ) 7 >0d ?X m %    | " b\f ? e fm  ` `TT5h Ф~0f5HK  2 - 55r5 ߕ w5 5g- ȕ U5— t%-7 h~& ˥;=W"&΋v+W 0W-"W W W W!N  WaWz P  wȕ    00CZZ`KTADATADATADATADATADATA bU@^ȥ@UU gw¥ U ¥ ¥¥/UAZ僗09߃@ U|Z%2%_M2wZUZȥA CC U<ȥ/U.5& 5Ue V eNWt7 . 7@% j Dtr2 2 2 eVUҔB~ҕ +34JKRS[bdj}""_M~Wx|Q|^4|PR)|Hz_M\x|f|l q|Z|Q|z#_ x{Ĵޡ w5%Uq[w7 w7,7,5 xH,-vH5 wBw:w2w&ww-Z'X5 %|%w@&55 އUU U &@ wn5@&55@& VE@wwwvwjwjw2@&55X5 155 w" w,w,5 5f5 j`-w U Z,IC,IP,IS57BF6v,E,ȡ   TLơx J7l@rf@ f@N,F C-  2E2&E b %5 0A&5&5  @,A1Z  @  ,4,e7-,5 E D56e 5@ ,@  $@5& @W,VT  e%Wt ^5.'De@ ffB, E@@  @|f& 5w.@&Uf1 1 f&,A @  p &@ ,p jw5  ",e X wwwww5@wt5 U@EEx $& ,  EE@!@-  ,!-  55  w W(ޡ 2V5  z?v$ n ?;A5@5 2 /-v5)f1 (U 55 :E1@w<w4w,w$w ~0w t p l h d ` \ X T P L H D @ < 8 4 0,Ew$w5w` LX?T5 5 P@,bw  6 / -sR j?? n, 5rEe?Wt j@e 0@e 0@e, 05@e@ 05@m 00E0Uvpv-U' ', $b EE@!@-  j ! - >vphfr %f  B& 1&p(pp(e 5@p2"  7,7,|J@"A L&@ e e  & 4$ %(e #| J Հ   $ &~ <8$ / e ?J?FŀCLICPUDZ11GENIOLUNLUNSMCR...POOLSECTIUIC32KW,VT w7 p 7Е ?[PW Q ~ Е Е-Е-Е & f  ȡ@  @ ơ+'& +'5 7 ơ) n7 wx F  <  ѥ ɥ ɋ WAWZ fʋR ҋ ؽ  /REG/RONUqv'[qkr@7  #  Vȥ/  8 S . S C$ w|@崼{,BJnnnnn dwT @e 0 w /  ȥ xxfw(&ɋ ~W f| PMDTERM@̽Sƽ00CZXSBgн /7 ннf7 7 @ ȥ DХ/ w v eыɋ<\\T%~  ¥=: ¥=Ƚ r )R5&Bw ޡ   w5  %kcw 7,UwAAq w w 5 w-ww-wz^5 +w5LwwBw>-6ZơwwT-T- @w8 5@<*w"  w5 w$75  55 5 W-| +P (A^ 5@`@Ae(E&5 eJwf?  1  W  wW,׭Ew @b%rE555  + U&c_a7 f& &  4 %ޡ <,| s  -,5(- Pw  A E& 5?  5Zߎ`ރ >߀   zwV&7`X0m ހm -7 U -׭0U A7 5   S  v 5L 7 E ;& # # @7 P  N s | Z  5 7^ % %6& ɋ=     4|1& F b5Υ: Υ ΥΥ/Υ   X ^  mX(5$   Q3+XA  톃<" 2-BX("rr l v 3 @W s:    @0  ZlE%? Bte9Ee0P  @ @w (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$ w  ť ť 0B @Aa & & @( $f  e ee e ASSIGNDCLDEASSIGNDELETEHOLDINITIALIZERELEASESETSHOWSTARTSTOP 5 ߥ& *  + 23E Ew    Е-   0@A DW e`fÊ    E &  m  f A N  %&f  r y,,:Y Ksw~Wz@}r|AK":)_spe^_z}:)M:pe"p;}D`p:z}:`:""`a\gr:)K";}D`;;}D +};}D`se;}D`zd;}DM̖;}Dv2OG:@;}D`';}DH:d|~:? }WLH!;}D +<YgfK+d@: Lq;""`_N`FXz}_XN`FXz}% :""`YVNvVNm}%w@fRKq}_sp{Lv~+"Y>@:) ?#`_A!h~Lq;""`;}G:4}Kvsw~W)-!r{YWsw~WAy=YL;! S@g h[ z:d|~:v8?}"q:K:)8:d|~:4Iq #y8? }WLH!_Ma}f] _t@8ez8^i'HX`f] o8Yk~%S? }WLH!;}D8 YIqyY-ZEy. 9=^yp`p:z}Tx~rK"w:?}Ѕ`,:Y Ky&XSd99:;}DH`YYeT]y&X@}R Y(&$y@84[Me Oq:jWSWM̖Oq:jWSW`'xo@;}D`;f&"q:Kw_`Usw~W~`H S99SM!Zo}RA"}C vp_`[qap:=vKw_) _,9^w~W;}DpYU̖,:Y Kw^[qaz}4Iq #yQEQp%{L4Iqfw}Avy)}%r00CZDZ`KTADATADATADATADATADATAWv;}D`ChL8"Y+ }K"]vv[@;}DpYU\C^YSE˖iH%Sm[q%rW/U, W{y8L:v8_y@Q%T8w~W˖iHYM%T8w~W˖iHYv_Ay%Sv[@YvmHqUq`%rW:)_tv1 RKqjMe^ };htE`p:%:Y[S`"k4}rST"q:K,:Y Kw% Nf}w~We^Yf}w~Wd99'6F9E*_sp.`}R ZZ r}R Y, W:y@D `"`%:(_Yq8"_M8KM fsVNv` !:eUw;}DoQIv%!}qQWP$ i;_]v`|Q #yX_qQWP$ i;_Yt%)NXX,QXE~pysw~W`,L;vMy?}%K/4[Me y&-ZQj]pw:Ya 2W!htp:qQWP$ i;_;}Dpa _p:fv%]w::C~`"u:%rW9d:) ^1R:);htEy.8w~W:)%:1REy.8w~W:)%:9dEy.8w~W:)%:us_Ey.8w~W:) ^1R!;K}XQ|4Iq:4}Kw_gY4oM;}D`p:R`Oq:? }WW!htVbnv~ &6BL\ p    "0@NVft   0:DR\l "2@H bp   ", Fd    "*: N ht  * B \f z < V|    2 Lnz|,??yy W \TISYTInX\JlTISYTI(?yxDX|X ƠP 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 labelSystem 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: System disk being dismountedK8pR?5#a+8E*x  ǡ   FiǢir$*,0DVt$&$,& <  %a%z R   w7 >-   w  H@ w  Rڠ 0  +A(eȥ "B, wp  $ʣwX tr DEG A- B-@, LwH' %% LwA E00DZXSBg A-7w" b  FC Е Е ֣ H%ڣ :w x " =wuw0 `4 2ƣw%J7B :  ($6 <8A0wx@%CT   NU% C ȕ C ЕSЕYЕSЕTЕEЕM Е Е Σ *%"t7 v ^5pB  RK0`wEw:E4D6,B   w 4 y  A5  D& ب  AB$, 50 U0 XN B< C fЕ ȕ 7-  g 0 7( p  p$ #֩  d    @ @Z0 )7 wFF@  E@75 pB O +AA 5$ m C55& & & && & & & Ε@ & & & ΕwD   R55  . ң w $L5  w6ʠ :7 ~5 ~ X T PҠRN AA,w.    @A5 w-ڠR v7 f̥"Xؠ-уBeڠʝH >@ %"p7  5 z p!£ zw& dXA5 S@,U5 : 7  7w  %7C "  wRcs`P & X) $ MCR>-- e4MFMUMMMS@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 take the action outlined in the documentationThis program must be invoked as an MCR functionxv&%IN7 %HO|鮕w/w  !נ נА w-: xv܇&w ̭IF& & &  f&& & Ε 1.R`  & ¥"N  •    ׭`3&V8SEPZMlJxGD<<ܰ96 3.0_-}*'αӱ6Rh m~  Dwr  НhНeb RЕ:PwP@ V @6 B2 ѕ ѕ-ѕ-ѕ *;ȋ "ȋ" 700DZEZ`KTADATADATADATADATADATA 7 ȥ/ȋw̭ - wB095@"%DY55w5w55xwV5lwPC5  55A E w w w w wwf - B5@ & & & & & & & & ΕP w& lE HЕ:41& F b5jΥ: Υ ΥΥ/Υ   X ^  mָ$5$   Q3+ָA  톃<" 2-Bָx"rr l vB 3 W s: w 6 ť ť 0B >Aa & & @( "f  e ee e &37 &fw 7 7 @,q `-KacJE[ !m@  ) L R  j7j f@  &  5]U E( :&@E A  ̆  E vE c  @  . &f  B F  8  " .$ B  8̥ZḀ90     DEVLOCKTERMUSERSILP$ʻXһ:"""І0"0/H֫ΠР6,ʫ֠=Ă:=UР^NР^HР^SР^V^&  m  f A N  % 5 ߥ& *  + 23E Ew Z   Е-   0@A lW e`fÊ    E &f w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C &ff ,PP AW  EZSYSYSYTICLz~̀zV2x~00EZXSBgr$$&`^z    3b] .A ,ե h ƥ'  7LwJfwH~z B  $    @7 7 ( B ԕԕTe@TEw|T&` Te0 :ԕԕl$ TB # HT 2&f  B~ @A rDC j7wFd 7*x[O 7*f[ Fz ?;ݰ5e@ 8 5 ?b!p":$e RLU &Ewhww `  @`)Directive error ID = DSW = I/O error ID = IOSB = Error ID = w*ddptEZ0:[0,0] `F MOUINS.TSKDMO.TSKICMINS.TSKBADINS.TSKBRUINS.TSKMINUTL.TSK|S||| | |e|yT|T||L"|5||> ܦ঳ 䦽 Ǧ Ѧ 21ا 5 ߥ& *  + 23E Ew    Е-   0@A JW e`fÊ    E w  ww  ww  ww (DB C DBe ?D(e(e$2e (%[]%<>  1 >eB  8 R$&w "*<S1   K U U@  f&" '&)'&&* *%0*ND   EU H f ,&f    f  >5>Eu   &ff w BC "& @SY&*p0p210=E%0=w(*e "f D CB.Ef&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w *$ ':T U@% DD%][%><w  w1  %,,:4 w (*D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce    j*w 8*  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ 0+1(e  @%&p*w f( f)f `8Ae f"( UCɗ&+(e$&% **(e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 00EZFZ`KTADATADATADATADATADATADe $ $ $ >z  DEe    *1  ˕03 "   ˔Ӕ ʥ75%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@,ؿ AW  EZSYSYSYTICL~̀V"~r$$&`^  * f  4    3$]ר )A )¨, )R )'   )76w4w2  B &       @7 7 ( B ԕԕTxe@TEwfT& ^Te0 :ԕԕ>$ TB #* T &f  B~@A  rDC  j7w,n d)7*:[O (7*([F?p ;ݚ5e@ v R5 ?4!p"$$e U &Ewhwwʩ ̩rZХ/D~%  |¥:!"x5l5 ^ 5V 4#@L$%V&Φ AB1P E1 1  n'gc(ZV)L  @7v7̪*85h5PdЪ+'5V$ڪ,-,./wNwrwڪ"77-.e7 Ԫ0 0 7`t7-@f1s2 w & ť ť 0B *Aa   @)Directive error ID = DSW = I/O error ID = IOSB = Error ID = w*EZ0:[0,0] n )00FZXSBg P  p@   n#Oqn#An#ƪ7uy  «0 §0  ;MOUINS.TSKDMO.TSKICMINS.TSKBADINS.TSKBRUINS.TSKMINUTL.TSK|S||| | |e|yT|T||L"|5||>2 l<pC tM xW |a 00FZZ`KTADATADATADATADATADATA00FZXSBg"! 5 ߥ& *  + 23E Ew    Е-   0@A jW e`fÊ    E w  ww  ww  ww (DB C DBe ?D(e(e$2e (%[]%<>  1 >eB  8 R$&w "*<S1   K U U@  f&" '&)'&&* *%0*ND   EU H f ,&f    f  >5>Eu   &ff w BC "& @SY&*p0p210=E%0=w(*e "f D CB.Ef&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w *$ ':T U@% DD%][%><w  w1  %,,:4 w (*D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce    j*w 8*  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ 0+1(e  @%&p*w f( f)f `8Ae f"( UCɗ&+(e$&% **(e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DEe    *1  ˕03 "   ˔Ӕ ʥ75%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@00GZZ`KTADATADATADATADATADATA|S#,YYgg AW V-0SYSYSYSYTICLz~̀V-zV:x~DITAREEXLBLE VE@00GZXSBg00GZZ`KTADATADATADATADATADATA? >, ) +00GZXSBg + +EZC -- Starting extract operationStarting replace operationStarting verify passCompletedSyntax errorVerify failedDirective error, PC = , DSW = I/O error, PC = , IOSB = FCS error, PC = , F.ERR = L+>, +w+ҥ D~w zp Qzȕf 0; @* :(5  Pf&* Pzȕf 0; F 5  f& ww ,5,E, ~ 5t\5l `f\b7 `7 ^ 7 R7 PBL>H  * v 5@(w4U ,E,  5 7 7 7 7     { f57 7 f   x 7 7 J x  \  5@n?Uf`j,E, T X5J7 J7 H    F - 7 7     r   ,E,  &,,E,  ,E,  -  -E,  /- x 9-E, b t J- T d F55 5 555 A 55  5r55 HFR~  .҇"$p# 5DbR~bDR~"# 56 -827 7w`ww  +| b,؇T:&,ć,p +  +   R$~7`w 7`w 7P >,7+ w  ť ť 0B tAa & & @( Xf  e ee e &f& v f&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0 .eeȵe ~  DE  ȵ2e &e  %&'@^e55@558Beeȵee& q1B$e q1 B  f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 e::0; 5 ߥ&00G[Z`KTADATADATADATADATADATA *  + 23E Ew l    Е-   0@A j W e`fÊ    E w *8I *=)98 \ eB &&  U N **e *Nlv ΋*.2  & #!)&eP(e && >e >E p* D w w (DB C DBe ?D(e(e$2e (%[]%<>   1 >w ( D b 8#"#)%ĥ ĥ wn 0 *0 @Q$    0 40 60)) L \# U&* =w `p!2 EW!p0p2 ׇ#( P) | @#**fff  F &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@)) *R*)@#0l C# 028  00ĥۇAĥĊ  000 0 @0 &*0 @ .u D# eB&B B  *  eBe>  # #D #=0/H#@&0 # = e0   n0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2w ( D  8#"#)%ĥ ĥ w 0 *0 @Q$    0 40 60))eB B &*   wT . PB5(8e$8w2A&(e 4p8q  (#5=A#@)) ^ *R*)@#0l C# 028 n00ĥۇAĥĊ  000 ,0 @0 &*0 @ u  :* d eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2w   0,0wR T  w w"ww  $0,0w  46 t  )0406 0 *&f &  m  f A N  %82e&( ,0 0 0 80 B0 0 0 0)#0.0+1(e  %&p*w f( f)f )"(. = . B  E t (.8Ae f"( UCɗ&+(e$&% &ff **(ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ 141612epl2l0p @MwX   f  >5>Eu   e6p 4 >8 X F81416     t ^ f B&* D*> =00l&8el2 0 *w feE D` bl lrw "  B eE"s    s-  CslM=f(& e %00G[H[SBg&&eH =&e0  U   E > >E=uf p  weB  8 $&w *<S1   K U U@  f&" h'&)'&&* *%0*ND  * EU   zw BC "& @SY&*p0p210=E%0=w|(*e "f D CB.E 8   *  4 6 e6p 4&*&4&6= 64 wz%!64=5 2 6  l0 & Z46 64 :)0406 0 *0e6p 4 = *) l0, *) $ )*)0,40,6 0,0, f 톇,, w 4     .% eB U5UU plp & NeՀ)*8e2 ..8em,0l0!D0e6p 4.) &f 0  e) .  e6p 4 j08*w =p!Օ^w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C ,*1 U8UMw w B 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ Jw:*;7#3w *$ ':T U@% DD%][%><w  wX1  %,,:4 w B*D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce    *w R*  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce <e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ (e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DEe    *1  ˕03 "   ˔Ӕ ʥ75%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@,??QQ AW 600H[Z`KTADATADATADATADATADATASYSYSYSYTICLz~̀6zVx~?~yT8TL"F5t&>)$& .z8  ¢\y 8e77 X wnvv &2\ 8 HWB - Unrecoverable error - HWB - Syntax error HWB - Disk is not hardware bootable HWB - Device not ready HWB - Device not in system HWB - Device offline HWB - Privilege violation7   ww8ȥХЋ e8 B%`B`B`@ w  mߕ 8   .6 ;w $ 7   4Z  &׭׭3 ׭v&׭׭ä57  L Е.nPh z  ҋ& & & & f&& & & Ε fRrRrOzz. *8 JBB - Unrecoverable error - JBB - Syntax error JBB - Device not ready JBB - Device not in system JBB - Device offline JBB - Privilege violation JBB - Image file not found7 7 4 w  %% Iplh h ^ew 7 7 wNwl8ȱ   w NWL@WB  &׭2׭*1 ׭l$׭׭Q7  X Е.4է   ҋ& & & & f&& & & Ε f 0V W,w:60'# 7 7 7 x  &d X4 >V 4@A ~w X&p1p.ww&Z#Ы>7*  Ee׭  /׭[ ?  ;c       p :'(94'999Z.Z AHJK L C Z ` a b c 0&    2 TSMHe bwB ~wr|&VS |ee7S7Ҭ R&Re "ww ww pRkf&RXX 6 ?7  -2*&>7 00H[2tSBg5@ ?  xr~`X[HA D@w (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA LEAa$ w 6 ť ť 0B Aa & & @( f  e ee e 7 &fw 7 7 @,q `-KacJE[ !m@  ) L R  j7j f@  &  5]U E( :&@E A  ̆  E vE c  @  . &fz  P T  8  " .$ B  8̥ZḀ90      *Ħ * * * *8 *)SILIDNIDSIL"%)Ā҂̥҂ԥH:/JĀ҂̩҂h:/jj$jĀ҂V҂^,΂f 5 ߥ& *  + 23E Ew Z   Е-   0@A W e`fÊ    E &f w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C &ff , A@W SYSYSYSYTICL00Z`KTADATADATADATADATADATA.; Title: BASTART.CMD.; Author: B. S. McCarthy.; Date: 05-FEB-81I.;C.; The version number of this command file is the baselevel number,F<.; 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 24.03.;.;.; Modified for M-PLUS V2.0 by:'.;.; P. J. Bezeredi.; A. S. Groupe1.; J. M. Kinnear.; J. C. FranziniR.; C. B. PetrovicR.;.; Modified for M-PLUS V2.1 by:D.;.; J. C. Franzinia.;.; Modified for M-PLUS V3.0 by:e.;!.; J. C. Franzini 13-Aug-84 20.00 *.; JCF157 -- support SYSGEN under the AME.;!.; B. S. McCarthy 24-Sep-84 20.01.,.; BM319 -- remove hardwired version number.;!.; J. C. Franzini 28-Feb-85 21.01 (.; JCF225 -- add verify to BRU commands;.; check before mounting and dismounting devices,.; check for status on SET TERM /INQUIRE.;!.; J. C. Franzini 9-Jul-85 24.01 +.; - add RC25 to list of two-disk targets '.; ask if user wants /VERIFY or notf.;!.; J. C. Franzini 5-Aug-85 24.02F0.; - set terminal to nonamed mode if necessary6.; accept $$n: style device names under VAX-11 RSX.;!.; J. C. Franzini 14-Aug-85 24.03o=.; - create directories for 2nd backup set under VAX-11 RSX .;.;=.; 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, ando?.; to alert the user to any pertinent installation information.J.;E.; This command file must run on the current and previous versions ofs".; RSX-11M-PLUS and on VAX-11 RSX..; .ENABLE SUBSTITUTION .ENABLE GLOBAL .SETF VMS< .IF EQ 5 .SETT VMS ! Running under VMS/VAX-11 RSX.; Get version and baselevel. 1 .SETS $VERSN "3.0" ! Default if no VERSION.CMDb .SETS $BLVL "24"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,00 tSBg 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 and 5; prepares it for performing a SYSGEN. It assumes therB; current environment is an up-and-running RSX-11M-PLUS V'$VERSN',A; RSX-11M-PLUS V3.0, or VAX/VMS system. All the necessary devices B; must already be configured on line. The current system will not7; be affected in any way by the execution of this file.S;> .SETS $TIME "'' '- .ERROR ;EXPRESSIONS NOT EQUAL .ENDM l;; CALL SUBROUTINEC;: .MACRO CALL SUBR ARGC .IF IDN <$INTSV>, JSR R5,$INTSV .WORD ^C&PR7 .IFF* .IF IDN <$SAVNR>, JSR R5,$SAVNR .IFFo .IF IDN <$SWSTK>, EMT 376 .WORD ARG .IFFi JSR PC,SUBR .ENDC .ENDC .ENDC .ENDM;*!; CALL AND RETURN FROM SUBROUTINED;O .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 XC .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;i; 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 .00OOgENDC/ 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 ;INCORRECT ADDRESSING MODE IN LOCK$ .ENDC .ENDC .ENDC .ENDC .ENDC .ENDC4 .IIF EQ $$$ .ERROR ;NOT SPIN OR WAIT IN LOCK$ MACRO .ENDM T  .MACRO ULOCK$ ADDR,TYPE,?LAB1 .IF DF M$$PRO .IF IDN , MOV #'ADDR,-(SP) CALL $MULCK .ENDC .IF IDN , .IF DF L$$DBG .NTYPE TMP,ADDR .IF EQ TMP-67 CMPB $PROCN,ADDR+1E .IFF7 .IF EQ TMP&70-10+ CMPB $PROCN,1'ADDRM .IFFN .IF EQ TMP&70-60D CMPB $PROCN,1+ADDRM .IFFD, .ERROR 00 OKETADATADATADATADATADATA;INCORRECT ADDRESSING MODE IN ULOCK$ .ENDC .ENDC .ENDC BEQ LAB CRASHLAB: .IF EQ TMP-67 COMB ADDR+1 .IFF  .IF EQ TMP&70-10S COMB 1'ADDR .IFFM .IF EQ TMP&70-60 COMB 1+ADDR .IFF,, .ERROR ;INCORRECT ADDRESSING MODE IN ULOCK$ .ENDC .ENDC .ENDC .ENDC CACHE$ RESTOR MOVB #1,ADDR, .ENDC .ENDC .ENDM T  .MACRO LCKDF$ TYPE- .IF IDN , .BYTE 1 .BYTE -1& .ENDC .IF IDN , .BYTE 1 .BYTE -16 .BYTE 1 .BYTE -1D .WORD 0 .ENDC .ENDM T D%LK.SPN=2 ;LENGTH OF SPIN LOCK BLOCK&LK.WAT=10 ;LENGTH OF WAIT LOCK BLOCK - ; !; DEFINITIONS FOR CACHE OPERATION;M ' .IF DF P$$D70 & M$$PRO& 6$FLUSH=1*400 ;CACHE FLUSH OPERATION&BYPASS=2*400 ;CACHE BYPASS OPERATION . .ENDC C . C;C; MACRO FOR CACHE OPERATION;N  .MACRO CACHE$ ARG,ARG2. .IF DF P$$D70 & M$$PROI < .IF IDN ,. BIC #BYPASS,@$MPCSR+6 .ENDC W .IF IDN ,6 BIS #BYPASS,@$MPCSR+6 .ENDC . .IF IDN , BIS #FLUSH,@$MPCSR+6N .ENDC  .IF IDN ,F MOV @$MPCSR+6,-(SP) BIC #^C,(SP)  .IF DIF , BIC (SP),@$MPCSR+6M .IFF BIS #BYPASS,@$MPCSR+6 .ENDC .ENDC Y .IF IDN ,S BIC #BYPASS,@$MPCSR+6 BIS (SP)+,@$MPCSR+6 .ENDC  .ENDC .ENDM  A;A; SAVE NONVOLATILE REGISTERS;M .MACRO SAVNRI JSR R5,$SAVNR .ENDM;A; STATE SWITCHING MACRO;F .MACRO SWSTK$ ARG CALL $SWSTK,ARG .ENDM;'; TALLY A FIELD IN SYSTEM ACCOUNT BLOCK$;S .MACRO TALLY$ OFF,CND,PROCR .IF DF X$$ACC&A$$CNT&CNDS MOV R0,-(SP)S MOV #140002+OFF,R0R .IF IDN ,, CALL $ACINP .IFF ; IDN , CALL $ACINC .ENDC ; IDN ,N .ENDC ; DF X$$ACC&A$$CNT&CNDB .ENDM;R5; CPR SEND MACRO -- SEND A PACKET TO CPRAME OR CPRSYSN;A$ .MACRO CPSEN$ OPCODE,BUF,LEN,SHRBAS .MCALL MOV$ MOV$ SHRBAS MOV$ LENT MOV$ BUF MOV$ OPCODE .IF DF VC$CPR S CALL @CPSEN .IFF CALL $CPSEN .ENDC ;VC$CPR .ENDM .IIF NDF S$$YDF , .LISTCR .IF DF X$$ACC&A$$CNT&CNDS MOV R0,-(SP)S MOV #140002+OFF,R0R .IF IDN ,, CALL $ACINP .IFF ; IDN , CALL $ACINC .ENDC ; IDN ,N .ENDC ; DF X$$ACC&A$$CNT&CNDB .ENDM;R5; CPR SEND MACRO -- SEND A PACKET TO CPRAME OR CPRSYSN;A$ .MACRO CPSEN$ OPCODE,BUF,LEN,SHRBAS .MCALL MOV$ MOV$ SHRBAS MOV$ LENT MOV$ BUF MOV$ OPCODE .IF DF VC$CPR S CALL @CPSEN .IFF C0 PHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADP., q04SEP8710430104SEP87104300 DN .,r04SEP8710420804SEP87104207J5.,67r 04SEP8710414704SEP8710414753s>.,]^r04SEP8710414204SEP87104142\l1g.,MNr04SEP8710414404SEP87104144L1Q\.,tur04SEP8710414504SEP87104145sI2.,34r04SEP8710414304SEP8710414321"C.,TUr<904SEP8710414604SEP87104146S2.,r[q04SEP8710414904SEP871041493.,;<rs04SEP8710414804SEP87104148:G3>.,s04SEP8710425404SEP87104253A.,`as(04SEP8710434204SEP87104341_2OW.,w04SEP8710421504SEP871042158.,:;x04SEP8710431404SEP871043149+INK.,./x04SEP8710432004SEP87104320-"K2>.,x04SEP8710432104SEP87104320 PK$.,x04SEP8710421304SEP871042137U.,xX04SEP8710422304SEP87104222W9_.,67x04SEP8710424804SEP871042475@kD.,x(04SEP8710433804SEP87104338N`.3,x[q04SEP8710441004SEP87104410V.,y04SEP8710424204SEP87104241D>F.,y(04SEP8710433604SEP87104335ML..,y[q04SEP8710440604SEP87104405Tz9.,&'z04SEP8710431604SEP87104316%3J<.,z(04SEP8710435004SEP87104350SQW.@,z[q04SEP8710442304SEP87104422Y@.,}04SEP8710422904SEP87104229:$.,~04SEP8710423904SEP871042380=. ,~(04SEP8710433404SEP87104333MR.,,~[q04SEP8710440404SEP87104403TW;., ~04SEP8710421704SEP87104216 8.,404SEP8710422604SEP87104226:.,T04SEP8710430004SEP87104259xD1.,&'|04SEP8710420504SEP87104205%4$/.,|(04SEP8710432304SEP87104323fKD\.#,|[q04SEP8710435504SEP87104355RԲ.,?@04SEP8710424404SEP87104243>?*Z. , !(04SEP8710433504SEP87104334Mr.0,&'[q04SEP8710440804SEP87104407%V# .,04SEP8710430704SEP87104306̧F.,04SEP8710421804SEP8710421788.,:;04SEP8710425104SEP871042499;Au.,(04SEP8710434004SEP87104340O>.5,[q04SEP8710441204SEP87104412V PUFDTz,P.B,z ezy04SEP8710451704SEP87104516 \C.A,ezz04SEP8710451604SEP87104514[\sD.C,V04SEP8710451904SEP87104518\q=PUFDwvz P.{ ODkQ04SEP8710473304SEP87104733IwdH.h GzCkQ04SEP8710455604SEP871045550.D Es ~kQ04SEP8710452404SEP87104523]".e A""|skQ04SEP8710455304SEP87104552ak20=.c Lp kQ04SEP8710471004SEP87104709#q\N. I skQ04SEP8710480204SEP87104802~|9.j P77* kQ04SEP8710471604SEP871047156rS.d IxkQ04SEP8710455204SEP87104551_{. N$$skQ04SEP8710480304SEP87104802#|T.E HskQ04SEP8710452504SEP87104524]^$.F CdBkQ04SEP8710452604SEP87104525]a". GMM$TskQ04SEP8710474304SEP87104742Ly܀. P{2kQ04SEP8710463904SEP87104638f.M WHH{~kQ04SEP8710464704SEP87104646G{gy. NB| kQ04SEP8710475604SEP87104755%h{S. I$|@ykQ04SEP8710463904SEP87104639f/. D DHqkQ04SEP8710462904SEP87104628 c8). ?kQ04SEP8710462904SEP87104629c\E.` Wjj@`kQ04SEP8710470504SEP87104704in}.I O pkQ04SEP8710464304SEP87104643 g >.J Lh<}kQ04SEP8710464404SEP87104644g^.. SRRkQ04SEP8710464004SEP87104640Qf._ U++@`kQ04SEP8710470404SEP87104704*znr?.w NIIFskQ04SEP8710461004SEP87104610H`^.G HskQ04SEP8710452604SEP87104526]..x NDDLskQ04SEP8710461104SEP87104611C4a[. ?HqkQ04SEP8710462304SEP87104622`W.U Eh`kQ04SEP8710465504SEP87104655m. CRdkQ04SEP8710475304SEP87104753{*. NYY skQ04SEP8710473704SEP87104737XNxL.I HhskQ04SEP8710452804SEP87104528]2.` K>>skQ04SEP8710454804SEP87104547=T_4]. E kQ04SEP8710474704SEP87104746z.J C"p&kQ04SEP8710452904SEP87104528]c. W))wkQ04SEP8710474104SEP87104740(\y[b.d H kQ04SEP8710471104SEP87104710q9?.r G2p:kQ04SEP8710460404SEP87104604N1).j I!!hLkQ04SEP8710455804SEP87104557 0J. Gv`TkQ04SEP8710462004SEP87104620b. BhxdkQ04SEP8710462404SEP87104624b. HskQ04SEP8710473904SEP87104738xP.K L kQ04SEP8710453004SEP87104529]o.L F@kQ04SEP8710453104SEP87104530].~ GTTskQ04SEP8710473604SEP87104736Swt.} O--f@ykQ04SEP8710473504SEP87104735,wh. WGG09kQ04SEP8710463604SEP87104636Fue/. DkQ04SEP8710475004SEP87104750{y. H BhkQ04SEP8710474804SEP87104747 z.P K,,fkQ04SEP8710465004SEP87104649+gG.l FH0 kQ04SEP8710471804SEP87104717r. Sp:kQ04SEP8710463504SEP87104634dK.M UhLkQ04SEP8710453104SEP87104531].i F fkQ04SEP8710455704SEP871045560.N JykQ04SEP8710453204SEP87104532^ .{ L ~kQ04SEP8710461404SEP87104613 a1.n KkQ04SEP8710460104SEP871046000. R^kQ04SEP8710463804SEP87104637ݼe. KrrkQ04SEP8710463104SEP87104631qcs%.N IJGkQ04SEP8710464804SEP87104647g .a z'kQ04SEP8710470704SEP87104706op*.p J`kQ04SEP8710460304SEP87104602 1q.t SYY:kQ04SEP8710472604SEP87104726X^uS.O I%%\8 kQ04SEP8710464804SEP87104648$g.m LlX kQ04SEP8710471804SEP87104718 s(. A!kQ04SEP8710474204SEP87104741yR. M08"kQ04SEP8710462104SEP87104620b.k GkQ04SEP8710471704SEP87104717r#.o EkQ04SEP8710460204SEP871046010.n @ XRkQ04SEP8710471904SEP87104719)s\.Q LXX&gkQ04SEP8710465104SEP87104650bT*hr. IpqkQ04SEP8710462504SEP87104625bJ-.O J ykQ04SEP8710453304SEP87104533^'. Wgg`kQ04SEP8710462604SEP87104625fb. GkQ04SEP8710461704SEP87104616bD.f K6`kQ04SEP8710471204SEP87104712r.b A XkQ04SEP8710455004SEP87104549_Z.a AykQ04SEP8710454904SEP87104548_#'.[ WfkQ04SEP8710470004SEP87104700m3. I%%skQ04SEP8710475204SEP87104752$h{^.P H$skQ04SEP8710453404SEP87104533^U/. JHkQ04SEP8710464204SEP87104641gi.\ ?XHqkQ04SEP8710470104SEP87104701n$.y H%%jyZkQ04SEP8710473204SEP87104731$v>.y H((skQ04SEP8710461204SEP87104612'xaB. G_kQ04SEP8710462304SEP87104623bw .i KRR&skQ04SEP8710471504SEP87104714Qar<.l F$$ L!skQ04SEP8710455904SEP87104559 00FK.v H<""`kQ04SEP8710472904SEP87104728vsB. IQQ#"kQ04SEP8710462704SEP87104626PZc.f D "ZkQ04SEP8710455404SEP87104554 B0. Izz#kQ04SEP8710474404SEP87104743yyV.R A# XkQ04SEP8710453604SEP87104536^. M88B#wkQ04SEP8710474904SEP871047497z.m F #_kQ04SEP8710460004SEP871046000.z K449skQ04SEP8710473304SEP871047323w. Iy:kQ04SEP8710463404SEP87104634d'.e Jff&y:~kQ04SEP8710471204SEP87104711eq-.q Rd:kQ04SEP8710472304SEP87104722t{. PGGHskQ04SEP8710475504SEP87104754F{ . R\\,KskQ04SEP8710482504SEP87104825[. TrrYMkQ04SEP8710474004SEP87104739qx. H))*oMkQ04SEP8710463304SEP87104633(d. NGGMskQ04SEP8710482304SEP87104822F<`.U G++MskQ04SEP8710453804SEP87104538*^z.g J222$NskQ04SEP8710455504SEP871045551N0,S.u PZZQkQ04SEP8710472804SEP87104727Yu.q P,,bRkQ04SEP8710460304SEP87104603+"1. O~~4RskQ04SEP8710461904SEP87104618}!b.V GCCRskQ04SEP8710453904SEP87104539B^R.r I/SxkQ04SEP8710472404SEP87104724u,.K N``LSskQ04SEP8710464504SEP87104644_g.w GSZkQ04SEP8710472904SEP87104729)vh.k KS`kQ04SEP8710455804SEP8710455809.t V??f;TdkQ04SEP8710460804SEP87104606 k13R3yA;J`/.| Nkk. F$z8kQ04SEP8710483404SEP87104834k.x Nnz kQ04SEP8710473104SEP87104730;v3k.S P%%}kQ04SEP8710465304SEP87104653$m^S. W! kQ04SEP8710481504SEP87104814<. E #pkQ04SEP8710481904SEP87104819\. M#8;kQ04SEP8710481804SEP87104818{. EZ#}kQ04SEP8710482204SEP87104822G. Pll$` kQ04SEP8710480504SEP87104804k|v. M&dkQ04SEP8710480604SEP87104805}. R)kQ04SEP8710480704SEP87104806;}s. SUUt)XkQ04SEP8710482004SEP87104820TX. P*kQ04SEP8710481304SEP871048135!. Pxx,2kQ04SEP8710482404SEP87104824w. O-kQ04SEP8710481104SEP87104811>F. >-8;kQ04SEP8710483204SEP87104832lv. H -`^kQ04SEP8710481604SEP87104815`. M/0kQ04SEP8710480104SEP87104801k|hT. O/8;kQ04SEP8710481204SEP87104812&6t. V~~2kQ04SEP8710480804SEP87104807}~'=. MBBX3kQ04SEP8710480904SEP87104808A~. X4`kQ04SEP8710482104SEP87104821eV. M`5vkQ04SEP8710483304SEP87104833 sg. N..92kQ04SEP8710481704SEP87104816-9. W==F9p5kQ04SEP8710481104SEP87104810<~. >*9>kQ04SEP8710480404SEP87104803|l. FT9KkQ04SEP8710482904SEP87104828 Ï. Nd9kQ04SEP8710481804SEP87104817g&. DlkQ04SEP8710461704SEP87104617b'3.[ G skQ04SEP8710454404SEP87104543 #_.s G zkQ04SEP8710460504SEP87104605e1f. N55skQ04SEP8710475104SEP8710475143{R. Wj̖skQ04SEP8710483104SEP87104829 . 6ؖHqkQ04SEP8710481004SEP87104809~(. FBBj skQ04SEP8710482604SEP87104826AW.\ GskQ04SEP8710454504SEP87104544._. NęskQ04SEP8710475704SEP87104757{. B ƙp:kQ04SEP8710475804SEP87104758 |. K''ЙHqkQ04SEP8710475904SEP87104758&|. S,,ԙh~kQ04SEP8710480004SEP87104759+?|PUFDwz PPUFDwz PPUFDwz PPUFDxz P.H ^04SEP8710491204SEP87104911 9PUFDvz%P.%A G}04SEP8710494404SEP87104943^^6.S%?G}(04SEP8710491504SEP87104915mp.T%G `DkQ04SEP8710491604SEP87104915 Q8.%HzDkQ04SEP8710494804SEP87104948a+.Z%ERD9ykQ04SEP8710491604SEP87104916Ăf.]%?DjkQ04SEP8710491704SEP87104917ɂ!.^%ADkQ04SEP8710491804SEP87104917 ςk=.%DD@,kQ04SEP8710494604SEP87104945^^ _G_JM.%E D:kQ04SEP8710495004SEP87104950 b)9._%DD:kQ04SEP8710491904SEP87104918݂U.|%FD:kQ04SEP8710491904SEP87104919X.}%ED:kQ04SEP8710492004SEP87104920N.~%ED:kQ04SEP8710492104SEP87104920P.%A(D:kQ04SEP8710492204SEP87104921O.%DTD:kQ04SEP8710492204SEP87104922LR.%?DhzkQ04SEP8710495104SEP87104951cZv.L%DHD}kQ04SEP8710492304SEP87104923 x.V%? LErkQ04SEP8710492404SEP87104923 8.%C EykQ04SEP8710494704SEP87104946K_aq.W%?*DEy_kQ04SEP8710492404SEP87104924",x.Q%G .DEz_kQ04SEP8710491404SEP87104914 y.Y%EGEHSkQ04SEP8710492604SEP871049264m.Z%?NEkQ04SEP8710492704SEP871049269J#.p%B liE.kQ04SEP8710492704SEP87104927 ?xN.%@ iE]kQ04SEP8710494704SEP87104947 a`.%@iEhzkQ04SEP8710492804SEP87104927I>.%AoEhzkQ04SEP8710492904SEP87104928P7.%DrEkQ04SEP8710494904SEP87104948a3.%?fsEkQ04SEP8710492904SEP87104929W0.%AsE'kQ04SEP8710493004SEP87104930[c0.%@ vEkQ04SEP8710493104SEP87104930 _ 6.%@ EhjkQ04SEP8710493204SEP87104931 j.%?EkQ04SEP8710493204SEP87104932t.%KEL;kQ04SEP8710494304SEP87104943I^B.%ET-FykQ04SEP8710493304SEP87104933zv.%IFkQ04SEP8710493404SEP87104933~B.%?bF zkQ04SEP8710493404SEP87104934<.%AFKkQ04SEP8710493604SEP87104935uh.%@AG@kQ04SEP8710493504SEP87104935ש.%CRG@kQ04SEP8710493904SEP87104939]{.%C(GLkQ04SEP8710493804SEP87104937m.%?G8^kQ04SEP8710493804SEP87104938]W.%K $Gp kQ04SEP8710493704SEP87104936 p5.%? G}kQ04SEP8710494504SEP87104945 z^.%CGkQ04SEP8710494904SEP87104949b8 .%?G kQ04SEP8710494004SEP87104939]y .%?tG8kQ04SEP8710494104SEP87104940]3^d.%?lG@`kQ04SEP8710494104SEP871049414^>V.%A hG kQ04SEP8710494204SEP87104942 ?^.X%C GkQ04SEP8710492504SEP87104925 '>.%A*KkQkQ04SEP8710494204SEP871049419^K.%lF "S04SEP8710494404SEP87104944e^VPUFDz%P.%9DE D04SEP8710495704SEP87104956c.%4DEv04SEP8710495804SEP87104957c.%:GEQ04SEP8710500004SEP87105000f].%AF 04SEP8710495604SEP87104956c.%nF 04SEP8710495804SEP87104958c.%(F`04SEP8710495904SEP87104959c[.%&PJx04SEP8710500004SEP87104959f =PUFDOzP.2_Mp:04SEP8710500604SEP87105006f*`PUFD=pzP./  04SEP8710500904SEP87105008fK.dp04SEP8710501004SEP87105009f.M,04SEP8710501004SEP87105010fug}.e"04SEP8710501104SEP87105011xg.2_Mp:04SEP8710501204SEP87105011yg\.N,UC;04SEP8710501204SEP87105012zgmb.bxH04SEP8710501304SEP87105012m;. *x04SEP8710501304SEP87105013m.N hL(04SEP8710501404SEP87105014m.E22skQ04SEP8710501504SEP87105014m,jsB.AkQ04SEP8710501604SEP87105015s1<.J//xkQ04SEP8710501604SEP87105016.s9z.@:3@kQ04SEP8710501704SEP87105017sVd.OyxskQ04SEP8710501804SEP87105017sw.N hLkQ04SEP8710501904SEP87105018s.NęskQ04SEP8710501904SEP87105019sJ.3 $ԙkQ04SEP8710502004SEP87105020 t.""`04SEP8710502104SEP87105020 t.w"04SEP8710502204SEP87105021t%. zv04SEP8710502204SEP87105022tU.X+04SEP8710502304SEP87105023t-g.)u'Ԁ04SEP8710502404SEP87105023t$x.Ry'Ԁ04SEP8710502404SEP87105024tx.!y'Ԁ04SEP8710502504SEP87105025tdz.)y'Ԁ04SEP8710502604SEP87105026t{.22XMԀ04SEP8710502704SEP87105026 t.PfM+Ԁ04SEP8710502704SEP87105027"t .N "Ԁ04SEP8710502804SEP87105028 ;t}.<.kQ04SEP8710502904SEP87105028Eth.6 ,wqkQ04SEP8710503004SEP87105029 Xt.; RVqMkQ04SEP8710503004SEP87105030 bt.; L"wkQ04SEP8710503104SEP87105031 nt .7 :dwkQ04SEP8710503204SEP87105031 xt.wq04SEP8710503304SEP87105032a.VqM04SEP8710503404SEP87105033."w04SEP8710503404SEP87105034Ѕ .:dw04SEP8710503504SEP87105035GU PUFDzP.<=z,04SEP8710515804SEP87105049 ;>.X d1KX04SEP8710520004SEP87105200 Z. i==Pwdd04SEP8710520304SEP87105202<. sLLNwF 04SEP8710520104SEP87105200Kf .P wf'04SEP8710504704SEP87105047 E.B4z,04SEP8710504704SEP871050469.;$sQkQ04SEP8710504604SEP87105045. O#(Ԁ04SEP8710520404SEP87105204^-. N{QGwԀ04SEP8710520504SEP87105205. O{QrwԀ04SEP8710520604SEP87105205.Oy Ԁ04SEP8710520704SEP87105207.O>y2 Ԁ04SEP8710520804SEP87105208HPDATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATAP0eeeeaek .TITLE BSDRVR .IDENT /01.02/ ;P5; COPYRIGHT (C) 1981 BY DIGITAL EQUIPMENT CORPORATION2; ALL RIGHTS RESERVED.;O<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;N; VERSION 01.021;;; M. B. GROSSMAN 15-JUL-79;C; DT03/DT07 BUS SWITCH;C; MODIFIED BY:;;; B. S. MCCARTHY 1-FEB-802;)1; BM058 -- UPDATE COMPLEMENT TABLE ($CRMTB) WHENI(; UPDATING CPU RUN MASK TABLE ($URMTB); ; B. S. MCCARTHY 1-MAR-82;I'; BM242 -- DON'T LOG BUS SWITCH ERRORSY;H; MACRO LIBRARY CALLSQ;M .MCALL HWDDF$,PKTDF$,UCBDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS UCBDF$ ;DEFINE UCB OFFSETSE;T;H0; DEVICE CONTROL STATUS REGISTER BIT ASSIGNMENTS; TMO= 100000 ;TIMEOUT ERRORPWF= 040000 ;POWERFAIL ERROR$EXTINT= 010000 ;EXTERNAL INTERRUPTCONN= 000200 ;CONNECT STATUSIE= 000100 ;INTERRUPT ENABLEREQ= 000001 ;REQUEST BITRES= 001000 ;RESET BIT;T; SPECIA# .TITLE KRLOC RELOCATE USER ADDRESS .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSL UCB OFFSETS2;-.U.ASTA=U.CNT+2 ;AST ADDRESS OFFSET (U.CNT+2)2U.ASTE=U.ASTA+2 ;AST ERROR CODE OFFSET (U.CNT+4); ; SPECIAL SCB STATUS CODES$PWFB=2 ;BUSY DUE TO POWER FAILURE!QIOB=1 ;BUSY DUE TO NORMAL QIO;; DRIVER DISPATCH TABLEE;T DDT$ BS,D$$T07S;+); **-BSINI-DT03/DT07 BUS SWITCH INITIATOR ;W;; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN28; AN I/O REQUEST IS QUEUED AND AT THE END OF A PREVIOUS 9; I/O OPERATION TO PROPAGATE THE EXECUTION OF THE DRIVER.C2; IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN1; ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST 6; IF THE CONTROLLER IS BUSY A RETURN TO THE CALLER IS 6; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN1; THE NEXT I/O OPERATION IS INITIATED. THIS CYCLE ); CONTINUES UNTIL THE I/O QUEUE IS EMPTY.S;C ; INPUTS: ;W:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.; ; OUTPUTS:;T4; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O%; REQUEST IS WAITING TO BE PROCESSED,R0; THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-; ATION IS INITIATED.M;- .ENABL LSBNBSINI:0 GTPKT$ BS,,,,T ;GET NEXT I/O PACKET TO PROCESS; ;R2; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT :; '; R1=ADDRESS OF THE I/O REQUEST PACKET.E; R2=PHYSICAL UNIT NUMBER.; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK. :; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;1; DT03/DT07 BUS SWITCH I/O REQUEST PACKET FORMAT:O; "; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK.G=; WD. 03 -- POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER. >; WD. 04 -- CONTENTS OF 1ST LUN WORD IN REQUESTOR TASK HEADER.1; WD. 05 -- I/O FUNCTION CODE (IO.RLB OR IO.WLB).E0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.; IF FUNCTION IO.DIS:,; WD. 12 -- TIMEOUT. (LESS THAN 254 SECONDS); WD. 13 -- CPU. (PORT NUMBER); IF FUNCTION IO.CON:1; WD. 12 -- RETRY COUNT (-1 MEANS INFINITE RETRY)4; WD. 13 --TARGET CPU (CLOSELY COUPLED CPU'S LETTER); IF FUNCTION IO.ATT:; WD. 12 -- AST ADDRESS.; IF FUNCTION IO.SWI:.; WD. 12 -- CPU (CLOSELY COUPLED CPU'S LETTER);E;;+=; THE FOLLOWING ROUTINE INITIALIZES THE I/O FUNCTIONS HANDLEDT8; BY THIS DRIVER. ( ATTACH,DETACH,CSR,CONNECT,DISCONNECT;; AND SWITCH) THE SWITCH FUNCTION COMBINES VARIOUS SEGMENTS ;; OF THE DISCONNECT AND CONNECT CODE ALONG WITH UNIQUE CODEE>; OF ITS OWN IN ORDER TO PERFORM00elDATADATADATADATADATADATADATADATADATADATA A TRANSFER OF THE BUS BETWEEN?; TWO CLOSELY COUPLED PROCESSORS. IT FIRSTS BEGINS A DISCONNECTE@; FUNCTION STOPPING PRIOR TO RELEASING THE BUS FROM THE CPU THAT<; IS TO BE DISCONNECTED. IT THEN ISSUES A REQUEST ON THE CPU:; THAT IS TO BE CONNECTED. WHEN THE CPU TO BE DISCONNECTED;; RECEIVES AN EXTERNAL INTERRUPT FROM THE SPECIFIED CONNECTI;; CPU IT THEN COMPLETES THE DISCONNECT AND ALLOWS THE NEWLYS-; CONNECTED CPU TO RECEIVE CONTROL OF THE BUSA;-;T4 CMPB #IO.DET/^D<256>,I.FCN+1(R1) ;DETACH FUNCTION? BNE 10$ ;IF NE NOE" CLR U.ASTA(R5) ;CLEAR AST ADDRESS% CLR U.ASTE(R5) ;CLEAR AST ERROR CODEC' TST S.KRB(R4) ;IS PROCESSOR CONNECTED?F BEQ 15$ ;IF EQ NOS% MOV @S.KRB(R4),R2 ;STORE CSR ADDRESSE BR 50$ ;DISCONNECT CPU910$: CMPB #IO.ATT/^D<256>,I.FCN+1(R1) ; ATTACH FUNCTION?V BNE 20$ ;IF NE NOU- MOV I.PRM(R1),U.ASTA(R5) ;STORE AST ADDRESSO+ MOV #1,U.ASTE(R5) ;STORE DEFAULT AST ERROR15$: JMP IOSUC ;COMPLETE I/OR.20$: MOV #IE.BAD&377,R0 ;ASSUME BAD PARAMETERS7 CMPB #IO.CON/^D<256>,I.FCN+1(R1) ; CONNNECT FUNCTION?U BEQ 110$ ;IF EQ YESD TST S.KRB(R4) ;CONNECTED? BEQ 44$ ;IF EQ NOT& MOV @S.KRB(R4),R2 ;STORE CSR ADDRESS 2 CMPB #IO.CSR/^D<256>,I.FCN+1(R1) ; CSR FUNCTION? BNE 30$ ;IF NE NOC' MOV (R2),R1 ;PREPARE FOR CSR TRANSFERC BR 15$;:30$: CMPB #IO.SWI/^D<256>,I.FCN+1(R1) ; SWITCH FUNCTION ? BNE 40$ ;IF NE NOD# MOV I.PRM(R1),R3 ;STORE CPU LETTERA BR 120$ ;START CONNECT PROCESS/40$: CMP #IO.DIS,I.FCN(R1) ;REGULAR DISCONNECT? + BEQ 50$ ;IF EQ YES, ELSE SPEC. DISCONNECT ! CMP #3,I.PRM+2(R1) ;PORT # LEGAL; BLO 44$ ;IF LO NOB, CMP I.PRM(R1),#254. ;TIMEOUT LESS THAN MAX. BLO 45$ ;IF LO NOS44$: JMP IOEND*45$: MOVB I.PRM(R1),S.CTM(R4) ;SET TIMEOUT BNE 48$ ;IF NE USE SPEC. VALUE, MOVB S.ITM(R4),S.CTM(R4) ;ELSE USE DEFAULT 48$: RETURNWPMATCH: ;REF LABELS#50$: MOV #IS.SUC&377,R0 ;SUCCESSFULD DISCON: BIS #RES,(R2) ;RESET BUS- BIC #IE!REQ,(R2) ;CLEAR INT. ENABLE AND REQ.P+ BIC U.CW3(R5),@$CPURM;UPDATE PROCESSOR URMQ5 BIS U.CW3(R5),@$CPCRM ;UPDATE COMPLEMENT OF RUN MASK+ CMPB #QIOB,S.STS(R4) ;REAL I/O? BNE 75$ ;IF NE NOR5 CMPB #IO.SWI/^D<256>,I.FCN+1(R1) ; SWITCH FUNCTION? BNE 70$ ;IF NE NOM6 MOV I.PRM+10(R1),S.URM(R4) ;RESTORE CONNECT CPU'S URM, MOV I.PRM+12(R1),S.KRB(R4) ;RESTORE CONNECT ; CPU'S KRB POINTER$ CALL $CFORK ;SWITCH TO CONNECT CPU% MOV @S.KRB(R4),R2 ;STORE CSR ADDRESSI" BIT #CONN,(R2) ;IS CPU CONNECTED? BEQ 60$ ;IF EQ NOB JMP IOCMP+60$: MOV #IE.CNR&377,R0 ;CONNECTION FAILUREQ"70$: CLR S.KRB(R4) ;PUT SB OFFLINE BR 44$ ;ENDM"75$: CLR S.KRB(R4) ;PUT SB OFFLINE* TST U.ASTA(R5) ;IS AST ADDRESS SPECIFIED? BEQ 48$ ;IF EQ NOI" MOV #6*2,R1 ;LENGTH OF AST BLOCK$ CALL $ALOCB ;ALLOCATE AN AST BLOCK' BCS 48$ ;IF ALLOCATE FAIL JUST RETURNR TST (R0)+ ;SKIP OVER LINK WORD% MOV R1,(R0)+ ;SAVE SIZE OF AST BLOCKO& MOV R0,R1 ;SAVE BEGINNING ADDRESS OF CMP -(R1),-(R1) ; AST BLOCKI1 MOV #10*2,(R0)+ ;SAVE BYTES TO ALLOCATE ON STACK- MOV U.ASTA(R5),(R0)+ ;SAVE AST TRAP ADDRESS0, MOV #1,(R0)+ ;SAVE NUMBER OF AST PARAMETERS' MOV U.ASTE(R5),(R0) ;SAVE ERROR NUMBERT, MOV U.ATT(R5),R0 ;GET ADDRESS OF TASK'S TCB- CALLR $QASTT ;INSERT AST BLOCK IN AST QUEUEB;K/;THE FOLLOWING CODE INSURES THAT THE CPU TO BE .;CONNECTED IS ONLINE, HAS ACCESS TO THE SWITCH;AND THAT ITS KRB IS ONLINE.;S9110$: MOVB I.PRM+2(R1),R3 ;STORE CPU LETTER IF TARGET CPU  BNE 120$ ;IF NE YES & MOVB $PROC2,R3 ;STORE CPU WORD OFFSET BR 125$-120$: SUB #101,R3 ;CONVERT ASCII LETTER TO #T+ BLT 121$ ;CPU LETTER LESS THAN 'A'- ERRORS ASL R3 ;CONVERT TO WORD OFFSET' BIT $BTMSK(R3),$URMST ;IS CPU ONLINE?G BNE 125$ ;IF NE YESB MOV #IE.OFL&377,R0 ;T121$: JMP IOEND 3125$: MOV $BTMSK(R3),R3 ;STORE TARGET CPU MASK WORDT MOV R4,R1/ ADD #S.KTB,R1 ;STORE ADDRESS OF FIRST KTB WORDT/140$: MOV (R1)+,R2 ;MOVE ADDRESS OF KRB INTO R2)) BEQ 121$ ;ADDRESS TERMINATOR? IF EQ YES1( BIT R3,K.URM(R2) ;DOES CPU HAVE ACCESS? BEQ 140$ ;IF EQ NO' MOV #IE.OFL&377,R0 ;ASSUME OFFLINE KRBT( BIT #KS.OFL,K.STS(R2) ;IS KRB OFFLINE?00ee20eeaek BNE 121$ ;IF NE YES;% MOV S.PKT(R4),R1 ;RESTORE I/O PACKET,5 CMPB #IO.SWI/^D<256>,I.FCN+1(R1) ; SWITCH FUNCTION?# BNE 150$ ;IF NE NO;M5;NOTE!!! THE PORT NUMBER OF THE DT07 THAT CORRESPONDSK9;TO A SPECIFIC CPU/KRB IS STORED IN THE LOW BYTE OF K.PRMK;W3 MOVB K.PRM(R2),I.PRM+2(R1) ;STORE CONN. CPU PORT #)7 MOV S.URM(R4),I.PRM+4(R1) ;STORE DISCONNECT CPU'S URMR9 MOV S.KRB(R4),I.PRM+6(R1) ;STORE DIS. CPU'S KRB POINTERE1150$: MOV I.PRM(R1),U.CW2(R5) ;STORE RETRY COUNTS+ MOV K.URM(R2),S.URM(R4) ;STORE URM IN SCB;. MOV R2,S.KRB(R4) ;STORE POINTER TO KRB IS SCB- CALL $CFORK ;SWITCH, IF REQ., TO PROPER CPU#% MOV @S.KRB(R4),R2 ;STORE CSR ADDRESSE1 MOV #IE.BAD&377,R0 ;ASSUME CPU ALREADY CONNECTEDP" BIT #CONN,(R2) ;IS CPU CONNECTED? BEQ 160$ ;F EQ NOM, JMP IOCMP ;COMPLETE CONNECTION IF REQUIRED2160$: MOV S.PKT(R4),R1 ;RESTORE I/O PACKET ADDRESS5 CMPB #IO.SWI/^D<256>,I.FCN+1(R1) ; SWITCH FUNCTION?' BNE CONBS ;IF NE NOO' MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUTS;M4;THE SWITCH FUNCTION ISSUES A CONNECT REQUEST ON THE3;CPU TO BE CONNECTED AFTER RESTORING THE DISCONNECTS4;CPU'S URM TO S.URM. THIS INSURES THAT THE INTERRUPT5;THAT WILL BE CAUSED BY THE DISCONNECT CPU'S EXTERNALD6;INTERRUPT BIT BEING SET WILL CALL THE DISCONNECT CPU.; 5 MOV S.URM(R4),I.PRM+10(R1) ;STORE CONNECT CPU'S URMD3 MOV I.PRM+4(R1),S.URM(R4) ;RESTORE DIS. CPU'S URM2 BIS #S2.ACT,S.ST2(R4) ;SET CONTROLLER ACTIVE FLAG BIS #REQ,(R2) ;ASSERT REQUEST* RETURN ;AWAIT CONNECTED CPU'S INTERRUPT-CONBS: MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUTT2 BIS #S2.ACT,S.ST2(R4) ;SET CONTROLLER ACTIVE FLAG0 BIS #IE!REQ,(R2) ;ENABLE INTERRUPTS ASSERT REQ. RETURN .DSABL LSB ;+6; THE POWERFAIL ROUTINE ATTEMPTS TO RESTORE THE STATE <; OF THE SYSTEM PRIOR TO THE POWERFAIL. IF I/O WAS EXECUTING<; THE TIMEOUT IS RESET AND THE PREVIOUS OPERATION CONTINUED.:; IF THE SB WAS PREVIOUSLY CONNECTED TO THIS PROCESSOR AND;; NO I/O WAS EXECUTING A CHECK FOR CONNECTION IS MADE AND AA%; RECONNECT SEQUENCE BEGUN IF NEEDED.M;- T+BSPWF: TST S.KRB(R4) ;WAS SWITCH CONNECTED?S BGT 5$ ;IF GT YESL JMP BSINI,5$: TSTB S.STS(R4) ;IS SWITCH CURRENTLY BUSY BEQ 20$ ;IF EQ NOS) MOVB S.ITM(R4),S.CTM(R4) ;RESET TIMEOUTE 10$: RETURNR)20$: MOV @S.KRB(R4),R2 ;STORE CSR ADDRESSP) BIT #CONN,(R2) ;IS CPU CONNECTED TO BUS?U BNE 10$ ;IF NE YES- MOV #2,U.ASTE(R5) ;ASSUME FAILURE TO CONNECTV) MOVB #PWFB,S.STS(R4) ;SET STATUS TO BUSYO BR CONBS ;CONNECT SWITCH;++; **-$BSINT DT03/DT07 BUS SWITCH INTERRUPTSE,; INTERRUPTS CAN BE ISSUED BY THE BUS SWITCH*; FOR DEVICE POWERFAIL, A REQUEST FOR THE *; BUS BY ANOTHER CPU, TIMEOUT OF A REQUEST5; FOR CONNECT, TIMEOUT OF THE WATCHDOG TIMER AND UPON4*; RECEIVING A CONNECT TO THE SWITCHED BUS.;-6 INTSE$ BS,PR7,D$$T07 ;;;SAVE REGISTERS & SET PRIORITY' MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCB  MOV R1,-(SP) ;;;STORE R1;" CMPB #QIOB,S.STS(R4) ;;;REAL I/O? BNE 10$ ;;;IF NE NOU+ MOV S.PKT(R4),R1 ;;;GET I/O PACKET ADDRESS 7 CMPB #IO.SWI/^D<256>,I.FCN+1(R1) ;;; SWITCH FUNCTION?C BNE 10$ ;;;IF NE NO 3 MOV S.KRB(R4),I.PRM+12(R1) ;;;STORE CONNECT CPU'S  ;;; KRB POINTER; MOV I.PRM+6(R1),S.KRB(R4) ;;;RESTORE DISCONNECT CPU'S KRBM+10$: MOV @S.KRB(R4),R1 ;;;STORE CSR ADDRESSI, TST (R1) ;;;WATCHDOG OR REQUEST TIMER SET? BMI 60$ ;;;IF MI YES( BIT #EXTINT,(R1) ;;;EXTERNAL INTERRUPT? BEQ 50$ ;;;IF EQ NOE;;3;THIS SECTION INSURES THAT IF AN EXTERNAL INTERRUPT 6;BIT IS SET THAT IT WILL BE CLEARED IN TIME TO PREVENT8;THE TIMEOUT LOSS OF THE BUS. INITIAL PROCESSING IS DONE5;AT PRIORITY 7 TO INSURE THAT THE TIME LIMIT WILL BE T6;MET AND THAT THE EXECUTIVE TIMEOUT COUNT IS NOT RESET;S" MOV (R1),-(SP) ;;;STORE CSR VALUE- BIC #EXTINT,(R1) ;;;CLEAR EXTERNAL INTERRUPTR MOV R2,-(SP) ;;;STORE R2G MOV R3,-(SP) ;;;STORE R3I, CMPB #QIOB,S.STS(R4) ;;;IS REAL I/O PENDING BNE 40$ ;;;IF NE NO$+ MOV S.PKT(R4),R2 ;;;GET I/O PACKET ADDRESST8 CMPB #IO.SWI/^D<256>,I.FCN+1(R2) ;;;IS THIS AN IO.SWI? BNE 20$ ;;;IF NE NOT# BIT #74,-4(SP) ;;; IS THIS A DT03?A BNE 30$ ;;;IF NE N00e70DATADATADATADATADATADATADATADATADATADATAOA BR 35$ ;;;<20$: CMPB #IO.DIS/^D<256>,I.FCN+1(R2) ;;;IS THIS AN IO.DIS? BNE 40$ ;;;IF NE NON!30$: MOV #4,R3 ;;;MOVE 4 INTO R3O& ASH I.PRM+2(R2),R3 ;;;CREATE CPU MASK' BIT R3,-4(SP) ;;;IS THIS CORRECT CPU?O BEQ 40$ ;;;IF EQ NO;;O:;THIS SECTION IS ENTERED ONLY IF THE PENDING FUNCTION IS A7;SWITCH OR DISCONNECT AND THEN ONLY IF THE CPU CAUSING R.;THE EXTERNAL INTERRUPT WAS THE SPECIFIED ONE.:;NOTE:IF SWITCH IS A DT03 NO CHECKING OF THE SOURCE OF THE7;INTERRUPT IS POSSIBLE AND THE BUS IS NEVER RELEASED IN09;THE CASE WHERE THE FUNCTION WAS A DISCONNECT AND THE BUS6;IS ALWAYS RELEASED IN THE CASE WHERE THE FUNCTION WAS ;A SWITCH.;235$: MOV (SP)+,R3 ;;;RESTORE R3R MOV (SP)+,R2 ;;;RESTORE R2C TST (SP)+ ;;;RESTORE STACK MOV (SP)+,R1 ;;;RESTORE R1O' CALL $FORK ;;;CREATE A SYSTEM PROCESS ) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSI% MOV @S.KRB(R4),R2 ;STORE CSR ADDRESSP JMP PMATCH ;DISCONNECT40$: MOV (SP)+,R3 ;;;RESTORE R3S MOV (SP)+,R2 ;;;RESTORE R2O TST (SP)+ ;;;RESTORE STACK MOV (SP)+,R1 ;;;RESTORE R1H 45$: RETURNS%50$: BIT #PWF,(R1) ;;;BS POWER LOSS?R BEQ 120$ ;;;IF EQ NO;H5;THIS SECTION HANDLES THE CASE OF AN INTERRUPT CAUSEDS5;BY A POWER FAILURE ON THE SWITCHED BUS. PENDING I/O,R4;EXCEPT A DISCONNECT, IS TERMINATED AND A DISCONNECT;IS PERFORMED.;E' BIC #IE,(R1) ;;; CLEAR INTERUPT ENABLEC MOV (SP)+,R1 ;;;RESTORE R1,' CALL $FORK ;;;CREATE A SYSTEM PROCESSC) MOV @S.KRB(R4),R2 ;PUT CSR ADDRESS IN R2M/ CMPB #QIOB,S.STS(R4) ;IS REAL I/O IN PROGRESS?E BEQ 55$ ;IF EQ YES/ MOV #3,U.ASTE(R5) ;AST ERROR CODE=3, POWERFAIL; CLRB S.STS(R4) ;RESET STATUS; BR 75$O055$: MOV S.PKT(R4),R1 ;GET ADDRESS OF I/O PACKET+ CMPB #IO.DIS/^D<256>,I.FCN+1(R1) ;IO.DIS?  BEQ 45$ ;IF EQ YES) MOV #IE.ABO&377,R0 ;ELSE ABORT OPERATIONC MOV #401,R2 ;NO RETRY COUNTC CALL $IODON ;TERMINATE I/O2 MOV U.SCB(R5),R4 ;STORE SCB ADDRESS LOST IN IODON, MOV S.PKT(R4),R1 ;GET ADDRESS OF I/O PACKET% MOV @S.KRB(R4),R2 ;STORE CSR ADDRESS. BR 75$I;E8;THIS SECTION HANDLES AN INTERRUPT CAUSED BY THE TIMEOUT:;BIT BEING SET. IF THIS WAS CAUSED BY A FAILURE TO CONNECT9;AFTER ISSUING A REQUEST, THE RETRY COUNT IS CHECKED AND 9;THE PROPER ACTION TAKEN. IF THIS WAS CAUSED BY A FAILUREQ6;TO RECONNECT AFTER POWERFAIL A DISCONECT IS INITIATED;AND AN OPTIONAL AST ISSUED.;N/60$: BIC #TMO!EXTINT!IE,(R1) ;;;CLEAR CSR BITSR MOV (SP)+,R1 ;;;RESTORE R1I' CALL $FORK ;;;CREATE A SYSTEM PROCESS/% MOV @S.KRB(R4),R2 ;STORE CSR ADDRESS * CMPB #QIOB,S.STS(R4) ;WAS THIS A CONNECT? BEQ 100$ ;IF EQ YESY CLRB S.STS(R4) ;RESET STATUSF3 CMP U.ASTE(R5),#2 ;IS ERROR A POWERFAIL RECONNECT?I BEQ 75$ ;IF EQ YES3 MOV #1,U.ASTE(R5) ;SET AST ERROR =1, TIMEOUT ERRORF&75$: JMP DISCON ;PERFORM A DISCONNECT1100$: MOV S.PKT(R4),R1 ;GET ADDRESS OF I/O PACKETD" TST U.CW2(R5) ;IS RETRY COUNT =0? BEQ 110$ ;IF EQ YES " CMP #-1,U.CW2(R5) ;IS IT NEG. 1? BEQ 105$ ;IF EQ YESR$ DEC U.CW2(R5) ;DECREASE RETRY COUNT105$: JMP CONBS ;TRY AGAINS)110$: MOV #IE.CNR&377,R0 ;CONNECT FAILUREC BR 75$1 120$: MOV (SP)+,R1 ;;;RESTORE R1' CALL $FORK ;;;CREATE A SYSTEM PROCESSR% MOV @S.KRB(R4),R2 ;STORE CSR ADDRESSI( BIT #CONN,(R2) ;IS BUS PHYSICALY CONN.? BEQ 75$ ;IF EQ NO.IOCMP: BIS #IE,(R2) ;ENSURE INTERRUPTS ENABLED" BIS U.CW3(R5),@$CPURM;SET CPU URM5 BIC U.CW3(R5),@$CPCRM ;UPDATE COMPLEMENT OF RUN MASK;. CMPB #QIOB,S.STS(R4) ;WAS THIS A I/O CONNECT? BEQ IOSUC ;IF EQ YES CLRB S.STS(R4) ;RESET STATUSC& MOV #1,U.ASTE(R5) ;RESTORE ERROR CODE& MOV U.CW3(R5),$PFURM;POWERFAIL UNIBUS$ INCB $PWRFL+1 ; ATTACHED DEVICES RETURNL-IOSUC: MOV #IS.SUC&377,R0 ;I/O WAS A SUCCESSR)IOEND: MOV #401,R2 ;NO RETRIES ATTEMPTED2# CALL $IODON ;FINISH I/O OPERATION  JMP BSINI ;NEXT REQUEST(;+>; TIMEOUT IS USED BY IO.DIS TO LIMIT THE AMOUNT OF TIME WAITEDA; FOR A SPECIFIED LOOSELY COUPLED CPU TO ISSUE A CONNECT REQUEST..6; IF THE CORRECT CPU DOES NOT RESPOND A TIMEOUT ERROR 2; IS GENERATED. ALL OTHER TIMEOUT ENTRIES INDICATE; HARDWARE OR POWER PROBLEMS.3;-BSOUT: ;;;R00e?0fB0eeaekEFERENCE LABEL" MOV #IE.TMO&377,R0 ;TIMEOUT ERROR, MOV S.PKT(R4),R1 ;GET ADDRESS OF I/O PACKET1 CMPB #PWFB,S.STS(R4) ;IS THIS A POWERFAIL ENTRY? BNE 5$ ;IF NE NO CLRB S.STS(R4) ;CLEAR STATUSN BR 10$ ;DISCONNECT95$: CMPB #IO.CON/^D<256>,I.FCN+1(R1) ; CONNECT FUNCTION?D BNE 20$ ;IF NE NOO)10$: MOV @S.KRB(R4),R2 ;STORE CSR ADDRESST JMP DISCONC920$: CMPB #IO.SWI/^D<256>,I.FCN+1(R1) ; SWITCH FUNCTION?D BEQ 30$ ;IF EQ YES,R ; ELSE DIS. TO SPEC. CPU TMO# BIS #IE,(R2) ;RE-ENABLE INTERRUPTSN BR IOEND ;END WAIT330$: MOV I.PRM+6(R1),S.KRB(R4) ;RESTORE DISCONNECTS ; CPU'S KRB POINTER BR IOENDH;+,; CANCEL I/O WILL ZERO AN IO.CON RETRY COUNT4; OR SET S.CTM (TIMEOUT COUNT) TO ONE FOR AN IO.DIS.3; TERMINATION THEN OCCURS THROUGH NORMAL CHANNELS.B;-1BSCAN: MOV S.PKT(R4),R1 ;;;GET I/O PACKET ADDRESSD2 CMPB #IO.DIS/^D<256>,I.FCN+1(R1) ;;; DISCONNECT? BNE 10$ ;;;IF NE NOI& MOVB #1,S.CTM(R4) ;;;SET TIMEOUT TO 1 RETURN ;;; 310$: CMPB #IO.CON/^D<256>,I.FCN+1(R1) ;;; CONNECT?N BNE 20$ ;;;IF NE NOI+ MOVB S.ITM(R4),S.CTM(R4) ;;;RESET TIMEOUT ) CLR U.CW2(R5) ;;;SET RETRY COUNT TO ZERO20$: RETURN ;;;L E .ENDO.CON RETRY COUNT4; OR SET S.CTM (TIMEOUT COUNT) TO ONE FOR AN IO.DIS.3; TERMINATION THEN OCCURS THROUGH NORMAL CHANNELS.B;-1BSCAN: MOV S.PKT(R4),R1 ;;;GET I/O PACKET ADDRESSD2 CMPB #IO.DIS/^D<256>,I.FCN+1(R1) ;;; DISCONNECT? BNE 10$ ;;;IF NE NOI& MOVB #1,S.CTM(R4) ;;;SET TIMEOUT TO 1 RETURN ;;; 310$: CMPB #IO.CON/^D<256>,I.FCN+1(R1 .TITLE EVENT  .IDENT /X01.01/ A;T&; COPYRIGHT (C) 1974, 1978, 1979, 1980/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.E;EA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED 9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.G;I; VERSION X01.01;D; K. E. KINNEAR 2-JUN-78T;O; EVENT TRACE SUBROUTINESB;5; MODIFIED BY:;G; B. S. MCCARTHY 13-AUG-80; ); BM085 -- TURN ON/ENHANCE EVENT LOGGINGF;T ;R; MACRO LIBRARY CALLST;. .MCALL HWDDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS A;+); **-$EVADD-ADD EVENT TO THE EVENT BUFFER ;I9; THIS ROUTINE WILL CHECK THE LENGTH OF THE EVENT AGAINSTW:; THE SPACE REMAINING IN THE BUFFER, AND SWITCH TO ANOTHER;; BUFFER IF NECESSARY. IF SPACE REMAINS, IT WILL PLACE THE =; EVENT HEADER INTO THE BUFFER AND LEAVE THE REGISTERS SET UPC4; FOR THE ADDITION OF THE EVENT SPECIFIC PARAMETERS.;1<; AN INVOCATION OF THE EVENT MACRO WILL CALL THIS ROUTINE IF?; THE EVENT TRACE IS ENABLED FOR THAT EVENT. THIS ROUTINE WILLD@; CALL $SETF IF THE BUFFER IS FULL TO SET LOCAL EVENT FLAG 1 FOR=; THE PRIV. BUFFER DUMPPING TASK. IF THE BUFFER DUMP TASK ISN=; WAITING FOR EVENT FLAG THEN ALL WILL BE WELL, BUT IF IT IS A=; STOPPED FOR EVENT FLAG, POSSBILE PROBLEMS WILL RESULT SINCE ?; $SETF WILL CALL $EXQRN/$NXTSK INSTEAD OF JUST $SETCR. IN ANYUD; CASE, THE MACRO CANNOT BE INVOKED IN ANY AREA WHERE A $SETF/$SETCR; WOULD CAUSE ANY PROBLEMS.L;A; BUFFER FORMAT:; ;; THE FIRST WORD OF EACH BUFFER IS THE LENGTH OF THE BUFFERD@; IN BYTES. IT IS NEVER CHANGED ONCE THE BUFFER IS INITIALIZED.@; A ZERO WORD WHERE AN EVENT IS EXPECTED OR BUFFER FULL ENDS THE8; BUFFER. A NON-ZERO SECOND WORD SHOWS AN ACTIVE BUFFER.B; THE SECOND WORD OF THE BUFFER IS A BUFFER SEQUENCE NUMBER, WHICH@; GOES UP FOR EACH BUFFER. THIS IS USED BY THE BUFFER DUMP TASK+; TO PROPERLY DUMP THE BUFFERS TO THE FILE.A6; THE SECOND WORD MAY ONLY BE CHANGED AT SYSTEM STATE.;>; A BUFFER LIST CONTAINING TWO WORD ENTRIES EXISTS WHICH THIS C; ROUTINE WILL SEARCH TO FIND A FREE BUFFER WHENEVER ONE OVERFLOWS.I;; THE FIRST WORD OF EACH ENTRY IS THE KISAR6 MAPPING TO THEU>; FIRST WORD OF THE BUFFER AND THE SECOND IS THE LENGTH OF THE; BUFFER IN BYTES.;O7; THE EVENT HEADER FORMAT FOR EACH EVENT IS AS FOLLOWS:;O3; +-----------------------------------------------+M; ! CPU NUMBER ! EVENT NUMBER !F3; +-----------------------------------------------+N-; ! SECOND OF MINUTE ! TICK OF SECOND !I3; +-------------------------------------------00fG0gN0TADATADATADATADATADATADATADATADATA----+I"; ! EVENT SEQUENCE NUMBER !3; +-----------------------------------------------+I; ! PARAMETERS !H3; +-----------------------------------------------+L ; ! . !3; +-----------------------------------------------+ ; ! . ! 3; +-----------------------------------------------+- ; ! . !-3; +-----------------------------------------------+-;-;-D; WHEN THE MACRO RECIEVES CONTROL FROM THIS SUBROUTINE, IF THE CARRYA; IS CLEAR THEN R0 POINTS TO THE PLACE TO INSERT THE FIRST OF THE 7; PARAMETERS. KISAR6 IS SET UP CORRECTLY FOR THIS TOO.-;- ; INPUTS:-;-; R0=EVENT NUMBER.;R ; OUTPUTS:;-; IF CC:.; R0=DISPLACEMENT INTO BUFFER FOR PARAMETERS. ; 2(SP)=SAVED KISAR6 VALUE.; KISAR6=SET UP FOR BUFFER. ; ; IF CS:; R0=UNDEFINED.;-; REGISTERS MODIFIED: ; ; NONE.-;- - - .IF DF E$$VNT -0$EVADD::MOV KISAR6,-(SP) ;SAVE THE KISAR6 OFFSET) MOV $EVKS6,KISAR6 ;MAP TO CURRENT BUFFERY ;C4; CHECK FOR ENOUGH ROOM IN THE BUFFER FOR THIS EVENT;H $ MOV R0,-(SP) ;SAVE THE EVENT NUMBER' CLR -(SP) ;FOR MOVB -(SP) INSTRUCTION 2 MOVB $EVTAB(R0),(SP) ;GET THE LENGTH OF THE EVENT+ MOV $EVDIS,R0 ;GET CURRENT BUFFER POSITION / ADD (SP)+,$EVDIS ;ADD EVENT LENGTH TO POSITIONU< CMP $EVLEN,$EVDIS ;COMPARE CURRENT POS WITH LENGTH + 140000 BHI 20$ ;IF HI NOO# BEQ 5$ ;IF EQ BUFFER EXACTLY FULL A;:'; SHOW THIS BUFFER FULL BUT NOT EXACTLY;V V* CLR (R0) ;PLACE ZERO WORD AT LOGICAL EOB H; .; SWITCH BUFFERS -- CURRENT ONE HAS OVERFLOWED; M*5$: MOV #$EVLST,R0 ;SEARCH FOR FREE BUFFER410$: MOV (R0)+,KISAR6 ;GET NEXT BUFFER KISAR6 OFFSET' BEQ 30$ ;IF EQ NO NEXT OFFSET -- OOPSI# TST @#140002 ;IS THIS BUFFER FULL?A BNE 10$ ;IF NE YES T;N ; FOUND EMPTY BUFFER -- CLAIM IT;; P3 MOV KISAR6,$EVKS6 ;SAVE MAPPING TO BUFFER SELECTEDI-15$: INC $EVBSQ ;BUMP BUFFER SEQUENCE NUMBER$ BEQ 15$ ;SEQUENCE NUMBER NEVER = 0C MOV $EVBSQ,@#140002 ;PUT SEQUENCE NUMBER IN SECOND BUFFER POSITION  T;B; ACTIVATE BUFFER DUMP TASKR;W & MOV #1,R0 ;SET UP FOR EVENT FLAG SET MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 MOV R4,-(SP) ;SAVE R4 MOV R5,-(SP) ;SAVE R5 MOV $EVTCB,R5 ;SET UP FOR $SETF CALL $SETF MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3P MOV (SP)+,R2E MOV (SP)+,R1I T;U; SET UP LATEST BUFFER;V ' MOV @#140000,$EVLEN ;GET BUFFER LENGTH 7 ADD #140000,$EVLEN ;MAKE LENGTH INTO END OF BUFFER PTRU MOV (SP),R0 ;GET EVENT NUMBERT, MOV $EVTAB(R0),$EVDIS ;SHOW EVENT IN BUFFER+ MOV #140004,R0 ;INITIAL POSITION IN BUFFER< ADD R0,$EVDIS ;MAKE EVDIS REFLECT POSITION AFTER THIS EVENT V;3; PUT INFORMATION IN BUFFERV;, P320$: MOVB (SP)+,(R0)+ ;PUT EVENT NUMBER INTO BUFFERS  M .IF DF M$$PRO (2 MOVB $PROCN,(R0)+ ;PUT PROCESSOR NUMBER IN BUFFER I .IFFU 3 CLRB (R0)+ ;NO PROCESSOR NUMBER ON SINGLE CPU SYSE U .ENDC  A/ INC $EVSEQ ;BUMP EVENT SEQUENCE NUMBER BY ONE 2 MOV $EVSEQ,(R0)+ ;PLACE SEQUENCE NUMBER IN BUFFER1 MOVB $TTNS,(R0)+ ;PLACE TICK OF SECOND IN BUFFERI5 MOVB $TTNS-2,(R0)+ ;PLACE SECOND OF MINUTE IN BUFFERR CLC RETURN  E;H ; ERROR EXIT; U30$: TST (SP)+ ;CLEAN STACK! INC $EVLOS ;INDICATE EVENT LOSTT SEC RETURNF S .ENDC . D .ENDO (2 MOVB $PROCN,(R0)+ ;PUT PROCESSOR NUMBER IN BUFFER I .IFFU 3 CLRB (R0)+ ;NO PROCESSOR NUMBER ON SINGLE CPU SYSE U .ENDC  A/ INC $EVSEQ ;BUMP EVENT SEQUENCE NUMBER BY ONE 2 MOV $EVSEQ,(R0)+ ;PLACE SEQUENCE NUMBER IN BUFFER1 MOVB $TTNS,(R0)+ ;P .TITLE LTDRVS .IDENT /05/; COPYRIGHT (C) 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.O1; DGITAL EQUIPMENT OF CANADA LTD, KANATA, ONTARIOR;RA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDB9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;P ; VERSION 05;P; DAVID R. CROWE;; PREVIOUSLY MODIFIED BY:I;T; DAVID H. CHAN1; HELEN GORDON; PATRICIA C. LEE6;); ; MODIFIED BY:;S; R. E. CALDWELL 21-AUG-79;A!; RC010 -- FIX BUG IN CANCEL I/00gO0B0eeaekO#; AND USE CORRECT FORM OF GTPKT$.Y;HH; PARALLEL COMMUNICATION LINK (PCL) TRANSMITTER DRIVER FOR RSX-11M-PLUS.;E; MACRO LIBRARY CALLSA;N .MCALL PKTDF$,TCBDF$,UCBDF$$ PKTDF$ ;DEFINE I/O PACKET OFFSETS- TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS.R UCBDF$ ;DEFINE UCB OFFSETSS;+#; STATE SETTINGS FOR 'STC' FUNCTIONS;-SS.MAS = 1 ;MASTER STATECD;EVENT FLAG FEATURE AND SECONDARY STATE CAPABILITY HAVE BEEN REMOVED;SS.SEC = 2 ;SECONDARY STATESS.NEU = 4 ;NEUTRAL STATE;+"; MODE SETTINGS FOR 'STC' FUNCTION;-MS.AUT = 20 ;AUTO ADDRESSMS.ADS = 40 ;ADDRESS SILO;+; CHARACTERISTIC WORD USAGE.+; U.CW2 IS USED BY THE HANDLER AS FOLLOWS:D; BITS 7-0 CONTAIN NUMBER OF RETRIES TO BE PERFORMED AFTER CURRENT; TRY IF NECESSARY.;-;++; HANDLER UCB WORK AREA OFFSET DEFINITIONS.';-,U.EFN = U.CNT+2 ;'NOWMST' EVENT FLAG NUMBER5U.TCB = U.EFN+2 ;TCB ADDRESS OF EVENT FLAG REQUESTORR9U.BUF1 = U.TCB+2 ;RELOCATION BIAS FOR RETURN REG. BUFFERL;+@; THE HARDWARE REGISTERS ARE DEFINED RELATIVE TO THE TCR, WHOSE?; ADDRESS IS FOUND IN THE S.CSR FIELD OF THE SCB AT RUN TIME.R;-'TCR = 0 ;TRANSMITTER COMMAND REGISTER.L&TSR = 2 ;TRANSMITTER STATUS REGISTER.*TSDB = 4 ;TRANSMITTER SOURCE DATA BUFFER.)TSBC = 6 ;TRANSMITTER SOURCE BYTE COUNT. +TSBA = 10 ;TRANSMITTER SOURCE BUS ADDRESS. /TMMR = 12 ;TRANSMITTER MASTER/MAINTENANCE REG.F#TSCRC = 14 ;TRANSMITTER SOURCE CRCS;+%; TRANSMITTER COMMAND REGISTER (TCR).R;-#RIB = 100000 ;RETRY IF BUSY (R/W).G&TXNPR = 40000 ;TRANSMITTER NPR (R/W). SNDWD = 20000 ;SEND WORD (R/W).+DC04 = 10000 ;DESTINATION CODE BITS (R/W).DC03 = 4000 ; "DC02 = 2000 ; "DC01 = 1000 ; "DC00 = 400 ; "RRDSILO = 200 ;READ SILO (R/W).S"IE = 100 ;INTERRUPT ENABLE (R/W).'A17 = 40 ;EXTENDED ADDRESS BITS (R/W).R A16 = 20 ; "E%DTORDY = 10 ;DATA OUTPUT READY (RO). -INHADI = 4 ;INHIBIT ADDRESS INCREMENT (R/W).T#BDINIT = 2 ;BOARD INITIALIZE (WO).O%STTXM = 1 ;START TRANSMISSION (R/W).0>DC = DC04!DC03!DC02!DC01!DC00 ;UNION OF DESTINATION CODE BITS.;+$; TRANSMITTER STATUS REGISTER (TSR).;-ERR = 100000 ;ERROR (RO).+NEXLOC = 40000 ;NONEXISTENT LOCATION (RO).1'MEMOFL = 20000 ;MEMORY OVERFLOW (R/W). *TXMERR = 10000 ;TRANSMISSION ERROR (R/W)."MSTDWN = 4000 ;MASTER DOWN (R/W).TIMOUT = 2000 ;TIME OUT (R/W).OVERUN = 1000 ;OVERRUN (R/W).%DTIRDY = 400 ;DATA INPUT READY (RO).C)SUCTXF = 200 ;SUCCESSFUL TRANSFER (R/W).ZBUSY = 100 ;BUSY (RO).R"SORE = 40 ;SOFTWARE REJECT (R/W).!TDMBSY = 20 ;TDM BUS BUSY (R/W).NRSPB1 = 10 ;RESPONSE B1 (RO).RSPB0 = 4 ;RESPONSE B0 (RO).RSPA1 = 2 ;RESPONSE A1 (RO)..RSPA0 = 1 ;RESPONSE A0 (RO).L;+1; TRANSMITTER MASTER/MAINTENANCE REGISTER (TMMR).X;-; LOW ORDER BYTE (TMMR+0).-TXMAD4 = 20 ;TRANSMITTER ADDRESS BITS (R/W).TTXMAD3 = 10 ; "(TXMAD2 = 4 ; "TXMAD1 = 2 ; "TXMAD0 = 1 ; "; HIGH ORDER BYTE (TMMR+1).F)AOPRDY = 200 ;ADDRESS OUTPUT READY (RO).1(AIPRDY = 100 ;ADDRESS INPUT READY (RO).&CLRADR = 40 ;CLEAR ADDRESS SILO (WO).!AUTADR = 20 ;AUTO ADDRESS (R/W).O CHNOPN = 10 ;CHANNEL OPEN (RO).NOWMST = 4 ;NOW MASTER (R/W).!SEC = 2 ;SECONDARY MASTER (R/W).MASTER = 1 ;MASTER (R/W).;+; PAD TRANSMITTER ID;-PAD = 31. ;PAD TRANSMITTER ID;+; DEVICE DISPATCH TABLES;-- DDT$ LT,L$$T11,,CHK ;GENERATE DISPATCH TABLE;+; LOCAL IMPURE DATA TABLES;-$PRVAL: .BLKW L$$T11 ;PREVIOUS VALUE*ASCNT: .BLKW L$$T11 ;ADDRESS SILO COUNTER0LFVAL: .BLKW L$$T11 ;VALUES LEFT IN USER BUFFER)FRVAL: .BLKW L$$T11 ;FIRST VALUE IN SILOA;+3; LTCHK - PCL TRANSMITTER DRIVER PARAMETER CHECKING4;NJ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUESTD; IS RECEIVED FOR THE PARALLEL COMMUNICATIONS LINK TRANSMITTER. SOMEF; PCL TRANSMITTER REQUESTS CONTAIN INFORMATION THAT MUST BE CHECKED IND; THE CONTEXT OF THE ISSUING TASK; THEREFORE, THE I/O REQUEST IS NOT#; QUEUED BEFORE CALLING THE DRIVER.L;1 ; INPUTS: ;O ; R1 = ADDRESS OF THE I/O PACKET*; R4 = ADD00gW0N0TADATADATADATADATADATADATADATADATARESS OF THE STATUS CONTROL BLOCK;; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATEDV;P ; OUTPUTS:;NB; IF THE QIO FUNCTION IS IO.STC THEN NO PRIOR ADDRESS CHECKING HASE; BEEN PERFORMED BY THE SYSTEM BECAUSE IO.STC IS CLASSED AS A CONTROLS;; FUNCTION. IT IS THEREFORE NECESSARY TO FIRST MOVE ALL THETC; PARAMETERS SO THAT THE ADDRESS DOUBLEWORD FOR THE DATA BUFFER MAY A; BE MOVED TO I.PRM AND I.PRM+2 AFTER IS HAS BEEN ADDRESS CHECKED >; AND RELOCATED. IF THE LENGTH OF THE DATA BUFFER IS ZERO, THEC; ADDRESS CHECK WILL NOT TAKE PLACE AND THE ZERO LENGTH BUFFER WILLE; BE CONSIDERED VALID.;U@; IF THE QIO FUNCTION IS IO.STC OR IO.ATX THEN THE RETURN BUFFER<; ADDRESS IS CHECKED TO DETERMINE WHETHER IT LIES WITHIN THEA; ISSUING TASK'S ADDRESS SPACE. IF IT DOES THEN THE RETURN BUFFERRA; ADDRESS IS RELOCATED AND STORED IN THE I/O PACKET. IF IT IS NOTHB; A VALID ADDRESS THEN AN ILLEGAL BUFFER STATUS IS RETURNED AS THE"; FINAL I/O STATUS OF THE REQUEST.; ;; FOR ALL FUNCTION CODES, THE I/O PACKET IS INSERTED IN THEI?; CONTROLLER QUEUE AND THE DEVICE INITIATOR IS ENTERED TO STARTE; THE CONTROLLER.T;-7LTCHK: CMP #IO.ATX,I.FCN(R1) ;IS FUNCTION CODE = 'ATX'?D BEQ 30$ ;IE EQ YES1 CMP #IO.STC,I.FCN(R1) ;IS FUNCTION CODE = 'STC'?S BNE 60$ ;IF NE NO ;SB; 'STC' FUNCTION - MOVE ALL PARAMETERS TO MAKE WAY FOR DATA BUFFER; ADDRESS DOUBLEWORD;/10$: MOV R1,R3 ;SAVE ADDRESS OF THE I/O PACKETS; MOV I.PRM+12(R3),I.PRM+14(R3) ;MOVE RETURN BUFFER ADDRESSO7 MOV I.PRM+10(R3),I.PRM+12(R3) ;MOVE EVENT FLAG NUMBER) MOV I.PRM+6(R3),I.PRM+10(R3) ;MOVE MODE * MOV I.PRM+4(R3),I.PRM+6(R3) ;MOVE STATUS4 MOV I.PRM+2(R3),I.PRM+4(R3) ;MOVE LENGTH OF BUFFER BEQ 30$ ;IF EQ LENGTH = 0& BLT 15$ ;IF LT INVALID BUFFER LENGTH;'3; SET UP REGISTERS FOR ADDRESS CHECK AND RELOCATIONM; - MOV I.PRM(R3),R0 ;DATA BUFFER ADDRESS ==> R0D% MOV I.PRM+2(R3),R1 ;LENGTH ==> REG 1S CALL $ACHCK ;CHECK THE LENGTHM BCS 15$ ;IF CS, ERRORR2 MOV W.BATT(R2),R2 ;PICK UP ATTACHMENT DESC. ADDR. INCB A.IOC(R2) ;LOCK REGION/ MOV R2,I.AADA(R3) ;SAVE PTR IN PKT FOR $IODONED BR 20$ ;CONTINUE;P; INVALID BUFFER;S215$: MOV #IE.SPC&377,R0 ;SET ILLEGAL BUFFER STATUS2 CALLR $IOFIN ;CALL FINISH I/O OPERATION AND EXIT;L"; RELOCATE THE DATA BUFFER ADDRESS;S620$: CALL $RELOC ;GO RELOCATE THE DATA BUFFER ADDRESS& MOV R1,I.PRM(R3) ;SET RELOCATION BIAS' MOV R2,I.PRM+2(R3) ;SET 16-BIT ADDRESSH( BR 40$ ;GO CHECK RETURN BUFFER ADDRESS;O; 'STC' OR 'ATX' FUNCTIONK; 30$: MOV R1,R3 ;SAVE I/O PACKET>40$: MOV I.PRM+14(R3),R0 ;GET VIRTUAL ADDRESS OF RETURN BUFFER5 MOV #14.,R1 ;SET LENGTH OF RETURN BUFFER TO 7 WORDS: CALL $ACHCK ;CHECK THE ADDRESS BCS 15$ ;IF CS BAD2 MOV W.BATT(R2),R2 ;PICK UP ATTACHMENT DESC. ADDR. INCB A.IOC(R2) ;LOCK REGION1 MOV R2,I.AADA+2(R3) ;SAVE PTR IN PKT FOR $IODONER;D$; RELOCATE THE RETURN BUFFER ADDRESS;I# CALL $RELOC ;RELOCATE USER BUFFERD: MOV R1,I.PRM+14(R3) ;SET RELOCATION BIAS OF RETURN BUFFER9 MOV R2,I.PRM+16(R3) ;SET 16-BIT ADDRESS OF RETURN BUFFER$ MOV R3,R1 ;COPY I/O PACKET ADDRESS;R$; INSERT THE I/O PACKET IN THE QUEUE;L,60$: MOV R4,R0 ;SET R0 = I/O QUEUE LISTHEAD( CALL $QINSP ;GO INSERT PACKET IN QUEUE;; GET THE QUEUED I/O PACKETT;H1LTINI: GTPKT$ LT,L$$T11,,,T ;GET I/O PACKET MACROV;,(; ANALYZE THE CONTENTS OF THE I/O PACKET;D; R1 = I/O PACKETT.; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB; R3 = CONTROLLER INDEXR; R4 = STATUS CONTROL BLOCK ; R5 = UNIT CONTROL BLOCK.;+; I/O REQUEST PACKET FORMAT ;U; WD.00 = I/O QUEUE THREAD WORD -; WD.01 = REQUEST PRIORITY, EVENT FLAG NUMBERT'; WD.02 = TSB ADDRESS OF REQUESTER TASK/:; WD.03 = POINTER TO 2ND LUN WORD IN REQUESTER TASK HEADER;; WD.04 = CONTENTS OF 1ST LUN WORD IN REQUESTER TASK HEADER,; WD.05 = I/O FUNCTION CODE,-; WD.06 = VIRTUAL ADDRESS OF I/O STATUS BLOCK-; WD.07 = RELOCATION BIAS OF I/O STATUS BLOCK "; WD.10 = I/O STATUS BLOCK ADDRESS0; WD.11 = VIRTUAL ADDRESS OF AST SERVICE ROUTINE(; WD.12 = RELOCATION BIAS OF DATA BUFFER'; WD.13 = 16-BIT00g_0B0eeaek ADDRESS OF DATA BUFFERW; WD.14 = LENGTH OF DATA BUFFER ; WD.15 = FLAG WORD OR STATE; WD.16 = ID OR MODE0; WD.17 = NUMBER OF RETRIES OR EVENT FLAG NUMBER*; WD.20 = RELOCATION BIAS OF RETURN BUFFER); WD.21 = 16-BIT ADDRESS OF RETURN BUFFER0; / TST U.EFN(R5) ;WAS EFN FOR 'NOWMST' SPECIFIED?I BEQ 5$ ;IF EQ NO, MOV S.CSR(R4),R0 ;YES, RETREIVE CSR ADDRESS BIS #IE,(R0) ;ENABLE INTERRUPTS05$: MOV I.TCB(R1),R0 ;GET REQUESTER TCB ADDRESS.0 BITB #T2.ABO,T.ST2(R0) ;IS TASK BEING ABORTED? BEQ 10$ ;IF EQ NO " CALLR IEVER ;YES, REJECT REQUEST;B;; DISPATCH PACKET FOR PROCESSING ACCORDING TO FUNCTION CODE ;1110$: CMP #IO.ATX,I.FCN(R1) ;IS IT 'ATX' FUNCTION?  BEQ ATX ;IF EQ YES- CMP #IO.SEC,I.FCN(R1) ;IS IT 'SEC' FUNCTION?N BEQ IOSEC ;IF EQ YES- CMP #IO.STC,I.FCN(R1) ;IS IT 'STC' FUNCTION?  BEQ STC ;IF EQ YES$ CALLR IEIFC ;INVALID FUNCTION CODE;+; PROCESS 'ATX' FUNCTION; ; REQUIRED INPUTS:; R1 = I/O PACKETR.; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB; R3 = CONTROLLER INDEXN; R4 = STATUS CONTROL BLOCKT; R5 = UNIT CONTROL BLOCKC;-ATX: ;REF LABEL .IF DF M$$EXT( CALL $STMAP ;SET UP UNIBUS MAP ADDRESS# CALL $MPUBM ;MAP UNIBUS TO MEMORYC MOV S.PKT(R4),R1 ;RESTORE REG 1 .ENDC. CMPB I.PRM+11(R1),#DC/400 ;CPU ID > MAXIMUM? BHI LTBAD ;IF HI YES TSTB I.PRM+11(R1) ;CPU ID = 0?  BEQ LTBAD ;IF EQ YES& TSTB I.PRM+13(R1) ;RETRY COUNT > 255? BNE LTBAD ;IF NE YES4 MOVB I.PRM+12(R1),U.CW2(R5) ;SAVE RETRY COUNT BYTE.;B.; SET UP RETURN REGISTER BUFFER ADDRESS IN UCB;L6 MOV I.PRM+14(R1),U.BUF1(R5) ;RELOCATION BIAS ==> UCB6 MOV I.PRM+16(R1),U.BUF1+2(R5) ;16-BIT ADDRESS==> UCB2RETRY: MOV S.CSR(R4),R0 ;GET DEVICE ADDRESS (TSR).$ MOV #BDINIT,(R0) ;BOARD INITIALIZE.9 MOV I.PRM+6(R1),TSDB(R0) ;MOVE FLAGS WORD TO DATA SILO.I2 MOV U.BUF+2(R5),TSBA(R0) ;SET UP BUFFER ADDRESS.! MOV U.CNT(R5),R2 ;GET BYTE COUNTR NEG R2 ;NEGATE IT.) MOV R2,TSBC(R0) ;PUT IT IN PCL REGISTER.+) MOVB I.PRM+11(R1),TCR+1(R0) ;SET CPU ID.B6 BIS #RIB!TXNPR!SNDWD!IE!STTXM,U.BUF(R5) ;SET EXTENDED, BIS U.BUF(R5),(R0) ;ADDR & GO BITS IN TCR.* MOVB S.ITM(R4),S.CTM(R4) ;- SET TIME OUT RETURN ;>#LTBAD: CALLR IEBAD ;BAD PARAMETERSC;+; PROCESS 'SEC' FUNCTION; ; REQUIRED INPUTS:; R4 = STATUS CONTROL BLOCKO;-+IOSEC: MOV S.CSR(R4),R0 ;GET DEVICE ADDRESS(1 MOV TMMR(R0),R1 ;MOVE SECOND WORD FOR IOSB TO R1T, MOV #IS.SUC&377,R0 ;GET SUCCESS STATUS CODE# CALL $IODON ;GO EXIT THIS REQUESTV! BR LTINI ;GO LOOK FOR MORE WORKD;+; PROCESS 'STC' FUNCTION;U; REQUIRED INPUTS:; R1 = I/O PACKET(.; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB; R3 = CONTROLLER INDEX; R4 = STATUS CONTROL BLOCKI; R5 = UNIT CONTROL BLOCK+;--STC: MOV I.TCB(R1),R0 ;GET TASK'S TCB ADDRESS / BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVLEGED?R BEQ 35$ ;IF EQ NOD$ TST I.PRM+6(R1) ;'STATE' SPECIFIED? BEQ 10$ ;IF EQ NO* CMP #SS.MAS,I.PRM+6(R1) ;IS IT 'MASTER'? BEQ 10$ ;IF EQ YESD;EVENT FLAG FEATURE AND SECONDARY STATE CAPABILITY HAVE BEEN REMOVED.; CMP #SS.SEC,I.PRM+6(R1) ;IS IT 'SECONDARY'?; BEQ 10$ ;IF EQ YESI+ CMP #SS.NEU,I.PRM+6(R1) ;IS IT 'NEUTRAL'?N% BNE LTBAD ;IF NE NO, BAD PARAMETERSL;I; VALIDATE THE 'MODE' PARAMETER;T(10$: TST I.PRM+10(R1) ;'MODE' SPECIFIED? BEQ 20$ ;IF EQ NO30 CMP #MS.AUT,I.PRM+10(R1) ;IS 'AUTO' SPECIFIED? BEQ 20$ ;IF EQ YES8 CMP #MS.ADS,I.PRM+10(R1) ;IS 'ADDRESS SILO' SPECIFIED?% BNE LTBAD ;IF NE NO, BAD PARAMETERSI;QD;EVENT FLAG FEATURE AND SECONDARY STATE CAPABILITY HAVE BEEN REMOVED ; VALIDATE THE EVENT FLAG NUMBER;I20$: BR 40$#; TST I.PRM+12(R1) ;EVENT FLAG > 0?I; BLE 30$ ;IF LE NO%; CMP #96.,I.PRM+12(R1) ;IS IT > 96?R; BGT 40$ ;IF GT NO%30$: CALLR IEIEF ;INVALID EVENT FLAGI%35$: CALLR IEPRI ;PRIVLEGE VIOLATION$;I3; VALIDATE THE SIZE AND CONTENTS OF THE DATA BUFFERF;?140$: TST I.PRM+4(R1) ;IS SIZE OF BUFFER > OR = 0?; BLT 54$ ;IF LT NOC BEQ 60$ ;IF EQ SIZE=0E;,.; INITIALIZE VALUES FOR LOOPING THROUGH BUFFER;D6 MOV #50.,ASCNT(R3) ;SAVE MAX NUMBER OF 00gg0N0TADATADATADATADATADATADATADATADATAVALUES ALLOWED6 CMP I.PRM+4(R1),ASCNT(R3) ;IS # OF VALUES > MAXIMUM? BGT 54$ ;IF GT YES1 CLR PRVAL(R3) ;INITIALIZE PREVIOUS VALUE TO ZERO , MOV I.PRM+4(R1),LFVAL(R3) ;GET # OF VALUES. MOV I.PRM(R1),U.BUF(R5) ;GET RELOCATION BIAS1 MOV I.PRM+2(R1),U.BUF+2(R5) ;GET VITUAL ADDRESSS; 7; CHECK ALL VALUES IN THE BUFFER FOR WITHIN VALID RANGEF; ; PRVAL(R3) = PREVIOUS VALUE4; ASCNT(R3) = # VALUES STILL POSSIBLE TO ADD TO SILO+; LFVAL(R3) = # VALUES STILL IN USER BUFFERN;3250$: CALL $GTBYT ;RETRIEVE NEXT BYTE ON THE STACK TSTB (SP) ;IS VALUE > 0? BEQ 51$ ;IF EQ NO$' CMPB (SP),#DC/400 ;IS VALUE > MAXIMUM?P BLE 52$ ;IF LE NO -51$: MOVB (SP)+,PRVAL(R3) ;CLEAN UP THE STACK BR 54$ ;INVALID DATA BUFFERR;C; CHECK FOR PAD VALUE NEEDED;F-52$: CMPB (SP),PRVAL(R3) ;IS IT = LAST VALUE?A BNE 53$ ;IF NE NOR0 DEC ASCNT(R3) ;DECREMENT MAXIMUM VALUES ALLOWED;E,; DECREMENT COUNTERS AND SAVE PREVIOUS VALUE; 653$: MOVB (SP)+,PRVAL(R3) ;SAVE THIS VALUE AS PREVIOUS0 DEC ASCNT(R3) ;DECREMENT MAXIMUM VALUES ALLOWED$ BGE 55$ ;IF GE STILL WITHIN LIMITS(54$: CALLR IESPC ;ILLEGAL BUFFER FORMAT;ME; DECREMENT NUMBER OF BYTES STILL IN USER BUFFER AND GO GET NEXT BYTE ;C255$: DEC LFVAL(R3) ;DECREMENT # BYTES YET TO CHECK BGT 50$ ;IF GT GET NEXTC; 0; ALL PARAMETERS ARE VALID - PROCESS THE REQUEST;E60$: BR 70$T4; TST U.TCB(R5) ;HAS A TASK REQUESTED AN EVENT FLAG?; BEQ 62$ ;IF EQ NO7; CMP I.TCB(R1),U.TCB(R5) ;IS THIS THE SAME REQUESTOR?L; BEQ 61$ ;IF EQ YESC,; CALLR IEFLG ;EVENT FLAG ALREADY SPECIFIED;$-; DECREMENT I/O COUNT FOR PREVIOUS EVENT FLAG ;L.;61$: MOV U.TCB(R5),R0 ;GET PREVIOUS REQUESTOR1; DECB T.IOC(R0) ;DECREMENT REQUESTOR'S I/O COUNT;;; SET UP TCB & EVENT FLAG ;E:;62$: MOV I.PRM+12(R1),U.EFN(R5) ;SET UP EVENT FLAG NUMBER%; BNE 63$ ;IF NE NON-ZERO EVENT FLAGE$; CLR U.TCB(R5) ;ZERO REQUESTORS TCB$; BR 70$ ;GO PROCESS NEXT PARAMETER;2?; EVENT FLAG HAS BEEN SPECIFIED, SETUP TCB IN UCB AND INCREMENTT ; I/O COUNT.;;+;63$: MOV I.TCB(R1),R0 ;SAVE REQUESTORS TCBY; MOV R0,U.TCB(R5) ; ; INCB T.IOC(R0) ;LOCK DOWN TASK;A"; INITIALIZE BASE REGISTER ADDRESS;V$70$: MOV S.CSR(R4),R0 ;TSR ==> REG 0* TST I.PRM+6(R1) ;WAS A 'STATE' SPECIFIED? BEQ 80$ ;IF EQ NO3 CMP #SS.MAS,I.PRM+6(R1) ;IS MASTER STATE DESIRED?U BNE 71$ ;IF NE NON, MOV #MASTER,ASCNT(R3) ;SET MASK FOR MASTER BR 73$ ;GO CHANGE TMMR71$:7; CMP #SS.SEC,I.PRM+6(R1) ;IS SECONDARY STATE DESIRED?S; BNE 72$ ;IF NE NO,; MOV #SEC,ASCNT(R3) ;SET MASK FOR SECONDARY; BR 73$ ;GO CHANGE TMMR$72$: CLR ASCNT(R3) ;SET NEUTRAL MASK:73$: MOVB TMMR+1(R0),PRVAL(R3);GET HIGH ORDER BYTE OF TMMR2 BICB #MASTER!SEC,PRVAL(R3) ;CLEAR PREVIOUS STATE) BISB ASCNT(R3),PRVAL(R3) ;SET NEW STATE 6 MOVB PRVAL(R3),TMMR+1(R0) ;STORE NEW HIGH ORDER BYTE: MOVB TMMR+1(R0),PRVAL(R3) ;GET NEW HIGH ORDER BYTE AGAIN0 BICB #374,PRVAL(R3) ;CLEAR ALL BUT DESIRED BITS0 CMPB ASCNT(R3),PRVAL(R3) ;IS ACTUAL = DESIRED? BEQ 80$ ;IF EQ YES;OD; NOT DESIRED STATE - CHECK FOR VALID EXCEPTION (SECONDARY==>MASTER);+ BITB #MASTER,PRVAL(R3) ;IS IT NOW MASTER?: BNE 80$ ;IF NE YES& CALLR IEVER ;HARDWARE REJECTED STATE;S; SET UP ADDRESS SILOA;R380$: TST I.PRM+4(R1) ;IS LENGTH OF DATA BUFFER = 0?T BEQ 90$ ;IF EQ YES; MOVB TMMR+1(R0),PRVAL(R3);RETRIEVE HIGH ORDER BYTE OF TMMRR= BISB #CLRADR!AUTADR,PRVAL(R3) ;CLEAR SILO AND SET AUTO ADRS 6 MOVB PRVAL(R3),TMMR+1(R0) ;STORE NEW HIGH ORDER BYTE; (; REINITIALIZE UCB FOR THE DATA TRANSFER;E2 MOV I.PRM(R1),U.BUF(R5) ;RELOCATION BIAS ==> UCB5 MOV I.PRM+2(R1),U.BUF+2(R5) ;16-BIT ADDRESS ==> UCBR/ CLR ASCNT(R3) ;ZERO ADDRESS SILO ENTRY COUNTER * CLR PRVAL(R3) ;SET PREVIOUS VALUE TO ZERO; MOV I.PRM+4(R1),LFVAL(R3) ;INITIALIZE DATA BUFFER COUNTERQ;$7; MOVE EACH BYTE OF THE DATA BUFFER TO THE ADDRESS SILOD;B; PRVAL(R3) = PREVIOUS VALUE"; ASCNT(R3) = ADDRESS SILO COUNTER*; LFVAL(R3) = # BYTES STILL IN DATA BUFFER!; FRVAL(R3) = FIRST VALUE IN SILOT;I381$: CALL $GTBYT ;RETRIEVE A BYTE FROM USER BUFFERF' CMPB (SP),P00go0B0eeaekRVAL(R3) ;IS IT = PREVIOUS?M BNE 82$ ;IF NE NO1' MOVB #PAD,TMMR(R0) ;INSERT A PAD VALUEE4 INC ASCNT(R3) ;INCREMENT ADDRESS SILO ENTRY COUNTER582$: MOVB (SP),PRVAL(R3) ;SAVE THIS VALUE AS PREVIOUSI# TST ASCNT(R3) ;IS THIS FIRST BYTE?E BGT 83$ ;IF GT NOA& MOVB (SP),FRVAL(R3) ;SAVE FIRST VALUE783$: MOVB (SP)+,TMMR(R0) ;INSERT THE USER VALUE IN SILOR. INC ASCNT(R3) ;INCREMENT ADDRESS SILO COUNTER- DEC LFVAL(R3) ;DECREMENT # BYTES YET TO MOVE  BGT 81$ ;IF GT GET NEXT BYTE; CMP #20.,ASCNT(R3) ;HAVE AT LEAST 20 VALUES BEEN INSERTED?$ BLE 84$ ;IF LE YES;TE; LESS THAN THE MINIMUM NUMBER OF VALUES HAVE BEEN MOVED - REPEAT THET; PATTERN AGAINM; 2 MOV I.PRM(R1),U.BUF(R5) ;RELOCATION BIAS ==> UCB5 MOV I.PRM+2(R1),U.BUF+2(R5) ;16-BIT ADDRESS ==> UCBM3 MOV I.PRM+4(R1),LFVAL(R3) ;SET UP # BYTES TO MOVE, BR 81$ ;GO MOVE THE VALUES;N*; ALL BYTES MOVED - CHECK FOR FIRST = LAST;C084$: CMPB PRVAL(R3),FRVAL(R3) ;IS FIRST = LAST? BNE 90$ ;IF NE NOT- MOVB #PAD,TMMR(R0) ;MOVE A PAD VALUE TO SILOA,90$: TST I.PRM+10(R1) ;WAS A MODE SPECIFIED? BEQ 100$ ;IF EQ NO5 MOVB TMMR+1(R0),PRVAL(R3);RETRIEVE HIGH BYTE OF TMMRH3 CMP #MS.AUT,I.PRM+10(R1) ;AUTO ADDRESS SPECIFIED?R BNE 91$ ;IF NE NOB* BISB #AUTADR,PRVAL(R3) ;SET AUTO ADDRESS BR 92$ ;GO RESTORE TMMR+1);V; ADDRESS SILO REQUESTED;V?91$: BICB #AUTADR,PRVAL(R3) ;CLEAR AUTO ADDRESS (IMPLIES SILO)O892$: MOVB PRVAL(R3),TMMR+1(R0);RESTORE HIGH BYTE OF TMMR:100$: MOV I.PRM+14(R1),U.BUF1(R5) ;RELOCATION BIAS ==> UCB6 MOV I.PRM+16(R1),U.BUF1+2(R5) ;16-BIT ADDRESS ==> UCB BEQ 110$ ;IF EQ NO" CALL REGRET ;GO RETURN REGISTERS-110$: CALLR ISSUC ;INDICATE SUCCESS AND EXITP;+E; REGRET -- SERVICE ROUTINE TO RETURN THE CONTENTS OF THE TRANSMITTERAA; SIDE REGISTERS TO THE USER BUFFER WHOSE ADDRESS IS SPECIFIED INSA; U.BUF1 AND U.BUF1+2 IN THE UCB. THE CONTROL REGISTER ADDRESS ISE?; CONTAINED IN R0. U.BUF AND U.BUF+2 ARE PRESERVED ACROSS CALL.Y;-,REGRET: TST U.BUF1(R5) ;RELOCATION BIAS = 0? BNE 10$ ;IF NE NOM) TST U.BUF1+2(R5) ;IS 16 BIT ADDRESS = 0?S BEQ 20$ ;IF EQ YES$10$: MOV U.BUF(R5),-(SP) ;SAVE U.BUF% MOV U.BUF+2(R5),-(SP) ;SAVE U.BUF+2C/ MOV U.BUF1(R5),U.BUF(R5) ;GET RELOCATION BIAS 3 MOV U.BUF1+2(R5),U.BUF+2(R5) ;GET VIRTUAL ADDRESSG .REPT 7# MOV (R0)+,-(SP) ;GET WORD TO STOREI# CALL $PTWRD ;PUT WORD INTO BUFFERE .ENDR( MOV (SP)+,U.BUF+2(R5) ;RESTORE U.BUF+2# MOV (SP)+,U.BUF(R5) ;RESTORE U.BUFV20$: RETURN ;;+; INTERRUPT SERVICE ROUTINEA;- .ENABL LSBE$LTINT::4 INTSV$ LT,PR5,L$$T11 ;;;EXECUTE INTERRUPT SAVE CODE% MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS.-% MOV S.CSR(R4),R4 ;;;GET TCR ADDRESS.)$ BIC #IE,(R4) ;;;DISABLE INTERRUPTS.) BITB #US.BSY,U.STS(R5) ;;;IS UNIT BUSY?( BEQ 10$ ;;;IF EQ NOI! TST TSR(R4) ;;;ERROR CONDITION?+ BPL 5$ ;;;IF PL, NO ERRORC' CALL $FORK ;;;CREATE A SYSTEM PROCESSR JMP ERROR ;GO HANDLE ERRORSO5$: TSTB TSR(R4) ;;;SUCTXF? BMI 30$ ;;;IF MI YES1 BIT #SORE,TSR(R4) ;;;HAVE WE A SOFTWARE REJECT ?- BNE 20$ ;;;IF NE YES10$:D;EVENT FLAG FEATURE AND SECONDARY STATE CAPABILITY HAVE BEEN REMOVED4; BITB #NOWMST,TMMR+1(R4) ;;;HAVE WE BECOME MASTER?; BNE 50$ ;;;IF NE YESD) BIS #BDINIT,(R4) ;;;TX INIT JUST IN CASE  RETURN ;;;RETURN FOR MORE;I; PROCESS SOFTWARE REJECTE;R120$: BIC #SORE,(R4) ;;;CLEAR THE INTERRUPTING BITF# CALL $FORK ;;;CREATE FORK PROCESSP MOV R4,R0 ;COPY CSR ADDRESS CALL REGRET ;RESTORE REGISTERS CALLR IEREJ ;REJECT REQUESTR630$: BIC #SUCTXF,TSR(R4) ;;;CLEAR THE INTERRUPTING BIT# CALL $FORK ;;;CREATE FORK PROCESSD MOV R4,R0 ;COPY CSR ADDRESSR CALL REGRET ;RESTORE REGISTERS, MOV #IS.SUC&377,R0 ;GET SUCCESS STATUS CODE/ BIT #SORE,TSR(R4) ;WAS TRANSMISSION TRUNCATED?  BEQ 40$ ;IF EQ NO + BIC #SORE,TSR(R4) ;CLEAR THE SORE BIP ALSO INC R0 ;BUMP STATUS TO IS.TNRI040$: MOV U.CNT(R5),R1 ;GET # OF BYTES TRANSFERED CALL $IODON ;FINISH I/O  JMP LTINI ;TRY FOR MORESD;EVENT FLAG FEATURE AND SECONDARY STATE CAPABILITY HAVE BEEN REMOVED;)#; NOWMST INTERRUPT - SET EVENT FLAG ;R(00gw0N0TADATADATADATADATADATADATADATADATA;50$: CALL $FORK ;;;CREATE FORK PROCESS(; MOV U.SCB(R5),R3 ;RETREIVE SCB ADDRESS.; MOVB S.CON(R3),R3 ;RETREIVE CONTROLLER INDEX-; MOVB TMMR+1(R4),PRVAL(R3) ;RETRIEVE TMMR+1U-; BICB #NOWMST,PRVAL(R3) ;CLEAR 'NOWMST' BITR,; MOVB PRVAL(R3),TMMR+1(R4) ;RESTORE TMMR+1; MOV R5,PRVAL(R3) ;SAVE REG 5'; MOV U.EFN(R5),R0 ;EVENT FLAG # ==> R0 ); MOV U.TCB(R5),R5 ;REQUESTORS TCB ==> R5M; BEQ 51$ ;IF EQ NONE+; CALL $CEFI ;GO CONSTRUCT EVENT FLAG MASKM$; BCS 51$ ;IF CS NO EVENT SPECIFIED; BIS R0,(R1) ;SET EVENT FLAG); CALL $DRDSE ;DECLARE SIGNIFICANT EVENT;/; DECB T.IOC(R5) ;UNLOCK TCB, EFN IS GOING AWAYV%;51$: MOV PRVAL(R3),R5 ;RESTORE REG 5R; CLR U.EFN(R5) ;T; CLR U.TCB(R5) ;M); RETURN ;RETURN TO INTERRUPTED PROGRAMP .DSABL LSB+;+A; WE HAVE AN ERROR CONDITION. WE WILL DETERMINE THE CAUSE OF THE03; ERROR AND TAKE THE APPROPRIATE ACTION AS FOLLOWS:S;B; OVERRUN = IE.BBE;; TIMEOUT = IE.DNRE; MASTER DOWN = IE.DNR ; XMIT ERROR; RSP B = 00 = IE.DNRS; RSP B = 01,10,11 = IE.BBE:; MEM OVERFLOW = INCREMENT A16-17, CLEAR ERROR, ENABLE IE,; SET STTXMK; NEM = SET BDINIT, IE.SPC$;-#ERROR: MOV R4,R0 ;COPY CSR ADDRESS. CALL REGRET ;RESTORE REGISTERS% MOV TSR(R4),R1 ;GET CONTENTS OF TSR.P$ BIT #OVERUN,R1 ;CHECK FOR OVER RUN. BNE 110$ ;IF NE OVERRUNR' BIT #MSTDWN,R1 ;CHECK FOR MASTER DOWN.T BNE 130$ ;IF NE MASTER DOWNS$ BIT #TIMOUT,R1 ;CHECK FOR TIME OUT. BNE 120$ ;IF NE TIMEOUT . BIT #TXMERR,R1 ;CHECK FOR TRANSMISSION ERROR.$ BNE 140$ ;IF NE TRANSMISSION ERROR) BIT #MEMOFL!NEXLOC,R1 ;OVERFLOW OR NEM?  BNE 170$ ;IF NE YEST' BIS #BDINIT,(R4) ;INIT THE BOARD AGAIN RETURN ;,;+; PROCESS OVERRUN CONDITIONT;-5110$: BIC #OVERUN,TSR(R4) ;CLEAR THE INTERRUPTING BIT! CALLR IEBBE ;TRANSMISSION ERROR.;+; PROCESS TIMEOUTU;-5120$: BIC #TIMOUT,TSR(R4) ;CLEAR THE INTERRUPTING BITN CALLR IEDNR ;DEVICE NOT READYC;+; PROCESS MASTER DOWN.;-5130$: BIC #MSTDWN,TSR(R4) ;CLEAR THE INTERRUPTING BITO. MOV #IE.DNR&377,R0 ;GET DEVICE NOT READY CODE BR 150$ ;GO TRY FOR A RETRYN;+; PROCESS TRANSMISSION ERROR.D;-(140$: BIC #TXMERR,TSR(R4) ;CLEAR INT BIT# BIT #RSPB1!RSPB0,R1 ;IF RSPB IS 00-" BEQ 120$ ;IF EQ TREAT AS TIMEOUT3 MOV #IE.BBE&377,R0 ;GET TRANSMIT ERROR STATUS CODER'150$: MOV U.SCB(R5),R4 ;GET SCB ADDRESS$- MOV S.PKT(R4),R1 ;LOAD ADDRESS OF I/O PACKETI' DECB U.CW2(R5) ;DECREMENT RETRY COUNT.+ BGE 160$ ;IF GE RETRY CALLR IODON ;FINISH UP160$: JMP RETRY ;GO TRY AGAIN;+1; PROCESS MEMORY OVERFLOW & NONEXISTENT LOCATION.$;-)170$: BIS #BDINIT,(R4) ;INITIALIZE BOARD.I( CALLR IESPC ;RETURN NON-EXISTANT ERROR;+; CANCEL I/O OPERATION;B ; INPUTS:P;S; R0 = I/O PACKET ADDRESSA; R1 = TCB ADDRESS; R3 = CONTROLLER INDEXI; R4 = SCB ADDRESS; R5 = UCB ADDRESS;-!LTCAN: MTPS #0 ;;;LOWER PRIORITY 7 CMP R1,U.TCB(R5) ;DID THIS TASK ASK FOR AN EVENT FLAG?R BNE 10$ ;IF NE NO0. DECB T.IOC(R1) ;UNLOCK TCB, EFN IS GOING AWAY' CLR U.EFN(R5) ;CLEAR EVENT FLAG NUMBERC$ CLR U.TCB(R5) ;CLEAR REQUESTORS TCB"10$: TSTB S.STS(R4) ;IS UNIT BUSY? BEQ LTPWF ;IF EQ THEN YESI: CMP R1,I.TCB(R0) ;IS CANCEL REQUEST FOR THE CURRENT TASK?$ BNE LTPWF ;IF NE, NO SIMPLY RETURN+ MOV #IE.ABO&377,R0 ;LOAD ABORT STATUS CODER BR ABORT ;ABORT THIS OPERATION LTPWF: RETURN ;NO, JUST RETURN;+; TIMEOUT SERVICE ;-6LTOUT: MOV #IE.DNR&377,R0 ;LOAD NOT READY STATUS CODE.)ABORT: MOV S.CSR(R4),R2 ;GET TSR ADDRESS. . BIS #BDINIT,(R2) ;INITIALIZE PCL TRANSMITTER. BR IODON ;FINISH I/O;+,; PROCESS ERROR CONDITIONS AND CALL I/O DONE;-)IEBAD: MOV #IE.BAD&377,R0 ;BAD PARAMETERSP BR IODON ;-IEBBE: MOV #IE.BBE&377,R0 ;TRANSMISSION ERRORP BR IODON ;+IEDNR: MOV #IE.DNR&377,R0 ;DEVICE NOT READY BR IODON ;7IEFLG: MOV #IE.FLG&377,R0 ;EVENT FLAG ALREADY SPECIFIED BR IODON ;-IEIEF: MOV #IE.IEF&377,R0 ;INVALID EVENT FLAGR BR IODON ;0IEIFC: MOV #IE.IFC&377,R0 ;INVALID FUNCTION CODE BR IODON ;-IEPRI: MOV #IE.PRI&377,R0 ;PRIVLEGE VIOLATIONO BR IODON ;,00g0h0eeaekIEREJ: MOV #IE.REJ&377,R0 ;TRANSFER REJECTED BR IODON ;-IESPC: MOV #IE.SPC&377,R0 ;INVALID PARAMETERSO BR IODON ;'IEVER: MOV #IE.VER&377,R0 ;PARITY ERROR BR IODON ;/ISSUC: MOV #IS.SUC&377,R0 ;SUCCESSFUL OPERATION IODON: CALL $IOALT ;FINISH I/OR JMP LTINI ;TRY FOR MOREF .END IODON ;-IEIEF: MOV #IE.IEF&377,R0 ;INVALID EVENT FLAGR BR IODON ;0IEIFC: MOV #IE.IFC&377,R0 ;INVALID FUNCTION CODE BR IODON ;-IEPRI: MOV #IE.PRI&377,R0 ;PRIVLEGE VIOLATIONO BR IODON ;, .TITLE AFSUBU .IDENT /01.01/ N; ; COPYRIGHT (C) 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDB9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;.; VERSION 01.01 ;; J. E. PROVINO 18-JUL-78W;A; MODIFIED BY:; ; B. S. MCCARTHY 10-JUN-81;L5; BM122 -- REMOVAL OF TASK HEADERS FROM PRIMARY POOL ;!; CPU AFFINITY COMMON SUBROUTINESD;1;+'; **-$TSTAT-TEST AFFINITY (SPECIFY TCB) '; **-$TSTAP-TEST AFFINITY (SPECIFY PCB)N(; **-$TSTAM-TEST AFFINITY (SPECIFY MASK);Q<; THESE ROUTINES DETERMINE IF A SPECIFIED RUN MASK IS VALID.;I ; INPUTS:A;C; R0=TCB ADDRESS ($TSTAT); PCB ADDRESS ($TSTAP)I; RUN MASK ($TSTAM);E ; OUTPUTS:;O; C=1 IF RUN MASK IS INVALID; C=0 IF RUN MASK IS VALID;-  .  .IF DF M$$PRO .ENABL LSB-&$TSTAT::MOV R0,-(SP) ;SAVE TCB ADDRESS# MOV T.RRM(R0),R0 ;GET TCB RUN MASKU BR 10$ ;GO TO COMMON CODEE&$TSTAP::MOV R0,-(SP) ;SAVE PCB ADDRESS# MOV P.RRM(R0),R0 ;GET PCB RUN MASKS BR 10$ ;GO TO COMMON CODES#$TSTAM::MOV R0,-(SP) ;SAVE RUN MASK 10$: MOV R1,-(SP) ;SAVE R1# MOV $URMST,R1 ;GET URM STATUS WORDE COM R1 ;COMPLEMENT ITD+ BIT R0,R1 ;ARE THE SPECIFIED RUNS ONLINE?  BNE 40$ ;NO IF NEF@ MOV #<-2>,R1 ;POINT TO TABLE ENTRY FOR LAST PROCESSOR$20$: CLC ;ASSUME RUN MASK IS VALID+ BIT $BTMSK(R1),$URMST ;IS THIS CPU ONLINE?M BEQ 30$ ;NO IF EQM4 BIT $CRMTB(R1),R0 ;IS MASK VALID ON THIS PROCESSOR? BEQ 50$ ;YES IF EQ*30$: SUB #2,R1 ;POINT TO NEXT TABLE ENTRY BGE 20$ ;MORE ENTRIES IF GE:40$: SEC ;RUN MASK IS INVALID:$50$: MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R0 ;W RETURNM .DSABL LSBE I;+3; **-SETAT-SET UP REQUIRED RUN MASK (TCB SPECIFIED)$3; **-SETAP-SET UP REQUIRED RUN MASK (PCB SPECIFIED) 6; **-SETAH-SET UP REQUIRED RUN MASK (HEADER SPECIFIED);LG; THESE ROUTINES SET UP THE REQUIRED RUN MASK IN THE CALLING TASK'S TCBB; ; INPUTS:0;S; R0=TCB ADDRESS ($SETAT)O; PCB ADDRESS ($SETAP)0; HEADER ADDRESS ($SETAH);E ; OUTPUTS:;$; T.RRM IS SET UP IN THE TCB;- U8$SETAT::MOV T.PCB(R0),R0 ;GET ADDRESS OF TASK REGION PCB$SETAP:: ;REFERENCE LABELS .IF DF X$$HDR( MOV KISAR6,-(SP) ;SAVE PREVIOUS MAPPING+ MOV P.HDR(R0),-(SP) ;GET ADDRESS OF HEADER " BNE 5$ ;IF NE HEADER IS RESIDENT0 MOV P.REL(R0),KISAR6 ;MAP TO NONRESIDENT HEADER0 MOV #140000,(SP) ;SET VIRTUAL ADDRESS OF HEADER/5$: MOV (SP)+,R0 ;GET VIRTUAL ADDRESS OF HEADERE+ CALL $SETAH ;USE HEADER SPECIFIED ROUTINE + MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING RETURN ;T .IFF ; DF X$$HDRU( MOV P.HDR(R0),R0 ;GET ADDRESS OF HEADER .ENDC ; DF X$$HDR$$SETAH::MOV R1,-(SP) ;SAVE REGISTERS MOV R2,-(SP) ;( MOV R3,-(SP) ;S& CLR -(SP) ;CLEAR CALCULATED RUN MASK7 MOV H.WND(R0),R0 ;POINT TO THE NUMBER OF WINDOW BLOCKSP, MOV (R0)+,-(SP) ;SAVE THE NUMBER OF WINDOWS+ MOV (R0),R3 ;SAVE TASK REGION PCB ADDRESSR)10$: MOV (R0),R1 ;IS THIS WINDOW MAPPED?H BEQ 20$ ;NO IF EQ 1 BIS P.RRM(R1),2(SP) ;CALCULATE REQUIRED RUN MASKR)20$: ADD #W.BLGH,R0 ;POINT TO NEXT WINDOW. DEC (SP) ;ANY WINDOWS LEFT?R BGT 10$ ;YES IF GT$ MOV P.TCB(R3),R0 ;POINT TO TASK TCB TST (SP)+ ;CLEAN THE STACK9 MOV (SP)+,T.RRM(R0) ;MOVE CALCULATED RUN MASK TO THE TCBC MOV (SP)+,R3 ;RESTORE REGISTERS MOV (SP)+,R2 ;  MOV (SP)+,R1 ;B RETURNM ( .ENDC ; E .ENDMBER OF WINDOWS+ MOV (R0),R3 ;SAVE TASK REGION PCB ADDRESSR)10$: MOV (R0),R1 ;IS THIS WINDOW MAPPED?H BEQ 20$ ;NO IF EQ 1 BIS P00i0N0TADATADATADATADATADATADATADATADATA .TITLE DRGPP; .IDENT /07.06/D N;S,; COPYRIGHT (C) 1974, 1978, 1979, 1980, 1981/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.I;TA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDK9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.C;M; VERSION 07.06O;R; D. N. CUTLER 3-JAN-74 ;M); MODIFIED FOR RSX-11M-PLUS VERSION 1 BY:E;.; T. J. MILLER; J. E. PROVINO ;V; MODIFIED BY:;D; J. M. LAWLER 17-AUG-81; 3; JL065 -- INTEGRATE PCB CHANGES NEEDED TO SUPPORT.; EXTERNAL HEADERS.;6; J. M. LAWLER 24-AUG-81; 3; JL067 -- RETURN CORRECT STARTING VIRTUAL ADDRESSR; FOR THE TASK REGION; ; J. M. LAWLER 13-OCT-81;D.; JL081 -- FOR I/D USER TASKS, RETURN D SPACE; STARTING VIRTUAL ADDRESS ;H; T. M. MARTIN 28-OCT-81;0/; TMM071 -- DEFINE TASK HEADER OFFSETS LOCALLYF;R;1; MACRO LIBRARY CALLS; .MCALL PCBDF$,TCBDF$,HDRDF$% HDRDF$ ;DEFINE TASK HEADER OFFSETS11 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSD, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+$; **-$DRGPP-GET PARTITION PARAMETERS;CF; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A THREE WORD BUFFER WITH; PARTITION PARAMETERS.J;1 ; DPB FORMAT:R;S"; WD. 00 -- DIC(65.),DPB SIZE(4.).2; WD. 01 -- FIRST HALF OF OPTIONAL PARTITION NAME.3; WD. 02 -- SECOND HALF OF OPTIONAL PARTITION NAME.1+; WD. 03 -- ADDRESS OF A THREE WORD BUFFER.$;B; BUFFER FORMAT:; 4; WD. 00 -- BASE ADDRESS OF PARTITION IN 32W BLOCKS.,; WD. 01 -- SIZE OF PARTITION IN 32W BLOCKS.!; WD. 02 -- PARTITION FLAGS WORD.;* ; INPUTS: ;T9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. .; R3=ADDRESS OF THE PARTITION NAME IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.I,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;P5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)O; -; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E9; DIRECTIVE STATUS EQUAL TO THE STARTING VIRTUAL ADDRESSA+; OF THE SPECIFIED PARTITION IS RETURNED.-; C=1 IF DIRECTIVE IS REJECTED..7; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF SPECIFIED; PARTITION IS NOT IN SYSTEM.O;O8; IF THE PARTITION IS A TASK REGION, THE EXTERNAL HEADER5; IS NOT INCLUDED IN THE PARTITION PARAMETERS BECAUSEA; IT IS NOT MAPPED BY THE TASK.T;C;- P$DRGPP:: ;REFERENCE LABELS D .IF DF P$$LAS .IF DF U$$DAS R- MOV T.ST4(R5),-(SP) ;SAVE I/D TASK INDICATORS .ENDC ; DF U$$DAS3 MOV H.WND(R4),-(SP) ;SAVE POINTER TO WINDOW BLOCKSE& TST (R3)+ ;PARTITION NAME SPECIFIED? BNE 10$ ;IF NE YES# CALL $SRATT ;SEARCH FOR REGION ID& MOV A.PCB(R5),R2 ;PICK UP PCB ADDRESS BR 30$ ;610$: TST -(R3) ;POINT TO FIRST WORD OF PARTITION NAME E .IFFE R% TST (R3) ;PARTITION NAME SPECIFIED?  BNE 5$ ;IF NE YES& MOV T.PCB(R5),R4 ;GET TASK REGION PCB3 TST (R3)+ ;POINT TO SECOND WORD OF PARTITION NAME BR 40$ ; ) .ENDC E D,5$: CALL $SRNAM ;SEARCH FOR NAMED PARTITION& BCC 20$ ;IF CC NAMED PARTITION FOUND% DRSTS D.RS2 ;INVALID PARTITION NAMEN 20$: TST (R3)+ ;ADVANCE POINTER!30$: MOV R2,R4 ;COPY PCB POINTERN .IF DF P$$LAS)/ MOV (SP)+,R1 ;RESTORE POINTER TO WINDOW BLOCKS)( TST (R1)+ ;ADVANCE POINTER TO WINDOW 0  .IFTF ; DF P$$LAS .IF DF U$$DAS! CLR 4(SP) ;SET DIRECTIVE STATUSM T .IFF ; DF U$$DASS! CLR 2(SP) ;SET DIRECTIVE STATUSE .ENDC ; DF U$$DAS .IFT ; DF P$$LAS .IF DF U$$DAS4 BIT #T4.DSP,(SP)+ ;USER TASK HAVE D SPACE ENABLED ? BEQ 35$ ;IF EQ, NO+ ADD #W.BLGH,R1 ;YES, WINDOW 1 MAPS D SPACE035$: ;REFERENCE LABEL .ENDC ; DF U$$DAS ASSUME W.BPCB ASSUME W.BLVR-24 CMP (R1)+,R4 ;TARGET PARTITION TASK REGION (W.BPCB)+ BNE 40$ ;IF NOT, RETURN '0' STARTING ADDR.7 MOV (R1),2(SP) ;STARTING ADDRESS (W.BLVR) FROM WIN 0/1I .ENDC ; DF P$$LAS/40$: MOV 2(R3),R3 ;GET ADDRESS OF 3 WORD BUFFER& MOV #3*2,R1 ;SET LENGTH OF BUFFER # CALL $ACHKP ;ADDRESS CHECK BUFFERD .IF DF X$$HDR; MOVB P.HDLN(R4),R1 ;GET LENGTH OF EXTERNAL HEADER (IF ANY) < MOV P.REL(R4),(R3) ;CALCULA00i0j0eeaekTE STARTING ADDRESS OF PARTITION1 ADD R1,(R3)+ ;EXCLUDING POSSIBLE EXTERNAL HEADER2 .IFF ; DF X$$HDRR 3 MOV P.REL(R4),(R3)+ ;GET BASE ADDRESS OF PARTITIONT .IFT ; DF X$$HDR.. MOV P.SIZE(R4),(R3) ;INSERT SIZE OF PARTITION( SUB R1,(R3)+ ;MINUS ANY EXTERNAL HEADER .IFF ; DF X$$HDRD/ MOV P.SIZE(R4),(R3)+ ;INSERT SIZE OF PARTITIONF .ENDC ; DF X$$HDR1 CLR (R3) ;INSERT CODE FOR SYSTEM CONTROLLED PAR 60$: RETURN N R .ENDDER (IF ANY) < MOV P.REL(R4),(R3) ;CALCULA .TITLE DRCLI  .IDENT /01.01/ V;,6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED OR COPIED ONLY IN ACCORDANCE WITH THE TERMS; OF SUCH LICENSE.; 6; COPYRIGHT (c) 1981 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;G; VERSION 01.01C; ; M. S. FOX 20-APR-81S; ;T; MODIFIED BY:;K; M. S. FOX 23-SEP-81;V3; MF225 -- FIX CP.RST CHECKS, AND DO NOT ALLOW CLIC1; TO BE SET IF TTY IS LOGGED OFF, AND CP.LGO=0+;S;+G; **-$DRCLI-SET CLI / GET CLI INFO / DECLARE CMD ARRIVAL AST DIRECTIVES,; :; THIS MODULE CONTAINS THE GET CLI INFORMATION AND SET CLI:; DIRECTIVES. IT ALSO GETS CALLED BY DRDSP FOR THE DECLARE:; COMMAND ARRIVAL AST DIRECTIVE, BUT IMMEDIATEDLY JUMPS TO<; THE $CAAST ENTRY POINT OF THE DRPUT MODULE FOR PROCESSING.;S ; INPUTS:R;S?; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK5*; R3=ADDRESS OF THE SECOND WORD IN THE DPB.; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK+; R5=ADDRESS OF THE TCB OF THE CURRENT TASK ;O;- .IF DF A$$CLI .IF DF M$$CLI/ .ERROR ;CANNOT DEFINE BOTH M$$CLI AND A$$CLID .ENDC ;M$$CLI .MCALL PKTDF$,UCBDF$  PKTDF$ ;DEFINE CPB OFFSETSM UCBDF$ ;DEFINE UCB OFFSETSI1 ASSUME UM.CLI,36 ;BITS TO INDICATE TERMINALS CLI ; ASSUME C.PTCB,0 ;TCB ADDRESS MUST BE AT OFFSET ZERO OF CPBS#$DRCLI::MOVB -(R3),R0 ;GET DPB SIZEC% CMPB #5,(R3)+ ;IS IT SET CLI (SCLI$)D. BEQ SCLI ;IF EQ YES, PROCESS SCLI$ DIRECTIVE3 CMPB #2,R0 ;IS IT DECLARE CMD ARRIVAL AST (SCAA$)E BNE 10$ ;IF NE NO.( JMP $CAAST ;PROCESS DIRECTIVE IN DRPUT310$: CMPB #7,R0 ;IS IT GET CLI INFORMATION (GCII$);$ BEQ GCII ;IF EQ YES, PROCESS GCII$ DRSTS D.RS99 ;ILLEGAL DPB SIZE;+; **-SCLI- SET A TERMINAL'S CLIC;3;; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SET THE CLI OF THER?; CURRENT TASK'S TI: TERMINAL (OR SPECIFIED TERMINAL) TO BE THED@; SPECIFIED CLI. SYSTEM MESSAGES INFORMING BOTH THE PREVIOUS ANDB; NEW CLIS OF THE CHANGE ARE SENT TO THE CLIS IF THEY DESIRE THEM.; ; DPB FORMAT:B;1"; WD. 00 -- DIC(173.),DPB SIZE(5.)>; WD. 01 -- ASCII NAME OF THE TERMINAL WHOSE CLI SHOULD BE SET); WD. 02 -- OCTAL UNIT NUMBER OF TERMINALG7; WD. 03 -- FIRST HALF OF RAD50 NAME OF THE DESIRED CLIS<; WD. 04 -- SECOND HALF OF THE RAD50 NAME OF THE DESIRED CLI;O5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ;C-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.S&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.E2; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF THE; LENGTH IS ILLEGAL 2; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IS THE#; ISSUING TASK IS NOT PRIVILEGED. 1; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF AN-5; NON-EXISTANT OR NON-TERMINAL DEVICE IS SPECIFIED.4;; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF THE SPECIFIEDU; CLI DOES NOT EXIST.A6; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF THERE IS; INSUFFICIENT POOL SPACE.1; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THEI/; TERMINAL IS LOGGED OFF, AND CP.LGO IS CLEARR;R;-@SCLI: BIT #T3.PRV!T3.CLI,T.ST3(R5) ;CAN TASK USE THIS DIRECTIVE? BEQ 40$ ;IF EQ NOS MOV (R3)+,R0 ;GET DEVICE NAME BNE 10$ ;IF NE, GOT ONES) MOV T.UCB(R5),R0 ;GET CURRENT TASK'S TI: # TST (R3)+ ;SKIP UNIT NUMBER FIELD BR 20$ ;"10$: MOV (R3)+,R1 ;GET UNIT NUMBER' MOV R3,-(SP) ;SAVE POINTER TO CLI NAMED% CALL $CVDVN ;CONVERT TO UCB ADDRESSI' BCS 50$ ;IF CS, DEVICE DOES NOT EXIST MOV R2,R0 ;COPY UCB ADDRESSI$ CALL $MPLND ;FOLLOW REDIRECT CHAIN, BIT #DV.TTY,U.CW1(R0) ;IS DEVICE A TERMINAL BEQ 500j0N0TADATADATADATADATADATADATADATADATA0$ ;IF EQ NOT' MOV (SP)+,R3 ;POINT TO CLI NAME IN CPBB(20$: CALL $STCLI ;SET THE TERMINALS CLI BCC 60$ ;IF CC, SUCCESS  TST R0 ;IDENTIFY ERROR BEQ 40$ ;IF EQ, PRIV VIOLATION BPL 30$ ;IF PL, NO POOLL DRSTS D.RS2 ;CLI NOT IN SYSTEM!30$: DEC R0 ;ALLOCATION FAILURE?V BNE 35$ ;IF NE YES3 DRSTS D.RS8 ;TERMINAL NOT LOGGED IN, CP.LGO CLEARI%35$: DRSTS D.RS1 ;ALLOCATION FAILURE0'40$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONO,50$: DRSTS D.RS92 ;ILLEGAL DEVICE SPECIFIED60$: RETURN ;SUCCESS;+'; **-GCII-GET CLI INFORMATION DIRECTIVEE; E; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A BUFFER IN THE CURRENTSC; TASK SPACE WITH INFORMATION ABOUT HIS OWN OR A SPECIFIED CLI. THE3@; ISSUING TASK MUST BE PRIVILEGED TO GET INFORMATION ABOUT A CLI@; WHICH IS NOT THE CLI OF ITS TI: TERMINAL. IF THE BUFFER IS NOT=; LONG ENOUGH TO CONTAIN ALL THE DATA, IT IS FILLED FROM LEFTO<; TO RIGHT WITH AS MUCH DATA AS WILL FIT. NO INDICATION WILL@; BE GIVEN TO THE TASK THAT ITS BUFFER IS TOO SHORT. THIS ALLOWSE; NEW DATA ITEMS TO BE RETURNED BY FUTURE VERSIONS OF THIS DIRECTIVE,C?; SINCE OLD TASKS WILL CONTINUE TO WORK. THEY JUST WILL NOT SEE ; THE NEW DATA. ; ; DPB FORMAT:I;C"; WD. 00 -- DIC(173.),DPB SIZE(7).5; WD. 01 -- ADDRESS OF BUFFER IN CURRENT TASK'S SPACET'; WD. 02 -- LENGTH OF THE TASK'S BUFFER 7; WD. 03 -- FIRST HALF OF NAME OF CLI TO RETURN DATA ONE8; WD. 04 -- SECOND HALF OF NAME OF CLI TO RETURN DATA ON;; WD. 05 -- ASCII NAME OF TERMINAL WHOSE CLI SHOULD BE USEDO); WD. 06 -- OCTAL UNIT NUMBER OF TERMINALE;T5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)L;A-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.I2; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF THE; DPB LENGTH IS INVALID.9; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE BUFFER 1; IS NOT ENTIRELY WITHIN THE USER'S TASK SPACE.N7; DIRECTIVE STATUS OF 'D.RS81' IS RETURNED IF BOTH THEE/; NAMES OF THE CLI AND TERMINAL ARE SUPPLIED.A1; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF THEV!; SPECIFIED CLI DOES NOT EXIST.2; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF THE'; SPECIFIED DEVICE IS NOT A TERMINAL. 9; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF A NON-PRIVS/; TASK ATTEMPTS TO GET INFO ON A CLI WHICH IS.; NOT ASSOCIATED WITH ITS TI: ;R;-;FF; THE FORMAT OF THE INFORMATION BUFFER IN THE TASK'S ADDRESS SPACE IS:;I+; +---------------------------------------+E; ! NAME OF CLI !I; ! (2 WORDS) !U+; !---------------------------------------!E; ! CLI STATUS WORD FROM CPB !+; !---------------------------------------!.!; ! NAME OF TASK SERVING AS CLI !F; ! (2 WORDS) ! +; !---------------------------------------!S; ! TERMINAL'S U.CW2 !+; !---------------------------------------!I; ! TERMINAL'S PROTECTION UIC !I+; !---------------------------------------!T; ! TERMINAL'S CURRENT UIC !S+; !---------------------------------------!- ; ! !-; ! DEFAULT PROMPT STRING !!; ! (1 BYTE LENGTH, FOLLOWED BY !-; ! 31. BYTES STRING) !+; +---------------------------------------+-;-;-)GCII: MOV (R3)+,R0 ;GET ADDRESS OF BUFFERI# MOV (R3)+,R1 ;GET LENGTH OF BUFFER- MOV R1,-(SP) ;SAVE LENGTH MOV R0,-(SP) ;SAVE ADDRESSU# CALL $ACHKW ;ADDRESS CHECK BUFFER-% MOV R5,R2 ;COPY CURRENT TCB ADDRESST. MOV T.UCB(R5),R5 ;POINT TO CURRENT TASK'S TI:$ TST (R3) ;WAS A CLI NAME SPECIFIED BEQ 10$ ;IF EQ NO-% TST 4(R3) ;WAS A TERMINAL SPECIFIED BNE 100$ ;IF NE YESN% CALL $FNCLI ;FIND THE SPECIFIED CLI-% BCS 110$ ;IF CS, CLI DOES NOT EXIST-9 MOV U.MUP(R5),R3 ;GET WORD CONTAINING TI:S CLI INDICATOR,- BIC #^CUM.CLI,R3 ;ISOLATE CLI INDICATOR BITSL" CMP R3,R1 ;LOOKING AT TI:S CLI?? BEQ 200$ ;IF EQ YES  BR 30$ ;REQUIRE PRIVILEGE /10$: CMP (R3)+,(R3)+ ;SKIP OVER CLI NAME IN DPB  MOV (R3)+,R0 ;GET DEVICE NAME BEQ 20$ ;IF EQ NOK MOV (R3)+,R1 ;GET UNIT NUMBER* CALL $CVDVN ;CONVERT NAME TO UCB ADDRESS( BCS 120$ ;IF CS, DEVICE DOES NOT EXIST MOV R2,R0 ;COPY UCB ADDRESSN$00j00eeaek CALL $MPLND ;FOLLOW REDIRECT CHAIN' MOV R0,R5 ;PUT UCB ADDRESS BACK IN R5 , BIT #DV.TTY,U.CW1(R5) ;IS DEVICE A TERMINAL BEQ 120$ ;IF EQ NO120$: MOV U.MUP(R5),R4 ;GET CLI INDICATOR FROM UCBC BIC #^CUM.CLI,R4 ;ISOLATE ITB$ MOV $CPTBL(R4),R4 ;POINT TO THE CPB, MOV $TKTCB,R2 ;GET TCB ADDR OF CURRENT TASK0 CMP T.UCB(R2),R5 ;LOOKING AT CURRENT TASK'S TI:, BEQ 200$ ;IF EQ YES, DO NOT NEED PRIVILEGED30$: BIT #T3.PRV!T3.CLI,T.ST3(R2) ;IS CURRENT TASK PRIVILEGED OR CLI BNE 200$ ;IF NE YESD;S# DRSTS D.RS16 ;PRIVILEGE VIOLATIONA9100$: DRSTS D.RS81 ;CANNOT SPECIFY BOTH TERMINAL AND CLIU&110$: DRSTS D.RS2 ;CLI DOES NOT EXIST-120$: DRSTS D.RS92 ;ILLEGAL DEVICE SPECIFIEDD;T.200$: MOV (SP)+,R0 ;GET ADDRESS OF USER BUFFER) CALL $RELOC ;RELOCATE USERS INFO BUFFERK( MOV R1,KISAR6 ;MAP BUFFER IN TASK SPACE# MOV (SP)+,R3 ;GET LENGTH OF BUFFERK ASR R3 ;CONVERT TO WORD COUNT . SUB #2,R3 ;SPACE LEFT IN BUFFER FOR CLI NAME BLT 230$ ;IF LT NO) MOV C.PNAM(R4),(R2)+ ;PUT NAME IN BUFFER$ MOV C.PNAM+2(R4),(R2)+ ;SECOND HALF- DEC R3 ;SPACE IN BUFFER FOR CPB STATUS WORDR BLT 230$ ;IF LT NO2 MOV C.PSTS(R4),(R2) ;COPY STATUS WORD INTO BUFFER/ SUB #2,R3 ;SPACE LEFT IN BUFFER FOR TASK NAME, BLT 230$ ;IF LT NO! MOV (R4),R0 ;POINT TO CLI'S TCBS, BIT #CP.POL,(R2)+ ;IS TCB IN SECONDARY POOL BEQ 210$ ;IF EQ NO MOV R0,KISAR6 ;MAP TCBE MOV #140000,R0 ;POINT TO IT9210$: MOV T.NAM+2(R0),-(SP) ;GET SECOND HALF OF TASK NAMET MOV T.NAM(R0),-(SP) ;FIRST HALF. MOV R1,KISAR6 ;RESTORE MAPPING OF USER BUFFER. MOV (SP)+,(R2)+ ;PUT TASK NAME IN USER BUFFER MOV (SP)+,(R2)+ ;3 DEC R3 ;SPACE LEFT IN BUFFER FOR TERMINAL'S U.CW2  BLT 230$ ;IF LT NO, MOV U.CW2(R5),(R2)+ ;COPY U.CW2 INTO BUFFER$ DEC R3 ;SPACE FOR PROTECTION UIC?? BLT 230$ ;IF LT NO* MOV U.LUIC(R5),(R2)+ ;COPY PROTECTION UIC DEC R3 ;SPACE FOR CURRENT UICA BLT 230$ ;IF LT NO& MOV U.UIC(R5),(R2)+ ;COPY CURRENT UIC1 SUB #16.,R3 ;ENOUGH ROOM LEFT FOR PROMPT STRINGM BLT 230$ ;IF LT NO CLR R5 ;1 BISB C.PDPL(R4),R5 ;GET LENGTH OF DEFAULT PROMPT2- DEC R5 ;DO NOT RETURN ZERO AT END OF PROMPT2$ MOVB R5,(R2)+ ;PUT LENGTH IN BUFFER# BEQ 230$ ;IF EQ, NO PROMPT STRINGL) ADD #C.PRMT,R4 ;POINT TO START OF STRING &220$: MOVB (R4)+,(R2)+ ;COPY CHARACTER SOB R5,220$230$: RETURN ;SUCCESS(;++; **-$STCLI-ROUTINE TO SET A TERMINAL'S CLIU=; **-$STCL1-ROUTINE TO SET A TERMINAL'S CLI (ALTERNATE ENTRY)R;TB; THIS ROUTINE SETS THE CLI OF THE SPECIFIED TERMINAL FOR BOTH THEA; SCLI$ DIRECTIVE AND MCR. IF EITHER THE PREVIOUS OR NEW CLI HAVEPD; THE CP.MSG BIT SET IN THEIR CPB'S, A MESSAGE PACKET IS CREATED ANDI; PASSED TO THEM TO INFORM THEM OF THE CHANGE. NOTE THAT IF AN ALLOCATIONRE; FAILURE OCCURS WHEN ACTIVATING THE NEW CLI AFTER QUEUEING A MESSAGESD; TO IT, THE ERROR IS IGNORED SINCE IT WOULD BE IMPOSSIBLE TO UNWINDE; ACTIONS WHICH MAY HAVE ALREADY BEEN COMPLETED, SUCH AS DEACTIVATINGRG; THE PREVIOUS CLI AFTER A CALL TO $EXRQN. THE ONLY DRAWBACK TO THIS ISOC; THAT THE NEW CLI WILL NOT GET THE MESSAGE IMMEDIATELY. THE BUFFERCG; WILL BE LINKED IN ITS QUEUE, BUT THE CLI WILL NOT RECEIVE IT UNTIL ITDB; GETS ACTIVATED AT A FUTURE POINT BY A COMMAND ARRIVAL OR ANOTHER; SYSTEM MESSAGE.L; ; INPUTS: ;I#; R0=UCB ADDRESS OF TERMINAL TO SETE5; R3=POINTER TO THE NAME OF THE NEW CLI ($STCLI ONLY) 5; R1=OFFSET TO POINTER TO CPB IN $CPTBL ($STCL1 ONLY)B); R4=CPB ADDRESS OF NEW CLI ($STCL1 ONLY) ;V ; OUTPUTS:;A; C=1 CLI COULD NOT BE SET(; R0=2 IF AN ALLOCATION FAILURE OCCURED:; R0=1 IF THE TERMINAL IS LOGGED OFF, AND CP.LGO IS CLEAR8; R0=0 IF THE CP.RST BIT IS SET, AND A TASK OTHER THAN1; THE CLI IS ATTEMPTING TO SET A TERMINAL TO IT "; R0=-1 IF THE CLI DOES NOT EXIST@; C=0 THE CLI WAS SUCCESSFULLY SET UP FOR THE SPECIFIED TERMINAL;I; ALL REGISTERS ARE MODIFIED;$;-;Y5MSGLEN=/100 ;LENGTH OF MESSAGE PACKETSY; .IF NDF D$$PAR ,$STCLI::CALL $FNCLI ;FIND THE SPECIFIED CLI .ENDC ;D$$PAR.$STCL1::MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING5 MOV #-1,-(SP) ;SET 00j0N0TADATADATADATADATADATADATADATADATAEXIT STATUS WORD FOR THIS ROUTINE$ BCS 40$ ;IF CS, CLI DOES NOT EXIST* INC (SP) ;SET EXIT STATUS TO RETURN R0=02 MOV U.MUP(R0),R3 ;GET WORD CONTAINING CURRENT CLI# BIC #^CUM.CLI,R3 ;ISOLATE CLI BITSF# MOV $CPTBL(R3),R3 ;GET CPB ADDRESSL6 MOV C.PSTS(R3),$TEMP0 ;SAVE CURRENT CLI'S STATUS WORD< BIT #CP.RST,$TEMP0 ;DOES CURRENT CLI HAVE RESTRICTED ACCESS BEQ 3$ ;IF EQ NO3 CMP $TKTCB,(R3) ;IS OLD CLI ISSUING THIS DIRECTIVEP BNE 80$ ;IF NE NOI;3$: BIT #CP.RST,C.PSTS(R4) ;IS ACCESS TO NEW CLI RESTRICTEDA BEQ 5$ ;IF EQ NO3 CMP $TKTCB,(R4) ;IS NEW CLI ISSUING THIS DIRECTIVEP BNE 80$ ;IF NE NOO-5$: INC (SP) ;SET EXIT STATUS TO RETURN R0=1I- BIT #U2.LOG,U.CW2(R0) ;IS TERMINAL LOGGED ONI BEQ 7$ ;IF EQ YES3B BIT #CP.LGO,C.PSTS(R4) ;DOES CLI ACCEPT CMDS FROM LOGGED OFF TTYS BEQ 80$ ;IF EQ NOR-7$: INC (SP) ;SET EXIT STATUS TO RETURN R0=2E/ MOV R1,-(SP) ;SAVE OFFSET TO NEW CLI IN $CPTBLC MOV R0,-(SP) ;SAVE UCB ADDRESS8' CLR R5 ;ASSUME NO MESSAGE FOR NEW CLI)4 BIT #CP.MSG,C.PSTS(R4) ;DOES NEW CLI WANT A MESSAGE BEQ 10$ ;IF EQ NOS& MOV #MSGLEN,R1 ;GET LENGTH OF MESSAGE! CALL $ALSEC ;ALLOCATE A MESSAGEE BCS 70$ ;IF CS, NO POOL MOV R0,R5 ;SAVE BUFFER ADDRESS MOV R4,$TEMP1 ;SAVE CPB ADDRESS810$: BIT #CP.MSG,$TEMP0 ;DOES CURRENT CLI WANT A MESSAGE BEQ 25$ ;IF EQ NO # MOV #MSGLEN,R1 ;GET MESSAGE LENGTHT( CALL $ALSEC ;ALLOCATE A MESSAGE BUFFER BCS 60$ ;IF CS, NO POOLC MOV R0,R1 ;COPY BUFFER ADDRESS MOV (SP),R2 ;GET UCB ADDRESS' MOV R3,R4 ;GET ADDRESS OF CURRENT CPB # CALL STMSG ;SET UP MESSAGE BUFFER 1 MOV #CM.RMT,@#C.CMCD+140000 ;INSERT MESSAGE CODEL" MOV R1,-(SP) ;SAVE BUFFER ADDRESS+ CALL $QCPKT ;QUEUE BUFFER AND REQUEST CLIF BCC 20$ ;IF CC, OK$ BNE 50$ ;IF NE, ALLOCATION FAILURE;$E; AFTER THIS POINT, COMLETE ERROR RECOVERY IS IMPOSSIBLE, BECAUSE THELF; TASK MAY JUST HAVE BEEN ACTIVATED INSTEAD OF BEING MERELY UNSTOPPED.;6220$: TST (SP)+ ;DON'T NEED BUFFER ADDRESS ANYMORE-25$: MOV R5,R1 ;POINT TO MESSAGE FOR NEW CLI ( BEQ 30$ ;IF EQ, NO MESSAGE FOR NEW CLI MOV $TEMP1,R4 ;POINT TO NEW CPB MOV (SP),R2 ;GET UCB ADDRESS CALL STMSG ;SET UP MESSAGE+ CALL $QCPKT ;QUEUE MESSAGE AND REQUEST IT  ;DO NOT CHECK ERROR RETURNSC.30$: MOV (SP)+,R0 ;GET UCB ADDRESS OF TERMINAL. MOV (SP)+,R1 ;GET OFFSET TO NEW CLI IN $CPTBL1 MTPS #PR7 ;;;PREVENT TTDRV FROM ANSWERING PHONEC" ;;;WHEN CLI SETTING IS INVALIDB BIC #UM.CLI!UM.DSB,U.MUP(R0) ;;;CLEAR OUT PREVIOUS CLI INDICATION BIS R1,U.MUP(R0) ;;;SET NEW CLI MTPS #0 ;ALLOW INTERRUPTSO CLC ;SUCCESSC"40$: MOV (SP)+,R0 ;SET EXIT STATUS+ MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPING  RETURN ;ALL DONEL;Q; ERROR CLEANUP CODE;RF; ERROR WHILE ACTIVATING CURRENT CLI, SO UNLINK AND DEALLOCATE MESSAGE;E/50$: MOV #$CLICQ,R0 ;POINT TO CLI COMMAND QUEUEC* MOV (SP)+,R1 ;POINT TO BUFFER JUST QUEUED4 CALL $GTSPK ;REMOVE MESSAGE JUST INSERTED IN QUEUE$ MOV R1,R0 ;COPY POINTER TO MESSAGE MOV #MSGLEN,R1 ;GET ITS LENGTH CALL $DESEC ;DEALLOCATE IT;-; DEALLOCATE MESSAGE FOR NEW CLI IF IT EXISTS;:,60$: MOV R5,R0 ;POINT TO BUFFER FOR NEW CLI$ BEQ 70$ ;IF EQ, IT DIDN'T WANT ONE MOV #MSGLEN,R1 ;SET LENGTHL, CALL $DESEC ;DEALLOCATE BUFFER FOR NEW CLI!70$: CMP (SP)+,(SP)+ ;CLEAN STACKM80$: SEC ;SET ERROR STATUS BR 40$ ;GO TO COMMON EXIT CODE;P); LOCAL ROUTINE TO SET UP MESSAGE BUFFERSG;K ; INPUTS:E; R1=ADDRESS OF MESSAGE BUFFER; R2=ADDRESS OF TERMINAL UCB-; R4=ADDRESS OF CPB OF CLI TO RECEIVE MESSAGED;C ; OUTPUTS:;T=; THE MESSAGE BUFFER IN SEC POOL IS FILLED IN AND LEFT MAPPEDM;R ; REGISTERS R1, R4, R5 PRESERVED;B(STMSG: MOV R1,-(SP) ;SAVE BUFFER ADDRESS MOV R1,KISAR6 ;MAP BUFFER" MOV #140002,R3 ;POINT INTO BUFFER< MOV $MCRPT,(R3)+ ;ALL MESSAGES GO THRU DISPATCHER ON M-PLUS! MOV R2,(R3)+ ;INSERT UCB ADDRESS  MOV #4,(R3)+ ;CHARACTER COUNT- MOV #CC.CLI!CC.MSG,(R3)+ ;INSERT STATUS BITSD6 MOV #CM.LKT,(R3)+ ;ASSUME MESSAGE IS GOING TO NEW CLI9 MOV #+33,(R3)+ ;INSERT LENGTH AND TERMINATOR: MOV R2,R1 ;COPY UCB ADDR MOV (00j0k0l0eaekR1),R2 ;POINT TO DCBE* TST (R2)+ ;POINT TO ADDRESS OF FIRST UCB+ SUB (R2)+,R1 ;CALC RELATIVE ADDRESS OF UCBA" MOV (R2)+,(R3)+ ;COPY DEVICE NAME, MOV (R2)+,(R3) ;GET LOW UNIT NUMBER FOR DCB MOV (R2),R2 ;GET LENGTH OF UCB CLR R0 ;SET UP R0,R13 DIV R2,R0 ;CALC RELATIVE UNIT NUMBER FOR THIS DCBR' ADD R0,(R3)+ ;CALC LOGICAL UNIT NUMBER , CLRB -1(R3) ;CLEAR STUFF LEFT IN HIGH BYTE% MOV R4,(R3) ;PUT CPB ADDR IN BUFFER0% MOV (SP)+,R1 ;RESTORE BUFFER ADDRESSO RETURN ;1 .ENDC ;A$$CLI .END,R2 ;POINT TO DCBE* TST (R2)+ ;POINT TO ADDRESS OF FIRST UCB+ SUB (R2)+,R1 ;CALC RELATIVE ADDRESS OF UCBA" MOV (R2)+,(R3)+ ;COPY DEVICE NAME, MOV (R2)+,(R3) ;GET LOW UNIT NUMBER FOR DCB MOV (R2),R2 ;GET LENGTH OF UCB CLR R0 ;SET UP R0,R13 DIV R2,R0 ;CALC RELATIVE UNIT NUMBER FOR THIS DCBR' ADD R0,(R3)+ ;CALC LOGICAL UNIT NUMBER , CLRB -1(R3) ;CLEAR STUFF LEFT IN HIGH BYTE% MOV R4,(R3) ;PUT CPB ADDR IN BUFFER0% MOV (SP)+,R1 ;RESTORE BUFFER ADDRESSO RETURN ;1 .ENDC ;A$$CLI . .TITLE MPTBL$ .IDENT /02.04/N; ,; COPYRIGHT (C) 1974, 1978, 1979, 1980, 1981/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.M; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDA9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.N; ; VERSION 02.04 ;;; T. J. MILLER 23-OCT-77;); MODIFIED FOR RSX-11M-PLUS VERSION 1 BY:T; ; K. E. KINNEARR; J. E. PROVINO$; B. A. O'CONNELLG;A; MODIFIED BY:;.; B. S. MCCARTHY 11-AUG-80;.=; BM072 -- CORRECT GRP GBL EVENT FLAG USE COUNT MANIPULATION; ; J. E. POLLACK 26-NOV-808;9<; JEP022 -- REMOVE QMCR GIN$ FUNCTION AND ADD SET PRIVILEGE;; B. S. MCCARTHY 16-DEC-80;D5; BM100 -- ADDITION OF USER D SPACE SUPPORT, RESERVEA-; USER DICS, RESERVE FUTURE DIRECTIVE DICS.;E; B. S. MCCARTHY 18-MAR-81;R2; BM125 -- MOVE DIRECTIVE AND GIN TABLES TO DRTB2;Y; B. S. MCCARTHY 29-SEP-81;E(; BM162 -- CORRECT LENGTH OF DPB BUFFER;D<; MULTIPROCESSOR TABLES AND DIRECTIVE DISPATCHER IMPURE AREAK; (IN A MULTI-PROCESSOR SYSTEM THIS MODULE CAN EITHER BE PROCESSOR-SPECIFIC9; OR IN THE COMMON DATA AREA) ;C; LOCAL DATA-ADJACENCY ASSUMED;.)$USRPS::.BLKW 1 ;POINTER TO USER PS WORDI)$BTRMV::.BLKW 1 ;BYTES TO REMOVE ON EXITS6$DICSV::.BLKW 16. ;BUFFER FOR DPB (THIS MUST INCREASE% ;WHENEVER THE SIZE OF THE LARGESTD ;COPIED DPB CHANGES);A; MULTIPROCESSOR INTERPROCESSOR INTERRUPT FUNCTION DISPATCH TABLEP;U .IF DF M$$PRO0$MPDSP::.WORD $CRAL1 ;MP.CRH -- CRASH PROCESSOR5 .WORD $PWRMP ;MP.PWF -- SOME CPU DETECTED POWERFAILE4 .WORD $IISLM ;MP.RSM -- RESET IIST INTERRUPT MASKS5 .WORD $INTXT ;MP.NOP -- NOP FUNCTION FOR XMIT CHECK - .WORD $INTXT ;MP.XXX -- CURRENTLY UNDEFINED; .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX5 .WORD $CPOFF ;MP.STP -- STOP CPU IN ORDERLY FASHION .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .ENDC .END;MP.PWF -- SOME CPU DETECTED POWERFAILE4 .WORD $IISLM ;MP.RSM -- RESET IIST INTERRUPT MASKS5 .WORD $INTXT ;MP.NOP -- NOP FUNCTION FOR XMIT CHECK - .WORD $INTXT ;MP.XXX -- CURRENTLY UNDEFINED; .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX5 .WORD $CPOFF ;MP.STP -- STOP CPU IN ORDERLY FASHION .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX . .TITLE EMDRV1 .IDENT /01.02/ ;T6; COPYRIGHT (C) 1981 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;Q<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;E; VERSION 01.02V;.; P. J. CARR 25-AUG-81; ; MODIFIED BY:;L; P. J. BEZEREDI 14-SEP-81;K8; PB264 -- RESTORE I/O PACKET ADDRESS AFTER WRITE CHECK; DETERMINATION CODE. ;D; P. J. BEZEREDI 22-OCT-81;;6; PB269 -- RETURN IE.SZE ERROR FOR 00l0N0TADATADATADATADATADATADATADATADATANON-EXISTANT UNIT.;D; ; RH11-ML11 MEMORY SYSTEM DRIVER; ; MACRO LIBRARY CALLSR;O .MCALL HWDDF$,PKTDF$.$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;N; EQUATED SYMBOLST;H&ADR= 10 ;ADDRESS BITS SET UP (1=YES)'SEL= 20 ;PORT SELECT WAIT (1=WAITING)ORETRY= 8. ;ERROR RETRY COUNT;E; ML11 DEVICE REGISTER OFFSETS;A'MLCS1= 0 ;CONTROL AND STATUS REGISTERNMLWC= 2 ;WORD COUNT REGISTERMLBA= 4 ;BUS ADDRESS REGISTERUMLDA= 6 ;TRACK/SECTOR ADDRESSU#MLCS2= 10 ;SECOND STATUS REGISTERE!MLDS= 12 ;DRIVE STATUS REGISTERRMLER= 14 ;ERROR REGISTER&MLAS= 16 ;ATTENTION SUMMARY REGISTER;T; MLCS1 BIT ASSIGNMENTSO;ETRE= 40000 ;TRANSFER ERROR;D ; LOCAL DATA;B>; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);=7RTTBL: .BLKW M$$L11 ;RETRY COUNT FOR CURRENT OPERATIONE=PRMSV: .BLKW M$$L11*5 ;PARAMETER SAVE AREA FOR ERROR RECOVERYW ;AND WRITE CHECK FUNCTIONB;D; DRIVER DISPATCH TABLE ;A( DDT$ EM,M$$L11 ;GENERATE DISPATCH TABLE;+,; **-EMINI-RH11-ML11 MEMORY SYSTEM INITIATOR; B; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/OA; REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TOB; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED UNIT ISD; NOT BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST,F; ELSE A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT IS E; SUCCESSFUL, THEN THE NEXT I/O OPERATION IS INITIATED FOLLOWED BY A D; RETURN TO THE CALLER.I;T ; INPUTS:;3; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIATEDH;R ; OUTPUTS:;EA; IF THE SPECIFIED UNIT IS NOT BUSY AND AN I/O REQUEST IS WAITING @; TO BE PROCESSED, THEN THE NEXT REQUEST IS DEQUEUED AND THE I/O; OPERATION IS INITIATED.S;- .ENABL LSB 7EMINI: GTPKT$ EM,M$$L11 ;GET NEXT I/O PACKET TO PROCESS ;S1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:T;D&; R1=ADDRESS OF THE I/O REQUEST PACKET,; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB; R3=CONTROLLER INDEXA(; R4=ADDRESS OF THE STATUS CONTROL BLOCK3; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIATED:;E4; RH11-ML11 MEMORY SYSTEM I/O REQUEST PACKET FORMAT:;I!; WD. 00 -- I/O QUEUE THREAD WORD /; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBERT4; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK?; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER 4; WD. 04 -- FIRST LUN WORD IN REQUESTORS TASK HEADER0; WD. 05 -- I/O FUNCTION CODE (IO.RLB OR IO.WLB)/; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK4/; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCKS<; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000)2; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE@; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER*; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERREDN; WD. 15 -- NOT USED7; WD. 16 -- BITS <0:7> = HIGH LBN, BITS <8:15> NOT USEDT"; WD. 17 -- LOW LBN OF I/O REQUEST;; WD. 20 -- RELOCATION BIAS OF REGISTER BLOCK ELSE NOT USEDS:; WD. 21 -- REGISTER BLOCK ADDRESS (DISPLACEMENT + 140000);( BICB #ADR!SEL,U.CW2+1(R5) ;CLEAR FLAGS% MOV #RETRY,RTTBL(R3);SET RETRY COUNTD$ CALL $VOLVD ;VALIDATE VOLUME VALID BCS 10$ ;IF CS WE FAILED TST R0 ;TRANSFER FUNCTION? BMI EMUBMP ;IF MI YESS TST I.PRM+2(R1) ;SIZE THE DISK? BPL 10$ ;IF PL NON3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER>( MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS, MOVB U.UNIT(R5),MLCS2(R2) ;SELECT THE UNIT. MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS MOVB #111,(R2) ;CLEAR THE DRIVE+ BIT #10000,MLCS2(R2);DOES THE DRIVE EXIST?U BEQ 5$ ;IF EQ YESA2 MOVB #TRE/256.,MLCS1+1(R2) ;CLEAR THE CONTROLLER* MOV #IE.SZE&377,R0 ;UNABLE TO SIZE DEVICE) BICB #US.VV,U.STS(R5);RESET VOLUME VALID$ CALL $RLCN ;RELEASE THE CONTROLLER BR 10$ ;EXIT35$: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASKN- MOV #IS.SUC&377,R0 ;SET SUCCESSFUL OPERATION; BR 50$ ;10$: CALL $IODON ;FINISH I/O2& BR EMINI ;GET NEXT PACKET TO PROCESS;RC; NO00l0l00eaekW REQUEST THE CONTROLLER AND DETERMINE IF THE UNIBUS ADDRESS IS0D; ALREADY IN THE FORMAT FOR THE MASSBUS CONTROLLER OR THE UNIBUS MAP/; FOR 22-BIT PROCESSORS WITHOUT RH CONTROLLERS.E;E:EMUBMP: BITB #ADR,U.CW2+1(R5);ADDRESS BITS ALREADY SET UP? BNE EMINIO ;IF NE YES / BISB #ADR,U.CW2+1(R5);SHOW ADDRESS BITS SET UPL3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERS' MOV S.KRB(R4),R1 ;RETRIEVE KRB ADDRESSB/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?N BEQ 20$ ;IF EQ NOO: BIT #KS.MBC,K.STS(R1) ;YES, IS THIS A 22-BIT CONTROLLER? BNE 30$ ;IF NE YES( CALL $STMAP ;SET UP UNIBUS MAP ADDRESS220$: ASL U.BUF(R5) ;SHIFT BITS <4:5> TO BITS <8:9> ASL U.BUF(R5) ;...E ASL U.BUF(R5) ;...I ASL U.BUF(R5) ;...D/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?E BEQ 30$ ;IF EQ NO1% CALL $MPUBM ;MAP UNIBUS TO TRANSFERR;D<; CONVERT THE I/O FUNCTION CODE TO IT'S HARDWARE EQUIVALENT.;I230$: MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS7 CMP #IO.WCK!IQ.UMD,I.FCN(R1) ;DIAGNOSTIC WRITE CHECK?R BNE 40$ ;IF NE NO2, BISB #151,U.BUF(R5) ;YES, SET FUNCTION CODE BR 60$ ;040$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION2 BISB #171,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTION6 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?$ BHIS 55$ ;IF HIS FUNCTION IS LEGAL,50$: MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS) MOVB U.UNIT(R5),MLCS2(R2) ;SELECT DRIVEC CALLR EMFIN1 ;FINISH UPL%55$: BEQ 60$ ;IF EQ FUNCTION IS READV5 SUB #10,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTIONI;O; VALIDATE AND CONVERT LBN. ; -60$: CALL $BLKCK ;CHECK LOGICAL BLOCK NUMBER ' MOV R0,I.PRM+12(R3) ;SAVE DISK ADDRESS ' MOV S.KRB(R4),R1 ;RETRIEVE KRB ADDRESSF- MOVB K.CON(R1),R1 ;RETRIEVE CONTROLLER INDEXL% MUL #5,R1 ;SET UP AN INDEX INTO ...O' ADD #PRMSV,R1 ;... PARAMETER SAVE AREA& MOV U.BUF(R5),(R1)+ ;SAVE PARAMETERS MOV U.BUF+2(R5),(R1)+ ;... MOV U.CNT(R5),(R1)+ ;... MOV I.PRM+10(R3),(R1)+ ;... MOV I.PRM+12(R3),(R1)+ ;... .DSABL LSBR;O$; **-EMINIO-INTIATE AN I/O OPERATION;AB; THIS ROUTINE WILL INITIATE THE DATA TRANSFER OPERATION. AT THIS=; POINT THE CONTROLLER MUST BE REQUESTED FOR A DATA TRANSFER.R;R ; INPUTS: ; ; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCB.;L*EMINIO: MOV @S.KRB(R4),R2 ;GET CSR ADDRESS) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSU( MOVB U.UNIT(R5),MLCS2(R2) ;SELECT UNIT;29; DETERMINE IF DRIVE'S PORT IS SEIZED BY THIS CONTROLLER.1;3) CLR MLDS(R2) ;ATTEMPT TO SEIZE THE DRIVE( BIT #400,MLDS(R2) ;DID THE DRIVE SEIZE? BNE 5$ ;IF NE YES % MOVB #100,(R2) ;RE-ENABLE INTERRUPTSN0 BISB #SEL,U.CW2+1(R5);SET PORT SELECT WAIT FLAG< MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNT* CALLR $RLCN ;RELEASE CONTROLLER AND EXIT;..; LOAD CONTROLLER REGISTERS FOR DATA TRANSFER.;75$: MOV #TRE!11,(R2) ;CLEAR CONTROLLER AND DRIVE ERRORSR# ADD #MLCS2,R2 ;POINT TO SECOND CSRE- MOV I.PRM+12(R1),-(R2) ;INSERT DISK ADDRESSL. MOV U.BUF+2(R5),-(R2) ;INSERT BUFFER ADDRESS8 MOV U.CNT(R5),-(R2) ;INSERT NUMBER OF BYTES TO TRANSFER! ROR (R2) ;CONVERT TO WORD COUNTB$ NEG (R2) ;MAKE NEGATIVE WORD COUNT" TST -(R2) ;POINT TO CSR REGISTER;(&; TEST FOR DRIVE NOT READY CONDITIONS.;C+ MOV #IE.DNR&377,R0 ;ASSUME DRIVE NOT READYX7 MOV MLDS(R2),R3 ;GET CONTENTS OF DRIVE STATUS REGISTER COM R3 ;COMPLEMENT STATUS ( BIT #10200,R3 ;DRIVE READY AND ON-LINE? BEQ 20$ ;IF EQ YES1 BITB #US.SPU,U.STS(R5) ;IS DRIVE 'SPINNING UP'? BEQ 10$ ; IF EQ NO; BITB #US.VV,U.STS(R5) ;WAS THE VOLUME PREVIOUSLY MOUNTED?  BEQ EMPWF1 ;IF EQ NO* BR EMPWF0 ;YES, WAIT FOR IT TO 'SPIN UP'210$: BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC OPERATION BEQ 15$ ;IF EQ NOT. CALLR EMDIAG ;LOG DIAGNOSTIC DRIVE NOT READY+15$: CALL $DVERR ;LOG DEVICE TIMEOUT ERROR( CALLR EMFIN ;FINISH UP720$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE 'SPINNING UP'#8 BICB #S3.SPU,S.ST3(R4) ;CLEAR PORT 'SPINNING UP' FLAGS* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS MOV R3,R1 ;COPY KRB ADDRESSB; $; START THE DATA TRANSFER OPERATION.;S! MTPS #PR5 ;;;DISABLE INTERRUPTSO1 BIT #FE00l0N0TADATADATADATADATADATADATADATADATA.EXT,$FMASK ;;;22-BIT ADDRESSING ENABLED?B BEQ 30$ ;;;IF EQ NO;7 BIT #KS.MBC,K.STS(R3) ;;;IS THIS A 22-BIT CONTROLLER?  BEQ 30$ ;;;IF EQ NON' ADD K.OFF(R3),R1 ;;;POINT TO UCB TABLEI+ MOV KE.RHB(R1),R1 ;;;RETRIEVE RHBAE OFFSETB' ADD R2,R1 ;;;FORM AN I/O PAGE ADDRESSN2 MOVB U.BUF+1(R5),(R1);;;SET MEMORY EXTENSION BITS& MOVB U.BUF(R5),(R2) ;;;START FUNCTION BR 40$ ;;;)30$: MOV U.BUF(R5),(R2) ;;;START FUNCTION +40$: CLR S.FRK+2(R4) ;;;INIT FORK INTERLOCK / MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNT 8 BIS #KS.DIP,K.STS(R3) ;;;SET DATA TRANSFER IN PROGRESS- BIS #S2.ACT,S.ST2(R4) ;;;SHOW I/O IS ACTIVEO MTPS #0 ;ALLOW INTERRUPTSN;D<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;EEMCAN: RETURN ;NOP;+:; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND); CAUSES NO IMMEDIATE ACTION ON THE UNIT.;;-3EMPWF: TSTB S.STS(R4) ;IS THIS UNIT CURRENTLY BUSY?S BEQ EMPWF2 ;IF EQ NO6EMPWF0: MOVB #4,S.STS(R4) ;WAIT A MAXIMUM OF 8 SECONDS6EMPWF1: MOVB S.ITM(R4),S.CTM(R4) ;2 SECONDS AT A TIME7EMPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT 'SPINNING UP' 7EMPWF3: CALLR $RLCN ;RELEASE CONTROLLER (IF NECESSARY)D;+9; **-$EMINT-RH11-ML11 MEMORY SYSTEM CONTROLLER INTERRUPTS; INTERRUPT SERVICE ROUTINE;-3$EMINT::BR EMFRK ;;;ENTRY POINT FOR DATA TRANSFERS+ TST S.FRK+2(R4) ;;;ARE INTERRUPTS ALLOWED?- BNE EMCAN ;;;IF NE NO ' CALL $FORK ;;;CREATE A SYSTEM PROCESSF9EMFRK: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER82 BITB #SEL,U.CW2+1(R5);WAITING FOR PORT TO SELECT? BEQ 5$ ;IF EQ NO2 BICB #SEL,U.CW2+1(R5);CLEAR PORT SELECT WAIT FLAG% JMP EMINIO ;YES, GO DO THE TRANSFERR-5$: MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS - MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXP% MOV U.SCB(R5),R4 ;GET ADDRESS OF SCBF/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERK# MOV @S.KRB(R4),R2 ;GET CSR ADDRESSB( MOVB U.UNIT(R5),MLCS2(R2) ;SELECT UNIT# TSTB S.STS(R4) ;IS THIS UNIT BUSY?R BNE 15$ ;IF NE YES& CLR S.FRK+2(R4) ;RESET FORK INTERLOCK- MOV #TRE!11,(R2) ;CLEAR CONTROLLER AND DRIVEF- BIT #S2.MAD,S.ST2(R4) ;MULTI-ACCESS DEVICE?T BNE 10$ ;IF NE YES. MOVB #100,(R2) ;NO, JUST RE-ENABLE INTERRUPTS( BR EMPWF3 ;RELEASE CONTROLLER AND EXIT&10$: MOVB #113,(R2) ;RELEASE THE DRIVE8 BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED( BR EMPWF3 ;RELEASE CONTROLLER AND EXIT;2+; THE UNIT WAS BUSY. NOW CHECK FOR ERRORS.);S315$: BITB #US.SPU,U.STS(R5) ;ARE WE 'SPINNING UP'?E BNE EMREST ;IF NE YESF) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS17 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION EXECUTED?) BNE EMDIAG ;IF NE YES BIT #60000,(R2) ;ANY ERRORS?0 BEQ EMWCHK ;IF EQ NO. MOV MLWC(R2),R0 ;GET NEGATIVE WORDS REMAINING# ASL R0 ;CONVERT TO NEGATIVE BYTEST7 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERRED * SUB #512.,R0 ;SUBTRACT OUT BLOCK IN ERROR* BLE 20$ ;IF LE NO GOOD BYTES TRANSFERRED2 BIT #S2.EIP,S.ST2(R4) ;ERROR ALREADY IN PROGRESS BEQ 20$ ;IF EQ NOB;E;; WE GOT AN ERROR BUT SOME GOOD DATA WAS TRANSFERRED. THIS16; INDICATES THAT WE RECOVERED FROM THE PREVIOUS ERROR.;, CALL EMCALC ;CALCULATE NEW DISK PARAMETERS MOV R2,-(SP) ;SAVE CSR ADDRESSO/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNT/ BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNTR1 MOV #IS.SUC&377,R0 ;THIS RECOVERY WAS SUCCESSFUL#+ CALL $FNERL ;FINISH ERROR LOGGING PROCESS$- MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNTP" MOV (SP)+,R2 ;RESTORE CSR ADDRESS#20$: CALL $DVERR ;LOG DEVICE ERRORT- MOV #IE.WCK&377,R0 ;ASSUME WRITE CHECK ERRORT* BIT #40000,MLCS2(R2) ;WRITE CHECK ERROR? BNE EMRTRY ;IF NE YESL/ MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERROR,0 MOV MLER(R2),R1 ;GET CONTENTS OF ERROR REGISTER BIT #43007,R1 ;HARD ERROR?S BNE 30$ ;IF NE YES! BIT #14000,MLCS2(R2);NEM OR NED?C BNE 30$ ;IF NE YES TST MLCS2(R2) ;DATA LATE ERROR? BPL EMRTRY ;IF PL NO, CALL EMCALC ;YES, CALCULATE NEW PARAMETERS& BR EMRTRY ;RETRY FROM BLOCK IN ERROR$30$: BIT #4000,R1 ;WRITE LOCK ERROR? BEQ EMFIN ;IF EQ NO ) MOV #IE.WLK&377,R0 ;S00l000eaekET WRITE LOCK ERRORS BR EMFIN ;FINISH I/O;B@; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING REPEATEDA; UNLESS THE REQUEST WAS DIAGNOSTIC. TIMEOUTS ARE USUALLY CAUSED0C; BY POWERFAILURE BUT MAY ALSO BE THE RESULT OF A HARDWARE FAILURE.R;D9EMOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE 'SPINNING UP'?B BEQ 10$ ;;;IF EQ NOC- DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET?  BEQ 10$ ;;;IF EQ YES MTPS #0 ;;;ALLOW INTERRUPTSW. CALL $RQCND ;REQUEST CONTROLLER FOR TRANSFER# BR EMREST ;RETRY ENTIRE OPERATION,10$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY5 BICB #US.SPU,U.STS(R5) ;;;RESET DRIVE 'SPINNING UP'E MTPS #0 ;;;ALLOW INTERRUPTS . CALL $RQCND ;REQUEST CONTROLLER FOR TRANSFER* MOV S.KRB(R4),R2 ;GET CURRENT KRB ADDRESS- MOVB K.CON(R2),R3 ;RETRIEVE CONTROLLER INDEX;# MOV (R2),R2 ;RETRIEVE CSR ADDRESS;( MOVB U.UNIT(R5),MLCS2(R2) ;SELECT UNIT! CALL $DVTMO ;LOG DEVICE TIMEOUTQ2 BITB #SEL,U.CW2+1(R5);WAITING FOR PORT TO SELECT?) BNE EMFIN1 ;IF NE YES, WE DIDN'T GET ITT3 BCC EMRTRY ;IF CC, TIMEOUT DURING NORMAL FUNCTIONA7EMDIAG: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASKV* BR EMFIN ;DIAGNOSTIC PROCESSING COMPLETE; ; RETRY THE CURRENT OPERATION.; 0EMRTRY: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS' BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?R BNE EMFIN ;IF NE YES DEC RTTBL(R3) ;RETRY FUNCTION?  BLE EMFIN ;IF LE NOS'EMREST: MOVB #111,(R2) ;CLEAR THE DRIVEE! CALLR EMUBMP ;RESTART OPERATIONG;R!; TEST FOR WRITE CHECK OPERATION.N;ECEMWCHK: BITB #IO.WLC&377,I.FCN(R1) ;WRITE FOLLOWED BY WRITE CHECK?T BNE 10$ ;IF NE YES5 BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED BY MCR?I BEQ EMFIN ;IF EQ NOP)10$: MOVB U.BUF(R5),R1 ;GET LAST FUNCTION  CMPB #171,R1 ;WAS IT A READ? BEQ EMFIN ;IF EQ YES* CMPB #161,R1 ;WAS LAST FUNCTION A WRITE? BNE EMFIN ;IF NE NOR. MOV #RETRY,RTTBL(R3);REINITIALIZE RETRY COUNT. MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS# MUL #5,R3 ;FORM AN INDEX INTO ...' ADD #PRMSV,R3 ;... PARAMETER SAVE AREAM) MOV (R3)+,U.BUF(R5) ;RESTORE PARAMETERSL MOV (R3)+,U.BUF+2(R5) ;... MOV (R3)+,U.CNT(R5) ;... MOV (R3)+,I.PRM+10(R1) ;... MOV (R3)+,I.PRM+12(R1) ;.... MOVB #151,U.BUF(R5) ;SET WRITE CHECK FUNCTION( BR EMREST ;START WRTIE CHECK OPERATION;I; **-EMFIN-FINISH I/O OPERATIONT;NC; THIS ROUTINE WILL SET THE ACTUAL BYTES TRANSFERRED PARAMETER, THEAC; ERROR LOGGING RETRY COUNTS AND CALL $IODON. A CHECK WILL BE MADELA; FOR ANY PENDING ATTENTIONS AND THE CONTROLLER WILL BE RELEASED.E;E ; INPUTS:3;U; R0=SUCCESS/ERROR CODET; R2=ADDRESS OF CONTROLLER CSR; R4=ADDRESS OF THE SCB ; R5=ADDRESS OF THE UCB1;17EMFIN: MOV MLWC(R2),R1 ;GET WORDS REMAINING TO TRANSFER;+ ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFERW7 ADD U.CNT(R5),R1 ;CALCULATE BYTES ACTUALLY TRANSFERREDO&EMFIN1: MOVB #11,(R2) ;CLEAR THE DRIVE# MOV #TRE,(R2) ;NOW CLEAR THE DRIVE* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS2 BICB #SEL,U.CW2+1(R5);CLEAR PORT SELECT WAIT FLAG+10$: TSTB MLAS(R2) ;ANY ATTENTIONS PENDING? BEQ 20$ ;IF EQ NOS1 BISB #100,(R2) ;RE-DISPATCH TO INTERRUPT HANDLER BR 10$ ;TRY AGAINC020$: BIT #S2.MAD,S.ST2(R4) ;DUAL ACCESS DEVICE? BEQ 30$ ;IF EQ NOE6 BITB #S3.NRL,S.ST3(R4) ;SHOULD WE RELEASE THE DRIVE? BEQ 35$ ;IF EQ YES)30$: MOVB #100,(R2) ;RE-ENABLE INTERRUPTSE BR 40$ ;<35$: BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED7 MOVB #113,(R2) ;RE-ENABLE INTERRUPTS AND RELEASE DRIVE 140$: MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXT/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNT / BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNTR CALL $RLCN ;RELEASE CONTROLLER# CALL $IODON ;FINISH I/O OPERATIONC! JMP EMINI ;PROCESS NEXT REQUEST; >; THE TRANSFER STOPPED DUE TO A RETRYABLE ERROR CONDITION. WE>; WILL NOW BACKUP THE WORD COUNT, BUS ADDRESS AND TRACK/SECTOR>; ADDRESS BY ONE BLOCK AND RETRY THE TRANSFER FROM THIS POINT.@; THIS IS DONE TO PREVENT THE ERROR CONDITION FROM RECURRING DUE; TO A LONG TRANSFER.C;R5EMCALC: MOV MLWC(R2),R0 ;GET NEGATIVE WORDS REMAININGO* BNE 10$ 00l0m0n0DATADATADATADATADATADATADATA;IF NE WE HAD A PARTIAL TRANSFER0 MOV #-1,R0 ;DLT ON LAST WORD, FAKE PARTIAL XFR'10$: ASL R0 ;CONVERT TO NEGATIVE BYTESI7 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERREDD. BIC #777,R0 ;GET BLOCKS ACTUALLY TRANSFERRED5 SUB R0,U.CNT(R5) ;REDUCE BYTES REMAINING TO TRANSFER* BEQ 30$ ;IF EQ NO MORE BYTES TO TRANSFER3 ADD R0,U.BUF+2(R5) ;UPDATE STARTING BUFFER ADDRESSO0 ADCB U.BUF+1(R5) ;AND THE MEMORY EXTENSION BITS2 BIT #FE.EXT,$FMASK ;IS 22-BIT ADDRESSING ENABLED? BEQ 15$ ;IF EQ NO1+ MOV S.KRB(R4),R1 ;RETRIEVE THE KRB ADDRESS19 BIT #KS.MBC,K.STS(R1) ;IS THIS A 22-BIT MASSBUS DEVICE?V BNE 15$ ;IF NE YES& ADD K.OFF(R1),R1 ;POINT TO UMR AREA+2) ADD R0,-(R1) ;CALCULATE NEW REAL ADDRESSK ADCB -(R1) ;...R215$: MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS# SWAB R0 ;GET BLOCKS*2 TRANSFERREDS CLC ;CLEAR CARRY FOR ROTATE ROR R0 ;GET BLOCKS TRANSFERRED-20$: ADD R0,I.PRM+12(R1) ;UPDATE DISK ADDRESSI RETURN ;E430$: ADD R0,U.CNT(R5) ;YES, BACKUP BYTES TO TRANSFER RETURN ;V .END),R1 ;RETRIEVE THE KRB ADDRESS19 BIT #KS.MBC,K.STS(R1) ;IS THIS A 22-BIT MASSBUS DEVICE?V BNE 15$ ;IF NE YES& ADD K.OFF(R1),R1 ;POINT TO UMR AREA+2) ADD R0,-(R1) ;CALCULATE NEW REAL ADDRESSK ADCB -(R1) ;...R215$: MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS# SWAB R0 ;GET BLOCKS*2 TRANSFERREDS CLC ;CLEAR CARRY FOR ROTATE ROR R0 ;GET BLOCKS TRANSFERRED-20$: ADD R0,I.PRM+12(R1) ;UPDATE DISK ADDRESSI RETURN ;E430$: ADD R0,U.CNT(R5) ;YES, BACKUP BYTES TO TRANSFER RETURN .TITLE EXPOLT .IDENT /02/ C;2 ; COPYRIGHT (C) 1978, 1979, 1981/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED 9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.E;T ; VERSION 02;I; T. J. MILLER 23-OCT-77;EF; THIS MODULE STARTS THE POOL IN SYSTEMS SUPPORTING KERNEL DATA SPACE.;R; MODIFIED BY:; ; D. R. DONCHIN 23-NOV-81R; /; DD134 -- ALWAYS DEFINE $POOL IN EXPOL MODULE1;R S.$POOL:: ;REFERENCE LABEL FOR BOTTOM OF POOL  .IF DF K$$DAS 1$SYBEG::.WORD 0 ;LINK TO NEXT BLOCK IN FREE LISTO4 .WORD <<+3>&177774> ;LENGTH OF FREE BLOCK< .BLKB <<+3>&177774>-4 ;ALLOCATE REMAINING STORAGE%$SYTOP:: ;LAST ADDRESS IN EXECUTIVE E .ENDC I  .ENDILLER 23-OCT-77;EF; THIS MODULE STARTS THE POOL IN SYSTEMS SUPPORTING KERNEL DATA SPACE.;R; MODIFIED BY:; ; D. R. DONCHIN 23-NOV-81R; /; DD134 -- ALWAYS DEFINE $POOL IN EXPOL MODULE1;R S.$POOL:: ;REFERE .TITLE DRGTPO .IDENT /08.03/I;CC; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;:<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;N; D. N. CUTLER 30-AUG-73; ); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:D;H; T. M. MARTIN;:; MODIFIED BY:;T ; B. S. MCCARTHY 23-MAY-82 08.01;O7; BM255 -- ADD E$$LOG AND R$$PRO CONDITIONALS FOR P/OS1;O; T. LEKAS 3-JUNE-82 08.02;./; TL191 -- CHANGE REFERENCES TO $CTFEA AND CF.c&; SECOND HARDWARE FEATURE MASK WORD;R; T. LEKAS 18-AUG-82 08.03;E1; TL221 -- RETURN IE.ITF ON A GET TIME IF H2.ITFE; IS SET FOR P/OS;P;+1; **-$DRGTP-GET TIME PARAMETERS / SET SYSTEM TIME;G; THE GET TIME DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A SPECIFIED EIGHT/; WORD BUFFER WITH THE CURRENT TIME PARAMETERS.S;CB; THE SET SYSTEM TIME DIRECTIVE INSTRUCTS THE SYSTEM TO OPTIONALLYE; FILL A SPECIFIED EIGHT WORD BUFFER WITH THE CURRENT TIME PARAMETERSE?; AND TO RESET THE SYSTEM TIME USING A SPECIFIED TIME AND DATE. ;D;R/; DPB FORMAT FOR GET TIME PARAMETERS DIRECTIVE:U;I"; WD. 00 -- DIC(61.),DPB SIZE(2.).,; WD. 01 -- ADDRESS OF AN EIGHT WORD BUFFER.;R+; DPB FORMAT FOR SET SYSTEM TIME DIRECTIVE:E;R"; WD. 00 -- DIC(61.),DPB SIZE(3.).;; WD. 01 -- ADDRESS OF AN EIGHT WORD NEW TIME SPECIFICATIONE=; WD. 02 -- ADDRESS OF AN EIGHT WORD OUTPUT BUFFER (OLD TIME)M; ;I; BUFFER FORMAT:;I; WD. 00 -- YEAR SINCE 1900.00n000eaek; WD. 01 -- MONTH OF YEAR.; WD. 02 -- DAY OF MONTH.I; WD. 03 -- HOUR OF DAY.; WD. 04 -- MINUTE OF HOUR.M; WD. 05 -- SECOND OF MINUTE.C; WD. 06 -- TICK OF SECOND.1; WD. 07 -- TICKS PER SECOND.D;S ; INPUTS:H;O9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.E+; R3=ADDRESS OF THE SECOND WORD IN THE DPB.D/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.C,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;U5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)D;0-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED..&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.E8; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF BUFFER IS,; OUTSIDE OF ISSUING TASK'S ADDRESS SPACE.;-; $DRGTP:: MOVB -(R3),R4 ;GET DPB LENGTH. CMPB (R3)+,#2 ;GET TIME PARAMETERS DIRECTIVE? .IF DF R$$PRO! BNE 4$ ;IF NE NO - TRY SET TIMER2 BIT #H2.ITF,$HFMSK+2 ;IS THE DATA VALID FROM THE ;HARDWARE DATE/TIME CLOCK?0 BNE 40$ ;IF NE NO - RETURN INVALID TIME FORMAT& BR 5$ ;THE TIME IS VALID - RETURN IT .IFF ;R$$PROI BEQ 5$ ;IF EQ YESR .ENDC ;R$$PRO+4$: CMPB R4,#3 ;SET SYSTEM TIME DIRECTIVE?.$ BNE 41$ ;IF NE, ILLEGAL DPB LENGTH( BIT #T3.PRV,T.ST3(R5) ;TASK PRIVILEGED? BNE 3$ ;IF NE YES ( DRSTS D.RS16 ;ELSE PRIVILEGE VIOLATION23$: MOV (R3)+,R5 ;COPY VIRTUAL ADDRESS OF NEW TIME25$: MOV (R3)+,R3 ;GET PREVIOUS TIME BUFFER ADDRESS0 BNE 7$ ;IF NE, THERE IS A PREVIOUS TIME BUFFER BIT #1,R4 ;IS THIS A SET TIME?1 BNE 15$ ;IF NE YES, OLD TIME BUFFER IS OPTIONAL 17$: MOV #8.*2,R1 ;SET LENGTH OF BUFFER IN BYTES ;- CALL $ACHKP ;ADDRESS CHECK PARAMETER BUFFER 1 MOV #$TTNS-14,R1 ;POINT TO CURRENT TIME VECTOR E:10$: MOV (R1)+,(R3)+ ;INSERT TIME PARAMETER IN TASK BUFFER# CMP R1,#$TTNS ;ANY MORE TO INSERT?L BLOS 10$ ;IF LOS YES% MOV $TKPS,(R3) ;SET TICKS PER SECONDO(15$: ROR R4 ;SET SYSTEM TIME DIRECTIVE?$ BCC 90$ ;IF CC NO, GETTIM FINISHED( MOV R5,R3 ;GET NEW TIME BUFFER ADDRESS, MOV #8.*2,R1 ;SET LENGTH OF NEW TIME BUFFER4 CALL $ACHKP ;ADDRESS CHACK AND MAP NEW TIME BUFFER. MOV #$TTNS+2,R1 ;POINT TO CURRENT TIME VECTOR)20$: MOV -(R1),-(SP) ;COPY TIME PARAMETER4 CMP R1,#$TTNS-14 ;MORE TO COPY? BHI 20$ ;IF HI YES, CLR R2 ;INITIALIZE FEBRUARY DPM ADJUSTMENT, MOV SP,R5 ;POINT TO CURRENT YEAR PARAMETER. MOV #$TKPS-14,R1 ;POINT TO TIME LIMITS VECTOR CALL 100$ ;VALIDATE YEAR BIT #3,R0 ;LEAP YEAR?$ BNE 25$ ;IF NE NOI INC R2 ;SET FEB CONSTANT25$: U CALL 100$ ;VALIDATE MONTHS, BLOS 40$ ;IF C=1 OR Z=1 THEN INVALID MONTH DEC R0 ;NORMALIZE TO ZERO " BNE 27$ ;IF NE, THEN NOT JANUARY2 ADD #12.,R0 ;ELSE ADJUST TABLE INDEX FOR JANUARY27$: CMP R0,#1 ;FEBRUARY? BEQ 28$ ;IF EQ, YES2' CLR R2 ;ELSE CLEAR ANY DPM ADJUSTMENTU<28$: MOVB $DYPMN-1(R0),R4 ;GET NUMBER OF DAYS FOR THIS MONTH% ADD R4,R2 ;CALCULATE DAYS-PER-MONTHM CALL 100$ ;VALIDATE DAYL" BEQ 40$ ;IF Z=1 THEN ILLEGAL DAY DEC R2 ;NORMALIZE REFERENCE 3 CMPB R2,R0 ;DAY SPECIFIED HIGHER THAN CALC'D DPM?T% MOV #4,R4 ;VALIDATE HR,MIN,SEC,TICKL30$: CALL 100$ ;; SOB R4,30$ ;- BCS 40$ ;IF CS, THEN INVALID TICK OF SECOND21 MOV (R3),R0 ;GET GRANULARITY (TICKS PER SECOND)P: CMP -(R1),R0 ;CORRECT TICK PER SECONDS ON CURRENT SYSTEM? BEQ 50$ ;IF EQ YES$ CMP R0,#-1 ;DEFAULTED GRANULARITY? BEQ 50$ ;IF EQ YES*40$: DRSTS D.RS93 ;INVALID TIME PARAMETER&41$: DRSTS D.RS99 ;INVALID DPB LENGTH50$: INC R2 ;CORRECT DPMD. MOV R2,$TKPS-10 ;UPDATE NEW DAYS/MONTH LIMIT' MOV R5,R3 ;COPY TOP OF STACK POINTER#% DEC R3 ;ADJUST POINTER TO NEW TIMEC .IF DF A$$CNT! TST $SABPT ;ACCOUNTING ACTIVE?V BEQ 70$ ;IF EQ NO+ MOV #$TKPS+2,R4 ;POINT TO OLD TIME VECTORO8 MOV #/64.,R1 ;SET NUMBER OF BLKS TO ALLOCATE3 CALL $ALACC ;ALLOCATE ACCOUNTING TRANSACTION BLK % BCS 70$ ;IF CS, ALLOCATION FAILURE:& MOV R0,KISAR6 ;MAP TRANSACTION BLOCKK MOV #+BT.TIM,140000+B.TYP ;FILL IN TRANSACTION TYPE AND LENGTHT: MOV #140000+B.TNEW+7,R2 ;INIT OFFSET INTO OLD TIME VECTOR8 MOV #140000+B.TOLD,R1 ;INIT OFFSET INTO NEW TIME VECTOR;60$: MOVB 00n0o00DATADATADATADATADATADATADATA-(R3),-(R2) ;PLACE NEW TIME INTO TRANSACTION BLKQ7 MOVB (R4)+,(R1)+ ;PLACE OLD TIME INTO TRANSACTION BLKC# CMPB -(R3),(R4)+ ;ADJUST POINTERSU+ CMP R3,SP ;MORE TIME PARAMETERS TO MOVE?O BHI 60$ ;IF NE YEST/ MOV R0,R1 ;COPY TRANSACTION BLK MAPPING BIAS, CALL $QACNT ;QUEUE ACCOUNTING TRANSACTION .ENDC ;A$$CNT70$: ;REFERENCE LABEL .IF DF E$$LOG SEC ;ASSUME NO ERROR LOG PKTN1 BIT #ES.LOG,$ERFLA ;IS ERROR LOGGING TURNED ON?, BEQ 75$ ;IF EQ NO0 MOV #E$CCTL+<400*E$STIM>,R0 ;GET THE ENTRY CODE0 MOV #12.,R1 ;DATA SUBPACKET IS 12. BYTES LONG8 MOV #SM.HDR!SM.TSK!SM.DAT,R2 ;GET INFORMATION TO RECORD# MOV SP,R3 ;SET UP R3 TO POINT ATM ;ANYTHING THE CORRECT DATA ;SUBPACKET CONTENTS WILL BE ;FILLED IN LATER.1 MOV $TKTCB,R4 ;GET THE CURRENT TASK TCB ADDRESS! CALL $CRPKT ;CREATE THE PACKETN .IFTF ; DF E$$LOG675$: MOV #$TTNS-14,R4 ;POINT PAST CURRENT TIME VECTOR' MOV #6,R5 ;MOV 6 WDS OF NEW TIME VEC780$: ;REFERENCE LABEL .IFT ; DF E$$LOGE BCS 85$ ;IF CS NO ERRLOG PKT& MOVB (SP),(R1)+ ;FILL IN DATA PACKET .IFTF ; DF E$$LOG-85$: MOV (SP)+,(R4)+ ;SET NEW TIME PARAMETERP SOB R5,80$ ;VECTOR IN PLACE, MOV (SP)+,(R4)+ ;RETURN NEW TICK_OF_SECOND .IFT ; DF E$$LOGI BCS 90$ ;IF CS, NO ERRLOG PKT CALL $QUPKT ;ELSE QUEUE ITL .ENDC ; DF E$$LOG .IF DF R$$PRO- BIC #H2.ITF,$HFMSK+2 ;THE TIME IS NOW VALIDT3 BIT #H2.CLK,$HFMSK+2 ;TIME OF DAY CLOCK PRESENT ?T BEQ 90$ ;IF EQ NOF) CALL $SETCK ;SET TIME IN THE CLOCK CHIP8 .ENDC ; DF R$$PRO 90$: RETURN(;+A; THIS ROUTINE VALIDATES THE TIME PARAMETERS. IF THE C-BIT IS SET+H; UPON ENTRY, IT IS ASSUMED THAT AN INVALID TIME PARAMETER WAS DETECTED.K; IF THE USER PARAMETER, POINTED TO BY R3, IS EQUAL TO -1, THE VALUE OF THERF; CURRENT TIME VECTOR IS USED. ONLY THE UPPER LIMIT IS CHECKED BY THISF; ROUTINE BY COMPARING THE INPUT TIME PARAMETER WITH THE CORRESPONDINGD; LIMIT IN THE $TKPS VECTOR. IF THIS CHECK FAILS THE C BIT IS SET ONF; RETURN. IN ANY CASE, THE NEW TIME PARAMETER IS MOVED INTO THE VECTOR; ADDRESSED BY R5.;V1100$: BCS 40$ ;IF CS, ILLEGAL TIME PARAMETER HASP ;ALREADY BEEN DETECTED.A" MOVB (R3),R0 ;GET TIME PARAMETER! BPL 110$ ;IF PL, SO FAR SO GOODD5 CMP R0,#-1 ;OTHERWISE, IS IT A DEFAULTED PARAMETER? 2 BNE 40$ ;IF NE NO, NEGATIVE VALUES ARE NOT VALID. ;TIME PARAMETERS. NOTE THAT THE HIGH LIMIT. ;FOR THE YEAR PARAMETER CORRESPONDS TO THE/ ;YEAR 2128. THIS SEEMINGLY RESTRICTIVE HIGHE/ ;LIMIT PREVENTS USERS FROM SPECIFYING THEIRE. ;YEAR PARAMETER BASED ON ZERO, RATHER THAN ;THE YEAR 1900. 8 MOV (R5),R0 ;USE CURRENT TIME VECTOR TO SUPPLY DEFAULT7110$: TST (R3)+ ;ADJUST POINTER TO NEXT TIME PARAMETER;3 CMP (R1)+,R0 ;SET C BIT FOR OUT_OF_RANGE PARAMETERT BNE 120$D SEC:120$: MOV R0,(R5)+ ;MOVE NEW TIME PARAMETER TO TIME VECTOR ;ON STACK. RETURNE H .ENDLIT. ;FOR THE YEAR PARAMETER CORRESPONDS TO THE/ ;YEAR 2128. THIS SEEMINGLY RESTRICTIVE HIGHE/ ;LIMIT PREVENTS .TITLE DRSEDR .IDENT /09.10/,; C; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;U<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;$; D. N. CUTLER 2-SEP-73E;O); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:D;V; J. M. LAWLER; B. S. MCCARTHY;P; MODIFIED BY:;L ; B. S. MCCARTHY 23-MAY-82 09.01;S,; BM255 -- ADD G$$GEF CONDITIONALS FOR P/OS;C; M. PETTENGILL 1-JUN-82 09.024; MLP901 -- CORRECT BM255 CONDITIONALS IN WTLO CODE; ; J. R. KAUFFMAN 17-OCT-82 09.03;N0; JRK263 -- MOVE MORE CODE TO DIRECTIVE COMMONS;R; J. M. LAWLER 20-OCT-82 09.04 ;D1; JL137 -- FIX BUG WHICH CALCULATED EF MASK WORDS; INCORRECTLY;.-; SIGNIFICANT EVENT AND EVENT FLAG DIRECTIVESM;U; MACRO LIBRARY CALLS ;M .MCALL HDRDF$,TCBDF$Y% HDRDF$ ;DEFINE TASK HEADER OFFSETST, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+; **-$DRREF-READ EVENT FLAGE;L?; TH00o000eaekIS DIRECTIVE INSTRUCTS THE SYSTEM TO READ AN EVENT FLAG AND ; REPORT ITS POLARITY.;1 ; DPB FORMAT:;"; WD. 00 -- DIC(37.),DPB SIZE(2.).1; WD. 01 -- EVENT FLAG NUMBER OF FLAG TO BE READ.; ; INPUTS: ; ; R0=EVENT FLAG MASK WORD.; R1=EVENT FLAG MASK ADDRESS. 9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.I+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.H/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.D,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)E;S9; C=0 WITH A DIRECTIVE STATUS OF 'D.RS00' IF THE FLAG WAS); CLEAR OR 'D.RS22' IF THE FLAG WAS SET.B;- .ENABL LSB1$DRREF::BIT R0,(R1) ;TEST FLAG  BNE 10$ ;IF NE FLAG IS SET$ DRSTS D.RS00 ;SET DIRECTIVE STATUS;+; **-$DRCEF-CLEAR EVENT FLAG;A@; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CLEAR AN EVENT FLAG AND&; REPORT ITS POLARITY BEFORE CLEARING.;R ; DPB FORMAT: ;K"; WD. 00 -- DIC(31.),DPB SIZE(2.).4; WD. 01 -- EVENT FLAG NUMBER OF FLAG TO BE CLEARED.;U ; INPUTS:K;; R0=EVENT FLAG MASK WORD.; R1=EVENT FLAG MASK ADDRESS.A9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.B+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.B/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.I,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;L5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)A;V9; C=0 WITH A DIRECTIVE STATUS OF 'D.RS00' IF THE FLAG WAS ); CLEAR OR 'D.RS22' IF THE FLAG WAS SET.S;-$DRCEF::BIT R0,(R1) ;TEST FLAG  BEQ 20$ ;IF EQ FLAG IS CLEAR BIC R0,(R1) ;CLEAR FLAG (10$: DRSTS D.RS22 ;SET DIRECTIVE STATUS;+ ; **-$DRRAF-READ ALL EVENT FLAGS%; **-$DRREF-READ EXTENDED EVENT FLAGSH;AC; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A FOUR (OR SIX) WORD K>; BUFFER WITH THE TASK LOCAL AND COMMON EVENT FLAGS (AND GROUP; GLOBAL FLAGS).;D ; DPB FORMAT: ;K(; WD. 00 -- DIC(39.),DPB SIZE(2. OR 3.).3; WD. 01 -- ADDRESS OF A FOUR (OR SIX) WORD BUFFER. ;G; BUFFER FORMAT:;C(; WD. 00 -- TASK LOCAL EVENT FLAGS 1-16.); WD. 01 -- TASK LOCAL EVENT FLAGS 17-32.A%; WD. 02 -- COMMON EVENT FLAGS 33-48.T%; WD. 03 -- COMMON EVENT FLAGS 49-64.F,; WD. 04 -- GROUP GLOBAL EVENT FLAGS 65.-80.,; WD. 05 -- GROUP GLOBAL EVENT FLAGS 81.-96.; ; INPUTS:S; 9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. .; R3=ADDRESS OF THE BUFFER ADDRESS IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)T;A-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.-3; DIRECTIVE STATUS OF +1 IS RETURNED IF SUCCESSFUL3.; DIRECTIVE STATUS OF 'D.RS00' IS RETURNED IF); GROUP GLOBAL EVENT FLAGS DO NOT EXISTR(; FOR THIS TASK'S GROUP. IN THIS CASE); THE LOCAL AND COMMON EVENT FLAGS ARE O'; RETURNED AND THE GROUP GLOBAL FLAGS ; ARE ZERO.E; C=1 IF DIRECTIVE IS REJECTED.H8; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF BUFFER IS,; OUTSIDE OF ISSUING TASK'S ADDRESS SPACE.;-6$DRRAF::MOV (R3),R3 ;GET ADDRESS OF EVENT FLAG BUFFER. MOV #4*2,R1 ;SET LENGTH OF BUFFER IN BYTES  .IF DF X$$HDR&G$$GEFU0 MOVB H.CUIC+1(R4),-(SP) ;SAVE BYTE FROM HEADER  .ENDC ; DF X$$HDR&G$$GEFD MOVB $DICSV+1,R4 ;GET DPB SIZE. CMPB R4,#2. ;READ ALL EVENT FLAGS DIRECTIVE? BEQ 16$ ;IF EQ YES) CMPB R4,#3. ;READ EXTENDED EVENT FLAGS?  BNE 18$ ;IF NE NOC& CMP (R1)+,(R1)+ ;ADD 4 TO BUFFER SIZE,16$: CALL $ACHKP ;ADDRESS CHECK USER BUFFER0 MOV T.EFLG(R5),(R3)+ ;INSERT LOCAL FLAGS 1-16 1 MOV T.EFLG+2(R5),(R3)+ ;INSERT LOCAL FLAGS 17-32M, MOV $COMEF,(R3)+ ;INSERT COMMON FLAGS 33-48. MOV $COMEF+2,(R3)+ ;INSERT COMMON FLAGS 49-64( CMPB R4,#2. ;EXTENDED FLAGS DIRECTIVE? BEQ 17$ ;IF EQ NOM* CLR (R3)+ ;INITIALIZE GROUP GLOBAL FLAGS CLR (R3) ; .IF DF G$$GEF .IF DF X$$HDR- MOVB (SP),R4 ;RELOAD GROUP CODE FROM HEADER .IFF ' MOV $HEADR,R4 ;GET TASK HEADER ADDRESSE, MOVB H.CUIC+1(R4),R4 ;GET TASK GROUP NUMBER .ENDC2 CALL $SRGEF ;SEARCH FOR GROUP GLOBAL EVENT FLAGS BCS 20$ ;IF CS NOT00o000DATADATADATADATADATADATADATA FOUND0 MOV G.EFLG+2(R1),(R3) ;INSERT GROUP FLAGS 81-96/ MOV G.EFLG(R1),-(R3) ;INSERT GROUP FLAGS 65-80F .IFF ; DF G$$GEF#% BR 20$ ;GROUP GLOBALS NEVER PRESENT  .IFTF ; DF G$$GEF17$: ;REFERENCE LABEL .IFT ; DF G$$GEF .IF DF X$$HDR TST (SP)+ ;CLEAN UP STACKR .ENDC O .ENDC ; DF G$$GEF RETURN$18$: DRSTS D.RS99 ;INVALID DPB SIZE;+; **-$DRSEF-SET EVENT FLAG;R>; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SET AN EVENT FLAG AND$; REPORT IS POLARITY BEFORE SETTING.;M ; DPB FORMAT:,;)"; WD. 00 -- DIC(33.),DPB SIZE(2.).0; WD. 01 -- EVENT FLAG NUMBER OF FLAG TO BE SET.;F ; INPUTS:; ; R0=EVENT FLAG MASK WORD.; R1=EVENT FLAG MASK ADDRESS.9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.$+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.C/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.S,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)O;T9; C=0 WITH A DIRECTIVE STATUS OF 'D.RS00' IF THE FLAG WASM); CLEAR OR 'D.RS22' IF THE FLAG WAS SET.D;-6$DRSEF::BIT #T2.SEF,(R2) ;TASK STOPPED FOR EVENT FLAG? BEQ 19$ ;IF EQ NO@ BIC #T2.STP*2!T2.STP,(R2) ;UNSTOP THE TASK. NOTE THAT THERE IS% ;NO NEED TO CALL $NXTSK OR $SETCRU$ ;SINCE THIS IS THE CURRENT TASK.19$: BIT R0,(R1) ;TEST FLAG BNE 10$ ;IF NE FLAG IS SET BIS R0,(R1) ;SET FLAGO(20$: DRSTS D.RS00 ;SET DIRECTIVE STATUS .DSABL LSBV ;+ E+; **-$DRSTS-STOP FOR SINGLE EVENT FLAG S ; E; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO STOP THE ISSUING TASK UNTIL %; A SPECIFIED EVENT FLAG IS SET. D ; ; DPB FORMAT: N ; '; WD. 00 -- DIC(135.),DPB SIZE(2.). E4; WD. 01 -- EVENT FLAG NUMBER OF FLAG TO WAITFOR. ; ; INPUTS: T ; ; R0=EVENT FLAG MASK WORD. $"; R1=EVENT FLAG MASK ADDRESS. ;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. .; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. 2; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. /; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. L ; 8; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; 0; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ); DIRECTIVE STATUS OF +1 IS RETURNED. W$; C=1 IF DIRECTIVE IS REJECTED. ;; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE ISSUING T; TASK IS AT AST STATE. A8; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN EVENT .; FLAG NUMBER OTHER THAN A LOCAL EVENT FLAG ; NUMBER IS SPECIFIED. ;- K  .ENABL LSB 5$DRSTS::CMP -2(R3),#64. ;LOCAL OR COMMON EVENT FLAG ?  .IF DF G$$GEF BLOS 5$ ;IF LOS YES 1 CMP -2(R3),#96. ;LEGAL GROUP GLOBAL EVENT FLAG ?  BHI 20$ ;IF HI NO ( MOV R0,-(SP) ;SAVE EVENT FLAG MASK WORD+ MOV R1,-(SP) ;SAVE EVENT FLAG MASK ADDRESS.( CALL 30$ ;DOES THIS EVENT FLAG EXIST ?' BCS 20$ ;IF CS NO, ILLEGAL EVENT FLAGA. MOV (SP)+,R1 ;RESTORE EVENT FLAG MASK ADDRESS+ MOV (SP)+,R0 ;RESTORE EVENT FLAG MASK WORD  .IFF ; DF G$$GEF ' BHI 20$ ;IF HI NO, ILLEGAL EVENT FLAG  .IFTF ; DF G$$GEF"5$: TST (R2) ;TASK AT AST STATE ?& BMI 10$ ;IF MI YES, CANCEL DIRECTIVE3 BIS #T2.SEF,(R2) ;SET STOPPED FOR EVENT FLAG BIT A% JMP $DRWFS ;FINISH STATE PROCESSINGP010$: DRSTS D.RS80 ;ISSUING TASK IS AT AST STATE/20$: DRSTS D.RS97 ;ILLEGAL EVENT FLAG NUMBER V .IFT ; DF G$$GEFS.30$: MOV R4,-(SP) ;SAVE ADDRESS OF TASK HEADER. MOVB H.CUIC+1(R4),R4 ;GET TASK'S GROUP NUMBER4 CALL $SRGEF ;VALIDATE THE GROUP GLOBAL EVENT FLAGS* MOV (SP)+,R4 ;RESTORE TASK HEADER ADDRESS RETURN ;D .ENDC ; DF G$$GEF ;+ B2; **-$DRSTL-STOP FOR LOGICAL OR OF EVENT FLAGS ; E; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO STOP THE ISSUING TASK UNTIL :.; ANY OF THE SPECIFIED EVENT FLAGS IS SET. ; ; DPB FORMAT: G ; '; WD. 00 -- DIC(137.),DPB SIZE(3.). ); WD. 01 -- EVENT FLAG SET INDICATOR. 1&; WD. 02 -- EVENT FLAG MASK WORD. ; ; EVENT FLAG SETS: ; %; SET 00o100eaek1 -- EVENT FLAGS 1.-16. LOCALS%; SET 2 -- EVENT FLAGS 17.-32. LOCAL&; SET 3 -- EVENT FLAGS 33.-48. GLOBAL&; SET 4 -- EVENT FLAGS 49.-64. GLOBAL,; SET 5 -- EVENT FLAGS 65.-80. GROUP GLOBAL,; SET 6 -- EVENT FLAGS 81.-96. GROUP GLOBAL ; ; INPUTS: . ; ;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ..; R3=ADDRESS OF THE SECOND WORD IN THE DPB. 2; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. /; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; 8; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; 0; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ); DIRECTIVE STATUS OF +1 IS RETURNED. -$; C=1 IF DIRECTIVE IS REJECTED. 4; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE $; ISSUING TASK IS AT AST STATE. 3; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN ,; ILLEGAL EVENT FLAG SET OR A ZERO EVENT ; FLAG MASK IS SPECIFIED. O ;- ($DRSTL::TST 2(R3) ;NON-ZERO MASK WORD ? BEQ 20$ ;IF EQ NO, ILLEGAL0 CMP (R3),#3 ;ARE EVENT FLAGS LOCAL OR GLOBAL ? .IF DF G$$GEF BLOS 40$ ;IF LOS YES/ CMP (R3),#5 ;LEGAL GROUP GLOBAL EVENT FLAGS ?E BHI 20$ ;IF HI NOC- CALL 30$ ;ARE THESE GROUP GLOBALS DEFINED ?' BCS 20$ ;IF CS NO, ILLEGAL .IFF ; DF G$$GEFT" BHI 20$ ;IF HI NO, ILLEGAL GROUP .ENDC ; DF G$$GEF#40$: TST (R2) ;TASK AT AST STATE ? ' BMI 10$ ;IF MI,YES - CANCEL DIRECTIVED3 BIS #T2.SEF,(R2) ;SET STOPPED FOR EVENT FLAG BIT ; .DSABL LSB ;+.; **-$DRWFL-WAIT FOR LOGICAL OR OF EVENT FLAGS;OE; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SUSPEND THE EXECUTION OF THEL=; ISSUING TASK UNTIL ANY OF THE SPECIFIED EVENT FLAGS IS SET.0;; ; DPB FORMAT: ;B"; WD. 00 -- DIC(43.),DPB SIZE(3.).%; WD. 01 -- EVENT FLAG SET INDICATOR.2!; WD. 02 -- EVENT FLAG MASK WORD.N;;; EVENT FLAG SETS:;(; SET 0 -- EVENT FLAGS 1.-16.I; SET 1 -- EVENT FLAGS 17.-32.; SET 2 -- EVENT FLAGS 33.-48.; SET 3 -- EVENT FLAGS 49.-64.; SET 4 -- EVENT FLAGS 65.-80.; SET 5 -- EVENT FLAGS 81.-96.;F ; INPUTS:S;O9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.U+; R3=ADDRESS OF THE SECOND WORD IN THE DPB. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;15; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)M; -; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.S1; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN-*; ILLEGAL EVENT FLAG SET OR A ZERO EVENT; FLAG MASK IS SPECIFIED.;-($DRWFL::MOV (R3)+,R1 ;GET EVENT FLAG SET .IF DF G$$GEF CMP R1,#5 ;LEGAL SET?N .IFF  CMP R1,#3 ; LEGAL SET? .ENDC BHI 10$ ;IF HI NOE ASL R1 ;CONVERT TO WORD INDEX.' MOV (R3),R0 ;GET EVENT FLAG MASK WORD # BEQ 10$ ;IF EQ NO FLAGS SPECIFIEDC$ CMP R1,#3 ;COMMON GLOBAL FLAG SET? BLT 20$ ;IF LT NO  .IF DF G$$GEF% CMP R1,#7 ;GROUP GLOBAL EVENT FLAG?E BLT 5$ ;IF LT NO MOV R4,-(SP) ;SAVE REGISTERS  MOV R0,-(SP) ; ( MOV R1,-(SP) ;SAVE EVENT FLAG SET INDEX' MOVB H.CUIC+1(R4),R4 ;GET GROUP NUMBERL2 CALL $SRGEF ;SEARCH FOR GROUP GLOBAL EVENT FLAGS BCS 10$ ;IF CS NOT FOUND3 ADD (SP)+,R1 ;POINT TO PROPER GROUP GLOBAL EF WORD 8 ADD #G.EFLG-10,R1 ;IN THE GROUP GLOBAL EVENT FLAG BLOCK MOV (SP)+,R0 ;RESTORE REGISTERS MOV (SP)+,R4 ;P1 INC T.GGF(R5) ;INC GRP GLOBAL USE COUNT FOR TASKN1 CMP -2(R3),#4 ;FIRST SIXTEEN GROUP GLOBAL FLAGS?V BEQ 3$ ;IF EQ YES;3 INCB G.CNT-(R1) ;INC GROUPS ACCESS COUNTP BR 4$ ;JOIN COMMON CODEV13$: INC G.CNT-G.EFLG(R1) ;INC GROUPS ACCESS COUNTP<4$: CALLR $DRWS1 ;JOIN COMMON CODE TO SET WFR ON GLOBAL EFN .ENDC ; DF G$$GEF65$: ADD #$COMEF-4,R1 ;POINT TO PROPER COMMON FLAG WORD% BR 30$ ;FINISH UP AS IF SINGLE FLAG (10$: DRSTS D.RS97 ;SET DIRECTIVE STATUS(20$: ADD R5,R1 ;ADD ADDRESS OF TASK TCB0 ADD #T.EFLG,R1 ;POINT TO PROPER TASK FLAGS WORD330$: CALLR $DRWFS ;JOIN COMMON CODE TO SET WFR BITE .ENDINCB G.CNT-(R1) ;INC GROUPS ACC00p 100DATADATADATADATADATADATADATA .TITLE DRPUTI .IDENT /11.01/Y;MC; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.A; ALL RIGHTS RESERVED.;F<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;K; D. N. CUTLER 6-SEPT-73;); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:S;R; P. J. BEZEREDI ; M. S. FOX.; T. M. MARTIN;-; MODIFIED BY:; ; B. S. MCCARTHY 23-MAY-82 11.01;E4; BM255 -- ADD P$$RFL, P$$RTY CONDITIONALS FOR P/OS;(:; SPECIFY FLOATING POINT, POWERFAIL, AND RECEIVE AST TRAPS;9; MACRO LIBRARY CALLSU;E# .MCALL HWDDF$,HDRDF$,TCBDF$,PKTDF$.% HWDDF$ ;DEFINE HARDWARE BIT VALUESR PKTDF$ ;DEFINE AST CODES % HDRDF$ ;DEFINE TASK HEADER OFFSETSE, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+$; **-$DRPER-SPECIFY PARITY ERROR AST; H; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EITHER RECORD THAT PARITY ERROR8; AST'S ARE DESIRED OR NOT DESIRED FOR THE ISSUING TASK.; ; DPB FORMAT:C;I#; WD. 00 -- DIC(165.),DPB SIZE(2.).I,; WD. 01 -- AST ENTRY POINT ADDRESS OR ZERO.; ; INPUTS:R;A9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. +; R3=ADDRESS OF THE AST ADDRESS IN THE DPB.N/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.T,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)D;C*; C=0 IF DIRECTIVE SUCCESSFULLY COMPLETED.&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED..8; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST'S ARE ; ALREADY NOT DESIRED.9; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF DIRECTIVE O#; WAS ISSUED FROM AN AST ROUTINE. ;- .ENABL LSBO .IF DF P$$RTY E<$DRPER::MOV #AS.PEA,R4 ;GET CODE FOR PARITY ERROR CONTRL BLK- MOV #21.,-(SP) ;SET NUMBER OF AST PARAMETERS 2 MOV #28.*2,-(SP) ;SET NUMBER OF BYTES TO ALLOCATE5 MOV #,-(SP) ;SET CODE FOR CONTROL BLOCKR BR 10$ ;FINISH IN COMMON CODE .ENDC ; DF P$$RTY T;+'; **-$DRREX-SPECIFIY REQUESTED EXIT ASTN;ID; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EITHER RECORD THAT REQ EXIT8; AST'S ARE DESIRED OR NOT DESIRED FOR THE ISSUING TASK.G; WHEN THE AST OCCURS, IT BECOMES DESPECIFIED FOR NON PRIVILEGED TASKS.EB; NON PRIVILEGED TASKS MAY NOT RESPECIFY THIS AST AFTER IT OCCURS.; ; DPB FORMAT:R;#; WD. 00 -- DIC(167.),DPB SIZE(2.).S,; WD. 01 -- AST ENTRY POINT ADDRESS OR ZERO.; ; INPUTS: ;C9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.+; R3=ADDRESS OF THE AST ADDRESS IN THE DPB. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.O,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)C;,*; C=0 IF DIRECTIVE SUCCESSFULLY COMPLETED.&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED..8; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST'S ARE ; ALREADY NOT DESIRED.9; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF DIRECTIVE O#; WAS ISSUED FROM AN AST ROUTINE. ;- $DRREX::3 BIT #T2.REX,T.ST2(R5) ;ABORT AST ALREADY EFFECTED?  BEQ 5$ ;IF EQ NO0 BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED?. BNE 50$ ;IF NE YES, TASK AT AST OR DST STATE0 BR 60$ ;NON-PRIV TASK, CAN'T REISSUE DIRECTIVE,5$: CLR -(SP) ;SET NUMBER OF AST PARAMETERS1 MOV #7.*2,-(SP) ;SET NUMBER OF BYTES TO ALLOCATEI! MOVB -(R3),R4 ;GET DPB SIZE BYTE  CMPB (R3)+,#2 ;SREA?  BEQ 7$ ;IF EQ, YES CMPB R4,#3 ;SREX?0 BNE 9$ ;IF NE NO7 ADD #2.*2,(SP) ;ADJUST NUMBER OF BYTES TO ALLOCATE AND- MOV #2,2(SP) ;NUMBER OF PARAMS FOR SREX FORME87$: MOV #,-(SP) ;SET CODE FOR CONTROL BLOCK( MOV #AS.REA,R4 ;SET TYPE FOR ABORT AST  BR 10$ ;FINISH IN COMMON CODE%9$: DRSTS D.RS99 ;ILLEGAL DPB LENGTHR E;+(; **-$CAAST-COMMAND ARRIVAL AST FOR CLIS;C; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EITHER RECORD THAT COMMANDE:; ARRIVAL ASTS ARE DESIRED OR NOT DESIRED FOR THE CLI TASKC; THAT ISSUED THE DIRECTIVE. THIS ROUTINE IS ENTERED WHEN THE DRCLI ; MODULE DETECTS THIS DIRECTIVE.;V ; DPB FORMAT:E;F#; WD. 01 -- DIC(1700p100eaek3.),DPB SIZE (2.)R+; WD. 02 -- AST ENTRY POINT ADDRESS OR ZEROM;# ; INPUTS:S;T8; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK*; R3=ADDRESS OF THE AST ADDRESS IN THE DPB.; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK+; R5=ADDRESS OF THE TCB OF THE CURRENT TASKT; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ;I*; C=0 IF DIRECTIVE SUCCESSFULLY COMPLETED.%; DIRECTIVE STATUS OF +1 IS RETURNED ; C=1 IF DIRECTIVE IS REJECTED7; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST'S AREP; ALREADY NOT DESIRED.8; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF DIRECTIVE#; WAS ISSUED FROM AN AST ROUTINE.H8; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF DIRECTIVE,; WAS ISSUED BY A TASK WHICH IS NOT A CLI.3; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF THERE1; IS INSUFFICIENT POOL TO ALLOCATE AN AST BLOCKK6; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF THE DPB; SIZE IS ILLEGAL.;R;- .IF DF A$$CLI4$CAAST::BIT #T3.CLI,T.ST3(R5) ;IS CURRENT TASK A CLI BEQ 80$ ;IF EQ NO- MOV #AS.CAA,R4 ;SET TYPE FOR CMD ARRIVAL ASTF+ MOV #1,-(SP) ;SET NUMBER OF AST PARAMETERSS1 MOV #8.*2,-(SP) ;SET NUMBER OF BYTES TO ALLOCATE'8 MOV #,-(SP) ;PUSH TYPE FOR CMD ARRIVAL AST BR 10$ ;FINISH IN COMMON CODEE .ENDC ;A$$CLI;+0; **-$DRFEX-SPECIFY FLOATING POINT EXCEPTION AST;EJ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EITHER RECORD THAT FLOATING POINT8; AST'S ARE DESIRED OR NOT DESIRED FOR THE ISSUING TASK.;. ; DPB FORMAT:I;U#; WD. 00 -- DIC(111.),DPB SIZE(2.).,; WD. 01 -- AST ENTRY POINT ADDRESS OR ZERO.; ; INPUTS:P;S9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.O+; R3=ADDRESS OF THE AST ADDRESS IN THE DPB.P/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.H,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)R;I*; C=0 IF DIRECTIVE SUCCESSFULLY COMPLETED.&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED..?; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST'S ARE ALREADY ; NOT DESIRED.<; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF DIRECTIVE WAS; ISSUED FROM AN AST ROUTINE.N;- .IF DF F$$LPP T:$DRFEX::TST H.FPSA(R4) ;IS TASK BUILT WITH FLOATING POINT? BEQ 60$ ;IF EQ NOC ASSUME HF.FPP,100000R* TST $HFMSK ;DOES THE FPP HARDWARE EXIST? BMI 60$ ;IF MI NO ; MOV #AS.FPA,R4 ;GET CODE FOR FLOATING POINT CONTROL BLOCK ++ MOV #2,-(SP) ;SET NUMBER OF AST PARAMETERSD1 MOV #9.*2,-(SP) ;SET NUMBER OF BYTES TO ALLOCATES5 MOV #,-(SP) ;SET CODE FOR CONTROL BLOCK  BR 10$ ;FINISH IN COMMON CODEI .ENDC;+&; **-$DRPUT-SPECIFY POWER RECOVERY AST;$J; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EITHER RECORD THAT POWER RECOVERY8; AST'S ARE DESIRED OR NOT DESIRED FOR THE ISSUING TASK.;T ; DPB FORMAT:S;E#; WD. 00 -- DIC(109.),DPB SIZE(2.).I,; WD. 01 -- AST ENTRY POINT ADDRESS OR ZERO.;T ; INPUTS:O;+9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.-+; R3=ADDRESS OF THE AST ADDRESS IN THE DPB.#/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;+5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)R;I-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.O&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.T?; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST'S ARE ALREADY ; NOT DESIRED.<; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF DIRECTIVE WAS; ISSUED FROM AN AST ROUTINE.A;- E .IF DF P$$RFL=$DRPUT::MOV #AS.PFA,R4 ;GET CODE FOR POWERFAIL CONTROL BLOCK ) CLR -(SP) ;SET NUMBER OF AST PARAMETERSS1 MOV #7.*2,-(SP) ;SET NUMBER OF BYTES TO ALLOCATED5 MOV #,-(SP) ;SET CODE FOR CONTROL BLOCKL BR 10$ ;FINISH IN COMMON CODE  .ENDC ; DF P$$RFL ;+ E,; **-$DRRRA-SPECIFY RECEIVE BY REFERENCE AST;DC; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EITHER RECORD THAT RECEIVESE; BY REFERENCE AST'S ARE DESIRED OR NOT DESIRED FOR THE ISSUING TASK.; ; DPB FORMAT:D;$"; WD. 00 -- DI00p100DATADATADATADATADATADATADATAC(21.),DPB SIZE(2.).,; WD. 01 -- AST ENTRY POINT ADDRESS OR ZERO.;S ; INPUTS:F;T9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.C+; R3=ADDRESS OF THE AST ADDRESS IN THE DPB. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)E;S1; C=0 IF THE DIRECTIVE IS SUCCESSFULLY COMPLETED. &; DIRECTIVE STATUS OF +1 IS RETURNED.#; C=1 IF THE DIRECTIVE IS REJECTED.P7; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST'S ARE ; ALREADY NOT DESIRED.8; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF DIRECTIVE#; WAS ISSUED FROM AN AST ROUTINE. ;- .IF DF P$$LAS N A$DRRRA::MOV #AS.RRA,R4 ;GET CODE FOR RECEIVE BY REF CONTROL BLOCKH) CLR -(SP) ;SET NUMBER OF AST PARAMETERS(1 MOV #7.*2,-(SP) ;SET NUMBER OF BYTES TO ALLOCATE=5 MOV #,-(SP) ;SET CODE FOR CONTROL BLOCKC BR 10$ ;FINISH IN COMMON CODE  .ENDC;+; **-$DRRCV-SPECIFY RECEIVE ASTA; C; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EITHER RECORD THAT RECEIVER8; AST'S ARE DESIRED OR NOT DESIRED FOR THE ISSUING TASK.;S ; DPB FORMAT:T;U#; WD. 00 -- DIC(107.),DPB SIZE(2.).N,; WD. 01 -- AST ENTRY POINT ADDRESS OR ZERO.;R ; INPUTS: ; 9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.+; R3=ADDRESS OF THE AST ADDRESS IN THE DPB.C/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.T,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;.5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)H;D1; C=0 IF THE DIRECTIVE IS SUCCESSFULLY COMPLETED. &; DIRECTIVE STATUS OF +1 IS RETURNED.#; C=1 IF THE DIRECTIVE IS REJECTED. ?; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST'S ARE ALREADYS; NOT DESIRED.<; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF DIRECTIVE WAS; ISSUED FROM AN AST ROUTINE. ;- H:$DRRCV::MOV #AS.RCA,R4 ;GET CODE FOR RECEIVE CONTROL BLOCK) CLR -(SP) ;SET NUMBER OF AST PARAMETERSF1 MOV #7.*2,-(SP) ;SET NUMBER OF BYTES TO ALLOCATES5 MOV #,-(SP) ;SET CODE FOR CONTROL BLOCKIA10$: BIT #T2.AST!T2.DST,(R2) ;ISSUED FROM AST OR AST'S DISABLED?  BNE 50$ ;IF NE YES  E .IF DF S$$LIB E MOV (R3),R2 ;GET AST ADDRESS" BEQ 30$ ;IF EQ AST'S NOT DESIRED. CALL $CALTA ;CALCULATE TRAP ADDRESS TO STORE MOV R2,R3 ;SAVE TRAP ADDRESS N .IFFU E MOV (R3),R3 ;GET AST ADDRESS" BEQ 30$ ;IF EQ AST'S NOT DESIRED L .ENDC R7 CALL $SRAST ;SEARCH FOR A SPECIFIED AST CONTROL BLOCK; BCC 20$ ;IF CC, ALREADY SET UP% MOV #C.LGTH,R1 ;GET SIZE TO ALLOCATE 0 CMP R4,#AS.PEA ;PARITY ERROR AST CONTROL BLOCK? BNE 15$ ;IF NE NOD8 MOV #A.PLGH,R1 ;ALLOCATE A BIGGER PACKET FOR PARAMETERS-15$: CALL $ALOCB ;ALLOCATE AST CONTROL BLOCKI# BCS 70$ ;IF CS ALLOCATION FAILURE / MOV $TKTCB,R1 ;GET TCB ADDRESS OF CURRENT TASKV< MOV T.SAST(R1),(R0) ;LINK NEW AST CONTROL BLOCK IN THE LIST MOV R0,T.SAST(R1) ;/20$: MOV R0,R1 ;COPY AST CONTROL BLOCK ADDRESSA- TST (R1)+ ;POINT TO LENGTH OF CONTROL BLOCK$5 MOV (SP)+,(R1)+ ;SET OFFSET TO CONTROL BLOCK ADDRESSA1 MOV (SP)+,(R1)+ ;SET NUMBER OF BYTES TO ALLOCATE # MOV R3,(R1)+ ;SET AST TRAP ADDRESS.5 MOV (SP)+,(R1) ;SET NUMBER OF PARAMETERS TO TRANSFERC BR 40$ ;TAKE COMMON EXIT=30$: CALL $SRAST ;SEARCH FOR A SPECIFIED AST CONTROL BLOCK ,+ BCS 60$ ;IF CS, AST'S ALREADY NOT DESIREDS. CMP R4,#AS.REA ;IS THIS A REQUESTED EXIT AST? BNE 35$ ;IF NE NOR6 BIC #T2.REX,T.ST2(R5) ;CLEAR REQUESTED EXIT AST FLAG 635$: MOV (R0),(R1) ;REMOVE CONTROL BLOCK FROM THE LIST2 MOV #C.LGTH,R1 ;GET LENGTH OF BLOCK TO DEALLOCATE0 CMP R4,#AS.PEA ;PARITY ERROR AST CONTROL BLOCK? BNE 37$ ;IF NE NOT MOV #A.PLGH,R1 ;GET PACKET SIZE/37$: CALL $DEACB ;DEALLOCATE AST CONTROL BLOCKE-40$: DRSTS +1 ;RETURN DIRECTIVE STATUS OF +1P(50$: DRSTS D.RS80 ;SET DIRECTIVE STATUS'60$: DRSTS D.RS8 ;SET DIRECTIVE STATUS,'70$: DRSTS D.RS1 ;SET DIRECTIVE STATUSB .IF DF A$$CLI(80$: DRSTS D.RS16 ;SET DIRECTIVE STATUS .ENDC .DSABL LSB  .ENDNTROL BLOCK FROM THE LIST2 MOV #C.LGTH,R1 ;GET LENGTH OF BLOCK T00q"100eaek .TITLE MEMAPC .IDENT /13.02/R; C; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.P; ALL RIGHTS RESERVED.;B<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;D; D. N. CUTLER 4-AUG-73E;A); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:U;; P. J. BEZEREDI; D. R. DONCHINR; B. S. MCCARTHY;T; MODIFIED BY:;. ; B. S. MCCARTHY 23-MAY-82 13.01;F,; BM255 -- ADD U$$UMR CONDITIONALS FOR P/OS;K; J. M. LAWLER 02-DEC-82 13.02;R/; JL144 -- MODIFY $RELUI TO RELOCATE SUPERMODEL ; I-SPACE REFERENCES CORRECTLY;S; I/O RELATED ROUTINES;W/; ROUTINES DEALING WITH MEMORY MAPPING AND UMRS;R; MACRO LIBRARY CALLSN;W8 .MCALL F11DF$,HDRDF$,HWDDF$,PCBDF$,PKTDF$,SHDDF$,TCBDF$0 F11DF$ ;DEFINE WINDOW AND LOCK BLOCK OFFSETS ' HDRDF$ ;DEFINE TASK HEADER OFFSETS $ HWDDF$ ;DEFINE HARDWARE REGISTERS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS $ PKTDF$ ;DEFINE I/O PACKET OFFSETS* SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+#; **-$MPPHY-MAP TO PHYSICAL ADDRESSA; P; THIS ROUTINE IS CALLED TO MAP A RELOCATION BIAS AND DISPLACEMENT ADDRESS TO ANK; 18 BIT PHYSICAL ADDRESS. IF THE INDICATED DEVICE IS NOT AN NPR AN DEVICE,1O; THEN THE RELOCATION BIAS AND DISPLACEMENT ADDRESS ARE RETURNED TO THE CALLER.TN; ELSE THE RELOCATION BIAS AND DISPLACEMENT ADDRESS ARE CONVERTED TO AN 18 BIT3; PHYSICAL ADDRESS WHICH IS RETURNED TO THE CALLER.;D ; INPUTS:N;H; R1=RELOCATION BIAS.; R2=DISPLACEMENT ADDRESS.'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.O;Y ; OUTPUTS:;9; IF DEVICE IS AN NPR DEVICE ON AN 18-BIT MACHINE, THEN I;; R1=HIGH ORDER 2 BITS OF PHYSICAL ADDRESS IN BITS 4 AND 5N,; R2=LOW ORDER 16 BITS OF PHYSICAL ADDRESS.1; IF DEVICE IS AN NPR DEVICE ON AN 11/70, THEN :; R1=HIGH ORDER 6 BITS OF PHYSICAL ADDRESS IN HIGH BYTE. .; R2=LOW ORDER 16 BITS OF PHYSICAL ADDRESS. &; IF DEVICE IS NOT AN NPR DEVICE, THEN; R1=RELOCATION BIAS.; R2=DISPLACEMENT ADDRESS.; &; R0 AND R3 ARE PRESERVED ACROSS CALL.;- R+$MPPHY::BITB #UC.NPR,U.CTL(R5) ;NPR DEVICE?S BEQ 10$ ;IF EQ NO1, ASL R2 ;REMOVE APR6 BIAS FROM DISPLACEMENT ASL R2 ;% CLC ;GET 2 BITS OF RELOCATION BIASR ROR R1 ;. RORB R2 ;TO FILL 8 LOW ORDER BITS OF ADDRESS ASR R1 ; RORB R2 ;& SWAB R2 ;SWAP TO COLLECT 8 MORE BITS, BISB R1,R2 ;INSERT UPPER 8 BITS OF ADDRESS$ SWAB R2 ;SWAP BACK TO REAL ADDRESS' CLRB R1 ;CLEAR LOW BYTE OF UPPER BITSB .IF NDF M$$EXTE. ASH #-4,R1 ;PUT BITS <17:18> OF ADDRESS INTO ;BITS <4:5>  .ENDC10$: RETURN ;L E;+:; THE FOLLOWING TWO ENTRY POINTS WILL BE DEFINED ONLY WHEN=; 22-BIT ADDRESSING CODE IS DISABLED. THIS IS TO PREVENT THER8; DRIVERS FROM HAVING UNDEFINED SYMBOLS WHEN TASK BUILT.;- .ENABL LSB2 .IF DF U$$UMR .IF NDF M$$EXT ($MPUBM:: ;MAP 11/70 UNIBUS TO TRANSFER!$STMAP:: ;SET MAPPING REGISTERSL RETURN ;DUMMY RETURNR;+3; **-$MPUB1-MAP UNIBUS TO MEMORY (ALTERNATE ENTRY). ;UA; THIS ROUTINE IS CALLED BY UNIBUS NPR DEVICE DRIVERS TO LOAD THE:=; NECESSARY UNIBUS MAP REGISTERS TO EFFECT A TRANSFER TO MAINSC; MEMORY ON AN 11/70 PROCESSOR WITH EXTENDED MEMORY. THIS ALTERNATEIE; ENTRY POINT ALLOWS THE DRIVER TO SPECIFY A NON-STANDARD UMR MAPPING ; ASSIGNMENT BLOCK. ;2 ; INPUTS:D;$/; R0=ADDRESS OF A UMR MAPPING ASSIGNMENT BLOCK. ;B ; OUTPUTS:;2; THE UNIBUS MAP REGISTERS NECESSARY TO EFFECT THE; TRANSFER ARE LOADED.;B-; NOTE: REGISTER R3 IS PRESERVED ACROSS CALL.;- .IFF ;NDF M$$EXT <$MPUB1::MOV M.UMRN(R0),-(SP) ;SET COUNT OF REGISTERS TO LOAD/ MOVB M.BFVH(R0),R1 ;GET HIGH 6 BITS OF ADDRESSO. MOV M.BFVL(R0),R2 ;GET LOW 16 BITS OF ADDRESS5 MOV M.UMRA(R0),R0 ;GET ADDRESS OF FIRST MAP REGISTERA BR 10$ ;GO LOAD THE UMRS;+ ; **-$MPUBM-MAP UNIBUS TO MEMORY; A; THIS ROUTINE IS CALLED BY UNIBUS NPR DEVICE DRIVERS TO LOAD THEB; NECESSARY UNIBUS MAP REGISTERS TO EFFECT A TRANSFER TO MAIN MEM-100q*100DATADATADATADATADATADATADATA; ORY ON AN 11/70 PROCESSOR WITH EXTENDED MEMORY. ;L ; INPUTS:;F; R4=ADDRESS OF DEVICE SCB. ; R5=ADDRESS OF DEVICE UCB.F;G ; OUTPUTS:;<; THE UNIBUS MAP REGISTERS NECESSARY TO EFFECT THE TRANSFER ; ARE LOADED. ;B-; NOTE: REGISTER R3 IS PRESERVED ACROSS CALL. ;-,$MPUBM::MOV S.KRB(R4),R0 ;GET KRB ADDRESS * ADD K.OFF(R0),R0 ;R0=END OF UMR AREA+2 : MOV M.UMRN-M.LGTH(R0),-(SP) ;PUSH COUNT OF UMR'S TO LOAD 4 MOV -(R0),R2 ;GET LOW 16 BITS OF BUF ADDR (M.BFVL) 0 MOVB -(R0),R1 ;GET HIGH ORDER 6 BITS (M.BFVH) 8 MOV M.UMRA-M.BFVH(R0),R0 ;PICK UP ADDRESS OF FIRST UMR .10$: MOV R2,(R0)+ ;LOAD LOW 16 BITS OF ADDRESS* MOV R1,(R0)+ ;LOAD HIGH 6 BITS OF ADDRESS ADD #20000,R2 ;ADVANCE 8K BYTES ADC R1 ;' SUB #4,(SP) ;ALL REGISTERS LOADED? A BGT 10$ ;IF GT NO TST (SP)+ ;CLEAN STACK RETURND .ENDC ;NDF M$$EXT .ENDC ; DF U$$UMR .DSABL LSBU ;+ S); **-$RELOC-RELOCATE USER VIRTUAL ADDRESS)8; **-$RELUI-RELOCATE USER (I SPACE ONLY) VIRTUAL ADDRESS;EC; THIS ROUTINE IS CALLED TO TRANSFORM A 16 BIT USER VIRTUAL ADDRESSDD; INTO A RELOCATION BIAS AND DISPLACEMENT IN BLOCK RELATIVE TO APR6.;R ; INPUTS:A;I&; R0=USER VIRTUAL ADDRESS TO RELOCATE.;C ; OUTPUTS:;C,; R1=RELOCATION BIAS TO BE LOADED INTO PAR6.3; R2=DISPLACEMENT IN BLOCK PLUS 140000 (PAR6 BIAS).R;R&; R0 AND R3 ARE PRESERVED ACROSS CALL.;- .ENABL LSBS .IF DF U$$DAS7$RELUI::MOV #UINAR0,-(SP) ;PUSH ADDRESS OF USER I SPACE- .IF DF S$$LIB) BIT #20000,@#PS ;EXECUTED IN USER MODE ?E BNE 10$ ;IF NE, YES ' MOV #SISAR0,(SP) ;SET TO SUPER I SPACER .ENDC ; DF S$$LIB BR 10$ ;ENTER COMMON CODEA .ENDC ; DF U$$DAS$RELOC:: ;REFERENCE LABELO .IF DF U$$DAS!S$$LIB:' MOV #UISAR0,-(SP) ;ASSUME USER D SPACEO R .IFDF S$$LIBC) BIT #20000,@#PS ;EXECUTED IN USER MODE ? BNE 10$ ;IF MI YES' MOV #SDSAR0,(SP) ;SET TO SUPER D SPACE .ENDC ; DF S$$LIB .IFTF ; U$$DAS!S$$LIB%10$: MOV R0,R1 ;COPY VIRTUAL ADDRESSL$ ASH #-6,R1 ;CALCULATE BLOCK NUMBER BIC #177600,R1 ;$! MOV R0,R2 ;COPY VIRTUAL ADDRESSS" ASH #-12.,R2 ;CALCULATE APR INDEX BIC #177761,R2 ;; .IFT ; DF U$$DAS!S$$LIB$ ADD (SP)+,R2 ;CALCULATE APR ADDRESS! ADD (R2),R1 ;AND FETCH CONTENTSM .IFF ; DF U$$DAS!S$$LIB- ADD UISAR0(R2),R1 ;CALCULATE RELOCATION BIASS .ENDC ; DF U$$DAS!S$$LIBB! MOV R0,R2 ;COPY VIRTUAL ADDRESS 4 BIC #177700,R2 ;CLEAR ALL BUT DISPLACEMENT IN BLOCK BIS #140000,R2 ;SET APR 6 BIAS1 RETURN ; .DSABL LSB6;+$; **-$RELOM-RELOCATE AND MAP ADDRESS;$C; THIS ROUTINE IS CALLED TO TRANSFORM A 16 BIT USER VIRTUAL ADDRESSDC; INTO A RELOCATION BIAS AND DISPLACEMENT IN BLOCK RELATIVE TO APR6C1; AND LOAD THESE VALUES FOR ACCESS BY THE CALLER.E;M ; INPUTS: ;U&; R0=USER VIRTUAL ADDRESS TO RELOCATE.;T ; OUTPUTS:;A; R0=DISPLACEMENT IN BLOCK.I,; KISAR6 IS LOADED WITH THE RELOCATION BIAS.;7; R3 IS PRESERVED ACROSS CALL.;- B3$RELOM::CALL $RELOC ;RELOCATE USER VIRTUAL ADDRESS.+ MOV R1,KISAR6 ;SET KERNEL MAPPING REGISTERP. MOV R2,R0 ;SET DISPLACEMENT IN BLOCK ADDRESS RETURN ;U;+0; **-$RELCD-RELOCATE,MAP AND CHECK A DPB/RDB/WDB;MC; THIS ROUTINE IS CALLED TO TRANSFORM A 16 BIT USER VIRTUAL ADDRESS A; INTO A BIAS/DISPLACEMENT PAIR. THE ROUTINE IS PRIMARILY FOR USEC?; FROM THE DIRECTIVE DISPATCHER FOR DPBS/RDBS/WDBS. THE ROUTINEI@; CHECKS TO SEE IF THE STRUCTURE OVERLAPS AN APR BOUNDARY. IF ITC; DOES, AND THE NEXT APR IS NOT MAPPED CONTIGUOUSLY WITH THE FIRST,R;; A STATUS OF D.RS98 IS RETURNED, ELSE THE BLOCK IS MAPPED.0;S ; INPUTS:M; ; R2=SIZE OF STRUCTURE IN BYTES; R3=USER VIRTUAL ADDRESSP;D ; OUTPUTS:;B;; D.RS98 RETURNED TO TASK IF STRUCTURE NOT PHYS. CONTIGUOUS ;T6; R3=DISPLACEMENT ADDRESS IF USER VIRT. ADDR WAS VALID;I?; NOTE: KISAR6 IS DESTROYED (REMAPPED) IF USER VIRT. ADDR VALIDB;- ($RELCD::MOV R3,R0 ;COPY VIRTUAL ADDRESS- ASH #-12.,R0 ;SHIFT APR SELECT TO BITS 1,2,3N( BIC #177761,R0 ;CLEAR ALL BUT APR INDEX6 MOV UISAR0(R0),R1 ;GET PAGE ADDRESS REGISTER CONT00q2100eaekENTS$ CMP #16,R0 ;MAPPED THROUGH APR 7 ?, BEQ 10$ ;IF EQ YES - ALWAYS CHECK FOR WRAP# MOV R1,-(SP) ;SAVE CONTENTS OF APR) ADD #200,(SP) ;AND POINT IT AHEAD BY 4KWN3 CMP (SP)+,UISAR0+2(R0) ;CONTIGUOUS WITH NEXT APR ?F BEQ 20$ ;IF EQ YES - ALWAYS OK310$: BIC #160000,R3 ;CLEAR APR SELECT FIELD OF V.A.D+ ADD R3,R2 ;CALCULATE ADDRESS OF LAST BYTER DEC R2 ;IN DATA STRUCTURES& CMP #20000,R2 ;OVERLAP APR BOUNDARY ?3 BLOS 30$ ;IF LOS YES - STRUCTURE IS NO CONTIGUOUS;%20$: MOV R3,R2 ;COPY VIRTUAL ADDRESSP. ASH #-6,R2 ;SHIFT OFFSET BITS TO 0 THROUGH 6% BIC #177600,R2 ;CLEAR OUT ALL OTHERS,( ADD R1,R2 ;CALCULATE 32WD BLOCK NUMBER0 BIC #177700,R3 ;STRIP ALL BUT DISPLACEMENT BITS* BIS #140000,R3 ;SET TO MAP THROUGH KISAR6" MOV R2,KISAR6 ;MAP TO USER BUFFER RETURN ;E:30$: DRSTS D.RS98 ;"PART OF DPB OUT OF TASK'S ADDR SPACE" ;+ /; **-$ASUMR-ASSIGN UNIBUS MAPPING REGISTERS R ; H; THIS ROUTINE IS CALLED TO ASSIGN A CONTIGUOUS SET OF UMR'S. NOTE THATH; FOR THE SAKE OF SPEED, THE LINK WORD OF EACH MAPPING ASSIGNMENT BLOCK H; POINTS TO THE UMR ADDRESS (2ND) WORD OF THE BLOCK, NOT THE FIRST WORD.H; THE CURRENT STATE OF UMR ASSIGNMENT IS REPRESENTED BY A LINKED LIST OFF; MAPPING ASSIGNMENT BLOCKS, EACH BLOCK CONTAINING THE ADDRESS OF THE D; FIRST UMR ASSIGNED AND THE NUMBER OF UMR'S ASSIGNED TIMES 4. THE B; BLOCKS ARE LINKED IN THE ORDER OF INCREASING FIRST UMR ADDRESS. ; ; INPUTS: D ; 6; R0=POINTER TO A MAPPING REGISTER ASSIGNMENT BLOCK. -; M.UMRN(R0)=NUMBER OF UMR'S REQUIRED * 4. ; ; OUTPUTS: ; #; ALL REGISTERS ARE PRESERVED. ; 1; C=0 IF THE UMR'S WERE SUCCESSFULLY ASSIGNED. D7; ALL FIELDS OF THE MAPPING REGISTER ASSIGNMENT BLOCK I1; ARE INITIALIZED AND THE BLOCK IS LINKED INTO E; THE ASSIGNMENT LIST. -; C=1 IF THE UMR'S COULD NOT BE ASSIGNED. ;- R  .IF DF M$$EXT&U$$UMR #$ASUMR::SAVNR ;SAVE R4 AND R5 G* TST (R0)+ ;SKIP OVER LINK WORD (M.LNK) 8 MOV #$UMRHD+2,R5 ;POINT TO UMR ASSIGNMENT LISTHEAD + 2 +10$: MOV R5,R4 ;SAVE POINTER TO PREVIOUS % BEQ 30$ ;IF EQ ASSIGNMENT FAILURE S7 MOV (R5),(R0) ;POINT TO NEXT FREE UMR (M.UMRA)(M.UMRA)E( ADD M.UMRN-M.UMRA(R5),(R0) ;(M.UMRA) 6 MOV #UBMPR+<31.*4>,-(SP) ;PUSH POINTER PAST LAST UMR 6 MOV -(R5),R5 ;POINT TO NEXT ASSIGNMENT BLOCK (M.LNK) ! BEQ 20$ ;IF EQ THERE IS NONE 7 MOV (R5),(SP) ;SET NEXT ALLOCATED UMR ADDRESS (M.UMRA)S;20$: SUB (R0),(SP) ;CALCULATE # OF FREE UMR'S * 4 (M.UMRA) 6 CMP (SP)+,M.UMRN-M.UMRA(R0) ;ENOUGH UMR'S AVAILABLE?  BLO 10$ ;IF LO NO 2 MOV R0,-(R4) ;LINK NEW BLOCK TO PREVIOUS (M.LNK) / MOV (R0),R4 ;SAVE FIRST UMR ADDRESS (M.UMRA) R7 MOV R5,-2(R0) ;POINT NEW BLOCK TO NEXT IN LIST (M.LNK) * MOV R4,R5 ;DUPLICATE FIRST UMR ADDRESS ; BICB #UBMPR!34,R5 ;MASK OUT ALL BUT HI 2 BITS IN LOW BYTE - BIC R5,R4 ;MASK OUT HIGH BYTE HIGH 2 BITS M* ASR R5 ;SHIFT HIGH 2 BITS TO BITS 4 & 5 . ASLB R4 ;CALCULATE HIGH BYTE OF LOW 16 BITS % ASL R4 ; (LOSING 200 BIT FIRST) U ASL R4 ; N' SWAB R4 ;FORM PROPER 16 BIT ADDRESS N< MOV M.BFVL-2(R0),M.UMVL-2(R0) ; GET ORIGINAL BUFFER ADDRESS& BIC #^C<1>,M.UMVL-2(R0) ; WAS IT ODD?8 ADD R4,M.UMVL-2(R0) ; IF IT WAS, THEN M.UMVL SHOULD BE) MOVB R5,M.UMVH-2(R0) ;SET BITS 4 & 5 D530$: DEC R0 ;PNT BACK TO LINK WORD PRESERVING CARRY I DEC R0 ; C RETURN ; ;+ 1; **-$DEUMR-DEASSIGN UNIBUS MAPPING REGISTERS 4 ; E; THIS ROUTINE IS CALLED TO DEASSIGN A CONTIGUOUS BLOCK OF UMR'S. IF LG; THE MAPPING ASSIGNMENT BLOCK IS NOT IN THE LIST, NO ACTION IS TAKEN. ,F; NOTE THAT FOR THE SAKE OF ASSIGNMENT SPEED, THE LINK WORD POINTS TO 8; THE UMR ADDRESS (2ND) WORD OF THE ASSIGNMENT BLOCK. ; ; INPUTS: 0 ; &; R2=POINTER TO ASSIGNMENT BLOCK. ; ; OUTPUTS: ; ; R0 AND R1 ARE PRESERVED. + ;- 1$DEUMR::TST (R2)+ ;SKIP OVER LINK WORD (M.LNK) 4 MOV #$UMR00q:100DATADATADATADATADATADATADATAHD+2,R3 ;POINT TO ASSIGNMENT LISTHEAD + 2 010$: CMP -(R3),R2 ;IS IT THE NEXT ONE? (M.LNK)  BEQ 20$ ;IF EQ YES 2 MOV (R3),R3 ;ELSE POINT TO NEXT IN LIST (M.LNK) BNE 10$ ;IF NE THERE IS ONE 1 BR 30$ ;ELSE MAPPING ASSIGNMENT BLK NOT IN LISTK520$: MOV -(R2),(R3) ;UNLINK THE BLOCK (M.LNK)(M.LNK) P30$: RETURN ; ;+<; **-$STMP1-SET UP UNIBUS MAPPING ADDRESS (ALTERNATE ENTRY).;.=; THIS ENTRY CODE SETS UP AN ALTERNATE DATA STRUCTURE USED AS >; A UMR MAPPING ASSIGNMENT BLOCK AND CONTEXT STORAGE BLOCK, IN<; THE SAME MANNER AS $STMAP USES THE FORK BLOCK AND MAPPING C; BLOCK IN THE SCB, KRB. THE FORMAT OF THE STRUCTURE IS AS FOLLOWS:M;K; -------------------------- ; ! ! 4 WORDS USED FOR SAVING!; ! ! DRIVER'S CONTEXT IN CASE-; ! ! UMRS CAN'T BE MAPPEDL; ! ! IMMEDIATELY.R; --------------------------; ! !; ! ! 6 WORDS USED AS A UMR"; ! ! MAPPING ASSIGNMENT BLOCK.; ! !; ! !; ! !; --------------------------;N;S ; INPUTS:O;A2; R0=ADDRESS OF THE DATA STRUCTURE DEPICTED ABOVE.; R4=ADDRESS OF DEVICE SCB. ; R5=ADDRESS OF DEVICE UCB. ;. ; OUTPUTS:;T?; DATA STRUCTURE POINTERS SET UP FOR ENTRY TO $STMP2 IN $STMAP. ; ;- .ENABL LSB 5$STMP1::MOV S.FRK+10(R4),6(R0) ;SAVE DRIVER'S MAPPING  MOV R0,R4 ;COPY BLOCK POINTERA, ADD #M.LGTH+10,R0 ;POINT PAST MAPPING BLOCK( ADD #4,R4 ;POINT TO CONTEXT SAVE BLOCK BR 5$ ;SET UP THE UMR ADDRESS ;+); **-$STMAP-SET UP UNIBUS MAPPING ADDRESS-;C; THIS ROUTINE IS CALLED BY UNIBUS NPR DEVICE DRIVERS TO SET UP THEBC; UNIBUS MAPPING ADDRESS, FIRST ASSIGNING THE UMR'S. IF THE UMR'S G; CANNOT BE ALLOCATED, THE DRIVER'S MAPPING ASSIGNMENT BLOCK IS PLACED SH; IN A WAIT QUEUE AND A RETURN TO THE DRIVER'S CALLER IS EXECUTED. THE B; ASSIGNMENT BLOCK WILL EVENTUALLY BE DEQUEUED WHEN THE UMR'S ARE G; AVAILABLE AND THE DRIVER WILL BE REMAPPED AND RETURNED TO WITH R1-R5 B; PRESERVED AND THE NORMAL OUTPUTS OF THIS ROUTINE. THE DRIVER'S G; CONTEXT IS STORED IN THE ASSIGNMENT BLOCK AND FORK BLOCK WHILE IT IS SE; BLOCKED AND IN THE WAIT QUEUE. ONCE A DRIVER'S MAPPING ASSIGNMENT ED; BLOCK IS PLACED IN THE UMR WAIT QUEUE, IT IS NOT REMOVED FROM THE B; QUEUE UNTIL THE UMR'S ARE SUCCESSFULLY ASSIGNED. THIS STRATEGY G; ASSURES THAT WAITING DRIVERS WILL BE SERVICED FIFO AND THAT DRIVER'S H=; WITH LARGE REQUESTS FOR UMR'S WILL NOT WAIT INDEFINATELY. E ; ; INPUTS:;R; R4=ADDRESS OF DEVICE SCB.S; R5=ADDRESS OF DEVICE UCB.'&; (SP)=RETURN TO DRIVER'S CALLER. ;L ; OUTPUTS:;O;; UNIBUS MAP ADDRESSES ARE SET UP IN THE DEVICE UCB AND THEI.; ACTUAL PHYSICAL ADDRESS IS MOVED TO THE SCB.;E;; NOTE: REGISTERS R1, R2, AND R3 ARE PRESERVED ACROSS CALL.H;- C,$STMAP::MOV S.KRB(R4),R0 ;GET KRB ADDRESS / ADD K.OFF(R0),R0 ;R0=LAST WORD+2 OF UMR AREA A' ADD #S.FRK+6,R4 ;POINT INTO FORK BLOCKM@5$: MOV U.BUF+2(R5),-(R0) ;SAVE LOW 16 BITS OF ADDRESS (M.BFVL)> MOVB U.BUF+1(R5),-(R0) ;SAVE HIGH 6 BITS OF ADDRESS (M.BFVH) # DEC R0 ;POINT BACK TO NEXT WORD ; MOV U.CNT(R5),-(R0) ;TEMORARILY STORE BYTE COUNT (M.UMVL) C, CLR -(R0) ;INITIALIZE UMR COUNT (M.UMRN) . BIT #1,M.BFVL-M.UMRN(R0) ;BUFFER ADDRESS ODD?" BEQ 10$ ;IF EQ NO, ALL IS NORMAL1 INC 2(R0) ;IT'S ODD, WE MUST MAP ONE EXTRA BYTED710$: ADD #4,(R0) ;INCREASE COUNT FOR ONE UMR (M.UMRN) A: SUB #20000,2(R0) ;REDUCE BYTE COUNT BY 8K BYTES (M.UMVL) ! BHI 10$ ;IF HI MORE BYTES TO GOR TST -(R0) ;(M.UMRA) (8 MOV -(R0),-(SP) ;SAVE POSSIBLE WAIT QUEUE LINK (M.LNK) 0 CALL $ASUMR ;ATTEMPT TO ASSIGN REQUIRED UMR'S 0 BCC 20$ ;IF CC SUCCESSFUL, CHECK FOR UMR WAIT  TST (SP)+ ;CLEAR STACK / MOV R5,(R4) ;SAVE R5 IN FORK BLOCK (S.FRK+6) 9 MOV (SP)+,-(R4) ;SAVE DRIVER'S RETURN ADDRESS (S.FRK+4) 3 MOV R0,-(R4) ;SAVE MAPPING BLOCK POINTER (S.FRK+2)I1 CALL $WTUMR ;WAIT FOR CHANGE IN UMR ASSIGNMENT (6 MOV (R4)+,R0 ;RESTORE MAPPING BLOCK POINTER (S.FRK+2)) ADD #M.LGTH,R0 ;POINT PAST MAPPING BLOCKM9 MOV (R4)+,-(SP) ;RESTORE DRIVER'S RETURN ADDR (S.FRK+4) M# MOV (R4),R5 ;RESTO00qB100eaekRE R5 (S.FRK+6)I* MOV 2(R4),KINAR5 ;REMAP DRIVER (S.FRK+10) .IF DF K$$DAS5 MOV 2(R4),KDSAR5 ;REMAP DRIVER IN D SPACE (S.FRK+10)  .ENDC BR 5$!20$: MOV U.SCB(R5),R4 ;RESTORE R4I< MOV M.UMVL(R0),U.BUF+2(R5) ;STORE LOW WORD OF UMR VIRT ADDR1 MOVB M.UMVH(R0),U.BUF(R5) ;STORE HIGH SIX BITS H+ CLRB U.BUF+1(R5) ;CLEAR HIGH-ORDER BYTE O* CMP $UMRWT,R0 ;WAS THIS CALLER WAITING?  BNE 30$ ;IF NE NO N2 MOV (SP),$UMRWT ;DEQUEUE CURRENT CALLER'S BLOCK # BNE 30$ ;IF NE NOT END OF LIST O4 MOV #$UMRWT,$UMRWT+2 ;UPDATE LAST IN LIST POINTER 30$: TST (SP)+ ;CLEAR STACK .ENABL LSBM ;+ S&; **-$DQUMR-DEQUEUE FROM UMR WAIT ; D; CONTROL IS TRANSFERRED HERE TO SEE IF A DRIVER IS WAITING FOR UMR G; ASSIGNMENT. FIRST THE CALLING DRIVER IS CALLED BACK AS A COROUTINE. .H; WHEN THE CALLING DRIVER ISSUES A RETURN BACK TO THIS ROUTINE, A CHECK H; IS MADE TO SEE IF ANY DRIVERS ARE WAITING FOR UMR'S. IF SO THE WAIT- C; ING DRIVER'S CONTEXT IS RESTORED WITHOUT ACTUALLY DEQUEUEING THE +F; MAPPING ASSIGNMENT BLOCK AND CONTROL IS PASSED BACK TO THE ORIGINAL ; UMR ASSIGNMENT ROUTINE. $ ; ; INPUTS: ; -; (SP)=RETURN ADDRESS TO DRIVER'S CALLER.. V ; ; OUTPUTS: ; A; IF ANYONE IS WAITING THEIR CONTEXT IS RESTORED AND THE ALLOCA- L#; TION ROUTINE IS CALLED BACK. H ;-  .ENABL LSB 4$DQUMR::CALL @(SP)+ ;CALL THE CALLER AS COROUTINE 3 MOV $UMRWT,R0 ;ANYONE WAITING FOR UMR ASSIGNMENT? U) BEQ 10$ ;IF EQ HE HAS SINCE GONE AWAY C ROL -(SP) ;SAVE SENSE OF C-BIT! TST (R0)+ ;POINT TO SAVED R1 ( MOV (R0)+,R1 ;RESTORE SAVED REGISTERS  MOV (R0)+,R2 ;  MOV (R0)+,R3 ;  MOV (R0)+,R4 ;  CALL @(R0)+ ;CALL ROUTINE + ROR (SP)+ ;RESET C BIT TO ENTRY CONDITIONT RETURN ; ;+ I,; **-$WTUMR-WAIT FOR CHANGE IN UMR STATE ; H; THIS ROUTINE STORES R1-R4 AND THE RETURN PC IN THE MAPPING ASSIGNMENT H; AND QUEUES THE BLOCK IN THE UMR WAIT QUEUE FOR A SUBSEQUENT RECALL TO H; THE CALLER WHEN THE STATE OF UMR ASSIGNMENT CHANGES. NOTE THAT IT IS F; POSSIBLE FOR THE MAPPING ASSIGNMENT BLOCK TO ALREADY BE IN THE WAIT @; QUEUE, BUT IF IT IS IT CAN ONLY BE AT THE HEAD OF THE QUEUE. ; ; INPUTS: B ; (; R0=POINTER TO UMR ASSIGNMENT BLOCK ; ; OUTPUTS: ; 9; THE ASSIGNMENT BLOCK IS QUEUED IN THE UMR WAIT QUEUE. ?; THE CALLER IS EVENTUALLY RETURNED AT SYSTEM STATE WITH R1-R4 H; PRESERVED. A ;- E @$WTUMR::MOV (SP)+,12(R0) ;STORE RETURN ADDR TO ALLOCATE ROUTINE 7 CMP R0,$UMRWT ;MAPPING ASSIGNMENT BLK ALREADY IN LIST?A BEQ 5$ ;IF EQ YES 0 MOV R0,@$UMRWT+2 ;LINK BLOCK TO LAST IN QUEUE / MOV R0,$UMRWT+2 ;UPDATE LAST IN LIST POINTER  CLR (R0) ;ZERO LINK WORD$5$: TST (R0)+ ;POINT PAST LINK WORD( MOV R1,(R0)+ ;SAVE CALLER'S REGISTERS  MOV R2,(R0)+ ;  MOV R3,(R0)+ ;  MOV R4,(R0)+ ; *10$: RETURN ;RETURN TO CALLER'S CALLER  .DSABL LSB  .ENDC ; DF M$$EXT&U$$UMR ;+,; **-$RELOP-RELOCATE UNIBUS PHYSICAL ADDRESS;R>; THIS ROUTINE RELOCATES A UNIBUS PHYSICAL ADDRESS TO A KISAR6; BIAS AND DISPLACEMENT.;L ; INPUTS:O;S4; R0=BYTE OFFSET FROM ADDRESS IN U.BUF+1 AND U.BUF+2; R5=UCB ADDRESS2; U.BUF+1(R5)=HIGH ORDER BITS OF PHYSICAL ADDRESS1; U.BUF+2(R5)=LOW ORDER BITS OF PHYSICAL ADDRESSV;, ; OUTPUTS:;M(; KISAR6=CALCULATED BIAS (MAPPED SYSTEM)!; R1=REAL ADDRESS OR DISPLACEMENTA;- .IF NDF R$$PRO -$RELOP::MOV R0,-(SP) ;SAVE OFFSET INTO BUFFER5 MOV U.BUF+2(R5),R1 ;GET LOW BITS OF PHYSICAL ADDRESS 7 MOVB U.BUF+1(R5),R0 ;GET HIGH BITS OF PHYSICAL ADDRESSA% ADD (SP),R1 ;ADD OFFSET INTO BUFFERU ADC R0 ;...B/ ASHC #10.,R0 ;CALCULATE DISPLACEMENT AND BIAS  ASHC #-10.,R1 ;...B$ MOV R0,KISAR6 ;LOAD RELOCATION BIAS% ADD #140000,R1 ;SET TO MAP THRU APR6F" MOV (SP)+,R0 ;RESTORE BYTE OFFSET RETURN ;  .ENDC ; NDF R$$PROE;+E; **-$SWACD-SAVE MAPPING, CALL ACD00qJ1rN10DATADATADATADATADATADATADATA AS A CO-ROUTINE, THEN REMAP DRIVER 7; **-$SWAC1-CALL ACD AS A CO-ROUTINE, THEN REMAP DRIVERG;LA; THESE ROUTINES ARE CALLED BY THE FULL DUPLEX TERMINAL DRIVER TOFD; SWITCH PROCESSING TO AN ANCILLARY CONTROL DRIVER (ACD). SINCE THEH; ACD REQUIRES APRS 5 AND 6, THE DRIVER MAPPING IS FIRST SAVED (IF ENTRYC; AT $SWACD), THEN THE ACD IS CALLED AS A CO-ROUTINE VIA A DISPATCH E; TABLE CONTAINED IN THE ANCILLARY CONTROL BLOCK (ACB). WHEN THE ACDNH; ACD RETURNS, THIS ROUTINE REMAPS THE DRIVER AND RETURNS CONTROL TO IT.; ; INPUTS:D;E0; R0=DISPATCH TABLE OFFSET (IF ENTRY AT $SWACD).&; R0=ACB ADDRESS (IF ENTRY AT $SWAC1).8; R5=POINTER TO OFFSET U.TSTA WITHIN THE TERMINAL'S UCB.3; 2(SP)=DISPATCH TABLE OFFSET (IF ENTRY AT $SWAC1).E:; 4(SP)=APR5 BIAS OF TERMINAL DRIVER (IF ENTRY AT $SWAC1).;D ; OUTPUTS:;T; R0 IS DESTROYED.;- .IF DF T$$ACD6$SWACD::MOV KINAR5,-(SP) ;SAVE TERMINAL DRIVER MAPPING .IF DF K$$DAS7 MOV KDSAR5,-(SP) ;SAVE TERMINAL DRIVER D-SPACE MAPPINGD .IFTF ;K$$DAS. MOV R0,-(SP) ;PUT ENTRY POINT OFFSET ON STACK) MOV U.ACB-U.TSTA(R5),R0 ;GET ACB ADDRESSB ASSUME A.REL,0Y9$SWAC1::MOV (R0),KINAR5 ;MAP THE ANCILLARY CONTROL DRIVERI .IFT ;K$$DASP: MOV (R0),KDSAR5 ;MAP THE ANCILLARY CONTROL DRIVER D-SPACE .IFTF ;K$$DAS: ADD A.DIS(R0),(SP) ;ADD DISPATCH TABLE ADDR TO THE OFFSET, MOV @(SP),(SP) ;GET THE ENTRY POINT ADDRESS CALL @(SP)+ ;CALL THE ACDR .IFT ;K$$DASD3 MOV (SP)+,KDSAR5 ;UPON RETURN, REMAP TTDRV D-SPACEP .ENDC ;K$$DAS, MOV (SP)+,KINAR5 ;REMAP THE TERMINAL DRIVER RETURN ;AND THEN RETURN TO IT .ENDC ;T$$ACD .ENDASSUME A.REL,0Y9$SWAC1::MOV (R0),KINAR5 ;MAP THE ANCILLARY CONTROL DRIVERI .IFT ;K$$DASP: MOV (R0),KDSAR5 ;MAP THE ANCILLARY CONTROL DRIVER D-SPACE .IFTF ;K$$DAS: ADD A.DIS(R0),(SP) ;ADD DISPATCH TABLE ADDR TO THE OFFSET, MOV @(SP),(SP) ;GET THE ENTRY POINT ADDRESS CALL @(SP)+ ;CALL THE ACDR .IFT ;K$$DASD3 MOV (SP)+,KDSAR5 ;UPON RETURN, REMAP TTDRV D-SPACEP .ENDC ;K$$DAS, MOV (SP .TITLE DRCIN .IDENT /5.00/;7; COPYRIGHT (C) 1985 BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; P. WANNHEDEN 24-MAY-77 ;+ ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ;; B. S. MCCARTHY;-; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:;; B. S. MCCARTHY;; MODIFIED BY:;; J. W. BERZLE 17-OCT-85 5.00.; *; JWB167 - USE $QRMVA INSTEAD OF $QRMVT; ;B; MACRO LIBRARY CALLSR;% .MCALL HWDDF$,TCBDF$,PCBDF$,ITBDF$S' HWDDF$ ; DEFINE HARDWARE REGISTERSM ! TCBDF$ ; DEFINE TCB OFFSETS " PCBDF$ ; DEFINE PCB OFFSETS # ITBDF$ ; DEFINE ITB OFFSETS$%;+#&; **-$DRCIN-CONNECT TO INTERRUPT.E'; H(; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CONNECT A SPECIFIED INTERRUPTI); VECTOR TO AN INTERRUPT SERVICE ROUTINE (ISR) IN THE TASK'S OWN SPACE,.=*; OR TO DISCONNECT A PREVIOUSLY CONNECTED INTERRUPT VECTOR.E+; H,; IF THE FUNCTION "CONNECT" IS REQUESTED, THE OPERATION IS AS FOLLOWS:E-; A BLOCK OF DYNAMIC MEMORY IS ALLOCATED AND SET UP AS AN INTERRUPTFB.; TRANSFER BLOCK (ITB). THE ITB IS LINKED TO THE ITB LIST OF THEA/; TASK WITH LISTHEAD (SINGLE WORD) IN P.DPCB OF THE TASK'S PCB.U90; CHECKPOINTING AND SHUFFLING IS DISABLED FOR THE TASK.EA1; THE VECTOR IS SET UP TO POINT TO THE OFFSET X.JSR IN THE ITB,EB2; WHICH CONTAINS A SUBROUTINE CALL TO THE SPECIAL INTERRUPT SAVE3; ROUTINE $INTSC.E4;E?5; IF THE FUNCTION "DISCONNECT" IS REQUESTED, THE OPERATION IS ?6; ESSENTIALLY THE REVERSE OF WHAT IS DESCRIBED FOR "CONNECT".T7;S58; *************************************************N.9; * NOTE - THE DISCONNECT FUNCTION, WHEN *,:; * DISCONNECTING THE LAST VECTOR (OR *.;; * ONLY), CLEARS THE CHECKPOINT-DISABLE *2<; * BIT (PS.CHK) AND NO-SHUFFLE-BIT (PS.NSF) *1=; * REGARDLESS OF WHAT THE STATE WAS BEFORE *S1>; * VECTORS WERE CONNE00rR100eaekCTED OR ANY CHANGE IN *O.?; * STATE WHILE VECTORS WERE CONNECTED. * @; * *A; * EXCEPTIONS: */B; * 1. IF THE TASK IS NOT CHECKPOINTABLE, *R"C; * PS.CHK IS NOT CLEARED. *0D; * 2. IF THE TASK IS MARKED FOR ABORT FOR *5E; * MEMORY PARITY ERROR, PS.NSF IS NOT CLEARED. *T5F; *************************************************HG;IH; DPB FORMAT: I;I%J; WD. 00 -- DIC(129.),DPB SIZE(7.).*'K; WD. 01 -- INTERRUPT VECTOR ADDRESS.S1L; WD. 02 -- BASE ADDRESS FOR MAPPING OF ISR ANDH)M; ENABLE/DISABLE-INTERRUPT ROUTINES.EFN; WD. 03 -- ADDRESS OF INTERRUPT SERVICE ROUTINE. IF ZERO, DIRECTIVE>O; IS "DISCONNECT FROM INTERRUPTS" AND REMAINING ARGUMENTSP; ARE IGNORED. :Q; WD. 04 -- ADDRESS OF ENABLE/DISABLE-INTERRUPT ROUTINE.2R; WD. 05 -- (LOW BYTE) LOW BYTE OF PSW TO BE SETS; BEFORE CALLING ISR.%T; WD. 06 -- ADDRESS OF AST ROUTINE.U; V; INPUTS:.W; ;X; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. Y; R3=POINTER TO WD. 01 IN DPB 1Z; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.E.[; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.\; 8]; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK).^;R_; IF SUCCESSFUL COMPLETION:I `; CC-C 0a; DIRECTIVE STATUS:Eb; +1A8c; BEFORE RETURN, THE ENABLE/DISABLE-INTERRUPTS ROUTINE<d; (IF SPECIFIED) IS CALLED IN KERNEL MODE WITH CC-C CLEAR.e; f; IF DIRECTIVE IS REJECTED:U g; CC-C 1h; DIRECTIVE STATUS:A9i; D.RS1 AN ITB COULD NOT BE ALLOCATED (NO POOL SPACE). 1j; D.RS8 THE FUNCTION REQUESTED IS "DISCONNECT"R.k; AND THE TASK IS NOT OWNER OF THE VECTOR.+l; D.RS16 ISSUING TASK IS NOT PRIVILEGED.T3m; D.RS17 THE SPECIFIED VECTOR IS ALREADY IN USE. :n; D.RS19 THE SPECIFIED VECTOR IS ILLEGAL (LOWER THAN 608o; OR HIGHER THAN HIGHEST VECTOR SPECIFIED AT SYSGEN,p; OR NOT A MULTIPLE OF 4).:q; D.RS81 ISR OR ENABLE/DISABLE-INTERRUPT ROUTINE IS NOT3r; WITHIN 4K WORDS FROM (BASE ADDRESS & 177700).1s;-tu .IF DF C$$INTv w .ENABL LSB x y$DRCIN::.z BIT #T3.PRV,T.ST3(R5) ; IS TASK PRIVILEGED?{ BEQ 95$ ; N - ILLEGAL, JUMPO|}~ .IF DF M$$PROD BIT $CPBIT,T.RRM(R5) ;DOES TASK HAVE AFFINITY FOR THIS PROCESSOR? BEQ 100$ ;NO IF EQ .ENDC$ MOV (R3)+,R4 ; GET VECTOR ADDRESS BIT #3,R4 ; MULTIPLE OF 4?& BNE 60$ ; N - ILLEGAL VECTOR, JUMP! CMP R4,#60 ; VECTOR IN RANGE?E BLO 60$ ; N - JUMP CMP R4,#V$$CTR  BHIS 60$ ; N - JUMP0" MOV (R3)+,R0 ; GET BASE ADDRESS$ MOV (R3)+,-(SP) ; GET ISR ADDRESS% BEQ 40$ ; ZERO - DISCONNECT, JUMPE;; DIRECTIVE IS "CONNECT"; .IF DF E$$LOG&E$$NSI! CMP @R4,#$NS0 ; VECTOR IN USE?F BLO 70$ ; Y - ILLEGAL, JUMPQ CMP @R4,#$NS7 BHI 70$ ; Y - ILLEGAL, JUMP+ .IFF ; DF E$$LOG&E$$NSI$ CMP @R4,#$NONSI ; VECTOR IN USE ? BNE 70$ ; Y - ILLEGAL, JUMP, .ENDC ; DF E$$LOG&E$$NSI63 BIC #77,R0 ; CLEAR LOWER 6 BITS IN BASE ADDRESSM .IF DF U$$DAS+ CALL $RELUI ; RELOCATE TO APR 6 ADDRESSD .IFF ; DF U$$DAS+ CALL $RELOC ; RELOCATE TO APR 6 ADDRESSC .ENDC ; DF U$$DAS, SUB #20000,R2 ; RELOCATE TO APR 5 ADDRESS! BCS 90$ ; OUT OF RANGE - JUMPQ6 SUB R0,@SP ; GET DISPLACEMENT FROM "BASE" TO "ISR"" CMP @SP,#20000 ; .GT. 4K WORDS? BHIS 90$ ; Y - ILLEGAL, JUMP6 MOV (R3)+,-(SP) ; GET ENB./DIS.INT. ROUTINE ADDRESS$ BEQ 10$ ; NO SUCH ROUTINE - JUMP+ SUB R0,@SP ; GET DISPLACEMENT FROM BASED! BCS 90$ ; OUT OF RANGE - JUMPO" CMP @SP,#20000 ; .GT. 4K WORDS? BHIS 90$ ; Y - ILLEGAL, JUMP% ADD R2,@SP ; MAKE APR 5 ADDRESSESN10$: ADD R2,2(SP)" MOV R1,-(SP) ; SAVE APR 5 VALUE+ MOV #X.LEN,R1 ; GET SIZE OF ITB IN BYTES .IF DF K$$DAS MOV #$ICAVL-2,R0"0 CALL $ALOC1 ; ALLOCATE ITB FROM ICB/ITB POOL .IFFL! CALL $ALOCB ; ALLOCATE AN ITBB .ENDC BCS 80$ ; FAILURE - JUMP$ MOV T.PCB(R5),R1 ; GET TASK'S PCB1 ADD #P.STAT,R1 ; POINT TO STATUS WORD (P.STAT)E, BIT #PS.CHK00rZ1N10DATADATADATADATADATADATADATA,@R1 ; CHECKPOINTING DISABLED? BNE 20$ ; Y - JUMP BIS #PS.CHK,@R1 ; N - DO IT2 CLR P.DPCB-P.STAT(R1) ; INITIALIZE ITB LISTHEAD*20$: BIS #PS.NSF,@R1 ; DISABLE SHUFFLING ASSUME P.DPCB,P.STAT-4 TST -(R1)> MOV -(R1),@R0 ; ADD ITB TO FRONT OF ITB LIST IN PCB (X.LNK) MOV R0,@R1L* TST (R0)+ ; STEP PAST LINK WORD IN ITB* MOV R0,R1 ; SAVE INTERRUPT ENTRY POINT. MOV #4537,(R0)+ ; "JSR R5,@#$INTSC" (X.JSR) MOV #$INTSC,(R0)+ ; (X.JSR+2). MOV (R3)+,@R0 ; PSW AND UNUSED BYTE (X.PSW). ADD #X.REL-X.PSW,R0 ; POINT TO X.REL IN ITB. MOV (SP)+,(R0)+ ; STORE APR 5 VALUE (X.REL)@ MOV (SP)+,(R0)+ ; STORE ENB./DIS.INT. ROUTINE ADDRESS (X.DSI)+ MOV R5,(R0)+ ; STORE TCB ADDRESS (X.TCB)T< MOV (SP)+,X.ISR-(R0) ; STORE ISR ADDRESS (X.ISR)= CLR X.FORK+2-(R0) ; CLEAR FORK PC WORD (X.FORK+2)N9 MOV #$DQAC,(R0)+ ; STORE ADDRESS OF ROUTINE TO DEQUEUE5" ; AST BLOCK QUEUED BY $QASTC/ TST (R0)+ ; STEP PAST AST QUEUE THREAD WORD@* MOV PC,(R0)+ ; SET NON-ZERO TO INDICATE ; AST BLOCK FREE (A.CBL)> MOV #7*2+2,(R0)+ ; NUMBER OF WORDS TO ALLOCATE ON AST STACK ; (A.BYT)E& MOV @R3,(R0)+ ; AST ADDRESS (A.AST)6 MOV #1,(R0)+ ; NUMBER OF AST PARAMETERS = 1 (A.NPR)8 MOV R4,(R0)+ ; AST PARAMETER = VECTOR ADDRESS (X.VEC)( MOV @R4,@R0 ; SAVE VECTOR PC (X.VPC)+ MOV R1,@R4 ; SET VECTOR TO POINT TO ITBR6 TST -(R1) ; BACK UP TO START OF ITB AND CLEAR CC-C2 CALLR $CLEDR ;CALL USER ENABLE/DISABLE ROUTINE ; R1 = POINTER TO ITBO& ; CC-C = 0 TO ENABLE INTERRUPTS,& ; = 1 TO DISABLE INTERRUPTS;O;O; DIRECTIVE IS "DISCONNECT" ;T'40$: MOV @R4,R1 ; GET PC FROM VECTOR)+ SUB #X.JSR,R1 ; GET START OF ITB (X.LNK)= MOV T.PCB(R5),R0 ; GET PCBS3 BIT #PS.CHK,P.STAT(R0) ; CHECKPOINTING DISABLED? * BEQ 100$ ; N - TASK HAS NO ITB'S, JUMP4 CALL $DISIN ; DISABLE INTERRUPTS, DEALLOCATE THE ; ITB ETCETERA9 BCS 100$ ; ERROR (TASK IS NOT OWNER OF VECTOR) - JUMP DRSTS +1 ; EXIT WITH SUCCESS%60$: DRSTS D.RS19 ; ILLEGAL VECTOR ,70$: DRSTS D.RS17 ; VECTOR ALREADY IN USE#80$: DRSTS D.RS1 ; NO POOL SPACE?90$: DRSTS D.RS81 ; ISR OR ENB./DIS.INT. ROUTINE ADDRESS NOTA2 ; WITHIN RANGE (BASE&177700, BASE&177700+4K)*95$: DRSTS D.RS16 ; PRIVILEGE VIOLATION?100$: DRSTS D.RS8 ; DISCONNECT - TASK IS NOT OWNER OF VECTORS; ;L;+* ; **-$DISIN-DISCONNECT INTERRUPT VECTOR. ;B ; INPUT: ; R1 POINTER TO ITB  ; R5 POINTER TO TASK TCB;; ; OUTPUT:C; IF SUCCESS:D ; CC-C 0+; THE FOLLOWING OPERATIONS ARE PERFORMED:C4; 1. THE ITB IS REMOVED FROM THE ITB LIST STARTING#; IN P.DPCB OF THE TASK'S PCB..;; 2. IF A USER ROUTINE TO DISABLE INTERRUPTS WAS SUPPLIED7?; WHEN THE VECTOR WAS CONNECTED TO, THAT ROUTINE IS CALLED$; IN KERNEL MODE WITH CC-C SET.H; 3. VECTOR PC IS RESTORED TO POINT TO THE NONSENSE INTERRUPT ROUTINE.<; 4. IF THE FORK BLOCK OF THE ITB IS IN THE FORK QUEUE, IT; IS REMOVED.D; 5. IF THE AST BLOCK OF THE ITB IS IN THE AST QUEUE FOR THE TASK,; IT IS REMOVED.M9; 6. IF THIS WAS THE ONLY VECTOR CONNECTED TO THE TASK,@; AND THE TASK IS CHECKPOINTABLE, CHECKPOINTING IS ENABLED.B; ALSO, UNLESS THE TASK IS MARKED FOR ABORT FOR MEMORY PARITY# ; ERROR, SHUFFLING IS ENABLED. '!; 7. FINALLY, THE ITB IS DEALLOCATED.C";C+#; IF ERROR (TASK IS NOT OWNER OF VECTOR):P $; CC-C 1%;."&; REGISTERS ALTERED: R0,R1,R2,R3';-(;E);T$*$DISIN::MOV T.PCB(R5),R0 ; GET PCB2+ ADD #P.DPCB,R0 ; POINT TO ITB LISTHEAD (P.DPCB)1, MOV 2(R0),-(SP) ; SAVE WORD FOLLOWING LISTHEADL1, CALL $QRMVA ; REMOVE FROM ITB LIST ;JWB167S;. MOV (SP)+,2(R0) ; RESTORE WORD FOLLOWING LISTHEAD ;**-1U0/ BCS 130$ ; ITB NOT IN LIST - EXIT WITH ERROR.0 MOV R0,-(SP) ; SAVE POINTER TO ITB LISTHEAD1 SEC82 CALL $CLEDR ;CALL USER ROUTINE TO DISABLE INTERRUPTS3 ; WITH CC-C SET/4 MOV X.VPC(R1),@X.VEC(R1) ; RESTORE VECTOR PC3.5 ADD #X.FORK,R1 ; POINT AT FORK BLOCK IN ITB%6 M00rb1se10eaekOV #$FRKHD,R0 ; GET FORK LISTHEADI"7 MTPS #PR7 ; DISABLE INTERRUPTS@7 CALL $QRMVA ;;; REMOVE FROM FORK LIST IF IT IS THERE ;JWB167*9 MTPS #0 ;;; ENABLE INTERRUPTS ;**-13: ADD #X.AST-X.FORK,R1 ; POINT AT AST BLOCK IN ITB ; MOV R5,R0)< ADD #T.ASTL,R0 ; GET AST LIST LISTHEADA>< CALL $QRMVA ; REMOVE FROM AST LIST IF IT IS THERE ;JWB167/> SUB #X.AST,R1 ; RESTORE ITB POINTER ;**-1E%? MOV R1,R0 ; GET ITB POINTER IN R0R1@ MOV (SP)+,R1 ; RESTORE POINTER TO ITB LISTHEADC#A TST (R1)+ ; ITB LIST NOW EMPTY?KB BNE 120$ ; N - JUMP C ASSUME P.STAT,P.DPCB+4LD TST (R1)+ ; POINT TO P.STATS4E MOV T.ST2(R5),R2 ; Y - GET STATUS WORD 2 FROM TCB(F BIT #T2.CHK,R2 ; TASK CHECKPOINTABLE?G BNE 105$ ; N - JUMP )H BIC #PS.CHK,@R1 ; ENABLE CHECKPOINTING I105$: ASSUME T2.ABO,100M$J ROLB R2 ; TASK MARKED FOR ABORT?K BPL 110$ ; N - JUMPS>L CMP T.EFLG(R5),#S.PRTY ; Y - IS REASON MEMORY PARITY ERROR?(M BEQ 120$ ; Y - DON'T MAKE SHUFFLABLE*N110$: BIC #PS.NSF,@R1 ; ENABLE SHUFFLING)O120$: MOV #X.LEN,R1 ; GET LENGTH OF ITBPQ .IF DF K$$DASRS MOV #$ICAVL-2,R3N.T CALL $DEAC1 ; DEALLOCATE FROM ICB/ITB POOLUV .IFFMW X CALL $DEACB ; DEALLOCATE ITBYZ .ENDC[\ CLC ; SUCCESS]130$: RETURN^ _ .DSABL LSBT`a .ENDCbcd .ENDM$J ROLB R2 ; TASK MARKED FOR ABORT?K BPL 110$ ; N - JUMPS>L CMP T.EFLG(R5),#S.PRTY ; Y - IS REASON MEMORY PARITY ERROR?(M BEQ 120$ ; Y - DON'T MAKE SHUFFLABLE*N110$: BIC #PS.NSF,@R1 ; ENABLE S .TITLE VIDSUB .IDENT /01/;; COPYRIGHT (C) 1982; ALL RIGHTS RESERVED/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;?; THIS SOFTWARE IS FURNISHED UNDER LICENSE AND MAY ONLY BE USED6; OR COPIED ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 01;; T. LEKAS 7-FEB-82;; MODIFIED BY:; .MCALL DCBDF$ DCBDF$;;+9; EXEC SUBROUTINES FOR THE USE OF THE VIDEO FIRMWARE TASK!; WHILE IT IS MAPPED TO THE EXEC.;-; .IF DF D$$C11;;+@; N$DRIN - NOTIFY THE TERMINAL DRIVER THAT THERE IS INPUT FOR IT;9 ; INPUTS:I; NONE;E ; OUTPUTS:;; THE TERMINAL DRIVER CT INPUT ROUTINE IS MAPPED AND CALLED ;F; REGISTERS MODIFIED:A; NONE;-;E5 .IIF DF,K$$DAS,.ERROR ;THIS MUST BE A NON I/D SYSTEM.3; THIS CODE ALSO ASSUMES THAT THE TTDRV IS LOADABLEI; NOTE:;7; WHEN WE FIGURE OUT WHAT REALLY NEEDS TO BE SAVED THISF/; CAN BE CLEANED UP AND PROBABLY GENERERALIZED.T; .ENABL LSBX)N$DRIN::JSR R5,SAVER ;SAVE THE REGISTERS$ MOV @#KINAR5,-(SP) ;SAVE APR 5 MOV @#KINAR6,-(SP) ;SAVE APR 6+ MOV #.CTDCB,R0 ;GET THE TTDRV DCB ADDRESSN/ MOV D.PCB(R0),R1 ;GET THE DRIVERS PCB ADDRESS> MOV P.REL(R1),@#KINAR5 ;MAP KERNEL INSTRUCTION APR5 TO DRIVER8 MOV D.DSP(R0),R0 ;GET ADDRESS OF DRIVER DISPATCH TABLE0 CALL @D.VTIN(R0) ;CALL DRIVER CT INPUT ROUTINE BR 10$ ;CLEANUP AND EXIT ;Y;+:; N$DROU - NOTIFY THE TERMINAL DRIVER OF OUTPUT COMPLETION;L ; INPUTS:; NONE;S ; OUTPUTS:G; THE TERMINAL DRIVER CT OUTPUT COMPLETION ROUTINE IS MAPPED AND CALLEDM;@; REGISTERS MODIFIED:R; NONE;-;R)N$DROU::JSR R5,SAVER ;SAVE THE REGISTERS) MOV @#KINAR5,-(SP) ;SAVE APR 5 MOV @#KINAR6,-(SP) ;SAVE APR 6+ MOV #.CTDCB,R0 ;GET THE TTDRV DCB ADDRESS)/ MOV D.PCB(R0),R1 ;GET THE DRIVERS PCB ADDRESS > MOV P.REL(R1),@#KINAR5 ;MAP KERNEL INSTRUCTION APR5 TO DRIVER8 MOV D.DSP(R0),R0 ;GET ADDRESS OF DRIVER DISPATCH TABLE0 CALL @D.VTOU(R0) ;CALL DRIVER CT INPUT ROUTINE'10$: MOV (SP)+,@#KINAR6 ;RESTORE APR 6U# MOV (SP)+,@#KINAR5 ;RESTORE APR 5L8; SET THE PRIORITY TO ZERO IF IT ISN'T ALREADY THERE NOW(; CHECK TO SEE IF THIS IS REALLY NEEDED MTPS #0 ; RETURN ;AND EXIT;,; SAVER - SAVE REGISTERS;D); THIS ROUTINE IS A CO-ROUTINE THAT SAVESP$; AND RESTORES REGISTERS R0 THRU R5.;SAVER: MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 MOV R4,-(SP) ;SAVE R4! MOV R5,-(SP) ;SET RETURN ADDRESSR MOV 14(SP),R5 ;RESTORE R5 CALL @(SP)+ ;CALL THE CALLER00sj1tk1l1DATADATADATADATADATADATADATA MOV (SP)+,R4 ;RESTORE R4 MOV (SP)+,R3 ;RESTORE R3O MOV (SP)+,R2 ;RESTORE R2N MOV (SP)+,R1 ;RESTORE R1  MOV (SP)+,R0 ;RESTORE R00 MOV (SP)+,R5 ;RESTORE R5$ RETURN ;RETURN TO ORIGINAL CALLER .ENDC ;D$$C11 .ENDEHAT SAVESP$; AND RESTORES REGISTERS R0 THRU R5.;SAVER: MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 MOV R4,-(SP) ;SAVE R4! MOV R5,-(SP) ;SET RETURN ADDRESSR MOV 14(SP),R5 ;RESTORE R5 CALL @(SP)+ ;CALL THE CALLER9 .IIF DF,T$$APE $IDENT MUDRV,02,26, 9 .IIF DF,D$$DSK $IDENT DUDRV,02,26,C;K;=; COPYRIGHT (c) 1985, 1987 BY DIGITAL EQUIPMENT CORPORATIONK; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;T ;R ; MODIFIED BY: ;S ; J. W. BERZLE 20-SEP-85 2.00+ ; JWB165 -- REMOVE LOCAL $QRMVA ROUTINE ;=! ; P. K. M. WEISS 8-OCT-85 2|,&&ZV r[q$V B  ^SYSYSYSYTICLSYOVPγ(x(xB b DRDRDRDRTICLDRDB&m,γP>5γP@0(FILE.DATP@P@ FILE.DATPP RMSCNV.LISPhP RMSCNV.CMDP2PTLFILE.DATP4PtFILE.ERR,ww$ww0w4w8w<whlw| CNVCTL. 0 t_ T 8N :D50 T @;5 "4 D15 > 00r1e10eaekB  Z D X 2 >5 h 5@ b L5  4 ( & TI:TI:@ D H L P T X _ CNV> 5~!@wn5lew&f5T       e Pe 2 5 7  &f 7 7  Rw jwxwwwtww\ww@&ff w f f   wF&f Bf f  j7fe? ww xre? & fY w R 4w`0 P 5d i5VH  (-7   v nwR4 NJC3 3  ,, UEs3w&fz B * ͋'% ͥ!ͥE%,  D5  PB2 %pċ5J J J @ EͥAA I  P '&1  LT ^T pT p p$ p T \ T T T v " 6  4 T P |t t l d$ \6 T6 L6x D6 <6 46 ,6 $6 6 6Z Z" ~05ew , Bv    5Bw 5  (5(UW       wE5 E  W ͇5  ,E   ^ &wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E Uw eE D` bl lrw \  B eE"s    s-  Csl&f &ff r[qr[q   v   r@(IqM@IqM@IqM,U(U@TLH TD:^T:p:dT:T :3T:N`T0:xT:xT$:xT:#$T:6&(Y*,$!,O:-T:L10Z,Mq10$HlBt30H~Fw60HZPs8"~XR;"~."="~2"?"~/"@"<~0"B"(~1"D"\~4"F"4~ 5"H"h~26"J"~D7"L"~V"N"x~h"P"0~z"R"~"T"~"V"H~"X"~"Z" ~W[&:U,^^^^^^^z00z1k1l1DATADATADATADATADATADATADATA CNVCMD F  7,w,=w=wt=wl,-xUhW UU./   f wwUwt5  lj׭Rw22 ff e / ff e% ww,2ff \eE wwm-w,%7  5p 3wB  ŀ"D az    0 ( P@;w5wmȕ 51 2 5(,ff ze  ff `eUwp vwdwJzFwpjdȕ UT7 V7 TH @E:D <42 $" wjm  Ҕ Ҕ 7w     w 5 ( $ ($) " " zL" CNVPARFD<W (W , 360  7 =% " ^   " ?U w7~ *+DOFNM&fBj !v "fv   F &P    +DOSWI =/  0ALAPBL@CA@EOER@FOHEID IEIM@KNKRLOMAML@PD`PD@RMSL@SS SU@TRWF +ONESWD \/Y  fd"e ]"<L:\5: 757&f5  =5 5 \  5  e ,  $     '@7HELP Pl Hl @l 8l 0l (l* l l| ll l l lV! l ll! CNVCAT5ti NH(D,,((, :5@D""ff e5  2 5@5  :@5 f ff e5C D  2 C C C CCC$$C..C D" 2" C00 C11 bCNVINI78  5*-SYTI CNVVAL 828<e5@Uz H >50` *-  7 7 @@@@@ C@ &CNVWWW   l)&f&?7@,|747,7R  2 n T $eE 7phfb\  P%R> XZ PD# H" @" 8L" CNVHLP5 t&5h   s8 @ r RMS-11 Convert Utility Purpose: To convert files from one organization to another. Command syntax: outfile[/switches...]=infile[/switches...] Switches (all are global): /AP - append SEQ output /BL[:value] - tape output blocksize /CA[:filespec] - copy file attributes /EO - change end-of-file format /ER[:filespec] - produce exception records /FO:org - define output file 001e10eaekorganization /ID - display CNV version /IM - copy files in IMAGE (block) mode /KN:keyname - read file based on key name /KR:value - read file based on key number /LO - honor indexed fill factor /MA - load using indexed mass insert /ML:value - set memory limitation for buffers /PD[:value] - pad 'short' records [with this byte] /SL[:filespec] - produce a summary listing /SU - supercede output SEQ file /TR - truncate 'long' records /WF - read and write VFC fixed headersw CNVOPN5nwz5@`"!"!5 %U5@ % Uw(,   w  (|,5& 5..ff e B whf 25 8 V-P F50   00 %p wu ~  i5Gh(*-|,  l ff e Ej< Lff e h'  P 77 f5 ff e (,/  ( ff e  2502w3   PZR H" @" 8" CNVSL15t  8<55ff e eP/$' 7@S"u@ @3JhRMS-11 Convert -- Version 2.0 Summary Listing Options in effect: Append sequential output (AP) Set magtape blocksize (BL) Create copying attribute data (CA) Interpret embedded Control/Z EOF (EO) Produce exception records (ER) Ignore certain errors (IE) Copy files using image mode (IM) Select key by name (KN) Select key by number (KR) Honor index fill factors (LO) Use indexed mass insert (MA) Buffer limit specified (ML) Pad 'short' records (PD) Enable /PD:0/TR (SS) Supercede output (SU) Truncate 'long' records (TR) Process VFC headers (WF) CNVSL25tQ&&& ff e 7 l&&& ff e  0ff |e  !2 x h6<  E%N&w%Y  " d7 7"zw`7wPr2 2 1 1ҋ5w  Ezw%j7fw%%T 7J7F2Dx W tev&f Br u ff e5uff e w&f  ~ B ȕ? $w 3g w 5Mw 6;4/Record out of sequence%IDuplicate key where not allowed%IRecord too short for primary key%IRecord too long for bucketsize%IRecord doesn't fit fixed length%IRecord too long for maximum record size%IRecord contains an illegal data type%IException record: %I, truncated%I, non-printing%I000:&f& v  CNVCPYP ff e  %L 2 Jew @AB"  t 5,  t 5(  lff 4e  R  ejw d %jfd\5" 5u"5$ m m  &DC`ӝ  D# " " CNVEOF P5&u(ff Be%  BC eRw LmnA )B &fmN Ez*   ̋ (&ff je \A` ff >e C  @& A(~   -f 5%& 5`&u ( L@m<&u (ff e    &VP5&u(ff pe  BD` 001k1l1DATADATADATADATADATADATADATA CNVIMG P5&u(ff Be%+ *elw fB5&u(|ff e  e2w ,mJA *** Block copies in %D unitsReading block %T--- %D bytes read*** Odd address trap*** Memory protection violation*** Breakpoint or T-bit trap?RMS-F-ER$LIB, Error mapping RMS resident library*** IOT instruction trap*** Reserved instruction trap*** Non-RSX EMT*** Your 11/40 FPU is acting up*** Call/Jump through address 0*** Stack limit exceeded&T1e&i+&#"&& &&&_ 5& & i&?& & iw U efы  2 r  wP2ht%NRegisters:%N R0=%P R1=%P R2=%P R3=%P R4=%P R5=%P%N SP=%P PC=%P PS=%P%N%NTrace Control:%N T$CBIT=%P T$STAK=%P T$BASE=%P T$LAST=%P T$MODE=%P%N TR$REM=%P*%N%NRMS Structures: %P/ (FAB) SID=%P IFI=%P STS=%P STV=%P%N%18SFile=%VA %P/ (RAB) SID=%P ISI=%P STS=%P STV=%P%NMemory Control:%N GSABAS=%P GSAMIN=%P GSAREQ=%P GSAPLH=(%P,%P)%NPool Management (Detail): %P/ %P %P (%D. bytes)%NModule Trace: %P (%VA) R0=%P R1=%P R2=%P R3=%P R4=%P R5=%P%N%21SSP=%P EP=%P RA=%P DS=%P%NCurrent stack: %P/ %P %P %P %P %P %P %P %P *** Odd address in list, section terminated *** *** Stack value corrupt, resetting to 002000 *** *** Link to oblivion, section terminated ***   2 J D  : v v    Z PH"1"$i  ,"E"" & `    52 &  45 ee   & h Z Pm F5- .E ~& 7  : w  : D#e?E? & f Y CNVRXBf%P    Ae f f   Af B 5  zCNVXAB     &ȕ 0 5 vf  f5 # X ^`55ȕ80 e8p     655ȕ0  Au   5 ff Re% %H%f5 ff eff e@( 00 0 0 0 fee"  @ 0 0 0 0 0 &A!?!eE !&!  m  b w X ť ť 0B >Aa GETSTR&f "D  /=  /&6m"W"    P   GETNUM&f#  GETOCT&f#  &6E=/ W! W! ePEJwFefw@aw6^W!]7*&f A OL L7wE E7w> >7w7w45 3W!0&&f A h"I 001e10eaekR S  7wfEB`F ~ . ӥ:  ӥ:@! $  @! U`eUU5U mɥ[ɥ<"@  ˥.   z0Q UDeĤ _ Uċ5E  lU0 E pU5 . 5E0 U L. x; n Ċ- bU " & N ӥ"   U5CM% E A5Q`C _C&  p2 && ˥A˥Z˥a˥z ˥*˥% ˥$˥_  ˥0 ˥9 ˥7 U   ˋ˥ ˥ &  m  f A N  %&f&f &ADw&{E$@& 7 w,w( 77 7 J!p J! 8ww`!#%')+-/13 4 1 . + ( r% "           F   P   &    &fe  &fr JwH 5h (uff e  鯇  驇 f I WFw 0w* (2 ` 0P D# " $ h$ x" p" h" `" X" P" H " @2" 8D" 0V" (h" z" " " " w  ť ť 0B ^Aaw N' UD$BA &( U BQ lЕ*  & & @( f  e ee e ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw N&& D¥%  B&ХVA C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& e/& e *AHŀ ȕ Е Е Е & eb & eNЕ A %& e"A Е A bEA EЕ A A   $Е.  AЕ;    w dD&& bЕ- eaePPPЕ-$w 4D  &Е. ce $ Е:   B 5 ߥ& *  + 23E Ew 념   Е-   0@A W e`fÊ    E &   `@ ` B   & A @    &  m  f A N  %"8"x"""#L### $ ]$@?%R-F-TPM, Switch /TR or /PD or both required for this CONVERT?%R-F-ER$XTR, File string %VA contains extraneous characters"8"v"""#p`#`|#P#@#8-$>?%R-F-ER$CHK, Bucket header check error; file %VA is corrupt??%R-F-ER$CLS, CLOSE file processor error on file %VA, code=%P9?%R-F-ER$COD, Invalid XAB present for file %VA, code=%P0?%R-F-ER$CRE, Error creating file %VA, code=%PB?%R-F-ER$CUR, Improper record context for operation for file %VA?%R-F-ER$DAC, Unused error:?%R-F-ER$DAN, Undefined data area reference for file %VA:?%R-F-ER$DEL, Referenced record was deleted for file %VA=?%R-F-ER$DEV, Bad or inappropriate device type for file %VA:?%R-F-ER$DFW, Deferred write error for file %VA, code=%Pn$)$*$+$, %-?%R-F-TNF, No EOF (Control/Z) found in file;%%R-I-EOE, EOF (Control/Z) established at VBN %T, byte %D!%%R-W-EXC, Exception record: %I%%R-I-REC, %VA" 8" {" ""#(#G#o###C?%R-F-ILO, Illegal use of /KN, /KR, or /LO with file organization*?%R-F-RAM, Required argument missing %VA%?%R-F-ANA, Argument not allowed %VA7?%R-F-LSW, Illogical switch in context of command %VA'?%R-F-ISP, Illegal argument value %VA?%R-F-ISS, Invalid switch %VA(?%R-F-COR, Not enough memory available?%R-F-RCR, Release core error'?%R-F-IOR, I/O error on command inputF?%R-W-FQL, Output indexed file fill quantities will not be preserved"8"h""""##\### $0?%R-F-MDE, Command file nesting depth exceededW?%R-F-MLE, Block value of /ML switch exceeds limit or available memory for image copy?%R-F-CSE, Syntax error %VA"?%R-F-MMQ, Mismatched quotes %VA%?%R-F-UIF, Utility internal fault%N9?%R-F-ACE, Error accessing file %VA, directive error %P:?%R-F-APR, File %VA is not empty, /AP switch is requiredJ?%R-F-FTL, Fatal RMS error; PC=%P, STS=%P, STV=%P,%N file %VA-?%R-F-ISS, Illegal switch specified - '%VA'5?%R-F-IFL, Incorrect file organization for file %VA"8" f"!"""##$O#%#&#'#(#.?%R-F-CSW, Conflicting switch specified- %VAA?%R-F-SSO, Illegal use of /EO with organiztion or record format.?%R-F-IKR, Invalid /KN or /KR argument value0%%R-I-IKY, Input key of reference is #%M (%VA)J?%R-F-VFC, Input and output fixed control header sizes do not correspond2?%R-F-IWF, Illegal use of /WF with record format9?%R-F-ONE, Output RELATIVE or INDEXED file is not empty%%R-I-ID, Version 2.004(?%R-F-ISP, Illegal argument value- %VA3?%R-F-ONA, Too many files specified for operation001e10eaek"8"T"p"`"P"@>#0}# ##1$?%R-F-ER$STK, Unused error?%R-F-ER$SEQ, Record not in proper key sequence for file %VAC?%R-F-ER$SHR, Illegal file sharing options specified for file %VA7?%R-F-ER$SIZ, Invalid key size specified for file %VA"8"n"""#pE#`w#P#@#07$6?%R-F-ER$RAT, Invalid record attributes for file %VA:?%R-F-ER$RBF, Invalid record buffer address for file %VA/?%R-F-ER$RER, Read error on file %VA, code=%P;?%R-F-ER$REX, Relative record already exists for file %VA3?%R-F-ER$RFA, Illegal RFA referenced for file %VA2?%R-F-ER$RFM, Illegal record format for file %VAD?%R-F-ER$RLK, Record locked by another stream or user for file %VAA?%R-F-ER$RMV, REMOVE file processor error for file %VA, code=%P;?%R-F-ER$RNF, Record does not exist for file %VA, code=%P8?%R-F-ER$RNL, Record not locked by stream for file %VA"`<"Po"@"0" #C####*$V$3?%R-F-ER$NPK, No primary key defined for file %VA??%R-F-ER$OPN, OPEN file processor error for file %VA, code=%P1?%R-F-ER$ORD, Illegal XAB ordering for file %VA1?%R-F-ER$ORG, Illegal organization for file %VA3?%R-F-ER$PLG, Error reading prologue for file %VA@?%R-F-ER$PLV, File prologue version for file %VA not supported;?%R-F-ER$POS, Key position not within record for file %VA=?%R-F-ER$PRM, Illegal date information present for file %VA/?%R-F-ER$PRV, Privilege violation on file %VA,?%R-F-ER$RAB, Not a valid RAB for file %VA?%R-F-ER$LCH, Invalid logical channel specified dor file %VA9?%R-F-ER$LEX, File extension not necessary for file %VA8?%R-F-ER$LOC, Invalid placement specified for file %VA>?%R-F-ER$MEM, String buffer spans memory limits for file %VA?%R-F-ER$MAP, Unused error@?%R-F-ER$MKD, ERASE file processor error for file %VA, code=%PF?%R-F-ER$MRN, Maximum record number invalid or exceeded for file %VAB?%R-F-ER$MRS, Illegal maximum record size specified for file %VA?%R-F-ER$ATW, Error writing attributes for file %VA, code=%P/?%R-F-ER$BKS, Illegal bucketsize for file %VA4?%R-F-ER$BKZ, Illegal area bucketsize for file %VA?%R-F-ER$BLN, Unused error7?%R-F-ER$BOF, Beginning-of-file detected for file %VA8?%R-F-ER$BPA, Illegal buffer pool address for file %VA5?%R-F-ER$BPS, Illegal buffer pool size for file %VA;?%R-F-ER$BUG, Internal RMS-11 error detected for file %VA;?%R-F-ER$CCR, Multistream access not allowed for file %VA@?%R-F-ER$CHG, Illegal record key change attempted for file %VA"8"T""""#X##p#`#?%R-F-ER$ABO, Unused error1?%R-F-ER$ACC, Access error on file %VA, code=%P9?%R-F-ER$ACT, Activity precludes operation for file %VA,?%R-F-ER$AID, Invalid area ID for file %VA4?%R-F-ER$ALN, Alignment options error for file %VA:?%R-F-ER$ALQ, Allocation quantity too large for file %VA?%R-F-ER$ATR, Error reading attributes for file %VA, code=%P CCNMA$&fC&  x R3s3 CCNMD$&fC&     3 3 CCNMT$&fC&  eEBN`  @`㳐  >CCNME$&f@&wn7 h7bw,Zw(V|,?1?1Ur[q$U4001k1l1DATADATADATADATADATADATADATASYSYSYSYTICLSYOVN(k(k^.,,,,V,j,,, ?1Dp1 N@e?E? & f Yi*w fe 5teB e:   @ @ C: `UC B d V`ef @  d .    ;a @  W f Е- eePPPЕ- 2Е 50e %< f< f @ (Օ: 5Օ: @e Ve0e0U&@  %0 AUUUU    T T T T ee(e(e(e(T $)T T TU U U U  &f!  E D  E E C B Ί A B@    e  T T T T H1CdT T L $)dL t dL d  JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC&  m %VPVPSY:CMI.CMDCMI >P"@-P 01&  P4P/w ' UD$BA &( U BQ `Е*  w ~ ť ť 0B Aa & & @( hf  e ee e <w. &f& v TI0:RMSDSP.LIS&f  ffT  5ff e f & & &  &f& & & Ε  5(& | f f & & &  &f& & & Ε  &f w   wt&f 1e? ww & fYw  nw`j  5(1A ? 00110eaekSY:*.*;SY:eE  &  m  bABDEFIMNOPQRSTUXYZ<>=MXd^)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA C ed!  aeNb A  Е%̥V P Е Bf  & eB& e;& e6Hŀ ȕ  nЕ Ћ  Е Е & eL & e8Е A %& e A  Е Е A A   $Е.  AЕ;     A &EA  HE 6Dw D&& bЕ- eaePPPЕ-$w D  &Е. ce  Е:   B lw4 rC3 3  ,, UEs3w$l&f B * ͋'% ͥ!ͥE%,  K5  PB2 %pˋ5J J J @ EͥAA I& TI& TI d.b $*& C##7 $7 7  7   05 5    !& x ee V JeX 8eX && & &  th& & & Ε  ,7 z7r  DSP>%DSP-I-ID, RMSDSP Version 2.101 (February, 1984) Copyright (c) 1983, 1984, Digital Equipment Corporation'&1 <B 4 ,( $b" |  ( ,*5ew , Bv    5Bw 5  (5(UW       wE5 E  W ͇5  ,E 0L@&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U 5 ߥ& *  + 23E Ew 8   Е-   0@A DW e`fÊ    E &  m  f A N  %w eE D` bl lrw \  B eE"s    s-  Csl&f &   `@ ` B   & A @    &ff r[qr[q(v 001k1l1DATADATADATADATADATADATADATAFB0r@T0xIqM@BfIqM@BTIqM0BU(U,1ul3E,:d0qQ #  #0 # $ #E'*h>t""(+L,Pe*+,br.+,>s1(1U,BL." & & & & f& & & Ε : x!U!^+# RMS-11 Version 2.100 Display Utility Purpose: To display one of the following: 1. The attributes of a sequential, relative, or indexed file 2. The attributes of a disk-based backup file created by RMSBCK 3. The names and attributes of files stored within a tape-based backup container file Command syntax: [outfile[/option(s)]]=infile[/option(s)][,infile[/option(s)]] Options: /APpend - append output to an existing file /BP - process input files as container files created by RMSBCK /BRief - produce output in BRIEF format /FUll - produce output including area and key information (indexed files only) /SUpercede - supercede the existing output file File specifications are in standard format: device:[directory]filename.type;version Wildcard characters such as '*' or '%' are valid in the directory, filename, type, and/or version fields ,w0wwHw8www&&  ŀ  Ћ "D az  w z0 00 ppM $w`w \    .%w0"0 ep" lp0  *" ` D `WaWz 0,wɥ;&ww%7   Hw ŀ&  Հ &^&` `^V `W-ŀ `w4wrw  ɥ@0 p @ @  ^ 0 00w&^&` `^w T-00 00000Uj0 0000% w v \" h0 U%  eE 4`0  (e)Ej0`0^ 0n5j ^h h U% e)0)f & 2נ/נ נ   נ נ RՀC7 P&fw:6 7 .7,0 @,q `-KacJE[ !m@  ) L R  7 f@  &  5]U Ev :j&@E A VN ̆  E vE c  @  . &f@#     8  " .$   ̥ZḀ90     f00110eaekPeEe  n0 p.7 ("eR  5eU5reU5XeU5>eU5$eU5~ eUl\\7 Z7 X P FHDD<>e 7  A1IDENTIFICATIONVERSIONBACKUPBPBRIEFFULLIDENTIFICATIONVERSIONAPPENDIDENTIFICATIONSUPERCEDEVERSIONF#U#]#d#g#m#r#######%$#$ ##ȅ$#,##$#ʆ#ȁ$$$=/"""$*$$8$$8$*8$%8$.T$;p$8$8$z$*T$%T$.p$;p$T$T$z$*z$p$"_$Ҁ$$_$:$Ԅ$[%$*$$,%$*$$][%$*$$$]/$Z"Z"t""""/$@""""?(%HEL F Pʜ F w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C ,w0ww4www wE & TI@eu(5,5U5ff e ff fe nTff :e P 2Tff (eff e 7e5(5,75 ff e ه7 v7 |-x 5 ff e%l[  %5e"5652 T 5uff e >& & &  f&& & & Ε   !5   w w 5   ff hewff Le5"ff   P   2%. t7 \&fm  v5u &fAB NH J2' 5@H (RN R - Z\fhbd'H PH  e7!' 2el-e 8 H e e&  I'  M' %'H H 7J!'  e H ~O' B^EH }' '' ' ^E''' ''' 5Z''U' H H 5\'5Z(5(5Z"( 5Z(('' H J ff e%9  2DfN--m File protection: %ISystem:%I, Owner:%I, Group:%I, World:%IR%IW%IE%ID%IP(Z(e(p( File organization: %ISequentialRelative%I, maximum record number=%T, no maximum record number definedIndexed, using %M key(s) with %M area(s) File attributes: %IAllocation=%T, Extend=%M%I, Bucket size=%M%I, ContiguousMagnetic tape, Block_size=%D Record format: %IUndefinedFixed length %M byte recordsVariable length%I, maximum %M bytes, no maximum defined%IVFC, %M byte header%IStream%I Record attributes: %INone Fortran carriage control Carriage return Print file format Non-spanned (blocked) $w8`# "   (#2f re   w&v&j7 h7br& H d&# W ɋ`# P`#6& F ^& : R @ & & >'  2 E' " * H dH  WK(4WQ(.WQ($WW(WW(W^(l( 5Ћ 5 s( }(5 ( (5(  (ee"  4& H   Ԧf'   H   s'(X' 7 |' H  2Ћ' 7 N' t H  3Ћ' X p' L dH L  Ћ,*' ( @J 707.( " %IPrimary key:Alternate key number %D: Name=%VA, Minimum record length=%D Key information: Type=%VA, Length=%D, %VA, %VA%I Position(s) and size(s): Segment=%D, position=%D, length=%M Area information: Index: Area number=%D%I, not initialized Lowest level area=%D Bucket size=%D, Fill factor=%D Data: Area number=%D Allocation information: Root virtual block number=%T, Root level=%D First data bucket virtual block number=%TStringBinaryIntegerPacked_decimalUnknownDuplicatesNo duplicatesChangeableNo changes, Null=%O 00110eaek7 0 *  w5  , . 07 ߱7 ޡ  D>+ 00210eaekTI:PPPPr ׭"#zf& mj      | f  efr  ef"  ef leL3 pf  re \5Jf  BeEf  w0 f   , ע   8  de0 0D  <   " uf"  le5 Jf  BeEf||p &$ wEU@f&|  @  Y |M@   @ &.e6% 4% 4%04 f   wT .eF w,wd0w\wT4wLHwD8w<w4w,<w$&f& v &e f&b%$&&&F f&ee  $1r (& T & & & & & & & & & Ε f ef"  eU  P  3& VUP    46& U5wf"  ef ef"  e, wp   f e,w6  t & H  w >z tw   This is the RMS DEFINE utility, version 2.001 Error in LUN assignment Maximum nesting depth exceeded in indirect file Open error in indirect file Syntax error in indirect file specification I-O error in processing indirect file File specification is too long Error with indirect file Illegal value. Type ? for help If the file already exists, do you want to supersede it (NO)? YES means that the existing file will be deleted and the file you have just specified will be created in its place. NO means that the file you have just specified will not be created and you will have the chance to begin again. This file can not be created since the file already exists and you did not specify supersede. Your file has been created -- Your file has been processed and a command file generated -- NO DEFAULT: You MUST enter a value This file cannot be created RMS status code = System code = ** Privilege violation ** ** Directory not found ** ** Device not available ** ** Device is full ** Do you want to re-enter the entire file specification (YES)? There is an error in the device or account number field of the file specification you entered. YES means that you want to enter a correct file specification for RMSDEF to process again. NO means that you do not want to re-enter the file specification and want to restart the process or terminate the utility. ; You originally gave a bad file specification which was output to ; your command file. You must edit the change in yourself. ; ?DEF -- Indexed files can only be created with RMS11K Invalid data in command file. You have specified a virtual block number which is not within the boundaries of the file. The file wasn't created since you specified a block which is in use. will you now accept an approximation of that location (YES)? You requested RMSDEF to start the file or an area exactly on a block you specified, but that block is not 00 21l1DATADATADATADATADATADATADATAavailable. YES means you will now accept the best approximation of that location. RMSDEF will try to create the file again. NO means that you do not want the file created and want to restart the process or terminate the utility. &f&8  @H   w\`v^v@j w w    wxI? xNwb Y" &0     P w ? $   w Y  wNw?   w P TITI  B w4   C3 3  ,, UEs3w<1H &f1 B * ͋'% ͥ!ͥE%,  K5  PB2 %pˋ5J J J @ EͥAA Iw D 0 00 ppM $w`w \    .%w0"0 ep" \ lp0 $ *" ` D `WaWz 0,wɥ;&ww%7   Hw ŀ&  Հ &^&` `^V `W-ŀ `w4wrw ^  ɥ@0 p @ @  ^ 0 00w&^&` `^w T-00 00000Uj0 0000% w @ \" 0 U%  eE 4`0  (e)Ej0`0^  0n5j . ^h h U% e)0)f & 2נ/נ נ   נ נ RՀC"9"/:>UBD?_@R@iA/BA|@}@BCEFA%B:CFQMH/IPJ}KEQ6>@ACx>ADK?xBxB CEEILF[FG@[<`:>Lm"Ql3/")D8;);U344B43 e5Pe>. ewf  efr  e 0 E҇  \Re  pe>> ew0x 7 52e7 |w?- eEDr r,,1,fr  er , P D ref  ne2 >wF?> ewE 525r: ew Ӈ  e—&¥e¥¥¥wxz7xxx 4eZV3 5w:,U?5wwwx (7 .& `  w~R trd0021l1DATADATADATADATADATADATADATAle f7 7 P :"w>7 <7 :3 5w" t 2V< 2= |2^= t2= l2> d2D> \200"210eaek*> T2< L2:= D2< <2; 42< ,2p= $2> 2> 2< 2= 2N= 2<> 2= 2V= 2= 2= 2> 2; 2h> 2z> 2< 2< 2= 2> 2> 2> 2^< |2(= t2< l2@ d2< \2A T2? L2A D2t@ <2A 42? ,2>A $2A 2A 2> 2= 2@ 2? 2hA 2J@ 2? 2> 20@ 2|< 2$= 2B@ 2@ 2>> 2A 2 = 2< 2= 2@ |2"? t2z? l2; d2@ \2@ T2@ L2A D2@ <2= 42A ,2< $2@ 2@5 wH>! "ew&  GDw5 p D: ew, ` eU f  e5 Uʇ N Tew.? $ew(!wwwIA! ejA eww e eP  UɇB( $ew( -~eUf0^C' ew BeUX. &"E- ewUF. ewUv@ Ze ^ˇU Enter file organization (SEQ): Enter SEQ for sequential (DEFAULT) REL for relative IDX for indexed Since you specified a non-disk device, your file organization MUST be sequential. Enter record format (VAR): Enter VAR for variable (DEFAULT) FIX for fixed STM for stream VFC for variable-with-fixed-control-area UDF for undefined Enter var for variable (DEFAULT) FIX for fixed UDF for undefined Enter VAR for variable (DEFAULT) FIX for fixed VFC for variable-with-fixed-control-area Enter VAR for variable FIX for fixed Enter maximum record size (0): Enter maximum record size: Enter the maximum number of bytes in any record in the file. Zero means that RMS will not limit the size of the record. Enter the maximum number of bytes in any record in the file. Since you have specified either a relative file or fixed-length records, there is no default. Enter size of fixed control area (2): Enter the number of bytes in the fixed control area of each record. The number must be between 1 and 225. Zero means the default of 2 bytes. Enter maximum number of records (0): Enter the largest relative record number to be used with this file. Zero means that RMS will not limit relative record number. Will you allow records to cross block boundaries (YES)? YES means that records can cross block boundaries: - the file will be optimally dense - records may be longer than 512 bytes NO means records must be wholly contained in one block. Since you specified fixed length records, you must have a maximum record size less than 512 bytes (the size of one block) or you must allow records to cross block boundaries. Please change one of these. Do you want carriage return control (YES)? YES means each record will be preceded by a line feed and followed by a carriage return when it is written to a carriage control device. NO means carriage return control will not be applied at any time. Do you want fortran character control (NO)? YES means that any printer controller will expect the first byte of each record to be a fortran carriage control character. NO means that fortran character control will not be applied at any time. ; The next questions00*21l1DATADATADATADATADATADATADATA deal with file organization & record attributes 8L( 7 (52 " e- wj8  71  A18eH 7A 7 Tew e -  teT7    zʷP B ew-w V-R J Bm.݀ wRW-  \eWW---" f  eUɇ.  .e7   e7 He -2wXx me-f ^  Re-D6-:6w~ - e  mHemۀ wm.e"ɝ-  e-  ee" 7m 7   pewJ bwe" -F7 >7 8xe e`e wBJe" w,%H( "ew&   e0  &0 ̇E ew  1  P F& ewH' teI' bewfZJ/ 4? 83YJ83N7>4 3ȇD473r7:7F6? 83Y8&4NF6 3ȁ,5ȁ5ȁ5ȁ5ȇ673ȅD4f6ȁZ4ȁ5ȁ5ȁ5ȅ68?J7Z4Y74N Z4B8:74?R84j74 47:7b84?74b8474 4b8Z8:7 4?z84*85 4b7?75Y7N 58:7?J7,5Yz5N ,5B8:7z5?R8V5j7z5 V57:7b84?7z5b8484 z5z775?:75Z75 577?B75285 57?75r8 57?"86NY:8 6j8f6f6?R7F67f6 F68688:76?"9v6 96 v6ȁ69:7*96?8686 6ȁ78n68n6?869n686 688ȁ6ȅ769:7?8686 68:78?8787 7 2.< 2<= 2<; 2= 26< 2; 2d; |2: t2< l2= d2; \2= T2; L2B> D289 <2D; 42; ,2= $2; 2 = 2< 2> 2; 2 > 2: 2; 2: 2 ; 29 2^> 2; 2D= 2f> 2J; 29 2\; 2p; 2; 2= |2(> t2; l3&< d3: \3j: T39 L3b: D3= <3.< 43< ,3: $3p= 389 3"= 3@; 3; 3R; 3: 3P: 3*: 3: 3; 3": 3:00:21l1DATADATADATADATADATADATADATAFILEFILEFILEFI^ LEZ FIx LEt FI LE FI LE -AREAAR@EA<ARhEAdAR EA AR EA AR EA AR EA 2DBw &. + Rp p p1p 7 5 1 1 111 E- w$ 7  A1eHt n7h7 d7 ^  Lwb>$ 8ew<}D) ezD    χ5 D& ew EL ew :F ewF dewhX G! >ewB2&@ ew P e-B  e - 1U ˇ 0 eB`     4e~- 5 A2 ew Be 8URwL @1@  ݀   eU 5  r PB+ BewF eUɇ5 ?* ew T L 5 dC& ew U Do you want to define areas (NO)? YES means you want to divide your file into two or more independent areas with their own initial allocation amounts, default extension quantities, fill numbers, and so on. These areas will be associated with the data and index portions of keys later. NO means you want your file created and used as one area. Enter initial allocation in blocks (0): Enter the number of blocks you want in the when it is created. A reasonable (non-zero) quantity speeds processing. Enter bucket size (1): Enter the number of blocks contained in each bucket of the . Zero means the default of 1. Each bucket must be big enough to hold at least one record. The number of virtual blocks per bucket is not big enough given the maximum record size you specified. Enter default extension quantity in blocks (0): Enter the number of blocks you want added to this when it is extended. DEQ must be a multiple of bucket size. A reasonable (non-zero) quantity speeds processing. The default extension quantity must be a multiple of the bucket size. Enter file default extension quantity(0): Enter the number of blocks you want added to any area with a DEQ of zero when it is extended. A reasonable (non-zero) quantity speeds processing. Do you want a contiguous (NO)? YES means you want your to be created in physically contiguous blocks. NO means physical contiguity is not required. Too many areas. Just finished area number 0 Do you want to define more areas (NO)? ; The next questions deal with allocation and placement attributes Do you want placement control (NO)? YES means that you want to control the physical location on disk of your . NO means that you accept the operating system's placement of it. If you want to specify volume, enter its number within the volume set(0): If you are using the VAX-AME, volume placement control is supported. Enter location: Enter a number representing the starting address of the on the specified volume. exactly (NO)? YES means that if the exact block you specified is not available, you do not want the file created. NO means that if the exact block you specified is not available, you will accept a block as close as possible. Enter type of alignment (LBN): Enter lbn if you intend to specify a logical block number as a location for the first block of this area. VBN if you intend to specify a virtual block number as a location for the first block of this area. LBN numbers the block within the disk. VBN numbers the block within the file. 00B2I20eaek -  kF2wч FG t 52=8 \e-| v djd7^52e X=, <>D  >5 7673eA>7 ew \-XeUj@ A8 ew -e  P  @DA dewh7 n -NZe> B   00 0 P ,P eR w 7 e f  e,qf  eU̇ r -~f t7XR7LeB ?ʕ .W S? ?I 77}ew X e :>    eU,ˇ& 1 |    d-^B+N Bʕ .W SB ~BJ 77ew d e FJ    e -U*ʇ ,P   It is time for area numbers and fill factors for keys. These questions are for the primary key: These questions are for alternate key number 0 Enter area number for data buckets for this key (0): Enter the number of the defined area where you want the data records (level 0) of this key to be stored. Level 0 of the primary index contains the actual data records, while level 0 of each alternate index contains pointers to the data records in the primary key. The bucket size is 0 block Enter fill number for data buckets (0): Enter the fill number for this area as a number of bytes less than or equal to the area's bucket size. This number controls the amount of data actually written into a bucket by RMSCNV or another task honoring fill numbers. It may be used when the file is initially populated, leaving room for other records to be added easily later when the number is being ignored. The bucket fill size is greater than the actual bucket size. Enter area number for index buckets for this key (0): Enter the number of the defined area where you want the upper index levels (2+) of this key to be stored. The area for the lowest index level (level 1) is entered in the next question. the bucket size is 0 block Enter fill number for index buckets (0): Enter the fill number for this area as a number of bytes less than or equal to the area's bucket size. This factor controls the amount of data actually written into a bucket by RMSCNV or another task honoring fill numbers. It may be used when the file is initially populated, leaving room for other records to be added easily later when the number is being ignored. Enter area number for the lowest index level for this key (0): Enter the number of the defined area where you want the lowest index level (level 1) of this key to be stored. The bucket size of this area and that of the area containing the upper index levels must be equal if they are different areas. You can put the lowest index level in area 0 only if levels 2+ are in area 0 also. The area associated with the lowest level index bucket has a different bucket size than the area associated with the higher index bucket. Try both again. ; The next questions ask about fill sizes for keys; The next questions deal with associating keys to areas and fill sizes|,??R9V r[q$V 8* u00J21l1DATADATADATADATADATADATADATASYSYSYSYTICLSYOVX(l(l8*^ MSDRDRDRDRTICLDRDB?YXp,X>5.8 wPLf& L&e? %& fY 5w`5& Lw>L e?E? & f Yw &M' UD$BA VK&( U BQ JЕ*  w L ť ť 0B KAa,w 0w 4w Hw~ 8wv wj <wb \wZ >>>>>>>>??$?*?6?8?,>?L?f?r?????? ?????@@@@ 1"@0@H@J@P@\@n@@@@@@@ @@A A .A"A>ABAPAZAlAAA AAAAA AAAAB BB$B&B ,B4BHBRB~B BBBB0 BBBBCC C>CNCxCCCCC CCCCD0D:DPDTDbDlDxDDD DDDDDDDEEEE,EBEDEJEVEjElE"rEEEE EEEE# EEEE EEFF$ F(F>F@F FFRFfFhF%nF|FFFFFFF&FFFFFFGG'G$G:G IE$C@& 7  w, w( 7 7 7 p  8ww00R2I20eaek` "$&(*,.024 p=3 z=0 |=- ~=* `=' z=$ |=! ~= = = = = = =  =  = `= = P  &    &fe  &f- <dwbD   󏇅  (2 ` 0P  8Al?leE `&|h  m  b&f!  E D  E E C B Ί A =~A&=w,;4 ZA<<C3 3  ,, UEs3w AQ<&flQ B * ͋'% ͥ!ͥE%,  D5  PB2 %pċ5J J J @ EͥAA IE7Pw& TI& & & & & & & 7 h V*& && & & & 8& 7p 7 ,&&&&׭&7 &@7  0 -e  0 3e  @te-&fE& Je W 7 $.8 7^%w\%Z%w%&  ^ 8-&|&%7 &7 %7 ^%X7 V%P%       7$W W  W W  7vwhwbw$$=  D& TI& & & & & 7 & & & & & & & 7 & & & & &f& 7 & & & & $68& 7 -## ׭####$687# ##68 6#e68   w #687#e#68$%f #f# f: :V%wV%7C%2%: % %  : a^: % 6% ^: b:C^:, %"68%%6%-2%S^: |%$$  % ^: 6^: F%: 4%e6$N" J"F""5868 \5" "-$$ ^: %: ew +)e D &<"&&& d e   -7 e ekwl   e-Ce w>& d7#   7 #$@`f 7##   `7#^!w^!w##%e#w==7 *! ; w>;68 n68!t p #68f 68 3V  N 68   v 68@m, f ^ ׭@  |Mz && e .68` mZ  D & je J       2pe68T 2e W!   . e -(  -,  --:f l= .x%6&J0=,J"6  % -.8J!  % -pJ Jw.,=Z; f& && e Gr7\X BԦf   Z; 0Z; !N4ff& \     . eee   % -ef68m& W? V  0 %w& -< -Z  -5-Z a@ ~2Caa&f f - - 5-Z*& TIe 0=& & & & & & &  f& a e-(w:-$ %   :- Z ew  w2 68m\& ŒW[68m:] H  68m %W(!68mv)   W!68XmL %  6682m( V  2=f6= ef& "f< x8=< heef  00Z21l1DATADATADATADATADATADATADATA!68m$& - H `e% f?dd@wth - q- 2o 68@m  te68nw@ 7w D:= B68m.& f& e `X%-P  Lje68d %  -r  W  X&e68  %wvWp -w2- - 2w  .8|  77& 8f ɕ81e vȕl ȕ8jbe8\XXe RNNeH @tm:fE& Xe W  ` e  mɕ  dd Wp@ - - -e   %- Wp@ w-  w-  w-h h  wDeW!  Wp w,-  AWpD .8- ^3 - 1 - 1 -@ wR -q- 2 o 68@mh  Re68 nw@ 7w D>= B68m & f& e Pph %-@  *He68Bh %.   -P    6 ze68 %y 3`   2 FK S.8 77& f ɕ|ev @tmjfE& xe W B  <3 63w34e.?*e  R %-L  @ 73@@ 73  $ wv)W!  @ 7,3 E e1v  3eĕ @ 3eE  W >.83 |3 3 3 3@eF &--d 7 * w~68m&  87= dn; x7 l(> V=Q=N=J= J=,J =8J=rpJxh*=%-V====>>-*>>> > %- 868 mz .7;&> ;  0e  -  &  -L>T RZ>FDl>h< %   h< hy< v% " < >h<[ <, .%< %  < < %h<%7< % | < N< %h< %%V<& e w4~-T> N   7 Lr< %h</ a7 \& & & && 7 w< "%h< e f- -"68 %> F  68 % j ݢ !Z ;W @f > N-B-Ff7 l>J> ) !& !#W   ! ! *W  x! j! e- :w iF*&+P&,&+P,~J  -P,JJJJJJ --F,-00b2I20eaekJ JJJJJKK K K?8 8P9 = P:) B=H= N=X= `= p=v=z=== ==== ==PPZ<h< SY:FILE.CMDSHOWID"0>hALL // ALLALLAREACLEARCOMMANDSCREATEEXIT_SUPERSEDEFILEGETHELPKEYQUITRECORDSAVE_SUPERSEDESECTIONSSETSHOWSYSTEMCOMHELHLSECHLCOMFILSYSRECKEYARECOMCLCOMESCOMEXCOMQUCOMC00j21l1DATADATADATADATADATADATADATARCOMSECOMSHCOMSSCOMSACOMGECOMHEHL"0>LZntLB:RMSDES.HLPLB:[1,2]RMSDES.IDX Press RETURN to continue: DES: "(.BnHNThnTarget Target: RSXSYTARRSTSRSXVMS>>>Source Source: RSXSYSOURSTSRSXVMS???Name Name: 0FINAM Organization Organization (Seq): SEQUENTIALFIORGINDEXEDRELATIVE SEQUENTIALx? ?? Allocation Allocation (0): 0FIALL Extension Extension (0): 0FIEXT Bucket_Size Bucket_Size (1): 1FIBUC Cluster_Size Cluster_Size (0): 0FICLU Protection Protection: (SYS:,OWN:,GRO:,WOR:)FIPROGROUPOWNERSYSTEMWORLD@@@@ Owner Owner: [0,0]FIOWNMagtape_Blocksize Magtape_Block_Size (512): 512FIBLORewind_Magtape Rewind_Magtape (No): NOFIREWNOYESHALAMax_Record_Number Max_Record_Number (0): 0FIMAX Contiguous Contiguous (No): NOFICONNOYESAA Supersede Supersede (No): NOFISUPNOYESABSize Size (0): 0RESIZFormat Format (Var): VARIABLEREFORFIXEDSTREAM UNDEFINEDVARIABLEVFCXB^BfBpBzBControl_Field_Size Control_Field_Size (0): 0RECON Block_Span Block_Span (Yes): YESREBLONOYESBCCarriage_Control Carriage_Control (CR): CARRIAGE_RETURNRECARCARRIAGE_RETURNFORTRANNONEPRINTTCdClCrCName Name: KENAMType Type (String): STRINGKETYPBIN2BIN4DECIMALINT2INT4STRINGCCCDDDNull_Key Null_Key (No): NOKENUKNOYESZD^D Null_Value Null_Value (0): 0KENUV Duplicates$ Duplicates (Yes if alternate): YESKEDUPNOYESDDChanges Changes (Yes): YESKECHANOYES EE Seg0_Position Seg0_Position: 0KESPO Seg0_Length Seg0_Length: 0KESLE Seg1_Position Seg1_Position: 0KESPO Seg1_Length Seg1_Length: 0KESLE Seg2_Position Seg2_Position: 0KESPO Seg2_Length Seg2_Length: 0KESLE Seg3_Position Seg3_Position: 0KESPO Seg3_Length Seg3_Length: 0KESLE Seg4_Position Seg4_Position: 0KESPO Seg4_Length Seg4_Length: 0KESLE Seg5_Position Seg5_Position: 0KESPO Seg5_Length Seg5_Length: 0KESLE Seg6_Position Seg6_Position: 0KESPO Seg6_Length Seg6_Length: 0KESLE Seg7_Position Seg7_Position: 0KESPO Seg7_Length Seg7_Length: 0KESLE Data_Fill Data_Fill (100): 100KEDFI Data_Area Data_Area (0): 0KEDAR Index_Fill Index_Fill (100): 100KEIFILevel1_Index_Area Level1_Index_Area (0): 0KELAR Index_Area Index_Area (0): 0KEIAR Allocation Allocation (0): 0ARALL Extension Extension (0): 0AREXT Bucket_Size Bucket_Size (1): 1ARBUC Contiguous Contiguous (No): NOARCONNOYESNIRIPosition Position (None): NONE 0ARPOSCYLINDERLOGICALNONEVIRTUALIIIIExact_Positioning Exact_Positioning: NOAREXANOYESII4Pl0Lh,Hd (D`|$@\x < X t FILE.DESALLAREAFILEKEYRECORDSYSTEM--8----3---%DES-I-ID, Version 2.003?CLEARCREATEEXIT_SUPERSEDEGETHELPQUITESAVE_SUPERSEDESETSHOW'&1 Q PRLT PRU RTx RDx RLx R@| R0l S(l (S :Sd :S* |LSd tLS l^Sd d^Sd \pSd TpS LSd DS̊ <S 4Sd ,Sd $Sڊ Sd S6 Sd SĊ5ew V, Bv    5Bw 5  (5(UW       wE5 E  W ͇5  ,E Q2K>ML2L&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë 00r2I20eaek)̋E U 5 ߥ& *  + 23E Ew (   Е-   0@A W e`fÊ    E &   `@ ` B   & A @    &  m  f A N  %w TeE D` bl lrw   B eE"s    s-  Cslw  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C &f &ff r[qr[qPQB"K&K*K.KhQFLPBBQQr@QQRIqMS@QRIqMT@QQIqM"TQQU(U6TLT>RBa+LTPRtRBaAK+LT>RbRBa7LT>RPRU,7(lRSBa)K7(l RtRR>DxRRBaGADx RRBaHGDxRRRBaII@|$ RRBa*P(lRtRRBaPP(l RS,V(ltRRXd(S,R""?TXdS:SXRZdSLS."\d`S^S/"^d$SpS1"`dSS4"cdSS6"fdSS"idSS"ldSS"od|S(S"L4M4MS>MLS MLLLLLlQPPPPj&   طe wԸ -J8JD -  AWp -8f ̅  6Wp .$WpD . 1-  p.-  3.-2 .1 .0 .  -pJ4 - A 3)f ΅   3  B3 3  2331 30 3  J J ,J J+ 7 %   f68 >68wt   m7e w^J eJ7(w  lnk&2 7b-  -w  < wL @7Hw * X ݞ&.k&& e -, p w C -  $e1 @   3 eD D    Kwp & \ l-&d-&2$&2 7&- -   N 7   w +   7R68mNW f& .wm  & e 7 ~ew&2 7b-   LHW -   *t te 68,m" P7i. d-&7 D7 7 tm&E& ޳H68m>7 :k | W wr n7`-.2TP*Lb* ²8ln,*b7 $%ewF6-VB -& 7  7w@  7     Ԗ%-& -&2 7 w 66 -(  \w4n68mN&) 6    8  Vw  @ta`fE e W 6-w݀m r      xe i  : 6   ZJ$  (reA8ݎ 6& &   & &2 $ -,  ePe @t,aafE e v   00z21l1DATADATADATADATADATADATADATA- w d`@af     4$0  Lewv"6#-"),-",$A-"R6 !-"W-"E-"D 0 *m**t0a@`*E& xe%w-< -<2 v3 i, \% "O-< 8 +   wew ڷ 7 e-& -&2Ϸ -&7 w6 -& w rڷ nj W![wL-| F F7Hw   ,Z -N  7w- L wP-   W! W!, 7  Ζ%-z-  7wj l  ]7x6L -  7V *t %w7  - 9 ,( W!  W!]*7   ޼(Ζ%-&nj tm &E& Ȭe5[-&WSׯ' p e7Z 7W r f7nwD F P-8 '-0 #-. ~ e -&   E?  -& 7  ܻ&͖% n  p  t 6 z 6 z  =˦fk& e       68m.& 7 z WtmhN&E&  WtmHN&E f w.-& wF`/K ew6  Wp -wF &6 -*F<  e   &  - h   S 6e6( e B  H66vd J6vvp~ 5CJ e   2&  -   eL   q 6e6( e B f66vd h6vvp~ %we !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~ Bucket_Size (FormatNull_Key OrganizationPositionTargetF$\  Seg0_Position Seg1_Position Seg2_Position Seg3_Position Seg4_Position Seg5_Position Seg6_Position Seg7_Position 8RTx 0RDx (RLx R@| R0l S(l002I20eaekw -q#ALw ,   "68 R?`w # nw  ewL     %%-l  d 7 d 7 Z V Wp - L B B 7< e4   * #bxw B ̫  w 68 fC@?w ,A 9@ @7Dw  2 "-   0(f68 ` %F > t 7(  7   Wp -wF <7 e  7eׯ 7e 7te"7 7  ߮ -7`p   hwF& Ȳ,xern7Rbe \B,m4 r7" 7 wB x7ww eVF ze7`İe re r7h`:p6hPb\ 7XwB 7wFw *:e4.F je e r7 ( 7 T7wtr.Bh 7nwlw  :Ìeǿ~r rh  r`Z VN r  D r  4-0 * rBm 7 w 7e ?7e 7e w ֩e w`e@7n7 b`}Vw  - jw   7pJʻ» *7 84Wp -!F  NԻ7 e ?7e ?7e ?  e w68 N?w : .76w   %F` Ю4ezv7Zje dJLWpm$mBe r75׭1)& xº  7w     F7wb`  X PHF 7PwN~w b relfF ReLH7,<e 67  e r7 ( 7 l7wFB 47ww  ReĘD7e ^e~7ze tn7je d^ .w Xx He5wWt m 7r7   7w    >7w$vt $7rwp d^\Vw`R-TL& ئ"ew2,.(7 -   7 7w(w 7 w7 @ 3NW KFf 2e 66  26 vd  87v De Lwl@ l ` V %e Areas defaulted: ARDEFNOYESfw jwBucket_Size (2): ARBCK!The primary index has a depth of  Key 7Average number of duplicates per record for this key? NUMDPThe index for alternate key  has a depth of PRlT PRh PRhwB$w:wΔ  68TmĿ&J x7684m7r n*bd* zN$ H%-  ,-V P-%P &7 Wp @- 7e 7  3 7e e@'  - 7-veplexr 7-eN3-J R -8e2,?(40 3$ 73 ee  73ee3eU } 70021l1DATADATADATADATADATADATADATA7e*?e-7ٱ-t# ׭n ׭c-׭Uzr TPPL`Dx F%$7(-$ F, -w׭׭-Lx %׭ɲ׭ر׭" @te}fE&e}fE& e De W ׭W#@te}fE&e}fE& e e W ׭ #@te}fE&e}fE& le e W ׭# @te}fE&e}fE& e Ze W n ~%\e77V 7 b^Wp @- 7<e6? 2 @7 :6 3 7e? e SY:FILE.DAT PRhw  A   W-dʁ n)N- r&   - .re687 e  wV Jڴı -wW LЁ h  w>68 ʝ? X. 7   7 t  8e6827 N %%J N7 2-6Q,J 2-E- 8Jİ  - } -ܳ !v qpJ  |_ aW T    }-d)V J  ,J J 8J pJ$ 6N T - Ve687ڽ ֽ    |68m(& ܛW j S -* 6  NeO  I̼68 6ğD?,  z - 6ze687 N < -ܼ  % wD7 6"7-8Jd7 -b[ VD  wT-dZ 6=R F7Nw86 e6874 0  W  2ve687 w  -wd- wJ- & Z%°°7 `&  m7jw7f7c-\\ TNN&& |e w`7 0r e7   O Lp < D d-"d ں ΅7ֺw  ,e687 -  re68 -3Z  ,L -zY4  -`L &" m"7    B  @7e m7Ю̮707070 r -   -Ʈwt w7 8Jhe !w-hpJ -   -nwp7 .-<W R ` h  -Bd ޤ09 7w Xe68ܸ W  ޭ"e68 ȭw | -W-lSd M-n f 2%v F mF70'70V70R70N Ғ \-@y X -&l 7 pJάe B Ҭ 8JY pJV ݾ JƂ ,Jނ .:w0'w0$w0!&& Re N  -|6  -b  ($ m$7e SECTION: HLSEC File Placement: HLPLANOYES  ATTRIBUTE: HLFILHLRECHLSYSHLKEYHLARE VALUE: Seg0_Position Number of keys: NUMKYStarting Key  Number of Segments: NUMSG Number of areas: NUMARStarting Area SourceStarting FILE section Starting RECORD section Starting SYSTEM section PRU002I20eaekwBwʔ  W {   wH-jd{ X :68m w*-U7,Dx 2%ܳE   ,  -`:- % $  :- t 8 Jr( Jt^( p,J`J( \8JL6 ( BpJ2 $( (:- Z%, H% wX -8JW-7 7  ?-Wp -0| 7 ~j-B   -c xt mF70e -2pJ`-(7 D@467 40* H-w 3: | h7 ʲ'- 7<Ʋ7< -S  m~7he B j  J  ,J J87 vj | ,J|*|f " 7<47<.& x-*   m7ֱe File_Name: HLSFNKEY AREA FILE RECORD SYSTEM Rn~wppD68@mػ&f NPf& xe  J Ğe 7 !@ F L -*d ƧN- r& d T - ذe687 e 5 Jt Jv` r,JbL ^8JN8 DpJ4 &\ eW Q F L V-*d) J ,J JƇ 8J̇ pJ҇ ֯N  -e687z v  p  %wҎ؇ 777 w7䇺 w77 JĮJث `wt`` @ `nl7jh4 @ `nwDwB7?@ 7@60@ `nww@ 7@    . Wtmf&E& ތe <-w7  l$bzbx pw@~2 –7T PL7T7Qe}̭74 <u m\74e. (&2 l6H@ m"Bn7 "- " bx 7@m7elf& tl e n,f^HPw$-¬ ݼ  \$\6ww ݔ wZ  @t a`B l<&fE& e Ca@`ȕRB&fE& ̊e /a@`ȕW.&fE& e a@`ȕE&fE& |e a@`ȕDa@`ȕ W  veB a`W a` v 6   ~e!  TW   6 6  /W    6      6   Ϫ     6 m@acm mmm@```7e af&*af$:a(2Ja  e<\7 fy|~zA @@7p-LA @@7\-|J 6: 77( "-t  77lm7e " l e$\7ZpW ~W 'FwC'>B . 707.(    Hm7e-V & TIe( & &  zt& X e*-,(J<F4(:-$ ؆%   :- V eID SECTION: HLSEC ATTRIBUTE: HLFILHLRECHLSYSHLKEYHLARE (Explicit) -1 , (SYSTEM:OWNER:GROUP:WORLD:) [,]VDT,B*ff(0021l1DATADATADATADATADATADATADATAPx(Px(Px(Px PRg$w^w ̬  - vv 7   -dv n 68 u N~ J - 6JԽ -*,J -8J -pJ -e \u P68 @8V0L68@@`7 2ˠ@e687 7   ׭ -v68@` 7`v j7>  @<D׭@  ,e687$7  ʷ  `* `*68`mV 7- w7/>6, l%   , 4c:- B% p :-  ,E:-, %,68B:"-w:- ֝%$  :- F:- %, %e*Ƚȷ 5868 &68 m68 87z- r& |7b w68X2 Z7 :- %, e668m 7 Ω-:- %, e868Dm: h72 :-P:- \%, Je<e7p    Β7wDew :- %, %-"`*2 L@e(wʛrwe3we?we-2UUv 77wre*l?hwde-^nXwe--77f %л7,-( F, d (l š% ݸ   Wp w-e?w-e  q  f @ 73e B & 6% l-`7| -p 7->e84eX+-( D 7-e -$  3 73ee7Ÿn ~%\(l l%J Z%? ع7 -7 B7 Wp @-wH7heb? ^F vFBe <& Ο2 xؿBe< 6t 70¹8e2. 7 d  d7w  j7w  he & Ο Je ߨt 74e7 d  7w~rtr 7Hwhf8 4  Vew7 JF 3 7e?  *    t @h-d --ܶ7 Ҷ7 ж  File_Name: HLGFNDATDEFDESDFNFDLvv!v v,v7FILE.DAT lPRlT dPRLT \PRUw CHn   w-dVn 6)- r& ԩN Ĭ!-* He687 e !> J -&Jʽ -,J -8Jv j-pJ t_!W T\n    -d)N Jln ,Jrn Jxn 8J~n pJn ܶ. L!-  Ne687 ! ! Ԧ&  f68002I20eaek Ɯ68wɎ Pe SECTION: HLSEC ATTRIBUTE: HLFILHLRECHLSYSHLKEYHLARE PRlT PRU & & @( f  e ee e ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw v&& D¥%  B&ХVA fz C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf jā & eL6& e8/& eZy*AHŀ ȕ Е Е Е & e & eЕ A %& eA Е A bEA EЕ A A   $Е.  AЕ; <    w D&& bЕ- eaePPPЕ-$w \D  &Е. ce  Е:   BjˆFn̉ .?%R-F-IFT, Illegal file type value specified6?%R-F-IBR, Illegal response given, must be YES or NO&?%R-F-ISE, Illegal section specified(?%R-F-AMS, Ambiguous section specified(?%R-F-ILA, Illegal attribute specified*?%R-F-AMA, Ambiguous attribute specified4?%R-F-ILN, Illegal response given, must be numeric%?%R-F-VOR, Value out of legal range%%R-I-NKD, No keys defined%%R-I-NAD, No areas defined0)>*~+@%%R-W-CBK, Continuation buckets will be allocated for this keyv%%R-F-NHF, Help file is not available. Check release notes for the location of RMSDES.IDX on your installation media8%%R-F-BRI, Bucketsize and Recordsize are incompatible j ш*Jiى$?%R-F-IVS, Illegal value specified?%R-F-CSE, Syntax error%?%R-F-IPC, Illegal protection class4?%R-F-IRO, Illegal response, must be octal numeric ?%R-F-NKN, No key number given?%R-F-IKV, Illegal key number*?%R-F-KOR, Key number out of legal range%?%R-F-KNS, Key has not been defined!?%R-F-NAN, No area number given ?%R-F-IAN, Illegal area number*Ur׊1d+?%R-F-AOR, Area number out of legal range?%R-F-ANS, Area not defined?%R-F-ILC, Illegal command?%R-F-AMC, Ambiguous command+?%R-F-KMA, Key missing corresponding area*?%R-F-NUS, Not a user settable attribute0?%R-F-IPO, Illegal protection option specified3?%R-F-FTL, Fatal RMS error; STS=%P, STV=%P, PC=%P:?%R-F-ICL, Incomplete command line within a command file$?%R-F-XXX, Unused error message 30j|%2?%R-F-ER$WLK, Device or file %VA is write-locked=?%R-F-ER$WPL, Write error on prologue for file %VA, code=%P:?%R-F-ER$XAB, Invalid XAB address specified for file %VA>?%R-F-ER$XTR, File string %VA contains extraneous charactersj ʼn!"0#a$%݊&'7(_1?%R-F-CON, Conflicting switches on command line9?%R-F-NON, Cannot submit files which are not sequential2?%R-F-UDK, Key specified is not defined in '%VA'1%%R-I-KRN, Key of reference is #%M, named '%VA'J?%0021l1DATADATADATADATADATADATADATAR-F-UGH, Input and output fixed control header sizes do not correspond2?%R-F-IWF, Illegal use of /WF with record format9?%R-F-FNN, Output RELATIVE or INDEXED file is not empty!%%R-I-CNV, RMSCNV Version 2.000(?%R-F-SYN, Null argument on %VA switch&?%R-R-040, Reserved error message 40jp`#PX@0ى J?%R-F-ER$STK, Unused error?%R-F-ER$SEQ, Record not in proper key sequence for file %VAC?%R-F-ER$SHR, Illegal file sharing options specified for file %VA7?%R-F-ER$SIZ, Invalid key size specified for file %VAjʈ3np`ӉP@X06?%R-F-ER$RAT, Invalid record attributes for file %VA:?%R-F-ER$RBF, Invalid record buffer address for file %VA/?%R-F-ER$RER, Read error on file %VA, code=%P;?%R-F-ER$REX, Relative record already exists for file %VA3?%R-F-ER$RFA, Illegal RFA referenced for file %VA2?%R-F-ER$RFM, Illegal record format for file %VAD?%R-F-ER$RLK, Record locked by another stream or user for file %VAA?%R-F-ER$RMV, REMOVE file processor error for file %VA, code=%P;?%R-F-ER$RNF, Record does not exist for file %VA, code=%P8?%R-F-ER$RNL, Record not locked by stream for file %VAҊ`P3@r0 ԋG3?%R-F-ER$NPK, No primary key defined for file %VA??%R-F-ER$OPN, OPEN file processor error for file %VA, code=%P1?%R-F-ER$ORD, Illegal XAB ordering for file %VA1?%R-F-ER$ORG, Illegal organization for file %VA3?%R-F-ER$PLG, Error reading prologue for file %VA@?%R-F-ER$PLV, File prologue version for file %VA not supported;?%R-F-ER$POS, Key position not within record for file %VA=?%R-F-ER$PRM, Illegal date information present for file %VA/?%R-F-ER$PRV, Privilege violation on file %VA,?%R-F-ER$RAB, Not a valid RAB for file %VA?%R-F-ER$LCH, Invalid logical channel specified dor file %VA9?%R-F-ER$LEX, File extension not necessary for file %VA8?%R-F-ER$LOC, Invalid placement specified for file %VA>?%R-F-ER$MEM, String buffer spans memory limits for file %VA?%R-F-ER$MAP, Unused error@?%R-F-ER$MKD, ERASE file processor error for file %VA, code=%PF?%R-F-ER$MRN, Maximum record number invalid or exceeded for file %VAB?%R-F-ER$MRS, Illegal maximum record size sp002I20eaekecified for file %VA?%R-F-ER$ATW, Error writing attributes for file %VA, code=%P/?%R-F-ER$BKS, Illegal bucketsize for file %VA4?%R-F-ER$BKZ, Illegal area bucketsize for file %VA?%R-F-ER$BLN, Unused error7?%R-F-ER$BOF, Beginning-of-file detected for file %VA8?%R-F-ER$BPA, Illegal buffer pool address for file %VA5?%R-F-ER$BPS, Illegal buffer pool size for file %VA;?%R-F-ER$BUG, Internal RMS-11 error detected for file %VA;?%R-F-ER$CCR, Multistream access not allowed for file %VA@?%R-F-ER$CHG, Illegal record key change attempted for file %VAj̈p `HP@0 6p8?%R-F-ER$IOP, Illegal operation attempted for file %VA=?%R-F-ER$IRC, Illegal record length encountered in file %VA??%R-F-ER$ISI, Invalid internal stream identifier for file %VA??%R-F-ER$KBF, Invalid key buffer address present for file %VA8?%R-F-ER$KEY, Invalid key value specified for file %VA@?%R-F-ER$KRF, Invalid key-of-reference speccified for file %VA7?%R-F-ER$KSZ, Invalid key size specified for file %VA:?%R-F-ER$LAN, Undefined data area reference for file %VA7?%R-F-ER$LBL, Invalid ANSI magtape label for file %VA3?%R-F-ER$LBY, Logical channel in use for file %VA ,aۋ Fx"?%R-F-ER$FNF, File %VA not found5?%R-F-ER$FNM, Invalid file name syntax for file %VA;?%R-F-ER$FOP, Invalid file options specified for file %VA??%R-F-ER$FSS, File string parsing error for file %VA, code=%P0?%R-F-ER$FUL, File or device full for file %VA;?%R-F-ER$IAN, Undefined index area reference for file %VA2?%R-F-ER$IDX, Index not initialized for file %VA=?%R-F-ER$IFI, Invalid internal file identifier for file %VA7?%R-F-ER$IMX, Illegal XAB series present for file %VA?%R-F-ER$INI, Unused errorjՈQpth`XPK@809?%R-F-ER$ESS, Illegal expanded string size for file %VA?%R-F-ER$CHK, Bucket header check error; file %VA is corrupt??%R-F-ER$CLS, CLOSE file processor error on file %VA, code=%P9?%R-F-ER$COD, Invalid XAB present for file %VA, code=%P0?%R-F-ER$CRE, Error creating file %VA, code=%PB?%R-F-ER$CUR, Improper record context for operation for file %VA?%R-F-ER$DAC, Unused error:?%R-F-ER$DAN, Undefined data area reference for file %VA:?%R-F-ER$DEL, Referenced record was deleted for file %VA=?%R-F-ER$DEV, Bad or inappropriate device type for file %VA:?%R-F-ER$DFW, Deferred write error for file %VA, code=%PʊAzڋPp`?%R-F-ER$ABO, Unused error1?%R-F-ER$ACC, Access error on file %VA, code=%P9?%R-F-ER$ACT, Activity precludes operation for file %VA,?%R-F-ER$AID, Invalid area ID for file %VA4?%R-F-ER$ALN, Alignment options error for file %VA:?%R-F-ER$ALQ, Allocation quantity too large for file %VA?%R-F-ER$ATR, Error reading attributes for file %VA, code=%P|<9,?_?_}V r[q$V FUSYSYSYSYTICLSYOV(P(PFvt5 DDRDRDRDRTICLDRDBl,>5002I20eaekPP4 ^ W SY:CMI.CMDCMI  IFL>&0 *l h \ 4_0ww<w w , ť ť 0B ,Aaw ,' UD$BA -&( U BQ ,Е*  & & @( n,f  e ee e 3w4e~f f &f &ff ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw ^+&& D¥%  B&ХVA ( C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf * & e*6& e)/& e*AHŀ ȕ Е Е Е & e) & e)Е A %& et)A Е A bEA EЕ A TA   $Е. < AЕ; (    w t)D&& bЕ- eaePPPЕ-$w D)D  &Е. ce J) Е:   X(B `'n42X'w%4 J48'4'C3 3  ,, UEs3w3B&&fhB B * ͋'% ͥ!ͥE%,  D5  PB2 %pċ5J J J @ EͥAA I +3 3@    w&&  % `7 5  R$5| 5r w5 & & e5L 5J 7 \ FBRe:-6 & & & e # f*& & 67 , # G5+& &  # K,& & e׭ 37 0 * & "we4- & & & :e ~4 "#% n B /& & 7 z $# )] "0& & d R2& & R7 *57 e7 e j@`w 57e7e@w3f& `" "  " %% B % "-7 |ew-pfb wwp  7h  d  8' .w $ d%7, 7(  w $ .% w>   8' wD $ ew D+ w $ ee (< %$ eIFLP.TMPIFLA.TMPIFLA1.TMP0022l1DATADATADATADATADATADATADATA P TtP PTTtP@^P PPdd PPT P>?P|~PSY:???? TI:?IFL -- %IFatal RMS error - STS = %D, STV = %D%IFile access error on %VA%IOutput file must be an indexed file%IPrologue version number too high%IClose error on %VA%IFile access error on %VA%IRead error on file prologue %VA%IExtend error on output file %VA%IMemory exhausted%IInput file is not sequential, relative, or indexed%IRead error on %VA%IClose error on %VA%IOutput file fixed record size too large for bucket size%%IIFL-I-ID, Version 2.010%IBlock I/O write error on file %VA%ISyntax error%II/O error on command line input%IFailure to open command file%ISyntax error%ICommand file nesting depth exceeded%IUndefined GCML error%IUnknown switch %VA%IOutput file switch specified with input file %VA%IInput file switch specified with output file %VA%IMissing file specification%I/KR not allowed for sequential or relative file%IInvalid /KR value%IBlock I/O read error on %VAException record: record out of sequenceException record: duplicate key where not allowedException record: record too short for primary keyException record: record long for bucket sizeException record: record doesn't fit fixed lengthException record: record too long for maximum record sizeException record: record contains an illegal packed decimal key%N%4SNumber of input records: %T%4SNumber of output records: %T%4SNumber of exception records: %T%IInput and output fixed length record sizes unequal%I/TR and/or /PD required with fixed length output records%ISORTS error code in octal: %O%ICreate error on %VA%IWrite error on %VA%N%8SPrimary key%4SSort has started%4SSort merge phase has finished%IError with002I20eaek logical unit %VA%IIllegal device %VA%4SLevel-0 loading has started%4SLoading has finished%IError terminated input before expected, but continuing%8SAlternate key(s)%8SAlternate key %M%VA%P%P,%P%D%D,%UNumber of output records: ????Number of exception records: ????%IOutput file must be empty 0 L n !>!Z!~!!!!!""4"h""""##H#z###$H$$$$$$%`%%%%%%%&(&H&`&&&&&&&&&&'%19SRMS-11 Indexed File Load Utility%19S--------------------------------%11SFunction: to build indexed files%11SFormat: IFL outfile[/switch]=infile[/switch]%N%4SGlobal switches:%7S? or HELP%15SType this message%7S/ID%21SIdentify current version and patch level%N%4SOutput file switches:%7S/ER[:filespec]%10SWrite key of exception records to terminal%31S[or write records to filespec]%7S/LO%21SHonor fill numbers%7S/NOER[:S]%15SStop processing if input record is%31Sincompatible and delete the output file%31S[if :S is specified save output file]%7S/PD[:[#]x]%14SPad input records to outfile record length%7S/TR%21STruncate input records to outfile record length%N%4SInput file switches:%7S/CL:nnn%17SSet sort work files' cluster size (RSTS/E)%7S/DE:dvn1:[...dvn5:]%5SReassign devices for sort work files%7S/KR:n%19SKey-of-reference number%7S/NOSO%19SDo not sort input before loading'''"(X(l(((()B)`))))&*b*z***+'&1 \B T:CD L:CH D:CFK <:CzL 4:CN ,LCXL $LCE CX CX CU CU5ew , Bv    5Bw 5  (5(UW       wE5 E  W ͇5  ,E B4544&wtE U &W )& #  4 &9U3uE uU0022l1DATADATADATADATADATADATADATA.5`.U & E& & f&ËDef Ë )̋E U 5 ߥ& *  + 23E Ew Z   Е-   0@A XW e`fÊ    E &f &  m  f A N  %&   `@ ` B   & A @    &ff r[qr[q 7BNn+:,-2d8R X7NNBBr@BBCIqM D@BCIqM D@BBIqM4DBBU(UHD\D:CC<9qQ#\D (CLC<9&)\D (C^C<9:d1\D<pC(C:C<9#4IC^CC*y&" 8e & Twնղ׭ "& & & R\D Ŗ% w 2T $ew5p ;& & & \D7 R\D e Hժ#J le (՚-V >e J&  ՠ׭5Vlhbre-wHzb^^ e 0w-  ׭' & & & wT׭ " -OR ^tD be & w$O5.׭-5`-5P%  -~54  -l5$& Y  it L) Wt #   Et (wh 5 *5"ԷJ7:2`-R^\D dD e (D \e & T e f51lD –%\D % HT :7 e5 |D % 58"lD %^\D %  dT e 59lD Z% >\D  >\D .% v D|T je >|D % 5z"NlD %\D %  | e 5,"lD %\D % *   e 5"NlD H%\D 6% >    re 5,w"& Ȫw#& Ȓw$& e5*$lD %^\D %  dT e7 5$NlD H%\D 6% >  | re7 w&"7 0Ϸ (5 Bd~D ̾e &D e  T e w FW& Z% Zwf7wg7 @׭ 3111,`,C`eD`AE "@  eeO~ ,"   e ~ ht 7v [t 7j7 `TZ5JZFV7 N7 LH8z7tn 5XV- & & & xeT 0(7 7 7  pe 2-ŬŲ & He 7 ņ7 x|x &j e  wx tm && B%  ~`  Et1`e ~ w& & % I  @7 J" J& % 5~x@lC~ ,~ tW @7 dw\7Yķ T  @7 Hw@7= 88,w6w.Hw&8www  N @Ԁ %! - mC a  v  M z  h  V  D  2   f6D~  f6D~  fC~w2ŀ  ~@w 0 00 ppM $w`w \    .%w0"0 ep" lp0  *" ` D `WaWz 0,wɥ;&ww%7   Hw ŀ&  Հ &^&` `^V `W-ŀ `w4wrw  ɥ@0 p @ @  ^ 0 00w&^0022l1DATADATADATADATADATADATADATA&` `^w T-00 00000Uj0 0000% w  \" `0 U%  eE 4`0  (e)Ej0`0^ t 0n5j ^h h >U% e)0)f & 2נ/נ נ   נ נ RՀCfEB`F ~ . ӥ:  ӥ:@! $  @! U`eUU5U mɥ[ɥ<"@  ˥.   z0Q UDeĤ _ Uċ5E  lU0 E pU5 . 5E0 U L. x; n Ċ- bU " & N ӥ"   U5CM% E A5Q`C _C&  p2 && ˥A˥Z˥a˥z ˥*˥% ˥$˥_  ˥0 ˥9 ˥7 U   ˋ˥ ˥ wҾ  TFW CB  & & & eW  & & & eW  & & & eW  & & & te & & & ^e7 Ƴ R׭JHxG׭:f?fR"& e >P&bR& e ^R& e |wh7 @R rE @R w~~ & & & hed^T Nf= l6 % wv!wpv /v v  7 &7 7 7 0W: wB@RA E @Rw"wT %7 "PW:7` W#wR @ wBȗ / = 0/Ȃ7 N'WEWR@aWSWO& &?W:eLJ7 7 7  & Na  B@RA |E ww & & & ve wrʦ T v! wv/v& & & Hv7 >7 @ W:@ ̹w7 $W:@ w 7 WSWO@aWEWR& &oƟ7 sZ  ~W:v! W/W:  JJrW e  v! W:   WpeZBe e W Z׭ w|D % .& & N!eʉ7 7 7 7 & f |ew5X5R 5L5F8e ef  B~7 *  B~ȁHELP?ID/IDERLONOPDTRCLDEKRNOhlw0w  NK > :546. 0$0π e7: .e )zT h7 Pe5F  & & ͎ e wV5 `&XTNv ɋNWvJδ5eAE @pwe-  m\D 4e @  |T ne5E͘ee-"  \D e  T eV@<:17.7)m$7e 9 8-4 .ͷ , (bD He T   T e 5` & & ˎ *ew5p lӊ7` 7x7s7re l-dZVhfN1FB > <Re-0"  \D ve  T e C ̓00 ̀e7: e )fT T7 <ώ& & ʎ e w5T5 7 hbe$\7 VPe*J55002I20eaek&2,*      !  4zs  4W 5& `W 6&W 7W 8f&N B8f&=W >Xm|EQ  ɕ-ɕ+  NtEe0 4Ee0 &~4 X Je  @ &.e6% 4% 4%04 f v  w .eF wN.e6@a "H,wrwj(wbĦ   P @FPnPBmL B  ZP C  FPFPnPC  ZPBm  PPC  PB  PFP BOP0O 7 P4 P W!xZP3ZPZPtZPtFPnPnPnPsnPsFP4nPFP7FFPZPw!FEtFPe  P P PW 4 P 8 i&7&fd E ww wwB`e    !!w 0 `w0   `wn  N`wP D:m,W&t P`@D AP  7 7tZP`tnPwwEEwAaw w   & pz p\&fO0Op P& P( raPr P0ZPO, P,P BOP6 2 p  OP wf&0T ]brBO U  BOPj3 % 4O p OP wZ4OZPFPtnP P4 P 4 P w&O0Op 0P&0 P( taPt P 0ZPP \  % w P P 4 PSORT0D.TMPP#@ 8O PBOOBOw yK@ww,w&w.@a "HWSU% / D  ' K K@"d BB0 B B@AE`fS e!?  K" " zׯ @ .7(ׯ@ 7ׯ @ 7ׯ we`     W  W!X$$ SaDa zE  AaS``@aB`5aab""    (  =WRU% D 7!f5e & 6%   : J   D VwbWQ %7     vj Jwwz N  % ` ,  @ d& 4mWWmW7 8  W @ 7 7 7! W W W  5-tv W W EB#T >7 Z Vw &>  P5 W 4-0 < w&WQ %U%ffw5ew  6 f  5 - $77 @md S7 j  WR  B X  Tw$$   C B B  & cC   W B W%) W P "WC !7 WBW 0W$  7 wVVVVVVVVVVVV 5ff  z7tJ2    h   rt > - " &7!.0022l1DATADATADATADATADATADATADATA@Ww eE D` bl lrw   B eE"s    s-  Csl4w8w޵wn ^ B~7N׭ B5< 60,.*횺$ 87@>  E~ 7 ^$_&_*7`"(_*_,_~._z0_v2_rv7 ^7 \5lit^[|PN(J e (wN e :& wV^ wXw Ժ^&_   w857 5ļ58^ wwh|x %`, \P ~X &, &,PHF &,  &,PH2 /&e,B`EUW W  HH ~AEA H ȕ H ~H_ wjf ` \w- 1& & & e6^ Pw$CJ pD ~w  0J ܮe w 6^f _ ^w6 '&e&& ;N ve ̿)%f^ wNX >%hN &% ~  T| de 7 $  w" 5HNX ʭe  (ڷ T|X eH  ּT ƴew`2x5~   -bbZZ5\&5b,7 X&L  ж#нCc є  e -]H5@-ڶ5 Ҷ,+5w$ - 5ĸw 5 턶-| ׭"mW @E @E !  ~ 4w8w޵wn] B~X e  &  Veƺe رe & w7׭y 5 0,7e*Ƚ.( B wb·\· X T P H@ @`7 xt 8]4@]0B],J*$7` D]F]H]J] L]N]5.*t (J e (wtN be & wPֿ] ^wпVwd]`\ XX e w  w  ݩ m#`,a C~]W e$, W e$,IW e$, W  e$,3W 0e$.e,&A`DEQנ נ  H DEB ȕ  C 0] ww2- 1& & & *e] wR "]b 8] Jw" 'e&& >N be )(n] wֽNX 0%v RN % d  T  Je  003I20eaek(ww`nj7 xѷ p5 Bd~bD e  &\D e  :T ,e w`~ 7{ ` !E ,u,r? >:7(26 r 2wπ$77 I 2e zT   & & & Te?  m r m~xtmlhw fmd`   j `7r n  H` "r 2r w~  5   C~  B~m   0  5&5"  , e*  & e$&TT ~e ^ % Uvfb mXnj f T 50 7 <-N6 n 3 7.7,"" 7  m& e fwpwbD e   T e 774ƜLƔ\D be n  T e whŃ57  Wf t y6  6 a6e`hŀo-wd `B2ŀo a E`W4:(. ~% S  f n 85( .% + Dӄ & ` 1    e a N`f he wwdw_wZwUW R(B>0& N ɝ"eÀoВММȜ  >5 rr r r W5f   e 77Fò^êbD te   T e wjT  : h   •  •Õ •mÕ, Ȑ,TT e Re  ,ff fe eR wAw@w;w6w1VpRlj& % X,B~  hj4 %  w057 7  5 ,&&, e* e$5 q t% % ~ "   ," w,   ,Fw m7E77P@m7E77׭ !a׭׭ Cעۂ!E ҂ ׭jc0\׭W$׭N ׭G@B:> @   5( 5 5 5D7 >Ç6ÇwܿB& % ZCl S~-B, b% AB& P% 8TCl S~t7 n 7 lB, % B& %  Cl S~ %  wʸ8w¸wB׭T5\zvнeU e ( e (-">vr2m^7*e$5 -j 7 8m4-R & & & ew޼* ̼7r7Ҽw7 ޼ 2% ؆ V@m@`7 w@ x~ `7nZwh7fwd7bw`&J@B6& eh" $4 , wx500 33l1DATADATADATADATADATADATADATA 5w@55   de7 55 m- Ge5,5̼  zm-j edeѕѝTѝPѝZѝWѝTѝQ5ѝnѝk b ζ X b  5H @m4,7 0 mm75X 7 R5-5w#5ڻ-l°-d 1T ex :  z ee w.e& ҝҝ&ҝ#   ˕J ˕  6 ow,i v  6 6 6 NeEe, @-"ov6 5   6  e 5vBp Pe F ) e e4 -4 ewB 5&hNU e@ ( T|U eh  T ew`R5  4 0-zz5|&5,7 x&l  #Cc є  e -ȸ]h5`-5 ,+5wڸ$ -ʸ 5w  5 - ׭=">m<8W @E @E !  ~ ,wʸ4w¸8ww:ƽmཬ- & & & Hewzֳ(x"7r7~w7  % ؆njf<V ,Pm>`w8 476 &, ~ 7w7w7wԼ& e >7 <7 ^7 \NU ʳ% "wjm 8w 6m0 mve5Z r5wf57|7yer7 r  5@5 < e7 $  AwR " (m(-3  e me-* $m ȝ 7  zm-h be1 ѕɝFѕѝ<ɕw484  wJѝDѝA ae m(pllhc5 mлmȻ7v57 5ҽ^5ȽFV5&7  wz-°- 1T  e5!55 mbȝVSNI>7 <  e,NU %U %5   ޷e7 "e f-  -0wN-"RNX7V\D e }\m [ ɝ>;6 ɝ(% ɝbD e N  7ȿĿ\D ~e ( ɝ ɝ ɝ ɝbD e #  \T NeHt mm<ɝ.+&!7  | ,44V r[q$V r7003I20eaekSYSYSYSYTICLSYOVN(W(Wr^t!Ne?E? & f Yi*w Zfe 5teB e:   @ @ C: `UC B d V`ef   d     ;a @  W f Е- eePPPЕ- Е 50e %< f< f @ (Օ: 5Օ: @e e0e0U&@ X %0 AUUUU    T T T T ee(e(e(e(T $)T T TU U U U  &f!  E D  E E C B Ί A @    e  T T T T H1CdT T L $)dL t dL d  JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC&  m %VPVPSY:CMI.CMDCMI >P"@P & P#@PPZ Pw ' UD$BA &( U BQ lЕ*  w  ť ť 0B Aa & & @( pf  e ee e <w2 &f& v TI0:RMSBCK.LIS ~ P ff P 5ff eP . & & &  &f& & & Ε P 5& |P fP . & & &  &f& & & Ε P &f w   wr&f 1e? ww & fYw  nw`j  54A ? 0033l1DATADATADATADATADATADATADATASY:SY:eE  &  m  bABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& ev/& e*AHŀ ȕ Е Е Е & e< & e(Е A %& eA Е A bEA EЕ A A   $Е.  AЕ; z    w D&& bЕ- eaePPPЕ-$w D  &Е. ce  Е:   B &w4 vC3 3  ,, UEs3w(t&f B * ͋'% ͥ!ͥE%,  D5  PB2 %pċ5J J J @ EͥAA I& TI& TI h  ,,& C '`'7 (7 7  7   05 5   !& | ee Z NeX <eX *& & &  l&& & & Ε  67 xr7j " BCK>%BCK-I-ID, RMSBCK Version 2.104 (March, 1986) Copyright (c) 1986, Digital Equipment Corporation'&1 < 4Z ! ,l ! $l "$ l <" ~ !  !  -5ew , Bv    5Bw 5  (5(UW       wE5 E  W ͇5  ,E T&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U 5 ߥ& *  + 23E Ew 4   Е-   0@A DW e`fÊ    E &  m  f A N  %w eE D` bl lr00"3I20eaekw \  B eE"s    s-  Csl&f &   `@ ` B   & A @    &ff r[qr[qB6 FLBB r@ 6 IqMt!@ $ IqM!@  IqM! U(U!!Z 1ul!$H l 3!H ~ E,!, H :d!0 H Z qQ#  # &%# w&- D! ""'l. e*l. !r.l. !s1l.0 2!BuCR3l. t44H U,TX!TX!TTTTT!& & & & f& & & Ε "AO#F$L%% RMS-11 Version 2.100 Backup Utility Function: Backup RMS-11 files Format: outfile[/option(s)]=infile[/option(s)][,infile[/option(s)]...] For magnettic tapes, the output file specification must not contain any wild carded fields. For disk files, the filenam and extension must be wild carded, that is *.* Global options: ? or HELP type this help message ID identify current version number [NO]QU enable or disable query mode SL[:filespec] write a summary listing [to the specified summary listing file] Outfile options: NV create new versions of output files RA read data after writing RC read and compare data after writing RW rewind the output magtape before writing SU supercede existing files Infile options: CD:dd-mmm-yy select files based upon date of creation RD:dd-mmm-yy select files based upon date of revision Date strings are matched exactly by default. However, dates which occur either before or after that specified can be selected by adding the date modifiers :A (after) or :B (before) after the date string. The /CD and /RD options cannot be used together on the same input file specification. File specifications are in standard format: device:[directory]filename.type;version Wildcard characters such as '*' or '%' are valid in the directory, filename, type, and/or version fields of the input file specifications. ,w0wwHw8www& ŀ Ћ az  w x0 00 ppM $w`w \    .%w0"0 ep" lp0  *" ` D `WaWz 0,wɥ;&ww%7   Hw ŀ&  Հ &^&` `^V `W-ŀ `w4wrw  ɥ@0 p @ @  ^ 0 00w&^&` `^w T-00 00000Uj0 0000% w t \" |0 U%  eE 4`0  (e)E00*33l1DATADATADATADATADATADATADATAj0`0^ 0n5j ^h h U% e)0)f & 2נ/נ נ   נ נ RՀC7 &fw 7 7 @,q `-KacJE[ !mfb@  ) L R  .7. f@  &  5]U E :&@E A  ̆  E vE c }xu @  . V&fNH&     8  " .$   ̥ZḀ90     f2eEe~  R0 p 0 0 eR  5 deU5 JeU 5 0eU5eU|5@teU@b5ZeUH5@eU.5&eU5 eU 5@zeU@5@`eU5FeU*-e -  et-ndld-^d@7 >7 <7 < 0 ($$e n 7 `  A1  7 7 ]7 |zrp. b7RNLDIDENTIFICATIONVERSIONCDEDIDENTIFICATIONNOQUQURDSLVERSIONJANUARYFEBRUARYMARCHAPRILMAYJUNEJULYAUGUSTSEPTEMBEROCTOBERNOVEMBERDECEMBERIDENTIFICATIONNOQUNVQURARCRWSLSUPERCEDEVERSION&&&&&&&&&&&&&&&&&&''''('7'<'?'B'E'H'K'N'X'' *'''%'ʄȅ'',%')'ʆ%ȁ')'=/D%D%%( (((((* (% (.<(;h(@ (@ (z(* <(% <(.h(;h( <( <(z(* z( h(%_(Ҁ$(_(:(Ԅ([6&% (* ( (,% (* ( (]0&[6&%@ (*@ (  (  (]0&/)&$ D)@$  D)D%t$$Z$ D)%*D%:̂^%- ) ) ) ) ) ) ) ) ) ) ) )-̂z%:)A B /D%t$$$$$$%**%D%:*<&ȃ'%\&?4*HEL Pʜ w x w n& W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C ,w0wwww w& TI wN rn&5,e5(ff e  ff leu77  5,e5(ff Fe >އ7L7 N7 J7F7 Uff e%lj %-ezff eE -^ FĆ-L-Dff Veff >e5 n J 8f  ff e   * # " '  #  -0023I20eaek/5,eu(ff e Q(2< 2585I75 7 "&"375,e5(ff Xe 82 * -@@ @@ hlw(P TX`dwJ H : f tt ww~    e     &BACKUP ePE$  ZP P P10e0$PPPP P PPPPPPPPН@Н<8e\PUKCAB Bd@ Ýᗢ:ҋ Ý& 5@ 4 ff e5 xw   ҝ[R-&&&->&' '$7 & P %%R-S-PROCOM, File %VA (%I) backed up with %I%D blocks%D blockemptyno errors%D error%D errorsv7 t ed` \Zff e =7 TLZP 6w,w  75Z  7~  f &(7 ff he  %% w w w eexw v 5 &5 (ff e8&4( X &(& & &  5t)& & & Ε & & & & & & & & Ε @Aff ^e u  5B 7 nw& 05 , rlwf`x`)$,'`-b-d-&'* %BCK-I-NXTVOL, Additional output volume required 5,e5(ff e ff e.5E5U5 Uff e 7 8R7 PJff Re6w,w h,  h,  ,  ,h, F&5Ҝ  ҜҜ5@Ҝ   ), D)(u,%VA%VA%VA%VA%VAZmff ve%3 l ,P  P P f   DJN&mJݵ `w - - !l. d$H` ` $ $; $ 5 5 5$$ 5$$$$w $  "!(!(!( 42!l.7    w5    7 ܱ7 ܡ  $.<.f& 8.y Do you wish to continue?  .. - l. l. !l.00:33l1DATADATADATADATADATADATADATA2 7%  P 6/ e .  $̵   @/P  f C$ss ̵J, R(C&̵ʜ ̵ʜ ̵rp ?BCK-F-%I?BCK-F-UNKERR, Unknown error code %POPNINP, Error opening %VA as inputCREOUT, Error opening %VA as outputPARERR, File specification %VA in errorNOFILE, No files matching %VAOUTDEV, Output files can reside on disks or tapes onlySYNTAX, Syntax error "%VA"CONOPT, Conflicting option "%VA"CMDOPE, Error opening %VA for command inputCMDGET, Error reading command from %VAGCMLER, Command processor errorDEPEXC, Command file depth of 4 exceededGCMFIL, Error in command file name %VAWCDERR, Wildcard processing error %VABADSUP, Output files on tape cannot be supercededBADREN, Output files on disk cannot be renamedBADREW, Output option /RW (rewind) appropriate for tapes onlyINPDEV, Input files can reside on disks onlyCONFAL, Stream access to file %VA failedWRTERR, Error writing to output file %VAREADER, Error reading from output file %VARCHKER, Check failure on file %VA block %Df//////0K0m0000 151\1111,2V2223 5% P . e *7E̵ Jr.P -RMS-E-ER$%I-RMS-E-ER$???, Unknown error: STS=%P, STV=%PACC, Access errorANI, Not ANSI "D" formatATR, Attribute read errorATW, Attribute write errorBKS, Bucket size too largeBUG, Internal RMS error condition detectedCHK, Bucket header corruptedCRE, Could not create fileDEV, Bad device or inappropriate device typeDIR, Error in directory nameDME, Dynamic memory exhaustedDNF, Directory not foundDNR, Device not readyENT, Enter function failedENV, Required RMS support not presentEXT, File extend failureFEX, File already existsFID, Invalid file-IDFLK, File is locked by other userFND, Find function failedFNF, File not foundFNM, Error in file nameFUL, Device or file fullLBL, Not ANSI labeled tapeOPN, Open function failedORG, Invalid file organizationPLG, Error in file's prologuePLV, File prologue version level unsupportedPRV, Privilege violationRAT, Illegal record attributesRER, File read errorRFM, Invalid record formatRPL, Error while reading prologueRTB, Record too big for user's bufferSYS, System directive errorTYP, Error in file typeVER, Error in version numberWCD, Wild-card encountered where not allowedWER, File write errorWLK, Device is write-lockedXTR, Extraneous field in file specification //`7/PR/@n////@/00 <0[0u0000`0X1@10<1 W1l111P101 12C2]2}2p2222`30/3M3{3332 5%  .P  .އ J.-RSX-E-IE.%I-RSX-E-IE.???, Unknown code %PVER, Parity error on deviceEOV, End-of-volume detectedWLK, Write attempt on locked unitABO, Request terminatedRSU, Shareable resource in useBYT, Odd byte count of virtual addressBLK, Logical Block Number too largeNOD, System dynamic memoryIFU, Index file fullLCK, Locked from read/write accessHFU, File header fullWAC, Accessed for writeCKS, File header checksum failureRER, File processor device re00B3G30eaekad errorWER, File processor device write errorSNC, File ID, file number checkSOC, File ID, sequence number checkCLO, File was not properly closedNBK, File exceeds space allocated, no blocksBDR, Bad directory fileRNM, Cannot rename old file systemBBE, Bad block on deviceFHE, Fatal hardware error on deviceNFI, File ID was not specifiedEOT, End-of-tape detectedBHD, Bad file headerOFL, Device is off lineBCC, Block check, CRC, or framing errorNDR, No dynamic space availableBTF, Bad tape formatALC, Allocation failureULK, Unlock errorWCK, Write check failure../*/B/a//////0-0O0u00001/1G1j111111 252U2j222fEB`F ~ . ӥ:  ӥ:@! $  @! U`eUU5U mɥ[ɥ<"@  ˥.   z0Q UDeĤ _ Uċ5E  lU0 E pU5 . 5E0 U L. x; n Ċ- bU " & N ӥ"   U5CM% E A5Q`C _C&  p2 && ˥A˥Z˥a˥z ˥*˥% ˥$˥_  ˥0 ˥9 ˥7 U   ˋ˥ ˥ w H& & &~ l4/D5% Wqmae &  NaB a D eD <R~. t @ A B C @ D eA B C eB C   a%daAaB C U:Yw/M|s,?6?6V r[q$V <SYSYSYSYTISYOVN([([Z:!DRDRDRDRTIDRDB?6Xn,N>500J33l1DATADATADATADATADATADATADATAe?E? & f Yi*w fe 5teB e:   @ @ C: `UC B d V`ef L  d :  ,  ;a @  W f Е- eePPPЕ- BЕ 50e %< f< f @ (Օ: 5Օ: @e be0e0U&@  %0 AUUUU    T T T T ee(e(e(e(T $)T T TU U U U  &f!  E D  E E C B Ί A @    e  T T T T H1CdT T L $)dL t dL d  JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC&  m %RPRPSY:CMI.CMDCMI >P"@LPP Q &P#@OPO PV OPNw 4' UD$BA F&( U BQ Е*  w  ť ť 0B Aa & & @( f  e ee e <w^ &f& v &f w   w\&f 1e? ww & fYw  nw`j  506A2 ?2 SY:SY:eE l& &.  m  bABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC00R3G30eaekw && D¥%  B&ХVA C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & et 6& e` /& e*AHŀ ȕ Е Е Е & e& & e Е A %& e A Е A bEA EЕ A bA   $Е. J AЕ; d    w D&& bЕ- eaePPPЕ-$w D  &Е. ce  Е:   BTI0:RMSRST.LIS B D B n *Dff D5ff eD " & & &  &f& & & Ε D 5& |DfD " & & &  &f& & & Ε D  Nw4 C3 3  ,, UEs3wJ&f B * ͋'% ͥ!ͥE%,  D5  PB2 %pċ5J J J @ EͥAA I& TI& TI hMd N,& .C ((7 7 7 x  nff7d   0N5 5   !&  ee | peX ^eX L& & &  qj& & & Ε J 7 @:72 7  RST>%RST-I-ID, RMSRST Version 2.103A (September, 1985) Copyright (c) 1985, Digital Equipment Corporation'&1 <J 4 4" , l" $ $  "  8"  d" F!/5ew , Bv    5Bw 5  (5(UW       wE5 E  W ͇5  ,E 8 XL&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U 5 ߥ& *  + 23E Ew 4   Е-   0@A DW e`fÊ    E &  m  f A N  %w eE D` bl lrw \  B eE"s    s-  Csl&f &   `@ ` B   & A @    &ff r[qr[q0j ntNjjJ 8 r@\ 8 IqM!@J n IqM!@J \ IqM "8 J U(U"4" F!1ul4"0 [q34" [qE,4"D [q:d4"4 [qqQ!h$$ [q "h$! [q&$&"! 4![qr %'!"![q2)& ![q!+/hX!![q"",0F!j![qe/0F!|!r30F!!s600F!!BuCR80F!X![qt906 U,NN!X!:00Z33l1DATADATADATADATADATADATADATAf"& & & & f& & & Ε ~"n#e$/%& RMS-11 Version 2.100 Restore Utility Function: Restore backup files written by RMSBCK Format: outfile[/option(s)]=infile[/option(s)][,infile[/option(s)]...] The output filename and extension must be wild cards, that is, *.* Global options: ? or HELP type this help message ID identify current version number [NO]QU enable or disable query mode SL[:filespec] write a summary listing [to the specified summary listing file] Outfile options: [NO]CV disable or enable version radix conversion FR alter protection codes NV create new versions of output files RA read data after writing RC read and compare data after writing SU supercede existing files Infile options: BD:dd-mmm-yy select files based upon date of backup OA:[dirspec] select files based upon the original account SE:speclist select specified files for restoration from the specified backup container file(s) Dirspec is an acceptable directory specification which may or may not contain valid wildcard characters. Speclist can either be a single file specification, or a series of acceptable file specifications enclosed by a parenthesis pair, and separated by commas. File specifications are in standard format: device:[directory]filename.type;version Wildcard characters such as '*' or '%' are valid in the directory, filename, type, and/or version fields. ,wz0wrwjHwb8wZwRwJ& ŀ Ћ az  w R0 00 ppM $w`w \    .%w0"0 ep"  lp0  *" ` D `WaWz 0,wɥ;&ww%7   Hw ŀ&  Հ &^&` `^V `W-ŀ `w4wrw l ɥ@0 p @ @  ^ 0 00w&^&` `^w T-00 00000Uj0 0000% w N \" |0 U%  eE 4`0  (e)Ej0`0^ 0n5j ^h h U% e)0)f & 2נ/נ נ   נ נ RՀC00b3G30eaek7 &fw 7 7 @,q `-KacJE[ !m@  ) L R  j7j f@  &  5]U E( :&@E A  ̆  E vE c  @  . &f6$     8  " .$ B  8̥ZḀ90     feEen 40 p~0 0 lbe\R  5HeU654eU"5 eU 5eU5neU5@TeU@5:eU5 eU5~eUl5deUR5 DeU 25@0eU@5@eU5eU$-e^-  eD-dl-d~7 |7 z7 z n fbbZ\e 7 r A10,( $  7 7 7 7 ]7 42*( 2 7H 5Em 5 7tplje5ۀVPE 5F 7>|*x&v"n eIDENTIFICATIONVERSIONBDIDENTIFICATIONNOQUOAQUSESLVERSIONJANUARYFEBRUARYMARCHAPRILMAYJUNEJULYAUGUSTSEPTEMBEROCTOBERNOVEMBERDECEMBERCVFRIDENTIFICATIONNOCVNOQUNVQURARCSLSUPERCEDEVERSION'''' (((((($(,(5(;(A(E(J(O(V(`(h(q(z(}((((((((((((+B)(2)&)ʄȅP) ),&)b* )ʆ&ȁP)D+6)=/%%h&)`))n)6*n)*n)%n).);)@n)@n))*)%).);))))*))|&_)Ҁ$)_):)Ԅ)[&%)*)),%****]&[&%@<**@<* <* <*]&/f*$*% %@% +Z%%+%+%:̂&-++++++++ + + + +-̆,&:'ȃP)|&':((+ȅ4+ȁ4+),(+'ȃP)|&H'/$$%$ %&%Z%t%%%+%%:+'ȃP)|&"'?+HELPʜw < w 2& W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C ,wz0wrwjwbwZ wR& TI  wH&5,e5(ff e  ff leu775,e5(ff Fe Bއ77 7 77 @U ff e%lW %-eff e7 E - &†-ff Ve nf ff 6e &% h @ 25 DŒ A h$ v$ F!/00j33l1DATADATADATADATADATADATADATA5I5@5 555 5 e5,e5(ff e N'2 Dx|x=7p5,e5(ff .e L#(2B 85   2&  5  F!/hlw@7  e TVff e .\7 7 7 Vw h  7~5 t 7hn nfV5 &5 ( \&X(ff e<&8( e$w "*$x%&&r%&&&&p% !& 4!' 4!) x4!) p4!$* h4!& `F!/V:O5L  %E ?e|w z  r* '58 55 @m",5Z h l5 (w5  5  w, &\ 7, z"!) r"!, j"!\( b"!* ZF!/@@ @@   5׭ ( ,;  %B`ʕ 5Z 5L  > & 5Z    (3,&  Z&  T NpmrW$BAW$CKW$UPeW$PUW$KCW$AB   ,  * 6 5,e5(ff eD& H*  H* me Bh* h*H* Ҝ 52 2ҜҜҜ5@" " %* %(u,%VA%VA%VA%VA%VA m,  E52U5 5 ff Ve% <ff ex7 v7 x5\ 5Z 5^5_5`5a05b15f 5d"5h5j747,7(7$7 5\5^5^5_5d 5b 5l15m05n5p7777f7h7j58 F5 05  |5  WQ (/ 86/; F/ "D/ xL/ j & ݄݁鷓N/ mBe N/ F  A Ln/ Ben/ N/5 l5 DE r!5 DE V5DE 8 Հ50U 5T    5@ &E%  X "!(!(!(N/ DmTBe N/  e nDN/ / 6e/ "/ J" r, 2 [ 4< ,,   ]> Ћ & *0 !  ea   , p F!/ !0 !000r3G30eaek5 5 ff e5@ wRsҝmdW- '''R -H'''.'D r %%R-S-PROCOM, File %VA (%I) restored with %I%D blocks%D blockemptyno errors%D error%D errorsV   $% V^ @,zwJ,hw8,=  6e:w 8D<&m &&(ff e&( ew V5  5/@Auff de Zlw&u 5 B  j7 B@f,, 7,< 7,67, 77& & &  )& & & Ε  wRESRWT - Rewrite Table& & &   *& & & Ε  wvRESRWV - Rewritten VBNs& & &  X*& & & Ε Zw*RESSPT - Suspect table F!/7   w5  , . 07 7 ^  HX!0 @j!0 8|!05 7%d D0 e . ̵  .0D t f C$ss ̵J, R(C&̵ʜ ̵ʜ ̵?RST-F-%I?RST-F-UNKERR, Unknown error code %POPNINP, Error opening %VA as inputCREOUT, Error opening %VA as outputPARERR, File specification %VA in errorNOFILE, No files matching %VAAPPERR, Error opening %VA for appendSYNTAX, Syntax error "%VA"CONOPT, Conflicting option "%VA"CMDOPE, Error opening %VA for command inputCMDGET, Error reading command from %VAGCMLER, Command processor errorDEPEXC, Command file depth of 4 exceededGCMFIL, Error in command file name %VAWCDERR, Wildcard processing error %VAREADER, Error reading backup file %VANOTBAC, File %VA is not a backup fileSELUSE, Input option /SE (select) appropriate for tapes onlyBADOUT, Output file specification is in improper formatCONFAL, Stream access to file %VA failedWRTERR, Error writing to output file %VAREADER, Error reading from output file %VARCHKER, Check failure on file %VA block %DBADVAL, Bad option value "%VA"OUTDEV, Output files can reside on disks onlyINPDEV, Input files can reside on disks or tapes onlyILOGBD, Input option /BD (backup date) appropriate for disks onlyINPPRV, Insufficient Privileges to Create %VA as outputCLOOUT, Error closing %VA as output161[11111242\2}22223D33334;4g444405i55 5% D|0 e 7@E:̵Jr0D h -RMS-E-ER$%I-RMS-E-ER$???, Unknown error: STS=%P, STV=%PACC, Access errorANI, Not ANSI "D" formatATR, Attribute read errorATW, Attribute write errorBKS, Bucket size too largeBUG, Internal RMS error condition detectedCHK, Bucket header corruptedCRE, Could not create fileDEV, Bad device or inappropriate device typeDIR, Error in directory nameDME, Dynamic memory exhaustedDNF, Directory not foundDNR, Device not readyENT, Enter function failedENV, Required RMS support not presentEXT, File extend failureFEX, File already existsFID, Invalid file-IDFLK, File is locked by other userFND, Find function failedFNF, File not foundFNM, Error in file nameFUL, Device or file fullLBL, Not ANSI labeled tapeOPN, Open function failedORG, Invalid file organizationPLG, Error in file's prologuePLV, File prologue version level unsupportedPRV, Privilege violationRAT, Illegal r00z33l1DATADATADATADATADATADATADATAecord attributesRER, File read errorRFM, Invalid record formatRPL, Error while reading prologueRTB, Record too big for user's bufferSYS, System directive errorTYP, Error in file typeVER, Error in version numberWCD, Wild-card encountered where not allowedWER, File write errorWLK, Device is write-lockedXTR, Extraneous field in file specification00`0P0@161b11@101 12!282T2{2`2X2@202 3313K3Pg303 333 4)4p?4[4~44`4044'5>5[5Z4 5%  P0D J]0-RSX-E-IE.%I-RSX-E-IE.???, Unknown code %PVER, Parity error on deviceEOV, End-of-volume detectedWLK, Write attempt on locked unitABO, Request terminatedRSU, Shareable resource in useBYT, Odd byte count of virtual addressBLK, Logical Block Number too largeNOD, System dynamic memoryIFU, Index file fullLCK, Locked from read/write accessHFU, File header fullWAC, Accessed for writeCKS, File header checksum failureRER, File processor device read errorWER, File processor device write errorSNC, File ID, file number checkSOC, File ID, sequence number checkCLO, File was not properly closedNBK, File exceeds space allocated, no blocksBDR, Bad directory fileRNM, Cannot rename old file systemBBE, Bad block on deviceFHE, Fatal hardware error on deviceNFI, File ID was not specifiedEOT, End-of-tape detectedBHD, Bad file headerOFL, Device is off lineBCC, Block check, CRC, or framing errorNDR, No dynamic space availableBTF, Bad tape formatALC, Allocation failureULK, Unlock errorWCK, Write check failure|00000 141X1s111111!2H2h222223/3S3r3333344.4@4fEB`F ~ . ӥ:  ӥ:@! $  @! U`eUU5U mɥ[ɥ<"@  ˥.   z0Q UDeĤ _ Uċ5E  lU0 E pU5 . 5E0 U L. x; n Ċ- bU " & N ӥ"   U5CM% E A5Q`C _C&  p2 && ˥A˥Z˥a˥z ˥*˥% ˥$˥_  ˥0 ˥9 ˥7 U   ˋ˥ ˥ w & & &~ l0D5% Wqmae &  NaB a D eD <R~. t @ A B C @ D eA B C eB C   a%daAaB C U:Yw/M003G30eaekr[q? HU%  .w* wDw a ^ (0      $$ ((  ,0<84@D, H      C A @   f A #  &  m 5 f eC  CPU  ,, &. 0 0   ,`w3   f %w C55  `0 VC 3 5  @ss   1 1 5 5  "` 0 1 1   x  f &V  A  B,D 5  5 A     8 1 1 1     p55    >      b  w "& d   @@ @ 9C@&e$e& Μ N<B>& 2mB>o  o "j d `[ ]Ҭ V  Ue  5`昃`$EEˊˊE & ˤ!%   cc   9e    A>55,<lɥ fEÊ֥  P &&e *eLPuw w  "` &&   f&& ע , , A`  & p   eAm:CEeB@ & &  CR  &VP5Lxn nff ea ENe LuH=w $E Aaa &EC ez.*Ee{XE" Qc & &f& e  fu%e.e.(P(eXw^`% N/,%e% PQ4& ߥ&1  8PKQr 8&9 %솀w +3 3@    #  .0 µ1!0  5 55   e5& Y5 T SP K  E >  5&@@   ) % e  C   r  &V p 0 p 0    5w     @  ppp 0 0 0  1 1 1 . (f& 00033l1DATADATADATADATADATADATADATA1, 1, & 4 A`!  && &V veN*PU5D e0  S R  ,rw( ` u J AeLKUˊ#E@ * P5" < 05EB5 J HˋQ M ̥ I5 5A@p 8 ȥ 45  % D`P`_ ,/O&PXVUTSEEuB 5 =/5 *@ %E E E  M͊    ` ͊ ugEE5 p U H  5@\ .% - / &,3e"5550% @L @   %P EewJup1  5 E #  | * j P PJ!  e.( 3  H &1u= (  24 FHE} H 8A  )    Hs3(f A-fL* .H@ D,*SAe@``f A 4  .   &f .D̥  w f 2 & 2r  4  8 <0w d& l   &ap aB#E   *   uD5e`w eE< .f ,2  , ,p l J a b! ZP PH  8P PH f  %5w  #5 ȥ ȋ5ȋ1 1 ".#Հ && rpp  f `0   0  &f 0 &V &  K&1 . 1  ̥ @ $ ! 1  ŀ f&& x pp  @ BeE3   0 f >  @ B fE 2   U jC `5L H& && 5 r, r, ` ^ E e(" eb `vl %  & ̥ 4 f f J Ɋ  !.p,p, &f& & & C B .66  >5555 B     &&  0 .   Te q r,r,   Ê @eL  V 1 1 &V & nB  p p- 5 84 595 - 9\  I' Q5KA@!Af9f:: 9 :9 z!g9$5 : 9 f&&  @5K Jņ%!*5 86 55 A@ tt  B9- t t 5 :w "`4  554 5 <>B@ t 5 : z&D4 4  Bm@.C@# UE;C@ .@<’  4-   t4    V  && t5fLV f@&  E `9J@m:ȵPD& & EeeҔ ȵ    &74  v&  - @eL.4  j0 .e&& ^@  zfLV   r "`  < %+%0  * . C@ %    "`&& %` fLV & 5@ b @@& e$cÒE eccBm>    003t3t3eaek (t 59&& &l :U,:` 9wCm: "9wh:5: < s>59wB9œE  e` D˵˵˵em <B@ ,W m emv` <N  8A@A E mv` ˵’ee`ef v` <  9 5,mweE,C:6`” A@µEe   A@ ˊפ ` El `: ff f4  \ e4    v "`  V4 .01* ; PKW105 - IMPLEMENT NEW BBR ALGORITHM) ; PKW106 - ADD MULTIPROCESSOR SUPPORTR8 ; PKW107 - ADD DEFINABLE HOST AND CONTROLLER TIMEOUT9 ; PKW109 - ADD QUEUE OPTOMIZATION SUPPORT AND CLEANUPH7 ; PKW110 - REMOVE STATE PROCESSING FROM AVL AND ONLA ;N ; J. MELVIN 2.02 < ; JJM300 - ALLOW SETTING DENSITY ON MULTI DENSITY DRIVES ; ; G. MARIGOWDA 2.03) ; GM100 - CORRECT LBN RANGE CHECKING 2 ; GM102 - SUPPORT FORMATTING OF RX33 DISKETTE ;M ; J. MELVIN 04-JUN-86 2.04K= ; JJM300 - CORRECT ORIGINAL JJM300 TO STOP POOL DEPLETIONC ; ; G. MARIGOWDA 18-JUN-86 2.05> ; GM103 - STOP RECURSIVE CALL TO DRIVER DURING SHADOWING ;O" ; P. K. M. WEISS 26-JUN-86 2.06= ; PKW112 - PUT E$$LOG CONDITIONALS BACK THE INSTALLATION V1 ; SYSTEM DOES NOT HAVE ERROR LOGGING  ; ; J. J. MELVIN 18-JUL-86 2.07; ; JJM313 - DO NOT LOG ERROR PACKETS FOR 'AVAILABLE' CMD  ;0 ; G. MARIGOWDA 18-AUG-86 2.10; ; GM104 - SAVE AND RESTORE REGISTERS BEFORE AND AFTERC4 ; THE CALL TO $IODSA TO FIX SHADOWING PROBLEM ;G ; J. MELVIN 6-NOV-86 2.12) ; JJM303 - REMOVE UNNEEDED CELLS/CODE  ;G ; J. MELVIN 10-NOV-86 2.13 1 ; JJM314 - DO NOT SET EOT ON REWIND COMMANDSD ;A ; J. MELVIN 29-NOV-86 2.14 7 ; JJM321 - USE $IDENT TO IDENTIFY MODULE AT RUNTIME  ;. ; J. MELVIN 29-NOV-86 2.15J* ; JJM308 - REDUCE DATA STRUCTURE SIZES ;M ; J. MELVIN 29-NOV-86 2.16A0 ; JJM307 - MAKE SIMPLE/OBVIOUS OPTIMIZATIONS ;B ; J. MELVIN 29-NOV-86 2.17C% ; JJM304 - CLEAN UP COMMENT LINES ;" ; P. K. M. WEISS 11-NOV-86 2.209 ; PKW119 - MOVE QUEUE OPT. PKT CHK TO CLASS FROM PORT1 ;- ; J. MELVIN 6-JAN-87 2.219 ; JJM323 - USE PROPER REGISTER IN ACCEPTANCE ROUTINE- ;1 ; G. MARIGOWDA 25-JAN-87 2.22+ ; GM112 - CONVERT TO USE EXEC VECTORINGV ;- ; G. MARIGOWDA 29-JAN-87 2.23/ ; GM113 - CHANGE CMDONL TO ONLSIO IN CMDFMTO ;2 ; J. MELVIN 05-FEB-87 2.24E3 ; JJM325 - VECTOR $MPPRO AND PLACE IN PUCOM FOR6 ; ITS USE IN VECTORING  ;N ; J. MELVIN 01-JUN-87 2.25E6 ; JJM350 - SUPPORT SINGLE DENSITY DRIVE/CONTROLLER ;  ; J. MELVIN 15-JUN-87 2.26 1 ; JJM353 - DO NOT SET MD.CMP FOR COMMANDS NOTG" ; REQUIRING IT (EG. IO.RLB) ;G ; MACRO LIBRARY CALLS2 ; C .MCALL HWDDF$,UCBDF$,SCBDF$,ABODF$,PKTDF$,UDADF$,KRBDF$ ;PKW109J .MCALL QIOSY$ ;GM112 QIOSY$ ;GM112% ABODF$ ;TKTN MESSAGES ;GM112E) UDADF$ ;(T)MSCP DEFINITIONS ;**-3  SCBDF$ ,,1 ;SCB DEFINITIONSE HWDDF$ ;HARDWARE REGISTERS-' UCBDF$ ;UNIT CONTROL BLOCK OFFSETSL4 PKTDF$ ;IOP DEFS (WITH DSA IP.XXX DEFS AS WELL). KRBDF$ ;KRB OFFSET DEFINITIONS ;PKW1090 JMPTBL PORT ;PORT ROUTINE OFFSETS ;PKW109 .PAGE ;**-28 .SBTTL JMPTAB - JUMP TABLE FOR VARIOUS CLASS ROUTINESN;===========================================================================G; THE FOLLOWING JUMP TABLE --- MUST --- BE DEFINED A00t33l1DATADATADATADATADATADATADATAS THE FIRST THINGTF; WITHIN THIS MODULE. VARIOUS PORT DRIVERS EXPECT TO SEE THIS TABLE; AT 120000.; J; BE CAREFUL WHEN ADDING NEW ROUTINES TO ADD THEM TO THE END AND TO ALSOL ; DEFINE THEM IN THE MACRO JMPTBL IN DSAPRE.MAC (WHICH CONTAINS THE OFFSET$!; DEFINITIONS FOR THESE ROUTINES.)N";===========================================================================O"XXBEGN::.WORD MAJOR*256.+MINOR;COMPONENT ID (SET UP IN $IDENT MACRO) ;JJM321 +$ .WORD CLADAT ;DATAGRAM HANDLER ;**-1A$% .WORD CLAEND ;END PACKET HANDLER*& .WORD CLAERR ;PORT/CLASS ERROR HANDLER+' .WORD CLACMD ;(T)MSCP COMMAND INITIATORL( .WORD SCUCB ;SCAN UCB LIST2( .WORD CLASYN ;CLASS SYNCHRONIZATION ;JJM321) .WORD -1 ;TERMINATOR2; ;**-83; LOCAL DATA4;I4; ;GM112S14; EXECUTIVE ENTRY POINT VECTOR TABLE ;GM112=4; ;GM112=4 ;GM112;4EXEVEC: .WORD 0 ; FLAG FOR VECTOR NOT YET FILLED ;GM112 4 ;GM112#4ALOCB: .WORD $ALOCB ;GM112#4ALSEC: .WORD $ALSEC ;GM112#4BLKC2: .WORD $BLKC2 ;GM112L#4BLXIO: .WORD $BLXIO ;GM112 #4CPURM: .WORD $CPURM ;GM112 #4CVLBN: .WORD $CVLBN ;GM112N#4DEACB: .WORD $DEACB ;GM112M#4DESEC: .WORD $DESEC ;GM112 #4DEUMR: .WORD $DEUMR ;GM112 #4DQUMR: .WORD $DQUMR ;GM112 #4DVMSG: .WORD $DVMSG ;GM112 #4EXRQF: .WORD $EXRQF ;GM112A#4FNERL: .WORD $FNERL ;GM112!4FORK: .WORD $FORK ;GM112$#4GSPKT: .WORD $GSPKT ;GM112$#4IODSA: .WORD $IODSA ;GM112$#4IOFIN: .WORD $IOFIN ;GM112$#4LDREG: .WORD $LDREG ;GM112$$4LOGER: .WORD $LOGER ;GM112%4MPPROR: .WORD $MPPRO ;JJM325E#4MPUB1: .WORD $MPUB1 ;GM112E#4QFORK: .WORD $QFORK ;GM112E#4QINSB: .WORD $QINSB ;GM112Q#4QINSF: .WORD $QINSF ;GM112V#4QINSP: .WORD $QINSP ;GM112X#4QRMVA: .WORD $QRMVA ;GM112N#4RCTPT: .WORD $RCTPT ;GM112R#4SRNAM: .WORD $SRNAM ;GM112K#4SCERR: .WORD $SCERR ;GM112S#4SCOFL: .WORD $SCOFL ;GM112I&4STMP1: .WORD $STMP1 ;GM112#4UMRWT: .WORD $UMRWT ;GM112R#4VOLVD: .WORD $VOLVD ;GM112O4; ;GM112P#4KISR5: .WORD KISAR5 ;GM112F#4KISR6: .WORD KISAR6 ;GM112I4; ;GM112 (4EXEVCL=<<<.-EXEVEC>/2>-1> ;GM1124; ;GM112D15IOPSEQ:.WORD 0 ;COMMAND PACKET SEQUENCE NUMBER :6LSTPKT:.WORD 0 ;ADDRESS OF LAST ABORTABLE IOP IN C.OLHD,7RADNAM:.WORD 0 ;PORT COMMON NAME IN RAD50)8 .RAD50 /OM/ ;END OF PORT COMMON NAME 09COMPCB:.WORD 0 ;STORAGE FOR PORT PCB ADDRESS1:SAVSTK:.WORD 0 ;SAVE STACK ADDRESS IN DELAYEDO'; ;CONTROLLER TRANSITION TO ON-LINEMGG .IIF DF E$$LOG KEEPR1: .WORD 0 ;TO HOLD R1 DURING CLADAT CODE ;**-11;HI .PAGE<I .SBTTL IOFUN - I/O FUNCTION TRANSLATION TABLE ;JJM304I ;PKW109OOIOFUN: ;**-5CO .IF DF,D$$DSK ;JJM3079O FUNCT RLB,RD,RD.L,CMDRLB ;READ LOGICAL BLOCK ;JJM307.:O FUNCT WLB,WR,WR.L,CMDWLB ;WRITE LOGICAL BLOCK ;JJM307O .ENDC ;D$$DSK ;JJM307DO ;JJM307TO .IF DF,T$$APE ;JJM307:O FUNCT WLB,WR,WR.L,CMDWLB ;WRITE LOGICAL BLOCK ;JJM3079O FUNCT RLB,RD,RD.L,CMDRLB ;READ LOGICAL BLOCK ;JJM307RO .ENDC ;T$$APE ;JJM307S ;**-3 T .IF DF D$$DSKU)V FUNCT LOV,RD,RD.L,CMDRLB ;LOAD OVERLAYP9W FUNCT STC,AVL,AVL.L,CMDSTC ;SET DEVICE CHARACTERISTICSJ0X FUNCT RPB,RD,RD.L,CMDRLB ;READ PHYSICAL BLOCK1Y FUNCT RLC,RD,RD.L,CMDRLB ;READ WITH READ CHECKL9] FUNCT LDO,RD,RD.L,CMDRLB ;LOAD D SPACE OVERLAY ;**-3,^ FUNCT SCF,RD,RD.L,CMDRLB ;SHADOW CATCH UP9b FUNCT WPB,WR,WR.L,CMDWLB ;WRITE PHYSICAL BLOCK ;**-3J3c FUNCT WLC,WR,WR.L,CMDWLB ;WRITE WITH WRITE CHECK 9d FUNCT WDD,WR,WR.L,CMDWDD ;WRITE WITH DELETED DATA MARK*?e FUNCT INL,GUS,GUS.L,CMDGUS ;INITIALIZE (FOR RCT REPLACEMENT)R,f FUNCT RPL,RPL,RPL.L,CMDRPL ;REPLACE BLOCK,g FUNCT RSN,0,0,CMDRSN ;READ SERIAL NUMBER2h FUNCT TRM,0,0,CMDTRM ;TERMINATE RCT 00t33t3eaekPROCESSING9h FUNCT SMD,FMT,FMT.L,CMDFMT ;SET MEDIA DENSITY ;GM102 ij .IFF ;D$$DSKk-l FUNCT EOF,WTM,WTM.L,CMDEOF ;WRITE EOF MARKF*m FUNCT SPF,REP,REP.L,CMDSPF ;SPACE FILES+n FUNCT SPB,REP,REP.L,CMDSPB ;SPACE BLOCKSE*o FUNCT RWD,REP,REP.L,CMDRWD ;REWIND UNIT;p FUNCT RWU,AVL,AVL.L,CMDRWU ;REWIND AND TURN UNIT OFFLINEDJp FUNCT SMO,AVL,AVL.L,CMDSMO ;MOUNT AND SET TAPE CHARACTERISTICS ; JJM300:r FUNCT STC,ONL,ONL.L,CMDSTC ;SET CHARACTERISTICS ;**-1>r FUNCT SEC,GUS,GUS.L,CMDGUS ;SENSE CHARACTERISTICS ;JJM307:s FUNCT DSE,ERS,ERS.L,CMDEOF ;ERASE (DATA SECURITY ERASE)(t FUNCT ERS,ERG,ERG.L,CMDEOF ;ERASE GAP7u FUNCT RLV,RD,RD.L,CMDRLV ;READ LOGICAL BLOCK REVERSESvw .ENDC ;D$$DSKx>yEIOFUN: FUNCT 0,0,0,ILEGAL ;ENTRY FOR ILLEGAL FUNCTION CODEz;F0{; FUNCTION TABLE ENTRIES FOR INTERNAL COMMANDS|;D4}ONLFUN: FUNCT 0,ONL,ONL.L ;ONLINE (T)MSCP COMMAND=~GUSFUN: FUNCT 0,GUS,GUS.L ;GET UNIT STATUS (T)MSCP COMMANDA3ABOFUN: FUNCT 0,ABO,ABO.L ;ABORT (T)MSCP COMMANDN7AVNFUN: FUNCT 0,AVL,AVL.L ;AVAILABLE (T)MSCP COMMANDO@GCSFUN: FUNCT 0,GCS,GCS.L ;GET COMMAND STATUS (T)MSCP COMMAND@SCCFUN: FUNCT 0,SCC,SCC.L ;SET CONTROLER CHAR (T)MSCP COMMAND ;GM102 .IF DF D$$DSK ;GM1026FMTFUN: FUNCT 0,FMT,FMT.L ;FORMAT COMMAND ;GM102 .ENDC ;D$$DSK ;GM102 ;GM102 ;JJM350; ;JJM350D .IF DF,T$$APE ;JJM350FSNGDEN: .BYTE TK50,TK70,-1 ;SINGLE DENSITY DRIVE/CONTROLLER ;JJM350 .EVEN ;JJM350 .ENDC ;T$$APE ;JJM350M ;JJM350N;C>; TABLE FOR TRANSLATION OF MSCP END CODES TO RSX ERROR CODES;,1RSXTAB: .BYTE IS.SUC ;00 - SUCCESS ;PKW109 4 .BYTE IE.IFC ;01 - ILLEGAL FUNCTION CODE ;**-2' .BYTE IE.ABO ;02 - COMMAND ABORTED 4 .BYTE IE.DNR ;03 - UNIT OFFLINE (TMSCP OFFLINE)& .BYTE IE.DNR ;04 - UNIT AVAILABLE ;GM102 .IF DF D$$DSK ;GM1026 .BYTE IE.BCC ;05 - MEDIA FORMAT ERROR ;GM102' .IFF ;IF TAPE ;GM102;8 .BYTE IE.FHE ;05 - UNDEFINED STATUS CODE ;GM102 .ENDC ;D$$DSK ;GM102 ;GM1021 .BYTE IE.WLK ;06 - UNIT WRITE LOCKED ;**-1 % .BYTE IE.VER ;07 - COMPARE ERRORE" .BYTE IE.VER ;08 - DATA ERROR0 .BYTE IE.SPC ;09 - HOST BUFFER ACCESS ERROR( .BYTE IE.FHE ;10 - CONTROLLER ERROR# .BYTE IE.FHE ;11 - DRIVE ERROR  .IF DF T$$APE ;TAPE ONLY ' .BYTE IE.VER ;12 - FORMATTER ERROR ' .BYTE IS.SUC ;13 - BOT ENCOUNTEREDI, .BYTE IE.EOF ;14 - TAPEMARK ENCOUNTERED- .BYTE IE.FHE ;15 - UNDEFINED STATUS CODED- .BYTE IE.DAO ;16 - RECORD DATA TRUNCATEDI% .BYTE IE.VER ;17 - POSITION LOST ) .BYTE IE.ABO ;18 - SERIOUS EXCEPTION+ .BYTE IE.EOV ;19 - LOGICAL END OF TAPE. .IFF ;T$$APE - IF DISKE- .BYTE IE.FHE ;12 - UNDEFINED STATUS CODE.- .BYTE IE.FHE ;13 - UNDEFINED STATUS CODE - .BYTE IE.FHE ;14 - UNDEFINED STATUS CODE - .BYTE IE.FHE ;15 - UNDEFINED STATUS CODE - .BYTE IE.FHE ;16 - UNDEFINED STATUS CODEE- .BYTE IE.FHE ;17 - UNDEFINED STATUS CODET- .BYTE IE.FHE ;18 - UNDEFINED STATUS CODE - .BYTE IE.FHE ;19 - UNDEFINED STATUS CODES .ENDC ;T$$APE- .BYTE IE.FHE ;20 - UNDEFINED STATUS CODEO- .BYTE IE.FHE ;21 - UNDEFINED STATUS CODES- .BYTE IE.FHE ;22 - UNDEFINED STATUS CODES- .BYTE IE.FHE ;23 - UNDEFINED STATUS CODES- .BYTE IE.FHE ;24 - UNDEFINED STATUS CODES- .BYTE IE.FHE ;25 - UNDEFINED STATUS CODES- .BYTE IE.FHE ;26 - UNDEFINED STATUS CODES- .BYTE IE.FHE ;27 - UNDEFINED STATUS CODES- .BYTE IE.FHE ;28 - UNDEFINED STATUS CODES- .BYTE IE.FHE ;29 - UNDEFINED STATUS CODES- .BYTE IE.FHE ;30 - UNDEFINED STATUS CODEH2 .BYTE IE.FHE ;31 - MESSAGE FROM INTERNAL DIAG .EVEN ;JJM350;$; DISK CLASS DRIVER DISPATCH TABLE;S .IF DF D$$DSK ;IF DISK> .IF DF DU$CHK ;QUEUE OPTIMIZATION SUPPORTED ;PKW109C DDT$ DU,R$$UDA,,,,NEW=Y,OPT=Y;GENERATE DISPATCH TABLE ;P00t33l1DATADATADATADATADATADATADATAKW109 # .IFF ;DU$CHK ;PKW109E> DDT$ DU,R$$UDA,,,,NEW=Y ;GENERATE DISPATCH TABLE ;PKW109$ .ENDC ;DU$CHK ;PKW109; ;**-16T$; TAPE CLASS DRIVER DISPATCH TABLE;E& .IFF ;D$$DSK - IF TAPE ;PKW109B DDT$ MU,R$$MYA,,,,NEW=Y ;GENERATE DISPATCH TABLE ;**-2 .ENDC ;D$$DSK ;PKW109S .PAGE ;**-8, .SBTTL XXINI - I/O INITIATOR ENTRY POINT;+!;**-MUINI-INITIATOR ENTRY POINT$!;**-DUINI-INITIATOR ENTRY POINTC;L ; INPUTS:; ; R4 IS THE ADDRESS OF THE SCB'; R5 IS THE ADDRESS OF THE UNIT'S UCBT;B ; OUTPUTS:; ; R2 - QST ADDRESS; R4 - SCB ADDRESS; R5 - UCB ADDRESS; PORT MAPPED IN APR6;; TRY TO START I/O;-MUINI:DUINI:;RI; SET UP THE COMMON REGISTERS, MAP THE PORT IN APR6, AND JUMP TO CLACMDW;, MOV S.QST(R4),R2 ;R2 IS THE QST ;**-19 MOV S.PBIA(R4),@KISR6 ;MAP APR6 TO PORT DRIVER ;GM112O? MOV S.PBIA(R4),@#KINAR6 ;KERNAL INSTRUCTION SPACE ;PKW109 3 CALLR CLACMD ;GO TRY TO START A COMMAND ;**-2R .PAGE, .SBTTL XXACC - PACKET ACCEPTANCE ROUTINE;+*; **-XXACC-ACCEPTANCE ROUTINE FOR $GSPKT;EJ; THIS ROUTINE DECIDES WHICH PACKETS CAN BE PROCESSED. IT CHECKS UMR WAJ; STATUS TO MAKE SURE THAT NECESSARY RESOURCES ARE AVAILABLE. IF THE UNK; IN SERIAL MODE, NO I/O'S FOR THAT DEVICE ARE PROCESSED. FOR DISKS, I/OSK; MAY BE PREVENTED BY STALL I/O. FOR TAPES, IF ANY I/O'S ARE OUTSTANDINGRL; AND THE PACKET BEING CHECKED IS AN IO.SEC FUNCTION, THEN NO MORE PACKETSL; ARE ACCEPTED FOR THAT UNIT UNTIL ALL OUTSTANDING I/O'S COMPLETE (THIS ISM; TO INSURE THAT THE GUS TMSCP COMMAND, WHICH IS AN IMMEDIATE TYPE COMMAND,HO; IS ISSUED TO A QUIESCENT UNIT). THIS ROUTINE IS AN INTEGRAL PART OF $GSPKTA&; AND SHOULD ONLY BE CALLED FROM IT.;N ; INPUTS:  ;O ; R1 - I/O PACKET ADDRESSS ; R4 - SCB ADDRESS ; R5 - UCB ADDRESS ;L ; OUTPUTS:;I; R0-R5 PRESERVED3; CARRY SET THIS PACKET IS NOT TO BE DEQUEUEDN*; CARRY CLEAR PACKET IS TO BE DEQUEUED; ;-XXACC: ;**-6T .IF DF D$$DSK ;DISK ONLY;G7; IS THERE ANY REASON NOT TO DO THIS I/O? ;PKW109!; ;**-1L! BIT #UU.SER!UU.ATN!UU.IOS,U.UTIL(R5) ;SERIAL, ATTENTION, OR STALL ;PKW109-# BNE 40$ ;IF NE YES, REJECT PACKET ;**-1$;1$%; IS RCT IN PROGRESS ON THIS UNIT?&;S8' BIT #UU.RCT,U.UTIL(R5) ;RCT IN PROGRESS ON THIS UNIT?( BEQ 20$ ;IF EQ NO?( CMP I.TCB(R1),@RCTPT ;YES, THEN IS THIS I/O FROM RCT? ;GM112A,* BNE 40$ ;IF NE NO, REJECT PACKET ;**-1+, .IFF ;D$$DSK - IF TAPE-H- BIT #UU.SER!UU.ATN,U.UTIL(R5) ;ANY REASON NOT TO DO THIS I/O? ;PKW109'- BNE 40$ ;YES, REJECT IT ;PKW109#8. CMP #IO.SEC,I.FCN(R1) ;SENSE CHARACTERISTICS COMMAND?5. BNE 20$ ;NO. CHECK FOR TRANSFER FUNCTION ;JJM323-/. MOV S.QST(R4),R4 ;GET QST ADDRESS ;JJM323 . ASSUME Q.CST,0 ;JJM323+. MOV (R4),R4 ;GET CST ADDRESS ;JJM323E6. TST C.OLHD(R4) ;ANY OUTSTANDING COMMANDS? ;JJM323;. BNE 40$ ;YES. REJECT IT. UNIT SHOULD BE UNUSED ;JJM323:. BR 30$ ;NO. ACCEPT THE PACKET FOR PROCESSING ;JJM323. ;JJM323N8 ;**-9;9 .ENDC ;D$$DSK;:20$:E: .IF NDF M$$PRO ;WE MAY NEED TO FORK IF ON WRONG PROCESSOR ;PKW106M: ;PKW106.< ;**-1 9= CMPB #IO.RLB/256.,I.FCN+1(R1) ;DATA TRANSFER REQUEST? )> BLO 30$ ;IF LO NO, ACCEPT THE PACKET7? BIT #DV.EXT,U.CW1(R5) ;IS EXTENDED MEMORY SUPPORTED?H$@ BNE 30$ ;YES, WE DON'T NEED UMRS@ ;PKW106S@ .ENDC ;M$$PRO ;PKW106D@ ;PKW106 /@ MOV S.QST(R4),R4 ;GET QST ADDRESS ;JJM323 @ ASSUME Q.CST,0 ;JJM323+@ MOV (R4),R4 ;GET CST ADDRESS ;JJM323N6@ BIT #C1.UMR,(R4) ;UNIT WAITING FOR UMRS? ;JJM3235@ BNE 40$ ;IF NE, YES. REJECT THE PACKET ;JJM323P6@ TST C.UMCT(R4) ;ANY MORE UMR WAIT BLOCKS? ;JJM323F BEQ 40$ ;IF EQ NO ;**-5PI; ;**-2J; ACCEPT PACKETTK; L30$:3L MOV U.SCB(R00t33t3eaek5),R4 ;RESTORE SCB ADDRESS ;JJM323 ,N CLC ;INDICATE ACCEPT THE PACKET ;**-1O RETURN ;RETURNWP;Q; REJECT PACKET R;QS40$:3S MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESS ;JJM323M,U SEC ;INDICATE REJECT THE PACKET ;**-1V RETURN ;AND EXITAW .PAGE)X .SBTTL XXCAN - CANCEL I/O ENTRY POINT Y;+,Z; **-DUCAN-CANCEL I/O ENTRY POINT FOR DISK,[; **-MUCAN-CANCEL I/O ENTRY POINT FOR TAPE\;QG]; THIS ROUTINE HANDLES ABORTING OUTSTANDING MSCP/TMSCP COMMANDS FOR AM^; GIVEN TASK AND UNIT._;D `; INPUTS:2a;$b; R0=ADDRESS OF CURRENT I/O PACKET"c; R1=TCB ADDRESS OF CURRENT TASKd; R3=CONTROLLER INDEXe; R4=SCB ADDRESSf; R5=UCB ADDRESSg;S h; OUTPUTS:i;Cj; R0=DESTROYEDk; R1-R5=PRESERVEDGl; IOPS IN OUTSTANDING LIST HEAD ARE MARKED FOR ABORT COMMAND ISSUANCEN$m; CONTROLLER MODE IS SET TO C1.ABOn;No;-pqMUCAN:rDUCAN:s .IF DF,T$$APEt1u CALL MAPD ;MAP PORT COMMON AREA THROUGH APR6A%v MOV S.QST(R4),R0 ;GET QST ADDRESSI,w MOV (R0),R0 ;/*Q.CST*/ ;GET CST ADDRESS)x MOV R0,R2 ;SAVE A COPY FOR USE LATER1,y MOV C.OLHD(R0),R0 ;GET FIRST IOP ADDRESSz BEQ 30$ ;NONE TO DO. EXIT /{10$: CMP I.TCB(R0),R1 ;IOP FOR CORRECT TASK?D"| BNE 20$ ;NO. GET NEXT PACKET+} CMP I.UCB(R0),R5 ;IOP FOR CORRECT UNIT?A"~ BNE 20$ ;NO. GET NEXT PACKET> BISB #IP.ABO,I.PRM+11(R0) ;MARK IT FOR ABO COMMAND ISSUANCE* BIS #C1.ABO,(R2) ;SET CONTROLLER STATE: BIT #UU.SER,U.UTIL(R5) ;ALREADY IN SERIAL MODE ON UNIT?' BNE 20$ ;YES. DO NOT SAY WE SET ITCC BIS #UU.SER!UU.ABO,U.UTIL(R5);INDICATE SERIAL MODE AND WE SET IT(*20$: MOV (R0),R0 ;GET NEXT IOP ADDRESS! BNE 10$ ;AND GO CHECK IT OUTT30$: .ENDC ;T$$APE& RETURN ;AND RETURN TO THE CALLER .PAGEA .IF DF D$$DSK&DU$CHK ;IF QUEUE OPTOMIZATION SUPPORTED ;PKW109A@ .SBTTL XXCHK - DU ONLY, SEEK OPTIMIZATION CHECKING ;PKW1096; **-DUCHK-VALIDATE AND CONVERT THE LBN ;PKW109; ;PKW109E; THIS ROUTINE IS CALLED FROM $DRQRQ TO DO LBN PROCESSING ;PKW109E; FOR DEVICES WHICH SUPPORT QUEUE OPTIMIZATION. IF BLKC2 ;PKW109E; DETECTS AN ERROR IT WILL RETURN TO THE CORRECT PLACE IN ;PKW109 .; $DRQRQ AFTER CALLING $IOALT. ;PKW109; ;PKW109; INPUTS: ;PKW109D; ;PKW109'; R1=I/O PACKET ADDRESS ;PKW109 !; R5=UCB ADDRESS ;PKW109 ; ;PKW109; OUTPUTS: ;PKW109; ;PKW109@; IF THE CHECKS SUCCEEDS, THEN THE LBN IN THE PACKET ;PKW109H; IS REPLACED BY THE CYLINDER/TRACK/SECTOR. R1 IS PRESERVED. ;PKW109; ;PKW109E; IF THE CHECKS FAILS, THEN $IOALT IS ENTERED WITH A FINAL ;PKW109WD; STATUS OF IE.BLK AND A RETURN TO THE CORRECT PLACE IN ;PKW109%; $DRQRQ IS EXECUTED. ;PKW109 ; ;PKW109; ;PKW109H; NOTE: ALL FUNCTIONS PUT INTO THE DRIVER QUEUE ARRIVE HERE. ;PKW109?; THESE INCLUDE IO.ATT, IO.DET, AND ACP FUNCTIONS. ;PKW109E;- ;PKW109L .ENABL LSB ;PKW109 ;PKW109CHDUCHK: CMPB #IO.RLB/256.,I.FCN+1(R1) ;DATA TRANSFER REQUEST? ;PKW109/ BLO 30$ ;IF LO NO, LEAVE IT ALONE ;PKW109HI BITB #IO.RPB&IO.WPB,I.FCN(R1);IS IT READ/WRITE PHYSICAL BLOCK? ;PKW109I- BEQ 10$ ;NO, DO BLOCK CHECKING ;PKW109W@REQUE: MOV R1,R3 ;WE HAVE TO SIMULATE THE SETUP THAT ;PKW109> CLRB I.PRM+11(R3) ;BLKC2 WOULD PERFORM FOR $CVLBN ;PKW109( MOV I.PRM+10(R3),R2 ;... ;PKW109( MOV I.PRM+12(R3),R0 ;... ;PKW109' BR 20$ ;NOW GO TO $CVLBN ;PKW109 810$: CALL @BLKC2 ;CHECK LOGICAL BLOCK NUMBER ;GM112:20$: CALL @CVLBN ;CONVERT LOGICAL BLOCK NUMBER ;GM112? MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESS ;PKW109 . SWAB R1 ;SWAP TRACK TO HIGH BYTE ;PKW1090 BIS R1,R0 ;MERGE TRACK WITH SECTOR ;PKW109F MOV R0,I.PRM+12(R3) ;SAVE DESIRED TRACK AND SECTOR ADDRESS ;PKW1093 MOV R3,R1 ;RESTORE THE PACKET ADDRESS ;PKW109,"30$: RETURN ;EXIT ;PKW109 ;PKW109K .DSABL LSB 00t33l1DATADATADATADATADATADATADATA ;PKW109% .ENDC ;D$$DSK&DU$CHK ;PKW109; .PAGE ;PKW109$ .SBTTL $XXINT - INTERRUPT HANDLER;+0; **-$XXINT-CLASS CONTROLLER INTERRUPT HANDLER; F; INTERRUPTS ARE RECEIVED FROM A CONTROLLER UNDER FOUR CIRCUMSTANCES; THEY ARE AS FOLLOWS:F; 1. DURING THE INITIALIZATION PROCESS (OPEN THE "VIRTUAL CIRCUIT")>; 2. WHEN THE "COMMAND RING BUFFER" TRANSITIONS FROM "FULL"; TO "NOT FULL",A; 3. WHEN THE "RESPONSE RING BUFFER" TRANSITIONS FROM "EMPTY"B; TO "NOT EMPTY"F; 4. WHEN A FATAL CONTROLLER ERROR IS DETECTED AND AN INTERRUPT CAN; BE GENERATED!; FATAL CONTROLLER ERRORS ARE:O;; A. FAILURE TO BECOME UNIBUS MASTER FOR DATA TRANSFER 7; B. FAILURE TO BECOME UNIBUS MASTER FOR INTERRUPTA1; C. FAILURE TO ACCESS I/O PAGE REGISTERS ORS8; COMMUNICATIONS AREA (I.E. NON-EXISTENT MEMORY)&; D. UNIBUS PARITY ERROR DETECTED; ;-  .IF DF D$$DSK ;IF DISK CLASS7 INTSE$ DU,PR5,R$$UDA ;;;GENERATE INTERRUPT SAVE CODEM  .IFF ;;;IF TAPE ;PKW109? INTSE$ MU,PR5,R$$MYA ;;;GENERATE INTERRUPT SAVE CODE ;**-3  .ENDC ;;;D$$DSK ;PKW109 ;**-1 / ;;;R5 POINTS TO ANY UCB ON THE CONTROLLER + ;;;R4 = CONTROLLER INDEX (UNLESS THISR. ;;;IS M AND THERE IS ONLY ONE CONTROLLER" ;;;R4 AND R5 MAY BE MODIFIED7 MOV U.SCB(R5),R4 ;;;POINT TO CONTROLLER STATUS BLOCKR@ BIT #UU.SPC,U.UTIL(R5) ;;;IS SPECIAL ONLINE IN EFFECT? ;**-2  BEQ 10$ ;;;NO, FORK NORMALLY* CALL SAVREG ;;;COROUTINE TO SAVE R0-R48 CALL MAPD ;;;COROUTINE TO SAVE APR6 AND MAP THE PORT4 JMPV PORT,PORINT ;;;GO EXECUTE THE REQUEST AT PR5510$: TST S.FRK+2(R4) ;;;FORK BLOCK IN USE? ;**-2E. BEQ 20$ ;;;IF EQ, NO, CALL FORK ;PKW1099 RETURN ;;;IF FORK BLOCK IN USE, JUST RETURN ;PKW109 ;PKW109Y420$: CALL @FORK ;;;CREATE SYSTEM PROCESS ;GM112) ;;;R5 MUST STILL BE THE UCB ;**-2 3 ;;;R4 MUST BE THE SCB BEFORE $FORK IS CALLED.;; ;PKW109'; RETURN AT FORK STATE ;PKW109; ;PKW109B CLR S.FRK+2(R4) ;FREE FORK BLOCK FOR FURTHER INTERRUPTS ;**-17< MOV S.PBIA(R4),@KISR6 ;MAP APR 6 TO PORT DRIVER ;GM112? MOV S.PBIA(R4),@#KINAR6 ;KERNAL INSTRUCTION SPACE ;PKW109@ JMPV PORT,PORINT ;TRANSFER TO PORT INTERRUPT ROUTINE ;PKW109 .PAGE ;**-10 2 .SBTTL XXKRB - CONTROLLER STATE CHANGE ROUTINE;+ ;**-3C;*3; **-XXKRB-CLASS CONTROLLER STATUS CHANGE ROUTINEL;?; THIS ROUTINE WILL HANDLE SETTING CONTROLLER ON-LINE/OFFLINE ; REQUESTS.1; ; INPUTS;;; R4 = DCB ADDRESS; R3 = CTB ADDRESS; R2 = KRB ADDRESS3; 0(SP) = RETURN ADDRESS FOR IMMEDIATE COMPLETION.5; 2(SP) = RETURN ADDRESS FOR CALLER OF EXEC ROUTINE*; C = 1 TRANSITION TO OFF-LINE REQUESTED); C = 0 TRANSITION TO ON-LINE REQUESTED1<; $SCOFL NONZERO POSITIVE - SPECIAL ONLINE FOR SYSTEM DISK ; $SCERR = 1 PRESET TO SUCCESS; PRIORITY = 0;S ; OUTPUTSN;#; $SCERR = 0 OPERATION IS PENDINGI@; $SCERR < 0 OPERATION IS FAILURE ($SCERR CONTAINS ERROR CODE)#; $SCERR = 1 OPERATION IS SUCCESSC6; 0(SP) = RETURN ADDRESS OF CALLER OF $KRBSC ROUTINE;FD; THE DRIVER EITHER CHOSES TO REJECT THE STATUS REQUEST, ACCEPT ITC; IMMEDIATELY OR TO DO A DELAYED TRANSITION BY SAVING THE ADDRESSNB; ON TOP OF THE STACK AND RETURNING TO THE SECOND ADDRESS ON THE ; STACK.; ;- DUKRB::= MUKRB::O, BCC 20$ ;IF CC, GO TRANSITION TO ON-LINE;; TRANSITION TO OFF-LINE;D MOV R2,R3 ;COPY THE KRBN MOV K.OWN(R2),R4 ;GET A UCB  MOV U.SCB(R4),R4 ;GET THE SCB  MOV S.QST(R4),R2 ;GET THE QST CALL MAPD ;MAP THE PORTU1  MOV COMPCB,R0 ;GET THE ADDRESS OF THE PORT PCBT<  DECB P.RMCT(R0) ;DECREMENT THE RESIDENT MAPPED TASK COUNT;  DEC 140000+CONCNT ;DECREMENT # OF CONTROLLERS USING PORT (  BNE 10$ ;IF NE, THERE ARE STILL MORE8  BIC #P2.LMA,P.ST2(R0) ;CLEAR THE 'LEAVE ME ALONE' BIT010$: CALLV PORT,STOMP ;STOMP ON THE CONTROLLER4 BIT #KS.EXT,K.S00t33t3eaekTS(R3) ;THIS CONTROLLER HAVE UMRS? BNE 60$ ;NO, FINISH UP* MOV (R2),R3 ;/*Q.CST*/ ;SET UP THE CST( SEC ;SEC TELLS PORUMR TO DEALLOCATE1 JMPV PORT,PORUMR ;DEALLOCATE THE UMRS AND EXITS;T; TRANSITION TO ON-LINET;;720$: TST EXEVEC ; IS VECTORING DON ALREADY? ;GM112O* BNE 22$ ; YES THEN SKIP THIS ;GM112/ PUSH ; SAVE THE REGISTERS ;GM112C, MOV KINAR6,-(SP) ; SAVE KINAR6 ;GM1129 MOV @#112,R0 ; GET ADDRESS OF TABLE OF ENTRIES ;GM112BD MOV (R0),R0 ; GET ADDRESS OF APR BIAS (1ST WORD IN TABLE) ;GM112< MOV (R0),KINAR6 ; MAP COMMON THROUGH I-SPACE APR6 ;GM112- MOV #EXEVEC,R3 ; POINT TO VECTOR ;GM112R5 MOV #EXEVCL,R2 ; SPECIFY LENGTH OF VECTOR ;GM112N1 CALL @#140004 ; TRANSLATE THE VECTOR ;GM112N. MOV (SP)+,KINAR6 ; RESTORE KINAR6 ;GM112- POP ; RESTORE REGISTERS ;GM112H122$: MOV R2,R5 ; R5 = ADDRESS OF KRB ;GM112K: ADD K.OFF(R5),R5 ;R5 = ADDRESS OF KRB UCB TABLE ;**-1# MOV (R5),R5 ;R5 = A UCB ADDRESSE% MOV U.SCB(R5),R4 ;R4 = SCB ADDRESSE3 MOV R5,K.OWN(R2) ;GIVE K.OWN A VALUE, NEEDED FORP# ;$INTSE MACRO FOR INTERRUPTS. 1 TSTB @SCOFL ;IS IT A SPECIAL ONLINE? ;GM112C, BLE 30$ ;NOPE, CONTINUE NORMALLY ;**-1@ BIS #UU.SPC,U.UTIL(R5) ;SET THE SPECIAL ONLINE BIT IN THE UCBF CLRB @SCERR ;CLEAR SCERR TO SHOW THAT THE ONLINE IS PENDING ;GM112;! BR 40$ ;DON'T DELAY THE RETURN FOR SPECIAL ONLINE ;**-1R"30$:(# POP SAVSTK ;DO DELAYED STATUS CHANGE$40$:A% .IIF DF D$$DSK MOV #VCDSK,R1 ;R1 = VIRTUAL CIRCUIT ID FOR DISKA& .IIF DF T$$APE MOV #VCTAP,R1 ;R1 = VIRTUAL CIRCUIT ID FOR TAPEA9' CALL CLASUP ;DO INITIAL LOAD FUNCTIONS ON PORT COMMONN( BCS 50$ ;IF CS, ERRORN0) CALL MAPD ;CALL A COROUTINE TO MAP AND LATER&* ;RESTORE APR 6. R0 IS DESTROYED.;+ INC 140000+CONCNT ;INCREMENT # OF CONTROLLERS USING PORTI@+ MOV MPPROR,140000+MPPROX ;REVECTORED $MPPRO ADDRESS ;JJM325/+ ;PUCOM CAN VECTOR OTHER ROUTINES ;JJM325S6, CALLV PORT,PORSUP ;MORE SETUP FOR PACKET MANAGEMENT- ;SETUP FUNCTIONS;. MOV #C1.CON!C1.SYN,(R3) ;CLEAR ALL CONNECTION STATE BITSI%/ ;AND ENTER C1.SYN,C1.CON STATE.T0 ;..CON ONL FOR CONTROLLERN21 ;IS IN PROGRESS AND WE NEED TO ALLOCATE UMRS*2 JMPV PORT,PORSYN ;START SYNCHRONIZATION 350$: ;ERROR ON INITIAL LOAD%4 PUSH ;SAVE REGISTERSU*5 CALL @SAVSTK ;TELL CON ABOUT THE ERROR+6 POP ;RESTORE OUR REGISTERSO7 SEC ;ENSURE CARRY SET860$: RETURN ;P; .PAGE ;**-2'< .SBTTL XXOUT - TIME OUT ENTRY POINTO=;+ >;**-XXOUT-TIME OUT ENTRY POINT?;N@; REASONS FOR TIME-OUTS ARE:A;CEB; 1. THE TIMER ON THE OLDEST COMMAND IN THE CONTROLLER HAS EXPIRED.O4C; 2. (DISK ONLY) A CONTROLLER RE-SYNCH IS DONE AND?D; OP.ONL'S MUST BE RE-ISSUED FOR ANY UNITS STILL MARKED ASSAE; SPINNING UP (US.SPU=1). THE TIME-OUT IS SET AND PROCESSEDTF; BY THE RECSIO ROUTINE.;>G; 3. A FATAL ERROR HAS BEEN DETECTED AND NOW A RE-SYNCH MUST?H; COMMENCE. WE GET HERE BECAUSE CLAERR IS CALLED WHENEVER ;I; A FATAL ERROR IS DETECTED AND SETS A 1 SECOND TIMER.S?J; 4. A CONTROLLER SYNCHRONIZATION STEP HAS TIMED OUT WHICH ISAK; A FATAL ERROR.SL;R M; INPUTS:(N;O O; R4 ADDRESS OF SCB"P; R5 ADDRESS OF A UCBQ;O R; OUTPUTS:S;AT;-UVDUOUT:WMUOUT:9W MOV S.PBIA(R4),@KISR6 ;MAP APR6 TO PORT DRIVER ;GM112HIY .IIF DF K$$DAS MOV S.PBIA(R4),@#KINAR6 ;FOR I/D SYSTEMS MAP BOTH ;**-1C+Z MOV S.QST(R4),R2 ;R2 IS THE QST ADDRESS 2[ MOV (R2),R3 ;/*Q.CST*/ ;R3 IS THE CST ADDRESS+\ BIT #C1.RDY,(R3) ;IS THE READY BIT SET?A%] BEQ 20$ ;NO, CONTINUE, ELSE THISM#^ ;MUST BE A CMD TMO. FOR TAPER_ .IF DF D$$DSK`-a BIT #C1.R2,(R3) ;IS RECOVERY IN PROGRESS? ,b BEQ 10$ ;IF EQ, NO, THIS MUST BE A CMD.-c TST C.OLHD(R3) ;ANY COMMANDS IN PROGRESS?S2d BNE 10$ ;IF NE, YES, THIS MUST BE A CMD. TMO.Be; WE MUST BE HERE IN ORDER TO RE-TRY UNIT ON-LINES AFTER A FATALDf; ERROR RE-SYNCHRONIZATION. FOR EACH 00t33l1DATADATADATADATADATADATADATAUNIT THAT USED TO BE ON-LINEGg; (US.SPU=1), RE-TRYS, IN CASE OF FAILURE, ARE DONE EVERY FEW SECONDSTh;A5i BIS #C1.R1,(R3) ;NOTE THAT WE NEED TO DO ON-LINESBj JMP RECSIO ;GO DO THEMFkl .ENDC ;D$$DSKm;R0n; WE ARE HERE BECAUSE A COMMAND JUST TIMED OUTo;,Fo10$: BIT #C1.TMO!C1.GCS,(R3) ;DID THE GCS COMMAND TIME OUT? ;PKW109%o BEQ 15$ ;NO, CONTINUE ;PKW109E?o JMP TMOERR ;IF THE GCS TIMED OUT, GO START RESYNCH ;PKW109So ;PKW109RBo15$: BIS #C1.GCS,(R3) ;INDICATE WE NEED TO DO AN OP.GCS ;PKW1098o MOVB S.ITM(R4),S.CTM(R4) ;RE-SET TMO. COUNT ;PKW109Eo CALLV PORT,PKTCH1 ;DO WE HAVE THE RESOURCES TO DO IT NOW? ;PKW109B3o ; ONLY NEED ONE CREDIT SINCE THIS IS ;PKW109#o ; AN IMMEDIATE CMD ;PKW109N#o BCS 17$ ;NO, RETURN ;PKW1091'o JMP GCSSIO ;GO ISSUE IT ;PKW109Eo17$: RETURN ;PKW109Oq; ;**-1Cr; IF WE GET HERE EITHER WE TIMED OUT BEFORE THE CONTROLLER GOT UP0s; OR WE ARE HERE TO START A RE-SYNCHRONIZATIONt;E/u20$: BIT #C1.FAT,(R3) ;IS THE FATAL BIT SET?4v BEQ 30$ ;NO, CONTINUE<w BIC #C1.FAT,(R3) ;YES, IT'S A FATAL ERROR, CLEAR THE BIT5x JMPV PORT,PORSYN ;AND START RESYNCH WITH THE CONTI-x30$: SEC ;LOG CONTROLLER ERROR ;PKW109 / JMP CLAERR ;JUMP TO ERROR ROUTINE ;**-12 .PAGE( .SBTTL XXPWF - POWERFAIL ENTRY POINT;+(; **-DUPWF- DISK POWERFAIL ENTRY POINT(; **-MUPWF- TAPE POWERFAIL ENTRY POINT;T?; THIS ROUTINE WILL HANDLE POWER FAILURES AND WILL BRING THE1; CONTROLLER(S) AND UNIT(S) ONLINE FOR RSX-11M.T; ; INPUTS:O;T; R3=CONTROLLER INDEX ;, ; OUTPUTS:;,;-DUPWF:MUPWF:3 TST R3 ;IS IT A CALL TO THE CONTROLLER? ;**-27S< BEQ 20$ ;NO, JUST RETURN-CLAERR WILL DEAL WITH ALL UNITS  MOV L.DCB(R3),R3 ;GET THE DCB MOV D.UCB(R3),R5 ;NOW A UCB MOV U.SCB(R5),R4 ;THE SCB CALL MAPD ;MAP THE PORTT MOV S.QST(R4),R2 ;THE QST/ MOV (R2),R3 ;/*Q.CST*/ ;AND THE CST (WHEW!)P4 MOVB #RETRY,Q.RTY(R2);SET UP RETRY COUNT ;**-3B JMP CLAERR ;RE-SET STATES, QUEUES, AND SET UP TIME-OUT ;PKW1096 ;COUNT. THE TIMEOUT ROUTINE WILL START THE ;**-2 ;RE-SYNCH FOR DISK.S 20$: RETURNH .PAGE. .SBTTL XXUCB - CON UNIT ONLINE ENTRY POINT;+ ;**-2U*; **-XXUCB - CON UNIT ONLINE ENTRY POINT;U; ROUTINE DESCRIPTIONM;S ; INPUTS:E;&; R3=CONTROLLER INDEX (S.KRB .NE. 0); R4=ADDRESS OF SCBM; R5=ADDRESS OF UCB;; 0(SP) - RETURN ADDRESS"; 2(SP) - DELAYED RETURN ADDRESS; C SET OFFLINEC; C CLEAR ONLINE; $CSERR SET TO 1, SUCCESS,; $SCOFL > 0 THEN ONLINE FOR SYSTEM DEVICE;A ; OUTPUTS:; ; R4-R5 ARE PRESERVED0;T@; $SCERR = 0 OPERATION IS PENDING (MAXIMUM TIME IS 60 SECONDS):; $SCERR < 0 OPERATION IS A FAILURE $SCERR CONTAINS CODE%; $SCERR = 1 OPERATION IS A SUCCESSS6; 0(SP) = RETURN ADDRESS OF CALLER OF $UCBSC ROUTINE;-MUUCB: DUUCB::M# .IF DF D$$DSK ;DISK DRIVER ONLY " BCS 40$ ;IF CS OFFLINE REQUEST; TST U.BPKT+2(R5) ;REPLACEMENT QUEUE ALREADY INITIALIZED?R BNE 10$ ;IF NE YES< MOV #U.BPKT,U.BPKT+2(R5) ;NO SET UP FOR ZERO ENTRY QUEUE( ADD R5,U.BPKT+2(R5) ;SHOW IT AS EMPTY10$:& MOV S.KRB(R4),R2 ;RETRIEVE KRB ADDR< MOV R5,K.OWN(R2) ;MARK THIS UNIT AS OWNING THE CONTROLLER5 MOV U.UC2X(R5),R0 ;IS THE EXTENSION ALREADY THERE? ' BNE 30$ ;YES, DON'T GET ANOTHER ONEC9 MOV #1,R1 ;OBTAIN ONE 32-WORD BLOCK OF SECONDARY POOLS CLC ;CLR CARRY< CALL @ALSEC ;ALLOCATE A CHUNK OF SECONDARY POOL ;GM112 BCC 30$ ;IF CC OK ;**-13 MOVB #IE.UPN,@SCERR ;SET FAILURE CODE ;GM112;+20$: RETURN ;EXIT WITH FAILURE ;**-1PG30$: MOV R0,U.UC2X(R5) ;SAVE ADDRESS OF BLOCK IN SECOND UCB EXTENSION? TSTB @SCOFL ;SPECIAL OFFLINE TO ONLINE TRANSITION? ;GM112V BLE 20$ ;IF LE NO ;**-1A" CALL MAPD ;MAP SECOND 4K WORDS$ MOV S.QST(R4),R2 ;GET QST ADDRESS+ MOV (R2),R3 ;/*Q.CST*/ ;GET CST ADDRESS< CLRB @SCERR ;INDICATE STATUS CHANGE IN PROGRE00t33t3eaekSS ;GM112; BIS #UU.SPC,U.UTIL(R5) ;MARK AS SPECIAL ONLINE ;PKW110 2 JMP ONLSIO ;GO BRING THE UNIT ONLINE ;PKW110 ;**-4H40$: CALL MAPD ;MAP THE PORTV( MOV S.QST(R4),R2 ;GET THE QST ADDRESS/ MOV (R2),R3 ;/*Q.CST*/ ;GET THE CST ADDRESSF8 MOV C.OLHD(R3),R1 ;ANY I/O OUTSTANDING IN CONTROLLER? CALL 60$ ;CHECK THIS QUEUE0 MOV U.BPKT(R5),R1 ;CHECK THE BAD PACKET QUEUE CALL 60$ ;IF ANYA  BIC #UU.SIO,U.UTIL(R5) ;CLEAR THE STALL I/O TO THIS DEVICE BITNC  MOV U.UC2X(R5),R0 ;GET ADDRESS OF BLOCK IN SECOND UCB EXTENSION,L  ;IF IT'S THERE850$: MOV #1,R1 ;SET SIZE TO ONE 32-WORD BLOCK ;**-2@ CLR U.UC2X(R5) ;ZERO ADDRESS OF BLOCK IN SECOND UCB EXTENSION> CALLR @DESEC ;DEALLOCATE A CHUNK OF SECONDARY POOL ;GM112 ;**-13;60$: BEQ 90$ ;EMPTY QUEUE, MUST BE AFTER LOAD OF R1 WITH # ; WITH FIRST (P)IOP ON QUEUEC,70$: CMP R5,I.UCB(R1) ;IS IT FOR THIS UNIT  BNE 80$ ;NO, THEN CHECK NEXT# TST (SP)+ ;CLEAR RETURN ADDRESSM2 MOVB #IE.VER,@SCERR ;SET FAILURE CODE ;GM112 RETURN ;AND EXIT ;**-1E!80$: MOV (R1),R1 ;GET NEXT IOPE* BNE 70$ ;CHECK TO SEE IF FOR THIS UNIT90$: .ENDC ;D$$DSK RETURN ;BACK TO CALLERE" .PAGE ;**-3" .IF DF,T$$APE ;JJM3042# .SBTTL ABOSIO - KILL I/O'S ON UNIT REQUIRING IT&;+ ;**-2 .'; **-ABOSIO-KILL I/O'S ON UNITS REQUIRING IT(;,J); THIS ROUTINE SCANS THROUGH THE C.OLHD QUEUE FOR THE CURRENT CONTROLLERK*; AND LOCATES ANY I/O PACKETS THAT HAVE THE IP.ABO BIT SET (BY XXCAN) AND2L+; THE IP.PND BIT RESET (SET MEANS ABO CMD ALREADY ISSUED FOR THIS PACKET).I,; WHEN SUCH A PACKET IS FOUND, AN ABO COMMAND IS ISSUED FOR THE COMMANDR-;B .; INPUT:/;0; R2=QST ADDRESS1; R3=CST ADDRESS2;; 3; OUTPUT:B4;B5;- 6ABOSIO: 7)810$: CLR LSTPKT ;SHOW NO PACKET FOUND %9 MOV S.QST(R4),R2 ;GET QST ADDRESS !: MOV (R2),R0 ;GET CST ADDRESSR1; ADD #C.OLHD,R0 ;POINT TO LIST HEAD TO PROCESS)<20$: MOV (R0),R0 ;GET NEXT I/O PACKET '= BEQ 30$ ;NO MORE THIS TIME THROUGHP8> CMP #IO.KIL,I.FCN(R0) ;IS IT A KIL COMMAND WE ISSUED?)? BEQ 20$ ;YES. SO LOOK AT ANOTHER ONEA9@ BITB #IP.ABO,I.PRM+11(R0) ;SHOULD THIS CMD BE ABORTED?"A BEQ 20$ ;NO. FIND ANOTHER ONE>B BITB #IP.PND,I.PRM+11(R0) ;WAS ABO ALREADY ISSUED FOR THIS?*C BNE 20$ ;YES. DON'T NEED ANOTHER ONE+D MOV R0,LSTPKT ;SAVE LAST PACKET ADDRESS,/E BR 20$ ;AND GO SEE IF THERE IS ANOTHER ONE *F30$: TST LSTPKT ;WAS ANY REALLY FOUND?&G BEQ 40$ ;NO. NO MORE FOR ANY UNITH;RI;S"J; ISSUE I/O ABO COMMAND FOR UNITK;;/L CALLV PORT,PKTCHK ;ANY RESOURCES AVAILABLE?.!M BCS 70$ ;NO. TRY AGAIN LATERIN"O MOV LSTPKT,R0 ;GET IOP ADDRESS%P MOV I.UCB(R0),R5 ;GET UCB ADDRESSR%Q MOV U.SCB(R5),R4 ;GET SCB ADDRESS 4R CALL PIOPAL ;ALLOCATE PIOP FOR 'DUMMY' COMMANDS BCS 70$ ;NONE AVAILABLE:T MOV #IO.KIL,I.FCN(R3) ;MAKE SURE WE KNOW WHENCE IT CAME%U ;PIOP ADDRESS IS IN R3 BY NOW.T(V MOV #ABOFUN,R0 ;FUNCTION INFORMATION(W CALL CMDCOM ;BUILD TEMPLATE COMMANDX.Y MOV LSTPKT,R0 ;GET ORIGNAL I/O PACKET ADDR?Z MOVB I.PRM+11(R0),P.OTRF(R1) ;GET COMMAND REFERENCE NUMBER 1 ;[ BIC #177760,P.OTRF(R1) ;ONLY GET 4 BITS WORTH (ACTUAL #)R;\ MOV R0,P.OTRF+2(R1) ;AND PUT IN THE ASSOCIATED IOP ADDRS]7^ BISB #IP.PND,I.PRM+11(R0) ;SHOW ABORT COMMAND ISSUEDB*_ PUSH <#10$> ;GO BACK TO SCANNING LIST&` CALL CMDSEN ;GO ISSUE THE COMMANDa; b;Ic; END PACKET PROCESSINGTd;M(e CLR R0 ;INDICATE NO I/O TO COMPLETE%f PUSH <#0> ;NO INFORMATION NEEDED/g CALL ENDCMO ;CLEAN UP AND THEN RETURN HERE/h BR 10$ ;MAKE ANOTHER PASS THROUGH THE LISTRi40$:'j PUSH <#SCUCB> ;SAVE NECESSARY ITEMSE/k50$: CALL @(SP)+ ;CALL SCUCB AS A COROUTINE)l BCS 60$ ;NO MORE TO DO.9m BIT #UU.ABO,U.UTIL(R5) ;DID XXCAN SET THE SERIAL MODE?A+n BEQ 50$ ;NO. DON'T EVEN LOOK AT UU.SERNFo BIC #UU.SER!UU.ABO,U.UTIL(R5) ;YES. RESET THE SERIAL MODE, ABO MODE&p BR 50$ ;AND LOOK FOR ANOTHER UNITq60$:'r00t33l1DATADATADATADATADATADATADATA CALL 70$ ;RESTORE QST/CST ADRESSESR.s BIC #C1.ABO,(R3) ;TAKE US OUT OF ABO STATEt BR 80$ ;AND RETURN0u70$:/v MOV S.QST(R4),R2 ;GET THE QST ADDRESS AGAIN .w MOV (R2),R3 ;AND PUT BACK THE CST ADDRESS$x80$: RETURN ;BACK TO THE CALLERyz .ENDC ;T$$APED .PAGE ;**-82(6 .SBTTL CLAATN - CLASS ATTENTION MESSAGE PROCESSING;+1;**-CLAATN - CLASS ATTENTION MESSAGE PROCESSINGR;E?; ATTENTION MESSAGES WILL CAUSE A TRANSITION TO UU.ATN STATE.T$; R5 WILL CONTAIN THE UCB ADDRESS.;T ; INPUTS:R; R1=ADDRESS OF END PACKET; R2=ADDRESS OF QSTB; R3=ADDRESS OF CST; R4=ADDRESS OF SCBR; R5=ADDRESS OF UCB ; ; OUTPUTS:;;;- CLAATN:A MOV R1,R2 ;SCUCB USES R1B CMPB #OP.AVA,P.OPCD(R1) ; IS IT AN AVAILABLE ATTENTION MESSAGE?+ BNE 40$ ;NO, JUST DEALLOCATE THE PACKETC0 PUSH <#SCUCB> ;PUSH SCAN UCB ROUTINE ON STACK'10$: CALL @(SP)+ ;CALL THE COROUTINEG# BCS 40$ ;IF CS -> NO MORE UCB'SSA CMPB P.UNIT(R2),U.UNIT(R5); IS THIS ATT MESSAGE FOR THIS UCB ? BNE 10$ ;IF NE -> NO .IF DF,D$$DSK ;DISK?  ;**-17 BIT #UU.IOS,U.UTIL(R5) ;IS I/O STALLED TO THIS UNIT?  BNE 20$ ;YES, MARK THIS UNIT0 BITB #US.MNT,U.STS(R5) ;WAS THE UNIT MOUNTED? BNE 30$ ;NO, SKIP THIS ONE4 BIT #UU.SIO,U.UTIL(R5) ;CAN THIS UNIT STALLL I/O? BEQ 30$ ;NO, CONTINUE>K ; TO GET HERE THE UNIT MUST HAVE SPUN DOWN BUT NO I/O HAS BEEN ATTEMPTED20$: .ENDC ;D$$DSK ;**-1C* BIT #UU.ATN,U.UTIL(R5) ;DID WE ALREADY?# BNE 30$ ;YUP, DON'T DO IT AGAIN , BIS #C1.GUS,(R3) ;SET GUS TRANSTITION BIT? BIS #UU.GUS!UU.SER!UU.ATN,U.UTIL(R5);SET GUS, SERIAL AND ATN&30$: ADD #10,SP ;FLUSH THE UCB SCAN)40$: MOV R2,R1 ;RESTORE THE END PACKET$ MOV S.QST(R4),R2 ;RESTORE THE QST5 CALLV PORT,PKTDR ;DEALLOCATE THE ATTENTION MESSAGE3 RETURN ;RETURN .PAGE9 .SBTTL CLACMD - INITIATOR AND CONTINUATION ENTRY POINTP;+?;**-CLACMD-INITIATOR ENTRY POINT AND CONTINUATION ENTRY POINT(;D=; DECIDE WHAT TO DO NEXT BASED ON CONNECTION MODES1/; A MODE IS A COMBINATION OF STATES.S;E ; INPUTS:I ;; ; R2 ADDRESS OF THE QST ; R4 ADDRESS OF THE SCB ; R5 ADDRESS OF THE UCB;E ; OUTPUTS:;V; R2,R4,R5 PRESERVED; R3 ADDRESS OF THE CST; TRY TO START I/O;- ;**-1 CLACMD: ;**-1* MOV (R2),R3 ;/*Q.CST*/ ;R3 IS THE CST- BIT #C1.RDY,(R3) ;IS THE RDY SET? ;**-2P BEQ 70$ ;NOT READY, BAG IT(C10$: BIT #^C,(R3) ;IS ANYTHING BUT RDY OR DQU SET?1- BNE 20$ ;YES, WE NEED TO DO SOMETHING SPS1 TST (R4) ;IS THERE AN I/O TO START? ;PKW109T' BEQ 70$ ;NOPE, JUST EXIT ;PKW109  ;GM103& .IF DF D$$DSK ;IF DISK ;GM103 ;GM103G BITB #C2.SHD,C.FLAG(R3) ;IS THIS A RECURSIVE ENTRY? C2.SHD IS ;GM103L5 ;ONLY FOR TESTING RECUSRSION THAT MIGHT ;GM103S' ;OCCUR DURING SHADOWING ;GM103Y+ BNE 80$ ;IF NE YES, JUST EXIT ;GM103I ;GM1033 .IF DF DU$CHK ;IF QUEUE OPTIMIZATION ;PKW119 ;PKW119 B BITB #S3.OPT,S.ST3(R4) ;IS QUEUE OPTIMIZATION ENABLED? ;PKW119( BEQ 13$ ;NO, CALL PKTCHK ;PKW119; MOV C.OLHD(R3),R1 ;GET THE OUTSTANDING REQUEST ;PKW119 5 BEQ 15$ ;IF NONE, WE CAN ISSUE A REQUEST ;PKW119;2 TST (R1) ;MORE THAN ONE OUTSTANDING? ;PKW119* BEQ 15$ ;NO, ISSUE THIS ONE ;PKW119* BR 70$ ;CAN'T ISSUE ONE NOW ;PKW119 ;PKW119N .ENDC ;DU$CHK ;PKW119  ;PKW119D .IFTF ;D$$DSK ;PKW119  ;PKW119 H13$: CALLV PORT,PKTCHK ;IS THERE A COMMAND PACKET WE CAN USE? ;PKW119+ BCS 70$ ;IF NOT, JUST RETURN ;PKW1199/15$: CALLR CMDSIO ;GO START AN I/O ;GM103EH20$: CALLV PORT,PKTCHK ;IS THERE A COMMAND PACKET WE CAN USE? ;PKW109+ BCS 70$ ;IF NOT, JUST RETURN ;PKW10997 BIT #C1.GCS,(R3) ;ARE WE IN THE GCS STATE? ;PKW109 (! BEQ 30$ ;NOPE, KEEP LOOKING ;**-2)" CALLR GCSSIO ;GO START 00t33t3eaekA GCS COMMAND #30$:1( BIT #C1.GUS,(R3) ;CHECK FOR GUS STATE ;**-4) BEQ 50$ ;NO. CONTINUEL* CALLR GUSSIO ;PROCESS GUS+50$:.+ .IFT ;D$$DSK - DISK DRIVER ONLY ;PKW119. ;**-29:. BIT #C1.REC,(R3) ;ARE WE IN RESYNCH RECOVERY? ;PKW110(6 BEQ 70$ ;NOPE, KEEP LOOKING ;**-7-7 CALLR RECSIO ;GO TO THE RECOVERY ROUTINEU89 .IFF ;D$$DSK - IF TAPE1:.; BIT #C1.ABO,(R3) ;ARE WE IN THE ABO STATE? < BEQ 70$ ;NOPE, KEEP LOOKING*= CALLR ABOSIO ;GO ISSUE ABORT COMMANDS>? .ENDC ;D$$DSK@70$:4C BIT #C1.DQU,(R3) ;SHOULD WE DEQUEUE UMRS? ;**-2D BEQ 80$ ;NOPE#E BIC #C1.DQU,(R3) ;CLEAR THE BIT ?E CALL @DQUMR ;AND CALL IT - NOTE THAT THIS MUST BE A ;GM112T4G ;CALL, NOT A CALLR. $DQUMR IS A COROUTI;**-1:G80$: RETURN ;DON'T KNOW WHAT TO DO, SO RETURN ;PKW109L .PAGE ;**-4#M .SBTTL CLADAT - HANDLE DATAGRAMSN;+ O;**-CLADAT - PROCESS DATAGRAMSP;TQ; R; INPUTS:;S; R1=ADDRESS OF END PACKETT; R2=ADDRESS OF QST U; R3=ADDRESS OF CST;V; R4=ADDRESS OF SCB#W; R5=ADDRESS OF UCB X;UY;S Z; OUTPUTS:[;$\;- ]CLADAT:#^ .IF DF E$$LOG:_ MOV R1,KEEPR1 ;SAVE END PACKET ADDRESS SO WE CAN USE IT<` PUSH #SCUCB ;YES, PUSH "SCAN UCB'S" ROUTINE ON THE STACK(a10$: CALL @(SP)+ ;CALL THE CO-ROUTINE!b BCS 20$ ;IF CS, NO MORE UCB'SE9c MOV KEEPR1,R1 ;GET THE END PACKET ADDRESS BACK FOR USEEd CMPB P.UNIT(R1),U.UNIT(R5) ;IS THIS ERROR LOG PACKET FOR THIS UCBEe BNE 10$ ;IF NE NO2$f ADD #10,SP ;YES, FLUSH THE STACKg MOV P.STS(R1),R0 2h BIC #^C,R0 ;R0 IS THE MAJOR STATUS CODE>i MOVB RSXTAB(R0),R0 ;R0 IS THE CORRESPONDING RSX STATUS CODEj BIC #177400,R0R0k CALL LERR ;TRY TO LOG THE ERROR LOG DATAGRAM:k20$: MOV KEEPR1,R1 ;RESTORE END PACKET ADDRESS ;PKW112k ;PKW112Sk .ENDC ;PKW112k ;PKW112;7k JMPV PORT,PKTDR ;DEALLOCATE RECEIVE BUFFER ;PKW112Ru .PAGE ;**-93v .SBTTL CLAEND - CLASS DISPATCHER FOR END PACKETS2w;+.x; **-CLAEND-CLASS DISPATCHER FOR END PACKETSy; z; ROUTINE DESCRIPTIONR{;T>|; WHEN THE PORT DRIVER RECEIVES END PACKETS IT WILLA}; CALL THE CLASS DRIVER AT CLAEND FOR EACH END PACKET. 8~; PICKS UP THE THREAD FOR EACH I/O AND RETURN?; TO THE CORRECT PLACE TO PROCESS THE END PACKET AND;; COMPLETE THE I/O.; ; INPUTS:E;A; R0=E; R1=ADDRESS OF END PACKET; R2=ADDRESS OF QST ; R3=ADDRESS OF CSTE; R4=ADDRESS OF SCB+; R5=ADDRESS OF UCBI"; ASSUMES ONE SCB PER CONTROLLER;N;C ; OUTPUTS:; ; R2-R5 ARE PRESERVEDI;- CLAEND:P7 BITB #OP.AVA,P.OPCD(R1) ;IS IT AN ATTENTION MESSAGE?E3 BNE 100$ ;GO HANDLE ATTENTION MESSAGE ;JJM307H ;**-6N110$: MOV P.CRF+2(R1),R5 ;GET I/O PACKET ADDRESSE+ MOV I.UCB(R5),R5 ;GET ACTUAL UCB ADDRESS : CMPB #OP.GCS!OP.END,P.OPCD(R1) ;IS IT A GET CMD STATUS?- BEQ 200$ ;GO PROCESS IN TMOGCS ;JJM307E20$: ;**-2E( MOV C.OLHD(R3),R0 ;GET ENTRY IN QUEUE. BEQ 45$ ;NO ENTRIES IN THE QUEUE ;JJM3072 MOV P.CRF+2(R1),R3 ;IOP ADDRESS IF ONE ;**-130$: CMP R3,R0 ;IS THIS THE ONE?N BEQ 50$ ;ENTRY IS IN QUEUE MOV (R0),R0 ;GET NEXT ENTRY  BNE 30$ ;CHECK IT*40$:/ MOV (R2),R3 ;/*Q.CST*/ ;RESTORE CST ADDRESSC45$: JMPV PORT,PKTDR ;RETURN PACKET. NO MORE PROCESSING. ;JJM307E50$: ;**-1G# .IF DF D$$DSK ;DISK CONDITIONALE8 TST P.STS(R1) ;ANYTHING OTHER THAN SUCCESS? ;PKW109. BEQ 70$ ;NOPE, CONTINUE NORMALLY ;PKW109; CALL ENDSIO ;GO SEE IF WE SHOULD STALL THE I/O ;PKW109E< BCC 70$ ;IF CARRY CLEAR, THE I/O WAS NOT STALLED ;PKW1099 RETURN ;IF THE I/O WAS STALLED, JUST RETURN ;PKW109N70$: ;**-8K .ENDC ;DISK CONDITIONAL8 JMP @I.PRM+6(R3) ;GO TO END PROCESS ROUTINE ;PKW109 ;**-3P:100$: CALLR CLAATN ;PROCESS ATTENTION MESSAGE ;JJM307H200$: CALLR TMOGCS ;PROCESS IN TMOGCS ROUTINE INSTEAD OF HERE ;JJM307 .PAGE'00t34l1DATADATADATADATADATADATADATA .SBTTL CLAERR - FATAL ERROR RECOVERY;;+(;**-CLAERR- A FATAL ERROR HAS OCCURRED;EJ; ON FATAL ERROR RESET CONTROLLER AND UNIT STATES. CLEAN UP C.OLHD QUEUE; DEALLOCATING ALL PIOPS;LI; FOR DISK, MOVE C.OLHD OLDEST I/O TO C.REDO SO THAT IT WILL BE RETRIEDIJ; THE CONTROLLER COMES BACK. MOVE ALL COMMANDS IN C.OLHD TO THE FRONT O;*; FOR TAPE, MOVE ALL COMMANDSE;T ; INPUTS:E;J; R2 ADDRESS OF QSTG; R3 ADDRESS OF CSTR; R4 ADDRESS OF SCB;; R5 ADDRESS OF A UCBT;E ; OUTPUTS:;C; R2,R3,R4 PRESERVED; R5 IS A UCB ADDRESSU;->TMOERR: MOVB #4,Q.RTY(R2) ;SET UP THE RETRY COUNT ;PKW109 SEC ;LOG ERROR ;PKW109G CLAERR:1 BIT #C1.FAT,(R3) ;DID WE ALREADY DO ALL THIS?O* BEQ 10$ ;NOPE, IT'S TIME TO DO IT NOW RETURN ;DON'T DO IT AGAIND10$:;O1; IF CARRY IS SET THEN LOG FATAL HARDWARE ERROREF; THIS ROUTINE IS CALLED ON 11M BOOT IN WHICH CASE THERE IS NO ERROR; .IF DF E$$LOG  BCC 20$4||, QW 2'TISYSYSYTIOV> V(>A B C D E F H J K L M N P R S T *,.DLjln $&.$"pFּ 8)t ־*̯E5 @ί&` ,1ť  ť/wrw w ť: 5ť/ ޾   ~  Aw,N& w  ⣷x b,L @: 7 R 7 F R J&z C4@   '7HmxB5<76mb0 ,?!& [~mFE! M Մ   rB  >,7m5m @@ EE@P5@Q7mߊ@] @ %lU7.& NBw w\ @wp A W X f7      2 2   v-x wA@,A1 ` 6 4 4w * " e   Fwh @e-   z 44@-5 & 5E@ ` P  T C - 4~w-, Ћ\1LB2,e f f& Df lΊ SbDS C&N` b Mb b"Sp55w0e ! 7 wV%e "4,TX0XJX$X5 HX$Xz>XXA&TTUlE$TT T Af e e w0  Օ0043t3eaekՕ %e  f x7|W7XW57|W7XWeE$55 55 ? $XX:77 @ew| 0w[ ЪwXwP ť Ћh,,    h1, .J $& !,  EEB!B-  ,!-  EK-s- Z[wd7 t W W W ־   %      % w"wЫ  Ы  z8& $ n tN #-@C #C(#F5C %־-(٫ jХ$@ %O" 5 $% I JwwKܫt(z Q l "n5Z N  % džH& `5f --Hz \Np P  ؼ$   2]El& w %% wAE7 A  Deaw7  7!   $  * l w<77 & U 0 &&f DE%\ d   Д  >| 7 v fLť $ 4w B$P)wf)Е[  Е,  Е]容7w (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA >EAa$ & & @( f  e ee e &3 w  ť ť 0B Aaw ' UD$BA L&( U BQ Е* Command I/O errorFile %X not a valid driver task imagePrivileged commandI/O error on input file %XFile %X has illegal STB formatSyntax errorDevice %2A%O: not in systemPartition/region %2R not in systemDevice not mountedFile %X not contiguousOpen failure on file %XTask image I/O error in file %XPartition %2R too smallIllegal driver task APR usagePartition/region %2R is a commonDriver already residentDriver being loaded or unloadedInsufficient pool spaceLoadable driver support not in systemDriver not loadedDriver cannot be unloadedDevice %2A%O: is attached, busy, online and/or mountedInvalid driver data base at offset %P in file %XDriver built with wrong executive STB fileWarning - KRB %3A interrupt vector %O too highInsufficient ICB pool space for CPU %1AWarning - KRB %3A interrupt vector %O in useSymbol %2R is undefined in file %XSymbol %2R is doubly defined by file %XIllegal value for symbol %2R in file %XDriver dispatch table is inconsistentCTB %2A is not supported by driver -- not loadedCannot load/unload a pseudo deviceToo many symbols of the form %2R in file %XCTB %2A does not existDCB table for CTB %2A is fullKRB table of CTB %2A will not accept KRB %2RKRB %2R not in loadable data baseCTB name %2A is a duplicateWarning - loadable driver larger than 4KPartition/region %2R is not a commonKRB %4A is not offlineIllegal use of partition or region %2RPartition/region %2R already loadedPartition/region %2R canno0054l1DATADATADATADATADATADATADATAt be loadedPartition/region %2R cannot be unloadedPartition %2R not in system, defaulting to GEN:Lr̲ 5Mmijܳ:Lfδ(P}ȵGj˶6_· 4_  ęsyLBABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw @&& D¥%  B&ХVA C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & en 6& eZ /& e*AHŀ ȕ Е Е Е & e & e Е A %& e A x Е A bEA EЕ A DA   $Е. , AЕ; ^    w V D&& bЕ- eaePPPЕ-$w & D  &Е. ce  Е:   Br 4<>BZ^`bdf\}tU}vYMx|z<|t!~z%g';@; ;;;@;%;2;>;D;K;@Q;W;d;p;v;}+{p :^ =&D:L Net^vv""v?T8r| e"쩔$6&6(6Ԁ*74,7f.7&0T|2T4qZ6[M8z}:U#UNL -- VECEXPVEC'&1  X  *8զ5ew , Bv     5Bw f&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 e'5  5 2  00 53t3eaekUE  (ՇE U 5@*& E& & f&ËDef Ë )̋U 5 ߥ& *  + 23E Ew    Е-   0@A W e`fÊ    E &   `@ ` B   & A @    &  m  f A N  %&f w ^*8I *=)98  eB &&  U **e *Nlv ΋*.2  & #!)&eP(e && >e >E bp* wbw B(DB C DBe ?D(e(e$2e (%[]%<>  1 >w  ) X8C $* ) *w*  ep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  8 V *`)w jC#    D @)  6?0D)82e&( 0 0 0 80 B0 0 0 0)#0.0+1(e  %&p*w f( f)f )"(. = . B  E < (.8Ae f"( UCɗ&+(e$&% &ff **w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ  *) l0, *) $ )*)0,40,6 e6p 4 8  81416  6 \   8  **  DP5R RRR w eE D` bl lrw   B eE"s    s-  Csl8e2 ..8em,0l0!D0e6p 4.) &f v e) .  e6p 4 &08*wB=p!Օ^141612epl2l0p,*1 U8UMw w> B 00fep=& /e`pwn46f %8 E D/D!D l0l8epl0pɥ.ɕ w0,0, f 톇,, w      .% T eB U5UU D plp & NeՀ)* 858, * 8՘eB  8 $&w *<S1   K U U@  f&" X'&)'&&* *%0*ND  ( EU   Jĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ ,z  (DEe    *1  ˕03 "   ˔Ӕ ʥ7w BC "&0054l1DATADATADATADATADATADATADATA @SY&*p0p210=E%0=w(*e "f D CB.E   f . >5>Eu 6  (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w , *$ ':T U@% DD%][%><w  w1  %,,:4 w r*D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce b   *w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@(e( 1  `((   >: 5 eCe5%& w >&Ba +- ʥ# . U 0   b   `     w ( D 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB  L \# U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff > N&*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@)) *R*)@#0l C# 028 00ĥۇAĥĊ  000 t0 @0 &*0 @ u .# eB&B B  * eBe>  # #D #=0/H#@&0 # = e0   X0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2w BC "& @SY&*p0p210=E%0=wV(*e "f D CB.EM=f(& e %&&eH =&e0  U   E > >E=uf rp  wl " f \&* *   f >5>Eu   Mw> =00l&8el2 0 *00J53t3eaek|r,sQW TTITISYSYTIOVz@TzVrxTITISYSYTIOV(@،r|@SY ALL  w  ť ť 0B XAaw (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$w ' UD$BA (&( U BQ vЕ*  & & @( Rf  e ee e &f& v JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw 2D&& bЕ- eaePPPЕ-$w D  &Е. ce  Е:   BRMD - Segment '' not foundRMD - Terminal type not yet supportedRMD - Terminal/page combination not yet supportedRMD - Page does not existRMD - Terminal type not definedRMD - Allocated screen buffer too small for this device}RrqX]_QUq..M..I..P..CMDHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLATHLCGCDHLHLHLHLIOHLHLHLMDHLHLHLHLHLSSTHHLHLHLHLHLHLHLHLHLHLHL$:\^lr&*,Dr "$&(6<N`*     %  91  j    7  ));xDD>W,TI,|7! vڥ ܥw2 XwTN w  p  wd w$75V0ѥ  ) 'Cӥ,   @E 5@ (7ww  7z7y7x7w7k7j7i7h Fw0 8w& *w ww w w p  w <  S7  J w E 2 w!HvDr t" 0 _ a^  rT3(@ w n$"37E%4%1%DE 5@ (7(!xs(!Xs5 ث!,s Vڪd!s &B3%*00R54l1DATADATADATADATADATADATADATA  M%_<3T3l3333  6 ,eBEŊl&f&D lΊ L'&1&wLw \,D B A, ,5eaE5 EE f & & 1     &w*5  5U ^4~ E U *5@*& E& & f&ËDef Ë )̋U 5 ߥ& *  + 23E Ew Z   Е-   0@A W e`fÊ    E &f &   `@ ` B   & A @    &ff >rW!.}R@rqNZPP>^,P>nP>~`,>LP,>P>NS@NZ(P@η,,@H޷,Q@HQ@HQ@HSQ@HLPQ@H.`Q@ >,3@N,m @^,M~!@n,m"@~,#@,:$@`,y%@`y&@``y'@`θLPy(@޸:)@:*@`:+@S:,@LP-@.`.@>/@NLPm0@^`m1@nm2@~M~3@M~4@LPM~5@`M~6@m 7@ιm 8@޹Sm 9@LPm :@`m ;@ 3<@ 3=@ .S3>@ >LP3?@ `3@^ZPP@Nn,_A\N~Q_DN3_ENc _FPNC~_GTNc_JNκ_LN޺:_M8N^y_NdZxPNd8UqOd,XPd4.QXSd@ >Q]ZdƜNQQ\d<^3X^dni X_d~I~XadƌiXcdƐXddt:XfdyXgd λy]ldư޻yQndl :]sdƜ:Qu00Z53t3eaekdƬ ]{dxQ}d .p]dƄ>cQdư NP~]d8^C~QdƸnp ]d~c Qd3]d ,]d,Q pȼ R{99999LPSLP`LPJwLPLPLPLP``````LPLPLP``VWXYZ-C`.LP5#5v&&5 LP5 S 7μMx  7)7 ެ^ Е )w W! \U 7 P7 JެF@mx yе Cm Bíz?mĝ D &fe  tmf^  e  LÝW!   W! Օ x CW! fU ŀW! R ȵ W! 0Օ $ &w^ W! U w帼-bثw-T@1ث6PHHJY P P 00b54l1DATADATADATADATADATADATADATA PHHJH  %,/:D&&&&33    FEEE%,/:D #(5(5  FE!$.8 #(5  BABB%,/:D&&&&33    FEEE%,/:D&&&&33    FEEE00j53t3eaek,6,<,<     , E , E-;(9(9(9(9(900r54l1DATADATADATADATADATADATADATA,6,<,<     , E , E-;(9(9(9(9(9,6,<,<     , E , E-;(9(9(9(9(9:D !!,,??          ! ! !!!!! ! !!!!, , ,,,,, , ,,,,7 7 77777 7 7777? ? ????? ? ????K K KKKKK K KKKK:D !!,,??      !! !! ! !,, ,, , ,77 77 7 7?? ?? ? ?KK KK K K:D !!,,??          ! ! !!!!! ! !!!!, , ,,,,, , ,,,,7 7 77777 7 7777? ? ????? ? ????K K KKKKK K KKKK4> !!,,         ! ! !!!! ! !!!, , ,,,, , ,,,7 7 7777 7 777>H)05:CL)05:CL, $05:?L $05:?L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L>H)05:CL)05:CL, $05:?L $05:?L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L00z53t3eaek>H)05:CL)05:CL, $05:?L $05:?L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L>H#:#$2>L    0G: ".:F)5AM   ) 5 A M   ) 5 A M   ) 5 A M   ) 5 A ".F)5M)5M ".:FBBBB>H#:#$2>L    0G: ".:F)5AM   ) 5 A M   ) 5 A M   ) 5 A M   ) 5 A ".F)5M)5M ".:FBBBB>H#:#$2>L    0G: ".:F)5AM   ) 5 A M   ) 5 A M   ) 5 A M   ) 5 A ".F)5M)5M ".:FBBBB0:  ) *5@ -:G /<C     ( , ( ,(,(,(,(,(,(,(,(,(,(,(,0:) *5@ -:G /<C0:  ) *5@ -:G /<C     ( , ( ,(,(,(,(,(,(,(,(,(,(,(,0:  ) *5@ -:G /<C     ( , ( ,(,(,(,(,(,(,(,(,(,(,(,0054l1DATADATADATADATADATADATADATA 0:!!!!      !      !      !      !      !!!!!!!!!!!! 0:!!!!      !      !      !      ! 0:!!!!      !      !      !      !      !!!!!!!! 0:!!!!      !      !      !      !      !!!!!!!!!!!!!0:!!!!      !      !      !      !      !!!!!!!!!!!!55 50053t3eaek5 5#VmT  7r - m4 ( m }      0054l1DATADATADATADATADATADATADATAS& lEf Е:[  !"#$%&'()*+,-./0123456789:;<=>?@@AABCCDEEFGGHIIJJKLLMNNOOPPQQRRSSTUUVWXYZ[b/0053t3eaek@  z ^ `eެs 7 r UP POOL=SECPOOL=TASK=FREE=IN:OUT:PARSERRSEQD h^v5[]5U Fm m *mW!w 5G5)5 =mt܈76505D&& B PB 555 5:8<68|=  j|  jlRrՀ  V rj j2RrՀ  E    @r<w4 rw&7 j  Е:   Е:   jRrՀ 5ğe@7@:   P4jНН% %A A *IDLE**OFFL*jPRrՀ 0054l1DATADATADATADATADATADATADATA& 5 j j  zЕ.Е:  fЕ.Е:v Tȕ.jRrՀ  t5 j jՁ  Е.Е:Ձ  Е.Е: ȕ.jRrՀ 5@|}pd7r7-RH7F 3 j j rЕ.Е: `Е.Е: Nȕ%jRrՀ  t3 j j Е.Е: Е.Е: ȕ%j RrՀ j   fF x3jPtAv Е:Cw {Τθ:aa ȕ.ЕDЕMȕO ЕFЕOЕRЕOЕFЕL jfRrՀ  b T Pj& j:RrՀ  $8    j          B  xȕKjRrՀ    jr 4jRrՀ  t; ^ Z V Rj,*            B  ȕKjRrՀ  Z Z^Vmll  j m<m4mJ, L "   jj "ȕ.jRrՀ %wJ@,w *w,Fw,>CCl  C&Cl`  mm=- w /&f)Aj .ҁA "jaMMՀm& w:  &aȥ ȕ Հm 1  HHՀ e w1  ȭZȝTՀ HHՀ ȥ ȕ Հ  &aȥ ȕ Հmj ȥ ȕ Հ V    $ ( COMMAND > RMD - Illegal command - ѥ,  C w7ރ   ~Ʈ D   . fP ư7fʥ ʥ` C wVnLjf\XfJ^Ff84f&"fffɥFɥRRwnɋɥ1ɥ4= E EWqD e ¥:%7 B  ~,5@ 55   ez Uɋɥ=  ɋ@ wjهw3The following commands are available for this page:1FREEn=ddn: to change free entry 'n' (1-4) to ddn:/RATE=s to change replot rate to 's' seconds to return$Use the following keys to switch display pages:A - Active Task DisplayC - General Cache Statistics DisplayD - Detailed Cache Statistics DisplayH - Help Display (this page)I - I/O Counts DisplayM - Memory DisplayS - System Statistics DisplayT - Task Header Display lets you enter a setup command if any setup commands are available for that display page replots the current display page or exits RMD  fRɋ mW  Rɋ mW v vRɋ mxW #ެ^B ѥ Հ0053t3eaek Name Length TI Pri I/O Status flags jd 2Е ЕV\ Е ЕBЕL2 Е P   ЕKFЕOЕWЕNЕ=PPPPPPfP ެ^B ѥ Հ Task: Partition: Status: Own: I/O: Dpri: Pri: Spri: Len:R0 = R1 = R2 = R3 = R4 = R5 = PC = PS = SP = $DSW = Eflg = LUN File LUN File--- ---- --- ----    $ (3THE FOLLOWING COMMANDS ARE AVAILABLE FOR THIS PAGE:-RATE=s TO CHANGE REPLOT RATE TO s SECONDS'TASK=t TO DISPLAY HEADER FOR TASK t TO RETURNILLEGAL COMMANDILLEGAL TASK NAMECOMMAND > %7 ~7 |ٱ  2Е ЕV Е ЕBЕL Е P   ЕK   / vk f ެ^B ѥ Հ V BL Cache Statistics (Detailed)Device Name:Region Name:Region Size:Cache Status:Requests Being Cached:VirtualReadaheadDirectoryLogicalOverlayTotalReadsRead Hit RateRead Load RateRead OverlapExtent Too BigMax Extent SizeWritesWrite Hit RateWrite OverlapTotal I/OPrimary Pool Allocation Failure Rate (as a % of Total I/Os):Cache Pool Allocation Failure Rate (as a % of Total Read I/Os):Read Load Failure Rate (as a % of Cache Load I/Os):Deferred Write Rate (as a % of Total Write I/Os):DfƞƫƸ"0?L[krǁǏǙJ JfD "t@ { R z  \,  z $ &5@5 5 w!*q1   e|C xz    nȕ:5 ެ^B ѥ Հl V BL Cache Statistics (General)Cache Region Name:Region Size:DeviceTotalHitFailLoadTotalHitFailDeferTotalCacheNameReadsRateRateRateWritesRateRateRateI/O OpsUsedDfƝưƽ $)1 f "t {f R  th2d6C ެ^B ѥ Հ< V BL DeviceNameI/O CountI/OPer SecCylindersPer I/OWordsPer SecErrorCount/limitlastavgsofthardDfƀƇƌƖƚƢƬƴƺ f "t { R Bz  ,e   z 4 :5@ 55 w!w!w!w!w!w!q1  e  eC C C \z    ~ȕ:e ެ^B ѥ Հ0054l1DATADATADATADATADATADATADATA V BL Total tasks run:Total logons:Shuffler runs:Error sequence:Current tasks:Current users:System pool:Secondary pool:Memory utilization:Checkpoint utilization:ItemTotalLastAvg/SecDirectivesQIOsCPU ticksZero CPU intervalsCheckpointsf@FJNRVZ^bf j%n*p0r5t=vH~MdžWǎjǖ 4f. "t* { R vA@P ެ^B ѥ Հl> HLPTX\xlߌh߄5?,;" |x:7 ޷ *    4"0m 5@wގސ 47w7 7 l l7jhwf    AmB DmC E86 ^ހ `A T w  l d2ހ `A ( w $zv z vx=  fx  fRrՀ   f~ fRrՀ D6 1  fD . fBRrՀ  BRrՀ e .5 f ff  Е.Е:T  Е.Е:B ȕ.fRrՀ  =5@,9pd7r& f f <Е.Е: *Е.Е: ȕ%fZRrՀ  F+ >d vC f ȕ%fRrՀ  7 F fЕNЕ/ЕAd$" C f Jȕ%fRrՀ  w ~ T j`RrՀ  P  j2RrՀ  "  jRrՀ  (  jRrՀ  0 | jRrՀ  r F jTRrՀ  D  j&RrՀ  $  jRrՀ  ,  jRrՀ  4 n jRrՀ vrnjZVnjZV~z7 C B &ffƁ N.d C q  f Е Е0Е.Е0Е0f' &' &@Е Е   0   0 "  Е Е Е Е  &   B A @  E A  V    $ ( COMMAND > RMD - Illegal command - ѥ,  C w7ރ   ~Ʈ D   . fP ư7fʥ ʥ` C wpnjf\XfJFf84f&"ffɥRwɋɥ=  ɋ@ 8 w"ڇw^1The following command is available for this page:/RATE=s to change replot rate to 's' seconds to return0053t3eaekOffline Dismounted ߢߚzߘ<?@A0r+    BB'&%$ e.e 1 ,1 ,z rl߀ `A b "wx= ~ x  ^RrՀ  H ~ $RrՀ  4hX& e ~B}}*AB ȕ. RrՀ / RrՀ  RrՀ  RrՀ  ,uu u uu u"D(@*t@ ,.& e ~'}#}&fjDee BRrՀ RrՀ @ ,.& e ~'}#}&fjDe e  RrՀ  RrՀ V ,D& e ~=}9}5B* A(܀ `A  Jw&fnDee RrՀ RrՀ @ ,.& e ~'}#}&fnDe e  RrՀ  RrՀ V ,D& e ~=}9}5~m 5@,ABB Aw&fnDee  RrՀ  RrՀ V ,D& e ~=}9}5~mX5@,ABB Aw&fnDee  RrՀ  RrՀ Z& e ~D}@}<~m53/ ru%$*d _ A%  Е/ A$   RrՀ  RrՀ Z& e ~D}@}<~m53/ u'&*  A'  HЕ/ A&  6 RrՀ  RrՀ & e},ee. wqqq qqqe. fbC B &fƁ N.d C   < Е Е0Е.Е0Е0f' &' &@Е Е     0 "  Е Е Е Е  &   B A @  E A  V    $ ( COMMAND > RMD - Illegal command - ѥ,  C w7ރ   ~Ʈ D   . fP ư7fʥ ʥ` C wRnHjf\XfJZFf84f&"fffɥDɥRPwnɋɥ1ɥ6= EED e ¥:%7 H  ,5@  $ fWqez UWq.5 <‡ɋɥ=  ɋ@ wnهw3The following commands are available for this page:5DEVICEn=ddn: to change device entry 'n' (1-6) to ddn:/RATE=s to change replot rate to 's' seconds to return,Total (No such cache region) . disk blocks)   7 ,\ "55  ߿hؕd6 7p߮5 E wf@ .  p  w\ X<-׊-׌ &&, p6   w0054l1DATADATADATADATADATADATADATA&  @`4 ?5 eC`A C`A67, @eAe @eAe @e,Ae @eTAe @e@Ae AeIqImq qmQmI Im@ehAe N@e|Ae >@eAe .@eAehBe H@eAe uuA E eQ Nwz= z b 0RrՀ   \RrՀ  l dRrՀ  %47 P A0 vЕ Е( ( bP RrՀ RrՀ    e  1e( bq 1l $Q$ A "E d  R CBED CBED CBED ~CBED dxCBED J^CBED 0DCB : ,"ezE @RrՀ 2ez, 'P PPA Е:RrՀ  :e|  |BA  6he~  XA  He  8A  (e  A p e  BA  e  A , Re  A  2e  A  e  tBA  .`e  PA  >ez .e| e~ e e |e e \e Le <e le   VwxRrՀ RrՀ  RrՀ &f7 AQ *&fd wd $C ` vЕ. RrՀ & Е   P Е%Е.RrՀ f' &' &@Е Е     0 "  Е Е Е Е  &   B A @  E A  1 dq 1d dq 1d dq 1d dq 1d   2RdJ RdV    $ ( COMMAND > RMD - Illegal command - ѥ,  C w7ރ   ~Ʈ D   . fP ư7fʥ ʥ` C w4n*jf\XfjJ<Ff8\4f&"fjffɥRwtEA:w`ɋѥ=@Ћ @%@ BD 6E7 DJ s 55  ɋɥ=  ɋ@ wهw3The following commands are available for this page:0REGION=name to change the displayed cache region0RATE=s to change replot rate to 's' seconds to return(Offline) (Dismounted)(Not Cached)(No UCB[X]) EnableActiveDefer z b^ZMM@M0<44; 1@-<>@BDFHJL^-    w w @eAe J@eAe :@e,Ae *@eTAe @e@Ae @ehAe @e|Ae @eAe @eA0053t3eaekehBe$ @e$Ae8 ^Ae$ڕ ZADCCBEDp0 -2|CBED p0 F-@4C B"E D "p 0 f-onC$B&ED$&p0 -]('C(B*ED(*p0 n-h\*%CBEDp0 &- C,B.ED,.p0 F-MQC0B2ED 02p0 -@ C4B6E D46p 0 N-H<C8B:ED8:p0 n-x|C<B>ED<>p0 &-kzwCBEDp0 v-p@dCTBVEDTVp0 .-(CXBZED XZp0 N-VdC\B^E D\^p 0 -SC`BbED`bp0 V-P DCdBfEDdfp0 v-CBEDp0 .-4=C@BBED@Bp0 ~-x,lCDBFED DFp0 6-0$CHBJE DHJp 0 V-_hCLBNEDLNp0 -W!CPBREDPRp0 ^-XLCB ED p0 ~ -  C|B~EhDj|~ph0j 6-WVCBEpDrpp0r -@tCBEtDvpt0v >-8,CBEDp0 ^-}CBEhDjph0j -k7;CBEpDrpp0r f-`%TCBEtDvpt0v - CB ED p0 >"-""fCBE8D:p80: -P|JCBEDp0 F-@ 4 CBEDp0 f -CBEDp0  -zn= h ~n z ~HRrՀ  2 l~t n~RrՀ .a , #6C  RrՀ ? RrՀ / RrՀ  RrՀ  RrՀ  Z b[7 B:H5 0#/7~A>t> A@t@ v~RrՀ RrՀ : (47~ ~ABtB0 b~RrՀ RrՀ bV FD*P~ ~A<5Ɛ 5@5Е,Е Ɛ 5 ,Ɛ ~RrՀ RrՀ r `xl7r~ ~A<t<5ЕDЕiЕrЕ,5ЕOЕvЕrЕ,5ЕVЕiЕrЕ,5ЕLЕoЕgЕ,5ЕRЕdЕhЕ, ~RrՀ RrՀ  ,7&BAt 2   z7BA t   n J7B A t  j@ 7BAt  : p7jBAt r  7BAt B  8 72A P  f  7A , rr B  7A  NP   7A  0054l1DATADATADATADATADATADATADATA*.  7A     7A   e 7_A x  B 7 7BAt Z  d 7^A h  ~ B 7  7A  J   7A  &r  7A"  RrՀ  RrՀ &f7 AQ *&fd \wxd C ``~ vЕ. ~RrՀ & ~Е ~  Е%Е.~RrՀ f' 2&' (&@Е Е   ~   0 "  Е Е Е Е  & 4Շ  B A @  E A  1 dq 1d dq 1d dq 1d dq 1d   2RdJ RdV    $ ( COMMAND > RMD - Illegal command - ѥ,  C w7ރ   ~Ʈ D   . fP ư7fʥ ʥ` C wBn8jf\XfxJJFf8d4f&"ftffɥDɥRHwnɋѥ=ɋ De $¥:%7 ^  ,5@5 ( "#fWqez UWq.5 <‡ɋɥ=  ɋ@ w~هw3The following commands are available for this page:*DEVICE=ddn: to change device entry to ddn:1RATE=s to change replot rate to 's' seconds to return\^`b̒fhjlnprtvx͒z|Task not in systemTask inactive or out of memoryNo task specifiedNone  6(  5 &5 v7 0053t3eaek ? 7(Q Ջ 0`U:% $% &&A l<($& <%Ce>E   7 /`=  ,p`  pRrՀ   pf pRrՀ p  pRrՀ  5 R"p  P(p RrՀ p    wp  (pRrՀ pA%w 2A , pRrՀ  e(p jA AE* A &p@RrՀ - p P(pRrՀ p  =   . ,C6~N wjp   RЕ. pǂRrՀ    p  F  @&p2RrՀ  p RrՀ  pRrՀ f  ~pRrՀ #pRrՀ   pRrՀ  pRrՀ p 7(7&C pRrՀ p 77A Е0Е0 pRrՀ f  p  A &Е. pRrՀ  ArE`pA pRrՀ p  A Е. pRrՀ  ArE`p  A fЕ. pRrՀ ww~7|?w p \ wJHD -   ǐ #pRrՀ -EXERDNMSGCIPRUNBLKCKRASTDST-CHKREXSEFTIOAFFHLTABOSTPASTPSPNASPNWFRAWFRACP-PMDREMPRVMCRSLVCLIRSTNSDCALROVNETMPCCMD& Е   Directive error: FID = SY 4DЄ :8w AA,5@ 4т53 F//B%)%e A5Cl2A&5Cl .*&7 7 7 ]]w Ud0l,5]]. P H @  Е. ,  Е; >!JАV. DЕ.\А(V ,Е,J Е)V    $ ( COMMAND > RMD - Illegal command - ѥ,  C w7ރ   ~Ʈ D   . fP ư7fʥ ʥ` C wnjf\Xf.JFf84f`&"ffffɥRɥTɋɥ=  ɋ@ ‹wهɋɥ=  ɋ@ $ w w١3The following commands are available for this page:/RATE=s to change replot rate to 's' seconds)TASK=t to display header for task 't' to return&f   fj `-Z0 -70054l1DATADATADATADATADATADATADATA<)&  4lW!* * = p  | PRrՀ  :  pRrՀ fJ !:%^ %ެ ԥ  ՀA PA JRrՀ    A S  DЕ0Е0RrՀ PP   A RrՀ    A Е.RrՀ    A zЕ.RrՀ   A AE* A 'RrՀ w8-EXE RDN MSG CIP RUN BLK CKR AST DST -CHK REX SEF TIO AFF HLT ABO STPA STP SPNA SPN WFRA WFR ACP -PMD REM PRV MCR SLV CLI RST NSD CAL ROV NET MPC CMD &  V    $ ( COMMAND > RMD - Illegal command - ѥ,  C w7ރ   ~Ʈ D   . fP ư7fʥ ʥ` C wn jf\XfLJFf~8>4f&d"fff"ffɥR ɥPɥT(ɥOMɋɥ=  ɋ@ ‹wهɋɥ=  ɋ@ ‹)wهɋ$ɥ=  ɋ@  wp ȋ w^TH܇wɋѥ=De b¥:=7 %TI x7ه ه n h   %TI  @ \͕:ALL7 ALL  ؇3The following commands are available for this page:/RATE=s to change replot rate to 's' seconds6PRI=p to change maximum priority displayed to 'p'=OWN=ddn: to change owning terminal to ddn: ("ALL" to reset))TASK=t to display header for task 't' to returnfƇ00783eaekx|z:d W id0䠖>0d|x0rDN $&>HJr@BDFʠ7 &U 7 x p7 ^::7 7 `]7 Ew@e 55 7HD We557* m5  5<584 wUP&B @`5 EWt  5 s5 R4 X7wb>7 n  j` R& &&  :   $WC COF & 7 5ܠBAKC ll N u! NܠA   >Nlc #  J!UtE w5B&, 3` 2EnC+ 5C U ww R E$e  ՕՕU  ՕՕ? dd \\ e@ Bچ nE$e`e```:   4 3EPE] œ  T U &:82$E$e e   , A@W SYSYSYSYTICL2  ww `ww0084l1DATADATADATADATADATADATADATA~Wz:d>> W T TIfd0TBdTI>=0dW~0=l,>*.D   f|ޠ HR@*5  5@ ZTM(C5 hE8E@e :T%$Lt@ e f@ 0% 0#  s E jTTL@ ~| 7>< V n &A A L eBm*eABE d8 W l50߭ \Ww7 6D&5? BE: T  h W5@7 Jrt, f,| ( "  $E E@@ 2wB    & E@4%X[ j  Bwp n%M%J%G%<7 7 Z 5  7b7^7P7LD > Е 5 Z$ Е-Е-Е Dj W!W!W!6@h%%%Е"  Е" ^ -- w>  2 &f 0` (@ Z wЕ ȕ*Е xЕ ȕ*Е   Е  @~ wx7vW Е0 Е:! (B$& +L'56 7 ) 2 F f& 44   PPЕ= .&  $& bE Е:ȕ   5 eD-5 :  5W,VT  0 Z1 & & @( f  e ee e Odd address or other trap fourMemory protect violationT-bit trap or BPT executionIOT executionReserved inst executionNon-RSX EMT executionTRAP execution11/40 F.P. exceptionSST abort. Bad stackAST abort. Bad stackAborted via directive or CLILoad failure. Read errorCheckpoint failure. Read errorTask exit with outstanding I/OParity errorAborted via CLITI: virtual terminal eliminatedTask installed in more than one systemRequired bus runs are offline or not presentSST abort. Bad CSM parametersCPU time limit exceededUnknown program detected faultExecutive interface parameter errorOverlay load failedNot readySelect errorCheckpoint write errorRead failure. Check hardware statusDismount completeUnrecoverable errorLink downLink upCheckpoint file now inactiveUnrecoverable hardware device errorMemory parity 00883eaekerror in partition Micro code loader not installedAccounting sec. pool allocation failure for Allocation failure on task account block for Task "XXXXXX" does not contain a debugging aidReplacement control task not installedWrite back caching data lost. Unit write lockedRemount verification task not installedI/O stalledI/O resumed Task "XXXXXX" terminated on processor "X"And with pending I/O requestsPostmortem Dump not possiblePostmortem Dump will be generatedTask load device dismountedCheckpoint space allocation failureR0R1R2R3R4R5SPPCPS Ѩ,BQf{Ʃ!Ah˪̪#/>UyΫ4a=I 5 ߥ& *  + 23E Ew    Е-   0@A DW e`fÊ    E &  m  f A N  %&f ,ˮ A@W SYSYSYSYTICLXDT -- Initialization complete and successfulXDT -- Sorry, couldn't allocate pool space -- Node address = %P%N -- XDT Address = %P00_!)w ,w &w w w w  _w EeEvxrlh_HXDT -- XDT being unloadedeDeFp&¢e67 26  (p7e NP  ew&Tewewee wewewe(eRe%e rn7f5Zee\edeߕX  <52eB- e"ee je fe?* VTe<ve,ee.ߕ  e6 e@& & &  f&& &  ʋ>>>>>>>>>B(j@vtD D lllrllD 01234567SALHCQFBGIRģ֣}~\/'"%! ^_@><$=CQ.;-+*,BGKLOPRSXID  LVĬЬRr2"ZT`ƫܫx<Ұ֪Ȱʱұ$0/$1/$2/$3/ $4/$5/$6/$S/ $6/@ 172352/172354/ 172372/172374/ MOVCMPBITBICBISADDSUBCLRCOMINCDECNEGADCSBCTSTRORROLASRASLlagellI - BKRAMMARKDPFMMFPIDPTMMTPIlagellI - BTXSSXTMULDIVASHƥXORASHCBPLBR BMIBNEBHIBEQBGEBVCBLTBVSBGTBLEBLOSB(CC,HIS)B(CS,LO)NOPCLCCLVpCLZxCLNĦCCC0SECSEVЦSEZئঀSEN$SCCCLC!CLVCLC!CLZCLV!CLZCLC!CLV!CLZCLC!CLNCLV!CLNCLC!CLV!CLNCLZ!CLNCLC!CLZ!CLNCLV!CLZ!CLNSEC!SEVSEC!SEZSEV!SEZSEC!SEV!SEZSEC!SENSEV!SENSEC!SEV!SENSEZ!SENSEC!SEZ!SENSEV!SEZ!SENNOP(260)NSRTIBPTIOTXRTTHALTWAITRESETSPLCSMTSTSETWRTLCKJMPJSRCALLRTSRETURNEMTTRAPSWABSOBILLEGALFADDFSUBFMULFDIV;pɨѨڨ਀py0084l1DATADATADATADATADATADATADATA;@EJJJJJJUZJJJJJ_ekCFCCSETFSETIFPP - 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)|||Զζ@ζ ~|zZp@2 22@ ` `ʷBBBB@Ը @(@p&@tLBD<>,:8246LPJFRH  ; w 6dDe w &l%*eDlr d w, > 5r 4  @@$i%  ` %44֣ģ K Et  =  裄    D E= e0, @ VN f H?p >7 XDT>7  77  7~w   pyvjtf[UwJ7D<4  !7$ 77w77%5 f L    7m B  77 w Hnh .a7XV 7H 7< eB` %.$" D_ & 6> ,wPw "EFRMPB3!SON)w $OD@w &BED7#w ~(IOFw j.ILH w P*EMjJlm5-X7PPN@XW N w%>  @&"  "%<7ĝ(C `K \ t!TE w7o ģ8 ģ e0B7L fS5.:@7  %BC     FNw7 %EM1N ^E%$BC5 e e  %x>  K   77<76U.$E%> ZK " "%醟lde?rNX \? ? ? 7 7 e27 h7f7`[ 0ģ׭IB:Uf -- /--N 7f w\  LN <w  f | ^ %jfvbr^ZIjDb% P7`,-(  + @f   m77  c e  v0 7E ` wA A ы d z%%E6XDtK K 5,   7  d5  n5%%&D ??%% 7%%DDT>4F.e 4  7 KKE ߋprE w `|$&%a%z + 5  ֌-tߋprŀΥ֥ ߋprŀ֥? %Lr  &jB'D %"%$% 唣 \U  N,t @r e0 @l  z Ne0,7` 7 R7N&e N @ e0  XJ:  @ ( e ee e @(.   ,B    5ZI 5&?U CACI%zwE E wƧE @E% %% , <wN 4, w@E Hw2/E? & zwAC@ Ew<CEE % D, 4w ,, 0wCAEeCE3  , wCE?%%wzCE?% o @E wf K bCC wN D @ rw4xE?% | "E% f, jwE00883eaek% % Fw E~ (,.-@E wEȥ UE .@ e- +@ w|bmf l w` \ wPE Xw@^ <@E hw*t & ~w9 &w @ :   ` ` @ @@ B fv @@C CE 55@ V@/` e 5  +-( )@E%&Re0%SPPC`# .e$ ee ~mee d & &Ee0  2#/f7 n7 l X7b N7Z Dlffe` 7#27-,% ǿ<6ک Z"A90$  .@KpD` $ w t ť ť 0B |Aaw B' UD$BA T&( U BQ Е*  & & @( f  e ee e ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw B&& D¥%  B&ХVA C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& e/& e *AHŀ ȕ Е Е Е & e & eЕ A %& eXA Е A bEA EЕ A A   $Е.  AЕ;    w XD&& bЕ- eaePPPЕ-$w (D  &Е. ce B Е:   <B&  m  f A N  % 5 ߥ& *  + 23E Ew Z   Е-   0@A lW e`fÊ    E &f &   `@ ` B   & A @    >`CxQbisiTtsehrsW)XT[8rWrVrXrݩWߩ^(.`666666߀6Ԁą߅Zn`&ϫyh:h:h:h:hP""%xd7MH HK(K5MsP\CT+ 2gRF^@w24&t̫̫pE̫sͫdz}xdfq,tuuoM 3w|쩔T|T:^W^ewWwKyۉcLeeeeeeWweweKyLH/H&HHwrrr!m2X5? تتتتتتf먃2먺3334Q5=&=&='='Cr Cy C C N~rتVNت4Mت5Mʫ,髲뫽c7eee7e8v?TvwRee68747f77&74F7F7FxGxG}mmV}CEWEXEC^KJ;dN^Ker l8Y*RGتeتމ''v?tNZeZqZتYeتت|K[MeMhMQN̫xQ̫SϫϫlZCJt eMeʫWʫt ʫxQD:DrDsKyktLkBMkZkeqzZq~ZqZuuzTzTzT{je{ne{xe{fQʫIʫʫʫ׃먗+K9!NDyaycL e qrR~KqR~.s6s8s;s=s+3Oqɪ+giyiy}#SSS:df}}}ʫL ʫTʫfʫy̫d̫+g GGG:d}wyfff4:7t'h>`CxQbisiTthrsW)XT[8rWrVrXrݩWߩ^(.`666666߀6Ԁą߅Zn`&ϫyh:h:h:h:hPse#{%{Q&{8r+{8|){+{p+{P},{20{G2{2{^3{3{3{(5{racHgciriBxorrrsL f^ 8^ d   q <}  cOLdOiOkOplO8YnOHnOHsOd@yl8YmxxnHpvv vvGvC[vv~vmvy:vavgvuuuX#I_#I(s#Iy&I8r(IHg)I8^/Ip&/I0Iq0Ir3I5Ir6Iah bhLch, chwdhzdhhhhih8^lh8YmhnhHohphqphrrh !rhQrhrshU<Brtv zPd>vx dfh,.46|\Z\^`b:>Vbdf.0(8j~&(:2N~"6<@4Zbd `b"&*FJlz "$Np >@t  X ^`rt.0HJLP0Hfh(4Z\^`B,~  "$&(*,0268: H    "#  $ *, 642"!$(<& @?0:5  "J xX,??ii W Ҧ TISYSYSYTICLҦb TISYSYSYTICL(?ihXx& lE Е: A7 5   S   5L 7v E ;& @# # @7 p ;: N s | Z z p 5 7 %@ %6@D0  lE%? Bte9Ee0P w p(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$ w  ť ť 0B Aa&3&f& v w ' UD$BA &( U BQ Е*  & & @( f  e ee e ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA T C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& e/& e *AHŀ ȕ Е Е Е & e & eЕ A %& edA Е A bEA EЕ A A   $Е.  AЕ;     w D&& bЕ- eaePPPЕ-$w jD  &Е. ce & Е:   HBt755 W,TT@,M wP@PPPPPP ޷ B 0& &.ЕIЕNЕS7 7  %p 6w 0& &.ЕIЕNЕSն7 B7 < X %00]983eaek޵ w`7 ² wW W  tww ڳ `wew 'm xw 7 7H  m n2oݴmP Е Е  pwPC~ӕ ӕ Ud * - & f f  )w w 7 L5 U 7 7 ַ  %5" &  &.ЕSЕEЕT ~j 77 R 7 L j <7 B 7 < ڷ %5" & &.ЕQЕUЕE 5 #  &  &.ЕSЕTЕOh  \W  & &.ЕEЕLЕI7 NU@F nr L52 R O /  & , (  ߕE  M   W hw  D CC5@w \A AA P P5 b pL l GB:߶P& &.ЕAЕCЕSC~ 7 v z ʬ , ^ 5555@&5  ,@ E & &.ЕDЕMЕO B < D@& )Cm Ew,w:5 ; zEP~ C( |Е & &.ЕSЕHЕA |-  W=  1ʕ     5 Mj  5;5 1w .v 6 /w& &.ЕBЕYЕE   lņ6 U @7ы w)  | @j $l  b7  YN '5@ 5  &$ ! &  $      聇$f H   7  ,TT,RT,HTu55 f%55Z@ o>D@4 ы tw]N&W&1 W!.&   ) w= W& D &A f) W!7  l  F >w ҋ&~E  L@ -N1 '5Nȱ  ȕ & )BRE9AA55@5@  >p5 & )1A| Shut down program Enter minutes to wait before shutdown: Enter minutes between messages: XX-XXX-XX XX:XX Please finish up, XX minutes before shutdown -- Reason for shutdown: All further logins are disabled Enter minutes to wait before disabling logins: OK to shutdown? [Y/N]: Command ( ) Timeout - Continue waiting? [Y/N]: Logins are now enabled SHUTUP operation complete XX-XXX-XX XX:XX System is now shutting down -- Reason for shutdown: Reason for shutdown ( for none): SHUTUP can be run only by privileged user or from TT0: SHUTUP's TI: is a pseudo device SHUTUP - ACSRES.TSK not found and installed in system. SHUTUP - ELIRES.TSK not found and installed in system.BYEDMO DDNN:LLLLLL/DEV/LOCK=V ELI /NOLOG ACS DDNN:/BLKS=0. @LB:[1,2]SHUTUP STOP/ACCOUNTING SHUTUP SET /COLOG=OFF QUE /STO:QMG SHA ABORT DDNNN: INS $ACSRESINS $ACSINS $ELIRESINS $ELI/BLKS=0. /DEV/LOCK=V %Y %2Z Q| 0"*,.DNT"$&,8R^`6  @з    зG,|Ol|||)!00e9:l1DATADATADATADATADATADATADATA| 6Nf~Ƹз޸ @޸  @  @  @  @  @  @  @ 5 ߥ& *  + 23E Ew    Е-   0@A DW e`fÊ    E &  m  f A N  %&f &   `@ ` B   & A @    |4,??aa W d¥TITITITIr뀻¥dNpTITITITI(?a`4|`)?H * * * * * *08lnz*D$& DH, x7 .*Z 5R5 J5>F|>5*5hp,E%@5"7B5 5 @, @e    ȋ t5z'%|j%vN`UX RPR  8,0 N   0 vU pU jU w 5= ww F bw 8w 0w ŝw WW 00:83eaekw ֤w 5 Lkw veJ*~*w ֤JQ000U8w vr.׭ ׭׭*000E80 w 2ШrJ*~w VwfSYZ7 Xk]hg]dATɝRB % (W Qw WSEIF???6N&f%w4%7 wvUƭ 575ѕ%5 ÝÊѕ-5Et5p ѕ-e Ê5R%ѕ,ѕ ÊΥ` Ê& & &  f& & & Ν  & & &  f& & & Ν   3w (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA `EAa$  INPUTERRORSYNAMBIG" &NOSUCHDEV*( >NOTFILES112fDUPL:~ENTERRBCREERRLATTERRRɮPRIV\ۮIE.PRIb$NOPRIVj IOERRORr INCVOLLABELz 1IOERR:ONEDIR YFEANOTSUPxNODIRFAILDEL$ILLFILEԯlƬԬ"2DZjzcommand input errorcommand syntax errorambiguous keywordno such device availabledevice not Files-11 directory structureddirectory already existsfailed to enter directoryfailed to create directorywrite attributes failurevolume not mountedprivilege violationno privilege for attempted operationI/O errorincorrect volume labelI/O errorvolume is single directory onlyfeature not currently supportedDirectory not found on deviceFailed to delete directoryDirectory not deleted -- files existUFDf& ͥ`̋  @  % ff&QE eN w `NA`c<2. wՀ,ŀ(@ L @   HU@ (  u G   53 : ̋    t  6݇u    5 & 5  5  56   AAaf ΊP   @ P   6 w ̋ xe%  @ Хȥ   AA wAf f`E  5 _Х*  BC  5 T   f : azE  + $& .! _0 7 9A  F Z5  ע ע  5 @Ae   A D BA0u` 0ff &a(B0`B EeB `B EeB ` Ae Q I uAeAa a Q Q  ALLOCATIONENTRIESOWNERUICPROTECTIONDIRECTORYDELETECONTENTSLOGSYSTEMOWNERGROUPWORLDRrR jRRഠ/ 80C0K>TN_iRp Ry Rഀ=:pഀ=:lഀ=:bഀ[,쵀,,H](!, )~D:=RRWRERDR :=RRW RE@RDR :=RRWRERDR :=RRHW RHE@RHDRH lmn:r <[]>,<[. :!] : @.ֶ ]. :!> : @. >.P. P!..  +- # B``. +- # Ƴd f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ &f UFDPAR00"::l1DATADATADATADATADATADATADATATPNUMBp|,?)?) AW SYSYSYSYTICLz,XzVBxSYSYSYSYTICL(?)$X,|X  ?\)Q|| | || MCR && & & \ z t w4 2W0 WZ W9WA wn P   " x ZZ ZZw x SY:SYS$LOGIN:LB:CATCHALL%vQSYD \SY !% wd0 675@74x9%F \^4Z0+( ^ Е:\ J\Е Е@7Z\ H97 7 % 8 JA    ,2\ 97 7 %j   b  wN\ы W Pwb& & & &f\& & & & & & &  åå$ w<&7PPP&7 7Е  &7 7&7 7~eB8  RUN $/TASK=/CMD=""\C 00:83eaekx! j \\ W ? BWte9Ee0P     \wPɋ \ W Pw& & & &f\& & & & & & &  %%.E& f\& & & & &  $)wנwN T 7 r7l \ 4ȕ RwB\Х: ȥ: NFT~CA. -- Command lostXXXXXX -- Task not in systemTDX -- Unable to spawn MCR to process commandXXXXXX -- Line too longTDX -- Unable to spawn INDIRECT to process commandCVT -- Syntax error| xt6  VR% H-D  &"  2&  B } z XzxZgB U(s JvD$QT7RSTUVL5=D2@<</BZ^* v#6  ЋPj G~^VTOUH:AU:. TDX -- Version 14.00 wPIP TI:=ACT /TERM=? w06wf\ ȋ͋Q\ wSET /DEF=[SET /UIC=[w\ȋ @ȋ ,͋Q ѕ]\ww\ȋ @ȋ ,͋Q ѕ]\w\DEV /LOGSET /SYSUICQUE /FU:ALLACT /ALLSET /DEFSET /UICNCP SHOW KNOWN NODESaOX F;/&\ȋ\wMAI DIRMAI READ wPIP /FR/PU/DE/LI=TI: \ȋ͋Q ʋ\ wDH|Z yyx"!!T x 5Kp&y(xWzb"H! z;"x(.xs8@y PD wjZ(\ ~f\ Е.e  Е.Е,  Е.eЕ  x eЕ   r Е,  b eЕ$" b eЕ% eЕ" Е< A Е>  Е<  A Е>\\d7bwH|e7 7 7 7 eeee -t-r?`-^-T?H~v?t7 :/6 ,\V-?pJF:?6 ?r0?,/e/e 7 ׭+׭-׭, ׭x ׭pe ee 7 ׭L+׭D- ׭<,׭4>e eeeN-J? z<׭>׭+׭-׭,׭ ׭eeee -? zetef7 TeB7 6e? *0t@`?7ev? rdp(`Z@  +-,0@*/І <ȇh0*/І @6R `Jn+-, -^hf$'"%ȁABCDEFІЂІȁ00::l1DATADATADATADATADATADATADATA$.#8.  ҆$2A 5 ߥ& *  + 23E Ew    Е-   0@A W e`fÊ    E w  4ww  $ww  weB  8 $&w *<S1   K U U@  f&" 4'&)'&&* *%0*ND  L EU ~  bf&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ &  m  f A N  %&f    f  >5>Eu 2  &ff w BC "& @SY&*p0p210=E%0=wH(*e "f D CB.E(ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w V *$ ':T U@% DD%][%><wl  w1  %,,:4 w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce X   *w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C 0+1(e  @%&p*w f( f)f `8Ae f"( UCɗ&+(e$&% **(e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DEe    *1  ˕03 "   ˔Ӕ ʥ75%& w r&Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@000=83eaek|~,?J?JY) W 2 TITISYSYTICLWKOVVγb. γVγ5wJw>f& &37 TKB>L$   @ %2>KWdp}8(ЬxhXбHgpzW <nDSYSYSYSYTICL\L&TKB -- *FATAL*-Run aborted ZPn> e   5   5     5~   w 5bC ŀ B f50  -F <5.$  6 5 wVn wV Pwf  $  f&f x7J nw77  `wj Xw^ 7,\7,T  T. .  n@     $ $fE7 4`. X . 5,5,  4 u$ ^   1,1,J 1,1, &b e m 7D &8 e$$)d 5w & ~A r7@m7 *1 C7 pM  w"   7 / h *w  7w F `d VT efA   ^w: l7.w,  x  z& &% N  V    2 T s ew    A ~C(  w CB * Z54w eC %E& 7 .Bd  wddcAcAd 7A T&e Cm  &m`e`008=:l1DATADATADATADATADATADATADATA ` f`B` JP    *     `p f& `, ,, &  mV  B ce w eE D` bl lr  eE ,pJ`2 " &e# D ~(  & eB%e1be1^1\1H1J1L1N1P&&f t h e ew  E r A B` d7^pA wL w E p ( B ` p 7  A @ae  e?E? & f Y  0 B ` w f( E @ jw`K`/ & D -N  v  ` ( 0 $   B B  @`   B`x *    v  m ` @ &'&1 2:% 2( Jt) |n|' t( l dF \ T". Lj D2 <5 46 ,6 $$9 3 JI LI5ew , Bv     5Bw 45  5 2  UE   F8E U 5@*& E& & f&ËDef Ë )̋U&  m  f A N  %&ff &f  &v 2$&>$pJ&n&>V&>b&>J!$ z&2%*n)*n,* nz0<&=K|"MPlZlp a, h& l&o&r4 .jyL#|:"^{&h.F&.R&.:L#".T22 v24v2 v2v2D v2Pv44DIDIDIJ&f& v SYxQSYySY^SY~xQSY_SYzjL_LB[1,1],SY>CC@DALB MPSSMADL`SHnSPoCR@nMA+WI nHDPICOvLI vCPDAFP@MMn-PIPR'SQnTRXTn3AC'EA HDPM@SL MUFUnROoALCMSEIPwNMvCOvLI vSGwXHnIDnELvFMvCL vSBpFO@v H&$>DPb00@=83eaek5b  we w b7 f5 b$6 e ˋ   6! " wj w @pdf 4 B$ĵ4ĵ!%'% %E$e@ P  7e :e 8e j& ĵ V 11@ Be :w 5 funhj uhdB$ 0jwaw< 8 v8w &  8*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 4jjlj ɥ@@aujk,bp R5f fˇ ȕ >‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *nw  8jDl@ TeBT85l@ 2@( D 0eB& R & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ 2T' >% Z4 7 2 2 6 7 ; = r= 7 2 heeȵe ~  DE  ȵ2e &e  %&'@^e55@558Beeȵee& q1B$e q1 B  (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &JA$?$2%%%LB[1,1]ODT.OBJODTID.OBJ~@ w ] ,  wA FbZ&4%d3 3 $eB A T D\:%%5bE5 E5UV  Be 4 3$s ]@@MBX7 7 &&$&! &&"e 5'U7\7^&$@PP `E@B &w  7w*4 P@N xw$&4 be&ew B@P@P Ddbj7 d  w (,B &&&$z$ 55 $% %$ (b e5 ~ X&2$7 D  dw6H$&`9  ^ ` ,\NL   BAbpd fwh`  %/ -%/*%//$p`¥¥¥00H=:l1DATADATADATADATADATADATADATA ¥ ¥ef BUܱeE $&6$m    b   @.7 7 8 f 7 (H $?x% 7 < UU W@7   |f 4wP  wp wfUj FPL۠w>w7e @ z7 E,F*7 7 \ڇK w w0      7 7 7 ( W,( 7 7 8# D %* 7  7  .   "%A p r RA d7^އ RpN ۇ && 9? bePHHJ  5@ jp wZl  e5 ^4@b  ֆ9` &&5 b& >& 2 7 2 5 5 5 R6 2 25uuuu w . " &w*$Aq#q- @J"' 8VR& 0bJ&֯R(1Rg((߱`( )&3& TKB>l^SY7 $7 8e`2&  @bp$$0 b h@ef7` ȥ;ȋJ&% % % % ¥:uu r v & W e)&I#q-'eW 2&$0ef` ננe נ^נ  A5 ¥;U%E #w (w we) e)( r )e) e)) l  ) U% ¥;¥,Q d Xe)S#S- $ *I  $%QQ *& N&1 &f JVe f  7" RRR2AC`e R?j7f% ~' ݷr 0 2&e`P  &,@ 3@8K@oMBaTq rt@,YeYxx@Y`Y5 42 ,5 $7 ,8 7X[<$09AZ (),-*! '&4'&n''&R'R'R'7 7 7 7 X7 v$ P @%$H% #%$$ :"&B   r0$Iz<&%$U^Z7 XO $J8D5M5~IE   $ @%ͥpͥ&Հ7 -A# ~ x( $3%2$&եJ   H `#7 Ewͥ$&Jn# $.wȋȥ;!%% D%9;5&H1H/H-HH)HH%u1& +w @%W7&L%W7&  p7&(&&  e)ȥ:2ȥ./ȥ[,ȥ<)ȥ/&W ! T & fAf J !R%dd,w& ȋȥ-ȥ)ȥ(ȥ* ȥ,  ȥ[ ȥ]  Z , p J PA A TN>(,B &&5 b& &`90 p5@ ~wx dpbf 6 %p e 2 RZ4 J5 B5 :7 2200P=83eaek1o?y'''''(''()v)$ 0 77 5E$ P @%$ H h < ($ %!@%@5h7H7L 5NW   C 74`7\& 5&<   .ݴ d ppp Ue p JAf  P 7pœEz4&5U   5pppp f& fp5`& Np5Ufup 7w t z< fwX2 5pppp u N wH   z & ,  @ wwe@e x2 f5e  f5  D91 G@ `w e & Ne 5U ^e5 ~ ! 555U-n5V5N 8u54 $uw8% *$) ] eE BE(E N  5 R6***********************************'*****************z***z***b*b**r**j*"****************************.*********s$* @,A|%w  5 vaN'T 7 J•! b& Da m܀  w^  f^ V  H ed7Ae R1΋ ,ܿ  ppU@pMz %e d >-  Af Pna Fp Xއw L vw B lp  r7"j7,d9X7EA3"3,'5@5E-X  #  B`  E   e3#3-  ۱w z&Bp'v't' &5 w >& ۷  H7w"  h &  #% v D "z/ z0 + * . / + Z0 21 3 ,4 44 2 r3 $4 5 7 ,8 7 7 7Sw  e ww؇@$  "7$l7d  e p?:76 PAPАP 0wR,ww@ wfW# w؇Tw57 7 7 e EM M M Mw؇( e  ?d7` (PPP ''eeA\  jppp\ p   ׿   p P w6J& wwׇ5 mwX00X=:l1DATADATADATADATADATADATADATAVwPwN7 L, >8 8lw& 7, 7,  U Va wa wa UwU% W# ww wׇw:h@ A @$5?75?3B B B @5 *t=% 55  57N7Lwַ:ַ8j@Rw|W#w"ׇ5wh w8ׇ  AEBh'C C |և  AEBh'C C TևwwևwwևU% W# wwwՇ6wwևХ[ 8¥,f (¥]U  p ر& ¥.  w#LW#w@Շ1wVW#& W#BawB Ӈ ӇwW#W#wԇU`X&  ?7 PH p¥;m¥! ȥ;e' ¥=7e)%t#t-e ! '87  ȋ-ȥ;*E'  6 ¥,¥! ¥;¥: 5 !a pp 'zw h&" dwl7fJ :fe& +;(!%,:) %   D , : D :  5%pw r3 7 ,8 7 7LB[1,1]LB[1,1]:-0-.:-U,  e <7* B5@587SYBe F*eB e  yXB,D.& C! U@5    w"  DN# |  l~d5   rp j b c5bUU@N5U54U@5 U U @ @E @ @ @ 7Q$@P  5U@  *e)*5555u u C55a 5a 4 `* Vw%hA7 7 G*A5ZU@X5@$5 X 56PA=,LB Be@E?B B B@$5 F J=C\ #wHAW wU\AmwA Xw "ww`Xu-5zC5@ 55E P,  U%P  T D  0 0(fEU5U U *Up ej1` L (e)w^*QQ n&$&&$*& &$% Be>w4 7 (w BAbpd fwZhT`  %/ -%/*%//$p`¥¥¥ ¥ ¥ef Uձ |'fB **  5.U.5-'e&  z t@ ѥ  u N#N %7 m0ԇ 2 2 ; 5 5 5 d3 2? @`_?*Units set to maximum assigned,,,=5LPFm<  %< V U-$" 1* ^*B w, H`e625*5& F5 f =  wطPطNQB  5j;5l+ 5`%*"5**5**5@Հ*Հ* 7*<7*8ش *̂m*׷n*j* **  & & Xd5@t,$5t, 5   Z cHA A*N ׇN65|  5 5 %  5@5 B  f wB sœ  Ow4tf-w. 5 P5       ` `U@w` * B55**U w    5r5**5  5< 5 w w  ~w vwp jpp55 5@U@p` p`|+ A n&4!/* 5 x00`=83eaektpՇE B B B B   * Œ5f5**w &fA< &7& % ,4, %&f E U40, U 0,  5 g wXihk 5l ** *  * Œfe  * Œ *  l7 7 7 7 7 7 7 7 7 7 7 7 7 ~7D7 :7 X P  75? %A A A w \^ He  5  5 55 @$ d.A   L  AP  feA    6Հpp Zw t5&f& v :!!T"^n))'ɪyN0tN sN0sN0 s, t ~, , ,3X*):+:+**w  $7| -. <5 ||5` v n5@ h Dr Jw V T (Dw @e"XKr•@- Jr5;r5tp 5K5 P  Z ȵ d e l F5D'%# \-5@ < év~hTe  5@ *r 5` |PHH4 77 0 PPh VHw  -5J%ȕ@@ @b \ @  07L0f ?7wA n  (w ,7  z v x * `  7N7H & Uw t,&  " ~7TwX  &  #%  z 7 7 7 7 fj& ~ 66vw7(e"eB$$$e((<Tw<L  w<B    0w<&$# `  L %vW5@5 Of &F l6vw 77 *7<&5@     |`   `  R f  D77wv , p7% x0( H3ww w e Lf6    fe Z 45  N l91  N&  &5EEEEE@E@EE &&fEE# %%2, %U2, 5 C j & P &(  R7JV% J%,D7*%.?-615x%e N l00h=:l1DATADATADATADATADATADATADATA5Rrr   7 | xCœ5H5µ  (l 5) D&5U5U5 EEw, w, mt35Հ( " 55 3l5 5- ,h,be5%ɪ%J';'%Jr;rF w6w(, 9eeb 5@n\ Y-FU5R5O5L5HUB Z@  d X1   w t-l 5@  F S L7N 5w5ww|ŀ7 B-N &fB :  bw:  ՀB 0 lw 77w~~7 ~7t ^w\ 6V X  $%B  w6E$ µs d Xn  wJf 55 5  B |l& 7w j& L()p d r0 Հ%V >D  .%4 * wxf ,7ݵ ߇w C57(5l : H ! & ~PPJ  ݇ xt rnf ,`  "  l 3,5wR5w>55e5@, 5  5e w55Հ m0 0  pE0 H 5H Հ mr0 0  0 d P ef t%.f e L 5PHtt rwH mڎ  % fV >݁ 7 1 L5f] ݁w` 6f . @  ! p` p ; p p  5 -5@) H7 4   7  &fN >لwwV5- %& !5U  `   @  7 w eW! A T 5555 &pՈB V e&0e w  w@w we `f &w   w & f w R  & ff ,  N   !. U 1o 2 x2 p; hr= `5,&f& v z!!8%:%%!, -*R ~!!!>!p-..J.! 7 \*0h8 f  4 V r5N7 f7 $H 7 V J  0 h  07~f ?7wA  R(w" R ,7p h ^ Z J * `00p=83eaek  727, & Uw &   7w  b&  #%   7 7 7 7 Hfj& ~ 6vw$7p(e"eB$$$e((<8w<0  w<&    w< # `  %W5@5 Of &F 6vwZ7N7 *7<&5@   & \ N`     R f  7wv  7`4 w2  O  ` bE{ ~2f767 & rM2 `  d$@e"6    77f "   (h`w&f& 7 NE-z -t n/ ,,-X -R L C` EP". ,& eB N  ^ &fTe "B74  ]  0 40 60 J <U]z7 &  `  (    0 D@mw %Bm   mB  F`  2f4w"rQ$fw7     7 0%%    B1  @ :  44  pwFr` ^,   D7 5W,W,sN5 5t jw x Beʵ *ʵ 5" 25,  b-\f& B!FU@:& < b@"- < ve  @@Kf/ Nw@7 < @ , ( % rj H3wH@w @w8 ne f6  R 8 f&e 5x  `91 B 2N&  &5EEEEE@E@EE &&fEE# %%2, %U2, H 5>  C | & P &(  7% %,7>l%p?-15x%e N4 l5Rrr   J7 Cœ5H5µ  (l 5) &5U5U5 EEw, w, m35Հ( " 55 3l5 5- ,,ep5%ɪ%J';'%Jr;r w6wn 9eeb 5@\ xY-U5R5O5L5HfUB Z@N  ܵ d 1   w -F 5@X   S 7 5w5ww|ŀ7^R hB-܈ &f N bw: \ ՀB 0 w 77w 7 700x=:l1DATADATADATADATADATADATADATA w\ 6 $%  wxEf2 µs d n  DwJfv B55 5 N fB ): R7*w, B & L() d V0 Հ%   .%  v wxf 7ٵ ܇w ~C57(5l$ : H ! & PPJ  vڇ xt rnf >`  "  3,5wR5w>55e5@ 5  .5e *w55Հ mh0 0  Er  5& Հ m0 0  0 d 8 @hef ( %Nf d e L 5PHtt w <^mT׎  %P fV ف .7 1 5f] فw` 6f . T ! p` p ; <p p  5 -5@) 7 X  $ 7 D  0 &f ( ՄwwV5- %& !5U b    @  7 w NeW! A 0T 5555 ՈB 4ߡ ( e&e 6wP  "w<w we f &wtn 0  w N~L& f w R  "& ff f ,  Xޖ N   !p U 1o 2 2 ; r= 5`<VNTI VNSYVNSY[gNSY[hNSY?yOV\~TI\CL2VNCL@GfhRVCxb " ,3X s,w 4 :  DD Fx 2D 4f D "   U%@eA D e U% (%?%  DD tp  P?J7F PeD T  e &b7 5e@5` 5e5@e,e700=83eaek   - 5h r lefb505-f BBbBdBd wP@mF@bm@EP0@,W e75!5"5@e2e?E? E @`eE 7`  =N  e    D   fP  aU%e =  | ~=l44 0 85F  & 1 aa : H !  BPPPP *@e"A & .\A 0 pp0\ @ dDe"6 >77%ɪ-K'wD-vJ'w8-j;'w,-^3&w -R3&w-F2&w-:#&n w ~"&   7^wb  &  #%   )Pv")&y@G xCcb p>,1z@?yB5!8   "  1 *# 6$ 5llpxr? w DCet BEA% > 5f&"ŀ550 00 -5 ezDCen h-5e:! 55@ 7r&e ` X7xf &e 5Je w  5@& wrDe rwx5De VDe Hn-r 4  TTT5 L5m55e5 df j c 0e %w 7 l  07^5X<) > RB ~54 l2 d5& T7 + m  V%  \05 L`x 5m| D   ww@?  u~n~@w4Ca 52HS@Cw a  l& A~m w w H 5*'Cw`ba Z5 XH  AB 5~`w5h~fe@ uZ  5 . th T  7߷ A~B& Km& d  S& h Ee 7 %  7  5x  v  L D5T& 0  w  5*     w 7 ^ 7P5 H 7<އw bd 87 5F 4 CC @w t  w6w2|6 @ w,5P b & w 5   P V "uuf7 2@   A   x .& @@  -6݆5  5A5 5~A5  : l55Ca XXJ  @  .55 B R @ uu|u~uw A  f      b 77-b v5`5`~ fAAAA R  8uuf L "w ww w J rr @A@A 2 2  x    @@ w3L@ (4`L3L-F4L4  4`L ew   \;w  ] "]U.5*5& Dw B75 w d 7 0 &5|5 N5 x5 05 7P`UZ5< UF E    45| 5 5 x7S5 5 H -X٨  UA2 ] ] %w-!] A  Hf@ $f . uft t50P|7S< 8 -   J00=:l1DATADATADATADATADATADATADATAUA2 ^] ] %w-!] A  @ |  ut t v w  7 n 5\\ w 03 <AA  5  U e  4 -*"   U  -    "5   K D V 5t eE  Wt Fp >l22mf-ؼ fm r` 3l f2ll 4f@5e&e65&  5 55 t-  @0 0 0  f& . 7"3 3  77&w( ( 33 43 t-dմ* D$& Հe33  3   RdՀ H7ZF 5h5ez ( @ &\  3 3 3 3 3  >w @e6 L5 Cµ @@<55µN~5"5 %Ncc 5f5  bdcc  Jcc ߖ @`!  @`A@  f d F @e?  Be pE0Ԁ  0   4 24E @ @ @ 5z 55F1 p% x% & &݂ "lmDӇf e"e 6   R .&f  ( & pl5 5 &f5 T &5 5plw plw 5!@@@  L>(@*B,8.H $ 2 0 4 | "| |v<@ :$ C nK " M ~B> 6 8  F D N xVZ \ F2P0 RvN: < 4X V R T 5>kw LmMeBm !D7`# J   EA Y vN  <e E   77Е     ` $ 5nm,,m m45Nm m ww 7 5(<77.Eb> l0LP U tU5U5U5U5 m 7 xxm7 d" fZ 0LP7<77`n `AW  %W V  emwe w`e5` d5emTjJb\   %x * vp|0 ^5U>m7mH   >5m R 5  ޻&|  $ 5n'7 R7 \b4 7HTl7 l Z5|O,B7 B X 0 R (e7 6 x" 7 7  "7 %7 00=83eaekCD5Efm Le  ^ECf  &  e&A e   X E'E@Ce5@> % &%([qe   Ce-6 >5* 7h( ہ @e Re?E?  fE  >e"  A t@ mۡf\ Tw 6    w2    ܇ &4f ^ 4e6(l" J l 7 @ 2 "2 &)2 2 ->ڲ 6ڪ0e w.݇  " p hb   N7 @7

50 0* 7 5eE@`  "  m7  ` :Ew (* .@#  xwz:E B a 7 t&  277 7 w  m6777w m5ml   ~m7zl 7z5)m7blw mjm 7Tm7:l 7:w r   "$HD5^:6mmw &   7w  t&  #% |  w | 6  ZT  wL n   8 V&4e6(  l 7 @ 2 "2 &)2 2 - e w    |   h7 Z7 VP RL NR`U2E( g  6&f  m   |p4e6( d $pf&  )` ~ w d7 `7 ^ 7F>! h ,( 7 *7 (jd w & H5` aC|w  7 ,aC`w     R f  ,&L4e6(   %  U? a    `7 7 7 7 fj& ~ 6vw7|(e"e00=:l1DATADATADATADATADATADATADATAB$$$e((J<Rw<J  w<@    .w<$"# `   %,W5@5 Of &F "6vw77 *7<&5@     `  b    R f  75wv * &7 , z5@ | w,w  e6  00  w 5@4) 5 6e  n00   p d e d \5@ 5 8 d|"  ~| J77 7 w 6 mN777w  m5ml   ~m 7l 75)m7zlw mm 7lm7Rl 7Rw   :# `  %W5@5 Of &F 6vwR7F7 *7<&5@    6 (`     R f  7Qwv F 7% R.% J.4& B:- ::|* 2F*) *Rf' "^& 2 2 ; r= 5L b 5 mm  &&&  eJ   eBRRR R Rw P#7  P#Ý 4 XE` A "5 P#f d *^p ` 67 tP#f &@ͥ 7 Zͥ  NՋ ->h7F7B : T4 tP#0-"4 :5 *ޡ  e <5 P#=\#"e< 5w 6 d -phc4 $ w Ee"6 7,7(4 4P# zB N-߬55  m 44    45m = ~$9ODT xfr address: %P%NPRG xfr address: %P%NStack limits: %P %P %P %U.%NIdentification : %2R%NTask attributes: %VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%NTask address limits: %P %P%NTask Address limits: %P %P I-Space%N %P %P D-Space%NTotal task size : %T. Words%NTotal task size : %T. words, I-Space%N %T. words, D-Space%NPartition name : %2R%N%P %P %P %U. %VS%2R%N%P %P %P %U. I %VS%2R%N%P %P %P %U. D%2N%4N%X Overlay description:%2N---- --- ------%NBase Top Length%NTask UIC : [%O,%O]%NTask name : %2R%NTask priority : %M.%NMapped array area: %T. words%NTask extension : %T. words%NTotal address windows: %M.%NTask image size : %T. words%NTask image size : %T. words, I-Space%N %T. words, D-Space%NR-W disk blk limits: %P %P %P %U.%NR-O disk blk limits: %P %P %P %U.%N w T hf  =4T ~ 1) B_( L*' ҝҝ) P#TH) \ P# `mي Nڊh ' rx%& d%& R  5 Uwp z= E5UB@@P+.P#A5R w=d U% e U%  A' # z* P#x) P#P T_) P#6 >) rP#5:'2 "~7 v7 t7 f7 d P#&&)  ) 5 -,2 -&,--P#500=83eaek && ( &' ׊mR5v  ׊m@' ' 5P& 5 2* Z5  V* >& FwXmTZw TmHN^  e  - ( ( ( 5 - Vw  P#-Tz " "    Tm %\\  5v( & -֒"    ( -AC,-AL,-CM,-CP,-DA, -EA,@-FP,-HD,-PI,@-PM,-PR,-SE, -SL,-TR,-MU,-ID,%N*** Root segment: %2R%3N*** Segment: %2R%3NR-O mem limits: %P %P %P %U.%NR-O mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NR/W mem limits: %P %P %P %U.%NR/W mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NDisk blk limits: %P %P %P %U.%NDisk blk limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%N%2NMemory allocation synopsis:%2NSection%44STitle Ident File%N-------%44S----- ----- ----%N%2R:(%VA%VA%VA%VA%VA%VA %P %P %U.%N%30S%P %P %U. %2R %2R %X%N%3NGlobal symbols:%2N%F) w &-<< -'-'(۶ 65-'"   5' x~"   z -Jښ-VXDJA' V5 a' (. < 5nO@I5J@J@   e ` (5# 5J@J@   e ` '( i( ( ( F5e&e65c& n [ XP# ,  w w 5mP7  (7 x e (  rB P40( w T-J p5RaU%U% %$$ #) )w F P#$; 5 5  mRmH bp5   (  w rl7 ,s&- ) e"6 && U  mn&&@P#   <  (   f  H w \ a 7    RO,RW,D,I,@GBL,LCL, REL,ABS,OVR,CON,SAV,$$$,%2NFile: %X Title: %2R Ident: %2R%N <%2R>: %P %P %P %U.%N >>>>>>>>>>>> Undefined reference: %2R%2N%7S^('\((((n(''''''Z('(w 5w < j   F'&  &B J 2 T' e <&w e" ~  f -2  & 5%݂` &  X p`  7 e" & H p.R RRR & f& d J J &-" - wZ&& D h ' (&& > B' P#   00=:l1DATADATADATADATADATADATADATA&|&  f&&  e#e|& f&&G& & & & && '&& 89f"e\e!e  5f 2* eA $~v%B%l&l&l&l&f&%%%%%%j&%%w    $$  $B   % ` 7H7DGw:w6- $RRB GD ŵŵ fŵ m޷ &mwŵr 7 jŀ7 ^ m>ސ-  7$  7 &nܰp >` vh$  5 $w @n5@b5@V$:PHPJPLPNPPPVPXPZP\P^5eН@ E@@3 # z7P E@`  6' x D$ 5 D "w l \5 j 2 2 x=sN <@1o  ,  s, ,  3X    s, wW" & B w  # H` 7b550V5t-DU >U6 TT L  e" j5m47 \5 5) & D <5 TTR5 ԕT -t  d    50J-@  -0  $ b Cet5 A  1,1, 5m  z % "!B (@e lw7 Det=. &+&  + w       e *wnw PJCrTEoU`5 TT  ""  , V<   ""w-<3XJ@f a &! - X\BF  4SA {RJ33m3 3 < 4 , @5Z eT  e&&  &   #w~   3 3 4@ 5 Xw6  5 8555  ~@e"T t4- 6   7, eA  ",œԕ5   mE %  L5 5 D *555 UA TTԕ@ԕ f  B 7z  L! V w 7`7\ @wR  # I wB  7 (      7       ~7W!i g B w 8@   w @ 55 (@a \@@a R $ & . @  0w> ,w6      w4` eP PPЕ % !00=83eaekB Vp " ` `w e6  00  \r&  > p`    &      7  7& e N=wj   wN & n     m f Bw( -& & me > @l55 m  @  w & ,  7w  &  #% b  T J F  * `  b77 & U7 7 7 7 fj& ~ R6vw7(e"eB$$$e((߷<zw<r  w<h    Vw<LJ# `  h %W5@5 Of &F 6vw(77 *7<&5@    & `   |  R f  `7]wv R 77 2`n TbV   Vw . EE r3  J  0  ( w & f w  R  & ff ,  N   !6 U &'  2 2 ; r= = 5&f& v ROK'2RWJ'2SVK'2L'B .**  &• H   ; w4 ; !,:& u@5e, RNOWE 5& , ! [ ]   )@ 55 ,.@ z2 2ȕf 4 5@ pwҷ Jw Bw^ -ЋSVf&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ000=:l1DATADATADATADATADATADATADATAנ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 e eeȵe ~  DE  ȵ2e &e  %&'@^e55@558Beeȵee& q1B$e q1 B  w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &w <*8I 0*=)98 Z eB &&  U L**e *Nlv ΋*.2  & #!)&eP(e && >e >E p* w" 8 !Հ)w*w**8Ae f"( UCɗ&+(e$&% 0+1(e  %&p*wj f( f)f F82e&( ؀0 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Հ)* Nw 6( D B 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB  L \# ~U&* =w `p!2 EW!p0p2 Pׇ#( P) @#**fff  &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@)00=83eaek) > *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ u @# eB&B fB  n*  eBe>  # #D #=0/H#@&0 # = e0   j0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2w (DB C DBe ?D(e(e$2e (%[]%<>  X1 >w V*eB 8  w ,*D   wf&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ w BC "& @SY&*p0p210=E%0=w(*e "f D CB.E141612epl2l0pM=f(& e %&&eH =&e0  U   E > >E=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 *e6p 4 8 81416  . T  ,*1 ,U8UMwF w NB 00fep=& /e`pwv46f %8 E D/D!D l0l8epl0pɥ.ɕ w8e2 *) l0, *) $ )*)0,40,6  w N ť ť 0B Aaw (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA hEAa$ & & @( @f  e ee e w T' UD$BA D&( U BQ Е* %2R %P%2A -R%F%X Memory allocation map TKB %2R Page %M%N%2R%15S%Y %2Z%4N%4N************%2NUndefined references: %2N %2R%N %2RTotal task size: %M. words%N%4N*** Task builder statistics:%2N%4STotal work file references: %T.%N%4SWork file reads: %T.%N%4SWork file writes: %T.%N%4SSize of core pool: %M. words (%M. pages)%N%4SSize of work file: %M. words (%M. pages)%2N%4SElapsed time:%3Z%N%Nf j( DсeE  ,*( e(  eRRR צv pbeBeRRRRR R R  X|&5e "ppple5let ͇: p44e6(4 xH  · H p44e6(4 ,䇷 v n·7 w eT·)w 7  I χ AZ    522ȋ+& ȥ+ȥ-  U  f  u  u ¥ ¥ ȥ ȥ  JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECABDEFIMNOPQRSTUXYZ<>%`h* x*%/w `D00=:l1DATADATADATADATADATADATADATA&& bЕ- eae}PPPЕ-$w 0D  &Е. ce  Е:   6Bw && D¥%  B&ХVA D C e!  aebE  Е%̥V A6D Ћ  AP AЕ Bf  & er6& e^/& e*AHŀ ȕ Е Е Е & e$ & eЕ A %& eA Е A EA EЕ A A   $Е.  AЕ; b    w ) 8C $* ) *w*  ep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  8 V *`)w C# b   D @)  6?0D)w r ) `* w46l0w . n832cd& & & B  2OΕ   N Υ$Ε  22Υ   Jv Ε f re * e*w@)0, `   h) p)(   =  l 0l   0/ e&=Ba@a Xe0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  ,   0w> z JwvB #  f  `* w)0406 l0 w  0,0w b w f$0,0w <46 F f)0406 0 * 5 ߥ& *  + 23E Ew h҅   Е-   0@A W e`fÊ    E &   `@ ` B   & A @    **0,0, f 톇,, w ^     .% n eB U5UU  plp & NeՀ)*=p!Օ^ *) l0, *) $ )*)0,40,6  DP5R RRR  8  j**=D  `p46 f @64/=  R@) 0  8w 046 8 e*w > =00l&8el2 0 *e6p 4 28  81416  l  F  8   *  4 6 .e6p 4&* R..8em,0l0!D0e6p 4.) &f   Ve) .  e6p 4 08*w0+1(e  @%&p*w~ f( f)f Z8Ae f"( UCɗ&+(e$&% 141612epl2l0pw v )  fU %  BA `6p 4p`4 %60 446f %8 E D/D!D l0l8epl0pɥ.ɕ w)"(. = . B  E p <(00=83eaek.,*1 VU8UMw w B 00fep=& /e`pw8e2 w X  w HeB$&w eB  8 $&w *<S1   K U U@  8f&" '&)'&&* *%0*ND  V EU   w , (ww  ww  ww BC "& @SY&*p0p210=E%0=w,(*e "f D CB.E   f  >5>Eu   (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w . *$ ':T U@% DD%][%><w  w1  %,,:4 w t*D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce    *w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ **0+1(e  @%&p*w f( f)f 8Ae f"( UCɗ&+(e$&% (e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DDEe    *1  ˕03 "   ˔Ӕ ʥ75%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@ & & @( f  e ee e 45=5\5t555556B6`6{66667L77777&8[888889A9e99999 :6:Y:::::;I;w;;;;<:=j== -- *DIAG*- -- *FATAL*-  DC!n   ` ~ F t3 34!74 2 &?,-fW >5W E5W sW s W !00=:l1DATADATADATADATADATADATADATA W 8W >W EW W W W Ō $|e T< L=Illegal Get Command Line error code%2NCommand syntax error%2N%VA%2NRequired input file missing%2NIllegal switch%2N%VA%2NNo dynamic storage available%2NIllegal error-severity code %P %P %P%2NCommand I/O error%2NIndirect file open failure%2N%VA%2NIndirect command syntax error%2N%VA%2NIndirect file depth exceeded%2N%VA%2NI/O error on input file %X%2NOpen failure on file %X%2NSearch stack overflow on segment %2R%2NPass control stack overflow at segment %2R%2NFile %X has illegal format%2NModule %2R ambiguously defines P-section %2R%2NModule %2R multiply defines P-section %2R%2NModule %2R multiply defines xfr addr in seg %2R%2NModule %2R illegally defines xfr addr %2R %P%2NP-section %2R has overflowed%2NModule %2R ambiguously defines symbol %2R%2NModule %2R multiply defines symbol %2R%2NInsufficient APRs available to map read-only root%2NSegment %2R has address overflow: allocation deleted%2NAllocation failure on file %X%2NI/O error on output file %X%2NLoad addr out of range in module %2R%2NTruncation error in module %2R%2N%D undefined symbols segment %2R%2NInvalid keyword identifier%2N%VA%2NOption syntax error%2N%VA%2NToo many parameters%2N%VA%2NIllegal multiple parameter sets%2N%VA%2NInsufficient parameters%2N%VA%2NTask has illegal memory limits%2NOverlay directive has no operands%2N%VA%2NIllegal overlay directive%2N%VA%2NOverlay directive syntax error%2N%VA%2NRoot segment is multiply defined%2N%VA%2NLabel or name is multiply defined%2N%VA%2NNo root segment specified%2NBlank P-section name is illegal%2N%VA%2NIllegal P-section/segment attribute%2N%VA%2NIllegal overlay description operator%2N%VA%2NToo many nested .ROOT/.FCTR directives%2N%VA%2NToo many parentheses levels%2N%VA%2NUnbalanced parentheses%2N%VA%2NIllegal logical unit number%2N%VA%2NIllegal number of logical units%2N%VA%2NIllegal default priority specified%2N%VA%2NIllegal ODT or task vector size%2NIllegal filename%2N%VA%2NIllegal device/volume%2N%VA%2NLookup failure on file %X%2NIllegal directory%2N%VA%2NIncompatable reference to library P-section %2R%2NIllegal reference to library P-section %2R%2NResident library memory allocation conflict%2N%VA%2NLookup failure resident library file - %X%2NIllegal partition/common block specified%2N%VA%2NNo memory available for library %2R%2NPIC libraries may not reference other libraries%N%VAIllegal APR reservation%N%VAI/O error library image file%N%VARequired partition not specified%2NInvalid APR reservation%N%VAComplex relocation error-divide by zero module %2R%2NWork file I/O error%2NLookup failure on system library file%2NUnable to open work file%2NNo virtual memory storage available%2NModule %2R not in library%2NIncorrect library module specification%N%VA%2NLibrary file %X has incorrect format%2NResident library has incorrect address alignment%2N%VA%2NPartition %2R has illegal memory limits%2NInvalid partition/common block specified%2N%VA%2NTask build aborted via request%2N%VA%2NDisk image core allocation too large%2N%VA%2NInvalid window block specification%2N%VA%2NTask requires too many window blocks%2NTask has illegal physical memory limits%N%P %P %P%2NLibrary references overlaid library%2N%VA%2NTask image file %X is non-contiguous%2NVirtual section has illegal address limits%2N%VA%2NFile %X attempted to store data in virtual section%2NResident library mapped array allocation too large%2N%VA%2NInvalid reference to mapped array by module%2R%2NEnd of f00=D>3eaekile reached before .END in %X%2NSymbol %2R not found for patch %2NSegment %2R not found for patch %2NSupervisor mode completion routine is undefined %2NLibrary not built as a supervisor mode library%N%VA%2NSupervisor-mode library reference error%N%VA%2NIllegal system size specified %2NConflicting base addresses in cluster library %2NLibrary %2R not found in any cluster%2NIllegal cluster configuration %2NCluster library element %2R does not have null root%2NModule %2R contains incompatible autoload vectors%2NCluster library element %2R is not resident overlaid%2NSegment not found to address round%2N%VA%2NLibrary build not requested - ignoring option%2N%VA%2NIncompatible OTS module%2Ne"FIRJ w +$7! -tĻw "&f e"DI ƾ%wJD e"FIRJ w ECf@I e-- $ ' Ի -L7",a(Q$ H"7`&w wA bġ D |~,?J?JY) W 2 TITISYSYTICLWKOVVγb. γVγ5wJw>f& &37 TKB>L$   @ %2>KWdp}8(ЬxhXбHgpz00H>:l1DATADATADATADATADATADATADATAW <nDSYSYSYSYTICL\L&TKB -- *FATAL*-Run aborted ZPn> e   5   5     5~   w 5bC ŀ B f50  -F <5.$  6 5 wVn wV Pwf  $  f&f x7J nw77  `wj Xw^ 7,\7,T  T. .  n@     $ $fE7 4`. X . 5,5,  4 u$ ^   1,1,J 1,1, &b e m 7D &8 e$$)d 5w & ~A r7@m7 *1 C7 pM  w"   7 / h *w  7w F `d VT efA   ^w: l7.w,  x  z& &% N  V    2 T s ew    A ~C(  w CB * Z54w eC %E& 7 .Bd  wddcAcAd 7A T&e Cm  &m`e` ` f`B` JP    *     `p f& `, ,, &  mV  B ce w eE D` bl lr  eE ,pJ`2 " &e# D ~(  & eB%e1be1^1\1H1J1L1N1P&&f t h e ew  E r A B` d7^pA wL w E p ( B ` p 7  A @ae  e?E? & f Y  0 B ` w f( E @ jw`K`/ & D -N  v  ` ( 0 $   B B  @`   B`x *    v  m ` @ &'&1 2:% 2( Jt) |n|' t( l dF \ T". Lj D2 <5 46 ,6 $$9 3 JI LI5ew , Bv     5Bw 45  5 2  UE   F8E U 5@*& E& & f&ËDef Ë )̋U&  m  f A N  %&ff 00P>D>3eaek&f  &v 2$&>$pJ&n&>V&>b&>J!$ z&2%*n)*n,* nz0<&=K|"MPlZlp a, h& l&o&r4 .jyL#|:"^{&h.F&.R&.:L#".T22 v24v2 v2v2D v2Pv44DIDIDIJ&f& v SYxQSYySY^SY~xQSY_SYzjL_LB[1,1],SY>CC@DALB MPSSMADL`SHnSPoCR@nMA+WI nHDPICOvLI vCPDAFP@MMn-PIPR'SQnTRXTn3AC'EA HDPM@SL MUFUnROoALCMSEIPwNMvCOvLI vSGwXHnIDnELvFMvCL vSBpFO@v H&$>DPb5b  we w b7 f5 b$6 e ˋ   6! " wj w @pdf 4 B$ĵ4ĵ!%'% %E$e@ P  7e :e 8e j& ĵ V 11@ Be :w 5 funhj uhdB$ 0jwaw< 8 v8w &  8*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 4jjlj ɥ@@aujk,bp R5f fˇ ȕ >‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *nw  8jDl@ TeBT85l@ 2@( D 0eB& R & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀae00X>:l1DATADATADATADATADATADATADATARÕweRR)K@ 2T' >% Z4 7 2 2 6 7 ; = r= 7 2 heeȵe ~  DE  ȵ2e &e  %&'@^e55@558Beeȵee& q1B$e q1 B  (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &JA$?$2%%%LB[1,1]ODT.OBJODTID.OBJ~@ w ] ,  wA FbZ&4%d3 3 $eB A T D\:%%5bE5 E5UV  Be 4 3$s ]@@MBX7 7 &&$&! &&"e 5'U7\7^&$@PP `E@B &w  7w*4 P@N xw$&4 be&ew B@P@P Ddbj7 d  w (,B &&&$z$ 55 $% %$ (b e5 ~ X&2$7 D  dw6H$&`9  ^ ` ,\NL   BAbpd fwh`  %/ -%/*%//$p`¥¥¥ ¥ ¥ef BUܱeE $&6$m    b   @.7 7 8 f 7 (H $?x% 7 < UU W@7   |f 4wP  wp wfUj FPL۠w>w7e @ z7 E,F*7 7 \ڇK w w0      7 7 7 ( W,( 7 7 8# D %* 7  7  .   "%A p r RA d7^އ RpN ۇ && 9? bePHHJ  5@ jp wZl  e5 ^4@b  ֆ9` &&5 b& >& 2 7 2 5 5 5 R6 2 25uuuu w . " &w*$Aq#q- @J"' 8VR& 0bJ&֯R(1Rg((߱`( )&3& TKB>l^SY7 $7 8e`2&  @bp$$0 b h@ef7` ȥ;ȋJ&% % % % ¥:uu r v & W e)&I#q-'eW 2&$0ef` ננe 00`>D>3eaekנ^נ  A5 ¥;U%E #w (w we) e)( r )e) e)) l  ) U% ¥;¥,Q d Xe)S#S- $ *I  $%QQ *& N&1 &f JVe f  7" RRR2AC`e R?j7f% ~' ݷr 0 2&e`P  &,@ 3@8K@oMBaTq rt@,YeYxx@Y`Y5 42 ,5 $7 ,8 7X[<$09AZ (),-*! '&4'&n''&R'R'R'7 7 7 7 X7 v$ P @%$H% #%$$ :"&B   r0$Iz<&%$U^Z7 XO $J8D5M5~IE   $ @%ͥpͥ&Հ7 -A# ~ x( $3%2$&եJ   H `#7 Ewͥ$&Jn# $.wȋȥ;!%% D%9;5&H1H/H-HH)HH%u1& +w @%W7&L%W7&  p7&(&&  e)ȥ:2ȥ./ȥ[,ȥ<)ȥ/&W ! T & fAf J !R%dd,w& ȋȥ-ȥ)ȥ(ȥ* ȥ,  ȥ[ ȥ]  Z , p J PA A TN>(,B &&5 b& &`90 p5@ ~wx dpbf 6 %p e 2 RZ4 J5 B5 :7 221o?y'''''(''()v)$ 0 77 5E$ P @%$ H h < ($ %!@%@5h7H7L 5NW   C 74`7\& 5&<   .ݴ d ppp Ue p JAf  P 7pœEz4&5U   5pppp f& fp5`& Np5Ufup 7w t z< fwX2 5pppp u N wH   z & ,  @ wwe@e x2 f5e  f5  D91 G@ `w e & Ne 5U ^e5 ~ ! 555U-n5V5N 8u54 $uw8% *$) ] eE BE(E N  5 R6***********************************'*****************z***z***b*b**r**j*"****************************.*********s$*:l1DATADATADATADATADATADATADATA`.r V%.;}DX%.Z%.^%.y`%&/pc%@/}e%d/l%h/,o%/,s:q%//^ R' Enter Options: TKB> @,A|%w  5 vaN'T 7 J•! b& Da m܀  w^  f^ V  H ed7Ae R1΋ ,ܿ  ppU@pMz %e d >-  Af Pna Fp Xއw L vw B lp  r7"j7,d9X7EA3"3,'5@5E-X  #  B`  E   e3#3-  ۱w z&Bp'v't' &5 w >& ۷  H7w"  h &  #% v D "z/ z0 + * . / + Z0 21 3 ,4 44 2 r3 $4 5 7 ,8 7 7 7Sw  e ww؇@$  "7$l7d  e p?:76 PAPАP 0wR,ww@ wfW# w؇Tw57 7 7 e EM M M Mw؇( e  ?d7` (PPP ''eeA\  jppp\ p   ׿   p P w6J& wwׇ5 mwXVwPwN7 L, >8 8lw& 7, 7,  U Va wa wa UwU% W# ww wׇw:h@ A @$5?75?3B B B @5 *t=% 55  57N7Lwַ:ַ8j@Rw|W#w"ׇ5wh w8ׇ  AEBh'C C |և  AEBh'C C TևwwևwwևU% W# wwwՇ6wwևХ[ 8¥,f (¥]U  p ر& ¥.  w#LW#w@Շ1wVW#& W#BawB Ӈ ӇwW#W#wԇU`X&  ?7 PH p¥;m¥! ȥ;e' ¥=7e)%t#t-e ! '87  ȋ-ȥ;*E'  6 ¥,¥! ¥;¥: 5 !a pp 'zw h&" dwl7fJ :fe& +;(!%,:) %   D , : D :  5%pw r3 7 ,8 7 7LB[1,1]LB[1,1]:-0-.:-U,  e <7* B5@587SYBe F*eB e  yXB,D.& C! U@5    w"  DN# |  l~d5   rp j b c5bUU@N5U54U@5 U U @ @E @ @ @ 7Q$@P  5U@  *e)*5555u u00p>D>3eaek C55a 5a 4 `* Vw%hA7 7 G*A5ZU@X5@$5 X 56PA=,LB Be@E?B B B@$5 F J=C\ #wHAW wU\AmwA Xw "ww`Xu-5zC5@ 55E P,  U%P  T D  0 0(fEU5U U *Up ej1` L (e)w^*QQ n&$&&$*& &$% Be>w4 7 (w BAbpd fwZhT`  %/ -%/*%//$p`¥¥¥ ¥ ¥ef Uձ |'fB **  5.U.5-'e&  z t@ ѥ  u N#N %7 m0ԇ 2 2 ; 5 5 5 d3 2? @`_?*Units set to maximum assigned,,,=5LPFm<  %< V U-$" 1* ^*B w, H`e625*5& F5 f =  wطPطNQB  5j;5l+ 5`%*"5**5**5@Հ*Հ* 7*<7*8ش *̂m*׷n*j* **  & & Xd5@t,$5t, 5   Z cHA A*N ׇN65|  5 5 %  5@5 B  f wB sœ  Ow4tf-w. 5 P5       ` `U@w` * B55**U w    5r5**5  5< 5 w w  ~w vwp jpp55 5@U@p` p`|+ A n&4!/* 5 xtpՇE B B B B   * Œ5f5**w &fA< &7& % ,4, %&f E U40, U 0,  5 g wXihk 5l ** *  * Œfe  * Œ *  l7 7 7 7 7 7 7 7 7 7 7 7 7 ~7D7 :7 X P  75? %A A A w \^ He  5  5 55 @$ d.A   L  AP  feA    6Հpp Zw t5&f& v :!!T"^n))'ɪyN0tN sN0sN0 s, t ~, , ,3X*):+:+**w  $7| -. <5 ||5` v n5@ h Dr Jw V T (Dw @e"XKr•@- Jr5;r5tp 5K5 P  Z ȵ d e l F5D'%# \-5@ < év~hTe  5@ *r 5` |PHH4 77 0 PPh VHw  -5J%ȕ@@ @b \ @  07L0f ?7wA n  (w00x>:l1DATADATADATADATADATADATADATA ,7  z v x * `  7N7H & Uw t,&  " ~7TwX  &  #%  z 7 7 7 7 fj& ~ 66vw7(e"eB$$$e((<Tw<L  w<B    0w<&$# `  L %vW5@5 Of &F l6vw 77 *7<&5@     |`   `  R f  D77wv , p7% x0( H3ww w e Lf6    fe Z 45  N l91  N&  &5EEEEE@E@EE &&fEE# %%2, %U2, 5 C j & P &(  R7JV% J%,D7*%.?-615x%e N l5Rrr   7 | xCœ5H5µ  (l 5) D&5U5U5 EEw, w, mt35Հ( " 55 3l5 5- ,h,be5%ɪ%J';'%Jr;rF w6w(, 9eeb 5@n\ Y-FU5R5O5L5HUB Z@  d X1   w t-l 5@  F S L7N 5w5ww|ŀ7 B-N &fB :  bw:  ՀB 0 lw 77w~~7 ~7t ^w\ 6V X  $%B  w6E$ µs d Xn  wJf 55 5  B |l& 7w j& L()p d r0 Հ%V >D  .%4 * wxf ,7ݵ ߇w C57(5l : H ! & ~PPJ  ݇ xt rnf ,`  "  l 3,5wR5w>55e5@, 5  5e w55Հ m0 0  pE0 H 5H Հ mr0 0  0 d P ef t%.f e L 5PHtt rwH mڎ  % fV >݁ 7 1 L5f] ݁w` 6f .00>D>3eaek @  ! p` p ; p p  5 -5@) H7 4   7  &fN >لwwV5- %& !5U  `   @  7 w eW! A T 5555 &pՈB V e&0e w  w@w we `f &w   w & f w R  & ff ,  N   !. U 1o 2 x2 p; hr= `5,&f& v z!!8%:%%!, -*R ~!!!>!p-..J.! 7 \*0h8 f  4 V r5N7 f7 $H 7 V J  0 h  07~f ?7wA  R(w" R ,7p h ^ Z J * `  727, & Uw &   7w  b&  #%   7 7 7 7 Hfj& ~ 6vw$7p(e"eB$$$e((<8w<0  w<&    w< # `  %W5@5 Of &F 6vwZ7N7 *7<&5@   & \ N`     R f  7wv  7`4 w2  O  ` bE{ ~2f767 & rM2 `  d$@e"6    77f "   (h`w&f& 7 NE-z -t n/ ,,-X -R L C` EP". ,& eB N  ^ &fTe "B74  ]  0 40 60 J <U]z7 &  `  (    0 D@mw %Bm   mB  F`  2f4w"rQ$fw7   00>:l1DATADATADATADATADATADATADATA  7 0%%    B1  @ :  44  pwFr` ^,   D7 5W,W,sN5 5t jw x Beʵ *ʵ 5" 25,  b-\f& B!FU@:& < b@"- < ve  @@Kf/ Nw@7 < @ , ( % rj H3wH@w @w8 ne f6  R 8 f&e 5x  `91 B 2N&  &5EEEEE@E@EE &&fEE# %%2, %U2, H 5>  C | & P &(  7% %,7>l%p?-15x%e N4 l5Rrr   J7 Cœ5H5µ  (l 5) &5U5U5 EEw, w, m35Հ( " 55 3l5 5- ,,ep5%ɪ%J';'%Jr;r w6wn 9eeb 5@\ xY-U5R5O5L5HfUB Z@N  ܵ d 1   w -F 5@X   S 7 5w5ww|ŀ7^R hB-܈ &f N bw: \ ՀB 0 w 77w 7 7 w\ 6 $%  wxEf2 µs d n  DwJfv B55 5 N fB ): R7*w, B & L() d V0 Հ%   .%  v wxf 7ٵ ܇w ~C57(5l$ : H ! & PPJ  vڇ xt rnf >`  "  3,5wR5w>55e5@ 5  .5e *w55Հ mh0 0  Er  5& Հ m0 0  0 d 8 @hef ( %Nf d e L 5PHtt w <^mT׎  %P fV ف .7 1 5f] فw` 6f . T ! p` p ; <p p  5 -5@) 7 X  $ 7 D  0 &f ( ՄwwV5- %& !5U b    @  7 w NeW! A 0T 5555 ՈB 4ߡ ( e&e 6wP  "w<w we f &wtn 0  w N~L& f w R  "& ff f ,  Xޖ N   !p U 00>D>3eaek1o 2 2 ; r= 5`<VNTI VNSYVNSY[gNSY[hNSY?yOV\~TI\CL2VNCL@GfhRVCxb " ,3X s,w 4 :  DD Fx 2D 4f D "   U%@eA D e U% (%?%  DD tp  P?J7F PeD T  e &b7 5e@5` 5e5@e,e7   - 5h r lefb505-f BBbBdBd wP@mF@bm@EP0@,W e75!5"5@e2e?E? E @`eE 7`  =N  e    D   fP  aU%e =  | ~=l44 0 85F  & 1 aa : H !  BPPPP *@e"A & .\A 0 pp0\ @ dDe"6 >77%ɪ-K'wD-vJ'w8-j;'w,-^3&w -R3&w-F2&w-:#&n w ~"&   7^wb  &  #%   )Pv")&y@G xCcb p>,1z@?yB5!8   "  1 *# 6$ 5llpxr? w DCet BEA% > 5f&"ŀ550 00 -5 ezDCen h-5e:! 55@ 7r&e ` X7xf &e 5Je w  5@& wrDe rwx5De VDe Hn-r 4  TTT5 L5m55e5 df j c 0e %w 7 l  07^5X<) > RB ~54 l2 d5& T7 + m  V%  \05 L`x 5m| D   ww@?  u~n~@w4Ca 52HS@Cw a  l& 00>:l1DATADATADATADATADATADATADATAA~m w w H 5*'Cw`ba Z5 XH  AB 5~`w5h~fe@ uZ  5 . th T  7߷ A~B& Km& d  S& h Ee 7 %  7  5x  v  L D5T& 0  w  5*     w 7 ^ 7P5 H 7<އw bd 87 5F 4 CC @w t  w6w2|6 @ w,5P b & w 5   P V "uuf7 2@   A   x .& @@  -6݆5  5A5 5~A5  : l55Ca XXJ  @  .55 B R @ uu|u~uw A  f      b 77-b v5`5`~ fAAAA R  8uuf L "w ww w J rr @A@A 2 2  x    @@ w3L@ (4`L3L-F4L4  4`L ew   \;w  ] "]U.5*5& Dw B75 w d 7 0 &5|5 N5 x5 05 7P`UZ5< UF E    45| 5 5 x7S5 5 H -X٨  UA2 ] ] %w-!] A  Hf@ $f . uft t50P|7S< 8 -   JUA2 ^] ] %w-!] A  @ |  ut t v w  7 n 5\\ w 03 <AA  5  U e  4 -*"   U  -    "5   K D V 5t eE  Wt Fp >l22mf-ؼ fm r` 3l f2ll 4f@5e&e65&  5 55 t-  @0 0 0  f& . 7"3 3  77&w( ( 33 43 t-dմ* D$& Հe33  3   RdՀ H7ZF 5h5ez ( @ &\  3 3 3 3 3  >w @e6 L5 Cµ @@<55µN~5"5 %Ncc 5f5  bdcc  Jcc ߖ @`!  @`A@  f d F @e?  Be pE0Ԁ  0   4 24E @ @ @ 5z 55F1 p% x% & &݂ "lmDӇf e"e 6   R .&f  ( & pl5 5 &f5 T &5 5plw plw 500>D>3eaek!@@@  L>(@*B,8.H $ 2 0 4 | "| |v<@ :$ C nK " M ~B> 6 8  F D N xVZ \ F2P0 RvN: < 4X V R T 5>kw LmMeBm !D7`# J   EA Y vN  <e E   77Е     ` $ 5nm,,m m45Nm m ww 7 5(<77.Eb> l0LP U tU5U5U5U5 m 7 xxm7 d" fZ 0LP7<77`n `AW  %W V  emwe w`e5` d5emTjJb\   %x * vp|0 ^5U>m7mH   >5m R 5  ޻&|  $ 5n'7 R7 \b4 7HTl7 l Z5|O,B7 B X 0 R (e7 6 x" 7 7  "7 %7 CD5Efm Le  ^ECf  &  e&A e   X E'E@Ce5@> % &%([qe   Ce-6 >5* 7h( ہ @e Re?E?  fE  >e"  A t@ mۡf\ Tw 6    w2    ܇ &4f ^ 4e6(l" J l 7 @ 2 "2 &)2 2 ->ڲ 6ڪ0e w.݇  " p hb   N7 @7

:l1DATADATADATADATADATADATADATAw 5J{7  &7\5V,%,( -&5@ e & e" pv 87 x7 7` &  r 7 # xe"A  P mp   , @ H %,5F5>50 0* 7 5eE@`  "  m7  ` :Ew (* .@#  xwz:E B a 7 t&  277 7 w  m6777w m5ml   ~m7zl 7z5)m7blw mjm 7Tm7:l 7:w r   "$HD5^:6mmw &   7w  t&  #% |  w | 6  ZT  wL n   8 V&4e6(  l 7 @ 2 "2 &)2 2 - e w    |   h7 Z7 VP RL NR`U2E( g  6&f  m   |p4e6( d $pf&  )` ~ w d7 `7 ^ 7F>! h ,( 7 *7 (jd w & H5` aC|w  7 ,aC`w     R f  ,&L4e6(   %  U? a    `7 7 7 7 fj& ~ 6vw7|(e"eB$$$e((J<Rw<J  w<@    .w<$"# `   %,W5@5 Of &F "6vw77 *7<&5@     `  b    R f  75wv * &7D>3eaek ,' w d2 J J D,Db@T&v. e H ܂    J    w   1 A `A ~ & e "  (%wLD75m& P  je v*  b@5m~  n5@(  fA |@e 47 #   E     sN  7 | v7 r l؆wmd`\ZwwFق` 2ڦ ^ *  #A V55 5@ @@ mPׂ 7 7 %1%o|m t&   P  p` FX,,  %% 71e- (7%%   ŀ%7%w`% 7 8@w t5bwD%NwB. 750&7j5dU`EQ 5Um   6  7E  ,y 55   |e55c N5@f &p eEp r &rP   m545X, 5@ `&p eEp rP rP   m $& A xe  fe -|.  v' v55HD RD  B5"  .5 e 57tp 5 7 f j  5 77lw ve 7555ll5L & ev7E dEn  57 wZP E^ b5Z:EVD 60%0%5e" .% m| l . 5R7  e  U5@&%J%` m& mقeeA A &  ؇fE @m5 @ @ @ 55|5"mn,<5 fE J5&& 75m A A A ,3X s,w 5x-7 7 7 7 & h7l 7&fEjEA  A "$ &5 `eN F &8& FE R e 2Dm& e   8  Dm& R R  hw & Hw& 8w~|5 Lf& <& b&     2& &PH   PP& w Dm& & z7fEjEhwA . $A "$ 5 ,,7lV VHP VH @me, w   , rT,` &w&u u u u C eE P75 5 5 wn& e&b e & l  e hwbE    f eA A* e5"5,$    &- 7 m.e &r m 00>:l1DATADATADATADATADATADATADATA w  ť ť 0B lAa d  w P B74 n5@2 v#  ` E@ 7"|7 5  J > , z5@ | w,w  e6  00  w 5@4) 5 6e  n00   p d e d \5@ 5 8 d|"  ~| J77 7 w 6 mN777w  m5ml   ~m 7l 75)m7zlw mm 7lm7Rl 7Rw   :# `  %W5@5 Of &F 6vwR7F7 *7<&5@    6 (`     R f  7Qwv F 7% R.% J.4& B:- ::|* 2F*) *Rf' "^& 2 2 ; r= 5L b 5 mm  &&&  eJ   eBRRR R Rw P#7  P#Ý 4 XE` A "5 P#f d *^p ` 67 tP#f &@ͥ 7 Zͥ  NՋ ->h7F7B : T4 tP#000>D>3eaek-"4 :5 *ޡ  e <5 P#=\#"e< 5w 6 d -phc4 $ w Ee"6 7,7(4 4P# zB N-߬55  m 44    45m = ~$9ODT xfr address: %P%NPRG xfr address: %P%NStack limits: %P %P %P %U.%NIdentification : %2R%NTask attributes: %VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%NTask address limits: %P %P%NTask Address limits: %P %P I-Space%N %P %P D-Space%NTotal task size : %T. Words%NTotal task size : %T. words, I-Space%N %T. words, D-Space%NPartition name : %2R%N%P %P %P %U. %VS%2R%N%P %P %P %U. I %VS%2R%N%P %P %P %U. D%2N%4N%X Overlay description:%2N---- --- ------%NBase Top Length%NTask UIC : [%O,%O]%NTask name : %2R%NTask priority : %M.%NMapped array area: %T. words%NTask extension : %T. words%NTotal address windows: %M.%NTask image size : %T. words%NTask image size : %T. words, I-Space%N %T. words, D-Space%NR-W disk blk limits: %P %P %P %U.%NR-O disk blk limits: %P %P %P %U.%N w T hf  =4T ~ 1) B_( L*' ҝҝ) P#TH) \ P# `mي Nڊh ' rx%& d%& R  5 Uwp z= E5UB@@P+.P#A5R w=d U% e U%  A' # z* P#x) P#P T_) P#6 >) rP#5:'2 "~7 v7 t7 f7 d P#&&)  ) 5 -,2 -&,--P#5 && ( &' ׊mR5v  ׊m@' ' 5P& 5 2* Z5  V* >& FwXmTZw TmHN^  e  - ( ( ( 5 - Vw  P#-Tz " "    Tm %\\  5v( & -֒"    ( -AC,-AL,-CM,-CP,-DA, -EA,@-FP,-HD,-PI,@-PM,-PR,-SE, -SL,-TR,-MU,-ID,%N*** Root segment: %2R%3N*** Segment: %2R%3NR-O mem limits: %P %P %P %U.%NR-O mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NR/W mem limits: %P %P %P %U.%NR/W mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NDisk blk limits: %P %P %P %U.%NDisk blk limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%N%2NMemory allocation synopsis:%2NSection%44STitle Ident File%N-------%44S----- ----- ----%N%2R:(%VA%VA%VA%VA%VA%VA %P %P %U.%N%30S%P %P %U. %2R %2R %X%N%3NGlobal symbols:%2N%F) w &-<< -'-'(۶ 65-'"   5' x~"   z -Jښ-VXDJA' V5 a' (. < 5nO@I5J@J@   e ` (5# 5J@J@   e ` '( i( ( ( F5e00>:l1DATADATADATADATADATADATADATA&e65c& n [ XP# ,  w w 5mP7  (7 x e (  rB P40( w T-J p5RaU%U% %$$ #) )w F P#$; 5 5  mRmH bp5   (  w rl7 ,s&- ) e"6 && U  mn&&@P#   <  (   f  H w \ a 7    RO,RW,D,I,@GBL,LCL, REL,ABS,OVR,CON,SAV,$$$,%2NFile: %X Title: %2R Ident: %2R%N <%2R>: %P %P %P %U.%N >>>>>>>>>>>> Undefined reference: %2R%2N%7S^('\((((n(''''''Z('(w 5w < j   F'&  &B J 2 T' e <&w e" ~  f -2  & 5%݂` &  X p`  7 e" & H p.R RRR & f& d J J &-" - wZ&& D h ' (&& > B' P#   &|&  f&&  e#e|& f&&G& & & & && '&& 89f"e\e!e  5f 2* eA $~v%B%l&l&l&l&f&%%%%%%j&%%w    $$  $B   % ` 7H7DGw:w6- $RRB GD ŵŵ fŵ m޷ &mwŵr 7 jŀ7 ^ m>ސ-  7$  7 &nܰp >` vh$  5 $w @n5@b5@V$:PHPJPLPNPPPVPXPZP\P^5eН@ E@@3 # z7P E@`  6' x D$ 5 D "w l \5 j 2 2 x=sN <@1o  ,  s, ,  3X    s, wW" & B w  # H` 7b500>D>3eaek50V5t-DU >U6 TT L  e" j5m47 \5 5) & D <5 TTR5 ԕT -t  d    50J-@  -0  $ b Cet5 A  1,1, 5m  z % "!B (@e lw7 Det=. &+&  + w       e *wnw PJCrTEoU`5 TT  ""  , V<   ""w-<3XJ@f a &! - X\BF  4SA {RJ33m3 3 < 4 , @5Z eT  e&&  &   #w~   3 3 4@ 5 Xw6  5 8555  ~@e"T t4- 6   7, eA  ",œԕ5   mE %  L5 5 D *555 UA TTԕ@ԕ f  B 7z  L! V w 7`7\ @wR  # I wB  7 (      7       ~7W!i g B w 8@   w @ 55 (@a \@@a R $ & . @  0w> ,w6      w4` eP PPЕ % !B Vp " ` `w e6  00  \r&  > p`    &      7  7& e N=wj   wN & n     m f Bw( -& & me > @l55 m  @  w & ,  7w  &  #% b  T J F  * `  b77 & U7 7 7 7 fj& ~ R6vw7(e"eB$$$e((߷<zw<r  w<h    Vw<LJ# `  h %W5@5 Of &F 6vw(77 *7<&5@    & `   |  R f  `7]wv R 77 2`n TbV   Vw . EE r3  J  0  ( w & f w  R  & ff ,  N   !6 U &' 00>:l1DATADATADATADATADATADATADATA 2 2 ; r= = 5&f& v ROK'2RWJ'2SVK'2L'B .**  &• H   ; w4 ; !,:& u@5e, RNOWE 5& , ! [ ]   )@ 55 ,.@ z2 2ȕf 4 5@ pwҷ Jw Bw^ -ЋSVf&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 e eeȵe ~  DE  ȵ2e &e  %&'@^e55@558Beeȵee& q1B$e q1 B  w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &00>D>3eaekw <*8I 0*=)98 Z eB &&  U L**e *Nlv ΋*.2  & #!)&eP(e && >e >E p* w" 8 !Հ)w*w**8Ae f"( UCɗ&+(e$&% 0+1(e  %&p*wj f( f)f F82e&( ؀0 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Հ)* Nw 6( D B 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB  L \# ~U&* =w `p!2 EW!p0p2 Pׇ#( P) @#**fff  &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@)) > *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ u @# eB&B fB  n*  eBe>  # #D #=0/H#@&0 # = e0   j0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2w (DB C DBe ?D(e(e$2e (%[]%<>  X1 >w V*eB 8  w ,*D   wf&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ w BC "& @SY&*p0p210=E%0=w(*e "f D CB.E141612epl2l0pM=f(& e %&&eH =&e0  U   E > >E=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 *e6p 4 8 81416  . T  ,*1 ,U8UMwF w NB 00fep=& 00>:l1DATADATADATADATADATADATADATA/e`pwv46f %8 E D/D!D l0l8epl0pɥ.ɕ w8e2 *) l0, *) $ )*)0,40,6  w N ť ť 0B Aaw (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA hEAa$ & & @( @f  e ee e w T' UD$BA D&( U BQ Е* %2R %P%2A -R%F%X Memory allocation map TKB %2R Page %M%N%2R%15S%Y %2Z%4N%4N************%2NUndefined references: %2N %2R%N %2RTotal task size: %M. words%N%4N*** Task builder statistics:%2N%4STotal work file references: %T.%N%4SWork file reads: %T.%N%4SWork file writes: %T.%N%4SSize of core pool: %M. words (%M. pages)%N%4SSize of work file: %M. words (%M. pages)%2N%4SElapsed time:%3Z%N%Nf j( DсeE  ,*( e(  eRRR צv pbeBeRRRRR R R  X|&5e "ppple5let ͇: p44e6(4 xH  · H p44e6(4 ,䇷 v n·7 w eT·)w 7  I χ AZ    522ȋ+& ȥ+ȥ-  U  f  u  u ¥ ¥ ȥ ȥ  JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECABDEFIMNOPQRSTUXYZ<>%`h* x*%/w `D&& bЕ- eae}PPPЕ-$w 0D  &Е. ce  Е:   6Bw && D¥%  B&ХVA D C e!  aebE  Е%̥V A6D Ћ  AP AЕ Bf  & er6& e^/& e*AHŀ ȕ Е Е Е & e$ & eЕ A %& eA Е A EA EЕ A A   $Е.  AЕ; b    w ) 8C $* ) *w*  ep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  8 V *`)w C# b   D @)  6?0D)w r ) `* w46l0w . n832cd& & & B  2OΕ   N Υ$Ε  22Υ   Jv Ε f re * e*w@)0, `   h) p)(   =  l 0l   0/ e&=Ba@a Xe0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  ,   0w> z JwvB #  f  `*00>D>3eaek w)0406 l0 w  0,0w b w f$0,0w <46 F f)0406 0 * 5 ߥ& *  + 23E Ew h҅   Е-   0@A W e`fÊ    E &   `@ ` B   & A @    **0,0, f 톇,, w ^     .% n eB U5UU  plp & NeՀ)*=p!Օ^ *) l0, *) $ )*)0,40,6  DP5R RRR  8  j**=D  `p46 f @64/=  R@) 0  8w 046 8 e*w > =00l&8el2 0 *e6p 4 28  81416  l  F  8   *  4 6 .e6p 4&* R..8em,0l0!D0e6p 4.) &f   Ve) .  e6p 4 08*w0+1(e  @%&p*w~ f( f)f Z8Ae f"( UCɗ&+(e$&% 141612epl2l0pw v )  fU %  BA `6p 4p`4 %60 446f %8 E D/D!D l0l8epl0pɥ.ɕ w)"(. = . B  E p <(.,*1 VU8UMw w B 00fep=& /e`pw8e2 w X  w HeB$&w eB  8 $&w *<S1   K U U@  8f&" '&)'&&* *%0*ND  V EU   w , (ww  ww  ww BC "& @SY&*p0p210=E%0=w,(*e "f D CB.E   f  >5>Eu   (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w . *$ ':T U@% DD%][%><w  w1  %,,:4 w t*D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce    *w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U00>:l1DATADATADATADATADATADATADATA5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ **0+1(e  @%&p*w f( f)f 8Ae f"( UCɗ&+(e$&% (e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DDEe    *1  ˕03 "   ˔Ӕ ʥ75%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@ & & @( f  e ee e 45=5\5t555556B6`6{66667L77777&8[888889A9e99999 :6:Y:::::;I;w;;;;<:=j== -- *DIAG*- -- *FATAL*-  DC!n   ` ~ F t3 34!74 2 &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e T< L=Illegal Get Command Line error code%2NCommand syntax error%2N%VA%2NRequired input file missing%2NIllegal switch%2N%VA%2NNo dynamic storage available%2NIllegal error-severity code %P %P %P%2NCommand I/O error%2NIndirect file open failure%2N%VA%2NIndirect command syntax error%2N%VA%2NIndirect file depth exceeded%2N%VA%2NI/O error on input file %X%2NOpen failure on file %X%2NSearch stack overflow on segment %2R%2NPass control stack overflow at segment %2R%2NFile %X has illegal format%2NModule %2R ambiguously defines P-section %2R%2NModule %2R multiply defines P-section %2R%2NModule %2R multiply defines xfr addr in seg %2R%2NModule %2R illegally defines xfr addr %2R %P%2NP-section %2R has overflowed%2NModule %2R ambiguously defines symbol %2R%2NModule %2R multiply defines symbol %2R%2NInsufficient APRs available to map read-only root%2NSegment %2R has address overflow: allocation deleted%2NAllocation failure on file %X%2NI/O error on output file %X%2NLoad addr out of range in module %2R%2NTruncation error in module %2R%2N%D undefined symbols segment %2R%2NInvalid keyword identifier%2N%VA%2NOption syntax error%2N%VA%2NToo many parameters%2N%VA%2NIllegal multiple parameter sets%2N%VA%2NInsufficient parameters%2N%VA%2NTask has illegal memory limits%2NOverlay directive has no operands%2N%VA%2NIllegal overlay directive%2N%VA%2NOverlay directive syntax error%2N%VA%2NRoot segment is multiply defined%2N%VA%2NLabel or name is multiply defined%2N%VA%2NNo root segment specified%2NBlank00?D>3eaek P-section name is illegal%2N%VA%2NIllegal P-section/segment attribute%2N%VA%2NIllegal overlay description operator%2N%VA%2NToo many nested .ROOT/.FCTR directives%2N%VA%2NToo many parentheses levels%2N%VA%2NUnbalanced parentheses%2N%VA%2NIllegal logical unit number%2N%VA%2NIllegal number of logical units%2N%VA%2NIllegal default priority specified%2N%VA%2NIllegal ODT or task vector size%2NIllegal filename%2N%VA%2NIllegal device/volume%2N%VA%2NLookup failure on file %X%2NIllegal directory%2N%VA%2NIncompatable reference to library P-section %2R%2NIllegal reference to library P-section %2R%2NResident library memory allocation conflict%2N%VA%2NLookup failure resident library file - %X%2NIllegal partition/common block specified%2N%VA%2NNo memory available for library %2R%2NPIC libraries may not reference other libraries%N%VAIllegal APR reservation%N%VAI/O error library image file%N%VARequired partition not specified%2NInvalid APR reservation%N%VAComplex relocation error-divide by zero module %2R%2NWork file I/O error%2NLookup failure on system library file%2NUnable to open work file%2NNo virtual memory storage available%2NModule %2R not in library%2NIncorrect library module specification%N%VA%2NLibrary file %X has incorrect format%2NResident library has incorrect address alignment%2N%VA%2NPartition %2R has illegal memory limits%2NInvalid partition/common block specified%2N%VA%2NTask build aborted via request%2N%VA%2NDisk image core allocation too large%2N%VA%2NInvalid window block specification%2N%VA%2NTask requires too many window blocks%2NTask has illegal physical memory limits%N%P %P %P%2NLibrary references overlaid library%2N%VA%2NTask image file %X is non-contiguous%2NVirtual section has illegal address limits%2N%VA%2NFile %X attempted to store data in virtual section%2NResident library mapped array allocation too large%2N%VA%2NInvalid reference to mapped array by module%2R%2NEnd of file reached before .END in %X%2NSymbol %2R not found for patch %2NSegment %2R not found for patch %2NSupervisor mode completion routine is undefined %2NLibrary not built as a supervisor mode library%N%VA%2NSupervisor-mode library reference error%N%VA%2NIllegal system size specified %2NConflicting base addresses in cluster library %2NLibrary %2R not found in any cluster%2NIllegal cluster configuration %2NCluster library element %2R does not have null root%2NModule %2R contains incompatible autoload vectors%2NCluster library element %2R is not resident overlaid%2NSegment not found to address round%2N%VA%2NLibrary build not requested - ignoring option%2N%VA%2NIncompatible OTS module%2Ne"FIRJ w +$7! -tĻw "&f e"DI ƾ%wJD e"FIRJ w ECf@I e-- $ ' Ի -L7",a(Q$ H"7`&w wA bġ D 00?:l1DATADATADATADATADATADATADATA|,;;` W 2" @TITISYSYTICLOV<" B ^<&3&f& v >H( H J j' VFY>P{L};VFY Version M0529 (ANSI)VFY -- [0,0]File ID %P,%P %X Owner [%O,%O]file ID %P,%P Summary: mult = %D. free = %D. bad = %D. Header map error I/O error reading file header - Error code %D. Bad file header %D. Lost files were found Rescan of volume to find all files with multiple allocation%NIndex indicates Bitmap indicates %N File header does not exist?TSYUPREFRIDDE0LO@DVLIRC HDAL xQzSY SYt:#zSYz& Rw<w00 p D d  $ Z H n8&0    5 ~  500  ~ E  5 5@ b  tw4 &   N5B- h*U4 ) &7 "H V4J @ `ww%%  pmp!+ 05*5w6w,w,- -00?D>3eaek5@xw*5@lww  R t &E     0 6 e p 0 mp  85E ]%]<b,*( 5   ` D BC % <b '&1 >* > J |V tV( lbd db \b Tb LbJ Dbh <n 4nj ,B# $* 4 ' ,5ew , Bv     5Bw 5  5 2  UE 2 F0E U 5@*& E& & f&ËDef Ë )̋U&  m  f A N  %&   `@ ` B   & A @    w eE D` bl lrw \  B eE"s    s-  Csl&f &ff w 8! & &  $e**0+1(e  %&p*w f( f)f )"(. = . B  E " r(.8Ae f"( UCɗ&+(e$&% 8e2 ..8em,0l0!D0e6p 4.) ^&f (  e) .  e6p 4 &08*w,=p!Օ^141612epl2l0p,*146f %8 E D/D!D l0l8epl0pɥ.ɕ `wP >U8UMwJ w0,0, f 톇,, w      .% eB U5UU plp & NeՀ)* >z @2J42V2b2n 2>`!2`!lz(4,40`!z5`!z[1,3]The following files were not in any directoryFailed to open directory fileFailed to close directory fileI/O error reading directory file They have been entered in directory %VA They are still lost, could not find directory %VA Failed to enter file - Error code %D. File successfully entered as %X Error code %D. - Directory [%I] As a result, no files will be entered in %VAThe following directory entries were invalid[%I] File ID %P,%P,%P %X - %IFile not foundInvalid version numberReserved field was non-zero %D. Invalid directory entries were found %3A,%3A%VA%&7%40#  rm> r܇@ l E R 4  H p\\p^^pVBpXDpZFNN7 Z5l 5@`w$ r1 0 $p&V4J fw Fp%hd `[5   4 2 w000?:l1DATADATADATADATADATADATADATA w@z  -& &&&&eH&&& )TTTTTT NeB p *  te%D& b* b  5@*b U 5 (!#   `  5xbe  X p5L, )`  *1 *b  & %  "m ( -  -  D`# X ~b " Jb X   ȕ W0W9 D!  P e ѥ  Rb &  ! B# ' ) ) :* R+ 4 @7 `!Failed to find INDEXF.SYS;1 in MFD - Will open index by file ID 1,1Failed to find BITMAP.SYS;1 in MFD - Will open bitmap by file ID 2,2%NConsistency check of index and bitmap on %2A%O: Listing of index on %2A%O: Read check of files on %2A%O: - Blocking factor %D. Storage control block (VBN 1 of BITMAP.SYS) is corruptedContinuing with an approximation of the size of the volumeOnly the "blocks free" value is validThe "blocks used" value is valid in the line beginning "index indicates"The "blocks free" value is valid in the line beginning "bitmap indicates" P35tw7 J & T5H# # * D%NwBD  J , <    7w CC e  å~ `eBC    ~| b  XH5Hn B 8F:5H N40Hv$& k7,\t7,^nU#  W m  J M5@ bM5fM b:5P%ne0rE'f( r 7XwV P @7D2 w&7%%w1&J   f V EB f 2E7 H J B`w 4  x5N   b4 fQXT 5SY>7 <t# `   %R 7 J5(5 #5"# !# * D BD R%x  ~ 8&*e7 eB$& ! e     $ ! R" B# ) :* 4 @7 87 Failed to open file for read check - Error code %D. Error starting at VBN %O,%P, LBN %O,%P - Error code %D. Error at VBN %O,%P, LBN %O,%P - Error code %D. File ID %P,%P %X 4v  `ˋl,,d2.J!# C v$eR # # #  p!& T%3 ~%f 02 d N   B 4 wD 3  %*1p sas &ffb  *  `e @   !  CbB a(b \x&5HF :k Te   BЕ.Е/e .Е.w ' * @7 , ,00?D>3eaek  Multiple allocation %O,%P Bad block number %O,%P Block is marked free %O,%P File is marked for delete I/O error writing file header - Error code %D.. blocks free, . blocks used out of %N%2A%O: has Delete this header [Y/N/Q/G]? / 5 ŀ *  @ @`e  ~w4 eB w &PN L H V = 4   ,w0 ( Z w@    w05 \5 w@~   r CaB | w@F Z  R 4 D & d mZp    Jw 3 E  E    t@Jw5 M5@F $f8b f, )ĝhĥY!ĥyĥNĥnĥQĥqU bĥGĥgU@N&U> 50mA  " b e\^ wf  z  f %  Е. &J    `A   H nw  J     2B# *) "4 , ,Get Command Line - I/O ErrorGet Command Line - Bad @ File NameGet Command Line - Max @ File Depth ExceededGet Command Line - Failed to Open @ File1&\w6 <7& & A&?m. E @χ7772 C&C&0 0 0 0 0 [&[&4 v&v&t N l&&V(J 7 D7 7 7 .7 6 w :7 N> >nTCD CD CD    I( D>((4 >>7 ^ R7 5 5 55 U@5@5~%% \f \0 b | f  @ : w T`` ` ` ,"(.%w 5 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 "jjlj ɥ@@aujk,bp z5f fˇ ȕ f‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & p8 *w  8jDl@ jTeBT85l@ *@( D peB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ ! & ' ' * 4 87 ! $ l! f! * + `!w "(DB C DBe ?D(e(e$2e (%[]%<>  T1 >w ) * w46l0f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ 00?:l1DATADATADATADATADATADATADATA 6;eB  8 $&w *<S1   K U U@   f&" V '&)'&&* *%0*ND   EU   w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce x   *w n832cd& & & B  2OΕ   N Υ$Ε  22Υ   4 v Ε f e * ze*w^@) *0, `   ) )(   =  l 0l   4/ e&=Ba@a e0b ee@ ` Y= E8 el0  & 0 l0`p l064p 4 ep )wV% x , j  N w"  J  B #  f  `* @w0)0406 l0 =D 6 `p46 |f H64/=  @) 0  8w 46 8 & e*w > =00l&8el2 0 *w *8I 2*=)98 eB &&  U 뉝**e *Nlv ΋*.2 4 & #!)&eP(e && >e >E p*  w   f >5>Eu   w ,BC "& @SY&*p0p210=E%0=w(*e "f D CB.Ew *eB 8 L 0w d   4w  ,,  *w *D Z  wnw *f f x! fP `ŀ)BM=f(& e %&&eH =&e0  U   E > >E=uf p  wX f &* x*w wbw wXw wP5%& w &Ba +- ʥ# . U 0   b   `      *) l0, *) $ )*)0,40,6 w  )  fU %  BA `6p 4p`4 %60 4 Mw  DP5R RRR (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w  *$ ':T U@% DD%][%><w  w1  %,,:4 w \*  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce <e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ  &f D E/fC A B f&  BeA @0 (@00?D>3eaek0 a@eA  B0 AB  f  C @*)  h P82e&( 0 0 0 80 B0 0 0 0)#0.e6p 4 8 < z81416 B   : (e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ z  BDEe    *1  ˕03 "   ˔Ӕ ʥ7&fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@ 2B 00fep=& /e`pw n w b ) ,8C 8* ) *wj*   ep p  އ#= EW9ť^*0 ` Ca C  = L  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  , J *` C#   D @)  6?0D)w ( D x 8#"#)%ĥ ĥ wn 0 *0 @Q$    0 40 60)) | L \# U&* =w `p!2 EW!p0p2 ,ׇ#( P) R@#**fff  &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@)) *R*)@#0l C# 028 00ĥۇAĥĊ  000 H0 @0 &*0 @ u # eB&B B * X eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6wL/!0/ l0/!p!0 .=p0p2 8   ׇ** n w b ) ,8C $* ) *wj*  ep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  8 V *`)w >C#    D @)  6?0D)w ( D 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB $ L \# U&* =w `p!2 EW!p0p2 .ׇ#( P) T@#**fff  &*wj. nB5(8e00?:l1DATADATADATADATADATADATADATA$8w2A&(e 4p8q  (#5=A#@)) *R*)@#0l C# 028 00ĥۇAĥĊ  000 J0 @0 &*0 @ u # eB&B B * Z eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6wN/!0/ l0/!p!0 .=p0p2 8  ׇ**&7 7 7 N f  %1  11 1 1 11~f&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 e ٦eeȵe ~  DE  ȵ2e &e  %&'@^e55@558Beeȵee& q1B$e q1 B  w r w h& W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  & & & @( f  e ee e  w p ť ť 0B 6Aakz?TLBOPzLB  $00?@3eaekIllegal deviceOpen failure on bit mapOpen failure on temporary fileFailed to allocate space for temp fileFailed to detach deviceFailed to attach deviceCommand syntax errorI/O error on input fileI/O error on output fileIllegal switchOpen failure on listing fileOpen failure on index fileNo dynamic memory available - Partition too smallClose failure on bit mapClose failure on index fileClose failure on temporary fileClose failure on listing fileIllegal response - try againSY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VAI/O Error Code %D.QI/O Error Code %D.&&&&' '6'.' 6 5  5*+5U5 5   BBCU% B  0 v $5 % !7   "UfUh"&& *" Е ȕ-ȕ  "   ' , "B"&Qe85)E$ %& e eUU& & &"e e\^$% 5R  &eH P" -- P"P" &"!j A' 2& & & & f"& & & Ν )  % U&! 2"Q' B"B " 8&k' ~'   %TL݇w b& LB&a  "  W111 D K  M ?   "U%    vM !D  E e"@P   & SY&  & SY& p 5 "%  " H)P &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e w &BA' , A  &A Е*  є ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw B&& D¥%  B&ХVA C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& e/& eF*AHŀ ȕ Е Е Е & eb & eNЕ A %& e"A  Е A bEA EЕ A A   $Е.  AЕ;    w XD&& bЕ- eaePPPЕ-$w (D  &Е. ce  Е:   B 5 ߥ& *  + 23E Ew ㅐ   Е-   0@A `W e`fÊ    E (e(BA &(e(H0 (A f( (Af((AD&()&pDCe(e$fҕ[ ,ҕ, "ҕ]e(0 >E 5  e0Ґ |x,?H?H! W 700@:l1DATADATADATADATADATADATADATATITISYSYSYSYOV~0FZ(*|00` SLP -- Command file checksum is %P SLP -- *DIAG*-Error in command file %X checksum  :Z7 7 7 &J  U v w 7 d P* /&wx  ɇ  U@2   U   |   U5p]7 nw*7pej`    :-2T e Ebw w7N e=E7 5H 75< 5    5   L| Zw4* wfF   ~ v< *  - eH\Z  w & &*$5%&/      55 7 4   57 zEU ;**-EW**w (&&*@E<E1E.E09EŠ$"EŠEŠEŠťNE E EEEŋዾ  &* Ee   $7 &*7X#w P%E &* ť DEe7!\w R P&* # > a abpd $ef  \5  X75-"  P'*7"`¥¥¥ ¥¥ef  d w 0$Z `5 V?"" " "5@)~5:5@2 5 *  @@&*! l$E@` 5 q"*  55 .! ~! W ''R Ћ "eV!  ` #-  *,! #" (!&5 0  # `:-62  #E ` .7 . E  w " E DW!! L ` `, ~F! @ AL 6  l"\    F !%*" ~ D <L 4 w47w b )5   5 V J  *` 0e |55 ~hp5p %*B ɋW W UB 7 : &*E05*w UB &* Х U B B 5EeЕ  Е &*  R @AAŁ@<(lxPDC@@UE  E  &@AU@@U w -" 7 7  -ĥ/7 $ ĥ, %#ĥ;ĭIĥ ĥ 7 ~ x r    "  @" < 4 &00@@3eaek & @( !f  e ee e &3 89f"e\e!e  5f 2* eA  w D ť ť 0B !Aaw ' UD$BA %&( U BQ rЕ* THSY:dAU[[BF[CMZACSZFTRZSQ ZRS@ZNSZZ7z SLP>NX~+Kn8Y|x NSY0DBZSP[ &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA n C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& e/& e*AHŀ ȕ Е Е Е & eR & e>Е A %& eA l Е A "EA FEЕ A 8A   $Е.  AЕ;     f** aB ¥*W W c@ %w P5 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f   P aAAf@pnp ZC*8֋ 88*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ ŀajTI& af* n*`V @e,w tjjlj ɥ@@aujk,bp "5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ jDlljaCeH###33 & 8 *w 6 8jDl@ TeBT85l@ @( D jeB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@w RD&& bЕ- eaePPPЕ-$w "D  &Е. ce  Е:   6BTHZSYnzAU[[BF[CMZACSZFTRZSQ ZRS@ZNSZD%N%1R -- *DIAG* -Open failure correction input file %XOpen failure line listing file %XOpen failure source output file %XPremature EOF correction input file %XIllegal Get Command Line error codeI/O error command input fileIndirect file open failure%N%VAIndirect command syntax error%N%VAIndirect file depth exceeded%N%VAI/O error source output file %XI/O error line listing file %XIllegal switch or filespec%N%VAIllegal filename%00@:l1DATADATADATADATADATADATADATAN%VAIllegal device name%N%VACommand syntax error%N%VAPremature EOF command input fileI/O error correction input file %XIllegal directory%N%VAI/O error command output fileIllegal error/severity code %P %P %PLine number error%N%VA%D lines truncated by audit trail%N%1R -- *FATAL* -%2N%VA%N'&1 J99 J9z: J9(; J9r: V9H: 9? 9tA ~ 9? v 9@ n n90? f z9? ^ 92? V 9A N 9?5ew , Bv     5Bw $ (d)&*. 5  5 2  UE >9, +*<9E U 5@*& E& & f&ËDef Ë )̋U 5 ߥ& *  + 23E Ew Z   Е-   0@A ,W e`fÊ    E &f w z(DB C DBe ?D(e(e$2e (%[]%<>  1 >w  Pn832cd& & & B  2OΕ   N Υ$Ε  22Υ   v Ε f e * e*w~@) *0, z   V) @)00@@3eaek(   =  l 0l  : 4/ e&=Ba@a e0b ee@ ` Y= E8 el0  & 0 l0`p l064p 4 ep )wV%  ,   N w"  J pB #  f  `* `wP)0406 l0 &  m  f A N  %f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ &ff w *D   ww H) * w46l0** *) l0, *) $ )*)0,40,6 w   wd  < ,,  *e6p 4 b8 \ 81416 p   Z :)  4..8em,0l0!D0e6p 4.) &f   e) .  e6p 4 `08*w 8   **  DP5R RRR =p!Օ^> =00l&8el2 0 *&   `@ ` B   & A @    0+1(e  @%&p*w f( f)f ~8Ae f"( UCɗ&+(e$&% =D  `p46 f 64/=  >@) 0  8w $46 V8 re*w &f D E/fC A 6B f&  BeA @0 , (@0 a@eA  B0 AB  f  C @*141612epl2l0p,*1 0U8UMw w B 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ w8e2 0,0, f 톇,, w      .% eB U5UU  plp & NeՀ)*w 0 ) Z fU %  BA `6p 4p`4 %60 4)"(. = . B  E H :(. 9J9b99>9V99d>9J9!?n9>9!?, b9z9&?b99*?|b99/?b992?b9n95  # ?5  z# l/ nE ` l5@ 8505`(# ` (χeB$&< w @pdf d) B$ĵ4ĵ!%'% %E$e@ P    e e  e dα& ĵ V 11@ $Be 4α n90? z9? 92? 9D 9tA9w ?9 &* P P>> P> 9 ·   ` EƱ  6:%D:` j-fZ7 `7 Z N)w (F w < @:&* D:BC ̋Ԥ D7  5 7 w̷ @:R 6:>:"D: -Ũ #:00@:l1DATADATADATADATADATADATADATA -Œ  9 ͱw fm^p `7 X@:wH R B 7 8:4:,@:w".(  ٝ 7 %: 7 &fw 7 7 @,q `-KacJE[ !m@  ) L R  j7j f@  &  5]U E( :&@E A  ̆  E vE c  @  . &fJ>  < .  8  " .$ B  8̥ZḀ90     ;,>;ȁ>,t>;B;ʆB;,B;> <ȁ>,>>/V;>>/:>:І<>>;ʄ/;>.0<>;/:>.:>:Іr;>+B;>+>;;̆; 9F 9FeB  8 $&w x*<S1   K U U@  f&" '&)'&&* *%0*ND  * EU \ z @w BC "& @SY&*p0p210=E%0=w(*e "f D CB.E(ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w $ *$ ':T U@% DD%][%><w  wX1  %,,:4 w j*D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce    *w z*  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce <e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ (e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DEe    *1  ˕03 "   ˔Ӕ ʥ75%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@   f >5>Eu :  w ( D  8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB B L \# U&* =w `p!2 EW!p0p2 rׇ#( P) (@#**fff  &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@)) 00@@3eaek *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ *u # eB&B B  * eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2w eE D` bl lrw v  B eE"s    s-  Cslw BC "& @SY&*p0p210=E%0=w(*e "f D CB.EM=f(& e %&&eH =&e0  U   E > >E=uf 0p  w " f \&* *   f h >5>Eu   :Mw82e&( x0 0 0 80 B0 0 0 0)#0.&f& v f&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 e 0eeȵe ~  DE  ȵ2e &e  %&'@^e55@558Beeȵee& q1B$e q1 B  w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &00@;Al1DATADATADATADATADATADATADATAw ) 8C $* ) *w*  ep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  8 V *`)w C#    D @)  6?0D)w 4 n832cd& & & B  2OΕ   N Υ$Ε  22Υ   Fv Ε f Be R* e*w@)0,   ) )(   =  l 0l   0/ e&=Ba@a e0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  x, j  |w> J JwB # f  `* w)0406 l0 8  **&|&  f&&  e#e|& f&&G& & & & && '&&w *8I 6*=)98 ( eB &&  U j**e *Nlv ΋*.2  & #!)&eP(e && >e >E p* wxw *eB 8   w BC "& @SY&*p0p210=E%0=w(*e "f D CB.E ~ f b&* d*82e&( 0 0 0 80 B0 0 0 0)#0. Mwf   f >5>Eu .  w eE D` bl lrw   B eE"s    s-  Csl|,;;q W \;TITISYSYSYSYOV~0\~Z$ |000>A@3eaek0SY\'0 ZAP>P _~;|zbd  ` MX|7$7" "77077&~ - * 7 z5x&fb~  N p 6 wX3wm@  JEe  E Jeww7z77r7pnhXhlfTe"eN@e7 64 6.e"/  57e7X6e- w 7 7|7 ~ 7rjm^bdR Df f &f &ff  w .5 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 Rjjlj ɥ@@aujk,bp J5f fˇ ȕ 6‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *  w   8jDl@ 8TeBT85l@ @( D 2 eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@wJ54 @ E7 7VVT :V 5h X R%G  3 ,  &@ N`VT V 5 eew ͇   %f @   w(a62 vp7n V beb e wFa5  ed Ne `w fɋP7w4 @6 vl  e.e e   ݀f z  v06 2bE Z V REL J @e0? .&  "0  No such relocation registerAddress not within segmentNo such segmentToo many argumentsNo such internal registerUnrecognized commandNo open locati00FA;Al1DATADATADATADATADATADATADATAonCannot be used in byte modeError in file specificationOpen failure for task image fileError on command inputI/O error on task image fileNot a task image or no task headerVerify failureNot implementedSegment table overflowf <^vZAP -- (@'&1     + d/ / ) )  2 ) N/ ) |D, t /5ew , Bv     5Bw$ #5  5 2  UE  $E U 5@*& E& & f&ËDef Ë )̋Uw www *D V  ww (DB C DBe ?D(e(e$2e (%[]%<>  1 >&ff 0+1(e  @%&p*w f( f)f 8Ae f"( UCɗ&+(e$&% f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ ** $$t $, ))`) &), +2 025)AB&RO&LI&w z7 7 7 7 # $ q kz0 b `a \NF L ȕ D@ȕ$ 840~#56# R e ea   V Pww~ m  B  e -?R& & Am~E7zzr n-hh w4 z ~R ~ w ww $a e 7  Z %5 0 0 0 0 0 0 ewd)  K5@HwX5 <(W  H  ?mp fd0 0 0 w7 ,  W  5 7 77   7 0( $7 7  p 0 0 0 0 0 e-   n7lZ-VL F7lD @8 27 .e2"6 6 W  5 00NA@3eaek5   C`D`xE`t ?6` v`  v`  lp)˕5 7x7v > > 3@W˕5 7: > > 3@ :e62  ׭ 5 AwH  A  ?mbp0 0 0  M˕5 77 > > 3@ ~ezv ׭ H0 0 0  <׭ ?(wx˕5 7 > > 3@ e  ׭g 5 AwH8  A  ?mp0 0 0  pelh ׭ H0 0 0  . ׭ 5 ?e    e Cl0 0 0  ׭Q ?ee,  )hf !Xfe Hf 5@m, X L" N 5h) N* `$ X) 6 P) *  N ^) b) N - N   N N  B  l)  @ ( e%w f첇 e& ' ew)  n6E?`e N6e <5 Y m   @` ȕȕ 5@ ȕ 1 1  -xze 1 dde 1%H he>-::w  Hwe r  [ E1 qle :1 e $1 `   ɕɕɕ5@ ɕ  ep-ll   ~ % ]Le m@?622e 11qle j1 e T1 ` ɕ 5@ ɕ  e-   e 77 ~|e  @e\e % w. 8%e"   @% RootI-space rootD-space rootSharedI-space sharedD-space sharedI-spaceI- andD-spaceOverlayNo disk allocationNo disk allocation (I)No disk allocation (D)Null4(6(<(J(X(`(p(((((((((ZAP Version COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1983Segment table: @ ) D, 2 )w  5B`  w2/      5@         @!   &  ~ f    :  :w47 7  7 7 7   lr$@@m@  m @`7 F$  lz$ x7 o- \ 7$ 7$F 7@ >$:$# 7 "7 ^7 \D4>;8N<F0( & -R - e$R$ 7 L e#7 w   |Z$ 7 fR  7  4mx +Ef5\T 7 L 7FW 0W 7 2 @`7&0 fɋ ɭ@ f7$ ܬ$$E l$w\ m l$  iW  5f  7 Z7 TY@ l%bm@X67NHm(@oNHB m*e7"5,( 77 5 7W 57w$7 lqt 8wL-R > |v 7j% b= XEe0 ~, v@E :$wN-"(_ B @N  $> N f7 neA l%$0 $1-  $0 $"-~ |$x$ -0^   h%w|#a 4.E r5 00VA;Al1DATADATADATADATADATADATADATA ,$  # $ &# j %% 7 7  0wEm l>%  : |:    .p N B, v L$ & % $ T N D Μ8% : 2w lD%NN N N N d e& # e e" 7 7 7 7 w$ -$- $  B$  D$ :,;+-*.CQ$ACFHLMQX ^_@>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 w ) & 8C $* ) *w*  ep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  8 V *`)w 8C#    D @)  6?0D)w T n832cd& & & B  2OΕ   N Υ$Ε  22Υ   v Ε f e * e*w@)0,    ) )(   =  l 0l  z 0/ 00^A@3eaeke&=Ba@a >e0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  R, D  w>  JwB #  f  `* w)0406 l0 w 0 x) |* wF46l0w  0,0w  w $0,0w] |46  )0406 0 *&  m  f A N  %0,0, f 톇,, w      .% eB U5UU plp & NeՀ)*=p!Օ^ *) l0, *) $ )*)0,40,6  DP5R RRR  8  **=D < `p46 f 64/=  @) 0  8w8 046 8 e*w > =00l&8el2 0 *e6p 4 28 Z 81416 2    & 8   * :  4 6 He6p 4&* ..8em,0l0!D0e6p 4.) &f  H e) .  e6p 4 08*w>141612epl2l0pw  ) ^ fU %  BA `6p 4p`4 %60 446f %8 E D/D!D l0l8epl0pɥ.ɕ .w)"(. = . B  E (.,*1 U8UMw| w B 00fep=& /e`pwH8e2 eB  8 $&w *<S1   K U U@  f&" '&)'&&* *%0*ND  * EU \ z @w BC "& @SY&*p0p210=E%0=w(*e "f D CB.E(ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w D *$ ':T U@% DD%][%><w  wX1  %,,:4 w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce    *w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce <e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"  00fA;Al1DATADATADATADATADATADATADATA ˥" Ք     Օ (e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DEe    *1  ˕03 "   ˔Ӕ ʥ75%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@   f n >5>Eu   w ( D 8#"#)%ĥ ĥ wn 0 *0 @Q$    0 40 60)) ( L \# U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff v R&*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@))  *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ u # eB&B B  * V eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2w eE D` bl lrw   B eE"s    s-  Csl141612epl2l0pM=f(& e %&&eH =&e0  U   E > >E=uf p  w f &* * TMw82e&( ,0 0 0 80 B0 0 0 0)#0.> =00l&8el2 0 *e6p 4 8 81416 2 B h  &f ,*1 U8UMw> w FB 00fep=& /e`pw 46f %8 E D/D!D l0l8epl0pɥ.ɕ w8e2 *) l0, *) $ )*)0,40,6 w ( D 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB  L \# U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff v L&*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@)) 00nAtyA3eaek *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ u # eB&B B  * P eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2w eE D` bl lrw   B eE"s    s-  Csl141612epl2l0pM=f(& e %&&eH =&e0  U   E > >E=uf p  w f &* * NMw82e&( ,0 0 0 80 B0 0 0 0)#0.> =00l&8el2 0 *e6p 4 8 81416 2 B h  &f ,*1 U8UMw8 w| @B 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ w8e2 *) l0, *) $ )*)0,40,6 w *8I J*=)98 : eB &&  U |**e *Nlv ΋*.2  & #!)&eP(e && >e >E p* w82e&( ~0 0 0 80 B0 0 0 0)#0.)"(. = . B  E p (.w |eE D` bl lrw 8  B eE"s    s-  Csl8e2 ..8em,0l0!D0e6p 4.) r&f <  e) .  e6p 4 :08*w=p!Օ^&f 141612epl2l0p,*146f %8 E D/D!D l0l8epl0pɥ.ɕ w TU8UMw w0,0, f 톇,, w >     .% eB U5UU  plp & NeՀ)* MOV #IE.FHE,R0 ;PUT FATAL HARDWARE ERROR ON STACK# CALL CERR ;LOG CONTROLLER ERROR .ENDC.20$: CALLV PORT,STOMP ;STOMP THE CONTROLLER;S6; RESET ALL STATES EXCEPT C1.REC,C1.R2,C1.UMR,C1.CON; + BIC #^C,(R3);+ BIS #C1.FAT,(R3) ;MARK THAT WE DID THISO MOV R3,R0 ;GET THE CSTO- ADD #C.OLHD,R0 ;POINT TO THE C.OLHD QUEUER;$; DEALLOCATE ALL PIOPS FROM C.OLHD;H# MOV R0,R1 ;COPY THE QUEUE HEAD.% MOV (R1),R1 ;GET THE NEXT00tzAAl1DATADATADATADATADATADATADATA PACKETE BEQ 50$ ;NONE LEFTR)30$: PUSH <(R1)> ;POINTER TO NEXT IOPL+ BITB #IP.FAK,I.PRM+11(R1) ;IS IT A PIOP?R BEQ 40$ ;NOPE, CONTINUE! PUSH ;SAVE R0 AND R3 2 CALL @QRMVA ;REMOVE IT FROM THE QUEUE ;GM112" POP ;RESTORE R3 ;**-1 CALL PIOPDE ;DEALLOCATE ITI POP ;RESTORE R0 40$: POP ;RESTORE R1  BNE 30$ ;GET ANOTHER%50$: MOV S.QST(R4),R2 ;RESTORE THE6 MOV (R2),R3 ;/*Q.CST*/ ;RESTORE CST ADDRESS TO R3;EO; TAKE ANY IOP'S WAITING FOR UMR'S OUT OF THE UMR WAIT QUEUE PUT THEM BACK INXN; S.LHD. CHANGE THE PRIORITY TO INSURE THAT IT GOES AT THE BEGINNING OF THE#; QUEUE, AND CLEAR THE C1.UMR BIT ;CA  BIT #C1.UMR,(R3) ;WAS THIS CONTROLLER WAITING FOR UMRS? ;**-2O  BEQ 80$ ;IF EQ NO!  PUSH ;SAVE R2 AND R30<  MOV @UMRWT,R0 ;GET THE HEAD OF THE UMR WAIT QUEUE ;GM1122  BEQ 70$ ;IF NOTHING, SKIP THIS SECTION ;**-1) MOV R0,R1 ;COPY THE QUEUE HEAD TO R1T&60$: MOV (R1),R1 ;GET A WAIT BLOCK BEQ 70$ ;NONE LEFT 2 CMP 10(R1),R4 ;WAIT BLOCK FOR THIS CONTROLLER? ;..(SAME SCB) BNE 60$ ;NO, TRY ANOTHERN8 CALL @QRMVA ;REMOVE THE BLOCK FROM THE QUEUE ;GM112> MOV 6(R1),R1 ;GET THE IOP ADDRESS FROM THE WAIT BLOCK;**-1 ;PKW109 9 .IF DF D$$DSK&DU$CHK ;IF QUEUE OPTIMIZATION ;PKW109G ;PKW109R= MOV I.UCB(R1),R5 ;MAKE SURE WE HAVE THE RIGHT UCB ;PKW109 , CALL REQUE ;RECONVERT THE LBN ;PKW109 ;PKW109,% .ENDC |s,?M?M5 W 2` TITISYSYSYTISYSYOV0`j 00w  5B`  w2/      5@         @!   &  ~ f   f @w    3f f &f &ff 00AyA3eaekw   * . j    0 0     %& & i& 3 hw*fh  @fR eV w`F ew *  @f eV w` ew eV 6 e       f`f&  e|ewL @ $     @Ҁ- , j Bԁ B`m  B    ȋ  B ɋ  f-    7 7  pAz pt f-  W  | -@   Jl 7. * 7" W W  fF 7 m  me, @w@  7 ,b & "%  wAlAbeBeAbE ld 7,v,,0 bw fNaeN!whC -r  ` \ 7 Z 7T H @`@ E #@& eg $  %` (]Bme Dl% l&fe 9 6v  a! W,& f f 6  a %  )D E& Af e% Le wAmeC " B @AlB`65  D5 f  e 5CCl5C5 W, Clb"  5 `5e  D`  &f+ f& %) f&&& e vva e ew t4 ^< Bf& . ( `e C  JewmBD 2 @  Nm L m ,T 7lvwpmZB\ @7Z`VR 57>7`:57.5&  l we (7 "6,b w  Zv@` @ d  7 E eD   e w 6v 6t &lb`e 6 `Ѥ   eb | <ewwaeewLFDCa@ Ew *C  > @    W  W W | en  hb `wF f v C W!W! mDm  6 D!  -m W!p  ,%wv    %w^ eEmp7 Z b mT7 >-@ d.** w "wА `-w &    eEB K  `ww w a V\ ERLRPTHHHHHHHH~nv&.@^'&1 T." L.( D.V* <.* 4.. ,.0 $.0 : 3 :3 :F4 :6 FA = = = ? H? T? f $3 r 9 r : ~ ; ~ 8@ ~ Z@ ~ &B  6  3 | 9 t @ l `+ d `+5ew , Bv     5Bw R5  5 2  UE  ". RF E U 5@*& E& & f&ËDef Ë )̋U&ff  5 ߥ& *  + 23E Ew Z   Е-   0@A XW e`fÊ    E &f &  m  f A N  % !. !:"  3L F.f l<R:$ D^Fv&GRj(GR^* DF-Hv.Hv/Hxv0Hv1Hv2 DF5 DF7 DFR9l<\:F;? =B ?BA? Z D\D * E\D 6 F\Dx B G\D N H\D  I?L 3r . P9f ~ S9< f r Y 3. e 3$.:m!\ ".s`+ t+  + `+ J "JT J w  a@`AB S  & ew>  5AEA5 ef   N x@ew5’ P@  DB@A  2@@P5e 5pc ׯ A E   l1 7 8A  `, EcEc  6  n  r  VEcEcwwae  < &w!wA@  ! l1NBe  eeW W  f qeW W    h j e >}     ~$H r{ } "}e  \ nwwae _ 0EYe , >wwae Ge wfwabe9e8 : B7 "4 v1@m(A"pEm" J  n p  f j r  R  B -< ,w& ,  00AyA3eaek4 E  vm?n m`< AeW W   Tl  W W   D  8       h ׯL wpC~7vvmnpEmfe AAcBEEb E w1, eeEc Ecef@ l1 1 N& \* 2 W  f > f f z  f x f x wr    m  `f ew8  a&  dvA`f xf&& f& ew& -` ( " `  @!L 5f @%f e m&E&  ew, 2&  a \$          m"'  a@`Em$@ m*&fE& He e &a ew\ؗ-      l"255  5`  f t w$ x  &af   , ,,"  e ! B` D` D  ҋ  D ыR     l*2D        f |ew@A %  `M M` @ A w w@ABC% % % %  `M u u U`M u `M `@ A B C w   M u @ A   wf  @M u u u @ A   wNf   @ A D E !  we&&&&  @N v v v @ A   e @aP P P w     `f   `ѕ- ae32ѕ-ѕ1ѕ9 4 ѕ  ѕ: ѕ: e e/ѐe:w    lZ2 1     8f ZN& `e -2  e&       f&& Xew Ee0 9e Ҁ e0 9e %   <   wӦ)@  l2 V  C @6 p21/5 1      @D C  QP  f fe  \& T  6 %w  l2 <BCw 4 42- Մ @`eBwa "     Be&& ` e *F`Bflrx &06<BHNlrrrrrx~BJJJJJJRBXXXXXX` "(JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC  &&,Z<`ABCDEFHJKLMNPRSTUV 4  f 3 f 5 f :8 r < r > r ,? ~ < ~ zB ~ C h3 = F= 8 J J K K L00AAl1DATADATADATADATADATADATADATA)i` L aa7 e 8 7 e -88 7 e  4Ӗ%wϦ) l8 , < (   aaf Z- 6   e%w\Ϧ)P  l8 X C 6v  e aa  6 6   F&  6E (&   = &  . %/ V H  7 ~v l`  ^ 7 X-NP7 LN e%wB  vAm@   )@W. W. B %@ N` t e%  w  vJ8  E @S   e  %w>́ Dm @W  @ B0  ˀ`% f  lj8 k F *wy(! 7  wfwdP G`8 -j7 bZ RV& e - d8& e n R555@ weCTL>SY:ERRLOG.ULBLB:[1,6]LX:[1,6] z nCOMMANDINPUTOUTPUTUSERREPORT&8.848<8B8RPT>V2.00xP4&B &F@ FA < < ? z?**0+1(e  @%&p*w f( f)f 8Ae f"( UCɗ&+(e$&% ,*1 U8UMw" wf *B 00fep=& /e`pw8e2 141612epl2l0p *) l0, *) $ )*)0,40,6 e6p 4 8 B &81416    x Tw eE D` bl lrw   B eE"s    s-  Csl82e&( <0 0 0 80 B0 0 0 0)#0.46f %8 E D/D!D l0l8epl0pɥ.ɕ Pw@w 5 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f  b P aAAf@pnp XC*8֋ "88*Ë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@ PDlljaCeH###33 & 8 *2>>w  8jDl@ TeBT85l@ @( D eB& x & @# `& V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@w€  5  `˵c5˵ Ł@ \@*   wҀ %58 @`1 V $  \, t >F   *V-fЕ Е f& heew DբV .e  DR`D <w^  wR1  %,,:4 Jĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ vz  DEe    *1  ˕03 "   ˔Ӕ ʥ7(e( 1  `((   >: 5 eCe   f >5>Eu   w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce Z   &*w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ w BC "& @SY&*p0p210=E%0=w((*e "f D CB.E قH zَH rٚH jٚH bٚH ZٚH RٚI J٦H BٲHw ( D 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB  L \# U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff  \&*wj. nB5(8e$8w2A&(e &00AAl1DATADATADATADATADATADATADATA4p8q  (#5=A#@)) N *R*)@#0l C# 028 H00ĥۇAĥĊ  000 T0 @0 &*0 @ 6u # eB&B B  T* eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w@/!0/ l0/!p!0 .=p0p2w `BC "& @SY&*p0p210=E%0=w(*e "f D CB.EM=f(& e %&&eH =&e0  NU   E > >E=uf ~p  wH   f >5>Eu   f &* * 8Mw> =00l&8el2 0 *w `(DB C DBe ?D(e(e$2e (%[]%<>  1 >f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ w *8I *=)98  eB &&  U D**e *Nlv ΋*.2  & #!)&eP(e && >e >E p* lwpw ) J8C $* ) *w$*  ep p  #= EW9ť^*0 ` Ca C  = X 00AyA3eaek 0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 vp  8 V *`)w \C# <   D @)  6?0D)  DP5R RRR  8  **)"(. = . B  E (. ..8em,0l0!D0e6p 4.) n&f  e) .  e6p 4 08*w=p!Օ^0,0, f 톇,, w      .% eB U5UU  plp & NeՀ)*f&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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  & & @( pf  e ee e wǀ   " 7 DM    7*zՖ%:֎ wַeB$& 6e*aɋw. 4w"ɋ& @   f 1 4@5 87 ԁ  <<7 7 7 7 7 ԇwł m 7 Հ :w շ7 Հ ]7շշշշՇwV Ԝ\Ԝ]^ ԕ:;T&N $@&f& H J L   ԕ.N   ԕ;P be7RԇwĀ @   B  * 1 :z7 4Ӈff   `p   @  B  C  @ N \D Z ? Z @00AAl1DATADATADATADATADATADATADATA B  B  C  EeB  8 $&w *<S1   K U U@  f&" '&)'&&* *%0*ND  4 EU   5%& w $&Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@(ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w 2 *$ ':T U@% DD%][%><w^  wR1  %,,:4 Jĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ vz  DEe    *1  ˕03 "   ˔Ӕ ʥ7(e( 1  `((   >: 5 eCe   f  >5>Eu f  w P*D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce Z   &*w `*  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ w LBC "& @SY&*p0p210=E%0=w(*e "f D CB.E  `D * \D 6 \D 6 bD 6 hD 6 D 6 D B \D N fDw ( D 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB  L \# U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff  \&*wj. nB5(8e$8w2A&(e ~4p8q  (#5=A#@)) *R*)@#0l C# 028 00ĥۇAĥĊ  000 T0 @0 &*0 @ u # eB&B B  * T eBe>  # #D #=0/H#@&0 # = e0   0@e 6=00ByA3eaek#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2w BC "& @SY&*p0p210=E%0=w(*e "f D CB.EM=f(& e %&&eH =&e0  U   E > >E=uf p  w   f >5>Eu 6  f &* * Mw> =00l&8el2 0 *w (DB C DBe ?D(e(e$2e (%[]%<>  1 >f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ w L*8I *=)98 Z eB &&  U **e *Nlv ΋*.2  & #!)&eP(e && >e >E p* w(e(BA &(e(H0 (A f( (Af((AD&()&pDCe(e$fҕ[ ,ҕ, "ҕ]e(0 >E 5  e0Ґ w ( ^$0,0w \46  ^)0406 0 *w ww 8   * 8  4 6 ~e6p 4&*0,0, f 톇,, w      .% , eB U5UU l plp & NeՀ)*)"(. \= . B  E 00BAl1DATADATADATADATADATADATADATA (. ..8em,0l0!D0e6p 4.) &f J  e) .  e6p 4 08*w&=p!Օ^M a?  Ӏ l h`\\e fe?E?@m> & f 6Y w` )7 @  & f L C5l   1 t | Bmj/t d2, P1,  @ l91  v#@`"oBl Hl f@`"` [H X1RN5 *f  2  `f 1 /5 f  D`# C ce  p 1# %B5 f & x C  d "N me `e  D 66 cH@ e%)wmܪ  zxBlܰde eE` 0 ee@ l9# &  N`N`  &e e 26 e @B` E @  5W    E @`ʵ B`m`B`۰ R CE ,  Ec l  %4 *( 0 6` ڰm6e669  v P>   e2 e f \Z , m: CCmeC!x@m mBb@& 22%e%C!WBe  eE`bee@ q   $ ̀dEc@!$    &f N EmeZF *R" TITLEERROR99 ~ ; ~ = J J Lwɀ p  lv? ̇ -& $- ef V  e.fZ 0 f e% 0 f x w ɂ  @   pe0ɐ Te  @wW5 ׶*& -צ5 .-+' |ׄj  w j  `7 ` X PL@@ 17 8'R ,2 I7 xw x @@beE - 7 7 57 5-֞-֔% @@beE w@`7w7` -ײ  |ʇ7 7 ׇ*77   ڇ2 n 8h *.LVH-rn:46m00ׇwƦ)W W W f?n? Hf 86  Glz?@A P@A P@A P@A H@  @TTTR@BDQBDQBDQBBQ  6 v       Z W R Obu u u lu u lu l  - <Lf? j,@- @ D 4.- @ vMDC   f tҖ%  N&&N e$ ewf?f M u u u -# ff e wv C Ѐ  S   &2`$b00ByA3eaek & & @( f  e ee e 7 ؐ 0xxx؇wX h؃ C,DA "B@ @`H 70 &w  "J@wȁEB`&  JJ w"HleD Db1q w " Hl!plHB 5 fZצ fFN % w  Bm @׀ b m    0 lN#  Hw wǃ t#`   ˋl`b@ f Ab 6 7*ևw\Ǧ)m6 0 H4&ȋ+lDaEcm!a ԁf6  R b& (%c    %wƀ I @l@l44` eE`Ba CeEC`bc @ eec@  XɇwŁ1 B` eE`@@b 2 ewŃ Ԃ  v  J  ,  7 Է R mԇwP| T 6,lw `^ 4&ɋ p 1  ,  X@ wā C       l  H Z DZf f  r&V Pef w xAw nf  wDV &1-F7@:C"A   p!l7-wwwE"Ʒ ("Jw  @&ȋ| A  2   f@$& r1  wfæ)`@e7 X &P  rf W Pe@@ vw7w`e7 &  e O| :e!5``  `㉐   3 &fD Fs3 eee  eі%f    &@7"27/&ҷ*ҷ&7 $7 "ҷ    ā D x  Ė%N D ( beAmB fĂBl PĶ`eeDDeD! h I`ev! 2f &65  C 5l av! f eC bӦ    aef   R  :p0l BN`& N < l 1l Ae B &Ǝ %DISPATENTRY & & @( f  e ee e wH@ @ 7l X   lAt X  eNP* -$ 7  *C 5L  f <  & >ϖ%  & Af& eRw~ -   7 , e@@ @ e0#9e T  P  L  H D @7@ e@: w4 w@$ m  6e7   w΀  B 5 ї- 5(@7VA     z5ANV@ * R7 .އw  N  @m7  .7   ܬ ܇ffV X܈7 ܷ $ b7 Z ,7  NV wl< `\  C W F W E88 D(@ l$A7$ W FDzW Pu epW F LW Pb  a FZW C  %   G  7ٷW S L5`-T,  7eW L  $ W P  B -67 wX< ͖%ww 0 Bԗ ! w <#W!"   ~ eE-T ٷ \ wwD6 ԁ w`-T d j̦ f ^7e wȦ)t 0   ` eE`B   ne2 v ^ N Be J  >6a % |˖%w.Ȃ|m ) W W ~ ^ W ePEJ-FT ׷ ~     &R V7JeT ʇwxxB | BX&  FN& &  `-T pe f 7ef& h j-  8 ( t& xʖ% T7  CeAEcB   EeB!   dEc f BEmeAAe A! PLH $ @ V`Ec x x ~@& #B` ʵ ʵ  F  8T ԃ       N D ȵFԃe` ' Ne6 W   P @ DW  W    jEmeEc%fe7 ew @eE@a  AAeA!   wlleeAAeN W#EcA! *N& %w eeAAeBEcÐ  a     EA! Ec A!W#  Nf  ewa 06O&e АЕ[m / А 0 Ce:АЕ:/ PW 0 e:P Е Е Е Е]Е    ( e. & "* x J p J h Lw n832cd& & & B  2OΕ   N Υ$Ε  22Υ   Hv Ε f Le T* Ve*w:@)0,    *) )(   =  l 0l   0/ e&=Ba@a e0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  z, l  ~w> T JwB #  f  `* 8w()0406 l0 ** *) l0, *) $ )*)0,40,6 e6p 4 8  81416   0   ..8em,0l0!D0e6p 4.) &f  T be) .  e6p 4 08*wt 8  f**  DP5R RRR =p!Օ^> =00l&8el2 0 *141612epl2l0p,00&ByA3eaek*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 w 85m&&  X6e"-  C P e   e f6   f6   0  lA ҇   f ێf& ewpf  B m ΂ `B lAB` ɵW e<QBaCa 5  @< Da @ D @ D E& NUe& NU D a"K `@#  A h ew| C` 5 5  (5 5 5 f @e # -  @  0  :    5!Jפ-G`!BABa JȢeA A&A#AB eפ-  ll d 5WW d5!!ע פ: F5<! ע פ:  (5< fפ  f  0W   t@`%wlf= P eff 111f ew.af  EA 2 eKkW"  aDA T EA N $ eQʐN  mm Jʵ : @`CA Ð r2 aa a  < 2< 2e  0 f  XA Je p  : \ \ Nw af T Bai*Cava>  Z5 ~ K J    D ew6  lB Lx v65 4awf ta 86  C   S   8   ( v``W  f N&f` ~ et n   l  `; PD T  < N`f& (e :7B 2 J B`  &f e    Bԗ a z %ew<Ȧ)& & - v6v`  D  ^v6v` Z  BE`D`  D!"6  # D!     He wR     @C`B` 6   $ - . 0 ; A Z _ a zۃ [ פ] " פ" @  N%w lB@T f Ԏ f& ePB&  a  R@ !\ re `&&E f a fef * f ew a-d ȗ- ȁm? ;&( B / D!0!9"!A!Z@!a!z`!$ !.!  a %    Tew .B&  a a$&6   -v  00.BAl1DATADATADATADATADATADATADATA  +  l e ( !0!90 !A!Z7v l tDŽ *D @ 5 @P P P H  $f bew  l Ǘ     0W l & ~@`%   l0B Ƈ  F  0 0  &   0 0 0 %w &  w   M u @ A -#  w   @M u u u @ A B - #  wrf   E D @ A s     u&@eH p p eH p eH c (.Q<[y1OJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC 28R r2 4:FV@Pw  B 5 - 5(@7V"     r5AFV@ \* J7 &w  N  @m7  .7    ffV P~7 x  Z7 R ,7 ~ NV wd44e w< 2 /BlAlD b ` `  5   a  w  n832cd& & & B  2OΕ   N Υ$Ε  22Υ   Hv Ε f Le T* Ve*w:@)0,    *) )(   =  l 0l   0/ e&=Ba@a He0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  z, l  ~w> T JwB #  f  `* 8w()0406 l0 ** *) l0, *) $ )*)0,40,6 e6p 4 8  81416   0   ..8em,0l0!D0e6p 4.) &f  T be) .  e6p 4 08*wt 8  f**  DP5R RRR =p!Օ^> =00l&8el2 0 *141612epl2l0p,*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 006ByA3eaekf E+ &! V& T 7 @ + N ێ L Unimplemented error message-F- + + FA2MODSTART, Starting module for execution not found.%STANOTIMP, Statement not implemented.3STANOTVAL, Internal error - invalid statement code.LISTNOTLS, Group referenced in SEARCH statement is not a LIST.HLISTNOMAT, Too many expressions in SEARCH statement for referenced LIST.CLISTNOEXP, No expression in LIST for corresponding SEARCH variable.MPOISETMOD, POINTER variable is from wrong module in POINTER ... LOAD or MOVE.RPOISETGRP, POINTER variable is not from correct group in POINTER ... LOAD or MOVE.CPOISETSIZ, GROUP too small for POINTER in POINTER ... LOAD or MOVE.=NOTDYNFIL, Dynamic file operation performed on invalid group.AFILNOTEXI, Internal error - declared dynamic file does not exist.=FILNOTCTX, Operation requires that dynamic file have context.HDECAGAIN, Group in declaration already declared. Redeclaration illegal.JDEFCASELS, No match for control expression in CASE conditional definition.&DEFNOSTAK, Declaration stack overflow.8DEFSTKUND, Internal error - Declaration stack underflow.IDEFNOCONT, Attempt to access data in variable in group with null context.CEXEINVCOD, Internal error - Execution stack entry has invalid code.6MATDIFTYP, Values of differing type cannot be matched.6MATVALSIZ, Values of different size cannot be matched.@WRITEACCV, Attempt to load a value into a non-writable variable.=VARNOTDAT, Attempt to load data into a BIT or FIELD variable.0ACCUDFVAR, Attempt to access undefined variable.BAl1DATADATADATADATADATADATADATAATNOTEXI, Data declaration is longer than data.FINTVALSTK, Internal error - statement left information on value stack.?INCFORWRI, Too few FORMAT expressions in WRITE_GROUP statement.DSIGNOTASC, Parameter or message in SIGNAL-class statement not ASCII.:SIGTOOMAN, Cannot issue a SIGNAL during SIGNAL processing.ESIGTOOBIG, Message and parameters in SIGNAL-class statement too long.$CRASH, Control file requested abort.4DECGRPCTX, Group in DECODE statement has no context.?DECNOBIT, No BIT declaration corresponding to DECODE list item.;DECNOTEXT, No bit to text translation for DECODE list item.#FORNOTASC, FORMAT clause not ASCII.FORCLSNUL, FORMAT clause null.8FORINVDIR, FORMAT error - Invalid format directive code.DFORNONAME, FORMAT error - request to print a field name for a value.DFORNOARG, FORMAT error - Format directive missing required argument.9FORLINEOV, FORMAT error - Line overflow in FORMAT clause.=FORINVCHA, FORMAT error - Invalid character in FORMAT clause.CFORFIELDW, FORMAT error - Name too long for field in !DF directive.HFORINVDTY, FORMAT error - Invalid data type for output in !DP directive.JFORNOREAD, FORMAT error - Attempt to print a variable without read access.AFORFIELDS, FORMAT error - Field too narrow for variable to print.BFORINVVTY, FORMAT error - Attempt to output invalid variable type.GFORINVCHR, FORMAT error - Invalid character in string in !DP directive.@FUNDATNOT, Specified (sub)packet is not large enough for offset."SUBPKTSIZ, Illegal subpacket size.BEXEINVPOS, Internal error - INPUT file has invalid position value.PACKETSIZ, Illegal packet size."FILTOOBIG, File too large to read.CFILNOTVIR, Could not create virtual address space for module table.EFILINVMOD, Control file library has invalid module name table format.2MODNOMEM, Insufficient free memory to load module.'CONTROLFI, Could not open control file.+0,V,,,-T---0.l...8/t///&0f000(1r112X2223Z3334R4445P5556@66667 7J7778J8889V9999 :h:::*;p;;; X>>>*?r???@<@`@@@A 2COPRINVLOG, 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 f00FByA3eaekile are not allowed to span blocks.4MEMINIFAI, Memory allocation initialization failure.CMEMALLFAI, Memory allocation failure - insufficient virtual memory.+@,d,,,,$-J-r---$.^....*/^///0@0001$1B11112J25.- 0 ~ t ->: -4h  w  BlAlB b`e C  f nׁ`%7 w 7  0 - 6 reV@eeN&z ^.N&h N &Nf  e w&  xD6 BeV2 e,X6 Z F-jb` 6 LJ 6 d6   6  6    V ,  2  eV 2 e tpeV m2 eTW!6!~ j 6!˃%%wՂ  @   `e0ɐ De  @f7    7   &7 p  N& LBB: 0lw lN@&ff eeew*Ձ@&N` W5 5 Dlbe@`bm @N` |W5 5 ؀ 5 ؎ 5 z؎  ew\7   Z7 B  v7 *  7  <z f*$      BN  @ , 5 ׀   w5 ׁ N 5 |@& 5 hN` ^W5 N5 FN` f d 8 : H5 8 45 & ^ JV B- 8  2 8     e  Free Module Current Start CALL Coroutine Conditional DO ... WHILE DO ... UNTIL WHILE ... DO UNTIL ... DO ENABLE SIGNAL SIGNAL_STOP &50585@5L5Z5h5v55555Numeric String ASCII RSXtime VMStime Pointer Logical 5555556&Error occured while processing packet The packet size is (octal). BSince this size would cause the packet to span the block boundary,@the following dump of the packet will end at the block boundary.$An octal dump of the packet follows:Execution stack dump:2Module name Procedure name Entry code Offset BlockDynamic memory allocation:(Type Size Mapcnt Name Ident CompilerTable Files  Error - overlap (bytes): Dynamic files:2Module name File name Code Size Recsiz Records Title Error Value stack: Entry Type Length Place OffsetHeap Module Unknown Unknown  Size Current Max usedGeneral Statistics:Execution stack Value stack Value heap ,Maximum heap used after garbage collection: Heap garbage collections: 00NBxDl1DATADATADATADATADATADATADATAwwwaeJ" w``AE5 e5e5 eE` `AE5e5b2 f-&& -J7  $ W  W  PwCe j |AAcww` w wƲmƬewDb`ww` n  A!5BBeB!5  & ޻ 5EcA!W# eTw&wa"wa-J ^njŇ-ZJ  8J77e:f , lŒw`Ł @e  EcEc e BAAeA! * 躰 S@Bll D` N` x``C``7!f%W % Bԁ `e  fӕ'f Էӕ'ӕ,  -@˖% ׯ ׯ D <    &     7 ƇW W W  ƺew  w@<74w2m*,w(m"e *l b w   f  t‡ ~ = ~ <T|,??đ AW dSYSYTISYTICLz~̀Vhx~UML... - UNA ECO microcode load, controller %VAUML... - File access error = %D, file = %VA%VA%VAUML... - Microcode load error on controller %VAUML... - Partition UNAMC not foundN 00|DyA3eaek LB:[1,1]UNAMC.TSKqQ7 ΡXUNU'N"UNqe %@ wwwwLU{LULiUdINt hj`& T3 ֡ &# , 97  &4e6 B  !& X & & & & & Ε ׭ &*& w` ,& & & v& & & Ε ֡ ֡& & &  &֡& & & Ε &* *J֡. D  w   ť ť 0B Aaw ' UD$BA `&( U BQ @ Е*  & & @( Tf  e ee e ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& ep/& e *AHŀ ȕ Е Е Е & e6 & e"Е A %& eA Е A bEA EЕ A A   $Е.  AЕ; t    w D&& bЕ- eaePPPЕ-$w D  &Е. ce  Е:   Bhgw .*8I l*=)98  eB &&  U **e *Nlv ΋*.2 n & #!)&eP(e && >e >E 2p* w2w (DB C DBe ?D(e(e$2e (%[]%<>  1 >w ~( D b 8#"#)%ĥ ĥ wn 0 *0 @Q$    0 40 60)) Z L \# U&* =w `p!2 EW!p0p2 @ׇ#( P) 6@#**fff  &*wj. nB5(8e$8w2A&(e F4p8q  (#5=A#@))  *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ u # eB&B B z R* | eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2w 8  0,0w  w w:w& 5 ߥ& *  + 23E Ew Z   Е-   0@A W e`fÊ    E &f 82e&( ^0 0 0 80 B0 0 0 0)#0.0+1(e  %&p*w f( f)f )"(. = . B  E  (.8Ae f"( UCɗ&+(e$&% &ff **f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ 141612ep00DxDl1DATADATADATADATADATADATADATAl2l0p Mw&   f >5>Eu   e6p 4 8 X n81416      ^ f B&* D*> =00l&8el2 0 *w jeE D` bl lrw &  B eE"s    s-  CslM=f(& e %&&eH =&e0  U   E > >E=uf p  weB  8 R $&w X*<S1   K U U@  f&" B'&)'&&* *%0*ND   EU   p 8   * H 4 6 e6p 4&*&4&6= 64 wz%!64=5 2 6  l0 & Z46 R64 :)0406 0 *0e6p 4 = *) l0, *) $ )*)0,40,6 &   `@ ` B   & A @    8e2 ..8em,0l0!D0e6p 4.) &f | D Re) .  e6p 4 08*w=p!Օ^,*1 U8UMw w* B 00fep=& /e`pwZ46f %8 E D/D!D l0l8epl0pɥ.ɕ w(ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w *$ ':T U@% DD%][%><wX  w1  %,,:4 w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce D   &*w **  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ w BC "& @SY&*p0p210=E%0=w(*e "f D CB.E0,0, f 톇,, w <     .% eB U5UU plp & NeՀ)*(e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DEe    *1  ˕03 "   ˔Ӕ ʥ75%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta00DD3eaek  @ `W!ZW!AW!9W!0@ q|,KK AW d| SYf>߀|BdSY(KJ>| q  D $&Pt7 7 7 7 7 7 e @ w`w^wbw\b ` xx8wF7'7%7" 00DFl1DATADATADATADATADATADATADATA 6 $-w ~  ~U  Dw b w 1 J wl P w^5 r-5@ vw@55U50 zw4E`] .,  w 9 R C~ 0 a ~w&  z ~  uw. \׭wwPk VwB^U NEHU@BE]6$ \Z^\  w7  fwm6]5 -$-  ,Zm@ VN   5 !\XJ: F  Hw $ |:U  z   f " 7 wL3&&R  5@0 ^ 5n vt'N z eE  &f0 \B  0B BmA meA w7 p>U&& ݴ ` `hw b XV&f| | & p ` b `w   D@<877 77f <& b 5 - - 7 U5 |wB w  mA mxeA S \XHDew &f& 77 *7 (  0w `;W 8 < x`U5 CE- -F D  A  LDe@w :  e&w &f& J B  H `@ S &0, ННP H &f |m 1 5 |$!m PU &-t -nh 7 U % 5 "* E& 5`   &   `@ ` B   & A @    |,ii W LTITISYSYOVvLRV$>%tF :u~VNUqswH@4':dIqPLqX;}vvYM |(&800FD3eaek ^ 6 : 7  ^"5Vd z 4 d %  rZ ZwTfh`   W W W;W! E     P   ȕ  DR e  J W vW W  j  a( i ww7 PBX & mM=& & 7$:   7 w % V7 wL >  8 m2% A &  n 7 7 l -wN`h  Xl 0DZ L "4 w : L7  mtMp. Z mP mF7> : 2&N`  m w7   X & r V7 x m b J &N`%w`w7B %.  e 7 $   w`^ w  EE CC w E E C & E   e0А  E C    ¥  ¥ Е PɋZw |f   W K: d ^5R.T$ B8  "B w  f=& :  <3d  ZB(x  H"11 CBBl f:R B w>pbd  f`åfååå  åå X7d VMR>d d yff  7d z 4d # DD 7> 5"5,  V- d H 7P  uD 7 5"5,0 & & 7 |d D  7 n7z P 5"5, 7  w w  wd "5ym4v 5> %g  +  m  e& d  x  `E@e-BjE B`  * l  0 hL w E  $ "  & N `N   C`@   w      mE B`eEr* l% !     w,D  7,6  &{}w  )  d Cw  m( % Dww 77|w L Dm PP&@A 0@mE Е:"8 d A:w ew d H  7 A Deaw w j 7!퇲 &  .  ¥8¥9& ɋ=     00FFl1DATADATADATADATADATADATADATA& Aa~@ WtEfd 7@  AaC  5C   p WaWz f&&7 8d 7Zp *w*z   f "$d  @ 5 Be Baʥ_  H B 7d @    e aB B %E Cנ0נ7 0t` %נ:ԥ: H  e0f  fBe vRF~f& &3U#\U]R^D:`H\}bd[fO_hTz}jl5snpR9rxtTvȩsxT.z""|5{r~ϫxdociBx.L Nv:+ +{8|,{2&{8r3{0{G3{3{(+{p+{P}St!I;UfH:d*}2g@wتlzHMsRX^RF^H HK[(rrirsPrhr;tSL:dODLTr644u~DFG gJ eĊ"Bx$C &*(6l;*s,-.˪s0Aq2:D4ѫ68#:<ah >dh L@hhBlh.D(FYHѫO JѫBxLѫhNѫxPZRfTl.VFXxZZӍ\Z^`bd@fhjl@n:^CE=&D:L Net^vv""v?T8r|e쩔666Ԁ747f7&ت T| TmQqZ[M̫xQz}'&1 6&H( 6&J* 6&3 6&9 B&( B&) B&) B&1 | N&0 t &&) l &5 d &7 \ &^; T &.= L &6B D &FF < &dH 4 &P( , b'H( $ '1  'L3  '( '-  'D6 '<+ '>- 'I 'I 'LI ' M 'I ("T (S (dS (T (V (0W .(W5ew $ , Bv     5BwD 00FD3eaekU$$5  5 2  UE *&p V%$(&E U 5@*& E& & f&ËDef Ë )̋U&  m  f A N  %&ff &f  H(6&'H(t*&B&!H(*&N&.H(Z&*&&30N&f&50N&r&=0TN&~&A0|N&Z&BH( *&&SH(&*&b'V,- &&W,-&&X,-0&&Y,-&&Z,-x&&[,-,&&\,-&&`,-&'d,-&'f,-&'h,-&&'i,-t&2'j,-&>'k,-x&J'l,-&V'n,-&&oH( n'*&'t1b'z'|1Lb''1b''1b'n'H(h'*&')D'')`''H(*&'H( *&6&I''Ix''IT ''dS (*&dSD'(dS'"(dS`'.(dS` ':(ŐdS ' ( B ޗ/gPdRaI^ ݗ=Y W Tw$Q N M| |Dw 8f0  6 Aw w BA 5 7 u >wt w fff   h \l < Aw\Tj 8w BA  .D 6 . 5 7d u \Local TI: - GlobalSYSTEMGBLTerminal 7 ȥ=!7 D7 Bȥ/B $5"TIw"&* 7*N '= D <s M&C* 8 78*2:] rZ/W=* ,6* "M RJd  wH5w7 D87 rN D0Jff  Lل7b x 2 d IJw & f ׁ 55 7 w  d r7 w* ^<ImmWt ׬7^D B~DeU ԝԝ* TD~*ԔB~ " J  FX Od  @.   @ CCa* Cp&&  7 eW >ƒ  h  5_7l ƒw dA¥Z fДД | Е:&B d &f zC ^7~v@ ZAa7f^@t 7PH^ ,780F ߀7" 0 ABE`eIWt ^Ճfd @B~Immttw۷ $d 00FFl1DATADATADATADATADATADATADATA x7@ tAaR7~v@ 7h`v D$7NF\ ށw D  w 4 7 7 7 \%p7 XP P  %Y w0 f 0 U `1n1111111 V0&X? @ -$6- 3̵ 0$ #-@3 -/%.(  %e%peP0wwegf0eP( | ` wL   D *eH w 77 & U Loading Executive data spaceData space loading completedLB:=WK:/GBL Enter filename: 3zSYyIM 2 ww0*3pfCfph 1fȕ3 ww t3eV3 F R  HZ# N &  VV %f=SY7 3$37,\7^LB3 $37,\b7^\  F t3 # w&w2 6%0 7 ؎ e eط W zjf LD XӸ &l <  Rh "ӡ e   0 F eַe  -Xw  \ӷZ  d ˷˷˷ bL55 d :J J J J J J 5?   wd fw(> ַN D6"p3eEC փJ`"e?E?JM J`Dҷ w, % 7 V% H V  2n7 @ 0d , 5 Lb  4J  WK 2SF wf    L wh VX Z1\1^2 . T 6  T rh # Z` J , FRd ( "# ;   4e6  . e! * J 2 N t  t  `Z wDTSMHRSIUICb9  & Ӏib9 t/3 \0%9" Q De:NW K UW ;E¥:B UW ;<  j /u ~9 ^ z9 T*)e !"[ uW ¥,  uW ¥]> =wĝ!H &f 7.D d 0   7 b9 E C @   r  Fu`u 5`Ce 8   r l %  u`u 5` !   ~ 5^t .d 5cu v޷@V ҃ , t-t-  T!v 7 ҇BA Tu5P  ~Uu9ˋu9A B  u 5 & f   & Nv B6`N 'I 'I ' M (S (rT (dS (T "(dS ~"(V v.(dS n:(Sw  0 0,0w  >w ww 8   *  T 4 6 e6p 4&* *) l0, *) $ )*)0,40,6 0+1(e  T%&p*w. f( f)f **8Ae f"( UCɗ&+(e$&% 00FD3eaek Offline Loaded Unloaded PublicRW COM RO COM <>[]()!!++DEVICE DRIVER MAINTASK CPUSEC POOL 7 7 7Х:s p   (( w w- R (wBL  bȕ 3!f&7 r d ,&c( H( 55Y(  Q(  ZwH )^( %& H 7 7 `  w w @ w  "d -  %ww \- - (  @7-87-2 f ^Е A JЕ  Е Е (- wV(- w.{(5ke5 ( rfw ДЕ:Дlek(5@s( 46eД5@ 7 X5@ 5d\ F R (4 4  Xw4 Д D <Д5( fw r 5eД  Д2 5(5( F       w dw1  I q   Е0Е0PARITYPARTOPBOTSPEEDUICSYSUICLIBUICNETUICMAXEXTPUBBUFCHAR_LENGTHOPTPOOLSIZEPOOLPLCTLSECPOLWCHKRNDCRNDLRNDHSWPCSWPRLOGONTERMLINESHFILLVFILLTYPEAHEADCRTFORMFEEDWRAPLOWERESCSEQREMOTEABAUDBROECHOSERIALSLAVEPRIVFDXEBCHHTRPAAVOANSIBLKMODDECEDITREGISSOFTHSYNCTTSYNCPASTHRUPRINTER_PORTASR33KSR33ASR35LA30SLA30PLA36VT05BVT50VT52VT55VT61LA180SLA120LA12LA34LA38LA100LA50LN03DTC01LA210LQP03LQP02LQP01LA75LA2XXVT100VT101VT102VT105VT125VT131VT132PC3XXVT2XXDEVSYSCPUPOOLNEARELEVCSCANODDEVENDBDDDFDKDLDMDPDRDSDUEM     @  @    !"#$ HBHBHBPBPBBHP PPPBB0BBB0B0PB0BB0B0B0B0B0PB0PBPPPPPPPPP  +[05075110134.515020030060012001800240048009600EXTAEXTB5075110134.51503006001200180020002400360048007200960005075110134.515030060012001800200024004800720096001920038400ABCDEFHJKLMNPRST/AFF=:<233:44.4&44>B=566R;;=Z><>>>\?\?l>9L58"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"77 t!/NO , 5 b|.1ы ɋwC Pu w>u TXww :U%ȥ*  0 U }:zȥ*  pUn e:f.  Y.  a ^56H%1 ] G= . #%=%9 44 . l f R. 5@  `v L  7 ,wzuvwl:2,7 ( #C U%¥: ȥ- ȥ+ ȥ*  e Xw w ~ x{ "x¥A¥Zi[o W m Dj,c W aD_]Y- - Vl & Q D78N @ه 7:4C %VTw0-  w  5!1 7\e ؇ C h%VTnw  `C 6%VT R5 %ׇw p؇*5 2C %VT /5w0 F -"5  r5%%wz ؇w w @ =C p%VT 5w -5  !  . 7U8E jׇwr 4C %VT 5)w( DmEm5@E Հ.L ȥ: \.ŀ ևw w\C b%VT wl 5wN%rw26 e.e%/g%,/%$/7mp @d %,/%(/7 ʷ   C S%/ % /  f <և  d 5 f5@ b% /0H5@ :0: 4 0. IAF BU J :/A= xBȥ 500FFl1DATADATADATADATADATADATADATA E CA  %7 Dɷ @5 э4awl b C %VT w>5 Շ r6 e.B B C C 03Cd Pd ԇ ȸC r%VT wE5 &ͣ ȥ0ȥ9  %t/ M%v/- ы ɋ &wErt//!F+E EEE WU & ee/ 4\&0U E55*u& Ӈb _C |%VTw- w 5I5 H5@ D05@ :0 0 ; 43 #¥:  )  AA5@  P77Ѫ 2Ӈ bw"C %VTw5EU@ E E@ :ц 2 . r҇ U ҇ Z!ȥ*, R p  fe? `$ J!  wj ȥ*  5Z %5H% C tՆBe? < w DB Cmmݮ d 7 n- t  NCM@`wJLl t @ P; n7 wZ CleEP 5BwPb"C %VTw5@5. $  Їw 5wd5C *%VTw5 wl <-^  TЇD5rId h,B D D$  Х:   Z,sd   !!M%W#TM%W%T%  χ5ww R5@D5 8EUTj \χ(5| * 5bW wf* χ5:+5 "V Lj d &= 5A-AW >u05 7u4u&5 +w"5@$ z Jd , W uW M \·5@zwFww їK W   ʋw " l d W  K: d ,@^ w:ٸ B( v"11 CBBl fh˷ :B3  XK Ps @ $ҋʋ  7 VХ[+ J ¥CХP! 81ɋB1 B P¥,¥] ¥UХB "w tȂwʷ ^ 0 wvʷ Hd mew\r ,% & w:ʷR V &f& v  ^'I V'LI N' M F'I > (S 6 (rTLB )() )LB0:*/ 7 $/ 7N( nsȕ lnkȕ \fc_)$) PB ((T(z( $3 &:97H7J7Br7Dn7Fj(#)7w 7wP@!** #$" vw 37 \d wv F%LB-T *7ww* )( wx00FD3eaek%bT ffe ~w RN P05@0^!,*0 80,eI ! ` Z&1 f&1 r&D1 ~&0 (S "(dS |"(V t:(S l:(lTB11F12K1B2O12S12W12[143_12c12i12m13q1H4u12z12~121212121212PRITASKUICCKPPARPMDINCSLVROPARRONPROAFFSYNCIOPSECXHRCLIWBFMAPDFBABCDEFHJKLMNPRST.d U@5f5^U, / 0 A   wnwp PwW wb./. $ Tw2 zL[w wwW w,~ wwW }]qUf8UZ2@=:U B4U6@. U@$U "@UU@U. TӗYN'ЋUE.. & e w5%U% :wU.7 \7 Z/PХ[B+¥]¥,#¥R5¥W6¥E7¥D8¥*U Mw M]7 7 7 7 7 EE E@E \十7 Х[% #¥C ХP x1ɋB1 B P$¥,¥]w¥UХB 'LI (S,0, 07e `wa www* >*6 Pe2. , // !5@w t z1*!,-.01O  2U w^57 (z e>~!e*& we e 57rU L5@ 5d5\5R5J 5 n\  E : k7 " x  B 5 V5 LQJ7< d ww" 4 --"!-x"o!B$r BڃՃ  5 @ 5 +wX7 TF7<>8, -(0-"*wP, 5w 75@( T55@U@55 5 U%|lwA  57~5@  t 5 h5`wfmX'mT$5r% 75\ 0$5 U 7 5@5U wwwwww5 A A A 55W W wB 05?-w  m"eE A A A B 5 b B 5Z 5\^  w:5 ?D   lB 5 8 5\ U  [ wU@ E@5 +w5 U5U~55w5 NU/55xc5 f 5^[5@~  " R5@lNPf F5? 5*5@"5$5 54weU5 5 et`N` ַ%4wwE@w`w`55@55tU\n: .2&">\R //U5@4 5 ,U/%%| %K 5U/5@w<, L  lwwTU7 `  eE wvw` w6wNw\w^ wd5 X@ 6l5 8&m>42# N  00FFl1DATADATADATADATADATADATADATA  L d A U75 8*e?E?      ww`707l001/1/lTw|wzU fm7 |w T wNeHEB >w7 7 l&>W5* 7z( 5 U t877 ӷY7 w.. 5 `U (7x7 pӷ 7 wwXw@7 7~ "erEl7lf&N N m@&N N &N N ew$ 0wFU   e/  e l/  Zу5-/0 U@0 0  V0 $0"0#*/ h  x|mzH 0 $$  47rN  , 7 "6 $ D eeEe,w  Bf 7  www:/e5   w7  e 0* @ pw0N & w]$ b\A,, wB5E,: $w55:w5 f 5  :f 7  w5F 5ABE 7w  w  ,w v5 T Tw^  5$6!7:;4< c Uf6J Ƃ w\ġ A A A A A A < 6 TB 5T  B P r dU5E A A A A E   E w2 5e 6T @E? L?E 20 W r  r 7 zd @777ڠ n -!-"!-N"E!B$H^ ΃Ƀ  @ 16 2 z (SQ|0~WR|K,f|j q|lx|F4|vR)|xz_Mzx||Z|nQ|p,0ea T7T*&D#Fvr 1 \W#OV5Z&T%C0 ȕ:0 50C(> T T  U%   ) 0w^e  T. L( D" <% 6 .*0 h7 7  2g77d */2  7dw| nX  77>T ۷7,B 4=B %7^7d  82 :/ 7w &    w5/  4؇&d /2 e 2"2# 7Pwh Zڀ7e 7eU7 .7 ,5Z 7e,7 e@5>1 /5. 1 /1/mx/1 /1 / *&" d   ~Aw p w zBAwdx N5 ~><0 # 2!e% U" 5b  6 (/z U n7w هW!. ,0eI >f 5? wL&d /2 e U2"2# 7rw |؀ >& 7F\ d D  37*շ$:  7|* @7P 7Է d  e:/$~ 7  ' M  (S00FD3eaek//& ((EU5  A A A EpPE5U@U""N 5 5U2 "0 $0"0#*/>rp  /e $C7Lz ? `e   &P ,7d */4  7, d /4 e  7 ۇ' w (S"S ((( (zKƅ07 8 v_5}5 w2f @ w Zf 0( *$ww  VNd 2<R SS"K! SSKwvwr7\ Ce ( ,%505s-&  (IwPQ"I!?MwV(H"` 0`" @$f&7 5w<f(ww0w2&w(@& lAwh( C  t @B Bm7!`+7\RmD7 > 2*, m"7H( $ w `((  J((7)1.d ( ( (e1lI P( 1lI bPPPP L #wH!** D D D D D D V#6  ld P( j  BE@&  e X * m( d @@ .e@@ elw feD  d w5w5xU| w,wrwn )q- )q-)Q$t R Aa M zA!RN\r , Aa%<  L . ) $0d B Bm-'m ^ w Bew wn?w< 6 fb XӜ r E5Ew 5 U5U5"5#w22T( .5Wtw7  ww w7&4 :4m::< e>`t$wJ4 566fet 4 8565</ e?Wtt@7mt7e48d e<5  B 5r Z  5tm@d  7 n\( w \ *d @ <PrU5nU5@"&7  &w 5 55   7J ` R:P w 4ݷ 55  !E mX7w ݵ52 <7 ܵ5 RЖ f5 e5,5.&U   @ 0Ӏ & wZ7 8t(  ȕ:t( !4 j !4 ^ !4 N !4 @ d  d d Pٷ .d e6zۇ0  X2R7xpٷ ܷ"S Z55T5 25w0dwlw"dw!\@$w& ` 5w>7 w w@A @m7*5} 0^55  00FFl1DATADATADATADATADATADATADATA {<5t)nkd 25 `e7lw 2e<25, 2?& 6 -5X  z Е:7 w   ȕ   Е.  . %$B w"#*( 4 245ea vUqv'Oqrz~Z 7 7 & $wʀ X¥/ z7  \7r75t75v7 wW 'ȥ/  fz7 a<7^\75Y wN 7Bw| LD7j :    R  f& V  d v d uu 5 5e5 e Ud 7 D- 5w wf D-  T߈ Xfxߎ HN L\ 2N RJ 4N \  5   fp0 uD-w E55!&@!7d BA @ `fE@ #޸ rD-  F5 -0ƚ-*ƔwdBC 5w*5w0 B-: P Bww w   D& 2 u-,. 6 C fC v 5 EU ѷݰ jѵ B+ \Ȁ 7p @A BXn ( x&5 ,.e,. >чAM  wQ|0|K,f|j q|l~WRx|F4|vR)|xz_MzZ|nQ|p vwzwNwPwPf  5( @5!5  & * bZp >H^ f,5  k  & ` е d Z B ϵ :< -l-he7 5 7 : : e?E? wwDM] N w-Q-| *wB ΁ d 7, -    Dw<7d f: CӃ ں t ' w@5fB r HB- n  4ŀ * "W Jη4J 5J Gw-C$ uAwX D-H@ uAw D-  u EU F: 2br zwd\r @  Nͱfff Cf :[7d( @- RT 5155 -- C%  ̂ B-X eF ez &wH Rw"S ABA FIXEDFILE ID:( 7 7 &   tw ȥ   `wz Jd D @57^Vl :D27@V D'5   ff|^ X%|P%J  DU w $ w-w- 7 E  f&f(& N f&fA A Е w4w"0w!,w! w"&@$7Zp *wL b w@A @m7Aw@j* 4  5w5AB  *BpppA)~@ e1lI @j pA ^A VЕ B BЕ 5+Е <R V- w & A A Е W cЕ W Е  Е.Е  XA  H5  0000ȕ0Е НVНSP Е:Е- :8 B B B Ee0P  (B  4Е,  &Е)A- w* 5"B w$ w~:://--JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC;; c00FD3eaek w0&   Z0w9w:¥- /;UE:FUE>FUE.FU WU US ¥- RK 0E9A̋;:8¥ ¥ 2F 7 Ǝ x7 Ft %5h%^ – j  Ƈ jw 7^t .j E P̋Е AMu 6Е-A W  PEPEPEЕ- wL  w&@ e0e0P7tEhʋ % ҋ wJ7~ N@7h >-f &7>T ō @ 'I 'LI ~'L v' M n'I f (S ^ (rT V(V N(0W F:(S P   w d 5  w wzBOOTDENS@)p)) - * NK:$5 !+  +ע/( 7 d7 \  |(ы ɋע wx +ӕ VM =N( < 6݇: %DX%DY  W   ע0ӥ9רAӥZ+DD,,MM,,PP ,,MS,,CTȊ,,DT,,MT,,DU,-MU,,DX,,DY,,) )+$%DYvPH ) %DXR%DYJB)e-6$wC %MM%MUU׭ wd    @  h .(  !pp  !p!  -z! )<`, 5V7t7 *  ]) t+F   2d  !:0  L '@ wZJ  T7F|+- 1x+-Kw &,- &,- &,- &,- &,- &,- &,- &,- '.- z'.- r',- j&',- b2',- Z>',- RJ',- JV',- B'I : (S 2(T *(V7w +J--@ eDɕɋ Sɵ    z   A0 e! z _ e W!D 4 @ a   U_7w +J--@Dɕɋ Sɵ   d  bV '  e eW! , @ a   U_7$w F-+ A0 e! z _ e W!D 4 @ a   U  e  (11 50Uɕɋ Eɕ5W,ɋ eɕ_00GFl1DATADATADATADATADATADATADATA7tw F-+V '  e eW! , @ a   U 11 Uɕɋ Eɕ5W,ɋ ɕ_7ljw F-+Nxɋ Ue> S  $  2!e   !     W! eee A0 e! z _ e W!D 4 @ a   U_7 w F-+xɋ Ue8 S  $ !e   !    W! eeV '  e eW! , @ a   U_7FRԾԆw +l-l/0~012 7w5#SMA#UMw 9U Pɋ R`5P 5 MeP7 JNe<7 >eCɋ.*7 ($ ɋ DE%%  UWE%Pm  E e4m  f E   6U T ~z 90 e! z> w8 _ e w!"D  @  2 a   U 9U Pɋ _2 a   U B B B B B D B D 77e<eeQCɋ7 7  ɋ DE%%  UjWpE%PmXR N EB _2 a   UR`1 5P 5 _2 a   UQ00t@KPsP0 f E 7eeePe~ vw`w 7`w`w 7`w`w 7`P H0  V  L% <%  & !  4 4  4m t  B@_7^w +l-l//J0811 7w5#SMA#UMw 9U Pɋ R`5P 5 MeP7 JNe<7 >eCɋ.*7 ($ ɋ DE%%  UWE%Pm  E e4m  f E   6U00 GD3eaekjb T RN #: w4  e ew!  @  * a   U 9U Pɋ _* a   Ue7 eeCɋ7 7  ɋ DE%%  UWE%Pmtn j E^ " _* a   UR`1 5P 5 _* a   UQ0021B2KPsP0 f E 7eeePe~7wP H0 SK3s ~  t% d%  N !  4 4  .4m t  rp_ +`7 .d & d +JJee@fefeU7J`B!  @/  e 7&w xK+p ͇ %d H/.  E% % e w * + wze@_A  +`7 .d & d +JJee@fefeU7J`B!  @/  e 7&w xK+p ͇ %d H/.  E% % e w * + wze@_A 7Ԭw F-+7 A0 e! z _ e W!D 4 @ a   U7F P ɕ ɕ  ɕ  I  ɕ I ~I z r a( fɋ `@ VS PS  @ E :@P!  $ɋ Q$e   ~w*DaD 5_00GFl1DATADATADATADATADATADATADATA7hw F-+b7V '  e eW! , @ a   U7F P ɕ ɕ  ɕ  I  ɕ ~I tI p h a( \ɋ V@ LS FS  6 E 0@P!  ɋ Q$   w4DaD 5_7Ԡw F-+7 A0 e! z _ e W!D 4 @ a   U 5 U  7a7b D % D ``` ` U 5155 E 55q5  !mm5UU E_7lw F-+b7jV '  e eW! , @ a   U 5 U  7a7b D % D ``` ` U 5155 E 55q5  !mm5UU E_7 w F-+7 A0 e! z _ e W!D 4 @ a   UL0  KPsP7eeeZe vw`w 7`w`w 7`w`w 7`hP H0  4 ^! 4 4 4  < 4m t  _7԰w F-+d7V '  e eW! , @ a   UL0--".  KPsP7eeeZe7whP H0 SK3s 4 ! 4 4 4  d 4m t  _%T ffewFe%F1 z1 PQw"  "s  l ¥:e wp¥/]~1 [ rT N  pI FP  ?C R:1̋61 <¥,¥/  1ˋ!¤1e %EA <&1P1 \&1P1 \¥,w*1     e? w/1  ~x Pz1   Rܺ  w( w  2w w-"(w5) %* 0  w  wVnW wחA¥Zd 7f& x7  B b 7 3  $4 "- l*f Ĝe  P1  e  l t >(0 Jw6 ++00GD3eaek+%& 1)(p0 wt    *eH w77 & U\}/U}/YM/|/</t!/z//%/;@/; /;/;/;@/;%/;2/;>/;D/;K/;@Q/;W/;d/;p/;v/;}/:^/CE/=&/D:/L N/e/t^/v/v""/v?T/8r/|/e/쩔/6/6/6Ԁ/74/7f/7&/ت/T|/T/mQ/qZ/[M/̫xQ/z}/U#/00ęsySY @ @PAR=CTB=SIZE=VECABCDEFHJKLMNPRSTUVWXYZ n'd4 n'1 z'.2 '$2 'I 'LI z ("T r (S j(dS b(TXXCOM mw %5@ -Sp0 zT~F1wUF1 `^  x5J   & 7Tj $d  A-%%y  F1 wj7| \`7. 7 B DmAw C  @B Bm7!w7 Z p Fڵ u7w h eE  K *C@@  +p 3@ e@ ew  1ȝQL V w" N wF1 @w 7 L & wΡ 7  ͇w w67AwD7777`D gd.+we? fwv  Ð`w d Eed d   v!d d   7 ` eFw @d 4.+"d qPf w@4V س  oN1ww|``./  pff qff v$eΊ  e œVe p%r 2 ׷w2$ww fwR7j $@  4 ,s7ww E , Kw|e  se% "Nw %w5e h K w 7eNfԷ~ 8  TRe  T wFw2H Bew0 Ue s3 e eLz! B 0f=   x%BS wjĜx H- cĊ  BePf 5@& Nl e e ,w 78 N% % Re e w bwzT& 77 e,.+3 e$5!76e sΜ & H 7 Aaw &ew0A `wJ7b  f <@!Ke% "5see s  w7 s`N``   p% J R`5!mH߷ ^fENA% p UK pe Ίaw7DZ  >wV l+p0+ wx5w!Nw!&Na%zۂ&& | (7 &e xΒ e7 hK! eΊ e wP%lз̀|&fBm Pf @fe$ $ 2s$N$ %, K e  K 00"GFl1DATADATADATADATADATADATADATAe 5@e  %  K e  wϷ̇/  / /%(0   % 7 z(0r r  % ww<<  <<  <<<<<<<<H.& $ / /N #-@D #D(#25/ /%(0-)E< 6Х$@  % mw" 5y $% enfkL.` |. 6/-*Oj.  D%@ >P75Bp.5-v. -p#-l j . /$ ! wj  5%% 5 $ ނfe%%_  ݦ % 1 111&  Ý *PwJ` .^" p`7 7 V7 VJE 51f ˁU2 0Rd  w q%BSBffN V1 mΊ%%Imw\ r ,& fd  E:P @\ e & E <&11\&12f, $   I _  (S 2j0 2 2$XX:i177 ZewR 2 JL.Ke ."2ȝ (Ke .(0j0 0 2.# . |(0 v0j01  1)HFD7wP !* "p0 wb/  / /%(0   % 7 (0   % ww3  3  33333333H.& $ / /N #-@D #D(#25/ 00*GD3eaek/%(0-) 3 Х$@  % mw" 5y $% enfkL.` |. n/-bOj.  D%@ >P75zp.5-v. -#-  f /$ ! P75p.5-v. -#-  v /$ ! НBН? 6 |Е:Е  M& % R V <R & ,  e ` Ne)% N' M F (rTPARITY=PAR=SPEED=UIC=[SYSUIC=[LIBUIC=[NETUIC=[MAXEXT=PUB=BUF=CHAR_LENGTH=OPT=LINES=HFILL=VFILLTYPEAHEADCRTFORMFEEDWRAPLOWERESCSEQREMOTEABAUDBROECHOSERIALSLAVEPRIVFDXEBCHHTREAD PASS ALLAVOANSIBLKMODDECEDITREGISSOFTHSYNCTTSYNCPASTHRUPRINTER_PORTTERM=ASR33KSR33ASR35LA30SLA30PLA36VT05BVT50VT52VT55VT61LA180SLA120LA12LA34LA38LA100LA50LN03DTC01VT100VT101VT102VT105VT125VT131VT132PC3xxVT2xxLA210LQP03LQP02LQP01LA75LA2xxPOOL=PLCTL=SECPOL=WCHK=RNDC=RNDL=RNDH=SWPC=SWPR=CPUSEC POOLDEVSYSNEARELEVCSCAN***ODDEVENDBDDDFDKDLDMDPDRDSDUEM     @  @  &&&&&&&&& & & & &&&&&&&& & &&&&&&&&&!&"&&&#&$(((((((((((((()) ))) )$)))0)4)9)?)D)J)Q)Y)l)r)x)~))))))))))))))))))))))))* ****#*)*.*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,05075110134.515020030060012001800200024003600480072009600EXTAEXTB1920038400&201.---^.4...22|33:444455/v//0000000000000000000000000000000000000000000000000000000000000000{-l4 ۦb(#R nۊk(: Rn!t(5J\( X Q Е, @ Е]ww}( ~ N jw~(  JЕ.wb( Е75wBd d mm 5 5@ ЕNЕO ( ZPP 5Am Е:r 5f 5\ A*  (   XЕ.wp 6+  e*ed B @   Е.w2f) ~E2+ R * + Е  w 5%VTp6 e*b%&%*%* l d%*%*I 2 2 *  ߂%* )5z%  ) ,Е.%* œ E 5@  ,B,b,  x~* z* BV-  wP( L7 PA   Е:A   0000Е:5q*5m* Rw@U( E E 5@  , Е:,B, Е:B,b, nЕ:b, bw 5%VT5@  bЕNЕO RH(  $ @ *5 * v4* Nd d De? f &Е:  P  =47`#v3#1%0 (d+")"'l$"bK  Е.Е:A Е.mЕ: w -i w:* `v 0d A >Е. Е:wL.D d wr2 D C&d B :A* z Е.Е: Е.Е:A Е%w  00:GD3eaek5@5* $ H ЕNЕOI* l  5 ЕNЕO( $  d  &  [*DU*DO*` d ,g*Da*D : Е.w PPA Е: :ЕNЕOA+ Е= V  N Е:  8w0 F ӂwַ0  wַ d mew % P& wշ V LB:=WK:/GBL ::d XwF XgZ  Z7 RD- &@ 5%fJ\r ,׍%> 0F\ N"6 D, :@e ,   -DeM 6w wT FMe7* 8Ӗ% .w @<<<<<<<<<<<<&~Cva %-j  ( .J FUU&7tފ | $bx jw :޲ x @w .   MeP  7 C C 7:    e:7  - 7]:x pnmdD  2 : '<:J @z ;ed sd sd d s:d md ed ed   BE@&  e d   e D e% w $* ۇ   v7 J܈ AL wn܄ >з n Ud    mff7p0 N NmD&7 B- K-s-5$ + ' w B- N = wۚ jN7۠ Z @*  B Bm  B Bm jB-  dB- 7 Ö ]A AmW &@ @m  B  B `>  9 7 – &A / u 5M ھ Mڪ jwڐ `΍   wA#wf < $ B-  $B Aw@ A AmB  B  7l, ͡ @@m f&, xV  d  d uu 5 5e5 e Ud 7bx 2D- 5w wf D-  T&< f~, N  N  N \  5  : ٸ uD-w p E55!&@!7jd :BA @ `fE@ #@V D-  &f& v  j'L b' M Z'I R (S J (rT B(V :(0W&   `@ ` B   & A @    00BGFl1DATADATADATADATADATADATADATA H(7wwL( )( w"S *+* * N&  R JJ|B  uw06w>w"6w!.@$w&^t .5w7BX w4 J w@A @m7*3 z2 0 ^w* f' % * |57 wշ wr *f $> #*(Hw 0*+   *)ڇ"d * e7lw d(@*p v5!< e>% @*ea Hd(5|rf(@*w0 j  Bw d%TI[w ؗ=P jwf| 6%TID%TT%NL? 6d 74J @7 " -2B!7 5! B  7 q ߇C DEFGw  (S :(S w  ť ť 0B Aaw ܄(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$ & & @( f  e ee e ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA Z C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& e/& e*AHŀ ȕ Е Е Е & eb & eNЕ A %& e"A Е A bEA EЕ A A   $Е.  AЕ;    w D&& bЕ- eaePPPЕ-$w D  &Е. ce  Е:   B 5 ߥ& *  + 23E Ew ؅   Е-   0@A W e`fÊ    E w 5 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f  x P aAAf@pnp C*8֋ 888*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ ŀajTI& af* n*`V @e,w jjlj 00JGD3eaekɥ@@aujk,bp Z5f fˇ ȕ F‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & |8 *JJw  8jDl@ @TeBT85l@ @( D 0eB& * & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ (dS (W (V "(dS "(V .(dS .(W :(Sw 8 B) 8C $* ) *wT*  ,ep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  8 V *`)wj C# R   D @)  6?0D)w *D   w< *) l0, *) $ )*)0,40,6 e6p 4 8 V 81416 j z  T 4 8  H**  DP5R RRR **0+1(e  @%&p*w f( f)f 8Ae f"( UCɗ&+(e$&% 141612epl2l0p,*1 U8UMw w4 B 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ w 8e2 VT ~S w  DE% Xh~SJTT & WW { TTД BeeT z? f7 fLWWܭ -X W Z >w< wBrSPfS)wVMR -- *DIAG*-*FATAL*-Illegal get command line error codeCommand syntax errorVirtual terminal errorIllegal switchTask has attached common regionsIllegal error-severity code %PCommand I/O errorIndirect file open failureIndirect command syntax errorIndirect file depth exceededI/O error on input file %XOpen failure on file %XIllegal file specificationFile %X has inconsistent dataFile %X has illegal formatIllegal functionSyntax errorDevice %2A%O: not in systemInvalid keywordInvalid UICDevice not terminalDevice not variable speed multiplexerIllegal keyword valueNonexistent memorySpace usedI/O error on output file %XWrite check not supported for devicePartition not in systemPartition already existsPartition or common region is busyUnknown main partitionNo pool spaceAlignment errorDevice not mountedFile not contiguousFile not foundIllegal device/volumeIllegal priorityNode deallocation error %P %P %P %PCommon block currently installedTask image I/O errorToo many lunsTask name already in useTask image currently installedFile not task imageSpecified partition for common blockSpecified par00RGFl1DATADATADATADATADATADATADATAtition too smallR/O partition %2R not in system, defaulting to task's Base address must be on a 4K boundryIllegal first APRNot enough APRS for task imageCannot install tasks or commons from other than LB:Common block parameter mismatch %2RCheckpoint area too smallTask and partition bases mismatchUndefined common block %2RCommon block is task partition %2RCommon block not loaded %2RLength mismatch common block %2RBase mismatch common block %2RToo many common block requestsInvalid time parameterTask or common region not in systemTask or common region already fixedTask is checkpointableTask or common region is not fixedNo lunsTI: redirect errorOld device attachedPseudo device redirect errorCircular redirect errorDevice not redirectableLUN out of rangePseudo device assignment errorLogical device not in systemI/O error on output deviceExecutive too largeTask activeTask is not multi-userAddressing extensions not supportedPartition %2R not in system, defaulting to GENLoadable driver support not in systemDriver built with wrong STB fileFile %X not a valid driver task imageIllegal driver task APR usageIllegal use of %2R partition or regionDriver already residentDriver requires running system for LOAd/UNLOAdDriver not loadedDriver cannot be UNLOAdedDevice %2A%O: is attachedCheckpoint space too small, using checkpoint fileNo checkpoint space, assuming not checkpointableReceive data or by reference list not emptyPrivileged task overmaps I/O pageKRB %4A interrupt vector %O too highKRB %4A interrupt vector %O in useLine not DZ11Invalid speedTask image virtual address overlaps common block %2RIllegal operation for saved systemSymbol %2R is undefined in file %XSymbol %2R is doubly defined by file %XIllegal value for symbol %2R in file %XInvalid record address for file %XPool link error at %P Block = %P %PCTB %2A is not supported by driver -- Not loadedDriver dispatch table is inconsistentInvalid driver data base at offset %P in file %XToo many symbols of the form %2R in file %XCannot LOAd/UNLOAd a pseudo deviceCTB %2A does not existKRB %2R not in loadable data baseKRB table of CTB %2A will not accept KRB %2RDCB table for CTB %2A is fullCTB name %2A is a duplicateData space file exceeds available space in system imageCPU partition illegal in one processor or saved systemCannot have multiple pool or CPU partitionsOperation cannot extend above first 124.K of memoryWrong CPU partition size, must be %D.K on %D. CPU systemLoadable driver larger than 4KPartition %2R not in systemCPU partition has not been createdNo ICB pool space for CPU %1ASpecified processor does not exist in system imagePartition %2R is too smallPartition %2R is not a commonTask or common is not in memoryCannot UNFIX a mapped common regionSystem image is not RSX11M-PLUSAccess to common block deniedOperation not allowed for %R partitionsTop of pool set to %O, requested amount not availableInstalled tasks or commons may no longer fit in partitionFeature not supported in system imageRequired switch missingIllegal %R specifiedIllegal or non-existant controllerIncorrect assignment of SY: or LB:Device optimization not supported for deviceDirective common(s) not installedTask not installed with external headerUser D-Space not supportedCannot FIX an I/D space taskIllegal slave attributeOptional directive common successfully loadedCannot UNFIX the directive commonNo table space for optional directive commonDirective common not contiguous with DIR11MSupervisor mode library not supportedTask not removed, CLI was not eliminatedTT redirect errorBus switch not loadedCannot install shared region with incrementFast map not supportedDeferred binding not supportedDeferred binding not overriddenCommand line too longU)U>UUUdUUUUUU V'V?VZVxVVVVVVVV#W9WLWWWsWWWWWXX!X4XHXWXmX~XXXXXXY2YWYuYYYYZ6ZZZtZZZZZ[0[O[f[[[[[[\\4\L\d\u\\\\\\]']V]|]]]]^ ^O^a^{^^^^$_F_k_____`%`M`u````aGasaaaaab6bnbbbc>c]cyccccd&dFdjdddd00ZGD3eaeke@efe~eeeef(fPfkfffffgIgogggggh"hBh 'vJ 'Jw *8I x *=)98  eB &&  U **e *Nlv ΋*.2 : & #!)&eP(e && >e >E Bp* ww t ) R 8C 8* ) *w*    ep p  އ#= EW9ť^*0 ` Ca C  = L  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  , J *` lC#    D @)  6?0D)w  ) * RwV46l0w Pn832cd& & & B  2OΕ   N Υ$Ε  22Υ   v Ε f he j* re*wV@) L*0,    J) )(   =  l 0l   4/ e&=Ba@a e0b ee@ ` Y= E8 el0  & 0 l0`p l064p 4 ep )wV%  ,  N xw" T J B # D f  `* 8w()0406 l0 **=p!Օ^ *) l0, *) $ )*)0,40,6 8Ae f"( UCɗ&+(e$&%   DP5R RRR  8   **=D * `p46 f 64/=  @) 0  8w& 46 \8 e*wP w   w  > ,,  *0+1(e  L%&p*w f( f)f z) @ 82e&( 0 0 0 80 B0 0 0 0)#0.> =00l&8el2 0 *e6p 4 8 < 81416    Z  ..8em,0l0!D0e6p 4.) &f   e) .  e6p 4 Z08*wt)"(. = . B  E D (.141612epl2l0pw v )  fU %  BA `6p 4p`4 %60 446f %8 E D/D!D l0l8epl0pɥ.ɕ w0,0, f 톇,, w L     .% r eB U5UU plp & NeՀ)* F&f D E/fC00bGFl1DATADATADATADATADATADATADATA A B f&  BeA @0  (@0 a@eA  B0 AB  zf  PC @*w eE D` bl lrw   B eE"s    s-  Csl,*1 U8UMw w* B 00fep=& /e`pwL8e2 &   `@ ` B   & A @    f&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 w ( D B 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB J L \# U&* =w `p!2 EW!p0p2 ׇ#( P) b@#**fff  ,&*wj. nB5(8e$8w2A&(e n4p8q  (#5=A#@))  *R*)@#0l C# 028 @00ĥۇAĥĊ  000 d0 @0 &*0 @ xu # eB&B B f * > eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 600jGD3eaekw/!0/ l0/!p!0 .=p0p2w D(DB C DBe ?D(e(e$2e (%[]%<>  1 >w eE D` bl lrw   B eE"s    s-  Cslf&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ w BC "& @SY&*p0p210=E%0=w(*e "f D CB.E141612epl2l0pM=f(& e %&&eH =&e0  U   E > >E=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 *e6p 4 8 81416  . T  ,*1 ,U8UMwF w NB 00fep=& /e`pwv46f %8 E D/D!D l0l8epl0pɥ.ɕ w8e2 *) l0, *) $ )*)0,40,6 eB  8 $&w p*<S1   K U U@  8f&" '&)'&&* *%0*ND  V EU   w (ww ww ww zBC "& @SY&*p0p210=E%0=w,(*e "f D CB.E   f  >5>Eu   (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w *$ ':T U@% DD%][%><w  w1  %,,:4 w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce    *w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ **0+1(e  @%&p*w f( f)f 8Ae f"( UCɗ&+(e$&% (e( 1  `(( X  >: 5 eCe00rG+Il1DATADATADATADATADATADATADATAJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DDEe    *1  ˕03 "   ˔Ӕ ʥ75%& w x&Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@|x,пЅ W AĤ;TITISYSYTICLOV~XĤ~ZH0|XXx w  2r" p&h ` " %N%R -- Invalid device%N %N%R -- Volume not mounted properly%N%N%R -- Bad volume type%N & Т  &-\rzwF  0 7 Z5@Y @Т  &-`\>wJ  0 7 ( (x p #p, A1, @  5Iآ f *,$&R%N%R -- Shadow Recording not in system%N%N%R -- Privileged command%N^p 5 .7 5# `@   >  H :5 "   E   wrx (F8p |L r l (F8p%N%R -- Illegal parse data (internal error)%NABDEFIMNOPRSTUXYZ<>{Ʀ了@IVw &`w & & &f&  ¥%   %B&ХVA * C 2~ ĥ A  Е%V P~Е Bf ~\:\74T1Hŀ ȕ ~ `Е ~Ћ~ Е Е ~\Е A N  ~ \A ~Е ~Е A A   "Е.  AЕ; ~   A EA  E 6L  - QIOQI/OHRC...001ID3eaekI/OCSRw ' UD$BA &( U BQ rЕ*  & & @( f  e ee e &3&f& v kz?TLBOPzLB ,p'Ь SHA>P  ~"2*I/O Error Code %D.QI/O Error Code %D.B ب 8&   %ZRw  & LB&a    W111 D K M ?   ,U%    vM !D  E e,@P   ^& SY&  H& SY& . 5 ,%   ) &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e w *̢$ %  Е.  e&B EC@E EG` ?L`_ T T @T~ ہ %r  E@wwe2tD h t 2&= C~` <> AA  87Rv V 5Aa@@`&f&f> Ћ >& ȥ ȥ    D ˥  𧓠Ĝa Ԥ  `ˋ ˥A˥Z  `UNKNOWN ERROR CODE =JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw 5 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 jjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *w  8jDl@ TeBT85l@ V@( D eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAn009I+Il1DATADATADATADATADATADATADATAB X/   @   RՀaeRÕweRR)K@w JD&& bЕ- eaeOPPPЕ-$w D  &Е. ce | Е:   B'&1 4h( ,t( $ j D l     \ 0          >  | tȦ5ew , Bv     5Bw$ (G5  5 2  UE \ HҹZE U 5@*& E& & f&ËDef Ë )̋U&f &ff &   `@ ` B   & A @    &  m  f A N  % (!h(\t(\(\(\(\h\`Ő #h'\L)\*ń.d3 qڱPsqڱw0 b hf @w  9`/ K* J(F(B\^ H P 8p U %N%R -- Maximum indirect command file depth exceeded%N%4S-- %VA%N%N%R -- Bad indirect command file specification%N%4S-- %VA%N%N%R -- Open error on input command file%N%4S-- %VA%N%4SFile=%2A%B:%X, %I%N%N%R -- Input error on input command file%N%4S-- %VA%N%4SFile=%2A%B:%X, %I%N %N%R -- Unknown command error%N%4S-- %VA%Naz  J  rh v  7P ee   &(F(D< 8p ~7 te%N%R -- Illegal command%N%4S-- %VA%I%VA%N%N%R -- Syntax error%N%4S-- %VA%I%VA%N7 &fw 7 7 @,q `-KacJE[ !m@  ) L R  j7j f@  &  5]U E( :&@E A 00AID3eaek ̆  E vE c  @  . &f6     8  " .$ B  8̥ZḀ90     STARTSTOPDISPLAYCONTINUEABORTTOTO@FKS\beĀ\Lā^LĂbL,Ń`LĄb LŒŖ,Œ,Œ,ŒŖ,҂j҂jv&:;!w  w |& W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C GL Q|hj*%N%R -- Start-up error%NINS $SHC/TASK=SHA/IOP=NO/RUN=REM/EST=NO%x{{НН 2%V>! s%|x 4w. *w&(%>L (F8pw (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$ %N%R -- Not a shadowed pair%N%N%R -- Catch-up in progress%Nw F /@ %1 $1,  BA@  2 2  U(H (F8p Q|6: %N%R -- Not a shadowed pair%N(%N%R -- Abort error%NABO SHAw l /,@ $1 1, AНН F%= @w *(F8p s x%S%7SUMB%5SPRIMARY%3SSECONDARY%N%S%5S%P%7S%4A%6S%4A%N F  ^8(pEC` ,Cf 6`f8Ip& `lE Е: Jf&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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  00II+Il1DATADATADATADATADATADATADATAc  c S W %ec e`s  # 3  & ˥ Z ^C eB  8 z$&w *<S1   K U U@  f&" '&)'&&* *%0*ND   EU D b (f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ w r (ww b ww T ww FBC "& @SY&*p0p210=E%0=w,(*e "f D CB.E   f  >5>Eu   (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w t *$ ':T U@% DD%][%><w  w1  %,,:4 w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce    *w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ **0+1(e  @%&p*w f( f)f 8Ae f"( UCɗ&+(e$&% (e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  DDEe    *1  ˕03 "   ˔Ӕ ʥ75%& w D&Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@ Jf B4 : 2n *w ( D 8#"#)%ĥ ĥ wt 0 *0 @Q$    0 40 60))eB 6 L \# U&* =w `p!2 EW!p0p2 bׇ#( P) @#**fff  &*wj. nB5(8e$8w2A&(e *4p8q  00QID3eaek(#5=A#@)) *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ .u R# eB&B xB  *  eBe>  # #D #=0/H#@&0 # = e0   |0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2141612epl2l0pM=f(& e %&&eH =&e0  U   E > >E=uf p  wh " f &* *   f | >5>Eu   **8Ae f"( UCɗ&+(e$&%  Mw 0+1(e  %&p*w\ f( f)f 882e&( p0 0 0 80 B0 0 0 0)#0.> =00l&8el2 0 *w h(DB C DBe ?D(e(e$2e (%[]%<>  R1 >w eE D` bl lrw |  B eE"s    s-  Cslw 0BC "& @SY&*p0p210=E%0=w(*e "f D CB.Ef&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ e6p 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  ť ť 0B Aaw ) 8C $* ) *wD*  ep p  #= EW9ť^*0 ` Ca C  = X  0* = Eե^ A e@ ߇ = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  8 V *`)w@ C#    D @)  6?0D)w 0*D n  w 5 ߥ& *  + 23E Ew    Е-   0@A W e`fÊ    E  *) l0, *) $ )*)0,40,6 **8Ae f"(00YI+Il1DATADATADATADATADATADATADATA UCɗ&+(e$&%   DP5R RRR  8  b**0+1(e  :%&p*w f( f)f e6p 4 8 < 81416 P `  : 141612epl2l0p,*1 U8UMw w( B 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ hwX8e2 w n832cd& & & B  2OΕ   N Υ$Ε  22Υ   (v Ε f Fe H* Ve*w:@)0,    F) )(   =  l 0l   0/ e&=Ba@a e0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  ,  rw> 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 w *8I h*=)98 n eB &&  U **e *Nlv ΋*.2  & #!)&eP(e && >e >E Xp* wxw |) * wJ46l0w p*eB 8 2  **w (BC "& @SY&*p0p210=E%000aI3J3eaek=w(*e "f D CB.E  f &* *8Ae f"( UCɗ&+(e$&% =D  `p46 f 64/=  @) 0  8w  46 8 e*w 0+1(e  %&p*w f( f)f 82e&( 0 0 0 80 B0 0 0 0)#0.> =00l&8el2 0 *)"(. = . B  E t (. Mw|   f >5>Eu D  141612epl2l0p *) l0, *) $ )*)0,40,6 w  )  fU b%  BA `6p 4p`4 %60 4e6p 4 88 481416     b46f %8 E D/D!D l0l8epl0pɥ.ɕ w~0,0, f 톇,, w ~     .% " eB U5UU plp & NeՀ)*w eE D` bl lrw   B eE"s    s-  Csl8e2 ..8em,0l0!D0e6p 4.) (&f |  Re) .  e6p 4 08*wT=p!Օ^,*1 &U8UMw w B 00fep=& /e`pwz_M, W n'TISYSYSYTICLz0nzVx00,7 r nd7 v,   r6 | J.:( e64 e`% Bd6ߵ4B 6 4 ڣ 5@6  vp `ߵ* 3sœE007J+Il1DATADATADATADATADATADATADATAa," 6<Cn \e6 j".r~0Ԫ̪Bjz_MP   (  wHr @>8 $we\iv& &&& D  `"(&  b&   & U  57 X5@E@ 5E 5 E~ v  ` zE\j  -nZU.f- E w Uje   & sU@je b& s5   杧6n w e  j& wp5,ee? EL( ,f) ff. X 7 7 wCn@ 7  %    ݹ%  w f*  ^ f+  Hf/ z "*  * ww :w 8P0,B  <6n \wf-  P w>e $w.-v e r TVR842. T fd`^`^ZXVTPNEL V zpn# fF *TV rw @r  @4  zf7     D* z x"f6  v   Z  P -<(&" " E6n >wHe t fH  fG wҭ v&& 8#-&& FFFf    RB Ee`%ү  D~%ү b  ҭ%ҭ *DIAG* *WARN* *ERROR* *FATAL* I/ODSW???= -- DDE-|fưfEĥЕЕ x Е Е f?d ^ P |Е.Е %  `-h7be~ A ư& & &  &ư& & & Ε )Fe pM f&P&N&L&J&H°°&^&e\&e*+ F v  f  f F v veq q"9q,4&& & 00  & & & & L& & F& Ε U)O  n<& ff& J& F& Ε00?J3J3eaek ) *eq  f  hDf  TDf  @ Hf  ,ڴ LB0:[1,6]SYSSCAN.TMP;1\ hSYSSCAN.TMP;2ֵzSY veBCrrU>p ҭ(ԯf# jf @ ^ z   b f  & & @( f  e ee e &f& v  w  ť ť 0B Aaw b' UD$BA *$&( U BQ 6 Е* ɹĺ,J`Dvٸ.a?-p]HUAB not found in listNo startup transaction foundExiting due to errorBad transaction length.%N block(s) of secondary pool may be lostTransaction not in secondary poolUAB listhead not zero on shutdownTransactions follow SABExitingOn scan file openOn scan file PUT$Error during scan file renameOn scan file closeOn scan file deleteCan't write transaction fileUndefined message number %D. at PC %P Directive error. $DSW=%P PC is just before %P FCS %3A error code = %B %Nfile: %2A%O:[%3A,%3A]%X Can't close transaction fileCan't init new blocksCan't init new blocks. I/O error = %BCan't write attributes. I/O error = %BCan't write attributesCan't open transaction file (by ID)ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw ^&& D¥%  B&ХVA C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & ev6& eb/& e*AHŀ ȕ Е Е Е & e( & eЕ A %& eA Е A bEA EЕ A A   $Е.  AЕ; f    w tD&& bЕ- eaePPPЕ-$w DD  &Е. ce J Е:   B~ 5 ߥ& *  + 23E Ew    Е-   0@A W e`fÊ    E w *8I ^*=)98  eB &&  U **e *Nlv ΋*.2 ` & #!)&eP(e 00GJ+Il1DATADATADATADATADATADATADATA&& >e >E $ p* w$w * 8B pB 6 0 B w ( D  8#"#)%ĥ ĥ wn 0 *0 @Q$    0 40 60)) r L \# U&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff  &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@)) *R*)@#0l C# 028 00ĥۇAĥĊ  000 V 0 @0 &*0 @  u  # eB&B x B \ * eBe>  # #D #=0/H#@&0 # = e0   B 0@e 6=#02/002# @#?@#040 6w /!0/ l0/!p!0 .=p0p2w ( D 8#"#)%ĥ ĥ w 0 *0 @Q$    0 40 60))eB h &*   wT . PB5(8e$8w2A&(e Z 4p8q  (#5=A#@)) *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ Tu j * 8 eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w\/!0/ l0/!p!0 .=p0p2w  n832cd& & & B  2OΕ   N Υ$Ε  22Υ   D v Ε f @ e H* Fe*w*@) *0,   ) )(   =  l 0l   4/ e&=Ba@a e0b ee@ ` Y= E8 el0  & 0 l0`p l064p 4 ep )wV% ^  , P  N Vw" ,  J B # f  `* w)0406 l0 w *&fB ~IB D  ? 5   ,*+*1,\\1,^^pBBpDDpFFeB eB  **p**0 B1 Bww w"ww  $0,0wf (46 T  )0406 0 *&f &  m  f A N  %82e&( 0 0 0 80 B0 0 0 0)#0.0+1(e  %&p*w f( f)f )"(.  = . B  E l ^(.8Ae f"( UCɗ&+(e$&% &ff ** L f 0&* 2*eB  8 .$&w *<S1   K U U@  n f&" '&)'&&* *%0*ND  ~ EU   $  141612epl2l0p xMw   f P >5>Eu X 00OJ3J3eaek e6p 4 8 X 81416 r <  b   > =00l&8el2 0 *w eE D` bl lrw z  B eE"s    s-  Cslw (DB C DBe ?D(e(e$2e (%[]%<>  ^ 1 >M=f(& e %&&eH =&e0  U   E > >E=uf p  ww nBC "& @SY&*p0p210=E%0=w*(*e "f D CB.E *) l0, *) $ )*)0,40,6 w d   nwh  ,,  *)  r..8em,0l0!D0e6p 4.) &f   e) .  e6p 4 08*wp 8   Z**  DP5R RRR =p!Օ^ 8   *  4 6 :e6p 4&*&4&6= 64 wz%!64=5 2 6  l0 & Z46 64 :)0406 0 *0e6p 4 = 0,0, f 톇,, w T     .%  eB U5UU plp & NeՀ)*&   `@ ` B   & A @    8e2 (ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w *$ ':T U@% DD%][%><w  w01  %,,:4 w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce    *w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ ,*1 U8UMw w: B 00fep=& /e`pwj46f %8 E D/D!D l0l8epl0pɥ.ɕ wf&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ =D `p46 jf 64/=  @) 0  8w4 ~46 |8 e*w &f D E/fC A B f&  BeA @0 (@0 a@eA  B0 AB  nf  DC @*(e( 1  `(( X  >: 5 eCeJĥ[ĥ<C` >00WJtJl1DATADATADATADATADATADATADATAC ҥ, ~4B *㨂 De $ $ $ >z  pDEe    *1  ˕03 "   ˔Ӕ ʥ75%& w J&Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@w F ) V  fU %  BA `6p 4p`4 %60 4 ;D$$DSK&DU$CHK ;PKW109O ;PKW10912 MOV R4,R0 ;PUT THE S.LHD QUEUE ON R0 ;PKW109= CALL @QINSB ;INSERT AT THE BEGINNING OF THE QUEUE ;GM112O/70$: POP ;RESTORE R3 AND R2 ;**-3R' BIC #C1.UMR,(R3) ;CLEAR THE UMR BITC;1; DEALLOCATE ANY UMR'S USEDD;D80$:, ADD #C.OLHD,R3 ;POINT TO THE .OLHD QUEUE" 90$: MOV (R3),R3 ;GET A PACKET! BEQ 100$ ;NONE LEFT/" BITB #IP.UMR,I.PRM+11(R3) ;IS IT USING UMRS?N# BEQ 90$ ;NO, CONTINUE.$ CLR R0 ;TELL ENDCM1 NOT TO FINISH THE I/O% PUSH ;SAVE R3V(& CALL ENDCM1 ;GO DEALLOCATE THE UMRS' POP ;RESTORE R3T( BR 90$ ;GO TRY ANOTHERE8,100$: MOV (R2),R3 ;/*Q.CST*/ ;RESTORE THE CST ;**-3-- DECB Q.RTY(R2) ;DECREMENT THE RETRY COUNT1.. BGT 110$ ;IF GT, WE STILL HAVE MORE TRIES.; ;PKW109K.; WE'VE EXHAUSTED OUR TIMEOUTS. CLEAN OUT THE QUEUES AND EXIT. ;PKW109N.; ;PKW1099. MOV (R2),R1 ;/*Q.CST*/ ;GET THE CST ADDRESS ;PKW109N.. CLR (R1) ;SET THE STATE OFFLINE ;PKW1098. ADD #C.OLHD,R1 ;POINTER TO THE C.OLHD QUEUE ;PKW109*. CALL FINIO ;FLUSH THE QUEUE ;PKW109.. MOV R4,R1 ;GET THE SCB ADDDRESS ;PKW1096. ADD #S.LHD,R1 ;POINTER TO THE S.LHD QUEUE ;PKW1098. JMP FINIO ;FLUSH THAT QUEUE TUEUE, AND EXIT ;PKW1090110$: ;**-141 MOVB #1,S.CTM(R4) ;SET A 1 SECOND TIME-OUT COUNT)2 ;RESYNCH WILL START FROM TIME-OUT.(3 TST S.BSYU(R4) ;IS THERE A BUSY UNIT4 BNE 120$ ;IF NE, YES )5 MOV R5,S.BSYU(R4) ;ELSE MAKE ONE BUSYI6 BISB #US.BSY,U.STS(R5)D7120$:N/8 ADD #C.OLHD,R3 ;POINTER TO THE C.OLHD QUEUE 69 MOV R3,R0 ;INSURE QUEUE ADDRESS SET UP FOR RSX-11M:-; .IF DF D$$DSK ;IF THIS IS THE DISK DRIVERH<;H,=; SEE IF WE'VE RE-TRYED THE OLDEST COMMAND>;T7? TST C.REDO-C.OLHD(R3) ;IS THE OLDEST CMD STILL HERE?1+@ BEQ 130$ ;IF EQ, NO, SKIP THIS SECTIONA;;B;C5C; IF WE HAVE ALREADY TRYED THE OLDEST COMMAND TWICEE0D; IT MUST BE 'FUNNY' SO COMPLETE IT AS IE.ABO.E;.;F CMP (R3),C.REDO-C.OLHD(R3) ;OLDEST AT LAST FAIL THE SAMEG ; AS OLDEST THIS TIME?H BNE 130$ ;IF NE, CONTINUE(I ;ELSE THE OLDEST HAS FAILED TWICE"J ; SO COMPLETE IT AS IE.ABOK MOV R3,R0 ;R0 IS THE QUEUE &L MOV (R0),R1 ;R1 IS THE OLDEST IOP=L CALL @QRMVA ;REMOVE THE OLDEST CMD FROM THE QUEUE ;GM1121&N ;R1 IS STILL IOP ADDRESS ;**-1/O MOV S.QST(R4),R2 ;R2,R3 DESTROYED BY $QRMVATP ;FOR ENDCOM:C,Q MOV I.UCB(R1),R5 ; R5 = THE UCB ADDRESSR ; R4 = THE SCB ADDRESS"S MOV R1,R3 ; R3 = IOP ADDRESST CLR R1 ; R1 = BYTE COUNT&U MOV #IE.ABO&377,R0 ; R0 = #IE.ABO V CALL ENDCM1 ;FINISH THE IOPW;EAX; ADD C.OLHD QUEUE TO C.REQU AND REMEMBER OLDEST FAILED COMMANDUY;Z2[130$: MOV (R2),R3 ;/*Q.CST*/ ;GET THE CST BACK8\ MOV C.OLHD(R3),C.REDO(R3) ;REMEMBER OLDEST FAILED CMD!] MOV R3,R0 ;PUT THE CST IN R0S-^ ADD #C.OLHD,R0 ;R0 POINTS TO C.OLHD QUEUE ._ TST (R0) ;IS THERE ANYTHING IN THE QUEUE? ` BEQ 150$ ;NO, JUST CONTINUE00tJ3J3eaeka MOV (R2),R1 ;/*Q.CST*/ 3b ADD #C.REQU,R1 ;R1 IS THE ADDRESS OF THE C.REQUM1c PUSH <(R1)> ;SAVE THE ADDRESS OF THE FIRST P .d BNE 140$ ;WAS THERE ANYTHING IN THE QUEUE4e MOV 2(R0),2(R1) ;NO, COPY THE LAST PACKET POINTE4f140$: MOV (R0),(R1) ;COPY THE POINTER FROM C.OLHD!g CLR (R0) ;QUEUE IS NOW EMPTYR2h PUSH <2(R0)> ;SAVE THE LAST PACKET IN THE C.O1i MOV R0,2(R0) ;FINISH SETTING UP THE EMPTY QUE.j POP ;GET BACK THE ADDRESS OF THE LAS*k POP <(R0)> ;FIRST IN QUEUE NOW ON ENDlAm150$: BIS #C1.REC!C1.R1!C1.R2,(R3) ;INDICATE WE ARE IN RECOVERYMn"o .IFF ;D$$DSK ;THIS IS FOR TAPEp/q MOV R0,R1 ;MOVE THE C.OLHD POINTER TO R1 FE0r CALL FINIO ;FINISH ALL I/O IN C.OLHD AS IE.ss .IFTF ;D$$DSK ;PKW109Ou ;**-1 9v PUSH <#SCUCB> ;PUSH ADDRESS OF COROUTINE TO SCAN UCBS w160$: CALL @(SP)+ ;GET A UCBx BCS 190$ ;NONE LEFTyy .IFT ;D$$DSK ;PKW109| ;**-2 ;} BIT #UU.RDY,U.UTIL(R5) ;WAS THE UNIT IN THE READY STATE?D!~ BEQ 180$ ;NOPE, KEEP LOOKINGR. BITB #US.OFL,U.ST2(R5) ;IS THE UNIT ONLINE?) BNE 180$ ;NO, THEN DON'T BRING IT UP,4 BISB #US.SPU,U.STS(R5) ;SET SPIN UP BIT ;**-8170$:  .ENDC ;D$$DSK? .IIF DF T$$APE BISB #US.PWF,U.STS(R5) ;SET THE POWERFAIL BITP;180$: BIC #^C,U.UTIL(R5) ;JJM350$4 CLR U.CNT(R5) ;U.CNT USED FOR RETRY COUNT ;**-1  BR 160$ ;GO GET ANOTHER ONE190$: RETURN .PAGE' .SBTTL CLASUP - CLASS SET UP ROUTINEA;+.; - CLASUP - CLASS SET UP ROUTINE ;**-1;.@; THIS ROUTINE WILL MAKE SURE THAT THE COMMON IS IN MEMORY AND;; PROPERLY SET UP. THE FOLLOWING FUNCTIONS ARE PERFORMED:;;3; 1. DETERMINE WHICH PORT THE CONTROLLER IS USINGB'; 2. MAKE SURE THE PORT IS IN MEMORY.PA; 3. IF PORT IS NOT PRESENT, TRY TO LOAD IT. IF THAT FAILS, THEC9; DRIVER MUST BE DISABLED AND SEND MESSAGE VIA TKTN.$1; 4. IF PORT IS PRESENT, FILL IN S.PBIA IN SCB.E; 5. THE PORT MUST BES ; - FIXEDA; - NON SHUFFLABLE#; - NON REMOVABLE (BUMP P.RMCT); - NOT TOUCHABLEA;R ; INPUTS; ; R4 = SCB ADDRESS; R1 = VIRTUAL CIRCUIT IDG;T ; OUTPUTSO;;; ALL REG ARE PRESERVED'; C=0 SUCCESS, COMMON LOADED PROPERLYM+; C=1 FAILURE, COMMON NOT LOADED PROPERLYO#; S.PBIA IN SCB WITH BIAS OF PORT ;-CLASUP: ;**-1# CALL SAVREG ;SAVE REGISTERS 0-3 0 MOV S.PORT(R4),RADNAM ;GET RAD50 NAME OF PORT% MOV #RADNAM,R3 ;NAME TO SEARCH FOR 1 CALL @SRNAM ;SEARCH FOR PORT COMMON ;GM112O* ;IF FOUND, R2 IS PCB ADDRESS ;**-1 BCS 20$ ;NO COMMON1 MOV R2,COMPCB ;SAVE PCB ADDRESS OF PORT COMMONG MOV R2,R1 ;SAVE R2: BIT #PS.OUT,P.STAT(R1) ;PORT COMMON IN MEMORY ? ;**-3 BEQ 10$ ;YES0 MOVB #160.,P.PRI(R1) ;BRING IN COMMON QUICKLY2 CALL @LDREG ;BRING COMMON INTO MEMORY ;GM112. MOV COMPCB,R1 ;RESTORE PCB ADDRESS ;**-10 BR 20$ ;WE CAN'T WAIT FOR IT TO BE IN MEMORY<10$: INCB P.RMCT(R1) ;BUMP RESIDENT MAPPED TASK TASK COUNT? BIS #PS.CHK!PS.FXD!PS.NSF,P.STAT(R1);MAKE NON-CHECKPOINTABLE  ; FIXED IN MEMORY ; NON-SHUFFLEABLEE. BIS #P2.LMA,P.ST2(R1);DON'T TOUCH PARTITION= MOV P.REL(R1),S.PBIA(R4);STORE BIAS OF PORT IN SCB ;**-71 CLC ;INDICATE NO ERROR( RETURN ;SUCCESFUL RETURNB20$: MOVB #IE.PNT,@SCERR ;INDICATE PARTITION NOT THERE ;PKW109$ SEC ;INDICATE FAILURE ;**-15  RETURNI .PAGE ;**-390 .SBTTL CLASYN - CLASS SYNCHRONIZATION ROUTINE;++; **-CLASYN-CLASS SYNCHRONIZATION ROUTINE;;NE; THIS ROUTINE IS CALLED BY THE PORT DRIVER FOR ONE OF TWO REASONS:HA; HARDWARE SYNCHRONIZATION HAS COMPLETED SUCESSFULLY OR HADWAREPE; SYNCHRONIZATION HAS FAILED. IF THE SYNCHRONIZATION WAS SUCESSFUL,AG; THE CLASS DRIVER MUST ISSUE AN OP.SCC IMMEDIATELY AND PUT ALL UNITSE; INTO THEIR KNOWN STATES.;; ; INPUTS:C;N; R2=ADDRESS OF QST5; R3=ADDRESS OF CST ; R4=ADDRESS OF SCBT; R5=ADDRESS OF UCBO;I! ; 00tJJl1DATADATADATADATADATADATADATAC=1 IF SYNCHRONIZATION FAILEDS#!; C=0 IF SYNCHRONIZATION SUCEEDED ";R #; OUTPUTS:$; %; R0-R1 ARE DESTROYEDF&; R2-R5 ARE PRESERVEDA';N(;- )CLASYN:C-* BCC 10$ ;IF CC, SYNCHRONIZATION SUCCEEDEDZ., JMP CLAERR ;JUMP TO ERROR ROUTINE ;**-1-;L4.; SUCESSFUL COMPLETION OF HARDWARE SYNCHRONIZATION/;N010$:91 CLR IOPSEQ ;RESET SEQUENCE NUMBER ON CONTROLLER SYNCH2 BIS #C1.SCC,(R3) ;SCC STATE$3 CALL PIOPAL ;ALLOCATE PSEUDO-IOP84 MOV #SCCFUN,R0 ;POINT TO TABLE ENTRY FOR SCC COMMANDS:5 CALL CMDCOM ;GET A (T)MSCP PKT AND FILL IN SOME FIELDS6 ;R1 IS ADD OF PKT0#7 CLR P.HTMO(R1) ;SET HOST TIMEOUTS58 CLR P.UNIT(R1) ;RESERVED FIELD. MUST BE ZERO!!!!!C69 MOV #CF.ATN!CF.MSC!CF.THS,P.CNTF(R1);SET HOST FLAGS-: ;ALLOW ATTENTION MESSAGES,MISCELLANEOUSO+; ;ERROR LOGS,AND THIS HOSTS ERROR LOGSC@< MOVB #10.,S.ITM(R4) ;TIMEOUT OF 10 SECONDS ON THE SCC COMMAND+= CALL CMDSEN ;SEND COMMAND TO CONTROLLERT>;U?; END PACKET PROCESSINGP@;T A; INPUTS: B; R1-PTR TO END PACKETB; ;GM102P?B MOVB P.CNTI+6(R1),Q.ID(R2) ;SAVE CONTROLLER MODEL ID ;GM102HB ;JJM350EB .IF DF,T$$APE ;JJM350 BB BIC #UU.BLK,U.UTIL(R5) ;ASSUME MULTI DENSITY DEVICE ;JJM350DB MOV #SNGDEN,R3 ;ADDRESS OF SPECIAL DRIVE/CONTROLLERS ;JJM3500B14$: TSTB (R3) ;END OF TABLE? ;JJM3501B BLT 17$ ;YES. USE THE DEFAULT ;JJM350ABB CMPB (R3)+,Q.ID(R2) ;IS IT A SPECIAL CONTROLLER? ;JJM3506B BNE 14$ ;NO. LOOK AT ANOTHER ENTRY ;JJM350DB BIS #UU.BLK,U.UTIL(R5) ;YES. MARK IT AS SINGLE DENSITY ;JJM350(B17$: ;REFERENCE LABEL ;JJM350B .ENDC ;T$$APE ;JJM3505B ;JJM350U;B MOV (R2),R3 ;/*Q.CST*/ GET THE CST ADDRESS BACK ;GM102N3D MOV P.STS(R1),R0 ;GET STATUS/EVENT CODE ;**-131E BIC #^C,R0 ;CLEAR ALL BUT STATUS/EVENT0!H BEQ 20$ ;IF EQ, YES ;**-2EI; J; SYNCHRONIZATION HAS FAILEDK; L SEC ;LOG ERRORN7M JMP CLAERR ;INDICATE ERROR. IF ANY RETRIES ARE LEFTR)N ;A RETRY WILL BE INITIATED FROM THE5O ;TIME-OUT ROUTINE P20$:6Q BIC #C1.SCC!C1.SYN,(R3) ;LEAVE FROM THE SCC AND SYN,R BIS #C1.RDY,(R3) ;AND GO TO THE RDY STATER ;PKW107 9R .IF DF D$$DSK&DUTMO ;IF PRE-DEFINED TIMEOUT ;PKW107R@R MOVB #DUTMO,S.ITM(R4) ;SET UP INITIAL TIMEOUT VALUE ;PKW107"R .IFF ;NORMAL CASE ;PKW107DR MOVB P.CTMO(R1),S.ITM(R4) ;SET-UP INITIAL TIME-OUT VALUE ;PKW107$R .ENDC ;D$$DSK&DUTMO ;PKW107V ;**-3A<W BIT #C1.CON,(R3) ;IS THIS A CON ON-LINE FOR THE CONTROLLEX BEQ 40$ ;IF EQ, NO&Y BIC #C1.CON,(R3) ;CLEAR OUT THE BITBY MOVB #IS.SUC&377,@SCERR;INDICATE SUCCESS OF CON ON_LINE ;GM112[ ;**-1 \(] MOV S.KRB(R4),R0 ;GET THE KRB ADDRESS'^ MOV K.OWN(R0),R0 ;THE THE OWNING UCBI4_ BIT #UU.SPC,U.UTIL(R0) ;IS IT THE SPECIAL ONLINE?&` BEQ 30$ ;NO, DO THE DELAYED RETURN7a BIC #UU.SPC,U.UTIL(R0) ;CLEAR THE SPECIAL ONLINE BIT7#b BR 40$ ;SKIP THE DELAYED RETURN7c4d30$: PUSH ;SAVE REGISTERS TO BE SAFE!e MOV S.KRB(R4),R2 ;GET KRB BACK$/f CALL @SAVSTK ;CALL EXEC ROUTINE TO INDICATEBg ;CON-ONLINE HAS FINISHED'h POP ;RESTORE REGISTERS0l40$: MOV P.CRF+2(R1),R3 ;ADD OF PIOP ;**-35m MOV #IS.SUC,R0 ;TELL ENDCOM TO DEALLOCATE THE PIOP+n PUSH <#0> ;PUSH BYTE COUNT - FOR ENDCOMO,o CALL ENDCMO ;PERFORM END PROCESSING CODE(p BIT #C1.REC,(R3) ;ARE WE IN RECOVERY?q BEQ 50$ ;NO, JUST RETURN2r MOVB #1,S.CTM(R4) ;SET A 1 SECOND TIMEOUT COUNT*s TST S.BSYU(R4) ;IS A UNIT ALREADY BUSY?t BNE 50$ ;YES, RETURN$u MOV R5,S.BSYU(R4) ;SET A BUSY UCB*v BISB #US.BSY,U.STS(R5) ;MARK IT AS BUSYv50$: RETURN ;PKW109I .PAGE ;**-192= .SBTTL CMDCOM - ALLOCATE AND FILL IN COMMON COMMAND PACKETT;+9; **-CMDCOM- ALLOCATE AND FILL IN COMMON COMMAND PACKETO;A; THIS ROUTINE ALLOCATES A COMMAND PACKET AND A RESPONSE PACKETE?; FOR THE TMSCP/MSCP COMMAND ABOUT TO BE ISSUED. BEFORE THISR@; ROUTINE IS CLALED, PKTCHK MUST H00tJ3J3eaekAVE BEEN CALLED TO DETERMINEB; IS THERE ARE ENOUGH RESOURCES TO START THE TMSCP/MSCP I/O. TO=; HAVE REACHED THIS POINT, SUFFICIENT RESOURCES MUST EXIST.R; D; ONCE THE COMMAND PACKET IS ALLOCATED, THIS ROUTINE FILLS IN SOMEC; OF THE COMMON FIELDS FOR VARIOUS ROUTINES. THE COMMAND PACKET,I<; WHEN FIRST ALLOCATED, IS ZEROED OUT BEGINNING AT TEXT+0.;M ; INPUTS:N;E:; R0=ADDRESS OF THE ENTRY IN THE FUNCTION DISPATCH TABLE; R2=ADDRESS OF QST; R3=I/O PACKET ADDRESS ; R4=ADDRESS OF SCBO; R5=ADDRESS OF UCBE;E ; OUTPUTS:;S; R0=PRESERVED*; R1=ADDRESS OF COMMAND PACKET ALLOCATED; R2-R5 ARE PRESERVEDI;?; THE FOLLOWING FIELDS ARE INITIALIZED IN THE COMMAND PACKET:SD; P.CRF = COMMAND REFERENCE (PART 1) SET TO I/O SEQ NUMBERA; P.CRF+2 = COMMAND REFERENCE (PART 2) SET TO IOP ADDRESS+1; P.UNIT = UNIT NUMBER SET TO U.UNIT(R5) +; P.OPCD = OPCODE SET TO FO.OP(R0)A!; REST OF PACKET ZEROED OUTD;- CMDCOM:D. PUSH ;SAVE POINTER TO DISPATCH ENTRY1 MOVB FO.SZ(R0),R0 ;GET SIZE OF COMMAND PACKET 4 CALLV PORT,PKTAC ;ALLOCATE/ZERO A COMMAND PACKET7 INC IOPSEQ ;UP THE SEQ NUMBER. WRAP AROUND TO ZERON9 MOV IOPSEQ,P.CRF(R1) ;IOP SEQ NUM IS FIRST CREF NUMBERS7 BIC #177760,P.CRF(R1) ;USE ONLY RIGHT MOST FOUR BITSC6 BICB #017,I.PRM+11(R3) ;CLEAR OUT CRF IN I/O PACKETC BISB P.CRF(R1),I.PRM+11(R3) ;STORE THE ACTUAL COMMAND REF NUMBER09 MOV R3,P.CRF+2(R1) ;IOP ADDRESS IS SECOND CREF NUMBERD BISB U.UNIT(R5),P.UNIT(R1) ;UNIT NUMBER (OBVIOUSLY 255 MAX) ;**-1- POP ;RESTORE DISPATCH ENTRY POINTER $ MOVB FO.OP(R0),P.OPCD(R1) ;OPCODE8 BIT #IQ.X,I.FCN(R3) ;INHIBIT ERROR RECOVERY? ;**-11 BEQ 10$ ;NO. : BIS #MD.SER!MD.SEC,P.MOD(R1) ;INHIBIT IT THEN ;PKW10510$: RETURN ;**-1T .PAGE- .SBTTL CMDDAT - PROCESS ALL DATA TRANSFERS;+.; **-CMDDAT- PROCESS DATA TRANSFER REQUESTS.;NL; THIS SECTION DOES ALL THE PROCESSING SPECIFIC TO DATA TRANSFER REQUESTS.J; THERE ARE SEPARATE ENTRY POINTS FOR DIFFERENT FUNCTIONS. ANY SPECIFICO; PROCESSING IS DONE AT EACH ENTRY POINT, AND THEN THEY ALL JOIN COMMON CODE.X=; WHEN THE ROUTINE CMDSEN IS CALLED, THE PACKET IS SENT AND N; CONTROL IS RETURNED TO CLACMD TO PROCESS ANOTHER I/O. WHEN THE END PACKETN; IS RECEIVED, CONTROL IS RETURNED TO THIS ROUTINE IMMEDIATELY FOLLOWING THE; CALL CMDSEN COMMAND.;N ; INPUTS:.;N&; R0 ADDRESS OF FUNCTION TABLE ENTRY; R2 QST ADDRESS; R3 I/O PACKET ADDRESSR; R4 SCB ADDRESS; R5 UCB ADDRESS;C ; OUTPUTS:;C; DATA TRANSFER I/O STARTEDH; R2-R5 PRESERVEDN; C; FIRST CHECK FOR ANY ERROR CONDITIONS THAT WE CAN DETECT WITHOUTCD; SENDING A COMMAND TO THE CONTROLLER. IF NO ERROR CONDITIONS ARE:; FOUND, GET AN MSCP PACKET, FILL IT IN, AND SEND IT OFF;T .IF DF D$$DSK ;IF DISKL  .ENABL LSB  CMDWDD:M< PUSH #MD.CMP!MD.ERR ;SET MODS TO WRITE DELETED DATA MARK- BR 10$ ;SKIP OVER PUSHING 0 ON THE STACK CMDWLB:  PUSH #0@10$: BIT #DV.SWL,U.CW1(R5) ;IS THE UNIT SOFTWARE WRITE LOCKED? BEQ 20$ ;NOPE, CONTINUE7 MOV #IE.WLK&377,R0 ;SET UP WRITE LOCKED STATUS CODET" BR CMDERR ;AND FINISH THE I/O CMDRLB:N  PUSH #0A20$: BITB #IO.RPB&IO.WPB,I.FCN(R3) ;IS IT READ/WRITE PHYS. BLK?,6 BNE 40$ ;YES, DON'T CHECK MAX LBN, AND SET MD.CMP ;GM100I .IF NDF DU$CHK ;BLOCK CHECKING DONE IN DUCHK IF Q OPT ;GM100T ;GM100= PUSH ;SAVE FUNCTION TABLE ADDRESS AND QST ;GM10006 MOV I.PRM+10(R3),R2 ;GET HIGH PART OF LBN ;GM1005 MOV I.PRM+12(R3),R0 ;GET LOW PART OF LBN ;GM100R> MOV I.PRM+4(R3),R1 ;GET NUMBER OF BYTES TO TRANSFER ;GM100. ADD #777,R1 ;ROUND TO NEXT BLOCK ;GM1005 ROR R1 ;CALCULATE #OF BLOCKS IN HIGH BYTE ;GM100( CLRB R1 ;CLEAR EXCESS BYTE ;GM1006 SWAB R1 ;CALCULATE # OF BLOCKS IN TRANSFER ;GM1008 ADD R1,R0 ;CALCULTE HIGHEST BLOCK NUMBER + 1 ;GM100 ADCB R2 ; ;00tJJl1DATADATADATADATADATADATADATAGM10020 BCS 25$ ;IF CS ILLEGAL BLOCK NUMBER ;GM1006 CMPB R2,U.CW2(R5) ;HIGH PART OF LBN LEGAL? ;GM100  BHI 25$ ;IF HI NO ;GM100! BLO 30$ ;IF LO YES ;GM10045 CMP R0,U.CW3(R5) ;LOW PART OF LBN LEGAL? ;GM100D) BLOS 30$ ;IF LO OR SAME YES ;GM100F25$: POP ;RESTORE QST AND FUNCTION TABLE ADDRESS ;GM1007 MOV #IE.BLK&377,R0 ;SET UP THE STATUS CODE ;GM100K# BR CMDERR ;AND EXIT ;GM100; ;GM100F30$: POP ;RESTORE QST AND FUNCTION TABLE ADDRESS ;GM100 ;GM100 .ENDC ;DU$CHK ;GM100 ;GM1001C BITB #IO.RLC&IO.WLC,I.FCN(R3);READ/WRITE CHECK FUNCTION? ;GM1000 ;PKW10650 .IF DF D$$WCK ;IF DISK WRITECHECK ;PKW106, BNE 40$ ;YES, SET THE CMP BIT ;PKW106B CMPB #IO.WLB/256.,I.FCN+1(R3);IS THIS A WRITE REQUEST? ;JJM3536 BNE 50$ ;NO. DO NOT ATTEMPT TO SET MD.CMP ;JJM353A BITB #US.WCK,U.STS(R5) ;DOES UNIT HAVE CHECK ENABLED? ;PKW106, .ENDC ;D$$WCK ;PKW106A ;PKW106& BEQ 50$ ;NO, FORGET IT ;PKW106/ 40$: BIS #MD.CMP,(SP) ;SET THE BIT ;**-19.,50$: BIT #IQ.Q,I.FCN(R3) ;HOW ABOUT IQ.Q?! BEQ CMDDAT ;NOPE, KEEP GOINGF! BIS #MD.EXP,(SP) ;SET THE BIT;  BR CMDDAT  .DSABL LSBE .IFF ;D$$DSK - IF TAPE  CMDWLB:F* PUSH #MD.CSE ;CLEAR SERIOUS EXCEPTION; CMP I.PRM+4(R3),#14 ;ENOUGH BYTES FOR A WRITE FUNCTION?T BHIS 10$ ;IF HI YES/ MOV #IE.SPC,R0 ;SET UP BAD PARAMETERS ERRORW BR CMDERR ;AND EXIT?10$: BIT #M.SWL,U.CW2(R5) ;IS THE UNIT SOFTWARE WRITE LOCKED?D BEQ CMDDAT ;NOPE, CONTINUE.7  MOV #IE.WLK&377,R0 ;SET UP WRITE LOCKED STATUS CODEQ"! BR CMDERR ;AND FINISH THE I/O "CMDRLV:P5# PUSH #MD.REV!MD.CSE ;SET MODIFIER TO READ REVERSE.)$ BR CMDDAT ;CONTINUE WITH COMMON CODEP%9&CMDRLB: PUSH #MD.CSE ;CLEAR SERIOUS EXCEPTION ON READ )' BR CMDDAT ;CONTINUE WITH COMMON CODEI() .ENDC ;D$$DSK*&+CMDERR: TST (SP)+ ;CLEAR THE STACK, CALLR CMDXIT ;AND EXIT-0.CMDDAT: CALL CMDCOM ;GO GET A COMMAND PACKET/ BIS (SP)+,P.MOD(R1)0; 31; IF WE NEED UMRS, ALLOCATE THEM FOR THE TRANSFERI2;C35 BIT #DV.EXT,U.CW1(R5) ;DO WE NEED UMRS? ;**-2&6 BNE 50$ ;NOPE, SKIP ALL THIS STUFF6 ;PKW106E6 .IF DF M$$PRO ;PKW106T6 ;PKW106G6 BITB #IP.UMR,I.PRM+11(R3) ; HAVE WE ALREADY ALLOCATED BLOCK ;PKW106;'6 BEQ 5$ ;NO, THEN WE MUST ;PKW106;)6 MOV (R2),R0 ;POINT TO CST ;PKW106E:6 MOVB I.PRM(R3),R2 ;GET UMR WAIT BLOCK POINTER ;PKW106*6 ASL R2 ; MAKE A WORD OFFSET ;PKW106%6 ADD R2,R0 ;ADD TO CST ;PKW106A56 ADD #C.UMRW,R0 ;POINT TO UMR WAIT BLOCKS ;PKW106C+6 MOV (R0),R0 ;GET THE ADDRESS ;PKW106$76 DEC R0 ;LOW BIT FLAG WAS SET - ODD ADDRESS ;PKW106F=6 BR 32$ ;WE ALREADY HAVE BLOCK--GO PAST ALLOCATION ;PKW106M65$: ;PKW1066 .ENDC ;M$$PRO ;PKW106;6 ;PKW106N.7 PUSH ;SAVE THE COMMAND PACKET ADDRESS/8 MOV (R2),R1 ;/*Q.CST*/ ;GET THE CST ADDRESSA59 DEC C.UMCT(R1) ;DECREMENT THE UMR WAIT BLOCK COUNTF:: ADD #C.UMRW,R1 ;POINT TO THE BEGINNING OF THE WAIT BLOC6; MOV #-1,R2 ;SET COUNTER TO -1 BECAUSE WE INCREMENT+<10$: INC R2 ;INCREMENT THE INDEX COUNTERD$= TST (R1) ;IS THERE A BLOCK HERE?'> BEQ 20$ ;IF EQ NO, ALLOCATE ANOTHERV%? BIT #1,(R1)+ ;IS THE BLOCK IN USE?@ BNE 10$ ;YES, TRY ANOTHER;#A MOV -(R1),R0 ;GET THE WAIT BLOCKPB BR 30$ ;GO TO COMMON CODE <C20$: PUSH ;SAVE THE TABLE ADDRESS AND BLOCK INDEX5C MOV #UMRWTB,R1 ;SET LENGTH OF CORE BLOCK ;PKW106L+C CALL @ALOCB ;GET A WAIT BLOCK ;GM112E>F POP ;RESTORE THE BLOCK INDEX AND TABLE ADDRE ;**-2&F BCC 25$ ;WE GOT ONE,OK ;PKW109,F MOV S.QST(R4),R2 ;GET THE QST ;PKW1091F MOV (R2),R1 ;/*Q.CST*/ GET THE CST ;PKW109THF INC C.UMCT(R1) ;WE'RE NOT GOING TO USE A WAIT BLOCK AFTER ALL ;PKW109/F POP ;GET BACK COMMAND PACKET ;PKW10909F MOV #IE.NDR&377,R0 ; SET NO DYNAMIC MEMORY ;PKW109EF CLR R1 ;00tJ3J3eaek ;PKW109@F JMP @IOFIN ;COMPLETE I/O WITH NO DYNAMIC MEMORY ERROR ;GM112F ;PKW109 JF25$: .IIF DF M$$PRO MOV S.URM(R4),(R0)+ ; PUT IN UNIBUS RUN MASK ;PKW1097G MOV R0,(R1) ;PUT THE NEW BLOCK ADDRESS IN THE TABLER/H30$: INC (R1) ;SHOW THAT THE BLOCK IS IN USEC)I POP ;GET BACK THE COMMAND PACKET(EI MOVB R2,I.PRM(R3) ;SAVE UMR WAIT BLOCK INDEX IN I/O PACKET ;PKW106 MI BISB #IP.UMR,I.PRM+11(R3) ;MARK THE I/O AS HAVING A UMR WAIT BLOCK ;PKW106EKI32$: MOV I.PRM(R3),U.BUF(R5) ;SET UP FOR UMR ASSIGNMENT BLOCK .. ;PKW106TEK MOV I.PRM+2(R3),U.BUF+2(R5) ;... PROCESSING OF BUFFER ADDRE ;**-1M1L MOV I.PRM+4(R3),U.CNT(R5) ;... AND BYTE COUNT;*O MOV S.QST(R4),R2 ;GET THE QST ;**-2'P MOV (R2),R2 ;/*Q.CST*/ ;NOW THE CSTH7Q BIS #C1.UMR,(R2) ;SHOW THAT WE ARE WAITING FOR A UMRC8R MOV R0,R2 ;... AND COPY UMR WAIT BLOCK POINTER TO R20R CALL @STMP1 ;SET UP UNIBUS MAPPING ;GM112DR MOV S.PBIA(R4),@KISR6 ;MAKE SURE THE PORT IS STILL MAPPED ;GM112?R MOV S.PBIA(R4),@#KINAR6 ;KERNAL INSTRUCTION SPACE ;PKW109T,R MOV S.QST(R4),R0 ;GET THE QST ;PKW1060W MOV (R0),R0 ;/*Q.CST*/ ;NOW THE CST ;**-4.X BIC #C1.UMR,(R0) ;CLR UMR MAPPING INTERLOCK.Y ADD #10,R2 ;OFFSET TO UMR ASSIGNMENT BLOCK5Z MOV R2,R0 ;ASSIGNMENT BLOCK WHERE $MPUB1 WANTS ITR=[ PUSH ;SAVE R1 AND POINTER TO UMR ASSIGNMENT BLOCKK1[ CALL @MPUB1 ;MAP UNIBUS TO TRANSFER ;GM112IE] POP ;RESTORE POINTER TO UMR ASSIGNMENT BLOCK AND R1 ;**-1P*^ MOV S.QST(R4),R2 ;GET THE QST BACK ALSO<b50$: MOV I.PRM+2(R3),P.BUFF(R1) ;BUFFER DESCRIPTOR ;**-3*c MOV I.PRM+4(R3),P.BCNT(R1) ;BYTE COUNT2d MOVB I.PRM+10(R3),P.LBN+2(R1) ;HIGH BYTE OF LBN/e MOV I.PRM+12(R3),P.LBN(R1) ;LOW WORD OF LBN :i MOVB I.PRM+1(R3),P.BUFF+2(R1) ;BUFFER DESCRIPTOR ;**-35j BIT #DV.EXT,U.CW1(R5) ;EXTENDED MEMORY SUPPORTED?U-k BNE 60$ ;YES, NO MANIPULATION NECESSARYU)l MOV M.UMVL(R0),P.BUFF(R1) ;LO 16 BITSR-m MOVB M.UMVH(R0),P.BUFF+2(R1) ;HIGH 2 BITS*3u ASR P.BUFF+2(R1) ;SHIFT BITS 4:5 TO 0:1 ;**-70v ASR P.BUFF+2(R1) ;...w ASR P.BUFF+2(R1) ;...x ASR P.BUFF+2(R1) ;...3y BIC #^C<3>,P.BUFF+2(R1) ;CLEAR ALL BUT BITS 0:1I)z60$: PUSH <#CLACMD> ;RETURN TO CLACMD1&{ CALL CMDSEN ;SEND OFF THE PACKET|;U(}; RETURN TO THIS POINT WITH END PACKETM~; REGISTERS ARE THE SAME EXCEPT THAT R1 CONTAINS AN END PACKET INSTEAD OF AL; COMMAND PACKET;MO; NOW WE WILL FIND OUT HOW THE COMMAND FINISHED AND PUT THE STATUS CODE IN R0*; FOR ENDCOM;  .IF DF D$$DSK ;IF DISK-5 CALL ENDERR ;TRANSLATE MSCP ERROR INTO RSX ERROR/ BITB #EF.BBR,P.FLGS(R1) ;BAD BLOCK REPORTED?2 BEQ 80$ ;NOPE; H; WE'VE FOUND A BAD BLOCK. IF RCT IS NOT INSTALLED OR NOT APPLICABLE,G; WE JUST RETURN IE.BBE, BAD BLOCK ERROR. IF WE CAN USE RCT, THEN WETE; REQUEST IT TO RUN, AND PUT THE I/O PACKET IN THE BAD BLOCK QUEUE.K; RCT WILL REPLACE THE BLOCK AND THEN RETURN THE IOP TO US TO BE REISSUED ; (SEE CMDTRM);R CALL RQRCT ;GO REQUEST RCTD7 BCS 80$ ;IF CS, DON'T PUT THE I/O IN THE BBK QUEUEP;R<; PUT THE I/O PACKET IN THE BAD BLOCK QUEUE AND SET UU.RCT;6 PUSH ;SAVE THE IOP AND SHOW NO BYTE COUNT+ CLR R0 ;INDICATE NOT TO FINISH THE I/O% CALL ENDCMO ;GO CLEAN UP THE I/OR, MOV (SP),R1 ;GET THE IOP BACK ;PKW109 PUSH ;PKW109M .IIF DF D$$DSK&DU$CHK CALL REQUE ;RECONVERT THE LBN FOR QUEUE OPT. ;PKW109P4 MOV R5,R0 ;PUT UCB WHERE $QINSF WANTS IT ;**-11 ADD #U.BPKT,R0 ;ADD OFFSET TO BAD BLOCK QUEUEN6 CALL @QINSF ;PUT IT IN THE QUEUE AND EXIT ;GM112) POP ;RESTORE THEM ;**-2T  RETURNP;80$: PUSH P.BCNT(R1) ;SET BYTE COUNT FOR ENDCOM ;PKW109I ;PKW109  .IFF ;D$$DSK - IF TAPEO% MOV P.STS(R1),R0 ;GET STATUS CODEH- BIC #^C,R0 ;CLEAR UNEEDED PORTIONK CMP #ST.SUC,R0 ;SUCCESSFUL?L& BNE 70$ ;NO. DON'T RESET ANYTHING@ BIC #M.BOT!M.PEOV!M.RWD!M.SER!M.TMK!M.EOT,U.CW2(R5) ;DEFAULTS# ;ENDERR WILL DE00tJJl1DATADATADATADATADATADATADATATECT BOT, EOT 70$:5 CALL ENDERR ;SET UP STATUS TO RETURN TO THE USERG* CMP #IS.SUC&377,R0 ;WAS IT SUCCESSFUL? BNE 80$ ;NO.< BIC #M.AEOV,U.CW2(R5) ;NO LONGER AT LOGICAL EOT (TMK/TMK)<80$: PUSH ;USE ACTUAL TAPE RECORD BYTE COUNT) ;THIS IS TO MAINTAIN COMPATABILITY#" ;WITH ALL OTHER RSX DRIVERS .ENDC ;D$$DSK ;**-2F! CALLR ENDCOM ;FINISH THE I/OT .PAGE .IF DF,T$$APE ;JJM304B .SBTTL CMDEOF - PROCESS ROUTINE FOR IO.ERS, IO.EOF, AND IO.DSE;+ ;**-2;8; **-CMDEOF-PROCESS ROUTINE FOR IO.EOF, IO.ERS, IO.DSE;A@; THIS ROUTINE ISSUES THE TMSCP REQUEST FOR IO.EOF (WRITE TAPE@; MARK), FOR IO.ERS (WRITE EXTENDED RECORD GAP) AND FOR IO.DSEC; (ERASE TO END OF TAPE). IF THE DRIVE IS SOFTWARE WRITE LOCKED,TC; THE COMMAND IS NOT ISSUED AND AN ERROR IS RETURNED TO THE USER,F$; OTHERWISE THE COMMAND IS ISSUED.;C; NOTE: FOR EACH OF THESE FUNCTIONS, THE CURRENT TAPE POSITION ISSB; USED. FOR IO.DSE, THE TAPE IS REPOSITIONED TO BOT AFTER%; ERASING TO THE END OF TAPE.O; ; INPUTS:;H&; R0=ADDRESS OF FUNCTION TABLE ENTRY; R2=ADDRESS OF QST ; R3=I/O PACKET ADDRESST; R4=ADDRESS OF SCBO; R5=ADDRESS OF UCB <; U.CW2(R5), M.SWL = FLAG INDICATING SOFTWARE WRITE LOCKED;M ; OUTPUTS:;N; R0=STATUS CODE,; R1=STATUS INFORMATION (RETURNED AS ZERO); R2-R5 ARE PRESERVED ;- CMDEOF::7 BIT #M.SWL,U.CW2(R5) ;IS UNIT SOFTWARE WRITE LOCKED? % BEQ 10$ ;NO. GO SEND THE COMMANDO0 MOV #IE.WLK&377,R0 ;WRITE LOCKED STATUS CODE$ CALLR CMDXIT ;COMMON ERROR EXIT810$: BITB #US.MNT,U.STS(R5) ;IS IT MOUNTED? ;PKW1093 BEQ 20$ ;YES. OK TO DO THIS TYPE OF CMD ;**-454 MOV #IE.PRI&377,R0 ;ERROR. TAPE MUST BE MOUNTED$ CALLR CMDXIT ;COMMON ERROR EXIT=20$: CALL CMDCOM ;BUILD A SKELETON COMMAND PACKET ;PKW109T< BIS #MD.CSE,P.MOD(R1) ;SET 'CLR SER EXCEPTION' NO. ;**-4" PUSH <#CLACMD> ;RETURN ADDRESS# CALL CMDSEN ;ISSUE THE COMMAND ;NH; END PACKET PROCESSING. CONTROL RETURNS HERE WHEN THE END PACKET FORI; THIS COMMAND IS RECEIVED. AT THIS POINT, THE I/O IS EFFECTIVELY DONE G; SO IT IS NECESSARY TO SET UP THE RETURN STATUS FOR THE USER, RETURN#9; IT TO THEM, AND THEN CLEANUP FROM THE MSCP/TMSCP I/O.I;C5 CALL ENDERR ;SET UP STATUS TO RETURN TO THE USERN3 CMP R0,#IS.SUC&377 ;WAS THE COMMAND SUCCESSFUL?E$ BNE 30$ ;NO. LEAVE STATES ALONEG BIC #M.TMK!M.AEOV!M.BOT!M.RWD!M.SER!M.PEOV,U.CW2(R5) ;INDICATE STATEN30$:3 PUSH <#0> ;NO ADDITIONAL INFORMATION AVAILABLEN3 CALLR ENDCOM ;CLEANUP FOLLOWING I/O COMPLETIONP .ENDC ;T$$APEI .PAGE ;GM102N .IF DF D$$DSK ;GM102& .SBTTL CMDFMT - FORMAT ;GM102;+ ;GM102<; **-CMDFMT-PROCESS ROUTINE FOR IO.SMD (FORMAT) ;GM102; ;GM102EI; THIS ROUTINE WILL PROCESS THE IO.SMD FUNCTION FOR DISKS THAT ;GM102 %; SUPPORT FORMATTING. ;GM102V; ;GM102PL; BEFORE ISSUING THE FORMAT COMMAND IT ISSUES AVL COMMAND TO BRING ;GM102K; THE UNIT TO UNIT AVAILABLE STATE AND AFTER FORMATING BRINGS THE ;GM102..; THE UNIT BACK TO ONLINE STATE. ;GM102; ;GM1021; ;GM102-; INPUTS: ;GM102; ;GM102*;; R0=ADDRESS OF THE FUNCTION TABLE ENTRY ;GM102 "; R2=ADDRESS OF QST ;GM102&; R3=ADDRESS OF I/O PKT ;GM102"; R4=ADDRESS OF SCB ;GM102"; R5=ADDRESS OF UCB ;GM102; ;GM102I; OUTPUTS: ;GM102E; ;GM102G#; R0=RSX STATUS CODE ;GM102B; ;GM102R; ;GM102MFCMDFMT: BITB #US.FOR,U.STS(R5) ;IS THE DISK MOUNTED FOREIGN? ;GM102( BNE 2$ ;YES, THEN CONTINUE ;GM102< MOV #IE.PRI&377,R0 ;NO, THEN PRIVILEGE VIOLATION ;GM102# BR 5$ ;GO FINISH I/O ;GM102 @2$: BIT #M.SWL,U.CW2(R5) ;IS THE UNIT SFT WRITE LOCKED ;GM102( BEQ 10$ ;EQ, THEN CONTINUE ;GM1026 MOV #IE.WLK&377,R0 ;SET WRITE LOCK ST00tJ"K3eaekATUS ;GM102-5$: CALLR CMDXIT ;GO FINISH I/O ;GM102MC10$: CMPB #RQDX3,Q.ID(R2) ;IS IT AN RQDX3 CONTROLLER? ;GM102 ) BEQ 20$ ;YES, THEN CONTINUE ;GM102S3 CALLR ILEGAL ;NO, THEN IT IS ILEGAL ;GM1022;20$: BIS #UU.SER,U.UTIL(R5) ;SET THE SERIAL MODE ;GM102,, MOV Q.CST(R2),R0 ;GET THE CST ;GM1027 MOV R3,C.EXTN(R0) ;SAVE THE I/O PKT ADDRESS ;GM102 4 CALL PIOPAL ;GET A PIOP FOR AVL CMD ;GM1026 MOV #AVNFUN,R0 ;FUNCTION CODE ENTRY TO USE ;GM1022 CALL CMDCOM ;BUILD THE COMMAND PACKET ;GM102: BIS #MD.EXC,P.MOD(R1) ;SET THE EXCLUSIVE ACCESS ;GM1022 PUSH <#CLACMD> ;ADDRESS TO RETURN TO ;GM102, CALL CMDSEN ;ISSUE THE COMMAND ;GM1022 MOV #IS.SUC,R0 ;NON ZERO STATUS TO R0 ;GM102+ PUSH <#0> ;NO STATUS FOR IOSB ;GM102Q& CALL ENDCMO ;FINISH UP ;GM102+ MOV Q.CST(R2),R0 ;GET THE CST ;GM102S3 MOV C.EXTN(R0),R3 ;RESTORE IOP ADDRESS ;GM102D6 MOV #FMTFUN,R0 ;FUNCTION CODE ENTRY TO USE ;GM1022 CALL CMDCOM ;BUILD THE COMMAND PACKET ;GM102E MOV I.PRM(R3),P.FMTI+2(R1) ;FILL THE FIRST 2 BYTES OF INFO ;GM102E MOV I.PRM+2(R3),P.FMTI(R1) ;FILL THE SECOND 2 BYTES OF INFO;GM102S- PUSH <#CLACMD> ;RETURN TO CLACMD ;GM102N. CALL CMDSEN ;SEND OFF THE PACKET ;GM102; ;GM10204; RETURN TO THIS POINT WITH END PACKET ;GM102I; REGISTERS ARE THE SAME EXCEPT THAT R1 CONTAINS AN END PACKET ;GM102R-; INSTEAD OF A COMMAND PACKET. ;GM102E; ;GM102I; FIND OUT HOW THE COMMAND FINISHED AND PUT THE STATUS CODE IN ;GM102+7; R0 FOR ENDCOM AND BRING THE UNIT ONLINE. ;GM102P; ;GM102;< CALL ENDERR ;TRANSLATE MSCP STATUS TO RSX STATUS ;GM102, CMP #IS.SUC,R0 ;IS IT A SUCCESS ;GM1024 BEQ 40$ ;YES THEN BRING THE UNIT ONLINE ;GM1022 PUSH ;NEED TO USE R1, SO SAVE IT ;GM102. MOV P.STS(R1),R1 ;GET THE STATUS ;GM1028 BIC #^C,R1 ;ISOLATE THE MAJOR STATUS ;GM1020 CMP #ST.DRV,R1 ;IS IT A DRIVE ERROR ;GM102$ BNE 30$ ;NO, CONTINUE ;GM102? MOV #IE.ABO,R0 ;YES, THEN INDICATE FORMAT INCOMPLETE ;GM102L530$: POP ;RESTORE END PACKET ADDRESS ;GM102 9 BIC #UU.SER,U.UTIL(R5) ;CLEAR THE SERIAL MODE ;GM102C( PUSH <#0> ;NIL BYTE COUNT ;GM102) CALLR ENDCOM ;FINISH IT UP ;GM102-40$: PUSH <#0> ;NIL BYTE COUNT ;GM1021% CALL ENDCMO ;FINISH UP ;GM102S> BIS #UU.ONL,U.UTIL(R5) ;INDICATE AN OP.ONL REQUIRED ;GM1023 CALLR ONLSIO ;ISSUE THE ONLINE COMMAND ;GM1132 .ENDC ;D$$DSK ;GM102 .PAGE ;GM102  .IF DF,D$$DSK ;JJM304P5 .SBTTL CMDRPL - RCT BAD BLOCK REPLACEMENT ;**-1R;+ ;**-2#1; **-CMDRPL- PROCESS BLOCK REPLACEMENT REQUESTS;S6; THIS ROUTINE PROCESSES BLOCK REPLACEMENT REQUESTS.; ; INPUTS:0;+; R0 ADDRESS OF FUNCTION TABLE ENTRY; R2 QST ADDRESSU; R3 I/O PACKET ADDRESS; R4 SCB ADDRESSN; R5 UCB ADDRESSL;L ; OUTPUTS: ;L ;- CMDRPL:18x|,SS W <F/TITISYSYOV00$KJl1DATADATADATADATADATADATADATAvXFvRtXX %N%R -- Invalid device%N %N%R -- Volume not mounted properly%N%N%R -- Bad volume type%N & zN J &-]r$ wFD > 0 7. Z5@Y @z  &-\>wJ  0 7 ( ( p #p, A1, @  5IŢ K<r*$&R%N%R -- Send/Receive error%N  %[%[ %   & (88$p ʮN ʮڤ6%N%R -- System error%N%N%R -- Too many bad blocks. Volume cannot be shadowed.%N Е:7x j"BD# h¤ cj ^6 @` W777 e 7 jBD# Z 9 4gdR-~D D eR7(7$7 7  p  - 2  j  (88$p&%Y׭L eɠ1! qqw 1~ ʮ%N%R -- I/O error on logical block %T.%N%N%R -- Catch-up completed%N NȦ #\̥ euXA B6>B21   `u xvC A7 5`HeX wWpu  Xew 2e p !Nw  Pjp p A r ^ u H~  p (8Ȧ8$p&fWpu cu  f%:W%&3&f& v   Ԯ[0,0]ή'&1 @& 4 4 4µ |4Խ tX lX d5ew , Bv     5Bw 00,K"K3eaekX5  5 2  UE ( XL&E U 5@*& E& & f&ËDef Ë )̋U 5 ߥ& *  + 23E Ew Z   Е-   0@A XW e`fÊ    E &f &  m  f A N  %&ff  4( ( (@Ф@(L X(LdppL|d| 8dp"LX$(4 %N%R -- No room available for UMB%N%N%R -- Volume currently part of shadowed pair%N D\ =T 80 7 7w ' B~?1 p2 0 0 5ʴ B(88µpx twR p&<4ABDEFIMNOPRSTUXYZ<>ζܶ/EV\#;w &`w & & &f&  ¥%   %B&ХVA  C 2~  A  Е%V P~Е Bf h~Y:Y74%\1Hŀ ȕ ~ `Е ~Ћ~ Е Е ~YЕ A N  ~ YA X~Е ~Е A >A   "Е. & AЕ; X~   A EA  .E 6L  - QIOQI/OHRC...I/OCSRw r' UD$BA (&( U BQ Е*  w  ť ť 0B Aa & & @( f  e ee e kz?TLBOPzLB xI/O Error Code %D.QI/O Error Code %D.B $ 8&|   f %VNw r& LB&a  B  W111 D K . M ?   xU%    vM !D  E ex@P   & SY&  & SY& 5 x%  ` X)` &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e w rv$ %  Е.  Pe&h EC@E EG` ?L`_ T T @T~ ہ %  E@wweRD  R&= 004KJl1DATADATADATADATADATADATADATAC~` <6 AA  87xv R 5Aa@@`&f&f6 Ћ 6& ȥ ȥ    D ˥  0Ĝa Ԥ  `ˋ ˥A˥Z  `UNKNOWN ERROR CODE =JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw D&& bЕ- eaePPPЕ-$w D  &Е. ce  Е:   B&   `@ ` B   & A @    qԽPsqԽw X4 X X X dw :( D 8#"#)%ĥ ĥ wn 0 *0 @Q$    0 40 60)) L L \# dU&* =w `p!2 EW!p0p2 ׇ#( P) @#**fff  &*wj. nB5(8e$8w2A&(e 4p8q  (#5=A#@))  *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ u # eB&B LB  F*  eBe>  # #D #=0/H#@&0 # = e0   B0@e 6=#02/002# @#?@#040 6wf/!0/ l0/!p!0 .=p0p2w eE D` bl lrw f  B eE"s    s-  Csl141612epl2l0p   f | >5>Eu   **8Ae f"( UCɗ&+(e$&% 0+1(e  %&p*wj f( f)f F82e&( 0 0 0 80 B0 0 0 0)#0.> =00l&8el2 0 *e6p 4 8 81416  . T  ,*1 :U8UMwF w NB 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ w 8e2 *) l0, *) $ )*)0,40,6 w b( D V 8#"#)%ĥ ĥ w 0 *0 @Q$    0 40 60))eB &*   wT . PB5(8e$8w2A&(e 4p8q  (#5=A#@)) *R*)@#0l C# 028 Z00ĥۇAĥĊ  000 00  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6wD/!0/ l0/!p!0 .=p0p2M=f(& e %&&eH =&e0  U   E > >E=uf p  wL  f &* *w (DB C DBe ?D(e(e$2e (%[]%<>  1 > Mwf&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ w BC "& @SY&*p0p210=E%0=w(*e "f D CB.E p p |eB  8 $&w **<S1   K U U@  f&" '&)'&&* *%0*ND  * EU   w `BC "& @SY&*p0p210=E%0=w&(*e "f D CB.E(ef  Ee2 UfD Ԕ %:ԕ: f& f&f& & Ε lle  &*;7#3w *$ ':T U@% DD%][%><w  w1  %,,:4 w *D YTf(e<ӕ_ S :ӕ: & "& Ε4'& &*'&**UqqC ӥ:  Ce <   *5%& w &Ba +- ʥ# . U 0   b   `     Jĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ .z  DEe    *1  ˕03 "   ˔Ӕ ʥ7(e( 1  `((   >: 5 eCe&fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@00DKJl1DATADATADATADATADATADATADATAw *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ 5%& w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@w b*8I *=)98 eB &&  U **e *Nlv ΋*.2 2 & #!)&eP(e && >e >E p* 8wp)"(. R= . B  E (. ..8em,0l0!D0e6p 4.) n&f  e) .  e6p 4 08*wp=p!Օ^0,0, f 톇,, w      .% : eB U5UU * plp & NeՀ)*w b n832cd& & & B  2OΕ   N Υ$Ε  22Υ   hv Ε f "e $* e*wz@) *0,    n) <)(   =  l 0l   4/ e&=Ba@a te0b ee@ ` Y= E8 el0  & 0 l0`p l064p 4 ep )wV%  ,   N 2w"  J B #  f  `* \wL)0406 l0 w " n832cd& & & B  2OΕ   N Υ$Ε  22Υ   (v Ε f e * Ve*w:@)0, >   F) )(   =  l 0l   0/ e&=Ba@a Le0b ee@ ^ W= E8 el0  & 0 l0`p l064p 4 ep )wn%  ,  w>  JwB # f  `* 8w()0406 l0 **=p!Օ^ *) l0, *) $ )*)0,40,6  DP5R RRR  8   (** 8  **w   Lw   z,,  *)  >00LKPK3eaek =00l&8el2 0 *e6p 4 28 P 81416 d t  N . B..8em,0l0!D0e6p 4.) &f   e) .  e6p 4 n08*w=D  `p46 f 64/=  >@) 0  8w 46 V8 ~e*w~ J&f D E/fC A VB f&  >BeA @0 L (@0 :a@eA  B0 "AB  f  C @*141612epl2l0p,*1 U8UMw w B 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ XwH8e2 0,0, f 톇,, w      .%  eB U5UU  plp & NeՀ)*w p ) b  fU 0%  BA `6p 4p`4 %60 4)"(. = . B  E ,(.&   `@ ` B   & A @    8Ae f"( UCɗ&+(e$&% 0+1(e  %&p*w f( f)f x|,`` W ХTISYSYSYrXХrNpXXNP00TKJl1DATADATADATADATADATADATADATA%N%3Z -- on %6A%N%12S%N%12SShadow pair: %4A %4A%N%12STask: %2R%N%12SLogical block: %T.%N%12SBytes in xfer: %U.%N%12SFile ID: %O,%O%N%12SFile name: %X%N%N%12S%M. errors lost due to saturation.r7 8e " ? Cڤ~@7t 7@0b@0 X^RڤҤ$&Ƥ0 d̤V X=RRR  w`dA  w` ̤ w`0A w`Ƥ w`̤Ƥ& Ԥ" n w` ̤ zR~ 6 w`^ ~ ؤ ew`D@  ڤ vXwBw b z&uf@ &uQ$f w%6XDFDXDIw   ʋ-"h%DK7 %DS%DL ԤABC# `@`" T`@ 7twrl%$  TBEE?Wt C  w:& lE Е: w  ť ť 0B Aa&3&)_&& & &  & && && Ε@ 61& 1)ȋ& & & & & & & & & Ε  1 &  a@ w z ' UD$BA &( U BQ Е*  & & @( B f  e ee e kz?TLBOPzLB [0,0]I/O Error Code %D.QI/O Error Code %D.fB  8&l    %w & LB&a  Ȭ  W111 D K M ?   U%   j vM !D  E e@P   .& SY&  & SY& 5 %   )ABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA ( C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& e/& e*AHŀ ȕ Е Е Е & eN & e:Е A %& eA b Е A bEA EЕ A .A   $Е.  AЕ;     w D&& bЕ- eaePPPЕ-$w D  &Е. ce  Е:   B00\KfK3eaek&  m  f A N  % 5 ߥ& *  + 23E Ew Z   Е-   0@A lW e`fÊ    E &f &   `@ ` B   & A @    ||,?? QW  &[q W 2TISYSYSYTI>R0>A B C D E F H J K L M N P R S T ~*,.DLjln $&.$"pR :tr دE5 @گ&` ,1ť  ť/wrwt wm ť: 5ť/  X  ~ D Aw, N& ~w  x b,  7 R 7 F R J& C4@   '7HmxB5<76mb0 ,?!& [mFE! M Մ   rB  >,7m5m @@ EE@P5@Q7mߊ@] @ lU7.& NBw tw\ @wp A W X f7 >¤2  ,   2 2   v- wA@,A1 `   @w   Pe   nFwh @e-H    44@-5 & 5E@ ` P  T C - 4w-~x,x hЋ1B2F,e f f& Df lΊ SbDS C&N` b Mb b"Sp55w0e ! 7  wV%e "4,HX$X>XX5 L<#w ` z[= lTR  NMť=J& @F J ť/ F0 01ȕ .,XP ť/   ec~ j ť/ X w H7>7:7 "~ )  # @ wA@,A1 w|[| ܪwXwP ť Ћh,,    h1, .J $& !,  EEB!B-  ,!-  EK-s-r Z[wd7 2 W fW hW    % ȹ    % w"wܫ  ܫ  & $ , 2N #-@C #C(#F5C h%-( jХ$@ %O" 5 $% I JwwK(z  Q  * ,5   %  džr Hn  5\ $T -D -@ > , \ " P t ȹ$   P  ] E& ~w %% wAE7 A  Deaw7  7!    . *  w<77 & U < &&f DE%\  , Д  > 7 fLť  Zw,B0P$)wf)<Е[  pЕ,  bЕ]<7Xw (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA <EAa$ & & @( f  e ee e &f& v Command I/O errorFile %X not a valid driver task imagePrivileged commandI/O error on input file %XFile %X has illegal STB formatSyntax errorDevice %2A%O: not in systemPartition/region %2R not in systemDevice not mountedFile %X not contiguousOpen failure on file %XTask image I/O error in file %XPartition %2R too smallIllegal driver task APR usagePartition/region %2R is a commonDriver already residentDriver being loaded or unloadedInsufficient pool spaceLoadable driver support not in systemDriver not loadedDriver cannot be unloadedDevice %2A%O: is attached, busy, online and/or mountedInvalid driver data base at offset %P in file %XDriver built with wrong executive STB fileWarning - KRB %3A interrupt vector %O too highInsufficient ICB pool space for CPU %1AWarning - KRB %3A interrupt vector %O in useSymbol %2R is undefined in file %XSymbol %2R is doubly defined by file %XIllegal value for symbol %2R in file %XDriver dispatch table is inconsistentCTB %2A is not supported by driver -- not loadedCannot load/unload a pseudo deviceToo many symbols of the form %2R in file %XCTB %2A does not existDCB table for CTB %2A is fullKRB table of CTB %2A will not accept KRB %2RKRB %2R not in loadable data baseCTB name %2A is a duplicateWarning - loadable driver larger than 4KPartition/region %2R is not a commonKRB %4A is not offlineIllegal use of partition or region %2RPartition/region %2R already loadedPartition/region %2R cannot be loadedPartition/region %2R cannot be unloadedPartition %2R not in system, defaulting to GENȱڱ00tK M3eaek.MZvò۲1Rjȳڳ+\޴ .V~յ$;YĶ)Pt·_ ,0ęsyLB<r 4<>BZ^`bdf\}2U}4YM6|8<:t!@%Bg'D;@F; H;J;L;@N;%P;2R;>T;DV;KX;@QZ;W\;d^;p`;vb;}d+{pȹ:^ʹ=&̹D:ιL Nйeҹt^Թvֹv""عv?Tڹ8rܹ|޹e쩔666Ԁ747f7&T|TqZ[Mz}U#fUNL -- VECEXPVEC('&15ew , Bv     5Bw  /0L-@ VD- E %     U EU 5  5U  ʻ0E U *5@*& E& & f&ËDef Ë )̋U&  m  f A N  %&f &ff  , 8<$||~,>>W W  &[q W 2 TITISYSYTICLWKOVVγb  γVγ5wwf&00 MJl1DATADATADATADATADATADATADATA 7p TKB>"   @ %2>KWdp}8(ЬxhXбHgpzW ,<TDSYSYSYSYTICL^#TKB -- *FATAL*-Run aborted ZPp@ e 5 5   5~   w 5bC ŀ t tB f50  -F <5.$ r 5 wVp wV Pwf *   f&f 7J w77  `wj w^ 7,\7,T  V0 0  p@    ~ $ $fE7 4`0 Z 0 5,5,  6 u$ ^   1,1,J 1,1, &b e m 7D &8 e$$)d 5w , & A 7@m7 *1 C7 pM $ w"   7 /  *w p L7w  X`d VT efA   ^w: 7.w, ~   z& &% N  V    2 T s zew ~   A ~C*  w CB  Z54w `eC %E& 7 .Bd | wddcAcAd 7A &e Cm  &m`e` ` f`B` JP    *     `p f& `, ,, &  mV  *B ce " &e#r D (  & eB%e1be1^1\1H1J1L1N1P&&f t h eHD e<w  E  A B` 7pA wL &w E p  B ` p 7~A @ae n fe?E? & f Y :  40 B ` w f* E @ jw`RK`/ & D -N  nx  ` * d    B B  @`   B` * 2   v  m ` @ X&'&1 " % ' % @ X p     0 3 0J4 ~04 v<3 nl= fx=5ew , Bv     5Bw    00 MM3eaek5  5 2  UE   E U 5@*& E& & f&ËDef Ë )̋U&ff &f   t @0"0"p###0" #P(('P(L4+P( /L;X<LdJ|pLL< |dPHpZHp p|a<\ dph&l&o&r L x"P{(h(("LLX2$`202l<2H$5<T5<H=l=`x=`l> |($SYxQSYySY^SY~xQSY_SYzjL_LB[1,1]SYCC@VDAVLB VSMPVSSVMAWDL`VSHpSPqCR@pMA-WI pHDWPIVCOxLI xCPWDAVFP@VMMpPIVPRVSQpTRVXTpACVEA VHDWPM@VSL VMUVFUpROqALWCMVSEWIPyNMxCOxLI xSGyXHpIDpELxFMxCL xSBrFO@xt{J(&<^5b  wte w ~7 5 b$m e ˋ   ! " (wj w @pdf   :B$ĵ4ĵ!%'% %E$e@ P  7e :e 8e & ĵ V 11@ Be w ,5 funhj uhdB$ 0jwaw< 8 v8w &  0*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 Pjjlj ɥ@@aujk,bp Z5f fˇ ȕ ~‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ vDlljaCeH###33 & 8 * w  8jDl@ TeBT85l@ @( D HeB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)00 MJl1DATADATADATADATADATADATADATAK@ N$ F^# >0J58,X $L<H>AJ"?J"2"""LB[1,1]ODT.OBJODTID.OBJP.@ w RX]F4,  wA @b$r f&"d3 3 :"eB A N D\"&%5bE5 E 5U  Be r 4 3:"s ]@@MX7 T7 R&&$&! &&"e 5'Ul7\7^X&$PP `E@B (w(  7w4 P@N xw$&4 be&ew B@P@P dbbj7 d  0w*,B &&&$$ 55b ""$ (b &e5 &$7 R dw$&`9  . ` r,\NLd X |N 2BAbpd fwh `  %/ -%/*%//$`¥¥¥ ¥ ¥ef U߱eE >"&F"m    b   \ܤ7 F7 :8 f 7 D*H 2j"?xL%D 7 > < U@U: W@7 " . 6f 6wvP  w wU Fݠww^7Re @  7 E7 p7 n^R݇K w w      7 7 7 * W,( 7b 7XR ^8# | %* 7  7  f   "%A  Tr LJA d7^އ LN &އ && 9?Z dePHHJ  5@  w  e5 `b  ֆ9` &&5 bv& & j$4 b$4 Z$&4 R0 3 J0@3 B0N3 :03 `5uuuu w D " &w*H"Aq#q- $ # |#֯%1R%&߱`&&N$3n$p TKB>l^SY7 H"7 e`#  2@bp$$~0 b b@ef7` ȥ;ȋ#% % % % ¥:uu j n & W e)#I#q-'eW #$0ef` ננe נ^נ  TA5 ¥;U%E #w (w we) e)( r n'e) e)) l  $' U% ¥;¥,Q \ Pe)S#S- $ *I  %QQ *& N&1 &f JPe f  7" RRR,AC`e R?j7f% ~' f * #e`P  &,@ 3@8K@oMBaTq rt@,YeYxx@Y`Y5 0 3 x00  MM3eaek0F5 p05 h0J5X[<$09AZ (),-*! 4%$$J$$%\$$$$7 7 7 7 X7 L" P "N"" #^#$$ :#B   r00"Iz#%N"U^Z7 XO N"J8D5M5IE   $ "ͥpͥ&Հ7 -A# ~ x( N"3%2#եJ   H #7 Ewͥ#Jn# N".wȋȥ;!Z#% "9;5#H1H/H-HH)HH%u# +w "W#"W#  p##&  e)ȥ:2ȥ./ȥ[,ȥ<)ȥ/&W ! T & fAf J !"dd,wp& ȋȥ-ȥ)ȥ(ȥ* ȥ,  ȥ[ ȥ]  Z , ppp J JHA A NN>*,B $&&5 bv& r&`90 p5@ w bf 6 % e 2 $4 0 3 0@3 0F581o?y%J%,%J%L%&%%&Z''H" 0 77 5EL" P "N"@ J  > *L" %!"@5h7H7L 5NW   C 7`7# <5#   ߴ d ppp zUe Ah 6 fT R 7œEz#5U   5pppp f& fp5& Np5Ufup 47&w* v |< fwX2 5Npppp u  w   z &   B wwe@e 2 f5Be  5  D91 G@ bw e & Ne 5U e5  ! 555U-55 8u5 $uw8%* *$) ] eE BE*E  0 3 036(>(&(&(&(&(&(&(&(&(&(>(&(&(&(&(&(&(&(&(&(6(F(6(6(6(6(6(6(6(6(>(6(6(>(x%&(&(&(&(&(&(&(&(>(&(6(6(>(&(>(>(>(((6(((6(''('6(''>(6(>(&(&(6(6(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(>(>(>(6(R,6(>(>(&(&(&(6(>(>(s1"P( @,A#w  5T a$ 7 •!p b& a m ߀  w^  f X   ed7Ae 1΋ ޿  ppU@pM l%e -p  Ah " R a00 (MJl1DATADATADATADATADATADATADATA @ w b vw X l . r7"7,9Z7EA3"3,'5@5E-X  #  B`  E   e3#3-  Nޱw &D$%% &5 w T& ݷ  J7w  j &  #% v F n<- f$. ^(( V(( N(, F(- >4( 64- .4. &$H3 $3 $3 $2 $(3 $3 0 3 05 05 05 0J5 0:5Sw  e wwZۇz@$  "7$l7d  e p?7 PAPАP 0wR&ww@ jwhW# w*ۇTw5Z7 7 7 $e EM M M Mw ۇ e  ?7 (PPP v$l$ee^A^ P jppp^ p"   rڿ   Z p R :w8& wwڇ5 8mwXVwPwN7 L~* >8 8lw&7, 7, t U Za wHa w6a UwU% W# wwwzهw:@ A @$5?75?3B B B @5, *=% 55  d577wٷطj@Rw|W#wه5wh wه4  AEB$C C bه   AEB$C C 9هw>w<هw\wZهU% W# wNwHwB؇6ww.هХ[ 8¥,f (¥]U   |ڱ& ¥.  w#LW#wׇ1wVW#& W#BawB Hև @ևwW#W#vwlׇU&  ?f7b PH p¥;m¥! ȥ;e$ ¥=7e)#t#t-e !$87  ȋ-ȥ;*E$  6 ¥,¥! ¥;¥: 5 !a j $zw ~&" fwl7fJ fe& +;(!%,:) %   D , : D :  5%w2 :$(3 20F5 *05 "05 0J5 & & @( f  e ee e &f& v LB[1,1]LB[1,1]0+&+,0+U,  `e ,7( B557SYBe F(eB e  yXB,D.& C! U@5    w"  DZ#   ~d5   ~p v n c5bUU@Z5U5@U@5 U ZU @ @E @ @ @ 7FQ$@P  5U@  *e)(5555u u C55a 5a @ 6 w%tA7 7 G(A5fU@d5@$5 X 5BPA=LB Be@E?B B B@$5  =C^ #wHAW wU\AmwA w "ww`Xu-5.zC5@ 55E @,  U%P  ` 4   &0(fEU5U U 00 0MM3eaekJ*Up ej1` (e)w^(QQ z&$&&$(& &$% Be>w@ R7 *w&  BAbpd Zfwh`  %/ -%/*%//$`¥¥¥ ¥ ¥ef Uױ $fB ((  5.U.5-$e&  d ^@ ѥ  u N#N |%7 rm<և $4 0 3 0:3 043&  m  f A N  % $? @`_?z(Units set to maximum assigned***=5m  % V U-" 1v( `,B w,p H`e62b5*5& F5  =  jw۷ڷQD  5;5l+ 5`%"5](R(5](P(5ՀR(ՀP( 7h(7h(ڴ p(̂mh(PڷNR(P( R(P(  & & Zd5@t,*$5t<* 5   Z cHA Ab(N ׇN65  5 5 %  5@5 B  f LwB sœ  Ow4t*w. 5 P5       ` `U@w` Z( B55P(R(U w    55P(R(5  5 5 w w  ~w vwp jpp5x5 5@U@p` p`|( A &! 5 ׇE B B B B   Z( Œ55P(R(w &fA< (7& % ,4, %&f E U40, U 0,  5 g wihk 5l T(T( T(  Z( Œfe  Z( Œ R(  7 :|7 <7 P7 7 7 r7 j7 r7 ,7 `7 ^7 `7 X<7DB7 <7 JFZ P  75?Z %A A A wD <\.` He P8 5  5 55 @$ d.A   L  AP  feA X   8Հpp Zw 0 3&f& v n!p!!)B)&ɪyN0tN sN0sN0 s, t ~, , ,3Xdt)***w  7| -R <5xX b$5V v, n5@F  * Jw P  w @e"Kr•@- Jr5;r5 *5K5    ȵ d be 5D'%R# -L5@@  év~he p J5@  5 ,$PH4 7J7 N 0 <PPh Vw  -T5J%Xȕ@@ @b \ @  07f ?7wA T  d*w00 8MJl1DATADATADATADATADATADATADATA:d ,7  z v p * `  7N7H & Uw n,&  " d7w  &  #%  ` 7 7 7 7 Tfj& ~ 6vw0$7 (e"$eB$$$e((<Tw<L  w<B    0w<&$# `  %W5@5 Of &F R6vwf7Z7 *7<&5@   2  t`    F  R f  *77wv , 7` *,   D7 n5W,W,sN5 5@ jw 6 Beʵ *ʵ 5" 25  -f& LB!FU@& < .@"-h  Be  @@K+ Nw@7 \ < @ , ( >% x0( H3pwXw w :e f6    fe 5D  . 91  N&  &5EEEEE@E@EE &&fEE# %%2, %U2,  5  j C J & P &*  l7JV% J%,D7 *%.?-15z%e N l5Rrr   7 | xCœ5H5µ  (l 5) &5U5U5 EEw, w, m35Հ( " 55 3l5 5-^ ,h,be<5%ɪ%J';'%Jr;rF w6w, 9eeb 5@\ DY-PU5R5O5L5H2UB Z@ v h d X1   w t-l 5@$   S L7N t5w5ww|ŀ7jd B-T &f  bw:  lՀB 0 Rw 77w~7 ~7t w\ 6 X $% n w6E$ µs d n P wJfB 55 5  B b& 7w P& L() d "r0 Հ%V   .%  wxfn 7^ݵ Vw C57(5l ~< H ! &Z dPPJN  Bއ xt rnf `  "  R 3,5wR5w>55e5@ 5  5e w55Հ m40 0  pE0  5H Հ m0 0  0 d 4ef %h 0 `e N 5PHtt w. *m ێ  % fV ݁ 7 1 5f] l݁w` 6f .00 @MM3eaek &  ! p` p ; p p  5 -5@) .7 4   7  &f لwwV5- %& !5UX  `   @  7 w eW! A T 5555 pՈB V xe&e w  ww wRe f &w@:   w J& f w R  & ff ,  N   !. U 1o 0 3$ H&f& v "!T!$$n%x!,,** & D! -T.T.-D! 7 \x/h8 f  4  Z57 7 $ 7  J "& 0 h  07f ?7wA  *w< ,7p h ^ Zj  * `  F727, & Uw & f  7w  H&  #%   7 7 7 7 fj& ~ j6vw~r7np(e"reB$$$e((<<8w<0  w<&    w< # d`  %W5@5 Of &F 6vw77 *7<&5@     `  T    R f  x7wv  7 v $%* nwxEf2 µs d @n  *wJf r (55 5  LB ) 87w ( & L()nX d 0 Հ% &,  .% h p \ wxf 7ٵN ܇w xC57(5l$ < H ! & l PPJ  ڇ xt rnf `  "  3,5wR5w>55e5@ 5  5e *w55Հ m0 0  Er 0 5 Հ mZ0 0  0 d 8  &ef \%h e N 5PHtt Zw <m׎  % fV &ځ 7 1 45nfN] فw` 6f . : ! p` p ; p p  5 -5@)j 7 X  $ 7 D  0 &f6  &քwwV5- %& !5U HR    P@  7 w HeW! A 0T 5555 ՈB ߡ  e&e wP  |w<(w we Hf &w   w H& f w r R  |& ff L ,  >ޖ N   !p U 00 PMM3eaek1o ,0 3&  m  f A N  %$ H*<VNTI VNSYVNSY[gNSY[hNSY?yOV\~TI\CL2VNCL@GhjTXCzb "$RR>@BDFHJLNP ,3X s,w  h n  D F D 4 D "   U%@eA D e U%Z (%?%  DD   P?7 e< V  eV4  b7 "5e@5` 5Je5@e,e7   -& .5h  eb505-h BBbBdBd w@m@bmEW 0e7P5!5|85@e2e?E? E @`eE 7`  =  e>  >  D   fP  aU%e =  | =l 85  1 aa < H !  BPPPP *@e"A N & ^A  pp0^ L @ dDe"8 >77%ɪ-K'wD-vJ'w8-j;'w,-^3&w -R3&w-F2&w-:#&n w x"& "  n7w  &  #%  j )Px")&y@G xCcbp@,1zB?yD5!: :| 2|v *|! "|0 # $ 0 3&  m  f A N  %HHrzt? jw :DCet BEA% v5f&"ŀ550 00 -5 eDCen h-5e! 55@ 2 7r&e  7xf &e 5pe w  N5@L wrDe rwx00 XMJl1DATADATADATADATADATADATADATA5"De VDe HJ- 4  TTT5 L5m55e5 Vdf  c 0e " %w 7 l  7^5X*) RB 05:4 2 5 & 7 +  m  V%  25 tL`T 5m    ww@?  u~~@wZCa 5XHS@Cw0a  l& A~m6 w w H 5*'Cwa Z5 ZH  AB 5w5~fe@ u , 5 . tj T   7 A~B& Km(& d  S& j Ee 7 z% p 7  5  v  r 5z&   w2 5P     w 7 ^ 7ܰv5 H 7ܰbއw ( 7 5l Z CC @w  w6w2\ @ wR5v D & w: 5   P V "uuf7 2@   A  r  * & @@  -\ݬ5  5A5 5~A5  : l55Ca XXJ  @  .55 B  @ uu|u~uw A  r f      b 77-8܈ v5`5`~ fAAAA R  8uuf L "w w w w J rr @A@A 2 2 T    @@ w3N@ (4`N3N-l4N6  4`N ew  H (;w ( ]2"]U.5*5& w > 75 w  7 V &5X5 N5 T5 05 7P`UZ5b UF E    45:X 5 5 T7S5 5 H -~  UA2 2 ] ] %w-!] A  f@ $ . uft t5VPX7S< 8 D-&  8 UA2 ] ] %w-!] A  R@ |  ut t R w 0 7 n 5\ w V3 <AA F5  U e   -   U  -    "5  nn Kjj D  5t eE  Wt Fp >n22mh-6 fЕ     `# T5mRRmFmZ5tm2mFw^w 7 5Nb77Eb H0LP .U U5 U5U5U5 m 7 m7 " f6 n0LP7<bm727 ,7&5 x5p.5Z ,mj7$ m\= 4 e>77`p `AW  %W V  emwe w`e5` d5emTp   %   5Udm$7mn   ><:5@,m" . 5   ߻&~  $ 5nx'7 7 (4x 7zݒ7 l Z5OxRh7 B X 0 x(e7 6 T":ݬ 7 (7  "7 %@7 zCD5Efm Le  `ECf  &  e&A e   Z E'E@Ce5@> % &%([qe   Ce-\ d5P (7D( ہ @e Re?E?  E  >e"  A &@ mۡf w 6    w2   2܇ &B : 4e6(H" J l 7 Z@` Y2 2 )2 2 -dڲ \ڪVe wT݇   p hb   N7 @7

4e6(H" t  %  U? a B"  B ` 0 3 \00 hMJl1DATADATADATADATADATADATADATAév~ 1o w 5{7  7\5V,%( -5@tT eb h&: e"^ Np 7 x7 < 7` &l  rx 7 # ^e"A  6 m   " @ H %5F5>50 0*D ..7& 5>eE@`    m7  (` Ew " ."  xwz<E B a V7 &  77 7 w x D>m777w T m"5XmPl   ~mL7zl 7z5)m.7blw mm 7Tm 7:l 7:w   "$5mmw & x  7w  Z&  #% |  w v 6    wL n   8 V&4e6(  l 7 @ 2 2 )2 2 - e w     |   h7 Z7 VP RN NT`U2E( g  6&f  mP   |V4e6(  $pf&  )`  w ^7 `7 ^ 7F>! h ,* *7 *7 (| w & H5 >aC|w  7j f ,aC`w  , (   R f  ,&L4e6(   %  U? a    `7 7 7 7  fj& ~ 6vw7(e"eB$$$e((<Rw<J  w<@    .w<$"# `  \ %W5@5 Of &F 6vw77 *7<&5@    R D`     R f  75wv * 7Z  z5@  w,w He8  00  w 5@)` 58@e  00    d e d 5@N 5H  d^"  8~ l7R7 D7 Bw  2.m777w mv 5ml   ~m7l 75r)m7lw JmmP 7m^7l 7w   vxmjvmfr  ߔ  $ * `  z7h7b & Uw F&  < 70w4   |&  #%   7 7 7 7 fj& ~ 6vw7(e"eB$$$e((p<nw<f  w<\    Jw<@># `  ( %RW5@5 Of &F 6vw77 *7<&5@    6 (`     R f  7Qwv F L7-ݜ55  mB#@#  >  B#5m &  m  f A N  %0ODT xfr address: %P%NPRG xfr address: %P%NStack limits: %P %P %P %U.%NIdentification : %2R%NTask attributes: %VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%NTask address limits: %P %P%NTask Address limits: %P %P I-Space%N %P %P D-Space%NTotal task size : %T. Words%NTotal task size : %T. words, I-Space%N %T. words, D-Space%NPartition name : %2R%N%P %P %P %U. %VS%2R%N%P %P %P %U. I %VS%2R%N%P %P %P %U. D%2N%4N%X Overlay description:%2N---- --- ------%NBase Top Length%NTask UIC : [%O,%O]%NTask name : %2R%NTask priority : %M.%NMapped array area: %T. words%NTask extension : %T. words%NTotal address windows: %M.%NTask image size : %T. words%NTask image size : %T. words, I-Space%N %T. words, D-Space%NR-W disk blk limits: %P %P %P %U.%NR-O disk blk limits: %P %P %P %U.%N w  *(  =D#  q* D) Nj( ҝeҝ^V* "* r 0" "nm׊ يhJ( Dz%( 6%4( $X  N5Uwp <= .E5UNB@@P+/"A5R w=& U% e U%  ( # + ":* p" T* Z" >* D"5' "~7 v7 t7 f7 d "( (+  * 5 -,2 -&,--"5h ((L) (+) ^֊m58  J֊m( `( V5 5 r+ ,5  + ( wXmTZw TmHN  e  - * :* * 5 P2/ w p 6"-/J p5RaU%U% %$$ c* )w lF "$; 5 5  lmRm  bpd5  Z /* w .7 ,s&-J* e"8 ((( U  mp(((l"   <  (    f  H w  a 7    RO,RW,D,I,@GBL,LCL, REL,ABS,OVR,CON,SAV,$$$,%2NFile: %X Title: %2R Ident: %2R%N <%2R>: %P %P %P %U.%N >>>>>>>>>>>> Undefined reference: %2R%2N%7S)())))))).)0)2)))))w T5wN <    ((   (B J  ( e ^< (w e" @  f -   ( r5%r܂` ^ N&   p`  7 e"  ( d BR RRR ( f& 6  J z>(-N -H Hw,3&>('  Dh X( >(& > ( "   v#~##$$$$$#$ $"$$$$$"$"$w     f#6#  4#B  , t# .` 7H7DGw:w6-` @#RRB GD ŵŵ ŵ m &mwŵ 7 ŀ7  mߐ-Rߠ 7@#  7 &ްp .` (#  5 T"#w vp5@b5@VL#PHPJPLPNPPPVPXPZP\P^5eН@ E@@3J # 7P E@` F 6&  L# N (5 . w  5 j0p tsN F1o  ,  s, ,2:BJR  3X|    s, wWV ^ w  # H` Z7b500 MM3eaek505t-U Ur TT N 6 e" Jj5m@47 \5 5) & D <5 TTR5 ԕT -  d    50- v t-   b Cet5 A  1,1, 5m  ` %8 !B (@e w7 Det= +&  + w      e Xwnw JCTEoU`5 TT  ""  , <<   ""w-3XJ a .&! -L lD  4`SA {RJ33m3 3T < 4 , @5 eV  e&& &   #w~   3 3 4@ 5 Xw6  z5 8555  ~@e"V t4-    7, eA  ",œԕ5   mJE %  5 5 D 555 UA TTԕ@ԕ f   7zR L   w 7`7\ @wRf  # I wB  7 (      7       ~7W!i g ~B w 8@   w @ 55 @a \@@a R $ & . @  0w> ,w6      w` zeP PPЕ %< !B  @l55 m  @  w &   7w  h&  #% b  T J F  * `  77 & U7 7 7 7 pfj& ~ 86vwL@7<(e"@eB$$$e(( <zw<r  w<h    Vw<LJ# `  %W5@5 Of &F n6vw7v7 *7<&5@   N . `  "  b  R f  F7]wv R 77 2     I 4҇ AZ    555ȋ+& ȥ+ȥ-  U  f  *u  u  ¥ ¥ ȥ ȥ  &  m  f A N  % & & @( Bf  e ee e 5/5M5l555556,6R6p66666/7\7777 868k8888 9-9Q9u99999:F:i::::;,;Y;;;;;!<J5W E5W sW s W ! W 8W >W EW W W W Ō $|e TH< LT=&  m  f A N  %Illegal Get Command Line error code%2NCommand syntax error%2N%VA%2NRequired input file missing%2NIllegal switch%2N%VA%2NNo dynamic storage available%2NIllegal error-severity code %P %P %P%2NCommand I/O error%2NIndirect file open failure%2N%VA%2NIndirect command syntax error%2N%VA%2NIndirect file depth exceeded%2N%VA%2NI/O error on input file %X%2NOpen failure on file %X%2NSearch stack overflow on segment %2R%2NPass control stack overflow at segment %2R%2NFile %X has illegal format%2NModule %200 MM3eaekR ambiguously defines P-section %2R%2NModule %2R multiply defines P-section %2R%2NModule %2R multiply defines xfr addr in seg %2R%2NModule %2R illegally defines xfr addr %2R %P%2NP-section %2R has overflowed%2NModule %2R ambiguously defines symbol %2R%2NModule %2R multiply defines symbol %2R%2NInsufficient APRs available to map read-only root%2NSegment %2R has address overflow: allocation deleted%2NAllocation failure on file %X%2NI/O error on output file %X%2NLoad addr out of range in module %2R%2NTruncation error in module %2R%2N%D undefined symbols segment %2R%2NInvalid keyword identifier%2N%VA%2NOption syntax error%2N%VA%2NToo many parameters%2N%VA%2NIllegal multiple parameter sets%2N%VA%2NInsufficient parameters%2N%VA%2NTask has illegal memory limits%2NOverlay directive has no operands%2N%VA%2NIllegal overlay directive%2N%VA%2NOverlay directive syntax error%2N%VA%2NRoot segment is multiply defined%2N%VA%2NLabel or name is multiply defined%2N%VA%2NNo root segment specified%2NBlank P-section name is illegal%2N%VA%2NIllegal P-section/segment attribute%2N%VA%2NIllegal overlay description operator%2N%VA%2NToo many nested .ROOT/.FCTR directives%2N%VA%2NToo many parentheses levels%2N%VA%2NUnbalanced parentheses%2N%VA%2NIllegal logical unit number%2N%VA%2NIllegal number of logical units%2N%VA%2NIllegal default priority specified%2N%VA%2NIllegal ODT or task vector size%2NIllegal filename%2N%VA%2NIllegal device/volume%2N%VA%2NLookup failure on file %X%2NIllegal directory%2N%VA%2NIncompatable reference to library P-section %2R%2NIllegal reference to library P-section %2R%2NResident library memory allocation conflict%2N%VA%2NLookup failure resident library file - %X%2NIllegal partition/common block specified%2N%VA%2NNo memory available for library %2R%2NPIC libraries may not reference other libraries%N%VAIllegal APR reservation%N%VAI/O error library image file%N%VARequired partition not specified%2NInvalid APR reservation%N%VAComplex relocation error-divide by zero module %2R%2NWork file I/O error%2NLookup failure on system library file%2NUnable to open work file%2NNo virtual memory storage available%2NModule %2R not in library%2NIncorrect library module specification%N%VA%2NLibrary file %X has incorrect format%2NResident library has incorrect address alignment%2N%VA%2NPartition %2R has illegal memory limits%2NInvalid partition/common block specified%2N%VA%2NTask build aborted via request%2N%VA%2NDisk image core allocation too large%2N%VA%2NInvalid window block specification%2N%VA%2NTask requires too many window blocks%2NTask has illegal physical memory limits%N%P %P %P%2NLibrary references overlaid library%2N%VA%2NTask image file %X is non-contiguous%2NVirtual section has illegal address limits%2N%VA%2NFile %X attempted to store data in virtual section%2NResident library mapped array allocation too large%2N%VA%2NInvalid reference to mapped array by module%2R%2NEnd of file reached before .END in %X%2NSymbol %2R not found for patch %2NSegment %2R not found for patch %2NSupervisor mode completion routine is undefined %2NLibrary not built as a supervisor mode library%N%VA%2NSupervisor-mode library reference error%N%VA%2NIllegal system size specified %2NConflicting base addresses in cluster library %2NLibrary %2R not found in any cluster%2NIllegal cluster configuration %2NCluster library element %2R does not have null root%2NModule %2R contains incompatible autoload vectors%2NCluster library element %2R is not resident overlaid%2NSegment not found to address round%2N%VA%2NLibrary build not requested - ignoring option%2N%VA%2NIncompatible OTS module%2N00 M Ml1DATADATADATADATADATADATADATA*e"**=RJ w f+2$7! r -:w 4"&f e"= <%wŷŁ (e"((=RJ w dECh= e-- $ ' J -7" ,a(Q$ H"7`&wwA dϡ D |,;; W  &[q W 2!TITISYSYTICL<NZ7(:< & & @( 9f  e ee e &f& v px' VFY>P{L};00 MM3eaek .kz?TLBOPzLB  B VFY Version M0529 (ANSI)VFY -- [0,0]File ID %P,%P %X Owner [%O,%O]file ID %P,%P Summary: mult = %D. free = %D. bad = %D. Header map error I/O error reading file header - Error code %D. Bad file header %D. Lost files were found Rescan of volume to find all files with multiple allocation%NIndex indicates Bitmap indicates %N File header does not exist[1,3]The following files were not in any directoryFailed to open directory fileFailed to close directory fileI/O error reading directory file They have been entered in directory %VA They are still lost, could not find directory %VA Failed to enter file - Error code %D. File successfully entered as %X Error code %D. - Directory [%I] As a result, no files will be entered in %VAThe following directory entries were invalid[%I] File ID %P,%P,%P %X - %IFile not foundInvalid version numberReserved field was non-zero %D. Invalid directory entries were found %3A,%3A%VAFailed to find INDEXF.SYS;1 in MFD - Will open index by file ID 1,1Failed to find BITMAP.SYS;1 in MFD - Will open bitmap by file ID 2,2%NConsistency check of index and bitmap on %2A%O: Listing of index on %2A%O: Read check of files on %2A%O: - Blocking factor %D. Storage control block (VBN 1 of BITMAP.SYS) is corruptedContinuing with an approximation of the size of the volumeOnly the "blocks free" value is validThe "blocks used" value is valid in the line beginning "index indicates"The "blocks free" value is valid in the line beginning "bitmap indicates" Failed to open file for read check - Error code %D. Error starting at VBN %O,%P, LBN %O,%P - Error code %D. Error at VBN %O,%P, LBN %O,%P - Error code %D. File ID %P,%P %X Multiple allocation %O,%P Bad block number %O,%P Block is marked free %O,%P File is marked for delete I/O error writing file header - Error code %D.. blocks free, . blocks used out of %N%2A%O: has Get Command Line - I/O ErrorGet Command Line - Bad @ File NameGet Command Line - Max @ File Depth ExceededGet Command Line - Failed to Open @ FileIllegal deviceOpen failure on bit mapOpen failure on temporary fileFailed to allocate space for temp fileFailed to detach deviceFailed to attach deviceCommand syntax errorI/O error on input fileI/O error on output fileIllegal switchOpen failure on listing fileOpen failure on index fileNo dynamic memory available - Partition too smallClose failure on bit mapClose failure on index fileClose failure on temporary fileClose failure on listing fileIllegal response - try againSY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VAI/O Error Code %D.QI/O Error Code %D.?TSYUPREFRIDDE0LO@DVLIRCrHDAL xQzSY SYt:#zSYz")t @.Delete this header [Y/N/Q/G]? D<[S|t wwD0 p # d  # Z  n&0 #  <  5, .  500 l# V# E  5 5@ 00 MMl1DATADATADATADATADATADATADATA  tw|s    N5- *U6  u &7 n V| @ZX`ww  pm$p!+ 05*5wJ w,w,-D ->5@wn5@ww"  R t &E     0 684 ,(e p 0 mTp  85*E" f!@Bw\pppm :! U- , wH  \5  Bd "  w,*  jhw5N J p  w  ` : Z5 5@w:$ ^ H1 0 $p&| w4 Fp%hd [5p  | |  w0  w@  -0 & &&&eH&&& |)TTTTTT NeB p h*  2 e ( & T*  85@x  U^ 5L (!# L  ` 8  5 I r 5, r)^ ^ 6*1 * 2 d $ & % v "mf  -  -  D`# :<  " Ji   L F @ȕ  W0W9 D!   e ѥ  R &  P35Jw7 x& T5# # * Dj"$w>BDF  V  t   N7w CC e  å~ `eBC    TR K 5  5 |0$& lk7,\J7,^DU# * W m  J M5@Zd85< :5&%De0HE'f(  7.w, & @72 wb&w1z    fX V EB < 2E7   F`^B`w|  5$   | fQ.* 5SY7 # x   zD7 5(5z #5`"# !# * D BD `LN  N e7 eB$& @! e     \ j|  `ˋl,,d!# C $eR # # # HH p!& Tu% ~%f 0 d N   B@ <| "w2D 3  %*1p sas &ff  *f  `e @   !  CbB a( (&5 8 0e   ~Е.Е/e jЕ.wN K (5 tpŀ *\ dt @ @`e  w eB w &&$ "  , = ^| B w0 Z w@ 00 MM3eaek8  r  w0r5 \5 w@T B  X Fٷ CaB   ,w@   /  d m0p   v `fw~ 3 Eބ E B ,  t@fw<5 M5@F $f8 f, )ĝ>ĥY!ĥyĥNĥnĥQĥqU 8ĥGĥgU@$Uއ 5mA  "  e\^ w(f (  ݂ f b%  LЕ.z 0& \xfdh   `A    w      1z$w 7& & A&?mE @χ7ܼ7KT~ 0 0 0 0 0 |  r( 7 7 7 7 7 wD 7z r nCD CD CD    8Ip 4DNppb J7 & 7 xe 5 5F 55 U@5@56*  <0 b  f < J D w ^ `` ` ` ,"(4%XPڡ~&7 f7 d7 bDf 8 %1  11 1 1 116 5  5*+5U5 5   BBCU% B  v< $5 %D<4 87   rUfUh&&< * 2Е ȕ-ȕ  b     bBb6Qe5)E$ %& e eUU7 & 6"e e\^$% 5R  9eH  --  6B 8" A  & & & & fB & & & Ν )  % V U68 2b x BbB  8&   > %ևw & LB&a    W111 D K M ?   B U%    vM !D  E eB @P   X& SY&  B& SY& ( 5 B %  * ) &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e є w 5 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 "jjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *4\4w  8jDl@ TeBT85l@ &@( D |eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@('&15ew ^, Bv     5Bw 77800 MMl1DATADATADATADATADATADATADATA|9.7-; ȦD- E %     U EU 5  5U ;27 @:9R7`9E U *5@*& E& & f&ËDef Ë )̋U&f &ff &  m  f A N  %X P ,LP`, $4(8|$L<H\|~,>>W W  &[q W 2 TITISYSYTICLWKOVVγb  γVγ5wwf& 7p TKB>"   @ %2>KWdp}8(ЬxhXбHgpzW %<TDSYSYSYSYTICL^#TKB -- *FATAL*-Run aborted ZPp@ e 5 5   5~   w 5bC ŀ t tB f50  -F <5.$ r 5 wVp wV Pwf *   f&f 7J w77 00MM3eaek  `wj w^ 7,\7,T  V0 0  p@    ~ $ $fE7 4`0 Z 0 5,5,  6 u$ ^   1,1,J 1,1, &b e m 7D &8 e$$)d 5w , & A 7@m7 *1 C7 pM $ w"   7 /  *w p L7w  X`d VT efA   ^w: 7.w, ~   z& &% N  V    2 T s zew ~   A ~C*  w CB  Z54w `eC %E& 7 .Bd | wddcAcAd 7A &e Cm  &m`e` ` f`B` JP    *     `p f& `, ,, &  mV  *B ce " &e#r D (  & eB%e1be1^1\1H1J1L1N1P&&f t h eHD e<w  E  A B` 7pA wL &w E p  B ` p 7~A @ae n fe?E? & f Y :  40 B ` w f* E @ jw`RK`/ & D -N  nx  ` * d    B B  @`   B` * 2   v  m ` @ X&'&1 " % ' % @ X p     0 3 0J4 ~04 v<3 nl= fx=5ew , Bv     5Bw    5  5 2  UE   E U 5@*& E& & f&ËDef Ë )̋U&ff &f   t @0"0"p###0" #P(('P(L4+P( /L;X<LdJ|pLL< |dPHpZHp p|a<\ dph&l&o&r L x"P{(h(("LLX2$`202l<2H$5<T5<H=l=`x=`l> |($SYxQSYySY^SY~xQSY_SYzjL_LB[1,1]SYCC@VDAVLB VSMPVSSVMAWDL`VSHpSPqCR@pMA-WI pHDWPIVCOxLI xCPWDAVFP@VMMpPIVPRVSQpTRVXTpACVEA VHDWPM@VSL 00MMl1DATADATADATADATADATADATADATAVMUVFUpROqALWCMVSEWIPyNMxCOxLI xSGyXHpIDpELxFMxCL xSBrFO@xt{J(&<^5b  wte w ~7 5 b$m e ˋ   ! " (wj w @pdf   :B$ĵ4ĵ!%'% %E$e@ P  7e :e 8e & ĵ V 11@ Be w ,5 funhj uhdB$ 0jwaw< 8 v8w &  0*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 Pjjlj ɥ@@aujk,bp Z5f fˇ ȕ ~‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ vDlljaCeH###33 & 8 * w  8jDl@ TeBT85l@ @( D HeB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ N$ F^# >0J58,X $L<H>AJ"?J"2"""LB[1,1]ODT.OBJODTID.OBJP.@ w RX]F4,  wA @b$r f&"d3 3 :"eB A N D\"&%5bE5 E 5U  Be r 4 3:"s ]@@MX7 T7 R&&$&! &&"e 5'Ul7\7^X&$PP `E@B (w(  7w4 P@N xw$&4 be&ew B@P@P dbbj7 d  0w*,B &&&$$ 55b ""$ (b &e5 &$7 R dw$&`9  . ` r,\NLd X |N 2BAbpd fwh `  %/ -%/*%//$`¥¥¥00MM3eaek ¥ ¥ef U߱eE >"&F"m    b   \ܤ7 F7 :8 f 7 D*H 2j"?xL%D 7 > < U@U: W@7 " . 6f 6wvP  w wU Fݠww^7Re @  7 E7 p7 n^R݇K w w      7 7 7 * W,( 7b 7XR ^8# | %* 7  7  f   "%A  Tr LJA d7^އ LN &އ && 9?Z dePHHJ  5@  w  e5 `b  ֆ9` &&5 bv& & j$4 b$4 Z$&4 R0 3 J0@3 B0N3 :03 `5uuuu w D " &w*H"Aq#q- $ # |#֯%1R%&߱`&&N$3n$p TKB>l^SY7 H"7 e`#  2@bp$$~0 b b@ef7` ȥ;ȋ#% % % % ¥:uu j n & W e)#I#q-'eW #$0ef` ננe נ^נ  TA5 ¥;U%E #w (w we) e)( r n'e) e)) l  $' U% ¥;¥,Q \ Pe)S#S- $ *I  %QQ *& N&1 &f JPe f  7" RRR,AC`e R?j7f% ~' f * #e`P  &,@ 3@8K@oMBaTq rt@,YeYxx@Y`Y5 0 3 x0F5 p05 h0J5X[<$09AZ (),-*! 4%$$J$$%\$$$$7 7 7 7 X7 L" P "N"" #^#$$ :#B   r00"Iz#%N"U^Z7 XO N"J8D5M5IE   $ "ͥpͥ&Հ7 -A# ~ x( N"3%2#եJ   H #7 Ewͥ#Jn# N".wȋȥ;!Z#% "9;5#H1H/H-HH)HH%u# +w "W#"W#  p##&  e)ȥ:2ȥ./ȥ[,ȥ<)ȥ/&W ! T & fAf J !"dd,wp& ȋȥ-ȥ)ȥ(ȥ* ȥ,  ȥ[ ȥ]  Z , ppp J JHA A NN>*,B $&&5 bv& r&`90 p5@ w bf 6 % e 2 $4 0 3 0@3 0F5800MMl1DATADATADATADATADATADATADATA1o?y%J%,%J%L%&%%&Z''H" 0 77 5EL" P "N"@ J  > *L" %!"@5h7H7L 5NW   C 7`7# <5#   ߴ d ppp zUe Ah 6 fT R 7œEz#5U   5pppp f& fp5& Np5Ufup 47&w* v |< fwX2 5Npppp u  w   z &   B wwe@e 2 f5Be  5  D91 G@ bw e & Ne 5U e5  ! 555U-55 8u5 $uw8%* *$) ] eE BE*E  0 3 036(>(&(&(&(&(&(&(&(&(&(>(&(&(&(&(&(&(&(&(&(6(F(6(6(6(6(6(6(6(6(>(6(6(>(x%&(&(&(&(&(&(&(&(>(&(6(6(>(&(>(>(>(((6(((6(''('6(''>(6(>(&(&(6(6(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(>(>(>(6(R,6(>(>(&(&(&(6(>(>(s1"P( @,A#w  5T a$ 7 •!p b& a m ߀  w^  f X   ed7Ae 1΋ ޿  ppU@pM l%e -p  Ah " R a @ w b vw X l . r7"7,9Z7EA3"3,'5@5E-X  #  B`  E   e3#3-  Nޱw &D$%% &5 w T& ݷ  J7w  j &  #% v F n<- f$. ^(( V(( N(, F(- >4( 64- .4. &$H3 $3 $3 $2 $(3 $3 0 3 05 05 05 0J5 0:5Sw  e wwZۇz@$  "7$l7d  e p?7 PAPАP 0wR&ww@ jwhW# w*ۇTw5Z7 7 7 $e EM M M Mw ۇ e  ?7 (PPP v$l$ee^A^ P jppp^ p"   rڿ   Z p R :w8& wwڇ5 8mwX00MM3eaekVwPwN7 L~* >8 8lw&7, 7, t U Za wHa w6a UwU% W# wwwzهw:@ A @$5?75?3B B B @5, *=% 55  d577wٷطj@Rw|W#wه5wh wه4  AEB$C C bه   AEB$C C 9هw>w<هw\wZهU% W# wNwHwB؇6ww.هХ[ 8¥,f (¥]U   |ڱ& ¥.  w#LW#wׇ1wVW#& W#BawB Hև @ևwW#W#vwlׇU&  ?f7b PH p¥;m¥! ȥ;e$ ¥=7e)#t#t-e !$87  ȋ-ȥ;*E$  6 ¥,¥! ¥;¥: 5 !a j $zw ~&" fwl7fJ fe& +;(!%,:) %   D , : D :  5%w2 :$(3 20F5 *05 "05 0J5 & & @( f  e ee e &f& v LB[1,1]LB[1,1]0+&+,0+U,  `e ,7( B557SYBe F(eB e  yXB,D.& C! U@5    w"  DZ#   ~d5   ~p v n c5bUU@Z5U5@U@5 U ZU @ @E @ @ @ 7FQ$@P  5U@  *e)(5555u u C55a 5a @ 6 w%tA7 7 G(A5fU@d5@$5 X 5BPA=LB Be@E?B B B@$5  =C^ #wHAW wU\AmwA w "ww`Xu-5.zC5@ 55E @,  U%P  ` 4   &0(fEU5U U J*Up ej1` (e)w^(QQ z&$&&$(& &$% Be>w@ R7 *w&  BAbpd Zfwh`  %/ -%/*%//$`¥¥¥ ¥ ¥ef Uױ $fB ((  5.U.5-$e&  d ^@ ѥ  u N#N |%7 rm<և $4 0 3 0:3 043&  m  f A N  % $? @`_?z(Units set to maximum assigned***=5m  % V U-" 1v( `,B w,p H`e62b5*5& F5  =  jw۷ڷQD  5;5l+ 5`%"5](R(5](P(5ՀR(ՀP( 7h(7h(ڴ p(̂mh(PڷNR(P( R(P(  & & Zd5@t,*$5t<* 5   Z00MMl1DATADATADATADATADATADATADATA cHA Ab(N ׇN65  5 5 %  5@5 B  f LwB sœ  Ow4t*w. 5 P5       ` `U@w` Z( B55P(R(U w    55P(R(5  5 5 w w  ~w vwp jpp5x5 5@U@p` p`|( A &! 5 ׇE B B B B   Z( Œ55P(R(w &fA< (7& % ,4, %&f E U40, U 0,  5 g wihk 5l T(T( T(  Z( Œfe  Z( Œ R(  7 :|7 <7 P7 7 7 r7 j7 r7 ,7 `7 ^7 `7 X<7DB7 <7 JFZ P  75?Z %A A A wD <\.` He P8 5  5 55 @$ d.A   L  AP  feA X   8Հpp Zw 0 3&f& v n!p!!)B)&ɪyN0tN sN0sN0 s, t ~, , ,3Xdt)***w  7| -R <5xX b$5V v, n5@F  * Jw P  w @e"Kr•@- Jr5;r5 *5K5    ȵ d be 5D'%R# -L5@@  év~he p J5@  5 ,$PH4 7J7 N 0 <PPh Vw  -T5J%Xȕ@@ @b \ @  07f ?7wA T  d*w:d ,7  z v p * `  7N7H & Uw n,&  " d7w  &  #%  ` 7 7 7 7 Tfj& ~ 6vw0$7 (e"$eB$$$e((<Tw<L  w<B    0w<&$# `  %W5@5 Of &F R6vwf7Z7 *7<&5@   2  t`    F  R f  *77wv , 7` *,   D7 n5W,W,sN5 5@ jw 6 Beʵ *ʵ 5" 25  -f& LB!FU@& < .@"-h  Be  @@K+ Nw@7 \ < @ , ( >% x0( H3pwXw 00NM3eaekw :e f6    fe 5D  . 91  N&  &5EEEEE@E@EE &&fEE# %%2, %U2,  5  j C J & P &*  l7JV% J%,D7 *%.?-15z%e N l5Rrr   7 | xCœ5H5µ  (l 5) &5U5U5 EEw, w, m35Հ( " 55 3l5 5-^ ,h,be<5%ɪ%J';'%Jr;rF w6w, 9eeb 5@\ DY-PU5R5O5L5H2UB Z@ v h d X1   w t-l 5@$   S L7N t5w5ww|ŀ7jd B-T &f  bw:  lՀB 0 Rw 77w~7 ~7t w\ 6 X $% n w6E$ µs d n P wJfB 55 5  B b& 7w P& L() d "r0 Հ%V   .%  wxfn 7^ݵ Vw C57(5l ~< H ! &Z dPPJN  Bއ xt rnf `  "  R 3,5wR5w>55e5@ 5  5e w55Հ m40 0  pE0  5H Հ m0 0  0 d 4ef %h 0 `e N 5PHtt w. *m ێ  % fV ݁ 7 1 5f] l݁w` 6f . &  ! p` p ; p p  5 -5@) .7 4   7  &f لwwV5- %& !5UX  `   @  7 w eW! A T 5555 pՈB V xe&e w  ww wRe f &w@:   w J& f w R  & ff ,  N   !. U 1o 0 3$ H00NMl1DATADATADATADATADATADATADATA&f& v "!T!$$n%x!,,** & D! -T.T.-D! 7 \x/h8 f  4  Z57 7 $ 7  J "& 0 h  07f ?7wA  *w< ,7p h ^ Zj  * `  F727, & Uw & f  7w  H&  #%   7 7 7 7 fj& ~ j6vw~r7np(e"reB$$$e((<<8w<0  w<&    w< # d`  %W5@5 Of &F 6vw77 *7<&5@     `  T    R f  x7wv  7 v $%* nwxEf2 µs d @n  *wJf r (55 5  LB ) 87w ( & L()nX d 0 Հ% &,  .% h p \ wxf 7ٵN ܇w xC57(5l$ < H ! & l PPJ  ڇ xt rnf `  "  3,5wR5w>55e5@ 5  5e *w55Հ m0 0  Er 0 5 Հ mZ0 0  0 d 8  &ef \%h e N 5PHtt Zw <m׎  % fV &ځ 7 1 45nfN] فw` 6f . : ! p` p ; p p  5 -5@)j 7 X  $ 7 D  0 &f6  &քwwV5- %& !5U HR    P@  7 w HeW! A 0T 5555 ՈB ߡ  e&e wP  |w<(w we Hf &w   w H& f w r R  |& ff L ,  >ޖ N   !p U 1o ,0 3&  m  f A N  %$ H*00NMl1DATADATADATADATADATADATADATA<VNTI VNSYVNSY[gNSY[hNSY?yOV\~TI\CL2VNCL@GhjTXCzb "$RR>@BDFHJLNP ,3X s,w  h n  D F D 4 D "   U%@eA D e U%Z (%?%  DD   P?7 e< V  eV4  b7 "5e@5` 5Je5@e,e7   -& .5h  eb505-h BBbBdBd w@m@bmEW 0e7P5!5|85@e2e?E? E @`eE 7`  =  e>  >  D   fP  aU%e =  | =l 85  1 aa < H !  BPPPP *@e"A N & ^A  pp0^ L @ dDe"8 >77%ɪ-K'wD-vJ'w8-j;'w,-^3&w -R3&w-F2&w-:#&n w x"& "  n7w  &  #%  j )Px")&y@G xCcbp@,1zB?yD5!: :| 2|v *|! "|0 # $ 0 3&  m  f A N  %HHrzt? jw :DCet BEA% v5f&"ŀ550 00 -5 eDCen h-5e! 55@ 2 7r&e  7xf &e 5pe w  N5@L wrDe rwx5"De VDe HJ- 4  TTT5 L5m55e5 Vdf  c 0e " %w 7 l  7^5X*) RB 05:4 2 5 & 7 +  m  V%  25 tL`T 5m    ww@?  u~~@wZCa 5XHS@Cw0a  l& A~m6 w w H 5*'Cwa Z5 ZH  AB 5w5~fe@ u , 5 . tj T   7 A~B& Km(& d  S& j Ee 7 z% p 7  5  v  r 5z&   w2 5P     w 7 ^ 7ܰv5 H 7ܰbއw ( 7 5l Z CC @w  w6w2\ @ wR5v D & w: 5   P V "uuf7 2@   A  r  * & @@  -\ݬ5  5A5 5~A5  : l55Ca XXJ  @  .55 B  @ u00 NM3eaeku|u~uw A  r f      b 77-8܈ v5`5`~ fAAAA R  8uuf L "w w w w J rr @A@A 2 2 T    @@ w3N@ (4`N3N-l4N6  4`N ew  H (;w ( ]2"]U.5*5& w > 75 w  7 V &5X5 N5 T5 05 7P`UZ5b UF E    45:X 5 5 T7S5 5 H -~  UA2 2 ] ] %w-!] A  f@ $ . uft t5VPX7S< 8 D-&  8 UA2 ] ] %w-!] A  R@ |  ut t R w 0 7 n 5\ w V3 <AA F5  U e   -   U  -    "5  nn Kjj D  5t eE  Wt Fp >n22mh-6 fЕ     `# T5mRRmFmZ5tm2mFw^w 7 5Nb77Eb H0LP .U U5 U5U5U5 m 7 m7 " f6 n0LP7<bm727 ,7&5 x5p.5Z ,mj7$ m\= 4 e>77`p `AW  %W V  emwe w`e5` d5emTp   %   5Udm$7mn   ><:5@,m" . 5   ߻&~  $ 5nx'7 7 (4x 7zݒ7 l Z5OxRh7 B X 0 x(e7 6 T":ݬ 7 (7  "7 %@7 zCD5Efm Le  `ECf  &  e&A e   Z E'E@Ce5@> % &%([qe   Ce-\ d5P (7D( ہ @e Re?E?  E  >e"  A &@ mۡf w 6    w2   2܇ &B : 4e6(H" J l 7 Z@` Y2 2 )2 2 -dڲ \ڪVe wT݇   p hb   N7 @7

4e6(H" t  %  U? a B"  B ` 0 3 \év~ 1o w 5{7  7\5V,%( -5@tT eb h&: e"^ Np 7 x7 < 7` &l  rx 7 # ^e"A  6 m   " @ H %5F5>50 0*D ..7& 5>eE@`    m7  (` Ew " ."  xwz<E B a V7 &  77 7 w x D>m777w T m"5XmPl   ~mL7zl 7z5)m.7blw mm 7Tm 7:l 7:w   "$5mmw & x  7w  Z&  #% |  w v 6  000NM3eaek  wL n   8 V&4e6(  l 7 @ 2 2 )2 2 - e w     |   h7 Z7 VP RN NT`U2E( g  6&f  mP   |V4e6(  $pf&  )`  w ^7 `7 ^ 7F>! h ,* *7 *7 (| w & H5 >aC|w  7j f ,aC`w  , (   R f  ,&L4e6(   %  U? a    `7 7 7 7  fj& ~ 6vw7(e"eB$$$e((<Rw<J  w<@    .w<$"# `  \ %W5@5 Of &F 6vw77 *7<&5@    R D`     R f  75wv * 7Z  z5@  w,w He8  00  w 5@)` 58@e  00    d e d 5@N 5H  d^"  8~ l7R7 D7 Bw  2.m777w mv 5ml   ~m7l 75r)m7lw JmmP 7m^7l 7w   vxmjvmfr  ߔ  $ * `  z7h7b & Uw F&  < 70w4   |&  #%   7 7 7 7 fj& ~ 6vw7(e"eB$$$e((p<nw<f  w<\    Jw<@># `  ( %RW5@5 Of &F 6vw77 *7<&5@    6 (`     R f  7Qwv F L7-ݜ55  mB#@#  >  B#5m &  m  f A N  %0ODT xfr address: %P%NPRG xfr address: %P%NStack limits: %P %P %P %U.%NIdentification : %2R%NTask attributes: %VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%NTask address limits: %P %P%NTask Address limits: %P %P I-Space%N %P %P D-Space%NTotal task size : %T. Words%NTotal task size : %T. words, I-Space%N %T. words, D-Space%NPartition name : %2R%N%P %P %P %U. %VS%2R%N%P %P %P %U. I %VS%2R%N%P %P %P %U. D%2N%4N%X Ov00HNMl1DATADATADATADATADATADATADATAerlay description:%2N---- --- ------%NBase Top Length%NTask UIC : [%O,%O]%NTask name : %2R%NTask priority : %M.%NMapped array area: %T. words%NTask extension : %T. words%NTotal address windows: %M.%NTask image size : %T. words%NTask image size : %T. words, I-Space%N %T. words, D-Space%NR-W disk blk limits: %P %P %P %U.%NR-O disk blk limits: %P %P %P %U.%N w  *(  =D#  q* D) Nj( ҝeҝ^V* "* r 0" "nm׊ يhJ( Dz%( 6%4( $X  N5Uwp <= .E5UNB@@P+/"A5R w=& U% e U%  ( # + ":* p" T* Z" >* D"5' "~7 v7 t7 f7 d "( (+  * 5 -,2 -&,--"5h ((L) (+) ^֊m58  J֊m( `( V5 5 r+ ,5  + ( wXmTZw TmHN  e  - * :* * 5 P2/ w p 6"-/J p5RaU%U% %$$ c* )w lF "$; 5 5  lmRm  bpd5  Z /* w .7 ,s&-J* e"8 ((( U  mp(((l"   <  (    f  H w  a 7    RO,RW,D,I,@GBL,LCL, REL,ABS,OVR,CON,SAV,$$$,00PNM3eaek%2NFile: %X Title: %2R Ident: %2R%N <%2R>: %P %P %P %U.%N >>>>>>>>>>>> Undefined reference: %2R%2N%7S)())))))).)0)2)))))w T5wN <    ((   (B J  ( e ^< (w e" @  f -   ( r5%r܂` ^ N&   p`  7 e"  ( d BR RRR ( f& 6  J z>(-N -H Hw,3&>('  Dh X( >(& > ( "   v#~##$$$$$#$ $"$$$$$"$"$w     f#6#  4#B  , t# .` 7H7DGw:w6-` @#RRB GD ŵŵ ŵ m &mwŵ 7 ŀ7  mߐ-Rߠ 7@#  7 &ްp .` (#  5 T"#w vp5@b5@VL#PHPJPLPNPPPVPXPZP\P^5eН@ E@@3J # 7P E@` F 6&  L# N (5 . w  5 j0p tsN F1o  ,  s, ,2:BJR  3X|    s, wWV ^ w  # H` Z7b5505t-U Ur TT N 6 e" Jj5m@47 \5 5) & D <5 TTR5 ԕT -  d    50- v t-   b Cet5 A  1,1, 5m  ` %8 !B (@e w7 Det= +&  + w      e Xwnw JCTEoU`5 TT  ""  , <<   ""w-3XJ a .&! -L lD  4`SA {RJ33m3 3T < 4 , @5 eV  e&& &   #w~   3 3 4@ 5 Xw6  z5 8555  ~@e"V t4-    7, eA  ",œԕ5   mJE %  5 5 D 555 UA TTԕ@ԕ f 00XNMl1DATADATADATADATADATADATADATA  7zR L   w 7`7\ @wRf  # I wB  7 (      7       ~7W!i g ~B w 8@   w @ 55 @a \@@a R $ & . @  0w> ,w6      w` zeP PPЕ %< !B  @l55 m  @  w &   7w  h&  #% b  T J F  * `  77 & U7 7 7 7 pfj& ~ 86vwL@7<(e"@eB$$$e(( <zw<r  w<h    Vw<LJ# `  %W5@5 Of &F n6vw7v7 *7<&5@   N . `  "  b  R f  F7]wv R 77 2     I 4҇ AZ    555ȋ+& ȥ+ȥ-  U  f  *u  u  ¥ ¥ ȥ ȥ  &  m  f A N  % & & @( Bf  e ee e 5/5M5l555556,6R6p66666/7\7777 868k8888 9-9Q9u99999:F:i::::;,;Y;;;;;!<J5W E5W sW s W ! W 8W >W EW W W W Ō $|e TH< LT=&  m  f A N  %Illegal Get Command Line error code%2NCommand syntax error%2N%VA%2NRequired input file missing%2NIllegal switch%2N%VA%2NNo dynamic storage available%2NIllegal error-severity code %P %P %P%2NCommand I/O error%2NIndirect file open failure%2N%VA%2NIndirect command syntax error%2N%VA%2NIndirect file depth exceeded%2N%VA%2NI/O error on input file %X%2NOpen failure on file %X%2NSearch stack overflow on segment %2R%2NPass control stack overflow at segment %2R%2NFile %X has illegal format%2NModule %2R ambiguously defines P-section %2R%2NModule %2R multiply defines P-section %2R%2NModule %2R multiply defines xfr addr in seg %2R%2NModule %2R illegally defines xfr addr %2R %P%2NP-section %2R has overflowed%2NModule %2R ambiguously defines symbol %2R%2NModule %2R multiply defines symbol %2R%2NInsufficient APRs available to map read-only root%2NSegment %2R has address overflow: allocation deleted%2NAllocation failure on file %X%2NI/O error on output file %X%2NLoad addr out of range in module %2R%2NTruncation error in module %2R%2N%D undefined symbols segment %2R%2NInvalid keyword identifier%2N%VA%2NOption syntax error%2N%VA%2NToo many parameters%2N%VA%2NIllegal multiple parameter sets%2N%VA%2NInsufficient parameters%2N%VA%2NTask has illegal memory limits%2NOverlay directive has no operands%2N%VA%2NIllegal overlay directive%2N%VA%2NOverlay directive syntax error%2N%VA%2NRoot segment is multiply defined%2N%VA%2NLabel or name is multiply defined%2N%VA%2NNo root segment specified%2NBlank P-section name is illegal%2N%VA%2NIllegal P-section/segment attribute%2N%VA%2NIllegal overlay description operator%2N%VA%2NToo many nested .ROOT/.FCTR directives%2N%VA%2NToo many parentheses levels%2N%VA%2NUnbalanced parentheses%2N%VA%2NIllegal logical unit number%2N%VA%2NIllegal number of logical units%2N%VA%2NIllegal default priority specified%2N%VA%2NIllegal ODT or task vector size%2NIllegal filename%2N%VA%2N00hNNl1DATADATADATADATADATADATADATAIllegal device/volume%2N%VA%2NLookup failure on file %X%2NIllegal directory%2N%VA%2NIncompatable reference to library P-section %2R%2NIllegal reference to library P-section %2R%2NResident library memory allocation conflict%2N%VA%2NLookup failure resident library file - %X%2NIllegal partition/common block specified%2N%VA%2NNo memory available for library %2R%2NPIC libraries may not reference other libraries%N%VAIllegal APR reservation%N%VAI/O error library image file%N%VARequired partition not specified%2NInvalid APR reservation%N%VAComplex relocation error-divide by zero module %2R%2NWork file I/O error%2NLookup failure on system library file%2NUnable to open work file%2NNo virtual memory storage available%2NModule %2R not in library%2NIncorrect library module specification%N%VA%2NLibrary file %X has incorrect format%2NResident library has incorrect address alignment%2N%VA%2NPartition %2R has illegal memory limits%2NInvalid partition/common block specified%2N%VA%2NTask build aborted via request%2N%VA%2NDisk image core allocation too large%2N%VA%2NInvalid window block specification%2N%VA%2NTask requires too many window blocks%2NTask has illegal physical memory limits%N%P %P %P%2NLibrary references overlaid library%2N%VA%2NTask image file %X is non-contiguous%2NVirtual section has illegal address limits%2N%VA%2NFile %X attempted to store data in virtual section%2NResident library mapped array allocation too large%2N%VA%2NInvalid reference to mapped array by module%2R%2NEnd of file reached before .END in %X%2NSymbol %2R not found for patch %2NSegment %2R not found for patch %2NSupervisor mode completion routine is undefined %2NLibrary not built as a supervisor mode library%N%VA%2NSupervisor-mode library reference error%N%VA%2NIllegal system size specified %2NConflicting base addresses in cluster library %2NLibrary %2R not found in any cluster%2NIllegal cluster configuration %2NCluster library element %2R does not have null root%2NModule %2R contains incompatible autoload vectors%2NCluster library element %2R is not resident overlaid%2NSegment not found to address round%2N%VA%2NLibrary build not requested - ignoring option%2N%VA%2NIncompatible OTS module%2N*e"**=RJ w f+2$7! r -:w 4"&f e"= <%wŷŁ (e"((=RJ w dECh= e-- $ ' J -7" ,a(Q$ H"7`&wwA dϡ D |x,?0?0 W  &[q W 00NM3eaekTITISYSYSYSY0RV+.00l SLP -- Command file checksum is %P SLP -- *DIAG*-Error in command file %X checksum "a  abpd $ef  \5  X75-H&  "P-7(&`¥¥¥ ¥¥ef  d w 0'f `5 V?% %%5@)5:5@2 5 *  @@-n% n'E@` 5 q-  55 .(% % W ''R Ћ &e$ Bl &-,-$ &" $&50  & `:-62 &E ` .7 .p$E  w % E DW!!  l `h  !! %A % l!h  % F !%*" ~8 D% <% 4% w47w n )5   5 V J $% *` 0e |55 ~hp5p -B ɋW W UB 7 : -"E05*w UB - Х U B B 5EeЕ  Е - 0" ^ @AAŁ@<(lxPDC@@UE  E  &@AU@@U w !-. 7 7  -ĥ/7 $ ĥ, %#ĥ;ĭIĥ ĥ 7 ~ x r    .  @. < 00NNl1DATADATADATADATADATADATADATA45 r # !?5  z# !/ d!E ` 5@ 855`# L!` eB$&< !w J @pdf , !B$ĵ4ĵ!%'% %E$e@ P    e e  e & ĵ V 11@ b Be w ?  - P !> !   (  ` E  ,%:` j-fZ7 7  N)w >F w < 6- :BC ̋Ԥ D(7  5( 7 w p6R" ,4":B -0 # -   w fm^ 7 X6wH  B 7 84,6w"D  ٝ 7 (% 7 &fwtp 7 h7fj @,q `-KacJE[ !m*&@  ) L R  7 f@  &  5]U E :&@E A  ̆  E vE cXV A<9 @  . &f   F 8  8  " .$   ̥ZḀ90      & & @( f  e ee e &f& v `T<0BSYVbAUgBFgCMfCSfTRfSQ fRS@fNSf,7 SLP>Z&Ip 6 U u !!7!\!s! NSY hDBfSPg &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e f** aB ¥*W W c@ %w 5 funhj uhdB$ 0jwaw< 8 v8w &  J*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 .jjlj ɥ@@aujk,bp d5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ lDlljaCeH###33 & 8 *(w  8jDl@ TeBT85l@ @( D eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@00NM3eaekSY hAUgBFgCMfCSfTRfSQ fRS@fNSf%N%1R -- *DIAG* -Open failure correction input file %XOpen failure line listing file %XOpen failure source output file %XPremature EOF correction input file %XIllegal Get Command Line error codeI/O error command input fileIndirect file open failure%N%VAIndirect command syntax error%N%VAIndirect file depth exceeded%N%VAI/O error source output file %XI/O error line listing file %XIllegal switch or filespec%N%VAIllegal filename%N%VAIllegal device name%N%VACommand syntax error%N%VAPremature EOF command input fileI/O error correction input file %XIllegal directory%N%VAI/O error command output fileIllegal error/severity code %P %P %PLine number error%N%VA%D lines truncated by audit trail%N%1R -- *FATAL* -%2N%VA%N(;,!ȁ",!;8ʆ8,8!ȁ",!"/L!"/ "І!";ʄ/.".&P"/F".."Іh."+8`"+`"̆'&15ew , Bv     5Bw "+,\-!-/ D- E %     U EU -. 00NOl1DATADATADATADATADATADATADATA5  5U /f" .`."@-E U *5@*& E& & f&ËDef Ë )̋U&f &  m  f A N  %&ff  ph0|$, 8@DXL<H|,''j W  &[q W lTITISYSYSYSYOV0lZ00SYl' @ ZAP>P _'|bd  ` MX|7$7" "77077& J- L* 7 z5x&fb  N  600OM3eaek wX3wm@  JEe  E Jeww7z77r7pnhXhlfTe"eN@e7 64 6.e"/  57e7X6e- w 7 7|7 ~ 7rjm^bdR Df f &f &ff , w l5 funhj uhdB$ 0jwaw< 8 v8w &  x*AdBbAep& f  L P aAAf@pnp 2C*8֋ 88*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ PŀajTI& af* n*`V @e,w jjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@  DlljaCeH###33 &  8 *  w R  8jDl@ TeBT85l@ z @( D eB& b  & @# R & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@wJ54 @ E7 7ffd :f 5h X R%G  3 ,  &@ N`fd f 5 eew ͇   %f  @   w(a62 vp7n V ber e wVa5  et Ne `w fɋP7w4 @(6 vl(  e.e e   ݀f z  v06 2bE Z V REL J @e0? .&  "0  No such relocation registerAddress not within segmentNo such segmentToo many argumentsNo such internal registerUnrecognized commandNo open locationCannot be used in byte modeError in file specificationOpen failure for task image fileError on command inputI/O error on task image fileNot a task image or no task headerVerify failureNot implementedSegment table overflowv0LnZAP -- (@'&1 >  &5ew (, Bv     5Bw~ 00OOl1DATADATADATADATADATADATADATA5  5 2  UE . 6fE U 5@*& E& & f&ËDef Ë )̋U&ff  XX| X, T0 ,X $L8<HAB6RO6LI6wh 2 7 7 7 7  # , q G0 b `a \*" L ȕ D@ȕX 840#5# R e|ztr ea   2 ,wwZ m  B  e -?.& & AmJE7VVN J-DD w  R  w  ww ,#a e 7  6 %5 0 0 0 0 0 0 ewd<'  '5@$wX5 (|W  H  ?mp f@0 0 0 w7 ,  W  5 7 77   7 d& 7 7  p 0 0 0 0 0 e-f   x n7lZ-VL F7lD @8 27 .e2"6 6 W  5 5   C`D`TE`P ?6` v`  v`  l'˕5 7x7v > > 3@W˕5 7: > > 3@ :e  ׭ 5 AwHf  A  ?m>p0 0 0  M˕5 77 > > 3@ ~eVR ׭ H0 0 0  <׭ ?wx˕5 7 > > 3@ e  ׭C 5 AwH  A  ?mp0 0 0  peHD ׭ H0 0 0  . ׭ 5 ?e   te Clvr0 0 0  ׭- ?ee,  )hf !Xfe Hf 5@m, 4 ("N 5hD' * < 4R'  p'  d N ' ' N - N  r N N  B  '  @ ' r e%w B e& $& ~ew)  J6E?`e *6e 5 Y m   @` ȕȕ 5@ ȕ 1 1  -xze 1 dde 1%H he>-:w v $we N  [ E1 qle 1 e 1 `   ɕɕɕ5@ ɕ  ep-lH   Z % ]Le m@?622e f11qle F1 e 01 ` ɕ 5@ ɕ  e-   e 77 ~~|e l @e\e % w. 8%e"  n % 00O2O3eaek RootI-space rootD-space rootSharedI-space sharedD-space sharedI-spaceI- andD-spaceOverlayNo disk allocationNo disk allocation (I)No disk allocation (D)Nullh&j&p&~&&&&&&&&&&''ZAP Version COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1983Segment table: @8< wv  5B`  w~2/      5@         @!   &  ~ f      :w47 7  7 7 7   l"@@m@  m @`7 z"  l" x7 o- \ 7H" 78"F 7@ r"n"# 7 "7 ^7 \D4>;8N<F0( & -R - e8"" 7 ( e*"7 w   |" 7 f.  7  mx +Ef5\T 7 L 7FW 0W 7 2 @`7&0 fɋ ɭ@ f7" ""E l#w\ m l2# ` iW  5f  7 Z7 TY@ l<#bm@X67NHm(@o*$ m*e7"5,( 77 5 7W 57w#7 lqt n wL-R > |v 7j% b= jXEe0 Z, R@E :8"wN-"(_  @N  > N f7 JeA lH#8"0 H"1-  8"0 H""-~ |8"xH" -0^   D%w!a 4.E N5   *" H" &*" j N#% 7 7  wEm lr# ߨ : X:    .p * , R L8"  % $ 0 *  Μl#  w lx#NN N N N @ pne& ! e e" 7 7 7 7 w -H"- 8"  B8"  D8" :,;+-*.CQ$ACFHLMQX ^_@> 00w  5B`  w2/      5@         @!   &  ~ f   f @w    3f f &f &ff Pw   * . j    0 0     %& & i& 3 hwfh  @fR e w`F ew *  @f e nw` ew e 6 e       f`f&  e|ew  @ $     @Ҁ- , j Bԁ B`m  B    ȋ  B ɋ  f- R   7 7  pAz pt f-  W  | -@   Jl 7. * 7" W W  fF 7 m  me, @w@  7 ,b & "%  wAlAbeBeAbE ld 7,v,,0 bw@ fNaeN!whC -r  ` \ 7 Z 7T H @`@ E #@& eg $  %` (]Bme Dl% lvfe 9 6v  a! W,& f f 6  a %  )D E& Af ^e% Le wAmeC " B @AlB`65  D5 f  e 5CCl5C5 W, Clb"  5 `5e  D`  &f+ f& %) f&&& e vva e ewH t4 ^< Bf& . ( `e C  JewmBD 2 @  Nm L m ,T 7lvw0mZB\ @7Z`VR 57>7`:57.5&  l we (7 "6,b w  Zv@` @ d  7 E eD   e w@ 6v 6t &lb`e 6 `Ѥ   eb00 @    W  W W | en  hb `w f v C W!W! mDm  6 D!  -m W!p  ,%w6    %w eEmp7  b mT7 -@ d.** w "wА `-w &    eEB K  `ww w a  $0<PP' RPT>,8,8,8L& ERLRPTnf6v~@^'&1  ' ) D) x- . ~/ v1 n2 f3 ^5 V< N8 F8 >8 6: .H: &T: 1 (8 (9 4T: 4> 4? 4@ @5 L2 LJ8 L> d! !5ew , Bv     5Bwn 5  5 2  UE  ~ VE U 5@*& E& & f&ËDef Ë )̋U&ff  X1l7D!l7#1(@'84*8t (01`L81$@dB!pXCX" d|OX"dpS! XdZCZCT\C00DOOl1DATADATADATADATADATADATADATAw   a@`AB S  & New  5AEA5 ef   N @ew,5’ @  B@A  @@P5e 5c ׯ( A xE   lX0 47 A ^ J l  , D 0 R EcEc   .      EcEcwLwaHe   &w!.w(A@  ! ln0NBe  eeW W  ~ tf qeW W  V L  h j e >}     ~$H r{ } "}e wDwa@e _4 EYe f wwae Ge @wwae9e8 : B7 "4 v1@mApEm" J  n p  f j r  R   - wJ& ^J, 44 ~E  m? m< FAeW W   b l   FW W  6 *       ׯL v6w0*"pC7mEme AAcBEEb E wwae e XBlAb E B!5AAeA! 5   E5EbB!W#T wLwaHeexe ,AlBEEb \A! Ec A!W"\ \ wwae n      EcEcd f 4 ,0 vee le2# YDe1@m.BlCm64lC  n& N 6 5e eEce#ʆ5 W# Z l65el 1, ~eeEc Ecef@ l0 1 & \*  W  f > xf f z  f x f x w t b  Nm  `f .ew  a& X vA`f f&& f& ew&& -`   `  @!L Z 5f @%f e m&E&  ew|0&  a \$          m"'  a@`Em$@ m*&fE& He e &a pewٗ-   z   l055  5`  f  wt   &af @ 4 , ,,"  e ! B` D` D  ҋ  D ыR     l0D (       f ewj@A %  `M M` @ A wH w@ABC% % % %  `M u u U`M u `M `@ A B C w   M u @ A   w  @M u u u @ A   wf   @ A D E !  wTe&&&&  @N v v v @ A   e @aP P P w      f   `ѕ- ae0ѕ-ѕ1ѕ9 4 ѕ  ѕ: ѕ: e e/ѐe:w:    l1 1     8f N& `e ,1  e&   0    Ff&& Xewj :Ee0 9e Ҁ e0 9e %      w զ)@  lB1 `V  C @6 v 011/5 $1    B < @D C  QP   f e  &   %w$r  lL1 00LO2O3eaek<BCwL 42- `ׄ @`eBwa     Be&& ` e *F`Bflrx &06<BHNlrrrrrx~BJJJJJJRBXXXXXX` "(JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC  &&,Z<`ABCDEFHJKLMNPRSTUV 4  x2 4 6 (; (= (= 4: 4:A 4NB @(2 @; @< Ld7 C @C $D |y(! 7  lwwP RG 7 -7  P& 4e - 0$7& e  T555@ w8eCTL>SY:ERRLOG.ULBLB:[1,6]LX:[1,6] z nCOMMANDINPUTOUTPUTUSERREPORT66667RPT>V2.00xP4&B ; < 7 7 : z:w R5 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f  r P aAAf@pnp 0C*8֋ 288*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ vŀajTI& af* n*`V @e,w vjjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ 8DlljaCeH###33 & :8 *299w 8 8jDl@ TeBT85l@ @( D eB&  & @# x& V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@wǀ  5 P `˵c5˵ (ˁ@ 4@*   w׀ %58 @`1  $ Z| t   zL-Ff Е Е f& xee nwh& DVVN >e $00TOOl1DATADATADATADATADATADATADATA ,X L8<H & & @( f  e ee e ẁ   r 7 FDM 8,  8, 7*ږ%: ܎ w۷eB$& e*aɋw~ wrɋ& @   fj 1 4@5 7 HځB  <<7 7 7 7 7 هwʂ m 7 ۀ :w ۷7 ڀ ]7ڷڷڷڷڇwf  Ԝ\Ԝ]^ Jԕ:;& b@&f& H J L   ԕ.N   ԕ;P e7هwɀ @   B  * 1 7 ؇f   `p     &  m  f A N  %48, \ pE &a? ( BՀ  e fe?E?@m & f 6Y w` )7 p@  & n f V C5l  1 2t $| pBm/ X2, D1,  0@ lN81  v#@`"oBl Hl f@`"` [H Xx1RN5 f T 2  `f 1 /5 ~f  j D`# TC ce  p 1# %B5 f   C   "N me `e  D 66 cH@ e%)w@m$:6  ~$ Bݰde eE` 0 ee@ l^8# &  N`N`  6 ,&e e 6 e t@B` E @  5W    E @`ʵ B`mBܰ  CE ,  Ecl  % * 0 6` ^\ܰmH6e66t8  v P>   e2 e f t , ( m CCmeC!x@mmBb@& 22%e%C!WBe  eE`bee@ q   r$ XπdEc@!$ 8 j P   &f 8N &EmeZF *R" TITLEERRORh8n8 4T: 4< 2C PC 4Ewʀ p  l6> · -& - ef V  6e.f 0 f 4e% f  wZʂ  @   e0ɐ e  @wUWX5P >F*>& :-665 ,".-"+'    7 H Bۇ   ~-nm؇wȦ)W W W &>.> f 6  Gl:>@A P@A P@A P@A H@  @TTTR@BDQBDQBDQBBQ  6 v       Z W R Obu u u lu u lu l  - <L&> j,@- @ P D 4.- @ ,MDC   f Ԗ%  N&&N e$ ew,&>f M u u u -# ff e w vC jҀ  S   : &2`$b&  m  f A N  % & & @( . f  e ee e 7 (  0ڇw ك C,DA "B@ @`H 7 w "J@wNʁEB`&  zJJt wl"HleD Db1q< 2w. " Hl!plHB 5 fئ fN % wR  Bm @؀ b m    0 lhhN#  HwP wȃ #`   ˋl`b@ f Ab  7ׇwȦ)m6 0 4&ȋ+lDaEcm!a ԁf6  R b& (%c    %wǀ I l@l@l44` eE`Ba CeEC`bc @ eec@  ʇwBǁ1 B` eE`@@b 2 ewǃ rւ  v  J X ,  7 4.ַ*& R mևw T 6,lw  4&ɋ p 1  ,  @ wLƁ C       l  H Z ɱf f  r& ef w Aw f  w &1-7C"A   p!l7-RwLwLwJEǷ x("Jwb  @&ȋ  A  2   f@$& r1  wĦ)@e7 &  f W e@@ vwN7Lw`HDe7 z &r  e O :e!5``  `㉐   3 &fD Fs3 eee  xenҨҖ%f    @7"7ӷӷ7 7 ӷZ \ v~ hƁ B v   @Ɩ%N B N Z eAmB łBl Ŷ`eeDDeD!  I`etv! f 65  C 5 av! D vf Z eC *Ԧ . 0 aef   x pp0l BN`& N F l 1l Ae B ǎ %DISPATENTRY&  m  f A N  %00dOOl1DATADATADATADATADATADATADATA & & @( f  e ee e w@ ? 7l X   l?t   eNP* -$ 7  *C 5L  f  & Ж%  &?f& eRw -   7 , e@? ? e0#9e T  P  L  H D @7@ e@: w4 w2?$ m  6e7   wπ  B 5 lӗ- 5(@7f^b"^?TP LZ    5A@ * 7 ߇w8  N z v@mp7 f .7 X  l<< 4އfZf  7 ޷  2 7 " ,7  N  \we w 2 /BlAlD b ` `  &5   a  )`  l? x" 4  &aa $ a \e %f) V P&aa @m6  Ж% fm e  .& B 7 @ 7 fW,ɋ4  w`   w 7mw̦)W!  6v -r -l  0 z`0w < Ж%  C 9 0w lw> `\  C W F W E88 D(@ l?7$ W FDzW Pu epW F LW Pb  a FZW C  %   G  N7۷W S L5`-T, P 7HeW L  $ W P  B -67 bwX< Ζ%ww 0 Bԗ ! w <#W!"   ~ eE-Tڷ \ 2ww ԁ w`-T d ͦ fF ^7:e wBʦ)tt `   ` eE`B    ne2  ^ |N Be   6a % ͖%w~ɂ|m ) W W ~ ^ W ePEJ-FT ٷ      & 7eT ṅwB | NB&  \N& &  :`-T e fN ,7Fef& h -,  $   ,8 (  &  ̖%  7  CeAEcB < EeB!   dEc f fBEmeAAe \A!  J  $ @ V`Ec x xx ~n@& #B` ʵ ʵ  F  80T ԃ       N D DʵՃe` ' e W   P @ DW  W    jEmeEc%fbeZ7 L ewB @eE@a ( AAeA!   weeAAe | W#EcA! PN& %wleeAAeBEczÐ  a 4    EA! Ec A!W#  Nf  ewa 6O&e vҐЕ[m / А 0 Ce:АЕ:/ PW 0 e:P Е Е Е Е]Е    ( e. & "* bޠ2C ZޠPC Rޠ4E&  m  f A N  %000lO2O3eaekw 85m&&  X6e"-  C P e   e f6   f6   0  l^@ ԇ   f vݎf& ewf  `B m Zς `B lt@B` ɵW e<QBaCa 5  @< Da @ D @ D E& NUe& NU D a"K `@#  r@ h ew XC` 5 5  (5 5 5 f &@e # -  @  0  :    5!Jפ-G`!B@Ba JȢe@ @&A#@B eפ-  ll d 5WW d5!!ע פ: F5<! ע פ:  (5< fפ  f  0W   @`%wf= P eff 111f &ew~af \ Er@ 2 eKkW"  aDn@ T En@ N t eQʐN h mm Jʵ : @`C@ Ð r2 aa a  < 2< 2e  0 f  @ e p  : \ \ Nw af  Bai*Cava>  Z5 ~ K J    D ew  l@ x 65 awf ta 6  C   S   p8    fv``W  (f hN&f` ~ et n     `; D    N`f& (e 7B 2  B`  &f ne ^ x  Bԗ a z %ewɦ)& & - v6v`   v6v`   E`D`  D!"6  # D!     He w b  J  @C`B` 6   $ - . 0 ; A Z _ a zۃ [ פ] " פ" @  %w l@@T `f Վ f& eP@&  a  R@ !\ e `&&E f a ef * f ew a-d xʗ- hʁm? ;&( / D!0!9"!A!Z@!a!z`!$ !.!  a %    ew> @&  a a$&6   -v    +  l Je ( !0!90 !A!Z7v l Ʉ *D @ 5 @P P P H  $f ew<  l ȗ     0W l & @`%   l@ Pȇ  F z 0 0  &  @ 0 0 0 %wZ &  w"   M u @ A -#  w   @M u u u @ A B - #  wf   E D @ A s     u&@eH p p eH p eH c (.Q<[y1OJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC 28R r2 4:FV@P00tOOl1DATADATADATADATADATADATADATAw  B 5 d- 5(@7^VZV!LH DZ   5A@ \* 7 w0 ~ N xr n@mh7 ^ .7 |P  d44 ,fRf  7   * 7  ,7  N  Twe w 2 /BlAlD b ` `  5 z  a  0f E&" &! V& T 7 (H B" N  Unimplemented error message-F- pX" |X" 72MODSTART, Starting module for execution not found.%STANOTIMP, Statement not implemented.3STANOTVAL, Internal error - invalid statement code.LISTNOTLS, Group referenced in SEARCH statement is not a LIST.HLISTNOMAT, Too many expressions in SEARCH statement for referenced LIST.CLISTNOEXP, No expression in LIST for corresponding SEARCH variable.MPOISETMOD, POINTER variable is from wrong module in POINTER ... LOAD or MOVE.RPOISETGRP, POINTER variable is not from correct group in POINTER ... LOAD or MOVE.CPOISETSIZ, GROUP too small for POINTER in POINTER ... LOAD or MOVE.=NOTDYNFIL, Dynamic file operation performed on invalid group.AFILNOTEXI, Internal error - declared dynamic file does not exist.=FILNOTCTX, Operation requires that dynamic file have context.HDECAGAIN, Group in declaration already declared. Redeclaration illegal.JDEFCASELS, No match for control expression in CASE conditional definition.&DEFNOSTAK, Declaration stack overflow.8DEFSTKUND, Internal error - Declaration stack underflow.IDEFNOCONT, Attempt to access data in variable in group with null context.CEXEINVCOD, Internal error - Execution stack entry has invalid code.6MATDIFTYP, Values of differing type cannot be matched.6MATVALSIZ, Values of different size cannot be matched.@WRITEACCV, Attempt to load a value into a non-writable variable.=VARNOTDAT, Attempt to load data into a BIT or FIELD variable.0ACCUDFVAR, Attempt to access un00|O2O3eaekdefined variable.INVRADCNV, Internal error - Invalid radix code for conversion.-VALUETYPE, Value in expression is wrong type.,VALUESIZE, Value in expression is too large.3HEAPOVERF, Heap too small to hold value. Overflow. VALSTKOVR, Value stack overflow.:FUNWRONGA, Incorrect number of arguments in function call.HFUNFIELDS, Invalid conversion code argument to time conversion function.8FUNSTRSIZ, Output string from string function too large.DFUNQUOODD, Quote string in STR$QUOTE function must have even length.;FUNINVPOI, Invalid string pointer value in string function.DFUNNOTCHA, Argument to STR$CHAR is not in valid range for character.FILERREAD, File read error.FILERWRIT, File write error.FFILINVCOD, Internal error - invalid file code for specified operation..FILINTOPN, Internal error - file already open.FILERCLOS, File close error.:FILERSPAN, Records in file are not allowed to span blocks.4MEMINIFAI, Memory allocation initialization failure.CMEMALLFAI, Memory allocation failure - insufficient virtual memory.d"""#B#f####$P$$$$6%d%%%%$&n&&&*'p''''"(@(|((5- 0 ~ t -&" -P  w  BlAlB b`e C  f `%7 wl 7  N 0 - :, Ze@eeN&b ^.N&P N &Nf  e w&  , *er2 e, Z -RJH 6 42 6 ,   d-  TR- t D <   2  te 2 e \Xe m2 e+ x N ~+ d@& ~+ PN` FW~+ 6~+ .N` $W~+ ~+ N`  B@@l  +  \ %@f l AAl @.  w . tN  : 7  ( 4. @  D. (  @7 :  wۂ N` W~+ ~+ Dle ע~+ ~+ ߃ x. .  ~+ rߎ ~+ d@m N ~+ Lߎf  r~+ 4 b%f.   .   w NN eh ` wڂ݀& ~+ ހ t,  ~+ ޗ  ^. tގ6 . +. X@@l A .N` 0W~+ ~+ @@lb. ގ 2 . t l . \ T  / R  ~+   ~+ |   6/ V |~+ >d d~+ &N L */  0~+   ~+  ^ V -6/  2 vd/   ^ V Ne  Free Module Current Start CALL Coroutine Conditional DO ..00OSQ3eaek. WHILE DO ... UNTIL WHILE ... DO UNTIL ... DO ENABLE SIGNAL SIGNAL_STOP ++++++++++,,Numeric String ASCII RSXtime VMStime Pointer Logical 4,>,F,N,X,b,l,&Error occured while processing packet The packet size is (octal). BSince this size would cause the packet to span the block boundary,@the following dump of the packet will end at the block boundary.$An octal dump of the packet follows:Execution stack dump:2Module name Procedure name Entry code Offset BlockDynamic memory allocation:(Type Size Mapcnt Name Ident CompilerTable Files  Error - overlap (bytes): Dynamic files:2Module name File name Code Size Recsiz Records Title Error Value stack: Entry Type Length Place OffsetHeap Module Unknown Unknown  Size Current Max usedGeneral Statistics:Execution stack Value stack Value heap ,Maximum heap used after garbage collection: Heap garbage collections: wwwae0C" wV``AE5 e5e5 eE` `AE5e5b& f- -0C7  $W  W  PwCe ^ pAAcww` w wΦmΠewfDb`w|w`x n  A!5BBeB!5  z&  5EcA!W# ~eHwwawa -C Rnj͇-Z0C  ,J77e:f , l͆w`́ @e  EcEc e 6AAeA!  ¤ S@Bll D` N` x``C``7!Z%W vÖ% Bԁ `e  Zӕ'f ӕ'ӕ,  -4Җ% ׯ ׯ 8 0         7 t·W W W  ew  w407(w&m wme  l V w   x f  hʇ 24< *4:z_M,?? W  &[q W ~TISYSYSYTICL00UQOl1DATADATADATADATADATADATADATA0~V00,7 r ~d7 v,   r6 | Z.:( e64 e`% Bd6ߵ4B 6 4  5@6  vp `ߵ* 3sœEa," 6<C~ \e6 j".r~@ܪR*zz_M`   (  wHrʧ PNH $weli& &&& D  p2(&  r&  0& U  57 h5@E@ 5E 5 E~   p zE\j  -nZU.f- E w Uze  0& sU@ze r& s5   杧6~ w e  j& wp5,ee? EL8 ,f) ff. X 7 7 wC~@ 7  %    ݹ%  w f*  ^ f+  Hf/  *  * ww :w 8P0,B  <6~ \wf-  P w>e $w.- e (r TVR842. T fd`^`^ZXVTPNEL V p~# bfF *TV rw @r  @4  f7     *  f6     Z  P -<(&" " E6~ >wHe  fH  fG w && 800]QSQ3eaek#-&& FFFf    RB Ee`%  D~% b ^ `⭇% *DIAG* *WARN* *ERROR* *FATAL* I/ODSW???= -- DDE-fְfEĥЕЕ Е Е v?d ^ P Е.Е %  `-h7be~ A ְ& & &  &ְ& & & Ε )Fe `M f&P&N&L&J&HҰҰ&^&e\&e*+ϰ̰ F   f  f V eq q"9q,4&& & 00  & & & & \& & V& Ε U)O  n<& ff& Z& V& Ε ) *eq  f  hTf  TTf  @ Hf  , LB0:[1,6]SYSSCAN.TMP;1l xSYSSCAN.TMP;2zSY eBCrrU>p (f# f @ ^ z   b f  & & @( f  e ee e &f& v  GwBȹ޹+·Wy߷5۸HUAB not found in listNo startup transaction foundExiting due to errorBad transaction length.%N block(s) of secondary pool may be lostTransaction not in secondary poolUAB listhead not zero on shutdownTransactions follow SABExitingOn scan file openOn scan file PUT$Error during scan file renameOn scan file closeOn scan file deleteCan't write transaction fileUndefined message number %D. at PC %P Directive error. $DSW=%P PC is just before %P FCS %3A error code = %B %Nfile: %2A%O:[%3A,%3A]%X Can't close transaction fileCan't init new blocksCan't init new blocks. I/O error = %BCan't write attributes. I/O error = %BCan't write attributesCan't open transaction file (by ID)f&  m  f A N  % ldT00eQ#Rl1DATADATADATADATADATADATADATA||,ŠQW  &[q$W 2TISYSYSYTI>RTISYSYSYTI( H#>||A B C D E F H J K L M N P R S T ~*,.DLjln $&.$"pR tr دE5 @گ&` ,1ť  ť/wrwt wm ť: 5ť/  X  ~ D Aw, N& ~w  x b,  7 R 7 F R J& C4@   '7HmxB5<76mb0 ,?!& [mFE! M Մ   rB  >,7m5m @@ EE@P5@Q7mߊ@] @ lU7.& NBw tw\ @wp A W X f7 >¤2  ,   2 2   v- wA@,A1 `   @w   Pe   nFwh @e-H    44@-5 & 5E@ ` P  T C - 4w-~x,x hЋ1B2F,e f f& Df lΊ SbDS C&N` b Mb b"Sp55w0e ! 7  wV%e "4,HX$X>XX5 L<#w ` z[= lTR  NMť=J& @F J ť/ F0 1ȕ ,XP ť/ 00#RSQ3eaek   ec~ j ť/ X w H7>7:7 "~ )  # @ wA@,A1 w|[| ܪwXwP ť Ћh,,    h1, .J $& !,  EEB!B-  ,!-  EK-s-r Z[wd7 2 W fW hW    % ȹ    % w"wܫ  ܫ  & $ , 2N #-@C #C(#F5C h%-( jХ$@ %O" 5 $% I JwwK(z  Q  * ,5   %  džr Hn  5\ $T -D -@ > , \ " P t ȹ$   P  ] E& ~w %% wAE7 A  Deaw7  7!     *  w<77 & U < &&f DE%\  , Д > 7 fLť  : wd ,B0P$)wf)<Е[  P Е,  B Е]<7Xw (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA \EAa$ & & @( 4f  e ee e &f& v Command I/O errorFile %X not a valid driver task imagePrivileged commandI/O error on input file %XFile %X has illegal STB formatSyntax errorDevice %2A%O: not in systemPartition/region %2R not in systemDevice not mountedFile %X not contiguousOpen failure on file %XTask image I/O error in file %XPartition %2R too smallIllegal driver task APR usagePartition/region %2R is a commonDriver already residentDriver being loaded or unloadedInsufficient pool spaceLoadable driver support not in systemDriver not loadedDriver cannot be unloadedDevice %2A%O: is attached, busy, online and/or mountedInvalid driver data base at offset %P in file %XDriver built with wrong executive STB fileWarning - KRB %3A interrupt vector %O too highInsufficient ICB pool space for CPU %1AWarning - KRB %3A interrupt vector %O in useSymbol %2R is undefined in file %XSymbol %2R is doubly defined by file %XIllegal value for symbol %2R in file %XDriver dispatch table is inconsistentCTB %2A is not supported by driver -- not loadedCannot load/unload a pseudo deviceToo many symbols of the form %2R in file %XCTB %2A does not existDCB table for CTB %2A is fullKRB table of CTB %2A will not accept KRB %2RKRB %2R not in loadable data baseCTB name %2A is a duplicateWarning - loadable driver larger than 4KPartition/region %2R is not a commonKRB %4A is not offlineIllegal use of partition or region %2RPartition/region %2R already loadedPartition/region %2R cannot be loadedPartition/region %2R cannot be unloadedPartition %2R not in system, defaulting to GENȱڱ.MZvò۲1Rjȳڳ+\޴ .V~յ$;YĶ)Pt·_ ,0ęsyLB<r 4<>BZ^`bdf\}200#S,Tl1DATADATADATADATADATADATADATAU}4YM6|8<:t!@%Bg'D;@F; H;J;L;@N;%P;2R;>T;DV;KX;@QZ;W\;d^;p`;vb;}d+{pȹ:^ʹ=&̹D:ιL Nйeҹt^Թvֹv""عv?Tڹ8rܹ|޹e쩔666Ԁ747f7&T|TqZ[Mz}U#fUNL -- VECEXPVEC('&1 > > >, > ,8 ,< ,$ ,€ ,| ,¨5ew , Bv     5BwR p-@ D- E %     U EU 5  (5(UW       wE5 E  W ͇5  ,E  &wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&  m  f A N  %&f &ff  &[q &[q, &r >[q}R ,E`Wf|~,?A?AbW  &[q$W 2 TITISYSYTICLWKOVVγb γVγ5wwtf&00,TSQ3eaek 7 TKB>,%   @ %2>KWdp}8(ЬxhXбHgpzW !$<DSYSYSYSYTICL^&TKB -- *FATAL*-Run aborted ZPp@ e     5 2 6 5  J  J 5~ :  2  2 w 5bC ŀ <  B f50  -F <5.$ r : 5 wVp wV Pwf *   f&f 7J w77  `wj w^ 7,\7,T  V0 0  p@    ~ $ $fE7 4`0 Z 0 5,5,  6 u$ ^   1,1,J 1,1, &b e m 7D &8 e$$)d 5w & A 7@m7 *1 C7 pM $ w"   7 /  *w p L7w  X`d VT efA   ^w: 7.w, ~   z& &% N  V    2 T s zew ~   A ~C* 6 w CB  Z54w eC %E& 7 .Bd | wddcAcAd 7A &e Cm  &m`e` ` f`B` JP    *     `p f& `, ,, &  mV  *B ce " &e#r  .(  & eB%e1be1^1\1H1J1L1N1P&&f t h eHD e<w n E  A B` 7pA wL &w E p B B ` p :7~A @ae n fe?E? & f Y :  40 B ` w Vf* E @ jw`RK`/ & D -N  &x  ` *     B B  @`   B` * 2   v  m ` @ (T'&1 V D| D V( V$ D8 D V, DX V |D$ tV lDL dD< \DH T % L' DV` <D) 4L' ,.d $R v V\ D D V . D0 Vp Vt ` VT 5 6 6 D D <6 R@ T@5ew \, Bv     5Bw< 00,TTl1DATADATADATADATADATADATADATA50  (r- DUt-E D  E E ܁ 2~0&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff &f  &[q &[q`D22 2V2( 2D2< Pzrh P$ h.ht$zht$pzh%h%h%h!t$ zh%* h)*<h-* h1Ph@h=PRhzh>T@dhLT|v@hN dhR!vh\!P vhc, dvhj(hn(hq(htT @`hz,%HNh}t*h*ht*<ht*h,%hhT,@Rh4r4rr4Lrr4rr7r7rL@L@L@AhSYxQSYySY^SY~xQSY_SYzjL_LB[1,1]FSYXCC@DALB MPSSMADL`SHpSPqCR@pMA-WI pHDPICOxLI xCPDAFP@MMpGPIPRASQpTRXTpMACAEA HDPM@SL MUFUpROqALCMSEIPyNMxCOxLI xSGyXHpIDpELxFMxCL xSBrFO@x$+29J(&X^j|5b  we w N7 N5 b$P e ˋ   P! " wj w @pdf  &B$ĵ4ĵ!%'% %E$e@ P  7e :e 8e R& ĵ V 11@ Be "w 5 funhj uhdB$ 0jwaw< 8 v8w & 00,$TSQ3eaek *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 jjlj ɥ@@aujk,bp F5f fˇ ȕ j‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *!!w  8jDl@ tTeBT85l@ @( D 4eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ $' % 7AA$?$2$$$LB[1,1]ODT.OBJODTID.OBJ@ w ]R,  wA b."t&%d3 3 ~$eB A  D\ %%5bE5 E5U  Be . 4 j3~$s ]@@MtX7 7 &&$&! &&"e 5'U(7\7^&$ZPP `E@t w  7w\4 P@N xwP$&4 be&ew B@P@P j ^dbj7 d  wj*,B &&&$$ 55 $$$ (b e5 < (&L$7 v R dwhz$&`9 B . ` .,\NL p   BAbpd fwbh\`  %/ -%/*%//$`¥¥¥ ¥ ¥ef tUܱeE $&f$m    b   r`7 7 8 f B7 *H $?x% 7 < UU W@7   f w2P  w wU F~۠wpw7e @ 7 RE^x\7 ,7 *^ۇK w wb      D7 D7 >7 >* W,( 7 7 8# %* 7  7     "%A  r A d7^އ N ۇB && 9? ePHHJ  5@  w  e5 frb  ֆ9` B@&&5 b & & 6 6 6 5 5 5 &65uuuu w d " &w*$Aq#q- 6& ."& &&00,,TTl1DATADATADATADATADATADATADATA֯"(1R7(U(߱`((&3& TKB>l^SY7 $7 je`&  D@bp$$:0 b @ef7D` ȥ;ȋ&% % % % ¥:uu j n & W e)%I#q-'eW &$0ef` ננe נ^נ  A5 ¥;U%E #w (w we) e)( r )e) e)) l  h) U% ¥;¥,Q \ Pe)S#S- $ *I  %QQ *& N&1 &f Je f  7" RRR|AC`e R?j7f% ~'J ݷ" z &e`P  &,@ 3@8K@oMBaTq rt@,YeYxx@Y`Y5 *5 "7 8 7X[<$09AZ (),-*! x'&'&>'`'&"'"'"'7 7 7 7 X7 $ P %$% #%$$ :%B   r0t$Iz &%$U^Z7 XO $J8D5M5IE   $ %ͥpͥ&Հ7 -A# ~ x( $3%2%եJ   H #7 Ewͥ%Jn# $.wȋȥ;!%% %9;5%H1H/H-HH)HH%u& +w %W&%W&  p&%&  e)ȥ:2ȥ./ȥ[,ȥ<)ȥ/&W ! T & fAf J !"%dd,w& ȋȥ-ȥ)ȥ(ȥ* ȥ,  ȥ[ ȥ]  Z , p \J A A N>*,B &&5 b & r&`90 p5@ w bf 6 % e 2 R H6 @5 85 071o?yT''p'''R(T'T'()F)$ 0 77 5E$ P %$ P   $ %!%@5h7H7L 5NW   C 7f`7% 5%n x `ݴ d ppp 6Ue |Ah "  7œEz&5U   5pppp f& fp5& Np5Ufup 7w 2 8< fwX2 5 pppp u  wz z @& ^  wLwe@e 2 f5e  5N  D91 G@ w e & Ne 5U e5 < ! R555U-Pڠ55 8u5f $uw8% *$) \] >eE BE*E  5 &600,4TSQ3eaekz**j*j*j*j*j*j*j*j*j**j*j*j*j*j*j*j*j*j*z**z*z*z*z*z*z*z*z**z*z**'j*j*j*j*j*j*j*j**j*z*z**j****J*R*z*J*R*z*2*2*Z*B*z*:*)*z**j*j*z*z*j*j*j*j*j*j*j*j*j*j*j*j*j*j*j*j****z*.z***j*j*j*z***su$* @,AL%w  5 a' 7 |•! b& va fm܀  w^  f   z hed7Ae 1΋ ^ܿ  ppU@pM (%e p-,  Ah  a  އw vw x l  r7"7,9Z7EA3"3,'5@5E-X  #  B`  E   e3#3-  ܱw &D@'F'D' &5 w t& ۷  7PwT  & &  #% v  / h0  >+ 8+ (/ / * *0 1 5 ^6 f6 5 5 V6 5 7 8 7 7 x7Sw R e wwه6@$  "7$l7d  e p?l7h PAPАP 0wR^ww@ &w$W# w؇Tw57 7 7 e EM M M Mw؇h e  ?7 (PPP 2&(&eeA^  jppp^ p   .ؿ    p  w& wwׇ5 mwXVwPwN7 L, >8 8lw&<7, 7, 0 U a wa wa ULwU% W# wBww R7 \*w& BAbpd fw:h4`  %/ -%/*%//$`¥¥¥ ¥ ¥ef LUձ &fB  +"+  5.U.5-&e&  d ^@ ѥ  u N#N |%7 rmӇ 6 5 x5 p5&  m  f A N  %? @`_?*Units set to maximum assigned^,V,V,=5~xmn  %n V U-V" L1* `,B w,, H`e625*5& F5  =  &wططQD @ 5;5l+ 5`%\"5ݡ**5ݡ**5rՀ*Հ* 7*n7*jش *̂m* ط ݠז*ݜה* Ж*Д*  & & Zd5@tp,$5t, 5   Z cHA A*N ׇN65  5 5 %  5@5 B  f wB sœ  Ow4t6-w. 5 P5       ` `U@w` * B55**U w    55Д*Ж*5  5n 5 w w  ~w vwp jpp545 5@U@p` p`|* A &f!a\ 5 ՇE B B B B   * Œ55**w &fA< 7& % ,4, %&f E U40, U 0,  5 g wihk 5l ** *  * Œfe  * Œ *  7 87 7 7 7 7 .7 &7 .7 7 7 7 7 7D7 <7 Z P F >75? %A A A w \` He  5  5 5P5 @$ d.A   L  AP  feA    Հpp Zw j500,DTSQ3eaek&f& v D v $$$ ++L)ɪyN0tN sN0sN0 s, t ~, , ,3Xf  :,v-v--f w ~ v7| - <5 H 5 v n5@ .   Jw  z w `@e"Kr•@-b Jr5P;r5:6 5K5  `  ȵ d pe 2 5D'%# "-5@  év~he 5@t  5V .PH4 77 0 2PPh Vw2  -p5J%ȕ@@0 @b \ 0@  07f ?7wA  *w ,7  z v * `  d7N7H & Uw >,&  " 7w  f&  #%   7 7 7 7 fj& ~ 6vw7(e"eB$$$e((Z<Tw<L  w<B    0w<&$# `   %% x0( H03ww w. e f6  0 p f^e 5  . 291  N&  0&5EEEEE@E@EE &&fEE# %%2, %U2, 5v C J & P &*  |7JV% J%,D7v*%.?-L15z%e NN l5R.rr .  7 | xCœ5H5µ  (l 5) &5U5U5 EEw, w, m:35Հ( " 55 3l5 5- ,h,be5%ɪ%J';'%Jr;rF w6w, 9eeb 5@4\ Y- U5R5O5L5HUB Z@ ݵ d X1L   w t-l~ 5@   S L7N 5w5ww|ŀ7 ,B- &f  bw:  ՀB 0 H w 7R7wD~7 ~7t. $w\ 6 X T $% ` Lw6E$ µs d n 00,LTTl1DATADATADATADATADATADATADATA wJf P 55 5  *B (r 7bwd  & L()L6 d r0 Հ%V   .% F N : wxf ~7ڵ. ݇w C57(5l ~< H ! & J PPJ  ۇ xt rnf `  "  3,5wR5w>55e5@ 5  f5e w55Հ m0 0  pE0  5H^ Հ m80 0  0 d  ef ` :%h e N 5PHtt 8w m؎  % fV ہ f7 1 5Lf.] ځw` 6f .  ! p` p ; tp p  5 -5@)H 7 4   7  b&f rׄwwV5- %& !5U &2 `   0@  7 w eW! A T 5555 xpՈB ߡ V` e&e nw  Zww jwe &f &w   w & f w P R  Z& ff * ,  ߖ N   !. U 1o 5h0&f& v ##t'v'( $/H/, B#D##z#/000# 7 T \f2h8 f (8 4  857 ,7 $ 7  J  0 h  07`Rf ?7wA   *wL ,7p h ^ Z D * `  727, & Uw &   7hwl  > &  #%   7 7 7 7 fj& ~ 6vw7p(e"eB$$$e((<8w<0  w<&    w< # `  ` %W5@5 Of &F 6vw 77 *7<&5@    n H`     R f  7wv  7  @91  N&  &5EEEEE@E@EE &&fEE# %%2, %U2,  5 d C \ & P &*  7% %,7ރl%p?-15z%e N4 l5Rrr   ߇7 Cœ5H5µ  (l 5) &5U5U5 EEw, w, m35Հ( " 55 3l5 5-X ,,e65%ɪ%J';'%Jr;r w6w|n 9eeb 5@\ >Y-JښU5R5O5L5H,UB Z@ p bڵ d 1   w - 5@   S 7 n5w5ww|ŀ7^dR^ B-N &f   bw: \ fՀB 0 Lw 77w7 7 w\ 6 $% h wxEf2 µs d n J wJf< 55 5  B \, 7w J& L() d 0 Հ%   .% ~ wxfh 7X׵ Pڇw HC57(5l$ < H ! &T ^PPJH  <؇ xt rnf `  "  L 3,5wR5w>55e5@ 5  5e *w55Հ m.0 0  Er  5 Հ m0 0  0 d .ef %h * Ze N 5PHtt w( <$m00,\TTl1DATADATADATADATADATADATADATAՎ  % fV ׁ 7 1 5f] fׁw` 6f .  ! p` p ; p p  5 -5@) (7 X  $ 7 D  0 &f z ߰ӄwwV5- %& !5UR     @  7 w eW! A 0T 5555 ՈB ܡ  re&e wP  w<w wLe f &w:4 ݀  w D& f w R  & ff ,  ۖ N   !p U 1o ߖ5&  m  f A N  %<VNTI VNSYVNSY[gNSY[hNSY?yOV\~TI\CL2VNCL@GhjTXCzb "$ ,3X s,w  ^v P D F> D 4, D "!   U%@eA D e U% (%?%N  DD :6  P?7 e  V  e xb7 5e@5` 5e5@e,e7`   - 5h Z8 2eN,b5V05-h BBbBdBd w@m @bmEW e75!55@e2e?E? E @`eE 7`p  =  e    ,D   fP  aU%N!e =  | D=l 85  x 1 aa < H !  BPPPP *@e"A &v ^A  pp0^ @ dDe"8 >77%ɪ-K'wD-vJ'w8-j;'w,-^3&w -R3&w-F2&w-:#&n Pw H"&   7$w(  p&  #%   )Px")&y@G, xC>cbFp@,1zB?yD5!: L"  # $ |z3 t% l& d5&  m  f A N 00,dTSQ3eaek %6"!4"!8"rzt:"?V" jw DCet BEA% \ 5f&"ŀ550 00 -25 e DCen h-f5XeZ# 5BD5@: $7r&e"  v7xf &e" 5e" w \Z J5@ wrDe" rwx5De" VDe" H!-T 4  TTT5 L5m@55e5 Vdf  c 0e %w 7 l V N7^5X+ RB 54 2 5& r7 h. xmn  V%j  25 tL`! 50m$ b   ww@?  u~~@wprCa 5HS@CwFHa  l& A~m w NwH H 5l*'CwHa Z5H ZH  AB 5rrw5~fe@ uݮ  5 . tj T  7ݷ A~B& ljKm݀&D d  S& j Ee 7 ( p 7  5  v   b5& N  w 5   (  wz 7pZ ^ 7D"5tF H 7D"ۇw  V7 5H  CC @w   w6w2 @ w5  & w >5   P V "uuf7 2@   A  6v L& @@  -5  5A5 5~A5  : l55Ca XXJ  @  .55 B  @ uu|u~uw PHA  f      b 77- v5`5`~ fAAAA R  8uuf L "w ~wxw pwj J rr @A@A 2 2 , !    @@ w3N@ (4`N3N-ل4N6  4`N ew Z T D (;w ]"]\U.5*5& bw `75V :w 87  &5!5 N5 !5 05 7P`UZ5 UF E    45! 5 5 !7S5 5 H X-:  L UA2 $] ] %w-!] A  ff@ $ . uft t5P!7S< 8 -B֒  UA2 |] ] %w-!] A  @ |P  ut t ! w  7 n 5\~ lw 3 <AA , 5  U e   -  n Uf  -  B  "5*  "" K!! D t 5t eE  Wt Fp >n22mh-N fmh r` 3n00,lTTl1DATADATADATADATADATADATADATA h2ln 4h@5pe&e85X&  5 5*5* t\0  @0 0 0  f&  73 3  77w( ( 33 43 t-F* $& Հe33  3   RҀ H7F 55e! ( @ &^ N 3 3 3 3 3  \w @e8 L5 Cµ @@<5858µN~5"5 %Ncc 55  bdcc  Jcc ܖ @`!  @`A@  f  @e?  Be E0`Ҁ  0<"   4 4E @ @ @ 5 553 <% z% & Dڂ "lmЇfP @e"e 8   p L&f  F & pl5 5  &f5 r &5 $5plw plw Bߖ5!@@@  N@(B*D,:."$"" ""~""~ ~x<":""p"""D""""" " "zX""H4R"TxP""6""""5kw dNmMe`xmx !D7hb`#   E|A Y   Ze E  77Е     `z& T5mݾ݇mm5mݘmޚjww `7 577LEb"!0LP U U5xU5dU5`U5L m\ 7  mJ7 " f" "0LP7<m 727 ,7&5 55 m7 m"="  e>77`p `AW  %|W V \ emwe w`e5` d5.em5m "5  vzzܻ&)~  $ 5Dn *7 7 (4 " 77 l Z5O "7 B X 0 "(e7 6 $ڬ 7 7  >%7 %7 zCD5Efm Le  `ECf  &  e&A e   Z E'E@Ce5@> % &%([qe   Ce- 5 7* $ف @e Re?E?  EV  >e" N A @ m$١f rw 6  hb  w2   ه &R""4e00,tTSQ3eaek6($  l 7 Z@` Y2 ^2 b)2 P2 Z-ײ תe wڇP   pT hb   N7 @7

50 0* 7 5eE@`    mb7` \ 8` E^w  .|%  xwz<E B a 7 :&  77 7 w  m777w m5ml   ~m7zl 7z5)m7blw bm0mh 7Tmv7:l 7:w 8   "$ 5$mmw &   07zw~  P &  #% | , w F 6     wL n   8V V& 804e6(> l 7 @ 2 ^2 b)2 P2 Z- ze wxP   T |   h7 Z7 VP RN NT`U2E( g  6&f  m   |804e6(> ~ $p8f&  )` D8 w .7 `7 ^ 7F8>8$ h ,* :7 *7 (0* w & H5& aC|w  7 ,raC`w     R 8f  ,&,L44e6(>  %  U? a 8  8 `7 7 7 7 vfj& ~ >6vwRF7B(e"FeB$$$e((޷<Rw<J  w<@    .w<$"# H`  %W5@5 Of &F t6vw7|7 *7<&5@   T  `  (  h  R f  L75wv * 7+D+P+\+j+`,,,~+/++,,+ -- -*-0--&------//----w z7 7 () X5 t5 f5 ۷ P5 F    T T   7 @%% 8)5@v ^)D lm47 ) W, W,s,  %%  T W, W,, & d [>ۂ` .5 h7 `mE  ) F) w7 2 l&@A 8mPـet s Lk g & .e^ & eT  Q ~ I & e& 4' zx teje?  eE  B B B P   f& e   T& ve#5H"5  &e  ڀ^  v& e7~ &  @A m׀e7Nmv xׁ mew)0& ^   h) w d2 J J D,Db@T&0 e H ق  (  J    w   j1 A `A ~ & e "  (%wL75m) P  je lv  ߂@5mD  45@(  fA R@e 47 #   E     sN  7 | v7 r l؆wmd`\Zww ׂ` צ ^ *  #A 55 5@ @@ mՂ 7 7 %1%o|mtX) J     p`  Z,,  %% 71e- (7%%   ŀ%7%w`% 7 @w 5bwD%wB 75)7j5dU`EQ 5Um    7E  ,Xy 55P   |e55c 5@, )p eEp r &rP   m545X, :5@ &)p eEp rP rP   m\ $) A e  fe -B.  <' v55D RD  B5  .5e 57Ltp 5 7 , j  5  77lw e 7555ll5 & ev7E dEbn V 57 wZP& E$ b5~Z<EVD 0%0%5e" Z.% mB l . 57  e  U5@%J%` fmV& 0mւeeA A )  ևfE @mt5 @ @ @ 55B5m4,5 fE J5& V75m A A A 00,TSQ3eaek ,3X s,w 5>-7 7 7 7 ) h7l 7&fEjEA j `A "$ &5 `eN F (&8) E R e 2Dm& e   8  Dm& R R  hw  ) Hw$) 8w~|5 Lf& <) b)     2) )PH   PPZ) w Dm& $) z7fEjEhwA  vA "$ 5 ,,7lV VHP VH @me, w    rT,` r)w)u u u u C eE P75 5 5 wn& e&b e & l  e hw(E    f eA A* e5"5,$    &- 7 me &r m  d  w P B74 p5@2 #  ` E@ 7"|7 5  J > , z5@ | w,w e8  00  Hw 5@6) 5"8e  v 00 !  r d e d ^5@ 5 : d|$  ~| 7R7 D7 Bw 8 2.mP777w  m 5ml   ~m 7l 75)m7lw mm 7m7l 7w   vxmjvmfr  ߔ  x * `  7h7b & Uw F&  < R7w  r &  #%  N 7 7 7 7 Bfj& ~ 6vw7(e"eB$$$e((<nw<f  w<\    Jw<@># `  %W5@5 Of &F @6vwT7H7 *7<&5@      |`   4  R f  7Qwv 00,TTl1DATADATADATADATADATADATADATAF 7%* ,  5bUwp = E5UB@@P+Z20%A5R w= U% e U%  * % &. 0%M- x0% T - b0% >,- L0%5' "~7 v7 t7 f7 dR 0%|*x*- 4 j- 5* -,2 -&,--0%5 |**+ |*+ ӊm5  ӊmN+ h1+ ^5d| 5p - 45 VT . t* $wXmTZw TmHN  e  - l, , , 5 1 w hf ^0%-ZҪҘ" "    m %\\  5X", -2X"$"    j <, -AC,-AL,-CM,00,TSQ3eaek-CP,-DA, -EA,@-FP,-HD,-PI,@-PM,-PR,-SE, -SL,-TR,-MU,-ID,%N*** Root segment: %2R%3N*** Segment: %2R%3NR-O mem limits: %P %P %P %U.%NR-O mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NR/W mem limits: %P %P %P %U.%NR/W mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NDisk blk limits: %P %P %P %U.%NDisk blk limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%N%2NMemory allocation synopsis:%2NSection%44STitle Ident File%N-------%44S----- ----- ----%N%2R:(%VA%VA%VA%VA%VA%VA %P %P %U.%N%30S%P %P %U. %2R %2R %X%N%3NGlobal symbols:%2N%F) w 0 -B *- \*~F 5-P+.4"   |5.p+ "   T --* 05  +   |5OR@I5J@J@   e ` +5p# 5J@J@   e ` t+ , 7, W, 5e&e85c& P [ :0% ,b w w 5m7  w,7 x e !  rB 240( w 1J p5RaU%U% %$$ , )w dF 0%$; 5 5  tmRm bp5   , w 7 ,s&*-, e"8 ** U  mp**0%   <  (    f  H w "  a 7    RO,RW,D,I,@GBL,LCL, REL,ABS,OVR,CON,SAV,$$$,%2NFile: %X Title: %2R Ident: %2R%N <%2R>: %P %P %P %U.%N >>>>>>>>>>>> Undefined reference: %2R%2N%7S ,R+,T,T,T,,++++++,+Z,w 5w <    *z*  x*B J  + e <x*w e"  f -:؈  x* 5%ڂ` &  : p`  7 >e" x* l JR RRR * f& > , J *-DV -P Pw4;&*/  lh * *& > * 0%   ~t%~V&"&L'L'L'L'F'f&&&&&&J'&&w  (  %%  %B   % ߂` 7H7DGw:w6- %RRB 6GD ŵŵ ŵ mݷ &mwŵ 7 ŀ7  m`ݐ00,TTl1DATADATADATADATADATADATADATA-, 7%  7 F۰p ` ߇h%  5 %w fp5@b5@V%\PHPJPLPNPPPVPXPZP\P^5eН@ 2E@@3 P# \7P E@`  6t(  % 5 w ! ~5 jsN x|1o  ,  s, ,  3X     s, wW^"b"~"""w  :# F` 7b5505t- U U 2ZTT N PJH &e" j5m47 \5 5) & D <5 jTTR5 ԕT -:  dZ   , 50-  - . v b bZCet5 A  1,1, 5m   % ^!ZB (D@e 2w7 Det=j x+&  h+ ^w F  T   e~ |wnw CTEoU`5 TT  ""  , <   ""w-3XJ a &! -h D  4SA {RJ33mH3 3 < 4 , @5 eVL  e&& f &  J  #w~0   3 3 4@ 5 Xw6  5 855\5 T ~@e"VR t4-   7, eA  ",œԕ5   mE %  5 5 D 555 UA TTԕ@ԕ f   7z  # ! w tj7`7\b @wR  & I wB  7 (      7       ~7W!i g B w 8@   w @ 55 @a \@@a RP $ & . @  0w> ,w6      w` eP PPЕ % Z!XB p ` `w ~te8  00  8&   p`    &      7  70& e =wj   wN P& B     m f Bw( -& & mv߁e > @l55 mJ  @  w & ߷  >7w  ^ &  #% b : T J FL * `  (77 & U7 7 7 7 fj& ~ 6vw7(e"eB$$$e((vݷ<zw<r  w<h    Vw<LJ# `  . %XW5@5 Of &F 6vw77 *7<&5@   00,TSQ3eaek < `     R f  7]wv R R77 2&4 8(އ   w  EE J3    0  * w & f w X R  b& ff 2 ,  $ N   !6 U 4)V)  5RO'5RW'5SV'5'B .(+*+  &• H   ; w ; !,:& u@5e, RNOWE 5& , ! [ ]   )@ 55 ,.@ L4 V5ȕf  .ڂ5@ wз w w^ -ЋSV هw t  ڇw deB$&ww (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$f $* rсeE  ,*( e(  eRRR צv" pbeBeRRRRR R R  X&50e N"ppple5let ͇v p|54e6(5 J xH  ·0 H p|54e6(5 ,䇷  ·7 bw\ Xe·)w@ 7 > I χ AZ    5^Vȋ+& ȥ+ȥ-  U  f  *u  u  ¥ ¥ ȥ ȥ  &  m  f A N  % & & @( Bf  e ee e 77778 8H8]888889/9]9{999 :;:[::::;@;_;;;;;<+3>X>x>>>>?77778<8q8888,9I9k99999":>:e::::;>;p;;;;X>>>>?&?]????-@ -- *DIAG*- -- *FATAL*-  DC!n   ` ~ F t"6 .6<7!7D7 D5 &?,-fW >5W E5W sW s W !00,TTl1DATADATADATADATADATADATADATA W 8W >W EW W W W Ō $|e ܺ0? H@&  m  f A N  %Illegal Get Command Line error code%2NCommand syntax error%2N%VA%2NRequired input file missing%2NIllegal switch%2N%VA%2NNo dynamic storage available%2NIllegal error-severity code %P %P %P%2NCommand I/O error%2NIndirect file open failure%2N%VA%2NIndirect command syntax error%2N%VA%2NIndirect file depth exceeded%2N%VA%2NI/O error on input file %X%2NOpen failure on file %X%2NSearch stack overflow on segment %2R%2NPass control stack overflow at segment %2R%2NFile %X has illegal format%2NModule %2R ambiguously defines P-section %2R%2NModule %2R multiply defines P-section %2R%2NModule %2R multiply defines xfr addr in seg %2R%2NModule %2R illegally defines xfr addr %2R %P%2NP-section %2R has overflowed%2NModule %2R ambiguously defines symbol %2R%2NModule %2R multiply defines symbol %2R%2NInsufficient APRs available to map read-only root%2NSegment %2R has address overflow: allocation deleted%2NAllocation failure on file %X%2NI/O error on output file %X%2NLoad addr out of range in module %2R%2NTruncation error in module %2R%2N%D undefined symbols segment %2R%2NInvalid keyword identifier%2N%VA%2NOption syntax error%2N%VA%2NToo many parameters%2N%VA%2NIllegal multiple parameter sets%2N%VA%2NInsufficient parameters%2N%VA%2NTask has illegal memory limits%2NOverlay directive has no operands%2N%VA%2NIllegal overlay directive%2N%VA%2NOverlay directive syntax error%2N%VA%2NRoot segment is multiply defined%2N%VA%2NLabel or name is multiply defined%2N%VA%2NNo root segment specified%2NBlank P-section name is illegal%2N%VA%2NIllegal P-section/segment attribute%2N%VA%2NIllegal overlay description operator%2N%VA%2NToo many nested .ROOT/.FCTR directives%2N%VA%2NToo many parentheses levels%2N%VA%2NUnbalanced parentheses%2N%VA%2NIllegal logical unit number%2N%VA%2NIllegal number of logical units%2N%VA%2NIllegal default priority specified%2N%VA%2NIllegal ODT or task vector size%2NIllegal filename%2N%VA%2NIllegal device/volume%2N%VA%2NLookup failure on file %X%2NIllegal directory%2N%VA%2NIncompatable reference to library P-section %2R%2NIllegal reference to library P-section %2R%2NResident library memory allocation conflict%2N%VA%2NLookup failure resident library file - %X%2NIllegal partition/common block specified%2N%VA%2NNo memory available for library %2R%2NPIC libraries may not reference other libraries%N%VAIllegal APR reservation%N%VAI/O error library image file%N%VARequired partition not specified%2NInvalid APR reservation%N%VAComplex relocation error-divide by zero module %2R%2NWork file I/O error%2NLookup failure on system library file%2NUnable to open work file%2NNo virtual memory storage available%2NModule %2R not in library%2NIncorrect library module specification%N%VA%2NLibrary file %X has incorrect format%2NResident library has incorrect address alignment%2N%VA%2NPartition %2R has illegal memory limits%2NInvalid partition/common block specified%2N%VA%2NTask build aborted via request%2N%VA%2NDisk image core allocation too large%2N%VA%2NInvalid window block specification%2N%VA%2NTask requires too many window blocks%2NTask has illegal physical memory limits%N%P %P %P%2NLibrary references overlaid library%2N%VA%2NTask image file %X is non-contiguous%2NVirtual section has illegal address limits%2N%VA%2NFile %X attempted to store data in virtual section%2NResident library mapped array allocation too large%2N%VA%2NInvalid reference to mapped array by module%2R%2NEnd of f00,T.T3eaekile reached before .END in %X%2NSymbol %2R not found for patch %2NSegment %2R not found for patch %2NSupervisor mode completion routine is undefined %2NLibrary not built as a supervisor mode library%N%VA%2NSupervisor-mode library reference error%N%VA%2NIllegal system size specified %2NConflicting base addresses in cluster library %2NLibrary %2R not found in any cluster%2NIllegal cluster configuration %2NCluster library element %2R does not have null root%2NModule %2R contains incompatible autoload vectors%2NCluster library element %2R is not resident overlaid%2NSegment not found to address round%2N%VA%2NLibrary build not requested - ignoring option%2N%VA%2NIncompatible OTS module%2Ne"îN@RJ w +$7! -nþw "&f 0e"L@ %wD÷>Á e"ìN@RJ w EChH@ e-- $ ' -FÖ7",a(Q$ H"7`&wwA ̡ D |~,?A?AbW  &[q$W 2 TITISYSYTICLWKOVVγb γVγ5wwtf& 7 TKB>,%   @ %2>KWdp}8(ЬxhXбHgpz00.UTl1DATADATADATADATADATADATADATAW !0.<DSYSYSYSYTICL^&TKB -- *FATAL*-Run aborted ZPp@ e     5 2 6 5  J  J 5~ :  2  2 w 5bC ŀ <  B f50  -F <5.$ r : 5 wVp wV Pwf *   f&f 7J w77  `wj w^ 7,\7,T  V0 0  p@    ~ $ $fE7 4`0 Z 0 5,5,  6 u$ ^   1,1,J 1,1, &b e m 7D &8 e$$)d 5w & A 7@m7 *1 C7 pM $ w"   7 /  *w p L7w  X`d VT efA   ^w: 7.w, ~   z& &% N  V    2 T s zew ~   A ~C* 6 w CB  Z54w eC %E& 7 .Bd | wddcAcAd 7A &e Cm  &m`e` ` f`B` JP    *     `p f& `, ,, &  mV  *B ce " &e#r  .(  & eB%e1be1^1\1H1J1L1N1P&&f t h eHD e<w n E  A B` 7pA wL &w E p B B ` p :7~A @ae n fe?E? & f Y :  40 B ` w Vf* E @ jw`RK`/ & D -N  &x  ` *     B B  @`   B` * 2   v  m ` @ (T'&1 V D| D V( V$ D8 D V, DX V |D$ tV lDL dD< \DH T % L' DV` <D) 4L' ,.d $R v V\ D D V . D0 Vp Vt ` VT 5 6 6 D D <6 R@ T@5ew \, Bv     5Bw< 50  (r- DUt-E D  E E ܁ 200. UT3eaek~0&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff &f  &[q &[q`D22 2V2( 2D2< Pzrh P$ h.ht$zht$pzh%h%h%h!t$ zh%* h)*<h-* h1Ph@h=PRhzh>T@dhLT|v@hN dhR!vh\!P vhc, dvhj(hn(hq(htT @`hz,%HNh}t*h*ht*<ht*h,%hhT,@Rh4r4rr4Lrr4rr7r7rL@L@L@AhSYxQSYySY^SY~xQSY_SYzjL_LB[1,1]FSYXCC@DALB MPSSMADL`SHpSPqCR@pMA-WI pHDPICOxLI xCPDAFP@MMpGPIPRASQpTRXTpMACAEA HDPM@SL MUFUpROqALCMSEIPyNMxCOxLI xSGyXHpIDpELxFMxCL xSBrFO@x$+29J(&X^j|5b  we w N7 N5 b$P e ˋ   P! " wj w @pdf  &B$ĵ4ĵ!%'% %E$e@ P  7e :e 8e R& ĵ V 11@ Be "w 5 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 jjlj ɥ@@aujk,bp F5f fˇ ȕ j‡ e00.UTl1DATADATADATADATADATADATADATASY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *!!w  8jDl@ tTeBT85l@ @( D 4eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ $' % 7AA$?$2$$$LB[1,1]ODT.OBJODTID.OBJ@ w ]R,  wA b."t&%d3 3 ~$eB A  D\ %%5bE5 E5U  Be . 4 j3~$s ]@@MtX7 7 &&$&! &&"e 5'U(7\7^&$ZPP `E@t w  7w\4 P@N xwP$&4 be&ew B@P@P j ^dbj7 d  wj*,B &&&$$ 55 $$$ (b e5 < (&L$7 v R dwhz$&`9 B . ` .,\NL p   BAbpd fwbh\`  %/ -%/*%//$`¥¥¥ ¥ ¥ef tUܱeE $&f$m    b   r`7 7 8 f B7 *H $?x% 7 < UU W@7   f w2P  w wU F~۠wpw7e @ 7 RE^x\7 ,7 *^ۇK w wb      D7 D7 >7 >* W,( 7 7 8# %* 7  7     "%A  r A d7^އ N ۇB && 9? ePHHJ  5@  w  e5 frb  ֆ9` B@&&5 b & & 6 6 6 5 5 5 &65uuuu w d " &w*$Aq#q- 6& ."& &&֯"(1R7(U(߱`((&3& TKB>l^SY7 $7 je`&  D@bp$$:0 b @ef7D` ȥ;ȋ&% % % % ¥:uu j n & W e)%I#q-'eW &$0ef` ננe 00.UT3eaekנ^נ  A5 ¥;U%E #w (w we) e)( r )e) e)) l  h) U% ¥;¥,Q \ Pe)S#S- $ *I  %QQ *& N&1 &f Je f  7" RRR|AC`e R?j7f% ~'J ݷ" z &e`P  &,@ 3@8K@oMBaTq rt@,YeYxx@Y`Y5 *5 "7 8 7X[<$09AZ (),-*! x'&'&>'`'&"'"'"'7 7 7 7 X7 $ P %$% #%$$ :%B   r0t$Iz &%$U^Z7 XO $J8D5M5IE   $ %ͥpͥ&Հ7 -A# ~ x( $3%2%եJ   H #7 Ewͥ%Jn# $.wȋȥ;!%% %9;5%H1H/H-HH)HH%u& +w %W&%W&  p&%&  e)ȥ:2ȥ./ȥ[,ȥ<)ȥ/&W ! T & fAf J !"%dd,w& ȋȥ-ȥ)ȥ(ȥ* ȥ,  ȥ[ ȥ]  Z , p \J A A N>*,B &&5 b & r&`90 p5@ w bf 6 % e 2 R H6 @5 85 071o?yT''p'''R(T'T'()F)$ 0 77 5E$ P %$ P   $ %!%@5h7H7L 5NW   C 7f`7% 5%n x `ݴ d ppp 6Ue |Ah "  7œEz&5U   5pppp f& fp5& Np5Ufup 7w 2 8< fwX2 5 pppp u  wz z @& ^  wLwe@e 2 f5e  5N  D91 G@ w e & Ne 5U e5 < ! R555U-Pڠ55 8u5f $uw8% *$) \] >eE BE*E  5 &6z**j*j*j*j*j*j*j*j*j**j*j*j*j*j*j*j*j*j*z**z*z*z*z*z*z*z*z**z*z**'j*j*j*j*j*j*j*j**j*z*z**j****J*R*z*J*R*z*2*2*Z*B*z*:*)*z**j*j*z*z*j*j*j*j*j*j*j*j*j*j*j*j*j*j*j*j****z*.z***j*j*j*z***su$* @,AL%w  5 a' 7 |•! b& va fm܀  w^  f   z hed7Ae 1΋ ^ܿ  ppU@pM (%e p-,  Ah  a  އw vw x l  r7"7,9Z7EA3"3,'5@5E-X  #  B`  E   e3#3-  ܱw &D@'F'D' &5 w t& ۷  7PwT  & &  #% v  / h0  >+ 8+ (/ / * *0 1 5 ^6 f6 5 5 V6 5 7 8 7 7 x7Sw R e wwه6@$  "7$l7d  e p?l7h PAPАP 0wR^ww@ &w$W# w؇Tw57 7 7 e EM M M Mw؇h e  ?7 (PPP 2&(&eeA^  jppp^ p   .ؿ    p  w& wwׇ5 mwXVwPwN7 L, >8 8lw&<7, 7, 0 U a wa wa ULwU% W# wBww R7 \*w& BAbpd fw:h4`  %/ -%/*%//$`¥¥¥ ¥ ¥ef LUձ &fB  +"+  5.U.5-&e&  d ^@ ѥ  u N#N |%7 rmӇ 6 5 x5 p5&  m  f A N  %? @`_?*Units set to maximum assigned^,V,V,=5~xmn  %n V U-V" L1* `,B w,, H`e625*5& F5  =  &wططQD @ 5;5l+ 5`%\"5ݡ**5ݡ**5rՀ*Հ* 7*n7*jش *̂m* ط ݠז*ݜה* Ж*Д*  & & Zd5@tp,$5t, 5   Z cHA A*N ׇN65  5 5 %  5@5 B  f wB sœ  Ow4t6-w. 5 P5       ` `U@w` * B55**U w    55Д*Ж*5  5n 5 w w  ~w vwp jpp545 5@U@p` p`|* A &f!a\ 5 ՇE B B B B   * Œ55**w &fA< 7& % ,4, %&f E U40, U 0,  5 g wihk 5l ** *  * Œfe  * Œ *  7 87 7 7 7 7 .7 &7 .7 7 7 7 7 7D7 <7 Z P F >75? %A A A w \` He  5  5 5P5 @$ d.A   L  AP  feA    Հpp Zw j5&f& v D v $$$ ++L)ɪyN0tN sN0sN0 s, t ~, , ,3Xf  :,v-v--f w ~ v7| - <5 H 5 v n5@ .   Jw  z w `@e"Kr•@-b Jr5P;r5:6 500.3UTl1DATADATADATADATADATADATADATAK5  `  ȵ d pe 2 5D'%# "-5@  év~he 5@t  5V .PH4 77 0 2PPh Vw2  -p5J%ȕ@@0 @b \ 0@  07f ?7wA  *w ,7  z v * `  d7N7H & Uw >,&  " 7w  f&  #%   7 7 7 7 fj& ~ 6vw7(e"eB$$$e((Z<Tw<L  w<B    0w<&$# `   %% x0( H03ww w. e f6  0 p f^e 5  . 291  N&  0&5EEEEE@E@EE &&fEE# %%2, %U2, 5v C J & P &*  |7JV% J%,D7v*%.?-L15z%e NN l5R.rr .  7 | xCœ5H5µ  (l 5) &5U5U5 EEw, w, m:35Հ( " 55 3l5 5- ,h,be5%ɪ%J';'%Jr;rF w6w, 9eeb 5@4\ Y- U5R5O5L5HUB Z@ ݵ d X1L   w t-l~ 5@   S L7N 5w5ww|ŀ7 ,B- &f  bw:  ՀB 0 H w 7R7wD~7 ~7t. $w\ 6 X T $% ` Lw6E$ µs d n  wJf P 55 5  *B (r 7bwd  & L()L6 d r0 Հ%V   .% F N : wxf ~7ڵ. ݇w C57(5l ~< H ! & J PPJ  ۇ xt rnf `  "  3,500.;UT3eaekwR5w>55e5@ 5  f5e w55Հ m0 0  pE0  5H^ Հ m80 0  0 d  ef ` :%h e N 5PHtt 8w m؎  % fV ہ f7 1 5Lf.] ځw` 6f .  ! p` p ; tp p  5 -5@)H 7 4   7  b&f rׄwwV5- %& !5U &2 `   0@  7 w eW! A T 5555 xpՈB ߡ V` e&e nw  Zww jwe &f &w   w & f w P R  Z& ff * ,  ߖ N   !. U 1o 5h0&f& v ##t'v'( $/H/, B#D##z#/000# 7 T \f2h8 f (8 4  857 ,7 $ 7  J  0 h  07`Rf ?7wA   *wL ,7p h ^ Z D * `  727, & Uw &   7hwl  > &  #%   7 7 7 7 fj& ~ 6vw7p(e"eB$$$e((<8w<0  w<&    w< # `  ` %W5@5 Of &F 6vw 77 *7<&5@    n H`     R f  7wv  7  @91  N&  &5EEEEE@E@EE &&fEE# %%2, %U2,  5 d C \ & P &*  7% %,7ރl%p?-15z%e N4 l5Rrr   ߇7 Cœ5H5µ  (l 5) &5U5U5 EEw, w, m35Հ( " 55 3l5 5-X ,,e65%ɪ%J';'%Jr;r w6w|n 9eeb 5@\ >Y-JښU5R5O5L5H,UB Z@ p bڵ d 1   w - 5@   S 7 n5w5ww|ŀ7^dR^ B-N &f   bw: \ fՀB 0 Lw 77w7 7 w\ 6 $% h wxEf2 µs d n J wJf< 55 5  B \, 7w J& L() d 0 Հ%   .% ~ wxfh 7X׵ Pڇw HC57(5l$ < H ! &T ^PPJH  <؇ xt rnf `  "  L 3,5wR5w>55e5@ 5  5e *w55Հ m.0 0  Er  5 Հ m0 0  0 d .ef %h * Ze N 5PHtt w( <$mՎ  % fV ׁ 7 1 5f] fׁw` 6f .  ! p` p ; p p  5 -5@) (7 X  $ 7 D  0 &f z ߰ӄwwV5- %& !5UR     @  7 w eW! A 0T 5555 Ո00.KUT3eaekB ܡ  re&e wP  w<w wLe f &w:4 ݀  w D& f w R  & ff ,  ۖ N   !p U 1o ߖ5&  m  f A N  %<VNTI VNSYVNSY[gNSY[hNSY?yOV\~TI\CL2VNCL@GhjTXCzb "$ ,3X s,w  ^v P D F> D 4, D "!   U%@eA D e U% (%?%N  DD :6  P?7 e  V  e xb7 5e@5` 5e5@e,e7`   - 5h Z8 2eN,b5V05-h BBbBdBd w@m @bmEW e75!55@e2e?E? E @`eE 7`p  =  e    ,D   fP  aU%N!e =  | D=l 85  x 1 aa < H !  BPPPP *@e"A &v ^A  pp0^ @ dDe"8 >77%ɪ-K'wD-vJ'w8-j;'w,-^3&w -R3&w-F2&w-:#&n Pw H"&   7$w(  p&  #%   )Px")&y@G, xC>cbFp@,1zB?yD5!: L"  # $ |z3 t% l& d5&  m  f A N  %00.SUTl1DATADATADATADATADATADATADATA6"!4"!8"rzt:"?V" jw DCet BEA% \ 5f&"ŀ550 00 -25 e DCen h-f5XeZ# 5BD5@: $7r&e"  v7xf &e" 5e" w \Z J5@ wrDe" rwx5De" VDe" H!-T 4  TTT5 L5m@55e5 Vdf  c 0e %w 7 l V N7^5X+ RB 54 2 5& r7 h. xmn  V%j  25 tL`! 50m$ b   ww@?  u~~@wprCa 5HS@CwFHa  l& A~m w NwH H 5l*'CwHa Z5H ZH  AB 5rrw5~fe@ uݮ  5 . tj T  7ݷ A~B& ljKm݀&D d  S& j Ee 7 ( p 7  5  v   b5& N  w 5   (  wz 7pZ ^ 7D"5tF H 7D"ۇw  V7 5H  CC @w   w6w2 @ w5  & w >5   P V "uuf7 2@   A  6v L& @@  -5  5A5 5~A5  : l55Ca XXJ  @  .55 B  @ uu|u~uw PHA  f      b 77- v5`5`~ fAAAA R  8uuf L "w ~wxw pwj J rr @A@A 2 2 , !    @@ w3N@ (4`N3N-ل4N6  4`N ew Z T D (;w ]"]\U.5*5& bw `75V :w 87  &5!5 N5 !5 05 7P`UZ5 UF E    45! 5 5 !7S5 5 H X-:  L UA2 $] ] %w-!] A  ff@ $ . uft t5P!7S< 8 -B֒  UA2 |] ] %w-!] A  @ |P  ut t ! w  7 n 5\~ lw 3 <AA , 5  U e   -  n Uf  -  B  "5*  "" K!! D t 5t eE  Wt Fp >n22mh-N fmh r` 3n h2ln 4h@5pe&e85X&  5 5*5* t\0  @0 0 0  f&  73 3  77w( ( 33 43 t-F* $& Հe33  3   RҀ H7F 55e! ( @ &^ N 3 3 00.[UT3eaek3 3 3  \w @e8 L5 Cµ @@<5858µN~5"5 %Ncc 55  bdcc  Jcc ܖ @`!  @`A@  f  @e?  Be E0`Ҁ  0<"   4 4E @ @ @ 5 553 <% z% & Dڂ "lmЇfP @e"e 8   p L&f  F & pl5 5  &f5 r &5 $5plw plw Bߖ5!@@@  N@(B*D,:."$"" ""~""~ ~x<":""p"""D""""" " "zX""H4R"TxP""6""""5kw dNmMe`xmx !D7hb`#   E|A Y   Ze E  77Е     `z& T5mݾ݇mm5mݘmޚjww `7 577LEb"!0LP U U5xU5dU5`U5L m\ 7  mJ7 " f" "0LP7<m 727 ,7&5 55 m7 m"="  e>77`p `AW  %|W V \ emwe w`e5` d5.em5m "5  vzzܻ&)~  $ 5Dn *7 7 (4 " 77 l Z5O "7 B X 0 "(e7 6 $ڬ 7 7  >%7 %7 zCD5Efm Le  `ECf  &  e&A e   Z E'E@Ce5@> % &%([qe   Ce- 5 7* $ف @e Re?E?  EV  >e" N A @ m$١f rw 6  hb  w2   ه &R""4e6($  l 7 Z@` Y2 ^2 b)2 P2 Z-ײ תe wڇP   pT hb   N7 @7

; .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 s00cq#qnccccubroutineo .IF DF K$$DAS/ MOV (SP)+,KINAR5 ; Restore instruction mapping  .ENDC ; DF K$$DAS+ MOV (SP)+,KISAR5 ; Restore process mappingF- MOV (SP)+,$CMPDV ; Restore current PDV indext RETURND .. .SBTTL $CEACC - Access Block in Extended Pool8 .SBTTL $CECAC - Access Block in Alternate Extended Pool;+); **-$CEACC-ACCESS BLOCK IN EXTENDED POOL 3; **-$CECAC-ACCESS BLOCK IN ALTERNATE EXTENDED POOL ;.?; This subroutine maps to a block in extended single word pool,<; and returns a virtual address to access the block. If theB; $CECAC entry is called, the Extended Pool must already be mapped ; via APR6.R; ; Inputs:c); 2(SP) = Address of block to be accessedu8; KISAR6 mapped to alternate Extended Pool Base ($CECAC); ; OUTPUTS:); 2(SP) = VIRTUAL ADDRESS OF MAPPED BLOCKr;e; Note: ?; KISAR6 always mapped into Extended Pool on exit even if block- ; is in DSR.;-7$CEACC::MOV $XBIAS,KISAR6 ; Map to base address of poolc6$CECAC::BIT #1,2(SP) ; Is the block in Extended Pool ?- BEQ 100$ ; If EQ, no - already mapped to itC SAVRG ; Else, save R0" MOV 4(SP),R0 ; Copy block address+ BIC #177701,4(SP) ; Return virtual addressb. BIS #140000,4(SP) ; ... mapped through KISAR6 .IF DF R$$EIS ASH #-6,R0 .IFF ; DF R$$EISP .REPT 6( ROR R0 ; Convert address to block bias .ENDR .ENDC ; DF R$$EIS' BIC #176000,R0 ; Clear extraneous bitsi+ ADD R0,KISAR6 ; ... update to proper block  RESRG ; Restore R0C100$:I RETURN ; Return to the caller * .SBTTL $PDVID - Process Name to PDV Index;+(; **- $PDVID - PROCESS NAME TO PDV INDEX;SG; This subroutine maps a process name (up to three characters in RAD50); into a PDV index..;m ; Inputs:g; R2 = Process name (RAD50)A;# ; Outputs:; R2 = PDV Index;-'$PDVID::SAVRG ; Save registersi1 MOV $PDVTA,R0 ; Get address of PDV address table 6 MOV $PDVNM,-(SP) ; Get total number of PDVs in system10$:" MOV (R0)+,R1 ; Get address of PDV/ BEQ 15$ ; Process not loaded - go to next oneB, CMP Z.NAM(R1),R2 ; Does process name match?$ BEQ 20$ ; Yes - go calculate index15$:, DEC (SP) ; Decrement count - done looping? BNE 10$ ; If NE, no0 SEC ; Yes - no match BR 25$ ; Return with C-bit set20$:7 MOV R0,R2 ; Get current position in PDV address tableR3 SUB $PDVTA,R2 ; Subtract starting address of tabled# TST -(R2) ; Get PROCESS pdv indexN25$:3 INC (SP)+ ; Clean up stack and don't change C-bit0# RESRG ; Restore registers  RETURN ; Return g" .SBTTL $CEMUL - Unsigned Multiply;+ ; **- $CEMUL - UNSIGNED MULTIPLY; K; This subroutine performs unsigned multiplication where the result is lessEJ; than 16 bits. It is included here so that we can conditionalise the code; for extended instruction set.n;oF; Note that it is the callers responsibility to ensure that the result; will fit in 16 bits.;e ; Inputs:d; R0 = MultiplierC; R1 = Multiplicanda;a ; Outputs:; R0 = Corrupted; R1 = Low 16 bits of result;-$CEMUL:: .IF DF R$$EIS$ MUL R0,R1 ; Perform multiplication RETURN- .IFF ; DF R$$EIS ) CALLR $MUL ; Call exec multiply routinep .ENDC ; DF R$$EIS l" .SBTTL $CEDIV - Unsigned Division;+ ; **- $CEDIV - UNSIGNED DIVISION; L; This subroutine performs unsigned division where the results are less thanI; 16 bits. it is included here so that we can conditionalise the code foru; extended instruction set.1;ML; Note that it is the callers responsibility to ensure that the results will; fit in 16 bits.F; ; Inputs:L; R0 = Dividend ; R1 = Divisor;T ; Outputs:; R0 = QuotientC; R1 = Remainder;-$CEDIV:: .IF DF R$$EIS MOV R1,-(SP) ; Save divisor MOV R0,R1 ; Set up dividend CLR R0 ; Clear high order word$ DIV (SP)+,R0 ; Perform the division RETURNe .IFF ; DF R$$EIS ' CALLR $DIV ; Call exec divide routineh .ENDC ; DF R$$EIS e .IF DF M$$PRO- .SBTTL $MPLCK - Multi-Processor Lock Routinet;+(; **-$MPLCK-MULTI-PROCESSOR LOCK ROUTINE; F; This routine will perform a spin lock on the C00cqdqmmmffDATAomm Exec Lock ($CRESL)E; and then co-call the caller. On return it will unlock the Comm ExecCD; lock and return. Note that we perform the lock operation ourselves0; so that we can correctly manipulate the cache.;-'$MPLCK::ASRB $CRESL ; Spin on the lock$ BCC $MPLCK ; until we have access. CACHE$ FLUSH ; Flush the cache of stale data' CALL @(SP)+ ; Co-call the caller backo MOVB #1,$CRESL ; Reset the lock RETURNR S3 .SBTTL $MPSAV - Bypass Cache with Save and Restorep;+.; **-$MPSAV-BYPASS CACHE WITH SAVE AND RESTORE;aB; This routine will save the current state of the cache and bypass@; it before co-calling the caller. On return it will restore the; initial state of the cache.h;-2$MPSAV::CACHE$ SAVE ; Save current state of cache" CALL @2(SP) ; Co-call the caller( MOV (SP)+,2(SP) ; Overwrite return link# CACHE$ UNSAVE ; Restore the cachel RETURN .ENDC ; DF M$$PRO-$CEXND:: ; For release of CEX space to DSR.p .ENDC ; DF M$$NET .ENDrep;+.; **-$MPSA .TITLE DRATX$ .IDENT /09.03/F ;$,; COPYRIGHT (C) 1974, 1978, 1979, 1980, 1981/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.A;-A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDO9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.M;C; VERSION 08.04.;D; D. N. CUTLER 31-AUG-73;,+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:N;;; J. M. LAWLER; T. M. MARTIN; B. S. MCCARTHY; ; MODIFIED BY:;P ; B. S. MCCARTHY 30-MAY-84 09.01;0*; BM309 -- REMOVE REFERENCES TO $HEADR TO; STREAMLINE CODE$; ; B. S. MCCARTHY 15-JUN-84 09.02; !; BM309 -- CORRECT TYPO IN ABOVEO;M ; B. S. MCCARTHY 16-OCT-84 09.03;S'; BM321 -- ANOTHER CORRECTION TO ABOVEE;E; MACRO LIBRARY CALLSR;C# .MCALL ABODF$,HDRDF$,HWDDF$,TCBDF$" ABODF$ ;DEFINE TASK ABORT CODES% HDRDF$ ;DEFINE TASK HEADER OFFSETSP$ HWDDF$ ;DEFINE HARDWARE REGISTERS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+; **-$DRATX-AST SERVICE EXIT;-F; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF ANH; ASYNCHRONOUS SYSTEM TRAP SERVICE ROUTINE. IF ANOTHER AST IS QUEUED ANDD; AST'S ARE NOT DISABLED, THEN THE NEXT AST IS EFFECTED IMMEDIATELY.; ; DPB FORMAT:B;E#; WD. 00 -- DIC(115.),DPB SIZE(1.)..;L&; AT ISSUANCE THE TASK STACK CONTAINS:;D.; 14(SP)=EVENT FLAG MASK WORD FOR FLAGS 1.-16./; 12(SP)=EVENT FLAG MASK WORD FOR FLAGS 17.-32.E/; 10(SP)=EVENT FLAG MASK WORD FOR FLAGS 33.-48./; 06(SP)=EVENT FLAG MASK WORD FOR FLAGS 49.-64.R; 04(SP)=PRE AST TASK PS. ; 02(SP)=PRE AST TASK PC.O,; 00(SP)=PRE AST TASK DIRECTIVE STATUS WORD.; ; INPUTS:A;I9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.S+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.E/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.I,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;E:; OUTPUTS: (DIRECTIVE STATUS AND PS WORD RETURNED TO TASK);R-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.W1; DIRECTIVE STATUS OF PRE AST STATE IS RETURNED.R; C=1 IF DIRECTIVE IS REJECTED.E<; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE DIRECTIVE1; WAS NOT EXECUTED FROM AN AST SERVICE ROUTINE.2;D?; NOTE: IF AN ADDRESS CHECK FAILURE OCCURS WHILE REMOVING ARGU-O6; MENTS FROM THE TASK STACK, THEN THE ISSUING TASK IS ; ABORTED.R;- 54$DRATX::MOV (R2),-(SP) ;DIRECTIVE EXECUTED FROM AST? BPL 10$ ;IF PL NOA> BIC #^C*2>>,(SP) ;ISOLATE BITS* BIC (SP),(R2) ;CLEAR AST IN PROGRESS FLAG- ASR (SP) ;SET UP TASK'S CURRENT STATUS BITS ' BISB (SP)+,(R2) ;RESTORE PRE AST STATE0' BIT #T2.STP,(R2) ;WAS TASK STOPPED? O BEQ 5$ ;IF EQ NO$ MOV T.PCB(R5),R0 ;POINT TO TASK PCB( CALL $NXTSK ;REALLOCATE TASK PARTITION$5$: MFPI SP ;GET USER STACK POINTER% MOV (SP)+,R0 ;RETRIEVE STACK POINTERD ADD #2,R0 ;STEP OVER DPB WORDR- MOV #7*2,R1 ;SET NUMBER OF BYTES TO CHECK $- CALL $ACHCK ;ADDRESS CHECK TASK STACK WORDS2& BCS 20$ ;IF CS ADDRESS CHECK FAILURE .IF DF X$$HDR4 MOV H.EFSV(R4),-(SP) ;SAVE WAITFOR MASK FROM HEADER .IFTF* CALL $RELOM00dqeqncccc ;RELOCATE AND MAP TASK STACK .IFT 0 MOV (R0)+,4(SP) ;SET DIRECTIVE STATUS TO RETURN R .IFFP0 MOV (R0)+,2(SP) ;SET DIRECTIVE STATUS TO RETURN .ENDC& MOV #$UMPC,R3 ;POINT TO SAVED USER PC$ MOV (R0)+,(R3)+ ;RESTORE PRE AST PC# MOV (R0)+,(R3) ;RESTORE PRE AST PS,0 MOV (R0)+,T.EFLM(R5) ;RESTORE WAITFOR MASK WORD) MFPI SP ;RETRIEVE CURRENT STACK POINTER$ I S .IF DF S$$LIB U- BIS #PMODE,PS ;ASSUME RETURNING TO USER MODES; BIS #CSMODE!PSMODE,(R3) ;FORCE RETURN PS TO AT LEAST SUPERC! BMI 9$ ;IF MI RETURN PS IS USER) TSTB $SUPFL ;TASK USE SUPERVISOR MODE ?  BNE 9$ ;IF NE YES, OKV .ENDC ; DF S$$LIB V5 BIS #CMODE!PMODE,(R3) ;MAKE SURE BOTH MODES ARE USER &9$: ADD #16,(SP) ;ADJUST STACK POINTER MTPI SP ;WRITE IT BACK* BIC #PR7,(R3) ;MAKE SURE PRIORITY IS ZERO 5 .IF DF X$$HDR5 MOV (SP)+,T.EFLM+2(R5) ;RESTORE WAITFOR MASK ADDRESS* MOV $SAHDB,KISAR6 ;RESTORE HEADER MAPPING .IFFT: MOV H.EFSV(R4),T.EFLM+2(R5) ;RESTORE WAITFOR MASK ADDRESS O .ENDC3 CALLR $SETRT ;FORCE A REDISPATCHING OF PROCESSOR P(10$: DRSTS D.RS80 ;SET DIRECTIVE STATUS&20$: MOV #S.CAST,R0 ;SET AST ABORT " CALLR $ABCTK ;ABORT CURRENT TASK S .ENDER &9$: ADD #16,(SP) ;ADJUST STACK POINTER MTPI SP ;WRITE IT BACK* BIC #PR7,(R3) ;MAKE SURE PRIORITY IS ZERO 5 .IF DF X$$HDR5 MOV (SP)+,T.EFLM+2(R5) ;RESTORE WAITFOR MASK ADDRESS* MOV $SAHDB,KISAR6 ;RESTORE HEADER MAPPING .IFFT: MOV H.EFSV(R4),T.EFLM+2(R5) ;RESTORE WAITFOR MASK ADDRESS O .ENDC .TITLE INITL) .IDENT /16.02/N;; COPYRIGHT (C) 1987$; BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;$>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;P ; D. N. CUTLER 23-AUG-73 ;S- ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY: ;.; B. S. MCCARTHY; P. J. BEZEREDI; -; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:; ; J. W. BERZLE; J. M. LAWLER; B. S. MCCARTHY; M. PETTENGILL; J. G. WEHNER; P. K. M. WEISS;; MODIFIED BY:;C"; B. S. MCCARTHY 21-OCT-86 16.00;$&; BM376 -- FIX PRO ASSEMBLY PROBLEM;N"; B. S. MCCARTHY 27-OCT-86 16.01; +; BM374 -- ADD LAT APPLICATIONS TERMINAL; DISCONNECT CALL;3; J. W. BERZLE 8-NOV-86 16.02P;E,; JWB187 -- ADD CONDITIONALS FOR LAT CALL; "; L. B. MCCULLEY 29-DEC-87 15.11;P,; LBM050 -- SET HF.SWR PROPERLY FOR DRGSS;.!; L. B. MCCULLEY 3-FEB-87 15.12 ; 8; LBM057 -- FIX LBM050 PROBLEM WITH HARDWARE SUBTLETY;IC; MACRO LIBRARY CALLS D;TEF .MCALL HWDDF$&G HWDDF$ ;DEFINE HARDWARE REGISTERSHI;J; MACRO DEFINITIONSCK;1LM .MACRO BREAK TYPENOP .IF DF X$$DBTQ R .WORD 3ST .IFFUV HALTWWX .ENDCYZ[ .IF IDN ,D\ ] BR .-2O^_ .ENDC`ab .ENDMcde;7)f; INITIALIZE PROPER BIT SETTING FOR SR3Pg;Fh"iS3$BTS==0 ;INIT TO NO BITS SETjkl .IF DF M$$EXTm7nS3$BTS==S3$BTS!60 ;ENABLE 22 BIT MODE AND UNIBUS MAPAop .ENDCqrs .IF DF K$$DASt*uS3$BTS==S3$BTS!4 ;ENABLE KERNEL D SPACEvw .ENDCxyz .IF DF S$$LIB{.|S3$BTS==S3$BTS!2 ;ENABLE SUPERVISOR D SPACE}~ .ENDC .IF DF U$$DAS( S3$BTS==S3$BTS!1 ;ENABLE USER D SPACE .ENDC ; DF U$$DAS;; LOCAL DATA;"; SYSTEM IDENTIFICATION MESSAGES;  .NLIST BEX32SYSMG: .ASCII <15><177><177><12>/ V/SYSVR: .ASCII / BL/"SYSID: .ASCIZ / /<15><12><12>9MESS0: .ASCIZ /Directive partition not fixed in memory/32$MESS1::.ASCIZ /Executive data space not loaded/7MESS2: .ASCIZ /No CPU partition created in MP system/V9MESS3: .ASCII /Boot device not found in system tables:/ .BYTE 15,177,177,124 .ASCII /R0=device type (ASCII)/<15><177><177><12>5 .ASCII /R1=Physical unit number/<15><177><177><12>G .ASCII /R2=CSR address/ .IF DF M$$PRO,00eqqmmmffDATA .ASCIZ <15><177><177><12>/R3=CPU ordinal/ .IFFY .BYTE 0 .ENDC .EVENMESS4: .ASCII /Device /XX: .ASCIZ /XX -- /1#MESS5: .ASCIZ /Driver not loaded/a9MESS6: .ASCIZ /Driver does not support controller type/m-MESS7: .ASCIZ /Vector address above V$$CTR/y MESS10: .ASCIZ /Vector in use/,MESS11: .ASCIZ /Unibus run not accessible/6MESS12: .ASCIZ /Driver didn't return control after /)MESS13: .ASCIZ /controller online call/#MESS14: .ASCIZ /unit online call/ GMESS15: .ASCIZ /Driver error -- If DEC driver, please submit an SPR!/. .EVENMESS16: .ASCII / controller /vUU: .ASCIZ /UUAANN:/#MESS17: .ASCIZ /error code in R1/oMESS20: .ASCIZ /Unit /&MESS21: .ASCIZ / didn't come online/!FILL: .ASCIZ <15><177><177><12>b"MESS22: .ASCIZ /Fatal error -- /6MESS23: .ASCIZ /Secondary pool not created with VMR/MESS24: .ASCIZ /Warning -- /DMESS25: .ASCII /Crash device not found in system tables:/<15><177>= .ASCII <177><12>/R0=device type (ASCII)/<15><177><177><12>e; .ASCII /R1=logical unit number/<15><177><177><12>/Enter/E: .ASCII / CSR address in R2, physical unit number in R1/" .ASCII <15><177><177><12>/and / .IF DF X$$DBT .ASCII /type P/ .IFF .ASCII /hit continue/ .ENDC7NULL: .BYTE 0 ;NOTE -- THIS MUST FOLLOW PREVIOUS TEXTe(CTLET: .ASCII /ABCDEFHJKLMNPRSTUVWXYZ/ .EVEN;C:; TABLE OF ERROR MESSAGES INDEXED BY GETVEC INITIAL CODE; GETERR: .WORD MESS5S .WORD MESS6 .WORD MESS7 .WORD MESS10n .WORD MESS117PROMT: .ASCIZ <15><12>/>/ ;  .EVEN;p1; DATA AREA FOR DATA-SPACE INITIALIZATION TABLE>;a; FORMAT OF THE TABLE IS:T;0; DTBL: .WORD ADDRESS ;ADDRESS FOR NEXT VALUE.; .WORD DATA ;DATA TO PLUG AT ABOVE ADDRESS;N; .; .; .;X7; .WORD 0 ;ZERO IN ADDRESS POSITION TERMINATES TABLE;C .IF DF K$$DASDTBL: ;REFERENCE LABELE .IF DF M$$PRO9 .WORD $IITBX ;INTERPROCESSOR INTERRUPT COMMON INT TBL.( .WORD $IIINT ;IIST INTERRUPT ADDRESS; .WORD $IITBX+CI.PWF ;IIST COMMON INT TBL POWERFAIL ENTRYZ, .WORD $IIPWF ;ENTRY POINT IN IIST MODULE .ENDC .IF DF R$$HDV3 .WORD $RHTBX ;RH COMMON INTERRUPT TABLE ADDRESSE, .WORD $RHALT ;RH COMMON INTERRUT ADDRESS9 .WORD $RHTBX+CI.KRB ;RH COMMON CONTROLLER ONLINE ENTRYL7 .WORD $RHKRB ;ADDRESS OF RH CONTROLLER ONLINE ENTRYE1 .WORD $RHTBX+CI.PWF ;RH COMMON POWERFAIL ENTRY$/ .WORD $RHPWF ;ADDRESS OF RH POWERFAIL ENTRY1 .WORD $RHTBX+CI.CSR ;ADDRESS OF CSR TEST ENTRY$# .WORD $RHCSR ;RH CSR TEST ENTRYE   .ENDC    .IF DF R$$6113 .WORD $DMTBX ;DM COMMON INTERRUPT TABLE ADDRESSV- .WORD $DMALT ;DM COMMON INTERRUPT ADDRESSL: .WORD $DMTBX+CI.KRB ;DM CONTROLLER ONLINE/OFFLINE ENTRY- .WORD $DMKRB ;DM CONTROLLER ENTRY ADDRESSN5 .WORD $DMTBX+CI.PWF ;DM CONTROLLER POWERFAIL ENTRYL1 .WORD $DMPWF ;DM CONTROLLER POWERFAIL ADDRESSF6 .WORD $DMTBX+CI.CSR ;DM CONTROLLER CSR TEST ADDRESS" .WORD $DMCSR ;CSR TEST ADDRESS .ENDC; KERNEL AST TABLE ENTRIES1; KEEP THIS TABLE IN SYNCH WITH $KATBL IN SYSCM.0 .WORD $KATBL+00,$FINBF ;AK.BUF - BUFFERED I/O2  .WORD $KATBL+02,$FINXT ;AK.OCB - OFFSPRING EXIT8! .WORD $KATBL+04,$GENBF ;AK.GBI - GENERAL BUFFERED I/O5" .WORD $KATBL+06,$DBTRP ;AK.TBT - FORCED T-BIT TRAPB5# .WORD $KATBL+10,$FINDI ;AK.DIO - DELAYED I/O COMP.W5$ .WORD $KATBL+12,$GGFRN ;AK.GGF - GRP. GBL. RUNDWN.I%&&; SPM VECTOR FOR ACP HOOKPOINT ENTRY'( .WORD $SPV01A) .WORD $SPVEXN* +; AND LOADER HOOKPOINT ENTRIES,- .WORD $SPV02 . .WORD $SPVEXT/ .WORD $SPV03.0 .WORD $SPVEXA0; ; BM37400; LAT DISCONNECT CALL ENTRY POINT ; BM3740; ; BM374%0 .IF DF M$$NET&T$$LTH ; BM374 0 ; BM374D0 .WORD $LTEEP ; BM3740 .WORD $SPVEX ; BM3740 ; BM374E(0 .ENDC ; DF M$$NET&T$$LTH ; BM300eqqncccc740 ; BM374 12 .WORD 0 ;END OF TABLER34 .ENDC567;28; TEMPORARY STORAGE AREA FOR $SYSIZ INFORMATION.9; (K$$DAS SYSTEMS ONLY).:;$;<= .IF DF K$$DAS>-?$SYALT::.WORD 0,0,0,0,0 ;STORAGE FOR $SYSIZB@A .ENDCBC D .LIST BEXEFG .IF DF R$$PROH; 7I; THIS ROUTINE IS TAKEN FROM THE MODULE POWER. IT IS <J; HERE BECAUSE THE EXEC HAS NO POWER FAIL CODE OF ITS OWN.K; L?M$POWER: CALL $DRDSE ;ALWAYS DECLARE SIG. EVENT AT CPU PWRUP.3N MOV #$SCDVT,-(SP))O30$: CALL @(SP)+ ;GET NEXT UCB ADDRESS.P BCC 40$ ;IF CC GOT ONE'Q CLRB $PWRFL ;CPU POWERFAIL COMPLETE. R35$: RETURNYS)T40$: MOV #30$,-(SP) ;SET RETURN ADDRESS2U BITB #US.OFL,U.ST2(R5) ;DEVICE IN CONFIGURATION*V BNE 35$ ;IF NE DEVICE IS NOT IN CONFIG$W MOV S.KRB(R4),R2 ;GET KRB ADDRESS!X BEQ 45$ ;IF EQ NO KRB ADDRESST4Y44$: BIT #KS.OFL,K.STS(R2) ;IS CONTROLLER OFFLINE?Z BNE 35$ ;IF NE YESB[45$: BITB #UC.PWF,U.CTL(R5) ;CALL DRIVER REGARDLESS OF ACTIVITY?\ BNE 50$ ;IF NE YES"] TSTB U.STS(R5) ;IS UNIT ACTIVE?^ BPL 35$ ;IF PL NOG=_50$: MOV D.DSP(R3),R2 ;GET ADDRESS OF DRIVER DISPATCH TABLEY$` BEQ 35$ ;IF EQ DRIVER NOT LOADED0a CALLR $LDPWF ;CALL DRIVER AT POWERFAIL ENTRYbc .ENDC ; DF R$$PROde;+%f; **-$INITL-SYSTEM TRANSFER ADDRESSRg;TLh; THIS ROUTINE CONTAINS THE TRANSFER POINT OF THE RESIDENT EXECUTIVE. WHENLi; THE SYSTEM IS BOOTED, CONTROL IS TRANSFERED HERE TO INITIALIZE AND STARTj; UP THE SYSTEMRk;-l"m$INITL::RESET ;RESET PROCESSOR-n MOV R0,@#46 ;SAVE BOOT DEVICE CSR ADDRESSI9o MOV #$SYALT+2,R0 ;POINT TO SYSTEM CONFIGURATION VECTORS"p MOVB R3,(R0)+ ;SAVE UNIT NUMBER(q MOVB R1,(R0)+ ;SAVE LBN OF LOAD IMAGEr MOV R2,(R0)+ ;T!s MOV R4,(R0)+ ;SAVE DEVICE NAME)t MOV R5,(R0)+ ;SAVE LENGTH OF LOAD FILEuvw .IF DF M$$PROx+y JMP $PENT ;USE COMMON CODE IF AVAILABLEEz{ .IFFH|};~ MOV #PMODE+PR7,PS ;SET MODE BITS AND LOCK OUT INTERRUPTST. MOV #$STACK-20,SP ;SETUP EXEC STACK POINTER4 MOV #KINAR0,R5 ;INIT POINTER TO MAPPING REGISTERS& CLR R1 ;INIT I SPACE MEMORY OFFSET .IF DF K$$DAS, MOV $SCMOF,R2 ;INIT D SPACE MEMORY OFFSET BNE 3$ ;IF NE FOUND IT4 MOV #$MESS1,R4 ;SPECIFY MESSAGE TO TYPE ON CONSOL/ CALL $FATAL ;PREFACE WITH FATAL DESIGNATIONL1 BREAK FATAL ;IF D SPACE NOT LOADED HANG IT UPE03$: SUB #200,R2 ;ADJUST TO BE RIGHT FOR APR 1 .IFTF5$: ;REFERENCE LABELO .IFTT2 MOV #77406,KDSDR0-KINAR0(R5) ;SET D SPACE 4K RW3 MOV R2,KDSAR0-KINAR0(R5) ;SET D SPACE APR OFFSETR1 ADD #200,R2 ;ADVANCE D SPACE APR OFFSET BY 4K 2 MOV #77402,KINDR0-KINAR0(R5) ;SET I SPACE 4K RO .IFF32 MOV #77406,KINDR0-KINAR0(R5) ;SET I SPACE 4K RW .IFTF' MOV R1,(R5)+ ;SET I SPACE APR OFFSETN' ADD #200,R1 ;ADVANCE I SPACE OFFSETO CMP R5,#KINAR7 ;DONE YET? BLOS 5$ ;IF LOS NO. MOV #177600,KISAR7 ;SET UP I/O PAGE MAPPING .IFT' CLR (R5) ;CLEAR D SPACE APR0 OFFSET5 .ENDC .IF DF K$$DAS!M$$EXT!S$$LIB MOV #S3$BTS,SR3 ;SET UP SR3 .ENDC INC SR0 ;ENABLE MAPPING, .ENDC;AE; IN A D-SPACE SYSTEM SET UP SPECIAL WORDS IN D-SPACE THAT CAN'T BEE; LINKED AT TASK BUILD TIME.;R$INITM:: ;REFERENCE LABELD .IF DF P$$OOL8 MOV $PLPAR,R0 ;LOCATE PCB OF SECONDARY POOL PARTITION! BNE 502$ ;IF NE, THERE IS ONE 5 MOV #MESS23,R4 ;SPECIFIY MESSAGE TO TYPE ON CONSOLP/ CALL $FATAL ;PREFACE WITH FATAL DESIGNATION 6 BREAK FATAL ;VMR HAS NOT SET UP SECONDARY POOL PAR502$: ;REF LABEL .ENDC .IF DF D$$PAR1 TST $DRAPR ;IS THE DIRECTIVE PARTITION FIXED?L BNE 505$ ;IF NE YESN4 MOV #MESS0,R4 ;SPECIFY MESSAGE TO TYPE ON CONSOLE/ CALL $FATAL ;PREFACE WITH FATAL DESIGNATIONO5 BREAK FATAL ;DIRECTIVE PARTITION NOT FIXED IN MEMP505$: ;REFERENCE SYMBOL .ENDC;S2; INITIALIZE THE POOL MONITOR CONTROL STRUCTURE.00eqqmmmffDATA;L .IF DF P$$CTL7 MOV $CRAVL,R0 ;GET POINTER TO SECOND FREE POOL BLOCKO# CLR R1 ;INITIALIZE SIZE COUNTER3507$: ADD 2(R0),R1 ;ADD LENGTH OF FREE POOL BLOCK;6 MOV (R0),R0 ;POINT TO NEXT FREE POOL BLOCK IN LIST  BNE 507$ ;IF NE THERE IS ONE4 MOV R1,$PRISZ ;STORE IT AWAY FOR THE POOL MONITOR/ CLR $POLST ;INITIALIZE EXEC/POOL TASK FLAGSP .ENDC .IF DF K$$DAS+ MOV #DTBL,R0 ;SET UP TABLE START ADDRESS.6$: MOV (R0)+,R1 ;GET ADDRESS FOR NEXT ENTRY BEQ 7$ ;IF EQ END OF TABLE) MOV (R0)+,(R1) ;STUFF VALUE AT ADDRESS  BR 6$ ;GO BACK FOR MORE; .ENDC;*; HAS VMR SET UP THE PER CPU PARTITIONS?;;=7$: MOV @#46,$TEMP0 ;PUT CSR ADDR WHERE WE CAN GET IT LATER7 .IF DF M$$PRO .IF GT M$$PRO-1, TST $CPPAR ;HAS VMR SET UP CPU PARTITION BNE 8$ ;IF NE YES3 MOV #MESS2,R4 ;SPECIFY MESSAGE TO TYPE ON CONSOLR/ CALL $FATAL ;PREFACE WITH FATAL DESIGNATION1* BREAK FATAL ;CPU PARTITIONS NOT SET UP8$: ;REFERENCE LABEL0 .ENDC;RJ ; IF THIS IS A I+D SPACE SYSTEM, WE MUST TRANSFER THE $SYSIZ INFORMATIONG ; FROM THE AREA IN LOW MEMORY WHERE WE HAVE SAVED IT TO SYSCM, MAPPEDA ; IN DATA SPACE. ;A  .IFTF .IF DF K$$DAS% MOV #$SYALT+2,R0 ;SET FROM ADDRESS # MOV #$SYSIZ+2,R1 ;SET TO ADDRESS;" MOV (R0)+,(R1)+ ;MOVE ALL WORDS MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ .ENDC .IFTT% MOV #TYPMSG,R5 ;SET RETURN ADDRESSE3  JMP $MAPCP ;SET UP MAPPING FOR KDSAR0 AND UBMAPI!" .IFFA#$%& .IF DF M$$EXT',( MOV #$DIRXT,-(SP) ;SETUP EXIT FROM $SGFIN6) CALL $SGFIN ;CATCH MEMORY FAULTS AND SET CARRY BIT6* CLR @#CPUERR ;CLEAR CPU ERROR REGISTER IF IT EXISTS3+ MOV #UBMPR,R0 ;POINT TO FIRST UNIBUS MAPPING REGS%, BIC #HF.UBM,$HFMSK ;ASSUME NO UMRS+- TST (R0) ;UMRS PRESENT?V. BCS INTRO ;IF CS NO UMRS5/ BIS #HF.UBM,$HFMSK ;INDICATE THAT UMRS ARE PRESENT012 .IF DF K$$DAS3,4 CLR (R0)+ ;CLEAR FIRST UMR REGISTER PAIR5 CLR (R0)+ ;A-6 MOV $SCMOF,R3 ;PICKUP OFFSET TO DATA SPACE7 CLR R2 ;SET FOR CONVERSION28 ASHC #6,R2 ;CONVERT TO DOUBLE WORD BYTE OFFSET(9 MOV #4,R1 ;SET COUNT OF UMRS TO LOAD0:11$: MOV R3,(R0)+ ;LOAD LOW 16 BITS OF ADDRESS,; MOV R2,(R0)+ ;LOAD HIGH 6 BITS OF ADDRESS*< ADD #20000,R3 ;BUMP ADDRESS BY 4K WORDS= ADC R2 ;...V> SOB R1,11$ ;LOOP? BR INTRO ;@A .IFFSBC'D CLR R1 ;SET INITIAL ADDRESS TO ZEROF4E MOV #5.,R2 ;SET NUMBER OF REGISTER PAIRS TO LOAD0F11$: MOV R1,(R0)+ ;LOAD LOW 16 BITS OF ADDRESS+G CLR (R0)+ ;CLEAR HIGH 6 BITS OF ADDRESSO"H ADD #20000,R1 ;ADVANCE 8K BYTESI SOB R2,11$ ;LOOPJ BR INTRO ;KL .ENDCMNO .ENDCPQR .ENDCST4UTYPMSG: MOV #$DIRXT,-(SP) ;SET UP EXIT FROM $SGFIN6V CALL $SGFIN ;CATCH MEMORY FAULTS AND SET CARRY BIT6W CLR @#CPUERR ;CLEAR CPU ERROR REGISTER IF IT EXISTS-XINTRO: MOV #$SYTYP,R0 ;POINT TO SYSTEM TYPE 5Y MOV #SYSMG+4,R1 ;POINT INTO IDENTIFICATION MESSAGER%Z MOV (R0)+,(R1)+ ;MOVE INTO MESSAGEA[ MOV (R0)+,(R1)+ ;...\ MOV (R0)+,(R1)+ ;... ] MOV (R0)+,(R1)+ ;...D^ MOV (R0)+,(R1)+ ;...T_ MOV (R0)+,(R1)+ ;...1` MOV #$VERSN,R0 ;POINT TO SYSTEM VERSION NUMBER3a MOV #SYSVR,R1 ;POINT INTO IDENTIFICATION MESSAGET%b MOV (R0)+,(R1)+ ;MOVE INTO MESSAGECc MOV (R0)+,(R1)+ ;...T1d MOV #$SYSID,R0 ;POINT TO SYSTEM IDENTIFICATIONE1e MOV #SYSID,R1 ;POINT TO IDENTIFICATION MESSAGEY;f MOV (R0)+,(R1)+ ;MOVE SYSTEM IDENTIFICATION INTO MESSAGESg MOV (R0)+,(R1)+ ;0h JSR R5,OPMSG ;TELL EVERYBODY WE'RE ON THE AIRi .WORD SYSMG ;;-j MOV #140000,R0 ;SET INITIAL MEMORY ADDRESS1/k CLR R1 ;ZERO NUMBER OF 32W BLOCKS IN SYSTEMN l MOV #KISAR6,R2 ;POINT TO APR6-m MOV #10000,R3 ;ASSUME UPPER LIMIT OF 128KW n MOV R3,(R2) ;POINT TO 128KWE.o MOV (R1),-(SP) ;SAVE CONTENTS OF LOCATION 0/p MOV (R0),R5 ;SAVE CONTENTS OF LOCATION 128KM4q MOV SP,(R1) ;MOVE NON-ZERO VALUE INTO LOCATION 0,r CLR (R0) ;ATTE00eqqnccccMPT TO ACCESS WORD AT 128K0s TST (R1) ;ADDRESS WRAP-AROUND AT LOCATION 0?-t BEQ 1$ ;IF EQ YES, THIS IS A 128KW SYSTEM 3u MOV #170000,R3 ;NO, UPPER LIMIT CAN BE UP TO 2MW)v1$: MOV R5,(R0) ;RESTORE LOCATION 128KE%w MOV (SP)+,(R1) ;RESTORE LOCATION 0&x CLR (R2) ;SET ZERO RELOCATION BIAS*y2$: TST (R0) ;DOES THIS 1K BLOCK EXIST?%z BCS 14$ ;IF CS NO, NO MEMORY LEFTN1{ ADD #40,R1 ;UPDATE NUMBER OF 32W BLOCKS BY 1KM1| MOV R1,(R2) ;POINT TO NEXT 1K BLOCK OF MEMORYN%} CMP (R2),R3 ;UPPER LIMIT REACHED?D~ BLO 2$ ;IF LO NO614$: MOV R1,$SYSIZ ;SET SIZE OF MEMORY IN 32W BLOCKS; $; INITIALIZE THE FEATURE MASK BITS;U$; HF.EIS - SYSTEM HAS EIS HARDWARE/; HF.FPP - SYSTEM HAS FLOATING POINT HARDWARE(6; HF.CIS - SYSTEM HAS CIS HARDWARE (DONE BY SAV.TSK)B; HF.SWR - SYSTEM HAS HARDWARE SWITCH REGISTER PRESENT ;LBM050;N? BIS #HF.SWR,$HFMSK ; ASSUME SWITCH REGISTER PRESENT ;LBM050M1 MOV @#4,-(SP) ; SAVE TRAP VECTOR 04 ;LBM050NH MOV #TRP10,@#4 ; POINT TRAP VECTOR 04 AT ROUTINE TO SET CARRY ;LBM050= TST SWR ; TEST SWR - BUS TIMES OUT IF NOT PRESENT ;LBM057TH MOV (SP)+,@#4 ; RESTORE TRAP VECTOR 04, LEAVE CARRY UNAFFECTED;LBM050/ BCC 150$ ; READ OK, IT WAS THERE ;LBM050@ BIC #HF.SWR,$HFMSK ; NOT THERE, $SGFIN SET CARRY BIT ;LBM050: CLR $SWR ; BE NICE, INIT CLEAR SW (SYSCM) SWR ;LBM050150$: ;LBM0507 BIC #HF.CIS,$HFMSK ;SAV.TSK WILL FIGURE THIS ONE OUT42 BIS #HF.EIS,$HFMSK ;EVERY M-PLUS SYSTEM HAS EIS2 MOV @#10,-(SP) ;SAVE ILLEGAL INSTRUCTION VECTOR MOV #TRP10,@#10 ;SET VECTOR/ BIS #HF.FPP,$HFMSK ;ASSUME NO FLOATING POINTV CLC ;CLEAR CARRYA- SETI ;ISSUE A FLOATING POINT INSTRUCTIONB" BCS 15$ ;IF CS FPP NOT PRESENT' BIC #HF.FPP,$HFMSK ;SHOW FPP PRESENTR15$: ;REFERENCE LABEL .IF DF P$$3XX/ CLR $HFMSK+2 ;ASSUME NOT BRIDGE, NOT PRO-3XX  MFPT ;GET CPU TYPEF) BCS 152$ ;IF CS NOT A BRIDGE OR A PROU+ CMPB #3,R0 ;IS THIS A F11 BASED SYSTEM?M' BEQ 151$ ;IF EQ YES, MAY BE PRO-3XX + CMPB #5,R0 ;IS THIS A J11 BASED SYSTEM?E% BNE 152$ ;IF NE NO, NOT A PRO-3XXF?151$: TST @#177750 ;LOOK AT THE MAINTENANCE REGISTER ; BM376N6 BCS 152$ ;IF CS NOT THERE, CAN'T BE PRO-3XX ;**-1( BNE 152$ ;IF NE ISN'T PRO-3XX EITHER= BIS #H2.PRO,$HFMSK+2 ;SET PRO BIT IN HARDWARE FEATURE MASK$  BR 153$ ;BACK TO COMMON CODE'152$: TST @#176010 ;IS THIS A BRIDGE?1 BCS 153$ ;IF CS NO/ BIS #H2.BRG,$HFMSK+2 ;INDICATE BRIDGE SYSTEMY .ENDC ; DF P$$3XX:153$: MOV (SP)+,@#10 ;RESTORE ILLEGAL INSTRUCTION VECTOR .IF DF M$$PRO& BIC #MP.STP,@$MPSWT ;CLEAR STOP BIT/ MOV $CPBIT,$URMST ;SET ONLINE PROCESSOR MASK1. MOV $CPBIT,$IIMSK ;SET IIST CONNECTION MASK. MOV $CPBIT,$CKURM ;WE WILL HANDLE THE CLOCK) LOCK$ $EXECL,WAIT ;GRAB EXECUTIVE LOCKF .ENDC;BG; SEARCH FOR SYSTEM DEVICE USING CSR ADDRESS AND PHYSICAL UNIT NUMBER G; AS KEYS. WHEN IT IS FOUND, SET UNIT AND CONTROLLER ONLINE, AND SETC:; UP $SYSIZ VECTOR WITH THE CORRECT LOGICAL UNIT NUMBER.;T4 CLR .SY0+2 ;CLEAR FLAG THAT WE FOUND SYSTEM DISK3 MOV #$DEVHD,R5 ;GET ADDRESS OF FIRST DCB ADDRESSI,20$: MOV (R5),R5 ;GET ADDRESS OF NEXT DCB% BNE 25$ ;IF NE YES -- KEEP TRYINGU, MOV .SY0+2,R4 ;HAVE WE FOUND SYSTEM DISK? BNE 52$ ;IF NE YES7 MOV #MESS3,R4 ;SPECIFY MESSAGE TO BE TYPED ON CONSOLI/ CALL $FATAL ;PREFACE WITH "FATAL ERROR -- "+ MOV $SYSIZ+6,R0 ;PLACE DEVICE NAME IN R0N5 MOVB $SYSIZ+2,R1 ;PLACE PHYSICAL UNIT NUMBER IN R1 ! MOV $TEMP0,R2 ;PLACE CSR IN R2 .IF DF M$$PRO/ MOVB $PROCN,R3 ;PLACE PROCESSOR NUMBER IN R3T .ENDC8 BREAK FATAL ;COULD NOT FIND LOAD DEVICE IN THIS SYS.+25$: MOV D.UCB(R5),R4 ;POINT TO FIRST UCB.( BIT #DV.PSE,U.CW1(R4) ;PSEUDO DEVICE? BNE 20$ ;IF NE YES: MOVB D.UNIT(R5),-(SP) ;SET STARTING LOGICAL UNIT NUMBER= MOVB D.UNIT+1(R5),-(SP) ;CALCULATE NUMBER OF UCB'S TO SCAN; SUB D.UNIT(R5),(SP) ; INCB (SP) ;R(40$: MOV U00eqqmmmffDATA.SCB(R4),R3 ;GET SCB ADDRESS$ MOV S.KRB(R3),R0 ;GET KRB ADDRESS4 BEQ 50$ ;IF EQ NO KRB ADDRESS -- NOT SYSTEM DEV.1 CMP $SYSIZ+6,D.NAM(R5) ;DO DEVICE NAMES MATCH?F BNE 50$ ;IF NE NOO< CMPB $SYSIZ+2,U.UNIT(R4) ;DO PHYSICAL UNIT NUMBERS MATCH? BNE 50$ ;IF NE NOU+ CMP $TEMP0,(R0) ;DO CSR ADDRESSES MATCH?Y .IF DF M$$ACD .IF DF M$$PRO( BNE 43$ ;IF NE ADDRESSES DON'T MATCH1 BIT @$CPURM,K.URM(R0) ;IS IT ON THIS PROCESSOR)& BNE 45$ ;IF NE YES -- USE THIS ONE .IFFB& BEQ 45$ ;IF EQ YES -- USE THIS ONE .ENDC;RH; THE S.KRB KRB IS NOT THE ONE WE WANT. IF THE DEVICE IS DUAL-ACCESS,H; THEN WE WILL SEE IF THE OTHER PORT IS THE ONE TO WHICH WE ARE REALLY; CONNECTED.;-43$: MOV #S2.MAD!S2.LDS,R1 ;GET STATUS BITSD< BIC S.ST2(R3),R1 ;ARE THEY ALL SET? (IS THIS DUAL-ACCESS)- BNE 50$ ;IF NE NO -- NOT DUAL-ACCESS UNITT;TH; UNIT IS MULTI-ACCESS, AND WE CAN CONTROL THE VALUE OF S.KRB. CAN WE.; FIND THE PORT THRU WHICH WE ARE CONNECTED.;-+ MOV S.KTB(R3),R0 ;ASSUME THIS IS THE KRBH8 CMP R0,S.KRB(R3) ;IS THIS THE ONE WE ALREADY CHECKED?% BNE 44$ ;IF NE NO -- USE THIS ONET( MOV S.KTB+2(R3),R0 ;USE THE OTHER ONE,44$: CMP $TEMP0,(R0) ;IS THE CSR THE SAME? .IFTF-  BNE 50$ ;IF NE NO -- NO WAY OUT THIS TIMEE    .IF DF M$$PRO 4 BIT @$CPURM,K.URM(R0) ;IS IT ATTACHED TO THIS CPU BEQ 50$ ;IF EQ NOS .ENDC .IFTO( MOV R0,S.KRB(R3) ;SET NEW KRB POINTER .ENDCA45$: BISB #US.VV,U.STS(R4) ;SET VOLUME VALID BIT IN SYS DEV UCB,( MOV R4,.SY0+2 ;REDIRECT SYSTEM DEVICE, MOV R4,.LB0+2 ;REDIRECT SYSTEM DEVICE TOO .IF NDF R$$PROU'  MOV R4,.SP0+2 ;REDIRECT SPOOL DEVICET!" .ENDC ; NDF R$$PROF#<$ MOVB 2(SP),$SYSIZ+2 ;SET LOGICAL UNIT NUMBER OF LOAD DEV.% BR 51$ ;BR OUT OF LOOP.&50$: INCB 2(SP) ;UPDATE LOGICAL UNIT NUMBER3' ADD D.UCBL(R5),R4 ;CALCULATE ADDRESS OF NEXT UCB&( DECB (SP) ;ANY MORE UCB'S TO SCAN?) BNE 40$ ;IF NE YES#*51$: MOV (SP)+,(SP)+ ;CLEAN STACKU+ JMP 20$ ;GO TO NEXT DCB,-;,=.; SCAN CTB LIST TO FIND THE CORRECT CTB FOR THE LOAD DEVICEE/;I>0; A CTB MUST BE FOUND THAT POINTS TO THE CORRECT KRB OR THIS#1; CODE WILL NOT EXECUTE PROPERLY.R2;3,452$: MOV #$CTLST,R5 ;GET START OF CTB LIST!554$: MOV (R5),R5 ;GET NEXT CTB 16 ;THE CTB CONTAINING OUR KRB M U S T EXISTR-7 MOV L.DCB(R5),R2 ;GET DCB POINTER FROM CTBX>8 BITB #LS.CIN,L.STS(R5) ;IS IT A COMMON INTERRUPT CONTROLLER29 BNE 55$ ;IF NE YES -- SEARCH THE TABLE FOR DCB,: CMP R2,U.DCB(R4) ;IS THIS THE CORRECT CTB; BNE 54$ ;IF NE NOC1< BR 65$ ;YES -- CREATE VECTOR FOR THIS KRB/CTB =>;T/?; CONTROLLER IS A COMMON INTERRUPT CONTROLLER @;XA0B55$: TST (R2)+ ;SKIP COMMON INTERRUPT ADDRESS.C60$: TST (R2) ;IS THIS THE END OF THE TABLED BEQ 54$ ;IF EQ YES3E CMP (R2)+,U.DCB(R4) ;DOES THE DCB MATCH OUR DCB?RF BNE 60$ ;IF NE NO GH;B,I; CREATE VECTOR FOR THE SYSTEM LOAD DEVICEJ;TK4L65$: MOV .SY0+2,R3 ;GET UCB ADDRESS OF SYSTEM DISK$M MOV U.SCB(R3),R4 ;GET SCB ADDRESS,N MOV S.KRB(R4),R4 ;GET KRB ADDRESS INTO R45O BIT #KS.SLO,K.STS(R4) ;IS THIS A SLOW CONTROLLER?OP BEQ 70$ ;IF EQ NOT,Q MOV #PMODE,PS ;YES, ALLOW DISK INTERRUPTS7R70$: CALL ONLIN ;CREATE VECTOR AND PUT DEVICE ONLINEI(S MOV #PMODE+PR7,PS ;LOCKOUT INTERRUPTSTU;CV; SET TERMINAL ONLINETW;BXYZ .IF DF M$$PRO[1\ MOVB $PROC2,R0 ;GET PROCESSOR ID AS WORD INDEXT8] MOV $YLCTB(R0),R4 ;GET KRB ADDRESS OF CONSOL TERMINAL7^ MOV K.OWN(R4),R5 ;GET UCB ADDRESS OF CONSOL TERMINALS_ MOV R5,.CO0+2 ;REDIRECT CO:` MOV R5,.CL0+2 ;REDIRECT CL:ab .IFF c$d MOV #.TT0,R5 ;GET TT0 UCB ADDRESS+e MOV #$YLA,R4 ;GET FIRST DL11 KRB ADDRESSEfg .ENDChi,j BIC #U2.LOG,U.CW2(R5) ;SHOW CO: LOGGED IN-k BIS #U2.PRV,U.CW2(R5) ;MAKE CO: PRIVILEGEDC0l MOV #$YLCTB-L.KRB,R5 ;GENERATE YL CTB ADDRESSmn;+o; CREATE VECTOR AND PLACE TERMINAL O00eqqnccccNLINERp;Eq$r MOV K.OWN(R4),R3 ;GET UCB ADDRESS s CALL ONLINNtu;V,v; SET UP DUMP DEVICE KRB ADDRESS FOR CRASHw;xyz .IF DF C$$CDA{8| BIT #F4.LCD,$FMASK+6 ;LOADABLE CRASH DRIVER SUPPORT ?+} BEQ 71$ ;IF EQ, NO - DRIVER IS RESIDENTR%~ TST $CRPAR ;CRASH DRIVER LOADED ?.0 BEQ 77$ ;IF EQ, NO - DON'T TEST CRASH DEVICE71$: ;REFERENCE LABEL3 MOV #$DEVHD,R2 ;GET ADDRESS OF DEVICE TABLE HEADN,72$: MOV (R2),R2 ;GET ADDRESS OF NEXT DCB BNE 73$ ;IF NO, GOT ONER MOV #MESS25,R4K% CALL WARN ;SEND MESSAGE TO CONSOLN1 CLR -(SP) ;PICK UP TWO BYTE, NON-WORD ALIGNEDF& MOVB $CRDEV,(SP) ;CRASH DEVICE TYPE* MOVB $CRDEV+1,1(SP) ;AND PLACE ON STACK4 MOV (SP)+,R0 ;AND THEN INTO R0 FOR PUBLIC VIEWING) MOV $CRSUN,R1 ;GET LOGICAL UNIT NUMBERA' CLR R2 ;CLEAR POTENTIAL CSR ADDRESSS BREAK1 MOV R1,$CRSUN ;GET WHAT IS NOW CONSIDERED AS AD ;PHYSICAL UNIT NUMBERB6 MOV R2,$CRCSR ;GET THE CSR ADDRESS WHICH USER TYPED  ADD #60,R1 ;CONVERT TO ASCII3 MOVB R1,$CRUNT ;FILL IN $CRUNT FOR CRASH MESSAGEN! BR 77$ ;EXIT CRASH PROCESSINGNH73$: CMPB D.NAM(R2),$CRDEV ;IS THIS THE DCB FOR THE CRASH DUMP DEVICE?' BNE 72$ ;NO IF NE, LOOK AT NEXT DCBR9 CMPB D.NAM+1(R2),$CRDEV+1 ;MAYBE, CHECK NEXT CHARACTERE' BNE 72$ ;NO IF NE, LOOK AT NEXT DCB 6 MOV $CRSUN,R1 ;GET CRASH DEVICE LOGICAL UNIT NUMBER3 MOVB D.UNIT(R2),R0 ;GET LOWEST UNIT FOR THIS DCBM3 CMP R1,R0 ;IS CRASH DEVICE HANDLED BY THIS DCB?R BLO 72$ ;NO IF LO;? CMPB R1,D.UNIT+1(R2) ;MAYBE, CHECK HIGHEST UNIT FOR THIS DCBS BHI 72$ ;NO IF HIC- SUB R0,R1 ;CALCULATE NUMBER OF PROPER UCB;$ MOV D.UCBL(R2),R0 ;GET UCB LENGTH* MOV D.UCB(R2),R2 ;GET FIRST UCB ADDRESS+74$: DEC R1 ;POINTING TO PROPER UCB YET?K BLT 76$ ;YES IF LT  ADD R0,R2 ;POINT TO NEXT UCB BR 74$ ;GO AGAIN876$: MOVB U.UNIT(R2),$CRSUN ;SAVE PHYSICAL UNIT NUMBER$ MOV U.SCB(R2),R2 ;GET SCB ADDRESS) MOV S.KRB(R2),$CRKRB ;SAVE KRB ADDRESSB77$: .ENDC ; DF C$$CDA;I; CREATE VECTOR FOR IIST KRB;R .IF DF M$$PRO MOVB $PROC2,R0  MOV $IICTB(R0),R42 BIT #KS.OFL,K.STS(R4) ;DO WE HAVE ONE OF THESE? BNE 80$ ;IF NE NOF2 MOV #$IICTB-L.KRB,R5 ;GENERATE IIST KRB ADDRESS CLR R3 ;SHOW NO UCB ADDRESST  CALL ONLIN  .ENDC;45; SCAN PARITY MEMORY CSR REGISTERS AND CREATE TABLEC;I"80$: ;UNCONDITIONAL REFERENCE .IF DF P$$RTY2 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 TABLEB385$: MOVB (R4)+,R3 ;GET NUMBER OF CSR'S TO SET UPE BEQ 105$ ;IF EQ DONE" CLR R2 ;INITIALIZE CSR ADDRESS' BISB (R4)+,R2 ;CALCULATE CSR ADDRESS) SWAB R2 ;GET HIGH BYTE OF CSR ADDRESS- BISB (R4)+,R2 ;GET LOW BYTE OF CSR ADDRESS 90$: TST (R2) ;CSR PRESENT? BCS 95$ ;IF CS NO! MOV R2,(R1)+ ;SAVE CSR ADDRESSR  BR 100$ ;O195$: MOV R0,(R1)+ ;POINT TO FIRST WORD OF TABLET%100$: ADD #2,R2 ;POINT TO NEXT CSRF( SOB R3,90$ ;LOOP UNTIL NONE ARE LEFT2 BR 85$ ;CONTINUE THROUGH THE REST OF THE 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 ;D .IF DF P$$3XX2 BIT #H2.PRO,$HFMSK+2 ;IS THIS A PRO-3XX SYSTEM?( BEQ 107$ ;IF EQ NO, SKIP CLOCK CODE4 BIS #H2.CLK,$HFMSK+2 ;INDICIATE PRO CLOCK PRESENT, MOV #173030,R0 ;GET XT CLOCK CSR3 ADDRESS" MOV R0,$CKCSR ;SET CSR OF CLOCK, MOV R0,$CKCSA ;SET CSR OF CLOCK TO TICKLE1 BICB #177,-4(R0) ;CLEAR ANY SELECTED FUNCTIONS@/ BISB #52,-4(R0) ;SET DEFAULT DIVIDER CONTROL0- MOV #64.,$TKPS ;SET TICK RATE FOR THE EXECR CLR $CKLDC ;NO LOAD COUNTT! CLR $00eqqmmmffDATACKCNT ;NO PLACE TO COUNT- MOV #$CKINT,@#230 ;INITIALIZE CLOCK VECTOR  MOV #340,@#232 ; ...8 MOV #106,-2(R0) ;ENABLE INTERRUPTS, BINARY DATA, 24HR0 MOV #57,@#173202 ;ENABLE INTERRUPT CONTROLLERA BIS #H2.ITF,$HFMSK+2 ;SET THE TIME BAD DUE TO BATTERY FAILURE?' BR 130$ ;SKIP NORMAL Q/U CLOCK CODEK107$: ;REFERENCE LABELR .ENDC ; DF P$$3XX* MOV $CKCSR,R0 ;GET ADDRESS OF CLOCK CSR/ TST (R0) ;IS THE GENERATED CLOCK AVAILABLE? BCC 110$ ;IF CC YESO, MOV #172540,R0 ;GET ADDRESS OF KW11-P CSR" MOV R0,$CKCSR ;SETUP FOR KW11-P MOV #172542,$CKCNT ; 4 MOV #K$$LDC,$CKLDC ;SET COUNT REGISTER LOAD COUNT*  MOV #K$$TPS,$TKPS ;SET TICKS PER SECOND  TST (R0) ;KW11-P?S  BCC 110$ ;IF CC YESE,  MOV #177546,R0 ;GET ADDRESS OF KW11-L CSR"  MOV R0,$CKCSR ;SETUP FOR KW11-L MOV R0,$CKCNT ; CLR $CKLDC ;< MOV #H$$RTZ,$TKPS ;SET TICKS PER SECOND TO LINE FREQUENCY8110$: MOV #$NONSI,@#100 ;RESET KW11-L INTERRUPT VECTOR' MOV #$CKINT,104 ;SETUP KW11-P VECTORA CMP #172540,R0 ;KW11-P? BEQ 120$ ;IF EQ YES1' MOV #$CKINT,100 ;SETUP KW11-L VECTORL' MOV #$NONSI,104 ;RESET KW11-P VECTOR- TST (R0) ;FREE RUNNING CLOCK WITH NO CSR?T BCC 120$ ;IF CC NO! CLR $CKCSR ;CLEAR CSR ADDRESS6$ CLR $CKCNT ;CLEAR COUNT REGISTER  BR 130$ ;U4120$: MOV $CKCNT,R1 ;GET ADDRESS OF COUNT REGISTER. MOV $CKLDC,(R1) ;SETUP CLOCK COUNT REGISTER  MOV #K$$IEN,(R0) ;START CLOCK9130$: MOV #PMODE+PR7,PS ;MAKE SURE PS IS SETUP PROPERLYU ! .IF NDF R$$PROP"%# CALL $CPNIT ;INITIALIZE PROCESSORE$% .IFFC&' CALL $POWER() .ENDC ; NDF R$$PRO1*+, .IF DF M$$PRO-.. MOVB $NCPU,R4 ;GET NUMBER OF CPUS IN SYSTEM/ ASL R4 ;FORM WORD INDEXK00 ADD #$K6TAB,R4 ;AND POINT PAST LAST PROCESSOR21 MTPS #PR7 ;DISABLE INTERRUPTS SINCE LOWCR WILL2 ;BE UNMAPPED-3 MOV KISAR0,$TEMP0 ;;;SAVE REAL CPU MAPPINGN-410$: MOV -(R4),KISAR0 ;;;MAP TO A PROCESSOR56 .IFTF ; DF M$$PRO718 MOV #SYSMG,R0 ;SET ADDRESS OF BLOCK TO RELEASE/9 MOV #$ICAVL-2,R3 ;POINT TO ICB POOL LISTHEAD': ADD (R3),R0 ;ROUND TO NEXT BOUNDARY;; BIC (R3),R0 ;<< MOV #&^C3,R1 ;SET LENGTH OF BLOCK TO RELEASE=> .IFF ; DF M$$PROM?0@ CALLR $DEAC1 ;DEALLOCATE INITIALIZATION CODEAB .IFT ; DF M$$PRODC$D CALL $DEAC1 ;;;DEALLOCATE A COPY#E CMP #$K6TAB,R4 ;;;FINISHED YET ?;'F BLO 10$ ;;;IF LO NO, GO TO NEXT CPUK/G MOV $TEMP0,KISAR0 ;;;REMAP TO REAL PROCESSOR$H MTPS #0 ;;;ALLOW INTERRUPTSD I RETURN ;TJK .ENDC ; DF M$$PROLMN;T?O; ROUTINE TO SET CARRY ON TRAPS THRU 10 FOR FPP DETERMINATIONP;(Q'RTRP10: BIS #1,2(SP) ;SET CARRY IN PSW S RTI ;TU;LAV; SUBROUTINE TO OUTPUT A MESSAGE TO THE SYSTEM CONSOLE TERMINALIW;ZX4YOPMSG: MOV (R5)+,R1 ;GET ADDRESS OF OUTPUT MESSAGEZOPMSG1: ;REFERENCE LABELK-[10$: MOVB (R1)+,R0 ;GET NEXT BYTE TO OUTPUTO\ BEQ 30$ ;IF EQ DONEM,] MOVB R0,TPS+2 ;LOAD BYTE IN OUTPUT BUFFER^20$: TSTB TPS ;PRINTER BUSY?&_ BCS 30$ ;IF CS NO CONSOLE TERMINAL` BPL 20$ ;IF PL YESa BR 10$ ;GO AGAINb30$: RTS R5 ;cd;NAe; **-WARN-WRITE "WARNING -- " ON CONSOL AND THEN PRINT MESSAGE. f; g; INPUTS:Uh;Ii; R4=MESSAGE ADDRESS. j;Y k; OUTPUTS:l;A m; NONE.n;P o; ALL REGISTERS ARE PRESERVED.p;Tq r .ENABL LSB st .IF NDF R$$PROu6vWARN: MOV R4,-(SP) ;SAVE MESSAGE SPECIFIED FOR LATER%w MOV #MESS24,R4 ;PRINT "WARNING --" x BR 5$ ;ENTER FATAL ROUTINEyz{ .ENDC ; NDF R$$PRO |}; G~; **-$FATAL-WRITE "FATAL ERROR -- " ON CONSOL AND THEN PRINT MESSAGE.S;;D; THIS ROUTINE WILL WRITE "FATAL ERROR -- " ON THE CONSOL AND THENB; PRINT THE MESSAGE ON THE CONSOL. PRIOR TO THIS, IT WILL PRINT'; OUT A CR, TWO FILLS, AND THEN A LF. ;E ; INPUTS:R;E; R4=MESSAGE ADDRESS; ; OUTPUTS:;R ; NONE.A;O; ALL REGISTERS PRESERVED.;F)$FATAL::MOV R4,-(SP) ;SAVE R4 FOR LATER ( MOV #MESS22,R4 ;SET THE FATAL MESSAGE*5$: CA00eqqnccccLL WRITLN ;WRITE WITH CR/LF FIRST0 MOV (SP)+,R4 ;RESTORE R4 WITH MESSAGE ADDRESS;E8; **-WRITE-WRITE A LINE TO CONSOL WITH NO CR/LF FIRST.;C ; INPUTS:N; ; R4=MESSAGE ADDRESS;O ; OUTPUTS:;I ; NONE.T; ; ALL REGISTERS PRESERVED.;  .IF NDF R$$PRO<WRITE: CALL $SGFIN ;IF NO TERMINAL, DON'T GO OFF DEEP END" MOV R0,-(SP) ;SAVE R0 FOR LATER" MOV R1,-(SP) ;SAVE R1 FOR LATER .ENDC ; NDF R$$PRO2#10$: MOV R4,R1 ;SET UP FOR OPMSGI  JSR R5,OPMSG1 ;DO LINE OUTPUT MOV (SP)+,R1 ;RESTORE R1M MOV (SP)+,R0 ;RESTORE R0  RETURNI; A; **-WRITLN-WRITE A LINE WITH CR, FILLS, AND A LINE FEED FIRST.S;A ; INPUTS:;U; R4=ADDRESS OF MESSAGE.; ; OUTPUTS:;S ; NONE. ; ; ALL REGISTERS ARE PRESERVED.;L=WRITLN: CALL $SGFIN ;IF NO TERMINAL, DON'T GO OFF DEEP ENDS" MOV R0,-(SP) ;SAVE R0 FOR LATER" MOV R1,-(SP) ;SAVE R1 FOR LATER JSR R5,OPMSG ;SEND MESSAGE  .WORD FILL ;FILLSJ$ BR 10$ ;ENTER WRITE, IN PROGRESS  .DSABL LSBE;M0; **-ONLIN-PUT DEVICE ONLINE AND CREATE VECTOR;W>; THIS ROUTINE WILL CREATE THE VECTORS FOR A DEVICE AND THEN=; PLACE THE DEVICE ONLINE. IT WILL CALL THE DRIVER AT BOTHP@; THE KRB STATUS CHANGE ENTRY AND THE UCB STATUS CHANGE ENTRY.; ; INPUTS:A;G; R3=UCB ADDRESS. 1; R4=KRB ADDRESS OF CONTROLLER NEEDING VECTORS.R%; R5=CTB ADDRESS FOR THE KRB IN R4.T; ; OUTPUTS:; =; VECTORS HAVE BEEN CREATED WHEN CONTROL RETURNS TO CALLER.R&; THE DEVICE HAS BEEN PLACED ONLINE.;NONLIN: ;REFERENCE LABEL .IF DF R$$CON! MOV R3,-(SP) ;SAVE UCB ADDRESSC! MOV R4,-(SP) ;SAVE KRB ADDRESSL! MOV R5,-(SP) ;SAVE CTB ADDRESST .IFTF ; DF R$$CON1 MOV #GETVC,-(SP) ;PREPARE FOR COORTOUTINE CALLN,10$: CALL @(SP)+ ;GET NEXT VECTOR ADDRESS# BCS 30$ ;IF CS RETURN TO CALLERS BEQ 20$ ;IF EQ NO ERRORS .IFT ; DF R$$CONU. MOV R0,-(SP) ;SAVE IMPORTANT VALUES IN CASE MOV R2,-(SP) ;USER WANTS TO MOV R4,-(SP) ;CONTINUE FROM" MOV R5,-(SP) ;A WARNING MESSAGE6 MOV #NULL,R4 ;DUMMY LINE IF COMMON INTERRUPT DEVICE> BITB #LS.MDC,L.STS(R5) ;IS IT MULTIDRIVER CONTROLLER DEVICE. BNE 12$ ;IF NE YES -- CAN'T TELL WHICH ONE8 MOV L.DCB(R5),R5 ;GET DCB ADDRESS OR COMMON INT TABLE< BITB #LS.CIN,L.STS(R5) ;IS IT COMMON INTERRUPT CONTROLLER  BEQ 11$ MOV CI.DCB(R5),R5.11$: MOV D.NAM(R5),XX ;PLACE NAME IN MESSAGE) MOV #MESS4,R4 ;SPECIFY CORRECT MESSAGE12$: SUB #2,R1  MOV R1,R2 SUB #4,R1 ;IS IT FATAL?M BPL 15$ ;IF PL NOR CALL $FATAL BR 17$ ;RENTER FLOW "15$: CALL WARN ;WARNING MESSAGE17$: MOV #GETERR,R4 ;M% ADD R2,R4 ;POINT TO ERROR ADDRESS$# MOV (R4),R4 ;GET ACTUAL MESSAGE  CALL WRITE)* MOV (SP)+,R5 ;RESTORE SAVED VALUES FROM. MOV (SP)+,R4 ;BEFORE ERROR MESSAGE PRINTOUT MOV (SP)+,R2Q MOV (SP)+,R0C# BREAK ;AN ERROR CODE IS IN R1.A  .IFF ; DF R$$CONV   HALT ;HALT ON ERROR   .IFTF ; DF R$$CON;,F; CHECK THE ERROR CODE IN R1 AND SEE WHAT IT MEANS BY CONSULTING THEG; TABLE OF $GETVC ERROR CODES BELOW. IF THE ERROR IS A WARNING, THENVF; YOU MAY PROCEED OR CONTINUE IF DESIRED. IF THE ERROR IS FATAL, DOG; NOT ATTEMPT TO PROCEED FURTHER. TAKE REMEDIAL ACTION AND TRY AGAIN.E;M-20$: MOV R2,(R0)+ ;PLUG PC WORD INTO MEMORY  CLR (R0) ;SET UP FOR PS WORD8 BISB K.CON(R4),(R0) ;PUT CONTROLLER NUMBER IN PS WORD! ASR (R0) ;MAKE IT REAL NUMBER4 BIS #PR7,(R0) ;AND PRIORITY 7 INTERRUPT INITIALLY( TST -(R0) ;BACK UP POINTER FOR GTVEC BR 10$ ;GET NEXT VECTORV30$: ;REFERENCE LABEL .IFT ; DF R$$CONV .! MOV (SP)+,$SCCTB ;SET CTB FOR STATUS CHANGE:" MOV (SP),$SCDEV ;SET UP KRB ARGUMENT FOR KRB STATUS CHG3# MOVB #100,$SCOFL ;SHOW SPECIAL ONLINE TRANSITIONM3$ CALL $KRBSC ;CALL DRIVER AT STATUS CHANGE ENTRY;%&;RK'; ALL DEVICES THAT THIS ROUTINE DEALS WITH (I.E. DISKS, CONSOL TERMINALS,0H(; 00eqqmmmffDATAAND IIST) MUST NOT MAKE USE OF THE DELAYED RETURN FEATURE OF $KRBSC.I); IF, HOWEVER, THE KS.SLO BIT IS SET IN K.STS WE WILL WAIT (UP TO ABOUTVJ*; 45 SECONDS) FOR THE DRIVER TO HANDLE THE SLOW CONTROLLER ONLINE TRANS-I+; ITION. IT IS THE DRIVERS RESPONSIBILITY TO HANDLE INTERUPTS FROM THE G,; CONTROLLER ($FORK MAY NOT BE CALLED) AND TO RESTORE $SCERR WHEN THECI-; ONLINE IS COMPLETE. IF THE FOLLOWING "BREAK" IS ENCOUNTERED, THEN IT J.; IS A SOFTWARE DESIGN PROBLEM, OR A BROKEN CONTROLLER IF KS.SLO IS SET,#/; AND AN SPR SHOULD BE SUBMITTED.R0;T1 2 MOV (SP)+,R3 ;GET KRB ADDRESS53 BIT #KS.SLO,K.STS(R3) ;IS THIS A SLOW CONTROLLER?4 BNE 31$ ;IF NE YES)5 TST $SCDEV ;DID THE DRIVER FINISH UP?R6 BEQ 40$ ;IF EQ YES7 BR 35$ ;NO, FATALI7831$: MOV #2000,R4 ;GET VALUE FOR 45 SECOND OUTER LOOPA2932$: MOV #-1,R2 ;GET COUNT FOR INNER DELAY LOOP;:33$: TSTB $SCERR ;IS THE CONTROLLER STILL COMING ONLINE?D$; BNE 40$ ;IF NE NO, IT'S FINISHED < SOB R2,33$ ;INNER LOOP DELAY = SOB R4,32$ ;OUTER LOOP DELAY2>35$: MOV #MESS12,R4 ;SPECIFY MESSAGE FOR CONSOLE%? CALL $FATAL ;FATAL ERROR PRINTOUTI*@ MOV #MESS13,R4 ;SPECIFY ANOTHER MESSAGE)A CALL WRITE ;WRITE WITHOUT CR/LF FIRSTSB MOV #MESS15,R4 'C CALL WRITLN ;WRITE WITH CR/LF FIRST:D BREAK FATALE8F40$: MOV $SCCTB,R4 ;GET CTB ADDRESS FROM PREVIOUS CALL,G MOV R4,$TEMP1 ;SAVE CTB ADDRESS FOR LATER*H MOV L.NAM(R4),UU ;PLACE NAME IN MESSAGE1I MOV #UU+2,R2 ;SET INITIAL VALUE FOR CHARACTERS;'J MOVB K.CON(R3),R5 ;GET CONTROLLER IDOK ASR R5 ;MAKE IT REAL IDRL CLR R4 ;SET UP FOR DIVIDE(M DIV #22.,R4 ;TWO POSSIBLE CHARACTERS%N BEQ 45$ ;IF EQ NO FIRST CHARACTERE6O MOVB CTLET(R4),(R2)+ ;PLACE FIRST LETTER IN MESSAGE;P45$: MOVB CTLET(R5),(R2)+ ;PLACE SECOND LETTER IN MESSAGEF6Q MOV R2,$TEMP0 ;SAVE POINTER INTO CONTROLLER MESSAGE"R CLRB (R2)+ ;SHOW END OF STRING<S BIT #KS.OFL,K.STS(R3) ;DID ONLINE FUNCTION WORK PROPERLY?T BEQ 50$ ;IF EQ YESUV;VDW; IF THE FOLLOWING BREAK IS ENCOUNTERED, THEN A DEVICE DIDN'T COMEHX; ONLINE PROPERLY. POSSIBLE CAUSES INCLUDE: THE CSR ADDRESS SPECIFIEDKY; IN THE KRB IS INCORRECT; THE DRIVER FOUND SOME CONDITION THAT PROHIBITS($Z; THE DEVICE FROM BEING USED; ETC.[;\'] MOVB $SCERR,R1 ;PUT ERROR CODE IN R1R"^ MOV #MESS16,R4 ;SPECIFY MESSAGE._ CALL $FATAL ;PRINT FATAL MESSAGE ON CONSOL"` MOV #MESS21,R4 ;ANOTHER MESSAGE+a CALL WRITE ;WRITE WITHOUT A CR/LF FIRST?"b MOV #MESS17,R4 ;ANOTHER MESSAGE7c CALL WRITLN ;WRITE WITH A CR/LF AT FRONT OF MESSAGEDd BREAK FATALe4f50$: MOV (SP),$SCDEV ;SET UP FOR UCB STATUS CHANGE3g BNE 55$ ;IF UCB ADDRESS EXISTS -- PUT IT ONLINEOh TST (SP)+ ;CLEAN STACK,i RETURN ;GO HOME EARLY -- NO UCB ADDRESS%j55$: MOV R3,-(SP) ;SAVE KRB ADDRESSC3k MOVB #100,$SCOFL ;SHOW SPECIAL ONLINE TRANSITIONL.l CALL $UCBSC ;CALL DRIVER FOR STATUS CHANGEmn;RBo; AS ABOVE, IF THE DRIVER DOESN'T RETURN IMMEDIATELY, THEN IT ISEp; A SOFTWARE DESIGN ERROR. SUBMIT AN SPR IF YOU ENCOUNTER THE NEXTTq; BREAK INSTRUCTION BELOW.r;s t MOV (SP)+,R3 ;GET KRB ADDRESS5u BIT #KS.SLO,K.STS(R3) ;IS THIS A SLOW CONTROLLER?-v BNE 56$ ;IF NE YES)w TST $SCDEV ;DID THE DRIVER FINISH UP?Ex BEQ 60$ ;IF EQ YESy BR 59$ ;NO, FATALV7z56$: MOV #2000,R4 ;GET VALUE FOR 45 SECOND OUTER LOOPT2{57$: MOV #-1,R2 ;GET COUNT FOR INNER DELAY LOOP;|58$: TSTB $SCERR ;IS THE CONTROLLER STILL COMING ONLINE?I$} BNE 60$ ;IF NE NO, IT'S FINISHED ~ SOB R2,58$ ;INNER LOOP DELAY  SOB R4,57$ ;OUTER LOOP DELAY:59$: MOV #MESS12,R4 ;SPECIFY MESSAGE TO PRINT ON CONSOLE. CALL $FATAL ;PRINT FATAL MESSAGE ON CONSOL4 MOV #MESS14,R4 ;SPECIFY ANOTHER MESSAGE ON CONSOL' CALL WRITE ;WRITE MESSAGE TO CONSOL " MOV #MESS15,R4 ;ANOTHER MESSAGE! CALL WRITLN ;WITH CR/LF FIRSTE BREAK FATAL$60$: MOV (SP)+,R5 ;GET UCB ADDRESS0 BITB #US.OFL,U.ST2(R5) ;WHAT IS ONLINE STATUS  BEQ 70$ ;IF EQ DEVICE ONLINE;NA; THE DEVICE COULD NOT BE PUT ONLINE. THE ONLY REASON FOR THIS;>00erqncccc; IS THAT THE DRIVER REJECTED THE ONLINE REQUEST. THE ERROR>; CODE FROM $SCERR IS IN R1. CORRECT THE CONDITION, AND TRY ; AGAIN.;S6 MOVB $SCERR,R1 ;PUT ERROR CODE WHERE XDT CAN SEE IT% MOV $TEMP1,R3 ;RECOVER CTB ADDRESSH8 BITB #LS.MDC,L.STS(R3) ;IS IT MULTIDRIVER CONTROLLER?4 BEQ 63$ ;IF EQ NO -- LEAVE CONTROLLER NAME AS IS$ MOV U.DCB(R5),R3 ;GET DCB ADDRESS0 MOV D.NAM(R3),UU ;PLACE DCB NAME INTO MESSAGE563$: MOV $TEMP0,R3 ;SET POINTER TO CHARACTER STRINGN/ MOVB U.UNIT(R5),R4 ;GET PHYSICAL UNIT NUMBERN BIC #177707,R4E! BEQ 65$ ;IF EQ NO DIGIT THERE.+ ASR R4 ;PLACE DIGIT IN LOW PART OF BYTE  ASR R4  ASR R4R) ADD #'0,R4 ;MAKE INTO ASCII CHARACTER+ MOVB R4,(R3)+ ;PLACE CHARACTER IN SIMPLE 365$: MOVB U.UNIT(R5),R4 ;GET PHYSICAL UNIT NUMBERB BIC #177770,R4 ;GET MASKN  ADD #'0,R4 ;MAKE INTO NUMBER# MOVB R4,(R3)+ ;PLACE INTO STRINGR MOVB #':,(R3)+ ;ADD COLON  CLRB (R3)+ ;TERMINATE STRING6 MOV #MESS20,R4 ;SPECIFY MESSAGE FOR CONSOL PRINTOUT" CALL $FATAL ;PRINT FATAL ERROR8 MOV #UU,R4 ;SPECIFY PHYSICAL UNIT NUMBER OF LOAD DEV CALL WRITE ;PRINT LINE" MOV #MESS21,R4 ;ANOTHER MESSAGE# CALL WRITE ;WRITE WITH NO CR/LFM" MOV #MESS17,R4 ;ANOTHER MESSAGE! CALL WRITLN ;WRITE WITH CR/LFT BREAK FATAL .ENDC ; DF R$$CON 70$: RETURNR;I; N O T E W E L L :;L@; THE FOLLOWING CODE HAS BEEN LIFTED DIRECTLY FROM THE MODULE?; SAVVEC.MAC. THE ONLY MODIFICATION MADE TO IT IS TO REMOVENB; THE GLOBAL SYMBOLS. IT SHOULD NOT BE FURTHER MODIFIED, SINCEA; IT IS IMPORTANT TO KEEP THIS CODE "EXACTLY" LIKE THE CODE IN#A; SAVVEC.MAC. FURTHERMORE, ANY MODIFICATIONS TO SAVVEC SHOULD2; BE REFLECTED IN MODIFICATIONS TO THIS MODULE.;W0; ORIGINALLY LIFTED FROM SAVVEC.MAC 1-MAR-78.;N<; MOST RECENTLY UPDATED TO REFLECT CHANGES TO SAVVEC.MAC:; ; K. E. KINNEAR 23-MAR-78; ;F; SPECIAL EQUATED SYMBOLSA;H(; $GETVC ERROR CODES (MUST BE NONZERO);)GT$E1==1*2 ;DRIVER NOT LOADED (FATAL)R:GT$E2==2*2 ;DRIVER DOES NOT SUPPORT CONTROLLER (FATAL))GT$E3==3*2 ;VECTOR TOO HIGH (WARNING) 'GT$E4==4*2 ;VECTOR IN USE (WARNING)S3GT$E5==5*2 ;UNIBUS RUN NOT ACCESSIBLE (WARNING)D;W; LOCAL DATA;TANONSI: .WORD $NONSI ;ADDRESSES OF EXECUTIVE NONSENSE INTERRUPTC!NS0: .WORD $NS0 ; ENTRY POINTS  .WORD $NS1 ; .WORD $NS2 ; .WORD $NS3 ; .WORD $NS4 ; .WORD $NS5 ; .WORD $NS6 ;NS7: .WORD $NS7 ;;+(; **-GETVC-GET THE NEXT VECTOR ADDRESS; D; THE INSTRUCTIONS IN THIS ROUTINE CANNOT BE MAPPED BY KISAR6 (THEE; VIRTUAL ADDRESSES MUST NOT BE BETWEEN 140000 AND 160000), BECAUSE54; THIS ROUTINE REMAPS (AND LATER RESTORES) KISAR6.;OJ;***********************************************************************I; CODE IN THIS MODULE IS DUPLICATED IN THE EXECUTIVE MODULE INITL. ANY$/; BUG FIXES HERE MUST BE REPLICATED THERE!!!!OK;************************************************************************T;N ; INPUTS:D;E; THIS ROUTINE IS CALLED AT SYSTEM STATE TO PROVIDE AN INTERLOCKT"; ON THE VECTOR MANIPULATION.;W; WHEN CALLED INITIALLY,5; R4 = ADDRESS OF KRB ; R5 = ADDRESS OF CTBR; (SP) = RETURN ADDRESS*;*'; WHEN CALLED BACK AS A COROUTINE,*5; IF R0<>0, VECTOR ADDRESS PRESERVED FROM LAST CALLE;; IF R0=0, AFTER CLEANING UP THE STACK, $GETVC EXITS WITHI ; C=1 ; R1=0*6; R0, R2, R3, R4, R5 PRESERVED AND NOT EXAMINED0; R4 = ADDRESS OF KRB PRESERVED FROM LAST CALL0; R5 = ADDRESS OF CTB PRESERVED FROM LAST CALL; (SP) = RETURN ADDRESSR;P ; OUTPUTS:; C; IF C=0, $GETVC MAY BE CALLED AGAIN AS A COROUTINE (THERE MAYS2; BE ANOTHER VECTOR ADDRESS TO BE RETURNED)6; R0 = VECTOR ADDRESS (BIASED TO MAP THROUGH KISAR6)&; IF R1=0, R0 AND R2 CAN BE USED AND ; Z=12 ; IF R1<>0, ERROR CODE (GT$E3, GT$E4, GT$E5) AND ; Z=0 ; R2 = PC WO00e rqmmmffDATARD FOR VECTOR, ; R3 = DESTROYED ; R4 = PRESERVED; R5 = PRESERVED; (SP) = TEMPORARY STORAGE; 2(SP) = TEMPORARY STORAGEL.; 4(SP) = CONTENTS OF KISAR6 AT INITIAL CALL; 6(SP) = TEMPORARY STORAGE$*; KISAR6 = MAPS R0 TO THE VECTOR ADDRESS;A;; IF C=1, $GETVC CANNOT BE CALLED AGAIN AS A COROUTINE0?; R0 = MAY BE A VECTOR ADDRESS (BIASED TO MAP THROUGH KISAR6) ; IF R1=0, NO MORE VECTORS AND ; Z=1+; IF R1<>0, ERROR CODE (GT$E1, GT$E2) AND ; Z=0; R2 = DESTROYED; R3 = DESTROYED; R4 = PRESERVED; R5 = PRESERVEDD; KISAR6 = RESTORED TO THE MAPPING AT THE TIME OF THE INITIAL CALL ;-!"GETVC: ;;ENTRY POINTA%# MOV (SP),R3 ;;SAVE RETURN ADDRESS8$ MOV L.ICB(R5),(SP) ;;SAVE ADDRESS OF FIRST ICB (OR 0)5% MOV @#KISAR6,-(SP) ;;RESERVE OTHER STACK LOCATIONS& CLR -(SP) ;;)' CLR -(SP) ;; (ASSUME RESIDENT DRIVER) (( CLR R0 ;;FORM FIRST VECTOR ADDRESS/4) BISB K.VCT(R4),R0 ;;O(* BEQ 42$ ;;IF EQ THERE ARE NO VECTORS&+ ASL R0 ;;FORM FIRST VECTOR ADDRESS , ASL R0 ;;V7- MOV L.DCB(R5),R1 ;;GET POINTER TO A COMMON INTERRUPTI,. ;; ROUTINE ADDRESS OR ADDRESS OF A DCB6/ MOV (R1),R2 ;;GET COMMON INTERRUPT ROUTINE ADDRESS>0 BITB #LS.CIN,L.STS(R5) ;;IS THIS A COMMON INTERRUPT DEVICE?1 BNE 60$ ;;IF NE YESP:2 MOV D.DSP(R1),R2 ;;GET ADDRESS OF DRIVER DISPATCH TABLE(3 BEQ 98$ ;;IF EQ DRIVER IS NOT LOADED4; A5; THE FOLLOWING CODE ASSUMES THAT THIS SYSTEM SUPPORTS LOADABLE$>6; DRIVERS (I.E., THAT D.PCB EXISTS). ALL M+ SYSTEMS SUPPORT7; LOADABLE DRIVERS.8;V29 MOV D.PCB(R1),R1 ;;DRIVER RESIDENT OR LOADABLE?: BEQ 10$ ;;IF EQ RESIDENT+; MOV P.REL(R1),(SP) ;;SAVE MAPPING TO DDTI!< MOV (SP),@#KISAR6 ;;MAP TO DDTL-= ADD #20000,R2 ;;BIAS POINTER TO USE KISAR6V6>10$: ADD #D.VINT,R2 ;;POINT AT FIRST CONTROLLER NAME?@; GA; SEARCH THE DDT FOR THE VECTOR AND INTERRUPT ENTRY POINT INFORMATION9B; THAT APPLIES TO THIS CONTROLLER. THE DDT LOOKS LIKE:AC;$CD; $XXTBL+D.VINT: CONTROLLER INFORMATION (NONZERO WORDS TERMINATED E; BY A ZERO WORD)F; .WORD $XYCTBG;RH; CONTROLLER INFORMATIONI; .WORD $XZCTB J; .P K; .; L; . M;N; $XXTBE:: .WORD 0O;TP-Q CLR R1 ;;INITIALIZE OFFSET TO NEXT VECTORR&R20$: TST (R2) ;;REACHED END OF DDT?S BEQ 150$ ;;IF EQ YES7T CMP L.NAM(R5),(R2) ;;FOUND INFO FOR THIS CONTROLLER? U BEQ 40$ ;;IF EQ YESH8V30$: TST (R2)+ ;;PASSED OVER ALL INFO FOR CONTROLLER?W BNE 30$ ;;IF NE NO X TST (R2)+ ;;SKIP CTB POINTER Y BR 20$ ;;Z[; 3\; THE INFORMATION FOR EACH CONTROLLER LOOKS LIKE:R];R+^; .ASCII /XY/ ;CONTROLLER (CTB) MNEMONIC:_; .WORD INTERRUPT ENTRY POINT ADDRESS (NONZERO AND EVEN)*`; .WORD INTERRUPT ENTRY POINT ADDRESS ORa; VECTOR OFFSET (ODD) b; .E c; . d; .I e; .WORD 0Cf;N?g; THERE MAY BE ZERO OR MORE WORDS OF INFORMATION BETWEEN THEE5h; CONTROLLER MNEMONIC AND THE TERMINATING ZERO WORDNi;Ej6k40$: TST (R2)+ ;;POINT TO NEXT CONTROLLER INFO WORD.l TST (R2) ;;REACHED END OF CONTROLLER INFO?m42$: BEQ 120$ ;;IF EQ YES8n BIT #1,(R2) ;;IS ENTRY AN INTERRUPT ENTRY POINT ADDRo BEQ 50$ ;;IF EQ YESO.p MOV (R2),-(SP) ;;FORM VECTOR ADDRESS OFFSETq DEC (SP) ;;D0r CLR R1 ;;CLEAR DEFAULT VECTOR ADDRESS OFFSET)s ADD (SP)+,R0 ;;FORM NEW VECTOR ADDRESS t BR 40$ ;;A&u50$: MOV R2,2(SP) ;;SAVE DDT POINTER(v ADD R1,R0 ;;FORM NEXT VECTOR ADDRESS7w MOV (R2),R2 ;;GET DRIVER INTERRUPT ENTRY POINT ADDR;)x TST (SP) ;;IS THIS A RESIDENT DRIVER?(y BEQ 60$ ;;IF EQ YEST!z MOV 6(SP),R2 ;;GET ICB POINTER {52$: MOV R2,R1 ;;COPY ITE!| ASL R2 ;;FORM VIRTUAL ADDRESS/} MOV (R2)+,6(SP) ;;ASSUME NOT A MP/I&D SYSTEMM)~ ;; (ASSUME CURRENT MAPPING IS OKAY)1 TSTB $NCPU ;;IS THIS A MULTIPROCESSOR SYSTEM?A BEQ 60$ ;;IF EQ NO6 BIT #F2.DAS,$FMASK+2 ;;IS THIS AN I&D SPACE SYSTEM? BEQ 60$ ;;IF EQ NO, BIC #7777,R1 ;;CLEAR VIRTUAL ADDRESS BITS+ SWAB R1 ;;FORM CPU NUMBER*2 OF ICB LINK  ASR R1 00erqncccc ;;I  ASR R1 ;;N  ASR R1 ;;B3 MOV $K6TAB(R1),@#KISAR6 ;;MAP TO ICB'S CPU POOLE. BIC #160000,R2 ;;CLEAR CPU NUMBER BITS5 BIS #140000,R2 ;;BIAS ICB POINTER TO USE APR6 = BIT $URMTB(R1),K.URM(R4) ;;THIS ICB POINTER FOR THE CPU TOT+ ;; WHICH THE DEVICE IS CURRENTLYA ;; CONNECTED? BNE 54$ ;;IF NE YES;& MOV -(R2),R2 ;;GET NEXT ICB POINTER  BR 52$ ;;154$: MOV -(R2),6(SP) ;;SAVE POINTER TO NEXT ICB , ADD #40002,R2 ;;REMOVE BIAS BITS AND FORM ;; ADDRESS OF ICB'S JSRR;,; VECTOR ADDRESS TOO HIGH FOR THIS SYSTEM?;/60$: CMP $VECTR,R0 ;;VECTOR ADDRESS TOO HIGH?S BLO 160$ ;;IF LO YES; B; MAP TO THE CORRECT CPU VECTOR AREA IF THIS IS A MULTIPROCESSOR; CONFIGURATION ;H0 MOVB $NCPU,R1 ;;GET NUMBER OF CPU'S IN SYSTEM0 BEQ 80$ ;;IF EQ THIS IS NOT A MULTIPROCESSOR$ ASL R1 ;;CONVERT TO A WORD INDEX.70$: SUB #2,R1 ;;CHECKED ALL OF PROCESSORS? BLT 170$ ;;IF LT YES8 BIT K.URM(R4),$URMTB(R1) ;;IS CONTROLLER ON THIS CPU? BEQ 70$ ;;IF EQ NO: MOV $K6TAB(R1),@#KISAR6 ;;MAP TO VECTOR CONTEXT FOR CPU5 BIS #140000,R0 ;;BIAS VECTOR ADDRESS TO USE KISAR6; C; SEE IF VECTOR IS IN USE (DOES NOT POINT TO A NONSENSE INTERRUPTO; ENTRY POINT);180$: MOV #NONSI,R1 ;;POINT TO TABLE OF NONSENSEQ ;; INTERRUPT ENTRY POINTSP)90$: CMP (R1)+,(R0) ;;IS VECTOR IN USE?D BEQ 100$ ;;IF EQ NOH& CMP #NS7,R1 ;;REACHED END OF TABLE BHIS 90$ ;;IF HIS NO;(; VECTOR IN USE (WARNING)P;! MOV #GT$E4,R1 ;;GET ERROR CODE, BR 167$ ;;WARNINGR;F; DRIVER NOT LOADED (FATAL)S;O%98$: MOV #GT$E1,R1 ;;GET ERROR CODE  BR 130$ ;;; D; R2 CONTAINS WHAT SHOULD BE PUT INTO THE FIRST WORD OF THE VECTORF; (PROGRAM COUNTER) IF THE CALLER IS INITIALIZING THE VECTOR. R2 IS#; ONE OF THE FOLLOWING ADDRESSES:C;N7; 1) DRIVER INTERRUPT ENTRY POINT (RESIDENT DRIVER)EB; 2) SECOND WORD OF AN INTERRUPT CONTROL BLOCK (LOADED DRIVER)3; 3) ENTRY POINT OF A COMMON INTERRUPT ROUTINEC;.100$: MOV R3,-(SP) ;;POSITION RETURN ADDRESS+ CLR R1 ;;SHOW GOOD VECTOR ADDRESS (C=0);"110$: CALL @(SP)+ ;;CALL CALLER;; AT THIS POINT:; ; (SP) = RETURN ADDRESSO; IF 2(SP)=0, RESIDENT DRIVERR3; IF 2(SP)<>0, MAPPING TO DDT FOR LOADABLE DRIVER0; 4(SP) = ADDRESS OF LAST WORD EXAMINED IN DDT&; 6(SP) = INITIAL CONTENTS OF KISAR6'; 10(SP) = ADDRESS OF NEXT ICB (OR 0)R;C% MOV (SP)+,R3 ;;SAVE RETURN ADDRESSR+ TST R0 ;;CALLER WANT AN IMMEDIATE EXIT? BEQ 120$ ;;IF EQ YES: BITB #LS.CIN,L.STS(R5) ;;A COMMON INTERRUPT CONTROLLER?+ BNE 120$ ;;IF NE YES -- ONLY ONE VECTORR) MOV #4,R1 ;;GET DEFAULT VECTOR OFFSETS( MOV 2(SP),R2 ;;RESTORE POINTER TO DDT1 MOV (SP),@#KISAR6 ;;IF NECESSARY, REMAP TO DDTO& BIC #160000,R0 ;;CLEAR MAPPING BITS  BR 40$ ;;E-120$: CLR R1 ;;SHOW ALL VECTORS WERE FOUND6-130$: CMP (SP)+,(SP)+ ;;CLEAR OFF STACK ANDC/ MOV (SP)+,@#KISAR6 ;;RESTORE INITIAL MAPPINGT% MOV R1,(SP)+ ;; SET OR CLEAR Z-BIT* SEC ;;SHOW CANNOT CALL AS A COROUTINE JMP (R3) ;;RETURNT;N.; DRIVER DOES NOT SUPPORT CONTROLLER (FATAL);R&150$: MOV #GT$E2,R1 ;;GET ERROR CODE BR 130$ ;;;R; VECTOR TOO HIGH (WARNING)#;6&160$: MOV #GT$E3,R1 ;;GET ERROR CODE.167$: MOV R3,-(SP) ;;POSITION RETURN ADDRESS' CLC ;;SHOW CAN CALL AS A COROUTINE6 BR 110$ ;;; '; UNIBUS RUN NOT ACCESSIBLE (WARNING)S;;&170$: MOV #GT$E5,R1 ;;GET ERROR CODE BR 167$ ;;;!; END OF DYNAMIC STORAGE REGIONR;E2 INEND: ;REFERENCE LABEL FOR END TO DEALLOCATE0  .BLKB 2 ;EXTRA FOR POSSIBLE ALIGNMENT CHANGE ;2' ; BEGINNING OF DYNAMIC STORAGE REGION ; .IF DF K$$DAS3$ICBEG::.WORD 0 ;LINK TO NEXT BLOCK IN FREE LIST6 .WORD <<+3>&177774> ;LENGTH OF FREE BLOCK> .BLKB <<+3>&177774>-4 ;ALLOCATE REMAINING STORAGE&$ICTOP:: ;LA00erfrmmmffDATAST ADDRESS IN ICB POOL .IFF 3$SYBEG::.WORD 0 ;LINK TO NEXT BLOCK IN FREE LIST 6 .WORD <<+3>&177774> ;LENGTH OF FREE BLOCK> .BLKB <<+3>&177774>-4 ;ALLOCATE REMAINING STORAGE'$SYTOP:: ;LAST ADDRESS IN EXECUTIVEN .ENDC ! .END $INITL .IF DF K$$DAS3$ICBEG::.WORD 0 ;LINK TO NEXT BLOCK IN FREE LIST6 .WORD <<+3>&177774> ;LENGTH OF FREE BLOCK> .BLKB <<+3>&177774>-4 ;ALLOCATE REMAINING STORAGE&$ICTOP:: ;LA .TITLE DRTBLL .IDENT /05.12/ ;SE; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.O7; COPYRIGHT (C) 1987 BY DIGITAL EQUIPMENT CORPORATIONI; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;0 ; B. S. MCCARTHY 17-MAR-81 ;# ; MODIFIED FOR RSX-11M-PLUS V2.1:R ;T; J. R. KAUFFMAN; T. M. MARTIN; B. S. MCCARTHY$;.-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:O;; J. W. BERZLE; J. R. KAUFFMAN; J. M. LAWLER; B. S. MCCARTHY;D-; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:C;7$; B. S. MCCARTHY 12-DEC-86 05.08;"; BM377 -- MOVE DRSPW TO DR211M;N ; K. L. NOEL 29-JAN-87 05.09; !; KLN031 -- ADD GDVI DIRECTIVE ;S#; B. S. MCCARTHY 5-MAR-87 05.101;+; BM385 -- INDICATE THAT DREXP AND DRGCL#; ARE IN SECOND COMMON (THEY'RE"; REALLY IN THE VECTOR COMMON);F$; B. S. MCCARTHY 12-JUN-87 05.12; !; BM402 -- ADD DFCTSK TO RSUM$;M6; DIRECTIVE DISPATCHER TABLE7;D8; THIS MODULE WAS SPLIT OUT OF DRTBL AND RESTRUCTURED TO ALLOW FORG9; MORE DIRECTIVE FLAGS, STREAMLINE DIRECTIVE PROCESSING, AND TO ALLOW.4:; THIS MODULE TO BE PLACED IN THE DIRECTIVE COMMON;;I<;V= .PAGE>?;+0@; DEFINE BITS FOR THE DIRECTIVE DISPATCH TABLEA;-BC;XKD; THE DIRECTIVE DISPATCHER BITS OCCUPY A WORD FLAG TABLE. THERE ARE THREER0E; GROUPS OF BITS, SHOWN WITH SUBOPTIONS BELOW:F;GHH; ACHKDB - ADDRESS CHECK AND MAP PLAS DEFINITION BLOCK. THE DPB IS TWO>I; WORDS, THE SECOND OF WHICH IS THE ADDRESS OF A REGION OR=J; WINDOW DEFINITION BLOCK, 8 WORDS LONG. THE STURCTURE ISEBK; ADDRESS CHECKE AND MAPPED, AND IF VALID IS PASSED IN LIEU OF'L; THE DPB TO THE DIRECTIVE ROUTINE.M;IGN; CEFNCL - CALL $CEFN. THE DPB CONTAINS AN EVENT FLAG NUMBER WHICH ISV+O; CONVERTED TO A MASK WORD AND ADDRESS.HP;RGQ; CEFNMT - AN ERROR OF D.RS97 IS RETURNED IF THE EFN IN THE DPB IS (R; NULL (NO EVENT FLAG SPECIFIED).S;BCT; GEFUSE - IF THE SPECIFIED EVENT FLAG IS GROUP GLOBAL, DO NOT !U; INCREMENT THE USE COUNT.TV;LFW; SRSTCL - DIRECTIVE DEALS WITH A TCB, DPB CONTAINS NAME. DISPATCHER?X; CALLS $SRSTD (OR SIMILAR) AND RETURNS ERROR D.RS2 IF TASKR,Y; SPECIFIED IN THE DPB IS NOT INSTALLED.Z;NF[; DFCTSK - IF THE TASK NAME IN THE DPB IS NULL (BINARY ZERO), THE\; CURRENT TASK IS USED.G]; MUPCHK - MULTI-USER PROTECTION CHECKS. THE TARGET TASK MUST HAVE >^; THE SAME TI: AS THE ISSUING TASK, OR THE ISSUING TASK_; MUST BE PRIVILEGED,H`; CRETCB - IPLIES THAT THE DIRECTIVE MAY CREATE A TCB FROM A PROTO-?a; TYPE, AND THEREFORE SUPPRESSES THE SEARCH FOR A MULTI-S;b; USER COPY OF THE TASK FROM THIS TERMINAL. (IMPLIESFc; SECTCB)Cd; SECTCB - THIS DIRECTIVE MAY DEAL WITH TCBS IN SECONDARY POOLNe;BBf; ANY SUB-FUNCTION BIT IMPLIES THE MAJOR FUNCTION BIT. THE THREE+g; MAJOR FUNCTIONS ARE MUTUALLY EXCLUSIVE.Uh;V@i; THE POSITION OF THE BITS WITHIN THE FLAGS WORD IS AS FOLLOWSj; Ck; 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0AFl; +---+---+----+---+---+---+---+---+---+---+---+---+---+---+---+---+Fm; | | | | | | | | | | | | | | | | |Fn; | A | S | DC | M | | | C | G | S | C | | | | | | |Fo; | C | E | FR | U | | | E | E | R | E | | | | | | |Fp; | H | C | CE | P | | | F | F | S | F | 00f"rqncccc | | | | | |Fq; | K | T | TT | C | | | N | U | T | N | | | | | | |Fr; | D | C | SC | H | | | M | S | C | C | | | | | | |Fs; | B | B | KB | K | | | T | E | L | L | | | | | | |Ft; | | | | | | | | | | | | | | | | |Fu; +---+---+----+---+---+---+---+---+---+---+---+---+---+---+---+---+ v; |w; +x; SPECIAL NOTE REGARDING PLAS DIRECTIVES:|y; @z; ALL DIRECTIVES SPECIFYING "ACHKDB" MUST BE BUILT IN THE PLASF{; DIRECTIVE COMMON (OR RESIDENT IN THE EXEC) SINCE THAT BIT TRIGGERSM{; THE REMAPPING OF THE DIRECTIVE COMMON. THESE DIRECTIVES MUST USE ; BM377|I{; THE DIRP MACRO SO THAT THE ADDRESSES ARE STORED UNADJUSTED. ; BM377|{ ; BM377  .PAGE ;**-5 ACHKDB = 100000 CEFNCL = 100 CEFNMT = 1000!CEFNCL- GEFUSE = 400!CEFNCL- SRSTCL = 200 SECTCB = 40000!SRSTCLG DFCTSK = 20000!SRSTCL CRETCB = 20000!SRSTCL!SECTCB MUPCHK = 10000!SRSTCLS;+; LOCAL MACROS;-;E); DEFINE DIRECTIVE DISPATCH TABLE ENTRYP;F!; DIR ADDR,SIZE,MASK,COND,SCONDI;U ; WHERE:;A; ADDR=ADDRESS OF THE DIRECTIVE EXECUTION ROUTINE OR '.FALSE.'. ;; SIZE=SIZE OF THE DPB REQUIRED BY THE DIRECTIVE ROUTINE.A=; MASK=CONTROL BITS TO BE USED BY THE DIRECTIVE DISPATCHER.<; COND=EXPRESSION ON WHICH DIRECTIVE IS CONDITIONALIZED. A4; DEFAULT OF $DSTAB IS USED FOR CONVENIENCE (I.E.; UNCONDITIONAL).<; SCOND=CONDITIONAL EXPRESSION ON WHICH SIZE BYTE IS TO BE5; ZERO (VARIABLE-LENGTH DPB). A DEFAULT OF XXXXXX4; IS USED FOR CONVENIENCE (I.E. SIZE IS NONZERO).; .PAGE' .MACRO DIR ADDR,SIZE,MASK,COND,SCOND' .IF IDN ,<.FALSE.>R DIRC .FALSE.I .IFF% DIRC ADDR,0,SIZE,,COND,SCONDE .ENDC .ENDM DIR( .MACRO DIR2 ADDR SIZE,MASK,COND,SCOND* DIRC ADDR,100000,SIZE,,COND,SCOND .ENDM DIR2N ; BM377=4 .MACRO DIRP ADDR SIZE,MASK,COND,SCOND ; BM377 ; BM377G4 DIRC ADDR,REAL,SIZE,,COND,SCOND ; BM377 ; BM377N .ENDM DIRP ; BM377 ; BM377R .PAGE: .MACRO DIRC ADDR,COM,SIZE,MASK,COND=$DSTAB,SCOND=XXXXXX .IF EQ PASS-1 .BLKW 3 .IF DIF ,<.FALSE.>N .IF DF COND HI$DIC==<<.-$DSTAB>/6>-1A .GLOBL ADDR .ENDC ; DF COND .ENDC ; DIF ,<.FALSE.>K .IFF ; EQ PASS-1M .IF GT TB$SIZ-<.-$DSTAB> .WORD 0$$$=.I .=.+TB$SIZ-2D .WORD 0 .=.+TB$SIZ-2M .WORD 0 .=$$$ .IF DIF ,<.FALSE.>3 .IF DF COND DSPMK=0 .IF NB  .IRP X,DSPMK=DSPMK!X .ENDM .ENDC ;NB O .IF DF SCOND$ DSPSZ=0= .IFFDSPSZ=SIZE*2 .ENDC ; DF SCONDFHI$DIC==<<.-$DSTAB>/2>-1.=.-2 .IF GT 28.-DSPSZ6 .BYTE DSPSZ,-<2*DSPSZ>N .IFFO .BYTE DSPSZ,0 .ENDC ; GT 28.-DSPSZ .=.+TB$SIZ-2 ; BM377T% .IF DIF , ; BM377I ; BM377. .WORD <&77777>!COM$ ; BM377D( .IFF ; DIF , ; BM377 ; BM377 .WORD ADDR ; BM377 ; BM377C( .ENDC ; DIF , ; BM377 ; BM377I .=.+TB$SIZ-2D .WORD DSPMK .=$$$ .ENDC ; DF COND .ENDC ; DIF ADDR,<.FALSE.>E .ENDC ; GT TB$SIZ-<.-$DSTAB>. .ENDC ; EQ PASS-1 .ENDM .PAGE;+/; DEFINE SYMBOL INDICATING WHICH PASS THIS ISL;- .IF NDF PASS PASS = 1 .IFFA PASS = 2! .ENDC;+; DIRECTIVE DISPATCH TABLE;--$DSTAB::DIR2 $DRQIO,12. ;001.-QUEUE I/O / DIR2 $DRQIO,12. ;003.-QUEUE I/O AND WAITF@ DIR2 $DRGLI, G$$DVI ;005.-GET LUN ASSIGNMENT AND ;KLN031+ ; GET DEVICE INFORMATION ;KLN031 . DIR $DRASG, 4. ;007.-ASSIGN LUN ;**-10 DIR $DRATP, 4.,DFCTSK ;009.-ALTER PRIORITY@ DIR2 $DRREQ, 7.,CRETCB,,P$$OFF ;011.-REQUEST/SPAWN ; BM300f*rrmmmffDATA77- DIR .FALSE. ;013.-INVALID DIC ;**-1S%  DIR .FALSE. ;015.-INVALID DICC+  DIR $DRRUN,11.,SRSTCL ;017.-RUN TASK-%  DIR .FALSE. ;019.-INVALID DIC13  DIR2 $DRRRA, 2., ,P$$LAS ;021.-REC BY REF ASTA,  DIR $DRMKT, 5.,CEFNCL ;023.-MARK TIME: DIR $DRCSR, 3.,MUPCHK ;025.-CANCEL SCHEDULE REQUESTS7 DIR $DRCMS, 0. ;027.-CANCEL SELECTIVE MARK TIMES;> DIR2 $DREXS, 2., ,P$$OFF ;029.-EXIT WITH STATUS ; BM377? DIR $DRCEF, 2., ;031.-CLEAR EVENT FLAG ;**-1.6 DIR $DRSEF, 2., ;033.-SET EVENT FLAG5 DIR $DRDSE, 1. ;035.-DECLARE SIGNIFICANT EVENT17 DIR $DRREF, 2., ;037.-READ EVENT FLAGD: DIR $DRRAF, 0. ;039.-READ ALL(EXTENDED) EVENT FLAGS8 DIR $DRWFS, 2.,CEFNMT ;041.-WFR SINGLE EVENT FLAG1 DIR $DRWFL, 3. ;043.-WAITFOR LOGICAL OR OF, ; EVENT FLAGSE- DIR $DRSPN, 1. ;045.-SUSPEND EXECUTION2A DIR $DRRES, 3.,DFCTSK ;047.-RESUME TASK EXECUTION ; BM4021; DIR $DRWSE, 1. ;049.-WAITFOR SIGNIFICANT EVENT ;**-1 % DIR $DREXT, 1. ;051.-TASK EXIT / DIR $DREIF, 2., ;053.-EXIT IFE@ DIRP $DRCRR, 2.,ACHKDB,P$$LAS ;055.-CREATE REGION ; BM377@ DIRP $DRATR, 2.,ACHKDB,P$$LAS ;057.-ATTACH REGION ; BM377@ DIRP $DRDTR, 2.,ACHKDB,P$$LAS ;059.-DETACH REGION ; BM3776! DIR $DRGTP, 0. ;061.-GET TIME PARAMETERS ;**-3/" DIR $DRGTK, 2. ;063.-GET TASK PARAMETERSR4# DIR $DRGPP, 4. ;065.-GET PARTITION PARAMETERS%$ DIR .FALSE. ;067.-INVALID DIC 9% DIR $DRSRF, 5.,SECTCB,P$$LAS ;069.-SEND BY REFERENCEE&'( .IF DF P$$OOL)@* DIR $DRSND, 0.,SECTCB ;071.-SEND (AND VARIABLE SEND) DATA+, .IFFN-4. DIR $DRSND, 5.,SRSTCL ;071.-SEND DATA TO TASK/0 .ENDC12%3 DIR .FALSE. ;073.-INVALID DICD456 .IF DF P$$OOL718 DIR $DRREC, 0. ;075.-RECEIVE (AND VARIABLE9 ; REC) DATAE:: DIR $DRREC, 0. ;077.-REC (AND VAR REC) DATA OR EXIT;< .IFF=2> DIR $DRREC, 4. ;075.-RECEIVE DATA FROM TASK:? DIR $DRREC, 4. ;077.-RECEIVE DATA FROM TASK OR EXIT@A .ENDCBC%D DIR .FALSE. ;079.-INVALID DICRBD DIRP $DRRRF, 2.,ACHKDB,P$$LAS ;081.-RCV BY REFERENCE ; BM3775F DIR $DRABO, 3.,MUPCHK ;083.-ABORT TASK ;**-1S%G DIR .FALSE. ;085.-INVALID DIC.%H DIR .FALSE. ;087.-INVALID DIC >H DIR2 $DREXP, 3., ,E$$XPR ;089.-EXTEND PARTITION ; BM384-J DIR .FALSE. ;091.-INVALID DIC ;**-1 %K DIR .FALSE. ;093.-INVALID DIC41L DIR $DRDCP, 1. ;095.-DISABLE CHECKPOINTING40M DIR $DRECP, 1. ;097.-ENABLE CHECKPOINTING3N DIR $DRDAR, 1. ;099.-DISABLE AST RECOGNITIONR2O DIR $DREAR, 1. ;101.-ENABLE AST RECOGNITION2P DIR $DRSDV, 3. ;103.-SPECIFY ODT SST VECTOR3Q DIR $DRSTV, 3. ;105.-SPECIFY TASK SST VECTORI2R DIR2 $DRRCV, 2. ;107.-SETUP FOR RECEIVE AST;S DIR2 $DRPUT, 2., ,P$$RFL ;109.-SETUP FOR POWER UP AST6T DIR2 $DRFEX, 2., ,F$$LPP ;111.-SETUP FOR FLP AST7U DIR $DRGMX, 2., ,P$$LAS ;113.-GET MAPPING CONTEXT-)V DIR $DRATX, 1. ;115.-AST TRAP EXIT GV DIRP $DRCRW, 2.,ACHKDB,P$$LAS ;117.-CREATE ADDRESS WINDOW ; BM377OIV DIRP $DRELW, 2.,ACHKDB,P$$LAS ;119.-ELIMINATE ADDRESS WINDOW ; BM377,DV DIRP $DRMAP, 2.,ACHKDB,P$$LAS ;121.-MAP ADDRESS WINDOW ; BM377FV DIRP $DRUNM, 2.,ACHKDB,P$$LAS ;123.-UNMAP ADDRESS WINDOW ; BM377=[ DIR $DRGSS, 1., ,G$$TSS ;125.-GET SENSE SWITCHES ;**-4:[ DIR2 $DRGCL, 0. ;127.-GET MCR COMMAND LINE ; BM384D] DIR2 $DRCIN, 7., ,C$$INT ;129.-CONNECT TO INTERRUPT ;**-1%^ DIR $DRSTP, 1. ;131.-STOP TASKC-_ DIR $DRUNS, 3.,DFCTSK ;133.-UNSTOP TASKD3` DIR $DRSTS, 2.,CEFNMT ;135.-STOP FOR SNGL EFN.8a DIR $DRSTL, 3. ;137.-STOP FOR LOGICAL OR OF EFN'Sbcd .IF DF P$$OOLe1f DIR $DRRCS, 0. ;139.-RECEIVE (AND VAR REC) g ; DATA OR STOPhi .IFFRj0k DIR $DRRCS, 4. ;139.-RECEIVE DATA OR STOPlm .ENDCno8o DIR2 $DRSRC, 0.,SECTCB,P$$OFF ;141.-SDRC ; B00f2rg7rnccccM377Ao DIR2 $DRCNC, 6.,SRSTCL,P$$OFF ;143.-CONNECT TO TASK ; BM377,-r DIR .FALSE. ;145.-INVALID DIC ;**-2T:r DIR2 $DREMS, 4., ,P$$OFF ;147.-EMIT STATUS ; BM377At DIR $DRCRV, 5., ,V$$TRM ;149.-CREATE VIRTUAL TERMINAL ;**-1 >u DIR $DRELV, 2., ,V$$TRM ;151.-ELIMINATE VIRTUAL TERMINAL%v DIR .FALSE. ;153.-INVALID DIC 8w DIR $DRSCA, 3., ,S$$LIB ;155.-SUPERVISOR MODE CALL7x DIR $DRCRE, 2., ,G$$GEF ;157.-CREATE GROUP GLOBAL y ; EVENT FLAGS4:z DIR $DRELE, 0., ,G$$GEF ;159.-ELIMINATE GROUP GLOBAL{ ; EVENT FLAGS4| DIR $DRSAF, 2., ,M$$PRO ;161.-SPECIFY AFFINITY3} DIR $DRRMA, 1., ,M$$PRO ;163.-REMOVE AFFINITY@~ DIR2 $DRPER, 2., ,P$$RTY ;165.-SET UP FOR PARITY ERROR AST: DIR2 $DRREX, 0. ;167.-SET UP FOR REQUESTED EXIT ASTA DIR2 $DRGIN, 0., ,R$$GIN ;169.-GET / PUT SYSTEM INFORMATION$B DIR2 $DRSMG, 0., ,E$$LOG ;171.-SEND MESSAGE TO ERROR LOGGING2 DIR2 $DRCLI, 0., ,A$$CLI ;173.-CLI DIRECTIVE0 DIR $DRSWS, 3., ,S$$WST ;175.-SWITCH STATE; DIR $DRFEA, 2., ,R$$FEA ;177.-FEAT$ TEST FEATURE MASK 5 DIR .FALSE. ;179.-RESERVED RSX-11M FUTURE USEM5 DIR .FALSE. ;181.-RESERVED RSX-11M FUTURE USE$5 DIR .FALSE. ;183.-RESERVED RSX-11M FUTURE USEX5 DIR .FALSE. ;185.-RESERVED RSX-11M FUTURE USED5 DIR .FALSE. ;187.-RESERVED RSX-11M FUTURE USE$5 DIR .FALSE. ;189.-RESERVED RSX-11M FUTURE USEE/ DIR .FALSE. ;191.-RESERVED FOR USER USE./ DIR .FALSE. ;193.-RESERVED FOR USER USE5/ DIR .FALSE. ;195.-RESERVED FOR USER USE7/ DIR .FALSE. ;197.-RESERVED FOR USER USE1/ DIR .FALSE. ;199.-RESERVED FOR USER USE = DIR $DRSMP, 2., ,S$$MAP ;201.-MODIFY SUPERVISOR MAPPING38 DIR $DRMVS, 4., ,S$$MAP ;203.-MOVE TO/FROM VARIOUS ; TASK SPACES) DIR2 $DRCPC, 3., ,C$$PCR ;205.-CPCRFC DIR2 $DRLOG, 0., , ;207.-LOGICAL NAME DIRECTIVES? DIR $DRTFE, 2., ,R$$FEA ;209.-TFEA$ TEST TASK FEATURE = DIR $DRBOM, 3. ;211.-BREAKPOINT OR MESSAGEVF DIRP $DRRRF, 2.,ACHKDB,P$$LAS ;213.-RECEIVE DATA OR STOP ; BM377< DIR .FALSE. ;209.-RESERVED RSX-11M+ FUTURE USE ;**-1C.=$DSTAB+<*6> ;TRUNCATE UNUSED PORTION OF TABLE AT ENDA TB$SIZ == <.-$DSTAB>/3 .END TASK SPACES) DIR2 $DRCPC, 3., ,C$$PCR ;205.-CPCRFC DIR2 $DRLOG, 0., , ;207.-LOGICAL NAME DIRECTIVES? DIR $DRTFE, 2., ,R$$FEA ;209.-TFEA$ TEST TASK FEATURE = DIR .TITLE PARTYA .IDENT /09.03/; A;L,; COPYRIGHT (c) 1974, 1978, 1979, 1980, 1983/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.L; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDN9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.R;C;@; D. N. CUTLER 14-FEB-74 ;B$; MODIFIED FOR RSX-11M-PLUS V2.1 BY:;C; C. B. PUTNAM; J. R. KAUFFMAN; B. S. MCCARTHY;;; MODIFIED BY:;:; C. B. PUTNAM 27-MAY-83 09.00;0; CBP188 -- USE E$CMEM FOR MEMORY PARITY ERRORS;I; J. W. BERZLE 08-SEP-83 09.01;L2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;A; J. R. KAUFFMAN 9-NOV-83 09.02 ;S?; JRK286 -- GET CACHE CSR VALUES FROM $MSTAT FOR ERROR LOG PKT ;U; J. M. LAWLER 21-NOV-83 09.03;H"; JL173 -- CORRECT TYPO IN JRK286; "; MEMORY PARITY INTERRUPT HANDLING;D; MACRO LIBRARY CALLSB; .IF DF P$$RTY1 .MCALL ABODF$,EPKDF$,HWDDF$,PCBDF$,TCBDF$,BGCK$A:" ABODF$ ;DEFINE TASK ABORT CODES& EPKDF$ ;DEFINE ERROR PACKET OFFSETS$ HWDDF$ ;DEFINE HARDWARE REGISTERS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSY, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;0; PARITY VECTOR ;G .ASECTR.=114 .WORD $PARER .WORD PR7 ; .PSECTM;+(; **-PARER-MEMORY PARITY ERROR INTERRUPT;YN; THIS ROUTINE IS ENTERED AS THE RESULT OF A MEMORY PARITY ERROR INTERRUPT. IFI; THE ERROR OCCURED IN THE EXECUTIVE OR WHILE ON THE SYSTEM STACK, THEN A$F; MESSAGE IS PRINTED ON THE CONSOLE TERMINAL AND THE SYSTEM IS HALTED.E; ELSE A SWITCH 00g:rrmmmffDATATO THE SYSTEM STACK IS EXECUTED AND THE TASK IN WHICHO/; THE PARITY ERROR OCCURED IS LOCKED IN MEMORY.C;- .ENABL LSBS*RECURS: JMP 60$ ;;;JUMP TO HALT PROCESSOR+$PARER::INC $PARLV ;;;INTERRUPT RECURSION?M BNE RECURS ;;;IF NE YESA .IF DF P$$D70 MOV R0,-(SP) ;;;SAVE R0 MOV R1,-(SP) ;;;SAVE R1* MOV #$MPCSR,R0 ;POINT TO PARITY CSR TABLE. MOV #$MSTAT,R1 ;POINT TO PARITY CSR SAVE AREA, MOV @(R0)+,(R1)+ ;SAVE LOW ADDRESS REGISTER- MOV @(R0)+,(R1)+ ;SAVE HIGH ADDRESS REGISTERE4 MOV #-1,(R1) ;ASSUME MEM PARITY ON NONCACHE MACHINE. CMP (R0)+,#MPCSR-2 ;RUNNING ON CACHE MACHINE? BNE 2$ ;IF NE NO/ MOV @-(R0),(R1)+ ;;;SAVE MEMORY ERROR REGISTERO/ TST (R0)+ ;;;POINT TO ADDRESS OF MEM CTRL REGN/ MOV @(R0)+,(R1)+ ;SAVE MEMORY CONTROL REGISTER0% MOV #3,@-2(R0) ;TURN CACHE TRAPS OFF(, MOV @(R0)+,(R1)+ ;SAVE MAINTENANCE REGISTER* MOV @(R0)+,(R1)+ ;SAVE CACHE HIT REGISTER2$: MOV (SP)+,R1 ;;;RESTORE R1 MOV (SP)+,R0 ;;;RESTORE R0R .IFTF( BIT #CMODE,2(SP) ;;;PREVIOUS MODE USER? BNE 4$ ;;;IF NE YESA .IFTO%3$: TST $STAT ;;;FATAL MEMORY ERROR?I BGT 301$ ;;;IF GT NO JMP 20$ ;;;O$301$: MOV R0,-(SP) ;;;SAVE REGISTERS MOV R1,-(SP) ;;;(0 MOV #$ERTRK,R1 ;;;POINT TO ERROR TRACKING TABLE% CALL 14$ ;;;EXECUTE CACHE ALGORITHME" MOV (SP)+,R1 ;;;RESTORE REGISTERS MOV (SP)+,R0 ;;;, RTI ;;;RETURN FROM TRAP .IFFV(3$: BR 20$ ;;;FATAL MEMORY PARITY ERROR .IFTF/4$: DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITY. F  .IFTM ,;P=; FIND THE REGION WITH THE PARITY ERROR AND LOCK IT IN MEMORY$;S S BIT #360,$STAT ;CACHE ERROR?B BEQ 401$ ;IF EQ NO CALL LOG ;LOG CACHE ERROR- BR 11$ ;GO ONS>401$: MOV @$MPCSR+2,R0 ;GET CONTENTS OF HIGH ERROR ADDRESS REG6 MOV @$MPCSR,R1 ;GET CONTENTS OF LOW ERROR ADDRESS REG4 ASHC #-6,R0 ;DOUBLE SHIFT R0 AND R1 RIGHT SIX BITS3 MOV #$PARHD,R0 ;GET ADDRESS OF PARTITION LIST HEADF+5$: MOV (R0),R0 ;GET NEXT MAIN PCB ADDRESSS BEQ 11$ ;IF EQ END OF LIST2 CMP P.REL(R0),R1 ;DID ERROR OCCUR IN THIS REGION?, BHI 11$ ;IF HI THERE IS NO PCB FOR REGION 0 MOV P.REL(R0),R2 ;GET BASE ADDRESS OF PARTITION. ADD P.SIZE(R0),R2 ;CALCULATE END OF PARTITION, CMP R2,R1 ;DID ERROR OCCUR IN THIS REGION? BLOS 5$ ;IF LO NOD,6$: MOV P.SUB(R0),R0 ;GET NEXT SUB PARTITION BEQ 11$ ;IF EQ END OF LIST2 CMP P.REL(R0),R1 ;DID ERROR OCCUR IN THIS REGION?, BHI 11$ ;IF HI THERE IS NO PCB FOR REGION 0 MOV P.REL(R0),R2 ;GET BASE ADDRESS OF PARTITION. ADD P.SIZE(R0),R2 ;CALCULATE END OF PARTITION, CMP R2,R1 ;DID ERROR OCCUR IN THIS REGION? BLOS 6$ ;IF LO NOR2 BIS #PS.PER!PS.NSF!PS.CHK,P.STAT(R0) ;LOCK REGION BIC #PS.FXD,P.STAT(R0) ;A L  .IFFP I;N2; LOCK ALL OF THE CURRENT TASK'S REGIONS IN MEMORY2; PS.FXD IS CLEARED IN THE TASK REGION PCB TO THAT5; THE TASK IS NO LONGER FIXED. THIS WILL ASSURE THAT)=; WHEN THE TASK EXITS, IT WILL BE DETACHED FROM IT'S REGIONS. ;P F0 MOV $TKTCB,R0 ;COPY TCB ADDRESS OF CURRENT TASK& MOV T.PCB(R0),R1 ;GET TASK REGION PCB' BIC #PS.FXD,P.STAT(R1) ;UNFIX THE TASKR! ADD #T.ATT,R0 ;POINT TO ATT LISTI;7$: MOV (R0),R0 ;GET ADDRESS OF NEXT ATTACHMENT DESCRIPTOR BEQ 10$ ;IF EQ END OF LIST% TSTB A.MPCT-A.TCBL(R0) ;TASK MAPPED?  BEQ 7$ ;IF EQ NO) MOV A.PCB-A.TCBL(R0),R1 ;GET PCB ADDRESSS3 BIS #PS.PER!PS.NSF!PS.CHK,P.STAT(R1) ;LOCK REGION  BIC #PS.FXD,P.STAT(R1) ;H BR 7$ ;GO AGAINI I .IFTE H;F;; IF THIS IS A UNIBUS PARITY ERROR, NOTIFY ALL MAPPED TASKSO8; IF THIS IS A CPU PARITY ERROR, NOTIFY THE CURRENT TASK7; IN EITHER CASE, TASKS WHICH ARE FIXED BECOME UNFIXED.O;  A-701$: BIT #30000,$STAT ;UNIBUS PARITY ERROR?  BEQ 10$ ;IF EQ NO MOV R0,-(SP) ;SAVE R0 CALL LOG ;LOG THE PARITY ERROR MOV (SP)+,R0 ;RESTORE R0E3 ADD #P.ATT,R0 ;POINT TO PARTITION'S ATT DESCR LISTS58$: MOV (R0),R0 ;POINT TO NEXT ATTACHMENT DESCRIPTOR# BEQ 101$ ;IF EQ END OF LISTG% TSTB A.MPCT-A.PCBL(R0) ;TASK MAPPED?  BEQ 8$ ;IF EQ NO2 MOV A.TCB-A.PCBL(R0),R5 ;GET TCB OF ATTACHED TASK1 MOV T.PCB(R5),R4 ;GET ADDRESS OF TASK REGION PCBA' BIC #PS.FXD,P.STAT(R4) ;UNFIX THE00gBr7rncccc TASKO. MOV #AS.PEA,R4 ;GET CODE FOR PARITY ERROR AST$ TST T.ASTL(R5) ;AST ALREADY QUEUED? BEQ 9$ ;IF EQ NO MOV T.ASTL+2(R5),R1 ;. CMPB R4,A.CBL+1(R1) ;PARITY ERROR AST QUEUED? BEQ 8$ ;IF EQ YESN9$: MOV R0,-(SP) ;SAVE R0 2 CALL DASTT ;DECLARE AN AST FOR THE ATTACHED TASK MOV (SP)+,R0 ;RESTORE R0) BCC 8$ ;IF CC AST SUCCESSFULLY DECLAREDQ BIT #360,$STAT ;CACHE ERROR?B BNE 8$ ;IF NE YESA1 BIT #T2.ABO,T.ST2(R5) ;ALREADY MARKED FOR ABORT?K BNE 8$ ;IF NE YESS MOV R0,-(SP) ;SAVE R0 MOV R5,R1 ;COPY TCB ADDRESSC0 MOV #S.PRTY,R0 ;GET CODE FOR PARITY ERROR ABORT CALL $ABTSK ;ABORT THE TASKO901$: MOV (SP)+,R0 ;RESTORE R0 BR 8$ ;GO AGAINI E .IFTF E;?B; DECLARE AN AST FOR THE CURRENT TASK. IF PARITY ERROR AST IS NOT; SPECIFIED, ABORT THE TASK.;K M$10$: CALL LOG ;LOG THE PARITY ERROR, MOV $TKTCB,R5 ;GET CURRENT TASK TCB ADDRESS. MOV #AS.PEA,R4 ;GET CODE FOR PARITY ERROR AST CALL DASTT ;DECLARE ASTK& BCC 11$ ;IF CC AST HAS BEEN DECLARED R ( .IFTV 0 BIT #360,$STAT ;CACHE ERROR?C BNE 11$ ;IF NE YES D O .IFTF R MOV R5,R1 ;COPY TCB ADDRESST0 MOV #S.PRTY,R0 ;GET CODE FOR PARITY ERROR ABORT! CALL $ABTSK ;ABORT CURRENT TASKE,101$: MOV $FXRPT,R0 ;IS THE FIXER INSTALLED? BEQ 11$ ;IF EQ NOP CALL $EXRQN ;REQUEST THE FIXER :;L7; CLEAR ALL PARITY REGISTERS AND REENABLE PARITY ERRORS ;K B)11$: CALL $CLPAR ;RESET ALL PARITY CSR'SI .IFTA. MOV #$ERTRK,R1 ;POINT TO ERROR TRACKING TABLE' TST $STAT ;WAS IT ONLY A CACHE ERROR? BGT 14$ ;IF GT YES BR 16$ ;;$; PDP-11/70 CACHE TRAP;F112$: MOV $TTNS-4,-(R1) ;;;SAVE TIME OF LAST ERROR &13$: TST (R1)+ ;;;POINT TO NEXT GROUP,14$: MOVB (R1)+,R0 ;;;GET CACHE DISABLE BITS BEQ 16$ ;;;IF EQ END OF TABLEQ) BITB (R1)+,$STAT ;;;ERROR IN THIS GROUP?E BEQ 13$ ;;;IF EQ NO + CMP (R1)+,$TTNS-4 ;;;OCCUR IN SAME MINUTE?R BNE 12$ ;;;IF NE NOC, BIS R0,$MPCTL ;;;DISABLE THAT PART OF CACHE BR 14$ ;;;PROCESS NEXT GROUP916$: MOVB $MPCTL,@$MPCSR+6 ;;;LOAD CACHE CONTROL REGISTERT .ENDC;?; AT THIS POINT EVERYTHING HAS BEEN CLEANED UP AND THE USER MAY-*; INSERT CODE SPECIFIC TO HIS APPLICATION.;+;***************.; INSERT CODE HERE-ALL REGISTERS ARE AVAILABLE;***************; ; EXIT SYSTEMQ;B# DEC $PARLV ;RESET RECURSION LEVELE RETURN ;EXIT FROM TRAPC;1D; PARITY ERROR OCCURED WHILE IN EXEC CODE. THIS IS A FATAL SITUATION@; AND THE SYSTEM IS SHUT DOWN. THE USER MAY INSERT CODE SPECIFIC#; TO HIS APPLICATION AT THIS POINT.D;C20$: ;;;REF LABEL .IF DF M$$PRO+ CALL $DISAN ;DISABLE SANITY TIMERS/ALARMSD .ENDC;;;***************6;;; INSERT CODE HERE-ALL REGISTERS HAVE NOT BEEN SAVED;;;***************) MOV #60$,@#4 ;;;PLUG NONEX MEMORY VECTORX MOV R0,-(SP) ;;;SAVE R05 MOV #$EXMSG,R0 ;;;GET ADDRESS OF PARITY STOP MESSAGEC)30$: MOVB (R0)+,TPS+2 ;;;OUTPUT NEXT BYTEC BEQ 50$ ;;;IF EQ DONET40$: TSTB TPS ;;;OUTPUT DONE? BPL 40$ ;;;IF PL NOE BR 30$ ;;;GO AGAIN50$: MOV (SP)+,R0 ;;;RESTORE R0?60$: BGCK$A BF.PAR,BE.FHW,HALT ;PARITY ERROR WHILE IN EXEC CODES# BR 60$ ;;;IF CONTINUED HALT AGAIN .DSABL LSB* .PAGE;+"; **-$CLPAR-CLEAR PARITY REGISTERS; F; THIS ROUTINE CLEARS OUT ALL PARITY ERRORS IN THE MEMORY PARITY ERROR2; REGISTERS AND ENABLES PARITY ERROR NOTIFICATION.;A ; INPUTS:A;Y; NONE.S;C ; OUTPUTS:;); NONE.;;T@; NOTE: IF THE SYMBOL M$$K11 IS DEFINED (11/70 TYPE ECC MEMORY),:; THIS ROUTINE WILL NOT PROPERLY HANDLE UNIBUS ECC MEMORY7; (SUCH AS MF11S-K) SINCE THE ROUTINE ASSUMES THAT ANYT7; OTHER MEMORY ON THE SYSTEM MUST BE PARITY MEMORY ANDU9; THAT AN ATTEMPT TO SET THE SINGLE-BIT ECC ERROR BIT ONA7; SUCH A MEMORY WILL FAIL. THIS ASSUMPTION IS USED TOI2; DISTINGUISH MK11 ECC MEMORY FROM PARITY MEMORY.;- E4$CLPAR::MOV #$PARTB+2,R0 ;POINT TO PARITY CSR VECTOR10$: ;REF LABEL .IF DF M$$K11 O" TST (R0) ;EVEN WORD CSR PRESENT? BPL 20$ ;IF PL NOY4 MOV #21,@(R0)+ ;SET ENABLE AND SINGLE-BIT ECC ERROR5 BIT #20,@-(R0) ;SINGLE-BIT ECC ERROR BIT SET (M00gJrrmmmffDATAK11)?S BEQ 20$ ;IF EQ NOM7 MOV #1,@(R0)+ ;SET ENABLE BIT AND CLR REST IN 1ST WORDN3 BIC #100000,@(R0)+ ;CLEAR ERROR BIT IN SECOND WORDS BR 30$ ;420$: MOV #1,@(R0)+ ;ENABLE PARITY ERROR NOTIFICATION M .ENDC7 MOV #1,@(R0)+ ;ENABLE PARITY (OR UNIBUS MEM ECC) NOTIF;(30$: CMP R0,#$PARTB+2+<16.*2> ;DONE YET? BLO 10$ ;IF LO NOK   .IF DF P$$D70 R8 MOV @$MPCSR+4,-(SP) ;CLEAR MEMORY SYSTEM ERROR REGISTER MOV (SP)+,@$MPCSR+4 ; E .ENDC # @ RETURN ;- ;+4; THE FORMAT OF ERROR LOGGING PACKETS IS AS FOLLOWS:;03; +-----------------------------------------------+0 ; | |&; \ FIXED ERROR LOGGING INFORMATION \ ; | |3; +-----------------------------------------------+.2; | CACHE REGISTER EXISTENCE MASK (SEE BELOW) | 03; +-----------------------------------------------+E/; | PARITY CSR EXISTENCE MASK (SEE BELOW) | 23; +-----------------------------------------------+E;T; PARITY CSRS:;C"; ADDRESS BIT VALUE IN MASK AT 23; +-----------------------------------------------+S; | 172100 000001 | 4-3; +-----------------------------------------------+|; | 172102 000002 | 6N3; +-----------------------------------------------+-; | 172104 000004 | 10 3; +-----------------------------------------------+- ; \ \3; +-----------------------------------------------+E; | 172134 040000 | 40|3; +-----------------------------------------------+-; | 172136 100000 | 42C3; +-----------------------------------------------+-;- ; CACHE CSRS:-; -3; +-----------------------------------------------+-3; | 177740 LOW ERROR ADDRESS 000001 | 4403; +-----------------------------------------------+-3; | 177742 HIGH ERROR ADDRESS 000002 | 46-3; +-----------------------------------------------+3; | 177744 CACHE ERROR REGISTER 000004 | 503; +-----------------------------------------------+-3; | 177746 CACHE CONTROL REGISTER 000010 | 52C3; +-----------------------------------------------+-3; | 177750 CACHE MAINTENANCE REGISTER 000020 | 54-3; +-----------------------------------------------+R3; | 177752 CACHE HIT/MISS REGISTER 000040 | 56-3; +-----------------------------------------------+D .PAGE;+; LOG PARITY ERROR IN A TASK;-; THE FOLLOWING MAY BE LOGGED:;!; 16 WORDS OF MEMORY PARITY CSR'S ; 6 WORDS OF CACHE PARITY CSR'S;-/LOG: BIT #ES.LOG,$ERFLA ;ARE WE LOGGING ERRORS?  BEQ 30$ ;IF EQ NO  INC $ERRSQ ;COUNT THE ERROR-7 MOV #E$CMEM+,R0 ;GET CODE FOR PARITY ERRORN, MOV #<24.*2>,R1 ;GET SIZE OF DATA SUBPACKET5 MOV #SM.HDR!SM.TSK!SM.DAT,R2 ;GET CONTROL MASK BITSH' CLR R3 ;NO BEGINNING ADDRESS FOR DATA-, MOV $TKTCB,R4 ;SET CURRENT TASK TCB ADDRESS! CLR R5 ;INDICATE NO UCB ADDRESSI* CALL $CRPKT ;CREATE THE ERROR LOG PACKET BCS 30$ ;IF CS NO PACKET4 CMP (R1)+,(R1)+ ;SKIP OVER CACHE CSR AND PARITY CSR ;EXISTENCE MASKS;A; FILL IN PARITY CSRS AND MASK;I1 MOV #$MEMR1,R2 ;POINT TO MEMORY PARITY CSR TABLEM CLR -(SP) ;SET PROTOTYPE MASKP210$: MOV #-1,(R1)+ ;ASSUME REGISTER DOES NOT EXIST& CMP #160000,(R2)+ ;REAL CSR ADDRESS ?# BHI 15$ ;IF HI NO, LEAVE -1 THEREB/ MOV @-2(R2),-2(R1) ;REPLACE -1 WITH REAL THINGU2 BIS $BTMSK-$MEMR1-2(R2),(SP) ;INDICATE CSR EXISTS&15$: CMP R2,#$MEMR1+<16.*2> ;DONE YET? BLO 10$ ;IF LO NO 7 MOV (SP)+,-44+2(R1) ;FILL IN PARITY CSR EXISTENCE WORDN .IF DF P$$D70, MOV #$MPCSR,R2 ;POINT TO CACHE PARITY CSR'S1 MOV #$MSTAT,R0 ;POINT TO SAVED CACHE PARITY CSRSS CLR -(SP) ;SET PROTOTYPE MASKY220$: MOV #-1,(R1)+ ;ASSUME REGISTER DOES NOT EXIST& CMP #160000,(R2)+ ;REAL CSR ADDRESS ?# BHI 25$ ;IF HI NO, LEAVE -1 THERE-, MOV (R0),-2(R1) ;REPLACE -1 WITH REAL THING2 BIS $BTMSK-$MPCSR-2(R2),(SP) ;INDICATE CSR EXISTS(25$: TST (R0)+ ;POINT TO NEXT CSR VALUE CMP R2,#$MPCSR+<6*2>;DONE YET? BLO 20$ ;IF LO NO;4 MOV (SP)+,-60(R1) ;FILL IN CACHE CSR EXISTENCE WORD .IFF ; DF P$$D70I+ CLR -44(R1) ;INDICATE NO CACHE CSRS EXISTT .ENDC ; DF P$$D70) CALL $QUPKT ;QUEUE THE ERROR LOG PACKET:00gRrhUrncccc30$: RETURN ;S E .PAGE O;+; DASTT;P:; DECLARE A PARITY ERROR AST AND SET UP THE AST PARAMETERS;- ; INPUTS:M;(2; R4=CODE INDICATING WHICH AST SHOULD BE DECLARED.;; R5=ADDRESS OF THE TCB OF THE TASK TO DECLARE THE AST FOR.T; ; OUTPUTS:;6; C=1 IF THE TASK IS NOT SETUP FOR A PARITY ERROR AST.3; C=0 IF THE TASK IS SET UP FOR A PARITY ERROR AST.<; THE AST PARAMETERS ARE MOVED TO THE AST CONTROL BLOCK.*; R1=ADDRESS OF THE AST CONTROL BLOCK.;- E#DASTT: CALL $DASTT ;DECLARE AN AST , BCS 100$ ;IF CS AST HAS NOT BEEN SPECIFIED4 ADD #A.PRM,R1 ;POINT TO PARAMETER LIST IN AST BLOCK0 MOV -2(R1),(R1) ;MOVE NUMBER OF AST PARAMETERS / ASL (R1)+ ;CALCULATE NUMBER OF BYTES ON STACKE S O .IF DF M$$PRO R$ MOVB $PROCN,(R1)+ ;GET PROCESSOR ID TSTB (R1)+ ;SKIP TO NEXT WORDO S .IFF= F CLR (R1)+ ;CLEAR PROCESSOR IDE R .ENDC  H1 MOV #$MPCSR,R0 ;POINT TO MEMORY STATUS REGISTERS.>10$: MOV @(R0)+,(R1)+ ;LOW / HIGH ERR, MEM SYS ERR, CACHE CTRL! CMP R0,#$MPCSR+<4.*2> ;DONE YET?0 BLO 10$ ;IF LO NO 3 MOV #$PARTB+2,R0 ;POINT TO MEMORY PARITY CSR TABLES520$: MOV @(R0)+,(R1)+ ;GET MEMORY PARITY CSR CONTENTSR" CMP R0,#$PARTB+<16.*2> ;DONE YET? BLO 20$ ;IF LO NOE CLC ;INDICATE SUCCESS100$: RETURN ; + .ENDC ; DF P$$RTY .END ;SKIP TO NEXT WORDO S .IFF= F CLR (R1)+ ;CLEAR PROCESSOR IDE R .ENDC  H1 MOV #$MPCSR,R0 ;POINT TO MEMORY STATUS REGISTERS.>10$: MOV @(R0)+,(R1)+ ;LOW / HIGH ERR, MEM SYS ERR, CACHE CTRL! CMP R0, .TITLE QITBLB .IDENT /03.01/;;E8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;C ; B. S. MCCARTHY 20-JUL-81 ;; ; POLISH INTERPRETER DATA BASE; J; THIS MODULE WAS SPLIT OUT OF DRTBL TO ALLOW THE QIO DIRECTIVE AND THIS6; TABLE TO BE PLACED IN THE SECOND DIRECTIVE COMMON.;L;E; PREVIOUSLY MODIFIED BY: ;B; J. KAUFMAN; B. S. MCCARTHY; J. W. BERZLE;I; -; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:.;$; ERIC POSTPISCHIL 12-DEC-86 03.00;C<; edp040 -- ADD SON OF GET DEVICE INFORMATION SUBFUNCTION; TO GIN DIRECTIVE."; B. S. MCCARTHY 5-MAR-87 03.01;6; BM384 -- MOVE DRGIN DISPATCH TABLE INTO DRGIN FOR#; INSERTION INTO VECTOR COMMON. ;T';N( .PAGES ;**-42TU;+3V; POLISH INTERPRETER DATA BASE FOR QIO PROCESSINGDW; !X; FUNCTION CODE DISPATCH VECTORSY;-Z+[$FCDSP::.WORD FCIFC ;10-ILLEGAL FUNCTIONF0\ .WORD $FCPKT ;11-FIND FILE NAME IN DIRECTORY]^ .IF DF R$$LKL_ ` .WORD UNLCK ;12-UNLOCK BLOCKab .IFFFc$d .WORD FCIFC ;12-ILLEGAL FUNCTIONef .ENDCg4h .WORD $FCPKT ;13-REMOVE FILE NAME FROM DIRECTORY1i .WORD $FCPKT ;14-ENTER FILE NAME IN DIRECTORYN(j .WORD FCACC ;15-ACCESS FILE FOR READ2k .WORD FCACC ;16-ACCESS FILE FOR READ AND WRITE8l .WORD FCACC ;17-ACCESS FILE FOR READ, WRITE, AND EXT!m .WORD FCDAC ;20-DEACCESS FILE:&n .WORD FCRVB ;21-READ VIRTUAL BLOCK'o .WORD FCWVB ;22-WRITE VIRTUAL BLOCKOp .WORD FCEXT ;23-EXTEND FILE.q .WORD FCCRE ;24-CREATE FILE6r .WORD FCDEL ;25-MARK FILE FOR DELETE/TRUNCATE FILE)s .WORD $FCPKT ;26-READ FILE ATTRIBUTESI*t .WORD $FCPKT ;27-WRITE FILE ATTRIBUTES2u .WORD $FCPKT ;30-USER MAGTAPE CONTROL FUNCTION,v .WORD FCWVB ;31-TRANSMIT PROCESS MESSAGE+w .WORD FCRVB ;32-RECEIVE PROCESS MESSAGE1&x .WORD FCCON ;33-CONNECT TO PROCESS+y .WORD FCDIS ;34-DISCONNECT FROM PROCESSF,z .WORD FCNCT ;35-NETWORK CONTROL FUNCTION${ .WORD FCIFC ;36-ILLEGAL FUNCTION$| .WORD FCIFC ;37-ILLEGAL FUNCTION}~ .PAGE .IF NDF M$$NETK,FCCON: ;REF LABEL IF NO NETWORK SUPPORT,FCDIS: ;REF LABEL IF NO NETWORK SUPPORT,FCNCT: ;REF LABEL IF NO NETWORK SUPPORT .IFTF;C; ILLEGAL FUNCTION;R3FCIFC: .WORD $IEIFC ;SET ILLEGAL FUNCTION STATUSS;1:; AC00hZriarmmmffDATACESS FILE FOR READ, READ/WRITE, OR READ/WRITE/EXTEND;C;FCACC: .WORD $CKDMO ;CHECK IF VOLUME MARKED FOR DISMOUNTN7 .WORD $CKALN ;CHECK IF FILE ALREADY ACCESSED ON LUN3 .IF DF M$$MUP7 .WORD $CKMOU ;CHECK IF VOLUME MOUNTED FOR THIS USERL .ENDC% .WORD $BDPKT ;BUILD AN I/O PACKETN" .WORD $CKLHD ;LOCK DOWN HEADER, .WORD $CKIWN ;INCREMENT WINDOW I/O COUNT- .WORD $CKRLK ;SYNCHRONIZE ACCESS AND EXITO; ; DEACCESS FILEI;A5FCDAC: .WORD $CKNLN ;CHECK IF FILE ACCESSED ON LUNA% .WORD $BDPKT ;BUILD AN I/O PACKETD" .WORD $CKLHD ;LOCK DOWN HEADER, .WORD $CKIWN ;INCREMENT WINDOW I/O COUNT .WORD $CKRLK ;EXIT;F; READ VIRTUAL BLOCK;O5FCRVB: .WORD $CKNLN ;CHECK IF FILE ACCESSED ON LUN, .WORD $CKRAC ;CHECK READ ACCESS AND EXIT;H; WRITE VIRTUAL BLOCK.;$5FCWVB: .WORD $CKNLN ;CHECK IF FILE ACCESSED ON LUNR- .WORD $CKWAC ;CHECK WRITE ACCESS AND EXITF;A; CREATE FILEO); CREATE & ACCESS NOT LEGAL COMBINATION/; CREATE & EXTEND DOES NOT INCR PENDING COUNT$; SINCE NO WINDOW;;FCCRE: .WORD $CKDMO ;CHECK IF VOLUME MARKED FOR DISMOUNTT7 .WORD $CKALN ;CHECK IF FILE ALREADY ACCESSED ON LUNOFCDEL:FCEXT:;DE; BUILD AN I/O PACKET FOR FIND, ENTER, REMOVE, EXTEND, DELETE, READR$; ATTRIBUTES, AND WRITE ATTRIBUTES;D $FCPKT:: .IF DF M$$MUP7 .WORD $CKMOU ;CHECK IF VOLUME MOUNTED FOR THIS USER .ENDC% .WORD $BDPKT ;BUILD AN I/O PACKETO" .WORD $CKLHD ;LOCK DOWN HEADER, .WORD $CKIWN ;INCREMENT WINDOW I/O COUNT .WORD $CKXIT ;EXIT; "; EXPLICIT UNLOCK BLOCK FUNCTION;$ .IF DF R$$LKL5UNLCK: .WORD $CKNLN ;CHECK IF FILE ACCESSED ON LUN( .WORD $UNLXT ;SET REGISTERS AND EXIT .ENDC .IFFR;R; CONNECT TO PROCESS;;FCCON: .WORD $CKDMO ;CHECK IF VOLUME MARKED FOR DISMOUNT;9 .WORD $CKALN ;CHECK IF PROCESS ALREADY CONNECTED ON L .IF DF X$$HDR0 .WORD $CKHDR ;CHECK IF EXTERNAL HEADER VALID .ENDC ;X$$HDR7 .WORD $CKCON ;ADDRESS CHECK CONNECT BUFFER AND EXITX" .WORD $CKLHD ;LOCK DOWN HEADER. .WORD $CKRLK ;INTERLOCK LUN USAGE AND EXIT;F; DISCONNECT FROM PROCESSO;N9FCDIS: .WORD $CKNLN ;CHECK IF PROCESS CONNECTED ON LUN2 .WORD $CKDIS ;CHECK BUFFER AND COPY PARAMETERS" .WORD $CKLHD ;LOCK DOWN HEADER. .WORD $CKRLK ;INTERLOCK LUN USAGE AND EXIT;N; NETWORK CONTROL FUNCTION;;FCNCT: .WORD $CKDMO ;CHECK IF VOLUME MARKED FOR DISMOUNTC .IF DF X$$HDR0 .WORD $CKHDR ;CHECK IF EXTERNAL HEADER VALID  .ENDC ; DF X$$HDR +  .WORD $CKPRM ;COPY PARAMETERS TO PACKETX"  .WORD $CKLHD ;LOCK DOWN HEADER  .WORD $CKXIT ;EXIT .ENDC; H; TABLE OF SPECIAL FUNCTION CODES TO BE CHECKED BY SOFTWARE WRITE LOCK;S $WLKTB:: ;DEVICE DEPENDENT CODES$# .WORD IO.SMD ;SET MEDIA DENSITY# .WORD IO.EOF ;WRITE END OF FILEN .WORD IO.ERS ;ERASE TAPE% .WORD IO.DSE ;DATA SECURITY ERASEN ;DIAGNOSTIC CODES' .WORD IO.WDH ;WRITE DATA AND HEADERR( .WORD IO.WTD ;WRITE TRACK DESCRIPTOR2 .WORD IO.TDD ;WRITE TRACK DESCRIPTOR DISPLACED)  .WORD IO.CEW ;WRITE BLOCK ON CE TRACK;!," .WORD 0 ;TERMINATOR FOR WRITE LOCK TABLE#F .END ;**-34D BY SOFTWARE WRITE LOCK;S $WLKTB:: ;DEVICE DEPENDENT CODES$# .WORD IO.SMD ;SET MEDIA DENSITY# .WORD IO.EOF  .TITLE DYDRVT .IDENT /04.09/?;B;07; COPYRIGHT (C) 1984 BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;" ; M. BAGGETT/R. PERRON 05-JUN-79 ; PREVIOUSLY MODIFIED BY:B ; ; R. T. PERRON; P. J. CARR; P. J. BEZEREDI; J. GALLANT ; T. LEKAS ; L. KOGAN;; ); MODIFIED BY: 15-AUG-86 4.09;U=00ibrUrncccc; G. MARIGOWDA GM001 -- CONVERT TO USE EXEC VECTORINGY;; !<; RX211- NPR FLOPPY DISK DRIVERR=;>; FUNCTIONS RECOGNIZED:>?; IO.RPB - READ PHYSICAL BLOCK (MAY READ ANY SECTOR ON DISK)@@; IO.WPB - WRITE PHYSICAL BLOCK (MAY WRITE ANY SECTOR ON DISK):A; IO.WDD - WRITE DELETED DATA - WRITE ANY SECTOR ON DISK5B; SETTING THE DELETED DATA MARK IN SECTOR HEADERRC; DD; THE FOLLOWING FUNCTION CODES OPERATE ON 256. WORD BLOCKS OF DATACE; (4 SECTORS FOR SINGLE DENSITY OR 2 SECTORS FOR DOUBLE DENSITY). FF; THE DRIVER AUTOMATICALLY INTERLEAVES AND SKEWS SECTORS TO OPTIMIZEDG; THE TRANSFER OF DATA SO THAT A LONG TRANSFER MAY BE DONE WITHOUTEH; LOOSING A REVOLUTION OF THE DISK. THE INTERLEAVE FACTOR IS 2 AND I; THE SKEW FACTOR IS 6. .J; IO.RLB - READ LOGICAL BLOCKS OF 256. WORDS0K; IO.WLB - WRITE LOGICAL BLOCKS OF 256. WORDS.L;ABM; THE FOLLOWING FUNCTION CODES ARE USED TO INITIALIZE THE FLOPPYGN; TO SINGLE OR DOUBLE DENSITY AND TO REPORT WHICH DENSITY THE CURRENTOO; FLOPPY IS.P; IO.SMD - SET MEDIA DENSITY(Q; IO.SEC - SENSE MEDIA CHARACTERISTICSR;EES; IF DELETED DATA IS READ, THE STATUS CODE RETURNED WILL BE IS.RDD, T; OTHERWISE IT WILL BE IS.SUC.U;TV7V .MCALL HWDDF$,PKTDF$,PCBDF$,QIOSY$,SCBDF$ ; GM001V QIOSY$ ; GM001C!V SCBDF$ ,,SYSDEF ; GM001E/X HWDDF$ ; DEFINE HARDWARE REGISTERS ;**-1L'Y PKTDF$ ; DEFINE I/O PACKET OFFSETSZ Z PCBDF$ ; DEFINE PCB OFFSETS[\;T]; EQUATED SYMBOLS ^;T_!`RETRY = 10 ; ERROR RETRY COUNTS0aCEW = 4 ; RETRY COUNT FOR IO.SMD AND IO.SEC'S/bDYNUM = 6 ; NUMBER OF REGISTERS TO ERROR LOG,3cMEMSIZ = 7600 ; 124K OF MEMORY IN 32 WORD BLOCKSW&dAPR5DS = 120000 ; APR5 DISPLACEMENT&eAPR6DS = 140000 ; APR6 DISPLACEMENT,fLOOP = 1000 ; COUNTER TO CHECK FOR TR BITgh;Di; U.CW2 BITS USAGEj;Fk#lDELDAT = 100 ; DELETED DATA READ"mERR1 = 2000 ; TIMEOUT ERROR BITnDEN = 4000 ; DENSITY BITB)oRSAE = 10000 ; READ STATUS AFTER ERROR.pSCHAR = 40000 ; SENSE MEDIA CHARACTERISTICS6qSILO = 100000 ; FUNCTION ISSUED WAS A SILO FUNCTIONrs;Et; U.CW3 WORD USAGEu;,v!wSINGLE = 494. ; SINGLE DENSITY3!xDOUBLE = 988. ; DOUBLE DENSITY;yz;P/{; DEVICE REGISTER OFFSETS AND BIT DEFINITIONS|;P}%~RXCS= 0 ; CONTROL STATUS REGISTERGO = 1 ; GO BITUNIT = 20 ; UNIT SELECT BITDONE = 40 ; DONE BIT1"INTEBL = 100 ; INTERRUPT ENABLE+TR = 200 ; TRANSFER READY BIT (CPU-SILO)DSDEN = 400 ; DENSITY BIT %RX211 = 4000 ; RX211 INDICATOR BIT$INIT = 40000 ; INITIALIZATION BITERR = 100000 ; ERROR BIT"RXDB = 2 ; DATA BUFFER REGISTER)RXES = 2 ; RX211 ERROR STATUS REGISTERUCRCERR = 1 ; CRC ERROR BITR#INITDN = 4 ; INITIALIZE DONE BIT!RXACLO = 10 ; RX221 AC LOW BITT"DENERR = 20 ; DENSITY ERROR BIT-DRVDEN = 40 ; SELECTED DRIVE'S DENSITY BIT;7DELDAT = 100 ; DELETED DATA BIT (USED IN U.CW2 ALSO)0*DRVRDY = 200 ; SELECTED DRIVE READY BIT#UNTSEL = 400 ; UNIT SELECTED BIT *WCOVFL = 2000 ; WORD COUNT OVERFLOW BIT'NXM = 4000 ; NON-EXISTENT MEMORY BIT ;; FUNCTION CODES;  FILL = INTEBL!0!GO ; FILL SILO"EMPTY = INTEBL!2!GO ; EMPTY SILO&WRITE = INTEBL!4!GO ; WRITE A SECTOR$READ = INTEBL!6!GO ; READ A SECTOR+SETDEN = INTEBL!10!GO ; SET MEDIA DENSITYR/MRDS = INTEBL!12!GO ; MAINTENANCE READ STATUSI+WRTDD = INTEBL!14!GO ; WRITE DELETED DATAI(RDERC = INTEBL!16!GO ; READ ERROR CODE;A; LOCAL DATA;04; RETRY COUNT TABLE (INDEXED BY CONTROLLER NUMBER);L'DYPCB: .WORD 0 ; ADD OF PCB OF DYCOMR1DYCOM: .RAD50 /DYCOM/ ; NAME OF DY DATA COMMONI,BFLAG: .BLKW R$$X21 ; BUFFERING DATA FLAG ; = 0 DO NOT BUFFER DATA ; = 1 BUFFER DATAR;RTTBL: .BLKW R$$X21 ; ERROR RETRY COUNT FOR CURRENT UNIT 7CSRSV: .BLKW R$$X21 ; WORD TO SAVE CSR FUNCTION CODEE8COUNT: .BLKW R$$X21 ; COUNT OF BYTES TRANSFERED IN IB=WCOUNT: .BLKW R$$X21 ; COUNT OF DATA LEFT TO BE MOVED (FORA ; WRITE OPERATION 00ijrarmmmffDATAONLY) <BUFLEN: .BLKW R$$X21 ; LENGTH OF INTERMEDIATE BUFFER (IB):PHYADD: .BLKW R$$X21 ; PHYSICAL ADD OF USER BUFFER (LO):HIADD:: .BLKW R$$X21 ; PHYSICAL ADD OF USER BUFFER (HI):LOPHYA: .BLKW R$$X21 ; LO ORDER 16 BITS OF PHY ADD (IB)9HIPHYA: .BLKW R$$X21 ; HI ORDER 2 BITS OF PHY ADD (IB)2DYPTR: .BLKW R$$X21 ; POINTER IN DY DATA COMMON;TEMP: .BLKW R$$X21 ; TEMPORY COUNTER WHEN DOING MULTIPLEB ; FORKSK<RETPTR: .BLKW R$$X21 ; TEMPORY STORAGE FOR RET ADDRESS OF% ; SUBROUTINE WHEN CALLING $FORKX$ ; NOTHING CAN BE ON STACK WHEN ; CALLING $FORKX7CONCNT: .WORD 0 ;# OF CONTROLLERS CONNECTED TO DYCOM$; ; GM001+; MAKE GTPKT$ A LOCAL MACRO ; GM001 ; ; GM0015 .MACRO GTPKT$ DEV,NCTRLR,ADDR,UCBSV,SUC ; GM001F CALL @GTPKT ; GM001R .IF B ; GM001 BCC 65535$ ; GM001 RETURN ; GM001L65535$: ; GM001 .IFF ; GM001P BCS ADDR ; GM001 .ENDC ; GM001 .IF B ; GM001  $$$=0 ; GM001 .IF B ; GM001W .IF EQ $$$ ; GM001! MOV R5,S.OWN(R4) ; GM0011 .ENDC ; GM001 .ENDC ; GM001 .IFF ; GM001R .IF GT NCTRLR-1 ; GM001! MOV R5,UCBSV(R3) ; GM001  .IFF ; GM001  MOV R5,UCBSV ; GM001  .ENDC ; GM001 .ENDC ; GM001 .ENDM ; GM001; ; GM0012; EXECUTIVE ENTRY POINT VECTOR TABLE ; GM001; ; GM001 ; GM001 <EXEVEC: .WORD 0 ; FLAG FOR VECTOR NOT YET FILLED ; GM001 ; GM001R$ ALOCB: .WORD $ALOCB ; GM001# BLXI: .WORD $BLXIO ; GM0010$ DEACB: .WORD $DEACB ; GM001$ DTOER: .WORD $DTOER ; GM001$ DVERR: .WORD $DVERR ; GM001$ ERRSQ: .WORD $ERRSQ ; GM001" FORK: .WORD $FORK ; GM001$ FRKHD: .WORD $FRKHD ; GM001$ GTPKT: .WORD $GTPKT ; GM001$ HFMSK: .WORD $HFMSK ; GM001$ IODON: .WORD $IODON ; GM001$ LDREG: .WORD $LDREG ; GM001$ MPPHY: .WORD $MPPHY ; GM001$ MPUBM: .WORD $MPUBM ; GM001$ SCERR: .WORD $SCERR ; GM001$ SRNAM: .WORD $SRNAM ; GM001$ STMAP: .WORD $STMAP ; GM001$ VOLVD: .WORD $VOLVD ; GM001 ; ; GM001) EXEVCL=<<<.-EXEVEC>/2>-1> ; GM001R ; ; GM001; ;**-1; DRIVER DISPATCH TABLE;T2 DDT$ DY,R$$X21,,,,NEW ; GENERATE DISPATCH TABLE;+1; *** - DYINI FLOPPY DISK CONTROLLER INITIATORW;LF; THIS ROUTINE IS ENTERED FROM THE QIO DIRECTIVE WHEN AN I/O REQUESTI; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPOGATE THERF; EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY,G; THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST. OTHERWISE2M; A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFULCH; THE NEXT I/O OPERATION IS INITIATED. A RETURN TO THE CALLER IS THEN ; EXECUTED. ;N ; INPUTS:K5; R5 - ADDRESS OF UCB OF CONTROLLER TO BE INITIATEDE;M ; OUTPUTS:>; IF THE CONTROLLER ASSOCIATED WITH THE SPECIFIED UCB IS NOTC; BUSY AND AN I/O REQUEST IS WAITING TO BE PROCESSED, THE REQUESTF@; IS DEQUEUED AND THE DRIVER INITIATES THE REQUESTED FUNCTION.;D;- .ENABL LSBE/DYINI: GTPKT$ DY,R$$X21 ; GET NEXT I/O PACKET ;T2; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT;I"; R1 - ADDRESS OF THE I/O PACKET7; R2 - PHYSICAL UNIT NUMBER OF DEVICE TO BE INITIATEDK; R3 - CONTROLLER INDEXF; R4 - ADDRESS OF SCBE; R5 - ADDRESS OF THE UCBF;C); FLOPPY DISK I/O REQUEST PACKET FORMAT ;T#; WD. 00 -- I/O QUEUE THREAD WORDI1; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBERN3; WD. 02 -- ADDRESS OF TCB OF THE REQUESTING TASKC; WD. 03 -- POINTER TO SECOND LUN WORD OF REQUESTING TASKS HEADER 7; WD. 04 -- CONTENTS OF FIRST LUN WORD ( UCB ADDRESS)T@; WD. 05 -- I/O FUNCTION CODE (IO.RLB, IO.RPB, IO.WLB, I00irrUrnccccO.WPB, ; IO.WDD, IO.SMD OR IO.SEC)1; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCKC1; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCKD<; WD. 10 -- I/O STATUS BLOCK ADDRESS DISPLACEMENT + 1400004; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE,; WD. 12 -- RELOCATION BIAS OF DATA BUFFER,; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER); WD. 14 -- NUMBER OF BYTES TO TRANSFER ; WD. 15 -- NOT USED (IGNORED)7; WD. 16 -- LOW BYTE MUST BE ZERO, HIGH BYTE NOT USEDI.; WD. 17 -- LOGICAL OR PHYSICAL BLOCK NUMBER; WD. 20 -- NOT USED;-'; DRIVER USAGE OF WORDS IN I/O PACKET7; I.PRM+6 (WD. 15) - STATUS REGISTER AFTER INTERRUPT 8; I.PRM+10 (WD. 16) - LOGICAL OR PHYSICAL BLOCK NUMBER/; I.PRM+12 (WD. 17) - SIZE OF "THIS" TRANSFER6; I.PRM+14 (WD. 20) - PHYSICAL SECTOR NUMBER (1-26.)5; I.PRM+15 (WD. 20) - PHYSICAL TRACK NUMBER (0-76.)R;Y;OA; WHEN BRINGING RX02 CONTROLLER ONLINE, HRC ISSUES AN IO.SMD TOEC; DYDRV. OFFSETS I.PRM+12 AND I.PRM+14 GET RELOCATED TO I.PRM+14 ?; AND I.PRM+16 BY $VOLVD ROUTINE. $VOLVD THINKS THAT IT IS ANOA ; IO.STC FUNCTION AND DOES THE RELOCATE. IN $IOFIN, IF I.PRM+16NC ; IS NOT A VALID BUFFER ADDESS (> 140000) OR ZERO, THE SYSTEM CANC ; CRASH OR DESTROY A LOCATION IN MEMORY.SINCE IO.SMD IS ONLY USED F ; FOR RX02 DEVICE, A SPECIAL CHECK IS MADE IN THE DRIVER FOR IO.STC.7 ; IF THE FUNCTION IS IO.STC THEN I.PRM+16 IS CLEARED.R.; THE DRIVER DOES NOT USE LOCATION I.PRM+16.;F; ;+; INITIALIZE DRIVERO; ( MOV #RETRY,RTTBL(R3); SET RETRY COUNT6 BIC #^C,U.CW2(R5); CLEAR DYNAMIC UCB FLAG BITS1 CALL @VOLVD ;VALIDATE VOLUME VALID ; GM001& BCS 20$ ; IF CS WE FAILED ;**-1* MOV I.FCN(R1),-(SP) ; GET FUNCTION CODE' BIC #7,(SP) ; REMOVE QUALIFIER BITS < CMP #IO.STC,(SP) ; IS IT A SET CHARACTERISTICS FUNCTION ? BNE 5$ ; NOT8 CLR I.PRM+16(R1) ; CLEAR THIS FOR THE BLOCK LOCK CODE ; IN $IOFIND&5$: TST (SP)+ ; RESTORE STACK LEVEL TST R0 ; TRANSFER FUNCTION?  BPL 20$ ; IF PL NO,! TSTB I.PRM+10(R1) ; HIGH BLOCK SPECIFIED?" BEQ 30$ ; IF EQ NO#10$: JMP 380$ ; YES, ERRORD$20$: JMP 440$ ; ERROR%;&; CHECK FOR A VALID FUNCTION';.(30$: MOV S.CSR(R4),R2 ; RETRIEVE CSR ADDRESS3) CMPB #IO.SEC/256.,I.FCN+1(R1) ; VALID FUNCTION?(-* BNE 60$ ; IF NE, IT MUST BE READ OR WRITE9+ MOVB #CEW,RTTBL(R3) ; IO.SEC AND IO.SMD ONLY 4 RETRIESO', MOV I.FCN(R1),R0 ; GET FUNCTION CODES%- BIC #7,R0 ; REMOVE QUALIFIER BITSR*. CMP #IO.SEC,R0 ; SENSE CHARACTERISTICS?/ BNE 40$ ; IF NE NO,0 JMP DYSEC ; GET DISKETTE CHARACTERISTICS*140$: CMP #IO.SMD,R0 ; SET MEDIA DENSITY?2 BNE 50$ ; IF NE NO23 BITB #US.MNT!US.FOR,U.STS(R5) ; DEVICE MOUNTED?4 BEQ 50$ ; IF EQ YESR95 MOV R0,I.FCN(R1) ; SET FUNCTION CODE WITHOUT MODIFIERSN$6 JMP DYSMD ; SET DISKETTE DENSITY-750$: MOV #IE.IFC&377,R0 ; RETURN ERROR CODEN8 JMP 420$ ; EXITE960$: ; REF LABEL :; );; SET UP MAPPING AND FIRST DISK ADDRESSI<;B=>7> BIT #HF.UBM,@HFMSK ; UNIBUS MAP PRESENT ? ; GM001F@ BEQ 61$ ; NO ;**-1I&A CLR BFLAG(R3) ; NO BUFFERING NEEDEDB=B CALL @STMAP ; SET UP 11/70 UNIBUS MAPPING ADDRS ; GM001!D ;**-1D1E SWAB U.BUF(R5) ; POSITION EXTENDED MEMORY BITS, F BR 69$ G61$: MOV R2,-(SP) ; SAVE R2I0H MOV U.BUF(R5),R0 ; GET ADDRESS EXTENSION BITS2I MOVB U.BUF+1(R5),-(SP); SAVE THE EXTENSION BITS/J MOV U.BUF+2(R5),R2 ; GET USER BUFFER ADDRESS *K ADD I.PRM+4(R1),R2 ; FIND END OF BUFFER'L ADCB (SP) ; GET ANY LEFT OVER CARRYP'M BITB #^C303,(SP)+ ; 22 BIT ADDRESS ? N BNE 62$ ; YES - DO BUFFERING.O ASH #4,R0 ; GET BITS 17 & 18 INTO POSITION P BR 63$ ;&Q62$: MOV #1,BFLAG(R3) ; DO BUFFERINGR MOV (SP)+,R2 ; RESTORE R2 S BR 65$ ;*T63$: CLR BFLAG(R3) ; NO BUFFERING NEEDED+U BIC #^C<30000>,R0 ; ISOLATE BITS 12 & 13X-V MOV R0,U.BUF(R5) ; SAVE HI BITS OF ADDRESSHW MOV (SP)+,R2 ; RESTORE R2 X BR 69$ ;BY65$: MOV I.PRM+2(R1),PHYADD(R3); PHYSICAL ADD OF USER BUFFER(LO)%Z CLR HIADD(R3) ; CLEAR00izrarmmmffDATA HIGH ADDRESSP?[ MOVB I.PRM+1(R1),HIADD(R3); PHYSICAL ADD OF USER BUFFER (HI)O\ MOV R1,-(SP) ; SAVE R1 ] MOV R2,-(SP) ; SAVE R2I&^ MOV DYPCB,R0 ; GET PCB ADD OF DYCOM%_ MOV P.REL(R0),R1 ; RELOCATION BIAST3` MOV R1,DYPTR(R3) ; INITIALIZE POINTER INTO DYCOMR+a TST R3 ; IS THIS THE FIRST CONTROLLER ?Tb BEQ 67$ ; YESR(c MOV P.SIZE(R0),R2 ; GET SIZE OF DYCOMd ASR R2 ; DIVIDE IN HALF*e ADD R2,R1 ; POINT TO SECOND HALF OF IB6f ADD R2,DYPTR(R3) ; POINT INTO SECOND HALF OF COMMON)g67$: MOV #APR6DS,R2 ; APR6 DISPLACEMENTD3g CALL @MPPHY ; GET 18BIT PYS ADD OF IB ; GM001(/i ASH #4,R1 ; PUT BITS 17 & 18 OF ADD ;**-1Vj ; INTO BITS 12 & 13D-k BIC #^C<30000>,R1 ; ISOLATE BITS 12 AND 130l MOV R1,HIPHYA(R3) ; SAVE HI BITS OF ADD OF IB*m MOV R1,U.BUF(R5) ; SET UP EXTENDED BITS0n MOV R2,LOPHYA(R3) ; SAVE LO BITS OF ADD OF IB1o MOV R2,U.BUF+2(R5) ; SET UP LO BITS OF ADD FORDp ; DATA TRANSFERN+q MOV P.SIZE(R0),R1 ; COMPUTE LENGTH OF IBO#r ASH #6,R1 ; GET LENGTH IN BYTESP+s TST R3 ; IS THIS THE FIRST CONTROLLER ? t BEQ 68$ ; YES 6u ASH #-1,R1 ; DIVIDE BY 2 - TWO CONTROLLERS SHARINGv ; ONE BUFFER,w68$: MOV R1,BUFLEN(R3) ; SAVE LENGTH OF IBx MOV R1,COUNT(R3) ;<y MOV U.CNT(R5),WCOUNT(R3); COUNT OF DATA TO BE MOVED FOR Az ; WRITE FUNCTION{ MOV (SP)+,R2 ; RESTORE REGV| MOV (SP)+,R1 ; 2} CMPB #IO.WLB/256.,I.FCN+1(R1); WRITE FUNCTION ?~ BNE 69$ ; NO* CLR COUNT(R3) ; NO BYTES TRANSFERED YET ; INITIATE CALL TO BLXIO69$:= MOV I.PRM+12(R1),R0 ; GET PHYSICAL OR LOGICAL BLOCK NUMBER6; BITB #IO.RPB&377,I.FCN(R1) ; IS IT READ/WRITE PHYSICAL?A BNE 70$ ; IF NE YES2 ASL R0 ; CONVERT TO LOGICAL SECTOR NO. (LBN*2)' BIT #DEN,U.CW2(R5) ; DOUBLE DENSITY?( BNE 70$ ; IF NE YESM ASL R0 ; SINGLE DEN - LBN*4N%70$: MOV R0,I.PRM+10(R1) ; STORE ITV080$: MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS1 CALL TRKSEC ; CONVERT BLOCK # TO TRACK/SECTOR; BCC 82$ ; IF CC -> OK$ JMP 10$ ; CS -> BAD BLOCK NUMBER82$:( MOV S.CSR(R4),R2 ; GET ADDRESS OF CSR3 CMPB #IO.WLB/256.,I.FCN+1(R3) ; WRITE FUNCTION?R BEQ 822$ ; IF EQ YES$ JMP 190$ ; MUST BE READ FUNCTION;T; FILL SILO BEFORE WRITE;B0822$: MOVB S.CON(R4),R1 ; GET CONTROLLER INDEX  TST BFLAG(R1) ; BUFFER DATA ? BEQ 88$ ; NO- TST COUNT(R1) ; IS THE IB FULL WITH DATA ?S BGT 88$ ; YES/1 CMP BUFLEN(R1),WCOUNT(R1); IS THE I/O TRANSFER  ; GREATER THAN THE IB  BGT 83$ ; BGT - NO@ SUB BUFLEN(R1),WCOUNT(R1); UPDATE BYTES LEFT TO COMPLETE TRAN7 MOV BUFLEN(R1),TEMP(R1); NUMBER OF BYTES TO BE MOVEDI  BR 84$ ;;83$: MOV WCOUNT(R1),TEMP(R1); NUMBER OF BYTES TO BE MOVED: CLR WCOUNT(R1) ; AFTER THIS MOVE, I/O TRANS IS COMPLETE384$: MOV TEMP(R1),COUNT(R1); LENGTH OF DATA IN IBA+86$: CALL BLXIO ; FILL IB WITH MORE DATAHG ADD #<256./100>,DYPTR(R1) ; BUMP POINTER INTO DYCOM (32 WORD BLOCKS) / SUB #256.,TEMP(R1) ; DECREMENT TEMPORY COUNT  BLE 87$ ; IB IS FULL) TST $FRKHD ; ANYONE WAITING TO FORK ?T& BEQ 86$ ; IF EQ NO -> DO SOME MORE8 CALL @FORK ; LET SOMEONE ELSE DO SOME WORK ; GM0014 MOVB S.CON(R4),R1 ; GET CONTROLLER INDEX ;**-1% MOV S.CSR(R4),R2 ; GET CSR ADDRESSM, MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS BR 86$ ; DO SOME MORE BLXIOA;87$: BIC #30000,U.BUF(R5); RESET EXTENDED ADDRESSING BITS/2 BIS HIPHYA(R1),U.BUF(R5); TO POINT TO BEG OF IB2 MOV LOPHYA(R1),U.BUF+2(R5); RESET LO BITS OF IB MOV R2,-(SP) ; SAVE REG" MOV DYPCB,R2 ; GET PCB OF DYCOM9 MOV P.REL(R2),DYPTR(R1); INITIALIZE POINTER INTO DYCOM  TST R1 ; ONE CONTROLLERS BEQ 877$ ; YES+ MOV P.SIZE(R2),-(SP); GET SIZE OF REGION  ASR (SP) ; CUT IN HALF9 ADD (SP)+,DYPTR(R1) ; POINT INTO SECOND HALF OF REGIOND"877$: MOV (SP)+,R2 ; RESTORE REG88$:0 MOVB #FILL,U.BUF(R5) ; SET FILL SILO FUNCTION+90$: BIT #DEN,U.CW2(R5) ; DOUBLE DENSITY?  BEQ 100$ ; IF EQ NOY3 BIS #SDEN,U.BUF(R5) ; YES-SET DOUBLE DENSITY BITP4100$: BIS #SILO,U.CW2(R5) ; IN00irUrnccccDICATE SILO FUNCTION0 MOVB S.CON(R4),R1 ; RETRIEVE CONTROLLER INDEX/ MOV U.BUF(R5),CSRSV(R1) ; SAVE FUNCTION CODE;) MOV U.BUF(R5),(R2) ; INITIATE FUNCTIONR7 BIT #HF.UBM,@HFMSK ; UNIBUS MAP PRESENT ? ; GM001T BEQ 105$ ; N0 ;**-1 MOV R2,-(SP) ; SAVE REGISTER8 CALL @MPUBM ; MAP 11/70 UNIBUS TO TRANSFER ; GM001+ MOV (SP)+,R2 ; RESTORE REGISTER ;**-1105$:I* MOV U.BUF+2(R5),R0 ; GET BUFFER ADDRESS1 MOV #128.,R1 ; DEFAULT TO A 128. BYTE TRANSFERN0 BIT #DEN,U.CW2(R5) ; DOUBLE DENSITY DISKETTE? BEQ 110$ ; IF EQ NOM) ASL R1 ; CHANGE DEFAULT TO 256. BYTES;.110$: CMP U.CNT(R5),R1 ; FULL TRANSFER LEFT? BHIS 120$ ; IF HIS YES, MOV U.CNT(R5),R1 ; NO, GET RESIDUAL COUNT;120$: MOV R1,I.PRM+12(R3) ; STORE BYTES BEING TRANSFERREDC)130$: BITB #TR!DONE,(R2) ; TRANSFERRED?  BMI 140$ ; IF MI YES BEQ 130$ ; IF EQ NO- BR 160$ ; ERRORM140$: ASR R1 ; WORD COUNT$ MOV R1,RXDB(R2) ; LOAD WORD COUNT)150$: BITB #TR!DONE,(R2) ; TRANSFERRED?50 BMI 270$ ; IF MI YES - R0 HAS BUFFER ADDRESS BEQ 150$ ; IF EQ NO .160$: MOV RXES(R2),I.PRM+6(R3) ; SAVE STATUS& JMP DYRTY ; ERROR, RETRY OPERATION;S; EMPTY SILO AFTER READ ;E7170$: MOVB #EMPTY,U.BUF(R5) ; SET EMPTY SILO FUNCTIONE( BR 90$ ; SAME AS FILL SILO PROCEDURE;)+; INITIATE TRANSFER BETWEEN SILO AND DISK;11180$: MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS " MOV S.CSR(R4),R2 ; GET CSR ADDR. MOVB #WRITE,U.BUF(R5);ASSUME WRITE FUNCTION' MOV I.FCN(R3),R1 ; GET FUNCTION CODE-% BIC #7,R1 ; REMOVE QUALIFIER BITSI, CMP #IO.WDD,R1 ; WRITE WITH DELETED DATA? BNE 200$ ; IF NE NO < MOVB #WRTDD,U.BUF(R5) ; SET "WRITE DELETED DATA" FUNCTION  BR 200$ ;B0190$: MOVB #READ,U.BUF(R5) ; SET READ FUNCTION,200$: BIT #DEN,U.CW2(R5) ; DOUBLE DENSITY? BEQ 210$ ; IF EQ NOE, BIS #SDEN,U.BUF(R5) ; YES-SET DENSITY BIT!210$: TSTB U.UNIT(R5) ; UNIT 1?V BEQ 220$ ; IF EQ NOD2 BIS #UNIT,U.BUF(R5) ; YES, SET TO SELECT UNIT 15220$: MOVB S.CON(R4),R1 ; RETRIEVE CONTROLLER INDEX / MOV U.BUF(R5),CSRSV(R1) ; SAVE FUNCTION CODET  MOV #LOOP,R0 ; SET UP COUNTER) MOV U.BUF(R5),(R2) ; INITIATE FUNCTIONT)230$: BITB #TR!DONE,(R2) ; TRANSFERRED?  BMI 240$ ; IF MI YES- BEQ 235$ ; TR NOT SET - DECREMENT COUNTERC BR 160$ ; ERRORT#235$: DEC R0 ; DECREMENT COUNTER## BNE 230$ ; KEEP ON CHECKING BIT+ MOVB S.CON(R4),R3 ; GET CONTROLLER INDEX0, MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS' MOV #1,RTTBL(R3) ; JUST DO ONE RETRYR/ JMP 620$ ; INITIALIZE DRIVE TO RECOVER FROMR  ; POWER OFF PROBLEMN7 240$: MOVB I.PRM+14(R3),RXDB(R2) ; LOAD SECTOR NUMBER)4 250$: BITB #TR!DONE,(R2) ; TRANSFER READY OR DONE?#  BMI 260$ ; IF MI TRANSFER READYI  BEQ 250$ ; IF EQ LOOP ( BR 160$ ; ERROR, NO TRANSFER REQUEST6260$: MOVB I.PRM+15(R3),R0 ; LOAD TRACK NUMBER IN R04270$: MOVB S.ITM(R4),S.CTM(R4) ; SET TIMEOUT COUNT2280$: BIS #S2.ACT,S.ST2(R4) ; SHOW I/O IS ACTIVE; MOV R0,RXDB(R2) ; LOAD TRACK, BUFFER ADDRESS, OR ASCII I6;;"; DYPWF - POWER FAIL ENTRY POINT=; POWER FAIL IS HANDLED BY THE DEVICE TIMING OUT, THEREFORE;=; NO WORK IS DONE HERE. IT WILL BE HANDLED WHEN THE DEVICED; TIME OUT ENTRY IS EXECUTED.T;E;D"; DYCAN - CANCEL I/O ENTRY POINT6; CANCEL I/O IS A NOP OP FOR FILE STRUCTURED DEVICES;3DYPWF: ;;; DYCAN: RETURN ;;;O;+7 ; ** -- DYKRB -- DY CONTROLLER STATUS CHANGE ROUTINE,!;(?"; THIS ROUTINE WILL HANDLE SETTING CONTROLLER ONLINE/OFFLINE #;S@$; THIS ROUTINE HAS BEEN ADDED FOR 22 BIT QBUS PROCESSORS. THE?%; FOLLOWING REQUIREMENTS MUST BE MET TO HAVE THIS CONTROLLERR&; BROUGHT ONLINE:'; F(; 1.DYCOM REGION MUST EXIST. DYCOM IS THE INTERMEDIATE BUFFER (IB).=); 2.DYCOM MUST RESIDE IN THE FIRST 124K OF PHYSICAL MEMORYF*;L;+; THIS ROUTINE WILL ALSO INSURE THAT THE DYCOM REGION IS >,; NOT CHECKPOINTABLE, NOT SHUFFLEABLE, AND FIXED IN MEMORY.-;, .; INPUTST/;O0; R2 = KRB ADDRESS1; R300irarmmmffDATA = CTB ADDRESS02; C = 0 REQUEST OFFLINE TO ONLINE TRANSITION/3; C = 1 REQUEST ONLINE TO OFFLINE TRANSTIONQ 4; $SCERR = 1 PRESET TO SUCESS5;R 6; OUTPUTS7;T$8; $SCERR < 0 OPERATION IS FAILURE%9; $CSERR CONTAINS FAILURE CODEF#:; $SCERR = 1 OPERATION IS SUCESS ;;I<;-=DYKRB:2> BCC 279$ ; IF CC -> GO TO TRANSITION TO ONLINE7> BIT #HF.UBM,@HFMSK ; UNIBUS MAP PRESENT ? ; GM001T@ BNE 290$ ; YES ;**-1R7A DEC CONCNT ; DECREMENT # OF CONTROLLERS USING DYCOM3+B BNE 290$ ; IF NE , THERE ARE STILL MOREOC MOV R0,-(SP) ; SAVE R0=&D MOV DYPCB,R0 ; GET ADDRESS OF DYCOM:E BEQ 278$ ; IF EQ -> DON'T CLEAR BIT - DYPCB NOT SET UP7F BIC #P2.LMA,P.ST2(R0);CLEAR THE 'LEAVE ME ALONE' BITO!G278$: MOV (SP)+,R0 ; RESTORE R01H BR 290$ ; AND RETURN0H279$: TST EXEVEC ; IF DONE ALREADY ; GM001"H BNE 2$ ; SKIP THIS ; GM001%H MOV R2,-(SP) ; SAVE R2 ; GM0010%H MOV R3,-(SP) ; SAVE R3 ; GM001D-H MOV KINAR6,-(SP) ; SAVE KINAR6 ; GM001Y:H MOV @#112,R0 ; GET ADDRESS OF TABLE OF ENTRIES ; GM001EH MOV (R0),R0 ; GET ADDRESS OF APR BIAS (1ST WORD IN TABLE) ; GM001 =H MOV (R0),KINAR6 ; MAP COMMON THROUGH I-SPACE APR6 ; GM001P.H MOV #EXEVEC,R3 ; POINT TO VECTOR ; GM0016H MOV #EXEVCL,R2 ; SPECIFY LENGTH OF VECTOR ; GM0012H CALL @#140004 ; TRANSLATE THE VECTOR ; GM001/H MOV (SP)+,KINAR6 ; RESTORE KINAR6 ; GM001 (H MOV (SP)+,R3 ; RESTORE R3 ; GM001(H MOV (SP)+,R2 ; RESTORE R2 ; GM0019H2$: BIT #HF.UBM,@HFMSK ; UNIBUS MAP PRESET ? ; GM001F+J BNE 290$ ; YES - NOTHING TO DO ;**-1 K MOV R0,-(SP) ; SAVE R0TL MOV R1,-(SP) ; SAVE R1M MOV R2,-(SP) ; SAVE R2ON MOV R3,-(SP) ; SAVE R3M(O MOV #DYCOM,R3 ; GET ADD OF DYCOM NAME3O CALL @SRNAM ; SEARCH FOR NAMED REGION ; GM001T4Q BCS 282$ ; DOES NOT EXIST - CANNOT BRING ;**-1R ; CONTROLLER ONLINEN-S MOV R2,DYPCB ; SAVE ADDRESS OF DYCOM'S PCBR8T MOV P.REL(R2),R3 ; GET STARTING PHYSICAL ADD OF DYCOM2U ADD P.SIZE(R2),R3 ; GET ENDING ADDRESS OF DYCOM3V CMP R3,#MEMSIZ ; IS DYCOM IN FIRST 124K MEMORY ?O2W BGT 282$ ; NO - DO NOT BRING CONTROLLER ONLINE#X MOV R2,R1 ; DYCOM'S PCB ADDRESSE0Y BIT #PS.OUT,P.STAT(R1); IS REGION IN MEMORY ?Z BEQ 281$ ; YES4[ INCB P.RMCT(R1) ; BUMP RESIDENT MAPPED TASK COUNT0\ MOVB #160.,P.PRI(R1) ; SET UP REGION PRIORITY)] ; MAKE THE PRIORITY HIGH SO IT GETSV^ ; QUEUED UP QUICKLY 4^ CALL @LDREG ; BRING REGION INTO MEMORY ; GM001.` MOV DYPCB,R1 ; RESTORE PCB ADDRESS ;**-1@a281$: BIS #PS.CHK!PS.FXD!PS.NSF,P.STAT(R1); MAKE SURE DYCOM IS-b ; NOT CHK,NOT SHUFF,AND FIXED IN MEMORYR/c BIS #P2.LMA,P.ST2(R1); DON'T TOUCH PARTITIONE7d INC CONCNT ; INCREMENT # OF CONTROLLERS USING DYCOMQ'e BR 285$ ; OK TO BRING DEVICE ONLINEEEe282$: MOV #IE.SPC,@SCERR ; ERROR - ILLEGAL BUFFER ADDRESS ; GM001I+g285$: MOV (SP)+,R3 ; RESTORE R3 ;**-1Vh MOV (SP)+,R2 ; RESTORE R2i MOV (SP)+,R1 ; RESTORE R1j MOV (SP)+,R0 ; RESTORE R0 k290$: RETURN ; DONE - RETURNl;+0m; ** --DYUCB -- DY UNIT STATUS CHANGE ROUUTINEn;R=o; THIS ROUTINE WILL HANDLE SETTING EACH UNIT ONLINE/OFFLINEBp;2!q; THIS ROUTINE WILL JUST RETURNOr;sDYUCB: t RETURNEuv;+;w; *** - $DYINT - RX211 FLOPPY DISK INTERRUPT ENTRY POINTNx;y;-8z INTSE$ DY,PR5,R$$X21 ;;; GENERATE INTERRUPT SAVE CODE%{ MOV U.SCB(R5),R4 ; GET SCB ADDRESS '| TSTB S.STS(R4) ; IS THE DRIVE BUSY ?} BNE 295$ ; IF NE YES(~ RETURN ; IGNORE SPURIOUS INTERRUPTS$295$: MOV R3,-(SP) ; SAVE REGISTER' MOV U.SCB(R5),R4 ;;; GET SCB ADDRESSE. MOV S.PKT(R4),R3 ;;; GET I/O PACKET ADDRESS' MOV S.CSR(R4),R4 ;;; GET CSR ADDRESSU7 MOV RXDB(R4),I.PRM+6(R3) ;;; SAVE CONTROLLER STATUS$ MOV (SP)+,R3 ;;; RESTORE REGISTER# BIT #RXACLO,RXES(R4);POWER OFF ?- BEQ 297$ ;NO) RETURN ;POWER OFF - IGNORE INTERRUPT297$:B# CLR (R4) ;;; DISABLE INTERRUPTS.4 CALL @FORK ;;; CREATE A SYSTEM PROCESS ; GM001) MOV R4,R2 ; COPY CSR ADDRESS ;**-1S% MOV U.SCB(R5),R4 ; GET SCB ADDRES00irUrnccccS+ MOVB S.CON(R4),R3 ; GET CONTROLLER INDEXM0 BIT #SCHAR,U.CW2(R5); SENSE CHARACTERISTICS ? BNE DYSEN ; IF NE YESD TST (R2) ; ANY ERRORS? BPL 300$ ; IF PL NO ERRORS" JMP DYRTY ; YES-RETRY FUNCTION2300$: ASRB RTTBL+1(R3) ; INITIALIZE IN PROGRESS? BCS 360$ ; IF CS YES, MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS. CMP #IO.SMD,I.FCN(R3) ; SET MEDIA DENSITY? BNE 310$ ; IF NE NOS JMP 410$ ; YES, FINISH I/O6310$: CMPB #IO.RLB/256.,I.FCN+1(R3) ; READ FUNCTION? BNE 340$ ; IF NE NO,! TST U.CW2(R5) ; SILO FUNCTION?# BMI 330$ ; IF MI YES0 BITB #DELDAT,I.PRM+6(R3) ; DELETED DATA READ? BEQ 320$ ; IF EQ NOB BISB #DELDAT,U.CW2(R5) ; YESP!320$: JMP 170$ ; GO EMPTY SILO$-330$: BIC #SILO,U.CW2(R5) ; CLEAR SILO FLAG' CALL NXTSEC ; UPDATE TO NEXT SECTORR" BEQ 400$ ; IF EQ, ALL FINISHED  BR 360$ ; INITIATE NEXT READ+340$: TST U.CW2(R5) ; FILL SILO FUNCTION?; BPL 350$ ; IF PL NO - BIC #SILO,U.CW2(R5) ; YES - CLEAR SILO BIT JMP 180$ ; GO WRITE SECTOR,350$: CALL NXTSEC ; UPDATE TO NEXT SECTOR" BEQ 410$ ; IF EQ, ALL FINISHED5360$: BIC #ERR1,U.CW2(R5) ; CLEAR TIMEOUT ERROR BITS1 MOV S.PKT(R4),R1 ; RETRIEVE I/O PACKET ADDRESSE6 CMP #IO.SMD,I.FCN(R1) ; SET MEDIA DENSITY FUNCTION? BNE 370$ ; IF NE NOA JMP DYSMD ; RETRY IO.SMD.370$: JMP 80$ ; RETRY CURRENT OPERATION NOW0380$: MOV #IE.BLK&377,R0 ; SET BAD BLOCK ERROR  BR 440$ ;34390$: MOV #IE.VER&377,R0 ; SET UNRECOVERABLE ERROR  BR 420$ ;J,400$: MOV I.FCN(R3),R1 ; GET FUNCTION CODE% BIC #7,R1 ; REMOVE QUAILFIER BITS ( CMP #IO.RPB,R1 ; READ PHYSICAL BLOCK? BNE 410$ ; IF NE NO < MOV #IS.RDD&377,R0 ; YES, DEFAULT ON READ TO DELETED DATA. BITB #DELDAT,U.CW2(R5) ; DELETED DATA READ? BNE 420$ ; IF NE YES;410$: MOV #IS.SUC&377,R0 ; SET SUCCESSFUL COMPLETION CODET1420$: MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS0, MOV I.PRM+4(R1),R1 ; SET BYTES TRANSFERED9 SUB U.CNT(R5),R1 ; CALCULATE BYTES ACTUALLY TRANSFERED 5430$: MOVB S.CON(R4),R3 ; RETRIEVE CONTROLLER INDEXC, MOVB RTTBL(R3),R2 ; SET FINAL RETRY COUNT, MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS/ CMPB #IO.SEC,I.FCN+1(R3) ; IO.SEC OR IO.SMD?  BNE 435$ ; IF NE NOB- BIS #CEW*256.,R2 ; SET INITIAL RETRY COUNTB  BR 440$ ;E4435$: BIS #RETRY*256.,R2 ; SET INITIAL RETRY COUNT:440$: BIC #SILO!SCHAR!ERR1!DELDAT,U.CW2(R5) ; CLEAR BITS& CALL @IODON ; SET DONE ; GM001/ JMP DYINI ; TRY FOR ANOTHER REQUEST ;**-1 ;T2; INTERRUPT PROCESSING POINT FOR DETERMINING THE; DISKETTE UNIT STATUS.B;,7DYSEN: MOV S.PKT(R4),R1 ; RETRIEVE I/O PACKET ADDRESSK1 BIT #RSAE,U.CW2(R5) ; READ STATUS AFTER ERROR?  BEQ 450$ ; IF EQ NOI# BIC #RSAE,U.CW2(R5) ; CLEAR FLAGN JMP 390$ ; EXIT WITH ERROR,450$: ASRB RTTBL+1(R3) ; INIT IN PROGRESS? BCC 460$ ; IF CC NOS$ BIT #RXACLO,I.PRM+6(R1) ; AC LOW? BNE 460$ ; IF CC NO & DECB RTTBL(R3) ; ANY RETRIES LEFT ? BNE 455$ ; IF NE YES+ JMP 630$ ; IF EQ NO, DON'T RETRY IO.SECT455$: JMP DYSEC ; RETRY ITT.460$: BIT #DRVRDY,I.PRM+6(R1) ; DRIVE READY? BEQ DYRTY ; IF EQ NO TST (R2) ; ANY ERRORS? BPL 470$ ; IF PL NOR4 BIT #DENERR,I.PRM+6(R1) ; IS IT A DENSITY ERROR? BEQ DYRTY ; IF EQ NO.470$: BIC #SCHAR!DEN,U.CW2(R5) ; CLEAR FLAGS0 MOV #SINGLE,U.CW3(R5) ; ASSUME SINGLE DENSITY3 BIT #DRVDEN,I.PRM+6(R1) ; IS IT DOUBLE DENSITY?I BEQ 480$ ; IF EQ NO3+ ASL U.CW3(R5) ; DOUBLE THE MAXIMUM LBN'SY+ BIS #DEN,U.CW2(R5) ; SET THE DENSITY BITE(480$: MOV #IS.SUC&377,R0 ; SET SUCCESS3 MOV U.CW2(R5),R1 ; RETURN DEVICE CHARACTERISTICSY  BR 430$ ;;(#; SENSE CHARACTERISTIC PROCESSING ;R=DYSEC: BIS #SCHAR,U.CW2(R5) ; INDICATE SENSE CHARACTERISTICD- MOV #MRDS,R0 ; SET MAINTENANCE READ STATUSR TSTB U.UNIT(R5) ; UNIT 1 ?E BEQ 490$ ; IF EQ NOE# BIS #UNIT,R0 ; YES SELECT UNIT 1 5490$: MOVB S.CON(R4),R1 ; RETRIEVE CONTROLLER INDEXA( MOV R0,CSRSV(R1) ; SAVE FUNCTION CODE# MOV R0,(R2) ; IN00irarmmmffDATAITIATE FUNCTIONT0 MOVB S.ITM(R4),S.CTM(R4) ; SET TIMEOUT COUNT. BIS #S2.ACT,S.ST2(R4) ; SHOW I/O IS ACTIVE  RETURN ;$;(; SET MEDIA DENSITYT;O+DYSMD: MOV #SETDEN,R0 ; SET FUNCTION CODE " BIC #DEN,U.CW2(R5) ; CLEAR FLAG0 MOV #SINGLE,U.CW3(R5) ; ASSUME SINGLE DENSITY" TST I.PRM(R1) ; SINGLE DENSITY? BEQ 500$ ; IF EQ YES% CMP #2,I.PRM(R1) ; DOUBLE DENSITY?O0 BNE 500$ ; IF NE NO, TREAT AS SINGLE DENSITY  BIS #SDEN,R0 ; DOUBLE DENSITY% BIS #DEN,U.CW2(R5) ; UPDATE STATUST' ASL U.CW3(R5) ; DOUBLE MAXIMUM LBN'SO! 500$: TSTB U.UNIT(R5) ; UNIT 1?   BEQ 510$ ; IF EQ NOR#  BIS #UNIT,R0 ; YES SELECT UNIT 1E5 510$: MOVB S.CON(R4),R1 ; RETRIEVE CONTROLLER INDEXD(  MOV R0,CSRSV(R1) ; SAVE FUNCTION CODE# MOV R0,(R2) ; INITIATE FUNCTIONE)520$: BITB #TR!DONE,(R2) ; TRANSFERRED?? BMI 530$ ; IF MI YES BEQ 520$ ; IF EQ NOO, MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS) MOV RXES(R2),I.PRM+6(R3) ; SAVE STATUSE BR DYRTY ; ERROR530$: MOV #'I,R0 ; ASCII "I"L& MOVB #30.,S.CTM(R4) ; TIMEOUT COUNT JMP 280$ ;;+,; **-DYOUT-FLOPPY DISK TIMEOUT ENTRY POINT;-,DYOUT: CALL LOGTMO ;;; LOG DEVICE TIMEOUT* BIS #ERR1,U.CW2(R5) ; SET TIMEOUT ERROR BR DYRTY1 ;O !;V"; RETRY LAST FUNCTIONT#;($DYRTY: CALL LOGERR ; LOG DEVICE ERROR6%DYRTY1: MOVB S.CON(R4),R3 ; RESTORE CONTROLLER INDEX,& MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS1' BIT #RSAE,U.CW2(R5) ; READ STATUS AFTER ERROR?T( BNE 640$ ; IF NE YES+) BITB #IQ.X,I.FCN(R1) ; INHIBIT RETRIES ?T* BEQ 540$ ; IF EQ NO:+ CMP #IO.SEC,I.FCN(R1) ; SENSE CHARACTERISTICS FUNCTION?, BEQ 630$ ; IF EQ YES9- BIS #RSAE,U.CW2(R5) ; SET READ STATUS AFTER ERROR FLAGT!. JMP DYSEC ; GO DO READ STATUS*/540$: DECB RTTBL(R3) ; ANY RETRIES LEFT?0 BNE 550$ ; IF NE YES71 CMP #IO.SEC,I.FCN(R1) ; DON'T REPEAT IO.SEC FUNCTIONR2 BEQ 630$ ; IF EQ EXIT 93 BIS #RSAE,U.CW2(R5) ; SET READ STATUS AFTER ERROR FLAGT!4 JMP DYSEC ; GO DO READ STATUS ,5550$: BIT #ERR1,U.CW2(R5) ; TIMEOUT ERROR?6 BNE 620$ ; IF NE YES(7560$: BIT #RXACLO,I.PRM+6(R1); AC LO ?8 BEQ 565$ ; NOT9 BR 630$ ; ERROR - POWER OFF?:565$: BIT #SCHAR,U.CW2(R5) ; SENSE CHARACTERISTICS FUNCTION ?D; BNE 620$ ; IF NE YES5< CMP IO.SMD,I.FCN(R1) ; SET MEDIA DENSTIY FUNCTION?0= BEQ 620$ ; IF EQ YES*> BIT #CRCERR,I.PRM+6(R1) ; CRC ERRORS ?? BNE 610$ ; IF NE YES2@570$: CMP #IO.SMD,I.FCN(R1) ; SET MEDIA DENSITY?A BNE 580$ ; IF NE NOC'B JMP DYSMD ; RETRY SET MEDIA DENSITY,7C580$: MOV I.PRM+10(R1),R0 ; GET LOGICAL SECTOR NUMBER6;D BIT #WCOVFL!DENERR,I.PRM+6(R1) ; WORD COUNT OVERFLOW ORBE ; DENSITY ERROR ?FF BEQ 610$ ; IF EQ NOC4G BIT #DRVDEN,I.PRM+6(R1) ; IS IT DOUBLE DENSITY ?H BNE 590$ ; IF NE YES4I BIC #DEN,U.CW2(R5) ; CORRECT IT TO SINGLE DENSITY!J BIC #SDEN,U.BUF(R5) ; HERE TOOPK ASL R0 ; MULTIPLY LSN BY 2=L MOV #SINGLE,U.CW3(R5) ; CHANGE MAX LBN'S TO SINGLE DENSITYE M BR 600$ ;55N590$: BIS #DEN,U.CW2(R5) ; CHANGE TO DOUBLE DENSITYTO ASR R0 ; DIVIDE LSN BY 2=P MOV #DOUBLE,U.CW3(R5) ; CHANGE MAX LBN'S TO DOUBLE DENSITY19Q600$: MOV R0,I.PRM+10(R1) ; STORE LOGICAL SECTOR NUMBERB5R610$: BIC #ERR1,U.CW2(R5) ; CLEAR TIMEOUT ERROR BITIS JMP 80$ ; RETRY FUNCTION8T620$: MOVB #1,RTTBL+1(R3) ; SET INITIALIZE IN PROGRESS2U MOV #INIT!INTEBL,CSRSV(R3) ; SAVE FUNCTION CODE2V MOV #INIT!INTEBL,(R2) ; INITIALIZE RX211 DRIVES1W MOVB S.ITM(R4),S.CTM(R4) ; SET TIMEOUT COUNTER X RETURN ; .Y630$: BIT #DRVRDY,I.PRM+6(R1) ; DRIVE READY?Z BEQ 640$ ; IF EQ NO[ JMP 390$ ; EXIT WITH IE.VER 7\640$: MOV #IE.DNR&377,R0 ; SET DEVICE NOT READY ERROR ] JMP 420$ ; EXIT WITH IE.DNR ^ .DSABL LSB,_`;+@a; *** - TRKSEC - CONVERT LOGICAL OR PHYSICAL BLOCK NUMBER TOb; TRACK-SECTOR PAIREc;T d; INPUT:e; R3 - I/O PACKET ADDRESSS-f; I.PRM+10(R3) - LOGICAL OR PHYSICAL SECTORBg;) h; OUTPUT: !i; I.PRM+14(R3) - SECTOR (1-26.)T j; I.PRM+15(R3) - TRACK (0-76.)k; R3 - UNCHANGEDl; C CLEAR 00irUrncccc- VALID BLOCKR2m; C SET - BAD BLOCK NUMBER (PHYSICAL OR LOGICAL)n; o;-p=qTRKSEC: MOV I.PRM+10(R3),R1 ; GET LOGICAL OR PHYSICAL BLOCKr MOV #8.,R0 ; SET LOOP COUNTs MOV #6400,R2 ; SET DIVISOR -t10$: CMP R2,R1 ; DOES 26 GO INTO DIVIDEND?Nu BHI 20$ ; IF HI NO (C=0))v SUB R2,R1 ; SUBTRACT 26 FROM DIVIDENDDw SEC ; SET CARRY,x20$: ROL R1 ; SHIFT DIVIDEND AND QUOTIENTy DEC R0 ; DONE?z BGT 10$ ; IF GT NO!{ BISB R1,R0 ; GET TRACK NUMBER1| CMP R0,#77. ; IS IT A LEGITMATE TRACK NUMBER? } BHI 60$ ; IF HI NO~ BLO 30$ ; IF LO YES 8 BITB #IO.RPB&377,I.FCN(R3) ; PHYSICAL BLOCK FUNCTION?' BEQ 60$ ; IF EQ NO, BAD BLOCK ERRORO$30$: CLRB R1 ; CLEAR TRACK NUMBER& SWAB R1 ; SHIFT DONE SECTOR NUMBER> BITB #IO.RPB&377,I.FCN(R3) ; IS IT A PHYSICAL BLOCK NUMBER? BNE 50$ ; IF NE YESS' CMP #12.,R1 ; NO, C=1 IF 13<=R1<=25D) ROL R1 ; DOUBLE FOR INTERLEAVE FACTOR" ASL R0 ; ADD TRACK -TRACK SKEW ADD R0,R1 ; SKEW BY 2*TRACK7 ADD R0,R1 ; SKEW BY 4*TRACKB ADD R0,R1 ; SKEW BY 6*TRACKB! ASR R0 ; RESTORE TRACK NUMBERP MOV #26.,R2 ; SET MODULUSK840$: SUB R2,R1 ; MODULO SECTOR INTO RANGE -26. TO -1.( BGE 40$ ; IF GE, LOOP UNTIL NEGATIVE& ADD R2,R1 ; CONVERT TO RANGE 0-25.# INC R0 ; LBN0 STARTS ON TRACK 1C'50$: INC R1 ; CONVERT TO RANGE 1-26.S+ MOV R1,I.PRM+14(R3) ; SAVE SECTOR NUMBER BR 70$ ; - BRANCHN%60$: SEC ; SIGNAL BAD BLOCK ERRORK+ MOVB R0,I.PRM+15(R3) ; SAVE TRACK NUMBER7 BR 80$ ; RETURNW/70$: MOVB R0,I.PRM+15(R3) ; SAVE TRACK NUMBER; CMP #77.*256.,I.PRM+14(R3) ; IS IT A VALID TRACK/SECTOR?U80$: RETURN ;1;+9; *** - NXTSEC - UPDATE BLOCK NUMBER , BUFFER ADDRESSN; AND BUFFER POINTER;O ; INPUT:; R3 - I/O PACKET ADDRESST; R5 - UCB ADDRESS'; I.PRM+10(R3) - CURRENT BLOCK NUMBERM8; I.PRM+12(R3) - BYTES TRANSFERED DURING LAST FUNCTION&; U.CNT(R5) - BYTES LEFT TO TRANSFER; U.BUF(R5) - BUFFER ADDRESS;E ; OUTPUT:7'; I.PRM+10(R3) - UPDATED BLOCK NUMBERP*; U.BUF(R5) - UPDATED BY 128./256. BYTES5; U.CNT(R5) - UPDATED BY NUMBER OF WORDS TRANSFERED: ; Z SET - ALL BYTES TRANSFERED$; Z CLEAR - MORE BYTES TO TRANSFER ; C CLEAR - VALID TRACK/SECTOR; C SET - BAD BLOCK NUMBER;P;+0NXTSEC: INC I.PRM+10(R3) ; UPDATE BLOCK NUMBER+ MOVB S.CON(R4),R0 ; GET CONTROLLER INDEXT' BIT #DEN,U.CW2(R5) ; SINGLE DENSITY?( BEQ 5$ ; IF EQ YESD ADD #256.,U.BUF+2(R5) ; UPDATE BUFFER ADDRESS FOR DOUBLE DENSITY BR 10$ ; AND CONTINUEPG5$: ADD #128.,U.BUF+2(R5) ; UPDATE BUFFER ADDRESS FOR SINGLE DENSITYN$10$: BCC 15$ ; IF CC, NO OVERFLOW9 ADD #10000,U.BUF(R5) ; CARRY INTO EXTENDED MEMORY BITSRB15$: SUB I.PRM+12(R3),U.CNT(R5) ; UPDATE BYTES LEFT TO TRANSFER2 SUB I.PRM+12(R3),COUNT(R0); UPDATE COUNT FOR IB! TST BFLAG(R0) ; BUFFER DATA ?G BEQ 100$ ; NOT3 CMPB #IO.WLB/256.,I.FCN+1(R3); WRITE OPERATION ?  BEQ 100$ ; YES) TST U.CNT(R5) ; ANY MORE DATA TO GET ?  BLE 30$ ; NO - MOVE IT( BIT #DEN,U.CW2(R5) ; SINGLE DENSITY ? BEQ 26$ ; YESF* CMP #256.,COUNT(R0) ; MORE ROOM IN IB ? BLE 100$ ; YES BR 30$ ; NO - MOVE THE DATAA.26$: CMP #128.,COUNT(R0) ; MORE ROOM IN IB ? BLE 100$ ; YES/30$: MOV BUFLEN(R0),TEMP(R0); NUMBER OF BYTES3' SUB COUNT(R0),TEMP(R0); TO TRANSFERB32$: CALL BLXIO ; MOVE DATA8 ADD #<256./100>,DYPTR(R0) ; UPDATE POINTER INTO DYCOM ; (32 WORD BLOCKS)9 SUB #256.,TEMP(R0) ; UPDATE TEMPORY COUNT FOR MULTIPLEO  ; FORKSB  BLE 35$ ;52 TST @FRKHD ; ANYONE WAITING TO FORK? ; GM001. BEQ 32$ ; IF EQ NO -> DO SOME MORE ;**-1, MOV (SP)+,RETPTR(R0); SAVE RETURN ADDRESS8 CALL @FORK ; LET SOMEONE ELSE DO SOME WORK ; GM0014 MOVB S.CON(R4),R0 ; GET CONTROLLER INDEX ;**-1% MOV S.CSR(R4),R2 ; GET CSR ADDRESSB, MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS4 MOV RETPTR(R0),-(SP); PUT RETURN ADDRESS ON STACK" BR 32$ ; NOW DO SOME MORE WORK335$: MOV BUFLEN(R0),COUNT(R0); RESET LENGTH 00irarmmmffDATAOF IB 8 BIC #30000,U.BUF(R5) ; RESET EXTENDED ADDRESSING BITS2 BIS HIPHYA(R0),U.BUF(R5); TO POINT TO BEG OF IB2 MOV LOPHYA(R0),U.BUF+2(R5); RESET LO BITS OF IB( MOV DYPCB,R1 ; GET PCB OF DATA COMMON9 MOV P.REL(R1),DYPTR(R0); INITIALIZE POINTER INTO DYCOML TST R0 ; ONE CONTROLLER ?R BEQ 100$ ; YES+ MOV P.SIZE(R1),-(SP); GET SIZE OF REGIONA ASR (SP) ; CUT IN HALF9 ADD (SP)+,DYPTR(R0) ; POINT INTO SECOND HALF OF REGIONM4100$: TST U.CNT(R5) ; IF EQ TO ZERO THEN ALL DONE  RETURN ;C;.;+.; ** -- BLXIO -- MOVE BLOCK OF DATA ROUTINE;,I; THE MOVE BLOCK OF DATA ROUTINE WILL MOVE THE SPECIFIED DATA IN MEMORYI; ;-BLXIO: MOV R0,-(SP) ; SAVE REG MOV R1,-(SP) ;D MOV R2,-(SP) ;E MOV R3,-(SP) ;L MOV R4,-(SP) ;C MOV R5,-(SP) ;Q# MOV R3,R5 ; SAVE I/O PACKET ADD;+ MOVB S.CON(R4),R2 ; GET CONTROLLER INDEXA- MOV PHYADD(R2),R1 ; GET LO BITS OF ADDRESSH, MOV HIADD(R2),R0 ; GET HI BITS OF ADDRESS* ASHC #10.,R0 ; CALCULATE DISP AND BIAS ASHC #-10.,R1 ;2 CMPB #IO.WLB/256.,I.FCN+1(R5); WRITE FUNCTION ? BEQ 10$ ; YESA( ADD #APR6DS,R1 ; SET TO MAP THRU APR6$ MOV R0,R3 ; DESTINATION APR BIAS! MOV R1,R4 ; APR6 DISPLACEMENT . CMP #256.,TEMP(R2) ; MORE THAN 256 BYTES TO BLE 5$ ; BE TRANSFERRED ?  MOV TEMP(R2),R0 ; NOI  BR 7$ ;;95$: MOV #256.,R0 ; YES - AT LEAST 256 BYTES TO TRANSFERD77$: ADD R0,PHYADD(R2) ; UPDATE FOR NEXT CALL TO BLXIO ' ADC HIADD(R2) ; NOT FOR CURRENT CALL;&  MOV DYPTR(R2),R1 ; SOURCE APR5 BIAS'  MOV #APR5DS,R2 ; SOURCE DISPLACEMENTR  BR 20$ ;/ 10$: ADD #APR5DS,R1 ; SET UP TO MAP THRU APR5M.  CMP #256.,TEMP(R2) ; MORE THAN 256 BYTES TO BLE 17$ ; BE TRANSFERRED ? MOV TEMP(R2),R3 ; NO(  BR 18$ ;:17$: MOV #256.,R3 ; YES - AT LEAST 256 BYTES TO TRANSFER818$: ADD R3,PHYADD(R2) ; UPDATE FOR NEXT CALL TO BLXIO+ ADC HIADD(R2) ; NOT FOR THE CURRENT CALLY MOV R3,-(SP) ; SAVE REG* MOV DYPTR(R2),R3 ; DESTINATION APR BIAS  MOV R1,R2 ; APR DISPLACEMENT MOV R0,R1 ; SOURCE APR BIASR MOV (SP)+,R0 ; RESTORE REG , MOV #APR6DS,R4 ; DESTINATION DISPLACEMENT.20$: CALL @BLXI ; MOVE THE DATA ; GM001' MOV (SP)+,R5 ; RESTORE REG ;**-1? MOV (SP)+,R4 ;3 MOV (SP)+,R3 ;; MOV (SP)+,R2 ;R MOV (SP)+,R1 ;2  MOV (SP)+,R0 ;R ! RETURND";+ #; **-LOGTMO-LOG DEVICE TIMEOUT$; **-LOGERR-LOG DEVICE ERROR%;E?&; THESE ROUTINES WILL ALLOCATE A CORE BLOCK, FILL IT WITH THE >'; REGISTER INFORMATION, CALL THE APPROPRIATE EXECUTIVE ERROR?(; LOGGING ROUTINE, DEALLOCATE THE CORE BLOCK, AND RETURN BACK#); TO THE CALLER.*;I +; INPUTS:,; R2=CSR ADDRESS-; R4=SCB ADDRESS.; R5=UCB ADDRESS/;E 0; OUTPUTS:1; SAME AS INPUTS.R&2; ALL OTHER REGISTERS ARE DESTROYED.3;-4 5 .ENABL LSBD5LOGERR: MOV DVERR,-(SP) ; ADDRESS OF DEVICE ERROR ROUTINE ; GM0017 BR 10$ ; ;**-1EH7LOGTMO: MOV DTOER,-(SP) ;;; ADDRESS OF DEVICE TIMEOUT ROUTINE ; GM001>910$: MOV #DYNUM*2,R1 ; GET NUMBER OF REGISTERS TO LOG ;**-179 CALL @ALOCB ; ALLOCATE THE REGISTER BLOCK ; GM001 ; BCC 20$ ; IF CC OK ;**-12; INC @ERRSQ ; INDICATE A MISSED ERROR ; GM001.; CMP (SP)+,DTOER ; TIMEOUT ERROR? ; GM001 > BNE 30$ ; IF NE NO ;**-2,? CLR @S.CSR(R4) ;;; CLEAR INTERRUPT ENABLE @ MTPS #0 ;;; ALLOW INTERRUPTS A BR 30$ ;+B20$: MOV R0,R1 ; COPY CORE BLOCK ADDRESS *C MOV S.CSR(R4),R2 ; RETRIEVE CSR ADDRESS$D MOV (R2),(R1) ; SAVE CSR CONTENTS0E MOVB S.CON(R4),R3 ; RETRIEVE CONTROLLER INDEX+F BIC #^C<17>,CSRSV(R3) ; ISOLATE BITS 0-4E.G BIS CSRSV(R3),(R1)+ ; INCLUDE FUNCTION CODE!H MOV RXDB(R2),(R1)+ ; SAVE RXDBCI J .REPT 4KL CLR (R1)+ ; ZERO 4 WORDSMN .ENDRO&P MOV R0,R2 ; GET CORE BLOCK ADDRESSQ CALL @(SP)+ ; LOG THE ERRORN+R MOV R2,R0 ; GET BACK CORE BLOCK ADDRESSP6S MOV #DYNUM*2,R1 ; GET NUMBER OF BYTES TO DEALLOCATE5S CALL @DEACB ; DEALLOCATE THE CORE BLOCK ; GM001M7U30$: MOV S.CSR(R4),R2 ; RETRIEVE CSR ADDRESS ;**-1R V RETURN 00irjrncccc ;L W .DSABL LSBCXYZ .END) ; ISOLATE BITS 0-4E.G BIS CSRSV(R3),(R1)+ ; INCLUDE FUNCTION CODE!H MOV RXDB(R2),(R1)+ ; SAVE RXDBCI J .REPT 4KL CLR (R1)+ ; ZERO 4 WORDSMN .ENDRO&P MOV R0,R2 ; GET CORE BLOCK ADDRESSQ CALL @(SP)+ ; LOG THE ERRORN+R MOV R2,R0 ; GET BACK CORE BLOCK ADDRESSP6S MOV #DYNUM*2,R1 ; GET NUMBER OF BYTES TO DEALLOCATE5S CALL @DEACB ; DEALLOCATE THE CORE BLOCK ; GM001M7U30$: MOV S.CSR(R4),R2 ; RETRIEVE CSR ADDRESS ;**-1R V RETURN  .TITLE CORALR .IDENT /10.06/T;7Q; COPYRIGHT (c) 1982, 1983, 1984, 1985, 1987 BY DIGITAL EQUIPMENT CORPORATION.); ALL RIGHTS RESERVED.;G>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;O ; D. N. CUTLER 3-AUG-73  ;  ; MODIFIED BY: ;P; H. HUANG 28-JUN-83 10.00;O3; HH175 -- ADD EXTENDIBLE SECONDARY POOL SUPPORTD;S ; J. W. BERZLE 07-SEP-83 10.01;T4; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;T ; J. W. BERZLE 11-JUN-84 10.02;92; JWB085 -- DEALLOCATE CONTEXT BLOCK IF PRESENT%; WHEN DEALLOCATING CLOCK BLOCKS;W ; C. A. SILVER 12-MAR-85 10.03;Y*; CAS019 -- ADD AUXILARY SPM HOOKPOINTS;H ; C. B. PUTNAM 09-MAY-85 10.04 ;N/!; CBP204 -- ADD POOL FRAGMENT VALIDITY CHECK";."#; B. S. MCCARTHY 24-JUN-85 10.05$;-)%; CAS019 -- REFORMAT SPM HOOK COMMENTS&;"&; P. K. M. WEISS 13-OCT-86 10.06&; 1&; PKW118 -- ADD $ALSC1 AND $DESC1 ENTRY POINTS';#(; CORE BUFFER ALLOCATION ROUTINES);J*; MACRO LIBRARY CALLSX+;C,- .MCALL CLKDF$,PKTDF$,BGCK$A5. CLKDF$ ;DEFINE CLOCK QUEUE CONTROL BLOCK OFFSETS3&/ PKTDF$ ;DEFINE I/O PACKET OFFSETS01;+"2; **-$ALOCB-ALLOCATE CORE BUFFER43; **-$ALOC1-ALLOCATE CORE BUFFER (ALTERNATE ENTRY)4;J5; THIS ROUTINE IS CALLED TO ALLOCATE AN EXEC CORE BUFFER. THE ALLOCATIONH6; ALGORITHM IS FIRST FIT AND BLOCKS ARE ALLOCATED IN MULTIPLES OF FOUR 7; BYTES.8; 9; INPUTS:T:;I@;; R0=ADDRESS OF CORE ALLOCATION LISTHEAD-2 IF ENTRY AT $ALOC1.4<; R1=SIZE OF THE CORE BUFFER TO ALLOCATE IN BYTES.=; >; OUTPUTS:?;L@@; C=1 IF INSUFFICIENT CORE IS AVAILABLE TO ALLOCATE THE BLOCK."A; C=0 IF THE BLOCK IS ALLOCATED.'B; R0=ADDRESS OF THE ALLOCATED BLOCK.C!C; R1=LENGTH OF BLOCK ALLOCATEDD;-E F .ENABL LSBD9G$ALOCB::MOV #$CRAVL-2,R0 ;POINT TO ALLOCATION MASK WORDIHIJ .IF DF Q$$OPTK'L ADD (R0),R1 ;ROUND TO NEXT BOUNDARYEM BIC (R0)+,R1 ;S%N BEQ 5$ ;IF EQ ZERO LENGTH REQUESTT*O CMP R1,#I.LGTH ;REQUEST SIZE OF PACKET?P BNE 5$ ;IF NE NO4Q MOV #$PKAVL,R2 ;POINT TO PACKET AVAILABLE POINTER'R MOV (R2),R0 ;PICK UP PACKET POINTERAS BEQ 4$ ;IF EQ THERE IS NONEE/T MOV (R0),(R2)+ ;UNLINK PACKET FROM LIFO LISTCU;+V; ** W A R N I N G ** W; X; SPM HOOKPOINT NUMBER 77.Y;D+Z; DO NOT CHANGE THE INSTRUCTION FOLLOWINGT[; LABEL WITHOUT CHECKING SPM\;-]-^$SPH77==. ;SPM CHANGES THE INSTRUCTION AT!_ ;THE LOCATION OF THIS LABEL `.a DEC (R2) ;INDICATE ONE PACKET LESS IN LIST b RETURN ;:c4$: MOV #$CRAVL-2,R0 ;POINT BACK TO ALLOCATION MASK WORDde .ENDCfg.h$ALOC1::ADD (R0),R1 ;ROUND TO NEXT BOUNDARYi BIC (R0)+,R1 ;CLEAR EXCESS,%j5$: SEC ;ASSUME ZERO LENGTH BLOCK&k BEQ 35$ ;IF EQ ZERO LENGTH REQUESTlm .IF DF P$$CTLn)o MOV R0,-(SP) ;SAVE ADDRESS OF LISTHEADLpq .ENDCr0s10$: MOV R0,R2 ;SAVE ADDRESS OF CURRENT BLOCK*t MOV (R2),R0 ;GET ADDRESS OF NEXT BLOCKuvw .IF DF R$$DERxy BEQ 40$ ;IF EQ END OF CHAINSz ;3{ ;THE FOLLOWING CODE CHECKS TO SEE IF THE POOL .| ;...FRAGMENT IS OF VALID SIZE. IT CAN BE4} ;...NEITHER ODD NOR AN ODD MULTIPLE OF 2 BYTES~ ;E% BIT #3,2(R0) ;FRAGMENT SIZE VALID?N BNE 50$ ;IF NE, NO .IFFE BEQ 30$ ;IF EQ END OF CHAIN .ENDC" CMP 2(R0),R1 ;BLOCK BIG ENOUGH? BLO 10$ ;IF LO NO & BEQ 20$ ;IF EQ BLOCK IS EXACT SIZE* TST (00jrarmmmffDATAR0)+ ;POINT TO SIZE OF FREE BLOCK) SUB R1,(R0) ;CALCULATE SIZE REMAININGD& ADD R0,R1 ;POINT TO NEW FREE BLOCK MOV (R0),(R1) ;COPY SIZEP MOV -(R0),-(R1) ;COPY LINKV- MOV R1,(R0) ;STORE LINK TO NEW FREE BLOCK $ SUB R0,R1 ;RESTORE SIZE OF BLOCK320$: MOV (R0),(R2) ;UPDATE LINK TO NEW FREE BLOCKI 30$: ; .IF DF P$$CTL6 BIT #^C<$CRAVL>,(SP)+ ;ALLOCATION FROM EXEC'S POOL?. BNE 35$ ;IF NE NO, SKIP POOL SIZE TRACKING. ROR (R0) ;ALLOCATION FAILURE? (SAVE C-BIT) BPL 32$ ;IF PL NOE1 MOV #PC.ALF!,R2 ;SET LOW POOL MASKA) BR 33$ ;REPORT THE ALLOCATION FAILUREO832$: SUB R1,$PRISZ ;SUBTRACT FROM TOTAL FREE POOL SIZE;+; ** W A R N I N G **L;O; SPM HOOKPOINT NUMBER 76.;S+; DO NOT CHANGE THE INSTRUCTION FOLLOWINGA; LABEL WITHOUT CHECKING SPM;--$SPH76==. ;SPM CHANGES THE INSTRUCTION AT;! ;THE LOCATION OF THIS LABELE8 CMP @#$PRISZ,@#$PRILL ;DID WE CROSS LOWER POOL LIMIT?& BHIS 34$ ;IF HIS NO, ALLOCATION OK9 MOV #PC.LOW!,R2 ;SET UP LOW POOL CONDITIONS.33$: CALL $PLTRQ ;REQUEST POOL MONITOR TASK'34$: ASL (R0) ;RECOVER THE CARRY BIT  .ENDC35$: RETURN ;DONEG .IF DF R$$DER 40$: ; .IF DF P$$CTL INC (SP)+ ;CLEAN STACK .ENDC' DEC R0 ;RETURN A VALUE OF MINUS ONEA RETURN ;CE50$: BGCK$A BF.POL,BE.FSI,FATAL ;ALLOCATION - FRAGMENT SIZE INVALID; .ENDC .DSABL LSBI;+-; **-$ALCLK-ALLOCATE CLOCK QUEUE CORE BLOCK4;2L; THIS ROUTINE IS CALLED TO ALLOCATE A CORE BLOCK FOR A CLOCK QUEUE ENTRY.;: ; INPUTS:E; ; NONE.I; ; OUTPUTS:;5C; IF INSUFFICIENT CORE IS AVAILABLE TO ALLOCATE THE BLOCK, THEN A@; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED. ELSE THE ADDRESS OF8; THE ALLOCATED BLOCK IS RETURNED TO THE CALLER IN R0.;- .ENABL LSBB7$ALCLK::MOV #C.LGTH,R1 ;PICK UP LENGTH OF CLOCK BLOCK. BR 10$ ;;+/; **-$DECLK-DEALLOCATE CLOCK QUEUE CORE BLOCKEP; **-$DCLKA-DEALLOCATE CLOCK QUEUE BLOCK THAT MAY HAVE ACCOUNTING REQUIREMENTS;UI; THIS ROUTINE IS CALLED TO DEALLOCATE A CORE BLOCK THAT WAS BEING USED; FOR A CLOCK QUEUE ENTRY.; ; INPUTS:H;C3; R0=ADDRESS OF THE CORE BLOCK TO BE DEALLOCATED.E;S ; OUTPUTS:;4; THE CLOCK QUEUE ENTRY CORE BLOCK IS DEALLOCATED.;- $DCLKA:: .IF DF A$$CNT0 CMPB #C.SCHD,C.RQT(R0) ;PERIODIC TASK REQUEST BEQ 2$ ;IF EQ YESE3 CMPB #C.SSHT,C.RQT(R0) ;SINGLE SHOT TASK REQUESTO BNE $DECLK ;IF NE NO"2$: MOV C.UAB(R0),R1 ;LOCATE UAB BEQ $DECLK ;IF EQ, NO UABD) MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGU MOV R1,KISAR6 ;MAP UAB + DECB @#B.USE+140000 ;DECREMENT USE COUNTE& BNE 4$ ;IF NE, UAB IS STILL ACTIVE MOV R0,-(SP) ;SAVE R0. BICB #BS.ACT,@#B.STM+140000 ;DEACTIVATE UAB$ CALL $QACNT ;QUEUE UAB TO SYSLOG* MOV (SP)+,R0 ;RESTORE CLQ BLOCK ADDRESS04$: MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPING .ENDC $DECLK::* .IF DF N$$DIR ;NAMED DIRECTORY SUPPORT1  CMPB #C.SCHD,C.RQT(R0) ;PERIODIC TASK REQUEST?E  BEQ 5$ ;IF EQ, YES4  CMPB #C.SSHT,C.RQT(R0) ;SINGLE SHOT TASK REQUEST?  BNE 7$ ;IF NE, NO4/ 5$: TSTB C.NAM(R0) ;IS THERE A CONTEXT BLOCK?B BEQ 7$ ;IF EQ, NOV. MOV C.CTX(R0),R1 ;GET CONTEXT BLOCK POINTER! BEQ 7$ ;BR IF EQ, NONE EXISTS ) CALL $DLCTX ;DEALLOCATE CONTEXT BLOCKO7$: ;REFERENCE LABEL  .ENDC ; DF N$$DIR0 MOV #C.LGTH,R1 ;PICK UP LENGTH OF CLOCK BLOCK BR $DEACB ;$;+5; **-$ALPKT-ALLOCATE SEND OR I/O REQUEST CORE BLOCKR; E; THIS ROUTINE IS CALLED TO ALLOCATE A CORE BLOCK FOR A SEND OR I/OL; REQUEST QUEUE ENTRY.; ; INPUTS:; ; NONE.R!;S "; OUTPUTS:#;OC$; IF INSUFFICIENT CORE IS AVAILABLE TO ALLOCATE THE BLOCK, THEN AP@%; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED. ELSE THE ADDRESS OF8&; THE ALLOCATED BLOCK IS RETURNED TO THE CALLER IN R0.';-(2)$ALPKT::MOV #I.LGTH,R1 ;SE00jrrnccccT LENGTH OF I/O PACKET.*10$: CALL $ALOCB ;ATTEMPT TO ALLOCATE BLOCK+ BCC 80$ ;IF CC SUCCESSFULR#, DRSTS D.RS1 ;ALLOCATION FAILUREA-.;+7/; **-$DEPKT-DEALLOCATE SEND OR I/O REQUEST CORE BLOCK 0;.I1; THIS ROUTINE IS CALLED TO DEALLOCATE A CORE BLOCK THAT WAS BEING USEDS*2; FOR A SEND OR I/O REQUEST QUEUE ENTRY.3;, 4; INPUTS: 5;T36; R0=ADDRESS OF THE CORE BLOCK TO BE DEALLOCATED.F7; 8; OUTPUTS:9; B:; THE SEND OR I/O REQUEST QUEUE ENTRY CORE BLOCK IS DEALLOCATED.;;-<2=$DEPKT::MOV #I.LGTH,R1 ;SET LENGTH OF I/O PACKET>?;+$@; **-$DEACB-DEALLOCATE CORE BUFFER6A; **-$DEAC1-DEALLOCATE CORE BUFFER (ALTERNATE ENTRY)B;EJC; THIS ROUTINE IS CALLED TO DEALLOCATE AN EXEC CORE BUFFER. THE BLOCK ISFD; INSERTED INTO THE FREE BLOCK CHAIN BY CORE ADDRESS. IF AN ADJACENTHE; BLOCK IS CURRENTLY FREE, THEN THE TWO BLOCKS ARE MERGED AND INSERTEDF; IN THE FREE BLOCK CHAIN.G; H; INPUTS: I; 4J; R0=ADDRESS OF THE CORE BUFFER TO BE DEALLOCATED.6K; R1=SIZE OF THE CORE BUFFER TO DEALLOCATE IN BYTES.@L; R3=ADDRESS OF CORE ALLOCATION LISTHEAD-2 IF ENTRY AT $DEAC1.M;$ N; OUTPUTS:O;R=P; THE CORE BLOCK IS MERGED INTO THE FREE CORE CHAIN BY CORE AQ; ADDRESS AND IS AGCOMERATED IF NECESSARY WITH ADJACENT BLOCKS. R;-S9T$DEACB::MOV #$CRAVL-2,R3 ;POINT TO ALLOCATION MASK WORDTUVW .IF DF Q$$OPTX'Y ADD (R3),R1 ;ROUND TO NEXT BOUNDARYLZ BIC (R3)+,R1 ;&[ BEQ 80$ ;IF EQ NO BLOCK TO RELEASE.\ CMP R1,#I.LGTH ;LENGTH EQUAL TO I/O PACKET?] BNE 30$ ;IF NE NOO9^ MOV #$PKMAX,R2 ;PNT TO MAX # OF PACKETS TO PREALLOCATE2,_ CMPB (R2),-(R2) ;MAX NUMBER PREALLOCATED?` BLOS 30$ ;IF LOS YESa;+b; ** W A R N I N G **Yc; d; SPM HOOKPOINT NUMBER 75.e; +f; DO NOT CHANGE THE INSTRUCTION FOLLOWINGg; LABEL WITHOUT CHECKING SPMh;-i-j$SPH75==. ;SPM CHANGES THE INSTRUCTION AT!k ;THE LOCATION OF THIS LABELRl)m INC (R2) ;INDICATE ONE MORE AVAILABLEL-n MOV -(R2),(R0) ;LINK PACKET INTO LIFO LIST o MOV R0,(R2) ;B p RETURN ;Nqr .ENDCst.u$DEAC1::ADD (R3),R1 ;ROUND TO NEXT BOUNDARYv BIC (R3)+,R1 ;CLEAR EXCESSO&w BEQ 80$ ;IF EQ NO BLOCK TO RELEASEx30$: ;REF LABELyz{ .IF DF R$$DER!P$$CTLR|)} MOV R3,-(SP) ;SAVE ADDRESS OF LISTHEADO~ .ENDC040$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT BLOCK* MOV (R2),R3 ;GET ADDRESS OF NEXT BLOCK BEQ 50$ ;IF EQ END OF CHAINC CMP R0,R3 ;BLOCK GO HERE?A BHIS 40$ ;IF HIS NOL+50$: MOV R3,(R0) ;ASSUME NO AGLOMERATIONB .IF DF P$$CTL1 CMP #$CRAVL,(SP) ;DEALLOCATION OF EXEC'S POOL? ) BNE 53$ ;IF NE NO, SKIP POOL TRACKING;+; ** W A R N I N G **L;; SPM HOOKPOINT NUMBER 74.;F+; DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM;--$SPH74==. ;SPM CHANGES THE INSTRUCTION AT! ;THE LOCATION OF THIS LABELT, ADD R1,@#$PRISZ ;COUNT SIZE IN POOL TOTAL 53$: ;G .ENDC ; DF P$$CTL/ MOV R0,-(SP) ;CALCULATE ADDRESS OF NEW BLOCKB ADD R1,(SP) ;C .IF DF R$$DER) BCS 110$ ;IF CS, ILLEGAL DEALLOCATION$5 CMP 2(SP),#$CRAVL ;DEALLOCATION IN EXECUTIVE POOL?I BNE 55$ ;IF NE NO 4 CMP R0,#$POOL ;DEALLOCATION BEFORE FRONT OF LIST? BLO 120$ ;IF LOW, YESE2 CMP (SP),$EXSIZ ;DEALLOCATION PAST END OF POOL? BHI 130$ ;IF HIGH, YES55$: ;REFERENCE LABEL .IFTF( CMP R3,(SP)+ ;EQUAL TO NEXT IN CHAIN? .IFT) BLO 90$ ;IF LO, DEALLOCATION OVERLAPSC .IFTF BNE 60$ ;IF NE NO,3 MOV (R3)+,(R0) ;MOVE LINK WORD TO BLOCK RELEASEDC! ADD (R3),R1 ;MERGE TWO BLOCKSS360$: MOV R2,-(SP) ;SAVE ADDRESS OF PREVIOUS BLOCK5' MOV R0,(R2)+ ;ASSUME NO AGLOMERATIONA1 ADD (R2),(SP) ;CALCULATE ADDRESS OF NEXT BLOCKE/ CMP R0,(SP)+ ;EQUAL TO BLOCK BEING RELEASED?P .IFT1  BHIS 65$ ;IF HIS, NO OVERLAP9 CMP (SP),#$CRAVL ;DEALLOCATION IN EXECUTIVE CORE POOL?I2 BEQ 100$ ;IF EQ YES (ELSE NOT SURE OF OVERLAP)65$: ;REF LABEL .ENDC00jrarmmmffDATA BNE 70$ ;IF NE NO! ADD (R2),R1 ;MERGE TWO BLOCKSB3 MOV (R0),-(R2) ;MOVE LINK WORD TO PREVIOUS BLOCK' MOV R2,R0 ;SET NEW ADDRESS OF BLOCKU/70$: MOV R1,2(R0) ;SET SIZE OF BLOCK RELEASEDA .IF DF P$$CTL3 CMP #$CRAVL,(SP)+ ;ALLOCATION IN EXEC CORE POOL? / BNE 80$ ;IF NE NO, SKIP DEALLOCATION CHECKS 4 CMP $PRISZ,$PRIHL ;DID WE CROSS UPPER POOL LIMIT? BLOS 80$ ;IF LOS NOO: MOV #PC.HIH!,R2 ;SET UP HIGH POOL CONDITION) BR $PLTRQ ;REQUEST POOL RECOVERY TASKE .IFFN .IF DF R$$DER& TST (SP)+ ;POP ADDRESS OF LISTHEAD .ENDC0$PLTRQ:: ;MAKE SURE $PLTRQ IS ALWAYS DEFINED .ENDC80$: RETURN ;O .IF DF R$$DER&90$: TST R3 ;INSERT AT END OF LIST? BEQ 60$ ;IF EQ YES, OK7100$: BGCK$A BF.POL,BE.DDA,FATAL ;DOUBLE DEALLOCATION$9110$: BGCK$A BF.POL,BE.SIZ,FATAL ;SIZE OF BLOCK INVALID;@120$: BGCK$A BF.POL,BE.BAK,FATAL ;DEALLOCATED BLOCK BELOW POOL8130$: BGCK$A BF.POL,BE.POV,FATAL ;OVERLAPS END OF POOL .ENDC  .DSABL LSBT;+'; **-$PLTRQ-REQUEST POOL MONITOR TASK;T=; THIS ROUTINE IS USED TO REQUEST THE EXECUTION OF THE POOLE; MONITOR TASK, IF INSTALLED. THE FORMAT OF THE POOL TASK/EXECUTIVEN&; COMMUNICATIONS WORD IS AS FOLLOWS:;$<; $POLST CONTAINS CONDITION BITS INDICATING THE CUMULATIVE8; HISTORY OF THE POOL'S CONDITION SINCE THE LAST TIME8; THAT THE POOL MONITOR TASK CLEARED THEM. THESE BITS6; ARE SET BY THIS ROUTINE AND MAY BE CLEARED BY THE7; POOL MONITOR TASK. NOTE THAT MORE THAN ONE BIT MAY$); BE SET IN THIS BYTE AT ANY ONE TIME. B; $POLST+1 CONTAINS INHIBIT BITS INDICATING WHAT POOL CONDITIONS;; THE POOL MONITOR TASK IS CURRENTLY AWARE OF. A BIT SETN<; IN THIS BYTE INDICATES TO THIS ROUTINE A POOL CONDITION8; THAT DOES NOT REQUIRE EXECUTION OF THE POOL MONITOR9; TASK. THESE BITS ARE ONLY MODIFIED BY THE POOL TASK.H7; GENERALLY, THERE IS NEVER MORE THAN ONE BIT SET INT!; THIS BYTE AT ANY GIVEN TIME. ;E?; THE CALLER OF THIS ROUTINE PROVIDES A BIT MASK INDICATING ABC; POOL CONDITION THAT IT WISHES TO MAKE KNOWN TO THE POOL MONITORIF; TASK. THE GENERAL FORM OF THIS BIT MASK IS #>,C ; WHERE 'XXX' DENOTES WHICH OF THE EIGHT POTENTIAL CONDITIONS THE B ; USER WISHES TO MAKE KNOWN TO THE POOL MONITOR TASK (BY STORINGD ; THE PC.XXX BIT IN THE LOW BYTE OF $POLST). THE FOLLOWING ACTIONS ; CAN OCCUR: ;S?; 1) IF THE SPECIFIED LOW BYTE MASK BIT IS ALREADY SET IN THEEA; LOW BYTE OF $POLST, THEN THIS INDICATES THAT THIS ROUTINE HASTA; BEEN CALLED MULTIPLE TIMES FOR THE SAME POOL CONDITION BEFORE @; THE POOL TASK COULD EXECUTE AND CLEAR THE BIT. IN THIS CASE,; THE ROUTINE RETURNS.; ?; 2) IF THE BIT IS NOT ALREADY SET IN THE LOW BYTE OF $POLST,S@; THEN THIS INDICATES THAT THE POOL PROGRAM MIGHT NOT BE AWARE@; OF THIS POOL CONDITION AND A SECOND CHECK MUST BE MADE USING@; THE HIGH BYTE OF $POLST. IF THE SPECIFIED HIGH BYTE MASK BIT:; IS ALREADY SET IN THE HIGH BYTE, THEN THE POOL TASK ISB; CURRENTLY AWARE OF THE CONDITION AND DOES NOT WISH TO EXECUTE.C; IF THE BIT IS NOT SET IN THE HIGH BYTE, THEN THE POOL CONDITION ?; IS A NEW ONE AND THE POOL MONITOR TASK IS REQUESTED TO RUN. ;SI; THIS INTERFACE IS FLEXIBLE ENOUGH TO ALLOW OTHER INTERFACE PROTOCOLS:T;OA; - ONE INHIBIT BIT ($POLST+1) COULD BE DEFINED TO 'COVER' MOREN? ; THAN ONE CONDITION BIT ($POLST+0). FOR INSTANCE, $PLTRQ CANPB!; BE CALLED WITH R2=403, WHERE THERE ARE TWO CONDITION BITS SET,0"; BUT ONLY ONE INHIBIT BIT SPECIFIED FOR BOTH.#;N?$; - THERE NEED NOT BE A MIRROR-IMAGE RELATIONSHIP BETWEEN THEH?%; INHIBIT BITS AND THE CONDITION BITS. FOR VARYING CONDITIONS B&; AND STATES, VARIOUS COMBINATIONS OF THESE BITS CAN BE ENCODED.';EA(; - NO INHIBIT BIT NEED BE SPECIFIED AT ALL. IN THIS CASE, EVEN B); IF THE POOL MONITOR TASK HAD SET THE CORRESPONDING INHIBIT BIT?*; IN $POLST+1 FOR THE CONDITION ABOUT TO BE REPORTED, LEAVINGHA+; 00jrrnccccTHE HIGH BYTE OF R2 CLEAR WILL FORCE THE POOL MONITOR TASK TOI:,; EXECUTE FOR THAT CONDITION REPORTED IN THE LOW BYTE OF?-; R2 (UNLESS, OF COURSE, THAT BIT IS ALREADY SET IN $POLST+0,T>.; INDICATING A MULTIPLE REQUEST). FOR INSTANCE, IF $PLTRQ IS>/; CALLED WITH R2=1, THE POOL TASK MAY EXECUTE AND SET $POLST=0; TO 400, THE INHIBIT BIT FOR POOL CONDITION '1'. IF $PLTRQF?1; WERE THEN CALLED AGAIN WITH R2=1, THE POOL TASK WOULD AGAIN @2; BE CALLED BECAUSE R2 DID NOT HAVE THE INHIBIT BIT SPECIFIED.:3; THIS OPERATION FORCES THE POOL TASK TO RESPOND ANYWAY.4;E5; THE REASON FOR SUCH FLEXIBILITY IS TO GENERALIZE THE INTERFACE TOSH6; BE USEFUL FOR A VARIETY OF CHORES. THE INTERFACE NEED NOT BE LIMITED7; TO POOL STATUS REPORTING.$8; 9; INPUTS:D:; >;; R2=POOL CONDITION BIT MASK (PC.XXX OR'ED WITH PC.XXX*400).<;I =; OUTPUTS:>;I=?; IF NO BITS IN THE LOW BYTE OF R2 ARE SET IN $POLST AND NO =@; BITS IN THE HIGH BYTE OF R2 ARE SET IN $POLST+1, THEN THEH:A; POOL TASK IS REQUESTED WITH THE REASON FOR THE REQUESTAB; (PC.XXX) STORED IN THE LOW BYTE OF $POLST. OTHERWISE, RETURN. C; D; R0,R1 AND R3 ARE PRESERVED. E;-FG .IF DF P$$CTLH I .ENABL LSBE?J$PLTRQ::BITB R2,$POLST ;ALREADY REQUESTED FOR THIS CONDITION?N/K BNE 20$ ;IF NE YES, AVOID MULTIPLE REQUESTSX2L BISB R2,$POLST ;INDICATE CURRENT POOL CONDITION)M CLRB R2 ;CHECK POOL TASK INHIBIT BITSS7N BIT R2,$POLST ;REQUEST POOL TASK FOR THIS CONDITION? 3O BNE 20$ ;IF NE NO, TASK AWARE OF POOL CONDITIONDP MOV R0,-(SP) ;SAVE R0.Q MOV $PTTCB,R0 ;POOL MONITOR TASK INSTALLED?'R BEQ 10$ ;IF EQ NO, CAN'T REQUEST ITRS MOV R1,-(SP) ;SAVE R1T MOV R3,-(SP) ;SAVE R3.U CALL $EXRQN ;REQUEST THE POOL MONITOR TASKV MOV (SP)+,R3 ;RESTORE R3NW MOV (SP)+,R1 ;RESTORE R1YX10$: MOV (SP)+,R0 ;RESTORE R0BY20$: RETURN ;C Z .DSABL LSBL[\ .ENDC ; DF P$$CTL]^;+6_; **-$ALSEC-ALLOCATE CORE BUFFER FROM SECONDARY POOLI_; **-$ALSC1-ALLOCATE 32 WORD BLOCKS OF POOL - ALTERNATE ENTRY ;PKW118_; ;PKW118`;La; THIS ROUTINE IS CALLED TO ALLOCATE A BLOCK FROM THE SECONDARY POOL. THECb; ALLOCATION ALGORITHM IS FIRST FIT (SAME AS $ALOCB). BLOCKS ARE Lc; ALLOCATED IN UNITS OF 32 WORDS, AND A BLOCK WILL ALWAYS START ON A 32 WD,d; BOUNDRY TO FACILITATE MAPPING THE BLOCK.e;R f; INPUTS:Tg; 7h; R1=SIZE OF THE BUFFER TO ALLOCATE IN 32 WORD BLOCKS=h; R2=ADDRESS OF POOL LISTHEAD IF ENTRY AT $ALSC1 ;PKW118Li;L j; OUTPUTS:k;K?l; C=1 IF INSUFFICIENT CORE IS AVAILABLE TO ALLOCATE THE BLOCK m; R0=-1Un;I(o; C=0 IF THE ALLOCATION WAS SUCCESSFUL0p; R0=ADDRESS OF BLOCK (TO BE USED IN AN APR)4q; R1=SIZE OF BLOCK JUST ALLOCATED IN 32 WD UNITSr;S$s; R3, R4, R5 PRESERVED ACROSS CALLt; u;-v w$ALSEC::xyz .IF DF P$$OOL{O{ .IIF DF C$$SC1 MOV #$POLHD,R2 ;PUT $POLHD WHERE ROUTINE LOOKS FOR IT ;PKW118B{$ALSC1:: ;PKW118{ ;PKW118A | .ENABL LSBW}~ SAVNR ;SAVE R4, R5K~ ;PKW118I8~ .IF DF C$$SC1 ;IF ALTERNATE SECONDARY POOL ;PKW118~ ;PKW118E$~ MOV R3,-(SP) ;AND R3 ;PKW118+~ MOV R2,R3 ;MOVE THE LISTHEAD ;PKW118 ~ ;PKW118 ~ .ENDC ;C$$SC1 ;PKW118~ ;PKW118D, MOV #-1,R0 ;ASSUME REQUESTED LENGTH IS 05 MOV #KISAR6,R4 ;POINT TO APR USED FOR POOL MAPPING,' MOV (R4),-(SP) ;SAVE CURRENT MAPPING 7 MOV #140000,R2 ;VIRTUAL ADDRESS OF MAPPED POOL BLOCKA2 CLR R5 ;PREVIOUS BLOCK IN LIST IS THE LISTHEAD TST R1 ;IS LENGTH ZERO?$ SEC ;ASSUME IT IS BEQ 50$ ;IF EQ YES ;PKW118G .IIF DF C$$SC1 MOV (R3),(R4) ;MAP FIRST FREE BLOCK IN POOL ;PKW118PI .IIF NDF C$$SC1 MOV $POLHD,(R4) ;MAP FIRST FREE BLOCK IN POOL ;PKW118  ;PKW118R BR 20$ ;**-1310$: MOV (R4),R5 ;SAVE CURRENT BLOCK AS PREVIOUSO# MOV (R2),(R4) ;MAP TO NEXT BLOCKU#20$: BEQ 50$ ;IF EQ, END OF LISTR% CMP 2(R2),R1 ;IS BLOCK BIG ENOUGH?C BLO 10$ ;IF LO NOI! BEQ 30$ ;IF EQ YES, EXACT FIT;0 MOV (R200jrarmmmffDATA)+,-(SP) ;SAVE LINK TO NEXT POOL BLOCK MOV (R2),-(SP) ;SAVE SIZE) SUB R1,(SP) ;CALCULATE REMAINING SIZEA2 ADD R1,(R4) ;MAP TO REMAINING PORTION OF BLOCK: MOV (SP)+,(R2) ;GET REMAINING SIZE OF UNALLOCATED BLOCK, MOV (SP),-(R2) ;INSERT LINK TO NEXT BLOCK' MOV (R4),(SP) ;SAVE ADDRESS OF BLOCK 2 SUB R1,(R4) ;MAP BACK TO BLOCK TO BE ALLOCATED, MOV (SP)+,(R2) ;SAVE POINTER TO NEW BLOCK/30$: MOV (R4),R0 ;ADDRESS OF ALLOCATED BLOCKO ;PKW118  .IFDF C$$SC1 ;PKW118 ;PKW118N4 CMP R3,#$POLHD ;IS THIS SECONDARY POOL? ;PKW1186 BNE 35$ ;NO, LEAVE TOTAL FREE SPACE ALONE ;PKW118 ;PKW118  .ENDC ;C$$SC1 ;PKW118R ;PKW118L; SUB R1,$SECFR ;SUBTRACT AMOUNT ALLOCATED FROM TOTAL FREE?35$: MOV (R2),-(SP) ;GET ADDRESS OF NEXT FREE BLOCK ;PKW118 / MOV R5,(R4) ;MAP TO PREVIOUS BLOCK ;**-1 2 BEQ 40$ ;IF EQ, PREVIOUS BLOCK IS THE LISTHEAD+ MOV (SP)+,(R2) ;UNLINK ALLOCATED SECTION.  BR 50$ 40$: ;PKW118 E .IIF DF C$$SC1 MOV (SP)+,(R3) ;UNLINK ALLOCATED SECTION ;PKW118EF .IIF NDF C$$SC1 MOV (SP)+,$POLHD ;UNLINK ALLOCATED SECTION ;PKW118 ;PKW118 =50$: MOV (SP)+,(R4) ;RESTORE ORIGINAL KISAR6 MAPPING ;**-1OG .IIF DF C$$SC1 MOV (SP)+,R3 ;RESTORE ORIGINAL CONTENTS OF R3 ;PKW118T 60$: RETURNP;+H; **-$ALSPK-ALLOCATE A RECEIVE BY REFERENCE PACKET FROM SECONDARY POOL7; **-$ALVPK-ALLOCATE A PACKET FROM THE SECONDARY POOLA;E>; THIS ROUTINE IS CALLED TO ALLOCATE A SECONDARY POOL BLOCK.'; THE PACKET IS MAPPED THROUGH APR 5.N;W ; INPUTS: ;$4; R1=SIZE OF BLOCK IN UNITS OF 32. WORDS ($ALVPK).; ; OUTPUTS:;&; C=0 IF A BLOCK HAS BEEN ALLOCATED.3; R0=120000 (THE PACKET IS MAPPED THROUGH APR5).3(; KISAR5 IS SET UP TO MAP THE PACKET.@; C=1 IF INSUFFICIENT CORE IS AVAILABLE TO ALLOCATE THE BLOCK.+; DIRECTIVE STATUS OF D.RS1 IS RETURNED.L;L;-7$ALSPK::MOV #/100,R1 ;GET SIZE TO ALLOCATE ($ALVBK::CALL $ALSEC ;ALLOCATE A BLOCK% BCS 65$ ;IF CS ALLOCATION FAILURE5- MOV R0,KISAR5 ;MAP THE PACKET THROUGH APR5O4 MOV #120000,R0 ;POINT TO FIRST WORD OF THE PACKET RETURN ;RETURN WITH C=0'65$: DRSTS D.RS1 ;ALLOCATION FAILUREK;+F; **-$DESPK-DEALLOCATE RECEIVE BY REFERENCE PACKET TO SECONDARY POOL;FF; THIS ROUTINE IS CALLED TO DEALLOCATE A RECEIVE BY REFERENCE PACKET; TO THE SECONDARY POOL.;- ; INPUTS:K; =; R0=ADDRESS OF PACKET TO BE DEALLOCATED. THIS MUST BE THEE>; APR VALUE TO MAP THE FIRST 32. WORD SEGMENT OF THE BLOCK.;R ; OUTPUTS:;A ; NONE.H;O;- .IFTF $DESPK:: .IFTA2 MOV #/100,R1 ;GET SIZE TO DEALLOCATE;+5; **-$DESEC-DEALLOCATE CORE BLOCK IN SECONDARY POOLBG; **-$DESC1-DEALLOCATE 32-WORD CORE BLOCK INTO PRIVATE POOL ;PKW118 ;OJ; THIS ROUTINE IS CALLED TO DEALLOCATE A SECONDARY POOL BLOCK. THE BLOCKJ; IS INSERTED INTO THE FREE BLOCK CHAIN BY CORE ADDRESS. IF AN ADJACENT<; BLOCK IS CURRENTLY FREE, THEN THE TWO BLOCKS ARE MERGED.; ; INPUTS:T;A; R0=ADDRESS OF CORE BLOCK TO BE DEALLOCATED. THIS MUST BE THEF<; APR VALUE TO MAP THE FIRST 32 WORD SEGMENT OF THE BLOCK.; R1=SIZE OF THE BLOCK IN UNITS OF 32 WORDS.=; R2=ADDRESS OF POOL LISTHEAD IF ENTRY AT $DESC1 ;PKW118O;A ; OUTPUTS:;@; THE CORE BLOCK IS MERGED INTO THE FREE CORE CHAIN BY ADDRESS4; AND MERGED WITH ANY BORDERING BLOCKS IF POSSIBLE;Y; R3, R4, R5 PRESERVED;;- .IFTF $DESEC::I .IIF DF C$$SC1 MOV #$POLHD,R2 ;PUT $POLHD ADDRESS WHERE NEEDED ;PKW118B$DESC1:: ;PKW118 .IFTF TST R1 ;IS LENGTH ZERO BEQ 140$ ;IF EQ YESB SAVNR ;SAVE R4, R5B MOV R3,-(SP) ;SAVE R3F .IIF DF C$$SC1 MOV R2,-(SP) ;PUT THE LISTHEAD ON THE STACK ;PKW118 .IF NDF X$$SEC 8 .IF DF C$$SC1 ;IF ALTERNATE SECONDARY POOL ;PKW118 ;PKW118N; CMP (SP),#$POLHD ;IS THIS REAL SECONDARY POOL? 00jrrncccc ;PKW118D> BNE 69$ ;NO, DON'T CHECK FOR IT BEING IN PARTITION ;PKW118 ;PKW118L .ENDC ;C$$SC1 ;PKW118 ;PKW118K" MOV $PLPAR,R3 ;LOCATE PARTITION- MOV P.REL(R3),R4 ;GET ITS STARTING ADDRESSV, CMP R4,R0 ;DOES BLOCK START IN PARTITION BHI 160$ ;IF HIGH, NOS2 ADD P.SIZE(R3),R4 ;GET TOP ADDRESS IN PARTITION .IFTF' ADD R1,R0 ;GET TOP ADDRESS OF BLOCKR- BCS 150$ ;CS- OVERFLOW....BAD DEALLOC LEN( .IFTI*  CMP R4,R0 ;DOES BLOCK END IN PARTITION  BLO 170$ ;IF LOW, NO   .ENDC , SUB R1,R0 ;RESTORE BASE ADDRESS OF BLOCK ;PKW118R69$: .IIF DF C$$SC1 MOV @(SP),R3 ;GET THE ADDRESS OF THE FIRST FREE BLOCK;PKW118P .IIF NDF C$$SC1 MOV $POLHD,R3 ;GET THE ADDRESS OF THE FIRST FREE BLOCK;PKW118 ;PKW118P/ MOV #140000,R4 ;GET VIRTUAL ADDRESS OF BLOCK, MOV #KISAR6,R5 ;POINT TO MAPPING REGISTER' MOV (R5),-(SP) ;SAVE CURRENT MAPPING 5 CLR -(SP) ;WORD FOR STORING TOP OF PREVIOUS BLOCKC3 CLR R2 ;INITIAL PREV. BLOCK IN LIST IS LISTHEAD.170$: MOV R3,(R5) ;MAP NEXT FREE BLOCK ;**-1O BEQ 95$ ;IF EQ, END OF LIST.1 CMP R0,R3 ;DOES BLOCK GO BEFORE CURRENT BLOCKF BLO 80$ ;IF LO YES  BEQ 180$$- MOV R3,(SP) ;GET ADDRESS OF CURRENT BLOCKT, ADD 2(R4),(SP) ;CALCULATE ITS TOP ADDRESS2 MOV R3,R2 ;STORE ADDRESS AS THE PREVIOUS BLOCK1 MOV (R4),R3 ;POINT TO NEXT BLOCK IN FREE LIST,  BR 70$ ;780$: ADD R1,R0 ;GET TOP ADDRESS IN DEALLOCATED BLOCKE5  CMP R0,R3 ;CAN IT BE COMBINED WITH THE NEXT BLOCKS! BNE 90$ ;IF NE NOR0" MOV (R4)+,-(SP) ;SAVE LINK TO NEXT FREE BLOCK# MOV (R4),-(SP) ;SAVE LENGTH4$ SUB R1,R0 ;FIND START OF BLOCK BEING DEALLOCATED% MOV R0,(R5) ;MAP IT$.& MOV R1,(R4) ;INSERT TO LENGTH OF THE BLOCK+' ADD (SP)+,(R4) ;ADD LENGTH OF NEXT BLOCKS+( MOV (SP)+,-(R4) ;LINK TO NEXT FREE BLOCKS ) BR 100$:*90$: BHI 180$ ;IF HIGH, DEALLOCATED BLOCK OVERLAPS NEXT4+ SUB R1,R0 ;GET BASE ADDRESS OF DEALLOCATED BLOCK0,95$: MOV R0,(R5) ;MAP BLOCK BEING DEALLOCATED7- MOV R3,(R4) ;INSERT LINK TO NEXT BLOCK IN FREE LISTA. MOV R1,2(R4) ;INSERT LENGTH=/100$: CMP (SP)+,R0 ;CAN BLOCK BE MERGED WITH PREVIOUS BLOCKB0 BNE 110$ ;IF NE NO01 MOV (R4)+,-(SP) ;SAVE LINK TO NEXT FREE BLOCK2 MOV (R4),-(SP) ;AND LENGTH(03 MOV R2,(R5) ;MAP PREVIOUS BLOCK IN FREE LIST64 ADD (SP)+,(R4) ;ADD LENGTH TO WHAT IS ALREADY THERE&5 MOV (SP)+,-(R4) ;LINK TO NEXT BLOCK 6 BR 130$77110$: BHI 180$ ;IF HI, BLOCK OVERLAPS PREVIOUS BLOCKR#8 MOV R2,(R5) ;MAP PREVIOUS BLOCK.9 BNE 120$ ;IF NE, THERE IS A PREVIOUS BLOCK9 ;PKW118(O9 .IIF DF C$$SC1 MOV 2(SP),R4 ;USE THE LIST HEAD AS THE PREVIOUS BLOCK;PKW118BQ9 .IIF NDF C$$SC1 MOV #$POLHD,R4 ;USE THE LIST HEAD AS THE PREVIOUS BLOCK;PKW118(9 ;PKW118(C;120$: MOV R0,(R4) ;LINK BLOCK BEING DEALLOCATED INTO CHAIN ;**-1 ;130$: ;PKW118; .IF DF C$$SC1 ;PKW118I; ;PKW118BE; CMP 2(SP),#$POLHD ;WAS THIS A SECONDARY POOL DEALLOCATION? ;PKW118V*; BNE 135$ ;NO, JUST CONTINUE ;PKW118; ;PKW118R; .ENDC ;C$$SC1 ;PKW118(; ;PKW118M?; ADD R1,$SECFR ;ADD AMOUNT DEALLOCATED TO TOTAL FREE ;PKW118.:;135$: MOV (SP)+,(R5) ;RESTORE ORIGINAL MAPPING ;PKW118:; .IIF DF C$$SC1 TST (SP)+ ;POP $POLHD ADDRESS ;PKW118%= MOV (SP)+,R3 ;RESTORE R3 ;**-1H?140$: RETURN ;**-19@150$: BGCK$A BF.POL,BE.SIZ,FATAL ;SIZE OF BLOCK INVALID1@A160$: BGCK$A BF.POL,BE.BAK,FATAL ;DEALLOCATED BLOCK BELOW POOL8B170$: BGCK$A BF.POL,BE.POV,FATAL ;OVERLAPS END OF POOL7C180$: BGCK$A BF.POL,BE.DDA,FATAL ;DOUBLE DEALLOCATION D E .DSABL LSBAFG .ENDCHIJK .ENDD TO TOTAL FREE ;PKW118.:;135$: MOV (SP)+,(R5) ;RESTORE ORIGINAL MAPPING ;PKW118:; .IIF DF C$$SC1 TST (SP)+ ;POP $POLHD ADDRESS ;PKW118%= MOV (SP)+,R3 ;RESTORE R3 ;**-1H?140$: RETURN ;**-19@150$: BGCK$A BF.POL,BE.SIZ,FATAL ;SIZE OF BLOCK INVALID1@A160$: BGCK$A BF.POL,BE.BAK,FATAL ;DEALLOCATED BLOCK BELOW POOL00krarmmmffDATA .TITLE DRSCAS .IDENT /02.10/N ;,; COPYRIGHT (C) 1974, 1978, 1979, 1980, 1981/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.I;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDO9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.E;4; T. J. MILLER 23-OCT-77;O); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:$;G; B. S. MCCARTHY F;L;E; MODIFIED BY:;O; J. M. LAWLER 29-JUN-83 02.09;F0; JL162 -- CONDITIONALIZE DRSMP,DRMVS ON S$$MAP;A ; B. S. MCCARTHY 20-MAR-83 02.10;S5; BM295 -- REMOVE REFERENCES TO $HEADR TO STREAMLINE ; PROCESSING; ; SUPERVISOR MODE.;R; LOCAL MACRO DEFINITIONS;H S W .IF DF S$$LIB D .MCALL ABODF$,HWDDF$L" ABODF$ ;DEFINE TASK ABORT CODES& HWDDF$ ;DEFINE HARDWARE DEFINITIONS .;+; **-$DRSCA-SUPERVISOR CALLI;FG; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CALL TO CALL A SUPERVISOR MODEDE; SUBROUTINE AT THE SPECIFIED SUPERVISOR I SPACE VIRTUAL ADDRESS WITHE+; THE SPECIFIED COMPLETION ROUTINE ADDRESS.2;A ; DPB FORMAT:;B#; WD. 00 -- DIC(155.),DPB SIZE(3.).O2; WD. 01 -- ADDRESS OF SUPERVISOR ROUTINE TO CALL.5; WD. 02 -- ADDRESS OF SUPERVISOR COMPLETION ROUTINE.$;B ; INPUTS:L;B9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. 2; R3=ADDRESS OF SUPERVISOR ROUTINE TO CALL IN DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.E,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R ; OUTPUTS:;P=; THE SPECIFIED ROUTINE IS CALLED IN SUPERVISOR MODE WITH THEE5; COMPLETION ROUTINE SET UP. CONDITION CODE AND DSW:; RETURNS ARE RESERVED FOR THE SUPERVISOR ROUTINE ITSELF.;P;; (IF THERE IS INSUFFICIENT SPACE ON THE TASK STACK FOR THEO9; SUPERVISOR RETURN SETUP, THE ISSUING TASK IS ABORTED.) ;-0$DRSCA::MFPI SP ;RETRIEVE CURRENT STACK POINTER2 ADD $BTRMV,(SP) ;REMOVE BYTES FROM DIRECTIVE CALL) MOV (SP),R2 ;SAVE COPY OF STACK POINTERD) MTPI SP ;RESTORE MODIFIED STACK POINTER . CLR $BTRMV ;PREVENT DIRECTIVE DISPATCHER MOD2 TSTB $SUPFL ;ISSUING TASK LINKED TO SUPER MODE ?* BEQ 30$ ;IF EQ NO, DON'T ALLOW DIRECTIVE( CALL $SGFIN ;SET TO SET CARRY ON TRAPS4 MOV 2(R3),-(SP) ;PUSH SUPERVISOR COMPLETION ADDRESS MOV #$UMPC,R1 ;POINT TO TRAP PC MOV (R1)+,-(SP) ;SAVE TRAP PC MOV (R1),-(SP) ;SAVE TRAP PSS@ MOV #CSMODE!PMODE,(R1) ;SET FOR SUPERVISOR RETURN PS (PREV=USR)3 BIC #17,(SP) ;CLEAR ALL CONDITION CODES IN PS WORDC' BMI 10$ ;IF MI PREVIOUS MODE WAS USERT? BIC #^CPSMODE&PMODE,(R1) ;ELSE SET PREVIOUS MODE TO SUPERVISORT10$: CLC ;INIT C-BIT TO 0D7 MOV (R3)+,-(R1) ;SET SUPERVISOR RETURN PC FROM THE DPBI, MFPI #0 ;ATTEMPT TO FETCH LOCATION ZERO IN ;SUPERVISOR LIBRARYP, BCS 13$ ;IF CS NO LOCATION ZERO, CERTAINLY ;ISN'T NEW INTERFACE4 CMP (SP)+,(PC)+ ;IS LOCATION ZERO A CMP (SP)+,(SP)+7 CMP (SP)+,(SP)+ ;(IF IT IS THIS IS A VERSION 2 LIBRARYE) ;SINCE IT HAS THE ODT TRANSFER VECTORC- BEQ 15$ ;IF EQ HANDLE LINKAGE TO V2 LIBRARYE,13$: CLC ;CLEAR CARRY AND START V1 LINKAGE4 MTPD -(R2) ;PUSH TRAP PS ON SUPER STACK (MAY TRAP)4 MTPD -(R2) ;PUSH TRAP PC ON SUPER STACK (MAY TRAP)4 MTPD -(R2) ;PUSH COMPLETION ADDRESS ON SUPER STACK- BCS 20$ ;IF CS TRAP ON SUPERVISOR STACK REFN BR 17$ ;FINISH IN COMMON CODEI!15$: CLC ;CLEAR CARRY INITIALLY+3 MOV 4(SP),-(SP) ;COPY PREVIOUS MODE RETURN ADDRESS+( MTPD -(R2) ;PUT IT ON SUPERVISOR STACK4 MOV (SP),-(SP) ;WE NEED A PLACEHOLDER, MUST BE MOVE ;TO NOT AFFECT C BIT# MTPD -(R2) ;ONTO SUPERVISOR STACKN) MTPD -(R2) ;COPY PS TO SUPERVISOR STACK 1 MOV (SP),(SP)+ ;DISCARD RETURN PC, LEAVE C ALONEA- MTPD -(R2) ;PUSH COMPLETION ROUTINE ADDRESSU. BCS 20$ ;IF CS TRAP ON SUPER STACK REFERENCE417$: MOV R2,-(SP) ;PUSH NEW SUPERVISOR STACK POINTER* MTPI SP ;UPDATE SUPERVISOR STACK POINTER RETURN ;V,20$: MOV #S.CAST,R0 ;SET FOR BAD STACK ABORT" CALLR $ABCTK ;ABORT ISSUING TASK730$: DRSTS D.RS8 ;ERROR - INCONSISTENT WITH TASK STATE  E .ENDC;+%; **-$DRSMP-MODIFY SUPERVISOR MAPPINGR;O<; THIS DIRECTIVE ALLOWS A USER TASK TO MODIFY THE MAPPING OF; SUPERVISOR DATA SPACE.;E ; DPB FORMAT:M00krrncccc; "; WD. 00 -- DIC(201.),DPB SIZE(2.);; WD. 01 -- NEW SUPERVISOR MAPPING PARAMETER MASK. THE MASKV5; IS CODED IN BITS 8.-14. OF THE WORD, WITH BIT 8. 6; CORRESPONDING TO APR1, ETC. IF A BIT IS SET TO 0,3; THEN THE CORRESPONDING APR IS MAPPED TO USER D;3; SPACE. IF ONE, THEN THE APR IS MAPPED TO SUPERI5; I SPACE. APR 0 IS ALWAYS MAPPED TO USER D SPACE.I.; IF BIT 15 IS SET, THE MAPPING MASK IS NOT); CHANGED, BUT THE STATUS IS RETURNED. ;E ; INPUTS: ;C*; R4=ADDRESS OF HEADER OF THE CURRENT TASK;. ; OUTPUTS:;>; THE SUPERVISOR MAPPING MASK (H.SMAP) IS SET AND THE APRS ARE;; UPDATED. THE DSW IS RETURNED WITH BITS 0-7 BEING THE HIGHR;; BYTE OF THE PSW (AT TIME OF DIRECTIVE ISSUANCE), AND BITS <; 8.-14. BEING THE OLD MAPPING MASK. BIT 15. IS ALWAYS ZERO.<; IN SYSTEMS WHICH DO NOT SUPPORT SUPERVISOR MODE LIBRARIES,+; THE HIGH BYTE IS ALWAYS RETURNED AS ZERO.E;- .IF DF, S$$MAP=$DRSMP::MOVB $STACK-1,2(SP) ;SET LOW BYTE OF DIRECTIVE STATUSC .IF DF S$$LIB9 MOVB H.SMAP(R4),3(SP) ;SET HIGH BYTE OF DIRECTIVE STATUSS( MOV (R3),R0 ;GET NEW MAPPING PARAMETER+ BMI 10$ ;IF MI INFORMATION ONLY DIRECTIVEI/ SWAB R0 ;PUT SUPER MAP WHERE WE CAN GET AT ITE2 MOVB R0,H.SMAP(R4) ;RESET SUPERVISOR MAPPING MASK. TSTB $SUPFL ;TASK USING SUPERVISOR WINDOWS ? BEQ 10$ ;IF EQ NOO% CALLR $LSUP1 ;RESET SUPER MODE APRS 10$: ;REFERENCE LABEL .ENDC ; DF S$$LIB) RETURN ;RETURN TO DIRECTIVE DISPATCHER(;+,; **-$DRMVS-MOVE TO/FROM VARIOUS TASK SPACES;@; THIS DIRECTIVE ALLOWS A USER TASK TO READ/WRITE DATA (ONE WORD>; AT A TIME), INTO ITS SUPER/USER I/D SPACES. THE DIRECTIVE ISE; INTENDED FOR USE BY COMPONENTS SUCH AS DEBUGGERS, WHERE EASE OF USEM8; OF THE DIRECTIVE OVERRIDES PERFORMANCE CONSIDERATIONS.;L ; DPB FORMAT:U;V"; WD 00. -- DIC(203.),DPB SIZE(4.)*; WD 01. -- CONTROL FLAGS WORD. FLAGS ARE:*; BIT 0 - IF ZERO, TARGET SPACE IS USER$; IF ONE, TARGET SPACE IS SUPER*; BIT 1 - IF ZERO, TARGET SPACE IS INST#; IF ONE, TARGET SPACE IS DATAI,; BIT 2 - IF ZERO, DIRECTION IS MOVE FROM#; IF ONE, DIRECTION IS MOVE TOE.; WD 02. -- ADDRESS OF SOURCE/DESTINATION WORD*; WD 03. -- ADDRESS OF BUFFER IF MOVE FROM; VALUE IF MOVE TOR;I ; INPUTS:S;R); R3=ADDRESS OF CONTROL FLAGS WORD IN DPBU;V ; OUTPUTS:;I&; THE DESTINATION OR BUFFER IS UPDATED;L9; A STATUS OF D.RS16 IS RETURNED IF A MOVE TO IS EXECUTED <; FOR A DESTINATION TO WHICH THE ISSUEING TASK DOES NOT HAVE; WRITE ACCESS.I;N<; A STATUS OF D.RS98 IS RETURNED IF THE ADDRESS OR BUFFER IS*; NOT IN THE TASK'S CURRENT ADDRESS SPACE.;-($DRMVS::MOV (R3)+,R5 ;PICK UP FLAGS WORD$ MOV #UINDR0,R0 ;ASSUME USER I-SPACE ASR R5 ;IS IT USER SPACE ? .IF DF S$$LIB BCC 10$ ;IF CC YES1 TSTB $SUPFL ;CURRENT TASK USE SUPERVISOR MODE ?P$ BEQ 30$ ;IF EQ NO, ILLEGAL ADDRESS+ MOV #SISDR0,R0 ;ADJUST TO SUPERVISOR SPACEN10$: ;REFERENCE LABEL .ENDC ; DF S$$LIB ASR R5 ;IS IT I OR D SPACE ? .IF DF U$$DAS!S$$LIBI BCC 20$ ;IF CC I SPACE) ADD #UDSDR0-UINDR0,R0 ;ADJUST TO D SPACEO20$: ;REFERENCE LABEL .ENDC ; DF U$$DAS!S$$LIBO% MOV (R3)+,R4 ;GET ADDRESS OF OPERANDD BIT #1,R4 ;ODD ADDRESS ? BNE 30$ ;IF NE YES MOV R4,R1 ;MAKE A COPY& BIC #17777,R1 ;CLEAR ALL BUT APR BITS SWAB R1 ;MOVE TO LOW HALFD# ASH #-4,R1 ;AND CREATE WORD INDEXD! ADD R1,R0 ;POINT TO CORRECT PDRP( MOV (R0),R2 ;GET PDR CONTENTS FOR TEST% BNE 40$ ;IF NE THERE IS SOME ACCESS *30$: DRSTS D.RS98 ;EXIT WITH ERROR STATUS+40$: MOV R4,R1 ;COPY VIRTUAL ADDRESS AGAIN0# BIC #160000,R1 ;CLEAR OUT APR BITSN BIC #77,R1 ;32 WORD BOUNDARY ASL R1 ;SHIFT TO SAME PLACED ASL R1 ;AS IN PDRT+ BIC #100377,R2 ;CLEAR ALL BUT PLF FROM PDR- CMP R1,R2 ;DESIRED ADDRESS WITHIN MAPPING ? $ BHI 30$ ;IF HI NO, ILLEGAL ADDRESS& MOV (R3),R3 ;SAVE ADDRESS (OR VALUE)5 MOV UINAR0-UINDR0(R0),KISAR6 ;MAP TO DESIRED ADDRESS2+ BIC #160000,R4 ;CLEAR ALL BUT DISPLACEMENTE( BIS #140000,R4 ;COMMUTE ADDRESS TO APR6 ASR R5 ;MOVE FROM OR TO ?0 BCS 50$ ;IF CS IT'00krlrmmmffDATAS MOVE TOR MOV (R4),-(SP) ;GET VALUE MOV #2,R1 ;SET SIZE OF BUFFER * CALL $ACHKP ;ADDRESS CHECK AND MAP BLOCK! MOV (SP)+,(R3) ;RETURN PARAMETER# RETURN ;AND EXITB+50$: BIT #4,(R0) ;WRITE ACCESS TO REGION ?S BNE 55$ ;IF NE YES,ALLOW/ MOV $TKTCB,R5 ;GET TCB ADDRESS OF ISSUING TASK / BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED  BEQ 60$ ;IF EQ NO, DISALLOW#&55$: MOV R3,(R4) ;FILL IN DESTINATION RETURN ;AND EXIT SUCCESSFULLY'60$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONS  .ENDC ; DF S$$MAP M .END,-(SP) ;GET VALUE MOV #2,R1 ;SET SIZE OF BUFFER * CALL $ACHKP ;ADDRESS CHECK AND MAP BLOCK! MOV (SP)+,(R3) ;RETURN PARAMETER# RETURN ;AND EXITB+50$: BIT #4,(R0) ;WRITE ACCESS TO REGION ?S BNE 55$ ;IF NE YES,ALLOW/ MOV $TKTCB,R5 ;GET TCB ADDRESS OF ISSUING TASK / BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED  BEQ 60$ ;IF EQ NO, DISALLOW#&55$: MOV R3,(R4) ;FILL IN DESTINATION RETURN ;AND EXIT SUCCESSFULLY'60$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONS  .ENDC ; .TITLE DRGEF .IDENT /04.01/V E;M,; COPYRIGHT (C) 1974, 1978, 1979, 1980, 1983/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.T; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDO9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; J. E. PROVINO 21-SEP-78B;#+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:B;6; B. S. MCCARTHY L; T. M. MARTIN ,;); MODIFIED BY:;I; J. M. LAWLER 29-JUN-83 04.00;Y:; JL162 -- FINISH CONDITIONALIZATION OF GROUP GLOBAL EFNS;I; J. W. BERZLE 07-SEP-83 04.01;M2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;A;Q; MACRO LIBRARY CALLSY;D .MCALL BGCK$A;++; **-$DRCRE-CREATE GROUP GLOBAL EVENT FLAGSL;EB; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE GROUP GLOBAL EVENTB; FLAGS FOR A SPECIFIED GROUP. IF THE SPECIFIED GROUP MATCHES THEF; TASK'S OWN GROUP, THE EVENT FLAG USE COUNT IS INCREMENTED, EFFECTINGB; A "LOCK" OPERATION FOR THE FLAGS SUCH THAT PREMATURE ELIMINATION8; OF THE FLAGS BY A TASK WHICH SHARES THEM IS PREVENTED.;-D; IF THE EVENT FLAG GROUP ALREADY EXISTS, THE SPECIFIED GROUP IS THEF; SAME AS THE TASK'S OWN GROUP, AND THE EVENT FLAGS ARE UNLOCKED, THIS;; DIRECTIVE WILL LOCK THE EVENT FLAGS FOR THE ISSUING TASK.T;S;E ; DPB FORMAT:U;L#; WD. 00 -- DIC(157.),DPB SIZE(2.).R; WD. 01 -- GROUP NUMBER;M ; INPUTS:;A2; R2=ADDRESS OF SECOND STATUS WORD OF CURRENT TASK ; R3=POINTER TO WD. 1 IN THE DPB/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;V5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)H;P-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.G&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.V5; DIRECTIVE STATUS OF 'D.RS1' IF ALLOCATION FAILURE.U6; DIRECTIVE STATUS OF 'D.RS16' IF NON-PRIVILEGED TASK5; ATTEMPTS TO CREATE EVENT FLAGS FOR ANOTHER GROUP.D;; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF GROUP GLOBALB; EVENT FLAGS ALREADY EXIST.7; DIRECTIVE STATUS OF 'D.RS91' IS RETURNED IF GROUP IST ; INVALID.;- .IF DF, G$$GEFT .ENABL LSBN+$DRCRE::CALL 300$ ;DO FLAGS ALREADY EXIST?S BCC 40$ ;IF CC FOUND MOV R0,-(SP) ;SAVE R05 MOV #G.LGTH,R1 ;GET LENGTH OF GROUP GLOBAL CNTRL BLKI$ MOV R2,R3 ;COPY TASKS GROUP NUMBER6 CALL $ALOCB ;ALLOCATE A BLOCK FOR GROUP GLOBAL FLAGS# BCS 70$ ;IF CS ALLOCATION FAILUREF5 MOV @(SP),(R0) ;POINT NEW BLOCK TO REMAINDER OF LIST7( MOV R0,@(SP)+ ;LINK NEW BLOCK INTO LIST- TST (R0)+ ;POINT PAST LINK WORD (G.LNK).. MOVB R4,(R0)+ ;STORE GROUP NUMBER (G.GRP), CLRB (R0)+ ;CLEAR STATUS BYTE (G.STAT)/ CLR (R0)+ ;INITIALIZE ACCESS COUNT (G.CNT)I6 CMP R3,R4 ;ARE THESE FLAGS FOR THE TASK'S OWN GROUP?% BNE 20$ ;IF NE NO, DO NOT LOCK THEMV2 INC -2(R0) ;LOCK FLAGS BY INCREMENTING USE COUNT8 BIS #T3.GFL,(R5) ;AND MAKE A NOTE OF THIS IN TASK'S TCB8 INCB T.GGF-T.ST3(R5) ;AND INCREMENT TASK'S ACCESS COUNT420$: CLR (R0)+ ;CLR FIRST EVENT FLAG WORD (G.EFLG)1 CLR (R0) ;CLR SECOND EVENT FLAG WORD (G.EGLG+2)30$: RETURN ;T00lsrncccc-40$: CLRB G.STAT(R1) ;CLEAR MARKED FOR DELETEA CMP R2,R4 ;TASK'S OWN GROUP?$ BNE 110$ ;IF NE NO DON'T LOCK THEM" BIT #T3.GFL,(R5) ;ALREADY LOCKED? BNE 110$ ;IF NE YESU8 BIS #T3.GFL,(R5) ;MARK TCB AS HAVING LOCKED EVENT FLAGS2 INC G.CNT(R1) ;LOCK THE EVENT FLACK CONTROL BLOCK6 INCB T.GGF-T.ST3(R5) ;RECORD ACCESS FOR SLAVE TASKING' BR 110$ ;INDICATE FLAGS ALREADY EXISTU ;+-; **-DRELE-ELIMINATE GROUP GLOBAL EVENT FLAGS);CA; THE ELIMINATE GROUP GLOBAL EVENT FLAGS DIRECTIVE ELIMINATES THEC; GROUP GLOBAL EVENT FLAGS FOR THE SPECIFIED GROUP. IF THE ISSUINGW@; TASK HAD LOCKED THE EVENT FLAGS VIA A PREVIOUSLY ISSUED CREATEA; GROUP GLOBAL EVENT FLAGS DIRECTIVE, THEY WILL ALSO BE UNLOCKED.C;SA; THE UNLOCK GROUP GLOBAL EVENT FLAGS DIRECTIVE UNLOCKS THE EVENTN%; FLAGS FOR THE ISSUING TASK'S GROUP.R;C;SA; DPB FORMAT FOR THE ELIMINATE GROUP GLOBAL EVENT FLAG DIRECTIVE:+; #; WD. 0 -- DIC. (159.),DBP SIZE(2.) ; WD. 1 -- GROUP NUMBERT;R>; DPB FORMAT FOR THE UNLOCK GROUP GLOBAL EVENT FLAG DIRECTIVE:;E#; WD. 0 -- DIC. (159.),DPB SIZE(1.) ; ; INPUTS: ;K8; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK; R3=ADDRESS OF THE DBP + 2D.; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK+; R5=ADDRESS OF THE TCB OF THE CURRENT TASKN;K5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)C;S-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.V&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED=; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF NON-PRIVILEGEDE7; TASK ATTEMPTS TO ELIMINATE FLAGS FOR ANOTHER GROUP.(9; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF EVENT FLAGO'; BLOCK IS ALREADY MARKED FOR DELETE.H=; DIRECTIVE STATUS OF 'D.RS91' IS RETURNED IF THE SPECIFIED 5); EVENT FLAG GROUP IS GREATER THAN 377.K<; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF THE SPECIFIED$; EVENT FLAG GROUP DOES NOT EXIST.;- V#$DRELE::MOVB -(R3),R0 ;GET DPB SIZEE0 CMPB (R3)+,#2 ;IS THIS THE ELIMINATE DIRECTIVE? BEQ 50$ ;IF EQ YES' ASR R0 ;IS THIS THE UNLOCK DIRECTIVE?M& BNE 120$ ;IF NE NO, ILLEGAL DPB SIZE0 CALL $UNLCK ;ATTEMPT TO UNLOCK THE EVENT FLAGS" BCS 110$ ;IF CS ALREADY UNLOCKED7$ELIM:: BNE 45$ ;IF NE G.CNT<>0, DON'T ELIMINATE FLAGST) TSTB G.STAT(R1) ;MARKED FOR ELIMINATION?O) BNE 65$ ;IF NE YES, ELIMINATE THE FLAGSU45$: RETURN ;R250$: CALL 300$ ;LOOK FOR THE SPECIFIED EVENT FLAG! BCS 100$ ;IF CS FLAGS NOT FOUNDR* CMP R2,R4 ;ELIMINATING TASK'S OWN GROUP?& BNE 60$ ;IF NE NO, DON'T UNLOCK THEM. BIT #T3.GFL,(R5) ;ARE THE EVENT FLAGS LOCKED? BEQ 60$ ;IF EQ NO 8 BISB #GS.DEL,G.STAT(R1) ;MARK THE FLAGS FOR ELIMINATION# CALL 200$ ;UNLOCK THE EVENT FLAGSD. BEQ 65$ ;IF EQ, G.CNT=0, ELIMINATE THE FLAGS RETURNN060$: TSTB G.STAT(R1) ;ALREADY MARKED FOR DELETE? BNE 110$ ;IF NE YESS$ INCB G.STAT(R1) ;MARK IT FOR DELETE! TST G.CNT(R1) ;STILL BEING USED?P/ BNE 210$ ;IF NE YES, DON'T ELIMINATE THEM YETO&65$: CALLR $ELGEF ;ELIMINATE THEM NOW%70$: DRSTS D.RS1 ;ALLOCATION FAILUREL!80$: DRSTS D.RS91 ;INVALID GROUPE'90$: DRSTS D.RS16 ;PRIVILEGE VIOLATION $100$: DRSTS D.RS97 ;GROUP NOT FOUNDE110$: DRSTS D.RS17 ;FLAGS ALREADY EXIST OR ALREADY MARKED FOR DELETEI%120$: DRSTS D.RS99 ;ILLEGAL DPB SIZET:200$: BIC #T3.GFL,(R5) ;MARK TCB AS NOT HAVING EFNS LOCKED4 DECB T.GGF-T.ST3(R5) ;DECREMENT TASK'S ACCESS COUNT- DEC G.CNT(R1) ;DECREMENT THE FLAGS USE COUNT0 210$: RETURN6300$: ADD #T.ST3,R5 ;POINT TO THIRD STATUS WORD OF TCB. MOVB H.CUIC+1(R4),R2 ;GET TASK'S GROUP NUMBER) MOV (R3),R4 ;GET SPECIFIED GROUP NUMBERD# BNE 310$ ;IF NE ONE WAS SPECIFIED0$ MOV R2,R4 ;ASSUME TASK'S OWN GROUP BR 325$ ;JOIN COMMON CODEA:310$: BIT #T3.PRV,(R5) ;TASK ALLOWED TO SPECIFY ANY GROUP? BNE 320$ ;IF NE YES02 CMPB R4,R2 ;ATTEMPTING TO SPECIFY ANOTHER GROUP? BNE 90$ ;IF NE YES'320$: CMP R4,#377 ;LEGAL GROUP NUMBER?C BHI 80$ ;IF HI NO 6325$: CALLR $SRGEF ;TRY TO FIND THE GROUP'S CNTRL BLK;+;T?; THIS ROUTINE WILL UNLOCK THE GROUP GLOBAL EVENT FLAGS FOR THEU<; TASK'S GROUP IF THE TASK HAS THEM LOCKED FROM A 00l sm smmmffDATAPREVIOUSLY2; ISSUED CREATE GROUP GLOBAL EVENT FLAG DIRECTIVE.;S ; INPUTS:; ); R4=ADDRESS OF THE CURRENT TASK'S HEADER,&; R5=ADDRESS OF THE CURRENT TASK'S TCB;B ; OUTPUTS:; 6; C=1 IF THE EVENT FLAGS FOR THE TASK'S GROUP WERE NOT; LOCKED BY THE TASK4; C=0 IF THE EVENT FLAGS WERE SUCCESSFULLY UNLOCKED.;I!; R4 IS DESTROYED BY THIS ROUTINEI; R5 = R5+T.ST3T;B;-:$UNLCK::ADD #T.ST3,R5 ;POINT TO THE THIRD TASK STATUS WORD6 BIT #T3.GFL,(R5) ;ARE THE TASKS GROUP GLOBALS LOCKED? BEQ 400$ ;IF EQ NO, MOVB H.CUIC+1(R4),R4 ;GET TASK'S GROUP CODE, CALL $SRGEF ;FIND THE EVENT FLAG CNTRL BLK/ BCC 200$ ;JOIN COMMON CODE WITH THE DIRECTIVE = BGCK$A BF.DIR,BE.GGF,FATAL ;TASK LOCKED TO NONEXISTANT FLAGSE*400$: SEC ;TASK NOT LOCKED TO EVENT FLAG RETURN ;E .DSABL LSBW .ENDC ; DF G$$GEF . .END R4 IS DESTROYED BY THIS ROUTINEI; R5 = R5+T.ST3T;B;-:$UNLCK::ADD #T.ST3,R5 ;POINT TO THE THIRD TASK STATUS WORD6 BIT #T3.GFL,(R5) ;ARE THE TASKS GROUP GLOBALS LOCKED? BEQ 4 .TITLE DRREG .IDENT /02.09/) ;T1; COPYRIGHT (C) 1974, 1978, 1979, 1980, 1981,1983L/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.H;IA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDL9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;E; T. J. MILLER 12-MAR-76; ); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:O;N; J. M. LAWLER; B. S. MCCARTHY; T. M. MARTIN R;P; MODIFIED BY:;A; J. M. LAWLER 29-JUN-83 02.07;A7; JL162 -- FINISH CONDITIONALIZATION OF CPCR DIRECTIVE;. ; B. S. MCCARTHY 28-NOV-83 02.08;C6; BM292 -- MOVE DRCPC TO SEPARATE MODULE SO THAT THIS2; MODULE MAY BE PLACED IN THIRD DIRECTIVE COMMON6; (SUPERSEDES JL162, WHICH IS INCLUDED IN DRCPC.MAC);P ; B. S. MCCARTHY 24-APR-85 02.09;U6; BM347 -- DON'T ALLOW CREATION OF REGIONS IN SPECIAL; PARTITIONS; ;S .PAGE;L; THE FOLLOWING DIRECTIVES RECEIVE AS INPUT A POINTER TO A REGION DEFINITIONI; BLOCK WHICH SERVES AS A COMMUNICATION AREA BETWEEN THE ISSUING TASK AND G; THE EXECUTIVE. THE REGION DEFINITION BLOCK HAS THE FOLLOWING FORMAT: ;E4; ------------------------------------------------- ; ! ! ; R.GID ! REGION ID ! ; ! ! 4; !-----------------------------------------------! ; ! !-); R.GSIZ ! SIZE OF REGION (32W BLOCKS) !I ; ! ! 4; !-----------------------------------------------! ; ! !E ; ! !E ; ! !O%; R.GNAM ! NAME OF REGION (RAD50) !H ; ! ! ; ! !O ; ! !N4; !-----------------------------------------------! ; ! !C ; ! !L ; ! ! 1; R.GPAR ! REGION'S MAIN PARTITION NAME (RAD50) !- ; ! ! ; ! !I ; ! ! 4; !-----------------------------------------------! ; ! !-!; R.GSTS ! REGION STATUS WORD ! ; ! !W4; !-----------------------------------------------! ; ! !-(; R.GPRO ! PROTECTION CODE OF REGION ! ; ! !4; -------------------------------------------------;!  .IF DF P$$LAS ;-; MACRO LIBRARY CALLS-;-# .MCALL HDRDF$,PCBDF$,RDBDF$,TCBDF$ 1 HDRDF$ ;DEFINE HEADER AND WINDOW BLOCK OFFSETSI7 PCBDF$ ;DEFINE PCB AND ATTACHMENT DESCRIPTOR OFFSETS 1 RDBDF$ ;DEFINE REGION DEFINITION BLOCK OFFSETS- TCBDF$ ;DEFINE TCB OFFSETS!;+; **-$DRCRR-CREATE REGION ;WG; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE A REGION AND OPTIONALLY.; ATTACH TO IT. ;E ; DPB FORMAT:;!!; WD. 00 -- DIC(55.),DPB SIZE(2.)-.; WD. 01 -- ADDRESS OF REGION DEFINITION BLOCK;S ; INPUTS: ;R9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ,; R3=ADDRESS OF THE REGION DEFINITION BLOCK./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.R,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;O2; INPUT FIELDS IN THE REGION DEFINITION BLOCK ARE:#; R.GSIZ=SIZE OF REGION TO CREATE. 4; R.GNAM=NAME OF REGION TO CREATE OR 0 FOR NO NAME.>; R.GPAR=NAME OF SYSTEM PARTITION IN WHICH TO ALLOCATE REGION+; OR 0 FOR MAIN SYSTEM PARTITION OF TASK.D; R.GSTS=CONTROL INFORMATION.4; RS.NDL=1 IF REGION SHO00msrnccccULD NOT BE DELETED ON LAST ; DETACH.2; RS.ATT=1 IF CREATED REGION SHOULD BE ATTACHED.1; RS.RED=1 IF READ ACCESS IS DESIRED ON ATTACH.A2; RS.WRT=1 IF WRITE ACCESS IS DESIRED ON ATTACH.3; RS.EXT=1 IF EXTEND ACCESS IS DESIRED ON ATTACH.:3; RS.DEL=1 IF DELETE ACCESS IS DESIRED ON ATTACH.E;; R.GPRO=PROTECTION CODE FOR REGION [DEWR,DEWR,DEWR,DEWR].T;P5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ;T-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.M&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED..>; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF A PCB OR ATTACH-+; MENT DESCRIPTOR COULD NOT BE ALLOCATED. ;; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE DIRECTIVEI4; FAILS IN THE ATTACHMENT STAGE BECAUSE THE REGION ; HAS INCURRED A PARITY ERROR.:; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE DESIRED-; ACCESS IS DENIED IN THE ATTACHMENT STAGE. <; DIRECTIVE STATUS OF 'D.RS84' IS RETURNED IF THE SPECIFIED4; PARTITION IN WHICH THE REGION IS TO BE ALLOCATED4; DOES NOT EXIST, OR IF NO PARTITION NAME HAS BEEN; SPECIFIED AND RS.ATT=0.R;T3; OUTPUT FIELDS IN THE REGION DEFINITION BLOCK ARE: '; R.GID=ASSIGNED REGION ID (RS.ATT=1).I+; R.GSTS=DIRECTIVE COMPLETION INFORMATION. #; RS.CRR=1 IF REGION WAS CREATED.U;D7; NOTE: ON SYSTEMS SUPPORTING EXTERNAL HEADERS, THE RDBR0; IS COPIED TO AN EXECUTIVE BUFFER SO THAT APR62; CAN BE USED TO MAP THE TASK HEADER EXCLUSIVELY.1; THIS MEANS THAT ANY OUTPUT FIELDS ARE RETURNEDT2; TO THE USER TASK FROM THE DIRECTIVE DISPATCHER.; 2; ALSO, WHEN RETURNING REGION SIZE FROM AN ATTACH4; EXCLUDE THE SIZE OF THE NON RESIDENT TASK HEADER.;A;- .ENABL LSBG?$DRCRR::ADD #R.GPAR,R3 ;PNT TO NAME OF PAR IN WHICH TO ALLOCATEA9 MOV T.PCB(R5),R2 ;ASSUME ALLOCATING IN TASK'S PARTITION N/ MOV P.MAIN(R2),R2 ;POINT TO MAIN PARTITION PCB % TST (R3) ;PARTITION NAME SPECIFIED?A BEQ 5$ ;IF EQ NO/ CALL $SRNAM ;SEARCH FOR NAMED PARTITION'S PCBE) BCS 90$ ;IF CS, PARTITION NOT IN SYSTEM + CMP R2,P.MAIN(R2) ;IS IT A MAIN PARTITION?E BNE 90$ ;IF NE NO  U N .IF DF M$$EXT A) CMP P.REL(R2),#177600 ;DEVICE PARTITION?S N .IFFH E' CMP P.REL(R2),#7600 ;DEVICE PARTITION?R A .ENDC O M BHIS 90$ ;YES, IF HISC8 BIT #P2.LMA!P2.SEC!P2.CPU,P.ST2(R2) ;SPECIAL PARTITION?( BNE 90$ ;IF NE YES, DON'T ALLOW CREATE#5$: MOV R2,R0 ;COPY POINTER TO PCB , TST -(R3) ;POINT TO REGION NAME (R.GNAM+2), TST -(R3) ;REGION NAME SPECIFIED? (R.GNAM) BEQ 10$ ;IF EQ NOO, CALL $SRNAM ;DETERMINE IF NAME IS UNIQUE & BCC 35$ ;IF CC, NAME IS NOT UNIQUE 10$: ;REF SYMBOLT A C .IF DF M$$PRO 0) CLR -(SP) ;CLEAR REQUIRED RUN MASK WORDP L .ENDC ;4 CLR -(SP) ;CLR HDR SIZE AND I/O CNT (P.HDLN/P.IOC) I+ MOV R3,-(SP) ;PUSH NON-ZERO WORD (P.ATT+2)C CLR -(SP) ;(P.ATT)9 MOV R.GPRO-R.GNAM(R3),-(SP) ;SET PROTECTION MASK (P.PRO)I= BIC #210,(SP) ;INSURE OWNER AND SYSTEM DELETE ACCESS (P.PRO)T, MOV #P2.PIC,-(SP) ;INIT SECOND WORD (P.ST2)4 MOV #PS.COM!PS.OUT,-(SP) ;INIT STATUS WORD (P.STAT), MOV H.CUIC(R4),-(SP) ;SET OWNER UIC (P.OWN), CLR -(SP) ;CLEAR DISK PCB POINTER (P.DPCB); MOV R.GSIZ-R.GNAM(R3),-(SP) ;STORE SIZE OF REGION (P.SWSZ)C7 CMP (SP),P.SIZE(R0) ;CREATING REGION LARGER THAN MAIN?O BHI 120$ ;IF HI YES 3 CLR -(SP) ;CLR COMMON BLK DIRECTORY LINK (P.CBDL); MOV R.GSIZ-R.GNAM(R3),-(SP) ;STORE SIZE OF REGION (P.SIZE)B* CLR -(SP) ;CLEAR RELOCATION BIAS (P.REL), MOV R0,-(SP) ;SET MAIN PCB POINTER (P.MAIN), CLR -(SP) ;CLEAR SUBPARTITION LINK (P.SUB)A MOV 2(R3),-(SP) ;SET SECOND WORD OF PAR NAME (R.GNAM+2)(P.NAM+2)W; MOV (R3),-(SP) ;SET FIRST WORD OF PAR NAME (R.GNAM)(P.NAM)-# BNE 30$ ;IF NE NAME WAS SPECIFIEDN8 BIT #RS.ATT,R.GSTS-R.GNAM(R3) ;IS REGION TO BE ATTACHED) BEQ 90$ ;IF EQ NO, PARTITION NAME ERRORS5 CLR 2(SP) ;ELSE CLEAR SECOND WORD OF NAME (P.NAM+2)I430$: CLR -(SP) ;ZERO PRIORITY AND MAP COUNT (P.PRI)$ CLR -(SP) ;CLEAR LINK WORD (P.LNK)) MOV SP,R2 ;COPY POINTER TO PCB ON STACKM535$: BIT #RS.ATT,R.GSTS-R.GNAM(R3) ;ATTACH DESIRED? V BEQ 300ms smmmffDATA6$ ;IF EQ NOO CALL ATT ;ATTACH REGION+)36$: TST (SP) ;WAS THE REGION CREATED? R BNE 80$ ;IF NE NO, DONE 2 MOV R1,R5 ;COPY POINTER TO ATTACHMENT DESCRIPTOR! MOV #P.LGTH,R1 ;PICK UP PCB SIZET CALL $ALOCB ;ALLOCATE A PCBR$ BCS 110$ ;IF CS ALLOCATION FAILURE, MOV #P.LGTH/2,R1 ;PICK UP PCB SIZE IN WORDS MOV R0,R4 ;COPY POINTER TO PCB!40$: MOV (SP)+,(R0)+ ;FILL IN PCB  DEC R1 ;DONE YET?, BGT 40$ ;IF GT NOP O T .IF DF M$$PRO A( TST -(R0) ;SKIP REQUIRED RUN MASK WORD Q .ENDC Q O. TST -(R0) ;SKIP XTRNL HDR SIZE AND I/O COUNT H E' CMP -(R0),-(R0) ;WAS THE PCB ATTACHED?N BEQ 50$ ;IF EQ YES MOV R0,2(R0) ;SET UP LISTHEAD4 CMP -(R3),-(R3) ;POINT TO REGION ID (R.GSIZ)(R.GID) BR 60$ ;;50$: MOV (R0),R5 ;PICK UP ADDRESS OF ATTACHMENT DESCRIPTORR+ MOV R4,A.PCB(R5) ;POINT IT TO THE REAL PCBP!60$: TST P.NAM(R4) ;NAMED COMMON?0 BEQ 75$ ;IF EQ NOC4 MOV #$CBDHD-P.CBDL,R0 ;POINT TO CBD LISTHEAD AS PCB)65$: MOV R0,R1 ;SAVE POINTER TO PREVIOUSN. MOV P.CBDL(R0),R0 ;POINT TO NEXT ENTRY IN CBD BEQ 71$ ;IF EQ THERE IS NONE5 CMP P.NAM(R4),P.NAM(R0) ;TEST TO SEE IF IT GOES HERE5 BNE 70$ ;S CMP P.NAM+2(R4),P.NAM+2(R0) ;'70$: BHI 65$ ;IF HI IT DOESN'T GO HERE.571$: MOV R0,P.CBDL(R4) ;POINT NEW ONE TO NEXT IN LISTD) MOV R4,P.CBDL(R1) ;POINT PREV TO NEW ONEC875$: BIS #RS.CRR,R.GSTS(R3) ;INDICATE REGION WAS CREATED0 BIT #RS.NDL,R.GSTS(R3) ;IS NO DELETION DESIRED? BNE 80$ ;IF NE NOL6 BIS #PS.DEL,P.STAT(R4) ;SET DELETE ON LAST DETACH BIT80$: RETURN ; (90$: DRSTS D.RS94 ;PARTITION NAME ERROR)110$: TST P.ATT(SP) ;WAS REGION ATTACHED?) BEQ 120$ ;IF EQ NO3 MOV (R3),R5 ;POINT TO ATT DESCR TO DETACH (R.GID);- MOV SP,P.NAM(SP) ;SET NAME TO AVOID DELETION: CALL $DETRG ;DETACH THE REGION&120$: DRSTS D.RS1 ;ALLOCATION FAILURE ;+; **-$DRATR-ATTACH REGIONT;3D; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ATTACH THE SPECIFIED REGION; TO THE CURRENT TASK.;E ; DPB FORMAT:D;P!; WD. 00 -- DIC(57.),DPB SIZE(2.)H.; WD. 01 -- ADDRESS OF REGION DEFINITION BLOCK;T ; INPUTS:E;R9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.F,; R3=ADDRESS OF THE REGION DEFINITION BLOCK./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.O,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;22; INPUT FIELDS IN THE REGION DEFINITION BLOCK ARE:&; R.GNAM=NAME OF REGION TO ATTACH TO.#; R.GSTS=DESIRED ACCESS TO REGION.T'; RS.RED=1 IF READ ACCESS IS DESIRED.T(; RS.WRT=1 IF WRITE ACCESS IS DESIRED.); RS.EXT=1 IF EXTEND ACCESS IS DESIRED.S); RS.DEL=1 IF DELETE ACCESS IS DESIRED.E;R5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)A;F-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.; DIRECTIVE OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED.H;; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF AN ATTACHMENTD#; DESCRIPTOR CANNOT BE ALLOCATED.O;; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE SPECIFIED'; REGION HAS INCURRED A PARITY ERROR.:; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE DESIRED; ACCESS IS DENIED.S2; DIRECTIVE STATUS OF 'D.RS94' IS RETURNED IF THE$; SPECIFIED REGION DOES NOT EXIST.;D3; OUTPUT FIELDS IN THE REGION DEFINITION BLOCK ARE:M; R.GID=ASSIGNED REGION ID."; R.GSIZ=SIZE OF ATTACHED REGION.;-6$DRATR::ADD #R.GNAM,R3 ;POINT TO SPECIFIED REGION NAME" TST (R3) ;REGION NAME SPECIFIED? BEQ 90$ ;IF EQ NO, ILLEGAL& CALL $SRNAM ;SEARCH FOR NAMED REGION, BCS 90$ ;IF CS NAMED REGION DOES NOT EXIST*ATT: BIT #PS.PER,P.STAT(R2) ;PARITY ERROR? BNE 170$ ;IF NE YESC+ CMP R2,P.MAIN(R2) ;IS IT A MAIN PARTITION?S BEQ 90$ ;IF EQ YES, ERRORP. MOV R.GSTS-R.GNAM(R3),R0 ;PICK UP STATUS WORD BIT #17,R0 ;ATTACH DESIRED?O BNE 147$ ;IF NE YESG7 MOV T.ATT(R5),R1 ;POINT TO FIRST ATTACHMENT DESCRIPTOR2146$: SUB #A.TCBL,R1 ;POINT TO START OF DESCRIPTOR( CMP A.PCB(R1),R2 ;ATTACHED TO THIS PCB? BEQ 155$ ;IF EQ YESG7 MOV A.TCBL(R1),R1 ;POINT TO NEXT ATTACHMENT DESCRIPTOR  BNE 146$ ;IF NE THERE IS ONE! DRSTS D.RS86 ;NO SUCH REGION ID 1147$: MOV H.CUIC(R4),R1 ;PICK UP CURRENT TASK 00m"sn)snccccUIC; MOV R0,R4 ;COPY STATUS WORD9* CMP R2,#$STACK ;IS REGION BEING CREATED ?, BLO 150$ ;IF LO YES, SKIP PROTECTION CHECK2 BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED? ( BNE 150$ ;IF NE YES, SKIP ACCESS CHECK5 CALL $CKACC ;DETERMINE IF DESIRED ACCESS IS ALLOWEDC8150$: CALL $CRATT ;CREATE ATT DESCRIPTOR AND LINK IT IN$ BCS 160$ ;IF CS ALLOCATION FAILURE:155$: MOV P.SIZE(R2),-(R3) ;RETURN SIZE OF REGION (R.GSIZ) .IF DF X$$HDR9 MOVB P.HDLN(R2),R5 ;GET SIZE OF EXTERNAL HEADER (IF ANY) . SUB R5,(R3) ;EXCLUDE HEADER FROM REGION SIZE .ENDC ;DF X$$HDRG6 MOV R1,-(R3) ;STORE DESCRIPTOR ADDR AS REG ID (R.GID) RETURN ;T&160$: DRSTS D.RS1 ;ALLOCATION FAILURE 170$: DRSTS D.RS6 ;PARITY ERROR .DSABL LSBC;+; **-$DRDTR-DETACH REGIONS; E; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DETACH THE SPECIFIED REGION,S; UNMAPPING IF NECESSARY.I;E ; DPB FORMAT:I;R!; WD. 00 -- DIC(59.),DPB SIZE(2.)G.; WD. 01 -- ADDRESS OF REGION DEFINITION BLOCK;S ; INPUTS:R; 9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ,; R3=ADDRESS OF THE REGION DEFINITION BLOCK./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 2; INPUT FIELDS IN THE REGION DEFINITION BLOCK ARE:'; R.GID=REGION ID OF REGION TO DETACH.I; R.GSTS=CONTROL INFORMATION.5; RS.MDL=1 IF REGION SHOULD BE MARKED FOR DELETE ONE; THE LAST DETACH. ; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)G; -; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.IA; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF AN ATTEMPT IS MADEK8; TO MARK THE REGION FOR DELETE WITHOUT DELETE ACCESS.@; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF AN INVALID REGION6; ID IS SPECIFIED OR IF AN ATTEMPT IS MADE TO DETACH ; REGION 0. ;I3; OUTPUT FIELDS IN THE REGION DEFINITION BLOCK ARE:A7; R.GSTS=INDICATION OF ANY CHANGES IN MAPPING CONTEXT. *; RS.UNM=1 IF ANY WINDOWS WERE UNMAPPED.;- .ENABL LSBD5$DRDTR::CALL $SRATT ;SEARCH FOR AND VERIFY REGION IDI% TSTB A.IOC(R5) ;ANY I/O INTO REGION?." BNE 70$ ;IF NE YES, CAN'T DETACH MOV A.TCB(R5),R1 ;POINT TO TCBD MOV R5,R0 ;POINT TO TCB THREAD ADD #A.TCBL,R0 ;') CMP R0,T.ATT(R1) ;DETACHING TASK REGION?  BEQ 60$ ;IF EQ YES, ILLEGALM MOV A.PCB(R5),R0 ;POINT TO PCB03 MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOW BLOCKSK( TST (R4)+ ;POINT TO FIRST WINDOW BLOCK1 BIT #RS.MDL,R.GSTS(R3) ;MARK FOR DELETE DESIRED?  BEQ 10$ ;IF EQ NO7 BITB #AS.DEL,A.STAT(R5) ;DOES TASK HAVE DELETE ACCESS?  BEQ 70$ ;IF EQ NOO/ BIS #PS.DEL,P.STAT(R0) ;MARK REGION FOR DELETES?10$: CMP W.BATT(R4),R5 ;THIS WINDOW MAPPED TO REGION TO DETACH I BNE 20$ ;IF NE NOD CALL $UNMAP ;UNMAP WINDOW(5 BIS #RS.UNM,R.GSTS(R3) ;INDICATE WINDOW WAS UNMAPPEDE/20$: ADD #W.BLGH,R4 ;POINT TO NEXT WINDOW BLOCKD9 TSTB A.MPCT(R5) ;ANY MORE WINDOWS MAPPED TO THIS REGION?I BNE 10$ ;IF NE YES6 CALLR $DETRG ;DETACH REGION BY ATTACHMENT DESCRIPTOR%60$: DRSTS D.RS86 ;INVALID REGION IDT=70$: DRSTS D.RS16 ;ATTEMPT TO MARK FOR DELETE WITHOUT ACCESSB .DSABL LSBS .ENDC .ENDN FOR DELETES?10$: CMP W.BATT(R4),R5 ;THIS WINDOW MAPPED TO REGION TO DETACH I BNE 20$ ;IF NE NOD CALL $UNMAP ;UNMAP WINDOW(5 BIS #RS.UNM,R.GSTS(R3) ;INDICATE WINDOW WAS UNMAPPEDE/20$: ADD #W.BLGH,R4 ;POINT TO NEXT WINDOW BLOCKD9 TSTB A.MPCT(R5) ;ANY MORE WINDOWS MAPPED TO THIS REGION?I BNE 10$ ;IF NE YES6 CALLR $DETRG ;DETACH REGION BY ATTACHMENT DESCRIPTOR%60$: DRSTS D.RS86 ;INVALID .TITLE DRSMG: .IDENT /01.03/T P;O5; COPYRIGHT (C) 1981 BY DIGITAL EQUIPMENT CORPORATIONC; ALL RIGHTS RESERVED.;:<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;G; P. J. BEZEREDI 30-MAR-81;M; SEND MESSAGE DIRECTIVE;P; PREVIOUSLY MODIFIED BY:;T; T. M. MARTIN;O; MODIFIED BY:;O; J. M. LAWLER 29-JUN-83 1.02E;S%; JL162 -- FINISH CONDITIONALIZATIONC;N; S.C. ADAMS 29-JULY-83 1.03;;:; SA500n*s smmmffDATA10 -- REPLACE CALLS TO $CRPKT AND $QUPKT WITH $CREQU; ; ; MACRO LIBRARY CALLSN;O .MCALL EPKDF$* EPKDF$ ;DEFINE ERROR LOG PACKET OFFSETS;+; **-$DRSMG-SEND MESSAGE;S<; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SEND A MESSAGE TO A; SYSTEM PROCESS.E;E ; DPB FORMAT:M; ); WD. 00 -- DIC(171.),DPB SIZE (VARIABLE)D; WD. 01 -- TARGET IDENTIFIER%; WD. 02 -- ADDRESS OF MESSAGE BUFFER2$; WD. 03 -- LENGTH OF MESSAGE BUFFER3; WD. 04 -- START OF TARGET SPECIFIC PARAMETER LIST3;;7; PARAMETER LIST FOR TARGET SPECIFIC IDENTIFIER SM.SER:E;&; WD. 04 -- ERROR LOG PACKET TYPE CODE); WD. 05 -- ERROR LOG PACKET SUBTYPE CODEA*; WD. 06 -- LOGICAL UNIT NUMBER (OPTIONAL)(; WD. 07 -- CONTROL MASK WORD (OPTIONAL);O ; INPUTS:S; @; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.6; R3=ADDRESS OF THE TARGET IDENTIFIER WORD IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; ; OUTPUTS:;F-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.R&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.O1; DIRECTIVE STATUS OF 'D.RS5' IS RETURNED IF THED+; SPECIFIED LUN IS ASSIGNED TO A NON-MASS /; STORAGE DEVICE, OR THE LUN IS NOT ASSIGNED.S5; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF INVALIDE#; TARGET PROCESS OR CONTROL MASK.A6; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF INVALID ; DPB SIZE.R8; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF PRIVILEGE; VIOLATION.;; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF ERROR LOGGINGI.; IS NOT ACTIVE AND PACKET CANNOT BE QUEUED.6; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF THERE IS; NOT ENOUGH POOL.;- .IF DF, E$$LOGA($DRSMG::MOVB -1(R3),R0 ;GET THE DPB SIZE8 CMP (R3)+,#SM.SER ;IS THE TARGET PROCESS ERROR LOGGING? BNE ER8 ;IF NE NOA% CMPB R0,#6. ;IS THE DPB BIG ENOUGH?C BLO ER99 ;IF LO NO7 MOV #SM.HDR!SM.TSK,-(SP) ;INITIALIZE THE FLAGS TO USEA) CMPB R0,#8. ;DOES A CONTROL MASK EXIST?  BLO 10$ ;IF LO NOC. BIS 12(R3),(SP) ;OBTAIN THE CONTROL MASK WORD7 BIT #SM.DID!SM.DOP!SM.DAC!SM.DAT,(SP) ;INVALID FLAGS?D BNE ER8 ;IF NE YES# BIT #SM.ZER,(SP) ;ZERO I/O COUNTS?  BEQ 10$ ;IF EQ NO.0 BIT #T3.PRV,T.ST3(R5) ;IS THE TASK PRIVILEGED? BEQ ER16 ;IF EQ NO010$: TST $ERRPT ;IS THE ERROR LOGGER INSTALLED? BEQ ER7 ;IF EQ NOP- BIT #ES.DAT,$ERFLA ;CAN WE LOG DATA PACKETS?; BNE 20$ ;IF NE YES) BIT #SM.CMD,(SP) ;NO, IS THIS A COMMAND?A BEQ ER7 ;IF EQ NO, ERROR120$: CMP (R3)+,(R3)+ ;POINT TO THE TYPE CODE WORD,( MOV (R3)+,-(SP) ;GET THE TYPE CODE WORD$ MOVB (R3)+,1(SP) ;STUFF THE SUBCODE( TSTB (R3)+ ;POINT TO POSSIBLE LUN WORD% CMPB R0,#7. ;DOES A LUN WORD EXIST?$ BLO 30$ ;IF LO NO3$ TST (R3) ;IS A LUN NUMBER PRESENT? BEQ 30$ ;IF EQ NO  CALL $MPLUN ;MAP THE LUN- BCC 26$ ;IF CC LUN IS ASSIGNED TO SOMETHING724$: DRSTS D.RS5 ;NOT ASSIGNED TO ERROR LOGGING DEVICE 026$: BIT #DV.MSD,U.CW1(R0) ;MASS STORAGE DEVICE?- BEQ 24$ ;IF EQ NO, NOT ERROR LOGGING DEVICE+" TST -(R3) ;POINT BACK TO THE LUN5 BIS #SM.DID,2(SP) ;YES, LOG A DEVICE IDENT SUBPACKET,,30$: MOV R0,-(SP) ;SAVE POSSIBLE UCB ADDRESS1 CMP -(R3),-(R3) ;POINT BACK TO THE BUFFER LENGTHD) MOV -(R3),R1 ;GET BUFFER LENGTH IN BYTES; BEQ 40$ ;IF EQ NO BUFFER8 BIS #SM.DAT,4(SP) ;INDICATE A DATA SUBPACKET IS PRESENT% MOV -(R3),R3 ;GET THE BUFFER ADDRESS4! MOV R1,-(SP) ;COPY BUFFER LENGTHR+ CALL $ACHKP ;ADDRESS CHECK AND MAP BUFFER)$ MOV (SP)+,R1 ;RESTORE BUFFER LENGTH'40$: MOV (SP)+,R5 ;RETRIEVE UCB ADDRESSR# MOV (SP)+,R0 ;RETRIEVE ERROR CODESD) MOV (SP)+,R2 ;RETRIEVE CONTROL MASK WORD,- MOV $TKTCB,R4 ;RETRIEVE THE TASK TCB ADDRESS1 CALL $CREQU ; CREATE AND QUEUE ERROR LOG PACKET BCS ER1 ; IF CS NO PACKETG RETURNE ER1: DRSTS D.RS1 ;NO POOL SPACE+ER7: DRSTS D.RS7 ;ERROR LOGGING NOT ACTIVEP1ER8: DRSTS D.RS8 ;INVALID TARGET OR CONTROL MASKV(ER16: DRSTS D.RS16 ;PRIVILEGE VIOLATION%ER99: DRSTS D.RS99 ;INVALID DPB SIZEV .ENDC ; DF E$$LOG .ENDH'40$: MOV (SP)+,R5 ;RETRIEVE UCB ADDRESSR# MOV (SP)+,R0 ;RETRIEVE ERROR CO00o2s)sncccc .TITLE QUEUEE .IDENT /10.00/;#; COPYRIGHT (C) 1985$; BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;B>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;S ; D. N. CUTLER 3-AUG-73Z ;D# ; MODIFIED FOR RSX-11M-PLUS V2.1:A ;T; B. S. MCCARTHY; &; MODIFIED FOR RSX-11M-PLUS V3.0 BY:;E; J. M. LAWLER; B. S. MCCARTHY; J. W. BERZLE;H; MODIFIED BY:;V ; J. W. BERZLE 23-OCT-85 10.00;!; JWB167 -- ADD $QRMVA ROUTINEY;T!;U";T'#; GENERAL QUEUE MANIPULATION ROUTINES$;%; MACRO LIBRARY CALLSH&;D'1' .MCALL PKTDF$,PCBDF$,CLKDF$,TCBDF$ ;JWB167O4) PKTDF$ ;DEFINE CLI COMMAND BLOCK OFFSETS ;**-15* CLKDF$ ;DEFINE CLOCK QUEUE CONTROL BLOCK OFFSETS .+ TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS<+ PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS ;JWB167,-;+#.; **-$CLINS-CLOCK QUEUE INSERTIONI/;BI0; THIS ROUTINE IS CALLED TO MAKE AN ENTRY IN THE CLOCK QUEUE. THE ENTRY G1; IS INSERTED SUCH THAT THE CLOCK QUEUE IS ORDERED IN ASCENDING TIME.@2; THUS THE FRONT ENTRIES ARE MOST IMMINENT AND THE BACK LEAST.3;B 4; INPUTS:65;36; R0=ADDRESS OF THE CLOCK QUEUE ENTRY CORE BLOCK.%7; R1=HIGH ORDER HALF OF DELTA TIME.L$8; R2=LOW ORDER HALF OF DELTA TIME.9; R4=REQUEST TYPE.7:; R5=ADDRESS OF REQUESTING TCB OR REQUEST IDENTIFIER.W;; <; OUTPUTS:=;LB>; THE CLOCK QUEUE ENTRY IS INSERTED IN THE CLOCK QUEUE ACCORDING&?; TO THE TIME THAT IT WILL COME DUE.@; A; NOTE: @B; ON MULTIPROCESSOR SYSTEMS, A REQUEST WITH TYPE C.SYST!1000009C; WILL BE EXECUTED ON A PRATICULAR UNIBUS RUN, WITH URM>D; SPECIFIED IN C.URM. TYPE C.CYST REQUESTS ON MP SYSTEMS ARE>E; DEFAULTED TO RUN ON ANY UNIBUS RUN, WHICH IN PRACTICE WILL=F; RESULT IN THE REQUEST EXECUTING ON THE CPU WHICH OWNS THESG; CLOCK. ($CKURM) G;S@G; A REQUEST WITH TYPE C.SCHD!100000 OR C.SSHT!100000 INDICATESAG; THAT IT IS A SCHEDULE REQUEST WITH A DEFAULT NAMED DIRECTORY. =G; THIS BIT IS SET IN THE DIRECTIVE CODE (E.G. DRMKT) AND IN,?G; TDSCH ON RESCHEDULE REQUESTS. C.NAM IS SET UP ACCORDINGLY.TH;-I J .ENABL LSBR8K$CLINS::CLR (R0)+ ;POINT TO TYPE FIELD AND CLEAR LINK"L MOVB R4,(R0)+ ;SET REQUEST TYPE"M INC R0 ;ADVANCE TO TCB ADDRESS.N MOV R5,(R0)+ ;SET TCB OR REQUEST IDENTIFIER.O ADD $ABTIM,R2 ;CALCULATE ABSOLUTE TIME WHEN!P ADC R1 ;REQUEST WILL COME DUE +Q MOV R2,(R0)+ ;SET LOW ORDER PART OF TIMES,R MOV R1,(R0) ;SET HIGH ORDER PART OF TIME1S MOV #$CLKHD,R2 ;POINT TO CLOCK QUEUE LIST HEAD 1T10$: MOV R2,R1 ;SAVE ADDRESS OF PREVIOUS ENTRYC*U MOV (R1),R2 ;GET ADDRESS OF NEXT ENTRYV BEQ 20$ ;IF EQ END OF LIST1W CMP (R0),C.TIM+2(R2) ;COMPARE HIGH ORDER TIMES0!X BHI 10$ ;IF HI NOT THIS ENTRYD"Y BLO 20$ ;IF LO ENTRY GOES HERE0Z CMP -2(R0),C.TIM(R2) ;COMPARE LOW ORDER TIMES#[ BHIS 10$ ;IF HIS NOT THIS ENTRYC-\20$: SUB #8.,R0 ;BACK UP TO FRONT OF BLOCKS/] MOV R0,(R1) ;SET NEW NEXT IN PREVIOUS ENTRYH&^ MOV R2,(R0) ;SET NEXT IN NEW ENTRY_` .IF DF N$$DIRa.b CMPB #C.SCHD,R4 ;PERIODIC SCHEDULE REQUEST?c BEQ 25$ ;IF EQ, YES,,d CMPB #C.SSHT,R4 ;SINGLE SHOT TASK REQUESTe BNE 27$ ;IF NE, NO2f25$: CLRB C.NAM(R0) ;INDICATE UIC IN CLOCK BLOCK4g TST R4 ;IS THERE A CONTEXT BLOCK INSTEAD OF UIC?h BPL 27$ ;IF PL, NO8i INCB C.NAM(R0) ;INDICATE CONTEXT BLOCK IN CLOCK BLOCKj27$: ;REFERENCE LABELkl .ENDC ;DF N$$DIRTm6n CMPB #C.SYST,R4 ;A SYSTEM ROUTINE REQUEST (DRIVER)?o BNE 30$ ;IF NE NON7p MOV KINAR5,C.AR5(R0) ;SAVE KERNEL INSTR APR5 MAPPINGHqr .IF DF M$$PROs,t TST R4 ;IS THIS A URM SPECIFIC REQUEST ?)u BMI 30$ ;IF EQ YES, LEAVE C.URM ALONE$3v MOV #177777,C.URM(R0) ;DEFAULT TO ANY UNIBUS RUNCwx .ENDC ; DF M$$PROyz30$: RETURN ;I{|;+!}; **-$CLRMV-CLOCK QUEUE REMOVALC7~; **-$CLRSM-CLOCK QUEUE REMOVAL - SELECTIVE MARK TIME:;RL; THIS ROUTINE IS CALLED TO REMOVE ALL ENTRIES FOR A SPECIFIED TCB00o:s smmmffDATA ADDRESSG; AND REQUEST TYPE FROM THE CLOCK QUEUE, OR SELECTIVELY BY EFN OR ASTS; ADDRESS IF ENTRY AT $CLRSM.;. ; INPUTS:;,; R1=EFN NUMBER OR 0 (IF ENTRY AT $CLRSM).-; R2=AST ADDRESS OR 0 (IF ENTRY AT $CLRSM).V; R4=REQUEST TYPE.6; R5=ADDRESS OF REQUESTING TCB OR SYSTEM SUBROUTINE.;: ; OUTPUTS:;A; ALL OF THE MATCHING ENTRIES FOR THE SPECIFIED TCB ADDRESS AREED; REMOVED FROM THE CLOCK QUEUE. IF THE REQUEST TYPE IS NOT 'C.SYST6; THEN THE CLOCK QUEUE ENTRY CORE BLOCK IS RELEASED.;-6$CLRMV::CLR R1 ;MATCH ON ANY EVENT FLAG (MKTM ONLY)0 CLR R2 ;MATCH ON ANY AST ADDRESS (MKTM ONLY)8$CLRSM::MOV #$CLKHD,R0 ;POINT TO CLOCK QUEUE LIST HEAD140$: MOV R0,R3 ;SAVE ADDRESS OF PREVIOUS ENTRYQ* MOV (R3),R0 ;GET ADDRESS OF NEXT ENTRY BEQ 30$ ;IF EQ END OF LIST) CMPB R4,C.RQT(R0) ;REQUEST TYPE MATCH?N BNE 40$ ;IF NE NO < CMP R5,C.TCB(R0) ;TCB OR SYSTEM SUBROUTINE ADDRESS MATCH? BNE 40$ ;IF NE NOT TST R4 ;MARK TIME ENTRY? BNE 60$ ;IF NE NOE TSTB R1 ;EFN SPECIFIED?1 BEQ 50$ ;IF EQ NOL# CMPB R1,C.EFN(R0) ;MATCH ON EFN?A$ BEQ 55$ ;IF EQ YES, REMOVE ENTRY" TST R2 ;AST ADDRESS SPECIFIED? BEQ 40$ ;IGNORE PACKET50$: TST R2 ;AST SPECIFIED? BEQ 55$ ;IF EQ NOT" CMP R2,C.AST(R0) ;MATCH ON AST? BNE 40$ ;IF NE NOC%55$: MOV R2,-(SP) ;SAVE AST ADDRESS MOV R1,-(SP) ;SAVE EVENT FLAG/ MOV R3,-(SP) ;SAVE ADDRESS OF PREVIOUS ENTRY?0 MOV C.DST(R0),R3 ;GET EVENT FLAG MASK ADDRESS! MOV T.PCB(R5),R4 ;GET TASK PCBT .IF DF X$$HDR8 MOV KISAR6,-(SP) ;SAVE MAPPING FOR POSSIBLE XTRNL HDR+ MOV P.HDR(R4),-(SP) ;SAVE HEADER ADDRESST- BNE 57$ ;IF EQ HEADER IS RESIDENT IN POOLR/ MOV P.REL(R4),KISAR6 ;MAP TO EXTERNAL HEADER56 MOV #140000,(SP) ;REPLACE VIRTUAL ADDRESS OF HEADER257$: MOV (SP)+,R4 ;GET VIRTUAL ADDRESS OF HEADER .IFF ; DF X$$HDRS MOV P.HDR(R4),R4 ;GET HEADER  .IFTF ; DF X$$HDR .IF DF G$$GEF) CALL $DEAGF ;DEACCESS IF GROUP GLOBALG .ENDC ; DF G$$GEF .IFT ; DF X$$HDR(- MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGH .ENDC ; DF X$$HDR2 MOV (SP)+,R3 ;RESTORE ADDRESS OF PREVIOUS ENTRY# MOV (SP)+,R1 ;RESTORE EVENT FLAGE$ MOV (SP)+,R2 ;RESTORE AST ADDRESS5 MOV (R3),R0 ;RESTORE ADDRESS OF CURRENT CLOCK BLKT( CLR R4 ;RESTORE CURRENT REQUEST TYPE,60$: MOV (R0),(R3) ;REMOVE ENTRY FROM LIST5 CMPB #C.SYST,C.RQT(R0) ;SYSTEM SUBROUTINE REQUEST? BEQ 40$ ;IF EQ YES CONTINUEG) MOV R2,-(SP) ;SAVE NECESSARY REGISTERS MOV R1,-(SP) ;$7 CALL $DCLKA ;DEALLOCATE CORE (MAY HAVE ACNTING UAB)( MOV (SP)+,R1 ;RESTORE SAVED REGISTERS MOV (SP)+,R2 ;S BR $CLRSM ;GO AGAINV .DSABL LSBO;+3; **-$QINSF-QUEUE INSERTION AT END OF LIST (FIFO)3; C; THIS ROUTINE IS CALLED TO MAKE AN ENTRY IN A FIRST IN FIRST OUTE5; LIST. THE ENTRY IS LINKED TO THE END OF THE LIST.T;C ; INPUTS:.;0(; R0=ADDRESS OF THE TWO WORD LISTHEAD.+; R1=ADDRESS OF THE ENTRY TO BE INSERTED. ;S ; OUTPUTS:;M0; THE ENTRY IS LINKED TO THE END OF THE QUEUE.;A(; R0 AND R1 ARE PRESERVED ACROSS CALL.;- .ENABL LSB(9$QINSF::MOV 2(R0),R2 ;GET ADDRESS OF LAST ENTRY IN LIST! BR 20$ ;FINISH IN COMMON CODET;+); **-$QINSP-QUEUE INSERTION BY PRIORITYD;AC; THIS ROUTINE IS CALLED TO INSERT AN ENTRY IN A PRIORITY ORDEREDOA; LIST. THE LIST IS SEARCHED UNTIL AN ENTRY IS FOUND THAT HAS A =; LOWER PRIORITY OR THE END OF THE LIST IS REACHED. THE NEWT@; ENTRY IS THEN LINKED INTO THE LIST AT THE APPROPRIATE POINT.;H ; INPUTS:A; (; R0=ADDRESS OF THE TWO WORD LISTHEAD.+; R1=ADDRESS OF THE ENTRY TO BE INSERTED.;;D; ; OUTPUTS:;S2; THE ENTRY IS LINKED INTO THE LIST BY PRIORITY.;$(; R0 AND R1 ARE PRESERVED ACROSS CALL.;-.$QINSP::MOV R0,R3 ;COPY ADDRESS OF LISTHEAD010$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT ENTRY* MOV (R2),R3 ;GET ADDRESS OF NEXT ENTRY  BEQ 20$ ;IF EQ END00oBs)sncccc OF LIST>  CMPB T.PRI(R1),T.PRI(R3) ;NEW ENTRY LOWER OR SAME PRIORITY?  BLOS 10$ ;IF LOS YES*  MOV R3,(R1) ;LINK CURRENT TO NEW ENTRY  BR 30$ ;,20$: MOV R1,2(R0) ;SET ADDRESS OF NEW LAST& CLR (R1) ;CLEAR LINK TO NEXT ENTRY/30$: MOV R1,(R2) ;LINK NEW TO PREVIOUS ENTRY  RETURN ;R  .DSABL LSB ;+*; **-$QINSB-QUEUE INSERTION AT BEGINNING;OB; THIS ROUTINE IS CALLED TO INSERT A QUEUE ENTRY INTO A QUEUE AT; THE BEGINNING.; ; INPUTS:;2(; R0=ADDRESS OF THE TWO WORD LISTHEAD.+; R1=ADDRESS OF THE ENTRY TO BE INSERTED.;O ; OUTPUTS: ;4!; THE ENTRY IS LINKED INTO THE QUEUE AT THE FRONT."; #; ALL REGISTERS ARE PRESERVED.$;-%.&$QINSB::MOV (R0),(R1) ;LINK OLD FIRST TO NEW&' BNE 5$ ;IF NE THIS IS NOT NEW LAST%( MOV R1,2(R0) ;SET NEW LAST POINTER))5$: MOV R1,(R0) ;SET NEW FIRST POINTERI * RETURN+,;+4-; **-$QCNTP-QUEUE CONTROL PACKET TO CLI DISPATCHER.; D/; THIS ROUTINE QUEUES SPECIAL PACKETS TO THE CLI DISPATCHER. THESEB0; PACKETS CAN BE "BYE" COMMANDS BEING FORCED ON A TERMINAL LINE,F1; OR A CONTROL PACKET WITH NO COMMAND TEXT SUCH AS A PROMPT REQUEST.2; 3; INPUTS:T4;R@5; R1=STATUS MASK FOR PACKET, OR ZERO TO GENERATE A BYE COMMAND=6; R2=UCB ADDRESS OF TERMINAL COMMAND IS BEING GENERATED FORS7;W 8; OUTPUTS:9;$4:; C=0 PACKET WAS SUCCESSFULLY QUEUED TO DISPATCHER4;; C=1 PACKET MAY NOT HAVE BEEN SUCCESSFULLY QUEUED;<; Z=0 IF THERE WAS A POOL OR SEC POOL ALLOCATION FAILUREC;=; Z=1 IF THE DISPATCHER WAS ALREADY ACTIVE (THIS WILL BE 6>; THE NORMAL RETURN SINCE MCR... IS ALWAYS ACTIVE)?;O@;-A,B$QCNTP::MOV KISAR6,-(SP) ;SAVE OLD MAPPING!C MOV R1,-(SP) ;SAVE STATUS WORDE!D MOV R2,-(SP) ;SAVE UCB ADDRESSD/E MOV #1,R1 ;NEED ONE BLOCK OF SECONDARY POOL F CALL $ALSEC ;ALLOCATE ITG BCS 40$ ;IF CS, NO SEC POOLCH MOV R0,KISAR6 ;MAP NEW BLOCK>I MOV #C.CTCB+140000,R2 ;POINT TO TCB FIELD IN SEC POOL BLOCK J MOV $MCRPT,(R2)+ ;TCB ADDRESSK MOV (SP)+,(R2)+ ;UCB ADDRESSIL CLR (R2)+ ;NO TEXT%M MOV (SP),(R2)+ ;INSERT STATUS WORDT*N CLR (R2)+ ;INIT STARTING RETURN OFFSET1O MOV #433,(R2)+ ;SET TERMINATOR AND BLOCK COUNTG$P TST (SP)+ ;IS THIS A BYE COMMANDQ BNE 20$ ;IF NE NOC7R MOV #3,@#C.CCT+140000 ;SET CHARACTER COUNT FOR "BYE"O8S BIS #CC.MCR,@#C.CSTS+140000 ;FORCE BYE COMMAND TO MCR T MOV #"BY,(R2)+ ;MOVE IN "BYE"U MOVB #'E,(R2)+ ;T$V20$: MOVB #15,(R2)+ ;END WITH A CR W BR QUEPKT ;GO TO COMMON CODE#X40$: CMP (SP)+,(SP)+ ;CLEAN STACK ,Y COM (SP)+ ;SET C, CLEAR Z, AND POP STACK Z RETURN ;T[\;+']; **-$QCPKT-QUEUE COMMAND LINE PACKETS>^; **-$QCLNR-QUEUE COMMAND LINE PACKET WITH NO REQUEST OF CLI_; A`; THESE ROUTINES QUEUE THE SECONDARY POOL COMMAND PACKET TO THE4Ca; APPROPRIATE CLI, AND OPTIONALLY REQUEST IT TO RUN. THEY COMMAND;:b; PACKET IN SECONDARY POOL MUST BE COMPLETELY FILLED IN.c;Vd;, e; INPUTS:0f;VDg; R1=COMMAND PACKET ADDRESS IN SECONDARY POOL (APR BIAS TO MAP IT)h;P i; OUTPUTS:j;CFk; C=0 IF THE CLI WAS SUCCESSFULLY STARTED AFTER QUEUEING THE COMMAND9l; C=1 IF THE CLI MAY NOT HAVE BEEN SUCCESSFULLY STARTED--m; Z=0 IF A POOL ALLOCATION FAILURE OCCUREDI&n; Z=1 IF THE CLI WAS ALREADY ACTIVEo;Y@p; NO STATUS IS RETURNED IF ENTRY WAS AT THE $QCLNR ENTRY POINT3q; SINCE THE QUEUEING OPERATION ITSELF CANNOT FAILDr;Os;-t u .ENABL LSBL.v$QCLNR::CLR R2 ;FLAG TO INDICATE NO REQUEST w BR 10$ ;x$QCPKT::MOV SP,R2 ;NON ZERO-y10$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING=#z MOV R1,KISAR6 ;MAP COMMAND BLOCK 3{QUEPKT: MOV (SP)+,R3 ;GET ORIGINAL KISAR6 MAPPINGT>| MOV @#C.CTCB+140000,-(SP) ;GET TCB ADDRESS TO REQUEST LATER#} MOV (SP),-(SP) ;COPY TCB ADDRESS !~ TST R2 ;WILL CLI BE REQUESTEDA BNE 15$ ;IF NE YES! CLR 2(SP) ;DO NOT REQUEST CLI .15$: MOV @#C.CUCB+140000,R0 ;GET UCB ADDRESS  CALL $MPLND ;FOLLOW REDIRECT* BIT #DV.TTY,U.CW1(R0) ;IS IT A TERMINAL BNE 20$ ;IF NE YES/ MOVB @#C.CBLK+140000,R1 ;GET LENGTH OF BLOCK " MOV00oJs smmmffDATA KISAR6,R0 ;ADDRESS OF BLOCK! MOV R3,KISAR6 ;RESTORE MAPPING  CMP (SP)+,(SP)+ ;CLEAN STACK 7 CALLR $DESEC ;DEALLOCATE PACKET AND FORGET ABOUT ITO+20$: MOV KISAR6,R1 ;GET ADDRESS OF PACKETD! MOV R3,KISAR6 ;RESTORE MAPPINGU .IF DF V$$TRM  MOV (R0),R2 ;GET DCB ADDRESS/ CMP D.NAM(R2),#"VT ;IS IT A VIRTUAL TERMINALS BNE 30$ ;IF NE NOO2 CMP $MCRPT,(SP) ;IS COMMAND GOING TO DISPATCHER BNE 30$ ;IF NE NOY; INCB U.OCNT(R0) ;INCREMENT USE COUNT OF VIRTUAL TERMINALK30$: .ENDC2 MOV #$CLICQ,R0 ;POINT TO COMMAND QUEUE LISTHEAD  CALL $QSPIF ;INSERT IN QUEUE' MOV (SP)+,R0 ;GET TCB ADDRESS OF CLI .IF DF A$$CLI- CMP $MCRPT,R0 ;COMMAND GOING TO DISPATCHERU8 BEQ 40$ ;IF EQ YES, OPTIMIZE BY NOT CHECKING FOR AST9 CALL $DCAST ;DECLARE COMMAND ARRIVAL AST IF SPECIFIED# BCS 40$ ;IF CS, NO AST DECLAREDS1 CLR (SP) ;DO NOT REQUEST CLI SINCE IT GOT AST  .ENDC ;A$$CLI340$: MOV (SP)+,R0 ;GET TCB ADDR OF CLI TO REQUEST BEQ 50$ ;IF EQ, NO REQUEST CALLR $EXRQN ;REQUEST CLIE50$: RETURN ;  .DSABL LSBE;+C; **-$QMCRL-QUEUE COMMAND LINE TO THE CLI OF A SPECIFIED TERMINALPD; **-$QMCR -QUEUE COMMAND LINE TO MCR REQARDLESS OF TERMINAL'S CLI1; **-$QCLIL-QUEUE COMMAND LINE TO SPECIFIED CLIA;MF; THESE ROUTINES QUEUE COMMAND BUFFERS TO A CLI TASK FOR PROCESSING.>; THEY ONLY EXIST TO PROVIDE A COMPATABLE INTERFACE FOR CODEH; THAT HAS NOT BEEN CHANGED TO DEAL WITH THE NEW COMMAND PACKET FORMATG; AND THE USE OF SECONDARY POOL INSTEAD OF SYSTEM POOL. THEY PRESERVE M; THE OLD INTERFACE BY ACCEPTING A STANDARD 84. BYTE PACKET IN SYSTEM POOL,A5; ALLOCATING SECONDARY POOL AND COPYING THE COMMANDTH; TEXT INTO IT. THE SYSTEM POOL IS DEALLOCATED, AND THE SECONDARY POOL<; PACKET USED INSTEAD. THIS ADDS CONSIDERABLE OVERHEAD, SO6; THESE ROUTINES SHOULD NOT BE USED BY ANY NEW CODE.;A ; INPUTS:N;C$; R0=CLI TCB ADDRESS ($QCLIL ONLY)/; R1=ADDRESS OF COMMAND PACKET IN SYSTEM POOL; ; OUTPUTS:;Y?; C=0 IF CLI WAS SUCCESSFULLY REQUESTED WITH THE COMMAND LINEC3; C=1 IF THE REQUEST MAY NOT HAVE BEEN SUCCESSFULOA; Z=0 IF A SYSTEM OR SECONDARY POOL ALLOCATION FAILURE OCCUREDE"; Z=1 IF THE CLI ALREADY ACTIVE;D;-  .ENABL LSB*$QMCRL::CLR -(SP) ;GO TO TERMINAL'S CLI  BR 10$ ;)$QMCR:: MOV #CC.MCR,-(SP) ;FORCE TO MCRY;10$: MOV $MCRPT,-(SP) ;GIVE COMMAND TO COMMAND DISPATCHERE  BR 20$ ;4$QCLIL::CMP $MCRPT,R0 ;IS COMMAND INTENDED FOR MCR BEQ $QMCR ;IF EQ YES# CLR -(SP) ;GO TO TERMINAL'S CLIS# MOV R0,-(SP) ;TCB ADDRESS OF CLIF720$: MOV 2(R1),-(SP) ;GET UCB ADDR OF SOURCE TERMINAL ! BIT #1,(SP) ;PROMPT REQUEST??  BEQ 40$ ;IF EQ NOZ" MOV R1,R0 ;COPY PACKET ADDRESS# MOV #4,R1 ;GET LENGTH OF PACKETL"30$: CALL $DEACB ;DEALLOCATE IT  MOV (SP)+,R2 ;GET UCB ADDRESS BIC #1,R2 ;REMOVE ODD BIT$ CMP (SP)+,(SP)+ ;CLEAN STACKA% MOV #CC.PRM,R1 ;SET PROMPT REQUEST:3 JMP $QCNTP ;CONVERT IT TO PROMPT REQUEST PACKETM+40$: MOV R1,-(SP) ;SAVE ADDRESS OF PACKET'E MOV #/100,R1 ;GET NUMBER OF BLOCKS OF SEC POOLE( CALL $ALSEC ;ALLOCATE SECONDARY POOL BCC 50$ ;IF CC, SUCCESSB2 MOV (SP)+,R0 ;GET ADDRESS OF SYSTEM POOL PACKET/ MOV #M$$CRB,R1 ;LENGTH OF SYSTEM POOL PACKETC4 BR 30$ ;ISSUE A PROMPT FOR LACK OF ANYTHING ELSE*50$: MOV KISAR6,R3 ;SAVE CURRENT MAPPING* MOV R0,KISAR6 ;MAP SECONDARY POOL BLOCK0 MOV (SP)+,R0 ;GET VALUE OFF STACK TEMPORARILY> MOV #C.CUCB+140000,R2 ;POINT TO UCB FIELD IN SECONDARY POOL& MOV (SP)+,(R2)+ ;INSERT UCB ADDRESS' MOV (SP)+,-4(R2) ;INSERT TCB ADDRESSE# CLR (R2)+ ;INIT CHARACTER COUNT  MOV (SP)+,(R2)+ ;STATUS BITSB+ CLR (R2)+ ;INIT STARTING OFFSET OF TEXT ! INC R2 ;SKIP TERMINATOR FIELDF2 MOVB R1,(R2)+ ;INSERT NUMBER OF SEC POOL BLOCKS6 MOV R0,-(SP) ;PUT SYSTEM POOL ADDRESS BACK ON STACK1 CMP (R0)+,(R0)+ ;POINT TO COMMAND TEXT IN POOLO660$: MOVB (R0)+,(R2) ;COPY A CHARA00oRs)snccccCTER INTO SEC POOL) CMPB #15,(R2) ;IS IT A CARRIAGE RETURNI BEQ 70$ ;IF EQ YES! CMPB #33,(R2) ;IS IT AN ESCAPE BEQ 70$ ;IF EQ YES INC R2 ;ADVANCE POINTER * INC @#C.CCT+140000 ;COUNT THE CHARACTER BR 60$ ;NEXT CHARACTER/70$: MOVB (R2),@#C.CTR+140000 ;SET TERMINATORT( MOVB #15,(R2) ;FORCE A CR TO END TEXT+ MOV (SP)+,R0 ;GET ADDRESS OF POOL PACKETP MOV #M$$CRB,R1 ;LENGTH + MOV R3,-(SP) ;SAVE ORIGINAL KISAR6 VALUED CALL $DEACB ;DEALLOCATE IT3 MOV SP,R2 ;INSURE NON-ZERO TO FORCE CLI REQUESTR! JMP QUEPKT ;GO TO COMMON CODEQ  .DSABL LSBS ;+@ ; **-$SCMDQ-SEARCH COMMAND QUEUE FOR BUFFER FOR SPECIFIED TASK8 ; **-$SRCCQ-SEARCH QUEUE FOR BUFFER FOR SPECIFIED TASK? ; **-$SRUCB-SEARCH QUEUE FOR BUFFER FROM A SPECIFIED TERMINALTI ; **-$SRCQ1-SEARCH QUEUE FROM MIDDLE FOR PACKET WITH SPECIFIED TCB ADDRTI; **-$SRUC1-SEARCH QUEUE FROM MIDDLE FOR PACKET WITH SPECIFIED UCB ADDR ;NI; THESE ROUTINES SEARCH A QUEUE IN SECONDARY POOL FOR SPECIFIC PACKETS.-D; THEY ARE MAINLY INTENDED FOR USE ON THE QUEUE CONTAINING COMMANDD; PACKETS, THAT HAVE A TCB ADDRESS AT OFFSET 2, AND A TERMINAL UCBI; ADDRESS AT OFFSET 4. THE LISTHEAD MUST BE IN EXEC SPACE IF THE SEARCHA; STARTS THERE. THE $SRCQ1 AND $SRUC1 ROUTINES START THE SEARCH F; AT ANY PACKET IN THE QUEUE. THIS PACKET DOES NOT HAVE TO BE MAPPEDE; WHEN THE ROUTINE IS CALLED. NOTE THAT FOR ANY ROUTINE, THE PACKETD"; WILL NOT BE DEQUEUED IF FOUND.;U ; INPUTS:Y1; R0=LISTHEAD ADDRESS (FOR $SRCCQ, $SRUCB ONLY)NG; R0=APR VALUE TO MAP PACKET TO START SEARCH AT ($SRCQ1, $SRUC1 ONLY)T%; R5=TCB OR UCB ADDRESS TO LOOK FORU; ; OUTPUTS:; 5 ; C=1 IF THERE IS NO ENTRY IN THE LIST THAT MATCHES!; C=0 IF THE ENTRY IS FOUND$&"; R0=ADDRESS OF BUFFER THAT MATCHES#;P$;-%& ASSUME C.CTCB,2' ASSUME C.CUCB,4( ) .ENABL LSBT6*$SRUCB::MOV (R0),R0 ;POINT TO FIRST ELEMENT IN LIST9+$SRUC1::MOV #4,R1 ;GET OFFSET TO UCB ADDRESS IN PACKETY, BR 10$ ;GO TO COMMON CODE$9-$SCMDQ::MOV #$CLICQ,R0 ;POINT TO COMMAND QUEUE LISTHEADR6.$SRCCQ::MOV (R0),R0 ;POINT TO FIRST ELEMENT IN LIST9/$SRCQ1::MOV #2,R1 ;GET OFFSET TO TCB ADDRESS IN PACKETE-010$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING=!1 MOV R0,KISAR6 ;MAP FIRST ENTRYD!2 BEQ 40$ ;IF EQ, LIST IS EMPTY+320$: CMP R5,140000(R1) ;IS THIS THE ENTRYB4 BEQ 50$ ;IF EQ YES&5 MOV @#140000,KISAR6 ;MAP NEXT BLOCK 6 BNE 20$ ;IF NE, MORE IN LIST740$: SEC ;NOT FOUNDR*850$: MOV KISAR6,R0 ;GET ADDRESS OF ENTRY$9 MOV (SP)+,KISAR6 ;RESTORE MAPPING : RETURNE ; .DSABL LSB<=>?;+.@; **-$QRMVF-QUEUE REMOVAL FROM FRONT OF LISTA;RBB; THIS ROUTINE IS CALLED TO REMOVE THE NEXT (FRONT) ENTRY FROM ABC; LIST. THE LIST ORGANIZATION MAY BE EITHER FIFO OR BY PRIORITY.D; E; INPUTS:MF;(G; R0=ADDRESS OF THE TWO WORD LISTHEAD.H; I; OUTPUTS:J;S,K; C=1 IF THERE ARE NO ENTRIES IN THE LIST.3L; C=0 IF THE NEXT ENTRY IS REMOVED FROM THE LIST.R%M; R1=ADDRESS OF THE ENTRY REMOVED.EN; O; R0 IS PRESERVED ACROSS CALL.P;-Q R .ENABL LSB .S$QRMVF::MOV R0,R2 ;COPY ADDRESS OF LISTHEAD*T MOV (R2),R3 ;GET ADDRESS OF NEXT ENTRY$U BNE 30$ ;IF NE LIST HAS AN ENTRY V10$: SEC ;NO ENTRIES IN LIST W RETURN ;AXY;+,Z; **-$QRMVA-QUEUE REMOVAL BY BLOCK ADDRESS[;D\; THIS ROUTINE IS CALLED TO REMOVE A PARTICULAR BLOCK FROM A LIST..]; LIST ORGANIZATION MAY BE FIFO OR PRIORITY.^;T _; INPUTS: `;M$a; R0=ADDRESS OF TWO WORD LISTHEAD.(b; R1=ADDRESS OF THE TCB TO SEARCH FOR.c;E d; OUTPUTS:e;-Bf; C=1 IF THERE IS NO ENTRY IN THE LIST THAT MATCHES THE ADDRESS.5g; C=0 IF A MATCHING ENTRY IS REMOVED FROM THE LIST.$%h; R1=ADDRESS OF THE ENTRY REMOVED. i;E$j; R0 IS PRESERVED ACROSS THE CALL.k;-l.m$QRMVA::MOV R0,R3 ;COPY ADDRESS OF LISTHEAD0n15$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT ENTRY+o MOV (R2),R3 ;GET ADDRESS OF NEXT ENNTRYEp BEQ 10$ ;IF EQ END OF LISTq CMP R1,R3 ;ADDRESS MATCH ?r BEQ 30$ ;IF EQ YESs BR 1500oZs smmmffDATA$ ;GO AGAINtu;+*v; **-$QRMVT-QUEUE REMOVAL BY TCB ADDRESSw;IDx; THIS ROUTINE IS CALLED TO REMOVE THE NEXT ENTRY FROM A LIST THATAy; MATCHES A SPECIFIED TCB ADDRESS. THE LIST ORGANIZATION MAY BEMz; EITHER FIFO OR BY PRIORITY. {;SR{; NOTE: IN ADDITION TO MATCHING R1 WITH THE ELEMENTS ON THE LIST, R1 IS ;JWB165J{; ALSO CHECKED AGAINST OFFSET 4 IN EACH ELEMENT ON THE LIST. ;JWB165{; ;JWB165T{; FOR EXAMPLE, R1 COULD BE SET TO A TCB AND THE LISTHEAD COULD POINT TO A ;JWB165U{; LIST OF I/O PACKETS. THE PACKET THAT GETS DEQUEUED IS THE ONE WHERE THE ;JWB165 O{; TCB IN R1 MATCHES THE TCB IN THE I/O PACKET (I.TCB AT OFFSET 4). ;JWB165R{; ;JWB165O{; THE $DETRG ROUTINE ALSO USES THIS FEATURE WHEN REMOVING ATTACHMENT ;JWB165AO{; DESCRIPTORS. SEE $DETRG ROUTINE IN MODULE PLSUB FOR MORE DETAILS. ;JWB165O{; ;JWB165 |; INPUTS:.};;'~; R0=ADDRESS OF THE TWO WORD LISTEAD.M(; R1=ADDRESS OF THE TCB TO SEARCH FOR.;C ; OUTPUTS:;WF; C=1 IF THERE IS NO ENTRY IN THE LIST THAT MATCHES THE TCB ADDRESS.5; C=0 IF A MATCHING ENTRY IS REMOVED FROM THE LIST.T%; R1=ADDRESS OF THE ENTRY REMOVED.J;R ; R0 IS PRESERVED ACROSS CALL.;- ;JWB165T+ ASSUME ,C.TCB ;JWB165E+ ASSUME ,C.TCB ;JWB165B$ ASSUME I.TCB,C.TCB ;JWB165 ;JWB165U.$QRMVT::MOV R0,R3 ;COPY ADDRESS OF LISTHEAD020$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT ENTRY* MOV (R2),R3 ;GET ADDRESS OF NEXT ENTRY BEQ 10$ ;IF EQ END OF LIST$ CMP R1,R3 ;MATCH ON TCB ADDRESS? BEQ 30$ ;IF EQ YES* CMP R1,C.TCB(R3) ;MATCHING TCB ADDRESS? BNE 20$ ;IF NE NOI#30$: MOV (R3),(R2) ;CLOSE UP LIST BNE 40$ ;IF NE NO NEW LAST( MOV R2,2(R0) ;SET ADDRESS OF NEW LAST/40$: MOV R3,R1 ;SET ADDRESS OF ENTRY REMOVEDI CLC ;SUCCESSW  RETURN ;  .DSABL LSBQ;+<; **-$QSPIB-QUEUE INSERTION AT BEGINNING IN SECONDARY POOL;FA; THIS ROUTINE IS CALLED TO INSERT AN ENTRY INTO A QUEUE AT THE1K; BEGINNING. THE QUEUE MUST BE IN SECONDARY POOL, WITH A STANDARD 2 WORD (; LISTHEAD IN THE SYSTEM POOL OR SYSCM;S ; INPUTS:$; /; R0=ADDRESS OF 2 WORD LISTHEAD IN EXEC SPACEBH; R1=ADDRESS OF ENTRY TO BE INSERTED. ENTRY MUST BE IN SECONDARY POOL<; THIS VALUE WILL BE LOADED INTO AN APR TO MAP THE ENTRY.;;R ; OUTPUTS:;S2; THE ENTRY IS INSERTED IN THE LIST AT THE FRONT;I; ALL REGISTERS ARE PRESERVEDR;E;- $QSPIB:: .IF DF P$$OOL8 MOV (R0),-(SP) ;SAVE ADDRESS OF CURRENT FIRST IN LIST' MOV KISAR6,-(SP) ;SAVE APR 6 MAPPINGY* MOV R1,KISAR6 ;MAP ENTRY TO BE INSERTED= MOV 2(SP),@#140000 ;LINK NEW ENTRY TO PREVIOUS FIRST ENTRYE- MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGE( TST (SP)+ ;WAS IT NEW LAST IN LIST ?( BNE 10$ ;IF NE, THIS IS NOT NEW LAST% MOV R1,2(R0) ;SET NEW LAST POINTERS*10$: MOV R1,(R0) ;SET NEW FIRST POINTER  RETURNT;+3; **-$QSPIF-QUEUE INSERTION AT END OF LIST (FIFO)D;OC; THIS ROUTINE IS CALLED TO MAKE AN ENTRY IN A FIRST IN FIRST OUTM6; LIST. THE ENTRY IS LINKED TO THE END OF THE LIST.G; THE LIST MUST BE IN SECONDARY POOL, WITH A STANDARD 2 WORD LISTHEADU ; IN THE SYSTEM POOL OR SYSCM.;S ; INPUTS: ;N!; R0=ADDRESS OF 2 WORD LISTHEADIG; R1=ADDRESS OF ENTRY TO BE INSERTED. THIS VALUE WILL BE PUT INTO ANN; APR TO MAP THE ENTRY.;R ; OUTPUTS:;P/; THE ENTRY IS LINKED TO THE END OF THE QUEUE ;T; ALL REGISTERS ARE PRESERVED;H;- .IFTF $QSPIF:: .IFTI TST (R0) ;IS LIST EMPTYY BEQ $QSPIB ;IF EQ YESE! MOV KISAR6,-(SP) ;SAVE MAPPINGO. MOV 2(R0),KISAR6 ;MAP TO LAST BLOCK IN LIST+ MOV R1,@#140000 ;LINK NEW BLOCK AFTER ITU" MOV R1,KISAR6 ;MAP TO NEW BLOCK, CLR @#140000 ;CLEAR LINK WORD TO END LIST- MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGR+ MOV R1,2(R0) ;UPDATE END OF LIST POINTER  RETURNR;+.; **-$QSPRF-QUEUE REMOVAL FROM00obs)sncccc FRONT OF LIST;RB; THIS ROUTINE IS CALLED TO REMOVE THE NEXT (FRONT) ENTRY FROM AD; LIST. THE LIST MUST BE IN SECONDARY POOL WITH A STANDARD 2 WORD$; LISTHEAD IN SYSTEM POOL OR SYSCM;K ; INPUT:;T(; R0=ADDRESS OF LISTHEAD IN EXEC SPACE;O ; OUTPUTS:;V+; C=1 IF THERE ARE NO ENTRIES IN THE LIST ; R1=0 3; C=0 IF THE NEXT ENTRY IS REMOVED FROM THE LIST.U=; R1=ADDRESS OF ENTRY REMOVED. THIS ADDRESS SHOULD BE PUTT!; IN AN APR TO MAP THE ENTRY. ;A"; ALL OTHER REGISTERS PRESERVED;I;- .IFTF $QSPRF:: .IFTM SEC ;ASSUME EMPTY LISTN3 MOV (R0),R1 ;GET ADDRESS OF FIRST BLOCK IN LISTI BEQ 20$ ;IF EQ, EMPTY LIST& MOV KISAR6,-(SP) ;SAVE APR6 MAPPING, MOV R1,KISAR6 ;MAP TO FIRST BLOCK IN LIST/  MOV @#140000,R1 ;GET POINTER TO NEXT IN LISTR,  MOV (SP),KISAR6 ;RESTORE PREVIOUS MAPPING/  MOV (R0),(SP) ;SAVE ADDRESS OF FIRST IN LISTT%  MOV R1,(R0) ;UNLINK FIRST ELEMENT )  BNE 10$ ;IF NE, THERE IS MORE IN LISTR+ MOV R0,2(R0) ;UPDATE END OF LIST POINTERF410$: MOV (SP)+,R1 ;SET ADDRESS OF FIRST FOR RETURN  CLC ;AN ELEMENT WAS REMOVED 20$: RETURN ;+6; **-$QSPIP-QUEUE INSERTION IN SEC. POOL BY PRIORITY;P;; THIS ROUTINE IS CALLED TO INSERT A SECONDARY POOL BLOCKM&; INTO A LIST BY ITS PRIORITY FIELD.; ; INPUTS:I;;%; R0=LISTHEAD ADDRESS IN EXEC SPACES-; R4=OFFSET INTO BLOCK OF LINKWORD + 140000R&; KISAR6 MAPS THE BLOCK TO BE QUEUED;E ; OUTPUTS:!;L "; NONE.V#;($; R0-R3 ARE DESTROYED.N%;-&2'$QSPIP::MOV KISAR6,-(SP) ;SAVE BIAS OF NEW ENTRY6( MOVB 140000+T.PRI,-(SP) ;SAVE PRIORITY OF NEW ENTRY')10$: MOV R0,R2 ;SAVE ADDRESS OF LASTC * MOV R1,R3 ;SAVE BIAS OF LAST*+ MOV R4,R0 ;GET VIRTUAL ADDRESS OF NEXT!, MOV (R2),R1 ;GET BIAS OF NEXTI- BEQ 20$ ;IF EQ END OF LIST#. MOV R1,KISAR6 ;MAP TO NEXT BLOCKE(/ CMPB 140000+T.PRI,(SP) ;BELONG HERE ?0 BHIS 10$ ;IF HIS NO6+120$: TST (SP)+ ;DUMP PRIORITY FROM STACKT%2 MOV R3,KISAR6 ;REMAP TO LAST ENTRYA#3 MOV (SP),(R2) ;LINK TO NEW ENTRYO(4 MOV (SP)+,KISAR6 ;RE-MAP TO NEW ENTRY#5 MOV R1,(R4) ;STUFF LINK POINTERT 6 RETURN ;789;+(:; **-$GTSPK-GET SECONDARY POOL PACKET.;; E<; THIS ROUTINE IS CALLED TO DEQUEUE A SPECIFIC PACKET FROM A QUEUE.1=;T >; INPUTS:I?;B)@; R0=ADDRESS OF LISTHEAD IN EXEC SPACE.6$A; R1=APR VALUE FOR DESIRED PACKET.B;( C; OUTPUTS:D;%E; C=1 IF NO PACKET CAN BE DEQUEUED.P.F; C=0 IF A PACKET WAS SUCCESSFULLY DEQUEUED.=G; R1=ADDRESS OF THE ENTRY REMOVED. THIS ADDRESS SHOULD BE4H; PUT IN AN APR TO MAP THE ENTRY.I;UJ;-K-L$GTSPK::MOV R0,-(SP) ;SAVE LISTHEAD ADDRESSTM MOV R2,-(SP) ;SAVE R2&N MOV KISAR5,-(SP) ;SAVE KERNEL APR 5&O MOV KISAR6,-(SP) ;SAVE KERNEL APR 6%P10$: SEC ;ASSUME PACKET NOT FOUNDD3Q MOV (R0),R2 ;GET ADDRESS OF NEXT PACKET IN LISTRR BEQ 100$ ;IF EQ END OF LISTT.S MOV KISAR5,KISAR6 ;SAVE POINTER TO PREVIOUS3T MOV R2,KISAR5 ;MAP THE NEXT PACKET THROUGH APR 5 *U CMP R1,R2 ;IS THIS THE DESIRED PACKET?V BEQ 50$ ;IF EQ YES/W MOV #120000,R0 ;POINT TO LINK WORD IN PACKETUX BR 10$ ;GET NEXT PACKET-3Y50$: CMP R0,6(SP) ;IS THIS THE FIRST IN THE LIST?2Z BNE 60$ ;IF NE NOS"[ MOV (SP)+,KISAR6 ;RESTORE APR 6#\ CALL $QSPRF ;DEQUEUE THE PACKETS ] BR 110$ ; +^60$: MOV (R0),@#140000 ;UNLINK THE PACKETP#_ BNE 90$ ;IF NE NOT LAST IN LISTN%` MOV 6(SP),R0 ;GET LISTHEAD ADDRESSP+a MOV KISAR6,R2 ;COPY LAST IN LIST ADDRESS ,b MOV (SP),KISAR6 ;RESTORE PREVIOUS MAPPING,c MOV R2,2(R0) ;UPDATE LAST IN LIST POINTERd90$: CLC ;INDICATE SUCCESS'e100$: MOV (SP)+,KISAR6 ;RESTORE APR 6T'f110$: MOV (SP)+,KISAR5 ;RESTORE APR 5Eg MOV (SP)+,R2 ;RESTORE R26)h MOV (SP)+,R0 ;RESTORE LISTHEAD ADDRESSE i RETURN ; jk .ENDClmn .END BR 110$ ; +^60$: MOV (R0),@#140000 ;UNLINK THE PACKETP#_ BNE 90$ ;IF NE NOT LAST IN LISTN%` MOV 6(SP),R0 ;GET LISTHEAD ADDRESSP+a MOV KISAR6,R2 ;COPY LAST IN LIST ADDRESS ,b00js smmmffDATAOF I/O TRANSFER.2; I.PRM+4 -- NUMBER OF BYTES TO BE TRANSFERED.+; I.PRM+6 -- TIME DISPLACEMENT IN TICKS >; I.PRM+10 -- VIRTUAL ADDRES (TO BECOME RELOCATION BIAS) OF; DESTINATION BUFFERC; I.PRM+12 -- FILLED IN WITH DISPLACEMENT ADDRESS OF DESTINATIONS; BUFFER9; I.PRM+14 -- USED TO STORE BUFFER/CLOCK BLOCK ADDRESSN<; I.PRM+16 -- FILLED IN WITH PCB ADDRESS OF OUTPUT BUFFER;- .ENABL LSB  .PAGEC; *****************************************************************O ; * *2; * I N I T I A T I O N E N T R Y P O I N T * ; * *C; *****************************************************************O.BMINI: ; PRE-QUEUING INITIALIZE ENTRY POINTC; ***************************************************************** ; * *6; * ADDRESS CHECK THE SOURCE BUFFER WHILE THE TASKS *3; * CONTEXT IS LOADED, AND FILL IN THE NECESSARY *F%; * PARAMETERS IN THE I/O PACKET *A ; * *C; ***************************************************************** ( MOV R1,R3 ; COPY ADDRESS OF I/O PACKET; MOV I.PRM+10(R1),R0 ; GET VIRTUAL ADDRESS OF SOURCE BUFFER*1 MOV I.PRM+4(R3),R1 ; AND LENGTH OF SOURCE BUFFERRC; +---------------------------------------------------------------+* ; | |,; | THE INPUT PARAMETERS FOR $CKBFR ARE: | ; | |3; | R0 = STARTING ADDRESS OF BLOCK TO BE CHECKED |,.; | R1 = LENGTH OF THE BLOCK TO BE CHECKED |/; | $ATTPT = ADDRESS OF I.AADA IN I/O PACKET |*!; | (ESTABLISHED IN DRQIO) |*6; | CURRENT TASK HEADER MUST BE MAPPED THROUGH APR 6 |.; | (ESTABLISHED BY DIRECTIVE DISPATCHER) | ; | |#; | THE OUTPUT PARAMETERS ARE: |E ; | |2; | C = 0 IF CHECK AND PACKET UPDATE SUCCESSFUL |1; | I.AADA OR I.AADA IN PACKET POINTS TO | 2; | RELATED ADB, P.IOC, A.IOC INCREMENTED |3; | C = 1 IF CHECK UNSUCCESFUL OR I.AADA, I.AADA |!; | ALREADY FILLED IN |C ; | |C; +---------------------------------------------------------------+ 1 CALL $CKBFR ; CHECK BUFFER, INCREMENT A.IOC ANDT# ; P.IOC FOR APPROPRIATE REGIONS  BCC 10$ ; IF CC ALL WAS OKC; ***************************************************************** ; * *1; * SOURCE BUFFER WAS ILLEGAL, FINISH I/O HERE *A ; * *C; ***************************************************************** + MOV #IE.SPC&377,R0 ; SET COMPLETION STATUS* CLR R1 ; AND NUMBER OF BYTES TRANSFERRED .PAGEC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $IOFIN ARE: | ; | |/; | R0 = FIRST WORD OF I/O STATUS TO RETURN |/; | R1 = SECOND WORD OF I/O STATUS TO RETURN |*#; | R3 = ADDRESS OF I/O PACKET | ; | |#; | THE OUTPUT PARAMETERS ARE: | ; | |; | R4 IS DESTROYED | ; | |C; +---------------------------------------------------------------+- CALLR $IOFIN ; COMPLETE I/O AND EXIT DRIVERAC; ***************************************************************** ; * *3; * BUFFER WAS LEGAL, CONVERT VIRTUAL ADDRESS TO * /; * ADDRESS DOUBLEWORD AND STORE PARAMETERS *U ; * *C; *****************************************************************AC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $RELOC ARE: | ; | |-; | R0 = USER VIRTUAL ADDRESS TO RELOCATE |L ; | |#; | THE OUTPUT PARAMETERS ARE: |* ; | |/; | R1 = APR6 RELOCATION BIAS OF USER BUFFER |+; | R2 = DISPLACEMENT IN BLOCK + 140000 |I ; | |C; +---------------------------------------------------------------+*+10$: CALL $RELOC ; RELOCATE BUFFER ADDRESS*5 MOV R1,I.PRM+10(R3) ; SAVE APR BIAS OF SOURCE BUFFER-/ MOV R2,I.PRM+12(R3) ; AND DISPLACEMENT ADDRESS - CLR I.PRM+16(R3) ; INDICATE NOT BUFFERED I/O  .PAGEC; *****************************************************************| ; * */; * NOW QUEUE THE PACKET IN THE DEVICE QUEUE *A ; * *C; ********************************00rs)sncccc*********************************I0 MOV R4,R0 ; COPY POINTER TO I/O QUEUE LISTHEAD' MOV R3,R1 ; AND ADDRESS OF I/O PACKETCC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $QINSP ARE: | ; | |-; | R0 = ADDRESS OF THE TWO WORD LISTHEAD |0; | R1 = ADDRESS OF THE PACKET TO BE INSERTED | ; | |; | NO OUTPUT PARAMETERS | ; | |C; +---------------------------------------------------------------+*& CALL $QINSP ; INSERT PACKET IN QUEUE .PAGEC; *****************************************************************S ; * *.; * BEGIN SERIAL PROCESSING OF I/O PACKETS * ; * *C; ***************************************************************** C; +---------------------------------------------------------------+= ; | |,; | THE INPUT PARAMETERS FOR $GTPKT ARE: | ; | |1; | R5 = ADDRESS OF THE UCB OF REQUESTING UNIT |- ; | |#; | THE OUTPUT PARAMETERS ARE: |L ; | |3; | C = 0 IF A REQUEST WAS SUCCESSFULLY DEQUEUED |*'; | R1 = ADDRESS OF THE I/O PACKET |*"; | R2 = PHYSICAL UNIT NUMBER |; | R3 = CONTROLLER INDEX | '; | R4 = SCB ADDRESS OF CONTROLLER |*!; | R5 = UCB ADDRESS OF UNIT |*/; | C = 1 IF UNIT BUSY OR NO PACKETS QUEUED |- ; | |C; +---------------------------------------------------------------+ .BMIN1: CALL $GTPKT ; ATTEMPT TO GET A REQUEST BCC 20$ ; IF CC WE GOT ONE& RETURN ; DEVICE BUSY OR QUEUE EMPTY20$: ; REFERENCE LABELF .PAGEC; ***************************************************************** ; * *(; * ATTEMPT TO ALLOCATE CLOCK BLOCK * ; * *C; ***************************************************************** % MOV R1,R3 ; COPY I/O PACKET ADDRESSO+ MOV #C.LGTH,R1 ; SET LENGTH OF CLOCK BLOCK-C; +---------------------------------------------------------------+L ; | |,; | THE INPUT PARAMETERS FOR $ALOCB ARE: | ; | |4; | R1 = SIZE OF THE BLOCK TO ALLOCATE (IN BYTES) | ; | |#; | THE OUTPUT PARAMETERS ARE: |* ; | |3; | C = 0 IF A BLOCK WAS SUCCESSFULLY ALLOCATED | C+; | R0 = ADDRESS OF THE ALLOCATED BLOCK |**; | R1 = LENGTH OF THE ALLOCATED BLOCK |/; | C = 1 IF NO BLOCK ISCURRENTLY AVAILABLE |D ; | |C; +---------------------------------------------------------------+-# CALL $ALOCB ; ATTEMPT TO ALLOCATEL BCC 30$ ; IF CC SUCCESSFUL$ MOV #IE.NOD&377,R0 ; SET I/O STATUSC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $IOALT ARE: | ; | |,; | R0 = FIRST WORD OF I/O STATUS BLOCK |,; | R1 = SECOND WORD OF I/O STATUS BLOCK |,; | R2 = STARTING AND FINAL RETRY COUNTS |); | (IF AN ERROR LOGGING DEVICE) | ,; | R5 = UCB ADDRESS OF UNIT TO COMPLETE | ; | |#; | THE OUTPUT PARAMETERS ARE: |T ; | |; | R4 IS DESTROYED | ; | |C; +---------------------------------------------------------------+-$ CALL $IOALT ; AND COMPLETE THE I/O" BR BMIN1 ; GO LOOK FOR MORE WORK630$: MOV R0,I.PRM+14(R3) ; SAVE ADDRESS OF CLOCK BLOCK .PAGEC; *****************************************************************S ; * *.; * DETERMINE IF I/O REQUEST IS BUFFERABLE * ; * *C; *****************************************************************HC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $TSTBF ARE: | ; | |*; | R3 = ADDRESS OF I/O PACKET TO TEST | ; | |#; | THE OUTPUT PARAMETERS ARE: |R ; | |(; | C = 0 IF REQUEST MAY BE BUFFERED |,; | C = 1 IF REQUEST MAY NOT BE BUFFERED | ; | |C; +---------------------------------------------------------------+/ CALL $TSTBF ; TEST FOR BUFFERABLE I/O REQUEST*) BCS 40$ ; IF CS CAN'T ALLOCATE A BUFFER-C; ***************************************************************** ; * *%; * ATTEMPT TO ALLOCATE A BUFFER * ; * *C00zs smmmffDATA; *****************************************************************P* MOV I.PRM+4(R3),R1 ; GET LENGTH OF BUFFER, CMP R1,#BUFLIM ; BIGGER THAN BUFFER LIMIT ?# BHI 40$ ; IF HI YES, DON'T BUFFER C; +---------------------------------------------------------------+- ; | |,; | THE INPUT PARAMETERS FOR $ALOCB ARE: | ; | |4; | R1 = SIZE OF THE BLOCK TO ALLOCATE (IN BYTES) | ; | |#; | THE OUTPUT PARAMETERS ARE: | ; | |3; | C = 0 IF A BLOCK WAS SUCCESSFULLY ALLOCATED | *+; | R0 = ADDRESS OF THE ALLOCATED BLOCK |**; | R1 = LENGTH OF THE ALLOCATED BLOCK |/; | C = 1 IF NO BLOCK ISCURRENTLY AVAILABLE | ; | |C; +---------------------------------------------------------------+-& CALL $ALOCB ; TRY TO ALLOCATE BUFFER" BCS 40$ ; IF CS COULDN'T GET ONE .PAGEC; *****************************************************************( ; * *+; * COPY USER BUFFER TO INTERNAL BUFFER * ; * *C; ***************************************************************** / MOV R0,R4 ; SET ADDRESS OF DESTINATION BUFFERH( MOV R3,R5 ; SAVE ADDRESS OF I/O PACKET, MOV I.PRM+4(R5),R0 ; SET LENGTH OF TRANSFER0 MOV I.PRM+10(R5),R1 ; SET BIAS OF SOURCE BUFFER' MOV I.PRM+12(R5),R2 ; AND DISPLACEMENT - BIC #140000,R2 ; STRIP OFF APR6 ADDRESS BITSN% BIS #120000,R2 ; AND SUBSTITUTE APR5*> MOV R4,I.PRM+10(R5) ; SET INTERNAL BUFFER ADDRESS INTO PACKETC; +---------------------------------------------------------------+* ; | |,; | THE INPUT PARAMETERS FOR $BLXIO ARE: | ; | |%; | R0 = NUMBER OF BYTES TO MOVE |V ; | R1 = SOURCE APR 5 BIAS |!; | R2 = SOURCE DISPLACEMENT |H#; | R3 = DESTINATION APR6 BIAS |S&; | R4 = DESTINATION DISPLACEMENT | ; | |"; | THE OUTPUT PARAMETERS ARE | ; | |; | R0 ALTERED |0; | R1,R3 PRESERVED |7; | R2,R4 POINT TO LAST BYTE OF SOURCE/DESTINATION +1 |A ; | |C; +---------------------------------------------------------------+ ' CALL $BLXIO ; COPY TO INTERNAL BUFFER  .PAGEC; *****************************************************************C ; * *(; * CONVERT TO BUFFERED I/O REQUEST * ; * *C; ***************************************************************** * MOV R5,R3 ; COPY I/O PACKET ADDRESS BACKC; +---------------------------------------------------------------+R ; | |,; | THE INPUT PARAMETERS FOR $INIBF ARE: | ; | |/; | R3 = ADDRESS OF THE I/O PACKET TO BUFFER |- ; | |; | NO OUTPUT PARAMETERS. |F ; | |C; +---------------------------------------------------------------+' CALL $INIBF ; INITIALIZE BUFFERED I/OEC; ****************************************************************** ; * *; * QUEUE THE CLOCK BLOCK *O ; * *C; *****************************************************************-540$: MOV I.PRM+14(R3),R0 ; GET ADDRESS OF CLOCK BLOCKB2 MOV #CLKSRV,C.SUB(R0) ; SET ADDRESS OF SUBROUTINE CLR R1 ; HIGH ORDER DELTA TIME$ MOV I.PRM+6(R3),R2 ; LOW ORDER PART" MOV #C.SYST,R4 ; SET REQUEST TYPE. MOV R3,R5 ; USE PACKET ADDRESS AS IDENTIFIERC; +---------------------------------------------------------------+* ; | |,; | THE INPUT PARAMETERS FOR $CLINS ARE: | ; | |/; | R0 = ADDRESS OF THE CLOCK BLOCK TO QUEUE |**; | R1 = HIGH ORDER HALF OF DELTA TIME |); | R2 = LOW ORDER HALF OF DELTA TIME |D; | R4 = REQUEST TYPE |L4; | R5 = ADDRESS OF REQUESTING TASK OR IDENTIFIER | ; | |; | NO OUTPUT PARAMETERS. |O ; | |C; +---------------------------------------------------------------+A2 CALLR $CLINS ; QUEUE CLOCK BLOCK AND TEMPORARILY ; EXIT THE DRIVER- .PAGEC; *****************************************************************| ; * *); * C L O C K E N T R Y P O I N T *1 ; * *C; ***************************************************************** C; *****************************************************************T ; * *,; * CHECK TO SEE IF THE I/O WAS BUFFERED00s)sncccc * ; * *C; *****************************************************************4CLKSRV: MOV C.TCB(R4),R5 ; GET ADDRESS OF I/O PACKET' TST I.PRM+16(R5) ; WAS IT BUFFERED I/O** BNE 50$ ; IF NE YES, GO QUEUE KERNEL ASTC; ***************************************************************** ; * *1; * COULDN'T BUFFER, PERFORM COPY HERE AND NOW ** ; * *C; ******************************************************************, MOV I.PRM+4(R5),R0 ; SET LENGTH TO TRANSFER, MOV I.PRM+10(R5),R1 ; BIAS OF SOURCE BUFFER. MOV I.PRM+12(R5),R2 ; DISPLEACEMENT OF SOURCE- BIC #140000,R2 ; STRIP OFF APR6 ADDRESS BITSS% BIS #120000,R2 ; AND CONVERT TO APR5 + MOV I.PRM(R5),R3 ; SET BIAS OF DESTINATIONU& MOV I.PRM+2(R5),R4 ; SET DISPLACEMENTC; +---------------------------------------------------------------+N ; | |,; | THE INPUT PARAMETERS FOR $BLXIO ARE: | ; | |%; | R0 = NUMBER OF BYTES TO MOVE |* ; | R1 = SOURCE APR 5 BIAS |!; | R2 = SOURCE DISPLACEMENT |M#; | R3 = DESTINATION APR6 BIAS |M&; | R4 = DESTINATION DISPLACEMENT | ; | |"; | THE OUTPUT PARAMETERS ARE | ; | |; | R0 ALTERED |A; | R1,R3 PRESERVED |7; | R2,R4 POINT TO LAST BYTE OF SOURCE/DESTINATION +1 |E ; | |C; +---------------------------------------------------------------+  CALL $BLXIO ; COPY BUFFERF1 MOV I.PRM+14(R5),R0 ; GET ADDRESS OF CLOCK BLOCKF+ MOV #C.LGTH,R1 ; GET LENGTH OF CLOCK BLOCKI .PAGEC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $DEACB ARE: | ; | |+; | R0 = ADDRESS OF BLOCK TO DEALLOCATE |T*; | R1 = LENGTH OF BLOCK TO DEALLOCATE | ; | |; | NO OUTPUT PARAMETERS. |N ; | |C; +---------------------------------------------------------------+- CALL $DEACB ; DEALLOCATE ITB, MOV R5,R3 ; COPY PACKET ADDRESS FOR $IODON0BMSUC: MOV #IS.SUC&377,R0 ; SET FINAL I/O STATUS8 MOV I.PRM+4(R3),R1 ; AND LENGTH OF TRANSFER = REQUESTED3BMDON: MOV I.UCB(R3),R5 ; GET UCB ADDRESS OF DEVICENC; +---------------------------------------------------------------+L ; | |,; | THE INPUT PARAMETERS FOR $IODON ARE: | ; | |,; | R0 = FIRST WORD OF I/O STATUS BLOCK |,; | R1 = SECOND WORD OF I/O STATUS BLOCK |,; | R2 = STARTING AND FINAL RETRY COUNTS |); | (IF AN ERROR LOGGING DEVICE) |C,; | R5 = UCB ADDRESS OF UNIT TO COMPLETE | ; | |#; | THE OUTPUT PARAMETERS ARE: |N ; | |; | R4 IS DESTROYED | ; | |C; +---------------------------------------------------------------+- CALL $IODON ; COMPLETE THE I/O" BR BMIN1 ; GO LOOK FOR MORE WORK .PAGEC; ***************************************************************** ; * *1; * BUFFERED I/O, CONVERT I/O PACKET TO KERNEL *N!; * AST AND EXIT FROM DRIVER * ; * *C; *****************************************************************550$: MOV R4,R3 ; COPY CLOCK BLOCK ADDRESS FOR $REQUE ( MOV I.TCB(R5),R0 ; POINT TO TCB OF TASK TST (R4)+ ; SKIP LINK WORD% MOV #AK.GBI,(R4)+ ; SET A.CBL=AK.GBI-3 MOV KISAR5,(R4)+ ; SET APR BIAS OF SERVICE ROUTINE 6 MOV #KATSRV,(R4)+ ; SET ADDRESS OF PROCESSING ROUTINE6 MOV R5,(R4)+ ; SAVE I/O PACKET ADDRESS IN CLOCK BLOCKC; +---------------------------------------------------------------+X ; | |,; | THE INPUT PARAMETERS FOR $REQUE ARE: | ; | |.; | R0 = TCB ADDRESS TO QUEUE AST BLOCK TO |+; | R3 = ADDRESS OF THE PACKET TO QUEUE |V ; | |; | NO OUTPUT PARAMETERS. |+ ; | |C; +---------------------------------------------------------------+ " CALLR $REQUE ; QUEUE AST TO TASK .PAGEC; ***************************************************************** ; * *2; * K E R N E L A S T E N T R Y P O I N T * ; * *C; *****************************************************************:C; ***************************************************************** ; * *6; * GET PCB ADDRESS AND SEE IF PARTI00s smmmffDATATION IS RESIDENT * ; * *C; *****************************************************************-.KATSRV: MOV 10(R3),R5 ; GET I/O PACKET ADDRESS7 MOV I.PRM+16(R5),R1 ; GET PCB ADDRESS OF BUFFER REGION*- BEQ 70$ ; IF EQ THERE IS NO COPY TO PERFORM C; +---------------------------------------------------------------+* ; | |,; | THE INPUT PARAMETERS FOR $TSPAR ARE: | ; | |7; | R0 = ADDRESS OF THE PACKET (THE KERNEL AST BLOCK) |7; | R1 = PCB ADDRESS OF THE PCB CONTAINING THE BUFFER | +; | R5 = TCB ADDRESS OF ASSOCIATED TASK |* ; | |"; | THE OUTPUT PARAMETERS ARE | ; | |6; | C = 0 IF REGION IS RESIDENT AND CAN BE ACCESSED |2; | C = 1 IF REGION IS NOT RESIDENT AND AST HAS |; | BEEN QUEUED |R ; | |C; +---------------------------------------------------------------+ " CALL $TSPAR ; REGION IN MEMORY ?" BCC 60$ ; IF CC REGION IN MEMORYC; *****************************************************************O ; * *6; * A REGION AST WAS QUEUED. BUMP BUFFERED I/O COUNT *7; * BACK UP TO FORCE I/O RUNDOWN IN CASE OF ABORT AND * "; * EXIT AST SERVICE ROUTINE. * ; * *C; *****************************************************************A# MOV I.TCB(R5),R0 ; GET TCB ADDRESS ) INCB T.TIO(R0) ; BUMP BUFFERED I/O COUNT-$ RETURN ; EXIT AST SERVICE ROUTINE .PAGEC; ****************************************************************** ; * *&; * PERFORM BUFFER COPY OPERATION * ; * *C; ***************************************************************** /60$: MOV I.TCB(R5),R0 ; GET TCB ADDRESS OF TASK / INCB T.IOC(R0) ; ADJUST REAL I/O COUNT UPWARDS ( MOV I.PRM+4(R5),R0 ; GET COUNT OF BYTES0 MOV I.PRM+10(R5),R2 ; SET SOURCE BUFFER ADDRESS2 MOV P.REL(R1),R3 ; GET STARTING BIAS OF PARTITION% ADD I.PRM(R5),R3 ; AND ADD IN OFFSETI& MOV I.PRM+2(R5),R4 ; SET DISPLACEMENTC; +---------------------------------------------------------------+F ; | |,; | THE INPUT PARAMETERS FOR $BLXIO ARE: | ; | |%; | R0 = NUMBER OF BYTES TO MOVE | ; | R1 = SOURCE APR 5 BIAS |!; | R2 = SOURCE DISPLACEMENT | #; | R3 = DESTINATION APR6 BIAS |V&; | R4 = DESTINATION DISPLACEMENT | ; | |"; | THE OUTPUT PARAMETERS ARE | ; | |; | R0 ALTERED |F; | R1,R3 PRESERVED |7; | R2,R4 POINT TO LAST BYTE OF SOURCE/DESTINATION +1 |E ; | |C; +---------------------------------------------------------------+  CALL $BLXIO ; COPY THE BUFFERR/ MOV I.PRM+10(R5),R0 ; GET BUFFER ADDRESS AGAINF* MOV I.PRM+4(R5),R1 ; GET LENGTH OF BUFFERC; +---------------------------------------------------------------+R ; | |,; | THE INPUT PARAMETERS FOR $DEACB ARE: | ; | |+; | R0 = ADDRESS OF BLOCK TO DEALLOCATE | *; | R1 = LENGTH OF BLOCK TO DEALLOCATE | ; | |; | NO OUTPUT PARAMETERS. |S ; | |C; +---------------------------------------------------------------+- CALL $DEACB ; DEALLOCATE IT  .PAGEC; *****************************************************************M ; * *6; * IF THIS WASN'T A REGION LOAD AST, FINISH THE I/O * ; * *C; *****************************************************************C570$: MOV I.PRM+14(R5),R0 ; RETRIEVE AST BLOCK ADDRESSA) TST (R0) ; WAS THIS A REGION LOAD AST ?E BNE 80$ ; IF NE YES + MOV #C.LGTH,R1 ; SET LENGTH OF CLOCK BLOCK C; +---------------------------------------------------------------+- ; | |,; | THE INPUT PARAMETERS FOR $DEACB ARE: | ; | |+; | R0 = ADDRESS OF BLOCK TO DEALLOCATE | *; | R1 = LENGTH OF BLOCK TO DEALLOCATE | ; | |; | NO OUTPUT PARAMETERS. |* ; | |C; +---------------------------------------------------------------+;' CALL $DEACB ; DEALLOCATE CLOCK BLOCK W< MOV I.IOSB(R5),R3 ; GET VIRTUAL ADDRESS OF I/O STATUS BLOCK2 MOV #IS.SUC&377,-(SP) ; SET FIRST I/O STATUS WORD5 MTPD$ (R3)+ ; WRITE FIRST WORD OF STATUS (MAY TRAP)-6 MOV I.PRM+4(R5),-(SP) ; SET SECOND WORD OF I/O STATUS+ MTPD$ (R3) ; W00ssnccccRITE SECOND WORD (MAY TRAP)C8 CLR I.IOSB(R5) ; PREVENT $IODON ATTEMPT TO WRITE STATUS% MOV R5,R3 ; COPY I/O PACKET ADDRESSA# JMP BMSUC ; FINISH IN COMMON CODE-C; *****************************************************************D ; * */; * RECONVERT REGION LOAD AST TO A TASK AST *U ; * *C; *****************************************************************$80$: MOV R0,R3 ; COPY BLOCK ADDRESS+ CLR 10(R0) ; INDICATE NO BUFFER NEXT TIMES# MOV I.TCB(R5),R0 ; GET TCB ADDRESS C; +---------------------------------------------------------------+M ; | |,; | THE INPUT PARAMETERS FOR $REQUE ARE: | ; | |.; | R0 = TCB ADDRESS TO QUEUE AST BLOCK TO |+; | R3 = ADDRESS OF THE PACKET TO QUEUE |D ; | |; | NO OUTPUT PARAMETERS. |O ; | |C; +---------------------------------------------------------------+*7 CALLR $REQUE ; RE-QUEUE TASK AST AND EXIT AST SERVICEC .PAGEC; ***************************************************************** ; * *#; * MISCELLANEOUS ENTRY POINTS *- ; * *C; ***************************************************************** C; *****************************************************************D ; * *+; * C A N C E L E N T R Y P O I N T *U ; * *7; * WE COULD DEQUEUE PENDING CLOCK REQUEST, ETC HERE, *-4; * BUT WE DON'T, WE JUST LET THEM COMPLETE LATER * ; * *C; ******************************************************************BMCAN:C; ***************************************************************** ; * *-; * T I M E O U T E N T R Y P O I N T ** ; * *9; * SINCE THERE'S NO PHYSICAL DEVICE TO TIME OUT, NO-OP ** ; * *C; *****************************************************************UBMOUT:C; ***************************************************************** ; * *0; * P O W E R F A I L E N T R Y P O I N T * ; * *4; * POWERFAIL DOESN'T AFFECT NON-EXISTENT DEVICES * ; * *C; ***************************************************************** BMPWF:C; ***************************************************************** ; * *9; * S T A T U S C H A N G E E N T R Y P O I N T S ** ; * *7; * DON'T NEED TO TOUCH NON-EXISTENT DEVICE, JUST LET *$; * EXEC PUT DEVICE ON/OFF LINE * ; * *C; ***************************************************************** BMKRB:BMUCB:' RETURN ; ALL THESE ARE NO-OP FOR NOWE .ENDECES * ; * *C; ****************/ .TITLE BMTAB - DATA BASE FOR BLOCK MOVE DRIVER .IDENT /01/;O"; COPYRIGHT (c) 1981, 1982 BY(; DIGITAL EQUIPMENT CORPORATION, MAYNARD'; MASSACHUSETTS. ALL RIGHTS RESERVED.*; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED*A; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE*A; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISCA; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OREA; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO ANDA2; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; A; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTAA; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;SA; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFM<; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;R; VERSION: 01.00; DATE: 1-APR-82Y; AUTHOR: MARIO DENOBILIY;T4; LOADABLE DATA BASE FOR EXAMPLE BUFFERED I/O DRIVER;R; MACRO LIBRARY CALLSN; .MCALL CLKDF$ .MCALL HWDDF$ .MCALL SCBDF$ . .MCALL UCBDF$ T% CLKDF$ ;DEFINE CLOCK BLOCK OFFSETSA$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ SCBDF$ ,,SYSDEF ;DEFINE SCB OFFSETS UCBDF$ ;DEFINE UCB OFFSETS $BMDAT:: .PAGE;R; BM DCB;H $BMTBL=0 ;LOADABLE BMDRV $BMDCB:: .WORD 0 ; D.LNK  .WORD .BM0 ; D.UCB .ASCII /BM/ ; D.NAM  .BYTE 0,1-1 ; D.UNIT,D.UNIT+1R .WORD BMND-BMST ; D.UCBLE .WORD $BMTBL ; D.DSP ; D.MSK - FUNCTION MAS00ssmmmffDATAKS/ .WORD 33 ; LEGAL 0-17 IO.KIL,IO.WLB,IO.ATTD ; IO.DET/ .WORD 31 ; CONTROL 0-17 IO.KIL,IO.ATT,IO.DETT .WORD 0 ; NOOP 0-17A .WORD 0 ; ACP 0-17D .WORD 4 ; LEGAL 20-37 IO.WVB .WORD 0 ; CONTROL 20-37B .WORD 0 ; NOOP 20-37  .WORD 0 ; ACP 20-37L .WORD 0 ; D.PCBB .PAGE;.; BM UCB'S;O PR0=0BMST=. .IF DF M$$MUP .WORD 0 .ENDC.BM0:: .WORD $BMDCB ; U.DCB .WORD .-2 ; U.RED$ .BYTE UC.QUE,0 ; U.CTL,U.STSU .BYTE 0,US.OFL ; U.UNIT,U.ST2 .WORD DV.REC ; U.CW1 .WORD 0 ; U.CW2  .WORD 0 ; U.CW3O .WORD 72. ; U.CW47 .WORD $BM0 ; U.SCB  .WORD 0 ; U.ATT  .WORD 0,0 ; U.BUF,U.BUF+20 .WORD 0 ; U.CNTEBMND=.;W; BM SCB'S;O$BM0:: .WORD 0,.-2 ; S.LHD0 .WORD 0,0,0,0 ; S.FRK  .WORD 0 ; S.KS5  .WORD 0 ; S.PKT .BYTE 0,0 ; S.CTM,S.ITM0 .BYTE 0,0 ; S.STS,S.ST3M .WORD 0 ; S.ST2C. .WORD 0 ; S.KRB - NO KRB SINCE NO CONTROLLER$BMEND:: E .END,0 ; U.CTL,U.STSU .BYTE 0 .TITLE CLOCK .NLIST BEX; CONDITIONAL ASSEMBLY CONTROLS8 .IF NDF POT ; ONLY ACCEPT THE FOLLOWING DEFINITIONS IF- ; THE SYMBOL POT IS UNDEFINED. IF POT IS- ; ALREADY DEFINED, THE FILE CLOCK.MAC HAS) ; BEEN ASSEMBLED WITH THE PREFIX FILE+ ; CLKPRE.MAC, THE OUTPUT OF THE CLKGEN  ; PROCEDURE.G; THE FOLLOWING SYMBOLS ALLOW YOU TO TAILOR THE PROGRAM TO YOUR SYSTEM.6POT = 1 ; PARENT-OFFSPRING TASKING (SPWN$ DIRECTIVE)( ; 1 IF SUPPORTED, 0 IF NOT SUPPORTED. ; PARENT-OFFSRPING TASKING IS SUPPORTED IN+ ; MOST M-PLUS AND M 3.2 SYSTEMS, BUT ISN) ; NOT AVAILABLE IN EARLIER M SYSTEMS. 5 .IF GT POT ; IF SPWN$ NOT SUPPORTED, YOU CAN'T HAVE  ; RMD OR DCL7RMDSPT = 1 ; RMD (SYSTEM DISPLAY) - 1 IF SUPPORTED, 03 ; IF NOT SUPPORTED. FOR THIS FUNCTION TO WORK,R* ; THE TASK MUST BE INSTALLED AS ...RMD6DCLSPT = 1 ; DCL SUPPORT - 1 IF SUPPORTED, 0 IF NOT.. ; DCL IS SUPPORTED IN MOST M-PLUS SYSTEMS,! ; NOT AVAILABLE ON M SYSTEMS./ .IFF ; IF NO PARENT-OFFSPRING TASKING, FORCE  ; RMDSPT AND DCLSPT TO 0 RMDSPT = 0 DCLSPT = 0 .ENDC*INITX = 11. ;INITIAL HORIZONTAL POSITION'INITY = 3. ;INITIAL VERTICAL POSITIONM .ENABL LC FORCHR = 'aR .DSABL LC2 .ENDC ; END OF COND. BLOCK THAT DEFINES DEFAULT% ; VALUES IF PREFIX FILE NOT USED. - .MCALL EXIT$S,DIR$,QIOW$,GTIM$S,QIOW$C,QIO$C;6 .MCALL WTSE$S,MRKT$S,ASTX$S,QIO$,SETF$S,CMKT$S,CLEF$S .MCALL QIOW$S,DRERR$ .IF GT POT  .MCALL SPWN$S .ENDC ; DEFINITIONS 9 .MACRO PRINT A,B ;MACRO TO PRINT LENGTH B FROM ADDRESS AL MOV A,OUTDPB+Q.IOPL ;ADDRESS0 MOV B,OUTDPB+Q.IOPL+2 ;LENGTH DIR$ #OUTDPB ;EXECUTE THE QIO  .ENDM@ .MACRO PRINCR A,B ;MACRO TO PRINT AS ABOVE, EXCEPT NO CAR. RET.= MOV #053,OUTDPB+Q.IOPL+4 ;VERTICAL FORMAT CODE FOR OVERPRINTS PRINT A,B8 MOV #040,OUTDPB+Q.IOPL+4 ;RESTORE NORMAL FORMAT CONTROL .ENDM; .MACRO IOFNCT FUNC ;MACRO TO DO A PARTICULAR I/O FUNCTION ? MOV OUTDPB+Q.IOFN,-(SP) ;PUSH CURRENT I/O FUNCTION CODE TO STKI> MOV #FUNC,OUTDPB+Q.IOFN ;PLACE FUNCTION CODE IN FUNCTION WORD DIR$ #OUTDPB ;DO THE FUNCTION/ MOV (SP)+,OUTDPB+Q.IOFN ;RESTORE PREVIOUS CODE; .ENDM+NUMCOM = 7. ;NUMBER OF AVAILABLE COMMANDSO/ .IF GT POT ;TEST FOR PARENT-OFFSPRING TASKINGU3NUMCOM = NUMCOM+1 ;IF AVAILABLE, YOU GET M COMMANDP% .IF GT RMDSPT ;TEST FOR RMD SUPPORTS3NUMCOM = NUMCOM+1 ;IF AVAILABLE, YOU GET S COMMANDF .ENDC% .IF GT DCLSPT ;TEST FOR DCL SUPPORTM3NUMCOM = NUMCOM+1 ;IF AVAILABLE, YOU GET D COMMANDE .ENDC .ENDC.HOURS = TIMEIN+G.TIHR ;POINTER TO HOURS FIELD/MINS = TIMEIN+G.TIMI ;POINTER TO MINUTES FIELDP/SECS = TIMEIN+G.TISC ;POINTER TO SECONDS FIELD7XPOS = OUTDPB+Q.IOPL+4 ;POINTER TO VERT. CURSOR CONTROL 8YPOS = OUTDPB+Q.IOPL+5 ;POINTER TO HORIZ. CURSOR CONTROL .PAGE1; CONTROL AREA. EVERYTHING ELSE COMES FROM HERE.M6CLOCK: QIOW$C SF.GMC,5,2,,,, ;GET TERM. TYPE$ CMPB TYPBUF+1,#T.VT52 ;IS IT A VT52+ BEQ 10$ ;YES, GIVE IT AN ESCAPE SEQUENCEB% CMPB TYPBUF+1,#T.V10000ssncccc ;IS IT A VT100+ BEQ 10$ ;YES, GIVE IT AN ESCAPE SEQUENCEE$ BR UNDTRM ;NO, NEITHER ONE - EXIT010$: DIR$ #SMCDPB ;DECLARE TERMINAL CAPABLE OF! ;GENERATING ESCAPE SEQUENCESO+ IOFNCT IO.ATT!TF.ESQ ;ATTACH THE TERMINAL=0 PRINT #WHORU,#2 ;ASK TERMINAL TO IDENTIFY TYPE; QIOW$C IO.RLB,5,2,,,, ;READ THE ESCAPE SEQUENCEM% IOFNCT IO.DET ;DETACH THE TERMINALU4 CLRB TCBUF+1 ;PREPARE TO DISABLE ESCAPE SEQUENCES6 DIR$ #SMCDPB ;DISABLE RECOGNITION OF ESC. SEQUENCES/ MOVB #TC.TTP,TCBUF ;PREPARE TO SET TERM. TYPEE6 CMPB IOBUF+1,#'[ ;CHECK SECOND CHARACTER OF SEQUENCE( BEQ VT100 ;IF A BRACKET, IT'S A VT100 CMPB IOBUF+1,#'/ ;CHECK AGAINA BEQ VT52 ;IF A SLASH, A VT5XO@UNDTRM: PRINT #TERROR,#TERRL ;OTHERWISE, NOT A DEFINED TERMINAL( EXIT$S ;PRINT ERROR MESSAGE AND EXIT6VT100: INCB TTTYP ;POSITIVE VALUE IN TTTYP FOR VT100: MOVB #T.V100,TCBUF+1 ;PREPARE TO SET TERM TO VT100 IN SW" BR DSPINI ;PROCEED WITH DISPLAY:VT52: CMPB IOBUF+2,#'K ;CHECK THIRD CHARACTER OF SEQUENCE3 BLT UNDTRM ;IF K OR HIGHER, A VT52; OTHERWISE NO : MOVB #T.VT52,TCBUF+1 ;PREPARE TO SET TERM. TO VT52 IN SW6DSPINI: DIR$ #SMCDPB ;SET TERM. PROPERLY IN SOFTWARE4 CALL CHRALT ; MOVE DISPLAY CHARACTER INTO STORAGE8 CALL REFRSH ;JUMP DIRECTLY TO REFRESH ROUTINE (DEFAULT ;INITIAL ACTION)JINCMND: QIOW$C IO.RVB,5,2,,IOSB,, ;WAIT FOR A COMMAND CHARACTER $TSTFLG: CLEF$S #2 ;CLEAR FLAG NO. 2 TST $DSW ;WAS FLAG SET?S7 BEQ INCMND ;IF NOT, GO BACK AND WAIT FOR IT TO BE SETE/ ; (THREE LINES ABOVE FIX BUG THAT OCCURS IFH0 ; MARK TIME ELAPSES AND SETS FLAG WHILE PRO-0 ; CESSING IS GOING ON, AND THE QIO TURNS OFF ; THE FLAG AGAIN.). MOV COMBUF,R1 ;GET COMMAND CHARACTER INTO R1 * BNE 1$ ;IF CHARACTER PRESENT, PROCESS IT= CMPB IOSB,#IE.EOF ;IF NO CHARACTER PRESENT, CHECK FOR CTRL/ZI2 BNE INCMND ;IF NOT CTRL/Z, WAIT FOR NEXT COMMAND JMP EXIT ;IF CTRL/Z, EXITL:1$: CLR COMBUF ;ERASE CHARACTER FROM BUFFER FOR NEXT TIME- CMP R1,#140 ;CHECK FOR LOWER-CASE CHARACTER ! BLE 2$ ;NOT LOWER-CASE; PROCEEDU6 SUB #40,R1 ;POTENTIALLY LOWER-CASE; CONVERT TO UPPERC2$: MOV #NUMCOM-1,R0 ;SCAN COMMANDS. NUMBER OF AVAIL. COMS. INTO R0A(5$: CMPB R1,COMNAM(R0) ;BE THIS THE ONE? BEQ 7$ ;YES, GO MAKE YOUR JUMP DEC R0 ;NO, TRY THE NEXT ONE! BGE 5$ ; IF THERE IS A NEXT ONEC CALL ILLCOM ;IF NOT, TELL USER& BR TSTFLG ; AND WAIT FOR NEXT ACTION!7$: ASL R0 ;MAKE R0 A WORD INDEXO: JSR PC,@COMADR(R0) ;GO OFF AND DO WHAT YOU'RE SUPPOSED TO% BR TSTFLG ;NOW WAIT FOR NEXT ACTIONB .PAGE); COMMAND PROCESSOR SUBROUTINES, ACCESSEDE;; WITH AN INDEXED JUMP TO SUBROUTINE FROM THE CONTROL AREA.C@; TIME DISPLAY ROUTINE. ENTER WITH DIFPOS=-1 FOR NORMAL UPDATE,/; DIFPOS=0 TO FORCE COMPLETE REFRESH OF DISPLAYUA; THE FOLLOWING CODE GETS THE CURRENT TIME IN BUFFER TIMEIN, THENC=; CALCULATES THE TIME TO THE NEXT REGUALR UPDATE AND ISSUES AN0; MARK TIME REQUEST, SPECIFYING A MART-TIME AST.9UPDATE: IOFNCT IO.KIL ;KILL ANY OUTSTANDING I/O REQUESTS 3 GTIM$S #TIMEIN ;GET CURRENT TIME IN BUFFER TIMEIN * NEG SECS ;NEGATE SECONDS FIELD OF TIMEIN= ADD #60.,SECS ; AND ADD 60 TO YIELD TIME TO NEXT MIN. CHANGES4 CMKT$S ;CANCEL ANY OUTSTANDING MARK-TIME REQUESTS5 MRKT$S ,SECS,#2,#TIMAST ;DO AN AST WHEN TIME CHANGES ?; FOLLOWING CODE CONVERTS BINARY TIME IN TIMEIN TO DECIMAL TIME A; IN TIME. IT ALSO CHECKS EACH DIGIT AND SETS DIFPOS TO THE FIRSTKF; DIGIT THAT IS DIFFERENT. NOTE THAT DIFPOS MUST BE NEGATIVE ENTERINGD; THIS ROUTINE FOR SCAN TO WORK. IF DIFPOS IS 0, ALL DIGITS OF TIME2; ARE UNCONDITIONALLY UPDATED (HANDY FOR REFRESH).0 MOV #HOURS,R2 ;ADDRESS OF HOURS FIELD OF TIMEIN! TST MODE ;12- OR 24-HOUR CLOCK?N3 BGT 10$ ;IF POS., 24-HOUR CLOCK; SKIP SUBTRACTION,! CMP (R2),#12. ;CHECK IF AM OR PMN BLE 10$ ;IF AM, PRINT AS IST/ SUB #12.,(R2) ;IF PM, CONVERT TO 12-HOUR CLOCKM010$: CLR R1 ;R1 KEEPS TRACK OF POSITION IN TIME+20$: CLR R0 ;R0 IS COUNTER FOR DECIMALIZERA 30$: INC R0 1 SUB #10.,(R2) ;TAKE AWAY TEN FROM TIME PARAMETERR) BGE 30$ ;IF NOT NE00ssmmmffDATAGATIVE, TAKE TEN MORER4 DEC R0 ;TOOK TEN TOO MANY, DEC R0 FOR CORRECT TENS7 CALL DIFF ;SEE IF THIS DIGIT DIFFERENT FROM LAST TIME;. MOV (R2),R0 ;GET REMAINDER AFTER SUBTRACTION* ADD #10.,R0 ;ADD TEN TO GET CORRECT ONES# INC R1 ;BUMP THE POSITION COUNTERM7 CALL DIFF ;SEE IF THIS DIGIT DIFFERENT FROM LAST TIME & CMP R1,#4 ;DONE WITH CONVERSION YET?- BGE 40$ ;YES, GO DO SETUP FOR PRINT ROUTINEO) INC R1 ;NO. BUMP R1 PAST COLON TO HOURS) INC R1A/ TST (R2)+ ;BUMP R2 TO MINUTES FIELD OF TIMEINA BR 20$ ;NOW GO DO MINUTES 040$: TST DIFPOS ;WERE THERE ANY NEW CHARACTERS?! BLT DONE ;NO; SUPPRESS PRINTINGF) IOFNCT IO.ATT ;YES. ATTACH THE TERMINALR# CALL GRAFIC ;INVOKE GRAPHICS MODEDD; THE FOLLOWING CODE SCANS THE BUFFER TIME FROM DIFPOS, THE POSITIONB; OF THE FIRST DIGIT THAT IS DIFFERENT FROM BEFORE. IT CONSTRUCTSD; AN OUTPUT BUFFER WITH THE ELEMENTS OF EACH CHARACTER THAT IS TO BEC; OUTPUT TO THE TERMINAL, THEN PRINTS THE BUFFER. IF DOES THIS TENM+; TIMES, ONCE FOR EACH LINE OF THE DISPLAY.O?; THIS ROUTINE USES REGISTERS R0-R4 THROUGHOUT, AND R5 BRIEFLY.?$SCAN: MOV #9.,R4 ;SET UP LINE COUNT? MOVB #INITY,YPOS ;INITIALIZE CURSOR POSITIONER VERT. COMPONENTR810$: MOV DIFPOS,R3 ;GET POSITION OF FIRST DIGIT TO PRINTD MOVB CHRPOS(R3),XPOS ;GET HORIZONTAL CURSOR POSITION OF FIRST DIGIT% MOV #IOBUF,R2 ;ADDRESS OF I/O BUFFERUC20$: MOVB LINOFF(R4),R1 ;GET OFFSET INTO DATA BASE CORRESPONDING TOH ; THE CURRENT LINE NUMBERF1 MOV #10.,R0 ;SET UP COUNT OF CHARACTERS TO MOVE ) CMP R3,#2 ;ARE WE ABOUT TO DO THE COLONI BNE 30$ ;NO, ITS A NUMERAL. ASR R1 ;YES, COLON. CUT OFFSET VALUE IN HALF1 ADD #COLON,R1 ;ADD IN ADDRESS OF COLON DATA BASE % ASR R0 ;CUT CHARACTER COUNT IN HALFE! BR 40$ ;GO MOVE COLON TO BUFFER130$: MOVB TIME(R3),R5 ;GET VALUE OF CURRENT DIGITO: BNE 35$ ;IF DIGIT NONZERO, DO NOT CHECK FOR LEADING ZERO- TST R3 ;IF DIGIT ZERO, IS IT IN POSITION 0?E BNE 35$ ;NO, PRINT IT = MOV #COLON,R1 ;YES, SUPPRESS IT. HANDY STRING OF 10 SPACES.T BR 40$ ;GO MOVE IN THE SPACES (35$: ASL R5 ;MAKE DIGIT INTO WORD INDEXB ADD NUMADD(R5),R1 ;ADD ADDRESS OF DIGIT'S DATA BASE TO LINE OFST.D40$: MOVB (R1)+,(R2)+ ;MOVE CHARACTER FROM DATA BASE TO PRINT BUFFER DEC R0 ;DONE YET? # BGT 40$ ;NO, DO ANOTHER CHARACTER % INC R3 ;BUMP DIGIT POSITION COUNTERO! CMP R3,#5 ;DONE WITH THIS LINE?O# BLT 20$ ;NO, DO ANOTHER CHARACTERF= SUB #IOBUF,R2 ;YES. CALCULATE THE LENGTH OF THE PRINT BUFFERM% PRINT #IOBUF,R2 ; AND PRINT THE LINES& INCB YPOS ;MOVE CURSOR DOWN ONE LINE" DEC R4 ;DECREMENT THE LINE COUNT& BGE 10$ ;IF MORE LINES, PROCESS THEM1 MOVB #1,XPOS ;DONE. RESET CURSOR TO LEFT MARGIN0& PRINT #NULL,#1 ;REPOSITION THE CURSOR" CALL ALPHA ;RETURN TO ALPHA MODE5DONE: MOV #-1,DIFPOS ;INITIALIZE DIFPOS FOR NEXT TIMEC$ IOFNCT IO.DET ;DETACH THE TERMINAL3 RETURN ;GO BACK AND WAIT FOR SOMETHING TO HAPPENN"; EXIT ROUTINE (THIS IS A TOUGHIE)"EXIT: CALL WIPE ;CLEAR THE SCREEN EXIT$SI"; ILLEGAL COMMAND NOTIFIER ROUTINE+ILLCOM: IOFNCT IO.ATT ;ATTACH THE TERMINAL;3 MOVB #INITY+10.,YPOS ;SET UP VERT. CURSOR POSITIONR- MOVB #1,XPOS ;SET UP HORIZ. CURSOR POSITIONT TSTB TTTYP ;CHECK FOR VT100 + BEQ 10$ ;NOT A VT100 - JUST PRINT MESSAGET0 PRINT #BB100,#BB100L ;TURN ON BOLD AND BLINKING)10$: PRINT #ILLMES,#ILLMEL ;PRINT MESSAGE # MOVB #INITY+10.,YPOS ;RESET CURSORW TSTB TTTYP ;A VT100P# BEQ 20$ ;NO, JUST POSITION CURSORG. PRINT #BBOFF,#BBOFFL ;TURN OFF BOLD AND BLINK* BR 30$ ;NOT NECESSARY TO POSITION CURSOR/20$: PRINT #NULL,#1 ;REPOSITION CURSOR TO STARTM.30$: IOFNCT IO.DET ;DONE. DETACH THE TERMINAL% RETURN ;RETURN FOR ANOTHER COMMANDR; REFRESH ROUTINEY5REFRSH: CLR DIFPOS ;FORCE COMPLETE UPDATE OF DISPLAY  CALL WIPE ;CLEAR SCREEN1& CALL UPDATE ;AND GO FILL IN THE TIME RETURNS ; CLEAR BOTTOM OF SCREEN ROUTINE0CLEAR: ;SUBROUTINE TO CLEAR BOTTOM OF SCREEN4 MOVB #INITY+10.,YPOS ;SET UP VERT. CURSOR POSITION. MOVB #1,XPOS ;SET UP HORIZ. CURSOR POSITION! PRINT #NULL,#1 ;POSITION CURSORI% CALL ERASE 00ssncccc;ERASE TO END-OF-SCREENM RETURN ; SET 24-HOUR CLOCK MODE ROUTINE1MODE24: INC MODE ;MAKE CLOCK MODE WORD POSITIVES' CALL CLEAR ;DELETE THE COMMAND CHAR.C* CALL UPDATE ;REFRESH CLOCK IF NECESSARY RETURN1 ; SET 12-HOUR CLOCK MODE ROUTINE)MODE12: CLR MODE ;CLEAR CLOCK MODE WORDU' CALL CLEAR ;DELETE THE COMMAND CHAR.O* CALL UPDATE ;REFRESH CLOCK IF NECESSARY RETURNC@; SPAWN A TASK, WAIT FOR COMPLETION OF TASK, AND RETURN TO CLOCK8 .IF GT POT ;CANT HAVE ANY OF THIS IF PARENT-OFFSPRING ;TASKING ISNT AVAILABLE& .IF GT RMDSPT ;TEST FOR RMD SUPPORT6SPNRMD: MOV #MCRNAM,R0 ;PUT ADDRESS OF MCR NAME IN R02 MOV #RMDNAM,R1 ;PUT ADDRESS OF RMD COMMAND IN R1- MOV #3,R2 ;PUT LENGTH OF RMD COMMAND IN R2  BR SPAWN ;GO SPAWN RMDEMO .ENDC6SPNMCR: MOV #MCRNAM,R0 ;PUT ADDRESS OF MCR NAME IN R01 MOV #MCRPRM,R3 ;PUT ADDRESS OF MCR PROMPT IN R3T' BR PRMPTR ;SKIP TO PROMPTING SECTIONO& .IF GT DCLSPT ;TEST FOR DCL SUPPORT6SPNDCL: MOV #DCLNAM,R0 ;PUT ADDRESS OF DCL NAME IN R01 MOV #DCLPRM,R3 ;PUT ADDRESS OF DCL PROMPT IN R3R .ENDC;PRMPTR: MOV #IOBUF,R1 ;PUT ADDRESS OF CLI INPUT BUF. IN R1M CALL WIPE ;CLEAN THE SCREEN:GETCOM: QIOW$S #IO.RPR,#5,#1,,#IOSB,,) ;OUTPUT A PROMPT AND WAIT FOR A LINEC1 MOV IOSB+2,R2 ;GET NUMBER OF CHARACTERS READ INE0 BEQ SPNDON ;IF NO CHARACTERS, RETURN TO CLOCK?SPAWN: SPWN$S R0,,,,,#4,,,R1,R2, ;SPAWN TASK; SET EFN 4 ON EXITS* BCC 10$ ;IF DIRECTIVE OK, WAIT FOR EXIT* CMP $DSW,#IE.INS ;IS TASK NOT INSTALLED?, BNE SPNDON ;NO, FUNKIER THAN THAT - QUIT.; PRINT #NOTASK,#NOTASL ;PRINT "TASK NOT INSTALLED" MESSAGET, BR NOFRSH ;LEAVE SPAWN WITHOUT REFRESHING'10$: WTSE$S #4 ;WAIT FOR TASK TO EXIT#0 CMP R1,#IOBUF ;IF R1=#IOBUF, CALL WAS TO A CLI' BEQ GETCOM ;GO OUTPUT ANOTHER PROMPTF0SPNDON: CALL REFRSH ;REFRESH THE CLOCK DISPLAYNOFRSH: RETURN) .ENDC ;END OF COND. BLOCK GOVERNED BY + ;PARENT-OFFSPRING TASKING AVAILABILITYC*ALTER: ;ALTERS DISPLAY CHARACTERISTICS CALL WIPE ;CLEAR SCREEN3 MOV #40,XPOS ;SET UP NORMAL CURSOR CURSOR CONTROLK9 PRINT #ALTMES,#ALTMSL ;TELL ABOUT ALTERATIONS AVAILABLE < PRINT #ATOZ,#ATOZL ;PRINT ALPHABET AND INVOKE GRAPHIC MODE% CALL GRAFIC ;SHIFT TO GRAPHIC MODEO, PRINT #ATOZ,#ATOZL ;PRINT GRAPHIC ALPHABET# CALL ALPHA ;RETURN TO ALPHA MODESD10$: QIOW$S #IO.RPR,#5,#1,,#IOSB,,<#IOBUF,#79.,,#YRCHS,#YRCHSL,#044>* ;ASK FOR CHARACTER AND WAIT FOR REPLY, DEC IOSB+2 ;HOW MANY CHARACTERS SUPPLIED?& BLT 20$ ;IF NONE, NO CHANGE; RETURN- BEQ 15$ ;IF ONE, USE IT TO CHANGE DATABASES8 PRINT #TUMANY,#TUMANL ;IF MORE THAN ONE, ERROR MESSAGE BR 10$ ;TRY AGAIN615$: MOVB IOBUF,DSPCHR ;MOVE NEW CHARACTER TO STORAGE& CALL CHRALT ;AND THENCE TO DATABASE-20$: CALL REFRSH ;REFRESH THE CLOCK DISPLAYB RETURN  .PAGE; SUBROUTINE SECTION7DIFF: ;SUBROUTINE TO CHECK IF NEW DIGIT IS DIFFERENTH1 ;FROM PREVIOUS DIGIT AND DO GOOD THINGS IF SOY7 TST DIFPOS ;HAS THE FIRST DIFFERENT DIGIT BEEN FOUND? 5 BGE 10$ ;YES. MOVE IN THE NEW DIGIT UNCONDITIONALLYT4 CMPB R0,TIME(R1) ;NO. COMPARE NEW DIGIT TO PREVIOUS$ BEQ 20$ ;THEY'RE THE SAME. RETURN.9 MOV R1,DIFPOS ;THEY'RE DIFFERENT. SAVE POSITION OF DIGITO010$: MOVB R0,TIME(R1) ;MOVE NEW DIGIT INTO TIME. 20$: RETURN #TIMAST: ;UPDATE-TIME AST ROUTINE7 MOV #'U,COMBUF ;PLACE UPDATE COMMAND IN COMMAND BUFFER 0 TST (SP)+ ;BUMP SP TO PROPER LOCATION FOR EXIT5 SETF$S #2 ;SET EVENT FLAG 2 TO CLEAR THE WAIT STATEH ASTX$S ;RETURN TO PROGRAM@CHRALT: MOV #LSTCHR,R0 ;SUBROUTINE TO ALTER CHAR. GEN. DATA BASE MOVB DSPCHR,R1. MOV #CHAR0,R3#5$: CMPB -(R0),#40 ;CHECK FOR SPACEE BEQ 20$ MOVB R1,(R0)I20$: CMP R0,R3 BNE 5$S RETURNI4WIPE: ;SUBROUTINE TO CLEAR SCREEN AND HOME CURSOR7 MOV #100401,XPOS ;BIT PATTERN FOR POS. 1,1 AND ERASUREN9 PRINT #NULL,#1 ;POSITION CURSOR AT HOME AND ERASE SCREEN  RETURNPF; THE FOLLOWING SUBROUTINE (3 ENTRY POINTS) PERFORMS TERMINAL-SPECIFICD; OUTPUT IN ORDER TO ERASE TO THE END OF THE DISPLAY, ENTER 00ssmmmffDATAGRAPHICS; MODE, AND ENTER ALHPA MODE(ERASE: MOV R0,-(SP) ;SAVE CONTENTS OF R0! TSTB TTTYP ;CHECK TERMINAL TYPEC BEQ 10$ ;IF ZERO, A VT52/ MOV #ERS100,R0 ;GET ERASURE SEQUENCE FOR VT100 BR TTFUN ;PRINT SEQUENCE110$: MOV #ERS52,R0 ;GET ERASURE SEQUENCE FOR VT52T BR TTFUN ;PRINT SEQUENCE)GRAFIC: MOV R0,-(SP) ;SAVE CONTENTS OF R0A! TSTB TTTYP ;CHECK TERMINAL TYPE  BEQ 10$ ;IF ZERO, A VT524 MOV #GRA100,R0 ;GET GRAPHIC MODE SEQUENCE FOR VT100 BR TTFUN ;AND PRINT IT610$: MOV #GRA52,R0 ;GET GRAPHIC MODE SEQUENCE FOR VT52 BR TTFUN ;AND PRINT IT(ALPHA: MOV R0,-(SP) ;SAVE CONTENTS OF R0! TSTB TTTYP ;CHECK TERMINAL TYPET BEQ 10$ ;IF ZERO, A VT522 MOV #ALP100,R0 ;GET ALPHA MODE SEQUENCE FOR VT100 BR TTFUN ;AND PRINT IT410$: MOV #ALP52,R0 ;GET ALPHA MODE SEQUENCE FOR VT521TTFUN: MOV XPOS,-(SP) ;SAVE CONTENTS OF VFC FIELD . CLR XPOS ;SET VFC FIELD TO ZERO (NO CONTROL)! PRINT R0,#3 ;PRINT THE SEQUENCEH" MOV (SP)+,XPOS ;RESTORE VFC FIELD MOV (SP)+,R0 ;RESTORE R0# RETURN; .PAGE; OFFSET AND ADDRESS TABLES 6CHRPOS: ;PRINT POSITION FOR EACH CHARACTER IN PRINT0 ; LINE - USE THESE VALUES AS ARG. TO CURSOR ; POSITIONER. .BYTE INITX ;TENS OF HOURS .BYTE INITX+10. ;ONES OF HOURS  .BYTE INITX+20. ;COLON#! .BYTE INITX+25. ;TENS OF MINUTESO! .BYTE INITX+35. ;ONES OF MINUTESV7LINOFF: ;OFFSET TO THE NTH LINE OF A GIVEN CHARACTER , .BYTE 90.,80.,70.,60.,50.,40.,30.,20.,10.,02COMNAM: ;LETTERS IDENTIFYING AVAILABLE COMMANDS= .ASCII /REC21/ ;REFRESH, EXIT, CLEAR BOTTOM, 24-HR., 12-HR. .ASCII /UA/ ;UPDATE, ALTER/ .IF GT POT ;TEST FOR PARENT-OFFSPRING TASKINGS% .IF GT RMDSPT ;TEST FOR RMD SUPPORTT .ASCII /S/ ;SPAWN RMDEMO F .ENDC; .ASCII /M/ ;SPAWN MCR (FREE WITH PARENT-OFFSPRING TSKNG.).% .IF GT DCLSPT ;TEST FOR DCL SUPPORTE .ASCII /D/ ;SPAWN DCLE .ENDC .ENDC .EVEN5NUMADD: ;ADDRESS OF THE DATA BASE FOR EACH NUMERAL.$ .WORD CHAR0,CHAR1,CHAR2,CHAR3,CHAR4$ .WORD CHAR5,CHAR6,CHAR7,CHAR8,CHAR9)COMADR: ;ADDRESSES OF COMMAND ROUTINESB4 .WORD REFRSH ;JUMP ADDRESS FOR REFRESH ROUTINE (R)/ .WORD EXIT ;JUMP ADDRESS FOR EXIT ROUTINE (E): .WORD CLEAR ;JUMP ADDRESS FOR CLEAR BOTTOM OF SCREEN (C)9 .WORD MODE24 ;JUMP ADDRESS FOR 24-HOUR MODE ROUTINE (2)-9 .WORD MODE12 ;JUMP ADDRESS FOR 12-HOUR MODE ROUTINE (1)/ .WORD UPDATE ;JUMP ADDRESS FOR UPDATE ROUTINE5 .WORD ALTER ;JUMP ADDRESS FOR DISPLAY ALTER ROUTINE./ .IF GT POT ;TEST FOR PARENT-OFFSPRING TASKINGA% .IF GT RMDSPT ;TEST FOR RMD SUPPORT 3 .WORD SPNRMD ;ADDRESS FOR ROUTINE TO SPAWN RMDEMOP .ENDC0 .WORD SPNMCR ;ADDRESS FOR ROUTINE TO SPAWN MCR% .IF GT DCLSPT ;TEST FOR DCL SUPPORT 0 .WORD SPNDCL ;ADDRESS FOR ROUTINE TO SPAWN DCL .ENDC .ENDC .IF GT POT- .IF GT RMDSPT.RMDNAM: .ASCII /RMD/ ;COMMAND NAME FOR RMDEMO .EVEN .ENDC)MCRNAM: .RAD50 /MCR.../ ;TASK NAME OF MCR  .IF GT DCLSPT)DCLNAM: .RAD50 /DCL.../ ;TASK NAME OF DCLT .ENDC .ENDC; USEFUL PRINT STRINGS6ERS100: .BYTE 33,133,112 ;VT100 ERASE-TO-END-OF-SCREEN2ERS52: .BYTE 33,112,0 ;VT52 ERASE-TO-END-OF-SCREEN+GRA100: .BYTE 33,50,60 ;VT100 GRAPHICS MODES)GRA52: .BYTE 33,106,0 ;VT52 GRAPHICS MODEP)ALP100: .BYTE 33,50,102 ;VT100 ALPHA MODEOAALP52: .BYTE 33,107 ;VT52 ALPHA MODE (DON'T SEPARATE FROM NULL:) 5NULL: .BYTE 0 ;NULL CHARACTER FOR CURSOR POSITIONINGC5WHORU: .BYTE 33,132 ;ESC Z QUERIES TERMINAL IDENTITY .ENABL LCABB100: .ASCII <33>/[1;5m/ ;ESC. SEQ. FOR VT100 BOLD/BLINKING TEXTSBB100L =.-BB100 ?BBOFF: .ASCII <33>/[m/ ;ESC. SEQ. TO TURN OFF VT00 DISP. CHARS.VBBOFFL =.-BBOFFO.; FOLLOWING IS TEXT OF ILLEGAL COMMAND MESSAGE&ILLMES: .ASCII /Legal commands are --/- .ASCII <15><12><12>/R - Refresh the display/D .IF GT RMDSPT% .ASCII <11><11>/S - System display /T .ASCII /(RMDEMO)/ .ENDCE .ASCII <15><12>/C - Clear bottom of screen/<11>/E - Exit to monitor/S0 .ASCII <15><12>/1 - Set as a 12-hour clock/<11>$ .ASCII /2 - Set as a 24-hour clock/ .IF GT POTL .ASCII <15><12>&M&= .IF GT DCLSPT .ASCII &/D& .ENDC .ASCII & 00ssncccc- Call MCR&D .IF GT DCLSPT .ASCII &/DCL& .ENDC* .ASCII & (Press to return to clock)& .ENDC- .ASCII <15><12>/A - Alter display character/>ILLMEL = .-ILLMESe .DSABL LC; PSEUDO-CLI PROMPTS .IF GT POTsMCRPRM: .ASCII /MCR>/  .IF GT DCLSPTDCLPRM: .ASCII /DCL>/- .ENDC .ENDC; "TASK NOT INSTALLED" MESSAGE7NOTASK: .ASCII /NO CAN DO - THAT TASK IS NOT INSTALLED/ NOTASL = .-NOTASKuEALTMES: .ASCII /SELECT A NEW DISPLAY CHARACTER ( FOR NO CHANGE)./&" .ASCII /YOUR SELECTION IS --/<12>ALTMSL = .-ALTMESIATOZ: .ENABL LC.) .ASCII /abcdefghijklmnopqrstuvwxyz{|}`~/. .DSABL LCATOZL = .-ATOZ YRCHS: .ASCII <12>/YOUR CHOICE?/YRCHSL =.-YRCHS 4TUMANY: .ASCII /YOU CAN ONLY SPECIFY ONE CHARACTER./TUMANL =.-TUMANYHTERROR: .ASCII /YOU CAN ONLY RUN THE CLOCK ON A VT100 OR VT52. SORRY.../TERRL =.-TERROR #; DATA BASE FOR CHARACTER GENERATORS .ENABL LCCHAR0: .ASCII / aaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaa /CHAR1: .ASCII / aa / .ASCII / aaa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aaaa / .ASCII / aaaa /CHAR2: .ASCII / aaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aaaaaaa / .ASCII / aaaaaaaa /CHAR3: .ASCII / aaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaa /CHAR4: .ASCII / aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaaaa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa /CHAR5: .ASCII / aaaaaaa / .ASCII / aaaaaaa / .ASCII / aa / .ASCII / aa / .ASCII / aaaaaaa / .ASCII / aa aaa / .ASCII / aa / .ASCII / aa / .ASCII / aa aa / .ASCII / aaaaa /CHAR6: .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aaaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaa /CHAR7: .ASCII / aaaaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aaa /CHAR8: .ASCII / aaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaa / .ASCII / aaaaaa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaa /CHAR9: .ASCII / aaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaaa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa /COLON: .ASCII / /I .ASCII / /. .ASCII / // .ASCII / /  .ASCII / /I .ASCII / aaa /. .ASCII / aaa // .ASCII / /  .ASCII / aaa /a .ASCII / aaa / LSTCHR: .DSABL LC .EVEN .PAGE'; IMPURE AREA (NOT TOO IMPURE, I HOPE!)I>OUTDPB: QIOW$ IO.WLB,5,1,,,,<0,0,40> ;DPB FOR OUTPUT OPERATION<SMCDPB: QIOW$ SF.SMC,5,2,,IOSB,, ;DPB FOR SET MULT. ;CHARACTERISTICS OPERATION 9TIMEIN: .BLKW 8. ;BUFFER FOR TIME PARAMETERS FROM GTIM$SS7DIFPOS: .WORD 0 ;WORD TO CONTAIN FIRST DIFFERENT DIGIT.&COMBUF: .WORD 0 ;COMMAND INPUT BUFFER1MODE: .WORD 0 ;CLOCK MODE (0=12-HOUR, +=24-HOUR)!IOSB: .BLKW 2 ;I/O STATUS BUFFER;TCBUF: .BYTE TC.ESQ,1 ;BUFFER TO SET/CLEAR ESCAPE SEQ. REC.;TYPBUF: .BYTE TC.TTP,0 ;BUFFER TO GET TERM. CHARACTERISTICSW.TIME: .BLKB 5 ;5-BYTE BUFFER FOR DECIMAL TIME/TTTYP: .BYTE 0 ;TERMINAL TYPE: 0=VT52, 1=VT100R?DSPCHR: .BYT00ssmmmffDATAE FORCHR ;DISPLAY CHARACTER; INITIALIZE TO DEFAULTB0IOBUF: .BLKB 79. ;PRINT BUFFER (AND CLI COMMAND ; LINE INPUT BUFFER) .END CLOCKIGIT.&COMBUF: .WORD 0 ;COMMAND INPUT BUFFER1MODE: .WORD 0 ;CLOCK MODE (0=12-HOUR, +=24-HOUR)!IOSB: .BLKW 2 ;I/O STATUS BUFFER;TCBUF: .BYTE TC.ESQ,1 ;BUFFER TO SET/CLEAR ESCAPE SEQ. REC.;TYPBUF: .BYTE TC.TTP,0 ;BUFFER TO GET TERM. CHARACTERISTICSW.TIME: .BLKB 5 ;5-BYTE BUFFER FOR DECIMAL TIME/TTTYP: .BYTE 0 ;TERMINAL TYPE: 0=VT52, 1=VT100R?DSPCHR: .BYT .TITLE HIYA .LIST TTM .NLIST BEX .ENABL LC; MACRO LIBRARY CALLS .MCALL EXIT$S,QIOW$,DIR$,GTSK$INDPB: QIOW$ IO.RLB,5,1,,IOST &OUTDPB: QIOW$ IO.WLB,5,1,,IOST,,<,,40>SYSDPB: GTSK$ SYSBUF; LOCAL EQUATES/BSIZE=80. ; ACCEPTS NAMES UP TO 80 CHARACTERS; LOCAL DATA BUFFERS-MSG1: .ASCII /Could I have your name please?/"MSG1L=.-MSG1 ; THE LENGTH OF MSG1&MSGMP: .ASCII /RSX-11M-PLUS calling / %MSGMPL=.-MSGMP ; THE LENGTH OF MSGMPMSGM: .ASCII /RSX-11M calling /"MSGML=.-MSGM ; THE LENGTH OF MSGM1BUFF: .BLKB BSIZE ; SET UP BUFFER LENGTH = BSIZE ,OBUFF: .ASCII /IO ERROR WITH STATUS/<12><15>I1: .ASCII /DSW = /I2: .ASCII /IOST = / OSIZ=.-OBUFF .EVEN IOST: .BLKW 2SSYSBUF: .BLKW 16.; MAIN PROGRAM*HIYA: DIR$ #SYSDPB ; GET TASK ENVIRONMENT MOV #MSG1,R0 ; SET UP CALLs& MOV #MSG1L,R1 ; TO WRITE SUBROUTINE" MOV #40,R2 ; SINGLE SPACE OUTPUT CALL WRITE ; OUTPUT MSG1 MOV #BUFF,R0 ; SET UP CALL $ MOV #BSIZE,R1 ; TO READ SUBROUTINE# CALL READ ; READ NAME INTO BUFFER , MOV R2,-(SP) ; SAVE LENGTH OF READ TO STACK% CMP #1,SYSBUF+G.TSSY; IS IT RSX-11M?> BNE 10$' MOV #MSGM,R0 ; SET UP CALL FOR RSX-11M % MOV #MSGML,R1 ; TO WRITE SUBROUTINEB MOV R1,R4 ; SAVE LENGTH. BR 20$A110$: MOV #MSGMP,R0 ; SET UP CALL FOR RSX-11M-PLUSE& MOV #MSGMPL,R1 ; TO WRITE SUBROUTINE MOV R1,R4 ; SAVE LENGTH %20$: MOV #'$,R2 ; NO CARRIAGE RETURN CALL WRITE ; OUTPUT MESSAGE  MOV #BUFF,R0' MOV (SP)+,R1 ; RECOVER LENGTH OF NAMEU- MOVB #15,BUFF(R1) ; APPEND A CARRIAGE RETURNV INC R1 CLR R2 ;  CALL WRITE ; OUTPUT NAMEB ADD R4,R1 DEC R1 EXIT$S ; LEAVEV;+7; WRITE - SUBROUTINE TO WRITE A MESSAGE TO THE TERMINALI;S ; INPUTS:0; R0 - ADDRESS OF STRING TO BE PRINTED ON SCREEN ; R1 - LENGTH OF STRING TO PRINT.; R2 - LOW-ORDER CHARACTER IS CARRIAGE CONTROL;V ; OUTPUTS:; NONE;; NOTE:V@; WRITE OUTPUTS A PREFORMATTED ASCII STRING. ALL DATA CONVERSION?; (OCTAL NUMBERS TO ASCII, FOR EXAMPLE) MUST BE DONE BEFOREHAND,;-.WRITE:: MOV R0,OUTDPB+Q.IOPL ; FILL IN QIO DPB MOV R1,OUTDPB+Q.IOPL+2U MOV R2,OUTDPB+Q.IOPL+4D DIR$ #OUTDPB  BCS ERR1 ; DIRECTIVE ERROR TSTB IOST ; IO ERROR?  BLT ERR1 ; YES RETURNU;+2; READ - SUBROUTINE TO READ A LINE FROM A TERMINAL;- ; INPUTS:S; R0 - ADDRESS OF INPUT BUFFER+; R1 - MAXIMUM NUMBER OF CHARACTERS TO READ:; ; OUTPUTS:6; R2 - ACTUAL NUMBER OF CHARACTERS READ (NOT INCLUDING; TERMINATING CARRIAGE RETURN;T; NOTE:F=; THIS ROUTINE ONLY READS IN ASCII STRINGS. NO INTERPRETATIONP=; OR DATA CONVERSION IS DONE. NUMBERS READ IN WILL HAVE TO BEU=; CONVERTED TO THEIR BINARY EQUIVALENTS USING THE SYSTEM DATAT; CONVERSION SUBROUTINES.T;-,READ:: MOV R0,INDPB+Q.IOPL ; FILL IN QIO DPB MOV R1,INDPB+Q.IOPL+2 DIR$ #INDPB BCS ERR1 ; DIRECTIVE ERROR TSTB IOST ; IO ERROR?N BLT ERR1 ; YES+ MOV IOST+2,R2 ; RETURN COUNT OF CHARACTERSB RETURNR;+;; ERR1 - ERROR HANDLING ROUTINE FOR DIRECTIVE AND IO ERRORSO;F9; NOTE THAT ONLY ONE OF THE TWO NUMBERS DISPLAYED WILL BET ; SIGNIFICANT ;-0ERR1: MOV #I1+6,R0 ; ADDRESS TO CONVERT DSW INTO$ MOV $DSW,R1 ; DSW VALUE TO CONVERT# CLR R2 ; LEADING ZERO SUPPRESSIONB- CALL $CBDSG ; CONVERT BINARY TO SIGNED DEC.F2 MOV #I2+7,R0 ; ADDRESS TO CONVERT IO STATUS INTO2 MOVB IOST,R1 ; IO STATUS RETURN VALUE TO CONVERT# CLR R2 ; LEADING ZERO SUPPRESSION2( CALL $CBDSG ; CONVERT IO STATUS RETURN+ MOV #OBUFF,OUTDPB+Q.IOPL ; FILL IN QIO DPBE MOV #OSIZ,OUTDPB+Q.IOPL+2' DIR$ 00ssscccc#OUTDPB ; EXECUTE OUTPUT REQUESTP EXIT$SL .END HIYAFICANT ;-0ERR1: MOV #I1+6,R0 ; ADDRESS TO CONVERT DSW INTO$ MOV $DSW,R1 ; DSW VALUE TO CONVERT# CLR R2 ; LEADING ZERO SUPPRESSIONB- CALL $CBDSG ; CONVERT BINARY TO SIGNED DEC.F2 MOV #I2+7,R0 ; ADDRESS TO CONVERT IO STATUS INTO2 MOVB IOST,R1 ; IO STATUS RETURN VALUE TO CONVERT# CLR R2 ; LEADING ZERO SUPPRESSION2( CALL $CBDSG ; CONVERT IO STATUS RETURN+ MOV #OBUFF,OUTDPB+Q.IOPL ; FILL IN QIO DPBE MOV #OSIZ,OUTDPB+Q.IOPL+2' DIR$ .TITLE STARS .NLIST BEX .LIST TTME; DEMONSTRATION SUBROUTINE FOR USE WITH "INTRODUCTION TO RSX-11M AND O; RSX-11M-PLUS" "HIYA" PROGRAM. PRINTS A LINE OF STARS UNDER GREETING MESSAGE.C; INPUTS: R0 CONTAINS ADDRESS OF MESSAGE BUFFER, R1 CONTAINS NUMBER9; OF STARS TO BE PRINTED. R0 AND R1 COME BACK UNCHANGED.5STARS:: MOV R1,R2 ; SET UP TALLY FOR NUMBER OF STARS410$: MOVB #'*,(R0)+ ; FILL MESSAGE BUFFER WITH STARS" DEC R2 ; TO THE CORRECT NUMBER.1 BGT 10$ ; IF NOT FINISHED, STASH ANOTHER STAR0 SUB R1,R0 ; RESTORE ADDRESS OF MESSAGE BUFFER MOV #40,R2 ; CARRIAGE CONTROLO CALL WRITE ; OUTPUT THE STARSH$ RTS PC ; RETURN TO CALLING PROGRAM .ENDREETING MESSAGE.C; INPUTS: R0 CONTAINS ADDRESS OF MESSAGE BUFFER, R1 CONTAINS NUMBER9; OF STARS TO BE PRINTED. R0 AND R1 COME BACK UNCHANGED.5STARS:: MOV R1,R2 ; SET UP TALLY FOR NUMBER OF STARS410$: MOVB #'*,(R0)+ ; FILL MESSAGE BUFFER WITH STARS" DEC R2 ; TO THE CORRECT NUMBER.1 BGT 10$ ; IF NOT FINISHED, S? .TITLE TMCLI - EXAMPLE CLI THAT IMPLEMENTS "T" AND "M" COMMAND .IDENT /1.00/;N; THIS TASK (TMCLI) ILLUSTRATES THE USE OF THE CLI CONTROL DIRECTIVES PRESENT ); IN RSX-11M V4.0 AND RSX-11M-PLUS V2.0. ;F; WHEN SET UP AS A TERMINAL'S CLI, IT PROVIDES THE FOLLOWING COMMANDS:;; T -> TYPE FILE; M -> SET TERMINAL TO MCR;>; IF THE FIRST TWO LETTERS OF THE COMMAND ARE NOT "T" FOLLOWED3; BY A SPACE, OR "M" FOLLOWED BY A CARRIAGE RETURN,8; THE COMMAND IS PASSED TO MCR FOR EXECUTION. THEREFORE,H; USERS AT TERMINALS SET TO THIS CLI WILL SEE THE ENTIRE MCR COMMAND SETF; AS BEING PRESENT, PLUS THE "T" AND "M" COMMANDS. IF THE "DPR" SWITCHF; IS INCLUDED ON THE CLI /INIT COMMAND, USERS WILL KNOW IMMEDIATELY IFG; THEIR TERMINAL IS SET TO THIS CLI BY THE PRESENCE OF THE DOUBLE RIGHT ; ANGLE BRACKET AS THE PROMPT.;OF; IF IT IS INITIALIZED WITH THE SYSTEM MESSAGE OPTION ENABLED, IT WILLD; GREET USERS WHEN THEIR TERMINAL IS SET TO THE CLI, AND SAY GOODBYE ; TO THEM WHEN THEY SWITCH AWAY.;FB; IN ORDER TO BRING THIS CLI UP ON THE SYSTEM, ISSUE THE FOLLOWING; COMMAND SEQUENCE:G;E; >MAC TMCLI,TMCLI/-SP=TMCLI+; >TKB TMCLI,TMCLI/-SP=TMCLI,[1,1]EXELIB/LBT ; >INS TMCLI/CLI=YES/TASK=...TMC9; >CLI /INIT=TMCLI/MESSAGE/DPR="<15><12>/>>/"/TASK=...TMCT;P;; TO SET TERMINALS TO THIS CLI, ISSUE THE FOLLOWING COMMAND6; WHERE TTN: IS REPLACED BY THE TERMINAL NUMBER OR TI:;N; >SET /CLI=TTN:TMCLI ;RH; NOTE THAT THE PROMPT ISSUED IN RESPONSE TO A CONTROL/C DEFAULTS TO THE%; NAME OF THE CLI WHICH IS "TMCLI>". N;HJ; IT CAN BE ELIMINATED FROM THE SYSTEM BY THE FOLLOWING COMMANDS, ASSUMING; NO TERMINALS ARE SET TO IT:B;C; >CLI /ELIM=TMCLI ; >REM ...TMC;IH; EXPERIMENT WITH THE OTHER OPTIONS ON THE CLI /INIT COMMAND, THE ENABLEL; AND DISABLE CLI COMMANDS, AND LEAVING OFF THE /MESSAGE SWITCH ON THE /INITG; COMMAND TO OBSERVE THE EFFECT THEY HAVE. ALSO TRY CHANGING THE /TASK=LE; SWITCH ON THE INS AND CLI /INIT COMMAND TO "/TASK=TMCLI" AND NOTICELJ; THAT ONLY ONE COPY OF THE TASK WILL EXIST FOR ALL TERMINALS, RATHER THANE; ONE PER COMMAND. IF THIS IS DONE, YOU SHOULD ALSO CHANGE THE OPTIONRK; ON THE GCCI$ DIRECTIVE FROM GC.CEX TO GC.CST SO THE TASK WILL STAY ACTIVEE6; BUT STOPPED WHEN NO COMMANDS ARE OUTSTANDING FOR IT.;B + .MCALL GCCI$,RPOI$,EXIT$S,QIOW$,ALUN$,DIR$H;M; DIRECTIVE DPBS;/,GCCI: GCCI$ CMDBUF,CBLEN,IBUF,IBLEN,0,GC.CEXRPOI: RPOI$ MCR... QIOW: QIOW$ IO.WVB,5,1,,,,<,,40> ALUN: ALUN$ 5O N;O; BUFFER AREAS;N?CMDBUF: .BLKB 80.+G.CCBF ;LENGTH = HEADER 00ssmmmffDATAPLUS COMMAND IN BYTESN, ;NOTE THAT ON M-PLUS THE MAXIMUM COMMAND/ ;LENGTH IS 255. BYTES, SO THE LENGTH SHOULDT0 ;BE <255.+G.CCBF> OR CHARACTERS MAY BE LOST. W"CBLEN=.-CMDBUF ;CALCULATE LENGTH .EVEN S<IBUF: .BLKB G.CCCA+2 ;LONG ENOUGH TO CONTAIN ALL INFORMATION IBLEN=.-IBUF ;CALCULATE LENGTH .EVEN CCTCMD: .ASCII /PIP TI:=/ ;BASIC PIP COMMAND TO IMPLEMENT "T" COMMAND !TCLEN=.-TCMD ;LENGTH OF COMMANDL4BUF: .BLKB 80.-TCLEN ;BUFFER TO GENERATE COMMANDS IN .EVEN GAMCR: .ASCII /M/<15> ;STRING TO RECOGNIZE AS A SET TO MCR REQUESTX8MCMD: .ASCII %SET /MCR=TI:% ;SET TERMINAL TO MCR COMMAND!MCLEN=.-MCMD ;LENGTH OF COMMANDA .EVEN E;S=; TEXT TO BE DISPLAYED UPON RECEIPT OF NEW TERMINAL LINKED ORB(; TERMINAL REMOVED MESSAGES FROM SYSTEM.;R8LKT: .ASCII <15><12>/WELCOME TO THE EXAMPLE CLI/<15><12> LKTLEN=.-LKT .EVEN C;RMT: .ASCII <15><12>/GOOD BYE FROM THE EXAMPLE CLI/<15><12>H RMTLEN=.-RMT .EVEN 8;T6; CHARACTERS LOST DUE TO BUFFER BEING TO SMALL MESSAGE;IECHLOST: .ASCII <15><12>/SORRY, PART OF YOUR COMMAND WAS LOST/<15><12>%CLLEN=.-CHLOST T;I; ILLEGAL COMMAND MESSAGE-;D-ILL: .ASCII <15><12>/ILLEGAL COMMAND/<15><12>T ILLLEN=.-ILL .EVEN P;F ; CLI CODE;I D .ENABL LSBN-START: DIR$ #GCCI ;GET A COMMAND FROM SYSTEMI" BCS 100$ ;IF CS, DIRECTIVE ERROR;1E; IF THE GCCI$ DIRECTIVE HAD THE GC.CST OPTION SPECIFIED, WE MAY HAVEE5; JUST BEEN UNSTOPPED, SO WE HAVE TO GET THE COMMAND. ;R* CMP #IS.CLR,$DSW ;WERE WE JUST UNSTOPPED? BEQ START ;IF EQ YES( MOV #CMDBUF,R0 ;POINT TO COMMAND BUFFER% TST (R0) ;IS THIS A SYSTEM MESSAGE? BEQ MSG ;IF EQ YES= CMPB G.CCCT(R0),G.CCCL(R0) ;DID ENTIRE COMMAND FIT IN BUFFERN BLO 150$ ;IF LO NO. MOV #RPOI,R5 ;POINT TO DPB OF RPOI$ DIRECTIVE;CE; AT THIS POINT, THE CLI HAS A COMMAND TO BE PROCESSED. THE CODE FROMD; THE "START:" LABEL TO HERE SHOULD BE FAIRLY COMMON AMONG ALL CLIS.J; FROM THIS POINT ON, THE CODE WILL BE SPECIFIC TO THE PARTICULAR LANGUAGED; THIS CLI IS IMPLEMENTING. COMMANDS CAN BE ADDED OR DELETED AT WILLD; BY MODIFYING CODE IN THIS SECTION. AS STATED ABOVE, THIS EXTREMELYE; SIMPLE CLI PROVIDES TWO COMMANDS, AND GIVES EVERYTHING ELSE TO MCR.NI; THIS CREATES AN OPEN ENDED ENVIRONMENT. REJECTING UNRECOGNIZED COMMANDSIG; INSTEAD OF PASSING THEM TO MCR WOULD LIMIT THE TERMINAL USER'S USE OFFA; THE SYSTEM TO ONLY THOSE OPERATIONS ALLOWED BY THE CLI. THIS ISLH; A SECURE WAY OF CONTROLLING SYSTEM USE, IN CASES WHEN IT IS NECESSARY.?; IN THIS EXAMPLE, CHANGING THE "BNE 50$" BELOW, TO A "BNE 60$"LC; WOULD CREATE AN ENVIRONMENT WHERE THE ONLY OPERATION A USER COULDHH; PERFORM WOULD BE TO TYPE FILES ON THE TERMINAL, OR SWITCH BACK TO MCR.J; ALL OF THE REST OF RSX IS TOTALLY INACCESSABLE. IF NO MEANS OF SWITCHINGD; BACK TO MCR IS PROVIDED, IT WOULD BE IMPOSSIBLE FOR THE USER TO DO2; ANYTHING THE CLI DOES NOT EXPLICITLY LET HIM DO.;L E* CMP #"T ,G.CCBF(R0) ;IS IT A "T" COMMAND? BEQ 10$ ;IF EQ YES) CMP MCR,G.CCBF(R0) ;IS IT A "M" COMMAND?X L;CG; CHANGE THE NEXT INSTRUCTION TO "BNE 60$" TO ELIMINATE PASSING UNKNOWNN; COMMANDS TO MCR.;I BNE 50$ ;IF NE NOE;RB; THE USER HAS ENTERED AN "M" COMMAND, SO SET THE TERMINAL TO MCR.; : MOV #MCMD,R.POBF(R5) ;PUT ADDRESS OF CMD TO ISSUE IN DPB0 MOV #MCLEN,R.POBL(R5) ;PUT LENGTH OF CMD IN DPB BR ISSCMD ;ISSUE COMMAND ;TC; THE USER HAS ENTERED A "T" COMMAND SO CONSTRUCT THE NECESSARY PIPF; COMMAND AND SEND IT TO MCR;1 410$: MOV R0,R1 ;COPY ADDRESS OF BUFFER WITH COMMAND- ADD #G.CCBF+1,R1 ;POINT TO SPACE AFTER THE T 4 MOV #BUF,R2 ;POINT TO BUFFER THAT WILL CONTAIN CMD5 MOV #TCLEN,R4 ;GET LENGTH OF INITIAL PART OF COMMANDA&20$: MOVB (R1)+,R3 ;GET NEXT CHARACTER+ CMPB #15,R3 ;IS IT THE END OF THE COMMANDF BEQ 30$ ;IF EQ YES CMPB #40,R3 ;IS IT A SPACE BEQ 20$ ;IF EQ YES, SKIP IT . MOVB R3,(R2)+ ;PUT CHARACTER IN OUTPUT BUFFER INC R4 ;COUNT CHARACTERH BR 20$ ;GET NEXT CHARACTER<30$: MOV #TCMD,R.POBF(R5);PUT ADDRESS OF CMD TO ISSUE IN DPB, MOV R4,R.POBL(R5) ;INSERT LENGTH OF COMMAND00ssscccc;CE; THIS COMMAND WILL BE PASSED TO THE MAIN COMMAND DISPATCHER (MCR...)MB; WHICH WILL START A COPY OF PIP AND GIVE IT THE COMMAND. THE RPOID; DIRECTIVE COULD BE USED TO GIVE THE COMMAND DIRECTLY TO ...PIP AND<; GIVE THE RESULTING TASK A DIFFERENT NAME. IN THIS EXAMPLE,>; WE COULD CALL THE RESULTING PIP TASK "TYPTNN" WHERE THE LASTD; THREE CHARACTERS (TNN) ARE REPLACED BY A DEVICE NAME CHARACTER ANDA; UNIT NUMBER. FOR EXAMPLE, IF THE "T" COMMAND WAS TYPED ON TT10:.D; THE RESULTING TASK NAME COULD BE MADE TO BE "TYPT10". THIS HAS THEG; ADVANTAGE OF ALLOWING THE TASK TO BE ABORTED BY AN "ABO TYP" COMMAND,PE; INSTEAD OF "ABO PIP", THUS THE USER WOULD NOT HAVE TO KNOW THAT THEHE; "T" COMMAND HE ISSUED IS ACTUALLY BE SERVICED BY THE PIP TASK. THIS @; IS EXACTLY WHAT THE DCL CLI DOES. IT IS NOT DONE HERE IN ORDER@; TO SIMPLIFY THE EXAMPLE. PICKING UP THE TERMINAL NAME AND UNITH; NUMBER, CONVERTING IT TO RAD50, AND SUPPLYING IT IN THE RPOI DIRECTIVEH; ALONG WITH A DIRECT REQUEST OF PIP IS LEFT AS AN EXERCISE TO THE USER.>; (BE CAREFUL ON M-PLUS SYSTEMS WITH MORE THAN 64. TERMINALS).I; NOTE THAT REQUESTING PIP DIRECTLY AVOIDS A SUBSTANTIAL AMOUNT OF SYSTEMA ; OVERHEAD.A;H BR ISSCMD ;EXECUTE COMMAND T;L5; COMMAND IS NOT "T" OR "M", SO GIVE IT TO MCR AS IS. ; @50$: MOV #CMDBUF+G.CCBF,R.POBF(R5) ;PUT ADDRESS OF STRING IN DPB3 MOVB G.CCCT(R0),R.POBL(R5) ;PUT LENGTH IN RPOI DPB  V;I*; ISSUE RPOI$ DIRECTIVE TO EXECUTE COMMAND;R?ISSCMD: MOV (R0),R.PODV(R5) ;PUT NAME OF ISSUING DEVICE IN RPOIS- MOVB G.CCUN(R0),R.POUN(R5) ;COPY UNIT NUMBER 7 MOVB IBUF+G.CCPU,R.POUM(R5) ;PROPOGATE UIC OF TERMINALP MOVB IBUF+G.CCPU+1,R.POUG(R5)C MOV IBUF+G.CCOA,R.POOA(R5) ;COPY ID PARENT IN CASE WE WERE SPAWNED+ DIR$ #RPOI ;PASS COMMAND TO EXECUTOR TASKO BCC START ;IF CC, SUCCESSM BR 110$ ;ERROR );UC; CONTROL IS TRANSFERED HERE IF UNKNOWN COMMANDS ARE TO BE REJECTEDN!; INSTEAD OF BEING PASSED TO MCR.I;T160$: MOV #ILL,R1 ;POINT TO MESSAGE TO BE PRINTED(& MOV #ILLLEN,R2 ;GET LENGTH OF MESSAGE CALL ISSMSG ;ISSUE MESSAGE BR START ;TRY FOR NEXT COMMAND ,;O; ERROR HANDLING CODEF;R A#100$: CLR R0 ;FATAL ERROR ON GCCI$M BR 150$&110$: MOV #1,R0 ;FATAL ERROR ON RPOI$120$: IOT ;FATAL 4150$: MOV #CHLOST,R1 ;POINT TO MESSAGE TO BE PRINTED% MOV #CLLEN,R2 ;GET LENGTH OF MESSAGEU CALL ISSMSG ;ISSUE MESSAGE BR START .DSABL LSBT E;J4; A SYSTEM MESSAGE WAS RECEIVED INSTEAD OF A COMMAND;# ,@MSG: CMPB #CM.LKT,G.CCUN(R0) ;IS IT A NEW TERMINAL LINKED TO US? BEQ 10$ ;IF EQ YES8 CMPB #CM.RMT,G.CCUN(R0) ;IS IT A TERMINAL BEING REMOVED BEQ 20$ ;IF EQ YES6 CMPB #CM.EXT,G.CCUN(R0) ;IS IT A ELIMINATE ALL PACKET BEQ 50$ ;IF EQ YES9 CMPB #CM.ELM,G.CCUN(R0) ;IS IT A CLI ELIMINATION MESSAGEC BEQ 50$ ;IF EQ YES% BR START ;IGNORE ALL OTHER MESSAGES ;G; ISSUE WELCOME MESSAGEM; (10$: MOV #LKT,R1 ;POINT TO MESSAGE TEXT MOV #LKTLEN,R2 ;GET LENGTHS/ ADD #G.CCBF,R0 ;POINT TO TERMINAL THAT WAS SET BR 30$ ; R;;; ISSUE GOOD BYE MESSAGE;O(20$: MOV #RMT,R1 ;POINT TO MESSAGE TEXT MOV #RMTLEN,R2 ;GET LENGTHB' ADD #G.CCBF,R0 ;POINT TO TERMINAL NAME 30$: CALL ISSMSG ;ISSUE MESSAGE JMP START ;GET NEXT COMMANDQ;S=; WHEN AN ELIMINATE ALL MESSAGE IS RECEIVED, EXIT IMMEDIATELYB;5 50$: EXIT$SS B;T; ROUTINE TO PRINT TO TERMINAL;G; ; INPUTS:M;E,; R0=ADDRESS OF NAME OF TERMINAL TO PRINT TO ; R1=ADDRESS OF MESSAGE TO PRINT; R2=LENGTH OF MESSAGE;T ; OUTPUTS:; ; NONE;BF; THIS ROUTINE PRINTS THE SPECIFIED MESSAGE ON THE SPECIFIED TERMINAL.C; ALL ERRORS THAT MIGHT RESULT ARE IGNORED. IN GENERAL, CLIS SHOULDTB; DO ASYNCHRONOUS I/O WITH COMPLETION AST'S, AND PROVIDE A TIMEOUT>; FACILITY TO KILL THE I/O IF IT HASN'T COMPLETED IN A CERTAINA; AMOUNT OF TIME IN ORDER TO PREVENT TERMINAL I/O FROM HOLDING UPT;; COMMAND PROCESSING. THIS IS NOT DONE HERE FOR SIMPLICITY.E;N T1ISSMSG: MOV (R0),ALUN+A.LUNA ;SET UP DEVICE NAMEL( MOVB 2(R0),ALUN+A.LUNU ;AND UNIT NUMBER$ CLRB ALUN+A.LUNU+1 ;CLEAR HIGH BYTE2 DIR$ #ALUN ;ASSI00ssmmmffDATAGN LUN 5 TO THE SPECIFIED DEVICE BCS 10$ ;IF CS, SKIP I/O+ MOV R1,QIOW+Q.IOPL ;SET ADDRESS OF MESSAGEN/ MOV R2,QIOW+Q.IOPL+2 ;INSERT LENGTH OF MESSAGEO$ DIR$ #QIOW ;DO I/O AND WAIT FOR IT 10$: RETURNE N .END START  T OF TIME IN ORDER TO PREVENT TERMINAL I/O FROM HOLDING UPT;; COMMAND PROCESSING. THIS IS NOT DONE HERE FOR SIMPLICITY.E;N T1ISSMSG: MOV (R0),ALUN+A.LUNA ;SET UP DEVICE NAMEL( MOVB 2(R0),ALUN+A.LUNU ;AND UNIT NUMBER$ CLRB ALUN+A.LUNU+1 ;CLEAR HIGH BYTE2 DIR$ #ALUN ;ASSI .TITLE XXDRV XX DEVICE DRIVER .IDENT /09/ F;S;J; XX11 CARTRIDGE DISK DRIVER;R; MACRO LIBRARY CALLSI;P .MCALL HWDDF$,PKTDF$ $ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;E; EQUATED SYMBOLSS;M#LD$XX=0 ; DEFINE LOADABLE DRIVER RETRY=8. ;ERROR RETRY COUNTR'X$$X11=1. ; DEFINE NO. OF CONTROLLERSO;R ; LOCAL DATA;,>; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);N<RTTBL: .BLKW X$$X11 ;ERROR RETRY COUNT AND DRIVE RESET FLAG; ; DIAGNOSTIC FUNCTION TABLE/;F!FUNTBL: .WORD IO.HMS!IQ.UMD, 0515V .WORD IO.BLS!IQ.UMD, 0511!FUNTB0: .WORD IO.RDH!IQ.UMD, 2505H .WORD IO.WDH!IQ.UMD, 2503 .WORD IO.WCK!IQ.UMD, 0507FUNTBE:O;S; DRIVER DISPATCH TABLES;M1 DDT$ XX,X$$X11,,,,NEW ;GENERATE DISPATCH TABLE ;;+3; **-XXINI-XX11 CARTRIDGE DISK CONTROLLER INITIATORO;J; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUESTN; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE EXECU-N; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN ATTEMPTI; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER ISUI; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER-L>; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.; ; INPUTS:X; :; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;E ; OUTPUTS:;EE; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT-RE; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-T; ATION IS INITIATED. ;- .ENABL LSBN9XXINI: GTPKT$ XX,X$$X11 ;GET NEXT I/O PACKET TO PROCESS ;N1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:M;I'; R1=ADDRESS OF THE I/O REQUEST PACKET. -; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.H; R3=CONTROLLER INDEX.(; R4=ADDRESS OF THE STATUS CONTROL BLOCK:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;I0; XX11 CARTRIDGE DISK I/O REQUEST PACKET FORMAT:;R"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK. @; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.J; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR TASK HEADER (UCB).1; WD. 05 -- I/O FUNCTION CODE (IO.RLB OR IO.WLB).C0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.=; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000).T3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.DA; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER.F+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER. -; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.A; WD. 15 -- NOT USED.N9; WD. 16 -- LOW BYTE MUST BE ZERO AND HIGH BYTE NOT USED. 0; WD. 17 -- LOGICAL BLOCK NUMBER OF I/O REQUEST.A; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. ADRS ELSE NOT USEDA4; WD. 21 -- DIAGNOSTIC REG. BLK ADRS (DISPL.+140000);O (= MOV #RETRY&377,RTTBL(R3) ;CLEAR POSITIONING AND SET RETRIESR' CALL $VOLVD ;VALIDATE VOLUME VALID I BCS 8$ ;IF CS WE FAILED  TST R0 ;TRANSFER FUNCTION? D BMI 1$ ;IF MI YES $ TST I.PRM+2(R1) ;SIZE THE DISK?  BPL 8$ ;IF PL NO & ASH #13.,R2 ;POSITION UNIT NUMBER * MOV S.CSR(R4),R0 ;RETRIEVE CSR ADDRESS " MOV R2,6(R0) ;SELECT THE DRIVE MOV R0,R2 ;COPY CSR ADDRESS % JMP 130$ ;PASS REGISTERS AND EXIT D1$: ;REF LABEL  .IF DF M$$EXT O, CALL $STMAP ;SET UP UNIBUS MAPPING ADDRESS .ENDC9 CMPB #IO.HMS/00ssscccc^D<256>,I.FCN+1(R1) ;DIAGNOSTIC FUNCTION? B BNE 5$ ;IF NE NO. MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE-2$: CMP (R0)+,I.FCN(R1) ;FUNCTION CODE MATCH?? BEQ 3$ ;IF EQ YES # TST (R0)+ ;BYPASS CONTROLLER CODEN' CMP #FUNTBE,R0 ;END OF FUNCTION TABLE?  BEQ 5$ ;IF EQ YES( BR 2$ ;TRY AGAIN)3$: CMP R0,#FUNTB0 ;POSITIONING FUNCTION?P BHI 4$ ;IF HI NO6 INCB RTTBL+1(R3) ;YES, INDICATE POSITIONING OPERATION44$: BIS (R0),U.BUF(R5) ;SET CONTROLLER FUNCTION BITS BR 10$ ;GO CHECK BLOCK NUMBER/15$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION 51 BIS #505,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTIONI6 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?' BHIS 9$ ;IF HIS FUNCTION IS ILLEGAL S8$: JMP 120$ ;EXIT .9$: BEQ 10$ ;IF EQ FUNCTION IS READ LOGICAL 5 SUB #2,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTION I-10$: CALL $BLKCK ;CHECK LOGICAL BLOCK NUMBERB- CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBER $ TST R1 ;WHICH SURFACE?  BEQ 15$ ;IF EQ SURFACE 0 ;" BIS #20,R0 ;SET SURFACE 1 BIT 015$: MOVB U.UNIT(R5),R1 ;RETRIEVE UNIT NUMBER * ASH #13.,R1 ;POSITION UNIT SELECT BITS ' ASH #5,R2 ;POSITION CYLINDER NUMBER L2 BIS R1,R2 ;MERGE UNIT BITS WITH CYLINDER NUMBER ( BIS R0,R2 ;MERGE TRK/SEC WITH CYLINDER2 MOV R2,I.PRM+10(R3) ;SAVE STARTING DISK ADDRESS ;E; INITIATE I/O OPERATION;I30$: ;REF LABEL .IF DF M$$EXT % CALL $MPUBM ;MAP UNIBUS TO TRANSFERE .ENDC% MOV S.CSR(R4),R2 ;GET ADDRESS OF CSRS9 MOV S.PKT(R4),R1 ;RETRIEVE ADDRESS OF I/O REQUEST PACKET ; MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNTO+ ADD #6,R2 ;POINT TO DISK ADDRESS REGISTERY, MOV I.PRM+10(R1),(R2) ;INSERT DISK ADDRESS. MOV U.BUF+2(R5),-(R2) ;INSERT BUFFER ADDRESS8 MOV U.CNT(R5),-(R2) ;INSERT NUMBER OF BYTES TO TRANSFER! ROR (R2) ;CONVERT TO WORD COUNTE$ NEG (R2) ;MAKE NEGATIVE WORD COUNT TST -(R2) ;POINT BACK TO CSR+ MOV #IE.DNR&377,R0 ;ASSUME DRIVE NOT READY TSTB -4(R2) ;IS DRIVE READY? BMI 31$ ;IF MI YES/ BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP?M BNE 35$ ;IF NE YES/ BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC OPERATION?  BNE 51$ ;IF NE YES JMP 110$ ;FINISH UP1531$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UP)) MOV U.BUF(R5),(R2) ;LOAD FUNCTION AND GOR RETURNT;+$; CONTROLLER STATUS CHANGE OPERATION;R ; INPUTS:O;E; R2 = KRB ADDRESSG; R3 = CTB ADDRESST;R ; OUTPUTS:; -; CONTROLLER CLEARED ON ON LINE AND OFF LINEE;- T(XXKRB: MOV #1,@(R2) ;;;CLEAR CONTROLLER I;+<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;-#XXCAN: RETURN ;;;NOP FOR THE XX11O N;+:; UNIT STATUS CHANGE OPERATION - CALLED ONCE FOR EACH UNIT;, ; INPUTS:;;E; R3 = CONTROLLER INDEX; R4 = SCB ADDRESS ; R5 = UCB ADDRESST ; C = 0 UNIT OFFLINE TO ONLINE ; C = 1 UNIT ONLINE TO OFFLINE ; $SCERR = 1D;S ; OUTPUTS:; 0; UNIT OFFLINE - RETURN ($SCERR = 1 IS SUCCESS); UNIT ONLINE - RETURNE;- T+XXUCB: BCS XXCAN ;;;IF CS OFFLINE - RETURNI +; >; CODE SPECIFIC TO BRINGING A UNIT ONLINE (FOR EXAMPLE, SEEING@; WHETHER THE UNIT IS A NONEXISTENT DRIVE) COULD BE PLACED HERE.;U H RETURNA N;+0; POWER FAILURE OPERATION - A TRUE POWER FAILURE; @; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT ?; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVE A; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANY =B; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESS "; THE UNIT IS ALREADY READY. ;- I O7XXPWF: TSTB S.STS(R4) ;;;IS THE DRIVE CURRENTLY BUSY? H BEQ 36$ ;;;IF EQ NO V4 MOVB #3,S.STS(R4) ;;;WAIT A MAXIMUM OF 45 SECONDS 335$: MOVB #15.,S.CTM(R4) ;;;15 SECONDS AT A TIME 636$: BISB #US.SPU,U.STS(R5) ;;;SET UNIT SPINNING UP  RETURN S;++; **-$XXINT-XX11 DISK CONTROLLER INTERRUPTS ;-($XXINT:: ;DEFINE INTERRUPT ENTRY POINT8 INTSV$ XX,PR5,X$$X11 ;;;SAVE REGISTERS AND SET PRIORITY- TSTB RTTBL+1(R4) ;;;DRIVE RESET IN PROGRESS?  BEQ 50$ ;;;IF EQ NO-& MOV R4,00stmmmffDATA-(SP) ;;;SAVE CONTROLLER INDEX' MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCB$) MOV @S.CSR(R4),R4 ;;;GET CONTENTS OF CSRA$ BMI 40$ ;;;IF MI DRIVE RESET ERROR' BIT #20000,R4 ;;;DRIVE RESET COMPLETE?  BNE 40$ ;;;IF NE YES TST (SP)+ ;;;CLEAN STACK RETURN ;;; -40$: MOV (SP)+,R4 ;;;RESTORE CONTROLLER INDEXR+50$: CALL $FORK ;;;CREATE A SYSTEM PROCESSU" MOV R4,R3 ;COPY CONTROLLER INDEX% MOV U.SCB(R5),R4 ;GET ADDRESS OF SCBT% MOV S.CSR(R4),R2 ;GET ADDRESS OF CSRE/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERV, MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS 8 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION EXECUTED? 51$: BNE 130$ ;IF NE YES T TST (R2) ;ANY ERRORS? V BPL 65$ ;IF PL NO 4* MOV -2(R2),R1 ;SAVE ERROR STATUS REGISTER053$: MOV S.PKT(R4),R0 ;GET I/O PACKET ADDRESS & BITB #IQ.X,I.FCN(R0) ;INHIBIT RETRIES BNE 80$ ;IF NE YES" DECB RTTBL(R3) ;ANY MORE RETRIES? BLE 80$ ;IF LE NOT" MOV #1,(R2) ;CLEAR CONTROLLER 9 CLRB RTTBL+1(R3) ;CLEAR POSSIBLE DRIVE RESET IN PROGRESSL*55$: BIT #110000,R1 ;DRIVE RESET REQUIRED? BEQ 70$ ;IF EQ NO M560$: MOVB #1,RTTBL+1(R3) ;SET DRIVE RESET IN PROGRESS1. MOVB S.ITM(R4),S.CTM(R4) ;RESET TIMEOUT COUNT, MOV S.PKT(R4),R1 ;GET ADDRESS OF I/O PACKET0 MOV I.PRM+10(R1),6(R2) ;SET PROPER DRIVE NUMBER MOV #515,(R2) ;RESET DRIVEB RETURN ;C165$: ASRB RTTBL+1(R3) ;DRIVE RESET IN PROGRESS?  BCC 75$ ;IF CC NO E!70$: JMP 30$ ;RETRY FUNCTION R;75$: BITB #IO.WLC&377,I.FCN(R1) ;WRITE WITH WRITE CHECK? V BNE 76$ ;IF NE YES - BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED?$ BEQ 110$ ;IF EQ NO276$: MOV U.BUF(R5),R1 ;GET CURRENT FUNCTION CODE - BIT #1*2,R1 ;WRITE OR WRITE CHECK FUNCTION? BEQ 110$ ;IF EQ NO- BIS #2*2,U.BUF(R5) ;SET WRITE CHECK FUNCTION * BIT #2*2,R1 ;WAS FUNCTION A WRITE CHECK? BNE 110$ ;IF NE YES 56 MOV #RETRY&377,RTTBL(R3) ;REINITIALIZE RETRY COUNT ' BR 70$ ;START WRITE CHECK OPERATION F R080$: MOV #IE.WLK&377,R0 ;ASSUME WRITE LOCK ERROR! BIT #20000,R1 ;WRITE LOCK ERROR?S BNE 110$ ;IF NE YES 5/ MOV #IE.WCK&377,R0 ;ASSUME WRITE CHECK ERROR 6 ASR R1 ;GOOD ASSUMPTION? T% BCS 110$ ;IF CS WRITE CHECK ERROR O, MOV #IE.VER&377,R0 ;SET UNRECOVERABLE ERROR0110$: MOV 2(R2),R1 ;GET WORDS LEFT TO TRANSFER , ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFER 7 ADD U.CNT(R5),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED N" MOV #1,(R2) ;CLEAR CONTROLLER (120$: CALL $IODON ;FINISH I/O OPERATION! JMP XXINI ;PROCESS NEXT REQUESTT;KE; DEVICE TIMEOUT RESULTS IN A CONTROL AND DRIVE RESET FOLLOWED BY THEC; I/O OPERATION BEING REPEATED UNLESS THE OPERATION WAS DIAGNOSTIC.MA; TIMEOUTS ARE USUALLY CAUSED BY POWERFAILURE BUT MAY ALSO BE THE7; RESULT OF A HARDWARE FAILURE.$;O9XXOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP? O BEQ 125$ ;;;IF EQ NO / DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET? R BEQ 125$ ;;;IF EQ YES N MTPS #0 ;;;ALLOW INTERRUPTS  JMP 30$ ; /125$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY I5 BICB #US.SPU,U.STS(R5) ;;;RESET DRIVE SPINNING UP D( BIC #100,(R2) ;;;CLEAR INTERRUPT ENABLE MTPS #0 ;;;ALLOW INTERRUPTST. MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS- BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTIONE BEQ 140$ ;IF EQ TIMEOUT DURING ;NORMAL FUNCTION5130$: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASK ) BR 110$ ;DIAGNOSTIC PROCESSING COMPLETE,140$: MOV #110000,R1 ;SET FOR DRIVE RESET  BR 53$ ; .DSABL LSB  .END INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY I5 BICB #US.SPU,U.STS(R5) ;;;% .TITLE XXTAB DATA BASE FOR DEVICE XX .IDENT /02/ ; ; AUTHOR: Z; ; ; CHANGES:; ;; MODULE FUNCTION:; ! .PAGE ; BREAK PAGE FOR PREFACE' .SBTTL SYMBOL, MACRO, DATA DEFINITIONS# .LIST TTM ; TERMINAL LISTING MODE% .NLIST BEX ; SUPPRESS BIN EXTENSION ;; LOCAL SYMBOL DEFINITIONS:;' XXUCBL = XXND-XXST ; DEFINE UCB LENGTH ;; LOCAL MACROS:; ;; LOCAL DATA BLOCKS:; ; .PAGE" .SBTTL XXDCB DEVICE CONTROL BLOCK &$XXDAT:: 00tsscccc ; GLOBAL LABEL FOR START OF% ; DATA BASE AND DCB; USED BY LOADU'$USRTB:: ; GLOBAL LABEL FOR FIRST DCB ; REQUIRED FOR RESIDENT ; DATA BASES OF USER DRIVERS $XXDCB:: ; START OF DCB FOR XX ; REQUIRED BY LOAD .WORD 0 ; LINK TO NEXT DCB! .WORD XXUCB ; LINK TO FIRST UCB .ASCII /XX/ ; DEVICE NAMET$ .BYTE 0,1 ; LOWEST, HIGHEST UNIT # .WORD XXUCBL ; LENGTH OF UCB .WORD 0 ; ADDR OF DDTO$ .WORD 177477 ; LEGAL F M BITS 0-15" .WORD 70 ; CONTROL F M BITS 0-15 .WORD 0 ; NO-OP F M BITS 0-15 " .WORD 177200 ; ACP F M BITS 0-15" .WORD 377 ; LEGAL F M BITS 16-31" .WORD 0 ; CONTROL F M BITS 16-31 .WORD 0 ; NO-OP F M BITS 16-31 .WORD 377 ; ACP F M BITS 16-31 .WORD 0 ; ADDR OF PCBR! ; END OF DEVICE CONTROL BLOCKT B .PAGE+ .SBTTL XXUCB UNIT CONTROL BLOCK DEFINITION  IXXST: ; START OF UCB ENTRIESI ; FOR LENGTH CALCULATION) .IF DF M$$MUP ; FOR MULTIUSER PROTECTIONO! .WORD 0 ; OWNING TT UCB ADDRESS. .ENDC#XXUCB: ; START (OFFSET 0) OF UCBO .WORD $XXDCB ; BACK PTR TO DCB .WORD .-2 ; REDIRECT UCB PTR ; POINTS TO SELF INITIALLY .BYTE UC.ALG!UC.NPR!UC.PWF!1. ; DEFINE CONTROL FLAGS# .BYTE US.MNT ; DEFINE UNIT STATUS .BYTE 0 ; PHYSICAL UNIT # ( .BYTE US.OFL ; DEFINE MORE UNIT STATUS) .WORD DV.DIR!DV.MNT!DV.F11!DV.UMD!DV.MSDO ; DEFINE CHARACTERISTICS .WORD 0 ;  .WORD 4800. ; # OF BLOCKS .WORD 512. ; U.CW4 .WORD XXSCB ; PTR TO SCB .WORD 0 ; TCB ADDR OF TASK .WORD 0 ; DEVICE .WORD 0 ; DEPENDENDENT .WORD 0 ; DATA .WORD 0 ; .WORD 0 ; .WORD 0 ;P .WORD 0 ;N ; DISK PARAMETER WORDS$ .BYTE 12. ; # OF SECTORS PER TRACK% .BYTE 2. ; # OF TRACKS PER CYLINDER ( .WORD 200. ; # OF CYLINDERS PER VOLUMEXXND = . ; END OF UCB  E ; UCB FOR UNIT # 2) .IF DF M$$MUP ; FOR MULTIUSER PROTECTIONI! .WORD 0 ; OWNING TT UCB ADDRESS. .ENDCXX1: .WORD $XXDCB ; BACK PTR TO DCB .WORD .-2 ; REDIRECT UCB PTR ; POINTS TO SELF INITIALLY .BYTE UC.ALG!UC.NPR!UC.PWF!1N ; DEFINE CONTROL FLAGS# .BYTE US.MNT ; DEFINE UNIT STATUS0 .BYTE 1 ; PHYSICAL UNIT #K( .BYTE US.OFL ; DEFINE MORE UNIT STATUS) .WORD DV.DIR!DV.MNT!DV.F11!DV.UMD!DV.MSDC ; DEFINE CHARACTERISTICS .WORD 0 ;  .WORD 4800. ; # OF BLOCKSC .WORD 512. ; U.CW4 .WORD XXSCB ; POINTER TO SCB .WORD 0 ; TCB ADDR OF TASK .WORD 0 ; DEVICE .WORD 0 ; DEPENDENT .WORD 0 ; DATA .WORD 0 ; .WORD 0 ; .WORD 0 ;P .WORD 0 ;N ; DISK PARAMETER WORDS$ .BYTE 12. ; # OF SECTORS PER TRACK% .BYTE 2. ; # OF TRACKS PER CYLINDER ( .WORD 200. ; # OF CYLINDERS PER VOLUME ; END OF UCB FOR UNIT 1E I .PAGE& .SBTTL XXKRB CONTROLLER REQUEST BLOCK C# .BYTE PR5 ; XX RUNS AT PRIORITY 5D .BYTE 220/4 ; VECTOR / 4 .BYTE 0*2 ; CONTROLLER INDEX .BYTE 0 ; CONTROLLER I/O COUNT# .WORD 0!KS.OFL ; CONTROLLER STATUS  EXXKRB: ; START OF KRB .WORD 177404 ; CSR ADDRESS3 .WORD XXA-XXKRB ; OFFSET TO START OF UMR WORK AREA  .BYTE 1 ; HIGHEST PHY UNIT # .BYTE 0 ; UNUSED .WORD 0 ; PTR TO OWNER UCB;S'; CONTIGUOUS S C B HERE FOR DEVICE XXD; XXSCB: ; START OF SCB HERER( .WORD 0,.-2 ; HEAD OF I/O QUEUE, FIRST ; WORD 0, SECOND POINTS TO ; FIRST  P .IF DF M$$PRO ; MULTIPROCESSORR .WORD 0 ; FORK UNIBUS RUN MASK .ENDC 0 .WORD 0 ; FORK LINK WORD .WORD 0 ; FORK PCO .WORD 0 ; FORK R5R .WORD 0 ; FORK R4 ; END OF FORK BLOCKE  .WORD 0 ; KISAR5 .WORD 0 ; I/O PACKET ADDRESS" .BYTE 0 ; CURRENT TIME-OUT COUNT" .BYTE 4 ; INITIAL TIME-OUT COUNT .BYTE 0 ; CONTROLLER STATUS  .BYTE 0 ; STATUS EXTENSION 3# .WORD S2.CON ; STATUS EXTENSION 20 ; CONTIGUOUS ALLOCATIONR ; OF SCB/KRB IS USED .WORD XXKRB ; KRB ADDRESS.# .BYTE 8. ; # OF REGISTERS TO PASSD/ .BYTE 374 ; OFFSET FROM CSR TO FIRST REGISTER  .WORD 0 ; NOT USED- .IF DF M$$EXT ; FOR EXTENDED MEMORY SUPPORT $ .BLKW 6 ; MAPPING ASSIGNMENT BLOCK .WORD 0 ; KE.RHB .ENDC)XXA: ; END OF MAPPING ASSIGNMENT BLOCKR  E .PAGE) .SBTTL XXCTB 00 t ttmmffDATACONTROLLER TABLE DEFINITIONY 0 .WORD 0 ; LINK TO FIRST ICB0" CTB ; MACRO FOR SYSTEM CTB LINK ; REQUIRED FOR RESIDENT ; DATA BASES OF USER DRIVERS% .WORD 0 ; ZERO FOR LAST CTB IN LISTD( .ASCII /XX/ ; DEFINE UNIQUE CONTROLLER& .WORD $XXDCB ; ADDRESS OF DCB FOR XX .BYTE 1 ; 1 CONTROLLER (1 KRB) .BYTE 0 ; STATUS IS ZERO&$XXCTB:: ; GLOBAL LABEL FOR LOAD AND ; INTSV$ MACRO .WORD XXKRB ; LINK TO KRB : ; END OF CTB DEFINITIONN($XXEND:: ; GLOBAL LABEL TO MARK END OF ; DATA BASE FOR LOAD .END.WORD 0 ; LINK TO FIRST ICB0" CTB ; MACRO FOR SYSTEM CTB LINK ; REQUIRED FOR RESIDENT ; DATA BASES OF USER DRIVERS% .WORD 0 ; ZERO FOR LAST CTB IN LISTD( .ASCII /XX/ ; DEFINE UNIQUE CONTROLLER& .WORD $XXDCB ; ADDRESS OF DCB FOR XX .BYTE 1 ; 1 CONTROLLER (1 KRB) .BYTE 0 ; STATUS IS ZERO&$XXCTB:: ; GLOBAL LABEL FOR LOAD AND ; INTSV$ MACRO .WORD XXKRB ; LINK TO KRB : ; END OF CTB DEFINITIONN($XXEND:: ; GLOBAL LABEL TO MARK END ,  @N zSYSYSYSYTICLz  zzVxx99  *,  @N zSYSYSYSYTICL00tttccccz  zzVxx99  * ,  @N zSYSYSYSYTICLz  zzVxx99  *,  @N zSYSYSYSYTICL00ttttt tfDATAz  zzVxx99  * A flea and a fly in a flue,) Were trapped and didn't know what to do. Said the fly, "Let us flee!" Said the flea, "Let us fly!") So they flew through a flaw in the flue.Time flies like an arrow.Space flies like a bow.Fruit flies like a banana. What romm ? - Shickard conference room.st typed a memo and e inneting.Pr@ ThvxL (D~Ĕؔ:Vn !!@ bdhvx^`STOP PAUSE __Only I did what you told me.I only did what you told me.I did only what you told me.I did what only you told me.I did what you only told me.I did what you told only me.I did what you told me only.!I did what you told me. Only ...51(The physics police always get their man.'Mysteries are not necessarily miracles.R!Little acorns from big oaks drop.)Nothing is so useless as a general maxim.2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2 | |2 | Hello. |2 | |2 | You are now logged in on the |2 | RSX-11M-PLUS Operating System. |2 | |2 | This is the USER account. Nothing |2 | that you do in this account can do |2 | any harm either to the system, or to |2 | this account. |2 | |2 | Use this account with the terminal |2 | warm-up session described in the book |2 | Introduction to RSX-11M-PLUS. |2 | |2 | Take it easy. |2 | |2 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>any harm either to the system, or 00"tttcccc) ^^* ^^^+ ^^^^^^, ^^^^^^^- ^^^^^^^^^ . ^^^^^^^^^^^/ ^^^^^^^^^^^^^^0 ^^^^^^^^^^^^^^^1 ^^^^^^^^^^^^^^^^^^2 ^^^^^^^^^^^^^^^^^^^3 ^^^^^^^^^^^^^^^^^^^^^ 4 ^^^^^^^^^^^^^^^^^^^^^^^5 ^^^^^^^^^^^^^^^^^^^^^^^^^^6 ^^^^^^^^^^^^^^^^^^^^^^^^^^^7 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 8 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^9 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ < ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^= ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^A ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^B ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ D ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^E ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^F ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^G ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^H ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^I ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^J ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^K ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ L ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^M ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^N ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^O ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^O ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^M ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^K ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^H ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^F ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^D ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^B ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^8 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^6 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^4 ^^^^^^^^^^^^^^^^^^^^^^^^2 ^^^^^^^^^^^^^^^^^^^^0 ^^^^^^^^^^^^^^^^. ^^00*ttttt tfDATA^^^^^^^^^^, ^^^^^^^^* ^^^^) ^^^) ^^^) ^^^) ^^ ) ^^) ^^^ ^^^^^^^^^^^^^^^^7 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^J ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^P^^^^^^^^ ^ ^^^ ^^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^P^^^^^^^ ^^ ^^^ ^^^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^P^^^^^^^ ^^ ^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^P^^^^^^^ ^^^ ^ ^ ^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^P^^^^^^^ ^^^^ ^^^^^ ^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^P^^^^^^^ ^^^^^ ^^^ ^^ ^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^ ^^^ ^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^P^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^ digital ^^^^^^^^^^^^^^^^^^^^^^^^^002tttcccc^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^O^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^N^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^M^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^L^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^K^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^J^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^I^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^H^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^G^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^F^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^E^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^D^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^A^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^A^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^?^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^>^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^:^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^9^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^8^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^7^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^6^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^5^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^4^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^3^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^2^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^0^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^(^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^$^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^F^ yow!^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^(^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^2^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^F^^^^^^^^^^^^^^^^00:t;tttt tfDATA^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^F^ yow!^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^(^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^2^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^F^^^^^^^^^^^^^^^^0 FILES IN THE USER DIRECTORYFSome of the files in the RSX-11M-PLUS USER directory are used with theIntroduction to RSX-11M-PLUS.FAll files in the USER directory are protected so they cannot be:accidentally deleted. Here is a description of the files.FBATCH.BAT;1 A sample batch file used in the Introduction to illustrate batch command files.ECLEAN.CMD;1 An indirect command file for eliminating files created in > the terminal warm-up session. Do not invoke this file while5 a new user is in the course of the warm-up session. JCLKGEN.CMD;1 This indirect command file allows you to customize CLOCK.MAC.DDELETE.CMD;1 This indirect command file prints the latest version of= selected files on your terminal and deletes all versions ifi you wish.CHLOGIN.CMD;1 This indirect command file is executed each time you log in.2 It sets the terminal to DCL and types HELLO.TXT.IMYDISK.CMD;1 This indirect command file can be used to get a new disk ? ready to use. It shows how to do it and also illustrates how- Indirect works.GJSHAVE.CMD;1 An indirect command file to be passed to the BROADCAST command0 as described in the terminal warm-up session.ESHOW.CMD;1 This indirect command file is used in the terminal warm-ups8 session. It issues three SHOW commands in succession.>BMDRV.MAC;1 Source file for advanced I/O driver. Use with the. RSX-11M-PLUS Guide to Writing an I/O Driver.<BMTAB.MAC;1 Data base for advanced I/O driver. Use with the. RSX-11M-PLUS Guide to Writing an I/O Driver.HCLOCK.MAC;1 This source file was prepared as a programming exercise by a? member of the RSX-11M/M-PLUS documentation group. It runs onm? a video terminal printing the time in large characters on thet screen. BHIYA.MAC;1 A source file written in MACRO-11 Assembly Language for( use with the terminal warm-up session.CSTARS.MAC;1 A source file written in MACRO-11 Assembly Language for( use with the terminal warm-up session.GTMCLI.MAC;1 Simple sample CLI as described in the RSX-11M/M-PLUS System.& Management Guide. MACRO-11 version.GTMCLI.FTN;1 Simple sample CLI as described in the RSX-11M/M-PLUS Systemo; Management Guide. FORTRAN version. Compatible with allg DIGITAL FORTRAN compilers.HXXDRV.MAC;1 Source file for sample XX I/O driver. Use with RSX-11M-PLUS! Guide to Writing an I/O Driver.oFXXTAB.MAC;1 Data base for sample XX I/O driver. Use with RSX-11M-PLUS! Guide to Writing an I/O Driver.eJERROR.TSK;1 Demonstration of exit-with-status. This task does nothing but> exit with a status of ERROR. Use with the three other tasks, to test tasks that respond to exit status.KSEVERE.TSK;1 Demonstration of exit-with-status. This task does nothing butI% exit with a status of SEVERE ERROR.oLSUCCESS.TSK;1 Demonstration of exit-with-status. This task does nothing but exit with a status of SUCCESS.LWARNING.TSK;1 Demonstration of exit-with-status. This task does nothing but exit with a status of WARNING.DFLU.TXT;1 This file is used in the Introduction to illustrate the" DIRECTORY command and wildcards.CFLY.TXT;* These three files are used in the Introduction to11 illustrate the DIRECTORY command and wildcards. DHELLO.TXT;1 This file contains the text you see each time you log in to the USER account.DLONG.TXT This file is used in the Introduction to illustrate CTRL/O and CTRL/C. NWHATSHERE.TXT;1 The file you are now reading. It identifies all files in this00BtEttcccc directory.BERASE.MAC;1 Demonstrates and tests the RMS-11 $ERASE function, oneBERASE.TSK;1 of the new directory and wildcard functions of RMS-11.2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.a>GSA.MAC;1 Demonstrates how to extend an RMS-11 task in case of7 pool exhaustion. See Chapter 7 of the RSX-11M/M-PLUST" RMS-11 Macro Programmer's Guide.BPARSE.MAC;1 Demonstrates and tests the RMS-11 $PARSE function, oneBPARSE.TSK;1 of the new directory and wildcard functions of RMS-11.2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.SDRENAME.MAC;1 Demonstrates and tests the RMS-11 $RENAME function, oneCRENAME.TSK;1 of the new directory and wildcard functions of RMS-11.2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.uDSEARCH.MAC;1 Demonstrates and tests the RMS-11 $SEARCH function, oneCSEARCH.TSK;1 of the new directory and wildcard functions of RMS-11.t2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.. See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.SDRENAME.MAC;1 Demonstrates and tests the RMS-11 $RENAME function, oneCRENAME.TSK;1 of the new directory and wildcard functions of RMS-11.2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.uDSEARCH.MAC;1 Demonstrates and tests the RMS-11 $SEARCH function, oneCSEARCH.TSK;1 of the new directory and wildcard functions of RMS-11.t2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Progra" .Title GSA - Core space allocator .Ident /V02.00/;; COPYRIGHT (c) 1983 BY); DIGITAL EQUIPMENT CORPORATION, MAYNARD(; MASSACHUSETTS. ALL RIGHTS RESERVED.; 6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T;O3; Copyright (C) 1982, Digital Equipment CorporationE ; Maynard, Massachusetts 01754;N4; **-GSA - Dynamic memory allocation for RMS-11 pool;S; John Gemignani, Jr.!; RSX/RMS-11 Development ; March 11, 1982 ;N;W); Called by RMS-11 to manage pool space.D,; In the event of pool exhaustion, the task/; image will be extended to obtain more space.L; /; May be called by user written code providingA(; the interface standard is adhered to.;I ; Interface:; Request space:9<; R0 -> RMS/user Pool list head (maintained by RL/CQB)/; R1 := Amount of space requested (bytes)f<; R2 := 0 (differentiates between request and release);X; Release space:7; R0 -> RMS Pool list head (maintained by RL/CQB)o4; R1 := Amount of space to be released (bytes)(; R2 -> Base address (for release);t; ; Returns:5; C-Bit "set" if an error has occurred (failure) 5; C-Bit "clear" if no error has occurred (success)e; .Enabl LC .Enabl GBL  .Mcall Extk$S .Page! .Sbttl Control block definitionsR .Psect GSA$$D,RW,De;e; GSA internal data:; 9; GSABAS - Base address for the next memory allocation.l7; Initially set to zero, it will be assignedd4; the first address outside of the task's$; current address limits.6; GSAMIN - Decimal value reflecting the minimum size6; (in bytes) to extend the task in order to'; provide space to the pool.7; GSAREQ - Requested pool block number. If a request6; for the 'GSAMIN' fails, then the original8; 00Jt;tttt tfDATA allocation size will be attempted. If that6; fails, then there is no more memory left.;yGSABAS:: ; GSA base addressd& .Word 000000 ; (for next allocation)GSAMIN:: ; Minimum allocatione% .Word 512./64. ; (in 32-word blocks)l!GSAREQ:: ; Size of this request+ .Word 000000 ; (if 'GSAMIN' extends fail)  .Page .Sbttl GSA Initialization codeo .Psect GSA$$I,RO,Ie;p; GSA Initialization;e7; This code is entered when GSA is entered with GSABASg8; set to zero. In order to be able to build valid pool9; header tables, GSABAS must be properly initialized and.; maintained.;;:; Initialization consists of finding the size of the task:; in 32-word units, and converting that value to a usable:; 16-bit address (which corresponds to the address of the;; next task extension (Extk$S) call. Once GSABAS has beenn*; initialized, GSAINI will not be reused.;pGSAINI:t$ Mov R0,-(SP) ; R0-2 will be used to' Mov R1,-(SP) ; communicate with $INIDMt( Mov R2,-(SP) ; NOTE: $INIDM uses EXTSK.;o6; The following code will use $INIDM to initialize the;; dynamic memory. Contrary to documentation, R1 will returnd9; the first address following the task image, and R2 willn9; return the size of the "free" memory from that address.n;t8; NOTE: $INIDM and EXTSK reside in LB:[1,1]VMLIB for RSX:; systems, and in LB:[1,1]SYSLIB for RSTS/E systems.;u; $INIDM interface: ; Calls:; R0 -> Pool list headv;, ; Returns:"; R0 -> First address in task%; R1 -> First address AFTER tasko7; R2 := Size of free core after task (based at R1) ;o) Call $INIDM ; Initialize dynamic memoryd) Mov R1,GSABAS ; Setup the "free" addressa% Mov (SP)+,R2 ; Restore the registerst Mov (SP)+,R1 ;f Mov (SP)+,R0 ;n Return ; And return to GSAr .Page .Sbttl GSA Mainline code  .Psect GSA$$M,RO,I];B; GSA Mainline;.6; Entry point is "GSA", with registers 0-2 loaded as; described above.;uGSA:: ;-:; First, determine if dynamic memory has been initialized.;; GSABAS (initially set to zero) will be non-zero if $INIDM :; has been called and the memory list initialized. On RSX7; based systems it is possible to install tasks with anr<; extension (/INCREMENT). $INIDM will detect this and setup*; the first memory entry in the pool list.; :; A point to note: If the RSX task has been installed with9; the non-checkpointable (/-CP) flag, then EXTKs will nots9; return success. If it is necessary to install the taski<; non-checkpointable, then the task should be installed with; and increment value.;z* Tst GSABAS ; Dynamic memory initialized? Bne 10$ ; Yes if NE, proceed* Call GSAINI ; Otherwise, initialize pool10$:; .; Determine if this call involves real memory.3; R1 should contain the size (in bytes) of the core.2; block requested or to be released. If zero then8; return to the caller without an error (TST leaves CC).;s Tst R1 ; Real memory?s& Bne 20$ ; Yes if NE, then process it) Return ; Otherwise return with successu20$:;e3; If this call is a request for space, pass controlD6; to the allocation routines. Otherwise, pass control4; to the system deallocation module $RLCB. There is2; no need to return, so control is passed via JMP.;' Tst R2 ; Address specified? (release)t) Beq 30$ ; No if EQ, then it's a requeste- Jmp $RLCB ; Otherwise it's a release; do itt30$:;T; Save our current context: ; R0 = Pool list head$ ; R1 = Size of memory required; R2 = 0 (signifies request);c Mov R0,-(SP)e Mov R1,-(SP)l Mov R2,-(SP)o;c-; Attempt an allocation from the current pool ,; If this is successful, pass control to the; common exit.;C! Call $RQCB ; Try the allocation Bcc 70$ ; CC signifies success;R8; Now that the initial allocation failed, we must extend7; the task and give the new area (extended into) to thea7; caller. To do this, the following procedure is used: ;=; 1. The task is extended*; 2. The 00RtXttccccarea extended is returned to the2; pool specified as if a release was attempted,; 3. We retry the allocation operation, but0; this time it should succeed, since we have); increased the size of the pool areal;R8; NOTE: $RQCB has a bad habit of nuking registers, so it3; becomes necessary to save and restore them arounde; unsuccessful calls.k;d' Mov 2(SP),R1 ; Obtain the request size;l6; Determine what the requirement is in 32-word blocks.2; Retain this value to allow GSA to decide whether/; to issue further task extension directives inr$; order to satisfy the requirements.;a! Add #63.,R1 ; Round the requestt Asr R1 ; to a 32-word boundary! Asr R1 ; Then convert the value  Asr R1 ; to the number of  Asr R1 ; 32-word blocks. Asr R1s Asr R1e# Mov R1,GSAREQ ; Save the real sizeh;o3; We will allocate core to the pool in "reasonable"b5; increments to cut down on system overhead, and pooli6; fragmentation. This is accomplished by using either7; the requested size, or "GSAMIN", whichever is LARGER.o3; If the request is unsuccessful, and the amount is.9; smaller than GSAMIN, then request that particular size. ;w& Cmp R1,GSAMIN ; Smaller than minimum?" Bhi 40$ ; No if HI, use it as is% Mov GSAMIN,R1 ; Otherwise use GSAMIN40$:;M1; Now we attempt to extend the task by that size. 0; If the request fails, then use the size of the0; original request. If that also fails, then we; simply ran out of memory.o;i Extk$S R1 ; Extend the tasks Bcc 60$ ; CC if successful! Cmp R1,GSAREQ ; Is this request? Blos 50$ ; Yes if LOS, the end% Mov GSAREQ,R1 ; Otherwise try to uset Br 40$ ; the actual requestR50$: Sec ; Mark failureu Br 70$ ; And exit ; 5; The task has been extended, now this memory must be-; released to the pool for future allocation.a3; To do this, we setup the registers as if RMS weref3; going to release the core, and call ourself to doe3; the work. When the area has been released to thex4; pool, we will return inline and proceed to reenter8; our code again from start to reattempt the allocation.;60$: Mov 4(SP),R0 ; Setup the PLH Asl R1 ; Convert the realR Asl R1 ; size to the actual Asl R1 ; 16-bit size that Asl R1 ; was allocated.d Asl R1 ; The virtual address Asl R1 ; should be after the# Mov GSABAS,R2 ; task (which is nowe" Add R1,GSABAS ; part of the task)$ Call GSA ; Call ourself to release;e5; At this point, the new memory has been added to the3; pool, and is available for use. We now reattempt"; to allocate the memory required.;t% Mov (SP)+,R2 ; Restore our registersR$ Mov (SP)+,R1 ; to the initial state' Mov (SP)+,R0 ; upon entry, and reenter# Br GSA ; as if it's a new requestR;w;; Common exit. Leave the registers in their current state,o#; and return control to the caller.s;w70$:# Inc (SP)+ ; These won't alter thes+ Bit (SP)+,(SP)+ ; C-bit, so status remainse! Return ; unchanged upon returna .Endd to the3; pool .TITLE SEARCH - $SEARCH TEST  .IDENT /X01.00/;U; COPYRIGHT (c) 1983 BYN); DIGITAL EQUIPMENT CORPORATION, MAYNARD (; MASSACHUSETTS. ALL RIGHTS RESERVED.; .6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T .ENABL LC .MCALL FAB$B,NAM$B,GSA$- .MCALL $PARSE,$SEARCH,$STORE,$FETCH,$COMPAREL .MCALL ALUN$S,QIOW$,DIR$,EXIT$S; ,; 00Zt;tttt tfDATAThis program tests/demonstrates the use of; the RMS-11 $SEARCH function.;I;N; RMS-11 Data Structures; GSA$ GSAWFAB:: FAB$B ; Argument FAB# F$DNA SYDSKA ; If no device, SY: F$DNS SYDSKL ; should be used F$NAM NAM ; Link to NAM F$LCH 2. ; Channel #2 FAB$ENAM:: NAM$B ; NAM definition! N$ESA EXPSTR ; EXP STR addressB N$ESS 128. ; EXP STR length! N$RSA RESSTR ; RES STR addressP N$RSS 128. ; RES STR length NAM$E .PSECT $CODE$,RO,IXSEARCH::( ALUN$S #1,#"TI,#0 ; Assign the terminal" MOV #FAB,R0 ; Map the target FAB# MOV #EDBLK,R2 ; Map the exit block " MOV #NAM,R3 ; Map the target NAM! MOV #READ,R4 ; Map the input DPB # MOV #WRITE,R5 ; Map the output DPBd) CLR Q.IOPL+4(R5) ; Turn off carriage ctlC MOV #QUES,Q.IOPL(R5)B MOV #QUESL,Q.IOPL+2(R5) DIR$ R5 ; Prompt for the DNA TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error, $STORE IOLEN,FNS,R0 ; Set the string length- $STORE #BUFF,FNA,R0 ; Set the string address / MOV #40,Q.IOPL+4(R5); Restore carriage controlu$ CLR FILCNT ; Init count of matches $PARSE R0 ; Parse the stringso $COMPARE #0,STS,R0 ; An error?P# BLT ERROR ; Yes if MI; display itRGETFIL:r* MOV #EDBLK,R2 ; Reset the edit block addr" $SEARCH R0 ; Get a matching file $COMPARE #0,STS,R0 ; Error? BLT ERROR ; Yes if LT  CLR (R2) ; Init the length+ $FETCH (R2),RSL,R3 ; Get the string lengthr TST (R2)+ ; Advance0- $FETCH (R2)+,RSA,R3 ; Get the string address;* MOV #RSSSTR,R1 ; Select the format string' TST FILCNT ; First file needs a blankN BNE NOTFST ; line before itA$ MOV #RSSST1,R1 ; Insert CR/LF firstNOTFST:R CALL PRINT ; Display the file $ MOV #FAB,R0 ; Rest the FAB address INC FILCNT ; Count this file# BR GETFIL ; And let's try anothereEXIT:R EXIT$S ; Task exitBERROR:+ $COMPARE #ER$NMF,STS,R0 ; No more matches?$$ BNE ERROR0 ; No - some other error, MOV FILCNT,(R2)+ ; Set the cound of matches BEQ ERROR2 ; No files... CLR (R2) ; Give the ESAt$ $FETCH (R2),ESL,R3 ; Set the length TST (R2)+ ; Advance word% $FETCH (R2),ESA,R3 ; Set the address1' MOV #TTLSTR,R1 ; Set the format string ! BR ERROR1 ; Go show it and exitAERROR2:e% CLR -(R2) ; Setup for string lengtht$ $FETCH (R2),ESL,R3 ; Set the length" TST (R2)+ ; Advance to next word% $FETCH (R2),ESA,R3 ; Set the addressT' MOV #NOFILE,R1 ; Set the format stringN BR ERROR1 ; Print the errorNERROR0: + $FETCH (R2)+,STS,R0 ; Set the STS returnedi! $FETCH (R2),STV,R0 ; And the STV- MOV #ERRSTR,R1 ; Set the error format string+ERROR1:c, CALL PRINT ; Go edit and print the message# JMP SEARCH ; Let's try this againrPRINT: MOV #EDBLK,R2 ; Setup editA MOV #BUFFER,R0 ; Output buffero CALL $EDMSG ; Exit the stringL MOV #BUFFER,Q.IOPL(R5)T MOV R1,Q.IOPL+2(R5) DIR$ R5 ; Send to the terminal RETURN ; Return to caller .PSECT $DATA$,RW,DNSYDSKA: .Ascii "SY:" SYDSKL = . - SYDSKA2QUES: .Ascii <15><12>"Enter a wildcard filespec: " QUESL = . - QUESh0ERRSTR: .Asciz "$SEARCH error -- STS=%P, STV=%P"RSSST1: .Ascii "%N" RSSSTR: .Asciz " %VA"*NOFILE: .Asciz "%NNo files matching %VA%N"3TTLSTR: .Asciz "%NTotal of %D files matching %VA%N"V .EVENFILCNT: .WORD 0eEDBLK: .BLKW 6BUFFER:tBUFF: .Blkb 128.EXPSTR: .BLKB 128.RESSTR: .BLKB 128.IOSTAT: .WORD 0dIOLEN: .WORD 0READ: QIOW$ IO.RLB,1,1,,IOSTAT'WRITE: QIOW$ IO.WLB,1,1,,IOSTAT,,<,,40>i .END SEARCH= . - SYDSKA2QUES: .Ascii <15><12>"Enter a wildcard filespec: " QUESL = . - QUESh0ERRSTR: .Asciz "$SEARCH error -- STS=%P, STV=%P"RSSST1: .Ascii "%N" RSSSTR: .Asciz " %VA"*NOFILE: .Asciz "%NNo files matching %VA%N"3TTLSTR: .Asciz "%NTotal of %D files matching %VA%N"V .EVENFILCNT: .WORD 0eEDBLK: .BLKW 6BUFFER:tBUFF: .Blkb 128.EXPSTR: .BLKB 128.RESSTR: .BLKB 128.IOSTAT: .WORD 0dIOLEN: .WORD 0READ: QIOW$ IO.RLB,1,1,,IOSTAT'WRITE: QIOW$00btXttcccc .TITLE RENAME - $RENAME TEST .IDENT /X01.00/;; COPYRIGHT (c) 1983 BY); DIGITAL EQUIPMENT CORPORATION, MAYNARD(; MASSACHUSETTS. ALL RIGHTS RESERVED.; 6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T .ENABL LC .MCALL FAB$B,NAM$B,GSA$: .MCALL $PARSE,$SEARCH,$RENAME,$STORE,$FETCH,$COMPARE,$SET .MCALL ALUN$S,QIOW$,DIR$,EXIT$S;W,; This program tests/demonstrates the use of; the RMS-11 $RENAME function.;S;T; RMS-11 Data Structures;E GSA$ GSACFAB1:: FAB$B ; Old file name F$DNA SYDSKA ; Default to SY: F$DNS SYDSKL F$NAM NAM1 ; Link to NAM1 F$LCH 2. ; Channel #2 FAB$ENAM1:: NAM$B ; NAM definitionE! N$ESA ESSTR1 ; EXP STR addressI N$ESS 128. ; EXP STR length! N$RSA RSSTR1 ; RES STR addressL N$RSS 128. ; RES STR length NAM$EFAB2:: FAB$B ; New file name F$NAM NAM2 ; Link to NAM2 F$LCH 2. ; Same channel FAB$ENAM2:: NAM$B ; NAM definition! N$ESA ESSTR2 ; EXP STR address N$ESS 128. ; EXP STR length NAM$E .PSECT $CODE$,RO,IeRENAME::( ALUN$S #1,#"TI,#0 ; Assign the terminal" MOV #FAB1,R0 ; Map the target FAB# MOV #EDBLK,R2 ; Map the exit blockE! MOV #READ,R4 ; Map the input DPBI# MOV #WRITE,R5 ; Map the output DPB$) CLR Q.IOPL+4(R5) ; Turn off carriage ctl. MOV #QUES1,Q.IOPL(R5) MOV #QUES1L,Q.IOPL+2(R5)w DIR$ R5 ; Prompt for the DNA TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF1,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error- $STORE IOLEN,DNS,R0 ; Set the default lengthA/ $STORE #BUFF1,DNA,R0 ; Set the default addresst" $PARSE R0 ; Parse the input spec $COMPARE #0,STS,R0 ; An error?M BLT ERROR ; Yes if LTQ MOV #FAB2,R0 ; Map the 2d FAB MOV #QUES2,Q.IOPL(R5) MOV #QUES2L,Q.IOPL+2(R5)(# DIR$ R5 ; Prompt for the new name TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF2,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error- $STORE IOLEN,FNS,R0 ; Set the default length/ $STORE #BUFF2,FNA,R0 ; Set the default address/ MOV #40,Q.IOPL+4(R5); Restore carriage controlS$ CLR FILCNT ; Initialize file count! BR LOOP ; Enter the RENAME loopFEXIT:# EXIT$S ; Task exit#LOOP:I! MOV #FAB1,R0 ; Get the input FABt" MOV #FAB2,R1 ; And the output FAB$ MOV #NAM1,R2 ; Setup NAM references MOV #NAM2,R3 ;L0 $SET #FB$FID,FOP,R0 ; Turn on explicit searches% $SEARCH R0 ; Attempt to find a fileB $COMPARE #0,STS,R0 ; Error? BLT SEAERR ; Yes if LT- $FETCH R4,RSA,R2 ; Get the resultant addresse' $STORE R4,DNA,R1 ; Set this as default(, $FETCH R4,RSL,R2 ; Get the resultant length* $STORE R4,DNS,R1 ; Set the default length* $RENAME R0,,,R1 ; Rename input as output $COMPARE #0,STS,R0 ; Error?$ BLT ERROR ; Yes if LT- investigate) MOV #EDBLK,R0 ; Setup to show the renameA CLR (R0) ;$ $FETCH (R0),RSL,R2 ; Set the length" TST (R0)+ ; Advance to next word& $FETCH (R0)+,RSA,R2 ; Set the address CLR (R0) ; $ $FETCH (R0),ESL,R3 ; Set the length" TST (R0)+ ; Advance to next word$ $FETCH (R0),ESA,R3 ; Set te address MOV #RENMSG,R1 ; Format stringe CALL PRINT ; Display itT INC FILCNT ; Count the file BR LOOP ; And try another fileERROR:# MOV #EDBLK,R2 ; Map the edit block+ $FETCH (R2)00jtntttt tfDATA+,STS,R0 ; Set the STS returnedD! $FETCH (R2),STV,R0 ; And the STV- MOV #ERRSTR,R1 ; Set the error format stringg, CALL PRINT ; Go edit and print the message# JMP RENAME ; Let's try this againRSEAERR:3 $COMPARE #ER$NMF,STS,R0 ; End of wild card search?d BNE ERROR ; No if NE- show why# MOV #EDBLK,R0 ; Map the edit blockR TST FILCNT ; Any files?R# BNE TOTAL ; Yes if NE, show totalu MOV #NOFILE,R1 ; Show the totalSETES: CLR (R0) ;$ $FETCH (R0),ESL,R2 ; Set the length TST (R0)+ ; Advance;* $FETCH (R0)+,ESA,R2 ; Get the ESA address CALL PRINT ; JMP RENAME ; RepeathTOTAL:( MOV FILCNT,(R0)+ ; Set the rename count' MOV #TTLMSG,R1 ; Set the format stringt BR SETES ; Add ESA and print RPRINT: MOV #EDBLK,R2 ; Setup edite MOV #BUFFER,R0 ; Output bufferh CALL $EDMSG ; Exit the stringe MOV #BUFFER,WRITE+Q.IOPLA MOV R1,WRITE+Q.IOPL+2$ DIR$ #WRITE ; Send to the terminal RETURN ; Return to caller .PSECT $DATA$,RW,D)SYDSKA: .Ascii "SY:" SYDSKL = . - SYDSKAQUES1: .Ascii <15><12>"From: "e QUES1L = . - QUES1RQUES2: .Ascii <15><12>"To: "O QUES2L = . - QUES2)0ERRSTR: .Asciz "$RENAME error -- STS=%P, STV=%P"*RENMSG: .Asciz " File %VA renamed to %VA";TTLMSG: .Asciz "%NTotal of %D files matching %VA renamed%N"R*NOFILE: .Asciz "%NNo files matching %VA%N" .EVENFILCNT: .WORD 0EEDBLK: .BLKW 6BUFFER:.BUFF1: .BLKB 64.BUFF2: .BLKB 64 ESSTR1: .BLKB 128.ESSTR2: .BLKB 128.RSSTR1: .BLKB 128.IOSTAT: .WORD 0AIOLEN: .WORD 0READ: QIOW$ IO.RLB,1,1,,IOSTAT'WRITE: QIOW$ IO.WLB,1,1,,IOSTAT,,<,,40> .END RENAME5><12>"To: "O QUES2L = . - QUES2)0ERRSTR: .Asciz "$RENAME error -- STS=%P, STV=%P"*RENMSG: .Asciz " File %VA renamed to %VA";TTLMSG: .Asciz "%NTotal of %D files matching %VA renamed%N"R*NOFILE: .Asciz "%NNo files matching %VA%N" .EVENFILCNT: .WORD 0EEDBLK: .BLKW 6BUFFER:.BUFF1: .BLKB 64.BUFF2: .BLKB 64 ESSTR1: .BLKB 128.ESSTR2: .BLKB 128.RSSTR1: .BLKB 128.IOSTAT: .WORD 0AIOLEN: .WORD 0READ:  .TITLE ERASE - $ERASE TESTN .IDENT /X01.00/; ; COPYRIGHT (c) 1983 BYT); DIGITAL EQUIPMENT CORPORATION, MAYNARDS(; MASSACHUSETTS. ALL RIGHTS RESERVED.; O6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T .ENABL LC .MCALL FAB$B,NAM$B,GSA$, .MCALL $PARSE,$ERASE,$STORE,$FETCH,$COMPARE .MCALL ALUN$S,QIOW$,DIR$,EXIT$S;E,; This program tests/demonstrates the use of4; the RMS-11 $ERASE function, with implicit $SEARCH.;A;S; RMS-11 Data Structures;T GSA$ GSAHFAB:: FAB$B ; Argument FAB# F$DNA SYDSKA ; If no device, SY:O F$DNS SYDSKL ; should be used F$NAM NAM ; Link to NAM F$LCH 2. ; Channel #2 FAB$ENAM:: NAM$B ; NAM definition! N$ESA EXPSTR ; EXP STR address. N$ESS 128. ; EXP STR length! N$RSA RESSTR ; RES STR address$ N$RSS 128. ; RES STR length NAM$E .PSECT $CODE$,RO,IoERASE::d( ALUN$S #1,#"TI,#0 ; Assign the terminal" MOV #FAB,R0 ; Map the target FAB# MOV #EDBLK,R2 ; Map the exit blockT" MOV #NAM,R3 ; Map the target NAM! MOV #READ,R4 ; Map the input DPB # MOV #WRITE,R5 ; Map the output DPBd) CLR Q.IOPL+4(R5) ; Turn off carriage ctlC MOV #QUES,Q.IOPL(R5)B MOV #QUESL,Q.IOPL+2(R5) DIR$ R5 ; Prompt for the DNA TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TST00rtxttccccB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error, $STORE IOLEN,FNS,R0 ; Set the string length- $STORE #BUFF,FNA,R0 ; Set the string address / MOV #40,Q.IOPL+4(R5); Restore carriage controlu$ CLR FILCNT ; Init count of matches $PARSE R0 ; Parse the stringso $COMPARE #0,STS,R0 ; An error?P# BLT ERROR ; Yes if MI; display itRGETFIL:r* MOV #EDBLK,R2 ; Reset the edit block addr# $ERASE R0 ; Issue implicit $ERASEV $COMPARE #0,STS,R0 ; Error? BLT ERROR ; Yes if LT  CLR (R2) ; Init the length+ $FETCH (R2),RSL,R3 ; Get the string lengthr TST (R2)+ ; Advance;- $FETCH (R2)+,RSA,R3 ; Get the string addressS* MOV #RSSSTR,R1 ; Select the format string' TST FILCNT ; First file needs a blank  BNE NOTFST ; line before itS$ MOV #RSSST1,R1 ; Insert CR/LF firstNOTFST:  CALL PRINT ; Display the filef$ MOV #FAB,R0 ; Rest the FAB address INC FILCNT ; Count this file# BR GETFIL ; And let's try anotherVEXIT:R EXIT$S ; Task exitBERROR:+ $COMPARE #ER$NMF,STS,R0 ; No more matches?$$ BNE ERROR0 ; No - some other error, MOV FILCNT,(R2)+ ; Set the cound of matches BEQ ERROR2 ; No files... CLR (R2) ; Give the ESAt$ $FETCH (R2),ESL,R3 ; Set the length TST (R2)+ ; Advance word% $FETCH (R2),ESA,R3 ; Set the address1' MOV #TTLSTR,R1 ; Set the format string ! BR ERROR1 ; Go show it and exitAERROR2:e% CLR -(R2) ; Setup for string lengtht$ $FETCH (R2),ESL,R3 ; Set the length" TST (R2)+ ; Advance to next word% $FETCH (R2),ESA,R3 ; Set the addressT' MOV #NOFILE,R1 ; Set the format stringN BR ERROR1 ; Print the errorNERROR0: + $FETCH (R2)+,STS,R0 ; Set the STS returnedi! $FETCH (R2),STV,R0 ; And the STV- MOV #ERRSTR,R1 ; Set the error format string+ERROR1:c, CALL PRINT ; Go edit and print the message" JMP ERASE ; Let's try this againPRINT: MOV #EDBLK,R2 ; Setup editi MOV #BUFFER,R0 ; Output buffer  CALL $EDMSG ; Exit the stringE MOV #BUFFER,Q.IOPL(R5)T MOV R1,Q.IOPL+2(R5) DIR$ R5 ; Send to the terminal RETURN ; Return to caller .PSECT $DATA$,RW,DnSYDSKA: .Ascii "SY:" SYDSKL = . - SYDSKA)QUES: .Ascii <15><12>"File(s) to erase: "i QUESL = . - QUESR/ERRSTR: .Asciz "$ERASE error -- STS=%P, STV=%P" RSSST1: .Ascii "%N"1#RSSSTR: .Asciz " File %VA deleted"t*NOFILE: .Asciz "%NNo files matching %VA%N";TTLSTR: .Asciz "%NTotal of %D files matching %VA deleted%N"  .EVENFILCNT: .WORD 0MEDBLK: .BLKW 6BUFFER:MBUFF: .Blkb 128.EXPSTR: .BLKB 128.RESSTR: .BLKB 128.IOSTAT: .WORD 0nIOLEN: .WORD 0READ: QIOW$ IO.RLB,1,1,,IOSTAT'WRITE: QIOW$ IO.WLB,1,1,,IOSTAT,,<,,40>K .END ERASEQUES: .Ascii <15><12>"File(s) to erase: "i QUESL = . - QUESR/ERRSTR: .Asciz "$ERASE error -- STS=%P, STV=%P" RSSST1: .Ascii "%N"1#RSSSTR: .Asciz " File %VA deleted"t*NOFILE: .Asciz "%NNo files matching %VA%N";TTLSTR: .Asciz "%NTotal of %D files matching %VA deleted%N"  .EVENFILCNT: .WORD 0MEDBLK: .BLKW 6BUFFER:MBUFF: .Blkb 128.EXPSTR: .BLKB 128.RESSTR: .BLKB 128.IOSTAT: .WORD 0nIOLEN: .WORD 0READ: QIOW$  .TITLE PARSE - $PARSE TESTN .IDENT /X01.00/; COPYRIGHT (c) 1983 BYT); DIGITAL EQUIPMENT CORPORATION, MAYNARD(; MASSACHUSETTS. ALL RIGHTS RESERVED.; R6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T .ENABL LC .MCALL FAB$B,NAM$B,GSA$% .MCALL $PARSE,$STORE,$FETCH,$COMPAREA .MCALL ALUN$S,QIOW$,DIR$,EXIT$S; ,; This program t00ztntttt tfDATAests/demonstrates the use of; the RMS-11 $PARSE function.H;I;A; RMS-11 Data Structures; GSA$ GSA FAB:: FAB$B ; Argument FAB F$NAM NAM ; Link to NAM F$LCH 2. ; Channel #2 FAB$ENAM:: NAM$B ; NAM definition! N$ESA EXPSTR ; EXP STR addressU N$ESS 128. ; EXP STR length NAM$E .PSECT $CODE$,RO,I PARSE::D( ALUN$S #1,#"TI,#0 ; Assign the terminal" MOV #FAB,R0 ; Map the target FAB# MOV #EDBLK,R2 ; Map the exit blockQ" MOV #NAM,R3 ; Map the target NAM! MOV #READ,R4 ; Map the input DPB # MOV #WRITE,R5 ; Map the output DPBA) CLR Q.IOPL+4(R5) ; Turn off carriage ctl  MOV #QUES1,Q.IOPL(R5) MOV #QUES1L,Q.IOPL+2(R5)n DIR$ R5 ; Prompt for the DNA TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF1,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error- $STORE IOLEN,DNS,R0 ; Set the default lengthD/ $STORE #BUFF1,DNA,R0 ; Set the default address  MOV #QUES2,Q.IOPL(R5) MOV #QUES2L,Q.IOPL+2(R5) DIR$ R5 ; Prompt for the DNA TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF2,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error- $STORE IOLEN,FNS,R0 ; Set the default lengthR/ $STORE #BUFF2,FNA,R0 ; Set the default addressh/ MOV #40,Q.IOPL+4(R5); Restore carriage control, $PARSE R0 ; Parse the strings $COMPARE #0,STS,R0 ; An error?e# BLT ERROR ; Yes if MI; display it) CLR (R2) ; Init the length+ $FETCH (R2),ESL,R3 ; Get the string length  TST (R2)+ ; AdvanceE- $FETCH (R2)+,ESA,R3 ; Get the string addressM, $FETCH (R2),FNB,R3 ; Get the file name bits* MOV #ESSSTR,R1 ; Select the format string CALL PRINT ; Display the fileE# CALL BITS ; Do the FNB bit disply$" BR PARSE ; And let's try anotherEXIT:h EXIT$S ; Task exit;ERROR:+ $FETCH (R2)+,STS,R0 ; Set the STS returnedi! $FETCH (R2),STV,R0 ; And the STVr- MOV #ERRSTR,R1 ; Set the error format string(, CALL PRINT ; Go edit and print the message! BR PARSE ; Let's try this again BITS:E# MOV #EDBLK,R2 ; Init EDBLK addressn$ $FETCH R0,FNB,R3 ; Get the FNB bits BIT #2000,R0 ; Quoted string? BEQ 2$ ; No if EQa# MOV #QUO,(R2)+ ; Set Quoted stringf"2$: BIT #1000,R0 ; Wild directory? BEQ 4$ ; No if EQA$ MOV #WDI,(R2)+ ; Set wild directory4$: BIT #400,R0 ; Node spec?E BEQ 6$ ; No if EQt MOV #NOD,(R2)+ ; Set nodespec"6$: BIT #100,R0 ; Directory spec? BEQ 8$ ; No if EQo MOV #DIR,(R2)+ ; Set directoryd8$: BIT #40,R0 ; Wild name? BEQ 10$ ; No if eq MOV #WNA,(R2)+ ; Set wild name210$: BIT #20,R0 ; Wild type?  BEQ 12$ ; No if EQ MOV #WTY,(R2)+ ; Set wild typer 12$: BIT #10,R0 ; Wild version? BEQ 14$ ; No if EQ" MOV #WVE,(R2)+ ; Set wild version14$: BIT #4,R0 ; Name?f BEQ 16$ ; No if EQ MOV #NME,(R2)+ ; Set name16$: BIT #2,R0 ; Type? BEQ 18$ ; No if EQ MOV #TYP,(R2)+ ; Set type18$: BIT #1,R0 ; Version? BEQ 20$ ; No if EQ MOV #VER,(R2)+ ; Set versione'20$: MOV #END,(R2) ; End with a null...?% MOV #DEV,R1 ; Set the default (dev)  CALL PRINT ; Edit and printR RETURN ; And exitPRINT: MOV #EDBLK,R2 ; Setup edit  MOV #BUFFER,R0 ; Output bufferl CALL $EDMSG ; Exit the string MOV #BUFFER,Q.IOPL(R5)d MOV R1,Q.IOPL+2(R5) DIR$ R5 ; Send to the terminal RETURN ; Return to caller .PSECT $DATA$,RW,D7QUES1: .Ascii <15><12>"Enter the default name string: "# QUES1L = . - QUES1Q7QUES2: .Ascii <15><12>"Enter the primary name string: "V QUES2L = . - QUES2 /ERRSTR: .Asciz "$PARSE error -- STS=%P, STV=%P" 0ESSSTR: .Ascii "$PARSE expanded string is %VA%N", .Asciz " File name bits (FNB) are %P"DEV: .Asciz " (DEV%I"eNOD: .Asciz ", NOD%I"tDIR: .Asciz ", DIR%I"FNME: .Asciz ", NAM%I",QUO: .Asciz ", QUO%I" TYP: .Asciz ", TYP%I"VER: .Asciz ", VER%I"aWDI: .Asciz ", WDI%I"$WNA: .Asciz ", WNA%I" WTY: .Asciz ", WTY%I"uWVE: .Asciz ", WVE%I"EEND: .Asciz ")" .EVENEDBLK: .BL00tqttccccKW 16.BUFFER:aBUFF1: .Blkb 64.BUFF2: .Blkb 64UEXPSTR: .BLKB 128.IOSTAT: .WORD 0 IOLEN: .WORD 0READ: QIOW$ IO.RLB,1,1,,IOSTAT'WRITE: QIOW$ IO.WLB,1,1,,IOSTAT,,<,,40>n .END PARSEare %P"DEV: .Asciz " (DEV%I"eNOD: .Asciz ", NOD%I"tDIR: .Asciz ", DIR%I"FNME: .Asciz ", NAM%I",QUO: .Asciz ", QUO%I" TYP: .Asciz ", TYP%I"VER: .Asciz ", VER%I"aWDI: .Asciz ", WDI%I"$WNA: .Asciz ", WNA%I" WTY: .Asciz ", WTY%I"uWVE: .Asciz ", WVE%I"EEND: .Asciz ")" .EVENEDBLK: .BL .TITLE IOSUB  .IDENT /17.05/D;PL; COPYRIGHT (c) 1982, 1983, 1984, 1985 BY DIGITAL EQUIPMENT CORPORATION.$; BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;V>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;C ; D. N. CUTLER 4-AUG-73  ;7- ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:K; ; J. R. KAUFFMAN; J. M. LAWLER; T. LEKAS;; B. S. MCCARTHY;M-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:.;; M. PETTENGILL ; H. HUANG; J. W. BERZLE; S. C. ADAMS ; P. K. M. WEISS ; T. LEKAS; B. S. MCCARTHY; L. M. MCCULLEY;; MODIFIED BY:;S!; J. W. BERZLE 13-NOV-85 17.00B;D); JWB168 -- CORRECT CONDITIONALIZATION ; "; B. S. MCCARTHY 7-MAR-87 17.01;4); BM387 -- IF WINDOW I/O MANAGEMENT ISU%; ENABLED, MANAGE W.IOC IN $IOFINF;#; B. S. MCCARTHY 15-MAR-87 17.02;S"; BM387 -- CORRECTIONS TO ABOVE;M#; B. S. MCCARTHY 15-MAR-87 17.03P;G*; BM387 -- CREATE $DCWIO ENTRY POINT SO'; DCSUB BACK OUT CODE CAN CALL HEREK;; K. L. NOEL 11-MAR-87 17.04L;7; KLN037 -- ALLOW REMOTE ATTACH AND DETATCH FOR CPR 7;; K. L. NOEL 30-JUN-87 17.05I;L7; KLN054 -- CHECK FOR GENERIC DEVICE DURING KILL I/O];B^;-_; I/O RELATED ROUTINES`;3a; PRIMITIVE LEVEL ROUTINES CALLED BY MOST DRIVERSSb;Ac; MACRO LIBRARY CALLSd;e:f .MCALL F11DF$,HDRDF$,HWDDF$,PCBDF$,PKTDF$,SHDDF$,TCBDF$g .MCALL UCBDF$,SCBDF$,BGCK$Ahi;$1j F11DF$ ;DEFINE WINDOW AND LOCK BLOCK OFFSETS 'k HDRDF$ ;DEFINE TASK HEADER OFFSETS7&l HWDDF$ ;DEFINE HARDWARE REGISTERS3m PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSL&n PKTDF$ ;DEFINE I/O PACKET OFFSETS,o SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS.p TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS0q SCBDF$ ;DEFINE STATUS CONTROL BLOCK OFFSETS.r UCBDF$ ;DEFINE UNIT CONTROL BLOCK OFFSETSst;+Du; **-$DECIO-DECREMENT I/O COUNT (THROUGH AN ATTACHMENT DESCRIPTOR)2v; **-$DECIP-DECREMENT I/O COUNT (PARTITION ONLY)w;F@x; THESE ROUTINES DECREMENT THE I/O COUNT THROUGH AN ATTACHMENT>y; DESCRIPTOR AND/OR ASSOCIATED PCB AND CHECK FOR ANY PENDINGz; CHECKPOINT REQUESTS.{;N |; INPUTS:O};S,~; R0=ADDRESS OF THE ATTACHMENT DESCRIPTOR.;T3; IF THE LOW BIT OF THE ADB ADDRESS IS SET, THEN 1; THIS IS THE COMPLETION OF A BUFFERED I/O FOR 3; WHICH THE PCB I/O COUNT HAS ALREADY BEEN DEC'D$5; (VIA $DECBF). ONLY THE ADB I/O COUNT IS CHANGED.P; ; OUTPUTS:;M ; NONE.N;R2; R3 IS PRESERVED, ALL OTHER REGISTERS CLOBBERED;C;- .ENABL LSBT2$DECIO::BIT #1,R0 ;COMPLETION OF BUFFERED I/O ?/ BNE 60$ ;IF NE YES, GO DEC A.IOC AND RETURNU6 DECB A.IOC(R0) ;REDUCE I/O COUNT THROUGH DESCRIPTOR3$DECIP::MOV A.PCB(R0),R1 ;POINT TO THE REGION PCB,6 DECB P.IOC(R1) ;REDDUCE COUNT OF I/O INTO PARTITION% BNE 50$ ;IF NE THERE IS STILL I/OR> BIT #PS.CKR!PS.LIO,P.STAT(R1) ;CKP REQ OR SHF DETECTED I/O? BEQ 50$ ;IF EQ NOP( MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS5 MOV #$ICHKP,-(SP) ;ASSUME ITS A CHECKPOINT REQUEST! BIT #PS.CKR,P.STAT(R1) ;IS IT?1 BNE 10$ ;IF NE YES9 MOV #$NXTSK,(SP) ;MUST BE A SHUFFLER DETECTED LONG I/OU MOV R1,R0 ;COPY PCB ADDRESSO410$: BIC #PS.CKR!PS.LIO,P.STAT(R1) ;CLEAR THE BITS- CALL @(SP)+ ;CALL ROUTINE AND CLEAN STACKU+ MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSI50$: RETURN ; 960$: DEC00qtntttt tfDATAB A.IOC-1(R0) ;DECREMENT I/O COUNT THROUGH ATT.C RETURN ;Q .DSABL LSBV;+&; **-$ULDRQ-REQUEST MICROCODE LOADER;)I; THIS ROUTINE IS CALLED FROM A DRIVER TO REQUEST THE MICRO CODE LOADERBJ; TASK. A PACKET IS ALLOCATED AND THE LOAD INFO. IS INSERTED, THE PACKETN; IS QUEUED TO THE MICRO CODE LOADER AND THE MICRO CODE LOADER IS REQUESTED.; ; INPUTS: ;+ ; R3=MICRO CODE FILENAME INDEX3; R4=KRB ADDRESS OF CONTROLLER FOR MICROCODE LOADR; ; OUTPUTS:;.;; C=0 IF THE PACKET WAS ALLOCATED AND THE TASK INSTALLED.1; C=1 IF THE PACKET WAS NOT SUCCESSFULLY QUEUEDU-; Z=1 IF THE PACKET COULD NOT BE ALLOCATED &; Z=0 IF THE TASK WAS NOT INSTALLED;- .ENABL LSB ;$ULDRQ::MOV #$ULDPT,-(SP) ;PUSH ADDRESS OF ADDRESS OF TCB+ BR 10$ ;AND ENTER COMMON PACKET ROUTINEE;+#; **-$DVMSG-DEVICE MESSAGE OUTPUTU;F; THIS ROUTINE IS CALLED TO SUBMIT A MESSAGE TO THE TASK TERMINATIONI; NOTIFICATION TASK. MESSAGES ARE EITHER DEVICE RELATED OR A CHECKPOINTL"; WRITE FAILURE FROM THE LOADER.; ; INPUTS: ;O; R0=MESSAGE NUMBER.=; R5=ADDRESS OF THE UCB OR TCB THAT THE MESSAGE APPLIES TO. ;W ; OUTPUTS:;@; A FOUR WORD PACKET IS ALLOCATED, R0 AND R5 ARE STORED IN THEC; SECOND AND THIRD WORDS RESPECTIVELY, AND THE PACKET IS THREADED>; INTO THE TASK TERMINATION NOTIFICATION TASK MESSAGE QUEUE.;ED; NOTE: IF THE TASK TERMINATION NOTIFICATION TASK IS NOT INSTALLED<; OR NO STORAGE CAN BE OBTAINED, THEN THE MESSAGE REQUEST; IS IGNORED.;-)$DVMSG::MOV R0,R3 ;SAVE MESSAGE NUMBERS .IF DF R$$PRO" TST $TKNPT ;IS TKTN INSTALLED?8 BEQ $CTMSG ;IF EQ NO - TRY SENDING TO THE DISPATCHER .ENDC ;R$$PRO9 MOV #$TKNPT,-(SP) ;PUSH ADDRESS OF ADDRESS OF TKTN TCBV0 BR 10$ ;DROP THROUGH TO COMMON QUEUE ROUTINE;++; **-$QPKRQ-QUEUE PACKET AND REQUEST TASK;EF; THIS ROUTINE ATTEMPTS TO ALLOCATE A FOUR WORD BLOCK, SAVE R3-R5 INC; THE BLOCK, AND QUEUE IT TO A SPECIFIED TASK. THE CONTENT OF THE ; BLOCK IS:M'; WD 0 - LINK WORD FOR RECEIVE QUEUE; WD 1 - SAVED R3; WD 2 - SAVED R5; WD 3 - SAVED R4; ; INPUTS:T;N3; R0=ADDRESS OF ADDRESS OF TCB OF TASK TO REQUESTM ; R3-R5=REGISTERS TO BE STORED;S ; OUTPUTS:;B3; C=0 IF ALLOCATION SUCCESSFUL AND TASK INSTALLED+; C=1 IF EITHER FAILED ; Z=1 IF PACKET NOT ALLOCATED; Z=0 IF TASK NOT INSTALLED;-?$QPKRQ::MOV R0,-(SP) ;SAVE ADDRESS OF ADDRESS FOR COMMON CODED+10$: TST @(SP) ;SPECIFIED TASK INSTALLEDW BEQ 60$ ;IF EQ NO - ERRORU* MOV #8.,R1 ;SET LENGTH OF BLOCK NEEDED! CALL $ALOCB ;GET A CORE BLOCK % BCC 20$ ;FINISH IN COMMON ROUTINES# BR 50$ ;IF CS DIDN'T GET PACKETR;+5; **-$DVMG1-DEVICE MESSAGE OUTPUT (ALTERNATE ENTRY)L8; **-$QPKR1-GENERAL QUEUEING ROUTINE (ALTERNATE ENTRY);DB; THESE ROUTINES ARE CALLED IF A PACKET IS TO BE QUEUED WHICH IS? ; ALREADY ALLOCATED (E.G. CONVERTING A KERNEL AST TO A DEVICEM@ ; MESSAGE. THE PACKET MUST BE EXACTLY 8. BYTES LONG, AND IT IS@ ; THE DRIVERS RESPONSIBILITY TO INSURE THAT THE REQUESTED TASK ; IS INSTALLED.  ;A ; INPUTS:2; R0=ADDRESS OF THE PRE-ALLOCATED MESSAGE PACKET%; R3=MESSAGE NUMBER (OR EQUIVALENT) =; R2=ADDRESS OF ADDRESS OF TCB OF TASK (IF ENTRY AT $QPKR1)R;E ; OUTPUTS:<; THE PACKET IS FILLED IN AND QUEUED TO THE SPECIFIED TASK;-:$DVMG1::MOV #$TKNPT,R2 ;PUSH ADDRESS OF TKTN TCB ADDRESS6$QPKR1::MOV R2,-(SP) ;SAVE ADDRESS OF ADDRESS OF TCB/20$: MOV R0,R1 ;SET ADDRESS OF MESSAGE BLOCKH, TST (R0)+ ;POINT TO SECOND WORD IN BLOCK& MOV R3,(R0)+ ;INSERT MESSAGE NUMBER* MOV R5,(R0)+ ;INSERT UCB OR TCB ADDRESS, MOV R4,(R0) ;INSERT ADDITIONAL PARAMETER4 MOV @(SP)+,R0 ;GET TCB ADDRESS OF TASK TO REQUEST0 CALL $EXRQF ;INSERT IN RECEIVE LIST, REQUEST  CLC ;INDICATE SUCCESS! RETURN ;BACK TO CALLER-"50$: CLR (SP) ;SET TO SET Z BIT FOR RETURNS6#60$: COM (SP)+ ;CLEAN STA00qtttccccCK, SET C AND Z IF APPROP.$ RETURN ;BACK TO CALLERM%& .IF DF R$$PRO'(;+3); **-$CTMSG-DO A SEND DATA TO THE P/OS DISPATCHERK*;MF+; THIS ROUTINE IS CALLED TO SEND A MESSAGE TO THE P/OS DISPATCHER BYG,; DOING A SEND DATA. FOR NOW MESSAGES ARE FOR CHECKPOINT WRITE ERRORE%-; OR CHECKPOINT ALLOCATION FAILURE.L.;R /; INPUTS:N0;I1; R0=MESSAGE NUMBERC2;N 3; OUPUTS:S4;R;5; A FIXED LENGTH SEND DATA IS DONE TO C$CTEX IF POSSIBLE.F6;-718$CTMSG::MOV KISAR6,-(SP) ;SAVE THE APR6 MAPPINGP(9 MOV R0,-(SP) ;SAVE THE MESSAGE NUMBER>: MOV #$CTBNM,R3 ;GET THE ADDRESS OF THE CTAB'S NAME (C$CTEX)%; CALL $SRSTD ;GET IT'S TCB ADDRESSI3< BCS 95$ ;IF CS NOT INSTALLED - DROP THE MESSAGE%= MOV R0,-(SP) ;SAVE THE TCB ADDRESSSE> MOV #<13.+8.+37>/32.,R1 ;GET A PACKET FOR A FIXED LENGTH SEND DATAL$? CALL $ALSEC ;ALLOCATE THE PACKET.@ BCS 90$ ;IF CS NO SPACE - DROP THE MESSAGE A MOV R0,KISAR6 ;MAP THE PACKET:B MOV #140002,R0 ;POINT AFTER THE LINK WORD IN THE PACKET4C MOV #13.+2,(R0)+ ;INSERT THE NUMBER OF DATA WORDS;D MOV #^R$$E,(R0)+ ;INSERT THE SENDER "TASK" NAME - $$EXECME MOV #^RXEC,(R0)+ ;...7F MOV #4,(R0)+ ;INSERT THE MESSAGE TYPE (EXEC MESSAGE)D-G MOV 2(SP),(R0)+ ;GET THE SUBMESSAGE NUMBER .H ADD #<13.-2>*2,R0 ;POINT PAST THE DATA AREA/I MOV $COPT,(R0)+ ;TI: FOR THIS "TASK" IS CO0:SFJ MOV #<200*400>+200,(R0)+ ;THE UIC FOR P/OS SHOULD ALWAYS BE 200,2000K MOV $CTBNM,(R0)+ ;INSERT THE TARGET TASK NAMEL MOV $CTBNM+2,(R0) ;...O7M MOV (SP),R0 ;GET THE ADDRESS OF RECIEVER TASK'S TCBO,N ADD #T.RCVL,R0 ;POINT TO THE RECIEVE LIST+O MOV KISAR6,R1 ;GET ADDRESS OF THE PACKETR2P CALL $QSPIF ;INSERT PACKET IN THE RECIEVE LIST0Q MOV #AS.RCA,R4 ;GET CODE FOR RECIEVE DATA AST5R MOV (SP)+,R5 ;RETRIEVE RECIEVER TASK'S TCB ADDRESS 4S TST (SP)+ ;DON'T NEED THE MESSAGE NUMBER ANYMORE-T MOV (SP)+,KISAR6 ;RESTORE THE APR6 MAPPING $U CALL $DASTT ;DECLARE RECIEVE AST-V CALLR $DRDSE ;DECLARE A SIGNIFICANT EVENTT"W90$: TST (SP)+ ;CLEAN THE STACK"X95$: TST (SP)+ ;CLEAN THE STACK2Y100$: MOV (SP)+,KISAR6 ;RESTORE THE APR6 MAPPINGZ RETURN ;ALL DONER[\ .ENDC ;R$$PRO]^ _ .DSABL LSBA`a;+/b; **-$GTPKT-GET I/O PACKET FROM REQUEST QUEUEE9c; **-$GSPKT-GET SELECTIVE I/O PACKET FROM REQUEST QUEUECd;ROe; THIS ROUTINE IS CALLED BY DEVICE DRIVERS TO DEQUEUE THE NEXT I/O REQUEST TORMf; PROCESS. IF THE DEVICE CONTROLLER IS BUSY, THEN A CARRY SET INDICATION IS Og; RETURNED TO THE CALLER. ELSE AN ATTEMPT IS MADE TO DEQUEUE THE NEXT REQUESTPJh; FROM THE CONTROLLER QUEUE. IF NO REQUEST CAN BE DEQUEUED, THEN A CARRYQi; SET INDICATION IS RETURNED TO THE CALLER. ELSE THE CONTROLLER IS SET BUSY AND*7j; A CARRY CLEAR INDICATION IS RETURNED TO THE CALLER.-k;EAl; IF QUEUE OPTIMIZATION IS SUPPORTED AND ENABLED FOR THE DEVICEA@m; THE APROPRIATE PACKET FOR THE CURRENT OPTIMIZATION ALGORITHMCn; IS RETURNED. THREE ALGORITHMS ARE SUPPORTED: NEAREST CYLINDER,I=o; ELEVATOR, AND C-SCAN. ALL THREE ALGORITHMS INCORPORATE AECp; FAIRNESS COUNT. IF THE FIRST PACKET ON THE LIST IS PASSED OVERN5q; MORE THAN "FCOUNT" TIMES, IT IS DONE IMMEDIATELY.Nr; s;AIt; THE ALTERNATE ENTRY POINT $GSPKT IS INTENDED FOR USE BY DRIVERS WHICH Hu; SUPPORT PARALLEL OPERATIONS ON A SINGLE UNIT, A COMMON EXAMPLE BEINGGv; FULL DUPLEX. SUCH DRIVERS ARE EXPECTED TO LOOK TO THE SYSTEM AS IFIFw; THEY ARE ALWAYS FREE, WHILE MAINTAINING THE STATUS OF ALL PARALLELBx; OPERATIONS INTERNALLY WITHIN THEIR OWN DEVICE DATA STRUCTURES.Iy; PARALLELISM IS ACCOMPLISHED BY HANDLING DRIVER-DEFINED CLASSES OF I/OOJz; FUNCTION CODES IN PARALLEL WITH EACH OTHER. FOR EXAMPLE A FULL-DUPLEXH{; DRIVER WOULD HANDLE INPUT REQUESTS IN PARALLEL WITH OUTPUT REQUESTS.E|; A DRIVER CALLS $GSPKT WHEN IT WANTS TO DEQUEUE A PACKET WHOSE I/OGI}; FUNCTION CODE BELONGS TO A CERTAIN CLASS. WHICH FUNCTIONS QUALIFY ISF~; DETERMINED BY AN ACCEPTANCE ROUTINE IN THE DRIVER WHOSE ADDRESS ISG; PASSED TO $GSPKT IN R2. THE ACCEPTANCE ROUTINE IS CALLED BY $GSPKTA00qtntttt tfDATAD; EACH TIME A PACKET IS FOUND IN THE QUEUE WHICH IS ELIGIBLE TO BEI; DEQUEUED. THE ACCEPTANCE ROUTINE IS THEN EXPECTED TO TAKE ONE OF THE; FOLLOWING THREE ACTIONS:;S:; 1. RETURN WITH CARRY CLEAR IF THE PACKET SHOULD BE6; DEQUEUED. IN THIS CASE $GSPKT PROCEEDS AS $GTPKT-; NORMALLY WOULD ON DEQUEUEING THE PACKET.F;O<; 2. RETURN WITH CARRY SET IF THE PACKET SHOULD NOT BE:; DEQUEUED. IN THIS CASE $GSPKT WILL CONTINUE THE SCAN; OF THE I/O QUEUE.;YA; 3. ADD THE CONSTANT G$$SPSA TO THE STACK POINTER TO ABORTG%; THE SCAN WITH NO FURTHER ACTION.C;TG; THE ACCEPTANCE ROUTINE MUST SAVE AND RESTORE ANY REGISTERS WHICH ITA; INTENDS TO MODIFY. WHEN A PACKET IS DEQUEUED VIA $GSPKT, THE 1; FOLLOWING NORMAL $GTPKT ACTIONS DO NOT OCCUR:;N@; 1. FILLING IN OF U.BUF, U.BUF+2 AND U.CNT. THESE FIELDS+; ARE AVAILABLE FOR DRIVER-SPECIFIC USE.;Q"; 2. BUSYING OF UCB AND SCB.; A; 3. EXECUTION OF $CFORK TO GET TO PROPER PROCESSOR (MULTI- ; PROCESSOR SYSTEMS).; <; NOTE: $GSPKT MAY NOT BE USED BY A DRIVER WHICH SUPPORTS; QUEUE OPTIMIZATION.;D;O ; INPUTS:E;IB; R2=ADDRESS OF DRIVER'S ACCEPTANCE ROUTINE (IF CALL AT $GSPKT).@; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO GET A PACKET FOR.; ; OUTPUTS:;U<; C=1 IF CONTROLLER IS BUSY OR NO REQUEST CAN BE DEQUEUED./; C=0 IF A REQUEST WAS SUCCESSFULLY DEQUEUED.O"; R1=ADDRESS OF THE I/O PACKET.; R2=PHYSICAL UNIT NUMBER.E; R3=CONTROLLER INDEX.P,; R4=ADDRESS OF THE STATUS CONTROL BLOCK.*; R5=ADDRESS OF THE UNIT CONTROL BLOCK.;E2; NOTE: R4 AND R5 ARE DESTROYED BY THIS ROUTINE.;-; ;; DEFINE ADDRESS IN THE UCB EXTENSION AS MAPPED THRU APR6E; IOC=X.IOC+140000 ;I/O COUNT-WCNT=X.WCNT+140000 ;WORDS TRANSFERED COUNTF.CYLC=X.CYLC+140000 ;CYLINDERS CROSSED COUNT'CCYL=X.CCYL+140000 ;CURRENT CYLINDER -FCUR=X.FCUR+140000 ;CURRENT FAIRNESS COUNT+FLIM=X.FLIM+140000 ;FAIRNESS COUNT LIMITO-DSKD=X.DSKD+140000 ;DISK DIRECTION (1=OUT)T=; *********************************************************O ; * *R-; * > > > W A R N I N G < < < * ; * *S;; * THE FOLLOWING ARE OFFSET DEFINITIONS WHICH ARE *.;; * SUPPLIED EITHER BY DEFINITION IN THE EXEC (IOSUB) *E;; * OR THE DUMMY STB FILE (FROM SFVC2). ANY CHANGE TO *C;; * THESE DEFINITIONS MUST BE MADE IN BOTH MODULES. *C ; * * =; *********************************************************D;42TEMP=26 ;AMOUNT OF TEMPORARY STORAGE REQUIRED7G$$SPA==TEMP+6 ;CONSTANT TO ADD TO SP TO ABORT SCANR  .ENABL LSB>*$GTPKT::MOV #128$,R2 ;ACCEPT ALL PACKETS;$GSPKT::MOV R2,$TEMP2 ;SAVE ADDRESS OF ACCEPTANCE ROUTINE.25$: SUB #TEMP,SP ;GET TEMPORARY STORAGE ON STACK<10$: MOV U.SCB(R5),R4 ;GET ADDRESS OF STATUS CONTROL BLOCK# TSTB S.STS(R4) ;CONTROLLER BUSY?S% BNE 20$ ;IF NE CONTROLLER IS BUSY 1 BIC #S2.EIP,S.ST2(R4) ;CLEAR ERROR IN PROGRESS*. MOV R4,R1 ;GET THE ADDRESS OF THE LISTHEAD+15$: CALL SCAN ;SCAN FOR A USABLE PACKETA BCS 20$ ;NO MORE PACKETS CALL ACPCHK ;ACP FUNCTION? BCC 25$ ;IF CC NO1! CALL DEQUE ;REMOVE THE PACKETT;+; ** W A R N I N G **F;P; SPM HOOKPOINT NUMBER 22.;;+; DO NOT CHANGE THE INSTRUCTION FOLLOWINGS; LABEL WITHOUT CHECKING SPM;--$SPH22==. ;SPM CHANGES THE INSTRUCTION ATB! ;THE LOCATION OF THIS LABEL+ MOV U.ACP(R5),R0 ;GET ADDRESS OF ACP TCBR- CALL $EXRQP ;INSURE FILE SYSTEM IS ACTIVED BR 10$ ;GO AGAIN20$: JMP 95$ ;EXIT25$: ;KLN037S; ;KLN037T; IN REMOTE SYSTEMS, THE GENERIC DRIVER WILL HANDLE THE ATTACH AND DETATCH ;KLN0370; REQUESTS FOR THE REMOTE DEVICES ;KLN037; ;KLN0371 .IF DF C$$RMT ;REMOTE HOST SUPPORT ;KLN037  ;KLN037= BIT #HF.RMT,$HFMSK ;REOMTE HOST SUPPROT ENABLED? ;KLN037C! BEQ 27$ ;IF EQ NO ;KLN037R ;KLN037 /00qtttcccc MOV I.UCB(R1),R2 ;GET UCB ADDRESS ;KLN037  ;KLN037 D CMP (R2),$XXLOW ;IS THE DCB ADDRESS IN THE GENERIC RANGE? ;KLN037! BLO 27$ ;IF LO NO ;KLN037T' CMP (R2),$XXHGH ;IS IT? ;KLN037T, BLOS 60$ ;IF LO OR SAME, YES ;KLN037 ;KLN037; 27$: ;KLN037 .ENDC ; C$$RMT ;KLN037T ;KLN037; ; PROCESS ATTACH/DETACHR;F8 MOVB I.FCN+1(R1),R2 ;GET I/O FUNCTION CODE ;KLN0372 CMPB #IO.ATT/256.,R2 ;ATTACH FUNCTION? ;**-1 BNE 45$ ;IF NE NOA! CALL DEQUE ;REMOVE THE PACKETN1 MOV #IE.PRI&377,R0 ;ASSUME PRIVILEGE VIOLATION # TST U.CW1(R5) ;MOUNTABLE DEVICE?I BPL 30$ ;IF PL NO9 BITB #US.MNT!US.FOR,U.STS(R5) ;NOT MOUNTED OR FOREIGN?  BEQ 55$ ;IF EQ NO7130$: MOV I.TCB(R1),R0 ;ASSUME SUCCESSFUL ATTACH( TST U.ATT(R5) ;UNIT ALREADY ATTACHED? BEQ 35$ ;IF EQ NOR< MOV #IE.DAA&377,R0 ;SET STATUS OF DEVICE ALREADY ATTACHED  BR 55$ ;;35$: BITB #IQ.UMD,I.FCN(R1) ;IS THIS A DIAGNOSTIC ATTACH? BEQ 50$ ;IF EQ NO: BIT #DV.UMD,U.CW1(R5) ;USER MODE DIAGNOSTICS SUPPORTED? BEQ 40$ ;IF EQ NOO5 BISB #US.UMD,U.ST2(R5) ;INDICATE DIAGNOSTIC ATTACHI  BR 50$ ;940$: MOV #IE.IFC&377,R0 ;SET STATUS OF ILLEGAL FUNCTIONB  BR 55$ ;,45$: CMPB #IO.DET/256.,R2 ;DETACH FUNCTION BNE 60$ ;IF NE NOT! CALL DEQUE ;REMOVE THE PACKETQ0 MOV #IE.DNA&377,R0 ;ASSUME DEVICE NOT ATTCHED TST R3 ;UNIT ATTACHED?  BEQ 55$ ;IF EQ NOB  CLR R0 ;SET TO DETACH UNIT/  BICB #US.UMD,U.ST2(R5) ;RESET DIAGNOSTIC BITB+ 50$: MOV R0,U.ATT(R5) ;ATTACH/DETACH UNITU?  BITB #UC.ATT,U.CTL(R5) ;DOES DRIVER WANT CONTROL ON ATT/DET?C BNE 56$ ;IF NE YES7 MOV #IS.SUC&377,R0 ;SET SUCCESSFUL COMPLETION STATUSL155$: ADD #TEMP,SP ;CLEANUP THE STACK FOR $IOALT5% CALL $IOALT ;FINISH I/O OPERATION  BR 5$ ;GO AGAIN $56$: JMP 120$ ;PASS THE BRANCH ON=60$: BIT #DV.MSD,U.CW1(R5) ;IS THIS A MASS STORAGE DEVICE?$. BEQ 111$ ;IF EQ, NO, CAN'T DO OPT OR STATS+ .IF DF R$$AMD ;AUTOMATIC MOUNT/DISMOUNT ASSUME US.SIO,200. TSTB U.ST2(R5) ;STALLED I/O FOR THIS UNIT ?) BMI 111$ ;IF MI, YES. NO OPT OR STATS5 .ENDC ; DF R$$AMD *! MOV KISAR6,$TONYL ;SAVE DATA SPACE APR6," MOV U.UCBX(R5),KISAR6 ;MAP UCB EXTENSION6# BEQ 110$ ;IF EQ, NO UCB EXT, CAN'T DO OPT OR STATS6$ BITB #S3.OPT,S.ST3(R4) ;SEEK OPTIMIZATION ENABLED?%% BEQ 105$ ;IF EQ NO, DO STATS ONLYS&;S7'; INITIALIZATION FOR THE QUEUE OPTIMIZATION SCAN LOOP (;A&) TST (R1) ;IS THIS THE ONLY PACKET?#* BEQ 104$ ;IF EQ YES - DO IT NOW0++ INCB FCUR ;INCREMENT THE FAIRNESS COUNTT#, MOVB FLIM,R2 ;GET THE MAX COUNTO)- BICB #200,R2 ;CLEAR THE DIRECTION BITM). CMPB R2,FCUR ;FAIRNESS COUNT EXPIRED?M#/ BLO 104$ ;IF LO YES - DO IT NOWI01;Q>2; TWO IS SUBTRACTED FROM THE OFFSETS BELOW BECAUSE THE STACK:3; DOES NOT HAVE THE QUEUE SCAN LOOP RETURN ADDRESS ON IT4; &5 ASSUME OUTEX-2 ;ASSUME OUTEX-2 = 00675$: CLR (SP) ;CLEAR THE EXISTANCE INDICATORS47 MOV R1,LOWPK-2(SP) ;INIT ADDRESS OF LOWEST PACKET48 MOV R0,LOWPR-2(SP) ;INIT ADDRESS OF LOWEST PACKET69 MOV I.PRM+10(R1),LOW-2(SP) ;INIT LOWEST CYLINDER #+: MOVB I.PRI(R1),PRI-2(SP) ;INIT PRIORITY ;<;; =; QUEUE OPTIMIZATION SCAN LOOP>;;.?80$: CALL QOPUPD ;UPDATE THE QUEUE OPT INFO'@ BCS 105$ ;IF CS DO THIS PACKET NOW!E2A85$: CALL SCAN ;SCAN FOR THE NEXT USABLE PACKET%B BCS 100$ ;IF CS THERE ARE NO MORE ,C CMPB I.PRI(R1),PRI-2(SP) ;SAME PRIORITY?)D BNE 100$ ;IF NE NO - GO PICK A PACKET(.E90$: CMPB #IO.ATT/256.,I.FCN+1(R1) ;ATTACH?F BEQ 85$ ;IF EQ YES - GO ON*G CMPB #IO.DET/256.,I.FCN+1(R1) ;DETACH?H BEQ 85$ ;IF EQ YES - GO ON:I BITB #IQ.UMD,I.FCN(R1) ;IS THIS A DIAGNOSTIC FUNCTION?J BNE 85$ ;IF NE YES - GO ONK BR 80$ ;CONSIDER THIS ONE L1M95$: ADD #TEMP,SP ;RETURN THE TEMPORARY STORAGE5!N SEC ;SET CARRY FOR NO PACKETAO JMP 130$ ;AND EXIT-P100$: CALL FNDOPT ;FIND THE OPTIMAL PACKETR*Q CMP R1,(R4) ;IS THIS THE FIRST PACKET?R BNE 100qtntttt tfDATA05$ ;IF NE NO - GO ON,S104$: CLRB FCUR ;CLEAR THE FAIRNESS COUNT*T105$: ADD #1,IOC ;UPDATE UNIT I/O COUNT&U ADC IOC+2 ;AND THE HIGH ORDER WORD=V CMPB #IO.RLB/256.,I.FCN+1(R1) ;LOGICAL TRANSFER FUNCTION?OW BLO 110$ ;IF LO NO)X MOV I.PRM+4(R1),R3 ;GET THE BYTE COUNTRY ASR R3 ;MAKE IT WORDS#0Z ADD R3,WCNT ;UPDATE TOTAL WORDS XFERED COUNT'[ ADC WCNT+2 ;AND THE HIGH ORDER WORDN/\ BIT #S2.OPT,S.ST2(R4) ;QUEUE OPT SUPPORTED?C] BEQ 110$ ;IF EQ NO,^ MOV CCYL,R3 ;GET THE OLD CYLINDER NUMBER2_ MOV I.PRM+10(R1),CCYL ;SET THE NEW CURRENT CYL1` SUB CCYL,R3 ;SUBTRACT CURRENT CYLINDER NUMBERa BPL 108$ ;GET THE ABSOLUTE#b NEG R3 ;VALUE OF THE DIFFERENCE)*c108$: ADD R3,CYLC ;UPDATE THE CYLINDERSd ADC CYLC+2 ;THE SECOND WORD 4e110$: MOV $TONYL,KISAR6 ;RESTORE DATA APR6 MAPPING5f111$: CALL DEQUE ;REMOVE THE PACKET FOR PROCESSINGNg2h120$: ADD #TEMP,SP ;RETURN THE TEMPORARY STORAGEijk .IF DF S$$HDWl9m BIT #DV.MSD,U.CW1(R5) ;IS THIS A MASS STORAGE DEVICE?Un BEQ 125$ ;IF EQ NO1o MOV R1,R3 ;COPY I/O PACKET ADDRESS FOR $SHFNDS1p CALL $SHFN1 ;SEE IF THIS UNIT IS SHADOWED NOW q BCS 124$ ;IF CS NO1r CMP ML.PRI(R4),R1 ;IS THIS THE PRIMARY PACKET?P$s BNE 124$ ;IF NE NO -- DON'T COPY-t MOV R1,-(SP) ;SAVE R1 (I/O PACKET ADDRESS)O/u CMPB #IO.WLB/400,I.FCN+1(R2) ;IS IT A WRITE? ,v BNE 123$ ;IF NE NO -- DON'T QUEUE IT NOW!w MOV R5,-(SP) ;SAVE UCB ADDRESSE/x MOV U.SCB(R5),R4 ;GET SCB ADDRESS OF PRIMARYCy MOV R2,R1 ;COPY PKT ADDRESSE6z MOV I.UCB(R1),R5 ;GET UCB ADDRESS OF SECONDARY DISK+{ CLR -(SP) ;ASSUME PRIMARY AND SECONDARYS| ;HAVE SEPARATE SCBS 9} CMP U.SCB(R5),R4 ;PRIMARY AND SECONDARY HAVE SAME SCB? ~ BNE 121$ ;IF NE NO, OK! CMP $TEMP2,#128$ ;$GSPKT CALL?M) BNE 121$ ;IF NE YES, OK WITH SAME SCB- MOV R4,(SP) ;REMEMBER WE HAD TO INC S.STS % INCB S.STS(R4) ;SHOW THIS SCB BUSY 4121$: 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 BACK4122$: MOV (SP)+,R5 ;RESTORE UCB ADDRESS OF PRIMARY5123$: MOV (SP)+,R1 ;RESTORE R1 (I/O PACKET ADDRESS)C-124$: MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESSE7 MOV R1,S.PKT(R4) ;RE-SET I/O PACKET ADDRESS INTO SCB$125$: ;REF LABEL1 .ENDC! CMP $TEMP2,#128$ ;$GSPKT CALL?E, BNE 127$ ;IF NE YES, SKIP TO DRIVER CALL9 MOV I.PRM(R1),U.BUF(R5) ;INSERT RELOCATION BIAS IN UCB < MOV I.PRM+2(R1),U.BUF+2(R5) ;INSERT BUFFER ADDRESS IN UCB6 MOV I.PRM+4(R1),U.CNT(R5) ;INSERT BYTE COUNT IN UCB' INCB S.STS(R4) ;SHOW CONTROLLER BUSYA) BISB #US.BSY,U.STS(R5) ;SHOW UNIT BUSYA$ MOV S.KRB(R4),R3 ;GET KRB ADDRESS BEQ 126$ ;IF EQ NO KRB> BIT #KS.UOP,K.STS(R3) ;IS CONTROLLER PARALLEL OPERATION ENB BEQ 126$ ;IF EQ NO;I; CONTROLLER SUPPORTS PARALLEL OPERATION, AND REQUIRES SYNCHRONIZATION.IE; THIS TYPE OF CONTROLLER USUALLY HAS THE INTERRUPT ENABLED, AND ISG; CAPABLE OF SUSTAINING AN INTERRUPT WHILE INITIATING A NEW FUNCTION.4A; THE INTERRUPT MAY BE FROM SOME EXTERNAL EVENT, SUCH AS A DISKOH; BECOMMING READY. IF LEFT ALONE, THE DRIVER WOULD AUTOMATICALLY FORKH; FOR EVERY INTERRUPT, WHICH WOULD NOT DO SINCE THE FORK BLOCK IS USEDD; TO HOLD THE DRIVER CONTEXT FOR A NUMBER OF CONDITIONS DURING I/OF; INITIATION. THE PC WORD OF THE FORK BLOCK IS USED AS AN INTERLOCKG; TO SHOW IF A FORK IS ALLOWED, WHERE S.FRK+2 IS ZERO IF AN INTERRUPTAC; IS ALLOWED. IT IS THE DRIVERS RESPONSIBILITY TO CLR S.FRK+2 TO D; ALLOW INTERRUPTS ONCE THEY ARE EXPECTED. THE ONLY OTHER PROBLEMG; OCCURS WHEN A DRIVER HAS QUEUED A FORK WHILE THE EXEC AND/OR DRIVERAC; WERE ON THEIR WAY TO THIS POINT, AND WHEN $GTPKT ARRIVES HERE ABE; FORK BLOCK IS CURRENTLY IN THE FORK QUEUE. THE SOLUTION FOR THIS I; IS TO SIMPLY DEQUEUE THE FORK BLOCK AND THEREBY DROP THE INTERRUPT ONT+; THE FLOOR. WE WILL PROCEED TO DO THIS.R;R MTPS #PR7 ;INHIBIT DEADLOCKA LOCK$ $FORKL,SPIN, INC S.FRK+2(R4) ;;;SHOW FORK BLOCK IN USE400qtttcccc MOV #$FRKHD,R0 ;;;PREPARE TO REMOVE IT FROM QUEUE& TST (R0) ;;;IS IT POSSIBLY THERE ? BEQ 1251$ ;;;IF EQ NO ! MOV R4,R1 ;;;COPY SCB ADDRESSA' ADD #S.FRK,R1 ;;;POINT TO FORK BLOCKH+ CALL $QRMVA ;;;REMOVE IT FROM THE QUEUER1251$: ;REFERENCE LABEL ULOCK$ $FORKL,SPINQ  MTPS #0 .IF DF M$$PRO BR 127$ ;REENTER FLOW. .ENDC126$: ;REFERENCE LABELP .IF DF M$$PRO$ MOV (SP)+,R4 ;SAVE RETURN ADDRESS- CALL $CFORK ;EXECUTE ON CORRECT PROCESSORE' MOV R4,-(SP) ;REPLACE RETURN ADDRESS ) MOV U.SCB(R5),R4 ;RETRIEVE SCB ADDRESS; .ENDC127$: ;REFERENCE LABELA0 MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS/ MOVB U.UNIT(R5),R2 ;SET PHYSICAL UNIT NUMBERF;+; ** W A R N I N G **Q;M; SPM HOOKPOINT NUMBER 17.;+; DO NOT CHANGE THE INSTRUCTION FOLLOWING; LABEL WITHOUT CHECKING SPM;--$SPH17==. ;SPM CHANGES THE INSTRUCTION ATE! ;THE LOCATION OF THIS LABELU$ MOV S.KRB(R4),R3 ;GET KRB ADDRESS BEQ 128$ ;IF EQ NO KRB* MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX/128$: CLC ;SHOW VALID I/O PACKET FOR RETURNM130$: ;REFERENCE LABEL ;+; ** W A R N I N G **R;T6; SPM HOOKPOINT NUMBER - THE FOLLOWING RETURN IS THE1; NULL CALL FOR HOOKING SEVERAL EXTERNAL TASKS.O;C+; DO NOT CHANGE THE INSTRUCTION FOLLOWINGI; LABEL WITHOUT CHECKING SPM;-+$SPVEX==. ;SPM EXPECTS THIS INSTRUCTIONE ;TO BE RETURNE  RETURNM  .DSABL LSB ;A7; QOPUPD -- UPDATE THE QUEUE OPTIMIZATION INFORMATION;;O@; THIS ROUTINE UPDATES THE QUEUE OPTIMIZATION SCAN INFORMATIONF; FOR THE CURRENT PACKET. THIS INFORMATION IS USED LATER BY FNDOPT.;P ; INPUT:;R(; R1=ADDRESS OF THE CURRENT I/O PACKET; R5=ADDRESS OF THE UCBE;T ; OUTPUTS:;O%; C=0 IF THE SCAN SHOULD CONTINUE.&; THE OPTIMIZATION DATA IS UPDATED.5; THIS DATA IS ON THE STACK IN THE FOLLOWING FORM.T;R3 ; +--------------------------------------------+ , ; 30(SP) ! DRIVER RETURN ADDRESS !3 ; !--------------------------------------------!M( ; 26(SP) ! CURRENT PRIORITY !3 ; !--------------------------------------------!.'; 24(SP) ! LOWEST CYLINDER !O3; !--------------------------------------------!2; 22(SP) ! ADDRESS OF THE ABOVE PACKET !3; !--------------------------------------------!:; 20(SP) ! ADDRESS OF THE PREVIOUS PACKET FOR ABOVE !3; !--------------------------------------------! :; 16(SP) ! NEAREST CYLINDER IN THE INWARD DIRECTION !3; !--------------------------------------------! 2; 14(SP) ! ADDRESS OF THE ABOVE PACKET !3; !--------------------------------------------! :; 12(SP) ! ADDRESS OF THE PREVIOUS PACKET FOR ABOVE !3; !--------------------------------------------!K:; 10(SP) ! NEAREST CYLINDER IN THE OUTWARD DIRECTION !3; !--------------------------------------------!O1; 6(SP) ! ADDRESS OF THE ABOVE PACKET !-3; !--------------------------------------------!I9; 4(SP) ! ADDRESS OF THE PREVIOUS PACKET FOR ABOVE !-3; !--------------------+-----------------------!K9 ; 3(SP) ! INWARD EXISTANCE ! OUTWARD EXISTANCE !-9!; 2(SP) ! FLAG (HIGH BIT=1) ! FLAG (HIGH BIT=1) !V:"; !--------------------+-----------------------!5#; 0(SP) ! OPTIMIZATION LOOP RETURN ADDRESS !N3$; +--------------------------------------------+-%;!&; ALL REGISTERS ARE PRESERVED.C'; (;--); C=1 IF THE CURRENT PACKET SHOULD BE USED-&*; R1=ADDRESS OF THE CURRENT PACKET'+; R0-ADDRESS OF THE PREVIOUS PACKET-,;--.;-//; NOTE: THESE OFFSETS ARE ALSO USED BY FNDOPTT0; 81PKT=I.PRM+10 ;OFFSET (R1) FOR CYLINDER FOR THIS PACKET/2PRI=26 ;OFFSET (SP) FOR THE CURRENT PRIORITY-13LOW=24 ;OFFSET (SP) FOR LOWEST CYLINDER NUMBER!14LOWPK=22 ;OFFSET (SP) FOR PACKET ADDRESS OF LOW-;5LOWPR=20 ;OFFSET (SP) FOR PREVIOUS PACKET ADDRESS FOR LOWR9600qtntttt tfDATAOUT=10 ;OFFSET (SP) FOR NEAREST CYL IN THE OUTWARD DIRN17OUTPK=6 ;OFFSET (SP) FOR PACKET ADDRESS OF OUTU;8OUTPR=4 ;OFFSET (SP) FOR PREVIOUS PACKET ADDRESS FOR OUT79IN=16 ;OFFSET (SP) FOR NEAREST CYL IN THE INWARD DIRT0:INPK=14 ;OFFSET (SP) FOR PACKET ADDRESS OF IN:;INPR=12 ;OFFSET (SP) FOR PREVIOUS PACKET ADDRESS FOR IN7<OUTEX=2 ;OFFSET (SP) FOR OUTWARD EXISTANCE INDICATOR5=INEX=3 ;OFFSET (SP) FOR INWARD EXISTANCE INDICATORO>0?QOPUPD: CMP PKT(R1),CCYL ;ON CURRENT CYLINDER?@ BNE 10$ ;IF NE NOS)A SEC ;EXIT WITH CARRY SET (DO IT NOW)U B BR 70$ ;C7D10$: CMP PKT(R1),LOW(SP) ;IS THIS THE CURRENT LOWEST? E BHIS 20$ ;IF GE NO;F MOV PKT(R1),LOW(SP) ;SET THE NEW LOWEST CYLINDER NUMBER, (G MOV R1,LOWPK(SP) ;ITS PACKET ADDRESS,4H MOV R0,LOWPR(SP) ;AND THE PREVIOUS PACKET ADDRESSI@J20$: CMP PKT(R1),CCYL ;THIS PACKET LESS THAN CURRENT LOCATION?K BLOS 40$ ;IF LE YES L-M TSTB OUTEX(SP) ;HAVE WE SETUP OUTWARD YET? N BPL 30$ ;IF PL NOR8O CMP PKT(R1),OUT(SP) ;THIS PACKET NEAREST OUTWARD ONE?P BHIS 60$ ;IF GE NO<Q30$: MOV PKT(R1),OUT(SP) ;SET THE NEW NEAREST OUTWARD CYL,(R MOV R1,OUTPK(SP) ;ITS PACKET ADDRESS,4S MOV R0,OUTPR(SP) ;AND THE PREVIOUS PACKET ADDRESS#T BISB #200,OUTEX(SP) ;AND NOTE IT U BR 60$ ;EXITV/W40$: TSTB INEX(SP) ;HAVE WE SETUP INWARD YET?0X BPL 50$ ;IF PL NOI6Y CMP PKT(R1),IN(SP) ;THIS PACKET NEAREST INWARD ONE?Z BLOS 60$ ;IF LE NO:[50$: MOV PKT(R1),IN(SP) ;SET THE NEW NEAREST INWARD CYL,'\ MOV R1,INPK(SP) ;ITS PACKET ADDRESS,S3] MOV R0,INPR(SP) ;AND THE PREVIOUS PACKET ADDRESST"^ BISB #200,INEX(SP) ;AND NOTE IT_)`60$: CLC ;SET FLAG FOR CONTINUED SCANRa70$: RETURN ;Pbc;D?d; FNDOPT -- FIND THE OPTIMAL PACKET FOR THE CURRENT ALGORITHM e;BAf; THIS ROUTINE PICKS THE OPTIMAL PACKET USING THE DATA PRODUCEDCg; BY QOPUPD. IT SUPPORTS NEAREST CYLINDER, ELEVATOR, AND C-SCAN.Wh;NCi; NOTE: THE OFFSETS AND THE STACK STRUCTURE ARE DEFINED IN QOPUPDAj;I k; INPUTS:l;R m; THE DATA PRODUCED BY QOPUPD.n; R4=SCB ADDRESSo; R5=UCB ADDRESS p; CCYL=CURRENT CYLINDER NUMBER/q; DSKD=HIGH BIT OF BYTE SET IF MOVING OUTWARDNr;D2s; THE OPTIMIZATION ALGORITHM ENCODED AS FOLLOWS:t;T&u; S2.OP2,S2.OP1=0,0 NEAREST CYLINDERv; =0,1 ELEVATORIw; =1,0 C-SCANCx; =1,1 RESERVEDEy;z;Q {; OUTPUT:P|; $}; R1=ADDRESS OF THE OPTIMAL PACKET*~; THE CURRENT CYLINDER NUMBER IS UPDATED); THE DIRECTION IS UPDATED IF NECESSARY;U;5FNDOPT: BIT #S2.OP2,S.ST2(R4) ;C-SCAN OR RESERVED? BEQ 20$ ;IF EQ NO $ BIT #S2.OP1,S.ST2(R4) ;RESERVED? BEQ 10$ ;IF EQ NOF; BGCK$A BF.OPT,BE.IDC,FATAL ;OPTIMIZATION - RESERVED CODED;O ; C-SCAN; ,10$: TSTB OUTEX(SP) ;OUTWARD PACKET EXIST?" BMI 50$ ;IF MI YES - RETURN IT2 MOV LOWPK(SP),R1 ;ELSE RETURN THE LOWEST PACKET5 MOV LOWPR(SP),R0 ;AND THE PREVIOUS PACKETS ADDRESS  BR 70$ ;EXIT(20$: BIT #S2.OP1,S.ST2(R4) ;ELEVATOR? BEQ 40$ ;IF EQ NO; ; ELEVATOR;.  TSTB DSKD ;ARE WE GOING OUT? BMI 30$ ;IF MI YES& TSTB INEX(SP) ;INWARD PACKET EXIST?" BMI 60$ ;IF MI YES - RETURN IT  BISB #200,DSKD ;SET GOING OUT,30$: TSTB OUTEX(SP) ;OUTWARD PACKET EXIST?" BMI 50$ ;IF MI YES - RETURN IT BICB #200,DSKD ;SET GOING IN ( BR 60$ ;AND RETURN THE INWARD PACKET; ; NEAREST CYLINDER; *40$: TSTB INEX(SP) ;INWARD PACKET EXIST?& BPL 50$ ;IF PL NO - RETURN OUTWARD( TSTB OUTEX(SP) ;OUTWARD PACKET EXIST?% BPL 60$ ;IF PL NO - RETURN INWARDA( MOV CCYL,R1 ;GET THE CURRENT CYLINDER0 SUB R1,OUT(SP) ;CALCULATE DISTANCE TO OUTWARD. SUB IN(SP),R1 ;CALCULATE DISTANCE TO INWARD! CMP R1,OUT(SP) ;INWARD CLOSER?O BLO 60$ ;IF LT YES250$: MOV OUTPK(SP),R1 ;RETURN THE OUTWARD PACKET5 MOV OUTPR(SP),R0 ;AND THE PREVIOUS PACKETS ADDRESST BR 70$ ;EXIT060$: MOV INPK(SP),R1 ;RETURN THE INWARD PACKET4 MOV INPR(SP),R0 ;AND THE PREVIOUS PACKETS ADDRESS70$: ;REF LABEL  RETURN ;00qtttcccc; 4; SCAN -- SCAN THE DRIVER QUEUE FOR USABLE PACKETS;R2; THIS ROUTINE IS CALLED TO SCAN A DRIVER QUEUE./; EACH USABLE ENTRY IN THE QUEUE IS RETURNED.T;A ; INPUTS:,;P.; R4=SCB ADDRESS FOR THE QUEUE TO BE SCANNED;V ; OUTPUTS:;R8; C=1 IF THERE ARE NO MORE USABLE ENTRIES IN THE QUEUE2; C=0 IF THE NEXT USABLE ENTRY IS BEING RETURNED&; R0=ADDRESS OF THE PREVIOUS PACKET%; R1=ADDRESS OF THE CURRENT PACKETS*; R5=UCB ADDRESS FOR THE CURRENT PACKET;3; NOTE: R0 AND R1 MUST BE PRESERVED BETWEEN CALLSB; TO THIS ROUTINE.;RSCAN:L210$: MOV R1,R0 ;SAVE ADDRESS OF PREVIOUS PACKET+ MOV (R0),R1 ;GET ADDRESS OF NEXT PACKETP* BEQ 50$ ;IF EQ NO MORE PACKETS TO SCAN6 MOV I.UCB(R1),R5 ;GET ADDRESS OF UNIT CONTROL BLOCK TSTB U.STS(R5) ;UNIT BUSY?E BMI 10$ ;IF MI YES .IF DF R$$AMD ASSUME US.SIO,200( TSTB U.ST2(R5) ;I/O STALLED TO UNIT ? BPL 15$ ;IF PL, NO8 CMP $VERTK,I.TCB(R1) ;PACKET FROM VERIFICATION TASK ?' BEQ 40$ ;IF EQ, YES. DEQUEUE PACKET& BR 10$ ;NO, SEARCH FOR NEXT PACKET .ENDC ; DF R$$AMD 15$: ;F# MOV U.ATT(R5),R3 ;UNIT ATTACHED?T BEQ 40$ ;IF EQ NOP1 CMP #IO.LOV,I.FCN(R1) ;LOAD OVERLAY FUNCTION ?V BEQ 17$ ;IF EQ YES9 CMP #IO.LDO,I.FCN(R1) ;HOW ABOUT LOAD D-SPACE OVERLAY? BNE 20$ ;IF NE NO(17$: TST U.CW1(R5) ;MOUNTABLE DEVICE ?1 BMI 40$ ;IF MI YES, ALWAYS BREAK THROUGH ATT.L20$: ;REFERENCE LABEL6 MOV I.TCB(R1),R2 ;GET ADDRESS OF REQUESTOR TASK TCB& CMP $RCTPT,R2 ;IS THE I/O FROM RCT?- BEQ 40$ ;IF EQ YES, ALWAYS LET IT THROUGH;9 BIT #T3.PRV!T3.CLI,T.ST3(R2) ;TASK PRIVILEGED OR CLI ?D BEQ 30$ ;IF EQ NON- CMP R2,$LDRPT ;REQUESTING TASK THE LOADER?T/ BEQ 40$ ;IF EQ YES-ALWAYS BREAK THRU ATTACHF, BIT #DV.TTY,U.CW1(R5) ;DEVICE A TERMINAL? BEQ 30$ ;IF EQ NO7: CMPB #IO.WLB/256.,I.FCN+1(R1) ;WRITE LOGICAL FUNCTION ?) BNE 30$ ;IF NE NO, DON'T BREAKTHROUGHF/ BITB #TF.WBT,I.FCN(R1) ;BREAKTHROUGH WRITE ? $ BNE 40$ ;IF NE YES, BREAKTHROUGH030$: CMP R2,R3 ;IS THIS THE APPROPRIATE TASK? BNE 10$ ;IF NE NOB440$: CALL @$TEMP2 ;CALL DRIVER ACCEPTANCE ROUTINE& BCS 10$ ;IF CS PACKET NOT ACCEPTED BR 60$ ;RETURN THE PACKETT-50$: SEC ;INDICATE NO MORE USABLE PACKETSC60$: RETURN ;EXIT1;AD; ACPCHK -- THIS ROUTINE DETERMINES IF A PACKET IS AN ACP FUNCTION; ; INPUT:;?; R1=ADDRESS OF THE PACKET; R5=ADDRESS OF THE UCB.;. ; OUTPUT:K;G( ; C=1 IF THE PACKET IS AN ACP FUNCTION ; C=0 IF NOT ;, * ACPCHK: TST U.CW1(R5) ;DEVICE MOUNTABLE? BPL 40$ ;IF PL NO : BITB #IQ.UMD,I.FCN(R1) ;IS THIS A DIAGNOSTIC FUNCTION?3 BNE 40$ ;IF NE YES, IT CAN'T BE AN ACP FUNCTION;:); DETERMINE IF FUNCTION IS ACP FUNCTION:; APPLICABLE TO ALL MOUNTED DEVICES - NATIVE AND FOREIGN8; FILES 11 - MAPPING OF VIRTUAL TO LOGICAL NOW DONE BY.; DRQIO. ONLY VIRTUAL & ACP FUNCTIONS THAT4; NEED CORRECT SEQUENCING ARE ROUTED THRU DRIVER.;T% TST U.ACP(R5) ;TEST ADDRESS OF ACPF* BEQ 40$ ;NO ACP - PASS IT ON TO DRIVER- MOVB I.FCN+1(R1),R2 ;GET THE FUNCTION CODE ; BITB #US.FOR,U.STS(R5) ;MOUNTED FOREIGN (ASSUMED MOUNTED$  ;WITH AN ACP FROM ABOVE)5 BNE 10$ ;IF NE YES, CHECK DCB MASKS FOR ACP FUNC.O, CMP #IO.CLN/400,R2 ;IS IT AN ACP FUNCTION& BHI 40$ ;IF HI NO, QUEUE TO DRIVER#  BR 30$ ;ELSE IS AN ACP FUNCTION!$"10$: MOV (R5),R3 ;GET DCB ADDRESS$# CMP R2,#15. ;NORMALIZE FCTN CODE$ BLOS 20$ ;% SUB #16.,R2 ;A*& ADD #10,R3 ;ADJUST PTR TO 2ND MASK SET%'20$: ASL R2 ;CONVERT TO WORD INDEX.3( BIT $BTMSK(R2),D.MSK+6(R3) ;IS IT ACP FUNCTION??,) BNE 30$ ;IF NE ACP FUNCTIONE6*40$: TST (PC)+ ;CLEAR CARRY FOR DRIVER FUNCTION AND&+ ;SKIP FOLLOWING INSTRUCTION (MOM', ;WARNED ME NOT TO CODE LIKE THIS) #-30$: SEC ;INDICATE ACP FUNCTIONE . RETURN/; "0; DEQUE -- DEQUEUE AN I/O PACKET1;:-2; THIS ROUTINE DEQUEUES THE CURRENT PACKET. 3;A 4; INPUT:5;%6; R0=ADDRESS00qtntttt tfDATA OF THE PREVIOUS PACKETD'7; R1=ADDRESS OF THE PACKET TO DEQUEUE08; R4=SCB ADDRESS9;R :; OUTPUT:B;;T<; THE PACKET IS DEQUEUED=; R1 IS UNCHANGEDE>; ?4@DEQUE: MOV (R1),(R0) ;CLOSE UP LIST REMOVING ENTRY-A BNE 10$ ;IF NE LAST ENTRY WAS NOT REMOVEDU0B MOV R0,2(R4) ;SET ADDRESS OF NEW LAST IN LIST:C10$: MOV R1,S.PKT(R4) ;SET ADDRESS OF CURRENT I/O PACKETD RETURN ;AND EXIT EFG;+4H; **-$TSTBF-TEST IF I/O BUFFERING CAN BE INITIATEDI;FJ; THIS ROUTINE DETERMINES IF A GIVEN I/O REQUEST IS ELIGIBLE FOR I/OEK; BUFFERING, AND IF SO IT STORES THE PCB ADDRESS OF THE REGION INTOAL; WHICH THE TRANSFER IS TO OCCUR IN I.PRM+16 OF THE I/O PACKET.:M;( N; INPUTS:SO;L,P; R3=ADDRESS OF I/O PACKET FOR I/O REQUESTQ;A R; OUTPUTS:S;MT; R3 IS PRESERVED.U; *V; C=0 IF I/O BUFFERING CAN BE INITIATED.W;D.X; C=1 IF I/O BUFFERING CAN NOT BE INITIATED.Y;-Z.[$TSTBF::SEC ;ASSUME TASK CANNOT BE STOPPED\ .IF DF R$$IIC:] BIT #1,I.IOSB+4(R3) ;INTERNAL I/O COMPLETION SPECIFIED?,^ BNE 20$ ;IF NE YES, DON'T BUFFER ANY I/O_ .ENDC ;R$$IIC1` MOV I.TCB(R3),R0 ;GET ADDRESS OF REQUESTOR TCBO$a BIT #T2.STP,T.ST2(R0) ;STOP TASK?b BNE 20$ ;IF NE NOL8c MOV I.AADA(R3),R0 ;COPY ATTACHMENT DESCRIPTOR ADDRESS-d MOV A.PCB(R0),R1 ;POINT TO PCB OF TRANSFER 8e BIT #PS.CHK!PS.FXD,P.STAT(R1) ;IS PCB CHECKPOINTABLE?f BNE 20$ ;IF NE NO 3g MOV R1,I.PRM+16(R3) ;SET PCB ADDRESS OF TRANSFERN&h CLC ;INDICATE TASK MAY BE STOPPEDi20$: RETURN ;Njk;+$l; **-$INIBF-INITIATE I/O BUFFERINGm;Y@n; THIS ROUTINE INITIATES I/O BUFFERING BY DOING THE FOLLOWING:o;D*p; 1. DECREMENT THE TASK'S I/O COUNT.q;;/r; 2. INCREMENT THE TASK'S BUFFERED I/O COUNT(s;06t; 3. INITIATE CHECKPOINTING IF A REQUEST IS PENDINGu;I v; INPUTS:Tw;E-x; R3=ADDRESS OF I/O PACKET FOR I/O REQUEST.Ey;N z; OUTPUTS:{; |; R3 IS PRESERVED.};-~+$INIBF::MOV R3,-(SP) ;SAVE PACKET ADDRESSN2 CALL $DECBF ;DEC PCB I/O COUNTS & UNBLOCK TASK0 MOV I.TCB(R3),R0 ;POINT TO ISSUING TASK'S TCB/ INCB T.TIO(R0) ;TALLY A BUFFERED I/O REQUEST 7 DECB T.IOC(R0) ;ADJUST OUTSTANDING I/O REQUEST COUNT  MOV I.PRM+16(R3),R1 ;GET PCBH? SUB P.REL(R1),I.PRM(R3) ;CONVERT TO RELATIVE RELOCATION BIASG+ ADD #T.ST2,R0 ;POINT TO TASK STATUS BITS: BIT #T2.AST!T2.WFR,(R0) ;TASK IN AST OR WAITFOR STATE ? BMI 10$ ;IF MI AT AST STATES' BEQ 10$ ;IF EQ NOT IN WAITFOR STATE;5 BIS #T2.SEF,(R0) ;STOP THE TASK FOR THE EVENT FLAGT10$: ;REFERENCE LABEL- MOV (SP)+,R3 ;RESTORE PACKET ADDRESS IN R3  RETURN ;Y;+/; **-$QUEBF-QUEUE BUFFERED I/O FOR COMPLETIOND;/I; THIS ROUTINE QUEUES A SPECIAL ENTRY TO A TASK'S AST QUEUE TO COMPLETERH; A BUFFERED I/O REQUEST THE NEXT TIME THE TASK IS SCHEDULED. IT ALSO,; DECREMENTS THE TASK'S BUFFERED I/O COUNT;SF; NOTE: THIS ROUTINE IS EQUIVALENT TO CALLING $IOFIN AND IT DOES NOT; UNBUSY THE DEVICE.;B ; INPUTS:0;O; R0=FIRST WORD OF I/O STATUS ; R1=SECOND WORD OF I/O STATUS; R3=ADDRESS OF I/O PACKET;R ; OUTPUTS:;; NONE;-?$QUEBF::MOV R0,I.PRM+6(R3) ;STORE OFFSPRING I/O RETURN STATUSE MOV R1,I.PRM+10(R3) ;2 MOV I.TCB(R3),R0 ;PICK UP OFFSPRING TCB ADDRESS0 MOVB #AK.BUF,A.CBL(R3) ;SET BUFFERED I/O FLAG;+4;**-$REQUE-REQUEUE A REGION LOAD AST TO A TASK ASTF;**-$REQU1-REQUEUE A REGION LOAD AST TO A TASK AST (ALTERNATE ENTRY);DE; THESE ROUTINES ARE USED TO QUEUE A TASK KERNEL AST WHICH HAS BEEN B; USED AS A REGION LOAD AST BACK AS A TASK AST. THE BUFFERED I/O8; COUNT OF THE TASK IS DECREMENTED IF ENTRY AT $REQUE.;R ; INPUTS:S%; R0=TCB ADDRESS OF ASSOCIATED TASKR%; R3=ADDRESS OF PACKET TO BE QUEUEDP;P ; OUTPUTS: ; NONE. ;- $REQUE::3$REQU1::BIC #TS.CIP!TS.RDN,T.STAT(R0) ;UNBLK TASKR MOV R0,R2 ;COPY TCB ADDRESS*( ADD #T.ASTL,R2 ;POINT TO AST LISTHEAD. MOV (R2),(R3) ;LINK PACKET TO FRONT OF LIST  BNE 10$ ;Q MOV R3,2(R2) ;A10$: MOV R3,(R2)00qtttcccc ; / BIT #T2.SEF,T.ST2(R0) ;TASK IN STOPFOR STATE  BNE 12$ ;IF NE YES2 CALLR $SETCR ;SET CONDITIONAL SCHEDULE REQUEST,12$: CALLR $EXRQU ;UNSTOP TASK AND RETURN;+(; **-$IODSA-I/O DONE (FOR DSA DRIVERS)(; **-$IOALT-I/O DONE (ALTERNATE ENTRY); **-$IODON-I/O DONE;SP; THIS ROUTINE IS CALLED BY DEVICE DRIVERS AT THE COMPLETION OF AN I/O REQUESTN; TO DO FINAL PROCESSING. THE UNIT AND CONTROLLER ARE SET IDLE AND $IOFIN IS%; ENTERED TO FINISH THE PROCESSING.R;) ; INPUTS:#;F; R0=FIRST I/O STATUS WORD.T; R1=SECOND I/O STATUS WORD.=; R2=STARTING AND FINAL ERROR RETRY COUNTS IF ERROR LOGGINGR ; DEVICE.E; R5=ADDRESS OF THE UNIT CONTROL BLOCK OF THE UNIT BEING COMPLETED.+; (SP)=RETURN ADDRESS TO DRIVER'S CALLER. ;OE; NOTE: IF ENTRY IS AT $IOALT, THEN R1 IS CLEAR TO SIGNIFY THAT THE ; SECOND STATUS WORD IS ZERO.; J; IF ENTRY IS AT $IODSA, UMR DEALLOCATION, DEVICE BUSY STATUS, AND); ERROR LOGGING FINISH CODE IS SKIPPED ; OUTPUTS:; ); THE UNIT AND CONTROLLER ARE SET IDLE./;T); R3=ADDRESS OF THE CURRENT I/O PACKET.E;-  .ENABL LSBO.$IOALT::CLR R1 ;ZERO SECOND I/O STATUS WORD $IODON::;+; ** W A R N I N G **;); SPM HOOKPOINT NUMBER 18.; +; DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM;--$SPH18==. ;SPM CHANGES THE INSTRUCTION ATT! ;THE LOCATION OF THIS LABELD8 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$$DVC3 BIT #S2.EIP,S.ST2(R4) ;IS AN ERROR IN PROGRESS?I BEQ 15$ ;IF EQ NON, MOV R1,-(SP) ;SAVE SECOND I/O STATUS WORD- CALL $FNERL ;FINISH ERROR LOGGING PROCESSG( MOV (SP)+,R1 ;RESTORE I/O STATUS WORD .ENDC ; DF E$$LOG&E$$DVCS15$: ;REFERENCE LABEL .IF DF U$$UMR. BIT #FE.EXT,$FMASK ;IS THIS A 22-BIT SYSTEM  BEQ 20$ ;IF EQ NOL/  BITB #UC.NPR,U.CTL(R5) ;IS IT AN NPR DEVICE? )  BEQ 20$ ;IF EQ NO, DOES NOT USE UMR'SU!  MOV S.KRB(R4),R2 ;POINT TO KRB/  BEQ 20$ ;BLOW OFF ALLOCATING UMRS IF NO KRBEB BIT #KS.MBC!KS.EXT,K.STS(R2) ;DIRECT ACCESS TO 22-BIT ADDRESS?& BNE 20$ ;IF NE YES -- USES NO UMRS) ADD K.OFF(R2),R2 ;POINT PAST UMR BLOCKO. SUB #M.LGTH,R2 ;POINT TO START OF UMR BLOCK# CALL $DEUMR ;DEASSIGN ANY UMR'S8 MOV #$DQUMR,-(SP) ;PUSH ADDRESS TO CHECK FOR UMR WAIT .ENDC ; DF U$$UMR720$: MOV S.PKT(R4),R3 ;RETRIEVE ADDRESS OF I/O PACKET .IF DF,P$$MON+ BR 200$ ; SKIP PERFORMANCE MONITOR NOPST .IFTF ; P$$MONO $IODSA:: ! .IFT ; P$$MON";+#; ** W A R N I N G **I$;A%; SPM HOOKPOINT NUMBER 19.&;$+'; DO NOT CHANGE THE INSTRUCTION FOLLOWING)(; LABEL WITHOUT CHECKING SPM);-*-+$SPH19==. ;SPM CHANGES THE INSTRUCTION ATR!, ;THE LOCATION OF THIS LABELU-). NOP ;UGLY, BUT WE HAVE TO DO THIS AS/ ;THERE'S NO OTHER WAY*0 NOP ;TO BE ASSURED OF EXACTLY 2 WORDS1 ;TO REPLACE..2200$: ;REFERENCE LABEL TO BYPASS THE NOPS3 ;EXCEPT FOR $IODSA45 .ENDC67 .IF DF E$$LOG&E$$DVC 869 BIT #S2.LOG,S.ST2(R4) ;ERROR LOGGING (MASS STORE) ?: BEQ 23$ ;IF EQ NO>; TALLY$ B.MIOC,XA$$IO,CPU ;COUNT A MASS STORE I/O COMPLETION<23$:= .ENDC ; DF E$$LOG&E$$DVCS>? .IF DF Q$$OPT@1A TST (R4) ;ANY OTHER I/O REQUESTS TO INITIATE?PB BEQ 25$ ;IF EQ GO TO $IOFINA&C MOV R3,R4 ;COPY I/O PACKET POINTER6D ADD #I.PRM+14,R4 ;POINT TO LAST WORD FOR FORK BLOCK0E MOV R0,(R4) ;STORE I/O STATUS BLOCK CONTENTSF MOV R1,-(R4) ;IGHI .IF DF M$$PROJ.K MOV $CPBIT,-6(R4) ;SET UP OUR URM FOR FORK0LM .ENDCNO7P CALL $FORK0 ;FORK HERE TO ALLOW NEXT I/O INITIATION,0Q MOV R4,R0 ;RESTORE I/O STATUS BLOCK CONTENTSR MOV R5,R1 ;G5S SUB #I.PRM+10,R3 ;POINT TO BEGINNING OF I/O PACKETTTU .ENDCVAV25$: MOV I.UCB(R3),R5 ;GET UCB ADDRESS OF I/O REQUEST ;JWB168 WX .IF DF 00qtntttt tfDATAS$$HDWY6[ CALL $SHFND ;IS THIS UNIT SHADOW RECORDED? ;**-1\ BCC 251$ ;IF CC YESU] JMP IOFIN2 ;GO TO $IOFIN:^251$: TSTB ML.DNC(R4) ;IS THIS FIRST PACKET THRU SYSTEM?6_ BNE 40$ ;IF NE NO -- MUST DECIDE WHAT TO TELL USER`a;F?b; THIS I/O PACKET IS THE FIRST ONE TO GO THRU THE SYSTEM. IFOAc; IT IS A WRITE PACKET, THEN WE MUST WAIT TO SEE THE OUTCOME OFTd; THE SECOND PACKET.e;f/g CMPB #IO.WLB/400,I.FCN+1(R3) ;IS IT A WRITE?D2h BNE 26$ ;IF NE NO -- CHECK FOR OTHER FUNCTIONS>i CALLR $SHSAV ;IF EQ YES -- SAVE STS AND WAIT FOR OTHER PKT=j26$: CMP #IO.SCF,I.FCN(R3) ;IS THIS A SHADOW COPY FUNCTION?Sk BEQ 28$ ;IF EQ YES9l CMPB #IO.RLB/400,I.FCN+1(R3) ;IS THIS A READ FUNCTION?I/m BNE 271$ ;IF NE NO -- DON'T KNOW WHAT IT ISEn ;BETTER EXIT NOWop; Bq; THIS FUNCTION IS AN IO.RLB FUNCTION (READ) AND NO SPECIAL COPY?r; SUBFUNCTION WAS SPECIFIED. WE NOW MUST CHECK TO SEE IF THE0 s; READ COMPLETED SUCCESSFULLY.t;2u%v CMP R0,#IS.SUC ;WAS IT SUCCESSFUL?w BEQ 271$ ;IF EQ YES -- EXITVxy; Az; THE FUNCTION IS A READ, AND THE FIRST I/O PACKET FAILED. NOWC?{; WE MUST DETERMINE WHETHER WE NEED TO CHECK THE FENCE (WHICH+C|; MEANS THAT CATCHUP IS ACTIVE) PRIOR TO TRYING THE OTHER PACKET.W}; ~! MOV R5,-(SP) ;SAVE UCB ADDRESS $ MOV U.UMB(R5),R5 ;GET UMB ADDRESS* CALL $CKLBN ;IS LBN RANGE BELOW FENCE?$ MOV (SP)+,R5 ;RESTORE UCB ADDRESS BCC 30$ ;IF CC YES 27$: CALL $SHSAV ;SAVE STATUS% MOV R3,-(SP) ;PREPARE TO LOG ERROR" MOV R3,-(SP) ;PREPARE SOME MORE) BR 45$ ;GO LOG SHADOW RECORDING ERRORH271$: JMP IOFIN1 ;EXIT >28$: MOV #IO.WLB,I.FCN(R2) ;SET WRITE LOGICAL BLOCK FUNCTION= MOVB #251.,I.PRI(R2) ;SET PRIORITY TO THE HIGHEST POSSIBLE ;F; I/O PACKET IS A FAILED READ OR A READ/WRITE COMBINED. WE NOW WILLA; ATTEMPT TO QUEUE THE PACKET TO THE ALTERNATE DRIVE AND SEE IF+6; WE CAN'T GET SOME BETTER RESULTS TO TELL THE USER.; .30$: CALL $SHSAV ;SAVE STATUS IN I/O PACKET$ MOV I.UCB(R2),R5 ;GET UCB ADDRESS& MOV R2,R1 ;COPY I/O PACKET ADDRESS5 CALLR $DRQRQ ;TRY OTHER I/O PACKET TO OTHER DRIVE#;F,; AT THIS POINT, WE HAVE DONE TWO PACKETS.8; WE MUST CONSOLIDATE THE RESULTS TO PASS TO THE USER.; 40$: CALL $SHSAV ;SAVE STATUS* TSTB I.R0(R2) ;ERROR FROM FIRST PACKET? BMI 42$ ;IF MI YES TSTB R0 ;ERROR FROM SECOND?E BMI 42$ ;IF MI YES) JMP IOFIN1 ;SUCCESS FROM BOTH PACKETS;:6; WE HAVE DETERMINED THAT AT LEAST ONE OF THE STATUS+; RETURN CODES SHOWED AN ERROR CONDITION./;K842$: MOV ML.PRI(R4),R3 ;GET PRIMARY I/O PACKET ADDRESS# MOV R4,R2 ;COPY ML NODE ADDRESS 0 ADD #ML.PKT,R2 ;R2 = SECONDARY PACKET ADDRESS; MOV I.R0(R3),ML.PR0(R4) ;SAVE STATUS FROM PRIMARY PACKET ; MOV I.R1(R3),ML.PR1(R4) ;SAVE STATUS FROM PRIMARY PACKETB- MOV R3,-(SP) ;SAVE PRIMARY PACKET ON STACKO- MOV R3,-(SP) ;SAVE PRIMARY PACKET ON STACKU9 CMP #IO.SCF,I.FCN(R3) ;IS THIS A SHADOW COPY FUNCTION?T BNE 43$ ;IF NE NO + TSTB I.R0(R3) ;IS THE PRIMARY STATUS OK?I BMI 45$ ;IF MI NO:# BR 44$ ;RETURN SECONDARY STATUSA343$: TSTB I.R0(R3) ;HOW DOES PRIMARY STATUS LOOK? BPL 45$ ;IF PL OKE844$: MOV R2,(SP) ;RETURN STATUS FROM SECONDARY PACKET;M7; WE HAVE DECIDED WHICH STATUS TO RETURN TO THE USER. ;P'45$: MOV R4,R1 ;COPY ML NODE ADDRESS 3 MOV $SHERR,R0 ;GET TCB ADDRESS OF THE ERROR TASKT  BEQ 46$ ;IF EQ NO ERROR TASK9 CMP $SHPCT,$SHLIM ;DO WE ALREADY HAVE ENOUGH PACKETS ? . BLT 451$ ;IF LT NO, GO AHEAD WITH THIS ONE8 TST $SHLOS ;HAVE WE LOST TOO MANY TO KEEP TRACK OF ?, BMI 46$ ;IF MI YES, DON'T COUNT THIS ONE# INC $SHLOS ;COUNT ONE MORE LOST BR 46$ ;AND THROW IT AWAYS,451$: INC $SHPCT ;COUNT ONE MORE IN QUEUE4 CLR ML.FID(R4) ;INITIALIZE FILE ID FOR ERROR TASK3 CLR ML.FSEQ(R4) ;INITIALIZE FILE SEQUENCE NUMBERH2 CALL GETWIN ;GET WINDOW ADDRESS, IS THERE ONE?, BEQ 454$ ;IF EQ THERE IS NO WINDOW BLOCK$ MOV W.FCB(R2),R2 ;GET F00qtttccccCB ADDRESS* BEQ 454$ ;IF EQ, NO FILE CONTROL BLOCK MOV KISAR5,-(SP) ;SAVE PAR 5T MOV R3,-(SP) ;SAVE R3- CMP R2,#120000 ;IS THE FCB WITHIN THE ACP?E BLO 452$ ;IF LO NO$ MOV I.UCB(R3),R3 ;GET UCB ADDRESS$ MOV U.ACP(R3),R3 ;GET ACP ADDRESS? MOV T.OFF(R3),KISAR5 ;PICK UP OFFSET INTO TASK REGION OF ACP 0 MOV T.PCB(R3),R3 ;GET PCB ADDRESS FOR THE ACP= BIT #PS.CKP!PS.CKR!PS.OUT,P.STAT(R3) ;IS ACP CHECKPOINTED? BNE 453$ ;IF NE YESS> ADD P.REL(R3),KISAR5 ;MAP THE ACP TASK REGION THROUGH APR 5. CMP R2,#140000 ;IS THE FCB MAPPED BY APR 6? BLO 452$ ;IF LO NO3 SUB #20000,R2 ;CONVERT FCB ADDRESS TO APR 5 BIAS 4 ADD #200,KISAR5 ;ADJUST MAPPING TO NEXT 4K OF FCP:452$: MOV F.FNUM(R2),ML.FID(R4) ;MOVE FILE ID TO ML NODE8 MOV F.FSEQ(R2),ML.FSEQ(R4) ;MOVE FILE SEQUENCE NUMBER 453$: MOV (SP)+,R3 ;RESTORE R3) MOV (SP)+,KISAR5 ;RESTORE KERNEL PAR 5P5454$: CALL $DLNK ;REMOVE THE ML NODE FROM THE LIST4( MOV ML.TCB(R4),R3 ;GET ADDRESS OF TCB4 MOV T.NAM(R3),ML.TCB(R4) ;PUT TASK NAME IN PACKET! MOV T.NAM+2(R3),ML.TCB+2(R4) ;, CALL $EXRQF ;QUEUE ML NODE TO ERROR TASK646$: MOV (SP)+,R3 ;GET I/O PACKET ADDRESS FROM STACK' MOV I.R0(R3),R0 ;GET PROPER STATUSES.' MOV I.R1(R3),R1 ;GET PROPER STATUSESO, MOV (SP)+,R3 ;GET REAL I/O PACKET ADDRESS ;**-45" .ENDC ; DF S$$HDW ;JWB213 ;**-1O .IF DF P$$MON! BR P1 ;BYPASS IOFIN HOOKPOINT  .ENDC  .DSABL LSB,;+; **-$IOFIN-I/O FINISH;MO; THIS ROUTINE IS CALLED TO FINISH I/O PROCESSING IN CASES WHERE THE UNIT ANDEI; CONTROLLER ARE NOT TO BE DECLARED IDLE. IF THE TASK WHICH ISSUED THERG; I/O HAS HAD A RECENT MAPPING CHANGE WHICH MAY HAVE UNMAPPED ITS I/O,H; STATUS BLOCK, THE I/O PACKET IS QUEUED TO THE FRONT OF ITS AST QUEUE<; TO BE COMPLETED LATER IN $FINBF BY CALLING $IOFIN AGAIN.;* ; INPUTS:D;M; R0=FIRST I/O STATUS WORD. ; R1=SECOND I/O STATUS WORD.); R3=ADDRESS OF THE I/O REQUEST PACKET.I; ; OUTPUTS:;I' ; THE FOLLOWING ACTIONS ARE PERFORMEDC ;WG ; 1-THE FINAL I/O STATUS VALUES ARE STORED IN THE I/O STATUS BLOCK IFA ; ONE WAS SPECIFIED.  ;A=; 2-ALL ASSOCIATED I/O COUNTS ARE DECREMENTED AND TS.RDN IS:; CLEARED IN CASE THE TASK WAS BLOCKED FOR I/O RUNDOWN.<; T3.MPC IS CLEARED IF THE TASK I/O COUNT GOES TO ZERO TO=; INDICATE THAT THE I/O COUNT WENT TO ZERO AFTER A MAPPING ; CHANGE.;NA; 3-IF 'TS.CKR' IS SET, THEN IT IS CLEARED AND CHECKPOINTING OF; THE TASK IS INITIATED. ;WD; 4-IF AN AST SERVICE ROUTINE WAS SPECIFIED, THEN AN AST IS QUEUED6; FOR THE TASK. ELSE THE I/O PACKET IS DEALLOCATED.; 4; 5-A SIGNIFICANT EVENT OR EQUIVALENT IS DECLARED.; *; NOTE: R4 IS DESTROYED BY THIS ROUTINE.;-$IOFIN:: ;REFERENCE LABELS ! .IF DF P$$MON"#;+$; ** W A R N I N G **C%;H&; SPM HOOKPOINT NUMBER 35.'; +(; DO NOT CHANGE THE INSTRUCTION FOLLOWINGC); LABEL WITHOUT CHECKING SPM*;-+-,$SPH35==. ;SPM CHANGES THE INSTRUCTION AT!- ;THE LOCATION OF THIS LABEL .(/ NOP ;UGLY, BUT IT'S THE ONLY WAY WE"0 ;CAN ASSURE TWO INSTRUCTIONS)1 NOP ;TO PICK UP AND REPLACE WITH THEE2 ;SPM HOOKS3P1:45 .ENDC66 .ENABL LSB ; BM3877%8 .IF DF R$$AMD ;AUTOMOUNT/DISMOUNT9@:; NOTE THAT THIS CODE WILL NOT WORK IF EITHER ERROR LOGGING OR!;; SHADOW RECORDING IS TURNED ONN<.= TSTB R0 ;ERROR IN PROCESSING I/O REQUEST ?> BPL 100$ ;IF PL, NO)? MOV I.UCB(R3),R4 ;YES, GET UCB ADDRESSN@ ASSUME US.SIO,200(A TSTB U.ST2(R4) ;I/O STALLED TO UNIT ?-B BPL 100$ ;IF PL, NO - PASS ERRORS TO TASKN=C CMP $VERTK,I.TCB(R3) ;I/O REQUEST FROM VERIFICATION TASK ?S.D BEQ 100$ ;IF EQ, YES - PASS ERRORS TO TASK5E MOV U.SCB(R4),R0 ;GET SCB LISTHEAD FOR I/O PACKETSO%F MOV R3,R1 ;GET CURRENT I/O PACKETN6G ADD #U.SPRM,R4 ;POINT TO PARAMETER SAVE AREA IN UCB;H ADD #I.PRM+6,R3 ;POINT TO READ/WRITE CELLS IN I/O PACKETEI MOV (R4)+,(R3)+ ;RESTOREJ MOV (R400qtntttt tfDATA)+,(R3)+ ; I/O K MOV (R4)+,(R3)+ ; PACKETL MOV (R4),(R3) ;3M CALL $QINSB ;RE-INSERT PACKET AT FRONT OF QUEUE N RETURN ;TOP100$: ;REFERENCE LABELOQR .ENDC ; DF R$$AMDST .IF DF S$$HDWUV MOV R5,-(SP) ;SAVE R59W MOV I.UCB(R3),R5 ;SET UCB ADDRESS FOR SHADOW RECORDINGO/X CALL $SHFND ;SEE IF WE HAVE PACKET PROBLEMS#Y MOV (SP)+,R5 ;RESTORE R5 )Z BCS IOFIN2 ;IF CS NO SHADOW RECORDING [\;RD]; THIS IS THE POINT WHERE WE WILL DEALLOCATE AN ML NODE AND RETURNF^; THE STATUS IN THE REGISTERS TO THE USER. ALL PROCESSING CONCERNED>_; WITH STATUS RETURNS MUST HAVE BEEN RESOLVED AT THIS POINT.`;a6bIOFIN1: CALL $DLNK ;REMOVE ML NODE FROM LIST ON UMB4c MOV ML.PRI(R4),R3 ;GET PRIMARY I/O PACKET ADDRESS(d MOV R3,-(SP) ;SAVE I/O PACKET ADDRESSe MOV R1,-(SP) ;SAVE STATUSf MOV R0,-(SP) ;SAVE STATUS,g MOVB ML.LEN(R4),R1 ;GET LENGTH OF ML NODE#h MOV R4,R0 ;COPY ML NODE ADDRESSR*i CALL $DEACB ;RELEASE STORE FOR ML NODEj MOV (SP)+,R0 ;RESTORE STATUSHk MOV (SP)+,R1 ;RESTORE STATUSU+l MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSUmIOFIN2: ;REFERENCE LABELEno .ENDCp4q TALLY$ B.AIOC,XA$$IO,CPU ;COUNT AN I/O COMPLETIONrs5t MOV R0,I.PRM+6(R3) ;STORE FIRST WORD OF I/O STATUSS7u MOV R1,I.PRM+10(R3) ;STORE SECOND WORD OF I/O STATUSP(v TSTB I.EFN(R3) ;VIRTUAL I/O FUNCTION?"v BPL 205$ ;IF PL NO ; BM3873x BICB #200,I.EFN(R3) ;CLEAR VIRTUAL FLAG ;**-10y BIT #1,I.LN2(R3) ;HEADER LOCKED DOWN FOR ACP?z BNE 1$ ;IF NE NO;{ MOV I.TCB(R3),R0 ;THE I/O PACKET IS CONNECTED TO THE TCBE4| MOV T.ATT(R0),R0 ;THE TCB IS CONNECTED TO THE ADB } SUB #A.TCBL,R0 ;FIND THE FOOT"~ CALL $DECIO ;UNLOCK THE HEADER1$: ;REFERENCE LABEL(2 MOV #205$,-(SP) ;FAKE RETURN ADDRESS ; BM3879$DCWIO::MOV $WCFLG,R0 ;GET UCB FLAG FOR TEST ; BM3873, BEQ 11$ ;IF EQ W.IOC DISABLED ; BM3876 MOV I.UCB(R3),R2 ;GET DEVICE UCB ADDRESS ; BM3871 BIT R0,U.CW1(R2) ;FILES-11 DEVICE ? ; BM387W! BEQ 2$ ;IF EQ, NO ; BM387< CALL GETWIN ;GET WINDOW ADDRESS, IS THERE ONE ? ; BM387! BEQ 2$ ;IF EQ, NO ; BM387C7 DECB W.IOC(R2) ;DECREMENT WINDOW I/O COUNT ; BM387 11$: ; ; BM387 .IF DF R$$LKL ;**-62 MOV I.PRM+16(R3),R0 ;PICK UP LOCK BLOCK ADDRESS BEQ 2$ ;IF EQ THERE IS NONEO3 CMP R0,#140000 ;IS IT A RELOCATED USER ADDRESS ?  BHIS 2$ ;IF HIS, YES% DEC (R0) ;FREE LOCK FOR UNLOCKING7 .ENDC ; DF R$$LKL2$:E RETURN ; BM387;&205$: ;REFERENCE LABEL ; BM3877 MOV I.IOSB+4(R3),R2 ;GET ADDRESS OF I/O STATUS BLOCK;0 BEQ 10$ ;IF EQ NO I/O STATUS BLOCK SPECIFIED .IF DF R$$IIC1 BIT #1,R2 ;INTERNAL I/O COMPLETION REQUESTED?L" BEQ 21$ ;IF LO BIT NOT SET, NO DEC R2 ;CLEAR LO BIT0 MOV KISAR5,-(SP) ;SAVE CURRENT KISAR5 MAPPING0 MOV KISAR6,-(SP) ;SAVE CURRENT KISAR6 MAPPING6 MOV I.IOSB+2(R3),KISAR5 ;MAP I/O COMPLETION ROUTINE: MOV KISAR5,KISAR6 ;ROUTINE MAY BE MAPPED THROUGH KISAR6 .IF DF K$$DAS# MOV KINAR5,-(SP) ;SAVE I-SPACE 5I# MOV KINAR6,-(SP) ;SAVE I-SPACE 6U$ MOV KISAR5, KINAR5 ;MAP I-SPACE 5$ MOV KISAR6, KINAR6 ;MAP I-SPACE 6 .IFTF ; K$$DAST3 CALL (R2) ;CALL INTERNAL I/O COMPLETION ROUTINEN .IFT ; K$$DAS2 MOV (SP)+,KINAR6 ;RESTORE SAVED MAPPING CONTEXT MOV (SP)+,KINAR5 ;... .ENDC ; K$$DASI2 MOV (SP)+,KISAR6 ;RESTORE SAVED MAPPING CONTEXT MOV (SP)+,KISAR5 ;S RETURN ;DONE 21$: ;REF LABEL .ENDC ;R$$IIC. MOV I.TCB(R3),R0 ;POINT TO ISSUING TASK TCB8 BIT #TS.BLC,T.STAT(R0) ;TASK BLOCKED (CHECKPOINTED) ?. BNE 3$ ;IF NE YES, DEFER I/O STATUS UPDATE0 BIT #T3.MPC,T.ST3(R0) ;RECENT MAPPING CHANGE? BEQ 5$ ;IF EQ NO83$: CALL $SETCR ;RESCHEDULE TASK TO LOOK AT AST QUEUE& MOV R3,R1 ;COPY I/O PACKET POINTER: MOVB #AK.DIO,A.CBL(R1) ;INDICATE DELAYED I/O COMPLETION3 ADD #T.ASTL,R0 ;POINT TO TASK AST QUEUE LISTHEAD+3 CALL $QINSB ;INSERT BLOCK AT BEGINNING OF QUEUE2 BR $DECAL ;DEC I/O00qtttcccc COUNTS, UNBLK TASK & RETURN,5$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING3 MOV I.IOSB+2(R3),KISAR6 ;MAP TO I/O STATUS BLOCKD6 MOV I.PRM+6(R3),(R2)+ ;SET FINAL I/O STATUS VALUES MOV I.PRM+10(R3),(R2) ;, MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING210$: CALL $DECAL ;DEC I/O COUNTS & UNBLOCK TASK6 MOV I.TCB(R3),R1 ;GET ADDRESS OF TASK CONTROL BLOCK. DECB T.IOC(R1) ;DECREMENT I/O REQUEST COUNT1 BNE 15$ ;IF NE TASK STILL HAS OUTSTANDING I/O 2 BIC #T3.MPC,T.ST3(R1) ;CLEAR MAPPING CHANGE BIT15$: ;REF LABEL7 MOV I.TCB(R3),R1 ;PICK UP ISSUING TASK'S TCB ADDRESS+! MOV R5,-(SP) ;SAVE UCB ADDRESSC$ MOV I.TCB(R3),R5 ;SET TCB ADDRESS+ MOVB I.EFN(R3),R0 ;GET EVENT FLAG NUMBER)3 CALL $SETFG ;SET EFN AND UNLOCK IF GROUP GLOBAL0& MOV R3,R0 ;COPY I/O PACKET ADDRESS# TST (R3)+ ;POINT TO SECOND WORDO5 MOV #I.LGTH,(R3)+ ;INSERT LENGTH OF BLOCK IN BYTESRA MOV #8.*2,(R3)+ ;SET NUMBER OF BYTES TO ALLOCATE ON USER STACK* MOV I.AST(R0),(R3)+ ;INSERT AST ADDRESS! BEQ 70$ ;IF EQ NONE SPECIFIEDM0 MOV #1,(R3)+ ;INSERT NUMBER OF AST PARAMETERSB MOV I.IOSB(R0),(R3) ;INSERT VIRTUAL ADDRESS OF I/O STATUS BLOCK) MOV R0,R1 ;COPY ADDRESS OF I/O PACKETL0 MOV R5,R0 ;CALCULATE ADDRESS OF AST LISTHEAD ADD #T.ASTL,R0 ;$ CALL $QINSF ;INSERT AST IN QUEUE MOV R5,R0 ;COPY TCB ADDRESSR* CALL $SETCR ;SET TASK SCHEDULE REQUEST  BR 80$ ;*70$: CALL $DEPKT ;DEALLOCATE I/O PACKET(80$: MOV (SP)+,R5 ;RESTORE UCB ADDRESS  RETURN ;A .DSABL LSB ; BM387 ; BM387#;+$; *-GETWIN-GET FILE WINDOW ADDRESS;I ; INPUT:; R3=I/O PACKET ADDRESSO; ; OUTPUT:; R2=WINDOW ADDRESSR; Z-BIT SET IF NO WINDOW;-@GETWIN: MOV I.LN2(R3),R2 ;GET IMAGE OF LUT2 OR ADDRESS OF LUT2 BIT #1,R2 ;ADDRESS? BNE 10$ ;IF NE NO  .IF DF X$$HDR) MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING$ MOV I.TCB(R3),R2 ;GET TCB ADDRESS3 MOV T.PCB(R2),R2 ;GET PCB ADDRESS OF TASK REGIONR5 MOV P.REL(R2),KISAR6 ;ASSUME WE NEED TO MAP HEADER  .IFTF* MOV @I.LN2(R3),R2 ;GET CONTENTS OF LUT2 .IFT3$ MOV (SP)+,KISAR6 ;RESTORE MAPPING .ENDC410$: BIC #1,R2 ;CLEAR POSSIBLE INTERLOCK, WINDOW?  RETURN ;2;+7 ; **-$DECAL-DECREMENT ALL I/O COUNTS AND UNBLOCK TASKE ; A ; THIS ROUTINE IS CALLED ON I/O COMPLETION TO DECREMENT ALL I/OR@ ; COUNTS IN ATTACHMENT DESCRIPTORS AND TO UNBLOCK THE TASK FOR* ; CHECKPOINT IN PROGRESS OR I/O RUNDOWN.;R ; INPUTS: ;M; R3=ADDRESS OF I/O PACKET.;F ; OUTPUTS:;( ; NONE. ;-;$DECAL::MOV I.AADA(R3),R0 ;DEC I/O COUNT IN 1ST ATT DESC?G BEQ 10$ ;IF EQ NO0& CLR I.AADA(R3) ;CLEAR ATT DESCR PTR$ CALL $DECIO ;DECREMENT THE COUNT;10$: MOV I.AADA+2(R3),R0 ;DEC I/O COUNT IN 2ND ATT DESCR? BEQ 20$ ;IF EQ NO ( CLR I.AADA+2(R3) ;CLEAR ATT DESCR PTR$ CALL $DECIO ;DECREMENT THE COUNT2 20$: MOV I.TCB(R3),R0 ;POINT TO ISSUING TASK TCB.! BIC #TS.CIP!TS.RDN,T.STAT(R0) ;UNBLOCK TASK " RETURN ;E#$;+A%; **-$DECBF-DECREMENT ALL PARTITION I/O COUNTS AND UNBLOCK TASK:&;.@'; THIS ROUTINE IS CALLED ON BUFFERINT I/O TO DECREMENT ALL I/O<(; COUNTS IN PCBS AND TO UNBLOCK THE TASK FOR CHECKPOINT IN); PROGRESS OR I/O RUNDOWN.*;D +; INPUTS:E,; -; R3=ADDRESS OF I/O PACKET.Q.; /; OUTPUTS:0;I 1; NONE. 2;-3/4$DECBF::MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS55 MOV I.AADA(R3),R0 ;DEC I/O COUNT IN 1ST ATT DESCR?B6 BEQ 10$ ;IF EQ NOT+7 BIS #1,I.AADA(R3) ;INDICATE BUFFERED I/O$8 CALL $DECIP ;DECREMENT THE COUNT'9 MOV (SP),R3 ;RESTORE PACKET ADDRESSH;:10$: MOV I.AADA+2(R3),R0 ;DEC I/O COUNT IN 2ND ATT DESCR?; BEQ 20$ ;IF EQ NO -< BIS #1,I.AADA+2(R3) ;INDICATE BUFFERED I/OS$= CALL $DECIP ;DECREMENT THE COUNT+>20$: MOV (SP)+,R3 ;RESTORE PACKET ADDRESS.? MOV I.TCB(R3),R0 ;POINT TO ISSUING TASK TCB.@ BIC #TS.CIP!TS.RDN,T.STAT(R0) ;UNBLOCK TASK A RETURN ;;BCD;+E; **-$IOKIL-I/O KILLF;$NG; THIS ROU00quntttt tfDATATINE IS CALLED TO FLUSH ALL I/O REQUESTS FOR THE CURRENT TASK FROMLH; A DEVICE QUEUE AND TO CANCEL THE CURRENT I/O OPERATION IN PROGRESS IF IT!I; IS ALSO FOR THE CURRENT TASK.DJ; K; INPUTS: L;Q>M; R5=ADDRESS OF THE UCB OF THE DEVICE TO FLUSH REQUESTS FOR.N; O; OUTPUTS:P;TDQ; IF THE SPECIFIED DEVICE IS NOT FILE STRUCTURED, THEN THE I/O RE-FR; REQUEST QUEUE IS FLUSHED AND THE CURRENT I/O OPERATION IN PROGRESSS; IS CANCELLED.T;*U; NOTE: R4 IS DESTROYED BY THIS ROUTINE.V;-W X$IOKIL::YZ .IF DF M$$PRO[2\ CLR $TEMP0 ;INDICATE THIS IS NOT DRQIO CALLING]^ .ENDC ; DF M$$PRO_2`$IOKL1::CLR $TEMP2 ;SET INDICATOR TO FLUSH ASTS.a$IOKL2::MOV U.SCB(R5),R4 ;GET ADDRESS OF SCB1b MOV $TKTCB,R1 ;GET TCB ADDRESS OF CURRENT TASK(c TST U.CW1(R5) ;DEVICE-UNIT MOUNTABLE?d BPL 10$ ;IF PL NOT/e BITB #US.MNT,U.STS(R5) ;DEVICE-UNIT MOUNTED?H#f BNE 10$ ;IF EQ NO - FLUSH QUEUER<g TST U.ACP(R5) ;DEVICE HAVE ACP (ALSO CATCHES NOT FOREIGN)(h BNE 40$ ;IF NE ES, CAN'T FLUSH QUEUEh10$: ;KLN054C1h .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN054h ;KLN054Ah BIT #F5.RTK,$FMSK5 ;IS REMOTE TASK SUPPORT TURNED ON? ;KLN054O!h BEQ 15$ ;IF EQ NO ;KLN054h ;KLN054 Dh CMP (R5),$XXLOW ;IS THE DCB ADDRESS IN THE GENERIC RANGE? ;KLN054!h BLO 15$ ;IF LO NO ;KLN054U'h CMP (R5),$XXHGH ;IS IT? ;KLN054>h BLOS 40$ ;IF LO OR SAME, YES DON'T FLUSH QUEUE YET ;KLN054h ;KLN054Oh .ENDC ;C$$RTK ;KLN054,h15$: ;KLN054::h MOV R4,R3 ;COPY ADDRESS OF I/O QUEUE LISTHEAD ;KLN0548j20$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT ENTRY ;**-1*k MOV (R2),R3 ;GET ADDRESS OF NEXT ENTRYl BEQ 40$ ;IF EQ END OF LIST/m CMP R1,I.TCB(R3) ;REQUEST FOR CURRENT TASK?Tn BNE 20$ ;IF NE NOE/o CMP R5,I.UCB(R3) ;REQUEST FOR SPECIFIED UCB?Kp BNE 20$ ;IF NE NOHq MOV (R3),(R2) ;CLOSE UP LIST r BNE 30$ ;IF NE NO NEW LAST(s MOV R2,2(R4) ;SET ADDRESS OF NEW LAST4t30$: MOV #IE.ABO&377,R0 ;SET FINAL STATUS TO ABORT1u TSTB $TEMP2 ;SUBFUNCTION BIT SET FOR IO.KIL ?Lv BMI 35$ ;IF MI YES4w CLR I.AST(R3) ;MAKE SURE THERE IS NO AST DECLARED.x35$: CLR R1 ;CLEAR R1 BEFORE CALLING $IOFIN#y CALL $IOFIN ;FINISH I/O REQUEST.z BR $IOKL2 ;GO AGAINR!{40$: TSTB U.STS(R5) ;UNIT BUSY?,| BMI 45$ ;IF MI YES -- ALWAYS CALL DRIVER}~ .IF DF M$$PRO$ MOV U.SCB(R5),R4 ;GET SCB ADDRESS- MOV S.KRB(R4),R4 ;GET KRB ADDRESS (IF ANY)A) BEQ 44$ ;IF EQ NO KRB -- CALL DRIVER?R1 BIT K.URM(R4),$URMST ;IS THE KRB'S URM ONLINE?U* BEQ 50$ ;IF EQ NO -- DON'T CALL DRIVER .ENDCA44$: BITB #UC.KIL,U.CTL(R5) ;CALL DRIVER REGARDLESS OF ACTIVITYB BEQ 50$ ;IF EQ NO -- EXITI* BITB #US.OFL,U.ST2(R5) ;DEVICE ONLINE ? BNE 50$ ;IF NE NO -- EXIT 45$: ;REFERENCE LABEL .IF DF M$$PRO+ MOV $TEMP0,R0 ;WERE WE CALLED FROM DRQIOR BEQ 46$ ;IF EQ NO" MOV R0,SP ;RESET STACK POINTER0 TST (SP)+ ;ADVANCE PAST SECONDARY PACKET PTR0 MOV (SP)+,R4 ;SET ADDRESS OF I/O PACKET IN R42 INC R4 ;MAKE IT ODD TO INDICATE PACKET ADDRESS TST (SP)+ ;CLEAN STACK* BR 461$ ;AND FORK TO CORRECT PROCESSOR246$: MOV $TKTCB,R4 ;GET CURRENT TASK TCB ADDRESS)461$: MOV U.SCB(R5),R2 ;GET SCB ADDRESSE( MOV #465$,R3 ;GET THE ROUTINE ADDRESS7 JMP $EXRP1 ;TRANSFER EXECUTION TO CORRECT PROCESSOR0/465$: BIT #1,R4 ;WERE WE CALLED FROM DRQIO ?( BEQ 462$ ;IF EQ NO, JUST CALL DRIVER" MOV R4,R3 ;COPY PACKET ADDRESS DEC R3 ;CLEAR LOW ORDER BITE CLR R1 ;SET LENGTH AND( MOV #IS.SUC&377,R0 ;STATUS FOR $IOFIN8 MOV I.TCB(R3),-(SP) ;SAVE TCB ADDRESS FOR DRIVER CALL' CALL $IOFIN ;FINISH THE I/O REQUEST,% MOV (SP)+,R4 ;RETRIEVE TCB ADDRESS$,462$: MOV R4,R1 ;RESTORE CURRENT TASK TCB( MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESS .ENDC6 MOV S.PKT(R4),R0 ;GET ADDRESS OF CURRENT I/O PACKET9 MOV (R5),R2 ;RETRIEVE ADDRESS OF DEVICE CONTROL BLOCKV1 MOV KINAR5,-(SP) ;SAVE KERNEL INSTR ADDR REG 5;00q uttcccc .IF DF K$$DAS0 MOV KDSAR5,-(SP) ;SAVE KERNEL DATA ADDR REG 5 .IFTF .IF DF X$$HDR& MOV KISAR6,-(SP) ;SAVE KERNEL APR 6 .ENDC+ MOV D.PCB(R2),R3 ;GET DRIVER PCB ADDRESSS) BEQ 47$ ;IF EQ DRIVER IS PART OF EXEC 6 MOV P.REL(R3),KINAR5 ;MAP THE DRIVER IN INSTR SPACE .IFT5 MOV P.REL(R3),KDSAR5 ;MAP THE DRIVER IN DATA SPACE .IFTF=47$: MOV D.DSP(R2),R2 ;GET ADDRESS OF DRIVER DISPATCH TABLES% BEQ 49$ ;IF EQ DRIVER IS UNLOADED$ MOV S.KRB(R4),R3 ;GET KRB ADDRESS! BEQ 48$ ;IF EQ NO KRB ADDRESS& MTPS K.PRI(R3) ;SET DEVICE PRIORITY3 MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX FROM KRB;VG; CALL DRIVER AT CANCEL I/O OPERATION ENTRY POINT WITH THE ARGUMENTS: ;E); R0=ADDRESS OF THE CURRENT I/O PACKET. .; R1=ADDRESS OF THE TCB OF THE CURRENT TASK.; R3=CONTROLLER INDEX.+; R4=ADDRESS OF THE STATUS CONTROL BLOCK.D); R5=ADDRESS OF THE UNIT CONTROL BLOCK. ;S4; IF S.KRB=0 THEN R3 IS UNDEFINED AND PRIORITY =0.;R-48$: MOV R5,-(SP) ;;;PROTECT R5 FROM DRIVERS. CALL @D.VCAN(R2) ;;;CANCEL CURRENT REQUESTS MOV (SP)+,R5 ;;;RETRIEVE R5& MTPS #0 ;;;ALLOW DEVICE INTERRUPTS49$: ;REF LABEL .IF DF X$$HDR) MOV (SP)+,KISAR6 ;RESTORE KERNEL APR 6N .ENDC .IFTO3 MOV (SP)+,KDSAR5 ;RESTORE KERNEL DATA ADDR REG 5 .ENDC4 MOV (SP)+,KINAR5 ;RESTORE KERNEL INSTR ADDR REG 550$: RETURN ;;+ ; **-$SCDVT-SCAN DEVICE TABLES2; **-$SCDV1-SCAN DEVICE TABLES (ALTERNATE ENTRY);MR; THIS ROUTINE IS A CO-ROUTINE THAT IS CALLED TO SCAN THE DEVICE TABLES. FOR EAC.; UNIT CONTROL BLOCK THE CALLER IS RECALLED.; ; INPUTS:;(; R3=LIST POINTER (IF ENTRY AT $SCDV1);S ; OUTPUTS:;6; C=1 IF NO MORE ENTRIES EXIST IN THE DEVICE TABLES.9; C=0 IF THE NEXT DEVICE TABLE ENTRY IS BEING RETURNED.M,; R3=ADDRESS OF THE DEVICE CONTROL BLOCK.,; R4=ADDRESS OF THE STATUS CONTROL BLOCK.* ; R5=ADDRESS OF THE UNIT CONTROL BLOCK. ;- = ; ********************************************************* ; * *A-; * > > > W A R N I N G < < < *B ; * * ;; * THE FOLLOWING ARE OFFSET DEFINITIONS WHICH ARE *I;; * SUPPLIED EITHER BY DEFINITION IN THE EXEC (IOSUB) *O;; * OR THE DUMMY STB FILE (FROM SFVC2). ANY CHANGE TO *E;; * THESE DEFINITIONS MUST BE MADE IN BOTH MODULES. *D ; * *L=; *********************************************************R;F1S$$SPA==10 ;SYMBOL TO ADD TO SP TO ABORT SCAN*6S$$SPC==6 ;OFFSET ON SP TO CLR TO SKIP CURRENT DCB:$SCDVT::MOV #$DEVHD,R3 ;GET ADDRESS OF FIRST DCB ADDRESS8$SCDV1::MOV (SP)+,R4 ;REMOVE RETURN ADDRESS FROM STACK,10$: MOV (R3),R3 ;GET ADDRESS OF NEXT DCB BEQ 30$ ;IF EQ NO MORE' MOV D.UCB(R3),R5 ;POINT TO FIRST UCB)( BIT #DV.PSE,U.CW1(R5) ;PSEUDO DEVICE?  BNE 10$ ;IF NE YES=! MOVB D.UNIT+1(R3),-(SP) ;CALCULATE NUMBER OF UCB'S TO SCAN*" SUB D.UNIT(R3),(SP) ;%#20$: MOV R3,-(SP) ;SAVE DCB ADDRESSD!$ MOV R5,-(SP) ;SAVE UCB ADDRESS #% MOV R4,-(SP) ;SET RETURN ADDRESST8& MOV U.SCB(R5),R4 ;GET ADDRESS OF STATUS CONTROL BLOCK' CLC ;INDICATE ENTRY ( CALL @(SP)+ ;CALL THE CALLER&) MOV (SP)+,R4 ;REMOVE RETURN ADDRESS$* MOV (SP)+,R5 ;RESTORE UCB ADDRESS$+ MOV (SP)+,R3 ;RESTORE DCB ADDRESS', ADD D.UCBL(R3),R5 ;POINT TO NEXT UCBO&- DECB (SP) ;ANY MORE UCB'S TO SCAN?. CMPB (SP),#-1 ;/ BNE 20$ ;IF NE YES0 TST (SP)+ ;CLEAN STACK1 BR 10$ ;GO AGAIN230$: SEC ;INDICATE NO ENTRYM3 JMP (R4) ;RETURN TO CALLER45 .ENDP) ;SET RETURN ADDRESST8& MOV U.SCB(R5),R4 ;GET ADDRESS OF STATUS CONTROL BLOCK' CLC ;INDICATE ENTRY ( CALL @(SP)+ ;CALL THE CALLER&) MOV (SP)+,R4 ;REMOVE RETURN ADDRESS$* MOV (SP)+,R5 ;RESTORE UCB ADDRESS$+ MOV (SP)+,R3 ;RESTORE DCB ADDRESS', ADD D.UCBL(R3),R5 ;POINT TO NEXT UCBO&- DECB (SP) ;ANY MORE UCB'S TO SCAN?. CMPB (SP),#-1 ;/ BNE 20$ ;IF NE YES0 TST (SP)+ ;CLEAN STACK00runtttt tfDATA .TITLE MLOCKA .IDENT /04.02/ R;R&; COPYRIGHT (C) 1975, 1977, 1979, 1984/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.Y;CA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.D;A;E$; RICHARD H. ECKHOUSE, JR. 5-MAR-75;T; MODIFIED BY:;M; J. M. LAWLER 07-JUL-83 04.01;;*; JL167 -- MAKE PATCH SPACE UNCONDITIONAL;K; J. W. BERZLE 08-SEP-83 04.02;N2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES; $; MULTIPROCESSOR LOCKING SUBROUTINES;; MACRO LIBRARY CALLS5;9  9 .IF DF M$$PRO Q .MCALL HWDDF$,BGCK$AY$ HWDDF$ ;DEFINE HARDWARE REGISTERS I;D; LOCK WORDS ARE OF THE FORM:E;E/; BYTE 0 = LOCK VALUE (0 IF LOCKED, 1 IF FREE)U; BYTE 1 = IF BYTE 0 EQUAL:"; 0, THEN BYTE 1 = OWNER OF LOCK"; 1, THEN BYTE 1 = COMPLEMENT OF; PREVIOUS OWNER1>; BYTE 2,3 = SECONDARY LOCK WORD (FORMAT ABOVE) FOR WAIT MASK.(; BYTE 4,5 = MASK OF WAITING PROCESSORS.;I+; NOTE: BYTES 4+5 ARE REFERENCED AS A WORD.I;S O;+2; **-$MLOCK-MULTIPROCESSOR WAIT-LOCK LOCK ROUTINE.;PE; THIS ROUTINE WILL USE THE ASRB INSTRUCTION TO LOCK A DATA STRUCTUREI?; OR CODE SEGMENT. IT OPERATES ON LOCK BLOCKS DESCRIBED ABOVE.(G; IT IS CALLED FROM AN INVOCATION OF THE LOCK$ MACRO WHEN THE LOCK TYPE1E; IS "WAIT". IT WILL ATTEMPT THE LOCK, AND IF IT FAILS WILL POST THEWI; FACT THAT THIS PROCESSOR IS WAITING, THEN PLACE ITSELF IN A WAIT STATE.EB; THIS ROUTINE SHOULD ONLY BE CALLED AT PRIORITY ZERO, UNBYPASSED.I; WHEN IT EXITS, THE PRIORITY IS AGAIN ZERO, AND THE CACHE IS UNBYPASSED.T;. ; INPUTS:S;U!; 0(SP)=RETURN ADDRESS TO CALLER.T; 2(SP)=ADDRESS OF LOCK BLOCK.; ; OUTPUTS:;E>; LOCK BLOCK IS LOCKED, AND THIS PROCESSOR IS OWNER. PRIORITY;; EQUALS ZERO, CACHE UNBYPASSED. CACHE HAS BEEN FLUSHED IF.$; MORE THAN ONE PROCESSOR IS ACTIVE.;L; ALL REGISTERS ARE PRESERVED.;- E'$MLOCK::MOV R4,-(SP) ;SAVE R4 FOR LATERA MFPS -(SP) ;SAVE PRIORITYO. MTPS #PR7 ;DON'T WANT TO BE INTERRUPTED HERE  N .IF DF P$$D70 R% MOV $URMST,R4 ;;;GET ONLINE BUS RUNSY# BIC $CPMSK,R4 ;;;MAKE IT CPUS ONLY=" BIC $CPBIT,R4 ;;;IGNORE OURSELVES1 BEQ 5$ ;;;IF EQ DON'T BOTHER TO FLUSH OR BYPASSB4 BIS #BYPASS,@$MPCSR+6 ;;;FLUSH AND BYPASS THE CACHE5$: ;;;REFERENCE LABELP E .ENDC A E;F; CURRENT STACK CONTENTS: ;C; 0(SP) = SAVED PRIORITY. ; 2(SP) = SAVED R4 FROM ENTRY.#; 4(SP) = RETURN ADDRESS TO CALLER.A&; 6(SP) = ADDRESS OF LOCK BLOCK.;P ! MOV 6(SP),R4 ;;;GET LOCK ADDRESS   .IF DF L$$DBG $ CMPB 1(R4),$PROCN ;;;DO WE OWN LOCK. BEQ ERR5 ;;;IF EQ YES -- CRASH, NO WALK THRU , .ENDC E R#10$: ASRB (R4) ;;;ATTEMPT THE LOCKR BCS 20$ ;;;IF CS WE NOW OWN IT M;RE; WE HAVE ATTEMPTED TO LOCK THE LOCK BYTE, AND FAILED TO GAIN ACCESS.C0; WE WILL NOW POST THE FACT THAT WE ARE WAITING.;  A, LOCK$ 2(R4),SPIN ;;;LOCK THE SECONDARY LOCK6 BIS $CPBIT,4(R4) ;;;POST THE FACT THAT WE ARE WAITING/ ULOCK$ 2(R4),SPIN ;;;UNLOCK THE SECONDARY LOCKG- ASRB (R4) ;;;ATTEMPT THE PRIMARY LOCK AGAINC& BCS 30$ ;;;IF CS WE GOT IT THIS TIME/ MTPS (SP) ;;;LOWER PRIORITY TO ENTRANCE VALUE., TST $PWRFL ;;;SEE IF POWERFAIL FLAG IS SET* BNE 15$ ;;;IF SET, SKIP WAIT INSTRUCTION) BIT @$CPURM,$URMST ;;;ARE WE ONLINE YET?T$ BEQ 15$ ;;;IF EQ NO -- NO IIST YET! WAIT ;;;WAIT FOR ANY INTERRUPTA215$: MTPS #PR7 ;;;WE DON'T WANT TO BE INTERRUPTED" BR 10$ ;;;TRY PRIMARY LOCK AGAIN ;T#; WE HAVE GAINED ACCESS TO THE LOCKP;; N20$: ;;;REFERENCE LABEL  ) .IF DF L$$DBG I930$: CACHE$ BYPASS ;;;NEED TO CHECK OUT SOME REAL VALUESM- TSTB 1(R4) ;;;DOES LOCK ALREADY SHOW OWNED?0 BPL ERR4 ;;;IF PL YES -- SOMEHOW WE BROKE LOCK& MOVB $PROCN,1(R4) ;;;SHOW US AS OWNER T .IFTF R- CACHE$ RESTOR ;;;THRU WITH CHANGABLE VALUESN - .IFFT T30$: ;;;REFERENCE LABEL R .ENDC M MTPS (SP)+ ;;;RESTORE PRIORITY MOV (SP)+,R4 ;RESTORE R4M$ MOV (SP)+,(SP) ;MOVE RETURN ADDRESS CACHE$ FLUSH ;FLUSH CACHEN RETURN  R:ERR5: BGCK$A BF.00rus!utccccMP,BE.WTL,FATAL ;ATTEMPT TO WALK THRU LOCK ;+7; **-$MULCK-MULTIPROCESSOR WAIT LOCK UNLOCK SUBROUTINE.L; B; THIS ROUTINE WILL UNLOCK THE SOFTWARE MULTIPROCESSOR LOCK, USING@; THE ASRB INSTRUCTION TO INTERLOCK MEMORY. IT WILL CHECK TO SEEF; IF ANY PROCESSOR IS WAITING, AND IF ANY ARE, IT WILL INTERRUPT THEM.;N ; INPUTS:R;.!; 0(SP)=RETURN ADDRESS OF CALLER.R; 2(SP)=ADDRESS OF LOCK BLOCK.;R ; OUTPUTS:;(4; LOCK IS UNLOCKED. ANY WAITING PROCESSORS HAVE BEEN; INTERRUPTED.;5:; PRIORITY IS PRESERVED AT EXIT, BUT MAY GO TO ZERO DURING; THIS ROUTINES EXECUTION.;W; CACHE IS UNBYPASSED.;L; ALL REGISTERS ARE PRESERVED.;- F$MULCK::MOV R5,-(SP) ;SAVE R5G MOV R4,-(SP) ;SAVE R4" MOV 6(SP),R4 ;GET ADDRESS OF LOCK$ MFPS -(SP) ;SAVE PRIORITY FOR EXIT4 MTPS #PR7 ;RAISE PRIORITY SINCE WE WILL LOCK LATER   .IF DF L$$DBG E! CMPB 1(R4),$PROCN ;DO WE OWN IT?L BNE ERR1 ;IF NE NO -- CRASH ASRB (R4) ;IS LOCK LOCKED?% BCS ERR3 ;NO - WE JUST GOT IT, OOPS COMB 1(R4) ;CLEAR WHO DONE ITI B .ENDC O;R!; SEE IF ANY PROCESSOR IS WAITING.;W 6 LOCK$ 2(R4),SPIN ;;;LOCK SECONDARY LOCK IN LOCK BLOCK/ MOV 4(R4),R5 ;;;GET MASK OF WAITING PROCESSORS,/ CLR 4(R4) ;;;CLEAR MASK OF WAITING PROCESSORSK M; D; AT THIS POINT, WE WILL SET THE BITS IN $IICPU FOR THOSE CPUS WHICH6; ARE CURRENTLY WAITING, AND HAVE WORK TO DO ($IIPND).7; UNFORTUNATELY, WE MUST LOCK THE FORK LOCK TO DO THIS.A;  )F;******************************* IIST DEBUGGING CODE ***************** BR 4$ ;ENTER NEW CODE. BR 6$ ;DON'T ENTER NEW CODEEF;******************************* END IIST DEBUGGING CODE *************+4$: MOV R5,-(SP) ;GET SOME SPACE TO WORK INO' MOV $IIPND,-(SP) ;CALC $IIPND .AND. R5I/ COM (SP) ;CREATE MASK OF CPUS NOT HAVING WORKL8 BIC (SP)+,R5 ;R5=CPUS WHICH HAVE WORK AND WILL BE INTED# BEQ 5$ ;IF EQ DON'T BOTHER $IICPUP* LOCK$ $FORKL,SPIN ;LOCK ONCE MORE (YEECH)% BIS R5,$IICPU ;SHOW OURS INTERRUPTED** ULOCK$ $FORKL,SPIN ;UNLOCK FORK LIST LOCK%5$: MOV (SP)+,R5 ;RESTORE ORIGINAL R5D(6$: MOVB #1,(R4) ;;;UNLOCK PRIMARY LOCK+ ULOCK$ 2(R4),SPIN ;;;UNLOCK SECONDARY LOCKN7 BIC $CPBIT,R5 ;;;WE ALREADY HAD LOCK, SO CLEAR OUR BITT! BEQ 10$ ;;;IF EQ NO CPU WAITING  P;.&; WE HAVE A MASK OF WAITING PROCESSORS;O A MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP)H MOV R2,-(SP)W MOV R3,-(SP)B) MOV R5,R1 ;SET UP PARAMETERS FOR $IIXMT$ CALL $IIXMT MOV (SP)+,R3 ;RESTORE R3R MOV (SP)+,R2O MOV (SP)+,R1* MOV (SP)+,R0L610$: MTPS (SP)+ ;RESTORE PRIORITY TO SAME AS INCOMING MOV (SP)+,R4 ;RESTORE R4R MOV (SP)+,R5R0 MOV (SP)+,(SP) ;SLIDE RETURN ADDRESS DOWN STACK RETURNB $>ERR1: BGCK$A BF.MP,BE.UNO,FATAL ;PROCESSOR WHO DIDN'T OWN LOCK ;TRIED TO UNLOCK9ERR2: BGCK$A BF.MP,BE.ILC,FATAL ;ILLEGAL LOCK COUNT VALUEM-ERR3: BGCK$A BF.MP,BE.LNS,FATAL ;LOCK NOT SET(;ERR4: BGCK$A BF.MP,BE.OCP,FATAL ;OTHER CPU SHOWED OWNERSHIPMCERR6: BGCK$A BF.MP,BE.MLK,FATAL ;ATTEMPT MADE TO EXIT MULTIPLE LOCKP R .IFTF ; DF M$$PRO"$PATCH::.BLKW 40. ;PATCHING SPACE E .ENDC G M .END+,R4 ;RESTORE R4R MOV (SP)+,R5R0 MOV (SP)+,(SP) ;SLIDE RETURN ADDRESS DOWN STACK RETURNB $>ERR1: BGCK$A BF.MP,BE.UNO,FATAL ;PROCESSOR WHO DIDN'T OWN LOCK ;TRIED TO UNLOCK9ERR2: BGCK$A BF.MP,BE.ILC,FATAL ;ILLEGAL LOCK COUNT VALUEM-ERR3: BGCK$A BF.MP,BE.LNS,FATAL ;LOCK NOT SET(;ERR4: BGCK$A BF.MP,BE.OCP,FATAL ;OTHER CPU SHOWED OWNERSHIPMCERR6: BGCK$A BF.MP,BE.MLK,FATAL ;ATTEMPT MADE TO EXIT MULTIPLE LOCKP R .IFTF ; DF M$$PRO"$PATCH::.BLKW 40. ;PATCHING SPACE .TITLE POWER  .IDENT /10.00/*;*8; COPYRIGHT (C) 1986 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;  ; D. N. CUTLER 1-OCT-73A ;F& ; MODIFIED FOR RSX-11M-PLUS V2.1 BY: ;I; H. HUANG; H. BERNSTEIN; B. S. MCCARTHY;E-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:; ; S. C. ADAMSO; J. W. BERZLE; M. 00s"untttt tfDATA PETTENGILL; B. S. MCCARTHY; J. C. FRANZINI;H; MODIFIED BY:;Q ; J. W. BERZLE 20-MAY-86 10.00;S.; JWB174 -- MODIFY POWER DOWN CALL TO IPDRV;L(;E); POWERFAIL RECOVERY*;E+; MACRO LIBRARY CALLS ,;E-3. .MCALL EPKDF$,HDRDF$,HWDDF$,PCBDF$,TCBDF$,BGCK$A(/ EPKDF$ ;DEFINE ERROR PACKET OFFSETS'0 HDRDF$ ;DEFINE TASK HEADER OFFSETSN&1 HWDDF$ ;DEFINE HARDWARE REGISTERS32 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSD.3 TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS45;C6; POWERFAIL VECTOR7;8 9 .ASECTI:.=24;PWVCT: .WORD PDOWN ;-< .WORD PR7 ;S = .PSECT7>?;+'@; **-PDOWN-POWERFAIL INTERRUPT (DOWN)A;EFB; THIS ROUTINE IS ENTERED AS A RESULT OF A POWER DOWN INTERRUPT. ALLJC; VOLATILE MACHINE REGISTERS ARE SAVED, THE POWERFAIL VECTOR IS SWITCHEDED; TO THE POWER UP ROUTINE, AND THE PROCESSOR IS HALTED TO AWAIT THEDE; POWER UP INTERRUPT. F;-GHPDOWN: ;REF LABELIJKL .IF DF M$$PROMN;RBO; IN THE MULTIPROCESSING CASE, THIS IS THE ONLY PLACE THE VECTORAP; AT 24 EVER POINTS. THIS IS BECAUSE ON POWER-UP, THE HARDWAREFQ; MUST USE THE VECTOR AT PHYSICAL 24, NOT KERNEL VIRTUAL 24 (BECAUSE1R; THERE ISN'T ANY KERNEL MAPPING AT THAT TIME)..S;AT; DUE TO THIS, WE HAVE THREE CONDITIONS WHICH CAN BRING US THRUWU; THIS VECTOR.V;REW; 1. POWERFAIL (POWER GOING DOWN) -- WE CAN DETERMINE THIS FROM THETBX; FACT THAT MAPPING IS ENABLED (WHICH IT NEVER IS OTHERWISE).Y;FZ; 2. POWER RETURNS (AFTER A POWERFAIL) -- WE CAN DETERMINE THIS FROMG[; THE FACT THAT MAPPING IS NOT ENABLED, AND THE LOW MEMORY MAPPING@\; FOR US IS SET UP IN THE $PWKA0 VECTOR (ONE WORD PER CPU).];F^; 3. POWER RETURNS (BUT WE NEVER POWERFAILED). THIS IS BECAUSE SOMEC_; UNCLEVER PERSON TURNED THE KEY ON (OR OTHERWISE BROUGHT BACK.F`; THE POWER) AND DIDN'T HAVE THE HALT KEY DOWN. IF THEY HAVE THEJa; NEAT 11/70 REMOTE DIAGNOSTIC CONSOL, THEY CAN BE PARTIALLY EXCUSED,Hb; SINCE THEY HAVE NO ACTUAL HALT KEY (ALTHO THEY CAN USE THE LITTLEIc; SLIDE SWITCH, WHICH MIGHT SURVIVE 100 OPERATIONS WITHOUT FAILURE).Fd; IN THIS CASE WE WILL HALT THE MACHINE, AND THEY WILL NEVER KNOW#e; WHAT WE DID FOR THEM. SIGH.Pf;A7g CACHE$ BYPASS ;;;MAKE SURE WE HAVE THE "REAL THING"E1h BIT #1,SR0 ;;;ARE WE COMING UP OR GOING DOWN?E-i BNE PDOWN1 ;;;IF NE WE'RE ON THE WAY DOWNTjk;T&l; NOW -- EITHER POWER UP OR SPURIOUSm;Ln(o MOV $PWCSR,R0 ;;;GET IIST CSR ADDRESS*p MOV (R0),R2 ;;;GET IIST REGISTER VALUE%q SWAB R2 ;;;PUT CPU ID IN LOW BYTEW.r BIC #177774,R2 ;;;MAKE IT ONLY TWO BITS BIGs ASL R2 ;;;AND WORD INDEXtu;Tv; DID WE GO DOWN???Lw;Ex4y MOV $PWKA0(R2),R1 ;;;GET KINAR0 VALUE FROM BEFORE1z BNE 10$ ;;;IF NE THERE IS ONE, WE DID PWRFAIL{|;,E}; SOME CLEVER FELLOW POWERED UP THE CPU WITH THE HALT KEY UNHALTED. D~; WE WILL HALT AND HE WILL PROBABLY NEVER KNOW WE DIDN'T CRASH THEE; POSSIBLE MP SYSTEM UNDERNEATH HIM. TOO BAD IT'S A WASTE OF SPACET&; TO GIVE HIM A SNAPPY ERRORMESSAGE.;I5$: HALT ;;;HERE WE ARE  BR 5$ ;;;OH NO YOU DON'T810$: CLR $PWKA0(R2) ;;;SHOW WE ARE MORE OR LESS UP NOW DEC R1 ;;;REMOVE BIAS OF ONE;A; R0 = IIST CSR ADDRESSE"; R1 = KINAR0 VALUE FOR THIS CPU%; R2 = CPU ID * 2 FOR TABLE INDEXESL;W;H<; WE WILL NOW SET UP THE KERNEL MAPPING AND TURN ON 18 BIT;; MODE SO THIS CPU CAN ACCESS THE LOW MEMORY CONTEXT WITHY<; WHICH IT IS SO WELL FAMILIAR. AS FAR AS THE REST OF THEB; POWERFAIL CODE IS CONCERNED, IT ALWAYS HAS ITS OWN LOW MEMORY.;D; THIS MEANS THAT THE CODE THAT LOADS THE KERNEL I SPACE REGISTERSC; CANNOT LOAD JUNK AND THEN CORRECT IT -- IT MUST LOAD (OVERLOAD)03; VALID INFORMATION SO THIS CODE DOESN'T GO AWRY.C; CLR R3 ;;;START WITH KINAR0 MOV #KINAR0,R4 ;;;DITTO720$: MOV #77406,KINDR0-KINAR0(R4) ;;;SET UP FOR 4K RWE MOV R3,(R4)+ ;;;LOAD ADDRESSE" ADD #200,R3 ;;;MOVE ANOTHER 4K# CMP00s*u!utcccc #KINAR0+16,R4 ;;;ARE WE DONE  BHIS 20$ ;;;IF HIS NOI;E7; NOW CORRECT KINAR0 AND KINAR7 WITH THE REAL VALUES.S; / MOV R1,@#KINAR0 ;;;PUT REAL OFFSET IN PAGE 0 < MOV #177600,@#KINAR0+16 ;;;PUT I/O PAGE ADDRESS IN PAGE 7- BIS #PMODE,PS ;;;PUT USER INTO PREVIOUS PSG- INC SR0 ;;;TURN ON MAPPING AND AWAY WE GON+ JMP PUP ;;;GO TO "NORMAL" POWERUP CODE# .ENDC5PDOWN1: MOV SP,$PWSTK ;;;SAVE CURRENT STACK POINTERE6 MOV #$PWSTK,SP ;;;SET ADDRESS OF REGISTER SAVE AREA, MOV R5,-(SP) ;;;SAVE REGISTERS R5 THRU R0 MOV R4,-(SP) ;;;O MOV R3,-(SP) ;;;R MOV R2,-(SP) ;;;S MOV R1,-(SP) ;;;R MOV R0,-(SP) ;;;L;N%; MULTIPROCESSOR POWERFAIL SUPPORT:;;/9; EACH PROCESSOR THAT POWERFAILS SETS ITS BIT IN A WORD ?; WHICH CONTAINS THE MASK OF PROCESSORS IN THEIR SAVE-RESTOREJ=; CODE. THEY ALSO INTERRUPT ALL OTHER ONLINE PROCESSORS TO<; TELL THEM TO STOP WHAT THEY ARE DOING AND WAIT UNTIL THE-; POWERFAILED PROCESSORS ARE BACK UP AGAIN.A;M;P0; SET OUR BIT IN THE POWERFAILED CPU FLAG WORD; .IF DF M$$PRO LOCK$ $PWRLK,SPIN9 BIS $CPBIT,$PWRMK ;;;SET OUR BIT IN THE POWERFAIL MASKS ULOCK$ $PWRLK,SPIN+ MOV $URMST,R1 ;;;GET MASK OF ONLINE URMS + BIC $CPMSK,R1 ;;;MAKE IT PROCESSORS ONLYS( BIC $CPBIT,R1 ;;;NOT OURSELVES EITHER$ BEQ 5$ ;;;IF EQ NOBODY UP BUT US, MOV #MP.PWF,R2 ;;;SET FUNCTION CODE IN R2 CALL $IIFNX ;;;XMIT FUNCTION5$: ;;;REFERENCE LABELO .ENDC1 BIT #FE.EXT,$FMASK ;;;IS THIS A 22-BIT SYSTEM?D BEQ 21$ ;;;IF EQ NO/ BIT #HF.UBM,$HFMSK ;;;IS THERE A UNIBUS MAP? BEQ 21$ ;;;IF EQ NO 8 MOV #UBMPR+<31.*4>,R0 ;;;POINT PAST LAST MAP REGISTER1 MOV #31.,R1 ;;;SET COUNT OF REGISTERS TO SAVE$520$: MOV -(R0),-(SP) ;;;SAVE HIGH 6 BITS OF ADDRESS;1 MOV -(R0),-(SP) ;;;SAVE LOW 16 BITS OF ADDRESSU# SOB R1,20$ ;;;LOOP FOR ALL UMRSN721$: BIS #PMODE,PS ;;;MAKE SURE PREVIOUS MODE IS USER & MFPI SP ;;;SAVE USER STACK POINTER .IF DF S$$LIB< BIC #^CPSMODE&PMODE,PS ;;;SET PREVIOUS MODE TO SUPERVISOR, MFPI SP ;;;SAVE SUPERVISOR STACK POINTER .ENDC> MOV #KINAR0+16.,R0 ;;;POINT TO KERNEL INSTR ADDRESS REG 7+21 MOV #UINAR0+16.,R1 ;;;POINT TO USER I PAR 7 +2:1 MOV #UINDR0+16.,R2 ;;;POINT TO USER I PDR 7 +2 .IF DF U$$DAS; MOV #UDSAR0+16.,R3 ;;;POINT TO USER DATA ADDRESS REG 7+21; MOV #UDSDR0+16.,R4 ;;;POINT TO USER DATA DESC. REG 7+2  .ENDC ; DF U$$DAS .IF DF K$$DAS= MOV #KDSAR0+16.,R5 ;;;POINT TO KERNEL DATA ADDRESS REG 7+2S .ENDC210$: MOV -(R1),-(SP) ;;;SAVE USER INSTR ADDR REG3 MOV -(R2),-(SP) ;;;SAVE USER DESCRIPTOR REGISTERR .IF DF U$$DAS5 MOV -(R3),-(SP) ;;;SAVE USER DATA ADDRESS REGISTERP5 MOV -(R4),-(SP) ;;;SAVE USER DATA DESC. REGISTER  .ENDC ; DF U$$DAS  0  MOV -(R0),-(SP) ;;;SAVE KERNEL INSTR ADDR REG  .IF DF K$$DAS7 MOV -(R5),-(SP) ;;;SAVE KERNEL DATA ADDRESS REGISTERD .ENDC& CMP R0,#KINAR0 ;;;ANY MORE TO SAVE? BHI 10$ ;;;IF HI YES .IF DF S$$LIB< MOV #SDSAR0+16.,R0 ;;;POINT TO SUPER DATA ADDRESS REG 7+2< MOV #SDSDR0+16.,R1 ;;;POINT TO SUPER DATA DESC. REG 7+2< MOV #SISAR0+16.,R2 ;;;POINT TO SUPER INST ADDRESS REG 7+2<  MOV #SISDR0+16.,R3 ;;;POINT TO SUPER INST DESC. REG 7+2;!200$: MOV -(R0),-(SP) ;;;SAVE SUPER DATA ADDRESS REGISTER6" MOV -(R1),-(SP) ;;;SAVE SUPER DATA DESC. REGISTER6# MOV -(R2),-(SP) ;;;SAVE SUPER INST ADDRESS REGISTER6$ MOV -(R3),-(SP) ;;;SAVE SUPER INST DESC. REGISTER% CMP R0,#SDSAR0 ;;;DONE YET?& BHI 200$ ;;;IF HI NO'( .ENDC ; DF S$$LIB)*+ .IF DF F$$LPP,-'. TST $HFMSK ;;;FPP HARDWARE PRESENT?/ BMI 210$ ;;;IF MI NO.0 STFPS -(SP) ;;;STORE FLOATING POINT STATUS%1 SETD ;;;SET FLOATING DOUBLE MODE 02 STD R0,-(SP) ;;;SAVE FLOATING POINT REGISTERS3 STD R1,-(SP) ;;;4 STD R2,-(SP) ;;;;5 STD R3,-(SP) ;;; 6 L00s2untttt tfDATADD R4,R0 ;;;-7 STD R0,-(SP) ;;;P8 LDD R5,R0 ;;;I9 STD R0,-(SP) ;;;S-:210$: CLR -(SP) ;;;PUSH AN ADDRESS OF ZEROR9; CMP @#244,#$FPPR7 ;;;IS THERE A PIRQ REGISTER TO SAVE?N4< BEQ 30$ ;;;IF EQ NO, DO DUMMY SAVE OF LOCATION 0)= MOV #PIRQ,(SP) ;;;SET FOR SAVE OF PIRQI=>30$: MOV @(SP),-(SP) ;;;SAVE PIRQ REGISTER OR CONTENTS OF 0T?@ .ENDCABC .IF NDF M$$PRO D/E MOV #PUP,PWVCT ;;;SWITCH TO POWER UP ROUTINEFG .ENDCHI(J MOV SP,$POWSP ;;;SAVE SP FOR POWER UPKL .IF DF I$$P11&I$$PFS,MN MOV $IPUCB,R0 ;;;GET IP UCB.O BEQ 40$ ;;;IF EQ, DRIVER POWERFAIL NOT SETP MOV (R0),R0 ;;;GET IP DCB#3Q MOV D.DSP(R0),R1 ;;;GET IP DRIVER DISPATCH TABLE3'R BEQ 40$ ;;;IF EQ, DRIVER NOT LOADEDN%S MOV D.PCB(R0),R0 ;;;GET DRIVER PCBF T BEQ 40$ ;;;IF EQ, FORGET IT!0U MOV P.REL(R0),KINAR5 ;;;MAP DRIVER IN I-SPACEVW .IF DF K$$DASX0Y MOV P.REL(R0),KDSAR5 ;;;MAP DRIVER IN D-SPACEZ[ .ENDC ; DF K$$DAS\@\ MOV D.VINI-2(R1),-(SP) ;;;GET POWER-DOWN ENTRY POINT ;JWB174*\ CALL @(SP)+ ;;;CALL DRIVER ;JWB174%_40$: ;;;REFERENCE LABEL ;**-2T`a .ENDC ; DF I$$P11&I$$PFSCbcd;DHe; AT THIS POINT, WE HAVE ALL BUT HALTED. WE WILL PLACE OUR KINAR0 LOWFf; MEMORY MAPPING IN THE CELL IN CPA'S LOW MEMORY. THIS IS A FLAG TOFg; THE POWERUP ROUTINE THAT WE HAVE ACTUALLY POWERFAILED. IF WE FAILGh; TO DO THIS, THE POWERUP ROUTINE WILL JUST HALT (SINCE IT CAN'T TELLEi; THAT FACT FROM THE CASE WHERE SOMEONE POWERED UP THE MACHINE WITHRj; THE HALT KEY UP.)Lk;Plmn .IF DF M$$PROo'p MOVB $PROC2,R1 ;;;GET OUR CPU OFFSET/q MOV @#KINAR0,R0 ;;;GET OUR LOW MEMORY OFFSET/r CLR @#KINAR0 ;;;START USING CPA'S LOW MEMORY stu .IF DF K$$DASv&w CLR @#KDSAR0 ;;;D-SPACE TOO, IF ANYxy .ENDCz{1| INC R0 ;;;BIAS BY ONE, SO NEVER ACTUALLY ZEROE4} MOV R0,$PWKA0(R1) ;;;STORE OUR LOW MEMORY POINTER~ .ENDC! HALT ;;;WAIT FOR SOME JUICE!T;+#; **-PUP-POWERFAIL INTERRUPT (UP)T;M; THIS ROUTINE IS ENTERED AS A RESULT OF A POWER UP INTERRUPT. ALL VOLATILEGH; MACHINE REGISTERS ARE RESTORED, A SCHEDULE REQUEST IS FORCED FOR THED; NULL TASK, THE POWERFAIL INDICATOR IS INCREMENTED, AND AN RTI ISH; EXECUTED. AT THE APPROPRIATE TIME THE DISPATCHER WILL CALL THE POWER;; RECOVERY ROUTINE TO ACTUALLY PROCESS THE POWER FAILURE.0;-1PUP: MOV $POWSP,SP ;;;RE-LOAD SP FROM POWERFAIL .IF DF F$$LPP; MOV (SP)+,@(SP)+ ;;;CONDITIONALLY RESTORE PIRQ OR LOC. 0' TST $HFMSK ;;;FPP HARDWARE PRESENT?F BMI 1$ ;;;IF MI NO4 LDFPS #200 ;;;SET FLOATING DOUBLE MODE, NO TRAPS3 LDD (SP)+,R0 ;;;RESTORE FLOATING POINT REGISTERSP STD R0,R5 ;;;I LDD (SP)+,R0 ;;;  STD R0,R4 ;;;D LDD (SP)+,R3 ;;;T LDD (SP)+,R2 ;;;L LDD (SP)+,R1 ;;;  LDD (SP)+,R0 ;;;C0 LDFPS (SP)+ ;;;RESTORE FLOATING POINT STATUS .ENDC01$: BIS #PMODE,PS ;;;SET PREVIOUS MODE TO USER .IF DF S$$LIB6 MOV #SDSAR0,R3 ;;;POINT TO SUPER DATA ADDRESS REG 06 MOV #SDSDR0,R2 ;;;POINT TO SUPER DATA DESC. REG 06 MOV #SISAR0,R1 ;;;POINT TO SUPER INST ADDRESS REG 06 MOV #SISDR0,R0 ;;;POINT TO SUPER INST DESC. REG 0<5$: MOV (SP)+,(R0)+ ;;;RESTORE SUPER INST DESC. REGISTER9 MOV (SP)+,(R1)+ ;;;RESTORE SUPER INST ADDRESS REGISTERD9 MOV (SP)+,(R2)+ ;;;RESTORE SUPER DATA DESC. REGISTERT9 MOV (SP)+,(R3)+ ;;;RESTORE SUPER DATA ADDRESS REGISTERI" CMP R0,#SISDR0+16. ;;;DONE YET? BLO 5$ ;;;IF LO NO0 .ENDC ; DF S$$LIB5 MOV #KINAR0,R0 ;;;POINT TO KERNEL INSTR ADDR REG 0 0 MOV #UINAR0,R1 ;;;POINT TO USER I SPACE PAR 00 MOV #UINDR0,R2 ;;;POINT TO USER D SPACE PDR 0 .IF DF U$$DAS: MOV #UDSDR0,R3 ;;;POINT TO USER DATA DESC. REGISTER 0: MOV #UDSAR0,R4 ;;;POINT TO USER DATA ADDRESS REGISTER 0 .ENDC .IF DF K$$DAS4 MOV #KDSAR0,R5 ;;;POINT TO KERNEL DATA ADDR REG 0 .ENDC10$: ;;;REF LABEL .IF DF K$$DAS3 M00s:u!utccccOV #77406,KDSDR0-KDSAR0(R5) ;;;SET 4K RW ACCESS;8 MOV (SP)+,(R5)+ ;;;RESTORE KERNEL DATA INSTR ADDR REG;SD; IN THE MULTIPROCESSING, I+D SPACE CASE, WE WOULD NORMALLY TRY TOB; LOAD 1600 INTO KINAR7 AND SET IT FOR 4K RO. THIS WIPES US OUT,B; SINCE WE ARE EXECUTING OUT OF THESE REGISTERS. WE WILL DETECT.; THIS FACT, AND WILL DO ANYTHING TO KISAR7.; .IF DF M$$PRO? CMP R0,#KINAR0+16 ;;;ARE WE JUST ABOUT TO WIPE THE I/O PAGE?L BNE 15$ ;;;IF NE NO$, CMP (SP)+,(R0)+ ;;;BUMP STACK AND ADDRESS+ BR 20$ ;;;SKIP ACTUAL LOAD INSTRUCTIONSR15$: ;;;REFERENCE LABEL .ENDC3 MOV #77402,KINDR0-KINAR0(R0) ;;;SET 4K RO ACCESS  .IFF13 MOV #77406,KINDR0-KINAR0(R0) ;;;SET 4K RW ACCESS .ENDC3 MOV (SP)+,(R0)+ ;;;RESTORE KERNEL INSTR ADDR REGS20$: ;;;REFERENCE LABEL .IF DF U$$DAS8 MOV (SP)+,(R3)+ ;;;RESTORE USER DATA DESC. REGISTER8 MOV (SP)+,(R4)+ ;;;RESTORE USER DATA ADDRESS REGISTER .ENDC ; DF U$$DAS8 MOV (SP)+,(R2)+ ;;;RESTORE USER INST DESC. REGISTER8 MOV (SP)+,(R1)+ ;;;RESTORE USER INST ADDRESS REGISTER" CMP R0,#KINAR0+16. ;;;DONE YET? BLO 10$ ;;;IF LO NO .IF DF K$$DAS!M$$EXT!S$$LIB  MOV #S3$BTS,SR3 ;;;SET UP SR3 .ENDC .IF DF M$$PRO    .IF DF K$$DAS   MOV #77402,@#KINAR0+16D .ENDC .IFF+( INC SR0 ;;;TURN ON MEMORY MANAGEMENT .ENDC .IF DF S$$LIB7 BIC #^CPSMODE&PMODE,PS ;;;SET PREVIOUS MODE TO SUPER;/ MTPI SP ;;;RESTORE SUPERVISOR STACK POINTER+- BIS #PMODE,PS ;;;SET PREVIOUS MODE TO USER0 TSTB $SUPFL ;;;CURRENT TASK USE SUPER MODE ? BEQ 25$ ;;;IF EQ NOD*  BIS #10,SR3 ;;;TURN ON CSM INSTRUCTION!25$: ;;;REFERENCE LABEL"# .ENDC$%)& MTPI SP ;;;RESTORE USER STACK POINTER#1' BIT #FE.EXT,$FMASK ;;;IS THIS A 22-BIT SYSTEM?( BEQ 35$ ;;;IF EQ NON<) BIT #HF.UBM,$HFMSK ;;;DOES THIS SYSTEM HAVE A UNIBUS MAP?* BEQ 35$ ;;;IF EQ NOP/+ MOV #UBMPR,R0 ;;;POINT TO FIRST MAP REGISTERR4, MOV #31.,R1 ;;;SET COUNT OF REGISTERS TO RESTORE8-30$: MOV (SP)+,(R0)+ ;;;RESTORE LOW 16 BITS OF ADDRESS4. MOV (SP)+,(R0)+ ;;;RESTORE HIGH 6 BITS OF ADDRESS#/ SOB R1,30$ ;;;LOOP FOR ALL UMRS035$: ;;;REF LABEL12;53; SHOW OTHER PROCESSORS THAT WE ARE BACK ON THE AIRE4;567 .IF DF M$$PRO89 LOCK$ $PWRLK,SPIN7: BIC $CPBIT,$PWRMK ;;;CLEAR OUT OUR BIT FROM THE MASKS;< .IFTF=)> INC $PWRFL ;;;SHOW POWERFAIL HAPPENED#?@ .IFTOA%B INCB $PWRFL+1 ;;;URM POWERFAIL TOO *C BIS @$CPURM,$PFURM ;;;FOR ALL OUR URM'SDE;+KF; AT THIS POINT, WE WANT TO ASSURE OURSELVES THAT THIS CPU WILL, IN FACT,6FG; GO THROUGH DIRXT AT SOME POINT IN THE FUTURE. THIS REQUIRES A TWOKH; PRONGED ATTACK -- FIRST WE SET $IIPND SO THAT IF WE RETURN FROM A CLOCKHI; INTERRUPT TO A USER PROGRAM, THEN WE WILL GO THRU THE EXEC. SECOND,BJ; WE FIX UP THE IDLE LOOP TO LOOK AT $IIPND ON EACH LOOP AROUND.K;;L7M BIS $CPBIT,$IIPND ;;;TELL US LATER THAT WE HAVE WORK;N ULOCK$ $PWRLK,SPINOP .ENDCQRSET; IF THE SYSTEM HAS ANY MK11 BOXES ON IT, WE WILL RESTORE THEM NOW,SBU; SINCE THE RTI MAY GO BACK TO A LOADED DRIVER (OR TASK) IN ONE.VW .IF DF M$$K11X*Y CALL $MKSET ;;;RESET MK11 MEMORY BOXESZ[ .ENDC ; DF M$$K11\%] MOV (SP)+,R0 ;;;RESTORE R0 THRU R5R^ MOV (SP)+,R1 ;;;O_ MOV (SP)+,R2 ;;;N` MOV (SP)+,R3 ;;; a MOV (SP)+,R4 ;;;$b MOV (SP)+,R5 ;;;O(c MOV (SP),SP ;;;RESTORE STACK POINTER-d MOV #$ACTHD,@$RQSCH ;;;FORCE REDISPATCHINGKefg .IF NDF M$$PROh3i MOV #PDOWN,PWVCT ;;;SWITCH TO POWER DOWN ROUTINE jHk; AT THIS POINT WE WILL BYPASS THE CACHE. THIS PREVENTS GETTING STUCKIl; IN $PWRMP, AND ALSO ASSURES THAT IF THE CODE INTERRUPTED BY POWERFAILXHm; RUNS WITH CACHE BYPASSED, IT WILL BE AFTER THE POWERFAIL. (NOTE THATGn; THE SYSTEM WILL ALWAYS BE CACHE BYPASSED BETWEEN POWER RECOVERY AND( o; THE FIRST ENTRY TO THE EXEC)pq00sBuntttt tfDATA .IFF,r(s CACHE$ BYPASS ;;;GET THE REAL THINGStu .ENDCvw4x MOV $CKLDC,@$CKCNT ;;;RELOAD CLOCK COUNT REGISTER,y MOV #K$$IEN,@$CKCSR ;;;TURN CLOCK BACK ON z RTI ;;;{|;+!}; **-$POWER-POWER FAIL RECOVERYG~;GE; THIS ROUTINE WILL PERFORM POWERFAIL AND INITIALIZATION FOR ACTIVE ; TASKS AND DEVICES.;H ; INPUTS:T; "; $PWRFL=GENERAL POWERFAIL FLAG:;; 0 - DON'T INVOKE ACTIVE TASK POWERFAIL AST'S AND DON'TC5; CALL DRIVERS WITHOUT KRBS. $PWRFL+1 MUST BEF); NON-ZERO OR WE WOULDN'T BE HERE.H8; 1 - CALL ALL ACTIVE TASKS WITH POWERFAIL AST'S, AND; ALL DRIVERS TOO.M;$#; $PWRFL+1=DEVICE POWERFAIL FLAG::; 0 - $PWRFL MUST HAVE BEEN SET OR WE WOULDN'T BE HERE.;; 1 - DO ONLY DEVICE POWERFAIL, AND CHECK $PFURM FOR THEN;; UNIBUS RUN MASKS WHICH DEFINE THE RUNS TO PWRFAIL. ; ?; $PFURM=MASK DEFINING THE RUNS FOR POWERFAIL IF $PWRFL+1<>0. #; OTHERWISE THIS SHOULD BE ZERO.C;R;-  .ENABL LSBF6$POWER::TSTB $PWRFL ;IS IT GENERAL (FIRST) PWRFAIL?( BEQ 16$ ;IF EQ NOT GENERAL POWERFAIL .IF DF K$$W11( CLR K$$W11+2 ;CLEAR CLOCK ERROR FLAGS) MOV #1,K$$W11+6 ;ENERGIZE OUTPUT RELAY  .ENDC;H@; EFFECT POWERFAIL AST'S FOR TASKS THAT ARE ACTIVE AND IN CORE; * MOV $ACTHD,R5 ;GET ADDRESS OF FIRST TCB210$: MOV #AS.PFA,R4 ;GET CODE FOR POWER FAIL AST9 MOV T.ACTL(R5),-(SP) ;SAVE POINTER TO NEXT ACTIVE TASK  BEQ 15$ ;IF EQ THERE IS NONE& CALL $DASTT ;DECLARE POWERFAIL AST415$: MOV (SP)+,R5 ;GET ADDRESS OF NEXT ACTIVE TASK BNE 10$ ;IF NE NOF;10; DO POWERFAIL RECOVERY FOR ALL ACTIVE DEVICES;#D; IF THE POWERFAIL IS FOR A CPU URM, THEN INITIALIZE THE CACHE AND/; MEMORY PARITY REGISTERS FOR THAT PROCESSOR.D;O16$: ;REFERENCE LABEL .IF DF M$$PRO5 BIT $CPBIT,$PFURM ;IS IT A POWERFAIL FOR THIS CPU?T( BEQ 22$ ;IF EQ NO -- JUST DO DEVICES .IFTF) MOV #21$,-(SP) ;INLINE SUBROUTINE CALLD .IFTA- BR 18$ ;SKIP IIST INITIALIZATION ON PWRFLT .ENDC;+;; **-$CPNIT-INITIALIZE CPU AT POWERFAIL, STARTUP, ONLINE.C;B; THIS ROUTINE WILL PERFORM COMMON CPU INITIALIZATION FOR INITL, ; SAVE, AND LOWCR CPU STARTUP.;H ; INPUTS:D;O ; NONE.:;R ; OUTPUTS:;; INITIALIZATION PERFORMED.T;I; NO REGISTERS ARE PRESERVED.H;-$CPNIT:: ;REFERENCE LABELO .IF DF M$$PRO2; SET UP MK11 MEMORY BOXES, IN CASE WE NEED THEM .IF DF M$$K11& CALL $MKSET ;SET MK11 MEMORY BOXES' BCS 17$ ;IF CS DIDN'T FIND THEM ALLE .ENDC ; DF M$$K11$ CALL $IINIT ;INITIALIZE THE IIST, BIS $CPBIT,$URMST ;WE ARE ONLINE FOR SURE1 CALL $IINOT ;SEE IF WE CAN TALK TO OTHER CPUSO'17$: MOV R2,$SCRET ;SET STATUS RETURN$ CALL $OLRNT ;SEND STATUS TO OLR .ENDC<18$: CALL $DRDSE ;ALWAYS DECLARE SIG. EVENT AT CPU PWRUP. .IF DF P$$RTY* CALL $CLPAR ;CLEAR MEMORY PARITY CSR'S; MOV $MPCSR+6,R0 ;GET ADDRESS OF 11/70 CACHE CSR REGISTERB .IF DF P$$D70& MOV $MPCTL,(R0) ;SET UP 11/70 CACHE .IFF MOV #3,(R0) ;DISABLE TRAPS .ENDC .ENDC ; DF P$$RTY  RETURNT21$: ;REF LABEL   .IF DF P$$RTY 1  MOV #177777,-(R0) ;CLEAR MEMORY ERROR REGISTERS  .ENDC ; DF P$$RTY .IF DF E$$LOG3 BIT #ES.DAT,$ERFLA ;ARE WE LOGGING DATA PACKETS?. BEQ 22$ ;IF EQ NOL: MOV #E$CSYS+,R0 ;GET POWER FAIL ERROR CODE& CLR R1 ;INDICATE NO DATA SUBPACKET. MOV #SM.HDR,R2 ;ONLY LOG A HEADER SUBPACKET CALL $CREQU .ENDC ; DF E$$LOG;+2;**-DRVPF-LOCAL ENTRY FOR DRIVER ONLY POWER FAIL;-% DRVPF: ;CALLED FROM $DRVPF BELOW!";FD#; SCAN DEVICES FROM THE CTB SIDE (I.E. PHYSICAL) AND CHECK TO MAKE$; SURE THEY ARE ALL THERE.%;D&'22$: ;REFERENCE LABEL() .IF DF M$$NET*2+ MOV $NETPF,R5 ;GET ADDRESS OF NETWORK POWER00sJu!utccccFAIL, ;RECOVERY ROUTINEF!- BEQ 225$ ;IF EQ THERE IS NONEE*. CALL (R5) ;CALL POWER RECOVERY ROUTINE/0 .ENDC ; DF M$$NET132225$: MOV #27$,-(SP) ;RETURN TO HERE AFTER $SGFIN*(3 CALL $SGFIN ;WE EXPECT TRAPS TO FOUR74 MOV #$CTLST,R3 ;GET ADDRESS OF FIRST ADDRESS OF CTBS,523$: MOV (R3),R3 ;GET ADDRESS OF NEXT CTB)6 BEQ 35$ ;IF EQ NO MORE -- EXIT $SGFINE(7 MOVB L.NUM(R3),R4 ;GET NUMBER OF KRBS8 MOV R4,R5 ;COPY NUMBER9 ASL R5 ; *2V: ADD R3,R5 ;D6; ADD #L.KRB,R5 ;POINTER TO JUST BEYOND LAST KRB ADDR<24$: DEC R4 ;ONE LESS TO GO= BLT 23$ ;IF LT NO MORE > MOV -(R5),R2 ;GET KRB ADDRESS,? BEQ 24$ ;THERE IS NO KRB ADDRESS IN LIST(@ BIT #KS.OFL,K.STS(R2) ;IS IT OFFLINE?'A BNE 24$ ;IF NE YES -- DONT CHECK ITGBCD .IF DF M$$PROE/F BIT K.URM(R2),$PFURM ;SHOULD WE DO THIS ONE?CG BEQ 24$ ;IF EQ NON2H BIT K.URM(R2),@$CPURM ;IS IT ON THIS PROCESSOR?I BEQ 24$ ;IF EQ NO,JK .ENDCLMNO;*0P; CALL DRIVER AT THE POWERFAIL-KRB ENTRY POINTQ; R5S MOV L.DCB(R3),R1 ;GET DCB ASSOCIATED WITH THIS CTBT=T MOV CI.PWF(R1),R0 ;ASSUME IT WASN'T DCB BUT COMMON INT TBL29U BITB #LS.CIN,L.STS(R3) ;WAS IT COMMON INTERRUPT TABLE?R3V BNE 25$ ;IF NE YES -- GO AND CALL DRIVER IMMED.EWX;8Y; R4 CONTAINS DCB ADDRESS. MAP AND CALL NORMAL DRIVERZ;D[-\ MOV D.PCB(R1),R0 ;GET PCB OF LOADED DRIVERR.] MOV P.REL(R0),KINAR5 ;MAP DRIVER IN I-SPACE^_` .IF DF K$$DASa.b MOV P.REL(R0),KDSAR5 ;MAP DRIVER IN D-SPACEcd .ENDCef$g MOV D.DSP(R1),R1 ;GET DDT ADDRESS<h MOV D.VPWF(R1),R0 ;GET ADDRESS OF DRIVER POWERFAIL ENTRYij;CDk; IF POWERFAIL ADDRESS EXISTS, CALL DRIVER AFTER SAVING REGISTERS.l;m+n25$: TST R0 ;IS THERE A POWERFAIL ENTRY?D%o BEQ 24$ ;IF EQ NO -- TRY NEXT KRBS8p MOV R5,-(SP) ;SAVE POINTER TO NEXT KRB ADDRESS IN CTB6q MOV R4,-(SP) ;SAVE NUMBER OF KRB'S LEFT IN THIS CTB!r MOV R3,-(SP) ;SAVE CTB POINTER.s<t; CALL DRIVER AT POWERFAIL ENTRY POINT WITH THE ARGUMENTS:u;:v; C=1 TO SHOW CONTROLLER POWERFAIL (NOT UNIT POWERFAIL).w; R2=KRB ADDRESS.Ax; R3=CTB ADDRESS.Ry;Ez; ALL REGISTERS MAY BE USED.{;E|/} SEC ;SHOW KRB POWERFAIL, NOT UCB POWERFAIL~ CALL (R0) ;CALL DRIVER$ MOV (SP)+,R3 ;RESTORE CTB ADDRESS9 MOV (SP)+,R4 ;RESTORE NUMBER OF KRB'S LEFT IN THIS CTBX$ MOV (SP)+,R5 ;RESTORE KRB ADDRESS* BR 24$ ;GO TO NEXT KRB AND KEEP TRYING;PE; NOW SCAN DEVICES FROM THE DCB (I.E. LOGICAL) ORIENTATION AND CALL (; THE DRIVER FOR THE APPROPRIATE ONES.;R27$: MOV #$SCDVT,-(SP))30$: CALL @(SP)+ ;GET NEXT UCB ADDRESSS BCC 40$ ;IF CC GOT ONE .IF DF M$$PRO8 BIC @$CPURM,$PFURM ;WE JUST DID POWERFAIL FOR OUR CPU .ENDC' CLRB $PWRFL ;CPU POWERFAIL COMPLETE+ .IF DF M$$PRO7 TST $PFURM ;ANY URM'S LEFT TO PWRFAIL ON OTHER CPU?" BNE 35$ ;IF NE YES -- EXIT NOW4 CLRB $PWRFL+1 ;CLEAR OUT URM POWERFAIL INDICATION .ENDC 35$: RETURN )40$: MOV #30$,-(SP) ;SET RETURN ADDRESS2 BITB #US.OFL,U.ST2(R5) ;DEVICE IN CONFIGURATION* BNE 35$ ;IF NE DEVICE IS NOT IN CONFIG$ MOV S.KRB(R4),R2 ;GET KRB ADDRESS .IF DF M$$PRO) BNE 43$ ;IF NE THERE IS A KRB ADDRESSC6 TSTB $PWRFL ;IS THIS TOTAL PWRFAIL OR JUST DEVICES) BEQ 35$ ;IF EQ NOT TOTAL -- TRY AGAINT BR 45$ ;GO DO THIS ONE .IFF ! BEQ 45$ ;IF EQ NO KRB ADDRESSL .IFTO=43$: BIT K.URM(R2),$PFURM ;SHOULD WE CHECK OUT THIS DEVICE?: BEQ 431$ ;IF EQ NO2 BIT K.URM(R2),@$CPURM ;IS IT ON THIS PROCESSOR? BNE 44$ ;IF NE YES BR 35$ ;EQ - NOTG; CHECK FOR A DUAL PORT, LOAD SHARE DEVICE WHERE ONLY ONE PORT'S URM,OD; NAMELY THE ONE THAT IS NOT THE CURRENT OWNER (S.KRB) POWERFAILED.431$: MOV #S2.MAD!S2.LDS,R0 ;GET STATUS BITS- BIC S.ST2(R4),R0 ;ARE ALL OF THE ABOVE SETH( BNE 35$ ;IF NE NO - NOT LOAD SHARING* MOV S.KTB(R4),R0 ;ASSUME THIS IS PORT A# BIT #KP.OFL,R0 ;IS PORT A ONLINEK+ BEQ 35$ ;IF EQ00sRuntttt tfDATA NO, NO ONLINE PORT PWFLD CMP R0,R2 ;PORT A ?S& BNE 432$ ;IF NE NO - TAKE THIS ONE* MOV S.KTB+2(R4),R0 ;POINT TO OTHER PORT! BIT #KP.OFL,R0 ;IS IT ONLINE ?W+ BEQ 35$ ;IF EQ NO, NO ONLINE PORT PWFLDE&432$: MOV R0,R2 ;POINT TO OTHER KRB. BIT K.URM(R2),$PFURM ;THAT PORT POWERFAIL ?- BEQ 35$ ;IF EQ NO (THAT WAS A LOT OF WORK  ; FOR NOTHING)$6 BIT K.URM(R2),@$CPURM ;OTHER PORT ON THIS PROCESSOR) BEQ 35$ ;IF EQ NO (DON'T WORRY, WE'LLO% ;CATCH IT LATER ON ANOTHER CPU)  .ENDC444$: BIT #KS.OFL,K.STS(R2) ;IS CONTROLLER OFFLINE? BEQ 45$ ;IF EQ NO)" TSTB U.STS(R5) ;IS UNIT ACTIVE? BPL 35$ ;IF PL NOW;3A; THE CONTROLLER IS OFFLINE, AND THE UNIT IS ACTIVE. WE HAVE AOA; PROBLEM. WE CANNOT CALL THE DRIVER AT THE CANCEL ENTRY SINCE$&; THE DEVICE REGISTERS DO NOT EXIST.; E BGCK$A BF.ERR,BE.CSR,FATAL ;ACTIVE CONTROLLER DISAPPEARED AT PWRFLB45$: BITB #UC.PWF,U.CTL(R5) ;CALL DRIVER REGARDLESS OF ACTIVITY? BNE 50$ ;IF NE YES" TSTB U.STS(R5) ;IS UNIT ACTIVE? BPL 35$ ;IF PL NO =50$: MOV D.DSP(R3),R2 ;GET ADDRESS OF DRIVER DISPATCH TABLET$ BEQ 35$ ;IF EQ DRIVER NOT LOADED;+-; **-$LDPWF-CALL DRIVER AT POWERFAIL ENTRY. ;VF; THIS ROUTINE WILL UNCONDITIONALLY CALL THE DRIVER AT ITS POWERFAIL; ENTRY FOR A SINGLE UNIT.;X ; INPUTS:;B; R2=DDT ADDRESS.A; R3=DCB ADDRESS.R; R4=SCB ADDRESS.; R5=UCB ADDRESS.,;( ; OUTPUTS:;G; NONE;V ; NO REGISTERS ARE PRESERVED!;-8$LDPWF::MOV KINAR5,-(SP) ;SAVE KERNEL INSTR ADDR REG 5 .IF DF K$$DAS0 MOV KDSAR5,-(SP) ;SAVE KERNEL DATA ADDR REG 5 .IFTF+ MOV D.PCB(R3),R3 ;GET DRIVER PCB ADDRESSY' MOV P.REL(R3),KINAR5 ;MAP THE DRIVERO   .IFTE 1  MOV P.REL(R3),KDSAR5 ;MAP DRIVER IN DATA SPACE  .IFTF(55$: MOV S.KRB(R4),R3 ;GET KRB ADDRESS! BEQ 60$ ;IF EQ NO KRB ADDRESS * MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX;<; CALL DRIVER AT POWERFAIL ENTRY POINT WITH THE ARGUMENTS:;A; R3=CONTROLLER INDEX.+; R4=ADDRESS OF THE STATUS CONTROL BLOCK.); R5=ADDRESS OF THE UNIT CONTROL BLOCK.G;$; IF S.KRB=0 THEN R3 IS UNDEFINED.;I*60$: TST D.VPWF(R2) ;IS THERE AN ENTRY ? BEQ 70$ ;IF EQ NOE  CLC8! CALL @D.VPWF(R2) ;CALL DRIVER AT POWERFAIL ENTRYPOINT"70$: ;REFERENCE LABEL#$ .IFTB%3& MOV (SP)+,KDSAR5 ;RESTORE KERNEL DATA ADDR REG 5O'( .ENDC)*4+ MOV (SP)+,KINAR5 ;RESTORE KERNEL INSTR ADDR REG 5 , RETURN ; - .DSABL LSBA./0 .IF DF M$$PRO152$PWRMP::CACHE$ BYPASS ;;;GET ACTUAL WORD IN MEMORYE34; 5; REMOVE OUR BIT FROM $STENB6;K7&8 MOV $STENB,R0 ;;;GET CURRENT STATUS?95$: CACHE$ BYPASS ;;;KEEP FORCING BYPASS IN CASE OF PWR FAILC): BIC $CPBIT,$STENB ;;;CLEAR OUT OUR BITE"; BIT $CPBIT,$STENB ;;;BREAK TIES1< BNE 5$ ;;;FIX ONE IN A MILLION RACE CONDITIONS#= MOV $CPBIT,R1 ;;;GET OUR CPU BIT.$> COM R1 ;;;MAKE IT BIT CLEAR MASK)? BIC R1,R0 ;;;LEAVE ONLY OUR BIT IN R0 4@ CALL $STTIC ;;;MAKE SURE THE SANITY TIMER IS OFF@A10$: CACHE$ BYPASS ;;;KEEP FORCING BYPASS IN CASE OF PWR FAIL.B TST $PWRMK ;;;ANYONE IN THE POWERFAIL AREA!C BNE 10$ ;;;IF YES KEEP TRYINGA%D BIS R0,$STENB ;;;SET OUR BIT AGAINC'E CACHE$ RESTOR ;;;UNBYPASS THE CACHE; F RETURNUGH .ENDCIJ;++K;**-$MKSET-RESET MK11 CSR'S ON CPU ONLINEAL;IFM; THIS ROUTINE IS CALLED TO RESTORE THE SETTING OF MK11 CSR'S (USINGFN; $MKCSR,$MKCS1,$MKCS2) AFTER POWER FAILURE AND RECOVERY, AND AT CPUHO; ONLINE TIME TO BRING PARITY (NO PUN INTENDED) TO THE NEW PROCESSOR'SP; OUTLOOK ON MEMORY.Q;O R; INPUTS:S;$ T; NONE.NU;I V; OUTPUTS:W;AX; MK11 MEMORY BOXES REMAPPEDY;Z; R0,R1 ARE DESTROYEDU&[; R2 = STATUS (VALID ONLY IF $MKSET):\; C = 1 IF ANY ONLINE BOX (IN $MKCSR) IS NOT IN I/O PAGE];-^_ .IF DF M$$K11`>a; NOTE: THE FOLLOWING CODE ASSUMES THAT WE ARE CALLED ON CPU8b; ONLINE IN A SECTION PROTECTED BY $SGFI00sZut^utccccN (I.E. MPENT)9c; AND THAT POWERFAIL DOES NOT CALL $SGFIN. THIS WAY, IFP:d; A CSR "DISAPPEARS" WHILE POWERED DOWN, THE SYSTEM WILL:e; CRASH. IF IT DISSAPEARS BEFORE PROCESSOR ON-LINE (E.G.;f; SWITCHES NOT SET CORRECTLY) THE ON-LINE TRANSITITION ISR g; REJECTED.Uh4i$MKSET::MOV #$MKCSR,R0 ;POINT TO FIRST CSR ADDRESS+j MOV #IE.ONP,R2 ;ASSUME CSR'S NOT PRESENT/k10$: MOV (R0)+,R1 ;GET FIRST/NEXT CSR ADDRESSW(l CMP #160000,R1 ;IS IT A CSR ADDRESS ?#m BHI 20$ ;IF HI NO, IT'S A DUMMYY$n CLC ;ASSUME THAT THE CSR EXISTS1o MOV $MKCS1,(R1) ;STUFF CSR1 WITH CONTROL VALUESp BCS 30$ ;IF CS DIDN'T EXIST,;q MOV $MKCS2-$MKCSR-2(R0),2(R1) ;CRAM CSR2 WITH START ADDRR,r20$: CMP R0,#$MKCS2 ;REACHED THE END YET ?s BLO 10$ ;IF LO NO, CONTINUE4t MOV #1,R2 ;SET SUCCESS (NOTE C-BIT MUST BE CLEAR'u ;FOR BLO TO HAVE DROPPED THROUGH)Mv30$: RETURN ;BACK TO CALLER(wx .ENDC ; DF M$$K11yz{;+0|;**-$DRVPF-CALL DRIVERS FOR POWERFAIL RECOVERY}; F~; THIS ENTRY POINT IS PROVIDED SPECIFICALLY FOR USE BY AUTOCONFIGUREG; TO RECOVER THE SYSTEM. THE DEVICE DRIVERS ARE CALLED AT THEIR POWER?; FAIL ENTRY POINTS IN ORDER TO RE-ESTABLISH INTERRUPTS, ETC.0;--$DRVPF:: ;DRIVER POWERFAIL RECOVERY ENTRY 8 MOV KISAR5,-(SP) ;SAVE APR 5 MAPPING (D OR I/D SPACE) .IF DF K$$DAS1 MOV KINAR5,-(SP) ;SAVE APR 5 MAPPING (I SPACE)C .IFTF ; DF K$$DAS .IF DF M$$PRO6 BIS @$CPURM,$PFURM ;INDICATE THIS CPU'S URMS FAILED .ENDC ; DF M$$PRO) CALL DRVPF ;CALL DRIVERS AT POWERFAILO .IFT ; DF K$$DASD4 MOV (SP)+,KINAR5 ;RESTORE APR 5 MAPPING (I SPACE) .ENDC ; DF K$$DAS; MOV (SP)+,KISAR5 ;RESTORE APR 5 MAPPING (D OR I/D SPACE)R  RETURN ; .END,-(SP) ;SAVE APR 5 MAPPING (D OR I/D SPACE) .IF DF K$$DAS1 MOV KINAR5,-(SP) ;SAVE APR 5 MAPPING (I SPACE)C .IFTF ; DF K$$DAS .IF DF M$$PRO6 BIS @$CPURM,$PFURM ;INDICATE THIS CPU'S URMS FAILED .ENDC ; DF  .TITLE DRQIO  .IDENT /15.05/4;8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;K>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;  ; D. N. CUTLER 8-OCT-73K ;(- ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:  ;4; J. R. KAUFFMAN; J. M. LAWLER; T. LEKAS-; B. S. MCCARTHY;N-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:K;M ; H. HUANG; S. C. ADAMSR; S. M. THOMAS; J. W. BERZLE; B. S. MCCARTHY; L. B. MCCULLEY;R; MODIFIED BY:;R ; K. L. NOEL 06-JAN-87 V15.00;R+; KLN032 -- ADD IMPLICIT LUN ASSIGNMENTSR;E; K. L. NOEL 05-MAR-87 V15.01M;S.; KLN036 -- ADD SUPPORT FOR REMOTE OVERLAYS; ; K. L. NOEL 11-MAR-87 V15.02S;.>; KLN038 -- BYPASS CHECKS FOR NON-MOUNTED MOUNTABLE DEVICES; ON REMOTE SYSTEMS;; K. L. NOEL 6-APR-87 V15.03;./; KLN040 -- FIX IMPLICIT ALUN CALL TO A JUMP ; ; K. L. NOEL 16-JUN-87 V15.04S;A<; KLN054 -- ALLOCATE CPRBUF PACKET FOR KILL I/O FUNCTIONS;O$; ERIC POSTPISCHIL 20-JUL-87 15.05?; edp057 -- REMOVE CORRECT NUMBER OF ITEMS FROM KERNEL STACK7"; WHEN BACKING UP TASK'S PC.-;T.; MACRO LIBRARY CALLS /; 0:1 .MCALL F11DF$,HWDDF$,PKTDF$,SHDDF$,TCBDF$,PCBDF$,UCBDF$2 .MCALL BGCK$A2 .MCALL CPRDF$ ;KLN032T324 F11DF$ ;DEFINE FILES-11 CONTROL BLOCK OFFSETS&5 HWDDF$ ;DEFINE HARDWARE REGISTERS&6 PKTDF$ ;DEFINE I/O PACKET OFFSETS,7 SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS.8 TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS39 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSR.: UCBDF$ ;DEFINE UNIT CONTROL BLOCK OFFSETS5: CPRDF$ ;DEFINE COPROCESSOR DEFINITIONS ;KLN032L:; ;KLN032!:; LOCAL SYMBOLS ;KLN032$:; ;KLN032: MAP6 = 140000 ;KLN032: ;KLN032F;<;+=; **-$DRQIO-QUEUE I/O REQUESTE)>; **-$DRQIW-QUEUE I/O REQU00tbuntttt tfDATAEST AND WAIT.?;TE@; THESE DIRECTIVES INSTRUCT THE SYSTEM TO PLACE AN I/O REQUEST IN AOEA; QUEUE OF PRIORITY ORDERED REQUESTS FOR A DEVICE-UNIT SPECIFIED BYFDB; A LOGICAL UNIT NUMBER. IN ADDITION, IF THE DIRECTIVE IS QIO ANDJC; WAIT AND AN EVENT FLAG IS SPECIFIED, THE TASK IS PUT INTO A WAIT STATE!D; FOR THE SPECIFIED EVENT FLAG. E; F; DPB FORMAT: G; 'H; WD. 00 -- DIC(1./3.),DPB SIZE(12.). I; WD. 01 -- I/O FUNCTION CODE."J; WD. 02 -- LUN AND UNUSED BYTE.CK; WD. 03 -- EVENT FLAG NUMBER AND PRIORITY (PRIORITY IS IGNORED).S*L; WD. 04 -- ADDRESS OF I/O STATUS BLOCK.-M; WD. 05 -- ADDRESS OF AST SERVICE ROUTINE.AN; WD. 06 -- PARAMETER 1.O; WD. 07 -- PARAMETER 2.P; WD. 10 -- PARAMETER 3.Q; WD. 11 -- PARAMETER 4.R; WD. 12 -- PARAMETER 5.S; WD. 13 -- PARAMETER 6.T; U; INPUTS:PV;E;W; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.I3X; R3=ADDRESS OF THE I/O FUNCTION CODE IN THE DPB.C1Y; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.3.Z; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.[;E7\; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ]; /^; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.A(_; DIRECTIVE STATUS OF +1 IS RETURNED.!`; C=1 IF DIRECTIVE IS REJECTED.19a; DIRECTIVE STATUS OF 'D.RS5' IS RETURNED IF SPECIFIED b; LUN IS NOT ASSIGNED.c;-d e .ENABL LSBS1f$DRQIO::MOV (R3)+,-(SP) ;SAVE I/O FUNCTION CODE 'g CALL $MPLUN ;MAP LUN TO UCB ADDRESSEh BCC 10$ ;IF CC LUN ASSIGNEDDh ;KLN032K;h .IF DF C$$DFB&C$$RTB ;RUN TIME BINDING OF LUNS ;KLN032 h ;KLN032T?h BIT #T4.DFB,T.ST4(R5) ;TASK HAVE DEFERRED BINDING? ;KLN032C h BEQ 5$ ;IF EQ NO ;KLN032h ;KLN032T@h BIT #F5.RTB,$FMSK5 ;SYSTEM SUPPORT RUN TIME BINDING? ;KLN032 h BEQ 5$ ;IF EQ NO ;KLN032h ;KLN032A;h TST (SP)+ ;REMOVE I/O FUNCTION CODE FROM STACK ;KLN032 h ;KLN032D,h JMP $IMASG ;DO IMPLICIT ALUN ; KLN040h ; KLN040&h .ENDC ;C$$DFB&C$$RTB ; KLN032h ; KLN0324h5$: DRSTS D.RS5 ;SET DIRECTIVE STATUS ; KLN032h ; KLN032h ; KLN032j10$: ;**-1%k .IF DF R$$AMD ;AUTOMOUNT/DISMOUNT l.m CMP $VERTK,R5 ;QIO FROM VERIFICATION TASK ?0n BEQ 14$ ;IF EQ, YES - BREAKTHROUGH STALL I/Oo ASSUME US.SIO,200+p TSTB U.ST2(R2) ;STALL I/O IN PROGRESS ?I)q BMI 13$ ;IF MI, YES - DON'T QUEUE I/OKrs .ENDC ; DF R$$AMDt$u BIT #1,(R1) ;OPERATION PENDING ?v BEQ 14$ ;IF EQ NODw13$:Cw ADD #12,SP ; REMOVE FUNCTION, RETURN AND +1 FROM STACK. ;edp057V<w135$: SUB #2,$UMPC ;BACKUP TASK PC TO RE-EXECUTE ;KLN0543z CALLR $TKWSE ;WAITFOR SIGNIFICANT EVENT ;**-2Uz14$: ;KLN054$1z .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN054 z ;KLN054R8z BIT #F5.RTK,$FMSK5 ;REMOTE TASKS TURNED ON? ;KLN054"z BEQ 145$ ;IF EQ NO ;KLN054z ;KLN054 8z CMPB 1(SP),#IO.KIL/256. ;IS THIS I/O KILL? ;KLN054"z BNE 145$ ;IF NE NO ;KLN054z ;KLN054A;z CMP (R2),$XXLOW ;IS I/O KILL FOR A GENERIC UCB ;KLN0545#z BLO 145$ ;IF LO, NO ;KLN054 ;z CMP (R2),$XXHGH ;IS I/O KILL FOR A GENERIC UCB ;KLN054C#z BHI 145$ ;IF HI, NO ;KLN054Kz ;KLN054R$z MOV R3,-(SP) ;SAVE R3 ;KLN054$z MOV R0,-(SP) ; AND R0 ;KLN054$z MOV R1,-(SP) ; AND R1 ;KLN0546z MOV #AL$SWS,R0 ;CALL IS FROM SYSTEM STATE ;KLN054/z MOV #1,R1 ;ONE BLOCK TO ALLOCATE ;KLN054L'z CALL $CPALO ;GET PACKET ;KLN054;/z BCC 143$ ;IF CC, ALLOCATION OKAY ;KLN054;z ;KLN054E6z ADD #14,SP ;GET RID OF JUNK ON THE STACK ;KLN054.z BR 135$ ;GO TO BACK UP USER'S PC ;KLN054z ;KLN054I8z143$: MOV R0,$CPPKT ;SAVE ADDRESS OF PACKET ;KLN054'z MOV (SP)+,R1 ;RESTORE R1 ;KLN054R$z MOV (SP)+,R0 ; AND R0 ;KLN054$z MOV (SP)+,R3 ; AND R3 ;KLN054z ;KLN054Oz CLR $CPLUN ; ;KLN054VAz MOVB -2(R3),$CPLUN ;STORE LUN NUMBER TO KILL I/O ON ;KLN054Cz ;KLN054Bz .ENDC ;C$$RTK ;KLN054 00tju^utccccz145$: ;KLN054:z BIT #DV.ISP!DV.OSP,U.CW1(R2) ;SPOOLED DEVICE? ;KLN054| BEQ 16$ ;IF EQ NO ;**-1E3} CMP U.ATT(R2),R5 ;IS ISSUING TASK THE DESPOOLER?0+~ BEQ 155$ ;IF EQ YES, I/O TO REAL DEVICE3 BITB #US.MNT,U.STS(R2) ;SPOOLED DEVICE MOUNTED ?R4 BNE 15$ ;IF NE NO (US.MNT IS DEVICE NOT MOUNTED)4 CMP U.ACP(R2),R5 ;ISSUING TASK THE DEVICE'S ACP ?+ BEQ 155$ ;IF EQ YES, I/O TO REAL DEVICEMD15$: CMPB 1(SP),#IO.WLB/256. ;WRITE LOGICAL FUNCTION NOT BY DSPLR? BNE 16$ ;IF NE NO % DRSTS D.RS16 ;PRIVILEGE VIOLATION,4155$: MOV R2,R0 ;DIRECT I/O TO ACTUAL SPOOLED DEV$16$: MOV (R0),R2 ;GET DCB ADDRESS) TST D.DSP(R2) ;IS THE DRIVER RESIDENT?5 BNE 17$ ;IF NE YES% DRSTS D.RS6 ;SET DIRECTIVE STATUSS(17$: MOV R0,-(SP) ;SAVE POINTER TO UCB0 MOV R1,-(SP) ;SAVE POINTER TO SECOND LUN WORD* MOVB (R3),-(SP) ;SAVE EVENT FLAG NUMBER* CALL $CEFNG ;CONVERT EVENT FLAG NUMBER0 BIC #1,R1 ;CLR GRP GLOBAL 2ND WORD INDICATOR+ BIC R0,(R1) ;CLEAR SPECIFIED EVENT FLAG8 MOV R3,-(SP) ;SAVE ADDRESS OF I/O STATUS BLOCK ADDRES8 MOV (R3),R0 ;GET ADDRESS OF I/O STATUS BLOCK ADDRESS3 BEQ $DQLM2 ;IF EQ NO I/O STATUS BLOCK SPECIFIEDT+$DQLM1::CLR -(SP) ;ZERO I/O STATUS BLOCKS MTPD$ (R0)+ ;S CLR -(SP) ;( MTPD$ (R0) ;.$DQLM2::CALL $ALPKT ;ALLOCATE AN I/O PACKET .IF DF A$$CNT$ MOV R0,-(SP) ;SAVE PACKET ADDRESS5 MOV T.ACN(R5),R0 ;LOCATE ACCOUNTING BLOCKS OF TASKO) BEQ 20$ ;IF EQ, NO ACCOUNTING ON TASKE+ MOV #B.QIO,R1 ;OFFSET TO QIO COUNT FIELDD$ CALL $ADAT1 ;INCREMENT QIO COUNT120$: MOV (SP)+,R0 ;RESTORE PACKET ADDRESS TO R0S .ENDCA TALLY$ B.QIOC,XA$$IO,CPU ;COUNT AN I/O INITIATION FOR THIS CPUO .IF DF S$$HDW: MOV #DV.DIR!DV.F11,R3 ;SEE IF DEVICE SUPPORTS SHADOWING;;@; THE FOLLOWING INSTRUCTION DEPENDS ON THE UCB ADDRESS FOR THE&; CURRENT UCB BEING AT OFFSET 6(SP).;  MOV 6(SP),R1 ;GET UCB ADDRESS& BIC U.CW1(R1),R3 ;ARE ALL BITS SET? BNE 23$ ;IF NE NO -- EXITT. BIT #DV.SQD,U.CW1(R1) ;COULD IT BE MAGTAPE? BNE 23$ ;IF NE YES -- EXIT$ MOV U.UMB(R1),R1 ;GET UMB ADDRESS BEQ 23$ ;IF EQ NO UMBX; E; THE REPLACEMENT CONTROL TASK MUST BE SPECIAL CASED FOR SHADOWING.VD; IT IS THE ONLY TASK THAT MAY READ OR WRITE EITHER THE PRIMARY OR=; THE SECONDARY DEVICE WITHOUT ITS FUNCTION BEING SHADOWED. ;N* CMP $RCTPT,R5 ;IS THIS I/O FROM RCT...? BEQ 23$ ;IF EQ YES% CMP 6(SP),M.UCBS(R1) ;PRIMARY UCB?? BEQ 21$ ;IF EQ YES& CALL $DEPKT ;DEALLOCATE I/O PACKET% DRSTS D.RS16 ;PRIVILEGE VIOLATIONS;C; DEVICE SUPPORTS SHADOW RECORDING AT THIS TIME. ALLOCATE THE ML*; NODE AND LINK IT IN THE LIST AT M.LHD.;E721$: BIT #MS.MDA,M.STS(R1) ;CAN WE ALLOCATE NEW ONES?R BNE 23$ ;IF NE NO ( MOV R0,-(SP) ;SAVE CURRENT I/O PACKET! MOV R1,-(SP) ;SAVE UMB ADDRESS( MOV #ML.LGH,R1 ;SET LENGTH OF ML NODE CALL $ALOCB ;GET PACKETY BCC 22$ ;IF CC GOT SPACE;B?; NOT ENOUGH SPACE FOR THE ML NODE IN THE SYSTEM POOL. SEEMST?; A SHAME TO KILL THE I/O AFTER GETTING THE FIRST PACKET, ANDP?; NOT THE SECOND. MAYBE THE FINAL ANSWER IS TO LET THE FIRSTA?; GO THRU AND ONLY CONSIDER IT A PROBLEM IF IT WAS A WRITE ORS@; A READ THAT FAILED. FROM THE STATISTICS, IT WOULD SEEM THAT>; THIS WOULD COVER THE VAST MAJORITY OF THE CASES (I.E. MOST; QIO FUNCTIONS ARE READS).L; E; FOR THE TIME BEING, IF WE CAN'T GET THE RESOURCES NOW, FORGET IT.;! TST (SP)+ ;REMOVE UMB ADDRESSE' MOV (SP)+,R0 ;GET I/O PACKET ADDRESS & CALL $DEPKT ;DEALLOCATE I/O PACKET# DRSTS D.RS1 ;ALLOCATION FAILUREY'22$: MOV R0,R1 ;COPY ML NODE ADDRESS  CLR (R0)+ ;CLEAR LINK WORD) MOVB #ML.LGH,(R0)+ ;ML.LEN SET LENGTHA' MOVB #MT.PKT,(R0)+ ;ML.TYP SET TYPES+ CLR (R0)+ ;ML.DNC/UNUSED SET DONE COUNTI: MOV 2(SP),(R0)+ ;ML.PRI SET PRIMARY I/O PACKET ADDRESS MOV (SP)+,R0 ;GET UMB ADDRESS6 MOV M.LHD(R0),(R1) ;LINK NEW NODE TO PREVIOUS FIRST/ MOV00truntttt tfDATA R1,M.LHD(R0) ;POINT LISTHEAD TO NEW NODE ( MOV (SP)+,R0 ;GET OLD I/O PACKET BACK23$: ;REFERENCE LABEL .ENDC .IF DF R$$LKL7 CLR I.PRM+16(R0) ;INITIALLY CLEAR LOCK ENTRY POINTER  .ENDC; ADD #I.AADA,R0 ;POINT TO ATTACHEMENT DESCRIPTOR POINTERST2 MOV R0,$ATTPT ;SAVE POINTER FOR $CKBFX ROUTINES' CLR (R0)+ ;CLEAR FIRST ATT DESC PTR  CLR (R0) ;SECOND6 SUB #I.AADA+2,R0 ;POINT BACK TO START OF I/O PACKET. INCB T.IOC(R5) ;INCREMENT I/O REQUEST COUNT8 MOV (SP)+,R3 ;RETRIEVE ADDRESS OF I/O STATUS BLOCK AD- CMPB -10(R3),#3 ;IS FUNCTION QIO AND WAIT? BNE 25$ ;IF NE NO$ MOV R0,-(SP) ;SAVE PACKET ADDRESS+ MOVB 2(SP),R0 ;PICK UP EVENT FLAG NUMBER! BEQ 24$ ;IF EQ NONE SPECIFIED 0 CALL $CEFI ;CONVERT FLAG TO MASK AND ADDRESS'  CALL $DRWFS ;PUT TASK IN WAIT STATEN   .IF DF G$$GEF 9  INC @$GEFPT ;KEEP GRP GLOBALS AROUND FOR WAITFOR TESTR0 INCB @$GFTCB ;INC GRP GBL USE COUNT FOR TASK .ENDC ; DF G$$GEF+24$: MOV (SP)+,R0 ;RESTORE PACKET ADDRESSO&25$: MOV R0,R4 ;COPY PACKET ADDRESS- TST (R4)+ ;POINT TO SECOND WORD IN PACKET9 MOVB T.PRI(R5),(R4)+ ;PRIORITY IS THAT OF ISSUING TASKI- MOVB (SP)+,(R4)+ ;INSERT EVENT FLAG NUMBERN# MOV R5,(R4)+ ;INSERT TCB ADDRESS 5 MOV (SP)+,(R4)+ ;INSERT POINTER TO SECOND LUN WORDW% MOV (SP)+,R5 ;RETRIEVE UCB ADDRESS# MOV R5,(R4)+ ;INSERT UCB ADDRESSD+ MOV (SP)+,(R4) ;INSERT I/O FUNCTION CODE 5 CLR -(SP) ;SET FLAG TO QUEUE TO DRIVER (NE 0=ACP)+ MOV R0,-(SP) ;SAVE ADDRESS OF I/O PACKET6 CLR -(SP) ;CLEAR ADDRESS OF SECONDARY CONTROL BLOC$ MOV SP,$TEMP0 ;MARK STACK ADDRESS*  MOV (R4)+,-(SP) ;SAVE I/O FUNCTION CODE0! CLR R1 ;ASSUME NO I/O STATUS BLOCK SPECIFIED0" CLR R2 ;ASSUME NO I/O STATUS BLOCK SPECIFIED0# MOV (R3)+,R0 ;GET ADDRESS OF I/O STATUS BLOCK!$ BEQ 30$ ;IF EQ NONE SPECIFIEDS2% CALL $RELOC ;RELOCATE I/O STATUS BLOCK ADDRESS<&30$: MOV R0,(R4)+ ;INSERT VIRTUAL ADDRESS OF I/O STATUS BL'' MOV R1,(R4)+ ;INSERT RELOCATION BIAS(,( MOV R2,(R4)+ ;INSERT DISPLACEMENT ADDRESS)*+ .IF DF S$$LIB,0- MOV (R3)+,R2 ;GET AST SERVICE ROUTINE ADDRESS+. CALL $CALTA ;CALCULATE ADDRESS TO STORE)/ MOV R2,(R4)+ ;STORE PROPER AST ADDRESSI01 .IFFR263 MOV (R3)+,(R4)+ ;INSERT AST SERVICE ROUTINE ADDRESS45 .ENDC67+8 MOV (SP),R2 ;RETRIEVE I/O FUNCTION CODE!9 CLRB R2 ;CLEAR MODIFIER FLAGSS/: SWAB R2 ;SWAP FUNCTION CODE INTO RIGHT BYTEA; BNE 33$ ;IF NOT ZERO - OKM < JMP FCKIL ;KILL I/O FUNCTION=33$: ;REFERENCE LABEL>?@ .IF DF M$$MUPA+B TST U.CW1(R5) ;IS THIS MOUNTABLE DEVICE?T4C BMI 35$ ;BRANCH IF YES -- ACCESS VALIDATED LATER)D MOV U.OWN(R5),R0 ;IS THE DEVICE OWNED?OE BEQ 35$ ;IF EQ NO1F BITB #US.PUB,U.ST2(R5) ;PUBLIC ACCESS ALLOWED?RG BNE 35$ ;IF NE YES-H MOV $TKTCB,R1 ;POINT TO CURRENT TASK'S TCBC2I CMP T.UCB(R1),R0 ;DEVICE OWNED BY CURRENT TASK?J BEQ 35$ ;IF EQ YES2K BIT #T3.PRV,T.ST3(R1) ;CURRENT TASK PRIVILEGED?L BNE 35$ ;IF NE YES'M JMP IEPRI ;ELSE PRIVILEGE VIOLATIONN35$: ;ACCESS ALLOWEDOP .ENDCQR(S CMP R2,#31. ;FUNCTION CODE IN RANGE?T BHI $IEIFC ;IF HI NO*U MOV (R5),R1 ;GET ADDRESS OF DEVICE DCB5V ADD #D.MSK,R1 ;ASSUME FUNCTION CODE IN 0-15. RANGE(%W CMP R2,#15. ;0-15. FUNCTION CODE?$X BLOS 40$ ;IF LOS YES(Y ADD #10,R1 ;POINT TO SECOND MASK SET%Z SUB #16.,R2 ;REDUCE FUNCTION CODET%[40$: ASL R2 ;CONVERT TO WORD INDEX3,\ MOV $BTMSK(R2),R2 ;GET FUNCTION MASK WORD*] BIT R2,(R1)+ ;IS THIS A LEGAL FUNCTION?^ BEQ $IEIFC ;IF EQ NO>_ BITB #US.OFL!US.PDF,U.ST2(R5) ;DEV. OFFLINE OR PRIV. DIAG.?,` BEQ 45$ ;IF EQ NO -- GO AHEAD AND USE IT1a BITB #US.OFL,U.ST2(R5) ;IS UNIT REALLY OFFLINE#b BEQ 42$ ;IF EQ NOOc JMP IEOFL ;UNIT IS OFFLINE6d42$: MOV $TKTCB,-(SP) ;CHECK TO SEE IF TASK IS PRIV./e ADD #T.ST3,(SP) ;POINT TO STATUS WORD IN TCBB2f BIT #T3.PRV,@(SP)+ ;IS CURRENT TASK PRIVILEGED?#f BNE 452$ ;IF NE YES ;KLN0382(f JMP IEOFL ;OFFLINE ERROR 00tzu^utcccc ;KLN038f452$: ;KLN0388h BIT #IQ.UMD,(SP) ;IS THI DIAGNOSTIC FUNCTION? ;**-1#h BNE 453$ ;IF NE YES ;KLN038(h JMP IEOFL ;OFFLINE ERROR ;KLN038h453$: ;KLN038?j45$: BIT R2,(R1)+ ;IS THIS FUNCTION A CONTROL FUNCTION ;**-1L"j BEQ 454$ ;IF EQ NO ;KLN038*j JMP FCCTL ;CONTROL FUNCTION ;KLN038j454$: ;KLN038-l BIT R2,(R1)+ ;IS FUNCTION NOP'ED? ;**-1Um BNE ISSUC ;IF NE YES#n TST U.CW1(R5) ;MOUNTABLE DEVICE?o BPL 80$ ;IF PL NOR5p MOVB U.STS(R5),R0 ;GET STATUS BYTE FOR TESTS BELOWDqr .IF DF R$$AMDst BIT R2,(R1) ;ACP FUNCTION ?Fu BEQ 46$ ;IF EQ NO,v CMP #IO.APV,(SP) ;MOUNT OR DISMOUNT QIO ?'w BEQ 48$ ;IF EQ YES, DOESN'T HAVE TOIx ;BE MOUNTEDOyz .ENDC ; R$$AMD{?|46$: BITB #US.MNT!US.FOR,R0 ;VOLUME MOUNTED AND NOT FOREIGN ? )} BNE 60$ ;IF NE NOT MOUNTED OR FOREIGNR~ BIT R2,(R1) ;ACP FUNCTION? BEQ 70$ ;IF EQ NOI048$: MOVB 1(SP),R2 ;RETRIEVE I/O FUNCTION CODE- SUB #10,R2 ;NORMALIZE FOR POLISH DISPATCH & BLT 50$ ;IF LT TABLE INCONSISTANCY! ASL R2 ;CONVERT TO WORD INDEXP5 MOV R5,-(SP) ;SAVE UCB ADDRESS FOR POLISH ROUTINESP MOV R5,R0 ;U: MOV I.LN2-I.PRM(R4),R1 ;SAVE ADDRESS OF SECOND LUN WORD$ MOV R1,-(SP) ;FOR POLISH ROUTINES2 MOV $FCDSP(R2),R5 ;GET ADDRESS OF POLISH VECTOR& JMP @(R5)+ ;EXECUTE POLISH ROUTINE;D ; REGISTERS AT POLISH DISPATCH;T ; R0 - UCB; R1 - ADDRESS 2ND LUN WORDP; R2 - NORMALIZED FCTN CODEE8; R3 - POINTER TO PARAMETERS, INITIALLY -> PARAMETER 14; R4 - POINTER INTO I/O PACKET, INITIALLY -> I.PRM; ; SP-> 2ND LUN WORD ADDRESSC; UCB ADDRESS; FUNCTION CODE2; $TEMP0->SECONDARY CONTROL BLOCK ADDRESS (OR 0); I/O PACKET ADDRESSV"; QUEUE FLAG (0=DRIVER; NE=ACP);CM; TASK HEADER IS ASSUMED TO BE MAPPED FOR ALL OF THE THREADED CODE ROUTINESE;D;I(; DEVICE TABLE MASK WORD INCONSISTANCY;G50$: BGCK$A BF.QIO,BE.IDC,FATAL ;DEVICE TABLE MASK WORD INCONSISTANCYR;E,; DEVICE NOT MOUNTED OR MOUNTED AS FOREIGN;T>60$: BITB #US.MNT,R0 ;DEVICE NOT MOUNTED OR MOUNTED FOREIGN?& BEQ 65$ ;BRANCH IF MOUNTED FOREIGN; ;KLN038U; ON REMOTE SYSTEMS, IF DEVICE IS ONE OF OUR GENERIC TYPES, THEY WILL NEVER ;KLN038); BE MOUNTED ;KLN038(; BYPASS ALL CHECKS HERE ;KLN038; ;KLN0382 .IF DF C$$RMT ;REMOTE HOST SUPPORT ;KLN038 ;KLN038F- BIT #HF.RMT,$HFMSK ;TURNED ON? ;KLN038S! BEQ 63$ ;IF EQ NO ;KLN038M ;KLN038F6 CMP (R5),$XXLOW ;DCB LOWER THAN GENERICS? ;KLN038" BLO 63$ ;IF LO YES ;KLN0384 CMP (R5),$XXHGH ;HIGHER THAN GENERICS? ;KLN038/ BLOS FCTRN ;IF LOS NO, ALLOW I/O ;KLN038G ;KLN038L63$: ;KLN038M .ENDC ;C$$RMT ;KLN038S ;KLN038 ; DEVICE NOT MOUNTED; ALLOW TRANSFER FUNCTION IF*; THE LOADR TASK IS DOING LOGICAL I/O IN-; VIRGIN SYSTEMS WITH THE DISK NOT MOUNTED.K;S; ACP FUNCTIONS ARE ILLEGALN;$ BITB #US.VV,R0 ;VOLUME VALID SET? BEQ 75$ ;IF EQ NOR BIT R2,(R1) ;ACP FUNCTION? BNE 75$ ;IF NE YES BR FCTRN ;ALLOW TRANSFER; ; MOUNTED FOREIGNR%; CHECK VOLUME MOUNTED TO THIS USER; IF ACP FUNCTION:; ERROR IF NO ACP'; INCREMENT VOLUME TRANSACTION COUNT 0; COPY PARAMETERS 1-6 (NO POLISH IF FOREIGN)0; QUEUE TO ACP UNLESS UC.QUE ALSO SET (U.CTL); IF TRANSFER FUNCTION:S8; ADDRESS CHECK AND RELOCATE BUFFER ADDRESS IN PARM 1.; MAP ADDRESS TO 18/22 BIT PHYSICAL ADDRESS; COPY PARAMETERS 2-6; QUEUE TO DRIVER;A 65$: ; .IF DF M$$MUP1 CALL CXMOU ;CHECK VOLUME MOUNTED BY THIS USERO BCS 75$ ;ERROR .ENDC BIT R2,(R1) ;ACP FUNCTION? BEQ FCTRN ;NOT ACP-TRANSFERE& TST U.ACP(R5) ;MOUNTED WITH AN ACP? BEQ 75$ ;IF EQ NOI' INC 6(SP) ;SET FLAG TO QUEUE TO ACPU! MOV U.VCB(R5),R1 ;GET VCB ADDRS BEQ FCXOP ;BR IF NO VCBC" INC (R1) ;INCR VOL TRANS COUNT#00tuntttt tfDATA BR FCXOP ;INSERT PARAMETERS 1-6 ;EH; FUNCTION IS AN ILLEGAL FUNCTION-DECLARE ILLEGAL FUNCTION CODE STATUS;.2$IEIFC::MOV #IE.IFC&377,R4 ;SET ILLEGAL FUNCTION  JMP IECMN;$7; DEVICE MOUNTED AND NOT FOREIGN BUT NOT ACP FUNCTION?;B/70$: CMP #IO.LOV,(SP) ;LOAD OVERLAY FUNCTION?E BEQ FCLOV ;IF EQ YES3 CMP #IO.LDO,(SP) ;LOAD D-SPACE OVERLAY FUNCTION?U BEQ FCLOV ;IF EQ YES4 MOV $TKTCB,R0 ;GET ADDRESS OF TCB OF CURRENT TASK* BIT #T3.PRV,T.ST3(R0) ;TASK PRIVILEGED?* BEQ 75$ ;IF EQ NO, PRIVILEGE VIOLATION .IF NDF R$$PRO-A CMPB #IO.WLB/400,1(SP) ;IS IT A WRITE LOGICAL BLOCK FUNCTION ?7$ BNE FCTRN ;IF NE NO, OK TO ISSUE1 BITB #US.LAB,U.STS(R5) ;ANSI MAGTAPE MOUNTED ?T% BNE FCTRN ;IF NE YES, OK TO ISSUEP3 MOV 6(R3),-(SP) ;SAVE FIRST HALF OF BLOCK NUMBER ' BIS 10(R3),(SP)+ ;BOTH HALVES ZERO ?P .ENDC ; DF R$$PRO+ BNE FCTRN ;IF NE NOT LBN 0, OK TO ISSUER* CMP $RCTPT,R0 ;IS THE CURRENT TASK RCT?/ BEQ FCTRN ;IF EQ, YES, ALLOW WRITE TO LBN 0,&75$: JMP IEPRI ;PRIVILEGE VIOLATION;; INTERMEDIATE TO FCKILI;A+76$: BR FCKIL ;BRANCH TO HANDLE KILL I/OI;O; DEVICE IS NOT MOUNTABLE.;5"80$: BIT R2,(R1) ;ACP FUNCTION? BEQ FCTRN ;IF EQ NOP ;6J ; FUNCTION IS A FILE STRUCTURE FUNCTION FOR A NONFILE STRUCTURED DEVICE.J ; INITION THIS MUST BE A READ OR WRITE VIRUTAL SINCE ALL OTHER FUNCTIONSJ ; HAVE BEEN EITHER ILLEGAL OR NOP'ED. MAP FUNCTION TO IT LOGICAL COUNTER ;,@ MOV #IO.WLB,I.FCN-I.PRM(R4) ;ASSUME FUNCTION IS WRITE VIRTUAL2 CMPB #IO.WVB/400,1(SP) ;WRITE VIRTUAL FUNCTION? BEQ FCTRN ;IF EQ YESB MOV #IO.RLB,I.FCN-I.PRM(R4) ;SET FUNCTION TO READ LOGICAL BLOCK) BR FCTRN ;GO TRANSLATE BUFFER ADDRESSI  .DSABL LSB;UB; FUNCTION IS A TRANSFER FUNCTION-ADDRESS CHECK AND MAP TRANSFER; FCLOV: ;REFERENCE LABEL .IF DF U$$DAS!A$$CNTO4 CALL FACHL ;ADDRESS CHECK LOAD OVERLAY IN USER I  BR FCTR1 ;ENTER COMMON CODE!" .ENDC ; DF U$$DAS!A$$CNTU#+$FCTRN: CALL FACHK ;PERFORM ADDRESS CHECK,4%FCTR1: CALL $MPPHY ;MAP TO 18/22 BIT PHYS ADDRESS4& CALL FCXR1 ;INSERT RELOC DISP & BIAS; & PARM 2-6' BR FCXTR ;();CD*; FUNCTION IS A KILL I/O FUNCTION-FLUSH I/O QUEUE OF TASK REQUESTS+;I,0-FCKIL: MOV (SP),$TEMP2 ;SAVE I/O FUNCTION CODE . CALL $IOKL2 ;FLUSH I/O QUEUE/0;F1; FUNCTION IS A NOP'ED FUNCTION-DECLARE SUCCESSFUL COMPLETION STATUS2;I3;4ISSUC: MOV #IS.SUC&377,R4 ;SET SUCCESSFUL COMPLETION CODED5IECM1: JMP IECOM ;:67;H8; SPECIFIED DEVICE IS OFFLINER9;L:6;IEOFL: MOV #IE.OFL&377,R4 ;SET DEVICE OFFLINE STATUS< BR IECM1 ;=;S>?;28@; FUNCTION IS A CONTROL FUNCTION-COPY REMAINDER OF DPBA;OB)CFCCTL: TST U.CW1(R5) ;MOUNTABLE DEVICE?D BPL 10$ ;IF PL NO;+E MOV $TKTCB,R0 ;POINT TO CURRENT TASK TCBHBF BITB #US.MNT!US.FOR,U.STS(R5) ;DEVICE MOUNTED AND NOT FOREIGN ?G BNE 5$ ;IF NE NO(H BITB #US.LAB,U.STS(R5);ANSI MAGTAPE ?I BEQ 6$ ;IF EQ NO6J4$: BIT #T3.PRV,T.ST3(R0) ;ISSUING TASK PRIVILEGED ?'K BNE 10$ ;IF NE YES - ISSUE FUNCTION:+L45$: JMP IEPRI ;NO - PRIVILEGE VIOLATIONSM5$: ;REFERENCE LABELN;9O; IF THE EXEC HANDLES VV VS CTL FUNCTIONS, IT GOES HEREP;'Q6$: TST U.OWN(R5) ;DEVICE ALLOCATED ?ER BEQ 10$ ;IF EQ NON;S CMP U.OWN(R5),T.UCB(R0) ;DEVICE ALLOCATED TO THIS USER ?.'T BNE 4$ ;IF NE NO, CHECK PRIVILEGED.NU10$: ;REFERENCE SYMBOLN+VFCXOP: CALL FCXP1 ;INSERT PARAMETERS 1-6?WFCXTR: ;REFERENCE SYMBOLI4X BITB #IQ.UMD,(SP) ;IS THIS A DIAGNOSTIC FUNCTION?Y BEQ 10$ ;IF EQ NOE:Z BIT #DV.UMD,U.CW1(R5) ;DOES DEVICE SUPPORT DIAGNOSTICS?[ BEQ 10$ ;IF EQ NO7\ CMPB 1(SP),#IO.ATT/256. ;IS THIS AN ATTACH FUNCTION?O'] BEQ 10$ ;IF EQ YES, SKIP RELOCATIONC6^ CMPB 1(SP),#IO.DET/256. ;IS THIS A DETACH FUNCTION?_ BEQ 10$ ;IF EQ YES>` BITB #US.UMD,U.ST2(R5) ;IS DEVICE ATTACHED FOR DIAGNOSTICS?,a BEQ IEPRI ;IF EQ NO, PRIVILEGE VIOLATION0b MOV00tu^utcccc (R4),R0 ;PICK UP REGISTER BUFFER ADDRESS$c MOV #40.*2,R1 ;PICK UP MAX LENGTH1d CALL $CKBFW ;CHECK AND LOCK DIAGNOSTIC BUFFER)e BCS IESPC ;IF CS ADDRESS CHECK FAILEDR)f CALL $RELOC ;RELOCATE REGISTER BUFFERC"g MOV R1,(R4)+ ;STORE KISAR6 BIAS#h MOV R2,(R4) ;STORE DISPLACEMENTY*i10$: MOV (SP)+,R1 ;RESTORE FUNCTION CODE2j CMP #IO.LOV,R1 ;IS THIS AN I-SPACE LOAD OVERLAYk BEQ 15$ ;IF EQ YES1l CMP #IO.LDO,R1 ;IS THIS A D-SPACE LOAD OVERLAYQm BNE FCXIT ;IN NE NOEn15$:$o TST U.CW1(R5) ;MOUNTABLE DEVICE?p BPL FCXIT ;IF PL NO#4q MOV $TKTCB,R3 ;GET ADDRESS OF TCB OF CURRENT TASKq ;KLN036F4q .IF DF C$$RTK ;IF REMOTE TASK SUPPORT ;KLN036q ;KLN036 @q BIT #F5.RTK,$FMSK5 ;REMOTE TASK SUPPORT TURNED ON? ;KLN036!q BEQ 20$ ;IF EQ NO ;KLN036Vq ;KLN036N/q MOV T.LDV(R3),R0 ;GET UCB ADDRESS ;KLN036 4q CALL @#$MPLND ;FOLLOW REDIRECT POINTERS ;KLN036<q CMP (R0),$XXLOW ;IS THIS ONE OF OUR GENERIC DCBS ;KLN036!q BLO 20$ ;IF LO NO ;KLN036E1q CMP (R0),$XXHGH ;CHECK FOR TOO HIGH ;KLN0363.q BHI 20$ ;IF HIGHER, NOT GENERIC ;KLN036q ;KLN036 =q BR FCXIT ;BYPASS MOUNTED CHECK AND LBN CONVERSION ;KLN036 q ;KLN036Kq20$: ;KLN036Uq ;KLN036q .ENDC ; C$$RTK ;KLN0366r BIT #T4.LDD,T.ST4(R3) ;WAS LOAD DEVICE DISMOUNTED ?$s BNE IEPRI ;IF NE YES, REJECT I/Ot;DHu; IF THIS IS A FIXED TASK WITHOUT A TASK IMAGE SAVE SET T.LBN TO ZERO.Iv; NO LEGIT TASK SHOULD HAVE A ZERO T.LBN BECAUSE BLOCK ZERO IS RESERVED Dw; FOR THE BOOT BLOCK. SUCH A TASK (FIXED WITH NO IMAGE) SHOULD NOT'x; PERFORM DISK OVERLAY LOAD REQUESTS.Yy;Mz{ .IF DF F$$NIM|*} MOVB T.LBN(R3),R0 ;GET HIGH BYTE OF LBN;~ BIS T.LBN+1(R3),R0 ;MERGE IN LOW BYTE, TEST FOR ALL ZERO $ BEQ IEPRI ;IF EQ YES, REJECT I/O .ENDC ; DF F$$NIM3 MOV T.LDV(R3),R0 ;GET UCB ADDRESS OF LOAD DEVICET;+; ** W A R N I N G **A;A; SPM HOOKPOINT NUMBER 25.;L+; DO NOT CHANGE THE INSTRUCTION FOLLOWINGO; LABEL WITHOUT CHECKING SPM;--$SPH25==. ;SPM CHANGES THE INSTRUCTION ATT! ;THE LOCATION OF THIS LABELU+ CALL @#$MPLND ;MAP TO ACTUAL UCB ADDRESS.3 CMP R0,R5 ;LOAD DEVICE UCB MATCH SPECIFIED UCB?R BNE IEOVR ;IF NE NOT9 ADD T.LBN+1(R3),-(R4) ;ADD IN LOW PART OF TASK LOGICALN ADC -(R4) ;BLOCK NUMBERL= MOVB T.LBN(R3),R0 ;GET HIGH BYTE OF TASK LOGICAL BLOCK NUMN .IF NDF U$$DASP! ADD R0,(R4) ;ADD IN HIGH PARTT .IFF ; NDF U$$DAS! ADD R0,(R4)+ ;ADD IN HIGH PARTM* SUB T.ISIZ(R3),(R4) ;ADJUST TO START OF SBC -(R4) ;REAL D-SPACEC .ENDC ; NDF U$$DAS FCXIT: TST (SP)+ ;CLEAN STACK/ MOV (SP)+,R1 ;RETRIEVE ADDRESS OF I/O PACKETI TST (SP)+ ;QUEUE TO DRIVER% BEQ DRQRQ ;IF EQ YES, IF NE Q ACPN1 BITB #UC.QUE,U.CTL(R5) ;IF SET QUEUE TO DRIVERM# BNE DRQRQ ;EVEN IF ACP FUNCTIONB;+; ** W A R N I N G **;; SPM HOOKPOINT NUMBER 20.;)+; DO NOT CHANGE THE INSTRUCTION FOLLOWINGS; LABEL WITHOUT CHECKING SPM;--$SPH20==. ;SPM CHANGES THE INSTRUCTION ATS! ;THE LOCATION OF THIS LABELN MOV U.ACP(R5),R0 ;I .IF DF R$$AMD;(G; IF THE VOLUME IS NOT MOUNTED OR MOUNTED FOREIGN, THEN U.ACP POINTERC; IS STILL ZERO. FOR THESE CASES, QUEUE IO.APV TO THE DEFAULT ACP ;U, BNE 10$ ;IF NE DEVICE ALREADY HAS AN ACP2 MOV $ACPTK,R0 ;GET DEFAULT FILES-11 ACP POINTER10$: .ENDC ; DF R$$AMD+ CALLR $EXRQP ;INSURE FILE SYSTEM ACTIVEE; 6; DESCRIPTION OF QUEUING AND INTERLOCKING INTERFACES; FOR MOUNTABLE DEVICESL;O<; I. NOT MOUNTED - ALLOW XFER FCTNS IF 'VOLUME VALID' SET1; (NEEDED FOR STARTUP). ACP FCTNS ARE ILLEGAL.D*; ADDRESS CHECK & MAP BUFFER ADDRESS IN; PARAMETER 1.; QUEUE TO DRIVER.A; ; II. MOUNTED9; A. ALL CASES - IF 'UC.QUE' SET IN 'U.CTL' THEN QUEUE$/; TO DRIVER. (NECESSARY TO SUPPORT EXISTING:*; DRIVERS THAT ARE REALLY LIKE ACP'S).00tuntttt tfDATA;;; B. MOUNTED FOREIGNE*; 1. XFER FCTN - ADDRESS CHECK AND MAP*; BUFFER ADDRESS IN PARAMETER 1. COPY'; PARAMETERS 2-6. QUEUE TO DRIVER. 4; 2. ACP FCTN - ERROR IF NO ACP. COPY PARAMETERS); 1-6. NO POLISH ROUTINE PROCESSING.S*; INCREMENT VOLUME TRANSACTION COUNT.; QUEUE TO ACP.;R; C. MOUNTED NOT FOREIGN1; 1. XFER FCTN - EITHER OVERLAY OR PRIVILEGEDU&; TASK I/O. ADDRESS CHECK AND MAP*; BUFFER ADDRESS IN PARAMETER 1. COPY'; PARAMETERS 2-6. QUEUE TO DRIVER.E5; 2. DECNET ACP - I/O FUNCTION CODES ARE DISJOINT .; FROM FILES ACPS' FUNCTION CODES. POLISH,; ROUTINE PROCESSING. QUEUED TO DRIVER; BECAUSE 'UC.QUE' SET..; 3. ANSI MAGTAPE (MTAACP) - SAME FUNCTION*; CODES AS DISK FILE ACP (F11ACP) BUT*; NOT ALL ARE ALLOWED. POLISH ROUTINE+; PROCESSING. ALL OPERATIONS QUEUED TOE/; MTAACP. NO BLOCK LOCKING. ACCESS/DEACCESS+; INTERLOCK BUT NO WINDOW TURN PENDINGM.; COUNT BECAUSE EVERYTHING QUEUED TO ACP.+; INCREMENT VOLUME TRANSCACTION COUNT.D4; 4. FILES-11 DISK ACP (F11ACP) - POLISH ROUTINE/; PROCESSING. TABLE BELOW DESCRIBES QUEUIN /; AND INTERLOCKING. LEGEND: A=QUEUE TO ACPS*; D=QUEUE TO DRIVER; I=INTERLOCK LUN;-; P=INCREMENT WINDOW TURN PENDING COUNT.A,; VOLUME TRANSACTION COUNT INCREMENTED./; SEE COMMENT LOCATED NEAR CKRAC AND CKWAC -; FOR DESCRIPTION OF WINDOW TURN PENDINGK; COUNT ALGORITHM.N;DRQRQ: ;REFERENCE LABEL; 4; CHECK SOFTWARE WRITE LOCK BEFORE GOING TO $DRQRQ;./ BIT #DV.MSD,U.CW1(R5) ;MASS STORAGE DEVICE?  BEQ 20$ ;IF EQ NOL1 BIT #DV.SWL,U.CW1(R5) ;SOFTWARE WRITE LOCKED?N BEQ 20$ ;IF EQ NO 9 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?W BEQ 20$ ;IF EQ YES: CMPB #IO.WLB/256.,I.FCN+1(R1) ;WRITE LOGICAL FUNCTION? BEQ IEWLK ;IF EQ YES, MOV #$WLKTB,R4 ;POINT TO TABLE (IN QITBL)' MOV I.FCN(R1),R0 ;GET FUNCTION CODES#  BIC #7,R0 ;GET RID OF MODIFIERSL/ 10$: CMP (R4)+,R0 ;IS THIS THE FUNCTION CODE?G  BEQ IEWLK ;IF EQ YES  TST (R4) ;END OF TABLE?G  BNE 10$ ;IF NE NO 20$:! JMP $DRQRQ ;QUEUE I/O REQUESTW;R(; WRITE ATTEMPTED TO WRITE LOCKED UNIT;I1IEWLK: MOV #IE.WLK&377,R4 ;SET WRITE LOCK ERROR BR IECMN ;;B; ILLEGAL BUFFER ADDRESS SPECIFIED-DECLARE ILLEGAL BUFFER STATUS; 0I2SPC: CLR -(R4) ;ERASE LAST ATTRIBUTE NUMBER4IESPC: MOV #IE.SPC&377,R4 ;SET ILLEGAL BUFFER CODEIECOM: BR IECMN ;;I; ILLEGAL LOAD OVERLAY UCB-DECLARE ILLEGAL LOAD OVERLAY FUNCTION STATUS;( :!IEOVR: MOV #IE.OVR&377,R4 ;SET ILLEGAL LOAD OVERLAY CODE" BR IECMN ;#$;;%; ILLEGAL BYTE COUNT OR ALIGNMENT-DECLARE ODD BYTE STATUS:&;#'0(IEBYT: MOV #IE.BYT&377,R4 ;SET ODD BYTE STATUS) BR IECMN ;*+;A<,; NO BUFFER SPACE AVAILABLE-SET NO BUFFER AVAILABLE STATUS-;C.9/IENOD: MOV #IE.NOD&377,R4 ;SET NO BUFFER AVAILABLE CODE70 BR IECMN ;12;O*3; BAD PARAMETER-SET BAD PARAMETER STATUS4;O536IEBAD: MOV #IE.BAD&377,R4 ;SET BAD PARAMETER CODEU7 BR IECMN ;89;V6:; PRIVILEGE VIOLATION-SET PRIVILEGE VIOLATION STATUS;;;<9=IEPRI: MOV #IE.PRI&377,R4 ;SET PRIVILEGE VIOLATION CODEE> BR IECMN ;?@;YAA; FILE ALREADY ACCESSED ON LUN-SET FILE ALREADY ACCESSED STATSUAB; C;DIEALN: MOV #IE.ALN&377,R4 ;SET FILE ALREADY ACCESSED CODEE BR IECMN ;FG;77H; NO FILE ACCESSED ON LUN-SET NO FILE ACCESSED STATUSI;J8KIENLN: MOV #IE.NLN&377,R4 ;SET NO FILE ACCESSED STATUSLM .IF DF,R$$LKLNO BR IECOM ;PQ;E4R; EXPLICIT UNLOCK PERFORMED OR BLOCK LOCKING ERRORS; STATUS IN R0T;;U!VIELCK: MOV R0,R4 ;STATUS IN R0PWX .ENDCYZ;E[; COMMON ERROR EXIT\;]+^IECMN: MOV $TEMP0,SP ;RESET STACK POINTERC8_ MOV (SP)+,R0 ;RETRIEVE ADDRESS OF SECONDARY CONTROL B` BEQ 10$ ;IF EQ NONED3a CALL $DEATR ;DEALLOCATE SECONDARY CONTROL BLOCK a10$: ;KLN054S+a .IF DF C$$RTK ;REMOTE TA00tu^utccccSKS ;KLN054 a ;KLN054 8a BIT #F5.RTK,$FMSK5 ;REMOTE TASKS TURNED ON? ;KLN054!a BEQ 20$ ;IF EQ NO ;KLN054Ba ;KLN0544a MOV (SP),R3 ;GET ADDRESS OF I/O PACKET ;KLN054=a CMPB I.FCN+1(R3),#IO.KIL/256. ;IS THIS I/O KILL? ;KLN054!a BNE 20$ ;IF NE NO ;KLN054C2a MOV $CPPKT,R0 ;GET ADDRESS OF PACKET ;KLN054$a BEQ 20$ ;IF EQ, NONE ;KLN054*a CALL $CPDEA ;DEALLOCATE IT ;KLN054a ;KLN054:a .ENDC ;C$$RTK ;KLN054Ra20$: ;KLN054N.a MOV R4,R0 ;SET FINAL I/O STATUS ;KLN0540c CLR R1 ;CLEAR SECOND I/O STATUS WORD ;**-1/d MOV (SP)+,R3 ;RETRIEVE ADDRESS OF I/O PACKETMe TST (SP)+ ;CLEAN STACK)f MOV I.UCB(R3),R5 ;RETRIEVE UCB ADDRESSI*g CALLR $IOFIN ;FINISH OFF I/O OPERATIONhi; j; BUILD AN I/O PACKETk;$l5m$BDPKT::INC 12(SP) ;QUEUE PACKET TO ACP NOT DRIVER ,n MOV #2*2,R1 ;SET LENGTH OF FILE ID BLOCK-o CALL OPPRM ;INSERT OPTIONAL FILE ID BLOCKN1p BEQ ATRBK ;IF EQ NO PARAMETER BLOCK SPECIFIEDNqr;R!s; BUILD ATTRIBUTE POINTER BLOCK0t;u?vATRBK: MOV (R3)+,(R4)+ ;ATTRIBUTE DESCRIPTOR BLOCK SPECIFIED?Iw BEQ MOVE3 ;IF EQ NOM.x MOV R3,-(SP) ;SAVE ADDRESS OF NEXT DPB WORD8y MOV #I.ATRL,R1 ;SET LENGTH OF SECONDARY CONTROL BLOCK1z CALL $ALOCB ;ALLOCATE SECONDARY CONTROL BLOCK$){ BCS IENOD ;IF CS NO STORAGE AVAILABLEO:| MOV R0,@$TEMP0 ;SAVE ADDRESS OF SECONDARY CONTROL BLOCK-} CLR (R0) ;INITIALIZE NUMBER OF ATTRIBUTESC)~ MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING 8 MOV -(R4),R3 ;RETRIEVE ADDRESS OF ATTRIBUTE DESCRIPTO7 MOV R0,(R4)+ ;SET POINTER TO SECONDARY CONTROL BLOCKB8 MOV R4,-(SP) ;SAVE ADDRESS OF NEXT WORD IN I/O PACKET5 MOV R0,R4 ;SET ADDRESS OF FIRST ATTRIBUTE POINTERT8 MOV #6,-(SP) ;SET MAXIMUM NUMBER OF ATTRIBUTE POINTER:10$: MOV R3,R0 ;SET ADDRESS OF NEXT ATTRIBUTE DESCRIPTO/ MOV #4,R1 ;SET SIZE OF ATTRIBUTE DESCRIPTORS3 CALL $ACHCK ;ADDRESS CHECK ATTRIBUTE DESCRIPTORE* BCS IESPC ;IF CS ADDRESS CHECK FAILURE6 CALL $RELOM ;RELOCATE AND MAP ATTRIBUTE DESCRIPTOR1 ADD #4,R3 ;POINT TO NEXT ATTRIBUTE DESCRIPTOR , MOVB (R0)+,(R4)+ ;INSERT ATTRIBUTE NUMBER4 BEQ 20$ ;IF EQ END OF ATTRIBUTE DESCRIPTOR BLOCK* CLR R1 ;PICKUP SIZE OF ATTRIBUTE BLOCK BISB (R0)+,R1 ;2 MOVB R1,(R4)+ ;INSERT LENGTH OF ATTRIBUTE BLOCK BNE 15$ ;IF NE LENGTH OKAY+ MOV #256.*2,R1 ;SET LENGTH FOR ZERO CASEE315$: MOV (R0),R0 ;GET ADDRESS OF ATTRIBUTE BLOCKE .IF DF X$$HDR) MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGL$ MOV 6(SP),KISAR6 ;MAP TASK HEADER .ENDC, CALL IOBUF ;ADDR CHECK AND INC I/O COUNT .IF DF X$$HDR7 MOV (SP)+,KISAR6 ;RESTORE MAPPING TO ATTRIBUTE BLOCKT .ENDC* BCS I2SPC ;IF CS ADDRESS CHECK FAILURE6 MOV R1,(R4)+ ;SAVE ADDRESS OF ATTACHMENT DESCRIPTOR1 CALL $RELOC ;RELOCATE ATTRIBUTE BLOCK ADDRESS.' MOV R1,(R4)+ ;INSERT RELOCATION BIASM/ MOV R2,(R4)+ ;INSERT ATTRIBUTE BLOCK ADDRESS. DEC (SP) ;ANY MORE SPACE IN POINTER BLOCK? BGT 10$ ;IF GT YES20$: TST (SP)+ ;CLEAN STACK8 MOV (SP)+,R4 ;RETRIEVE ADDRESS OF NEXT WORD IN I/O PA, MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING5 MOV (SP)+,R3 ;RETRIEVE ADDRESS OF NEXT WORD IN DPBC;B8; MOVE EXTEND AND ACCESS CONTROL WORDS INTO I/O PACKET;D5MOVE3: MOV (R3)+,(R4)+ ;INSERT EXTEND CONTROL WORDST MOV (R3)+,(R4)+ ;. MOV (R3)+,(R4)+ ;INSERT ACCESS CONTROL WORD;)"; INSERT OPTIONAL FILENAME BLOCK;C4FILNM: 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)+ ;;C$; INTERPRET REQUIRED BLOCK ADDRESS;D  .ENABL LSBI0RQPRM: MOV SP,R2 ;SET REQUIRED PARAMETER FLAG  BR 10$ ;;T$; INTERPRET OPTIONAL BLOCK ADDRESS;T/OPPRM: CLR R2 ;CLEAR REQUIRED PARAMETER FLAG(110$: MOV (R3)+,R0 ;GET ADDRESS OF CONTROL BLOCK! BEQ 20$ ;IF EQ NONE SPECIFIED+ CALL $CKBFW ;CHECK AND LOCK USER BUFFER 0 BCC 15$00tuntttt tfDATA ;IF CC, ADDRESS CHECK OKAY ;KLN0544 JMP IESPC ;OTHERWISE FINISH WITH ERROR ;KLN054315$: MOV R1,-(SP) ;SAVE ATT DESCR ADDR ;KLN054 0 CALL $RELOC ;RELOCATE BUFFER ADDRESS ;**-2' MOV R1,(R4)+ ;INSERT RELOCATION BIASE% MOV R2,(R4)+ ;INSERT BLOCK ADDRESSE' MOV (SP)+,R1 ;RESTORE ATT DESCR ADDR  BR 30$ ;(20$: MOV R2,(R4)+ ;PARAMETER REQUIRED?! BEQ 25$ ;IF EQ NO ;KLN054 4 JMP IEBAD ;OTHERWISE FINISH WITH ERROR ;KLN054/25$: CLR (R4)+ ;CLEAR SECOND WORD ;KLN054I30$: RETURN ; ;**-2  .DSABL LSBS;R<; FILL DISCONNECT PARAMETER BUFFER AND INTERLOCK LUN USAGE;C .IF DF M$$NET  .ENABL LSB =$CKDIS::MOV (R3)+,(R4)+ ;COPY FIRST PARAMETER TO I/O PACKETE! BR 10$ ;FINISH IN COMMON CODER;M"; CHECK CONNECT PARAMETER BUFFER;B2$CKPRM::CALL FCXP1 ;COPY PARAMETERS (UNTOUCHED) JMP @(R5)+ ;$CKHDR:: ; .IF DF X$$HDR$ MOV U.SCB(R0),R2 ;GET SCB ADDRESS@ BIT #S2.XHR,S.ST2(R2) ;COMM PRODUCT SUPPORT EXTERNAL HEADERS? BNE 20$ ;IF NE YES+ CMP #120000,R1 ;HEADER RESIDENT IN POOL?K BHIS 20$ ;IF HIS YES) JMP IEBAD ;RETURN BAD PARAMETER ERRORD .ENDC$CKCON:: ;12$: MOV 2(R3),R1 ;GET LENGTH OF BUFFER IN BYTESD! BNE 5$ ;IF NE NON ZERO LENGTHA JMP IESPC ;ZERO LENGTH,5$: CALL RQPRM ;INSERT REQUIRED PARAMETER%10$: CALL FCXP2 ;INSERT PARAMETERS 20$: JMP @(R5)+ ;  .DSABL LSBU .ENDC ;S( ; CHECK FOR VOLUME MARKED FOR DISMOUNT ;T   .ENABL LSB=$CKDMO::BITB #US.MDM,U.STS(R0) ;VOLUME MARKED FOR DISMOUNT?O BNE 15$ ;IF NE YES JMP @(R5)+ ;;R%; CHECK VOLUME MOUNTED BY THIS USER;C .IF DF M$$MUP$CKMOU:: ;REFERENCE LABEL .IF DF R$$AMD2 CMP #IO.APV,4(SP) ;MOUNT/DISMOUNT I/O REQUEST ?*  BEQ 2$ ;IF EQ YES - BYPASS MOUNT CHECK!" .ENDC ; DF R$$AMD#$ MOV R5,-(SP) ;SAVE R5 % MOV 4(SP),R5 ;GET UCB ADDRESS/& CALL CXMOU ;IS DEVICE MOUNTED BY THIS USER?' BCS 15$ ;IF CS NOC!( MOV (SP)+,R5 ;RESTORE REGISTERE)2$: JMP @(R5)+ ;O*+;14,; SUBROUTINE TO SEARCH MOUNT LIST TO SEE IF VOLUME-; REALLY MOUNTED BY THIS USERC.;/%0CXMOU: MOV R1,-(SP) ;SAVE REGISTERS:1 MOV R2,-(SP) ;)2 BITB #US.PUB,U.ST2(R5) ;PUBLIC DEVICE?43 BNE 8$ ;PUBLIC DEVICE OK%4 MOV $TKTCB,R1 ;IS TASK PRIVILEGED?U5 BIT #T3.PRV,T.ST3(R1)6 BNE 8$ ;PRIVILEGED TASK OK07 MOV T.UCB(R1),R1 ;GET USER TI: UCB ADDR AS ID!8 MOV #$MOULS,R2 ;GET MOUNT LISTS9:5$: SEC ;ASSUME FAIL%; MOV (R2),R2 ;GET MOUNT LIST ENTRY$< BEQ 9$ ;NONE=DONE=FAIL0= CMPB #MT.MLS,M.TYPE(R2) ;RIGHT TYPE OF ENTRY?> BNE 5$ ;BR NOT MOUNT ENTRY%? CMP M.DEV(R2),R5 ;SAME DEVICE UCB?S@ BNE 5$ ;BR DIFFERENT DEVICE$A CMP M.TI(R2),R1 ;SAME USER AS TI?B BNE 5$ ;BR DIFFERENT USERCCD8$: CLC ;SUCCESS%E9$: MOV (SP)+,R2 ;RESTORE REGISTERS3F MOV (SP)+,R1 ;R G RETURNSHI .ENDCJKLMN; BO; CHECK FOR READ ACCESS PRIVILEGES AND EXIT TO TRANSFER FUNCTIONP;AQ3R$CKRAC::MOV #WI.RDV,R2 ;SET READ ACCESS MASK WORDQ S BR 10$ ;TU;CV; CHECK FOR WRITE ACCESS PRIVILEGES AND EXIT TO TRANSFER FUNCTIONUW;TX4Y$CKWAC::MOV #WI.WRV,R2 ;SET WRITE ACCESS MASK WORD/Z10$: BIT R2,@(R1)+ ;DESIRED ACCESS PERMITTED? [ BNE 20$ ;IF NE YES&\15$: JMP IEPRI ;PRIVILEGE VIOLATION];$6^; ADDRESS CHECK & INSERT RELOC BIAS, DISP & PARM 2-6_;T"`20$: MOV R0,R5 ;GET UCB ADDRESS%a CALL FACHK ;PERFORM ADDRESS CHECKG!b CALL FCXR1 ;INSERT PARAMETERScd .IF DF,M$$NETe+f CMPB #IO.WVB/400,5(SP) ;DECNET FUNCTION? g BGE CKLCK ;IF GE NOO$h MOV U.SCB(R5),R0 ;GET SCB ADDRESS7i BIT #S2.XHR,S.ST2(R0) ;NEW I.LN2 HANDLING SUPPORTED?Ej BNE 50$ ;IF NE YES&k MOV $TKTCB,R0 ;GET TASK TCB ADDRESS=l MOV T.ATT(R0),R0 ;GET TASK PARTITION ATTACHMENT DESCRIPTORE:m INCB A.IOC-A.TCBL(R0) ;LOCK DOWN THE HEADER FOR THE I/O6n MOV A.PCB-A.TCBL(R0),R0 ;GET ADDRESS OF TASK REGION*o INCB P.IOC(R0) ;BUMP REGION'S00tu^utcccc I/O COUNT,p MOV 10(SP),R0 ;GET THE I/O PACKET ADDRESSq BR 55$ ;JOIN COMMON CODErs .ENDCtu;N$v; DO RMS BUCKET LOCKING PROCESSINGw;R-xCKLCK: BITB #US.LAB,U.STS(R5) ;ANSI MAGTAPE)y BNE 30$ ;IF NE YES(z MOV 10(SP),R1 ;GET ADDRESS I/O PACKET{| .IF DF,R$$LKL}(~ CALL $LCKPR ;PERFORM LOCK PROCESSING' BCC 22$ ;CS IF ERROR OR UNLOCK DONE- JMP IELCK ;D22$: ;REFERENCE LABEL .ENDC CALL $MPPKT ;MAP VBN TO LBNI BCS 30$ ;MAP FAILURE TST R0 ;ALL BLOCKS MAPPED??P BEQ 40$ ;IF EQ YES 30$: INC 12(SP) ;QUEUE TO ACP*40$: MOV @(SP),R0 ;GET ADDRESS OF WINDOW* INCB W.IOC(R0) ;ADJUST WINDOW I/O COUNT,50$: MOV 10(SP),R0 ;GET I/O PACKET ADDRESS: MOV @I.LN2(R0),I.LN2(R0) ;CHANGE I.LN2 TO IMAGE OF LUT2! INC I.LN2(R0) ;FLAG IT AS SUCH ?55$: BISB #200,I.EFN(R0) ;FLAG PACKET AS VIRTUAL I/O FUNCTION- TST (SP)+ ;CLEAN STACK' MOV (SP)+,R5 ;RESTORE TO UCB ADDRESSC TST (SP)+ ;CLEAN STACKCKJXT: JMP FCXIT ;U  .DSABL LSB;;S*; CHECK FOR FILE ALREADY ACCESSED ON LUN;(*$CKALN::TST (R1) ;FILE ACCESSED ON LUN? BEQ CKJR5 ;IF EQ NO. JMP IEALN ;ERROR;T"; CHECK FOR FILE ACCESSED ON LUN;D*$CKNLN::TST (R1) ;FILE ACCESSED ON LUN? BNE CKJR5 ;IF NE YES JMP IENLN ;ERROR;5<; SET UP REGISTERS FOR UNLOCK AND EXIT TO CONTROL FUNCTION;T .IF DF R$$LKL=$UNLXT::TST (R4)+ ;SKIP FIRST WORD OF "ADDRESS DOUBLEWORD"  MOV R0,R5 ;SETUP UCB POINTER CALL FCXP1 ;COPY PARAMETERSA BR CKLCK ; .ENDC;:!; SET ACCESS/DEACCESS INTERLOCK;C;$CKRLK::INC @(SP) ;SET ACCESS/DEACCESS PENDING INTERLOCKI;E ; EXIT POLISH TO FUNCTION EXIT; 7$CKXIT::TST (SP)+ ;REMOVE ADDRESS OF SECOND LUN WORDN% MOV (SP)+,R5 ;RETRIEVE UCB ADDRESSS TST (SP)+ ;ADJUST STACK PTRU! MOV U.VCB(R5),R1 ;GET VCB ADDRL BEQ CKJXT ;BR IF NO VCB;% INC (R1) ;INCR VOLUME TRANS COUNT BR CKJXT ;EXIT POLISHP2$CKPKT::MOV #$FCPKT,R5 ;JOIN COMMON ACP REQUESTSCKJR5: JMP @(R5)+ ;; ;; INCREMENT WINDOW I/O COUNT FOR MOUNTED FILES-11 DEVICES ; ,$CKIWN::MOV @(SP),R0 ;GET CONTENTS OF LUT2+ BIC #1,R0 ;CLEAR LUN INTERLOCK, WINDOW?X BEQ 10$ ;IF EQ NOA( INCB W.IOC(R0) ;BUMP WINDOW I/O COUNT10$: JMP @(R5)+ ;;T-; LOCK HEADER IN MEMORY DURING ACP FUNCTION ;V5$CKLHD::MOV $TKTCB,R0 ;GET CURRENT TASK TCB ADDRESSV. MOV T.ATT(R0),R0 ;GET ATTACHMENT DESCRIPTOR8 INCB A.IOC-A.TCBL(R0) ;BUMP I/O COUNT FOR TASK REGION6 MOV A.PCB-A.TCBL(R0),R0 ;GET ADDRESS OF TASK REGION* INCB P.IOC(R0) ;BUMP REGION'S I/O COUNT+ MOV 10(SP),R0 ;GET ADDRESS OF I/O PACKETU= BISB #200,I.EFN(R0) ;FLAG REQUEST AS A VIRTUAL I/O REQUESTI JMP @(R5)+ ;;M2; SUBROUTINES TO COPY PARAMETERS INTO I/O PACKET;O ; INPUTS:M; FCXR1 - R1 RELOCATION BIAS; R2 DISPLACEMENT BIAS; R3 PARAMETER PTR; R4 I/O PACKET PTRR'; COPIES R1, R2, AND PARAMETERS 2-6O;C; FCXP2 - R3, R4T; COPIES PARAMETERS 2-6B;B; FCXP1 - R3, R4 ; COPIES PARAMETERS 2-6(;B!; OUTPUTS: R3, R4 UPDATED PTR'SP;;-FCXR1: MOV R1,(R4)+ ;INSERT RELOCATION BIAS;) MOV R2,(R4)+ ;INSERT DISPLACEMENT BIASJ  BR FCXP2 ;COPY PARAMETRS 2-6,FCXP1: MOV (R3)+,(R4)+ ;INSERT PARAMETER 1,FCXP2: MOV (R3)+,(R4)+ ;INSERT PARAMETER 2& MOV (R3)+,(R4)+ ;INSERT PARAMETER 3& MOV (R3)+,(R4)+ ;INSERT PARAMETER 4& MOV (R3)+,(R4)+ ;INSERT PARAMETER 5% MOV (R3)+,(R4) ;INSERT PARAMETER 6  RETURNR;-8; SUBROUTINE TO PERFORM ADDRESS CHECK AND MAP TRANSFER;FACHL: .IF DF A$$CNT. MOV KISAR6,-(SP) ;SAVE CURRENT EXEC MAPPING1  MOV $TKTCB,R0 ;GET TCB ADDRESS OF CURRENT TASKJ4  MOV T.ACN(R0),KISAR6 ;MAP TO TAB (OR OTHER BLOCK)  BEQ 10$ ;IF EQ NO BLOCK/  CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TAB ?V  BNE 10$ ;IF NE NOR, ADD #1,@#B.OVLY+2+140000 ;INCREMENT COUNT# ADC @#B.OVLY+140000 ;SECOND HAL00tuuuttt tfDATAFT110$: MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGT .ENDC ; DF A$$CNT .IF DF U$$DAS> CMP I.FCN-I.PRM(R4),#IO.LDO ;IS THIS A D-SPACE LOAD OVERLAY BEQ FACHK ;IF EQ YES8 MOV #$RELUI,-(SP) ;PUSH ADDRESS OF RELOCATION ROUTINE8 MOV #$CKBFI,-(SP) ;AND ADDRESS OF ADDR. CHECK ROUTINE BR FACH1 ;ENTER COMMON CODE .IFTF ; DF U$$DAS !FACHK: ;REFERENCE LABEL"# .IFT ; DF U$$DAS#$8% MOV #$RELOC,-(SP) ;PUSH ADDRESS OF RELOCATION ROUTINE&' .ENDC ; DF U$$DAS(8) MOV #$CKBFR,-(SP) ;AND ADDRESS OF ADDR. CHECK ROUTINE6* CMPB I.FCN+1-I.PRM(R4),#IO.WLB/400 ;WRITE LOGICAL ?+ BEQ FACH1 ;IF EQ YES6, CMPB I.FCN+1-I.PRM(R4),#IO.WVB/400 ;WRITE VIRTUAL ?- BEQ FACH1 ;IF EQ YES0. MOV #$CKBFB,(SP) ;SET READ/WRITE BUFFER CHECK/10FACH1: MOV (R3)+,R0 ;GET ADDRESS OF USER BUFFERN1&2 MOVB U.CTL(R5),R1 ;GET CONTROL BYTE)3 BPL 10$ ;IF PL BYTE ALIGNMENT ALLOWED$&4 BIT #1,R0 ;IS BUFFER BYTE ALIGNED?&5 BNE 30$ ;IF NE YES-ALIGNMENT ERROR;610$: BIC #^C,R1 ;CLEAR ALL BUT LENGTH MODULO BITSC27 BIT R1,(R3) ;DOES LENGTH HAVE CORRECT MODULUS?&8 BNE 30$ ;IF NE NO-ALIGNMENT EERROR.9 MOV (R3),R1 ;GET LENGTH OF BUFFER IN BYTES!: BEQ 40$ ;IF EQ ILLEGAL BUFFERS;.<15$: CALL @(SP)+ ;ADDRESS CHECK USER BUFFER'= BCS 40$ ;IF CS ADDRESS CHECK FAILED >? .IF DF U$$DAS@!A CALLR @(SP)+ ;RELOCATE BUFFERBBC .IFF ; DF U$$DASMD.E CALLR $RELOC ;RELOCATE USER BUFFER ADDRESSFG .ENDC ; DF U$$DASHIJ30$: JMP IEBYT ;C)K40$: JMP IESPC ;ILLEGAL BUFFER ADDRESSTLMN;,IO; ADDRESS CHECK I/O BUFFER AND INCREMENT COUNT IN ATTACHMENT DESCRIPTOREP;Q R .ENABL LSBT+SIOBUF: CALL $ACHCK ;ADDRESS CHECK BUFFERQ%T BCS 10$ ;IF CS ADDR CHECK FAILURE+5UIOBF2: MOV (R2),R1 ;POINT TO PCB OF BUFER (W.BPCB)S1V INCB P.IOC(R1) ;INDICATE I/O THROUGH PARTITION@8W MOV W.BATT(R2),R1 ;POINT TO ATTACHMENT DESC OF BUFFER&X INCB A.IOC(R1) ;INCREMENT I/O COUNTY10$: RETURN ;; Z .DSABL LSB[\ .ENDP IEBYT ;C)K40$: JMP IESPC ;ILLEGAL BUFFER ADDRESSTLMN;,IO; ADDRESS CHECK I/O BUFFER AND INCREMENT COUNT IN ATTACHMENT DESCRIPTOREP;Q R .ENABL LSBT+SIOBUF: CALL $ACHCK ;ADDRESS CHECK BUFFERQ%T BCS 10$ ;IF CS ADDR CHECK FAILURE+5UIOBF2: MOV (R2),R1 ;POINT TO PCB OF BUFER (W.BPCB)S1V INCB P.IOC(R1) ;INDICATE I/O THROUGH PARTITION@8W MOV W.BATT(R2),R1 ;POINT TO ATTACHMENT DESC OF BUFFER&X INCB A.IOC(R1) ;INCREMENT I/O COUNTY10$: RETURN ;; Z .DSABL LSB .TITLE MDSUBI .IDENT /14.01/O;P7; COPYRIGHT (c) 1986 BY DIGITAL EQUIPMENT CORPORATIONL; ALL RIGHTS RESERVED.;A>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;. ; D. N. CUTLER 4-AUG-73N ;O; MODIFIED BY:; "; J. R. KAUFFMAN 3-SEP-86 14.015; JRK332 - ADD SUPPORT FOR DATA CACHE WRITE DEFERSB;RC;RD; I/O RELATED ROUTINESE;:6F; ROUTINES USED BY FILES-11 AND MASS STORAGE DRIVERSG;DH; MACRO LIBRARY CALLSI;J:K .MCALL F11DF$,HDRDF$,HWDDF$,PCBDF$,PKTDF$,SHDDF$,TCBDF$2L F11DF$ ;DEFINE WINDOW AND LOCK BLOCK OFFSETS )M HDRDF$ ;DEFINE TASK HEADER OFFSETS R&N HWDDF$ ;DEFINE HARDWARE REGISTERS3O PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS&P PKTDF$ ;DEFINE I/O PACKET OFFSETS,Q SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS.R TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETSST;+(U; **-$DEATR-DEALLOCATE ATTRIBUTE BLOCKV;SEW; THIS ROUTINE IS CALLED TO DEALLOCATE AN ATTRIBUTE BLOCK ALLOCATED4X; BY QIO PROCESSING OF A USER FILE ATTRIBUTE LIST.Y; Z; INPUTS:D[; "\; R0=ADDRESS OF ATTRIBUTE BLOCK.]; ^; OUTPUTS:_;E=`; ALL I/O COUNTS ASSOCIATED WITH THE BLOCK ARE DECREMENTED. a;-b A-c$DEATR::MOV R0,-(SP) ;SAVE ADDRESS OF BLOCKF,d MOV #6,-(SP) ;SET MAX COUNT OF ATTRIBUTES.e60$: TSTB (R0) ;IS THERE ANOTHER ATTRIBUTE?f BEQ 70$ ;IF EQ NO(g MOV R0,-(SP) ;SAVE POINTER INTO BLOCK/h MOV 2(R0),R0 ;POINT TO ATTACH00uu^utccccMENT DESCRIPTORL$i CALL $DECIO ;DECREMENT I/O COUNT6j MOV (SP)+,R0 ;RESTORE POINTER INTO ATTRIBUTE BLOCK,k ADD #8.,R0 ;POINT TO NEXT ENTRY IN BLOCKl DEC (SP) ;ANY MORE TO GO?:m BNE 60$ ;IF NE YESn70$: TST (SP)+ ;POP COUNT&o MOV (SP)+,R0 ;RESTORE BLOCK POINTER'p MOV #I.ATRL,R1 ;SET COUNT TO RELEASEM-q CALLR $DEACB ;DEALLOCATE BLOCK AND RETURN: r I s;+ ?t; **-$CVLBN-CONVERT LOGICAL BLOCK NUMBER TO DISK PARAMETERS u; Dv; THIS SUBROUTINE WILL CONVERT THE SPECIFIED LOGICAL BLOCK NUMBER ,w; TO A SECTOR/TRACK/CYLINDER ADDRESS. x; y; INPUTS: . z; !{; (SAME AS $BLKCK OUTPUTS) ;|; R0=LOW PART OF LBN }; R2=HIGH PART OF LBN P~; R3=I/O PACKET ADDRESS E; R5=UCB ADDRESS T ; ; OUTPUTS: ; ; R0=SECTOR NUMBER ; R1=TRACK NUMBER ; R2=CYLINDER NUMBER ;- T T%$CVLBN::MOV R0,R1 ;SHUFFLE LOW LBNN MOV R2,R0 ;SHUFFLE HIGH LBNC6 MOVB U.PRM(R5),R2 ;SET DIVISOR TO SECTORS PER TRACK& DIV R2,R0 ;CALCULATE SECTOR NUMBER# MOV R1,-(SP) ;SAVE SECTOR NUMBER  MOV R0,R1 ;SET NEW DIVIDENDF CLR R0 ;CLEAR HIGH BITSO: MOVB U.PRM+1(R5),R2 ;SET DIVISOR TO TRACKS PER CYLINDER+ DIV R2,R0 ;CALCULATE TRACK AND CYLINDER & MOV R0,R2 ;COPY CYLINDER NUMBER * MOV (SP)+,R0 ;RETREIVE SECTOR NUMBER  RETURN ; ;+); **-$BLKCK-LOGICAL BLOCK CHECK ROUTINEO;; **-$BLKC1-LOGICAL BLOCK CHECK ROUTINE (ALTERNATE ENTRY)2I; **-$BLKC2-LOGICAL BLOCK CHECK ROUTINE (ALTERNATE ENTRY FOR QUEUE OPT);VF; THIS ROUTINE IS CALLED BY I/O DEVICE DRIVERS TO CHECK THE STARTINGA; AND ENDING LOGICAL BLOCK NUMBERS OF AN I/O TRANSFER TO A FILEKG; STRUCTURED DEVICE. IF THE RANGE OF BLOCKS IS NOT LEGAL, THEN $IODON2B; IS ENTERED WITH A FINAL STATUS OF "IE.BLK" AND A RETURN TO THED; DRIVER'S INITIATOR ENTRY POINT IS EXECUTED. ELSE A RETURN TO THE; DRIVER IS EXECUTED.$;-F; $BLKC2 RETURNS TO $QOPDN IN $DRQRQ IF THERE IS AN ERROR INSTEAD OF>; THE DRIVER'S INITIATOR ENTRY POINT. THIS ALLOWS THE QUEUE"; OPTIMIZATION CODE TO USE BLKCK;S ; INPUTS: ;I; R1=ADDRESS OF I/O PACKET.K; R5=ADDRESS OF THE UCB.;F ; OUTPUTS:;DB; IF THE CHECK FAILS, THEN $IODON IS ENTERED WITH A FINAL STATUSB; OF "IE.BLK" AND A RETURN TO THE DRIVER'S INITIATOR ENTRY POINT; IS EXECUTED.;ID; IF THE CHECK SUCCEEDS, THEN THE FOLLOWING REGISTERS ARE RETURNED); R0=LOW PART OF LOGICAL BLOCK NUMBER.H1; R1=POINTS TO I.PRM+12 (LOW PART OF USER LBN)T*; R2=HIGH PART OF LOGICAL BLOCK NUMBER.; R3=ADDRESS OF I/O PACKET.;- .ENABL LSBD4$BLKC2::MOV #1,-(SP) ;FLAG THIS AS THE BLKC2 ENTRY BR 4$ ;CONTINUE 1$BLKCK::CLR -(SP) ;FLAG THIS AS A NORMAL ENTRYI,4$: MOV R1,R3 ;SAVE ADDRESS OF I/O PACKET0 ADD #I.PRM+11,R1 ;POINT PAST HIGH PART OF LBN! CLRB (R1)+ ;CLEAR EXCESS BYTET& BR BLKC3 ;SKIP THE ALTERNATE ENTRY1$BLKC1::CLR -(SP) ;FLAG THIS AS A NORMAL ENTRYR*BLKC3: MOV (R1),R0 ;GET LOW PART OF LBN% MOV -(R1),R2 ;GET HIGH PART OF LBNM9 MOV I.PRM+4(R3),-(SP) ;GET NUMBER OF BYTES TO TRANSFER% ADD #777,(SP) ;ROUND TO NEXT BLOCK)5 ROR (SP) ;CALCULATE NUMBER OF BLOCKS IN HIGH BYTE CLRB (SP) ;CLEAR EXCESS BYTE4 SWAB (SP) ;CALCULATE NUMBER OF BLOCK IN TRANSFER3 ADD (SP)+,R0 ;CALCULATE HIGHEST BLOCK NUMBER + 1L ADCB R2 ;)' BCS 20$ ;IF CS ILLEGAL BLOCK NUMBERP- CMPB R2,U.CW2(R5) ;HIGH PART OF LBN LEGAL?G BHI 20$ ;IF HI NOR BLO 10$ ;IF LO YES+ CMP R0,U.CW3(R5) ;LOW PART OF LBN LEGAL?G BHI 20$ ;IF HI NOI.10$: MOV (R1)+,R2 ;RETRIEVE HIGH PART OF LBN) MOV (R1),R0 ;RETRIEVE LOW PART OF LBN TST (SP)+ ;CLEAN THE STACK RETURN ;H&20$: TST (SP)+ ;TEST THE ENTRY FLAG- BEQ 30$ ;RETURN TO THE DRIVER'S INITIATORR/ TST (SP)+ ;REMOVE DRIVERS EXTRA STACK ENTRYN8 MOV #$QOPDN,(SP) ;SETUP FOR QUEUE OPTIMIZATION RETURN+ MOV #IE.BLK&377,R0 ;SET00uuuttt tfDATA FINAL I/O STATUSF' CALLR $IOFIN ;AND FINISH UP THE I/OB.30$: MOV (R5),R0 ;GET ADDRESS OF DEVICE DCB; MOV @D.DSP(R0),(SP) ;REPLACE RETURN ADDRESS TO INITIATOR + MOV #IE.BLK&377,R0 ;SET FINAL I/O STATUSR$ JMP $IOALT ;AND COMPLETE THE I/O .DSABL LSB;+?; **-$SHFND-FIND SHADOW RECORDING PACKET ON UMB ML NODE LIST. J; **-$SHFN1-FIND SHADOW RECORDING PACKET ON UMB ML NODE LIST (ALT ENTRY);M@; THIS ROUTINE WILL SEARCH THE LIST WHOSE ROOT IS AT M.LHD FOR?; AN ML NODE THAT EITHER POINTS TO OR CONTAINS THE I/O PACKET ; SPECIFIED AS INPUT.,;G ; INPUTS: ;E.; R3=I/O PACKET ADDRESS FOR WHICH TO SEARCH.; R5=UCB ADDRESS.;# ; OUTPUTS:;F%; C=0 (SUCCESS -- FOUND I/O PACKET)O;E; R2=OTHER I/O PACKET.; R4=ML NODE ADDRESS.;S3; C=1 (FAILURE -- NO PACKET OR DISK NOT SHADOWED)$;-; R2,R4 DESTROYED.A;O"; ALL OTHER REGISTERS PRESERVED.;- I .IF DF S$$HDW .ENABL LSBT@$SHFND::BIT #DV.MSD,U.CW1(R5) ;IS THIS A MASS STORAGE DEVICE?1 BEQ 30$ ;IF EQ NO -- CAN'T SHADOW THIS DEVICEU8$SHFN1::BIT #DV.SQD,U.CW1(R5) ;COULD IT BE A MAGTAPE?& BNE 30$ ;IF NE YES -- CAN'T SHADOW ;A; THE ABOVE STATEMENTS DEFINE THOSE DEVICES WHICH HAVE THE CELLT>; U.UMB IN THEIR UCB'S. NOW SEE IF U.UMB IS NON-ZERO, WHICH2; MEANS THE DEVICE IS CURRENTLY SHADOW RECORDED. ;  $  MOV U.UMB(R5),R4 ;GET UMB ADDRESS1  BEQ 30$ ;IF EQ NO UMB, THEREFORE NOT SHADOWED ;:E; SHADOW RECORDING IS ENABLED ON THIS DISK. NOW SEE IF THE PACKET F; SPECIFIED IS FROM THE REPLACEMENT CONTROL TASK AND IF IT IS, SKIP ; OVER IT.;?5 CMP $RCTPT,I.TCB(R3) ;IS THIS I/O PACKET FOR RCT?H BEQ 30$ ;IF EQ YES, EXIT; K; THE SPECIFIED PACKET IS NOT FROM THE REPLACEMENT CONTROL TASK. NOW SEE ,7; IF THE PACKET SPECIFIED IS IN THE LIST OFF THE UMB..;3 ADD #M.LHD+ML.PKT,R4 ;START SCAN AT PROPER PLACE  Q110$: MOV ML.LNK-ML.PKT(R4),R4 ;GET NEXT ML NODED BEQ 30$ ;IF EQ NONE LEFT0  MOV ML.PRI(R4),R2 ;GET PRIMARY PACKET ADDRESS(! CMP R2,R3 ;IS THIS THE INPUT PACKET?" BEQ 20$ ;IF EQ YES4# ADD #ML.PKT,R4 ;POINT TO SECONDARY PACKET IN NODE,$ CMP R4,R3 ;IS OURS THE SECONDARY PACKET?,% BNE 10$ ;IF NE NO -- GO OFF TO TRY AGAIN7& SUB #ML.PKT,R4 ;MOVE BACK TO MAKE R4=ADDRESS ML NODEE ' BR 25$ *(20$: MOV R4,R2 ;COPY I/O PACKET ADDRESS,) ADD #ML.PKT,R2 ;POINT TO SECONDARY PACKET*25$: CLC ;SHOW SUCCESS + RETURNR,30$: SEC ;SHOW FAILURE - RETURNQ . .DSABL LSBM/ .0;+81; **-$DLNK-DELINK AN ML NODE FROM THE LIST IN THE UMB.2;P@3; THIS ROUTINE WILL DELINK THE SPECIFIED ML NODE FROM THE LIST%4; OF ML NODES IN THE SPECIFIED UMB.I5;S 6; INPUTS:Y7;E8; R3=I/O PACKET ADDRESS.9; R4=ML NODE.A:; ;; OUTPUTS:<;V$=; NODE SPECIFED IN R4 IS DELINKED.>;5?; REGISTERS R2,R3 DESTROYED.@;-A3B$DLNK:: MOV I.UCB(R3),R3 ;GET UCB ADDRESS FOR UMB*C MOV R3,-(SP) ;SAVE UCB ADDRESS ON STACK-D MOV U.UMB(R3),R3 ;GET UMB ADDRESS FROM UCBM#E ADD #M.LHD,R3 ;POINT TO LISTHEADM!F10$: MOV R3,R2 ;SAVE LAST NODEG MOV (R3),R3 ;GET NEXT NODEH BNE 20$ ;IF NE THERE IS ONEI(I BPT ;DEBUGGING BPT -- CAN'T DELINK J ;NODE NOT FOUND#K20$: CMP R3,R4 ;IS THIS THE ONE?4"L BNE 10$ ;IF NE NO -- TRY AGAIN!M MOV (R3),(R2) ;DELINK THE NODEE%N BNE 30$ ;IF EQ LIST NOT YET EMPTY.O -P;DQ; THE LIST IS EMPTY. SEE IF WE ARE SUPPOSED TO DEALLOCATE THE UMB.R; S D%T MOV (SP),R3 ;GET UCB ADDRESS BACKT$U MOV U.UMB(R3),R2 ;GET UMB ADDRESS9V BIT #MS.MDA,M.STS(R2) ;IS UMB MARKED FOR DEALLOCATION?!W BEQ 30$ ;IF EQ NO -- EXIT NOWBX $Y; EZ; UMB IS MARKED FOR DEALLOCATION. WE WILL NOW RELEASE THE STORAGE, .[; AND REMOVE THE TWO POINTERS FROM THE UCBS.\;B] $%^ MOV M.UCBS(R2),R3 ;GET PRIMARY UCBR#_ CLR U.UMB(R3) ;CLEAR PRIMARY UCB )` MOV M.UCBS+2(R2),R3 ;GET SECONDARY UCB %a CLR U.UMB(R3) ;CLEAR SECONDARY UCBOb MOV R0,-(SP) ;SAVE STATUSc MOV R1,-(SP) ;SAVE R1d00uu^utcccc De;B8f; WE MUST DELINK THE UMB FROM THE SYSTEM LIST OF UMB'Sg;Sh ;$i MOV #$SHUMB,R0 ;GET START OF LIST/j25$: MOV R0,R1 ;MAKE CURRENT THE NEW OLD PTRM$k MOV (R1),R0 ;GET NEW CURRENT PTRl Rm En .IF DF R$$DERo "p BNE 27$ ;IF NE NOT END OF LIST%q BPT ;OOPPS -- CNT'T FIND IN LISTEr27$: ;REFERENCE LABELs ;t .ENDCu Cv  w CMP R0,R2 ;IS THIS THE NODE?x BNE 25$ ;IF NE NO)+y MOV (R2),(R1) ;DELINK NODE FROM UMB LIST *z MOV #M.LGH,R1 ;SET LENGTH TO DEALLOCATE!{ MOV R2,R0 ;SET ADDRESS OF UMBH| CALL $DEACB ;DEALLOCATE UMB;} MOV (SP)+,R1 ;RESTORE R1T~ MOV (SP)+,R0 ;RESTORE R0M/30$: TST (SP)+ ;CLEAN UCB ADDRESS FROM STACKT  RETURNT ;+1; **-$SHSAV-SAVE CURRENT STATUS IN THE ML NODE.T;O@; THIS ROUTINE WILL SAVE R0 AND R1 IN THE CORRECT PLACE IN THE?; CURRENT I/O PACKET. IT WILL ALSO INCREMENT THE COUNT OF I/ON&; PACKETS FINISHED FOR THIS ML NODE.;) ; INPUTS: ;U; R0=FIRST STATUS WORD.;; R1=SECOND STATUS WORD.; R3=I/O PACKET ADDRESS.; R4=ML NODE ADDRESS.A;T ; OUTPUTS:;+:; COUNT OF FINISHED I/O PACKETS FOR THIS ML NODE IS ONE ); GREATER. STATUS SAVED IN I/O PACKET.T;; ALL REGISTERS PRESERVED.;- A3$SHSAV::INCB ML.DNC(R4) ;SHOW ONE PACKET FINISHEDE MOV R0,I.R0(R3) ;SAVE STATUSN MOV R1,I.R1(R3) ;SAVE STATUSW  RETURNC T;+F; **-$CKLBN-DETERMINE IF LBN RANGE IN AN ML NODE IS BELOW THE FENCE.;U<; THIS ROUTINE WILL DETERMINE IF A RANGE OF LOGICAL BLOCKS:; SPECIFIED IN AN ML NODE IS BELOW THE FENCE IN THE UMB.;T ; INPUTS: ; ; R4=ML NODE ADDRESS.O; R5=UMB ADDRESS. ; ; OUTPUTS:;V;; C=0 IF THE LBN RANGE IN THE ML NODE IF BELOW THE FENCE.;- S$CKLBN::MOV R0,-(SP) ;SAVE R0K MOV R1,-(SP) ;SAVE R1+ MOVB ML.LBN(R4),R0 ;GET HIGH BYTE OF LBNE, MOV ML.PKT+I.PRM+4(R4),R1 ;GET BYTE COUNT' ADD #777,R1 ;ROUND UP TO NEXT BLOCK  ROR R1 ;CONVERT TO WORDS  CLRB R1 ;CLEAR RESIDUAL BITS. SWAB R1 ;SWAP NUMBER OF BLOCKS TO LOW BYTE6 ADD ML.LBN+2(R4),R1 ;CALCALATE LAST LBN IN TRANSFER  ADC R0 ; CMPB M.LBN(R5),R0 ;OVERLAP?4 BNE 100$ ;IF LO CARRY IS SET, IF HI CARRY IS CLR. CMP M.LBN+2(R5),R1 ;SET UP CONDITION CODES 100$: MOV (SP)+,R1 ;RESTORE R1 MOV (SP)+,R0 ;RESTORE R0  RETURN ;R  .ENDC ; DF S$$HDW  K;+%; **-$MPPKT-MAP I/O PACKET FUNCTION,;RP; THIS ROUTINE IS CALLED TO MAP A READ/WRITE VIRTUAL FUNCTION IN AN I/O PACKETR; TO A READ/WRITE LOGICAL FUNCTION. IF THE CURRENT WINDOW DOES NOT MAP THE VIRTUR; FUNCTION, THEN A FAILURE INDICATION IS RETURNED. ELSE IF THE WINDOW COMPLETELYQ; MAPS THE VIRTUAL FUNCTION, THEN THE LOGICAL BLOCK NUMBER IS STORED IN THE I/OOR; PACKET AND THE READ/WRITE VIRTUAL FUNCTION IS CONVERTED TO ITS LOGICAL COUNTERF; PART. ELSE THE PARTIAL MAPPING RESULTS ARE RETURNED TO THE CALLER.;T ; INPUTS:;!; R1=ADDRESS OF THE I/O PACKET.E; R5=UCB ADDRESS OF DEVICE. ;A ; OUTPUTS:;/; C=1 IF MAPPING FAILURE.E"; C=0 IF MAPPING WAS SUCCESSFUL.; IF R0 EQ 0, THENA ; I.FCN+1(R1)=IO.WLB/IO.RLB.+; I.PRM+10(R1)=HIGH PART OF MAPPED LBN.R+; I.PRM+12(R1)=LOW PART OF MAPPED LBN..I ; ELSE %; R0=NUMBER OF BLOCKS NOT MAPPED. !; R2=HIGH PART OF MAPPED LBN.S ; R3=LOW PART OF MAPPED LBN.;R ; R1 IS PRESERVED ACROSS CALL.;-  TA$MPPKT::MOV I.LN2(R1),R0 ; GET IMAGE OF LUT2 OR ADDRESS OF LUT2B BIT #1,R0 ; ADDRESS? BNE 5$ ; IF NE NO .IF DF X$$HDR* MOV KISAR6,-(SP) ; SAVE CURRENT MAPPING% MOV I.TCB(R1),R2 ; GET TCB ADDRESSW4 MOV T.PCB(R2),R2 ; GET PCB ADDRESS OF TASK REGION6 MOV P.REL(R2),KISAR6 ; ASSUME WE NEED TO MAP HEADER .IFTF& MOV (R0),R0 ; GET CONTENTS OF LUT2 .IFTP% MOV (SP)+,KISAR6 ; RESTORE MAPPING .ENDC+5$: BIC #1,R0 ; CLEAR POSSIBLE INTERLOCKM! MOV R0,$IOTMP ; SAVE FOR LATERO) MOV R1,-(SP) ; SAVE I/O PACKET ADDRESS / MOV I.PRM+12(00uuuttt tfDATAR1),R3 ; PICKUP LOW PART OF VBN$0 MOV I.PRM+10(R1),R2 ; PICKUP HIGH PART OF VBN: MOV I.PRM+4(R1),R0 ; PICKUP LENGTH OF TRANSFER IN BYTES+ MOV $IOTMP,R1 ; SET WINDOW BLOCK ADDRESSP) CALL $MPVBN ;MAP VIRTUAL BLOCK NUMBERD, MOV (SP)+,R1 ;RETRIEVE I/O PACKET ADDRESS" BCS 20$ ;IF CS MAPPING FAILURE& TST R0 ;REQUEST COMPLETELY MAPPED? BNE 20$ ;IF NE NOI- MOVB R2,I.PRM+10(R1) ;SET HIGH PART OF LBN,+ MOV R3,I.PRM+12(R1) ;SET LOW PART OF LBNA) MOV #IO.RLB,-(SP) ;ASSUME READ REQUEST,9 CMPB #IO.WVB/256.,I.FCN+1(R1) ;WRITE VIRTUAL FUNCTION?U BNE 10$ ;IF NE NOM' MOV #IO.WLC,(SP) ;ASSUME WRITE CHECKS; ASSUME WI.WCK,100000) TST @$IOTMP ;DATA CHECKING REQUESTED?M BMI 10$ ;IF MI YES/  CLRB (SP) ;DEMOTE TO WRITE LOGICAL (IO.WLB)D1 10$: MOV (SP)+,I.FCN(R1) ;SET NEW FUNCTION CODE (  MOV R1,R3 ;SAVE I/O PACKET ADDRESS (  MOV I.PRM(R3),R1 ;GET RELOCATION BIAS/  MOV I.PRM+2(R3),R2 ;GET DISPLACEMENT ADDRESS / CALL $MPPHY ;MAP TO 18 BIT PHYSICAL ADDRESSE8 MOV R1,I.PRM(R3) ;INSERT 18 BIT PHYSICAL ADDRESS BACK& MOV R2,I.PRM+2(R3) ;INTO I/O PACKET) MOV R3,R1 ;RESTORE I/O PACKET ADDRESSU" CLC ;MAKE SURE CARRY IS CLEAR20$: RETURN ; ;+&; **-$MPVBN-MAP VIRTUAL BLOCK NUMBER;EQ; THIS ROUTINE IS CALLED TO MAP A VIRTUAL BLOCK NUMBER (VBN) TO A LOGICAL BLOCK3L; NUMBER (LBN) VIA A WINDOW BLOCK THAT CONTAINS A SET OF MAPPING POINTERS.;M ; INPUTS:T;L7; R0=NUMBER OF CONSECUTIVE BYTES THAT MUST BE MAPPED. #; R1=ADDRESS OF THE WINDOW BLOCK. ; R2=HIGH PART OF VBN. ; R3=LOW PART OF VBN. !; "; OUTPUTS:#;R1$; C=1 IF VBN CANNOT BE MAPPED VIA WINDOW BLOCK.S*%; C=0 IF VBN SUCCESSFULLY MAPPED TO LBN."&; PARTIAL MAPPING IS A SUCCESS."'; R0=NUMBER OF UNMAPPED BLOCKS.(; R2=HIGH PART OF LBN. ); R3=LOW PART OF LBN.*; R4 & R5 PRESERVED.+;)9,; IF DATA CACHING IS SUPPORTED, THE FOLLOWING RETRIEVAL./-; INFORMATION IS PROVIDED VIA CELLS IN SYSCM:E.;E7/; $DCCEL - CURRENT EXTENT LENGTH (IF SUCCESSFUL MAP)W.0; (0 INDICATES INFORMATION NOT AVAILABLE)-1; $DCCEB - CURRENT EXTENT BASE LBN (DITTO) /2; $DCNEL - NEXT EXTENT LENGTH (IF AVAILABLE)=-3; (0 INDICATES INFORMATION NOT AVAILABLE)I*4; $DCNEB - NEXT EXTENT BASE LBN (DITTO)24; $DCSTS - STATUS INFORMATION FROM WINDOW BLOCK5; 6;-7-8$MPVBN::SAVNR ;SAVE NONVOLATILE REGISTERSA9: : .IF DF D$$CHE ;JRK332: ;JRK332SD: MOVB W.STS(R1),$DCSTS ;GET INFORMATION FROM WINDOW BLOCK ;JRK332: ;JRK332P": .ENDC ; DF D$$CHE ;JRK332: ;JRK332$; .IF DF P$$WND<(= MOV KISAR5,R5 ;SAVE SYSTEM APR5 IN R5<> MOV W.MAP(R1),KISAR5 ;POINT APR5 TO SECONDARY POOL WINDOW? BEQ 20$ ;BRANCH ON NO MAPT*@ MOV #120000,R1 ;SET R1 TO MAP THRU APR5A*B .ENDC ;END SECONDARY POOL CONDITIONALC,D .IF DF D$$CHE ;DISK DATA CACHING SUPPORTE.F CLR $DCCEL ;ASSUME THAT THIS MAP WILL FAILGH .IFTF ;D$$CHEI4J ADD #777,R0 ;ROUND BYTES TO NEXT 256. WORD BLOCKK ROR R0 ;CONVERT TO WORDS L CLRB R0 ;CLEAR RESIDUAL BITS.M SWAB R0 ;SWAP NUMBER OF BLOCKS TO LOW BYTE2N MOVB W.VBN(R1),R4 ;GET HIGH ORDER 7 BITS OF VBN)O SUB R4,R2 ;NORMALIZE HIGH PART OF VBN-P SUB W.VBN+2(R1),R3 ;NORMALIZE LOW PART TOO Q SBC R2M&R BLO 20$ ;BRANCH ON MAPPING FAILURE/S MOVB (R1),R4 ;GET NUMBER OF ACTIVE POINTERS )T BEQ 20$ ;BRANCH IF NONE - MAP FAILURES/U ADD #W.RTRV,R1 ;POINT R1 TO MAPPING POINTERSC2V10$: SUB (R1)+,R3 ;SUBTRACT EXTENT SIZE FROM VBNW SBC R2 ;ALSO HIGH VBNR)X BLO 30$ ;BRANCH IF VBN IN THIS EXTENTS&Y CMP (R1)+,(R1)+ ;INCREMENT PAST LBN.Z SOB R4,10$ ;DECRIMENT POINTER COUNT & LOOP&[20$: SEC ;INDICATE MAPPING FAILURE)\ BR 70$ ;RETURN WITH CARRY SET - ERRORR5]30$: ADD R3,R0 ;TEST FOR ALL BLOCKS IN THIS EXTENTN1^ BGT 40$ ;BRANCH IF NOT - ONLY PARTIAL MAPPINGC%_ CLR R0 ;INDICATE COMPLETE MAPPINGN/`40$: ADD -2(R1),R3 ;R3 = OFFSET WITHIN EXTENTO*a ADC R2 ;R2 = HIGH OFFSET (SHOULD BE 0))b ADD (R1)+,R2 ;ADD THE BIGINNING00uu^utcccc LBN OFO,c ADD (R1)+,R3 ;THE EXTENT TO THE OFFSET TOd ADC R2 ;GET THE DESIRED LBNR;e;NOTE: AT THIS POINT CARRY IS CLEAR FOR SUCCESSFUL RETURNPfg .IFT ;D$$CHEEh0i SUB #6,R1 ;BACKTRACK TO THE BEGINNING OF RTV=j MOV (R1)+,$DCCEL ;ASSUMPTION INCORRECT, SET CURRENT LENGTH0k MOV (R1)+,$DCCEB ;SET CURRENT EXTENT BASE LBN#l MOV (R1)+,$DCCEB+2 ;(DOUBLEWORD)N/m CLR $DCNEL ;ASSUME NONEXISTENCE OF NEXT RTVN#n DEC R4 ;OUR ASSUMPTION CORRECT?U.o BEQ 50$ ;YES IF EQ; DON'T FILL IN NEXT RTV0p MOV (R1)+,$DCNEL ;ELSE SET NEXT EXTENT LENGTH-q MOV (R1)+,$DCNEB ;SET NEXT EXTENT BASE LBN #r MOV (R1)+,$DCNEB+2 ;(DOUBLEWORD)F=s;NOTE: CC BY 'CLR'S ABOVE, PRESERVED THROUGH HERE AS NEEDEDKt50$:uv .ENDC ;D$$CHEwx70$:yz{ .IF DF P$$WND|%} MOV R5,KISAR5 ;RESTORE SYSTEM APR5T~* .ENDC ;END SECONDARY POOL CONDITIONAL RETURN ;RETURN ;+%; **-$LCKPR-LOCK PROCESSING ROUTINEU;UF; THIS ROUTINE FIRST DETERMINES IF A FILE I/O REQUEST IS TO A SHAREDD; FILE. IF SO, IT DETERMINES IF THE REQUEST IS AN UNLOCK QIO OR AF; VIRTUAL BLOCK I/O REQUEST. IT THEN EITHER PERFORMS THE UNLOCK QIO(; OR THE LOCK PROCESSING RESPECTIVELY.;E ; INPUTS:;.(; R1=I/O PACKET ADDRESS OF THE REQUEST;$ ; OUTPUTS:;,+; C=0 IF NO LOCK PROCESSING WAS REQUIRED.;;E@; C=1 IF AN UNLOCK WAS PERFORMED OR AN ERROR CONDITION OCCURED ; DURING THE LOCK PROCESSING.; R0=I/O STATUS;I; R1 IS PRESERVED.;- .IF DF R$$LKL2$LCKPR::MOV @I.LN2(R1),R3 ;POINT TO WINDOW BLOCK" BIC #1,R3 ;CLEAR INTERLOCK BIT2 MOV #IE.ULK&377,R0 ;SET FOR UNLOCK ERROR STATUS6 MOV W.LKL(R3),R2 ;POINT TO FIRST ENTRY IN LOCK LIST  BEQ 50$ ;IF EQ THERE IS NONE;TE; AT THIS POINT WE KNOW THAT BLOCK LOCKING IS ENABLED FOR THE FILE. ;RF; THE TYPE OF LOCK REQUESTED IS EITHER SHARED OR EXCLUSIVE DEPENDING1; ON THE TYPE OF ACCESSOR AND THE I/O FUNCTION. ;S1; IF REQUEST IS FROM A READER THEN I.FCN(R1) ISD#; IO.RVB TO READ WITH SHARED LOCK).; IO.ULK TO UNLOCK ANY OR ALL EXISTING LOCKS:; IO.ULK!IQ.LCK TO REQUEST A SHARED LOCK WITHOUT ANY I/O;S5; IF THE REQUEST IS FROM A WRITER THEN I.FCN(R1) IST); IO.RVB TO READ WITH AN EXCLUSIVE LOCKT,; IO.RVB!IQ.LCK TO READ WITH A SHARED LOCK'; IO.WVB TO WRITE WITH EXCLUSIVE LOCK .; IO.ULK TO UNLOCK ANY OR ALL EXISTING LOCKS9; IO.ULK!IQ.LCK TO REQUEST A EXCLUSIVE LOCK WITHOUT I/OC;  SAVNR ;SAVE R4 AND R55 MOV I.PRM+4(R1),R4 ;PICK UP BYTE COUNT FOR REQUESTR) ADD #777,R4 ;ROUND TO NEXT DISK BLOCKX% ROR R4 ;CONVERT TO SIZE IN BLOCKSE  CLRB R4 ;K  SWAB R4 ;O< CMPB I.FCN+1(R1),#IO.ULK/256. ;IS THIS AN UNLOCK REQUEST? BNE 100$ ;IF NE NO; ASSUME IQ.LCK,200, TSTB I.FCN(R1) ;LOCK WITHOUT I/O REQUEST? BPL 5$ ;IF PL NO! CALL 100$ ;DO LOCK PROCESSINGO4 DEC @I.PRM+16(R1) ;UNBUSY LOCK BLOCK SINCE NO I/O BR 50$ ;JOIN COMMON CODE5$: ;REFERENCE LABEL;;N; UNLOCK PROCESSING);PI; THIS SECTION OF THE ROUTINE PERFORMS THE UNLOCK PROCESSING. RELEVANT(; REGISTER CONTENTS AT THIS POINT ARE:; ; R0=UNLOCK ERROR STATUS; R1=I/O PACKET ADDRESS.7; R2=ADDRESS OF THE FIRST LOCK BLOCK IN THE LOCK LIST ; R3=POINTER TO CURRENT WINDOW+; R4=BYTE COUNT OF CURRENT UNLOCK REQUESTF;O: MOV I.PRM+12(R1),R5 ;CREATE BLOCK NUMBER SPECIFIED FLAG BISB I.PRM+10(R1),R5 ;.10$: TSTB L.CNT(R2) ;THIS LOCK BLOCK IN USE? BEQ 40$ ;IF EQ NO # TST R5 ;BLOCK NUMBER SPECIFIED?C BEQ 20$ ;IF EQ NOF) CALL 180$ ;EXACT VBN AND COUNT MATCH?  BNE 40$ ;IF NE NOI$20$: CMP L.WI1(R2),R3 ;SAME OWNER? BNE 40$ ;IF NE NOC" CLRB L.CNT(R2) ;UNLOCK THE LOCK0 MOV #IS.SUC&377,R0 ;SET FOR SUCCESSFUL RETURN2 TST R5 ;WAS THIS FOR AN EXPLICIT BLOCK NUMBER? BNE 50$ ;IF NE YES-40$: MOV (R2),R2 ;POINT TO NEXT LOCK BLOCKC BNE 10$ ;IF NE THERE IS ONER;0; NO LOCK LIST EXISTSO;OE; IF THE FUNCTION IS NOT AN UNLOCK FUNCTION, A SIMPL00uuuttt tfDATAE RETURN OCCURSCF; WITH CARRY CLEAR. AN UNLOCK IN THIS CASE IS AN ERROR. (NOTE THAT3; ALL UNLOCK REQUESTS FALL THROUGH HERE AS WELL.)W;=50$: CMPB I.FCN+1(R1),#+1 ;SET CARRY IF UNLOCK#  RETURN ;S;C; LOCK PROCESSINGT;;H; THIS ROUTINE CHECKS FOR ATTEMPTED LOCK OVERLAPS, ATTEMPTS TO SET THEE; NEW LOCK, AND PERFORMS THE IMPLIED UNLOCK. IF A NEW LOCK REQUESTJ; FOR AN EXPLICIT UNLOCKER IS DETECTED WHICH EXACTLY MATCHES AN EXISTINGI; LOCK FOR THAT WINDOW IN BOTH STARTING VBN AND SIZE, THE LOCK BLOCK ISHA; SIMPLY REUSED. RELEVANT REGISTER CONTENTS AT THIS POINT ARE:U;R; R1=I/O PACKET ADDRESS0/; R2=ADDRESS OF FIRST LOCK BLOCK IN LOCK LISTF; R3=ADDRESS OF FILE WINDOW&; R4=BLOCK COUNT FOR CURRENT REQUEST;I;E'; THE FOLLOWING CASES ARE CONSIDERED: ;TB; 1. IF THE REQUEST IS FOR A WINDOW WITH IMPLICIT (NOT EXPLICIT,A; WI.EXL) UNLOCKING AND THERE EXISTS A CURRENT LOCK FOR THATTA; WINDOW WITH I/O STILL IN PROGRESS THEN RETURN A LOCK ERROR ; (IE.LCK).;H>; 2. IF THE REQUEST IS AN EXACT MATCH FOR A LOCK WHICH IS AN=; EXACT MATCH OF WINDOW (OWNER), LBN, AND SIZE AND WHICH C; HAS I/O STILL IN PROGRESS THEN RETURN A LOCK ERROR (IE.LCK).K ;TA ; 3. IF THE REQUEST IS FROM A WINDOW WITH ONLY READ ACCESS OR AD? ; READ REQUEST REQUESTING ONLY SHARED ACCESS FROM A WRITER ? ; ATTEMPT TO GRANT A SHARED LOCK. IF THERE IS NO EXISTINGNA ; LOCK WITH OVERLAP THEN GRANT THE SHARED LOCK. IN THE CASEU%; OF A CONFLICT SEE TABLE BELOW.H; A; 4. IF THE REQUEST IS FROM A WINDOW WITH WRITE ACCESS AND IS AE?; WRITE OR A READ WITHOUT A SHARED LOCK REQUEST ATTEMPT TOSB; GRANT AN EXCLUSIVE LOCK. IF THERE IS NO EXISTING LOCK WITHE; OVERLAP THEN GRANT AN EXCLUSIVE LOCK. IN THE CASE OF CONFLICT ; SEE TABLE BELOW.O;H.; 5. DECISION TABLE FOR RESOLVING CONFLICTS:; ; I/O REQUEST ; LOCK SHARED EXCLUSIVE;L0; EXACT MATCH GRANT SHARED GRANTED EXCLUSIVE; IF NO OTHER CONFLICTW+; (REUSE LOCK BLOCK) (REUSE LOCK BLOCK)D;T/; CONFLICT SHARED GRANT SHARED REJECT IE.LCKW ;T3!; CONFLICT EXCLUSIVE REJECT IE.LCK REJECT IE.LCKX";V#'$100$: CLR R5 ;INIT FREE NODE POINTER0% MOV #IE.LCK&377,-(SP) ;PUSH LOCK ERROR STATUS!& CLR -(SP) ;ASSUME SHARED LOCKE2' BIT #WI.WRV,(R3) ;IS THIS REQUEST FOR A WRITER?*( BEQ 110$ ;IF EQ NO, ALWAYS SHARED LOCK9) CMPB I.FCN+1(R1),#IO.RVB/400 ; IS THIS A READ REQUEST?S-* BNE 105$ ;IF NE NO, ALWAYS EXCLUSIVE LOCKC+; ASSUME IQ.LCK,200L), TSTB I.FCN(R1) ;SHARED LOCK REQUESTED?O- BMI 110$ ;IF MI YESD/.105$: INC (SP) ;SET EXCLUSIVE LOCK REQUESTEDJ-/110$: TSTB L.CNT(R2) ;IS LOCK BLOCK IN USE?L0 BNE 120$ ;IF NE YESN$1 TST R5 ;ALREADY HAVE FREE BLOCK?02 BNE 150$ ;IF NE YES, LOOK AT NEXT LOCK BLOCK"3 BR 130$ ;ELSE CLAIM THIS BLOCK,4120$: MOV L.WI1(R2),R0 ;PICK UP OWNER WORD+5 BIC #1,R0 ;CLEAR BIT FOR NO UNLOCK FLAG/*6 CMP R0,R3 ;LOCK BELONG TO THIS WINDOW?*7 BNE 140$ ;IF NE NO, CHECK FOR OVERLAPS'8 BIT #WI.EXL,(R3) ;EXPLICIT UNLOCKER? 59 BEQ 125$ ;IF EQ NO, SAVE BLOCK FOR IMPLIED UNLOCK #: CALL 180$ ;EXACT VBN AND COUNT?; BNE 140$ ;IF NE NO-<125$: MOV L.WI1(R2),R0 ;RETRIEVE OWNER WORDN%= ROR R0 ;CAN LOCK BLOCK BE REUSED?> BCS 153$ ;IF CS NO0?130$: MOV R2,R5 ;SET TO REUSE THIS LOCK BLOCK$@ BR 150$ ;LOOK AT NEXT LOCK BLOCK>A140$: MOVB L.CNT(R2),R0 ;PICKUP LOCK BLOCK COUNT, EXCLUSIVE?B BMI 141$ ;IF MI YESO%C TST (SP) ;REQUEST EXCLUSIVE LOCK? D BEQ 150$ ;IF NE NOE BR 142$ ;DO CONFLICT CHECK%F141$: NEG R0 ;CONVERT TO MAGNITUDEBAG142$: ADD L.VB1+2(R2),R0 ;CALCULATE NUMBER OF HIGHEST BLOCK + 1B-H MOVB L.VB1(R2),-(SP) ;PUSH HIGH ORDER BYTEEI ADCB (SP) ;PROPAGATE CARRY$J CMPB I.PRM+10(R1),(SP)+ ;OVERLAP?$K BNE 145$ ;IF NE USE BRANCH BELOW L CMP I.PRM+12(R1),R0 ;OVERLAP?M145$: BHIS 150$ ;IF HIS NO+N MOV R4,R0 ;COPY SIZE OF CURRENT REQUESTU<O ADD I.PRM+12(R1),R0 ;CALCULATE NUMBER OF 00uu^utccccHIGHEST BLOCK +10P MOVB I.PRM+10(R1),-(SP) ;PUSH HIGH ORDER BYTEQ ADCB (SP) ;PROPAGATE CARRY!R CMPB L.VB1(R2),(SP)+ ;OVERLAP?$S BNE 146$ ;IF NE USE BRANCH BELOWT CMP L.VB1+2(R2),R0 ;OVERLAP?V)U146$: BLO 153$ ;IF LO YES, (CARRY SET).V150$: MOV (R2),R2 ;POINT TO NEXT LOCK BLOCK W BNE 110$ ;IF NE THERE IS ONEXY; HZ; HACK: IN ORDER TO PHASE IN REAL READER LOCKS WHICH ARE NOT SUPPORTEDG[; BY RMS-11 V1.8, THE FOLLOWING CODE IS INCLUDED TO PREVENT THEM FROM0B\; BEING CREATED. AT SOME FUTURE TIME THIS CODE WILL BE REMOVED.];H^ _ .IF NE 1`a BIT #WI.WRV,(R3) ;READER?b BEQ 170$ ;IF EQ YESLcd .ENDCe/f MOV R5,R0 ;COPY POINTER TO SAVED LOCK BLOCKO)g BNE 160$ ;IF NE ONE WAS IN FACT SAVEDR:h MOV #IE.NOD&377,2(SP) ;ASSUME ALLOCATION FAILURE STATUS(i MOV R1,-(SP) ;SAVE I/O PACKET ADDRESS,j MOV #L.LKSZ,R1 ;PICKUP SIZE OF LOCK BLOCK$k CALL $ALOCB ;ALLOCATE LOCK BLOCK+l MOV (SP)+,R1 ;RESTORE I/O PACKET ADDRESSRm BCC 155$ ;IF CC SUCCESSRn153$: ROL (SP) ;SAVE CARRYS"o BR 170$ ;JOIN COMMON EXIT CODE>p155$: MOV @W.LKL(R3),(R0) ;POINT NEW BLOCK TO SECOND IN LIST:q MOV R0,@W.LKL(R3) ;POINT FIRST BLOCK IN LIST TO NEW ONE)r160$: TST (R0)+ ;ADVANCE TO OWNER WORD 2s MOV R0,I.PRM+16(R1) ;SAVE POINTER TO OWNER WORDt MOV R3,(R0) ;SET OWNER WORD,!u INC (R0)+ ;SET NO UNLOCK FLAGM0v MOVB I.PRM+10(R1),(R0)+ ;SET HIGH PART OF VBNw ROR (SP) ;EXCLUSIVE LOCK?x BCC 165$ ;IF CC NO!y NEG R4 ;SET FOR EXCLUSVE LOCKF&z165$: MOVB R4,(R0)+ ;SET BLOCK COUNT-{ MOV I.PRM+12(R1),(R0) ;SET LOW PART OF VBN$?| MOV #IS.SUC&377,2(SP) ;SET SUCCESS FOR LOCK WITHOUT I/O CASER*}170$: ROR (SP)+ ;SET CARRY, CLEAN STACK$~ MOV (SP)+,R0 ;PICKUP ERROR STATUS  RETURN ;;.8; ROUTINE TO CHECK FOR EXACT VBN AND BLOCK COUNT MATCH;N ; INPUTS:I;0; R1=I/O PACKET ADDRESS; R2=LOCK BLOCK ADDRESSE; R4=BYTE COUNT;R ; OUTPUTS:;O; ALL REGISTERS PRESERVED.;G; Z=1 IF EXACT MATCH.C;; Z=0 IT NO MATCH.;O9180$: CMP L.VB1+2(R2),I.PRM+12(R1) ;MATCH ON LOW ORDER?V BNE 190$ ;IF NE NO4 CMPB L.VB1(R2),I.PRM+10(R1) ;MATCH ON HIGH ORDER? BNE 190$ ;IF NE NO TST R4 ;COUNT SPECIFIED? BEQ 190$ ;IF EQ NO8 MOVB L.CNT(R2),-(SP) ;GET LOCK BLOCK COUNT, NEGATIVE? BPL 185$ ;IF PL NO  NEGB (SP) ;COMPUTE MAGNITUDE3185$: CMPB (SP)+,R4 ;CLEAN STACK, MATCH ON COUNT?190$: RETURN ; .ENDC;+7; **-$RQCNC-REQUEST CONTROLLER FOR CONTROL OPERATIONST;AB; THIS ROUTINE IS CALLED TO REQUEST CONTROL FUNCTION ACCESS TO AF; CONTROLLER THAT SUPPORTS OVERLAPPED CONTROL OPERATIONS. ACCESS ISH; GRANTED TO A SPECIFIC UNIT. IF THE UNIT IS MULTI-ACCESS, CONTROLLERI; ASSIGNMENT IS PERFORMED FOR IT. IF THE CONTROLLER IS BUSY, THE DRIVERH; PROCESS CONTEXT IS STORED IN THE FORK BLOCK, AND IT IS QUEUED ON THEG; CONTROLLER REQUEST QUEUE FOR THAT CONTROLLER. IF THE DRIVER IS NOTG; BUSY, A $CFORK IS PERFORMED TO ENSURE EXECUTION ON THE CORRECT CPU,A+; AND A RETURN TO THE CALLER IS EXECUTED.O;C ; INPUTS:O;; R4=SCB ADDRESS.P&; R5=UCB ADDRESS OF REQUESTING UNIT.!; 0(SP)=DRIVERS RETURN ADDRESS.N+; 2(SP)=RETURN ADDRESS OF DRIVERS CALLER.;S ; OUTPUTS:;E; R4=SCB ADDRESS.R&; R5=UCB ADDRESS OF REQUESTING UNIT.;X; S.FRK+2 IS ALWAYS NON-ZERO.D;SC; ACCESS IS GRANTED TO THE CONTROLLER FOR CONTROL FUNCTIONS ONLY. ;R(; R4 AND R5 ARE PRESERVED ACROSS CALL.;-  .ENABL LSBN .IF DF O$$LAP=$RQCNC::MOV R4,R1 ;GET SCB ADDRESS IN PROPER REG FOR QUEUE$ MOV S.KRB(R4),R0 ;GET KRB ADDRESS/ INC S.FRK+2(R4) ;MAKE SURE THAT S.FRK+2 <> 0N" CMP R5,K.OWN(R0) ;ARE WE OWNER?! BEQ 180$ ;IF EQ YES -- RETURNP .IF DF M$$ACD  CALL ASKRBA .ENDC< BIT #KS.SDX,K.STS(R0) ;SEEKS DURING DATA XFERS SUPPORTED? BEQ 100$ ;IF EQ NO .IF DF M$$PRO7 CALLR $CFORK ;ASSURE EXECUTION ON CORRECT PROCESSOR- .IFFB1 RETURN ;RET00uuuttt tfDATAURN TO DRIVER WITH ACCESS GRANTED; .ENDC0100$: MOV (SP)+,R4 ;SAVE DRIVER RETURN ADDRESS$ TST K.OWN(R0) ;IS CONTROLLER BUSY .IF DF M$$PRO BNE 150$ ;IF NE YES3 CALL $CFORK ;NOT BUSY - TRANSFER TO CORRECT CPU ) MOV U.SCB(R5),R1 ;GET BACK SCB ADDRESS) MOV S.KRB(R1),R0 ;GET BACK KRB ADDRESSG! TST K.OWN(R0) ;IS IT BUSY NOW?  .ENDC/ BEQ 300$ ;IF EQ NO -- GRAB IT FOR OURSELVESU8150$: MOV #$QINSB,-(SP) ;SAVE QUEUEING ROUTINE ADDRESS) BR 350$ ;SAVE DRIVER CONTEXT AND EXIT .ENDC ; DF O$$LAP;+2; **-$RQCND-REQUEXT CONTROLLER FOR DATA TRANSFER;EF; THIS ROUTINE IS CALLED FOR ACCESS TO A CONTROLLER FOR AN OPERATIONG; THAT WILL BUSY OUT THE CONTROLLER, USUALLY A DATA TRANSFER. IF THECH; UNIT IS MULTI-ACCESS, CONTROLLER ASSIGNMENT IS PERFORMED. $CFORK ISC; USED IF NECESSARY TO ENSURE EXECUTION ON THE CORRECT PROCESSOR. ;IA; NOTE: IF THE SCB IS ALREADY IN A CONTROLLER REQUEST QUEUE, WEA<; SKIP THE CALL AND RETURN TO THE CALLER'S CALLER. THIS IS>; BELIEVED TO HAPPEN ONLY ON NON-DEC SUPPLIED DM: TYPE DISKS7; DURING POWERFAIL RECOVERY. NOTE THAT THIS BASICALLYC?; DISMISSES THE DRIVERS POWER RECOVERY CALL. WE HOPE THAT THEC:; DRIVER KNOWS HOW TO RECOVER WHEN ITS OTHER $RQCND CALL; COMPLETES.;R ; INPUTS:S ;O& ; R5=ADDRESS OF REQUESTING UNITS UCB ; 0(SP)=DRIVER RETURN ADDRESST* ; 2(SP)=RETURN ADDRESS OF DRIVERS CALLER ;D ; OUTPUTS:;E; R4=SCB ADDRESS. &; R5=UCB ADDRESS OF REQUESTING UNIT.;E; S.FRK+2 IS ALWAYS NON-ZERO.N; ;N.; DRIVER HAS EXCLUSIVE ACCESS TO CONTROLLER.;C;-+$RQCND::MOV U.SCB(R5),R1 ;GET SCB ADDRESSV .IF DF S2.NRD7 BIT #S2.KRQ,S.ST2(R1) ;KRB ALREADY IN REQUEST QUEUE?S) BNE 370$ ;IF NE YES, IGNORE THIS CALL ! .ENDC ; DF S2.NRD"$# MOV S.KRB(R1),R0 ;GET KRB ADDRESS:$ CMP R5,K.OWN(R0) ;IS REQUESTING UNIT ALREADY THE OWNER?+% BNE 190$ ;IF NE NO, MAKE HIM THE OWNERA'& MOV R1,R4 ;PUT SCB IN CORRECT PLACEG6'180$: INC S.FRK+2(R4) ;ALWAYS EXIT WITH S.FRK+2 <> 0 ( RETURNV)*190$: ;REFERENCE LABELL+,- .IF DF M$$ACD. / CALL ASKRB,01 .ENDC2334 INCB K.IOC(R0) ;COUNT AN I/O REQUEST ON THIS KRBR05 MOV (SP)+,R4 ;PUT DRIVER RETURN ADDRESS IN R4%6 TST K.OWN(R0) ;IS CONTROLLER BUSY?D789 .IF DF M$$PRO:; BNE 340$ ;IF NE YESC.< CALL $CFORK ;TRANSFER TO CORRECT PROCESSOR)= MOV U.SCB(R5),R1 ;GET SCB ADDRESS BACKH)> MOV S.KRB(R1),R0 ;GET KRB ADDRESS BACK ? TST K.OWN(R0) ;IS IT BUSY@A .ENDCBCD BNE 340$ ;IF NE YESEF; G; SET OWNER AND RETURNH;I#J300$: MOV R5,K.OWN(R0) ;SET OWNER"K MOV R4,R0 ;SAVE RETURN ADDRESS/L MOV R1,R4 ;PUT SCB ADDRESS IN CORRECT PLACE 1M INC S.FRK+2(R4) ;ALWAYS EXIT WITH S.FRK+2 <> 0;&N JMP (R0) ;RETURN TO CALLING DRIVERO/P340$: MOV #$QINSF,-(SP) ;SET QUEUEING ADDRESS 6Q BIS #S2.KRQ,S.ST2(R1) ;INDICATE REQUEST IS IN QUEUERS;ECT; STORE DRIVER CONTEXT IN FORK BLOCK AND RETURN TO DRIVERS CALLER)U;IV4W350$: MOV R1,S.FRK+6(R1) ;SAVE SCB IN R4 SAVE AREA-X ADD #S.FRK+6,R1 ;POINT TO R5 SAVE AREA + 20Y MOV R5,-(R1) ;SAVE R5,Z MOV R4,-(R1) ;SAVE DRIVERS RETURN ADDRESS[ CLR -(R1) ;CLEAR LINK WORD,\ ADD #K.CRQ,R0 ;POINT TO QUEUE FOR DRIVERS1]360$: RETURN ;EXIT TO PROPER QUEUEING ROUTINEN^+_370$: TST (SP)+ ;REMOVE CALLER'S ADDRESSE&` RETURN ;RETURN TO CALLER'S CALLERab;+c; **-$RLCN-RELEASE CONTROLLER d; Ge; THIS ROUTINE WILL RELEASE THE CONTROLLER IF THE CALLER IS THE OWNER5Ff; OF THE CONTROLLER. IT WILL ALSO PLACE THE FORK BLOCK FOR THE NEXTDg; DRIVER (IF ANY) IN THE CONTROLLER WAIT QUEUE INTO THE FORK QUEUEHh; AFTER MAKING THAT DRIVER THE OWNER OF THE CONTROLLER. IF THE DRIVER+i; IS NOT THE OWNER, A RETURN IS EXECUTED.Nj;X k; INPUTS:Ql;Nm; R4=SCB ADDRESS.$8n; R5=UCB ADDRESS OF UNIT THAT IS RELEASING CONTROLLER.o;C p; OUTPUTS:q;r; CONTROLLER IS RELEASED.Ns;E+t; ALL REGISTERS EXEC00uu^utccccEPT R3 ARE PRESERVED.Ou;-v+w$RLCN:: MOV S.KRB(R4),R3 ;GET KRB ADDRESSL,x CMP R5,K.OWN(R3) ;IS RELEASING UNIT OWNERy BNE 460$ ;IF NE NO, RETURN/z CLR K.OWN(R3) ;CLEAR OUT OWNER OF CONTROLLER 0{ ADD #K.CRQ,R3 ;POINT TO CONTROLLER RQST QUEUE7| DECB K.IOC-K.CRQ(R3) ;COUNT ONE LESS I/O ON THIS KRBC} MOV (R3),R4 ;GET NEXT EXTRY2~ BEQ 450$ ;IF EQ NO DRIVER IS WAITING -- RETURN' MOV (R4),(R3) ;SET NEW FIRST IN LISTP* BNE 400$ ;IF NE OLD LAST IS STILL LAST+ MOV R3,2(R3) ;SET NEW LAST -- EMPTY LISTDB400$: MOV 4(R4),K.OWN-K.CRQ(R3) ;SET NEW OWNER WITH R5 FROM FORK" CLR (R4) ;CLEAR FORK LINK WORD2 CALL $QFORK ;INSERT FORK BLOCK INTO FORK QUEUE+450$: MOV U.SCB(R5),R4 ;REPLACE SCB IN R4,- BIC #S2.KRQ,S.ST2(R4) ;SCB IS NOT IN QUEUEO460$: RETURN ;  .DSABL LSB ;M.; **-ASKRB-ASSIGN KRB FOR DUAL-ACCESS DEVICE;DF; THIS ROUTINE WILL PROPERLY ASSIGN THE KRB FOR A DUAL-ACCESS DEVICE$; THAT USES KS.UOP SYNCRONIZATION.; ; INPUTS: ;N&; R0=CURRENTLY ASSIGNED KRB ADDRESS.*; R1=SCB ADDRESS FOR DUAL-ACCESS DEVICE.;K ; OUTPUTS:;A%; R0=KRB ADDRESS FOR KRB OF CHOICE.R*; R1=SCB ADDRESS FOR DUAL-ACCESS DEVICE.;5%; REGISTERS R2 AND R3 ARE DESTROYEDQ;2 .IF DF M$$ACD/ASKRB: MOV #S2.MAD!S2.LDS,R2 ;GET STATUS BITS2 BIC S.ST2(R1),R2 ;ARE ALL OF THE ABOVE BITS SET! BNE 30$ ;IF NE NO -- EXIT NOWG1 BITB #S3.DRL,S.ST3(R1) ;IS THE DRIVE RELEASED?S! BEQ 30$ ;IF NE NO -- EXIT NOWU;N"; GET PORT A KRB -- CHECK IT OUT;+ MOV S.KTB(R1),R2 ;GET PORT A KRB ADDRESS* BIC #KP.OFL,R2 ;CLEAR OUT LOW ORDER BIT- MOV S.KTB+2(R1),R3 ;GET PORT B KRB ADDRESSE* BIC #KP.OFL,R3 ;CLEAR OUT LOW ORDER BIT;E&; GET PORT A -- CHECK IT FOR OFFLINE;R, BIT #KS.OFL,K.STS(R2) ;IS THE KRB OFFLINE% BNE 10$ ;IF NE YES, SELECT PORT BS;B"; GET PORT B KRB -- CHECK IT OUT;S( BIT #KS.OFL,K.STS(R3) ;IS KRB ONLINE?$ BNE 20$ ;IF NE NO, SELECT PORT A;E<; BOTH KRB'S ARE ONLINE -- NOW CHECK FOR PORT RELATIVE I/O;R+ MOV S.PKT(R1),R0 ;GET I/O PACKET ADDRESSW4 MOV I.FCN(R0),-(SP) ;GET I/O FUNCTION FROM PACKET3 BIC #7,(SP) ;REMOVE QUALIFIER BITS (SEE $VOLVD), CMP #IO.STC,(SP)+ ;IS IT IO.STC FUNCTION? BEQ 40$ ;IF EQ YES;)@; BOTH KRB'S ARE ONLINE, IT IS NOT PORT RELATIVE I/O FUNCTION.9; NOW CHECK FOR THE PDF AND PORT SPECIFIC OFFLINE BITS.#;L95$: BIT #KP.OFL,S.KTB(R1) ;IS PORT A OFL FROM THIS UNITA' BNE 10$ ;IF NE YES -- SELECT PORT AN8 BIT #KP.OFL,S.KTB+2(R1) ;IS PORT B OFL FROM THIS UNIT' BNE 20$ ;IF NE YES -- SELECT PORT BN;)H; NOW THE PDF BITS (WHICH, FOR NON PORT-SPECIFIC I/O, ARE EQU TO OFL).;L, BIT #KS.PDF,K.STS(R2) ;IS PORT A PDF SET?' BNE 10$ ;IF NE YES -- SELECT PORT BO, BIT #KS.PDF,K.STS(R3) ;IS PORT B PDF SET?' BNE 20$ ;IF NE YES -- SELECT PORT AN;E@; AT THIS POINT, BOTH KRB'S ARE EQUIVALENT FROM THE STANDPOINT?; OF BEING EQUALLY ONLINE, AND THIS WASN'T PORT SPECIFIC I/O.N;BB; NOW WE WILL COMPARE THE KRB'S TO SEE WHICH IS BUSIER. IF THEYB; ARE THE SAME, THEN WE WILL SEE IF ONE IS ATTACHED TO THIS CPU."; IF IT IS, THEN WE WILL USE IT.;. CMPB K.IOC(R2),K.IOC(R3)R" BLO 20$ ;IF LO PORT A IS FREER" BHI 10$ ;IF HI PORT B IS FREER .IF DF M$$PROB BIT @$CPURM,K.URM(R2) ;CAN WE GET TO ONE EASIER THAN THE OTHER?  BNE 20$ ;IF NE YES -- PORT A .ENDC 10$: MOV R3,R2 ;SELECT PORT B(20$: MOV R2,S.KRB(R1) ;SET KRB ADDRESS! MOV R2,R0 ;SHOW KRB OF CHOICEO .IF DF M$$PRO8 MOV K.URM(R0),S.URM(R1) ;SET URM IN FORK BLOCK OF SCB .ENDC730$: BICB #S3.DRL,S.ST3(R1) ;SHOW CONTROLLER ASSIGNEDO  RETURNB;I@; FUNCTION IS IO.STC, SEE IF PORT SPECIFICATION EXISTS. IF IT(; DOES, THEN SWITCH TO SPECIFIED PORT.;;240$: MOVB I.PRM+4(R0),R0 ;GET PORT SPECIFICATION BEQ 5$ ;IF EQ NONE EXISTSC SUB #1,R0 ;IS IT PORT AS BNE00uvuttt tfDATA 10$ ;IF NE NOV  BR 20$ ;IF EQ YESA   .ENDC  ;+$; **-$ECCOR-ECC CORRECTION ROUTINE;OB; THIS ROUTINE WILL TAKE THE 22 BIT REAL STARTING ADDRESS OF THEG; TRANSFER, CALCULATE WHERE THE ECC CORRECTION SHOULD TAKE PLACE, ANDOC; PERFORM THE ACTUAL XOR OPERATION TO CORRECT THE DATA IN MEMORY.T;X ; INPUTS:;O ; R0=BYTES ACTUALLY TRANSFERED2; R1=ECC ERROR POSITION (FROM HARDWARE REGISTER)<; R3=ECC ERROR CORRECTION PATTERN (FROM HARDWARE REGISTER); R4=SCB ADDRESS; R5=UCB ADDRESS; ; OUTPUTS:;; R2=CSR ADDRESS; R3=CONTROLLER INDEXN ;I!; R0, R4, R5 ARE PRESERVED";-#$% .IF DF S$$ECC&('$ECCOR::MOV R4,-(SP) ;SAVE SCB ADDRESS0( MOV R0,-(SP) ;SAVE NUMBER OF BYTES TRANSFERED+) CLR R0 ;CLEAR HIGH ORDER ERROR POSITION +* DEC R1 ;MAKE POSITION INTO 0-7777 RANGE+ DIV #20,R0 ;DIVIDE FOR:D!, ; R0=WORD POSITION (0-377)A- ; R1=BIT POSITION (0-17)R#. MOV R0,-(SP) ;SAVE WORD POSITIONG*/ CLR R2 ;CLEAR HIGH ORDER ERROR PATTERN30 ASHC R1,R2 ;SHIFT PATTERN INTO CORRECT POSITION 11 MOV U.BUF+2(R5),R1 ;GET LOW 16 BITS OF ADDRESSE52 MOVB U.BUF+1(R5),R0 ;GET HIGH BITS OF REAL ADDRESS )3 MOV S.KRB(R4),R4 ;RETREIVE KRB ADDRESS ;4 BIT #KS.MBC,K.STS(R4) ;IS THIS A 22-BIT MASSBUS DEVICE?R5 BNE 10$ ;IF NE YES(6 ADD K.OFF(R4),R4 ;POINT TO UMR AREA+207 MOV -(R4),R1 ;GET LOW 16 BITS OF REAL ADDRESS18 MOVB -(R4),R0 ;GET HIGH 6 BITS OF REAL ADDRESSM2910$: MOV 2(SP),R4 ;GET BYTES ACTUALLY TRANSFERED5: BIC #777,R4 ;GET NUMBER OF FULL BLOCKS TRANSFERED "; BEQ 15$ ;IF EQ THERE WERE NONE)< SUB #512.,R4 ;BACKUP TO BLOCK IN ERRORM:=15$: ADD R4,R1 ;CALCULATE STARTING ADDRESS OF BAD BLOCK> ADC R0 ;...E1? ASHC #10.,R0 ;CALCULATE DISPLACEMENT AND BIASS@ ASHC #-10.,R1 ;...E%A MOV R0,KISAR6 ;SET RELOCATION BIASF9B ADD #140000+2,R1 ;POINT TO HIGH ORDER CORRECTABLE WORDI"C MOV (SP)+,R4 ;GET WORD POSITION4D ADD R4,R1 ;ADD IN ERROR WORD POSITION OFFSET ...&E ADD R4,R1 ;... FOR BYTE ADDRESSING.F MOV (SP),R0 ;GET BYTES ACTUALLY TRANSFEREDG ASR R0 ;CONVERT TO WORDS/H BIC #^C<377>,R0 ;GET HIGHEST WORD TO CORRECTM0I BNE 17$ ;IF NE, IT'S A PARTIAL WORD TRANSFER8J MOV #377,R0 ;SET R0 EQUAL TO VERY LAST WORD IN BLOCK2K17$: CMP R4,R0 ;IS THE OFFSET WITHIN THE LIMIT?L BHI 40$ ;IF HI NOT AT ALLA(M BEQ 30$ ;IF EQ THEN ONLY ONE WORD IS0N20$: XOR R2,(R1) ;CORRECT THE HIGH ORDER WORD/O30$: XOR R3,-(R1) ;CORRECT THE LOW ORDER WORD -P40$: MOV (SP)+,R0 ;RESTORE BYTES TRANSFEREDI$Q MOV (SP)+,R4 ;RESTORE SCB ADDRESS)R MOV S.KRB(R4),R3 ;RETREIVE KRB ADDRESS%S MOV (R3),R2 ;RETREIVE CSR ADDRESS /T MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEX U RETURN ;VVWX .ENDC ; DF S$$ECCYZ[;+,\; **-$CRPAS - COMMON REGISTER PASS ROUTINE]; H^; THIS SUBROUTINE IS USED TO PASS THE CONTENTS OF THE DEVICE REGISTERSG_; BACK TO THE DIAGNOSTIC TASK. ALL REGISTERS ARE PASSED IN THE ORDER('`; IN WHICH THEY APPEAR ON THE UNIBUS.Ma;PHb; NOTE: THIS ROUTINE MAKES USE OF THE ERROR LOGGING ENTRIES S.ROFF ANDc; S.RCNT IN THE SCB.d;R e; INPUTS:f;(g; R1=I/O PACKET ADDRESSSh; R2=CSR ADDRESSi; R4=SCB ADDRESSj; k; OUTPUTS:l; m; R1=DESTROYED.Cn; R0,R2 ARE PRESERVED+o;-pqr .IF DF U$$UMDst$CRPAS::MOV R0,-(SP) ;SAVE R0T/u MOV I.PRM+14(R1),KISAR6 ;SET RELOCATION BIASG3v MOV I.PRM+16(R1),R0 ;GET REGISTER BUFFER ADDRESSR-w MOV R2,-(SP) ;PRESERVE INITIAL CSR ADDRESSP3x MOVB S.ROFF(R4),R2 ;GET OFFSET TO FIRST REGISTERK y ADD (SP),R2 ;ADD CSR ADDRESS6z MOVB S.RCNT(R4),R1 ;GET NUMBER OF REGISTERS TO XFER+{10$: MOV (R2)+,(R0)+ ;TRANSFER A REGISTERR&| SOB R1,10$ ;LOOP FOR ALL REGISTERS}~ .IF DF M$$EXT) MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESS4 BIT #KS.MBC,K.STS(R1) ;IS THIS A MASSBUS DEVICE? BEQ 20$ ;IF EQ NO,' ADD K.OFF(R1),R1 ;POINT TO UCB TABLEM& MOV -(R1),R1 ;RETREIVE RHBAE OFFSET) ADD (SP),R1 ;FORM AN I/O PAGE ADDRESSR" MOV (R1)+,(R0)+ ;TRANSFER RHBAE  MOV (R1),(R0) ;TRAN00u vvvtccccSFER RHCS3 .ENDC(20$: MOV (SP)+,R2 ;RESTORE CSR ADDRESS MOV (SP)+,R0 ;RESTORE R02  RETURNR .ENDC ; DF U$$UMD;+.; **-$VOLVD-PREPROCESS VOLUME VALID FUNCTION;S>; THIS ROUTINE WILL DETERMINE IF THE VOLUME VALID BIT SHOULDA; BE SET OR CLEARED. IF THE FUNCTION IS NOT IO.STC (SET VOLUMER:; VALID) THE VOLUME VALID BIT WILL BE TESTED TO SEE IF A$; TRANSFER FUNCTION CAN BE ISSUED.;SA; NOTE: THE IO.STC SUBFUNCTION CODE VV$CHE SHOULD BE CONSIDEREDR9; AN INVALID FUNCTION (AND CURRENTLY IS) IF RECEIVED BYR=; $VOLVD. THIS SUBFUNCTION CODE IS INTERCEPTED, PROCESSED,.=; AND TERMINATED BY THE CACHER. THESE OPERATIONS WILL ONLY =; REACH THE DRIVER IF DISK DATA CACHING IS NOT SUPPORTED INL=; THE CURRENTLY RUNNING EXECUTIVE, AND THOSE PACKETS SHOULDS%; BE TERMINATED WITH STATUS IE.BAD.E;M ; INPUTS:I; ; R1=I/O PACKET ADDRESSN; I.PRM=ALWAYS ZERO(; I.PRM+2=0 TO RESET VOLUME VALID BIT; 1 TO SET VOLUME VALID BITE1; 2 TO RESET VOLUME VALID AND SPIN DRIVE DOWNE-; 3 TO SET VOLUME VALID AND SPIN DRIVE UPI); 4 FOR "DATA CACHE LOCAL" OPERATIONST:; -1 TO SIZE THE DISK (VOLUME VALID NOT CHANGED),; I.PRM+4=RESERVED FOR PORT SPECIFICATION; R5=UCB ADDRESS;U ; OUTPUTS:;D1; C=0 THEN VOLUME VALID BIT WAS SET OR CLEARED.U5; R0=IS.SUC&377 IF VOLUME VALID FUNCTION (IO.STC). ; R0=-1 IF TRANSFER FUNCTION.); N=1 IF TRANSFER FUNCTION (R0 TESTED); ;; C=1 THEN THE FUNCTION (EITHER TRANSFER OR VOLUME VALID)P; WAS REJECTED.; R0=I/O ERROR CODE.N;-% VV$SET==1 ;SET/CLEAR VOLUME VALIDO$ VV$UNL==2 ;LOAD/UNLOAD THE DRIVE VV$SIZ==-1 ;SIZE THE DRIVE( VV$CHE==4 ;CAC SUBFUNCTION OF IO.STC:$VOLVD::MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION CODE- MOV I.FCN(R1),-(SP) ;GET THE FUNCTION CODE=* BIC #7,(SP) ;REMOVE ANY QUALIFIER BITS, CMP #IO.STC,(SP)+ ;VOLUME VALID FUNCTION? BNE 30$ ;IF NE NOR* MOV I.TCB(R1),R0 ;GET TASKS TCB ADDRESS= BIT #T3.PRV,T.ST3(R0) ;IS THE REQUESTING TASK PRIVILEGED?= BNE 99$ ;IF NE YES2 BITB #US.FOR,U.STS(R5) ;VOLUME MOUNTED FOREIGN?" BEQ 50$ ;IF EQ NO, CAN'T RESET999$: BITB #US.VV,U.STS(R5) ;IS VOLUME VALID ALREADY SET ( BNE 1$ ;IF NE YES, SKIP MOUNTED TEST9 CMP $VERTK,R0 ;REQUESTING TASK THE VERIFICATION TASK ?C- BEQ 1$ ;IF EQ, YES - ALLOW VV TO BE RESETS: BITB #US.MNT,U.STS(R5) ;IS THE DEVICE ALREADY MOUNTED? BEQ 50$ ;IF EQ YES, ERRORS51$: MOV I.PRM+2(R1),R0 ;GET PARAMETER SPECIFICATIONS* BPL 2$ ;IF PL SET/CLEAR OR LOAD/UNLOAD? MOV I.PRM+14(R1),I.PRM+16(R1) ;MOVE REGISTER BUFFER ADDRESS$= MOV I.PRM+12(R1),I.PRM+14(R1) ;TO PROPER PLACE FOR $CRPASM BR 15$ ;SHOW SUCCESS'2$: BIT #VV$SET,R0 ;SET VOLUME VALID? BNE 10$ ;IF NE YES. BIT #^C,R0 ;BAD PARAMETERS? BNE 5$ ;IF NE YESL+ BICB #US.VV,U.STS(R5);CLEAR VOLUME VALID.  BR 15$ ;/5$: MOV #IE.BAD&377,R0 ;ASSUME BAD PARAMETERSS BR 40$ ;EXIT-10$: BISB #US.VV,U.STS(R5);SET VOLUME VALID315$: MOV #IS.SUC&377,R0 ;SHOW SUCCESSFUL FUNCTIONP 20$: CLC ;SHOW GOOD FUNCTION  RETURN ;R130$: MOV #-1,R0 ;ASSUME GOOD TRANSFER FUNCTIONP3 BITB #US.VV,U.STS(R5);HAS VOLUME VALID BEEN SET?  BNE 20$ ;IF NE YES1 MOV #IE.DNR&377,R0 ;ELSE FORCE DRIVE NOT READYV40$: SEC ;SHOW FAILURE  RETURN ;N.50$: MOV #IE.PRI&377,R0 ;PRIVILEGE VIOLATION  BR 40$ ; .ENDOV #IE.BAD&377,R0 ;ASSUME BAD PARAMETERSS BR 40$ ; .TITLE ERROR  .IDENT /11.05/A;T7; COPYRIGHT (C) 1987 BY DIGITAL EQUIPMENT CORPORATIONC; ALL RIGHTS RESERVED.;D>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ;$ ; P. J. BEZEREDI 08-JAN-82 ; ;S-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:C;; S. C. ADAMS ; J. R. KAUFFMAN; J. M. LAWLER;I-; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:F;E"; B. S. MCCARTHY 12-00vvuttt tfDATADEC-86 11.04; *; BM377 -- MOVE ERROR LOGGING TO DR311M;7"; B. S. MCCARTHY 12-DEC-86 11.05;L.; BM385 -- NOW MOVE ERROR LOGGING TO VEC11M;H;D ; ERROR LOGGINGY!;S"#;R$; MACRO LIBRARY CALLSE%; :& .MCALL CLKDF$,EPKDF$,F11DF$,HDRDF$,HWDDF$,PKTDF$,UCBDF$(' EPKDF$ ;DEFINE ERROR PACKET OFFSETS()*;+<+; **-$BMSET-SET THE UNIT'S ACTIVE INTERRUPT BIT IN THE SCB,; =-; THIS COROUTINE RAISES THE PROCESSOR PRIORITY TO SEVEN AND9.; SETS THE INTERRUPT ACTIVE BIT IN THE SCB, RECALLS THE </; CALLER TO START THE FUNCTION AND THEN ALLOWS INTERRUPTS.0;. 1; INPUTS: 2;53; R4=ADDRESS OF THE SCBT4;1 5; OUTPUTS:6; ,7; THE INTERRUPT ACTIVE BIT (S2.ACT) IS SET8;-9):$BMSET::MTPS #PR7 ;LOCK OUT INTERRUPTSF5; BIS #S2.ACT,S.ST2(R4) ;;;SHOW INTERRUPT IS ACTIVET$< CALL @(SP)+ ;;;RECALL THE CALLER= MTPS #0 ;;;ALLOW INTERRUPTSI>BMXIT: RETURN ;EXITH?@;+!A; **-$DTOER-LOG DEVICE TIMEOUTS 8B; **-$DVTMO-LOG DEVICE TIMEOUTS FOR OVERLAPPED DEVICESC;LCD; THIS ROUTINE IS CALLED TO LOG A DEVICE TIMEOUT ERROR CONDITION.BE; IF ENTRY IS AT $DTOER THE CONTROLLER'S INTERRUPT ENABLE BIT IS>F; RESET AND THE PROCESSOR PRIORITY IS DROPPED TO ZERO. IF A<G; DIAGNOSTIC FUNCTION WAS IN PROGRESS, NO ERROR IS LOGGED.H;2 I; INPUTS: J;R:K; R2=ADDRESS OF A BLOCK OF REGISTERS TO LOG (MUST BE THE$L; CSR ADDRESS IF KS.MBC IS SET)M; R4=SCB ADDRESSN; R5=UCB ADDRESSO;E P; OUTPUTS:Q; $R; R0=IE.DNR&377 (DEVICE NOT READY)S; R1=ADDRESS OF I/O PACKET;T; C=0 IF FUNCTION WAS NOT A USER MODE DIAGNOSTIC FUNTION.8U; THE ERROR LOG PACKET IS FILLED AND THE SCB CONTAINS8V; A POINTER TO IT. THE ERROR IN PROGRESS FLAG IS SETW; IN THE SCB.AX; C=1 IF FUNCTION WAS A USER MODE DIAGNOSTIC FUNCTION. IN THIS:Y; CASE ONLY THE INTERRUPT ENABLE BIT IS CLEARED AND THE!Z; PRIORITY IS LOWERED TO ZERO.S[;-\ ] .ENABL LSB41^$DTOER::MOV (R2),$DVSAV ;;;SAVE CONTENTS OF CSR:0_ BIC #100,(R2) ;;;DISABLE THE DEVICE INTERRUPT` MTPS #0 ;;;ALLOW INTERRUPTS a BR 5$ ;A/b$DVTMO::MOV (R2),$DVSAV ;SAVE CONTENTS OF CSRE9c5$: MOV #IE.DNR&377,R0 ;SET DEVICE NOT READY ERROR CODET1d BIC #S2.ACT,S.ST2(R4) ;SET INTERRUPT INACTIVEI:e MOV S.PKT(R4),R1 ;PICK UP THE ADDRESS OF THE I/O PACKET,f SEC ;ASSUME IT IS A DIAGNOSTIC FUNCTION8g BITB #IQ.UMD,I.FCN(R1) ;IS IT A DIAGNOSTIC FUNCTION?h BNE BMXIT ;IF NE YESijk .IF DF E$$LOGlm .IFTF ; DF E$$LOGn@o MOV #$DVTM2,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON5o CALL $MPDCV ;MAP AND CALL CODE IN THIRD ; BM377R"o ;DIRECTIVE COMMON ; BM377q RETURN ;**-1Ers;+ t; **-$DVERR-LOG A DEVICE ERROR1u; **-$DVCER-LOG A DEVICE ERROR (ALTERNATE NAME)Tv;RFw; THIS ROUTINE IS CALLED TO LOG A DEVICE ERROR. AN ERROR LOG PACKETEx; WILL BE ALLOCATED AND THE CONTEXT OF THE CURRENT TRANSFER WILL BE?Iy; SAVED. IF AN ERROR IS ALREADY IN PROGRESS FOR THIS DEVICE, THE ERRORLIz; WILL BE IGNORED. INFORMATION CONCERNING ALL ACTIVE DEVICES WILL ALSO {; BE SAVED.M|;DH}; THE ERROR CODE IS SETUP TO MARK THIS AS A HARD DEVICE ERROR. IF THEF~; OPERATION IS SUCCESSFUL, THE CODE WILL BE CHANGED TO A SOFT DEVICE/; ERROR WHEN THE I/O OPERATION IS TERMINATED.;H ; INPUTS: ;D<; R2=ADDRESS OF THE BLOCK OF REGISTERS TO LOG (MUST BE THE$; CSR ADDRESS IF KS.MBC IS SET); R4=SCB ADDRESS; R5=UCB ADDRESS;A ; OUTPUTS:;F>; IF THIS IS THE FIRST OCCURENCE OF THE ERROR, THE ERROR LOG=; PACKET IS FILED AND THE SCB IS SET TO POINT TO THE PACKET1; ADDRESS AND THE ERROR IN PROGRESS BIT IS SET.V;R&; NOTE: ALL REGISTERS ARE PRESERVED.;- .IFTF$DVERR:: ;LOG DEVICE ERROR$DVCER:: ;LOG DEVICE ERROR .IFT@ MOV #$DVER1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON' BR 10$ ;BRANCH TO COMMON PROCESSINGI;+@; **-$LOGER-LOG AN ERROR LOG PACKET (NO ERROR NEED BE PRESENT);TF; THIS ROUTINE IS CALLED BY DRIVERS THAT WISH TO CREATE AN E00vvvtccccRROR LOGG; PACKET WHEN NO ERROR IS PRESENT, I.E. FOR AN UNSOLICITED INTERRUPT. H; THE PACKET WILL BE CREATED AND THE DRIVER IS RESPONSIBLE FOR FILLING&; IN THE NECESSARY DATA INFORMATION.;E ; INPUTS:C; +; R1=LENGTH OF DATA TO BE LOGGED IN BYTES#:; R4=SCB ADDRESS (IF ZERO THEN NO I/O PACKET IS PRESENT); R5=UCB ADDRESS;N ; OUTPUTS:;0; C=1 IF ERROR CANNOT BE LOGGED FOR ANY REASON; C=0 IF ERROR CAN BE LOGGED0; R1=ADDRESS OF DATA AREA IN ERROR LOG PACKET#; R3=ADDRESS OF ERROR LOG PACKETR; ; R4 AND R5 ARE PRESERVEDT; R0, R2 AND R3 ARE DESTROYEDL/; APR6 MAPPING DESTROYED: KISAR6 MAPS PACKETL;- .IFTF $LOGER:: .IFT@ MOV #$LGER1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON' BR 10$ ;BRANCH TO COMMON PROCESSINGI;+*; **-$FNERL-FINISH ERROR LOGGING PROCESS;C; THIS ROUTINE IS CALLED AT I/O DONE TIME OR WHEN IT IS NECESSARYBA; TO QUEUE AN ERROR LOG PACKET AFTER A SUCCESSFUL RECOVERY OF A=; MID-TRANSFER ERROR.E; ; INPUTS:D; R0=FIRST I/O STATUS WORD,; R2=STARTING AND FINAL ERROR RETRY COUNTS'; R3=ERROR LOG PACKET ADDRESS IF R4=0; R4=SCB ADDRESS OR ZERO; R5=UCB ADDRESS;L ; OUTPUTS:3; THE ERROR PACKET IS QUEUED TO THE ERROR LOGGER.;); THE ERROR IN PROGRESS BIT IS CLEARED. ;N; R1 AND R2 ARE DESTROYED.;- .IFTF*$FNERL:: ;FINISH ERROR LOGGING PROCESS .IFT@ MOV #$FERL1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON' BR 10$ ;BRANCH TO COMMON PROCESSING;+%; **-$CRPKT-CREATE ERROR LOG PACKETA;OI; THIS ROUTINE IS CALLED TO CREATE AN ERROR LOG PACKET, EITHER FROM THESI; SEND MESSAGE DIRECTIVE PROCESSING, OR WITHIN THE EXECUTIVE AS PART OFUF; THE PROCESSING OF A MEMORY ERROR, NONSENSE INTERRUPT, TIME CHANGE,); POWER FAIL RECOVERY, OR DEVICE ERROR.;. ; INPUTS:F;:; R0=PACKET CODE; R1=LENGTH OF DATA SUBPACKET; R2=CONTROL MASK WORD3; R3=BEGINNING ADDRESS OF DATA FOR DATA SUBPACKETN'; R4=TCB ADDRESS (FOR TASK SUBPACKET)8; R5=UCB ADDRESS (FOR DEVICE IDENTIFICATION SUBPACKET); ; OUTPUTS:; ; R0=UNCHANGED/; R1=BEGINNING ADDRESS OF DATA SUBPACKET DATAE; R2=UNCHANGED"; R3=BEGINNING ADDRESS OF PACKET; R4=UNCHANGED; R5=UNCHANGED;R; C=0 IF A PACKET WAS CREATEDL#; C=1 IF A PACKET WAS NOT CREATED/; APR6 MAPPING DESTROYED: KISAR6 MAPS PACKETT;D; OUTPUT PACKET FORMAT:R;S5; +-----------------------------------------------+C'; | RESERVED FOR PACKET LINK WORD |K5; +-----------------------------------------------+P5; | PACKET LENGTH (LENGTH OF REMAINDER OF PACKET) | 5; +-----------------------------------------------+C; | HEADER SUBPACKET |E ; . .;4 ; | |5; +-----------------------------------------------+; | OTHER SUBPACKETS |R ; . . ;P ; | |5 ; +-----------------------------------------------+R ;- .IFTF $CRPKT:: .IFT-@ MOV #$CRPK1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON' BR 10$ ;BRANCH TO COMMON PROCESSING ;+/; **-$CREQU-CREATE AND QUEUE ERROR LOG PACKET-;-E; THIS ROUTINE CREATES AND QUEUES ERROR LOG PACKET. IT USES $CRPKT G; AND $QUPKT. IT'S INPUT IS THE SAME AS THE INPUT TO $CRPKT AND IT'S-D; OUTPUT IS THE SAME AS THAT FROM $QUPKT. IF THE PACKET CANNOT BEF ; CREATED, $QUPKT IS NOT CALLED AND A RETURN IS MADE WITH CARRY SET.!;"; KISAR6 MAPPING IS PRESERVEDF#;-$% .IFTF& '$CREQU::() .IFTO*@+ MOV #$CREQ1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON', BR 10$ ;BRANCH TO COMMON PROCESSINGE-./;+$0; **-$QUPKT-QUEUE ERROR LOG PACKET1;EH2; THIS ROUTINE IS CALLED TO QUEUE AN ERROR LOG PACKET. IF THERE IS NOJ3; OTHER PACKET IN THE QUEUE, THE ERROR LOGGER IS REQUESTED WITH A DELAY.H4; IF THERE IS ANOTHER PACKET ALREADY IN THE QUEUE, THE ERROR LOGGER IS5; REQUESTED IMMEDIATLY..6; 7; INPUTS:M8;G00v"vw)vttt tfDATA/9; R3=POINTER TO PACKET FOR INSERTION IN QUEUE::; ;; OUTPUTS:<;V=; R4 AND R5 ARE PRESERVEDS%>; ALL OTHER REGISTERS ARE DESTROYED ?;-@A .IFTFB C$QUPKT::DE .IFT F@G MOV #$QUPK1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON'H BR 10$ ;BRANCH TO COMMON PROCESSINGOIJKL;+/M; **-$QERMV-REMOVE ENTRY FROM ERROR LOG QUEUE N;AHO; THIS ROUTINE REMOVES AN ENTRY FROM THE ERROR LOG QUEUE AND TRANSFERSP; IT INTO A USER BUFFER.Q; R; INPUTS:SS;T; R4=LENGTH OF USER BUFFERU; R5=ADDRESS OF USER BUFFERV;P W; OUTPUTS:X;AY; R1=LENGTH OF PACKET Z; R4=UNCHANGED[; R5=UNCHANGED\;']; C=0 PACKET WAS REMOVED SUCCESSFULLY =^; C=1 NO PACKET TO REMOVE OR PACKET TOO LONG. IF R1<>0 THE ?_; PACKET WAS TOO LONG, AND R1 CONTAINS THE PACKET LENGTH.+`;-ab .IFTFc d$QERMV::ef .IFT g@h MOV #$QRMV1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMONi10$:5i CALL $MPDCV ;MAP AND CALL CODE IN THIRD ; BM377"i ;DIRECTIVE COMMON ; BM377k ;**-1Bl .IFFmn SECop .IFTFq r RETURNPst .ENDC ;E$$LOGu v .DSABL LSBwxy;+4z; **-$NSIER-UNEXPECTED (NONSENSE) INTERRUPT ERRORS{;V<|; THIS ROUTINE IDENTIFIES THE INTERRUPTING VECTOR AND LOGS}; THE ERROR.~;T ; INPUTS:G;0; @(SP)=BITS 06:04 OF THE UNUSED VECTOR NUMBER0; PS=VECTOR ID (MOD 20) IN CONDITION CODE BITS;E ; OUTPUTS:;:6; AN ERROR LOG PACKET IS ALLOCATED AND QUEUED TO THE; ERROR LOGGER.C;- .IF DF E$$NSI7$NSIER::MFPS -(SP) ;;;SAVE THE VECTOR ID (MODULO 20) .IF DF M$$PRO;S@; THIS INTERRUPT COULD BE THE ONE FROM THE IIST AS PART OF CPU ; STARTUP.;SH; THE CRITERION FOR DETERMINING IS THIS IS A NORMAL NONSENSE INTERRUPTH; AS DISTINCT FROM A CPU STARTUP IS THE STATE OF THE MEMORY MANAGEMENTH; UNIT. IF MAPPING IS ENABLED, THEN THIS IS ASSUMED A NORMAL NONSENSEH; INTERRUPT. IF MAPPING IS NOT ENABLED, THEN A JUMP TO CPU STARTUP IS; PERFORMED.;F% BIT #1,SR0 ;;;IS MAPPING ENABLED?V BNE 5$ ;;;IF NE YES0) CALLR $CPBGN ;;;NO, START UP THIS CPU  .ENDC$5$: INCB $NSI ;;;NSI IN PROGRESS?) BMI 7$ ;;;DON'T ALLOW COUNTER TO WRAP  BNE 10$ ;;;IF NE YES( BIT #ES.LOG,$ERFLA ;;;LOGGING ERRORS? BNE 20$ ;;;IF NE YES#7$: DECB $NSI ;;;RESTORE COUNTERN)10$: CMP (SP)+,(SP)+ ;;;CLEAR THE STACKS RTI ;;;RETURN;NI; THE NONSENSE INTERRUPT HAS NOT INTERRUPTED THE HANDLING OF A PREVIOUSF3; NONSENSE INTERRUPT, SO GO AHEAD AND PROCESS IT.D;:20$: BIC #177760,(SP) ;;;ISOLATE THE VECTOR ID IN THE PS( MOV (SP)+,$VID ;;;SAVE THE VECTOR ID.+ BIS @(SP)+,$VID ;;;ADD IN THE GROUP BIASO( MOV (SP),$OPC ;;;SAVE PREINTERRUPT PC) MOV 2(SP),$OPS ;;;SAVE PREINTERRUPT PS?# CALL $INTSV,PR7 ;;;SWITCH STACKSB* MOV $ERLFK,R4 ;;;GET FORK BLOCK ADDRESS CALL $FORK0 ;;;AND FORK INC $ERRSQ ;COUNT THE ERRORH3 MOV #E$CCPU+<400*E$SINT>,R0 ;GET THE ERROR CODE 0 MOV #3*2,R1 ;THE BUFFER IS 3 WORDS (6 BYTES)5 MOV #SM.HDR!SM.DAT!SM.DAC,R2 ;SET SUBPACKET FLAGS;( MOV #$VID,R3 ;GET ADDRESS OF THE DATA) CALL $CREQU ; CREATE AND QUEUE PACKETS-30$: MOVB #-1,$NSI ;RESET RECURSION COUNTER,  RETURN ;E .ENDC ;E$$NSI .ENDTERRUPT PS?# CALL $INTSV,PR7 ;;;SWITCH STACKSB* MOV $ERLFK,R4 ;;;GET FORK BLOCK ADDRESS CALL $FORK0 ;;;AND FORK INC $ERRSQ ;COUNT THE ERRORH3 MOV #E$CCPU+<400*E$SINT>,R0 ;GET T .TITLE MPENTC .IDENT /03.00/D R;; COPYRIGHT (C) 1979,1980,1984/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.T;MA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDM9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.O;H; K. E. KINNEAR 26-JAN-79A;A'; MULTIPROCESSOR CPU STARTUP PROCESSINGE;E; MODIFIED BY:;R; J. W. BERZLE 08-SEP-83 03.00;2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;C ; D; THE FOLLOWING CODE IS DUPLICATED I00w*vvtccccN INITL.MAC, AND IS USED TO SET D; THE MAPPING FOR STARTUP OF A CPU. ANY MODIFICATIONS HERE MUST BE -; REFLECTED IN THE SIMILAR CODE IN INITL. F ;  A;C; MACRO LIBRARY CALLSE; .MCALL BGCK$A A .IF DF M$$PRO B$PENT:: MOV #PMODE!PR7,PS ;;;INIT MODE BITS & LOCK OUT INTERRUPTS 3 MOV #$STACK-20,SP ;;;SET UP KERNEL STACK POINTER E5 MOV #KINAR0,R5 ;;;INIT POINTER TO MAPPING REGISTERS I( CLR R1 ;;;INIT I SPACE MEMORY OFFSET  .IF DF K$$DAS N . MOV $SCMOF,R2 ;;;INIT D SPACE MEMORY OFFSET % BNE 5$ ;;;IF NE DATA SPACE LOADED & TST $URMST ;;;IS THIS FROM INITL? * BNE 5$ ;;;IF NE NO -- REGULAR CPU ENTRY 8 MOV #$MESS1,R4 ;;;SPECIFY DATA SPACE NOT LOADED MESSAGE/ CALL $FATAL ;;;PRINT OUT FATAL ERROR MESSAGE 2 BGCK$A BF.MP,BE.NDS,HALT ;;;DATA SPACE NOT LOADED5$: SUB #200,R2 ;;; V  .IFTF 6$: ;;;REFERENCE LABEL .IFT 4 MOV #77406,KDSDR0-KINAR0(R5) ;;;SET D SPACE 4K RW 5 MOV R2,KDSAR0-KINAR0(R5) ;;;SET D SPACE APR OFFSET - ADD #200,R2 ;;;ADVANCE D SPACE APR OFFSET R4 MOV #77402,KINDR0-KINAR0(R5) ;;;SET I SPACE 4K RO .IFF I 4 MOV #77406,KINDR0-KINAR0(R5) ;;;SET I SPACE 4K RW  .IFTF ) MOV R1,(R5)+ ;;;SET I SPACE APR OFFSET R) ADD #200,R1 ;;;ADVANCE I SPACE OFFSET CMP R5,#KINAR7 ;;;DONE YET?  BLOS 6$ ;;;IF LOS NO . MOV #177600,KINAR7 ;;;SET UP I/O PAGE MAPPING .IFT V 3 MOV #177600,KDSAR6+2 ;;;SET UP D-SPACE MAPPING TOO ( CLR (R5) ;;;CLEAR DSPACE APR0 OFFSET  .ENDC ! .IF DF K$$DAS!M$$EXT!S$$LIB M " MOV #S3$BTS,SR3 ;;;SET UP SR3  .ENDC $ INC SR0 ;;;START MEMORY MAPPING ; ?; WE HAVE, WITH THE LAST INSTRUCTION, JUST CHANGE THE MAPPING I>; THROUGH WHICH THE CPU IS FETCHING INSTRUCTIONS. IF WE ARE ?; ON CPA THEN NO ACTUAL CHANGE WAS MADE, BUT IF ON SOME OTHER TC; CPU, THEN WE ARE NOW FETCHING INSTRUCTIONS FROM THE NEW MAPPING. ; , TST $URMST ;;;WERE WE CALLED FROM INITL? + BNE 7$ ;;;IF NE NO -- DON'T RETURN THERE ;' JMP $INITM ;;;RETURN BACK TO INITL *7$: MOV #PARTB,R5 ;;;SET RETURN ADDRESS / MOV #$NS0,SP ;;;SET UP STACK FOR CPU STARTUP E4$MAPCP::MOV $IICTB,R1 ;;;GET AN IIST KRB (ANY ONE) - MOV #9$,-(SP) ;;;SET UP RETURN FROM $SGFIN T& TST $URMST ;;;IS THIS THE FIRST CPU?* BNE 5$ ;;;IF NE NO -- IIST MUST BE THERE& ;;;SO DONT $SGFIN ON CPA'S VECTORS4 CALL $SGFIN ;;;ON CPA, TRAP NON-EXISTANT IIST REGS.5$: MOV @(R1),R0 ;;;GET IIST REGISTER (IF ANY), BCS 8$ ;;;IF CS NO REGISTER -- CPA FORCED ) SWAB R0 ;;;PUT CPU NUMBER IN LOW BYTE * BIC #177770,R0 ;;;CLEAR EXTRANEOUS BITS ) CMPB R0,$NCPU ;;;TOO HIGH A PROCESSOR? R) BGE 8$ ;;;IF GT YES -- MAKE CPA AGAIN T& ASL R0 ;;;MAKE CPU INTO WORD INDEX 3 MOV $IICTB(R0),R1 ;;;GET PROPER IIST KRB ADDRESS : BIC #KS.OFL,K.STS(R1) ;;;CLEAR OFFLINE BIT FOR THIS IIST 6 MOV (R1),$PWCSR ;;;SAVE IIST CSR FOR POWER UP ROUTINE! ;;;IN CPA'S CPU SPECIFIC AREA$ RETURN ;8$: CLR R0 ;;;FORCE TO CPA 8 RETURN G39$: MOV $K6TAB(R0),KINAR0 ;;;SET UP LOCAL MAPPING L  .IF DF K$$DAS 4 MOV $K6TAB(R0),KDSAR0 ;;;SET UP FIRST D SPACE PAR  .ENDC 0 MOV #$STACK-20,SP ;;;SET UP PROPER STACK AREA , MOV R5,-(SP) ;;;MAKE INTO SUBROUTINE CALL  .IF DF X$$DBT P ; BIT $CPBIT,$XDTFL ;;;HAS XDT BEEN INITIALIZED ON THIS CPU?A BNE 12$ ;;;IF NE YES " CALL $XDTIN ;;;INITIALIZE XDT ?12$: MOV #PMODE!PR7,PS ;;;SET UP MODE BITS AFTER XDT SCREWS IT  .ENDC ; F; INITIALIZE THE UNIBUS MAPPING REGISTERS ON THIS PROCESSOR IF IT IS #; A PDP-11/7X TYPE PROCESSOR. S ; 2 CAL00w2v)vttt tfDATAL $SGFIN ;;;CATCH MEMORY FAULTS AND SET CARRY4 MOV #UBMPR,R0 ;;;POINT TO FIRST UNIBUS MAP REGISTER% BIC #HF.UBM,$HFMSK ;;;ASSUME NO UMRSN TST (R0) ;;;ARE UMRS PRESENT?1 BCS 20$ ;;;IF CS NO 5 BIS #HF.UBM,$HFMSK ;;;INDICATE THAT UMRS ARE PRESENTS- MOV KINAR0,R3 ;;;GET MAPPING OF VIRTUAL ZERO ( CLR R2 ;;;CLEAR HIGH PART OF UMR VALUE2 ASHC #6,R2 ;;;CONVERT TO DOUBLE WORD BYTE OFFSET' MOV R3,(R0)+ ;;;SET UP LOW HALF OF UMR % MOV R2,(R0)+ ;;;AND HIGH HALF OF UMR  .IF DF K$$DAS C . MOV $SCMOF,R3 ;;;PICK UP OFFSET TO DATA SPACE! CLR R2 ;;;SET FOR CONVERSION F2 ASHC #6,R2 ;;;CONVERT TO DOUBLE WORD BYTE OFFSET) MOV #4,R1 ;;;SET COUNT OF UMR'S TO LOAD#015$: MOV R3,(R0)+ ;;;LOAD LOW 16 BITS OF ADDRESS, MOV R2,(R0)+ ;;;LOAD HIGH 6 BITS OF ADDRESS* ADD #20000,R3 ;;;BUMP ADDRESS BY 4K WORDS ADC R2 ;;;...O! SOB R1,15$ ;;;LOOP FOR ALL UMRSM .IFF A  CLR R1 ;;;INIT UMR OFFSET 4 MOV #4,R2 ;;;SET NUMBER OF REGISTER PAIRS TO LOAD +15$: ADD #20000,R1 ;;;ADVANCE UMR OFFSET T. MOV R1,(R0)+ ;;;LOAD LOW 16 BITS OF ADDRESS - CLR (R0)+ ;;;CLEAR HIGH 6 BITS OF ADDRESS ! SOB R2,15$ ;;;LOOP FOR ALL UMRS  .ENDC 20$: RETURN ;;;R ; A; SCAN PARITY MEMORY CSR REGISTERS AND CREATE TABLE FOR THIS CPU ; 5PARTB: MOV #$DIRXT,-(SP) ;;;EXIT FINALLY TO $DIRXT 1 CALL $SGFIN ;;;CATCH TRAPS TO 4 AND SET CARRY ;3 MOV #$PARTB,R0 ;;;GET ADDRESS OF PARITY CSR TABLE 0' MOV R0,R1 ;;;COPY ADDRESS OF TABLE R3 MOV #1,(R1)+ ;;;INSERT A ONE IN FIRST TABLE ENTRY C- MOV #$CSRTB,R4 ;;;GET ADDRESS OF CSR TABLE ;516$: MOVB (R4)+,R3 ;;;GET NUMBER OF CSR'S TO SET UP  BEQ 22$ ;;;IF EQ DONE % CLR R2 ;;;INITIALIZE CSR ADDRESS R* BISB (R4)+,R2 ;;;CALCULATE CSR ADDRESS + SWAB R2 ;;;GET HIGH BYTE OF CSR ADDRESS M/ BISB (R4)+,R2 ;;;GET LOW BYTE OF CSR ADDRESS C"17$: TST (R2) ;;;CSR PRESENT?  BCS 19$ ;;;IF CS NO R$ MOV R2,(R1)+ ;;;SAVE CSR ADDRESS  BR 20$ ;;; P319$: MOV R0,(R1)+ ;;;POINT TO FIRST WORD OF TABLE '20$: ADD #2,R2 ;;;POINT TO NEXT CSR ; SOB R3,17$ ;;;LOOP UNTIL DONE:3 BR 16$ ;;;CONTINUE THROUGH THE REST OF THE TABLE B ; B; CLOCK INITIALIZATION -- CLOCKS ON ALL SECONDARY PROCESSORS MUST D; BE THE SAME TYPE AS THE PRIMARY PROCESSOR (I.E. EITHER ALL KW11-L "; OR KW11-P) OR WE WILL HALT ; -22$: TST @$CKCSR ;;;IS THE CLOCK AVAILABLE R BCC 25$ ;;;IF CC YES 4 BGCK$A BF.MP,BE.NCK,HALT ;;;NO -- CLOCK UNAVAILABLE+25$: CMP #172540,$CKCSR ;;;IS IT KW11-P 2 BNE 30$ ;;;IF NE NO / MOV #$CKINT,@#104 ;;;SET UP KW11-P INTERRUPT T0 MOV #$NONSI,@#100 ;;;DISABLE KW11-L INTERRUPT  BR 40$ 930$: MOV #$NONSI,@#104 ;;;ASSUME KW11-L - DISABLE KW11-P S/ MOV #$CKINT,@#100 ;;;SET UP KW11-L INTERRUPT I* TST $CKCSR ;;;DOES THE CLOCK HAVE A CSR? BEQ 45$ ;;;IF EQ NO 740$: MOV $CKLDC,@$CKCNT ;;;SETUP CLOCK COUNT REGISTER L' MOV #K$$IEN,@$CKCSR ;;;START CLOCK 45$: ;;;REFERENCE SYMBOLO  .IF DF F$$LPP T ( TST PIRQ ;;;IS THERE A PIRQ REGISTER  BCS 50$ ;;;IF CS NO E+ MOV #$FPPRQ,@#240 ;;;SET UP PIRQ VECTOR L: MOV #$FPPR8,@#244 ;;;SET UP FLOATING POINT EXCEPTION VEC 50$: ;;;REFERENCE LABEL M  .ENDC G; MOVE $HFMSK FROM CPA'S LOWCR INTO THAT OF THE PROCESSOR COMING ONLINE0 MOV KISAR6,-(SP) ;;;SAVE CURRENT KERNEL MAPPING* CLR KISAR6 ;;;MAP TO CPA'S LOW CORE AREA7 MOV $HFMSK+140000,$HFMSK ;;;PROPAGATE TO NEW PROCESSOR+ MOV (SP)+,KISAR6 ;;;RESTORE KERNEL MAPPING  LOCK$ $EXECL,WAIT ; LOCK$ $IIFNL,SPIN ;;;LOCK THE MULTIPROCESSOR FUNCTION TBL 0 BIC #MP.STP,@$MPSWT ;;;CLEAR OUT OUR STOP BIT - ULOCK$ $IIFNL,SPIN ;;;UNLOCK THE FN TABLE & CALL $CPNIT ;;;START UP PROCESSOR  .IF NDF X$$DBT 1$XDTIN:: ;;;REFERENCE LABEL -- NULL SUBROUTINE E  .IFTF 00w:vx;vtcccc  RETURN  .ENDC  .ENDC  .END  LOCK$ $EXECL,WAIT ; LOCK$ $IIFNL,SPIN ;;;LOCK THE MULTIPROCESSOR FUNCTION TBL 0 BIC #MP.STP,@$MPSWT ;;;CLEAR OUT OUR STOP BIT - ULOCK$ $IIFNL,SPIN ;;;UNLOCK THE FN TABLE & CALL $CPNIT ;;;START UP PROCESSOR  .IF NDF X$$DBT 1$XDTIN:: ;;;REFERENCE LABEL -- NULL SUBROUTINE E  .IFTF  .TITLE SYSXT@ .IDENT /14.02/ ;NK; COPYRIGHT (c) 1982, 1983, 1984, 1985 BY DIGITAL EQUIPMENT CORPORATION.C; ALL RIGHTS RESERVED.;S>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;K ; D. N. CUTLER 10-AUG-73 ;5- ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY: ;0; B. S. MCCARTHY; J. R. KAUFFMAN; T. LEKASR; J. M. LAWLER; -; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ; ; J. W. BERZLE; D. R. DONCHIN; J. R. KAUFFMAN; T. LEKAS9; B. S. MCCARTHY; L. B. MCCULLEY; C. A. SILVER;S-; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:D;L"; B. S. MCCARTHY 21-OCT-86 14.00;Y(; BM375 -- CORRECT WATCHPOINT SUPPORT;"; B. S. MCCARTHY 22-DEC-86 14.01;5; BM378 -- RECONDITIONALIZE CACHE BYPASS IN CRAW$, ; AND MAP$ ON C$$CBP;M; K. L. NOEL 06-FEB-87 14.02;R*; KLN025 -- CORRECT AST QUEUING PROBLEM; 4G; SYSTEM ENTRANCE, EXIT, AND PROCESSOR DISPATCHINGH; I; MACRO LIBRARY CALLS9J; K,L .MCALL ABODF$,HDRDF$,HWDDF$,PCBDF$,TCBDF$M .MCALL PKTDF$,ITBDF$,BGCK$ANO$P ABODF$ ;DEFINE TASK ABORT CODES'Q HDRDF$ ;DEFINE TASK HEADER OFFSETS &R HWDDF$ ;DEFINE HARDWARE REGISTERS3S PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSO.T TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS4U ITBDF$ ;DEFINE INTERRUPT TRANSFER BLOCK OFFSETS)V PKTDF$ ;DEFINE AST OFFSETS AND CODESOWX;+Y; **-$DIRSV-DIRECTIVE SAVEZ;OJ[; THIS ROUTINE IS CALLED FROM DIRECTIVE LEVEL TRAP SERVICE ROUTINES. THEG\; STACK DEPTH IS +1, THUS A SWITCH TO THE SYSTEM STACK IS ALWAYS NEC-F]; ESSARY. AT THE END OF TRAP PROCESSING A RETURN IS EXECUTED TO EXIT^; FROM THE SYSTEM._;A `; INPUTS:Ea;!b; 4(SP)=PS WORD PUSHED BY TRAP. !c; 2(SP)=PC WORD PUSHED BY TRAP. -d; 0(SP)=SAVED R5 PUSHED BY 'JSR R5,$DIRSV'. e;R f; OUTPUTS:g;OBh; REGISTER R4 IS PUSHED ONTO THE CURRENT STACK AND THEN A SWITCH=i; TO THE SYSTEM STACK IS EXECUTED. REGISTERS R3 THRU R0 AREI=j; PUSHED ON THE SYSTEM STACK, THE NEW PROCESSOR PRIORITY IS,.k; SET, AND A CALL TO THE CALLER IS EXECUTED.l;-m*n$DIRSV::MOV R4,-(SP) ;;;SAVE REGISTER R4o;+p; ** W A R N I N G **Tq;Sr; SPM HOOKPOINT NUMBER 26.s; +t; DO NOT CHANGE THE INSTRUCTION FOLLOWINGWu; LABEL WITHOUT CHECKING SPMv;-w-x$SPH26==. ;SPM CHANGES THE INSTRUCTION AT!y ;THE LOCATION OF THIS LABELOz){ DEC @#$STKDP ;;;SET PROPER STACK DEPTHE|} .IF DF M$$PRO~( BNE 10$ ;;;IF NE DON'T SWITCH STACKS .ENDC ; DF M$$PRO .IF NDF M$$PRO,10$: ;;; REFERENCE LABELE .IFTF ; NDF M$$PRO  MTPS #0 ;;;ALLOW INTERRUPTS LOCK$ $EXECL,WAIT .IFF ; NDF M$$PRO#10$: MTPS #0 ;;;ALLOW INTERRUPTSN .ENDC ; NDF M$$PROA* MOV R3,-(SP) ;SAVE REGISTERS R3 THRU R0 MOV R2,-(SP) ;I MOV R1,-(SP) ;  MOV R0,-(SP) ;T .IF DF M$$PRO) MOV $TKTCB,R0 ;GET CURRENT TCB ADDRESS 6 ASSUME T2.HLT,200 ;NEXT INSTRUCTION DEPENDS ON THIS$ TSTB T.ST2(R0) ;IS TASK EXITING?. BPL 15$ ;IF PL NO -- ALLOW ENTRY TO SYSTEM- TST $STKDP ;DID WE COME FROM USER STATE ?I* BEQ 20$ ;IF EQ YES - NO ACTION ALLOWED*15$: MOV (SP),R0 ;RESTORE R0 FOR $SWSTK .ENDC .IF DF R$$WPT> MOV R5,$WPLST ;SAVE ADDRESS OF LAST SYSTEM ROUTINE ; BM375 ;**-1V .ENDC ; DF R$$WPT, CALL (R5) ;CALL SYNCHRONOU00xBv)vttt tfDATAS TRAP ROUTINE20$: JMP $DIRXT;+ ; **-$IFORK-INDEPENDANT $CFORK; F; THIS ROUTINE IS SIMILAR TO $CFORK (SEE BELOW) BUT DOES NOT USE THEF; FORK BLOCK IN THE SCB. INSTEAD IT ALLOCATES A FORK BLOCK FROM THEH; POOL, TRANSFERS EXECUTION TO ANOTHER PROCESSOR, AND THEN DEALLOCATES; THE FORK BLOCK.; ; INPUTS:; ; R4=ANYTHING (THIS IS SAVED).; R5=UCB ADDRESS. "; 0(SP)=CALLER'S RETURN ADDRESS.,; 2(SP)=RETURN ADDRESS OF CALLER'S CALLER.;) ; OUTPUTS:; ; R4=SAVED R4.; R5=UCB ADDRESS.;B; EXECUTION IS ON CORRECT PROCESSOR. DRIVERS WITHOUT KRB'S HAVEF; NO CORRECT PROCESSOR, AND ALWAYS EXECUTE ON THE CURRENT PROCESSOR.;- .IF DF M$$PRO>$IFORK::MOV (SP)+,R3 ;PUT RETURN ADDRESS IN PROPER PLACE FOR ;$EXDOP;+1; **-$EXDOP-EXECUTE DRIVER ROUTINE ON PROCESSORN*; **-$EXROP-EXECUTE ROUTINE ON PROCESSOR;PD; THIS ROUTINE IS USED TO EXECUTE A PARTICULAR ROUTINE (USUALLY INH; A DRIVER) UNDER CONTROL OF A SPECIFIC PROCESSOR (POSSIBLY THIS ONE.)C; THE CODE SEGMENT TO BE EXECUTED MUST BE TERMINATED BY A RETURN.;OB; IF THE ROUTINE CAN BE EXECUTED ON THE CURRENT PROCESSOR, IT IS>; CALLED BY A CALL. SHOULD IT BE NECESSARY TO EXECUTE IT ON@; ANOTHER PROCESSOR, A FORK BLOCK IS ALLOCATED AND LINKED INTO>; THE FORK QUEUE. THEN A RETURN TO THE CALLER IS PERFORMED.@; WHEN THE TARGET PROCESSOR EXECUTES THE "FORKED" ROUTINE, THEB; FORK BLOCK WILL BE DEALLOCATED PRIOR TO CALLING THE ROUTINE TOA; BE EXECUTED. THIS ENTIRE OPERATION IS INDEPENDANT OF WHAT ISE?; ON THE STACK, I.E. CONTROL WILL ALWAYS RETURN TO THE CALLERIA; WHETHER OR NOT THE ROUTINE CAN BE EXECUTED ON THIS PROCESSOR. ; "; THE FORM OF THE FORK BLOCK IS:;&; *-------------------------------*; 0 ! UNIBUS RUN MASK !&; *-------------------------------*; 2 ! FORK LINK !&; *-------------------------------*; 4 ! FORK PC !T&; *-------------------------------*; 6 ! FORK R5 !O&; *-------------------------------*; 10 ! FORK R4 !&; *-------------------------------*; 12 ! DRIVER KISAR5 !O&; *-------------------------------*; 14 ! ROUTINE ADDRESS !P&; *-------------------------------*;O ; INPUTS:;*%; R2=UNIBUS RUN MASK ($EXROP ONLY). ); R3=ADDRESS OF ROUTINE TO BE EXECUTED.- ; R4=ANYTHING (THIS IS SAVED).!; R5=UCB ADDRESS ($EXDOP ONLY).-"; 0(SP)=CALLER'S RETURN ADDRESS.,; 2(SP)=RETURN ADDRESS OF CALLER'S CALLER.; ; OUTPUTS:;-.; THE ROUTINE TO BE EXECUTED IS CALLED WITH:;*; R4=SAVED R4.1; R5=SAVED R5 (UCB ADDRESS IF ENTRY AT $EXDOP).-; 0(SP)=RETURN ADDRESS.-;,; THE CALLING ROUTINE IS RETURNED TO WITH: ;-3 ; C=0 IF THE ROUTINE TO BE EXECUTED HAS EXECUTED.U$ ; C=1 IF A FORK HAD TO BE CREATED. ;O2 ; NOTE: ONLY R5 IS PRESERVED TO CALLING ROUTINE!;D7; THE CONTENTS OF KERNEL INSTR AND DATA APR 5 AT THES$; TIME OF THE CALL ARE DESTROYED.;O;-  .ENABL LSB+$EXDOP::MOV U.SCB(R5),R2 ;GET SCB ADDRESSC. MOV S.KS5(R2),KINAR5 ;MAP DRIVER IN I SPACE .IF DF K$$DAS. MOV S.KS5(R2),KDSAR5 ;MAP DRIVER IN D SPACE .ENDC, $EXRP1::MOV S.URM(R2),R2 ;GET URM FROM SCB! BEQ 10$ ;IF EQ NO URM :"$EXROP::BIT R2,@$CPURM ;CAN WE EXECUTE ON THIS PROCESSOR # BEQ 20$ ;IF EQ NO, MUST FORK$%;O$&; EXECUTE THE ROUTINE HERE AND NOW';N(-)10$: MOV R5,-(SP) ;SAVE R5 FROM THE ROUTINER* CALL (R3) ;CALL ROUTINE!+ MOV (SP)+,R5 ;RESTORE SAVED R5($, CLC ;TELL CALLER THAT WE DID IT - RETURN .2/20$: MOV #7.*2,R1 ;SET BLOCK SIZE FOR FORK BLOCK$0 MOV R2,-(SP) ;SAVE R2 FROM $ALOCB,1 CALL $ALOCB ;WE ASSUME IT SAVES R3,R4,R5 2 BCC 30$ ;IF CC ALLOCATION OK34;I05; ***** THIS IS A RATHER NASTY SITUATION *****6;O:7; WE CANNOT GET TO THE CORRECT PROCESSOR, SINCE WE CAN'T:8; ALLOCATE A FORK BLOCK. NEITHER CAN WE EXIT THE EXEC TO:9; LET ANYONE ELSE IN WHO MIGHT POTENTIALLY FREE UP POOL,=:; SINCE WE HAVE NO00xJv;vtcccc IDEA WHAT THE CALLER WAS DOING. IT WOULDE9;; BE NICE IF IN THE FUTURE SOME WAY OUT OF THIS PROBLEMB<; COULD BE DEVISED.K=;M>'? BGCK$A BF.MP,BE.NPL,FATAL ;POOL FULLO@/A30$: MOV (SP)+,(R0) ;INSERT URM IN FORK BLOCKA&B ADD #14.,R0 ;POINT AT END OF BLOCK'C MOV R3,-(R0) ;INSERT ROUTINE ADDRESS.D MOV KINAR5,-(R0) ;PUT MAPPING IN FORK BLOCKE MOV R4,-(R0) ;INSERT R4 F MOV R0,R4 ;SET UP FOR $FORK14G CALL $FORK1 ;WE ASSUME $FORK ALWAYS RETURNS C=1.HI;O2J; AT THIS POINT THE CALLER HAS BEEN RETURNED TO.K;IAL; WHEN WE EXECUTE THE CODE BELOW WE ARE ON THE TARGET PROCESSORB M; AND THE REGISTERS LOOK LIKE:N;B(O; R3=ADDRESS OF PC WORD IN FORK BLOCK.P; R4=SAVED R4.:Q; R5=SAVED R5 (POSSIBLY UCB ADDRESS IF ENTRY AT $EXDOP).R;BS-T MOV R3,R0 ;POINT AT PC WORD IN FORK BLOCKM$U SUB #4,R0 ;POINT AT TOP OF BLOCK!V MOV #7.*2,R1 ;SET BLOCK LENGTH,W MOV 14(R0),-(SP) ;SAVE ADDRESS OF ROUTINE7X CALLR $DEACB ;DEALLOCATE BLOCK (ASSUME R4,R5 SAVED)T0Y .DSABL LSB ;AND EXIT TO OUR ROUTINE WHO WILL&Z ;EXIT BACK TO THE FORK PROCESSOR[\;+]; **-$CFORK-CONDITIONAL FORK^;R>_; THIS ROUTINE WILL TRANSFER THE EXECUTION STREAM TO ANOTHER?`; PROCESSOR BY USING THE FORK LIST. IT SHOULD ONLY BE CALLED Aa; AT EXECUTIVE LEVEL, SINCE IT USES REGISTERS OTHER THAN R4 ANDb; R5.,c;P d; INPUTS:Fe;Kf; R4=ANYTHING.g; R5=UCB ADDRESS.h;1 i; OUTPUTS:j;Dk; R4=SAVED R4.l; R5=UCB ADDRESS.Lm;EBn; EXECUTION IS ON CORRECT PROCESSOR. NOTE: DRIVERS WITHOUT KRBS=o; HAVE NO "CORRECT PROCESSOR" SO $CFORK WILL ALWAYS RETURN.p;-q+r$CFORK::MOV U.SCB(R5),R2 ;GET SCB ADDRESSLs,t TALLY$ B.CFCL,XA$$CF ;COUNT A $CFORK CALLu,v TST S.URM(R2) ;IS THERE A UNIBUS RUN MASK"w BEQ $INTXT ;IF EQ NO -- RETURN)x BIT S.URM(R2),@$CPURM ;OK ON THIS CPU?#y BNE $INTXT ;IF NE YES -- RETURN z{;N,|; TRANSFER EXECUTION TO CORRECT PROCESSOR.};~, TALLY$ B.CFRK,XA$$CF ;COUNT A $CFORK FORK MOV R4,-(SP) ;SAVE R4 MOV R2,R4 ;GET SCB ADDRESS. ADD #S.FRK+6,R4 ;POINT TO END OF FORK BLOCK- MOV (SP)+,(R4) ;PUT SAVED R4 IN FORK BLOCK,* BR $FORK1 ;TRANSFER INTO FORK ROUTINES" .ENDC ; DF M$$PRO ;JWB213 ;**-1A;++; **-$FORK-FORK AND CREATE SYSTEM PROCESS;SM; THIS ROUTINE IS CALLED FROM AN I/O DRIVER TO CREATE A SYSTEM PROCESS THATG; WILL RETURN TO THE DRIVER AT STACK DEPTH ZERO TO FINISH PROCESSING. ;K ; INPUTS:T;F7; R5=ADDRESS OF THE UCB FOR THE UNIT BEING PROCESSED.T#; 0(SP)=RETURN ADDRESS TO CALLER.N+; 2(SP)=RETURN ADDRESS TO CALLERS CALLER.T;D ; OUTPUTS:;B; REGISTERS R5 AND R4 ARE SAVED IN THE CONTROLLER FORK BLOCK ANDB; A SYSTEM PROCESS IS CREATED. THE PROCESS IS LINKED TO THE FORK+; QUEUE AND A JUMP TO $INTXT IS EXECUTED.E;-  .ENABL LSBI($FORK:: MOV R4,-(SP) ;SAVE REGISTER R45 MOV U.SCB(R5),R4 ;POINT TO CONTROLLER STATUS BLOCK " CLRB S.CTM(R4) ;DISABLE TIMEOUT. ADD #S.FRK+6,R4 ;POINT TO END OF FORK BLOCK- MOV (SP)+,(R4) ;PUT SAVED R4 IN FORK BLOCKR;+,; **-$FORK1-FORK AND CREATE SYSTEM PROCESS;UE; THIS ROUTINE IS AN ALTERNATE ENTRY TO CREATE A SYSTEM PROCESS ANDB; SAVE REGISTER R5.P;S ; INPUTS:T;O>; R4=ADDRESS OF THE LAST WORD OF A 3 WORD FORK BLOCK PLUS 2..; R5=REGISTER TO BE SAVED IN THE FORK BLOCK.;- ; OUTPUTS:; A; REGISTER R5 IS SAVED IN THE SPECIFIED FORK BLOCK AND A SYSTEM ?; PROCESS IS CREATED. THE PROCESS IS LINKED TO THE FORK QUEUEO%; AND A JUMP TO $INTXT IS EXECUTED.R'; R5 IS PRESERVED FOR CALLERS CALLER.-;-($FORK1::MOV R5,-(R4) ;SAVE REGISTER R5;+,; **-$FORK0-FORK AND CREATE SYSTEM PROCESS; B; THIS ROUTINE IS AN ALTERNATE ENTRY TO CREATE A SYSTEM PROCESS.;W ; INPUTS:R;K>; R4=ADDRESS OF THE LAST WORD OF A 2 WORD FORK BLOCK PLUS 2.; ; OUTPUTS:;?; A SYSTEM PROCESS IS CREATED, LINKED TO THE FORK QUEUE AND A ; JUMP TO $INTXT IS EXECUTED.C;-&$FORK0::MOV (SP)+,-(00xRv)vttt tfDATAR4) ;SET FORK PC, CLR -(R4) ;CLEAR LINK TO NEXT FORK BLOCK;+4; **-$QFORK-INSERT FORK BLOCK AT END OF FORK QUEUE;5<; THIS ROUTINE IS AN ALTERNATE ENTRY TO QUEUE A FORK BLOCK@; AND RETURN TO THE CALLER. IT DOES NOT RETURN TO THE CALLER'S); CALLER AS DO THE OTHER FORK ROUTINES.S;H ; INPUTS:F;W; R4=ADDRESS OF A FORK BLOCK. ;T ; OUTPUTS:;T;; THE FORK BLOCK SUPPLIED IN R4 IS LINKED INTO THE SYSTEMU7; FORK QUEUE, AND A RETURN TO THE CALLER IS EXECUTED.,;-;$QFORK::MFPS -(SP) ;SAVE PRIORITY AROUND QUEUE INSERTION. MTPS #PR7 ;CAN'T INTERRUPT QUEUE INSERTION1 LOCK$ $FORKL,SPIN ;;;SERIALIZE ACCESS TO QUEUET .IF DF R$$FRK" MOV R4,-(SP) ;;;FREE A REGISTER* MOV #$FRKHD,R4 ;;;GET THE FORK LISTHEAD710$: MOV (R4),R4 ;;;GET THE NEXT ELEMENT IN THE LIST$ BEQ 15$ ;;;IF EQ NO MORE - GO ON0 CMP R4,(SP) ;;;THIS ONE IN THE LIST ALREADY?( BNE 10$ ;;;IF NE NO - LOOK SOME MORE, BGCK$A BF.INT,BE.2FR,FATAL ;;;DOUBLE FORK!15$: MOV (SP)+,R4 ;;;RESTORE R4O .ENDC ;R$$FRK1 MOV R4,@$FRKHD+2 ;;;LINK NEW ENTRY TO OLD LAST- MOV R4,$FRKHD+2 ;;;SET ADDRESS OF NEW LASTU .IF DF M$$PRO;V$; ADD ITEM TO FORK LIST WAIT MASK.;D( TST -(R4) ;;;IS IT LEGAL FORK BLOCK? BEQ 40$ ;;;IF EQ YES$ BIT (R4),$URMST ;;;IS URM ONLINE? BNE 40$ ;;;IF NE YES: BGCK$A BF.MP,BE.URM,FATAL ;;;FORK BLOCK FOR OFFLINE URM040$: BIS (R4)+,$IIPND ;;;ADD TO FORK WAIT MASK .ENDC+ TSTB $IDLFL ;;;ARE WE IN IDLE LOOP NOW? BLE 50$ ;;;IF LE NOV;+; ** W A R N I N G **O ;S ; SPM HOOKPOINT NUMBER 32. ;S+ ; DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM;--$SPH32==. ;SPM CHANGES THE INSTRUCTION ATL! ;THE LOCATION OF THIS LABELB .IF DF M$$PRO* COMB @#$IDLFL ;;;SHOW WE HAVE BEEN HERE? MOV #DIRXT2,$STACK-24 ;;;FORCE SYSTEM BACK THRU $IIPND CHECKI .IFF , CLRB @#$IDLFL ;;;NOT IN IDLE LOOP ANYMORE@ MOV #$DIRXT,$STACK-24 ;;;FORCE SYSTEM BACK THRU LOCK AND INTO  ;;;EXECG ! .ENDC"#$50$: ULOCK$ $FORKL,SPIN&% MTPS (SP)+ ;;;RESTORE OLD PRIORITY1& SEC ;RETURN WITH CARRY SET TO CALLERS CALLERH ' RETURN ;A ( .DSABL LSBC)*;+6+; **-$FORK2-FORK ROUTINE FOR USE IN CONJUNCTION WITH,; THE CINT$ DIRECTIVE.-;H .; INPUTS:E/;E#0; R5=ADDRESS OF FORK BLOCK IN ITBY1;B 2; OUTPUTS:3;C;4; IF THE FORK BLOCK IS ALREADY IN USE (FORK PC NON-ZERO),Y?5; A SYSTEM PROCESS IS CREATED, LINKED TO THE FORK QUEUE AND AL6; JUMP TO $INTXT IS EXECUTED.:7; ELSE THE INTERRUPT IS DISMISSED (NO RETURN TO CALLER).8;E:9; IMMEDIATELY ON RETURN FROM THIS ROUTINE, THE FOLLOWING#:; INSTRUCTION SHOULD BE EXECUTED: ;; <; CLR @R3=;O'>; WHICH DECLARES THE FORK BLOCK FREE.I?;-@A .IF DF C$$INTB2C$FORK2::TST 2(R5) ;;;FORK BLOCK ALREADY IN USE?D BNE 10$ ;;;Y - JUMPT(E MOV R4,6(R5) ;;;SAVE R4 IN FORK BLOCKF MOV R5,R4 ;;;N3G ADD #6,R4 ;;;POINT JUST AFTER 3-WORD FORK BLOCKTH BR $FORK1 ;;;L I10$: TST (SP)+ ;;;CLEAR STACKJ ;;;FALL THRU TO $INTXTKL .ENDCMNO;+P; **-$INTXT-INTERRUPT EXITQ; CR; THIS ROUTINE MAY BE CALLED VIA A JMP TO EXIT FROM AN INTERRUPT. S; T; INPUTS:3U;O(V; 0(SP)=INTERRUPT SAVE RETURN ADDRESS.W;- X; OUTPUTS:Y;I+Z; A RETURN TO INTERRUPT SAVE IS EXECUTED.R[;-\]$INTXT::RETURN ;^_;+C`; **-$INTSI-INTERRUPT SAVE (CALLED FROM INTERRUPT CONTROL BLOCKS),a;;Db; THIS ROUTINE IS CALLED FROM AN INTERRUPT CONTROL BLOCK. IT PUTSFc; THE WORLD IN ORDER FOR ENTRY TO A DRIVER INTERRUPT ENTRY POINT ANDd; MAPS TO THE DRIVER.Ee; f; INPUTS:g;S%h; 4(SP)=PS WORD PUSHED BY INTERRUPTT%i; 2(SP)=PC WORD PUSHED BY INTERRUPT3,j; 0(SP)=SAVED R5 PUSHED BY 'JSR R5,$INTSI'k; 0(R5)=SCRATCH WORD OF ICB*l; 2(R5)=WORD FOR APR5 (TO MAP TO DRIVER)'m; 4(R5)=BYTE FOR PS (DEVICE PRIORITY)9n; 6(R5)=DRIVER INTERRUPT ENTRY POINT (BIASED B00xZv;vtccccY 120000) o;S p; OUTPUTS:q;R#r; R4 IS PUSHED ONTO CURRENT STACKN&s; R4 IS SET TO CONTROLLER NUMBER * 2?t; STACK DEPTH IS DECREMENTED AND, IF RESULT IS ZERO, A SWITCH $u; TO THE SYSTEM STACK IS EXECUTED v; KERNEL APR5 MAPPING IS SAVED,w; CPU PRIORITY IS SET TO PRIORITY FROM ICBCx; DRIVER INTERRUPT ENTRY POINT IS CALLED AS A COROUTINE (SO AFTERD$y; A RETURN, APR5 CAN BE RESTORED)z;-{7|$INTSI::JSR R4,(PC) ;;;SAVE R4 WHILE PRESERVING CC'S=(} MFPS R4 ;;;RETRIEVE CONTROLLER INDEX4~ BIC #177760,R4 ;;;CLEAR ALL BUT CONTROLLER NUMBER# ASL R4 ;;;CONVERT TO WORD INDEXN;+; ** W A R N I N G **E;S; SPM HOOKPOINT NUMBER 27.;,+; DO NOT CHANGE THE INSTRUCTION FOLLOWINGT; LABEL WITHOUT CHECKING SPM;--$SPH27==. ;SPM CHANGES THE INSTRUCTION ATR! ;THE LOCATION OF THIS LABELD! DEC @#$STKDP ;;;SWITCH STACKS?R710$: MOV KINAR5,-(SP) ;;;SAVE KERNEL INSTRUCTION APR5E .IF DF K$$DAS, MOV KDSAR5,-(SP) ;;;SAVE KERNEL DATA APR5# MOV (R5),KDSAR5 ;;;MAP TO DRIVERE .ENDC MOV (R5)+,KINAR5 ;;; .IF DF C$$INT( BR $INTS2 ;;;CONTINUE IN COMMON CODE .IFFC> .IIF NE <.-$INTS2>, .ERROR ;$INTS2 NOT THE NEXT INSTRUCTION .ENDC;+=; **-$INTSC-INTERRUPT SAVE (INTERRUPT FROM VECTOR CONNECTED; TO VIA CINT$ DIRECTIVE).;'; CALLS ISR WITH R4 AND R5 SAVED AND:E;I#; R5 POINTER TO FORK BLOCK IN ITB$; PRI TAKEN FROM ITB; ;- .IF DF C$$INT!$INTSC::MOV R4,-(SP) ;;;SAVE R4.;+; ** W A R N I N G **R;; SPM HOOKPOINT NUMBER 28.;B+; DO NOT CHANGE THE INSTRUCTION FOLLOWING.; LABEL WITHOUT CHECKING SPM;--$SPH28==. ;SPM CHANGES THE INSTRUCTION AT! ;THE LOCATION OF THIS LABELR! DEC @#$STKDP ;;;SWITCH STACKS?E710$: MOV KINAR5,-(SP) ;;;SAVE KERNEL INSTRUCTION APR5  .IF DF K$$DAS, MOV KDSAR5,-(SP) ;;;SAVE KERNEL DATA APR5+ MOV X.REL-X.PSW(R5),KDSAR5 ;;;MAP TO ISR .ENDC! MOV X.REL-X.PSW(R5),KINAR5 ;;;R .ENDC*$INTS2: MTPS (R5)+ ;;;LOAD ISR PRIORITY5 BISB (R5)+,R4 ;;;ADD CONSTANT TO CONTROLLER NUMBERH- CACHE$ SAVE ;;;SAVE BYPASS STATE OF CACHES .IF DF R$$RSV! MOV R3,-(SP) ;;;SAVE REGISTERSD MOV R2,-(SP) ;;;  MOV R1,-(SP) ;;;0 MOV R0,-(SP) ;;;; .IFTF.$WPIN0::CALL @(R5)+ ;;;CALL ISR ; BM375 ; BM375V .IF DF R$$WPT ; BM375X ; BM375P2 NOP ;;;SPACE TO PLUG WATCHPOINT JSR ; BM375 ; BM375 .ENDC ; R$$WPT ; BM3755 ; BM375I ;**-14 .IFTO7 CMP (SP)+,R0 ;;;MAKE SURE DRIVER DIDN'T DESTROY REGSS% BEQ 30$ ;;;IF EQ R0 IS UNMODIFIEDVA20$: BGCK$A BF.INT,BE.ISR,FATAL ;;;DRIVER DESTROYED REGS IN ISRM,30$: CMP (SP)+,R1 ;;;HAS R1 BEEN MODIFIED? BNE 20$ ;;;IF NE YES( CMP (SP)+,R2 ;;;HAS R2 BEEN MODIFIED? BNE 20$ ;;;IF NE YES( CMP (SP)+,R3 ;;;HAS R3 BEEN MODIFIED? BNE 20$ ;;;IF NE YES .ENDC2 CACHE$ UNSAVE ;;;RESTORE BYPASS STATE OF CACHE .IF DF K$$DAS/ MOV (SP)+,KDSAR5 ;;;RESTORE KERNEL DATA APR5R .ENDC6 MOV (SP)+,KINAR5 ;;;RESTORE KERNEL INSTRUCTION APR5$ BR $INTX1 ;;;EXIT FROM INTERRUPT ; BM375S .IF DF R$$WPT ; BM375H ; BM375E$WPIN3::MOV R5,$WPLST ;SAVE ADDRESS OF LAST SYSTEM ROUTINE ; BM375B. CALL (R5) ;CALL THE CALLER BACK ; BM375. BR WPIN4 ;FINISH IN COMMON CODE ; BM375G$WPIN2::MOV (R5),$WPLST ;SAVE ADDRESS OF LAST SYSTEM ROUTINE ; BM375% CALL @(R5)+ ;CALL ISR ; BM375SEWPIN4:: CMP $WPVAL,@$WPADR ;DID WATCHED LOCATION CHANGE ? ; BM375N7 BEQ 1$ ;IF EQ NO (ONE OF THESE IS NOP'D BY ; BM375E5 BNE 1$ ;IF NE NO THE SET WATCH COMMAND) ; BM375 * BPT ;LET XDT KNOW ABOUT IT ; BM375=1$: RETURN ;RETURN TO PROPER REAL INTS.. ROUTINE ; BM375  ; BM375)" .ENDC ; DF R$$WPT ; BM300xbv)vttt tfDATA75 ; BM375I;+; **-$INTSV-INTERRUPT SAVE5; **-$INTSE-INTERRUPT SAVE FOR ERRORLOGGING DEVICES ;D; THIS ROUTINE IS CALLED FROM AN INTERRUPT SERVICE ROUTINE WHEN ANC; INTERRUPT IS NOT GOING TO BE IMMEDIATELY DISMISSED. A SWITCH TO G ; THE SYSTEM STACK IS EXECUTED IF THE CURRENT STACK DEPTH IS +1. WHENNJ ; THE INTERRUPT SERVICE ROUTINE FINISHES ITS PROCESSING, IT EITHER FORKS, ; , JUMPS TO $INTXT, OR EXECUTES A RETURN. ; ; INPUTS:);.&; 4(SP)=PS WORD PUSHED BY INTERRUPT.&; 2(SP)=PC WORD PUSHED BY INTERRUPT.-; 0(SP)=SAVED R5 PUSHED BY 'JSR R5,$INTSV'.R!; 0(R5)=NEW PROCESSOR PRIORITY.U;I ; OUTPUTS:;T@; REGISTER R4 IS PUSHED ONTO THE CURRENT STACK AND THE CURRENT;; STACK DEPTH IS DECREMENTED. IF THE RESULT IS ZERO, THENX?; A SWITCH TO THE SYSTEM STACK IS EXECUTED. THE NEW PROCESSOR A; STATUS IS SET AND A CO-ROUTINE CALL TO THE CALLER IS EXECUTEDP>; R4 IS SET WITH THE CONTROLLER INDEX*2, WHICH IS DETERMINED; FROM THE PSW AT ENTRY.;-$INTSE:: ;;;REFERENCE LABELR7$INTSV::JSR R4,(PC) ;;;SAVE R4 WHILE PRESERVING CC'S (  MFPS R4 ;;;RETRIEVE CONTROLLER INDEX/! BIC #177760,R4 ;;;MASK OFF CONTROLLER NUMBERE#" ASL R4 ;;;CONVERT TO WORD INDEXT#2$:T$;+%; ** W A R N I N G ** &;R'; SPM HOOKPOINT NUMBER 29.(;M+); DO NOT CHANGE THE INSTRUCTION FOLLOWINGT*; LABEL WITHOUT CHECKING SPM+;-,--$SPH29==. ;SPM CHANGES THE INSTRUCTION ATR!. ;THE LOCATION OF THIS LABEL/!0 DEC @#$STKDP ;;;SWITCH STACKS?123 .IF DF K$$DAS4*53$: MOV PS,-(SP) ;;;SAVE CURRENT PS WORD/6 BIC #PMODE,PS ;;;SET PREVIOUS MODE TO KERNELR67 MFPI (R5)+ ;;;RETRIEVE CLEAR MASK FOR NEW PRIORITY+8 BIC (SP)+,(SP) ;;;CLEAR FOR NEW PRIORITYT#9 MOV (SP)+,PS ;;;SET NEW PRIORITYR:; .IFFK<'=3$: BIC (R5)+,PS ;;;LOAD NEW PRIORITY >? .ENDC@A-B CACHE$ SAVE ;;;SAVE BYPASS STATE OF CACHES7B$WPIN1::CALL (R5) ;;;CALL THE CALLER BACK ; BM375CB ; BM375B .IF DF R$$WPT ; BM375CB ; BM375D2B NOP ;;;SPACE TO PLUG WATCHPOINT JSR ; BM375B ; BM375SB .ENDC ; R$$WPT ; BM375B ; BM375R@D$INTSF::CACHE$ UNSAVE ;;;RESTORE BYPASS STATE OF CACHE ;**-1EF;+G; **-$INTXT-INTERRUPT EXITH;RJI; THIS ROUTINE IS ENTERED VIA A RETURN TO EXIT FROM AN INTERRUPT. IF THEBJ; STACK DEPTH IS NOT EQUAL TO ZERO, THEN REGISTERS R4 AND R5 ARE@K; RESTORED AND AN RTI IS EXECUTED. ELSE A CHECK IS MADE TO SEEDL; IF THERE ARE ANY ENTRIES IN THE FORK QUEUE. IF NONE, THEN R4 ANDBM; R5 ARE RESTORED AND AN RTI IS EXECUTED. ELSE REGISTERS R3 THRUGN; R0 ARE SAVED ON THE CURRENT STACK AND A DIRECTIVE EXIT IS EXECUTED.SO;;P; INPUTS: (MAPPED SYSTEM)HQ;*'R; 06(SP)=PS WORD PUSHED BY INTERRUPT.T'S; 04(SP)=PC WORD PUSHED BY INTERRUPT. T; 02(SP)=SAVED R5.U; 00(SP)=SAVED R4.V;-W X .ENABL LSBL+Y$INTX1::MTPS #PR7 ;;;LOCK OUT INTERRUPTSE#Z TST $STKDP ;;;STACK DEPTH ZERO? [ BEQ 2$ ;;;IF EQ YES \ JMP 10$ ;;;IF NE NOI]2$: ;;;REFERENCE LABELE^_` .IF NDF M$$PROEa)b TST $FRKHD ;;;ANYTHING IN FORK QUEUE?Uc BEQ 10$ ;;;IF EQ NO de .IFF fg-h CACHE$ BYPASS ;;;SEE IF THERE IS ANY WORKM(i MOV $IIPND,R4 ;;;GET URM NEEDING WORK/j MOV $IICPU,R5 ;;;GET THOSE WITH INTS PENDINGYk CACHE$ RESTOR9l BIC @$CPURM,R5 ;;;DON'T CONSIDER OURSELVES INTERRUPTED 5m BIC R5,R4 ;;;CLEAR THOSE PEOPLE WITH INTS PENDINGT1n BEQ 10$ ;;;IF EQ NO WORK FOR US OR ANYONE NOTEo ;;;ALREADY INTERRUPTEDpq .ENDCrst;AFu; ENTER THE EXECUTIVE. THERE IS EITHER WORK SPECIFICALLY FOR US, OR/v; WORK FOR SOMEONE NOT CURRENTLY INTERRUPTED.w;x"y3$: MTPS #0 ;;;ALLOW INTERRUPTS*z MOV R3,-(SP) ;SAVE REGISTERS R3 THRU R0{ MOV R2,-(SP) ;P| MOV R1,-(SP) ;I} MOV R0,-(SP) ;~4$: LOCK$ $EXECL,WAITC;+; **-$DIRXT-DIRECTIVE EXIT;EF; THIS ROUTINE IS CALLED VIA A JUMP TO EXIT FROM A DIRECTIVE OR TRAPE; SERVICE ROUTINE. IF THERE ARE ANY ENTRIES IN THE FORK QU00xjv;vtccccEUE, THENE; THE FIRST ENTRY IS REMOVED AND THE FORK ROUTINE IS EXECUTED. ELSEKF; A CHECK IS MADE TO SEE IF REDISPATCHING OF THE PROCESSOR IS NECES-C; SARY. IF NOT, THEN REGISTERS R0 THRU R5 ARE RESTORED AND AN RTIV@; IS EXECUTED. ELSE THE PROCESSOR IS REDISPATCHED AND THE EXIT; SEQUENCE IS EXECUTED AGAIN.E;I; INPUTS: (MAPPED SYSTEM)I;V/; 16(SP)=PS WORD PUSHED BY INTERRUPT OR TRAP.M/; 14(SP)=PC WORD PUSHED BY INTERRUPT OR TRAP.O; 12(SP)=SAVED R5.; 10(SP)=SAVED R4.; 06(SP)=SAVED R3.; 04(SP)=SAVED R2.; 02(SP)=SAVED R1.; 00(SP)=SAVED R0.;- .IF DF M$$PRO)$DIRXT::CLR R5 ;INITIALIZE TCB POINTERN+DIRXT1: MTPS #PR7 ;;;LOCK OUT INTERRUPTSD .IF DF R$$WPT. CMP $WPVAL,@$WPADR ;;;WATCHPOINT STILL OK ?& ;;;ONE OF THE FOLLOWING BRANCHES' ;;;SHOULD BE NO-OPED TO START THE  ;;;WATCHPOINTS#$WPBR:: BEQ 1$ ;;;IF EQ STILL OK  BNE 1$ ;;;IF NE STILL OK BPT ;;;OOOOOOPPPPPSSS!!! 1$: ;;;REFERENCE LABELS .ENDC ; DF R$$WPT CACHE$ BYPASS+ MOV $IIPND,R3 ;;;ANY WORK IN FORK QUEUE? CACHE$ RESTOR BIT @$CPURM,R3 ;;;ANY WORK? BNE 20$ ;;;IF NE YES .IFF;+$DIRXT::MTPS #PR7 ;;;LOCK OUT INTERRUPTS .IF DF R$$WPT. CMP $WPVAL,@$WPADR ;;;WATCHPOINT STILL OK ?& ;;;ONE OF THE FOLLOWING BRANCHES' ;;;SHOULD BE NO-OPED TO START THEB ;;;WATCHPOINTS#$WPBR:: BEQ 1$ ;;;IF EQ STILL OKK BNE 1$ ;;;IF NE STILL OK BPT ;;;OOOOOOPPPPPSSS!!!S1$: ;;;REFERENCE LABEL .ENDC ; DF R$$WPT* MOV $FRKHD,R3 ;;;ANYTHING IN FORK QUEUE BNE 20$ ;;;IF NE YES .ENDC1 TSTB $CXDBL ;;;IS CONTEXT SWITCHING DISABLED?S BEQ 5$ ;;;IF EQ NO4 MOV $TKTCB,R5 ;;;PICK UP CURRENT TASK TCB ADDRESS8 TST T.ASTL(R5) ;;;AST QUEUED FOR THIS TASK? ;KLN025# BNE 5$ ;;;IF NE YES ;KLN025T9 TSTB T.ST2(R5) ;;;TASK EXITING (DUE TO ABORT)? ;**-4  BPL 6$ ;;;IF PL NO# JMP TEXIT ;;;INITIATE TASK EXITO-5$: MOV @$RQSCH,R5 ;;;SCHEDULING REQUESTED? BEQ 6$ ;;;IF EQ NO JMP 40$ ;;;IF NE YES-6$: ULOCK$ $EXECL,WAIT ;;;RELEASE EXECUTIVE;C>; CHECK TO SEE IF THERE IS ANY WORK FOR THE EXECUTIVE TO DO.;5?; THIS SECTION OF CODE MAY BE ENTERED FROM A NUMBER OF AREAS:E;4; 1. FROM THE ENTRANCE TO THE IDLE LOOP AFTER PR7; UNLOCKING THE EXECUTIVE.;23; 2. AFTER UNLOCKING THE EXECUTIVE IN $DIRXT PR7 *; JUST PRIOR TO RESTORING THE REGISTERS.;;3; 3. FROM ANY NON-PR7 SECTION OF CODE IN THE PR0I+; IDLE LOOP. IN THIS CASE, WE CAN NOT BEP+; JERKED OUT OF THIS CODE SINCE $IDLFL IS;*; NEGATIVE, INFORMING $QFORK NOT TO CRAM); THE STACK WITH THE ADDRESS OF DIRXT2. ;. ; ---------S;I,; THIS SECTION OF CODE HAS THREE OUTCOMES:;;@; 7$: THERE IS NO CURRENT WORK FOR US, BUT WORK IS PENDING FOR@; ANOTHER CPU. INTERRUPT THEM AND CHECK OUR WORK PENDING ONCE; MORE BEFORE EXITING AT 8$.;NA; 8$: THERE IS NO WORK FOR US AND NO WORK PENDING FOR ANY OTHERT<; CPU. WE WILL EXIT BACK TO WHENCE WE CAME; THE IDLE LOOP; OR AN ACTIVE USER TASK.I;IC; 15$: THERE DEFINATELY WORK FOR US, SO WE REENTER THE EXECUTIVE,E<; CLEARING THE IDLE FLAG ($IDLFL) IN CASE WE CAME FROM THE; IDLE LOOP.;E .IF DF M$$PRODIRXT2: CACHE$ BYPASSK# MOV $IIPND,R4 ;;;GET PENDING URM  BEQ 8$ ;;;IF EQ NO WORKA$ BIT @$CPURM,R4 ;;;ANY WORK FOR US BNE 15$ ;;;IF NE YES3 BIC $IICPU,R4 ;;;CLEAR THOSE ALREADY INTERRUPTEDD BEQ 8$ ;;;IF EQ NO NEW WORKW5 MOVB $EXECL+1,R5 ;;;GET PROCESSOR IN EXEC (IF ANY)A" BMI 7$ ;;;IF MI NO ONE IN EXEC) ASL R5 ;;;MAKE CPU ID INTO WORD INDEXR0 BIC $URMTB(R5),R4 ;;;ANY WORK HE CAN'T HANDLE BEQ 8$ ;;;IF EQ NO  ;  ; INTERRUPT OTHER CPU ;F 7$: CACHE$ RESTOR $ CALL $IISVC ;INTERRUPT OTHER CPU% CACHE$ BYPASS ;;;AVOID STALE DATAW2 BIT @$CPURM,$IIPND ;;;ANY LAST NSEC WORK FOR US& BNE 15$ ;;;IF NE YES -- ENTER EXEC; ,; EXIT E00xrv)vttt tfDATAXECUTIVE TO USER TASK OR IDLE LOOP;R8$: CACHE$ RESTOR;& TSTB $IDLFL ;;;ARE WE IN IDLE LOOP BEQ 9$ ;;;IF EQ NO% MOVB #1,$IDLFL ;;;SET IN IDLE LOOPR3 MOV #$IDLPT,R1 ;;;RESTORE REGISTER FOR IDLE LOOPA MTPS #0 ;;;ALLOW INTERRUPTS$ JMP IDLE ;EXIT BACK TO IDLE LOOP  .IFTF!2"9$: MOV (SP)+,R0 ;;;RESTORE REGISTERS R0 THRU R3# MOV (SP)+,R1 ;;;S$ MOV (SP)+,R2 ;;;C% MOV (SP)+,R3 ;;;S&'10$:(;+); ** W A R N I N G **S*;N+; SPM HOOKPOINT NUMBER 30.,;I+-; DO NOT CHANGE THE INSTRUCTION FOLLOWING .; LABEL WITHOUT CHECKING SPM/;-0-1$SPH30==. ;SPM CHANGES THE INSTRUCTION AT1!2 ;THE LOCATION OF THIS LABELV3(4 INC @#$STKDP ;;;INCREMENT STACK DEPTH.5 MOV (SP)+,R4 ;;;RESTORE REGISTERS R4 AND R56 MOV (SP)+,R5 ;;;O78;+!9; NONSENSE INTERRUPT ENTRY/EXITE:;-;<$NONSI::RTI ;;;M=> .IFT;?@A;P:B; ENTER EXECUTIVE FROM EXIT OF $DIRXT OR FROM IDLE LOOP.C;NFD; THE ONLY DIFFERENCE BETWEEN THE TWO ENTRY CONDITIONS IS THAT IF WEFE; ARE ENTERING FROM THE IDLE LOOP, THEN WE MUST CLEAR OUT THE $IDLFLKF; SINCE WE ARE NOT GOING TO BE IDLE ANYMORE. OTHERWISE $IDLFL IS ALREADYE G; ZERO.IH;$I,J15$: CACHE$ RESTOR ;;;RESTORE CACHE STATE8K CLRB $IDLFL ;;;SHOW NOT IN IDLE LOOP WHETHER WE WEREL MTPS #0 ;;;OR NOTUM BR 4$ ;;;ENTER EXECUTIVEN"N .ENDC ; DF M$$PRO ;JWB213P ;**-1CQR;MS; EXECUTE FORK ROUTINET;O<U; FORK ROUTINES ARE ENTERED VIA A CALL WITH THE ARGUMENTS:V;I4W; R3=ADDRESS OF THE BEGINNING OF THE FORK BLOCK+2. X; R4=RESTORED FROM FORK BLOCK. Y; R5=RESTORED FROM FORK BLOCK.Z;M[\20$: MTPS #PR7] LOCK$ $FORKL,SPIN^_` .IF DF M$$PROa(b MOV #$FRKHD,R3 ;;;GET "CURRENT" ENTRY5c22$: MOV R3,R2 ;;;MAKE CURRENT INTO PREVIOUS ENTRY05d MOV (R2),R3 ;;;GET NEW CURRENT -- AT END OF LIST?Ce BNE 24$ ;;;IF NE NO3fg; Fh; END OF FORK LIST. IF WE GET TO HERE THEN WE HAVENT FOUND ANYTHING?i; TO DO IN THIS PASS. WE CAN NOW CLEAR OUT OUR URM BITS FROMO!j; THE PENDING URM MASK, $IIPND..k; l+m BIC @$CPURM,$IIPND ;;;CLEAR OUT OUR BITSM+n BIC @$CPURM,$IICPU ;;;CLEAR OUT OUR BITSL'o BR 30$ ;;;EXIT FROM FORK PROCESSINGOp7q24$: BIT -2(R3),@$CPURM ;;;IS THIS FORK BLOCK FOR US?,r BNE 26$ ;;;IF NE YES)s TST -2(R3) ;;;CAN ANY CPU PROCESS IT?C*t BNE 22$ ;;;IF NE NO -- GO GET NEXT ONE.u26$: INC $FRKCT ;;;BUMP FORK DEQUEUED COUNT)v MOV (R3),(R2) ;;;LINK NEXT TO PREVIOUS!w BNE 30$ ;;;IF NE NOT NEW LAST "x MOV R2,$FRKHD+2 ;;;SET NEW LASTyz .IFF {#| MOV $FRKHD,R3 ;;;GET FIRST ENTRY$2} MOV (R3),$FRKHD ;;;REMOVE ENTRY FROM FORK QUEUE~ BNE 30$ ;;;IF NE NOT LAST04 MOV #$FRKHD,$FRKHD+2 ;;;RESET FORK QUEUE LISTHEAD .ENDC30$: ULOCK$ $FORKL,SPIN2  MTPS #0 .IF DF M$$PRO$ TST R3 ;DO WE HAVE A FORK BLOCK?$ BNE 35$ ;IF NE YES -- PROCESS IT+ JMP $DIRXT ;GO BACK TO CYCLE THRU AGAIN335$: ;REFERENCE LABEL .ENDC MTPS #0 ;;;ALLOW INTERRUPTSK# ADD #10,R3 ;POINT PAST SAVED R4 .IF DF K$$DAS MOV (R3),KDSAR5 ;MAP DRIVER .ENDC;+; ** W A R N I N G **T;0; SPM HOOKPOINT NUMBER 72.;F+; DO NOT CHANGE THE INSTRUCTION FOLLOWING0; LABEL WITHOUT CHECKING SPM;--$SPH72==. ;SPM CHANGES THE INSTRUCTION ATA! ;THE LOCATION OF THIS LABELS MOV (R3),@#KINAR5 ;, MOV -(R3),R4 ;RESTORE REGISTERS R4 AND R5 MOV -(R3),R5 ; ; BM375M .IF DF R$$WPT ; BM375A ; BM375TB MOV -2(R3),$WPLST ;SAVE ADDRESS OF LAST SYSTEM ROUTINE ; BM375 ; BM375" .ENDC ; DF R$$WPT ; BM375 ; BM375O" CALL @-(R3) ;CALL FORK ROUTINE JMP $DIRXT ;TRY EXIT AGAIN; ; RESCHEDULING OR POWERFAIL;H#40$: MTPS #0 ;;;ALLOW INTERRUPTS .IF DF P$$RFL TST $PWRFL ;POWER FAILURE? BEQ RESCH ;IF EQ NOS0 CALL $POWER ;EXECUTE POWER RECOVERY ROUTINES .IF DF M$$P00xzv;vtccccRO4 MOV @$RQSCH,R5 ;RENEW VALUE OF RESCHEDULE POINTER .IFFA& JMP $DIRXT ;CYCLE BACK THRU $DIRXT .ENDC .ENDC ; DF P$$RFL  .DSABL LSB; ; RESCHEDULING REQUESTED;O  .ENABL LSB$.RESCH: CLR @$RQSCH ;CLEAR SCHEDULE REQUESTS .IF DF M$$PRO;+; ** W A R N I N G **T;; SPM HOOKPOINT NUMBER 71.;F+; DO NOT CHANGE THE INSTRUCTION FOLLOWING; LABEL WITHOUT CHECKING SPM;--$SPH71==. ;SPM CHANGES THE INSTRUCTION ATR! ;THE LOCATION OF THIS LABELP* MOV @#$TKTCB,R4 ;FETCH CURRENT TASK TCB  BEQ 4$ ;IF EQ NO CURRENT TCB- BIC #TS.RUN,T.STAT(R4) ;REMOVE RUNNING BIT: BIT #TS.CKR,T.STAT(R4) ;CHECKPOINT REQUESTED THIS TASK? BEQ 4$ ;IF EQ NO, BIC #TS.CKR,T.STAT(R4) ;CLEAR THE REQUEST4 ADD #T.ATT,R4 ;POINT TO ATTACHMENT DESCR LISTHEAD-3$: MOV (R4),R4 ;GET NEXT ATTACHMENT DESCR  BEQ 4$ ;IF EQ THERE IS NONEA1 MOV A.PCB-A.TCBL(R4),R1 ;POINT TO ATTACHED PCBS7 BIT #PS.CKR,P.STAT(R1) ;CHECKPOINT REQUEST THIS PCB?I BEQ 3$ ;IF EQ NO3 BIC #PS.CKR,P.STAT(R1) ;CLEAR CHECKPOINT REQUEST & CALL $ICHKP ;TRY TO CHECKPOINT NOW  BR 3$ ;N;G; IF CPU IS GOING OFFLINE, THEN GO STRAIGHT TO IDLE LOOP. DON'T ENTERF7; SCHEDULING LOOP. DON'T PASS GO. DON'T COLLECT 200$.A;..4$: BIT $CPBIT,$URMST ;IS CPU GOING OFFLINE? BNE 5$ ;IF NE NO( CLR R5 ;SIMULATE SCHED. LOOP FAILURE" BR 33$ ;MOVE TOWARD IDLE STATE .IFF ;M$$PROC;+; ** W A R N I N G **C;O; SPM HOOKPOINT NUMBER 71.;;+; DO NOT CHANGE THE INSTRUCTION FOLLOWINGE; LABEL WITHOUT CHECKING SPM;--$SPH71==. ;SPM CHANGES THE INSTRUCTION ATC! ;THE LOCATION OF THIS LABELH .ENDC=5$: MOV #T2.STP!T2.SPN!T2.WFR,R1 ;SET STP,SPN, AND WFR MASKO# MOV #T2.WFR,R4 ;SET WAITFOR MASKB#  MOV #T2.SEF,R0 ;SET STOPFOR MASKB? 10$: MOV T.ST2(R5),R3 ;PICK UP CONTENTS OF SECOND STATUS WORD $  MOV T.STAT(R5),R2 ;TASK BLOCKED ?  BNE 25$ ;IF NE YES  .IF DF M$$PRO9 BIT @$CPCRM,T.RRM(R5) ;CAN TASK RUN ON THIS PROCESSOR?T BNE 30$ ;NO IF NE ? BIT #T4.SNC,T.ST4(R5) ;TASK USE COMMONS FOR SYNCHRONIZATION?T BEQ 15$ ;IF EQ NO : BIT #T2.ABO!T2.HLT,T.ST2(R5) ;TASK EXITTING OR ABORTED?! BNE 15$ ;IF NE YES IT CAN RUNW0 MOV T.PCB(R5),R2 ;GET TASK REGION PCB ADDRESS .IF DF X$$HDR5 MOV P.HDR(R2),-(SP) ;GET VIRTUAL ADDRESS OF HEADERS# BNE 12$ ;IF NE, RESIDENT HEADER,/ MOV P.REL(R2),KISAR6 ;MAP TO EXTERNAL HEADER2 MOV #140000,(SP) ;SET VIRTUAL ADDRESS OF HEADER212$: MOV (SP)+,R2 ;GET VIRTUAL ADDRESS OF HEADER ! .IFF ; DF X$$HDRR"*# MOV P.HDR(R2),R2 ;GET ADDRESS OF HEADER$% .IFTF ; DF X$$HDR&5' CALL $CKMAP ;ANOTHER TASK MAPPED TO SAME REGION ?E() .ENDC ; DF X$$HDR*&+ BCS 30$ ;IF CS YES, SKIP THIS TASK;, MOV T.ST2(R5),R3 ;RESTORE CONTENTS OF SECOND STATUS WORDE-15$: ;REFERENCE SYMBOL./ .ENDC01!2 MOV T.ASTL(R5),R2 ;AST QUEUED?S3 BEQ 20$ ;IF EQ NOA64 BIT #T2.AST!T2.DST,R3 ;AST IN PROGRESS OR DISABLED?5 BEQ 70$ ;IF EQ NOG(6 TSTB A.CBL(R2) ;BUFFERED I/O REQUEST?7 BMI 70$ ;IF MI YES8820$: BIT R1,R3 ;IS TASK STOPPED,SUSPENDED, OR IN WFR?"9 BEQ 60$ ;NO, RESTART THIS TASK: BIT R4,R3 ;WAITFOR STATE?%; BEQ 30$ ;IF EQ NO, SKIP THIS TASK <-= ASSUME T2.HLT,200 ;T2.HLT MUST BE SIGN BITS>2? TSTB T.ST2(R5) ;TASK MARKED FOR EXIT OR ABORT ?@ BMI 50$ ;IF MI YES4A BIT T.EFLM(R5),@T.EFLM+2(R5) ;WAITFOR SATISFIED ?B BNE 50$ ;IF NE YES&C BIT R0,R3 ;TASK IN STOPFOR STATE ?D BEQ 30$ ;IF EQ NO 7E BIT #T2.AST!T2.STP,R3 ;TASK STOPPED OR AT AST STATE?7F BNE 30$ ;IF NE YES0G BIT #T2.SEF,R3 ;TASK STOPPED FOR EVENT FLAG ?H BNE 24$ ;IF NE YES2I TSTB T.TIO(R5) ;TASK HAVE ACTIVE BUFFERED I/O ?&J BEQ 30$ ;IF EQ NO, GO TO NEXT TASK#K24$: MOV R5,R0 ;COPY TCB ADDRESS L CALL $STPTK ;STOP THE TASK+M BR 5$ ;BRANCH TO SET UP REGISTERS AGAIN 9N25$: BIC #TS.BLC,R2 ;TASK BLOCKED FOR CHECKPOINT ONLY ??/O BNE 29$00xv)vttt tfDATA ;IF NE NO, CANNOT REQUEST THIS TASKSP BIT #T2.STP,R3 ;TASK STOPPEDQ#Q BEQ 30$ ;IF EQ NO, DON'T UNSTOPS&R BIT R0,R3 ;TASK IN STOPFOR STATE ?,S BEQ 30$ ;IF EQ NO, DON'T TRY TO SCHEDULE4T BIT T.EFLM(R5),@T.EFLM+2(R5) ;STOPFOR SATISFIED ?#U BEQ 30$ ;IF EQ NO, DON'T UNSTOP3V MOV T.ACTL(R5),-(SP) ;REMEMEBER TCB OF NEXT TASK0W MOV R5,R0 ;COPY TCB ADDRESSP.X BIC #T2.STP*2!T2.STP,T.ST2(R0) ;UNSTOP TASK$Y CALL $EXRQS ;REQUEST TASK TO RUN)Z MOV (SP)+,R5 ;RESTORE NEXT TCB ADDRESSB+[ CLR @$RQSCH ;CLEAR POSSIBLE RESCHEDULES0\ BR 5$ ;RESET REGISTERS AND CONTINUE ATL SCAND]29$: CMP #TS.CIP,T.STAT(R5) ;ONLY WAITING FOR CHECKPOINT TO OCCUR?0^ BNE 30$ ;IF NE NO, CAN'T ATTEMPT TO SCHEDULE)_ TSTB T.ST2(R5) ;TASK WAITING TO EXIT ?` BPL 30$ ;IF PL, NOT EXITING'a MOV T.ASTL(R5),R4 ;ANY ASTS QUEUED ?Ob BEQ 70$ ;IF EQ, NO"c MOVB A.CBL(R4),R4 ;KERNEL AST ?.d BMI 70$ ;IF MI, YES DON'T DISTURB AST FLAG'e BR 60$ ;NO, DON'T SERVICE USER ASTS 1f30$: MOV T.ACTL(R5),R5 ;GET ADDRESS OF NEXT TCBPg BNE 10$ ;IF NE OKAYBh33$: ;REFERENCE LABELij5k TALLY$ B.IDCT,XA$$ID,CPU ;COUNT AN IDLE LOOP ENTRYOlmn .IF DF A$$CNTo,p TSTB $BILNG ;ARE WE BILLING CPU TIME NOWq BNE 35$ ;IF NE NOA-r CALL $CPUTM ;TERMINATE BILLING HERE SINCEN$s ;WE PROBABLY WILL GO IDLE, AND.t35$: ;DEFINITELY WILL DO A CONTEXT SWITCHuv .ENDCwx=y; GO VISIT THE IDLE LOOP IN ITS NEW HOME AT THE END OF THISO7z; MODULE. THIS KEEPS THE BRANCHES ABOVE FROM BREAKINGR{"| JMP IDOL ;SORRY ABOUT THE NAME} ;I COULDN'T RESIST~;T&; WAITFOR SATISFIED-CLEAR WAIT STATE;N .IF DF D$$PAR650$: MOV KINAR5,-(SP) ;SAVE KERNEL INSTRUCTION APR 54 MOV $DRAPR,KINAR5 ;MAP TO THE DIRECTIVE PARTITION .IFF 50$: ;REFERENCE SYMBOL .IFTF3 MOV T.PCB(R5),R4 ;GET ADDRESS OF TASK REGION PCB .IF DF X$$HDR5 MOV P.HDR(R4),-(SP) ;GET VIRTUAL ADDRESS OF HEADERE. BNE 55$ ;IF NE NOT AN EXTERNAL TASK HEADER/ MOV P.REL(R4),KISAR6 ;MAP TO EXTERNAL HEADERE2 MOV #140000,(SP) ;SET VIRTUAL ADDRESS OF HEADER255$: MOV (SP)+,R4 ;GET VIRTUAL ADDRESS OF HEADER .IFF ; DF X$$HDRS, MOV P.HDR(R4),R4 ;GET TASK HEADER ADDRESS .IFTF6 MOV T.EFLM+2(R5),R3 ;GET ADDRESS OF EVENT FLAG WORD .ENDC ;DF X$$HDR .IF DF G$$GEF2 CALL $DEAGF ;DEACCESS GROUP GLOBAL EVENT FLAGS .ENDC ; DF G$$GEF .IFTF$ MOV (SP)+,KINAR5 ;RESTORE MAPPING .ENDC% DEC T.ST2(R5) ;CLEAR WAITFOR STATEE' BMI 60$ ;IF MI TASK IS AT AST STATEE4 BIC #T2.SEF!T2.STP,T.ST2(R5) ;CLEAR STOPFOR STATE;R; RESTART OR CONTINUE A TASK;V360$: CLR R4 ;SET FLAG TO SIGNIFY RESTART OF TASK870$: MOVB T.PRI(R5),@$CURPR ;SET CURRENT TASK PRIORITY .IF DF M$$PRO2 BIS #TS.RUN,T.STAT(R5) ;SHOW TASK ACTIVE ON CPU .IFTF4STCTX: ;REFERENCE LABEL FOR ENTRY FROM THE IDLE  ;LOOPK472$: MOV #H.DSW,R0 ;POINT TO DIRECTIVE STATUS WORD4 MOV $SAHPT,R3 ;GET ADDRESS OF CURRENT TASK HEADER" BEQ 80$ ;IF EQ NO CURRENT TASK .IF DF X$$HDR# MOV $SAHDB,KISAR6 ;MAP TO HEADERC .ENDC ; DF X$$HDR+ CMP R5,$TKTCB ;NEW TASK SAME AS CURRENT?S BNE 73$ ;IF NE NO5 .IFTT! MOV $TKTCB,R2 ;GET TCB ADDRESSD) BIT #T2.HLT,T.ST2(R2) ;IS TASK HALTED?O2 BNE 73$ ;IF NE YES -- SAVE AND RESTORE CONTEXT .ENDC) JMP 130$ ;NO CONTEXT SWITCH NECESSARYV;0 ; SAVE CONTEXT OF CURRENT TASK;V73$:;+; ** W A R N I N G **D;; SPM HOOKPOINT NUMBER 04.;+; DO NOT CHANGE THE INSTRUCTION FOLLOWING;; LABEL WITHOUT CHECKING SPM;--$SPH04==. ;SPM CHANGES THE INSTRUCTION ATS! ;THE LOCATION OF THIS LABELF0 MOV H.GARD(R3),R2 ;POINT TO HEADER GUARD WORD  MOV SP,R1 ;POINT TO SAVED R0 MOV (R1)+,-(R2) ;SAVE R0D MOV (R1)+,-(R2) ;SAVE R1C MOV (R1)+,-(R2) ;SAVE R2N MOV (R1)+,-(R2) ;SAVE R300xv;vtcccc MOV (R1)+,-(R2) ;SAVE R4N MOV (R1)+,-(R2) ;SAVE R5+ MOV (R1)+,-(R2) ;SAVE PC MOV (R1),-(R2) ;SAVE PS# MFPI SP ;GET USER STACK POINTERT4 MOV (SP)+,(R3) ;SAVE USER STACK POINTER IN HEADER575$: MOV (R0),H.DSW(R3) ;SAVE DIRECTIVE STATUS WORD .IF DF F$$LPP7 MOV H.FPSA(R3),R2 ;POINT TO FLOATING POINT SAVE AREAD3 BEQ 77$ ;IF EQ TASK DOES NOT USE FLOATING POINT-& TST $HFMSK ;PROCESSOR HAVE A FPP ?' BMI 77$ ;IF MI NO, SKIP CTX STORAGEV1 MOV $TKTCB,R3 ;GET TCB ADDRESS OF CURRENT TASKN6  MOV T.PCB(R3),R1 ;GET ADDRESS OF TASK PARTITION PCB   .IF DF X$$HDR -  TST P.HDR(R1) ;TASK HAVE EXTERNAL HEADER ?) BEQ 76$ ;IF EQ YES, NO NEED TO RE-MAP  .ENDC ; DF X$$HDR. MOV P.REL(R1),KISAR6 ;MAP TO TASK PARTITION .IF DF P$$LAS4 ADD T.OFF(R3),KISAR6 ;ADD IN OFFSET TO TASK IMAGE .ENDC76$: ;REF LABEL+ STFPS (R2)+ ;SAVE FLOATING POINT STATUSI# SETD ;SET FLOATING DOUBLE MODE. STD R0,(R2)+ ;SAVE FLOATING POINT REGISTERS  LDD R4,R0 ;)! STD R0,(R2)+ ; " LDD R5,R0 ;B# STD R0,(R2)+ ;H$ STD R1,(R2)+ ;R% STD R2,(R2)+ ;E& STD R3,(R2)+ ;B'( .ENDC)* +77$: ;A,-. .IF DF A$$CNT/,0 TSTB $BILNG ;ARE WE BILLING CPU TIME NOW1 BNE 80$ ;IF NE NO 12 CALL $CPUTM ;ADD TIME USED TO USER ACCOUNTINGT53 MOV #H.DSW,R0 ;RESTORE DIRECTIVE STATUS WORD TO R045 .ENDC678;A9; LOAD CONTEXT OF NEW TASK:;F;,<80$: MOV R5,$TKTCB ;SET ADDRESS OF NEW TCB=>? .IF DF M$$PRO@AB .IF DF X$$HDRC3D CLR $SAHPT ;CLEAR HEADER PTR IN CASE $TKTCB = 0)EF .IFFRGH CLR $HEADR ;CLEAR HEADERIJ .ENDCK/L MOV R5,@$TKPTR ;SET NEW TCB ADDRESS IN TABLET&M BNE 81$ ;IF NE CURRENT TASK EXISTS!N JMP IDLE1 ;RE-ENTER IDLE LOOPC;O81$: BIT #T2.ABO!T2.HLT,T.ST2(R5) ;TASK MARKED FOR ABORT?EP BNE 82$ ;IF NE YES6Q MOVB $PROCN,T.CPU(R5) ;SAVE PROCESSOR NUMBER IN TCBR82$: ;REF SYMBOLST .ENDCUV3W TALLY$ B.CTXP,XA$$CX,CPU ;COUNT A CONTEXT SWITCHXYZ .IF DF A$$CNT[!\ MOV KISAR6,-(SP) ;SAVE MAPPINGE-] MOV T.ACN(R5),KISAR6 ;MAP ACCOUNTING BLOCK;"^ BEQ 825$ ;IF EQ, NO ACCOUNTING-_ CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TAB` BNE 825$ ;IF NE NO%a ADD #1,@#B.CTXT+2+140000 ;COUNT ITDb ADC @#B.CTXT+140000 ;!c825$: MOV (SP)+,KISAR6 ;RESTORERde .ENDC ;A$$CNTfgh .IF DF D$$MNDi+j TST $DITCB ;IS DIAMOND WATCHING A TASK? k BEQ 83$ ;IF EQ NO.3l BIC #1,@$DICSR ;ASSUME NOT WATCHING CURRENT TASKN7m CMP $TKTCB,$DITCB ;IS DIAMOND WATCHING CURRENT TASK?,n BNE 83$ ;IF NE NO'o BIS #1,@$DICSR ;SET DIAMOND REGISTERCp83$: ;REFERENCE SYMBOLCqr .ENDCstu .IF DF S$$LIBv.w MOV #PMODE,PS ;INSURE PREVIOUS MODE IS USERxy .ENDCz{6| MOV T.PCB(R5),R3 ;GET ADDRESS OF TASK PARTITION PCB/} MOV P.HDR(R3),R2 ;GET ADDRESS OF TASK HEADERF~ .IF DF X$$HDR% BNE 84$ ;IF NE HEADER IS RESIDENTB7 MOV #$SAVSP,$HEADR ;POINT TO STACK POINTER SAVE AREAG8 MOV #140000,R2 ;POINT TO START OF NON-RESIDENT HEADER3 MOV P.REL(R3),KISAR6 ;MAP TO NON-RESIDENT HEADERI: MOV P.REL(R3),$SAHDB ;REMEMBER TASK HEADER MAPPING BIAS! BR 841$ ;AND JOIN COMMON CODEB984$: MOV R2,$HEADR ;POINT TO HEADER SAVED STACK POINTER .ENDC ; DF X$$HDR2841$: MOV R2,$SAHPT ;SAVE ADDRESS OF TASK HEADER .IF DF F$$MAP&X$$HDR&P$$LAS7 MOV H.FMAP(R2),$FMAPP ;LOAD FAST MAP CONTEXT POINTERS" .ENDC ; DF F$$MAP&X$$HDR&P$$LAS% MOV R4,-(SP) ;SAVE EFFECT AST FLAG 5 MOV H.WND(R2),R4 ;POINT TO NUMBER OF WINDOW BLOCKS)0 TST W.BLVR+2(R4) ;IS TASK MAPPED TO THE EXEC? BEQ 85$ ;IF EQ NOA* MOV R2,R1 ;COPY ADDRESS OF TASK HEADER- ADD R0,R1 ;POINT TO DIRECTIVE STATUS WORDH1 MOV (R1)+,(R0)+ ;RESTORE DIRECTIVE STATUS WORDR6 MOV (R1)+,(R0)+ ;RESTORE POINTER TO FCS IMPURE AREA: MOV (R1)+,(R0)+ ;RESTORE POINTER TO FORTRAN IMPURE AREA: MOV (R1)+,(R0)+ ;RESTORE POINTER TO OVERLAY IMPURE AREA8 MOV (R1)+,(R0)+ ;RE00xv)vttt tfDATASTORE PTR TO VECTOR OF IMPURE PTRS3 MOV #UINDR0,R0 ;POINT TO USER I DESCRIPTOR REG 0B .IF DF K$$DAS!M$$PROA> MOV #<<<<$UTEND+77>*4>-400>&77400>!6,(R0)+ ;MIN SIZE NEEDED .IFTF .IF DF M$$PRO8 MOV #177406,(R0) ;SETUP PRIV TASK PDR FOR 4K BYPASSED .IFFS> MOV #77406,(R0) ;SETUP PRIVILEGED TASK DESCRIPTOR REGISTERS .ENDC .IFF  MOV (R0)+,(R0) ; .ENDC MOV (R0)+,(R0) ;Y MOV (R0)+,(R0) ;( MOV (R0)+,(R0) ;T5 MOV (R0),UINDR0+14. ;ALLOW FULL ACCESS TO I/O PAGE 0 MOV #UINAR0,R1 ;POINT TO USER I ADDRESS REG 05 MOV #KISAR0,R0 ;POINT TO KERNAL ADDRESS REGISTER 0R; MOV (R0)+,(R1)+ ;SETUP PRIVILEGED TASK ADDRESS REGISTERS MOV (R0)+,(R1)+ ; MOV (R0)+,(R1)+ ; MOV (R0)+,(R1)+ ; MOV (R0),(R1) ;9 MOV #177600,UINAR0+14. ;SET ADDRESS REG 7 FOR I/O PAGE  BR 90$ ;785$: MOV #UINDR0,R0 ;POINT TO USER I DESCRIPTOR REG 0186$: CLR (R0)+ ;CLEAR ALL DESCRIPTOR REGISTERS CLR (R0)+ ;T CLR (R0)+ ;D CLR (R0)+ ;L CLR (R0)+ ;G CLR (R0)+ ;0 CLR (R0)+ ;R CLR (R0) ;90$: ;REFERENCE LABEL .IF DF S$$LIB3 BIC #10,SR3 ;ASSUME NEXT TASK DOESN'T USE SUPERI% ;MODE (DISABLE CSM INSTRUCTION)0+ TSTB $SIRWF ;SUPERVISOR MODE R/W PDR'S?, BEQ 95$ ;IF EQ NOU CLRB $SIRWF ;CLEAR FLAGF3 MOV #SISDR0,R0 ;POINT TO FIRST SUPER I SPACE PDRI% BR 86$ ;CLEAR SUPER I SPACE PDR'SC695$: MOVB #-1,$SUPFL ;INDICATE NO SUPERVISOR WINDOWS .ENDC0 MOV (R4)+,-(SP) ;PUSH NUMBER OF WINDOW BLOCKS7100$: ADD #W.BLGH,R4 ;POINT PAST CURRENT WINDOW BLOCKN/ MOV -W.BLGH(R4),R3 ;PICK UP NEXT PCB ADDRESS0( BEQ 115$ ;IF EQ WINDOW IS NOT MAPPED. CMP -(R4),-(R4) ;POINT TO FIRST PDR ADDRESS6 MOV P.REL(R3),R0 ;PICK UP PARTITION RELOCATION BIAS .IF DF P$$LAS& ADD -2(R4),R0 ;ADD IN WINDOW OFFSET .ENDC$ MOVB (R4)+,R1 ;POINT TO FIRST PDR .IF DF S$$LIB$ BMI 105$ ;IF MI USER MODE WINDOW/ INCB $SUPFL ;COUNT A SUPERVISOR MODE WINDOWN( BNE 102$ ;IF NE THIS ISN'T THE FIRST9 MOV $DRAP3,SISAR0 ;FORCE MAPPING TO DISPATCHER IN EXECN. ;IN CASE TASK HAS NO SUPER MODE 0 WINDOW' MOV #402,SISDR0 ;MAP 1 32WD BLOCK ROF<102$: ADD #SISDR0,R1 ;POINT TO FIRST SUPER INSTRUCTION PDR9 BIT #4,W.BLPD-W.BNPD(R4) ;R/W ACCESS TO SUPER I SPACE?; BEQ 105$ ;IF EQ NO8 INCB $SIRWF ;SET FLAG FOR SUPER I SPACE WRITE ACCESS .ENDC6105$: MOVB (R4)+,R3 ;PICK UP NUMBER OF PDR'S TO LOAD8110$: MOVB (R4),(R1)+ ;SET USER DESCRIPTOR ACCESS CODE$ MOVB #177,(R1)+ ;SET BLOCK LENGTH% .IF DF M$$PRO!C$$CBP ; BM378  ;**-1A#  BIT #WB.BPS,(R4) ;ALWAYS BYPASS?,  BEQ 111$ ;NO IF EQ2  BISB #200,-1(R1) ;SET UP TO ALWAYS BYPASS CACHE  BR 112$ ;C111$: BIT #WB.NBP,(R4) ;CACHE BYPASS NOT DESIRED FOR THIS WINDOW?5, BNE 112$ ;YES IF NE, DO NOT BYPASS CACHE: BISB 1(R4),-1(R1) ;SET BYPASS BIT IN PDR AS APPROPRIATE( .ENDC ; DF M$$PRO!C$$CBP ; BM378 ;**-1)>112$: MOV R0,UISAR0-UISDR0-2(R1) ;LOAD USER ADDRESS REGISTER, ADD #200,R0 ;ADVANCE TO NEXT 4K BOUNDARY DEC R3 ;ANY MORE TO LOAD?B BGT 110$ ;IF GT NO6 MOV (R4)+,-(R1) ;LOAD LAST USER DESCRIPTOR REGISTER% .IF DF M$$PRO!C$$CBP ; BM378 ;**-1R% BIT #WB.BPS,-2(R4) ;ALWAYS BYPASS?I BEQ 113$ ;IF EQ NO2  BIS #100000,(R1) ;SET UP TO ALWAYS BYPASS CACHE ! BR 115$ ;IE"113$: BIT #WB.NBP,-2(R4) ;CACHE BYPASS NOT DESIRED FOR THIS WINDOW? 3# BEQ 115$ ;NO IF EQ, BYPASS CACHE AS APPROPRIATE)($ BIC #100000,(R1) ;DO NOT BYPASS CACHE%(% .ENDC ; DF M$$PRO!C$$CBP ; BM378' ;**-1(*)115$: DEC (SP) ;ANY MORE WINDOW BLOCKS?* BGT 100$ ;IF GT YESI+, .IF DF S$$LIB-/. INCB $SUPFL ;ADJUST SUPER MODE WINDOW COUNT/0 .ENDC ; DF S$$LIB1)2 MOV (R2),(SP) ;LOAD USER STACK POINTER0 3 MTPI SP ; 44 MOV #$UMR4,(R2) ;POINT SAVED SP VALUE AT SAVED R45@6; IF A USE00xv;vtccccR D SYSTEM, UPDATE THE USER D PAR'S/PDR'S TO OVERMAP#7; USER I SPACE WHERE APPROPRIATE.T89 .IF DF U$$DAS:3; MOV R2,-(SP) ;SAVE TASK HEADER ADDRESS FOR LATER ,< MOV #UINAR7+2,R0 ;POINT PAST USER I PAR 7,= MOV #UINDR7+2,R1 ;POINT PAST USER I PDR 7,> MOV #UDSAR7+2,R3 ;POINT PAST USER D PAR 7,? MOV #UDSDR7+2,R4 ;POINT PAST USER D PDR 74@ MOVB H.DMAP(R2),R2 ;GET USER D SPACE MAPPING MASK$A BNE 118$ ;IF NE MAPPING IS MIXEDB;C; NONE OF USER D HAS DISCRETE MAPPING. COPY ALL REGISTERSED; FROM USER IEEF MOV -(R0),-(R3) ;PAR 7MG MOV -(R1),-(R4) ;PDR 7AH MOV -(R0),-(R3) ;6FI MOV -(R1),-(R4) ;J MOV -(R0),-(R3) ;5AK MOV -(R1),-(R4) ;L MOV -(R0),-(R3) ;4PM MOV -(R1),-(R4) ;N MOV -(R0),-(R3) ;3PO MOV -(R1),-(R4) ;P MOV -(R0),-(R3) ;2PQ MOV -(R1),-(R4) ;R MOV -(R0),-(R3) ;1PS MOV -(R1),-(R4) ;T MOV -(R0),-(R3) ;0 U MOV -(R1),-(R4) ;#V BR 119$ ;SKIP MIXED UPDATE CODE W@X; USER D SPACE MAPPING IS A MIXTURE (OR ALL D SPACE). TEST FOR,Y; LATTER CASE, THEN UPDATE AS APPROPRIATE.Z+[118$: COMB R2 ;REVERSE SENSE OF BIT MASK)-\ ;(1 NOW MEANS APR IS MAPPED TO I SPACE)-0] BEQ 119$ ;IF EQ, ALL APRS MAPPED BY DISCRETE)^ ;D SPACE WINDOWS, NO UPDATE NEEDED.R/_ BMI 1182$ ;IF MI, APR 7 IS MAPPED TO USER I;`3a; THIS SECTION HANDLES APRS WITH DISCRETE MAPPING-b/c1181$: CMP -(R0),-(R3) ;ADVANCE PAR ADDRESSESR)d CMP -(R1),-(R4) ;ADVANCE PDR ADDRESSESe ASLB R2 ;TEST FOR NEXT APR0f BEQ 119$ ;IF EQ END OF LOOP OR ALL REMAINING!g ;APRS HAVE DISCRETE MAPPING3h BPL 1181$ ;IF PL NEXT APR HAS DISCRETE MAPPING, &i ;BUT AT LEAST ONE MORE DOES NOT.j4k; THIS SECTION HANDLES APRS MAPPED TO USER I SPACEl7m1182$: MOV -(R0),-(R3) ;COPY USER I PAR TO USER D PARP1n MOV -(R1),-(R4) ;COPY USER I PDR TO USER D PDRLo ASLB R2 ;TEST FOR NEXT APR)p BMI 1182$ ;NEXT APR MAPS USER I SPACED1q BNE 1181$ ;IF NE, NEXT APR IS NOT OVERMAPPED,r ;BUT AT LEAST ONE MORE ISs1t119$: MOV (SP)+,R2 ;RESTORE TASK HEADER ADDRESS uv .ENDC ; DF U$$DASw-x MOV (SP)+,R4 ;RESTORE EFFECT AST INDICATORIyz{ .IF DF F$$LPP|7} MOV H.FPSA(R2),R0 ;POINT TO FLOATING POINT SAVE AREAT4~ BEQ 120$ ;IF EQ TASK DOES NOT USE FLOATING POINT3 TST $HFMSK ;PROCESSOR HAVE A FLOATING PT UNIT ? - BMI 120$ ;IF MI NO, DON'T TRY TO LOAD CTXT4 MOV T.PCB(R5),R1 ;GET ADDRESS OF TCB OF NEXT TASK. MOV P.REL(R1),KISAR6 ;MAP TO TASK PARTITION .IF DF X$$HDR- TST P.HDR(R1) ;TASK HAVE EXTERNAL HEADER ?H BEQ 121$ ;IF EQ, YES .IFTF ;DF X$$HDRV .IF DF P$$LAS4 ADD T.OFF(R5),KISAR6 ;ADD IN OFFSET TO TASK IMAGE .ENDC .IFT ;DF X$$HDR121$: ;REFERENCE LABEL  .ENDC ;DF X$$HDRT6 TST (R0)+ ;POINT TO SAVED FLOATING POINT REGISTERS2 LDFPS #200 ;SET FLOATING DOUBLE MODE, NO TRAPS1 LDD (R0)+,R0 ;RESTORE FLOATING POINT REGISTERSR LDD (R0)+,R1 ;I STD R1,R4 ;D LDD (R0)+,R1 ;T STD R1,R5 ;H LDD (R0)+,R1 ;  LDD (R0)+,R2 ;F LDD (R0)+,R3 ;F3 LDFPS @H.FPSA(R2) ;RESTORE FLOATING POINT STATUSA .ENDC120$:S;+; ** W A R N I N G **;; SPM HOOKPOINT NUMBER 05.; +; DO NOT CHANGE THE INSTRUCTION FOLLOWING; LABEL WITHOUT CHECKING SPM;--$SPH05==. ;SPM CHANGES THE INSTRUCTION ATL! ;THE LOCATION OF THIS LABELD0 MOV H.GARD(R2),R0 ;POINT TO HEADER GUARD WORD' MOV SP,R1 ;POINT TO CURRENT CONTEXT  MOV -(R0),(R1)+ ;RESTORE R0 MOV -(R0),(R1)+ ;RESTORE R1 MOV -(R0),(R1)+ ;RESTORE R2 MOV -(R0),(R1)+ ;RESTORE R3 MOV -(R0),(R1)+ ;RESTORE R4 MOV -(R0),(R1)+ ;RESTORE R5 MOV -(R0),(R1)+ ;RESTORE PC MOV -(R0),(R1) ;RESTORE PSA130$:N .IF DF A$$CNT4 TST T.ACN(R5) ;DOES TASK HAVE AN ACCOUNTING BLOCK BEQ 132$ ;IF EQ NO, TSTB $BILNG ;IS BILLING CURRENTLY ACTIVE BEQ 132$ ;IF EQ YES 4 MOV $ACCLK+2,$STRTM+2 ;SAVE CURRENT ABSOLUTE TIME MOV $ACCLK,$STRTM ;* CLRB $BILNG ;INDICAT00xv)vttt tfDATAE START OF BILLING .ENDC4; A FEW DESCRIPTIVE WORDS ABOUT AST CONTROL BLOCKS;-B; AST CONTROL BLOCKS FALL INTO SEVERAL DISTINCT CATEGORIES BASED1; UPON THE VALUES IN A.CBL AND A.BYT. THESE ARE;$; A.CBL A.BYT DESCRIPTION; ----- ----- -----------;E7; <0 X KERNEL AST. BIT 6 OF A.CBL IS SET IF $SGFINL1; SHOULD NOT BE CALLED PRIOR TO EXECUTING THEE0; KERNEL AST CODE. BITS 0 THROUGH 5 OF A.CBL.; REPRESENT AN INDEX (DIVIDED BY 2) INTO A3; TABLE OF AST ADDRESSES ($KATBL). DEALLOCATION6; IS THE RESPONSIBILITY OF THE PROCESSING ROUTINE.5; THESE ARE EXEC LEVEL FUNCTIONS SUCH AS BUFFEREDA3; I/O COMPLETION WHICH MUST TAKE PLACE WHEN THET; TASK CONTEXT IS LOADED..;D<; 0 0 AST DEQUEUED BY A SYSTEM SUBROUTINE. THE ROUTINE4; IS MAPPED BY THE CONTENTS OF A.KSR5 AND CALLED4; VIA THE ADDRESS IN A.DQSR. DEALLOCATION IS THE/; RESPONSIBILITY OF THE DEQUEUE ROUTINE. ANS4; EXAMPLE IS THE PROCESSING OF UNSOLICITED INPUT$; ASTS BY THE FULL DUPLEX TTDRV.;S:; 0 N THIS IS A SPECIFIED AST BLOCK OF LENGTH C.LGTH7; (A.PLGH FOR PARITY ERROR ASTS) N IS THE SPECIFIEDP1; AST TYPE. THESE BLOCKS ARE RE-LINKED IN THEC8; T.SAST LIST AFTER THE AST IS DECLARED (EXCEPT FOR)5; PARITY ERROR ASTS, WHICH ARE ALWAYS DEALLOCATEDN3; AFTER USE, AND REQUESTED EXIT ASTS, WHICH AREA5; DEALLOCATED AFTER USE BY A NON-PRIVILEGED TASK. ;U<; >0 0 THIS IS A DYNAMIC AST (I/O COMPLETION, MARK TIME5; OF LENGTH A.CBL. AFTER THE PARAMETERS ARE MOVED 6; TO THE TASK STACK AND THE AST EFFECTED THE BLOCK; IS DEALLOCATED.Y;R132$: TST R4 ;EFFECT AST? BNE 133$ ;IF NE YESE JMP 190$ ;NO5133$: MOV R5,R0 ;CALCULATE ADDRESS OF AST LISTHEADO ADD #T.ASTL,R0 ;R, CALL $QRMVF ;REMOVE AST ENTRY FROM QUEUE" MOVB A.CBL(R1),R4 ;KERNEL AST ? BPL 135$ ;IF PL NO JMP 210$ ;4135$: MOV R5,R4 ;CALCULATE ADDRESS OF STATUS WORD ADD #T.ST2,R4 ;/ MOVB (R4),-(SP) ;COPY CURRENT EXTENSION BYTET? BIC #^C,(SP) ;CLEAR ALL BUT WAIT STATEE+ ASL (SP) ;SHIFT INTO POSITITON FOR SAVE< BIC #*2!T2.STP!T2.SPN!T2.WFR,(R4) ;"  BIS (SP)+,(R4) ;SAVE WAIT STATE(  BIS #T2.AST,(R4) ;SET AST IN PROGRESS-  MOV R1,R3 ;COPY AST CONTROL BLOCK ADDRESSR/  MOV R3,-(SP) ;SAVE AST CONTROL BLOCK ADDRESS8  CMP (R3)+,(R3)+ ;POINT TO NUMBER OF BYTES TO ALLOCATE .IF DF X$$HDR. MOV $SAHPT,R4 ;POINT TO CURRENT TASK HEADER .IFFT. MOV $HEADR,R4 ;POINT TO CURRENT TASK HEADER .ENDC ;X$$HDR& MFPI SP ;GET CURRENT STACK POINTER MOV (SP)+,R0 ;#8 MOV (R3)+,R1 ;GET NUMBER OF BYTES TO ALLOCATE ON TASK) SUB R1,R0 ;CALCULATE NEW TOP OF STACKA* CALL $ACHCK ;ADDRESS CHECK STACK SPACE) BCS 160$ ;IS CS ADDRESS CHECK FAILURE, ! .IF DF S$$LIB"+# MOV #PMODE,PS ;SET PREVIOUS MODE TO USER $% .IFTF&'( .IF DF X$$HDR)=* MOV KISAR6,-(SP) ;SAVE TASK HEADER MAPPING IF XTRNL HEADERT+, .IFTF ; DF X$$HDR-+. MOV R0,-(SP) ;SET NEW TASK STACK POINTER / MTPI SP ; /0 CALL $RELOM ;RELOCATE AND MAP STACK ADDRESS+1 MOV SP,R1 ;CALCULATE ADDRESS OF TRAP PCE23 .IFF ; DF X$$HDRC45 ADD #7*2,R1 ;C67 .IFT ; DF X$$HDRE89 ADD #8.*2,R1 ;:; .ENDC ; DF X$$HDR<#= MOV (R1)+,-(SP) ;SAVE PC AT TRAP > MOV (R1),R2 ;SAVE PS AT TRAP)? MOV #CMODE!PMODE,(R1) ;SET AST TRAP PSF#@ MOV (R3)+,-(R1) ;SET AST TRAP PCS4A MOV (R3)+,-(SP) ;GET NUMBER OF PARAMETERS TO MOVEBC .IFTD%E BIT #1,(R1) ;SUPERVISOR MODE AST?NF BEQ 140$ ;IF EQ NO$G DEC (R1)+ ;CLEAR SUPERVISOR FLAG/H TSTB $SUPFL ;TASK HAVE SUPER MODE LINKAGE ?P-I BEQ 140$ ;IF EQ NO, DON'T ALLOW SUPER AST,<J BIC #^CCSMODE&CMODE,(R1) ;SET SUPERVISOR MODE IN STACK PSKL .ENDCMN/O140$: DEC (SP) ;ANY MORE PARAMETERS TO MOVE?(P BLT 150$ ;IF LT NO0Q MOV (R3)+,(R0)+ ;MOVE PARAMETER TO USER STACK R BR 140$ ;;S150$: TST (SP)+ ;CLEAN STACKST00xv;vtcccc MFPD$ @#H.DSW ;GET USER DSWO*U MOV (SP)+,(R0)+ ;MOVE DSW TO TASK STACK1V MOV (SP)+,(R0)+ ;MOVE PC AT TRAP TO TASK STACK1.W MOV R2,(R0)+ ;MOVE PS AT TRAP TO TASK STACK.X MOV T.EFLM(R5),(R0) ;SAVE WAITFOR MASK WORDYZ .IF DF X$$HDR[9\ MOV (SP)+,KISAR6 ;RESTORE MAPPING TO XTRNL TASK HEADERC]^ .ENDC_9` MOV T.EFLM+2(R5),H.EFSV(R4) ;SAVE WAITFOR MASK ADDRESSab BR 170$ ;TAKE COMMON EXIT+%c160$: MOV #S.CAST,R0 ;SET AST ABORT#d CALL $ABCTK ;ABORT CURRENT TASKA8e170$: MOV (SP)+,R0 ;RETRIEVE AST CONTROL BLOCK ADDRESS3f MOV A.CBL(R0),R1 ;GET LENGTH OF BLOCK TO RELEASEEg BNE 175$ ;JUMP IF NON-ZERO*h CMP -(R0),-(R0) ;ZERO - POINT TO A.KSR5ijk .IF DF K$$DASl5m MOV (R0),KDSAR5 ;MAP DEQUEUE ROUTINE IN DATA SPACE+no .ENDCpq7r MOV (R0)+,KINAR5 ;MAP DEQUEUE ROUTINE IN INSTR SPACE+(s CALL @(R0)+ ;CALL DEQUEUE SUBROUTINEt BR 200$ ;EXIT "u175$: TSTB R1 ;LENGTH NON-ZERO?v BNE 180$ ;Y - JUMPw SWAB R1 ;GET AST CODEE+x CMPB R1,#AS.PEA ;PARITY ERROR AST BLOCK?C'y BEQ 1781$ ;IF EQ YES, DEALLOCATE IT z{| .IF DF A$$CLI}-~ CMPB R1,#AS.CAA ;COMMAND ARRIVAL AST BLOCK) BNE 176$ ;IF NE NO4 TST A.PRM+2(R0) ;SHOULD AST BLOCK BE DEALLOCATED? BEQ 177$ ;IF EQ YESN BR 178$ ;RELINK BLOCK 176$: ; .ENDC ;A$$CLI- CMPB R1,#AS.REA ;REQUESTED EXIT AST BLOCK?  BNE 179$ ;IF NE NO* BIT #T3.PRV,T.ST3(R5) ;TASK PRIVILEGED? BNE 178$ ;IF NE YES2177$: CALL $DECLK ;DEALLOCATE AST CONTROL BLOCK  BR 200$ ;K8178$: BIC #T2.REX,T.ST2(R5) ;ALLOW AST RESPECIFICATION=179$: MOV T.SAST(R5),(R0) ;LINK AST CONTROL BLOCK BACK INTO)* MOV R0,T.SAST(R5) ;THE HEAD OF THE LIST BR 200$ ;TRY EXIT AGAINA-1781$: MOV #A.PLGH,R1 ;GET LENGTH OF PACKETL.180$: CALL $DEACB ;DEALLOCATE CONTROL BLOCK BR 200$ ;TRY EXIT AGAINA*190$: TSTB T.ST2(R5) ;TASK BEING HALTED? BPL 200$ ;IF PL NOTEXIT: ;REFERENCE LABEL .IF DF X$$HDR- MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADERO .ENDC ; DF X$$HDR+ CALL $DREX1 ;CONTINUE TASK EXIT PROCESSN200$: ;REF LABEL) .IF DF S$$LIB3 TSTB $SUPFL ;DOES TASK HAVE SUPERVISOR WINDOWS?T BEQ 205$ ;IF EQ NO/ CALL LSUPD1 ;LOAD SUPERVISOR DATA REGISTERSC* TST $STACK-2 ;GOING TO SUPERVISOR MODE? BMI 205$ ;IF MI NO& MFPI SP ;GET CURRENT STACK POINTER+ MOV (SP),-(SP) ;MAKE A COPY ON THE STACK2 ADD #4,(SP) ;MAKE USER SP 4 MORE THAN SUPER SP+ MOV #PMODE,PS ;SET PREVIOUS MODE TO USERE$ MTPI SP ;LOAD USER STACK POINTER: BIC #^CPSMODE&PMODE,PS ;SET PREVIOUS MODE TO SUPERVISOR* MTPI SP ;LOAD SUPERVISOR STACK POINTER .ENDC .IF NDF M$$PROB205$: JMP $DIRXT ;  .IFF 205$: JMP DIRXT1 ; .ENDC-210$: MOV #$DIRXT,-(SP) ;SET RETURN ADDRESS/ MOV R1,R0 ;SET ADDRESS OF AST CONTROL BLOCK,/ CLR (R0) ;INDICATE THIS IS A SCHEDULER CALL 7211$: ASLB R4 ;CONVERT AST INDEX TO WORD, TST $SGFIN & BMI 215$ ;IF MI NO $SGFIN REQUIRED/ CALL $SGFIN ;SETUP TO IGNORE SEGMENT FAULTSS .IF DF R$$WPT ; BM375 ; BM375VF MOV $KATBL+256.(R4),$WPLST ;SAVE LAST SYSTEM STATE ADDRESS ; BM375 ; BM375 " .ENDC ; DF R$$WPT ; BM3753 JMP @$KATBL+256.(R4) ;DISPATCH TO PROPER ROUTINE(215$: ; BM375 .IF DF R$$WPT ; BM375  ; BM375RF MOV $KATBL+128.(R4),$WPLST ;SAVE LAST SYSTEM STATE ADDRESS ; BM375 ; BM375$" .ENDC ; DF R$$WPT ; BM375 ; BM375S= JMP @$KATBL+128.(R4) ;DISPATCH TO PROPER ROUTINE ; BM375  ;**-1 ;+ ;**-$DSPKA-DISPATCH KERNEL AST;A@; THIS ROUTINE IS CALLED WHEN A KERNEL AST IS TO BE DISPATCHED=; BY A COMPONENT OTHER THAN THE SCHEDULER (SPECIFICALLY THEP(; LOADER TO DISPATCH REGION LOAD ASTS.;F ; INPUTS: "; R0=ADDRESS OF KERNEL AST BLOCK;V ; OUTPUTS:; THE AST IS SERVICEDE;T?; NOTE: THE TASK CONTEXT IS NOT GUARANTEED LOADED, SO THE AS00xv)vttt tfDATAT B; MAY ONLY BE USED TO PERFORM SERVICES DEPENDENT UPON CONDITIONS-; GUARANTEED BY THE CALLER OF THIS ROUTINE. ;-7$DSPKA::MOV KINAR5,-(SP) ;SAVE CURRRENT APR 5 MAPPINGE .IF DF K$$DAS) MOV KDSAR5,-(SP) ;SAVE D SPACE MAPPINGO .ENDC ; DF K$$DAS& MOVB A.CBL(R0),R4 ;GET CAUSE OF AST. MOV #1,(R0) ;SET LINK NON-ZERO TO INDICATE ;NOT A SCHEDULER REQUEST CALL 211$ ;GO EXECUTE ASTE .IF DF K$$DAS/ MOV (SP)+,KDSAR5 ;RESTORE PREVIOUS D MAPPING .ENDC ; DF K$$DAS- MOV (SP)+,KINAR5 ;RESTORE PREVIOUS MAPPINGE  RETURN ;   .DSABL LSB-;+7; **-$GGFRN-GROUP GLOBAL EVENT FLAG USE COUNT RUNDOWND;DC; DEACCESS THIS TASK'S GROUP GLOBAL EVENT FLAGS IF THE EVENT FLAG E; MASK IN THE AST CONTROL BLOCK IS GROUP GLOBAL, AND DEALLOCATE THET ; THE AST CONTROL BLOCK. ;  ; INPUTS:L ;Q. ; R0=ADDRESS OF THE KERNEL AST CONTROL BLOCK ;D; ; TASK HEADER IS EITHER RESIDENT OR MAPPED THROUGH KISAR65 ; AND $SAHPT IS ASSUMED TO BE VALID AT THIS POINT.S ;P ; OUTPUTS: ;3 ; THE GROUP GLOBAL EVENT FLAGS ARE DEACCESSED AND+% ; THE CONTROL BLOCK IS DEALLOCATED.  ;O$ ; FORMAT OF THE AST CONTROL BLOCK: ;S ; WD. 00 -- UNKNOWNG% ; WD. 01 -- KERNEL AST TYP = AK.GGFS ; WD. 02 -- UNKNOWNP% ; WD. 03 -- EVENT FLAG MASK ADDRESSS ;T ;-   .IF DF G$$GEF : $GGFRN::MOV $SAHPT,R4 ;GET CURRENT TASK'S HEADER ADDRESS+ MOV R0,-(SP) ;SAVE CONTROL BLOCK ADDRESSU, MOV 6(R0),R3 ;GET EVENT FLAG MASK ADDRESS) CALL $DEAGF ;DEACCESS IF GROUP GLOBAL . MOV (SP)+,R0 ;RESTORE CONTROL BLOCK ADDRESS- CALL $DEPKT ;DEALLOCATE THE CONTROL BLOCK ' CALLR $SETRT ;INSURE RESCAN OF TASKC! " .ENDC ; DF G$$GEF# $ .IF DF P$$OFF% & ;+3' ; **-$FINXT-FINISH OFFSPRING TASK EXIT PROCESSING ( ; F) ; THIS ROUTINE IS CALLED TO OPTIONALLY SET AN EVENT FLAG, DECLARE ANG* ; AST AND RETURN EXIT STATUS TO A PARENT TASK ONCE THAT TASK HAS BEENO+ ; SCHEDULED., ; - ; INPUTS:R. ;T*/ ; R0=ADDRESS OF OFFSPRING CONTROL BLOCK.0 ;S 1 ; OUTPUTS:2 ;D3 ; ALL EXIT CONDITIONS ARE EFFECTED AND THE OFFSPRING CONTROL BLOCK=4 ; IS DEALLOCATED IF IT IS NOT USED AS AN AST CONTROL BLOCK.S5 ;-6 &7 $FINXT::MOV R0,R3 ;COPY OCB POINTER8 MOV R0,R4 ;COPY OCB POINTERO*9 TST (R3)+ ;SKIP OVER LINK WORD (O.LNK)<: MOV #O.LGTH,(R3)+ ;SET LENGTH TO DEALLOCATE (O.LNK=A.CBL)7; MOV (R3),R5 ;PICK UP PARENT TCB ADDR (O.PTCB=A.BYT)T6< MOV #8.*2,(R3)+ ;BYTES ON USER STACK (O.PTCB=A.BYT)/= TST (R3)+ ;SKIP OVER AST WORD (O.AST=A.AST)1> MOV (R3),R0 ;PICK UP EFN NUMBER (O.EFN=A.NPR)R1? CALL $SETFG ;SET EFN AND UNLOCK IF GRP GLOBALD6@ MOV #1,(R3)+ ;SET NUMBER OF AST PARMS (O.EFN=A.NPR)7A MOV (R3)+,R0 ;PICK UP VIRTUAL ESB ADDR (O.ESB=A.PRM)R+B MOV #1,R2 ;ASSUME ONE WORD STATUS BLOCK #C ASR R0 ;ONE WORD STATUS BLOCK ?H,D BEQ 40$ ;IF EQ NO STATUS BLOCK SPECIFIED'E BCC 5$ ;IF CC ONE WORD STATUS BLOCKR'F MOV #8.,R2 ;SET SIZE TO EIGHT WORDSE+G 5$: ASL R0 ;SET ADDRESS BACK TO ORIGINAL 8H MOV R0,-2(R3) ;CORRECT ADDRESS IN AST BLOCK FOR STACK-I 10$: MOV (R3)+,-(SP) ;GET A WORD OF THE ESBS0J MTPD$ (R0)+ ;STORE IN USER BUFFER (CAN TRAP)/K BCS 40$ ;IF CS TRAPPED, NO POINT CONTINUING3"L SOB R2,10$ ;CONTINUE WITH COPY!M 40$: TST O.AST(R4) ;EFFECT AST?NN BEQ 50$ ;IF EQ NO %O MOV R5,R0 ;SET PARENT TCB ADDRESSB$P MOV R4,R1 ;SET AST BLOCK ADDRESS1Q CALLR $QASTT ;QUEUE AST FOR PARENT AND RETURNV,R 50$: MOV R4,R0 ;POINT TO BLOCK TO RELEASE*S MOV #O.LGTH,R1 ;PICK UP SIZE TO RELEASET CALL $DEACB ;DEALLOCATE OCBB'U CALLR $SETRT ;INSURE RESCAN OF TASKEV W .IFF ;DF P$$OFFX PY $FINXT::BGCK$A BF.KAS,BE.SGN,FATAL ;SHOULDN'T HAVE AK.OCB IN NON P$$OFF SYSTEMZ [ .ENDC\ ] ;+G^ ; **-$DBTRP-SET T BIT IN SAVED PS TO CAUSE TASK TO TRAP INTO DEBUGGERI_ ;N@` ; THIS LOCAL ROUTINE IS CALLED AS A KERNEL AST TO FORCE A TASK?a ; TO TRAP INTO A DEBUGER. IT IS CALLED AS A RESULT OF THE MCRV1b ; "DEBUG" COMMAND QUEUEING THE KERNEL AST BLOC00xv;vtccccKMc ;. d ; INPUTS: e ;Z"f ; R0=ADDRESS OF KERNEL AST BLOCK%g ; R5=ADDRESS OF TCB OF CURRENT TASKSh ;F i ; OUTPUTS:j ; Dk ; THE "T" BIT IS SET IN THE SAVED PS IN THE TASK'S HEADER TO CAUSEFl ; ITTO TRAP. THE AST BLOCK IS DEALLOCATED. IF THE TASK DOES NOT HAVEDm ; A DEBUGGER SST VECTOR SPECIFIED, OR IS EXITING, THE T BIT IS NOT@n ; SET, AND THE AST BLOCK IS USED TO QUEUE A MESSAGE REQUEST TOo ; TKTN FOR OUTPUT.p ;Lq ;-r Cs $DBTRP::BIT #T2.ABO!T2.HLT,T.ST2(R5) ;IS TASK EXITING OR ABORTINGt BNE 20$ ;IF NE YES$u MOV T.PCB(R5),R4 ;FIND TASK'S PCBv w .IF DF X$$HDRx ;y MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING IN CASE XTRNL HDRT,z MOV P.HDR(R4),-(SP) ;POINT TO TASK HEADER!{ BNE 5$ ;IF NE RESIDENT HEADERE/| MOV P.REL(R4),KISAR6 ;MAP TO EXTERNAL HEADERG7} MOV #140000,(SP) ;POINT TO VIRTUAL ADDRESS OF HEADER1~ 5$: MOV (SP)+,R4 ;GET VIRTUAL ADDRESS OF HEADERG( MOV H.ODVA(R4),R4 ;GET VECTOR ADDRESS, MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING' TST R4 ;IS A DEBUGGER SST SPECIFIED2  .IFF ; DF X$$HDRP $ MOV P.HDR(R4),R4 ;POINT TO HEADER. TST H.ODVA(R4) ;IS A DEBUGGER SST SPECIFIED  .ENDC ; DF X$$HDR  BEQ 20$ ;IF EQ NONA BIC #T2.SEF!T2.STP!T2.SPN!T2.WFR,T.ST2(R5) ;MAKE TASK RUNNABLER, BIS #20,@#$STACK-2 ;SET T BIT IN SAVED PS* 10$: MOV #A.DLGH,R1 ;LENGTH OF AST BLOCK CALL $DEACB ;DEALLOCATE IT' CALLR $SETRT ;INSURE RESCAN OF TASK,$ 20$: TST $TKNPT ;TKTN INSTALLED ?) BEQ 10$ ;IF EQ NO, DEACLLOCATE PACKET;( MOV #T.NDEB,R3 ;NO DEBUGGER SPECIFIED3 MOV T.NAM+2(R5),R4 ;GET SECOND HALF OF TASK NAMER# MOV T.NAM(R5),R5 ;AND FIRST HALFT. CALLR $DVMG1 ;REQUEST TKTN USING AST BLOCK   ;+- ; **-$GENBF-GENERAL BUFFERED I/O COMPLETION5 ;KE ; THIS ROUTINE IS CALLED TO TRANSFER KERNEL AST CONTROL TO A DRIVERMD ; FOR PROCESSING OF FUNCTIONS WHICH MUST BE DONE WITH TASK CONTEXT0 ; LOADED. THE AST CONTROL BLOCK IS AS FOLLOWS: ;P# ; +-----------------------------+ # ; ! LINK WORD !.# ; +-----------------------------+V# ; ! A.BYT=0 ! A.CBL=AK.GBI !A# ; +-----------------------------+R# ; ! SUBROUTINE KISAR5 BIAS !K# ; +-----------------------------+ # ; ! SUBROUTINE ADDRESS !T# ; +-----------------------------+D ;R ; INPUTS:  ;O# ; R0=ADDRESS OF AST CONTROL BLOCKG ;U ; OUTPUTS: ;B ;+ . $GENBF::SAVNR ;SAVE NON-VOLATILE REGISTERS- MOV R0,R3 ;COPY AST CONTROL BLOCK ADDRESS-. MOV $TKTCB,R0 ;GET CURRENT TASK TCB POINTER2 CALL $SETCR ;FORCE RE-DISPATCHING OF PROCESSOR* MOV 4(R3),KISAR5 ;MAP TO DRIVER ROUTINE  .IF DF K$$DAS 4 MOV 4(R3),KINAR5 ;MAP TO DRIVER ROUTINE (I SPACE)  .ENDC ; DF K$$DAS 0 CALLR @6(R3) ;CALL DRIVER ACCEPTANCE ROUTINE  ;+0 ; **-$FINBF-FINISH TERMINAL INPUT BUFFERED I/O ;T@ ; THIS ROUTINE IS CALLED TO COMPLETE A BUFFERED TERMINAL INPUTH ; REQUEST THAT HAS BEEN PLACED IN THE AST QUEUE, OR TO COMPLETE AN I/OD ; REQUEST FOR A TASK WHICH MAY HAVE UNMAPPED ITS I/O STATUS BLOCK. ;R ; INPUTS:  ;O ; R0=ADDRESS OF I/O PACKET.P< ; R4=0 FOR BUFFERED I/O OR 100 FOR POSSIBLE UNMAP OF IOSB. ;M ; REQUIRED I/O PACKET FIELDS:  ;.( ; I.FCN+1=I/O FUNCTION CODE OF REQUEST- ; I.PRM=RELATIVE KISAR6 BIAS OF USER BUFFER$. ; I.PRM+2=KISAR6 DISPLACEMENT OF USER BUFFER! ; I.PRM+6=FIRST I/O STATUS WORDE@ ; I.PRM+10=2ND I/O STATUS WORD (AND COUNT FOR $BLXIO TRANSFER)7 ; I.PRM+12=PTR TO LINKED LIST OF BUFFERS OR 0 IF NONEA) ; I.PRM+14=KISAR5 BIAS OF DRIVER BUFFERL2 ; I.PRM+16=PCB ADDRESS FOR PARTITION OF TRANSFER ;KA ; NOTE: ONLY THE I/O STATUS IN I.PRM+6 AND I.PRM+10 IS REQUIRED ; IF R4=100.D ; OUTPUTS: ; D ; THE BUFFERED I/O REQUEST IS COMPLETED AND $IOFIN IS CALLED. THEF ; DRIVER IS CALLED TO DEALLOCATE ANY BUFFERS. IF THE BUFFER ADDRESSE ; IS ODD, THE BUFFER IS NOT COPIED AND INSTEAD THE DRIVER IS CALLEDDE ; DIRECTLY. THIS CASE ALLOWS FOR NON-STANDARD BUFFER FORMATS. THEFG ; DRIVER IS RESPONSIBLE FOR TRANSFERRING THE D00xv)vttt tfDATAATA TO THE USER BUFFER.+? ; IF THE PCB ADDRESS IS ODD, THE BUFFER IS IN SECONDARY POOL.E ;- .ENABL LSBD  - $FINBF::SAVNR ;SAVE NONVOLITILE REGISTERS 4 MOV I.PRM+16(R0),R1 ;GET ADDRESS OF BUFFER REGION- BIC #1,R1 ;CLEAR SECONDARY POOL INDICATORO" CALL $TSPAR ;BUFFER RESIDENT ? BCC 5$ ;IF CC YESU% BR 50$ ;IF CS NO, LOAD AST QUEUEDE. $FINDI::SAVNR ;SAVE NON-VOLATILE REGISTERS) 5$: MOV R0,R3 ;COPY I/O PACKET ADDRESSR2 MOV I.IOSB(R3),R0 ;PICK UP VIRTUAL IOSB ADDRESS! BEQ 10$ ;IF EQ NONE SPECIFIEDE7 MOV I.PRM+6(R3),-(SP) ;PUSH FIRST WORD OF I/O STATUS 6 MTPD$ (R0)+ ;WRITE IN USER IOSB (ANY TRAP IGNORED)9 MOV I.PRM+10(R3),-(SP) ;PUSH SECOND WORD OF I/O STATUSF8 MTPD$ (R0)+ ;WRITE IN USER IOSB+2 (ANY TRAP IGNORED)3 CLR I.IOSB+4(R3) ;NO I/O STATUS BLOCK FOR $IOFINC 10$:8 ASSUME AK.BUF,200 ;BUFFERED I/O LOW BITS MUST BE ZERO  TSTB R4 ;BUFFERED I/O? BNE 30$ ;IF NE NOO. MOV I.TCB(R3),R5 ;RETRIEVE TASK TCB ADDRESS/ DECB T.TIO(R5) ;DECREMENT BUFFERED I/O COUNTC2 INCB T.IOC(R5) ;INCREMENT OUTSTANDING I/O COUNT( MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS) ADD #I.PRM+16,R3 ;POINT TO PCB ADDRESS(, MOV (R3),R5 ;SAVE PCB ADDRESS (I.PRM+16) MOV R5,R2 ;COPY PCB ADDRESS+2 BIC #1,R2 ;CLEAR POSSIBLE SEC POOL BUFFER FLAG8 ADD P.REL(R2),-16(R3) ;MAKE TASK BUFFER BIAS ABSOLUTE/ CLR (R3) ;CLEAR PCB ADDRESS WORD (I.PRM+16)B( TST -(R3) ;BACKUP POINTER (I.PRM+14)8 MOV -(R3),R2 ;PICK UP INPUT BUFFER ADDRESS (I.PRM+12)  BEQ 20$ ;IF EQ THERE IS NONE0 MOV -10(R3),R4 ;GET START ADDR OF USER BUFFER  .IF DF T$$ACD!T$$TSA  ( BIT #1,R5 ;BUFFER IN SECONDARY POOL? BNE 12$ ;IF NE YES* BIT #1,R2 ;NON-STANDARD BUFFER FORMAT?/ BNE 17$ ;IF NE YES, BYPASS BUFFER COPY CODES  .ENDC ;T$$ACD!T$$TSA  , 11$: BIT #1,R5 ;BUFFER IN SECONDARY POOL? BEQ 13$ ;IF EQ NOA1 12$: MOV R2,R1 ;BUFFER ADDRESS IS MAPPING BIASU( MOV #120000,R2 ;SET APR5 DISPLACEMENT* BR 14$ ;TRANSFER USING SEC POOL BUFFER. 13$: CMP R2,#120000 ;BUFFER IN DRIVER SPACE? BLO 15$ ;IF LO NOU" MOV R2,R1 ;COPY BUFFER ADDRESS1 BIC #77,R1 ;REMOVE DISPLACEMENT IN BLOCK BITSE5 SUB #120000,R1 ;CALC OFFSET IN DRIVER PAR IN BYTESR0 SUB R1,R2 ;REDUCE ADDRESS TO FIT IN KERNEL 5- ASL R1 ;CONVERT BYTE OFFSET TO 32W BLOCKSB  ASL R1 ;  SWAB R1 ;Y1 ADD 2(R3),R1 ;CALCULATE PHYSICAL MEMORY OFFSETB ! 14$: MOV R1,KISAR5 ;MAP BUFFER3" 15$: MOV (R2)+,-(SP) ;SAVE POINTER TO NEXT BUFFERR&# MOV (R2)+,R0 ;PICK UP SIZE OF BLOCK+$ SUB #4,R0 ;REDUCE COUNT BY HEADER BYTES1)% SUB R0,-(R3) ;IS THERE THAT MUCH LEFT?A& BCC 16$ ;IF CC YES'' ADD (R3),R0 ;ELSE SET CORRECT COUNTB(( CLR (R3) ;CLEAR REMAINING BYTE COUNT2) 16$: MOV -10(R3),R3 ;PICK UP KISAR6 BIAS (I.PRM)(* CALL $BLXIO ;TRANSFER TO USER BUFFER0+ MOV (SP)+,R2 ;RETRIEVE POINTER TO NEXT BUFFER,, MOV (SP),R3 ;RETRIEVE I/O PACKET POINTER(- ADD #I.PRM+10,R3 ;POINT TO BYTE COUNT%. TST (R3)+ ;MORE TO GO? (I.PRM+10)E/ BNE 11$ ;IF NE YES50 17$: MOV (R3),R0 ;POINT TO FIRST BUFFER (I.PRM+12)E41 MOV @I.UCB-(R3),R2 ;POINT TO DRIVER DCB(2 MOV D.PCB(R2),R3 ;POINT TO DRIVER PCB3 4 5 .IF DF K$$DAS6 17 MOV P.REL(R3),KDSAR5 ;MAP DRIVER IN DATA SPACER8 9 .ENDC: ; 2< MOV P.REL(R3),KINAR5 ;MAP DRIVER IN INSTR SPACE3= MOV D.DSP(R2),R2 ;POINT TO DRIVER DISPATCH TABLE5> CALL @D.VDEB(R2) ;CALL DRIVER DEALLOCATION ROUTINE.+? 20$: MOV (SP)+,R3 ;RESTORE PACKET ADDRESS @ TST (R3) ;REGION LOAD AST ?1)A BNE 40$ ;IF NE YES, RE-QUEUE TASK ASTT+B 30$: CALLR $IOFIN ;COMPLETE I/O REQUESTPC (D 40$: MOV I.TCB(R3),R0 ;SET TCB ADDRESS6E MOVB #AK.DIO,A.CBL(R3) ;CHANGE AST TYPE TO "DELAYEDF ;I/O COMPLETION")G CALLR $REQUE ;RE-QUEUE TASK LEVEL ASTCH ,I 50$: INCB T.TIO(R5) ;RE-COUNT BUFFERED I/O J ;FORCE I/O RUNDOWN IF TASKK ;EXITS DURING LOAD AST L RETURN ;EM N .DSABL LSBDO P Q R ;NS ; EXECUTIVE IDLE LOOPRT ;EHU ; THE EXECUTIVE IDLE LOOP IS ENTERED WHEN THERE ARE 00xv;vtccccNO RUNNABLE TASKS.GV ; THE NULL TCB AT THE END OF THE TASK LIST IS ALWAYS GUARANTEED TO BE HW ; BLOCKED. TWO FLAGS ARE SET FOR OTHER EXECUTIVE ROUTINES IN THE IDLE X ; LOOP. Y ;YJZ ; 1. THE ADDRESS OF THE NULL TCB (#$ACTHD) IS SET INTO THE RESCHEDULED[ ; POINTER ($RQSCH) TO PREVENT $DIRXT FROM EVER RETURNING TO SYSTEMD\ ; STATE WHILE THE EXEC IS IDLE. THIS FORCES EXECUTION BACK TO THE1] ; IDLE LOOP IN LIEU OF A REAL SCHEDULE REQUEST.^ ;I_ ; 2. AN IDLE FLAG IS SET ($IDLFL) FOR THE FORK ROUTINES TO CAUSE THEM ?` ; TO FORCE CONTROL BACK TO $DIRXT WHEN NECESSARY TO DEQUEUE AOBa ; FORK. (IT IS IMPOSSIBLE FOR THE IDLE LOOP TO ALWAYS RETURN TOBb ; $DIRXT WHEN NECESSARY BECAUSE OF A WINDOW BETWEEN THE CHECK OF,c ; THE FORK LIST AND THE WAIT INSTRUCTION.)d ;$Ge ; THE STACK CANNOT BE USED IF $IDLFL IS SET TO A ONE AND THE PRIORITYHFf ; IS OTHER THAN PR7, BECAUSE WE COULD SUSTAIN AN INTERRUPT RESULTINGFg ; IN A FORK WHICH WOULD FORCE $QFORK TO JAM AN ADDRESS DIRECTLY INTOFh ; THE STACK. IF WE ARE USING THE STACK, THEN IT WOULDN'T KNOW WHEREi ; TO PUT THE ADDRESS.Ej ; k .ENABL LSB(l @m IDOL: MOV #$ACTHD,@$RQSCH ;PREVENT $DIRXT RETURN TO USER STATE-n CLRB @$CURPR ;CLEAR CURRENT TASK PRIORITYCo p ;+q ; ** W A R N I N G **Tr ;Rs ; SPM HOOKPOINT NUMBER 31.t ;T+u ; DO NOT CHANGE THE INSTRUCTION FOLLOWINGIv ; LABEL WITHOUT CHECKING SPMw ;-x -y $SPH31==. ;SPM CHANGES THE INSTRUCTION ATF!z ;THE LOCATION OF THIS LABEL { | } .IF DF M$$PRO~ 0 MOV @#$TKTCB,R0 ;;;GET CURRENT TASK ; BM079$ BEQ 40$ ;;;IF EQ NO CURRENT TASK8 BIT @$CPCRM,T.RRM(R0) ;CAN THIS TASK RUN ON THIS CPU?+ BNE 72$ ;IF NE NO -- REMOVE HIS CONTEXTR< BIT #TS.BLC,T.STAT(R0) ;;;POSSIBLE FUTURE MAPPING CHANGE?, BNE 72$ ;;;IF NE YES -- SAVE THE CONTEXT+ BIT $CPBIT,$URMST ;ARE WE GOING OFFLINE? ( BEQ 72$ ;IF EQ YES -- REMOVE CONTEXT< BIS #TS.RUN,T.STAT(R0) ;;;SHOW CURRENT TASK BELONGS TO US - ; RE-ENTRY POINT AFTER STORING TASK CONTEXT  , IDLE1: ;;;REF. LABEL FOR CONTEXT SWITCH $ 40$: MTPS #PR7 ;;;UP OUR PRIORITY- BIT $CPBIT,$URMST ;;;ARE WE GOING OFFLINE?  BNE 42$ ;;;IF NE NO72 CALL $OLRNT ;;;TELL HRC... WE MADE IT THIS FAR7 ULOCK$ $EXECL,WAIT ;;;CLEAR OUT AND LET THE WORLD IN$! HALT ;;;COME TO A DEAD STOP!: 42$: DECB $IDLFL ;;;SHOW IN IDLE LOOP - UNINTERRUPTABLE ;+ ; ** W A R N I N G **B ;S ; SPM HOOKPOINT NUMBER 33. ;K+ ; DO NOT CHANGE THE INSTRUCTION FOLLOWINGS ; LABEL WITHOUT CHECKING SPM ;- - $SPH33==. ;SPM CHANGES THE INSTRUCTION ATP! ;THE LOCATION OF THIS LABELI - MOV #$IDLPT,R1 ;;;SET UP FOR LIGHT PATTERNI) ULOCK$ $EXECL,WAIT ;;;UNLOCK EXECUTIVE ) JMP DIRXT2 ;;;CHECK FOR WAITING FORKSC  .IFFL 4 MOV #$IDLPT,R1 ;;;SET FOR IDLE LOOP LIGHT PATTERN$ INCB $IDLFL ;;;SHOW IN IDLE LOOP' TST $FRKHD ;;;ANYTHING IN FORK LISTN+ BEQ IDLE ;;;IF EQ NO -- ENTER IDLE LOOP  ;+ ; ** W A R N I N G **U ;  ; SPM HOOKPOINT NUMBER 33. ;I+ ; DO NOT CHANGE THE INSTRUCTION FOLLOWINGT ; LABEL WITHOUT CHECKING SPM ;- - $SPH33==. ;SPM CHANGES THE INSTRUCTION ATO! ;THE LOCATION OF THIS LABELW 2 CLRB @#$IDLFL ;;;NOT IN IDLE LOOP NOW ; BM079# JMP $DIRXT ;;;EXECUTE THE FORKSV ;;;ENTER EXECUTIVE  .ENDC 0 ; INTERMEDIATE TARGET TO JUMP TO STORE CONTEXT + 72$: JMP STCTX ;GO STORE CONTEXT OF TASK; 3 IDLE: CACHE$ RESTOR ;RESTORE CACHE TO NON-BYPASS*' MOV (R1)+,(R1) ;RESTORE IDLE PATTERN & DECB $IDLCT ;TIME TO MOVE PATTERN? BGE 45$ ;IF GE NOH MOVB #2,$IDLCT ;RESET COUNT% ASLB (R1)+ ;MOVE PATTERN ($IDLPT)A RORB (R1) ;($IDLPT+1)T ADCB -(R1) ;($IDLPT)9 45$: MOV (R1),R0 ;PUT IT WHERE IT CAN BE SEEN ($IDLPT);& MOV R0,-(R1) ;SAVE IT FOR NEXT TIME WAIT  ;H ; IF $IIPND HAS ANY OF OUR URMS SET, WE SHOULDN'T BE IN THE IDLE LOOP.F ; IF WE HAVE JUST POWERFAILED, THEN THIS CODE PATH MAY BE TAKEN. IFI ; NOT, WE SHOULD NEVER EXECUTE IT. STILL, ITS NICE BELT AND SUSPENDER00xv)vttt tfDATAST5 ; TECHNIQUE. NOT MUCH ELSE TO DO IN THE IDLE LOOP.2 ;C   .IF DF M$$PRO 2 CACHE$ BYPASS ;MAKE SURE WE GET THE REAL THING' BIT @$CPURM,$IIPND ;ANY WORK FOR US?1- BEQ IDLE ;IF EQ NO, IDLE AROUND SOME MORE $ JMP DIRXT2 ;GO FIND OUT FOR SURE  .IFF " BR IDLE ;IF NO MULTIPROCESSING  .ENDC .DSABL LSBL  ;+8 ; **-$SGFIN-SEGMENT FAULT AND TRAP 4 INTERCEPT ROUTINE ; G ; THIS ROUTINE IS A CO-ROUTINE WHICH SETS UP TO IGNORE SEGMENT FAULTSD ; AND TRAPS THROUGH 4. ;E ; INPUTS:T ;L ; NONE.  ; ; OUTPUTS: ;P ; NONE.C ;- 7 $SGFIN::MOV @#4,-(SP) ;SAVE CONTENTS OF TRAP 4 VECTORN   .IF DF P$$D70 3 MOV $SGFFR,-(SP) ;SAVE LAST $SGFIN FRAME POINTER 7 MOV @#114,-(SP) ;SAVE MAIN MEMORY TIMEOUT AND PARITY ' MOV 6(SP),-(SP) ;COPY RETURN ADDRESS.. MOV @#250,10(SP) ;SAVE SEGMENT TRAP ADDRESS$ MOV #20$,@#114 ;TRAP THESE FAULTS  .IFFI ' MOV 2(SP),-(SP) ;COPY RETURN ADDRESSG9 MOV @#250,4(SP) ;SAVE CONTENTS OF SEGMENT FAULT VECTOR  .IFTF . MOV #10$,@#4 ;POINT TO ROUTINE TO SET CARRY MOV #10$,@#250 ;P  ;O$ ; CONTENTS OF STACK AT THIS POINT: ; - ; 0(SP)=COROUTINE RETURN ADDRESS TO CALLER.I* ; 2(SP)=CONTENTS OF @#114 (IF DF P$$D70)) ; 4(SP)=SAVE $SGFFR CELL (IF DF P$$D70)) ; 6(SP)=CONTENTS OF @#4. ; 10(SP)=CONTENTS OF @#250 ;    .IFTM $ MOV SP,$SGFFR ;SAVE FRAME POINTER1 ADD #6,$SGFFR ;ADJUST TO POINT TO SAVED TRAP 4  .IFTF ! CALL @(SP)+ ;RETURN TO CALLERC  .IFT. 4 MOV (SP)+,@#114 ;RESTORE MAIN MEMORY TIMEOUT TRAP0 MOV (SP)+,$SGFFR ;RESTORE SAVED FRAME POINTER  .IFTF! '" MOV (SP)+,@#4 ;RESTORE TRAP 4 VECTORS5# BIC #160000,@#SR0 ;UNFREEZE MEMORY MANAGEMENT UNIT)0$ MOV (SP)+,@#250 ;RESTORE SEGMENT FAULT VECTOR&% RETURN ;RETURN TO CALLER'S CALLER& ' 10$: ;REFERENCE LABEL( ) .IFTM* + ;F,, ; TRAP 4 SERVICE FOR 11/70 CLASS MACHINES.- ; E. ; THIS TRAP SERVICE RESETS THE VECTOR AT FOUR, AND THEN ATTEMPTS TOLG/ ; CLEAR THE CPU ERROR REGISTER. IF THE REGISTER ISN'T THERE, WE WILLRE0 ; TRAP THRU FOUR, AND GO TO 15$, WHERE WE WILL CLEAR THE EQUAL BIT,I1 ; SET THE CARRY BIT, AND RTI. AFTER THE ATTEMPT TO CLEAR THE CPU ERRORMF2 ; REGISTER, WE CHECK THE CARRY TO SEE IF IT WAS REALLY THERE, AND IFE3 ; IT WAS, THEN WE CHECK IT TO SEE IF THIS WAS ONE OF THE CONDITIONSE4 ; THAT WE EXPECT IN $SGFIN. IF IT ISN'T, THEN WE ACT LIKE THIS WAS 5 ; A NORMAL TRAP TO FOUR.6 ;T7 +8 MOV #15$,@#4 ;RESET TRAP TO FOUR ADDRESSA#9 CLC ;SET UP CARRY PROPERLY NOWI1: BIC #60,@#177766 ;CLEAR OUT CPU ERROR REGISTER '; BCS 12$ ;IF CS REGISTER ISN'T THEREB(< BEQ 12$ ;IF EQ WE CLEARED IT ALL OUT= > ;TE? ; HERE WE HAVE FOUND A PROBLEM: WE HAVE TAKEN A TRAP THROUGH VECTORFC@ ; LOCATION 4, BUT THE REASON WAS NOT FOR NON-EXISTANT MEMORY. INTHA ; THIS CASE, WE WISH TO SIMULATE A TRAP THROUGH THE CONTENTS OF VECTORHB ; FOUR PRIOR TO THE TIME THAT $SGFIN PLACED ITS OWN VALUE IN IT. THISJC ; IS POINTED TO ON THE STACK BY THE $SGFFR POINTER. IT SEEMS REASONABLEHD ; TO SIMPLY DISPATCH THROUGH THAT LOCATION, WHICH WE WILL DO. IF THISFE ; IS NOT A GOOD IDEA, THIS IMPLEMENTATION WILL ALLOW UNTHREADING THEEF ; STACK UNTIL THE ULTIMATE RESOLUTION OF THE NESTED CALLS TO $SGFINFG ; IS EFFECTED.H ;HI ,J MOV @$SGFFR,-(SP) ;GET ADDRESS TO JUMP TOK JMP @(SP)+ ;JUMP THERECL 11$: MOV #104001,@#177744 ;CLEAR OUT MEMORY SYSTEM ERROR REGISTERE>M 12$: MOV #10$,@#4 ;RESET TRAP 4 (WHETHER IT NEEDS IT OR NOT)N O .IFTFP $Q 15$: BIC #4,2(SP) ;CLEAR EQUAL BITR BIS #1,2(SP) ;SET CARRY BITS RTIT U .IFTCV W ; X ; TRAP 114 SERVICEY ;GFZ ; THIS TRAP SERVICE ACCEPTS TRAPS TO 114 ON PDP-11/70 CLASS MACHINESF[ ; SO THAT ATTEMPTS TO REFERENCE NON-EXISTANT MEMORY BELOW THE SYSTEMF\ ; SIZE REGISTER DOESN'T LOOK LIKE A PARITY ERROR. THIS SERVICE ALSOC] ; ATTEMPTS TO VERIFY IF THE CAUSE OF THE TRAP TO 114 IS IN FACT AEC^ ; NON-EXISTANT MEMORY CONDITION, OR IF IT WAS 00xv;vtccccSOME OTHER PROBLEM.TF_ ; IF IT WAS SOME OTHER PROBLEM, TRANSFER IS MADE TO THE PARITY ERRORF` ; SERVICE ROUTINE. IF IT WAS NON-EXISTANT MEMORY, THEN THE REGISTER2a ; IS CLEARED AND THE NORMAL CODE FLOW REENTERED.b ;OGc ; A SPECIAL CASE EXISTS IN THE CASE WHERE A TRAP 114 OCCURRED, AND WETEd ; ARE NOT ON A SYSTEM WITH A MEMORY SYSTEM ERROR REGISTER. IN THISEIe ; CASE, THE CMP ACCESS WILL FAIL, TRAPPING THRU 4, WHICH WILL ENCOUNTEROIf ; THE CODE IN $SGFIN MENTIONED ABOVE. THIS CODE WILL CLEAR THE EQ BIT,HFg ; SO THAT THE COMPARISON WILL FAIL, CAUSING A TRANSFER TO THE PARITYJh ; ERROR SERVICE ROUTINE. THIS IS THE DESIRED RESULT, SINCE THE ONLY WAYLi ; WE COULD TRAP TO 114 ON A MACHINE WITHOUT A MEMORY SYSTEM ERROR REGISTERCj ; (OR SYSTEM SIZE REGISTER) WAS TO ENCOUNTER A REAL PARITY ERROR.Rk ; l 9m 20$: CMP #104001,@#177744 ;IS THIS MAIN MEMORY TIMEOUT? .n BEQ 11$ ;IF EQ YES -- SET CARRY AND RETURNo p .IF DF P$$RTYq *r JMP $PARER ;NO -- THIS IS PARITY ERRORs t .IFF ; DF P$$RTYTu >v BGCK$A BF.PAR,BE.SGN,HALT ;PARITY ERROR, P$$RTY NOT DEFINEDw x .ENDC ; DF P$$RTYy z { .ENDC| } ~ ;+ ; **$SWSTK-SWITCH STACKS ;CB ; THIS ROUTINE IS CALLED FROM TASK LEVEL TO SWITCH TO THE SYSTEMB ; STACK THUS INHIBITING TASK SWITCHING. THE CALLING TASK MUST BED ; PRIVILEGED IF RUNNING IN A MAPPED SYSTEM AND MAPPED TO THE EXEC.D ; CONTROL IS PASSED HERE FROM DRDSP AFTER THE TRAP HAS OCCURED AND ; $DIRSV HAS BEEN CALLED.  ;I ; CALLING SEQUENCE:. ; % ; EMT 376 ;TRAP TO $EMSST IN DRDSP,1 ; .WORD ADDR ;ADDRESS FOR RETURN TO USER STATEC ;  ; INPUTS AT THIS POINT:  ;. ; R3=ADDRESS OF PC WORD OF TRAP ON STACK + 2 ;I ; MAPPED SYSTEM: ;L ; 22(SP)=PS PUSHED BY TRAP ; 20(SP)=PC PUSHED BY TRAP ; 16(SP)=SAVED R5A ; 14(SP)=SAVED R4L ; 12(SP)=SAVED R3M ; 10(SP)=SAVED R2E ; 06(SP)=SAVED R1O ; 04(SP)=SAVED R0F) ; 02(SP)=RETURN ADDRESS FOR SYSTEM EXIT  ; 00(SP)=104376A ; ; OUTPUTS: ; B ; THE USER IS CALLED BACK ON THE SYSTEM STACK WITH ALL REGISTERSB ; PRESERVED. TO RETURN TO TASK LEVEL THE CALLER MERELY EXECUTES ; A RETURN.  ;A? ; NOTE: PRIVILEGED TASKS MAY ONLY CALL $SWSTK FROM SUPERVISOR:; ; MODE IF BOTH SUPERVISOR MODE AND KERNEL DATA SPACE ARE ; ; SUPPORTED IN THE EXEC. FURTHERMORE, THEY MUST ONLY DOS+ ; SO WITH CODE RUNNING IN APRS 5, 6 & 7.V ;- - $SWSTK::BICB #357,(R3) ;SET INITIAL PS WORDO  .IF DF K$$DAS&S$$LIB4 + TST $STACK-2 ;CALL FROM SUPERVISOR MODE?A BMI 5$ ;IF MI NO% MOV SDSAR5,KDSAR5 ;COPY SUPERVISORE" MOV SDSAR6,KDSAR6 ;DATA MAPPING. MOV SISAR5,KINAR5 ;COPY SUPER INSTR MAPPING MOV SISAR6,KINAR6 ; MOV SISAR7,KINAR7 ;! BR 10$ ;FINISH IN COMMON CODEV  .ENDC  + 5$: MOV #UINAR5,R5 ;POINT TO USER I APR 5F  .IF DF K$$DAS  .IF DF U$$DAS 5 MOV UDSAR0-UINAR0(R5),KDSAR5 ;SET UP KERNEL DATA 5#  .IFF ; DF U$$DASW ( MOV (R5),KDSAR5 ;SET UP KERNEL DATA 5  .ENDC ; DF U$$DAS  .IFTF ; DF K$$DAS ) MOV (R5)+,KINAR5 ;SET UP KERNEL INST 5E  .IFT ; DF K$$DASA  .IF DF U$$DAS 5 MOV UDSAR0-UINAR0(R5),KDSAR6 ;SET UP KERNEL DATA 6;  .IFF ;DF U$$DAS ( MOV (R5),KDSAR6 ;SET UP KERNEL DATA 6  .ENDC ;DF U$$DASU  .ENDC ;DF K$$DAS   .IF DF K$$DAS&U$$DAS ) MOV (R5)+,KINAR6 ;SET UP KERNEL INST 6R) MOV (R5)+,KINAR7 ;SET UP KERNEL INST 7F  .IFFW ( MOV (R5),KINAR6 ;SET UP KERNEL INST 6  .ENDC ;DF K$$DAS&U$$DAS  ) 10$: MOV -(R3),R5 ;PICK UP TRAP PC WORDU  .IF DF U$$DAS!K$$DAS&S$$LIB 4 MFPI (R5)+ ;GET ADDRESS FOR RETURN TO USER STATE0 MOV (SP)+,(R3) ;FROM CORRECT SPACE AND SET IT ! .IFF ; DF U$$DAS!K$$DAS&S$$LIBR 7 MOV (R5)+,(R3) ;SET ADDRESS FOR RETURN TO USER STATE  " .ENDC ; DF U$$DAS!K$$DAS&S$$LIB % MOV R5,(SP) ;SET CALLER'S ADDRESSM MOV -(R3),R5 ;RESTORE R5L MOV 12(SP),R3 ;RESTORE R3 ;+ ; ** W A R N I N G **  ;6 ; SPM HOOKPOINT NUMBER 70. ; +00xv)vttt tfDATA ; DO NOT CHANGE THE INSTRUCTION FOLLOWINGR ; LABEL WITHOUT CHECKING SPM ;- - $SPH70==. ;SPM CHANGES THE INSTRUCTION ATR! ;THE LOCATION OF THIS LABELR ! CALLR @(SP)+ ;CALL THE CALLERU  ;+( ; **-$LSUPD-LOAD SUPERVISOR DATA SPACE ;FC ; THIS ROUTINE IS CALLED BEFORE TRANSFERRING CONTROL TO A TASK INA ; SUPERVISOR MODE TO LOAD SUPERVISOR D SPACE FROM USER I SPACE.L ;M ; INPUTS:; ;R ; NONE. ;* ; OUTPUTS: ; ; R2 AND R3 ARE PRESERVED. ;-   .IF DF S$$LIB D $LSUPD::BIC #^CPSMODE&PMODE,PS ;SWITCH PREVIOUS MODE TO SUPERVISOR/ $LSUP1:: ;GLOBAL ENTRY WHICH DOESN'T AFFECTT ;MODE BITS IN THE PSW . LSUPD1: BIS #10,SR3 ;ENABLE CSM INSTRUCTION' MOV #UISDR0,R0 ;POINT TO USER D PDR0( MOV #SDSDR0,R1 ;POINT TO SUPER D PDR0% MOV R3,-(SP) ;SAVE A WORK REGISTERU  .IF DF X$$HDR . MOV KISAR6,-(SP) ;SAVE CURRENT EXEC MAPPING/ MOV $SAHDB,KISAR6 ;MAP TO HEADER IF EXTERNAL! " .IFTF ; DF X$$HDR# ,$ MOV $SAHPT,R3 ;GET ADDRESS OF TASK HEADER'% MOVB H.SMAP(R3),R3 ;GET MAPPING MASK #& BNE 30$ ;IF NE MAPPING IS MIXEDB' H( ; THIS SECTION HANDLES THE UNMIXED CASE (ALL SUPER D MAPPED TO USER D)/) ; IN STRAIGHT LINE CODE FOR PERFORMANCE SAKE. * 4+ 10$: MOV (R0)+,(R1)+ ;COPY USER I TO SUPER D SPACE, MOV (R0)+,(R1)+ ;- MOV (R0)+,(R1)+ ;. MOV (R0)+,(R1)+ ;/ MOV (R0)+,(R1)+ ;0 MOV (R0)+,(R1)+ ;1 MOV (R0)+,(R1)+ ;2 MOV (R0),(R1) ;3 CMP R1,#SDSAR7 ;DONE YET?4 BEQ 20$ ;IF EQ YES'5 MOV #UISAR0,R0 ;POINT TO USER I APR0(6 MOV #SDSAR0,R1 ;POINT TO SUPER D APR07 BR 10$ ;PERFORM COPY8 20$:9 .IFT ; DF X$$HDRI: 2; MOV (SP)+,KISAR6 ;RESTORE PREVIOUS EXEC MAPPING< = .IFTF ; DF X$$HDR> &? MOV (SP)+,R3 ;RESTORE WORK REGISTER @ RETURN ;YA GB ; THIS SECTION HANDLES THE MIXED CASE WHERE SOME OF SUPER D IS MAPPED(BC ; TO USER D AND SOME IS MAPPED TO SUPER I BY INTERPRETING H.SMAPD *E 30$: MOV R2,-(SP) ;SAVE ANOTHER REGISTER-F MOV #SISDR0,R2 ;POINT TO SUPER I REGISTERSI2G BIS #100000,R3 ;SET DONE FLAG BIT INTO REGISTER*H ASLB R3 ;ADJUST REGISTER FOR FACT THAT*I ;BIT ZERO OF MAP CORRESPONDS TO APR1)J 40$: ASR R3 ;CHECK NEXT BIT (NEXT APR)G-K BCC 50$ ;IF CC NEXT APR MAPS USER D SPACE 7L MOV SISAR0-SISDR0(R2),SDSAR0-SDSDR0(R1) ;SET ADDRESSI)M MOV (R2)+,(R1)+ ;SET ACCESS AND LENGTHE$N TST (R0)+ ;ADJUST USER D POINTERO BR 60$ ;ON TO NEXT ONE;P 50$: MOV UISAR0-UISDR0(R0),SDSAR0-SDSDR0(R1) ;SET ADDRESST)Q MOV (R0)+,(R1)+ ;SET ACCESS AND LENGTHI%R TST (R2)+ ;ADJUST SUPER I POINTERGS 60$: TSTB R3 ;MORE TO GO ? T BPL 40$ ;IF PL YES"U MOV (SP)+,R2 ;RESTORE REGISTERSV W .IFT ; DF X$$HDRRX 2Y MOV (SP)+,KISAR6 ;RESTORE PREVIOUS EXEC MAPPINGZ [ .ENDC ; DF X$$HDR\ ] MOV (SP)+,R3 ;FOR RETURND ^ RETURN ;D_ ` a .ENDCb c d ;+?e ; **-CKMAP-CHECK TASK MAPPING TO DETERMINE IF IT CAN RUN NOW.0f ;NFg ; THIS ROUTINE DETERMINES IF THERE ARE MULTIPLE RUNNING TASKS MAPPEDh ; TO THE SAME REGION.Ei ;E j ; INPUTS:Ik ;TCl ; R2=HEADER ADDRESS FOR TASK BEING TESTED FOR ELIGIBILITY TO RUN. @m ; R5=TCB ADDRESS FOR TASK BEING TESTED FOR ELIGIBILITY TO RUN.n ; o ; OUTPUTS:p ;Mq ; C=0 IF TASK CAN RUN NOW.>r ; C=1 IF TASK CANNOT RUN NOW BECAUSE THERE ARE OTHER RUNNING;s ; TASKS MAPPED TO A REGION WHICH THIS TASK IS MAPPED TO.t ;*u ;-v w $CKMAP::x y z .IF DF M$$PRO{ &| CLR -(SP) ;ASSUME TASK CAN RUN NOW} MOV R0,-(SP) ;SAVE REGISTERSA~ MOV R1,-(SP) ;T MOV R2,-(SP) ;  MOV R3,-(SP) ;  MOV R4,-(SP) ;D  .IF DF X$$HDR ) MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGE  .IFTF ; DF X$$HDR < MOV H.WND(R2),R0 ;POINT TO # OF WINDOWS IN TASK TO BE RUN- MOV (R0)+,-(SP) ;GET THE NUMBER OF WINDOWSC  10$: ;REFERENCE LABEL .IFT ; DF X$$HDRR 2 MOV #$DICSV,R3 ;POINT TO INTERMEDIATE SAVE AREA$ MOV R0,(R3)+ ;SAVE WINDOW ADDRESS   .REPT C / MOV (R0)+,(R3)+ ;COPY ADDR WNDW TO SAVE AREAR  .ENDR 6 SUB #W.BLGH,R3 ;POINTER00xvyvtcccc TO BEGINNING OF WINDOW AREA+ MOV R3,R0 ;POINT TO WINDOW IN SAVE AREAS   .IFTF ; DF X$$HDR  TST (R0) ;IS WINDOW MAPPED?) BEQ 90$ ;IF EQ NOO   .IFTF ; DF X$$HDR / MOV #M$$PRO,R1 ;GET THE NUMBER OF PROCESSORS % MOV #$TKTAB,R2 ;POINT TO TCB TABLE) 20$: MOV (R2)+,R3 ;GET NEXT TCB ADDRESSE3 BEQ 80$ ;IF EQ THERE IS NO CURRENT TASK ON PROC CMP R5,R3 ;IS THIS OUR TCB?M BEQ 80$ ;IF EQ YES SKIP IT= BIT #T4.SNC,T.ST4(R3) ;DOES TASK SYNCHRONIZE THRU COMMONS?E BEQ 80$ ;IF EQ NO/ BIT #^C,T.STAT(R3) ;IS TASK BLOCKED? BNE 80$ ;IF NE YES? BIT #T2.STP!T2.WFR,T.ST2(R3) ;IS TASK STOPPED OR IN WAITFOR?  BNE 80$ ;IF NE YES3 MOV T.PCB(R3),R3 ;GET ADDRESS OF TASK REGION PCBR  .IFT ; DF X$$HDRI , MOV P.REL(R3),KISAR6 ;MAP EXTERNAL HEADER, MOV P.HDR(R3),R3 ;GET TASK HEADER ADDRESS( BNE 25$ ;IF NE, TASK HAS POOL HEADER4 MOV #140000,R3 ;OTHERWISE, TASK HAS EXTRNL HEADER 25$: ;REFERENCE LABEL  .IFF ; DF X$$HDR / MOV P.HDR(R3),R3 ;GET ADDRESS OF TASK HEADER   .IFTF ; DF X$$HDR / MOV H.WND(R3),R3 ;POINT TO NUMBER OF WINDOWS - MOV (R3)+,-(SP) ;GET THE NUMBER OF WINDOWSE0 30$: CMP (R0),(R3) ;MAPPED TO THE SAME REGION? BNE 70$ ;IF NE NO ? CMP W.BOFF(R0),W.BOFF(R3) ;DOES TASK TO BE RUN HAVE A REGIONM* ;WHICH OVERLAPS THE REGION OF A TASK$ ;RUNNING ON ANOTHER PROCESSOR? BEQ 60$ ;IF EQ YES BHI 50$ ;IF HI MAYBE< MOV W.BOFF(R0),R4 ;SAVE REGION OFFSET FOR TASK TO BE RUN2 ADD W.BSIZ(R0),R4 ;CALCULATE END OF MAPPED AREA' CMP R4,W.BOFF(R3) ;REGIONS OVERLAP?D BHI 60$ ;IF HI YES" BR 70$ ;REGIONS DO NOT OVERLAP= 50$: MOV W.BOFF(R3),R4 ;GET REGION OFFSET FOR RUNNING TASKA2 ADD W.BSIZ(R3),R4 ;CALCULATE END OF MAPPED AREA* CMP R4,W.BOFF(R0) ;DO REGIONS OVERLAP? BLOS 70$ ;IF LOS NOP9 60$: INC 16(SP) ;INDICATE OVERLAP, TASK CANNOT RUN NOW? TST (SP)+ ;CLEAN THE STACK BR 100$ ;Y; 70$: ADD #W.BLGH,R3 ;POINT TO NEXT WINDOW IN RUNNING TASKR DEC (SP) ;ANY MORE WINDOWS?T BNE 30$ ;IF NE YES TST (SP)+ ;CLEAN THE STACK8 80$: SOB R1,20$ ;CONTINUE SCAN WITH NEXT RUNNING TASK  .IFF ; DF X$$HDRF = 90$: ADD #W.BLGH,R0 ;POINT TO NEXT WINDOW OF TASK TO BE RUN4  .IFT ; DF X$$HDR  A 90$: MOV 2(SP),KISAR6 ;RESTORE POSSIBLE MAPPING TO XTRNL HEADERN3 ADD #W.BLGH,-(R0) ;SET UP POINTER TO NEXT WINDOW  MOV (R0),R0 ;P  .IFTF ; DF X$$HDR  DEC (SP) ;ANY MORE WINDOWS?I BNE 10$ ;IF NE YES# 100$: TST (SP)+ ;CLEAN THE STACKN  .IFT ; DF X$$HDRE - MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING,  .ENDC ; DF X$$HDR " MOV (SP)+,R4 ;RESTORE REGISTERS MOV (SP)+,R3 ;# MOV (SP)+,R2 ;  MOV (SP)+,R1 ;  MOV (SP)+,R0 ;.5 ROR (SP)+ ;CLEAN STACK AND RETURN STATUS IN CARRYP RETURN ;   .ENDC   .ENDH,-(R0) ;SET UP POINTER TO NEXT WINDOW  MOV (R0),R0 ;P  .IFTF ; DF X$$HDR  DEC (SP) ;ANY MORE WINDOWS?I BNE 10$ ;IF NE YES .TITLE DVINTT .IDENT /03.01/R ;TC; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;P<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; P. J. BEZEREDI 04-OCT-77;F; +; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:I; ; P. J. BEZEREDI; ; T. LEKASM; ;+; MODIFIED BY:;E; J. W. BERZLE 07-SEP-83 03.00; 2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;E ; B. S. MCCARTHY 30-MAy-84 03.01;/; BM309 -- STREAMLINE PORCESSING OF INTERRUPTSL;U;E;C;OB; OVERLAPPED SEEK/MIXED MASSBUS/LOADABLE DRIVER INTERRUPT ROUTINES1; FOR RH11/RH70(DB,DR,DS,MM,MF,EM) AND RK611(DM). ;O; MACRO LIBRARY CALLSF;C1 .MCALL DCBDF$,HWDDF$,KRBDF$,PCBDF$,SCBDF$,BGCK$A DCBDF$ ;DEFINE DCB OFFSETSS$ HWDDF$ ;DEFINE HARDWARE REGISTERS KRBDF$ ;DEFINE KRB OFFSETSI# PCBDF$ ;DEFINE PARTITION OFFSETS0 SCBDF$ ;DEFINE SCB OFFSETSH;A; EQUATED SYMBOLSD;00yv)vttt tfDATA ;RH11/70 REGISTER OFFSETS./RHCS2= 10 ;OFFSET TO CONTROL STATUS RGISTER 2R0RHAS= 16 ;OFFSET TO ATTENTION SUMMARY REGISTER)RHDT= 26 ;OFFSET TO DRIVE TYPE REGISTER  ;RK611 REGISTER OFFSETS)0RKCS2= 10 ;OFFSET TO CONTROL STATUS REGISTER 2/RKAS= 16 ;OFFSET TO ATTENTION/OFFSET REGISTER&IE= 100 ;INTERRUPT ENABLE BIT IN CSR CERR= 100000 ;ERROR BIT IN CSRRDY= 200 ;READY BIT IN CSR;+@; THIS MACRO DEFINES THE CODE USED TO SET THE INTERRUPT PRIORITYB; AND CALCULATE THE CONTROLLER INDEX. ON NON D-SPACE SYSTEMS, THEA; ROUTINE $INTSE IS CALLED. FOR D-SPACE SYSTEMS, CODE TO EMULATETB; THE ROUTINE $INTSE IS USED TO LOAD THE NEW PRIORITY DIRECTLY AND4; THEN RETURN BACK INTO THE MAINLINE CODE IN $INTSE.;CA; NOTE: CHANGES TO THIS MACRO MUST FOLLOW ANY CHANGES IN THE CODEG9; IN $INTSE (SYSXT) AND THE CLOCK INTERRUPT CODE (TDSCH).0;- .MACRO INTSAV .IF NDF K$$DAS - JSR R5,$INTSE ;;;CALL INTERRUPT SAVE ROUTINES) .WORD ^C&PR7 ;;;NEW PRIORITY IS PR5C .IFF 0 JSR R5,(PC) ;;;SAVE R5 WITHOUT DISTURBING CC'S0 JSR R4,(PC) ;;;SAVE R4 WITHOUT DISTURBING CC'S/ MFPS R4 ;;;GET PSW INCLUDING CONTROLLER INDEXD/ BIC #^C<17>,R4 ;;;ISOLATE THE CONTROLLER INDEXK ASL R4 ;;;MAKE IT A WORD INDEX DEC $STKDP ;;;SWITCH STACKS?51$: BIC #^C&PR7,@#PS ;;;SET NEW PRIORITY TO PR5S+ CACHE$ SAVE ;;;SAVE BYPASS STATE OF CACHE4 MOV #$INTSF,-(SP) ;;;SET TO RETURN BACK INTO $INTSE .ENDC .ENDM INTSAV ;+'; **-$RHALT-RH11/RH70 INTERRUPT HANDLERC;C; THIS ROUTINE IS ENTERED DIRECTLY VIA AN RH11/70 INTERRUPT VECTOR.PD; USING THE CONTROLLER INDEX, THE KRB OF THE INTERRUPTING RH11/70 ISB; FOUND. IF THE INTERRUPT WAS FROM A DATA TRANSFER OPERATION, THEF; INITIAL ATTENTION BIT SCAN IS BYPASSED AND A FORK BLOCK IS QUEUED TOF; THE DRIVER. IF THE INTERRUPT WAS CAUSED BY A POSITIONING OPERATION,E; THE CURRENT ACTIVE ATTENTION BITS ARE USED TO INDEX INTO A TABLE OF D; UCB ADDRESSES AND A CALL IS MADE TO THE PROPER UNIT'S DRIVER WHICHE; THEN IMMEDIATELY $FORK AND RETURN HERE WHERE THE NEXT ATTENTION BITNC; WILL BE TESTED. WHEN ALL EIGHT ATTENTION BITS HAVE BEEN TESTED AUF; CHECK IS MADE TO SEE IF ANY ATTENTIONS MAY HAVE COME UP. IF SO, THEA; ALGORITHM IS REPEATED UNTIL NO ATTENTIONS BITS REMAIN SET. ALLLC; ATTENTIONS FROM UNITS WHICH ARE NOT CONFIGURED INTO THE DATA BASEI; WILL BE EXPLICITLY CLEARED.N;CE; IF THE RH CONTROLLER HAS A UNIT WHICH HAS SLAVE UNITS (TM02/03) THE G; ATTENTION WILL BE CLEARED BASED ON THE MASTER'S UNIT NUMBER (U.UNIT).$E; IF OVERLAPPED OPERATIONS ARE ENABLED AND NO DATA TRANSFER CURRENTLYWE; IS ACTIVE, THE MASTER'S DRIVER WILL BE CALLED WITH THE UCB FOUND INE; THE UCB LIST.S;Y ; INPUTS:U; NONE.,;E ; OUTPUTS:@; ATTENTION REGISTER CLEARED (ALL PENDING ATTENTIONS PROCESSED).;S5; ALL REGISTERS ARE PRESERVED (R4 AND R5 VIA $INTSE).I;- .IF DF R$$HDV0$RHALT::INTSAV ;;;CALL $INTSE AND SET PRIORITY MOV R3,-(SP) ;;;SAVE REGISTERS MOV R2,-(SP) ;;;... MOV R1,-(SP) ;;;... MOV R0,-(SP) ;;;...8 MOV $RHCTB(R4),R3 ;;;GET KRB OF INTERRUPTING CONTROLLER(5$: MOV (R3),R4 ;;;GET IT'S CSR ADDRESS4 ADD #RHAS,R4 ;;;POINT TO ATTENTION SUMMARY REGISTER5 BIT #KS.DIP,K.STS(R3) ;;;DATA TRANSFER IN PROGRESS?: BNE 80$ ;;;IF NE YES#10$: MOV R3,R5 ;;;COPY KRB ADDRESSS' ADD K.OFF(R3),R5 ;;;POINT TO UCB TABLER% TSTB (R4) ;;;ANY ATTENTIONS ACTIVE? % BNE 20$ ;;;IF NE ATTENTIONS WERE UPS&15$: MOV (SP)+,R0 ;;;RESTORE REGISTERS MOV (SP)+,R1 ;;;... MOV (SP)+,R2 ;;;... MOV (SP)+,R3 ;;;...* RETURN ;;;RETURN TO INTERRUPTED PROCESS;I%; ATTENTIONS WERE FOUND TO BE ACTIVE. ;;420$: MOV #177001,R1 ;;;PRESET ATTENTION SUMMARY MASK+25$: BITB R1,(R4) ;;;IS THIS ATTENTION UP?  BNE 40$ ;;;IF NE YES,30$: TST (R5)+ ;;;POINT TO NEXT UCB ADDRESS" CMP #-1,(R5) ;;;END OF UCB TABLE? BEQ 35$ ;;;IF EQ YES$ ASL R1 ;;;NO, SHIFT ATTENTION MASK- BCC 10$ ;;;IF CC ALL ATTENTION BITS SCANNED, TSTB (R4) ;;;ANY ATTENTIONS STILL PENDING? BEQ 15$ ;;;IF EQ NOP BR 25$ ;;;TRY THE NEXT ONE035$: SWAB R1 ;;;PUT REMAINI00yvvtccccNG MASKS IN LOW BYTE1 BITB R1,(R4) ;;;UNCONFIGURED ATTENTIONS ACTIVE?: BEQ 10$ ;;;IF EQ NOE, MOVB (R4),R2 ;;;COPY ACTIVE ATTENTION BITS COMB R1 ;;;TOGGLE MASK BITS43 BICB R1,R2 ;;;ISOLATE UNCONFIGURED ATTENTION BITSB2 MOVB R2,(R4) ;;;DROP ALL UNCONFIGURED ATTENTIONS' BR 10$ ;;;TRY FOR MORE ATTENTION BITST;T8; AT THIS POINT WE ARE POINTING TO THE UCB ADDRESS OF AN; ACTIVE ATTENTION.T;I%40$: MOV (R5),R2 ;;;COPY UCB ADDRESSN$ BNE 45$ ;;;IF NE UCB REALLY EXISTS, MOVB R1,(R4) ;;;DROP THIS UNIT'S ATTENTION$ BR 30$ ;;;LOOP FOR MORE ATTENTIONS(45$: MOV U.SCB(R2),R2 ;;;GET SCB ADDRESS< BITB #S3.ATN,S.ST3(R2) ;;;WILL DRIVER CLEAR THE ATTENTION? BNE 50$ ;;;IF NE YES, MOVB R1,(R4) ;;;DROP THIS UNIT'S ATTENTION)50$: MOV (R5),R5 ;;;RETREIVE UCB ADDRESSO(55$: CALL MAPDRV ;;;MAP AND CALL DRIVER3 BIT #KS.DIP,K.STS(R3) ;;;DATA TRANSFER INTERRUPT?D BEQ 10$ ;;;IF EQ NOT>70$: BIC #KS.DIP,K.STS(R3) ;;;RESET DATA TRANSFER IN PROGRESS" BR 5$ ;;;TRY FOR MORE ATTENTIONS;4 ; DATA TRANSFER WAS IN PROGRESS.; 080$: MOV K.OWN(R3),R5 ;;;GET OWNER'S UCB ADDRESS$ MOV U.SCB(R5),R0 ;;;GET SCB ADDRESS< BITB #S3.ATN,S.ST3(R0) ;;;WILL DRIVER CLEAR THE ATTENTION? BNE 55$ ;;;IF NE YES. MOVB U.UNIT(R5),R2 ;;;GET OWNER'S UNIT NUMBER# ASL R2 ;;;CONVERT TO A WORD INDEXL5 MOV $BTMSK(R2),(R4) ;;;ALWAYS DROP OWNER'S ATTENTION)1 BITB #S3.SLV,S.ST3(R0) ;;;SLAVE UNIT SUPPORTED?N BNE 55$ ;;;IF NE YES3 MOV #70$,-(SP) ;;;ADDRESS TO RETRUN TO AFTER $FORK;) CALLR FRKDRV ;;;FAKE THE DRIVER'S $FORKE .ENDC;+-; **-$DMALT-RK611 RK06/RK07 INTERRUPT HANDLERA;EC; THIS ROUTINE IS ENTERED DIRECTLY FROM THE RK611 INTERRUPT VECTOR.;B; USING THE CONTROLLER INDEX, THE KRB OF THE INTERRUPTING RK611 ISH; FOUND. IF THE INTERRUPT WAS CAUSED BY THE CONTROLLER, THE POSITIONINGH; FLAG IN THE UNIT'S UCB IS TESTED TO SEE IF A DRIVE INTERRUPT IS FORTH-G; COMING. IT ONE IS, THE INTERRUPT IS DISMISSED. IF NOT, A FORK BLOCKPE; IS QUEUED TO THE DRIVER. AN INTERRUPT FROM THE DRIVE (USUALLY FROMED; A POSITIONING OPERATION) WILL CAUSE THE ATTENTION BITS ARE USED TOF; INDEX INTO A TABLE OF UCB ADDRESSES AND A CALL IS MADE TO THE PROPER ; DRIVER. S; C; IF AN UNCONFIGURED (IN THE DATA BASE) UNIT RAISES IT'S ATTENTION, C; WE WILL CRASH THE SYSTEM WITH R0 CONTAINING THE CURRENT ATTENTIONGE; BITS IN THE HIGH BYTE. THIS IS BECAUSE THE ONLY METHOD OF CLEARINGOD; AN ATTENTION IS TO SELECT AND CLEAR THE DRIVE AT THE DRIVER LEVEL.=; THIS CANNOT BE DONE BECAUSE THE UNIT HAS NO DATA STRUCTURE.Y;O ; INPUTS:I; NONE.P;T ; OUTPUTS:; NONE.T;T5; ALL REGISTERS ARE PRESERVED (R4 AND R5 VIA $INTSE).S;- .IF DF R$$6110$DMALT::INTSAV ;;;CALL $INTSE AND SET PRIORITY' MOV R3,-(SP) ;;;SAVE WORKING REGISTERSN MOV R2,-(SP) ;;;... MOV R1,-(SP) ;;;... MOV R0,-(SP) ;;;...8 MOV $DMCTB(R4),R3 ;;;GET KRB OF INTERRUPTING CONTROLLER(5$: MOV (R3),R4 ;;;GET IT'S CSR ADDRESS5 BIT #KS.DIP,K.STS(R3) ;;;DATA TRANSFER IN PROGRESS?  BNE 60$ ;;;IF NE YES) CLR R1 ;;;PRESET INITIAL ATTENTION MASK )10$: MOV (R3),R4 ;;;RETREIVE CSR ADDRESST MOV R3,R5 ;;;COPY KRB ADDRESSE' ADD K.OFF(R3),R5 ;;;POINT TO UCB TABLED1 MOV RKAS(R4),R0 ;;;GET ATTENTION/OFFSET REGISTER ' BIC #377,R0 ;;;ISOLATE ATTENTION BITSE% SWAB R0 ;;;PUT THEM IN THE LOW BYTE,% CMP R0,R1 ;;;ANY NEW ATTENTIONS UP?V BNE 20$ ;;;IF NE YES&15$: MOV (SP)+,R0 ;;;RESTORE REGISTERS MOV (SP)+,R1 ;;;... MOV (SP)+,R2 ;;;...$ MOV (R4),R3 ;;;GET CONTENTS OF CSR3 BIC #RDY!CERR,R3 ;;;CLEAR THE READY AND ERROR BITSI, BIS #IE,R3 ;;;SET THE INTERRUPT ENABLE BIT$ MOV R3,(R4) ;;;REENABLE INTERRUPTS! MOV (SP)+,R3 ;;;RESTORE REGISTERP* RETURN ;;;RETURN TO INTERRUPTED PROCESS;E%; ATTENTIONS WERE FOUND TO BE ACTIVE.;;O020$: BIC R1,R0 ;;;ISOLATE LATEST ATTENTION BITS& BIS R0,R1 ;;;SET LATEST BITS IN MASK,25$: ASR R0 ;;;IS THIS UNIT'S ATTENTION UP? BCS 40$ ;;;IF CS YES,30$: TST (R5)+ ;;;POINT TO NEXT UCB ADDRESS" CMP #-1,(R5) ;;;END OF UCB TABLE?$ BNE 25$ ;;;IF NE NO, TRY NEXT UNIT% TST R0 ;;;ANY ATTENTIONS REMAINING?E00yw)vttt tfDATA BEQ 10$ ;;;IF EQ NOB,35$: MOV R1,R0 ;;;GET LATEST ATTENTION BITSH BGCK$A BF.DVI,BE.FHW,FATAL ;;;UNCONFIGURED DEVICE RAISED ATTENTION BITS% BR .-2 ;;;DON'T TEMPT THE SYSTEM!!!I;;; WE FOUND AN ACTIVE ATTENTION.L;S)40$: MOV R5,R4 ;;;COPY UCB TABLE POINTER MOV (R5),R5 ;;;GET UCB ADDRESS, BEQ 35$ ;;;IF EQ UNIT NOT IN CONFIGURATION$ CALL MAPDRV ;;;MAP AND CALL DRIVER TST R0 ;;;ANY MORE ATTENTIONS? BEQ 10$ ;;;IF EQ NO ) MOV R4,R5 ;;;RETREIVE UCB TABLE POINTER  BR 30$ ;;;TRY FOR MORE;1 ; DATA TRANSFER WAS IN PROGRESS.;G060$: MOV K.OWN(R3),R5 ;;;GET OWNER'S UCB ADDRESS. BITB #3,U.CW2+1(R5) ;;;POSITIONING OPERATION? BEQ 65$ ;;;IF EQ NOP+ MOVB U.UNIT(R5),R2 ;;;RETREIVE UNIT NUMBERT! ASL R2 ;;;CONVERT TO WORD INDEXP0 MOV $BTMSK(R2),R2 ;;;GET CORRESPONDING BIT MASK$ SWAB R2 ;;;PUT IT IN THE HIGH BYTE1 BIT R2,RKAS(R4) ;;;IS OWNER'S ATTENTION BIT SET?2 BEQ 80$ ;;;IF EQ NO, CONTROLLER CAUSED INTERRUPT765$: MOV #80$,-(SP) ;;;ADDRESS TO RETURN TO AFTER $FORK ) CALLR FRKDRV ;;;FAKE THE DRIVER'S $FORKN>80$: BIC #KS.DIP,K.STS(R3) ;;;RESET DATA TRANSFER IN PROGRESS# BR 5$ ;;;TRY FOR OTHER ATTENTIONS  .ENDC;+; **-MAPDRV-MAP AND CALL DRIVER); 9; THIS SUBROUTINE WILL SAVE THE CURRENT INTERRUPT CONTEXTP=; (R4 & R5), MAP THE DRIVER, SET THE ERROR LOGGING BITMAP AND;A; CALL THE DRIVER. THE DRIVER IS THEN UNMAPPED AND THE INTERRUPTB; CONTEXT IS RESTORED.;Q ; INPUTS:L-; R3 = KRB ADDRESS OF INTERRUPTING CONTROLLERD'; R5 = UCB ADDRESS OF INTERRUPTING UNITK; ; OUTPUTS:; R2 IS DESTROYED0;B; DRIVERS ARE CALLED WITH:; R3 = CURRENT KRB ADDRESS'; R4 = SCB ADDRESS OF INTERRUPTING UNIT'; R5 = UCB ADDRESS OF INTERRUPTING UNITD;- .IF DF R$$HDV!R$$611I(MAPDRV: MOV R4,-(SP) ;;;SAVE CSR ADDRESS' MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCBG( CMP R3,S.KRB(R4) ;;;DO THE KRB'S MATCH?- BNE 40$ ;;;IF NE NO, UNIT IS ON ANOTHER KRBO' MOV U.DCB(R5),R2 ;;;GET ADDRESS OF DCB=, MOV KINAR5,-(SP) ;;;SAVE KERNEL INSTR APR 5 U A .IF DF K$$DAS I+ MOV KDSAR5,-(SP) ;;;SAVE KERNEL DATA APR 5  .IFTF R, MOV D.PCB(R2),R4 ;;;GET DRIVERS PCB ADDRESS) BEQ 10$ ;;;IF EQ DRIVER IS PART OF EXEC59 MOV P.REL(R4),KINAR5 ;;;MAP DRIVER IN INSTRUCTION SPACEV $ .IFT D2 MOV P.REL(R4),KDSAR5 ;;;MAP DRIVER IN DATA SPACE  .IFTF E=10$: MOV D.DSP(R2),R4 ;;;GET ADDRESS OF DRIVER DISPATCH TABLE % BEQ 30$ ;;;IF EQ DRIVER IS UNLOADEDM: MOV D.VINT+2(R4),-(SP) ;;;GET DRIVER'S INTERRUPT ADDRESS, ADD #2,(SP) ;;;POINT TO SECOND ENTRY POINT) MOV U.SCB(R5),R4 ;;;RETREIVE SCB ADDRESST2 BIC #S2.ACT,S.ST2(R4) ;;;SHOW INTERRUPT INACTIVE# CALL @(SP)+ ;;;CALL PROPER DRIVERQ30$: ;;;REF LABEL  .IFTR R. MOV (SP)+,KDSAR5 ;;;RESTORE KERNEL DATA APR 5  .ENDC  V/ MOV (SP)+,KINAR5 ;;;RESTORE KERNEL INSTR APR 5 (40$: MOV (SP)+,R4 ;;;RESTORE CSR ADDRESSXIT: RETURN ;;;D;+,; **-FRKDRV-EMULATE A DRIVER'S CALL TO $FORK;;; THIS ROUTINE WILL SETUP THE STACK IN ORDER TO EMULATE THEA; DRIVER'S CALL TO $FORK.O;ED; NOTE: THIS ROUTINE ASSUMES THAT THE DRIVER IS LOADABLE AND LOADED.;; THIS IS DONE BECAUSE THIS ROUTINE IS ONLY CALLED FOR DATAR; TRANSFER INTERRUPTS.;F ; INPUTS:; R5 = UCB ADDRESS); (SP) = ADDRESS TO RETURN TO AFTER $FORK;N ; OUTPUTS:; FORK BLOCK QUEUEDR; R0, R1, AND R2 ARE DESTROYED;-+FRKDRV: MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS + TST S.FRK+2(R4) ;;;IS THE FORK BLOCK BUSY?L* BNE XIT ;;;IF NE YES, DROP THE INTERRUPT$ MOV U.DCB(R5),R2 ;;;GET DCB ADDRESS- MOV D.PCB(R2),R1 ;;;GET DRIVER'S PCB ADDRESSE9 MOV D.DSP(R2),R2 ;;;GET ADDRESS OF DRIVER DISPATCH TABLE " MOV KISAR5,R0 ;;;SAVE KERNAL APR5% MOV P.REL(R1),KISAR5;;;MAP TO DRIVER: MOV D.VINT+2(R2),-(SP) ;;;GET DRIVER'S INTERRUPT ADDRESS& MOV R0,KISAR5 ;;;RESTORE APR5 MAPPING2 BIC #S2.ACT,S.ST2(R4) ;;;SHOW INTERRUPT INACTIVE& CALLR $FORK ;;;CREATE A FORK PROCESS .ENDC;+7; **-$RHKRB-RH11/RH70 CONTROLLER ONLINE/OFFLINE HANDLERY; ?; THIS ENTRY POINT WILL HANDLE RECONFIGURATION CALLS FOR ONLINEP@; CONTROLLER AND OFFLINE CONTROLLER FO00y wvtccccR THE RH-TYPE CONTROLLERS.;E<; FOR ONLINE, IT WILL DETERMINE WHETHER THE CONTROLLER IS AN@; RH11 (I.E. IT HAS NO RHBAE/RHCS3 REGISTERS) AND THEREFORE MUST>; USE UNIBUS MAPPING REGISTERS, OR WHETHER IT IS AN RH70 (I.E.A; IT HAS RHBAE/RHCS3 REGISTERS) AND WILL SUPPORT DIRECT ACCESS TOC; A 22-BIT ADDRESS SPACE.K;O5; FOR OFFLINE, IT WILL SIMPLY CLEAR THE RH SUBSYSTEM.R;L ; INPUTS: ; R2=KRB ADDRESS.S; R3=CTB ADDRESS.A; C=1 IF OFFLINE REQUEST.F; C=0 IF ONLINE REQUEST.;O ; OUTPUTS:;; FOR ONLINE, KS.MBC WILL BE SET IF RH70 CONTROLLER AND THE :; OFFSET FROM THE CSR TO THE RHBAE REGISTER WILL BE PLACED ; IN THE KRB.R0; FOR OFFLINE, THE RH SUBSYSTEM WILL BE CLEARED.;- .IF DF R$$HDV1$RHKRB::BCS CONCLR ;IF CS OFFLINE, JUST CLEAR RHN+ CALL CONCLR ;GET CSR ADDRESS AND CLEAR RHA- CALL $SGFIN ;TURN NXM'S INTO SET CARRY BITSL MOV R1,R4 ;COPY CSR ADDRESS- ADD #RHDT,R1 ;START WITH DRIVE TYPE REGISTERS710$: TST (R1)+ ;IS THE NEXT CONTROLLER REGISTER THERE? BCC 10$ ;IF CC YES' MOV #40,RHCS2(R4) ;CLEAR RH CONTROLLERL( SUB R4,R1 ;CALCULATE # OF REGISTERS *2 MOV R1,R0 ;SAVE REGISTER COUNT# ASR R1 ;CONVERT TO # OF REGISTERSU DEC R1 ;ADJUST REGISTER COUNT. BIS #KS.MBC,K.STS(R2) ;ASSUME WE ARE AN RH70/ MOV #$SCDVT,-(SP) ;SETUP TO SCAN DEVICE TABLESE,20$: CALL @(SP)+ ;GET NEXT DEVICE IN SYSTEM BCC 25$ ;IF CC WE GOT ONE4;C'; SET THE OFFSET TO THE RHBAE REGISTER.T;R2 BIT #FE.EXT,$FMASK ;IS 22-BIT ADDRESSING ENABLED? BEQ 21$ ;IF EQ NOE) ADD K.OFF(R2),R2 ;POINT TO KRB UCB TABLE) SUB #6,R0 ;POINT BACK TO RHBAE) MOV R0,KE.RHB(R2) ;STUFF OFFSET TO RHBAE 21$: RETURN ;ALL FINISHED ;O<; NOW THAT WE HAVE AN SCB, SEE IF IT IS CONNECTED TO THE KRB; THAT WE ARE BRINGING ONLINE.;E825$: BIT #S2.MAD,S.ST2(R4) ;IS THIS SCB MULTI-ACCESSED? BEQ 40$ ;IF EQ NOG" MOV R4,R5 ;YES, COPY SCB ADDRESS+ ADD #S.KTB,R5 ;POINT TO START OF KRB TABLEH'30$: MOV (R5)+,R3 ;GET NEXT KRB ADDRESSS BEQ 20$ ;IF EQ NONE LEFT& CMP R3,R2 ;DOES IT POINT TO OUR KRB? BNE 30$ ;IF NE NOC# BR 50$ ;YES, CHECK # OF REGISTERSR040$: CMP S.KRB(R4),R2 ;DOES IT POINT TO OUR KRB? BNE 20$ ;IF NE NON;E:; NOW WE HAVE THE CORRECT KRB. TEST FOR RH11/70 AND CLEAR; THE BIT IF WE ARE AN RH11.;O150$: CMPB R1,S.RCNT(R4) ;REGISTER COUNT FOR RH11?B BGT 20$ ;IF GT NOQ/ BIC #KS.MBC,K.STS(R2) ;YES, CLEAR MASSBUS BITE BR 20$ ;TRY FOR MORE .ENDC;+2; **-$DMKRB-RK611 CONTROLLER ONLINE/OFLINE HANDLER;2?; THIS ENTRY POINT WILL HANDLE RECONFIGURATION CALLS FOR ONLINEE=; CONTROLLER AND OFFLINE CONTROLLER FOR THE RK611 CONTROLLER.P;K@; FOR BOTH ONLINE AND OFFLINE THE CONTROLLER SUBSYSTEM IS SIMPLY>; CLEARED. THIS TURNS OFF ALL ERROR AND ATTENTION CONDITIONS.; ; INPUTS:N; R2=KRB ADDRESS.P; ALL OTHER REGISTERS IGNORED.; ; OUTPUTS:; CONTROLLER SUBSYSTEM CLEARED.S;- .IF DF R$$6112$DMKRB::BR CONCLR ;GO TO SUBSYSTEM CLEAR AND EXIT$ ;NOTE: THIS MAKES THE ASSUMPTION ; THAT RKCS2=RHCS2. .ENDC;+3; **-$RHPWF-RH11/RH70 CONTROLLER POWER FAIL HANDLERF/; **-$DMPWF-RK611 CONTROLLER POWER FAIL HANDLER ; >; THIS ROUTINE WILL HANDLE POWER FAILS FOR THE CONTROLLER. IT?; WILL SET THE SPIN UP BIT FOR THE PORT IF THE DEVICE IS MULTI- @; ACCESSED AND THE SOFTWARE VOLUME VALID BIT WAS PREVIOUSLY SET..; IT WILL THEN CLEAR THE CONTROLLER SUBSYSTEM.;>; POWER FAIL FOR EACH UNIT ON THE CONTROLLER IS HANDLED IN THE; RESPECTIVE DRIVERS. ;E;; NOTE: THIS ROUTINE MAKES THE ASSUMPTION THAT RKCS2=RHCS2.; ; INPUTS:-; R2=KRB ADDRESS.R;W ; OUTPUTS:; R1=CSR ADDRESS"; CONTROLLER SUBSYSTEM IS CLEARED.;- .IF DF R$$HDV!R$$611E$DMPWF:: ;RK611 POWER FAIL$RHPWF:: ;RH11/70 POWER FAIL/ MOV #$SCDVT,-(SP) ;SETUP TO SCAN DEVICE TABLESD,10$: CALL @(SP)+ ;GET NEXT DEVICE IN SYSTEM BCS CONCLR ;IF CS ALL DONE;NB; NOW THAT WE HAVE A DEVICE, SEE IF IT IS CONNECTED TO OUR KRB AND ; SEE IF IT NEEDS TO BE SPUN UP.;E820$: BIT #S2.MAD,S.ST2(R4) ;IS THIS SCB MULTI-ACCESSED? BEQ 10$ ;IF EQ NON, BITB #US.VV,U.STS(R5);WAS00ywzwttt tfDATA VOLUME VALID SET?$ BEQ 10$ ;IF EQ NO, FORGET THIS ONE+ BIT #KP.OFL,S.KTB(R4) ;IS PORT 'A' ONLINE? BNE 30$ ;IF NE NOO,; CMP R2,S.KTB(R4) ;IS THIS THE CORRECT KRB?; BNE 30$ ;IF NE NO7 BISB #S3.SPA,S.ST3(R4) ;YES, SET PORT 'A' SPINNING UPE230$: BIT #KP.OFL,S.KTB+2(R4) ;IS PORT 'B' ONLINE? BNE 10$ ;IF NE NOV.; CMP R2,S.KTB+2(R4) ;IS THIS THE CORRECT KRB?; BNE 10$ ;IF NE NO7 BISB #S3.SPB,S.ST3(R4) ;YES, SET PORT 'B' SPINNING UPI BR 10$ ;TRY FOR MORE;N6; RETREIVE CONTROLLER CSR ADDRESS AND CLEAR SUBSYSTEM.; *CONCLR: MOV (R2),R1 ;RETREIVE CSR ADDRESS2 MOV #40,RHCS2(R1) ;CLEAR THE CONTROLLER SUBSYSTEM RETURN ;R .ENDC;+); **-$DMCSR-CHECK IF RK611 CSR IS PRESENT.-; **-$RHCSR-CHECK IF RH11/RH70 CSR IS PRESENT;:>; THIS ROUTINE WILL TEST THE CONTROLLER WORD COUNT REGISTER TO+; DETERMINE IF IT EXISTS ON THIS PROCESSOR.C;R ; INPUTS:0; R2=KRB ADDRESS; R3=CTB ADDRESS-; $SGFIN MUST HAVE BEEN CALLED BY OUR CALLER.R;O ; OUTPUTS:; C=0 IF CONTROLLER EXISTS"; C=1 IF CONTROLLER DOES NOT EXIST;- .IF DF R$$HDV!R$$611C!$DMCSR:: ;RK611 CONTROLLER TEST %$RHCSR:: ;RH11/RH70 CONTROLLER TEST MOV R4,-(SP) ;SAVE A REGISTER# MOV (R2),R4 ;RETREIVE CSR ADDRESS-. TST 2(R4) ;DO WE EXIST? (CHECKS WC REGISTER) MOV (SP)+,R4 ;RESTORE REGISTERO& RETURN ;RETURN WITH CARRY SET/CLEAR .ENDC .ENDSOR.C;R ; INPUTS:0; R2=KRB ADDRESS; R3=CTB ADDRESS-; $SGFIN MUST HAVE BEEN CALLED BY OUR CALLER.R;O ; OUTPUTS:; C=0 IF CONTROLLER EXISTS" .TITLE IISRVL .IDENT /03.00/T -;,; COPYRIGHT (c) 1974, 1978, 1979, 1980, 1984/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.L;TA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED 9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.M;(;+; K. E. KINNEAR 11-NOV-77; ; MODIFIED BY:;Y; J. W. BERZLE 08-SEP-83 03.00;C2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES; ;F.; INTERPROCESSOR INTERRUPT SERVICE SUBROUTINES;P; MACRO LIBRARY CALLSE;X S  .IF DF M$$PRO D .MCALL HWDDF$,BGCK$A $ HWDDF$ ;DEFINE HARDWARE REGISTERS 4; &; IIST CSR DEFINITIONS AND STATUS BITS;S -PGTE=0 ;PROGRAM GENERATED TRANSMIT ENABLESE D PGCS=1 ;PROGRAM GENERATED CSRGO=1 ;PGCS GO BITIE=4 ;PGCS INTERRUPT ENABLE IP=10 ;PGCS INTERRUPT PENDING(RDY=4000 ;PGCS READY TO ACCEPT COMMAND$ERR=100000 ;PGCS ERROR SUMMARY BIT I'STTE=2 ;SANITY TIMER TRANSMIT ENABLEE RSTCS=3 ;SANITY TIMER CSRSENB=1 ;STCS ENABLE COUNT STP=2 ;STCS STOP COUNT*LKE=4 ;STCS LOCKUP PROCESSOR IF TIMEOUT A.IMSK=4 ;INTERRUPT MASK REGISTER - 1=DISABLE D+PGF=5 ;PROGRAM GENERATED INTERRUPT FLAGSR D/STF=6 ;SANITY TIMER INTERRUPT FLAGS REGISTERT C$DCF=7 ;DCLO / DISCONNECT REGISTER NEXC=10 ;EXCEPTION REGISTERI R'MTC=15 ;MAINTENANCE CONTROL REGISTERC T;+D; **-$IISTM-SET ALL INTERPROCESSOR INTERRUPT ENABLE INTERRUPT MASKS.;RK; THIS ROUTINE WILL RESET THE INTERRUPT MASK IN THE IIST FOR THIS PROCESSOR H; AND NOTIFY ALL OTHERS THAT THEIR INTERRUPT MASKS MUST ALSO BE CHANGED.B; WHEN THE ROUTINE RETURNS, ALL PROCESSORS HAVE RESET THEIR MASKS.;A ; INPUTS: ;E3; $IIMSK=DESIRED INTERRUPT MASK FOR ALL PROCESSORS.A;R ; OUTPUTS:;C>; R2=MASK OF PROCESSORS WHO DIDN'T RESET THEIR MASKS (IF ANY).;E; NO REGISTERS ARE PRESERVED.C;- R)$IISTM::CALL $IISLM ;SET THE LOCAL MASKSP) MOV #MP.RSM,R2 ;SET RESET MASKS FUNCTION0 CALLR $IISFA ;SEND FUNCTION TO ALL ONLINE CPUS! ;AND WAIT FOR ACKNOWLEDGEMENTN O;+3; **-$IINIT-INTERPROCESSOR INTERRUPT INITIALIZATIONH7; **-$IIPWF-INTERPROCESSOR INTERRUPT POWERFAIL SERVICE.E; ?; THIS ROUTINE WILL VALIDATE THE EXISTANCE OF AN IIST, AND THEN 9; SET THE LOCAL INTERRUPT MASKS AND THE INTERRUPT ENABLE.E;R ; INPUTS:T;S; NONE.M;S ; OUTPUTS:;; NONE.S;S; NO REGISTERS ARE PRESERVED.M;- $$IINIT:: ;REFERENCE LABEL/$IIPWF::CALL $IISLM ;SET LOCAL INTERRUPT MASKSR$ CALLR $IISIE ;SET INTERRUPT ENABLE S;+5; **-$IISLM-SET LOCAL INTERPROCE00zwvtccccSSOR INTERRUPT MASKS.N;P@; THIS ROUTINE WILL SET THE LOCAL INTERPROCESSOR INTERRUPT MASKS; TO THE VALUE IN $IIMSK.; ; INPUTS:I;W/; $IIMSK=DESIRED VALUE OF LOCAL INTERRUPT MASK.;E ; OUTPUTS:;E; NONE.K;N#; R0, R1, R2, AND R3 ARE PRESERVED.S;- 9$IISLM::CALL $IIKRB ;GET IIST KRB IF ONLINE, ELSE RETURNA MFPS -(SP) ;SAVE PRIORITYT+ CACHE$ BYPASS ;MAKE SURE WE GET RIGHT ONE;+ MOV $IIMSK,-(SP) ;GET DESIRED MASK SETTINGE CACHE$ RESTOR ;UNBYPASS" MOV (SP),-(SP) ;COPY TOP OF STACK! COM (SP) ;CHANGE STATE FOR IISTI* BIC #177760,(SP) ;MAKE IT PROCESSORS ONLY" BIS #7400,(SP) ;DON'T ALLOW BOOTS MOV (R4),R5 ;GET CSR ADDRESS7 BISB K.PRI(R4),@#PS ;INCREASE PRIORITY, DON'T DECREASEE* MOV #DCF,(R5) ;GET DISCONNECTED CPU FLAGS# MOV 2(R5),-(SP) ;INTO TOP OF STACK / SWAB (SP) ;PUT DISCONNECT FLAGS IN LOWER BYTEP4 BIC $CPMSK,(SP) ;ONLY PROCESSORS THAT WE CARE ABOUT4 BIS (SP),2(SP) ;DISALLOW INTERRUPTS FROM THESE CPUS5 MOV (SP)+,K.CRQ(R4) ;SAVE MASK OF BROKEN CONNECTIONSO1 MOV #IMSK,(R5) ;;;SELECT INTERRUPT MASK REGISTERC( MOV (SP)+,2(R5) ;;;LOAD INTERRUPT MASKS& BIC #177760,(SP) ;;;MAKE IT JUST CPUS+ MOV (SP),-(SP) ;;;DUPLICATE STACK CONTENTSS$ MOV #1,R4 ;;;INITIALIZE ODD PARITY" CLC ;;;SET UP INITIAL CARRY BIT! ROR (SP) ;;;CHECK LOW ORDER BITO& BEQ 20$ ;;;IF EQ THAT ALL THERE WERE" ADC R4 ;;;ACCUMULATE PARITY BITS&10$: ASR (SP) ;;;GET NEXT BIT IN WORD BEQ 20$ ;;;END OF ALL BITS" ADC R4 ;;;ACCUMULATE PARITY BITS BR 10$ ;;;GO BACK FOR MORE20$: ADC R4 ;;;ADD IN LAST BITL$ BIC #177776,R4 ;;;GET ONLY LAST BIT# ASL R4 ;;;PUT IT IN CORRECT PLACEC( MOV #STCS,(R5) ;;;SELECT REGISTER AGAIN MOV R4,2(R5) ;;;SET PARITY BITE# TST (SP)+ ;;;GET RID OF ZERO WORDA/ MOV #STTE,(R5) ;;;GET TRANSMIT ENABLE REGISTERP% MOV (SP)+,2(R5) ;;;LOAD THE REGISTER; MTPS (SP)+ ;;;RESET PRIORITY RETURNC U;+0; **-$IISIE-SET INTERPROCESSOR INTERRUPT ENABLE.;H; THIS ROUTINE WILL CLEAR OUT THE STATUS REGISTERS OF THE INTERPROCESSOR5; INTERRUPT DEVICE AND THEN SET THE INTERRUPT ENABLE.;C ; INPUTS: ;G; NONE.A;B ; OUTPUTS:;;; NONE. ;R-; REGISTERS R0, R1, R2, AND R3 ARE PRESERVED.A;- M;$IISIE::CALL $IIKRB ;GET IIST KRB ADDR IF ONL, ELSE RETURNO MFPS -(SP) ;SAVE PRIORITYT2 BISB K.PRI(R4),@#PS ;RAISE, DON'T LOWER, PRIORITY% MOV (R4),R4 ;;;GET IIST CSR ADDRESSR% MOV #PGCS,(R4) ;;;SELECT PROGRAM CSRE CLR 2(R4) ;;;CLEAR IT OUTA4 MOV #177777,R5 ;;;SET WORD TO CLEAR OUT STATUS BITS+ MOV #EXC,(R4) ;;;SELECT EXCEPTION REGISTERI MOV R5,2(R4) ;;;CLEAR IT OUTN' MOV #DCF,(R4) ;;;SELECT DC/LO REGISTER MOV R5,2(R4) ;;;CLEAR IT OUT . MOV #PGF,(R4) ;;;SELECT PROGRAM FLAG REGISTER MOV R5,2(R4) ;;;CLEAR IT OUT  MOV #PGCS,(R4) ;;;SELECT CSRR& MOV #IE,2(R4) ;;;SET INTERRUPT ENABLE MTPS (SP)+ ;;;RESTORE PRIORITY RETURNY;+$;**-$DISAN-DISABLE ALL SANITY TIMERS;#B; THIS ROUTINE CLEARS $STENB AND THEN $STTIC, DISABLING THE SANITYC; TIMER FOR THE CPU ON WHICH IT IS CALLED. IT SHOULD BE CALLED FROMED; EACH PROCESSOR BEFORE DOING A LONG NON-INTERRUPTIBLE SEQUENCE SUCH ; AS CRASH OR PARITY ERROR STOP.;, ; INPUTS:E; NONE; ; OUTPUTS:; NONE;T; ALL REGISTERS ARE PRESERVED,;-7$DISAN::CALL $SAVNR ;SAVE REGISTERS THAT GET CLOBBEREDE' CLR $STENB ;SET TO DISABLE ALL TIMERS) ;;+.; **-$STTIC-SANITY TIMER INTERRUPT PROCESSING.;AC; THIS ROUTINE IS DESIGNED TO BE CALLED AT EVERY TICK ON EVERY CPU.IC; IT WILL UPDATE THE SANITY TIMER ON THE PARTICULAR PROCESSOR, AND U#; WILL STOP THE TIMER IF NECESSARY.B;R ; INPUTS:O;N;; THIS ROUTINE IS DESIGNED TO BE CALLED FROM CODE EXECUTINGO;; AT A PRIORITY AS HIGH AS OR HIGHER THAN THAT OF THE IIST. ;I ; OUTPUTS:;R; NONE.;D); REGISTERS R0, R1, R2, AND R3 PRESERVED. ;- E$STTIC:: ;REFERENCE LABELB7 CACHE$ SAVE,BYPASS ;BYPASS CACHE TO LOOK AT REAL FLAGST3 TST $STFLG ;ANY REASON TO PROCESS SANITY TIMERS ?L BEQ 30$ ;IF EQ NOE810$: CALL $IIKRB ;GET IIST KRB ADDR IF ONL, ELSE RETURNF;******************************* IIST DEBUGGING CODE ***************** .IF00z"wwttt tfDATA DF L$$DBG E; C; FIND OUT IF THE IIST IS LOCKED UP. TO DO THIS WE WILL SEE IF THESA; IP!IE BITS ARE SET FOR 10 TIMES IN A ROW. IF THEY ARE, WE WILLD; TOGGLE THE IE BIT.;  "15$: MOV (R4),R5 ;GET CSR ADDRESS MOV #PGCS,(R5) ;SELECT CSRE' MOV #IE!IP,-(SP) ;SEE IF BOTH BITS SETG$ BIC 2(R5),(SP)+ ;ARE THEY BOTH SET?' BNE 16$ ;IF NE NO -- START COUNT ANEW1 INC K.CRQ(R4) ;SHOW ONE MORE TIME THAT IE!IP SETE CMP K.CRQ(R4),#10 ;TOO MANY?*) BLE 18$ ;IF LE NO, DO NOTHING THIS TIME* ;.<; IIST IS LOCKED UP. CLEAR AND REENABLE THE IE BIT IN PGCS.;  S$ MOV #PGCS,(R5) ;SELECT THE REGISTER CLR 2(R5) ;CLEAR THE IE * MOV #PGCS,(R5) ;SELECT THE REGISTER AGAIN BIS #IE,2(R5) ;SET THE IE AGAIN.16$: CLR K.CRQ(R4) ;START THE COUNT OVER AGAIN18$: ;REFERENCE LABEL .ENDC ; DF L$$DBGF;******************************* END OF IIST DEBUGGING CODE ********** MOV (R4),R4 ;GET CSR ADDRESS$ MOV #STCS,(R4) ;SELECT SANITY TIMER< BIT $CPBIT,$STENB ;SHOULD WE UPDATE AND ENABLE SANITY TIMER ;ON THIS CPU?A) BEQ 20$ ;IF EQ NO -- STOP SANITY TIMER!3 BIC #4,2(R4) ;TURN OFF SANITY TIMER LOCKOUT ALWAYSE0 MOV #STCS,(R4) ;RE-SELECT SANITY TIMER REGISTER7 MOV #177401,-(SP) ;SET MASK FOR LONGEST TIMER INTERVAL)6 BIT $CPBIT,$STALR ;SHOULD WE ENABLE ALARM AND LOCKOUT BEQ 19$ ;IF EQ NO) BIS #4,(SP) ;SET ALARM ENABLE INTO MASK >19$: BIS (SP)+,2(R4) ;ENABLE SANITY TIMER FOR LONGEST INTERVAL+ CACHE$ UNSAVE ;RESET PRIOR STATE OF CACHE$ RETURNE-20$: BIC #5,2(R4) ;CLEAR SANITY TIMER COUNTER / BIC $CPBIT,$STFLG ;CLEAR TIMER PROCESSING FLAGI/30$: CACHE$ UNSAVE ;RESET PRIOR STATE OF CACHEL RETURNW E;+5; **-$IIOPN-ENABLE THE IIST TO THE REST OF THE WORLD.7;1@; THIS ROUTINE WILL PERFORM A MASTER CLEAR OF THE IIST WHEN THIS@; PROCESSOR GOES OFFLINE. THIS WILL ALLOW ANOTHER PROCESSOR TO B; BOOT AND INTERRUPT THIS ONE AT A LATER TIME. IT WILL ALSO PLACE-; THE IIST KRB OFFLINE IN THE RUNNING SYSTEM. ;S ; INPUTS:A;O; NONE.;T ; OUTPUTS:;#; NONE.C;R-; REGISTERS R0, R1, R2, AND R3 ARE PRESERVED.A;- ;$IIOPN::CALL $IIKRB ;GET IIST KRB ADDR IF ONL, ELSE RETURNA# MFPS -(SP) ;SAVE CURRENT PRIORITYN, BIS #KS.OFL,K.STS(R4) ;PUT IIST KRB OFFLINE5 BISB K.PRI(R4),@#PS ;RAISE PRIORITY TO HIGHEST POINTW. BIS #100000,@(R4) ;CLEAR OUT IIST COMPLETELY! MTPS (SP)+ ;RESTORE PRIORITY RETURNT U;++; **-$IIKRB-GET IIST KRB ADDRESS IF ONLINE.;HF; THIS ROUTINE WILL GET THE KRB ADDRESS OF THE IIST FOR THIS PROCESSORD; AND WILL DETERMINE IF THE KRB SHOWS ONLINE STATUS. IF IT DOES, THEF; ROUTINE WILL RETURN TO THE CALLER. IF IT DOES NOT, THE ROUTINE WILL ; RETURN TO THE CALLER'S CALLER.;T ; INPUTS:;S!; 0(SP)=RETURN ADDRESS TO CALLER.F*; 2(SP)=RETURN ADDRESS TO CALLER'S CALLER.;I ; OUTPUTS:;B!; IF IIST FOR THIS CPU IS ONLINE:M;T; R4=KRB ADDRESS.; RETURN TO CALLER.;T; ELSE; ; R4=UNDEFINED.; RETURN TO CALLER'S CALLER. ;S; REGISTER R4 IS DESTROYED.R;- T<$IIKRB::MOVB $PROC2,R4 ;GET THIS PROCESSORS PROCESSOR NUMBER1 MOV $IICTB(R4),R4 ;GET KRB ADDRESS FOR THIS IISTR% BIT #KS.OFL,K.STS(R4) ;IS IT ONLINE?H( BEQ 10$ ;IF EQ YES -- RETURN TO CALLER" TST (SP)+ ;REMOVE CALLERS RETURN 10$: RETURNS  L F;+C; **-$IINOT-INTERRUPT ALL ONLINE CPUS AND WAIT FOR ACKNOWLEDGEMENT.SG; **-$IISFA-SEND SPECIFIC FUNCTION TO ALL ONLINE CPUS AND WAIT FOR ACK.;@; THIS ROUTINE WILL INTERRUPT ALL ONLINE CPUS AND WAIT FOR THEIRG; ACKNOWLEDGEMENT OF THE FUNCTION DESIRED. $IISFA WILL SEND A FUNCTIONOC; PASSED AS AN ARGUMENT, WHILE $IINOT WILL SEND A NOP FUNCTION JUSTS;; TO MAKE SURE THAT THE OTHER PROCESSORS CAN HEAR THIS ONE. ;Y ; INPUTS:N; !; R2=FUNCTION CODE ($IISFA ONLY). ;U ; OUTPUTS:;S9; R2=PROCESSORS WHO DIDN'T ACKNOWLEDGE FUNCTION (IF ANY). ;T; R4 AND R5 ARE PRESERVED.;- -($IINOT::MOV #MP.NOP,R2 ;SET NOP FUNCTION,$IISFA::MOV $URMST,R1 ;GET ONLINE PROCESSORS" BIC $CPMSK,R1 ;MAKE IT CPU'S ONLY BIC $CPBIT,R1 ;NOT OURSELVESE" BNE $IIWAK ;IF NE GO DO FUNCTION CLR R2 ;SHOW EVERYTHING IS OKM RETURNE00z*wvtcccc I;+7; **-$IIWAK-SEND FUNCTION AND WAIT FOR ACKNOWLEDGEMENT.T; 8; THIS ROUTINE WILL USE $IIFNX TO TRANSMIT A FUNCTION TO?; A NUMBER OF PROCESSORS, AND IT WILL WAIT A SPECIFIED INTERVAL <; OF TIME FOR THOSE PROCESSORS TO CLEAR OUT THE FUNCTION BIT:; FROM THEIR FUNCTION TABLE. IF THEY DO NOT CLEAR OUT THE5; FUNCTION WITHIN THAT TIME, THIS ROUTINE WILL RETURN$=; A ERROR STATUS, AND THE PROCESSOR MASK(S) FOR THE CPUS THATB; HAVEN'T DONE THEIR JOBS.;N ; INPUTS:;;W$; R1=MASK OF PROCESSORS TO FUNCTION.; R2=FUNCTION MASK.T; ; OUTPUTS:;K(; PROCESSORS HAVE RECEIVED THE FUNCTION.;I/; R2=CPUS WHO DIDN'T ACK THE FUNCTION (IF ANY).C;O); REGISTERS R1, R4, AND R5 ARE PRESERVED.;- M,$IIWAK::MOV R2,-(SP) ;SAVE THE FUNCTION MASK6 CALL $IIFNX ;TRANSMIT THE FUNCTION TO THE OTHER CPUS. MOV (SP)+,R3 ;RESTORE THE FUNCTION MASK TO R3! MOV R4,-(SP) ;SAVE R4 FOR CALLERS- CLR -(SP) ;CREATE TIMEOUT COUNTERS ON STACK( CLR -(SP) ;TIMEOUT IS DOUBLE PRECISION& MOV R1,R2 ;COPY INTERRUPTED CPU MASK ;29; OUTER LOOP -- SET UP TO SCAN THRU THE WHOLE TABLE AGAINE;D E710$: MOV #$MPTAB,R0 ;INITIALIZE POINTER TO TOP OF TABLE " MOV #1,R4 ;SET UP CLEAR BIT MASK A;PG; INNER LOOP -- LOOP THROUGH $MPTAB TO SEE IF PROCESSOR HAS CLEARED BITI;X T.20$: CACHE$ BYPASS ;LOOK AT VALUE OF REAL BIT8 MOV (R0)+,-(SP) ;GET VALUE OF SWITCH TABLE FOR NEXT CPU* CACHE$ RESTOR ;GO BACK TO FAST EXECUTION' BIT R3,(SP)+ ;HAS CPU CLEARED BIT YET?T' BNE 30$ ;IF NE NO -- MUST WAIT LONGERN BIC R4,R2 ;CLEAR OUT CPU BIT BEQ 40$%30$: ASL R4 ;MOVE BIT CLEAR BIT LEFTG# BIC $CPMSK,R4 ;ONLY DEAL WITH CPUSI( BNE 20$ ;IF NE MUST BE MORE PROCESSORS/ ADD #1,2(SP) ;COUNT OF FAILURES TO COMMUNICATE-, ADC (SP) ;HIGH ORDER WORD OF DBL PRECISION% CMP #1,(SP) ;SHOULD WE GIVE UP NOW?S BGT 10$ ;IF GT NOE540$: CMP (SP)+,(SP)+ ;CLEAN TIMEOUT COUNTER OFF STACK $ MOV (SP)+,R4 ;RESTORE R4 FOR CALLER 50$: RETURNN .DSABL LSB) H C;+9; **-$IISVC-INTERPROCESSOR INTERRUPT PENDING URM SERVICE.;CA; THIS ROUTINE IS USED TO TAKE THE PENDING URM INTERRUPT MASK IN B>; $IIPND AND CONVERT THEM TO PENDING CPU INTERRUPTS IN $IICPU.>; IT WILL THEN INTERRUPT THE NEXT PROCESSOR ROUND ROBIN, USING ; $IINXT.;C ; INPUTS:H;D@; $IIPND CONTAINS MASK BITS FOR ALL UNIBUS RUNS NEEDING SERVICE.;T ; OUTPUTS.;E=; THE URM BITS IN $IIPND HAVE BEEN CONVERTED INTO CPU BITS IN(=; $IICPU, AND USING $IINXT A PARTICULAR CPU HAS BEEN SELECTED=; TO BE INTERRUPTED. $IIXMT HAS BEEN CALLED TO INTERRUPT THEE; SELECTED CPU.U;E; NO REGISTERS ARE PRESERVED.M;- U .ENABL LSB-$IISVC::CACHE$ BYPASS ;FIGURE OUT WORK TO DOU$ MOV $IIPND,R1 ;GET PENDING URM MASK3 BIC $IICPU,R1 ;CLEAR OUT THOSE ALREADY INTERRUPTED CACHE$ RESTOR+ TST R1 ;ANY WORK NOT ALREADY INTERRUPTED?S BEQ 80$ ;IF EQ NO -- EXIT 7 MOV #$URMTB,R0 ;START SCAN THRU CPU URM CONNECTION TBLD, CLR R3 ;CLEAR OUT ACCUMULATOR FOR CPU BITS P410$: BIT R1,(R0)+ ;ARE ANY PENDING RUNS ON THIS CPU? BEQ 20$ ;IF EQ NOL6 BIS $BTMSK-$URMTB-2(R0),R3 ;YES -- SET THIS CPU'S BIT320$: CMP #$URMTB+,R0 ;IS IT END OF TABLE?H BHI 10$ ;IF GT NOT TST R3 ;ANY CPU'S TO INTERRUPT BNE 25$ ;IF NE YES I;,-; NO CPUS TO INTERRUPT. WE SHOULDN'T BE HEREE;E R9 BGCK$A BF.MP,BE.UNP,FATAL ;SOME URM NOT CONNECTED TO CPUI Q; ; INTERRUPT NEXT CPU IN ORDER.;A@; SPECIAL NOTE: $IINXT CONTAINS A POINTER INTO $BTMSK. IT IS A;; COMMON POINTER, YET IS BOTH READ WITHOUT BYPASS (POSSBILYI<; ENCOUNTERING STALE DATA), AND SET WITHOUT LOCKING ANYTHINGD; (POSSIBLY CAUSING MULTIPLE UPDATES). IN BOTH CASES, ONLY A SLIGHT<; PERTURBATION TO THE ROUND ROBIN FAIRNESS DOCTRINE RESULTS.;B@; IT IS ALSO POSSIBLE THAT TWO PROCESSORS MAY INTERRUPT THE SAME?; PROCESSOR, BUT THIS IS UNLIKELY SO NO EXPLICIT CHECK IS MADE.T;T P;25$: MOV $IINXT,R2 ;GET POINTER INTO $BTMSK FOR ROUND ROBINE230$: BIT (R2)+,R3 ;DOES THIS CPU NEED AN INTERRUPT BNE 40$ ;IF NE YES) CMP #$BTMSK+,R2 ;END OF TABLE?N BHI 30$ ;IF HI NO), MOV #$BTMSK,R2 ;START AT TOP 00z2wwttt tfDATAOF TABLE AGAIN BR 30$ ;GO BACKU/40$: MOV -(R2),R1 ;GET THE CPU'S BIT FOR $IIXMTA6 MOV R2,$IINXT ;SAVE POINTER INTO $BTMSK FOR RND ROBIN MFPS -(SP) ;SAVE PRIORITYO# MTPS #PR7 ;RAISE PRIORITY TO LOCK  LOCK$ $FORKL,SPIN< BIS $URMTB-$BTMSK(R2),$IICPU ;;;SHOW THESE URMS INTERRUPTED ULOCK$ $FORKL,SPIN  MTPS (SP)+ ;RESTORE PRIORITY B (;+.; **-$IIXMT-INTERPROCESSOR INTERRUPT TRANSMIT.; >; THIS ROUTINE WILL INTERRUPT THE CPU SPECIFIED BY BIT MASK IN); R1, USING THE INTERPROCESSOR INTERRUPT.T;E ; INPUTS: ; 6; R1=PROCESSOR BIT MASK FOR PROCESSOR(S) TO INTERRUPT.;A ; OUTPUTS:;T; NONE.I;R+; R1, R4, AND R5 ARE PRESERVED ACROSS CALL.E;- T0$IIXMT::MOVB $PROC2,R0 ;GET PROCESSOR NUMBER * 2) MOV $IICTB(R0),R3 ;GET KRB ADDRESS OF II;5 BIT #KS.OFL,K.STS(R3) ;IS IIST FOR THIS CPU OFFLINE?P" BNE 80$ ;IF NE YES -- RETURN NOW ;**; CALCULATE PARITY FOR THE PROCESSOR MASK.; H% MOV R1,R2 ;DUPLICATE PROCESSOR MASKF( MOV #1,R0 ;INITIALIZE ODD PARITY IN R0 CLC ;CLEAN OUT CARRY0 ROR R2 ;PUT FIRST BIT IN CARRY -- DONT SIGN EX BEQ 60$ ;NO BITS LEFT! ADC R0 ;BUMP PARITY COUNT 1#50$: ASR R2 ;PUT NEXT BIT IN CARRYL BEQ 60$ ;IF EQ - NO MORE BITS0 ADC R0 ;ACCUMULATE PARITYM BR 50$ ;GO BACK FOR MORE BITS 60$: ADC R0 ;ADD IN LAST BIT;# BIC #177776,R0 ;WE WANT PARITY BIT8$ ASL R0 ;JUSTIFY IN PARITY POSITION* BIS #,R0 ;ADD OTHER IMPORTANT BITS MOV (R3),R2 ;GET CSR OF II MFPS -(SP) ;SAVE PRIORITY 1 BISB K.PRI(R3),@#PS ;RAISE, DON'T LOWER PRIORITYR* CLR R3 ;INITIALIZE INFINITE LOOP COUNTER) MOV #PGTE,(R2) ;;;SELECT DEVICE REGISTER  MOV R1,2(R2) ;;;SET IT UP$70$: MOV #PGCS,(R2) ;;;SELECT II CSR1 ADD #1,R3 ;COUNT NUMBER OF TIMES WE HAVE LOOPEDE' BCS 75$ ;IF OVERFLOW, FORGET THE IIST  BIT #RDY,2(R2) ;;;IS IT READY BEQ 70$ ;;;IF EQ NO -- WAITT. MOV #PGCS,(R2) ;;;YES -- FIND REGISTER AND GO, MOV R0,2(R2) ;;;YES -- LOAD FUNCTION AND GO0 TALLY$ B.IPSN,XA$$IP,CPU ;COUNT AN IP INTR SENT"75$: MTPS (SP)+ ;RESTORE PRIORITY 80$: RETURNT ;+); **-$IBXMT-INTERPROCESSOR BOOT TRANSMIT.V;GA; THIS ROUTINE WILL BOOT THE PROCESSORS SPECIFIED BY THE BIT MASK:; IN R1.;2 ; INPUTS: ;C.; R1=PROCESSOR BIT MASK TO PROCESSORS TO BOOT.;E ; OUTPUTS:;I; NONE.W;O+; R1, R4, AND R5 ARE PRESERVED ACROSS CALL.Y;- 7-$IBXMT::SWAB R1 ;PLACE BITS IN CORRECT PLACES% CALL $IIXMT ;TRANSMIT BOOT REQUESTS ( SWAB R1 ;RESTORE R1 TO ORIGINAL PURITY RETURN$ ,; ,; MISC. INTERRUPT SERVICE SPECIAL PROCESSING;R R;I; JUMP OFF TO PROCESSOR ENTRY.;M N0$CPBGN::NOP ;LET OPERATOR CONTINUE (DEBUGGING)" JMP $PENT ;GO TO PROCESSOR ENTRY E;T&; ERROR SENSED IN IIST FLAG REGISTERS.;P E7ERROR: BGCK$A BF.MP,BE.FHW,FATAL ;CAN'T HANDLE THIS YET O;W,; NO ERRORS OR INTERRUPTS -- WHY ARE WE HERE;Y -7NOINT: BGCK$A BF.MP,BE.NIN,FATAL ;NO IMPLEMENTATION YETL .DSABL LSBA I O;+8; **-$IIINT-INTERRPROCESSOR INTERRUPT INTERRPUT SERVICE.;<; THIS ROUTINE ACCEPTS INCOMMING INTERRUPTS FROM THE II. IT>; WILL, IF THE PROPER BIT IS CLEAR IN $IIWAT, REPORT RECEPTION9; OF THE INTERRUPT TO ALL WAITING PROCESSORS AND LOAD ITSE:; INTERRUPT MASKS. OTHERWISE, IT WILL SIMPLY EXIT THROUGHC; $FORK THROUGH $DIRXT. NOTE: THE INTERRUPT VECTOR FOR THE II MUST >; UNIQUELY DETERMINE THE CSR ADDRESS (I.E. CSR=F(VEC)) FOR THE'; INITIALIZATION CODE TO WORK PROPERLY!E; ; INPUTS:A;I#; PS=CONTROLLER ID IN LOWER 4 BITS. ;E ; OUTPUTS:; ; NONE.;B; EXECUTES AT INTERRUPT LEVEL, AND AT EXEC LEVEL. OBSERVES PROPER(; REGISTER CONVENTIONS FOR THOSE LEVELS.;- C .ENABL LSBT/$IIINT::MFPS -(SP) ;;;SAVE CONDITION CODE BITST ;N>; THIS IS A POSSIBLE ENTRY FOR CPU STARTUP, WHEN THE PROCESSOR@; STARTING UP IS INTERRUPTED OUT OF THE BOOTSTRAP AND THRU CPA'SA; LOCAL MEMORY (AND VECTORS). IF CPA IS ONLINE AT THE TIME, THENA>; ITS IIST VECTOR POINTS TO THIS ROUTINE. SINCE THE BOOTSTRAP@; TURNS OFF MAPPING PRIOR TO ENABLING INTERRUPTS, THE FACT THAT A; THE MAPPING IS TURNED OFF IS A SIGNAL TO THIS ROUTINE THAT THI00z:wvtccccSE?; IS A CPU STARTUP, AND WE SHOULD JUMP TO $CPBGN (AND THENCE TOT ; $PENT).);; V# BIT #1,SR0 ;;;IS MAPPING ENABLED?S- BEQ $CPBGN ;;;IF EQ NO -- PROCESSOR STARTUPP. MTPS (SP)+ ;;;RESTORE PS CONDITION CODE BITS1 INTSV$ II,PR6,M$$PRO ;;;DO NORMAL INTERRUPT SAVET0 TALLY$ B.IPRC,XA$$IP,CPU ;COUNT AN IP INTR RCVDF;********************************* IIST DEBUGGING CODE ***************. CLR K.CRQ(R5) ;;;CLEAR OUT COUNTER FOR $STTICF;********************************* END IIST DEBUGGING CODE ***********& MOV (R5),R4 ;;;GET CSR ADDRESS OF II, MOV R5,-(SP) ;;;SAVE KRB ON STACK FOR LATER+ MOV #EXC,(R4) ;;;SELECT EXCEPTION REGISTERE MOV 2(R4),R5 ;;;GET ALL BITSP+ MOV #EXC,(R4) ;;;SELECT EXCEPTION REGISTERI# MOV R5,2(R4) ;;;CLEAR ALL RECEIVEDR3 BIC #177400,R5 ;;;CLEAR OUT ALL BUT THE RTE ERRORSI BEQ 5$ ;;;IF EQ NO ERRORS*- MOV (SP),R5 ;;;GET KRB ADDRESS FOR IIST KRB*/ INC K.CRQ+2(R5) ;;;INCREMENT RTE ERROR COUNTER 25$: MOV #DCF,(R4) ;;;SELECT DC / LO FLAGS REGISTER MOV 2(R4),R5 ;;;GET ALL BITS/ MOV #DCF,(R4) ;;;SELECT DC / LO FLAGS REGISTER( MOV R5,2(R4) ;;;CLEAR ALL BITSR2 BIC #177400,R5 ;;;USE ONLY THE DCF BITS (NOT BRK) BEQ 10$ ;;;IF NO DCF CHANGES" MOV R4,-(SP) ;;;SAVE CSR ON STACK. CALL $IISLM ;;;SET THE LOCAL INTERRUPT MASKS MOV (SP)+,R4 ;;;RESTORE R4B710$: MOV #STF,(R4) ;;;SELECT SANITY TIMER FLAG REGISTERP MOV 2(R4),R5 ;;;GET FLAGS' MOV #STF,(R4) ;;;SELECT REGISTER AGAIN  MOV R5,2(R4) ;;;CLEAR THEM OUT( BEQ 30$ ;;;IF EQ OKL% BIC #177760,R5 ;;;MAKE IT CPU'S ONLYBA BGCK$A BF.SAN,BE.FHW,DIRECT2 ;;;CRASH WITH SANITY TIMER MESSAGE4830$: MOV #PGF,(R4) ;;;SELECT INTERRUPT RECEIVED MASK REG2 MOV 2(R4),R5 ;;;GET MASK OF THOSE WHO INTERRUPTED" MOV #PGF,(R4) ;;;SELECT PGF AGAIN3 MOV R5,2(R4) ;;;CLEAR THOSE BITS TO SHOW RECEPTION+); BEQ NOINT ;;;IF EQ NO INTERRUPTS FOUNDE+ MOV R5,-(SP) ;;;SAVE THOSE WHO INTERRUPTEDR) MOV #PGCS,(R4) ;;;SELECT II CSR REGISTERG CLR 2(R4) ;;;CLEAR IT OUT;) MOV #PGCS,(R4) ;;;SELECT II CSR REGISTERB& MOV #IE,2(R4) ;;;SET INTERRUPT ENABLE CACHE$ BYPASS# MOV @$MPSWT,R5 ;GET FUNCTION TABLEE CACHE$ RESTOR; BIC #MP.INT,R5 ;ONLY PROCESSOR THOSE TO BE DONE AT INT LVLR BEQ 35$ ;IF EQ NONE TO PROCESS( MOV (SP),R4 ;GET THOSE WHO INTERRUPTED CALL $IIFNC ;EXECUTE FUNCTIONS%35$: MOV (SP)+,R5 ;GET INTERRUPT MASK;% MOV (SP)+,R4 ;;;GET KRB ADDRESS BACKP* TST K.FRK+2(R4) ;;;HAVE WE A FORK QUEUED? BEQ 40$ ;;;IF EQ NO -- GO FORK3 BIS R5,K.FRK+4(R4) ;;;ADD OUR CPUS TO CURRENT FORKC RETURNR S;B; QUEUE FORK BLOCK;  E.40$: ADD #K.FRK+6,R4 ;;;POINT TO LAST WORD + 2' CALL $FORK1 ;;;EXIT THRU FORK ROUTINE# I;R; EXECUTIVE LEVEL SERVICE.;O A& SUB #,R3 ;CREATE KRB ADDRESS7 MTPS K.PRI(R3) ;RAISE PRIORITY TO BLOCK II INT SERVICEF. CLR K.FRK+2(R3) ;;;SHOW FORK BLOCK NOT IN USE: BIS K.FRK+4(R3),R5 ;;;GET ANY ADDITIONAL BITS FROM WINDOW MTPS #0 ;;;LOWER PRIORITYK/ MOV R5,R4 ;PUT INTERRUPT MASK IN PROPER PLACER CACHE$ BYPASS" MOV @$MPSWT,R5 ;GET FUNCTION MASK CACHE$ RESTOR TST R5 ;PROCESS FUNCTIONS: BEQ 50$ ;IF EQ NOTHING TO DO CALL $IIFNC 50$: RETURN; .DSABL LSBR O;+,; **-$IIFNC-EXECUTE INTERPROCESSOR FUNCITON.;S>; THIS ROUTINE WILL TAKE A FUNCTION MASK IN R5 AND EXECUTE ALL?; FUNCTIONS CORRESPONDING TO THE BITS SET IN THE MASK. IT WILLC; USE THE JUMP TABLE AT $MPDSP. ;G ; INPUTS:T;A/; R4=PROCESSORS THAT HAVE INTERRUPTED THIS ONE.&; R5=FUNCTION MASK FOR THIS PROCESSOR.;L ; OUTPUTS:;Y:; ALL OF THE FUNCTIONS SPECIFIED IN THE FUNCTION MASK HAVE; BEEN EXECUTED.;I; R0, R1, R2, R3 ARE PRESERVED. ;- L$IIFNC::MOV R3,-(SP) ;SAVE R3 ( MOV R4,-(SP) ;SAVE R4 FOR OUR USE LATER" MOV #100000,R4 ;SET UP CLEAR MASK( MOV #$MPDSP,R3 ;SET START OF JUMP TABLE A-10$: ASL R5 ;PICK UP NEXT BIT FROM LEFT SIDEN% BCC 20$ ;IF CC NO FUNCTION THIS BITB A;M"; WE FOUND A FUNCTION FOR THIS BIT;S  MOV R5,-(SP) ;SAVE R5 MOV R4,-(SP) ;SAVE R4 MOV R3,-(SP) ;SAVE R3 L; /; CALL FUNCTION SUBROUTINE FROM DISPATCH TABLE. ; <; THE FUNCTION SUBROUTINES CAL00zBw{Iwttt tfDATALED FROM INTERRUPT LEVEL HAVE ;; R3, R4, AND R5 AVAILABLE FOR USE. THOSE CALLED FROM EXEC,%; LEVEL HAVE ALL REGISTERS AVAILABLE.#;0 ; INPUTS:U;L); R4=MASK OF PROCESSORS THAT INTERRUPTED.P;B 1 MOV 6(SP),R4 ;PUT PROCESSOR INTERRUPT MASK IN R41 CALL @(R3) ;CALL SUBROUTINE FROM DISPATCH TABLEE MOV (SP)+,R3 ;RESTORE R3B MOV (SP)+,R4 ;RESTORE R4S MFPS -(SP) ;SAVE PRIORITY4. MTPS #PR7 ;DON'T GET INTERRUPTED DURING LOCK- LOCK$ $IIFNL,SPIN ;;;LOCK THE FUNCTION TABLEU) BIC R4,@$MPSWT ;;;CLEAR OUT OUR FUNCTIONV0 ULOCK$ $IIFNL,SPIN ;;;UNLOCK THE FUNCTION TABLE$ MTPS (SP)+ ;;;RESTORE THE PRIORITY MOV (SP)+,R5 ;RESTORE R5&20$: BEQ 30$ ;IF EQ NO MORE FUNCTIONS$ TST (R3)+ ;BUMP JUMP TABLE POINTER$ ROR R4 ;POINT AT NEXT BIT TO CLEAR BNE 10$ ;IF NE MORE TO TRY/ ;(THIS WILL NEVER FALL THRU - R5 = 0 FIRST)R630$: MOV (SP)+,R4 ;RESTORE R4 (NOT REALLY NECESSARY -- ;COULD BE TST (SP)+G MOV (SP)+,R3 ;RESTORE R3 RETURNI ,;+-; **-$IIFNX-INTERPROCESSOR FUNCTION TRANSMIT.;;E=; THIS ROUTINE WILL LOAD THE BIT IN THE FUNCTION MASK FOR THEN;; APPROPRIATE PROCESSOR AND WILL INTERRUPT THE PROCESSOR(S)R?; DIRECTLY IF THE FUNCTION CAN BE PROCESSED AT INTERRUPT LEVEL,BA; OTHERWISE THE PROCESSOR WILL BE INTERRUPTED TO GO TO EXEC LEVEL1; AND PROCESS THE FUNCTION.(;S ; INPUTS: ;L$; R1=MASK OF PROCESSORS TO FUNCTION.; R2=FUNCTION MASK.R;L ; OUTPUTS:;(; PROCESSORS HAVE RECIEVED THE FUNCTION.;O); REGISTERS R1, R4, AND R5 ARE PRESERVED.P;- R*$IIFNX::MOV R1,R0 ;DUPLICATE PROCESS WORD MOV #$MPTAB,R3 ;POINT TO TABLES)10$: CLC ;MAKE FOLLOWING ROR WORK WRITEL# ROR R0 ;PUT NEXT CPU BIT IN CARRYT* BCC 20$ ;IF CC DON'T WORRY WITH THIS CPU T;VH; WE HAVE FOUND A CPU BIT ON. PLACE THE FUNCTION MASK INTO HIS FUNCTION; WORD.C;   MFPS -(SP) ;SAVE PRIORITYL- MTPS #PR7 ;DONT GET INTERRUPTED DURING LOCKN- LOCK$ $IIFNL,SPIN ;;;LOCK THE FUNCTION TABLEH! BIS R2,(R3) ;;;SET THE FUNCTIONE0 ULOCK$ $IIFNL,SPIN ;;;UNLOCK THE FUNCTION TABLE MTPS (SP)+ ;;;RESTORE PRIORITY% TST R0 ;SET THE CONDITION CODE BITSS'20$: BEQ 30$ ;IF EQ NO PROCESSORS LEFTT1 TST (R3)+ ;POINT TO NEXT WORD IN FUNCTION TABLE  BR 10$ ;GO BACK FOR MORE U630$: BIC #MP.INT,R2 ;SPECIAL INTERRUPT LEVEL FUNCTION? BEQ 40$ ;IF EQ NOC N; C; THIS FUNCTION IS ONE OF THOSE WHICH IS PROCESSED IN THE INTERRUPTNB; SERVICE ROUTINE OF THE INTERPROCESSOR INTERRUPT. SINCE THE CPUSC; INVOLVED (IF MORE THAN ONE) DON'T HAVE TO BE LOCKED INTO THE EXEC F; TO PROCESS THE FUNCTION, THEN WE WILL INTERRUPT THEM ALL IMMEDIATELY5; AND ALLOW THEM TO PROCESS THE FUNCTION IN PARALLEL.S;F # CALL $IIXMT ;INTERRUPT PROCESSORSN RETURNL ; C; IN THE FOLLOWING CASE, THE PROCESSORS MUST BE IN THE EXECUTIVE TOVE; PROCESS THE FUNCTION. WE CONSIDER THIS ANOTHER REASON TO INTERRUPTH<; THE PROCESSOR IN THE NORMAL, ROUND ROBIN SCHEME OF THINGS.;E T40$: MFPS -(SP) ;SAVE PRIORITY / MTPS #PR7 ;NO INTERRUPTS DURING LOCKED PERIOD ( LOCK$ $FORKL,SPIN ;;;LOCK THE FORK LIST4 BIS R1,$IIPND ;;;SET THE CPU'S WE WANT TO INTERRUPT+ ULOCK$ $FORKL,SPIN ;;;UNLOCK THE FORK LIST MTPS (SP)+ ;;;RESTORE PRIORITY RETURNT O .ENDC R R .END; C; IN THE FOLLOWING CASE, THE PROCESSORS MUST BE IN THE EXECUTIVE TOVE; PROCESS THE FUNCTION. WE CONSIDER THIS ANOTHER REASON TO INTERRUPTH<; THE PROCESSOR IN THE NORMAL, ROUND ROBIN SCHEME OF THINGS.;E T40$: MFPS -(SP) ;SAVE PRIORITY / MTPS #PR7 ;NO INTERRUPTS DURING LOCKED PERIOD ( LOCK$ $FORKL,SPIN ;;;LOCK THE FORK LIST4 BIS R1,$IIPND ; .TITLE ACSUB  .IDENT /03.00/U ;OC; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.O; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; M. S. FOX 18-OCT-78R;H+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:S;M; B. KRISHNAMURTHY; ; MODIFIED BY:;E; J. W. BERZLE 07-SEP-83 03.00;P2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;E#; CPU ACCOUNTING COMMON SU00{JwvtccccBROUTINES ;U; MACRO LIBRARY CALLS;O  .MCALL ACNDF$,ABODF$,BGCK$A* ACNDF$ ;DEFINE ACCOUNTING BLOCK OFFSETS ABODF$ ;TASK ABORT CODESS W;+D; **-$QTRAN-QUEUE ACCOUNTING TRANSACTION TO SYSLOG (USE DEFAULT UAB)F; **-$QTRN1-QUEUE ACCOUNTING TRANSACTION TO SYSLOG (USE SPECIFIED UAB)O; **-$QTRN2-QUEUE ACCOUNTNIG TRANSACTION TO SYSLOG (NO UAB, PACKET IS COMPLETE)IM; **-$QACNT-QUEUE ACCOUNT BLOCK TO SYSLOG (THE BLOCK IS ALREADY IN SEC. POOL)I;AI; THESE ROUTINES QUEUE ALL THE ACCOUNTING DATA PACKETS TO THE SYSLOG TASKR; FOR PROCESSING;C ; INPUTS:A;F?; R0=VIRTUAL ADDRESS OF PACKET IN CALLING TASK'S SPACE ($QTRAN,T; $QTRN1, $QTRN2)A; R1=RELOCATION BIAS TO MAP UAB OR ACCOUNT BLOCK ($QTRN1, $QACNT) ;) ; OUTPUTS:;UA; BF.ERR SET IN $ACNFE IF ALLOCATION FAILURE OR SYSLOG NOT ACTIVEN;U ; REGISTERS R3, R4, R5 PRESERVED;(;-  K I .IF DF A$$CNT $ .ENABL LSBC*$QTRAN::MOV $TKTCB,R1 ;LOCATE CURRENT TASK2 MOV T.ACN(R1),R1 ;LOCATE TASK'S ACCOUNTING BLOCKS0 BNE $QTRN1 ;IF NE, THERE ARE ACCOUNTING BLOCKS RETURN ;NOTHING TO DO $QTRN2::CLR R1 ;THERE IS NO UAB)$QTRN1::TST $SABPT ;IS ACCOUNTING ACTIVEQ BEQ 45$ ;IF EQ NOR SAVNR ;SAVE R4, R5A MOV R3,-(SP) ;SAVE R3 CLR R4 ;% BISB B.LEN(R0),R4 ;GET PACKET LENGTHA MOV R1,-(SP) ;SAVE UAB ADDRESSL MOV R4,R1 ;LENGTH , ADD #77,R1 ;ROUND UP TO NEXT 32 WORD BLOCK1 ASH #-6,R1 ;CONVERT TO NUMBER OF 32 WORD BLOCKS 6 MOV R0,R5 ;SAVE VIRTUAL PACKET ADDRESS IN TASK SPACE& CALL $ALACC ;ALLOCATE SECONDARY POOL BCC 10$ ;IF CC SUCCESS TST (SP)+ ;POP UAB ADDRESS BR 40$ ;RETURN110$: MOV R0,-(SP) ;SAVE ALLOCATED BLOCK'S ADDRESSO' MOV R5,R0 ;GET VIRTUAL PACKET ADDRESSV& CALL $RELOC ;RELOCATE PACKET TO APR6& SUB #20000,R2 ;CONVERT TO APR5 OFFSET' MOV R4,R0 ;GET PACKET LENGTH IN BYTESD7 MOV (SP),R3 ;APR MAPPING BIAS TO SECONDARY POOL BLOCKE5 MOV #140000,R4 ;VIRTUAL ADDRESS OF DESTINATION BLOCK . CALL $BLXIO ;COPY PACKET INTO SECONDARY POOL2 MOV (SP)+,R1 ;ADDRESS OF PACKET IN SECONDARY POOL MOV #KISAR5,R3 ;POINT TO APR5( MOV (R3)+,R5 ;SAVE CURRENT APR5 MAPPING( MOV (R3),R4 ;SAVE CURRENT APR6 MAPPING. MOV R1,(R3) ;MAP SECONDARY POOL NODE IN APR6! MOV (SP)+,-(R3) ;MAP UAB IN APR5T BEQ 20$ ;IF EQ, NO UAB5 MOV #B.HID+140000,R2 ;GET START OF ID INFO IN HEADER 215$: MOV -20000(R2),(R2)+ ;COPY WORD INTO SEC POOL2 CMP #B.HEND+140000,R2 ;ALL HEADER ID DATA COPIED? BHI 15$ ;IF HI NOL'20$: MOV R5,(R3)+ ;RESTORE APR5 MAPPINGO# MOV R4,(R3) ;RESTORE APR6 MAPPING BR 25$ ; $QACNT:: ; MOV R3,-(SP) ;SAVE R3625$: MOV #B.TIM,R0 ;GET OFFSET TO TIME FIELD IN PACKET CALL $TMSTP ;TIME STAMP PACKET" MOV #$SYLHD,R0 ;POINT TO LISTHEAD3 CALL $QSPIF ;INSERT PACKET AT END OF SYSLOG QUEUEQ6 BIT #BF.ERR!BF.STR,$ACNFE ;SHOULD SYSLOG BE UNSTOPPED BNE 30$ ;IF NE NO& MOV $LOGPT,R0 ;GET SYSLOG TCB ADDRESS BEQ 50$ ;IF EQ, NOT INSTALLED2) BIT #TS.EXE,T.STAT(R0) ;IS SYSLOG ACTIVE  BNE 50$ ;IF NE NOR/ BIT #BF.SLR,$ACNFE ;IS SYSLOG ACTIVELY RUNNINGE BNE 30$ ;IF NE YES CALL $EXRQN ;UNSTOP SYSLOG30$:40$: MOV (SP)+,R3 ;RESTORE R3 45$: RETURN ;EE50$: BIS #BF.ERR,$ACNFE ;INDICATE ACCOUNTING HAS STOPPED DUE TO ERRORT BR 30$ ;RETURN .DSABL LSBR A T;+6; **-$ALACC-ALLOCATE SECONDARY POOL FOR ACCOUNTING USE/; **-$ALTAB-ALLOCATE A TASK ACCOUNT BLOCK (TAB)$;PB; THIS ROUTINE DOES ALL SECONDARY POOL ALLOCATIONS FOR ACCOUNTING.C; A CHECK IS MADE TO INSURE THAT ACCOUNTING ALWAYS LEAVES A CERTAINFI; AMOUNT OF SEC POOL AVAILABLE. THE ALLOCATION WILL FAIL IF THIS MINIMUMNM; AMOUNT OF CANNOT BE LEFT AFTER THE ACCOUNTING ALLOCATION. IF AN ACCOUNTINGBH; ALLOCATION FAILS FOR ANY REASON, A TKTN MESSAGE WILL BE PRINTED ON CO:1; DESCRIBING WHAT TASK LOST ITS ACCOUNTING BLOCK.O;E;C ; INPUTS: ; 1; R1=SIZE OF BUFFER TO ALLOCATE IN 32 WORD BLOCKS 5; R4=TCB ADDRESS OF TASK TO RECEIVE TAB ($ALTAB ONLY)L;L ; OUTPUTS:;C; C=0 ALLOCATION SUCCESSFULO%; R0=APR BIAS TO MAP ALLOCATED BLOCK ; R1=NUMBER OF BLOCKS ALLOCATED; C=1 CANNOT DO ALLOCATION;I; REGISTERS R4, R5 PRESE00{RwIwttt tfDATARVED;A;- .ENABL LSBE@$ALTAB::MOV #T.NTAF,-(SP) ;ERROR CODE FOR TAB ALLOCATION FAILURE BR 5$ ;JOIN COMMON CODE @$ALACC::MOV #T.NAAF,-(SP) ;GENERAL ACCOUNTING ALLOCATION FAILURE?5$: BIT #BF.ERR,$ACNFE ;HAS THERE BEEN A FATAL ACCOUNTING ERROR  BNE 10$ ;IF NE YES1 MOV $SECFR,R2 ;GET AMOUNT OF FREE SECONDARY POOLL& SUB R1,R2 ;ALLOW FOR THIS ALLOCATION2 CMP $APLIM,R2 ;WILL THERE BE ENOUGH LEFT AFTER IT BHI 10$ ;IF HI NOS& CALL $ALSEC ;ALLOCATE SECONDARY POOL$ BCS 10$ ;IF CS, ALLOCATION FAILURE" TST (SP)+ ;THROW AWAY ERROR CODE RETURN ;E!10$: MOV (SP)+,R0 ;GET ERROR CODEE SAVNR ;SAVE R4, R5C/ CMP #T.NTAF,R0 ;IS IT A TAB ALLOCATION FAILUREN BEQ 20$ ;IF EQ YES' MOV $TKTCB,R4 ;LOCATE CURRENT TASK TCBF220$: MOV T.NAM(R4),R5 ;GET FIRST HALF OF TASK NAME$ MOV T.NAM+2(R4),R4 ;GET SECOND HALF CALL $DVMSG ;REQUEST TKTNR SEC ;INDICATE ERROR RETURN; .DSABL LSB  U;+*; **-$TMSTP-TIME STAMP AN ACCOUNTING BLOCK;CD; THIS ROUTINE COPIES THE CURRENT TIME FROM $TTNS INTO THE SPECIFIED2; OFFSET IN THE ACCOUNTING BLOCK IN SECONDARY POOL;( ; INPUTS:T;R2; R0=OFFSET TO START OF 3 WORD TIME FIELD IN BLOCK%; R1=APR BIAS TO MAP ACCOUNTING BLOCK$;I ; OUTPUTS:;$; TIME FIELD OF BLOCK UPDATEDC;$; REGISTERS R1, R3, R4, R5 PRESERVED;T;- E+$TMSTP::MOV KISAR6,-(SP) ;SAVE APR6 MAPPING $ MOV R1,KISAR6 ;MAP ACCOUNTING BLOCK2 ADD #140000,R0 ;GET VIRTUAL ADDRESS OF TIME FIELD( MOV #$TTNS-14,R2 ;POINT TO CURRENT TIME!10$: MOVB (R2)+,(R0)+ ;COPY FIELDF/ INC R2 ;SKIP HIGH BYTE OF WORD FIELD IN SYSCMO! CMP #$TTNS,R2 ;COPYING COMPLETE? BHI 10$ ;IF HI NOO" MOV (SP)+,KISAR6 ;RESTORE MAPPING20$: RETURN ;R A;+-; **-$CPUTM-CALCULATE CPU TIME USED BY A TASKI5; **-$CPUT1-CALCULATE CPU TIME USED BY SPECIFIED TASK ;PF; THIS ROUTINE CALCULATES THE AMOUNT OF CPU TIME A TASK HAS USED SINCED; IT GOT CONTROL OF THE PROCESSOR. A VALUE OF ZERO IS ROUNDED UP TOF; 1/2 TICK BY COUNTING EVERY OTHER ZERO AS ONE TICK. THEREFORE A TASKB; WILL BE BILLED FOR AT LEAST 1/2 TICK EVERY TIME IT GETS CONTROL.;; INPUT:;2:; R0=TCB ADDRESS OF TASK TO BILL CPU TIME TO ($CPUT1 ONLY); NO INPUTS IF ENTRY AT $CPUTM;R ; OUTPUT: ;$; NONE;L#; REGISTERS R0, R1, R2, R3 MODIFIEDP;-;- T .ENABL LSBE;YD10$: BGCK$A BF.ACC,BE.NCT,FATAL ;MUST BE ACTIVE TASK WITH ACCOUNTING;T*$CPUTM::MOV $TKTCB,R0 ;LOCATE CURRENT TASK! BEQ 10$ ;IF EQ, NO CURRENT TASKD8$CPUT1::MOV T.ACN(R0),R0 ;LOCATE TASK'S ACCOUNTING BLOCK$ BEQ 10$ ;IF EQ NO ACCOUNTING BLOCK% INCB $BILNG ;END CPU BILLING PERIODG4 MOV $ACCLK+2,R2 ;GET LOW ORDER PART OF CURRENT TIME# MOV $ACCLK,R3 ;GET HIGH ORDER PART4 SUB $STRTM+2,R2 ;CALCULATE TIME ELAPSED SINCE START SBC R3 ; SUB $STRTM,R3 ;4 MOV #B.CPU,R1 ;GET OFFSET TO CPU ACCUMULATION FIELD* MOV R2,-(SP) ;CHECK IF DIFFERENCE IS ZERO) BIS R3,(SP)+ ;CHECK BOTH HALFS OF NUMBERR BNE 30$ ;IF NE, NON-ZERO' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGO1 BIT #BF.LSS,$ACNFE ;SYSTEM ACCONTING TURNED ON ?Q BEQ 15$ ;NO, IF EQ.I MOV $SABPT,KISAR6 ;MAP SABC/ ADD #1,@#B.RND+140002 ;COUNT ZERO CPU INTERVALE& ADC @#B.RND+140000 ;DOUBLE WORD COUNT15$:$ MOV R0,KISAR6 ;MAP ACCOUNTING BLOCK5 BITB #BS.ZER,@#B.STM+140000 ;PREVIOUS ZERO INTERVAL?, BNE 20$ ;IF NE YES4 BISB #BS.ZER,@#B.STM+140000 ;REMEMBER ZERO INTERVAL BR 50$ ;620$: BICB #BS.ZER,@#B.STM+140000 ;RESET ZERO INDICATOR, INC R2 ;COUNT A TICK, FOR 2 ZERO INTERVALS .IF DF X$$ACC&XA$$CTB' MOV (SP)+,KISAR6 ;RESTORE EXEC MAPPINGO(30$: MOV KISAR6,-(SP) ;SAVE EXEC MAPPING MOV $SABPT,KISAR6 ;MAP SAB. MOV R4,-(SP) ;SAVE R4 .IF DF M$$PRO) MOVB $PROC2,R4 ;GET PROCESSOR WORD INDEXV ASL R4 ;MAKE IT A DBLWRD INDEX6 ADD #B.CPUT+140002,R4 ;POINT PAST ACCUMULATION BUCKET .IFF 5 MOV #B.CPUT+140002,R4 ;POINT PAS ACCUMULATION BUCKETN .ENDC ; DF M$$PRO8 ADD R2,(R4) ;ADD LOW ORDER CPU TIME FOR THIS PROCESSOR ADC -(R4) ;K ADD R3,(R4) ;HIGH ORDER MOV (SP)+,R4 ;RESTORE R4' MOV (SP)+,KISAR6 ;RESTORE EXEC MAPPING .IFFK BR 40$ ;,30$: ;ADD CPU TIME 00{ZwvtccccINTO ACCOUNTING BLOCKS .ENDC ;+B; **-$ADATA-ADD DATA TO THE APPROPRIATE FIELD OF ACCOUNTING BLOCKSI; **-$ADATS-ADD DATA TO APPROPRIATE FIELD ASSUMING SINGLE PRECISION VALUEOC; **-$ADAT1-INCREMENT THE APPROPRIATE ACCOUNTING ACCUMULATION FIELDB;EI; THESE ROUTINES ADD THE SUPPLIED DATA TO THE ACCUMULATION FIELD OF EVERYPH; ACCOUNTING BLOCK LINKED OFF THE INITIAL BLOCK UNTIL END OF THE LIST IS>; REACHED. A STANDARD TWO WORD ACCUMULATION FIELD IS REQUIRED.;0 ; INPUTS::; (; R0=APR BIAS TO MAP FIRST BLOCK IN LIST.; R1=OFFSET TO ACCUMULATION FIELD WITHIN BLOCK3; R2=LOW ORDER PART OF TO ADD ($ADATA, $ADATS ONLY)D+; R3=HIGH ORDER PART OF VALUE ($ADATA ONLY)R;S ; OUTPUTS:;*; NONE;R4; ALL REGISTERS ARE PRESERVED ($ADAT1 DESTROYES R2);;- .$ADATA::MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING* MOV R0,KISAR6 ;MAP SUPPLIED INITIAL BLOCK!40$: ADD R2,140002(R1) ;ADD VALUEF+ MOV R3,-(SP) ;GET HIGH ORDER PART OF VALUEA/ ADC (SP) ;INCLUDE CARRY BIT FROM PREVIOUS ADD 3 ADD (SP)+,140000(R1) ;ADD HIGH ORDER PART OF VALUEE BCC 45$ ;IF CC, OK CALL OVFLW ;HANDLE OVERFLOWP645$: MOV @#B.PNT+140000,KISAR6 ;MAP NEXT BLOCK IN LIST BNE 40$ ;IF NE, THERE IS ONE50$:" MOV (SP)+,KISAR6 ;RESTORE MAPPING RETURNS E $ADAT1::MOV #1,R2 ;VALUE TO ADD$ADATS::MOV R3,-(SP) ;SAVE R3A, CLR R3 ;MAKE HIGH ORDER PART OF VALUE ZERO$ CALL $ADATA ;CALL ADDITION ROUTINE MOV (SP)+,R3 ;RESTORE R3P RETURNG R .DSABL LSBA A;+3; **-OVFLW-HANDLE FIELD OVERFLOW FOR $ADATA ROUTINE(;+@; THIS LOCAL ROUTINE GETS CALLED WHEN THE ADD, ADC, ADD SEQUENCE=; IN THE $ADATA ROUTINE RESULTS IN C=1 OUT OF THE SECOND ADD.;>; IF THE ACCOUNTING BLOCK IS A TAB AND THE FIELD IS B.CPU, THEC; TASK HAS EXCEEDED ITS TIME LIMIT. IT IS THEREFORE ABORTED, UNLESSA>; IT HAS ALREADY BEEN DEACTIVATED. THIS CAN HAPPEN BY THE CALL; TO $CPUTM OUT OF DREIF.C; ; INPUTS:L;D(; R1=OFFSET TO FIELD IN ACCOUNTING BLOCK;R5; THE ACCOUNTING BLOCK MUST BE MAPPED THROUGH KISAR6L;V ; OUTPUTS:;T; NONE;;-@OVFLW: CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TASK ACCOUNT BLOCK BNE 20$ ;IF NE NO - CMP #B.CPU,R1 ;IS CPU TIME BEING ACCUMULATEDE BNE 20$ ;IF NE NOA/ MOV @#B.TCB+140000,R1 ;GET TCB ADDRESS OF TASKE TST T.STAT(R1) ;IS TASK ACTIVER BMI 10$ ;IF MI NO 5 MOV R0,-(SP) ;SAVE ORIGINAL ACCOUNTING BLOCK ADDRESS 2 MOV #S.COTL,R0 ;SET ABORT CODE OF OVER TIME LIMIT( MOV R2,-(SP) ;SAVE CPU TIME TO BE ADDED MOV R3,-(SP) ;U CALL $ABTSK ;ABORT TASKT MOV (SP)+,R3 ;RESTORE R3T MOV (SP)+,R2 ; MOV (SP)+,R0 ;P+10$: MOV #B.CPU,R1 ;RESTORE OFFSET TO FIELDU20$: RETURN ;$;+8;**-$ACINP-INCREMENT PROCESSOR SPECIFIC FIELD IN THE SAB!;**-$ACINC-INCREMENT FIELD IN SAB0;,@; THESE TWO ROUTINES WILL INCREMENT A FIELD IN THE SAB. IF ENTRYB; IS AT $ACINP, THEN THE FIELD IS INDEXED BY THE PROCESSOR NUMBER.;S ; INPUTS:.;L+; R0 = SAB OFFSET TO INCREMENT + 140002R#; (SP) = RETURN ADDRESS OF CALLERM+; 2(SP) = SAVED R0 PRIOR TO LOADING OFFSETM;( ; OUTPUTS:;E4; R0 IS RESTORED FROM PREVIOUS VALUE, STACK CLEANED;- .IF DF X$$ACC$ACINP:: ;REFERENCE LABEL .IF DF M$$PRO# MOV R0,-(SP) ;SAVE OFFSET INTO SABS) MOVB $PROC2,R0 ;GET PROCESSOR WORD INDEX ASL R0 ;MAKE IT DOUBLEWORD ADD (SP)+,R0 ;ADJUST OFFSET .ENDC ; DF M$$PRO$$ACINC::MOV KISAR6,-(SP) ;SAVE APR 61 MOV $SABPT,KISAR6 ;POINT TO SYSTEM ACCOUNT BLOCKE2 BEQ 10$ ;IF EQ THERE IS NONE, RESTORE AND RETURN* ADD #1,(R0) ;INCREMENT LOW HALF OF COUNT) ADC -(R0) ;AND HIGH HALF IF APPROPRIATER+10$: MOV (SP)+,KISAR6 ;RESTORE EXEC MAPPING-% MOV (SP)+,R0 ;RESTORE RETURN ADDRESSE' RTS R0 ;RESTORE R0 AND RETURN TO USER( .IFF ;X$$ACCI$ACINP::$ACINC:: .ENDC ;X$$ACC .IFF A$QTRAN::$QTRN1::$QTRN2::$QACNT::$ALACC::$TMSTP::$CPUTM::$CPUT1::$ALTAB::$ACINP:: $ACINC:: E .ENDC V A .ENDAR6 ;POINT TO SYSTEM ACCOUNT BLOCKE2 BEQ 10$ ;IF EQ THERE IS NONE, RESTORE AND RETURN* ADD #1,(R0) ;INCREMENT LOW HALF OF COUNT) ADC -(R0) ;AND HIGH HALF IF APPROPRIATER+10$: MOV (SP00|bwIwttt tfDATA .TITLE MSDRV .IDENT /12.00/ ;G7; COPYRIGHT (C) 1986 BY DIGITAL EQUIPMENT CORPORATIONT; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;$ ; VERSION 12.00C ;N ; PREVIOUSLY MODIFIED BY: ;D ; B. S. MCCARTHY ; C. SESTOKASO ;U ; MODIFIED BY: ;R ; C. SESTOKAS 7-APR-86 ;T. ; CS017 -- RETURN IS.SUC FOR IO.SPF AT BOT. ;5 ; CS018 -- CORRECT TRPHYS ROUTINE AND CALLS TO IT.L ;R; ; CS019 -- CHANGE SPB/SPF TIMEOUT VALUES TO HANDLE TK25.I ; + ; CS020 -- CONVERT TO USE EXEC VECTORINGR ;F@ ; CS021 -- HANDLE CALL FOR CONTROLLER POWER FAIL (C BIT SET). ;N< .PAGE=;M>; MACRO LIBRARY CALLS?;E3@ .MCALL ABODF$,CLKDF$,HWDDF$,PKTDF$,UCBDF$,UMDIO$DA ABODF$ ;TASK ABORT CODESS.B CLKDF$ ;CLOCK QUEUE CONTROL BLOCK OFFSETSC HWDDF$ ;HARDWARE REGISTERS7D PKTDF$ ;I/O PACKET OFFSETSO(E UCBDF$ ;UNIT CONTROL BLOCK OFFSETS..F UMDIO$ ;USER MODE DIAGNOSITIC DEFINITIONSGHIJ;T<K; BIT DEFINITIONS FOR UCB CHARACTERISTICS WORD # 2 (U.CW2)L;EM3NM.PEOV= 100000 ;TAPE PAST LOGICAL END OF VOLUMEP0OM.AEOV= 40000 ;TAPE AT LOGICAL END OF VOLUME PM.BOT= 20000 ;TAPE IS AT BOT0QM.1600= 4000 ;UNIT IS 1600 BPI PHASE ENCODED$RM.HWL= 2000 ;HARDWARE WRITE LOCK"SM.RWD= 1000 ;UNIT IS REWINDING)TM.SER= 400 ;SELECT ERROR HAS OCCURREDT%UM.IWR= 200 ;INHIBIT WRITE RETRIES %VM.SWL= 100 ;SOFTWARE WRITE LOCKED 5WM.TMK= 40 ;ENCOUNTERED TAPE MARK - FWD DIRECTION.3XM.EOT= 20 ;LAST COMMAND ENCOUNTERED END OF TAPE(0YM.SWAP= 2 ;SWAP BYTES FOR COMPATIBILITY MODEZ@[USRBTS= M.IWR!M.SWL!M.SWAP ;STATUS BITS CONTROLLED BY THE USER@\NEWBTS= M.BOT!M.EOT!M.SER!M.HWL!M.1600 ;STATUS TO BE UPDATED.0]MOVBTS= M.TMK!M.AEOV ;BITS SET BY TAPE MOTION^_;;`; FLAG BIT DEFINITIONS FOR CONTROLLER STATUS WORD (CSTAT)Ra;Ob2cCS.SER = 40000 ;'SEL ERR' - UNIT OFFLINE STATE./dCS.WSS = 20000 ;WAITING FOR SUB-SYSTEM READYE/eCS.TMO = 10000 ;THIS OPERATION HAS TIMED OUT2#fCS.NER = 2000 ;NO ERROR RECOVERYT#gCS.ABO = 1000 ;ABORT IN PROGRESSO%hCS.UMD = 200 ;USER MODE DIAGNOSTIC.,iCS.SFB = 100 ;SPACE FILES VIA SPACE BLKS.)jCS.RSP = 40 ;REWIND/SPACE IN PROGRESS. 1kCS.LBA = 20 ;LOADING DEVICE MSG BUFFER ADDRESST)lCS.GST = 10 ;DOING GET CHARACTERISTICST'mCS.CIP = 1 ;COMMAND IN PROGRESS FLAGCno .PAGEp; **-DEVICE REGISTER OFFSETSq$rTSBA= -2 ;BUS ADDRESS REGISTER$sTSDB= -2 ;DATA BUFFER REGISTERtTSSR= 0 ;STATUS REGISTER uvw; **-COMMAND PACKETOx,yCMDHDR= 0 ;#1 COMMAND/CONTROL FUNCTION.-zCMDB2= 2 ;#2 DT TRFR - LO ORD BUF @ .OR."{ ; NDT TRFR - TMK/RCRD CNT.)|CMDB3= 4 ;#3 DT TRFR - HI ORD BUF @.G'}CMDB4= 6 ;#4 DT TRFR - BYTE COUNT.G~; **-STATUS REGISTER2TSSRSV= 10 ;SAVED TSSR DEVICE STATUS REGISTER.; **-MESSAGE PACKET MSGHDR= 12 ;#1 HEADER WORD - MG.ACK=100000 ; ACK BIT,R ; 70000 ; RESERVED,E ; 1400 ; CLASS CODE BITS,) MG.FMT= 340 ; MESSAGE FORMAT BITS,' MG.COD= 37 ; MESSAGE CODE BITS;T MC.END=20 ; END, MC.FAL=21 ; FAIL, MC.ERR=22 ; ERROR, MC.ATN=23 ; ATTENTION.# MC.LOG=24 ; LOG (NOT USED). +MSGLGH= 14 ;#2 MESSAGE LENGHT: #3 - #7.I-RBPCR= 16 ;#3 RESIDUAL BYTE/FRAME COUNT.T'XST0= 20 ;#4 EXTENDED STATUS REG 0,EXST1= 22 ;#5 1,XST2= 24 ;#6 2,.XST3= 26 ;#7 3.R; **-CHARACTERISTIC PACKET.CHRWD1= 30 ;#1 > MESSAGE PCKT - LO ORD @,.CHRWD2= 32 ;#2 > MESSAGE PCKT - HI ORD @.*CHRWD3= 34 ;#3 MESSAGE PACKET LENGHT,(CHRWD4= 36 ;#4 I/O CHARACTERISTICS:. CH.ESS=200 ; STOP - TMK/TMK, (UNLABELLED. CH.ENB=100 ; STOP - BOT/TMK. TAPE)- CH.EAI= 40 ; ENABLE ATTENTION INTERRUPT.;1 CH.ERI= 20 ; ENABLE MSG BUFFER RLS INTRUPTS.T .PAGE;G; XST0 BIT DEFENITIONS;&X0.TMK= 100000 ;TAPE MARK DETECTED&X0.RLS= 00|jwvtcccc40000 ;RECORD LENGTH SHORT&X0.LET= 20000 ;LOGICAL END OF TAPE%X0.RLL= 10000 ;RECORD LENGTH LONGG"X0.WLE= 4000 ;WRITE LOCK ERROR)X0.NEF= 2000 ;NON-EXECUTABLE FUNCTION;!X0.ILC= 1000 ;ILLEGAL COMMAND= X0.ILA= 400 ;ILLEGAL ADDRESS-X0.MOT= 200 ;TAPE MOTION ON LAST COMMAND.PX0.ONL= 100 ;ON LINEX0.IE= 40 ;INTERRUPT ENABLERX0.VCK= 20 ;VOLUME CHECK%X0.PED= 10 ;* PHASE ENCODED DRIVEB ;* NOT USED - TK25.X0.WLK= 4 ;WRITE LOCK X0.BOT= 2 ;BEGINNING OF TAPE#X0.EOT= 1 ;END OF TAPE DETECTEDG;O; XST1 BIT DEFENITIONS;RX1.DLT= 100000 ;DATA LATER; 40000 ;NOT USED.%X1.COR= 20000 ;* CORRECTABLE DATA0 ;** NOT USED - TK25.$X1.CRS= 10000 ;* CREASE DETECTED! ;** NOT USED - TSV05, TU80.T X1.TIG= 4000 ;* TRASH IN GAP.X1.NER= 4000 ;* TK25 - NOISE DURING ERASE.&X1.DBF= 2000 ;* DESKEW BUFFER FAILX1.SCK= 1000 ;* SPEED CHECKU' ;** NOT USED - TK25, TSV05, TU80.#X1.RBE= 400 ;! READ BUS PAR ERR0 ;!! NOT USED - TK25, TS11.#X1.IPR= 200 ;* INVALID PREAMBLEX1.SYN= 100 ;* SYNCH ERROR' ;** NOT USED - TK25, TSV05, TU80. #X1.TN3= 200 ;$ TAPE TRACK #3. \*0X1.TN2= 100 ;$ | | #2. \ TK25 ONLY.#X1.TN1= 40 ;$ | | #1. /U"X1.TN0= 20 ;$ TAPE TRACK #0. /#X1.IPO= 40 ;% INVALID POSTAMBLED! ;%% NOT USED - TK25, TSV05.E"X1.IED= 20 ;* INVALID END DATA!X1.POS= 10 ;* POSTAMBLE SHORT-&X1.EW= 10 ;* TK25 - EARLY WARNING.X1.POL= 4 ;* POSTAMBLE LONG ' ;** NOT USED - TK25, TSV05, TU80.V!X1.UNC= 2 ;UNCORRECTABLE DATAS"X1.MTE= 1 ;% MULTI-TRACK ERROR! ;%% NOT USED - TSV05, TK25.$;C; XST2 BIT DEFENITIONS;|)X2.OPM= 100000 ;OPERATION IN PROGRESS 'X2.SIP= 40000 ;* TS11-SILO PAR ERR,T.X2.RCE= 40000 ;* TSV05 - RAM CHECKSUM ERR,0X2.DCF= 40000 ;* TK25 - COMMUNICATION FAULT. ;**NOT USED - TU80.10X2.BPE= 20000 ;* SERIAL BUS PAR ERR AT DRIVE+X2.DHF= 20000 ;* TK25 - HARDWARE FAULT.B! ;** NOT USED - TSV05, TU80.,0X2.SPD= 10000 ;* TK25 - CAPSTAN SPEED ERROR.! ;** NOT USED - TSV05, TU80.R*X2.TU8= 4000 ;"1"-TU80 IDENTIFICATION.(X2.TK2= 1000 ;"TK25" IDENTIFICATION. ; UNIT BIT 9, 11T ; TS11 0 0 UNIBUS ; TSV05 0 0 Q BUS2 ; TU80 0 1 UNIBUS" ; TK25 1 0 Q22/UNIBUS( ; TSU05 1 1 TSV05 FOR UNIBUS&X2.WCF= 2000 ;* WRITE CARD FAILURE ;* NOT USED - TK25.D8X2.DTK= 777 ;* TS11/TU80 DATA TRFR: DEAD TRKS P,7-0.+ ;* TS11/TU80 WRT CHAR: MICROCODE REV.S, ;* TS11 STATUS: RES CAPSTAN TIC COUNT. ;* TU80 STATUS: 0'S.4X2.REV= 377 ;* TSV05 WRT CHAR: 200 - XND FTR SW,- ;* 100 - BUFF SW, 77 - MICROCODE REV. $ ;* TSV05 DATA TRF/STATUS: 0'S.2X2.EAD= 377 ;* TK25 - ERROR ADDRESS (LO BYTE).4X2.XFS= 200 ;* TK25 - WRT CHAR: XTND FEATURE SW,%X2.MCD= 177 ; MICROCODE REV.D;; XST3 BIT DEFENITIONS;: X3.MEC= 177400 ;TS11/TSV05/TU80 MICRO-DIAG ERROR CODE.3 X3.EAD= 177400 ;TK25 - ERROR ADDRESS (HI BYTE). ' X3.LMX= 200 ;* TAPE LIMIT EXCEEDED.T%  ;** NOT USED - TK25/TSV05/TU80.*% X3.OPI= 100 ;OPERATION INCOMPLETE %X3.REV= 40 ;TAPE MOVED BACKWARDS.V+X3.CRF= 20 ;* CAPSTAN RESPONSE FAILURE.2X3.TCH= 20 ;* TK25 - NO TACHOMETER INDICATION.! ;** NOT USED - TSV05, TU80. 0X3.DCK= 10 ;TS11/TSV05/TU80 - DENSITY CHECK.,X3.STP= 10 ;TK25 - SERVO STRIPE FAILURE.)X3.NOI= 4 ;* NOISE - COULD NOT ERASE. %X3.LXS= 2 ;* REACHED TAPE LIMITS.0' ;** NOT USED - TK25, TSV05, TU80.3X3.RIB= 1 ;REVERSE INTO BOTD .PAGE;O; TSSR BIT DEFINITIONS;3$SR.SC= 100000 ;SPECIAL CONDITION(SR.UPE= 40000 ;* UNIBUS PARITY ERROR,SR.SPE= 20000 ;* SERIAL BUS PARITY ERROR$  ;* NOT USED - TK25/TSV05/TU80.0!SR.RMR= 10000 ;REGISTER MODIFICATION REFUSED%"SR.NXM= 4000 ;NON-EXISTENT MEMORY.%#SR.NBA= 2000 ;NEED BUFFER ADDRESSA$SR.A17= 00|rwIwttt tfDATA1000 ;BA 17N%SR.A16= 400 ;BA 16!&SR.SSR= 200 ;SUB-SYSTEM READYI#'SR.OFL= 100 ;DEVICE IS OFF LINE5)(SR.FC1= 40 ;* FATAL ERROR CLASS BIT 1))SR.FC0= 20 ;* FATAL ERROR CLASS BIT 0* ;* NOT USED - TK25.S'+SR.TC2= 10 ;TERMINATION CLASS BIT 2I&,SR.TC1= 4 ;TERMINATION CLASS BIT 1&-SR.TC0= 2 ;TERMINATION CLASS BIT 09.SR.TCN= SR.TC2!SR.TC1!SR.TC0 ;TERMINATION CLASS NUMBER.I/012;NH3; TSDBX REGISTER - BYTE REGISTER AT THE TSSR HIGH BYTE; Q22 BUS ONLY.4;A5<6DBX.BT= 20 ;BOOT TAPE - TSDBX DBX.BT '1' AND TSSR SSR '1':47 ; REWINDS THE TAPE TO BOT, SKIPS THE FIRST TAPE38 ; RECORD AND READS THE FIRST 512. BYTES OF THE0;9 ; SECOND TAPE RECORD TO MEMORY STARTING AT LOCATION 0.:-; ; TSSR SSR REMAINS CLEARED UNTIL THE BOOT 6< ; SEQUENCE HAS COMPLETED OR A DEVICE ERROR OCCURS.= .PAGE>;R/?; COMMAND PACKET HEADER WORD - BIT DEFENITIONB@;A#BCM.ACK= 100000 ;ACKNOWLEDGE BITY%CCM.CVC= 40000 ;CLEAR VOLUME CHECKBDCM.OPP= 20000 ;OPPOSITE BIT;ECM.SWB= 10000 ;SWAP BYTESD#FCM.MOD= 7400 ;COMMAND MODE BITSP!GCM.RTY= 1000 ;RETRY MODE BIT. ,HCM.RVS= 400 ;REVERSE DIRECTION MODE BIT. ICM.IE= 200 ;INTERRUPT ENABLE!JCM.COD= 37 ;COMMAND CODE BITS%KCM.LOW= 3 ;LOW HALF OF CODE BITS.E0LCM.NML= CM.IE!CM.ACK ;NORMAL COMBO. OF FLAGS.MN;RO; COMMAND PACKET HEADER WORDP;TQ+RCC.RDN= 0001!CM.NML ;READ NEXT (FORWARD)K/SCC.RDP= 0401!CM.NML ;READ PREVIOUS (REVERSE)C<TCC.RRP= 1001!CM.NML ;REREAD PREVIOUS (SPACE REV,READ FWD)9UCC.RRN= 1401!CM.NML ;REREAD NEXT (SPACE FWD, READ REV)P-VCC.WRC= 0004!CM.NML ;WRITE CHARACTERISTICS "WCC.WRD= 0005!CM.NML ;WRITE DATA?XCC.WDR= 1005!CM.NML ;* WRITE RETRY (BCKSPC, ERASE, RE-WRITE)T.YCC.WSM= 0006!CM.NML ;WRITE SUBSYSTEM MEMORY-ZCC.SRF= 0010!CM.NML ;SPACE RECORDS FORWARD-[CC.SRR= 0410!CM.NML ;SPACE RECORDS REVERSE/\CC.STF= 1010!CM.NML ;SKIP TAPE MARKS FORWARD/]CC.STR= 1410!CM.NML ;SKIP TAPE MARKS REVERSE$^CC.RWD= 2010!CM.NML!CM.CVC ;REWIND'_CC.WTM= 0011!CM.NML ;WRITE TAPE MARKM`CC.ERS= 0411!CM.NML ;ERASED=aCC.WTR= 1011!CM.NML ;- WTMK RETRY (BCKSPC, ERASE, RE-WTMK)D/bCC.UNL= 0412!CM.NML!CM.CVC ;REWIND AND UNLOAD (cCC.DRI= 0013!CM.NML ;DRIVE INITIALIZE,dCC.GST= 0017!CM.NML ;GET STATUS IMMEDIATE4eCC.MST=CC.GST!CM.CVC ;MOUNT & SET CHARACTERISTICSf .PAGEg;.@h; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER)i;Oj.kCSTAT: .BLKW T$$S11 ;CONTROLLER STATUS WORD+lCMDPTR: .BLKW T$$S11 ; > COMMAND PACKET.4mINTADD: .BLKW T$$S11 ; > I/O INTERRUPT SERVICING.=nSSRRTY: .BLKW T$$S11 ; > I/O RESUMPTION - SUBSYSTEM READY. o:pTMOCNT: .BLKW T$$S11 ;SAVED I/O TIMEOUT, (UNIT OFFLINE)*qRTYINT: .BLKW T$$S11 ;SAVED INTADD(R3),ArCMDSAV: .BLKW T$$S11 ;SAVED COMMAND - WHILE REQUESTING STATUS.Cs?tRTTBL: .BLKW T$$S11 ;RTRY CNT: +0-RTRYS LEFT, +1-TOTAL RTRYSR?uRCVCNT: .BLKW T$$S11 ;RECOVERY COUNT - RECOVERY RTRYS (LEFT).v$w;CLEAN TAPE - PARAMETER SAVE AREA:(xCMDPK1: .BLKW T$$S11 ;CMD PKT WRD #1,(yCMDPK2: .BLKW T$$S11 ;CMD PKT WRD #2,(zCLNRTN: .BLKW T$$S11 ;RCVRY INTRPT @.7{CLNCNT= SPCNT ;TAPE CLN CNT - INIT REV/FWD SPC CNT.S5|CLNED= SPACED ;CURRENT (CLEAN) BLOCK SPACE COUNT. }&~SPCNT: .BLKW T$$S11 ;SPACING COUNT.0SPACED: .BLKW T$$S11 ;SPACED (VIA TMK) COUNT.@PRVDIR: .BLKW T$$S11 ;LO BYTE - PREV TAPE DIR:EQ/FWD,NEQ/REV.5 ;HI BYTE - TAPE DIR (WRT,WTMK,RD):EQ/FWD,NEQ/REVY.DEVTYP: .BLKW T$$S11 ;LO BYTE - NE IF TK25,# ;HI BYTE - NE IF TSV05/TSU05.T3WRTOVR= 32. ; REWRITE WRITE/WTMK UP TO 64 TIMESR* ; FOR MAX EXTENDED IBG UP TO 20 FT.(RDOVR= 40. ; REREAD UP TO 40 TIMES --REREAD= 8. ; CLEAN TAPE AFTER 8 REREADS.K(RDTMO= 12. ; READ TIMEOUT - 12. SEC.2CLNTMO= 2 ; CLEAN TAPE SUBCYCLE TIME - 2 SEC.3CLNCYC= 15. ; CLEAN TAPE - UP TO 15 SUBCYCLES.D,VC$MS = 0 ; Vectored MS driver. ;CS020 .PAGE ;CS020 ;CS020K%; EXECUTIVE VECTOR AREA ;CS020  ;CS020V>EX00|zwvtccccEVEC: .WORD 0 ; IF NE - vectors already filled in. ;CS020 ;CS020M,DVERR: .WORD $DVERR ; Vectored ;CS020)DVMSG: .WORD $DVMSG ; Exec ;CS020 -FORK: .WORD $FORK ; references ;CS020 #GTPKT: .WORD $GTPKT ; ;CS020T$HFMSK: .WORD $HFMSK ; ;CS020+IOALT: .WORD $IOALT ; (filled ;CS020 ,EIODON: .WORD $IODON ; in by ;CS020,SCMOF: .WORD $SCMOF ; MSDRV ;CS020,CRPAS: .WORD $CRPAS ; code ;CS0200DVTMO: .WORD $DVTMO ; at MSKRB) ;CS020&MPUBM: .WORD $MPUBM ; ;CS020#STMAP: .WORD $STMAP ; ;CS020O ;CS020d!SFRK: .WORD S.FRK ; ;CS020 !SPKT: .WORD S.PKT ; ;CS020 !SCTM: .WORD S.CTM ; ;CS020!SITM: .WORD S.ITM ; ;CS020!SSTS: .WORD S.STS ; ;CS0200!SST2: .WORD S.ST2 ; ;CS020 !SKRB: .WORD S.KRB ; ;CS020; ;CS0200'EXEVCL=<<<.-EXEVEC>/2>-1> ;CS020C ;CS020D ;CS020 1; Driver SCB reference patch table. ;CS020 ; ;CS020M; The driver uses this patch table when it is called for the first ;CS020;K; controller on-line request. The driver initially contains SCB ;CS020 E; offset references of the form S.Vzzz located at Rzzzx. ;CS020M; The contents of these references are replaced at driver assembly ;CS020BP; time with the value -1 (promote crashes if the vectoring isn't comple;CS020 ;CS020 S.VCSR = 177777 ;CS020 S.VOWN = 177777 ;CS020 S.VFRK = 177777 ;CS020S.VPKT = 177777 ;CS020aS.VCTM = 177777 ;CS020sS.VITM = 177777 ;CS020nS.VSTS = 177777 ;CS020cS.VST2 = 177777 ;CS020 S.VKRB = 177777 ;CS020aK.VOWN = 177777 ;CS020eK.VCON = 177777 ;CS020  ;CS020aK; After the driver is LOAded and called for the first controller ;CS020nK; on-line request, the driver replaces these SCB references with ;CS020N; the vectored equivalents from the driver's Executive vector area. ;CS020; ;CS020; Example: ;CS0202; ;CS0204; Previous code: MOV S.ITM(R4),S.CTM(R4) ;CS020; ;CS0207; Vectored code: MOV S.VITM(R4),S.VCTM(R4) ;CS02015; RITMx=.-4 ; xth occurence of S.VITM and ;CS020=; RCTMy=.-2 ; yth occurence of S.VCTM in this drive;CS020f; ;CS020;; For this vectored code, this table contains: ;CS020e!; .WORD RITMx,S.ITM ;CS020 !; .WORD RCTMy,S.CTM ;CS020r; ;CS020 ;CS020&SCBPAT: .WORD RPTK1,SPKT ;CS020 .WORD RPKT2,SPKT ;CS020P .WORD RPKT3,SPKT ;CS020( .WORD RCTM1,SCTM ;CS020 .WORD RCTM2,SCTM ;CS0204 .WORD RCTM3,SCTM ;CS020x .WORD RCTM4,SCTM ;CS020d .WORD RCTM5,SCTM ;CS020  .WORD RITM1,SITM ;CS020; .WORD RITM2,SITM ;CS020F .WORD RITM3,SITM ;CS020  .WORD RITM4,SITM ;CS020  .WORD RITM5,SITM ;CS020R .WORD RITM6,SITM ;CS020  .WORD RITM7,SITM ;CS020 .WORD RITM8,SITM ;CS0200 .WORD RITM9,SITM ;CS0202  .WORD RITM10,SITM ;CS020  .WORD RITM11,SITM ;CS020  .WORD RITM12,SITM ;CS020 .WORD RSTS1,SSTS ;CS0202 .WORD RSTS2,SSTS ;CS0202 .WORD RSTS3,SSTS ;CS0202 .WORD RSTS4,SSTS ;CS0202 .WORD RSTS5,SSTS ;CS0202 .WORD RSTS6,SSTS ;CS0202 .WORD RSTS7,SSTS ;CS0202 .WORD RSTS8,SSTS ;CS0202 .WORD RSTS9,SSTS ;CS0202  .WORD RSTS10,SSTS ;CS020  .WORD RSTS11,SSTS ;CS020  .WORD RSTS12,SSTS ;CS020 .WORD RST21,SST2 ;CS0200 .WORD RKRB1,SKRB ;CS0200- .WORD 0 ; Patch table terminator. ;CS020R ;CS0202 .PAGE;T; DRIVER DISPATCH TABLEO;TB DDT$ MS,T$$S11,,,,NEW ;Generate driver dispatch table. ;CS020 ;**-1;O#; TERMINATION CODE DISPATCH TABLER;SERJTBL: .IRPC X,<01234567> .WORD TCL'X'ER .ENDM00|wIwttt tfDATA; ; VALID FUNCTION TABLE;S, .MACRO FUNCT FCN, HCC, EXT, TMO, INT, ADR .WORD IO.'FCN ;QIO REQUEST.O$ .WORD CC.'HCC ;HARDWARE COMMAND.& .BYTE EXT ;I/O TIMEOUT ITERATIONS.% .BYTE TMO ;I/O TIMEOUT - SECONDS. 1 .WORD I'INT ;REQUEST INTERRUPT ENDUP ROUTINE.L0 .WORD P'ADR ;REQUEST PRE-PROCESSING ROUTINE. .ENDM FUNCT7VFTBL: FUNCT RLB,RDN,1,RDTMO,OCOM,READ ;READ FORWARDD6 FUNCT WLB,WRD,1,12.,OCOM,WRITE ;WRITE LOGICAL BLOCK7 FUNCT RLV,RDP,1,RDTMO,OCOM,READ ;READ REVERSEN: FUNCT EOF,WTM, 1,4,ODON,WRTMK ;WRITE TAPE MARK, FUNCT RWD,RWD,255.,2,RWDU,REWND ; REWIND< FUNCT RWU,UNL, 1,2,RWDU,UNLOD ;REWIND AND UNLOAD: FUNCT SPB,SRF,250.,6,SPCB,SPACE ; SPACE BLOCKS ;CS0199 FUNCT SPF,STF,250.,6,SPCF,SPACE ; SPACE FILES ;CS019 ; FUNCT STC,MST,2.,2.,STAT,SET ;SET CHARACTERISTICS ;**-2:8 FUNCT SEC,GST,2.,2.,STAT,GSTAT ;SENSE CHARACTERISTICS< FUNCT SMO,MST,2.,2.,MOUNT,SET ;MOUNT/SET CHARACTERISTICS- FUNCT ERS,ERS,1,12.,ODON,WRTMK ;ERASE TAPEF EVFTBL:M;O; MESSAGE HEADER TABLE;K2MESSAG: .IRP X, .WORD MC.'X .ENDM .PAGE;+-; **-MSINI- INITIATE MAG TAPE I/O OPERATIONP;LD; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/OC; REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TOFG; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLER,@; IS NOT BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O>; REQUEST. ELSE A RETURN TO THE CALLER IS EXECUTED. IF THEA; DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPERATION IS>8; INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.;N ; INPUTS:P; >; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;C ; OUTPUTS:;>; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST<; IS WAITING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED'; AND THE I/O OPERATION IS INITIATED.A;-;+=; THE FOLLOWING REGISTERS ARE RETURNED BY THE GTPKT$ MACRO:C; (; R1=ADDRESS OF THE I/O REQUEST PACKET.; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB; R3=CONTROLLER INDEXT*; R4=ADDRESS OF THE STATUS CONTROL BLOCK;; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATEDO;N; I/O REQUEST PACKET FORMAT:;(;I.LNK WD. 00 = I/O QUEUE THREAD WORD..;I.PRI WD. 01 = REQUEST PRIORITY (LOW BYTE).0;I.EFN WD. 01 = EVENT FLAG NUMBER (HIGH BYTE).;;I.TCB WD. 02 = ADDRESS OF THE TCB OF THE REQUESTOR TASK.TC;I.LN2 WD. 03 = POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER./I;I.UCB WD. 04 = CONTENTS OF 1ST LUN WORD IN REQUESTOR TASK HEADER (UCB)N@;I.FCN WD. 05 = I/O FUNCTION CODE (IO.RLB/IO.RWD/IO.SPB/ETC.).7;I.IOSB WD. 06 = VIRTUAL ADDRESS OF I/O STATUS BLOCK.7;IOSB+2 WD. 07 = RELOCATION BIAS OF I/O STATUS BLOCK. B;IOSB+4 WD. 10 = I/O STATUS BLOCK ADDRESS (DISPLACEMENT+140000).9;I.AST WD. 11 = VIRTUAL ADDRESS OF AST SERVICE ROUTINE.I;W; <; READ/WRITE LOGICAL FUNCTION DEPENDENT I/O PACKET FORMAT:;NI;I.PRM WD. 12 = HIGH 2 BITS (BITS 4 & 5) OF 18 BIT DATA BUFFER ADDRESS.O<;PRM+2 WD. 13 = LOW 16 BITS OF 18 BIT DATA BUFFER ADDRESS.4;PRM+4 WD. 14 = NUMBER OF BYTES TO BE TRANSFERRED.;PRM+6 WD. 15 = NOT USED.E;PRM+10 WD. 16 = NOT USED.;PRM+12 WD. 17 = NOT USED.H;PRM+14 WD. 20 = RELOCATION BIAS OF DIAGNOSTIC REGISTER BLOCK ADDRESS.C;PRM+16 WD. 21 = DIAG. REG. BUFFER ADDRESS (DISPLACEMENT+140000).U;I;WA; BLOCK AND FILE SPACING FUNCTIONS DEPENDENT I/O PACKET FORMAT::;NF;I.PRM WD. 12 = SPACING COUNT (POSITIVE=FORWARD, NEGATIVE=BACKWARD).;PRM+2 WD. 13 = NOT USED.6;PRM+4 WD. 14 = NOT USED.D;PRM+6 WD. 15 = NOT USED.B;PRM+10 WD. 16 = NOT USED.H;PRM+12 WD. 17 = RELOCATION BIAS OF DIAGNOSTIC REGISTER BLOCK ADDRESS.C;PRM+14 WD. 20 = DIAG. REG. BUFFER ADDRESS (DISPLACEMENT+140000).G;PRM+16 WD. 21 = NOT USED.; I; (MOUNT AND) SET CHARACTERISTICS FUNCTION DEPENDENT I/O PACKET FORMAT.C: ; FOR SENSE CHARACTERISTIC00|wvtccccS, I.PRM (WD. 12) IS NOT USED: ;+ ;I.PRM WD. 12 = NEW CHARACTERISTICS WORD.W ;PRM+2 WD. 13 = NOT USED.P ;PRM+4 WD. 14 = NOT USED.P;PRM+6 WD. 15 = NOT USED.P;PRM+10 WD. 16 = NOT USED.;PRM+12 WD. 17 = NOT USED.;PRM+14 WD. 20 = NOT USED.;PRM+16 WD. 21 = NOT USED.;SD; WREOF, REWIND, AND UNLOAD FUNCTIONS DEPENDENT I/O PACKET FORMAT:;;I.PRM WD. 12 = NOT USED.;PRM+2 WD. 13 = NOT USED.C;PRM+4 WD. 14 = NOT USED.I;PRM+6 WD. 15 = NOT USED.E;PRM+10 WD. 16 = NOT USED.H;PRM+12 WD. 17 = RELOCATION BIAS OF DIAGNOSTIC REGISTER BLOCK ADDRESS.C;PRM+14 WD. 20 = DIAG. REG. BUFFER ADDRESS (DISPLACEMENT+140000)..;PRM+16 WD. 21 = NOT USED.;-9 MSINI: GTPKT$ MS,T$$S11 ;GET NEXT I/O PACKET TO PROCESST(! CLR CSTAT(R3) ;CLEAR CONTROLLER FLAGS)" CLR RCVCNT(R3) ;NOT IN ERROR RECOVERY.E+# CLRB PRVDIR+1(R3) ;ASSUME FWD DIRECTION..$ CLR R0 ;LABELLED!% BITB #US.LAB,U.STS(R5) ; TAPE?W& BNE 20$ ;IF NE, YES.4' BIS #CH.ESS!CH.ENB,R0 ;STOP TMK/TMK .OR. BOT/TMK.'(20$: MOV CMDPTR(R3),R2 ;CMDPTR SETUP?G) BEQ GCR ;IF EQ, NO.R,* CMP R0,CHRWD4(R2) ;CHAR PCKT PER REQUEST?++ BNE GCR ;IF NE, CHANGE CHARACTERISTICS.1>,30$: BIT #SR.NBA,@S.CSR(R4) ;COMMUNICATING WITH TAPE SYSTEM?- BNE GCR ;IF NE, NO.R;-ILDBA: MOV S.VPKT(R4),R1 ;RELOAD PACKET POINTER. ;CS020 - RPTK1=.-2 ;CS020D7/ MOV #VFTBL,R2 ;POINT AT VALID FUNCTIONS TABLE ;**-120 MOV I.FCN(R1),R0 ;GET FUNCTION CODE FROM PACKET+1 BIT #IQ.X,R0 ;ERROR RECOVERY PROHIBITED?K2 BEQ 50$ ;IF EQ NOM-3 BIS #CS.NER,CSTAT(R3) ;CORRESPONDING FLAGI+4 BIC #IQ.X,R0 ;AND CLEAR BIT FOR COMPARE.E1550$: BITB #IQ.UMD,R0 ;DIAGNOSTIC FUNCTION CALL?I6 BEQ 60$ ;IF EQ NOA/7 BIS #CS.UMD,CSTAT(R3) ;COPY DIAGNOSTIC FLAGB/8 BIC #IQ.UMD,R0 ;CLEAR BIT FOR FUNCTION CHECK;*960$: CMP R0,(R2)+ ;FUNCTION CODES MATCH?: BEQ 70$ ;IF EQ YES); ADD #10,R2 ;POINT TO NEXT TABLE ENTRYE < CMP #EVFTBL,R2 ;END OF TABLE?= BNE 60$ ;IF NE NOK3> MOV #IE.IFC&377,R0 ;SET UP ILLEGAL FUNCTION CODEB? BR ALT ;GO TO EXIT@+A70$: MOV (R2)+,R1 ;R1 - I/O COMMAND CODE.C=A MOVB (R2)+,S.VSTS(R4) ;SET EXTENDED TIMEOUT VALUE ;CS020;A RSTS1=.-2 ;CS020<A MOVB (R2)+,S.VITM(R4) ;SET INITIAL TIMEOUT VALUE ;CS020A RITM1=.-2 ;CS020C6D MOV (R2)+,INTADD(R3);STORE INTERRUPT ADDRESS ;**-27E CALLR @(R2) ;GO TO PRE-PROCESSING FOR THIS FUNCTION;FG;++H; **-GCR-GENERATE CHARACTERISTICS ROUTINEAI;/J; SETUP HARDWARE/SOFTWARE COMMUNICATIONS .OR.T2K; MODIFY DEVICE LEOV DETECTION CHARACTERISTICS.L;-M0MGCR: MOVB #2,S.VITM(R4) ;SET TIMEOUT ;CS020M RITM2=.-2 ;CS020 5O BIS #CS.LBA,CSTAT(R3) ;SET WRITE CHAR FLAG ;**-1P MOV R5,R1 ;R1 >)$Q ADD #U.VCB+4,R1 ; DEVICE PKT AREA"R BIC #3,R1 ; ON MOD4 BOUNDARY.S CMP R1,R2 ;PKT AREA SETUP?T BEQ 10$ ;IF EQ, YES.U MOV R1,R2 ;R2 >O V MOV R1,CMDPTR(R3) ; PKT AREA.$W10$: ADD #MSGHDR,R1 ;R1 > MSG PKT.X; SETUP CHARACTERISTIC PACKETA1X CLR -(SP) ;CLEAR HI-ORD ADDRESS AREA. ;CS018E*Y MOV R1,-(SP) ;PUSH ADDRESS TO TRANSLATE2Z CALL TRPHYS ;TRANSLATE TO PHYSICAL (IF NEEDED)=[ MOV (SP)+,CHRWD1(R2) ;STORE CHARACTERISTICS PACKET ADDRESS 6[ MOV (SP)+,CHRWD2(R2) ; AND HI-ORD ADDRESS. ;CS0183] MOV #14.,CHRWD3(R2) ;MSG BUF - 14. WRDS, ;**-1D"^ MOV R0,CHRWD4(R2) ;DEVICE CHAR.(_ ADD #CHRWD1-MSGHDR,R1 ;R1 > CHAR PKT.`; SETUP COMMAND PACKET&a MOV #CC.WRC,CMDHDR(R2) ;WRITE CHAR,1a CLR -(SP) ;CLEAR HI-ORD ADDRESS AREA. ;CS018C*b MOV R1,-(SP) ;PUSH ADDRESS TO TRANSLATE2c CALL TRPHYS ;TRANSLATE TO PHYSICAL (IF NEEDED)<d MOV (SP)+,CMDB2(R2) ;STORE CHARACTERISTICS PACKET ADDRESS5d MOV (SP)+,CMDB3(R2) ; AND HI-ORD ADDRESS. ;CS018V+f MOV #10,CMDB4(R2) ;4 WORD TRFR. ;**-10g JMP INITIO ;START I/O;h .PAGEi;+/j; PRE-PROCESSING ROUTINES FOR I/O OPERATIONSk;D l; INPUTS:Dm; R1 = HARDWARE FUNCTION CODEOn; R3 = CONTROLLER INDEXCo; R4 = SCB ADDRESSp; R5 = UCB ADDRESSq;- r .ENABL LSBAs;St; WRITE DATAu; v5wPWRITE: CMP U.CNT(R500|wIwttt tfDATA),#14. ;ENOUGH BYTES FOR WRITE?Hx BHIS 75$ ;IF HIS YES"y TST U.CNT(R5) ;IS IT MAX COUNT?z BEQ 75$ ;IF EQ YES2{ MOV #IE.SPC&377,R0 ;SET UP PARAMETER ERROR CODE| BR ALT ;GO TO EXIT}~;.; WRITE TAPE MARKI;;*PWRTMK: CLR U.CNT(R5) ;INSURE COUNT IS 0475$: MOV #WRTOVR*2,RTTBL(R3) ;SETUP ERROR RECOVERY, MOVB RTTBL(R3),RTTBL+1(R3) ; RETRY COUNT.4 BIT #M.SWL,U.CW2(R5) ;(USER) DISABLED WRITING? BEQ PIOCOM ;IF EQ NO3 MOV #IE.WLK&377,R0 ;SET UP WRITE LOCK ERROR CODE, BR ALT ;GO TO EXIT;; READ FWD/REV;/PRDREV: INCB PRVDIR+1(R3) ;REVERSE DIRECTION.Q3PREAD: MOV #RDOVR,RTTBL(R3) ;SETUP ERROR RECOVERYO, MOVB RTTBL(R3),RTTBL+1(R3) ; RETRY COUNT. BR PIOCOM ; . . CONT.W; ; SPACE BLOCKS AND SPACE FILES;V4PSPACE: MOV #IS.SUC&377,R0 ;ASSUME 0 SPACING COUNT6 MOV U.BUF(R5),U.CNT(R5) ;PUT SPACING COUNT IN PLACE4 MOV U.BUF(R5),SPCNT(R3) ;REMEMBER SPACING COUNT.* BEQ ALT ;IF EQ NO I/O NEEDED (U.BUF=0)1 BMI 90$ ;IF MI SPACE REVERSE (U.BUF=NEGATIVE)E! BIT #M.AEOV,U.CW2(R5) ;AT EOV?B BEQ 80$ ;IF EQ, NO.R0 MOV #IE.EOV&377,R0 ;SET UP END OF VOLUME CODE4ALT: CALL @IOALT ;TERMINATE THIS REQUEST ;CS0202 JMP MSINI ; AND SERVICE OTHER REQUESTS. ;**-1680$: BITB #US.LAB,U.STS(R5) ;SPACING LABELLED TAPE? BNE 100$ ;IF NE, YES., BIT #M.BOT,U.CW2(R5) ;SPACING FROM BOT? BNE 100$ ;IF NE, YES.( CMP #CC.SRF,R1 ;SPACING RECORDS FWD? BEQ 100$ ;IF EQ, YES.7 MOV #^C<0>,U.CNT(R5) ;SETUP MAX BLK SPACING COUNT,E- CLR SPACED(R3) ; NO TMKS SPACED YET AND$0 BIC #CC.STF-CC.SRF,R1 ; SPACING VIA BLOCKS.: BIS #CS.SFB,CSTAT(R3) ;SPACING FILES VIA SPACE BLOCKS.  BR 100$;90$: BIS #CC.SRR-CC.SRF,R1 ;MAKE CMND SPACE/SKIP REVERSE % NEG U.CNT(R5) ;MAKE COUNT POSITIVEPC100$: BIS #CS.RSP,CSTAT(R3) ;SET "REWIND/SPACE IN PROGRESS" FLAGF  BR PIOCOM  .DSABL LSB ;/; (MOUNT AND) SET CHARACTERISTICS, GET STATUS1; 8PSET: BIC #USRBTS,U.CW2(R5) ;CLEAR USER SETTABLE BITS6 BIC #^C,U.BUF(R5) ;REMOVE NON-SETABLE BITS.5 BIS U.BUF(R5),U.CW2(R5) ;UPDATE USER SETABLE BITS.B;B6; GET STATUS (SENSE (MOUNT AND) SET CHARACTERISTICS);5PGSTAT: BIS #CS.GST,CSTAT(R3) ;SET GET STATUS FLAG.  BR PUNLOD ; . . CONT.U;V; REWIND TAPEC;,7PREWND: BIS #M.RWD,U.CW2(R5);SET TAPE REWINDING FLAG.M> BIS #CS.RSP,CSTAT(R3) ;SET "REWIND/SPACE IN PROGRESS" FLAG;U; UNLOAD TAPES;I*PUNLOD: CLR U.CNT(R5) ;INSURE COUNT IS 0" BR PIOCM1 ;PREPROCESS REQUEST. .PAGE;T(; I/O OPERATION COMMON PRE-PROCESSING;A.PIOCOM: MOV #IE.ABO&377,R0 ;ABORT REQUEST?/ BITB #US.PWF,U.STS(R5) ;PWFLD INDICATOR SET?  BNE ALT ;IF NE, YES.1PIOCM1: MOV CMDPTR(R3),R2 ;R2 > COMMAND BUFFER.. MOV R1,(R2)+ ;LOAD COMMAND HEADER IN BUFFER0 BIC #^C,R1 ;ISOLATE COMMAND CODE BITS( CMP R1,#CC.GST&CM.COD ;SENSE REQUEST? BEQ 110$ ;IF EQ, YES.D> BIC #M.PEOV!M.AEOV,U.CW2(R5) ;M.PEOV/M.AEOV PER END STATUS.7110$: CMP R1,#CC.SRF&CM.COD ;FILL IN COMPLETE PACKET?O BHIS 130$ ;IF HIS NO; DATA TRANSFER REQUEST . BIT #M.SWAP,U.CW2(R5) ;SWAP BYTES ON DATA? BEQ 120$ ;IF EQ NO8 BIS #CM.SWB,-2(R2) ;SET SWAP BITS BYTE IN HEADER WORD,120$: BIT #DV.EXT,U.CW1(R5) ;22 BIT Q BUS? BNE 125$ ;IF NE, YES.I/ CALL @STMAP ;SET UP UNIBUS MAPPING ;CS020C! MOV R2,-(SP) ;SAVE R2 ;**-1;0 CALL @MPUBM ;MAP UNIBUS TO TRANSFER ;CS020$ MOV (SP)+,R2 ;RESTORE R2 ;**-16125$: MOV U.BUF+2(R5),(R2)+ ;SET UP LO 16 ADDR BITS.' BIT #DV.EXT,U.CW1(R5) ;22 BIT Q BUS?  BEQ 127$ ;IF EQ, UNIBUS.$ MOVB U.BUF+1(R5),(R2)+ ;SET UP HI CLRB (R2)+ ; 6 ADDR BITS.  BR 130$ ; . . CONT.S3127$: MOV U.BUF(R5),(R2) ;SET UP HI 2 ADDR BITSW ASR (R2) ;AND MOVE FROM1 ASR (R2) ;BITS 4 AND 5 ASR (R2) ;TO ASR (R2)+ ;BITS 0 AND 1M7130$: MOV U.CNT(R5),(R2) ;LOAD BYTE/RECORD/FILE COUNTU .PAGE;+; INITIATE I/O OPE00|wvtccccRATION;R ; INPUTS:; ; COMMAND PACKET SETUP.U;1; R3 = CONTROLLER INDEXT; R4 = SCB ADDRESS; R5 = UCB ADDRESS;->INITIO: MOVB S.VITM(R4),S.VCTM(R4) ;START THE TIMER ;CS020 RITM3=.-4 ;CS020  RCTM1=.-2 ;CS020.) MTPS #PR5 ;INHIBIT INTERRUPTS ;**-1A+ MOV S.CSR(R4),R2 ;;;RETREIVE CSR ADDRESS4! TSTB (R2) ;;;SUBSYSTEM READY?2 BPL 140$ ;;;IF PL NO1 CLR -(SP) ;CLEAR HI-ORD ADDRESS AREA. ;CS0184  MOV CMDPTR(R3),-(SP) ;;;PUSH ADDRESS TO TRANSLATE4  CALL TRPHYS ;;;TRANSLATE TO PHYSICAL (IF NEEDED)9  MOV (SP)+,R1 ;;; SETUP CMD PKT PHYS @ BITS 15-2 ;CS018A2  BIS (SP)+,R1 ;;; AND BITS 17,16 IN R1. ;CS018+  MOV R1,TSDB(R2) ;;; START I/O. ;CS018 ;  BIS #CS.CIP,CSTAT(R3) ;;;SET COMMAND IN PROGRESS ;**-1H  BR 150$ ;;;EXIT-1140$: MOVB #4,S.VCTM(R4) ;;;SET TIMER ;CS020T RCTM2=.-2 ;CS0205 BIS #CS.WSS,CSTAT(R3) ;;;SET WAITING FLAG ;**-1D0 MOV #INITIO,SSRRTY(R3) ;;;SET RETURN ADDRESS(150$: MTPS #0 ;;;ALLOW INTERRUPTS AND( RETURN ;EXIT WHILE I/O IN PROGRESS. .PAGE;+$; **-MSCAN- CANCEL I/O ENTRY POINT;B.; ACTIVE I/O REQUESTS ARE MARKED FOR ABORT -D; THE I/O REQUEST WILL THEN END NORMALLY AS A RESULT OF INTERRUPTD; SERVICING .OR. END ABNORMALLY VIA THE TIMEOUT (MSOUT:) ROUTINE.;B ; INPUTS:)"; R0 = ACTIVE I/O PACKET ADDRESS; R1 = CURRENT TCB ADDRESS; R3 = CONTROLLER INDEXI ; R4 = SCB ADDRESS!; R5 = UCB ADDRESS";-#6$MSCAN: CMP I.TCB(R0),R1 ;;;IS THIS THE CORRECT TASK?% BNE 10$ ;;;IF NE NO/>& BIS #CS.ABO!CS.NER,CSTAT(R3) ;ABORT REQUEST - NO ERR RCVRY.'10$: RETURN ;;;RETURNR()*;+#+; **-MSPWF- POWERFAIL ENTRY POINTT,; ;-; US.PWF SET TO DISALLOW NORMAL QIO REQUESTS EXCEPT FOR -R/.; IO.RWD, IO.RWU, IO.SMO, IO.SEC AND IO.STC../;BJ0; SUCCESSFUL IO.RWD, IO.RWU, IO.SMO RESET US.PWF AND ALLOW QIO REQUESTS.1; 2; INPUTS:R3; R3 = CONTROLLER INDEXA4; R4 = SCB ADDRESS5; R5 = UCB ADDRESS6;-787MSPWF: BCS 10$ ;IF CS, CONTROLLER POWER FAIL. ;CS02197 BISB #US.PWF,U.STS(R5) ; ELSE, UNIT POWER FAIL ;CS021N'7 ; DISALLOW NORMAL QIO'S. ;CS021'7 BIT #HF.UBM,@HFMSK ;UMRS? ;CS020R&: BNE 10$ ;IF NE - MAPPED @. ;**-2,; BIS #DV.EXT,U.CW1(R5) ;ELSE - PHYSICAL @. <10$: RETURN.= .PAGE>;+!?; **-MSOUT- TIMEOUT ENTRY POINTW@;.EA; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING TERMINATED.CB; IF THE OPERATION WAS DIAGNOSTIC, THE QIO REQUEST IS TERMINATED.DC; TIMEOUTS ARE USUALLY CAUSED BY POWER FAILURE BUT MAY ALSO BE THE@D; RESULT OF HARDWARE CONSIDERATIONS. IN PARTICULAR, A LENGTHY>E; SPACING OPERATION OR A REWIND ON THIS MODEL TAPE DRIVE MAY.F; RESULT IN A TIMEOUT WHICH WILL BE IGNORED.G; H; INPUTS:U I; R0 = LITERAL CONSTANT IE.DNRJ; R2 = CSR ADDRESSK; R3 = CONTROLLER INDEX L; R4 = SCB ADDRESSM; R5 = UCB ADDRESSN;-O P .ENABL LSBO6QMSOUT: BIT #CS.ABO,CSTAT(R3) ;;;BEEN TOLD TO ABORT? R BNE 10$ ;;;IF NE YES - ABORT6S BIT #CS.SER,CSTAT(R3) ;;;'SEL ERR' - UNIT OFFLINE?T BNE 10$ ;;;IF NE, YES.:U BIT #CS.WSS,CSTAT(R3) ;;;WAITING FOR SUB-SYSTEM READY?V BNE 30$ ;;;IF NE YES2W BIT #CS.RSP,CSTAT(R3) ;;;REWIND/SPACE TIMEOUT?X BNE 40$ ;;;IF NE YES6Y BIS #CS.TMO,CSTAT(R3) ;;;FLAG TIMEOUT BEING LOGGED%Z CALL MSDTER ;;;LOG DEVICE TIMEOUTE[10$: MTPS #0 ;LOWER PRIORITY1\ BIT #M.SER,U.CW2(R5);SELECT ERROR IN PROGRESS?U] BNE NORDY ;IF NE YES^MSOUT1: CLR R1 ;CLEAR R1E_ CALLR IODON ;AND EXIT`,a30$: TSTB (R2) ;;;IS THE SUBSYSTEM READY?b BPL 40$ ;;;IF PL NOE7b INCB S.VSTS(R4) ;;;INSURE CONTROLLER IS BUSY ;CS020Eb RSTS2=.-2 ;CS020E6d BIC #CS.WSS,CSTAT(R3) ;;;CLEAR WAITING FLAG ;**-1e MTPS #0 ;;;LOWER PRIORITYB%f CALLR @SSRRTY(R3) ;RETRY OPERATIONE>f40$: DECB S.VSTS(R4) ;;;SUBSYSTEM RECOVERY TIMED OUT? ;CS020f RSTS3=.-2 ;CS020#9h BEQ 10$ ;;;IF EQ YES, RETURN WITH DRIVE NOT READ;**-1I6h MOVB S.VITM(R4),S.VCTM(R4) ;;;START TIMER ;CS020h RITM4=.-4 00|wIwttt tfDATA ;CS020Rh RCTM3=.-2 ;CS020?j RETURN ;**-1k l .DSABL LSBRm .PAGEn;+ o; **-NORDY-TAPE UNIT NOT READYp; Bq; ISSUE 'SEL ERR' MESSAGES AT 15 SEC INTERVALS FOR OFFLINE UNITS=r; .OR. END THE REQUEST FOR USER CONTROL PARAMETERS OR ACP. s;T3t; INPUTS: R3 - CNTRL INDX, R4 > SCB, R5 > UCB.Mu;-vDwNORDY: BIT #CS.NER!CS.UMD!CS.ABO,CSTAT(R3) ;USER CNTRL PARAMETERS?x BNE 10$ ;IF NE, YES.y TST U.ACP(R5) ;ACP REQUEST?Tz BEQ 20$ ;IF EQ, NO.6{10$: MOV RTYINT(R3),INTADD(R3) ;INTADD PER REQUEST,(| MOV #IE.DNR&377,R0 ; DRIVE NOT READY"} JMP IODON ; AND END REQUEST.~/20$: CMP #NORD1,INTADD(R3) ;M.SER FIRST TIME?5 BEQ NORDY0 ;IF EQ, NO.I2;SAVE CMD HDR WRD .AND. SETUP FOR SENSE REQUEST.$ MOV CMDPTR(R3),R2 ;R2 > CMD PKT.1 MOV (R2),CMDSAV(R3) ;SAVE CMD PKT HDR WRD ANDO4 MOV #CC.GST,(R2) ; SETUP CMD PKT FOR SENSE RQST.; MOVB S.VITM(R4),TMOCNT(R3) ;SAVE REQUEST TIMEOUT ;CS020P RITM5=.-4 ;CS020EE MOVB S.VSTS(R4),TMOCNT+1(R3) ; AND TIMEOUT ITERATION COUNT. ;CS020# RSTS4=.-4 ;CS020A7 MOVB #2,S.VITM(R4) ;SETUP SENSE I/O TIMEOUT. ;CS020O RITM6=.-2 ;CS020I8 MOVB #1,S.VSTS(R4) ;FAKE END OF 15 SEC CYCLE. ;CS020 RSTS5=.-2 ;CS020? MOV INTADD(R3),RTYINT(R3) ;SAVE REQUEST ENDUP ADDR AND ;**-4V: MOV #NORD1,INTADD(R3) ; AND RETURN HERE AFTER SNS RQST.3 BIS #CS.SER,CSTAT(R3) ;'SEL ERR' - UNIT OFFLINE. 1TIME: DECB S.VSTS(R4) ;END OF 15 SEC? ;CS0202 RSTS6=.-2 ;CS020+" BNE TIMER ;IF NE, NO. ;**-1) MOV #T.NDSE,R0 ;R0='SEL ERR' MSG CODEM7 CALL @DVMSG ; AND ISSUE 'SEL ERR' MESSAGE. ;CS020 9 MOVB #15.,S.VSTS(R4) ;15 SEC 'SEL ERR' TIMEOUT ;CS020O RSTS7=.-2 ;CS020SBTIMER: MOVB #1,S.VCTM(R4) ; CHECKED AT 1 SEC INTERVALS.V ;CS020 RCTM4=.-2 ;CS020# RETURN ;**-39; RETURN FROM **-NORDY SENSE REQUEST INTRPT SERVICING ;TC; INPUTS: R2 > CMD PKT, R3 - CNTRL INDX, R4 > SCB, R5 > UCB.S'NORD1: BIT #M.SER,U.CW2(R5) ;OFFLINE?, BNE TIME ;IF NE, YES.1; ONLINE - SETUP CMD PKT AND ISSUE I/O REQUEST.N, BIC #CS.SER,CSTAT(R3) ;NOT OFFLINE STATE.1 MOV CMDSAV(R3),(R2) ;RESTORE CMD PKT HDR WRD,6 MOV RTYINT(R3),INTADD(R3) ; INTERRUPT SERVICE ADDR,: MOVB TMOCNT(R3),S.VITM(R4) ; TIMEOUT COUNT AND ;CS020 RITM7=.-2 ;CS020*C MOVB TMOCNT+1(R3),S.VSTS(R4) ; TIMEOUT ITERATION COUNT. ;CS020 RSTS8=.-2 ;CS020T<NORDY0: JMP INITIO ;GET STS .OR. RE-ISSUE I/O RQST.;**-2 .PAGE;+); **-$MSINT- SERVICE DEVICE INTERRUPTS. ;-8 INTSE$ MS,PR5,T$$S11 ;;;SAVE REGISTERS & SET PRIORITY1 BIT #CS.CIP,CSTAT(R4) ;;;COMMAND IN PROGRESS?R BNE 5$ ;;;IF NE YES# RETURN ;;;NO, IGNORE INTERRUPTU45$: CALL @FORK ;;;CREATE A SYSTEM PROCESS ;CS020, MOV R4,R3 ;COPY CONTROLLER INDEX ;**-1( MOV U.SCB(R5),R4 ;PICK UP SCB ADDRESS% MOV CMDPTR(R3),R2 ;R2 > CMD PCKT. 2 MOV @S.CSR(R4),TSSRSV(R2) ;SAVE DEVICE STATUS.* MOV TSSRSV(R2),R1 ;R1 - DEVICE STATUS. MOV (R2),-(SP) ;(SP) -) BIC #^C,(SP) ; COMMAND CODE. @;STATUS/WRITE CHAR DON'T RETAIN PREVIOUS TAPE MARK INDICATION.+ CMP (SP),#CC.GST&CM.COD ;SENSE REQUEST?; BEQ 15$ ;IF EQ, YES.N0 CMP (SP),#CC.WRC&CM.COD ;WRITE CHAR REQUEST? BEQ 15$ ;IF EQ, YES.M8 BITB #US.LAB,U.STS(R5) ;(NO LEOV FOR) LABELLED TAPE? BNE 8$ ;IF NE, YES.6 BIT #X3.REV,XST3(R2) ;(NO LEOV FOR) TAPE MOVED REV? BNE 8$ ;IF NE, YES.. BIT #X0.LET,XST0(R2) ;HARDWARE DETECT LEOT? BNE 7$ ;IF NE, YES.5 BIT #M.BOT!M.TMK,U.CW2(R5) ;BOT .OR. TMK PREV I/O?/ BEQ 8$ ;IF EQ, NO.V>;PEOV IF PREV BOT/TMK .OR. TMK/TMK WITHOUT INTERVENING BLKS.& BIT #X0.TMK,XST0(R2) ;TMK THIS I/O? BEQ 8$ ;IF EQ, NO. & CMP (SP),#CC.RDN&CM.COD ;READ FWD? BNE 6$ ;IF NE, NO.,) CMP RBPCR(R2),CMDB4(R2) ;DATA ON READ?% BEQ 117$ ;IF EQ, NO - TMK/TMK.V,6$: CMP (SP),#CC.SRF&CM.COD ;SPACING FWD? BNE 8$ ;IF NE, NO.B MOV CMDB2(R2),R0 00|wvtcccc ;R0 -" DEC R0 ; I/O SPACE COUNT-1.1 CMP RBPCR(R2),R0 ;SPACED OVER TMK, NO DATA?R BNE 8$ ;IF NE, NO. 2117$: TSTB PRVDIR(R3) ;TAPE PREVIOUS DIRECTION? BNE 8$ ;IF NE, REVERSE.,7$: BIS #M.PEOV,U.CW2(R5) ;TAPE PAST LEOV  BR 9$ ; AND TMK INDICATION.+8$: BIT #M.PEOV,U.CW2(R5) ;PREVIOUS PEOV? BNE 10$ ;IF NE, YES.A( BIC #M.TMK,U.CW2(R5) ;ASSUME NOT TMK.* MOV (R2),R0 ;R0 - BIT8:CMND MODE REV,: BIC #CM.NML!^C<777>,R0 ;BIT7-5:PKT FMT, BIT4-0:CMD CODE( CMP #410,R0 ;SPACE REVERSE REQUEST?- BEQ 10$ ;IF EQ, YES - NO TMK INDICATION.N BIT #X0.TMK,XST0(R2) ;TMK? BEQ 10$ ;IF EQ, NO.'9$: BIS #M.TMK,U.CW2(R5) ; ELSE, TMK. 710$: CLRB PRVDIR(R3) ;ASSUME TAPE FORWARD DIRECTION.S+ BIT #X3.REV,XST3(R2) ;FORWARD DIRECTION? BEQ 15$ ;IF EQ, YES. / INCB PRVDIR(R3) ; ELSE - REVERSE DIRECTION.B#15$: TST (SP)+ ;MAINTAIN STACK.0 BIC #NEWBTS,U.CW2(R5) ;STATUS TO BE UPDATED.' BIT #X0.PED,XST0(R2) ;1600 BPI MODE?- BEQ 20$ ;IF EQ, NO.3 BIS #M.1600,U.CW2(R5) ; ELSE 1600 BPI (PE) MODE.-!20$: BIT #X0.BOT,XST0(R2) ;BOT?M BEQ 30$ ;IF EQ, NO.# BIS #M.BOT,U.CW2(R5) ; ELSE BOT.C!30$: BIT #X0.EOT,XST0(R2) ;EOT?R BEQ 50$ ;IF EQ, NO.# BIS #M.EOT,U.CW2(R5) ; ELSE EOT.(*50$: BIT #X0.WLK,XST0(R2) ;WRITE LOCKED? BEQ 60$ ;IF EQ, NO., BIS #M.HWL,U.CW2(R5) ; ELSE WRITE LOCKED.60$: BIT #SR.OFL,R1 ;ONLINE?# BEQ 70$ ;IF EQ, YES.O1 BIS #M.SER,U.CW2(R5) ; ELSE SEL ERR - OFFLINE.E+70$: MOV #IS.SUC&377,R0 ;ASSUME SUCCESS.U. BIC #^C,R1 ;R1 - TERMINATION CODE.8 CMPB MSGHDR(R2),MESSAG(R1) ;MESSAGE MATCH TERM CODE? BEQ 80$ ;IF EQ, YES.T. MOV #SR.TC2!SR.TC1,R1 ; ELSE TERM CODE = 6.680$: JMP @ERJTBL(R1) ;SERVICE INTRPT PER TERM CODE. .PAGE;+*; SERVICE INTERRUPT PER TERMINATION CODE;NC; R0 - IS.SUC&377 R1 - TERM CODE R2 - > COMMAND PACKETR4; R3 - CNTRLR INDX R4 - > SCB R5 - > UCB;-+; TERMINATION CODE 0 - NORMAL TERMINATIONS9TCL0ER: BIT #CS.LBA,CSTAT(R3) ;WRITTEN CHARACTERISTICSI BEQ TCEXIT ;IF EQ NO, EXIT,; TERMINATION CODE 1 - ATTENTION CONDITION;TCL1ER: BIC #CS.LBA,CSTAT(R3) ;CLEAR BUFFER ADDRESS FLAG) CLR DEVTYP(R3) ;DETERMINE DEVICE TYPE.  MOV XST2(R2),R1 ;R1 - XSTAT2.6 BIC #^C,R1 ;R1 - DEVICE IDENTIFIER.  CMP #X2.TK2,R1 ;TK25?  BNE 10$ ;IF NE, NO.C%  INC DEVTYP(R3) ;DEVICE TYPE - TK25S8  MOVB #UD.8K,U.CW3+1(R5) ; AND UPDATE DENSITY SUPPORT.  BR 30$T+10$: TST R1 ;TS11/TSV05 .OR. TU80/TSU05?E BNE 20$ ;IF NE, TU80/TSU05. ' BIT #HF.UBM,@HFMSK ;UMRS? ;CS020E& BNE 30$ ;IF NE, THEN TS11. ;**-1 BR 25$ ; .. CONT.;20$: CMP #X2.TU8,R1 ;TU80? BEQ 30$ ;IF EQ, YES.425$: INCB DEVTYP+1(R3) ;DEVICE TYPE - TSV05/TSU05.'30$: JMP ILDBA ;PROCESS QIO REQUEST.F*; TERMINATION CODE 2 - TAPE STATUS ALERT$TCL2ER: BIT #M.EOT,U.CW2(R5) ;EOT? BEQ 10$ ;IF EQ NOU! CMPB #CC.WRD,(R2) ;WRITE DATA?P BEQ 5$ ;IF EQ YES  CMPB #CC.WTM,(R2) ;WTMK? ! BEQ 5$ ;IF EQ YES$" CMPB #CC.ERS,(R2) ;ERASE?# BNE 10$ ;IF NE NO ,$5$: MOV #IE.EOT&377,R0 ;SET EOT FOR RETURN% BR TCEXIT ;END REQUEST.&''10$: BIT #X0.TMK,XST0(R2) ;TAPE MARK? ( BEQ 20$ ;IF EQ NOC*) MOV #IE.EOF&377,R0 ;ENDING STATUS - EOF * BR TCEXIT ; AND END REQUEST.+0,20$: BIT #X0.RLL,XST0(R2) ;RECORD LENGHT LONG?- BEQ TCEXIT ;IF EQ NO&. MOV #IE.DAO&377,R0 ;SET RECORD LONG!/ BR TCEXIT ;PROCESS COMPLETIONP0(1; TERMINATION CODE 3 - FUNCTION REJECT283TCL3ER: BIT #CS.GST,CSTAT(R3) ;GET STATUS IN PROGRESS?4 BNE TCEXIT ;IF NE YES!5 BIT #M.SER,U.CW2(R5) ;OFFLINE? 6 BEQ 10$ ;IF EQ NOE7 CALLR NORDY ;YES, HANDLE ITT86910$: BIT #X0.VCK!X0.ILC!X0.ILA,XST0(R2) ;HARD ERROR?: BNE FATAL ;IF NE YES FATAL-; BIT #M.HWL,U.CW2(R5) ;DEVICE WRITE LOCKED?B< BEQ TCEXIT ;IF EQ NO%= MOV #IE.WLK&377,R0 ;SET WRITE LOCKO.>TCEXIT: JMP @INTADD(R3) ;GOTO REQUEST ENDUP.?"@FATAL: JMP TCL6ER ;FATAL ERROR.A00|wIwttt tfDATA .PAGE>B; TERMINATION CODE 4 - RECOVERABLE ERROR: TAPE MOVED 1 BLOCKC DTCL4ER: TSTB DEVTYP(R3) ;TK25?E BEQ 2$ ;IF EQ, NO.F MOV (R2),R1 ;R1 - I/O!G BIC #^C<17>,R1 ; COMMAND CODE.YH CMP #5,R1 ;WRITE TO TAPE?BI BEQ 1$ ;IF EQ, YES.X#J CMP #11,R1 ;WTMK OR ERASE TAPE?IK BNE 2$ ;IF NE, NO./L1$: BIT #X1.EW,XST1(R2) ;TK25 EW WRITE ERROR?E&M BNE 3$ ;IF NE, YES - DON'T LOG IT.)N2$: CALL MSDVER ;LOG THE DEVICE ERROR.G<O3$: BIT #CS.NER!CS.UMD,CSTAT(R3) ;ERR RECOVERY INHIBITED?&P BNE 30$ ;IF NE, YES - END REQUEST.-Q MOV (R2),R0 ;RETRIEVE COMMAND HEADER WORDS/R BIC #^C<6437>,R0 ;R0 - CMND MODE, CMND CODE.M,S TST RCVCNT(R3) ;SETUP FOR ERROR RECOVERY?T BNE 20$ ;IF NE, YES.U CMPB #1,R0 ;READ?BV BEQ 10$ ;IF EQ, YES.W CMPB #5,R0 ;WRITE?X BEQ 5$ ;IF EQ, YES.NY CMPB #11,R0 ;WTMK?(Z BNE FATAL ;IF NE, I/O NOT RETRIABLE.4[5$: BIT #M.IWR,U.CW2(R5) ;(USER) INHIBIT XND GAPS?\ BNE 30$ ;IF NE, YES.5]10$: BIS #CM.RTY,(R2) ;I/O REQUEST - RETRY COMMAND.?-^ MOV #REREAD,RCVCNT(R3) ;ASSUME READ RETRY.V_ CMPB #1,R0 ;I/O= READ?` BEQ 20$ ;IF EQ, YES..a MOV #WRTOVR*2,RCVCNT(R3) ;ELSE, WRITE/WTMK.b20$: CMPB #1,R0 ;READ?Cc BEQ 22$ ;IF EQ, YES.d BIT #M.EOT,U.CW2(R5) ;EOT?e BEQ 22$ ;IF EQ, NO.0f CMPB #WRTOVR,RTTBL(R3) ;RECOVERY - NGT 10 FT?g BHIS 22$ ;IF HIS, NO.B;h MOVB #WRTOVR,RTTBL(R3) ;ERR RCVRY - NGT 10 FT AFTER EOT.Ri;SETUP FOR ERROR RECOVERY.%j22$: DECB RTTBL(R3) ;RETRY FURTHER?Mk BEQ PARERR ;IF EQ, NO.#l25$: DEC RCVCNT(R3) ;REISSUE I/O?3m BNE AGAIN ;IF NEQ, YES.Pn CMPB #1,R0 ;READ?,o30$: BNE PARERR ;IF NE, NO - END REQUEST.pq;CLEAN TAPE ON READ.r TSTB DEVTYP(R3) ;TK25?.s BNE AGAIN ;IF NE, NO TAPE CLEAN FOR TK25S.5tCLEAN: MOV INTADD(R3),CLNRTN(R3) ;RCVRY ISR RETURN,(,u MOV #CLNISR,INTADD(R3) ;CLEAN ISR RETURN.)v MOV (R2),CMDPK1(R3) ;CMD PKT HDR WRD,V-w MOV 2(R2),CMDPK2(R3) ; DATA TRFR LO BUF @.R3x MOV #5,CLNCNT(R3) ;IF READ FWD, BCKSPC 5 BLOCKS.B'y TSTB PRVDIR+1(R3) ;READ FWD REQUEST?(z BEQ 27$ ;IF EQ, YES.,{ DEC CLNCNT(R3) ;READ REV - BCKSPC 4 BLKS,6|27$: MOV #CC.SRR,(R2) ;TAPE CLEAN (BCKSPC OVER CLNR)7}CLNSET: MOV CLNCNT(R3),CMDB2(R2) ; AND SPACING COUNT.A0~ BEQ FWDPOS ; IF EQ, Repositioned for RD FWD." CLR CLNED(R3) ;NONE SPACED YET.?CLNAGN: MOVB #CLNTMO,S.VITM(R4) ;CHECK SUBCYCLES AND ;CS020, RITM8=.-2 ;CS020V7 MOVB #CLNCYC,S.VSTS(R4) ; SUBCYCLE TIMEOUT. ;CS020# RSTS9=.-2 ;CS020K% BR AGAIN ; .. CLEAN TAPE. ;**-2E%CLNISR: MOV CMDB2(R2),-(SP) ;UPDATE% SUB RBPCR(R2),(SP) ; BLOCKS SPACEDB  ADD (SP)+,CLNED(R3) ; COUNT. TSTB PRVDIR(R3) ;SPACE REV?& BEQ FWDCLN ;IF EQ, NO - SPACE FWD?;TAPE CLEAN - SPACING REV.$ TST RBPCR(R2) ;COMPLETED REQUEST? BEQ REVDON ;IF EQ, YES.. BIT #X0.BOT,XST0(R2) ;BOT?( BNE REVDON ;IF NE, DONE.%POSAGN: MOV CLNCNT(R3),-(SP) ;SETUPM" SUB CLNED(R3),(SP) ; REMAINING  MOV (SP)+,CMDB2(R2) ; SPACE BR CLNAGN ; COUNT.;-REVDON: MOV CLNED(R3),CLNCNT(R3) ;SETUP FOR2' TSTB PRVDIR+1(R3) ;READ FWD REQUEST?  BNE 100$ ;IF NE, READ REV. DEC CLNCNT(R3) ;SPACE N-1.R BR 110$ ; .. CONT."100$: INC CLNCNT(R3) ;SPACE N+1.8110$: MOV #CC.SRF,(R2) ;TAPE CLEAN (FWDSPC OVER CLNR). BR CLNSET ; . . CONT.Y*FWDCLN: TST RBPCR(R2) ;REPOSITIONED FWD? BNE POSAGN ;IF NE, NO.,FWDPOS: MOV CMDPK1(R3),(R2) ;SETUP CMD PKT% BIC #CM.RTY,(R2) ;COMMAND WORD AND2+ MOV CMDPK2(R3),CMDB2(R2) ; LO ORD BUF @.* MOVB #1,S.VSTS(R4) ;ONE READ ;CS020 RSTS10=.-2 ;CS0201 MOVB #RDTMO,S.VITM(R4) ; TIMEOUT AND ;CS020 RITM9=.-2 ;CS020: MOV CLNRTN(R3),INTADD(R3) ; > INTRPT PROCESSING. ;**-2(AGAIN: JMP INITIO ;RE-INITITIATE I/O. .PAGE:; TERMINATION CODE 5 - RECOVERABLE ERROR: TAPE NOT MOVED'TCL5ER:CALL MSDVER ;LOG DEVICE ERRORN( DECB RTTBL(R3) ;DECREMENT RETRY COUNT! BNE AGAIN ;IF NE RETRIES LEFTM2PARERR: MOV #IE.VER&377,R0 ;UNRECOVERABLE ERROR. BR TCEND ;END REQUEST.,00|wvtcccc; TERMINATION CODE 6 - UNRECOVERABLE ERROR*TCL6ER: MOV #IE.FHE&377,R0 ;FATAL ERROR. CALL MSDVER ;LOG ERROR AND"TCEND: JMP IODON ; END REQUEST./; TERMINATION CODE 7 - FATAL CONTROLLER ERROR;<TCL7ER: CLR @S.CSR(R4) ;INITIALIZE DEVICE - ELSE UNUSABLE.9 MOV #TCL6ER,SSRRTY(R3) ;END REQUEST WHEN DEVICE READY.C0 BIS #CS.WSS,CSTAT(R3) ;WAIT FOR DEVICE READY:@ MOVB #5.,S.VITM(R4) ;TEST FOR DEV RDY AT 5 SEC INTRVL, ;CS020 RITM10=.-2 ;CS020? MOVB #240.,S.VSTS(R4) ; UP TO 240 TIMES - 20 MINS.V ;CS020E RSTS11=.-2 ;CS0203 MOVB S.VITM(R4),S.VCTM(R4) ;START TIMER ;CS020D RITM11=.-4 ;CS020 RCTM5=.-2 ;CS020O RETURN ;**-3 .PAGE;C; MOUNT COMPLETION;A(IMOUNT: BIT #M.SER,U.CW2(R5) ;OFFLINE?' BNE 10$ ;IF NE YES, IT'S FATAL HEREC BIT #M.BOT,U.CW2(R5) ;BOT?T BEQ 10$ ;IF EQ, NO.V/ BICB #US.PWF,U.STS(R5) ;ELSE RESET PWFLD INDL BR ISTAT ; AND END REQUEST.C.10$: MOV #IE.FHE&377,R0 ;NO, SET FATAL ERROR;V-; STATUS EXIT FOR SET, SENSE, MOUNT AND SET ;M0ISTAT: MOV U.CW2(R5),R1 ;SET STATUS WORD IN R1 BR IODON ;;+A; **- IRWDU - SUCCESSFUL IO.RWD/IO.RWU RESETS US.PWF INDICATIONN;-%IRWDU: TST R0 ;SUCCESSFUL RWD/RWU?2 BMI 10$ ;IF MI, NO.$0 BICB #US.PWF,U.STS(R5) ;ELSE RESET PWFLD IND,# INCB PRVDIR(R3) ; Pre dir - REV.V010$: BIC #M.RWD,U.CW2(R5) ;RWND, IF ANY, OVER. BR IODON ;END REQUEST. .PAGE;#; SPACE BLOCKS COMPLETIONE;%ISPCB: BIT #M.PEOV,U.CW2(R5) ;PEOV?O BEQ IOCOM ;IF EQ, NO.4 MOV #SBRPOS,INTADD(R3) ;RETURN @ AFTER BACKSPACE. BR BCKSPC ;SETUP REQUEST.;+3; **-SBRPOS - POSITIONED AEOV SPACING VIA BLOCKS.;-%SBRPOS: CLR R1 ;NO BLOCKS SPACED,I BR NDAEOV ; AEOV ENDUP.;+&; **- ISPCF - SPACE FILES COMPLETION;-3ISPCF: BIT #CC.STR-CC.STF,(R2) ;SPACING REVERSE?I$ BNE SFREV ;IF NE, YES. ;CS0179 BIT #CS.SFB,CSTAT(R3) ;SPACING FILES VIA BLOCKS? ;**-1 BNE SPCFB ;IF NE, YES.U BIT #M.PEOV,U.CW2(R5) ;PEOV?; BEQ IOCOM ;IF NE, NO./ SUB RBPCR(R2),SPCNT(R3) ;SPACED FILE COUNT.C;NDSPFB: MOV #SFRPOS,INTADD(R3) ;RETURN @ AFTER BACKSPACE. &BCKSPC: MOV #CC.SRR,(R2) ;BACKSPACE MOV #1,CMDB2(R2) ; 1 BLOCK. 8 MOVB #15.,S.VSTS(R4) ;WAIT UP TO 15 SUBCYCLES ;CS020 RSTS12=.-2 ;CS0207 MOVB #4,S.VITM(R4) ; 4 SECONDS PER SUBCYCLE. ;CS020S RITM12=.-2 ;CS020! BR AGAIN ;ISSUE I/O. ;**-2I;+B; **-SFRPOS - RETURN AFTER REPOSITIONING TO AEOV FOR SPACE FILES;-+SFRPOS: DEC SPCNT(R3) ;SPACED FILE COUNTR$ MOV SPCNT(R3),R1 ; TO REQUESTOR.*NDAEOV: BIC #M.PEOV,U.CW2(R5) ;NOT PEOV,$ BIS #M.AEOV,U.CW2(R5) ; BUT AEOV.& MOV #IE.EOV&377,R0 ;INDICATE AEOV,  BR IODON ; END REQUEST. ? SPCFB: MOV #ISPCFB,INTADD(R3) ;SPC FILES VIA BLOCK SERVICING.0 ISPCFB: INC SPACED(R3) ;SPACED ONE MORE FILE.  BIT #M.PEOV,U.CW2(R5) ;PEOV?0 BNE 10$ ;IF NE, YES.O" CMP SPACED(R3),SPCNT(R3) ;DONE? BNE AGAIN ;IF NE, NO.) MOV #IS.SUC&377,R0 ;R0 - RETURN CODE,E( MOV SPCNT(R3),R1 ;R1 - SPACED COUNT, BR IODON ; END REQUEST.310$: MOV SPACED(R3),SPCNT(R3) ;SPACED FILE COUNT.V# BR NDSPFB ;REPOSITION TO AEOV.V ;CS017A ;CS017 8SFREV: BIT #M.BOT,U.CW2(R5) ;BACKED INTO BOT? ;CS017# BEQ IOCOM ;IF EQ, NO. ;CS017 6 MOV #IS.SUC&377,R0 ; ELSE - IS.SUC IF BOT. ;CS017 ;CS017 ;CS017Y ;CS017(; ;**-1?9; COMMON EXIT ROUTINE FOR ALL ROUTINES REQUIRING STATUSR; 3IOCOM: MOV U.CNT(R5),R1 ;RETRIEVE REQUESTED COUNTO* SUB RBPCR(R2),R1 ; LESS RESIDUAL COUNT.;(! ; COMMON EXIT FOR ALL FUNCTIONSP!;;"1#IODON: CALL MSDINT ;CALL DIAGNOSTIC COMPLETIONS3$ MOV RTTBL(R3),R2 ; R2 - TOTAL RTRYS, RTRYS LEFT.?4% BIC #CS.CIP,CSTAT(R3) ;CLEAR COMMAND IN PROGRESS*% CALL @EIODON ;CALL COMPLETION ;CS0202' JMP MSINI ;GO CHECK FOR ANOTHER REQUEST ;**-1( .PA00|wIwttt tfDATAGE);+(*; **-MSDVER/MSDTER- LOG DEVICE ERRORS.+;LB,; THE DRIVER LOGS THE COMMAND PACKET, DEVICE STATUS REGISTER ANDA-; MESSAGE PACKET (INCLUDING EXTENDED STATUS REGISTERS) LOCATED..; IN THE DRIVER DATA BASE. /;U 0; INPUT:1; R3 = CONTROLLER INDEXT2; R4 = SCB ADDRESS3; R5 = UCB ADDRESS4;R5;26;-7 8 .ENABL LSBT 9MSDVER: MOV R2,-(SP) ;SAVE R2.:9 MOV DVERR,-(SP) ;(SP) - @ TO LOG DEVICE ERRORS. ;CS020; BR 10$ ; ;**-1 <MSDTER: MOV R2,-(SP) ;SAVE R2.;< MOV DVTMO,-(SP) ;(SP) - @ TO LOG DEVICE TIMEOUTS. ;CS020E>10$: BIT #CS.UMD,CSTAT(R3) ;USER MODE DIAGNOSTIC IN PROGRESS ;**-1? BEQ 20$ ;IF EQ NOC@ TST (SP)+ ;MAINTAINGA TST (SP)+ ; STACK.!B RETURN ;RETURN TO THE CALLERN*C20$: MOV CMDPTR(R3),R2 ; > ERR LOG DATA.0D CALL @(SP)+ ;CALL EXEC ERROR LOGGING ROUTINEE MOV (SP)+,R2 ;RESTORE R2. F RETURN ;; G .DSABL LSBVHI .PAGEJ;+/K; **-MSDINT- DIAGNOSTIC REGISTER PASS ROUTINE L;1BM; IF ENTRY WAS FROM A DIAGNOSTIC CONTROL FUNCTION, THEN MOVE THEEN; I/O PACKET WORDS 17 & 20 TO WORDS 20 & 21 FOR THE $CRPAS ROUTINE.DO;S@P; THE DRIVER PASSES THE COMMAND PACKET, DEVICE STATUS REGISTERHQ; AND MESSAGE PACKET (INCLUDING XTND STS REGS) VIA THE $CRPAS ROUTINE.R;V S; INPUTS:2T;EU; R3 = CONTROLLER INDEX+V; R4 = SCB ADDRESSW; R5 = UCB ADDRESSX;-Y7ZMSDINT: BIT #CS.UMD,CSTAT(R3) ;DIAGNOSTIC OPERATION?[ BEQ 30$ ;IF EQ NOA\ MOV R1,-(SP) ;SAVE R1] MOV R2,-(SP) ;SAVE R25] MOV S.VPKT(R4),R1 ;GET I/O PACKET ADDRESS ;CS020] RPKT2=.-2 ;CS020 0_ MOV CMDPTR(R3),R2 ; > DEVICE PACKETS. ;**-15` CMPB #IO.EOF/256.,I.FCN+1(R1) ;WRITE EOF FUNCTION?Ia BEQ 10$ ;IF EQ YES2b CMPB #IO.RWD/256.,I.FCN+1(R1) ;REWIND FUNCTION?c BEQ 10$ ;IF EQ YES<c CALL @CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTICS ;CS020e BR 20$ ;GO TO EXIT ;**-1T>f10$: MOV I.PRM+14(R1),I.PRM+16(R1) ;MOVE PACKET WD20 TO WD21:g MOV I.PRM+12(R1),I.PRM+14(R1) ;MOVE PACKET WD17 TO WD20<g CALL @CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTICS ;CS0209g MOV S.VPKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS ;CS020Ag RPKT3=.-2 ;CS020O?j MOV I.PRM+14(R1),I.PRM+12(R1) ;MOVE WD20 BACK TO WD 17 ;**-28k MOV I.PRM+16(R1),I.PRM+14(R1) ;MOVE WD21 BACK TO WD20 l20$: MOV (SP)+,R2 ;RESTORE R2.m MOV (SP)+,R1 ;RESTORE R1.n30$: RETURN ;EXIT TO CALLER oo .PAGE ;CS018p;+:q;**-TRPHYS-TRANSLATE D-SPACE ADDRESS TO PHYSICAL ADDRESSr;,Fs; THIS ROUTINE IS CALLED TO TRANSLATE A KERNEL DATA SPACE ADDRESS TOEt; EQUIVALENT PHYSICAL ADDRESS. IN UNIBUS SYSTEMS, THE UMRS MAP DATA Du; SPACE, SO THE VIRTUAL ADDRESS IS OK. IN ALL NON-I/D SYSTEMS, THEEv; VIRTUAL -> PHYSICAL MAPPING OF EXEC ADDRESSES IS DIRECT. THE ONLY4Fw; SITUATION REQUIRING TRANSLATION IS THEREFORE AN I/D SYSTEM RUNNINGx; ON A Q-BUS.Ry;z; CALLING SEQUENCE:C{; 4{; CLR -(SP) ; CLEAR HI-ORD ADDRESS AREA. ;CS018-|; MOV ...,-(SP) ;PUSH ADDRESS TO TRANSLATE}; CALL TRPHYS ;TRANSLATE2}; MOV (SP)+,... ; GET TRANSLATED LO-ORD ;CS0181}; MOV (SP)+,... ; AND HI-ORD ADDRESS. ;CS018M}; ;CS018;- ;**-1TRPHYS: ; REFERENCE LABEL .IF DF K$$DAS, BIT #DV.EXT,U.CW1(R5) ;22-BIT CONTROLLER?, BEQ 10$ ;IF EQ NO, NO TRANSLATION NEEDED# MOV R0,-(SP) ; Save R0 ;CS018A% MOV R1,-(SP) ; and R1. ;CS018; MOV @SCMOF,R1 ; Get 32-wd block addr of D-space. ;CS0201 CLR R0 ; and R0=0 for @ translation. ;CS018C> SUB #200,R1 ; R1 - @ D space starting at virtual 200;CS018/ ASHC #6,R0 ; Translate the D pool @ ;CS018E" ADD R1,6(SP) ; and ;CS018$ ADC R0 ; return it ;CS0181 BIC #^C<3>,R0 ; (18 bit phys @) ;CS018V, MOV R0,10(SP) ; to user. ;CS018& MOV (SP)+,R1 ; Restore R1 ;CS018% MOV (SP)+,R0 ; and R0. ;CS018V10$: ;**-7 .ENDC ; DF K$$DAS RETURN ;RETURN TO CALLERc .PAGE ;CS020;+ ;CS020s9; **-MSKRB - CONTROLLER STATUS CHANGE ROUTINE ;CS020 9; **-M00|w}wtccccSUCB - UNIT STATUS CHANGE ROUTINE ;CS020 ; ;CS020I; The status change routines are NOPS and are provided only as a ;CS020CK; mechanism to gain control at MSKRB to translate the exec vector. ;CS020 ;- ;CS020+ ;CS020 8MSKRB: BCS MSUCB ; IF CS - offline call, nop. ;CS0201 TST EXEVEC ; Exec vector translated ? ;CS020 2 BNE MSUCB ; IF NE, Yes - don't repeat. ;CS0200 MOV @#112,R0 ; R0 > table of entries ;CS020; MOV (R0),R0 ; and apr bias (1st word of table). ;CS020A4 MOV KINAR6,-(SP) ; Save I-space mapping. ;CS020< MOV (R0),KINAR6 ; Map common through I-space APR6. ;CS0201 MOV #EXEVEC,R3 ; R3 > Exec vector and ;CS020l8 MOV #EXEVCL,R2 ; R2 = length of vector area. ;CS0201 CALL @#140004 ; Translate the vectors. ;CS020 6 MOV (SP)+,KINAR6 ; Restore I-space mapping. ;CS020,; Patch driver SCB references ;CS020. MOV #SCBPAT,R0 ; R0 > patch table. ;CS020510$: MOV (R0)+,R2 ; R2 > driver @ to patch ;CS020 9 BEQ MSUCB ; IF EQ (R0> table terminator), end. ;CS020s: MOV @(R0)+,(R2) ; Else - patch driver location ;CS0206 BR 10$ ; and continue till driver patched. ;CS020 ;CS020l)MSUCB: JMP MSPWF ; Continue. ;CS020r .ENDCS0201 CALL @#140004 ; Translate the vectors. ;CS020 6 MOV (SP)+,KINAR6 ; Restore I-space mapping. ;CS020,; Patch driver SCB references ;CS020. MOV #SCBPAT,R0 ; R0 > patch table. ;CS020510$: MOV (R0)+,R2 ; R2 > driver @ to patch ;CS020  .TITLE DRDSPE .IDENT /15.00/O; 7; COPYRIGHT (C) 1987 BY DIGITAL EQUIPMENT CORPORATIONR; ALL RIGHTS RESERVED.;U>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;E ; D. N. CUTLER 12-AUG-73 ;)+ ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:K ;T-; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:.;;; J. R. KAUFFMAN; J. M. LAWLER; T. LEKASI; B. S. MCCARTHY;M-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:N;.; B. S. MCCARTHY; L. B. MCCULLEY; ; MODIFIED BY:;$; B. S. MCCARTHY 13-DEC-86 15.00;F#; BM377 -- MOVE DRDSP TO DIR11M D;B(; DIRECTIVE DISPATCHER);C*; MACRO LIBRARY CALLSF+; ,%- .MCALL HDRDF$,HWDDF$,TCBDF$,WDBDF$./'0 HDRDF$ ;DEFINE TASK HEADER OFFSETSK&1 HWDDF$ ;DEFINE HARDWARE REGISTERS.2 TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS13 WDBDF$ ;DEFINE USER WINDOW DEF BLOCK OFFSETS4;J5; DEFINE SIZE OF LARGEST DPB TO BE COPIED INTO EXEC. ANY CHANGES TO THISA6; ASSIGNMENT MUST BE REFLECTED IN THE DPB BUFFER SIZE IN SYSCM.-7;68'9 DPBMAX = 16. ;RPOI IS 16 WORDS LONGI:;+;; **-$TRTRP-TRAP TRAPP<;RJ=; THIS ROUTINE IS TRAPPED TO WHEN A TRAP INSTRUCTION IS EXECUTED. IF THEH>; STACK DEPTH IS ZERO, THEN A DIRECTIVE STATUS IS TO BE RETURNED. ELSE??; CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE.F@; A; INPUTS:DB; -C; 2(SP)=PS WORD PUSHED BY TRAP INSTRUCTION.E-D; 0(SP)=PC WORD PUSHED BY TRAP INSTRUCTION.YE;G F; OUTPUTS:G;IDH; IF THE STACK DEPTH IS ZERO, THEN A DIRECTIVE STATUS IS RETURNED.DI; ELSE CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE.J;-K L .ENABL LSBEL ; BM377 L .IF NDF D$$PAR ; BM377L ; BM377S*M$TRTRP::TST $STKDP ;;;STACK DEPTH ZERO?N BNE $EMTRP ;;;IF NE NO6O MOV (SP)+,R0 ;;;GET ADDRESS + 2 OF TRAP INSTRUCTION*P MFPI -(R0) ;;;PICK UP TRAP INSTRUCTIONP ; BM377E"P .IFF ; NDF D$$PAR ; BM377P ; BM377=P$TRTR1:: ;REFERENCE LABEL FOR DRSUB TRAP HANDLER ; BM377IP ; BM377.#P .ENDC ; NDF D$$PAR ; BM377HP ; BM377NP ; BM377-Q MOVB (SP)+,R0 ;;;RETRIEVE DIRECTIVE STATUSF8R MOV (SP),PS ;;;RESTORE TRAP PS FOR CORRECT PREV MODE/S MOV #$STACK-22,SP ;RELOAD EXEC STACK POINTER;&T MOV R0,-(SP) ;SAVE DIRECTIVE STATUSU BPL 1$ ;IF PL OKAY AS IS*V INC @$USRPS ;SET CARRY IN USER PS WORDWX .IF DF G$$G00}wIwttt tfDATAEFY,Z JMP 60$ ;IF ERROR SKIP GGEF COUNT UPDATE[\ .ENDC ; DF G$$GEF](^1$: JMP 59$ ;GO UPDATE GGEF USE COUNT_`;+a; **-$EMTRP-EMT TRAPb; Jc; THIS ROUTINE IS TRAPPED TO WHEN AN EMT INSTRUCTION IS EXECUTED. IF THEEd; STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED. ELSE A TEST ISCFe; MADE TO SEE IF THE EMT INSTRUCTION HAD A CODE OF 377. IF NOT, THENHf; CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE. ELSE THE&g; APPROPRIATE DIRECTIVE IS EXECUTED.h;F i; INPUTS:j;J,k; 2(SP)=PS WORD PUSHED BY EMT INSTRUCTION.,l; 0(SP)=PC WORD PUSHED BY EMT INSTRUCTION.m; n; OUTPUTS:o;Bp; IF THE STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED. ELSEGq; CONTROL IS GIVEN TO THE EMT/TRAP SST ROUTINE OR A DIRECTIVE ROUTINEE3r; DEPENDENT ON WHETHER THE EMT HAD A CODE OF 377. s;-tu;I@v; DETERMINE IF LEGITIMATE ENTRY FROM USER STATE. IF NOT, CRASHw;Ow ; BM377D w .IF NDF D$$PAR ; BM377w ; BM377E2x$EMTRP::TST $STKDP ;;;ARE WE AT STACK DEPTH +1?y BGT 2$ ;;;IF GT YES.#z JMP $CREMT ;;;ELSE CRASH SYSTEMT{;OB|; DETERMINE IF ENTRY WAS VIA EMT 377. IF NOT PROCESS NON-RSX EMT};S1~2$: DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITY ~ ; BM377O"~ .IFF ; NDF D$$PAR ; BM377~ ; BM377H=~$EMTR1:: ;REFERENCE LABEL FOR DRSUB TRAP HANDLER ; BM377 ~ ; BM377.~ .IF DF K$$DAS ; BM377 ~ ; BM377D=~ MOV $DRAPR,KDSAR5 ;MAP COMMON IN I-SPACE AS WELL ; BM377P~ ; BM377D"~ .ENDC ; DF K$$DAS ; BM377~ ; BM377E#~ .ENDC ; NDF D$$PAR ; BM377F~ ; BM3777" MOV #$UMPC,R3 ;POINT TO USER PC* MOV (R3)+,R5 ;GET ADDRESS OF EMT PLUS 2" MFPI -(R5) ;GET DIRECTIVE WORD# CMP #104377,(SP) ;DIRECTIVE EMT?  BEQ 3$ ;IF EQ YES:$ JMP 80$ ;HANDLE NON-RSX EMT TRAP; <; PUSH ASSUMED SUCCESFUL STATUS. DIRECTIVE PROCESSORS MAY:;8; RETURN, IN WHICH CASE THE +1 IS THE DIRECTIVE STATUS?; OVERWRITE THE +1 AND RETURN, IN WHICH CASE THE NEW VALUE ISD; THE STATUS?; ISSUE A TRAP INSTRUCTION, IN WHICH CASE THE LOW BYTE OF THE ; TRAP IS THE RETURNED STATUS; 33$: MOV #1,(SP) ;SET SUCCESSFUL DIRECTIVE STATUS2; ;; IN ACCOUNTING SYSTEMS, CHARGE THE TASK WITH A DIRECTIVET; .IF DF A$$CNT. MOV $TKTCB,R0 ;POINT TO TCB OF CURRENT TASK1 MOV T.ACN(R0),R0 ;LOCATE ITS ACCOUNTING BLOCKS: BEQ 5$ ;IF EQ, NO ACCOUNTING5 MOV #B.DIR,R1 ;GET OFFSET TO DIRECTIVE COUNT FIELDD* CALL $ADAT1 ;INCREMENT DIRECTIVE COUNT 5$: ; .ENDC;C7; POINT TO AND INITIALIZE DRDSP SCRATCH AREA IN DRTBLE;R7 MOV #$USRPS,R5 ;POINT TO DISPATCH TABLE SCRATCH AREAC( MOV R3,(R5)+ ;SAVE ADDRESS OF USER PS. BIC (SP),(R3)+ ;CLEAR CARRY IN USER PS WORD CLR (R5) ;INDICATE NO BYTESV;CG; BEGIN VALIDATION OF DPB. GET TOP WORD OF STACK, CHECK TO SEE IF THEN<; DPB IS ON THE STACK (ODD) OR POINTED TO BY STACK (EVEN).;EJ; BETWEEN THE LABELS $DRLM1 AND $DRLM2, AN SST IN THE EXEC IS TREATED ASK; NON-FATAL AND IS CONVERTED TO A DIRECTIVE STATUS RETURN OF IE.ADP. THIS K; WAY WE CAN JUST ACCESS THE DPB WITHOUT THE EXPENSE OF ADDRESS CHECKING.T;E# MFPI SP ;GET USER STACK POINTERU MOV (SP)+,R3 ;,5$DRLM1:: ;START OF AREA OF ALLOWED TRAPS IN SSTSRA/ ;(BREAKPOINTS IN THIS AREA WILL NOT WORK)G1 MFPD$ (R3)+ ;GET FIRST WORD ON USER STACK AND # ;ADVANCE PAST IF DPB ON STACKY BIT #1,(SP) ;DPB ON STACK? BNE 10$ ;IF NE YESD; H; DPB IS POINTED TO BY TOP OF STACK. SET $BTRMV TO 2 INDICATING REMOVEK; ONLY ADDRESS FROM STACK. REPLACE TOP WORD ON KERNEL STACK (DPB ADDRESS)O; WITH FIRST WORD OF DPB.C;T1 MOV #2,(R5) ;INDICATE DPB POINTED TO BY STACKV# MOV (SP)+,R3 ;SET ADDRESS OF DPBA3 MFPD$ (R3)+ ;GET FIRST WORD OF DPB AND POINT TON ;SECOND ;O<; PICK UP FIRST DPB WORD FROM STACK, EXTRACT DIC, DPB SIZE;V+10$: MOV (SP)+,R1 ;PICK UP FIRST DPB WORDD" MOV R1,R4 ;COPY FIRST DP00}wwtccccB WORD CLR R0 ; BISB R1,R0 ;EXTRACT DIC BYTE# CLRB R4 ;CLEAR LOW BYTE OF COPY& SWAB R4 ;SWAP DPB SIZE TO LOW BYTE$ BMI 346$ ;IF MI ILLEGAL DPB SIZE. ASL R4 ;CONVERT TO BYTES TO REMOVE AT EXIT TST (R5)+ ;DPB ON STACK ?T BNE 15$ ;IF NE NOS- MOV R4,-2(R5) ;SET BYTES TO REMOVE ON EXITW.15$: MOV R1,(R5)+ ;SAVE FIRST WORD IN $DICSV;I; WE NOW HAVE:;OD; R0 = DIRECTIVE IDENTIFICATION CODE (DIC) ZERO PADDED TO 16 BITS.A; R1 = DPB SIZE IN BYTES (NUMBER OF BYTES TO REMOVE FROM STACK)B-; R3 = VIRTUAL ADDRESS OF FIRST WORD IN DPBR;BB; $DICSV = FIRST WORD OF DPB (SAVED COPY SO THAT COMMON ROUTINES1; CAN DETERMINE WHICH DIRECTIVE WAS EXECUTED)S;E;A/; INITIALIZE GROUP GLOBAL EVENT FLAG POINTERS$;  .IF DF G$$GEF: MOV #$GEFPT+2,$GEFPT ;INIT GRP GLOBAL USE COUNT POINTER9 MOV #$GEFPT+2,$GFTCB ;INIT GRP GLOBAL USER TCB POINTERR .ENDC ; DF G$$GEF;RI; INITIALIZE FLAG WHICH INDICATES DPB VALID/INVALID. IF THIS IS A VALID J; DIRECTIVE, WE WILL REPLACE THIS FLAG WITH THE ADDRESS OF THE DIRECTIVE; PROCESSING ROUTINE LATER.O; - CLR -(SP) ;ASSUME ILLEGAL DIC OR DPB SIZE ;TF; VALIDATE DIC AND CONVERT TO POINTER INTO TABLE OF TWO WORD ENTRIES; FOR DIRECTIVES.;D ASR R0 ;DIVIDE CODE BY 2 BCC 357$ ;IF CC ILLEGAL DICT' CMP R0,#HI$DIC ;IS DIC OUT OF RANGE?R BHI 357$ ;IF HI YESR( ASL R0 ;CONVERT TO DOUBLE WORD INDEX4 ADD #$DSTAB+1,R0 ;POINT TO COMPLEMENT OF DPB SIZE; ;**-19 G; GET NEGATIVE OFFSET INTO MOVE TABLE FROM DIRECTIVE TABLE. THIS USES3 ; THE LEFTOVER BYTE AND SAVES A FEW INSTRUCTIONS.S ;L,  MOVB (R0),R2 ;GET COMPLEMENT OF LENGTH*4 ;CI ; VALIDATE THAT EITHER DPB SIZE MATCHES THAT SHOWN IN THE TABLE OR THATDA; THE DIRECTIVE CODE WILL VERIFY THE SIZE (SIZE IN TABLE = 0 ).;R" CMPB R4,-(R0) ;DPB SIZE MATCH ? BEQ 34$ ;IF EQ YES( CMP (PC)+,R1 ;IS IT GMCR$ DIRECTIVE ?" .BYTE 127.,41. ;DIC, DPB SIZE ? BEQ 34$ ;IF EQ YES6 TSTB (R0) ;DEFER CHECKING FOR VARIABLE LENGTH DPB?-346$: BNE 357$ ;IF NE NO, ILLEGAL DPB SIZEV! MOV R4,R2 ;COPY SIZE IN BYTESS" ASL R2 ;CONVERT TO DOUBLEWORDS; CMP #DPBMAX*4,R2 ;DPB SIZE BIGGER THAN TRANSFER VECTOR ?A) BLO 357$ ;IF LO YES, ILLEGAL DPB SIZE  NEG R2 ;CREATE JUMP INDEXT;ZG; REPLACE ZERO FLAG ON STACK WITH ADDRESS OF PROCESSING ROUTINE. THISQ7; INDICATES TO THE CODE BELOW THAT THE DPB WAS VALID.?;.< 34$: MOV TB$SIZ(R0),(SP) ;GET ADDRESS OF DIRECTIVE ROUTINE! BEQ 357$ ;IF EQ ILLEGAL DICB6" MOV 2*TB$SIZ(R0),R4 ;GET PROCESSING MASK FLAGS BYTE#;V?$; PROCESS " A C H K D B " FLAG - ADDRESS CHECK AND MAP 8 WORDL%; PLAS DEFINITION BLOCK.&; G'; FOR PLAS DIRECTIVES, WE TAKE THE ONE PARAMETER OUT OF THE DPB. THIS D(; PARAMETER IS THE ADDRESS OF AN 8 WORD STRUCTURE (RDB OR WDB). WEG); VALIDATE READ/WRITE ACCESS TO THE BLOCK AND PASS THIS BLOCK, RATHERO6*; THAN THE DPB, TO THE DIRECTIVE PROCESSING ROUTINE.+;;<,; ON SYSTEMS SUPPORTING EXTERNAL TASK HEADERS, THE WDB/RDB9-; IS COPIED INTO THE EXECUTIVE INTERMEDIATE BUFFER AREAE=.; (STARTING ADDRESS $DICSV) SO THAT KERNEL APR6 CAN BE USEDPD/; EXCLUSIVELY TO MAP THE ISSUING TASK HEADER. SINCE THE DIRECTIVE?0; PROCESSING ROUTINES WILL NOT BE MANIPULATING THE USERS COPY D1; OF THE WDB/RDB, IT WILL BE NECESSARY TO RETURN ANY OUTPUT FIELDSB2; OF THE WDB/RDB AT THE COMPLETION OF DIRECTIVE PROCESSING ALONGD3; WITH THE NORMAL DSW RETURN CODE. THE WORD CONTAINING THE NUMBERB4; OF BYTES TO ADD TO THE USERS SP AT THE COMPLETION OF DIRECTIVEB5; PROCESSING ($BTRMV) IS NEGATED TO INDICATE THAT THE ADDITIONALB6; OUTPUT FIELDS OF THE WDB/RDB MUST BE WRITTEN TO THE USER TASK.7; 8 .IF DF P$$LAS9(: BPL 345$ ;IF PL NOT A PLAS DIRECTIVE: ; BM377EQ:; PUSH ADDRESS OF INTERMEDIATE LINKAGE FOR DISPATCHER FOR INTERMEDIATE ; BM377 P:; CALL TO THIRD DIRECTIVE COMMON (NOTE THAT FOR THIS CASE, DRTBL DOES ; BM3774:; NOT HAVE THE ADDRESS SHIFTED RIGHT. ; B00}wIwttt tfDATAM377: ; BM377T>: MOV #$DRCL3,-(SP) ;PUSH ADDRESS OF LINKAGE ROUTINE ; BM377: ; BM377I;M MFPD$ (R3) ;PICK UP POINTER TO DEFINITION BLOCK ;**-18SN MOV (SP)+,R3 ; 0O MFPD$ (R3) ;READ/WRITE ACCESS TO FIRST WORD?P MTPD$ (R3) ;1Q MFPD$ 16(R3) ;READ/WRITE ACCESS TO LAST WORD?SR MTPD$ 16(R3) ;ST .IF DF X$$HDRU;V NEG $BTRMV ;INDICATE ADDITIONAL OUTPUT FIELDS TO RETURNEWX .ENDC ; DF X$$HDRY$Z MOV #16.,R2 ;SET SIZE FOR $RELCD-[ CALL $RELCD ;RELOCATE/MAP PLAS DEF. BLOCKT\] .IF DF X$$HDR^/_ MOV R3,(R5)+ ;SAVE KERNEL VA OF USER WDB/RDB 3` MOV KISAR6,(R5)+ ;SAVE KERNEL MAPPING TO WDB/RDBTab .REPT Vc4d MOV (R3)+,(R5)+ ;COPY USER WDB/RDB TO EXEC BUFFERef .ENDRg.h MOV #$DICSV+6,R3 ;POINT TO INTERNAL RDB/WDB0i MOV $SAHDB,KISAR6 ;MAP TO CURRENT TASK HEADERjk .ENDC ; DF X$$HDRlm.n BIC #WS.CRW!WS.UNM!WS.ELW!WS.RRF,W.NSTS(R3)0o MOV $TKTCB,R5 ;POINT TO TASK TCB FOR ROUTINES0o JMP 51$ ;JOIN COMMON DISPATCH CODE ; BM377o ; BM377Ro ; BM377 q ;**-1Ur .ENDC ; DF P$$LASst345$: ;REFERENCE LABELTu;/Fv; HERE WE SPECIAL CASE THE GMCR$ DIRECTIVE AND ADDRESS CHECK THE DPBGw; SINCE THE MFPD$ CHECKS WON'T WORK FOR DPB'S GREATER THAN 32. WORDS.Lx;W-y CMP (PC)+,R1 ;MCR COMMAND LINE DIRECTIVE ?E z .BYTE 127.,41. ;DIC, DPB SIZE{ BNE 35$ ;IF NE NO.-| SUB #2,R3 ;POINT BACK TO BEGINNING OF DPB;-} ;(CAN'T USE TST, R3 NOT KERNEL ADDRESS)I+~ MOV #41.*2,R1 ;SET SIZE TO ADDRESS CHECK 7 CALL $ACHKP ;ADDRESS CHECK AND MAP BLOCK READ/WRITEN2 TST (R3)+ ;ADVANCE PASTFIRST WORD (TST OK NOW)  BR 355$ ; ;AH; HERE WE "ADDRESS CHECK" THE DPB BY COPYING IT TO AN INTERNAL BUFFER.C; THIS IS FASTER THAN A REAL ADDRESS CHECK AND ELIMINATES SEVERALC; MAPPING PROBLEMS. ;T/35$: JMP $DRLM2(R2) ;JUMP INTO TABLE OF MOVES3 .REPT DPBMAXB+ MFPD$ (R3)+ ;GET ONE WORD FROM USER DPB(* MOV (SP)+,(R5)+ ;AND PUT IT IN OUR COPY .ENDR;TF; THERE MUST BE EXACTLY TWO WORDS BETWEEN THE END OF THE MOVE VECTOR; AND THE LABEL $DRLM2.P;R* MOV #$DICSV+2,R3 ;POINT TO INTERNAL DPB;E>; THIS IS THE END OF THE CODE WHICH IS PROTECTED FROM TRAPS.;0$DRLM2:: ;END OF AREA OF A ALLOWED TRAPS AND ;NO BREAKPOINTS.; J; MAP THE CURRENT TASK HEADER IF EXTERNAL HEADER SUPPORT. IT WILL ETIHERI; STAY MAPPED THROUGH THE DIRECTIVE, OR BE REMAPPED TO SEC. POOL TCB IF+; THE DIRECTIVE CAN USE THEM.;. .IF DF X$$HDR0 MOV $SAHDB,KISAR6 ;MAP TO CURRENT TASK HEADER .ENDC ; DF X$$HDR;2C; SET UP R5 TO POINT TO CURRENT TASK'S TCB FOR DIRECTIVE ROUTINESI; 355$: ;REFERENCE LABELE0357$: MOV $TKTCB,R5 ;POINT TO CURRENT TASK TCB;AG; SEE IF DIRECTIVE WAS LEGAL. IF NOT, SKIP FLAGS INTERPRETATION CODE.H; % TST (SP) ;LEGAL DIC AND DPB SIZE?H BNE 37$ ;IF NE, YESG JMP 90$ ;IF EQ, ILLEGALE37$: ;REFERENCE LABEL;I9; BEGIN TO SET UP PARAMETERS FOR DISPATCHING TO ROUTINEM;A.; R5 = TCB ADDRESS OF TASK ISSUING DIRECTIVE;; SWAB R4 ;REARRANGE FLAGS TST R4 ;TEST FLAGS! BEQ 50$ ;IF EQ NO OPTION CODEI& BMI 40$ ;IF MI TASK ORIENTED FLAGS; ?; PROCESS " C E F N C L " FLAG - CONVERT EVENT FLAG NUMBER TOI; ADDRESS/BIT MASK PAIRS;RE; IF THE DIRECTIVE REQUIRES EVENT FLAG LOOKUP OR PROCESSING, DO SO.3;I/ ROR R4 ;INCREMENT USE COUNT IF GRP GLOBAL ?R4 BCS 38$ ;IF CS DON'T INCREMENT GRP GBL USE COUNT5 CALL $CEFNG ;CONVERT EFN AND LOCK IF GROUP GLOBALO BR 39$ ;JOIN COMMON CODE38$: ;REF LABEL) CALL $CEFN ;CONVERT EVENT FLAG NUMBER$2 BIC #1,R1 ;CLR GROUP GLOBAL 2ND MASK INDICATOR+39$: BCC 50$ ;IF CC EVENT FLAG SPECIFIED ;G?; PROCESS " C E F N M T " FLAG - EVENT FLAG MUST BE SPECIFIED;! ROR R4 ;EVENT FLAG REQUIRED ?  BCC 50$ ;IF CC NO, OKD;3%; REQUIRED EVENT FLAG NOT SPECIFIEDO;F& DRSTS D.RS97 ;SET DIRECTIVE STATUS;E=; 00}wwtccccPROCESS " S R S T C L " FLAG - CALL $SRSTD TO LOOK UP TCBF;P;AI; NOW PROCESS TASK LOOKUP OPTIONS. THE BEQ BELOW TAKES CARE OF BOTH THEVF; CASE WHERE NO $SRSTD CALL IS SPECIFIED, AND THE CASE WHERE WE JUST$; FINISHED PROCESSING EVENT FLAGS.;F@; NOTE: ******************************************************;FD; THIS SECTION SHOULD EVENTUALLY CALL $SRMUT EVEN IF $SRXXX FAILS.;;J; PROCESS " S E C T C B " FLAG - CALL $SRPRO TO LOOK UP TCB IN SECONDARY"; OR PRIMARY POOL TASK LISTS; 140$: ASLB R4 ;TASK ALLOW SECONDARY POOL TCBS ? BPL 405$ ;IF PL NO" CALL $SRPRO ;LOOK UP TASK NAME" BCS 402$ ;IF CS TASK NOT FOUND& BIT #1,R0 ;TCB IN SECONDARY POOL ? BEQ 401$ ;IF EQ NO" DEC R0 ;POINT BACK TO APR BIAS( MOV (R0),KISAR6 ;MAP TCB THROUGH APR6 MOV #140000,R0 ;POINT TO TCBS-401$: CMP (R3)+,(R3)+ ;POINT PAST TASK NAMER;A@; PROCESS " C R E T C B " FLAG - DIRECTIVE MAY CREATE TCB FROM; MULTI-USER TASK TCB.; ) ASLB R4 ;CAN DIRECTIVE CREATE A TCB ?L+ BPL 43$ ;IF PL NO, DO MULTI-USER CHECKSB$ BR 46$ ;ELSE YES, SKIP MU CHECKS;PA; $SRPRO OR $SRSTD COULD NOT FIND THE PROTOTYPE. SEE IF WE NEEDI3; TO SUBSTITUTE XXXTNN AND DO SO OR RETURN STATUS ;N.402$: ASLB R4 ;CAN DIRECTIVE CREATE A TCB ?) BMI 110$ ;IF MI YES, PROTO MUST EXIST4403$: CMP (R3),#^R... ;TASK NAME FOLLOW MULTI-USER ;CONVENTION ? (...XXX)( BNE 110$ ;IF NE NO, PROTO MUST EXIST/ MOV 2(R3),R1 ;SET FIRST HALF OF MU TASK NAMER) MOV T.UCB(R5),R0 ;SET TERM UCB ADDRESSN* CMP (R3)+,(R3)+ ;ADVANCE PAST TASK NAME% MOV R3,-(SP) ;AND SAVE DPB POINTER % CALL $SRMUT ;LOOK FOR MU TASK TCBE$ MOV (SP)+,R3 ;RESTORE DPB POINTER  BCC 46$ ;IF CC MU TASK FOUND BR 110$ ;ELSE ERRORA;VE; PROCESS " D F C T S K " FLAG - TASK NAME DEFAULTS TO CURRENT TASKM ;)5 405$: ASLB R4 ;TASK NAME DEFAULT TO CURRENT TASK ?   BPL 41$ ;IF PL NO '  MOV R5,R0 ;PICK UP CURRENT TASK TCB)"  TST (R3) ;TASK NAME SPECIFIED? BEQ 42$ ;IF EQ NOS-41$: CALL $SRSTD ;SEARCH STD FOR TASK NAMEC& BCS 403$ ;IF CS TASK NOT IN SYSTEM.42$: CMP (R3)+,(R3)+ ;ADVANCE PAST TASK NAME;CH; IF SPECIFIED TASK IS A MULTI-USER (...XXX) TASK, LOOK FOR LOCAL COPY;BE43$: CMP T.NAM(R0),#^R... ;DOES NAME FOLLOW MULTI-USER CONVENTION ?  BNE 46$ ;IF NE NOT! MOV R0,-(SP) ;SAVE TCB POINTERK! MOV R3,-(SP) ;SAVE DPB POINTER= MOV T.NAM+2(R0),R1 ;PICK UP FIRST WORD OF COPY'S TASK NAME9 MOV T.UCB(R5),R0 ;PICK UP TI: UCB FOR NAME CALCULATION3 CALL $SRMUT ;SEARCH STD FOR MULTIUSER TASK COPYS$ MOV (SP)+,R3 ;RESTORE DPB POINTER BCC 45$ ;IF CC COPY FOUNDT- MOV (SP),R0 ;RESTORE ORIGINAL TCB ADDRESSL45$: TST (SP)+ ;CLEAN STACK 46$: ;REF LABEL!;PH"; PROCESS " M U P C H K " FLAG - PERFORM MULTI-USER PROTECTION CHECKS.#;E2$ ASLB R4 ;PERFORM MULTI-USER PROTECTION CHECK ?% BPL 49$ ;IF PL NO2& BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED?' BNE 49$ ;IF NE YES3( BIT #T3.SLV,T.ST3(R0) ;TARGET TASK A SLAVE TASK?C$) BNE 120$ ;IF NE YES, DON'T ALLOW?* CMP T.UCB(R5),T.UCB(R0) ;CURRENT AND TARGET TASK UCBS MATCH? + BNE 120$ ;IF NE NO,;06-; SET UP PARAMETERS FOR DIRECTIVE PROCESSING ROUTINE.;A#/49$: MOV R0,R1 ;COPY TCB ADDRESSR,0 ADD #T.STAT,R1 ;POINT TO TASK STATUS WORD%050$: ;REFERENCE LABEL ; BM377 0 ; BM377R0 .IF DF D$$PAR ; BM377 0 ; BM377V<0 ASL (SP) ;DIRECTIVE IN FIRST OR SECOND COMMON ? ; BM377*0 BCC 51$ ;IF CC ITS IN FIRST ; BM377>0 MOV #$DRCL2,-(SP) ;PUSH ADDRESS OF LINKAGE ROUTINE ; BM3770 ; BM377N"0 .ENDC ; DF D$$PAR ; BM3770 ; BM377B051$: MOV R5,R2 ;SET POINTER TO SECOND TASK STATUS WORD ; BM3772 ADD #T.ST2,R2 ; ;**-13;+4; ** W A R N I N G **K5;U6; SPM HOOKPOINT NUMBER 01.7; +8; DO NOT CHANGE THE INSTRUCTION FOLLOWING$9; LABEL WITHOUT CHECKING SPM:;-;-<$SPH01==. ;SPM CHANGES THE INSTRUCTION ATM!= ;THE LOCATION 00}wIwttt tfDATAOF THIS LABELI>0? MOV @#$SAHPT,R4 ;POINT TO CURRENT TASK HEADER@AB;G8C; CALL DIRECTIVE ROUTINE WITH THE FOLLOWING ARGUMENTS:D; .E; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.1F; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.35G; R3=ADDRESS OF THE NEXT WORD IN THE DIRECTIVE DPB.NBH; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.I; R1=DEPENDENT ON DIRECTIVE.J; R0=DEPENDENT ON DIRECTIVE.K;5\55$: CALL @(SP)+ ;CALL DIRECTIVE ROUTINE ;**-16 \ ; BM377I\ .IF DF D$$PAR ; BM377;\ ; BM377 >\$DRFIN:: ;REFERENCE LABEL FOR COMMON LINK ROUTINES ; BM377\ ; BM377"\ .ENDC ; DF D$$PAR ; BM377\ ; BM377D];OC^; INCREMENT GROUP GLOBAL USE COUNTS (OR SCRATCH WORD IF DIRECIVESN_; DON'T USE GROUP GLOBALS)`;Sa59$: ;REFERENCE LABELbc .IF DF G$$GEFd1e INC @$GEFPT ;INCREMENT GROUP GLOBAL USE COUNT f3g INCB @$GFTCB ;INC GRP GLOBAL USE COUNT FOR TASKThi .ENDC ; DF G$$GEFjk;I)l; WRITE DIRECTIVE STATUS BACK INTO TASK m; 0n60$: MTPD$ @#H.DSW ;SET DIRECTIVE STATUS WORDo;OFp; IF THE NUMBER OF BYTES TO REMOVE FROM USER STACK IS NEGATIVE, THENGq; WE HAVE JUST PROCESSED A PLAS DIRECTIVE. WE MUST RETURN THE OUTPUTCGr; FIELDS TO THE USER TASK (RDB/WDB) FROM THE INTERMEDIATE BUFFER AREARs;Nt; OUTPUT FIELDS IN WDB/RDBu;8v; W.NID W.NBAS W.NRID W.NLEN W.NOFF W.NSTS8w; R.GID R.GSIZ R.GSTSx;Cyz .IF DF X$$HDR{0| TST $BTRMV ;JUST FINISHED A PLAS DIRECTIVE ?} BPL 65$ ;IF PLUS, NO"~ NEG $BTRMV ;YES, TURN OFF FLAG6 MOV #$DICSV+2,R0 ;POINT TO INTERMEDIATE EXEC BUFFER- MOV (R0)+,R1 ;RESTORE KERNEL VA OF WDB/RDBT& MOV (R0)+,KISAR6 ;MAP USERS WDB/RDB MOV (R0)+,(R1)+ ;W.NID R.GIDT! MOV (R0)+,(R1)+ ;W.NBAS R.GSIZ( CMP (R0)+,(R1)+ ;W.NSIZ R.GNAM (SKIP)! MOV (R0)+,(R1)+ ;W.NRID R.GNAMW! MOV (R0)+,(R1)+ ;W.NOFF R.GPAR ! MOV (R0)+,(R1)+ ;W.NLEN R.GPARS! MOV (R0)+,(R1)+ ;W.NSTS R.GSTS65$: ;REFERENCE LABEL .ENDC ; DF X$$HDR; J; GET USER STACK POINTER AND UPDATE TO REMOVE DPB OR ADDRESS OF DPB FROM; THE STACK.;F# MFPI SP ;GET USER STACK POINTERA0 ADD $BTRMV,(SP) ;REMOVE BYTES FROM USER STACK' MTPI SP ;RESTORE USER STACK POINTER;VJ; END OF DIRECTIVE PROCESSING, GO BACK TO SYSTEM ENTRANCE/EXIT ROUTINES.;0 RETURN ;EXIT FROM TRAPM;(!; EMT/TRAP SST ROUTINE TRANSFER(;;80$: ;REFERENCE LABEL .IF DF X$$HDR1 MOV $SAHPT,R5 ;GET ADDR OF CURRENT TASK HEADER2 MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER .IFFE1 MOV $HEADR,R5 ;GET ADDR OF CURRENT TASK HEADERU .ENDC ;X$$HDR5 MOV H.WND(R5),R5 ;POINT TO NUMBER OF WINDOW BLOCKS 1 TST W.BLVR+2(R5) ;CURRENT TASK MAPPED TO EXEC?C BEQ 85$ ;IF EQ NOK. CMP (SP),#104376 ;IS THIS A CALL TO $SWSTK? BNE 85$ ;IF NE NO& JMP $SWSTK ;PROCESS CALL TO $SWSTK%85$: JMP $EMSST ;PROCESS SST FAULTB;; ILLEGAL DIRECTIVEM;A*90$: DRSTS D.RS99 ;SET DIRECTIVE STATUS;I,; REQUIRED EVENT FLAG NUMBER NOT SPECIFIED;+100$: DRSTS D.RS97 ;SET DIRECTIVE STATUSE;3; SPECIFIED TASK NAME NOT FOUND IN TASK DIRECTORYB; *110$: DRSTS D.RS2 ;SET DIRECTIVE STATUS;T; PRIVILEGE VIOLATION ;K .IF DF M$$MUP+120$: DRSTS D.RS16 ;SET DIRECTIVE STATUS .ENDC;T; ALLOCATION FAILURE;; .IF DF R$$DSP*130$: DRSTS D.RS1 ;SET DIRECTIVE STATUS .ENDC  .DSABL LSB .ENDUIRED EVENT FLAG NUMBER NOT SPECIFIED;+100$: DRSTS D.RS97 ;SET DIRECTIVE STATUSE;3; SPECIFIED TASK NAME NOT FOUND IN TASK DIRECTORYB; *110$: DRSTS D.RS2 ;SET DIRECTIVE STATUS;T; PRIVILEGE VIOLATION ;K .IF DF M$$MUP+120$: DRSTS D.RS16 ;SET DIRECTIVE STATUS .ENDC;T; ALLOCATION FAILURE;; .IF DF R$$D00~wwtcccc .TITLE DRDRV  .IDENT /14.03/T; 6; COPYRIGHT (C) 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;D<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;.; P. J. BEZEREDI 19-SEP-79;O$; MODIFIED FOR RSX-11M-PLUS V2.1 BY:; ; P.J. BEZEREDIR ; P.J. CARRS ; J. GALLANT;U; MODIFIED BY:; ; C. SESTOKAS 22-FEB-84 14.01 ; 0; CS001 -- HCRC ERROR RECOVERY - R1 NOT SETUP (; IN DROFF ROUTINE MODIFIES LOWCORE.;; L. KOGAN 17-APR-84 14.02;I9; LK001 -- CORRECT THE PROBLEM WITH ENTERING MEANINGLESSS ; ENTRIES INTO ERROR LOG FILE;R; B. S. MCCARTHY 6-AUG-85 14.03 ;D/; BM368 -- ADD CONDITIONAL SKIP OF FIRST DRIVEF!; NOT READY ERROR FOR POWERFAILI;-;-;;; RH11/RH70-RM02/RM03/RM05/RM80/RP07 OVERLAPPED SEEK DRIVERR;  .MCALL HWDDF$,PKTDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;O,; DEVICE REGISTER AND STATUS BIT DEFINITIONS;E%RMCS1=0 ;CONTROL STATUS REGISTER 1-IE=100 ;INTERRUPT ENABLECTRE=40000 ;TRANSFER ERRORE*MCPE=20000 ;MASSBUS CONTROL PARITY ERROR#DVA=4000 ;DRIVE AVAILABLE TO PORT RMWC=2 ;WORD COUNT REGISTER"RMBA=4 ;BUFFER ADDRESS REGISTER(RMDA=6 ;DESIRED TRACK/SECTOR REGISTER%RMCS2=10 ;CONTROL STATUS REGISTER 2KDLT=100000 ;DATA LATE ERRORTWCE=40000 ;WRITE CHECK ERROR UPE=20000 ;UNIBUS PARITY ERROR#NED=10000 ;NONEXISTENT DISK ERRORE$NEM=4000 ;NONEXISTENT MEMORY ERRORPGE=2000 ;PROGRAMMING ERRORE!MXF=1000 ;MISSED TRANSFER ERRORC%MDPE=400 ;MASSBUS DATA PARITY ERROR0!RMDS=12 ;DRIVE STATUS REGISTERVERR=40000 ;ERROR SUMMARY BIT$PIP=20000 ;POSITIONING IN PROGRESSMOL=10000 ;MEDIUM ONLINEWRL=4000 ;WRITE LOCKED DRIVE$PGM=1000 ;PROGRAMMABLE PORT SELECT!DPR=400 ;DRIVE PRESENT ON PORT DRY=200 ;DRIVE READY0VV=100 ;VOLUME VALIDOM=1 ;OFFSET MODE ACTIVER"RMER1=14 ;ERROR SUMMARY REGISTERDCK=100000 ;DATA CHECK ERRORUNS=40000 ;DRIVE UNSAFEN!OPI=20000 ;OPERATION INCOMPLETEEDTE=10000 ;DRIVE TIMING ERRORAWLE=4000 ;WRITE LOCK ERROR IAE=2000 ;INVALID DISK ADDRESSAOE=1000 ;ADDRESS OVERFLOWHCRC=400 ;HEADER CRC ERROR HCE=200 ;HEADER COMPARE ERRORECH=100 ;ECC HARD ERRORWCF=40 ;WRITE CLOCK FAILUREFER=20 ;FORMAT ERRORR#PAR=10 ;CONTROL BUS PARITY ERRORD!RMR=4 ;REGISTER MODIFY REFUSED ILR=2 ;ILLEGAL REGISTERILF=1 ;ILLEGAL FUNCTION&RMAS=16 ;ATTENTION SUMMARY REGISTER RMDBR=22 ;DATA BUFFER REGISTER RMMR=24 ;MAINTENANCE REGISTERRMDT=26 ;DRIVE TYPE REGISTER0!RMOF=32 ;DRIVE OFFSET REGISTERNCMOD=100000 ;COMMAND MODIFIERR"MTD=40000 ;MOVE TRACK DESCRIPTOR FMT16=10000 ;FORMAT (1=16 BIT)ECI=4000 ;ECC INHIBITA"HCI=2000 ;HEADER COMPARE INHIBIT&SSEI=1000 ;SKIP SECTOR ERROR INHIBIT%RMDC=34 ;DESIREDED CYLINDER NUMBERI#RMCC=36 ;CURRENT CYLINDER NUMBERARMER2=42 ;ERROR REGISTER 2BSE=100000 ;BAD SECTOR ERROR"SKI=40000 ;SEEK INCOMPLERE ERROR"IVC=10000 ;INVALID COMMAND ERROR&LSC=4000 ;LOSS OF SECTOR CLOCK ERROR#LBC=2000 ;LOSS OF BIT CLOCK ERRORGDVC=200 ;DEVICE CHECK ERRORSSE=40 ;SKIP SECTOR ERROR$DPE=10 ;MASSBUS DATA PARITY ERROR!RMEC1=44 ;ECC POSITION REGISTERA RMEC2=46 ;ECC PATTERN REGISTER;S; LOCAL EQUATED SYMBOLSR;I,XCT=1 ;FUNCTION HAS BEEN EXECUTED (1=YES)'ERL=2 ;ERROR HAS BEEN LOGGED (1=YES)%ADR=10 ;ADDRESS BITS SETUP (1=YES)0'SEL=20 ;PORT SELECT WAIT (1=WAITING)EOFA=100 ;OFFSET ACTIVE FLAG(RETRY=8. ;CONTROLLER ERROR RETRY COUNT;T ; LOCAL DATA;B.DELTA: .WORD 3 ;ROTATIONAL OPTIMIZATION DELTA;C=; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLER NUMBER)T;A7RTTBL: .BLKW R$$M11 ;RETRY COUNT FOR CURRENT OPERATION 5OFFAD: .BLKW R$$M11 ;ADDRESS OF CURRENT OFFSET VALUE0DGTBL: .BLKW R$$M11 ;DIAGNOSTIC PARAMETER TABLE=PRMSV: .BLKW R$$M11*5 ;PARAMETER SAVE AREA FOR ERROR RECOVERYB ;AND WRITE CHECK&SAVWC: .BLKW R$$M11 ;SAVED WORD00~xIwttt tfDATA COUNT=DLTWC: .BLKW R$$M11 ;SAVED WORD COUNT FOR DATA LATE RECOVERYT.$DROPT::.REPT R$$M11 ;SEEK OPTIMIZATION TABLE/ .WORD 1 ;0=IMPLIED SEEK; 1=ALWAYS SEEK FIRSTO .ENDR;A ; OFFSET POSITIONING VALUE TABLE;R"OFFTB: .WORD FMT16!0 ;PLUS OFFSET .WORD FMT16!200 ;MINUS OFFSET .WORD 0 ;$;;; DIAGNOSTIC FUNCTION TABLEU;$FUNTBL: .BYTE 107, IO.HMS!IQ.UMD&377 .BYTE 105, IO.BLS!IQ.UMD&377  .BYTE 115, IO.OFF!IQ.UMD&377R$FUNTB: .BYTE 135, IO.DGN!IQ.UMD&377 .BYTE 151, IO.WCK!IQ.UMD&377T$FUNTB1: .BYTE 171, IO.RPD!IQ.UMD&377 .BYTE 161, IO.WPD!IQ.UMD&377O .BYTE 171, IO.CER!IQ.UMD&377A .BYTE 161, IO.CEW!IQ.UMD&377D$FUNTB2: .BYTE 173, IO.RDH!IQ.UMD&377 .BYTE 163, IO.WDH!IQ.UMD&377E .BYTE 175, IO.RTD!IQ.UMD&3776 .BYTE 165, IO.WTD!IQ.UMD&3772$FUNTB3: .BYTE 165, IO.TDD!IQ.UMD&377FUNTBE:T;N; DRIVER DISPATCH TABLEL;B2 DDT$ DR,R$$M11,,,,,,OPT ;GENERATE DISPATCH TABLE;+7; **-DRINI-RH11/RH70-RM02/RM03/RM05/RM80/RP07 DISK PACK!; CONTROLLER INITIATOR;WE; THIS IS THE DRIVER ENTRY POINT FROM THE QUEUE I/O DIRECTIVE WHEH ANDE; I/O REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO&F; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED UNIT IS NOTF; BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSEG; A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT SUCCEEDS,LE; THEN THE NEXT I/O OPERATION IS INITIATED AND A RETURN TO THE CALLERD; IS EXECUTED.;/ ; INPUTS:M;R6; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIALIZED.;R ; OUTPUTS:;TA; IF THE SPECIFIED UNIT IS NOT BUSY AND AN I/O REQUEST IS WAITING A; TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-O; ATION IS INITIATED.E;-7DRINI: GTPKT$ DR,R$$M11 ;GET NEXT I/O PACKET TO PROCESSE;E1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:I;X'; R1=ADDRESS OF THE I/O REQUEST PACKET.L-; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.D; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.A6; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIALIZED.;P=; RH11/RH70-RM02/03/RP07 DISK PACK I/O REQUEST PACKET FORMAT:T; "; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK. @; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.5; WD. 04 -- FIRST LUN WORD IN REQUESTORS TASK HEADER.K; WD. 05 -- I/O FUNCTION CODE.0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.=; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000).M3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.A; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER.V+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.T-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED. <; WD. 15 -- DIAGNOSTIC SUPPLIMENTAL PARAMETER ELSE NOT USED.8; WD. 16 -- BITS <0:7> = HIGH LBN, BITS <8:15> NOT USED.#; WD. 17 -- LOW LBN OF I/O REQUEST.R.; WD. 20 -- RELOCATION BIAS OF REGISTER BLOCK.;; WD. 21 -- REGISTER BLOCK ADDRESS (DISPLACEMENT + 140000).E;(# CLRB U.CW2+1(R5) ;RESET UNIT FLAGSI$ CALL $VOLVD ;VALIDATE VOLUME VALID BCS 10$ ;IF CS WE FAILED TST R0 ;TRANSFER FUNCTION? BMI DRRQC ;IF MI YES) JMP DRVV ;PROCESS VOLUME VALID FUNCTION-10$: CALL $IODON ;FINISH I/OR" BR DRINI ;TRY FOR ANOTHER PACKET;A*; REQUEST CONTROLLER FOR PROPER OPERATION.;:0DRRQC: MOV S.KRB(R4),R1 ;GET CURRENT KRB ADDRESS5 BIT #KS.POE,K.STS(R1) ;PARALLEL OPERATIONS ENABLED?F BEQ DRRQC1 ;IF EQ NO. MOV S.PKT(R4),R3 ;RETRIEVE I/O PACKET ADDRESS* BITB #IQ.Q,I.FCN(R3) ; EXPRESS FUNCTION ? BNE DRRQC1 ; IF NE YES. BITB #IQ.UMD,I.FCN(R3) ; DIAGNOSTIC REQUEST ? BNE 20$ ; IF NE YEST- MOVB K.CON(R1),R3 ;RETREIVE CONTROLLER INDEXS# TST $DROPT(R3) ;WHICH SEEK METHOD?I" BNE 10$ ;IF NE ALWAYS SEEK FIRST3 BIT #KS.DIP,K.STS(R1) ;DATA TRANSFER IN PROGRESS?E+ BEQ DRRQC1 ;IF EQ NO, START DATA TRANSFERT210$: BISB #S3.SIP,S.ST3(R4) ;SET SEEK IN PROGRESS6 CALL $RQCNC ;REQUEST CONTROLLER FOR CONTROL FUNCTION JMP DRINIO ; INITIATE I/OK320$: MOV00~ xwtcccc #FUNTBL,R0 ; GET ADDRESS OF FUNCTION TABLE?)25$: TSTB (R0)+ ; BYPASS CONTROLLER CODE.+ CMPB (R0)+,I.FCN(R3) ; FUNCTION CODE MATCHF BEQ 30$ ; IF EQ YES1" CMP #FUNTB,R0 ; AT END OF TABLE ? BNE 25$ ; IF NE NO, BR DRRQC1 ; YES - NORMAL TRANSFER FUNCTION.30$: TSTB -(R0) ; POINT BACK TO FUNCTION CODE, MOVB -(R0),U.BUF(R5) ; LOAD CONTROLLER CODE BR 10$ ; TREAT AS A SEEK ;DRRQC1: BICB #S3.SIP,S.ST3(R4) ;SET SEEK ALREADY COMPLETEDL3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERK;: ; **-DRUBMP-SETUP UNIBUS ADDRESS;T>; THIS SECTION OF CODE WILL DETERMINE IF THE UNIBUS ADDRESS IS@; ALREADY IN THE FORMAT FOR THE MASSBUS CONTROLLER OR THE UNIBUS<; MAP FOR 22-BIT PROCESSORS WITHOUT RH CONTROLLERS. IT WILLA; ALSO CONVERT THE I/O FUNCTION CODE TO IT'S HARDWARE EQUIVALENT. ;F>; NOTE: AT THIS POINT THE REQUESTING UNIT MUST BE THE OWNER OF%; THE CONTROLLER FOR A DATA TRANSFER.#;S.DRUBMP: MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESS2 BITB #ADR,U.CW2+1(R5);ADDRESS BITS ALREADY SETUP? BNE DRINIO ;IF NE YESS/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?N BEQ 10$ ;IF EQ NOS: BIT #KS.MBC,K.STS(R1) ;YES, IS THIS A 22-BIT CONTROLLER? BNE 20$ ;IF NE YES' CALL $STMAP ;SETUP UNIBUS MAP ADDRESS 210$: ASL U.BUF(R5) ;SHIFT BITS <4:5> TO BITS <8:9> ASL U.BUF(R5) ;...T ASL U.BUF(R5) ;...I ASL U.BUF(R5) ;...G/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?A BEQ 20$ ;IF EQ NO% CALL $MPUBM ;MAP UNIBUS TO TRANSFERB:20$: BISB #ADR,U.CW2+1(R5);INDICATE ADDRESS SETUP COMPLETE* MOV S.KRB(R4),R0 ;GET CURRENT KRB ADDRESS- MOVB K.CON(R0),R0 ;RETRIEVE CONTROLLER INDEX . MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS7 MOV I.PRM+6(R1),DGTBL(R0) ;SAVE DIAGNOSTIC PARAMETERSS. MOV #OM,I.PRM+6(R1) ;SET OFFSET MODE INACTIVE; 3; CONVERT I/O FUNCTION CODE TO HARDWARE EQUIVALENT.U;F4 CMPB #IO.HMS/256.,I.FCN+1(R1) ;DIGNOSTIC FUNCTION? BNE 40$ ;IF NE NOA* CALL DRFUN ;TEST FOR DIAGNOSTIC FUNCTION BCC 25$ ;IF CC NOE6 BIS #SSEI,I.PRM+6(R1) ;SET SKIP SECTOR ERROR INHIBIT225$: MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE830$: MOVB (R0)+,U.BUF(R5) ;LOAD CONTROLLER FUNCTION CODE. CMPB (R0)+,I.FCN(R1) ;IS IT THE CORRECT CODE? BEQ 35$ ;IF EQ YES' CMP #FUNTBE,R0 ;END OF FUNCTION TABLE?6 BNE 30$ ;IF NE NO % MOV #IE.IFC&377,R0 ;ILLEGAL FUNCTIOND BR 45$ ;FINISH I/O435$: CMPB #10,U.CW2(R5) ;TEST HI LBN, IS IT AN RP07? BNE 60$ ;IF NE NOI) CMP #FUNTB2,R0 ;IS IT A HEADER FUNCTION?  BLO 60$ ;IF LO NOI/ CMP #FUNTB3,R0 ;IS TRACK DESCRIPTOR DISPLACED?R BNE 60$ ;IF FM NOM3 BIS #MTD,I.PRM+6(R1);SET MOVE TRACK DESCRIPTOR BITV BR 60$ ;040$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION2 MOVB #171,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTION7 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION? $ BHIS 50$ ;IF HIS FUNCTION IS LEGAL,45$: MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS, MOVB U.UNIT(R5),RMCS2(R2) ;SELECT THE UNIT JMP DRFIN1 ;FINISH I/O'50$: BEQ 60$ ;IF EQ FUNCTION IS A READO0 MOVB #161,U.BUF(R5) ;SET WRITE LOGICAL FUNCTION+60$: MOV S.KRB(R4),R3 ;RETRIEVE KRB ADDRESS#- MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX$ MUL #5,R3 ;SETUP AN INDEX INTO ...' ADD #PRMSV,R3 ;... PARAMETER SAVE AREAR& MOV U.BUF(R5),(R3)+ ;SAVE PARAMETERS MOV U.BUF+2(R5),(R3)+ ;... MOV U.CNT(R5),(R3)+ ;... MOV I.PRM+10(R1),(R3)+ ;... MOV I.PRM+12(R1),(R3)+ ;...E;A%; **-DRINIO-INITIATE AN I/O OPERATIONL; E; THIS ROUTINE WILL INITIATE EITHER A SEEK OR THE DATA TRANSFER OPER-R6; ATION DEPENDING ON HOW THE CONTROLLER WAS REQUESTED.;: ; INPUTS:R;R; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCB.;C*DRINIO: MOV @S.KRB(R4),R2 ;GET CSR ADDRESS) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSE( MOVB U.UNIT(R5),RMCS2(R2) ;SELECT UNIT;S9; DETERMINE IF DRIVE'S PORT IS SEIZED BY THIS CONTROLLER.;V' MTPS #PR5 ;EXECUTE AT DEVICE PRIORITY(+ CLR RMDS(R2) ;;;ATTEMPT TO SEIZE THE DRIVEA* BIT #DPR,RMDS(R2) ;;;DID THE DRIVE SEIZE? BNE 5$ ;;;IF NE YES 2 BISB #SEL,U.CW2+1(R5);;;SET PORT SELECT WAIT FLAG/ MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNT$ CLR S.FRK+2(R00~xIwttt tfDATA4) ;;;ALLOW INTERRUPTS& MOVB #IE,(R2) ;;;RE-ENABLE INTERRUPTS MTPS #0 ;;;ALLOW INTERRUPTSP* CALLR $RLCN ;RELEASE CONTROLLER AND EXIT;T1; CHECK IF THE HEADS ARE ON THE CORRECT CYLINDER.I;S*5$: MOVB #111,(R2) ;;;CLEAR SELECTED DRIVE0 BITB #S3.SIP,S.ST3(R4) ;;;ARE WE DOING A SEEK? BEQ 10$ ;;;IF EQ NO 1 BITB #IQ.UMD,I.FCN(R1) ;;; DIAGNOSTIC FUNCTION ?Z BNE 20$ ;;; IF NE YES . BIT #40,RMDT(R2) ;;;IS THIS AN RM02/03/05/80?& BEQ 20$ ;;;IF EQ YES, IT HAS NO RMCC2 CMP RMCC(R2),I.PRM+10(R1) ;;;DO WE NEED TO SEEK? BNE 20$ ;;;IF NE YES MTPS #0 ;ALLOW INTERRUPTS;# JMP DRRQC1 ;GO REQUEST CONTROLLERL;E.; LOAD CONTROLLER REGISTERS FOR DATA TRANSFER.;O210$: ADD #RMCS2,R2 ;;;POINT TO SECOND CSR REGISTER7 MOV I.PRM+12(R1),-(R2) ;;;INSERT TRACK/SECTOR ADDRESSD0 MOV U.BUF+2(R5),-(R2) ;;;INSERT BUFFER ADDRESS: MOV U.CNT(R5),-(R2) ;;;INSERT NUMBER OF BYTES TO TRANSFER# ROR (R2) ;;;CONVERT TO WORD COUNT & NEG (R2) ;;;MAKE NEGATIVE WORD COUNT" TST -(R2) ;;;POINT BACK TO RMCS15 CMP #IO.DGN!IQ.UMD,I.FCN(R1) ;;;DIAGNOSE MICROCODE? BNE 20$ ;;;IF NE NOU, MOV S.KRB(R4),R0 ;;;GET CURRENT KRB ADDRESS0 MOVB K.CON(R0),R0 ;;;RETRIEVE CONTROLLER NUMBER3 MOV DGTBL(R0),RMMR(R2) ;;;SET DIAGNOSE PARAMETERSR;M'; CHECK FOR DRIVE NOT READY CONDITIONS.C; 120$: MOV #IE.DNR&377,R0 ;;;ASSUME DRIVE NOT READYA; MOV I.PRM+10(R1),RMDC(R2) ;;;SET DESIRED CYLINDER ADDRESSN, MOV RMDS(R2),R3 ;;;GET CURRENT DRIVE STATUS COM R3 ;;;COMPLEMENT STATUSC, BIT #MOL!DRY,R3 ;;;DRIVE READY AND ON LINE? BNE 30$ ;;;IF NE NO1$ BIT #UNS,RMER1(R2) ;;;DRIVE UNSAFE? BEQ 70$ ;;;IF EQ NOB!30$: MTPS #0 ;;;ALLOW INTERRUPTS/ BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP? BEQ 50$ ;IF EQ NO25 BITB #US.VV,U.STS(R5);WAS VOLUME PREVIOUSLY MOUNTED?O BEQ 35$ ;IF EQ NO) JMP DRPWF0 ;YES, WAIT FOR IT TO SPIN UP &35$: JMP DRPWF1 ;WAIT JUST 15 SECONDS350$: BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC OPERATION?; BEQ 60$ ;IF EQ NOT+ JMP DRDIAG ;PASS REGISTERS AND FINISH I/O!60$: ;REFERENCE LABEL .IF DF S2.NRD6 BIT #S2.NRD,S.ST2(R4) ;IS THIS FIRST DRIVE NOT READY?! BNE 61$ ;IF NE NO, GO LOG ERROR;6 BIS #S2.NRD,S.ST2(R4) ;INDICATE FIRST DRIVE NOT READY JMP DRPWF1 ;GO DO A RETRYQ761$: BIC #S2.NRD,S.ST2(R4) ;CLEAR FIRST DRIVE NOT READYD .ENDC ; DF S2.NRD( CALL $DVERR ;LOG DRIVE NOT READY ERROR JMP DRFIN1 ;FINISH I/O370$: BIT #VV,R3 ;;;DID VOLUME VALID STATUS CHANGE?O1 BEQ 75$ ;;;IF EQ NO (NOTE REVERSE STATUS OF VV) 0 BITB #US.SPU,U.STS(R5) ;;;DID WE JUST SPIN UP? BEQ 30$ ;;;IF EQ NON* MOVB #123,(R2) ;;;YES, RESET VOLUME VALID2 BISB #US.VV,U.STS(R5);;;SET SOFTWARE VOLUME VALID375$: BIT #S2.MAD,S.ST2(R4) ;;;MULTI-ACCESS DEVICE?A BEQ 90$ ;;;IF EQ NO . CMP S.KRB(R4),S.KTB(R4) ;;;IS THIS PORT 'A'? BNE 80$ ;;;IF NE NO.0 BICB #S3.SPA,S.ST3(R4) ;;;YES, SHOW IT SPUN UP BR 85$ ;;;380$: BICB #S3.SPB,S.ST3(R4) ;;;IT MUST BE PORT 'B'E385$: BITB #S3.SPU,S.ST3(R4) ;;;BOTH PORTS SPUN UP?E BNE 95$ ;;;IF NE NOB; $; PREPARE TO START AN I/O OPERATION.;?790$: BICB #US.SPU,U.STS(R5) ;;;RESET DRIVE SPINNING UPO+95$: CLR S.FRK+2(R4) ;;;INIT FORK INTERLOCKW/ MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNTM- BIS #S2.ACT,S.ST2(R4) ;;;SHOW I/O IS ACTIVEC5 BISB #XCT,U.CW2+1(R5);;;SHOW FUNCTION BEING EXECUTED 0 BITB #S3.SIP,S.ST3(R4) ;;;SHOULD WE DO A SEEK? BEQ 105$ ;;;IF EQ NO;; START EXPLICIT SEEK.; 1 BITB #IQ.UMD,I.FCN(R1) ;;; DIAGNOSTIC FUNCTION ?4 BEQ 99$ ;;; IF EQ NO2 MOVB U.BUF(R5),(R2) ;;; LOAD POSITIONING FUNCTION BR 101$ ;;;.,99$: MOVB U.PRM(R5),R3 ;;; GET SECTORS/TRACK CLR -(SP) ;;;CLEAR A WORDF6 MOVB I.PRM+12(R1),(SP) ;;;GET DESIRED SECTOR ADDRESS, SUB DELTA,(SP) ;;;SUBTRACT ROTATIONAL DELTA% BPL 100$ ;;;IF PL ADJUSTMENT WAS OKT/ ADD R3,(SP) ;;;CORRECT ADJUSTMENT IF NEGATIVET;100$: MOVB I.PRM+13(R1),1(SP) ;;;SET DESIRED TRACK ADDRESSF9 MOV (SP)+,RMDA(R2) ;;;LOAD ADJUSTED TRACK/SECTOR ADDRESS(+ MOVB #131,(R2) ;;;LOAD THE SEARCH FUNCTION #101$: MTPS #0 ;;; ALLOW INTERRUPTSA( BR DRPWF3 ;RELEASE CONTROLLER AND EXIT;M; START DATA00~xwtcccc TRANSFER.;C(105$: MOV #FMT16,-(SP) ;;;GET FORMAT BIT# BIT #40,RMDT(R5) ;;;IS IT AN RP07?E BNE 106$ ;;;IF NE YESL* BIT #OM,I.PRM+6(R1) ;;;WAS OFFSET ACTIVE? BNE 106$ ;;;IF NE NO, MOVB #115,(R2) ;;;YES, LOAD OFFSET FUNCTION0106$: BIS I.PRM+6(R1),(SP);;;SET OTHER RMOF BITS/ MOV (SP)+,RMOF(R2) ;;;LOAD THE OFFSET REGISTERL, MOV S.KRB(R4),R3 ;;;GET CURRENT KRB ADDRESS7 BIT #IQ.UMD,I.FCN(R1) ;;;IS IT A DIAGNOSTIC FUNCTION?L BEQ 107$ ;;;IF EQ NO2 CMPB U.BUF(R5),#140 ;;;IS IT A UMD SEEK FUNCTION? BLO 108$ ;;;IF LO YESF=107$: BIS #KS.DIP,K.STS(R3) ;;;SET DATA TRANSFER IN PROGRESS71 BIT #FE.EXT,$FMASK ;;;22-BIT ADDRESSING ENABLED?; BEQ 110$ ;;;IF EQ NO7 BIT #KS.MBC,K.STS(R3) ;;;IS THIS A 22-BIT CONTROLLER?  BEQ 110$ ;;;IF EQ NO MOV R3,R1 ;;;COPY KRB ADDRESSS' ADD K.OFF(R3),R1 ;;;POINT TO UCB TABLER+ MOV KE.RHB(R1),R1 ;;;RETREIVE RHBAE OFFSETB' ADD R2,R1 ;;;FORM AN I/O PAGE ADDRESST2 MOVB U.BUF+1(R5),(R1);;;SET MEMORY EXTENSION BITS+108$: MOVB U.BUF(R5),(R2) ;;;START FUNCTIONO BR 120$ ;;;;*110$: MOV U.BUF(R5),(R2) ;;;START FUNCTION 120$: MTPS #0 ;ALLOW INTERRUPTS;#<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.; 1DRCAN: RETURN ;NOP FOR RM02/RM03/RM05/RM80/RP07O;+:; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND>; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT=; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVET?; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANYUA; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESS5; THE UNIT IS ALREADY READY.;-3DRPWF: TSTB S.STS(R4) ;IS THIS UNIT CURRENTLY BUSY?I BEQ DRPWF2 ;IF EQ NO9DRPWF0: MOVB #15.,S.STS(R4) ;WAIT A MAXIMUM OF ONE MINUTE/6DRPWF1: MOVB S.ITM(R4),S.CTM(R4) ;4 SECONDS AT A TIME5DRPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UPH1DRPWF3: CALLR $RLCN ;RELEASE CONTROLLER AND EXITO;+C; **-$DRINT-RH11/RH70-RM02/RM03/RM05/RM80/RP07 DISK PACK CONTROLLER.; INTERRUPT HANDLERT;- .ENABL LSBL3$DRINT::BR DRFRK ;;;ENTRY POINT FOR DATA TRANSFERSS+ TST S.FRK+2(R4) ;;;ARE INTERRUPTS ALLOWED?: BNE DRCAN ;;;IF NE NOU' CALL $FORK ;;;CREATE A SYSTEM PROCESS 6DRFRK: BITB #SEL,U.CW2+1(R5) ;WAITING FOR PORT SELECT BEQ 5$ ;IF EQ NO2 BICB #SEL,U.CW2+1(R5);CLEAR PORT SELECT WAIT FLAG, MOV U.SCB(R5),R4 ;YES, RETREIVE SCB ADDRESS. MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS JMP DRRQC ;GO TRY AGAIN165$: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS- MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEXS# MOV @S.KRB(R4),R2 ;GET CSR ADDRESSA( MOVB U.UNIT(R5),RMCS2(R2) ;SELECT UNIT# TSTB S.STS(R4) ;IS THIS UNIT BUSY?R BNE 10$ ;IF NE YES MTPS #PR5 ;DISABLE INTERRUPTSB/ MOV #TRE!11,(R2) ;;;CLEAR CONTROLLER AND DRIVER: BISB #S3.DRL,S.ST3(R4) ;;;SHOW DUAL ACCESS UNIT RELEASED$ MOVB #113,(R2) ;;;RELEASE THE DRIVE( CLR S.FRK+2(R4) ;;;RESET FORK INTERLOCK MTPS #0 ;;;ALLOW INTERRUPTST BR DRPWF3 ;RELEASE CONTROLLERK;R@; INTERRUPT WAS FROM A BUSY UNIT. IF WE JUST DID A SEEK WE WILLA; GO AND START THE DATA TRANSFER OPERATION. IF THE DATA TRANSFER)>; TERMINATED, DETERMINE WHY. IF WE ARE SPINNING UP, RETRY THE ; OPERATION.;Y110$: BITB #US.SPU,U.STS(R5) ;ARE WE SPINNING UP?( BEQ 15$ ;IF EQ NOE- BIT #S2.MAD,S.ST2(R4) ;MULTI-ACCESS DEVICE?D BEQ 12$ ;IF EQ NOS, CMP S.KRB(R4),S.KTB(R4) ;IS THIS PORT 'A'? BNE 14$ ;IF NE NO 2 BITB #S3.SPA,S.ST3(R4) ;IS PORT 'A' SPINNING UP? BEQ 15$ ;IF EQ NOR%12$: CALLR 100$ ;RETRY THE OPERATION 614$: BITB #S3.SPB,S.ST3(R4) ;IS PORT 'B' SPINNING UP? BNE 12$ ;IF NE YES715$: BIT #S2.EIP,S.ST2(R4) ;ERROR ALREADY IN PROGRESS?  BNE 20$ ;IF NE YES& CALL DRPRM ;SET INITIAL RETRY VALUES.20$: MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS/ MOV #IS.SUC&377,R0 ; ASSUME SUCESSFUL TRANSFERC/ BITB #S3.SIP,S.ST3(R4) ; DID WE JUST DO A SEEK) BEQ 30$ ; IF EQ NO0 BICB #S3.SIP,S.ST3(R4) ; CLEAR SEEK IN PROGRESS/ BITB #IQ.UMD,I.FCN(R1) ; DIAGNOSTIC FUNCTION ?Q BEQ 22$ ; IF EQ NO JMP DRDIAG ; IF NE YES122$: BIT00~"xIwttt tfDATA #ERR,RMDS(R2) ; ANY ERRORS DURING SEEK ?? BEQ 12$ ;IF EQ NOS! CALL $DVERR ;LOG THE SEEK ERRORR! DECB RTTBL(R3) ;COUNT THIS RETRYI" CALL DRERL ;FINISH ERROR LOGGING#25$: MTPS #PR5 ;DISABLE INTERRUPTS / MOV #TRE!11,(R2) ;;;CLEAR CONTROLLER AND DRIVEU/ MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNT ( CLR S.FRK+2(R4) ;;;RESET FORK INTERLOCK- BIS #S2.ACT,S.ST2(R4) ;;;SHOW I/O IS ACTIVEG( MOVB #107,(R2) ;;;START THE RECALIBRATE MTPS #0 ;ALLOW INTERRUPTSE RETURN ;D; 5; INTERRUPT WAS DUE TO A DATA TRANSFER OPERATION OR AG; DIAGNOSTIC FUNCTION ;NC30$: BIT #HCRC!HCE,RMER1(R2) ; HEADER CRC OR HEADER COMPARE ERROR ?E BNE 36$ ;IF NE YES' BIT #SSE,RMER2(R2) ;SKIP SECTOR ERROR?B BEQ 36$ ;IF EQ NO#6 BIS #SSEI,I.PRM+6(R1) ;SET SKIP SECTOR ERROR INHIBIT) CALL DRCLR ;CLEAR SELECTED DRIVE ERRORSS( MOV RMOF(R2),-(SP) ;GET OFFSET REGISTER6 BIS I.PRM+6(R1),(SP) ;SET REMAINING BITS IN REGISTER0 MOV (SP)+,RMOF(R2) ;RE-LOAD THE OFFSET REGISTER. MOV RMWC(R2),R0 ;GET NEGATIVE WORDS REMAINING* BNE 32$ ;IF NE WE HAD A PARTIAL TRANSFER% MOV #-1,R0 ;FAKE A PARTIAL TRANSFERE*32$: ASL R0 ;CONVERT IT TO NEGATIVE BYTES6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED- BIC #777,R0 ;GET BLOCKS ACTUALLY TRANSFEREDP* CALL DRFUN ;TEST FOR DIAGNOSTIC FUNCTION BCC 33$ ;IF CC NOE' CMPB #14.,U.PRM+1(R5) ;IS IT AN RM80?G BNE 33$ ;IF NE NOB! INC U.PRM(R5) ;INC SECTORS/TRACK 433$: CALL DRCALC ;BACKUP TO START OF BLOCK IN ERROR& TST U.CNT(R5) ;LAST BLOCK TRANSFERED? BNE 34$ ;IF NE NO, ADD R0,U.CNT(R5) ;YES, NORMALIZE BYTE COUNT.34$: CALL DRFUN ;TEST FOR DIAGNOSTIC FUNCTION BCC 35$ ;IF CC NOA' CMPB #14.,U.PRM+1(R5) ;IS IT AN RM80?B BNE 35$ ;IF NE NOR" DECB U.PRM(R5) ;DEC SECTORS/TRACK BR 12$ ;RESTART FUNCTION535$: INCB I.PRM+12(R1) ;INC TO NEXT SEQUENTIAL SECTORC BR 12$ ;RESTART FUNCTION736$: BIT #SSEI,RMOF(R2) ;SKIP SECTOR ERROR INHIBIT SET?T BNE 37$ ;IF NE YES8 BIC #SSEI,I.PRM+6(R1) ;RESET SKIP SECTOR ERROR INHIBIT.37$: CALL DRFUN ;IS IT DIAGNOSTIC FUNCTION? BCS DRDIAG ;IF CS YESO(38$: BIT #70,(R2) ;RECALIBRATE FUNCTION? BEQ 80$ ;IF EQ YES BIT #TRE!MCPE,(R2) ;ANY ERRORS? BEQ 70$ ;IF EQ NOT. MOV RMWC(R2),R0 ;GET NEGATIVE WORDS REMAINING( MOV R0,SAVWC(R3) ;SAVE IT FOR LATER USE& CLR DLTWC(R3) ;ZERO SAVED DLT WC FLAG TST RMCS2(R2) ;DATA LATE ERROR? BPL 39$ ;IF PL NO:: MOV R0,DLTWC(R3) ;YES, SAVE REAL NEGATIVE WORDS REMAINING* BNE 39$ ;IF NE WE HAD A PARTIAL TRANSFER8 MOV #-1,DLTWC(R3) ;DLT ON LAST WORD, FAKE A PARTIAL XFR'39$: ASL R0 ;CONVERT TO NEGATIVE BYTESE6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED* SUB #512.,R0 ;SUBTRACT OUT BLOCK IN ERROR) BLE 40$ ;IF LE NO GOOD BYTES TRANSFEREDE1 BITB #ERL,U.CW2+1(R5);ERROR ALREADY IN PROGRESS?  BEQ 40$ ;IF EQ NOR;T:; WE GOT AN ERROR BUT SOME GOOD DATA WAS TRANSFERED. THIS6; INDICATES THAT WE RECOVERED FROM THE PREVIOUS ERROR.;A;E<; NOW LOG THE CURRENT ERROR AND DETERMINE WHAT TYPE OF ERROR1; WE HAD. ERRORS ARE BASICLY HARD, SOFT OR DATA.P;I" CALL DRERL ;FINISH ERROR LOGGING#40$: CALL $DVERR ;LOG DEVICE ERRORU, BISB #ERL,U.CW2+1(R5);SET ERROR LOGGED FLAG, MOV #IE.WLK&377,R0 ;ASSUME WRITE LOCK ERROR& BIT #WLE,RMER1(R2) ;WRITE LOCK ERROR? BNE 60$ ;IF NE YES/ MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORG' BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?E BNE 60$ ;IF NE YES% TST DLTWC(R3) ;REAL DATA LATE ERROR?R BNE 110$ ;IF NE YES 1 BIT #IVC!LSC!LBC!DVC!DPE,RMER2(R2) ;HARD ERROR? BNE 60$ ;IF NE YES1 MOV RMER1(R2),R1 ;GET CONTENTS OF ERROR REGISTERI. BIT #UNS!IAE!AOE!RMR!ILR!ILF,R1 ;HARD ERROR? BNE 60$ ;IF NE YES$ BIT #NED!NEM,RMCS2(R2) ;HARD ERROR? BNE 60$ ;IF NE YES% BIT #SKI,RMER2(R2) ;SEEK INCOMPLETE?W BNE 55$ ;IF NE YES BIT #HCRC,R1 ;HEADER CRC ERROR? BNE 50$ ;IF NE YES$ BIT #HCE,R1 ;HEADER COMPARE ERROR? BNE 55$ ;IF NE NO6 BIT #FER,R1 ;FORMAT ERROR? BNE 60$ ;IF NE YES8 BIT #WCE!UPE!PGE!MXF!MDPE,RMCS2(R2) ;CONTROLLER ERROR? BNE DRRTRY ;IF NE YESE+ MOV #IE.BBE&377,R0 ;ASSUME BAD BLOCK ERRORE% BIT #BSE,RMER2(R200~*xwtcccc) ;BAD BLOCK ERROR?O BNE 60$ ;IF NE YES0 MOV #IE.VER&377,R0 ; ASSUME UNRECOVERABLE ERROR%50$: JMP DRECC ;CHECK FOR ECC ERRORSS'55$: JMP 25$ ;TRY RECALIBRATE FUNCTION7DRDIAG: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASKB" CALL DRCLR ;CLEAR SELECTED DRIVE60$: JMP DRFIN ;FINISH I/O$*70$: BR DRWCHK ;GO TEST FOR A WRITE CHECK;E ; PROCESS POSITIONING OPERATION.;X380$: MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORF. BIT #ERR,RMDS(R2) ;ERRORS DURING POSITIONING? BEQ DRRTRY ;IF EQ NO CALL $DVERR ;LOG IT" CLR R1 ;SHOW NO BYTES TRANSFERED JMP DRFIN1 ;FINISH I/O'100$: CALL DRCLR ;CLEAR SELECTED DRIVEE' CALLR DRUBMP ;RETRY ORIGINAL FUNCTIONN;>; THE TRANSFER WAS STOPPED DUE TO A DATA LATE ERROR CONDITION.>; WE WILL NOW BACKUP THE WORD COUNT, BUS ADDRESS AND CYLINDER/?; TRACK/SECTOR ADDRESS BY ONE BLOCK AND RETRY THE TRANSFER FROMN>; THIS POINT. THIS IS DONE TO PREVENT THE DATA LATE CONDITION(; FROM RECURRING DUE TO A LONG TRANSFER.;I0110$: DECB RTTBL(R3) ;RETRY DATA LATE CONDITION? BLE 60$ ;IF LE NON4 MOV DLTWC(R3),R0 ;GET REAL NEGATIVE WORDS REMAINING# ASL R0 ;CONVERT TO NEGATIVE BYTESL6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED- BIC #777,R0 ;GET BLOCKS ACTUALLY TRANSFEREDO0 CALL DRCALC ;BACKUP TO START OF BLOCK IN ERROR3 TST U.CNT(R5) ;DLT ERROR ON LAST BLOCK TRANSFERED?  BNE 100$ ;IF NE NO, ADD R0,U.CNT(R5) ;YES, NORMALIZE BYTE COUNT BR 100$ ;RESTART THE TRANSFERR .DSABL LSBT;+@; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING REPEATEDC; UNLESS THE OPERATION WAS DIAGNOSTIC. TIMEOUTS ARE USUALLY CAUSEDRC; BY POWERFAILURE BUT MAY ALSO BE THE RESULT OF A HARDWARE FAILURE.L;- .ENABL LSBL7DROUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP?E BEQ 15$ ;;;IF EQ NOU/ BIT #S2.MAD,S.ST2(R4) ;;;MULTI-ACCESS DEVICE?  BEQ 10$ ;;;IF EQ NON. CMP S.KRB(R4),S.KTB(R4) ;;;IS THIS PORT 'A'?) BNE 5$ ;;;IF NE NO, IT MUST BE PORT 'B'S4 BITB #S3.SPA,S.ST3(R4) ;;;IS PORT 'A' SPINNING UP? BNE 10$ ;;;IF NE YES' BR 15$ ;;;TIMEOUT FOR NORMAL FUNCTIONO75$: BITB #S3.SPB,S.ST3(R4) ;;;IS PORT 'B' SPINNING UP? & BEQ 15$ ;;;IF EQ NO, NORMAL FUNCTION110$: DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET?U BEQ 15$ ;;;IF EQ YES MTPS #0 ;;;ALLOW INTERRUPTSB. MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS JMP DRRQC ;RETRY OPERATION,15$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY MTPS #0 ;;;ALLOW INTERRUPTSF3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER ) MOV S.KRB(R4),R2 ;GET CURRENT KRB ADDRSSI- MOVB K.CON(R2),R3 ;RETREIVE CONTROLLER INDEXO MOV (R2),R2 ;GET CSR ADDRESS: MOVB U.UNIT(R5),RMCS2(R2) ;SELECT UNIT FOR ERROR LOGGING! CALL $DVTMO ;LOG DEVICE TIMEOUTV;E>; NOTE: THE FOLLOWING SIX INSTRUCTIONS (AND THE SUBROUTINE) DO4; NOT CHANGE THE C-BIT SETTING RETURNED FROM $DVTMO.;E2 BITB #SEL,U.CW2+1(R5);WAITING FOR PORT TO SELECT?) BNE DRFIN1 ;IF NE YES, WE DIDN'T GET ITA0 BITB #S3.SIP,S.ST3(R4) ;TIMEOUT DURING A SEEK? BEQ 20$ ;IF EQ NO$ CALL DRPRM ;RESET RETRY PARAMETERS;20$: BICB #S3.SIP,S.ST3(R4) ;ASSUME DATA TRANSFER FUNCTION2- BCS DRDIAG ;IF CS TIMEOUT DURING DIAGNOSTICR4 BITB #US.SPU,U.STS(R5) ;WAS THE DRIVE SPINNING UP? BEQ DRRTRY ;IF EQ NO- MOV #IE.DNR&377,R0 ;YES, SET DRIVE NOT READYU BR DRFIN ;FINISH I/O0DRRTRY: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS< BICB #ERL,U.CW2+1(R5) ;CAN'T CLOSE ERRORS RETRIED FROM BEG' BIT #WCE,RMCS2(R2) ;WRITE CHECK ERROR?. BEQ 25$ ;IF EQ NOU/ MOV #IE.WCK&377,R0 ;YES, SET WRITE CHECK ERRORR+25$: BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?, BNE DRFIN ;IF NE YES DECB RTTBL(R3) ;RETRY FUNCTION? BGT 40$ ;IF GT YES BR DRFIN ;FINISH I/O;.!; TEST FOR WRITE CHECK OPERATION.?;BCDRWCHK: BITB #IO.WLC&377,I.FCN(R1) ;WRITE FOLLOWED BY WRITE CHECK? BNE 30$ ;IF NE YES5 BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED BY MCR?C BEQ DRFIN ;IF EQ NON330$: CMPB #171,U.BUF(R5) ;WAS LAST FUNCTION A READ?  BEQ DRFIN ;IF EQ YES0 CMPB #161,U.BUF(R5) ;WAS LAST FUNCTION A WRITE? BNE DRFIN ;IF NE NO:0 MOV #RETRY,RTTBL(R3) ;REINITIALIZE RET00~2xIwttt tfDATARY COUNT" MUL #5,R3 ;SET UP INDEX INTO ...' ADD #PRMSV,R3 ;... PARAMETER SAVE AREAR) MOV (R3)+,U.BUF(R5) ;RESTORE PARAMETERSK MOV (R3)+,U.BUF+2(R5) ;... MOV (R3)+,U.CNT(R5) ;... MOV (R3)+,I.PRM+10(R1) ;...B MOV (R3)+,I.PRM+12(R1) ;...C. MOVB #151,U.BUF(R5) ;SET WRITE CHECK FUNCTION&40$: CALL DRCLR ;CLEAR SELECTED DRIVE/ CALLR DRUBMP ;START THE WRITE CHECK OPERATION .DSABL LSB ;U; **-DRFIN-FINISH I/O OPERATIONT;B; THIS ROUTINE WILL SET THE ACTUAL BYTES TRANSFERED PARAMETER, THEA; ERROR LOGGING RETRY COUNTS AND CALL $IODON. THE SELECTED DRIVEE<; IS RELEASED, IF REQUESTED, AND THE CONTROLLER IS RELEASED.;( ; INPUTS:2;); R0=SUCCESS/ERROR CODER; R2=ADDRESS OF CONTROLER CSR1; R4=ADDRESS OF THE SCBM; R5=ADDRESS OF THE UCB1;B/DRFIN: MOV S.PKT(R4),R3 ;GET I/O PACKET ADDRESS;1 MOV RMWC(R2),R1 ;GET WORDS REMAINING TO TRANSFERT+ ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFERD8 ADD I.PRM+4(R3),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED*DRFIN1: CALL DRCLR1 ;CLEAR SELECTED DRIVE( MOV #TRE,(R2) ;NOW CLEAR THE CONTROLLER2 BICB #SEL,U.CW2+1(R5);CLEAR PORT SELECT WAIT FLAG* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS;2); CHECK FOR ATTENTIONS AND RELEASE DRIVE.S; +10$: TSTB RMAS(R2) ;ANY ATTENTIONS PENDING?5 BEQ 20$ ;IF EQ NO0 BISB #IE,(R2) ;RE-DISPATCH TO INTERRUPT HANDLER BR 10$ ;TRY AGAIN1:20$: BITB #S3.NRL,S.ST3(R4) ;SHOULD WE RELEASE THE DRIVE? BEQ 30$ ;IF EQ YES$ MOVB #IE,(R2) ;RE-ENABLE INTERRUPTS BR 40$ ;<30$: BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED7 MOVB #113,(R2) ;RE-ENABLE INTERRUPTS AND RELEASE DRIVEE140$: MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEXR/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTR4 BITB #XCT,U.CW2+1(R5);HAS A FUNCTION BEEN EXECUTED? BNE 50$ ;IF NE YES' MOV #RETRY,R2 ;SET MAXIMUM RETRY COUNTO350$: BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNTS5 BICB #S3.SIP,S.ST3(R4) ;RESET SEEK IN PROGRESS FLAG$'DRFIN2: CALL $RLCN ;RELEASE CONTROLLERN# CALL $IODON ;FINISH I/O OPERATIONR! JMP DRINI ;PROCESS NEXT REQUEST ;D!; **-DRECC-ATTEMPT ECC CORRECTIONU; D; THIS ROUTINE IS ENTERED IF A DATA ERROR IS DETECTED. IF THE ERRORG; IS CORRECTABLE, THE EXECUTIVE ECC ROUTINE IS CALLED AND THE OPERATION)E; IS RESTARTED FROM WHERE THE CONTROLLER STOPPED. IF OFFSET RECOVERYE; IS REQUIRED, WE WILL DO IT.S;E ; INPUTS: ;R; R1=CONTENTS OF RMER1; R2=ADDRESS OF CONTROLLER CSR; .DRECC: BIT #DCK!DTE!HCRC,R1;CORRECTABLE ERROR? BEQ DRRTRY ;IF EQ NO/ CMPB #171,U.BUF(R5) ;IS THIS A READ OPERATION?N BNE DRRTRY ;IF NE NO4 MOV SAVWC(R3),R0 ;GET NEGATIVE # OF WORDS REMAINING ASL R0 ;CONVERT TO BYTES6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED# BEQ DROFF ;IF EQ NONE, TRY OFFSETT( BIS RMER2(R2),R1 ;.OR. ERROR REGISTER 2% CMP #DCK,R1 ;ONLY DATA CHECK ERROR?S! BNE DROFF ;IF NE NO, TRY OFFSETN7 MOV SAVWC(R3),-(SP) ;PUT REMAINING WORD COUNT ON STACKO, MOV RMEC1(R2),R1 ;GET ECC POSITION REGISTER- MOV RMEC2(R2),R3 ;GET ECC CORRECTION PATTERN ' MOV (SP)+,R2 ;GET REMAINING WORD COUNTN CALL $ECCOR ;DO ECC CORRECTION) CALL DRCLR ;CLEAR SELECTED DRIVE ERRORSG/ CALL DRPRM0 ;RESET OFFSET RECOVERY PARAMETERSC( CALL DRCALC ;RE-CALCULATE DISK ADDRESS5 MOV #IS.SUC&377,R0 ;ASSUME NO MORE WORDS TO TRANSFER + TST U.CNT(R5) ;ANY MORE WORDS TO TRANSFER?E BEQ DRFIN ;IF EQ NO +DRREST: CALLR DRINIO ;RESTART THE TRANSFER;;A"; **-DROFF-ATTEMPT OFFSET RECOVERY;R=; THIS ROUTINE IS CALLED WHENEVER WE NEED TO OFFSET THE HEADSR@; SOME DISTANCE FROM TRACK CENTERLINE TO PROPERLY READ THE DATA.;C ; INPUTS: ;R6; R0=NUMBER OF BYTES ACTUALLY TRANSFERED TO THIS POINT;R5DROFF: BITB #OFA,U.CW2+1(R5) ;OFFSET ALREADY ACTIVE?R BNE 5$ ;IF NE YESE" DECB RTTBL(R3) ;ANY RETRIES LEFT? BGT 5$ ;IF GT YES , MOV #IE.VER&377,R0 ;SET UNRECOVERABLE ERROR JMP DRFIN ;FINISH I/O15$: MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESSA TST R0 ;ANYTHING TRANSFERRED?E BEQ 20$ ; NO0 BIT #ECH!DTE,RMER1(R2); HARD ECC OR DTE ERROR ? BEQ 15$ ; NO* DEC R0 ;BACK UP TO THE PREVIOUS BLOCK...00~:xwtcccc ; IF ON A BLOCK BOUNDARY) BIC #777,R0 ; FORCE TO A BLOCK BOUNDARY ! ; Z-BIT SET BY BIC IF R0 IS 0U BEQ 20$ ;IF EQ NOL;D@; THE TRANSFER ENDED IN AN ECC HARD ERROR BUT THERE WERE SECTORSE; TRANSFERED THAT CONTAINED GOOD DATA. SINCE THE ECC HARD ERROR COULDA; HAVE BEEN CAUSED BY A CYLINDER CROSSING, THE GOOD DATA IS SAVED 6; AND THE TRANSFER IS RETRIED FROM THE POINT OF ERROR.;O15$:/ CALL DRPRM0 ;RESET OFFSET RECOVERY PARAMETERSQ' CALL DRCALC ;CALCULATE NEW PARAMETERSI& TST U.CNT(R5) ;LAST BLOCK TRANSFERED? BNE 20$ ;IF NE NOO, ADD R0,U.CNT(R5) ;YES, NORMALIZE BYTE COUNT320$: BITB #OFA,U.CW2+1(R5) ;OFFSET ALREADY ACTIVE?F BNE 30$ ;IF NE YES0 CALL DRPRM10 ;RESET OFFSET RECOVERY PARAMETERS. BIS #OM,I.PRM+6(R1) ;SET OFFSET MODE INACTIVE& MOVB #117,(R2) ;RETURN TO CENTER LINE! BR DRREST ;RESTART THE TRANSFER ; A; NO GOOD DATA WAS TRANSFERED - CHECK IF OFFSET SHOULD BE CHANGEDR;0=30$: BIT #DTE!ECH,RMER1(R2) ;DRIVE TIMING OR HARD ECC ERROR?N BNE 40$ ;IF NE YES( CMP OFFAD(R3),#OFFTB;AT OFFSET ALREADY? BLO 40$ ;IF LO NO,5 BIS #HCI,I.PRM+6(R1);YES, SET HEADER COMPARE INHIBITC%40$: DECB RTTBL+1(R3) ;CHANGE OFFSET?E BGT DRREST ;IF GT NO- DECB RTTBL(R3) ;COUNT EACH OFFSET AS A RETRYS! BIT #40,RMDT(R5) ;IS IT AN RP07?N BNE DRREST ;IF NE YESR( ADD #2,OFFAD(R3) ;UPDATE OFFSET POINTER. CMP #OFFTB+4,OFFAD(R3) ;END OF OFFSET TABLE? BEQ DRREST ;IF EQ YESD3 MOV @OFFAD(R3),I.PRM+6(R1) ;GET NEXT OFFSET VALUE , MOVB #2,RTTBL+1(R3) ;SET OFFSET RETRY COUNT! BR DRREST ;RESTART THE TRANSFER ;D6; **-DRERL-FINISH ERROR LOGGING FOR MID-TRANSFER ERROR;A@; THIS ROUTINE IS CALLED TO FINISH OFF THE ERROR LOGGING PROCESS8; DURING MID-TRANSFER IF WE HAVE SUCCESSFULLY RECOVERED.;E ; INPUTS:#;R; R3=CONTROLLER INDEXN;B#DRERL: MOV R2,-(SP) ;SAVE REGISTERS3 MOV R1,-(SP) ;P/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTA/ BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT., MOV #IS.SUC&377,R0 ;RECOVERY WAS SUCCESSFUL+ CALL $FNERL ;FINISH ERROR LOGGING PROCESST MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R2 ;R( ;FALL THRU AND RESET RECOVERY PARMS.;R#; SET RECOVERY AND RETRY PARAMETERSR;L3DRPRM: MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNTS7DRPRM0: MOVB #16,RTTBL+1(R3) ;SET OFFSET RECOVERY COUNTE9DRPRM1: MOV #OFFTB-2,OFFAD(R3) ;SET OFFSET TABLE POINTERP1 BICB #OFA,U.CW2+1(R5) ;CLEAR OFFSET ACTIVE FLAGN RETURN ;R;.*; **-DRCALC-CALCULATE UPDATED DISK ADDRESS;3?; THIS ROUTINE WILL CALCULATE THE NEW DISK AND BUFFER ADDRESSESN3; BASED ON THE NUMBER OF BYTES ACTUALLY TRANSFERED.P;R ; INPUTS:F; ; R0=BLOCKS ACTUALLY TRANSFERED.; ; OUTPUTS:;A; R0=UNCHANGED IF U.CNT(R5)=0R#; I.PRM+10(R1)=NEW CYLINDER ADDRESSE'; I.PRM+12(R1)=NEW TRACK SECTOR ADDRESS;; <DRCALC: SUB R0,U.CNT(R5) ;REDUCE BYTES REMAINING TO TRANSFER BEQ 30$ ;IF EQ NONE LEFT3 ADD R0,U.BUF+2(R5) ;UPDATE STARTING BUFFER ADDRESS 0 ADCB U.BUF+1(R5) ;AND THE MEMORY EXTENSION BITS2 BIT #FE.EXT,$FMASK ;IS 22-BIT ADDRESSING ENABLED? BEQ 5$ ;IF EQ NO' MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESS 9 BIT #KS.MBC,K.STS(R1) ;IS THIS A 22-BIT MASSBUS DEVICE?S BNE 5$ ;IF NE YES:& ADD K.OFF(R1),R1 ;POINT TO UMR AREA+2) ADD R0,-(R1) ;CALCULATE NEW REAL ADDRESS+ ADCB -(R1) ;...C15$: MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESSE1 SWAB R0 ;CALCULATE NUMBER OF SECTORS TRANSFERED ASR R0 ;1 ADD I.PRM+12(R1),R0 ;UPDATE TRACK/SECTOR ADDRESSC# TST -(SP) ;GET A WORKING REGISTERO510$: CLR (SP) ;CLR THE WORKING REGISTER FOR THE LOOPE$ CMPB U.PRM(R5),R0 ;SECTOR OVERFLOW? BHI 20$ ;IF HI NOR( MOVB U.PRM(R5),(SP) ;COPY SECTORS/TRACK1 SUB (SP),R0 ;SUBTRACT A TRACKS WORTH OF SECTORSK ADD #1*256.,R0 ;ADD IN A TRACK+ MOV U.PRM(R5),(SP) ;GET TRACKS AND SECTORSA) CLRB (SP) ;ISOLATE ONLY TRACKS/CYLINDERR CMP (SP),R0 ;TRACK OVERFLOW? BHI 10$ ;IF HI NO & SUB (SP),R0 ;NORMALIZE TRACK ADDRESS* INC I.PRM+10(R1) ;UPDATE CYLINDER ADDRESS BR 10$ ;:20$: MOV R0,I.PRM+12(R1) ;SET UPDATED TRACK/SECTOR ADDRESS TST (SP)+ ;PRUNE STACK30$: RETURN ;0;T00~BxIwttt tfDATA(; **-DRVV-PROCESS VOLUME VALID FUNCTIONS;RB; HERE WE WILL PROCESS VOLUME VALID FUNCTIONS. IF THE FUNCTION ISD; SET VOLUME VALID WE WILL SET THE HARDWARE VOLUME "VV" BIT. IF THEC; FUNCTION IS CLEAR VOLUME VALID WE WILL DO NOTHING AS THE HARDWAREE; CANNOT SPIN THE DRIVE DOWN. IF THE FUNCTION IS A VOLUME VALID NOP,RC; WE WILL SIZE THE DISK BY PASSING THE CONTROLLER REGISTERS BACK TO ; THE CALLER.V;, ; INPUTS:);E; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCBS;K8DRVV: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER- MOV #IS.SUC&377,R0 ;SET SUCCESSFUL OPERATION ( MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS, MOVB U.UNIT(R5),RMCS2(R2) ;SELECT THE UNIT. MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS" CALL DRCLR ;CLEAR SELECTED DRIVE* BIT #NED,RMCS2(R2) ;DOES THE DRIVE EXIST? BEQ 5$ ;IF EQ YESN" TST I.PRM+2(R1) ; SIZE THE DISK ? BMI 4$ ; IF MINUS THEN YES CALL $DVERR ;LOG THE ERROR4$: ; REFFERENCE LABELS2 MOVB #TRE/256.,RMCS1+1(R2) ;CLEAR THE CONTROLLER( MOV #IE.SZE&377,R0 ;UNABLE TO SIZE UNIT) BICB #US.VV,U.STS(R5);RESET VOLUME VALIDU JMP DRFIN2 ;EXIT#5$: TST I.PRM+2(R1) ;SIZE THE DISK?M BPL 10$ ;IF PL NOR2 CALL $CRPAS ;PASS CONTROLLER REGISTERS TO CALLER BR 15$ ;010$: BIT #VV$SET,I.PRM+2(R1) ;SET VOLUME VALID? BEQ 15$ ;IF EQ NO + MOV RMDS(R2),R1 ;GET DRIVE STATUS REGISTERM COM R1 ;TOGGLE THE BITSB0 BIT #MOL!DRY,R1 ;IS THE DRIVE READY AND ONLINE? BNE 20$ ;IF NE NOE( MOVB #23,(R2) ;ISSUE PACK ACK TO SET VV15$: JMP DRFIN1 ;EXIT320$: MOV #IE.DNR&377,R0 ;DRIVE NOT READY ERROR CODEV) BICB #US.VV,U.STS(R5);RESET VOLUME VALID  BR 15$ ;EXIT;+$; **-DRCLR-CLEAR DRIVE OR SUB-SYSTEM?; **-DRCLR1-ALTERNATE ENTRY TO CLEAR DRIVE W/O INTERRUPT ENABLE5;;C; ISSUE A DRIVE CLEAR FUNCTION UNLESS THE SELECTED DRIVE/CONTROLLERN'; IS HUNG, THEN ISSUE SUB-SYSTEM CLEAR.G;E ; INPUTS: ;O; R2=CSR ADDRESS; R5=UCB ADDRESS;E ; OUTPUTS:;D; SELECTED DRIVE IS CLEAREDE;M .ENABL LSBS+DRCLR: TSTB (R2) ;IS THE CONTROLLER READY?T BPL 10$ ;IF PL NO7 BIT #1,(R2) ;IS GO BIT SET?V BNE 10$ ;IF NE YES& MOVB #111,(R2) ;NO, ISSUE DRIVE CLEAR RETURN ;AND EXITR,DRCLR1: TSTB (R2) ;IS THE CONTROLLER READY? BPL 10$ ;IF PL NOO BIT #1,(R2) ;IS GO BIT SET?  BNE 10$ ;IF NE YES% MOVB #11,(R2) ;NO, ISSUE DRIVE CLEAR RETURN ;AND EXIT ;Y; NOTE:R;@; THE FOLLOWING INSTRUCTION WILL CAUSE ALL I/O ON OTHER UNITS TOD; ABORT. THIS IS OK BECAUSE THE TIMEOUT FACILITY SHOULD CATCH THEM.;R.10$: BIS #40,RMCS2(R2) ;ISSUE SUB-SYSTEM CLEAR0 MOVB U.UNIT(R5),RMCS2(R2) ;RE-SELECT THE DRIVE RETURN ;AND EXIT2 .DSABL LSBD;C.; **-DRFUN-PROCESS DIAGNOSTIC FUNCTION TESTING;T=; DETERMINE IF THE SPECIFIED FUNCTION IS A DIAGNOSTIC OR NOT.O#; TWO EXCEPTIONS: IO.CER AND IO.CEWV;1 ; INPUTS: ; R1=ADDRESS OF I/O PACKET;A ; OUTPUTS:+; C/S=DIAGNOSTIC FUNCTION (EXCEPT AS NOTED) ; C/C=NORMAL FUNCTIONT; BDRFUN: CMPB #IO.CER!IQ.UMD&377,I.FCN(R1) ;IS IT READ CE CYLINDER? BEQ 10$ ;IF EQ YES= CMPB #IO.CEW!IQ.UMD&377,I.FCN(R1) ;IS IT WRITE CE CYLINDER?2 BEQ 10$ ;IF EQ YES5 BIT #IQ.UMD,I.FCN(R1) ;IS IT A DIAGNOSTIC FUNCTION?F BEQ 10$ ;IF EQ NO  SEC ;YES, SET CARRY RETURN ;EXITS10$: CLC ;NO, CLEAR CARRYS RETURN ;EXITW;+'; **-DRCHK-VALIDATE AND CONVERT THE LBN;19; THIS ROUTINE IS CALLED FROM $DRQRQ TO DO LBN PROCESSINGN9; FOR DEVICES WHICH SUPPORT QUEUE OPTIMIZATION. IF BLKC2U9; DETECTS AN ERROR IT WILL RETURN TO THE CORRECT PLACE INE; $DRQRQ AFTER CALLING $IOALT.;. ; INPUTS:3;I; R1=I/O PACKET ADDRESS ; R5=UCB ADDRESS; ; OUTPUTS:;T4; IF THE CHECKS SUCCEEDS, THEN THE LBN IN THE PACKET=; IS REPLACED BY THE CYLINDER/TRACK/SECTOR. R1 IS PRESERVED.0;C:; IF THE CHECKS FAILS, THEN $IOALT IS ENTERED WITH A FINAL8; STATUS OF IE.BLK AND A RETURN TO THE CORRECT PLACE IN ; $DRQRQ IS EXECUTED.N;O;S<; NOTE: ALL FUNCTIONS PUT INTO THE DRIVER QUEUE ARRIVE HERE.3; THESE INCLUDE IO.ATT, IO.DET, AND ACP FUNCTIONS.P;-;DRCHK: MOV I.FCN(R1),-(SP) ;PUT THE FUNCTION ONTO THE ST00~JxNxtccccACKI) BIC #7,(SP) ;CLEAR THE SUBFUNCTION BITS & CMPB #IO.ATT/256.,1(SP) ;IS IT ATTACH% BEQ 55$ ;IF EQ YES - LEAVE IT ALONEE' CMPB #IO.DET/256.,1(SP) ;IS IT DETACHE% BEQ 55$ ;IF EQ YES - LEAVE IT ALONEE- CMP #IO.STC,(SP) ;IS IT SET CHARACTERISTICS?E% BEQ 55$ ;IF EQ YES - LEAVE IT ALONEI TST (SP)+ ;CLEAN THE STACK5 BIT #IQ.UMD,I.FCN(R1) ;IS IT A DIAGNOSTIC FUNCTION?R BNE 30$ ;IF NE YES) CALL $BLKC2 ;CHECK LOGICAL BLOCK NUMBER-0 CMPB #IO.WLB/256.,I.FCN+1(R3) ;WRITE FUNCTION? BNE 40$ ;IF NE NO#8 BITB #IO.WLT&377,I.FCN(R3) ;WRITE LAST TRACK FUNCTION? BNE 40$ ;IF NE YES CLR R0 ;GET READY FOR THE BISB% BISB U.PRM(R5),R0 ;GET SECTORS/TRACKT4 ADD R0,I.PRM+12(R3) ;INCREMENT BLOCK # BY ONE TRACK! ADCB I.PRM+10(R3) ;AND THE CARRYS. MOV R3,R1 ;RESTORE PACKET ADDRESS FOR $BLKC21 CALL $BLKC2 ;SEE IF WRITE IS TO BAD SECTOR FILEI CLR R1 ;GET READY FOR THE BISB% BISB U.PRM(R5),R1 ;GET SECTORS/TRACKK% SUB R1,R0 ;CORRECT THE BLOCK NUMBER5$ SBCB R2 ;AND THE HIGH BLOCK NUMBER BR 40$ ;CONTINUE+30$: MOV R1,R3 ;COPY POINTER TO I/O PACKETN. ADD #I.PRM+11,R1 ;POINT PAST HIGH PART OF LBN CLRB (R1)+ ;CLEAR EXCESS BYTE0" MOV (R1),R0 ;GET LOW PART OF LBN# MOV -(R1),R2 ;GET HIGH PART OF LBNK+ MOV R3,R1 ;RESTORE THE I/O PACKET POINTER,* CALL DRFUN ;TEST FOR DIAGNOSTIC FUNCTION BCC 40$ ;IF CC NOT' CMPB #14.,U.PRM+1(R5) ;IS IT AN RM80?E BNE 40$ ;IF NE NOS" INCB U.PRM(R5) ;INC SECTORS/TRACK/40$: CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBER 3 MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESS:" SWAB R1 ;SWAP TRACK TO HIGH BYTE$ BIS R1,R0 ;MERGE TRACK WITH SECTOR; MOV R0,I.PRM+12(R3) ;SAVE DESIRED TRACK AND SECTOR ADDRESS0( MOV R3,R1 ;RETRIEVE I/O PACKET ADDRESS* CALL DRFUN ;TEST FOR DIAGNOSTIC FUNCTION BCC 50$ ;IF CC NO' CMPB #14.,U.PRM+1(R5) ;IS IT AN RM80?N BNE 50$ ;IF NE NOT" DECB U.PRM(R5) ;DEC SECTORS/TRACK50$: RETURN ;EXIT 55$: TST (SP)+ ;CLEAN THE STACK BR 50$ ;AND EXIT .ENDCONVERT LOGICAL BLOCK NUMBER 3 MOV R2,I.PRM+10(R3) ;SAVE D .TITLE DMDRV  .IDENT /14.03/; P; COPYRIGHT (C) 1982, 1983, 1984, 1985, 1986 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;. ; P. J. BEZEREDI ; B. S. MCCARTHY ;K ;  ; MODIFIED BY:( ; G. MARIGOWDA 20-FEB-87 14.03: ; GM107 RESTORE I/O PKT ADDRESS BEFORE CALLING DMDINT  ;  ;  ;0;/; RK611-RK06/RK07 OVERLAPPED SEEK DISK DRIVER; .MCALL HWDDF$,PKTDF$ &! HWDDF$ ;DEFINE HARDWARE REGISTERS&" PKTDF$ ;DEFINE I/O PACKET OFFSETS#$;H%; EQUATED SYMBOLSH&;D'+(RETRY= 8. ;CONTROLLER ERROR RETRY COUNTI*)OFFTRY= 2 ;OFFSET POSITION RETRY COUNT3*RMCNT= 22. ;NUMBER OF REGISTERS TO LOG ON ERROR++RCL= 1 ;RECALIBRATE IN PROGRESS (1=YES)R&,OFS= 2 ;OFFSET IN PROGRESS (1=YES)2-XCT= 4 ;FUNCTION EXECUTION IN PROGRESS (1=YES)#.OFM= 10 ;IN OFFSET MODE (1=YES)6'/ADR= 40 ;ADDRESS BITS SETUP (1=YES)01;C!2; RK611 DEVICE REGISTER OFFSETSF3;A4'5RKCS1= 0 ;CONTROL STATUS REGISTER 1K6RKWC= 2 ;WORD COUNT 7RKBA= 4 ;BUS ADDRESS8RKDA= 6 ;DISK ADDRESS (9RKCS2= 10 ;CONTROL STATUS REGISTER 2:RKDS= 12 ;DRIVE STATUS;RKER= 14 ;ERROR REGISTER'<RKOF= 16 ;OFFSET/ATTENTION REGISTER =RKDC= 20 ;DESIRED CYLINDER>RKDB= 24 ;DATA BUFFER)%?RKMR1= 26 ;MAINTENANCE REGISTER 1G@RKECPS= 30 ;ECC POSITIONARKECPT= 32 ;ECC PATTERN4%BRKMR2= 34 ;MAINTENANCE REGISTER 2%CRKMR3= 36 ;MAINTENANCE REGISTER 3DE;F; RKCS1 BIT ASSIGNMENTSSG;SH$ISD= 1 ;SELECT DRIVE & GET STATUSJWRT= 2 ;WRITE OFFSETKACK= 3 ;PACK ACKNOWLEDGELDC= 5 ;DRIVE CLEARMUNL= 7 ;UNLOAD HEADSNIE= 100 ;INTERRUPT ENABLEEORDY= 200 ;CONTROLLER READY#PHMS= 113 ;IE + RECALIBRATE + GOEQOFF= 115 ;IE + OFFSET + GORBLS= 117 ;IE + SEEK + GOSREAD= 121 ;IE + READ + GO #TRDH= 125 ;IE + REA00RxIwttt tfDATAD HEADER + GOA$UWDH= 127 ;IE + WRITE HEADER + GO#VWCK= 131 ;IE + WRITE CHECK + GOR3WCERR= 100000 ;CONTROLLER ERROR/CONTROLLER CLEARSXDI= 040000 ;DRIVE INTERRUPTE3YDCPAR= 020000 ;DRIVE TO CONTROLLER PARITY ERRORA#ZCTO= 004000 ;CONTROLLER TIMEOUT&[CDT= 002000 ;CONTROLLER DRIVE TYPE\];A^; RKCS2 BIT ASSIGNMENTSL_;A`aDLT= 100000 ;DATA LATE"bWCE= 040000 ;WRITE CHECK ERRORcUPE= 020000 ;UNIBUS PARITY"dNED= 010000 ;NON EXISTANT DISK$eNEM= 004000 ;NON EXISTANT MEMORY"fPGE= 002000 ;PROGRAMMING ERROR&gMDS= 001000 ;MULTIPLE DRIVE SELECT!hUFE= 000400 ;UNIT FIELD ERRORC1iSCLR= 000040 ;RESET CONTROLLER AND ALL DRIVESjRLS= 000010 ;RELEASE PORTTkl;Rm; RKDS BIT ASSIGNMENTSn;NopSVAL= 100000 ;STATUS VALID(qPIP= 020000 ;POSITIONING IN PROGRESS rDDT= 000400 ;DISK DRIVE TYPEsDRDY= 000200 ;DRIVE READY0tVV= 000100 ;VOLUME VALID uDRA= 000001 ;DRIVE AVAILABLEvw; x; RKER BIT ASSIGNMENTSy;0z!{DCK= 100000 ;DATA CHECK ERROR |UNS= 040000 ;DRIVE UNSAFE1%}OPI= 020000 ;OPERATION INCOMPLETE0#~DTE= 010000 ;DRIVE TIMING ERROR0!WLE= 004000 ;WRITE LOCK ERRORE&IDAE= 002000 ;INVALID DISK ADDRESS"COE= 001000 ;CYLINDER OVERFLOW"HVRC= 000400 ;HEADER VRC ERROR!BSE= 000200 ;BAD SECTOR ERRORR&ECH= 000100 ;ERROR CORRECTION HARD!DTYE= 000040 ;DISK TYPE ERRORFMTE= 000020 ;FORMAT ERROR3CDPAR= 000010 ;CONTROLLER TO DRIVE PARITY ERRORA(NXF= 000004 ;NON-EXECUTABLE FUNCTION SKI= 000002 ;SEEK INCOMPLETE!ILF= 000001 ;ILLEGAL FUNCTIONA;M; LOCAL DATA; !; CONTROLLER IMPURE DATA TABLES0.; THESE ARE INDEXED BY THE CONTROLLER NUMBER;K9RTTBL: .BLKW R$$611 ;RETRY COUNT FOR CURRENT OPERATION;5OFFRTY: .BLKW R$$611 ;OFFSET RECOVERY RETRY COUNTS=RGBLK: .BLKW R$$611*RMCNT ;CONTROLLER REGISTER STORAGE AREAP7OFFAD: .BLKW R$$611 ;ADDRESS OF CURRENT OFFSET VALUE >PRMSV: .BLKW R$$611*5 ;PARAMETER SAVE ARE FOR ERROR RECOVERY ;AND WRITE CHECK FUNCTIONS0$DMOPT::.REPT R$$611 ;SEEK OPTIMIZATION TABLE1 .WORD 1 ;0=IMPLIED SEEK; 1=ALWAYS SEEK FIRSTP .ENDR;; DIAGNOSTIC FUNCTION TABLER; &FUNTBL: .BYTE HMS, IO.HMS!IQ.UMD&377 .BYTE BLS, IO.BLS!IQ.UMD&377 .BYTE OFF, IO.OFF!IQ.UMD&377E .BYTE RDH, IO.RDH!IQ.UMD&377L .BYTE WDH, IO.WDH!IQ.UMD&377T .BYTE WCK, IO.WCK!IQ.UMD&377R FUNTBE:R;R; OFFSET POSITIONING DATA.;R$OFFTB: ;POSITIONING VALUE TABLE# .BYTE 000 ;RETURN TO CENTERLINES .BYTE 020 ; +400 .BYTE 220 ; -400 .BYTE 040 ; +800 .BYTE 240 ; -800 .BYTE 060 ; +1200R .BYTE 260 ; -1200T*OFFTBE: .BYTE 000 ;RETURN TO CENTERLINE;.;DRIVER DISPATCH TABLE;O4 DDT$ DM,R$$611,,,,,,OPT ;GENERATE DISPATCH TABLE;+@; **-DMINI-RK611-RK06/RK07 DISK CARTRIDGE CONTROLLER INITIATOR;KG; THIS IS THE DRIVER ENTRY POINT FROM THE QUEUE I/O DIRECTIVE WHEN ANG; I/O REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TONH; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED UNIT IS NOTH; BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSEI; A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT SUCCEEDS,OG; THEN THE NEXT I/O OPERATION IS INITIATED AND A RETURN TO THE CALLER ; IS EXECUTED.;7 ; INPUTS:G;T8; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIALIZED.; ; OUTPUTS:;TC; IF THE SPECIFIED UNIT IS NOT BUSY AND AN I/O REQUEST IS WAITINGIC; TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-S; ATION IS INITIATED. ;-9DMINI: GTPKT$ DM,R$$611 ;GET NEXT I/O PACKET TO PROCESS; 3; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:E;U); R1=ADDRESS OF THE I/O REQUEST PACKET.S/; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.E; R3=CONTROLLER INDEX.+; R4=ADDRESS OF THE STATUS CONTROL BLOCK. 8; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIALIZED.;I=; RK611-RK06/RK07 DISK CAR00ZxNxtccccTRIDGE I/O REQUEST PACKET FORMAT:R;E#; WD. 00 -- I/O QUEUE THREAD WORDH1; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER6; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK>; WD. 03 -- POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER6; WD. 04 -- CONTENTS OF FIRST LUN WORD (UCB ADDRESS); WD. 05 -- I/O FUNCTION CODET1; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK 1; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCKC>; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000)4; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE3; WD. 12 -- MEMORY EXTENSION BITS OF I/O TRANSFERR,; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED=; WD. 15 -- DIAGNOSTIC SUPPLIMENTAL PARAMETER ELSE NOT USED49; WD. 16 -- BITS <0:7> = HIGH LBN, BITS <8:15> NOT USED $; WD. 17 -- LOW LBN OF I/O REQUEST:; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REGISTER BLOCK<; WD. 21 -- DIAGNOSTIC REGISTER BLOCK ADDRESS DISPLACEMENT;I% CLRB U.CW2+1(R5) ;RESET UNIT FLAGS & CALL $VOLVD ;VALIDATE VOLUME VALID BCS 10$ ;IF CS WE FAILED TST R0 ;TRANSFER FUNCTION? BMI DMRQC ;IF MI YES+ JMP DMVV ;PROCESS VOLUME VALID FUNCTIONF10$: JMP DMDONE ;EXIT;S+; REQUEST CONTROLLER FOR PROPER OPERATION ; 2DMRQC: MOV S.KRB(R4),R1 ;GET CURRENT KRB ADDRESS7 BIT #KS.POE,K.STS(R1) ;PARALLEL OPERATIONS ENABLED?B BEQ DMRQC1 ;IF EQ NO0 MOV S.PKT(R4),R3 ;RETRIEVE I/O PACKET ADDRESS? BITB #IQ.UMD!IQ.Q,I.FCN(R3) ;DIAGNOSTIC OR EXPRESS REQUEST?G BNE DMRQC1 ;IF NE YEST/ MOVB K.CON(R1),R3 ;RETREIVE CONTROLLER INDEXT% TST $DMOPT(R3) ;WHICH SEEK METHOD?C$ BNE 10$ ;IF NE ALWAYS SEEK FIRST5 BIT #KS.DIP,K.STS(R1) ;DATA TRANSFER IN PROGRESS?- BEQ DMRQC1 ;IF EQ NO, START DATA TRANSFER 410$: BISB #S3.SIP,S.ST3(R4) ;SET SEEK IN PROGRESS8  CALL $RQCNC ;REQUEST CONTROLLER FOR CONTROL FUNCTION  BR DMINIO ;INITIATE THE SEEK= DMRQC1: BICB #S3.SIP,S.ST3(R4) ;SET SEEK ALREADY COMPLETEDI5  CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERC ; "; **-DMUBMP-SETUP UNIBUS ADDRESS;R@; THIS SECTION OF CODE WILL DETERMINE IF THE UNIBUS ADDRESS ISB; ALREADY IN THE FORMAT FOR THE UNIBUS MAP ON 22-BIT PROCESSORS.?; IT WILL ALSO CONVERT THE I/O FUNCTION CODE TO IT'S HARDWARE0; EQUIVALENT..;4@; NOTE: AT THIS POINT THE REQUESTING UNIT MUST BE THE OWNER OF'; THE CONTROLLER FOR A DATA TRANSFER. ;E;DMUBMP: BITB #ADR,U.CW2+1(R5);ADDRESS BITS ALREADY SETUP?I BNE DMINIO ;IF NE YESC0 MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS7 CMP #IO.RDH!IQ.UMD,I.FCN(R1) ;READ HEADER FUNCTION?W) BEQ 10$ ;IF EQ YES, NO NEED FOR UMR'S ) CALL $STMAP ;SETUP UNIBUS MAP ADDRESS 4 10$: ASL U.BUF(R5) ;POSITION MEMORY EXTENSION BITS! ASL U.BUF(R5) ;...R" ASL U.BUF(R5) ;....# ASL U.BUF(R5) ;...I7$ CMP #IO.RDH!IQ.UMD,I.FCN(R1) ;READ HEADER FUNCTION? )% BEQ 20$ ;IF EQ YES, NO NEED FOR UMR'S'& CALL $MPUBM ;MAP UNIBUS TO TRANSFERI<'20$: BISB #ADR,U.CW2+1(R5);INDICATE ADDRESS SETUP COMPLETE(; 5); CONVERT I/O FUNCTION CODE TO HARDWARE EQUIVALENT.C*; 0+ MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS7, CMPB #IO.HMS/256.,I.FCN+1(R1) ;DIAGNOSTIC FUNCTION?R- BNE 40$ ;IF NE NOR0. MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE:/30$: MOVB (R0)+,U.BUF(R5) ;LOAD CONTROLLER FUNCTION CODE00 CMPB (R0)+,I.FCN(R1) ;IS IT THE CORRECT CODE?1 BEQ 60$ ;IF EQ YES)2 CMP #FUNTBE,R0 ;END OF FUNCTION TABLE?M3 BNE 30$ ;IF NE NO2440$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION-5 MOVB #READ,U.BUF(R5) ;ASSUME READ FUNCTIONO96 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION? (7 BHIS 50$ ;IF HIS FUNCTION IS ILLEGAL*8 MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS 9 CALL DMSDC ;SELECT THE DRIVE: JMP DMFIN1 ;FINISH I/O;50$: BEQ 60$ ;IF EQ YES0< ADD #WRT,U.BUF(R5) ;CONVERT TO WRITE FUNCTION-=60$: MOV S.KRB(R4),R3 ;RETRIEVE KRB ADDRESS /> MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXB&? MUL #5,R3 ;SETUP AN INDEX INTO ...)@ ADD #PRMSV,R3 ;... PARA00bxIwttt tfDATAMETER SAVE AREA(A MOV U.BUF(R5),(R3)+ ;SAVE PARAMETERSB MOV U.BUF+2(R5),(R3)+ ;...C MOV U.CNT(R5),(R3)+ ;...D MOV I.PRM+10(R1),(R3)+ ;...SE MOV I.PRM+12(R1),(R3)+ ;...EFG;R'H; **-DMINIO-INITIATE AN I/O OPERATIONEI;JAJ; THIS ROUTINE WILL INITIATE EITHER A SEEK OR THE DATA TRANSFERU<K; OPERATION DEPENDING ON HOW THE CONTROLLER WAS REQUESTED.L; M; INPUTS:N;VO; R4=ADDRESS OF THE SCB.P; R5=ADDRESS OF THE UCB.Q;TR=SDMINIO: BICB #RCL!OFS,U.CW2+1(R5) ;RESET POSITIONING FLAGS%T MOV @S.KRB(R4),R2 ;GET CSR ADDRESS0U MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS'V MOV #CERR,(R2) ;CLEAR THE CONTROLLER.(W MOVB U.UNIT(R5),R0 ;FETCH UNIT NUMBER%X MOV R0,RKCS2(R2) ;SELECT THE DRIVERY;E;Z; DETERMINE IF DRIVE'S PORT IS SEIZED BY THIS CONTROLLER.A[;A)\ CALL DMSD ;ATTEMPT TO SEIZE THE DRIVEC-] BIT #DRA,RKDS(R2) ;DID WE SEIZE THE DRIVE?^ BNE 10$ ;IF NE YES*_ CALL DMCLR ;CLEAR THE CONTROLLER ERROR5` MOV #IE.DNR&377,R0 ;SET DRIVE NOT READY ERROR CODENa BR 40$ ;AND GO AWAY4b;;3c; CHECK IF THE HEADS ARE ON THE CORRECT CYLINDER.Ad;A/e10$: CALL DMCLER ;CLEAR CONTROLLER AND DRIVE0f BITB #S3.SIP,S.ST3(R4) ;ARE WE DOING A SEEK?g BEQ 20$ ;IF EQ NO ,h CALL DMCYL ;GET CURRENT CYLINDER ADDRESS+i CMP I.PRM+10(R3),R0 ;DO WE NEED TO SEEK?M/j BNE 30$ ;IF NE YES, BYPASS CONTROLLER SETUPS%k MOV #IE,(R2) ;RE-ENABLE INTERRUPTS1%l JMP DMRQC1 ;GO REQUEST CONTROLLERHm;T0n; LOAD CONTROLLER REGISTERS FOR DATA TRANSFER.o;Y$p20$: ADD #RKCS2,R2 ;POINT TO RKCS28q MOV I.PRM+12(R3),-(R2) ;SET TRACK AND SECTOR ADDRESS3r MOV U.BUF+2(R5),-(R2) ;SET USER BUFFER ADDRESSR-s MOV U.CNT(R5),-(R2) ;SET BYTES TO TRANSFERA)t ROR (R2) ;MAKE THAT WORDS TO TRANSFERY+u NEG (R2) ;MAKE IT A NEGATIVE WORD COUNTMv TST -(R2) ;POINT TO CSRKw;)x; CHECK FOR DRIVE NOT READY CONDITIONS.Uy;z30$: CALL DMDC ;CLEAR DRIVE5{ MOV #IE.DNR&377,R0 ;ASSUME SELECTED UNIT NOT READY 3| MOV I.PRM+10(R3),RKDC(R2) ;SET CYLINDER ADDRESS,} MOV RKDS(R2),R1 ;GET CURRENT DRIVE STATUS~ COM R1 ;COMPLEMENT STATUS ' BIT #SVAL!DRDY!DRA,R1 ;DRIVE READY?  BNE 40$ ;IF NE NOS# BIT #UNS,RKER(R2) ;DRIVE UNSAFE?  BEQ 60$ ;IF EQ NO2540$: BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP?  BEQ 45$ ;IF EQ NO; BITB #US.VV,U.STS(R5);WAS THE VOLUME PREVIOUSLY MOUNTED?E BEQ DMPWF1 ;IF EQ NO* BR DMPWF0 ;YES, WAIT FOR IT TO SPIN UP*45$: MOV R3,R1 ;COPY I/O PACKET ADDRESS3 CALL DMDINT ;TRY FOR DIAGNOSTIC DRIVE NOT READY BCS 50$ ;IF CS IT WASN .IF DF S2.NRD8 BIT #S2.NRD,S.ST2(R4) ;IS THIS FIRST DRIVE NOT READY?# BNE 47$ ;IF NE NO, GO LOG ERROR#8 BIS #S2.NRD,S.ST2(R4) ;INDICATE FIRST DRIVE NOT READY JMP DMPWF1 ;GO DO A RETRYD947$: BIC #S2.NRD,S.ST2(R4) ;CLEAR FIRST DRIVE NOT READYU .ENDC ; DF S2.NRD* CALL DMLERR ;LOG DRIVE NOT READY ERROR50$: JMP DMFIN ;FINISH I/OO,60$: BIT #VV,R1 ;DID VOLUME VALID CHANGE?1 BEQ 65$ ;IF EQ NO (NOTE REVERSE STATUS OF VV)O0 BITB #US.SPU,U.STS(R5) ;DID WE JUST SPIN UP? BEQ 40$ ;IF EQ NO2. MOV #ACK,R0 ;GET PACK ACKNOWLEDGE FUNCTION CALL DMGO ;SET VVG2 BISB #US.VV,U.STS(R5);SET SOFTWARE VOLUME VALID365$: BIT #S2.MAD,S.ST2(R4) ;MULTI ACCESS DEVICE? BEQ 80$ ;IF EQ NOR. CMP S.KRB(R4),S.KTB(R4) ;IS THIS PORT 'A'? BNE 70$ ;IF NE NO 0 BICB #S3.SPA,S.ST3(R4) ;YES, SHOW IT SPUN UP  BR 75$ ;370$: BICB #S3.SPB,S.ST3(R4) ;IT MUST BE PORT 'B'B375$: BITB #S3.SPU,S.ST3(R4) ;BOTH PORTS SPUN UP?T BNE 85$ ;IF NE NOI780$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UP0485$: BITB #S3.SIP,S.ST3(R4) ;SHOULD WE DO A SEEK? BEQ 90$ ;IF EQ NOS;S; START EXPLICIT SEEK.;:' MOV #BLS,R0 ;GET SEEK FUNCTION CODEI CALL DMXFR ;START THE SEEK* BR DMPWF3 ;RELEASE CONTROLLER AND EXIT;B; START DATA TRANSFER.;.;90$: CMPB U.BUF(R5),#BLS ;IS THIS A POSITIONING FUNCTION?C BHI DMDIP ;IF HI NOM4 BISB #RCL!OFS,U.CW2+1(R5) ;SET POSITIONING FLAGS2 CMP00jxNxtcccc #IO.OFF!IQ.UMD,I.FCN(R3) ;OFFSET FUNCTION? BNE DMDIP ;IF NE NOE3 MOV I.PRM+6(R3),RKOF(R2) ;YES, SET OFFSET VALUE;<DMDIP: MOV U.BUF(R5),R0 ;GET FUNCTION CODE AND MEMORY BITS2DMDIP1: MTPS #PR5 ;;;EXECUTE AT DEVICE PRIORITY& MOV S.KRB(R4),R3 ;;;GET KRB ADDRESS9 BIT #IQ.UMD,I.FCN(R1) ;;;IS IT A DIAGNOSTIC FUNCTION?T BEQ DMDIP2 ;;;IF EQ NO4 CMPB U.BUF(R5),#BLS ;;;IS IT A UMD SEEK FUNCTION? BLOS DMXFR ;;;IF LOS YESADMDIP2: BIS #KS.DIP,K.STS(R3) ;;;SET DATA TRANSFER IN PROGRESSO)DMXFR: MTPS #PR5 ;;;DISABLE INTERRUPTSB) CLR S.FRK+2(R4) ;;;INIT FORK INTERLOCKO/ BIS #S2.ACT,S.ST2(R4) ;;;SHOW I/O IS ACTIVEF7 BISB #XCT,U.CW2+1(R5) ;;;SHOW FUNCTION HAS EXECUTEDS1 MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNTR. CALL DMXCT ;;;SET CDT,LOAD FUNCTION AND GO MTPS #0 ;ALLOW INTERRUPTSI;+>; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;-&DMCAN: RETURN ;;;NOP FOR THE RK611;+<; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND@; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT?; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVEBA; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANY(C; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESSF; THE UNIT IS ALREADY READY.;-+DMPWF: MOV @S.KRB(R4),R2 ;GET CSR ADDRESS $ CALL DMCLR ;CLEAR THE CONTROLLER+ TSTB S.STS(R4) ;IS DRIVE CURRENTLY BUSY? BEQ DMPWF2 ;IF EQ NO;DMPWF0: MOVB #15.,S.STS(R4) ;WAIT A MAXIMUM OF ONE MINUTEM8DMPWF1: MOVB S.ITM(R4),S.CTM(R4) ;4 SECONDS AT A TIME7DMPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UP7DMPWF3: CALLR $RLCN ;RELEASE CONTROLLER IF NECESSARYT;+7; **-$DMINT-RK611-RK06/RK07 DISK CARTRIDGE CONTROLLERU(; INTERRUPT AND ERROR SERVICE ROUTINES;; HARD ERRORS ---> $IODON;(; SOFT ERRORS ---> RETRY LAST FUNCTION;; DATA ERRORS ---> RETRY FUNCTION AND CORRECT IF POSSIBLE;-  .ENABL LSB5$DMINT::BR DMFRK ;;;ENTRY POINT FOR DATA TRANSFERST, TST S.FRK+2(R4) ;;;UNSOLICITED INTERRUPT? BEQ 5$ ;;;IF EQ NO. MOV @S.KRB(R4),-(SP);;;RETREIVE CSR ADDRESS+ BIC #IE!CERR,(SP)+ ;;;DISABLE INTERRUPTSI RETURN ;;;,5$: CALL $FORK ;;;CREATE A SYSTEM PROCESS;DMFRK: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERS, MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS/ MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEX % MOV @S.KRB(R4),R2 ;GET CSR ADDRESSI) MOVB U.UNIT(R5),R0 ;GET UNIT TO SELECTR$ MOV R0,RKCS2(R2) ;SELECT THE UNIT% TSTB S.STS(R4) ;IS THIS UNIT BUSY?  BNE 10$ ;IF NE YES  CALL DMSDC ;SELECT THE DRIVE& CALL DMDC ;CLEAR DRIVE (DROPS ATA). BIS #RLS,RKCS2(R2) ;SET TO RELEASE THE PORT CALL DMSD ;RELEASE THE PORTY: BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED( CLR S.FRK+2(R4) ;RESET FORK INTERLOCK% MOV #IE,(R2) ;RE-ENABLE INTERRUPTS3* BR DMPWF3 ;RELEASE CONTROLLER AND EXIT;2B; INTERRUPT WAS FROM A BUSY UNIT. IF WE JUST DID A SEEK WE WILLC; GO AND START THE DATA TRANSFER OPERATION. IF THE DATA TRANSFERY@; TERMINATED, DETERMINE WHY. IF WE ARE SPINNING UP, RETRY THE; OPERATION. ;E3 10$: BITB #US.SPU,U.STS(R5) ;ARE WE SPINNING UP?H  BEQ 15$ ;IF EQ NOR/  BIT #S2.MAD,S.ST2(R4) ;MULTI-ACCESS DEVICE?W  BEQ DMREST ;IF EQ NO. CMP S.KRB(R4),S.KTB(R4) ;IS THIS PORT 'A'? BNE 14$ ;IF NE NOI4 BITB #S3.SPA,S.ST3(R4) ;IS PORT 'A' SPINNING UP? BNE DMREST ;IF NE YESR  BR 15$ ;814$: BITB #S3.SPB,S.ST3(R4) ;IS PORT 'B' SPINNING UP? BNE DMREST ;IF NE YESH415$: MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS5 BIT #S2.EIP,S.ST2(R4) ;ERROR ALREADY IN PROGRESS?0 BNE 20$ ;IF NE YES6 CALL DMPRM ;RESET RETRY AND OFFSET RECOVERY VALUES620$: BITB #S3.SIP,S.ST3(R4) ;DID WE JUST DO A SEEK? BEQ 30$ ;IF EQ NOK2 BICB #S3.SIP,S.ST3(R4) ;CLEAR SEEK IN PROGRESS) TST (R2) ;ANY ERRORS DURING THE SEEK?R BPL 70$ ;IF PL NOB+ CALL DMSDC ;ISSUE SELECT DRIVE FUNCTIONB# CALL DMLERR ;LOG T00rxIwttt tfDATAHE SEEK ERRORP*  MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS#! DECB RTTBL(R3) ;COUNT THIS RETRYK$" CALL DMERL ;FINISH ERROR LOGGING,# CALLR DMRCAL ;ISSUE RECALIBRATE FUNCTION$;S%; VALID INTERRUPT.&;R5'30$: MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFER(-( CALL DMDINT ;PROCESS DIAGNOSTIC INTERRUPTQ1) BCS 100$ ;IF CS INTERRUPT PROCESSING COMPLETEG4* BITB #RCL!OFS,U.CW2+1(R5) ;POSITIONING FUNCTION?+ BNE 40$ ;IF NE YES,;M3-; INTERRUPT WAS DUE TO A DATA TRANSFER OPERATION.L.;E/ TST (R2) ;ANY ERRORS?(,0 BMI 35$ ;IF MI YES, FORGET STATUS UPDATE-1 TST RKDS(R2) ;IS THE CURRENT STATUS VALID?R2 BMI 35$ ;IF MI YES+3 CALL DMSDC ;ISSUE SELECT DRIVE FUNCTIONA435$: TST (R2) ;ANY ERRORS?V5 BPL DMWCHK ;IF PL NO*6 CALL DMLERR ;YES, LOG THE DEVICE ERROR37 MOV RKER(R2),R1 ;COPY CONTENTS OF ERROR REGISTER .8 MOV #IE.WLK&377,R0 ;ASSUME WRITE LOCK ERROR"9 BIT #WLE,R1 ;WRITE LOCK ERROR?: BNE 50$ ;IF NE YES-; MOV #IE.BBE&377,R0 ;ASSUME BAD BLOCK ERRORN!< BIT #BSE,R1 ;BAD BLOCK ERROR?(= BNE 50$ ;IF NE YES1> MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORR;? BIT #UNS!DTE!IDAE!COE!DTYE!FMTE!NXF!ILF,R1 ;HARD ERROR?S@ BNE 50$ ;IF NE YES7A BIT #UPE!NED!NEM!PGE!MDS!UFE,RKCS2(R2) ;HARD ERROR? !B BNE 50$ ;IF NE YES, FINISH UPE(C JMP DMSOFT ;TRY FOR SOFT/DATA ERRORSD;FE;R!F; PROCESS POSITIONING OPERATIONAG; *H40$: MOVB U.CW2+1(R5),R0 ;GET UNIT FLAGSI COM R0 ;TOGGLE THEM 5J BIT #OFM!RCL,R0 ;IN OFFSET MODE AND DOING A RECAL?K BNE 45$ ;IF NE NOO"L CLR R0 ;GET READY FOR THE BISB3M BISB RTTBL+1(R3),R0 ;RETREIVE ERROR/SUCCESS CODE*N BICB #OFM!RCL,U.CW2+1(R5) ;CLEAR FLAGS"O CALLR DMFIN1 ;NOW SAY GOOD-BYE5P45$: MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORR(Q TST (R2) ;ERRORS DURING POSITIONING?R BPL 60$ ;IF PL NO *S CLR RKWC(R2) ;SHOW ALL BYTES TRANSFEREDT50$: JMP DMFIN ;FINISH I/O02U60$: BITB #RCL,U.CW2+1(R5);RECALIBRATE FUNCTION?V BEQ 65$ ;IF EQ NOF,W JMP DMRTRY ;YES, RETRY PREVIOUS FUNCTION0X65$: BICB #OFS,U.CW2+1(R5) ;RESET OFFSET FLAG.Y CMP #OFFTBE,OFFAD(R3) ;FINAL OFFSET TRIED?Z BEQ 50$ ;IF EQ YES[;R\; RESTART THE I/O OPERATION];R1^DMREST: MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESSR7_70$: JMP DMUBMP ;SETUP UNIBUS MAP AND RETRY FUNCTIONN`;I"a; TEST FOR WRITE CHECK OPERATIONb;R2cDMWCHK: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS=d BITB #IO.WLC&377,I.FCN(R1) ;WRITE FOLLOWED BY WRITE CHECK?Oe BNE 80$ ;IF NE YES7f BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED BY MCR?Bg BEQ 100$ ;IF EQ NO6h80$: CMPB #READ,U.BUF(R5) ;WAS LAST FUNCTION A READ?i BEQ 100$ ;IF EQ YES 8j CMPB #READ+WRT,U.BUF(R5) ;WAS LAST FUNCTION A WRITE?k BNE 100$ ;IF NE NO!l CALL DMPRM ;RESET RETRY COUNTU%m MUL #5,R3 ;FORM AN INDEX INTO ...O)n ADD #PRMSV,R3 ;... PARAMETER SAVE AREAN+o MOV (R3)+,U.BUF(R5) ;RESTORE PARAMETERSAp MOV (R3)+,U.BUF+2(R5) ;...q MOV (R3)+,U.CNT(R5) ;...r MOV (R3)+,I.PRM+10(R1) ;...Es MOV (R3)+,I.PRM+12(R1) ;...;0t MOVB #WCK,U.BUF(R5) ;SET WRITE CHECK FUNCTION*u BR DMREST ;START WRITE CHECK OPERATIONv:w100$: CLR U.CNT(R5) ;NO ERRORS, SET ALL BYTES TRANSFEREDx BR DMFIN1 ;FINISH I/O y .DSABL LSB1z{;+B|; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING REPEATEDE}; UNLESS THE OPERATION WAS DIAGNOSTIC. TIMEOUTS ARE USUALLY CAUSEDU>~; BY POWER FAILURE BUT MAY ALSO BE THE RESULT OF NO RESPONSE; FROM THE HARDWARE.;-9DMOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP?. BEQ 15$ ;;;IF EQ NO)1 BIT #S2.MAD,S.ST2(R4) ;;;MULTI-ACCESS DEVICE?I BEQ 10$ ;;;IF EQ NO0 CMP S.KRB(R4),S.KTB(R4) ;;;IS THIS PORT 'A'?+ BNE 5$ ;;;IF NE NO, IT MUST BE PORT 'B' 6 BITB #S3.SPA,S.ST3(R4) ;;;IS PORT 'A' SPINNING UP? BNE 10$ ;;;IF NE YES) BR 15$ ;;;TIMEOUT FOR NORMAL FUNCTION 95$: BITB #S3.SPB,S.ST3(R4) ;;;IS PORT 'B' SPINNING UP?A( BEQ 15$ ;;;IF EQ NO, NORMAL FUNCTION310$: DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET?( BEQ 15$ ;;;IF EQ YES MTPS #0 ;;;ALLOW INT00zxNxtccccERRUPTS1 JMP DMRQC ;REQUEST CONTROLLER AND RESTART I/O.15$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY- MOV S.PKT(R4),R1 ;;;GET I/O PACKET ADDRESST+ MOV (R2),I.PRM+6(R1);;;SAVE CSR CONTENTS  MTPS #0 ;;;ALLOW INTERRUPTSB5 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERF6 MOV #IE.DNR&377,R0 ;GET DEVICE NOT READY ERROR CODE+ MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS 3 MOV I.PRM+6(R1),$DVSAV ;SAVE SAVED CSR CONTENTSU, MOV S.KRB(R4),R2 ;GET CURRENT KRB ADDRESS/ MOVB K.CON(R2),R3 ;RETREIVE CONTROLLER INDEXN  MOV (R2),R2 ;GET CSR ADDRESS) MOVB U.UNIT(R5),R1 ;GET UNIT TO SELECT$ MOV R1,RKCS2(R2) ;SELECT THE UNIT+ CALL DMSDC ;ISSUE SELECT DRIVE FUNCTIONC: MOV S.PKT(R4),R1 ;PUT BACK THE I/O PKT ADDRESS ;GM107, CALL DMDINT ;TEST FOR DIAGNOSTIC TIMEOUT BCS DMFIN ;IF CS IT WASO# CALL DMLTMO ;LOG DEVICE TIMEOUTR2 BITB #S3.SIP,S.ST3(R4) ;TIMEOUT DURING A SEEK? BEQ 20$ ;IF EQ NOE6 CALL DMPRM ;RESET RETRY AND OFFSET RECOVERY VALUES=20$: BICB #S3.SIP,S.ST3(R4) ;ASSUME DATA TRANSFER FUNCTIONG/ BICB #OFM,U.CW2+1(R5);CLEAR OFFSET MODE FLAGO: BITB #RCL!OFS,U.CW2+1(R5) ;TIMEOUT DURING POSITIONING? BNE DMFIN ;IF NE YES6 BITB #US.SPU,U.STS(R5) ;WAS THE DRIVE SPINNING UP? BEQ DMRTRY ;IF EQ NO/ MOV #IE.DNR&377,R0 ;YES, SET DRIVE NOT READY  BR DMFIN ;AND EXIT;L'; CHECK FOR RETRY OF CURRENT FUNCTION(;;2DMRTRY: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS) BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?  BNE DMFIN ;IF NE YES" DECB RTTBL(R3) ;RETRY FUNCTION? BLE DMFIN ;IF LE NOC# JMP DMREST ;YES, RETRY FUNCTIONB;O!; **-DMFIN-FINISH I/O OPERATIONI;ND; THIS ROUTINE WILL SET THE ACTUAL BYTES TRANSFERED PARAMETER, THEC; ERROR LOGGING RETRY COUNTS AND CALL $IODON. THE SELECTED DRIVE >; IS RELEASED, IF REQUESTED, AND THE CONTROLLER IS RELEASED.;R ; INPUTS:F;O; R0=SUCCESS/ERROR CODEK2; R2=ADDRESS OF CONTROLLER CSR OR REGISTER BLOCK; R4=ADDRESS OF THE SCB; R5=ADDRESS OF THE UCBD;T1DMFIN: MOV RKWC(R2),R1 ;GET RESIDUAL WORD COUNTJ! ASL R1 ;CONVERT TO BYTE COUNT/ NEG R1 ;CONVERT TO POSITIVE BYTES REMAINING<DMFIN0: MOV R1,U.CNT(R5) ;SAVE BYTES REMAINING TO TRANSFER1DMFIN1: MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESSD CALL DMDC ;CLEAR DRIVE0DMFIN3: MOV S.KRB(R4),R3 ;RETREIVE KRB ADDRESS/ MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEXE( BITB #OFM,U.CW2+1(R5);IN OFFSET MODE? BEQ 5$ ;IF EQ NO/ MOVB R0,RTTBL+1(R3) ;SAVE ERROR/SUCCESS CODE # BR DMRCAL ;NOW DO A RECALIBRATE(;5$: BITB #S3.NRL,S.ST3(R4) ;SHOULD WE RELEASE THE DRIVE?  BNE 15$ ; IF NE NO/ BIT #DRA,RKDS(R2) ;HAVE WE SEIZED THE DRIVE?1 BEQ 10$ ;IF EQ NOR' BIS #RLS,RKCS2(R2) ;RELEASE THE PORTB4 CALL DMSD ;ISSUE SELECT FUNCTION TO RELEASE PORT>10$: BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED715$: MOV #IE,(R2) ;RE-DISPATCH IF DRIVE INTERRUPT SETC1 MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTM8 BITB #XCT,U.CW2+1(R5) ;HAS A FUNCTION BEEN EXECUTED? BNE 20$ ;IF NE YES) MOV #RETRY,R2 ;SET MAXIMUM RETRY COUNTR520$: BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT,7 BICB #S3.SIP,S.ST3(R4) ;RESET SEEK IN PROGRESS FLAGN" CALL $RLCN ;RELEASE CONTROLLER2DMDONE: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS3 MOV I.PRM+4(R1),R1 ;GET ACTUAL BYTES TO TRANSFER 8 SUB U.CNT(R5),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED1 CLR S.FRK+2(R4) ;CLEAR THE FORK INTERLOCK FLAGA- MOV @S.KRB(R4),-(SP) ;GET THE CSR ADDRESS # MOV #IE,(SP)+ ;ENABLE INTERRUPTSE% CALL $IODON ;FINISH I/O OPERATION # JMP DMINI ;PROCESS NEXT REQUESTR; 8; **-DMSOFT-TEST FOR SOFT RECOVERABLE ERROR CONDITIONS; ; INPUTS:E;A; R0=IE.VER&377;; R1=CONTENTS OF RKERO; R2=ADDRESS OF CSRE; 0DMSOFT: BIT #WCE,RKCS2(R2) ;WRITE CHECK ERROR? BEQ 10$ ;IF EQ NOU1 MOV #IE.WCK&377,R0 ;SET WRITE CHECK ERROR CODE- BR DMRTRY ;AND ATTEMPT TO RETRY OPERATIONA&10$: TST RKCS2(R2) ;DATA LATE ERROR? BMI DMDLT00xIwttt tfDATA ;IF MI YES; BIT #DCPAR!CTO,(R2) ;CONTROLLER TIMEOUT OR PARITY ERROR? BNE DMRTRY ;IF NE YES 3 BIT #CDPAR,R1 ;CONTROLLER TO DRIVE PARITY ERROR?E BNE DMRTRY ;IF NE YES , BIT #OPI!SKI,R1 ;DRIVE POSITIONING ERROR? BEQ DMECC ;IF EQ NO * MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS+ CALL DMCLER ;CLEAR CONTROLLER AND DRIVE$; ; DO A RECALIBRATE OPERATION;I0DMRCAL: MOV #HMS,R0 ;SET RECALIBRATE FUNCTION6 BISB #RCL,U.CW2+1(R5);INDICATE RECALIBRATE FUNCTION' CALLR DMDIP1 ;ISSUE THE RECALIBRATEA  ;)# ; **-DMECC-ATTEMPT ECC CORRECTION ;BF ; THIS ROUTINE IS ENTERED IF A DATA ERROR IS DETECTED. IF THE ERRORI; IS CORRECTABLE, THE EXECUTIVE ECC ROUTINE IS CALLED AND THE OPERATIONOG; IS RESTARTED FROM WHERE THE CONTROLLER STOPPED. IF OFFSET RECOVERY; IS REQUIRED, WE WILL DO IT. ;R ; INPUTS:;A; R1=CONTENTS OF RKER ; R2=ADDRESS OF CONTROLLER CSR;R8DMECC: CMPB #READ,U.BUF(R5) ;IS THIS A READ OPERATION? BNE DMRTRY ;IF NE NO0 MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS) BITB #IQ.X,I.FCN(R3) ;INHIBIT RETRIES?E BNE DMFIN ;IF NE YES) MOV S.KRB(R4),R3 ;RETREIVE KRB ADDRESST/ MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEX $ DECB RTTBL(R3) ;RE-READ THE DATA?,  BLE 10$ ;IF LE NO, DO THE ECC CORRECTION+! CALLR DMREST ;YES, RESTART THE TRANSFER ."10$: MOVB #RETRY,RTTBL(R3);RESET RETRY COUNT5# MOV RKWC(R2),R0 ;GET NEGATIVE # OF WORDS REMAININGA$ ASL R0 ;CONVERT TO BYTES8% ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED0& BEQ DMOFF ;IF EQ NONE TRANSFERED, TRY OFFSET4' BIC #^C,R1 ;ISOLATE IMPORTANT BITS'( CMP #DCK,R1 ;ONLY DATA CHECK ERROR?M#) BNE DMOFF ;IF NE NO, TRY OFFSET ,* MOV RKECPS(R2),R1 ;GET ECC ERROR POSITION0+ MOV RKECPT(R2),R3 ;GET ECC CORRECTION PATTERN,, MOV RKWC(R2),R2 ;GET REMAINING WORD COUNT&- CALL $ECCOR ;DO THE ECC CORRECTION1. CALL DMPRM0 ;RESET OFFSET RECOVERY PARAMETERSA*/ CALL DMCALC ;RE-CALCULATE DISK ADDRESS70 MOV #IS.SUC&377,R0 ;ASSUME NO MORE WORDS TO TRANSFERQ-1 TST U.CNT(R5) ;ANY MORE WORDS TO TRANSFER?B2 BNE 20$ ;IF NE YES3 CALLR DMFIN ;NO, FINISH I/O#.420$: MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS+5 CALL DMCLER ;CLEAR CONTROLLER AND DRIVE;$6 CALL DMERL ;FINISH ERROR LOGGING97 MOV U.BUF+2(R5),RKBA(R2) ;SET PREVIOUS BUFFER ADDRESS <8 MOV I.PRM+10(R1),RKDC(R2) ;SET PREVIOUS CYLINDER ADDRESS89 MOV I.PRM+12(R1),RKDA(R2) ;SET PREVIOUS DISK ADDRESS*: CALLR DMDIP ;RESTART THE DATA TRANSFER;<;3=; **-DMDLT-DATA LATE RECOVERYA>;QJ?; THIS ROUTINE IS ENTERED IF A DATA LATE ERROR IS DETECTED. WE WILL NOWI@; BACKUP THE WORD COUNT, BUS ADDRESS AND CYLINDER/TRACK/SECTOR ADDDRESSEIA; BY ONE BLOCK AND RETRY THE TRANSFER FROM THIS POINT. THIS IS DONE TORJB; PREVENT THE DATA LATE CONDITION FROM RECURRING DUE TO A LONG TRANSFER.C;P D; INPUTS:CE; F; R0=IE.VER&377DG; R1=CONTENTS OF RKER1H; R2=ADDRESS OF CSREI; J6KDMDLT: MOV S.PKT(R4),R3 ;RETRIEVE I/O PACKET ADDRESS(L BITB #IQ.X,I.FCN(R3) ;INHIBIT RETRIESM BEQ 20$ ;IF EQ NOI%N10$: JMP DMFIN ;YES, FINISH UP I/OT-O20$: MOV S.KRB(R4),R3 ;RETRIEVE KRB ADDRESSS/P MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX $Q DECB RTTBL(R3) ;ANY RETRIES LEFT?R BLE 10$ ;IF LE NO 0S MOV RKWC(R2),R0 ;GET NEGATIVE WORDS REMAINING,T BNE 30$ ;IF NE WE HAD A PARTIAL TRANSFER2U MOV #-1,R0 ;DLT ON LAST WORD, FAKE PARTIAL XFR)V30$: ASL R0 ;CONVERT TO NEGATIVE BYTES8W ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED/X BIC #777,R0 ;GET BLOCKS ACTUALLY TRANSFERED$2Y CALL DMCALC ;BACKUP TO START OF BLOCK IN ERROR(Z TST U.CNT(R5) ;LAST BLOCK TRANSFERED?[ BNE 40$ ;IF NE NO3.\ ADD R0,U.CNT(R5) ;YES, NORMALIZE BYTE COUNT4]40$: MOV #IE.VER&377,R0 ;ASSUME NO FURTHER RETRIES)^ JMP DMREST ;RESTART THE I/O OPERATION_`;$$a; **-DMOFF-ATTEMPT OFFSET RECOVERYb;#?c; THIS ROUTINE IS CALLED WHENEVER WE NEED TO OFFSET THE HEADSRBd; SOME DISTANCE FROM TRACK CENTERLINE TO PROPERLY READ THE DATA.e;F f; INPU00xNxtccccTS:#g;08h; R0=NUMBER OF BYTES ACTUALLY TRANSFERED TO THIS POINTi; R3=CONTROLLER INDEXRj;k+lDMOFF: DECB OFFRTY(R3) ;ANY RETRIES LEFT?$m BGT 10$ ;IF GT YES1n5$: MOV #IE.VER&377,R0 ;SET UNRECOVERABLE ERROREo CALLR DMFIN ;FINISH I/OR.p10$: MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS(q TST R0 ;ANY GOOD SECTORS TRANSFERED?r BEQ 40$ ;IF EQ NOHs;UBt; THE TRANSFER ENDED IN AN ECC HARD ERROR BUT THERE WERE SECTORSBu; TRANSFERED THAT CONTAINED GOOD DATA. SINCE THE ECC HARD ERRORCv; COULD HAVE BEEN CAUSED BY A CYLINDER CROSSING, THE GOOD DATA IS>w; SAVED AND THE TRANSFER IS RETRIED FROM THE POINT OF ERROR.x;R.y BIT #ECH,RKER(R2) ;WAS IT A HARD ECC ERROR?z BEQ 15$ ;IF EQ NOO3{ SUB #512.,R0 ;BACK UP TO START OF BLOCK IN ERRORM.|15$: CALL DMCALC ;RE-CALCULATE DISK ADDRESS4} TST U.CNT(R5) ;ANY BYTES REMAIN TO BE TRANSFERED?~ BNE 20$ ;IF NE YES2 ADD R0,U.CNT(R5) ;NO, NORMALIZE BYTES REMAINING720$: CALL DMPRM1 ;RESET OFFSET TABLE ADDRESS POINTER  BR 50$;O=; NO GOOD DATA WAS TRANSFERED SO CHECK TO SEE IF THE OFFSET,; FROM TRACK CENTERLINE SHOULD BE CHANGED.;T(40$: DECB OFFRTY+1(R3) ;CHANGE OFFSET? BLE 45$ ;IF LE YES% JMP DMINIO ;RESTART THE OPERATION ;45$: MOVB #OFFTRY,OFFRTY+1(R3) ;SET RECOVERY RETRY COUNT-+50$: INC OFFAD(R3) ;UPDATE OFFSET POINTER * MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS- CMP #OFFTBE,OFFAD(R3) ;ALL OFFSETS TRIED?B BLT 5$ ;IF YES RETURN ERROR1, MOVB @OFFAD(R3),R0 ;GET NEXT OFFSET VALUE. BNE 60$ ;IF NE NOT RETURNING TO CENTERLINE: MOVB #RETRY*2,OFFRTY+1(R3) ;TRY 16 TIMES AT CENTERLINE/60$: CALL DMCLER ;CLEAR CONTROLLER AND DRIVEN' BIC #^C<377>,R0 ;ISOLATE OFFSET BITSP* MOV R0,RKOF(R2) ;LOAD NEXT OFFSET VALUE$ MOV #OFF,R0 ;SET OFFSET FUNCTION7 BISB #OFS!OFM,U.CW2+1(R5) ;INDICATE OFFSET FUNCTION ) CALLR DMDIP1 ;EXECUTE OFFSET FUNCTIONS;#(; RESET THE OFFSET RECOVERY PARAMETERS;55DMPRM: MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNTFADMPRM0: MOVB #1,OFFRTY+1(R3) ;SET INITIAL RECOVERY COUNT TO ONE @ MOVB #RETRY*2+OFFTRY*7+16.,OFFRTY(R3) ;SET TOTAL RETRY COUNT ;FOR OFFSET RECOVERY;DMPRM1: MOV #OFFTB-1,OFFAD(R3) ;SET OFFSET TABLE POINTERR  RETURN ;F;8; **-DMERL-FINISH ERROR LOGGING FOR MID TRANSFER ERROR;)B; THIS ROUTINE IS CALLED TO FINISH OFF THE ERROR LOGGING PROCESS:; DURING MID-TRANSFER IF WE HAVE SUCCESSFULLY RECOVERED.; ; INPUTS:V;R; R3=CONTROLLER INDEXE;O%DMERL: MOV R2,-(SP) ;SAVE REGISTERSN MOV R1,-(SP) ;...1 MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTS1 BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNTY. MOV #IS.SUC&377,R0 ;RECOVERY WAS SUCCESSFUL- CALL $FNERL ;FINISH ERROR LOGGING PROCESS" MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R2 ;...0 BR DMPRM ;RESET RECOVERY PARAMETERS AND EXIT;P7; **-DMCALC-CALCULATE UPDATED DISK AND BUFFER ADDRESSE;EA; THIS ROUTINE WILL CALCULATE THE NEW DISK AND BUFFER ADDRESSES5; BASED ON THE NUMBER OF BYTES ACTUALLY TRANSFERED..; ; INPUTS:3;; ; R0=BYTES ACTUALLY TRANSFERED;E ; OUTPUTS:;S; R0=UNCHANGED IF U.CNT(R5)=0S%; I.PRM+10(R1)=NEW CYLINDER ADDRESSC); I.PRM+12(R1)=NEW TRACK/SECTOR ADDRESS*; U.BUF+1(R5)=NEW ADDRESS EXTENSION BITS; U.BUF+2(R5)=NEW BUS ADDRESS ;E>DMCALC: SUB R0,U.CNT(R5) ;REDUCE BYTES REMAINING TO TRANSFER BEQ 30$ ;IF EQ NONE LEFT5 ADD R0,U.BUF+2(R5) ;UPDATE STARTING BUFFER ADDRESSF8 ADCB U.BUF+1(R5) ;PROPAGATE CARRY INTO EXTENSION BITS) MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESS ( ADD K.OFF(R1),R1 ;POINT TO UMR AREA+2+ ADD R0,-(R1) ;CALCULATE NEW REAL ADDRESSS ADCB -(R1) ;...W+5$: SWAB R0 ;CALCULATE THE NUMBER OF ...K" ASR R0 ;... SECTORS TRANSFERED+ MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS 3 ADD I.PRM+12(R1),R0 ;UPDATE TRACK/SECTOR ADDRESSE&10$: CMPB #22.,R0 ;SECTOR OVERFLOW? BHI 20$ ;IF HI NO) SUB #22.,R0 ;NORMALIZE SECTOR ADDRESSE ADD #400,R0 ;ADD IN A TRAC00xIwttt tfDATAKP! CMP #3*400,R0 ;TRACK OVERFLOW? BHI 10$ ;IF HI NOT) SUB #3*400,R0 ;NORMALIZE TRACK ADDRESSI, INC I.PRM+10(R1) ;UPDATE CYLINDER ADDRESS  BR 10$ ;=20$: MOV R0,I.PRM+12(R1) ;SAVE UPDATED TRACK/SECTOR ADDRESSO30$: RETURN ;;;R*; **-DMVV-PROCESS VOLUME VALID FUNCTIONS;RD; HERE WE WILL PROCESS VOLUME VALID FUNCTIONS. IF THE FUNCTION ISD; RESET VOLUME VALID WE WILL FORCE AN UNLOAD OF THE DRIVE. IF THED; FUNCTION IS SET VOLUME VALID, WE WILL SET THE HARDWARE "VV" BIT.C; IF THE FUNCTION IS A VOLUME VALID NOP, WE WILL SIZE THE DISK BY;8; PASSING THE CONTROLLER REGISTERS BACK TO THE CALLER.;A:DMVV: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER* MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS0 CALL DMCLR ;CLEAR CONTROLLER AND SELECT UNIT  CALL DMSDC ;SELECT THE DRIVE CALL DMDC ;CLEAR THE DRIVE0 MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS" TST I.PRM+2(R1) ;SIZE THE DISK? BPL 10$ ;IF PL NOU, BIT #NED,RKCS2(R2) ;DOES THE DRIVE EXIST? BEQ 5$ ;IF EQ YESA$ CALL DMCLR ;CLEAR THE CONTROLLER, MOV #IE.SZE&377,R0 ;UNABLE TO SIZE DEVICE+ BICB #US.VV,U.STS(R5);RESET VOLUME VALIDQ CALLR DMFIN3 ;EXIT75$: CALL DMRPAS ;PASS CONTROLLER REGISTERS TO CALLERD  BR 30$ ;210$: BIT #VV$SET,I.PRM+2(R1) ;SET VOLUME VALID? BEQ 40$ ;IF EQ NO9 MOV RKDS(R2),R1 ;GET CONTENTS OF DRIVE STATUS REGISTERV COM R1 ;TOGGLE THEMT2 BIT #SVAL!DRDY!DRA,R1 ;DRIVE READY AND ONLINE? BEQ 15$ ;IF EQ YES* MOV #IE.DNR&377,R0 ;SET DRIVE NOT READY+ BICB #US.VV,U.STS(R5);RESET VOLUME VALID  BR 35$ ;/ 15$: MOV #ACK,R0 ;GET PACK ACK FUNCTION CODES% 20$: CALL DMGO ;ISSUE THE FUNCTIONN2 30$: MOV #IS.SUC&377,R0 ;SET SUCCESSFUL FUNCTION 35$: CALLR DMFIN1 ;AND EXIT2 40$: BIT #VV$UNL,I.PRM+2(R1) ;UNLOAD THE HEADS? BEQ 30$ ;IF EQ NO. BIT #PIP,RKDS(R2) ;POSITIONING IN PROGRESS?/ BNE 30$ ;IF NE YES, IT'S PROBABLY UNLOADINGD/ MOV #UNL,R0 ;GET UNLOAD HEADS FUNCTION CODE  BR 20$ ;;+>; INITIATE A CONTROLLER/DRIVE CLEAR OR SELECT DRIVE FUNCTION$; AND WAIT FOR THE SERIAL MESSAGE.; 9; NOTE: THE TIMING LOOP AT 20$ IS TO ALLOW TIME FOR THEF9; SERIAL MESSAGE TO BE SENT TO THE DRIVE AND THE STATUSN6; TO BE RECEIVED BY THE RK611. AVERAGE TIME = 15US.;-  .ENABL LSB 'DMCLER: CALL DMCLR ;CLEAR CONTROLLERI#DMDC: MOV R0,-(SP) ;SAVE REGISTER(  MOV #DC,R0 ;GET CODE FOR DRIVE CLEAR ! BR 10$ ;5"DMSDC: CLR RKDC(R2) ;CLEAR DESIRED CYLINDER ADDRESS;#DMSD: MOV R0,-(SP) ;)$ MOV #SD,R0 ;GET CODE FOR SELECT DRIVEV%%10$: CALL DMGO ;ISSUE THE FUNCTION & MOV (SP)+,R0 ; ' RETURNI(DMGO: CALL DMXCT ;LOAD RKCS1 2)20$: TSTB (R2) ;WAIT FOR THE SERIAL MESSAGE ... * BPL 20$ ;... TO DO ITS THING + RETURN ;.),DMCLR: MOV #CERR,(R2) ;CLEAR CONTROLLER 2- MOVB U.UNIT(R5),-(SP) ;GET CURRENT UNIT NUMBER*. MOV (SP)+,RKCS2(R2) ;RE-SELECT THE UNIT / RETURNF10DMXCT: CMP #815.,U.PRM+2(R5) ;IS THIS AN RK07? 1 BNE 30$ ;IF NE NO 32 BIS #CDT,R0 ;YES, SET CONTROLLER DRIVE TYPE BIT )330$: MOV R0,(R2) ;EXECUTE THE FUNCTIONI 4 RETURN ;O25DMCYL: MOV #2,RKMR1(R2) ;SET MESSAGE SELECT CODE*6 CALL DMSD ;SELECT DRIVE TO GET MESSAGE)7 MOV RKMR3(R2),R0 ;GET MESSAGE CONTENTST.8 ASH #-4,R0 ;RIGHT JUSTIFY CYLINDER ADDRESS59 BIC #^C<1777>,R0 ;ISOLATE CURRENT CYLINDER ADDRESSG : RETURN ; ; .DSABL LSB(<=;+7>; **-DMLXXX-RK611-RK06/RK07 DISK CARTRIDGE CONTROLLERU?; ERROR LOGGING ROUTINES@;DA; THIS ROUTINE IS CALLED WHENEVER A DEVICE ERROR OR DEVICE TIMEOUT<B; OCCURS. A CORE BLOCK THE SIZE OF THE REGISTER BUFFER ISDC; ALLOCATED AND THE REGISTERS (INCLUDING THE SIX EXTRA MAINTENANCE>D; REGISTERS) ARE TRANSFERED INTO THE CORE BLOCK AND THEN THEDE; APPROPRIATE EXECUTIVE ERROR LOGGING ROUTINE IS CALLED. THE CORECF; BLOCK ADDRESS IS THEN USED AS A PSEUDO REGISTER BASE ADDRESS BY EG; THE ERROR HANDLING ROUTINES. BEFORE THE NEXT FUNCTION IS ISSUED,U*H; THE REAL CSR ADDRESS MUST BE RESTORED.I;I>J; NOTE: IF ENT00xNxtccccRY IS THE RESULT OF A DEVICE TIMEOUT THEN THIS@K; ROUTINE IS EXECUTED AT THE RK611 DEVICE PRIORITY LEVEL (PR5)3L; UNTIL THE EXEC ERROR LOGGING ROUTINE IS CALLED.NM; N; INPUTS:AO; R2 = CSR ADDRESSCP; R4 = SCB ADDRESSQ;P R; OUTPUTS:&S; R2 = ADDRESS OF REGISTER SAVE AREAT; R4 = SCB ADDRESSRU;S$V; R0,R3 ARE PRESERVED ACROSS CALLW;-X Y .ENABL LSB =ZDMLTMO: MOV #$DVTMO,R1 ;;;GET ADDRESS OF OVERLAPPED TIMEOUTH[ BR 10$ ;;;=\DMLERR: MOV #$DVERR,R1 ;GET ADDRESS OF DEVICE ERROR ROUTINE #]10$: MOV R3,-(SP) ;SAVE REGISTERSN^ MOV R0,-(SP) ;...(_ MOV R1,-(SP) ;SAVE CO-ROUTINE ADDRESS,` MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS/a MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXR(b MUL #RMCNT,R3 ;FORM AN INDEX INTO ...)c ADD #RGBLK,R3 ;... REGISTER BLOCK AREA $d MOV R3,R0 ;COPY REGISTER ADDRESS$e MOV R0,-(SP) ;SAVE THIS FOR LATER)f CALL REGPAS ;FILL AREA WITH REGISTERSD/g MOV (SP)+,R2 ;RETRIEVE REGISTER AREA ADDRESSM0h CALL @(SP)+ ;CALL EXEC ERROR LOGGING ROUTINE"i MOV (SP)+,R0 ;RESTORE REGISTERSj MOV (SP)+,R3 ;... k RETURN ;M l .DSABL LSBVmn;+7o; **-DMRPAS-RK611-RK06/RK07 DISK CARTRIDGE CONTROLLER$p; CONTROLLER REGISTER PASS ROUTINEq;N=r; THIS ROUTINE WILL TRANSFER THE CONTENTS OF THE CONTROLLER3=s; REGISTERS (INCLUDING THE SIX EXTRA MAINTENANCE REGISTERS)S't; INTO A PREVIOUSLY ALLOCATED BUFFER.u; v; INPUTS: w; R0 = BUFFER ADDRESSx; R1 = I/O PACKET ADDRESSRy; R2 = CSR ADDRESS z; R5 = UCB ADDRESSR {; OUTPUTS:|; R2 = CSR ADDRESSS}; R3 = DESTROYEDV~;->DMRPAS: MOV I.PRM+14(R1),KISAR6 ;SET BUFFER RELOCATION BIAS3 MOV I.PRM+16(R1),R0 ;GET REGISTER BUFFER ADDRESST<REGPAS: MOV #RKMR2/2,R3 ;NUMBER OF MAJOR REGISTERS TO PASS! MOV R2,-(SP) ;SAVE CSR ADDRESS3-10$: MOV (R2)+,(R0)+ ;TRANSFER THE REGISTERN- SOB R3,10$ ;LOOP UNTIL ALL ARE TRANSFEREDE$ MOV (SP)+,R2 ;RESTORE CSR ADDRESS# MOV R0,R3 ;SAVE BUFFER POSITIONE' CALL DMCLR ;CLEAR CONTROLLER ERRORSR, CALL DMCYL ;GET CURRENT CYLINDER ADDRESS9 MOV R0,RKDC-RKMR2(R3) ;STORE CURRENT CYLINDER ADDRESS4% MOV R3,R0 ;RESTORE BUFFER POINTERS CLR R3 ;CLEAR COUNT;$20$: CALL DMCLR ;CLEAR CONTROLLER0 MOV R3,RKMR1(R2) ;SELECT DRIVE SERIAL MESSAGE1 CALL DMSD ;SELECT DRIVE TO GET PROPER MESSAGE(, MOV RKMR2(R2),(R0)+ ;SAVE CONTENTS OF MR2, MOV RKMR3(R2),(R0)+ ;SAVE CONTENTS OF MR30 INC R3 ;INCREMENT DRIVE SERIAL MESSAGE COUNT& CMP R3,#4 ;DONE FOUR MESSAGES YET? BNE 20$ ;NO, LOOPC5 CALLR DMCLER ;CLEAR CONTROLLER AND DRIVE AND EXITC;+7; **-DMDINT-RK611-RK06/RK07 DISK CARTRIDGE CONTROLLERF ; DIAGNOSTIC INTERRUPT HANDLER;A; THIS SUBROUTINE HANDLES INTERUPTS FROM DIAGNOSTIC OPERATIONS.R<; IF THE FUNCTION WAS DIAGNOSTIC THEN THE DEVICE REGISTERSG; ARE PASSED BACK TO THE DIAGNOSTIC TASK, THE CONTROLLER (VIA DMRPAS)(=; AND THE DRIVE ARE CLEARED AND THE I/O STATUS IS RETURNED.M;E ; INPUTS:P; R0 = I/O STATUS CODE; R1 = ADDRESS OF I/O PACKET; R2 = ADDRESS OF CSRO; R4 = ADDRESS OF SCBI; R5 = ADDRESS OF UCBD;- ; OUTPUTS:4; R1 = I/O PACKET ADDRESS (IF DIAGNOSTIC FUNCTION); R2 = ADDRESS OF CSRS; R4 = ADDRESS OF SCBT3; C = 1 IF INTERRUPT WAS FROM DIAGNOSTIC FUNCTIONA;G#; R0,R3 ARE PRESERVED ACROSS CALL ;-0DMDINT: CLC ;ASSUME NOT DIAGNOSTIC INTERRUPT0 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION? BEQ 30$ ;IF EQ NO, EXIT MOV R3,-(SP) ;SAVE REGISTER& MOV R1,R3 ;COPY I/O PACKET ADDRESS- MOV R0,-(SP) ;SAVE CURRENT I/O STATUS CODEC- TSTB R0 ;WAS THIS A SUCCESSFUL INTERRUPT?:* BMI 20$ ;IF MI JUST PASS THE REGISTERS/ CMP #IO.RDH!IQ.UMD,I.FCN(R3) ;READ HEADERS?D BNE 20$ ;NO, PROCESS NORMALU) CLR R0 ;CLEAR BYTE OFFSET INTO BUFFER * CALL $RELOP ;RELOCATE PHYSICAL ADDRESS1 MOV RKDB(R2),(R1)+ ;TRANSFER FIRST HEADER WORD2 MOV RKDB(R2),(R1)+ ;TRANSFER SECOND HEADER WORD1 MOV RKDB(R2),(R1)+ ;TRANSFER THIRD HEADER WORDI$20$: CALL DMSDC ;SELECT THE DRIVE& MOV R3,R1 00xxttt tfDATA;SAVE I/O PACKET ADDRESS. CALL DMRPAS ;PASS THE CONTROLLER REGISTERS) SEC ;SET DIAGNOSTIC INTERRUPT RETURNS( MOV (SP)+,R0 ;RESTORE I/O STATUS CODE) MOV (SP)+,R3 ;RESTORE CONTROLLER INDEXO 30$: RETURN;+); **-DMCKB-VALIDATE AND CONVERT THE LBNL;R;; THIS ROUTINE IS CALLED FROM $DRQRQ TO DO LBN PROCESSINGS;; FOR DEVICES WHICH SUPPORT QUEUE OPTIMIZATION. IF BLKC2 ;; DETECTS AN ERROR IT WILL RETURN TO THE CORRECT PLACE IN0 ; $DRQRQ AFTER CALLING $IOALT.;V ; INPUTS: ;A; R1=I/O PACKET ADDRESSS; R5=UCB ADDRESS;G ; OUTPUTS:;E6; IF THE CHECKS SUCCEEDS, THEN THE LBN IN THE PACKET?; IS REPLACED BY THE CYLINDER/TRACK/SECTOR. R1 IS PRESERVED.0;T<; IF THE CHECKS FAILS, THEN $IOALT IS ENTERED WITH A FINAL9; STATUS OF IE.BLK AND A RETURN TO THE CORRECT PLACE INS; $DRQRQ IS EXECUTED.C;P;U>; NOTE: ALL FUNCTIONS PUT INTO THE DRIVER QUEUE ARRIVE HERE.5; THESE INCLUDE IO.ATT, IO.DET, AND ACP FUNCTIONS.O;-=DMCHK: MOV I.FCN(R1),-(SP) ;PUT THE FUNCTION ONTO THE STACKD( CMPB #IO.ATT/256.,1(SP) ;IS IT ATTACH' BEQ 35$ ;IF EQ YES - LEAVE IT ALONEK) CMPB #IO.DET/256.,1(SP) ;IS IT DETACHE' BEQ 35$ ;IF EQ YES - LEAVE IT ALONEE+ BIC #7,(SP) ;CLEAR THE SUBFUNCTION BITSF/ CMP #IO.STC,(SP) ;IS IT SET CHARACTERISTICS?R' BEQ 35$ ;IF EQ YES - LEAVE IT ALONE TST (SP)+ ;CLEAN THE STACK+ CALL $BLKC2 ;CHECK LOGICAL BLOCK NUMBER2 CMPB #IO.WLB/256.,I.FCN+1(R3) ;WRITE FUNCTION? BNE 20$ ;IF NE NOV: BITB #IO.WLT&377,I.FCN(R3) ;OK TO WRITE ON LAST TRACK? BNE 20$ ;IF NE YES1 MOV R0,I.PRM+6(R3) ;SAVE STARTING BLOCK NUMBER7 ADD #22.,I.PRM+12(R3) ;ADD 1 TRACK'S WORTH OF BLOCKSI2 MOV R3,R1 ;RESTORE PACKET ADDRESS FOR THE CALL5 CALL $BLKC2 ;CHECK IF WRITE ON LAST TRACK OF DISKA= MOV I.PRM+6(R3),R0 ;RESTORE ORIGINAL STARTING BLOCK NUMBERT120$: CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBERG5 MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESSW$ SWAB R1 ;SWAP TRACK TO HIGH BYTE& BIS R1,R0 ;MERGE TRACK WITH SECTOR= MOV R0,I.PRM+12(R3) ;SAVE DESIRED TRACK AND SECTOR ADDRESS() MOV R3,R1 ;RESTORE THE PACKET ADDRESS230$: RETURN ;EXITR"35$: TST (SP)+ ;CLEAN THE STACK BR 30$ ;AND EXIT .ENDA CALL $BLKC2 ;CHECK IF WRITE ON LAST TRACK OF DISKA= MOV I.PRM+6(R3),R0 ;RESTORE ORIGINAL STARTING BLOCK NUMBERT120$: CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBERG5 MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESSW$ SWAB R1 ;SWAP TRACK TO HIG .TITLE SSTSR .IDENT /12.01/B; 7; COPYRIGHT (C) 1987 BY DIGITAL EQUIPMENT CORPORATIONE; ALL RIGHTS RESERVED.;D-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ;E; B. S. MCCARTHY;:-; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:T; $; B. S. MCCARTHY 22-DEC-86 12.00;."; BM377 -- MOVE DRDSP TO DIR11M;T!; J. W. BERZLE 7-MAY-87 12.01 ;B*; JWB212 -- CORRECT TEST OF STACK DEPTH;C ; MACRO LIBRARY CALLSH!;M":# .MCALL ABODF$,HDRDF$,HWDDF$,PKTDF$,BGCK$A,BGCK$R,BCKDF$&$ BCKDF$ ;DEFINE THE BUGCHECK CODES$% ABODF$ ;DEFINE TASK ABORT CODES'& HDRDF$ ;DEFINE TASK HEADER OFFSETSF&' HWDDF$ ;DEFINE HARDWARE REGISTERS&( PKTDF$ ;DEFINE I/O PACKET OFFSETS)*;M+; LOCAL DATA,;TG-; FLOATING POINT EXCEPTION VECTOR (FINAL SETUP OF THIS VECTOR AND, IFDE.; NECESSARY, THE PIRQ VECTOR IS PERFORMED IN INITL AND THE MCR SAVE1 /; COMMAND.)S0;S123 .IF DF F$$LPP!F$$LTPR4 5 .ASECT6.=244C7 .WORD $FLTRP ;8 .WORD PR7 ;A9 : .PSECT;< .ENDC=>?;C@; SEGMENT FAULT VECTORA; B C .ASECTSD.=250FE .WORD $SGFLT ;F .WORD PR7 ;H G .CSECTFHI;+J;G*K; **-$EMSST-NON RSX EMT/TRAP INSTRUCTIONL;LM; THIS ROUTINE IS TRANSFERED TO BY THE DIRECTIVE DISPATCHER WHEN A NON RSXMN; EMT OR A TRAP INSTRUCTION IS EXECUTED. THE MACHINE STATE HAS ALREADY BEENAEO; SAVED. THE EMT/TRAP CODE (LOW BYTE OF INSTRUCTION) IS SETUP TO BERIP; PASSED TO THE USER AND CONTROL IS TRANSFER00xNxtccccED TO THE SST EXIT ROUTINE.SQ; R; INPUTS:S;+T; R5=ADDRESS OF THE EMT/TRAP INSTRUCTION.U;C V; OUTPUTS:W;O)X; 04(SP)=EMT/TRAP CODE MULTIPLIED BY 2.,Y; 02(SP)=SST CODE (SCEMT=EMT, SCTRP=TRAP).>Z; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO USER STACK (6).[;-\ ] .ENABL LSBN0^$EMSST::MOV (SP),R5 ;GET EMT/TRAP INSTRUCTION+_ BIC #177400,(SP) ;CLEAR INSTRUCTION CODEE ` ASL (SP) ;MULTIPLY CODE BY 24a MOV #S.CEMT,-(SP) ;ASSUME NON-RSX EMT INSTRUCTION!b BIT #400,R5 ;EMT INSTRUCTION? *c BEQ 10$ ;IF EQ YES-SET NUMBER OF BYTES-d MOV #S.CTRP,(SP) ;SET FOR TRAP INSTRUCTIONC*e10$: MOV #3*2,-(SP) ;SET NUMBER OF BYTES+f JMP SSTXT ;TAKE COMMON SST EXIT ROUTINEEgh;+.i; **-$FLTRP-FLOATING POINT EXCEPTION (11/40)j;EKk; THIS ROUTINE IS TRAPPED TO WHEN AN 11/40 FLOATING POINT EXCEPTION FAULTMKl; OCCURS. THE CURRENT MACHINE STATE IS SAVED AND CONTROL IS TRANSFERED TO m; THE SST EXIT ROUTINE.Vn;E o; INPUTS:Up;N q; NONE.Sr;I s; OUTPUTS:t; u; 02(SP)=SST CODE (SCFLT).>v; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO USER STACK (4).w;-x5y$FLTRP:: ;DEFINE UNCONDITIONALLY FOR VECTOR SETUPJz{| .IF DF F$$LTP}0~ DIRSV$ ;;;SAVE REGISTERS AND CLEAR PRIORITY< MOV #S.CFLT,-(SP) ;SET FOR FLOATING POINT EXCEPTION FAULT9 MOV #BE.FLT,R3 ;FLOATING POINT EXCEPTION BUGCHECK CODEU BR 20$ ;SET NUMBER OF BYTESC .ENDC;+G; **-$FPPR7-$FPPR8-$FPPRQ-FLOATING POINT PROCESSOR EXCEPTION HANDLING ;TB; THESE ROUTINES HANDLE EXCEPTION FAULTS FROM THE FLOATING POINTF; PROCESSOR. THE FLOATING POINT EXCEPTION AND ADDRESS REGISTERS ANDJ; THE CURRENT TASK TCB ARE SAVED AND THEN AN ATTEMPT IS MADE TO QUEUE ANG; AST TO THE TASK AT FORK LEVEL. THESE ROUTINES SUPPORT TWO MODES OFPG; OPERATION DEPENDING ON WHETHER THE FPP'S EXCEPTION FAULTS CAN OCCURKH; WHILE THE PROCESSOR IS AT PRIORITY 7 OR NOT. IF THE FPP'S EXCEPTIONB; FAULT CAN OCCUR WHILE THE PROCESSOR IS AT PRIORITY 7, THEN THE@; PROCESSOR MUST HAVE A PIRQ REGISTER. INITL AND THE MCR SAVEB; COMMAND DETERMINE WHICH MODE OF OPERATION IS TO BE USED OR NOTF; DEPENDING ON WHETHER THE PROCESSOR HAS A PROGRAM INTERRUPT REQUEST?; REGISTER (PIRQ) OR NOT, AND SET UP THE FPP AND PIRQ VECTORSN2; ACCORDINGLY. THE ROUTINES OPERATE AS FOLLOWS.;HJ; 1. IF THE PROCESSOR DOES NOT HAVE A PIRQ REGISTER THEN THE FPP MUSTA; NEVER FAULT WHEN THE PROCESSOR IS AT PRIORITY 7 OR IT MUST BEHB; SYNCHRONOUS. IN THIS CASE THE FLOATING POINT EXCEPTION VECTORC; POINTS TO $FPPR7, AND THE PROCESSOR SIMPLY CALLS INTERRUPT SAVEE$; AND FORK TO GET TO SYSTEM STATE.;EI; 2. IF THE PROCESSOR HAS A PIRQ REGISTER, THE FLOATING POINT EXCEP-RC; TION TRAP VECTOR POINTS TO $FPPR8 AND THE PIRQ VECTOR POINTS TO.B; $FPPRQ. FLOATING POINT TRAPS ARE CONVERTED TO PIRQ PRIORITY 1C; INTERRUPTS AFTER SAVING THE FLOATING POINT STATUS. ON THE PIRQNC; TRAP AN INT SAVE AND FORK IS USED TO GET TO SYSTEM STATE. NOTETD; THAT THIS STRATEGY WOULD ALSO WORK FOR PROCESSORS DESCRIBED IN 1 ; ABOVE.;I ; INPUTS:T;TE; THE FLOATING POINT EXCEPTION REGISTER CONTAINS THE REASON FOR THEOF; FAULT AND THE FLOATING POINT ADDRESS REGISTER CONTAINS THE ADDRESS ; OF THE FAULTING INSTRUCTION.;O ; OUTPUTS:;FD; AN ATTEMPT IS MADE TO QUEUE AN AST TO THE TASK CAUSING THE FAULTB; WITH THE CONTENTS OF THE FLOATING POINT EXCEPTION REGISTER AND; AND ADDRESS REGISTER.U;- .IF DF F$$LPP=$FPPR7::STST $FLSTS ;;;STORE FLOATING POINT EXCEP AND ADDR  BR 14$ ;;;=$FPPR8::STST $FLSTS ;;;STORE FLOATING POINT EXCEP AND ADDRE: BIS #<2*256.>,PIRQ ;;;POST PROGRAMMED INTERRUPT REQUEST# RTI ;;;WAIT FOR PIRQ INTERRUPTD8$FPPRQ::CLR PIRQ ;;;DISABLE PROGRAM INTERRUPT REQUEST614$: MOV $TKTCB,$FLTCB ;;;MUST SAVE FAULTING TCB NOW& CALL $INTSV,PR1 ;;;GO TO PRIORITY 1- MOV $FLFRK,R4 ;;;SET ADDRESS OF FORK BLOCK* CALL $FORK0 ;;;CREATE A SYSTEM PROCESS2 MOV #AS.FPA,R4 ;GET CODE FOR FLOATING POI00xxttt tfDATANT AST2 MOV $FLTCB,R5 ;GET TCB ADDRESS OF FAULTING TASK+ CALL $DASTT ;DECLARE FLOATING POINT ASTE" BCS 15$ ;IF CS NO AST DECLARED0 MOV $FLSTS,A.PRM+2(R1) ;INSERT AST PARAMETERS MOV $FLSTS+2,A.PRM(R1) ;15$: RETURN ;Q .IFFP&$FPPR7:: ;REFERENCE LABEL FOR SAVE$FPPR8:: ;REFERENCE LABELB$FPPRQ:: ;REFERENCE LABELT .ENDC;+-; **-$ILINS-ILLEGAL OR RESERVED INSTRUCTION0;CF; THIS ROUTINE IS TRAPPED TO WHEN AN ILLEGAL OR RESERVED INSTRUCTIONI; IS EXECUTED. THE CURRENT MACHINE STATE IS SAVED AND CONTROL IS TRANS-C#; FERRED TO THE SST EXIT ROUTINE. ;S ; INPUTS:R; ; NONE.,;+ ; OUTPUTS:;A; 02(SP)=SST CODE (SCILI).B; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO THE USER STACK (4).;AE; THIS ROUTINE IS ALSO ENTERED WHEN THE CSM INSTRUCTION IS EXECUTEDAG; ON A PROCESSOR THAT DOES NOT SUPPORT CSM. IT WILL FIELD THE ILLEGALU5; INSTRUCTION TRAP AND EMULATE THE CSM INSTRUCTION.L;O<; NOTE: ONLY ONE FORM OF THE CSM INSTRUCTION IS SUPPORTED.;I); MOV #
,-(SP)T ; CSM (SP)+R;E; KERNEL STACK ON ENTRY.; ; 0(SP) = TRAP PC + 2:; 2(SP) = PS PRIOR TO TRAP;.4; KERNEL STACK IMMEDIATELY BEFORE RTI INSTRUCTION.;T5; 0(SP) = (10) (VIRTUAL ADDRESS IN SUPERVISOR MODE)H:; 2(SP) = PS WITH PROPER PREVIOUS AND CURRENT MODE SUPER;S3; SUPER STACK IMMEDIATELY BEFORE RTI INSTRUCTION.O;P.; 0(SP) = ADDRESS OF SUPERVISOR MODE ROUTINE; 2(SP) = RETURN ADDRESS; 4(SP) = PS PRIOR TO TRAP;;-$ILINS:: ;;;REF LABEL .IF DF S$$LIB .IF NDF X$$DBT & TST $STKDP ;;;PREVIOUS MODE USER ? BLE 17$ ;;;IF LE NOE .ENDC ;NDF X$$DBT  %  MOV (SP),-(SP) ;;;COPY TRAP PC + 2I$  SUB #2,(SP) ;;;CALCULATE TRAP PC+  MFPI @(SP)+ ;;;PICK UP TRAP INSTRUCTION # CMP (SP),#7027 ;;;IS IT CSM #N ?E BEQ 155$ ;;;IF EQ YESI$ CMP (SP),#7026 ;;;IS IT CSM (SP)+3 BNE 165$ ;;;IF NE NO - ILLEGAL INSTRUCTION TRAP 6155$: TSTB $SUPFL ;;;TASK MAPPED TO SUPER WINDOWS ?3 BEQ 165$ ;;;IF EQ NO - ILLEGAL INSTRUCTION TRAP< BIT #10,SR3 ;;;IS THE INSTRUCTION LEGAL ON THIS MACHINE?3 BNE 165$ ;;;IF NE NO - ILLEGAL INSTRUCTION TRAP< ADD #170751,(SP) ;;;IS IT CSM #N ? (THIS INSTRUCTION WILL. ;;;SET C FOR #N, BUT NOT (SP)+, AND WILL. ;;;LEAVE A ZERO CONSTANT (USED LATER FOR' ;;;STACK ADJUSTMENT) ON THE STACKC MOV R0,-(SP) ;;;SAVE R03 BCS 156$ ;;;IF CS WE DETERMINED 2 INST AGO THIST ;;;WAS CSM (SP)+5 MOV #2,2(SP) ;;;IT WAS CSM (SP)+ - SET CONSTANT TOF. ;;;ADD TO USER STACK FOR ADJUSTING BELOW. MFPI SP ;;;GET PREVIOUS MODE STACK POINTER9 $DSLM1::MFPD$ @(SP)+ ;;;GET ADDR OF SUPER MODE ROUTINEA$! BR 157$ ;;;FINISH IN COMMON CODED"156$: MOV 4(SP),-(SP) ;;;GET ADDRESS OF SECOND HALF OF INSTRUCTION(# MFPI @(SP)+ ;;;GET IMMEDIATE OPERAND/$157$: MOV SP,R0 ;;;COPY KERNEL STACK POINTERM!% ADD #6,R0 ;;;POINT TO TRAP PC '& MOV (R0)+,-(SP) ;;;PUSH PC OF CALLER&' MOV (R0),-(SP) ;;;PUSH PS OF CALLER:( MOV #CSMODE!PMODE,(R0) ;;; CURRENT=SUPER, PREVIOUS=USER0) BIC #17,(SP) ;;;CLEAR STACKED CONDITION CODES+* BMI 16$ ;;;IF MI PREVIOUS MODE WAS USERP9+ BIC #^CPSMODE&PMODE,(R0) ;;;SET PREVIOUS MODE TO SUPERS',16$: MFPI SP ;;;GET PREVIOUS MODE SP 9- ADD 12(SP),(SP) ;;;ADJUST FOR STACK DIFFERENCE BETWEEN+. ;;;(SP)+ AND #N VARIATION$/ MOV (SP),R0 ;;;COPY IT;0 SUB #6,(SP) ;;;ADJUST SP FOR PUSHED PS,PC,SUPER ROUTINE071 BIC #^CPSMODE&PMODE,PS ;;;SET PREVIOUS MODE TO SUPER 2 MTPI SP ;;;SET SUPER SPP'3 MTPD -(R0) ;;;PUSH PS ON USER STACKR(4 MTPD -(R0) ;;;PUSH PC ON SUPER STACK/5 MTPD -(R0) ;;;PUSH ADDRESS OF SUPER ROUTINEU6 MOV (SP)+,R0 ;;;RESTORE R00&7 CMP (SP)+,(SP)+ ;;;POINT TO TRAP PS?8$DSLM2::MFPI 10 ;;;SET RETURN PC IN SUPER MODE FROM SUPER 10F(9 RTI ;;;RETURN TO (SUPER VIRTUAL 10):4;165$: TST (SP)+ ;;;POP CSM INSTRUCTION FROM STACK<= .ENDC ;DF S$$LIBP>?!@17$: DIRSV$ ;;;SAVE 00xNxtccccREGISTERSEA=B MOV #S.CILI,-(SP) ;SET FOR ILLEGAL OR RESERVED INSTRUCTIONS4C MOV #BE.ILI,R3 ;ILLEGAL INSTRUCTION BUGCHECK CODED BR 20$ ;SET NUMBER OF BYTESE .PAGEF;+G; **-$IOTRP-IOT INSTRUCTIONUH;MJI; THIS ROUTINE IS TRAPPED TO WHEN AN IOT INSTRUCTION IS EXECUTED. IF THECJ; STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED VIA A JUMP TO;IK; $CRASH. ELSE THE CURRENT MACHINE STATE IS SAVED AND CONTROL IS TRANS- "L; FERED TO THE SST EXIT ROUTINE.M;DN; IF THE CURRENT TASK HAS FAST MAPPING ENABLED ($FMAPP>0) THEN THEHO; FAST MAP DESCRIPTOR IN THE REGISTERS IS USED TO REMAP A PLAS WINDOW.9P; (SEE DRMAP, WHERE THE REMAPPING ACTUALLY TAKES PLACE)EQ;+ R; INPUTS:RS; T; NONE.UU;M V; OUTPUTS:W;IEX; IF THE CURRENT STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED.T@Y; ELSE THE FOLLOWING ARGUMENTS ARE SETUP ON THE CURRENT STACK:Z;E[; 02(SP)=SST CODE (SCIOT).C\; 00(SP)=NUMBER OF BYTES TO BE TRANSFERRED TO THE USER STACK (4).];-^;E _; NOTES:`; Ea; REGISTER CONTENTS ON ENTRY/EXIT TO FAST MAP ARE DEFINED IN DRMAP.Eb .PAGEAc18$: BGCK$A BF.EXE,BE.IOT,INTERNAL ;;;SETUP ERROR CODES FOR IOTNd ;;;IN SYSTEM STATE%e JMP $CREMT ;;;GO CRASH THE SYSTEM f1g$IOTRP::TST $STKDP ;;;RUNNING ON SYSTEM STACK?1/g BLE 18$ ;;;IF LE NO, SYSTEM FAULT ;JWB212Oi ;**-1Sj .IF DF F$$MAP&X$$HDR&P$$LASk0l TST $FMAPP ;;;FAST MAP IN USE FOR THIS TASK?m BEQ 189$ ;;;IF EQ NOno .IF DF D$$PARp4q MOV $DRAP3,KINAR5 ;;;MAP TO PLAS DIRECTIVE COMMONrs .ENDC ; DF D$$PARt/u JMP $DRFMP ;;;GO EXECUTE FAST MAP DIRECTIVEOvw189$: ;;;REFERENCE LABEL x"y .ENDC ; DF F$$MAP&X$$HDR&P$$LASz.{ DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITY-| MOV #S.CIOT,-(SP) ;SET FOR IOT INSTRUCTIONB} BR 20$ ;SET NUMBER OF BYTES ~;+; **-$SGFLT-SEGMENT FAULTD;MG; THIS ROUTINE IS TRAPPED TO WHEN A SEGMENT FAULT OCCURS. THE CURRENTL; MACHINE STATE IS SAVED, SR0 THRU SR2 ARE SETUP TO BE PASSED TO THE USER,6; AND CONTROL IS TRANSFERED TO THE SST EXIT ROUTINE.;P ; INPUTS:O;U ; NONE. ;T ; OUTPUTS:; ; 10(SP)=CONTENTS OF SR0..; 06(SP)=CONTENTS OF SR2.S; 04(SP)=CONTENTS OF SR1.I; 02(SP)=SST CODE (SCSGF).C; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO THE USER STACK (10).Y;-5$SGFLT::DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITYI MOV #SR0+4,R5 ;POINT SR2N MOV (R5),-(SP) ;SAVE SR2! MOV (SP),-(SP) ;COPY SAVED SR2U MOV -(R5),-(SP) ;SAVE SR1 MOV -(R5),4(SP) ;SAVE SR04 BIC #160000,(R5) ;UNFREEZE MEMORY MANAGEMENT UNIT+ MOV #S.CSGF,-(SP) ;SET FOR SEGMENT FAULT & MOV #5*2,-(SP) ;SET NUMBER OF BYTES. MOV #BE.SGF,R3 ;SEGMENT FAULT BUGCHECK CODE* BR SSTXT ;TAKE COMMON SST EXIT ROUTINE;+A; **-$TRACE-TRACE (T-BIT) OR BREAK POINT INSTRUCTION (BPT) TRAPT;SK; THIS ROUTINE IS TRAPPED TO WHEN A TRACE TRAP (T-BIT) OCCURS OR A BREAK-VJ; POINT TRAP INSTRUCTION IS EXECUTED. THE CURRENT MACHINE STATE IS SAVED6; AND CONTROL IS TRANSFERED TO THE SST EXIT ROUTINE.;5 ; INPUTS:E;M ; NONE.N; ; OUTPUTS:;;; 02(SP)=SST CODE (SCBPT).B; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO THE USER STACK (4).;-5$TRACE::DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITY+6 MOV #S.CBPT,-(SP) ;SET FOR TRACE OR BREAKPOINT TRAP4 MOV #BE.BPT,R3 ;TRACE OR BREAKPOINT BUGCHECK CODE BR 20$ ;SET NUMBER OF BYTESA;+7; **-$TRP04-TRAPS AT 4 (ODD ADDRESS, NONEX MEM, ETC.)N;TL; THIS ROUTINE IS TRAPPED TO WHEN A TRAP AT 4 OCCURS. IF A STACK VIOLATIONH; HAS CAUSED THE TRAP (I.E. A STACKPOINTER OF LESS THAN 400), THEN THEF; THE SYSTEM IS CRASHED. ELSE THE CURRENT MACHINE STATE IS SAVED AND2; CONTROL IS TRANSFERED TO THE SST EXIT ROUTINE.;S ; INPUTS:;V ; NONE.S;E ; OUTPUTS:;K; 02(SP)=SST CODE (SCOAD).B; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO THE USER STACK (4).;-*$TRP04::CMP SP,#400 ;;;STACK VIOLATION? BLO 30$ ;;;IF LO YES. DIRSV$ ;;;S00xxttt tfDATAAVE REGISTERS AND SET PRIORITY' CLR -(SP) ;SET FOR ODD ADDRESS TRAPT< MOV #BE.ODD,R3 ;ODD ADDRESS OR OTHER TRAP 4 BUGCHECK CODE*20$: MOV #2*2,-(SP) ;SET NUMBER OF BYTES* BR SSTXT ;TAKE COMMON SST EXIT ROUTINEB30$: BGCK$A BF.EXE,BE.STK,DIRECT ;;;SETTUP THE ERROR CODES FOR A ;;;STACK OVERFLOWK  .DSABL LSBT;+$; **-SSTXT-COMMON SST EXIT ROUTINE;SJ; CONTROL IS TRANSFERED TO THIS ROUTINE TO EFFECT AN SST. IF THE CURRENTK; STACK DEPTH IS NOT ZERO, THEN THE SYSTEM IS CRASHED. ELSE AN ATTEMPT ISII; MADE TO EFFECT AN SST FOR THE CURRENT TASK. IF THE TASK DOES NOT HAVESL; AN APPROPRIATE SST VECTOR ENTRY OR A PUSH OF THE SST PARAMETERS ONTO THEI; TASK STACK CANNOT BE EFFECTED, THEN THE TASK IS ABORTED. ELSE THE SSTT.; IS SETUP AND A DIRECTIVE EXIT IS EXECUTED.;F; INPUTS: (MAPPED SYSTEM); %; 24(SP)=PS WORD SAVED BY SST TRAP.%; 22(SP)=PC WORD SAVED BY SST TRAP.N; 20(SP)=SAVED R5.; 16(SP)=SAVED R4.; 14(SP)=SAVED R3.; 12(SP)=SAVED R2.; 10(SP)=SAVED R1.; 06(SP)=SAVED R0.D; 04(SP)=SST PARAMETER (ZERO OR MORE PARAMETERS MAY BE SPECIFIED).; 02(SP)=SST CODE.:; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO USER STACK.; ; R3 - BUGCHECK ERROR CODE;E ; OUTPUTS:;H; AN ATTEMPT IS MADE TO EFFECT THE SPECIFIED SST FOR THE CURRENT TASK.;-  .ENABL LSBP2SSTXT: MOV $SAHPT,R5 ;GET ADDRESS OF TASK HEADER3 CMP #-1,$STKDP ;FAULT OCCUR AT STACK DEPTH ZERO?. BNE 7$ ;IF NE NO) MOV SP,R1 ;COPY CURRENT STACK POINTER.6 ADD (SP),R1 ;ADD NUMBER OF BYTES TO BE TRANSFERRED& MOV 16(R1),R0 ;GET FAULT PC ADDRESS7 CMP R0,#$DRLM1 ;FAULT OCCUR IN DIRECTIVE DISPATCHER?S BLO 3$ ;IF LO NO7 CMP R0,#$DRLM2 ;FAULT OCCUR IN DIRECTIVE DISPATCHER? BHI 3$ ;IF HI NO ; BM377E .IF DF D$$PAR ; BM377 ; BM377S> CMP KINAR5,$DRAPR ;YES, BUT DID THE FAULT OCCUR IN ; BM3771 ;THE DIRECTIVE DISPATCHER? (IS THE ; BM377/ ;FIRST DIRECTIVE COMMON MAPPED?) ; BM377T  BNE 3$ ;IF NE NO ; BM377 ; BM377E" .ENDC ; DF D$$PAR ; BM377 ; BM377C JMP 90$ ;YES3$:R .IF DF D$$PAR3 CMP KINAR5,$DRAP2 ;2ND DIRECTIVE COMMON MAPPED ?O. BNE 7$ ;IF NE NO, CAN'T HAVE BEEN IN DRQIO .ENDC ; DF D$$PAR0 CMP R0,#$DQLM1 ;TRAP OCCUR IN QIO DIRECTIVE ? BLO 7$ ;IF LO NO0 CMP R0,#$DQLM2 ;FAULT OCCUR IN QIO DIRECTIVE?  BLOS 90$ ;IF LOS YES$ 7$: TST $STKDP ;STACK DEPTH ZERO?*  BNE 60$ ;IF NE NO - FATAL SYSTEM ERROR   .IF DF S$$LIB) MOV SP,R1 ;COPY CURRENT STACK POINTER;5 ADD (SP),R1 ;ADD NUMBER OF BYTES TO BE TRANSFERED& MOV 16(R1),R0 ;GET FAULT PC ADDRESS: CMP R0,#$DSLM1 ;FAULT OCCUR IN CSM INSTRUCTION EMULATE? BLO 8$ ;IF LO NO: CMP R0,#$DSLM2 ;FAULT OCCUR IN CSM INSTRUCTION EMULATE? BHI 8$ ;IF HI NO( BIT #PMODE,PS ;PREVIOUS MODE KERNEL ?4 BEQ 100$ ;IF EQ YES, - EXCEPTION IN CSM EMULATOR8$: ;REFERENCE LABELD .ENDC ;DF S$$LIBI ! .IF DF P$$D70")# CLR @$CPUER ;CLEAR CPU ERROR REGISTERN$% .IF NDF M$$EXTD& ' NOP ;THIS NOP MUST BE HERE.'( ;UNLESS THE MICRO CODE BUG IN THEC() ;11/60 IS FIXED (ECO M7872-00007),&* ;CLEARING THE CPU ERROR REGISTER*+ ;WILL CAUSE THIS WORD TO BE SKIPPED.,- .ENDC./0 .ENDC12.3 CLR $TEMP0 ;INDICATE USE NORMAL ABORT CODE4-5$CNBPT:: ;ENTRY POINT FROM BOM$ DIRECTIVET67%8 MOV R5,R4 ;COPY ADDRESS OF HEADERF59 ADD #H.ODVA,R4 ;POINT TO ODT SST VECTOR DESCRIPTORC+: MFPI SP ;GET CURRENT TASK STACK POINTER(; CALL 10$ ;SST ADDRESS IN ODT VECTOR?.< MOV #80$,-(SP) ;SST ADDRESS IN TASK VECTOR?1=10$: MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADER*> MOV (R4)+,R3 ;GET ADDRESS OF SST VECTOR,? BEQ 20$ ;IF EQ NO VECTOR THIS DESCRIPTOR@AB .IF DF S$$LIBC2D BIS #PMODE,PS ;ASSUME SST HANDLED IN USER STATE/E BIT #1,R3 ;AST HANDLED IN SUPERVISOR STATE?F BEQ 15$ ;IF EQ NOC:G BIC #^CPSMODE&PMODE,PS ;SET00xNxtcccc PREVIOUS MODE TO SUPERVISOR'H DEC R3 ;REMOVE SUPERVISOR MODE FLAGEIJ .ENDCKL6M15$: CMP 6(SP),(R4) ;VECTOR LONG ENOUGH TO COVER SSTN BHIS 20$ ;IF HIS NOK"O MOV R3,R0 ;COPY VECTOR ADDRESS.P MOV #2,R1 ;TWO BYTE SIZE FOR ADDRESS CHECK2Q ADD 6(SP),R3 ;POINT TO APPROPRIATE VECTOR ENTRY+R CALL $ACHRO ;CHECK FOR READ ONLY ACCESS,S BCS 20$ ;IF CS VECTOR ELEMENT IS INVALID*T MFPD$ (R3) ;GET ADDRESS OF SST ROUTINEU MOV (SP)+,R3 ;1$V BNE 30$ ;IF NE SST ROUTINE FOUND2W20$: TST (R4)+ ;POINT TO NEXT VECTOR DESCRIPTOR X RETURN ; (Y30$: TST (SP)+ ;REMOVE RETURN ADDRESS5Z MOV 2(SP),R1 ;GET NUMBER OF BYTES TO BE TRANSFERED +[ SUB R1,(SP) ;CALCULATE NEW TOP OF STACKA.\ MOV (SP),R0 ;COPY NEW TOP OF STACK ADDRESS+] MTPI SP ;RESTORE NEW TASK STACK POINTER 3^ CALL $ACHCK ;ADDRESS CHECK PUSH ONTO TASK STACKC(_ BCS 70$ ;IF CS ADDRESS CHECK FAILURE`a .IF DF X$$HDRb6c MOV -(R4),$TEMP0 ;SAVE SST ADDRESS FROM TASK HEADERde .ENDC ; DF X$$HDRf/g CALL $RELOM ;RELOCATE AND MAP STACK ADDRESSR0h MOV (SP)+,R1 ;GET NUMBER OF BYTES TO TRANSFER7i CMP -(R1),-(R1) ;ADJUST BY 4 BYTES (PS AND PC WORDS)S!j ASR R1 ;CONVERT TO WORD COUNTN)k TST (SP)+ ;REMOVE SST CODE FROM STACK 0l40$: DEC R1 ;ANY MORE PARAMETERS TO TRANSFER?m BLT 50$ ;IF LT NOL4n MOV (SP)+,(R0)+ ;TRANSFER PARAMETER TO TASK STACK o BR 40$ ;,p50$: MOV #$UMPC,R1 ;POINT TO SAVED PC WORD0q MOV (R1),(R0)+ ;SAVE PC AT TRAP ON USER STACK r MOV R3,(R1)+ ;SET SST PC WORD/s MOV (R1),(R0) ;SAVE PS AT TRAP ON USER STACKS)t MOV #CMODE!PMODE,(R1) ;SET SST PS WORD uvw .IF DF S$$LIBxyz .IF DF X$$HDR{/| BIT #1,$TEMP0 ;SUPERVISOR MODE SST ROUTINE ?}~ .IFF ; DF X$$HDRO. BIT #1,-(R4) ;SUPERVISOR MODE SST ROUTINE ? .ENDC ; DF X$$HDR BEQ 55$ ;IF EQ NO0- TSTB $SUPFL ;LINKED TO SUPER MODE LIBRARY & BEQ 55$ ;IF EQ NO, FORCE USER MODE= BIC #^CCSMODE&CMODE,(R1) ;SET RETURN PS WORD TO SUPER MODEM+ TST (R0) ;WAS PREVIOUS MODE SUPERVISOR?) BMI 54$ ;IF MI NOE< BIC #^CPSMODE&PMODE,(R1) ;SET PREVIOUS MODE TO SUPERVISOR54$: ;REFERENCE LABEL .ENDC55$: RETURN ;EXIT FROM TRAPS; 8; SST FAULT AT NON ZERO STACK DEPTH-FATAL SYSTEM ERROR;O260$: BGCK$R #BF.EXE,R3,FATAL;BUGCHECK THE SYSTEM& ;FACILITY IS GENERAL EXEC ERROR.  ;THE ERROR CODE IS FOR THE ;SST CAUSING THE PROBLEM.B;O4; SST CANNOT BE EFFECTED BECAUSE OF BAD TASK STACK;0370$: MOV #S.CSST,R0 ;SET BAD STACK SST ABORT CODEE BR 81$ ;ABORT TASK;T9; SST CANNOT BE EFFECTED BECAUSE OF NO SST VECTOR ENTRY;.'80$: MOV 4(SP),R0 ;SET SST ABORT CODES+ TST $TEMP0 ;IS THERE A BOM$ ABORT CODE?E BEQ 81$ ;IF EQ NO, OK AS IS- MOV $TEMP0,R0 ;USE BOM$ ERROR CODE INSTEADT381$: MOV #$STACK-22,SP ;RELOAD EXEC STACK POINTERE(85$: CALLR $ABCTK ;ABORT CURRENT TASK;L1; FAULT FROM PROTECTED LIMITS IN DRDSP OR DRQIOO; 90$: .IF DF P$$D70) CLR @$CPUER ;CLEAR CPU ERROR REGISTER  .IF NDF M$$EXT  NOP ;THIS NOP MUST BE HERE.' ;UNLESS THE MICRO CODE BUG IN THEV( ;11/60 IS FIXED (ECO M7872-00007),& ;CLEARING THE CPU ERROR REGISTER* ;WILL CAUSE THIS WORD TO BE SKIPPED. .ENDC .ENDC- INC $STKDP ;CORRECT STACK DEPTH INDICATORE/ MOV 20(R1),PS ;RESTORE CORRECT PREVIOUS MODE& DRSTS D.RS98 ;SET DIRECTIVE STATUS;I<; FAULT FROM PROTECTED LIMITS IN CSM INSTRUCTION EMULATION; ); AT THIS POINT THE STACK IS AS FOLLOWSM;.; 0(SP) - NUMBER OF BYTES TO BE TRANSFERRED; . ; SST PARAMETERS; .1'; 0(R1) - RETURN POINTER TO $DIRXTC!; 2(R1) - SAVED R0 FROM TRAP ; 4(R1) - SAVED R1O; 6(R1) - SAVED R2C; 10(R1) - SAVED R3; 12(R1) - SAVED R4C; 14(R1) - SAVED R5V; 16(R1) - SAVED PCC; 20(R1) - SAVED PSS; .;,; $STACK-6 - SAVED R0 DURING CSM EMULATION; $STACK-4 - PC OF CSM TRAPS00xxttt tfDATA; $STACK-2 - PS OF CSM TRAPT; 8; WE WILL CLEAN UP THE STACK AND MAKE IT LOOK AS IF WE; ENTERED THROUGH $DIRSV .IF DF S$$LIB100$: ! MTPS #PR7 ;DISABLE INTERRUPTS * MOV 14(R1),R5 ;;;RESTORE R5 FROM $DIRSV% MOV #$STACK-6,SP ;;;TRUNCATE STACKR% MOV (SP),R0 ;;;GET SAVED R0 VALUE MOV R5,(SP) ;;;SAVE R5" MOV 20(R1),R5 ;;;AND GET OLD PS8 BIC #^C,R5 ;;;CLEAR ALL BUT PREVOIUS MODE BITS- BIS R5,PS ;;;SET PREVIOUS MODE TO CORRECTA MOV R4,-(SP) ;;;SAVE R41 MOV SP,@$HEADR ;;;SAVE STACK POINTER IN HEADER / MOV 4(R1),R1 ;;;RESTORE ORIGINAL VALUE OF R1E MTPS #0 ;;;ALLOW INTERRUPTS$' MOV R3,-(SP) ;SAVE REST OF REGISTERSE  MOV R2,-(SP) ;TO MAKE IT LOOK" MOV R1,-(SP) ;LIKE A NORMAL SST MOV R0,-(SP) ;ENTRY TO THEM MOV #$DIRXT,-(SP) ;EXECUTIVE+ MOV #S.CCSM,R0 ;SET BAD STACK ABORT CODE5 BR 85$ ;ABORT CURRENT TASK .ENDC ;DF S$$LIB   .DSABL LSB .END ;;;SET PREVIOUS MODE TO CORRECTA MOV R4,-(SP) ;;;SAVE .TITLE DRCRVK .IDENT /03.03/M;RD; COPYRIGHT (c) 1982, 1983, 1985 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;O; MODIFIED FOR M-PLUS V2.0 BY:;V; J. M. LAWLER; T. M. MARTIN; D. R. DONCHINA+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY: ;R; J. R. KAUFFMAN;W; MODIFIED BY:;R ; B. S. MCCARTHY 30-MAY-84 03.02;V5; BM309 -- REMOVE REFERENCES TO $HEADR TO STREAMLINE ;. ; L. B. MCCULLEY 12-FEB-85 03.03; +; LBM004 -- CHANGE SPM HOOKPOINT MECHANISML;IE; THIS MODULE CONTAINS THE DIRECTIVE ROUTINES AND PRIMARY SUBROUTINESY1; WHICH PROVIDE PARENT-OFFSPRING TASKING SUPPORT.E; ; MACRO LIBRARY CALLS ;I* .MCALL ABODF$,DCBDF$,HDRDF$,TCBDF$,UCBDF$ .  ABODF$ ;DEFINE ABORT CODESI. DCBDF$ ;DEFINE DEVICE CONTROL BLOCK SYMBOLS% HDRDF$ ;DEFINE TASK HEADER SYMBOLS , TCBDF$ ;DEFINE TASK CONTROL BLOCK SYMBOLS9 UCBDF$ ,,TTDEF,SYSDEF ;DEFINE UNIT CONTROL BLOCK SYMBOLSC;Y; LOCAL SYMBOL DEFINITIONS;  C"D$LGTH=D.PCB+2 ;LENGTH OF VT DCB(U$LGTH=U.PTCB+2-U.UAB ;LENGTH OF VT UCB ;+(; **-$DRCRV-CREATE VIRTUAL TERMINAL UNIT;OB; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE A VIRTUAL TERMINAL-; UNIT AND RETURN THE UNIT NUMBER IN THE DSW.A;F ; DPB FORMAT:R;O#; WD. 00 -- DIC(149.),DPB SIZE(5.).L&; WD. 01 -- INPUT AST ROUTINE ADDRESS.'; WD. 02 -- OUTPUT AST ROUTINE ADDRESS.N'; WD. 03 -- ATTACH AST ROUTINE ADDRESS.F*; WD. 04 -- MAXIMUM ALLOWED BUFFER LENGTH.;O ; INPUTS:D;N@; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.:; R3=ADDRESS OF THE MAXIMUM BUFFER LENGTH WORD IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.T,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;D5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)R;O-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.17; NUMBER OF CREATED VIRTUAL TERMINAL UNIT IS RETURNED.U; C=1 IF DIRECTIVE IS REJECTED.H;; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF AN ALLOCATIONN; FAILURE OCCURS.9; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE VIRTUALE"; TERMINAL DRIVER IS NOT LOADED.;- L .IF DF V$$TRM P9$DRCRV::TST $VTDCB+D.DSP ;VIRTUAL TERMINAL DRIVER LOADED?A BEQ 100$ ;IF EQ NO4 MOV #D$LGTH+U$LGTH,R1 ;PICK UP SIZE OF VT DATA BASE$ CALL $ALOCB ;ALLOCATE VT DATA BASE# BCS 90$ ;IF CS ALLOCATION FAILURE MOV R0,R1 ;SAVE POINTER TO DCB, MOV #$VTDCB,R2 ;POINT TO DATA BASE FOR VT0:/20$: MOV (R2)+,(R0)+ ;COPY WORD OF VT DATA BASEU. CMP R2,#$VTDCB+D$LGTH+U$LGTH ;DONE WITH COPY? BLO 20$ ;IF LO NO'1 SUB #U$LGTH+U.UAB,R0 ;POINT BACK TO START OF UCBI) MOV R0,D.UCB(R1) ;SET UCB POINTER IN DCBM- MOV R1,(R0) ;SET DCB POINTER IN UCB (U.DCB)L5 MOV R0,U.RED(R0) ;SET UP REDIRECTION POINTER (U.RED)L3 BIT #T3.PRV,T.ST3(R5) ;IS ISSUING TASK PRIVILEGED?A BEQ 30$ ;IF EQ NO8 BIS #U2.PRV,U.CW2(R0) ;MAKE VIRTUAL TERMINAL PRIVILEGED630$: ADD #U.IAST,R0 ;POINT TO PARENT INPUT AST ADDRESS  : .IF DF S$$LIB O00xNxtcccc. MOV (R3)+,R2 ;GET SPECIFIED INPUT AST ADDRESS( CALL $CALTA ;CALCULATE CORRECT ADDRESS- MOV R2,(R0)+ ;SET INPUT AST ADDRESS (U.IAST)T/ MOV (R3)+,R2 ;GET SPECIFIED OUTPUT AST ADDRESSC( CALL $CALTA ;CALCULATE CORRECT ADDRESS. MOV R2,(R0)+ ;SET OUTPUT AST ADDRESS (U.OAST)/ MOV (R3)+,R2 ;GET SPECIFIED ATTACH AST ADDRESSI( CALL $CALTA ;CALCULATE CORRECT ADDRESS. MOV R2,(R0)+ ;SET ATTACH AST ADDRESS (U.AAST) V .IFF :0 MOV (R3)+,(R0)+ ;SET INPUT AST ADDRESS (U.IAST)1 MOV (R3)+,(R0)+ ;SET OUTPUT AST ADDRESS (U.OAST)E1 MOV (R3)+,(R0)+ ;SET ATTACH AST ADDRESS (U.AAST)C E .ENDC  V5 MOV H.DUIC(R4),(R0)+ ;INITIALIZE DEFAULT UIC (U.UIC)R. MOV R5,(R0) ;SET PARENT TCB ADDRESS (U.PTCB). MOV (R3),R2 ;PICK UP SPECIFIED BUFFER LENGTH" BEQ 40$ ;IF EQ STAY WITH DEFAULT- MOV R2,U.CW4-U.PTCB(R0) ;STORE BUFFER LENGTHC& CMP R2,#V$$TLM ;GREATER THAN MAXIMUM? BLOS 40$ ;IF LOS NOC= BIS #U3.DBF,U.CW3-U.PTCB(R0) ;DISABLE INTERMEDIATE BUFFERINGN*40$: MOV #$VTDCB,R0 ;POINT TO DCB FOR VT0:-60$: MOV R0,R2 ;COPY POINTER TO PREVIOUS DCB0 MOV (R0),R0 ;POINT TO NEXT DCB7 ADD #401,D.UNIT(R1) ;ADVANCE LOW AND HIGH UNIT NUMBERS 8 CMP D.NAM(R0),#"VT ;IS NEXT DCB FOR A VIRTUAL TERMINAL? BNE 70$ ;IF NE NO,< CMP D.UNIT(R1),D.UNIT(R0) ;IS IT THE NEXT CONSECUTIVE UNIT? BEQ 60$ ;IF EQ YES,70$: MOV R0,(R1) ;LINK NEW UNIT TO THIS ONE, MOV R1,(R2) ;LINK PREVIOUS UNIT TO NEW ONE6 MOVB D.UNIT(R1),2(SP) ;SET UNIT NUMBER IN STATUS WORD;+; ** W A R N I N G **#;D; SPM HOOKPOINT NUMBER 23.;0); DO NOT CHANGE THE INSTRUCTION FOLLOWING0; LABEL WITHOUT CHECKING SPM;-+$SPH23==. ;SPM CHANGES THE INSTRUCTION ATI ;THE LOCATION OF THIS LABELI' INC T.RDCT(R5) ;INC TASK RUNDOWN COUNT$ RETURN ;D%90$: DRSTS D.RS1 ;ALLOCATION FAILUREN6100$: DRSTS D.RS6 ;VIRTUAL TERMINAL DRIVER NOT LOADED N;++; **-$DRELV-ELIMINATE VIRTUAL TERMINAL UNITO;U@; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ELIMINATE THE SPECIFIED; VIRTUAL TERMINAL UNIT.;* ; DPB FORMAT:O;O#; WD. 00 -- DIC(151.),DPB SIZE(2.).H); WD. 01 -- VIRTUAL TERMINAL UNIT NUMBER.H;I ; INPUTS:;S@; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.<; R3=ADDRESS OF THE VIRTUAL TERMINAL UNIT NUMBER IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.R,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;O5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)L;I-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.O(; DIRECTIVE STATUS OF '+1' IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.7; DIRECTIVE STATUS OF 'D.RS92' RETURNED IF THE ISSUING -; TASK DID NOT CREATE THE SPECIFIED VIRTUAL2; TERMINAL UNIT.;- .ENABL LSBF;$DRELV::MOV #$VTDCB,R0 ;POINT TO FIRST VIRTUAL TERMINAL DCB 610$: CMPB D.UNIT(R0),(R3) ;IS THIS THE SPECIFIED UNIT? BEQ 30$ ;IF EQ YES1 MOV (R0),R0 ;POINT TO NEXT VIRTUAL TERMINAL DCB:2 CMP D.NAM(R0),#"VT ;IS IT A VIRTUAL TERMINAL DCB? BEQ 10$ ;IF EQ YES120$: DRSTS D.RS92 ;INVALID VIRTUAL TERMINAL UNIT 430$: MOV D.UCB(R0),R0 ;POINT TO VIRTUAL TERMINAL UCB/ CMP U.PTCB(R0),R5 ;IS ISSUING TASK THE PARENT?  BNE 20$ ;IF NE NO, ILLEGAL C;++; **-$ELMVT-ELIMINATE VIRTUAL TERMINAL UNITB;SE; THIS ROUTINE ELIMINATES THE SPECIFIED VIRTUAL TERMINAL UNIT CREATEDC; BY THE CURRENT TASK.;S ; INPUTS:I;U6; R0=UCB ADDRESS OF VIRTUAL TERMINAL UNIT TO ELIMINATE;R ; OUTPUTS:;C=; ANY LUNS WHICH THE CURRENT TASK HAS ASSIGNED TO THE VIRTUAL$?; TERMINAL UNIT ARE DEASSIGNED. IF THERE ARE ANY ACTIVE TASK'S?; WHOSE TI: IS THE VIRTUAL TERMINAL UNIT BEING ELIMINATED, THEY(>; ARE ABORTED. AT THIS POINT AN ATTEMPT IS MADE TO ALLOCATE A?; COMMAND LINE TO MCR TO PERFORM ANY NECESSARY CLEANUP REQUIREDH?; BY THE VIRTUAL TERMINAL. IF THE COMMAND LINE CANNOT BE ALLO-C?; CATED, THE CURRENT TASK IS FORCED INTO A WAIT FOR SIGNIFICANT A; EVENT. (THE PC IS BACKED UP IN CASE THIS IS A ELVT$ DIRECTIVE.W@; IF THE TASK IS EXITING, THE PC DOESN'T MATTER.) WHEN THE COM-B; MAND LINE IS SUCCESSFULLY QUEUED, THE UNIT IS MARKED FOR DEALLO-=; CATION AND THE CURRENT TASK'S RUNDOWN COUN00xxttt tfDATAT IS DECREMENTED..@; SINCE A COMMAND LINE IS ALWAYS QUEUED, $DEAVT CANNOT BE CALLED; IMMEDIATELY.;- C$ELMVT::SAVNR ;SAVE R4 AND R5E MOV R0,R5 ;SAVE UCB ADDRESSA3 CALL $CVTLN ;CLEAR OUT VIRTUAL TERMINAL LUN WORDSS- TSTB U.OCNT(R0) ;ANY OFFSPRING STILL ACTIVE? # BEQ 85$ ;IF EQ NO, ELIMINATE UNITA;VE; AT THIS POINT THE STD IS SEARCHED FOR ANY ACTIVE TASKS WHOSE TI: IS D; THE VIRTUAL TERMINAL BEING ELIMINATED. THE STD IS SCANNED INSTEADH; OF THE ATL TO FIND ANY TASKS WHICH ARE IN THE PROCESS OF BEING LOADED,7; THUS TS.EXE IS CLEAR BUT THEY ARE NOT YET IN THE ATL.A;D0 MOV $TSKHD,R1 ;POINT TO FIRST TASK IN TASK LIST>70$: MOV T.TCBL(R1),-(SP) ;PUSH POINTER TO NEXT INSTALLED TASK* BEQ 80$ ;IF EQ CURRENT TASK IS NULL TASK TST T.STAT(R1) ;TASK ACTIVE?E BMI 80$ ;IF MI NON* CMP T.UCB(R1),R5 ;OFFSPRING OF THIS UNIT? BNE 80$ ;IF NE NON4 BIT #T3.PRV!T3.SLV,T.ST3(R1) ;NO ABORT BECAUSE TASK ;PRIVILEGED OR SLAVE?S BNE 80$ ;IF NE YES' TSTB T.ST2(R1) ;TASK ALREADY EXITTING?  BMI 80$ ;IF MI YES$ MOV #S.CELV,R0 ;SET TKTN ABORT CODE CALL $ABTSK ;ABORT THE TASKV/80$: MOV (SP)+,R1 ;RESTORE POINTER TO NEXT TASK: BNE 70$ ;IF NE THERE IS ONEN/85$: CLR U.PTCB(R5) ;MARK UNIT FOR DEALLOCATIONE0 MOV $TKTCB,R3 ;PICK UP CURRENT TASK TCB ADDRESS, DEC T.RDCT(R3) ;REDUCE TASK'S RUNDOWN COUNT# CLR R1 ;SET STATUS TO REQUEST BYE  MOV R5,R2 ;SET UCB ADDRESS" CALL $QCNTP ;QUEUE A BYE COMMAND$ BEQ 90$ ;IF CC-Z SET THEN NO ERROR5 SUB #2,$UMPC ;BACKUP USER PC TO RE-EXECUTE DIRECTIVEI2 CALLR $TKWSE ;FORCE TASK INTO WAIT FOR SIG EVENT/90$: MOV U.RPKT(R5),R0 ;GET INPUT (READ) PACKET+- BIS U.WPKT(R5),R0 ;GET OUTPUT (WRITE) PACKETI! BNE 160$ ;IF NE I/O IN PROGRESS(3 BICB #US.BSY,U.STS(R5) ;MAKE SURE UNIT IS NOT BUSYK, CALLR $IOKIL ;INSURE PROPAGATION OF DRIVER D;+,; **-$DEAVT-DEALLOCATE VIRTUAL TERMINAL UNIT;UB; THIS ROUTINE UNLINKS THE SPECIFIED VIRTUAL TERMINAL UNIT CONTROL4; BLOCKS FROM THE DEVICE LISTS AND DEALLOCATES THEM.;P ; INPUTS:S;P7; R0=ADDRESS OF VIRTUAL TERMINAL UNIT UCB TO DEALLOCATET;A ; OUTPUTS:;T8; THE VIRTUAL TERMINAL UNIT IS UNLINKED AND DEALLOCATED.;- 5;$DEAVT::MOV (R0),R0 ;POINT TO VIRTUAL TERMINAL DCB (U.DCB)O S;+; ** W A R N I N G ** ;K; SPM HOOKPOINT NUMBER 24.;R); DO NOT CHANGE THE INSTRUCTION FOLLOWING; LABEL WITHOUT CHECKING SPM;-+$SPH24==. ;SPM CHANGES THE INSTRUCTION ATS ;THE LOCATION OF THIS LABELN4 MOV #$VTDCB,R1 ;POINT TO FIRST VIRTUAL TERMINAL DCB(100$: CMP (R1),R0 ;NEXT UNIT SPECIFIED? BEQ 110$ ;IF EQ YES 1 MOV (R1),R1 ;POINT TO NEXT VIRTUAL TERMINAL DCBE BR 100$ ;S110$: MOV (R0),(R1) ;UNLINK DCB5. MOV #D$LGTH+U$LGTH,R1 ;SET SIZE TO DEALLOCATE* CALLR $DEACB ;DEALLOCATE DATA STRUCTURES ;+,; **-$CVTLN-CLEAR VIRTUAL TERMINAL LUN WORDS;HD; THIS ROUTINE IS CALLED TO CLEAR (DEASSIGN) ANY LUN ENTRIES FOR THEA; CURRENT TASK WHICH POINT TO THE SPECIFIED VIRTUAL TERMINAL UCB.E; ; INPUTS:D;R!; R0=VIRTUAL TERMINAL UCB ADDRESSD; ; OUTPUTS:;R; R0 AND R3 ARE PRESERVED.;- $CVTLN:: .IF DF X$$HDR, MOV KISAR6,-(SP) ;SAVE CURRENT APR6 MAPPING/ MOV $SAHDB,KISAR6 ;MAP NONRESIDENT TASK HEADERH .ENDC ; DF X$$HDR" MOV $SAHPT,R1 ;GET HEADER ADDRESS7 ADD #H.NLUN,R1 ;POINT TO NUMBER OF LUNS WORD IN HEADERM% MOV (R1)+,R2 ;PICK UP NUMBER OF LUNSA120$: DEC R2 ;ANY MORE LUNS?N BLT 150$ ;IF LT NO0 CMP (R1),R0 ;LUN ASSIGNED TO ELIMINATING UNIT? BNE 130$ ;IF NE NO CLR (R1) ;DEASSIGN LUN(130$: CMP (R1)+,(R1)+ ;POINT TO NEXT LUN BR 120$ ;R150$: ;REFERENCE LABELN .IF DF X$$HDR' MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPINGM .ENDC160$: RETURN ; O .ENDC A H .END .ENDC ; DF X$$HDR" MOV $SAHPT,R1 ;GET HEADER ADDRESS7 ADD #H.NLUN,R1 ;POINT TO NUMBER OF LUNS WORD IN HEADERM% MOV (R1)+,R2 ;PICK UP NUMBER OF LUNSA120$: DEC R2 ;ANY MORE LUNS?N BLT 150$ ;IF LT NO0 CMP (R1),R0 ;LUN ASSIGNED TO ELIMINATING UNIT? BNE 130$ ;IF NE NO CLR (R1) ;DEASSIGN LUN(130$: CMP (R1)+,(R1)+ ;POINT TO NEXT LUN BR 120$ ;R150$: 00xNxtcccc .TITLE LOADRP .IDENT /12.05/G; 1; COPYRIGHT (C) 1987 BY DIGITAL EQUIPMENT CORP.#; ALL RIGHTS RESERVED.;> ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; MODIFIED FOR M-PLUS V2.0 BY: ;; D. R. DONCHIN ; M. S. FOXN; J. M. LAWLER; T. M. MARTIN; B. S. MCCARTHY;H&; MODIFIED FOR RSX-11M-PLUS V2.1 BY:;B; J. R. KAUFFMAN; J. M. LAWLER; B. S. MCCARTHY;L&; MODIFIED FOR RSX-11M-PLUS V3.0 BY:; ; J. M. LAWLER 25-MAY-84 11.06!; B. S. MCCARTHY 3-JUL-84 11.07S"; L. B. MCCULLEY 12-FEB-85 11.08 ; J. W. BERZLE 12-APR-85 11.09 ; G. N. LARSEN 20-MAY-85 11.10;E&; MODIFIED FOR RSX-11M-PLUS V4.0 BY:;O'; C. A. SILVER 13-MAR-86 11.13 CAS021R.; Clear fast map pointer in task header for#; tasks without fast map support;%; K. L. NOEL 11-DEC-86 11.14 KLN0280; Create external header for run-time binding ; of LUNS;(; L. B. MCCULLEY 5-FEB-87 11.14 LBM0615; Deferred binding of task header (LUT and address32; windows) to system at load instead of install;.); L. B. MCCULLEY 17-MAR-87 11.15 LBM076N; Fix problem with LBM061;D(; L. B. MCCULLEY 8-MAY-87 11.16 LBM084:; Fix problem in LBM061 if unit not on first device DCB;t'; D. P. RABAHY 19-FEB-87 12.00 DPR040a.; Pass load & checkpoint requests to CPRSYS;2&; K. L. NOEL 28-MAY-87 12.01 KLN050<; Change LUT extension to not include number of luns word; &; D. P. RABAHY 8-JUN-87 12.02 DPR042; Support external header;s(; B. S. MCCARTHY 12-JUN-87 12.03 BM401/; Fix order of SUB,SBC in block number calc.;x$; K. L. NOEL 1-JUL-87 12.04 KLN057;; Fix loading of tasks with no luns for run time binding ;n'; D. P. RABAHY 21-JUL-87 12.05 DPR045A; Get TCB before DREXTa; 9;d5:; TASK TO LOAD AND CHECKPOINT ALL NONRESIDENT TASKS ;;Y<; MACRO LIBRARY CALLSa=;U>B> .MCALL ABODF$, CPRDF$, HDRDF$, HWDDF$, PCBDF$, TCBDF$ ;DPR040!@ .MCALL DIR$,WSIG$S ;**-1eB ;**-1s$C ABODF$ ;DEFINE TASK ABORT CODES6C CPRDF$ ;DEFINE SYMBOLS & OFFSETS FOR CPR ;DPR040'D HDRDF$ ;DEFINE TASK HEADER OFFSETS7&E HWDDF$ ;DEFINE HARDWARE REGISTERS3F PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS-.G TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETSHHMAP6= 140000 ;DPR040I;OJ; LOCAL DATAK;AL; READ/WRITE I/O DPBM; N$OLDRDP: .BYTE 3,12. ;DIC, DPB SIZE PLDRFC: .BLKW 1 ;FUNCTION CODEQ .BYTE 1 ;LUN 1R .BLKB 1 ;UNUSED BYTES .BYTE 1 ;EFN 1T .BLKB 1 ;UNUSED BYTE-U .WORD IOSB ;I/O STATUS DOUBLEWORD ADDRESST#V .WORD 0 ;NO AST SERVICE ROUTINEN=WLDRBF: .WORD 140000 ;BUFFER ADDRESS (ALWAYS MAP THRU APR6) XLDRLN: .BLKW 1 ;BUFFER LENGTHY .BLKW 1 ;(UNUSED)T&ZLDRBK: .BLKW 2 ;LBN OF I/O TRANSFER'[IOSB: .BLKW 2 ;I/O STATUS DOUBLEWORD\] .IF DF U$$DAS^,_ISIZE: .WORD 0 ;SIZE OF USER I SPACE LOAD,`IREL: .WORD 0 ;RELOCATION BIAS OF I SPACE3aMUDPT: .WORD 0 ;POINTER TO D WINDOW INTO MU PART b ;FOR A MULTI-USER I/D TASKd .ENDC ;**-1f ;**-1Sg .IF DF X$$HDRh-iHDRDB: .WORD 0 ;APR BIAS OF CURRENT HEADER.jk .ENDC ; DF X$$HDRm ;**-1 n;+o; **-$LOADR-LOADER TASK p;HGq; THE LOADER TASK IS DRIVEN OFF A LIST OF PCB'S QUEUED TO ITS RECEIVE Ar; QUEUE IN PRIORITY ORDER. THE LOADER'S ACTION FOR EACH PCB IS:Bs; PRIMARILY DRIVEN BY THE TWO PCB STATUS BITS PS.CKP AND PS.OUT.It; SECONDARY INFORMATION WHICH DRIVES THE LOADER IS PASSED IN THE STATUS Eu; BITS PS.CKR, PS.COM, PS.FXD, AND PS.RON. BASICALLY THE LOADER IS8v; CALLED UPON TO PERFORM ONE OF THE FOLLOWING ACTIONS:w;AFx; 1. (PS.CKP=0,PS.OUT=0) INITIALIZE A TASK FOR EXECUTION WHICH IS9y; ALREADY IN MEMORY. (CURRENTLY FOR TRAX-11 USE ONLY.)TGz; 2. (PS.CKP=0,PS.OUT=1) PERFORM THE INITIAL LOAD OF A NONRESIDENTRB{; REGION. IF THE REGION IS A TASK REGION (PS.COM=0), INITIALIZE00xxttt tfDATA<|; ITS HEADER AND ATTACHMENT LIST. IF THE REGION IS A TASKB}; REGION WHICH IS NOT SIMPLY BEING FIXED (PS.FXD=0), CALL $BILDSB~; TO INITIALIZE THE TASK'S STACK AND PLACE IT IN THE ACTIVE TASKB; LIST. IF THE REGION BEING LOADED ALREADY HAS A PENDING CHECK-C; POINT REQUEST (PS.CKR=1), INITIATE THE CHECKPOINT OF THE REGION ; BY CALLING $ICHKP.H; 3. (PS.CKP=1,PS.OUT=0) WRITE A CHECKPOINT IMAGE OF THE REGION OUTD; TO DISK, FREE ITS MEMORY, AND CONDITIONALLY PLACE THE PCB IN THED; PARTITION WAIT QUEUE. IF THE REGION IS A TASK REGION (PS.COM=0)?; COPY ITS HEADER FROM THE POOL INTO THE IMAGE FIRST. IF THELC; REGION IS A READ-ONLY COMMON (PS.RON=1), SIMPLY FREE ITS MEMORYK@; WITH NO I/O OPERATION. ALL PRIORITY ZERO COMMONS ARE QUEUED=; TO THE LOADR AS PRIORITY 251. COMMONS SO THAT THEY CAN BEE<; CHECKPOINTED OUT IMMEDIATELY. THEIR CORRECT PRIORITY IS; RE-CALCULATED BY THE LOADR. H; 4. (PS.CKP=1,PS.OUT=1) READ THE CHECKPOINT IMAGE OF A REGION BACKB; INTO MEMORY. IF THE REGION BEING LOADED ALREADY HAS A PENDINGA; CHECKPOINT REQUEST (PS.CKR=1), INITIATE THE CHECKPOINT OF THEI@; REGION BY CALLING $ICHKP. FOR INSTALLED COMMONS WITH PS.NWB>; SET, THE DISK PCB IS DEALLOCATED SO THAT THE COMMON IS NOT1; CHECKPOINTED TO ITS ORIGINAL TASK IMAGE FILE.M;-; 5; GET NEXT REQUEST FROM LOADER QUEUE (SYSTEM STATE)C;TI; HERE THE LOADER EXTRACTS THE NEXT PCB FROM ITS RECEIVE QUEUE OR STOPS1H; ITSELF IF THERE IS NO REQUEST. IF THE REQUEST IS THE INITIALIZATIONH; OF AN ALREADY LOADED TASK OR THE CHECKPOINT OF A READ-ONLY COMMON ORG; THE LOADING OF A REGION CREATED BY THE CREATE REGION DIRECTIVE, THEAJ; QIO PHASE IS BYPASSED HERE. IF THE REQUEST IS THE CHECKPOINT WRITE OF=; A TASK, ITS HEADER IS COPIED FROM THE POOL TO THE REGION.M;-$LOADR:: ;DPR0406 CALL $SWSTK, 31$ ;SWITCH TO SYSTEM STATE ;DPR0406 CLR $LDPCB ;INITIALLY CLEAR SAVED PCB WORD ;**-2, MOV $TKTCB,R0 ;PICK UP LOADER TCB ADDRESS, ADD #T.RCVL,R0 ;POINT TO RECEIVE LISTHEAD( CALL $QRMVF ;REMOVE ENTRY FROM QUEUE BCC 5$ ;IF CC GOT ONE  ;DPR040R= BIT #FE.MXT, $FMASK ;; NO WORK, SO STOP OR EXIT? ;DPR040P% BNE 4$ ;; IF NE, EXIT ;DPR040K CALLR $STPCT ;STOP FOR NOW34$: MOV $TKTCB, R5 ;; GET LOADER'S TCB ;DPR045% CALLR $DREXT ;; EXIT ;DPR040S ;DPR040S&5$: CLR IOSB ;INDICATE NO I/O ERROR3 MOV R1,R3 ;CALCULATE ADDRESS OF PCB STATUS WORD0;+; ** W A R N I N G **D;C;; SPM HOOKPOINT - LOADR CALLS DUMMY ROUTINE FOR HOOKPOINTR;M+; DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM;-+ CALL @$SPV02 ;CALL HOOKABLE ENTRY POINT; ADD #P.STAT,R3 ;8 BIT #PS.OUT!PS.CKP,(R3) ;INIT OF ALREADY LOADED TASK? BEQ 7$ ;IF EQ YES$ BIT #PS.COM,(R3) ;IS IT A COMMON? BEQ 13$ ;IF EQ NOS: BIT #P2.RON,2(R3) ;IS IT AN INSTALLED READ ONLY COMMON? BEQ 6$ ;IF EQ NO8 BIT #PS.OUT,(R3) ;CHECKPOINT OF THE READ ONLY COMMON?% BNE 13$ ;IF NE NO, MUST BE LOADEDT. BR 12$ ;BYPASS I/O ON CKP OUT OF RO COMMON-6$: TST P.DPCB(R1) ;LOAD OF CREATED REGION?I BNE 13$ ;IF NE NOL=7$: BIS #PS.OUT,(R3) ;SET ALREADY LOADED TASK OUT OF MEMORYR#12$: MOV R1,R4 ;COPY PCB ADDRESST$ MOV P.TCB(R4),R5 ;SET TCB ADDRESS& JMP 82$ ;JOIN AFTER I/O COMPLETION&13$: MOV R1,$LDPCB ;SAVE PCB ADDRESS5 BIT #PS.OUT!PS.COM,(R3) ;CHECKPOINT WRITE OF TASK? BNE 30$ ;IF NE NOB/ MOV P.HDR(R1),R3 ;GET ADDRESS OF TASK HEADERO .IF DF X$$HDR. BEQ 30$ ;IF EQ EXTERNAL HEADER, DON'T COPY .ENDC ; DF X$$HDR7 MOV P.REL(R1),KISAR6 ;SETUP TO ACCESS TASK PARTITIONL+ MOV P.TCB(R1),R2 ;POINT TO TCB ;**-4T5 ADD T.OFF(R2),KISAR6 ;ADD IN OFFSET TO TASK HEADERT ;**-2R5 MOV #140000,R2 ;SET ADDRESS BIAS OF TASK PARTITIONI5 MOV H.WND(R3),R4 ;POINT TO NUMBER OF WINDOW BLOCKSO) TST W.BLVR+2(R4) ;TASK MAPPED TO EXEC? BNE 15$ ;IF NE YES8 MOV H.DSW(R2),H.DSW(R3) ;COPY DSW TO REAL T00xNxtccccASK HEADER715$: MOV H.HDLN(R3),R4 ;GET LENGTH OF HEADER IN BYTES'! ASR R4 ;CONVERT TO WORD COUNT720$: MOV (R3)+,(R2)+ ;MOVE HEADER INTO TASK PARTITIONL# DEC R4 ;ANY MORE WORDS TO MOVE?  BGT 20$ ;IF GT YES%30$: RETURN ;RETURN TO TASK STATET; ,; PERFORM ACTUAL I/O TRANSFER (TASK STATE);TI; HERE THE LOADER SETS UP THE QIOW DPB AND PERFORMS THE ONE OR MORE I/OTH; TRANSFERS REQUIRED. AFTER SETTING UP THE I/O FUNCTION CODE AND BYTEI; COUNT THE LOADER MUST CALCULATE THE DISK ADDRESS AND UCB ADDRESS. IFEH; THERE IS A DISK PCB, THE LOADER CODE ASSUMES IT IS A CHECKPOINT PCB,J; AND THE DATA STRUCTURES ARE SUCH THAT THIS WORKS FOR COMMON TASK IMAGEG; FILE PCB'S AS WELL. OTHERWISE THE REQUEST MUST BE FOR A TASK TO ORTF; FROM ITS TASK IMAGE FILE. FOR AN INITIAL TASK LOAD THIS MEANS THE@; ADDRESS IN T.LBN. FOR A CHECKPOINT OPERATION THIS MEANS THEJ; ADDRESS AT T.LBN MINUS THE PARTITION SIZE (THE PREALLOCATED CHECKPOINT ; SPACE). ;RI; THE I/O TRANSFER IS SPECIFIED TO THE EXECUTIVE BY SPECIFYING A BUFFER H; ADDRESS OF 140000 AND LOADING UISAR6 WITH THE PHYSICAL MEMORY OFFSETJ; OF THE FIRST 32W BLOCK OF THE TRANSFER. THIS ALLOWS THE EXECUTIVE TOH; FIND THE CORRECT START ADDRESS VIA $RELOC. THE SIZE OF THE TRANSFERI; CAN BE ANYTHING SINCE THE EXECUTIVE DOES NOT ADDRESS CHECK PRIVILEGEDFF; TASKS. THE PROCESSOR PRIORITY IS RAISED TO PR7 TO INHIBIT CONTEXTI; SWITCHING BETWEEN THE LOADING OF UISAR6 AND THE EXECUTION OF THE QIOW/F; DIRECTIVE. THE PRIORITY ONLY REMAINS AT PR7 FOR SHORT INSTRUCTIONH; SEQUENCES AT TASK STATE IN THE LOADER, NATURALLY DROPPING TO PR0 ANDG; ALLOWING CONTEXT SWITCHING WHEN THE QIOW IS EXECUTED. ON RETURN TO B; LOADER FROM THE QIOW, HOWEVER, THE PRIORITY IS RETURNED TO PR7D; AUTOMATICALLY AND UISAR6 WILL BE RELOADED IF ANOTHER TRANSFER IS ; REQUIRED.K;H;31$: MOV $LDPCB, R4 ;RETRIEVE SAVED PCB ADDRESS ;DPR040 6 BEQ $LOADR ;IF EQ THERE WAS NONE, TRY AGAIN ;**-28 MOV P.TCB(R4),R5 ;GET TCB ADDRESS (IF TASK PARTITION)3 MOV R4,R3 ;CALCULATE ADDRESS OF PCB STATUS WORDT ADD #P.STAT,R3 ;T ;DPR0400 .IF DF C$$LDR ;DPR040I ;DPR040X9 BIT #F5.LDR, $FMSK5 ; REMOTE LOADER SUPPORT? ;DPR040T" BEQ 49$ ; IF EQ NO ;DPR040 ;DPR040A4 MOV P.DPCB(R4), R1 ; POINT TO DISK PCB ;DPR040. BEQ 40$ ; IF EQ THERE ISN'T ONE ;DPR0402 MOV P.UCB(R1), R1 ; SAVE UCB ADDRESS ;DPR040 BR 41$ ;DPR040A40$: MOV T.LDV(R5), R1 ; SAVE LOAD DEVICE UCB ADDRESS ;DPR040V41$: ;DPR040SA CMP #.LB0, R1 ; BOOT DEVICE INDICATES REMOTE REQUIRED ;DPR040, BNE 49$ ; IF NE, LOCAL DEVICE ;DPR040 ;DPR040R:42$: CALL $SWSTK, 48$ ; SWITCH TO SYSTEM STATE ;DPR040 ;DPR040@ MOV #< P$BLK+ 77>/ 100, R1 ;; ROUNDED SIZE OF PACKET ;DPR0409 CLR R0 ;; INDICATES IMMEDIATE RETURN DESIRED ;DPR0403 CALL $CPALO ;; GET BUFFER FROM CPRBUF ;DPR040B- BCC 43$ ;; RESOURCES AVAILABLE ;DPR040 : BIS #1, $UMPS ;; PROPAGATE STATUS TO USER-MODE ;DPR040 RETURN ;DPR040 43$: ;DPR040O9 MOV R0, KISAR6 ;; MAP NEWLY ALLOCATED PACKET ;DPR040;4 MOV #MAP6, R0 ;; BASE ADDRESS OF PACKET ;DPR040; ;DPR040/; LOAD HEADER & PARAMETER AREAS ;DPR040L; ;DPR040* CLRB H$ICNT(R0) ;; NO ITEMS ;DPR040 ;DPR040RH BIT #PS.OUT, P.STAT(R4) ;; IS THE REGION IN OR OUT OF MEMORY? ;DPR040) BNE 44$ ;; IF NE, IT'S OUT ;DPR040D= MOVB #HT$CKW, H$TYPE(R0) ;; MUST BE WRITE REQUEST ;DPR0400 BPT ;; [TBS] ;DPR04044$: ;DPR040: MOV P.REL(R4), P$ADDR(R0) ;; DESTINATION BIAS ;DPR0404 CLR P$ADDR+2(R0) ;; DESTINATION OFFSET ;DPR040 ;DPR040#XXX= PS.CKP!PS.COM ;DPR040 @ BIT #XXX, P.STAT(R4) ;; IS THIS CHECKPOINT OR COMMON? ;DPR0407 BEQ 46$ ;; IF EQ, NO - MUST BE A TASK LOAD ;DPR040R ;DPR040NB MOV P.DPCB(R4), R1 ;; GET DISK PARTITION CONTROL BLOCK ;DPR000yxttt tfDATA40' BNE 45$ ;; SANITY CHECK ;DPR040E BPT ;DPR04045$: ;DPR040D? MOVB #HT$CKR, H$TYPE(R0) ;; CHECKPOINT READ REQUEST ;DPR040 > MOV P.IID(R1), P$IID(R0) ;; USE COMMON IMAGE INDEX ;DPR040H MOV P.SIZE(R4), P$LEN(R0) ;; # OF 32. WORD BLOCKS TO TRANSFER ;DPR040? MOV P.LBN+2(R1), P$BLK(R0) ;; RELATIVE BLOCK NUMBER ;DPR0400 BR 47$ ;DPR04046$: ;DPR040 ; MOVB #HT$ILD, H$TYPE(R0) ;; IMAGE LOAD REQUEST ;DPR040 = MOV T.IID(R5), P$IID(R0) ;; USE TASK IMAGE INDEX ;DPR040E ;DPR040T@ ADD T.OFF(R5), P$ADDR(R0) ;; ADJUST DESTINATION BIAS ;DPR040 ;DPR040EP47$: CPSEN$ #SN$TSK,KISAR6,#P$BLK+2 ;; SEND PACKET TO CPRSYS VIA KXDRV ;DPR040 ;DPR040,+ MOV R0, KISAR6 ;; MAP PACKET ;DPR040R6 MOV MAP6+H$STAT, IOSB ;; PROPAGATE STATUS ;DPR040 ;DPR0406 CALLR $CPDEA ;; RELEASE THE CPRBUF SPACE ;DPR04048$: ;DPR040I6 BCS 42$ ; RESOURCE WAS LACKING, TRY AGAIN ;DPR0405 JMP 81$ ; CONTINUE WITH POST-PROCESSING ;DPR040449$: ;DPR040D" .ENDC ; DF C$$LDR ;DPR040 ;DPR040D* MOV #IO.RLB,LDRFC ;ASSUME READ FUNCTION. BIT #PS.OUT,(R3) ;CHECKPOINT WRITE REQUEST? BNE 50$ ;IF NE NOM(  MOV #IO.WLB,LDRFC ;SET WRITE FUNCTION 50$: ;DPR040;'  BIT #PS.COM,(R3) ;COMMON ? ;**-1   BEQ 501$ ;IF EQ, NO G  BIT #P2.LDD,P.ST2(R4) ;WAS LOAD DEVICE DISABLED/DISMOUNTED ? ;DPR0404! BNE 51$ ;IF NE, YES ;**-1A$ BR 52$ ;ELSE CONTINUE PROCESSING501$:R5 BIT #T4.LDD,T.ST4(R5) ;TASK LOAD DEVICE DISABLED ?;  BEQ 52$ ;IF EQ NO, ALL IS OK) BIT #PS.CKP,(R3) ;CHECKPOINT REQUEST ?R BEQ 51$ ;IF EQ NO, FAILURE5 BIT #T3.CAL,T.ST3(R5) ;CHECK POINT SPACE IN TASK ? BEQ 52$ ;IF EQ NO, IT'S OK+51$: MOVB #IE.PRI,IOSB ;FORCE I/O FAILUREC52$: ;DPR040-+ CLR R0 ;HIGH PORTION OF SIZE ;DPR040P7 MOV P.SIZE(R4),R1 ;ASSUME SIZE OF TRANSFER ;DPR040@  BIT #PS.CKP!PS.COM,(R3) ;CHECKPOINT REQUEST OR COMMON? ;**-8! BNE 55$ ;IF NE YES";LF#; THIS IS AN INITIAL TASK LOAD. SET SIZE FROM T.TKSZ, TASK LOAD SIZE+$; AND CLEAR FLAG INDICATING D SPACE TASK. %;>% MOV T.TKSZ(R5),R1 ;USE TASK TRANSFER SIZE INSTEAD ;DPR040%55$: ;DPR040B0% ASHC #6,R0 ;CONVERT TO BYTE COUNT ;DPR040.% MOV R0,R2 ;HIGH PORTION OF SIZE ;DPR040E% MOV R1,-(SP) ;OUT OF REGISTERS - USE STACK FOR LOW PORTION ;DPR040S% ;DPR040 *% MOV #LDRBK,R0 ;POINT TO LBN ;DPR040% ;DPR040M1> MOV P.DPCB(R4),R1 ;POINT TO DISK PCB ;**-24I ? BEQ 56$ ;IF EQ THERE IS NONE5@ MOV P.REL(R1),2(R0) ;GET RELATIVE POSITION IN FILEN'A MOV P.MAIN(R1),R1 ;POINT TO MAIN PCB,6B MOV P.LBN(R1),(R0)+ ;SET HIGH BITS OF BLOCK ADDRESS:C ADD P.LBN+2(R1),(R0) ;ADD LOW BITS TO RELATIVE POSITIOND ADC -(R0) ;PROPAGATE CARRY(E MOV P.UCB(R1),-(SP) ;SAVE UCB ADDRESS F BR 60$ ;;G56$: MOVB T.LBN(R5),(R0)+ ;SET HIGH BITS OF BLOCK ADDRESSH CLRB (R0)+ ;6I MOV T.LBN+1(R5),(R0) ;SET LOW BITS OF BLOCK ADDRESS4J MOV T.LDV(R5),-(SP) ;SAVE LOAD DEVICE UCB ADDRESS4K BIT #PS.CKP,(R3) ;IS THIS A CHECKPOINT OPERATION?LM .IF NDF U$$DASNO BEQ 60$ ;IF EQ NO PQ .IFF ; NDF U$$DASRS BNE 58$ ;IF NE YESTU;DFV; THIS IS AN INITIAL LOAD. IF THE TASK HAS USER INSTRUCTION AND DATAHW; SPACE ENABLED, ADJUST SO THAT THE FIRST LOAD GETS THE DATA SPACE IN.8X; THEN WE WILL LOCATE I SPACE THROUGH THE TASK HEADER.Y;RZ?[ BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D SPACES ?K\ BEQ 60$ ;IF EQ NOR0] DEC ISIZE ;AND INDICATE PARTIAL D SPACE LOAD^ BR 60$ ;REJOIN COMMON CODE_` .ENDC ; DF U$$DASa6b58$: MOV P.SIZE(R4),R1 ;PICK UP MAXIMUM SIZE OF TASK*c ADD #7,R1 ;ROUND UP TO NEXT 512. BLOCK'd ROR R1 ;CONVERT TO 512. WORD BLOCKSS e ASR R1 ; f ASR R1 ;gh .IF DF U$$DASi9k SUB T.ISIZ(R5),(R0) ;ADJUST BY SIZE OF I SPACE ;**-1 k SBC -2(R0) ; ; BM401 lm .ENDC ; DF U$$DASn3o SUB R1,(R0) ;CALCULATE STARTING LBN OF CKP00 yNxtcccc AREAEp SBC -(R0) ; p60$: ;DPR042 p; ;DPR042Sp; SINCE WE'RE IN USER-MODE AT THIS POINT WE HAVE TO USE UISAR6 TO MAP OUR ;DPR042VVp; HEADER AND SO WE MUST DISABLE INTERRUPTS LEST WE HAVE OUR CONTEXT RELOADED ;DPR042p; ;DPR042;p MOV $SAHPT, R1 ; GET ADDRESS OF LOADER'S HEADER ;DPR042D3p MOVB #PR7, PS ;;; LOCK OUT INTERRUPTS ;DPR042O8p MOV $SAHDB, UISAR6 ;;; MAP LOADER'S HEADER ;DPR0421pPLF = / 100 * 400 ;DPR042S8p MOV #PLF + 6, UISDR6 ;;; ALLOW WRITE ACCESS ;DPR042@p MOV (SP)+, H.LUN(R1) ;;; ASSIGN LUN 1 TO LOAD DEVICE ;DPR042+p CLRB PS ;;; ALLOW INTERRUPTS ;DPR042Dp ;DPR040DDp MOV P.REL(R4), R1 ; PICK UP RELOCATION BIAS OF PARTITION ;DPR040Dp BIT #PS.CKP!PS.COM, (R3) ; CHECKPOINT REQUEST OR COMMON? ;DPR040#p BNE 65$ ; IF NE YES ;DPR040;@p ADD T.OFF(R5), R1 ; ELSE ADD IN OFFSET TO TASK IMAGE ;DPR040p65$: ;DPR040Ap MOV #177000, LDRLN ; SET TENTATIVE LENGTH OF TRANSFER ;DPR040,|; ;**-11T}; AT THIS POINT WE HAVE:~; :~; R2,(SP) = TOTAL SIZE OF TRANSFER TO PERFORM ;DPR040D; R1 = RELOCATION BIAS OF LOAD AREA IN PHYSICAL MEMORY ;**-1); R4 = PCB ADDRESS OF TRANSFER PCBR-; R5 = TCB ADDRESS OF TASK (IF TASK REGION)H?; LDRBK = HIGH ORDER PART OF DISK BLOCK ADDRESS TO TRANSFER 2; LDRBK+2 = LOW ORDER PART OF DISK BLOCK ADDRESS;A? SUB #177000, (SP) ; REDUCE ACTUAL COUNT TO TRANSFER ;DPR040  SBC R2 ;DPR040, BGE 70$ ; IF GE FULL TRANSFER ;DPR040; ADD (SP), LDRLN ; ELSE REDUCE SIZE OF TRANSFER ;DPR040N2 BEQ 80$ ; IF EQ LAST TRANSFER DID IT ;DPR04070$: ;DPR040S< TSTB IOSB ; FORCED I/O ERROR (DUE TO DISMOUNT)? ;DPR0408 BMI 80$ ; IF MI YES, MAKE IT LOOK LIKE DONE ;DPR040 ;DPR040 3 MOVB #PR7, PS ;;; LOCK OUT INTERRUPTS ;DPR040 9 MOV R1, UISAR6 ;;; SET APR BIAS FOR TRANSFER ;DPR040)671$: DIR$ #LDRDP ;;; REQUEST I/O TRANSFER ;DPR040. BCC 75$ ;;; IF CC LOAD SUCCEEDED ;DPR0404 WSIG$S ;;; WAIT FOR SIGNIFICANT EVENT ;DPR040$ BR 71$ ;;; RETRY I/O ;DPR04075$: ;DPR040 + CLRB PS ;;; ALLOW INTERRUPTS ;DPR040O ;DPR040O- ADD #1770, R1 ; UPDATE APR BIAS ;DPR040 5 ADD #177, LDRBK+2 ; UPDATE BLOCK NUMBER ;DPR040R ADC LDRBK ;DPR040O ;DPR040D0 TST R2 ; WAS IT THE LAST TRANSFER? ;DPR040# BLT 80$ ; IF LT YES ;DPR040  ;DPR040S2 TSTB IOSB ; WAS TRANSFER SUCCESSFUL? ;DPR0403 BPL 65$ ; IF PL YES - GO FOR NEXT ONE ;DPR040 80$: ;DPR040 6 TST (SP)+ ; POP LOW-ORDER TRANSFER COUNT ;DPR040; ;**-46UF; IF THIS IS AN I/D SPACE TASK, RESET PARAMETERS AND READ IN I SPACE@; SECTION WITH PARAMETERS FROM WINDOW ZERO IN THE TASK HEADER.; .IF DF U$$DAS2 TST ISIZE ;TASK USE I/D SPACE (AND NOT ALREADY ;LOADED BOTH SPACES) ?1 BPL 807$ ;IF PL EITHER NOT D SPACE OR ALREADY ;ALL LOADEDS+ CALL $SWSTK,805$ ;SWITCH TO SYSTEM STATE & MOV #ISIZE,R0 ;POINT TO IMPURE AREA- MOV P.REL(R4),KISAR6 ;POINT TO TASK REGIONR7 ADD T.OFF(R5),KISAR6 ;ADJUST TO HEADER AREA ;**-3I ;**-2A+ CMPB #17,140000+H.IPS ;SUCCESSFUL READ ?  BNE 803$ ;IF NE NO+ MOV H.NLUN+140000,R1 ;GET NUMBER OF LUNS ASL R1 ;CONVERT ASL R1 ;TO INDEX8 ADD #140000+H.NLUN+4,R1 ;POINT TO TASK I SPACE WINDOW4 MOV W.BSIZ(R1),(R0)+ ;SAVE SIZE OF I SPACE WINDOW1 MOV W.BOFF(R1),(R0) ;AND OFFSET INTO PARTITIONC$803$: RETURN ;BACK TO USER STATE0805$: TST ISIZE ;SHOULD WE TRY I SPACE READ ? BLE 807$ ;IF LE, NOD* MOV ISIZE,R1 ;GET SIZE OF USER I WINDOW' ASH #6,R1 ;CONVERT TO SIZE IN BYTES4, MOV R1,-(SP) ;SET UP FOR REGION LOAD CODE& MOV IREL,R1 ;GET OFFSET TO I SPACE+ ADD P.REL(R4),R1 ;SET UP RELOCATION BIASR- MOV #LDRBK,R0 ;GET ADDRESS OF BLOCK NUMBER 6 MOVB T.LBN(R5),(R0)+ ;SET HIGH PART OF BLOCK NUMBER CLRB (R0)+ ;CLEAR HIGH BITSF5 MOV T.LBN+1(R5),(R0) ;S00yxttt tfDATAET LOW PART OF BLOCK NUMBER 4 SUB T.ISIZ(R5),(R0) ;ADJUST BACKWARDS TO START OF SBC -(R0) ;I SPACE+ CLR ISIZE ;INDICATE FINAL PHASE OF LOADS, JMP 65$ ;GO LOAD USER DATA SPACE SECTION807$: ;REFERENCE LABEL( .ENDC ; DF U$$DAS;V7; POST PROCESSING FOR CHECKPOINT WRITE (SYSTEM STATE)T;EI; HERE THE LOADER CHECKS THE I/O STATUS, DEALLOCATES THE TASK HEADER IFBI; THE REGION WAS A TASK REGION, AND DETERMINES IF THE REGION PCB SHOULDFJ; BE ENTERED INTO THE PARTITION WAIT QUEUE. TASK REGIONS ALWAYS GO INTOI; THE PARTITION WAIT QUEUE AND COMMONS GO IN IF P.PRI IS NONZERO (THEREIG; IS A RESIDENT MAPPED TASK). FINALLY THE REGIONS MEMORY IS RELEASEDNG; ALLOWING $NXTSK TO ATTEMPT TO BRING IN THE HIGHEST PRIORITY WAITING ; REGION.S;O181$: CALL $SWSTK,$LOADR ;SWITCH TO SYSTEM STATEL82$:;+; ** W A R N I N G **S;D;; SPM HOOKPOINT - LOADR CALLS DUMMY ROUTINE FOR HOOKPOINTH;I+; DO NOT CHANGE THE INSTRUCTION FOLLOWINGT; LABEL WITHOUT CHECKING SPM;-+ CALL @$SPV03 ;CALL HOOKABLE ENTRY POINTG& BIT #PS.OUT,(R3) ;REGION IN MEMORY? BNE 870$ ;IF NE NO& BIT #PS.COM,(R3) ;IS THIS A COMMON? BEQ 825$ ;IF EQ NO= BIT #P2.CPC,P.ST2(R4) ;IS THIS A CPCR CKP WRITE? ;DPR040O  BEQ 825$ ;IF EQ NO ;**-1  TSTB IOSB ;SUCCESSFUL WRITE?  BMI 90$ ;IF MI NOR1  BR 91$ ;OTHERWISE AVOID REAL CHECKPOINT WRITE  ;PARTITION DEALLOCATION6825$: BIT #PS.DEL,(R3) ;IS REGION MARKED FOR DELETE? BEQ 83$ ;IF EQ NOM0 TST P.ATT(R4) ;IS THERE ANYONE LEFT ATTACHED? BNE 83$ ;IF NE YES MOV R4,R1 ;COPY PCB POINTER# CALL $RLPR1 ;RELEASE ITS MEMORY( MOV R4,R0 ;COPY PCB POINTER56 CALLR $RLCPS ;RELEASE CHECKPOINT SPACE & DEA PCB'S$83$: TSTB IOSB ;SUCCESSFUL WRITE? BMI 90$ ;IF MI NOT .IF DF E$$XPR4 BIT #PS.AST,P.STAT(R4) ;REGION HAVE AST PENDING ?. BNE 84$ ;IF NE YES, P.SWSZ IS AST LISTHEAD ;NOT SWAP SIZE.,5  MOV P.SWSZ(R4),P.SIZE(R4) ;SET SIZE FROM SWAP SIZEN!84$: ;REFERENCE LABEL"# .ENDC$%-& BIS #PS.OUT,(R3) ;SET REGION OUT OF MEMORY (' CLR $LDPCB ;CLEAR LOADER PCB POINTER+( BIT #PS.COM,(R3) ;IS IT A COMMON REGION?/) BEQ 844$ ;IF EQ, NO - MUST BE A TASK REGIONB3* CLRB P.PRI(R4) ;RE-INITIALIZE PRIORITY OF COMMON -+ TSTB P.RMCT(R4) ;ANYONE MAPPED TO COMMON ?T/, BEQ 85$ ;IF EQ, NO - LEAVE PRIORITY AT ZERO- MOV R4,R1 ;COPY PCB POINTERS*. ADD #P.ATT,R1 ;POINT TO ATTACHMENT LIST/ ASSUME A.PCBL(0841$: MOV (R1),R1 ;GET FIRST/NEXT ADB 1 BEQ 843$ ;IF EQ, END OF LIST62 TSTB A.MPCT(R1) ;TASK MAPPED THRU THIS DESCRIPTOR ?03 BEQ 841$ ;IF EQ, NO - DON'T LOOK AT PRIORITY*4 MOV A.TCB(R1),R0 ;GET MAPPED TASK'S TCB<5 CMPB P.PRI(R4),T.PRI(R0) ;REGION PRIORITY ALREADY GREATER 6 ;THAN SOMEONE ELSES TASK ?+7 BHIS 841$ ;IF SO, DON'T UPDATE PRIORITY58 MOVB T.PRI(R0),P.PRI(R4) ;UPDATE REGION'S PRIORITYV(9 BR 841$ ;AND EXAMINE NEXT ATTACHMENT::843$: INCB P.PRI(R4) ;COMMON REGION'S PRIORITY IS ALWAYS2; BR 85$ ;ONE GREATER THAN HIGHEST PRIORITY TASK<844$: ;REFERENCE LABEL)=>? .IF DF A$$CNT@$A MOV P.TCB(R4),R0 ;GET TCB ADDRESS!B MOV KISAR6,-(SP) ;SAVE MAPPING)-C MOV T.ACN(R0),KISAR6 ;MAP ACCOUNTING BLOCK."D BEQ 845$ ;IF EQ, NO ACCOUNTING-E CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TAB F BNE 845$ ;IF NE NO2G ADD #1,@#B.TCKP+2+140000 ;COUNT TASK CHECKPOINTH ADC @#B.TCKP+140000 ;)I845$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGNJK .ENDC ;A$$CNTLM/N MOV P.HDR(R4),R0 ;GET ADDRESS OF TASK HEADERHOP .IF DF X$$HDRQ4R BEQ 85$ ;IF EQ EXTERNAL HEADER, DON'T DEALLOCATEST .ENDC ; DF X$$HDRU3V MOV H.HDLN(R0),R1 ;GET LENGTH OF HEADER IN BYTEST"W CALL $DEACB ;DEALLOCATE HEADER"X85$: MOV R4,R1 ;SET PCB ADDRESS+Y TSTB P.PRI(R1) ;DOES IT HAVE A PRIORITY? /Z BEQ 87$ ;IF EQ NO, DO NOT PUT IN WAIT QUEUE2;[ MOV P.MAIN(R1),R0 ;CALCULATE ADDR OF WAIT QUEUE LISTHEAD4\ ADD #P.WAIT,R0 ;;9] CALL $QINSP ;INSERT TASK BACK IN PARTI00yNxtccccTION WAIT QUEUER'^87$: CALLR $RLPR1 ;RELEASE PARTITION_`870$: BR 110$ ;EXTEND BRANCH abc;E+d; CHECKPOINT WRITE FAILURE (SYSTEM STATE)He;Hf; ON CHECKPOINT WRITE FAILURES A DIAGNOSTIC MESSAGE BLOCK IS QUEUED TODg; TKTN AND THE STATUS OF THE REGION AND ANY MAPPED TASKS IS RESET,Hh; ALLOWING THE TASKS TO RUN AS IF THE CHECKPOINT WRITE REQUEST HAD NOTHi; OCCURED. ANY CHECKPOINT SPACE ALLOCATED FOR THE REGION IS RELEASED.j;Ak3l90$: MOV #T.NCWF,R0 ;SET CHECKPOINT WRITE FAILUREWm MOV R4,R5 ;COPY PCB ADDRESS;5m MOV $SAHPT,R4 ;PICK UP PTR TO OWN HEADER ;DPR042 -m MOV KISAR6,-(SP) ;SAVE MAPPING ;DPR042Y0m MOV $SAHDB,KISAR6 ;MAP OWN HEADER ;DPR042>o MOV H.LUN(R4),R4 ;PICK UP UCB ADDRESS OF WRITE ERROR ;**-1/o MOV (SP)+,KISAR6 ;RESTORE MAPPING ;DPR042p CALL $DVMSG ;OUTPUT MESSAGEI&q MOV R5,R4 ;RESET PCB ADDRESS IN R4rs;EJt; UNBLOCK MAPPED TASKS & FREE CHECKPOINT SPACE (SYSTEM STATE SUBROUTINE)u;MIv; THIS ROUTINE IS CALLED AFTER A REGION LOAD OPERATION OR AN UNSUCCESS-SHw; FULL CHECKPOINT WRITE OPERATION TO UNBLOCK ALL MAPPED TASKS AND FREEIx; ANY SPACE WHICH MAY BE ALLOCATED IN A CHECKPOINT FILE. IF THE REGION;>y; HAS HAD A LOAD FAILURE, THEN ALL MAPPED TASKS ARE ABORTED.z;1 {; INPUTS:+|;R}; R4=PCB ADDRESS. ~;4 ; OUTPUTS:; ; R4 AND R5 PRESERVED.; =91$: MOV P.ATT(R4),R2 ;POINT TO FIRST ATTACHMENT DESCRIPTOR  BEQ 94$ ;IF EQ THERE IS NONE@92$: MOVB A.MPCT(R2),R1 ;PICK UP MAPPING COUNT THRU DESCRIPTOR" BEQ 93$ ;IF EQ TASK NOT MAPPED4 BIT #PS.LFR,P.STAT(R4) ;LOAD FAILURE THIS REGION? BEQ 925$ ;IF EQ NO3 MOV R2,-(SP) ;SAVE ATTACHMENT DESCRIPTOR ADDRESSR* MOV A.TCB(R2),R0 ;POINT TO ATTACHED TCB( DEC T.STAT(R0) ;REDUCE BLOCKING COUNT' BPL 923$ ;IF PL TASK ALREADY ACTIVE/ BIC #TS.EXE,T.STAT(R0) ;ELSE SET TASK ACTIVE& MOV T.PCB(R0),R1 ;POINT TO TASK PCB* BIC #PS.FXD,P.STAT(R1) ;CLEAR FIXED BIT- CALL $BILDS ;BUILD STACK AND PLACE IN ATLC6 MOV (SP),R2 ;RESTORE ATTACHMENT DESCRIPTOR ADDRESS+923$: CLRB A.MPCT(R2) ;ZERO MAPPING COUNTA( MOV A.TCB(R2),R1 ;POINT TO MAPPED TCB8 BIT #T2.ABO,T.ST2(R1) ;TASK ALREADY MARKED FOR ABORT? BNE 9241$ ;IF NE YES, MOV #S.CLRF,R0 ;SET CODE FOR LOAD FAILURE+ BIT #PS.CKP,P.STAT(R4) ;CHECKPOINT READ?A BEQ 924$ ;IF EQ NO7 MOV #S.CCRF,R0 ;SET CODE FOR CHECKPOINT READ FAILURE 924$: CALL $ABTSK ;ABORT TASK!9241$: MOV (SP)+,R2 ;RESTORE R2L  BR 93$ ;4925$: 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 TASK893$: MOV (R2),R2 ;POINT TO NEXT ATTACHMENT DESCRIPTOR BNE 92$ ;IF NE THERE IS ONEV#94$: MOV R4,R2 ;COPY PCB POINTERE1 ADD #P.STAT,R2 ;POINT AT PARTITION STATUS WORDB' BIT #PS.COM,(R2)+ ;IS THIS A COMMON?T BEQ 95$ ;IF EQ NOA. BIT #P2.CPC,(R2) ;IS THIS A CPCR CKP WRITE? BEQ 945$ ;IF EQ NO, BIC #P2.CPC,(R2) ;INDICATE CPCR COMPLETED ASSUME P.ST2,* BIC #PS.CKP,-(R2) ;CHECKPOINT COMPLETED MOV R4,R0 ;COPY PCB ADDRESSL3 CALLR $NXTSK ;REALLOCATE PARTITION IF NECESSARY(4945$: BIT #PS.LFR,-(R2) ;LOAD FAILURE THIS REGION? BNE 96$ ;IF NE YES#95$: MOV R4,R0 ;COPY PCB POINTERE* CALLR $RLCPS ;RELEASE CHECKPOINT SPACE96$: RETURN ;S;+2; POST PROCESSING FOR REGION LOAD (SYSTEM STATE)"; COPY HEADER & CHECK I/O STATUS;E; HERE THE LOADER SETS UP A COPY OF THE TASK HEADER IN THE POOL AND.; DETERMINES IF A LOAD FAILURE HAS OCCURRED.;P;110$: BIC #PS.OUT!PS.LFR,(R3) ;CLEAR OUT AND LOAD FAILURE ( BIT #PS.COM,(R3) ;IS REGION A COMMON? BEQ 112$ ;IF EQ NO) JMP 143$ ;YES, SKIP HEADER PROCESSINGE112$: ;REFERENCE LABEL . MOV P.REL(R4),KISAR6 ;MAP TO TASK PARTITION .IF DF X$$HDR - TSTB T.HDLN(R5) ;TASK HAVE EXTERNAL HEADER 3 BEQ 113$ ;IF EQ, NO. CALCULATE OFFSET TO HEADER& BIT #PS.CKP,(R3) ;CHECKPOINT READ ?1 BNE 114$ ;IF NE, YES - EXAMINE EXTRNAL HEADERI00"yxttt tfDATA113$: ;DPR040" .ENDC ; DF X$$HDR ;DPR040 ;**-5O5 ADD T.OFF(R5),KISAR6 ;ADD IN OFFSET TO TASK HEADERC<114$: MOV 140000+H.HDLN,R1 ;ASSUME SUCCESSFUL READ ;**-2+ CMPB #17,140000+H.IPS ;VALID TASK IMAGE?V1 BNE 115$ ;IF NE NO TREAT AS UNSUCCESSFUL READF TSTB IOSB ;SUCCESSFUL READ?R BPL 120$ ;IF PL YESA,115$: MOVB #-1,IOSB ;INDICATE LOAD FAILURE; MOV #H.NLUN+2+W.BLGH+2,R1 ;SETE LENGTH OF MINIMUM HEADER1/ CLR 140000+H.NLUN ;CLEAR NUMBER OF LUNS WORD$+120$: MOV R1,2(SP) ;SAVE LENGTH OF HEADER  .IF DF X$$HDR/ TSTB T.HDLN(R5) ;TASK HAVE EXTERNAL HEADER ?K* BEQ 125$ ;IF EQ NO, GO TRY TO ALLOCATE6 MOV #140000,R0 ;SET VIRTUAL ADDRESS OF XTRNL HEADER0 BIT #PS.CKP,(R3) ;CHECKPOINT READ OPERATION ?8 BNE 122$ ;IF NE YES, NO HEADER MANIPULATION REQUIRED2 CLR P.HDR(R4) ;INDICATE EXTERNAL HEADER FOR PCB; MOV P.REL(R4),HDRDB ;SET BLOCK NUMBER OF EXTERNAL HEADERM BR 131$ ;RE-ENTER CODE FLOWL-122$: JMP 1401$ ;STRETCH BRANCH FROM ABOVE) .ENDC ; DF X$$HDR6125$: CALL $ALOCB ;ALLOCATE A BLOCK FOR TASK HEADER# BCC 130$ ;IF CC BLOCK ALLOCATEDO1 BIS #PS.OUT,(R3) ;MARK REGION AS OUT OF MEMORYL; ;DPR042V; NO NEED TO CHANGE FOLLOWING REFERENCE TO $HEADR TO SUPPORT EXTERNAL HEADER ;DPR042; ;DPR042* MOV @$HEADR,R0 ;GET SAVED STACK POINTER' MOV #81$,4(R0) ;ALTER RETURN ADDRESS + CALLR $TKWSE ;WAITFOR SIGNIFICANT EVENT 4130$: MOV R0,P.HDR(R4) ;SAVE ADDRESS OF NEW HEADER-131$: MOV #140000,R2 ;SET APR6 ADDRESS BIAS6 MOV R0,R1 ;CALC RELATIVE HEADER GUARD WORD POINTER TST -(R1) ;F MOV R1,H.GARD(R2) ;: MOV R1,H.WND(R2) ;CALCULATE NUMBER OF WINDOW BLOCKS PTR3 MOV H.NLUN(R2),R1 ;CALCULATE NUMBER OF LUN WORDS  ASL R1 ;  ASL R1 ;' ADD #H.NLUN+4,R1 ;FINISH CALCULATION ADD R1,H.WND(R2) ;V3 MOV 2(SP),R1 ;RETRIEVE LENGTH OF HEADER IN BYTESR* MOV R1,H.HDLN(R2) ;SET LENGTH OF HEADER3 ADD R1,H.GARD(R2) ;FINISH GUARD WORD CALCULATION  .IF DF X$$HDR .IF DF F$$MAP ;CAS021M ;CAS021IE CLR H.FMAP(R2) ;ASSUME TASK DOES NOT HAVE FAST MAP ENABLED ;CAS021 ;CAS021C" .ENDC ; DF F$$MAP ;CAS021 ;CAS0211' .IF DF C$$DFB & C$$RTB ;KLN028R ;KLN028E CLR H.LUTE(R2) ;ASSUME TASK DOES NOT HAVE RUN TIME BINDING ;KLN0282 ;KLN028G* .ENDC ; DF C$$DFB & C$$RTB ;KLN028 ;KLN028R- TST P.HDR(R4) ;TASK HAVE EXTERNAL HEADER ?L BNE 139$ ;IF NE NO, GO COPY! MOV R4,-(SP) ;SAVE PCB ADDRESS/ MOVB T.HDLN(R5),R0 ;GET SIZE OF TOTAL HEADERK   .IF DF F$$MAP ;DPR0402  ;**-1S5  BIT #T4.FMP,T.ST4(R5) ;TASK HAVE FAST MAP ENABLED?C  BEQ 133$ ;IF EQ NO: SUB #H$$FMX,R0 ;SUBTRACT OUT SIZE OF FAST MAP EXTENSION133$: ;DPR040" .ENDC ; DF F$$MAP ;DPR040 ;**-3' .IF DF C$$DFB & C$$RTB ;KLN0288 ;KLN028R? BIT #T4.DFB,T.ST4(R5) ;TASK HAVE DEFERRED BINDING? ;KLN028F" BEQ 135$ ;IF EQ NO ;KLN028 ;KLN028M< BIT #F5.RTB,$FMSK5 ;TASK HAVE RUN TIME BINDING? ;KLN028" BEQ 135$ ;IF EQ NO ;KLN028 ;KLN028T> MOV H.NLUN(R2),R1 ;CALCULATE SIZE OF LUT EXTENSION ;KLN028 ASL R1 ; ;KLN028  ASL R1 ; ;KLN028I8 ADD #77,R1 ;ROUND TO NEAREST 32. WORD BLOCK ;KLN050 ASH #-6,R1 ; ;KLN028.+ MOV R1,H.LUTE(R2) ;SAVE SIZE ;KLN028 : SUB R1,R0 ;SUBTRACT OUT SIZE OF LUT EXTENSION ;KLN028135$: ;KLN028* .ENDC ; DF C$$DFB & C$$RTB ;KLN028 ;KLN028B ASH #6,R0 ;CONVERT TO BYTESN8 MOV P.REL(R4),R1 ;SET APR DISPLACEMENT OF DESTINATION* MOV R1,R3 ;COPY TO SOURCE DISPLACEMENT* ADD T.OFF(R5),R1 ;CALCULATE SOURCE BIAS* MOV #120000,R2 ;SET SOURCE DISPLACEMENT/ MOV #140000,R4 ;SET DESTINATION DISPLACEMENT  CALL $BLXIO ;COPY HEADER$ MOV (SP)+,R4 ;RESTORE PCB ADDRESS MOV R4,R3 ;RESTORE POINTER+ ADD #P.STAT,R3 ;TO PARTITION STATUS WORD800*yNxtcccc+ MOV HDRDB,KISAR6 ;MAP TO EXTERNAL HEADERD0 MOV #140000,R0 ;SET VIRTUAL ADDRESS OF HEADER .IF DF F$$MAP ;CAS021V ;CAS021R=# BIT #T4.FMP,T.ST4(R5) ;TASK HAVE FAST MAP ENABLED? ;**-3P## BEQ 1371$ ;IF EQ NO ;KLN028A<% MOVB T.HDLN(R5),R1 ;GET LENGTH OF HEADER IN BYTES ;**-1%& ASH #6,R1 ;CONVERT TO BYTE OFFSETC6' ADD #140000-<64.*H$$FMX>,R1 ;POINT TO FAST MAP AREA2( MOV R1,H.FMAP(R0) ;SET ADDRESS OF FAST MAP AREA5) MOV #<<+15.>/16.>,R2 ;GET NUMBER OFR* ;PASSES THROUGH LOOP+137$: .REPT 16.0,, CLR (R1)+ ;CLEAR A WORD OF FAST MAP AREA- .ENDR. / SOB R2,137$ ;LOOP UNTIL DONE/1371$: ;KLN028;"/ .ENDC ; DF F$$MAP ;KLN0282 ;**-2 '2 .IF DF C$$DFB & C$$RTB ;KLN028 2 ;KLN028 ?2 BIT #T4.DFB,T.ST4(R5) ;TASK HAVE DEFERRED BINDING? ;KLN028#"2 BEQ 138$ ;IF EQ NO ;KLN0282 ;KLN028,<2 BIT #F5.RTB,$FMSK5 ;TASK HAVE RUN TIME BINDING? ;KLN028"2 BEQ 138$ ;IF EQ NO ;KLN0282 ;KLN028GF2 MOVB T.HDLN(R5),R1 ;GET LENGTH OF HEADER IN 32. WORD BLOCKS ;KLN0282 ;KLN028B2 .IF DF F$$MAP ;KLN02812 ;KLN028?2 BIT #T4.FMP, T.ST4(R5) ; TASK HAVE FAST MAP ENABLED ;KLN028 $2 BEQ 1375$ ; IF EQ NO ;KLN028<2 SUB #H$$FMX, R1 ; TAKE FAST MAPPING INTO ACCOUNT ;KLN02821375$: ;KLN0281"2 .ENDC ; DF F$$MAP ;KLN0282 ;KLN028#-2 TST H.LUTE(R0) ;ARE THERE LUNS? ;KLN057L'2 BEQ 138$ ;IF EQ NO LUNS ;KLN057B2 SUB H.LUTE(R0), R1 ;SUBTRACT OUT SIZE OF LUT EXTENSION ;KLN057.2 ASH #6, R1 ;GET OFFSET IN BYTES ;KLN02882 ADD #MAP6, R1 ;GET ADDRESS OF LUT EXTENSION ;KLN02832 MOV R1,H.LUTE(R0) ;STORE IT IN HEADER ;KLN028 92 ADD #H.NLUN,R0 ;GET ADDRESS OF LUT IN HEADER ;KLN028F62 MOV (R0)+,R2 ;GET NUMBER OF WORDS TO COPY ;KLN0282 ASL R2 ; ;KLN028N"2 MOV R2,-(SP) ;SAVE ;KLN028I21377$: MOV (R0)+,(R1)+ ;COPY THE HEADER LUT INTO THE EXTENSION ;KLN028 +2 SOB R2,1377$ ;LOOP UNTIL DONE ;KLN02802 ;KLN028I=2 MOV #MAP6+H.NLUN+2,R1 ;POINT TO HEADER LUT AGAIN ;KLN028E+2 MOV (SP)+,R2 ;GET SIZE OF LUT ;KLN028F421378$: CLR (R1)+ ;CLEAR OUT HEADER LUT ;KLN028+2 SOB R2,1378$ ;LOOP UNTIL DONE ;KLN028G2 ;KLN028HA2138$: MOV #MAP6, R0 ;POINT BACK TO BEGINNING OF HEADER ;KLN028L2 ;KLN028 *2 .ENDC ; DF C$$DFB & C$$RTB ;KLN0282 ;KLN028+3 BR 14000$ ;RE-ENTER CODE45 .ENDC ; DF X$$HDR6(7139$: ASR R1 ;CONVERT LENGTH TO WORDS78140$: MOV (R2)+,(R0)+ ;MOVE TASK HEADER TO CORE BLOCKO#9 DEC R1 ;ANY MORE WORDS TO MOVE?(: BGT 140$ ;IF GT YES /; MOV P.HDR(R4),R0 ;GET ADDRESS OF TASK HEADER '<14000$: TSTB IOSB ;SUCCESSFUL READ ?I= BMI 1421$ ;IF MI NO &> BIT #PS.CKP,(R3) ;CHECKPOINT READ?)? BNE 1401$ ;IF NE YES, DON'T TOUCH LUT@A .IF DF S$$LIBB:C CLR H.SMAP(R0) ;INITIALIZE SUPERVISOR AND DATA MAP MASKDE .ENDC ; DF S$$LIBF@F CALL REBIND ;BIND LUT AND WINDOWS TO EXEC ADDRESSES ;LBM061&O1401$: ;REFERENCE SYMBOL ;**-8PQR .IF DF M$$PROS/T MOV H.WND(R0),R1 ;POINT TO NUMBER OF WINDOWSF)U MOV (R1)+,-(SP) ;GET NUMBER OF WINDOWSO.V141$: TST W.BPCB(R1) ;IS THIS WINDOW MAPPED?W BEQ 142$ ;NO IF EQ:X MOV W.BATT(R1),R2 ;GET ADDRESS OF ATTACHMENT DESCRIPTOR Y BEQ 142$ ;IF EQ NOT ATTACHED3Z BITB #AS.RBP,A.STAT(R2) ;SHOULD BYPASS BE RESET?L[ BEQ 1411$ ;NO IF EQA/\ BIC #100000,W.BLPD(R1) ;RESET BYPASS IN LPDRI&] BICB #AS.RBP,A.STAT(R2) ;RESET FLAG7^1411$: BITB #AS.SBP,A.STAT(R2) ;SHOULD BYPASS BE SET?_ BEQ 142$ ;NO IF EQ-` BIS #100000,W.BLPD(R1) ;SET BYPASS IN LPDRW&a BICB #AS.SBP,A.STAT(R2) ;RESET FLAG,b142$: ADD #W.BLGH,R1 ;POINT TO NEXT WINDOWc DEC (SP) ;ANY WINDOWS LEFT?d BGT 141$ ;YES IF GT e TST (SP)+ ;CLEAN THE STACKfg .ENDChij1421$: ;REFERENCE SYMBOL.klm .IF DF S$$WPCn6o MOVB $SWPR,H.SPRI(R0) ;INITIALIZE SWAPPING PRIORITYpq .ENDCrs5t MOV H.WND(R0),R1 ;POI002yxttt tfDATANT TO NUMBER OF WINDOW BLOCKST.u CALL $MAPTK ;MAP FIRST TASK ADDRESS WINDOWv(w CMPB #17,H.IPS(R0) ;VALID TASK IMAGE?2x BNE 1431$ ;IF NE NO TREAT AS UNSUCCESSFUL READy143$: TSTB IOSB ;READ ERROR?1z BPL 1439$ ;IF PL NO{|; &}; REGION LOAD FAILURE (SYSTEM STATE)~; J; THE FIXED BIT IS CLEARED AND PS.LFR IS SET TO DENOTE THE LOAD FAILURE.F; IF THE REGION IS A TASK REGION, THEN THOSE HEADER FIELDS WHICH AREE; REQUIRED TO GET THE TASK THROUGH THE ABORT PROCESS ARE FABRICATEDI0; HERE. (ALL MAPPED TASKS ARE ABORTED LATER.);R/1431$: BIS #PS.LFR,(R3) ;SIGNIFY LOAD FAILUREL+ BIT #PS.COM,(R3) ;IS IT A COMMON REGION?  BNE 1439$ ;IF NE YES' MOV #77406,(R1) ;SET ACCESS LAST PDR$< MOV #UISDR0&377+<1*256.>,-(R1) ;SET FIRST PDR AND # PDR'S; MOV H.WND(R0),-(SP) ;GET ADDR OF NUMBER OF WINDOW BLOCKSO+ MOV #1,@(SP)+ ;INDICATE ONE WINDOW BLOCKT .IF DF, U$$DASH= BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D SPACE?O BEQ 1435$ ;IF EQ, NO; MOV (R1),-20(R1) ;COPY FIRST PDR AND # PDR'S TO WINDOW 0/ MOV 2(R1),-16(R1) ;COPY LAST PDR TO WINDOW 01435$: ;REFERENCE LABEL .ENDC ; DF U$$DAS9 CLR H.FPSA(R0) ;CLEAR FLOATING POINT SAVE AREA POINTER3 MOV R0,H.GARD(R0) ;INITIALIZE GUARD WORD POINTERP ADD #H.TKVL+2,H.GARD(R0) ;E; 2; POST PROCESSING FOR REGION LOAD (SYSTEM STATE)$; INITIAL TASK LOAD INITIALIZATION;J; FOR THE INITIAL LOAD OF A TASK REGION, REQUEST OR FIX, THE LOADER MUSTD; ATTACH THE TASK TO ANY REGIONS WHICH IT HAS BEEN LINKED TO. THEI; TASK'S ATTACHMENT QUEUE MAY NOT BE EMPTY DUE TO THE SEND BY REFERENCEFH; DIRECTIVE. IF THE TASK IS NOT BEING FIXED, $BILDS IS CALLED TO INIT9; ITS STACK AND PLACE THE TASK IN THE ACTIVE TASK LIST.G;W"1439$: BIT #PS.COM,(R3) ;COMMON? BNE 150$ ;IF NE, YES .IF DF, U$$DASA' CALL CALDMK ;CALCULATE D SPACE MASKA .ENDC ; DF U$$DAS% BIT #PS.CKP,(R3) ;CHECKPOINT READ?  BNE 150$ ;IF NE YES 5 MOV H.WND(R0),R3 ;POINT TO NUMBER OF WINDOW BLOCKS $ MOV #LDRBK,R1 ;POINT TO SAVE AREA0 MOV (R3)+,(R1)+ ;SAVE NUMBER OF WINDOW BLOCKS MOV R5,R0 ;COPY TCB POINTERB9 ADD #T.ATT,R0 ;POINT TO ATTACHMENT DESCRIPTOR LISTHEADC& MOV R0,-(SP) ;SAVE LISTHEAD POINTER, MOV (R0)+,(R1)+ ;SAVE FIRST LISTHEAD WORD .IF DF U$$DAS, MOV (R0),(R1)+ ;SAVE SECOND LISTHEAD WORD .IFF ; DF U$$DAS+ MOV (R0),(R1) ;SAVE SECOND LISTHEAD WORDE .IFTF ; DF U$$DAS4 MOV (SP)+,(R0) ;REINITIALIZE SECOND LISTHEAD WORD .IFT ; DF U$$DASB/ CLR (R1) ;INIT TEMPORARY TO ZERO (INDICATESM ;NOT D-SPACE TASK LATER,2 CLR MUDPT ;CLEAR POINTER TO D WINDOW IN HEADER ;OF MULTI-USER I/D TASK) BIT #T4.DSP,T.ST4(R5) ;IS IT D SPACE ?M BEQ 145$ ;IF EQ NO/ MOV R3,(R1) ;SAVE POINTER TO I SPACE WINDOWV* ADD #W.BLGH,R3 ;POINT TO D SPACE WINDOW( DEC -6(R1) ;COUNT AS ONE LESS WINDOW3 BIT #T4.MUT,T.ST4(R5) ;IS IT A MULTI-USER TASK ?S BEQ 145$ ;IF EQ NO< MOV #<2*W.BLGH>,MUDPT ;INIT OFFSET FROM D SPACE WINDOW TO ;D SPACE RO WINDOW, ADD R3,MUDPT ;FORM REAL ADDRESS OF WINDOW .IFTF ; DF U$$DAS7145$: CLR R1 ;CLR NEXT ATTACHMENT DESCRIPTOR ADDRESSI2 MOV (R3),R2 ;PICK UP NEXT PCB ADDRESS (W.BPCB)! BEQ 148$ ;IF EQ THERE IS NONE, .IFT ; DF U$$DASS8 CMP R3,MUDPT ;IS THIS RO D WINDOW IN AN I/D MU TASK ? BNE 1455$ ;IF NE NOL4 MOV W.BATT-W.BLGH(R3),R1 ;GET ADDRESS OF RO I ADB/ MOV R1,W.BATT(R3) ;SET ADDRESS OF ATTACHMENTB ;DESCRIPTORF- BR 1481$ ;AND GO SET MAPPING COUNT IN ADBI" .ENDC ; DF U$$DAS ;DPR040 ;**-1.81455$: MOV #AS.RED,R4 ;SET FOR ATTACH WITH READ ACCESS/ BIT #4,W.BLPD(R3) ;MAPPED WITH WRITE ACCESS?X BEQ 146$ ;IF EQ NO. BIS #AS.WRT,R4 ;ADD WRITE ACCESS FOR ATTACH&146$: CALL $CRATT ;ATTACH TO REGION BCC 148$ ;IF CC SUCCESSFUL; ;DPR042V; NO NEED TO CHANGE FOLLOWING REFERENCE TO $HEADR TO SUPPORT EXTERNAL HEADER ;DPR042; 00:yNxtcccc ;DPR042/ MOV @$HEADR,R0 ;RETRIEVE SAVED STACK POINTERP0 MOV R3,(R0)+ ;SAVE WINDOW BLOCK POINTER AS R4' MOV R5,(R0)+ ;SAVE TCB ADDRESS AS R5V( MOV #147$,(R0) ;MODIFY RETURN ADDRESS, CALLR $TKWSE ;WAIT FOR SIGNIFICANT EVENT2147$: CALL $SWSTK,$LOADR ;SWITCH TO SYSTEM STATE+ MOV R4,R3 ;RESTORE WINDOW BLOCK POINTERT! BR 145$ ;REATTEMPT THE ATTACH;?148$: MOV R1,W.BATT(R3) ;SET ADDRESS OF ATTACHMENT DESCRIPTORL& BEQ 1485$ ;IF EQ WINDOW NOT MAPPED( MOV T.PCB(R5),R4 ;RESTORE PCB ADDRESS8 CMP A.PCB(R1),R4 ;IS ATTACHED REGION THE TASK REGION?/ BEQ 1481$ ;IF EQ YES, DON'T ACCESS IT AGAINV MOV R5,R0 ;COPY TCB ADDRESSV MOV R3,-(SP) ;SAVE R3 .IF DF M$$PRO MOV R1,-(SP) ;SAVE R1$ MOV A.PCB(R1),R1 ;GET PCB ADDRESS3 CALL $SETBP ;SET UP CACHE BYPASS AS APPROPRIATEL MOV (SP)+,R1 ;RESTORE R1A .ENDC6 INCB A.MPCT(R1) ;INIT MAPPING COUNT THIS DESCRIPTOR- MOV A.PCB(R1),R1 ;POINT TO ATTACHED REGION%  CALL $ACCRG ;ACCESS COMMON REGIONS  MOV (SP)+,R3 ;RESTORE R3A  BR 1485$ ;< 1481$: INCB A.MPCT(R1) ;INIT MAPPING COUNT THIS DESCRIPTOR3 1485$: ADD #W.BLGH,R3 ;POINT TO NEXT WINDOW BLOCKS+ DEC LDRBK ;ANY MORE WINDOWS TO PROCESS?R BGT 145$ ;IF GT YESA3 MOV LDRBK+2,@T.ATT+2(R5) ;ADD ON OLD DESCRIPTORS  BEQ 149$ ;IF EQ IT WAS NULLM= MOV LDRBK+4,T.ATT+2(R5) ;POINT TO LAST ORIGINAL DESCRIPTORR149$: ;REFERENCE LABELEI; FOR AN I/D TASK, WE SKIPPED THE I SPACE WINDOW IN THE PRECEDING CODE.SI; WE WILL NOW FIX UP THE I SPACE WINDOW TO POINT TO THE SAME ATTACHMENTCN; DESCRIPTOR AS THE D SPACE WINDOW. SINCE THIS MAPPING IS STATIC, IT DOESN'TM; MATTER THAT THE MAPPING COUNT IN THE ADB WILL BE 1 INSTEAD OF 2, AND THIS5I; SIMPLIFIES THE MANAGEMENT OF T.STAT DURING THE TASK REQUEST SEQUENCE.Q .IF DF U$$DAS ;DPR040R ;**-1O5 MOV LDRBK+6,R0 ;GET POINTER TO TASK I SPACE WINDOW ' BEQ 1495$ ;IF EQ NOT A D SPACE TASKE> MOV W.BATT+W.BLGH(R0),W.BATT(R0) ;POINT TASK I SPACE WINDOW-  ;TO SAME ATTACHEMENT DESCRIPTOR AS TASKT! ;D SPACE WINDOWR"# .ENDC ; DF U$$DAS$5%1495$: BIT #PS.FXD,P.STAT(R4) ;REGION BEING FIXED ? & BNE 170$ ;IF NE YESW&' MOV R5,R0 ;SET ADDRESS OF TASK TCB5( CALL $BILDS ;BUILD A STACK FOR TASK JUST STARTINGS)*;E2+; POST PROCESSING FOR REGION LOAD (SYSTEM STATE),; FINAL PROCESSING-; 3.; HERE THE LOADER PERFORMS THE FOLLOWING ACTIONS:I/;N10; 1. UNBLOCK ALL TASKS MAPPED TO THE REGION.(H1; 2. FREE UP ANY DYNAMIC CHECKPOINT SPACE FROM WHICH THE REGION MAY2; HAVE BEEN READ.WB3; 3. IF INSTALLED COMMON IS ONLY TO BE CHECKPOINTED TO SYSTEM=4; CHECKPOINT FILE (PS.NWB=1), DEALLOCATE DISK PCB AND0*5; CONVERT COMMON TO A PLAS REGION.A6; 4. CHECK FOR A PENDING CHECKPOINT REQUEST AND INITIATE THEN57; CHECKPOINT OPERATION IF THERE IS A REQUEST.98; 5. DECLARE RECEIVE AST'S FOR TASKS'S WITH NONEMPTY9; RECEIVE QUEUES. :; ;; INPUTS: <;N=; R4=PCB ADDRESS OF REGION.I$>; R5=TCB ADDRESS (IF TASK REGION).?;Y @; OUTPUTS:A;D5B; R4 IS PRESERVED IF COMMON REGION OR LOAD FAILURE.IC; R5 IS PRESERVED.D;HE-F150$: CALL 170$ ;SERVICE REGION LOAD ASTS,G ;DEALLOCATE CKP SPACE H ;AND UNBLOCK TASKS5I MOV R4,R3 ;RECALCULATE ADDRESS OF PCB STATUS WORDJ ADD #P.STAT,R3 ;O.K BIT #PS.LFR,(R3) ;LOAD FAILURE THIS REGION?L BEQ 155$ ;IF EQ NO+M BIT #PS.COM,(R3) ;IS IT A COMMON REGION?S*N BEQ 155$ ;IF EQ NO, DO NOT FREE MEMORY1O BIC #PS.CKR,(R3) ;CLEAR CHECKPOINT REQUEST BITN.P BIS #PS.OUT,(R3) ;MARK REGION OUT OF MEMORY&Q MOV R4,R1 ;COPY REGION PCB ADDRESS)R CALLR $RLPR1 ;RELEASE REGION'S MEMORY1.S155$: BIC #PS.CKP,(R3) ;CLEAR CHECKPOINT BIT7T BIT #PS.NWB,(R3) ;COMMON CHECKPOINT TO SYSTEM FILE ?R1U BEQ 157$ ;IF EQ, NO. CHECKPOINTS TO TASK FILET,V BIC #PS.NWB,(R3) ;DON'T NEED THIS ANYMORE4W MOV P.DPCB-P.STAT(R3),R0 ;GET ADDRESS OF DISK PCB*X CLR P.DPCB-P.STAT(R3) ;AND ZERO POINTER'Y MOV #P.DLGH,R1 ;G00Byxttt tfDATAET SIZE OF DISK PCBR!Z MOV R3,-(SP) ;SAVE PCB POINTERN$[ CALL $DEACB ;DEALLOCATE DISK PCB#\ MOV (SP)+,R3 ;RESTORE COMMON PCBN0]157$: BIT #PS.CKR,(R3) ;CHECKPOINT REQUESTED ?^ BEQ 169$ ;IF EQ NO2_ BIC #PS.CKR,(R3) ;CLEAR CHECKPOINT REQUEST FLAG!` MOV R4,R1 ;SET ADDRESS OF PCBR%a CALLR $ICHKP ;INITIATE CHECKPOINTTbb169$: RETURN ;DPR040b ;DPR040EAg170$: BIT #PS.AST,P.STAT(R4) ;REGION LOAD AST PENDING ? ;**-4Ch BEQ 180$ ;IF EQ NOi6j MOV P.STAT(R4),-(SP) ;SAVE CURRENT STATUS OF REGION7k BIC #^C,(SP) ;CLEAR ALL BUT OUT & CKPK.l BIC (SP),P.STAT(R4) ;CLEAR THOSE FOR REGION"m MOV R5,-(SP) ;SAVE NON-VOLATILEn MOV R4,-(SP) ;REGISTERS2o MOV P.SWSZ(R4),R0 ;POINT TO FIRST (OR ONLY) AST%p MOV (R0),P.SWSZ(R4) ;CLOSE UP LISTR#q BNE 175$ ;IF NE STILL MORE LEFTN0r BIC #PS.AST,P.STAT(R4) ;INDICATE NO ASTS LEFT7s MOV P.SIZE(R4),P.SWSZ(R4) ;RESET SWAP SIZE FROM SIZES)t175$: CALL $DSPKA ;DISPATCH KERNEL ASTO3u DEC T.STAT(R0) ;UNBLOCK THE TASK FOR THIS REGION !v BNE 177$ ;IF NE STILL BLOCKEDS1w CALL $SETCR ;SET CONDITIONAL SCHEDULE REQUEST),x177$: MOV (SP),R1 ;GET REGION PCB ADDRESS0y CALL $DEARG ;DEACCESS REGION ON TASKS BEHALF"z MOV (SP)+,R4 ;RESTORE REGISTERS{ MOV (SP)+,R5 ;06| BIS (SP)+,P.STAT(R4) ;RESET OUT/CKP STATUS TO PRIOR}~ BR 170$ ;AND GO AGAINA!180$: CALLR 91$ ;UNBLOCK TASKSS; ;LBM061K; REBIND:: - bind installed tasks to exec database at load time ;LBM061A; ;LBM061I; inserts correct UCB addresses into LUT from device list and ;LBM061TP; PCB addresses into Task Address Window Blocks from task PCB vector. ;LBM061; ;LBM061K; replaces LOADR routine SCHDR for tasks using deferred binding ;LBM0610N; (note that existing SCHDR function must be preserved and used for ;LBM0616; tasks which override deferred binding) ;LBM061; ;LBM0613; created 5-Feb-1987 by L.B. McCulley ;LBM061 ; ;LBM061; INPUTS: ;LBM061e; ;LBM061%; R0 = HEADER ADDRESS ;LBM061M"; R5 = TCB ADDRESS ;LBM061; ;LBM061; OUTPUTS: ;LBM061; ;LBM061K; IOSB MAY BE SET TO -1 IF SCHDR IS CALLED AND HEADER IS INVALID ;LBM061; ;LBM061L; TASK LUT AND WINDOW BLOCKS (W.BPCB OFFSET) CORRECTLY INITIALIZED ;LBM061*; FOR THIS EXEC'S DATABASE. ;LBM061; ;LBM061"; DESTROYS R1, R2 ;LBM061A; PRESERVES R0, R3, R4, R5 (ALL MEANINGFUL TO CALLER) ;LBM061 ; ;LBM061 ;LBM061 REBIND: ;LBM061- SAVNR ; COROUTINE SAVES R4/R5 ;LBM061U@ MOV R3,-(SP) ; SAVE OTHER REGISTERS NEEDED BY CALLER ;LBM061 MOV R0,-(SP) ;LBM061A ;LBM0616 .IF DF C$$DFB ;LBM061K ;LBM061S? BIT #F5.DFB,$FMSK5 ; SYSTEM USING DEFERRED BINDING? ;LBM061'+ BEQ 2$ ; NO, GO CHECK HEADER ;LBM0611 ;LBM061 D BIT #T4.DFB,T.ST4(R5) ; THIS TASK USING DEFERRED BINDING? ;LBM061- BNE 5$ ; YES, GO DO THE BINDING ;LBM061 2$: ;LBM061" .ENDC ; DF C$$DFB ;LBM061 ;LBM0616/ TST $FMSK4 ; LUT SCAN DISABLED ? ;LBM061D5 BMI 200$ ; YES, SO SKIP IT, JUST RETURN ;LBM061 < CALL SCHDR ; GO CHECK HEADER ALREADY BOUND OKAY ;LBM0615 BR 200$ ; RETURN AFTER REGISTER RESTORES ;LBM061R ;LBM061 .IF DF C$$DFB ;LBM061  ;LBM061 "5$: .IF DF C$$RTB ;LBM061 ;LBM061FG BIT #F5.RTB, $FMSK5 ; SHOULD LUN BINDING BE FURTHER DEFERED?;LBM061= BNE 100$ ; IF NE, YEP - JUST BIND WINDOWS FOR NOW;LBM061  ;LBM061T" .ENDC ; DF C$$RTB ;LBM061 ;LBM061 ( MOV R0,R3 ; R0 -> HEADER ;LBM061) ADD #H.NLUN,R3 ; R3 -> LUT ;LBM061O6 MOV (R3)+,R2 ; R2 = NUMBER OF LUT ENTRIES ;LBM061- BEQ 100$ ; NONE, GO DO WINDOWS ;LBM061D; ;LBM061,; GET NEXT LUN AND ASSIGN IT ;LBM061; ;LBM06110$: ;LBM00JyNxtcccc06153 CMP (R3),#"OV ; OVERLAY PSUEDO DEVICE? ;LBM061? BNE 12$ ; NO ;LBM061,N MOV T.LDV(R5),(R3)+ ; YES, GET TASK LOAD DEVICE UCB ADDRESS FROM TCB;LBM061 BR 80$ ; ;LBM061  ;LBM061R312$: MOV $DEVHD,R4 ; FIND DEVICE TABLE ;LBM061;515$: CMP D.NAM(R4),(R3) ; FOUND IT YET? ;LBM061O* BEQ 20$ ; YES, NOW SET UNIT ;LBM061117$: MOV D.LNK(R4),R4 ; NEXT DEVICE ;LBM084$ BNE 15$ ; MORE TO GO ;LBM0612 ; NO MORE DEVICES, CAN'T ASSIGN LUN ;LBM061D CLR (R3)+ ; COULDN'T FIND MATCHING DEVICE, DON'T BIND IT ;LBM061 BR 80$ ;LBM06120$: ;LBM061 ; ;LBM061!; at this point ;LBM061;); R2=remaining LUT entries ;LBM061:#; R3->unit # in LUT ;LBM061 ; R4->dcb ;LBM061); ;LBM0619 MOVB 2(R3),R1 ; RETRIEVE DESIRED UNIT NUMBER ;LBM061J CMPB R1,D.UNIT(R4) ; CHECK FOR UNIT NUMBER IN RANGE OF THIS DCB ;LBM084/ BLT 17$ ; TOO LOW, TRY OTHER DCBS ;LBM084 % CMPB R1,D.UNIT+1(R4) ;LBM084F0 BGT 17$ ; TOO HIGH, TRY OTHER DCBS ;LBM084C MOVB D.UNIT(R4),R0 ; EXTRACT FIRST UNIT NUMBER FROM DCB ;LBM0612 SUB R0,R1 ; GET RELATIVE UNIT NUMBER ;LBM0612 BEQ 22$ ; OPTIMIZATION FOR FIRST UCB ;LBM0610 MOV D.UCBL(R4),R0 ; GET UCB LENGTH ;LBM061, CALL $MUL ; GET OFFSET TO UCB ;LBM061>22$: ADD D.UCB(R4),R1 ; GET ADDRESS OF DESIRED UCB ;LBM0612 MOV R1,(R3)+ ; STORE UCB IN TASK LUN ;LBM061 ;LBM061DC80$: CLR (R3)+ ; CLEAR LUT FILES-11 WINDOW BLOCK POINTER ;LBM061  ;LBM061C+ DEC R2 ; ALL UNITS ASSIGNED? ;LBM061 ( BNE 10$ ; NO, DO NEXT ONE ;LBM061; ;LBM061%; BIND WINDOW BLOCKS ;LBM061 ; ;LBM061100$: ;LBM0618 MOV (SP),R0 ; RESTORE R0 POINTER TO HEADER ;LBM061; MOV H.WND(R0), R1 ; R1 => WINDOW BLOCK STORAGE ;LBM061R2 MOV (R1)+, R2 ; R2 = # WINDOW BLOCKS ;LBM061 ;LBM061;G MOV T.PCB(R5),W.BPCB(R1) ; SET TASK REGION PCB INTO WINDOW 0 ;LBM061O) DEC R2 ; ONLY TASK REGION? ;LBM0616+ BEQ 200$ ; YEP, MUST BE DONE ;LBM0616 ;LBM061 8 ADD #W.BLGH,R1 ; POINT TO NEXT WINDOW BLOCK ;LBM061 ;LBM061M2 .IFDF U$$DAS ; USER D-SPACE SUPPORT ;LBM061 ;LBM061EA BIT #T4.DSP,T.ST4(R5) ; TASK WITH SEPERATE I/D SPACE? ;LBM061W  BEQ 110$ ; NOPE ;LBM061F MOV T.PCB(R5),W.BPCB(R1) ; SET TASK D-SPACE WINDOW PCB PTR ;LBM061% DEC R2 ; LAST REGION? ;LBM061R$ BEQ 200$ ; YEP, DONE ;LBM0618 ADD #W.BLGH,R1 ; POINT TO NEXT WINDOW BLOCK ;LBM061110$: ;LBM061 .IFTF ;U$$DAS ;LBM061. ;LBM061X8 MOV T.PCBV(R5),R4 ; R4 => TASK'S PCB VECTOR ;LBM061, BEQ 200$ ; NONE, CAN'T DO IT. ;LBM061. MOVB (R4)+,R3 ; LENGTH OF VECTOR ;LBM061, TSTB (R4)+ ; SKIP USAGE COUNT ;LBM061 ;LBM0610 .IFT ;U$$DAS ;LBM061 ;LBM061N6 BIT #T4.MUT,T.ST4(R5) ; MULTI-USER TASK? ;LBM061; BEQ 120$ ; NO, SKIP RO SECTION WINDOW HANDLING ;LBM061 G MOV (R4)+,W.BPCB(R1) ; SET PCB ADDRESS IN RO SECTION WINDOW ;LBM061F3 DEC R2 ; COUNT DOWN NUMBER OF WINDOWS ;LBM061V  BEQ 200$ ; DONE ;LBM0619 DEC R3 ; COUNT DOWN NUMBER OF PCBS IN VECTOR ;LBM0610  BEQ 200$ ; DONE ;LBM0618 ADD #W.BLGH,R1 ; POINT TO NEXT WINDOW BLOCK ;LBM061 ;LBM061M8 BIT #T4.DSP,T.ST4(R5) ; USER D-SPACE TASK? ;LBM0618 BEQ 120$ ; NO, SKIP D-SPACE WINDOW HANDLING ;LBM061L MOV -2(R4),W.BPCB(R1) ; SET RO SEGMENT D-SPACE WINDOW PCB ADDRESS ;LBM0613 DEC R2 ; COUNT DOWN NUMBER OF WINDOWS ;LBM0616  BEQ 200$ ; DONE ;LBM0619 DEC R3 ; COUNT DOWN NUMBER OF PCBS IN VECTOR ;LBM061  BEQ 200$ ; DONE ;LBM0618 ADD #W.BLGH,R1 ; POINT TO NEXT WINDOW BLOCK ;LBM061 ;LBM061O .ENDC ;U$$DAS ;LBM0611 ;LBM061M?120$: BIT #1, (R4)+ ; CLUSTER LIB PCB VECTOR ENTRY? ;LBM061Q( BNE 130$ ; YEP, NO WINDOW ;LBM061 ;LBM00Ryxttt tfDATA0614> MOV -2(R4),W.BPCB(R1) ; SET PCB ADDRESS IN WINDOW ;LBM0618 ADD #W.BLGH,R1 ; POINT TO NEXT WINDOW BLOCK ;LBM076 ;LBM076 3 DEC R2 ; COUNT DOWN NUMBER OF WINDOWS ;LBM061E  BEQ 200$ ; DONE ;LBM061>130$: DEC R3 ; COUNT DOWN NUMBER OF PCBS IN VECTOR ;LBM061( BNE 120$ ; GO UNTIL DONE ;LBM061 ;LBM0611" .ENDC ; DF C$$DFB ;LBM061 ;LBM061I"200$: MOV (SP)+,R0 ;LBM0613 MOV (SP)+,R3 ; RESTORE SAVED REGISTERS ;LBM061M RETURN ;LBM061R;PJ; THIS ROUTINE SCANS THE HEADER AND VALIDATES THE LUT AND WINDOW BLOCKS.E; TASKS WHICH ARE SIMULTANEOUSLY INSTALLED IN TWO DIFFERENT SYSTEMSIJ; MAY HAVE INVALID UCBS IN THE LUT OR INVALID PCBS IN THE WINDOW BLOCKS.-; IF THIS IS THE CASE, THE TASK IS ABORTED.1;; ; INPUTS:E;;; R0=HEADER ADDRESS.; R5=TCB ADDRESS.$; ; OUTPUTS:; /; IOSB IS SET TO -1 IF THE HEADER IS INVALID.1;M; R0 - R3 ARE DESTROYED.;T"SCHDR: TST H.NLUN(R0) ;ANY LUNS? BEQ 100$ ;IF EQ NO8 BIT #T2.ABO,T.ST2(R5) ;TASK ALREADY MARKED FOR ABORT? BNE 200$ ;IF NE YESR3 MOV #$DEVHD,R2 ;POINT TO DEVICE LISTHEAD ;**-1&10$: MOV (R2),R2 ;POINT TO NEXT DCB BEQ 60$ ;IF EQ END OF LIST4 MOVB D.UNIT+1(R2),-(SP) ;CALCULATE NUMBER OF UCBS SUB D.UNIT(R2),(SP) ; INCB (SP) ;S- MOV D.UCB(R2),R4 ;GET ADDRESS OF FIRST UCB&20$: MOV R0,R1 ;COPY HEADER ADDRESS* ADD #H.NLUN,R1 ;POINT TO NUMBER OF LUNS# MOV (R1)+,R3 ;GET NUMBER OF LUNS 30$: DEC R3 ;ANY LUNS LEFT? BLT 50$ ;IF LT NO2 CMP (R1)+,R4 ;UCB MATCH?  BNE 40$ ;IF NE NOF# BIS #1,(R1) ;INDICATE UCB MATCH *40$: TST (R1)+ ;POINT TO NEXT LUT ENTRY BR 30$ ;SCAN NEXT LUT ENTRY +50$: ADD D.UCBL(R2),R4 ;POINT TO NEXT UCB) DECB (SP) ;ANY UCBS LEFT?S BNE 20$ ;IF NE YES TST (SP)+ ;CLEAN THE STACK BR 10$ ;SCAN NEXT DCBC)60$: MOV R0,R1 ;COPY ADDRESS OF HEADER1 ADD #H.NLUN,R1 ;POINT TO NUMBER OF LUT ENTRIES(* MOV (R1)+,R3 ;GET NUMBER OF LUT ENTRIES70$: DEC R3 ;ANY LEFT?$ BLT 100$ ;IF LT NO' TST (R1)+ ;POINT TO SECOND LUT WORDF BEQ 80$ ;IF EQ NOT ASSIGNEDA1 TST (R1) ;UCB ADDRESS FOUND IN DEVICE TABLES? BNE 80$ ;IF NE YES+ CLR H.NLUN(R0) ;CLEAR THE NUMBER OF LUNSX BR 150$ ;ABORT THE TASKB(80$: CLR (R1)+ ;CLEAR SECOND LUT WORD BR 70$ ;SCAN NEXT LUT ENTRY 8100$: MOV H.WND(R0),R1 ;POINT TO THE NUMBER OF WINDOWS& MOV (R1)+,R3 ;GET NUMBER OF WINDOWS%110$: DEC R3 ;LOOK FOR NEXT WINDOWM# BLE 200$ ;IF LE NO MORE WINDOWSN' ADD #W.BLGH,R1 ;POINT TO NEXT WINDOW(' MOV (R1),R0 ;IS THIS WINDOW MAPPED?8 BEQ 110$ ;IF EQ NO* MOV P.MAIN(R0),R0 ;GET MAIN PCB ADDRESS5 MOV #$PARHD,R2 ;GET ADDRESS OF PARTITION LIST HEADE-120$: MOV (R2),R2 ;GET ADDRESS OF NEXT PCBT BEQ 150$ ;IF EQ END OF LISTC+ CMP R0,R2 ;PCB FOUND IN PARTITION LIST? & BNE 120$ ;IF NE NO CONTINUE SEARCH"130$: DEC R3 ;ANY WINDOWS LEFT? BLE 200$ ;IF LE NO- ADD #W.BLGH,R1 ;POINT TO NEXT WINDOW BLOCK2 BR 110$ ;CONTINUE SCANNING&150$: MOV #S.CINS,R0 ;GET ABORT CODE MOV R5,R1 ;COPY TCB ADDRESSA  MOVB #-1,IOSB ;SET ERROR CODE  CALLR $ABTSK ;ABORT THE TASK200$: RETURN ;;+1;**-CALDMK--CALCULATE TASKS DATA SPACE MAP MASK;;DE; THIS ROUTINE IS CALLED TO CALCULATE THE I/D OVERMAP MASK FROM THEB; TASKS ADDRESSING WINDOWS.B;0 ; INPUTS:C;U; R0 = HEADER ADDRESS ; R5 = TCB ADDRESS;2 ; OUTPUTS:;A ; R1 = DATA SPACE MAPPING MASK;C$; REGISTERS R0 - R3 ARE DESTROYED.; ;- .IF DF U$$DAS&CALDMK: MOV R3,-(SP) ;SAVE REGISTERS MOV R2,-(SP) ;O MOV R1,-(SP) ;B5 MOVB H.DMAP(R0),-(SP) ;INITIALIZE D SPACE MAP MASK MOV R0,-(SP) ;L> BIT #T4.DSP,T.ST4(R5) ;TASK BUILD WITH SEPARATE I/D SPACE ?3 BEQ 20$ ;IF EQ NO, RETURN WITH ALL OVERMAP MASKK5 MOV H.WND(R0),R0 ;POINT TO NUMBER OF WINDOW BLOCKSH8 MOV (R0)+,R2 ;GET NUMBER OF WINDOWS, ADVANCE TO FIRST;10$: DEC R2 ;00Zy\ytccccCOUNT ONE LESS WINDOW (REMEMBER THAT WINDOWR& ;0 CAN NEVER BE A D SPACE WINDOW BLE 20$ ;IF LE DONE ' ADD #W.BLGH,R0 ;POINT TO NEXT WINDOW( ASSUME W.BPCB,0" TST (R0) ;THIS WINDOW MAPPED ? BEQ 10$ ;IF EQ NOM& MOVB W.BFPD(R0),R3 ;GET PDR ADDRESS# BIT #20,R3 ;MAPPED TO D SPACE ?? BEQ 10$ ;IF EQ NO,( SUB #UDSDR0,R3 ;ADJUST TO OFFSET ZERO! ASR R3 ;CONVERT TO BYTE INDEXI) MOVB W.BNPD(R0),R1 ;GET NUMBER OF PDRSF( ADD R3,R1 ;FORM ENDING PDR NUMBER +10 MOVB $BCMSK-1(R1),R1 ;GET MASK UP TO LAST APR1 BICB $BCMSK-1(R3),R1 ;GET MASK UP TO FIRST APR$) BISB R1,2(SP) ;MERGE WITH REST OF MASK  BR 10$ ;AND CONTINUE + 20$: MOV (SP)+,R0 ;RESTORE HEADER ADDRESS?.  MOVB (SP)+,H.DMAP(R0) ;REWRITE HEADER VALUE"  MOV (SP)+,R1 ;RESTORE REGISTERS  MOV (SP)+,R2 ; MOV (SP)+,R3 ;N RETURN ;AND RETURN  .ENDC ; DF U$$DAS .END $LOADR) MOVB W.BNPD(R0),R1 ;GET NUMBER OF PDRSF( ADD R3,R1 ;FORM ENDING PDR NUMBER +10 M .TITLE DRASG  .IDENT /10.05/O;M8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;  ;  ; PREVIOUSLY MODIFIED BY:C ;E ; J. R. KAUFFMAN ; ; MODIFIED BY: ;S ; K. L. NOEL 14-DEC-86 10.00 ;B8 ; KLN031 - ADD SUPPORT FOR REMOTE LUN ASSIGNMENTS AND ; RUN TIME LUN BINDING  ;O ; K. L. NOEL 06-APR-87 10.01 ;; ; KLN040 - CHANGE IMPLICIT ALUN TO BACK UP THE USER'S PCQ, ; INSTEAD OF RETURNING TO THE DIRECTIVE ;  ; K. L. NOEL 12-MAY-87 10.02 ;R; ; KLN044 - FIX DRSTS PROBLEM DURING REMOTE ALUN SERVICEW4 ; ON ERRORS, DRFIN WAS CALLED TWICE BY ACCIDENT ;M ; K. L. NOEL 27-MAY-87 10.03 ;N: ; KLN049 - SPECIAL CASE "OV" FOR IMPLICIT CALLS TO ALUN ; ; K. L. NOEL 24-JUN-87 10.04 ;O; ; KLN054 - KEEP PACKET AROUND FOR XXDRV IN CASE KILL I/O2 ; NEEDS TO BE DONE ON PREVIOUSLY ASSIGNED LUN ;I ; J. W. BERZLE 03-SEP-87 10.05 ;; ; JWB221 -- RETURN CORRECT STATUS WHEN LUN LOCKED IN USE  ; (FIXES KLN044);;N; MACRO LIBRARY CALLSU;  .MCALL TCBDF$. TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS ;KLN031 3 .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN031E ;KLN031L .MCALL CPRDF$ ;KLN0312 CPRDF$ ;KLN031K ;KLN031R; ;KLN031; LOCAL DATA ;KLN031; ;KLN0315IMPFLG: .WORD 0 ;IF = 1 CALLED AT IMPASG ;KLN031:LUNNUM: .WORD 0 ;LUN NUMBER FOR IMPLICIT ALUN ;KLN0314OLDUCB: .WORD 0 ;FORMER UCB ASSIGNMENT ;KLN031 ;KLN031 .ENDC ; C$$RTK ;KLN031N; ;KLN031!; LOCAL SYMBOLS ;KLN031F; ;KLN0310MAP6 = 140000 ;ADDRESS TO MAP APR6 ;KLN031.AS$DIC = 7 ;DIC FOR ASSIGN LUN ;KLN031:AS$SIZ = 4 ;SIZE OF DPB FOR ASSIGN LUN ;KLN031 ;KLN031L;+; **-$DRASG-ASSIGN LUN;RD; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ASSIGN A DEVICE UNIT TO A; LOGICAL UNIT NUMBER (LUN).;U; DPB FORMAT:M;B# ; WD. 00 -- DIC(7.),DPB SIZE(4.).K!!; WD. 01 -- LUN TO BE ASSIGNED.N,"; WD. 02 -- NAME OF DEVICE TO BE ASSIGNED.3#; WD. 03 -- UNIT NUMBER OF DEVICE TO BE ASSIGNED.0$;D %; INPUTS:A&; ;'; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.S%(; R3=ADDRESS OF THE LUN IN THE DPB.N1); R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. .*; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.+;C7,; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)N-;M/.; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. (/; DIRECTIVE STATUS OF +1 IS RETURNED.!0; C=1 IF DIRECTIVE IS REJECTED.-71; DIRECTIVE STATUS OF 'D.RS90' IS RETURNED IF A FILEE42; IS OPEN OR UNIT ATTACHED ON THE SPECIFIED LUN.73; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF DEVICEA4; AND/OR UNIT IS INVALID. 5;-66; ;KLN031/6; PACKET00byxttt tfDATA FORMAT FOR REMOTE ALUN ;KLN031O6; ;KLN031.6; +---------------------------+ ;KLN031.6; | | ;KLN031.6; | HEADER | ;KLN031.6; | | ;KLN031.6; +---------------------------+ ;KLN0316; | | ;KLN031(6; | ALUN DPB | ;KLN0316; | | ;KLN031.6; +---------------------------+ ;KLN031.6; | PTR TO 2ND WORD IN LUN | ;KLN031.6; +---------------------------+ ;KLN031.6; ; FORMER UCB ADDRESS ; ;KLN031.6; +---------------------------+ ;KLN031.6; | SAVED KISAR6 | ;KLN031.6; +---------------------------+ ;KLN031.6; | SAVED IMPFLG | ;KLN031.6; +---------------------------+ ;KLN0316; ;KLN0316;+ ;KLN031;26; **-$IMAS1-IMPLICIT LUN ASSIGNMENT ;KLN0316; ;KLN031Q6; THIS ROUTINE DOES AN IMPLICIT ALUN FOR THE DIRECTIVE WHICH CALLED IT ;KLN031-6; ;KLN031R6; IF SYSTEM SUPPORTS REMOTE TASK SERVICES, A CALL TO CPRAME WILL BE MADE ;KLN031S6; TO FIND THE LUN ASSIGNMENT. NO ATTEMPT IS MADE TO SAVE THE CONTEXT OF ;KLN031-S6; THE ORIGINAL DIRECTIVE. THE PC OF THE USER TASK IS BACKED UP OVER THE ;KLN031-?6; THE TRAP SO THE DIRECTIVE WILL BE ISSUED AGAIN. ;KLN031 6; ;KLN0316; INPUTS: ;KLN031 6; ;KLN031:6; R1 - POINTER TO 2ND LUN WORD OF TASK HEADER ;KLN03186; R3 - POINTER TO THE LUN NUMBER IN THE DPB ;KLN0316; ;KLN031R6; OUTPUTS: ;KLN0316; ;KLN031Q6; THE LUT ENTRY IS FILLED IN WITH THE UCB OF THE DEVICE. IF THE DEVICE ;KLN031 M6; IS NOT FOUND THE DIRECTIVE STATUS OF 'D.RS92' IS RETURNED ;KLN031E6; ;KLN0316;- ;KLN031E6 ;KLN031.-7$DRASG::CALL $MPLUN ;MAP LUN TO DEVICE UCB #8 TST (R1) ;FILE ACCESSED ON LUN?1!8 BEQ 99$ ;IF EQ NO ;KLN031O48 DRSTS D.RS90 ;RETURN WITH ERROR STATUS ;KLN031899$: ; ;KLN0318 ;KLN031N/8 .IF DF C$$RTB ; RUN TIME BINDING ;KLN031;8 ;KLN031N48 CLR IMPFLG ;INDICATE NOT IMPLICIT ALUN ;KLN031'8 BR RTK ;JOIN COMMON CODE ;KLN031E8 ;KLN031'8$IMAS1:: ;KLN0318 ;KLN0310=8 MOV #1,IMPFLG ;INDICATE THIS WAS AN IMPLICIT CALL ;KLN031L,8 CLR R0 ;NO FORMER UCB ADDRESS ;KLN0318 ;KLN031N8RTK: ;KLN031 68 MOV R0,OLDUCB ;SAVE FORMER UCB ASSIGNMENT ;KLN031,8 MOV -2(R3),R2 ;GET LUN NUMBER ;KLN0318 ;KLN031D28 .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN0318 ;KLN031P@8 BIT #F5.RTK,$FMSK5 ;ARE WE USING REMOTE TASK SUPPORT ;KLN031#8 BNE 101$ ;IF NE YES ;KLN031338 JMP 10$ ;DO NON REMOTE LUN ASSIGNMENT ;KLN0318; ;KLN03118; GET A REQUEST PACKET FROM CPRBUF ;KLN031 8; ;KLN031:8101$: MOV R1,R4 ;SAVE POINTER TO 2ND LUN WORD ;KLN031,8 MOV R2,LUNNUM ;SAVE LUN NUMBER ;KLN031-8 MOV R3,R5 ;SAVE POINTER TO DPB ;KLN031 48 MOV #1,R1 ;SET FOR 1 BLOCK FROM CPRBUF ;KLN031D8 MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START ;KLN03128 CALL $CPALO ;GET BUFFER FROM CPRBUF ;KLN0318 ;KLN031 8; ;KLN031D8; GET DEVICE AND UNIT NUMBER BEFORE WE UNMAP THE HEADER ;KLN031T8; - FOR IMPLICIT ALUN, THE DEVICE AND UNIT NUMBER IS IN THE LUT EXTENSION ;KLN031R8; OFFSET INTO LUT IS THE SAME AS IN THE HEADER LUT. THE ADDRESS OF ;KLN031Y8; THE PROTO LUN IS GOTTEN BY SUBTRACTING H.LUN+140000 FROM THE ADDRESS OF THE;KLN031PO8; 2ND LUN WORD THEN ADDING THE BASE ADDRESS OF THE LUT EXTENSION. ;KLN0310R8; - FOR REGULAR REMOTE ALUN, THE DEVICE AND UNIT NUMBER ARE GOTTEN FROM ;KLN0318; THE DPB ;KLN0318; ;KLN031)8 TST IMPFLG ;IMPLICIT ALUN ;KLN031I"8 BEQ 107$ ;IF EQ NO ;KLN0318 ;KLN031T48 MOV R4,R1 ;GET ADDRESS OF 2ND LUN WORD ;KLN031@8 SUB #H.LUN+2+MAP6,R1 ;GET OFFSET INTO LUT EXTENSION ;KL00jy\ytccccN03168 ADD MAP6+H.LUTE,R1 ;ADD EXTENSION OFFSET ;KLN031+8 MOV (R1)+,R2 ;GET DEVICE NAME ;KLN031N.8 BEQ 106$ ;IF EQ, UNASSIGNED LUN ;KLN031+8 MOV (R1),R3 ;GET UNIT NUMBER ;KLN031E8; ;KLN049L8; SPECIAL CASE OV - IF THIS IS AN IMPLICIT CALL, DON'T LET CPRAME ;KLN049/8; TRY TO TRANSLATE THE LOGICAL ;KLN04978; ;KLN049(8 CMP #"OV,R2 ;IS THIS OV? ;KLN049"8 BNE 109$ ;IF NE NO ;KLN0498 ;KLN0496-8 CALL $CPDEA ;DEALLOCATE PACKET ;KLN0498 ;KLN049A38 MOV $TKTCB,R5 ;GET CURRENT TASK'S TCB ;KLN049D38 MOV T.LDV(R5),R1 ;GET LOAD DEVICE UCB ;KLN049E(8 JMP 30$ ;JOIN COMMON CODE ;KLN0498 ;KLN049=8106$: DRSTS D.RS5 ;RETURN WITH ERROR CODE IE.ULN ;KLN031C8 ;KLN031R48107$: MOV (R5),R2 ;GET DEVICE FROM DPB ;KLN031,8 MOV 2(R5),R3 ; AND UNIT NUMBER ;KLN0318; ;KLN03148; FILL IN THE HEADER AND THE ALUN DPB ;KLN0318; ;KLN031?8109$: MOV KISAR6,-(SP) ;SAVE MAPPING TO TASK HEADER ;KLN031$(8 MOV R0,KISAR6 ;MAP PACKET ;KLN03178 MOV #MAP6,R1 ;GET ADDRESS OF PACKET HEADER ;KLN03178 MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUST ;KLN031N(8 CLRB H$ICNT(R1) ;NO ITEMS ;KLN031/8 ADD #P$DPB,R1 ;POINT TO DPB AREA ;KLN031(8 MOVB #AS$DIC,(R1)+ ;DIC ;KLN031(8 MOVB #AS$SIZ,(R1)+ ;SIZE ;KLN031/8 MOV LUNNUM,(R1)+ ;COPY LUN NUMBER ;KLN031 (8 MOV R2,(R1)+ ;DEVICE NAME ;KLN031(8 MOV R3,(R1)+ ;UNIT NUMBER ;KLN0318; ;KLN03168; FILL IN THE COMMON EXTRA STORAGE AREA ;KLN0318; ;KLN03168 MOV R4,(R1)+ ;SAVE POINTER TO TASK HEADER ;KLN03148 MOV OLDUCB,(R1)+ ;SAVE OLD UCB ADDRESS ;KLN03158 MOV (SP)+,(R1)+ ;SAVE MAPPING TO HEADER ;KLN031O8; ;KLN031S8; IF THIS IS AN IMPLICIT ALUN, SET SN$IMP SO DRFIN WILL NOT BE CALLED YET ;KLN031L8; ;KLN031/8 MOV #SN$DIR,R2 ;SET DIRETIVE FLAG ;KLN031 .8 MOV IMPFLG,(R1) ;IMPLICIT ALUN ;KLN031+8 BEQ 110$ ;IF EQ NOT IMPLICIT ;KLN031 /8 MOV #SN$IMP,R2 ;SET IMPLICIT FLAG ;KLN03118; ;KLN031+8; SEND PACKET TO THE DRIVER ;KLN031R8; ;KLN031C8110$: CPSEN$ R2,R0,# ;SEND REQUEST TO CPRSYS ;KLN031M8; ;KLN031H8; MAP PACKET AND RETRIEVE IMPFLG AND POINTER INTO THE HEADER ;KLN0318; ;KLN031(8 MOV R0,KISAR6 ;MAP PACKET ;KLN03118 MOV #MAP6,R1 ;GET ADDRESS OF HEADER ;KLN031*8 ADD #P$DPB,R1 ;POINT TO DPB ;KLN03138 MOV R0,$CPPKT ;SAVE ADDRESS OF PACKET ;KLN054V/8 MOV 2(R1),$CPLUN ;SAVE LUN NUMBER ;KLN054 :8 MOV 10(R1),R4 ;GET ADDRESS OF SECOND LUN WORD ;KLN03178 MOV 12(R1),OLDUCB ;RESTORE OLD UCB ADDRESS ;KLN031 48 MOV 16(R1),IMPFLG ;GET SAVED FLAG WORD ;KLN0318; ;KLN031(8; CHECK STATUS RETURNED ;KLN031J8; - IF SUCCESS, LOOK FOR DEVICE NAME AS A GENERIC DEVICE TYPE ;KLN031Y8; - IF FAILURE AND DEVICE NAME IS NON ZERO, LOOK FOR LOCAL DEVICES OF THAT NAME;KLN031LB8; - IF DEVICE NAME IS ZERO, RETURN WITH ERROR STATUS ;KLN0318; ;KLN03188128$: MOV 4(R1),R5 ;GET RETURNED DEVICE NAME ;KLN031%8 BEQ 200$ ;IF EQ ERROR ;KLN031U8 ;KLN031D;8 CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURNED? ;KLN031 8 BNE 5$ ;IF NE NO ;KLN0318 ;KLN031E>8 MOV 14(R1),KISAR6 ;RESTORE MAPPING TO TASK HEADER ;KLN0318 ;KLN031;8; ;KLN031/8; SEARCH FOR GENERIC DEVICE TYPE ;KLN031E8; ;KLN031D8 MOV #$DEVHD,R0 ;SEARCH DEVICE LIST FOR RETURN DEVICE TYPE ;KLN031.8130$: MOV (R0),R0 ;GET NEXT DCB ;KLN031&8 BEQ 200$ ;IF EQ NO DCB ;KLN031,8 CMP R5,D.NAM(R0) ;IS THIS IT? ;KLN031"8 BNE 130$ ;IF NE NO ;KLN031H8 CMP R0,$XXLOW ;IS THIS A GENERIC DEVICE? HIGHER THAT LOW DCB? ;KLN031"8 BLO 130$ ;IF LO NO ;KLN03118 CMP R0,$XXHGH ;LOWER THAN HIGH DCB? ;KLN031 "8 BHI 130$ ;IF HI NO ;KLN03158 CMPB #377,D.UNIT(R0) ;IS THIS UNIT 377? ;KLN03128 BNE 130$ ;IF NE NO, NOT GENERIC DCB ;KL00ryxttt tfDATAN0318; ;KLN031-8; PREPARE TO JOIN COMMON CODE ;KLN031D8; ;KLN03158 MOV D.UCB(R0),R1 ;PUT UCB ADDRESS IN R1 ;KLN031ID8 MOV OLDUCB,-(SP) ;PUT OLD ASSIGNMENT UCB ADDRESS ON STACK ;KLN031'8 JMP 25$ ;JOIN COMON CODE ;KLN031T8 ;KLN0318200$: ;KLN031/8 MOV $CPPKT,R0 ;GET PACKET ADDRESS ;KLN031 -8 CALL $CPDEA ;DEALLOCATE PACKET ;KLN03158 CLR $CPPKT ;INDICATE PACKET DEALLOCATED ;KLN0318 ;KLN031N*8 TST IMPFLG ;IMPLICIT ALUN? ;KLN031#8 BNE 210$ ;IF NE YES ;KLN031D98 RETURN ;RETURN WITH ERROR CODE SET BY KXDRV ;KLN031 =8210$: DRSTS D.RS5 ;RETURN WITH ERROR CODE IE.ULN ;KLN031D8 ;KLN031S85$: ;KLN0318; ;KLN03108; GET INFO SET UP FOR COMMON CODE ;KLN0318; ;KLN03198 MOV 10(R1),R4 ;PTR TO 2ND LUN WORD OF HEADER ;KLN031D,8 MOV 4(R1),R2 ;SAVE DEVICE NAME ;KLN031,8 MOV 6(R1),R0 ;SAVE UNIT NUMBER ;KLN03108 MOV 14(R1),KISAR6 ;MAP TASK HEADER ;KLN031.8 MOV R4,R1 ;PTR INTO TASK HEADER ;KLN03168 MOV $TKTCB,R5 ;CURRENT TASK'S TCB ADDRESS ;KLN0318; ;KLN031:8; GET OLD ASSIGNMENT UCB ADDRESS FROM HEADER ;KLN0318; ;KLN03108 MOV OLDUCB,-(SP) ;SAVE UCB ADDRESS ;KLN0318 ;KLN031 '8 BR 12$ ;JOIN COMMON CODE ;KLN031(8 ;KLN031N810$: ;KLN031D8 .ENDC ;C$$RTK ;KLN031M8 ;KLN0316*8 TST IMPFLG ;IMPLICIT ALUN? ;KLN031!8 BEQ 11$ ;IF EQ NO ;KLN031;8; ;KLN031P@8; GET DEVICE AND UNIT NUMBER FROM HEADER EXTENSION ;KLN0318; ;KLN03148 MOV R1,R4 ;GET ADDRESS OF 2ND LUN WORD ;KLN031@8 SUB #H.LUN+2+MAP6,R1 ;GET OFFSET INTO LUT EXTENSION ;KLN03168 ADD MAP6+H.LUTE,R1 ;ADD EXTENSION OFFSET ;KLN031+8 MOV (R1)+,R2 ;GET DEVICE NAME ;KLN031 +8 MOV (R1),R0 ;GET UNIT NUMBER ;KLN0318; ;KLN031)8; SET UP OLD UCB ADDRESS ;KLN031L8; ;KLN03118 CLR -(SP) ;NO PREVIOUS UCB ADDRESS ;KLN031 8; ;KLN049P8; SPECIAL CASE OV - IF OV IS IN LUN EXTENSION, DON'T DO LOGICAL NAME ;KLN049 8; TRANSLATION ;KLN0498; ;KLN049(8 CMP #"OV,R2 ;IS THIS OV? ;KLN049!8 BNE 12$ ;IF EQ NO ;KLN049+8 ;KLN049I,8 MOV $TKTCB,R5 ;GET TASK'S TCB ;KLN04938 MOV T.LDV(R5),R1 ;GET LOAD DEVICE TCB ;KLN049R8 ;KLN049 (8 JMP 26$ ;JOIN COMMON CODE ;KLN049811$: ;KLN031 8 .ENDC ;C$$RTB ;KLN0318 ;KLN031K-: MOV R0,-(SP) ;SAVE ADDRESS OF UCB ;**-1O.; MOV R1,R4 ;SAVE ADDRESS OF SECOND LUN WORD#< MOV (R3)+,R2 ;GET NAME OF DEVICE != MOVB (R3),R0 ;GET UNIT NUMBER>??12$: ;KLN031L1? .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN031 ? ;KLN031K0? BIT #F5.RTK,$FMSK5 ;REMOTE TASKS? ;KLN031"? BNE 17$ ;IF NE YES ;KLN031? ;KLN0314? .ENDC ;C$$RTK ;KLN031 ? ;KLN031 @ .IF DF M$$MUPA%B BIT #T3.SLV,T.ST3(R5) ;SLAVE TASK? 3C BNE 17$ ;IF NE YES, BYPASS LOGICAL DEVICE TABLE-DE .ENDCFGHI .IF DF L$$GCLJ/K MOV T.UCB(R5),R1 ;GET THE CURRENT TASK'S TI: 8L CALL $GTUSR ;RESOLVE RAW UCB AND SET USER HASH TABLE;M MOV #$LNTDR,-(SP) ;RESOLVE ANY LOGICAL NAME TRANSLATIONS 7N CALL $MPDC3 ;USE ROUTINE IN FOURTH DIRECTIVE COMMON;0O BCC 17$ ;IF CC, SUCCESSFULLY MATCHED LOGICAL4P TST R3 ;SEE IF ERROR OCCURRED OR NO MATCH AT ALL*P BEQ 125$ ;IF EQ VALID MATCH ;KLN0543P JMP 50$ ;INVALID MATCH - RETURN ERROR ;KLN054EP125$: ;KLN054R ;**-1NS .IFTFT3U MOV #$LOGHD,R3 ;POINT TO LOGICAL ASSIGNMENT LISTC.V13$: MOV (R3),R3 ;GET ADDRESS OF NEXT ENTRYW BEQ 17$ ;IF EQ END OF LIST+X TSTB L.TYPE(R3) ;SYSTEM WIDE ASSIGNMENT?TY BEQ 15$ ;IF EQ YES1Z CMP L.UCB(R3),T.UCB(R5) ;TI UCB ADDRESS MATCH?B[ BNE 13$ ;IF NE NOF+\15$: CMP R2,L.NAM(R3) ;DEVICE NAME MATCH?R] BNE 13$ ;IF NE NOT)^ CMPB R0,L.UNIT(R3) ;UNIT NUMBER MATCH?L_ BNE 13$ ;IF NE NOL/` MOV L.ASG00zy\ytcccc(R3),R1 ;GET ASSIGNMENT UCB ADDRESS !a BR 25$ ;FINISH IN COMMON CODE.bc .ENDC ;L$$GCLd6e17$: MOV #$DEVHD,R3 ;POINT TO PHYSICAL DEVICE TABLES,f20$: MOV (R3),R3 ;GET ADDRESS OF NEXT DCB g BEQ 50$ ;IF EQ END OF TABLES'h CMP R2,D.NAM(R3) ;DEVICE NAME MATCH?Ii BNE 20$ ;IF NE NORi ;KLN031A1i .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN031Ri ;KLN031A0i BIT #F5.RTK,$FMSK5 ;REMOTE TASKS? ;KLN031!i BEQ 23$ ;IF EQ NO ;KLN031Ei; ;KLN031)i; TEST FOR GENERIC DEVICE ;KLN031 i; ;KLN031Hi CMP R0,$XXLOW ;IS THIS A GENERIC DEVICE? HIGHER THAN LOW DCB? ;KLN031!i BLO 23$ ;IF LO NO ;KLN031(1i CMP R0,$XXHGH ;LOWER THAN HIGH DCB? ;KLN031Q!i BHI 23$ ;IF HI NO ;KLN031 &i BR 20$ ;REJECT THIS ONE ;KLN031i ;KLN031N%i23$: ;REFERENCE LABEL ;KLN031Pi .ENDC ;C$$RTK ;KLN031Ni ;KLN031$Aj CMPB R0,D.UNIT(R3) ;UNIT GREATER THAN OR EQUAL TO LOW BOUNDRY?Ek BLO 20$ ;IF LO NOAl CMPB R0,D.UNIT+1(R3) ;UNIT LESS THAN OR EQUAL TO HIGH BOUNDRY?m BHI 20$ ;IF HI NO 4n SUB D.UNIT(R3),R0 ;CALCULATE RELATIVE UNIT NUMBER$o BIC #177400,R0 ;CLEAR EXCESS BITS0p MOV D.UCBL(R3),R1 ;GET LENGTH OF UCB IN BYTES(q CALL $MUL ;CALCULATE NUMBER OF BYTES-r ADD D.UCB(R3),R1 ;CALCULATE ADDRESS OF UCBNs25$: ;REF LABELtuv .IF DF V$$TRMw$x MOV (R1),R3 ;POINT TO DEVICE DCB8y CMP D.NAM(R3),#"VT ;IS THE DEVICE A VIRTUAL TERMINAL?z BNE 26$ ;IF NE NOO1{ CMP U.PTCB(R1),R5 ;IS ISSUING TASK THE PARENT?S| BEQ 26$ ;IF EQ NOB2} CMP R1,T.UCB(R5) ;IS ISSUING TASK AN OFFSPRING?~ BNE 50$ ;IF NE NOU .ENDC126$: MOV (SP)+,R3 ;WAS LUN PREVIOUSLY ASSIGNED?E BEQ 30$ ;IF EQ NOS3 CMP R5,U.ATT(R3) ;UNIT ATTACHED TO CURRENT TASK?U BNE 27$ ;IF NE NOD0 MOV R1,-(SP) ;SAVE NEW ASSIGNMENT UCB ADDRESS MOV R1,R0 ;COPY UCB ADDRESSP( CALL $MPLND ;MAP TO REAL UCB ADDRESS4 MOV (SP)+,R1 ;RETRIEVE NEW ASSIGNMENT UCB ADDRESS0 CMP R0,R3 ;NEW ASSIGNMENT TO SAME FINAL UCB? BNE 35$ ;IF NE NO 227$: MOV R3,R5 ;COPY OLD ASSIGNMENT UCB ADDRESS< MOV #$IOKIL,-(SP) ;SET TO KILL I/O ON PREVIOUS ASSIGNMENT730$: MOV R1,-2(R4) ;ASSIGN LUN TO NEW UNIT ;KLN031I ;KLN031., .IF DF C$$RTK ;REMOTE TASKS ;KLN031 ;KLN031; ;KLN031P; DEALLOCATE CPRBUF PACKET ONLY IF AN I/O KILL HAS BEEN REQUESTED ON ;KLN031!; A GENERIC UNIT ;KLN031 ; ;KLN0310 BIT #F5.RTK,$FMSK5 ;REMOTE TASKS? ;KLN031" BEQ 315$ ;IF EQ NO ;KLN031 ;KLN031 ; CMP #$IOKIL,(SP) ;HAS I/O KILL BEEN REQUESTED? ;KLN031O4 BNE 305$ ;IF NE NO - DEALLOCATE PACKET ;KLN031 ;KLN031N7 CMP (R5),$XXLOW ;IS THIS A GENERIC DEVICE? ;KLN031;" BLO 305$ ;IF LO NO ;KLN0316 CMP (R5),$XXHGH ;IS THIS A GENERIC DEVICE ;KLN031? BLOS 31$ ;IF LOS, YES - DON'T DEALLOCATE PACKET YET ;KLN031 305$: ;KLN0312 MOV $CPPKT,R0 ;GET ADDRESS OF PACKET ;KLN031- CALL $CPDEA ;DEALLOCATE IT NOW ;KLN031 9 CLR $CPPKT ;INDICATE WE ARE DONE WITH PACKET ;KLN031I31$: ;KLN031 ; ;KLN031K; IF THIS IS A REMOTE SYSTEM, THE KX DRIVER SET THE ERROR STATUS ;KLN031X; ;KLN031 = MOV #IS.SUC,-(SP) ;OVERRIDE CPRSYS' ERROR STATUS ;KLN031( MTPD$ @#H.DSW ; ;KLN031315$: ;KLN031 .ENDC ; C$$RTK ;KLN031 ;KLN031. .IF DF C$$RTB ;RUN TIME BINDING ;KLN031; ;KLN031Q; WE SHOULDN'T NEED A RUN TIME CONDITIONAL HERE, BECAUSE IF RTB IS NOT ;KLN031R;; SUPPORTED, IMPFLG WILL NEVER GET SET ANYWAY ;KLN031 ; ;KLN031) TST IMPFLG ;IMPLICIT ALUN ;KLN031 ! BEQ 32$ ;IF EQ NO ;KLN031  ;KLN031V3 SUB #2,$UMPC ;BACK UP THE USER'S PC ;KLN03130 MOV #$STACK-22,SP ;DON'T DO DRFIN ;KLN031 ;KLN031C32$: ;KLN031 .ENDC ; C$$RTB ;KLN031$ ;KLN031N RETURN ; ;**-1 ;KLN044L)00yyttt tfDATA35$: MOV R1,-(SP) ;SAVE NEW UCB POINTERU .IF DF X$$HDR) MOV $SAHPT,R1 ;GET TASK HEADER ADDRESSA .IFFN) MOV $HEADR,R1 ;GET TASK HEADER ADDRESSL .ENDC. ADD #H.NLUN,R1 ;POINT TO THE NUMBER OF LUNS MOV (R1),-(SP) ;PICK UP COUNT737$: CMP (R1)+,(R1)+ ;ADVANCE TO NEXT UCB POINTER + 2;, CMP R1,R4 ;SAME LUN AS BEING REASSIGNED? BEQ 39$ ;IF EQ YES) MOV -2(R1),R0 ;GET THIS LUN ASSIGNMENT $ BEQ 39$ ;IF EQ, LUN NOT ASSIGNED0 CALL $MPLND ;FOLLOW ANY REDIRECT; HANDLE TI:5 CMP R0,R3 ;LUN ASSIGNED TO SAME DEV AS REASS LUN?P BNE 39$ ;NO, BRANCHR TST (SP)+ ;REMOVE COUNTV' MOV (SP)+,R1 ;GET NEW LUN ASSIGNMENT, BR 27$ ;IF EQ YES, ATTACH CAN BE IGNORED#39$: DEC (SP) ;POINT TO NEXT LUNC BGT 37$ ;TRY AGAIN CMP (SP)+,(SP)+ ;CLEAN STACKO*40$: DRSTS D.RS90 ;SET DIRECTIVE STATUS50$: ;KLN044 1 .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN044N ;KLN044Q0 BIT #F5.RTK,$FMSK5 ;REMOTE TASKS? ;KLN044! BEQ 55$ ;IF EQ NO ;KLN0443 ;KLN044M5 .IF DF C$$RTB ;RUN TIME BINDING SUPPORT ;KLN044( ;KLN044& TST (SP)+ ;CLEAN STACK ;KLN044, JMP 200$ ;COMMON CODE AT 200$ ;KLN044 ;KLN044O .ENDC ;C$$RTB ;KLN044Y ;KLN044( .ENDC ;C$$RTK ;KLN044D ;KLN044 "55$: DRSTS D.RS92 ;KLN044 ;**-1M .ENDSUPPORT ;KLN044N ;KLN044Q0 BIT #F5.RTK,$FMSK5 ;REMOTE TASKS? ;KL .TITLE DRREQN .IDENT /05.00/P E;O5; COPYRIGHT (C) 1983, 1984 BY DIGITAL EQUIPMENT CORP.Q; ALL RIGHTS RESERVEDS;; D. N. CUTLER 13-SEP-73; ;O; MODIFIED BY:;;; J. W. BERZLE 26-JUN-84 05.00; -; JWB085 -- PROPAGATE CONTEXT BLOCK POINTER P; (NAMED DIRECTORY SUPPORT)1;0;2;A; REQUEST TASK DIRECTIVE;E; MACRO LIBRARY CALLSN;C  .IF NDF P$$OFF  .MCALL TCBDF$, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+; **-$DRREQ-REQUEST TASK;.>; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO REQUEST THE EXECUTION; OF A SPECIFIED TASK.;P ; DPB FORMAT:S;S"; WD. 00 -- DIC(11.),DPB SIZE(7.).$; WD. 01 -- FIRST HALF OF TASK NAME.%; WD. 02 -- SECOND HALF OF TASK NAME.-=; WD. 03 -- PARTITION NAME-NOT SUPPORTED BUT MUST BE PRESENT.O=; WD. 04 -- PARTITION NAME-NOT SUPPORTED BUT BUST BE PRESENT. ?; WD. 05 -- REQUEST PRIORITY-NOT SUPPORTED BUT MUST BE PRESENT.C; WD. 06 -- REQUEST UIC.; ; INPUTS:L;O4; R0=ADDRESS OF THE TCB OF THE TASK TO BE REQUESTED.A; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO BE REQUESTED.E9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.D.; R3=ADDRESS OF THE PARTITION NAME IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;E5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)S;E-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.P&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.O7; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF PARTITION 2; CONTROL BLOCK OR TASK CONTROL BLOCK CANNOT BE ; ALLOCATED. D9; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF SPECIFIED. D; TASK IS ALREADY ACTIVE. ; =; NOTE: IF THE SYSTEM SUPPORTS PARENT/OFFSPRING TASKING, THE .; REQUEST DIRECTIVE IS IN THE MODULE DRSPW. ;T/; ON SYSTEMS SUPPORTING PROTOTYPE TCBS AND NONF,; RESIDENT TASK HEADERS, KISAR6 MAY MAP THE; THE PROTOTYPE TCB AT ENTRY.; ;-$DRREQ:: ; T  .IF DF R$$DSP D 4 CLR -(SP) ;INIT DISPATCHING FLAG TO NO DISPATCHING% MOV 6(R3),-(SP) ;SAVE REQUEST UIC A7 CMP T.NAM(R0),#^R... ;DOES TASK HAVE MULTI-USER NAME? L BNE 5$ ;IF NE NO * MOV R0,-(SP) ;SAVE TEMPLATE TCB ADDRESS 6 MOV T.NAM+2(R0),R1 ;PICK UP SECOND WORD OF TASK NAME / MOV T.UCB(R5),R0 ;PICK UP TARGET UCB ADDRESS O2 CALL $SRMUT ;SEARCH FOR APPROPRIATE COPY OF TCB ! BCC 4$ ;IF CC COPY WAS FOUND A6 MOV #T.LGTH,R1 ;ELSE PICK UP SIZE OF TCB TO ALLOCATE ! CALL $ALOCB ;ALLOCATE A 00yytccccTCB % BCS 15$ ;IF CS ALLOCATION FAILURE L2 MOV R0,4(SP) ;SAVE ALLOCATED TCB ADDRESS AS FLAG . MOV (SP),R1 ;RETRIEVE TEMPLATE TCB ADDRESS 2 CALL $TCBCP ;PERFORM COPY AND INSTALL OPERATION 4$: TST (SP)+ ;CLEAN STACK )5$: MOV (SP)+,R1 ;RETRIEVE REQUEST UIC O .IFF ) % MOV 6(R3),R1 ;PICK UP REQUEST UIC S  .IFTF C .IF DF M$$MUP .IF DF X$$HDR/ MOV $SAHDB,KISAR6 ;MAP NONRESIDENT TASK HEADERC .ENDC2 CALL $UISET ;ESTABLISH DEFAULT AND CURRENT UIC'S .ENDC2 MOV T.UCB(R5),R2 ;GET ADDRESS OF REQUESTER TI UCB P .IF DF N$$DIR. MOV T.CTX(R5),$CTXPT ;PROPAGATE CONTEXT BLOCK .ENDC ;DF N$$DIRO% CALL $TSKRP ;REQUEST TASK EXECUTION $ BCS 10$ ;IF CS TASK ALREADY ACTIVE .IFT ) ' MOV (SP)+,R0 ;WAS A TCB DISPATCHED?  BEQ 6$ ;IF EQ NO 0 BIS #T3.REM,T.ST3(R0) ;SET REMOVE ON EXIT BIT  .ENDC -6$: RETURN ;RETURN DIRECTIVE STATUS OF +1 T*10$: BEQ 20$ ;IF EQ TASK ALREADY ACTIVE  .IF DF R$$DSP . ' MOV (SP)+,R0 ;WAS A TCB DISPATCHED? E BEQ 15$ ;IF EQ NO $! CALL $REMOV ;REMOVE THE TASK  .ENDC *15$: DRSTS D.RS1 ;SET DIRECTIVE STATUS *20$: DRSTS D.RS7 ;SET DIRECTIVE STATUS  .ENDC  .ENDBIT  .ENDC -6$: RETURN ;RETURN DIR .TITLE DBDRVF .IDENT /16.10/2;I<; COPYRIGHT (c) 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;M<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; P. J. BEZEREDI 19-SEP-79;S; MODIFIED FOR M-PLUS V2.0 BY:;; R. T. PERRON; P. J. BEZEREDI ; T. LEKAS; ; MODIFIED BY:; ; P. J. CARR 9-JUN-82 16.01N;T'; PJC052 -- CORRECT SEEK OPTIMIZATION. ; ; P. J. CARR 27-AUG-82 16.02;R:; PJC063 -- COUNT EACH DIFFERENT OFFSET AS 1 RETRY DURING; OFFSET RECOVERY.;N; P. J. CARR 27-AUG-82 16.03;R9; PJC064 -- DON'T LOG MULTIPLE ERRORS DURING MULTI-BLOCKM,; TRANSFERS THAT USE THE DBRTRY PATHWAY.;H; P. J. CARR 27-AUG-82 16.04;.:; PJC065 -- CORRECT HARD ECC RECOVERY ON THE LAST PARTIAL&; BLOCK OF A MULTI-BLOCK TRANSFER.;L; P. J. CARR 27-AUG-82 16.05;.:; PJC066 -- LOG THE UNSUCCESSFUL RECALIBRATE AFTER A SEEK; FAILURE.;.; P. J. CARR 27-AUG-82 16.06;P9; PJC067 -- CORRECT THE BRANCH IN THE DATA LATE RECOVERY ; ROUTINE.;; J. GALLANT 2-MAR-83 16.07.;8; JG0049 -- FIX THE CASE WHERE DTE AND DCK ARE COMBINED;M; J. GALLANT 7-MAR-83 16.08E;R6; JG0041 -- FIX SO THAT A FMT AND OTHER I/O CAN OCCUR,; TOGETHER WITH OVERLAP SEEKS TURNED ON.2; MAKE RECALIBRATE A SEEK FUNCTION RATHER THAN!; A DATA TRANSFER FUNCTION. ;P; L. KOGAN 17-APR-84 16.09;E/; LK001 -- ENTER NON-EXISTENT DRIVE ERROR INTOJ; ERROR LOG FILE6;P; B. S. MCCARTHY 6-AUG-85 16.10 ;T/; BM368 -- ADD CONDITIONAL SKIP OF FIRST DRIVEG!; NOT READY ERROR FOR POWERFAIL4;--; RH11/RH70-RP04/05/06 OVERLAPPED SEEK DRIVERM;  .MCALL HWDDF$,PKTDF$E$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS; ,; DEVICE REGISTER AND STATUS BIT DEFINITIONS;A%RPCS1=0 ;CONTROL STATUS REGISTER 1TIE=100 ;INTERRUPT ENABLEKTRE=40000 ;TRANSFER ERRORL*MCPE=20000 ;MASSBUS CONTROL PARITY ERROR#DVA=4000 ;DRIVE AVAILABLE TO PORTCRPWC=2 ;WORD COUNT REGISTER"RPBA=4 ;BUFFER ADDRESS REGISTER(RPDA=6 ;DESIRED TRACK/SECTOR REGISTER%RPCS2=10 ;CONTROL STATUS REGISTER 2EDLT=100000 ;DATA LATE ERRORPWCE=40000 ;WRITE CHECK ERROR UPE=20000 ;UNIBUS PARITY ERROR#NED=10000 ;NONEXISTENT DISK ERRORS$NEM=4000 ;NONEXISTENT MEMORY ERRORPGE=2000 ;PROGRAMMING ERRORS!MXF=1000 ;MISSED TRANSFER ERRORL%MDPE=400 ;MASSBUS DATA PARITY ERROR2!RPDS=12 ;DRIVE STATUS REGISTERERR=40000 ;E00yyttt tfDATARROR SUMMARY BIT$PIP=20000 ;POSITIONING IN PROGRESSMOL=10000 ;MEDIUM ONLINEWRL=4000 ;WRITE LOCKED DRIVE$PGM=1000 ;PROGRAMMABLE PORT SELECT!DPR=400 ;DRIVE PRESENT ON PORT DRY=200 ;DRIVE READY0VV=100 ;VOLUME VALID"RPER1=14 ;ERROR SUMMARY REGISTERDCK=100000 ;DATA CHECK ERRORUNS=40000 ;DRIVE UNSAFEO!OPI=20000 ;OPERATION INCOMPLETERDTE=10000 ;DRIVE TIMING ERROR WLE=4000 ;WRITE LOCK ERROR IAE=2000 ;INVALID DISK ADDRESSAOE=1000 ;ADDRESS OVERFLOWHCRC=400 ;HEADER CRC ERROR HCE=200 ;HEADER COMPARE ERRORECH=100 ;ECC HARD ERRORWCF=40 ;WRITE CLOCK FAILUREFER=20 ;FORMAT ERRORP#CPE=10 ;CONTROL BUS PARITY ERROR !RMR=4 ;REGISTER MODIFY REFUSEDILR=2 ;ILLEGAL REGISTERILF=1 ;ILLEGAL FUNCTION&RPAS=16 ;ATTENTION SUMMARY REGISTER RPDBR=22 ;DATA BUFFER REGISTERRPDT=26 ;DRIVE TYPE REGISTER=!RPOF=32 ;DRIVE OFFSET REGISTER0 FMT22=10000 ;FORMAT (1=16 BIT)ECI=4000 ;ECC INHIBIT0"HCI=2000 ;HEADER COMPARE INHIBIT%RPDC=34 ;DESIREDED CYLINDER NUMBERA#RPCC=36 ;CURRENT CYLINDER NUMBERRPER2=40 ;ERROR REGISTER 2!RPEC1=44 ;ECC POSITION REGISTER RPEC2=46 ;ECC PATTERN REGISTER;;; LOCAL EQUATED SYMBOLS;=,XCT=1 ;FUNCTION HAS BEEN EXECUTED (1=YES)'ERL=2 ;ERROR HAS BEEN LOGGED (1=YES)T)IHC=4 ;INHIBIT HEADER COMPARES (1=YES)2%ADR=10 ;ADDRESS BITS SETUP (1=YES) 'SEL=20 ;PORT SELECT WAIT (1=WAITING) !OFA=100 ;OFFSET ACTIVE (1=YES) (RETRY=8. ;CONTROLLER ERROR RETRY COUNT; ; LOCAL DATA;E.DELTA: .WORD 3 ;ROTATIONAL OPTIMIZATION DELTA;E=; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLER NUMBER)S; 7RTTBL: .BLKW R$$JP1 ;RETRY COUNT FOR CURRENT OPERATIONY5OFFAD: .BLKW R$$JP1 ;ADDRESS OF CURRENT OFFSET VALUEEBPRMSV: .BLKW R$$JP1*5 ;PARAMETER SAVE AREA FOR ERROR RECOVERY AND  ;WRITE CHECK&SAVWC: .BLKW R$$JP1 ;SAVED WORD COUNT=DLTWC: .BLKW R$$JP1 ;SAVED WORD COUNT FOR DATA LATE RECOVERYT.$DBOPT::.REPT R$$JP1 ;SEEK OPTIMIZATION TABLE/ .WORD 1 ;0=IMPLIED SEEK; 1=ALWAYS SEEK FIRSTD .ENDR;A ; OFFSET POSITIONING VALUE TABLE;L%OFFTB: .WORD 0 ;RETURN TO CENTERLINEE .WORD FMT22!20 ;+400: .WORD FMT22!220 ;-400 .WORD FMT22!40 ;+800O .WORD FMT22!240 ;-800 .WORD FMT22!60 ;+1200 .WORD FMT22!260 ;-1200R .WORD 0 ;RETURN TO CENTERLINEE;R; DIAGNOSTIC FUNCTION TABLEK;A$FUNTBL: .BYTE 107, IO.HMS!IQ.UMD&377 .BYTE 105, IO.BLS!IQ.UMD&377C .BYTE 115, IO.OFF!IQ.UMD&377D%FUNTB0: .BYTE 173, IO.RDH!IQ.UMD&377T .BYTE 163, IO.WDH!IQ.UMD&377; .BYTE 151, IO.WCK!IQ.UMD&377FUNTBE:F;P; DRIVER DISPATCH TABLEL;2 DDT$ DB,R$$JP1,,,,,,OPT ;GENERATE DISPATCH TABLE;+>; **-DBINI-RH11/RH70-RP04/05/06 DISK PACK CONTROLLER INITIATOR;0E; THIS IS THE DRIVER ENTRY POINT FROM THE QUEUE I/O DIRECTIVE WHEH ANTE; I/O REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TOBF; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED UNIT IS NOTF; BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSEG; A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT SUCCEEDS,VE; THEN THE NEXT I/O OPERATION IS INITIATED AND A RETURN TO THE CALLERT; IS EXECUTED.;I ; INPUTS:0;06; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIALIZED.;R ; OUTPUTS:;TA; IF THE SPECIFIED UNIT IS NOT BUSY AND AN I/O REQUEST IS WAITING A; TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-O; ATION IS INITIATED.E;-7DBINI: GTPKT$ DB,R$$JP1 ;GET NEXT I/O PACKET TO PROCESSE;E1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:I;X'; R1=ADDRESS OF THE I/O REQUEST PACKET.V-; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.D; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.A6; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIALIZED.;P;; RH11/RH70-RP04/05/06 DISK PACK I/O REQUEST PACKET FORMAT:E;I"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK.X@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUES00yytccccTOR TASK HEADER.5; WD. 04 -- FIRST LUN WORD IN REQUESTORS TASK HEADER.A; WD. 05 -- I/O FUNCTION CODE.0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.=; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000).-3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.A; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER.V+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.T-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED. <; WD. 15 -- DIAGNOSTIC SUPPLIMENTAL PARAMETER ELSE NOT USED.8; WD. 16 -- BITS <0:7> = HIGH LBN, BITS <8:15> NOT USED.#; WD. 17 -- LOW LBN OF I/O REQUEST.R.; WD. 20 -- RELOCATION BIAS OF REGISTER BLOCK.;; WD. 21 -- REGISTER BLOCK ADDRESS (DISPLACEMENT + 140000).E;(# CLRB U.CW2+1(R5) ;RESET UNIT FLAGSI$ CALL $VOLVD ;VALIDATE VOLUME VALID BCS 10$ ;IF CS WE FAILED TST R0 ;TRANSFER FUNCTION? BMI DBRQC ;IF MI YES) JMP DBVV ;PROCESS VOLUME VALID FUNCTION-10$: CALL $IODON ;FINISH I/OR BR DBINI ;GET NEXT REQUEST;L*; REQUEST CONTROLLER FOR PROPER OPERATION.;I0DBRQC: MOV S.KRB(R4),R1 ;GET CURRENT KRB ADDRESS5 BIT #KS.POE,K.STS(R1) ;PARALLEL OPERATIONS ENABLED?B BEQ DBRQC1 ;IF EQ NO. MOV S.PKT(R4),R3 ;RETRIEVE I/O PACKET ADDRESS) BITB #IQ.Q,I.FCN(R3) ; EXPRESS REQUEST ?T BNE DBRQC1 ; IF NE YES. BITB #IQ.UMD,I.FCN(R3) ; DIAGNOSTIC REQUEST ? BNE 20$ ; IF NE YESR- MOVB K.CON(R1),R3 ;RETREIVE CONTROLLER INDEX;# TST $DBOPT(R3) ;WHICH SEEK METHOD?C" BNE 10$ ;IF NE ALWAYS SEEK FIRST3 BIT #KS.DIP,K.STS(R1) ;DATA TRANSFER IN PROGRESS?E+ BEQ DBRQC1 ;IF EQ NO, START DATA TRANSFERT210$: BISB #S3.SIP,S.ST3(R4) ;SET SEEK IN PROGRESS6 CALL $RQCNC ;REQUEST CONTROLLER FOR CONTROL FUNCTION BR DBINIO ;T320$: MOV #FUNTBL,R0 ; GET ADDRESS OF FUNCTION TABLER)25$: TSTB (R0)+ ; BYPASS CONTROLLER CODEB- CMPB (R0)+,I.FCN(R3) ; FUNCTION CODE MATCH ?B BEQ 30$ ; IF EQ YESM CMP #FUNTB0,R0 ; END OF TABLE ? BNE 25$ ; IF NE NO+ BR DBRQC1 ; YES, NORMAL TRANSFER FUNCTIONA.30$: TSTB -(R0) ; POINT BACK TO FUNCTION CODE, MOVB -(R0),U.BUF(R5) ; LOAD CONTROLLER CODE BR 10$ ; TREAT AS A SEEK;DBRQC1: BICB #S3.SIP,S.ST3(R4) ;SET SEEK ALREADY COMPLETED 3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER ;0 ; **-DBUBMP-SETUP UNIBUS ADDRESS;N>; THIS SECTION OF CODE WILL DETERMINE IF THE UNIBUS ADDRESS IS@; ALREADY IN THE FORMAT FOR THE MASSBUS CONTROLLER OR THE UNIBUS<; MAP FOR 22-BIT PROCESSORS WITHOUT RH CONTROLLERS. IT WILLA; ALSO CONVERT THE I/O FUNCTION CODE TO IT'S HARDWARE EQUIVALENT.C;O>; NOTE: AT THIS POINT THE REQUESTING UNIT MUST BE THE OWNER OF%; THE CONTROLLER FOR A DATA TRANSFER.#;S.DBUBMP: MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESS2 BITB #ADR,U.CW2+1(R5);ADDRESS BITS ALREADY SETUP? BNE DBINIO ;IF NE YESS/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?N BEQ 10$ ;IF EQ NOS: BIT #KS.MBC,K.STS(R1) ;YES, IS THIS A 22-BIT CONTROLLER? BNE 20$ ;IF NE YES' CALL $STMAP ;SETUP UNIBUS MAP ADDRESS 210$: ASL U.BUF(R5) ;SHIFT BITS <4:5> TO BITS <8:9> ASL U.BUF(R5) ;...T ASL U.BUF(R5) ;...I ASL U.BUF(R5) ;...G/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?A BEQ 20$ ;IF EQ NO% CALL $MPUBM ;MAP UNIBUS TO TRANSFERB:20$: BISB #ADR,U.CW2+1(R5);INDICATE ADDRESS SETUP COMPLETE;B3; CONVERT I/O FUNCTION CODE TO HARDWARE EQUIVALENT.D;S. MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS4 CMPB #IO.HMS/256.,I.FCN+1(R1) ;DIGNOSTIC FUNCTION? BNE 40$ ;IF NE NOL. MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE830$: MOVB (R0)+,U.BUF(R5) ;LOAD CONTROLLER FUNCTION CODE. CMPB (R0)+,I.FCN(R1) ;IS IT THE CORRECT CODE? BEQ 60$ ;IF EQ YES' CMP #FUNTBE,R0 ;END OF FUNCTION TABLE?I BNE 30$ ;IF NE NOM040$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION2 MOVB #171,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTION7 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?T$ BHIS 50$ ;IF HIS FUNCTION IS LEGAL( MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS, MOVB U.UNIT(R5),RPCS2(R2) ;SELECT THE UNIT JMP DBFIN1 ;FINISH I/O50$: BEQ 60$ ;IF EQ YES0 MOVB #161,U.BUF(R5) ;SET WRITE LOGICAL FUNCTION+00yyttt tfDATA60$: MOV S.KRB(R4),R3 ;RETRIEVE KRB ADDRESS6- MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXN! MUL #5,R3 ;SETUP INDEX INTO ...:" ADD #PRMSV,R3 ;... PARAMETER AREA& MOV U.BUF(R5),(R3)+ ;SAVE PARAMETERS MOV U.BUF+2(R5),(R3)+ ;... MOV U.CNT(R5),(R3)+ ;... MOV I.PRM+10(R1),(R3)+ ;...  MOV I.PRM+12(R1),(R3)+ ;...V;R%; **-DBINIO-INITIATE AN I/O OPERATION.;TE; THIS ROUTINE WILL INITIATE EITHER A SEEK OR THE DATA TRANSFER OPER-$6; ATION DEPENDING ON HOW THE CONTROLLER WAS REQUESTED.;I ; INPUTS:V;K; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCB.;E*DBINIO: MOV @S.KRB(R4),R2 ;GET CSR ADDRESS) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSE( MOVB U.UNIT(R5),RPCS2(R2) ;SELECT UNIT;S9; DETERMINE IF DRIVE'S PORT IS SEIZED BY THIS CONTROLLER.;V' MTPS #PR5 ;EXECUTE AT DEVICE PRIORITY(+ CLR RPDS(R2) ;;;ATTEMPT TO SEIZE THE DRIVEA* BIT #DPR,RPDS(R2) ;;;DID THE DRIVE SEIZE? BNE 5$ ;;;IF NE YES 2 BISB #SEL,U.CW2+1(R5);;;SET PORT SELECT WAIT FLAG/ MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNT$ CLR S.FRK+2(R4) ;;;ALLOW INTERRUPTS& MOVB #IE,(R2) ;;;RE-ENABLE INTERRUPTS MTPS #0 ;;;ALLOW INTERRUPTSP* CALLR $RLCN ;RELEASE CONTROLLER AND EXIT;T1; CHECK IF THE HEADS ARE ON THE CORRECT CYLINDER.I;S*5$: MOVB #111,(R2) ;;;CLEAR SELECTED DRIVE0 BITB #S3.SIP,S.ST3(R4) ;;;ARE WE DOING A SEEK? BEQ 10$ ;;;IF EQ NO 1 BITB #IQ.UMD,I.FCN(R1) ;;; DIAGNOSTIC FUNCTION ?Z BNE 20$ ;;; IF NE YES2 CMP RPCC(R2),I.PRM+10(R1) ;;;DO WE NEED TO SEEK? BNE 20$ ;;;IF NE YES MTPS #0 ;ENABLE INTERRUPTS# JMP DBRQC1 ;GO REQUEST CONTROLLERM; .; LOAD CONTROLLER REGISTERS FOR DATA TRANSFER.;W210$: ADD #RPCS2,R2 ;;;POINT TO SECOND CSR REGISTER7 MOV I.PRM+12(R1),-(R2) ;;;INSERT TRACK/SECTOR ADDRESSR0 MOV U.BUF+2(R5),-(R2) ;;;INSERT BUFFER ADDRESS: MOV U.CNT(R5),-(R2) ;;;INSERT NUMBER OF BYTES TO TRANSFER# ROR (R2) ;;;CONVERT TO WORD COUNT1& NEG (R2) ;;;MAKE NEGATIVE WORD COUNT" TST -(R2) ;;;POINT BACK TO RPCS1'20$: MOV #FMT22,R3 ;;;FORCE 16-BIT MODE 8 CMP #IO.OFF!IQ.UMD,I.FCN(R1) ;;;DIAG. OFFSET FUNCTION? BNE 30$ ;;;IF NE NO. BIS I.PRM+6(R1),R3 ;;;YES, MERGE OFFSET VALUE430$: BITB #IHC,U.CW2+1(R5);;;INHIBIT HEADER COMPARE? BEQ 40$ ;;;IF EQ NO,+ BIS #HCI,R3 ;;;SET HEADER COMPARE INHIBITU+40$: MOV R3,RPOF(R2) ;;;SET OFFSET REGISTERM;U'; CHECK FOR DRIVE NOT READY CONDITIONS.T;R- MOV #IE.DNR&377,R0 ;;;ASSUME DRIVE NOT READYN; MOV I.PRM+10(R1),RPDC(R2) ;;;SET DESIRED CYLINDER ADDRESSC, MOV RPDS(R2),R3 ;;;GET CURRENT DRIVE STATUS COM R3 ;;;COMPLEMENT STATUSC, BIT #MOL!DRY,R3 ;;;DRIVE READY AND ON LINE? BNE 50$ ;;;IF NE NO6$ BIT #UNS,RPER1(R2) ;;;DRIVE UNSAFE? BEQ 70$ ;;;IF EQ NO)!50$: MTPS #0 ;;;ALLOW INTERRUPTS$/ BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP?R BEQ 55$ ;IF EQ NOR5 BITB #US.VV,U.STS(R5);WAS VOLUME PREVIOUSLY MOUNTED?V BEQ 52$ ;;; IF EQ NO( BR DBPWF0 ;YES, WAIT FOR IT TO SPIN UP52$: JMP DBPWF1 ;;;355$: BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC OPERATION?M BEQ 60$ ;IF EQ NO + JMP DBDIAG ;PASS REGISTERS AND FINISH I/OS60$: ;REFERENCE LABEL .IF DF S2.NRD6 BIT #S2.NRD,S.ST2(R4) ;IS THIS FIRST DRIVE NOT READY?! BNE 61$ ;IF NE NO, GO LOG ERROR)6 BIS #S2.NRD,S.ST2(R4) ;INDICATE FIRST DRIVE NOT READY JMP DBPWF1 ;GO DO A RETRYR761$: BIC #S2.NRD,S.ST2(R4) ;CLEAR FIRST DRIVE NOT READY  .ENDC ; DF S2.NRD( CALL $DVERR ;LOG DRIVE NOT READY ERROR65$: JMP DBFIN1 ;FINISH I/O,70$: BIT #VV,R3 ;;;DID VOLUME VALID CHANGE?1 BEQ 75$ ;;;IF EQ NO (NOTE REVERSE STATUS OF VV)D0 BITB #US.SPU,U.STS(R5) ;;;DID WE JUST SPIN UP? BEQ 50$ ;;;IF EQ NO * MOVB #123,(R2) ;;;YES, RESET VOLUME VALID2 BISB #US.VV,U.STS(R5);;;SET SOFTWARE VOLUME VALID375$: BIT #S2.MAD,S.ST2(R4) ;;;MULTI-ACCESS DEVICE?T BEQ 90$ ;;;IF EQ NOO. CMP S.KRB(R4),S.KTB(R4) ;;;IS THIS PORT 'A'? BNE 80$ ;;;IF NE NO/ BICB #S3.SPA,S.ST3(R4) ;;;YES, SHOW IT SPUN UPN BR 85$ ;;;380$: BICB #S3.SPB,S.ST3(R4) ;;;IT MUST BE PORT 'B'I385$: BITB #S3.SPU,S.ST3(R4) ;;;BOTH PORTS SPUN UP?E BNE 95$ ;;;IF NE NOB; $; PREPARE TO START AN I/O OPER00yytccccATION.;?790$: BICB #US.SPU,U.STS(R5) ;;;RESET DRIVE SPINNING UPO+95$: CLR S.FRK+2(R4) ;;;INIT FORK INTERLOCKW/ MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNTM- BIS #S2.ACT,S.ST2(R4) ;;;SHOW I/O IS ACTIVEC5 BISB #XCT,U.CW2+1(R5);;;SHOW FUNCTION BEING EXECUTED 0 BITB #S3.SIP,S.ST3(R4) ;;;SHOULD WE DO A SEEK? BEQ 105$ ;;;IF EQ NO;; START EXPLICIT SEEK.; 1 BITB #IQ.UMD,I.FCN(R1) ;;; DIAGNOSTIC FUNCTION ?4 BEQ 99$ ;;; IF EQ NO/ MOVB U.BUF(R5),(R2) ;;; LOAD POSITION FUNCTIONT BR 101$ ;;;O,99$: MOVB U.PRM(R5),R3 ;;; GET SECTORS/TRACK CLR -(SP) ;;;CLEAR A WORDS6 MOVB I.PRM+12(R1),(SP) ;;;GET DESIRED SECTOR ADDRESS, SUB DELTA,(SP) ;;;SUBTRACT ROTATIONAL DELTA% BPL 100$ ;;;IF PL ADJUSTMENT WAS OKX/ ADD R3,(SP) ;;;CORRECT ADJUSTMENT IF NEGATIVEB;100$: MOVB I.PRM+13(R1),1(SP) ;;;SET DESIRED TRACK ADDRESS;9 MOV (SP)+,RPDA(R2) ;;;LOAD ADJUSTED TRACK/SECTOR ADDRESSC+ MOVB #131,(R2) ;;;LOAD THE SEARCH FUNCTION;#101$: MTPS #0 ;;; ALLOW INTERRUPTSL( BR DBPWF3 ;RELEASE CONTROLLER AND EXIT;M; START DATA TRANSFER.;C1105$: MOV S.KRB(R4),R3 ;;;GET CURRENT KRB ADDRESSR7 BIT #IQ.UMD,I.FCN(R1) ;;;IS IT A DIAGNOSTIC FUNCTION?( BEQ 106$ ;;;IF EQ NO2 CMPB U.BUF(R5),#140 ;;;IS IT A UMD SEEK FUNCTION? BLO 107$ ;;;IF LO YESJ=106$: BIS #KS.DIP,K.STS(R3) ;;;SET DATA TRANSFER IN PROGRESSI1 BIT #FE.EXT,$FMASK ;;;22-BIT ADDRESSING ENABLED?U BEQ 110$ ;;;IF EQ NO7 BIT #KS.MBC,K.STS(R3) ;;;IS THIS A 22-BIT CONTROLLER?T BEQ 110$ ;;;IF EQ NO MOV R3,R1 ;;;COPY KRB ADDRESSL' ADD K.OFF(R3),R1 ;;;POINT TO UCB TABLE+ MOV KE.RHB(R1),R1 ;;;RETREIVE RHBAE OFFSET ' ADD R2,R1 ;;;FORM AN I/O PAGE ADDRESST2 MOVB U.BUF+1(R5),(R1);;;SET MEMORY EXTENSION BITS+107$: MOVB U.BUF(R5),(R2) ;;;START FUNCTIONO BR 120$ ;;;;*110$: MOV U.BUF(R5),(R2) ;;;START FUNCTION 120$: MTPS #0 ;ALLOW INTERRUPTS;#<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.; %DBCAN: RETURN ;;;NOP FOR RP04/05/062;+:; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND>; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT=; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVEP?; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANYA; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESS ; THE UNIT IS ALREADY READY.;-3DBPWF: TSTB S.STS(R4) ;IS THIS UNIT CURRENTLY BUSY?O BEQ DBPWF2 ;IF EQ NO9DBPWF0: MOVB #15.,S.STS(R4) ;WAIT A MAXIMUM OF ONE MINUTER6DBPWF1: MOVB S.ITM(R4),S.CTM(R4) ;4 SECONDS AT A TIME5DBPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UPH1DBPWF3: CALLR $RLCN ;RELEASE CONTROLLER AND EXITO;+5; **-$DBINT-RH11/RH70-RP04/05/06 DISK PACK CONTROLLERO; INTERRUPT HANDLERE;- .ENABL LSBN3$DBINT::BR DBFRK ;;;ENTRY POINT FOR DATA TRANSFERSD+ TST S.FRK+2(R4) ;;;ARE INTERRUPTS ALLOWED?." BNE DBCAN ;;;IF NE NO, IGNORE IT' CALL $FORK ;;;CREATE A SYSTEM PROCESSF8DBFRK: BITB #SEL,U.CW2+1(R5);WAITING FOR PORT TO SELECT? BEQ 5$ ;IF EQ NO- BICB #SEL,U.CW2+1(R5);RESET PORT SELECT FLAGB, MOV U.SCB(R5),R4 ;YES, RETREIVE SCB ADDRESS. MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS JMP DBRQC ;GO TRY AGAINN65$: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS- MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEXS# MOV @S.KRB(R4),R2 ;GET CSR ADDRESS.( MOVB U.UNIT(R5),RPCS2(R2) ;SELECT UNIT# TSTB S.STS(R4) ;IS THIS UNIT BUSY? BNE 10$ ;IF NE YES' MTPS #PR5 ;EXECUTE AT DEVICE PRIORITY5( CLR S.FRK+2(R4) ;;;RESET FORK INTERLOCK/ MOV #TRE!11,(R2) ;;;CLEAR CONTROLLER AND DRIVEI: BISB #S3.DRL,S.ST3(R4) ;;;SHOW DUAL ACCESS UNIT RELEASED MOVB #113,(R2) ;;;RELEASE DRIVE MTPS #0 ;;;ALLOW INTERRUPTSL BR DBPWF3 ;RELEASE CONTROLLERR;R@; INTERRUPT WAS FROM A BUSY UNIT. IF WE JUST DID A SEEK WE WILLA; GO AND START THE DATA TRANSFER OPERATION. IF THE DATA TRANSFERC>; TERMINATED, DETERMINE WHY. IF WE ARE SPINNING UP, RETRY THE ; OPERATION.;110$: BITB #US.SPU,U.STS(R5) ;ARE WE SPINNING UP?K BEQ 15$ ;IF EQ NOI- BIT #S2.MAD,S.ST2(R4) ;MULTI-ACCESS DEVICE?  BEQ 100yyttt tfDATA2$ ;IF EQ NO., CMP S.KRB(R4),S.KTB(R4) ;IS THIS PORT 'A'? BNE 14$ ;IF NE NO;2 BITB #S3.SPA,S.ST3(R4) ;IS PORT 'A' SPINNING UP? BEQ 15$ ;IF EQ NOR%12$: CALLR 100$ ;RETRY THE OPERATION 614$: BITB #S3.SPB,S.ST3(R4) ;IS PORT 'B' SPINNING UP? BNE 12$ ;IF NE YES715$: BIT #S2.EIP,S.ST2(R4) ;ERROR ALREADY IN PROGRESS?  BNE 20$ ;IF NE YES& CALL DBPRM ;SET INITIAL RETRY VALUES.20$: MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS/ MOV #IS.SUC&377,R0 ; ASSUME SUCESSFUL TRANSFERC1 BITB #S3.SIP,S.ST3(R4) ; DID WE JUST DO A SEEK ?S BEQ 30$ ;IF EQ NOR0 BICB #S3.SIP,S.ST3(R4) ;CLEAR SEEK IN PROGRESS8 BITB #IQ.UMD,I.FCN(R1) ; DIAGNOSTIC FUNCTION EXECUTED ? BNE DBDIAG ; IF NE YES/ BIT #ERR,RPDS(R2) ;ANY ERRORS DURING THE SEEK?B BEQ 100$ ;IF EQ NO! CALL $DVERR ;LOG THE SEEK ERRORS! DECB RTTBL(R3) ;COUNT THIS RETRY " CALL DBERL ;FINISH ERROR LOGGING125$: MOV #TRE!11,(R2) ;CLEAR CONTROLLER AND DRIVE ' MOV #107,R1 ;SET RECALIBRATE FUNCTIONR. CALLR DBFUNC ;ISSUE THE RECALIBRATE AND EXIT;(G; INTERRUPT WAS DUE TO A DATA TRANSFER OPERATION OR DIAGNOSTIC FUNCTION(; <30$: BITB #IQ.UMD,I.FCN(R1) ; DIAGNOSTIC FUNCTION EXECUTED ? BNE DBDIAG ;IF NE YESE$ BIT #60,(R2) ;POSITIONING FUNCTION? BEQ 80$ ;IF EQ YES BIT #TRE!MCPE,(R2) ;ANY ERRORS? BEQ 70$ ;IF EQ NOE. MOV RPWC(R2),R0 ;GET NEGATIVE WORDS REMAINING( MOV R0,SAVWC(R3) ;SAVE IT FOR LATER USE" CLR DLTWC(R3) ;ZERO DLT FLAG WORD TST RPCS2(R2) ;DATA LATE ERROR? BPL 35$ ;IF PL NOC: MOV R0,DLTWC(R3) ;YES, SAVE REAL NEGATIVE WORDS REMAINING* BNE 35$ ;IF NE WE HAD A PARTIAL TRANSFER8 MOV #-1,DLTWC(R3) ;DLT ON LAST WORD, FAKE A PARTIAL XFR'35$: ASL R0 ;CONVERT TO NEGATIVE BYTES;6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED* SUB #512.,R0 ;SUBTRACT OUT BLOCK IN ERROR) BLE 40$ ;IF LE NO GOOD BYTES TRANSFERED01 BITB #ERL,U.CW2+1(R5);ERROR ALREADY IN PROGRESS?S BEQ 40$ ;IF EQ NO;R:; WE GOT AN ERROR BUT SOME GOOD DATA WAS TRANSFERED. THIS6; INDICATES THAT WE RECOVERED FROM THE PREVIOUS ERROR.;A" CALL DBERL ;FINISH ERROR LOGGING#40$: CALL $DVERR ;LOG DEVICE ERRORM, BISB #ERL,U.CW2+1(R5);SET ERROR LOGGED FLAG, MOV #IE.WLK&377,R0 ;ASSUME WRITE LOCK ERROR& BIT #WLE,RPER1(R2) ;WRITE LOCK ERROR? BNE 60$ ;IF NE YES/ MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERROR4' BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?T BNE 60$ ;IF NE YES% TST DLTWC(R3) ;REAL DATA LATE ERROR?  BNE 110$ ;IF NE YES 1 MOV RPER1(R2),R1 ;GET CONTENTS OF ERROR REGISTERN. BIT #UNS!IAE!AOE!RMR!ILR!ILF,R1 ;HARD ERROR? BNE 60$ ;IF NE YES$ BIT #NED!NEM,RPCS2(R2) ;HARD ERROR? BNE 60$ ;IF NE YES$ BIT #HCE,R1 ;HEADER COMPARE ERROR?& BNE 25$ ;IF NE YES, DO A RECALIBRATE8 BIT #WCE!UPE!PGE!MXF!MDPE,RPCS2(R2) ;CONTROLLER ERROR?( BNE DBRTRY ;IF NE YES, RETRY OPERATION! JMP DBECC ;CHECK FOR ECC ERRORS.7DBDIAG: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASKT" CALL DBCLR ;CLEAR SELECTED DRIVE60$: JMP DBFIN ;FINISH I/OR+70$: JMP DBWCHK ;GO TEST FOR A WRITE CHECK;T ; PROCESS POSITIONING OPERATION.;R380$: MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORH. BIT #ERR,RPDS(R2) ;ERRORS DURING POSITIONING? BEQ 85$ ;IF EQ NO? CALL $DVERR ;LOG IT " CLR R1 ;SHOW NO BYTES TRANSFERED JMP DBFIN1 ;FINISH I/O(85$: BIT #10,(R2) ;RECALIBRATE FUNCTION? BNE 95$ ;IF NE NOE190$: BIT #PIP,RPDS(R2) ;IS THE RECAL REALLY DONE?A BNE 90$ ;IF NE NO, LOOP FOR IT# BR DBRTRY ;NOW RETRY THE FUNCTION0295$: CMP #OFFTB+16,OFFAD(R3) ;FINAL OFFSET TRIED? BEQ 60$ ;IF EQ YES'100$: CALL DBCLR ;CLEAR SELECTED DRIVE' CALLR DBUBMP ;RETRY ORIGINAL FUNCTIONA;R>; THE TRANSFER WAS STOPPED DUE TO A DATA LATE ERROR CONDITION.>; WE WILL NOW BACKUP THE WORD COUNT, BUS ADDRESS AND CYLINDER/?; TRACK/SECTOR ADDRESS BY ONE BLOCK AND RETRY THE TRANSFER FROMF>; THIS POINT. THIS IS DONE TO PREVENT THE DATA LATE CONDITION(; FROM RECURRING DUE TO A LONG TRANSFER.; 0110$: DECB RTTBL(R3) ;RETRY DATA LATE CONDITION? BLE 60$ ;IF LE NO)4 MOV DLTWC(R3),R0 ;GET REAL NEGATIVE WORDS REMAINING# ASL R0 ;CONVERT TO NEGATIVE BYTESL6 ADD U.CNT(R00yytcccc5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED- BIC #777,R0 ;GET BLOCKS ACTUALLY TRANSFEREDO0 CALL DBCALC ;BACKUP TO START OF BLOCK IN ERROR( TST U.CNT(R5) ;DLT ERROR ON LAST BLOCK? BNE 100$ ;IF NE NO0 ADD R0,U.CNT(R5) ;YES, BACKUP BYTES TO TRANSFER BR 100$ ;RESTART THE TRANSFER .DSABL LSBI;+@; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING REPEATEDC; UNLESS THE OPERATION WAS DIAGNOSTIC. TIMEOUTS ARE USUALLY CAUSEDEC; BY POWERFAILURE BUT MAY ALSO BE THE RESULT OF A HARDWARE FAILURE.);- .ENABL LSBS7DBOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP?T BEQ 15$ ;;;IF EQ NOC/ BIT #S2.MAD,S.ST2(R4) ;;;MULTI-ACCESS DEVICE?R BEQ 10$ ;;;IF EQ NOL. CMP S.KRB(R4),S.KTB(R4) ;;;IS THIS PORT 'A'?) BNE 5$ ;;;IF NE NO, IT MUST BE PORT 'B'S4 BITB #S3.SPA,S.ST3(R4) ;;;IS PORT 'A' SPINNING UP? BNE 10$ ;;;IF NE YES( BR 15$ ;;;TIMEOUT FOR NORMAL OPERATION75$: BITB #S3.SPB,S.ST3(R4) ;;;IS PORT 'B' SPINNING UP?  BEQ 15$ ;;;IF EQ NO 110$: DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET?. BEQ 15$ ;;;IF EQ YES MTPS #0 ;;;ALLOW INTERRUPTSS. MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS JMP DBRQC ;RETRY OPERATION,15$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY MTPS #0 ;;;ALLOW INTERRUPTS?) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSS3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER?) MOV S.KRB(R4),R2 ;GET CURRENT KRB ADDRSSU- MOVB K.CON(R2),R3 ;RETREIVE CONTROLLER INDEXR MOV (R2),R2 ;GET CSR ADDRESS: MOVB U.UNIT(R5),RPCS2(R2) ;SELECT UNIT FOR ERROR LOGGING! CALL $DVTMO ;LOG DEVICE TIMEOUTQ;S>; NOTE: THE FOLLOWING SIX INSTRUCTIONS (AND THE SUBROUTINE) DO4; NOT CHANGE THE C-BIT SETTING RETURNED FROM $DVTMO.;C2 BITB #SEL,U.CW2+1(R5);WAITING FOR PORT TO SELECT?) BNE DBFIN1 ;IF NE YES, WE DIDN'T GET ITO0 BITB #S3.SIP,S.ST3(R4) ;TIMEOUT DURING A SEEK? BEQ 20$ ;IF EQ NO$ CALL DBPRM ;RESET RETRY PARAMETERS;20$: BICB #S3.SIP,S.ST3(R4) ;ASSUME DATA TRANSFER FUNCTION2- BCS DBDIAG ;IF CS TIMEOUT DURING DIAGNOSTICR4 BITB #US.SPU,U.STS(R5) ;WAS THE DRIVE SPINNING UP? BEQ DBRTRY ;IF EQ NO- MOV #IE.DNR&377,R0 ;YES, SET DRIVE NOT READYU BR DBFIN ;FINISH I/O0DBRTRY: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS< BICB #ERL,U.CW2+1(R5) ;CAN'T CLOSE ERRORS RETRIED FROM BEG' BIT #WCE,RPCS2(R2) ;WRITE CHECK ERROR?. BEQ 25$ ;IF EQ NOU/ MOV #IE.WCK&377,R0 ;YES, SET WRITE CHECK ERRORR+25$: BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?, BNE DBFIN ;IF NE YES DECB RTTBL(R3) ;RETRY FUNCTION? BGT 40$ ;IF GT YES BR DBFIN ;FINISH I/O;.!; TEST FOR WRITE CHECK OPERATION.?;BCDBWCHK: BITB #IO.WLC&377,I.FCN(R1) ;WRITE FOLLOWED BY WRITE CHECK? BNE 30$ ;IF NE YES5 BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED BY MCR?C BEQ DBFIN ;IF EQ NON330$: CMPB #171,U.BUF(R5) ;WAS LAST FUNCTION A READ?  BEQ DBFIN ;IF EQ YES0 CMPB #161,U.BUF(R5) ;WAS LAST FUNCTION A WRITE? BNE DBFIN ;IF NE NO:0 MOV #RETRY,RTTBL(R3) ;REINITIALIZE RETRY COUNT" MUL #5,R3 ;CREATE INDEX INTO ...' ADD #PRMSV,R3 ;... PARAMETER SAVE AREAB* MOV (R3)+,U.BUF(R5) ;RESTORE PARAMETERS  MOV (R3)+,U.BUF+2(R5) ;... MOV (R3)+,U.CNT(R5) ;... MOV (R3)+,I.PRM+10(R1) ;...B MOV (R3)+,I.PRM+12(R1) ;...C. MOVB #151,U.BUF(R5) ;SET WRITE CHECK FUNCTION*40$: CALL DBCLR ;CLEAR THE SELECTED DRIVE/ CALLR DBUBMP ;START THE WRITE CHECK OPERATIONY .DSABL LSB1;F; **-DBFIN-FINISH I/O OPERATION;EB; THIS ROUTINE WILL SET THE ACTUAL BYTES TRANSFERED PARAMETER, THEA; ERROR LOGGING RETRY COUNTS AND CALL $IODON. THE SELECTED DRIVE <; IS RELEASED, IF REQUESTED, AND THE CONTROLLER IS RELEASED.;+ ; INPUTS:);.; R0=SUCCESS/ERROR CODE ; R2=ADDRESS OF CONTROLER CSR;; R4=ADDRESS OF THE SCB(; R5=ADDRESS OF THE UCBB;R/DBFIN: MOV S.PKT(R4),R3 ;GET I/O PACKET ADDRESSA1 MOV RPWC(R2),R1 ;GET WORDS REMAINING TO TRANSFERT+ ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFERD8 ADD I.PRM+4(R3),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED.DBFIN1: CALL DBCLR1 ;CLEAR THE SELECTED DRIVE( MOV #TRE,(R2) ;NOW CLEAR THE CONTROLLER- BICB #SEL,U.CW2+1(R5);CLEAR PORT SELECT FLAG,* MOV S.KRB(R4),R3 00yyttt tfDATA;GET CURRENT KRB ADDRESS;)); CHECK FOR ATTENTIONS AND RELEASE DRIVE.S; +10$: TSTB RPAS(R2) ;ANY ATTENTIONS PENDING?5 BEQ 20$ ;IF EQ NO4 BISB #IE,(R2) ;YES, FORCE CALL TO INTERRUPT HANDLER BR 10$ ;TRY AGAINE:20$: BITB #S3.NRL,S.ST3(R4) ;SHOULD WE RELEASE THE DRIVE? BEQ 30$ ;IF EQ YES- MOVB #IE,(R2) ;NO, JUST RE-ENABLE INTERRUPTSF BR 40$ ;<30$: BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED" MOVB #113,(R2) ;RELEASE THE DRIVE140$: MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEX / MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTO4 BITB #XCT,U.CW2+1(R5);HAS A FUNCTION BEEN EXECUTED? BNE 50$ ;IF NE YES' MOV #RETRY,R2 ;SET MAXIMUM RETRY COUNTF350$: BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT5 BICB #S3.SIP,S.ST3(R4) ;RESET SEEK IN PROGRESS FLAGV+DBFIN2: CALL $RLCN ;RELEASE THE CONTROLLER # CALL $IODON ;FINISH I/O OPERATION;! JMP DBINI ;PROCESS NEXT REQUESTW;C!; **-DBECC-ATTEMPT ECC CORRECTION ;LD; THIS ROUTINE IS ENTERED IF A DATA ERROR IS DETECTED. IF THE ERRORG; IS CORRECTABLE, THE EXECUTIVE ECC ROUTINE IS CALLED AND THE OPERATIONSE; IS RESTARTED FROM WHERE THE CONTROLLER STOPPED. IF OFFSET RECOVERYA; IS REQUIRED, WE WILL DO IT.E;* ; INPUTS:R;S; R1=CONTENTS OF RPER1; R2=ADDRESS OF CONTROLLER CSR; .DBECC: BIT #DCK!DTE!HCRC,R1;CORRECTABLE ERROR? BEQ DBRTRY ;IF EQ NO/ CMPB #171,U.BUF(R5) ;IS THIS A READ OPERATION?N BNE DBRTRY ;IF NE NO4 MOV SAVWC(R3),R0 ;GET NEGATIVE # OF WORDS REMAINING ASL R0 ;CONVERT TO BYTES6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED. BEQ DBOFF ;IF EQ NONE TRANSFERED, TRY OFFSET( BIS RPER2(R2),R1 ;.OR. ERROR REGISTER 2% CMP #DCK,R1 ;ONLY DATA CHECK ERROR?,! BNE DBOFF ;IF NE NO, TRY OFFSETS7 MOV SAVWC(R3),-(SP) ;PUT REMAINING WORD COUNT ON STACK) MOV RPEC1(R2),R1 ;GET ECC ERROR POSITIONL- MOV RPEC2(R2),R3 ;GET ECC CORRECTION PATTERNB' MOV (SP)+,R2 ;GET REMAINING WORD COUNTD CALL $ECCOR ;DO ECC CORRECTION" CALL DBCLR ;CLEAR SELECTED DRIVE/ CALL DBPRM0 ;RESET OFFSET RECOVERY PARAMETERSC( CALL DBCALC ;RE-CALCULATE DISK ADDRESS5 MOV #IS.SUC&377,R0 ;ASSUME NO MORE WORDS TO TRANSFER)+ TST U.CNT(R5) ;ANY MORE WORDS TO TRANSFER?L BEQ DBFIN ;IF EQ NOB+DBREST: CALLR DBINIO ;RESTART THE TRANSFERR;)"; **-DBOFF-ATTEMPT OFFSET RECOVERY;M=; THIS ROUTINE IS CALLED WHENEVER WE NEED TO OFFSET THE HEADST@; SOME DISTANCE FROM TRACK CENTERLINE TO PROPERLY READ THE DATA.;C ; INPUTS: ; 6; R0=NUMBER OF BYTES ACTUALLY TRANSFERED TO THIS POINT;B5DBOFF: BITB #OFA,U.CW2+1(R5) ;OFFSET ALREADY ACTIVE?R BNE 5$ ;IF NE YESE" DECB RTTBL(R3) ;ANY RETRIES LEFT? BGT 5$ ;IF GT YES), MOV #IE.VER&377,R0 ;SET UNRECOVERABLE ERROR JMP DBFIN ;FINISH I/O$5$: TST R0 ; ANYTHING TRANSFERRED ? BEQ 20$ ; NO0 BIT #ECH!DTE,RPER1(R2); HARD ECC OR DTE ERROR ? BEQ 15$ ; NO* DEC R0 ;BACK UP TO THE PREVIOUS BLOCK...) ; OR CURRENT IF NOT ON BLOCK BOUNDARY ) BIC #777,R0 ; FORCE TO A BLOCK BOUNDARYM! ; Z-BIT SET BY BIC IF R0 IS 0  BEQ 20$ ;IF EQ NOF;B@; THE TRANSFER ENDED IN AN ECC HARD ERROR BUT THERE WERE SECTORSE; TRANSFERED THAT CONTAINED GOOD DATA. SINCE THE ECC HARD ERROR COULDVA; HAVE BEEN CAUSED BY A CYLINDER CROSSING, THE GOOD DATA IS SAVEDS6; AND THE TRANSFER IS RETRIED FROM THE POINT OF ERROR.;T15$: (/ CALL DBPRM0 ;RESET OFFSET RECOVERY PARAMETERSC' CALL DBCALC ;CALCULATE NEW PARAMETERS $ TST U.CNT(R5) ;ERROR ON LAST BLOCK? BNE 20$ ;IF NE NOO0 ADD R0,U.CNT(R5) ;YES, BACKUP BYTES TO TRANSFER020$: BITB #OFA,U.CW2+1(R5) ;OFFSET MODE ACTIVE? BNE 30$ ;IF NE YES3 CALL DBPRM0 ;NO, RESET OFFSET RECOVERY PARAMETERST* BISB #OFA,U.CW2+1(R5) ;SET OFFSET ACTIVE#25$: MOV #117,R1 ;SET RTC FUNCTIONR( MOV #FMT22,R0 ;SET OFFSET VALUE TO ZERO BR 50$ ;; A; NO GOOD DATA WAS TRANSFERED - CHECK IF OFFSET SHOULD BE CHANGEDO;E=30$: BIT #DTE!ECH,RPER1(R2) ;DRIVE TIMING OR HARD ECC ERROR?  BNE 40$ ;IF NE YES6 BISB #IHC,U.CW2+1(R5);SET HEADER COMPARE INHIBIT FLAG%40$: DECB RTTBL+1(R3) ;CHANGE OFFSET?B BGT DBREST ;IF GT NO- DECB RTTBL(R3) ;COUNT EACH 00yytccccOFFSET AS A RETRY ( ADD #2,OFFAD(R3) ;UPDATE OFFSET POINTER) MOV @OFFAD(R3),R0 ;GET NEXT OFFSET VALUEC% BEQ 25$ ;IF EQ RETURN TO CENTERLINEO" MOV #115,R1 ;SET OFFSET FUNCTION. MOVB #2,RTTBL+1(R3) ;SET RECOVERY RETRY COUNT( BIT #2,RPDT(R2) ;IS THIS DRIVE AN RP04? BEQ 50$ ;IF EQ YES0 ASRB R0 ;NO, IT'S AN RP06 SO ADJUST OFFSET ...- BIC #100,R0 ;... VALUE AND SIGN ACCORDINGLYT150$: MOV #TRE!11,(R2) ;CLEAR CONTROLLER AND DRIVE ( MOV R0,RPOF(R2) ;LOAD NEXT OFFSET VALUE3 BICB #IHC,U.CW2+1(R5);CLEAR HEADER COMPARE INHIBIT#6DBFUNC: MOVB S.ITM(R4),S.CTM(R4) ;RESET TIMEOUT COUNT! MTPS #PR5 ;;;DISABLE INTERRUPTSI( CLR S.FRK+2(R4) ;;;RESET FORK INTERLOCK- BIS #S2.ACT,S.ST2(R4) ;;;SHOW I/O IS ACTIVE * MOVB R1,(R2) ;;;INITIATE OFFSET FUNCTION MTPS #0 ;ENABLE INTERRUPTS RETURN ;A;06; **-DBERL-FINISH ERROR LOGGING FOR MID-TRANSFER ERROR;.@; THIS ROUTINE IS CALLED TO FINISH OFF THE ERROR LOGGING PROCESS8; DURING MID-TRANSFER IF WE HAVE SUCCESSFULLY RECOVERED.;C ; INPUTS:2;R; R3=CONTROLLER INDEX ;I#DBERL: MOV R2,-(SP) ;SAVE REGISTERS  MOV R1,-(SP) ;U/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTK/ BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT2, MOV #IS.SUC&377,R0 ;RECOVERY WAS SUCCESSFUL+ CALL $FNERL ;FINISH ERROR LOGGING PROCESS MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R2 ;R( ;FALL THRU AND RESET RECOVERY PARMS.;R#; SET RECOVERY AND RETRY PARAMETERSR;L3DBPRM: MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNTS?DBPRM0: MOVB #16.,RTTBL+1(R3) ;SET FOR 16. TIMES AT CENTERLINE7DBPRM1: MOV #OFFTB,OFFAD(R3) ;SET OFFSET TABLE POINTER1 BICB #OFA,U.CW2+1(R5) ;RESET OFFSET ACTIVE FLAGB RETURN ;.;M*; **-DBCALC-CALCULATE UPDATED DISK ADDRESS; ?; THIS ROUTINE WILL CALCULATE THE NEW DISK AND BUFFER ADDRESSESC3; BASED ON THE NUMBER OF BYTES ACTUALLY TRANSFERED. ; ; INPUTS:H;A ; R0=BLOCKS ACTUALLY TRANSFERED.; ; OUTPUTS:;T; R0=UNCHANGED IF U.CNT(R5)=0V#; I.PRM+10(R1)=NEW CYLINDER ADDRESSO'; I.PRM+12(R1)=NEW TRACK SECTOR ADDRESS ; <DBCALC: SUB R0,U.CNT(R5) ;REDUCE BYTES REMAINING TO TRANSFER BEQ 30$ ;IF EQ NO BYTES LEFT3 ADD R0,U.BUF+2(R5) ;UPDATE STARTING BUFFER ADDRESS0 ADCB U.BUF+1(R5) ;AND THE MEMORY EXTENSION BITS2 BIT #FE.EXT,$FMASK ;IS 22-BIT ADDRESSING ENABLED? BEQ 5$ ;IF EQ NO' MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESSN: BIT #KS.MBC,K.STS(R1) ;IS THIS A 22-BIT MASSSBUS DEVICE? BNE 5$ ;IF NE YEST& ADD K.OFF(R1),R1 ;POINT TO UMR AREA+2) ADD R0,-(R1) ;CALCULATE NEW REAL ADDRESSR ADCB -(R1) ;... 15$: MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESST1 SWAB R0 ;CALCULATE NUMBER OF SECTORS TRANSFERED ASR R0 ;1 ADD I.PRM+12(R1),R0 ;UPDATE TRACK/SECTOR ADDRESSC# TST -(SP) ;GET A WORKING REGISTERO110$: CLR (SP) ;CLR THE WORKING REGISTER FOR LOOPN$ CMPB U.PRM(R5),R0 ;SECTOR OVERFLOW? BHI 20$ ;IF HI NO ( MOVB U.PRM(R5),(SP) ;COPY SECTORS/TRACK1 SUB (SP),R0 ;SUBTRACT A TRACKS WORTH OF SECTORSA ADD #1*256.,R0 ;ADD IN A TRACKA+ MOV U.PRM(R5),(SP) ;GET TRACKS AND SECTORSR) CLRB (SP) ;ISOLATE ONLY TRACKS/CYLINDER; CMP (SP),R0 ;TRACK OVERFLOW? BHI 10$ ;IF HI NOM& SUB (SP),R0 ;NORMALIZE TRACK ADDRESS* INC I.PRM+10(R1) ;UPDATE CYLINDER ADDRESS BR 10$ ;:20$: MOV R0,I.PRM+12(R1) ;SET UPDATED TRACK/SECTOR ADDRESS TST (SP)+ ;PRUNE STACK30$: RETURN ;0;T(; **-DBVV-PROCESS VOLUME VALID FUNCTIONS;RB; HERE WE WILL PROCESS VOLUME VALID FUNCTIONS. IF THE FUNCTION ISC; RESET VOLUME VALID WWE WILL FORCE AN UNLOAD OF THE DRIVE. IF THE B; FUNCTION IS SET VOLUME VALID, WE WILL SET THE HARDWARE "VV" BIT.A; IF THE FUNCTION IS A VOLUME VALID NOP, WE WILL SIZE THE DISK BY06; PASSING THE CONTROLLER REGISTERS BACK TO THE CALLER.;D ; INPUTS:; ; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCB/;T8DBVV: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER- MOV #IS.SUC&377,R0 ;SET SUCCESSFUL OPERATION( MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS, MOVB U.UNIT(R5),RPCS2(R2) ;SELECT THE UNIT. MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS MOVB #111,(R2) ;CLEAR THE DRIVE* BIT #NED,RPCS2(R2) 00yyttt tfDATA;DOES THE DRIVE EXIST? BEQ 5$ ;IF EQ YES ! TST I.PRM+2(R1) ;SIZE THE DISK ?0 BMI 4$ ;IF MINUS THEN YESG CALL $DVERR ;LOG THE ERROR4$: ;REFFERENCE LABEL2 MOVB #TRE/256.,RPCS1+1(R2) ;CLEAR THE CONTROLLER( MOV #IE.SZE&377,R0 ;UNABLE TO SIZE UNIT) BICB #US.VV,U.STS(R5);RESET VOLUME VALIDE JMP DBFIN2 ;EXIT#5$: TST I.PRM+2(R1) ;SIZE THE DISK?S BPL 10$ ;IF PL NOC2 CALL $CRPAS ;PASS CONTROLLER REGISTERS TO CALLER BR 15$ ;010$: BIT #VV$SET,I.PRM+2(R1) ;SET VOLUME VALID? BEQ 30$ ;IF EQ NOH7 MOV RPDS(R2),R1 ;GET CONTENTS OF DRIVE STATUS REGISTERI COM R1 ;TOGGLE THEM ) BIT #MOL!DRY,R1 ;DRIVE READY AND ONLINE?E BNE 20$ ;IF NE NOR( MOVB #23,(R2) ;ISSUE PACK ACK TO SET VV15$: JMP DBFIN1 ;EXIT320$: MOV #IE.DNR&377,R0 ;DRIVE NOT READY ERROR CODEU) BICB #US.VV,U.STS(R5);RESET VOLUME VALID; BR 15$ ;EXIT030$: BIT #VV$UNL,I.PRM+2(R1) ;UNLOAD THE DRIVE? BEQ 15$ ;IF EQ NOO+ BIT #PIP,RPDS(R2) ;IS THE DRIVE IN MOTION?:- BNE 15$ ;IF NE YES, IT'S PROBABLY UNLOADINGB% MOVB #3,(R2) ;ISSUE UNLOAD FUNCTIONE BR 15$ ;;V$; **-DBCLR-CLEAR DRIVE OR SUB-SYSTEM?; **-DBCLR1-ALTERNATE ENTRY TO CLEAR DRIVE W/O INTERRUPT ENABLEE;RC; ISSUE A DRIVE CLEAR FUNCTION UNLESS THE SELECTED DRIVE/CONTROLLER0'; IS HUNG, THEN ISSUE SUB-SYSTEM CLEAR.R;C ; INPUTS: ;.; R2=CSR ADDRESS; R5=UCB ADDRESS;5 ; OUTPUTS:;B; SELECTED DRIVE IS CLEAREDA;H .ENABL LSB1+DBCLR: TSTB (R2) ;IS THE CONTROLLER READY?I BPL 10$ ;IF PL NO1 BIT #1,(R2) ;IS GO BIT SET?N BNE 10$ ;IF NE YES& MOVB #111,(R2) ;NO, ISSUE DRIVE CLEAR RETURN ;AND EXITR,DBCLR1: TSTB (R2) ;IS THE CONTROLLER READY? BPL 10$ ;IF PL NOO BIT #1,(R2) ;IS GO BIT SET?  BNE 10$ ;IF NE YES% MOVB #11,(R2) ;NO, ISSUE DRIVE CLEAR RETURN ;AND EXIT ;Y; NOTE:R;@; THE FOLLOWING INSTRUCTION WILL CAUSE ALL I/O ON OTHER UNITS TOD; ABORT. THIS IS OK BECAUSE THE TIMEOUT FACILITY SHOULD CATCH THEM.;R.10$: BIS #40,RPCS2(R2) ;ISSUE SUB-SYSTEM CLEAR0 MOVB U.UNIT(R5),RPCS2(R2) ;RE-SELECT THE DRIVE RETURN ;AND EXIT2 .DSABL LSBD;+'; **-DBCHK-VALIDATE AND CONVERT THE LBN(; 9; THIS ROUTINE IS CALLED FROM $DRQRQ TO DO LBN PROCESSINGR9; FOR DEVICES WHICH SUPPORT QUEUE OPTIMIZATION. IF BLKC2;9; DETECTS AN ERROR IT WILL RETURN TO THE CORRECT PLACE INR; $DRQRQ AFTER CALLING $IOALT.;I ; INPUTS:L;O; R1=I/O PACKET ADDRESSR; R5=UCB ADDRESS;E ; OUTPUTS:;C4; IF THE CHECKS SUCCEEDS, THEN THE LBN IN THE PACKET=; IS REPLACED BY THE CYLINDER/TRACK/SECTOR. R1 IS PRESERVED.T;E:; IF THE CHECKS FAILS, THEN $IOALT IS ENTERED WITH A FINAL8; STATUS OF IE.BLK AND A RETURN TO THE CORRECT PLACE IN ; $DRQRQ IS EXECUTED.N;O;S<; NOTE: ALL FUNCTIONS PUT INTO THE DRIVER QUEUE ARRIVE HERE.3; THESE INCLUDE IO.ATT, IO.DET, AND ACP FUNCTIONS.P;-;DBCHK: MOV I.FCN(R1),-(SP) ;PUT THE FUNCTION ONTO THE STACKI& CMPB #IO.ATT/256.,1(SP) ;IS IT ATTACH% BEQ 15$ ;IF EQ YES - LEAVE IT ALONEE' CMPB #IO.DET/256.,1(SP) ;IS IT DETACHA% BEQ 15$ ;IF EQ YES - LEAVE IT ALONES) BIC #7,(SP) ;CLEAR THE SUBFUNCTION BITSE- CMP #IO.STC,(SP) ;IS IT SET CHARACTERISTICS?E% BEQ 15$ ;IF EQ YES - LEAVE IT ALONEI TST (SP)+ ;CLEAN THE STACK) CALL $BLKC2 ;CHECK LOGICAL BLOCK NUMBERI+ CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBERT3 MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESSN" SWAB R1 ;SWAP TRACK TO HIGH BYTE$ BIS R1,R0 ;MERGE TRACK WITH SECTOR; MOV R0,I.PRM+12(R3) ;SAVE DESIRED TRACK AND SECTOR ADDRESSO' MOV R3,R1 ;RESTORE THE PACKET ADDRESS 10$: RETURN ;EXIT 15$: TST (SP)+ ;CLEAN THE STACK BR 10$ ;AND EXIT .END(SP) ;IS IT SET CHARACTERISTICS?E% BEQ 15$ ;IF EQ YES - LEAVE IT ALONEI TST (SP)+ ;CLEAN THE STACK) CALL $BLKC2 ;CHECK LOGICAL BLOCK NUMBERI+ CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBERT3 MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESSN" SWAB R1 ;SWAP TRACK TO HIGH BYTE$ BIS R1,R0 ;MERGE TRACK WITH SECTOR; MOV R0,I.PRM+12(R3) ;SAVE DESIRED TRACK AND SECTOR ADDRESSO' MOV R3,R1 ;RESTORE THE PACKET ADDRESS 10$: RETURN ;EXIT 15$: TST (SP)+ ;CLEAN THE S00yytcccc .TITLE EXDBTR .IDENT /08.01/E; 7; COPYRIGHT (C) 1987 BY DIGITAL EQUIPMENT CORPORATIONU; ALL RIGHTS RESERVED.;I>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; D. N. CUTLER 7-DEC-74I ;V+ ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ;; B. S. MCCARTHY;&; MODIFIED FOR RSX-11M-PLUS V2.1 BY:;U; B. S. MCCARTHY;-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:.; ; J. C. FRANZINI; B. S. MCCARTHY;-; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY: ;R$; B. S. MCCARTHY 25-DEC-86 08.00; 6; BM377 -- MOVE DRDSP TO DIR11M (DO YOU BELIEVE IT?&; THEY MADE ME WORK ON CHRISTMAS.); ; ; K. L. NOEL 10-FEB-87 08.01;R6; KLN018 -- Add support for XDT on KXJ-11 processor;H; THIS IS A VERSION OF ODT THAT MAY BE USED TO DEBUG RSX-11M EXECUTIVEI ; MODULES. IT IS AN OUTGROWTH OF THE STANDARD RSX-11 ODT WHICH WAS PRO-Y&!; DUCED BY M. SMITH , H. LEV ET. AL.";T#; MACRO LIBRARY CALLSR$;1%& .MCALL HWDDF$ & .MCALL CPRDF$ ; KLN018&' HWDDF$ ;DEFINE HARDWARE REGISTERS3' CPRDF$ ;DEFINE CPR SPECIFIC SYMBOLS ; KLN018E();C*; EQUATED SYMBOLS +; ,'-BPT=3 ;BREAKPOINT INSTRUCTION CODE1).BKP=16 ;NUMBER OF BREAKPOINTS -1 X 2r,/LPB=177516 ;LINE PRINTER BUFFER REGISTER,0LPS=177514 ;LINE PRINTER STATUS REGISTER21RLR=16 ;NUMBER OF RELOCATION REGISTERS -1 X 212TBT=20 ;T-BIT MASK FOR PROCESSOR STATUS WORD.63TKB=177562 ;CONSOLE TERMINAL INPUT BUFFER REGISTER64TKS=177560 ;CONSOLE TERMINAL INPUT STATUS REGISTER75TPB=177566 ;CONSOLE TERMINAL OUTPUT BUFFER REGISTERS76TPS=177564 ;CONSOLE TERMINAL OUTPUT STATUS REGISTER6TPR0=0 ; KLN0186TPR1=2 ; KLN0186TPR2=4 ; KLN0186TPR3=6 ; KLN01878;F9; LOCAL MACROS:;5;; DECODE NEXT COMMAND <;T=> .MACRO DECODE? IOT@ .ENDMAB;1 C; ERROR=D; EF .MACRO ERRORSG EMT 0H .ENDMIJ;2K; TEST MODE FOR EXEC OR USERL;IMN .MACRO TESTM ADDRO JSR R5,TESTMT P .WORD ADDRRQ .ENDMRS;OT; TYPE OUT CHARACTER(S)RU;S@V; TYPE OUT IS EFFECTED WITH A TRAP INSTRUCTION WITH THE BOTTOMW; BYTE ENCODED AS FOLLOWS:X; #Y; 300 = OUTPUT BOTH BYTES IN R0. !Z; 200 = OUTPUT LOW BYTE IN R0.&[; 340 = OUTPUT A SEQUENCE."\; 240 = OUTPUT A SEQUENCE.];E:^; ALL OTHER COMBINATIONS ARE TREATED AS THE ACTUAL BYTE_; TO OUTPUT.E`a .MACRO TYPE ARGb .IF IDN ,C c TRAP 200Id .IFF.e .IF IDN , f TRAP 300.g .IFFRh .IF IDN , i TRAP 340Aj .IFFk .IF IDN ,F l TRAP 240 m .IFFRn TRAP ARG&177Oo .ENDCp .ENDCq .ENDCr .ENDCs .ENDMt Tu .PAGE*v .SBTTL MULTIPROCESSOR LOADABLE XDT NODEwx; Ky; THIS IS A COPY OF THE PROTOTYPE NODE IN XDTINI. IT MUST BE KEPT IN SYNCz; WITH THAT COPY.A{; |} .IF DF L$$XDT&M$$PROE~+$XDTND:: ; PROTOTYPE CODE START ADDRESSF.PROTO/.AISA5: .WORD 0 ; ADDRESS OF APR5 (PSEUDO D)<&.XDTA5: .BLKW 1 ; XDT APR5 CONTENTS3.KISA5: .BLKW 1 ; SAVED APR5 CONTENTS DURING XDT<;.KINA5: .BLKW 1 ; SAVED I-SPACE APR5 CONTENTS DURING XDTC<.VECTR: .WORD V$$CTR+4 ; HIGHEST VECTOR ADDRESS (DEFAULTED ; TO ASSEMBLY VALUE)2.RTN: MOV .KINA5,@#KINAR5 ; RESTORE I SPACE APR5: MOV .KISA5,@.AISA5 ; RESTORE D SPACE APR5 IF NECESSARY5.RTNI: RTI ; EXIT TO EXEC (MAY BE CHANGED TO RTI):3.CRSH: MOV .KINA5,@#KINAR5 ; RESTORE I SPACE APR5W: MOV .KISA5,@.AISA5 ; RESTORE D SPACE APR5 IF NECESSARY JMP @#0 ; JUMP TO CRASHB+.CRADD = .-2 ; ADDRESS OF CRASH ADDRESSK).ODDA: CMP SP,.VECTR ; STACK OVERFLOW ?R BLO .SOVFL ; IF LO YES1 JSR R5,.COMMN ; ODD ADDRESS OR OTHER TRAP FOUR .WORD 0&.SGMT: JSR R5,.COMMN ; SEGMENT FAULT .WORD 20.BPTI: JSR R5,.COMMN ; BREAKPOINTS,T-BIT TRAPS .WORD 4..IOTX: JSR R5,.COMMN ; IOT INSTRUCTION TRAPS00yyttt tfDATA .WORD 69.ILLI: JSR R5,.COMMN ; ILLEGAL INSTRUCTION TRAPS (->10)R .WORD 10I".NEMT: JSR R5,.COMMN ; EMT TRAPS .WORD 12/ JMP @#0 ; ALWAYS ALLOW EXEC TO HANDLE TRAPSA+.TRADD = .-2 ; ADDRESS OF CRASH ADDRESS, .WORD 08.FPPE: JSR R5,.COMMN ; 11/40 FLOATING POINT EXCEPTIONS .WORD 16E..COMMN: MOV (R5),R5 ; GET SST VECTOR OFFSET* MOV @#KINAR5,.KINA5 ; SAVE I SPACE APR56 MOV @.AISA5,.KISA5 ; SAVE D SPACE APR5 IF NECESSARY0 MOV .XDTA5,@#KINAR5 ; MAP INTO XDT IN I SPACE< MOV .XDTA5,@.AISA5 ; MAP INTO XDT IN D SPACE IF NECESSARY* ADD #SSTVC1,R5 ; POINT TO EXEC SST ADDR MOV (R5),R5 ; AND GET IT RTS R5 ; AND OFF TO XDT !H1.SOVFL: MOV @#KINAR5,.KINA5 ; SAVE I SPACE APR5D6 MOV @.AISA5,.KISA5 ; SAVE D SPACE APR5 IF NECESSARY0 MOV .XDTA5,@#KINAR5 ; MAP INTO XDT IN I SPACE< MOV .XDTA5,@.AISA5 ; MAP INTO XDT IN D SPACE IF NECESSARY4 JMP @#SOVFL ; JUMP TO STACK OVERFLOW ENTRY POINT,.PLENG = . - .PROTO ; LENGTH OF DSR BLOCK .ENDC ; DF L$$XDT&M$$PROA .PAGE .IF DF X$$DBT .SBTTL LOCAL DATA;1; LOCAL DATA;S; CONTEXT VARIABLES H; THE ORDER OF THESE ITEMS IS INTENTIONAL, SEE REGISTER MAPPING SCHEME;A3INTBEG =. ;STARTING ADDRESS OF INTERNAL REGISTERSRUR0: 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 $S!ARG: 0 ;ARGUMENT REGISTER $ARLOW: 0 ;LOW LIMIT $LHI: 0 ;HIGH LIMIT $H%CNST: $XDT ;CONSTANT REGISTER $CO"QUAN: 0 ;QUANTITY REGISTER $Q FORM: 0 ;FORMAT REGISTER $F;P; INTERNAL TABLES;B1INTINX =. ;STARTING ADDRESS OF INTERNAL TABLESR;S<; BREAKPOINT CONTROL LISTS, AND EXTRA SLOT FOR SINGLE STEP; -ADR1: ;ADDRESS OF THE BREAKPOINT ($0B-$7B)55 .WORD TRTC,TRTC,TRTC,TRTC,TRTC,TRTC,TRTC,TRTC,TRTC$CT: ;PROCEED COUNT ($0G-$7G): .WORD 1,1,1,1,1,1,1,1,11UIN: ;USER INSTRUCTION SAVE LOCATION ($0I-$7I)H, .WORD BPT,BPT,BPT,BPT,BPT,BPT,BPT,BPT,BPT;Q; RELOCATION REGISTERS; %RELT: ;RELOCATION TABLES ($0R-$7R)N .WORD -1,-1,-1,-1,-1,-1,-1,-14INTEND=.-2 ;END OF INTERNAL REGISTERS AND TABLES;N"; EXEC SST TRAP VECTOR ADDRESSES;PF; THIS TABLE IS READ/WRITE AND THERE IS ONE SUCH TABLE PER PROCESSOR;C5SSTVEC: + ODDA ;0-ODD ADDRESS, OR HALT, VECTOR @4O + SGMT ;1-SEGMENT FAULT + BPTI ;2-T-BIT OR BPTE + IOTX ;3-IOT. + ILLI ;4-RESERVED OR ILLEGAL INSTRUCTION + NEMT ;5-EMT6 + $TRTRP ;6-TRAP (EXECUTIVE ALWAYS HANDLES TRAPS);TG; WORDS AND ORDERED BYTES, ITEMS MUST BE KEPT FROM COMMAND TO COMMANDN;I3CAD: .WORD 0 ;ADDRESS OF CURRENTLY OPEN REGISTER 7DOT: .WORD 0 ;ADDRESS OF LAST EXPLICITLY OPENED CELLT-BW: .WORD 0 ;LAST OPEN MODE 1=BYTE, 2=WORD=OPN: .WORD 0 ;LOCATION OPEN FLAG 0=NOT OPEN, NON-ZERO=OPENG(D.ARGS: .WORD 0 ;SEMI COLON PUSH WORD;@ ; THE FOLLOWING ITEMS NEED NOT BE KEPT FROM COMMAND TO COMMAND1 ; THEIR ORDER IS INTENTIONAL SO KNOW THY MAKER!I ;W + OP: .BYTE 0 ;CURRENT ARITHMETIC OPERATORE$SMFD: .BYTE 0 ;SEMI-COLON COUNTER"EXP: .WORD 0 ;EXPRESSION BUCKET2OUTB: .WORD TPB ;CONSOLE PRINTER BUFFER ADDRESS3OUTS: .WORD TPS ;CONSOLE PRINTER STATUS REGISTERW)PPC: .BLKW 1 ;SAVED PC LAST BREAKPOINT .IF DF M$$PRO6STENB: .BLKW 1 ;USED TO REENABLE SANITY TIMER IF IT' ;WAS ENABLED WHEN XDT WAS ENTEREDL .ENDC3 .IF DF C$$XDJ ;XDT SUPPORTED ON KXJ ; KLN018T ; KLN018<KXJNOT: .WORD 0 ;EQ 1 IF HOST IN ATTACHED MODE ; KLN018. ;EQ 0 IF HOST IN NOT ATTACHED ; KLN018 ; KLN018  .ENDC ; C$$XDJ ; KLN018;U=; THE FOLLOWING ITEMS MUST BE KEPT FROM COMMAND TO COMMAND.E ;! "T: .BYTE 0 ;T BIT IN USE FLAG"#P: .BYTE -1 ;PROCEED ALLOW FLAG;$S: .BYTE 0 ;SINGLE INSTRUCTION MODE, 00yytcccc0=NORMAL, >0=ENABLEW<%FM: .BYTE 2 ;OUTPUT FORMAT MODE, BYTE, WORD, ANSII, RAD50/&OBW: .BYTE 2 ;OPEN CELL TYPE, 1=BYTE, 2=WORD+'SEQ: .BYTE 0 ;CHANGE SEQUENCE INDICATIORI()* .IF DF K$$DAS+=,DMODE: .BYTE 'D,40 ;MODE FLAG (I OR D) AND SPACE CHARACTER 8-REGFL: .BYTE 0 ;REGISTER BEING DISPLAYED FLAG (1=YES)+.REGSV: .BYTE 0 ;SAVED REGFL FOR CHAININGN/0 .ENDC123 .EVEN45;T76; THE BELOW LOCATION IS USED IN BREAKPOINT PROCESSING:7;E8"9TRTC: BPT ;TRACE TRAP PROTOTYPE:;;W:<; ALL XDT TYPE ERRORS JUST GO TO "ERR" OR SOMEWHERE ELSE=;> ?SSTXDT: + ERR ;0-ODD ADDRESS@ + ERR ;1-SEGMENT FAULTA'A + ERR ;2-BPT OR T-BIT ("MCR" CALL)DB + DCD ;3-IOT ("DECODE")-C + ERR ;4-RESERVED OR ILLEGAL INSTRUCTIOND + ERR ;5-EMT ("ERROR")EE + TYPE ;6-TRAP=FG;EH; SST VECTOR ADDRESS TABLEI;NJKSSTADR: .WORD 4 ;ODD ADDRESSL .WORD 250 ;SEGMENT FAULTM .WORD 14 ;BPTPN .WORD 20 ;IOT!O .WORD 10 ;ILLEGAL INSTRUCTIONOP .WORD 30 ;EMTQ .WORD 34 ;TRAPRS; -T; INTERNAL REGISTER NAME AND CONTROL TABLES U;RV; NON-INDEXED REGISTER NAMESW;NX<YNIXMAP: .ASCII /01234567/ ;USER REGISTER NAMES FOR MAPPINGZ$[NIXREG: .BYTE 'S ;UST USER STATUS\ .BYTE 'A ;ARG ARGUMENT ] .BYTE 'L ;LOW LOW SCAN LIMIT ^ .BYTE 'H ;HI HIGH SCAN LIMIT_ .BYTE 'C ;CNST CONSTANT` .BYTE 'Q ;QUAN QUANTITY!a .BYTE 'F ;FORM FORMAT CONTROL.b .BYTE 0 ;END OF THIS LISTOcd;Oe; INDEXED REGISTER NAMESf;.g(hINXREG: .BYTE 'B ;ADR1 BKPT ADDRESSES$i .BYTE 'G ;CT BKPT PROCEED COUNTS(j .BYTE 'I ;UIN BKPT USER INSTRUCTIONS'k .BYTE 'R ;RELT RELOCATION REGISTERS7l .BYTE 0 ;END OF THIS LISTImn; o; INDEXED REGISTER TABLE BASESp;.qr .EVEN)sINXTBL: .WORD ADR1 ;BKPT ADDRESS TABLE!t .WORD CT ;BKPT PROCEED COUNTS!u .WORD UIN ;BKPT'D INSTRUCTIONE!v .WORD RELT ;RELOCATION TABLES;8w .WORD INTEND+2 ;END OF TABLE AREA FOR ADDRESS MAPPINGxy; z; CHARACTER CONVERSION LISTS.{;R|5}ALTTAB: .BYTE 033,175,176 ;ALTERNATE ALT-MODE FORMSR!~ .BYTE 0 ;END OF THIS LIST TOOT;T$; COMMAND NAME AND DISPATCH TABLES;I*COMTAB: ;ADDRESS OF THE CHARACTER TABLE;E8; OPEN REGISTER COMMANDS (ORDER AND POSITION CRITICAL);D .BYTE '\,'/,'','",'%.;;; CLOSE REGISTER COMMANDSD;  .BYTE 015,012,'^,'_,'@,'>,'<;;N; SPECIAL FORMSI;+ .BYTE '$,'=,'C,'Q,'.E;G'; OPERATORS (ORDER OF -+* IS CRITCAL)S; .BYTE ';,'-,'+,'*,',7;T ; COMMANDS;M .ASCII /BGKLOPRSX/S .IF DF K$$DAS2 .ASCII /ID/ ;INSTR MODE AND DATA MODE COMMANDS .ENDC, .BYTE 0 ;******* END OF THE LIST ******* .EVEN;N.; THE DISPATCH TABLE, ORDERED ON ABOVE TABLE;; OPEN REGISTER COMMANDS;*COMDIS: .WORD OCBYTE ;\ OPEN OCTAL BYTE# .WORD OCWORD ;/ OPEN OCTAL WORD# .WORD ANBYTE ;' OPEN ANSII BYTE # .WORD ANWORD ;" OPEN ANSII WORD& .WORD MODULO ;% OPEN RADIX 50 WORD; ; CLOSE REGISTER COMMANDS ;O/ .WORD CLCRET ; CLOSE, NO SUCESSIVE OPEN ' .WORD CLLNFD ; CLOSE, OPEN NEXT( .WORD CLUPAR ;^ CLOSE, OPEN PREVIOUS0 .WORD CLBACK ;_ CLOSE, OPEN PC RELATIVE MODE( .WORD CLATSG ;@ CLOSE, OPEN INDIRECT3 .WORD CLGRTH ;> CLOSE, OPEN PC OFFSET AS BRANCHR, .WORD CLLSTH ;< CLOSE, OPEN OLD SEQUENCE;O; SPECIAL FORMSD;T- .WORD REGT ;$ INTERNAL REGISTER REFERENCES, .WORD EQUALS ;= PRINT LEFT SIDE IN OCTAL. .WORD CHRCEE ;C CONSTANT REGISTER CONTENTS. .WORD CHRQUE ;Q QUANTITY REGISTER CONTENTS2 .WORD CHRDOT ;. LAST OPENED LOCATION'S ADDRESS;U ; OPERATORSO;R- .WORD SEMI ;; MULTIPLE ARGUMENT DELIMITER  .WORD MINS ;- SUBTRACTION,  .WORD PLUS ;+ .WORD ADDITION  .WORD STAR ;* MULTIPLY BY 50$ .WORD COMM ;, RELOCATION COMPUTE; ; COMMANDS;A) .WORD SEBK ;B SET / CLEAR BREAKPOINTSR# .WORD00yyttt tfDATA GOTO ;G GO TO USER'S DATA;2 .WORD KILO ;K KOMPUTE AND TYPE RELOCATION DATA1 .WORD LIST ;L LIST MEMORY ON SPECIFIED DEVICEY* .WORD OFST ;O TYPE PC RELATIVE OFFSETS) .WORD PROC ;P PROCEED FROM BREAKPOINTP2 .WORD RELO ;R SET / RESET RELOCATION REGISTERS. .WORD SNGL ;S SET / RESET SINGLE STEP MODE' .WORD EXIT ;X EXIT TO CRASH ROUTINED .IF DF K$$DAS/ .WORD INSTM ;I SWITCH TO INSTR DISPLAY MODEO. .WORD DATAM ;D SWITCH TO DATA DISPLAY MODE .ENDC O .SBTTL INITIALIZATION;+(; **-$XDT - RSX-11M-PLUS EXECUTIVE ODT;-  .ENABL LSB;<$XDT:: MOV #PR7,PS ;LOCK OUT INTERRUPTS, CURR=PREV=KERNEL( MOV SP,USP ;SAVE ENTRY STACK POINTER. MOV #USP,SP ;SET NEW STACK POINTER ADDRESS* MOV R5,-(SP) ;SAVE REGISTERS R5 THRU R0 MOV R4,-(SP) ;E MOV R3,-(SP) ;I MOV R2,-(SP) ;  MOV R1,-(SP) ; MOV R0,-(SP) ;# MOV PC,SP ;CHANGE STACK POINTERS5 MOV #SSTADR,R0 ;POINT TO TRAP VECTOR ADDRESS TABLEO1 MOV #SSTXDT,R1 ;POINT TO XDT TRAP VECTOR TABLE910$: MOV (R1)+,@(R0)+ ;INSERT XDT TRAP VECTOR ADDRESSES.# CMP R1,#SSTADR ;ANY MORE TO SET?C BLO 10$ ;IF LO YES .IF DF M$$PRO )  CMP #$INITL,UPC ;SYSTEM BOOTED BEFORE?T1  BEQ 20$ ;NO, ALWAYS PROMPT (CANNOT USE $XDTFLE+  ;OR $XDTPR BECAUSE D-SPACE NOT SET UPV%  ;IF THIS IS AN I/D SPACE SYSTEMV2 BIS $CPBIT,$XDTFL ;SHOW THIS CPU AS INITIALIZED) BIT $CPBIT,$XDTPR ;WANT AN XDT PROMPT?T BNE 20$ ;YES( JMP LEAVE ;NO, JUST RETURN TO CALLER 20$: ;A .IF DF K$$DAS1 CALL SETRW ;SET I-SPACE DESCRIPTOR REGS TO RWS .ENDC .ENDC MOV PC,SP ;LENGTHEN STACK 9 TYPE CRLF ;PLACE TERMINAL CARRIAGE IN PROPER POSITIONB&  TYPE 'X ;OUTPUT XDT IDENTIFICATION ! TYPE 'D ;O " TYPE 'T ;E # TYPE ': ;T $ TYPE 40 ; +% MOV $SYSID,R0 ;GET SYSTEM IDENTIFICATIONX,& TYPE R0+R0 ;OUTPUT SYSTEM IDENTIFICATION5' MOV $SYSID+2,R0 ;GET SECOND HALF OF IDENTIFICATIONJ( TYPE R0+R0 ;OUPUT IT, TOO !L9) TYPE CRLF ;PLACE TERMINAL CARRIAGE IN PROPER POSITIONR* DECODE ;GET FIRST COMMAND,+XDTSTK: ;REF LABEL - START OF XDT STACK, - .DSABL LSBE./0 .IF DF M$$PRO1.2$XDTIN:: ;INITIALIZE XDT FOR THIS PROCESSO93 BIT $CPBIT,$XDTFL ;THIS PROCESSOR ALREADY INITIALIZED? 4 BEQ 10$ ;NOT 5 RETURN ; 9610$: MOV (SP)+,UPC ;RETURN TO CALLER WHEN DONE WITH XDTR 7 BR $XDT ;E89 .ENDC: =; .SBTTL "$," PROCESSOR - INTERNAL REGISTER MAPPER0< =;SYNTAX--O$>;$L DELIVER INTERNAL ADDRESS OF L(?;$NL DELIVER INTERNAL ADDRESS OF L+2N2@;$N DELIVER INTERNAL ADDRESS OF USER REGISTER NA(B;SEE MAPPING TABLES, RANGE OF N IS 0-7C*DREGT: JSR PC,GETNUM ;GET AN OCTAL NUMBER E JSR PC,RTST ;CHECK FOR ERROR'F BCC 5$ ;R4 HAS BEEN MULTIPLIED BY 4G3$: ERROR ;$H5$: TST R2 ;SEE IF ANYTHING TYPED.I BNE 10$ ;IF SO IS INDEXED OR USER REGISTER$J JSR R5,LOOKUP ;SEE IF NON-INDEXED K + NIXREG-L BCS 12$ ;NON-INDEXED TURNS INTO A COMMANDN.M MOV R1,R4 ;PLACE IN LIST IS INTERNAL ORDER3N ADD #UST,R4 ;GET ADDRESS IN R4, GOTTA READ CHARR O BR 20$D$P10$: JSR R5,LOOKUP ;SEE IF INDEXED Q + INXREGR BCC 15$ ;WAS TRULY INDEXED7S12$: CMP #7+7,R4 ;INTERNAL USER REGISTER RANGE CHECKK T BLO 3$0U ADD #UR0,R4 ;SET ACCESS TO R0-R7 OF THE USER$V BR 25$ ;AVOID READING OF COMMAND:W15$: ADD INXTBL(R1),R4 ;COMPUTE ADDRESS TO INDEXED TABLE.X20$: JSR PC,GET ;GET THE ASSUMED TERMINATOR0Y25$: INC R2 ;SHOW THEM THAT R4 GOT VALID DATAZ[\ .IF DF K$$DAS]*^ INCB REGFL ;SET FLAG FOR REGISTER OPEN_` .ENDCab.c JMP CLGL ;RE-USE CHARACTER, R2 IS NON-ZEROd D6e .SBTTL "K" PROCESSOR - COMPUTE AND PRINT RELOCATIONf g;SYNTAX--R+h;AK TYPE RELOCATION DEAL FROM DOT TO A+i;L;AK TYPE RELOCATION DEAL FROM L TO ARj1k;IF A IS NULL THE THE OLD BEST FIT RULE APPLIESB5l;TYPES =N,DDDDDD WHERE N IS THE RELOCATION REGISTERP%m; AND D-D IS THE RELOCATION BIAS5n+oKILO: TST R2 ;SEE WHO PICKS THE REGISTE00yytccccR p BNE 10$q TST R3 ; ADDRESS SPECIFIED? r BNE 5$ ; YES(s MOV CAD,R4 ; NO, GET CURRENT ADDRESS t BR 7$ ;T3u5$: MOV R5,R4 ; GET ADDRESS SPECIFIED ON COMMANDO4v7$: JSR PC,LOCA ; GET CLOSEST RELOCATION REGISTER1w MOV R0,R4 ;DID WE FIND A RELOCATION REGISTER?P&x BMI ERR ;CAN'T FIND ONE THATS GOOD$y10$: BIC #177770,R4 ;EDIT REGISTERz TYPE '= ;OUTPUT CUED { TYPE 40 ;H#| MOVB R4,R0 ;TYPE REGISTER & A ,D} ADD #"0,,R0~ TYPE R0+R0 ;$ ASL R4 ;GO GET IT AS TABLE INDEX% TST R3 ;SEE WHO TYPED THE ADDRESSE  BNE 15$ MOV CAD,R5 ;THAT CAD!R15$: SUB RELT(R4),R5 MOV R5,R0 ;BIAS COMPUTE  JSR PC,CADW ;PRINT AS WORD  DECODE - .SBTTL "A-Q-." PROCESSORS - SPECIAL VALUESG;MERELY SUBSTITUTE THE VALUE IN R4 WITH THE CONTENTS OF THE SPECIFIEDN ;REGISTER.-CHRQUE: MOV QUAN,R4 ;LAST QUANTITY PRINTEDO  BR CHR001)CHRCEE: MOV CNST,R4 ;CONSTANT REGISTER  BR CHR001'CHRDOT: MOV CAD,R4 ;CURRENT LOCATIONO&CHR001: INC R2 ;ALLOW AS R4 IS REAL- JSR PC,GET ;GET NEXT CHARACTER AND ASSUMER BR CLGL ;IT IS A TERMINATOR4 . .SBTTL COMMAND DECODER AND MAIN LOOP OF ODT; COMMAND DECODER - ODT'; ALL REGISTERS MAY BE USED (R0-R5),+;ERROR ENTRY, TYPE FLAG AND GO DO COMMANDH*ERR: CALL SETCN ;SET OUTPUT FOR CONSOLE$ TYPE '? ;OUTPUT ERROR INDICATION;1; DECODE FROM THE TOP, CLOSE ALL AND DO CR/LF/_S;/DCD: MOV #XDTSTK,SP ;SET THE STACK FOR SANITYO& CALL SETCN ;SET OUTPUT FOR CONSOLE9 TYPE CRLF ;PLACE TERMINAL CARRIAGE IN PROPER POSITIONL! CLR OPN ;SET NO LOCATION OPENB .IF DF K$$DAS( CLRB REGFL ;CLEAR REGISTER OPEN FLAG .ENDC& TYPE 'X ;OUTPUT INPUT SOLICITATION  TYPE 'D ;  TYPE 'T ;N TYPE 76 ;'>'*;MAINTAIN OPENED LOCATION, RE-INIT INPUT/NEWC: CLRB SMFD ;CLEAR SEMI-COLON FLAG/COUNT ( CLR R3 ;ZERO SECONDARY ARGUMENT FLAG CLR R5 ;AND ARGUMENT;NEW SUB-EXPRESSION ENTRYE&NEWE: CLRB OP ;CLEAR OPERATOR FOUND3 CLR EXP ;SET ZERO IN EXPRESSION SO FAR LOCATIONO';GET NUMBER AND THEN SCAN FOR COMMAND 9NEWN: JSR PC,GETNUM ;GET AN OCTAL NUMBER AND TERMINATORN*;NON-OCTAL CHAR TYPED WHAT ARE WE TO DO?+CLGL: JSR R5,LOOKUP ;GO SEE IF IT IS REAL'  + COMTAB ;THIS DEFINES REAL$ BCS ERR ;EASY ENOUGH IF NOT REAL& TST R2 ;IF NOTHING TYPE BOTHER NOT! BEQ CL01 ;WITH THE EXPRESSION$ JSR PC,EXPCOM ;COMPUTE EXPRESSION-CL01: JMP @COMDIS(R1) ;GO TO PROPER ROUTINEA/;FOR THE BENEFIT ALL REGISTERS ARE AS FOLLOWS /;R0 LAST CHARACTER TYPED, THE COMMAND ITSELF! 3;R1 TABLE INDEX TO COMMAND ADDRESSES, IT IS USED.B1;R2,R4 FIRST ARGUMENT, IF R2<>0 THEN R4 IS DATAT2;R3,R5 SECOND ARGUMENT, IF R3<>0 THEN R5 IS DATA;A); SET OUTPUT DEVICE TO CONSOLE TERMINALS; 1SETCN: MOV #TPB,OUTB ;SET OUTPUT BUFFER ADDRESSO+ MOV #TPS,OUTS ;SET OUTPUT STATUS ADDRESS  RETURN ;M PB .SBTTL "\-/-'-"-%-:" PROCESSOR - OPEN AND TYPE CONTENT COMMANDS ;SYNTAX--T0;NC OPEN LOC N IN MODE C, SET MODE FOR NEXT&;C TYPE LAST OPENED LOC IN MODE COCWORD: ;OCTAL WORD - R1=2ANWORD: ;ANSII WORD - R1=6!MODULO: ;RADIX 50 WORD - R1=101;OPEN WORD MODE ENTRY, R1 CONTAINS FORMAT INDEX) MOV #2,R0 ;SET BYTE FLAG TO WORD FLAG  BR OPE004 ;GO TO IT ACE HOLEOCBYTE: ;OCTAL BYTE - R1=0ANBYTE: ;ANSII BYTE - R1=40OPE001: MOV #1,R0 ;SET WORD FLAG TO BYTE FLAG0OPE004: TST R2 ;IF NO VALUE TYPED NO MODE SET  BEQ 10$( MOV R0,BW ;SET MODE AND FORMAT FLAGS' MOVB R0,OBW ;SET THE LATER USE MODE+ MOVB R1,FM ;SET THE MODE FLAG FOR SOOTH - MOV R4,CAD ;SET ADDRESS FOR EXPLICIT OPEN ! MOV R4,DOT ;RESET RETURN PTR.R .IF DF K$$DAS) MOVB REGFL,REGSV ;INIT REGFL SAVE BYTEA .ENDC%10$: CMP #1,R0 ;CHECK ON BYTE MODEY BEQ 15$ ;NOT BYTE MODE% BIT #1,CAD ;SEE IF ADDRESS IS ODD  BEQ 15$ ;ALL IS GOOD# CLR R1 ;THEY00zyttt tfDATA GET BYTE MODE ONLYE  BR OPE001' 15$: MOV R1,-(SP) ;SAVE FORMAT MAINLY   JSR PC,GETCAD ;GET THE DATA  MOV (SP)+,R1 ;GET FORMAT2  JSR PC,@TYFORM(R1) ;PRINT DATA IN PROPER FORMAT'  BR NEWC ;GO GETTA NEW COMMAND TO DO RD .SBTTL "-->-<-^-_-@" PROCESSOR - CLOSE AND OPEN REGISTERS;CARRIAGE RETURN'CLCRET: JSR PC,PUTCAD ;CLOSE LOCATION0 DECODE ;RETURN TO DECODER!;LESS THAN, BACK TO MAIN STREAM 2CLLSTH: INCB SEQ ;SET FLAG TO LATER RESTORE CAD;LINE FEED, NEXT ONE DOWN +CLLNFD: JSR PC,PUTCAD ;CLOSE PRESENT CELL% TSTB SEQ ;SHOULD CAD BE RESTORED?( BEQ OP5 ;BRANCH IF NOT* MOV DOT,CAD ;RESTORE PREVIOUS SEQUENCE !" .IF DF K$$DAS#*$ MOVB REGSV,REGFL ;RESTORE REGISTER FLAG%& .ENDC'(*) CLRB SEQ ;RESET FLAG; NO LONGER NEEDED * BR OP2A ;T(+OP5: ADD BW,CAD ;GENERATE NEW ADDRESS.,OP2: ;MOV CAD,DOT ;INITIALIZE DOT (REMOVED)5-OP2A: TYPE CRLF ;PLACE CARRIAGE IN PROPER POSITIONT. MOV CAD,R0 ;NUMBER TO TYPE/ JSR PC,RORA ; CHECK FORMAT0 MOVB FM,R0 ;SET FORMAT1 ASR R0 ;SPLIT R0 IN HALF+2 MOVB COMTAB(R0),R0 ;SET SUFFIX CHARACTER3 TYPE R0 ;PRINT CHARACTER4 MOV CAD,R4 ;SET UP THE DATA$#5 CLR R2 ; SET TO USE CAD ADDRESSE6 CLRB OP ;THIS IS BECUZE 7 CLR EXP/8 JMP CLGL ;R0 HAS TERMIN, R4- DATA, R2= FLAGA9:;UP ARROW, NEXT ONE UP;<CLUPAR: JSR PC,PUTCAD $= SUB BW,CAD ;GENERATE NEW ADDRESS> BR OP2 ;GO DO THE REST?"@;BACK ARROW, PC RELATIVE COMPUTEA0BCLBACK: JSR PC,TCLS ;TEST WORD MODE AND CLOSEC ADD R4,R2 ;COMPUTE D CMPB (R2)+,(R2)+ ;NEW ADDRESSEPCS: MOV R2,CAD ;UPDATE CADF BR OP2A ;GO FINISH UPTG&H;AT SIGN, ABSOLUTE OR INDIRECT CHAINI0JCLATSG: JSR PC,TCLS ;TEST WORD MODE AND CLOSE#K MOV R4,R2 ;GET ABSOLUTE ADDRESSG L BR PCSTM)N;GREATER THAN, PC OFFSET BRANCH ADDRESSXO&PCLGRTH: JSR PC,TCLS ;TEST AND CLOSE0Q MOVB R4,R1 ;COMPUTE NEW ADDRESS, EXTEND SIGNR ASL R1 ;R2=2@R2)S ADD #2,R1 ;+2ET ADD R1,R2 ; +PC U BR PCS V"W;HANDY DANDY TO DO SOME LEG WORKX)YTCLS: JSR PC,PUTCAD ;CLOSE CURRENT CELL%Z CMP #2,BW ;ONLY WORD MODE ALLOWEDA[ BNE ERR1 ;BRANCH IF ERRORN%\ MOV CAD,R2 ;CURRENT ADDRESS IN R2T%] MOV R2,DOT ;MARK CURRENT POSITIONO^_` .IF DF K$$DASa'b MOVB REGFL,REGSV ;SAVE REGISTER FLAGA(c CLRB REGFL ;CLEAR OPEN REGISTER FLAGde .ENDCfg h RTS PCi 3j .SBTTL "O" PROCESSOR - COMPUTE AND PRINT OFFSETS;k l;SYNTAX--#!m;AO TYPE OFFSETS FROM . TO A#n;L;AO TYPE OFFSETS FROM L TO ASo3p;TYPES _PPPPPP >DDDDDD WHERE P-P IS PC RELATIVEL q; AND D-D IS BRANCH OFFSETr(sOFST: TST R3 ;HOW ABOUT A VALUE OTHERt BNE 10$ ;THAN CADRu MOV CAD,R5 ;RELUCTANTLYAv10$: SUB R5,R42w SUB #2,R4 ;NO TRICKS, ODD AND NON-EXIST THINGS!x TYPE '_ ;TYPE PC RELATIVE CUEF y TYPE 40 ;R z MOV R4,R0'{ MOV R4,-(SP) ;GOOD IDEA TO SAVE THIS#| JSR PC,CADW ;TYPE VALUE + BLANKR#} TYPE 76 ;TYPE OFFSET BRANCH CUE ~ MOV (SP)+,R0R ASR R0 ;DIVIDE8OF09: JSR PC,CADW ;16 BITS SO YOU CAN SEE HOW FAR OFF DECODE ; GET NEXT COMMAND B .SBTTL "=" PROCESSOR - PRINT LEFT SIDE EXPRESSION ON RIGHT SIDE4EQUALS: MOV R4,R0 ;PROPER PRIOR PLANNING PREVENTS BR OF09 ;POOR PERFORMANCE ;JUST ANOTHER ERROR CALL ERR1: ERRORT C+ .SBTTL SST INTERRUPT VECTOR ENTRY POINTS;,,; SEGMENT FAULT - V1 - "MP" - NO PROCEED;P+SGMT: TESTM $SGFLT ;TEST IF IN EXEC MODE ) BIC #160000,SR0 ;UNFREEZE SEGMENT UNIT MOV #"MP,EXP ;ENTRY PREFIXO  BR NIXP ;W;,; STACK OVERFLOW - - "SO" - NO PROCEED*; ODD ADDRESS - V0 - "OD" - NO PROCEED&; BPT - V2 - "BE" - SPECIAL CASES"; T-BIT - V2 - "TE" - PROCEED ; IOT - V3 - "IO" - PROCEED1; RESERVED OR ILLEGAL - V4 - "IL" - NO PROCEEDC;.+ODDA: MOV #"SO,EXP ;ASSUME STACK OVERFLOW,$ CMP SP,#V$$CTR+4 ;STACK OVERFLOW? BLO NIXP ;IF LO YEST& TESTM $TRP04 ;TEST IF IN EXEC MODE" MOV #"OD,EX00 zytccccP ;"OD:" FOR ODD ONE BR NIXP ;NIX ON PROCEEDY+BPTI: TESTM $TRACE ;TEST IF IN EXEC MODE , MOV #"BE,EXP ;"BE:" FOR MAYBE A BAD ENTRY CLRB P ;ALLOW PROCEED DEAL( BR INTR ;SPECIAL NUMBER FOR THIS ONE+IOTX: TESTM $IOTRP ;TEST IF IN EXEC MODE  MOV #"IO,EXP ;"IO:" FOR IOTEE BR ALOP ;ALLOW PROCEED+ILLI: TESTM $ILINS ;TEST IF IN EXEC MODE;* MOV #"IL,EXP ;"IL:" FOR ILL INSTRUCTIONNIXP: MOVB #-1,P ;NO PROCEEDF  BR INTR ;S; ; EMT - V5 - "EM" - PROCEED$; TRAP - V6 - "TR" - NO PROCEED;O+NEMT: TESTM $EMTRP ;TEST IF IN EXEC MODEC  MOV #"EM,EXP ;"EM:" FOR EMTEE$ALOP: MOVB #BKP+2,P ;ALLOW PROCEED;E+; COMMON INTERRUPT SERVICE AND DISPATCHER;X5INTR: BIT #TBT,2(SP) ;T-BIT SET IN STACKED PS WORD?O BEQ 1$ ;IF EQ NO* CMP PPC,(SP) ;PC CHANGE FROM LAST TRAP? BNE 1$ ;IF NE YES. JMP RTN ;MUST HAVE HAD AN INTERRUPT BEFORE& ;THE INSTRUCTION HAD A CHANCE TO% ;EXECUTE. AN INTERRUPT SERVICEP! ;ROUTINE EXITS WITH AN RTI.O*1$: MOV (SP)+,UPC ;SET THE USER PC VALUE& MOV (SP)+,UST ;AND HIS ENTRY STATUS# MOV R0,UR0 ;SAVE EXEC REGISTERS - MOV #UR0+2,R0 ;POINT TO REGISTER SAVE AREAS* MOV R1,(R0)+ ;SAVE REGISTERS R1 THRU SP MOV R2,(R0)+ ;  MOV R3,(R0)+ ;O MOV R4,(R0)+ ;F MOV R5,(R0)+ ;( MOV SP,(R0)+ ; ( MOV #XDTSTK,SP ;SET XDT STACK POINTER .IF DF M$$PRO1 CLR -(SP) ;ASSUME SANITY TIMER IS NOT ENABLED8 BIT $CPBIT,$STENB ;SANITY TIMER ENABLED FOR THIS CPU? BEQ 3$ ;NO  BIS $CPBIT,(SP) ;SAVE CPU BIT. BIC (SP),$STENB ;WANT SANITY TIMER DISABLED CALL $STTIC ;;83$: MOV (SP)+,STENB ;SAVE POLARITY OF SANITY TIMER BIT .ENDC5 MOV #SSTADR,R0 ;POINT TO TRAP VECTOR ADDRESS TABLE1 MOV #SSTXDT,R1 ;POINT TO XDT TRAP VECTOR TABLE)2 MOV #SSTVEC,R2 ;POINT TO TABLE OF TRAP CONTENTS55$: MOV @(R0),(R2)+ ;SAVE THE CURRENT TRAP CONTENTSS2 MOV (R1)+,@(R0)+ ;SET XDT TRAP VECTOR ADDRESSES# CMP R1,#SSTADR ;ANY MORE TO SET?T BLO 5$ ;IF LO YESO .IF DF K$$DAS1 CALL SETRW ;SET KERNEL INSTRUCTION DESCRIPTORD ;REGISTERS TO READ/WRITE .ENDC;TRY AND FIND OUT WHAT TO DO( TSTB P ;SEE IF CONTROLLED BREAKPOINT+ BNE 10$ ;NOT DUE TO A PLANNED INTERRUPTP/ TSTB T ;IS A BPT OR T-BIT, SEE IF A PROCEED 1 BNE TBIT ;COMMAND IS BEING DONE, GO FINISH ITR- TSTB S ;NO REMOVAL OF BREAKS ON S.I. MODE1  BNE 12$ ;SKIP NEXT TWO WORDS;; REMOVE EXEC BREAKPOINTSS;/10$: MOV #ADR1,R4 ;POINT TO BREAKPOINT VECTOR .IF DF K$$DAS411$: MOV UIN-ADR1(R4),-(SP) ;PUSH CORRECT CONTENTS* MTPI @(R4)+ ;REINSERT CORRECT CONTENTS .IFF9 11$: MOV UIN-ADR1(R4),@(R4)+ ;REINSERT CORRECT CONTENTST   .ENDC  ) CMP #ADR1+BKP,R4 ;ANY LEFT TO RESTORE?R BHIS 11$ ;IF HIS YES512$: MOV UPC,R5 ;GET A COPY OF THE PC AT INTERRUPTL% TSTB P ;BREAKPOINT OR T-BIT CHECKS( BNE 30$ ;DEFINITELY NOT A BREAKPOINT% MOVB S,R4 ;SEE IF SINGLE STEPPING# BNE 22$ ;AND PRETEND0;AT THIS POINT IT MAY BE DUE TO T-BIT OR A BPT+ MOVB #BKP+2,P ;SET ALLOW TO THE 8'TH ONE  .IF DF K$$DAS4 MFPI -(R5) ;GET TRAPPED INSTRUCTION FROM I-SPACE CMP (SP)+,TRTC ;IS IT A BPT?  .IFF!/" CMP -(R5),TRTC ;BACK-UP R5 AND SEE WHAT'S UPI#$ .ENDC%&#' BEQ 30$ ;IT WAS A NON-BREAK BPTC,( MOV #BKP,R4 ;SET ADDRESS OF LEGIT BREAKS/)15$: CMP R5,ADR1(R4) ;LOOK IT UP IN THE TABLET** BEQ 20$ ;FOUND THE NASTY LITTLE BUGGER+ SUB #2,R4 ;KEEP AT IT, BGE 15$ ;UNLESS NO MOREE/- MOV #"TE,R4 ;NOT THERE, MUST BE T-BIT ERRORO(. TST (R5)+ ;RESET PC TO MAKE IT RIGHT/ BR 26$ ;LABOR5-020$: MOV R5,UPC ;BACK-UP PC FOR BREAKPOINTP+122$: MOVB R4,P ;BREAKPOINT IS A REAL ONE+2 DEC CT(R4) ;CHECK OUT THE PROCEED COUNTU&3 BNE 31$ ;LABOR ON A MIS-CONCEPTION#4 INC CT(R4) ;RESET PROCEED COUNT4$5 ASR R4 ;OCTAL TO UN-BIASED ASCII6 ADD #"0B,R4 ;BIAS TO ASCII%726$: MOV R4,EXP ;SET TH00zyttt tfDATAE PREFIX UPY8.9;COMMON TYPE ROUTINE FOR SST VECTORS USED UP:4;30$: TYPE CRLF ;PLACE CARRIAGE IN PROPER POSITION< MOV EXP,R0 ;THE PREFIX= TYPE R0+R0 ; > TYPE ': ; (? MOV R5,R0 ;TYPE ADDRESS OF INTERRUPT*@ JSR PC,RORA ;AND THE REST OF THE ENTRY A DECODER"B31$: JMP C990 ;BRANCH STRETCHERC R=D .SBTTL "G, S, P" PROCESSORS - GO, SINGLE STEP, AND PROCEED(E;;!F; "G" PROCESSOR - GO TO PROGRAMC G;SYNTAX--S#H;LG START PROGRAM AT LOCATION LC"I;G START PROGRAM AT CURRENT PCJ(KGOTO: TST R2 ;SEE IF SPECIFIC ADDRESSL BEQ 10$ ;NOM MOV R4,UPC ;SET THE PC&N10$: CLRB S ;NO SINGLE INSTRUCTIONS"OTBIT: CLRB T ;CLEAR T-BIT FLAGSP BIS #TBT,UST ;BOTH0&Q TSTB S ;SEE IF WE NEED A T-BIT BITR BNE GRTT ;NO GO ON S BIC #TBT,UST ;SET THE TEE BITTU;NV; SET EXEC BREAKPOINTSW;GX/Y10$: MOV #ADR1,R4 ;POINT TO BREAKPOINT VECTORZ[\ .IF DF K$$DAS]-^20$: MFPI @(R4) ;SAVE CONTENTS OF LOCATIONT_ MOV (SP),UIN-ADR1(R4) ;-` MOV TRTC,(SP) ;PUSH BREAKPOINT INSTRUCTIONI+a MTPI @(R4)+ ;SET BREAKPOINT INSTRUCTIONRbc .IFFHd8e20$: MOV @(R4),UIN-ADR1(R4) ;SAVE CONTENTS OF LOCATION"f MOV TRTC,@(R4)+ ;SET BREAKPOINTgh .ENDCij .IF DF M$$PROkl BIT #1,SR0 ;MAPPING ENABLED+m BEQ 24$ ;IF EQ NO, CAN'T GET TO LOWCR'S no .IF DF K$$DASp(q BIT #4,SR3 ;KERNEL D-SPACE ENABLED ?+r BEQ 24$ ;IF EQ NO, CAN'T GET TO LOWCR'Sst .ENDC ; DF K$$DASu.v MOV KISAR6,-(SP) ;SAVE CURRENT EXEC MAPPING'w MOV R0,-(SP) ;AND A SCRATCH REGISTERI=x MOV UIN-ADR1(R4),-(SP) ;FETCH USER INSTRUCTION FOR UPDATES*y MOVB $NCPU,R0 ;GET NUMBER OF PROCESSORS%z ASL R0 ;AND CONVERT TO WORD INDEX 3{21$: MOV $K6TAB-2(R0),KISAR6 ;REMAP TO NEXT LOWCR2| MOV (SP),140000+UIN-ADR1(R4) ;STUFF INSTRUCTION%} SUB #2,R0 ;POINT BACK TO NEXT CPU ~ BGT 21$ ;IF GT THERE IS ONEL% TST (SP)+ ;GET RID OF INSTRUCTIONN) MOV (SP)+,R0 ;RESTORE SCRATCH REGISTER 1 MOV (SP)+,KISAR6 ;RESTORE CURRENT EXEC MAPPINGM24$: .ENDC ; DF M$$PRO( CMP #ADR1+BKP,R4 ;ANY MORE TO INSERT? BHIS 20$ ;IF HIS YESGRTT:V .IF DF K$$DAS$ BIT #1,SR0 ;MAPPING ENABLED YET? BEQ LEAVE ;IF EQ NOA. BIT #4,SR3 ;KERNEL DATA SPACE ENABLED YET? BEQ LEAVE ;IF EQ NOU4 MOV #KINDR0,R0 ;POINT TO KERNEL INSTR DESCR REG 0+25$: BIC #4,(R0)+ ;SET RO ACCESS FOR EXECP CMP R0,#KINDR7 ;DONE YET? BLOS 25$ ;IF LOS NOS .ENDC+LEAVE: CLR OPN ;CLEAR LOCATION OPEN FLAGM5 MOV #SSTADR,R0 ;POINT TO TRAP VECTOR ADDRESS TABLEP2 MOV #SSTVEC,R1 ;POINT TO EXEC TRAP VECTOR TABLE.30$: MOV (R1)+,@(R0)+ ;SET EXEC TRAP VECTORS3 CMP R0,#SSTADR+ ;ANY MORE TO SET?Q BLO 30$ ;IF LO YES .IF DF M$$PRO1 BIS STENB,$STENB ;POSSIBLY ENABLE SANITY TIMERT .ENDC3 .IF DF C$$XDJ ;XDT SUPPORTED ON KXJ ; KLN018P ; KLN0186 BIT #4,SR3 ;IS KERNEL D SPACE ENABLED? ; KLN018D BEQ 40$ ;IF EQ NO, THIS MUST BE VIRGIN BOOT NOT ON KXJ ; KLN0180 BIT #F5.XDJ,$FMSK5 ;XDT ON KXJ? ; KLN018" BEQ 40$ ;IF EQ NO ; KLN018 ; KLN0180 MOV $KXPTR,R0 ;GET ADDRESS OF DCB ; KLN0183 MOV D.UCB(R0),R0 ;GET ADDRESS OF UCB ; KLN0183 MOV U.SCB(R0),R0 ;GET ADDRESS OF SCB ; KLN018S3 MOV S.KRB(R0),R0 ;GET ADDRESS OF KRB ; KLN018D4 MOV K.CSR(R0),R0 ;GET ADDRESS OF TPR0 ; KLN0184 MOV #RI$XDD,TPR2(R0) ;XDT DETACH CODE ; KLN0188 MOV $KXVC1,R1 ;GET ADDRESS OF FIRST VECTOR ; KLN0183 ADD #4,R1 ;GET ADDRESS OF XDT VECTOR ; KLN018D5 MOV R1,@#KXJQIR ;NOTIFY HOST OF DETACH ; KLN0180 ; KLN0189 CLR KXJNOT ;KEEP TRACK OF DETACH OURSELVES ; KLN018V>35$: TST TPR2(R0) ;HOST RECEIVED DETACH MESSAGE? ; KLN018" BNE 35$ ;IF NE NO ; KLN018 ; KLN018  .ENDC ; C$$XDJ ; KLN018 ; KLN01840$: ; KLN018# MOV #UR0+2,R0 ;POINT TO SAVED R1 5 MOV (R0)+,R1 ;RESTORE REGISTERS R1 THRU SP THEN R0T MOV (R0)+,R2 ; MOV (R0)+00zytcccc,R3 ;A MOV (R0)+,R4 ;R MOV (R0)+,R5 ;V MOV (R0)+,SP ;Y MOV UR0,R0 ;" MOV UST,-(SP) ;SET EXEC PS WORD" MOV UPC,-(SP) ;SET EXEC PC WORD% MOV (SP),PPC ;SET PREVIOUS PC WORD0!RTN: RTT ;RETURN TO EXECUTIVE ;'; "S" PROCESSOR - SINGLE STEP PROCEED ;SYNTAX--8-;NS EXECUTE N INSTRUCTIONS AND THEN STOP ;S EXECUTE ONE INSTRUCTION8&SNGL: MOVB #BKP+2,R0 ;FAKE THE BREAK) MOVB R0,S ;SET THE FLAG FOR S.I. MODES( BR PR01 ;FAKE A PROCEED IN S.I. MOOD;+; "P" PROCESSOR - PROCEED FROM BREAKPOINTV ;SYNTAX---;NP PROCEED THRU THIS BREAKPOINT N TIMES ;P ASSUME N=1PROC: CLRB S ;SET FAST MODE" MOVB P,R0 ;GET NUMBER OF BREAK' BMI PR02 ;THERE WASN'T ONE SO FAR ?S*PR01: TST R2 ;SEE IF VALUE IN R4 VIA R2. BNE 10$ ;SEE IF AND WHAT SETTING FOR COUNT) MOV #1,R4 ;INIT IT TO ONE FOR A START&10$: MOV R4,CT(R0) ;SET USER'S COUNT1C990: CMPB P,#BKP ;SEE IF A REAL ONE OR A FAKER BGT TBIT ;BRANCH IF FAKE* TSTB S ;SEE IF SINGLE INSTRUCTION MODE BNE TBIT ;IF SO EXIT NOW INCB T ;SET T-BIT FLAG BIS #TBT,UST ;SET T-BIT  BR GRTTPR02: ERROR ;ANNOUNCE ERRORE M= .SBTTL "L" PROCESSOR - LIST MEMORY ON THE SPECIFIED DEVICES ;SYNTAX-- 6; D;S;FL WHERE D IS DEV, <> OR 0 = CONSOLE, 1 = LPT+; S IS START ADDRESS, SETS $L IF THEREI*; F IS STOP ADDRESS, SETS $H IF THERE+LIST: TST R2 ;SET UPPER AND LOWER LIMITSF" BEQ 10$ ;IF SPECIFIED TO DO SO  MOV R4,HI10$: TST R3 ;DO THE LOW ONE  BEQ 15$  MOV R5,LOW .15$: CMPB #2,SMFD ;SEE IF AN EXTRA ARGUMENT BNE 17$ ;USE THE CONSOLE$ TST D.ARGS ;LOOK AT THE ARGUMENT BEQ 17$ ;DO NOT ARGUEC< MOV #LPS,OUTS ;SET OUTPUT STATUS REGISTER TO LINE PRINTER MOV #LPB,OUTB ; TYPE 14 ;OUTPUT A FORM FEEDL-17$: MOV LOW,R5 ;GET STARTING DUMP ADDRESSI& MOVB OBW,R0 ;GET ADDRESS INCREMENT0 SUB R0,R5 ;BIAS ADDRESS BY ADDRESS INCREMENT# MOV R5,CAD ;SET CURRENT ADDRESS ' TST -(SP) ;MAKE A HOLE IN THE STACKL20$: CLR (SP) ;NEW LINE UPO( JSR PC,SNAGIT ;ACCESS DEVICE FOR DATA. JSR PC,SPRINT ;PRINT ADDRESS AND FIRST ITEM#25$: JSR PC,SNAGIT ;GET MORE DATA1% JSR PC,DPRINT ;JUST PRINT THE DATAE INC (SP) ;COUNT THE DATA  CMP #7,(SP) ;CHECK THE COUNT+ BNE 25$ ;JUST LIKE THEY TOLD YOU AT THEW% BR 20$ ;FAMOUS PROGRAMMERS SCHOOLV ,& .SBTTL "X" PROCESSOR - EXIT COMMAND;A; EXIT COMMAND;C ; SYNTAX X;AK; THE EXIT COMMAND IN XDT EFFECTS A JUMP TO THE EXECUTIVE $CRASH ROUTINE.R; EXIT: ;REFERENCE LABEL;3 .IF DF C$$XDJ ;XDT SUPPORTED ON KXJ ; KLN018N ; KLN0186 BIT #4,SR3 ;IS KERNEL D SPACE ENABLED? ; KLN018D BEQ 10$ ;IF EQ NO, THIS MUST BE VIRGIN BOOT NOT ON KXJ ; KLN0180 BIT #F5.XDJ,$FMSK5 ;XDT ON KXJ? ; KLN018" BEQ 10$ ;IF EQ NO ; KLN018 ; KLN0180 MOV $KXPTR,R0 ;GET ADDRESS OF DCB ; KLN0183 MOV D.UCB(R0),R0 ;GET ADDRESS OF UCB ; KLN018I3 MOV U.SCB(R0),R0 ;GET ADDRESS OF SCB ; KLN018R3 MOV S.KRB(R0),R0 ;GET ADDRESS OF KRB ; KLN018D4 MOV K.CSR(R0),R0 ;GET ADDRESS OF TPR0 ; KLN0184 MOV #RI$XDD,TPR2(R0) ;XDT DETACH CODE ; KLN0188 MOV $KXVC1,R1 ;GET ADDRESS OF FIRST VECTOR ; KLN0183 ADD #4,R1 ;GET ADDRESS OF XDT VECTOR ; KLN018D5 MOV R1,@#KXJQIR ;NOTIFY HOST OF DETACH ; KLN01809 CLR KXJNOT ;KEEP TRACK OF DETACH OURSELVES ; KLN018D>35$: TST TPR2(R0) ;HOST RECEIVED DETACH MESSAGE? ; KLN018" BNE 35$ ;IF NE NO ; KLN018 ; KLN018  .ENDC ; C$$XDJ ; KLN018 ; KLN01810$: ; KLN018 .IF DF C$$CDA# MOV #UR0+2,R0 ;POINT TO SAVED R1T5 MOV (R0)+,R1 ;RESTORE REGISTERS R1 THRU SP THEN R0F MOV (R0)+,R2 ;0  MOV (R0)+,R3 ;G  MOV (R0)+,R4 ;E  MOV (R0)+,R5 ;  MOV (R0)+,SP ;O  MOV UR0,R0 ;5 MOV UST,$CRUST ; MOVE USER PS FOR THE CRASH MODULER5 MOV UPC,$CRUPC ; MOVE USER PC FOR THE CRASH MODULE 7 JMP $CRALT ; ALTERNATE ENTRY POINT TO THE CRAS00"zyttt tfDATAH MODL .IFF ; DF C$$CDA8+ HALT ;HALT SYSTEM (MOSTLY USED IN P/OS  .ENDC ; DF C$$CDA . .SBTTL UTILITIES - COMMAND SUPPORT ROUTINES+;TEST FOR VALID RELOCATION REGISTER IN R4H7RTST: CMP #RLR/2,R4 ;GET A GOOD NUMBER FOR A REGISTERV& BLO 10$ ;NOT TOO GOOD, QUESTION IT  ASL R4O 10$: RETURN ;!&";SNAG MEMORY LOCATION JSR PC,SNAGIT# $;NEEDS--5%;CAD POINTS TO MEMORY WORD (APPROXIMATELY THAT IS)J2&;R0,R5 CONTAINS REAL WORD UPON EXIT TO "SRCHEK"')(SNAGIT: MOVB OBW,R0 ;SET THE INCREMENT !) ADD R0,CAD ;INCREMENT AND NOW!* CMP CAD,HI ;SEE IF MORE TO DOB+ BLOS 10$ ;IF NOT DO NOTR/, DECODE ;GO RESET STACK AND NO NEXT COMMANDS#-10$: JSR PC,GETCAD ;ACCESS METHOD $. MOV R0,R5 ;MAKE A COPY FOR LATER / RETURN ;T0#1;SEARCH HIT PRINT JSR PC,SPRINTR2&3;CAD POINTS TO THE LOC TO BE PRINTED94;R5 CONTAINS THE CONTENTS OF THE LOCATION TO BE PRINTEDA576SPRINT: TYPE CRLF ;PLACE CARRIAGE IN PROPER POSITIONT7 MOV CAD,R0 ;THE LOCATION8 JSR PC,RORA ;THE MODEN'9 MOVB FM,R0 ;PICK UP OLD CURENT MODE: ASR R0 ;HALVES; MOVB COMTAB(R0),R0 ;AH HA#< TYPE R0 ;TYPE THE MODE REGISTERT=%>;DATA PRINT ROUTINE JSR PC,DPRINTC?$@;PRINTS DATA IN R5 IN CURRENT MODEA#BDPRINT: MOVB FM,R1 ;SET THE MODEA$C MOV R5,R0 ;THIS IS THE POOR DATAD MOV R5,-(SP) ;SAVE THE DATA2E JSR PC,@TYFORM(R1) ;DO THAT __ TO THE POOR DATA!F MOV (SP)+,R5 ;RESTORE THE DATALG RTS PC ;RESTORE THE PCHIJ;'K; GET CHARACTER FROM CONSOLE TERMINALAL;EMMGET: ; KLN0184M .IF DF C$$XDJ ;XDT SUPPORTED ON KXJ ; KLN018M ; KLN0186M BIT #4,SR3 ;IS KERNEL D SPACE ENABLED? ; KLN018CM BEQ 5$ ;IF EQ NO, THIS MUST BE VIRGIN BOOT NOT ON KXJ ; KLN018P/M BIT #F5.XDJ,$FMSK5 ;XDT ON KXJ? ; KLN018T#M BNE 10$ ;IF NE YES ; KLN018 M ; KLN018"M .IFTF ; C$$XDJ ; KLN018M ; KLN018M5$: ; KLN018*M TSTB TKS ;CHARACTER READY? ; KLN018!M BPL 5$ ;IF PL NO ; KLN018A)P MOVB TKB,R0 ;READ INPUT BYTE ;**-2FP ; KLN018P .IFT ; C$$XDJ ; KLN018 P ; KLN018(P BR 15$ ;JOIN COMMON CODE ; KLN0189P10$: MOV $KXPTR,R0 ;GET ADDRESS OF KXJ DCB ; KLN018N3P MOV D.UCB(R0),R0 ;GET ADDRESS OF UCB ; KLN018 3P MOV U.SCB(R0),R0 ;GET ADDRESS OF SCB ; KLN018 3P MOV S.KRB(R0),R0 ;GET ADDRESS OF KRB ; KLN0184P MOV K.CSR(R0),R0 ;GET ADDRESS OF TPR0 ; KLN0182P MOV #100000,TPR3(R0) ;SET HIGH BIT ; KLN018?P MOV #RI$XDR,TPR2(R0) ;SET XDT READ FUNCTION CODE ; KLN018.P MOV R0,-(SP) ;SAVE TPR0 ADDRESS ; KLN0188P MOV $KXVC1,R0 ;GET ADDRESS OF FIRST VECTOR ; KLN0183P ADD #4,R0 ;GET ADDRESS OF XDT VECTOR ; KLN018X5P MOV R0,@#KXJQIR ;NOTIFY HOST OF DETACH ; KLN018 (P MOV (SP)+,R0 ;RESTORE R0 ; KLN0187P12$: TST TPR2(R0) ;HAS CHARACTER ARRIVED? ; KLN018D"P BNE 12$ ;IF MI NO ; KLN018BP13$: TST TPR3(R0) ;SEE IF CPRSYS HAS GIVEN US THE CHAR ; KLN018(P BMI 13$ ;IF MI, NOT YET ; KLN0182P MOV TPR3(R0),-(SP) ;READ INPUT BYTE ; KLN018-P CLR TPR3(R0) ;CLEAR REGISTER ; KLN018+P MOV (SP)+,R0 ;GET CHARACTER ; KLN018 P15$: ; KLN018 P .IFTF ; C$$XDJ ; KLN018P ; KLN018QR .IF DF R$$PROS1T MOV #115,@#173202 ;CLEAR THE PENDING INTERRUPT0UV .ENDC ; DF R$$PROW$X BIC #177600,R0 ;CLEAR EXCESS BITSY CMPB R0,#12 ;BRANCH IF 3Z BEQ 40$ ;NO ECHO 'SS"[ JSR R5,LOOKUP ;CHECK IF ALTMODE \ + ALTTAB ] BCS 20$ ; "^ MOVB #'$,R0 ;CHANGE TO $ IF SO)_20$: MOV R0,-(SP) ;SAVE INPUT CHARACTER;` TYPE R0 ;ECHO CHARACTER(a MOV (SP)+,R0 ;RESTORE INPUT CHARACTER&b CMP #141,R0 ;LOWER CASE CHARACTER?c BHI 30$ ;IF HI NO&d CMP #172,R0 ;LOWER CASE CHARACTER?e BLO 30$ ;IF LO NO7/f SUB #40,R0 ;CONVERT TO UPPER CASE CHARACTER;g30$: CMPB #' ,R0 ;CVT BLANK h BNE 40$i MOVB #'+,R0 ;INTO + j40$: RETURN ;kl; #m; TYPE CHARACTER ON OUTPUT DEVICEHn;Fo0pTY00*zytccccPE: MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESS*q SUB #2,(SP) ;POINT TO TRAP INSTRUCTION1r MOVB @(SP)+,-(SP) ;GET LOW BYTE OF INSTRUCTIONs BMI 10$ ;IF MI CONTROL BYTEA#t MOV (SP)+,R0 ;SET BYTE TO OUTPUTH u BR 30$ ;+v10$: BIT #40,(SP) ;OUTPUT CONTENTS OF R0?Sw BEQ 20$ ;IF EQ YES'x MOV (PC)+,R0 ;SET TO OUTPUT Uy .BYTE 15,12 ;;%z20$: ASLB (SP)+ ;OUTPUT TWO BYTES?E{ BPL 30$ ;IF PL NOI | TYPE R0 ;TYPE OUT FIRST BYTE} SWAB R0 ;SET UP HIGH BYTET}30$: ; KLN018} .IFT ; C$$XDJ ; KLN018N} ; KLN0186} BIT #4,SR3 ;IS KERNEL D SPACE ENABLED? ; KLN018D} BEQ 31$ ;IF EQ NO, THIS MUST BE VIRGIN BOOT NOT ON KXJ ; KLN018/} BIT #F5.XDJ,$FMSK5 ;XDT ON KXJ? ; KLN018:#} BNE 45$ ;IF NE YES ; KLN018S} ; KLN018 } .IFTF ; C$$XDJ ; KLN018} ; KLN0184}31$: TSTB @OUTS ;OUTPUT DEVICE READY? ; KLN018"} BPL 31$ ;IF PL NO ; KLN018' MOVB R0,@OUTB ;OUTPUT BYTE ;**-2H(35$: TSTB @OUTS ;OUTPUT DEVICE READY? BPL 35$ ;IF PL YES3 CMPB #15,R0 ;WAS OUTPUT BYTE A CARRIAGE RETURN?S BNE 50$ ;IF NE NO8- CMP #LPS,OUTS ;OUTPUT DEVICE LINE PRINTER?O BEQ 50$ ;IF EQ YES$ MOV #5,-(SP) ;SET FILL COUNT TO 5 CLRB R0 ;SET OUTPUT NULLSY40$: TYPE R0 ;OUTPUT A NULL! DEC (SP) ;ANY MORE TO OUTPUT?L BGT 40$ ;IF GT YES TST (SP)+ ;CLEAN STACK ;KLN018  .IFT ; C$$XDJ ;KLN018 ;KLN0180' BR 50$ ;JOIN COMMON CODE ;KLN018T45$: ;KLN018E+ MOV R0,-(SP) ;SAVE CHARACTER ;KLN018 4 MOV $KXPTR,R0 ;GET ADDRESS OF KXJ DCB ;KLN0182 MOV D.UCB(R0),R0 ;GET ADDRESS OF UCB ;KLN0182 MOV U.SCB(R0),R0 ;GET ADDRESS OF SCB ;KLN0182 MOV S.KRB(R0),R0 ;GET ADDRESS OF KRB ;KLN0183 MOV K.CSR(R0),R0 ;GET ADDRESS OF TPR0 ;KLN018UA TST KXJNOT ;HAVE WE ALREADY NOTIFIED HOST FOR ATTACH? ;KLN018 $ BNE 455$ ;IF NE, YES ;KLN0182 MOV #1,KXJNOT ;SET NOTIFICATION FLAG ;KLN0180 MOV #RI$XDA,TPR2(R0) ;ATTACH CODE ;KLN018- MOV R0,-(SP) ;SAVE TPR0 ADDRESS ;KLN018V7 MOV $KXVC1,R0 ;GET ADDRESS OF FIRST VECTOR ;KLN018U2 ADD #4,R0 ;GET ADDRESS OF XDT VECTOR ;KLN0184 MOV R0,@#KXJQIR ;NOTIFY HOST OF DETACH ;KLN0180 MOV (SP)+,R0 ;RESTORE TPR0 ADDRESS ;KLN018=453$: TST TPR2(R0) ;HOST RECEIVED ATTACH MESSAGE? ;KLN018E" BNE 453$ ;IF NE NO ;KLN018455$: ;KLN018- MOV (SP),TPR3(R0) ;OUTPUT BYTE ;KLN018O: MOV #RI$XDW,TPR2(R0) ;SET WRITE FUNCTION CODE ;KLN018- MOV R0,-(SP) ;SAVE TPR0 ADDRESS ;KLN018D7 MOV $KXVC1,R0 ;GET ADDRESS OF FIRST VECTOR ;KLN018V2 ADD #4,R0 ;GET ADDRESS OF XDT VECTOR ;KLN0184 MOV R0,@#KXJQIR ;NOTIFY HOST OF DETACH ;KLN0180 MOV (SP)+,R0 ;RESTORE TPR0 ADDRESS ;KLN018346$: TST TPR2(R0) ;CHARACTER RECEIVED? ;KLN018 ! BNE 46$ ;IF MI NO ;KLN01842 MOV (SP)+,R0 ;RESTORE CONTENTS OF R0 ;KLN018 ;KLN018) .ENDC ; C$$XDJ ;KLN018V ;KLN018T50$: RTI ; % .SBTTL UTILITIES - PRETTY PRINTERSD6;PRINT ADDRESS- RELOC, SYMBOLIC, OR ABSL JSR PC.RORA;R0 ADDRESS TO BE PRINTEDT.;FORM CORE ADDRESS FORMAT (0-RELOC 1-ABSOL);REGISTER '$R ' OR '$DR 'L!;CORE 'D,XXXXXX ' OR 'XXXXXX ' 3RORA: MOV R0,-(SP) ;CALLING VALUE ONA TOPPA SATCKE .IF DF K$$DAS1 MOV DMODE,R0 ;PICK UP MODE CHARACTER AND SPACEE) TSTB REGFL ;ATTEMPT TO OPEN REGISTER? BEQ 50$ ;IF EQ NO 6 MOV #"D ,R0 ;DATA SPACE USED IF REGISTER NOT THERE .IFTF CMP #INTBEG,(SP)$ BHI 50$ ;BELOW FIRST NON-INDEXED CMP #INTEND,(SP)# BLO 50$ ;ABOVE LAST NON-INDEXEDR  TYPE '$ ;ANNOUNCE INTENSIONS CMP #INTINX,(SP)E BLOS 20$ ;GO TO DO INDEXED1 MOV (SP)+,R0 ;NON-INDEXED REGISTER ----- "$R "A/ SUB #INTBEG,R0 ;CLEANED UP STACK, GET OFFSET$* ASR R0 ;BYTE THAT WORD, WORD THAT BYTE1 MOVB NIXMAP(R0),R0 ;MAGIC CHARACTER FROM TABLEE15$: BIS (PC)+,R0 ( .BYTE 000,' ;CHARACTER PLUSSA BLANK) TYPE R0+R0 ;NAME PLUS BL002zyttt tfDATAANK AND SPLIT  RETURN ;(.20$: CLR R1 ;SEE WHICH SET OF TABLES WE GOT:22$: CMP INXTBL+2(R1),(SP) ;LOOK ON AHEAD TO FIND BEHIND% BHI 24$ ;R1 POINTS TO BASE OF SETN4 TST (R1)+ ;THINK ABOUT THOSE DUMMY ENTRIES DUMMY  BR 22$I124$: MOV (SP)+,R0 ;INDEXED REGISTER ---- "$DR "E= SUB INXTBL(R1),R0 ;GET ADDRESS AND COMPUTE OFFSET IN WORDSA% ASR R0 ;AND FINALLY IN PLAIN TALKA  ADD #'0,R0 ;CONVERT TO ASCII% TYPE R0 ;TYPE OUT REGISTER NUMBERS  ASR R11 MOVB INXREG(R1),R0 ;PICK UP THE REAL CHARACTER  BR 15$ ;GO PRINT REST OF ITE50$: ;REF LABEL .IFTB  TST OPN ;IS A LOCATION OPEN? BEQ 60$ ;IF EQ NOO  TYPE R0+R0 ;OUTPUT MODE INFO 60$: ;T .ENDC. TST FORM ;CORE ADDRESS SEE WHAT USER WANTS BNE 80$ ;TYPE AS ABSOLUTE.* MOV (SP),R4 ;RELOCATE ---- "R,XXXXXX "/ JSR PC,LOCA ;WE ALWAYS PICK, XDT KNOWS BEST! BMI 80$ ;BUT NOT ALL THE TIME% MOV R1,(SP) ;SET THE DISPLACEMENT) ADD #"0,,R0 ;PRINT REGISTER AND COMMAE TYPE R0+R0 ;DISK AND COREO'80$: MOV (SP)+,R0 ;PRINT R0 AS A WORD';TYPE R0 AS BYTE OR WORD, TWO ENTRIESO; FOR A WORD JSR PC,CADW; FOR A BITE JSR PC,CADB3CADW: MOV R0,QUAN ;SET THE FAMOUS QUANTITY VALUED MOV #6,R3 ;# OF DIGITS! MOV #-2,R4 ;# OF BITS FIRST-3V  BR CA01 ;DO THE COMMON THING-CADB: CLR QUAN ;SET FOR ALL OF QUAN A BYTEB. MOVB R0,QUAN ;SET THE QUANTITY THING AGAIN% MOV #3,R3 ;THERE ARE THREE DIGITSD! MOV #-1,R4 ;AND ONLY TWO BITSE SWAB R0 ;SWITCH ENDSCA01: MOV R0,-(SP) ;SAVE R0I310$: ADD #3,R4 ;COMPUTE THE NUMBER OF BITS TO DO  CLR R015$: ROL (SP) ;GET A BIT ROL R0 ;STORE IT AWAYD DEC R4 ;DECREMENT COUNTERE% BGT 15$ ;LOOP IF MORE BITS NEEDED,  ADD #'0,R0 ;CONVERT TO ASCII TYPE R0 ;TYPE IT$ DEC R3 ;SEE IF MORE DIGITS TO DO BGT 10$ ;LOOP IF SOO* MOVB #' ,R0 ;SET UP FOR TRAILING SPACE TST (SP)+ ;GET RID OF JUNK  TYPE R0 ;R  RETURN ;M5;TYPE CONTENTS OF WORD IN FORMAT JSR PC,@TYFORM(R1)1$;R0 WORD OR BYTE TO BE TYPED, RHJ";R1 CODE- ENTRY PT, FORMAT, CODE!TYFORM: + CADB ;BYTE OCTAL - 0I + CADW ;WORD OCTAL - 2 + 30$ ;BYTE ANSII - 4O + 20$ ;WORD ANSII - 6F + 10$ ;RADIX 50 - 10#410$: JSR PC,TYRADX ;R0 GETS THE RADIX 50 TREATMENT& BR 35$ ;APPEND A BLANK TO 3 CHAR'S 20$: TYPE R0 ;TYPE BYTE IN R0  SWAB R0 ;SWAP EM AND TYPE IT 30$: TYPE R0 ;TYPE BYTE IN R035$: TYPE 40 ;TYPE A SPACE  RETURN ;D1 ;TYPE CONTENTS OF R0 IN RADIX 50 JSR PC,TYRADX  ) TYRADX: MOV #3,R5 ;COUNT OF CHARACTERS ,  MOV #50$,R2 ;POINTER TO COEFFICENT TABLE$  MOV R0,R1 ;COPY OF RADIX 50 WORD 10$: MOV R1,R0 ; GET DIVIDEND MOV (R2)+,R1 ; GET DIVISOR 4 JSR PC,$DIV ; DIVIDE, R0=QUOTIENT, R1 =REMAINDER$ TST R0 ; IS QUOTIENT ZERO? (SP)? BEQ 12$ ;"SP" = 040T CMPB R0,#33 ;RAD50-$ =33 BEQ 16$ ;"$" = 044* BGT 14$ ;"." OR "0-9" = 056 OR 060-071& ADD #40,R0 ;RAD50-A = 1, "A" = 101-12$: ADD #16,R0 ;40+16+11+11 = 100 + (A-Z) (14$: ADD #11,R0 ;16+11+11 = 40 + (SP)(16$: ADD #11,R0 ;11+11 = 22 + (.,0-9)! TYPE R0 ;TYPE CHARACTER IN R0  DEC R5 ;COUNT THE CHARACTERS BNE 10$ ; LOOP  RTS PC(%;COEFFICENT TABLE, RADIX 50 CONVERTI 1!50$: .WORD +1600.,+40.,+1. ;40.^2, 40.^1, 40.^0E" R# .PAGE@$ .SBTTL "I" AND "D" PROCESSOR - SET INSTR OR DATA DISPLAY MODE% &;SYNTAX--B';I SET INSTR DISPLAY MODE0()* .IF DF K$$DAS+9,INSTM: MOVB #'I,DMODE ;SET FOR INSTRUCTION DISPLAY MODEA - DECODE ;DECODE NEXT COMMAND. /;SYNTAX--60;D SET DATA DISPLAY MODE122DATAM: MOVB #'D,DMODE ;SET FOR DATA DISPLAY MODE 3 DECODE ;DECODE NEXT COMMAND45 .ENDC678 C49 .SBTTL "B" PROCESSOR - SET AND REMOVE BREAKPOINTS: ;;SYNTAX--0<;B CLEAR ALL BREAKPOINTS=;NB CLEAR BKPT N,>;A;B SET BKPT AT A, USE FIRST FREE BKPT?;A;NB SET BKPT N AT A @@A;DEPENDS MIGHTILY UPON LOCATION "TRTC" CONTAINING 00:zytccccA TRAP INST.4B;AND THAT A FREE BKPT CONTAINS THE ADDRESS "TRTC".C2DSEBK: ASL R4 ;MPY R4 X2, JUST IN CASE ALL IS GO4E MOV #TRTC,R0 ;SET MAGIC VALUE IN R0, JUST IN CASE#F TST R3 ;CHECK FOR THE REAL CASED*G BEQ REMB ;REMOVAL CASES, CLEAR THEM UPH BIT #1,R5 ;LOOK AT ADDRESSI BNE ERR0 ;THAT'S ODD ?*J TST R2 ;SEE IF I GET TO PICK IT OR NOT#K BNE 15$ ;OR NOT, DISAPPOINTMENT ;L10$: CMP R0,ADR1(R4) ;LOOK FOR LOCATION WITH FREE ADDRESSM BEQ 15$ ;A HIT'N TST (R4)+ ;KEEP AT FOR A LONG WHILE.O BR 10$ ;LOOOOOOOOP/P15$: MOV R5,R0 ;R0 HAS ADDRESS OF BREAKPOINT4Q BR RE02 ;GO TUCK IT INRS;REMOVE SOME BREAKPOINTST"UREMB: TST R2 ;SEE IF ONE OR ALLV BEQ RALL ;ALLE0WRE02: JSR PC,SETBRK ;SET THE ONE SET UP TO SETX BCC RALL2 ;IT HAPPENED&YERR0: ERROR ;SOME THING WENT WRONGZ[;E\; REMOVE ALL BREAKPOINTS];B^_RALL: CLR R4 ;R4 IS ZERO#`10$: JSR PC,SETBRK ;SET THEM TILLTa BCC 10$ ;THEY GET OUTTAQbRALL2: DECODE ;HAND!!!!Kcd;R'e; SUBROUTINE TO SET/CLEAR BREAKPOINTSf;Mg0hSETBRK: CMP #BKP,R4 ;LEGAL BREAKPOINT NUMBER?i BLO 10$ ;IF LO NORjk .IF DF M$$PROl!m BIT #1,SR0 ;MAPPING ENABLED ?L*n BEQ 8$ ;IF EQ NO, CAN'T GET TO LOWCR'Sop .IF DF K$$DASq(r BIT #4,SR3 ;KERNEL D-SPACE ENABLED ?*s BEQ 8$ ;IF EQ NO, CAN'T GET TO LOWCR'Stu .ENDC ; DF K$$DASv.w MOV KISAR6,-(SP) ;SAVE CURRENT EXEC MAPPING'x MOV R0,-(SP) ;AND BREAKPOINT ADDRESSE*y MOVB $NCPU,R0 ;GET NUMBER OF PROCESSORS z ASL R0 ;CHANGE TO WORD INDEX2{5$: MOV $K6TAB-2(R0),KISAR6 ;REMAP TO NEXT LOWCR3| MOV (SP),140000+ADR1(R4) ;SET BREAKPOINT ADDRESS.2} MOV #1,140000+CT(R4) ;AND INITIAL PROCEED COUNT%~ SUB #2,R0 ;POINT BACK TO NEXT CPUW BGT 5$ ;IF GT THERE IS ONE* MOV (SP)+,R0 ;RESTORE BRAKPOINT ADDRESS1 MOV (SP)+,KISAR6 ;RESTORE CURRENT EXEC MAPPINGN BR 9$8$: .ENDC ; DF M$$PRO* MOV R0,ADR1(R4) ;SET BRAEKPOINT ADDRESS+ MOV #1,CT(R4) ;SET INITIAL PROCEED COUNTR+9$: TST (R4)+ ;ADVANCE BREAKPOINT NUMBER10$: RETURN ;R S8 .SBTTL "R" PROCESSOR - RELOCATION REGISTER PROCESSING;DETERMINE IF CLEAR OR SET1RELO: TSTB SMFD ;SEMI-COLON ABSENT MEANS CLEARP/ BEQ 10$ ;CLEAR DISPATCH, OR FALL TO SETTINGS;FORMS HERE-- ; A;NR SET RELOC(N) TO A;ABSENT A OR N DEFAULTS TO 0# JSR PC,RTST ;PROTECTION EDITING' BCS ERR0 ;ILLEGAL REGISTER NUMBER ?) .IF DF M$$PRO+ BIT #1,SR0 ;MEMORY MANAGEMENT ENABLED ?) BEQ 5$ ;IF EQ NO, CAN'T GET TO LOWCRSM .IF DF K$$DAS+ BIT #4,SR3 ;KERNEL DATA SPACE ENABLED ?G) BEQ 5$ ;IF EQ NO, CAN'T GET TO LOWCRS  .ENDC ; DF K$$DAS. MOV KISAR6,-(SP) ;SAVE CURRENT EXEC MAPPING& MOV R0,-(SP) ;SAVE WORKING REGISTER$ MOVB $NCPU,R0 ;GET NUMBER OF CPUS ASL R0 ;MAKE WORD INDEXF;3$: MOV $K6TAB-2(R0),KISAR6 ;MAP TO NEXT PROCESSORS LOWCRE7 MOV R5,140000+RELT(R4) ;AND SET RELOCATION REGISTER+ SUB #2,R0 ;POINT BACK TO NEXT PROCESSOR BGT 3$ ;IF GT MORE TO GO) MOV (SP)+,R0 ;RESTORE WORKING REGISTER) MOV (SP)+,KISAR6 ;RESTORE EXEC MAPPING  DECODE ;GO GET NEXT COMMAND5$: ;REF LABELC .ENDC ; DF M$$PRO0 MOV R5,RELT(R4) ;SET THE APPROPRIATE REGISTER  DECODE ;GO GET NEXT COMMAND;FORMS HERE--O%;R RESET ALL TO -1 FOR RELOC(0-7);NR RESET ONLY RELOC(N)M#10$: TST R2 ;SEE IF NR OR JUST R4 BEQ 15$ ;CLEAR ALL$ JSR PC,RUCL ;CLEAR THE ONE IN R4' BCS ERR0 ;ERROR, INVALID REGISTER ?; DECODE ;NEXT COMMANDP 15$: JSR PC,RUAL ;DO THEM ALL DECODE ;OFF AND ONO;A0; SUBROUTINE TO RESET RELOCATION BASE REGISTER;   .ENABL LSBC+RUCL: CALL RTST ;TEST FOR LEGAL REGISTER # BCS 10$ ;IF CS ILLEGAL REGISTER . MOV #-1,RELT(R4) ;RESET RELOCATION REGISTER+ ASR R4 ;CONVERT BACK TO REGISTER NUMBER 10$: RETURN ;;T0; SUBROUTINE TO CLEAR ALL RELOCATION REGISTERS;J&RUAL: CLR R4 ;START WITH REGISTER 0120$: CALL RUCL ;CLEAR NEXT RE00Bzyttt tfDATALOCATION REGISTERO BCS 10$ ;IF CS ALL DONED$ INC R4 ;ADVANCE TO NEXT REGISTER  BR 20$ ;  .DSABL LSBE E1 .SBTTL EXPRESSION SETUP COMMANDS ( ; + - * , );SEMI-COLON PROCESSORG$SEMI: INCB SMFD ;COUNT SEMI-COLON* CMPB #2,SMFD ;PUSH CONTENTS INTO MULTI! BNE SEM1 ;SEMI COLON ARG LISTA MOV R5,D.ARGS'SEM1: MOV R2,R3 ;PUSH R2 AND R4 INTOU, MOV R4,R5 ;R3 AND R5 (FLAG AND CONTENTS) JMP NEWE ;CONTINUE SCANNER;ADDITION SETUPCPLUS: CLRB OP ;OP IS 0 FOR +S  BR CO00;SUBTRACT SET UPMINS: MOVB #2,OP  BR CO00;MULTIPLY BY 50 AND ADD$STAR: MOVB #-2,OP ;OP IS -2 FOR *CO00: CLR R4 ;R4 IS RESET  JMP NEWNG;MEMORY RELOCATION CHECK COMM: ASL R4 ;ALL NEED IT X 20 CMP R4,#RLR ;SEE IF REGISTER IS OUT OF RANGE  BGT ERR2,. MOV RELT(R4),EXP ;COMPUTE REAL CORE ADDRESS  BR PLUSERR2: ERROR ;OOPSD E# .SBTTL MISCELLANEOUS SUBROUTINES;; TEST IF IN EXEC MODE;L;TESTM: MOV (R5)+,-(SP) ;PICK UP EXEC TRAP ROUTINE ADDRESS* TST $STKDP ;ALLOW EXEC TO HANDLE TRAP?- BGT 20$ ;IF GT YES, TRAP WAS IN USER MODEI& BLT 10$ ;IF LT NO, BAD STACK DEPTH9  CMP 4(SP),#$DRLM1 ;TRAP OCCUR IN DIRECTIVE DISPATCHER?   BLO 5$ ;IF LO NO9  CMP 4(SP),#$DRLM2 ;TRAP OCCUR IN DIRECTIVE DISPATCHER?T  ; BM3774  .IF NDF D$$PAR ; BM377  ; BM377R*  BLOS 20$ ;IF LO YES, PASS TRAP TO EXEC  ; BM377"  .IFF ; NDF D$$PAR ; BM377  ; BM377)  BHI 5$ ;IF HI NO ; BM3778  CMP KINAR5,$DRAPR ;IS THE DISPATCHER MAPPED ; BM3773  BEQ 20$ ;IF EQ YES, PASS TRAP TO EXEC ; BM377   ; BM377H#  .ENDC ; NDF D$$PAR ; BM377   ; BM377  5$:O .IF DF D$$PAR1 CMP KINAR5,$DRAP2 ;2ND DIRECTIVE COMMON MAPPEDT' BNE 10$ ;IF NE NO, XDT HANDLES TRAP  .ENDC ; DF D$$PAR3 CMP 4(SP),#$DQLM1 ;TRAP OCCUR IN QIO DIRECTIVE ? BLO 10$ ;IF LO NO.2 CMP 4(SP),#$DQLM2 ;TRAP OCCUR IN QIO DIRECTIVE?3 BLOS 20$ ;IF LOS YES, ALLOW EXEC TO HANDLE TRAPA'10$: MOV R5,(SP) ;SET TO XDT ADDRESS'20$: MOV (SP)+,R5 ;SET RETURN ADDRESS  RTS R5 ;PROCESS TRAP0;EXPRESSION COMPUTATION ROUTINE JSR PC,EXPCOM ;NEEDS--&!;OP THE OPERATION (-2=*, 0=+, *=2)";EXP THE LEFT SIDE#;R4 THE RIGHT SIDE$ %;SETS UP--&;OP BACK TO 0 FOR ADD ';EXP,R4 ALL SO FAR)(')EXPCOM: TSTB OP ;SEE WHAT'S UP CHUCKB * BMI 20$ + BEQ 10$, NEG R4 ;MINUS, OP=2C-10$: ADD EXP,R4 ;PLUS, OP=03.15$: MOV R4,EXP ;COMMON OUT, SET EXP TO WHATEVERV/ CLRB OP ;IS IN R4 TOOS&0 INC R2 ;SET R2 SO THAT R4 IS, OP=0 1 RTS PCS5220$: MOV EXP,-(SP) ;GET THE LEFT SIDE OF EXPRESSIONO3 ASL (SP) ; MULTIPLY BY 10E4 ASL (SP) ;5 ASL (SP) ;6 ADD (SP),R4 ; ADD IT7 ASL (SP) ; MULTIPLY BY 40I.8 ASL (SP) ; WHICH IS LIKE MULTIPLYING BY 50(9 ADD (SP)+,R4 ;AND ADD IT TO THE RIGHT: BR 15$ ;COMMON OUT;<'=;BUILD AN OCTAL NUMBER JSR PC,GETNUMO>?;NEEDS AND RETURNS--%@;R0 NON-OCTAL TERMINATING CHARACTERTA;R2 OCTAL CHARACTER COUNTR&B;R4 OCTAL NUMBER THAT I GOT, YOU GETC DGETNUM: CLR R2 ;NEW R2 AND R4 E CLR R4-#F10$: JSR PC,GET ;GET 1 CHARACTERO)G CMPB #'0,R0 ;NON-OCTAL, LESS THAN "0"P H BHI GETC99P)I CMPB #'7,R0 ;NON-OCTAL, LESS THAN "7" J BLO GETC994-K BIC #177770,R0 ;MAKE INTO ACCEPTABLE RANGE L ASL R4 ; SHIFT LEFTAM ASL R4 ; 3 BITS N ASL R4 ;O ADD R0,R4 ;PLANT LO PLACEAP INC R2 ;ACCOUNT FOR NEW ONENQ BR 10$ ;NEXT ONE OR OTHERCR*S;SCAN A LIST OF CHARACTERS JSR R5,LOOKUPT U;CALL-- V; R0 HAS THE CHARACTERUW; JSR R5,LOOKUP ;THAT IS ITW*X; + LIST TO USE, 00 BYTE IS END OF LISTYZ;RETURNS AT CALL + 2 WITH--N[;R0 STILL HAS CHARACTER,\;R1 HAS INDEX X2 OF FOUND CHARACTER IF C=0];C=1 CHARACTER WAS NOT FOUND^&_LOOKUP: MOV (R5),R1 ;GET LIST START%`10$: CMPB R0,(R1) ;IS THIS THE ONE3a BNE 20$ ;RIGHT IT WASN'T)b SUB (R5)+,R1 ;COMPUTE INDEX AND RETURN %c00Jzytcccc ASL R1 ;DO THIS FOR EVERBODY, C=0T d BR 30$)e20$: TSTB (R1)+ ;CHECK FOR END OF LIST%f BNE 10$ ;IF NOT LOOK AT NEXT ITEMU-g TST (R5)+ ;END, AVOID ILLEGAL INSTRUCTIONO%h SEC ;SECURITY EXCHANGE COMMISIONT"i30$: RTS R5 ;SECURITY ELSEWHEREjk5l;GET CONTENTS OF ADDRESS IN THE MODE JSR PC,GETCADm n;NEEDS--o;R0 THE MODE 1=BYTE, 2=WORDp;CAD THE ADDRESSSq;DEVI THE DEVICE CODEr s;RETURNS--!t;R0 HAS THE DATA YOU ASKED FORSuvw .IF DF K$$DASx(yGETCAD: MOV SP,OPN ;SET LOCATION OPEN3z CALL GETIT ;READ WORD OR BYTE FROM PROPER SPACE &{ MOV (SP)+,R0 ;RETRIEVE WORD OR BYTE|GETC99: RTS PC ;+}~ .IFF (GETCAD: MOV CAD,R3 ; GET CORE ADDRESS" MOV SP,OPN ; SET LOCATION OPEN' ASR R0 ;PUSH BW FLAG INTO CARRY BITF# BCC 10$ ;2 WON'T FIT SO IS WORD MOVB (R3),R0 ;ACCESS BYTE  BR GETC99 10$: MOV (R3),R0 ;ACCESS WORDGETC99: RTS PC ;STACK ACCESS .IFTF1;PUT R4 INTO ADDRESS IN THE MODE JSR PC,PUTCADE ;NEEDS--0;R2 CONTENT FLAG, 0 FOR NONE, ELSE R4 IS GOLD;R4 THE DATA 0;BW THE MODE FLAG, IF 0 THEN NO LOCATION OPEN .IFTC*PUTCAD: MOV BW,R0 ;PICK UP MODE AN CC'S3 CALL GETIT ;READ WORD OR BYTE FROM PROPER SPACE! TST R2 ;CHECK FOR TYPED VALUE  BEQ 12$ ;NO DATA+ TST OPN ;IS A LOCATION OPEN AT PRESENT?S BEQ 12$ ;NOT OPEN BIT #177776,R0 ;CHECK MODE BNE 5$ ;WORD MODEK  MOVB R4,(SP) ;WRITE THE DATA BIT #1,CAD ;HIGH BYTE? BEQ 10$ ;IF EQ NO( SWAB (SP) ;MOVE IT BACK TO HIGH BYTE  BR 10$ ;"5$: MOV R4,(SP) ;STORE THE DATA.10$: MOV (SP),-(SP) ;DUPLICATE DATA ON STACK TST R1 ;DATA SPACE?  BNE 11$ ;IF NE YES) MTPI (R3) ;WRITE WORD BACK TO I SPACEE  BR 12$ ;-11$: MTPD (R3) ;WRITE WORD BACK TO D SPACE &12$: MOV (SP)+,R4 ;RETURN DATA IN R4  RTS PC ; .IFFE'PUTCAD: MOV CAD,R3 ;GET CORE ADDRESS ! TST R2 ;CHECK FOR TYPED VALUET BEQ 12$ ;NO DATA NO DODO# MOV BW,R0 ;PICK UP MODE AN CC'SS, TST OPN ; IS A LOCATION OPEN AT PRESENT?  BEQ 12$ ;NOT OPEN NOT STORED BIT #177776,R0 ;CHECK MODED BNE 10$ ;WORD MODE MOVB R4,(R3) ;BYTE MODEB BR 12$ ;BRANCH MODEP10$: MOV R4,(R3) ;WORD MODE&12$: BIC #1,R3 ;INSURE EVEN ADDRESS- MOV (R3),R4 ;READ WORD FROM OPEN LOCATION  RTS PC ; .IFTF;GET WORD FROM PROPER SPACEO ;NEEDS--;R0 BW FLAG ;RETURNS--0;R1 0 IF DATA FROM I SPACE, 1 IF FROM D SPACE2;R3 CURRENT ADDRESS FROM CAD WITH LOW BIT CLEAR .IFTN)GETIT: MOV CAD,R3 ;GET CURRENT ADDRESS" BIC #1,R3 ;CLEAR LOW ORDER BIT+ MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESSD CLR R1 ;ASSUME I SPACE  TSTB REGFL ;REGISTER ACCESS?# BNE 10$ ;IF NE YES, USE D SPACES# CMPB DMODE,#'D ;IN D SPACE MODE?N BEQ 10$ ;IF EQ YES  MFPI (R3) ;READ FROM I SPACE  BR 20$ ;$10$: MFPD (R3) ;READ FROM D SPACE INC R1 ;SET D SPACE FLAG&20$: BIT #1,CAD ;HIGH BYTE DESIRED? BEQ 30$ ;IF EQ NOF% SWAB (SP) ;REVERSE BYTES ON STACKN230$: MOV (SP)+,2(SP) ;PLACE WORD IN PROPER PLACE  RETURN ;E8;SET KERNEL I-SPACE DESCRIPTOR REGISTERS TO READ/WRITE ;NEEDS--;R0E#;CALLED ONLY FOR I/D SPACE SYSTEM ;RETURNS--)SETRW: BIT #1,SR0 ;MAPPING ENABLED YET  BEQ 20$ ;NO$- BIT #4,SR3 ;KERNEL DATA SPACE ENABLED YET BEQ 20$ ;NO04 MOV #KINDR0,R0 ;POINT TO KERNEL INSTR DESCR REG 0*10$: BIS #4,(R0)+ ;SET RW ACCESS FOR XDT CMP R0,#KINDR7 ;DONE YET BLOS 10$ ;NO20$: RETURN ;N .ENDC+;SELECT RELOCATION REGISTER JSR PC,LOCA#;CAD ADDRESS TO USE IN SELECTIONG ;RETURNS--0;R0 REGISTER NUMBER FOUND, -1 IF NONE FOUND$;R1 DISTANCE, RELOCATION FACTOR=;SUBROUTINE TO LOCATE RELOCATION REGISTER NEAREST BUT STILLT7;BELOW THE ADDRESS IN CAD. RETURNS WITH THE REGISTER0;;NUMBER IN R0, AND WITH THE DISTANCE BETWEEN THE REGISTER:;AND (CAD) IN R1-;IF NO GOOD RELOC. REG. FOUND, R0 WILL00RzTzttt tfDATA = -1LOCA: CLR R0. MOV #-1,-(SP) ;INITIALIZE RELOC. REG. INDEX4 MOV (SP),R1 ;INITIALIZE DISTANCE TO A HIGH VALUE+10$: CMP R0,#RLR ;ARE WE DONE COMPARING?- BHI 20$ ;BRANCH IF DONEU0 CMP RELT(R0),R4 ;IS CURR. RELOC. BIAS > (R4)?6 BHI 15$ ;IF SO, BRANCH -- DON'T SUBTRACT, GET NEXT,  MOV R4,R2 ;OTHERWISE TAKE THE DIFFERENCE0  SUB RELT(R0),R2 ;OF CURR. RELOC. REG. AND CAD1  CMP R1,R2 ;IS THE RESULT THE SMALLEST SO FAR?D1  BHI 25$ ;BRANCH IF YES (UNSIGNED CONDITIONAL)I: 15$: TST (R0)+ ;OTHERWISE, BUMP R0 FOR NEXT RELOC. REG.) BR 10$ ;LOOP BACK FOR NEXT COMPARISONZ$20$: MOV (SP)+,R0 ;PUT REG.# IN R0 RTS PC ;JOB OVER, RETURN625$: MOV R2,R1 ;REMEMBER SMALLEST DIFFERENCE IN XXY* ASR R0 ;AND ASSOCIATED REGISTER NUMBER MOV R0,(SP) ; IN (SP)A( ASL R0 ;RESTORE R0 TO ORIGINAL VALUE" BR 15$ ;GO FO NEXT COMPARISON. .ENDC ;DF X$$DBTD .IIF DF X$$DBT .END $XDT .IIF NDF X$$DBT .END 25$ ;BRANCH IF YES (UNSIGNED CONDITIONAL)I: .TITLE PLSUB  .IDENT /5.00/; ; COPYRIGHT (C) 1985 BYD!; DIGITAL EQUIPMENT CORPORATIONE; ALL RIGHTS RESERVED.;L>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;P ; PREVIOUSLY MODIFIED BY:N ;E ; J. R. KAUFFMAN ; B. S. MCCARTHY ;E ; MODIFIED BY: ;I ; J. W. BERZLE 22-OCT-85 5.00S ; 8 ; JWB167 -- ADD COMMENTS EXPLAINING THE USE OF $QRMVT ;F;P;O;; PROGRAM LOGICAL ADDRESS SPACE (PLAS) COMMON SUBROUTINES;Y; MACRO LIBRARY CALLSI;  .IF DF P$$LAS% .MCALL HDRDF$,HWDDF$,PCBDF$,TCBDF$W' HDRDF$ ;DEFINE TASK HEADER OFFSETSB& HWDDF$ ;DEFINE HARDWARE REGISTERS3 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSY.! TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS"#;+($; **-$SRNAM-SEARCH FOR NAMED PARTITION%;ZF&; THIS ROUTINE SEARCHES FOR A NAMED PARTITION AND RETURNS A SUCCESS/9'; FAILURE INDICATION AND A POINTER TO THE PCB IF FOUND.P(;P ); INPUTS:U*;I(+; R3=POINTER TO DOUBLE-WORD RAD50 NAME,; -; OUTPUTS:.;S/; C=1 IF NO MATCH ON NAME,0;$ 1; C=0 IF NAMED PARTITION FOUND2; R2=PCB ADDRESSH3;-45 .IFTF6 R47$SRNAM::MOV $CBDHD,R2 ;POINT TO FIRST ENTRY IN CBD 8 BEQ 20$ ;IF EQ THERE IS NONE910$: CALL 50$ ;NAME MATCH?+: BEQ 40$ ;IF EQ YES+; MOV P.CBDL(R2),R2 ;POINT TO NEXT IN LISTA< BNE 10$ ;IF NE THERE IS ONEE-=20$: MOV $PARHD,R2 ;POINT TO FIRST MAIN PCBP>30$: CALL 50$ ;NAME MATCH?? BEQ 40$ ;IF EQ YES'@ MOV (R2),R2 ;POINT TO NEXT MAIN PCBA BNE 30$ ;IF NE THERE IS ONE B SEC ;C-SET ON NO MATCHC40$: RETURN ;I7D50$: CMP P.NAM(R2),(R3) ;MATCH ON FIRST WORD OF NAME?RE BNE 60$ ;IF NE NOR7F CMP P.NAM+2(R2),2(R3) ;MATCH ON SECOND WORD OF NAME?IG60$: RETURN ; H ;I .IFTHJK;+"L; **-$CKACC-CHECK DESIRED ACCESSM;OCN; THIS ROUTINE CHECKS IF THE DESIRED ACCESS OF A TASK TO A REGIONADO; IS ALLOWED. THE BITS IN THE PROTECTION WORD ARE ARRANGED IN THEP; FOLLOWING ORDER:Q;(R; [WORLD,GROUP,OWNER,SYSTEM] S; 15 0 T;EEU; THE BITS WITHIN EACH CATEGORY IN THE PROTECTION WORD ARE ARRANGED:V; IN THE FOLLOWING ORDER: W; X; DELETE EXTEND WRITE READEY; 3 2 1 0Z;C<[; A BIT SET MEANS THE CORRESPONDING ACCESS IS NOT ALLOWED.\; ]; INPUTS:$^;-+_; R0=DESIRED ACCESS MASK IN LOW FOUR BITSC`; R1=CURRENT UIC OF TASKa; R2=PCB ADDRESS OF REGIONb;W c; OUTPUTS:d;Ee; R0,R1 ARE MODIFIEDf; 9g; DIRECTIVE STATUS OF D.RS16 RETURNED IF ACCESS DENIED.Sh;-i0j$CKACC::MOV #30$,-(SP) ;PUSH COROUTINE ADDRESS2k BIC #^C17,R0 ;CLEAR ALL BUT DESIRED ACCESS MASK4l10$: SWAB R1 ;REVERSE GROUP AND OWNER IN UIC WORD4m CALL @(SP)+ ;CHECK IF QUALIFIED IN NEXT CATEGORYn BNE 20$ ;IF NE NO 5o BIT R0,P.PRO(R2) ;ALLOWED ACCESS IN THIS CATEGORY?0p BNE 20$ ;IF NE NO $q TST (SP)+ ;POP COROUTINE ADDRESSr RETURN ;RETURN TO CALLERI+s20$: ASL R0 ;SHIFT MASK TO NEXT C00ZzytccccATEGORYO t ASL R0 ; u ASL R0 ; v ASL R0 ;)w BR 10$ ;CHECK ACCESS IN THIS CATEGORY x30$: CMPB R1,#10 ;SYSTEM UIC?y BHI 40$ ;IF HI NOC#z SEZ ;SET FLAG FOR ACCESS CHECKA0{40$: CALL @(SP)+ ;CHECK ACCESS AND SHIFT MASK| CMP R1,P.OWN(R2) ;OWNER UIC? ,} CALL @(SP)+ ;CHECK ACCESS AND SHIFT MASK#~ CMPB R1,P.OWN+1(R2) ;SAME GROUP?C, CALL @(SP)+ ;CHECK ACCESS AND SHIFT MASK' SEZ ;INSURE CHECK FOR WORLD ACCESS CALL @(SP)+ ;CHECK ACCESS. DRSTS D.RS16 ;ACCESS DENIED IF WE GET HERE;+*; **-$CRATT-CREATE ATTACHMENT DESCRIPTOR;EG; THIS ROUTINE CREATES AN ATTACHMENT DESCRIPTOR AND INSERTS IT IN THEI; NECESSARY QUEUES.G;A ; INPUTS:;:.; R2=PCB ADDRESS OF REGION BEING ATTACHED TO; R4=ACCESS CODE$; R5=TCB ADDRESS OF ATTACHING TASK; ; OUTPUTS:; ; C=0 IF SUCCESSFULO(; R1=ADDRESS OF ATTACHMENT DESCRIPTOR; R0 IS MODIFIEDN:; C=1 IF AN ATTACHMENT DESCRIPTOR COULD NOT BE ALLOCATED; R0,R1 ARE MODIFIEDS;- .IFTF $CRATT::MOV R3,-(SP) ;SAVE R3C! MOV R2,-(SP) ;SAVE PCB ADDRESSU5 MOV #A.LGTH,R1 ;PICK UP ATTACHMENT DESCRIPTOR SIZE 3 CALL $ALOCB ;ALLOCATE THE ATTACHMENT DESCRIPTOR:% BCS 10$ ;IF CS ALLOCATION FAILURET6 ADD R0,R1 ;POINT PAST END OF ATTACHMENT DESCRIPTOR* MOV (SP),-(R1) ;SET PCB ADDRESS (A.PCB)2 MOV R4,-(R1) ;INIT STATUS AND MAP COUNT (A.STS)4 BIC #^C17,(R1) ;CLEAR ALL BUT ACCESS BITS (A.STS)1 TST -(R1) ;POINT TO TCBL THREAD WORD (A.TCBL)M/ MOV R5,R0 ;POINT TO TCB ATTACHMENT LISTHEAD  ADD #T.ATT,R0 ;2 CALL $QINSF ;INSERT DESCRIPTOR AT END OF QUEUE( MOV R5,-(R1) ;SET TCB ADDRESS (A.TCB)& CLRB -(R1) ;ZERO I/O COUNT (A.IOC)? MOVB T.PRI(R5),-(R1) ;INIT PRIORITY TO TASK PRIORITY (A.PRI) , TST -(R1) ;POINT TO PCBL THREAD (A.PCBL)1 MOV (SP),R0 ;POINT TO PCB ATTACHMENT LISTHEAD( ADD #P.ATT,R0 ;, CALL $QINSP ;INSERT IN QUEUE BY PRIORITY CLC ;INDICATE SUCCESS(10$: MOV (SP)+,R2 ;RESTORE PCB ADDRESS MOV (SP)+,R3 ;RESTORE R3T RETURN ;E .IFT D;+.; **-$SRATT-SEARCH FOR ATTACHMENT DESCRIPTOR;QL; THIS ROUTINE VERFIES IF A VALID REGION ID WAS PASSED IN A PLAS DIRECTIVEI; BY SEARCHING FOR THE CORRESPONDING ATTACHMENT DESCRIPTOR IN THE TCB'S; ATTACHMENT QUEUE. ;T ; INPUTS:);M; (R3)=REGION ID TO VERIFY; 0 FOR TASK REGION-; 1-17 FOR OTHER STATICALLY LINKED REGIONSB"; R5=TCB ADDRESS OF CURRENT TASK; ; OUTPUTS:;R'; R5=ADDRESS OF ATTACHMENT DESCRIPTORO;TD; D.RS86 IS RETURNED IF THE ATTACHMENT DESCRIPTOR CANNOT BE FOUND.;-@$SRATT::MOV T.ATT(R5),R5 ;POINT TO FIRST ATTACHMENT DESCRIPTOR! MOV (R3),-(SP) ;SAVE REGION IDY* CMP (SP),#17 ;STATICALLY LINKED REGION? BHI 9$ ;NO IF HI35$: DEC (SP) ;SEARCH FOR PROPER ATTACHMENT DESCR BLT 20$ ;IF LT, FOUND IT( MOV (R5),R5 ;POINT TO NEXT ATT DESCR BEQ 15$ ;IF EQ, END OF LIST  BR 5$ ;GO AGAINR-9$: ADD #A.TCBL,(SP) ;ADD BIAS TO LINK WORDE.10$: CMP R5,(SP) ;MATCH ON THIS DESCRIPTOR? BEQ 20$ ;IF EQ YES7 MOV (R5),R5 ;ELSE POINT TO NEXT DESCRIPTOR (A.TCBL)  BNE 10$ ;IF NE THERE IS ONEC'15$: DRSTS D.RS86 ;INVALID REGION ID >20$: SUB #A.TCBL,R5 ;POINT TO START OF ATTACHMENT DESCRIPTOR TST (SP)+ ;CLEAN STACK RETURN ;R;+1; **-$SRWND-SEARCH FOR SPECIFIED ADDRESS WINDOW(;5J; THIS ROUTINE VERIFIES THAT THE SPECIFIED ADDRESS WINDOW ID CORRESPONDS*; TO A VALID ESTABLISHED ADDRESS WINDOW.;W ; INPUTS:C;,; (R3)=ADDRESS WINDOW ID%; R4=ADDRESS OF CURRENT TASK HEADER5"; R5=TCB ADDRESS OF CURRENT TASK;C ; OUTPUTS:;I(; R4=POINTER TO SPECIFIED WINDOW BLOCK; R0 IS MODIFIED.;SA; D.RS87 IS RETURNED IF THE SPECIFIED ADDRESS WINDOW IS INVALID+;-6$SRWND::MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOWS3 MOVB (R3),R0 ;PICK UP ADDRESS WINDOW ID (W.NID)R BEQ 10$ ;IF EQ ILLEGAL .IF DF U$$DAS! CMP #1,R0 ;ADDRESS WINDOW 1 ?S BNE 5$ ;IF NE NO1 BIT #T4.DSP,T.ST4(R00bzTzttt tfDATA5) ;TASK USE USER D SPACE ?D/ BNE 10$ ;IF NE YES, CAN'T CHANGE WINDOW ONEO5$: ;REFERENCE LABELU .ENDC ; DF U$$DAS% CMP R0,(R4)+ ;WINDOW ID TOO LARGE?I BHIS 10$ ;IF HIS YES. ASL R0 ;CONVERT WINDOW ID TO 8 WORD OFFSET  ASL R0 ;  ASL R0 ;  ASL R0 ;& ADD R0,R4 ;POINT TO ADDRESS WINDOW7 TST W.BSIZ(R4) ;IS IT AN ESTABLISHED ADDRESS WINDOW?  BEQ 10$ ;IF EQ NO.  RETURN ;, 10$: DRSTS D.RS87 ;INVALID ADDRESS WINDOW  ;+" ; **-$UNMAP-UNMAP ADDRESS WINDOW;ED; THIS ROUTINE SEARCHES FOR AND CONDITIONALLY UNMAPS THE SPECIFIED; ADDRESS WINDOW.; ; INPUTS:$;'; R4=ADDRESS OF WINDOW TO BE UNMAPPEDI;B ; OUTPUTS:;S; R0 IS MODIFIED;D"; C=1 IF UNMAPPING WAS PERFORMED;-  .ENABL LSB3 1$: RETURN ;RETURN TO KEEP BRANCH FROM BREAKING !/"$UNMAP::TST (R4) ;IS WINDOW MAPPED? (W.BPCB)I$# BEQ 1$ ;IF EQ, WINDOW NOT MAPPED$ MOV R3,-(SP) ;SAVE REGISTERS% MOV R2,-(SP) ;N& MOV R1,-(SP) ;I'( .IF DF F$$MAP&X$$HDR&P$$LAS)"* TST $FMAPP ;TASK USE FAST MAP?+ BEQ 5$ ;IF EQ NO,, MOVB W.BFPD(R4),R0 ;GET FIRST PDR ADDRESS"- BPL 5$ ;IF PL NOT USER WINDOW,. ;CAN'T BE SET FAST MAP/ ASL R0 ;ADJUST TOF0 ASL R0 ;QUADWORD OFFSET-'1 BIC #177407,R0 ;REMOVE UNNEEDED BITSN 2 ADD $FMAPP,R0 ;POINT TO BLOCK3 CLR (R0) ;INDICATE UNUSED 45$:D"5 .ENDC ; DF F$$MAP&X$$HDR&P$$LAS6>7 MOV W.BATT(R4),R0 ;PICK UP ADDRESS OF ATTACHMENT DESCRIPTOR68 CLR W.BATT(R4) ;CLEAR ATTACHMENT DESCRIPTOR POINTER+9 DECB A.MPCT(R0) ;DECREMENT MAPPING COUNTA;: MOVB A.MPCT(R0),-(SP) ;SAVE MAPPING COUNT FOR TEST LATERR.; MOV A.TCB(R0),R1 ;POINT TO TASK TCB ADDRESS<=> .IF DF X$$HDR?4@ MOV $SAHPT,R0 ;GET ADDRESS OF CURRENT TASK HEADERAB .IFFRC4D MOV $HEADR,R0 ;GET ADDRESS OF CURRENT TASK HEADEREF .ENDCGH .IF DF S$$LIB!U$$DASI9J MOV H.SMAP(R0),-(SP) ;GET SUPER MAPPING MASK FOR LATERKKL .ENDC ; DF S$$LIB!U$$DASTM6N MOV H.WND(R0),R2 ;GET ADDRESS OF FIRST WINDOW BLOCK.O MOVB W.BFPD(R4),R0 ;POINT TO FIRST USER PDRP Q TR .IF DF S$$LIBS GT BPL 17$ ;IF PL SUPER WINDOWTUV .IFTF ; DF S$$LIBW10$: ;REFERENCE LABELX .IF DF U$$DASY(Z CMP #UDSDR0,R0 ;USER D SPACE WINDOW ?.[ BLOS 140$ ;IF LOS YES, HANDLE USER D SPACE\] .ENDC ; DF U$$DAS^,_ TST W.BLVR+2(R2) ;IS THE TASK PRIVILEGED?` BEQ 14$ ;IF EQ NO 7a MOV KISAR0-UINDR0(R0),UINAR0-UINDR0(R0) ;RESTORE PRVLb ;MAPPINGcd .IF DF M$$PROe2f MOV #177406,(R0)+ ;RESTORE R/W 4K BYPASS ACCESSgh .IFF ; DF M$$PROi*j MOV #77406,(R0)+ ;RESTORE R/W 4K ACCESSkl .ENDC ; DF M$$PROmn .IF DF U$$DASo:p BITB $BTMSK-UINDR0-2(R0),1(SP) ;THIS APR MAPPED THROUGH q ;DISCRETE USER D WINDOW0r BNE 15$ ;IF NE YES, LEAVE USER/SUPER D ALONE:s MOV KISAR0-UINDR0-2(R0),UDSAR0-UINDR0-2(R0) ;MAP USER Dt ;TO EXECQuv .IF DF M$$PROw@x MOV #177406,UDSDR0-UINDR0-2(R0) ;RESTORE R/W 4K BYPASS ACCESSyz .IFF ; DF M$$PROV{8| MOV #77406,UDSDR0-UINDR0-2(R0) ;RESTORE R/W 4K ACCESS}~ .ENDC ; DF M$$PRO .ENDC ; DF U$$DAS .IFT ; DF S$$LIB$> BITB $BTMSK-2-UINDR0-2(R0),(SP) ;SUPER I MAPPED TO USER D ? BNE 15$ ;IF NE NO> MOV KISAR0-UINDR0-2(R0),SDSAR0-UINDR0-2(R0) ;MAP SUPER D TO ;EXEC .IF DF M$$PRO@ MOV #177406,SDSDR0-UINDR0-2(R0) ;RESTORE R/W 4K BYPASS ACCESS .IFF ; DF M$$PRO#8 MOV #77406,SDSDR0-UINDR0-2(R0) ;RESTORE R/W 4K ACCESS .ENDC ; DF M$$PRO V .IFTF U  BR 15$ ;&14$: CLR (R0)+ ;CLEAR NEXT USER PDR .IF DF U$$DAS< BITB $BTMSK-UINDR0-2(R0),1(SP) ;THIS USER D APR MAPPED BY! ;EXPLICIT D SPACE WINDOWD$ BNE 15$ ;IF NE YES, DON'T CHANGE. CLR UDSDR0-UINDR0-2(R0) ;UNMAP USER D SPACE .ENDC ; DF U$$DAS .IFT ; DF S$$LIBM< BITB $BTMSK-2-UINDR0-2(R0),(SP) ;SUPER D MAPPED TO USER D ;FOR THIS APR ? BNE 15$ ;IF NE NOR/ CLR SDSDR0-UINDR0-2(R0)00jzytcccc ;UNMAP SUPER D SPACE  .IFTF ; DF S$$LIB .IF DF U$$DAS BR 15$ ;SKIP USER D CODEC140$: BICB $BTMSK-UDSDR0(R0),1(SP) ;INDICATE REMAPPING TO I SPACEA@ MOV UINAR0-UDSDR0(R0),UDSAR0-UDSDR0(R0) ;MAP USER D TO USER I3 MOV UINDR0-UDSDR0(R0),(R0)+ ;AND SET SAME ACCESSA .IF DF S$$LIB> BITB $BTMSK-2-UDSDR0-2(R0),(SP) ;THIS SUPER D APR MAPPED TO ;USER D SPACE  BNE 15$ ;IF NE NO > MOV UINAR0-UDSDR0-2(R0),SDSAR0-UDSDR0-2(R0) ;MAP SUPER D TO ;USER D> MOV UINDR0-UDSDR0-2(R0),SDSDR0-UDSDR0-2(R0) ;AND SET ACCESS .ENDC ; DF S$$LIB .ENDC ; DF U$$DAS!15$: DECB W.BNPD(R4) ;DONE YET?I BGT 10$ ;IF GT NOU .IFT ; DF S$$LIBD* BR 18$ ;SKIP SUPER I SPACE WINDOW CODE317$: ADD #SDSDR0,R0 ;ADJUST TO SUPER D SPACE PDRSB6 DECB $SUPFL ;COUNT ONE LESS SUPERVISOR MODE WINDOW( BNE 170$ ;IF NE THERE STILL ARE SOME( BIC #10,SR3 ;DISABLE CSM INSTRUCTION: BIS #PMODE!CMODE,$STACK-2 ;FORCE EXECUTION TO USER MODE:170$: BITB $BTMSK-2-SDSDR0(R0),(SP) ;THIS APR OVERMAPPED# BEQ 171$ ;IF EQ NO, DON'T TOUCH% CLR (R0)+ ;CLEAR NEXT SUPER D PDRN BR 172$ ;GO DO NEXT ONE$!171$: TST (R0)+ ;SKIP THIS APRI#172$: DECB W.BNPD(R4) ;DONE YET ?E BGT 170$ ;IF GT NO .ENDC ; DF S$$LIB18$: ;REFERENCE LABELS .IF DF U$$DAS!S$$LIBS, MOV $SAHPT,R0 ;GET ADDRESS OF TASK HEADER@ MOVB 1(SP),H.DMAP(R0) ;RESTORE D SPACE MAPPING MASK TO HEADER& TST (SP)+ ;CLEAN OFF MAPPING MASKS .ENDC ; DF U$$DAS!S$$LIBR, MOV R1,R0 ;COPY TCB ADDRESS FOR DEACCESS) MOV (R4),R1 ;POINT TO PCB TO DEACCESS   N .IF DF M$$PRO O 2 CALL $RESBP ;RESET CACHE BYPASS AS APPROPRIATE B .IFTF E6 TSTB (SP)+ ;WAS THIS LAST MAP THROUGH ATTACHMENT ?0 BNE 20$ ;IF NE NO, DON'T DEACCESS REGION YET MOV R0,-(SP) ;SAVE REGISTERS; MOV R1,-(SP) ;  CALL $DEARG ;DEACCESS REGION" MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R0 ;C'20$: CLR (R4) ;UNMAP WINDOW (W.BPCB)  S .IFT  R  .IF DF M$$EXT E3 CMP P.REL(R1),#177600 ;IS REGION IN THE IO PAGE?  .IFFF $1 CMP P.REL(R1),#7600 ;IS REGION IN THE IO PAGE?S O .ENDC  F BLO 95$ ;NO IF LO;) CALL $SETAT ;RECALULATE TASK AFFINITYB $ .IFTF N&95$: MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R2 ; MOV (SP)+,R3 ;'  SEC ;RETURN CS FOR WINDOW UNMAPPEDP 100$: RETURN ;    .ENDC    .ENDC ; DF P$$LAS W  .DSABL LSBS ;+.; **-$GTMCT-DETERMINE NUMBER OF MAPPED TASKS;7K; THIS ROUTINE CALCULATES THE NUMBER OF WINDOWS MAPPED TO A GIVEN REGION.09; THE VALUE RETURNED IS FOR DETERMINING IF CACHE BYPASS!; IS NECESSARY FOR THIS REGION.T;C ; INPUTS:A;T; R1=PCB ADDRESS; ; OUTPUTS:!; -"; R2=NUMBER OF WINDOWS MAPPED TO THE REGION(#; R2=0 FOR READ ONLY COMMONSO!$; R2=1 IF ONE WINDOW IS MAPPED 0%; R0=ADDRESS OF TASK'S ATTACHMENT DESCRIPTOR8&; R2=2 IF 2 OR MORE WINDOWS ARE MAPPED TO THIS REGION';E(; R0 MODIFIEDA);-* + , .IF DF M$$PRO- A).$GTMCT::CLR R2 ;ASSUME NO MAPPED TASKS +/ BIT #P2.RON,P.ST2(R1) ;READ ONLY REGION?M0 BNE 30$ ;YES IF NE1 MOV R1,-(SP) ;R*2 CLR -(SP) ;RESERVE A WORD ON THE STACK)3 ADD #P.ATT,R1 ;POINT TO ATT DESCR LIST,410$: MOV (R1),R1 ;POINT TO NEXT ATT DESCR5 BEQ 20$ ;IF EQ END OF LIST*6 MOVB A.MPCT-A.PCBL(R1),R0 ;TASK MAPPED?7 BEQ 10$ ;IF EQ NOA.8 MOV R1,(SP) ;SAVE ATTACHMENT DESCR ADDRESS59 ADD R0,R2 ;CALCULATE TOTAL NUMBER OF TASKS MAPPED): CMP R2,#2 ;AT LEAST TWO TASKS MAPPED?; BLT 10$ ;IF LT NO 4<20$: SUB #A.PCBL,(SP) ;POINT TO START OF ATT DESCR&= MOV (SP)+,R0 ;GET ATT DESCR ADDRESS> MOV (SP)+,R1 ;RESTORE R1R?30$: RETURN ;E@ KA;+!B; **-$STCXT-SET MAPPING CONTEXTSC;9D; THIS ROUTINE RELOADS THE PDRS FOR A SPECIFIED REGION. E;D F; INPUTS:MG;.@H; IF CALLED TO FORCE SECOND MAPPED TASK TO BYPASS THE CACHE:00rzTzttt tfDATAI;)<J; R4=ATTACHMENT DESCRIPTOR FOR FIRST TASK TO MAP TO REGION=K; R5=ATTACHMENT DESCRIPTOR FOR SECOND TASK TO MAP TO REGIONAL;KM; IF CALLED TO RELOAD THE PDRS FOR THE ONLY TASK MAPPED TO THIS REGION:RN;M;O; R4=ATTACHMENT DESCRIPTOR FOR ONLY TASK MAPPED TO REGIONRP; R5=0Q;R R; OUTPUTS:S;DT; THE PDRS ARE SET UP SO THAT ACCESSES TO THIS REGION BYPASS CACHEU; AS APPROPRIATE. V;NW;-X Y$STCXT:: ;REFERENCE LABELEZ[ .IF DF X$$HDR\)] MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGC^_ .ENDC`1a MOV $TKTCB,R0 ;GET TCB ADDRESS OF CURRENT TASKE#b BEQ 100$ ;IF EQ NO CURRENT TASKG+c BIT #TS.RUN,T.STAT(R0) ;IS TASK RUNNING?Sd BEQ 100$ ;NO IF EQ$e MOV T.PCB(R0),R0 ;GET PCB ADDRESSfg .IF DF X$$HDRLhi .IFTFj'k MOV P.HDR(R0),R1 ;GET HEADER ADDRESSlm .IFTSn#o BNE 10$ ;IF NE, RESIDENT HEADERO3p MOV P.REL(R0),KISAR6 ;MAP TO NON RESIDENT HEADER/q MOV #140000,R1 ;POINT TO NON RESIDENT HEADER$r10$:s .ENDCt/u MOV R4,R2 ;COPY ATT DESCR ADDRESS OF CALLER#v CALL $SRWAT ;SEARCH FOR WINDOW Cw BCS 100$ ;IF CS NOT FOUNDE*x TST W.BPCB(R0) ;IS WINDOW STILL MAPPED?y BEQ 100$ ;NO IF EQ4z BIT #WB.NBP,W.BLPD(R0) ;CACHE BYPASS NOT DESIRED?%{ BNE 100$ ;YES IF NE DO NOT BYPASSF*| CLR -(SP) ;RESERVE A WORD ON THE STACK3} MOVB W.BNPD(R0),(SP) ;GET NUMBER OF PDRS TO LOADH.~ MOV W.BLPD(R0),R2 ;GET CONTENTS OF LAST PDR* BIC #77777,R2 ;KEEP ONLY THE BYPASS BIT/ MOVB W.BFPD(R0),R1 ;GET ADDRESS OF FIRST PDRR   .IF DF S$$LIB L BMI 30$ ;IF MI USER WINDOW* ADD #SISDR0,R1 ;POINT TO SUPERVISOR PDR T .IFTF /30$: BIC #100000,(R1) ;CLEAR BYPASS INDICATORB. BIS R2,(R1)+ ;SET BYPASS BIT AS APPROPRIATE B .IFT; F CMP R1,#UISDR0 ;USER WINDOW?  BLO 40$ ;NO IF LOS- MOV -2(R1),SDSDR0-UISDR0-2(R1) ;RELOAD PDRR L .ENDC B 0(40$: DEC (SP) ;FINISHED LOADING PDRS? BGT 30$ ;IF GT NOY TST (SP)+ ;CLEAN THE STACK100$: ;REFERENCE LABEL .IF DF X$$HDR+ MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPINGD .ENDC TST R5 ;RESET BYPASS+ BEQ 110$ ;IF EQ YES, NO TASK TO UNBLOCKR$ MOV A.TCB(R5),R0 ;GET TCB ADDRESS# DEC T.STAT(R0) ;UNBLOCK THE TASK4 CALLR $SETCR ;SET A CONDITIONAL SCHEDULE REQUEST110$: RETURN ; -;+; **-$SRWAT-SEARCH FOR WINDOW;:; THIS ROUTINE SEARCHES FOR A MAPPED WINDOW WITH A GIVEN; ATTACHMENT DESCRIPTOR.;T ; INPUTS:N;S; R1=HEADER ADDRESSE$; R2=ATTACHMENT DESCRIPTOR ADDRESS;V ; OUTPUTS:;O,; C=1 IF NO MATCH ON ATTACHMENT DESCRIPTOR;E; C=0 IF WINDOW FOUND;; R0=WINDOW ADDRESS;R;M; R0 MODIFIEDG;-6$SRWAT::MOV H.WND(R1),R0 ;POINT TO NUMBER OF WINDOWS) MOV (R0)+,-(SP) ;GET NUMBER OF WINDOWS710$: CMP W.BATT(R0),R2 ;ATTACHMENT DESCRIPTORS MATCH?N BNE 15$ ;IF NE NOU% TSTB A.MPCT(R2) ;IS WINDOW MAPPED?A BNE 20$ ;IF NE YES+15$: ADD #W.BLGH,R0 ;POINT TO NEXT WINDOWH DEC (SP) ;ANY WINDOWS LEFT?  BGT 10$ ;IF GT YES SEC ;WINDOW NOT FOUND<20$: MOV PC,(SP)+ ;CLEAN THE STACK WITHOUT MODIFYING CARRY  RETURN ;R;+ ; **-$RESBP-RESET CACHE BYPASS;5; THIS ROUTINE WILL RESET CACHE BYPASS FOR A REGIONW/; IF ONLY ONE WINDOW IS MAPPED TO THE REGION.;0 ; INPUTS:(;2; R1=PCB ADDRESS;M ; OUTPUTS:; 9; CACHE BYPASS IS DISABLED IF ONLY ONE WINDOW IS MAPPED2; TO THE REGION.;D;- !$RESBP::SAVNR ;SAVE REGISTERS  MOV R3,-(SP) ;  MOV R2,-(SP) ;T MOV R1,-(SP) ;D MOV R0,-(SP) ;: .IF DF X$$HDR) MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGR .ENDC8 CALL $GTMCT ;GET NUMBER OF TIMES REGION IS MAPPED TO DEC R2 ;ONLY MAPPED ONCE? BNE 100$ ;IF NE NO$ MOV A.TCB(R0),R2 ;GET TCB ADDRESS$ MOV T.PCB(R2),R2 ;GET PCB ADDRESS> BIT #PS.OUT!PS.CKP!PS.CKR,P.STAT(R2) ;IS TASK CHECKPOINTED? BEQ 10$ ;IF EQ NOO, BICB #AS.SBP,A.STAT(R0) ;CLEAR BYPASS BIT< BISB #AS.RBP,A.STAT(R00zzytcccc0) ;INDICATE BYPASS IS NOT NECESSARY  BR 100$ ;  .IF DF X$$HDR  .IFTF+10$: MOV P.HDR(R2),R1 ;GET HEADER ADDRESS  .IFT# BNE 20$ ;IF NE, RESIDENT HEADER 3 MOV P.REL(R2),KISAR6 ;MAP TO NON RESIDENT HEADER / MOV #140000,R1 ;POINT TO NON RESIDENT HEADERR20$: .ENDC1 MOV R0,R2 ;COPY ATTACHMENT DESCRIPTOR ADDRESSP" CALL $SRWAT ;SEARCH FOR WINDOW BCS 100$ ;IF CS NOT FOUNDN9 BIC #100000,W.BLPD(R0) ;RESET CACHE BYPASS IN LAST PDRA: BIT #WB.NBP!WB.BPS,W.BLPD(R0) ;SHOULD TASK RELOAD PDRS? BNE 100$ ;IF NE NO 2 MOV R2,R4 ;COPY ATT DESCR FOR ONLY TASK MAPPED  CLR R5 ;3 MOV A.TCB(R2),R2 ;GET TCB ADDRESS OF MAPPED TASK +  BIT #TS.RUN,T.STAT(R2) ;IS TASK RUNNING?T  BEQ 100$ ;IF EQ NO1  MOVB T.CPU(R2),R2 ;FIND CPU TASK IS RUNNING ONC!  ASL R2 ;CONVERT TO WORD INDEXT!  MOV $BTMSK(R2),R2 ;GET CPU BITT8 MOV #$STCXT,R3 ;GET ADDRESS OF ROUTINE TO RELOAD PDRS4 CALL $EXROP ;EXECUTE $STCXT ON CORRECT PROCESSOR B100$: ;REFERENCE LABEL; .IF DF X$$HDR* MOV (SP)+,KISAR6 ;RESTORE APR 6 MAPPING  .ENDC T" MOV (SP)+,R0 ;RESTORE REGISTERS MOV (SP)+,R1 ;A MOV (SP)+,R2 ;S MOV (SP)+,R3 ;T  RETURNI K;+$ ; **-$SETBP-SETUP FOR CACHE BYPASS!;(E"; THIS ROUTINE WILL DETERMINE IF ONLY ONE WINDOW IS MAPPED TO THIS TI#; REGION. IF SO, THE TASK MAPPED TO THIS REGION IS NOTIFIED TO BYPASS T$; CACHE AS NECESSARY.L%;R &; INPUTS:$'; (; R0=TCB ADDRESS); R1=PCB ADDRESS9*; R3=WINDOW ADDRESS OF TASK ABOUT TO MAP TO THIS REGIONS+;R ,; OUTPUTS:-;G8.; TASK MAPPED TO THIS REGION IS NOTIFIED AS NECESSARY.;/; TASK ABOUT TO MAP IS BLOCKED (IF NECESSARY) UNTIL TASK '0; ALREADY MAPPED RELOADS ITS CONTEXT.U1; 2;-3 S!4$SETBP::SAVNR ;SAVE REGISTERSM5 MOV R3,-(SP) ;D6 MOV R2,-(SP) ;S7 MOV R1,-(SP) ; 8 MOV R0,-(SP) ; 9: .IF DF X$$HDR;)< MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGR=> .ENDC?@ MOV R0,R4 ;COPY TCB ADDRESSB-A CALL $GTMCT ;GET NUMBER OF WINDOWS MAPPEDO&B DEC R2 ;ONLY ONE CURRENTLY MAPPED?C BNE 100$ ;IF NE NO7D10$: MOV A.TCB(R0),R1 ;GET TCB ADDRESS OF TASK MAPPEDT!E MOV T.PCB(R1),R1 ;POINT TO PCBI;F BIT #PS.OUT!PS.CKP!PS.CKR,P.STAT(R1) ;TASK CHECKPOINTED?-G BEQ 20$ ;IF EQ NO 8H BISB #AS.SBP,A.STAT(R0) ;INDICATE BYPASS IS NECESSARYI BICB #AS.RBP,A.STAT(R0) ; J BR 100$ ;5K20$: MOV R0,R2 ;COPY ATTACHMENT DESCRIPTOR ADDRESS LM .IF DF X$$HDRNOP MOV R1,R2 ;COPY PCB POINTERC'Q MOV P.HDR(R1),R1 ;GET HEADER ADDRESSO#R BNE 30$ ;IF NE, RESIDENT HEADERE3S MOV P.REL(R2),KISAR6 ;MAP TO NON RESIDENT HEADERG/T MOV #140000,R1 ;POINT TO NON RESIDENT HEADERRU30$: MOV R0,R2V TW .IFFPX'Y MOV P.HDR(R1),R1 ;GET HEADER ADDRESSZ[ .ENDC"\ CALL $SRWAT ;SEARCH FOR WINDOW] BCS 100$ ;IF CS NOT FOUND4^ BIS #100000,W.BLPD(R0) ;SET UP LAST PDR TO BYPASS$_ MOV A.TCB(R2),R1 ;GET TCB ADDRESS&` CMP R1,R4 ;SAME TASK MAPPED TWICE?a BEQ 100$ ;IF EQ YES =b BIT #TS.RUN,T.STAT(R1) ;IS TASK RUNNING ON SOME PROCESSOR? c BEQ 100$ ;IF EQ NOd MOV R1,-(SP) ;SAVE R1%e INC T.STAT(R4) ;BLOCK CALLING TASK4f MOV R4,R0 ;COPY TCB ADDRESSA'g CALL $SETCR ;SET A SCHEDULE REQUESTh MOV (SP)+,R1 ;RESTORE R1A4i MOV R2,R4 ;COPY ATTACHMENT DESCR FOR TASK MAPPED3j MOV W.BATT(R3),R5 ;GET ATT DESCRIPTOR OF CALLER 09k MOVB T.CPU(R1),R2 ;GET CPU ID ON WHICH TASK IS RUNNINGR!l ASL R2 ;CONVERT TO WORD INDEXS"m MOV $BTMSK(R2),R2 ;GET RUN MASK1n MOV #$STCXT,R3 ;GET ADDRESS OF ROUTINE TO CALLN8o CALL $EXROP ;EXECUTE $STCXT ON THE CORRECT PROCESSORp100$: ;REFERENCE LABELAq .IF DF X$$HDRr+s MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPINGLtu .ENDCv"w MOV (SP)+,R0 ;RESTORE REGISTERSxy MOV (SP)+,R1 ;4z MOV (SP)+,R2 ;D{ MOV (SP)+,R3 ;D | RETURN ;(} 5} .ENDC ; DF M$$PRO L  V;+; **-$DELRG-DELETE REGION ;IJ; THIS ROUTINE ASSUMES ALL CHECKS HAVE BEEN MADE ON WHETHER A REGION MAYH; BE DELETED OR NO00zTzttt tfDATAT. IT UNCONDITIONALLY DELETES THE REGION REGARDLESS-; OF WHAT STATE THE REGION IS CURRENTLY IN.0; H; WHEN THE REGION IS BE DELETED, A NUMBER OF OPERATIONS MAY HAVE TO BEG; PERFORMED TO EFFECT ALL NECESSARY CLEANUP, DEPENDING ON THE CURRENTJ; STATE OF THE REGION AS DETERMINED BY THE BITS PS.OUT AND PS.CKP. NOTEF; THAT IF THE REGION IS OUT OF MEMORY, IT CANNOT BE IN THE PARTITIONE; WAIT QUEUE, LOADER OR LOADER QUEUE. THIS IS DUE TO THE FACT THATTJ; SINCE THE CURRENT TASK IS RUNNING, IT HAS EITHER NOT BEEN MAPPED (COM-J; MON CANNOT BE CONTENDING FOR MEMORY) OR MAPPED AND NOT BLOCKED (COMMONG; IS IN MEMORY). ON DELETION, IF THE REGION HAS A NAME IT IS REMOVEDEG; FROM THE COMMON BLOCK DIRECTORY. ADDITIONAL CLEANUP ACTIONS FOR THET+; FOUR POSSIBLE STATES OF THE REGION ARE:S;A?; (PS.OUT=0,PS.CKP=0 => COMMON IS IN MEMORY) - RELEASE MEMORYN(; DELETE REGION PCB AND ANY DISK PCB.;OD; (PS.OUT=0,PS.CKP=1 => COMMON IS IN PROCESS OF BEING CHECKPOINTED<; OUT) - RELEASE MEMORY AND COUNT ON THE LOADER TO DETECT8; THIS CONDITION AND RELEASE ANY CHECKPOINT SPACE AND$; DELETE REGION PCB AND DISK PCB.;IB; (PS.OUT=1,PS.CKP=0 => REGION NEVER LOADED) - DELETE REGION PCB; AND ANY DISK PCB.;C?; (PS.OUT=1,PS.CKP=1 => REGION IS CHECKPOINTED OUT) - RELEASEA9; CHECKPOINT SPACE AND DELETE REGION PCB AND DISK PCB.M;N ; INPUTS: ;N; R0=REGION PCB ADDRESS.; ; OUTPUTS:;= ; NONE. ;- O7$DELRG::BIT #PS.COM,P.STAT(R0) ;IS IT A NAMED COMMON?T BEQ 40$ ;IF EQ NOT. TST P.NAM(R0) ;DOES THE REGION HAVE A NAME? BEQ 40$ ;IF EQ NO > MOV #$CBDHD-P.CBDL,R1 ;POINT TO COMMON BLOCK DIRECTORY HEAD430$: CMP P.CBDL(R1),R0 ;POINTING TO ONE TO DELETE? BEQ 35$ ;IF EQ YES# MOV P.CBDL(R1),R1 ;POINT TO NEXTO  BR 30$ ;B35$: MOV P.CBDL(R0),P.CBDL(R1) ;UNLINK FROM COMMON BLK DIRECTORY540$: BIS #PS.DEL,P.STAT(R0) ;MARK REGION FOR DELETE/ BIT #PS.OUT,P.STAT(R0) ;IS REGION IN MEMORY?G BNE 50$ ;IF NE NO) MOV R0,R1 ;COPY PCB ADDRESS4+ TST P.DPCB(R0) ;DOES IT HAVE A DISK PCB?G BEQ 45$ ;IF EQ NOQ9 CALLR $ICHKP ;INITIATE CHECKPOINT & LET LOADER FINISH %45$: MOV R0,-(SP) ;SAVE PCB ADDRESS( CALL $RLPR1 ;FREE MEMORY$ MOV (SP)+,R0 ;RESTORE PCB ADDRESS.50$: CALLR $RLCPS ;RELEASE CHECKPOINT SPACE;+<; **-$DETRG-DETACH REGION BY ATTACHMENT DESCRIPTOR ADDRESS;SM; THIS ROUTINE DETACHES A TASK FROM A REGION AND DEALLOCATES THE ATTACHMENTIK; DESCRIPTOR. ON THE LAST DETACH OF A REGION IT IS CHECKED FOR DELETION.P&; WHEN APPRORIATE, $NXTSK IS CALLED.;4;IM; NOTE: THE DETACH REGION ROUTINE MAKES USE OF THE FOLLOWING RELATIONSHIPSV9; IN THE DATA STRUCTURES AS SHOWN IN THE DIAGRAM BELOW:;V%; A.TCB IS AT OFFSET 4 FROM A.PCBLC%; A.PCB IS AT OFFSET 4 FROM A.TCBL;; ; PCBA ; +-------+T; | |E; | |A$; |-------| ADB4; | P.ATT |--| +---------------+ +---------------+;; |-------| |--->| A.PCBL |------>| 0 |<------+E9; +----|-------| |---------------| |---------------| |*; | | | | A.IOC | A.PRI | | | | |0; | | | |---------------| |---------------| |%; | +-------+ | A.TCB | | | |D5; | |---------------| |---------------| |P7; | TCB |--->| A.TCBL |------>| 0 | |?; | +-------+ | |---------------| |-->|---------------| | +; | | | | |A.MPCT | A.STAT| | | | | |-7; | | | | |---------------| | |---------------| |A,; | |-------| | | A.PCB | | | | |=; | | T.ATT |--| +---------------+ | +---------------+ | 1; | |-------| | |-1; | |-------|---------------------------| |A; | | | |; | | | |; | +-------+ |; | |K; +--------------------------------------------------------------------+-; ;>;-K; THE ROUTINE BELOW CLEARS THE KEY TO SEARCH ON, AND CLEARS OFFSET 4 FROM-J; THE LINK WORD BEFORE CALLING $QRMVT. $Q00zztccccRMVT COMPARES OFFSET 4 IN EACHM; ELEMENT ON THE LIST WITH THE KEY. THE ZERO KEY WILL MATCH THE ATTACHMENT 1; DESCRIPTOR WHICH HAS BEEN MARKED WITH A ZERO. ;- ; INPUTS:-;-'; R5=ADDRESS OF ATTACHMENT DESCRIPTOR;| ; OUTPUTS:;|; R0,R1,R2,R3 ARE MODIFIED. ;-  2$DETRG::MOV A.PCB(R5),R0 ;POINT TO PCB OF REGION4 ADD #P.ATT,R0 ;POINT TO ATTACHMENT DESCR LISTHEAD CLR R1 ;CLEAR SEARCH KEY( MOV A.TCB(R5),-(SP) ;SAVE TCB ADDRESS8 CLR A.TCB(R5) ;MARK ATTACHMENT DESCRIPTOR FOR REMOVAL3 CALL $QRMVT ;REMOVE DESCRIPTOR FROM PCB'S QUEUEI. TST (R0) ;IS ANYONE ELSE ATTACHED? (P.ATT) BNE 55$ ;IF NE YES * SUB #P.ATT,R0 ;POINT TO START OF PCB 4 BIT #PS.PER,P.STAT(R0) ;PARITY ERROR IN REGION?  BEQ 22$ ;IF EQ NO 3 MOV $FXRPT,R0 ;GET TCB ADDRESS OF RECOVERY TASK N( BEQ 55$ ;IF EQ IT IS NOT INSTALLED 1 CMP R0,(SP) ;PARITY ERROR IN RECOVERY TASK? E BEQ 55$ ;IF EQ YES , CALL $EXRQN ;REQUEST THE RECOVERY TASK # BR 55$ ;DO NOT DELETE REGION /22$: TST P.NAM(R0) ;IS THIS A NAMED REGION? I BNE 25$ ;IF NE YES ' MOV (SP),R1 ;PICK UP TCB ADDRESS Y, MOV T.PCBV(R1),R1 ;POINT TO PCB VECTOR # BEQ 26$ ;IF EQ THERE IS NONE T/ CMP R0,2(R1) ;READ ONLY REGION OF MU TASK? % BNE 26$ ;IF NE NO, MUST DELETE C! BR 55$ ;ELSE DO NOT DELETE <25$: BIT #PS.DEL,P.STAT(R0) ;IS REGION MARKED FOR DELETE?  BEQ 55$ ;IF EQ NO Q)26$: CALL $DELRG ;DELETE THE REGION V+55$: MOV (SP)+,R0 ;RESTORE TCB ADDRESS 9 ADD #T.ATT,R0 ;POINT TO ATTACHMENT DESCRIPTOR LISTHEADE CLR R1 ;CLEAR SEARCH KEY8 CLR A.PCB(R5) ;MARK ATTACHMENT DESCRIPTOR FOR REMOVAL2 CALL $QRMVT ;REMOVE DESCRIPTOR FROM TCB'S LIST& MOV R5,R0 ;COPY DESCRIPTOR ADDRESS) MOV #A.LGTH,R1 ;SET SIZE TO DEALLOCATES2 CALLR $DEACB ;DEALLOCATE ATTACHMENT DESCRIPTOR   .END(R0) ;IS REGION MARKED FOR DELETE?  BEQ 55$ ;IF EQ NO Q)26$: CALL $DELRG ;DELETE THE REGION V+55$: MOV .TITLE DRABOT .IDENT /04.01/E N; ;V; COPYRIGHT (c) 1981 BY(; DIGITAL EQUIPMENT CORPORATION, MAYNARD'; MASSACHUSETTS. ALL RIGHTS RESERVED. ;$ ; COPYRIGHT (C) 1974, 1976, 1979;.A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDA; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSEHA; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISKA; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OREA; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND 1; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED.I;AA; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTEA; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;SA; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFM<; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;R;T; D. N. CUTLER 11-SEP-73; ;A; PREVIOUSLY MODIFIED BY:M;N; T. M. MARTIN; MODIFIED BY:;E ; B. S. MCCARTHY 16-OCT-84 04.01;T&; BM319 -- ADDITION OF BOM$ DIRECTIVE;S; MACRO LIBRARY CALLSA;  .MCALL ABODF$" ABODF$ ;DEFINE TASK ABORT CODES;+; **-$DRABO-ABORT TASK;OE; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF A; SPECIFIED TASK.E;O ; DPB FORMAT: ; "; WD. 00 -- DIC(83.),DPB SIZE(3.).$; WD. 01 -- FIRST HALF OF TASK NAME.%; WD. 02 -- SECOND HALF OF TASK NAME.1;E ; INPUTS:A; 1; R0=ADDRESS OF THE TCB OF THE TASK TO TERMINATE.I>; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO TERMINATE.9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.T/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.D,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;E5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; -; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.I&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.U;; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF THE SPECIFIED; TASK IS NOT ACTIVE.S;-*00zzttt tfDATA$DRABO::TST (R1)+ ;SPECIFIED TASK ACTIVE? BMI 10$ ;IF MI NOO+ TSTB (R1) ;TASK ALREADY BEING TERMINATED?  BMI 10$ ;IF MI YES) CLR R2 ;INIT SUB-CODE (AB.TYP!AB.NPV=0)N0 BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED?% BNE 5$ ;IF NE YES, SUB-CODE CORRECTA, INC R2 ;SET NONPRIV ABORT ATTEMPT (AB.NPV)05$: MOV R0,R1 ;SET TCB ADDRESS OF TASK TO ABORT% MOV #S.CABO,R0 ;SET REASON FOR ABORTE CALLR $ABTSK ;ABORT TASK'10$: DRSTS D.RS7 ;SET DIRECTIVE STATUSC;+5; **-$DRBOM-SIMULATE BREAKPOINT OR ABORT WITH MESSAGEP;F2; THIS DIRECTIVE HAS ONE OF TWO POSSIBLE OUTCOMES:;S>; 1) THE DIRECTIVE HAS REQUESTED A BREAKPOINT IF POSSIBLE.C; IF THE CURRENT TASK HAS A SST VECTOR SPECIFIED FOR S.CBPT,PE; A SST OCCURS AS IF A BPT HAD BEEN EXECUTED. THIS IS PROVIDEDIE; FOR COMPATIBILITY WITH TASKS WHICH PREVIOUSLY TRAPPED SYSTEMO7; GENERATED BPTS, SUCH AS LOAD OVERLAY FAILURES. ;BA; 2) THE TASK DIDN'T REQUEST A BREAKPOINT, OR THERE IS NO SSTOB; VECTOR FOR BPT. THE TASK IS ABORTED, AND TKTN IS PASSED AC; MESSAGE CODE FOR THE FAILURE (SEE ABODF$ FOR DEFINITIONS).EA; IF THE DIRECTIVE SPECIFIES AN UNKNOWN ERROR CODE, S.BUNKS,; (UNKNOWN BOM$ ERROR) IS SUBSTITUTED;O ; DPB FORMAT:P;A#; WD. 00 -- DIC(211.),DPB SIZE(3.). ; WD. 01 -- ABORT CODE3; WD. 02 -- FLAGS WORD (BIT 0 SET = TRY BREAKPOINT) ;N ; INPUTS:,;C9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.R+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.N,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R ; OUTPUTS:;O9; EITHER A BREAKPOINT IS SIMULATED OR THE TASK IS ABORTEDK;-.$DRBOM::MOV (R3)+,R1 ;GET SPECIFIED ABORT CODE. MOV #S.BUNK,R0 ;ASSUME INVALID CODE SPECIFIED CMP #S.BHI,R1 ;IS CODE VALID' BLO 10$ ;IF LO NO, USE S.BUNK INSTEAD  INC R1 ;ADJUST CODE UP BY ONE  ADD R1,R0 ;AND BIAS BY S.BUNKS*10$: BIT #S.BBIF,(R3) ;BREAKPOINT DESIRED? BNE 20$ ;IF NE YES CALLR $ABCTK ;GO ABORT TASK4120$: MOV R0,$TEMP0 ;INDICATE ABORT CODE FOR SSTSRA& MOV #S.CBPT,2(SP) ;SET SST ABORT CODE+ MOV #2*2,(SP) ;AND LENGTH AS IF BREAKPOINTS0 MOV R4,R5 ;PUT HEADER ADDRESS IN CORRECT PLACE, CALLR $CNBPT ;ISSUE CONDITIONAL BREAKPOINT .ENDASSUME INVALID CODE SPECIFIED CMP #S.BHI,R1 ;IS CODE VALID' BLO 10$ ;IF LO NO, USE S.BUNK INSTEAD  INC R1 ;ADJUST CODE UP BY ONE  ADD R1,R0 ;AND BIAS BY S.BUNKS*10$: BIT #S.BBIF,(R3) ;BREAKPOINT DESIRED? BNE 20$ ;IF NE YES CALLR $ABCTK ;GO ABORT TASK4120$: MOV .TITLE DRFEA  .IDENT /01.03/R;F; COPYRIGHT (c) 1986 BY d*; DIGITAL EQUIPMENT CORPORATION, MAYNARD); MASSACHUSETTS. ALL RIGHTS RESERVED. ;KC ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED C ; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSEnC ; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISsC ; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORiC ; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO ANDL3; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED.T;1C; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTTC; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITALU; EQUIPMENT CORPORATION.;C; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF>; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;; T. M. MARTIN 16-JUL-82;S&; MODIFIED FOR RSX-11M-PLUS V3.0 BY:;W; B. S. MCCARTHY;Y/; MODIFIED FOR RSX-11M-PLUS V3.0 UPDATE B BY:F;S!; B. S. MCCARTHY 9-JUL-86 01.021; &; BM371 - FIX MAJOR MINDSET PROBLEM; "; B. S. MCCARTHY 28-JUL-86 01.03; /; BM372 - FIX MINOR MINDSET PROBLEM IN BM371;I;+) ; **-$DRFEA-TEST FEATURE MASK DIRECTIVER!;SE"; THIS DIRECTIVE WILL TEST FOR THE PRESENCE OF A SPECIFIED FEATURE.H#; $; DPB FORMAT:I%;."&; WD 00. -- DIC=177 , DPB SIZE=2'; WD 01. -- FEATURE TO TESTP(;3 ); INPUTS:*;.4+; R2=ADDRESS OF SECOND STATUS WORD O00zztccccF CURRENT TASK#,; R3=POINTER TO WORD 1 IN THE DPBT0-; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK-.; R5=ADDRESS OF THE TCB OF THE CURRENT TASK-/;. 0; OUTPUTS:1;202; C=0 IF DIRECTIVE WAS SUCCESSFULLY COMPLETED.;3; DIRECTIVE STATUS OF IS.SET 'D.RS22' IS RETURNED IF THED,4; CORRESPONDING FEATURE MASK BIT IS SET.;5; DIRECTIVE STATUS OF IS.CLR 'D.RS00' IS RETURNED IF THEI06; CORRESPONDING FEATURE MASK BIT IS NOT SET.7;358; IF A FEATURE VALUE IS SPECIFIED FOR WHICH THEREO69; IS NO FEATURE MASK WORD IS.CLR IS RETURNED WHICH7:; PRESUMABLY WOULD INDICATE THAT THE SUPPORT IS NOT5;; PRESENT.<;-=> .IF DF R$$FEA? @$DRFEA::5A MOV #$FMASK,R0 ;ASSUME TEST ON SYSTEM FEATURE MASK..B ;WORDS AS OPPOSED TO THE HARWARE FEATUREC ;MASK WORDS.(D MOV (R3),R1 ;GET FEATURE TO TEST FOR4E MOV #$FMEND-$FMASK,R3 ;GET # OF SYSTEM MASK WORDS%F TST R1 ;WAS IT A HARWARE FEATURE?K3G BPL 10$ ;IF PL NOT A HARDWARE FEATURE MASK TESTP7H MOV #$HFMSK,R0 ;POINT TO HARDWARE FEATURE MASK WORDSS6I MOV #$HFEND-$HFMSK,R3 ;GET # OF HARDWARE MASK WORDS0J NEG R1 ;NEGATE SPECIFIED FEATURE TO TEST FOR0K10$: DEC R1 ;NORMALIZE BIT VALUE TO BASE OF 01L MOV R1,R2 ;SAVE FOR OFFSET COMPUTATIONS LATERR7M BIC #^C<17>,R1 ;MASK OFF ALL BUT BIT IDENTIFIER BITS'N ASL R1 ;CONVERT IT TO A WORD OFFSET)O MOV $BTMSK(R1),R1 ;GET BIT TO TEST FORA6P ASH #-4,R2 ;COMPUTE OFFSET TO FEATURE WORD TO TEST Q ASL R2 ;*R CMP R2,R3 ;BEYOND LIMIT OF MASK WORDS?2S BHI 40$ ;IF HI YES, ASSUME SUPPORT NOT PRESENT3T ADD R2,R0 ;FORM ADDRESS OF FEATURE WORD TO TEST#U BIT R1,(R0) ;IS FEATURE PRESENT V BEQ 40$ ;IF EQ, NOW DRSTS D.RS22 ;RETURN IS.SET0#X40$: DRSTS D.RS00 ;RETURN IS.CLRUYZ .ENDC ;R$$FEA[\;+)]; **-$DRTFE-TEST TASK FEATURE DIRECTIVE^;RJ_; THIS DIRECTIVE WILL TEST FOR THE PRESENCE OF A SPECIFIED TASK FEATURE.`;AHa; (AT THE MOMENT, THIS DIRECTIVE CAN ONLY CHECK BITS IN T.STS -> T.ST4Eb; OF THE TCB. THE DIRECTIVE COULD BE EXPANDED TO CHECK OTHER BINARYOJc; TASK FEATURES, SUCH AS PRESENCE OR ABSENCE OF A PARTICULARS AST, ETC.)d;Re; DPB FORMAT:Rf; "g; WD 00. -- DIC=209., DPB SIZE=2h; WD 01. -- FEATURE TO TESTDi;D j; INPUTS:Nk;L4l; R2=ADDRESS OF SECOND STATUS WORD OF CURRENT TASK#m; R3=POINTER TO WORD 1 IN THE DPBH0n; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK-o; R5=ADDRESS OF THE TCB OF THE CURRENT TASKHp;R q; OUTPUTS:r;C0s; C=0 IF DIRECTIVE WAS SUCCESSFULLY COMPLETED.;t; DIRECTIVE STATUS OF IS.SET 'D.RS22' IS RETURNED IF THEU,u; CORRESPONDING FEATURE MASK BIT IS SET.;v; DIRECTIVE STATUS OF IS.CLR 'D.RS00' IS RETURNED IF THEI0w; CORRESPONDING FEATURE MASK BIT IS NOT SET.x;D5y; IF A FEATURE VALUE IS SPECIFIED FOR WHICH THEREO6z; IS NO FEATURE MASK WORD IS.CLR IS RETURNED WHICH7{; PRESUMABLY WOULD INDICATE THAT THE SUPPORT IS NOT5|; PRESENT.};-~ .IF DF R$$FEA9$DRTFE::MOV (R3),R1 ;GET FEATURE TO TEST FOR ; BM371O710$: DEC R1 ;NORMALIZE BIT VALUE TO BASE OF 0 ;**-2U1 MOV R1,R0 ;SAVE FOR OFFSET COMPUTATIONS LATERI7 BIC #^C<17>,R1 ;MASK OFF ALL BUT BIT IDENTIFIER BITSN' ASL R1 ;CONVERT IT TO A WORD OFFSETA) MOV $BTMSK(R1),R1 ;GET BIT TO TEST FORE6 ASH #-4,R0 ;COMPUTE OFFSET TO FEATURE WORD TO TEST ASL R0 ;@ CMP R0,#T.ST3-T.ST2 ;BEYOND FIRST THREE MASK WORDS? ; BM3710 BLOS 35$ ;IF LOS NO, OFFSET OK AS IS ;**-1< CMP R0,#T.ST3+2-T.ST2 ;BEYOND FOURTH MASK WORD? ; BM3719 BHI 40$ ;IF HI YES, ASSUME SUPPORT NOT PRESENT ;**-10@ ADD #T.ST4-,R0 ;ADJUST TO SECOND MASK WORD ; BM372>35$: ADD R0,R2 ;FORM ADDRESS OF FEATURE WORD TO TEST ;**-1# BIT R1,(R2) ;IS FEATURE PRESENTV BEQ 40$ ;IF EQ, NO DRSTS D.RS22 ;RETURN IS.SETP#40$: DRSTS D.RS00 ;RETURN IS.CLR .ENDC ;R$$FEA .END;ND FIRST THREE MASK WORDS? ; BM3710 BLOS 35$ ;IF LOS NO, OFFSET OK AS IS ;**-1< CMP R0,#T.ST3+2-T.ST2 ;BEYOND FOURTH MASK WORD? ; BM3719 BHI 40$ ;IF HI YES, ASSUME SUPPORT N00zzttt tfDATA .TITLE MTDRV2 .IDENT /05.08/1;47; COPYRIGHT (C) 1986 BY DIGITAL EQUIPMENT CORPORATIONe; ALL RIGHTS RESERVED.;a>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;D ; VERSION 05.08( ;. ; SCOTT G. DAVIS 9-JUL-74 ;; PREVIOUSLY MODIFIED BY: ;; P. J. BEZEREDI; D. N. CUTLER; S. G. DAVISr; C. A. D'ELIA ; B. LYONS; T. J. MILLER; F. L. STRAIGHT;+; MODIFIED BY:;R;;N-; PB122 -- RETURN IS.SUC FOR EOT ON READS. ;A7; TL069 -- CHECK THAT A CANCEL IS ISSUED BY THE TASK) ; WHICH ISSUED THE CURRENT OPERATIONN!;D0"; TL070 -- RETURN THE CORRECT BLOCK COUNT FOR#; IO.SPB AT EOV$;.%%; TL071 -- FIX BRANCH OUT OF RANGEC&;.%'; TL074 -- DO NOT LOG DATA OVERRUNM(;E,); TL075 -- RETURN EOV FOR IO.SPF, NOT EOT*;:+; CS001 -- TAPE DENSITY SUPPORT IDENTIFICATION IN U.CW3,;R4-; CS002 -- DEVICE NOT READY IF TAPE UNIT OFF LINE.;+/; CS003 -- BOT STATUS IF TAPE UNIT READYA0;$1; CS004 -- REMOVE REDUNDANT CODE,'2; S2.ACT NOT BEING RESET IN S.ST2.S3;H/4; CS005 -- IO.STC/IO.SMO 1600BPI NOT ALLOWEDT)5; ALLOW BAD TAPE READ ERROR RECOVERYT6;07; CS006 -- CORRECT CS003; BOT STATUS VALID IF,8; TAPE UNIT READY .OR. ENDING OPERATION9; @9; CS007 -- HANDLE CALL FOR CONTROLLER POWER FAIL (C BIT SET).9;I:;P;;I(<; TM11 MAGNETIC TAPE CONTROLLER DRIVER=;I>; MACRO LIBRARY CALLS ?;I,@ .MCALL HWDDF$,PKTDF$,ABODF$,CLKDF$,UCBDF$ A HWDDF$ B PKTDF$0 C ABODF$E D CLKDF$CE UCBDF$ ;DEFINE UCB OFFSETSEFGH;I; EQUATED SYMBOLSOJ;IK'LUS.ABO=1 ;ABORT IN PROGRESS - U.STST4MUS.BSP=2 ;INTERNAL BACKSPACE IN PROGRESS - U.STS NUS.PWF=10 ;POWER FAIL STATUSORETRY=12 ;RETRY COUNTGPQ;NR; REGISTER BIT SYMBOLSS;LTUCS.GO=1 ;GO#VCS.EXM=60 ;EXTENDED MEMORY BITSWCS.IE=100 ;INTERRUPT ENABLE $XCS.RDY=200 ;CONTROLLER READY BITYCS.EVN=4000 ;EVEN PARITYZCS.CLR=10000 ;POWER CLEARF%[CS.DN5=20000 ;556 BPI DENSITY BIT%\CS.DN8=40000 ;800 BPI DENSITY BIT]^DS.TUR=1 ;TAPE UNIT READY_DS.RWS=2 ;REWINDINGN`DS.HWL=4 ;WRITE LOCKaDS.SDN=10 ;SETTLE DOWN bDS.7CH=20 ;UNIT IS 7 CHANNEL cDS.BOT=40 ;BEGINNING OF TAPEdDS.MOL=100 ;MEDIUM ON LINEeDS.BTE=400 ;BAD TAPE ERROR$fDS.RLE=1000 ;RECORD LENGTH ERROR%gDS.EOT=2000 ;END OF TAPE DETECTEDEhDS.BGL=4000 ;BUS GRANT LATERiDS.PAE=10000 ;PARITY ERROR+jDS.CRE=20000 ;CYCLICAL REDUNDANCY ERRORS#kDS.TM=40000 ;TAPE MARK DETECTED"lDS.ILG=100000 ;ILLEGAL COMMANDm*nRD.GAP=10000 ;GAP SHUTDOWN IN PROGRESS3oRD.LPC=40000 ;READ LPC CHARACTER AND RTTBL FLAG pq; Jr; MAG TAPE STATUS REGISTER BIT DEFINITIONS (SENSE AND SET CHARACTERISTICs;Lt2uM.PEOV=100000 ;TAPE PAST LOGICAL END OF VOLUME/vM.AEOV=40000 ;TAPE AT LOGICAL END OF VOLUME0wM.BOT=20000 ;TAPE AT BOT"xM.7CH=10000 ;UNIT IS 7 CHANNEL2yM.1600=4000 ;TAPE DENSITY CONTROL - '0'=800BPI#zM.HWL=2000 ;HARDWARE WRITE LOCK !{M.RWD=1000 ;UNIT IS REWINDING0'|M.SER=400 ;SELECT ERROR HAS OCCURED 6}M.IXG=200 ;INHIBIT WRITE WITH EXTENDED INTERRECORD"~M.SWL=100 ;SOFTWARE WRITE LOCK0M.EOF=40 ;LAST COMMAND ENCOUNTERED TAPE MARK*M.EOT=20 ;LAST COMMAND ENCOUNTERED EOTM.EVN=10 ;EVEN PARITYL-M.CDM=4 ;CORE DUMP MODE (7 CHANNEL ONLY)A&M.200=2 ;200 BPI (7 CHANNEL ONLY)&M.556=1 ;556 BPI (7 CHANNEL ONLY)2USRBTS=317 ;STATUS BITS CONTROLLED BY THE USERFNEWBTS=M.PEOV!M.BOT!M.EOF!M.EOT ;STATUS BITS TO BE SET BEFORE $IODON;= ; COMMANDS;  RWU=101 ;REWIND AND OFFLINERED=103 ;READWRT=105 ;WRITE0WEF=107 ;WRITE END-OF-FILE=SPF=111 ;SPACE FORWARDDSPR=113 ;SPACE REVERSET%WTE=115 ;WRITE WITH EXTENDED GAP;RWD=117 ;REWIND/U.SPC = U.VCB+2 ;SPACING COUNT, RDBLK TEMP.;;7; LOCAL MACROS;=;;=; THE FOLLOWIN00zztccccG MACRO DEFINES ENTRIES IN THE FUNCTION TABLEO;B0.MACRO DFENT COM,TIMOUT,PWF,OPCODE,TYPE,INTADD .WORD COM .BYTE PWF,TIMOUT .BYTE TYPE,OPCODE .WORD INTADD0 .ENDM DFENTD;; LOCAL DATA;@; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);C=; DIAGNOSTIC FUNCTIONS USE BITS 14-15 OF RTTBL AS FLAGS FORI$; INTERRUPT AND FUNCTION HANDLING.)RTTBL: .BLKW T$$M11 ;ERROR RETRY COUNT *SPTBL: .BLKW T$$M11 ;FOR SPACE CHECKING:INTADD: .BLKW T$$M11 ;CURRENT INTERRUPT SERVICE ADDRESS;!; LEGAL FUNCTION DISPATCH TABLEE;,:LGFCN: DFENT IO.RLB,8.,0,RED,0,RDBLK ;READ LOGICAL BLOCK5 DFENT IO.WLB,6.,0,WRT,0,WRBLK ;WRITE LOGICAL BLOCK 1 DFENT IO.EOF,2.,0,WEF,0,WREOF ;WRITE TAPE MARKX( DFENT IO.RWD,2.,1,RWD,0,REWND ;REWIND6 DFENT IO.RWU,2.,1,RWU,0,REWND ;REWIND THEN OFF-LINE- DFENT IO.SPB,8.,0,SPF,1,SPCBK ;SPACE BLOCK:, DFENT IO.SPF,8.,0,SPF,2,SPCFL ;SPACE FILE1 DFENT IO.STC,0,-1,0,-1,-1 ;SET CHARACTERISTICS$3 DFENT IO.SEC,0,-1,1,-1,-1 ;SENSE CHARACTERISTICS; DFENT IO.SMO,0,1,-1,-1,-1 ;MOUNT AND SET CHARACTERISTICST#ENDFCN=. ;END OF FUNCTION TABLEO;E; DRIVER DISPATCH TABLE;; * DDT$ MT,T$$M11 ;GENERATE DISPATCH TABLE;+4; **-MTINI-TM11 MAGNETIC TAPE CONTROLLER INITIATOR;TJ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUEI; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THEIJ; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN AJ; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IJ; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER@; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.;+ ; INPUTS:I; <; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;E ; OUTPUTS:;OD; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAD; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OP; ATION IS INITIATED.B;- .ENABL LSBD9MTINI: GTPKT$ MT,T$$M11 ;GET NEXT I/O PACKET TO PROCESSL; 3; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:T;X); R1=ADDRESS OF THE I/O REQUEST PACKET.N/; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.S; R3=CONTROLLER INDEX.+; R4=ADDRESS OF THE STATUS CONTROL BLOCK.<; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;SF; TM11 MAGNETIC TAPE FUNCTION INDEPENDENT I/O REQUEST PACKET FORMAT:;E$; WD. 00 -- I/O QUEUE THREAD WORD.2; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.7; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK.HB; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.D; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR TASK HEADED; WD. 05 -- I/O FUNCTION CODE (IO.RLB/IO.RWD/IO.SPB/IO.SPF/IO.EOF)2; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.2; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.D; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140005; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.V;L; MOV #$MTCLK,S.MTCK+C.SUB(R4) ;SET ADDR OF CLOCK ROUTINEK% CLR S.FRK+2(R4) ;INIT FORK PC WORD / MOV #LGFCN,R2 ;POINT TO LEGAL FUNCTION TABLET* CLRB RTTBL+1(R3) ;CLEAR DIAGNOSTIC FLAG& MOV I.FCN(R1),R0 ;GET FUNCTION CODE- BITB #IQ.UMD,R0 ;DIAGNOSTIC FUNCTION CALL?6 BEQ 20$ ;IF EQ NOI9 MOV #100000,RTTBL(R3) ;STOP RETRIES AND SET DIAG. FLAGU7 CMP #IO.LPC!IQ.UMD,R0 ;READ LPC CHARACTER FUNCTION?  BNE 15$ ;IF NE NO, BIS #RD.LPC,RTTBL(R3) ;SET LPC READ FLAG2 MOV #IO.RLB!IQ.UMD,R0 ;CONVERT TO READ LOGICAL' MOV R0,I.FCN(R1) ;SAVE FOR LATER USE2/15$: BIC #IQ.UMD,R0 ;CLEAR FOR FUNCTION CHECK 520$: BICB #IQ.X,R0 ;CLEAR IQ.X WILL BE TESTED LATERA  CMP R0,(R2)+ ;FUNCTION MATCH? BEQ 35$ ;IF EQ YES(  ADD #6,R2 ;POINT TO NEXT TABLE ENTRY#  CMP R2,#ENDFCN ;AT END OF TABLE?0  BNE 20$ ;IF NE NOI  BR 40$ ;ILLEGAL FUNCTION#  JMP 230$ ;FINISH IN COMMON CODEE;N; FUNCTION CODE MATCH 00zzttt tfDATAFOUNDB;D035$: BITB #US.PWF,U.STS(R5) ;POWER FAIL OCCUR? BEQ 45$ ;IF EQ NOD TSTB (R2) ;LEGAL FUNCTION? BMI 45$ ;IF MI YES' BNE 43$ ;IF NE THIS IS A BETTER ONEC40$: MOV #IE.IFC&377,R0 ;NO  JMP 230$ ;INFORM THE USERC443$: BICB #US.PWF,U.STS(R5) ;ALLOW ALL FUNCTIONS545$: MOV (R2)+,S.CTM(R4) ;SET UP FOR PROPER TIMEOUTD% CLRB S.CTM(R4) ;CLEAR OUT PWF INFO $ CLR SPTBL(R3) ;RESET SPACING FLAG" CLR U.SPC(R5) ;NOT SPACING FILE+ TSTB (R2)+ ;DETERMINE TYPE OF OPERATION&  BPL 50$ ;IF PL NOT STATUS FUNCTION! JMP 190$ ;STATUS FUNCTIONI+"50$: BEQ 90$ ;IF EQ NON-SPACING FUNCTIONB#$;I1%; SPACING FUNCTION DEPENDENT I/O PACKET FORMAT:&;:B'; WD. 12 -- SPACING COUNT (POSITIVE=FORWARD, NEGATIVE=BACKWARD).(; WD. 13 -- NOT USED.L); WD. 14 -- NOT USED.M*; WD. 15 -- NOT USED.P+; WD. 16 -- NOT USED.C<,; WD. 17 -- RELOCATON BIAS OF DIAGNOSTIC REG. BLK. ADDRESSA-; WD. 20 -- DIAG. REG. BUFFER ADDRESS (REAL OR DISPL. + 140000)E.; /70 BISB #S3.SIP,S.ST3(R4) ;SET POSITIONING IN PROGRESS?1 MOV U.BUF(R5),I.PRM+4(R1) ;MOVE SPACING COUNT TO COMMON PLACF/2 CLR U.BUF(R5) ;RESET TO TAKE ON OPCODE BELOWT?3 MOV I.PRM+4(R1),U.CNT(R5) ;MOVE SPACING COUNT TO COMMON PLAC=(4 BNE 60$ ;IF NE SOME SPACING REQUIRED15 CLR I.PRM+4(R1) ;CLEAR COUNT FOR STATUS RETURN-!6 JMP 220$ ;NO SPACING REQUIREDD#760$: BMI 65$ ;IF MI SPACE REVERSI!8 BIT #M.AEOV,U.CW2(R5) ;AT EOV? 9 BEQ 70$ ;IF EQ NO - PROCEEDR#: MOV #IE.EOV&377,R0 ;STILL AT EOV1; CLR I.PRM+4(R1) ;CLEAR COUNT FOR STATUS RETURNS< JMP 230$ ;TELL THE USERR=65$: ;REFERENCE LABEL+> NEG U.CNT(R5) ;CONVERT TO POSITIVE COUNTN!? NEG I.PRM+4(R1) ;THIS ONE, TOOU:@ BIS #2,U.BUF(R5) ;CHANGE SPACE FORWARD TO SPACE REVERSE1A70$: CMPB -1(R2),#1 ;SPACE FILE OR SPACE BLOCK?AB BEQ 80$ ;IF EQ SPACE BLOCK8C MOV U.CNT(R5),U.SPC(R5) ;SAVE COUNT OF FILES TO SPACE-D NEG U.SPC(R5) ;SET UP FOR FINAL ACCOUNTING*E MOV #-1,U.CNT(R5) ;SET UP FOR BIG SPACE2F80$: MOV U.CNT(R5),SPTBL(R3) ;SAVE SPACING COUNT1G NEG SPTBL(R3) ;MAKE IT MATCH REGISTER CONTENTSU'H BR 110$ ;SKIP SOME CHECKS AND BIC'SUIJ;;<K; READ/WRITE LOGICAL FUNCTION DEPENDENT I/O PACKET FORMAT:L;B-M; WD. 12 -- RELOCATION BIAS OF DATA BUFFER.R"N; WD. 13 -- DATA BUFFER ADDRESS./O; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.BP; WD. 15 -- NOT USED.SQ; WD. 16 -- NOT USED.ER; WD. 17 -- NOT USED.R<S; WD. 20 -- RELOCATON BIAS OF DIAGNOSTIC REG. BLK. ADDRESSAT; WD. 21 -- DIAG. REG. BUFFER ADDRESS (REAL OR DISPL. + 140000)U;GIV; NO FUNCTION DEPENDENT PARAMETERS ARE REQUIRED FOR REWIND OR WRITE EOF W;IXY90$: ;REF LABELZ[\ .IF DF M$$EXT].^ CALL $STMAP ;SET UP UNIBUS MAPPING ADDRESS_` .ENDCab9c CMPB -2(R2),#2 ;WRITE EOF, REWIND OR REWIND & OFFLINE?B.d BEQ 100$ ;IF EQ YES - SEE IF WRITELOCK SETe CMPB (R2),#WRT ;WRITE? f BNE 110$ ;IF NE NO0g MOV #IE.SPC&377,R0 ;ASSUME PARAMETER PROBLEMS#h CMP I.PRM+4(R1),#14. ;TOO SHORT?Ii BLO 163$ ;IF LO YESR!j BR 105$ ;SKIP EXMEM BIT CLEAR ,k100$: CLR U.BUF(R5) ;NOTHING THERE FOR WEF7l BISB #S3.SIP,S.ST3(R4) ;SET POSITIONING IN PROGRESSm CMPB (R2),#WEF ;WRITE EOF?1n BNE 110$ ;IF NE NO, SKIP CHECK FOR WRITE LOCK8o105$: MOV #IE.WLK&377,R0 ;ASSUME (SOFTWARE) WRITE LOCK p BIT #M.SWL,U.CW2(R5) ;LOCKED?q BNE 163$ ;IF NE YESKEr110$: BISB (R2)+,U.BUF(R5) ;PICK UP FUNCTION CODE FROM COMMAND TABLC5s MOV (R2),INTADD(R3) ;SET INITIAL INTERRUPT ADDRESS#&t TST RTTBL(R3) ;DIAGNOSTIC FUNCTION?%u BMI 120$ ;IF MI YES, STOP RETRIES,v MOV #RETRY,RTTBL(R3) ;SET UP RETRY COUNTS/w120$: CALL SELECT ;SELECT THE REQUIRED DRIVEO+x BCS SELERR ;IF CS SELECT ERROR OCCURREDE4y MOV U.CW2(R5),R1 ;PICK UP DRIVE'S CHARACTERISTICS'z BIT #M.EVN,R1 ;EVEN PARITY REQUIRED?T{ BEQ 140$ ;IF EQ NO4| BIS #CS.EVN,U.BUF(R5) ;SET BIT IN STATUS REGISTER>}140$: BIS #CS.DN5!CS.DN8,U.BUF(R5) ;ASSUME 9-CHANNEL, 800BPI"~ BIT #M.7CH,R1 ;7-CHANNEL DRIVE? BEQ 170$ ;IF EQ NO! BIT #M.CDM,R1 ;CORE DUMP 00zztccccMODE? BNE 170$ ;IF NE YESO BIT #M.556,R1 ;556 BPI? BNE 150$ ;IF NE YESN/ BIC #CS.DN5,U.BUF(R5) ;RESET BIT FOR COMMANDV BIT #M.200,R1 ;200 BPI? BEQ 170$ ;IF EQ NO0150$: BIC #CS.DN8,U.BUF(R5) ;RESET COMMAND BIT  BR 170$;VE; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING TERMINATED.;C; IF THE OPERATION WAS DIAGNOSTIC, THE QIO REQUEST IS TERMINATED.UC; TIMEOUTS ARE USUALLY CAUSED BY POWERFAILURE BUT MAY ALSO BE THE H; RESULT OF HARDWARE CONSIDERATIONS. IN PARTICULAR, A LENGTHY SPACING<; OPERATION MAY RESULT IN A TIMEOUT WHICH WILL BE IGNORED.;53MTOUT: MOV S.CSR(R4),R2 ;;;PICK UP ADDRESS OF CSR & BITB #US.ABO,U.STS(R5) ;;;ABORTING? BEQ 152$ ;;;IF EQ NO1 BIC #M.RWD,U.CW2(R5) ;;;REWIND NOT IN PROGRESSO BR 162$ ;;;TERMINATE152$: ;;;REFERENCE LABEL, MOVB S.CON(R4),R3 ;;;FETCH CONTROLLER NO.% BIT #M.RWD,U.CW2(R5) ;;;REWINDING?U BNE 155$ ;;;IF NE YESR) MOV SPTBL(R3),R0 ;;;SPACE IN PROGRESS?A BEQ 154$ ;;; IF EQ THEN NO% CMP R0,2(R2) ;;;IS THE TAPE BLANK?  BNE 153$ ;;; IF NE THEN NO& CALL $DTOER ;;; LOG DEVICE TIMEOUT+ BR 161$ ;;; EXIT WITH IE.DNR ERROR CODEU153$: ;;; REF. LABEL?8 MOV 2(R2),SPTBL(R3) ;;;SAVE VALUE FOR NEXT COMPARISON- MOVB S.ITM(R4),S.CTM(R4) ;;;RESUME TIMEOUT" RETURN ;;;THAT IS ALL FOR NOW+154$: CALL $DTOER ;;; LOG DEVICE TIMEOUTB- BCS 161$ ;IF CS ABORT DIAGNOSTIC FUNCTION 1155$: BIC #CS.IE,(R2) ;;;CLEAR INTERRUPT ENABLEG MTPS #0 ;;;ALLOW INTERRUPTSE2 BIT #M.SER,U.CW2(R5) ;WAS THERE A SELECT ERROR? BEQ 160$ ;IF EQ NO) BIC #M.SER,U.CW2(R5) ;RESET STATUS BIT# BIT #M.RWD,U.CW2(R5) ;REWINDING?C1 BEQ 120$ ;IF EQ NO - REISSUE ORIGINAL COMMANDL0 BIT #DS.MOL,-2(R2) ;IS THE DRIVE ON-LINE NOW? BEQ SELERR ;IF EQ NO/ MOVB #RWD-CS.IE,(R2) ;START THE REWIND AGAIN BR 172$ ;START UP TIMEOUTC(160$: BIT #M.RWD,U.CW2(R5) ;REWINDING? BNE 164$ ;IF NE YES 5161$: MOV #IE.DNR&377,R0 ;INDICATE DEVICE NOT READY 6162$: CALL MTDINT ;PASS DIAGNOSTIC DEVICE REGISTERS& BIS #CS.CLR,(R2) ;RESET CONTROLLER%163$: JMP 230$ ;REPORT FATAL ERROR 1164$: BIT #DS.MOL,-2(R2) ;EVERYTHING COPASETIC?1 BEQ SELERR ;IF EQ NO& BIT #DS.BOT!DS.RWS,-2(R2) ;TAPE OK? BNE 165$ ;IF NE OK:SELERR: MOV #IE.DNR&377,R0 ;NOT READY - IF TAPE OFF LINE& TST RTTBL(R3) ;DIAGNOSTIC FUNCTION?0 BMI 230$ ;IF MI YES, STOP THE SELECT MESSAGE* BITB #IQ.X,I.FCN(R1) ;SUPPRESS RETRIES?( BNE 230$ ;IF NE YES SKIP SELECT MSG.. TST U.ACP(R5) ; ACP WANTS RETURN IMMEDIATE?. BNE 230$ ; IF NE YES EXIT DEVICE NOT READY- BIS #M.SER,U.CW2(R5) ;SET SELECT ERROR BIT " DECB S.STS(R4) ;TIME FOR A MSG? BNE 172$ ;IF NE NO, MOV #T.NDSE,R0 ;SET UP TO DELIVER MESSAGE& MOVB #15.,S.STS(R4) ;SET UP TIMEOUT! CALL $DVMSG ;SEND THE MESSAGEP BR 172$ ;SET THE TIMOUT;,165$: BIT #DS.TUR,-2(R2) ;REWIND COMPLETE? BEQ 172$ ;IF EQ NO) BIT #DS.BOT,-2(R2) ;DID WE GET TO BOT??) BNE 175$ ;IF NE YES - REWIND COMPLETE(170$: BIT #M.RWD,U.CW2(R5) ;REWINDING? BEQ 177$ ;IF EQ NO+172$: MOVB #1,S.CTM(R4) ;SET UP A TIMEOUT.  RETURN ;THAT IS ALL FOR NOW(175$: BIS #M.BOT,U.CW2(R5) ;SAY AT BOT177$: ;REF LABEL# .IF DF M$$EXT& CMPB #SPF,U.BUF(R5) ;SPACE FORWARD?) BEQ 178$ ;IF EQ YES, UMR'S NOT NEEDED& CMPB #SPR,U.BUF(R5) ;SPACE FORWARD?) BEQ 178$ ;IF EQ YES, UMR'S NOT NEEDED1 MOV R2,-(SP) ;SAVE R2' CALL $MPUBM ;MAP UNIBUS TO TRANSFER1 MOV (SP)+,R2 ;RESTORE R2L .ENDC9178$: CMP (R2)+,(R2)+ ;POINT TO MEMORY ADDRESS REGISTERO. MOV U.BUF+2(R5),(R2) ;SET UP BUFFER ADDRESS2 MOV U.CNT(R5),-(R2) ;SET UP BYTE COUNT REGISTER  NEG (R2) ;NEED 2S COMPLEMENTB180$: MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNT9 BIC #M.AEOV!M.SER!M.RWD,U.CW2(R5) ;RESET VARIOUS FLAGSR& BICB #US.BSP,U.STS(R5) ;RESET FLAGS1 BIT #RD.LPC,RTTBL(R3) ;READ LPC CHAR FUNCTION?V BEQ 185$ ;IF EQ NO/ BIS #RD.LPC,6(R2) ;SET LPC READ IN MTRD REG.R)185$: CA00zzttt tfDATALL $BMSET ;SET I/O ACTIVE FLAG,- MOV U.BUF(R5),-(R2) ;INITIATE THE FUNCTIONV RETURN ;DONES;F9; CANCEL I/O OPERATION IS A NOP FOR TM11 MAGNETIC TAPEST;0MTCAN: CMP I.TCB(R0),R1 ;CANCEL FOR THIS TASK? BNE 111$ ;BRANCH IF NOTE4 BISB #US.ABO,U.STS(R5) ;FLAG THE ABORT CONDITION111$: RETURN;J; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUJ; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDIT5; THAT COULD EXIST IN RESTARTING THE I/O OPERATION.,;M9MTPWF: BCS 112$ ;IF CS, CONTROLLER POWER FAIL. ;CS0079 BISB #US.PWF,U.STS(R5) ; ELSE, UNIT POWER FAIL ;CS007I' ; DISALLOW NORMAL QIO'S. ;CS007)5 CALL DRVSTS ;INDICATE TAPE DENSITY SUPPORT ;**-1E112$: RETURN ;CS007 ;**-1;N; STATUS FUNCTION PROCESSING; 190$: ;REFERENCE LABEL # MOV R2,-(SP) ;SAVE TABLE POINTERM-  CALL SELECT ;SET BOT, HWL, AND 7CH STATUSO  MOV (SP)+,R2 ;RESTORE POINTER:  MOV U.CW2(R5),I.PRM+4(R1) ;ASSUME SENSE CHARACTERISTICS+  TSTB (R2)+ ;DETERMINE FUNCTION REQUIRED0'  BEQ 210$ ;IF EQ SET CHARACTERISTICST+ BPL 220$ ;IF PL "SENSE CHARACTERISTICS"L$201$: BIT #M.BOT,U.CW2(R5);AT BOT? BNE 210$ ;IF NE, YES. (203$: MOV #IE.FHE&377,R0 ;FATAL ERROR, BR 230$ ; END REQUEST.5210$: BIT #M.1600,U.BUF(R5) ;TRYING TO SET 1600BPI? ' BNE 203$ ;IF NE, YES - NOT ALLOWED.E2 BIC #USRBTS,U.CW2(R5) ;PREPARE TO SET NEW BITS.= BIC #^C,U.BUF(R5) ;LEAVE ONLY USER CONTROLLED BITS;+ BIS U.BUF(R5),U.CW2(R5) ;NEW STATUS WORD;; ; NO SPACING REQUIREDQ; <220$: MOV #IS.SUC&377,R0 ;SET SUCCESSFUL COMPLETION STATUS-230$: MOV S.CSR(R4),R2 ;PICK UP CSR ADDRESS= BIC #CS.IE!CS.EXM,(R2) ;CLEAR INT. ENABLE AND EX. MEM BITSR-  CLR 2(R2) ;ASSURE PROPER VALUE FOR RETURNM! JMP 540$ ;CLEAN UP AND EXIT0"#$;+6%; **-$MTINT-TM11 MAGNETIC TAPE CONTROLLER INTERRUPTS&;-'7( INTSE$ MT,PR5,T$$M11 ;;;GENERATE INTERRUPT SAVE CODE .) MOV U.SCB(R5),R4 ;;;RETRIEVE ADDRESS OF SCB-* TST S.FRK+2(R4) ;;;HAVE WE FORKED ALREADY?I0+ BNE 300$ ;;;IF NE YES, RETURN FROM INTERRUPT), CALL $FORK ;;;CREATE A SYSTEM PROCESS )-240$: MOV U.SCB(R5),R4 ;GET SCB ADDRESSB5. MOV S.CSR(R4),R2 ;PICK UP COMMAND REGISTER ADDRESST</ BIT #DS.TUR!DS.RWS!DS.ILG!DS.EOT!DS.BOT,-(R2) ;UNIT DONE?0 BNE 250$ ;IF NE YES=1 CMPB U.BUF(R5),#RWU ;WAS IT A REWIND AND OFFLINE FUNCTION?P.2 BEQ 220$ ;IF EQ YES, COMPLETE WITH SUCCESS,3 MOV R4,R0 ;GET ADDR OF CLOCK QUEUE BLOCK4 ADD #S.MTCK,R0 ;S5 CLR R1 ;SET UP HIGH TICKSW 6 MOV #1,R2 ;TIMEOUT UNTIL TUR&7 MOV #C.SYST,R4 ;TYPE OF CLOCK ENTRY8 CALLR $CLINS ;TIMEOUTE9#:$MTCLK:: ;REF LABEL FOR TIMEOUT ;(< MOV C.TCB(R4),R5 ;RESTORE UCB ADDRESS= BR 240$ ;SEE IF UNIT READY1>250$: MOVB S.CON(R4),R3 ;PICK UP CONTROLLER NO.?1? BIT #DS.MOL,(R2)+ ;IS THE DRIVE STILL ON-LINE?;@ BNE 260$ ;IF NE YESN*A JMP 161$ ;ISSUE "DEVICE-NOT-READY" MSGBB260$: BIC #CS.IE!CS.EXM,(R2) ;CLEAR INT. ENABLE AND EX.MEM BITS1C MOVB S.ITM(R4),S.CTM(R4) ;RESET TIMEOUT COUNT.D CLR S.FRK+2(R4) ;ALLOW INTERRUPT PROCESSING7E MOV -2(R2),R1 ;GET CONTENTS OF DRIVE STATUS REGISTER:F BITB #US.BSP,U.STS(R5) ;INTERNAL BACKSPACE IN PROGRESS?.G BNE 280$ ;IF NE YES - CALL SERVICE ROUTINE>H270$: MOV #IS.SUC&377,R0 ;ASSUME SUCCESS FOR VARIOUS REASONSI TST (R2) ;ANY ERRORS?EJ BMI 280$ ;IF MI YES2K TST U.SPC(R5) ;SPACING FILE?S0L BNE 280$ ;IF NE, YES. TREAT AS ERROR ANYWAY.8M CMPB (R2),#RWD+CS.RDY-CS.GO-CS.IE ;WAS THAT A REWIND?N BNE 275$ ;IF NE NO'O BIS #M.RWD,U.CW2(R5) ;SET STATUS BIT P275$: JMP 500$ ;SUCCESS!!+Q280$: TST RTTBL(R3) ;DIAGNOSTIC FUNCTION?ER BMI 290$ ;IF MI YES(-S BIT #DS.ILG!DS.CRE!DS.PAE!DS.BGL!DS.BTE,R10'T ; ANY ERRORS IN STATUS REG (MTS)?7U BEQ 290$ ; IF EQ THEN NO"V CALL $DVERR ; LOG DEVICE ERROR4W290$: CALL @INTADD(R3) ;CALL THE INTERRUPT ROUTINE.X BIS #S2.ACT,S.ST2(R4) ;SET I/O ACTIVE FLAG/Y MOV (SP)+,INTADD(R3) ;SAVE INTERRUPT 00zztccccADDRESSS3Z300$: RETURN ;WAIT FOR END OF NEXT COMMAND STEPF[\;]; WRITE LOGICAL FUNCTION^; _*`WRBLK: BIT #DS.TM,R1 ;DID WRITE SEE EOF?a BNE 320$ ;IF NE YESCbc;d; WRITE TAPE MARK FUNCTIONe;If)gWREOF: BIT #34404,R1 ;ANY OTHER ERRORS? *h BEQ 325$ ;IF EQ NO - REALLY SUCCESSFUL(i MOV #IE.WLK&377,R0 ;ASSUME WRITE-LOCKj BIT #DS.HWL,R1 ;WRITE LOCK?k BNE 325$ ;IF NE YESU$l BIT #34400,R1 ;RECOVERABLE ERROR?m BNE 320$ ;IF NE YESPno;(p; REWIND FUNCTIONSq;Sr(sREWND: MOV #IE.FHE&377,R0 ;FATAL ERRORt BR 325$ ; .. CONT u9v320$: MOV #IE.BBE&377,R0 ;ASSUME BAD TAPE OR EQUIVALENTR%w TSTB U.CW2(R5) ;SHOULD WE REWRITE?x BMI 325$ ;IF MI, NO.$y BIT #2,@R2 ;IS THIS A WRITE EOF?z BNE 420$ ;IF NE YESS>{ BIS #WTE-WRT,U.BUF(R5) ;DO WRITE WITH EXTENDED GAP FROM NOW| BR 420$ ;DO THE OPERATIONT};H*~325$: BR 490$ ;GO FINISH UP INT SERVICE;B; SPACE FILE FUNCTION ;?.SPCFL: BIT #DS.TM,R1 ;TAPE MARK ENCOUNTERED? BNE 350$ ;IF NE YES:1 MOV U.SPC(R5),2(R2) ;SOMETHING ELSE STOPPED USC;; SPACE BLOCK FUNCTION;U SPCBK: BIT #DS.BOT,R1 ;AT BOT?5 BNE 490$ ;IF NE YES, NOT AN ERROR, BUT NEED STACK BIT #DS.TM,R1 ;EOF? BEQ 340$ ;IF EQ NO( CALL CHKEOV ;SEE IF AT END OF VOLUME BCC 410$ ;IF CC NOT FOUNDM! BR 360$ ;POSITION TAPE AT EOVT5340$: BIT #DS.BTE!DS.EOT,R1 ;BAD TAPE ERROR OR EOT?B* BNE RDBLK ;IF NE YES - NOT RECOVERABLE BR REWND ;FATALE;350$: CALL CHKEOV ;DID TAPE REACH LOGICAL END OF VOLUME?R% BCC 370$ ;IF CC NO, TRY NEXT FILE(360$: CALL BSPACE ;BACKSPACE THE TAPE$ CALL @(SP)+ ;WAIT FOR COMPLETION= MOV #IE.EOV&377,R0 ;INFORM USER THAT EOV HAS BEEN DETECTED1( BIS #M.AEOV,U.CW2(R5) ;SET STATUS BIT! BR 380$ ;FIX COUNT AND RETURNB1370$: INC U.SPC(R5) ;ANOTHER TAPE MARK DETECTEDA BNE 390$ ;IF NE NOT DONE/380$: MOV U.SPC(R5),2(R2) ;SET UP FINAL COUNTK/ MOV S.PKT(R4),R3 ;GET THE I/O PACKET ADDRESSA- MOV I.FCN(R3),-(SP) ;GET THE FUNCTION CODEG+ BIC #IQ.UMD!IQ.X,(SP) ;CLEAR EXTRA BITS # CMP #IO.SPB,(SP)+ ;SPACE BLOCKS?;& BNE 385$ ;NO -- LEAVE STATUS ALONE+ CLR I.PRM+4(R3) ;CLEAR FOR STATUS RETURNR CLR 2(R2) ;... 385$: BR 490$ ;RETURN TO USER*390$: BIS #M.EOF,U.CW2(R5) ;I SAW AN EOF- MOV #1,2(R2) ;SET RECORD COUNT FOR SPACINGT) MOV 2(R2),SPTBL(R3) ;SAVE RECORD COUNT : ADD #-CS.RDY+CS.GO+CS.IE,(R2) ;REISSUE SPACING COMMAND$ CALL @(SP)+ ;WAIT FOR COMPLETION BR SPCFL ;SEE WHAT HAPPENEDE;C; READ LOGICAL FUNCTIONI;S,RDBLK: MOV #IE.BBE&377,R0 ;ASSUME BAD TAPE  BIT #DS.BTE,R1 ;BAD TAPE/OPI? BEQ 405$ ;IF EQ, NO.! CMP 2(R2),U.CNT(R5) ;BAD TAPE?R BNE 420$ ;IF NE, YES.$ BR REWND ; ELSE - OPI.7405$: MOV #IE.DAO&377,R0 ;ASSUME RECORD LENGHT ERROR.2$ BIT #DS.RLE,R1 ;RECORD LTH ERROR? BNE 490$ ;IF NE YESR#410$: MOV #IE.EOF&377,R0 ;TRY EOFS BIT #DS.TM,R1 ;EOF DETECTED?D BNE 490$ ;IF NE YESO/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESS FOR EOT'S BIT #DS.EOT,R1 ;EOT?F BNE 490$ ;IF NE NO( MOV #IE.VER&377,R0 ;ASSUME DATA ERROR420$: MOV R1,-(SP) ;SAVE R1?0 MOV S.PKT(R4),R1 ;RETREIVE I/O PACKRT ADDRESS, BITB #IQ.X,I.FCN(R1) ;RETRIES SUPPRESSED? BEQ 430$ ;IF EQ NO CONTINUEO MOV (SP)+,R1 ;RESTORE R1R BR 490$ ;EXIT 430$: MOV (SP)+,R1 ;RESTORE R1( DECB RTTBL(R3) ;DECREMENT RETRY COUNT BLE 490$ ; IF LE NO2 MOV INTADD(R3),U.SPC(R5) ;SAVE ORIGINAL ADDRESS# CALL BSPACE ;BACKSPACE THE TAPEU# CALL @(SP)+ ;WAIT FOR BACKSPACEE0 MOV U.SPC(R5),INTADD(R3) ;RESTORE INT ADDRESS4 CLR U.SPC(R5) ;RESET TO INDICATE NOT SPACING FILE! TST (SP)+ ;CLEAN UP THE STACKA JMP 177$ ;RETRY ;C/; END OF INTERRUPT SERVICE ROUTINE PROCESSINGO;I&490$: TST (SP)+ ;CLEAN UP THE STACK+500$: MOV R5,R3 ;MAKE A COPY OF UCB BASE3 ADD #U.CW2,R3 ;COMPUTE OFFSET TO MAG TAPE STATUS & MOV (R3),-(SP) ;SAVE CURRENT STATUS7 BIC #NEWBTS,(R3) ;CLEAR STATUS BITS TO BE DETERMINEDT BIT #DS00zzttt tfDATA.BOT,R1 ;AT BOT? BEQ 510$ ;IF EQ NO" BIS #M.BOT,(R3) ;SET STATUS BIT!510$: BIT #DS.TM,R1 ;TAPE MARK?D! BEQ 520$ ;IF EQ NOT TAPE MARK+; CMPB (R2),#SPR+CS.RDY-CS.IE-CS.GO ;WAS THAT A BACKSPACE?N4 BEQ 520$ ;IF EQ YES - DON'T SET INTERNAL EOF BIT" BIS #M.EOF,(R3) ;SET STATUS BIT520$: MOV R1,-(SP) ;SAVE R1C1 CALL MTDINT ;PASS DIAGNOSTIC DEVICE REGISTERST MOV (SP)+,R1 ;RESTORE R13+ BCS 530$ ;IF CS FUNCTION WAS DIAGNOSTIC(- BIT #DS.ILG!DS.CRE!DS.PAE!DS.BGL!DS.BTE,R1T' ; ANY ERRORS IN STATUS REG (MTS)?  BEQ 530$ ; IF EQ THEN NO" CALL $DVERR ; LOG DEVICE ERROR<530$: CMPB (R2),#RED+CS.RDY-CS.IE-CS.GO ;WAS THAT A READ?# BEQ 539$ ;IF EQ YES, IGNORE EOTS BIT #DS.EOT,R1 ;EOT?E BEQ 539$ ;IF EQ NO( TSTB R0 ;ALREADY RETURNING AN ERROR? BMI 538$ ;IF MI YES).535$: MOV #IE.EOT&377,R0 ;SET FOR EOT STATUS6538$: BIS #M.EOT,(R3) ;REMEMBER EOT FOR NEXT COMMAND/ MOV 2(R2),-(SP) ;PRESERVE THE COUNT REGISTERG2 BIS #CS.CLR,@R2 ;STOP THE DRIVE IF RUNNING AWAY. MOV (SP)+,2(R2) ;RESTORE THE COUNT REGISTER539$: TST (SP)+ ;CLEAN STACKE8540$: MOV S.PKT(R4),R1 ;RETRIEVE ADDRESS OF I/O PACKET8 BICB #S3.SIP,S.ST3(R4) ;RESET POSITIONING INPROGRESS, BIC #S2.ACT,S.ST2(R4) ; CLEAR I/O ACTIVE./ MOV I.PRM+4(R1),R1 ;GET ORIGINAL COUNT VALUE $ ADD 2(R2),R1 ;FIX COUNT REMAINING0 MOVB S.CON(R4),R3 ; RETRIEVE CONTROLLER INDEX, MOVB RTTBL(R3),R2 ; GET FINAL RETRY COUNT2 BIS #RETRY*256.,R2 ; MERGE STARTING RETRY COUNT% CALL $IODON ;FINISH I/O OPERATIONV JMP MTINI ;GO AGAIN  .DSABL LSB;SB; THIS SUBROUTINE CHECKS FOR THE LOGICAL END-OF-VOLUME CONDITION; ; RETURNS WITH CC IF NOT EOV.  ; RETURNS WITH CS IF EOV.S ;B + CHKEOV: MOV 2(R2),-(SP) ;SAVE FRAME COUNTI1  ADD U.CNT(R5),(SP) ;GET NUMBER ACTUALLY SPACEDR4 CMP (SP)+,#1 ;EXACTLY ONE? (COUNT STARTED WITH 1) CLC ;ASSUME NOT EOV BNE 30$ ;IF NE NO, NOT EOV .IF DF A$$NSI. BITB #US.LAB,U.STS(R5) ;MOUNTED ANSII TAPE?% BNE 30$ ;IF NE YES - EXIT WITH CC  .ENDC BIT #2,(R2) ;FORWARD SPACE?N% BNE 30$ ;IF NE NO - CANNOT BE EOVC& BIT #M.EOF!M.BOT,U.CW2(R5) ;AT EOV?$ BEQ 30$ ;IF EQ NO - EXIT WITH CC SEC ;EOV DETECTED 30$: RETURN ; !";N<#; THIS SUBROUTINE ISSUES A COMMAND TO BACKSPACE ONE RECORD$;+%E&BSPACE: BISB #US.BSP,U.STS(R5) ;SET INTERNAL BACKSPACE IN PROGRESS3&' MOV #-1,2(R2) ;BACKSPACE ONE RECORD+( MOVB #SPR,(R2) ;ISSUE BACKSPACE FUNCTIONT ) RETURNP*+;E1,; THIS ROUTINE ATTEMPTS TO SELECT A TAPE DRIVE.7-; THE CURRENT STATUS OF THE DRIVE WITH REGARD TO 7CH,N%.; BOT, AND HWL IS SET AT THIS TIME.,/;(0; ON RETURN: CC==>GOOD SELECTN1; CS==>BAD SELECT2;;3,4SELECT: CALL DRVSTS ;GET TAPE UNIT STATUS-5 MOVB 1(R2),U.BUF+1(R5) ;SET UP FOR COMMAND +6 MOV -2(R2),-(SP) ;SAVE TAPE UNIT STATUS.S?7 BIC #,U.CW2(R5) ;CLEAR EXCESSK8 SEC ;ASSUME SELECT ERROR(&9 BIT #DS.MOL,(SP) ;DID DRIVE SELECT?$: BEQ 10$ ;IF EQ NO - SELECT ERROR8; BIT #DS.TUR!DS.RWS!DS.SDN,(SP) ;MAKE SURE DRIVE IS OK< BNE 7$ ;IF NE OK"= BIT #RD.GAP,10(R2) ;LAST CHANCE)> BEQ 10$ ;IF EQ VACUUM IS GONE - FATALL)?7$: BIT #DS.TUR!DS.SDN,(SP) ;TRUST BOT?E@ BNE 8$ ;IF NE, YES.E)A BIC #DS.BOT,(SP) ;MAY BE INTERMITTENT.T1B8$: SWAB (SP) ;UNIT SELECTABLE. CARRY CLEARED.I:C BIC #^C,(SP) ;CLEAR EXTRA BITSD BIS (SP),U.CW2(R5) ; 'E BICB #US.ABO,U.STS(R5) ;NOT ABORTINGP9F10$: INC (SP)+ ;CLEAN UP STACK WITHOUT AFFECTING CARRYG BCC 20$ ;IF CC GOOD SELECT-H BIS #M.SER,U.CW2(R5) ;SET SELECT ERROR BITI20$: RETURN ;2JKL;+HM; SUBROUTINE SELECTS A TAPE UNIT AND TRIES TO OBTAIN TAPE UNIT STATUS.N;UOO; IF TAPE UNIT READY, DETERMINE 7/9 TRACK STATUS AND UPDATE U.CW3 ACCORDINGLYP;-Q%RDRVSTS: MOV S.CSR(R4),R2 ;R2 - CSR.+S MOVB U.UNIT(R5),1(R2) ;SELECT TAPE UNIT.A-T MOV #50.,-(SP) ;INTERVAL TILL DEV REG RDY. !U5$: DEC (SP) ;INTERVAL OVER ?V BNE 5$ ;IF NE,00zztcccc NO.'W BIT #DS.TUR,-2(R2) ;TAPE UNIT READY?2/X BEQ 10$ ;IF EQ, NO. BITS 0-5 NOT AVAILABLE.S*Y MOVB #UD.800,U.CW3(R5) ;INDICATE (ONLY)+Z MOVB #UD.UNS,U.CW3+1(R5) ;9TRACK/800BPI.T)[ BIT #DS.7CH,-2(R2) ;7TRACK TAPE UNIT ?U\ BEQ 10$ ;IF EQ, NO. ,] MOVB #UD.200,U.CW3(R5) ;INDICATE 7 TRACK,3^ MOVB #UD.800,U.CW3+1(R5) ;200 TO 800BPI SUPPORT.-)_10$: TST (SP)+ ;RETURN STACK AS FOUND.P ` RETURNabc;+;d; **-MTDINT-TM11 DIAGNOSTIC INTERRUPT AND TIMEOUT HANDLEREe;Af; IF ENTRY WAS FROM A DIAGNOSTIC CONTROL FUNCTION THEN MOVE I/O9g; PACKET WORDS 17-20 TO WORDS 20-21 FOR $CRPAS ROUTINE..Dh; FOR ANY DIAGNOSTIC FUNCTION PASS THE UNIBUS DEVICE REGISTERS VIAi; THE $CRPAS ROUTINE.(j;7 k; INPUTSl; R2= CSR ADDRESSIm; R4= SCB ADDRESSUn;, o; OUTPUTSDp; R1= IO PACKET ADDRESS.q;-r2sMTDINT: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS t CLC ;4u BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION CALL?v BEQ 4$ ;IF EQ NO 'w MOV R1,-(SP) ;SAVE IO PACKET ADDRESSW5x CMPB #IO.EOF/256.,I.FCN+1(R1) ;WRITE EOF FUNCTION?y BEQ 1$ ;IF EQ YES@z CMPB #IO.RWD/256.,I.FCN+1(R1) ;CNTRL FUNCT.OTHER THAN IO.EOF?{ BEQ 1$ ;IF EQ YES4| CALL $CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTIC*} MOV (SP)+,R1 ;RESTORE IO PACKET ADDRESS~ BR 3$ ;RETURNT61$: MOV I.PRM+14(R1),I.PRM+16(R1) ;MOVE WD20 TO WD213 MOV I.PRM+12(R1),I.PRM+14(R1) ;MOVE WD17 TO WD20B72$: CALL $CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTIC4* MOV (SP)+,R1 ;RESTORE IO PACKET ADDRESS8 MOV I.PRM+14(R1),I.PRM+12(R1) ;MOVE WD20 BACK TO WD178 MOV I.PRM+16(R1),I.PRM+14(R1) ;MOVE WD21 BACK TO WD2093$: BIC #RD.LPC,10(R2) ;CLEAR LPC MODE BIT IN MTRD REG. - SEC ;SET DIAGNOSTIC FUNCTION CALL RETURNT 4$: RETURN .ENDR1 ;RESTORE IO PACKET ADDRESS~ BR 3$ ;RETURNT61$: MOV I.PRM+14(R1),I.PRM+16(R1) ;MOVE WD20 TO WD213 MOV I.PRM+12(R1),I.PRM+14(R1) ;MOVE WD17 TO WD20B72$: CALL $CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTIC4* MOV (SP)+,R1 ;RESTORE IO PACKET ADDRESS8 MOV I.PRM .TITLE EXESBT .IDENT /14.01/P;15; COPYRIGHT (c) 1985 BY DIGITAL EQUIPMENT CORPORATION1; ALL RIGHTS RESERVED.;2<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;N; D. N. CUTLER 4-AUG-73V;P; PREVIOUSLY MODIFIED BY:D;S; J. R. KAUFFMAN; J. M. LAWLER; B. S. MCCARTHY;M ; MODIFIED BY1;M; B. S. MCCARTHY 2-MAR-85 14.00E;1,; BM336 -- ALLOW A PR:0 TASK TO PERFORM I/O&; REQUESTS OF ANY LENGTH, AS LONG AS; FIRST ADDRESS CHECKS;1 ; B. S. MCCARTHY 12-JUN-85 14.01;A6; BM336 -- FIX PROBLEM IN ABOVE FOR BAD START ADDRESS;S; I/O RELATED ROUTINES;R5; ROUTINES CALLED PRIMARILY FROM WITHIN THE EXECUTIVEN;W; MACRO LIBRARY CALLSI;S8 .MCALL F11DF$,HDRDF$,HWDDF$,PCBDF$,PKTDF$,SHDDF$,TCBDF$0 F11DF$ ;DEFINE WINDOW AND LOCK BLOCK OFFSETS ' HDRDF$ ;DEFINE TASK HEADER OFFSETS S$ HWDDF$ ;DEFINE HARDWARE REGISTERS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS* SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS .PAGE;+); **-$ACHKP-ADDRESS CHECK PARAMETER BLOCK6; **-$ACHKW-ADDRESS CHECK PARAMETER BLOCK WORD ALIGNED ; G; THESE ROUTINES ARE CALLED TO ADDRESS CHECK A TASK SPECIFIED PARAMETERCM; BLOCK TO INSURE IT IS WITHIN THE TASK'S ADDRESS SPACE AND ALIGNED PROPERLY.HI; IF EITHER CHECK FAILS, THEN A DIRECTIVE STATUS OF 'D.RS98' IS RETURNED.A;T ; INPUTS: ;C1; R0=STARTING ADDRESS OF THE BLOCK TO BE CHECKED.S0; R1=LENGTH OF THE BLOCK TO BE CHECKED IN BYTES.;D ; OUTPUTS:;RA; THE SPECIFIED BLOCK IS CHECKED FOR PROPER ALIGNMENT AND WHETHERL?; IT IS WITHIN THE TASK'S ADDRESS SPACE. IF EITHER CHECK FAILS, @; THEN A DIRECTIVE STATUS OF 'D.RS98' IS RETURNED. ELSE A RETURN; TO THE CALLER IS EXECUTED.; 9; R2=ADDRESS OF WINDOW BLOCK MAPPING BUFFER ($ACHKW ONLY)H-; (FOR PRIVILEGED TASKS SEE NOTE IN $ACHKB.)T;O&; R0 AND R3 ARE PRESERVED ACROSS CALL.;- T .ENABL LSBF3$ACHKP00zzttt tfDATA::MOV R3,R0 ;SET ADDRESS OF BLOCK TO CHECK T+ CALL $ACHCK ;ADDRESS CHECK WORD ALIGNED  BCS 10$ ;IF CS CHECK FAILURE/ CALL $RELOC ;RELOCATE PARAMETER BLOCK ADDRESST& MOV R1,KISAR6 ;MAP TO PARAMETER BLOCK- MOV R2,R3 ;REDEFINE PARAMETER BLOCK ADDRESS RETURN ;E2$ACHKW::CALL $ACHCK ;ADDRESS CHECK WORD ALIGNED  BCC 50$ ;IF CC OKAYK(10$: DRSTS D.RS98 ;SET DIRECTIVE STATUS .PAGE;+&; **-$ACHKB-ADDRESS CHECK BYTE ALIGNED&; **-$ACHCK-ADDRESS CHECK WORD ALIGNED;TJ; THIS ROUTINE IS CALLED TO ADDRESS CHECK A BLOCK OF MEMORY TO SEE WHETHER7; IT LIES WITHIN THE ADDRESS SPACE OF THE CURRENT TASK.C;K ; INPUTS:C; 1; R0=STARTING ADDRESS OF THE BLOCK TO BE CHECKED.,0; R1=LENGTH OF THE BLOCK TO BE CHECKED IN BYTES.; ; OUTPUTS:; ; C=1 IF ADDRESS CHECK FAILED.!; C=0 IF ADDRESS CHECK SUCCEEDED.I;D+; R2=ADDRESS OF WINDOW BLOCK MAPPING BUFFER ; (FOR PRIV TASKS SEE NOTE.);&; R0 AND R3 ARE PRESERVED ACROSS CALL.;*9; NOTE: SINCE PRIVILEGED TASK I/O BUFFERS ARE NOT ADDRESSA4; CHECKED, R2 ALWAYS RETURNS A POINTER TO THE FIRST8; WINDOW BLOCK. CHECKPOINTING AND SHUFFLING OF COMMONS6; WILL STILL WORK PROPERLY PROVIDED THAT A PRIVILEGED5; TASK NEVER SPECIFIES AN I/O INTO A COMMON WHICH ITD3; ALLOWS TO REMAIN CHECKPOINTABLE AND SHUFFLEABLE.K;I0; THE ABOVE ALSO IMPLIES THAT ALLOWING A RANDOM.; REGION TO BE SHUFFLED OR CHECKPOINTED WHILE0; P.RMCT=0 MIGHT POSSIBLY CHECKPOINT THE REGION; WITH THE BUFFER CONTAINED. ;-$ACHCK::ASR R0 ;ODD ADDRESS?  BCS 14$ ;IF CS YES ASL R0 ;REALIGN ADDRESSN7$ACHKB::CALL $ACHRO ;CHECK BUFFER FOR READ ONLY ACCESSF BCS 14$ ;IF CS FAILURE .IF DF X$$HDR0 BIT #4,$IOTMP ;WRITE ACCESS ALLOWED TO WINDOW ? .IFFI4 BIT #4,W.BLPD(R2) ;WRITE ACCESS ALLOWED TO WINDOW ? .ENDC ;X$$HDR BNE 14$ ;IF NE YES SEC ;ELSE RETURN CS14$: RETURN ;  .PAGE;+9; **-$ACHUI-ADDRESS CHECK USER I SPACE (FOR LOAD OVERLAY)O; @; THIS ROUTINE CHECKS THE SPECIFIED USER BUFFER FOR EXISTENCE IN; USER I SPACE ONLY.; ; INPUTS:;L1; R0=STARTING ADDRESS OF THE BLOCK TO BE CHECKED. 0; R1=LENGTH OF THE BLOCK TO BE CHECKED IN BYTES.;E ; OUTPUTS:;H; C=1 IF ADDRESS CHECK FAILED.!; C=0 IF ADDRESS CHECK SUCCEEDED.;T,; R2=ADDRESS OF WINDOW BLOCK MAPPING BUFFER.(; (FOR PRIV TASKS SEE NOTE IN $ACHKB);S); R0 AND R3 ARE PRESERVED ACROSS THE CALL;- .IF DF U$$DAS$ACHUI:: .IF DF X$$HDR' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGE- MOV $SAHDB,KISAR6 ;AND MAP TO CURRENT HEADER .ENDC ; DF X$$HDR2 MOV $SAHPT,R2 ;GET ADDRESS OF CURRENT TASK HEADER- CLR -(SP) ;FORCE EXAMINATION OF USER I ONLYE BR 145$ ;ENTER COMMON ROUTINE: .ENDC ; DF U$$DAS .PAGE;+.; **-$ACHRO-ADDRESS CHECK FOR READ-ONLY ACCESS;DE; THIS ROUTINE CHECKS THE SPECIFIED USER BUFFER FOR READ-ONLY ACCESS.$;K ; INPUTS:0;D1; R0=STARTING ADDRESS OF THE BLOCK TO BE CHECKED.$0; R1=LENGTH OF THE BLOCK TO BE CHECKED IN BYTES.; ; OUTPUTS:;A; C=1 IF ADDRESS CHECK FAILED.!; C=0 IF ADDRESS CHECK SUCCEEDED.D;$,; R2=ADDRESS OF WINDOW BLOCK MAPPING BUFFER.'; (FOR PRIV TASKS SEE NOTE IN $ACHKB.)I;O&; R0 AND R3 ARE PRESERVED ACROSS CALL.;- :$ACHRO:: .IF DF X$$HDR' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGO2 MOV $SAHDB,KISAR6 ;AND MAP TO CURRENT TASK HEADER .ENDC ; DF X$$HDR, MOV $SAHPT,R2 ;POINT TO CURRENT TASK HEADER .IF DF U$$DAS!S$$LIBE4 MOV H.SMAP(R2),-(SP) ;SAVE USER/SUPER MAPPING MASKS ;FOR LATER +145$: CLR -(SP) ;ALLOCATE SPACE FOR BUFFER  ;DESCRIPTOR MASK .IFTF ; DF U$$DAS!S$$LIBI3 MOV H.WND(R2),R2 ;POINT TO NUMBER OF WINDOW BLOCKS . MOV (R2)+,-(SP) ;PUSH NUMBER OF WINDOW BLOCKS% TST W.BLVR(R2) ;TASK MAPPED TO EXEC?$, BNE 40$ ;IF NE YES, ADDRESS CHECK SUCCEEDS, DEC R1 ;CALCULATE HIGHEST ADDRESS OF BLOCK ADD R0,R1 ;N$ BCC 147$ ;IF CC ALL IS OK, NO WRAP5; * * * SPECIAL NOTE ABOUT PRIVILEGED TASKS * * *V;S<; IN ORDER TO MAKE THE IMPLEMENTATION OF ADDRESS CHECKING ON=; RSX-11M-PLUS COMPATIBLE WITH RSX-11M, WHICH SKIPS CHECKS IF =; T3.PRV IS SET, W00zztccccE ADDRESS CHECK ONLY THE FIRST ADDRESS, NOTT@; THE LENGTH OF THE TRANSFER. THIS ALLOWS A PR:0 TASK TO PERFORM;; A LARGE I/O INTO A REGION WHICH IS MAPPED THROUGH A SMALLI>; WINDOW. WE MUST STILL ADDRESS CHECK, SINCE THIS ROUTINE WILL=; RETURN THE WINDOW BLOCK MAPPING THE BUFFER TO WHICH THE I/O ; IS TO BE CHARGED.C; =; SINCE THIS CHECK REQUIRES SEVERAL EXTRA INSTRUCTIONS, IT ISE<; IMPLEMENTED IN THE ERROR PATHS THROUGH THE CHECK ROUTINES.; 2 MOV $TKTCB,-(SP) ;GET TCB ADDRESS OF CURRENT TASK1 ADD #T.ST3,(SP) ;POINT TO THIRD TASK STATUS WORDH% BIT #T3.PRV,@(SP)+ ;TASK PRIVILEGED? , BEQ 30$ ;IF EQ NO, ADDRESS WRAP -> FAILURE147$: ;REFERENCE LABEL  .IFT ; DF U$$DAS!S$$LIB* TST 4(SP) ;TASK HAVE ONLY USER I SPACE ?+ BNE 100$ ;IF NE NO, GO DO IT THE HARD WAYT .IFTF ; DF U$$DAS!S$$LIBC/15$: TST (R2) ;IS NEXT WINDOW MAPPED? (W.BPCB)R BEQ 20$ ;IF EQ NOE  L .IF DF S$$LIB R* TSTB W.BFPD(R2) ;SUPERVISOR MODE MAPPING?. BPL 20$ ;IF PL YES, IGNORE FOR ADDRESS CHECK A .ENDC ; DF U$$DAS O I& CMP R0,W.BLVR(R2) ;COMPARE LOW LIMITS" BLO 20$ ;IF LO NOT IN DESCRIPTOR' CMP R1,W.BHVR(R2) ;COMPARE HIGH LIMITS;* BLOS 40$ ;IF LOS BUFFER IS IN DESCRIPTOR<; TEST FOR ISSUER PR:0. IF SO MAPPING SUCCESSFUL EVEN THOUGH; LAST ADDRESS FAILED MAPPING2 MOV $TKTCB,-(SP) ;GET TCB ADDRESS OF CURRENT TASK1 ADD #T.ST3,(SP) ;POINT TO THIRD TASK STATUS WORD % BIT #T3.PRV,@(SP)+ ;TASK PRIVILEGED?R' BEQ 20$ ;IF EQ NO, LAST ADDR. FAILUREI3 CMP R0,W.BHVR(R2) ;LAST ADDRESS FAILURE OK, BUT IS$! ;FIRST ADDRESS WITHIN WINDOW?O/ BLOS 40$ ;IF LOS YES, OK. THIS IS A PRIV TASKT& ;WITH A VALID BUFFER THAT OVERLAPS ;THE END OF THE WINDOW.E/20$: ADD #W.BLGH,R2 ;POINT TO NEXT WINDOW BLOCKS# DEC (SP) ;MORE DESCRIPTORS TO GO?A BGT 15$ ;IF GT YES30$: ;REFERENCE LABEL .IFT ; DF U$$DAS!S$$LIB0 SUB #-6,SP ;CLEAR 3 WORDS OFF STACK, SET CARRY .IFF ; DF U$$DAS!S$$LIB# COM (SP)+ ;CLEAN STACK, SET CARRYL .IFTF ; DF U$$DAS!S$$LIB. .IF DF X$$HDR0 MOV (SP)+,KISAR6 ;RESTORE PREVIOUS EXEC MAPPING .ENDC ; DF X$$HDR RETURN ;H40$: ;REFERENCE LABEL .IFT ; DF U$$DAS!S$$LIB1 ADD #6,SP ;CLEAR 3 WORDS OFF STACK, CLEAR CARRYR .IFF ;DF U$$DAS!S$$LIBC% TST (SP)+ ;CLEAN STACK, CLEAR CARRY .IFTF ; DF U$$DAS!S$$LIB  .IF DF X$$HDR6 MOV W.BLPD(R2),$IOTMP ;SAVE R/W INDICATOR FROM WINDOW0 MOV (SP)+,KISAR6 ;RESTORE PREVIOUS EXEC MAPPING .ENDC ; DF X$$HDR50$: RETURN ;.A; THIS SECTION HANDLES ADDRESS CHECKS FOR TASKS WITH MIXED I/D ORSD; USER/SUPER MAPPING. THIS CODE IS DESIGNED TO "FAVOR" (PERFORMANCE)@; TASKS WHOSE I/O IS FULLY MAPPED THROUGH USER D SPACE. THE CODE>; ABOVE FAVORS "SIMPLE" TASKS WITH ONLY USER I SPACE OR USER I ; SUPER I.; B; FIRST, FIND A WINDOW (IF THERE IS ONE) WHICH CONTAINS THE ENTIRE; BUFFER .IFT ; DF U$$DAS!S$$LIB%100$: TST (R2) ;NEXT WINDOW MAPPED ?+ BEQ 110$ ;IF EQ NO& CMP R0,W.BLVR(R2) ;COMPARE LOW LIMITS# BLO 110$ ;IF LO NOT IN DESCRIPTORN' CMP R1,W.BHVR(R2) ;COMPARE HIGH LIMITSI+ BLOS 120$ ;IF LOS BUFFER IS IN DESCRIPTORS<; TEST FOR ISSUER PR:0. IF SO MAPPING SUCCESSFUL EVEN THOUGH; LAST ADDRESS FAILED MAPPINGE2 MOV $TKTCB,-(SP) ;GET TCB ADDRESS OF CURRENT TASK1 ADD #T.ST3,(SP) ;POINT TO THIRD TASK STATUS WORD(% BIT #T3.PRV,@(SP)+ ;TASK PRIVILEGED?I( BEQ 110$ ;IF EQ NO, LAST ADDR. FAILURE3 CMP R0,W.BHVR(R2) ;LAST ADDRESS FAILURE OK, BUT IS;! ;FIRST ADDRESS WITHIN WINDOW?R0 BLOS 120$ ;IF LOS YES, OK. THIS IS A PRIV TASK& ;WITH A VALID BUFFER THAT OVERLAPS ;THE END OF THE WINDOW.R0110$: ADD #W.BLGH,R2 ;POINT TO NEXT WINDOW BLOCK$ DEC (SP) ;MORE DESCRIPTORS TO GO ? BGT 100$ ;IF GT YESN! BR 30$ ;ELSE ADDR. CHECK FAILEDD .ENDC ; DF U$$DAS!S$$LIB.>; FOUND A WINDOW WHICH COVERS TRANSFER. CHECK FOR USER D SPACE; FIRSTL120$: ;REFERENCE LABEL  .IF DF U$$DAS- BIT #20,W.BFPD(R2) ;USER DATA SPACE WINDOW ?T BEQ 130$ ;IF EQ NOA; WINDOW IS USER D SPACE. IF THE REQUEST WAS ISSUED IN USER MODE,-; THEN THE BUFFER IS G00zzttt tfDATAUARANTEED TO BE MAPPED.E .IF DF S$$LIB, TST $STACK-2 ;ISSUED FROM SUPERVISOR MODE ?) BMI 40$ ;IF MI NO, D SPACE MAP SUCCEEDSD; WINDOW IS D SPACE, BUT REQUEST WAS ISSUED FROM SUPER MODE. THIS IS?; OK ONLY IF THERE IS NO OVERLAP BETWEEN THE BUFFER AND A SUPER 1; D APR WHICH HAS BEEN MAPPED INTO SUPER I SPACE.A( CALL 210$ ;BUILD SUPER BUFFER APR MASK6 BITB 2(SP),4(SP) ;ANY PART OVERLAP SUPER I/D WINDOW ? BEQ 40$ ;IF EQ NO, SUCCESS BR 110$ ;KEEP TRYING .ENDC ; DF S$$LIB .ENDC ; DF U$$DAS6; WINDOW IS EITHER USER I OR SUPER I. CHECK FOR USER I130$: ;REFERENCE LABEL4 .IF DF S$$LIB, TSTB W.BFPD(R2) ;USER I OR SUPER I WINDOW ? BPL 150$ ;IF PL SUPER IR .ENDC ; DF S$$LIBB; WINDOW IS USER I SPACE. LOOK FOR CONFLICT WITH DISCRETE D SPACED; WINDOW. FOR PERFORMANCE, WE BUILD THE MASK IF WE NEED IT, BUT ONLY; ONCE IN ANY CASE.  .IF DF U$$DAS# CALL 210$ ;ESTABLISH MAPPING MASK$?140$: BITB 3(SP),5(SP) ;ANY OF BUFFER OVERLAP DISCRETE WINDOW ?! BNE 110$ ;IF NE YES, KEEP GOING  .ENDC ; DF U$$DAS BR 40$ ;SUCCESSFULI; WINDOW IS SUPER I. IF ISSUED IN USER MODE IGNORE WINDOW, ELSE MAKE SUREU; ENTIRE WINDOW IS OVERMAPPED. .IF DF S$$LIB*150$: TST $STACK-2 ;ISSUED IN SUPER MODE ?# BMI 110$ ;IF MI NO, IGNORE WINDOWEF; SINCE SUPER WINDOWS CAN'T MAP APR0 INTO SUPER I SPACE, IGNORE WINDOW; IF TRANSFER STARTS IN APR0' CMP #20000,R0 ;BUFFER START IN APR 0 ?S- BHI 110$ ;IF HI YES, CAN'T BE THROUGH SUPERRE; ESTABLISH SUPERVISOR MASK AND MAKE SURE WHOLE TRANSFER FITS THROUGH ; SUPER I WINDOW+ CALL 210$ ;ESTABLISH SUPER D OVERMAP MASKI- MOVB 2(SP),-(SP) ;COPY SUPER BUFFER APR MASKN0 BICB 6(SP),(SP)+ ;FULL BUFFER IN SUPER WINDOW ? BEQ 40$ ;IF EQ YES BR 110$ ;ELSE NO .ENDC ; DF S$$LIB9; LOCAL SUBROUTINE TO ESTABLISH SUPER BUFFER MAPPING MASKU .IF DF U$$DAS!S$$LIBW)210$: TSTB 5(SP) ;USER D MAP BUILT YET ?, BNE 220$ ;IF NE YES 3 MOV R2,-(SP) ;SAVE POINTER TO CURRENT WINDOW BLOCK' MOV R1,R2 ;COPY END ADDRESS OF BUFFERR! ASH #-13.,R2 ;REDUCE TO JUST APRU$ BIC #177770,R2 ;CLEAR UNWANTED BITS< MOVB $BCMSK(R2),7(SP) ;INIT MASK TO ALL UP TO UPPER ADDRESS) MOV R0,R2 ;COPY START ADDRESS OF BUFFER ! ASH #-13.,R2 ;REDUCE TO JUST APRS$ BIC #177770,R2 ;CLEAR UNWANTED BITS> BICB $BCMSK-1(R2),7(SP) ;INIT MASK TO ALL UP TO UPPER ADDRESS" MOVB 7(SP),6(SP) ;INIT SUPER MASK CLC ;GET SET FOR SHIFTU& RORB 6(SP) ;SUPER MASK IS ORIGIN ONE% MOV (SP)+,R2 ;RESTORE WINDOW POINTERO220$: RETURN ; .ENDC ;DF U$$DAS!S$$LIB .DSABL LSB. .PAGE;+9; **-$CKBFI-CHECK I/O BUFFER FOR I-SPACE (OVERLAY) ACCESSB8; **-$CKBFR-CHECK I/O BUFFER FOR READ-ONLY (BYTE) ACCESS9; **-$CKBFW-CHECK I/O BUFFER FOR READ-WRITE (WORD) ACCESSC9; **-$CKBFB-CHECK I/O BUFFER FOR READ-WRITE (BYTE) ACCESS ;M:; THESE ROUTINES ARE CALLED TO ADDRESS CHECK AN I/O BUFFER>; ASSOCIATED WITH THE CURRENT (UNDER CONSTRUCTION) I/O PACKET.C; IF THE ADDRESS CHECK PASSES, THEN AN ATTEMPT IS MADE TO POINT ONEEC; OF THE ATTACHMENT DESCRIPTOR POINTERS AT THE ASSOCIATED ADB. THISA*; WILL HAVE ONE OF THE FOLLOWING OUTCOMES:;EE; 1) - THERE IS CURRENTLY NO ATTACHMENT POINTER IN THE PACKET TO THISCD; ADB, AND THE POINTERS AREN'T FULL. A POINTER IS FILLED IN ANDD; THE A.IOC, P.IOC FIELDS FOR THIS I/O ARE INCREMENTED. THIS IS$; THE "NORMAL" SUCCESSFUL CASE.; ?; 2) - THERE IS ALREADY ONE POINTER TO THIS ADB. THE PACKET IS CB; UNTOUCHED, AS ARE THE A.IOC AND P.IOC FIELDS, AND THE CHECKD; IS CONSIDERED SUCCESSFUL. THE IMPLICATION OF NOT INCREMENTING?; A.IOC AND P.IOC IS THAT DRIVERS AND ACPS MAY NOT RELEASEE@; BUFFERS FOR AN I/O REQUEST ONE AT A TIME, I.E. THE DRIVERA; SHOULD NOT CALL $DECIO DIRECTLY, BUT SHOULD CALL $IODON OR 5; $DECAL AFTER ALL BUFFER ACCESS HAS SCOMPLETED.E;TF; 3) - THERE ARE ALREADY TWO POINTERS, NONE OF THEM TO THIS ATTACHMENT@; DESCRIPTOR. THIS IS CONSIDERED A CHECK FAILURE AND RETURN; IS MADE WITH CARRY SET.;T ; INPUTS: ; ,; R0=STARTING ADDRESS OF BLOCK TO BE00zztcccc CHECKED#; R1=LENGTH OF BUFFER TO BE CHECKEDI0; $ATTPT=ADDRESS OF I.AADA IN CURRENT I/O PACKET5; HEADER OF THE SUBJECT TASK IS MAPPED THROUGH KISAR6R;R ; OUTPUTS:; '; C=0 CHECK AND PACKET UPDAT SUCCESSFUL '; I.AADA OR I.AADA+2 POINTS TO THE ADBR; A.IOC, P.IOC INCREMENTED9; C=1 CHECK UNSUCCESSFUL OR PACKET COULD NOT BE FILLED IN ;- .ENABL LSBD .IF DF U$$DAS+$CKBFI::CALL $ACHUI ;PERFORM ADDRESS CHECKI BR 10$ ;ENTER COMMON CODE  .ENDC ; DF U$$DAS+$CKBFR::CALL $ACHRO ;PERFORM ADDRESS CHECKT BR 10$ ;ENTER COMMON CODE +$CKBFW::CALL $ACHCK ;PERFORM ADDRESS CHECK BR 10$ ;ENTER COMMON CODEI+$CKBFB::CALL $ACHKB ;PERFORM ADDRESS CHECK /10$: BCS 50$ ;IF CS ADDRESS CHECK UNSUCCESSFULR% MOV R0,-(SP) ;SAVE ADDRESS OF BUFFER 8 MOV W.BATT(R2),R1 ;GET ADDRESS OF ATTACHMENT DESCRIPTOR- MOV $ATTPT,R0 ;POINT TO ADDRESS OF FIRST ADBF$ TST (R0) ;FIRST ADB POINTER FULL ?/ BNE 40$ ;IF NE YES, CHECK FOR MATCH OR SECOND "20$: MOV R1,(R0) ;FILL IN POINTER7 INCB A.IOC(R1) ;INCREMENT I/O THROUGH ATTACHMENT COUNTN* MOV A.PCB(R1),R0 ;POINT TO ASSOCIATED PCB1 INCB P.IOC(R0) ;INCREMENT I/O INTO PARTION COUNT:)30$: MOV (SP)+,R0 ;RESTORE BUFFER ADDRESS: CLC ;INDICATE SUCCESS RETURN ;S440$: CMP R1,(R0)+ ;ALREADY POINTING TO DESIRED ADB ?* BEQ 30$ ;IF EQ YES, DONE, RETURN SUCCESS! TST (R0) ;SECOND POINTER FULL ?E BEQ 20$ ;IF EQ NO, USE IT;/ CMP R1,(R0) ;SECOND POINTER SAME AS DESIRED ?H* BEQ 30$ ;IF EQ YES, DONE, RETURN SUCCESS SEC ;INDICATE FAILURE% MOV (SP)+,R0 ;RESTORE BUFFER ADDRESSN50$: RETURN ;P .DSABL LSBT .PAGE;+C; **-$CEFNG-CONVERT EVENT FLAG AND LOCK GROUP GLOBALS FOR DIRECTIVE(=; **-$CEFIG-CONVERT EVENT FLAG AND LOCK GROUP GLOBALS FOR I/OT; >; THIS ROUTINE IS CALLED TO CONVERT AN EVENT FLAG NUMBER TO AN@; EVENT FLAG MASK WORD AND EVENT FLAG MASK ADDRESS. IF THE EVENTC; FLAG IS GROUP GLOBAL, POINT THE GROUP GLOBAL USE COUNT POINTER IN A; SYSTEM COMMON TO THE FLAG WORD RETURNED IN R1. IF R1 IS ODD, R1C>; IS POINTING TO THE SECOND GROUP OF GROUP GLOBAL EVENT FLAGS.;R ; INPUTS:;. ; R0=EVENT FLAG TO BE CONVERTED.7; R3=ADDRESS CONTAINING EVENT FLAG NUMBER ($CEFNG ONLY)(0; R5=TCB ADDRESS OF THE TASK THE EFN APPLIES TO.;L ; OUTPUTS:;,; C=1 IF NO EVENT FLAG NUMBER WAS SPECIFIED. ; R0=ZERO. ; R1=ZERO.L,; C=0 IF AN EVENT FLAG NUMBER WAS SPECIFIED.; R0=EVENT FLAG MASK WORD.B; R1=EVENT FLAG MASK ADDRESS.-; R1 IS EVEN IF THE EVENT FLAG NUMBER < 81.O,; R1 IS ODD IF THE EVENT FLAG NUMBER > 81.;N<; R3 IS PRESERVED ACROSS CALL IF ENTRY AT $CEFIG, ELSE R3 IS; ADVANCED BY 2.F; ;- .ENABL LSB +$CEFIG::CALL $CEFI ;CONVERT THE EVENT FLAG  BR 5$ ;JOIN COMMON CODE +$CEFNG::CALL $CEFN ;CONVERT THE EVENT FLAG5$: ;REFERENCE LABELG .IF DF G$$GEF BCS 30$ ;IF CS RETURNE BNE 30$ ;IF NE RETURNL- MOV R1,-(SP) ;SAVE GROUP GLOBAL MASK ADDRESS - TSTB -(R1) ;POINT TO GROUP GLOBAL USE COUNTI) TSTB -(R1) ;R1 MAY BE ODD - CLEAR C-BIT * ASSUME G.CNT+2,G.EFLG ;MUST BE CONTIGUOUS$ BIT #1,R1 ;USING SECOND MASK WORD?1 BEQ 10$ ;IF EQ NO, WE ARE POINTING TO USE COUNT, SUB #3,R1 ;POINT TO GROUP GLOBAL USE COUNT910$: MOV R1,@#$GEFPT ;LOAD GROUP GLOBAL USE COUNT POINTERA. MOV (SP)+,R1 ;RESTORE EVENT FLAG MASK ADDRESS4 MOV R5,$GFTCB ;DISPATCHER WILL MAINTAIN THE CORRECT; ADD #T.GGF,$GFTCB ; GRP GBL USE COUNT PER TASK W/THIS PNTRB .ENDC ; DF G$$GEF 30$: RETURN .DSABL LSB ;+ T2; **-$CEFN-CONVERT EVENT FLAG NUMBER FOR DIRECTIVE,; **-$CEFI-CONVERT EVENT FLAG NUMBER FOR I/O;I>; THIS ROUTINE IS CALLED TO CONVERT AN EVENT FLAG NUMBER TO ANA; EVENT FLAG MASK WORD AND EVENT FLAG MASK ADDRESS. IF AN ILLEGAL,A; EVENT FLAG IS SPECIFIED, THEN A DIRECTIVE STATUS OF 'D.RS97' ISO@; RETURNED. ELSE THE EVENT FLAG NUMBER IS CONVERTED AND THE COM-*; PONENT PARTS ARE RETURNED TO THE CALLER.;E ; INPUTS:T; '; R0=EVENT FLAG NUMBER TO BE CONVERTED.:6; R3=ADDRESS CONTAINING EVENT FLAG NUMBER ($CEFN ONLY)0; R5=TCB ADDRESS OF THE TASK THE EFN APPLIES TO.;T ; OUTPUTS:;B,; C=00{zttt tfDATA1 IF NO EVENT FLAG NUMBER WAS SPECIFIED. ; R0=ZERO.T ; R1=ZERO.T,; C=0 IF AN EVENT FLAG NUMBER WAS SPECIFIED.; R0=EVENT FLAG MASK WORD. ; R1=EVENT FLAG MASK ADDRESS.&; R1 IS EVEN IF THE EVENT FLAG < 81.%; R1 IS ODD IF THE EVENT FLAG > 81.V*; Z=1 IF GROUP GLOBAL EVENT FLAG CONVERTED-; Z=0 IF LOCAL OR COMMON EVENT FLAG CONVERTEDE;FJ; R3 IS PRESERVED ACROSS CALL IF ENTRY AT $CEFI, ELSE R3 IS ADVANCED BY 2.;-,$CEFN:: MOVB (R3)+,R0 ;GET EVENT FLAG NUMBER INC R3 ;ADVANCE TO NEXT WORD$CEFI:: ;REFERENCE LABEL  .IF DF G$$GEF( CLR -(SP) ;INIT GROUP GLOBAL INDICATOR .IFTF ; DF G$$GEF MOV R0,R1 ;COPY EFNO SEC ;ASSUME NONE SPECIFIEDR! BEQ 30$ ;IF EQ NO EFN SPECIFIEDL DEC R0 ;BACK OFF EFN BY ONEE MOV #32.,R2 ;SET EFN DIVIDER* MOV R5,R1 ;POINT TO FIRST TASK MASK WORD ADD #T.EFLG,R1 ;A CMP R0,R2 ;IN TASK EFN SET?R BLO 10$ ;IF LO YES$ SUB R2,R0 ;NORMALIZE TO COMMON SET CMP R0,R2 ;LEGAL EFN?+ .IFT ; DF G$$GEFU BLO 5$ ;IF LO YES * SUB R2,R0 ;NORMALIZE TO GROUP GLOBAL SET CMP R0,R2 ;LEGAL EFN?- BHIS 40$ ;IF HIS NOL6 CALL $GTGEF ;GET ADDRESS OF GROUP GLOBAL EVENT FLAGS2 BCS 40$ ;IF CS NO SUCH FLAG OR TASK CHECKPOINTED$ DEC (SP) ;FLAG THAT FLAG WAS FOUND BR 10$ ;USE GROUP GLOBAL SET .IFF ; DF G$$GEF, BHIS 40$ ;IF HIS NOM .IFTF ; DF G$$GEF35$: MOV #$COMEF,R1 ;POINT TO FIRST COMMON MASK WORDO10$: ASR R2 ;HALVE DIVIDERT CMP R0,R2 ;FIRST MASK WORD?L BLO 20$ ;IF LO YES SUB R2,R0 ;NORMALIZE EFN& TST (R1)+ ;POINT TO SECOND MASK WORD .IFT ; DF G$$GEFL$ TST (SP) ;GROUP GLOBAL FLAG FOUND? BEQ 20$ ;IF EQ NOS* INC R1 ;MARK AS SECOND GROUP GLOBAL WORD .IFTF ; DF G$$GEF'20$: ASL R0 ;CONVERT EFN TO WORD INDEXW( MOV $BTMSK(R0),R0 ;GET PROPER MASK WORD30$: ;REFERENCE LABEL .IFT ; DF G$$GEF1 INC (SP)+ ;CLEAN STACK, PRESRV C-BIT, SET Z BITF .ENDC ; DF G$$GEF RETURNR(40$: DRSTS D.RS97 ;SET DIRECTIVE STATUS .PAGE;+2; **-GTGEF-GET ADDRESS OF GROUP GLOBAL EVENT FLAGS;1D; THIS ROUTINE SEARCHES FOR GROUP GLOBAL EVENT FLAGS FOR A SPECIFIED@; TASK. IF THE EVENT FLAG EXISTS, THE ADDRESS OF THE EVENT FLAG ; WORD IS RETURNED IN R1..;F ; INPUTS:F;; R5=TCB ADDRESS OF TASK.O;R ; OUTPUTS:;$-; C=0 IF GROUP GLOBAL EVENT FLAGS WERE FOUND F); R1=ADDRESS OF GROUP GLOBAL EVENT FLAGS(;+;; C=1 IF THE EVENT FLAGS WERE NOT FOUND OR IF THE SPECIFIEDF; TASK IS CHECKPOINTED.9;;;- E .IF DF G$$GEF$$GTGEF::MOV R0,-(SP) ;SAVE REGISTERS MOV R4,-(SP) ;S. MOV T.PCB(R5),R4 ;GET TASK REGION PCB ADDRESS8 BIT #PS.OUT!PS.CKP,P.STAT(R4) ;TASK HEADER ACCESSIBLE ? SEC ;ASSUME IT WASE BNE 10$ ;IF NE YES .IF DF X$$HDR1 MOV KISAR6,-(SP) ;SAVE MAPPING IN CASE XTRNL HDR ( MOV P.HDR(R4),-(SP) ;GET HEADER ADDRESS BNE 5$ ;IF NE RESIDENT HEADER - MOV P.REL(R4),KISAR6 ;MAP TO EXTERNAL HEADERE- MOV #140000,(SP) ;SET HEADER VIRTUAL ADDRESS)5$: MOV (SP)+,R4 ;RETRIEVE HEADER ADDRESS' MOVB H.CUIC+1(R4),R4 ;GET GROUP NUMBERA+ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING) .IFF ; DF X$$HDRP* MOV P.HDR(R4),R4 ;GET TASK HEADER ADDRESS' MOVB H.CUIC+1(R4),R4 ;GET GROUP NUMBER  .ENDC ; DF X$$HDR2 CALL $SRGEF ;SEARCH FOR GROUP GLOBAL EVENT FLAGS BCS 10$ ;IF CS NOT FOUND+ ADD #6,R1 ;POINT TO FIRST EVENT FLAG WORD $10$: MOV (SP)+,R4 ;RESTORE REGISTERS MOV (SP)+,R0 ;  RETURNH E .PAGE;+/; **-$SRGEF-SEARCH FOR GROUP GLOBAL EVENT FLAGSS; ?; THIS ROUTINE IS CALLED TO SEARCH FOR GROUP GLOBAL EVENT FLAGSM;A ; INPUTS:+;S; R4=GROUP NUMBERU;A ; OUTPUTS:; 5; C=1 IF SPECIFIED GROUP GLOBAL EVENT FLAGS NOT FOUNDE5; C=0 IF SPECIFIED GROUP GLOBAL EVENT FLAGS ARE FOUND;'; R0=ADDRESS OF WORD POINTING TO BLOCKR; R1=ADDRESS OF THE BLOCK;$;- S:$SRGEF::MOV #$GGEF,R1 ;GET ADDRESS OF GROUP GLOBAL EF HEAD.10$: MOV R1,R0 ;SAVE POINTER TO CURRENT BLOCK( MOV (R1),R1 ;GET ADDRESS OF NEXT BLOCK BEQ 20$ ;IF EQ END OF LIST. CMPB G.GRP(R1),R4 ;IS THIS THE CORRECT BLOCK? BEQ 30$ ;IF EQ YES BLO 10$ ;IF LO KEEP SEARCHING4+20$: SEC ;SE00 {ztccccT CARRY TO INDICATE NOT FOUNDS30$: RETURN ;O  .ENDC ; DF G$$GEF .PAGE;+?; **-$CVDVN-CONVERT DEVICE NAME AND LOGICAL UNIT TO UCB ADDRESS ;N3; THIS ROUTINE TAKES A 2 CHARACTER ASCII NAME AND AS4; UNIT NUMBER AND SEARCHES THE DEVICE TABLES TO FIND ; THE CORRESPONDING UCB ADDRESS.; ; INPUTS:B;K%; R0=TWO CHARACTER ASCII DEVICE NAME.O; R1=UNIT NUMBER.Q;D ; OUTPUTS:; ; C=0 IF DEVICE WAS FOUND.; R2=UCB ADDRESS.; R3=DCB ADDRESS.; C=1 IF DEVICE NOT FOUND.;0;- $CVDVN::SAVNR ;SAVE REGISTERSS0 MOV #$SCDVT,-(SP) ;SET UP TO SCAN DEVICE TABLES*10$: CALL @(SP)+ ;GET ADDRESS OF NEXT DCB BCS 100$ ;IF CS END OF LIST4 CLR S$$SPC(SP) ;SET UP TO SKIP THIS DCB IF NO MATCH& CMP D.NAM(R3),R0 ;DEVICE NAMES MATCH? BNE 10$ ;IF NE NOH5 CMPB D.UNIT+1(R3),R1 ;UNIT ASSOCIATED WITH THIS DCB?T BLO 10$ ;IF LO NOV CMPB D.UNIT(R3),R1 ;MAYBE BHI 10$ ;IF HI NO " ADD #S$$SPA,SP ;ABORT DEVICE SCAN& MOV R5,R2 ;COPY ADDRESS OF FIRST UCB MOV R1,R5 ;COPY UNIT NUMBER 4 SUB D.UNIT(R3),R5 ;CALCULATE NUMBER OF UCBS TO SKIP CLC ;INDICATE SUCCESS'20$: DECB R5 ;IS THIS THE CORRECT UCB?E BLT 100$ ;IF LT YESC% ADD D.UCBL(R3),R2 ;POINT TO NEXT UCB  BR 20$ ;CONTINUE SCANT100$: RETURN ; .PAGE;+ ; **-$TICLR-CLEAR TI: ASSIGNMENT;CC; THIS ROUTINE IS CALLED TO CLEAR THE TI: ASSIGNMENT OF THE CURRENTO<; TASK IN CASE THE CURRENT TASK'S TI: IS A VIRTUAL TERMINAL.;S ; INPUTS:T;V; NONE.;V ; OUTPUTS:;D; R0-R3 ARE MODIFIED.V;- C .IF DF V$$TRM S7$TICLR::MOV $TKTCB,R3 ;PICK UP CURRENT TASK TCB ADDRESS * MOV T.UCB(R3),R0 ;PICK UP TI: UCB ADDRESS' MOV (R0),R1 ;POINT TO TI: DCB ADDRESS. CMP D.NAM(R1),#"VT ;IS IT A VIRTUAL TERMINAL? BNE 150$ ;IF NE NO E N .IF DF D$$PAR  MOV KINAR5,-(SP) ;SAVE APR 52 MOV $DRAPR,KINAR5 ;MAP TO THE DIRECTIVE PARTITION T .ENDC R O1 CALL $CVTLN ;CLEAR OUT ANY LUNS ASSIGNED TO VT:L, DECB U.OCNT(R0) ;REDUCE VT: OFFSPRING COUNT2 BNE 140$ ;IF NE THERE ARE OTHER ACTIVE OFFSPRING5 TST U.PTCB(R0) ;IS VT: UNIT MARKED FOR DEALLOCATION?T BNE 140$ ;IF NE NO MOV R3,-(SP) ;SAVE TCB ADDRESSA& CALL $DEAVT ;DEALLOCATE THE VT: UNIT" MOV (SP)+,R3 ;RESTORE TCB ADDRESS140$: ;REFERENCE SYMBOL  F .IF DF D$$PAR F" MOV (SP)+,KINAR5 ;RESTORE MAPPING  .ENDC V R MOV $COPT,R0 ;POINT TO CO: UCBP! CALL $MPLND ;FOLLOW REDIRECTION $ MOV R0,T.UCB(R3) ;ASSIGN TI: TO CO:150$: RETURN ; .IFFE0$TICLR::RETURN ;NOP ROUTINE IF LACK OF SUPPORT .ENDC .PAGE;+,; **-$MPLNE-MAP LOGICAL UNIT NUMBER FOR EXIT#; **-$MPLUN-MAP LOGICAL UNIT NUMBERV;,K; THIS ROUTINE IS CALLED TO VALIDATE A LOGICAL UNIT NUMBER (LUN) AND TO MAPRD; THE LUN INTO A UCB POINTER. IF AN ILLEGAL LUN IS SPECIFIED, THEN AH; DIRECTIVE STATUS OF 'D.RS96' IS RETURNED. ELSE THE LUN IS MAPPED AND A8; POINTER TO THE LUN AND UCB ARE RETURNED TO THE CALLER.; ; INPUTS:C;3; R3=ADDRESS OF THE LUN./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.O,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; ; OUTPUTS:; 4; C=1 IF NO DEVICE IS ASSIGNED TO THE SPECIFIED LUN.; R0=0.3; C=0 IF A DEVICE IS ASSIGNED TO THE SPECIFIED LUN.L&; R0=ADDRESS OF REDIRECTED-TO UCB 5; R2=ADDRESS OF REDIRECTED-TO UCB OR SPOOLED DEVICE H ; @; IN EITHER CASE R1 IS RETURNED AS THE ADDRESS OF THE SECOND LUN2; WORD IN THE TASK HEADER AND R3 IS ADVANCED BY 2.;- .ENABL LSBS($MPLUN::CLR R1 ;GET LOGICAL UNIT NUMBER BISB (R3)+,R1 ; INC R3 ;POINT TO NEXT WORD DEC R1 ;BACK OFF LUN BY 1E CMP R1,H.NLUN(R4) ;LEGAL LUN? BHIS 40$ ;IF HIS NOI$$MPLNE::ASL R1 ;MULTIPLY LUN-1 BY 4 ASL R1 ;0 ADD R4,R1 ;CALCULATE ADDRESS OF FIRST LUN WORD! ADD #H.NLUN+2,R1 ;IN TASK HEADERR SEC ;ASSUME LUN NOT ASSIGNED ( MOV (R1)+,R0 ;GET POINTER TO DEVICE UCB# BEQ 30$ ;IF EQ NO DEVICE ASSIGNED 6$MPLND::MOV R0,R2 ;INITIALIZE SPOOLED DEVICE UCB PTR .5$: CMP R0,U.RED(R0) ;IS DEVICE REDIRECTED?  BEQ 10$ ;IF EQ NO . MOV U.RED(R0),R0 ;GET POINTER TO REDIRECT UCB4 BIT #DV.ISP!DV.OSP,U.CW1(R2) ;SPOOLED DEVICE YET? 00{{ttt tfDATA, BEQ $MPLND ;IF EQ NO, ADVANCE R2 AS WELL ) BR 5$ ;ELSE INHIBIT ADVANCEMENT OF R2 ,010$: MOV (R0),-(SP) ;GET ADDRESS OF DEVICE DCB / ADD #D.NAM,(SP) ;POINT TO DEVICE NAME IN DCB T1 CMP #"TI,@(SP)+ ;TERMINAL INPUT PSEUDO DEVICE? B BNE 20$ ;IF NE NO I* MOV T.UCB(R5),R0 ;GET ADDRESS OF "TI" UCB BR $MPLND ; $20$: CLC ;INDICATE DEVICE ASSIGNED30$: RETURN ; (40$: DRSTS D.RS96 ;SET DIRECTIVE STATUS .DSABL LSBR .PAGE;+*; **-$TKWSE-TASK WAITFOR SIGNIFICANT EVENT;CM; THIS ROUTINE IS CALLED TO EXECUTE A WAITFOR SIGNIFICANT EVENT DIRECTIVE FORD-; THE CURRENT TASK FROM WITHIN THE EXECUTIVE.D;S ; INPUTS:D; ; NONE..;, ; OUTPUTS:;DC; A WAITFOR SIGNIFICANT EVENT DIRECTIVE IS EXECUTED FOR THE CURRENT .; TASK AND A RETURN TO THE CALLER IS EXECUTED.;-6$TKWSE::MOV $TKTCB,R5 ;GET ADDRESS OF CURRENT TASK TCB;+%; **-$DRWSE-WAITFOR SIGNIFICANT EVENTS;RE; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SUSPEND THE EXECUTION OF THEA0; ISSUING TASK UNTIL THE NEXT SIGNIFICANT EVENT.;A ; DPB FORMAT: ;A"; WD. 00 -- DIC(49.),DPB SIZE(1.).; ; INPUTS:N;A9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK..+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.A,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK);+$; C=0 WITH A DIRECTIVE STATUS OF +1.;-7$DRWSE::MOV T.ACTL(R5),R0 ;GET TCB ADDRESS OF NEXT TASKE6 MOV R5,$SIGFL ;SET TASK WAITING FOR SIGNIFICANT EVENT4 CALLR $SETRQ ;FORCE REDISPATCHING OF THE PROCESSOR .END(1.).; ; INPUTS:N;A9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK..+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.A,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK);+$; C=0 WITH A DIRECTIVE STATUS OF +1.;-7$DRWSE::MOV T.ACTL(R5),R0 ;GET TCB ADDRESS OF NEXT TASKE6 MOV R5,$SIGFL ;SET TASK WAITING FOR SIGNIFICANT EVE .TITLE DREXPD .IDENT /05.03/S;$8; COPYRIGHT (C) 1985 BY DIGITAL EQUIPMENT CORPORATION,'; MAYNARD, MASS. ALL RIGHTS RESERVED.E;O>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;  ; T. J. MILLER 8-JUL-76  ;+ ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:U ;N ; M. S. FOX,; J. M. LAWLER; B. S. MCCARTHY;C-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:S;B; J. R. KAUFFMAN; J. M. LAWLER; L. B. MCCULLEY;S-; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:M;O"; B. S. MCCARTHY 5-MAR-87 05.03; .; BM385 -- ADD $DRXP1 LABEL FOR MOVEMENT TO; VECTOR COMMONM; ; ; MACRO LIBRARY CALLSO!;E"%# .MCALL HWDDF$,HDRDF$,PCBDF$,TCBDF$ $$ HWDDF$ ;DEFINE HARDWARE OFFSETS'% HDRDF$ ;DEFINE TASK HEADER OFFSETSN3& PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSY.' TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS()*+;+,; **-$DREXP-EXTEND PARTITION-; F.; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EXTEND THE PARTITION OF THE5/; ISSUING TASK BY A POSITIVE OR NEGATIVE INCREMENT.50;D1; DPB FORMAT:R2;M$3; WD. 00 -- DIC(89.),DPB SIZE(3.).4; WD. 01 -- EXTEND INCREMENT.E5; WD. 02 -- RESERVED.R6;C 7; INPUTS:8;DB9; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.2:; R3=ADDRESS OF THE EXTEND INCREMENT IN THE DPB.1;; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.E.<; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.=;7>; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)H?;T/@; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E*A; DIRECTIVE STATUS OF '+1' IS RETURNED.B;!C; C=1 IF DIRECTIVE IS REJECTED..;D; DIRECTIVE STATUS OF 'D.RS8' IF TASK NOT IN SYSTEM CON-3E; TROLLED PARTITION, TASK IS NOT CHECKPOINTABLED3F; AND SPECIFIED POSITIVE INCREMENT, OR TASK HASS4G; PREALLOCATED CHECKPOINT SPACE AND IS EXTENDING"H; GREATER THAN INSTALLED SIZE.;I; DIRECTIVE STATUS OF 'D.RS88' IF00{ztcccc SPECIFIED INCREMENT ISPJ; INVALID.K;-LMN .IF DF E$$XPROO ; BM385IO .IF DF D$$PAR ; BM385O ; BM385FO$DRXP1:: ; BM385O ; BM385 !O .IFF ; DF D$$PAR ; BM385FO ; BM385IO$DREXP:: ; BM385O ; BM385N"O .ENDC ; DF D$$PAR ; BM385O ; BM385TQ ;**-1 R .IF DF U$$DAS!S$$LIB S6T MOV H.SMAP(R4),-(SP) ;KEEP A COPY OF SUPER AND USERU ;MAPPING MASKSFVW .ENDC ; DF U$$DAS!S$$LIBIXY?Z; FIRST DETERMINE THAT THE TASK HAS NO I/O IN PROGRESS TO ITS83[; TASK REGION, AND DISALLOW DIRECTIVE IF IT DOES.M\6] MOV T.ATT(R5),R0 ;POINT TO ATT DESC FOR TASK REGION@^ TSTB A.IOC-A.TCBL(R0) ;DOES TASK HAVE I/O THROUGH THIS DESCR?_ BEQ 5$ ;IF EQ NO ` DRSTS D.RS83 ;IO IN PROGRESSaAb; NEXT CHECK FOR OTHER TASKS HAVING AN ATTACHMENT DESCRIPTOR TO$Bc; THE ISSUING TASKS TASK REGION. IF THEY DO, WE CAN'T UPDATE THE(d; WINDOW SO WE DISALLOW THE DIRECTIVE.e)f5$: MOV T.PCB(R5),R0 ;POINT TO TASK PCBN2g TST @P.ATT(R0) ;ARE THERE OTHER TASKS ATTACHED?h BEQ 7$ ;IF EQ NO*i DRSTS D.RS17 ;OTHER TASKS ARE ATTACHEDjCk; CALCULATE POTENTIAL NEW SIZE OF TASK REGION BASED ON P.SWSZ ANDSCl; THE INCREMENT IN THE DPB, DEFAULTING TO T.MXSZ IF THE INCREMENTRm; WAS NOT SPECIFIED.n;o7$: MOV T.MXSZ(R5),R1 ;ASSUME RETURNING TO INSTALLED SIZET,p MOV (R3),R3 ;PICK UP SPECIFIED INCREMENT,q BEQ 10$ ;IF EQ DEFAULT TO INSTALLED SIZE(r ADD P.SWSZ(R0),R3 ;CALCULATE NEW SIZEs MOV R3,R1 ;COPY NEW SIZEt?u; VERIFY THAT THE NEW SIZE IS LEGAL BY CHECKING FOR EXCEEDINGO@v; $MXEXT AND IF TASK HAS ALLOCATED CHECKPOINT SPACE IS THE NEWw; SIZE TOO BIG. x/y10$: CMP R1,P.SWSZ(R0) ;TASK INCREASING SIZE?Nz BLO 30$ ;IF LOS NO2{ CMP R1,$MXEXT ;INCREASING PAST CURRENT MAXIMUM?| BHI 45$ ;IF HI YES6} BIT #PS.CHK!PS.FXD,P.STAT(R0) ;TASK CHECKPOINTABLE?~ BEQ 20$ ;IF EQ YES, DRSTS D.RS10 ;TASK IS NOT CHECKPOINTABLE?20$: BIT #T3.CAL,2(R2) ;TASK HAVE CHECKPOINT SPACE ALLOCATED?P BEQ 30$ ;IF EQ NOI= CMP R1,T.MXSZ(R5) ;EXTENDING TO LARGER THAN INSTALLED SIZEM BLOS 30$ ;IF LOS NOC DRSTS D.RS18 ;YES, ILLEGAL>; CALCULATE NEW SIZE FROM VIRTUAL ZERO AND VALIDATE THAT THE#; HEADER STILL FITS IN THE REGIONP 30$: ;A .IF DF P$$LAS* MOV R1,-(SP) ;SAVE NEW TASK REGION SIZE2 SUB T.OFF(R5),R1 ;NORMALIZE TO TASK REGION ZERO .ENDC ; DF P$$LAS0 MOV R1,-(SP) ;COPY NEW SIZE FROM VIRTUAL ZERO$ SWAB (SP) ;CONVERT SIZE TO BYTES RORB (SP) ;I ROR (SP) ; ROR (SP) ; .IF DF P$$LAS* CMP R1,#200 ;NEW SIZE GREATER THAN 4K? BHI 35$ ;IF HI YES .ENDC: CMP (SP),H.HDLN(R4) ;NEW TASK SIZE SMALLER THAN HEADER? BLO 45$ ;IF LO YESD; CHECK THROUGH THE WINDOWS FOR ONE WHICH OVERLAPS THE NEW SIZE OF(; THE TASK WINDOW 0 (OR 1 IF I/D TASK)935$: MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOW BLOCKSM0 MOV (R4)+,R2 ;PICK UP NUMBER OF WINDOW BLOCKS0 TST (R4)+ ;POINT TO TASK LOW VIRTUAL ADDRESS .IF DF U$$DAS8 BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D ? BEQ 36$ ;IF EQ NO3 ADD #W.BLGH,R4 ;YES, POINT TO WINDOW 1 - D SPACE, DEC R2 ;ADJUST WINDOW COUNT 36$: ; .ENDC ; DF U$$DAS .IF DF P$$LAS7 BIT #T3.ROV,T.ST3(R5) ;TASK HAVE RESIDENT OVERLAYS ?N/ BNE 42$ ;IF NE YES, KEEP WINDOW ZERO INTACT) .ENDC ; DF P$$LAS1 MOV (R4),R3 ;PICK UP TASK LOW VIRTUAL ADDRESS ! ASL R3 ;CONVERT TO 32W BLOCKSK ROL R3 ; ROLB R3 ;. SWAB R3 ;6 ADD R1,R3 ;CALC HIGH VIRTUAL ADDRESS IN 32W BLOCKS CMP R3,#2000 ;LEGAL SIZE? BHIS 45$ ;IF HIS NON737$: ADD (R4),(SP) ;CALCULATE NEW TOP VIRTUAL ADDRESS )40$: DEC R2 ;MORE WINDOW BLOCKS TO GO? BLE 50$ ;IF LE NO7 ADD #W.BLGH,R4 ;POINT TO LOW VIRTUAL ADDRESS OF NEXT - TST W.BSIZ-W.BLVR(R4) ;ESTABLISHED WINDOW?T BEQ 40$ ;IF EQ NO  .IF DF U$$DAS> BIT #T4.DSP,T.ST4(R5) ;00"{{ttt tfDATATASK BUILT WITH SEPARATE I/D SPACE ? BEQ 41$ ;IF EQ NOR7 BITB #20,W.BFPD-W.BLVR(R4) ;IS THIS D SPACE WINDOW ?U" BEQ 40$ ;IF EQ NO, DON'T CHECK41$: ;REFERENCE LABEL .ENDC ; DF U$$DAS .IF DF P$$LASC CMP W.BPCB-W.BLVR(R4),R0 ;WINDOW MAPPED TO TASK REGION? (W.BPCB) BEQ 42$ ;IF EQ YES .IF DF S$$LIB- TSTB W.BFPD-W.BLVR(R4) ;SUPERVISOR WINDOW?L BPL 40$ ;IF PL YES .ENDC ; DF S$$LIB% BR 44$ ;CHECK FOR ADDRESS OVERLAP4:42$: MOV 2(R4),R3 ;PICK UP HIGH VIRTUAL ADDRESS (W.BHVR), SUB (R4),R3 ;CALCULATE LENGTH OF MAP - 1# INC R3 ;CALCULATE LENGTH OF MAP4) ASH #-6,R3 ;CONVERT TO 32 WORD BLOCKSR BIC #176000,R3 ;;< ADD W.BOFF-W.BLVR(R4),R3 ;CALCULATE LAST 32W BLOCK MAPPED5 CMP 2(SP),R3 ;REDUCING SIZE CONFLICT WITH WINDOW ?Q BLO 90$ ;IF LO YES944$: BIT #T3.ROV,T.ST3(R5) ;IS TASK RESIDENT OVERLAID ?I4 BNE 40$ ;IF NE YES, UNCHANGED VIRTUAL ADDRESSING .ENDC* CMP (SP),(R4) ;VIRTUAL ADDRESS OVERLAP? BLOS 40$ ;IF LOS NOD45$: BR 90$ ;ILLEGAL SIZE50$: TST (SP)+ ;CLEAN STACK8; CHECK TO SEE IF TASK REGION CAN BE EXTENDED IN PLACE .IF DF P$$LAS- MOV (SP)+,R1 ;RESTORE NEW TASK REGION SIZEA .ENDC ; DF P$$LAS1 MOV P.MAIN(R0),R2 ;POINT TO MAIN PARTITION PCB2 CMP R1,P.SIZE(R2) ;MAIN PARTITION LARGE ENOUGH? BHI 90$ ;IF HI NOL6 MOV R1,P.SWSZ(R0) ;SET SWAP SIZE FOR TASK PARTITION. CLR R4 ;INITIALIZE END OF HOLE CALCULATION8 MOV P.SUB(R0),R3 ;POINT TO NEXT SUBPAR AFTER TASK PAR BNE 60$ ;IF NE THERE IS ONE(+ MOV R2,R3 ;ELSE POINT TO MAIN PARTITIONA+ ADD P.SIZE(R3),R4 ;CALCULATE END OF HOLE60$: ADD P.REL(R3),R4 ;(3  MOV P.REL(R0),R3 ;CALCULATE END OF DESIRED SPACE;  ADD R1,R3 ;)  CMP R3,R4 ;WILL EXTEND WORK IN PLACE?   BLOS 70$ ;IF LOS YES F; TASK REGION COULD NOT BE EXTENDED IN PLACE - ATTEMPT TO CHECKPOINT0; SO THAT WE CAN BRING TASK IN AT ITS NEW SIZE# CALL $SETRT ;FORCE RESCHEDULINGP& MOV T.PCB(R5),R1 ;POINT TO TASK PCB .IF DF A$$CNT< BIS #BF.XTK,$ACNFE ;SET FLAG SO CHECKPOINT IS NOT COUNTED .ENDC ;A$$CNT( CALL $ICHKP ;INITIATE THE CHECKPOINT, MOV T.PCB(R5),R0 ;POINT TO TASK PCB AGAIN8 BIT #PS.CKP,P.STAT(R0) ;WAS THE CHECKPOINT INITIATED? BEQ 65$ ;IF EQ NO  3! TALLY$ B.CKEX,XA$$CP ;COUNT AN EXTEND CHECKPOINTN"# .IF DF U$$DAS!S$$LIBT$,% TST (SP)+ ;CLEAN MAPPING WORDS OFF STACK&' .ENDC ; DF U$$DAS!S$$LIBH( ) RETURN ;P**+; DIRECTIVE RETURN FOR INVALID INCREMENT,-1.90$: DRSTS D.RS84 ;INVALID INCREMENT SPECIFIEDS$/ ;(PLACED HERE TO KEEP BRANCHES 0 ;ALIVE)I12@3; ATTEMPTING TO CHECKPOINT TASK REGION FAILED. RESET SWAP SIZE4; AND RETURN DIRECTIVE STATUSS51665$: MOV P.SIZE(R0),P.SWSZ(R0) ;RESET SWAP SIZE67 DRSTS D.RS1 ;POOL OR CHECKPOINT FILE ALLOC FAILURE8A9; IF THE TASK REGION IS DECREASING IN SIZE, CALL $NXTSK ON EXITSC:; FROM THIS DIRECTIVE TO INSURE REALLOCATION OF NEWLY FREED SPACEI;/<70$: CMP R1,P.SIZE(R0) ;DECREASING TASK SIZE?D= BHIS 71$ ;IF HIS NOR>? .IF DF U$$DAS!S$$LIBC@%A MOV (SP),-(SP) ;COPY MAPPING MASKS0B MOV #$NXTSK,2(SP) ;INSURE THAT PARTITION WILLC ;BE REALLOCATEDDE .IFF ; DF U$$DAS!S$$LIBF:G MOV #$NXTSK,-(SP) ;INSURE PARTITION WILL BE REALLOCATEDHI .ENDC ; DF U$$DAS!S$$LIBAJKLAM; IF THE TASK HAS I/O IN PROGRESS TO OTHER THAN THE TASK REGIONE=N; SET THE MAPPING CHANGE BIT. THIS COMPENSATES FOR POSSIBLER#O; UNMAPPING OF I/O STATUS BLOCKS.RP:Q TSTB T.IOC(R5) ;DOES TASK HAVE I/O? (MUST BE IN COMMON)R BEQ 71$ ;IF EQ NO7S BIS #T3.MPC,T.ST3(R5) ;SET MAPPING BIT DUE TO SHRINKST71$:U;+V; ** W A R N I N G **BW;LX; SPM HOOKPOINT NUMBER 10.Y;$+Z; DO NOT CHANGE THE INSTRUCTION FOLLOWINGI[; LABEL WITHOUT CHECKING SPM\;-]-^$SPH10==. ;SPM CHANGES THE INSTRUCTION AT !_ ;THE LOCATION OF THIS LABELA`*a MOV R1,P.SIZE(R0) ;EXTEND TASK IN PLACEbcCd; IF THE00*{ztcccc TASK WAS BUILT WITH RESIDENT OVERLAYS, WE DO NOT ATTEMPT 5e; TO CHANGE THE MAPPING OF ANY OF THE TASKS WINDOWSBfg .IF DF P$$LASh6i BIT #T3.ROV,T.ST3(R5) ;TASK HAVE RESIDENT OVERLAYS?-j BNE 80$ ;IF NE YES, DO NOT CHANGE MAPPINGPkl .ENDCmn=o; SET UP TO UNMAP CURRENT TASK WINDOW (0, OR 1 IF I/D TASK) p$q MOV $SAHPT,R1 ;GET HEADER ADDRESS5r MOV H.WND(R1),R1 ;POINT TO NUMBER OF WINDOW BLOCKSOst .IF DF U$$DASu3v BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH I/D SPACEFw BEQ 73$ ;IF EQ NOH1x ADD #W.BLGH,R1 ;YES, POINT TO WINDOW 1 INSTEADGyz .ENDC ; DF U$$DAS{6|73$: MOVB W.BFPD+2(R1),R3 ;PICK UP FIRST PDR ADDRESS}9~; LOOP TO UNMAP CURRENT CONTEXT OF TASK WINDOW (0 OR 1) !74$: CLR (R3)+ ;UNMAP NEXT PDR .IF DF U$$DAS( CMP #UDSDR0+2,R3 ;DATA SPACE WINDOW ? BLOS 7405$ ;IF LOS YES8 BITB $BTMSK-UINDR0-2(R3),1(SP) ;USER D SPACE MAPPED ? BNE 741$ ;IF NE NO. CLR UDSDR0-UINDR0-2(R3) ;UNMAP USER D SPACE .ENDC .IF DF S$$LIB: BITB $BTMSK-2-UINDR0-2(R3),(SP) ;SUPER D SPACE MAPPED ? BNE 741$ ;IF NE NO2 CLR SDSDR0-UINDR0-2(R3) ;UNMAP SUPER DATA SPACE .ENDC .IF DF U$$DAS% BR 741$ ;SKIP D SPACE WINDOW CODE(C7405$: BICB $BTMSK-UDSDR0-2(R3),1(SP) ;INDICATE USER D NOT MAPPED2: BITB $BTMSK-2-UDSDR0-2(R3),(SP) ;SUPER D SPACE MAPPED ? BNE 741$ ;IF NE NO2 CLR SDSDR0-UDSDR0-2(R3) ;UNMAP SUPER DATA SPACE .ENDC ; DF U$$DAS5741$: DECB W.BNPD+2(R1) ;ANY MORE APRS TO PROCESS ? BNE 74$ ;IF NE YES?; SETUP NEW WINDOW AND PREPARE TO REMAP APRS INTO NEW CONTEXTR>; IF THIS IS A USER I/D SYSTEM, WE MUST RE-ESTABLISH POINTER8; TO WINDOW 0 SINCE $MAPTK WILL RE-ADJUST THE POINTER. .IF DF U$$DAS/ MOV $SAHPT,R1 ;GET ADDRESS OF CURRENT HEADERB5 MOV H.WND(R1),R1 ;POINT TO NUMBER OF WINDOW BLOCKS .ENDC ; DF U$$DAS( CALL $MAPTK ;MAP TASK ADDRESS WINDOW/ MOV P.REL(R0),R3 ;CALCULATE FIRST APR OFFSETB .IF DF P$$LAS ADD W.BOFF-W.BLPD(R1),R3 ;E .ENDC' MOV (R1),R2 ;PICK UP LAST PDR IMAGEE) MOVB -(R1),R4 ;PICK UP NUMBER OF PDR'SM+ MOVB -(R1),R1 ;PICK UP FIRST PDR ADDRESS 3; LOOP TO SET UP APRS FOR NEW TASK WINDOW CONTEXT .75$: MOV R3,UINAR0-UINDR0(R1) ;LOAD NEXT PAR% MOVB R2,(R1)+ ;SET ACCESS NEXT PDR % MOVB #177,(R1)+ ;SET SIZE NEXT PDR; .IF DF U$$DAS( CMP #UDSDR0+2,R1 ;DATA SPACE WINDOW ? BLOS 755$ ;IF LOS YESA8 BITB $BTMSK-UINDR0-2(R1),1(SP) ;USER D SPACE MAPPED ? BNE 76$ ;IF NE NO.. MOV R3,UDSAR0-UINDR0-2(R1) ;LOAD USER D PAR2 MOV -2(R1),UDSDR0-UINDR0-2(R1) ;LOAD USER D PDR .ENDC ; DF U$$DAS .IF DF S$$LIB4 BITB $BTMSK-2-UINDR0-2(R1),(SP) ;SUPER D MAPPED ? BNE 76$ ;IF NE NOU/ MOV R3,SDSAR0-UINDR0-2(R1) ;LOAD SUPER D PARC3 MOV -2(R1),SDSDR0-UINDR0-2(R1) ;LOAD SUPER D PDR; .IF DF U$$DAS$ BR 76$ ;SKIP D SPACE WINDOW CODE?755$: BISB $BTMSK-UDSDR0-2(R1),1(SP) ;INDICATE D SPACE MAPPEDU: BITB $BTMSK-2-UDSDR0-2(R1),(SP) ;SUPER D SPACE MAPPED ? BNE 76$ ;IF NE NOS/ MOV R3,SDSAR0-UDSDR0-2(R1) ;LOAD SUPER D PAR 3 MOV -2(R1),SDSDR0-UDSDR0-2(R1) ;LOAD SUPER D PDR$ .ENDC ; DF U$$DAS .IFTF ; DF S$$LIB%76$: ADD #200,R3 ;ADVANCE APR BASE0 DEC R4 ;MORE TO GO?  BNE 75$ ;IF NE YES MOV R2,-(R1) ;SET LAST PDR  .IF DF U$$DAS# BIT #20,R1 ;DATA SPACE WINDOW ?  BNE 78$ ;IF NE YES0 BITB $BTMSK-UINDR0(R1),1(SP) ;USER D MAPPED ? BNE 80$ ;IF NE NO(0 MOV R2,UDSDR0-UINDR0(R1) ;SET LAST USER D PDR .ENDC ; DF U$$DAS .IFT ; DF S$$LIB 2 BITB $BTMSK-2-UINDR0(R1),(SP) ;SUPER D MAPPED ? BNE 80$ ;IF NE NO$1 MOV R2,SDSDR0-UINDR0(R1) ;SET LAST SUPER D PDRA .ENDC .IF DF U$$DAS' BR 80$ ;SKIP DATA SPACE WINDOW CODEM=78$: BITB $BTMSK-2-UDSDR0(R1),(SP) ;SUPER DATA SPACE MAPPEDT BNE 80$ ;IF NE NON1 MOV R2,SDSDR0-UDSDR0(R1) ;SET LAST SUPER D PDRR .ENDC002{3{ttt tfDATA ; DF U$$DAS) ; CLEANUP STACK AND EXIT FROM DIRECTIVE(   80$: ;REFERENCE LABEL  .IF DF U$$DAS& MOV $SAHPT,R1 ;POINT TO TASK HEADER6 MOV (SP)+,H.SMAP(R1) ;RESTORE D SPACE MAP IN HEADER .IFF ; DF U$$DAS1 .IF DF S$$LIB( TST (SP)+ ;CLEAN MAP BYTES OFF STACK .ENDC ; DF S$$LIB .ENDC ; DF U$$DAS  RETURN ;(  .ENDC!"# .END BNE 80$ ;IF NE NON1 MOV R2,SDSDR0-UDSDR0(R1) ;SET LAST SUPER D PDRR .ENDC .TITLE VTDRVF .IDENT /04.00/ F; ; COPYRIGHT (c) 1983, 1985 BY(; DIGITAL EQUIPMENT CORPORATION, MAYNARD'; MASSACHUSETTS. ALL RIGHTS RESERVED..;CA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDPA; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSEEA; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS A; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORVA; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO ANDS1; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED. ; A; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTAA; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;SA; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFM<; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;R;T; MODIFIED FOR VERSION 2 BY:;A; D. R. DONCHIN ;R; MODIFIED FOR VERSION 2.1 BY:;E; D. R. DONCHIN 11-MAR-83Y;H$; DD167 -- FIX PROBLEMS WITH IO.RPR; $; Modified for RSX-11M-PLUS V3.0 by:; ; J. C. Franzini 12-May-85 04.00&; JCF255 -- validate size of transfer;E;S; VIRTUAL TERMINAL DRIVER.;M;+E; THE VIRTUAL TERMINAL DRIVER IS PRIMARILY INTENDED FOR A PARENT TASKSC; TO SIMULATE TERMINAL I/O FOR AN OFFSPRING TASK ACTIVATED WITH THENF; SPAWN DIRECTIVE. THIS SIMULATION TAKES PLACE VIA A VIRTUAL TERMINALA; UNIT WHOSE UNIQUE DATA STRUCTURES (DCB AND UCB) ARE DYNAMICALLY.E; CREATED WITH THE CREATE VIRTUAL TERMINAL DIRECTIVE. ONE COMMON SCB ); IS USED FOR ALL VIRTUAL TERMINAL UNITS..; G; THE VIRTUAL TERMINAL DRIVER EMPLOYS THE UC.QUE BIT TO RECEIVE ALL I/OSC; PACKETS DIRECTLY FROM THE QUEUE I/O DIRECTIVE AS THE REQUESTS ARESE; QUEUED. OFFSPRING READ AND WRITE REQUESTS ARE QUEUED TO THE COMMONAD; SCB AND DEQUEUED ONE BY ONE, BASED ON ATTACHMENT OF THE DEVICE ANDA; THE PRESENCE OF OTHER REQUESTS. EACH TIME AN OFFSPRING READ ORRD; WRITE IS DEQUEUED, THE PARENT TASK RECEIVES AN AST AT ITS INPUT ORD; OUTPUT AST ENTRY POINT. THE PARENT TASK IS THEN EXPECTED TO ISSUEB; A COMPLEMENTARY WRITE OR READ REQUEST TO SIMULATE A TERMINAL I/O ; TRANSFER.V;LD; ONLY OFFSPRING TASKS MAY ATTACH THE VIRTUAL TERMINAL UNIT. PARENTD; REQUESTS ARE ALWAYS SERVICED IN SPITE OF ATTACHMENT OF THE VIRTUAL; TERMINAL UNIT.;EF; INTERMEDIATE BUFFERING OF OFFSPRING I/O REQUESTS AND STOPPING OF THEE; OFFSPRING TASK IS PERFORMED WHEN POSSIBLE (OFFSPRING TASK IS CHECK-EA; POINTABLE AND CAN CURRENTLY DEQUEUE AN AST). WHEN INTERMEDIATETC; BUFFERING IS NOT PERFORMED, DATA TRANSFERS OCCUR DIRECTLY BETWEENR; OFFSPRING AND PARENT BUFFERS.T; @; SUCCESSFUL COMPLETION OF PARENT I/O REQUESTS RESULTS IN IS.SUCE; RETURNED IN THE FIRST WORD OF THE I/O STATUS BLOCK AND THE COUNT OFPG; BYTES ACTUALLY TRANSFERRED IN THE SECOND WORD. THE FIRST WORD OF THEFC; OFFSPRING STATUS IS PASSED IN THE CORRESPONDING PARENT REQUEST INKD; THE THIRD PARAMETER WORD OF THE DPB. THE SECOND WORD IS THE COUNTB; OF BYTES ACTUALLY TRANSFERRED. IN BOTH CASES THE COUNT OF BYTESF; ACTUALLY TRANSFERRED IS EQUAL TO THE SMALLER OF THE COUNTS SPECIFIED%; IN THE PARENT OR OFFSPRING REQUEST.L;-;F; LOCAL MACRO DEFINITIONSS;  S6 .MCALL DCBDF$, PKTDF$, SCBDF$, TCBDF$, UCBDF$, TTSYM$. DCBDF$ ;DEFINE DEVICE CONTROL BLOCK SYMBOLS2 PKTDF$ ;DEFINE I/O PACKET AND AST BLOCK SYMBOLS. SCBDF$ ;DEFINE STATUS CONTROL BLOCK SYMBOLS, TCBDF$ ;DEFINE TASK CONTROL BLOCK SYMBOLS3 UCBDF$ ,,TTDEF ;DEFINE UNIT CONTROL BLOCK SYMBOLST, TTSYM$ ;DEFINE TERMINAL DEPENDENT SYMBOLS00:{ztcccc;S,; DEFINE THE TERMINAL FUNCTION SUPPORT WORDS;O(TSP1 = F1.BUF ! F1.RPR ! F1.UTB ! F1.VBFTSP2 = F2.SCH ! F2.GCH ;A; DRIVER DISPATCH TABLE; C* .WORD VTDEA ;BUFFER DEALLOCATION ROUTINE DDT$ VT,,NONE,,,NEW ;I ; TERMINAL CHARACTERISTICS TABLE;DMCTAB:* .BYTE TC.TTP, 377, U.CW3+1 ;TERMINAL TYPE= .BYTE TC.SCP, U2.CRT/400, U.CW2+1 ;TERMINAL IS A SCOPE (CRT)B< .BYTE TC.SMR, U2.LWC, U.CW2 ;UPPER-CASE CONVERSION DISABLED. .BYTE TC.FDX, U3.FDX, U.CW3 ;FULL DUPLEX MODE .BYTE 0 ;TERMINATOR .EVEN;+8; **-VTINI-VIRTUAL TERMINAL DRIVER INITIATOR ENTRY POINT;VB; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE EACH TIME AD; PARENT OR OFFSPRING REQUEST IS ISSUED (UC.QUE IS SET). PARENT I/OC; REQUESTS ARE ALWAYS SERVICED IMMEDIATELY, NORMALLY RESULTING IN ATF; $BLXIO TRANSFER OF DATA AND THE COMPLETION OF THE PARENT REQUEST ANDH; THE CORRESPONDING OFFSPRING REQUEST. OFFSPRING REQUESTS ARE INITIALLYB; QUEUED AND THEN DEQUEUED ONE AT A TIME WHEN POSSIBLE. AN AST ISD; DECLARED IN THE PARENT TASK WHENEVER AN OFFSPRING READ OR WRITE IS ; DEQUEUED.I; ; INPUTS:R;I; R1 = ADDRESS OF I/O PACKET; R4 = ADDRESS OF SCBA; R5 = ADDRESS OF UCB ;U-; VIRTUAL TERMINAL I/O REQUEST PACKET FORMAT:E;S"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK.O@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.(; WD. 04 -- VIRTUAL TERMINAL UCB ADDRESSB; WD. 05 -- I/O FUNCTION CODE (IO.ATT, IO.DET, IO.RLB, OR IO.WLB).0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.=; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000).I3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. *; WD. 12 -- RELOCATION BIAS OF I/O BUFFER.B; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER (DISPLACEMENT +140000).(; WD. 14 -- CHARACTER COUNT OF TRANSFER.;; WD. 15 -- VFC BYTE (OFFSPRING)/OFFSPRING STATUS (PARENT).U; WD. 16 -- UNUSED.-0; WD. 17 -- STORES ALLOCATED BUFFER (OFFSPRING).9; WD. 20 -- STORES AST CONTROL BLOCK ADDRESS (OFFSPRING). 7; WD. 21 -- STORES PCB OF OFFSPRING BUFFER (OFFSPRING).-;-;T3; VALIDATE PARENT I/O REQUEST AND PERFORM TRANSFER.1;  T .ENABL LSBF=VTINI: CLR I.PRM+16(R1) ;CLEAR PCB PTR (TASK IS STOPPED FLAG)E+ MOVB I.FCN+1(R1),R2 ;PICK UP FUNCTION CODER MOV R1,R3 ;COPY PACKET ADDRESS. CMP I.TCB(R1),U.PTCB(R5) ;PARENT I/O REQUEST? BNE 40$ ;IF NE NOF/ CLR I.PRM+12(R1) ;CLEAR ALLOCATED BUFFER FIELD ) MOV R1,-(SP) ;SAVE PARENT PACKET ADDRESSG2 CLR -(SP) ;INIT SECOND WORD OF I/O STATUS RETURN3 ADD #I.PRM+6,R1 ;POINT TO DESIRED OFFSPRING STATUSR- CMPB R2,#IO.RLB/256. ;READ OR WRITE LOGICAL?E BLOS 30$ ;IF LOS YES;10$: CALL VTCHR ;PROCESS SF.GMC/SF.SMC/IO.GTS IF SPECIFIEDB4 BNE 115$ ;IF NE, ILLEGAL FUNCTION ISSUED BY PARENT+ BIT #1,-6(R1) ;RETURN STATUS TO OFFSPRING?T BNE 20$ ;IF NE YES;P4; PROCESS A PARENT ENABLE/DISABLE BUFFERING REQUEST.;I1 BIS #U3.DBF,U.CW3(R5) ;ASSUME BUFFERING DISABLED(" BIT #2,-6(R1) ;DISABLE BUFFERING? BNE 100$ ;IF NE YESW9 CMP U.CW4(R5),#V$$TLM ;BUFFER SIZE GREATER THAN MAXIMUM?D2 BHI 110$ ;IF HI YES, ILLEGAL TO ENABLE BUFFERING( BIC #U3.DBF,U.CW3(R5) ;ENABLE BUFFERING" BR 100$ ;COMPLETE PARENT REQUEST;G?; PROCESS A PARENT RETURN STATUS WITHOUT DATA TRANSFER REQUEST.A;T020$: BIT #U3.FDX,U.CW3(R5) ;IN FULL DUPLEX MODE? BNE 23$ ;IF NE YES- TST U.RPKT(R5) ;IS AN OFFSPRING READ ACTIVE?E BNE 25$ ;IF NE YES- BR 27$ ;HOPE FOR AN OFFSPRING WRITE REQUESTT423$: BIT #2,-6(R1) ;RETURN STATUS TO OFFSPRING READ? BNE 27$ ;IF NE NOT=25$: MOV U.RPKT(R5),R3 ;CORRESPONDING OFFSPRING READ REQUEST?I BEQ 116$ ;IF EQ NO, ERRORB# MOV -(R1),R0 ;GET SPECIFIED STATUSG MOV -(R1),R1 ;L BR 90$ ;COMPLETE BOTH PACKETSS>27$: MOV U.WPKT(R5),R3 ;CORRESPONDING OFFSPRING WRITE REQUEST?& BEQ 116$ ;IF EQ NO, ILLEGAL FUNCTION/ MOV -(R1),R0 ;PICK UP DESIRED OFFSPRING STATUSI MOV -(R1),R1 ;A BR 90$ ;COMPLETE BOTH PACKETS-30$: BNE 45$ ;IF NE REQUEST I00B{3{ttt tfDATAS WRITE LOGICAL;B ; PROCESS A PARENT READ REQUEST.;I: MOV U.WPKT(R5),R3 ;GET OFFSPRING WRITE I/O PACKET ADDRESS& BEQ 116$ ;IF EQ THERE IS NONE, ERROR" MOV R3,-(SP) ;SAVE PACKET ADDRESS) ADD #I.PRM+6,R3 ;POINT PAST LENGTH FIELD+ MOV (R1),-(SP) ;SAVE OFFSPRING STATUS WORDW' MOV R3,R2 ;REVERSE PACKETS FOR $BLXIO MOV R1,R3 ;1 MOV R2,R1 ; BR 50$ ;40$: BR 120$ ;BRANCH AIDP;R!; PROCESS A PARENT WRITE REQUEST. ;=45$: MOV U.RPKT(R5),R3 ;GET OFFSPRING READ I/O PACKET ADDRESS & BEQ 116$ ;IF EQ THERE IS NONE, ERROR" MOV R3,-(SP) ;SAVE PACKET ADDRESS) ADD #I.PRM+6,R3 ;POINT PAST LENGTH FIELDS+ MOV (R1),-(SP) ;SAVE OFFSPRING STATUS WORDV;(J; MAKE THE TRANSFER LENGTH THE LESSOR OF THE PARENT AND OFFSPRING LENGTHS.;,.50$: MOV -(R3),R0 ;PICK UP SIZE OF ONE REQUEST/ CMP R0,-(R1) ;IS IT LARGER THAN OTHER REQUEST?R BLOS 60$ ;IF LOS NO0, MOV (R1),R0 ;PICK UP SMALLEST REQUEST SIZE(60$: MOV R0,4(SP) ;SAVE SIZE OF TRANSFER;,9; COPY THE DATA FROM THE WRITE BUFFER TO THE READ BUFFER.E;H1 CLR -(SP) ;INITIALLY CLEAR BUFFER TO DEALLOCATES1 MOV 12-4(R3),R4 ;PICK UP ALLOCATED OUTPUT BUFFER( BEQ 65$ ;IF EQ THERE IS NONE! MOV R4,R3 ;SET OUTPUT APR6 BIASE- MOV #140004,R4 ;SET OUTPUT APR6 DISPLACEMENTG BR 70$ ;365$: MOV -(R3),R4 ;PICK UP OUTPUT APR6 DISPLACEMENTR' MOV -(R3),R3 ;PICK UP OUTPUT APR6 BIASR470$: MOV 12-4(R1),R2 ;PICK UP ALLOCATED INPUT BUFFER BEQ 75$ ;IF EQ THERE IS NONE' MOV R2,(SP) ;SET TO DEALLOCATE BUFFERT- CLR 12-4(R1) ;CLEAR BUFFER POINTER IN PACKETR MOV R2,R1 ;SET INPUT APR5 BIAS, MOV #120004,R2 ;SET INPUT APR5 DISPLACEMENT BR 80$ ;275$: MOV -(R1),R2 ;PICK UP INPUT APR6 DISPLACEMENT& MOV -(R1),R1 ;PICK UP INPUT APR6 BIAS, SUB #20000,R2 ;CONVERT TO APR5 DISPLACEMENT+80$: CALL $BLXIO ;TRANSFER BUFFER CONTENTS + MOV (SP)+,R0 ;PICK UP BUFFER TO DEALLOCATET BEQ 85$ ;IF EQ THERE IS NONE& CALL VTDEA ;DEALLOCATE OUTPUT BUFFER 7; ,; COMPLETE OFFSPRING AND PARENT I/O PACKETS.;O E+85$: MOV (SP)+,R0 ;PICK UP OFFSPRING STATUS 4 MOV (SP)+,R3 ;RETRIEVE OFFSPRING I/O PACKET ADDRESS( MOV (SP),R1 ;PICK UP BYTES TRANSFERRED(90$: CALL VTFIN ;COMPLETE OFFSPRING I/O/100$: MOV #IS.SUC&377,R0 ;SET PARENT I/O STATUSR BR 111$ ;#2110$: MOV #IE.BAD&377,R0 ;SET BAD PARAMETER STATUS-111$: MOV (SP)+,R1 ;PICK UP BYTES TRANSFERRED , MOV (SP)+,R3 ;PICK UP ADDRESS OF I/O PACKET$ CALL $IOFIN ;FINISH THE PARENT I/O* BR VTPKT ;BRANCH TO DEQUEUE NEXT REQUEST=115$: MOV #IE.DUN&377,R0 ;ASSUME DEVICE NOT ATTACHABLE STATUSP1 CMPB R2,#IO.DET/256. ;ATTACH OR DETACH FUNCTION?N BLOS 111$ ;IF LOS YESV? MOV #IE.IFC&377,R0 ;MUST BE IO.RPR WHICH IS ILLEGAL FOR PARENTO BR 111$ ;>116$: MOV #IE.IFC&377,R0 ;ASSUME ILLEG FUNC (NO OFFSPRING REQ)# BITB #US.BSY,U.STS(R5) ;UNIT BUSY?A BEQ 111$ ;IF EQ NO2 MOV #IE.ABO&377,R0 ;OFFSPRING REQUEST WAS ABORTED$ BICB #US.BSY,U.STS(R5) ;UNBUSY UNIT BR 111$ ;N ; 7; BEGIN OFFSPRING PACKET PROCESSING BY QUEUEING PACKET.1;  1120$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTIONP+ CALL VTCHR ;SET CHARACTERISTICS FUNCTION?C, BEQ 160$ ;IF EQ YES, ILLEGAL FOR OFFSPRING8 CMPB #IO.RPR/256.,I.FCN+1(R3) ;IS IT AN IO.RPR REQUEST?2 BNE 125$ ;IF NE NO, ONLY ONE BUFFER TO DEAL WITH; L; AN IO.RPR REQUEST REQUIRES TWO BUFFERS. THE EXECUTIVE ONLY ADDRESS CHECKSM; AND INCREMENTS THE PARTITION I/O COUNT FOR THE FIRST ONE (THE READ BUFFER).SK; NOW WE PERFORM THOSE FUNCTIONS FOR THE SECOND BUFFER (THE PROMPT BUFFER). I; SINCE THE PROMPT IS OUTPUT BEFORE THE READ IS INITIATED, THE I/O PACKET F; PARAMETERS ARE SWITCHED TO PLACE THE PROMPT BUFFER PARAMETERS FIRST.;O: MOV I.PRM+10(R3),R0 ;GET VIRTUAL ADDRESS OF PROMPT BUFFER. MOV I.PRM+12(R3),R1 ;GET PROMPT BUFFER LENGTH BEQ 155$ ;IF EQ ERRORP- CALL $CKBFR ;ADDRESS CHECK READ ONLY BUFFERO' CALL $RELOC ;RELOCATE VIRTUAL ADDRESSP0 MOV I.PRM+14(R3),I.PRM+6(R3) ;INSERT OUTPUT VFC7 MOV I.PRM+4(R3),I.PRM+14(R3) ;COPY INPUT BUFFER LENGTHU8 MOV I.PRM+12(R3),I.PRM+4(R3) ;COPY OUTPUT BUFFER LENGTH8 MOV I.PRM(R3),I.PRM+10(R3) ;COPY INPUT BUFF00J{ztccccER APR6 BIAS= MOV I.PRM+2(R3),I.PRM+16(R3) ;COPY INPUT BUFFER DISPLACEMENT1 MOV R1,I.PRM(R3) ;INSERT OUTPUT BUFFER APR6 BIASP6 MOV R2,I.PRM+2(R3) ;INSERT OUTPUT BUFFER DISPLACEMENT$ MOV R3,R1 ;COPY I/O PACKET POINTER:125$: MOV U.SCB(R5),R0 ;POINT TO OFFSPRING PACKET LISTHEAD( CALL $QINSP ;INSERT PACKET BY PRIORITY (; C; PROPAGATE DRIVER BY ATTEMPTING TO DEQUEUE NEXT OFFSPRING REQUEST.L;T 4VTPKT: MOV #VTACC,R2 ;SET ACCEPTANCE ROUTINE ADDRESS6 CALL $GSPKT ;ATTEMPT TO DEQUEUE AN OFFSPRING REQUEST" BCC 131$ ;IF CC ONE WAS DEQUEUED RETURN ;U%131$: MOV R1,R3 ;COPY PACKET ADDRESSI4 MOV #IE.ABO&377,R0 ;ASSUME UNIT HAS BEEN ELIMINATED7 TST U.PTCB(R5) ;VIRTUAL TERMINAL UNIT BEEN ELIMINATED?A BEQ 160$ ;IF EQ YES 5 BIT #U3.RPR,U.CW3(R5) ;PROCESSING AN IO.RPR REQUEST?  BEQ VTCHK ;IF EQ NOB;OI; PROCESS AN OFFSPRING IO.RPR REQUEST. THE PROMPT BUFFER PARAMETERS HAVEQL; ALREADY BEEN SWITCHED WITH THE INPUT BUFFER PARAMETERS IN THE I/O PACKET. N; THE FUNCTION CODE IS NOW CHANGED TO IO.WLB SINCE THE PROMPT IS OUTPUT BEFOREN; THE READ BEGINS. WHEN THE PROMPT COMPLETES, THE PARAMETERS WILL BE SWITCHED0; BACK AND THE FUNCTION CODE CHANGED TO IO.RLB. ;U9 MOVB #IO.WLB/256.,I.FCN+1(R3) ;CHANGE FUNCTION TO IO.WLBB;3M; CHECK FOR VALID SIZE. SINCE WE ARE USING $BLXIO, THE TRANSFER CANNOT CROSS /; APR BOUNDARIES, SO THE MAXIMUM SIZE IS 4K-63.B; VTCHK:+ MOV #IE.BAD&377,R0 ;ASSUME SIZE IS TOO BIGP- CMP #20000-63.,I.PRM+4(R3) ;IS SIZE TOO BIG?  BLO 160$ ;IF LO, YES;TC; CHECK THAT THE PARENT DECLARED AN AST FOR THE REQUESTED FUNCTION.T;P9 MOV #IE.EOF&377,R0 ;END OF FILE RETURNED IF NO INPUT ASTT( MOV U.IAST(R5),R4 ;ASSUME INPUT REQUEST7 CMPB I.FCN+1(R3),#IO.RLB/256. ;IS IT AN INPUT REQUEST?L BEQ 140$ ;IF EQ YESA) BLO 135$ ;IF LO IT IS AN OUTPUT REQUESTR2 MOV U.AAST(R5),R4 ;ELSE IT IS AN ATTACH OR DETACH3 BEQ 210$ ;IF EQ PARENT DOES NOT WANT AST, SUCCESS ' BR 145$ ;ELSE BRANCH TO QUEUE THE AST,3135$: MOV U.OAST(R5),R4 ;PICK UP OUTPUT AST ADDRESSS) MOV #IS.SUC,R0 ;SUCCESS IF NO OUTPUT AST &140$: TST R4 ;DESIRED FUNCTION LEGAL? BEQ 160$ ;IF EQ NO O;IF; ALLOCATE AND FILL IN AST CONTROL BLOCK TO NOTIFY PARENT TASK THAT AN!; OFFSPRING REQUEST WAS DEQUEUED.I;N P0145$: MOV #A.PRM+6,R1 ;PICK UP SIZE OF AST BLOCK! CALL $ALOCB ;ALLOCATE AST BLOCKV' BCC 180$ ;IF CC SUCCESSFUL ALLOCATIONE1150$: MOV #IE.NOD&377,R0 ;INSUFFICIENT POOL SPACEU& BR 160$ ;COMPLETE REQUEST WITH ERROR0155$: MOV #IE.SPC&377,R0 ;ILLEGAL BUFFER ADDRESS.160$: CLR R1 ;CLEAR SECOND WORD OF I/O STATUS'170$: CALL VTFIN ;COMPLETE I/O REQUEST /175$: BR VTPKT ;BRANCH TO DEQUEUE NEXT REQUESTA5180$: MOV R0,@R3 ;SAVE POINTER TO AST BLOCK AT I.LNK TST (R0)+ ;SKIP OVER LINK WORD1 MOV R1,(R0)+ ;SET SIZE OF BLK TO RELEASE (A.CBL)F7 MOV #10.*2,(R0)+ ;SET # OF BYTES ON USER STACK (A.BYT) - MOV R4,(R0)+ ;SET PARENT AST ADDRESS (A.AST)O3 MOV #3,(R0)+ ;SET NUMBER OF AST PARAMETERS (A.NPR)T MOV (R5),R1 ;POINT TO VT: DCBI> MOVB D.UNIT(R1),(R0)+ ;SET UNIT NUMBER AS FIRST PARAM (A.PRM)= MOVB I.FCN(R3),(R0)+ ;ADD SUBFUNCTION IN HIGH BYTE (A.PRM+1)2 MOV I.PRM+4(R3),R4 ;PICK UP BYTE COUNT OF REQUEST4 MOV R4,(R0)+ ;SET BYTE COUNT AS 2ND PARAM (A.PRM+2); MOV I.PRM+6(R3),(R0) ;SET VERTICAL FORMAT AS 3RD (A.PRM+4)B7 CMPB I.FCN+1(R3),#IO.ATT/256. ;IS IT ATTACH OR DETACH? # BLO 220$ ;IF LO NO, READ OR WRITE  BNE 190$ ;IF NE IT IS DETACH0 MOV I.TCB(R3),R1 ;PICK UP OFFSPRING TCB ADDRESS8 MOV T.NAM+2(R1),(R0) ;INSERT 2ND WORD OF NAME (A.PRM+4)7 MOV T.NAM(R1),-(R0) ;INSERT 1ST WORD OF NAME (A.PRM+2)( BR 200$ ;BRANCH TO QUEUE AST,190$: CLR (R0) ;CLR AST PARAMETER (A.PRM+4)( CLR -(R0) ;CLR AST PARAMETER (A.PRM+2).200$: MOV R3,-(SP) ;SAVE ADDRESS OF I/O PACKET CALL 230$ ;QUEUE THE AST BLOCK, MOV (SP)+,R3 ;RESTORE ADDRESS OF I/O PACKET6210$: MOV #IS.SUC&377,R0 ;SET SUCCESSFUL RETURN STATUS BR 160$ ;COMPLETE REQUEST  I;E*; ATTEMPT TO BUFFER OFFSPRING I/O REQUEST.;A E4220$: CLR I.PRM+12(R3) ;CLEAR ALLOCATED BUFFER FIELDC BIT #U3.DBF!U3.RPR,U.CW3(R5) ;BUFFERI00R{3{ttt tfDATANG DISABLED OR PROMPT OUTPUT?  BNE 230$ ;IF NE YESA5 CALL $TSTBF ;SEE IF INTERMEDIATE BUFFERING POSSIBLE-1 BCS 230$ ;IF CS I/O NOT BUFFERED (NOT CKPTABLE)S, MOV R4,R1 ;PICK UP BYTE COUNT FOR TRANSFER8 ADD #4+77,R1 ;INCLUDE LINK AND SIZE WORDS, AND ROUND UP; ASH #-6,R1 ;CONVERT TO NUMBER OF SEC POOL BLOCKS REQUIREDS2 CALL $ALSEC ;ALLOCATE BUFFER FROM SECONDARY POOL' BCC 225$ ;IF CC ALLOCATION SUCCESSFUL24 CLR I.PRM+16(R3) ;CLEAR INTERMEDIATE BUFFERING FLAG BR 230$ ;.:225$: MOV R0,I.PRM+12(R3) ;SET POINTER TO ALLOCATED BUFFER MOV R0,KISAR6 ;MAP BUFFER$ MOV #4,@#140002 ;COUNT HEADER WORDS ADD R4,@#140002 ;SET BYTE COUNT6 CMPB I.FCN+1(R3),#IO.WLB/256. ;IS IT A WRITE REQUEST? BNE 229$ ;IF NE NO" MOV R3,-(SP) ;SAVE PACKET ADDRESS- MOV I.PRM(R3),R1 ;GET PHYSICAL BUFFER OFFSET 1 MOV I.PRM+2(R3),R2 ;SET SOURCE APR6 DISPLACEMENTT, SUB #20000,R2 ;CONVERT TO APR5 DISPLACEMENT& MOV R0,R3 ;SET DESTINATION APR6 BIAS! MOV R4,R0 ;SET COUNT FOR $BLXIOL2 MOV #140004,R4 ;SET DESTINATION APR6 DISPLACEMENT/ CALL $BLXIO ;TRANSFER OFFSPRING OUTPUT BUFFERF% MOV (SP)+,R3 ;RESTORE PACKET ADDRESSS3229$: CALL $INIBF ;INITIATE INTERMEDIATE BUFFERING, .;/F; QUEUE THE PARENT AST CONTROL BLOCK. PARENT AST ROUTINES ARE ENTEREDC; WITH THE FOLLOWING THREE WORDS ON THE STACK FOR OFFSPRING READ ORI; WRITE:; ); 0(SP)=UNIT NUMBER, I/O SUBFUNCTION CODE,'; 2(SP)=BYTE COUNT OF OFFSPRING REQUEST,3; 4(SP)=VERTICAL FORMAT WORD FROM OFFSPRING QIO DPBT;RC; PARENT AST ROUTINES ARE ENTERED WITH THE FOLLOWING THREE WORDS ONB$; THE STACK FOR AN OFFSPRING ATTACH:;); 0(SP)=UNIT NUMBER, I/O SUBFUNCTION CODE$); 2(SP)=FIRST WORD OF OFFSPRING TASK NAMER*; 4(SP)=SECOND WORD OF OFFSPRING TASK NAME;OC; PARENT AST ROUTINES ARE ENTERED WITH THE FOLLOWING THREE WORDS ONS$; THE STACK FOR AN OFFSPRING DETACH:;R); 0(SP)=UNIT NUMBER, I/O SUBFUNCTION CODEI ; 2(SP)=0 ; 4(SP)=0C;T 3230$: MOV U.PTCB(R5),R0 ;PICK UP PARENT TCB ADDRESS MOV @R3,R1 ;POINT TO AST BLOCK( CALLR $QASTT ;QUEUE AST TO PARENT TASK R;WD; CANCEL I/O ENTRY POINT. ONLY OFFSPRING REQUESTS MAY BE CANCELLED,8; SINCE PARENT REQUESTS ARE ALWAYS SERVICED IMMEDIATELY.;K M:VTCAN: MOV U.RPKT(R5),R3 ;PICK UP CURRENT OFFSPRING PACKET+ BEQ 250$ ;IF EQ NO READ REQUEST IS QUEUEDT' CMP I.TCB(R3),R1 ;TCB ADDRESSES MATCH?I BNE 250$ ;IF NE NO MOV R1,-(SP) ;SAVE TCB ADDRESSD) MOV #IE.ABO&377,R0 ;SET FOR ABORT STATUSO$ CLR R1 ;ZERO SECOND WORD OF STATUS" CALL VTFIN ;COMPLETE I/O REQUEST" MOV (SP)+,R1 ;RESTORE TCB ADDRESS* TST U.PTCB(R5) ;HAS UNIT BEEN ELIMINATED?& BEQ 250$ ;IF EQ YES, LEAVE IT UNBUSY< BISB #US.BSY,U.STS(R5) ;KEEP UNIT BUSY UNTIL PARENT REQUEST8250$: MOV U.WPKT(R5),R3 ;GET ADDRESS OF OFFSPRING PACKET1260$: BEQ 175$ ;IF EQ NO WRITE REQUEST IS QUEUEDE' CMP I.TCB(R3),R1 ;TCB ADDRESSES MATCH?T BNE VTRET ;IF NE NO ) MOV #IE.ABO&377,R0 ;SET FOR ABORT STATUS#$ CLR R1 ;ZERO SECOND WORD OF STATUS" CALL VTFIN ;COMPLETE I/O REQUEST* TST U.PTCB(R5) ;HAS UNIT BEEN ELIMINATED?& BEQ 260$ ;IF EQ YES, LEAVE IT UNBUSY< BISB #US.BSY,U.STS(R5) ;KEEP UNIT BUSY UNTIL PARENT REQUEST ;UH; POWERFAIL, ONLINE/OFFLINE, AND TIMEOUT ENTRY POINTS ARE SIMPLY RETURNS;. TVTPWF: ;NO POWERFAIL ROUTINE /VTKRB: ;NO ONLINE/OFFLINE CONTROLLER ROUTINES)VTUCB: ;NO ONLINE/OFFLINE UNIT ROUTINEM VTOUT: CLC ;NO TIMEOUT ROUTINEVTRET: RETURN ;S F .DSABL LSBU ;R@; VTCHR-GET/SET CHARACTERISTICS AND GET TERMINAL SUPPORT ROUTINE;A; THIS ROUTINE IS CALLED TO PROCESS THE SF.GMC, SF.SMC AND IO.GTSLF; FUNCTIONS. IF NONE OF THOSE FUNCTIONS WERE SPECIFIED, AN INDICATIONA; IS RETURNED IN THE Z-BIT AS TO WHETHER THE FUNCTION WAS IO.STC. E; NO RETURN TO CALLER IS MADE FOR THE FUNCTIONS THIS ROUTINE HANDLES. ; ; INPUTS:I;C0; R1=I/O PACKET ADDRESS FROM OFFSPRING OR PARENT; R2=I/O FUNCTION CODE$; R5=ADDRESS OF VIRTUAL TERMINAL UCB;S ; OUTPUTS:;S7; IF FUNCTION IS IO.STC, CC-Z SET UPON RETURN TO CALLERN>; IF FUNCTION IS SF.GMC, SF.SMC OR IO.GTS, NO RETURN TO CALLER(; ELSE, CC-Z CLEAR UPON RETU00Z{ztccccRN TO CALLER;N2VTCHR: CMPB R2,#IO.STC/256. ;IO.STC FUNCTION CODE? BNE VTRET ;IF NE NOB' CMP I.FCN(R3),#IO.STC ;IO.STC EXACTLY?  BEQ VTRET ;IF EQ YES" TST (SP)+ ;REMOVE RETURN ADDRESS* CMP I.TCB(R3),U.PTCB(R5) ;PARENT REQUEST? BNE 10$ ;IF NE NOF CMP (SP)+,(SP)+ ;CLEAN STACKT)10$: MOV I.PRM(R3),R0 ;GET BUFFER ADDRESSU& MOV I.PRM+2(R3),R1 ;GET BUFFER LENGTH1 CALL $ACHCK ;ADDRESS CHECK BUFFER, WORD ALIGNEDT BCS 110$ ;IF CS ERRORI, CALL $RELOC ;CONVERT TO ADDRESS DOUBLEWORD MOV R1,KISAR6 ;MAP BUFFER# MOV R2,R1 ;COPY ADDRESS OF BUFFER $ MOV R2,-(SP) ;AND SAVE IT FOR LATER CMP I.FCN(R3),#IO.GTS ;IO.GTS?E BNE 20$ ;IF NE NO ;Q; PROCESS IO.GTS;M MOV #IS.SUC,R0 ;SET SUCCESS8 MOV #TSP1,(R1)+ ;STORE FIRST WORD OF SUPPORT PARAMETERS, CMP I.PRM+2(R3),#2 ;WANTS MORE THAN 1 WORD? BEQ 160$ ;IF EQ NO# MOV #TSP2,(R1)+ ;STORE SECOND WORDE BR 160$ ;DONEK#20$: CMP I.FCN(R3),#SF.SMC ;SF.SMC?T BNE 70$ ;IF NE NOR;; PROCESS SF.SMC;T930$: CALL 200$ ;GET NEXT CHARACTERISTIC FROM USER BUFFER1 MOV R2,-(SP) ;SAVE BITMASKM5 CMPB -1(R1),#TC.FDX ;TRYING TO SET FULL DUPLEX MODE?G BNE 40$ ;IF NE NO$; CMP I.TCB(R3),U.PTCB(R5) ;PARENT TASK MAKING THAT REQUEST?S2 BNE 120$ ;IF NE NO, OFFSPRING NOT ALLOWED, ERROR140$: MOVB @R1,R0 ;GET NEW VALUE FROM USER BUFFERH"50$: ASRB R2 ;SHIFT BITMASK RIGHT BCS 60$ ;CARRY - JUMPO ROLB R0 ;SHIFT NEW VALUE LEFTC BR 50$ ;LOOP60$: ROLB R2 ;PICK UP LOST BITN% COMB R2 ;INVERT RIGHT ADJUSTED MASKC# BITB R2,(R1)+ ;NEW VALUE IN RANGE?O BNE 130$ ;IF NE NO BICB (SP)+,@R4 ;CLEAR OLD VALUE BISB R0,@R4 ;SET NEW VALUE! BR 30$ ;GET NEXT CHARACTERISTIC$#70$: CMP I.FCN(R3),#SF.GMC ;SF.GMC?A BEQ 90$ ;IF EQ YES% MOV #IE.IFC&377,R0 ;ILLEGAL FUNCTION  BR 115$ ;RETURN THE ERROR,;G; PROCESS SF.GMC;R*80$: INC R1 ;POINT TO NEXT CHARACTERISTIC990$: CALL 200$ ;GET NEXT CHARACTERISTIC FROM USER BUFFER2 MOVB @R4,@R1 ;STORE CURRENT VALUE IN USER BUFFER MOVB R2,R0 ;COPY BITMASK COMB R0 ;INVERT IT$ BICB R0,@R1 ;CLEAR IRRELEVANT BITS#100$: ASRB R2 ;SHIFT BITMASK RIGHTV BCS 80$ ;CARRY - JUMPN0 RORB @R1 ;SHIFT VALUE IN USER BUFFER RIGHT TOO BR 100$ ;LOOPF;;; ERROR AND EXIT HANDLINGY;(110$: MOV #IE.SPC&377,R0 ;BUFFER PROBLEM-115$: CLR R1 ;RETURN ZERO SECOND STATUS WORDC BR 170$ ;FINISH I/OOD120$: MOV #!,R0 ;ILLEGAL CHARACTERISTIC CODE BR 140$ ;DECLARE ERROR6130$: MOV #!,R0 ;ILLEGAL VALUE-140$: DEC R1 ;BACK UP POINTER IN USER BUFFER@150$: TST (SP)+ ;CLEAN STACK$-160$: SUB (SP)+,R1 ;GET OFFSET IN USER BUFFERR$170$: CALL $IOFIN ;COMPLETE THE I/O+ JMP VTPKT ;TRY TO PROCESS ANOTHER REQUEST;;RG; ROUTINE TO RETRIEVE THE NEXT CHARACTERISTIC IN THE USER BUFFER, CHECK1B; IT FOR VALIDITY, AND RETURN THE CORRESPONDING BITMASK AND OFFSET;2%200$: MOV #IS.SUC,R0 ;ASSUME ALL DONEL$ SUB #2,I.PRM+2(R3) ;ANY MORE TO DO? BMI 150$ ;IF MI NO' MOVB (R1)+,R0 ;GET NEXT CHARACTERISTICV BEQ 120$ ;IF EQ BAD CODE5 MOV #MCTAB-2,R4 ;GET ADDRESS OF CHARACTERISTIC TABLE$>210$: CMPB (R4)+,(R4)+ ;UPDATE TO NEXT CHARACTERISTIC IN TABLE4 TSTB (R4) ;ANY MORE CHARACTERISTICS LEFT TO CHECK? BEQ 120$ ;IF EQ NO, ERRORN4 CMPB R0,(R4)+ ;FIND A MATCH BETWEEN USER AND TABLE? BNE 210$ ;IF NE NO, CLR R2 ;BE CAREFUL OF POSSIBLE SIGN EXTEND3 BISB (R4)+,R2 ;GET BITMASK FOR THIS CHARACTERISTICN2 MOVB (R4),R4 ;GET OFFSET FOR THIS CHARACTERISTIC( ADD R5,R4 ;MAKE POINTER TO BYTE IN UCB RETURN ;B;0; I/O PACKET ACCEPTANCE ROUTINE,;;4VTACC: CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ FUNCTION? BNE 10$ ;IF NE NOC* TST U.RPKT(R5) ;READ ALREADY IN PROGRESS?' BNE 50$ ;IF NE YES, CAN'T PROCESS NOW02 BIT #U3.RPR,U.CW3(R5) ;READ W/PROMPT IN PROGRESS?' BNE 50$ ;IF NE YES, CAN'T PROCESS NOW , BIT #U3.FDX,U.CW3(R5) ;IN FULL DUPLEX MODE?$ BNE 5$ ;IF NE YES, CAN PROCESS NOW: TST U.WPKT(R5) ;WRITE FUNCTION IN PROGRESS? (CLEARS CC-C)' BNE 50$ ;IF NE YES, CAN'T PROCESS NOWBB5$: MOV R1,U.RPKT(R5) ;SAVE I/O PACKET ADDRESS (LEAVES CC-C CLEAR)00b{h{ttt tfDATA RETURN ;P310$: CMPB #IO.WLB/256.,I.FCN+1(R1) ;WRITE FUNCTION?  BNE 20$ ;IF NE NOK+ TST U.WPKT(R5) ;WRITE ALREADY IN PROGRESS?I' BNE 50$ ;IF NE YES, CAN'T PROCESS NOWR2 BIT #U3.RPR,U.CW3(R5) ;READ W/PROMPT IN PROGRESS?' BNE 50$ ;IF NE YES, CAN'T PROCESS NOWX, BIT #U3.FDX,U.CW3(R5) ;IN FULL DUPLEX MODE?% BNE 15$ ;IF NE YES, CAN PROCESS NOW59 TST U.RPKT(R5) ;READ FUNCTION IN PROGRESS? (CLEARS CC-C) ' BNE 50$ ;IF NE YES, CAN'T PROCESS NOWRC15$: MOV R1,U.WPKT(R5) ;SAVE I/O PACKET ADDRESS (LEAVES CC-C CLEAR)0 RETURN ;L;20$: CMPB #IO.RPR/256.,I.FCN+1(R1) ;READ W/PROMPT FUNCTION?T BNE 40$ ;IF NE NOA" TST U.RPKT(R5) ;READ IN PROGRESS? BNE 30$ ;IF NE YES, STOP SCAN#1 TST U.WPKT(R5) ;WRITE IN PROGRESS? (CLEARS CC-C)5 BNE 30$ ;IF NE YES, STOP SCANX+ MOV R1,U.WPKT(R5) ;SAVE I/O PACKET ADDRESS?6 BIS #U3.RPR,U.CW3(R5) ;SHOW READ W/PROMPT IN PROGRESS RETURN ;I830$: ADD #G$$SPA,SP ;ADD CONSTANT TO STACK TO ABORT SCAN40$: RETURN ;5)50$: SEC ;CAN'T PROCESS THE REQUEST NOWS RETURN ;C;E*; INTERMEDIATE BUFFER DEALLOCATION ROUTINE;N R VTDEA: MOV R0,KISAR6 ;MAP BUFFER MOV @#140002,R1 ;GET BYTE COUNT/ ADD #77,R1 ;ROUND UP TO NEXT 32 WORD BOUNDARYA8 ASH #-6,R1 ;CONVERT TO NUMBER OF SECONDARY POOL BLOCKS= CALLR $DESEC ;DEALLOCATE INTERMEDIATE SECONDARY POOL BUFFERC ;R+; VTFIN-FINISH VIRTUAL TERMINAL I/O REQUESTM;IH; THIS ROUTINE IS CALLED TO FINISH ALL OFFSPRING REQUESTS TO THE VIRTUALH; TERMINAL DRIVER (EXCEPT SF.GMC/SF.SMC/IO.GTS) AND PERFORM ANY CLEANUP.;R ; INPUTS:;N; R0=FIRST WORD OF I/O STATUSR; R1=SECOND WORD OF I/O STATUS); R3=ADDRESS OF I/O PACKET TO BE FINISHEDE$; R5=ADDRESS OF VIRTUAL TERMINAL UCB; ; OUTPUTS:;; NONE.R;; V*VTFIN: CMP R3,U.WPKT(R5) ;OFFSPRING WRITE? BNE 5$ ;IF NE NO& CLR U.WPKT(R5) ;SHOW NO WRITES ACTIVE) BIT #U3.RPR,U.CW3(R5) ;READ WITH PROMPT?  BEQ 7$ ;IF EQ NO7 MOV I.PRM+10(R3),I.PRM(R3) ;SET INPUT BUFFER APR6 BIASE< MOV I.PRM+16(R3),I.PRM+2(R3) ;SET INPUT BUFFER DISPLACEMENT6 MOV I.PRM+14(R3),I.PRM+4(R3) ;SET INPUT BUFFER LENGTH* CLR I.PRM+16(R3) ;CLEAR BUFFERED I/O FLAG9 MOVB #IO.RLB/256.,I.FCN+1(R3) ;CHANGE FUNCTION TO IO.RLBE0 MOV R3,U.RPKT(R5) ;CHANGE IO.RPR INTO AN IO.RLB; BIC #U3.RPR,U.CW3(R5) ;FORGET WE WERE PROCESSING AN IO.RPRB% TSTB R0 ;ANY ERROR DETECTED SO FAR? BMI 6$ ;IF MI YES, END IT HERE; JMP VTCHK ;JUMP BACK TO HANDLE THE READ PORTION OF IO.RPR(&5$: CMP R3,U.RPKT(R5) ;OFFSPRING READ? BNE 10$ ;IF NE NO,(6$: CLR U.RPKT(R5) ;SHOW NO READS ACTIVE'7$: TST I.PRM+16(R3) ;WAS TASK STOPPED?T BEQ 10$ ;IF EQ NOI1 INC I.PRM+16(R3) ;SET SECONDARY POOL BUFFER FLAG/- CALLR $QUEBF ;COMPLETE BUFFERED I/O REQUESTM(10$: CALLR $IOFIN ;COMPLETE I/O REQUEST B .END#U3.RPR,U.CW3(R5) ;FORGET WE WERE PROCESSING AN IO.RPRB% TSTB R0 ;ANY ERROR DETECTED SO FAR? BMI 6$ ;IF MI YES, END IT HERE; JMP VTCHK ;JUMP BACK TO HANDLE THE READ PORTION OF IO.RPR(&5$: CMP R3,U.RPKT(R5) ;OFFSPRING READ? BNE 10$ ;IF NE NO,(6$: CLR U.RPKT(R5) ;SHOW NO READS ACTIVE'7$: TST I.PRM+16(R .TITLE DSDRVO .IDENT /12.08/ ;Q5; COPYRIGHT (C) 1981 BY DIGITAL EQUIPMENT CORPORATION/; ALL RIGHTS RESERVED.;B<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; P. J. BEZEREDI 19-SEP-79;O; PREVIOUSLY MODIFIED BY:,;D; P. J. BEZEREDI; R. T. PERRON;A; MODIFIED BY:;O; B. S. MCCARTHY 6-AUG-85 12.085;O/; BM368 -- ADD CONDITIONAL SKIP OF FIRST DRIVEP!; NOT READY ERROR FOR POWERFAILS;.,; RH11/RH70-RS03/RS04 FIXED HEAD DISK DRIVER;; MACRO LIBRARY CALLS ;I .MCALL HWDDF$,PKTDF$/$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;B; EQUATED SYMBOLS ;Y%ADR=10 ;ADDRESS BITS SETUP (1=YES)E'SEL=20 ;PORT SELECT WAIT (1=WAITING)RETRY=8. ;ERROR RETRY COUNTTRE=40000 ;TRANSFER ERRORR'RSCS1=0 ;CONTROL AND STATUS REGISTERTRSWC=2 ;WORD COUNT REGISTERRSBA=4 ;BUS ADDRESSRSDA=6 ;TRACK/SECTOR ADDRESSR"RSCS2=10 ;SECOND STATUS RE00j{ztccccGISTER!RSDS=12 ;DRIVE STATUS REGISTERRSER=14 ;ERROR REGISTER&RSAS=16 ;ATTENTION SUMMARY REGISTER; ; LOCAL DATA;S=; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLER NUMBER)L;7RTTBL: .BLKW R$$JS1 ;RETRY COUNT FOR CURRENT OPERATIONR=PRMSV: .BLKW R$$JS1*5 ;PARAMETER SAVE AREA FOR ERROR RECOVERY= ;AND WRITE CHECK FUNCTION=;;; DRIVER DISPATCH TABLEE;( DDT$ DS,R$$JS1 ;GENERATE DISPATCH TABLE;+C; **-DSINI-RH11/RH70-RS03/RS04 FIXED HEAD DISK CONTROLLER INITIATORI;RB; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/OH; REQUEST IS QUEUED AND AT THE END OF A PREVOIUS I/O OPERATION TO PROPA-G; GATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED UNIT IS NOT BUSY,$H; THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST, ELSE A RETURNH; TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THENI; THE NEXT I/O OPERATION IS INITIATED FOLLOWED BY A RETURN TO THE CALLER.;* ; INPUTS:/;04; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIATED.;H ; OUTPUTS:;NA; IF THE SPECIFIED UNIT IS NOT BUSY AND AN I/O REQUEST IS WAITING @; TO BE PROCESSED, THEN THE NEXT REQUEST IS DEQUEUED AND THE I/O; OPERATION IS INITIATED. ;- .ENABL LSBI7DSINI: GTPKT$ DS,R$$JS1 ;GET NEXT I/O PACKET TO PROCESSX; 1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:.;F'; R1=ADDRESS OF THE I/O REQUEST PACKET.-; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.B; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK. 4; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIATED.;F;; RH11-RS03/RS04 FIXED HEAD DISK I/O REQUEST PACKET FORMAT: ; "; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK.N@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.5; WD. 04 -- FIRST LUN WORD IN REQUESTORS TASK HEADER. ; WD. 05 -- I/O FUNCTION CODE.0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.=; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000)./3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.A; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER.V+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.T-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED. ; WD. 15 -- NOT USED.E8; WD. 16 -- BITS <0:7> = HIGH LBN, BITS <8:15> NOT USED.#; WD. 17 -- LOW LBN OF I/O REQUEST.U<; WD. 20 -- RELOCATION BIAS OF REGISTER BLOCK ELSE NOT USED.;; WD. 21 -- REGISTER BLOCK ADDRESS (DISPLACEMENT + 140000).-;/( BICB #ADR!SEL,U.CW2+1(R5) ;CLEAR FLAGS% MOV #RETRY,RTTBL(R3);SET RETRY COUNTT$ CALL $VOLVD ;VALIDATE VOLUME VALID BCS 10$ ;IF CS WE FAILED TST R0 ;TRANSFER FUNCTION? BMI DSUBMP ;IF MI YES TST I.PRM+2(R1) ;SIZE THE DISK? BPL 10$ ;IF PL NOD3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERH( MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS, MOVB U.UNIT(R5),RSCS2(R2) ;SELECT THE UNIT. MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS MOVB #111,(R2) ;CLEAR THE DRIVE+ BIT #10000,RSCS2(R2);DOES THE DRIVE EXIST?U BEQ 5$ ;IF EQ YESA2 MOVB #TRE/256.,RSCS1+1(R2) ;CLEAR THE CONTROLLER* MOV #IE.SZE&377,R0 ;UNABLE TO SIZE DEVICE) BICB #US.VV,U.STS(R5);RESET VOLUME VALID$ CALL $RLCN ;RELEASE THE CONTROLLER BR 10$ ;EXIT35$: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASKN- MOV #IS.SUC&377,R0 ;SET SUCCESSFUL OPERATION; BR 50$ ;10$: CALL $IODON ;FINISH I/O2& BR DSINI ;GET NEXT PACKET TO PROCESS;RC; NOW REQUEST THE CONTROLLER AND DETERMINE IF THE UNIBUS ADDRESS IS0D; ALREADY IN THE FORMAT FOR THE MASSBUS CONTROLLER OR THE UNIBUS MAP/; FOR 22-BIT PROCESSORS WITHOUT RH CONTROLLERS.E;E9DSUBMP: BITB #ADR,U.CW2+1(R5);ADDRESS BITS ALREADY SETUP?V BNE DSINIO ;IF NE YES . BISB #ADR,U.CW2+1(R5);SHOW ADDRESS BITS SETUP3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER#' MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESS/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?S BEQ 20$ ;IF EQ NO : BIT #KS.MBC,K.STS(R1) ;YES, IS THIS A 22-BIT CONTROLLER? BNE 30$ ;IF NE YES' CALL $STMAP ;S00r{h{ttt tfDATAETUP UNIBUS MAP ADDRESSU220$: ASL U.BUF(R5) ;SHIFT BITS <4:5> TO BITS <8:9> ASL U.BUF(R5) ;...L ASL U.BUF(R5) ;...  ASL U.BUF(R5) ;...;/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?  BEQ 30$ ;IF EQ NO2% CALL $MPUBM ;MAP UNIBUS TO TRANSFERR;D<; CONVERT THE I/O FUNCTION CODE TO IT'S HARDWARE EQUIVALENT.;E230$: MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS7 CMP #IO.WCK!IQ.UMD,I.FCN(R1) ;DIAGNOSTIC WRITE CHECK?R BNE 40$ ;IF NE NO2, BISB #151,U.BUF(R5) ;YES, SET FUNCTION CODE BR 60$ ;040$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION2 BISB #171,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTION6 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?$ BHIS 55$ ;IF HIS FUNCTION IS LEGAL,50$: MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS) MOVB U.UNIT(R5),RSCS2(R2) ;SELECT DRIVEC CALLR DSFIN1 ;FINISH UPL%55$: BEQ 60$ ;IF EQ FUNCTION IS READV5 SUB #10,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTIONI;O; VALIDATE AND CONVERT LBN. ; -60$: CALL $BLKCK ;CHECK LOGICAL BLOCK NUMBER CMP #2,U.PRM+2(R5) ;RS04 DRIVE? BEQ 70$ ;IF EQ YES ASL R0 ;MULTIPLY RS03 BLOCK)170$: ASL R0 ;CONVERT TO SECTOR AND TRACK ADDRESSI' MOV R0,I.PRM+12(R3) ;SAVE DISK ADDRESS ' MOV S.KRB(R4),R1 ;RETRIEVE KRB ADDRESS@- MOVB K.CON(R1),R1 ;RETRIEVE CONTROLLER INDEXT$ MUL #5,R1 ;SETUP AN INDEX INTO ...' ADD #PRMSV,R1 ;... PARAMETER SAVE AREAQ& MOV U.BUF(R5),(R1)+ ;SAVE PARAMETERS MOV U.BUF+2(R5),(R1)+ ;... MOV U.CNT(R5),(R1)+ ;... MOV I.PRM+10(R3),(R1)+ ;...K MOV I.PRM+12(R3),(R1)+ ;... .DSABL LSB+; $; **-DSINIO-INTIATE AN I/O OPERATION;RB; THIS ROUTINE WILL INITIATE THE DATA TRANSFER OPERATION. AT THIS=; POINT THE CONTROLLER MUST BE REQUESTED FOR A DATA TRANSFER.R;R ; INPUTS: ; ; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCB.;T*DSINIO: MOV @S.KRB(R4),R2 ;GET CSR ADDRESS) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSB( MOVB U.UNIT(R5),RSCS2(R2) ;SELECT UNIT;R9; DETERMINE IF DRIVE'S PORT IS SEIZED BY THIS CONTROLLER.3;R) CLR RSDS(R2) ;ATTEMPT TO SEIZE THE DRIVE( BIT #400,RSDS(R2) ;DID THE DRIVE SEIZE? BNE 5$ ;IF NE YES % MOVB #100,(R2) ;RE-ENABLE INTERRUPTSN0 BISB #SEL,U.CW2+1(R5);SET PORT SELECT WAIT FLAG< MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNT* CALLR $RLCN ;RELEASE CONTROLLER AND EXIT;..; LOAD CONTROLLER REGISTERS FOR DATA TRANSFER.;75$: MOV #TRE!11,(R2) ;CLEAR CONTROLLER AND DRIVE ERRORSR# ADD #RSCS2,R2 ;POINT TO SECOND CSRE- MOV I.PRM+12(R1),-(R2) ;INSERT DISK ADDRESSL. MOV U.BUF+2(R5),-(R2) ;INSERT BUFFER ADDRESS8 MOV U.CNT(R5),-(R2) ;INSERT NUMBER OF BYTES TO TRANSFER! ROR (R2) ;CONVERT TO WORD COUNTB$ NEG (R2) ;MAKE NEGATIVE WORD COUNT" TST -(R2) ;POINT TO CSR REGISTER;(&; TEST FOR DRIVE NOT READY CONDITIONS.;C+ MOV #IE.DNR&377,R0 ;ASSUME DRIVE NOT READYX7 MOV RSDS(R2),R3 ;GET CONTENTS OF DRIVE STATUS REGISTER COM R3 ;COMPLEMENT STATUS ( BIT #10200,R3 ;DRIVE READY AND ON-LINE? BEQ 20$ ;IF EQ YES/ BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP?L BEQ 10$ ;IF EQ NOR9 BITB #US.VV,U.STS(R5);WAS THE VOLUME PREVIOUSLY MOUNTED?M BEQ DSPWF1 ;IF EQ NO( BR DSPWF0 ;YES, WAIT FOR IT TO SPIN UP210$: BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC OPERATION BEQ 15$ ;IF EQ NO. CALLR DSDIAG ;LOG DIAGNOSTIC DRIVE NOT READY15$: ;REFERENCE LABEL .IF DF S2.NRD6 BIT #S2.NRD,S.ST2(R4) ;IS THIS FIRST DRIVE NOT READY?! BNE 16$ ;IF NE NO, GO LOG ERROR06 BIS #S2.NRD,S.ST2(R4) ;INDICATE FIRST DRIVE NOT READY JMP DSPWF1 ;GO DO A RETRYD716$: BIC #S2.NRD,S.ST2(R4) ;CLEAR FIRST DRIVE NOT READYS .ENDC ; DF S2.NRD( CALL $DVERR ;LOG DRIVE NOT READY ERROR CALLR DSFIN ;FINISH UP520$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UPT6 BICB #S3.SPU,S.ST3(R4) ;CLEAR PORT SPINNING UP FLAGS* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS MOV R3,R1 ;COPY KRB ADDRESSB;#$; START THE DATA TRANSFER OPERATION.; ! MTPS #PR5 ;;;DISABLE INTERRUPTS 1 BIT #FE.EXT,$FMASK ;;;22-BIT ADDRESSING ENABLED?E BEQ 30$ ;;;IF EQ NO 7 BIT #KS.MBC,K.STS(R3) ;;;IS THIS A 22-BIT CONTROLLER?  BEQ 30$ ;;;IF EQ NON' ADD K.OFF(R00z{ztcccc3),R1 ;;;POINT TO UCB TABLEE+ MOV KE.RHB(R1),R1 ;;;RETREIVE RHBAE OFFSET0' ADD R2,R1 ;;;FORM AN I/O PAGE ADDRESSP2 MOVB U.BUF+1(R5),(R1);;;SET MEMORY EXTENSION BITS& MOVB U.BUF(R5),(R2) ;;;START FUNCTION BR 40$ ;;;)30$: MOV U.BUF(R5),(R2) ;;;START FUNCTION +40$: CLR S.FRK+2(R4) ;;;INIT FORK INTERLOCK / MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNT 8 BIS #KS.DIP,K.STS(R3) ;;;SET DATA TRANSFER IN PROGRESS- BIS #S2.ACT,S.ST2(R4) ;;;SHOW I/O IS ACTIVEO MTPS #0 ;ALLOW INTERRUPTSN;D<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;I"DSCAN: RETURN ;NOP FOR RS03/RS04;+:; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND>; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT=; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVE;?; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANY A; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESSB; THE UNIT IS ALREADY READY.;-3DSPWF: TSTB S.STS(R4) ;IS THIS UNIT CURRENTLY BUSY?L BEQ DSPWF2 ;IF EQ NO8DSPWF0: MOVB #8.,S.STS(R4) ;WAIT A MAXIMUM OF 32 SECONDS6DSPWF1: MOVB S.ITM(R4),S.CTM(R4) ;4 SECONDS AT A TIME5DSPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UP 7DSPWF3: CALLR $RLCN ;RELEASE CONTROLLER (IF NECESSARY)A;+5; **-$DSINT-RH11-RS03/RS04 FIXED HEAD DISK CONTROLLER ; INTERRUPT SERVICE ROUTINET;-3$DSINT::BR DSFRK ;;;ENTRY POINT FOR DATA TRANSFERSD+ TST S.FRK+2(R4) ;;;ARE INTERRUPTS ALLOWED?. BNE DSCAN ;;;IF NE NO(' CALL $FORK ;;;CREATE A SYSTEM PROCESSD9DSFRK: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERM2 BITB #SEL,U.CW2+1(R5);WAITING FOR PORT TO SELECT? BEQ 5$ ;IF EQ NO2 BICB #SEL,U.CW2+1(R5);CLEAR PORT SELECT WAIT FLAG% JMP DSINIO ;YES, GO DO THE TRANSFERO-5$: MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESSR- MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEXP% MOV U.SCB(R5),R4 ;GET ADDRESS OF SCBF/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERK# MOV @S.KRB(R4),R2 ;GET CSR ADDRESSB( MOVB U.UNIT(R5),RSCS2(R2) ;SELECT UNIT# TSTB S.STS(R4) ;IS THIS UNIT BUSY?R BNE 15$ ;IF NE YES& CLR S.FRK+2(R4) ;RESET FORK INTERLOCK- MOV #TRE!11,(R2) ;CLEAR CONTROLLER AND DRIVEF- BIT #S2.MAD,S.ST2(R4) ;MULTI-ACCESS DEVICE?T BNE 10$ ;IF NE YES. MOVB #100,(R2) ;NO, JUST RE-ENABLE INTERRUPTS( BR DSPWF3 ;RELEASE CONTROLLER AND EXIT&10$: MOVB #113,(R2) ;RELEASE THE DRIVE8 BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED( BR DSPWF3 ;RELEASE CONTROLLER AND EXIT;2+; THE UNIT WAS BUSY. NOW CHECK FOR ERRORS.);S115$: BITB #US.SPU,U.STS(R5) ;ARE WE SPINNING UP?B BNE DSREST ;IF NE YESS) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS!7 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION EXECUTED?R BNE DSDIAG ;IF NE YEST BIT #60000,(R2) ;ANY ERRORS?1 BEQ DSWCHK ;IF EQ NO. MOV RSWC(R2),R0 ;GET NEGATIVE WORDS REMAINING# ASL R0 ;CONVERT TO NEGATIVE BYTESE6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED* SUB #512.,R0 ;SUBTRACT OUT BLOCK IN ERROR) BLE 20$ ;IF LE NO GOOD BYTES TRANSFEREDH2 BIT #S2.EIP,S.ST2(R4) ;ERROR ALREADY IN PROGRESS BEQ 20$ ;IF EQ NO;E:; WE GOT AN ERROR BUT SOME GOOD DATA WAS TRANSFERED. THIS6; INDICATES THAT WE RECOVERED FROM THE PREVIOUS ERROR.;D, CALL DSCALC ;CALCULATE NEW DISK PARAMETERS MOV R2,-(SP) ;SAVE CSR ADDRESSE/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTI/ BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNTC1 MOV #IS.SUC&377,R0 ;THIS RECOVERY WAS SUCCESSFULB+ CALL $FNERL ;FINISH ERROR LOGGING PROCESS2- MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNTE" MOV (SP)+,R2 ;RESTORE CSR ADDRESS#20$: CALL $DVERR ;LOG DEVICE ERRORG- MOV #IE.WCK&377,R0 ;ASSUME WRITE CHECK ERROR ( BIT #4000,RSCS2(R2) ;WRITE CHECK ERROR? BNE DSRTRY ;IF NE YESC/ MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORR0 MOV RSER(R2),R1 ;GET CONTENTS OF ERROR REGISTER BIT #47007,R1 ;HARD ERROR?B BNE 30$ ;IF NE YES! BIT #14000,RSCS2(R2);NEM OR NED?S BNE 30$ ;IF NE YES TST RSCS2(R2) ;DATA LATE ERROR? BPL DSRTRY ;IF PL NO, CALL DSCALC ;YES, CALCULATE NEW PARAMETERS& BR DSRTRY ;RETRY FROM BLOCK IN ERR00{h{ttt tfDATAOR$30$: BIT #4000,R1 ;WRITE LOCK ERROR? BEQ DSFIN ;IF EQ NOR) MOV #IE.WLK&377,R0 ;SET WRITE LOCK ERRORC BR DSFIN ;FINISH I/O;B@; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING REPEATEDA; UNLESS THE REQUEST WAS DIAGNOSTIC. TIMEOUTS ARE USUALLY CAUSED0C; BY POWERFAILURE BUT MAY ALSO BE THE RESULT OF A HARDWARE FAILURE.R;D7DSOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP? BEQ 10$ ;;;IF EQ NO- DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET?B BEQ 10$ ;;;IF EQ YES MTPS #0 ;;;ALLOW INTERRUPTS . CALL $RQCND ;REQUEST CONTROLLER FOR TRANSFER# BR DSREST ;RETRY ENTIRE OPERATIONC,10$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY3 BICB #US.SPU,U.STS(R5) ;;;RESET DRIVE SPINNING UP  MTPS #0 ;;;ALLOW INTERRUPTSI. CALL $RQCND ;REQUEST CONTROLLER FOR TRANSFER* MOV S.KRB(R4),R2 ;GET CURRENT KRB ADDRESS- MOVB K.CON(R2),R3 ;RETREIVE CONTROLLER INDEX # MOV (R2),R2 ;RETREIVE CSR ADDRESS ( MOVB U.UNIT(R5),RSCS2(R2) ;SELECT UNIT! CALL $DVTMO ;LOG DEVICE TIMEOUT 2 BITB #SEL,U.CW2+1(R5);WAITING FOR PORT TO SELECT?) BNE DSFIN1 ;IF NE YES, WE DIDN'T GET ITE2 BCC DSRTRY ;IF CC TIMEOUT DURING NORMAL FUNCTION7DSDIAG: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASK * BR DSFIN ;DIAGNOSTIC PROCESSING COMPLETE;T; RETRY THE CURRENT OPERATION.;E0DSRTRY: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS' BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?N BNE DSFIN ;IF NE YES DEC RTTBL(R3) ;RETRY FUNCTION?V BLE DSFIN ;IF LE NO 'DSREST: MOVB #111,(R2) ;CLEAR THE DRIVEI! CALLR DSUBMP ;RESTART OPERATIONI;F!; TEST FOR WRITE CHECK OPERATION.F; CDSWCHK: BITB #IO.WLC&377,I.FCN(R1) ;WRITE FOLLOWED BY WRITE CHECK?C BNE 10$ ;IF NE YES5 BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED BY MCR?I BEQ DSFIN ;IF EQ NOP)10$: MOVB U.BUF(R5),R1 ;GET LAST FUNCTIONE CMPB #171,R1 ;WAS IT A READ? BEQ DSFIN ;IF EQ YES* CMPB #161,R1 ;WAS LAST FUNCTION A WRITE? BNE DSFIN ;IF NE NOR. MOV #RETRY,RTTBL(R3);REINITIALIZE RETRY COUNT- MOV S.PKT(R4),R1 ;RESTORE I/O PACKET ADDRESSC# MUL #5,R3 ;FORM AN INDEX INTO ...' ADD #PRMSV,R3 ;... PARAMETER SAVE AREAS) MOV (R3)+,U.BUF(R5) ;RESTORE PARAMETERSL MOV (R3)+,U.BUF+2(R5) ;... MOV (R3)+,U.CNT(R5) ;... MOV (R3)+,I.PRM+10(R1) ;...E MOV (R3)+,I.PRM+12(R1) ;...N. MOVB #151,U.BUF(R5) ;SET WRITE CHECK FUNCTION( BR DSREST ;START WRTIE CHECK OPERATION;Q; **-DSFIN-FINISH I/O OPERATIONN;OB; THIS ROUTINE WILL SET THE ACTUAL BYTES TRANSFERED PARAMETER, THEC; ERROR LOGGING RETRY COUNTS AND CALL $IODON. A CHECK WILL BE MADE#A; FOR ANY PENDING ATTENTIONS AND THE CONTROLLER WILL BE RELEASED.A;S ; INPUTS:+;B; R0=SUCCESS/ERROR CODER; R2=ADDRESS OF CONTROLLER CSR; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCB1;;7DSFIN: MOV RSWC(R2),R1 ;GET WORDS REMAINING TO TRANSFER;+ ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFERW6 ADD U.CNT(R5),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED&DSFIN1: MOVB #11,(R2) ;CLEAR THE DRIVE# MOV #TRE,(R2) ;NOW CLEAR THE DRIVEE* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS2 BICB #SEL,U.CW2+1(R5);CLEAR PORT SELECT WAIT FLAG+10$: TSTB RSAS(R2) ;ANY ATTENTIONS PENDING?S BEQ 20$ ;IF EQ NO01 BISB #100,(R2) ;RE-DISPATCH TO INTERRUPT HANDLERR BR 10$ ;TRY AGAIN 020$: BIT #S2.MAD,S.ST2(R4) ;DUAL ACCESS DEVICE? BEQ 30$ ;IF EQ NO 6 BITB #S3.NRL,S.ST3(R4) ;SHOULD WE RELEASE THE DRIVE? BEQ 35$ ;IF EQ YES)30$: MOVB #100,(R2) ;RE-ENABLE INTERRUPTSR BR 40$ ;<35$: BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED7 MOVB #113,(R2) ;RE-ENABLE INTERRUPTS AND RELEASE DRIVE 140$: MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEXT/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNT / BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNTR CALL $RLCN ;RELEASE CONTROLLER" CLR S.FRK+2(R4) ;ALLOW INTERRUPTS# CALL $IODON ;FINISH I/O OPERATION! JMP DSINI ;PROCESS NEXT REQUEST ;S>; THE TRANSFER STOPPED DUE TO A RETRYABLE ERROR CONDITION. WE>; WILL NOW BACKUP THE WORD COUNT, BUS ADDRESS AND TRACK/SECTOR>; ADDRESS BY ONE BLOCK AND RETRY THE TRANSFER FROM THIS POINT.@; THIS IS DONE TO PREVENT THE ERROR CONDITIO00{{{ccccN FROM RECURRING DUE; TO A LONG TRANSFER.2;E5DSCALC: MOV RSWC(R2),R0 ;GET NEGATIVE WORDS REMAININGA* BNE 10$ ;IF NE WE HAD A PARTIAL TRANSFER0 MOV #-1,R0 ;DLT ON LAST WORD, FAKE PARTIAL XFR'10$: ASL R0 ;CONVERT TO NEGATIVE BYTESI6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED- BIC #777,R0 ;GET BLOCKS ACTUALLY TRANSFEREDL5 SUB R0,U.CNT(R5) ;REDUCE BYTES REMAINING TO TRANSFERR* BEQ 30$ ;IF EQ NO MORE BYTES TO TRANSFER3 ADD R0,U.BUF+2(R5) ;UPDATE STARTING BUFFER ADDRESSR0 ADCB U.BUF+1(R5) ;AND THE MEMORY EXTENSION BITS2 BIT #FE.EXT,$FMASK ;IS 22-BIT ADDRESSING ENABLED? BEQ 15$ ;IF EQ NOE+ MOV S.KRB(R4),R1 ;RETRIEVE THE KRB ADDRESS#9 BIT #KS.MBC,K.STS(R1) ;IS THIS A 22-BIT MASSBUS DEVICE?O BNE 15$ ;IF NE YES& ADD K.OFF(R1),R1 ;POINT TO UMR AREA+2) ADD R0,-(R1) ;CALCULATE NEW REAL ADDRESSK ADCB -(R1) ;...E215$: MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS" SWAB R0 ;GET BLOCKS*2 TRANSFERED CMP #2,U.PRM+2(R5) ;RS04 DRIVE? BEQ 20$ ;IF EQ YES ASL R0 ;GET BLOCKS*4-20$: ADD R0,I.PRM+12(R1) ;UPDATE DISK ADDRESSE RETURN ;I430$: ADD R0,U.CNT(R5) ;YES, BACKUP BYTES TO TRANSFER RETURN ;R .ENDVE THE KRB ADDRESS#9 BIT #KS.MBC,K.STS(R1) ;IS THIS A 22-BIT MASSBUS DEVICE?O BNE 15$ ;IF NE YES& ADD K.OFF(R1),R1 ;POINT TO UMR AREA+2) ADD R0,-(R1) ;CALCULATE NEW REAL ADDRESSK ADCB -(R1) ;...E215$: MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS" SWAB R0 ;GET BLOCKS*2 TRANSFERED CMP #2,U.PRM+2(R5) ;RS04 DRIVE? BEQ 20$ ;IF EQ YES ASL R0 ;GET BLOCKS*4C; PREFIX FILE USED DURING UPDATE TO DEFINE DL: CONTROLLER SYMBOLSR$$L11=1 .TITLE KXDRVe .IDENT /0.07/;d; COPYRIGHT (C) 1987 BY); DIGITAL EQUIPMENT CORPORATION, MAYNARDo(; MASSACHUSSETTS. ALL RIGHTS RESERVED.;'5; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY 5; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE5; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE5; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER5; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE-5; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO5; AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED.;(5; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO5; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUEDF5; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ;D6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR 5; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT ISI; NOT SUPPLIED BY DIGITAL.;N; PAUL K. M. WEISS H;O;A;; .02 fix implicit start, use $mppro, fix directive return 1; .03 mods for xxdrv interface, share all memoryF; .04 fix xxdrv returnE!; .05 add vms initiated commandsI; .06 ADD SN$IMP "; .07 add error return for cprcon;T; MACRO LIBRARY CALLSD;T* .MCALL HWDDF$,PKTDF$,SCBDF$,UCBDF$,CPRDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS SCBDF$ ,,1 ;SCB DEFINITIONSF( UCBDF$ ,,1 ;UNIT CONTROL BLOCK OFFSETS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS# CPRDF$ ;CPR SPECIFIC DEFINITIONSWO;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++3;dK; THE FOLLOWING TABLE MUST BE THE FIRST THING IN THE DRIVER. THE EXEC USESdN; A VECTORED ENTRY SYSTEM TO THIS MODULE. ANY CHANGES MADE TO THIS TABLE MUST'; ALSO BE MADE IN THE EXEC MODULE DRSUBL;WO;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++,( .WORD CPRCON ;UNIT CONNECT ENTRY POINT6 .WORD CPRALO ;ALLOCATE BUFFER SPACE AND COMMAND RING' .WORD CPRDEA ;DEALLOCATE BUFFER SPACE" .WORD CPRSEN ;SEND PACKET TO VMS;+ ; LOCAL DATA;+;****TEMPORARY TPR1=2 TPR2=4L TPR3=6L U.VUCB=U.UI00{h{ttt tfDATAC+2S KXCSRD=177530 KXCSRF=177534 KXJQIR=177532;****TEMPORARY6SNDRNG: .WORD 140000 ;CURRENT RSX TO VMS RING ADDRESS2PRVSND: .WORD 0 ;PREVIOUS RSX TO VMS RING ADDRESS4FRSTSN: .WORD 140000 ;FIRST RSX TO VMS RING ADDRESS7WRAPSN: .WORD 0 ;ADDRESS JUST PAST RSX TO VMS RINGS - Y ;INDICATES WRAP 1RCVRNG: .WORD 0 ;CURRENT VMS TO RSX RING ADDRESSE2PRVRCV: .WORD 0 ;PREVIOUS VMS TO RSX RING ADDRESS/FRSTRC: .WORD 0 ;FIRST VMS TO RSX RING ADDRESSA7WRAPRC: .WORD 0 ;ADDRESS JUST PAST VMS TO RSX RINGS - R ;INDICATES WRAP50BUFFHD: .BLKW 1 ;LISTHEAD FOR BUFFER SPACE LIST9BUFFWT: .WORD 0 ;COUNT OF TASKS WAITING FOR BUFFER SPACER3RINGWT: .WORD 0 ;COUNT OF TASKS WAITING FOR A RING *XXWAIT: .WORD 0 ;XX DRIVER WAIT FLAG WORD&XXBIAS: .WORD 0 ;XX DRIVER SAVED BIAS/XXRET: .WORD 0 ;XX DRIVER SAVED RETURN ADDRESSU"XXR5: .WORD 0 ;XX DRIVER SAVED R57QBASE: .WORD 0 ;QBUS STARTING ADDRESS/100 FROM KXJCSRFRASHRCNT: .WORD 0 ;COUNT OF REQUESTS WHICH HAVE LOWERED THE SHAREDT ;MEMORY BASE2CMCSRF: .WORD 0 ;VALUE OF KXJCSRF TO SHARE CPRCOM<RNGBAS: .WORD 0 ;APR BIAS OF RINGS (ALSO OF BASE OF CPRBUF);CSR: .WORD 0 ;WE SAVE THE CSR AND VECTOR, BECAUSE WE DON'TW@VECTOR: .WORD 0 ;HAVE OUR DATA STRUCTURES IF CALLED BY THE EXEC1SYSUCB: .BLKW 2 ;ADDRESS OF CPRSYS'S VMS CP: UCB ; ; DRIVER DISPATCH TABLES;D DDT$ KX,1,,,,NEW=Y ;GENERATE DISPATCH TABLE - ALWAYS ONE CONTROLLER .PAGE1 .SBTTL KXKRB - CONTROLLER INITIALIZATION ROUTINEH; +; KXKRB - CONTROLLER INITIALZATION ROUTINE.M;FF; THIS ROUTINE ASSUMES THAT THE TOP FOUR WORDS OF PHYSICAL MEMORY HAVE(; BEEN SET UP WITH THE FOLLOWING VALUES:;O<; +-------------------------------------------------------+0; | SIZE IN 32 WORD BLOCKS OF CPRBUF |<; +-------------------------------------------------------+(; | # OF RSX/KXJ -> VAX/VMS RINGS |<; +-------------------------------------------------------+(; | # OF VAX/VMS -> RSX/KXJ RINGS |<; +-------------------------------------------------------+<; | SIZE IN 32 WORD BLOCKS OF RSX CONTROLLED BUFFER SPACE |<; +-------------------------------------------------------+;J; USING THESE VALUES, THIS ROUTINE SETS UP CPRBUF IN THE FOLLOWING MANNER:;I;IH;TOP OF MEMORY +-------------------------------------------------------+ ; | | ; | |#; | VMS CONTROLLED BUFFER AREA |+<; +-------------------------------------------------------+ ; | | ; | | ; | |#; | RSX CONTROLLED BUFFER AREA |-<; +-------------------------------------------------------+!; | VMS -> RSX COMMAND RINGS |-<; +-------------------------------------------------------+!; | RSX -> VMS COMMAND RINGS |UI;BASE OF CPRBUF +-------------------------------------------------------+-;-F; IN ADDITION, THIS ROUTINE SEND AN INTERRUPT TO VMS NOTIFYING IT THATD; THE ABOVE INFORMATION IS IN PLACE AT THE TOP OF MEMORY. WHEN VMS H; RECEIVES THIS NOTIFICATION, IT SETS UP ITS OWN REFERENCES TO CPRBUF IN; EXACTLY THE SAME MANNER.;-I; THE FIFTH WORD FROM THE TOP OF SHARED MEMORY IS SET UP AS THE APR BIAS DH; OF THE BASE OF CURRENTLY SHARED MEMORY, WHICH VMS USES TO CHECK ACCESS;|J; THIS ROUTINE ALSO SHRINKS THE SIZE OF SHARED MEMORY DOWN TO INCLUDE ONLY; CPRBUF;-; INPUTS;-; R4 = DCB ADDRESS; R3 = CTB ADDRESS; R2 = KRB ADDRESS1; 0(SP) = RETURN ADDRESS FOR IMMEDIATE COMPLETIONL3; 2(SP) = RETURN ADDRESS FOR CALLER OF EXEC ROUTINE (; C = 1 TRANSITION TO OFF-LINE REQUESTED'; C = 0 TRANSITION TO ON-LINE REQUESTED.=; SUCCESS ASSUMED, $SCERR FILLED IN WITH ERROR CODE IF NEEDEDAKXKRB::I@; FIRST TELL VMS THAT THE TOP FOUR WORD HAVE BEEN SET UP, AND IT; CAN INITIALIZE ITS POINTERSA9 BIS #10010,@#KXCSRD ; ENABLE INTERRUPTS TO AND FROM VMS = MOV @#KISAR5,$KXBAS ; SAVE DRIVER BASE ADDRESS FOR THE EXECS< MOV K.CSR(R2),CSR ; SAVE THE CSR AND VECTOR -WE DON'T HAVE MOV CSR,R4 ; NOW GET THE CSRE< MOV #RI$RIN,TPR2(R4) ; INDICATE THAT THIS IS A SYNC REQUEST MOV $KXVC1,R0 ; GET THE VECTOR+ ADD #4,R0 ; WE WANT THE00{{{cccc ALTERNATE VECTOR 9 MOV R0,@#KXJQIR ; INTERRUPT VMS AT THE ALTERNATE VECTOR /5$: TST TPR2(R4) ; HAS VMS RECEIVED INTERRUPT?  BNE 5$ ; IF NE NO;S; NOW SET UP THE BUFFER AREASS; - MOV $SYSIZ,@#KISAR6 ; GET THE END OF MEMORYS" DEC @#KISAR6 ; BACK UP ONE BLOCK- MOV $SYSIZ,RNGBAS ; GET THE SIZE OF MEMORY E MOV #140100,R4 ; TOP OF MEMORY9 SUB -(R4),RNGBAS ; SUBTRACT THE # OF BLOCKS TO GET BASEI. MOV -(R4),R2 ; # OF RSX -> VMS COMMAND RINGS. MOV -(R4),R1 ; # OF VMS -> RSX COMMAND RINGS4 MOV -(R4),R0 ; SIZE OF RSX CONTROLLED BUFFER SPACEM; REMOVE THE FOLLOWING LINE AND UNCOMMENT THE NEXT BLOCK TO ONLY SHARE CPRBUF5& CLR -(R4) ; ALL OF MEMORY IS SHARED;; MOV @#KXCSRF,QBASE ; GET THE QBUS BASE ADDRESS FROM CSRFR4; MOV RNGBAS,CMCSRF ; COPY THE RING AND CPRBUF BASE,; BIC #77,CMCSRF ; MAKE INTO AN 8KB ADDRESS9; ADD QBASE,CMCSRF ; ADD BASE TO CSRF TO GET CPRBUF BASEF<; MOV CMCSRF,@#KXCSRF ; REDUCE SHARED MEMORY TO JUST CPRBUF9; MOV RNGBAS,-(R4) ; STORE CURRENT BASE OF SHARED MEMORYV/ MOV RNGBAS,@#KISAR6 ; NOW MAP CPRBUF IN APR 66 MOV #140000,R4 ; VIRTUAL ADDRESS TO ACCESS THE RINGS; ; INITIALIZE THE RING POINTERS;A210$: CLR (R4) ; MAKE SURE THE SYNCH BIT IS CLEAR4 MOV R4,PRVSND ; WILL BE THE LAST RING AT LOOP EXIT$ ADD #R$SIZE,R4 ; MOVE TO NEXT RING& SOB R2,10$ ; LOOP FOR ALL THE RINGS7 MOV R4,WRAPSN ; THIS IS THE WRAP VALUE FOR THE RINGS,S5 MOV R4,FRSTRC ; THE BEGINNING OF THE RECEIVE RINGS,S. MOV R4,RCVRNG ; AND THE CURRENT RECEIVE RING320$: CLR (R4) ; MAKE SURE THAT SYNCH BIT IS CLEAR 0 MOV R4,PRVRCV ; WILL BE LAST RING AT LOOP EXIT$ ADD #R$SIZE,R4 ; MOVE TO NEXT RING* SOB R1,20$ ; LOOP FOR ALL RECEIVE RINGS. MOV R4,WRAPRC ; WRAP VALUE FOR RECEIVE RINGS) BIC #160000,R4 ; CLEAR OUT THE APR BIASD+ ADD #77,R4 ; ROUND TO NEXT 32-WORD BLOCK ( ASH #-6,R4 ; MAKE INTO A BLOCK NUMBER ADD R4,@#KISAR6 ; MAP IT. MOV @#KISAR6,BUFFHD ; SET UP BUFFER LISTHEAD# CLR 140000 ; CLEAR THE LINK WORDG2 MOV R0,140002 ; PUT # OF BLOCKS INTO SECOND WORD RETURN ; CONTROLLER IS READY .PAGE' .SBTTL KXUCB - UNIT ONLINE ENTRY POINT;D&; ** - KXUCB - UNIT ONLINE ENTRY POINT;0E; THE ONLY THING THAT THIS ROUTINE DOES IS TO SET UP K.OWN IN THE KRBI;R ; INPUTS:#;0$; R3=CONTROLLER INDEX (S.KRB .NE. 0); R4=ADDRESS OF SCBN; R5=ADDRESS OF UCBA;# ; OUTPUTS:;I; K.OWN SET UP IN KRBD;,+KXUCB:: MOV S.KRB(R4),R2 ;RETRIEVE KRB ADDRE: MOV R5,K.OWN(R2) ;MARK THIS UNIT AS OWNING THE CONTROLLER RETURN4 .PAGE* .SBTTL $KXINT - INTERRUPT SERVICE ROUTINE;N); ** - $KXINT - INTERRUPT SERVICE ROUTINE ;T7; WE CAN GET INTERRUPTED BY VMS FOR ONE OF TWO REASONS:Y;I;; 1) OUR SEND RING HAS TRANSITIONED FROM NOT EMPTY TO EMPTYK;N>; 2) OUR RECEIVE RING HAS TRANSITIONED FROM EMPTY TO NOT EMPTY; ); WE CHECK BOTH CASES FOR EVERY INTERRUPTC;;$KXINT::* INTSV$ KX,PR5,1 ;;; INTERRUPT SAVE MACRO ;;; R5 = UCB ADDRESSB6 MOV U.SCB(R5),R4 ;;;POINT TO CONTROLLER STATUS BLOCK' TST S.FRK+2(R4) ;;;FORK BLOCK IN USE?K' BEQ 10$ ;;;IF EQ, NO, FORK THIS TIME* RETURN ;;;RETURN V*10$: CALL $FORK ;;;CREATE SYSTEM PROCESS ;;;R5 MUST STILL BE THE UCB) ;;;R4 MUST BE THE SCB TO CALL $FORK N9 CLR S.FRK+2(R4) ;FREE FORK BLOCK FOR FURTHER INTERRUPTSN+CPRPOL: MOV RNGBAS,@#KISAR6 ;MAP THE RINGS 2 MOV RCVRNG,R2 ;GET THE CURRENT RECEIVE RING BASE2 TST (R2) ;DO WE HAVE A RECEIVE RING TO PROCESS? BMI 15$ ;YES, PROCESS ITR! MOV #RINGWT,R2 ;RING WAIT COUNTO MOV #T4.LRW,R1 ;RING WAIT FLAG3 JMP UNBLOK ;GO CHECK IF WE'RE WAITING FOR A RING;T"; WE HAVE AN INPUT RING TO PROCESS; *15$: MOV R$FLAG(R2),R1 ;GET THE FLAG WORD0 MOV R$ADDR(R2),@#KISAR6 ;MAP THE HEADER IN APR6$ MOV #140000,R3 ;GET A BASE ADDRESS, BIT #HF$RSP,H$FLAG(R3) ;IS THIS A RESPONSE? BNE 151$ ;YES, PROCESS IT0 JMP VMSINI ;COMMANDS HAVE SEPARATE PROCESSING;151$: BIT #RF$IDS,R1 ;WAS IT INSUFFICIENT DYNAMIC STORAGE?I BEQ 155$ ;NO, JUST CONTINUE' MOV #IE.UNS,H$STAT(R3) ;SET THE STATUSW155$:I ; UNCOMMENT TO SHARE ONLY CPRB00{h{ttt tfDATAUF?; BIT #HF$SHR,H$FLAG(R3) ;DID THIS COMMAND LOWER SHARED MEMORY?P!; BEQ 16$ ;NO, DON'T RESTORE IT 5; DEC SHRCNT ;DECREMENT COUNT OF TASKS LOWERING MEME0; BNE 16$ ;IF THERE ARE STILL MORE, DO NOTHING(; MOV @#KISAR6,-(SP) ;SAVE APR6 MAPPING%; MOV $SYSIZ,@#KISAR6 ;END OF MEMORYP"; DEC @#KISAR6 ;BACK UP ONE BLOCK/; MOV RNGBAS,140066 ;SET BASE OF SHARED MEMORYE*; MOV (SP)+,@KISAR6 ;RESTORE APR6 MAPPING7; MOV CMCSRF,@#KXCSRF ;AND MOVE THE SHARED MEMORY BASEI916$: BITB #HF$AST,H$FLAG(R3) ;DO WE NEED TO QUEUE AN AST?) BNE 17$ ;YES, GO DO ITA; H; WE AREN'T QUEUEING AN AST. THAT EITHER MEANS THAT WE ARE COMPLETING AM; DETACHED RETURN, OR WE ARE RETURNING TO AN EXEC ROUTINE. A DETACHED RETURN P; WILL HAVE H$RET=0. IF IT IS A DETACHED RETURN, UNBLOCK THE TASK IF NECESSARY,P; STORE THE TASK INDEX IF IT WAS A TASK INITIATION, AND DEALLOCATE THE BUFFER. >; IF IT IS AN EXEC RETURN, RETURN TO THE CALLING ROUTINE WITH:; ; R0 BUFFER ADDRESS 2 MOV H$BIAS(R3),-(SP) ;SAVE THE APR5 BIAS FOR CALL# MOV H$RET(R3),-(SP) ;AND ADDRESS G0 BEQ 161$ ;IF NONE, THIS IS A DETACHED RETURN ) MOV @#KISAR6,R0 ;GET THE BUFFER ADDRESSA5 CALL $MPPRO ;CALL THE OTHER ROUTINE AS A COROUTINE * BR 163$ ;COMMON EXEC ROUTINE EXIT POINT;S; DETACHED RETURN PROCESSING;A'161$: CMP (SP)+,(SP)+ ;CLEAN THE STACKI. BIT #HF$BLK,H$FLAG(R3) ;WAS THE TASK BLOCKED? BEQ 162$ ;NO, JUST CONTINUE MOV H$TCB(R3),R5 ;GET THE TCBE BIC #TS.RSW,T.STAT(R5) ;UNBLOCK4 CMP #HT$RUN,H$TYPE(R3) ;WAS THIS A TASK INITIATION? BNE 162$ ;NO, JUST CONTINUE0 MOVB P$TKI(R3),T.LBN(R5) ;SET UP THE TASK INDEX5162$: MOV @#KISAR6,R0 ;GET THE ADDRESS OF THE PACKET % CALL CPRDEA ;DEALLOCATE THE HEADERO$ MOV R5,R0 ;MOVE THE TCB FOR SETCR CALL $SETCR ;SCHEDULE ITD"163$: CLR R5 ;DON'T QUEUE AN AST& MOV RNGBAS,@#KISAR6 ;REMAP THE RINGS BR NXTRNG;S&; ALLOCATE AN AST BLOCK AND FILL IT IN; (17$: MOV H$TCB(R3),R5 ;GET THE TASK TCB' MOV RNGBAS,@#KISAR6 ;REMAP THE RINGS T, MOV #12,R1 ;GET THE SIZE OF OUR AST BLOCK CALL $ALOCB ;GET IT BCC 20$ ;WE GOT IT,! INC $KXPOL ;WE NEED POOL LATER6 RETURN#&20$: MOV RCVRNG,R2 ;$ALOCB TRASHED R2) MOV R0,R3 ;GET A COPY OF THE AST BLOCKM TST (R0)+ ;SKIP THE LINK WORD9 MOV #AK.GBI,(R0)+ ;GENERAL BUFFERED I/O AST ENTRY POINTU MOV $KXBAS,(R0)+ ;OUR MAPPINGR4 MOV #CPRAST,(R0)+ ;THE AST SERVICE ROUTINE ADDRESS4 MOV R$ADDR(R2),(R0) ;GET THE ADDRESS OF THE BUFFER4NXTRNG: CLR @RCVRNG ;WE'RE DONE WITH THIS RING NOW;2;INTERRUPT IF NECESSARYR;T$ TST @PRVRCV ;SHOULD WE INTERRUPT? BPL 40$ ;NO, JUST CONTINUE ( MOV $KXVC1,@#KXJQIR ;INTERRUPT THE VAX;V;NOW MOVE TO THE NEXT RING;V>40$: MOV RCVRNG,PRVRCV ;CURRENT RING IS NOW THE PREVIOUS RING/ ADD #R$SIZE,RCVRNG ;MOVE POINTER TO NEXT RING/( CMP RCVRNG,WRAPRC ;DO WE NEED TO WRAP? BNE 50$ ;NOPE, EXIT+ MOV FRSTRC,RCVRNG ;START AT THE BEGINNINGV;A8;UNBLOCK THE TASK, QUEUE THE AST, AND REQUEST SCHEDULING;R N.50$: MOV R5,R0 ;COPY THE TCB FOR $SETCR CALL( BEQ 70$ ;DON'T QUEUE AN AST IF NO TCB) BIC #TS.RSW,T.STAT(R5) ;UNBLOCK THE TASKI CALL $REQUE ;QUEUE THE ASTT!70$: JMP CPRPOL ;GO GET ANOTHERE; I; WE HAVE A VMS INITIATED COMMAND. WHATEVER HAPPENS HERE, WE'RE GOING TOAL; NEED A RING FOR SENDING INFORMATION TO VMS. IF NO SEND RING IS AVAILABLE,N; JUST EXIT, AND VMS WILL CALL US BACK WHEN IT TAKES AN ENTRY OUT OF THE RING.;AL; CURRENTLY, THE ONLY VMS INITIATED COMMAND IS A QUEUE COMMAND LINE REQUEST,M; SO WE'LL JUST DO THAT. IF WE CANNOT ALLOCATE SECONDARY POOL, OR IF THE CLIO; WAS NOT SUCCESSFULLY STARTED, RETURN THE RING WITH THE 'INSUFFICIENT DYNAMIC J; STORAGE' BIT SET.NVMSINI: & MOV RNGBAS,@#KISAR6 ;REMAP THE RINGS' TST @SNDRNG ;DO WE HAVE A SEND RING?E BMI 50$ ;NO, RINGS FULL, EXIT, MOV R$ADDR(R2),KISAR6 ;NOW REMAP THE HEADER8 BIS #HF$RSP,140000+H$FLAG ;MARK THAT THIS IS A RESPONSE8 MOV P$BLEN(R3),R1 ;GET THE LENGTH OF THE STRING BUFFER< ADD #C.CTXT+77,R1 ;ADD FIXED AREA AND ROUND TO 32 WD BLOCK0 ASH #-6,R1 ;MAKE IN00{{{ccccTO A 32 WORD BLOCK ADDRESS" CALL $ALSEC ;GET SECONDARY POOL$ BCS 10$ ;NO POOL, SEND BACK ERROR;T,; FILL IN FIELDS IN THE COMMAND BUFFER BLOCK;V5 MOV R0,R3 ;MOVE THE ADDRESS WHERE $BLXIO NEEDS IT W MOV #140000,R4 ;APR 6 BIAS. MOV KISAR6,-(SP) ;SAVE THE CPR BLOCK MAPPING( MOV P$BLEN(R4),R0 ;LENGTH OF TRANSFER  MOV H$TIUC(R4),-(SP) ;TI UCBE6 MOVB 140000+P$BLEN+1(R0),R2 ;GET TERMINATOR CHARACTER MOV R3,KISAR6 ;MAP THE BLOCK+ TST (R4)+ ;MOVE THE POINTER UP TO C.CTCB#. MOV $MCRPT,(R4)+ ;QUEUE PACKET TO DISPATCHER MOV (SP)+,(R4)+ ;TI UCBO MOV R0,(R4) ;CHARACTER COUNTK4 DEC (R4)+ ;THAT INCLUDED THE TERMINATOR CHARACTER CLR (R4)+ ;CLEAR STATUS WORDD CLR (R4)+ ;STARTING OFFSETM% MOVB R2,(R4)+ ;TERMINATOR CHARACTER, MOVB R1,(R4)+ ;SIZE OF PACKETG;M1; NOW MOVE THE STRING TO THE SECONDARY POOL BLOCK(;,$ MOV #120000+P$BLEN+2,R2 ;APR 5 BIAS% MOV (SP)+,R1 ;BIAS OF HEADER PACKETR# CALL $BLXIO ;AND MOVE THE STRING 0 MOV R3,R1 ;GET THE BIAS WHERE $QCPKT NEEDS IT+ CALL $QCPKT ;QUEUE THE PACKET TO THE CLI4 BCC 10$ ;IF SUCCESS, CONTINUE3 BNE 10$ ;IF NE, COULD NOT START CLI, LEAVE C SETT( CLC ;CLI WAS ACTIVE, CALL IT SUCCESS;D; SEND THE RESPONSE PACKET;M&10$: MOV RNGBAS,KISAR6 ;MAP THE RINGS- MOV RCVRNG,R0 ;ADDRESS OF THIS RECEIVE RINGO. MOV SNDRNG,R1 ;ADDRESS OF THE NEXT SEND RING" MOV 2(R0),2(R1) ;MOVE THE LENGTH" MOV 4(R0),4(R1) ;AND THE ADDRESS2 BCC 20$ ;IF IT WAS SUCCESS, DON'T SET ERROR BIT$ BIS #RF$IDS,(R1) ;MARK AS FAILURE720$: BIS #RF$SYN,(R1) ;TELL VMS THAT THIS ONE IS READY$;;;INTERRUPT IF NECESSARYE;$$ TST @PRVSND ;SHOULD WE INTERRUPT? BMI 30$ ;NO, JUST CONTINUE,( MOV $KXVC1,@#KXJQIR ;INTERRUPT THE VAX;K;NOW MOVE TO THE NEXT RING; :30$: MOV R1,PRVSND ;CURRENT RING IS NOW THE PREVIOUS RING/ ADD #R$SIZE,SNDRNG ;MOVE POINTER TO NEXT RINGG( CMP SNDRNG,WRAPSN ;DO WE NEED TO WRAP? BNE 40$ ;NOPE, EXIT+ MOV FRSTSN,SNDRNG ;START AT THE BEGINNINGS'40$: CLR R5 ;NO TASK TO QUEUE AST FORS4 BR NXTRNG ;FINISH UP WITH THIS RING - GET ANOTHER.50$: RETURN ;EXIT IF NO SEND RING AVAILABLE;T .PAGE+ .SBTTL CPRAST - KERNAL AST SERVICE ROUTINET;N+; ** - CPRAST - KERNAL AST SERVICE ROUTINEV;I; THIS ROUTINE RETURNS CONTROL TO THE TASK OR DIRECTIVE ROUTINE WITH THE W; FOLLOWING REGISTER CONTENTS:;D-; R0 ADDRESS OF BUFFER - TO BE USED IN AN APRR;N ; INPUTS:E;O; R3 ADDRESS OF AST BLOCK;H; CONTROL IS TRANSFERED TO THE TASK COMPLETION ROUTINE USING THE ROUTINE+; $MPPRO. THIS ROUTINE EXPECTS THE INPUTS:I;I; (SP) RETURN ADDRESS; 2(SP) ROUTINE ADDRESS TO CALLA; 4(SP) APR5 BIAS OF ROUTINE;TD; BY PUTTING THE APR BIASES AND THE CALLING ADDRESS UNDER THE RETURNA; ADDRESS THAT IS CURRENTLY ON THE STACK, WE CAN JUMP TO THE TASKT); COMPLETION ROUTINE RATHER THAN CALL IT.RCPRAST::( MOV R3,R0 ;SAVE THE AST BLOCK ADDRESS+ MOV 10(R3),-(SP) ;SAVE THE BUFFER ADDRESSF MOV #12,R1 ;SIZE OF AST BLOCK CALL $DEACB ;DEALLOCATE ITU! MOV (SP)+,R0 ; BUFFER ADDRESS, T! MOV R0,@#KISAR6 ;MAP THE BUFFERI$ MOV #140000,R1 ;GET A BASE ADDRESS1 MOV H$RET(R1),-(SP) ;SET UP THE ROUTINE ADDRESS* MOV 2(SP),-(SP) ;MOVE THE RETURN ADDRESS* MOV H$BIAS(R1),4(SP) ;PUT IN THE APR BIAS3 BEQ 10$ ;NO BIAS, GET THE MAPPING FROM USER APRS2 MOV H$STAT(R1),-(SP) ;PUT THE STATUS ON THE STACK+ MTPD$ @#H.DSW ;SET DIRECTIVE STATUS WORD BR 20$3410$: MOV @#UINAR5,4(SP) ;GET MAPPING FROM USER TASK$ MOV @#UISAR6,@#KISAR6 ;MAP APR6 TOO MOV @#UINAR6,@#KINAR6 ;I&DE*20$: JMP $MPPRO ;AND GO BACK TO THE TASK .PAGE/ .SBTTL CPRCON - CONNECT TI: UCB TO VMS CP: UCB-;)); CPRCON - CONNECT TI: UCB TO VMS CP: UCB-;)J; THIS ROUTINE IS CALLED BY THE $$DRV UNIT ONLINE ENTRY POINT FOR EACH TI:H; UCB. THE UCB ADDRESS AND UNIT ARE PASSED TO VMS VIA THE TPRS. THE UCBJ; ADDRESS IS WRITTEN INTO TPR2, AND THE UNIT IS WRITTEN INTO TPR3. THE VMSI; CP: DRIVER PUTS THE UCB ADDRESS IN IT'S OWN UCB WITH THE SAME UNIT, ANDRG; THEN WRITES ITS UCB ADDRESS BACK INTO TPRS 2 AND 3. SINCE THIS IS A00{h{ttt tfDATA H; SYSTEM ADDRESS, THE HIGH BIT IN TPR3 WILL BE SET. THIS ROUTINE WAITS C; IN A HARD LOOP FOR THE RETURN UCB, THEN PUTS IT INTO THE TI: UCB.SJ; IF THE RETURN UCB IS 000000 IN TPR2 AND 100000 IN TPR3, AN ERROR OCCURED; AND U.VUCB IS NOT FILLED IN.;E ; INPUTS:A;E; R5 TI: UCB ADDRESS; ; OUTPUTS:; ; ALL REGISTERS PRESERVED.$; VMS CP: UCB IS LOADED INTO TI: UCB0; IE.IDU IS RETURN IN $SCERR IF AN ERROR OCCURED; CPRCON:N SAVNR ;SAVE R4 AND R5K" MOV CSR,R4 ;GET THE CSR ADDRESS5 MOV #RI$CON,TPR2(R4) ;WE ARE DOING A CONNECT REQUEST ) MOV R5,TPR1(R4) ;PUT IN THE UCB ADDRESST< MOVB U.UNIT(R5),-(SP) ;TPR3 IS FUSSY ABOUT SETTING BYTES...2 CLRB 1(SP) ;..ONE AT A TIME, SO WE FIX IT ON ..! MOV (SP)+,TPR3(R4) ;..THE STACKD" MOV $KXVC1,-(SP) ;GET THE VECTOR, ADD #4,(SP) ;WE WANT THE ALTERNATE VECTOR' MOV (SP)+,@#KXJQIR ;INTERRUPT THE VAXO10$: TST TPR3(R4) ;DONE YET?  BPL 10$ ;NOPE' TST TPR2(R4) ;MIGHT THIS BE AN ERROR?  BNE 15$ ;IF NE NO) CMP #100000,TPR3(R4) ;IS THERE AN ERROR?( BEQ 30$ ;IF EQ YESN-15$: MOV TPR2(R4),U.VUCB(R5) ;MOVE TO TI: UCB & MOV TPR3(R4),U.VUCB+2(R5) ;BOTH WORDS" TSTB U.UNIT(R5) ;IS THIS UNIT 0? BNE 20$ ;NOPE, JUST EXITO- MOV TPR2(R4),SYSUCB ;THIS IS CPRSYS'S UCB -T+ MOV TPR3(R4),SYSUCB+2 ;WE'LL NEED IT LATERD 20$: RETURNE 30$: MOV #IE.IDU,$SCERR ;ERROR RETURNJ .PAGE* .SBTTL CPRALO - BUFFER ALLOCATION ROUTINE;$; CPRALO - BUFFER ALLOCATION ROUTINE;HG; THIS ROUTINE IS USED TO ALLOCATE RESOURCES TO SEND DATA FROM THE RSX NE; SYSTEM TO THE VMS SYSTEM. IF THE RESOURCES ARE NOT AVAILABLE, THE F; ROUTINE CHECKS THE FLAGS IN R0 TO DETERMINE WHAT ACTION TO TAKE. IFF; AL$XXD IS SET, THE REQUEST IS FROM THE XX DRIVER. IN THIS CASE, THEF; ROUTINE SAVES THE CONTEXT OF THE DRIVER TO RETURN WHEN RESOURCES AREI; AVAILABLE. IF AL$XXD IS NOT SET, THE TASK IS BLOCKED PENDING RESOURCE OH; AVAILABILITY. IF AL$BCK IS SET, THEN THE TASK'S PC IS BACKED UP OVER E; THE EMT INSTRUCTION SO THAT WHEN IT IS RESCHEDULED IT WILL REENTER XJ; SYSTEM STATE. IF AL$BCK IS NOT SET, THE ROUTINE RETURNS WITH CARRY SET.;OI; IF RESOURCES ARE AVAILABLE, THE BUFFER SPACE IS ALLOCATED. IF THE FLAGDD; AL$IMP IS SET, AND THE TASK INDEX IN THE TCB IS NOT FILLED IN, AN E; IMPLICIT TASK START REQUEST IS ISSUED. CPRALO WILL RETURN AS IF A IH; RESOURCE WAS UNAVAILABLE, CAUSING THE TASK TO RESCHEDULE AND CALL THISJ; ROUTINE AGAIN. THIS ROUTINE IS CALLED FROM $CPALO IN THE EXEC. IF THE G; LENGTH SPECIFIED IS ZERO, THEN NO BUFFER ALLOCATION IS DONE, BUT THE M$; AVAILABILITY OF A RING IS CHECKED.;E ; INPUTS:T;A; R0 OPERATION FLAGS:U,; AL$BCK - BACK UP PC IF ALLOCATION FAILURE3; AL$IMP - DO IMPLICIT TASK START IF NO TASK INDEXE); AL$XXD - REQUEST IS FROM THE XX DRIVERC3; R1 LENGTH OF BUFFER NECESSARY (IN 32 WORD BLOCKS)A;F ; OUTPUTS:;E7; R0 ADDRESS OF BUFFER ALLOCATED - TO BE USED IN AN APR ; R1 ACTUAL LENGTH ALLOCATED U;E;; THE LENGTH IS ALSO STORED IN THE FIRST BYTE OF THE BUFFERIF; IF THE LENGTH IS ZERO, IT IS ASSUMED THE NO BUFFER IS NECESSARY, BUT<; THE TASK WAS ONLY CHECKING FOR THE AVAILABILITY OF A RING.;U; CPRALO: ;K; FIRST CHECK FOR A RING; SAVNR ;SAVE R4 AND R5K' MOV @#KISAR6,-(SP) ;SAVE APR6 MAPPINGU$ MOV RNGBAS,@#KISAR6 ;MAP THE RINGS* TST @SNDRNG ;IS THERE A RING AVAILABLE? BPL 10$ ;YES, CONTINUED* MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING3 MOV #T4.LRW,R1 ;THE TASK IS BLOCKED FOR RING WAITH BR ALFAIL ;ALLOCATION FAILURE;T2; A RING IS AVAILABLE. NOW CHECK FOR BUFFER SPACE;N/10$: TST R1 ;DO WE NEED TO DO THE ALLOCATION?H# BEQ 30$ ;NOPE, JUST A RING CHECK." MOV R0,-(SP) ;SAVE THE FLAG WORD* MOV #BUFFHD,R2 ;SET UP THE POOL LISTHEAD) BIT #AL$IMP,R0 ;DO IMPLICIT TASK START?) BEQ 20$ ;NO, JUST ALLOCATE THE BUFFER @ MOV $TKTCB,R5 ;GET THE TCB( TSTB T.LBN(R5) ;IS THERE A TASK INDEX?2 BEQ IMPST ;NO, WE HAVE TO DO THE IMPLICIT START,20$: CALL $ALSC1 ;ALLOCATE A BLOCK OF POOL BCS NOPOOL ;NO POOL0 TST (SP)+ ;WE SUCCEEDED, SO DUMP FAILURE FLAG 00{{{cccc MOV R0,@#KISAR6 ;MAP THE BLOCK# MOVB R1,140000 ;PUT IN THE LENGTH$* MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING 30$: RETURNA .PAGE6 .SBTTL ALFAIL - CPR BUFFER OR RING ALLOCATION FAILURE;;L; THIS ROUTINE IS CALLED WHEN CPRALO FAILS TO ALLOCATE A RESOURCE. SEE THE M; COMMENTS AT THE BEGINNING OF CPRALO FOR A DESCRIPTION OF THE ACTIONS TAKEN.O;E;V/NOPOOL: MOV (SP)+,R0 ;RESTORE FLAG FOR FAILUREL* MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING5 MOV #T4.LBW,R1 ;THE TASK IS BLOCKED FOR BUFFER WAITM ;FALL THROUGH TO ALFAILALFAIL:1;0F; FIRST CHECK TO SEE IF THIS IS FROM XXDRV, WHICH IS HANDLED SPECIALLY;T- BIT #AL$XXD,R0 ;IS THIS REQUEST FROM XXDRV?R# BEQ 5$ ;NO, GO BLOCK IT NORMALLYU# BIS R1,XXWAIT ;MARK WHY WE FAILEDL( MOV 4(SP),XXBIAS ;SAVE THE XXDRV BIAS,& MOV 6(SP),XXRET ;THE RETURN ADDRESS,# MOV R5,XXR5 ;AND THE UCB ADDRESSO$ ADD #10,SP ;SKIP THE XXDRV RETURN RETURN ;AND EXIT;SP; SET THE BLOCKING BITS, INCREMENT BLOCKING COUNTS, BACK UP THE PC IF NECESSARY,; AND REQUEST RESCHEDULING;L5$: MOV $TKTCB,R5 ;GET THE TCBS- BIS #TS.RSW,T.STAT(R5) ;SET THE BLOCKING BITI TST R1 ;ANY WAIT FLAG?; BEQ 20$ ;NO, JUST EXITR3 BIS R1,T.ST4(R5) ;BIT TO TELL WHY TASK IS BLOCKEDT' CMP R1,#T4.LBW ;WAITING FOR A BUFFER?  BEQ 10$ ;IF EQ, YES, INC RINGWT ;IF NO, WAS WAITING FOR A RING BR 20$ ;AND EXIT .10$: INC BUFFWT ;INCREMENT BUFFER WAIT COUNT/20$: BIT #AL$BCK,R0 ;SHOULD WE BACK UP THE PC?, BNE 30$ ;IF NE, YES% CALL $DRWSE ;SCHEDULE ANOTHER TASK  SEC RETURNU30$:! SUB #2,$UMPC ;BACK UP USER'S PCS. MOV #$STACK-22,SP ;ALLOCATE? WHAT ALLOCATE? JMP $DRWSEA .PAGE$ .SBTTL IMPST - IMPLICIT TASK START ;,O; THIS ROUTINE IS CALLED FROM CPRALO WHEN A TCB IS DETECTED WITH NO TASK INDEX.FK; IN THIS CASE, THE TASK START PACKET IS CREATED AND SENT, AND CPRALO THEN BK; BLOCKS THE TASK AND RETURNS AS IF THERE WERE AN ALLOCATION FAILURE. THE #K; PACKET IS SENT AS A PSEUDO REQUEST, AND THE DETACHED RETURN PROCESSING IN 6; KXINT FILLS IN THE TASK INDEX AND UNBLOCKS THE TASK.;P7; THE IMPLICIT START REQUEST PACKET HAS THE PARAMETERS:H; +------------+------------+; | TASK UIC |; +------------+------------+; |DEF DIR LEN | # OF LUNS |; +------------+------------+; | DEFAULT DIRECTORY STRING| ; | |;TIMPST:;,1; FIRST FIGURE OUT HOW BIG OF A BLOCK TO ALLOCATES; 5 MOV #H$SIZE+4+77,R1 ;SIZE IN BYTES OF FIXED AREA+77E& CLR R4 ;SET UP FOR NO CONTEXT BLOCK. MOV T.CTX(R5),@#KISAR6 ;MAP THE CONTEXT BLOCK, BEQ 10$ ;IF EQ, THERE IS NO CONTEXT BLOCK* MOV #140000,R4 ;GET A BASE ADDRESS IN R4% MOVB C.DDSL(R4),R4 ;GET THE LENGTH |( ADD R4,R1 ;ADD SIZE OF DEFAULT STRING410$: ASH #-6,R1 ;MAKE INTO A 32 WORD BLOCK ADDRESS CALL $ALSC1 ;GET A BUFFER BCS NOPOOL ;ALLOCATION FAILED; ; NOW FILL IN THE BLOCKS;I2 MOV R0,R3 ;WE'LL NEED THE BIAS IN R3 FOR $BLXIO- MOV R4,R0 ;AND WE'LL NEED THE LENGTH IN R0E MOV T.PCB(R5),R2 ;GET THE PCBT& MOV P.HDR(R2),R4 ;GET HEADER ADDRESS" BNE 20$ ;IF EQ, EXTERNAL HEADER' MOV P.REL(R2),@#KISAR6 ;MAP IT IN APR6 # MOV #140000,R4 ;GET ADDRESS IN R4D.20$: MOVB H.NLUN(R4),-(SP) ;GET NUMBER OF LUNS& MOV H.DUIC(R4),-(SP) ;AND DEFAULT UIC) MOV R3,@#KISAR6 ;MAP THE COMMAND HEADER ) MOV #140000,R4 ;GET PACKET BASE ADDRESSC$ MOVB R1,(R4) ;SET THE PACKET SIZE& MOVB #HT$RUN,H$TYPE(R4) ;SET THE TYPE' CLRB H$ICNT(R4) ;CLEAR THE ITEM COUNTE( ADD #P$UIC,R4 ;START OF PARAMETER AREA MOV (SP)+,(R4)+ ;UIC" MOVB (SP)+,(R4)+ ;NUMBER OF LUNS' MOVB R0,(R4)+ ;SIZE OF DEFAULT STRINGP& MOV T.CTX(R5),R1 ;CONTEXT BLOCK BIAS# BEQ 30$ ;IF EQ, NO CONTEXT BLOCK:2 MOV #120000+C.DDS,R2 ;DEFAULT STRING DISPLACEMENT( CALL $BLXIO ;MOVE THE DEFAULT STRING ,30$: ADD #H$SIZE+4,R1 ;GET THE TOTAL LENGTH* MOV R3,R2 ;CAN'T PASS A PARAMETER IN R3 CPSEN$ #SN$PSR,R2,R1" MOV (SP)+,R0 ;GET BACK FLAG WORD, CLR R1 ;NOT WAITING ON A RING OR A BUFFER* MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING BR ALFAIL ;EXIT .PAGE* .SBTTL CPRDEA - DEA00{h{ttt tfDATALLOCATE BUFFER SPACE; '; ** - CPRDEA - DEALLOCATE BUFFER SPACEO;XE; THIS ROUTINE DEALLOCATES AND RETURNS TO THE CPR POOL A BUFFER BLOCKR;D ; INPUTS:N;I'; R0 ADDRESS OF BLOCK TO BE DEALLOCATEDU;S=; THE FIRST BYTE OF THE BLOCK IS THE LENGTH IN 32 WORD BLOCKS2;;>; THE CORE BLOCK IS MERGED INTO THE FREE CORE CHAIN BY ADDRESS2; AND MERGED WITH ANY BORDERING BLOCKS IF POSSIBLE; ; R3, R4, R5 PRESERVED;PCPRDEA:R' MOV @#KISAR6,-(SP) ;SAVE APR6 MAPPINGX MOV R0,@#KISAR6 ;MAP THE BLOCK MOVB 140000,R1 ;GET THE LENGTH% MOV (SP)+,@#KISAR6 ;RESTORE MAPPING& MOV #BUFFHD,R2 ;SET UP POOL LISTHEAD4 CALL $DESC1 ;DEALLOCATE THE POOL BLOCK AND RETURN3 MOV #BUFFWT,R2 ;COUNT OF TASKS REQUIRING A BUFFERS" MOV #T4.LBW,R1 ;FLAG TO LOOK FOR ;FALL THROUGH TO UNBLOK .PAGE8 .SBTTL UNBLOCK - UNBLOCK TASKS WHEN A RESOURCE IS FREED;WK; THIS ROUTINE IS CALLED WHEN A RESOURCE IS FREED. IT IS CALLED BY CPRDEA,RH; WHEN A BUFFER IS RELEASED, AND BY KXINT, WHEN AN INTERRUPT IS RECEIVEDH; INDICATING THAT A SEND RING HAS BEEN FREED UP. THE ROUTINE IS ENTERED; WITH THE INPUTS:;E(; R1 BUFFER WAIT FLAG (T4.LRW OR T4.LBW);; R2 ADDRESS OF RESOURCE WAIT COUNT WORD (BUFFWT OR RINGWT)S;R;IN; FIRST CHECK IF ANY TASKS ARE WAITING FOR THIS RESOURCE. IF THEY ARE, SEARCHN; THE ACTIVE TASK LIST, CLEARING THE BIT WHEN FOUND UNTIL THE COUNT GOES TO 0.L; ON THE FIRST TASK FOUND WAITING (WHICH WILL BE THE HIGHEST PRIORITY), CALL; $SETCR TO SCHEDULE THE TASKN;WUNBLOK:R1 TST (R2) ;ANY TASKS WAITING FOR THIS RESOURCE?  BEQ 40$ ;NO, CHECK XXDRVS4 CLR -(SP) ;FLAG TO TELL IF $SETCR HAS BEEN CALLED* MOV $ACTHD,R0 ;GET THE FIRST ACTIVE TASK*10$: BIT R1,T.ST4(R0) ;THIS TASK WAITING? BEQ 20$ ;NO, TRY THE NEXT ONE) BIC R1,T.ST4(R0) ;CLEAR THE WAITING BITE, BIC TS.RSW,T.STAT(R0) ;AND THE BLOCKING BIT' TST (SP) ;HAVE WE CALLED $SETCR YET? $ BNE 15$ ;YES, DON'T CALL IT AGAIN+ MOV R2,-(SP) ;SAVE THE WAIT COUNT ADDRESSR" MOV R1,-(SP) ;SAVE THE WAIT FLAG% CALL $SETCR ;CALL FOR A RESCHEDULET% MOV (SP)+,R1 ;RESTORE THE WAIT FLAGX% MOV (SP)+,R2 ;AND THE COUNT ADDRESST" INC (SP) ;MARK THAT WE DID THIS$15$: DEC (R2) ;DECREMENT THE COUNT BEQ 30$ ;IF IT'S ZERO, EXIT120$: MOV T.ACTL(R0),R0 ;GET THE NEXT ACTIVE TASK  BR 10$ ;AND GO CHECK AGAINT,30$: TST (SP)+ ;POP THE FLAG OFF THE STACK940$: BIT R1,XXWAIT ;WAS XXDRV WAITING FOR THIS RESOURCE?L BEQ 45$ ;IF EQ NO, JUST EXITT& BIC R1,XXWAIT ;CLEAR THE BUFFER WAIT- BNE 45$ ;IF XXWAIT ISN'T CLEAR, THE OTHER R+ ;RESOURCE IS BUSY ALSO, SO JUST RETURNF1 CMP #T4.LBW,R1 ;WAS THIS A BUFFER DEALLOCATION?( BNE 50$ ;NO, GO CALL XXDRV55 CMP XXBIAS,4(SP) ;WAS THIS A CPDEA CALL FROM XXDRV?  BNE 50$ ;NO, GO CALL XXDRV0245$: RETURN ;CALL WAS FROM XXDV, JUST RETURN TO! ;AVOID MULTIPLE CALL NESTINGO;H"; SET UP AND JUMP TO THE XXDRIVER ;T250$: MOV (SP),R5 ;GET THE CURRENT RETURN ADDRESS- MOV XXBIAS,(SP) ;SET UP THE BIAS FOR $MPPROT) MOV XXRET,-(SP) ;AND THE RETURN ADDRESS 7 MOV R5,-(SP) ;MOVE ORIGINAL RETURN ADDRESS FOR $MPPROR MOV XXR5,R5 ;RESTORE R5) SEC ;TELL XXDRV THE ALLOCATION FAILED; JMP $MPPRO ;CALL THE DRIVER .PAGE( .SBTTL CPRSEN - SEND RING ENTRY TO VMS;;&; ** - CPRSEN - SEND RING ENTRY TO VMS;SG; THIS ROUTINE FILLS IN COMMON FIELDS IN THE HEADER AND THEN SENDS THE G; FILLED-IN HEADER-ITEM BUFFER TO VMS. THE ALLOCATION ROUTINE MUST BE UI; CALLED BEFORE THIS ROUTINE, IN THE SAME FORK PROCESS, TO INSURE THAT A )E; RING IS AVAILABLE. IF A NEW SHARED MEMORY BASE IS SPECIFIED, THIS SE; ROUTINE CHANGES THE SHARED MEMORY BASE AND INCREMENTS THE COUNT OF A/; OUTSTANDING REQUESTS FOR LOWERED MEMORY BASE..;E?; THE BITS IN THE OPCODE FIELD DETERMINE THE FOLLOWING ACTIONS:E;R ; BIT ACTIONS;S8; SF$BLK THE TASK IS BLOCKED PENDING REQUEST COMPLETION@; SF$BIA THE BIAS OF THE CALLING ROUTINE IS SAVED IN THE HEADER;; SF$HDR COMMON FIELDS ARE FILLED IN IN THE REQUEST HEADEREB; SF$IRT DON'T STORE RETURN ADDRESS IN HEADER, RETURN IMMEDIATELY(; SF00{{{cccc$RSP SET RESPONSE BIT IN FLAGS WORD@; SF$AST AN KERNAL AST MUST BE USED TO LOAD TASK CONTEXT BEFORE7; CONTROL IS TRANSFERRED TO THE COMPLETION ROUTINE!; SF$DRF CALL DRFIN WHEN EXITINGD;R$; THE FOLLOWING OPCODES ARE DEFINED:;A9; SN$TSK SF$BLK!SF$HDR!SF$AST CALLED BY PRIVILEGED TASKSOE; SN$DIR SF$BLK!SF$HDR!SF$BIA!SF$AST!SF$DRF CALLED BY EXEC DIRECTIVESDB; SN$IMP SF$BLK!SF$HDR!SF$BIA!SF$AST CALLED BY IMPLICIT DIRECTIVES(; SN$QIO SF$BIA!SF$HDR CALLED BY $$DRV>; SN$PSR SF$BLK!SF$HDR!SF$IRT PSEUDO REQUEST BY OTHER ROUTINE0; SN$RSP SF$RSP!SF$IRT RESPOND TO VMS COMMANDS;O ; INPUTS:E; G; THIS ROUTINE IS CALLED BY THE MACRO CPSEN$ WHICH SETS UP THE STACK INF; THE FOLLOWING MANNER:H;O-; (SP) RETURN ADDRESS TO CPCALL EXEC MODULEL,; 2(SP) CALLING ROUTINE'S D SPACE APR5 BIAS,; 4(SP) CALLING ROUTINE'S I SPACE APR5 BIAS); 6(SP) CALLING ROUTINE'S RETURN ADDRESSF; 10(SP) OPCODET; 12(SP) BUFFER ADDRESST; 14(SP) BUFFER LENGTH1; 16(SP) NEW BASE OF SHARED MEMORY (IGNORED IF 0)R; ;D ; OUTPUTS:;H; THE RING IS SENT TO VMS!); THE TASK IS BLOCKED PENDING COMPLETION.UD; THE CALLING ROUTINE'S RETURN ADDRESS IS REMOVED FROM THE STACK AND; STORED IN THE HEADER. .ENABL LSB CPRSEN:T; %; FILL IN COMMON FIELDS IN THE HEADER);L% MOV 12(SP),@#KISAR6 ;MAP THE BUFFERS& MOV #140000,R2 ;USE R2 TO MAP HEADER) BIT #SF$RSP,10(SP) ;IS THIS A RESPONSE?1 BEQ 117$ ;NO, WE NEED TO SET UP COMMAND PACKET)) BIS #HF$RSP,H$FLAG(R2) ;SET RESPONSE BIT , BR 20$ ;JOIN COMMON CODE TO SEND THE RING1117$: CLR H$FLAG(R2) ;CLEAR THE HEADER FLAG WORD * CLR R0 ; R0 WILL BE THE RING FLAGS WORD;E#; ADJUST SHARED MEMORY IF NECESSARYK;D8; MOV 16(SP),R1 ; ARE WE MOVING THE SHARED MEMORY BASE? ; BEQ 5$ ; NOPE, JUST CONTINUE2; INC SHRCNT ; KEEP COUNT OF TASKS CHANGING THIS=; BIS #HF$SHR,H$FLAG(R2) ; INDICATE THIS REQUEST CHANGED THIS;); BIC #77,R1 ; CLEAR OUT LOW ORDER BITSE2; ADD QBASE,R1 ; MAKE IT INTO AN ADDRESS FOR CSRF8; CMP R1,@#KXCSRF ; IS THE NEW BASE LOWER THAN THE OLD?; BHIS 5$ ; NO, JUST CONTINUEC0; MOV R1,@#KXCSRF ; AND PUT THE ADDRESS IN CSRF*; MOV $SYSIZ,@#KISAR6 ; GET TOP OF MEMORY#; DEC @#KISAR6 ; BACK UP ONE BLOCKR1; MOV 16(SP),140066 ; MARK BASE OF SHARED MEMORY$); MOV 12(SP),@#KISAR6 ; REMAP THE BUFFERK;5$:$ MOV $TKTCB,R5 ;GET THE CURRENT TCB3 BIT #SF$AST,10(SP) ;WILL WE NEED TO QUEUE AN AST? BEQ 3$ ;NOPE, JUST CONTINUE, BIS #HF$AST,H$FLAG(R2) ;SET THE HEADER FLAG83$: BIT #SF$BLK,10(SP) ;ARE WE GOING TO BLOCK THE TASK? BEQ 31$ ;NOPE( BIS #HF$BLK,H$FLAG(R2) ;MARK AS BLOCKED! BIS #TS.RSW,T.STAT(R5) ;BLOCK IT 31$::; BIT #SF$HDR,10(SP) ;SHOULD WE SET UP THE HEADER FIELDS?; BEQ 6$ ;NO, SKIP THIS PART( MOV R5,H$TCB(R2) ;PUT IT IN THE HEADER- MOVB T.LBN(R5),H$TKI(R2) ;GET THE TASK INDEX: MOV T.UCB(R5),R3 ;GET TI: UCBT) MOV R3,H$TIUC(R2) ;PUT IT IN THE HEADER 1 BITB #HT$SYS,H$TYPE(R2) ;IS THIS PKT FOR CPRSYS?S& BNE 4$ ;YES, USE THE UCB FOR CPRSYSA MOV U.VUCB(R3),H$VUCB(R2) ; NO, GET THE VMS UCB FROM THE TI: UCB$+ MOV U.VUCB+2(R3),H$VUCB+2(R2) ; BOTH WORDSO BR 6$ ;JOIN COMMON CODE-4$: MOV SYSUCB,H$VUCB(R2) ;GET THE CPRSYS UCB & MOV SYSUCB+2,H$VUCB+2(R2) ;BOTH WORDS*6$: CLR H$BIAS(R2) ;ASSUME NO BIAS STORED6 BIT #SF$BIA,10(SP) ;DO WE WANT TO SAVE THE APR BIAS? BEQ 7$ ;NO, IT'S A TASK) MOV 4(SP),H$BIAS(R2) ;SAVE THE APR5 BIAS ,7$: CLR H$RET(R2) ;ASSUME NO RETURN ADDRESS' BIT #SF$IRT,10(SP) ;IMMEDIATE RETURN? * BNE 20$ ;YES, DON'T SAVE RETURN ADDRESS. MOV 6(SP),H$RET(R2) ;SAVE THE RETURN ADDRESS V;+; FILL IN THE RING;T(20$: MOV RNGBAS,@#KISAR6 ;MAP THE RINGS, MOV SNDRNG,R3 ;GET THE ADDRESS OF THE RING MOV R0,(R3)+ ; FLAGS MOV 14(SP),(R3)+ ; LENGTHS MOV 12(SP),(R3)+ ; ADDRESS6 BIS #RF$SYN,@SNDRNG ;TELL VMS THAT THIS ONE IS READY;Q;INTERRUPT IF NECESSARYM;4$ TST @PRVSND ;SHOULD WE INTERRUPT? BMI 30$ ;NO, JUST CONTINUEE( MOV $KXVC1,@#KXJQIR ;INTERRUPT THE VAX; ;NOW MOVE TO THE NEXT RING;T>30$: MOV SNDRNG,PRVSND ;CURRENT RING IS NOW THE00{{ttt tfDATA PREVIOUS RING/ ADD #R$SIZE,SNDRNG ;MOVE POINTER TO NEXT RINGR( CMP SNDRNG,WRAPSN ;DO WE NEED TO WRAP? BNE 40$ ;NOPE, EXIT+ MOV FRSTSN,SNDRNG ;START AT THE BEGINNINGP;RC; NOW WE HAVE TO FIX THE STACK, AND RETURN. THERE ARE THREE CASES:T; B; 1) A DIRECTIVE. PULL EVERYTHING OFF THE STACK BUT THE DSW, CALLC; $DRFIN TO FINISH THE DIRECTIVE, AND CALL $DRWSE TO RESCHEDULE.$C; 2) A $SWSTK CALL. PULL EVERYTHING OFF THE STACK AND CALL $DRWSE.TE; 3) A PSEUDO REQUEST. PULL THE PARAMETERS OFF THE STACK AND RETURN.#;I/40$: BIT #SF$IRT,10(SP) ;SHOULD WE RETURN NOW?N. BNE 50$ ;IF NE, YES, GO PULL THE PARAMETERS" BIT #SF$DRF,10(SP) ;CALL $FINDR?( BNE 45$ ;IF NE, YES, SET UP AND CALL 7 MOV #$STACK-22,SP ;GET RID OF EVERYTHING ON THE STACK)' JMP $DRWSE ;SCHEDULE SOMETHING ELSE A45$:6 MOV #$STACK-24,SP ;GET RID OF EVERYTHING BUT THE DSW' MOV (SP),-(SP) ;MOVE THE DSW DOWN ONET6 MOV #$DRWSE,2(SP) ;SCHEDULE SOMETHING ELSE WHEN DONE JMP $FINDR ;GO TO $DRFINL<50$: MOV (SP),10(SP) ;THE TOP FOUR ELEMENTS ON THE STACK..., MOV 2(SP),12(SP) ;...NEED TO BE MOVED DOWN MOV 4(SP),14(SP) ;...A MOV 6(SP),16(SP) ;...(3 ADD #10,SP ;AND THEN SKIP THE REST OF THE PARAMSD RETURN .DSABL LSB,KXINI:: KXCAN::TKXOUT::HKXPWF:: RETURNS .ENDHEDULE SOMETHING ELSE A45$:6 MOV #$STACK-24,SP ;GET RID OF EVERYTHING BUT THE DSW' MOV (SP),-(SP) ;MOVE THE DSW DOWN ONET6 MOV #$DRWSE,2(SP) ;SCHEDULE SOMETHING ELSE WHEN DONE JMP $FINDR ;GO TO $DRFINL<50$: MOV (SP),10 - Pointer to first location past the included timestamp W; CS:e3X; No block was allocated, R0,R1 are indeterminateoY; LZ; The first word of the primary pool block contains the forward pointer inN[; the listhead. The second word contains the length of the block to be usedL\; when the block is deallocated. Subsequent data in the block will become]; error location dependent. ; %^; R2 - R5 are saved across the call _;- `$ALOC::r/a TST $SHERR ;Is the file debugging turned onb SEC ;Assume not turned on#c BEQ 50$ ;If EQ, no, simply exit 6d CMP #<10.*2>,R1 ;See if there is a big enough spacee SEC ;Assume failure4f BHI 50$ ;If HI, not enough space to do timestamp(g MOV R2,-(SP) ;Save R2 across the call1h CALL $ALOCB ;Allocate a chunk of primary poolh5i BCS 45$ ;If CS, not able to allocate, skip actiono7j MOV R0,-(SP) ;Zero the block out before copying data-k MOV R1,-(SP) ;sl5$: CLRB (R0)+ ;Am SOB R1,5$ ;Hn MOV (SP)+,R1 ;eo MOV (SP)+,R0/p MOV R1,2(R0) ;Put in the length of the block 5q MOVB (SP),3(R0) ;Put in operation code on top bytei2r MOV R0,R1 ;Copy address of block for insertion:s MOV #$SHLIM,R0 ;Address of listhead to be inserted into;t CALL $QINSF ;Insert entry into processing task listheadh2u MOV R1,-(SP) ;Save address of block across call4v MOV $SHERR,R0 ;Get TCB address of processing task,w CALL $EXRQU ;Request the processing task5x MOV (SP)+,R0 ;Set up address of primary pool block+#y ADD #4,R0 ;Point past size word(1z MOV #$TTNS-14,R2 ;Point to current time vector3<{10$: MOV (R2)+,(R0)+ ;Insert time parameter in task buffer%| CMP R2,#$TTNS ;Any more to insert?#} BLOS 10$ ;If LOS, yese(~ MOV $TKPS,(R0)+ ;Set ticks per second CLC ;Indicate success45$: MOV (SP)+,R2 ;Restore R2S9 MOV R0,$SHLOS ;Store the pointer position of the block , MOV 4(SP),R5 ;Restore registers for $COPY MOV 6(SP),R4 ;n MOV 10(SP),R3 ; MOV 12(SP),R2 ; MOV 14(SP),R1 ; MOV 16(SP),R0 ; 50$: RETURNw;+O; $COPY - Routine to put a series of parameters into the previously allocatedmH; primary pool block. This routine also places the starting address ofF; the block of data into the primary pool packet. This size must beE; be reflected in the total SIZE attribute of the MESAG$ macro, but;3; not in the individual size values inside the <>);R ; Inputs:e8; $SHLOS - Pointer to next word of free space in block9; 2(SP) - Size in bytes of data to be moved into block.0(00{{{cccc; 4(SP) - Address of data to be dumped;tL; Due to the nature of the CS from $PTMSG and nothing but MOV instructionsM; between the routine calls, the BCS at the start of this routine cannot betN; moved without destroying random locations in memory if $PTMSG/$ALOC fails.;- $COPY::E1 BCS 30$ ;If CS, $PTMSG failed for some reasonl* MOV R0,-(SP) ;Save R0,R1,R2 across call MOV R1,-(SP) ;  MOV R2,-(SP) ;p1 MOV 10(SP),R1 ;Get address of data to be movedb+ MOV 12(SP),R2 ;Get byte size to transferd5 MOV $SHLOS,R0 ;Get address of block to transfer to , INC R2 ;Round up to even number of bytes3 BIC #177401,R2 ; also get rid of data type codef ASR R2 ;Turn into words # BEQ 20$ ;If none, skip transferi9 MOV R1,(R0)+ ;Move in the starting address of the dataB> MOVB R2,(R0)+ ;Put number of words and type code in packet  MOVB 13(SP),(R0)+ ;510$: MOV (R1)+,(R0)+ ;Move rest of data into packetP SOB R2,10$ ;:20$: MOV R0,$SHLOS ;Update the pointer to next free byte" MOV (SP)+,R2 ;Restore registers MOV (SP)+,R1 ;f MOV (SP)+,R0 ;;. CLC ;Make sure next pass makes it through230$: MOV (SP)+,2(SP) ;Gimmick the return address: MOV (SP),(SP)+ ;Pop off size value and retain carry bit RETURN  .PAGE;nN; TTMSG - ROUTINE TO DUMP SINGLE CHARACTER DATA OUT TO THE CONSOLE TERMINAL; .TTMSG::" MOV R0,-(SP) ;SAVE R0 FOR LATER" MOV R1,-(SP) ;SAVE R1 FOR LATER/ MOV 6(SP),R1 ;PICK UP ADDRESS OF OUTPUT TEXTp# MTPS #PR7 ;LOCK OUT INTERRRUPTS+: MOV KISAR5,-(SP) ;SAVE CONTEXT OF POSSIBLE DATA MAPPING1 MOV KINAR5,KISAR5 ;MAP THE TEXT FOR THE OUTPUT-10$: MOVB (R1)+,R0 ;GET NEXT BYTE TO OUTPUTe BEQ 30$ ;IF EQ DONEp, MOVB R0,TPS+2 ;LOAD BYTE IN OUTPUT BUFFER20$: TSTB TPS ;PRINTER BUSY? & BCS 30$ ;IF CS NO CONSOLE TERMINAL BPL 20$ ;IF PL YES BR 10$ ;GO AGAIN#30$: MTPS #0 ;RESTORE INTERRUPTS- MOV (SP)+,KISAR5 ;RESTORE ORIGINAL MAPPING) MOV (SP)+,R1 ;RESTORE R1T MOV (SP)+,R0 ;RESTORE R0U9 MOV (SP)+,(SP) ;COPY RETURN ADDRESS OVER INPUT ADDRESSL RETURNI .ENDC ; D$$CHE!CHEDBG .IF DF CHESAN;+N; .CRSAN - ROUTINE TO CREATE A DATA BLOCK CONTAINING THE DEVICE UCB ADDRESS,H; STARTING LBN, AND SIZE OF THE REQUEST BEING SET UP. THIS BLOCK WILLF; BE HUNG OFF THE CED WHEN IT IS DECLARED DEFERRED. WHEN THE CED ISF; EVENTUALLY WRITTEN TO DISK, A CORRESPONDING ROUTINE WILL VALIDATE G; AGAINST THESE PARAMETERS, DELETE THE BLOCK, AND CRASH IF THEY DON'TR ; MATCH.; ; INPUTS:P(; R1 - I/O PACKET FOR INCOMING REQUEST,; I.PRM+P4(P5) -> STARTING LBN OF REQUEST"; R4 - POINTER TO ASSOCIATED CED; R5 - UCB ADDRESS OF DEVICE;I; ALL REGISTERS ARE PRESERVEDT;- .CRSAN::% TST E.MBXC(R4) ;ALREADY ALLOCATEDL# BNE 30$ ;IF NE, YES, SKIP THISN4 MOV R5,-(SP) ;SAVE ALL REGISTERS ACROSS THE CALL MOV R4,-(SP) ; MOV R3,-(SP) ; MOV R2,-(SP) ; MOV R0,-(SP) ; MOV R1,-(SP) ;6 CALL $ALPKT ;ALLOCATE A PACKET THE SIZE OF AN I/O BCC 10$ ;IF CC, SUCCESSFULO( CLR R0 ;INDICATE NO BLOCK TO ASSIGN BR 20$ ;JOIN COMMON CODE-410$: MOV 12(SP),(R0) ;MOVE UCB ADDRESS INTO BLOCK- MOV (SP),R1 ;GET BACK I/O PACKET ADDRESS3 MOV I.PRM+P5(R1),2(R0) ;GET LSP OF LBN IN PACKETL& CLR 4(R0) ;INITIALIZE BYTE OF MSP* BISB I.PRM+P4(R1),4(R0) ;GET MSP OF LBN-20$: MOV 10(SP),R4 ;RESTORE ADDRESS OF CED;6 MOV R0,E.MBXC(R4) ;INITIALIZE POINTER TO NEW BLOCK# MOV (SP)+,R1 ;RESTORE REGISTERSC MOV (SP)+,R0 ; MOV (SP)+,R2 ; MOV (SP)+,R3 ; MOV (SP)+,R4 ; MOV (SP)+,R5 ; 30$: RETURNI;+J; .CKSAN - ROUTINE TO VALIDATE THE PARAMETERS STORED IN THE SANITY BLOCKF; CONNECTED TO THE CED OF A DEFERRED WRITE AT THE TIME IT WAS MARKED ; DEFERRED.R;) ; INPUTS:E'; R0 - CED ADDRESS OF DEFERRED EXTENT;%; R1 - I/O PACKET OF INTERNAL WRITER,; R5 - UCB ADDRESS OF DEVICE GETTING WRITE;I; ALL REGISTERS ARE PRESERVEDV;- .CKSAN::$ MOV R00{{ttt tfDATA5,-(SP) ;SAVE ALL REGISTERS MOV R4,-(SP) ; MOV R3,-(SP) ; MOV R2,-(SP) ; MOV R1,-(SP) ; MOV R0,-(SP) ;0 MOV E.MBXC(R0),R4 ;GET POINTER TO DATA BLOCK# BEQ 20$ ;IF EQ, ASSUME CORRECTO/ CLR E.MBXC(R0) ;CLEAR POINTER TO DATA BLOCKE# CMP R5,(R4) ;DO THE UCBS MATCH BNE 10$ ;IF NE, NO, ERROR8 CMP 2(R4),I.PRM+P5(R1) ;DOES THE LSP OF THE LBN MATCH BNE 10$ ;IF NE, NO, ERROR0 CMPB 4(R4),I.PRM+P4(R1) ;MSP OF THE LBN MATCH BEQ 20$ ;IF NE, NO, ERROR10$: BPT ;CRASH THE SYSTEM,20$: MOV R4,R0 ;ELIMINATE THE DATA BLOCK CALL $DEPKT ;+ MOV (SP)+,R0 ;RESTORE ALL THE REGISTERSX MOV (SP)+,R1 ; MOV (SP)+,R2 ; MOV (SP)+,R3 ; MOV (SP)+,R4 ; MOV (SP)+,R5 ; RETURNO;+K; .CKUCB - ROUTINE TO MAKE SURE R5 GOING INTO $DRQRQ MATCHES THE VALUE IN2; THE I/O PACKET;H ; INPUTS:L+; R1 - I/O PACKET ADDRESS GOING TO DRIVERC9; R5 - UCB ADDRESS BEING GIVEN TO DRIVER CALL AT $DRQRQ;;- .CKUCB::2 CMP I.UCB(R1),R5 ;DOES THE UCB ADDRESSES MATCH BEQ 10$ ;IF EQ, YES BPT ;STOP THINGS HERE( 10$: RETURNR;+M; .CKIOP - ROUTINE TO VALIDATE THE ORIGINAL AND DUPLICATE I/O PACKETS BEING(,; USED TO WRITE CACHE DATA OUT TO THE DISK; ; INPUTS:U/; R1 - I/O PACKET ABOUT TO BE GIVEN TO DRIVERT1; R5 - UCB ADDRESS OF DEVICE PACKET IS GOING TON;- .CKIOP::, MOV R0,-(SP) ;SAVE REGISTERS ACROSS CALL MOV R1,-(SP) ; MOV R4,-(SP) ;4 MOV KISAR5,-(SP) ;SAVE MAPPING REGISTERS AS WELL MOV KISAR6,-(SP) ;3 MOV I.AADA(R1),R4 ;POINT TO ORIGINAL I/O PACKETR5 CALL .CKUCB ;SEE IF THE DUPLICATE MATCHES R5 UCBA< CMP I.UCB(R1),I.UCB(R4) ;SEE IF I/O PACKETS AGREE ON UCBS BNE 50$ ;IF NE, CRASHH CMPB I.PRM+P4(R1),I.PRM+P4(R4) ;DO THE STARTING LBNS AGREE IN PACKETS BNE 50$ ;IF NE, NO CRASHE" CMP I.PRM+P5(R1),I.PRM+P5(R4) ; BNE 50$ ;A MOV I.PRM+P6.1(R4),R4 ;GET CED ADDRESS ASSOCIATED WITH REQUEST,) CALL MAPPAR ;MAP THE CACHE PARTITIONGC CMPB I.PRM+P4(R1),E.LBNL-1(R4) ;IS THE LBN WITHIN THE CED VALUESI BLO 50$ ;IF LO,NO, CRASHC$ BHI 10$ ;IF HI, YES, DEFINITELY8 CMP I.PRM+P5(R1),E.LBNL(R4) ;DOES THE LOWER VALUE FIT BLO 50$ ;IF LO, NO5910$: MOV I.PRM+P2(R1),R0 ;GET SIZE OF REQUEST IN BYTESH# ADD #777,R0 ;CONVERT TO BLOCKSB ROR R0 ;, SWAB R0 ; BIC #177400,R0 ;2 DEC R0 ;DECREMENT COUNT BY ONE FOR COMPARISON= MOV I.PRM+P5(R1),-(SP) ;CALCULATE HIGHEST LBN IN CED RANGE  MOV I.PRM+P4(R1),-(SP) ; ( ADD R0,2(SP) ;ADD IN SIZE OF REQUEST) ADC (SP) ;ADD THE CARRY IF NECESSARY 8 CMPB (SP)+,E.LBNH+2(R4) ;IS THE LBN WITHIN HIGH RANGE BHI 50$ ;IF HI, NOT BLO 60$ ;IF LO, YES CMP (SP)+,E.LBNH(R4) ;M" BLO 70$ ;IF LO, EVERYTHING OK50$: BPT ;CRASH HERE,660$: TST (SP)+ ;POP THE EXTRA WORD FROM COMPARISON370$: MOV (SP)+,KISAR6 ;RESTORE MAPPING REGISTERSB MOV (SP)+,KISAR5 ;- MOV (SP)+,R4 ;RESTORE THE SAVED REGISTERSI MOV (SP)+,R1 ; MOV (SP)+,R0 ; RETURNR .ENDC ;CHESANQ .ENDADC (SP) ;ADD THE CARRY IF NECESSARY 8 CMPB (SP)+,E.LBNH+2(R4) ;IS THE LBN WITHIN HIGH RANGE BHI 50$ ;IF HI, NOT BLO 60$ ;IF LO, YES CMP (SP)+,E.LBNH(R4) ;M" BLO 70$ ;IF LO, EVERYTHING OK50$: BPT ;CRASH HERE,660$: TST (SP)+ ;POP THE EXTRA WORD FROM COMPARISON370$: MOV (SP)+,KISAR6 ;RESTORE MAPPING REGISTERSB MOV (SP)+,KISAR5 ;- MOV (SP)+,R4 ;RESTORE THE SAVED REGISTERSI MOV (SP)+,R1 ;/ .TITLE XXDRV - GENERAL DEVICE INTERFACE DRIVERe .IDENT /1.02/;d; COPYRIGHT (C) 1987 BY); DIGITAL EQUIPMENT CORPORATION, MAYNARD:(; MASSACHUSSETTS. ALL RIGHTS RESERVED.;t5; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY5; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE5; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE5; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER5; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE5; MADE AVAILABLE TO ANY OTHER PERSON. 00{{{ccccNO TITLE TOX5; AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED.;(5; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO5; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUEDF5; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ;D6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR 5; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT ISI; NOT SUPPLIED BY DIGITAL.;N%; KAREN L. NOEL AND PAUL K. M. WEISS E;O; MODIFICATIONS:;); V1.02 KLN - ADD XXCAN ENTRY POINT CODEO;T; MACRO LIBRARY CALLSI; * .MCALL HWDDF$,PKTDF$,SCBDF$,UCBDF$,CPRDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS SCBDF$ ,,1 ;SCB DEFINITIONSH% UCBDF$ ;UNIT CONTROL BLOCK OFFSETS $ PKTDF$ ;DEFINE I/O PACKET OFFSETS# CPRDF$ ;CPR SPECIFIC DEFINITIONSI;A; DEVICE DISPATCH TABLEL;  DDT$ XX,1,,,,NEW=Y;B; LOCAL SYMBOLSF;R MAP6 = 140000 .PAGE' .SBTTL XXUCB - UNIT ONLINE ENTRY POINT.&; ** - XXUCB - UNIT ONLINE ENTRY POINT;ID; FOR TT: UCBS WHICH ARE IN THE GENERIC DATA BASE, CALL THE ROUTINE E; $CPRCN TO ASSOCIATE THE TT: UCB WITH A CORRESPONDING VMS CP: UCB: !; FOR ALL OTHER UCBS, JUST RETURN ; *; SET UNIT MOUNTED (IF A MOUNTABLE DEVICE);C ; INPUTS:; F; R5 UCB ADDRESS; C=1 TRANSITION TO OFFLINE; C=0 TRANSITION TO ONLINE;I ; OUTPUTS:;L/; IE.DNR IS SET IN $SCERR IF OFFLINE TRANSITIONF;RXXUCB::  BCC 3$ ;IF CC ONLINE REQUEST * MOV #IE.DNR,$SCERR ;SET DEVICE NOT READY BR 10$ ;AND RETURNI3$: I; CHECK FOR UNIT ALREADY ONLINE SO WE DON'T DO THE CONNECT MORE THAN ONCE ;O- BITB #US.OFL,U.ST2(R5) ;UNIT ALREADY ONLINE?U BEQ 10$ ;IF EQ YES ; M; ONLY CALL THE CONNECT ROUTINE IF THE UNIT IS A REAL UNIT, NOT A GENERIC ONE ;*5$: MOV U.DCB(R5),R0 ;GET THIS UNIT'S DCB+ CMPB #377,D.UNIT(R0) ;IS IT A GENERIC DCB:% BEQ 10$ ;IF EQ YES - DON'T CONNECTI' JMP $CPCON ;CALL THE CONNECT ROUTINEI 10$: RETURNE .PAGE5 .SBTTL XXKRB - CONTROLLER ONLINE/OFFLINE ENTRY POINTA3; ** - XXKRB- CONTROLLER ONLINE/OFFLINE ENTRY POINTW;O ; INPUTS:C; T; R2 KRB ADDRESS; C=1 TRANSITION TO OFFLINE; C=0 TRANSITION TO ONLINE; ; OUTPUTS:;/; IE.DNR IS SET IN $SCERR IF OFFLINE TRANSITIONS;RXXKRB:: BCC 10$ ;IF CC ONLINE REQUEST* MOV #IE.DNR,$SCERR ;SET DEVICE NOT READY 10$: RETURNI$XXINT:: .PAGE( .SBTTL XXINI - INITIATE I/O ENTRY POINT'; ** - XXINI - INITIATE I/O ENTRY POINT:;T ; INPUTS:A; .; R4 = SCB ADDRESSL; R5 = UCB ADDRESS ;O ; OUTPUTS:;X;; IF RESOURCES ARE AVAILABLE, THE REQUEST IS DEQUEUED AND ); PROCESSED ACCORDING TO THE DEVICE TYPE.O;FXXINI::=;R; FINISH DIRECTIVE - ;U+ MOV #$STACK-24,SP ;POINT SP AT STATUS WORDI; F; (NOTE TO BENNY: THE FOLLOWING CODE WAS STOLEN FROM $DRFIN IN DRDSP);$A; INCREMENT GROUP GLOBAL USE COUNTS (OR SCRATCH WORD IF DIRECIVESB; DON'T USE GROUP GLOBALS);P .IF DF G$$GEF/ INC @$GEFPT ;INCREMENT GROUP GLOBAL USE COUNT 1 INCB @$GFTCB ;INC GRP GLOBAL USE COUNT FOR TASK  .ENDC ; DF G$$GEF;R'; WRITE DIRECTIVE STATUS BACK INTO TASKD;D* MTPD$ @#H.DSW ;SET DIRECTIVE STATUS WORD;H; GET USER STACK POINTER AND UPDATE TO REMOVE DPB OR ADDRESS OF DPB FROM ; THE STACK.;! MFPI SP ;GET USER STACK POINTERG. ADD $BTRMV,(SP) ;REMOVE BYTES FROM USER STACK% MTPI SP ;RESTORE USER STACK POINTERA; *; CHECK IF NEWEST PACKET IS FOR A TERMINAL;2 BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL DEVICE? BEQ NONTTY ;IF EQ NO; *; CALL TERMINAL PARAMETER CHECKING ROUTINEH; THIS MUST BE CALLED BEFORE THE PACKET IS QUEUED SINCE THE CONTEXT MUST; BE OF THE ISSUING TASK;E, CALL XXTTI ;CALL TERMINAL SPECIFIC ROUTINE BR TSTQUE ;GO DEQUEUE A PACKET;P%; PREPROCESS NON TERMINAL I/O PACKETSTI; THIS INCLUDES ACP FUNCTIONS AND NORMAL I/O FUNCTIONS FOR EVERYTHING BUT ; TERMINALSUNONTTY: & CALL XXPRE ;PREPROCESSES I/O PACKETS;O; SEE IF ANYTHING IN OUR QUEUE;1TSTQUE: TST (R4) ;QUEUE EMPTY? BNE 10$ ;IF NE NO  RETURN ;NOTHING TO DO;E"; ALLOCATE A CPRBUF REQUEST PACKET;E$; WE DO NOT DO IMPLICIT TASK START!00{{ttt tfDATA.; THE TASK HAS ALREADY BOUND THE LUN WITH ITS C; AME. THIS MEANS THAT THE IMPLICIT TASK START HAD TO HAVE ALREADY K; HAPPENED. SINCE WE MAY NOT BE RUNNING UNDER THE CONTEXT OF THE SAME TASKIK; THAT ISSUED THE QIO, THE VALUE IN $TKTCB IS NOT VALID. THE KXDRIVER USESLJ; $TKTCB TO SEE IF IT NEED TO DO AN IMPLICIT TASK START ONLY IF THE AL$IMP ; BIT IS SET.);Q:10$: MOV #AL$XXD,R0 ;INDICATE NO BLOCKING AND NO PC BACKUP MOV #1,R1 ;ALLOCATE 1 BLOCKS- CALL $CPALO ;CALL ALLOCATE ROUTINE IN KXDRV!; J; THE KXDRIVER WILL NOT RETURN TO US IF IT FAILS TO ALLOCATE EITHER A RINGJ; OR A BLOCK OF CPRBUF. SINCE WE DO NOT NECESSARILY HAVE THE TASK CONTEXTJ; AND WE DO NOT WANT TO REISSUE THE QIO, WHEN RESOURCES BECOME AVAILABLE, I; THE KXDRIVER WILL CALL US HERE WITH THE CARRY BIT SET. THEN WE REISSUEOM; THE REQUEST FOR RESOURCES. THE KXDRIVER STORES THE VALUE OF THIS LOCATION,DI; WHICH IT TOOK IT OFF THE STACK, WHEN THE ALLOCATION FAILED. THE DRIVER; RESTORES R5 FOR US ALSO.;R, BCC 30$ ;IF CC, ALLOCATION WAS SUCCESSFUL;UJ; THE ALLOCATION FAILED, FORK SO THE KX DRIVER CAN FINISH WAKING UP OTHER ; TASKSN;N% TST S.FRK+2(R4) ;FORK BLOCK IN USE? % BEQ 15$ ;IF EQ, NO, FORK THIS TIME  RETURN ;RETURN B(15$: CALL $FORK ;CREATE SYSTEM PROCESS ;R5 MUST STILL BE THE UCB' ;R4 MUST BE THE SCB TO CALL $FORK 9 CLR S.FRK+2(R4) ;FREE FORK BLOCK FOR FURTHER INTERRUPTSO# BR 10$ ;GO TRY TO ALLOCATE AGAINO;AG; THIS IS THE DRIVER ACCEPTANCE ROUTINE FOR $GSPKT - WE ACCEPT ANYTHINGL'20$: CLC ;CLEAR CARRY FOR GSPKT$ CALLN RETURN ; ;T"; GET AN I/O PACKET FROM THE QUEUEF; WE USE $GSPKT INSTEAD OF $GTPKT SINCE WE IGNORE THE BUSY BIT IN THE J; CONTROLLER. THE AME WILL DECIDE IF A PARTICULAT CONTROLLER IS TOO BUSY.;Y#30$: MOV R0,-(SP) ;SAVE BUFFER BIAST, MOV #20$,R2 ;ADDRESS OF ACCEPTANCE ROUTINE! CALL $GSPKT ;DEQUEUE I/O PACKETO" MOV (SP)+,R0 ;RESTORE BUFFER BIAS& BCC 40$ ;IF CC, WE GOT AN I/O PACKET; J; THIS SHOULD NEVER HAPPEN. $GSPKT IS SPECIAL CASED TO GIVE US ANY PACKETN; IN OUR QUEUE INCLUDING ATTACH AND DETACH. THIS IS HERE TO PROTECT OURSELVES; AND THE AME ;K7 CALLR $CPDEA ;DEALLOCATE THE CPRBUF PACKET AND RETURN;O; AFTER CALL TO $GSPKT;I; R1 = ADDRESS OF I/O PACKET; R2 = PHYSICAL UNIT #; R3 = CONTROLLER INDEXB; R4 = SCB ADDRESS;D40$: ;E; CHECK FOR OVERLAY QIO'ST;D! MOV I.UCB(R1),R5 ;GET UCB ADRESSR! TST U.CW1(R5) ;MOUNTABLE DEVICE?C. BPL 50$ ;IF PL NO, CAN'T BE OVERLAY FUNCTION$ MOV I.FCN(R1),R2 ;GET FUNCTION CODE0 CMP #IO.LOV,R2 ;IS IT THE I-SPACE LOAD OVERLAY? BEQ OVERLD ;IF EQ YESO0 CMP #IO.LDO,R2 ;IS IT THE D-SPACE LOAD OVERLAY? BEQ OVERLD ;IF EQ YESU; -; START FILLING IN THE CPRBUF REQUEST PACKET I; "50$: MOV R0,KISAR6 ;MAP THE PACKET" MOV #MAP6,R2 ;POINT TO THE HEADER% MOVB #HT$QIO,H$TYPE(R2) ;QIO REQUESTE CLRB H$ICNT(R2) ;NO ITEMS+ ADD #P$LUN,R2 ;POINT TO THE PARAMETER AREAT;CJ; FINISH FILLING IN THE I/O PACKET, WE ASSUME THERE CAN NOT BE MORE THAN 8; PARAMETER WORDS .60$: MOVB I.LN2(R1),(R2)+ ;FILL IN P$LUN FIELD+ MOVB I.LN2+1(R1),(R2)+ ;FILL IN FLAGS WORD TST (R2)+ ;RESERVED WORD/ MOV I.FCN(R1),(R2)+ ;FILL IN I/O FUNCTION CODE MOV R1,R3* ADD #I.PRM,R1 ;POINT TO THE PARAMTER LIST .REPT 8.A! MOV (R1)+,(R2)+ ;COPY PARAMETERSP .ENDR+ MOV R4,(R2) ;COPY SCB ADDRESS INTO PACKETU' MOV R3,2(R2) ;COPY I/O PACKET ADDRESS $;,; SEND QIO REQUEST TO AMEA;T)SENPKT: SUB #MAP6,R2 ;GET SIZE OF REQUESTE CPSEN$ #SN$QIO,R0,R2E;R; GET RETURN PACKET ;D( MOV KISAR6,R3 ;SAVE TASK HEADER MAPPING MOV R0,KISAR6 ;MAP PACKET( MOV #MAP6,R2 ;POINT TO HEADER OF PACKET( MOV P$PARM+20(R2),R4 ;SAVE SCB ADDRESS . MOV P$PARM+22(R2),R5 ;SAVE I/O PACKET ADDRESS, MOV H$STAT(R2),-(SP) ;GET FIRST STATUS WORD/ MOV H$STAT+2(R2),-(SP) ;AND SECOND STATUS WORDR MOV R3,KISAR6 ;MAP TASK HEADER ; ; DEALLOCATE PACKET ; / CALL $CPDEA ;CPDEA: PRESERVES R4,R5 AND STACK;/; CONVERT LUN NUMBER BACK INTO POINTER INTO LUTN;S% MOVB I.LN2(R5),R3 ;GET LUN NUMBER! DEC R3 ;L00|{{ccccUN NUMBERS START AT 1R/ ASL R3 ;MULTIPLY BY 4 (4 BYTES PER LUN ENTRY)R ASL R3 ;, ADD #,R3 ;GET OFFSET INTO LUT7 MOV R3,I.LN2(R5) ;RETURN TO LUN FIELD IN I/O PACKETE;M; COMPLETE I/O; # MOV R5,R3 ;GET I/O PACKET ADDRESS(# MOV I.UCB(R3),R5 ;GET UCB ADDRESS M2 BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL DEVICE?* BNE 30$ ;IF NE YES, NO FINISH PROCESSING; ; TEST FOR OVERLAY LOADS ; NO FINISH PROCESSING NECESSARY;N$ MOV I.FCN(R3),R2 ;GET FUNCTION CODE0 CMP #IO.LOV,R2 ;IS IT THE I-SPACE LOAD OVERLAY? BEQ 30$ ;IF EQ YES0 CMP #IO.LDO,R2 ;IS IT THE D-SPACE LOAD OVERLAY? BEQ 30$ ;IF EQ YES6 CALL XXFIN ;DO FINISH WORK FOR NON TERMINAL DEVICES& ; XXFIN: PRESERVES R4,R5 AND STACK030$: MOV (SP)+,R1 ;SETUP STATUS WORDS FOR $IODSA MOV (SP)+,R0 ;B> CLR I.PRM+16(R3) ;MAKE SURE IOFIN DOESN'T THINK WE HAVE BLOCK ;LOCKINGF; $IODSA WILL FORK USING THE I/O PACKET AS THE FORK BLOCK IF THERE IS #; ANOTHER I/O PACKETS IN OUR QUEUE.N?; THIS WILL ENSURE THAT THE KX DRIVER WILL GET TO COMPLETE ITS Q&; RING PROCESSING AS SOON AS POSSIBLE.;E* CALL $IODSA ;CALL I/O COMPLETION ROUTINE;&; SEE IF ANYTHING ELSE IS IN OUR QUEUE;M& MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESS JMP TSTQUE;+;M1; OVERLD - HANDLE LOAD OVERLAY REQUESTS TO CPRSYSP;R(; INPUT: R0 - BIAS OF THE REQUEST PACKET; R1 - ADDRESS OF I/O PACKET;C;-OVERLD:A; $; FILL IN THE CPRBUF REQUEST PACKET ;L MOV R0,KISAR6 ;MAP THE PACKET" MOV #MAP6,R2 ;POINT TO THE HEADER. MOVB #HT$LOV,H$TYPE(R2) ;LOAD OVERLAY REQUEST CLRB H$ICNT(R2) ;NO ITEMS, MOV R4,P$PARM+20(R2) ;SAVE THE SCB ADDRESS3 MOV R1,P$PARM+22(R2) ;SAVE THE I/O PACKET ADDRESSO+ ADD #P$IID,R2 ;POINT TO THE PARAMETER AREAA;E; LOAD PARAMETERS+;M5 MOV I.TCB(R1),R5 ;GET TCB ADDRESS OF REQUESTING TASKR/ MOV T.IID(R5),(R2)+ ;FILL IN IMAGE INDEX FIELD1$ MOV I.PRM+4(R1),(R2)+ ;FILL IN SIZE" MOV I.PRM(R1),(R2)+ ;FILL IN BIAS, MOV I.PRM+2(R1),(R2)+ ;FILL IN DISPLACEMENT- MOV I.PRM+12(R1),(R2)+ ;FILL IN BLOCK NUMBER$;,; SEND QIO REQUEST TO CPRSYS;+ JMP SENPKT ;AND GO SEND THE PACKET TO VMS(XXOUT::EXXPWF::A RETURNM .PAGE% .SBTTL XXCAN- CANCEL I/O ENTRY POINTS$; ** - XXCAN- CANCEL I/O ENTRY POINT;AK; CANCEL I/O FOR ALL OUTSTANDING I/O ON THE UNIT SPECIFIED BY THE UCB IN R5S;GK; FIRST SCAN THE DRIVER'S QUEUE FOR I/O PACKETS WHICH HAVEN'T BEEN SHIPPED 2J; OVER YET. ONLY THOSE I/O PACKETS WHOSE TCB ADDRESSES MATCH THAT OF THE L; CURRENT TASK AND WHOSE UCB ADDRESSES MATCH WILL BE CONCIDERED. SINCE THE H; UCB ADDRESS DOES NOT IDENTIFY A UNIQUE UNIT, THE LUN NUMBER IS CHECKEDJ; AGAINST THE ONE PASSED TO US. IF ALL THESE MATCH, THE PACKET IS REMOVEDJ; FROM THE QUEUE AND THE I/O FINISHED. IF THE UCB ADDRESSES MATCH AND LUNJ; NUMBERS DON'T, WE MUST DO A FAKE GDVI DIRECTIVE TO FIND OUT IF THE UNITS; ARE THE SAME./;A ; INPUTS: ; '!; R1 TCB ADDRESS OF CURRENT TASK ; R4 SCB ADDRESS OF XX SCB; R5 UCB ADDRES TO KILL I/O TOH; $CPPKT BIAS OF A PACKET IN CPRBUF TO USE FOR I/O KILL OR GDVI REQUEST(; $CPLUN LUN NUMBER OF I/O KILL REQUESTF; P$LUN+2 OFF CPRBUF PACKET CONTAINS THE NUMBER OF WORDS ON THE STACK 6; WHICH MUST BE SAVED IF A GDVI PACKET MUST BE PASSED; $TEMP2;N ; OUTPUTS:;UD; APPROPRIATE I/O PACKETS ARE REMOVED FROM THE QUEUE AND AN I/O KILLD; PACKET IS SENT TO THE HOST, TO KILL ALL I/O OUTSTANDING ON THE LUN;XXCAN::A;E$; SCAN SCB QUEUE FOR PACKETS TO KILL; / MOV R4,R3 ;COPY ADDRESS OF I/O QUEUE LISTHEAD .10$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT ENTRY( MOV (R2),R3 ;GET ADDRESS OF NEXT ENTRY BEQ 100$ ;IF EQ, NONE , CMP R1,I.TCB(R3) ;REQUEST FOR CURRENT TASK? BNE 10$ ;IF NE NOH$ TST $CPLUN ;IS KILL FOR ALL UNITS? BEQ 50$ ;IF EQ YES- CMP R5,I.UCB(R3) ;REQUEST FOR SPECIFIED UCB?O BNE 10$ ;IF NE NOD! MOV I.LN2(R3),R0 ;GET LUN NUMBER + SUB #H.LUN+2+MAP6,R0 ;CALCULATE LUN NUMBER ASR R0 ;DIVIDE BY 4N ASR R0 ;# CMP R0,$CPLUN ;IS IT THE SAME LUN?C BEQ 50$ ;IF EQ YES;LE; IF THIS IS A SPECIFIC REMOTE DEVICE, (IE. HTn: UNIT) WE CAN KI00 | |ttt tfDATALL IT ;T MOV (R5),R1 ;GET DCB ADDRESS3 CMP #377,D.UNIT(R1) ;IS IT A REAL GENERIC DEVICE?R) BNE 50$ ;IF NE NO, GO AHEAD AND KILL ITP; C; FIND OUT IF THIS LUN IS ASSIGNED TO THE UNIT WE ARE INTERESTED INR;E;TBD!50$: MOV (R3),(R2) ;CLOSE UP LIST BNE 60$ ;IF NE NO NEW LAST& MOV R2,2(R4) ;SET ADDRESS OF NEW LAST260$: MOV #IE.ABO&377,R0 ;SET FINAL STATUS TO ABORT* TSTB $TEMP2 ;SUBFUNCTION SET FOR IO.KIL? BMI 70$ ;IF MI YES2 CLR I.AST(R3) ;MAKE SURE THERE IS NO AST DECLARED&70$: CLR R1 ;CLEAR SECOND STATUS WORD! CALL $IOFIN ;FINISH I/O REQUEST ' MOV U.SCB(R5),R4 ;GET SCB ADDRESS BACK 1 MOV $TKTCB,R1 ;GET CURRENT TASK TCB ADDRESS BACKS JMP XXCAN ;SCAN QUEUE AGAINR100$:T;I!; PUT PACKET TOGETHER TO KILL I/O);L" MOV $CPPKT,KISAR6 ;MAP THE PACKET BEQ 200$ ;IF EQ DON'T KILL I/O" MOV #MAP6,R2 ;POINT TO THE HEADER% MOVB #HT$QIO,H$TYPE(R2) ;QIO REQUESTM CLRB H$ICNT(R2) ;NO ITEMS# MOVB $CPLUN,P$LUN(R2) ;FILL IN LUNT CLRB P$FLG(R2) ;NO BUFFERSS;EK; SEND QIO REQUEST TO AME WITH IMMEDIATE RETURN - PACKET WILL BE DEALLOCATEE; ON DETATCHED RETURN BY KXDRVB;D CPSEN$ #SN$PSR,KISAR6,#H$SIZE+4/ CLR $CPPKT ;INDICATE THAT I/O HAS BEEN KILLEDU200$:I RETURN$ .END; PUT PACKET TOGETHER TO KILL I/O);L" MOV $CPPKT,KISAR6 ;MAP THE PACKET BEQ 200$ ;IF EQ DON'T KILL I/O" MOV #MAP6,R2 ;POINT TO THE HEADER% MOVB #HT$QIO,H$TYPE(R2) ;QIO REQUESTM CLRB H$ICNT(R2) ;NO ITEMS# MOVB $CPLUN,P$LUN(R2) ;FILL IN LUNT CLRB P$FLG(R2) ;NO BUFFERSS;EK; SEND QIO R .TITLE XXFINg .IDENT /01.00/e;r6; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;t<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; K. L. NOEL 24-MAR-87;e/; I/O FINISHING MODULE FOR NON TERMINAL DEVICESf; ;t .PAGE;2; LOCAL SYMBOL DEFINITIONt;t6 MXSIZ = 0 ; MAXIMUM SIZE OF ATTRIBUTE TO GO IN CPRBUF/ MAP5 = 120000 ; ADDRESS OF FIRST WORD IN APR5. MAP6 = 140000 ; ADDRESS OF FIRST WORD IN APR6 .PAGE;+; "; I/O FUNCTION CODE DISPATCH TABLE; ;- DSPTBL: .WORD FN0BF ; 0 IO.KIL .WORD FN0BF ; 1 IO.WLBH .WORD FN0BF ; 2 IO.RLBB .WORD FN0BF ; 3 IO.ATT  .WORD FN0BF ; 4 IO.DETF .WORD FN0BF ; 5 ? .WORD FN0BF ; 6 ? .WORD FN0BF ; 7 ? .WORD 0 ;10-ILLEGAL FUNCTION- .WORD FNACP ;11-FIND FILE NAME IN DIRECTORYt. .WORD FNACP ;12-UNLOCK BLOCK - NOP'D IN MASK1 .WORD FNACP ;13-REMOVE FILE NAME FROM DIRECTORYN. .WORD FNACP ;14-ENTER FILE NAME IN DIRECTORY& .WORD FNACC ;15-ACCESS FILE FOR READ0 .WORD FNACC ;16-ACCESS FILE FOR READ AND WRITE6 .WORD FNACC ;17-ACCESS FILE FOR READ, WRITE, AND EXT .WORD FNDEA ;20-DEACCESS FILE $ .WORD FN0BF ;21-READ VIRTUAL BLOCK% .WORD FN0BF ;22-WRITE VIRTUAL BLOCK  .WORD FNACP ;23-EXTEND FILEO .WORD FNACP ;24-CREATE FILEO4 .WORD FNACP ;25-MARK FILE FOR DELETE/TRUNCATE FILE& .WORD FNACP ;26-READ FILE ATTRIBUTES' .WORD FNACP ;27-WRITE FILE ATTRIBUTESE/ .WORD FNACP ;30-USER MAGTAPE CONTROL FUNCTIONC* .WORD FN0BF ;31-TRANSMIT PROCESS MESSAGE) .WORD FN0BF ;32-RECEIVE PROCESS MESSAGED$ .WORD NTACC ;33-CONNECT TO PROCESS) .WORD NTDEA ;34-DISCONNECT FROM PROCESS-+ .WORD NCTSPL ;35-NETWORK CONTROL FUNCTIONL .PAGE;0'; DISPATCH TO CORRECT FINISHING ROUTINEP;2XXFIN::F SAVNR* MOV I.TCB(R3),R4 ;GET TCB ADDRESS OF TASK" MOV T.PCB(R4),R4 ;GET PCB ADDRESS! MOV P.REL(R4),KISAR6 ;MAP HEADERB0 MOVB I.FCN+1(R3),R2 ;RETRIEVE I/O FUNCTION CODE ASL R2 ;CONVERT TO WORD INDEXR4 MOV I.LN2(R3),R4 ;GET POINTER TO SECOND LUN WORD+ JMP @DSPTBL(R2) ;EXECUTE FINISHING ROUTINED-NCTSPL: ; SPLIT NETWORK CONTROL FUNCTIONS.D& MOV I.FCN(R4),R1 ; GET FUNCTION CODE.9 BIC #177707,R1 ; EXTRACT THREE BITS INDICATING FUNCTION.  ASR R1T ASR R1  JMP @NCTTBL(R1) ; DISPATCH.NCTTBL: .WORD NTACC ; 00, OPEN .WORD NTDEA ; 10, CLOSEP .WORD FN0BF ; 20, SPECIFY ASTP$ .WORD FN0BF ; 30, GET NETWORK DATA$ .WORD FN0BF ; 40, GET NETWORK DATA$ .WORD FN0BF ; 50, GET NETWOR00||{ccccK DATA .WORD FN0BF ; 60. .WORD FN0BF ; 70, GET LOCAL NODE INFORMATION;X; NON ACP FUNCTION;DFN0BF: RETURN;T$; NETWORK ACCESS AND DEACCESS STUBS.;R@NTACC: MOV #$XXWIN,(R4) ; SET UP REFERENCE TO FAKE WINDOW BLOCK. RETURN 9NTDEA: CLR (R4) ; DELETE REFERENCE TO FAKE WINDOW BLOCK.. RETURNL;; FINISH ACCESS FILE FUNCTIOND;DFNACC:8 MOV #$XXWIN,(R4) ;SET UP REFERENCE TO FAKE WINDOW BLOCK BR FNACP ;JOIN COMMON CODE;0 ; FINISH DEACCESS FILE FUNCTIONS; FNDEA:1 CLR (R4) ;DELETE REFERENCE TO FAKE WINDOW BLOCKF; ; FINSH ACP FUNCTION;AFNACP:% MOV I.PRM(R3),R1 ;IS THERE A BUFFER?U BEQ ACPDON ;IF EQ NO A MOV R1,KISAR6 ;MAP CPR BUFFER; ; COPY FNB IF THERE IS ONE;T' MOV I.PRM+16(R3),R2 ;GET OFFSET OF FNBR BEQ COPFID ;IF EQ NONE! MOV #15.*2,R0 ;GET LENGHT OF FNB+ CALL COPPRM ;COPY FNB INTO USER'S BUFFER ;V; COPY FID IF THERE IS ONE; COPFID:I! TST I.PRM+2(R3) ;IS THERE A FID?  BEQ COPATR ;IF EQ NO MOV #3.*2,R0 ;LENGHT OF FID MOV #4,R2 ;OFFSET TO FID0 CALL COPPRM ;COPY FID BACK INTO USER'S BUFFER ;A; COPY UPDATED ATTRIBUTES ; 4COPATR: MOV I.PRM+6(R3),R1 ;GET OFFSET OF ATTRIBUTES BEQ COPDON ;IF EQ NONE, BIS #MAP6,R1 ;MAKE SURE IT'S A APR6 ADDRESS 10$: TSTB (R1)+ ;TEST ATTRIBUTE BEQ 40$ ;IF EQ, NONE 5/ BGT 20$ ;IF GT ZERO, IT WAS A WRITE ATTRIBUTEN CLR R0 ;TO BE SAFE MOVB (R1)+,R0 ;GET LENGTH CMPB R0,#MXSIZ ;IS IT TOO BIG' BHI 30$ ;IF HI YES, COPY ALREADY DONE  TST (R1)+ ;SKIP PAST BIASD& MOV (R1)+,R2 ;GET OFFSET TO ATTRIBUTE- MOV R1,-(SP) ;SAVE POINTER TO ATTRIBUTE LISTY CALL COPPRM ;COPY PARAMETERR MOV (SP)+,R1 ;RESTORE POINTER BR 10$ ;GET NEXT ATTRIBUTE20$: INC R1 ;SKIP PAST LENGTH+30$: CMP (R1)+,(R1)+ ;SKIP PAST BIAS/OFFSETT BR 10$ ;GET NEXT ATTRIBUTE40$: COPDON:I;T; DEALLOCATE BUFFER ;R, MOV I.PRM(R3),R0 ;GET BIAS OF CPRBUF PACKET& MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS CALL $CPDEA ;DEALLOCATE PACKET) MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSMACPDON: RETURN;FB; COPPRM - COPY PIECE OF CPR BUFFER BACK INTO USER'S ADDRESS SPACE;L(; INPUTS: R0 - LENGHT OF BUFFER IN BYTES6; R2 - OFFSET OF SOURCE BUFFER FROM TOP OF CPR BUFFER:; DESTINATION BIAS AND DISPLACEMENT MUST BE LOCATED AFTER; THE INDICATED BUFFER ;T; OUTPUT: BUFFER IS COPIED; R3 IS PRESERVED;BCOPPRM:R" MOV I.PRM(R3),R1 ;GET SOURCE BIAS& MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS1 MOV R2,R4 ;GET BIAS OFFSET PAIR FOR DESTINATIONM' BIS #MAP6,R4 ; ADD IN OFFSET TO BUFFER" ADD R0,R4 ; AND LENGHT OF BUFFER# MOV (R4)+,R3 ;GET DESTINATION BIASA MOV (R4),R4 ; AND OFFSET ADD #MAP5,R2 ;GET SOURCE OFFSET CALL $BLXIO ;PERFORM COPY ) MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS  RETURNA .ENDST BE LOCATED AFTER; THE INDICATED BUFFER ;T; OUTPUT: BUFFER IS COPIED; R3 IS PRESERVED;BCOPPRM:R" MOV I.PRM(R3),R1 ;GET SOURCE BIAS& MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS1 MOV R2,R4 ;GET BIAS OFFSET PAIR FOR DESTINATIONM' BIS #MAP6,R4 ; ADD IN OFFSET TO BUFFER" ADD .TITLE XXPRE0 .IDENT /01.00/a;o6; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;c<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;-; K. L. NOEL 17-MAR-87;r.; PREPROCESSOR MODULE FOR NON TERMINAL DEVICES;m;r .PAGE; ; LOCAL SYMBOL DEFINITIONc;i/ MAP5 = 120000 ; ADDRESS OF FIRST WORD IN APR5. MAP6 = 140000 ; ADDRESS OF FIRST WORD IN APR6;d; GLOBAL SYMBOL DEFINITION;.7 MXSIZ == 0 ; MAXIMUM SIZE OF ATTRIBUTE TO GO IN CPRBUF7 ; ALSO USED IN MODULE XXFIN. .PAGE;+; "; I/O FUNCTION CODE DISPATCH TABLE;U;- DSPTBL: .WORD FC0BF ; 0 IO.KIL .WORD FC1BF ; 1 IO.WLB  .WORD FC1BF ; 2 IO.RLB .WORD FC0BF ; 3 IO.ATT .WORD FC0BF ; 4 IO.DETO .WORD FC0BF ; 5 ? .WORD FC0BF ; 6 ? .WORD FC0BF ; 7 ?" .WORD FCIFC ;10-ILLEGAL FUNCTION- .WORD FCPKT ;11-FIND FILE NAME IN DIRECTORYO. .WORD FCIFC ;12-UNLOCK BLOCK - NOP'D IN MASK1 .00| |ttt tfDATAWORD FCPKT ;13-REMOVE FILE NAME FROM DIRECTORYO. .WORD FCPKT ;14-ENTER FILE NAME IN DIRECTORY& .WORD FCACC ;15-ACCESS FILE FOR READ0 .WORD FCACC ;16-ACCESS FILE FOR READ AND WRITE6 .WORD FCACC ;17-ACCESS FILE FOR READ, WRITE, AND EXT .WORD FCDAC ;20-DEACCESS FILE.$ .WORD FC1BF ;21-READ VIRTUAL BLOCK% .WORD FC1BF ;22-WRITE VIRTUAL BLOCK .WORD FCEXT ;23-EXTEND FILEF .WORD FCCRE ;24-CREATE FILEO4 .WORD FCDEL ;25-MARK FILE FOR DELETE/TRUNCATE FILE& .WORD FCPKT ;26-READ FILE ATTRIBUTES' .WORD FCPKT ;27-WRITE FILE ATTRIBUTESE/ .WORD FCPKT ;30-USER MAGTAPE CONTROL FUNCTIONC* .WORD NTWVB ;31-TRANSMIT PROCESS MESSAGE) .WORD NTRVB ;32-RECEIVE PROCESS MESSAGED$ .WORD NTACC ;33-CONNECT TO PROCESS) .WORD NTDAC ;34-DISCONNECT FROM PROCESS-* .WORD NTNCT ;35-NETWORK CONTROL FUNCTION" .WORD FCIFC ;36-ILLEGAL FUNCTION" .WORD FCIFC ;37-ILLEGAL FUNCTION .PAGE;F; ILLEGAL FUNCTION;0FCIFC: .WORD IEIFC ;SET ILLEGAL FUNCTION STATUS;O"; NON ACP FUNCTION WITH NO BUFFERS;O4FC0BF: .WORD CK0XT ;EXIT WITH 0 BUFFER IN FLAG BYTE;S"; NON ACP FUNCTION WITH ONE BUFFER;W4FC1BF: .WORD CK1XT ;EXIT WITH 1 BUFFER IN FLAG BYTE;V8; ACCESS FILE FOR READ, READ/WRITE, OR READ/WRITE/EXTEND;OFCACC:4 .WORD CKALN ;CHECK IF FILE ALREADY ACCESSED ON LUN" .WORD BDPKT ;BUILD AN I/O PACKET .WORD CKLHD ;LOCK DOWN HEADER ! .WORD CKRLK ;SYNCHRONIZE ACCESS< .WORD CK1XC ;EXIT CONDITIONALLY WITH 1 BUFFER IN FLAG BYTE;T; DEACCESS FILE;O2FCDAC: .WORD CKNLN ;CHECK IF FILE ACCESSED ON LUN" .WORD BDPKT ;BUILD AN I/O PACKET .WORD CKLHD ;LOCK DOWN HEADERU! .WORD CKRLK ;SYNCHRONIZE ACCESS < .WORD CK1XC ;EXIT CONDITIONALLY WITH 1 BUFFER IN FLAG BYTE;E ; CREATE FILE/'; CREATE & ACCESS NOT LEGAL COMBINATIONK-; CREATE & EXTEND DOES NOT INCR PENDING COUNT ; SINCE NO WINDOW;.FCCRE:4 .WORD CKALN ;CHECK IF FILE ALREADY ACCESSED ON LUNFCDEL:FCEXT:; C; BUILD AN I/O PACKET FOR FIND, ENTER, REMOVE, EXTEND, DELETE, READ"; ATTRIBUTES, AND WRITE ATTRIBUTES;CFCPKT:" .WORD BDPKT ;BUILD AN I/O PACKET .WORD CKLHD ;LOCK DOWN HEADERE8 .WORD CK1XC ;EXIT CONDITIONALY WITH ONE BUFFER IN BYTE;DF; TABLE OF SPECIAL FUNCTION CODES TO BE CHECKED BY SOFTWARE WRITE LOCK; WLKTB: ;DEVICE DEPENDENT CODESN! .WORD IO.SMD ;SET MEDIA DENSITYS! .WORD IO.EOF ;WRITE END OF FILED .WORD IO.ERS ;ERASE TAPE# .WORD IO.DSE ;DATA SECURITY ERASE ;DIAGNOSTIC CODESE% .WORD IO.WDH ;WRITE DATA AND HEADERT& .WORD IO.WTD ;WRITE TRACK DESCRIPTOR0 .WORD IO.TDD ;WRITE TRACK DESCRIPTOR DISPLACED' .WORD IO.CEW ;WRITE BLOCK ON CE TRACK.* .WORD 0 ;TERMINATOR FOR WRITE LOCK TABLE,NTWVB: ; NETWORK SEND AND SEND INTERRUPT.+ .WORD CKNLN ; ENSURE FILE IS OPEN ON LUN.$ .WORD PRMPRP ; PREPARE PARAMETERS.2 .WORD CKBFR1 ; CHECK BUFFER ONE FOR READ ACCESS.. .WORD CK1XT ; INDICATE ONE BUFFER AND LEAVE.NTRVB: ; NETWORK RECEIVE.+ .WORD CKNLN ; ENSURE FILE IS OPEN ON LUN. $ .WORD PRMPRP ; PREPARE PARAMETERS.3 .WORD CKBFW1 ; CHECK BUFFER ONE FOR WRITE ACCESS.C. .WORD CK1XT ; INDICATE ONE BUFFER AND LEAVE.'NTACC: ; NETWORK ACCEPT AND CONNECT.O. .WORD CKALN ; ENSURE NO FILE IS OPEN ON LUN.$ .WORD PRMPRP ; PREPARE PARAMETERS.MERGE: ; MERGE FROM REJECT.2 .WORD CKBFR2 ; CHECK BUFFER TWO FOR READ ACCESS.2 .WORD CKBFR1 ; CHECK BUFFER ONE FOR READ ACCESS.9 .WORD ACSPL ; HANDLE SPECIAL ACCEPT/CONNECT PROCESSING..! .WORD CKLHD ; LOCK DOWN HEADER.E .WORD CKRLK ; INTERLOCK.* .WORD CKNXT ; EXIT WITH SEVERAL BUFFERS.2NTDAC: ; NETWORK ABORT, DISCONNECT, AND REJECT.+ .WORD CKNLN ; ENSURE FILE IS OPEN ON LUN.R$ .WORD PRMPRP ; PREPARE PARAMETERS.; .WORD ADRSPL ; DO SPECIAL ACCEPT/DISCONNECT/REJECT STUFF.R) ; REJECT GOES TO MERGE AT THIS POINT..2 .WORD CKBFR1 ; CHECK BUFFER ONE FOR READ ACCESS.! .WORD CKLHD ; LOCK DOWN HEADER.  .WORD CKRLK ; INTERLOCK.. .WORD CK1XT ; INDICATE ONE BUFFER AND LEAVE.6NTNCT: ; NETWORK CLOSE, GET LOCAL NODE INFORMATION,. ; GET NETWORK DATA, OPEN, AND SPECIF00"||{ccccY AST.2 .WORD NCTSPL ; SEPARATE PROCESSING AS NECESSARY.) ; GET NETWORK DATA AND GET LOCAL NODEN ; INFORMATION TO GO NTRVB.0 ; OPEN AND CLOSE FALL THROUGH, ANYTHING ELSE ; GOES TO SKIP.! .WORD CKLHD ; LOCK DOWN HEADER.P .WORD CKRLK ; INTERLOCK.SKIP:E. .WORD CK0XT ; INDICATE NO BUFFERS AND LEAVE. .PAGEXXPRE::R SAVNR;L0; PREPARE REGISTERS FOR POLISH DISPATCH ROUTINES;) MOV R1,R4 ;PUT I/O PACKET ADDRESS IN R4 0 MOVB I.FCN+1(R1),R2 ;RETRIEVE I/O FUNCTION CODE ASL R2 ;CONVERT TO WORD INDEXR3 MOV R5,-(SP) ;SAVE UCB ADDRESS FOR POLISH ROUTINESA MOV R5,R0 ;D5 MOV I.LN2(R4),R1 ;SAVE ADDRESS OF SECOND LUN WORDE" MOV R1,-(SP) ;FOR POLISH ROUTINES0 MOV DSPTBL(R2),R5 ;GET ADDRESS OF POLISH VECTOR$ JMP @(R5)+ ;EXECUTE POLISH ROUTINE;O; REGISTERS AT POLISH DISPATCH; ; R0 - UCB; R1 - ADDRESS 2ND LUN WORD; R2 - FCTN CODE; R4 - POINTER TO I/O PACKET;; SP-> 2ND LUN WORD ADDRESS ; UCB ADDRESS;VK; TASK HEADER IS ASSUMED TO BE MAPPED FOR ALL OF THE THREADED CODE ROUTINESR;M;R(; CHECK FOR FILE ALREADY ACCESSED ON LUN;A(CKALN: TST (R1) ;FILE ACCESSED ON LUN? BEQ CKJR5 ;IF EQ NOW JMP IEALN ;ERROR;P ; CHECK FOR FILE ACCESSED ON LUN;E(CKNLN: TST (R1) ;FILE ACCESSED ON LUN? BNE CKJR5 ;IF NE YES JMP IENLN ;ERROR; ; SET ACCESS/DEACCESS INTERLOCKA;E9CKRLK: INC @(SP) ;SET ACCESS/DEACCESS PENDING INTERLOCKKCKJR5: JMP @(R5)+N;DF; FUNCTION IS AN ILLEGAL FUNCTION-DECLARE ILLEGAL FUNCTION CODE STATUS;F0IEIFC: MOV #IE.IFC&377,R4 ;SET ILLEGAL FUNCTION JMP IECMN;S&; WRITE ATTEMPTED TO WRITE LOCKED UNIT;C/IEWLK: MOV #IE.WLK&377,R4 ;SET WRITE LOCK ERRORN BR IECMN ;; @; ILLEGAL BUFFER ADDRESS SPECIFIED-DECLARE ILLEGAL BUFFER STATUS;D.I2SPC: CLR -(R4) ;ERASE LAST ATTRIBUTE NUMBER2IESPC: MOV #IE.SPC&377,R4 ;SET ILLEGAL BUFFER CODEIECOM: BR IECMN ;;SG; ILLEGAL LOAD OVERLAY UCB-DECLARE ILLEGAL LOAD OVERLAY FUNCTION STATUS ;I8IEOVR: MOV #IE.OVR&377,R4 ;SET ILLEGAL LOAD OVERLAY CODE BR IECMN ;;&9; ILLEGAL BYTE COUNT OR ALIGNMENT-DECLARE ODD BYTE STATUSP; .IEBYT: MOV #IE.BYT&377,R4 ;SET ODD BYTE STATUS BR IECMN ;;R:; NO BUFFER SPACE AVAILABLE-SET NO BUFFER AVAILABLE STATUS;A7IENOD: MOV #IE.NOD&377,R4 ;SET NO BUFFER AVAILABLE CODES BR IECMN ;;(; BAD PARAMETER-SET BAD PARAMETER STATUS; 1IEBAD: MOV #IE.BAD&377,R4 ;SET BAD PARAMETER CODEY BR IECMN ;;L4; PRIVILEGE VIOLATION-SET PRIVILEGE VIOLATION STATUS;37IEPRI: MOV #IE.PRI&377,R4 ;SET PRIVILEGE VIOLATION CODE BR IECMN ;;O?; FILE ALREADY ACCESSED ON LUN-SET FILE ALREADY ACCESSED STATSU7; 9IEALN: MOV #IE.ALN&377,R4 ;SET FILE ALREADY ACCESSED CODEV BR IECMN ;;E5; NO FILE ACCESSED ON LUN-SET NO FILE ACCESSED STATUST; 6IENLN: MOV #IE.NLN&377,R4 ;SET NO FILE ACCESSED STATUS .IF DF,R$$LKL BR IECOM ;IER0: ; USE ERROR IN R0.B;R2; EXPLICIT UNLOCK PERFORMED OR BLOCK LOCKING ERROR; STATUS IN R0;IIELCK: MOV R0,R4 ;STATUS IN R0E .ENDC;T; COMMON ERROR EXITC; )IECMN: MOV $TEMP0,SP ;RESET STACK POINTER 6 MOV (SP)+,R0 ;RETRIEVE ADDRESS OF SECONDARY CONTROL B BEQ 10$ ;IF EQ NONEF1 CALL $DEATR ;DEALLOCATE SECONDARY CONTROL BLOCKO%10$: MOV R4,R0 ;SET FINAL I/O STATUSS& CLR R1 ;CLEAR SECOND I/O STATUS WORD- MOV (SP)+,R3 ;RETRIEVE ADDRESS OF I/O PACKETL TST (SP)+ ;CLEAN STACK' MOV I.UCB(R3),R5 ;RETRIEVE UCB ADDRESST( CALLR $IOFIN ;FINISH OFF I/O OPERATION)PRMPRP: ; PREPARE NETWORK PARAMETERS.U8 MOV I.PRM+12(R4),I.PRM+16(R4) ; WILL BE ADJUSTED LATER. MOV I.PRM+10(R4),I.PRM+14(R4) MOV I.PRM+6,I.PRM+12(R4)I MOV I.PRM+4(R4),I.PRM+6(R4) MOV I.PRM+2(R4),I.PRM+4(R4) JMP @(R5)+ ; LEAVE. .ENABL LSBT.CKBFR2: ; CHECK BUFFER TWO FOR READ ACCESS.0 MOV #I.PRM+6,R3 ; SET OFFSET TO SECOND ADDRESS. BR 10$R.CKBFR1: ; CHECK BUFFER ONE FOR READ ACCESS.- MOV #I.PRM,R3 ; SET OFFSET TO FIRST ADDRESS.S10$: ADD R4,R3 ; POINT TO ADDRESS.A MOV R1,-(SP) ; SAVE REGISTERS.W MOV R0,-(SP)U% MOV (R3),R0 ; GE00*| |ttt tfDATAT ADDRESS TO CHECK.  MOV 4(R3),R1 ; GET LENGTH.M BEQ 50$ ; YES, ACCEPT IT.P- CALL CKBFR ; CHECK BUFFER FOR WRITE ACCESS.)! BCS IER0 ; ERROR CODE IS IN R0.P" MOV R1,(R3)+ ; PUT APR IN PACKET.% MOV R2,(R3) ; PUT OFFSET IN PACKET.A50$:" MOV (SP)+,R0 ; RESTORE REGISTERS. MOV (SP)+,R1 JMP @(R5)+ ; LEAVE.C .DSABL LSBN .ENABL LSBS1CKBFW3: ; CHECK BUFFER THREE FOR WRITE ACCESS.0 ; THIS IS CUSTOMIZED FOR THE NETWORK DEVICE.0 MOV #I.PRM+14,R3 ; SET OFFSET TO THIRD ADDRESS. MOV R1,-(SP) ; SAVE REGISTER.) MOV I.PRM+16(R4),R1 ; GET LENGTH TO USE.,$ CMP R1,#20 ; IS LENGTH ACCEPTABLE? BHI IEBAD ; NO, SIGNAL ERROR.  CMP I.PRM+12(R4),#20P" ; IS SECOND LENGTH ACCEPTABLE? BHI IEBAD ; NO, SIGNAL ERROR.A@ ADD R1,I.PRM+4(R4) ; HACK FIRST LENGTH TO INCLUDE THIRD BUFFER. ADD I.PRM+12(R4),I.PRM+4(R4) + ; HACK FIRST LENGTH TO REPRESENT TOTAL.E8 MOVB R1,I.PRM+13(R4) ; COMBINE TWO LENGTHS IN ONE WORD. BR 10$K/CKBFW1: ; CHECK BUFFER ONE FOR WRITE ACCESS. - MOV #I.PRM,R3 ; SET OFFSET TO FIRST ADDRESS.I MOV R1,-(SP) ; SAVE REGISTER.( MOV I.PRM+4(R4),R1 ; GET LENGTH TO USE.10$: ADD R4,R3 ; POINT TO ADDRESS.P MOV R0,-(SP) ; SAVE REGISTER.% MOV (R3),R0 ; GET ADDRESS TO CHECK.O TST R1 ; IS LENGTH ZERO? BEQ 50$ ; YES, ACCEPT IT. - CALL CKBFB ; CHECK BUFFER FOR WRITE ACCESS.R! BCS IER0 ; ERROR CODE IS IN R0.O" MOV R1,(R3)+ ; PUT APR IN PACKET.% MOV R2,(R3) ; PUT OFFSET IN PACKET..50$:" MOV (SP)+,R0 ; RESTORE REGISTERS. MOV (SP)+,R1S JMP @(R5)+ ; LEAVE.T .DSABL LSBR%ACSPL: ; SPLIT ACCEPT AND CONNECT.EA BIT #10,I.FCN(R4) ; IS THIS AN ACCEPT (FUNCTION 15410 OR 15610)?O) BNE 10$ ; YES, SKIP CONNECT PROCESSING.S* MOV #1,R1 ; LIE ABOUT NUMBER OF BUFFERS.3 JMP CKBFW3 ; CHECK BUFFER THREE FOR WRITE ACCESS. 10$:$ MOV #11,R1 ; INDICATE TWO BUFFERS. JMP @(R5)+ ; LEAVE.E1ADRSPL: ; SPLIT ABORT, DISCONNECT, AND REJECT.E CMP #16020,I.FCN(R4)  ; IS THIS A REJECT? BNE 10$ ; NO, CONTINUE.I5 MOV #MERGE,R5 ; YES, SEND EXECUTION TO NEW LOCATION. 10$: JMP @(R5)+ ; LEAVE.E-NCTSPL: ; SPLIT NETWORK CONTROL FUNCTIONS. & MOV I.FCN(R4),R1 ; GET FUNCTION CODE.9 BIC #177707,R1 ; EXTRACT THREE BITS INDICATING FUNCTION.B ASR R1R ASR R1R7 TST NCTTBL(R1) ; IS THERE A SPECIAL LOCATION TO GO TO? BEQ 10$ ; NO, CONTINUE.T# MOV NCTTBL(R1),R5 ; YES, FETCH IT.E10$: JMP @(R5)+ ; LEAVE. NCTTBL:  .WORD 0 ; 00, OPEN .WORD 0 ; 10, CLOSES .WORD SKIP ; 20, SPECIFY AST$ .WORD NTRVB ; 30, GET NETWORK DATA$ .WORD NTRVB ; 40, GET NETWORK DATA$ .WORD NTRVB ; 50, GET NETWORK DATA .WORD FCIFC ; 60. .WORD NTRVB ; 70, GET LOCAL NODE INFORMATION;; BUILD AN I/O PACKETC;HBDPKT:;C; SPREAD OUT PARAMETERSR;A0 MOV I.PRM+12(R4),I.PRM+16(R4) ;COPY FNB ADDRESS' MOV I.PRM+10(R4),I.PRM+14(R4) ;COPY P5T' MOV I.PRM+6(R4),I.PRM+12(R4) ;COPY P40' MOV I.PRM+4(R4),I.PRM+10(R4) ;COPY P3.; MOV I.PRM+2(R4),I.PRM+6(R4) ;COPY ATTRIBUTE LIST POINTER,. MOV I.PRM(R4),I.PRM+2(R4) ;COPY FID POINTER( CLR I.PRM(R4) ;ASSUME NO BUFFER BIAS;O&; DETERMINE SIZE OF BUFFER TO ALLOCATE;I, CLR -(SP) ;SET COUNT OF ATTRIBUTES TO ZERO+ MOV KISAR6,-(SP) ;SAVE TASK HEADER MAPPINGH& MOV R4,-(SP) ;SAVE I/O PACKET POINTER2 CLR -(SP) ;SET SIZE OF CPRBUF ALLOCATION TO ZERO! TST I.PRM+2(R4) ;IS THERE A FID?; BEQ 10$ ;IF EQ NO69 ADD #3.*2+4,(SP) ;ACCOUNT FOR 3 WORD BUFFER PLUS ADDRESS '10$: TST I.PRM+16(R4) ;IS THERE AN FNB?  BEQ 20$ ;IF EQ NO : ADD #15.*2+4,(SP) ;ACCOUNT FOR 15 WORD BLOCK PLUS ADDRESS20$:;R-; CALCULATE SIZE OF ALL THE ATTRIBUTE BUFFERSI;O2 MOV I.PRM+6(R4),R3 ;GET ADDRESS OF ATTRIBUTE LIST BEQ 70$ ;IF EQ NONE S.30$: MOV R3,R0 ;GET ADDRESS OF NEXT ATTRIBUTE" MOV #4,R1 ;SET SIZE OF ATTRIBUTE1 CALL $ACHCK ;ADDRESS CHECK ATTRIBUTE DESCRIPTORI BCS IESPC ;IF CS ERROR CALL $RELOM ;RELOCATE AND MAP.$ ADD #4,R3 ;POINT TO NEXT ATTRIBUTE# TSTB (R0)+ ;IS THERE AN ATTRIBUTEI BEQ 40$ ;IF EQ NOQ ADD #6,(SP) ;INCLUDE ATTRIBUTE4 INC 6(SP) ;INCREMENT NUMBER OF ATTRIBUTES COUNTER002||{cccc CLR R2 ;GET SIZE OF ATTRIBUTE  MOVB (R0),R2 ;4 CMP R2,#MXSIZ ;IS IT TOO BIG TO GO INTO THE BUFFER? BHI 30$ ;IF HI OR SAME, YESM& ADD R2,(SP) ;INCLUDE IT IN THE TOTAL BR 30$ ;LOOK AT NEXT ATTRIBUEU/40$: ADD #2,(SP) ;ACCOUNT FOR END OF LIST WORDP%70$: MOV (SP)+,R1 ;GET SIZE OF BUFFERR BEQ NOBUF ;IF EQ EMPTY( ADD #4,R1 ;ACCOUNT FOR INITIAL 4 BYTES) MOV (SP)+,R4 ;RECOVER I/O PACKET POINTER . MOV (SP)+,KISAR6 ;RECOVER TASK HEADER MAPPING; ; ALLOCATE A BUFFER FROM CPRBUFB;S7 MOV R1,I.PRM+4(R4) ;SET LENGTH OF BUFFER IN I/O PACKET  BNE 80$ ;IF NE THERE IS ONEI' JMP NOBUF ;DON'T NEED TO GET A BUFFERI,80$: ADD #77,R1 ;ROUND SIZE TO NEAREST 32.  ASH #-6,R1 ; WORD BLOCKE CLR R0 ;NO FLAGS, CALL $CPALO ;ALLOCATE A BUFFER FROM CPRBUF$ BCS IENOD ;IF CS ALLOCATION FAILED. MOV R0,I.PRM(R4) ;PUT BIAS IN FIRST PARAMETER% MOV KISAR6,R1 ;SAVE TASK HEADER BIASR MOV R0,KISAR6 ;MAP BUFFER. MOVB (SP)+,MAP6+1 ;SAVE NUMBER OF ATTRIBUTES ! MOV R1,KISAR6 ;REMAP TASK HEADER0 MOV #MAP6+4,R3 ;POINT TO THIRD WORD FOR BUFFERS;E ; BUILD FID ; 1 MOV I.PRM+2(R4),R0 ;SET ADDRESS OF FILE ID BLOCKB BEQ 90$ ;IF EQ NONERD MOV #100000,I.PRM+2(R4);INDICATE THAT FID EXISTS (OFFSET 4 IMPLIED)* MOV #3*2,R1 ;SET LENGTH OF FILE ID BLOCK# CALL INPRMW ;INSERT FILE ID BLOCKT BCS IESPC ;ERROR OCCURED90$:;B; BUILD FILE NAME BLOCKM;K4 MOV I.PRM+16(R4),R0 ;SET ADDRESS OF FILE NAME BLOCK BEQ 100$ ;IF EQ NONE0 MOV R3,I.PRM+16(R4) ;PUT OFFSET INTO I/O PACKET2 BIC #MAP6,I.PRM+16(R4) ;GET RID OF APR6 BIAS BITS- MOV #15.*2,R1 ;SET LENGTH OF FILE NAME BLOCKM% CALL INPRMW ;INSERT FILE NAME BLOCKB100$:9; ; BUILD ATTRIBUTE POINTER BLOCK2;)EATRBK: MOV I.PRM+6(R4),R0 ;GET ADDRESS OF ATTRIBUTE DESCRIPTOR BLOCK F% BEQ NOATTR ;NOT SPECIFIED? IF EQ NOI/ MOV R3,I.PRM+6(R4) ;PUT OFFSET INTO I/O PACKET1 BIC #MAP6,I.PRM+6(R4) ;GET RID OF APR6 BIAS BITS; MOV KISAR6,-(SP) ;SAVE MAPPINGQ% MOV I.PRM(R4),KISAR6 ;MAP CPR BUFFER)+ MOVB MAP6+1,R1 ;GET NUMBER OF ATTRIBUTESM BEQ 25$ ;IF EQ NULL LIST910$: MOV R1,-(SP) ;SAVE NUMBER OF ATTRIBUTES ON THE STACK % MOV #4,R1 ;COPY 4 WORDS INTO PACKET9( MOV R0,-(SP) ;SAVE ADDRESS OF ATTRIBUTE* CALL INPRM ;INSERT ATTRIBUTE INTO PACKET, SUB #6,R3 ;BACK UP TO ADDRESS OF ATTRIBUTE& MOVB -1(R3),R0 ;GET SIZE OF ATTRIBUTE CMPB R0,#MXSIZ ;IS IT TOO BIG?E BLO 20$ ;IF LO YES' MOV (R3),R0 ;GET ADDRESS OF ATTRIBUTEK CALL $RELOC ;RELOCATE IT MOV R1,(R3) ;SAVE BIAS MOV R2,2(R3) ; AND DISPLACEMENT,20$: CMP (R3)+,(R3)+ ;MOVE R3 PAST ADDRESSES+ MOV (SP)+,R0 ;RESTORE ADDRESS OF ATTRIBUTET& ADD #4,R0 ;ADDRESS OF NEXT ATTRIBUTE, MOV (SP)+,R1 ;GET NUMBER OF ATTRIBUTES LEFT1 SOB R1,10$ ;LOOP UNTIL ALL ATTRIBUTES ARE DONEI225$: CLR (R3)+ ;INCLUDE ZERO WORD FOR END OF LIST;#; INSERT ATTRIBUTES INTO THE BUFFERE;C1 MOV I.PRM+6(R4),R2 ;GET OFFSET OF ATTRIBUTE LISTS$ ADD #MAP6,R2 ;POINT FIRST ATTRIBUTE K-30$: TSTB (R2)+ ;IS THERE AN ATTRIBUTE HERE?V BEQ 40$ ;IF EQ NO  MOVB (R2)+,R1 ;GET LENGTH* CMPB R1,#MXSIZ ;IS IT TOO BIG FOR BUFFER? BLO 35$ ;IF LO NOS0 CMP (R2)+,(R2)+ ;MOVE POINTER TO NEXT ATTRIBUTE BR 30$ ;LOOK AT NEXT ATTRIBUTE I+35$: MOV (R2),R1 ;GET ADDRESS OF ATTRIBUTER7 MOV KISAR6,(R2)+ ;PUT BIAS/OFFSET IF ATTRIBUTE IN LISTR MOV R3,(R2)+ ;( MOV R2,-(SP) ;SAVE POINTER TO ATTRIBUTE CALL INPRM ;COPY ATTRIBUTE MOV (SP)+,R2 ;RESTORE POINTER BR 30$ ;LOOK AT NEXT ATTRIBUTE(40$: MOV (SP)+,KISAR6 ;REMAP TASK HEADERNOATTR:INOBUF: JMP @(R5)+);10; INPRM: INSERT PARAMETERS WITH NO ADDRESS CHECK<; INPRMW,INPRMB: INSERT PARAMETER BLOCK WORD OR BYTE ALIGNED; 8; INPUTS : R0 - ADDRESS OF BLOCK IN USER'S ADDRESS SPACE; R1 - LENGTH OF BLOCK/; R3 - POINTER INTO CPR BUFFER (APR6 ADDRESS)T; 8; OUTPUT: R0 - OFFSET INTO CPR BUFFER OF START OF BLOCK0; R3 - UPDATED TO POINTER AFTER INSERTED BLOCK; R4 IS PRESERVEDS;E .ENABL LSBBINPRM: SAVNR ;SAVE R4,R5 E* MOV I.PRM(R4),-(SP) ;SAVE BIAS OF CPRBUF$ MOV R1,-(SP) ;SAVE LENGTH OF BUFFER BR 5$ ;JOIN COMMON COD00:|?|ttt tfDATAEW1INPRMW: MOV #$CKBFW,R2 ;CKECK BUFFER WORD ALIGNEDE BR 2$ ;CALL ROUTINEA1INPRMB: MOV #$CKBFB,R2 ;CHECK BUFFER BYTE ALIGNEDR2$: SAVNR ;SAVE R4,R5-&; DO ADDRESS CHECK AND RELOCATE BUFFER) MOV I.PRM(R4),-(SP) ;SAVE BIAS OF CPRBUF $ MOV R1,-(SP) ;SAVE LENGTH OF BUFFER1 MOV R2,-(SP) ;SET ADDRES OF BUFFER CHECK ROUTINEK+ CALL @(SP)+ ;CHECK AND LOCK USER'S BUFFERR BCS INERR ;IF CS ERROR!5$: CALL $RELOC ;RELOCATE BUFFERP .DSABL LSB,@; MAP CPRBUF AND COPY BIAS OFFSET INTO 2 WORDS AFTER DATA BUFFER MOV (SP)+,R0 ;RESTORE LENGTHL( MOV KISAR6,R5 ;SAVE TASK HEADER MAPPING MOV (SP),KISAR6 ;MAP CPRBUF/ MOV R3,R4 ;GET OFFSET OF 2 WORDS AFTER BUFFERE ADD R0,R4 ;L MOV R1,(R4)+ ;COPY BIAS MOV R2,(R4) ; AND OFFSET! MOV R5,KISAR6 ;REMAP TASK HEADER ; USE BLXIO TO DO COPY) SUB #MAP6-MAP5,R2 ;MAKE OFFSET FROM APR5+# MOV R3,R4 ;GET OFFSET INTO CPRBUFS! MOV (SP)+,R3 ;GET BIAS OF CPRBUFE CALL $BLXIO ;COPY BUFFER( MOV R4,R3 ;PUT UPDATED POINTER INTO R32 ADD #4,R3 ;PUDATE POINTER PAST RELOCATED ADDRESS RETURNL(INERR: CMP (SP)+,(SP)+ ;CLEAN OFF STACK& RETURN ;RETURN WITH CARRY STILL SET;4+; LOCK HEADER IN MEMORY DURING ACP FUNCTIONR;43CKLHD: MOV $TKTCB,R0 ;GET CURRENT TASK TCB ADDRESSS, MOV T.ATT(R0),R0 ;GET ATTACHMENT DESCRIPTOR6 INCB A.IOC-A.TCBL(R0) ;BUMP I/O COUNT FOR TASK REGION4 MOV A.PCB-A.TCBL(R0),R0 ;GET ADDRESS OF TASK REGION( INCB P.IOC(R0) ;BUMP REGION'S I/O COUNT; BISB #200,I.EFN(R4) ;FLAG REQUEST AS A VIRTUAL I/O REQUESTD JMP @(R5)+ ;;NF; EXIT WITH EITHER ONE OR NO BITS SET IN THE FLAG WORD, OR THE WORD AS; SPECIFIED IN R1.;T .ENABL LSBY$CKNXT: ; USE R1 FOR BUFFER FLAGS. MOV R1,R0 ; GET BUFFER FLAGS.K# BR 10$ ; CONTINUE IN COMMON CODE. )CK1XC: TST I.PRM(R4) ;IS THERE A BUFFER?M BNE CK1XT ;IF NE YESCK0XT: CLR R0 ;NO BUFFERS BR 10$ ;JOIN COMMON CODECK1XT: MOV #1,R0 ;ONE BUFFERF10$: .DSABL LSB ;O; CALCULATE LUN NUMBER C;T1 MOV I.LN2(R4),R3 ;GET POINTER TO 2ND LUN WORD/, SUB #,R3 ;GET OFFSET INTO LUT- ASR R3 ;DIVIDE BY 4 (4 BYTES PER LUN ENTRY)E ASR R3 ;! INC R3 ;LUN NUMBERS START AT 18 MOVB R3,I.LN2(R4) ;RETURN TO LUN FIELD IN I/O PACKET;R; FILL IN BUFFER FLAGN;U MOVB R0,I.LN2+1(R4) ;:;S; EXIT POLISH TO FUNCTION EXIT;B. TST (SP)+ ;REMOVE ADDRESS OF SECOND LUN WORD# MOV (SP)+,R5 ;RETRIEVE UCB ADDRESSV, MOV U.SCB(R5),R0 ;GET I/O QUEUE LISTHEAD MOV R4,R1 ;GET PACKET POINTERI CALLR $QINSP ;INSERT PACKET2 .END /, SUB #,R .TITLE XXTTIe .IDENT /01.00/ ;d6; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;t<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;;; 03-MAR-87 KAREN NOEL;;;+;; ****** X X T T I ******;A; THIS MODULE CONTAINS THE ROUTINES TO VALIDATE A NEW I/O REQUESTH; FOR A TERMINAL. THE I/O REQUESTS ARE VALIDATED PRIOR TO PLACING THEM J; IN THE DEVICE'S I/O PACKET QUEUE. THIS MUST OCCUR WHILE THE USER TASK L; WHICH ISSUED THE REQUEST IS STILL THE CURRENT TASK. NEXT, THE REQUEST IS 1; PLACED IN THE REQUEST QUEUE FOR THE TERMINAL. N;A;-;B .MCALL PKTDF$ PKTDF$I;C; LOCAL SYMBOL DEFINITIONS; MAP6 = 140000.PAGER, .SBTTL XXTTI - FUNCTION CODE DISPATCH TABLE;T?; DISPATCH TABLE FOR PROCESSING DIFFERENT FUNCTION CODES BEFORE %; ENTERING A PACKET IN THE I/O QUEUE.E;OQPDSP: .WORD QPKIL ;IO.KILO .WORD QPWLB ;IO.WLBE .WORD QPRLB ;IO.RLBE .WORD QPATT ;IO.ATTI .WORD QPDET ;IO.DETH! .WORD QPSPC ;SPECIAL FUNCTIONS: ; IO.GTS ; SF.SMC ; SF.GMC .WORD QPHNG ;IO.HNGU/ .WORD 0 ;RESERVED EXEC CLOSE-OUT-LUN FUNCTION$- .WORD 0 ;RESERVED FOR USER MODE DIAGNOSTICS .WORD QPRPR ;IO.RPRR .WORD QPRTT ;IO.RTT  .IF DF B$$MAP .WORD QPWSD ;IO.WSDE .WORD QPRSD ;IO.RSD  .ENDC ;B$$MAP .WORD 0 ;IO.EIOP.PAGETB .SBTTL XXTTI - TERMINAL DRIVER I/O REQUEST INITIATION ENTRY POINT;L;+-; **-XXTTI - VALIDATE I/O 00B||{ccccPACKET ENTRY POINT.;OK; THIS ROUTINE IS CALLED FROM "XXDRV" WHEN A TASK HAS ISSUED AN I/O REQUESTFK; FOR A TERMINAL. THE CALL IS MADE PRIOR TO QUEUEING THE I/O PACKET TO THETK; SCB QUEUE SINCE TERMINALS HAVE THE "UC.QUE" BIT SET IN THEIR UCB'S. THIS J; IS DONE WHILE THE TASK CONTEXT IS STILL VALID, SINCE MANY FUNCTIONS WILL?; NEED ADDITIONAL PARAMETER CHECKS NOT DONE BY THE EXECUTIVE. ;P ; INPUTS:*; R1 => I/O REQUEST PACKET TO BE PROCESSED&; R4 => SCB FOR THE REQUESTED TERMINAL&; R5 => UCB FOR THE REQUESTED TERMINAL;S; OUTPUTS: NONE.; "; REGISTERS MODIFIED: R0, R1, R3;-;SXXTTI::  SAVNR$ MOV R1,R3 ;COPY I/O PACKET POINTER/ MOVB I.FCN+1(R3),R0 ;GET THE I/O FUNCTION CODEL$ ASL R0 ;CONVERT IT TO A WORD INDEX3 CALLR @QPDSP(R0) ;DISPATCH TO PROCESS THIS REQUEST .PAGEN .SBTTL XXTTI SUBROUTINESE@ .SBTTL . KILAC - $GSPKT ACCEPTANCE ROUTINE FOR KILL I/O (QPKIL);I;+3; **-KILAC - KILL I/O ACCEPTANCE ROUTINE FOR $GSPKT=;CJ; "$GSPKT" CALLS THIS ROUTINE WITH AN I/O PACKET TO BE CHECKED AGAINST THE; KILL I/O ACCEPTANCE CRITERIA:SD; 1. THE I/O PACKET UCB ADDRESS MUST MATCH THE I/O KILL REQUEST UCB.D; 2. THE I/O PACKET TCB ADDRESS MUST MATCH THE I/O KILL REQUEST TCB.D; 3. IF THE I/O KILL SUBFUNCTION WAS TF.WLB, THE I/O PACKET FUNCTION,; CODE MUST BE "IO.EIO!TF.WLB" OR "IO.WLB".D; 4. IF THE I/O KILL SUBFUNCTION WAS TF.RLB, THE I/O PACKET FUNCTIONA; CODE MUST BE "IO.EIO!TF.RLB", "IO.RLB", "IO.RPR", OR "IO.RTT".S;= ; INPUTS:3; R1 => I/O REQUEST PACKET TO BE ACCEPTED/REJECTED.K(; G$$SPA(SP) => UCB OF PACKETS TO ACCEPT'; G$$SPA+2 => I/O KILL REQUEST PACKETU;M ; OUTPUTS:K'; CC-C = 0 IF PACKET IS TO BE ACCEPTED '; = 1 IF PACKET IS TO BE REJECTEDC;; REGISTERS MODIFIED: R2, R3;-;.KILAC:> CMP I.UCB(R1),G$$SPA(SP) ;IS THIS PACKET FOR THE CORRECT UCB?& BNE 30$ ;IF NE, NO...DON'T ACCEPT IT: MOV G$$SPA+2(SP),R3 ;GET POINTER TO KILLER REQUEST PACKET5 CMP I.TCB(R1),I.TCB(R3) ;PACKET FOR THE CORRECT TCB?& BNE 30$ ;IF NE, NO...DON'T ACCEPT IT6 MOVB I.FCN(R3),R3 ;GET KILLER PACKET SUBFUNCTION CODE1 MOVB I.FCN+1(R1),R2 ;GET PACKET SUBFUNCTION CODET= CMPB #IO.EIO/400,R2 ;IS THIS PACKET AN EXTENDED I/O REQUEST?P BNE 5$ ;IF NOT, BRC;WARNING: THIS ASSUMES THAT IO.RLB/400,TF.RLB AND IO.WLB/400,TF.RLB)> MOVB I.FCN(R1),R2 ;GET NON-EXTENDED I/O REQUEST FUNCTION CODE5$:.6 CMPB #IO.RPR/400,R2 ;IS THIS AN OLD-FASHIONED IO.RPR? BEQ 10$ ;IF EQ, YES...SKIP7 CMPB #IO.RTT/400,R2 ;IS THIS AN OLD-FASHIONED IO.RTT?I BNE 20$ ;IF NE, NO...SKIPM10$:5 MOVB #TF.RLB,R2 ;MAKE THESE LOOK LIKE STRAIGHT READS.20$:1 CLC ;ASSUME WE ARE GOING TO ACCEPT THIS PACKETI, BITB R3,R2 ;IS THIS A PACKET TO BE KILLED?! BNE 40$ ;IF NE, YES...ACCEPT ITI30$: SEC ;DON'T ACCEPT THIS PACKET40$: RETURN ;ALL DONEM.PAGE(1 .SBTTL I/O REQUEST PRE-QUEUE PROCESSING ROUTINES+ .SBTTL . QPKIL - INTERNAL I/O KILL REQUESTF;I;+/; **-QPKIL - INTERNAL I/O KILL REQUEST (IO.KIL).;/I; THIS ROUTINE PROCESSES AN I/O REQUEST WITH A FUNCTION CODE OF ZERO. AN0K; I/O PACKET WILL ONLY HAVE THIS FUNCTION CODE IF IT IS AN INTERNAL (SYSTEMUK; STATE) I/O REQUEST. IT PERFORMS FUNCTIONS SIMILAR TO THE DRIVER'S CANCELKJ; I/O ENTRY POINT "TTCAN". HOWEVER, IT CAN BE SPECIFIED THAT ONLY READ ORI; ONLY WRITE REQUESTS ARE TO BE CANCELLED. THIS IS DONE WITH THE REQUEST L; MODIFIERS "TF.WLB" AND "TF.RLB". A "$GSPKT" ACCEPTANCE ROUTINE IS USED TON; FIND ALL SPECIFIED REQUESTS IN THE SCB QUEUE. AN I/O KILL REQUEST IS ALWAYSN; PROCESSED AND COMPLETED IMMEDIATELY, SO IT IS NEVER PLACED IN THE SCB QUEUE.;N ; INPUTS:; R3 => I/O KILL REQUEST PACKETT; R4 => SCB FOR THE TERMINAL; R5 => UCB FOR THE TERMINAL; I.FCN = TF.WLB OR TF.RLBN7; I.TCB => TCB OF TASK WHOSE REQUESTS ARE TO BE ABORTEDR; ; OUTPUTS:Q7; SPECIFIED I/O REQUESTS ARE ABORTED WITH STATUS IE.ABO ; "; REGISTERS MODIFIED: R0, R1, R2;-;" .IF DF R$$IICQPKIL::O .IF DF M$$PRO/ BIT S.URM(R4),@$CPURM ;ALREADY ON CORRECT CPU?T BNE 5$ ;IF NE YES, CONTINUEP7; 00J|?|ttt tfDATACONVERT PARAMETER LIST PART OF I/O PACKET INTO A FORK ; BLOCK FOR INTERPROCESSOR FORK.( ADD #I.PRM+12,R3 ;POINT TO KISAR5 FIELD) MOV KINAR5,(R3) ;INSERT DRIVER I MAPPINGT$ MOV R4,-(R3) ;SAVE R4 IN FORK BLOCK7 MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCK . MOV R3,R4 ;POINT R4 AT FORK BLOCK FOR $FORK1$ CALL $FORK1 ;SWITCH TO CORRECT CPU7 SUB #I.PRM+4,R3 ;POINT BACK TO BEGINNING OF FORK BLOCK  CALL MAPD ;RE-MAP DRIVER5$:; .ENDC ; DF M$$PRO* MOV R3,-(SP) ;SAVE REQUEST PACKET POINTER' MOV R5,-(SP) ;SAVE CURRENT UCB POINTERA. ;**NOTE: THESE ARE SAVED FOR INSPECTION...) ; ...IN THE $GSPKT ACCEPTANCE ROUTINEK7 MOV I.TCB(R3),R1 ;GET TCB OF TASK TO KILL REQUESTS FOR < MOV I.FCN(R3),R3 ;GET FUNCTION CODE OF THINGS TO KILL IN R3= CALL TTCN1 ;CANCEL SELECTIVE I/O (DEPENDS ON TF.WLB/TF.RLB)C10$:" MOV (SP),R5 ;RESTORE UCB ADDRESS1 MOV #KILAC,R2 ;SET POINTER TO ACCEPTANCE ROUTINE CALL $GSPKT ;GET A PACKET$, BCS 20$ ;IF CS, NO MORE PACKETS...ALL DONE1 MOV R1,R3 ;COPY KILLED PACKET ADDRESS FOR IOFINN2 MOV #IE.ABO&377,R0 ;SET REQUEST COMPLETION STATUS( CALL IOFIN ;FINISH OFF THE I/O REQUEST! BR 10$ ;LOOK FOR ANOTHER PACKETT20$: TST (SP)+ ;CLEAN STACK: MOV (SP)+,R3 ;GET BACK ADDRESS OF I/O KILL REQUEST PACKET( MOV #IS.SUC&377,R0 ;SUCCESSFUL I/O KILL JMP IOFIN ;FINISH I/O KILL .ENDC ;R$$IIC.PAGEU9 .SBTTL . BUFFER ADDRESS CHECKING AND RELOCATION ROUTINESN;;+2; **-CKBFR - ADDRESS CHECK BUFFER FOR READ ACCESSE; **-CKBFRW - ADDRESS CHECK BUFFER FOR READ ACCESS AND WORD ALIGNMENT8; **-CKBFB - ADDRESS CHECK BUFFER FOR READ/WRITE ACCESS;II; THESE ROUTINES PERFORM THE DESCRIBED ADDRESS CHECKING ON A USER BUFFER.T;( ; INPUTS:%; R0 => USER BUFFER (VIRTUAL ADDRESS) ; R1 = LENGTH OF USER BUFFERV;S ; OUTPUTS:S*; CC-C = 0 IF ADDRESS CHECK WAS SUCCESSFUL"; CC-C = 1 IF ADDRESS CHECK FAILED4; R0 = ERROR CODE FOR ADDRESS CHECK FAILURE REASON:.; "IE.SPC" IF SPECIFIED BUFFER LENGTH IS ZEROB; "IE.SPC" IF BUFFER NOT WORD ALIGNED OR EXEC ADDRESS CHECK FAILS6; "IE.BAD" IF BUFFER SIZE IS GREATER THAN 8128. BYTES-; R1 = BIAS OF RELOCATED USER BUFFER ADDRESSO5; R2 = DISPLACEMENT OF RELOCATED USER BUFFER ADDRESS(; ; REGISTERS MODIFIED: R0;-;U .ENABL LSB CKBFRW:G. BIT #1,R0 ;DOES BUFFER START ON ODD ADDRESS?4 BNE 910$ ;IF NE, YES...RETURN INVALID BUFFER ERRORCKBFR::A5 MOV #$CKBFR,-(SP) ;SET UP CALL FOR READ-ACCESS CHECK: BR 10$ ;SKIP TO COMMON CODEECKBFB:: 6 MOV #$CKBFB,-(SP) ;SET UP CALL FOR WRITE-ACCESS CHECK10$: TST R1 ;IS BUFFER SIZE VALID?E3 BEQ 900$ ;IF EQ, NO...RETURN INVALID BUFFER ERRORE6 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?5 BHI 920$ ;IF HI, YES...RETURN BAD BUFFER SIZE ERROR .IF DF X$$HDR; MOV (SP),-(SP) ;DUPLICATE MAPPING ROUTINE ADDRESS ON STACK, MOV KISAR6,2(SP) ;SAVE CURRENT EXEC MAPPING+ MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADERP .IFTF ;X$$HDR3 CALL @(SP)+ ;CALL REQUESTED ADDRESS CHECK ROUTINE .IFT ;X$$HDRS+ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING .ENDC ;X$$HDR+ BCS 910$ ;IF CS, IT FAILED...RETURN ERRORI9 CALL $RELOC ;RELOCATE ADDRESS AND CONVERT TO DOUBLEWORDA RETURN ;ALL DONE9900$:H( TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS910$:HA MOV #IE.SPC&377,R0 ;SET COMPLETION ERROR CODE FOR INVALID BUFFER BR 990$ ;SKIP 920$:U( TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS; MOV #IE.BAD&377,R0 ;SET COMPLETION ERROR CODE FOR BAD SIZEE990$:  SEC ;RETURN WITH ERROR FLAG RETURN ;ALL DONE+ .DSABL LSBE.PAGE ? .SBTTL . TSTRQ - CHECK I/O REQUEST QUEUE FOR PACKET TO DEQUEUER;R;+$; SUBROUTINE TSTRQ - TEST I/O QUEUE.;O; INPUT:; R5 POINTER TO U.TSTA;D ; OUTPUT:$:; IF THERE IS (POTENTIALLY) A PACKET IN THE I/O QUEUE THAT; CAN BE PROCESSED:T>; RETURN TO CALLER WITH R3 = MASK OF BITS TO CLEAR IN U.TSTA+2 ; IF NO PACKET COULD BE DEQUEUED;I ; IF NOT:; RETURN TO CALLER'S CALLER.;T; REGISTERS ALTERED: R3Z;-;$TSTRQ:: .; MOV (R5),R3 ;GET FIRST TERMINAL STATUS WORD; COM R3 ;INVER00R||{ccccT ITB; BIC #^C,R3 ;CLEAR ALL TO SEE WHAT CAN BE DEQUEUED0; BIS #S2.SRQ,R3 ;OR WITH "SPECIAL REQUEST" FLAG;; BIT R3,2(R5) ;IS ANYTHING IN QUEUE THAT CAN BE PROCESSED?E7; BEQ 10$ ;IF EQ, NO...POP OUR WAY OUT OF THIS ROUTINEEB; BIT #S2.BRQ,2(R5) ;IS THERE A "BREAKTHROUGH WRITE" IN THE QUEUE?5; BNE 20$ ;IF NE, YES...IT CAN POSSIBLY BE PROCESSEDT;; ASSUME S3.FDX,200C;E*; TSTB 4(R5) ;USER ON A FULL DUPLEX LINE?5; BMI 20$ ;IF MI, YES...IT CAN POSSIBLY BE PROCESSED8; BIT #S1.IBY!S1.OBY,(R5) ;IS ANYTHING BUSY ON THE LINE?3; BEQ 20$ ;IF EQ, NO...RETURN TO PROCESS A REQUESTW;10$:E<; TST (SP)+ ;POP RETURN ADDRESS SO WE WON'T PROCESS REQUEST;20$:P RETURN ;ALL DONE .PAGE." .SBTTL . WRITE REQUEST PROCESSING% .SBTTL . QPWSB - WRITE SPECIAL DATAH;G;+(; **-QPWSD - WRITE SPECIAL DATA (IO.WSD);-;A .IF DF B$$MAPQPWSD::9 BIC #^C,I.FCN(R3) ;CLEAR DISALLOWED BITSL( BIS #TF.WAL,I.FCN(R3) ;SET REQUIRED BIT< CMP #T.RSDN,I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?% BHIS QPWLB1 ;IF HIS, YES...CONTINUEN6 BR EQPBAD ;ELSE, RETURN REQUEST WITH BAD PARAMENTERS .ENDC ;B$$MAP& .SBTTL . QPWLB - WRITE LOGICAL BLOCK; ;+*; **-QPWLB - NORMAL WRITE REQUEST (IO.WLB);-;SQPWLB::BQPWLB1:B6 MOV #1,R4 ;INDICATING ONE BUFFER IN FIRST PARAMETER> BITB #TF.WBT,I.FCN(R3) ;IS THIS A BREAKTHROUGH WRITE REQUEST?: BEQ CKBFLN ;IF EQ, NO...CHECK BUFFER LENGTH AND QUEUE IT( MOV I.TCB(R3),R0 ;GET ISSUEING TASK TCB; BIT #T3.PRV!T3.CLI,T.ST3(R0) ;IS TASK PRIVILEGED OR A CLI? 0 BNE 10$ ;IF NE, YES...DO BREAKTHROUGH ;SA4605 CMP T.UCB(R0),R5 ;IS THE IO.WBT TO OWN TI:? ;SA460B. BNE EQPPRI ;IF NOT, DON'T ALLOW IT ;SA46010$: ;SA460 ;**-16 MOVB #251.,I.PRI(R3) ;CHANGE REQUEST TO PRIORITY 251.= BIS #TF.CCO,I.FCN(R3) ;BREAKTHROUGH IMPLIES CANCEL CONTROL-OH6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST.PAGEU! .SBTTL . READ REQUEST PROCESSINGT$ .SBTTL . QPRSD - READ SPECIAL DATA;3;+/; **-QPRSD - READ SPECIAL DATA REQUEST (IO.RSD);-;$ .IF DF B$$MAPQPRSD::O8 BIC #^C,I.FCN(R3) ;CLEAR DISALLOWED BITS4 BIS #,I.FCN(R3) ;FORCE REQUIRED BITS4 TST I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?1 BEQ EQPBAD ;ZERO IS NOT ALLOWED, BAD PARAMETERSS< CMP #T.RSDN,I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?< BHIS CKBFLN ;IF HIS, YES...FINISH CHECKS AND QUEUE REQUEST BR EQPBAD ;BAD PARAMETERSO .ENDC ;B$$MAP$ .SBTTL . QPRPR - READ AFTER PROMPT;Q;+/; **-QPRPR - READ AFTER PROMPT REQUEST (IO.RPR).;-;$ .ENABL LSB:QPRPR::C: MOV I.PRM+10(R3),R0 ;GET VIRTUAL ADDRESS OF PROMPT BUFFER, MOV I.PRM+12(R3),R1 ;GET PROMPT BUFFER SIZE. MOV R1,I.PRM+14(R3) ;SET LENGTH IN I/O PACKET: CALL CKBFR ;CHECK READ ACCESS AND RELOCATE PROMPT BUFFER9 BCC 10$ ;IF CC, OK...GO STORE ADDRESS AND QUEUE REQUESTB: BR IOFIN ;CHECK FAILED...COMPLETE REQUEST WITH THE ERROR- .SBTTL . QPRTT - READ WITH TERMINATOR TABLE;B;+8; **-QPRTT - READ WITH TERMINATOR TABLE REQUEST (IO.RTT);-;MQPRTT::T5 MOV I.PRM+10(R3),R0 ;GET ADDRESS OF TERMINATOR TABLE14 MOV #32.,R1 ;LENGTH OF TABLE IS FIXED AT 32. BYTES. MOV R1,I.PRM+14(R3) ;SET LENGTH IN I/O PACKET; CALL CKBFRW ;CHECK READ ACCESS AND RELOCATE TABLE ADDRESSD8 BCS IOFIN ;IF CS, CHECK FAILED...RETURN WITH THE ERROR10$:< MOV R1,I.PRM+10(R3) ;SAVE FIRST WORD OF ADDRESS DOUBLE WORD= MOV R2,I.PRM+12(R3) ;SAVE SECOND WORD OF ADDRESS DOUBLE WORDR" MOV #21,R4 ;INDICATE TWO BUFFERS6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST .DSABL LSBI% .SBTTL . QPRLB - READ LOGICAL BLOCK ;L;+); **-QPRLB - NORMAL READ REQUEST (IO.RLB)3;-;SQPRLB::, MOV #1,R4 ;INDICATE ONE BUFFER6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST.PAGES .SBTTL . ERROR HANDLING; ,; EQPPRI - RETURN PRIVILEGE VIOLATION ERROR.;REQPPRI:;; MOV #IE.PRI&377,R0 ;SET ERROR CODE FOR PRIVILEGE VIOLATION;; BR IOFIN ;FINISH I/O REQUEST (NO NEED TO RESTORE MAPPING)A;T+; EQPBAD - RETURN ERROR FO00Z|?|ttt tfDATAR BAD PARAMETERS.A;QEQPBAD::: MOV #IE.BAD&377,R0 ;SET ERROR FOR BAD PARAMETER SPECIFIED5 BR EQPFIN ;FINISH REQUEST (REMAP DRIVER ON THE WAY);@; EQPSPC - RETURN ERROR BECAUSE OF INVALID BUFFER SPECIFICATION.;FEQPSPC:H? MOV #IE.SPC&377,R0 ;SET ERROR FOR ILLEGAL BUFFER SPECIFICATION 8; BR EQPFIN ;RETURN THE ERROR (REMAP DRIVER ON THE WAY)EQPFIN:: .IF DF T$$EIO* MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING .ENDC ;T$$EIOIOFIN::S# CLR R1 ;CLEAR SECOND WORD OF IOSB $ CALLR $IOFIN ;FINISH IO AND RETURN.PAGE#, .SBTTL . CKBFLN - FINAL BUFFER LENGTH CHECK;I=; CKBFLN - CHECK THAT BUFFER LENGTH IS WITHIN (1,8K-64) BYTES; CKBFLN:R3 MOV I.PRM+4(R3),R1 ;GET LENGTH OF TRANSFER REQUESTF4 BEQ EQPSPC ;IF EQ, RETURN ZERO BUFFER LENGTH ERROR6 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?5 BHI EQPBAD ;IF HI, BUFFER IS TOO BIG...RETURN ERRORO< .SBTTL QUEUE - PLACE I/O REQUEST PACKET INTO TERMINAL QUEUE;?; R4 NOW CONTAINS FLAGS TO BE USED BY THE ACCEPTANCE ROUTINE FOI>; GETTING PACKETS FROM THE QUEUE VIA $GSPKT. SAVE THE FLAGS IN; I.LN2+1 OF THE I/O PACKET.;TQUEUE::R; ADD #U.TSTA,R5 ;POINT UCB POINTER TO THE FIRST STATUS WORDM;)D; CALCULATE LUN NUMBER FROM POINTER TO SECOND LUN WORD IN I/O PACKET;F. MOV I.LN2(R3),R0 ;GET POINTER TO 2ND LUN WORD, SUB #,R0 ;GET OFFSET INTO LUT- ASR R0 ;DIVIDE BY 4 (4 BYTES PER LUN ENTRY)U ASR R0 ;! INC R0 ;LUN NUMBERS START AT 1E5 MOVB R0,I.LN2(R3) ;RETURN TO LUN FIELD IN I/O PACKETT+ MOVB R4,I.LN2+1(R3) ;SAVE BUFFER FLAG BYTEQ0 MOV U.SCB-U.TSTA(R5),R0 ;GET I/O QUEUE LISTHEAD MOV R3,R1 ;GET PACKET POINTER# CALL $QINSP ;INSERT PACKET .IF DF M$$PRO# MOV #FR.GRQ,R3 ;COME BACK AT FPGRQO# CALL SWCPU ;SWITCH TO CORRECT CPUA;T9; IF WE FALL THRU HERE, WE ARE ALREADY ON THE CORRECT CPU#;P .ENDC ;M$$PRO RETURN .PAGER. .SBTTL . QPATT/QPDET - ATTACH/DETACH REQUESTS; ;+-; **-QPATT - ATTACH TERMINAL REQUEST (IO.ATT)L-; **-QPDET - DETACH TERMINAL REQUEST (IO.DET)V;4K; ENTRY POINT "QPATT" PERFORMS UNSOLICITED INPUT AST ADDRESS ADJUSTMENT FORUM; SUPERVISOR MODE LIBRARIES (IF SUPPORTED) AND THEN FALLS THROUGH TO "QPDET"..L; FROM QPDET, CONTROL IS TRANSFERRED TO THE PACKET QUEUEING ROUTINE WITH THEB; DEQUEUE BLOCKING FLAGS SET TO CHECK FOR ACTIVE INPUT AND OUTPUT.; ; INPUTS:,; R3 => I/O PACKET FOR ATTACH/DETACH REQUEST; R5 => UCB FOR THE TERMINAL;U ; OUTPUTS:; R3 => I/O PACKET TO BE QUEUEDE; R4 = BUFFER INDICATOR BYTEC;E"; REGISTERS MODIFIED: R0, R1, R2;-; QPATT::E .IF DF S$$LIBI: BITB #TF.AST,I.FCN(R3) ;ATTACH FOR UNSOLICITED INPUT AST? BEQ QPDET ;IF EQ NO 0 MOV I.PRM(R3),R2 ;GET ALL CHARACTER AST ADDRESS) CALL $CALTA ;ADJUST FOR SUPER/USER MODEN" MOV R2,I.PRM(R3) ;AND PUT IT BACK. MOV I.PRM+4(R3),R2 ;GET CONTROL C AST ADDRESS) CALL $CALTA ;ADJUST FOR SUPER/USER MODEE$ MOV R2,I.PRM+4(R3) ;AND PUT IT BACK .ENDC ;S$$LIBQPDET::= CLR R4 ;INDICATE NO BUFFERS4% JMP QUEUE ;QUEUE UP THE REQUEST NOWS.PAGEF$ .SBTTL . QPSPC - "SPECIAL" REQUESTS;F;+=; **-QPSPC - HANDLE "SPECIAL" REQUESTS (IO.GTS/SF.GMC/SF.SMC)U;SG; THIS ROUTINE CHECKS PARAMETERS FOR THE "GET TERMINAL SUPPORT" AND THEEJ; "GET/SET MULTIPLE CHARACTERISTICS" FUNCTIONS. THE USER BUFFER FOR THESEI; REQUESTS MUST BE WORD-ALIGNED. THE IO.GTS AND SF.GMC FUNCTIONS WILL BESL; PASSED TO "QUEUE" WITH NO DEQUEUE BLOCKING FLAGS SET. THIS ALLOWS THEM TOJ; BE PROCESSED SYNCHRONOUSLY (NEVER QUEUED). AN SF.SMC FUNCTION MUST WAITG; FOR ACTIVE INPUT AND OUTPUT REQUESTS TO FINISH BEFORE BEING DEQUEUED.S;- ; INPUTS:"; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMINAL;A ; OUTPUTS:E; R3 => I/O PACKET TO BE QUEUED; R4 = BUFFER INDICATOR BYTET;""; REGISTERS MODIFIED: R0, R1, R2;-;EQPSPC:: MOV #1,R4 ;INDICATE ONE BUFFER) MOV I.PRM(R3),R0 ;GET ADDRESS OF BUFFER $ MOV I.PRM+2(R3),R1 ; AND ITS LENGTH0 MOV R1,I.PRM+4(R3) ;PUSH LENGTH DOWN ONE FIELD$ MOV #CKBFB,R2 ;ASSUME A WRITE CHECKE CMP I.FCN(R3),#IO.GTS00b||{cccc ;IO.GTS? ;GET TERMINAL DRIVER SUPPORT REQUEST?U. BEQ 10$ ;IF EQ, YES...CHECK BUFFER ALIGNMENT= CMP I.FCN(R3),#SF.GMC ;GET MULTIPLE CHARACTERISTICS REQUEST?=. BEQ 10$ ;IF EQ, YES...CHECK BUFFER ALIGNMENT= CMP I.FCN(R3),#SF.SMC ;SET MULTIPLE CHARACTERISTICS REQUEST?P7 BNE EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERRORR) MOV I.TCB(R3),R2 ;GET ISSUING TASK'S TCBR, CMP T.UCB(R2),R5 ;IS THIS TERMINAL HIS TI:?' BEQ 5$ ;IF EQ, YES...REQUEST IS LEGALS/ BIT #T3.PRV,T.ST3(R2) ;IS THE TASK PRIVILEGED?G BNE 5$ ;IF NE YES, OKS5 JMP J2EQPR ;IF EQ, NO...CAN'T ALLOW USER TO DO THISA)5$: MOV #CKBFRW,R2 ;SET UP FOR READ CHECKT10$:1 CALL (R2) ;ADDRESS CHECK BUFFER AND RELOCATE ITH BCC 20$ ;IF CC, NO ERROR6 JMP IOFIN ;IF ERROR, FINISH UP WITH ERROR CODE IN R0-20$: MOV R1,I.PRM(R3) ;PUT BIAS IN I/O PACKETT' MOV R2,I.PRM+2(R3) ; AND DISPLACEMENTI" MOV R2,-(SP) ;GET BUFFER ADDRESS0 BIS I.PRM+4(R3),(SP) ;"OR" IN THE BUFFER LENGTH5 ROR (SP)+ ;IS EITHER THE ADDRESS OR THE LENGTH ODD?R/ BCC 30$ ;IF CC, BUFFER IS WORD-ALIGNED...SKIP 6 JMP EQPSPC ;RETURN ERROR FOR BUFFER NOT WORD-ALIGNED30$: JMP QUEUE ;QUEUE REQUEST;LM; EQPIFC - RETURN AN ERROR DUE TO ILLEGAL FUNCTION CODE OR INVALID MODIFIERS.P;FEQPIFC::D MOV #IE.IFC&377,R0 ;SET ERROR FOR ILLEGAL FUNCTION CODE OR MODIFIER; JMP EQPFIN ;FINISH OFF THE REQUEST (RESTORE MAPPING ALSO)V.PAGE .SBTTL . QPHNG - HANGUP REQUEST;);+$; **-QPHNG - HANGUP REQUEST (IO.HNG); O; THIS ROUTINE CHECKS AN IO.HNG REQUEST. A NON-PRIVILEGED TASK CAN HANG ;SA460NR; UP ONLY ITS "TI:" LINE. PRIVILEGED TASKS CAN HANG UP ANY LINE. A HANGUP ;SA460S; REQUEST, LIKE AN IO.WBT OR GET CHARACTERISTICS, BREAKS THROUGH THE QUEUE. ;SA460I; ;**-3 ; INPUTS:"; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMINAL;I ; OUTPUTS:P; R3 => I/O PACKET TO BE QUEUEDT; R4 = BUFFER INDICATOR BYTE.;T; REGISTERS MODIFIED: R0;-;QPHNG::G- CALL PREQUE ;SET UP FOR QUEUEING ;TMS051C, CLR R4 ;IO.HNG WAITS FOR NOTHING ;TMS051) JMP QUEUE ;QUEUE THE REQUEST ;TMS051E ;TMS051  .IF DF T$$LTH ;TMS051  ;TMS051LD .SBTTL . QPORG - INITIATE A CONNECTION TO A TERMINAL SERVER ;TMS051; ;TMS051;+ ;TMS051 4; **-QPORG - ORIGINATE REQUEST (IO.ORG) ;TMS051; ;TMS0516; THIS ROUTINE CHECKS AN IO.ORG REQUEST. ;TMS051; ;TMS051; INPUTS: ;TMS051.; R3 => I/O PACKET FOR THE REQUEST ;TMS051); R5 => UCB FOR THE TERMINAL ;TMS051T; ;TMS051; OUTPUTS: ;TMS051 ,; R3 => I/O PACKET TO BE QUEUED ;TMS051; R4 = BUFFER INDICATOR BYTE5; ;TMS051(; REGISTERS MODIFIED: R0 ;TMS051;- ;TMS051 ; ;TMS051QPORG:: ;TMS051- CALL PREQUE ;SET UP FOR QUEUEING ;TMS051 ) JMP QUEUE ;QUEUE THE REQUEST ;TMS051  ;TMS0510 .ENDC ;T$$LTH ;TMS051T ;TMS051PREQUE: ;TMS0512 MOV I.TCB(R3),R0 ;GET ISSUING TASK'S TCB ;**-1, CMP T.UCB(R0),R5 ;IS THIS TERMINAL HIS TI:?* BEQ J2QUE ;IF EQ, YES...ALLOW THE HANGUP/ BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED?5: BEQ J2EQPR ;IF EQ, NO...RETURN PRIVILEGE VIOLATION ERRORJ2QUE: .IF DF M$$PRO" MOV U.SCB(R5),R4 ;GET SCB ADDRESS/ BIT S.URM(R4),@$CPURM ;ALREADY ON CORRECT CPU?T1 BEQ 5$ ;IF EQ NO, FORK TO CORRECT CPU ; BM380 ; BM380 .IFTF ; DF M$$PRO ; BM380 ; BM380R RETURN ; BM380M ; BM380T .IFT ; DF M$$PRO ; BM380P ; BM380HF; CONVERT PARAMETER LIST PART OF I/O PACKET INTO A FORK BLOCK ; BM380G; (AND THE RETURN ADDRESS) FOR INTERPROCESSOR FORK. SINCE THIS ; BM380UI; IS A SUBROUTINE, WE MUST REMEMBER CALLER ADDRESS IN FORK BLOCK ; BM380G5; OR THE INTERPROCESSOR FORK DOES NOTHING. ; BM380E; ; BM380D5$: ADD #I.PRM+14,R3 ;POINT PAST KISAR5 FIELD IN FORK BLOCK ; BM3802 MOV (SP)+,(R3) ;REMEMBER RETURN ADDRESS ; BM380B MOV KINAR5,-(R3) ;INSERT DRIVER I MAPPING IN KISAR5 FIELD ; BM380, CLR00j|k|ttt tfDATA -(R3) ;CLEAR R4 IN FORK BLOCK ;**-77 MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCKD. MOV R3,R4 ;POINT R4 AT FORK BLOCK FOR $FORK1$ CALL $FORK1 ;SWITCH TO CORRECT CPU7 SUB #I.PRM+4,R3 ;POINT BACK TO BEGINNING OF FORK BLOCK CALL MAPD ;RE-MAP DRIVER9 JMP @I.PRM+14(R3) ;DISPATCH TO ORIGINAL CALLER ; BM380P ;**-1A .ENDC ; DF M$$PROJ2EQPR: ;**-2. JMP EQPPRI ;RETURN PRIVILEGE VIOLATION ERROR .END,-(R3) ;INSERT DRIVER I MAPPING IN KISAR5 FIELD ; BM380, CLR .TITLE TTODNC .IDENT /06.01/#;+8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;+>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;P ;T ; 30-JAN-78 PETER WANNHEDENR ;J ; PREVIOUSLY MODIFIED BY:V;I; P. WANNHEDEN; D. R. DONCHIN* ; T. LEKAS ; S. ADAMS; ;F; MODIFIED BY:;; L. KOGAN 06-JUN-85 05.06,; LK608 -- FIX ^R PROCESSING AFTER IO.WBT;; L. KOGAN 02-NOV-85 06.017; LK705 -- MAKE 11M AND 11M+ TTDRV MODULES IDENTICALL;H)* .PSECT MAP5.6+;S,;+#-; ODONE - OUTPUT DONE PROCESSING.M.; /; INPUT:0; R5 POINTER TO U.TSTA1; 2; OUTPUT:S(3; THE DATABASE IS UPDATED AS REQUIRED..4; ANOTHER OUTPUT OPERATION MAY BE INITIATED.5;6; REGISTERS ALTERED: R2,R3,R4O7;-8; 9;K : .ENABL LSBS;; <.SBTTL ODONE - OUTPUT DONE=; G>ODONE:: BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT INTERRUPT UNEXPECTED?-? ;;;(COULD HAPPEN FOR EXAMPLE IF WE COME #@ ;;;HERE WHEN ABORTING OUTPUT)IA BNE 40$ ;;;Y - JUMP B ASSUME US.OIU,10C INCB U.STS-U.TSTA(R5) ;;;NOW IT IS UNEXPECTEDD10$: ;;;REFERENCE LABELEF .IF DF T$$SPLG7H MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAP UCBX AND TABUFO0I MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBXJK .IFF ;T$$SPL-L&M MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX3N BEQ 40$ ;;;NONE - JUMP (THIS CAN ONLY HAPPEN IFS*O ;;;WE COME HERE TO DO A SPECIAL ECHOP ;;;SUCH AS BELL)QR .IFTF ;T$$SPLS(T CLRB U.TOTI(R4) ;;;CLEAR OUTPUT TIMER&U TST U.TCO(R4) ;;;DOING TASK OUTPUT?V BNE 20$ ;;;Y - JUMPR,W BIT #S2.BEL,2(R5) ;;;BELL ECHO REQUESTED?X BNE BELL1 ;;;Y - JUMP$0Y ASSUME S1.OBY,100 ;S1.OBY MUST BE IN LOW BYTE&Z BICB #S1.OBY,@R5 ;;;SET OUTPUT FREE[ ASSUME S1.IBY,200"\ BPL CFGRQ ;;;INPUT FREE - JUMPE\ TSTB U.TISV(R4) ;;; CHECK IF IN THE MIDDLE OF ^R PROCESSING ;LK705N;\ BNE LK1 ;;; YES GOTO FINISH ECHOING INPUT BUFFER ;LK7059\ BIT #S1.DSI,@R5 ;;;INPUT PROCESSING DISABLED? ;LK705."\ BNE 40$ ;;;Y - JUMP ;LK705?\LK1: CALL ECHD1 ;;;INPUT BUSY - ENTER INPUT ROUTINES ;LK705B&` ;;;FALL THRU TO "NXTIC" ;**-3a.PAGEB@b.SBTTL NXTIC - GET NEXT INPUT CHARACTER FROM TYPE-AHEAD BUFFERc;d;+<e; NXTIC - GET NEXT INPUT CHARACTER FROM TYPE-AHEAD BUFFER.f; g; INPUT:h; R5 POINTER TO U.TSTAi;; j; OUTPUT:T>k; IF A CHARACTER CAN BE OBTAINED FROM THE TYPE-AHEAD BUFFER,:l; AND THE CHARACTER CAN BE PROCESSED, IT IS REMOVED FROM9m; THE TYPE-AHEAD BUFFER AND ICHAR2 IS CALLED TO PROCESS n; THE CHARACTER.o;DAp; IF THERE IS CURRENTLY AN IO.RSD OUTSTANDING GET THE CHARACTERU*q; FROM THE APPROPRIATE TYPEAHEAD BUFFER.r;Gs; ELSE A RETURN IS EXECUTED.t;-u;Fv; wNXTIC::xy .IF DF B$$MAPz4{ ASSUME B$$MAP,1 ;;;THERE CAN ONLY BE ONE TERMINAL'| ;;;THAT SUPPORTS IO.RSD CURRENTLYT}0~ CALL RSDPRC ;;;CAN WE PROCESS A SPECIAL DATA ;;;CHARACTER IF ANY? BCC 12$ ;;;Y - GO PROCESS IT .ENDC ;B$$MAP, CALL GCTAB ;;;GET A CHARACTER FROM TABUF6 BCS 15$ ;;;IF CS, NONE THERE...CHECK INPUT TIMEOUT$ CALL IPROC ;;;CAN WE PROCESS IT? BCS 40$ ;;;N - RETURNA1 CALL RCTAB ;;;Y - REMOVE CHARACTER FROM TABUF(11$: CALL ICHAR2 ;;;PROCESS CHARACTER BR NXTIC ;;;LOOP .IF DF B$$MAP; ?; R4 CONTAINS THE I/O PACKET ADDRESS OF AN IO.RSD FROM RSDPRCL;P/12$: MOV I.PRM+10(R4),R2 ;;;GET THE DATA TYPET"00r||{cccc ASL R2 ;;;MAKE IT A WORD INDEX: MOV T.RSDT(R2),R2 ;;;GET THE ADDRESS OF THE APPROPRIATE ;;;TYPEAHEAD BUFFERS;I@; GET THE CHARACTER, IF ANY, FROM THE SPECIAL TYPEAHEAD BUFFER;S' INC R2 ;;;POINT TO RETRIEVE POINTERA TSTB 1(R2) ;;;BUFFER EMPTY?A; BEQ 40$ ;;;Y - NO MORE CHARACTERS, TRY NORMAL TYPEAHEAD;( MOVB (R2),R3 ;;;GET RETRIEVE POINTER- INCB (R2) ;;;UPDATE THE RETRIEVAL POINTERS" CMPB (R2),2(R2) ;;;WRAP-AROUND? BNE 13$ ;;;N - JUMPH5 CLRB (R2) ;;;Y - RESET POINTER TO START OF BUFFERV,13$: DECB 1(R2) ;;;DECREMENT ACTIVE COUNT" ADD #3,R2 ;;;POINT TO THE DATA4 ADD R2,R3 ;;;POINT TO NEXT CHARACTER TO RETRIEVE CLR R2 ;;;PREPARE FOR BISB5 BISB (R3),R2 ;;;PUT THE CHARACTER IN THE LOW BYTE & BR 11$ ;;;GO PROCESS THE CHARACTER .ENDC ;B$$MAP;YM; THERE IS NOTHING IN THE TYPEAHEAD BUFFER. SEE IF WE NEED TO TIME-OUT THE ; INPUT REQUEST.;P15$:? BIT #S5.ITI,U.TST5-U.TSTA(R5) ;;;IMMEDIATE TIMEOUT ON INPUT?Y# BEQ 40$ ;;;IF EQ, NO...ALL DONE .IF DF T$$SPL% MOV #120000,R4 ;;;SET UCBX POINTERI .IFF ;T$$SPLD. MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX POINTER! BEQ 40$ ;;;IF EQ, NONE...EXIT  .ENDC ;T$$SPL ASSUME U.TCI,0 8 TST (R4) ;;;IS THERE A CURRENT INPUT REQUEST PACKET?" BEQ 40$ ;;;IF EQ, NO...GIVE UP+ TST @(R4) ;;;IS THERE ALREADY A STATUS?T BNE 40$ ;;;BR IF YES0 MOV #IS.TMO,@(R4)+ ;;;SET A COMPLETION STATUS8 CALLR IDONE ;;;COMPLETE INPUT REQUEST WITH A TIMEOUT.PAGELF.SBTTL CFGRQ - CONDITIONALLY FORK TO GET A REQUEST PACKET FROM QUEUE;;+B; CFGRQ - CONDITIONALLY FORK TO GET A REQUEST PACKET FROM QUEUE.;$ ; INPUT:; R5 POINTER TO U.TSTA;S ; OUTPUT:S@; IF THERE IS A PACKET IN THE QUEUE THAT MAY BE PROCESSED NOW,5; A FORK REQUEST IS QUEUED TO GET A REQUEST PACKET. ;-; ;D'CFGRQ:: CALL TSTRQ ;;;TEST I/O QUEUE1 ;;;RETURN IF NOTHING WORTH FORKING IN QUEUEC, MOV #FR.GRQ,R3 ;;;FORK/GET REQUEST PACKET BR 30$ ;;;;SF20$: MOV #FR.ORD,R3 ;;;FORK/OUTPUT REQUEST DONE (AT LEAST PARTIALLY)(30$: CALLR FORK ;;;QUEUE FORK REQUEST; ;S.SBTTL BELL - OUTPUT A BELL ;:;+; BELL - OUTPUT A BELL.;U ; INPUT:; R5 POINTER TO U.TSTA;U ; OUTPUT: 8; IF ECHO IS SUPPRESSED, IMMEDIATE RETURN (NO ACTION).5; ELSE A BELL IS OUTPUT IF POSSIBLE, OR FLAGGED FOR; ; OUTPUT AT FIRST OPPORTUNITY.;T; REGISTERS ALTERED: R2,R3,R4M;-;R;F*BELLL:: CALL LOCKI ;LOCK OUT INTERRUPTS,BELL:: BIT #S1.RNE,@R5 ;;;ECHO SUPPRESSED? BNE 40$ ;;;Y - RETURN;:;R8; IF TRANSMITTER IS FREE, THE SPECIAL ECHO IS STARTED.5; IF TRANSMITTER IS BUSY, THE FLAG IS SET IN U.TSTA3; TO FORCE THE SPECIAL ECHO AT FIRST OPPORTUNITY. ;T; BIS #S2.BEL,2(R5) ;;;SET CRA BIT #S1.DSI!S1.OBY,@R5 ;;;OUTPUT BUSY OR FORK PROCESSING BUSY?L" BEQ 10$ ;;;NEITHER - DO IT NOW;TO; A SPECIAL ECHO MAY BE DELAYED BECAUSE FORK PROCESSING IS BUSY (S1.DSI SET).I;C40$: RETURN ;;;Y - WAITT;R  .DSABL LSBS;S;-BELL1: BIC #S2.BEL,2(R5) ;;;CLEAR BELL FLAGT( MOV #ASBELL,R3 ;;;POINT TO BELL CHAR.1 BR ECHCHR ;;;GO AND OUTPUT A SINGLE CHARACTER ;T; .PAGER6 .SBTTL ECHSTR, ECHCHR - ECHO A STRING OR A CHARACTER ;S ;+ ; ECHSTR - ECHO A STRING.1;S ; INPUT:; R2 STRING LENGTH; R3 POINTER TO THE STRING; R4 POINTER TO UCBX; R5 POINTER TO U.TSTA; ; ALTERNATE ENTRY - ECHCHR<; SAME AS ECHSTR, BUT PRESETS R2 TO 1 TO ECHO 1 CHARACTER.; ALTERNATE ENTRY - ECHRLA; SAME AS ECHCHR, BUT LOCKS OUT INTERRUPTS BEFORE THE OPERATIONR(; AND ALLOWS INTERRUPTS BEFORE RETURN.;N; REGISTERS ALTERED: R2,R3,R4T;-;P;*ECHRL:: CALL LOCKI ;LOCK OUT INTERRUPTS) ECHCHR::MOV #1,R2 ;;;STRING LENGTH = 1 !" .IF DF T$$ACD#.$ BR ECHSTR ;;;SET UP UCBX FOR BUFFERED ECHO?%MECHO:: BIC #S2.OBF,2(R5) ;;;INDICATE NON-BUFFERED MULTI-ECHO 0& CLR U.TFOB(R4) ;;;SET E00z|~|ttt tfDATAMPTY MULTI-ECHO BUFFER&' ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2+( BR ECHSET ;;;SET UP UCBX FOR MULTI-ECHOR=)ECHSTR::BIS #S2.OBF,2(R5) ;;;SET UP UCBX FOR NON-MULTI-ECHOS"* ADD #U.TOP,R4 ;;;POINT TO U.TOP+, .IFFL-).ECHSTR::ADD #U.TOP,R4 ;;;POINT TO U.TOPA/0 .IFTF1#2 CLR (R4)+ ;;;U.TOP <-- 0 (ECHO);43ECHSET: MOV R3,(R4)+ ;;;U.TOP+2 <-- BUFFER ADDRESS4 ASSUME U.TOC,U.TOP+4B&5 MOV R2,@R4 ;;;U.TOC <-- BYTE COUNT#6 BR STARTX ;;;START TRANSMISSION 7;C8;T9;+,:; STARTX - START TRANSMISSION OF A BUFFER.;;4 <; INPUT:=; R5 POINTER TO U.TSTA>; U.TOP+2 BUFFER ADDRESS?; U.TOC BYTE COUNT@;57A; CALLS CONTROLLER-DEPENDENT ROUTINE TO START OUTPUT.;-B; NOTE - MUST BE CALLED ON DEVICE PRIORITY! C;PED; ALTERNATE ENTRY: STAXL - START TRANSMISSION OF A LIST OF BUFFERS.(E;; F; INPUT:G; R4 POINTER TO UCBXH; R5 POINTER TO UCBA)I; U.TFOB POINTER TO FIRST OUTPUT BUFFERO:J; EACH BUFFER CONTAINS A LINK TO THE NEXT BUFFER IN THE3K; FIRST WORD, AND BYTE COUNT IN THE SECOND WORD.FL;M; REGISTERS ALTERED: R2,R3,R4TN;-O;P;O/QSTAXL:: MOV U.TFOB(R4),R2 ;;;GET FIRST BUFFER"R ADD #U.TOP,R4 ;;;POINT TO U.TOP'S CALL UPUB ;;;SET UP UCBX FOR OUTPUTLTU .IFT V0W BIS #S2.OBF,2(R5) ;;;INDICATE BUFFERED OUTPUTXY .ENDCZ,[STARTX::BIS #S1.OBY,@R5 ;;;SET OUTPUT BUSY\ ASSUME US.OIU,19] DECB U.STS-U.TSTA(R5) ;;;SET OUTPUT INTERRUPT EXPECTEDO^_ .IFT ;T$$SPLN`0a MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBXbc .IFF ;T$$SPLTd&e MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBXfg .ENDC ;T$$SPLh4i MOVB OPTIMR,U.TOTI(R4) ;;;INITIALIZE OUTPUT TIMERj ASSUME CT.STA,0*k CLR R2 ;;;SET INDEX FOR "START OUTPUT"3l CALLR CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINE)m;Nn;Eo .END OUTPUTXY .ENDCZ,[STARTX::BIS #S1.OBY,@R5 ;;;SET OUTPUT BUSY\ ASSUME US.OIU,19] DECB U.STS-U.TSTA(R5) ;;;SET OUTPUT INTERRUPT EXPECTEDO^_ .IFT ;T$$SPLN`0a MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBXb .TITLE CODRV .IDENT /02/; ; COPYRIGHT (c) 1981 BY); DIGITAL EQUIPMENT CORPORATION, MAYNARD(; MASSACHUSETTS. ALL RIGHTS RESERVED.; 6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T;E; STEVE RUZICH 03-SEP-80;R; CONSOLE DRIVER;O;E ; MACRO CALLS;A* .MCALL ABODF$,HWDDF$,PKTDF$,TCBDF$,UCBDF$# ABODF$ ; DEFINE TASK ABORT CODESH% HWDDF$ ; DEFINE HARDWARE REGISTERSA% PKTDF$ ; DEFINE I/O PACKET OFFSETSO- TCBDF$ ; DEFINE TASK CONTROL BLOCK OFFSETSC UCBDF$ ; DEFINE UCB OFFSETS;I; DRIVER DISPATCH TABLE;I DDT$ CO,1,NONER S;+#; **-COINI-CONSOLE DRIVER INITIATOR ; C; EXAMINE FUNCTION CODE. IO.WLB PACKETS ARE QUEUED TO COT'S PACKETT?; QUEUE. THE TERMINAL DRIVER IS REQUESTED TO PROCESS ALL ELSE.A; ; INPUTS: R5 = UCB ADDRESSH; R4 = SCB ADDRESSC; R1 = I/O PACKET ADDRESS; ;-CCOINI: CMPB I.FCN+1(R1),#IO.WLB/400 ; WRITE LOGICAL BLOCK FUNCTION?P BNE 10$ ; NO - QUEUE TO TTDRV6 TST U.CTCB(R5) ; YES- COT WILL PUT ITS TCB ADDR HERE* ; IF IT IS ACTIVE, ZERO ON EXIT.1 BEQ 10$ ; ZERO? - SOMEONE MUST HAVE REDIRECTEDE, ; CO: TO ITSELF - QUEUE PACKET TO TTDRV" MOV R5,R0 ; NON-ZERO - CONTINUE4 ADD #U.COTQ,R0 ; ADDRESS OF COT'S I/O PACKET QUEUE, CALL $QINSP ; INSERT IN QUEUE BY PRIORITY3 MOV U.CTCB(R5),R0 ; COT'S TCB ADDRESS FOR REQUESTT CAL00||{ccccLR $EXRQN ; START COTC?10$: MOV #IE.OFL&377,R0 ; IF ERROR, RETURN DEVICE OFFLINE CODE1: MOV U.RED2(R5),R2 ; IS THERE A DEFAULT CONSOLE TERMINAL?2 BEQ 20$ ; NO - FINISH I/O, RETURNING ERROR CODE' MOV R2,R5 ; YES- SET UP TERMINAL UCBO9 MOV R2,I.UCB(R1) ; I/O PACKET NEEDS THE RIGHT UCB, TOO.E0 CALLR $DRQRQ ; QUEUE REQUEST TO THIS TERMINAL,20$: MOV R1,R3 ; PACKET ADDRESS FOR $IOFIN CLR R1 ; NO BYTES TRANSFERED. CALLR $IOFIN ; FINISH I/O ,;+!; **-COCAN-CANCEL I/O ENTRY POINTC;R0; OUTSTANDING I/O PACKETS MAY BE SEVERAL PLACES:F; 1) IN COT'S UCB I/O PACKET QUEUE: DEQUEUE AND FINISH THESE PACKETS.I; 2) CURRENTLY BEING PROCESSED BY COT: ASSUME A QUICK FINISH AND IGNORE. 6; 3) BEING PROCESSED BY TTDRV: CALL $IOKIL FOR TTDRV. ;CI; THE LAST STEP HAS THE SIDE EFFECT OF KILLING ALL TERMINAL I/O FROM THE U2; TASK, NOT JUST I/O WHICH CODRV FIELDED TO TTDRV.; ; INPUTS: R5 = UCB ADDRESSS; R4 = SCB ADDRESS$; R1 = TCB ADDRESS;;-COCAN:0 MOV #IE.ABO&377,R0 ; SET FINAL STATUS TO ABORT3 MOV R5,R2 ; GET ADDRESS OF PACKET QUEUE LISTHEADK ADD #U.COTQ,R2 ;;FB; THE FOLLOWING CODE WAS MODIFIED FROM $IOKIL PROCESSING IN IOSUB.G; IT APPEARS THAT THE TCB ADDRESS WILL BE RETURNED AS WORD 2 OF IOSTAT.F;T10$: MOV R2,R3 ; COPY IT020$: MOV R3,R4 ; SAVE ADDRESS OF CURRENT ENTRY* MOV (R4),R3 ; GET ADDRESS OF NEXT ENTRY BEQ 40$ ; IF EQ END OF LIST/ CMP R1,I.TCB(R3) ; REQUEST FOR CURRENT TASK?  BNE 20$ ; IF NE NO MOV (R3),(R4) ; CLOSE UP LIST; BNE 30$ ; IF NE NO NEW LAST( MOV R4,2(R2) ; SET ADDRESS OF NEW LAST'30$: CALL $IOFIN ; FINISH I/O REQUESTL BR 10$ ; GO AGAIN>40$: MOV U.RED2(R5),R5 ; IS THERE A DEFAULT CONSOLE TERMINAL? BEQ EXIT ; NO - CONTINUED3 JMP $IOKIL ; YES- KILL ANY I/O WHICH CODRV MIGHTM ; HAVE GIVEN TO TTDRV.;+ ; **-COOUT - TIMEOUT ENTRY POINT;T?; COT SETS S.CTM, THE CURRENT TIMEOUT COUNT, WHEN IT CONTAINS AUA; PARTIALLY FILLED LOGFILE BUFFER. WHEN THE COUNT EXPIRES, CODRVLC; INFORMS COT THAT IT IS TIME TO FLUSH THIS BUFFER TO THE LOGFILE. D;S; INPUTS: R5 = UCB ADDRESS ; R4 = SCB ADDRESSL;B;-.COOUT: MOV U.CTCB(R5),R0 ; COT TCB, IF ACTIVE( BEQ EXIT ; EQ = INACTIVE - DO NOTHING2 CALLR $EXRQN ; REQUEST COT WITH NO QUE ENTRY - ) ; THIS IS A CUE TO FLUSH THE BUFFER.TEXIT: ; COMMON EXITT,COPWF: RETURN ; ENTRY POINT FOR POWERFAIL .ENDNTIMEOUT COUNT, WHEN IT CONTAINS AUA; PARTIALLY FILLED LOGFILE BUFFER. WHEN THE COUNT EXPIRES, CODRVLC; INFORMS .TITLE CRDRV .IDENT /09.00/C;46; COPYRIGHT (C) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;R<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;R; D. N. CUTLER 3-MAR-74C;R; MODIFIED FOR M-PLUS V2.0 BY:;R ; A. GROUPEB ; P. J. CARR;B; MODIFIED BY:;R; P. J. CARR 10-FEB-82 08.01; $; PJC044 -- CORRECT DETACH FUNCTION;I; P. J. CARR 8-APR-82 08.02;B3; PJC050 -- CHECK FOR CARD DONE CONDITION IN CRINTD; ; P. J. CARR 2-JUN-82 08.03 ;34; PJC057 -- CORRECT PROCESSING OF PICK CHECK ERRORS;.; P. J. CARR 16-AUG-82 08.04;D6; PJC062 -- CORRECT FOR LAST CARD BEFORE HOPPER ERROR; BEING READ AS BLANKS; E; D. MAILLOUX 28-MAR-82 08.057;/; DMM053 -- CORRECT USE OF ALLOCATED AST BLOCKP;;.$; CR11 CARD READER CONTROLLER DRIVER; ; MACRO LIBRARY CALLS ; # .MCALL ABODF$,HWDDF$,PKTDF$,UCBDF$" ABODF$ ;DEFINE TASK ABORT CODES% HWDDF$ ;DEFINE HARDWARE REGISTERSN$ PKTDF$ ;DEFINE I/O PACKET OFFSETS UCBDF$ ;DEFINE UCB OFFSETST;E; EQUATED SYMBOLS ;O ASTSIZ= 16. ;SIZE OF AST BLOCK)STKSIZ= 14. ;SIZE OF STACK IN AST BLOCKF;O; CR11 DEVICE REGISTER OFFSETS;N.CRCS= 0 ;CARD READER CONTROL STATUS REGISTER"CRDB= 2 ;CARD READER DATA BUFFER;L%; CARD READER CONTROL STATUS REGISTERL; ERR= 100000 ;COMBINED ERROR CRDONE= 40000 ;CARD DONE#HOPERR= 20000 ;HOPPER CHECK ERRORAMTNERR= 10000 ;MOTION ERRORNTIMERR= 00|~|ttt tfDATA 4000 ;TIMING ERROR#TRONL= 2000 ;TRANSITION TO ONLINEFBUSY= 1000 ;BUSY(READY= 400 ;ONLINE, READY TO READ (=0),DONE= 200 ;COLUMN OF DATA IS READY IN CRDBIE= 100 ;INTERRUPT ENABLEREAD= 1 ;READ $TIMERR= 4000 ;TIMING ERROR (U.CW2)#; CARD READER CONTROL BLOCK OFFSETS2;C0STRBF=U.CNT+2 ;STARTING ADDRESS OF DATA BUFFER/CURBF=U.CNT+4 ;CURRENT ADDRESS IN DATA BUFFERR0EOFCL=U.CNT+6 ;NUMBER OF COLUMNS FOR VALID EOF2EOFCT=U.CNT+7 ;NUMBER OF EOF PUNCHES ENCOUNTERED(CCOLC=U.CNT+10 ;CURRENT COLUMN COUNTER-CCOL1=U.CNT+12 ;CONTENTS OF CARD COLUMN ONE;=; SPECIAL CARD PUNCH PATTERNS=;-CREOF=7417 ;END OF FILE (12-11-0-1-6-7-8-9) +CR026=4242 ;TRANSLATE 026 CODE (12-2-4-8)/CR029=5252 ;TRANSLATE 029 CODE (12-0-2-4-6-8)A;O ; LOCAL DATA ; ; 029 TRANSLATION TABLEN;DTB029: .BYTE 40 ;SPACE= .BYTE 61 ;1E .BYTE 62 ;2A .BYTE 63 ;3C .BYTE 64 ;4M .BYTE 65 ;5F .BYTE 66 ;6O .BYTE 67 ;7N .BYTE 70 ;8N .BYTE 40 ;EMPTYC .BYTE 72 ;:; .BYTE 43 ;#C .BYTE 100 ;@ .BYTE 47 ;'N .BYTE 75 ;=M .BYTE 42 ;" .BYTE 71 ;9N .BYTE 60 ;0 .BYTE 57 ;/  .BYTE 123 ;S .BYTE 124 ;T .BYTE 125 ;U .BYTE 126 ;V .BYTE 127 ;W .BYTE 130 ;X .BYTE 131 ;Y .BYTE 40 ;EMPTY .BYTE 134 ;\ .BYTE 54 ;, .BYTE 45 ;%O .BYTE 137 ; .BYTE 76 ;> .BYTE 77 ;?E .BYTE 132 ;Z .BYTE 55 ;-E .BYTE 112 ;J .BYTE 113 ;K .BYTE 114 ;L .BYTE 115 ;M .BYTE 116 ;N .BYTE 117 ;O .BYTE 120 ;P .BYTE 121 ;Q .BYTE 40 ;EMPTYE .BYTE 135 ;] .BYTE 44 ;$E .BYTE 52 ;*E .BYTE 51 ;)E .BYTE 73 ;;E .BYTE 136 ;^ .BYTE 122 ;R .BYTE 46 ;&E .BYTE 101 ;A .BYTE 102 ;B .BYTE 103 ;C .BYTE 104 ;D .BYTE 105 ;E .BYTE 106 ;F .BYTE 107 ;G .BYTE 110 ;H .BYTE 40 ;EMPTYE .BYTE 133 ;[ .BYTE 56 ;.E .BYTE 74 ;E .BYTE 46 ;&E .BYTE 122 ;R .BYTE 53 ;+E .BYTE 101 ;A .BYTE 102 ;B .BYTE 103 ;C .BYTE 104 ;D .BYTE 105 ;E .BYTE 106 ;F .BYTE 107 ;G .BYTE 110 ;H .BYTE 40 ;EMPTYE .BYTE 77 ;?E .BYTE 56 ;.E .BYTE 51 ;)E .BYTE 135 ;] .BYTE 74 ;; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.; ; INPUTS:C;I:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;N ; OUTPUTS:;QE; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT-RE; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-T; ATION IS I00||{ccccNITIATED. ;- .ENABL LSBN%CRINI: GTPKT$ CR,C$$R11,CRPWF,UCBSV,T .;S1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:Q;E'; R1=ADDRESS OF THE I/O REQUEST PACKET. -; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.A; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK. :; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;E(; CARD READER I/O REQUEST PACKET FORMAT:;R"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK.G@; WD. 03 -- POINTER TO THE SECOND WORD IN REQUESTER TASK HEADER.J; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK HEADER (UCB).'; WD. 05 -- I/O FUNCTION CODE (IO.RLB).E0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.D; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT +140000).3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.*; WD. 12 -- RELOCATION BIAS OF I/O BUFFER.+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.E-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.N; WD. 15 -- NOT USED.K; WD. 16 -- NOT USED.O; WD. 17 -- NOT USED. ; WD. 20 -- NOT USED.H;E+ CLR STRBF(R5) ;ASSUME ALLOCATION FAILURE )1 CALL CRATT ;IS IT AN ATTACH OR DETACH FUNCTION?. BCS 160$ ;IF CS YESN/ MOV #80.,R0 ;ASSUME ASCII OR PACKED HOLLERITHS9 MOVB I.FCN(R1),U.CW2(R5) ;SAVE SUBFUNCTION MODIFIER BITS * BPL 10$ ;IF PL ASCII OR PACKED HOLLERITH) ASL R0 ;BINARY READ REQUIRES 160. BYTES .10$: MOV R0,R1 ;SET LENGTH OF BUFFER REQUIRED# CALL $ALOCB ;ALLOCATE DATA BUFFERR% BCS 90$ ;IF CS, NO BUFFER AVAILABLE-/ MOV R0,STRBF(R5) ;SAVE STARTING BUFFER ADDRESS 1 BICB #US.ABO,U.STS(R5) ;CLEAR ABORT REQUEST FLAG ;R; INITIATE CARD READ; 120$: MOV R5,R3 ;CALCULATE ADDRESS OF CARD READERN ADD #STRBF,R3 ;CONTROL BLOCKR4 MOV (R3)+,(R3)+ ;SET CURRENT ADDRESS IN DATA BUFFER0 MOVB #1,(R3) ;ASSUME ASCII OR PACKET HOLLERITH TSTB U.CW2(R5) ;BINARY READ?I BPL 30$ ;IF PL NO0- MOVB #8.,(R3) ;SET EOF COUNT FOR BINARY READ -30$: MOVB (R3)+,(R3)+ ;SET EOF COLUMN COUNTER% CLR (R3) ;CLEAR CARD COLUMN COUNTER. MOV S.CSR(R4),R2 ;GET CARD READER CSR ADDRESS BIT #READY,(R2)+ ;READY?C BNE CROUT ;IF NE NO 3 MOVB S.ITM(R4),S.CTM(R4) ;SET DEVICE TIMEOUT COUNTC1 MOV (R2),R0 ;READ DATA BUFFER CLEAR DONE IF SETO( MOV #,-(R2) ;START CARD MOTION;RK; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUSES.K; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDITIONO3; THAT COULD EXIST IN RESTARTING THE I/O OPERATION. ;N CRPWF: ; ;A"; CALL US BACK AFTER DEQUEUING AST;RCRCUB:: RETURN ;;E); CARD READ ERROR DURING A READ OPERATION ; 5CRERR: MOV #T.NCRE,R0 ;SET FOR HARDWARE ERROR MESSAGEN BR 50$ ;; A; DEVICE TIMEOUT RESULTS IN A NOT READY MESSAGE BEING PUT OUT AT CD; A SYSGEN SPECIFIED INTERVAL. TIMEOUTS ARE CAUSED BY POWERFAILURE (; AND CARD READER FAULT CONDITIONS. ; CROUT: ;;; 1 CLR @S.CSR(R4) ;;;DISABLE CARD READER INTERRUPT E MTPS #0 ;;;ALLOW INTERRUPTS  .IF DF,T$$KMG.40$: MOV #T.NDNR,R0 ;SET FOR NOT READY MESSAGE .IFTF-50$: BITB #US.ABO,U.STS(R5) ;ABORT REQUESTED?O BNE 120$ ;IF NE YES. .IFTS% BIT #TIMERR,U.CW2(R5) ;TIMING ERROR?; BEQ 60$ ;IF EQ NOO4 BIT #READY,@S.CSR(R4) ;OPERATOR PUT READER OFFLINE? BEQ 70$ ;IF EQ NOI. BIC #TIMERR,U.CW2(R5) ;CLEAR TIMING ERROR BIT .IFTF960$: BIT #READY,@S.CSR(R4) ;CARD READER ONLINE AND READY?  BEQ 20$ ;IF EQ YES270$: MOVB #1,S.CTM(R4) ;SET TIMEOUT FOR ONE SECOND .IFTT' DECB S.STS(R4) ;TIME TO PRINT MESSAGE?R BNE CRPWF ;IF NE NOM7 MOVB #C$$RTO,S.STS(R4) ;SET TO OUTPUT NEXT MESSAGE IN Q ;C$$RTO SECONDS N/ BNE 80$ ;IF NE, CR NOT READY MESSAGES ENABLEDG6 INCB S.STS(R4) ;CR NOT READY MESSAGES NOT WANTED, SO BR CRPWF ;REBUSY CONTROLLER "80$: CALLR $DVMSG ;OUTPUT MESSAGE .IFFA BR CRPWFR .ENDC B;#; NO BUFFER SPACE AVAILABLE ;I790$: MOV #IE.NOD&377,R0 ;SET00|~|ttt tfDATA NO BUFFER AVAILABLE STATUS) BR 160$ ; ;N(; NO EOF YET AND NO MORE CARDS IN HOPPER; 7100$: MOV #!IS.SUC,R0 ;NO CARDS LEFT/NO EOFT TST U.CW3(R5) ;ATTACH FOR AST?  BEQ 160$ ;IF EQ NO) BIS #IE,@S.CSR(R4) ;SET INTERRUPT ENABLES BR 160$ ;G;CC; JUST HAD EOF AND NO MORE CARDS IN HOPPER (FOR USE WITH ATTACH FORY; UNSOLICITED AST FUNCTION)V; C110$: MOV #!,R0 ;NO CARDS LEFT/JUST HAD EOF ) BIS #IE,@S.CSR(R4) ;SET INTERRUPT ENABLE#% INCB EOFCT(R5) ;FAKE NOT END OF FILES BR 160$ ;6; ; ABORT REQUESTEDT;D5120$: MOV #IE.ABO&377,R0 ;SET TRANSFER ABORTED STATUSS BR 160$ ;A;E; UNRECOVERABLE ERRORR;;1130$: MOV #IE.VER&377,R0 ;SET UNRECOVERABLE ERROR. BR 160$ ;I;U; DEVICE NOT READY ERROR;C4140$: MOV #IE.DNR&377,R0 ;SET DEVICE NOT READY ERROR BR 160$ ;Y;N ; END OF FILEU;I0150$: MOV #IE.EOF&377,R0 ;SET END OF FILE STATUS+160$: CLR R1 ;CLEAR SECOND I/O STATUS WORD( JMP 320$ ;;+2; **-$CRINT-CR11 CARD READER CONTROLLER INTERRUPTS;-$CRINT:: ;;;REF LABELE< INTSV$ CR,PR6,C$$R11,,UCBSV ;;;GENERATE INTERRUPT SAVE CODE MOV R3,-(SP) ;;;SAVE R3' MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCBE' MOV S.CSR(R4),R3 ;;;GET ADDRESS OF CSR6* BIT #176000,(R3)+ ;;;EXCEPTION CONDITION? BNE 170$ ;;;IF NE YES0 JMP 350$ ;;;7170$: MOV -(R3),R4 ;;;SAVE CARD READER INTERRUPT STATUS5+ CLR (R3) ;;;DISABLE CARD READER INTERRUPTS MOV (SP)+,R3 ;;;RESTORE R3 ' CALL $FORK ;;;CREATE A SYSTEM PROCESS* MOV R4,R0 ;COPY STATUS WORDL% MOV U.SCB(R5),R4 ;GET ADDRESS OF SCB  TSTB EOFCT(R5) ;END OF FILE?U BNE 190$ ;IF NE NO TST U.CW3(R5) ;ATTACH FOR AST?S BEQ 180$ ;IF EQ NO BIT #HOPERR,R0 ;HOPERR ERROR?- BNE 110$ ;IF NE - EOF, AST AND HOPPER ERROR0=180$: BR 150$ ;EOF AND EITHER AST AND/OR HOPPER ERROR OR NOTP*190$: BIT #TRONL,R0 ;TRANSITION TO ONLINE? BNE 200$ ;IF NE YES5 BIT #CRDONE,R0 ;CARD DONE?R BNE 240$ ;IF NE YES( BIT #HOPERR,R0 ;HOPERR ERROR?. BNE 100$ ;IF NE, NO EOF YET AND HOPPER ERROR! BR 230$ ;CHECK FOR OTHER ERRORS /200$: BITB #US.BSY,U.STS(R5) ;READ IN PROGRESS?E BNE 60$ ;IF NE YES0210$: MOV U.CW3(R5),R1 ;GET ADDRESS OF AST BLOCK' BEQ 130$ ;IF EQ, THERE IS NONE, ERROR9 MOV A.PRM(R1),R0 ;GET TCB ADDRESS OF TASK TO RECEIVE AST0! CALLR $QASTT ;QUEUE AST TO TASKR220$: JMP CRERR ;230$: ;REF LABELS .IF DF,T$$KMG BIT #MTNERR,R0 ;MOTION ERROR? BNE 220$ ;IF NE YES2 BIT #TIMERR,R0 ;TIMING ERROR? BEQ 240$ ;IF EQ NO JMP 40$ ;, .IFFE BIT #MTNERR,R0 ;MOTION ERRORE BNE 220$ ;IF NE YES0 BIT #TIMERR,R0 ;TIMING ERRORD BEQ 240$ ;IF EQ NO) BIS #TIMERR,U.CW2(R5) ;SHOW TIMING ERROR BR 220$ ;  .ENDC'240$: MOV #80.*2,R0 ;ASSUME BINARY READA MOVB U.CW2(R5),R1 ;BINARY READ? BMI 250$ ;IF MI YESL$ MOVB CCOLC(R5),R0 ;USE COLUMN COUNT TSTB R1 ;PACKED HOLLERITH? BNE 250$ ;IF NE YESG4 CMP #CR026,CCOL1(R5) ;026 TRANSLATION CONTROL CARD? BEQ 400$ ;IF EQ YEST4 CMP #CR029,CCOL1(R5) ;029 TRANSLATION CONTROL CARD? BEQ 410$ ;IF EQ YES & MOV #TB029,R1 ;ASSUME 029 TRANSLATION) BITB #US.MDE,U.STS(R5) ;029 TRANSLATION?; BNE 250$ ;IF NE YESU' MOV #TB026,R1 ;SET FOR 026 TRANSLATION ;250$: MOV STRBF(R5),R2 ;GET STARTING ADDRESS OF DATA BUFFERV5 MOV U.CNT(R5),-(SP) ;GET NUMBER OF BYTES TO TRANSFERM3260$: MOVB (R2)+,R3 ;GET NEXT BYTE FROM DATA BUFFER 5 BIT #300,U.CW2(R5) ;BINARY OR PACKED HOLLERITH READ?5 BNE 300$ ;IF NE YESR! MOV #104,R4 ;ASSUME RPG SPECIALC CMPB R3,#240 ;RPG SPECIAL? BEQ 290$ ;IF EQ YESB" INC R4 ;INCREMENT CHARACTER CODE CMPB R3,#140 ;RPG SPECIAL? BEQ 290$ ;IF EQ YES9% MOVB R3,R4 ;SIGN EXTEND PACKED CODE) BPL 270$ ;IF PL, ZONE 12 IS NOT PUNCHED5' ADD #340,R4 ;ADJUST FOR ZONE 12 PUNCHS% MOV R4,R3 ;COPY FOR ZONE COUNT DOWN;2270$: SUB #40,R3 ;DECREMENT COUNT OF ZONE PUNCHES BMI 280$ ;IF MI DONE. SUB #17,R4 ;SUBTRACT 21 AND STRIP ZONE PUNCH BR 270$ ;E'280$: CMP R4,#105 ;INDEX WITHIN RANGE?4 BLOS 290$ ;IF LOS YESC CLR R4 ;FORCE A BLANK?5290$: ADD R1,R4 ;CALCULATE ADDRESS OF TRA00||{ccccNSLATE CODE ) MOVB (R4),R3 ;GET TRANSLATED ASCII CODE02300$: MOV R3,-(SP) ;SET BYTE TO PUT IN USER BUFFER& CALL $PTBYT ;PUT BYTE IN USER BUFFER* DEC (SP) ;ANY MORE SPACE IN USER BUFFER? BLE 310$ ;IF LE NO$ DEC R0 ;ANY MORE BYTES TO PROCESS? BGT 260$ ;IF GT YES /310$: MOV U.CNT(R5),R1 ;GET SIZE OF USER BUFFER 3 SUB (SP)+,R1 ;CALCULATE NUMBER OF BYTES TRANSFERED$5 MOV #IS.SUC&377,R0 ;SET SUCCESSFUL COMPLETION STATUSO(320$: CALL $IODON ;FINISH I/O OPERATION3 MOV STRBF(R5),R0 ;GET ADDRESS OF BUFFER TO RELEASE  BEQ 340$ ;IF EQ, NO BUFFER4 MOV #80.,R1 ;ASSUME ASCII OR PACKED HOLLERITH READ+ TSTB U.CW2(R5) ;ASCII OR PACKED HOLLERITH? BPL 330$ ;IF PL YESA$ ASL R1 ;SET FOR BINARY READ BUFFER*330$: CALL $DEACB ;DEALLOCATE DATA BUFFER340$: JMP CRINI ;GO AGAIN;.; STORE DATA IN CARD BUFFERB;E-350$: MOV (R3)+,R4 ;;;READ BINARY CARD COLUMNS+ MOV (R3),R3 ;;;READ PACKED HOLLERITH DATAO2 MOVB CCOLC(R5),-(SP) ;;;GET CURRENT COLUMN NUMBER# BNE 360$ ;;;IF NE, NOT COLUMN ONES. MOV R4,CCOL1(R5) ;;;SAVE CARD COLUMN ONE DATA/360$: CMPB (SP)+,EOFCL(R5) ;;;PAST EOF COLUMNS?R BHIS 370$ ;;;IF HIS YESA$ CMP R4,#CREOF ;;;END OF FILE PUNCH? BNE 370$ ;;;IF NE NO( DECB EOFCT(R5) ;;;DECREMENT EOF COUNTER<370$: CMPB CCOLC(R5),#80. ;;;80. COLUMNS READ (BUFFER FULL)?/ BEQ 390$ ;;;IF EQ YES -- DO NOT EXCEED BUFFERR* INCB CCOLC(R5) ;;;INCREMENT COLUMN NUMBER7 MOVB R3,@CURBF(R5) ;;;ASSUME ASCII OR PACKED HOLLERITHP- TSTB U.CW2(R5) ;;;ASCII OR PACKED HOLLERITH?F BPL 380$ ;;;IF PL YESV' MOV R4,@CURBF(R5) ;;;STORE BINARY DATAA/ INC CURBF(R5) ;;;UPDATE CURRENT BUFFER ADDRESSR4380$: INC CURBF(R5) ;;;UPDATE CURRENT BUFFER ADDRESS 390$: MOV (SP)+,R3 ;;;RESTORE R3 RETURN ;;;EXIT INTERRUPTE;F; SET 026 TRANSLATION MODE;#8400$: BICB #US.MDE,U.STS(R5) ;CLEAR 029 TRANSLATION FLAG BR 420$ ; ;D; SET 029 TRANSLATION MODE;C6410$: BISB #US.MDE,U.STS(R5) ;SET 029 TRANSLATION FLAG!420$: JMP 20$ ;READ ANOTHER CARD5;A0; **-CRATT-CARD READER CHECK FOR ATTACH FUNCTION; ; OUTPUT:R;R*; C=0 FUNCTION WAS NOT AN ATTACH OR DETACH&; C=1 FUNCTION WAS AN ATTACH OR DETACH;U9CRATT: CMPB #,I.FCN+1(R1) ;ATTACH FUNCTION?; BNE 480$ ;IF NE NO4 BITB #TF.AST,I.FCN(R1) ;ATTACH FOR UNSOLICITED AST? BEQ 495$ ;IF EQ NO8430$: TST I.PRM(R1) ;CHECK FOR NON-SPECIFIED AST ADDRESS BEQ 470$ ;IF EQ YES, ERROR& MOV R1,-(SP) ;SAVE I/O PACKET ADDRESS2 MOV #ASTSIZ.,R1 ;SET LENGTH OF AST BLOCK IN BYTES, CALL $ALOCB ;ALLOCATE CORE BLOCK FROM POOL BCC 440$ ;IF CC OK TST (SP)+ ;CLEAN STACK2 MOV #IE.NOD&377,R0 ;SET BUFFER ALLOCATION FAILURE BR 500$ ;O1440$: MOV R0,U.CW3(R5) ;COPY ADDRESS OF AST BLOCK(( MOVB #1,EOFCT(R5) ;FAKE NOT END OF FILE) MOV (SP)+,R1 ;RESTORE I/O PACKET ADDRESSO# MOV KISAR5,(R0)+ ;MAPPING (A.KSR5)31 MOV #CRCUB,(R0)+ ;WHERE TO CALL US BACK (A.DQSR)E, MOV R0,U.CW3(R5) ;COPY ADDRESS OF AST BLOCK( TST (R0)+ ;SKIP PAST LINK WORD (A.LNK), CLR (R0)+ ;LENGTH OF CONTROL BLOCK (A.CBL)7 MOV #STKSIZ.,(R0)+ ;ALLOCATE 14 BYTES ON STACK (A.BYT)K) MOV I.PRM(R1),(R0)+ ;AST ADDRESS (A.AST)7- CLR (R0)+ ;NUMBER OF AST PARAMETERS (A.NPR)O0 MOV I.TCB(R1),(R0) ;TCB ADDRESS OF TASK (A.PRM)0 BIT #READY,@S.CSR(R4) ;READER READY AND ONLINE? BNE 450$ ;IF NE NO CALL 210$ ;QUEUE AST NOW( BR 495$ ;SKIP SETTING INTERRUPT ENABLE.450$: BIS #IE,@S.CSR(R4) ;SET INTERRUPT ENABLE BR 495$ ; <470$: MOV #IE.SPC&377,R0 ;SET ILLEGAL AST ADDRESS ERROR CODE BR 500$ ; 8480$: CMPB #,I.FCN+1(R1) ;DETACH FUNCTION? BEQ 490$ ;IF EQ YES . CLC ;SHOW FUNCTION WAS NOT ATTACH OR DETACH RETURN ;01490$: MOV U.CW3(R5),R0 ;GET ADDRESS OF AST BLOCK?R BEQ 495$ ;IF EQ NONE< CMP -(R0),-(R0) ;POINT TO BEGINNING OF ALLOCATED CORE BLOCK) MOV #ASTSIZ.,R1 ;SET LENGTH OF AST BLOCKA$ CALL $DEACB ;DEALLOCATE CORE BLOCK+ BIC #IE,@S.CSR(R4) ;CLEAR INTERRUPT ENABLEE. CLR U.CW3(R5) ;SHOW NO ATTACH FOR AST ANYMORE8495$: MOV #IS.SUC&377,R0 ;SET SUCCESSFUL COMPLETION CODE2500$: SEC ;SHOW FUNCTION WAS AN ATTACH OR DETACH RETURN ; .DSABL LSB00|||tt tfDATA; C; CANCEL I/O OPERATION-FORCE I/O TO COMPLETE IS DEVICE IS NOT READYW;54CRCAN: CMP R1,I.TCB(R0) ;;;REQUEST FOR CURRENT TASK? BNE 10$ ;;;IF NE NON< BISB #US.ABO,U.STS(R5) ;;;SET FOR ABORT IF DEVICE NOT READY10$: RETURN ;;;A .ENDDEACB ;DEALLOCATE CORE BLOCK+ BIC #IE,@S.CSR(R4) ;CLEAR INTERRUPT ENABLEE. CLR U.CW3(R5) ;SHOW NO ATTACH FOR AST ANYMORE8495$: MOV #IS.SUC&377,R0 ;SET SUCCESSFUL COMPLETION CODE2500$: SEC ;SHOW FUNCTION WAS AN ATTACH OR DETACH RETURN ; .DSABL LSB .TITLE TTYJ .IDENT /V4.00/B;06; COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;T<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;N;;; 27-JAN-78 PETER WANNHEDENS;C; PREVIOUSLY MODIFIED BY: ;N; P. WANNHEDEN ; C. F. SPITZM; D. R. DONCHIN);;; MODIFICATIONS:;L .PSECT MAP5;M;+*; CONTROLLER-DEPENDENT ROUTINES FOR DJ-11.;-;-;O T .IF DF D$$J11 ,; EQUATED SYMBOLSL;T; DJ-11 REGISTER DEFINITIONS;I!CSR = 0 ;CONTROL AND STATUS REG.ORBUF = 2 ;RECEIVER BUFFER REG..TCR = 4 ;TRANSMIT CONTROL REG.D"TBUF = 6 ;TRANSMITTER BUFFER REG.;C;E;+; YJPWUP - POWER UP.; ; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0. ; US.DSB 0 ;-;O;I .IF DF R$$CONYJCONL::YJCPUP:: .IFF#YJPWUP::TST R2 ;IS THIS LINE ZERO?  BNE 20$ ;N - RETURN .IFTF, MOV #10,@R3 ;CLEAR SILO, UARTS, CONTROLLER!10$: BIT #20,@R3 ;CLR COMPLETED?O BNE 10$ ;N - WAITB" BIS #40501,@R3 ;ENABLE INTERRUPTS .IFTNYJUONL::YJUPUP::YJUOFF:: .ENDC ;R$$CON20$:YJMTIM::RETURN ;RETURN .IF DF R$$CONYJCOFF::, MOV #10,@R3 ;CLEAR SILO, UARTS, CONTROLLER!10$: BIT #20,@R3 ;CLR COMPLETED?: BNE 10$ ;N - LOOP. RETURN- .ENDC ;R$$CON;C;;+"; INPUT INTERRUPT SERVICE ROUTINE.;-;2;I .ENABL LSBE;  B .IF DF R$$MPL -$YJINP::TTSET$ YJ ;;;SAVE R2, R3 AND SET UP:  ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS $ .IFF ;R$$MPLB #+$DJINP::TTSET$ DJ ;;;SAVE R2,R3 AND SET UPO ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST T .ENDC ;R$$MPL N, CALL MUXINP ;;;DO COMMON MULTIPLEXER INPUT ;;;CHARACTER PROCESSINGR3 ;;;MUXINP DISMISSES INTERRUPT IF NO OUTPUT WORKL* BR 10$ ;;;XMIT READY - GO DO OUTPUT WORK;;N;+#; OUTPUT INTERRUPT SERVICE ROUTINE.I;-;B;S  .IF DF R$$MPL M-$YJOUT::TTSET$ YJ ;;;SAVE R2, R3 AND SET UP:E ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS E .IFF ;R$$MPLR P+$DJOUT::TTSET$ DJ ;;;SAVE R2,R3 AND SET UPS ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST I .ENDC ;R$$MPL M10$: MOV R3,-(SP) ;;;;, ADD #TBUF+1,@SP ;;;POINT TO BYTE CONTAINING0 ;;;INTERRUPTING LINE NUMBER (TBUF HIGH BYTE). CALL JZOUT ;;;DO OUTPUT INTERRUPT PROCESSING! ;;;COMMON FOR DJ-11 AND DJ-11I TST (SP)+ ;;;CLEAN STACK;;;+; YJABOX - ABORT OUTPUT.;T; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.TOC 0 ; U.TTOC 0;F; YJSTOX - STOP OUTPUT.T;$; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 1I;-;C;$YJABOX::YJSTOX::RETURN ;;;RETURN;B .DSABL LSBO  .ENDC ;D$$J11 ; ;I .ENDTING LINE NUMBER (TBUF HIGH BYTE). CALL JZOUT ;;;DO OUTPUT INTERRUPT PROCESSING! ;;;COMMON FOR DJ-11 AND DJ-11I TST (SP)+ ;;;CLEAN STACK;;;+; YJABOX - ABORT OUTPUT.;T; INPUT:<; REGISTERS R2-R .TITLE TTDATL .IDENT /06.11/T; 8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ;N ; 27-JAN-78 PETER WANNHEDENH ;H ; PREVIOUSLY MODIFIED BY:;; P. WANNHEDEN; C. F. SPITZ; D. R. DONCHIN; ; T. LEKAS; J. KAUFFMAN ; S. C. ADAMS ; C. B. PETROVIC ; R. S. PHILPOTT R ; T. LEK00||{ccccAS ; B. S. MCCARTHY ; L. B. MCCULLEY ; L. M. KOGAN ; ; MODIFICATIONS:;T; ; L. KOGAN 02-DEC-85 06.01<; LK706 -- CORRECT SPEED FOR 134.5 BAUD IN ABLOW FOR DH11; ; S. C. ADAMS 6-NOV-85 6.027; SA452 -- ADD SUPPORT FOR USER-WRITTEN PORT DRIVER E;A; L. KOGAN 18-JUN-86 6.034; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT;"; S. R. CLOUTIER 20-JUN-86 6.045; ADD $LHGTD (LH GET TRANSMIT DATA) ENTRY TO TABLE;S; S. C. ADAMS 6-AUG-86 6.057; SA464 -- ADD SUPPORT FOR LAT APPLICATION TERMINALS ; !; S. R. CLOUTIER 7-AUG-86 6.06'; ADD $LHTMO TIME-OUT ENTRY TO TABLE-;R; R. D. HANEY 13-AUG-86 6.07 "; RDH073 - ADD SUPPORT FOR LA75; %; S. R. CLOUTIER 12-SEPT-1986 6.08R1; SRC CORRECT PPORG AND PPEIO IN PPDSP (PHEW!)6;3 ; R. D. HANEY 19-SEP-86 06.10(; RDH087 ADD SUPPORT FOR LA2XX SERIES;2#; S. R. CLOUTIER 27-OCT-86 06.11E; SRC FIX QPDSP FOR IO.ORGs;St; u;+Kv; THIS MODULE CONTAINS ALL DRIVER DATA, EXCEPT THE DRIVER DISPATCH TABLE. 7w; IT ALSO CONTAINS THE DRIVER INITIALIZATION ROUTINE.Mx;EAy; IN A SYSTEM THAT SUPPORTS SEPARATE KERNEL DATA SPACE MAPPING,R:z; THIS MODULE MUST BE BUILT INTO THE TASK IMAGE "TTCOM".{;-|;0}; ~ .MCALL FILIO$, SPCIO$, TTSYM$; & FILIO$ ;DEFINE I/O FUNCTION CODES SPCIO$ TTSYM$D .IF DF T$$OVL .MCALL PCBDF$ PCBDF$- .ENDC ;T$$OVL .IF NDF R$$MPL .MCALL HWDDF$ HWDDF$ ;DEFINE KINAR5 .ENDC ;NDF R$$MPL;E;C; MACRO TO GENERATE CHARACTER RECOGNITION TABLE AND CORRESPONDINGA; DISPATCH TABLE. ;A .MACRO CREC PREFIX,CHAR .IRP X, .PSECT CHRT .IIF NDF CHRT CHRT==.& .IIF NDF 'PREFIX'CRT 'PREFIX'CRT==. .BYTE CH.'X' .PSECT CHRD .IIF NDF CHRD CHRD==. .WORD 'PREFIX''X' .ENDR .PSECT MAP5 .ENDM CRECC;)CH.DEF = 0 ;DEFINE "DEFAULT" CHARACTER ;FOR CHARACTER DISPATCHING;!; CHARACTER RECOGNITION TABLES.;; EACH TABLE SHOULD BE ORDERED IN DESCENDING FREQUENCY OFH'; OCCURRENCE FOR MAXIMUM PERFORMANCE.N;4; CHARACTERS THAT HAVE SPECIAL SIGNIFICANCE BEFORE2; STORING IN TYPE-AHEAD BUFFER - USED BY ICHAR1./; NOTE - ICHAR1 RECOGNIZES CTRL-X SEPARATELY.8; ALL ENTRIES IN THE TABLE MUST BE NUMERICALLY SMALLER; OR EQUAL TO CTRL-X (30).;. .PSECT MAP5;C .EVEN I1CRT::= .BYTE CH.CTS, CH.CTQ, CH.CTO .IIF DF T$$CTX, .BYTE CH.CTX .BYTE CH.CTCN3ASXOFF==I1CRT ;THIS LABEL MUST POINT TO AN XOFFE ;CHARACTER (CTRL-S) 3ASXON==I1CRT+1 ;THIS LABEL MUST POINT TO AN XONC ;CHARACTER (CTRL-Q)I;C;O3; CHARACTERS THAT HAVE SPECIAL SIGNIFICANCE AFTER.>; RETRIEVAL FROM TYPE-AHEAD BUFFER (OR WHEN BUFFER BYPASSED)F; USED BY ICHAR2. NOTE - ESCAPE AND RUBOUT ARE RECOGNIZED SEPARATELY;; BY ICHAR2. ALL ENTRIES IN THE TABLE MUST BE NUMERICALLYE; SMALLER THAN ESCAPE (33).; + CREC I2,N .IIF DF T$$CTX, CREC I2, CREC I2,;A;R .IIF DF T$$CTR, CREC ED, CREC ED,; ;AC; CHARACTERS THAT HAVE TO BE EXPANDED ON OUTPUT - USED BY EXPCHR.I7; CARRIAGE-RETURN IS RECOGNIZED SEPARATELY BY EXPCHR.EG; ALL ENTRIES IN THE TABLE MUST BE SMALLER THAN CARRIAGE-RETURN (15).G; CREC EX,;IA; CHARACTERS THAT HAVE NON-STANDARD ECHO FORMATS AS TERMINATORS; CREC EK,C;;8; RECOGNITION TABLE FOR VERTICAL FORMAT CONTROL BYTES.2; NOTE - THIS TABLE USES -1 AS TABLE TERMINATOR.;<1; THE WORD IN TABLE CHRD IS ENCODED AS FOLLOWS:T;E*; LOW BYTE DESCRIBES LEADING LF'S OR FF:; 0 = NO LEADING CHARACTERSA; CH.FF = LEADING FF; -N = N LEADING LF'SM;E$; HIGH BYTE DESCRIBES TRAILING CR:; 0 = NO TRAILING CR; S2.CR = TRAILING CR ;C%; DEFINE SYMBOLS FOR ENCODED VALUESS;E7 .IIF LE S2.CR-200 .ERROR ;S2.CR M00|||tt tfDATAUST BE IN HIGH BYTEVFNUL = 0 ;NULL - NOTHING%VFZER = 376!S2.CR ;0 - 2 LF'S, 1 CR%VFONE = CH.FF!S2.CR ;1 - 1 FF, 1 CRR'VFPLU = S2.CR ;+ - NO LF OR FF, 1 CRDVFDOL = 377 ;$ - 1 LF, NO CR(VFDF = 377!S2.CR ;DEFAULT - 1 LF, 1 CR; ;L; DEFINE THE TABLE TERMINATORE; CH.DF = -1;I# CREC VF,E;I;C; SPECIAL ECHO STRINGS; >ASHT:: .BYTE CH.SP,CH.SP,CH.SP,CH.SP,CH.SP,CH.SP,CH.SP,CH.SP+ ;8 SPACES - USED TO SIMULATE HOR. TABM .IF DF T$$CTRASCTR:: .ASCII /^R/ ;CTRL-R  .ENDC  ASCTU:: .ASCII /^U/ ;CTRL-U   .IF NDF R$$MPL&A$$CLI.ASCLP:: .BYTE 12,'> ;ABBREVIATED CLI PROMPT,ASCLI:: .ASCII <12>/MCR>/ ;FULL CLI PROMPT .ENDC ;NDF R$$MPL&A$$CLII .IF DF T$$SPC/ASCLC:: .BYTE 15,12 ;CLI CONTINUATION PROMPT, .ASCII /->/ ; .ENDC ;T$$SPC;#; DON'T SEPARATE THE LINES BELOW!P;PASCTZ::.ASCII /^Z/ ;CTRL-Z (ASCR:: .BYTE CH.CR,0,0,0,0,0,0,0,0,0,0,  ;CARRIAGE RETURN PLUS UP TO 10 FILLERS! ;(WORST CASE FOR LA30S)S"; ##; DON'T SEPARATE THE LINES ABOVE!R$;&%ASBELL::.BYTE 7 ;BELL &ASBSL:: .ASCII "\" ;BACKSLASH'( .IF DF T$$RUB)>*ASRBS:: .BYTE CH.BSP,CH.SP,CH.BSP ;BACKSPACE-SPACE-BACKSPACE+ ;(FOR SCOPE RUBOUT)B9,ASBSP:: .BYTE CH.BSP,CH.BSP,CH.BSP,CH.BSP ;8 BACKSPACES=- .BYTE CH.BSP,CH.BSP,CH.BSP,CH.BSP ;TO RUBOUT HTAB ON SCOPEW./ .ENDC01;I02 NLFF==4 ;NUMBER OF VERTICAL FILL CHARACTERS03 .REPT 4 ;OUTPUT 4 LF'S IN PLACE OF FF AND VT4 .BYTE CH.LF ;FOR SCOPESL15 .REPT NLFF ;INSERT VERTICAL FILL IF NECESSARY 6 .BYTE 07 .ENDR8 .ENDR09 .REPT 4 ;OUTPUT 4 LF'S IN PLACE OF FF AND VT: .BYTE CH.LF ;FOR SCOPESB; .ENDR <ASLF:: .BYTE CH.LF ;LINE FEED = .REPT NLFFP> .BYTE 0 ;FILLERS? .ENDR@;.A;HB .IF DF T$$ESCC*D; SYNTAX RULE TABLE FOR ESCAPE SEQUENCESE;B F .ENABL LSBPG9H .BYTE 'P,'P,40$-ESCST ;P - NEXT = 40$ (VT61 EXCEPTION)L9I .BYTE 'Y,'Y,30$-ESCST ;Y - NEXT = 30$ (VT61 EXCEPTION) GJESCST:: .BYTE '?,'?,40$-ESCST ;? - NEXT = 40$ (OLDER TERM. EXCEPTION) >K .BYTE 'O,'O,40$-ESCST ;O - NEXT = 40$ (ANSI SS3 INTRODUCER)3L .BYTE '[,'[,20$-ESCST ;[ - NEXT = 20$ (ANSI CSI)ODM10$: .BYTE 40,57,10$-ESCST ;INTERMEDIATE CHAR. - NEXT = SAME (10$))N .BYTE 60,176,0 ;FINAL CHARACTER - DONE.DO20$: .BYTE 40,77,20$-ESCST ;INTERMEDIATE CHAR. - NEXT = SAME (20$)*P .BYTE 100,176,0 ;FINAL CHARACTER - DONEBQ30$: .BYTE 40,176,40$-ESCST ;FIRST COORD. (BIAS 40) - NEXT = 40$R40$: .BYTE 60,71,20$-ESCST ;S .BYTE 40,176,0 ;ST U .DSABL LSB VW .ENDCXY; 3Z; TABLE OF HORIZONTAL FILL REQUIREMENT FOR LA30S.I5[; INDEX = CURRENT HORIZONTAL POSITION DIVIDED BY 8.N\;I"]; NUMBER OF FILL CHAR.S HOR.POS.^HORFT:: .BYTE 4. ;0-7.A_ .BYTE 8. ;8.-15.` .BYTE 6. ;16.-23.-a .BYTE 3. ;24.-31.,b .BYTE 0. ;32.-39.Ac .BYTE 2. ;40.-47.(d .BYTE 4. ;48.-55.0e .BYTE 6. ;56.-63.Ef .BYTE 8. ;64.-71.0g .BYTE 10. ;72. AND UP h; i;=jkl.IIF DF T$$ONI, .PSECT MAP6mn .IF DF D$$M11&R$$MPL&T$$ONIo%pYMC12:: .BLKW 1 ;POINTER TO $YMCTBRqr .ENDC ;D$$M11&R$$MPL&T$$ONIs,t .IF DF T$$GMC!T$$SMC!D$$M11!D$$Z11!D$$V11u0vSPHI == S.38.4 ;HIGHEST RECOGNIZED SPEED CODEwx .IF DF D$$H11y<z; TABLE OF RECEIVE AND TRANSMIT SPEED PARAMETERS FOR DH11.@{; THE TABLE IS INDEXED BY S.XXX-1, WHERE S.XXX IS THE SYMBOLIC3|; NAME FOR THE DESIRED SPEED (DEFINED BY TTSYM$).->}; EACH ENTRY IS A BYTE CONTAINING THE PARAMETER TO LOAD INTO0~; THE LINE PARAMETER REGISTER FOR SPEED S.XXX.@; IF S.XXX IS UNSUPPORTED, THE BYTE CONTAINS A NEGATIVE VALUE.;1SPDH:: .BYTE 0 ;S.0 .BYTE 1 ;S.50! .BYTE 2 ;S.751! .BYTE -1 ;S.100 - UNSUPPORTEDC .BYTE 3 ;S.110 .BYTE 4 ;S.134 .BYTE 5 ;S.150 .BYTE 6 ;S.200 .BYTE 7 ;S.300 .BYTE 10 ;S.600  .BYTE 11 ;S.1200 .BYTE 12 ;S.1800" .BYTE -1 ;S.2000 - UNSUPPORTED .BYTE 13 ;S.2400" .BYTE -1 ;S.3600 - UNSUP00||{ccccPORTED .BYTE 14 ;S.4800" .BYTE -1 ;S.7200 - UNSUPPORTED .BYTE 15 ;S.9600 .BYTE 16 ;S.EXTA .BYTE 17 ;S.EXTB" .BYTE -1 ;S.19.2 - UNSUPPORTED" .BYTE -1 ;S.38.4 - UNSUPPORTED .ENDC ;D$$H11 .IF DF D$$Z11<; TABLE OF RECEIVE AND TRANSMIT SPEED PARAMETERS FOR DZ11.;; THE TABLE FORMAT IS IDENTICAL TO THAT OF THE DH11 TABLE;; DESCRIBED ABOVE.;0%SPDZ:: .BYTE -1 ;S.0 - UNSUPPORTED. .BYTE 0 ;S.50 .BYTE 1 ;S.750! .BYTE -1 ;S.100 - UNSUPPORTEDD .BYTE 2 ;S.110 .BYTE 3 ;S.134 .BYTE 4 ;S.150! .BYTE -1 ;S.200 - UNSUPPORTED; .BYTE 5 ;S.300 .BYTE 6 ;S.600 .BYTE 7 ;S.1200T .BYTE 10 ;S.1800 .BYTE 11 ;S.2000 .BYTE 12 ;S.2400 .BYTE 13 ;S.3600 .BYTE 14 ;S.4800 .BYTE 15 ;S.7200 .BYTE 16 ;S.9600" .BYTE -1 ;S.EXTA - UNSUPPORTED" .BYTE -1 ;S.EXTB - UNSUPPORTED" .BYTE -1 ;S.19.2 - UNSUPPORTED" .BYTE -1 ;S.38.4 - UNSUPPORTED .ENDC ;D$$Z11 .IF DF D$$V11=; TABLE OF RECEIVE AND TRANSMIT SPEED PARAMETERS FOR DHV11.S;; THE TABLE FORMAT IS IDENTICAL TO THAT OF THE DH11 TABLE; DESCRIBED ABOVE.;E&SPDHV:: .BYTE -1 ;S.0 - UNSUPPORTED  .BYTE -1 ;S.50 - UNSUPPORTED .BYTE 1 ;S.75;! .BYTE -1 ;S.100 - UNSUPPORTEDY .BYTE 2 ;S.110 .BYTE 3 ;S.134 .BYTE 4 ;S.150! .BYTE -1 ;S.200 - UNSUPPORTED- .BYTE 5 ;S.300 .BYTE 6 ;S.600 .BYTE 7 ;S.1200  .BYTE 10 ;S.1800 .BYTE 11 ;S.2000 .BYTE 12 ;S.2400" .BYTE -1 ;S.3600 - UNSUPPORTED .BYTE 13 ;S.4800" .BYTE -1 ;S.7200 - UNSUPPORTED .BYTE 15 ;S.9600" .BYTE -1 ;S.EXTA - UNSUPPORTED" .BYTE -1 ;S.EXTB - UNSUPPORTED .BYTE 16 ;S.19.2" .BYTE -1 ;S.38.4 - UNSUPPORTED .ENDC ;D$$V11% .ENDC ;T$$GMC!T$$SMC!D$$M11!D$$Z11 .PSECT MAP5 .IF DF D$$M11!D$$ZMD!D$$VMD;EO; MATCH TABLES FOR AUTO-BAUD SPEED DETECT. EACH ENTRY CONSISTS OF TWO BYTES,.M; THE FIRST BYTE IS WHAT A CARRIAGE RETURN LOOKS LIKE WHEN WE ARE RECEIVINGOM; AT A KNOWN RATE AND THE CHARACTER WAS SENT AT THE BAUD SPEED SPECIFIED BY.L; THE SECOND RATE. THERE ARE TWO TABLES, ONE FOR DETECTING SPEEDS BETWEENN; 600 AND 9600 BAUD (WE SAMPLE AT 4800 BAUD), THE OTHER FOR DETECTING SPEEDS4; BETWEEN 50 AND 300 BAUD (WE SAMPLE AT 300 BAUD).;A=ABHIGH::.BYTE 200,S.600 ;CH.CR AT 600 BAUD ON DH11 AND DZ11 8 .BYTE 170,S.1200 ;CH.CR AT 1200 BAUD ON DH11 AND DZ118 .BYTE 214,S.1800 ;CH.CR AT 1800 BAUD ON DH11 AND DZ118 .BYTE 346,S.2400 ;CH.CR AT 2400 BAUD ON DH11 AND DZ11/ .BYTE 362,S.9600 ;CH.CR AT 9600 BAUD ON DH11I/ .BYTE 376,S.9600 ;CH.CR AT 9600 BAUD ON DZ11S" .BYTE 0 ;ZERO TABLE TERMINATOR;0;ABLOW:: .BYTE 340,S.50 ;CH.CR AT 50 BAUD ON DH11 AND DZ11T4 .BYTE 170,S.75 ;CH.CR AT 75 BAUD ON DH11 AND DZ116 .BYTE 214,S.110 ;CH.CR AT 110 BAUD ON DH11 AND DZ119 .BYTE 316,S.134 ;CH.CR AT 134.5 BAUD ON DH11 ; LK70607 .BYTE 306,S.134 ;CH.CR AT 134.5 BAUD ON DZ11 ;**-106 .BYTE 346,S.150 ;CH.CR AT 150 BAUD ON DH11 AND DZ11" .BYTE 0 ;ZERO TABLE TERMINATOR .ENDC ;D$$M11!D$$ZMD!D$$VMD .IF DF T$$GMC!T$$SMC!T$$CUP;N;S9; TABLES OF IMPLICIT CHARACTERISTICS PER TERMINAL TYPE. >; EACH TABLE IS INDEXED WITH TERMINAL TYPE (TC.XXX) MINUS 1.=; HIGHEST INDEX = TTPHI. EACH ENTRY IS A BYTE, WITH MEANINGT; DESCRIBED BELOW.;; TABLE BIT(-S) MEANINGT:; ------------------------------------------------------6; TTYP1 0-5 TO BE COPIED DIRECTLY INTO THE HIGH BYTE"; OF STATUS WORD 2 (U.TSTA+2).5; 6-7 CURSOR POSITIONING COMMAND TYPE (RANGE 0-3).M4; THIS VALUE IS USED AS INDEX INTO TABLE "CPOST"; (SEE BELOW). ; TTYP2 0-7 PAGE WIDTH.P ; TTYP3 0-6 PAGE LENGTH. ; 7 1 = SCOPE.I6 ; TTYP4 0-5 TO BE COPIED DIRECTLY INTO THE HIGH BYTE" ; OF STATUS WORD 4 (U.TSTA+6).;T; D; MACRO TO GENERATE AN ENTRY IN THE TABLES TTYP1, TTYP2 AMD TTYP3.;-;-R; NOTE: DEFAULT OF HSY IS A NO-OP. STATUS BITS MUST BE REARRANGED FOR IT TO WORK00|||tt tfDATA; E .MACRO TERM TYPE,WID,LEN,HHT=0,HFF=0,HFL=0,VFL=0,SCP=0,CUP=0,HSY=0E .PSECT TTYP1 .IIF NDF TTYP1 TTYP1==. .=TTYP1+TYPE-1S8 X=!!! .BYTE X!HFL! .IF DF T$$GMC!T$$SMC  .PSECT TTYP2D .IIF NDF TTYP2 TTYP2==. .=TTYP2+TYPE-1D  .BYTE WID  .PSECT TTYP3 ! .IIF NDF TTYP3 TTYP3==." .=TTYP3+TYPE-1 # .BYTE !LEN$ .ENDC% .PSECT MAP5 & .ENDM TERM.';U2(; MACRO TO GENERATE AN ENTRY IN THE TABLE TTYP4.); >* .MACRO ETERM TYPE,ANI=0,AVO=0,BLK=0,DEC=0,EDT=0,RGS=0,SFC=0+ .PSECT TTYP4, .IIF NDF TTYP4 TTYP4==.- .=TTYP4+TYPE-1E. X=!!!!< / X=X!!0 .BYTE X/4001 .PSECT MAP52 .ENDM ETERM3;T@3TTPHI == T.L2XX ;HIGHEST TERMINAL TYPE WITH IMPLICIT ;RDH0875 ;CHARACTERISTICS ;**-1Y6;C$7 TERM T.AS33 WID=72.,LEN=66.,HFL=1$8 TERM T.KS33 WID=72.,LEN=66.,HFL=1$9 TERM T.AS35 WID=72.,LEN=66.,HFL=1$: TERM T.L30S WID=80.,LEN=66.,HFL=7; TERM T.L30P WID=80.,LEN=66.< TERM T.LA36 WID=132.,LEN=66. 6= TERM T.VT05 WID=72.,LEN=20.,HHT=1,VFL=1,SCP=1,CUP=1*> TERM T.VT50 WID=80.,LEN=12.,HHT=1,SCP=10? TERM T.VT52 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=20@ TERM T.VT55 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=20A TERM T.VT61 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=2%B TERM T.L180 WID=132.,LEN=66.,HFF=16C TERM T.V100 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=1%D TERM T.L120 WID=132.,LEN=66.,HFF=15+E TERM T.LA12 WID=132.,LEN=66.,HHT=1,HFF=1.+F TERM T.L100 WID=132.,LEN=66.,HHT=1,HFF=1.%G TERM T.LA34 WID=132.,LEN=66.,HFF=1T%H TERM T.LA38 WID=132.,LEN=66.,HFF=1S6I TERM T.V101 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=16J TERM T.V102 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=16K TERM T.V105 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=16L TERM T.V125 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=16M TERM T.V131 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=16N TERM T.V132 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=1O*P TERM T.LA50 WID=80.,LEN=66.,HHT=1,HFF=1+Q TERM T.LQP1 WID=132.,LEN=66.,HHT=1,HFF=1=+R TERM T.LQP2 WID=132.,LEN=66.,HHT=1,HFF=16S TERM T.BMP1 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=16T TERM T.V2XX WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=1+U TERM T.LN03 WID=132.,LEN=66.,HHT=1,HFF=1 V TERM T.DTC1 WID=132.,LEN=66.1+W TERM T.L210 WID=132.,LEN=66.,HHT=1,HFF=1H+X TERM T.LQP3 WID=132.,LEN=66.,HHT=1,HFF=1.5X TERM T.LA75 WID=80.,LEN=66.,HHT=1,HFF=1 ;RDH073.5X TERM T.L2XX WID=80.,LEN=66.,HHT=1,HFF=1 ;RDH087D+Z ETERM T.V100 ANI=1,DEC=1,AVO=1 ;**-11[ ETERM T.V101 ANI=1,DEC=1T'\ ETERM T.V102 ANI=1,DEC=1,AVO=1,EDT=1] ETERM T.V105 ANI=1,DEC=1.'^ ETERM T.V125 ANI=1,DEC=1,AVO=1,RGS=1W-_ ETERM T.V131 ANI=1,DEC=1,AVO=1,EDT=1,BLK=1 -` ETERM T.V132 ANI=1,DEC=1,AVO=1,EDT=1,BLK=1.'a ETERM T.BMP1 ANI=1,DEC=1,AVO=1,EDT=1D-b ETERM T.V2XX ANI=1,DEC=1,AVO=1,EDT=1,SFC=11cd .ENDC ;T$$GMC!T$$SMC!T$$CUPef;8g .EVENh;1i;1@j; TABLE OF POINTERS TO DISPATCH TABLES IN CONTROLLER-DEPENDENT6k; MODULES. INDEX = CONTROLLER TYPE CODED AS FOLLOWS: l; 0 = DL-11, m; 2 = DZ-11M n; 4 = DH-11E o; 6 = DJ-11p; 10 = DM-11BB,#q; 12 = CT VIDEO CONTROL TASKVr; 14 = DHV-11s; 16 = LAT Port)s; 20 = USER PORT STUB ;SA452Vt;Du>u .IIF DF R$$CON CTBL:: .IRP X, ;SA452w ;**-1,?w .IIF NDF R$$CON CTBL:: .IRP X, ;SA452Vy ;**-1 z .IF IDN X,LH { .IF DF T$$LTH|6} .IIF NDF R$$CON .ERROR ;LAT Support requires R$$CONP~ .IIF NDF T$$GMC .IIF NDF T$$SMC .ERROR ;LAT Support requires T$$GMC or T$$SMC .WORD $LHTBL  .PSECT CTBL#$LHTBL:.WORD LHSTAX ;START OUTPUT  .WORD LHABOX ;ABORT OUTPUTA .WORD LHRESX ;RESUME OUTPUT .WORD LHSTOX ;STOP OUTPUT .WORD LHMTIM ;MODEM TIMER$ .WORD LHCPUP ;CONTROLLER POWER-UP .WORD LHUPUP ;UNIT POWER-UP" .WORD LHCONL ;CONTROLLER ONLINE# .WORD LHCOFF ;CONTROLLER OFFLINE. .WORD LHUONL ;UNIT ONLINE .WORD LHU00||{ccccOFF ;UNIT OFFLINE ( .WORD LHLPAR ;GET/SET LINE PARAMETERS .PSECT MAP5 .IFF ; L$$LTH  .WORD 0 .ENDC ; L$$LTHS  .ENDC ; IDN X,LH ;SA452 ;SA452 .IF IDN X,US ;SA452L .IF DF T$$USP ;SA452 ;SA452F .IIF NDF R$$CON .ERROR ;USER SUPPLIED PORTS REQUIRES R$$CON ;SA452 .WORD $USTBL ;SA452 .PSECT CTBL ;SA4520$USTBL: .WORD USSTAX ;START OUTPUT ;SA452) .WORD USABOX ;ABORT OUTPUT ;SA452 * .WORD USRESX ;RESUME OUTPUT ;SA452( .WORD USSTOX ;STOP OUTPUT ;SA452( .WORD USMTIM ;MODEM TIMER ;SA452/ .WORD USCPUP ;CONTROLLER POWER-UP ;SA4524* .WORD USUPUP ;UNIT POWER-UP ;SA452- .WORD USCONL ;CONTROLLER ONLINE ;SA452 . .WORD USCOFF ;CONTROLLER OFFLINE ;SA452( .WORD USUONL ;UNIT ONLINE ;SA452) .WORD USUOFF ;UNIT OFFLINE ;SA452L2 .WORD USLPAR ;GET/SET LINE PARAMETERS ;SA452 ;SA452 .PSECT MAP5 ;SA452 .IFF ; T$$USP ;SA452  .WORD 0 ;SA452D .ENDC ; T$$USP ;SA452  .ENDC ; IDN X,US ;SA452 ;SA452 .IF DIF X,LH ;SA452 .IF DIF X,US ;SA452 ;SA452 .IF DF D$$'X'11 ;**-1 .WORD $Y'X'TBL .PSECT CTBL'$Y'X'TBL:.WORD Y'X'STAX ;START OUTPUTU .WORD Y'X'ABOX ;ABORT OUTPUT  .WORD Y'X'RESX ;RESUME OUTPUT .WORD Y'X'STOX ;STOP OUTPUT .IF NDF R$$CON4 .WORD Y'X'PWUP ;POWER-UP  .IFTF ;NDF R$$CON .WORD Y'X'MTIM ;MODEM TIMER .IFF ;NDF R$$CONC& .WORD Y'X'CPUP ;CONTROLLER POWER-UP  .WORD Y'X'UPUP ;UNIT POWER-UP$ .WORD Y'X'CONL ;CONTROLLER ONLINE% .WORD Y'X'COFF ;CONTROLLER OFFLINE2 .WORD Y'X'UONL ;UNIT ONLINE .WORD Y'X'UOFF ;UNIT OFFLINET .ENDC ;NDF R$$CON% .IF DF T$$GMC!T$$SMC!D$$M11!D$$ZMDT* .WORD Y'X'LPAR ;GET/SET LINE PARAMETERS% .ENDC ;T$$GMC!T$$SMC!D$$M11!D$$ZMDR .PSECT MAP5 .IFF  .WORD 0 .ENDC  .ENDC ; DIF X,US ;SA452  .ENDC ; DIF X,LH ;SA452 ;SA452; ;**-1 .ENDR;;DB; TABLE OF POINTERS TO FORK LEVEL ROUTINES. THE ORDER OF ENTRIESC; IN THIS TABLE MUST MATCH THE BIT POSITIONS OF THE CORRESPONDING4; BITS IN THE FORK REQUEST BYTE U.TFRQ IN THE UCB.;+FRKTB:: .WORD FPIRD ;FR.IRD - INPUT DONE% .WORD FPORD ;FR.ORD - OUTPUT DONEE4 .WORD FPSUI ;FR.SUI - START OF UNSOLICITED INPUT .IF DF T$$CCA3 .WORD FPAST ;FR.AST - CHARACTER THAT CAUSES AST .ENDC ;T$$CCA .IF DF M$$PRO" .WORD FPTIM ;FR.TIM - TIME-OUT .ENDC ;M$$PRO .IF DF T$$SPC1 .WORD FPKIL ;FR.KIL - SEND KILL PACKET TO CLIU .ENDC ;T$$SPC .IF DF T$$OOB9 .WORD FPOOB ;FR.OOB - CHECK FOR OUT-OF-BAND CHARACTERC .ENDC ;T$$OOB .IF DF T$$ICS/ .WORD FPICS ;FR.ICS - SEND TSA EVENT PACKETD .ENDC ;T$$ICS .IF DF T$$SCA, .WORD FPSCA ;FR.SCA - SEND AST TO TSA... .ENDC ; T$$SCA.7 .WORD FPGRQ ;FR.GRQ - GET REQUEST PACKET FROM QUEUE .IF DF T$$LTH- .WORD FPLAT ;FR.LAT - LAT Port processingN .ENDC ; T$$LTH.1 .WORD FPPFP ;FR.PFP - POST-FORK PROCESSING OFA# ;CHARACTER IN U.TECB (U.TECO);D;O&; I/O FUNCTION CODE DISPATCH TABLES.J; VERIFY THAT THE TABLE MATCHES THE NUMERIC VALUES OF I/O FUNCTION CODES;F ASSUME IO.WLB/400,1 ASSUME IO.RLB/400,2 ASSUME IO.ATT/400,3 ASSUME IO.DET/400,4 ASSUME IO.GTS/400,5 ASSUME SF.SMC/400,5 ASSUME SF.GMC/400,5 ASSUME IO.HNG/400,6 .IF DF T$$RPR ASSUME IO.RPR/400,11  .ENDC ASSUME IO.RTT/400,12 .IF DF B$$MAP+ ASSUME IO.WSD/400,13 ;WRITE SPECIAL DATAI* ASSUME IO.RSD/400,14 ;READ SPECIAL DATA .ENDC ;B$$MAP ;SA464 .IF DF T$$LTH ;SA464 ;SA464$ ASSUME IO.ORG/400,33 ;SA464 ;SA464 .ENDC ;T$$LTH ;SA464 ;SA464 .IF DF T$$EIO, ASSUME IO.EIO/400,37 ;EXTENDED READ/W00|||tt tfDATARITE  .ENDC ;T$$EIO  ;A ; DISPATCH TABLE FOR PROCESSING DIFFERENT FUNCTION CODES BEFOREA' ; ENTERING A PACKET IN THE I/O QUEUE.P; QPDSP::O .IF DF R$$IIC .WORD QPKIL ;IO.KILR .ENDC ;R$$IIC .WORD QPWLB ;IO.WLB .WORD QPRLB ;IO.RLBF .WORD QPATT ;IO.ATT .WORD QPDET ;IO.DETS .IF DF T$$GTS!T$$GMC!T$$SMC# .WORD QPSPC ;SPECIAL FUNCTIONS:S ; IO.GTS ; SF.SMC  ; SF.GMC!" .IFF # $ .WORD 0%& .ENDC'( .WORD QPHNG ;IO.HNG1) .WORD 0 ;RESERVED EXEC CLOSE-OUT-LUN FUNCTION /* .WORD 0 ;RESERVED FOR USER MODE DIAGNOSTICST+, .IF DF T$$RPR-. .WORD QPRPR ;IO.RPR/0 .IFFQ1 2 .WORD 034 .ENDC56 .WORD QPRTT ;IO.RTTI78 .IF DF B$$MAP9: .WORD QPWSD ;IO.WSDI; .WORD QPRSD ;IO.RSDI<= .ENDC ;B$$MAP>> .IF DF T$$LTH ;SRC@ ;**-1NA .IF NDF B$$MAPOB C .BLKW 2DE .ENDC ;NDF B$$MAPFF ;SRC-F .BLKW --1 ;SRCF ;SRCF .WORD QPORG ;SRCF ;SRCF .ENDC ;T$$LTH ;SRCF ;SRCF .IF DF T$$EIO ;SRCF ;SRCF .IF NDF T$$LTH ;SRC.F ;SRCF .IF NDF B$$MAP ;SRC F ;SRCF .BLKW 2 ;SRCF ;SRCF .ENDC ;NDF B$$MAP ;SRC.F ;SRC+F .BLKW - ;SRCOF ;SRCF .ENDC ;NDF T$$LTH ;SRC F ;SRC-F .BLKW --1 ;SRC "H .WORD QPEIO ;IO.EIO ;**-1IJ .ENDC ;T$$EIOKLM;$N; @O; DISPATCH TABLE FOR PROCESSING DIFFERENT FUNCTION CODES AFTER1P; A PACKET HAS BEEN DEQUEUED FROM THE I/O QUEUE Q;SR .IF DF T$$OVLSFT; NOTE: THE ROUTINES THAT ARE IN TTEXT ARE REPRESENTED WITH THE HIGHU; BIT CLEAR.V)WPPDSP:: .WORD !100000 ;IO.WLB!100000 ;IO.RLB!Y .WORD &77777 ;IO.ATTL!Z .WORD &77777 ;IO.DET[\ .IF DF T$$SMC]!^ .WORD &77777 ;SF.SMC _` .IFF;a b .WORD 0b ;SRCb .ENDC ;SRCTb ;SRC+f .WORD &77777 ;IO.HNG ;**-3A$g .WORD 0 ;RESERVED EXEC FUNCTION#h .WORD 0 ;USER MODE DIAGNOSTICS ij .IF DF T$$RPRk!l .WORD !100000 ;IO.RPR mn .IFF o p .WORD 0qr .ENDCs!t .WORD !100000 ;IO.RTTLuv .IF DF B$$MAPw!x .WORD !100000 ;IO.WSD.!y .WORD !100000 ;IO.RSDz{ .ENDC ;B$$MAP{ ;SRC{ .IF DF T$$LTH ;SRC{ ;SRC{ .IF NDF B$$MAP ;SRC { ;SRC{ .BLKW 2 ;SRC{ ;SRC{ .ENDC ;NDF B$$MAP ;SRCV{ ;SRC-{ .BLKW --1 ;SRCF{ ;SRC,{ .WORD &77777 ;ORIGINATE ;SRC{ ;SRC{ .ENDC ;T$$LTH ;SRC{ ;SRC{ .IF DF T$$EIO ;SRC{ ;SRC{ .IF NDF T$$LTH ;SRCP{ ;SRC{ .IF NDF B$$MAP ;SRC { ;SRC{ .BLKW 2 ;SRC{ ;SRC{ .ENDC ;NDF B$$MAP ;SRC{ ;SRC+{ .BLKW - ;SRC.{ ;SRC{ .ENDC ;NDF T$$LTH ;SRC.{ ;SRC-{ .BLKW --1 ;SRC.{ ;SRC*{ .WORD !100000 ;IO.EIO ;SRC{ ;SRC{ .ENDC ;T$$EIO ;SRC{ ;SRC{ .IF DF T$$LTH ;SRC{ ;SRC,{ .WORD &77777 ;ORIGINATE ;SRC{ ;SRC{ .ENDC ;T$$LTH ;SRC|} .IF DF T$$EIO~ .IF NDF B$$MAPM  .BLKW 2 .ENDC ;NDF B$$MAP$ .BLKW --1! .WORD !100000 ;IO.EIO  .ENDC ;T$$EIO .IFF ;T$$OVLEPPDSP:: .WORD PPWLB ;IO.WLB .WORD PPRLB ;IO.RLB< .WORD PPATT ;IO.ATT  .WORD PPDET ;IO.DET .IF DF T$$SMC .WORD PPSPC ;SF.SMC. .IFF   .WORD 0 .ENDC .WORD PPHNG ;IO.HNGI00||{cccc# .WORD 0 ;RESERVED EXEC FUNCTION." .WORD 0 ;USER MODE DIAGNOSTICS .IF DF T$$RPR .WORD PPRPR ;IO.RPR .IFF;  .WORD 0 .ENDC .WORD PPRLB ;IO.RTTO .IF DF B$$MAP .WORD PPWSD ;IO.WSD .WORD PPRSD ;IO.RSD .ENDC ;B$$MAP .IF DF T$$LTH ;SRC ;SRC .IF NDF B$$MAP ;SRCE ;**-3$  .BLKW 2 .ENDC ;B$$MAP ;SRC ;SRC- .BLKW --1 ;SRC ;SRC# .WORD PPORG ;ORIGINATE ;SRCO ;SRC .ENDC ;T$$LTH ;SRC ;SRC .IF DF T$$EIO ;SRC ;SRC .IF NDF T$$LTH ;SRC ;SRC .IF NDF B$$MAP ;SRC ;SRC .BLKW 2 ;SRC ;SRC .ENDC ;NDF B$$MAP ;SRCS ;SRC+ .BLKW - ;SRCW ;SRC .ENDC ;T$$LTH ;SRC ;SRC- .BLKW --1 ;SRC  ;SRC" .WORD PPEIO ;IO.EIO ;**-3 .ENDC ;T$$EIO .ENDC ;T$$OVL;S; LH port dispatch table:S; .IF DF T$$LTH)LHDSP:: .WORD $LHSTS ; Start sessionS2 .WORD $LHINP ; Receive data from LAT process- .WORD $LHOUT ; Send data to LAT process.! .WORD $LHSTP ; Stop session . .WORD $LHGTD ; GET TRANSMIT DATA ;SA464. .WORD $LHTMO ; SOLICIT TIMED OUT ;SA464 .ENDC ;T$$LTH;S;2; DISPATCH TABLE FOR INPUT CHARACTER PROCESSING.7; THIS TABLE IS CONSULTED EACH TIME ECHO DONE OCCURS.NB; THE TABLE CONTAINS POINTERS TO ROUTINES IN THE MODULE "ICHAR".H; INDEX = INPUT LOGIC STATE VARIABLE (U.TISV IN UCBX) MULTIPLIED BY 2.;O,ISDSP:: .WORD CFGRQ ;NOTHING MORE TO ECHO .IF DF T$$CTRSV.CR1==<.-ISDSP>/2) .WORD I2CTR1 ;USED FOR CTRL-R ECHOING$) .WORD I2CTR2 ;USED FOR CTRL-R ECHOINGO .IF DF R$$MPL!A$$CLIO) .WORD I2CTR3 ;USED FOR CTRL-R ECHOINGI .ENDC) .WORD I2CTR4 ;USED FOR CTRL-R ECHOINGI) .WORD I2CTR5 ;USED FOR CTRL-R ECHOING .ENDCSV.CU1==<.-ISDSP>/2 ) .WORD I2CTU1 ;USED FOR CTRL-U ECHOINGO) .WORD I2CTU2 ;USED FOR CTRL-U ECHOINGI .IF DF R$$MPL!A$$CLIR) .WORD I2CTU3 ;USED FOR CTRL-U ECHOING$ .ENDC) .WORD I2CTU4 ;USED FOR CTRL-U ECHOINGC; ;N3; DISPATCH TABLE FOR OUTPUT CHARACTER PROCESSING.F; THIS TABLE IS CONSULTED EACH TIME AN OUTPUT CHARACTER IS EXPANDED.C; THE TABLE CONTAINS POINTERS TO ROUTINES IN THE MODULE "EXPCHR".D=; INDEX = BITS 8 AND 9 IN U.TSTA+2 IN UCBX MULTIPLIED BY 2.= ; (BIT COMBINATION 11 UNUSED).;R$OSDSP:: .WORD EXPC0 ;DEFAULT CASE% .WORD EXPC1 ;USED FOR WRAP-AROUND$% .WORD EXPC2 ;USED FOR WRAP-AROUNDD;C;  .IF NDF T$$ONI.; NOTE THIS DATA IS DUPLICATED IN TTATT !!!!; .IF DF T$$GMC!T$$SMCU;EB; TABLE OF CHARACTERISTIC CODES FOR GET MULTIPLE CHARACTERISTICSI; FUNCTION (SF.GMC) AND SET MULTIPLE CHARACTERISTICS FUNCTION (SF.SMC).L;P9; EACH RECOGNIZED CODE HAS A 1-WORD ENTRY IN THE TABLE.L, ; THIS WORD CONTAINS ONE OF THE FOLLOWING: ;* ; 1. IF THE WORD NOT = 0 AND BIT 15 = 0:= ; LOW BYTE = A BITMASK THAT MAPS THE DESIRED CHARACTERISTICP9 ; VALUE IN THE PROPER BYTE IN THE UCB. BITS ARE SET FORO"; RELEVANT BITS IN THE UCB BYTE.8; HIGH BYTE = OFFSET FROM START OF THE UCB TO THE BYTE-; THAT CONTAINS THE DESIRED CHARACTERISTIC.T;I; 2. IF BIT 15 = 1:C8; THE WORD IS THE ADDRESS OF A SUBROUTINE THAT HANDLES#; THIS PARTICULAR CHARACTERISTIC.W?; (ALL VIRTUAL ADDRESSES IN THE DRIVER ARE 120000 OR HIGHER).W;; 3. IF THE WHOLE WORD = 0:0>; THIS CHARACTERISTIC IS NOT RECOGNIZED BY SF.GMC OR SF.SMC.;A;S*; DEFINE MACRO TO GENERATE TABLE ENTRIES;T .MACRO MCGEN NAME,OFS,BMB .IF LE NAME-MCHI .=MCTAB+<2*>O  .IF NB BM! .IF LE BM-377" .BYTE BM,OFS # .IFFE$ .BYTE BM/400,OFS+1I% .ENDC& .IFF= ' .WORD OFS(00|||tt tfDATA .ENDC) .IFF !* .ERROR ;ILLEGAL CHARACTERISTICH+ .ENDC, .ENDM MCGEN-;6.MCHI == TC.MAX-1 ;HIGHEST RECOGNIZED CHARACTERISTIC/;)0MCTAB:: .REPT MCHI-1 .WORD 0 ;INITIALIZE WHOLE TABLE TO ZEROSN2 .ENDR,3 MCGEN TC.WID,U.CW4,377 ;NUMBER OF COLUMNS44 MCGEN TC.LPP,U.TLPP,377 ;NUMBER OF LINES PER PAGE56 .IF DF D$$H11!D$$Z11!D$$V117%8 MCGEN TC.RSP,MCRSP ;RECEIVE SPEED&9 MCGEN TC.XSP,MCXSP ;TRANSMIT SPEED6: MCGEN TC.PAR,MCPAR ;PARITY GENERATION AND CHECKING$; MCGEN TC.EPA,MCEPA ;PARITY SENSE8; MCGEN TC.CLN,MCCLN ;7-BIT CHARACTER LENGTH ; LK710<= .IF DF T$$MOD>$? MCGEN TC.ASP,MCASP ;ANSWER SPEED7@ MCGEN TC.ABD,U.TSTA+6,S4.ABD ;AUTO-BAUD SPEED DETECTTAB .ENDC ;T$$MODCD .ENDC ;D$$H11!D$$Z11!D$$V11E2F MCGEN TC.ISL,U.UNIT,377 ;SUB-LINE ON CONTROLLER%G MCGEN TC.TTP,MCTTP ;TERMINAL TYPE1#H MCGEN TC.SCP,U.CW2,U2.CRT ;SCOPE <I MCGEN TC.HFL,U.TSTA+6,S4.HFL ;HORIZONTAL FILL REQUIREMENT:J MCGEN TC.VFL,U.TSTA+6,S4.VFL ;VERTICAL FILL REQUIREMENT3K MCGEN TC.HFF,U.TSTA+6,S4.HFF ;HARDWARE FORM-FEEDR-L MCGEN TC.HHT,U.TSTA+6,S4.HHT ;HARDWARE TAB>M MCGEN TC.ACR,U.TSTA+4,S3.ACR ;AUTOMATIC CR-LF ON LONG LINES-N MCGEN TC.PPT,U.TSTA+4,S3.PPT ;PRINTER-PORT;5O MCGEN TC.SMR,U.CW2,U2.LWC ;LOWERCASE INPUT ENABLEDNPQ .IF DF T$$ESCR9S MCGEN TC.ESQ,U.CW2,U2.ESC ;ESCAPE SEQUENCES RECOGNIZEDTU .ENDC ;T$$ESCVW .IF DF T$$MODX$Y MCGEN TC.DLU,MCRMT ;DIAL-UP LINEZ[ .ENDC\.] MCGEN TC.HLD,U.CW2,U2.HLD ;HOLD-SCREEN MODE(^ MCGEN TC.NEC,U.TSTA+4,S3.NEC ;NO-ECHO-_ MCGEN TC.SLV,U.CW2,U2.SLV ;SLAVED TERMINALH1` MCGEN TC.PRI,U.CW2,U2.PRV ;PRIVILEGED TERMINALA,a MCGEN TC.FDX,U.TSTA+4,S3.FDX ;FULL DUPLEX=b MCGEN TC.PTH,U.TSTA+4,S3.PTH ;PASS-THROUGH MODE IS ENABLEDO%c MCGEN TC.BIN,MCBIN ;READ-PASS-ALL$@d MCGEN TC.8BC,U.TSTA+4,S3.8BC ;8 BIT CHARACTERS PASSED ON READ6e MCGEN TC.TBF,MCTBF ;TYPE-AHEAD BUFFER ACTIVE COUNT(f MCGEN TC.CTS,MCCTS ;CONTROL-S STATUS5g MCGEN TC.HSY,MCHSY ;HOST/TERMINAL SYNCHRONIZATIONE)h MCGEN TC.ANI,U.TSTA+6,S4.ANI ;ANSI CRT/i MCGEN TC.AVO,U.TSTA+6,S4.AVO ;ADVANCED VIDEO+j MCGEN TC.BLK,U.TSTA+6,S4.BLK ;BLOCK MODEA(k MCGEN TC.DEC,U.TSTA+6,S4.DEC ;DEC CRT*l MCGEN TC.EDT,U.TSTA+6,S4.EDT ;EDIT MODE&m MCGEN TC.RGS,U.TSTA+6,S4.RGS ;REGIS0n MCGEN TC.SFC,U.TSTA+6,S4.SFC ;SOFT CHARACTERSo;.p .IF DF R$$MPL!A$$CLISqr .IF DF C$$CTC7s MCGEN TC.TLC,U.TSTA+4,S3.CTC ;CONTROL-C NOTIFICATION.tu .ENDC ;C$$CTCv)w MCGEN TC.NBR,U.MUP,UM.NBR ;NOBROADCASTYxy .ENDC ;R$$MPL!A$$CLINz{ .IF DF T$$ACD|6} MCGEN TC.ACD,MCACD ;ANCILLARY CONTROL DRIVER (ACD)~ .ENDC ;T$$ACD .IF DF T$$SPL' MCGEN TC.RAT,MCTYP ;READ-AHEAD TYPEM- MCGEN TC.TBS,MCTBS ;TYPEAHEAD BUFFER SIZEN .IFF ;T$$SPLG0 MCGEN TC.RAT,U.TSTA+4,S3.TAB ;READ-AHEAD TYPE .ENDC ;T$$SPL .IF DF T$$SERA MCGEN TC.TBM,U.MUP,UM.SER ;TYPEAHEAD BUFFER MODE (TASK OR CLI). .ENDC ;T$$SER; .IF DF T$$OOB< MCGEN TC.OOB,MCOOB ;OUT-OF-BAND/HELLO/INCLUDE CHARACTERS .ENDC ;T$$OOB .IF DF T$$ICS2 MCGEN TC.ICS,MCICS ;NOTIFY OF CHANGE IN TABUF ;(INPUT COUNT STATE) .ENDC ;TT$ICS .IF DF T$$SCA1 MCGEN TC.SSC,MCSSC ;SPECIFY SWITCH CHARACTERS5 MCGEN TC.TMM,MCTMM ;EXIT TERMINAL MANAGEMENT MODEA .ENDC ;T$$SCA+ MCGEN TC.TSY,MCTSY ;OUTPUT FLOW CONTROL( .IF DF T$$MHU ;MODEM HANG-UP NOTIFY: MCGEN TC.MHU,MCMHU ;REQUEST MODEM HANG-UP NOTIFICATION .ENDC ;T$$MHU$ .IF DF T$$LTH&M$$NET ;SA464 ;SA464E MCGEN TC.QDP,MCQDP ;GET QUEUE DEPTH AND LAT CONNECT/DISCONN;SA464 4 MCGEN TC.MAP,MCMAP ;SET UP LAT MAPPING ;SA464 ;SA464$ .ENDC ;T$$LTH&M$$NET ;SA464 ;SA464" .=MCTAB+<2*MCHI> ;END OF TABLE;E;D .ENDC ;T$$GMC!T$$SMCN .ENDC ;NDF T$$ONI;T; .IF DF T$$MOD;E7; DISPATCH TABLE FOR MODEM INTERRUPT SERVICE ROUTINE.A6; INDEX = BITS 1 AND 2 IN U.STS (US.DSB AND US.CRW).00||{cccc;$7MDSP:: .WORD MODI4 ;ENABLED, NOT WAITING FOR CARRIERD2 .WORD MODI2 ;DISABLED, NOT WAITING FOR CARRIER- .WORD MODI5 ;ENABLED, WAITING FOR CARRIERS. .WORD MODI3 ;DISABLED, WAITING FOR CARRIER .ENDC ;T$$MOD; ;4; MISCELLANEOUS WORDS ;  .IF DF D$$V11!D$$H11.4YVXOFF::.WORD CH.CTS!100000 ;XOFF FOR DHU/DHV11/DH3YVXON:: .WORD CH.CTQ!100000 ;XON FOR DHU/DHV11/DHF .ENDC ;D$$V11!D$$H11U .IF NDF T$$SPLS3$DALED::.BLKW 1 ;SAVED DRIVER MAPPING FOR KISAR6O .ENDC ;NDF T$$SPL .IF DF T$$OVL .PSECT MAP6>EXTMAP:: .BLKW 1 ;APR5 MAPPING OF TTDRV EXTENSION (OVERLAY)/ROTMAP:: .BLKW 1 ;APR5 MAPPING OF TTDRV ROOTC:TTEXT: .RAD50 /TTEXT / ;NAME OF COMMON TO MAP AS OVERLAY .PSECT MAP5 .ENDC ;T$$OVL(FREEB:: .WORD 0 ;FREE BUFFER LISTHEAD4DCB0:: .BLKW 1 ;POINTER TO DCB FOR FIRST TERMINAL' ;SET UP BY INITIALIZATION ROUTINEU0OPTIMR::.WORD OPTIME ;OUTPUT TIMEOUT INTERVAL; ;R .IF DF D$$H11!D$$V11. .IF DF M$$EXTA; SAVED SETTINGS FOR UMR(S) TO MAP DRIVER WITH 18-BIT ADDRESSESP!; IDENTICAL TO 16 BIT ADDRESSES;PUMR5S:: .BLKW 2 ;UMR 5F .IF NDF T$$SPL. .BLKW 2 ;UMR 6 .ENDC ;NDF T$$SPL .IFF ;M$$EXT .IF DF D$$H11H; RELOCATION CONSTANT TO TRANSFORM A VIRTUAL ADDRESS WITHIN THE DRIVERC; TO A PHYSICAL ADDRESS. THIS RELOCATION IS REQUIRED ONLY FOR DMARG; CONTROLLERS (SUCH AS THE DH-11), AND ONLY IF EXTENDED MEMORY IS NOT1F; PRESENT. THE FORMAT OF THE DOUBLE-WORD RELOCATION CONSTANT IS SUCHI; THAT WHEN IT IS ADDED TO A VIRTUAL ADDRESS IN THE RANGE 120000-157777C; (CARRY IS ADDED TO BIT 4 OF THE HIGH ORDER WORD), THE RESULT ISRC; THE 18-BIT PHYSICAL ADDRESS (2 HIGH BITS IN BITS 4-5 OF RELC+0,H; 16 LOW BITS IN RELC+2).N;TI; THE RELOCATION CONSTANT IS CALCULATED AND STORED HERE BY THE POWER-UPI ; CODE.N;EJ; IF EXTENDED MEMORY IS PRESENT, THE POWER-UP CODE HAS MAPPED THE DRIVERC; IN UMR'S 5 AND 6, WHICH MEANS THAT DRIVER VIRTUAL ADDRESSES ARET(; IDENTICAL WITH THE 18-BIT ADDRESSES.; RELC:: .BLKW 2 .ENDC ;D$$H11  .ENDC ;M$$EXT   .ENDC ;D$$H11!D$$V11O   .IF DF D$$V11N; DHV11 RELOCATION CONSTANT TO TRANSFORM A VIRTUAL ADDRESS WITHIN THE DRIVERM; TO A PHYSICAL ADDRESS. THE FORMAT OF THE DOUBLE-WORD RELOCATION CONSTANTDQ; IS SUCH THAT WHEN IT IS ADDED TO A VIRTUAL ADDRESS IN THE RANGE 120000-157777W5; THE RESULT IS THE 18-BIT/22-BIT PHYSICAL ADDRESS. ; RELCV:: .BLKW 2I .IF DF K$$DAS8 .BLKW 2 ;ANOTHER CONSTANT TO MAP D-SPACE POOL REGION .ENDC ;K$$DAS .ENDC ;D$$V11 .IF DF T$$CUPH ; TABLE OF POINTERS TO ROUTINES TO EXPAND A CURSOR POSITIONING COMMAND>!; INTO A CHARACTER STRING APPROPRIATE FOR THE TERMINAL TYPE.I"; INDEX INTO THIS TABLE = 2*X-2, WHERE X = THE VALUE IN BITS 6-7 OF THEE4#; TABLE "TTYP1" (SEE ABOVE) FOR THE TERMINAL TYPE.$;7&%CPOST:: .WORD CPOS1 ;1 - VT05 STYLE& .WORD CPOS2 ;2 - VT52 STYLE: ' .WORD CPOS3 ;3 - VT100 STYLE(;);WJ*; NOTE - THE LOCATIONS EXPCP, CP0, CP1, CP2 AND CP3 BELOW ARE READ/WRITE+; LOCATIONS!B,; THIS IS SAFE SINCE THEY ARE ONLY USED BY THE SYSTEM STATE CODE5-; IN MODULE "TTRW" - NEVER BY INTERRUPT LEVEL CODE.S.; E/; POINTER TO ROUTINE TO EXPAND 1 CHARACTER ON OUTPUT, OR TO ROUTINEW,0; THAT EXPANDS CURSOR POSITIONING COMMAND.1;T2EXPCP:: .WORD EXPC3H3;M94; TERMINAL-DEPENDENT CURSOR POSITIONING COMMAND STRINGS5;D46; TYPE 2 - VT52. MUST BE LOCATED ON WORD BOUNDARY!7;!8CP2:: .BYTE CH.ESC,'H,CH.ESC,'JS9 .BYTE CH.ESC,'Y,0,0:; ;; TYPE 1 - VT05E<; 5=CP1:: .BYTE 35,0,0,0,0 ;4 FILLERS AFTER HOME CURSORY1> .BYTE 37,0,0,0,0 ;4 FILLERS AFTER ERASE-TO-EOSR5? .BYTE 16,0,0,0,0,0,0 ;4 FILLERS AFTER Y-COORDINATEE@;XA; TYPE 3 - VT100B;TCCP3:: .BYTE CH.ESC,'[,'2,'JN!D .BYTE CH.ESC,'[,0,0,0,';,0,0,0TECP3A:: .BYTE 'HXF .EVENGH .ENDC ;T$$CUPIJ .IF DF D$$M11&R00|||tt tfDATA$$MPL&T$$COMK%LYMCP1:: .BLKW 1 ;POINTER TO $YMCTBDMN .ENDC ;D$$M11&R$$MPL&T$$COMOP .IF NDF R$$MPLSQRS;."T;TABLE OF POINTERS TO UCB TABLESU; VTTUCB:: .IRP X,W .IF DF D$$'X'11X .WORD D'X'UCBY .IFFF Z .WORD 0[ .ENDC\ .ENDR]^;,_; DL-11 DATABASESA`;Yab .IF DF D$$L11c0dDLUCB:: ;DL UCB POINTER TABLE POINTER TABLEeN=0Yf .REPT D$$L110g .WORD DLUC0+NhN=N+4'i .ENDR)jDLUC0: .BLKW D$$L11*2 ;DL UCB/CSR TABLEMkl .ENDC ; DF D$$L11mn;Ko; DH-11 DATABASESTp;q .IF DF D$$H11r-sDMUCB:: ;POINT DM11-BB UCB'S TO DH UCB'S.0tDHUCB:: ;DH UCB POINTER TABLE POINTER TABLEuN=0Pv .REPT D$$H11>wx .IF DF D$$M11y-z .WORD DHUC0+N+2 ;POINTER TO DH11 UCB TABLE {N=N+38.|} .IFF1~, .WORD DHUC0+N ;POINTER TO DH11 UCB TABLE N=N+36.L .IFTF .ENDRDHUC0: ;DH UCB TABLES .REPT D$$H11 .IFT.  .BLKW 1 ;DM11-BB CSR ADDRESS .ENDC .BLKW 1 ;DH11 CSR ADDRESS  .REPT 16.4 .WORD 0 ;ADDR OF UCB FOR LINE (PLUGGED AT TTPWF) .ENDR .WORD -1 ;END OF UCB LIST; .ENDR .ENDC ; DF D$$H11;; DZ-11 DATABASES;D .IF DF D$$Z110DZUCB:: ;DZ UCB POINTER TABLE POINTER TABLEN=0F .REPT D$$Z11D8 .WORD DZUC0+N ;POINTER TO DZ11 UCB TABLE (INDEXED BY ; CONTROLLER NUMBER) N=N+20.A .ENDRDZUC0: ;REF LABEL .REPT D$$Z11- .BLKW 1 ;DZ CSR ADDRESS  .REPT 8.1& .WORD 0 ;UCB ADDRESS FOR EACH LINE .ENDR .WORD -1 ;END OF UCB LIST  .ENDR .ENDC ; DF D$$Z11;S; DJ-11 DATABASES.;; .IF DF D$$J110DJUCB:: ;DJ UCB POINTER TABLE POINTER TABLEN=0: .REPT D$$J11T, .WORD DJUC0+N ;POINTER TO DJ11 UCB TABLE N=N+36.D .ENDRDJUC0: ;REF LABEL .REPT D$$J11O .BLKW 1 ;DJ CSR ADDRESS  .REPT 16." .WORD 0 ;ADDRESS OF LINE'S UCB .ENDR .WORD -1 ;END OF UCB LIST .ENDR .ENDC ; DF D$$J11; ; DHV-11 DATABASES;  .IF DF D$$V11DVUCB:: ;REF LABELZN=0 .REPT D$$V11A- .WORD DVUC0+N ;POINTER TO DHV11 UCB TABLEC N=N+36.U .ENDRDVUC0: ;REF LABEL .REPT D$$V11T .BLKW 1 ;DHV CSR ADDRESS  .REPT 16.& .WORD 0 ;UCB ADDRESS FOR EACH LINE .ENDR .WORD -1 ;END OF UCB LISTL .ENDR .ENDC ; DF D$$V11 .ENDC ;NDF R$$MPL.PAGEB .IF DF B$$MAP;F$; CT VIDEO TASK INTERFACE DATABASE;J(TFWPAR::.RAD50 /TFWCOM/ ;TFWCOM'S NAME,VT.NAM::.RAD50 /TFW.../ ;VIDEO TASK'S NAME/DTYPE:: .BLKW 1 ;TEMPORARY DATA TYPE STORAGEI:CTEX:: .RAD50 /C$CTEX/ ;TASK NAME OF THE CTEX DISPATCHER)IDOFLG::.WORD 0 ;FLAG FOR INTERRUPT-DOL(STIMER::.WORD 1 ;SCREEN TIMER COUNTER;UL; THIS IS THE TABLE OF ADDRESSES FOR THE SPECIAL DATA "TYPEAHEAD" BUFFERS.;M; BECAUSE OF THE WAY THAT THIS IS BEING DONE THERE CAN ONLY BE ONE TERMINALI; THAT SUPPORTS IO.RSD. FOR THE PRO ENVIRONMENT THIS IS NOT A PROBLEM.F; @T.RSDT::.WORD 0 ;THIS IS NOT A SUPPORTED DATA TYPE FOR IO.RSD& .WORD GIDIS ;BUFFER FOR GIDIS DATA>T.RSDN==<<.-T.RSDT>/2>-1 ;HIGHEST LEGAL DATA TYPE FOR IO.RSD;W#; TYPEAHEAD BUFFER FOR GIDIS DATAM;W$GIDIS: .BYTE 0 ;INSERTION POINTER .BYTE 0 ;RETRIEVAL POINTER .BYTE 0 ;ACTIVE COUNTA  .BYTE T$$BFL-4 ;BUFFER LENGTH  .BLKB T$$BFL-4 ;DATAE J ; THIS PSECT IS USED TO FORCE ALIGNMENT OF TFWCOM ON A 32 WORD BOUNDARY.G ; IT WILL COLLATE BEFORE $$$$$$ AND ITS SIZE IS SET IN THE BUILD FILEI  .PSECT $$$$$A6; THIS PSECT IS USED TO DEFINE THE LENGTH OF TFWCOM. ; IT WILL COLLATE AFTER $$$$$$ .PSECT $$$$$.%TFWEND == . ;ADDRESS END OF TFWCOMD .ENDC ;B$$MAP .PSECT $$$$$$,OVR .IF DF B$$MAP-TFWCOM:: ;THIS IS THE START OF THE TFWCOM.$ ;A PARTITION WILL OVERMAP THIS' ;SECTION OF DATA. THAT PARTITIONS,  ;IS USED BY TFW.00}|{cccc.. TO GET AT THIS DATA!9"VT.ADR::.WORD TFWCOM ;THE VIRTUAL ADDRESS OF THE START (# ;OF TFWCOM FROM THE DRIVER'S POINT$ ;OF VIEW2%VT.APR::.BLKW 1 ;THE PHYSICAL ADDRESS OF TFWCOMN&VT.LEN::.WORD </64.> ;LENGTH OF THE COMMON IN 32. WORD BLOCKS,'VT.TCB::.BLKW 1 ;VIDEO TASK'S TCB ADDRESS,(T.FLAG::.WORD 0 ;FLAG WORD FOR VIDEO TASK)*;H+; FLAG WORD BIT DEFINITIONS,; -.TF.INT == 1 ;INIT VIDEO TASK $/TF.ABO == 2 ;ABORT CURRENT OUTPUT&0TF.SPN == 4 ;SUSPEND CURRENT OUTPUT1TF.BTM == 10 ;BLINK TIMEOUT2TF.CTM == 20 ;CURSOR TIMEOUT %3TF.STM == 40 ;SCREEN BLANK TIMEOUTI.4TF.PRT == 400 ;PRINT SCREEN FLAG FOR TFW...15TF.SON == 1000 ;TURN SCREEN ON FLAG FOR TFW...W6'7CT$TIC == 1 ;TICK COUNT FOR CT TIMERL@8I$MAX == T$$BFL-4 ;MAXIMUM NUMBER OF CHARS IN THE INPUT BUFFER9:;G=;; INTERNAL BUFFER FORMAT - ALSO USED FOR TFW OUTPUT BUFFERS<;='>OB.LNK == 0 ;LINK TO THE NEXT BUFFERO ?OB.LEN == 2 ;DATA LENGTH (=N)>@OB.TYP == 3 ;DATA TYPE (SEE THE DATA PATH SPECIFIER VALUES)AOB.DAT == 4 ;DATA (N BYTES)BC;F"D; INPUT BUFFER FORMAT (FROM TFW)E;PF>GIB.TYP == 0 ;DATA TYPE (SEE THE DATA PATH SPECIFIER VALUES) HIB.LEN == 1 ;DATA LENGTH (=N))IIB.SPI == 2 ;TYPE SPECIFIC INFORMATIONAJIB.DAT == 4 ;DATA (N BYTES)KL; M; MORE INTERFACE DATA FOR TFWNN;LOPT.BTMR::.WORD 0 ;BLINK TIMERT QT.CTMR::.WORD 0 ;CURSOR TIMER&RT.STMR::.WORD 0 ;SCREEN BLANK TIMER&ST.OPKP::.WORD 0 ;OUTPUT BUFFER LIST.TT.OREM::.WORD 0 ;COUNT OF OUTPUT CHARACTERSBUT.OPKC::.WORD 0 ;COUNT OF BYTES PROCESSED IN CURRENT OUTPUT PKTVW;)X; INPUT BUFFER (FROM TFW)AY;PZ"[T.INBF::.BYTE 0 ;DATA STREAM ID\ .BYTE 0 ;DATA COUNTT&] .WORD 0 ;TYPE SPECIFIC INFORMATION&^ .BLKW I$MAX/2 ;THEN COMES THE DATA_`;(a; INTERMEDIATE INPUT AND OUTPUT BUFFERb;c; BYTE CONTENTSI/d; ------------------------------------:Be; 0-1 LINK TO NEXT BUFFER (0 IF THIS IS LAST)0f; 2 LOGICAL BUFFER LENGTH$g; 3 DATA TYPEh; 4-47 DATAi;Ej; THE FOLLOWING BUFFER IS USED WHEN THE OUTPUT BUFFER IS NOT IN THE Ek; NORMAL BUFFER CHAIN FORMAT. THIS OCCURS WHEN ECHOING IS DONE AND@l; WHEN THE TERMINAL DRIVER PUTS SOMETHING SPECIAL OUT, SUCH ASm; PROMPT STRINGS.Rn;o4pT.TBUF::.WORD 0 ;ZERO LINK WORD - ONLY ONE BUFFERq .BLKB 1 ;BUFFER LENGTHr .BYTE 0 ;DATA TYPE 0 = TEXT s .BLKB T$$BFL-4 ;DATA)tu; Av; DEFINE OFFSETS FOR THE LOCATIONS IN TFWCOM FOR THE VIDEO TASK w; x;yVT$ADR == VT.ADR-TFWCOM ;THE VIRTUAL ADDRESS OF THE STARTU(z ;OF TFWCOM FROM THE DRIVER'S POINT{ ;OF VIEW9|VT$APR == VT.APR-TFWCOM ;THE PHYSICAL ADDRESS OF TFWCOM B}VT$LEN == VT.LEN-TFWCOM ;LENGTH OF THE COMMON IN 32. WORD BLOCKS3~T$FTCB == VT.TCB-TFWCOM ;VIDEO TASK'S TCB ADDRESS 3T$FLAG == T.FLAG-TFWCOM ;FLAG WORD FOR VIDEO TASKE&T$BTMR == T.BTMR-TFWCOM ;BLINK TIMER'T$CTMR == T.CTMR-TFWCOM ;CURSOR TIMER-T$STMR == T.STMR-TFWCOM ;SCREEN BLANK TIMERR-T$OPKP == T.OPKP-TFWCOM ;OUTPUT BUFFER LISTT5T$OREM == T.OREM-TFWCOM ;COUNT OF OUTPUT CHARACTERSCIT$OPKC == T.OPKC-TFWCOM ;COUNT OF BYTES PROCESSED IN CURRENT OUTPUT PKTP0T$INBF == T.INBF-TFWCOM ;CIRCULAR INPUT BUFFER .ENDC ;B$$MAP.PAGER;+"; DRIVER INITIALIZATION ROUTINE.;'5; THIS CODE IS EXECUTED ONCE ONLY AT THE FIRST CALLR+; TO THE DRIVER AFTER IT HAS BEEN LOADED.K%; IT SERVES THE FOLLOWING PURPOSES:O4; 1. ESTABLISH THE MAPPING OF THE DRIVER DATA AREA<; AND SAVE THE APR VALUES IN SAVE LOCATIONS SO THEY CAN7; BE QUICKLY LOADED WHENEVER THE DRIVER IS CALLED. ;; 2. SAVE KINAR5 IN THE TT-DRIVER FORK BLOCK (FORK BLOCKSP#; IF MULTI-PROCESSOR SYSTEM). 8; 3. CALCULATE AND SAVE UMR'S 5 AND 6 VALUES (IF DH-11&; AND EXTENDED MEMORY SUPPORTED).?; 4. CALCULATE AND SAVE A CONSTANT USED TO TRANSFORM A DRIVERE<; VIRTUAL ADDRESS INTO A PHYSICAL ADDRESS (IF DH-11 BUT&00 }||tt tfDATA; NOT EXTENDED MEMORY SUPPORTED).6; 5. INITIALIZE AND QUEUE THE TT-DRIVER CLOCK BLOCK.8; 6. SAVE A POINTER TO THE FIRST TT DCB IN THE SYSTEM.G; 7. CONSTRUCT THE LIST OF FREE BUFFERS IN THE TT-DRIVER BUFFER POOL.K;KA; IN A SYSTEM THAT SUPPORTS SEPARATE KERNEL DATA SPACE MAPPING,A4; THIS MODULE RESIDES IN THE COMMON BLOCK "TTCOM".;; WHEN "INIT" IS CALLED IN SUCH A SYSTEM, THE MAPPING IS:S#; INSTR. SPACE APR 5: DRIVER CODE >; INSTR. SPACE APR 6: DRIVER DATA AND INITIALIZATION ROUTINE; (FIRST 4 KW OF TTCOM)!; DATA SPACE APR 5: DRIVER CODE ; DATA SPACE APR 6: UNDEFINEDVF; ON RETURN FROM "INIT", THE MAPPING IS THE "NORMAL" DRIVER MAPPING, ; WHICH IS:R+; INSTR. SPACE APR 5: DRIVER CODE (TTDRV)N+; DATA SPACE APR 5-6: DRIVER DATA (TTCOM)S;MI; IN A SYSTEM THAT DOES NOT SUPPORT SEPARATE KERNEL DATA SPACE MAPPING,NI; THIS MODULE RESIDES TOGETHER WITH ALL OTHER CODE AND DATA IN "TTDRV".RC; THE COMMON BLOCK "TTCOM" DOES NOT EXIST. IN SUCH A SYSTEM, WHENU%; "INIT" IS CALLED, THE MAPPING IS: ,; INSTR. AND DATA SPACE APR 5: DRIVER CODED; ON RETURN, THE MAPPING IS THE "NORMAL" DRIVER MAPPING, WHICH IS:6; INSTR. SPACE APR 5-6: DRIVER CODE AND DATA (TTDRV); J; FROM THE DESCRIPTION ABOVE, IT FOLLOWS THAT THE INITIALIZATION ROUTINEH; MAY BE MAPPED EITHER IN APR 5 (NON-D-SPACE SYSTEM) OR APR 6 (D-SPACEM; SYSTEM) WHEN CALLED. IT MUST THEREFORE BE WRITTEN IN POSITION-INDEPENDENT ; CODE (PIC).";-; ;X2TTPOOL::.BLKW 1 ;START OF DRIVER'S PRIVATE POOL;NB; NOTE - THE ROUTINE BELOW MUST FIT INTO ONE FIXED LENGTH BUFFER9; (LENGTH = T$$BFL BYTES), OR IT WILL OVERWRITE ITSELF. F; NOTE ALSO THAT THE ROUTINE MUST MAP ITSELF IN BOTH I- AND D-SPACE.;P ; INPUT:; R0 START OF DRIVER POOLA4; R1 POINTER T$$BFL BYTES BELOW END OF DRIVER POOL;E3CPOOL: MOV R0,R2 ;COPY POINTER TO CURRENT BUFFERI' ADD #T$$BFL,R0 ;POINT TO NEXT BUFFERN MOV R0,@R2 ;LINK NEW TO OLD-- CMP R0,#160000-T$$BFL ;WITHIN 4K BOUNDARY?D BHIS 10$ ;N - STOP HERE CMP R0,R1 ;END OF POOL?S BLO CPOOL ;N - LOOPT110$: CLR @R2 ;Y - CLEAR POINTER IN LAST BUFFERV RETURN ;ALL DONEO$ .IIF GT .-, .ERROR; ;IINIT:: .IF DF R$$PRO. MOV #60,R0 ;MOVE THE DL INTERRUPT VECTORS, MOV #220,R1 ;TO THE PRINTER PORT VECTOR3 MOV (R0)+,(R1)+ ;LOCATIONS. THIS IS BEING DONED: MOV (R0)+,(R1)+ ;BECAUSE THE PRINTER PORT IS NOW USED.1 MOV (R0)+,(R1)+ ;THE DL VECTOR IS USED ON THEA! MOV (R0),(R1) ;BRIDGE SYSTEM. .ENDC ;R$$PRO, MOV @#KINAR5,R0 ;GET START OF DRIVER CODE .IF DF M$$PRO& MOV #M$$PRO,R2 ;GET NUMBER OF CPU'S2 MOV #$TTFB+10,R1 ;GET POINTER TO KINAR6 WORD IN ;FORK BLOCK FOR CPU 0-20$: MOV R0,@R1 ;SAVE KINAR5 IN FORK BLOCK* ADD #TT$UQL,R1 ;POINT TO NEXT UCB QUEUE SOB R2,20$ ;LOOP .IFF ;M$$PROI/ MOV R0,@#$TTFB+10 ;SAVE KINAR5 IN FORK BLOCKR .ENDC ;M$$PRO .IF DF T$$COM- MOV @#$TTCOM,-(SP) ;SAVE TTCOM PCB ADDRESSY4 CLR @#$TTCOM ;INDICATE DRIVER INITIALIZATION DONE .IF DF D$$M11) MOV @#YMCTBP,R1 ;GET POINTER TO $YMCTB  .IFTF ;D$$M11, MOV @#KINAR6,R0 ;GET START OF DRIVER DATA .IF DF T$$SPL6 MOV R0,@#KDSAR6 ;MAP TTCOM THROUGH DATA SPACE APR 6  MOV R0,@#$DALED ;SAVE MAPPING .IFF ;T$$SPL  MOV R0,@#PAR5S ;SAVE A COPY# MOV R0,@#KDSAR5 ;MAP DRIVER DATAR .ENDC ;T$$SPL1  MOV @#KINAR5,@#PAR6I ;GET START OF DRIVER CODEP5  ADD #200,@#PAR6I ;COMPUTE AND SAVE HIGH 4K MAPPINGR   .IFT ;D$$M11O ) MOV R1,@#YMCP1 ;SAVE POINTER TO $YMCTB1 .ENDC ;D$$M11 .ENDC ;T$$COM- MOV R0,R1 ;COPY REAL START OF DRIVER DATAA .IF NDF T$$SPL0 ADD #200,R0 ;ADD THE EQUIVALENT OF 4 K WORDS& MOV R0,@#KISAR6 ;MAP REST OF DRIVER& MOV R0,@#$DALED ;SAVE DRIVER KISAR6 .IF DF D$$M11&R$$MPL&T$$ONI5 MOV YMCTBP,YMC12 ;MOVE A COPY TO APR6 FOR OVERLAYR  .ENDC ;D$$M11&R$$MP00}|{ccccL&T$$ONI!"# .ENDC ;NDF T$$SPL$%& .IF DF T$$OVL'6( MOV KINAR5,ROTMAP ;SET UP POINTER TO MAIN APR5 CODE)) MOV #TTEXT,R3 ;POINT TO RAD50 OF TTEXTN)* CALL $SRNAM ;GET ADDRESS OF PARTITIONA+ BCC 25$ ;CC - GOT IT!, CRASH ;NO GOOD IF NOT LOADED06-25$: MOV P.REL(R2),EXTMAP ;SET UP POINTER TO OVERLAY./ .IF NDF T$$SPLM0!1 MOV KISAR5,-(SP) ;SAVE MAPPING)2 MOV P.REL(R2),KISAR5 ;MAP TO EXTENSIONY13 MOV KISAR6,@#120000 ;SAVE MAPPING TO APR6 CODE$4 MOV (SP)+,KISAR5 ;RESTORE MAPPING56 .ENDC ;NDF T$$SPL78 .ENDC ;T$$OVL9: .IF DF D$$H11!D$$V11E;<;T;=; CALCULATE MAPPING INFORMATION NECESSARY FOR DMA DEVICESX>;?@ .IF DF D$$V11AB;APC; CALCULATE AND SAVE THE DOUBLE-WORD RELOCATION CONSTANT TO TRANSFORM A DRIVERJD; VIRTUAL ADDRESS INTO AN 18-BIT/22-BIT ADDRESS FOR THE DHV11. A SECONDNE; RELOCATION CONSTANT IS NECESSARY FOR I/D-SPACE SYSTEMS SINCE BUFFERS WHICHOF; ARE IN PRIMARY POOL DON'T HAVE A VIRTUAL ADDRESS WHICH MATCHES THE PHYSICALPG; ADDRESS IN THOSE SYSTEMS.H;IJ .IF DF M$$EXT!D$$H11 K3L MOV R1,-(SP) ;SAVE START APR BIAS OF DRIVER DATAOMN .IFTF ;M$$EXT!D$$H11OP .IF DF R$$EISQ&R CLR R0 ;PREPARE FOR COMBINED SHIFT'S ASHC #6,R0 ;GET PHYS. START ADDRESSRTU .IFF ;R$$EISAV0W SWAB R1 ;USE NON-EIS EMULATION OF ASHC #6,R0X MOVB R1,R0 ;Y BIC #377,R1 ;S Z ROR R0 ; [ ROR R1 ; \ ROR R0 ; ] ROR R1 ;^_ .ENDC ;R$$EIS`a .IF DF K$$DASb6c SUB #140000,R1 ;SUBTRACT TTCOM BASE VIRTUAL ADDRESSde .IFF ;K$$DAS.f7g SUB #120000,R1 ;SUBTRACT DRIVER BASE VIRTUAL ADDRESSShi .IFTF ;K$$DASjk SBC R0 ;TAKE CARE OF CARRY8l BIC #^C<77>,R0 ;MAKE SURE ONLY 6 BITS MAXIMUM ARE SET%m MOV R0,@#RELCV ;SAVE HIGH 2/6 BITS<n MOV R1,@#RELCV+2 ;SAVE LOW 16 BITS OF RELOCATION CONSTANTop .IFT ;K$$DAS qBr MOV @#KDSAR1,R1 ;GET START APR BIAS OF POOL IN I/D-SPACE SYSTEM&s CLR R0 ;PREPARE FOR COMBINED SHIFT>t ASHC #6,R0 ;GET PHYS. START ADDRESS (I/D SYS REQUIRES EIS)4u SUB #20000,R1 ;SUBTRACT POOL BASE VIRTUAL ADDRESSv SBC R0 ;TAKE CARE OF CARRY8w BIC #^C<77>,R0 ;MAKE SURE ONLY 6 BITS MAXIMUM ARE SET#x MOV R0,@#RELCV+4 ;SAVE HIGH BITSU"y MOV R1,@#RELCV+6 ;SAVE LOW BITSz{ .ENDC ;K$$DAS|} .IFT ;M$$EXT!D$$H11~6 MOV (SP)+,R1 ;RESTORE START APR BIAS OF DRIVER DATA .ENDC ;M$$EXT!D$$H11, .ENDC ;D$$V11 .IF DF M$$EXT;J; CALCULATE AND SAVE THE UMR VALUE(S) TO MAP ALL OF THE DRIVER DATA AREA;D .IF DF R$$EIS( CLR R0 ;PREPARE FOR ASHC INSTRUCTION' ASHC #6,R0 ;GET PHYS. START ADDRESSB .IFF ;R$$EISU0 SWAB R1 ;USE NON-EIS EMULATION OF ASHC #6,R0 MOVB R1,R0 ; BIC #377,R1 ;S  ROR R0 ;  ROR R1 ;  ROR R0 ;  ROR R1 ; .ENDC ;R$$EIS& MOV #UMR5S,R2 ;POINT AT SAVED UMR 5# MOV R1,(R2)+ ;SAVE UMR 5 SETTING MOV R0,(R2)+ ; .IF NDF T$$SPL# ADD #20000,R1 ;ADVANCE 8 K BYTESS  ADC R0 ;# MOV R1,(R2)+ ;SAVE UMR 6 SETTING. MOV R0,(R2)+ ; .ENDC ;NDF T$$SPL .IFF ;M$$EXT  .IF DF D$$H11;BN; COMPUTE AND SAVE THE DOUBLE-WORD RELOCATION CONSTANT TO TRANSFORM A DRIVER+; VIRTUAL ADDRESS INTO AN 18-BIT ADDRESS. 0; (SEE DETAILED DESCRIPTION AT LABEL "RELC:").;N% SWAB R1 ;SHIFT KISAR5 6 BITS LEFT 3 MOVB R1,R0 ;GET ORIGINAL BITS 10-11 IN BITS 2-3& RORB R1 ;ORIGINAL BIT 8 INTO CARRY/ ROR R1 ;BIT 8 INTO BIT 15, BIT 9 INTO CARRYA2 ROR R1 ;BIT 9 INTO BIT 15 - SHIFT IS COMPLETED  BIC #77,R1 ;CLEAR 6 LOW BITS+ ASL R0 ;SHIFT 2 HIGH BITS INTO BITS 4-5$  ASL R0 ;7 SUB #120000,R1 ;SUBTRACT DRIVER BASE VIRTUAL ADDRESST BCC 30$ ;NO CARRY - JUMP, SUB #20,R0 ;SUBTRACT CARRY FROM R0 BIT 4-30$: BIC #^C<60>,R0 ;CLEAR ALL BUT BITS 4-5N* MOV R0,@#RELC ;SAVE RELOCATION CONSTANT MOV R1,@#RELC+2 .ENDC ;D$$H11 .ENDC ;M$$EXT .ENDC ;D$$H11!D$$V11.; SETTUP THE CT VIDEO TASK TIMER CLOCK BLOCK .IF DF B$00}}|tt tfDATA$MAP3 MOV #CTICK,@#$CTCB+C.SUB ;INITIALIZE CLOCK BLOCK CALL CTQUEK ;QUEUE IT  .ENDC ;B$$MAP3 MOV #TTICK,@#$TTCB+C.SUB ;INITIALIZE CLOCK BLOCKD CALL @#CLINS ;QUEUE IT( MOV #$DEVHD,R0 ;GET START OF DCB LIST 40$: MOV @R0,R0 ;GET NEXT DCB6 CMP D.NAM(R0),#"TT ;DOES IT HAVE GENERIC NAME "TT"? BNE 40$ ;N - LOOPR" MOV D.UCB(R0),R1 ;GET FIRST UCB+ BIT #DV.TTY,U.CW1(R1) ;IS IT A TERMINAL?1 BEQ 40$ ;N - LOOPT4 MOV R0,@#DCB0 ;SAVE POINTER TO FIRST TERMINAL DCB .IF DF T$$COM MOV (SP)+,R1 ;GET TTCOM PCB .IFF ;T$$COMQ" MOV D.PCB(R0),R1 ;GET TTDRV PCB .ENDC ;T$$COM; MOV P.SIZE(R1),R1 ;GET PARTITION SIZE IN 32. WORD BLOCKSD .IF DF R$$EIS ASH #6,R1 ;CONVERT TO BYTEST .IFF ;R$$EIS) SWAB R1 ;CONVERT TO BYTEST  RORB R1  ROR R1O  ROR R1D .ENDC ;R$$EIS .IF DF T$$SPLD ADD #140000-T$$BFL,R1 ;GET POINTER T$$BFL BYTES BELOW END OF POOL .IFF ;T$$SPLE? ADD #120000-T$$BFL,R1 ;GET POINTER T$$BFL BYTES BELOW END OF ;DRIVER POOL .ENDC ;T$$SPL;T$ MOV #TTPOOL,R0 ;GET START OF POOL- MOV R0,@#FREEB ;POINT TO FIRST FREE BUFFERO BR CPOOL ;INITIALIZE POOLS;;H .ENDCONVERT TO BYTEST .IFF ;R$$EIS) SWAB R1 ;CONVERT TO BYTEST  RORB R1  ROR R1O  ROR R1D .ENDC ;R$$EIS .IF DF T$$SPLD ADD #140000-T$$BFL,R1 ;GET POINTER T$$BFL BYTES BELOW END OF POOL .IFF ;T$$SPLE? .TITLE TTFP .IDENT /07.01/B;D8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;P>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;( ;0 ; 09-FEB-78 PETER WANNHEDENM ;3 ; PREVIOUSLY MODIFIED BY:N;M; D. R. DONCHIN ; T. LEKAS; J. KAUFFMAN$; S. C. ADAMS:; R. S. PHILPOTT; B. S. MCCARTHY;T; MODIFICATIONS ;1; ; S.C. ADAMS 27-FEB-86 07.002; SA454 -- FIX PROBLEMS WITH CONTINUATION LINES;I; S.C. ADAMS 29-APR-86 07.01/; SA457 -- ADD CONDITIONAL FOR BIC IN U.TST6F;H];D^ .MCALL EVNDF$,PKTDF$S _ PKTDF$C ` EVNDF$Iab .PSECT MAP5.6c; d;+Ae; MODULE TTFP - CONTAINS FORK LEVEL PROCESSING ROUTINES FOR THERf; FOLLOWING FORK REQUESTS:&g; FR.SUI START OF UNSOLICITED INPUT.h; FR.AST CHARACTER THAT CAUSES AST RECEIVED=i; FR.SCA TERMINAL MANAGEMENT SWITCH CHARACTERS WERE STRUCK 1j; FR.ICS INPUT COUNT STATE TRANSITION OCCURREDE,k; FR.OOB OUT-OF-BAND CHARACTER WAS STRUCKl;->m; ALL THESE ROUTINES ARE CALLED BY THE FORK DISPATCHER WITH:%n; R4 POINTER TO UCBX (IF IT EXISTS)o; R5 POINTER TO U.TSTA(p; S1.DSI 1 TO DISABLE INPUT PROCESSINGq;-r;Is;R,t.SBTTL FPSUI - START OF UNSOLICITED INPUT.u; v .ENABL LSBw;R=xFPSUI:: CALL GCTAB ;GET CHARACTER THAT STARTS UNSOL. INPUTU+y BCS 30$ ;NOT THERE ANY MORE - FORGET ITMz{ .IF DF T$$IDO|0} TST $MCRPT ;IS THE MCR DISPATCHER INSTALLED?.~ BEQ CTAST ;EQ NO - QUEUE THE AST TO C$CTEX .ENDC ;T$$IDO5 CMPB R2,#CH.SP ;IS IT A "FUNNY" CHARACTER (CONTROL ;CHARACTER OR SPACE)?X BHI 10$ ;N - OK, JUMP.9 CMPB R2,#CH.CR ;OF THE FUNNY CHARACTERS, WE ONLY ALLOW* ;CARRIAGE RETURN AND CTRL-C TO START ;UNSOLICITED INPUT, ;(CR WILL OF COURSE ALSO TERMINATE IT) BEQ 10$ ;CR - OK CMPB R2,#CH.CTC ;CTRL-C?A BNE 50$ ;N - IGNORE10$: ;REFERENCE LABEL .IF NDF T$$SPLS CALL ALUCBX ;ALLOCATE UCBX BCS 50$ ;FAILED - JUMP .ENDC ;NDF T$$SPL' CALL ALTB ;ALLOCATE AN INPUT BUFFERT BCS 40$ ;FAILED - JUMP" MOV R2,-(SP) ;OK - SAVE POINTER0 CLR -(SP) ;RESET CLI PROMPT STATUS FOR ^U/^R ASSUME U.TCI,08 MOV @R4,R3 ;GET CURRENT INPUT PACKET IF THERE IS ONE BEQ 20$ ;INPUT FREE - JUMP2 MOV #IS.CC,@R3 ;INPUT BUSY - SET STATUS = IS.CC+ ;(BY DEFINITION, IT MUST BE SOLICITEDR ;INPUT)R; MOVB @R3,1(SP) ;SHO00"}|{ccccW THAT A READ WAS INTERRUPTED BY A ^CA MOV R4,-(SP) ;SAVE R4 CALL FPIRD ;SAY INPUT DONE MOV (SP)+,R4 ;RESTORE R4AC20$: MOV (SP)+,U.TFPB(R4) ;SAVE ^U/^R STATUS IN NOW UNUSED OFFSET = MOV (SP)+,U.TFIB(R4) ;SET UP POINTER TO FIRST INPUT BUFFER^> MOVB U.TCHP-U.TSTA(R5),U.TIHP(R4) ;SET UP INITIAL HOR. POS. .IF NE T$$UTO, MOVB #T$$UTO,U.TITI(R4) ;INITIALIZE TIMER .ENDC ;T$$UTO" ADD #U.TFIB,R4 ;POINT TO U.TFIB;O;E;+9; SUBROUTINE FPSUI1 - SET UP UCB FOR UNSOLICITED INPUT.R<; FALL THROUGH FROM ABOVE OR CALLED FROM TTICH @ INT STATE; ; INPUT:; R4 POINTER TO U.TFIB; R5 POINTER TO U.TSTA(; U.TFIB POINTER TO FIRST INPUT BUFFER;V ; OUTPUT:(; UCB SET UP.E(; R2 POINTER TO SECOND WORD OF BUFFER. ; THIS WORD INITIALIZED TO 0.; R4 POINTER TO U.TICN;U; REGISTERS ALTERED: R2,R4;-;A;T8FPSUI1::MOV @R4,R2 ;GET POINTER TO FIRST INPUT BUFFER ASSUME U.TTIC,U.TFIB-23 MOV #M$$CRB-4,-(R4) ;INITIALIZE TOTAL BYTE COUNTP# ; = 1 FULL CLI COMMAND BUFFERC- CALL NXTIB ;SET UP UCB FOR INPUT TRANSFERA MOV R2,U.TCI-U.TIC(R4) ;STORE POINTER TO SECOND WORD IN BUFFERT/ ;THIS WORD WILL RECEIVE COMPLETION STATUS  CLR @R2 ;INITIALIZE STATUS; BIS #S1.IBY!S1.IBF!S1.USI,@R5 ;SET FLAGS FOR UNSOLICITED  ;BUFFERED INPUT5 BIC #S1.RST!S1.PTH!S1.RES!S1.RNF!S1.RSP!S1.TNE,@R5P BIC #S5.ITI,U.TST5-U.TSTA(R5) ;SA457 .IF DF T$$EIO ;SA457 ;SA457 BIC #S6.EIO,U.TST6-U.TSTA(R5) ;SA457 .ENDC ;T$$EIO ;SA457 ;SA457+ MOV 4(R5),-(SP) ;GET CHARACTERISTIC WORDI6 BIC #^C,(SP) ;GET RID OF EVERYTHING BUT TSY ASSUME S3.TSY,S1.TSYCB BIS (SP)+,(R5) ;RESTORE THE TSY BIT ACCORDING TO CHARACTERISTIC30$: RETURN ;;B40$:;C; FAILED TO ALLOCATE INPUT BUFFER. WITH A LITTLE EFFORT, WE COULDI@; DEALLOCATE THE UCBX, AFTER CHECKING WHETHER IT IS NEEDED FOR; SOME OTHER PURPOSE.7;B( CALL BELL ;BUFFER ALLOCATION FAILURE ;OUTPUT A BELL AND<50$: CALLR RCTAB ;REMOVE CHARACTER FROM TYPE-AHEAD BUFFER ;AND FORGET IT ALL.PAGE>3.SBTTL FPAST - CHARACTER THAT CAUSES AST RECEIVED3;S .IF DF T$$CCAAFPAST:: CALL GCTAB ;GET A CHARACTER FROM THE TYPE-AHEAD BUFFER BCS 30$ ;NONE THERE - IGNORE .IF NDF T$$SPLF TST R4 ;UCBX PRESENT?O2 BEQ 30$ ;N - TERMINAL MUST BE DETACHED, IGNORE .ENDC ;NDF T$$SPL# MOV U.TAST(R4),R1 ;GET AST BLOCKB5 BEQ 30$ ;NONE - TERMINAL MUST BE DETACHED, IGNORE03 MOVB R2,A.PRM(R1) ;INSERT CHARACTER IN AST BLOCKFC BISB #AF.LCK,A.PRM+5(R1) ;ASSUME TASK ONLY WANTS NOTIFICATION...A' ;...SO LOCK THE AST CONTROL BLOCKD& CMPB R2,#CH.CTC ;IS CHARACTER A ^C? BNE 60$ ;N - JUMPY5 MOV A.PRM+6(R1),R0 ;ASSUME SPECIFICATION OF ^C AST# BNE 70$ ;GOOD ASSUMPTION - JUMPCB60$: MOV A.PRM+10(R1),R0 ;GET ADDRESS OF UNSOLICITED AST ROUTINE: BITB #TF.NOT,A.PRM+5(R1) ;TASK WANTS NOTIFICATION ONLY? BNE 80$ ;Y - JUMP ;70$: CALL RCTAB ;REMOVE CHARACTER FROM TYPE-AHEAD BUFFERN- BICB #AF.LCK,A.PRM+5(R1) ;UNLOCK AST BLOCK.?80$: MOV R0,A.AST(R1) ;INSERT TASK AST ADDRESS INTO AST BLOCKL5 JMP QUEAEN ;QUEUE ASYNCHRONOUS EVENT NOTIFICATIONA .ENDC ;T$$CCA.PAGE6 .SBTTL FPSCA - SWITCH CHARACTERS HAVE BEEN DETECTED .IF DF T$$SCAP  ;MI ; THIS FORK ROUTINE IS EXECUTED WHEN A USER HAS REQUESTED RECOGNITIONBK ; OF SWITCH CHARACTERS BY SETTING UP THE TC.SSC CHARACTERISTIC. ENTERING E ; SWITCH CHARACTERS IS A REQUEST TO ENTER TERMINAL MANAGEMENT MODE. ;C FPSCA::1 .IF NDF T$$SPL TST R4 ;IS THERE A UCBX?A, BEQ 30$ ;IF EQ, NO...MUST HAVE DETACHED .ENDC ;NDF T$$SPL: TST U.TSCA(R4) ;IS THERE POINTER TO TERM MGMT ACB/TEP?2 BEQ 30$ ;IF EQ, IT WENT AWAY...IGNORE REQUEST" MOV #IS.TMM,R0 ;SET TMM STATUS CALL KILLI1 ;KILL INPUT7 MOV U.TSCA(R4),R1 ;GET POINTER TO TERM MGMT ACB/TEPE( JMP QUEAEN 00*}}|tt tfDATA;QUEUE TEP TO IT'S OWNER .ENDC ;T$$SCA .PAGE 7! .SBTTL FPICS - INPUT COUNT STATE TRANSITION OCCURRED"# .IF DF T$$ICSF$%;J&; THIS FORK ROUTINE IS EXECUTED WHEN A USER HAS REQUESTED NOTIFICATIONH'; OF THE TYPE-AHEAD BUFFER GOING FROM EMPTY TO NON-EMPTY BY SETTING UPH(; THE TC.ICS CHARACTERISTIC. A TSA EVENT PACKET WILL BE QUEUED TO THE8); SYSTEM-STATE PROCESS THAT SET UP THE CHARACTERISTIC.*; +FPICS::(2, CALL GCTAB ;IS THERE STILL A CHAR IN THE TAB?,- BCS 30$ ;IF CS, NO...FORGET THE REQUEST./ .IF NDF T$$SPL01 TST R4 ;IS THERE A UCBX? ,2 BEQ 30$ ;IF EQ, NO...MUST HAVE DETACHED34 .ENDC ;NDF T$$SPL516 MOV U.TICA(R4),R1 ;GET POINTER TO ICS ACB/TEPI27 BEQ 30$ ;IF EQ, IT WENT AWAY...IGNORE REQUEST(8 JMP QUEAEN ;QUEUE ACB TO IT'S OWNER9: .ENDC ;T$$ICS;<.PAGEW0= .SBTTL FPOOB - OUT-OF-BAND CHARACTER DETECTED>? .IF DF T$$OOBS@A;JB; THIS FORK ROUTINE IS EXECUTED WHEN A USER HAS REQUESTED NOTIFICATIONOC; OF INPUT OF OUT-OF-BAND CHARACTERS BY SETTING UP THE TC.OOB CHARACTERISTIC.HOD; IF THE USER IS A TASK, AN AST WILL BE QUEUED. OTHERWISE A TSA EVENT PACKETSNE; WILL BE QUEUED TO THE SYSTEM-STATE PROCESS THAT SET UP THE CHARACTERISTIC.F;E GFPOOB::GHI .IF NDF T$$SPLEJK TST R4 ;IS THERE A UCBX?,L BEQ 30$ ;IF EQ, NO...MUST HAVE DETACHEDMN .ENDC ;NDF T$$SPLO1P MOV U.TOBA(R4),R1 ;GET POINTER TO ICS ACB/TEPF2Q BEQ 30$ ;IF EQ, IT WENT AWAY...IGNORE REQUESTR)S CALL QUEAEN ;QUEUE TEP TO IT'S OWNERETU ASSUME U.TCI,0.V;HFW; CHECK IF A STATUS HAS BEEN SET. (IS.OOB). THIS MEANS THAT THE OOBIX; CHARACTER WAS A CLEAR OOB AND THEREFORE, THE READ MUST BE TERMINATED.AY; Z TST (R4)+ ;IS THERE INPUT?P3[ BEQ 30$ ;RETURN IF NOT. (IF NOT R4 NOT NEEDED)H!\ TST @-(R4) ;IS THERE STATUS?N] BEQ 30$ ;RETURN IF NOT$^ CALLR KILLI ;TERMINATE THE READ_` .ENDC ;T$$OOBa b .DSABL LSBBcd.PAGEEBe.SBTTL CTAST - FOR INTERRUPT-DO SEND AN AST TO C$CTEX - FOR P/OSf; gh .IF DF T$$IDOij;>k; THIS IS A HACK TO SEND AN AST TO A TASK CALLED C$CTEX WHENAl; ^C IS TYPED AND NO ONE WANT'S IT. THE AST ROUTINE IS ASSUMED m; TO BE AT LOCATION 250n;Top;; q; SEE IF THE TASK IS INSTALLEDr;I+sCTAST: CMPB R2,#CH.CTC ;IS IT A CTRL-C? t BEQ 970$ ;EQ YES - OK GO ONu(v CRASH ;WE SHOULD ONLY GET HERE FORw ;A CTRL-C (OR INT-DO)x+y970$: CALL RCTAB ;GET RID OF THE CTRL-C-!z MOV #CTEX,R3 ;GET CTEX'S NAMEC{ CALL $SRSTD ;LOOK FOR ITF| BCS 990$ ;IF CS - NOT HERE '} BIT #TS.EXE,T.STAT(R0) ;TASK ACTIVE?C%~ BNE 990$ ;IF NE NO - DON'T DO ITN& MOV R0,-(SP) ;SAVE THE TCB ADDRESS;B; GET SOME POOL; MOV #6.*2,R1 ;SIZE CALL $ALOCB ;GET IT* BCS 980$ ;IF CS - NO POOL - FORGET IT;9; FILL IN THE AST BLOCK;C" MOV R0,R1 ;COPY BLOCK ADDRESS- TST (R0)+ ;POINT PAST AST LIST LINK WORDA& MOV #6.*2,(R0)+ ;SIZE OF AST BLOCK< MOV #7.*2,(R0)+ ;NUMBER OF BYTES TO ALLOCATE ON USER'S S' MOV #250,(R0)+ ;AST VIRTUAL ADDRESST6 CLR (R0)+ ;NUMBER OF EXTRA WORDS TO PUT ON USER'S% MOV (SP)+,R0 ;GET THE TCB ADDRESSA6 CALLR $QASTT ;QUEUE THE AST AND THROW THE ^C AWAY$980$: TST (SP)+ ;CLEAN THE STACK990$: RETURN .ENDC ;T$$IDO.PAGE (.SBTTL FPKIL - SEND KILL PACKET TO CLI;M .IF DF T$$SPC .PSECT MAP6 FPKIL::T .IF DF C$$CTCE BIT #UM.KIL,U.MUP-U.TSTA(R5) ;CREATE ^C NOTIFICATION PACKET IF CLRS/ BNE 10$ ;IF NE, KILL PACKET MUST BE CREATED ; MOV #CC.CLI!CC.CTC,R1 ;SET ^C NOTIFICATION PACKET STATUST BR 20$ ;JUMP TO COMMON CODE 10$: .ENDC ;C$$CTC/ BIC #UM.KIL,U.MUP-U.TSTA(R5) ;CLEAR KILL BIT* CLR U.TFPB(R4) ;RESET CLI PROMPT STATUS; ;SA454;J; THE FOLLOWING CODE IS AN ATTEMPT TO CAUSE TTDRV TO CYCLE BACK ;SA454M; THROUGH FPKIL SUCH THAT WHEN CONTROL C IS TYPED TO A CONTINUATION ;SA454TH; LINE, WE FIRST COME THROUGH AND KI002}|{ccccLL THE LINE THEN AGAIN TO ;SA454N; ABORT TASKS. THIS BEHAVIOR IS BEING CHANGED AS IT IS INCONSISTENT ;SA454M; WITH THE ACTION OF TTDRV WHEN A COMMAND LINE IS TERMINATED BY ^C. ;SA454C ;SA454; .IF DF T$$SPL ;SA454I; ;SA454 A; MOVB #CH.CTC,U.TECO-U.TSTA(R5) ;PUT ^C IN ECHO BUFFER ;SA454O; ;SA454A; .IFF ;T$$SPL ;SA454; ;SA454U;; MOVB #CH.CTC,U.TECB(R4) ;PUT ^C IN ECHO BUFFER ;SA454; ;SA454 ; .ENDC ;T$$SPL ;SA454A; ;SA454B8; FRKBIT BIS,#FR.PFP ; POST-FORK PROCESS A ^C ;SA454; ;SA454I/ MOV #CC.KIL,R1 ;SET CLI KILL STATUS ;**-3M"20$: MOV R5,R2 ;GET UCB ADDRESS SUB #U.TSTA,R2 ;$, CALL $QCNTP ;QUEUE CONTROL PACKET TO CLI  RETURNC .ENDC ;T$$SPC.PAGEE8 .SBTTL QUEAEN - QUEUE ASYNCHRONOUS EVENT NOTIFICATION, .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB;P;+;H5; **-QUEAEN - QUEUE ASYNCHRONOUS EVENT NOTIFICATION$; ; INPUTS:<; R1 => AST CONTROL BLOCK OR TSA EVENT PACKET TO BE QUEUED); R4 => UCBX (MUST EXIST AND BE MAPPED)V ; R5 => U.TSTA OF CURRENT UCBX;-; OUTPUTS:; R0 IS DESTROYEDS,; R3 IS DESTROYED IF A TEP IS PASSED IN R1;R;-;O  .ENABL LSB QUEAEN:: .IF DF R$$IIC ASSUME A.CBL,E.VSIZ/ TST A.CBL(R1) ;IS THIS AN AST CONTROL BLOCK?$& BNE 10$ ;IF NE, NO...MUST BE A TEP .IFTF ;R$$IIC8 BITB #AF.QUE,A.PRM+5(R1) ;IS THIS ACB ALREADY QUEUED?% BNE 20$ ;IF NE, YES...JUST RETURNR .IF DF T$$OOB1 BITB #AF.OOB,A.PRM+5(R1) ;IS THIS ACB FOR OOB? BEQ 5$ ;IF EQ, NON= TSTB A.PRM+24(R1) ;IS THERE A CHARACTER IN THE OOB BUFFER?E  BEQ 20$ ;IF EQ, NO... RETURN! CALL RCBUF ;GET THE CHARACTER+ MOVB R2,A.PRM(R1) ;AND PUT IT IN THE ACBS5$:B .ENDC ;T$$OOB/ BISB #AF.QUE,A.PRM+5(R1) ;MARK ACB AS QUEUED 4 MOV U.ATT-U.TSTA(R5),R0 ;GET TCB OF ATTACHED TASK+ CALLR $QASTT ;QUEUE THE AST TO THE TASKA .IFT ;R$$IIC$10$:1 MOV R1,R3 ;COPY TEP POINTER FOR QUEUE ROUTINE #; BR QUETEP ;SKIP TO QUEUE A TEPO7 .SBTTL QUETEP - QUEUE TERMINAL EVENT PACKET TO OWNERA;A;+; N; **-QUETEP - THIS ROUTINE IS CALLED TO PASS A TSA EVENT PACKET TO A ROUTINEG; SET UP TO PROCESS THE EVENT. THE DOUBLEWORD ADDRESS OF THE ROUTINEBF; TO BE CALLED IS EXPECTED TO BE IN THE TEP. NOTE THAT AN INTERLOCKG; MECHANISM IS PROVIDED TO DISABLE A FUTURE CALL WITH THE SAME PACKETTI; IF NECESSARY. IT IS UP TO THE CALLED ROUTINE TO CLEAR THE INTERLOCK. ;U ; INPUT:"; R3 => TEP TO PASS TO ITS OWNER;;-; QUETEP::7 BIT #EF.QUE,E.VFLG(R3) ;IS THE PACKET ALREADY QUEUED 6 BNE 20$ ;IF NE, YES...CANNOT QUEUE A LOCKED PACKETB BIS #EF.QUE,E.VFLG(R3) ;LOCK PACKET UNTIL OWNER IS DONE WITH ITA MOV E.VAPR(R3),-(SP) ;SAVE DOUBLEWORD ADDRESS OF THE PACKET... ) MOV E.VADR(R3),-(SP) ;...OWNER ROUTINE ' CALL $MPPRO ;MAP AND CALL THE OWNER  .ENDC ;R$$IIC 20$:  RETURN ;ALL DONEC   .DSABL LSBE , .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB9 .SBTTL RCBUF - REMOVE CHARACTER FROM TYPE-AHEAD BUFFERE;L;+;HK; **-RCBUF - THIS ROUTINE IS CALLED TO REMOVE A CHARACTER FROM A STANDARDKB; FORMAT TYPE-AHEAD BUFFER. NOTE: THIS MUST BE CALLED ONLYD; WHEN IT IS KNOWN THAT THERE ARE CHARACTERS TO BE RETRIEVED!;M ; INPUT:0; R1 => ACB IN WHICH TYPE-AHEAD BUFFER RESIDES ; OUTPUT:W%; R2 CHARACTER THAT WAS RETRIEVEDR; ;-;C  .IF DF T$$OOB!"RCBUF:## CALL LOCKI ;LOCK OUT INTERRUPTSB6$ MOV R1,R3 ;;;MAKE COPY OF ACB ADDRESS TO PLAY WITH1% ADD #A.PRM+23,R3 ;;;POINT TO RETRIEVAL POINTER '& CLR R2 ;;;PREPARE FOR BYTE TRANSFERR4' BISB (R3),R2 ;;;GET OFFSET TO RETRIEVE CHARACTER(( INCB (R3) ;;;INCREMENT RETR. POINTER>) CMPB (R3)+,1(R3) ;;;IS THE POINTER NOW = TOTAL BUFFER SIZE?* BNE 10$ ;;;NE- OKC/+ CLRB -1(R3) ;;;START AT BEGINNING NEXT TIMEW,10$:%- DECB (R3)00:};}|tt tfDATA+ ;;;DEC CHARACTER COUNT. ADD R2,R3 ;;;POINT TO.../ INC R3 ;;;THE CHARACTER;0 CLR R2 ;;;GET READY FOR IT'1 BISB (R3),R2 ;;;GET CHARACTER IN R2I 2 RETURN#34 .ENDC ;T$$OOB5;R6; 7 .END& CLR R2 ;;;PREPARE FOR BYTE TRANSFERR4' BISB (R3),R2 ;;;GET OFFSET TO RETRIEVE CHARACTER(( INCB (R3) ;;;INCREMENT RETR. POINTER>) CMPB (R3)+,1(R3) ;;;IS THE POINTER NOW = TOTAL BUFFER SIZE?* BNE 10$ ;;;NE- OKC/+ CLRB -1(R3) ;;;START AT BEGINNING NEXT TIMEW,10$:%- DECB (R3) .TITLE TTICH .IDENT /07.03/T;5=; COPYRIGHT (c) 1986,1987 BY DIGITAL EQUIPMENT CORPORATION.T; ALL RIGHTS RESERVED.;R>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;. ;U ; 23-JAN-78 PETER WANNHEDENX ;  ; PREVIOUSLY MODIFIED BY:Y;A; P. WANNHEDEN; C. F. SPITZA; D. R. DONCHINI ; T. LEKAS; J. KAUFFMAN ; S. C. ADAMSM; R. S. PHILPOTT;U; MODIFIED BY:;; L. KOGAN 06-FEB-86 07.00A; LK707 -- CORRECT CTR/R PROCESSING WHEN T$$RPR IS NOT DEFINEDR;I; S.C. ADAMS 21-MAY-86 07.01=; SA458-- DON'T PERFORM SPECIAL FUNCTION FOR OOB CHARACTER ;; S.C. ADAMS 20-JUN-86 07.02;; SA463-- FIX PROBLEM OF CERTAIN TERMINATORS UNDER CTERME(; BEING INCLUDED IN THE INPUT BUFFER;Y; S.C. ADAMS 16-FEB-87 07.03=; SA468-- CONVERT TO UPPERCASE WHEN APPROPRIATE FOR IO.RST ; ; ;+; ****** T T I C H ****** ;IK; THIS MODULE CONTAINS THE ROUTINES WHICH MAKE UP THE "PRE-INPUT PROCESS"SO; AND THE "INPUT PROCESS" OF THE TERMINAL DRIVER. THE "PRE-INPUT" PROCESS IS8Q; MODELLED AS RECEIVING CHARACTERS FROM A TERMINAL INTERFACE. THESE CHARACTERS6O; ARE INTERPRETED PRIOR TO BEING MOVED TO EITHER A TYPE-AHEAD BUFFER OR TO AN M; OUT-OF-BAND CHARACTER BUFFER. THE "INPUT PROCESS" IS MODELLED AS READING-Q; CHARACTERS FROM THE TYPE-AHEAD BUFFER, PROCESSING THEM, AND THEN WRITING THEMTN ; TO AN INPUT BUFFER. THE PROCESSING INVOLVES RECOGNIZING ESCAPE SEQUENCES,N!; EDIT CHARACTERS, AND TERMINATORS AND INITIATING THE ECHO PROCESSING OF THEK"; CHARACTER. AN INPUT BUFFER CAN BE A USER TASK BUFFER, "BUFFERED INPUT"I0#; BUFFERS, OR UNSOLICITED INPUT (CLI) BUFFERS.$;-%;I(& .SBTTL .MCALLS AND SYMBOL DEFINITIONS'( .IF DF R$$MPL)* .MCALL KRBDF$+, KRBDF$ ;DEFINE KRB SYMBOLSD-. .IFF ;R$$MPLF/0 .MCALL SCBDF$1&2 SCBDF$ ,,SYSDEF ;DEFINE SCB SYMBOLS34 .ENDC ;R$$MPL56 .MCALL PKTDF$7"8 PKTDF$ ;DEFINE PACKET SYMBOLS9: .IF DF T$$TSA;< .MCALL EVNDF$=,> EVNDF$ ;DEFINE TSA EVENT PACKET OFFSETS?@ .ENDC ;T$$TSAAB .PSECT MAP5.6C.PAGEI+D .SBTTL TERMINAL DRIVER PRE-INPUT PROCESSIBE .SBTTL . ICHAR1 - INITIALIZATION AND SPECIAL CHARACTER CHECKINGF;.G;+CH; **-ICHAR1 - PROCESS AN INPUT CHARACTER BEFORE TYPE-AHEAD BUFFERI;.OJ; THIS ROUTINE INITIATES PROCESSING OF A CHARACTER ON THE "OUTSIDE" (HARDWAREOK; SIDE) OF THE TYPE-AHEAD BUFFER. ANY OF THE FOLLOWING ACTIONS MAY BE TAKEN:L;?M; 1. IF THE UNIT IS OFFLINE OR WAITING FOR CARRIER, THE INPUT N; CHARACTER IS IGNORED..O; 2. PERFORM AUTOBAUD DETECTION IF REQUIRED.DP; 3. CHECK FOR USER REQUEST TO SWITCH TO TERMINAL MANAGEMENT MODE.CQ; 4. DISPATCH TO ONE OF THE "PRE-INPUT PROCESS" SPECIAL CHARACTER ;R; HANDLING ROUTINES (^S, ^Q, ^O, ^X, ^C, ^V). NOTE THAT<S; THESE CHARACTERS ARE NOT INTERPRETED IF "PASSTHRU" OR A2T; "READ WITH SPECIAL TERMINATORS" IS IN EFFECT./U; 5. PERFORM OUT-OF-BAND CHARACTER DETECTION.:V; 6. TRANSFER CONTROL TO "I1DEF" FOR FURTHER PROCESSING.W;N X; INPUTS:5Y; R2 = CHARACTER (LOW BYTE) AND STATUS (HIGH BYTE)F$Z; R5 => U.TSTA OF THE TERMINAL UCB[;O \; OUTPUTS:I2]; R2 = CHARACTER (IF CONTROL PASSED TO "I1DEF")^;I#_; REGISTERS ALTERED: R2, R3, R4 `;-a;O bICHAR1::cd .IF DF T$$MODeEf BITB #US.CRW,U.STS-U.TSTA(R5) ;;;IS THIS UNIT WAITING FOR CARRIER?*g BNE I1RET ;;;IF NE, YES...IGNORE INPUT00B}|{cccchi .ENDC ;T$$MODjk .IF DF R$$CONl9m BITB #US.OFL,U.ST2-U.TSTA(R5) ;;;IS THIS UNIT OFFLINE?E*n BNE I1RET ;;;IF NE, YES...IGNORE INPUTop .ENDC ;R$$CONqr .IF DF T$$SPLs;t MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAP THE UCBX AND TABUF uv .ENDC ;T$$SPLwx; ,y; PERFORM AUTOBAUD DETECTION IF NECESSARY.z; {| .IF DF D$$M11!D$$ZMD!D$$VMD}~ ASSUME S5.ABP,100000R? TST U.TST5-U.TSTA(R5) ;;;IS AUTO-BAUD DETECTION IN PROGRESS?I BPL 10$ ;;;IF PL, NO...SKIPT3 CALL SETSPD ;;;DETERMINE THE CALLER'S BAUD RATEB3 BEQ I1RET ;;;IF EQ, DID NOT FIND SPEED...RETURNE2 ;;;ELSE, THE INPUT CHARACTER IN R2 IS A 10$: .ENDC ;D$$M11!D$$ZMD!D$$VMD .IF DF T$$ACDC MOV #UA.ACC!UA.PRO!UA.ECH,U.AFLG-U.TSTA(R5) ;;;SET DEFAULT FLAGS : TST U.ACB-U.TSTA(R5) ;;;DOES THIS TERMINAL HAVE AN ACD?) BEQ 20$ ;;;IF EQ, NO...SKIP ACD STUFFP0 MOV R0,-(SP) ;;;SAVE REGISTER NEEDED FOR CALL< MOV #A.RECE,R0 ;;;SPECIFY CHARACTER RECEPTION ENTRY POINT CALL $SWACD ;;;CALL ACDE# MOV (SP)+,R0 ;;;RESTORE REGISTER;: BIT #UA.ACC,U.AFLG-U.TSTA(R5) ;;;ACCEPT THIS CHARACTER?+ BEQ I1RET ;;;IF EQ, NO...JUST IGNORE IT.D BIT #UA.TYP,U.AFLG-U.TSTA(R5) ;;;FORCE THIS CHARACTER INTO TABUF?' BNE I1BUFR ;;;IF NE, YES...GO DO ITA= BIT #UA.PRO,U.AFLG-U.TSTA(R5) ;;;INTERPRET THIS CHARACTER?A! BEQ I1DEF ;;;IF EQ, NO...SKIPS20$: .ENDC ;T$$ACD; M; CHECK FOR HARD RECEIVE ERRORS ON THE INPUT CHARACTER. IT IS ASSUMED THATYL; THE ERROR BITS PASSED FROM THE HARDWARE MATCH THE FLAG VALUES IN THE UCB; STATUS WORD (U.TST5).R;; .IF DF T$$RED@ BIC #^C,R2 ;;;CLEAR EXTRANEOUS BITS? BIT #S5.BCC!S5.DAO!S5.VER,R2 ;;;HARD RECEIVE ERROR DETECTED?;7 BNE I1DEF ;;;IF NE, YES...DON'T INTERPRET CHARACTER; .IFF ;T$$REDA? BIT #S5.BCC!S5.DAO!S5.VER,R2 ;;;HARD RECEIVE ERROR DETECTED?A2 BNE I1BEEP ;;;IF NE, YES...RESPOND WITH A BELL .ENDC ;T$$RED0 BIT #S3.8BC,4(R5) ;;;PASS 8 BITS TO THE USER? BNE 40$ ;;;IF NE, YES...SKIP0 BIC #200,R2 ;;;OTHERWISE, CLEAR THE HIGH BIT40$:;=; CHECK FOR POTENTIAL SWITCH INTO TERMINAL MANAGEMENT MODE.;T .IF DF T$$SCA= CALL TMMCHK ;;;SEE IF INPUT PUTS US IN TERMINAL MGMT MODE.; BCS I1RET ;;;IF CS, ONE OF SWITCH CHARS SEEN...ALL DONE# .ENDC ;T$$SCA; J; SCAN PRE-INPUT PROCESS CHARACTER RECOGNITION TABLE AND THE OUT-OF-BAND:; CHARACTER DEFINITIONS FOR THE CURRENT INPUT CHARACTER.;T3 MOV #I1CRT,R3 ;;;GET CHARACTER RECOGNITION TABLEB CMPB R2,(R3)+ ;;;CONTROL-S?. BEQ 50$ ;;;IF EQ, YES...CHECK TTSYNC STATE CMPB R2,(R3)+ ;;;CONTROL-Q?2 BNE 60$ ;;;IF NE, NO...SKIP TO CONTINUE CHECKS50$:4 BIT #S1.TSY,(R5) ;;;TERMINAL HAVE TTSYNC ENABLED? BEQ 60$ ;;;IF EQ, NO...SKIPC5 ASR R3 ;;;CONTROL-S (ASSUMES I1CRT WORD-ALIGNED)? ' BCS I1CTS ;;;IF CS, YES...HANDLE ITC2 BR I1CTQ ;;;ELSE, IT WAS CONTROL-Q...HANDLE IT60$:5 BIT #S1.PTH,(R5) ;;;TERMINAL SET TO PASSTHRU MODE?," BNE I1DEF ;;;IF NE, YES...SKIP .IF DF T$$OOB* MOV R0,-(SP) ;;;SAVE REGISTER ;SA4582 CALL OOBCHK ;;;SEE IF CHARACTER IS OUT-OF-BAND/ BCC 70$ ;;;IF CARRY CLEAR, NOT OOB ;SA458C CALL OOBCK2 ;;;DO FURTHER CHECKING AND PROCESSING OF OOB ;SA458I- MOV (SP)+,R0 ;;;RESTORE REGISTER ;SA458M0 BCS I1DEF ;;;IF CS THEN OOB INCLUDE ;SA458, BR I1RET ;;;ELSE, NOT INCLUDED ;SA458170$: MOV (SP)+,R0 ;;;RESTORE REGISTER ;SA458 : ;;;ELSE, CHARACTER NOT OOB OR IS "OOB INCLUDE" ;**-2B MOV #I1CRT+2,R3 ;;;RESTORE POINTER INTO CHAR. RECOGNITION TABLE .ENDC ;T$$OOB CMPB R2,(R3)+ ;;;CONTROL-O?* BEQ I1CTO ;;;IF EQ, YES...CHECK IT OUT> BIT #S1.RSP,(R5) ;;;READ WITH SPECIAL CHARACTER PROCESSING? BNE I1DEF .IF DF T$$CTX CMPB R2,(R3)+ ;;;CONTROL-X?* BEQ I1CTX ;;;IF EQ, YES...CHECK IT OUT .ENDC ;T$$CTX CMPB R2,(R3)+ ;;;CONTROL-C?/ BEQ I1CTC ;;;IF EQ, YES...PROCES00J};}|tt tfDATAS CONTROL-C $ ;;;ELSE, FALL THROUGH TO I1DEF.PAGE"/ .SBTTL . I1DEF - NORMAL CHARACTER PROCESSINGO;.;+P; **-I1DEF - HANDLE INPUT CHARACTER THAT HAS NO PRE-INPUT PROCESS SIGNIFICANCE;;J; THIS ROUTINE ACCEPTS A CHARACTER FROM "ICHAR1" AND DOES THE FOLLOWING:;OD; 1. IF THE TYPE-AHEAD BUFFER IS EMPTY, CALL "IPROC" TO SEE IF THEB; CURRENT CHARACTER CAN BE PROCESSED IMMEDIATELY (BY "ICHAR2").E; 2. IF THE TYPE-AHEAD BUFFER IS NOT EMPTY OR "IPROC" INDICATES THEE=; CURRENT CHARACTER CANNOT BE PROCESSED NOW, THE CHARACTER+; IS PLACED INTO THE TYPE-AHEAD BUFFER.PD; 3. IF AN ERROR WAS PREVIOUSLY DETECTED, OR THE TYPE-AHEAD BUFFER>; IS FULL, THE CHARACTER IS DISCARDED AND A BELL IS ECHOED.;C ; INPUTS:+; R2 = CURRENT CHARACTER TO BE PROCESSED.$; R5 => U.TSTA OF THE TERMINAL UCB;P ; OUTPUTS:T6; R2 = CHARACTER (IF CONTROL IS PASSED TO "ICHAR2")E; THE CHARACTER IS PLACED IN THE TABUF IF "ICHAR2" CANNOT BE CALLED ;A ; REGISTERS MODIFIED: R3, R4;-;OI1DEF:  .IF DF T$$SPL 0  MOV #120000+U.TTBF,R3 ;;;SET POINTER TO TABUF   .IFF ;T$$SPL 0 MOV U.TTAB-U.TSTA(R5),R3 ;;;GET TABUF POINTER$ BEQ I1DEF1 ;;;IF EQ, NONE...SKIP2 BIT #1,R3 ;;;IS THIS A SINGLE-CHARACTER TABUF?; BNE I1BEEP ;;;IF NE, YES...TABUF IS FULL SO RING A BELL .ENDC ;T$$SPL2 TSTB 2(R3) ;;;ANY CHARACTERS ALREADY BUFFERED?; BNE I1BUFR ;;;IF NE, YES...SKIP TO BUFFER THIS ONE ALSOC; G; I1DEF1 - NOTHING IS CURRENTLY BUFFERED. CHECK TO SEE IF WE NEED TOF7; REQUEST A FORK FOR AN INPUT COUNT STATE TRANSITION.O;F I1DEF1:F .IF DF T$$ICS  ASSUME S1.IBY,200'! TSTB (R5) ;;;IS INPUT ALREADY BUSY?,2" BMI 10$ ;;;IF MI, YES...WON'T NEED TO SEND ICS9# BIT #S3.ICE,4(R5) ;;;IS INPUT COUNT STATE AST ENABLED?S7$ BEQ 10$ ;;;IF EQ, NO...TRY TO PROCESS CHARACTER NOW;%& .IF DF T$$SCA'B( BIT #S5.TMM,U.TST5-U.TSTA(R5) ;;;TERMINAL IN TERM. MANGT. MODE?+) BNE 10$ ;;;NE -> YES= -> DON'T SENT ICSU*+ .ENDC ;T$$SCA,A- MOV #FR.ICS,R3 ;;;SET REQUEST FOR INPUT COUNT STATE TRANSITIONO!. CALL FORK ;;;REQUEST THE FORK$:/ BR I1BUFR ;;;CAN'T PROCESS CHARACTER NOW, SO BUFFER IT010$:12 .ENDC ;T$$ICS34;.A5; CHECK TO SEE IF CURRENT CHARACTER CAN BE PROCESSED RIGHT AWAYA6;T37 CALL IPROC ;;;CAN WE PROCESS THE CHARACTER NOW? '8 BCC ICHAR2 ;;;IF CC, YES...GO DO IT9;TQ:; I1BUFR - CHARACTER CANNOT BE PROCESSED NOW. PUT IT IN THE TYPE-AHEAD BUFFER.Y;;> <I1BUFR: => .IF DF T$$RED?F@ BIT #S5.BCC!S5.DAO!S5.VER,U.TST5-U.TSTA(R5) ;;;PREVIOUS HARD ERROR?4A BNE I1BEEP ;;;IF NE, YES...REJECT THIS CHARACTER2B MOV R2,-(SP) ;;;COPY CHARACTER PLUS ERROR FLAGS:C CLRB (SP) ;;;CLEAR LOW BYTE - LEAVE FLAGS IN HIGH BYTEED BIS (SP)+,U.TST5-U.TSTA(R5) ;;;SAVE ERROR FLAGS (IF ANY) FOR LATERPEF .ENDC ;T$$REDG=H CALL PCTAB ;;;PUT THIS CHARACTER IN THE TYPE-AHEAD BUFFERC;I BCS I1BEEP ;;;IF CS, TYPE-AHEAD BUFFER FULL...RING BELLUJI1RET:K RETURN ;;;ALL DONEFL;$>M; SOME EVENT REQUIRES ECHOING A BELL AT THE USER'S TERMINAL.N;H OI1BEEP:4P CALLR BELL ;;;SOME ERROR REQUIRES ECHOING A BELLQ.PAGE,1R .SBTTL . SPECIAL CHARACTER PROCESSING ROUTINESS'S .SBTTL . I1CTS - CONTROL-S HANDLINGGT;E9U; I1CTSL - LOCK OUT INTERRUPTS AND STOP TERMINAL OUTPUTYV; WI1CTSL:#X CALL LOCKI ;LOCK OUT INTERRUPTS;YI1CTS:*Z BIS #S2.CTS,2(R5) ;;;SET CONTROL-S FLAG0[ MOV #CT.STP,R2 ;;;SET INDEX FOR "STOP OUTPUT"3\ CALLR CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINEO]'^ .SBTTL . I1CTQ - CONTROL-Q HANDLINGS_;I;`; I1CTQL - LOCK OUT INTERRUPTS AND RESUME TERMINAL OUTPUT a;N bI1CTQL::#c CALL LOCKI ;LOCK OUT INTERRUPTS dI1CTQ:,e BIC #S2.CTS,2(R5) ;;;CLEAR CONTROL-S FLAG2f MOV #CT.RES,R2 ;;;SET INDEX FOR "RESUME OUTPUT"Bg BITB #US.OIU,U.STS-U.TSTA(R5) ;;;EXPECTING AN OUTPUT INTERRUPT?&h BNE I1RET ;;;IF NE, NO...JUST EXIT iI1CTRD:T3j CALLR CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINEOkl.PAGEL'm .SBTT00R}|{ccccL . I1CTO - CONTROL-O HANDLINGTn;Ko; I1CTO - PROCESS OUTPUT DISCARD REQUEST. IF TASK OUTPUT IS IN PROGRESS,ECp; IT IS ABORTED. IF THE TERMINAL IS ATTACHED, THE OUTPUT DISCARD;@q; STATE FLAG IS COMPLEMENTED TO ENABLE/DISABLE FURTHER OUTPUT.r; sI1CTO:4t TST U.ATT-U.TSTA(R5) ;;;IS THE TERMINAL ATTACHED?4u BEQ 10$ ;;;IF EQ, NO...JUST ABORT CURRENT OUTPUT:v BIT #S2.CTO,2(R5) ;;;IS OUTPUT ALREADY BEING DISCARDED?9w BNE 30$ ;;;IF NE, YES...SKIP TO ENABLE FURTHER OUTPUT:x BIS #S2.CTO,2(R5) ;;;SET FLAG TO DISABLE FURTHER OUTPUTy10$:z{ .IF DF T$$SPL|,} MOV #120000,R4 ;;;SET POINTER TO THE UCBX~ .IFF ;T$$SPLT5 MOV U.TUX-U.TSTA(R5),R4 ;;;GET POINTER TO THE UCBX - BEQ 40$ ;;;IF EQ, NONE...IGNORE CONTROL-O .ENDC ;T$$SPL0 MOV U.TCO(R4),R3 ;;;GET CURRENT OUTPUT PACKET6 BEQ 40$ ;;;IF EQ, NOT DOING TASK OUTPUT...ALL DONEB BITB #US.OIU,U.STS-U.TSTA(R5) ;;;EXPECTING AN OUTPUT INTERRUPT?# BNE 40$ ;;;IF NE, NO...ALL DONET .IF DF T$$RPR4 TST U.TFPB(R4) ;;;IS OUTPUT FROM A READ W/PROMPT?: BNE 20$ ;;;IF NE, YES...CONTROL-O IS IGNORED DURING IT .ENDC ;T$$RPR< BITB #TF.WBT,I.FCN(R3) ;;;WRITE-BREAKTHROUGH IN PROGRESS?, BNE 40$ ;;;IF NE, YES...IGNORE CONTROL-O20$:6 INC (R3) ;;;SET OUTPUT COMPLETION STATUS TO IS.SUC CALL ABOX ;;;ABORT OUTPUT + CALLR ODONE ;;;SIMULATE FINAL INTERRUPT ;I'; EXIT FROM THE OUTPUT DISCARD STATE. ;R30$:1 BIC #S2.CTO,2(R5) ;;;CLEAR OUTPUT DISCARD FLAG$40$:  RETURNT.PAGE;' .SBTTL . I1CTC - CONTROL-C HANDLING2;;J; I1CTC - FLUSH TYPE-AHEAD BUFFER, THEN PASS CONTROL-C TO INPUT PROCESS.;TI1CTC: .IF DF T$$SCA< BIT #S3.TME,4(R5) ;;;IS TERMINAL MANAGEMENT MODE ENABLED?< BNE I1DEF ;;;IF NE, YES...DON'T RECOGNIZE CONTROL-C HERE .ENDC ;T$$SCA CALL I1CTX1 ;;;FLUSH TABUF1 CALL I1CTQ ;;;RESUME OUTPUT IF IT WAS STOPPEDT' MOVB #CH.CTC,R2 ;;;RESTORE CHARACTER2) BR I1DEF1 ;;;GO PROCESS THE CONTROL-C' .SBTTL . I1CTX - CONTROL-X HANDLINGC;NN; I1CTXL - FLUSH TYPE-AHEAD BUFFER AND ENABLE UNSOLICITED ASTS IF NECESSARY.;N I1CTXL::# CALL LOCKI ;LOCK OUT INTERRUPTSAI1CTX: I1CTX1:) .IF DF T$$REDC BIC #S5.BCC!S5.DAO!S5.VER,U.TST5-U.TSTA(R5) ;;;CLEAR ERROR FLAGS- .ENDC ;T$$RED;?; UNLOCK UNSOLICITED INPUT AST CONTROL BLOCK IF THERE IS ONE. ;  .IF DF T$$CCA .IF DF T$$SPLA MOV 120000+U.TAST,R3 ;;;GET UNSOLICITED INPUT AST BLOCK IF ONE  .IFF ;T$$SPLN& MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX! BEQ 10$ ;;;IF EQ, NONE...SKIPI> MOV U.TAST(R4),R3 ;;;GET UNSOLICITED INPUT AST BLOCK IF ONE .ENDC ;T$$SPL! BEQ 10$ ;;;IF EQ, NONE...SKIPBE BICB #AF.LCK,A.PRM+5(R3) ;;;UNLOCK AST BLOCK IN CASE IT WAS LOCKED10$: .ENDC ;T$$CCA;SL; FLUSH THE TYPE-AHEAD BUFFER BY RESETTING THE FILL AND RETRIEVAL POINTERSJ; AND THE NUMBER OF ACTIVE BYTES. ALSO CALL SNDXON WHICH WILL OUTPUT AN-; XON IF WE HAVE PREVIOUSLY OUTPUT AN XOFF.;U .IF DF T$$SPL0 MOV #120000+U.TTBF,R3 ;;;SET POINTER TO TABUF .IFF ;T$$SPLN0 MOV U.TTAB-U.TSTA(R5),R3 ;;;GET TABUF POINTER- BEQ 20$ ;;;IF EQ, NONE...NOTHING TO RESETC2 BIT #1,R3 ;;;IS THIS A SINGLE-CHARACTER TABUF?4 BEQ 30$ ;;;IF EQ, NO...SKIP TO RESET LARGE TABUF8 CLR U.TTAB-U.TSTA(R5) ;;;FLUSH SINGLE-CHARACTER TABUF20$: RETURN ;;;ALL DONEU30$: .ENDC ;T$$SPL8 CLR (R3)+ ;;;INITIALIZE STORE AND RETRIEVAL POINTERS- CLRB (R3) ;;;CLEAR NUMBER OF ACTIVE BYTES, CALLR SNDXON ;;;SEND AN XON IF NECESSARY.PAGE' .SBTTL TERMINAL DRIVER INPUT PROCESSA? .SBTTL . ICHAR2 - INITIALIZATION AND INPUT STATE RECOGNITIONG;E;+7; **-ICHAR2 - INITIATE PROCESSING OF INPUT CHARACTER.$;IN; THIS ROUTINE INITIATES PROCESSING OF A CHARACTER ON THE "INSIDE" (SOFTWAREN; SIDE) OF THE TYPE-AHEAD BUFFER. IT IS ENTERED FROM "I1DEF" ABOVE AND FROML; "NXTIC" IN MODULE TT00Z};}|tt tfDATAODN WHEN A CHARACTER HAS BEEN REMOVED FROM THE TYPE-L; AHEAD BUFFER FOR PROCESSING. AN ALTERNATE ENTRY POINT "ICH2A" IS CALLEDG; DURING POST-FORK PROCESSING (ROUTINE "FPPFP" IN MODULE TTCIS). THEI'; FOLLOWING ACTIONS MAY BE PERFORMED:G;EH; 1. IF RECEIVER ERROR DETECTION IS SUPPORTED (T$$RED) AND THE CURRENT?; CHARACTER CAUSED AN ERROR, THE PENDING INPUT IS TERMINATEDS+; WITH AN APPROPRIATE COMPLETION STATUS.UE; 2. CONVERSION FROM LOWER TO UPPER CASE IS PERFORMED IF NECESSARY. B; 3. THE CHARACTER IS SAVED IN THE SINGLE-CHARACTER ECHO BUFFER.2; 4. THE INTER-CHARACTER ARRIVAL TIMER IS RESET.F ; 5. DISPATCH TO A PROCESSING ROUTINE DEPENDING ON THE CURRENT INPUT4 ; STATE OR THE TYPE OF CHARACTER BEING PROCESSED.E ; 6. PASS CONTROL TO "I2ECHO" TO INITIATE NECESSARY ECHOING FOR THET ; INPUT CHARACTER.T ;U ; INPUTS:; R2 = CHARACTERT$; R5 => U.TSTA OF THE TERMINAL UCB<; IF THE CHARACTER WILL NEED ECHOING, OUTPUT MUST BE IDLE.;E ; OUTPUTS:S3; R2 = CHARACTER (IF CONTROL PASSED TO "I2ECHO")H; R4 => UCBX FOR THE TERMINALI;C#; REGISTERS ALTERED: R2, R3, R4 ;-; ICHAR2:: .IF DF T$$SPL, MOV #120000,R4 ;;;SET POINTER TO THE UCBX  .IFF ;T$$SPLE!." MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX POINTER6# BEQ I1RET ;;;IF EQ, NONE...RETURN (COULD HAPPEN.../$ ;;; ...WHEN CTRL-C IS TYPED ON AN IDLE...A*% ;;; ...SLAVED TERMINAL, FOR EXAMPLE)&' .IFTF ;T$$SPL() .IF DF T$$RED*+;TL,; EXAMINE THE INPUT CHARACTER TO DETECT A HARD RECEIVE ERROR. IF THERE IS@-; ONE, TERMINATE THE CURRENT INPUT WITH AN APPROPRIATE STATUS..; ;/ BIT #S5.BCC!S5.DAO!S5.VER,R2 ;;;ANY HARD RECEIVE ERRORS?S.0 BEQ 20$ ;;;IF EQ, NO...SKIP ERROR CHECKING91 MOV #IE.DAO&377,R3 ;;;ASSUME ERROR DUE TO DATA OVERRUNR2 ASSUME S5.DAO,400003 ROL R2 ;;;DATA OVERRUN?;(4 BMI 10$ ;;;IF MI, YES...RETURN ERROR65 MOV #IE.BCC&377,R3 ;;;ASSUME FRAMING ERROR OCCURRED6 ASSUME S5.BCC,S5.DAO/2R7 ROL R2 ;;;FRAMING ERROR?(8 BMI 10$ ;;;IF MI, YES...RETURN ERROR99 MOV #IE.VER&377,R3 ;;;ELSE, ERROR MUST BE PARITY ERRORT:10$:; ASSUME U.TCI,0$< MOV R3,@(R4)+ ;;;STORE ERROR CODE)= JMP IDONE ;;;FINISH THE INPUT REQUESTI>20$:?@ .ENDC ;T$$REDAB .IFT ;T$$SPLRCBD MOVB R2,U.TECO-U.TSTA(R5) ;;;SAVE THE CHARACTER BEING PROCESSEDEF .IFF ;T$$SPLG;H MOVB R2,U.TECB(R4) ;;;SAVE THE CHARACTER BEING PROCESSED;IJ .ENDC ;T$$SPLKL;,M; RESET THE INTER-CHARACTER ARRIVAL TIMER.N;RO .IF NE T$$UTOP4Q MOVB #T$$UTO,U.TITI(R4) ;;;INITIALIZE INPUT TIMERRS .ENDC ;T$$UTOTU ASSUME S1.USI,100000./V TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?J W BMI 30$ ;;;IF MI, YES...SKIPX ASSUME U.TCI,03Y MOV (R4),R3 ;;;GET CURRENT INPUT REQUEST PACKETU?Z MOVB I.PRM+6(R3),U.TITI(R4) ;;;INIT USER-DEFINED TIMER VALUEF[30$:\;/]; DETERMINE ACTION DEPENDENT ON U.TSTA FLAGS.N^;C_` .IF DF T$$ACDaCb MOV #UA.PRO!UA.ECH!UA.PUT,U.AFLG-U.TSTA(R5) ;;;SET DEFAULT FLAGS.*c BIT #S1.RNE,(R5) ;;;DOING READ NO ECHO?d BEQ 35$ ;;;BR IF NOR4e BIC #UA.ECH,U.AFLG-U.TSTA(R5) ;;;INDICATE NO ECHOf35$::g TST U.ACB-U.TSTA(R5) ;;;DOES THIS TERMINAL HAVE AN ACD?.h BEQ 40$ ;;;IF EQ, NO...SKIP ACD PROCESSING4i MOV R0,-(SP) ;;;SAVE REGISTER NEEDED FOR ACD CALL9j MOV #A.PROC,R0 ;;;SET CHARACTER PROCESSING ENTRY POINT:k CALL $SWACD ;;;CALL ACDD#l MOV (SP)+,R0 ;;;RESTORE REGISTERAm BIT #UA.PRO,U.AFLG-U.TSTA(R5) ;;;PROCESS THIS CHARACTER AS IS?)4n BEQ I2ECHO ;;;IF EQ, NO...TREAT AS READ-PASS-ALLo40$:pq .ENDC ;T$$ACDr,s BIT #S3.RUB,4(R5) ;;;RUB-OUT IN PROGRESS?t BEQ 50$ ;;;SKIP IF NOT$u JMP I2RUB1 ;;;DO RUBOUT SEQUENCEv50$:w .IF DF T$$ESCx-y BIT #S1.ESC,(R5) ;;;IN AN ESCAPE SEQUENCE?Pz BEQ 60$ ;;;IF EQ, NO...SKIP 3{ JMP I2ESC2 ;;;CONTINUE WITH THE ESCAPE SEQUENCEN|60$:}~ .IFTF ;T$$ESC .IF DF T$$OOB ;SA458 ;SA458. MOV R4,-(SP) ;;;SAVE REGISTERS... ;SA4588 MOV R0,-(SP) ;;;THAT AR00b}|{ccccE DESTROYED BY OOBCHK ;SA4580 CALL OOBCHK ;;;WAS THIS CHAR. OOB? ;SA458. MOV (SP)+,R0 ;;;RESTORE REGISTERS ;SA458" MOV (SP)+,R4 ;;;... ;SA4587 BCS I2ECHO ;;;CS->OOB->NO SPECIAL FUNCTIONS ;SA458T ;SA458 .ENDC ;T$$OOB ;SA458 ;SA4582 BIT #S1.RST,(R5) ;;;READ WITH TERMINATOR TABLE?< BEQ 70$ ;;;IF EQ, NOT DOING READ-WITH-TERMINATORS...SKIP .IFT ;T$$ESC B; IF THIS IS NOT AN EXTENDED I/O, CHECK FOR SPECIAL TERMINATORS.@; IF THIS IS EXTENDED I/O, AND THE CHARACTER IS AN ESCAPE WITHC; ESCAPE SEQUENCES RECOGNIZED, ALLOW THIS TO START AN ESCAPE SEQ4!; RATHER THAN TERMINATE A READ.4 .IF DF T$$EIO( BIT #S6.EIO,U.TST6-U.TSTA(R5) ;;;EIO?0 BEQ 65$ ;;;EQ, NOT EIO, CHECK FOR TERMINATORF BIT #U2.ESC,U.CW2-U.TSTA(R5) ;;;DOES TERMINAL GENERATE ESCAPE SEQ.?# BEQ 65$ ;;;IF EQ, CHECK FOR RST-7 BIT #S1.RES,(R5) ;;;DOES TASK WANT ESCAPE SEQUENCES? ) BEQ 65$ ;;;IF EQ,NO .. CHECK FOR RSTE( CMPB R2,#CH.ESC ;;;IS THIS AN ESCAPE?) BEQ 70$ ;;;IF ESC, SKIP CHECK FOR RSTA) CMPB R2,#233 ;;;IS THIS A CSI ESCAPE?R) BEQ 70$ ;;;IF CSI, SKIP CHECK FOR RST 65$: .ENDC ;T$$EIO .ENDC ;T$$ESC0 CALL I2RST ;;;CHECK FOR A SPECIAL TERMINATOR3 ;;;IF WE RETURN, CHARACTER WAS NOT TERMINATOR(+ ;;;IF TERMINATOR, STATUS HAS BEEN SET70$:6 BIT #S1.PTH,(R5) ;;;TERMINAL IN PASSTHRU ? ;SA468; BNE I2ECHO ;;;IF NE, YES...PROCESS CHARACTER NOW ;**-1O> BIT #S1.RSP,(R5) ;;;TERMINAL IN SPECIAL PROCESSING? ;SA468= BNE CASCHK ;;;NE => YES CHECK FOR CASE CONVERSION ;SA468 ; .SBTTL . ICH2A - DISPATCH DEPENDING ON CURRENT CHARACTER;NL; ICH2A - DETERMINE ACTION DEPENDENT ON CHARACTER. SPECIAL CHARACTERS AREF; DIVIDED INTO TWO DISPATCH TABLES. IF THE CURRENT CHARACTER IS NOTC; IN THE FIRST TABLE, THE DISPATCH WILL BE TO "EDDEF". HERE, THETD; EDIT CHARACTER (OTHER THAN ^R, ^U, AND DELETE) DISPATCH TABLE ISD; CHECKED. IF NOT IN THAT TABLE, PROCESSING CONTINUES AT "I2DEF".;N  .ENABL LSBB .IF DF T$$EIO: BIT #S1.RNF,(R5) ;;;ARE WE DOING A READ WITH NO FILTER?< BNE EDDEF ;;;IF NE, YES...SKIP THE CHECK FOR EDIT CHARS. .ENDC ;T$$EIO ICH2A:: = MOV #EDCRT,R3 ;;;POINT TO EDIT CHARACTER RECOGNITION TABLEI0 CMPB R2,#CH.SP ;;;IS CHARACTER IN THIS TABLE?* BLO 10$ ;;;IF LO, YES...SCAN THE TABLE2 CMPB R2,#CH.RUB ;;;ELSE, IS CHARACTER A RUBOUT?9 BNE I2DEF ;;;IF NE, NO...MUST BE A "NORMAL" CHARACTERE$ BR 10$ ;;;COULD BE IN THIS TABLE;I; EDDEF - CHARACTER IS NOT IN FIRST RECOGNITION TABLE. SEE IF IT IS AN :; ENABLED EDIT CHARACTER (OTHER THAN ^R, ^U, OR RUBOUT).;E EDDEF:: 6 MOV #I2CRT,R3 ;;;ASSUME WE WANT TO SCAN FIRST TABLE10$:3 CALLR CHRDSP ;;;DISPATCH ACCORDING TO CHARACTER   .DSABL LSBR; R; I2DEF - IF THE TERMINAL DOES NOT SUPPORT LOWERCASE, SEE IF THE INPUT CHARACTERF; IS ONE OF THE ALTERNATE ESCAPE CHARACTERS (RIGHT BRACE AND TILDE).;HI; EKDEF - COME HERE TO ECHO TERMINATOR IN READ WITH SPECIAL TERMINATORS ;T EKDEF::E I2DEF::.+ CMPB R2,#233 ;;;SPECIAL CASE CSI ESCAPER) BNE CASCHK ;;;BRANCH AROUND ;SA468D8 JMP I2ESC ;;;TO ALLOW IT TO START ESCAPE SEQ. ;**-1CASCHK: ;SA468S .IF DF T$$EIO ;**-1R? BIT #S6.RLU,U.TST6-U.TSTA(R5) ;;;DOING CONVERT TO UPPERCASE?T BNE 5$ ;;;BR IF YESF .ENDC ;T$$EIOC BIT #U2.LWC,U.CW2-U.TSTA(R5) ;;;DOES TERMINAL SUPPORT LOWERCASE?7 BNE I2ECHO ;;;IF NE, YES...SKIP OTHER ESCAPE CHECKS 5$: ;SA468> BIT #S1.RSP,(R5) ;;;TERMINAL IN SPECIAL PROCESSING? ;SA468C BNE I2CASE ;;;NE => YES => NOT TERM BUT NEEDS CONVERSION ;SA468C: CMPB R2,#CH.RBR ;;;IS CHARACTER A RIGHT BRACE? ;SA4685 BEQ 10$ ;;;IF EQ, YES...TREAT AS AN ESCAPE ;**-1T+ CMPB R2,#CH.TLD ;;;IS CHARACTER A TILDE?O8 BNE I2CASE ;;;IF NE, NO...SKIP TO DO CASE CONVERSION) ;;;OTHERWISE, TREAT IT AS AN ESCAPED10$:8 JMP I2ESC1 ;;;PROCESS ESCAPE CHARACTER A00j};}|tt tfDATAS TERMINATOR;T5; I2CASE - CONVERT LOWER TO UPPER CASE IF REQUIRED.R;5 I2CASE:A3 CMPB R2,#340 ;;;EIGHT-BIT LOWER CASE CHARACTER?E< BHI 10$ ;;;IF HIS, YES...CONVERT TO EIGHT-BIT UPPER CASE) CMPB R2,#CH.LCZ ;;;UPPER END GRAPHICS?4, BHI I2ECHO ;;;IF HI, YES...DON'T CONVERT( CMPB R2,#CH.LCA ;;;LOWER CASE LETTER?+ BLO I2ECHO ;;;IF LO, NO...DON'T CONVERT.10$:= BICB #40,R2 ;;;CONVERT CHARACTER FROM LOWER TO UPPER CASED .IF DF T$$SPL; MOVB R2,U.TECO-U.TSTA(R5) ;;;UPDATE SAVED CHARACTER ALSOC .IFF ;T$$SPL 4 MOVB R2,U.TECB(R4) ;;;UPDATE SAVED CHARACTER ALSO .ENDC ;T$$SPL;EL; FALL THRU TO "I2ECHO" TO PROCESS CHARACTER WITHOUT SPECIAL SIGNIFICANCE.;;.PAGEN8 .SBTTL . I2ECHO - INITIATE ECHO OF AN INPUT CHARACTER;C;-O; **-I2ECHO - PUT CHARACTER IN INPUT BUFFER AND INITIATE ECHOING IF NECESSARY0;N; THIS ROUTINE PROCESSES A CHARACTER THAT HAD NO SPECIAL SIGNIFICANCE DURINGI; PROCESSING IN "ICHAR2" AND "ICH2A". THE FOLLOWING ACTIONS MAY OCCUR:; ;; 1. THE CHARACTER IS PLACED IN THE CURRENT INPUT BUFFER. C; 2. IF ECHO IS SUPPRESSED, A TRANSFER IS MADE TO THE "ECHO DONE"O7; PROCESSING ROUTINES TO CHECK FOR INPUT COMPLETION.G@; 3. ECHO OF THE CHARACTER OR AN EXPANSION OF THE CHARACTER IS ; INITIATED.E ; ; INPUTS: ; R2 = CHARACTERN ; R4 => UCBX FOR THE TERMINAL$; R5 => U.TSTA OF THE TERMINAL UCB0; IF ECHOING IS REQUIRED, OUTPUT MUST BE FREE.;I; OUTPUTS: NONEC; ; REGISTERS MODIFIED: R2, R3;-; I2ECHO:A .IF DF T$$ACDB BIT #UA.PUT,U.AFLG-U.TSTA(R5) ;;;PUT CHARACTER IN INPUT BUFFER? BEQ 10$ ;;;IF EQ, NO...SKIPS .IFTF ;T$$ACD8 BIT #S1.RST,(R5) ;;;DOING READ W/ SPECIAL TERMINATORS.  BEQ 5$ ;;;IF NOT, THIS SHOULD GO IN BUFFER!" ASSUME U.TCI,02#%$ TST @(R4) ;;;HAS STATUS BEEN SET?I/% BNE 10$ ;;;IF IT HAS, THIS WAS A TERMINATORF&5$:G0' CALL PUTNIC ;;;PUT CHARACTER IN INPUT BUFFER(10$:)* .IFT ;T$$ACDS+;, BIT #UA.SPE,U.AFLG-U.TSTA(R5) ;;;SPECIAL ECHO REQUESTED?A"- BEQ I2ECHA ;;;IF EQ, NO...SKIP.I2SPE:3/ MOV U.ACB-U.TSTA(R5),R2 ;;;GET ACD CONTROL BLOCKOA0 ADD #A.IMAP,R2 ;;;POINT TO INTERRUPT BUFFER PARAMETERS OFFSETSA;1 MOV (R2)+,U.TOP(R4) ;;;SET ECHO BUFFER APR BIAS (A.IMAP)O32 MOV (R2)+,R3 ;;;SET ECHO BUFFER ADDRESS (A.IBUF) 23 MOV (R2),R2 ;;;SET ECHO BUFFER LENGTH (A.ILEN);4 CALLR MECHO ;;;OUTPUT THE SPECIAL ECHO USING MULTI-ECHOT 5I2ECHA: 76 BIT #UA.ECH,U.AFLG-U.TSTA(R5) ;;;ECHO THE CHARACTER?U67 BEQ ECHD2 ;;;IF EQ, NO...PRETEND AN ECHO COMPLETED89 .ENDC ;T$$ACD:*; BIT #S1.RNE,(R5) ;;;IS ECHO SUPPRESSED?7< BNE ECHD2 ;;;IF NE, YES...PRETEND AN ECHO COMPLETEDP4= BIT #S1.PTH,(R5) ;;;IS TERMINAL IN PASSTHRU MODE?7> BNE I2ECHC ;;;IF NE, YES...ECHO CHARACTER AS ITSELFS?;HR@; I2EXPC - PERFORM CHARACTER EXPANSION AND INITIATE ECHO OF CHARACTER OR STRING.A;M BI2EXPC:T=C CALL EXPCHR ;;;EXPAND CHARACTER TO GET PROPER ECHO STRINGE9D BEQ I2ECHC ;;;IF EQ, SKIP TO ECHO CHARACTER AS ITSELF 9E BCC 10$ ;;;IF CC, NO DEFERRED ECHO IS REQUIRED...SKIPA7F BIS #S1.DEC,(R5) ;;;INDICATE DEFERRED ECHO IS NEEDEDEG10$:6H CALLR ECHSTR ;;;ECHO STRING DESCRIBED BY R2 AND R3I;5KJ; I2ECHC - ECHO THE CHARACTER STORED IN THE SINGLE-CHARACTER ECHO BUFFER.CK;S LI2ECHC:MN .IF DF T$$SPLO4P MOV R5,R3 ;;;SET UP R3 TO POINT TO THE SINGLE...@Q ADD #U.TECO-U.TSTA,R3 ;;; ...CHARACTER ECHO BUFFER IN THE UCBRS .IFF ;T$$SPLET4U MOV R4,R3 ;;;SET UP R3 TO POINT TO THE SINGLE...:V ADD #U.TECB,R3 ;;; ...CHARACTER ECHO BUFFER IN THE UCBXWX .ENDC ;T$$SPLY>Z CALLR ECHCHR ;;;ECHO THE SINGLE CHARACTER POINTED TO BY R3[.PAGEN=\ .SBTTL . ECHD1 - COMPLETE PROCESSING OF AN INPUT CHARACTER ];D^;+@_; **-ECHD1 - PROCESS COMPLETION OF A CHARACTER OR STRING ECHO.`;LIa; THIS ROUTINE IS ENTERED WHEN AN ECHO IS DONE. IT PERFORMS ONE OF THEU?b; FOLLOWING ACTIONS (LISTED FROM HIGHEST TO LOWEST PRIORITY):$c;00r}|{cccc@d; 1. IF DEFERRED PROCESSING IS REQUIRED, PICK UP THE CHARACTER:e; SAVED IN THE SINGLE-CHARACTER ECHO BUFFER AND PROCESSf; IT FROM THE BEGINNING.HBg; 2. IF DEFERRED ECHO IS REQUIRED, JUST ECHO THE CHARACTER SAVED)h; IN THE SINGLE-CHARACTER ECHO BUFFER.UGi; 3. IF THE CURRENT INPUT HAS COMPLETED, REQUEST A FORK TO HANDLE IT.RHj; 4. DISPATCH ON THE CURRENT INPUT STATE VARIABLE (U.TISV). THIS WILLAk; EITHER CONTINUE ECHOING OF SPECIAL CASES (E.G. ^R AND ^U) ORTDl; WILL MAKE A FORK REQUEST TO GET THE NEXT AVAILABLE I/O REQUEST.Pm; THE ALTERNATE ENTRY POINT "ECHD2" IS ENTERED WHEN PROCESSING FOR A CHARACTER,n; IS COMPLETED AND NO ECHOING IS REQUIRED.o;D p; INPUTS:q; R4 => UCBX FOR THE TERMINALD$r; R5 => U.TSTA OF THE TERMINAL UCBs; S1.OBY = 0 (OUTPUT IDLE)t; u; OUTPUTS:Rv; UCB UPDATED AS REQUIREDw;. x; REGISTERS MODIFIED: R2, R3y;-z; {ECHD1::T6| MOVB 1(R5),R3 ;;;GET DEFERRED PROCESSING/ECHO FLAGS}~ .IF DF T$$ACD@ BIT #UA.CAL,U.AFLG-U.TSTA(R5) ;;;CALL ACD BACK FOR MORE ECHO? BEQ 10$ ;;;IF EQ, NO...SKIPH  MOV R0,-(SP) ;;;SAVE REGISTER3 MOV #A.CALL,R0 ;;;SET ECHO CALL BACK ENTRY POINTI CALL $SWACD ;;;CALL THE ACD=# MOV (SP)+,R0 ;;;RESTORE REGISTER.3 BR I2SPE ;;;BRANCH BACK TO CONTINUE ECHO OUTPUT)10$: .ENDC ;T$$ACD .IF DF T$$SPLG MOVB U.TECO-U.TSTA(R5),R2 ;;;RETRIEVE CHARACTER (IN CASE DEFERRED...5, ;;; ...PROCESSING OR ECHO IS REQUIRED) .IFF ;T$$SPL@ MOVB U.TECB(R4),R2 ;;;RETRIEVE CHARACTER (IN CASE DEFERRED..., ;;; ...PROCESSING OR ECHO IS REQUIRED) .ENDC ;T$$SPLB BIC #S1.DPR!S1.DEC,(R5) ;;;CLEAR DEFERRED PROCESSING/ECHO FLAGS ASSUME S1.DPR,400+ ROR R3 ;;;DEFERRED PROCESSING REQUIRED?;& BCS ICH2A ;;;IF CS, YES...GO DO IT ASSUME S1.DEC,S1.DPR*2% ROR R3 ;;;DEFERRED ECHO REQUIRED?O' BCS I2EXPC ;;;IF CS, YES...GO DO ITC;EE; ECHD2 - CHECK TO SEE IF THE CURRENT INPUT BUFFER HAS BEEN FILLED.T;ECHD2:;BH; EKESC,EKAES - ESCAPE OR ALTERNATE ESC WAS SEEN AS SPECIAL TERMINATOR;E EKESC::I EKAES:: .IF DF T$$ACD3 BIT #UA.COM,U.AFLG-U.TSTA(R5) ;;;COMPLETE INPUT?O BEQ 10$ ;;;IF EQ, NO...SKIPR3 MOV U.ACB-U.TSTA(R5),R3 ;;;GET ACD CONTROL BLOCKA4 MOV A.IOS(R3),@(R4)+ ;;;SET I/O COMPLETION STATUS& BR IDONE ;;;FORK TO COMPLETE INPUT10$: .ENDC ;T$$ACD ASSUME U.TCI,0 4 TSTB @(R4)+ ;;;HAS A COMPLETION STATUS BEEN SET?8 BNE IDONE ;;;IF NE, YES...FORK TO COMPLETE THE INPUT1 TST U.TIC-2(R4) ;;;IS THE CURRENT BUFFER FULL?T BNE 20$ ;;;IF NE, NO...SKIP3 BIT #S1.IBF,(R5) ;;;ARE WE DOING BUFFERED INPUT?A7 BEQ IDONE ;;;IF EQ, NO...FORK TO COMPLETE THE INPUTR;MG; WE ARE DOING BUFFERED INPUT, AND JUST FILLED UP THE CURRENT BUFFER. F; SEE IF THERE IS ANOTHER BUFFER LINKED TO THE CURRENT (COULD BE THEF; CASE IF THE OPERATOR DID RUBOUT OR CTRL-U, OR IF WE ARE PROCESSINGG; CTRL-R ECHO). IF THERE IS, UPDATE UCB. IF THERE IS NOT, FORK TO GETO; ANOTHER BUFFER.T;T ASSUME U.TIP,U.TCI+2T3 MOV @(R4)+,R2 ;;;GET NEXT BUFFER IF THERE IS ONE#< BEQ IDONE1 ;;;IF EQ, THERE IS NONE...FORK TO GET ANOTHER ASSUME U.TTIC,U.TIP+6% CMP (R4)+,(R4)+ ;;;POINT TO U.TTICB) CALL NXTIB ;;;START USING NEXT BUFFERN8 BEQ IDONE1 ;;;IF EQ, NOT ONE...WE ARE DONE AFTER ALL) CMP -(R4),-(R4) ;;;POINT BACK TO U.TIPP;RP; CONSULT INPUT STATE VARIABLE TO SEE WHAT TO DO NEXT. NOTE THAT IN AN ESCAPEP; SEQUENCE, THE STATE VARIABLE IS USED WHEN THE NEXT CHARACTER OF THE SEQUENCEN; ARRIVES...NOT WHEN A PREVIOUS CHARACTER HAS BEEN ECHOED, WHERE WE ARE NOW.N; SO IF WE ARE IN AN ESCAPE SEQUENCE, JUST FORK FOR THE NEXT REQUEST PACKET.;(20$:* TST -(R4) ;;;POINT BACK TO TOP OF UCBX .IF DF T$$ESC;IJ; THE FOLLOWING ASSUMES THAT THE FIRST ENTRY IN THE INPUT STATE DISPATCHI; TABLE POINTS TO "CFGRQ", WHICH WILL FORK TO GET A NEW REQUEST PACKET.N; - CLR R2 ;;;SET UP FOR STATE TABLE DISPATCH B BIT #00z};}|tt tfDATAS1.ESC,(R5) ;;;ARE WE IN THE MIDDLE OF AN ESCAPE SEQUENCE?9 BNE NXSTA1 ;;;IF NE, YES...SKIP NORMAL STATE DISPATCH  .ENDC ;T$$ESC;NR; NXSTAT - DISPATCH ON THE CURRENT VALUE OF THE INPUT STATE VARIABLE. THIS WILLN; SEQUENCE THROUGH THE INPUT STATES UNTIL IT FORKS FOR A NEW REQUEST PACKET.;U NXSTAT:E+ MOVB U.TISV(R4),R2 ;;;GET STATE VARIABLE  ASL R2 ;;;MAKE WORD INDEXW NXSTA1: 6 CALLR @ISDSP(R2) ;;;DISPATCH ON CURRENT INPUT STATEC .SBTTL . IDONE - QUEUE FORK REQUEST FOR INPUT REQUEST COMPLETIONA;AJ; IDONE - QUEUE A FORK REQUEST BECAUSE A TERMINATOR CHARACTER WAS SEEN.H; THE LINK WORD IN THE PACKET CONTAINS THE COMPLETION STATUS (IF IT IS<; A SOLICITED READ). THE INPUT STATE FLAGS ARE ALSO RESETM; IDONE1 - QUEUE A FORK REQUEST BECAUSE THE (CURRENT) INPUT BUFFER IS FULL.M;. IDONE:: 7 CALL IRESET ;;;RESET THE TERMINAL INPUT STATE FLAGS IDONE1:= MOV #FR.IRD,R3 ;;;FORK TO PROCESS INPUT REQUEST COMPLETIONB CALLR FORK ;;;DO ITR.PAGERA .SBTTL . SPECIAL INPUT STATE AND CHARACTER PROCESSING ROUTINES 2 .SBTTL . I2RST - READ WITH SPECIAL TERMINATORS;R;-;; **-I2RST - READ WITH SPECIAL TERMINATORS IS IN PROGRESSI; N; THIS ROUTINE CHECKS THE CURRENT CHARACTER AGAINST THE PRE-DEFINED "SPECIALJ; TERMINATORS" OR AGAINST THE CURRENT USER-SPECIFIED TERMINATOR TABLE TOL; SEE IF THE CURRENT INPUT REQUEST SHOULD BE COMPLETED. IF SO, AND IF THEQ; TERMINATOR IS NOT TO BE ECHOED, THE RETURN ADDRESS (FROM "ICHAR2") IS DELETED.N; AND THE INPUT IS TERMINATED. IF THE TERMINATOR NEEDS TO BE ECHOED, STATUSR; IS SET AND A RETURN TO ICHAR2 IS EXECUTED FOR ECHO AND TERMINATION. OTHERWISE,); THE CHARACTER IS RETURNED UNMODIFIED.U;C ; INPUTS:; R2 = CHARACTER ; R4 => UCBX FOR THE TERMINALM$; R5 => U.TSTA OF THE TERMINAL UCB ;I ; OUTPUTS: NONE ; ; REGISTERS MODIFIED: NONE ;-;EI2RST:4 MOV R3,-(SP) ;;;SAVE REGISTER USED BY THE ROUTINE8 TST U.TRTT(R4) ;;;USER-SPECIFIED TERMINATORS PRESENT? BEQ 10$ ;;;IF EQ, NO...SKIPE;I7; CHECK CHARACTER AGAINST USER-DEFINED TERMINATOR SET ;H2 MOV R2,R3 ;;;GET A COPY OF THE TYPED CHARACTER4 BIC #177417,R3 ;;;CLEAR ALL BUT HIGH ORDER 4 BITS .IF DF R$$EIS ASH #-3,R3 ;;;DIVIDE BY 8. .IFF ;R$$EIS. ASR R3 ;;;DIVIDE BY 8.  ASR R3 ;;;! ASR R3 ;;;"# .ENDC ;R$$EIS$8% ADD U.TRTT(R4),R3 ;;;ADD TABLE BASE ADDRESS TO OFFSET)& MOV R2,-(SP) ;;;SAVE CURRENT CHARACTER-7' BIC #177760,R2 ;;;THIS TIME LOOK AT LOW ORDER 4 BITS./( ASL R2 ;;;CONVERT FROM BYTE TO WORD OFFSETFA) BIT $BTMSK(R2),(R3) ;;;SEE IF MATCHES AGAINST TERMINATOR TABLED7* BEQ 30$ ;;;IF EQ, IT DOESN'T...PROCESS NORMAL CHAR. $+ MOV (SP)+,R2 ;;;RESTORE CHARACTER', BR 20$ ;;;CHARACTER IS A TERMINATORR-;.9.; CHECK CHARACTER AGAINST NORMAL "SPECIAL TERMINATORS". /;010$:/1 CMPB R2,#CH.SP ;;;IS IT A CONTROL CHARACTER?L.2 BLO 20$ ;;;IF LO, YES...IT IS A TERMINATOR13 CMPB R2,#CH.RBR ;;;IS IT A "NORMAL" CHARACTER?E24 BLO 40$ ;;;IF LO, YES...IT IS NOT A TERMINATOR%5 CMPB R2,#CH.RUB ;;;IS IT A RUBOUT?(.6 BEQ 20$ ;;;IF EQ, YES...IT IS A TERMINATOR;7 CMPB R2,# ;;;EIGHT-BIT NON-CONTROL CHARACTER? 48 BHIS 40$ ;;;IF HIS, YES...IT IS NOT A TERMINATOR09 CMPB R2,#200 ;;;EIGHT-BIT CONTROL CHARACTER?0: BHIS 20$ ;;;IF HIS, YES...IT IS A TERMINATOR>; BIT #U2.LWC,U.CW2-U.TSTA(R5) ;;;TERMINAL SUPPORT LOWERCASE?9< BNE 40$ ;;;IF NE, YES...175-176 ARE NORMAL CHARACTERSR=;SJ>; TERMINATOR FOUND - SET COMPLETION STATUS TO IS.SUC WITH THE TERMINATORL?; IN THE HIGH BYTE. ** NOTE ** THE CHARACTER IS NOT STORED IN THE BUFFER.@;MA20$:&B MOV R2,R3 ;;;GET COPY OF CHARACTER*C SWAB R3 ;;;GET TERMINATOR IN HIGH BYTED CLRB R3 ;;;CLEAR LOW BYTE$E INC R3 ;;;SET IS.SUC IN LOW BYTEFG ASSUME U.TCI,0 HI MOV R3,@(R4) ;;;STORE STATUSJ MOV (SP)+,R3 ;;;RESTORE R3 *K TST (SP)+ ;;;GET RID OF RETURN ADDRESS4L BIT #S1.TNE!S1.RNE,(R5) ;;;SHOULD THIS BE E00}|{ccccCHOED?M BNE 25$ ;;;IF NO ECHO BR>N MOV #EKCRT,R3 ;;;CHARACTER RECOGNITION TABLE FOR TERM.ECHO. O CALLR CHRDSP ;;;AND DISPATCHP25$:1Q BR IDONE ;;;REQUEST FORK FOR INPUT COMPLETIONTR30$:$S MOV (SP)+,R2 ;;;RESTORE CHARACTERT40$:#U MOV (SP)+,R3 ;;;RESTORE REGISTERT!V50$: RETURN ;;;BACK TO CALLER WX.PAGEA=Y .SBTTL . I2ESC* - ESCAPE SEQUENCE AND TERMINATOR HANDLINGPZ; [;-J\; **-I2ESC - REAL ESCAPE CHARACTER SEEN; POSSIBLY START ESCAPE SEQUENCE7]; **-I2AES - ALTERNATE ESCAPE CHARACTER WAS DETECTED 2^; **-I2ESC1 - TERMINATE INPUT WITH IS.ESC STATUS<_; **-I2ESC2 - CONTINUE PROCESSING OF INPUT ESCAPE SEQUENCE`;NKa; THESE ROUTINES HANDLE ESCAPE AND ESCAPE SEQUENCE PROCESSING AS FOLLOWS:Cb;TAc; 1. UPON ENTRY AT I2ESC, IF THE TERMINAL IS SET UP TO GENERATE;<d; ESCAPE SEQUENCES AND THE ATTACHED TASK CAN ACCEPT THEM,9e; ESCAPE SEQUENCE MODE IS ESTABLISHED. OTHERWISE, THE 6f; ESCAPE TERMINATES THE CURRENT INPUT VIA "I2ESC1".Ag; 2. ENTRY AT I2AES OCCURS IF AN ALTERNATE ESCAPE CHARACTER WAS h; (OCTAL 37) WAS DETECTED.HDi; 3. ENTRY AT I2ESC1 WILL CAUSE THE CURRENT INPUT TO BE TERMINATEDj; WITH A STATUS OF IS.ESC.SHk; 4. I2ESC2 IS ENTERED TO PROCESS SUBSEQUENT CHARACTERS OF THE CURRENT@l; ESCAPE SEQUENCE. SYNTAX RULES ARE CHECKED DEPENDING ON THE>m; INPUT STATE VARIABLE, U.TISV. WHEN THE LAST CHARACTER OF>n; A VALID SEQUENCE IS RECEIVED, THE INPUT IS COMPLETED WITHo; THE STATUS IS.ESQ.PDp; 5. A "RUBOUT" CHARACTER WILL CAUSE ALL CHARACTERS RECEIVED SINCE=q; AN ESCAPE CHARACTER TO BE REMOVED FROM THE INPUT BUFFER. Fr; 6. A SYNTAX ERROR WILL TERMINATE THE INPUT WITH THE STATUS IE.IES.s;S t; INPUTS:!u; R2 = CURRENT INPUT CHARACTERQv; R4 => UCBX FOR THE TERMINAL$w; R5 => U.TSTA OF THE TERMINAL UCBx;Ey; OUTPUTS: NONEz;P${; REGISTERS MODIFIED: R2, R3, R4|;-};E ~I2ESC::A .IF DF T$$ESCF BIT #U2.ESC,U.CW2-U.TSTA(R5) ;;;DOES TERMINAL GENERATE ESCAPE SEQ.?- BEQ I2ESC1 ;;;IF EQ, NO...TERMINATE INPUTD7 BIT #S1.RES,(R5) ;;;DOES TASK WANT ESCAPE SEQUENCES?N" BEQ I2ESC1 ;;;IF EQ, NO...SKIP ASSUME S1.USI,100000W/ TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?22 BMI I2ESCU ;;;IF MI, YES...TERMINATE THE INPUT10$:1 BIS #S1.ESC,(R5) ;;;ENTER ESCAPE SEQUENCE MODE  TSTB R2 ;;;IS THIS CSI ESC?S BPL I2ESC3 ;;;BR IF NO= MOVB #17,U.TISV(R4) ;;;ESTABLISH OFFSET FOR CSI ESC. SEC.C- BR I2ESC3 ;;;STORE THE CHARACTER AND EXITA;Q4; I2AES - ALTERNATE ESCAPE CHARACTER WAS DETECTED.;#3 .IFTF ;T$$ESC ;;;LABEL SHOULD ALWAYS BE DEFINEDI I2AES::, .IFT ;T$$ESC F BIT #U2.ESC,U.CW2-U.TSTA(R5) ;;;TERMINAL GENERATE ESCAPE SEQUENCES?; BEQ J2EDDF ;;;IF EQ, NO...PROCESS AS A NORMAL CHARACTERE .IFTF ;T$$ESC;E8; I2ESC1 - TERMINATE CURRENT INPUT WITH STATUS IS.ESC.;I I2ESC1:V5 BIT #S1.RST,(R5) ;;;READ WITH SPECIAL TERMINATORS?C BNE I2ESC3 ;;;BR IF SO (NE)A ASSUME U.TCI,0Q I2ESCU: 8 MOV #IS.ESC,@(R4)+ ;;;SET COMPLETION STATUS TO IS.ESC4 BR IDONE ;;;REQUEST A FORK TO COMPLETE THE INPUT .IFT ;T$$ESCF; A; I2ESC2 - PROCESS SUBSEQUENT CHARACTERS OF AN ESCAPE SEQUENCE.E;E I2ESC2:J. CMPB R2,#37 ;;;IS CHARACTER IN RANGE 0-37?2 BLO 50$ ;;;IF LO, YES...THIS IS A SYNTAX ERROR4 CMPB R2,#CH.RUB ;;;IS CURRENT CHARACTER A RUBOUT?< BEQ RUBESC ;;;IF EQ, YES...DELETE ENTIRE ESCAPE SEQUENCE0 MOVB U.TISV(R4),R3 ;;;GET CURRENT SYNTAX RULE2 BNE 10$ ;;;IF NE, NOT FIRST TIME THRU; SO SKIP4 CMPB U.TTYP-U.TSTA(R5),#T.VT61 ;;;IS THIS A VT61? BNE 10$ ;;;IF NE, NO...SKIPF4 MOV #-6,R3 ;;;SET UP TO ALLOW CERTAIN EXCEPTIONS10$:= ADD #ESCST,R3 ;;;SET POINTER INTO ESCAPE SYNTAX RULE TABLE;20$:4 CMPB R2,(R3)+ ;;;IS THE INPUT CHARACTER IN RANGE?+ BLO 30$ ;;;IF LO, NO...CHECK NEXT RANGEC CMPB R2,(R3)+ ;;;IN RANGE?B+ BHI 40$ ;;;IF HI, NO...CHECK NEXT RANGEPB MOVB (R3),U.TISV(R4) ;;;CHARACTER IS OK - SAVE NEXT SYNTAX RULE< BNE I2ESC3 ;;;IF NE,00};}|tt tfDATA NOT DONE YET...STORE CHAR. AND EXIT;(4; ESCAPE SEQUENCE IS COMPLETE - SET STATUS IS.ESQ.;S. MOV #IS.ESQ,@U.TCI(R4) ;;;SET RETURN STATUS( BR 60$ ;;;FINISH OFF ESCAPE SEQUENCE;NR; CHARACTER DIDN'T MATCH CURRENT RANGE - GET NEXT RANGE FOR CURRENT SYNTAX RULE.; 30$: INC R3 ;;;UPDATE POINTER40$:0 TSTB (R3)+ ;;;ANY MORE RANGES FOR THIS RULE?- BNE 20$ ;;;IF NE, YES...LOOP FOR NEXT ONE);SK; THE INPUT CHARACTER IS INVALID IN THE ESCAPE SEQUENCE PROCESSED SO FAR.TG; COMPLETE THE CURRENT INPUT REQUEST WITH COMPLETION STATUS "IE.IES". ;T50$:1 MOV #IE.IES&377,@U.TCI(R4) ;;;SET ERROR STATUS 60$:2 CALL I2ESCX ;;;GET OUT OF ESCAPE SEQUENCE MODE;CJ; I2ESC3 - STORE THE CURRENT CHARACTER OF THE ESCAPE SEQUENCE AND SEE IF,; THE CURRENT INPUT REQUEST HAS COMPLETED.; .IFTF ;T$$ESC I2ESC3:H: CALL PUTNIC ;;;STORE CHARACTER AND DON'T ECHO ANYTHING: JMP ECHD2 ;;;CHECK FOR COMPLETION OF THE INPUT REQUEST .IFT ;T$$ESC;EN; RUBESC - DELETE THE ENTIRE ESCAPE SEQUENCE FROM INPUT BUFFER AND EXIT FROM; ESCAPE SEQUENCE MODE. ;T RUBESC::) CALL GETPIC ;;;GET PREVIOUS CHARACTERS) CMPB R2,#CH.ESC ;;;IS THIS THE ESCAPE?E2 BNE RUBESC ;;;IF NE, NO...LOOP TILL WE FIND IT I2ESCX:H- BIC #S1.ESC,(R5) ;;;GET OUT OF ESCAPE MODE* CLRB U.TISV(R4) ;;;CLEAR STATE VARIABLE RETURN ;;;RETURNT J2EDDF:T= JMP I2DEF ;;;CONTINUE INPUT CHARACTER THROUGH INPUT LOGICP .ENDC ;T$$ESC.PAGE: .SBTTL . I2CR - TERMINATE INPUT DUE TO CARRIAGE RETURN; P; I2CR - CARRIAGE RETURN HAS BEEN INPUT. TERMINATE INPUT WITH STATUS "IS.CR".;G  .ENABL LSBRI2CR::6 CLR -(SP) ;;;ZERO THE ECHO STRING ADJUSTMENT COUNT5 MOV #IS.CR,-(SP) ;;;SET COMPLETION STATUS TO IS.CRC! BR 10$ ;;;SKIP TO COMMON CODEM5 .SBTTL . I2CTZ - TERMINATE INPUT DUE TO CONTROL-Z ;RL; I2CTZ - CONTROL-Z HAS BEEN INPUT. TERMINATE INPUT WITH STATUS "IE.EOF".; I2CTZ::C6 MOV #2,-(SP) ;;;SET ^Z ECHO STRING ADJUSTMENT COUNT; MOV #IE.EOF&377,-(SP) ;;;SET COMPLETION STATUS TO IE.EOFH10$:4 BIT #S1.RST,(R5) ;;;WAS THIS READ W/ SPEC. TERMS?7 BEQ 12$ ;;;IF EQ, NO. THIS IS A TERMINATOR ;SA463R; ;SA463T; COME HERE IF DOING RST. WE HAVE 2 CASES; EITHER THIS IS NOT A TERMINATOR ;SA463N; AND IS AN INPUT CHARACTER (FIRST PASS THROUGH THIS CODE) OR ELSE, ;SA463Q; THIS IS THE SECOND TIME THROUGH...WE ARE DOING DEFERRED PROCESSING OF ;SA463:S; A TERMINATOR. WE END UP HERE FROM ECHD1 AND HAVE BYPASSED THE RST TEST. ;SA463;?; IF THIS IS THE CASE, A STATUS WILL HAVE BEEN SET. ;SA463;; ;SA463C+  TST (SP)+ ;;;GET RID OF STATUS ;**-1A'  TST @(R4) ;;;STATUS SET? ;SA463/  BNE 15$ ;;;NE => YES => TERMINATOR ;SA463I  ;SA4638  CALL PUTNIC ;;;AND PUT THIS NON-TERMINATOR IN BUFFER(  BIT #S1.RNE,(R5) ;;;ECHO SUPPRESSED?'  BEQ 15$ ;;;JOIN COMMON CODE TO ECHOE2  TST (SP)+ ;;;CLEAN STRING ADJUSTMENT OFF STACK$ JMP ECHD2 ;;;AND GET OUT OF HERE12$: ASSUME U.TCI,0;& MOV (SP)+,@(R4) ;;;ELSE, SET STATUS. BIT #S1.RNE!S1.TNE,(R5) ;;;ECHO SUPPRESSED?, BNE 30$ ;;;GO SET STATUS AND COMPLETE IO  BR 15$@; J; EKCR AND EKCTZ - OR ^Z WAS SPECIAL TERMINATOR. COME HERE TO ECHO; EKCR::2 CLR -(SP) ;;;ZERO ECHO STRING ADJUSTMENT COUNT BR 15$ ;;;JOIN COMMON CODE EKCTZ::P6 MOV #2,-(SP) ;;;SET ^Z ECHO STRING ADJUSTMENT COUNT15$:* CALL EXCR1 ;;;EXPAND A CARRIAGE RETURN3  BCC 20$ ;;;IF CC, NO LEADING LF REQUIRED...SKIP.<! BIS #S1.DPR,(R5) ;;;ELSE DEFER PROCESSING OF CR OR CTRL-Z&" CLR (SP) ;;;CLEAR ADJUSTMENT COUNT#20$:0$ ADD (SP),R2 ;;;ADJUST COUNT OF BYTES TO ECHO(% SUB (SP)+,R3 ;;;ADJUST BUFFER POINTER(& BR C2ECHS ;;;SKIP TO ECHO THE STRING'30$:( TST (SP)+ ;;;CLEAN STACK)+* JMP IDONE ;;;COMPLETE THE CURRENT INPUTO+, - .DSABL LSBM..PAGEP4/ .SBTTL . CONTROL-U AND CONTROL-R ECHO PROCESSING.0 .SBTTL . EDCTU - INITIALI00}|{ccccZE AND ECHO "^U"1;;J2; EDCTU - CONTROL-U HAS BEEN INPUT. INITIALIZE ECHO PROCESSING TO BEGIN33; ECHO OF "^U " OR "^U ".T4;C 5 .ENABL LSB 6EDCTU::277 MOVB #SV.CU1,U.TISV(R4) ;;;INITIALIZE STATE VARIABLEJ%8 MOV #ASCTU,R3 ;;;GET CTRL-U STRINGI9: .IF DF T$$CTR;< BR 20$ ;;;ECHO ^UE=.> .SBTTL . EDCTR - INITIALIZE AND ECHO "^R"?;OJ@; EDCTR - CONTROL-R HAS BEEN INPUT. INITIALIZE ECHO PROCESSING TO BEGIN'A; ECHO OF "^R " ORA-B; "^R ". C;E DEDCTR::I*E BIT #S1.RNE,(R5) ;;;IS ECHO SUPPRESSED?9F BEQ 10$ ;;;IF EQ, NO...WE CAN PERFORM THE ^R FUNCTIONB=G CALLR CFGRQ ;;;ELSE, IGNORE AND PROCESS AN OUTPUT REQUESTAH10$:;I MOV U.TIP+2(R4),U.TTOC(R4) ;;;SAVE POS. OF LAST BYTE + 1$7J MOVB #SV.CR1,U.TISV(R4) ;;;INITIALIZE STATE VARIABLE %K MOV #ASCTR,R3 ;;;GET CTRL-R STRINGDLM .ENDC ;T$$CTRNO20$:!P BIT #S2.FLF,2(R5) ;;;FORCE LF?Q BEQ 30$ ;;;IF EQ, NO...SKIPR3R BIS #S1.DPR,(R5) ;;;DEFER PROCESSING OF ^U OR ^R <S CALL EXPCHR ;;;EXPAND CHARACTER IN R2 (JUST TO FORCE LF)7T BR C2ECHS ;;;MAKE CALL TO ECHO THE EXPANSION STRINGOU30$:.V MOV R3,-(SP) ;;;SAVE ADDRESS OF ECHO STRINGW ASSUME U.TCI,0+X MOV (R4)+,R3 ;;;GET CURRENT INPUT PACKET .Y MOV #UPUNB,-(SP) ;;;ASSUME UNBUFFERED INPUT3Z BIT #S1.IBF,(R5) ;;;ARE WE DOING BUFFERED INPUT?L-[ BEQ 40$ ;;;IF EQ, NO...CORRECT ASSUMPTION&\ ADD #U.TFIB-2,R4 ;;;POINT TO U.TFIB)] MOV (R4),R2 ;;;GET FIRST INPUT BUFFER(^/_ MOV #FPSUI1,(SP) ;;;ASSUME UNSOLICITED INPUT `a ASSUME S1.USI,100000Sb(c TST (R5) ;;;DOING UNSOLICITED INPUT?.d BMI 40$ ;;;IF MI, YES...CORRECT ASSUMPTIONBe MOV I.PRM+4(R3),-(R4) ;;;SOLICITED INPUT - GET TOTAL BYTE COUNTf MOV #NXTIB,(SP) ;;;g40$:=h CALL @(SP)+ ;;;CALL UPUNB, FPSUI1, OR NXTIB TO UPDATE UCBFij .IF DF T$$SPLk)l MOV #120000,R4 ;;;RESTORE UCBX POINTERRmn .IFF ;T$$SPLAo2p MOV U.TUX-U.TSTA(R5),R4 ;;;RESTORE UCBX POINTERqr .ENDC ;T$$SPLs+t MOV (SP)+,R3 ;;;POINT TO ^U OR ^R STRINGN'u BIT #S1.RNE,(R5) ;;;ECHO SUPPRESSED?'v BNE I2CTUE ;;;Y - JUMP (MUST BE ^U)*w MOV #2,R2 ;;;LENGTH OF ^U OR ^R STRINGx;MLy; DON'T WORRY ABOUT UPDATING CURRENT HORIZONTAL POSITION FOR 2 CHARACTERS.@z; WE ARE GOING TO DO A CARRIAGE RETURN IMMEDIATELY AFTER THEM.{;D:| BR C2ECHS ;;;GO ECHO THE STRING DESCRIBED BY R2 AND R3}.PAGE 3~ .SBTTL . I2CTU1/I2CTR1 - ECHO AND FILLERST;,A; I2CTU1/I2CTR1 - "^R" OR "^U" HAS BEEN ECHOED. SET UP TO ECHOR%; A CARRIAGE-RETURN (PLUS FILLERS).#;E I2CTU1:: I2CTR1::1 INCB U.TISV(R4) ;;;UPDATE INPUT STATE VARIABLEV ASSUME S1.USI,100000R/ TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?C .IF DF R$$MPL!A$$CLIR BPL 50$ ;;;IF PL, NO...SKIPO;RK; IN ALTERNATE CLI SYSTEMS, THE CLI PROMPT IS NOT ASSUMED TO START WITH ANL; CARRIAGE RETURN, SO DO NOT OUTPUT ONE. RATHER, GO ON TO THE NEXT STATE.;L J2NXST:3 JMP NXSTAT ;;;DON'T GIVE GRATIS CARRIAGE RETURNT50$: .IFF ;R$$MPL!A$$CLI% BMI 70$ ;;;IF MI, YES...ECHO 1 .ENDC ;R$$MPL!A$$CLIA .IF DF T$$RPR/ TST U.TFPB(R4) ;;;READ W/PROMPT IN PROGRESS?D1 BNE 70$ ;;;IF NE, YES...DON'T SKIP NEXT STATEL .ENDC ;T$$RPR60$:0 INCB U.TISV(R4) ;;;BYPASS THE NEXT ECHO STATE70$:* CALL EXCR1 ;;;EXPAND A CARRIAGE-RETURN C2ECHS:S* CALLR ECHSTR ;;;ECHO STRING AND RETURN, .SBTTL . I2CTU2 - SET UP TO ECHO PROMPT;IL; I2CTU2 - "^U " HAS BEEN ECHOED. SEE IF PROMPT BUFFER NEEDS ECHOING.;I I2CTU2:: ASSUME S1.USI,100000;/ TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?U/ BPL I2CTR2 ;;;IF PL, NO...START PROMPT ECHO76 CLRB U.TFPB(R4) ;;;SET UP TO USE THE DEFAULT PROMPTC TSTB U.TFPB+1(R4) ;;;DID THE UNSOLICITED INPUT INTERRUPT A READ?E .IF DF T$$SER2 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$$SER600};}|tt tfDATA BEQ I2CTR2 ;;;IF EQ, NO...START ECHOING THE PROMPT80$: .IF DF R$$MPL!A$$CLI4 INCB U.TISV(R4) ;;;BYPASS CLI PROMPT OUTPUT STATE .ENDC ;R$$MPL!A$$CLI . BR 60$ ;;;SKIP TO OUTPUT A CARRIAGE RETURN, .SBTTL . I2CTR2 - SET UP TO ECHO PROMPT;1J; I2CTR2 - "^R " HAS BEEN ECHOED. INITIALIZE TO START OUTPUT OF THEF; CURRENT PROMPT BUFFER. THIS CODE IS ALSO ENTERED DURING CONTROL-U; ECHO PROCESSING.; I2CTR2::+ INCB U.TISV(R4) ;;;UPDATE STATE VARIABLEC;;L; RESET THE CURRENT HORIZONTAL POSITION TO THE INITIAL HORIZONTAL POSITIONP; FOR THE READ PORTION OF AN IO.RPR. WE DON'T CARE ABOUT INCORRECT HORIZONTALO; POSITION DURING THE ECHO OF THE PROMPT STRING. FURTHERMORE, IT IS POSSIBLE2N; THAT THE ORIGINAL PROMPT STARTED AT A POSITION OTHER THAN FIRST COLUMN. IFK; SO, WE CAN ONLY HOPE THAT THE PROMPT BUFFER CONTAINS AN EXPLICIT CURSOREK; POSITIONING COMMAND. IF NOT, THE HORIZONTAL POSITION WILL BE INCORRECTR; WHILE DOING THE NEXT READ.;M; AT THIS INPUT STATE, WE KNOW THAT THE LAST CHARACTER THAT WAS EXPANDED BY O; "EXPCHR" WAS A CARRIAGE RETURN, SO THE FORCE-LINE-FEED FLAG (S2.FLF) IS NOW K; SET. IF THE INITIAL HOR. POS. IS NOT COLUMN 1, WE MUST CLEAR THE FLAG.;HA MOVB U.TIHP(R4),U.TCHP-U.TSTA(R5) ;;;RESET HORIZONTAL POSITIONN; BEQ 90$ ;;;IF EQ, WE ARE AT COLUMN 1...LEAVE S2.FLF SETSA BIC #S2.FLF,2(R5) ;;;OTHERWISE, CLEAR FLAG TO PREVENT EXTRA LFT90$: .IF DF T$$RPR ASSUME S1.USI,100000A/ TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?H1 BMI 100$ ;;;IF MI, YES...ECHO THE CLI PROMPT" .IF DF R$$MPL!A$$CLIE4 INCB U.TISV(R4) ;;;BYPASS CLI PROMPT OUTPUT STATE .ENDC ;R$$MPL!A$$CLIN; MOV U.TFPB(R4),U.TFOB(R4) ;;;GET THE FIRST PROMPT BUFFERS2 CALLR STAXL ;;;START ECHO OF THE PROMPT STRING;Q"; PREPARE FOR CLI PROMPT OUTPUT.;100$:2 .ENDC ;T$$RPR .IF DF T$$SPC7 TST U.TFPB(R4) ;;;CLI CONTINUATION LINE IN PROGRESS?U  BPL 110$ ;;;IF PL, NO...SKIPA MOV #ASCLC,R3 ;;;OTHERWISE, OUTPUT SPECIAL CONTINUATION PROMPTC6 MOV #4,R2 ;;;LENGTH IS 4 BYTES INCLUDING CR AND LF0 BR C2ECHS ;;;GO ECHO THE CONTINUATION STRING110$:$ .ENDC ;T$$SPC .IF DF R$$MPL!A$$CLIE5 MOV U.MUP-U.TSTA(R5),R3 ;;;GET POINTER TO CLI WORDF0 BIC #^C,R3 ;;;CLEAR ALL BUT CLI INDEX1 MOV $CPTBL(R3),R3 ;;;POINT TO CLI PARSER BLOCK2 MOVB C.PDPL(R3),R2 ;;;GET DEFAULT PROMPT LENGTH3 ADD #C.PRMT,R3 ;;;POINT TO DEFAULT PROMPT STRINGN/ TSTB U.TFPB(R4) ;;;WHICH PROMPT DO WE ISSUE?P4 BNE 120$ ;;;IF NE, SKIP TO ISSUE FULL CLI PROMPT# TST R2 ;;;CHECK FOR NULL LENGTH2-  BR 130$ ;;;EITHER PROMPT OR FORGET IT ALL$ 120$:@  MOVB C.PCPL-C.PRMT(R3),-(SP) ;;;GET LENGTH OF FULL CLI PROMPT0  ADD R2,R3 ;;;POINT TO FULL CLI PROMPT STRING"  MOVB (SP)+,R2 ;;;GET ITS LENGTH130$:V1 BEQ 140$ ;;;IF EQ, NULL LENGTH...DON'T PROMPTV6 MOV R3,U.TSHP(R4) ;;;SAVE CLI PROMPT STRING ADDRESS6 MOVB R2,U.TVFC(R4) ;;;SAVE CLI PROMPT STRING LENGTH ;;;FALL INTO NEXT STATES6 .SBTTL . I2CTU3/I2CTR3 - OUTPUT CLI PROMPT BUFFER;TQ; I2CTU3/I2CTR3 - OUTPUT CLI PROMPT BUFFER BY EXPANDING EACH CHARACTER IN TURN.2; I2CTU3:: I2CTR3::5 MOV U.TSHP(R4),R3 ;;;GET ADDRESS OF NEXT CHARACTER - MOVB U.TVFC(R4),R2 ;;;GET REMAINING LENGTH)( BNE 150$ ;;;IF NE, MORE TO DO...SKIP140$:F+ INCB U.TISV(R4) ;;;UPDATE STATE VARIABLE.! BR J2NXST ;;;GO TO NEXT STATEA 150$:+! MOVB (R3)+,R2 ;;;GET CHARACTER TO EXPAND *" CALL EXPCHR ;;;GET CHARACTER EXPANSION:# BNE 160$ ;;;IF NE, CHARACTER ECHOES AS A STRING - SKIP0$ MOV U.TSHP(R4),R3 ;;;SET POINTER TO CHARACTER% MOV #1,R2 ;;;SET LENGTHU'& BR 170$ ;;;UPDATE POINTER AND COUNTV'160$:46( BCS 180$ ;;;IF CS, NEED TO PRESENT CHARACTER AGAIN)170$:G,* INC U.TSHP(R4) ;;;POINT TO NEXT CHARACTER + DECB U.TVFC(R4) ;;;KEEP COUNT,180$:R4- BR C2ECHS ;;;ECHO EXPANSION OF CURRENT CHARACTER./ .IFF ;R$$MPL!A$$CLI00}|{cccc021 MOV #ASCLP,R3 ;;;ASSUME ECHO ANGLE BRACKET ONLY/2 MOV #2,R2 ;;;TWO BYTES LENGTH (INCLUDES LF),.3 TSTB U.TFPB(R4) ;;;DID WE ASSUME CORRECTLY?64 BEQ C2ECHS ;;;IF EQ, YES...SKIP TO ECHO THE STRING56 .IF DF M$$CLI708 MOV U.CLI-U.TSTA(R5),R3 ;;;GET POINTER TO CLI#9 TST (R3)+ ;;;POINT PAST CLI TCBR): MOV R3,R2 ;;;COPY POINTER TO CLI NAMET;190$:C9< TSTB (R2)+ ;;;SEARCH FOR END OF ASCIZ NAME AND PROMPT '= BNE 190$ ;;;IF NE, NOT THERE...LOOPA)> SUB R3,R2 ;;;GET LENGTH OF CLI PROMPTV ? BR C2ECHS ;;;ECHO CLI PROMPT@A .IFF ;M$$CLI,B2C MOV #ASCLI,R3 ;;;GET ADDRESS OF FULL CLI PROMPT"D MOV #5,R2 ;;;GET PROMPT LENGTH E BR C2ECHS ;;;ECHO CLI PROMPTFG .ENDC ;M$$CLIHI .ENDC ;R$$MPL!A$$CLIUJ K .DSABL LSB;L.PAGEN2M .SBTTL . I2CTU4 - FINISH CONTROL-U PROCESSINGN;RJO; I2CTU4 - COMPLETE PROCESSING OF CONTROL-U INPUT. IF CONTROL-U WAS FOREP; AN UNSOLICITED INPUT, "IS.TMO+1" IS SET AS A COMPLETION STATUS SOCQ; THAT "FPIRD" WILL KNOW THE DIFFERENCE BETWEEN A USER HITTING ^U /R; AND A FAKED ^U BECAUSE OF AN INPUT TIMEOUT.3S;E TI2CTU4:: UI2CTUE:R4V CLRB U.TISV(R4) ;;;RESET THE INPUT STATE VARIABLEGW MOVB U.TCHP-U.TSTA(R5),U.TIHP(R4) ;;;SET INITIAL HOR. POS. = CURRENTX ASSUME S1.USI,100000G/Y TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?S7Z BPL C2CFRQ ;;;IF PL, NO...SKIP TO DO A FORK REQUEST [ ASSUME U.TCI,0UD\ MOV #IS.TMO+1,@(R4)+ ;;;OTHERWISE, SHOW A TIMEOUT ^U HAS FINISHED+] JMP IDONE ;;;COMPLETE THE INPUT REQUESTF^5_ .SBTTL . I2CTR4 - INITIATE ECHO OF CURRENT INPUTU`; Na; I2CTR4 - SET UP THE INPUT STATE TO RE-ECHO THE INPUT BUFFER. THIS IS DONEEb; BY "RECYCLING" ALL CHARACTERS THAT HAVE BEEN INPUT SO FAR THROUGHTc; THE INPUT LOGIC.d;eg ;**-1 hI2CTR4::+i INCB U.TISV(R4) ;;;UPDATE STATE VARIABLECj3k .SBTTL . I2CTR5 - RECYCLE NEXT INPUT CHARACTERMl;CQm; I2CTR5 - ECHO THE NEXT INPUT CHARACTER BY SENDING IT THROUGH THE INPUT LOGIC.In; oI2CTR5::<p MOV U.TIP+2(R4),R3 ;;;GET POINTER TO NEXT BYTE TO PROCESS!q CMP R3,U.TTOC(R4) ;;;ALL DONE?-#r BEQ I2CTR6 ;;;IF EQ, YES...SKIPE)s CALL GETRIC ;;;GET THE NEXT CHARACTERL6t CALLR ICHAR2 ;;;RECYCLE CHARACTER THRU INPUT LOGICu2v .SBTTL . I2CTR6 - FINISH CONTROL-R PROCESSINGw;4Ix; I2CTR6 - COMPLETE PROCESSING OF CONTROL-R. RESET THE INPUT STATE AND-;y; CONDITIONALLY FORK TO START ANY PENDING OUTPUT REQUEST.Ez;P {I2CTR6::4| CLRB U.TISV(R4) ;;;RESET THE INPUT STATE VARIABLE}} ; LK707R ;**-1 C2CFRQ:O> CALLR CFGRQ ;;;CONDITIONALLY FORK TO GET AN OUTPUT REQUEST.PAGES' .SBTTL . I2CTC - CONTROL-C HANDLING ;CP; I2CTC - CONTROL-C IS BEING PROCESSED. START (OR RESTART) UNSOLICITED INPUT.;- I2CTC::T .IF DF T$$SCA7 BIT #S3.TME,4(R5) ;;;IS TERMINAL MANAGEMENT ENABLED?N BEQ 5$ ;;;IF EQ NO7 JMP I2ECHO ;;;IF NE, YES...DON'T DO CONTROL-C STUFFP5$:T .ENDC ;T$$SCA ASSUME U2.SLV,200, TSTB U.CW2-U.TSTA(R5) ;;;SLAVED TERMINAL?2 BMI I2RET ;;;IF MI, YES...IGNORE THE CONTROL-C .IF DF T$$IDO2 TST $MCRPT ;;;IS THE MCR DISPATCHER INSTALLED?  BNE 10$ ;;;IF NE, YES...SKIP;SI; THE FORK ROUTINE WHICH STARTS UNSOLICITED INPUT WILL QUEUE THE AST TO; C$CTEX IF APPROPRIATE.4 MOV #FR.SUI,R3 ;;;FORK/START OF UNSOLICITED INPUT$ CALLR FORK ;;;QUEUE FORK REQUEST10$: .ENDC ;T$$IDO .IF DF T$$SPC6 BIT #UM.KIL,U.MUP-U.TSTA(R5) ;;;SEND A KILL PACKET? BEQ 20$ ;;;IF EQ, NO...SKIP. MOV #FR.KIL,R3 ;;;GET KILL FORK REQUEST BIT1 CALLR FORK ;;;REQUEST FORK TO KILL THIS INPUTE20$:7 TST U.TFPB(R4) ;;;CLI CONTINUATION LINE IN PROGRESS?S BPL 30$ ;;;IF PL, NO...SKIPTD BIS #UM.KIL,U.MUP-U.TSTA(R5) ;;;ELSE, SEND KILL PACKET ON NEXT ^C30$: .ENDC ;T$$SPC9 MOVB R2,U.TFPB(R4) ;;;ECHO A FULL CLI PROMPT FOR ^U/^RE$ ADD #U.TFIB,R4 ;;;POINT TO U.TFIB  MOV R1,-(SP) ;;;SAVE REGISTER3 CALL FPSUI1 ;;;SET UP UCB FOR UNSOLICITED INPUT$00};}|tt tfDATA;Q;; FILL THE INPUT BUFFER WITH THE FOLLOWING PROMPT STRING:0; " \ XXX>";0H; WHERE " \" TAKES THE TERMINAL OUT OF HOLD-SCREEN MODE (INSERTEDH; ONLY IF TERMINAL IS IN HOLD-SCREEN MODE); AND "XXX" IS THE CLI NAME.;  ASSUME U.TIP+2,U.TIC-2.1 MOV -(R4),R1 ;;;GET START OF THE OUTPUT BUFFERU7 BIT #U2.HLD,U.CW2-U.TSTA(R5) ;;;IN HOLD-SCREEN MODE?. BEQ 40$ ;;;IF EQ, NO...SKIPI< MOV (PC)+,(R1)+ ;;;INSERT \ - EXIT HOLD SCREEN MODE .BYTE CH.ESC,CH.BSL9 BIC #U2.HLD,U.CW2-U.TSTA(R5) ;;;CLEAR HOLD-SCREEN FLAG<40$:; D; NOW EXPAND CARRIAGE RETURN TWICE. THIS HAS THE FOLLOWING EFFECT:@; 1. IF THE LAST EXPANDED CHARACTER WAS NOT A CARRIAGE RETURN,<; THE FIRST CR EXPANDS AS CR, AND THE SECOND ONE AS LF.A; 2. ELSE, THE FIRST CR EXPANDS AS LF AND THE SECOND ONE AS CR.BA; IN THIS CASE, THE FLAG S2.FLF WILL BE SET AFTER THE SECOND;%; EXPANSION AND MUST BE CLEARED.;;EK; THE CARRIAGE RETURN AND LINE FEED ARE NOT OUTPUT HERE FOR ALTERNATE CLICK; SYSTEMS SINCE THE CLI MAY NOT WANT THEM. IF IT DOES, THEN THEY MUST BEG-; PART OF THE CLI PROMPT STRING IN THE CPB.;. .IF DF T$$SPCA TST U.TFPB-(R4) ;;;CLI CONTINUATION LINE IN PROGRESS?,4 BPL 70$ ;;;IF PL, NO...DON'T INCLUDE GRATIS CRLF .ENDC ;T$$SPC .IIF NDF A$$CLI,NOACLI=0S .IF DF T$$SPC!NOACLIL* CALL EXCR1 ;;;EXPAND A CARRIAGE RETURN50$: MOVB (R3)+,(R1)+ ;;;INSERTA SOB R2,50$ ;;;LOOP! CALL EXCR1 ;;;EXPAND CR AGAINL60$: MOVB (R3)+,(R1)+ ;;;INSERTA SOB R2,60$ ;;;LOOP .ENDC ;T$$SPC!NOACLI 70$:. BIC #S2.FLF,2(R5) ;;;DON'T FORCE ANOTHER LF .IF DF T$$SPCA TST U.TFPB-(R4) ;;;CLI CONTINUATION LINE IN PROGRESS?  BPL 90$ ;;;IF PL, NO...SKIPFB MOVB ASCLC+2,(R1)+ ;;;INSERT FIRST CHAR. OF CONTINUATION PROMPT6 MOVB ASCLC+3,(R1)+ ;;;INSERT SECOND CHAR. OF PROMPT8 MOVB #2,U.TCHP-U.TSTA(R5) ;;;SET UP CURRENT HOR. POS.8 MOVB #2,U.TIHP-(R4) ;;;SET INITIAL HOR. POS.  BR 170$ ;;;OUTPUT THE PROMPT .ENDC ;T$$SPC .IF DF M$$CLI5 MOV U.CLI-U.TSTA(R5),R3 ;;;GET POINTER TO CLI NAMET. ADD #4,R3 ;;;ADD IN LENGTH OF THE CLI NAME80$: MOVB (R3)+,(R1)+ ;;;INSERTI BNE 80$ ;;;LOOP9 .ENDC ;M$$CLI .IF DF R$$MPL!A$$CLII90$:< MOV U.MUP-U.TSTA(R5),R3 ;;;GET POINTER TO CLI STATUS WORD5 BIC #^C,R3 ;;;CLEAR ALL BUT CLI INDEX BITS;1 MOV $CPTBL(R3),R3 ;;;POINT TO CLI PARSER BLOCK2: ADD #C.PDPL,R3 ;;;POINT TO DEFAULT PROMPT STRING LENGTH ASSUME C.PCPL,C.PDPL+18  CLR -(SP) ;;;WORD TO GET BYTE VALUE OF PROMPT LENGTH2  BISB (R3)+,(SP) ;;;GET LENGTH OF DEFAULT PROMPT  ASSUME C.PRMT,C.PCPL+1,  MOVB (R3)+,R2 ;;;GET LENGTH OF CLI PROMPT-  ADD (SP)+,R3 ;;;POINT TO CLI PROMPT STRINGM TST R2 ;;;ANYTHING THERE?U4 BEQ I2RET ;;;IF EQ, NO...RETURN TO FORGET IT ALL8 MOV R1,-(SP) ;;;GET CURRENT POSITION IN OUTPUT BUFFER9 SUB (R4),(SP) ;;;GET NUMBER OF CHARACTERS IN IT SO FAR.4 MOV R2,-(SP) ;;;SAVE UNEXPANDED CLI PROMPT LENGTH100$:C1 MOVB (R3)+,R2 ;;;GET A CHARACTER OF THE PROMPTU1 MOV R3,-(SP) ;;;SAVE ADDRESS OF NEXT CHARACTERH5 CALL EXPCHR ;;;GET EXPANSION OF CURRENT CHARACTER , BNE 120$ ;;;IF NE, IT IS A STRING...SKIP/ CMP 4(SP),#T$$BFL ;;;BUFFER LENGTH EXCEEDED? # BHIS 110$ ;;;IF HIS, YES...SKIP;? MOVB R2,(R1)+ ;;;CHARACTER EXPANDS AS ITSELF - PUT IN BUFFERE2 INC 4(SP) ;;;SHOW ONE MORE CHARACTER IN BUFFER BR 150$ ;;;CHECK IF DONE110$: ADD #6,SP ;;;CLEAN STACK4 BR 170$ ;;;ECHO WHATEVER COULD FIT IN THE BUFFER 120$:C;! BCC 130$ ;;;IF CC, DON'T PRESENT CHARACTER AGAIN...SKIPH$" DEC (SP) ;;;ELSE, BACKUP POINTER# INC 2(SP) ;;;AND FIX COUNT$130$:;)% ADD R2,4(SP) ;;;SHOW NEW BUFFER LENGTH)/& CMP 4(SP),#T$$BFL ;;;BUFFER LENGTH EXCEEDED?$4' BHI 110$ ;;;IF HI, YES...ECHO WHAT WE COULD COPY(140$: 0) MOVB (R3)+,(R1)+ ;;;PUT EXPANSION INTO BUFFER* SOB R2,140$ ;;;LOOPF00}|{cccc+150$: ), MOV (SP)+,R3 ;;;RESTORE PROMPT POINTER,- DEC (SP) ;;;MORE TO DO?$,. BNE 100$ ;;;IF NE, YES...LOOP UNTIL DONE/160$:!0 CMP (SP)+,(SP)+ ;;;CLEAN STACKC12 .ENDC ;R$$MPL!A$$CLIC34 .IF NDF R$$MPL&A$$CLI&M$$CLIC56 MOVB #'M,(R1)+ ;;;INSERT M7 MOVB #'C,(R1)+ ;;; C 8 MOVB #'R,(R1)+ ;;; R)9 MOVB #'>,(R1)+ ;;; >X:"; .ENDC ;NDF R$$MPL&A$$CLI&M$$CLI<= .IF NDF R$$MPL&A$$CLI>8? MOVB #4,U.TCHP-U.TSTA(R5) ;;;SET UP CURRENT HOR. POS.8@ MOVB #4,U.TIHP-(R4) ;;;SET INITIAL HOR. POS.AB .ENDC ;NDF R$$MPL&A$$CLIECD170$:B7E MOV (R4),R3 ;;;GET START OF PROMPT STRING (U.TIP+2)P*F CMP -(R4),-(R4) ;;;RESTORE UCBX POINTER3G MOV R1,R2 ;;;COPY CURRENT PROMPT STRING POINTER)H SUB R3,R2 ;;;GET LENGTH OF THE STRING #I MOV (SP)+,R1 ;;;RESTORE REGISTER 9J BIC #U2.HLD,U.CW2-U.TSTA(R5) ;;;CLEAR HOLD-SCREEN FLAGM KECHOS1:$*L CALLR ECHSTR ;;;ECHO THE PROMPT STRINGM.PAGET=N .SBTTL . I2CT* - MISCELLANEOUS CONTROL CHARACTER HANDLINGUO;2&P; CTRL-Q, CTRL-S, CTRL-O AND CTRL-X.CQ; IF ANY OF THESE CHARACTERS IS RECEIVED WHEN AN IO.RAL OR IO.RSTODR; IS ACTIVE, STORED IN THE TYPE-AHEAD BUFFER (FOR EXAMPLE, BECAUSEAS; ECHO IS REQUIRED AND OUTPUT IS BUSY), THE READ TERMINATES AND2BT; THE NEXT READ IS AN IO.RLB, THEN THESE SPECIAL CHARACTERS WILL>U; APPEAR HERE. WE DON'T WANT TO PASS THEM TO THE TASK, SO WEV; JUST IGNORE THEM.TW;;FX; THE SAME IS DONE FOR CTRL-C FROM A SLAVED TERMINAL, AND FOR CTRL-R-Y; IN A SYSTEM THAT DOES NOT SUPPORT CTRL-R.LZ;T [I2CTQ::R \I2CTS::F.] BIT #S1.TSY,(R5) ;IS TERMINAL SYNC ENABLED?(^ BEQ JI2EC ;IF NE, YES,KEEP CHARACTER _I2CTX::A` aI2CTO::Xbc .IF NDF T$$CTROd eEDCTR::Dfg .ENDC ;T$$CTRhiI2RET:j RETURN ;;;IGNOREAAkJI2EC: JMP I2ECHO ;;;ELSE, PROCESS AS A NORMAL INPUT CHARACTER.lm.PAGET.n .SBTTL . EDRUB - RUBOUT CHARACTER HANDLINGo;M%p; EDRUB - PROCESS RUBOUT CHARACTER.-q;M rEDRUB::E6s CALL GETPIC ;;;GET (AND REMOVE) PREVIOUS CHARACTER2t BCS I2RET ;;;IF CS, NONE THERE...IGNORE RUBOUT*u BIT #S1.RNE,(R5) ;;;IS ECHO SUPPRESSED?:v BNE I2RET ;;;IF NE, YES...DON'T ECHO DELETED CHARACTER,w TSTB U.TCHP-U.TSTA(R5) ;;;AT LEFT MARGIN?4x BEQ I2RET ;;;IF EQ, YES...CAN'T ECHO AROUND WRAPyz .IF DF T$$RUB{7| BIT #U2.CRT,U.CW2-U.TSTA(R5) ;;;IS TERMINAL A SCOPE?P0} BEQ 70$ ;;;IF EQ, NO...START RUBOUT SEQUENCE~;L; ECHO THE STANDARD CRT RUBOUT SEQUENCE. HORIZONTAL TAB ECHOS AS A NUMBERK; (1-8) OF BACKSPACES. ANYTHING ELSE ECHOS AS BACKSPACE-SPACE-BACKSPACE.I; + CMPB R2,#CH.HT ;;;RUBOUT HORIZONTAL TAB?S  BEQ 10$ ;;;IF EQ, YES...SKIP* BITB #140,R2 ;;;NON-SPACING CHARACTER?6 BEQ I2RET ;;;IF EQ, YES...DELETE IT BUT DON'T ECHO. MOV #ASRBS,R3 ;;;POINT TO BSP-SP-BSP STRING% MOV #3,R2 ;;;SET LENGTH OF STRING5? DECB U.TCHP-U.TSTA(R5) ;;;UPDATE CURRENT HORIZONTAL POSITIONU# BR ECHOS1 ;;;GO ECHO THE STRINGR; *; FIND THE PREVIOUS HORIZONTAL POSITION.;R10$:C MOVB U.TCHP-U.TSTA(R5),-(SP) ;;;SAVE CURRENT HORIZONTAL POSITIONIE MOVB U.TIHP(R4),U.TCHP-U.TSTA(R5) ;;;RESET CURRENT TO INITIAL POS. / MOV R3,-(SP) ;;;SAVE R3 (POINTS TO THE HTAB)H ASSUME U.TCI,0R: MOV (R4),R3 ;;;GET CURRENT PACKET (IF SOLICITED INPUT)1 MOV I.PRM+2(R3),R3 ;;;GET START OF TASK BUFFERS;NO; NOTE - THE 2 INSTRUCTIONS ABOVE ASSUME THAT THE CURRENT INPUT IS UNBUFFEREDM; SOLICITED INPUT. OF COURSE, "I.PRM+2(R3)" MAKES NO SENSE IF THE INPUT ISS3; UNSOLICITED, BUT NO ADDRESSING ERROR CAN OCCUR. ;V/ CLR -(SP) ;;;SET UP A VERY LARGE LOOP COUNT)3 BIT #S1.IBF,(R5) ;;;ARE WE DOING BUFFERED INPUT?0 BEQ 30$ ;;;IF EQ, NO...SKIP TO EXPAND BUFFER. MOV U.TFIB(R4),R3 ;;;GET FIRST INPUT BUFFER20$:1 CMP (R3)+,(R3)+ ;;;POINT TO START OF DATA AREAT0 MOV #T$$BFL-4,(SP) ;;;SET MAX BYTES IN BUFFER;IK; THE FOLLOWING IS A LOOP THAT GOES THROUGH ALL CHARACTERS THAT HAVE BEEN G; INPUT SO FAR AND EXPANDS THEM. THE PURPOSE IS TO UPDATE THE CURRENT,D; HORIZONTAL00};}|tt tfDATA POSITION (U.TCHP) TO THE VALUE IT HAD BEFORE THE LAST"; CHARACTER (THE TAB) WAS INPUT.;530$:8 CMP R3,2(SP) ;;;POINTING TO THE RUBBED-OUT CHARACTER?' BEQ 50$ ;;;IF EQ, YES...WE ARE DONE;40$:5 CALL GETRIC ;;;GET THE CHARACTER POINTED TO BY R3O MOV R3,-(SP) ;;;SAVE R3' CALL EXPCHR ;;;EXPAND THE CHARACTERR MOV (SP)+,R3 ;;;RESTORE R3L< BCS 40$ ;;;IF CS, EXPAND CHARACTER AGAIN (DEFERRED ECHO) INC R3 ;;;UPDATE POINTER$ DEC (SP) ;;;DECREMENT LOOP COUNT9 BNE 30$ ;;;IF NE, MORE IN THIS BUFFER...LOOP FOR MOREHE MOV -T$$BFL(R3),R3 ;;;LOOP COUNT RAN OUT - THIS CAN ONLY HAPPEN...P2 ;;; ...IF WE ARE DOING BUFFERED INPUT, SO...2 ;;; ...GET LINK TO NEXT BUFFER (MUST BE ONE) BR 20$ ;;;BIG LOOP;IF; WE ARE BACK AT WHERE WE STARTED - U.TCHP CONTAINS NEW (BACKSPACED); HORIZONTAL POSITION.;;50$:! CMP (SP)+,(SP)+ ;;;CLEAN STACKC. MOV (SP),R2 ;;;GET OLD HORIZONTAL POSITION= MOVB U.TCHP-U.TSTA(R5),(SP) ;;;GET NEW HORIZONTAL POSITION : SUB (SP)+,R2 ;;;CALCULATE NUMBER OF BACKSPACES REQUIRED! BGT 60$ ;;;IF GT, OUTPUT THEMH9 MOV #8.,R2 ;;;THE TAB WE WANT TO RUB OUT CAUSED AN...E3 ;;; ...AUTO CR-LF - SPACE BACK TO LEFT MARGIN(60$:3 MOV #ASBSP,R3 ;;;POINT TO STRING WITH BACKSPACEST  BR ECHOS1 ;;;ECHO THE STRING .ENDC ;T$$RUB;TL; PROCESS A RUBOUT FOR A HARDCOPY TERMINAL. THE ECHO SEQUENCE STARTS WITHL; A BACKSLASH FOLLOWED BY EACH CHARACTER THAT IS RUBBED OUT. WHEN NO MOREO; CHARACTERS ARE TO BE RUBBED OUT, A TERMINATING BACKSLASH IS ECHOED FOLLOWED8; BY THE CHARACTER THAT TERMINATED THE RUBOUT PROCESS.;W70$: .IF DF T$$SPL9 MOVB R2,U.TECO-U.TSTA(R5) ;;;SAVE RUBBED-OUT CHARACTER .IFF ;T$$SPLN2 MOVB R2,U.TECB(R4) ;;;SAVE RUBBED-OUT CHARACTER .ENDC ;T$$SPL3 BIT #S3.RUB,4(R5) ;;;ALREADY IN RUBOUT SEQUENCE?M5 BNE 80$ ;;;IF NE, YES...ECHO RUBBED-OUT CHARACTERO: BIS #S1.DEC,(R5) ;;;SET RUBOUT AND DEFERRED ECHO FLAGS BIS #S3.RUB,4(R5)/ BR I2RUB2 ;;;SKIP TO ECHO A BACKSLASH FIRSTF80$:? CALLR I2EXPC ;;;EXPAND & ECHO CHAR. IN R2 & U.TECB (U.TECO);:+; I2RUB1 - WE ARE ALREADY IN RUBOUT MODE.-;A I2RUB1:E, CMPB R2,#CH.RUB ;;;IS THIS ALSO A RUBOUT?6 BEQ EDRUB ;;;IF EQ, YES...CONTINUE RUBOUT SEQUENCE4 BIC #S3.RUB,4(R5) ;;;ELSE, GET OUT OF RUBOUT MODE3 BIS #S1.DPR,(R5) ;;;SET DEFERRED PROCESSING FLAG.5 ;;;FALL THROUGH TO ECHO A TERMINATING BACKSLASH ;TO; I2RUB2 - OUTPUT LEADING OR TRAILING BACKSLASH FOR HARDCOPY RUBOUT SEQUENCE.A;S I2RUB2:: MOV #ASBSL,R3 ;;;POINT TO BACKSLASH CHARACTER TO OUTPUT7 INCB U.TCHP-U.TSTA(R5) ;;;UPDATE HORIZONTAL POSITIONO5 CALLR ECHCHR ;;;ECHO 1 CHARACTER POINTED TO BY R3L.PAGEU .SBTTL TTICH SUBROUTINESE8 .SBTTL . SETSPD - FIND AND SET THE CALLER'S BAUD RATE; ;+B; SETSPD - DETERMINE THE INCOMING CALLER'S BAUD RATE AND SET IT.; ; INPUTS:; R2 = CHARACTER RECEIVED$; R5 => U.TSTA OF THE TERMINAL UCB;T ; OUTPUTS:S4; R2 = IF THE LINE SPEED IS FOUND AND SET UP6; = 0 IF THE LINE SPEED COULD NOT BE DETERMINEDB; THE CONTROLLER DEPENDENT ROUTINE FOR SETTING THE LINE SPEED IS4; CALLED AS EACH RANGE OF LINE SPEEDS IS CHECKED.;C; REGISTERS MODIFIED: R3, R4 (BY CONTROLLER DEPENDENT ROUTINES)L;-;A .IF DF D$$M11!D$$ZMD!D$$VMD SETSPD: =  CLR -(SP) ;;;SET UP RETURN VALUE FOR R2 = SPEED NOT FOUNDH6  MOV R1,-(SP) ;;;SAVE REGISTERS USED BY THIS ROUTINE  MOV R0,-(SP) ;;;B  MOV U.CW4-U.TSTA(R5),R0 ;;;GET THE CURRENT SPEED AND FLAGS WORD-  BIC #^C<37>,R0 ;;;CLEAR ALL BUT SPEED BITSHA BIC #^C<377>,R2 ;;;CLEAR ALL BUT EIGHT BITS OF INPUT CHARACTERC@ CMPB R2,#CH.CR ;;;IS IT A CARRIAGE RETURN (SPEED IS CORRECT)?/ BEQ 60$ ;;;IF EQ, YES...EXIT AUTOBAUD STATETD CMPB R2,# ;;;8-BIT CARRIAGE RETURN (SPEED IS CORRECT)?/ BEQ 60$ ;;;IF EQ, YES...EXIT AUTOBAUD STATEPE BIT #U4.CR,U.CW4-U.TSTA(R5) ;;;EXPECTING TO SEE A CARRIAGE RETURN?8 B00}|{ccccNE 20$ ;;;IF NE, YES...WE DIDN'T GET ONE, SO LOG IT@ CMPB R0,#S.4800 ;;;DID WE JUST FINISH SEARCHING AT 4800 BAUD?< BNE 10$ ;;;IF NE, NO...GO SEARCH LOW BAUD RATE TABLE NOW, TST R2 ;;;WAS RECEIVED CHARACTER A NULL?: BNE 30$ ;;;IF NE, NO...SEARCH HIGH BAUD RATE TABLE NOW= MOV #S.300,R0 ;;;SEARCH THE LOW BAUD SPEED RANGE NEXT TIMEC: BR 50$ ;;;CHANGE THE SPEED AND WAIT FOR NEXT CHARACTER;XM; THE PREVIOUS INPUT CHARACTER DID NOT MATCH ANYTHING IN THE HIGH BAUD RATEGQ; RANGE. WE HAVE A NEW CHARACTER TO CHECK AGAINST THE LOW BAUD RATE TABLE NOW..;;10$:7  MOV #ABLOW,R1 ;;;SET ADDRESS OF LOW BAUD SPEED TABLEE>! CALL TBLCHK ;;;LOOK FOR A MATCH AGAINST RECEIVED CHARACTER8" BEQ 40$ ;;;IF CC, FOUND MATCH...SET SPEED FROM TABLE#;B2$; WE COME HERE IN EITHER OF THE FOLLOWING CASES:F%; 1. AN INPUT CHARACTER COULD NOT BE MATCHED WITH THE HIGH BAUD RATEH&; TABLE ENTRIES; THE LINE SPEED WAS CHANGED FOR LOW SPEED CHECKING;D'; AND THE NEXT CHARACTER DID NOT MATCH THE LOW BAUD RATE TABLE.G(; 2. A MATCH WAS FOUND IN EITHER THE LOW OR HIGH SPEED TABLE, AND THE,?); NEXT CHARACTER WAS EXPECTED TO BE A CARRIAGE RETURN (FORO:*; VALIDATION). HOWEVER, IT WASN'T A CARRIAGE RETURN.+;O,20$:3- INCB U.CW4+1-U.TSTA(R5) ;;;INCREMENT ERROR COUNTI3. CMPB U.CW4+1-U.TSTA(R5),#5 ;;;REACHED THRESHOLD?E-/ BLT 70$ ;;;IF LT, NO...KEEP PRESENT SPEED70 MOV #S.4800,R0 ;;;RESET SPEED, ERROR COUNT AND FLAGSS11 BR 50$ ;;;TRY AGAIN WITH ORIGINAL RANGE CHECKO2;CQ3; SEARCH THE HIGH BAUD RATE TABLE FOR A MATCH WITH THE CURRENT INPUT CHARACTER.D4;E530$:96 MOV #ABHIGH,R1 ;;;SET ADDRESS OF HIGH BAUD SPEED TABLEU>7 CALL TBLCHK ;;;LOOK FOR A MATCH AGAINST RECEIVED CHARACTER38 BNE 70$ ;;;IF NE, NO MATCH...KEEP PRESENT SPEEDR9; L:; FOUND A MATCHING CHARACTER IN SPEED TABLE. SET SPEED FROM THE TABLE AND@;; LOOK FOR A REAL CARRIAGE RETURN AS THE NEXT INPUT CHARACTER.<; =40$:1> MOVB (R1)+,R0 ;;;GET CALLER'S SPEED FROM TABLEA?? BIS #U4.CR,R0 ;;;VALIDATE THIS SPEED ON NEXT INPUT CHARACTERA@;I8A; SET THE LINE TO A NEW LINE SPEED AS SPECIFIED BY R0.B;RC50$:;D MOV R0,U.CW4-U.TSTA(R5) ;;;SET NEW SPEED VALUE AND FLAGSO7E BR 70$ ;;;SET UP CONTROLLER AND WAIT FOR NEXT INPUTEF;MKG; SINCE WE JUST RECOGNIZED A REAL CARRIAGE RETURN AS THE INPUT CHARACTER,LHH; WE ARE NOW AT THE CORRECT SPEED. EXIT AUTOBAUD-IN-PROGRESS MODE ANDGI; SET UP TO PROCESS THE CARRIAGE RETURN WHICH WILL GIVE A CLI PROMPT.SJ;FK60$:CL BIC #S5.ABP,U.TST5-U.TSTA(R5) ;;;CLEAR AUTO-BAUD IN PROGRESS BIT:M MOV #72.,U.CW4-U.TSTA(R5) ;;;RESET CORRECT BUFFER WIDTH8N MOV R2,4(SP) ;;;SAVE CARRIAGE RETURN WE JUST DETECTEDO;AQP; CALL THE CONTROLLER DEPENDENT ROUTINE TO SET THE LINE TO THE SPECIFIED SPEED. Q; R70$:-S BIC #^C<37>,R0 ;;;CLEAR ALL BUT SPEED BITSC9T BIS #4000,R0 ;;;SET AUTO-BAUD DETECT BIT FOR SET SPEEDB:U MOV #CT.PRM,R2 ;;;SET INDEX FOR CHANGING LINE PARAMETER2V CLR R1 ;;;SET FLAG FOR NOT FLOW-CONTROL CHANGE)W CALL CTRD ;;;GO CHANGE THE LINE SPEED *X MOV (SP)+,R0 ;;;RESTORE SAVED REGISTERSY MOV (SP)+,R1 ;;; <Z MOV (SP)+,R2 ;;;GET BACK RETURN STATUS (EITHER OR 0)[ RETURN ;;;ALL DONE\;LF]; TBLCHK - CHECK CURRENT SPEED TABLE FOR A MATCHING INPUT CHARACTER.^; _TBLCHK:9` CMPB R2,(R1)+ ;;;RECEIVED CHARACTER MATCH TABLE ENTRY?0-a BEQ 10$ ;;;IF EQ, YES...RETURN WITH ENTRYb INC R1 ;;;BUMP PAST SPEEDF"c TSTB (R1) ;;;END OF THE TABLE?*d BNE TBLCHK ;;;IF NE, NO...KEEP LOOKING#e CLZ ;;;SHOW NO MATCH WAS FOUNDPf10$:g RETURN ;;;DONE WITH SCANRhi .ENDC ;D$$M11!D$$ZMD!D$$VMDjk.PAGE;Al .SBTTL . TMMCHK - CHECK FOR SWITCH TO TERMINAL MANAGEMENT MODEm;LEn; **-TMMCHK - CHECK FOR POSSIBLE SWITCH TO TERMINAL MANAGEMENT MODE.o;Op; THIS ROUTINE CHECKS THE CURRENT INPUT STATE AND THE CURRENT INPUT CHARACTER1Lq; TO SEE IF A SWITCH TO TERMINAL MANAGEMENT MODE IS NECESSARY. ONE OF THE<r; FOLLOWING ACTIONS IS PERFORMED (IN DECREASING PRIORITY):s;O=t; 1. IF TERMINAL MANAG00};}|tt tfDATAEMENT MODE IS NOT ENABLED, JUST EXIT. Iu; 2. IF WE HAVE NOT SEEN THE FIRST SWITCH CHARACTER, SEE IF THE CURRENTBBv; INPUT CHARACTER IS IT. IF SO, UPDATE THE TERMINAL MANAGEMENTw; STATE FLAGS AND EXIT.Ex; 3. IF WE HAVE ALREADY SEEN THE FIRST SWITCH CHARACTER, SEE IF THEK<y; CURRENT INPUT CHARACTER IS THE FINAL ONE. IF SO, CLEAR<z; THE TYPE-AHEAD BUFFER AND REQUEST A FORK TO SWITCH INTO{; TERMINAL MANAGEMENT MODE.E|; 4. OTHERWISE, SAVE THE CURRENT INPUT CHARACTER, RECYCLE THE FIRSTN@}; SWITCH CHARACTER THROUGH THE INPUT LOGIC, AND EXIT. IF THE?~; USER ENTERED THE FIRST SWITCH CHARACTER TWICE, ONLY ONE OFA,; THEM IS PASSED BACK TO THE INPUT LOGIC.;T ; INPUTS:!; R2 = CURRENT INPUT CHARACTERL$; R5 => U.TSTA OF THE TERMINAL UCBB; U.TSCA => AST CONTROL BLOCK/TSA EVENT PACKET IF TMM IS ENABLED6; S5.SW1/S5.TMM = CURRENT TERMINAL MANAGEMENT STATE;C ; OUTPUTS:RG; CC-C = 0 IF INPUT CHARACTER WAS NOT A SWITCH CHARACTER AND MUST BER; PROCESSED UPON EXIT.E; CC-C = 1 IF INPUT CHARACTER WAS ONE OF THE SWITCH CHARACTERS ANDN"; SHOULD BE IGNORED UPON EXIT.;N ; REGISTERS MODIFIED: R3, R4;-;N .IF DF T$$SCA TMMCHK:2 .IF DF T$$SPL7 MOV 120000+U.TSCA,R4 ;;;GET SWITCH CHARACTER TEP/ACBS .IFF ;T$$SPLV1 MOV U.TUX-U.TSTA(R5),R4 ;;;GET TERMINAL'S UCBXE; BEQ 40$ ;;;IF EQ, NO UCBX...SKIP SWITCH CHARACTER CHECK=4 MOV U.TSCA(R4),R4 ;;;GET SWITCH CHARACTER ACB/TEP .ENDC ;T$$SPL8 BEQ 40$ ;;;IF EQ, NO SWITCH CHARACTERS SET UP...SKIPB BIT #S5.TMM,U.TST5-U.TSTA(R5) ;;;ALREADY IN TERMINAL MGMT MODE?: BNE 40$ ;;;IF NE, YES...SKIP SWITCH CHARACTER CHECKING; MOV A.PRM+6(R4),R3 ;;;GET USER-DEFINED SWITCH CHARACTERS.F BIT #S5.SW1,U.TST5-U.TSTA(R5) ;;;ALREADY SEEN 1ST SWITCH CHARACTER?+ BEQ 10$ ;;;IF EQ, NO...CHECK FOR IT NOWE3 SWAB R3 ;;;SWAP CHARACTERS TO CHECK FOR 2ND ONEE10$:3 CMPB R2,R3 ;;;DOES THIS SWITCH CHARACTER MATCH?P6 BNE 30$ ;;;IF NE, NO...NO SWITCH TO TERM MGMT MODE ASSUME S5.SW1,1 ASSUME S5.TMM,S5.SW1+1T> INC U.TST5-U.TSTA(R5) ;;;UPDATE SWITCH CHARACTER STATE BITS> BIT #S5.TMM,U.TST5-U.TSTA(R5) ;;;SEEN 2ND SWITCH CHARACTER?2 BEQ 20$ ;;;IF EQ, NO...WAIT FOR NEXT CHARACTER;51; FORK TO PUT USER IN TERMINAL MANAGEMENT MODE.H;E1 CALL I1CTX1 ;;;GO FLUSH THE TYPE-AHEAD BUFFER% CALL I1CTQ ;;;ALSO RESTART OUTPUTN> MOV #FR.SCA,R3 ;;;REQUEST FORK FOR SWITCH TO TERM MGMT MODE CALL FORK ;;;DO IT20$:. SEC ;;;INDICATE SWITCH CHARACTER WAS SEEN RETURN ;;;ALL DONE;CP; INPUT IS NOT A SWITCH CHARACTER - SEE IF NEED TO RECYCLE PREVIOUS CHARACTER.;R30$:D BIT #S5.SW1,U.TST5-U.TSTA(R5) ;;;DID WE SEE 1ST SWITCH CHARACTER?9 BEQ 40$ ;;;IF EQ, NO...JUST PROCESS CURRENT CHARACTERO ASSUME S5.SW1,1< DEC U.TST5-U.TSTA(R5) ;;;CLEAR FLAG SAYING WE SAW 1ST ONE4 SWAB R3 ;;;SWAP TO GET 1ST SWITCH CHARACTER BACK8 CMPB R2,R3 ;;;DID USER ENTER 1ST SWITCH CHAR. TWICE?9 BEQ 40$ ;;;IF EQ, YES...JUST PASS ONE OF THEM THROUGHN) MOV R2,-(SP) ;;;SAVE CURRENT CHARACTER 8 MOV 2(SP),-(SP) ;;;DUPLICATE RETURN ADDRESS FOR LATER4 CLR R2 ;;;PREPARE FOR BYTE COPY (AND CLEAR CC-C)/ BISB R3,R2 ;;;GET 1ST SWITCH CHARACTER BACKQ3 CALL @(SP)+ ;;;FEED IT THROUGH INPUT PROCESSING. MOVB (SP)+,R2 ;;;GET BACK CURRENT CHARACTER40$: CLC ;;;CLEAR RETURN STATUS : RETURN ;;;RETURN TO FEED IT THROUGH THE INPUT PROCESS .ENDC ;T$$SCA.PAGE @ .SBTTL . OOBCHK - CHECK OUT-OF-BAND MASKS FOR INPUT CHARACTER;M;+C; **-OOBCHK - DETERMINE IF CURRENT INPUT CHARACTER IS OUT-OF-BANDU; ;SA458; ;SA458 ; INPUTS: ;SA458)!; R2 = CHARACTER ;SA458C/; R5 => U.TSTA OF THE TERMINAL UCB ;SA458H; ;SA458; OUTPUTS: ;SA4580; CC-C = 0 IF CHARACTER IS NOT OOB ;SA458-; = 1 IF CHARACTER IS OOB ;SA458H; ;SA458.; REGISTERS ALTERED: R0, R3, R4 ;SA45800}|{cccc;- ;SA458; ;SA458A;-;M .IF DF T$$OOB .ENABL LSB ;SA458C ;SA458 OOBCHK: & CLR R4 ;;;ASSUME NOT OOB ;SA4589 CMPB R2,#CH.SP ;;;IS INPUT A CONTROL CHARACTER? ;**-151 BHIS 60$ ;;;IF HIS, NO...NOT SUPPORTED AS OOBH .IF DF T$$SPL: MOV 120000+U.TOBA,R3 ;;;GET OUT-OF-BAND ACB/TEP POINTER .IFF ;T$$SPL . MOV U.TUX-U.TSTA(R5),R3 ;;;GET UCBX POINTER4 BEQ 60$ ;;;IF EQ, NOT ONE...CAN'T BE OOB SO SKIP7 MOV U.TOBA(R3),R3 ;;;GET OUT-OF-BAND ACB/TEP POINTER .ENDC ;T$$SPL3 BEQ 60$ ;;;IF EQ, OUT-OF-BAND NOT SET UP...SKIP% MOV R3,R4 ;;;COPY ACB/TEP POINTER 4 ADD #A.PRM+6,R4 ;;;POINT TO START OF OOB BITMASKS' ;;;ASSUME THIS IS AN ACB, NOT TEPO .IF DF R$$IIC ASSUME A.CBL,E.VSIZ TST A.CBL(R3) ;;;ACB OR TEP?O BEQ 5$ ;;;IF EQ, ACB .IF DF T$$SCAB BIT #S5.TMM,U.TST5-U.TSTA(R5) ;;;IS USER IN TERMINAL MGMT MODE?8 BNE 12$ ;;;IF NE, YES... DON'T DO OOB CHECKS ;SA458 ;**-1C .ENDC ;T$$SCAB ASSUME E.VOBM,A.PRM+2 ;;;NOTE: THIS CODE ALSO ASSUMES THAT THE& ;;;OOB BITMASKS START AT A.PRM+6* SUB #4,R4 ;;;POINT TO ACB OOB BITMASKS 5$:I .ENDC ;R$$IIC , MOV R2,R0 ;;;COPY THE CHARACTER ;**-14 CMPB #16.,R0 ;;;IS CHARACTER IN FIRST MASK WORD?- BHI 10$ ;;;IF HIS, YES...SKIP TO CHECK ITF1 SUB #16.,R0 ;;;MAKE CHARACTER RELATIVE TO 16.;8 TST (R4)+ ;;;POINT TO SECOND HALF OF DOUBLEWORD MASK 10$:/ ASL R0 ;;;CONVERT CHARACTER FOR WORD OFFSETN7 BIT $BTMSK(R0),(R4)+ ;;;IS CHARACTER IN THE BITMASK?O$ BNE 60$ ;;;IF NE, OOB ;SA458, 12$: CLR R4 ;;;INDICATE NOT OOB ;SA458 BR 60$ ;;;DONE ;SA458 ;+ ;SA458J ; **-OOBCK2 - DETERMINE WHETHER AN OOB CHARACTER IS INCLUDE AND ;SA458F ; PROCESS OOB CHARACTER BY INSERTING IT IN OOB BUFFER. ;SA458C ; IF THERE'S NO ROOM IN THE BUFFER, GO DIRECTLY TO ;SA458;A ; WARN THE USER. OTHERWISE, CHECK FOR CLEAR AND ;SA458VF ; PERFORM ASSOCIATED FUNCTION. SET STATUS AND SET UP ;SA458$ ; FORK FOR OOB. ;SA458 ; ;SA4582J ; NOTE: THIS ROUTINE IS DESIGNED TO BE CALLED IMMEDIATELY AFTER ;SA458D ; OOBCHK AND SHOULD BE CALLED ONLY IF THE CHAR. IS OOB. ;SA458F ; VALUES FOR R0, R3 AND R4 (INPUT TO OOBCK2) ARE ESTABLISHED ;SA458D ; BY CALLING OOBCHK. ALSO NOTE THAT IT IS ASSUMED THAT R0 ;SA458B ; WAS SAVED ON THE STACK PRIOR TO CALLING THIS ROUTINE. ;SA458 ; ;SA4585 ; INPUTS: ;SA458T+ ; R0 ESTABLISHED BY OOBCHK ;SA458! ; R2 = CHARACTER ;SA4588+ ; R3 ESTABLISHED BY OOBCHK ;SA458E+ ; R4 ESTABLISHED BY OOBCHK ;SA458 / ; R5 => U.TSTA OF THE TERMINAL UCB ;SA458  ; ;SA458S ; OUTPUTS: ;SA458: ; CC-C = 0 IF CHARACTER IT NOT TO BE INCLUDED ;SA4586 ; = 1 IF CHARACTER IS TO BE INCLUDED ;SA458 ; ;SA458E. ; REGISTERS ALTERED: R0, R3, R4 ;SA458 ;- ;SA458 ; ;SA458; ;SA458 OOBCK2: ;SA458A7 ADD #E.VHDR,R3 ;;;POINT TO OOB BUFFER HEADER ;**-2L& ;;;ASSUME THIS IS A TEP, NOT ACB E ASSUME E.VHDR,A.PRM+16 ;;;NOTE:CODE ASSUMES OOB HEADER IMMEDIATELY ) ;;;FOLLOWS OOB BIT MASKS IN THE ASTS  ASSUME A.CBL,E.VSIZ ' TST E.VSIZ-E.VHDR(R3) ;;;ACB OR TEP?4 BNE 15$ ;;;IF NE, TEPT ( ADD #4,R3 ;;;POINT TO ACB OOB HEADER 15$:' MOV R4,-(SP) ;;;SAVE BITMASK POINTERS- CALL PCBUF ;;;PUT CHARACTER IN OOB BUFFER;+ MOV (SP)+,R4 ;;;GET BACK BITMASK POINTER5- BCC 17$ ;;;CC -> ROOM IN BUFFER ;SA458A6 TST (SP)+ ;;;ELSE, POP OFF RETURN ADDRESS ;SA458( MOV (SP)+,R0 ;;;RESTORE R0 ;SA458< CALLR I1BEEP ;;;WARN USER THAT NO ROOM IN BUFFER ;SA458 17$: ;SA4587" TST (R4)+ ;;;SKIP TO NEXT BITMASK DOUBLEWORD ;**-1T6# BIT $BTMSK(R0),(R4)+ ;;;IS CHARACTER A "CLEAR" OOB?.$ BNE 20$ ;;;IF NE, NO...CHECK FOR "INCLUDE"!% MOV R2,-(SP) ;;;SAVE CHARACTE00};}|tt tfDATARC-& CALL I1CTX1 ;;;CLEAR OOB MUST CLEAR TABUFP%' CALL I1CTQ ;;;ALSO RESTART OUTPUTB*( MOV (SP)+,R2 ;;;RESTORE CHARACTER TO R2) * .IF DF T$$SPL+ &, MOV #120000,R3 ;;;GET UCBX POINTER- . .IFF ;T$$SPL / .0 MOV U.TUX-U.TSTA(R5),R3 ;;;GET UCBX POINTER1 2 .ENDC ;T$$SPL3 4 ASSUME U.TCI,0 ,5 TST (R3) ;;;DO WE HAVE A CURRENT PACKET?6 BEQ 30$ ;;;BR IF NO0 7 MOV R2,-(SP) ;;;GET CHARACTER8 SWAB (SP) ;;;INTO HIGH BYTEC>9 MOVB #IS.OOB,(SP) ;;;INDICATE THAT THIS WILL TERMINATE READ : MOV (SP)+,@(R3) ;;;SET STATUS7; BR 30$ ;;;SKIP SINCE "CLEAR" OOB CAN'T BE "INCLUDE"+< 20$:0= TST (R4)+ ;;;SKIP TO NEXT BITMASK DOUBLEWORD;> BIT $BTMSK(R0),(R4) ;;;IS CHARACTER OUT-OF-BAND INCLUDE?8? BNE 40$ ;;;IF NE, YES...SKIP TO FINISH OOB CHARACTER@ 30$:0A CLR R4 ;;;INDICATE CHARACTER IS NOT INCLUDEDB 40$::C MOV #FR.OOB,R3 ;;;SET REQUEST TYPE FOR OUT-OF-BAND FORKD MOV R4,-(SP) ;;;SAVE R4!E CALL FORK ;;;REQUEST THE FORKIF MOV (SP)+,R4 ;;;EI 60$: ;**-2T8I TST R4 ;;;CLEAR CARRY AND SEE IF OOB OR INCL ;SA4584I BEQ 70$ ;;;IF EQ, NOT OOB OR NOT INCLUDE ;SA458-I SEC ;;;SET CARRY IF OOB OR INCL ;SA458 I 70$: ;SA458!K RETURN ;;;ALL DONE ;**-1K ;SA458K .DSABLE LSB ;SA458K ;SA458O ;**-3CP .ENDC ;T$$OOBQ R .PAGE:BS .SBTTL . IPROC - SEE IF AN INPUT CHARACTER CAN BE PROCESSED NOWT ;(U ;+HV ; **-IPROC - DETERMINE WHETHER AN INPUT CHARACTER CAN BE PROCESSED NOWW ; X ; INPUTS:Y ; R2 = CHARACTERR$Z ; R5 => U.TSTA OF THE TERMINAL UCB[ ;$ \ ; OUTPUTS: 9] ; CC-C = 0 IF THE INPUT CHARACTER CAN BE PROCESSED NOW 3^ ; = 1 IF CHARACTER CAN NOT BE PROCESSED NOW;_ ;D3` ; CC-Z = 1 IF THE CHARACTER IS TO BE THROWN AWAY a ;S"b ; REGISTERS ALTERED: R2, R3, R4c ;-d ; e .ENABL LSBf g IPROC:: 4h BIT #S1.DSI,(R5) ;;;IS INPUT PROCESSING DISABLED?/i BNE RETCS ;;;IF NE, YES...CAN'T PROCESS NOWWj k .IF DF B$$MAPl &m CALL RSDPRC ;;;IO.RSD OUTSTANDING?*n CLZ ;;;DON'T THROW THE CHARACTER AWAY,o BCC RETCS ;;;Y - CAN'T PROCESS NOW, JUMPp q .ENDC ;B$$MAPr As CMP R2,#CH.CTC ;;;IS CHARACTER ^C (AND NO HARD RECEIVE ERROR)?Rt BNE 70$ ;;;IF NE, NO...SKIP u #v .SBTTL . CHARACTER IS CONTROL-C w ; x ; CHARACTER IS CTRL-C y ;4z .IF DF T$$SCA{ 3| BIT #S3.TME,4(R5) ;;;IS TERMINAL MANG'T ENABLED?U4} BNE 70$ ;;;IF NE, YES, CTL C IS NORMAL CHARACTER~  .ENDC ;T$$SCA  ASSUME S1.IBY,200 TSTB (R5) ;;;IS INPUT BUSY?N BMI 30$ ;;;IF MI, YES...SKIP ;EL ; CHARACTER IS CONTROL-C AND INPUT IS NOT BUSY. SEE IF IT SHOULD CAUSE AN ; UNSOLICITED INPUT AST. ;E  .IF DF T$$CCA  .IF DF T$$SPL - TST U.ATT-U.TSTA(R5) ;;;TERMINAL ATTACHED?R BEQ 60$ ;;;BR IF NO 0 MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX  .IFF ;T$$SPL; 6 MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX IF THERE IS ONE, BEQ 60$ ;;;IF EQ, THERE ISN'T ONE...SKIP  .ENDC ;T$$SPL 5 MOV U.TAST(R4),R3 ;;;GET AST BLOCK IF THERE IS ONEI* BEQ 20$ ;;;IF EQ, NO AST SET UP...SKIP@ BITB #TF.XCC,A.PRM+5(R3) ;;;WANT CONTROL-C PASSED TO THE AST? BNE 60$ ;;;IF NE, NO...SKIPD 10$:9 TST A.PRM+6(R3) ;;;NEED TO CHECK FOR LOCKED AST BLOCK?I3 BEQ 100$ ;;;IF EQ, YES...CHECK THAT POSSIBILITY0A BITB #AF.QUE,A.PRM+5(R3) ;;;IS ACB CURRENTLY IN THE AST QUEUE?M2 BNE RETCS ;;;IF NE, YES...CAN'T PROCESS ^C NOW- BR 110$ ;;;OTHERWISE, SKIP TO TRIGGER AST  20$:  .IFTF ;T$$CCA C BIT #S3.PTH!S3.RAL,4(R5) ;;;TERMINAL IN PASSTHRU OR BINARY MODE?O9 BNE RETCS ;;;IF NE, YES...PUT ^C IN TYPE-AHEAD BUFFERT2 BR 60$ ;;;OTHERWISE, SEE IF TERMINAL IS SLAVED ;D- ; CHARACTER IS CONTROL-C AND INPUT IS BUSY.OA ; 1. IF DOING IO.RAL OR IO.RST, OR IF ALREADY DOING UNSOLICITEDBB ; INPUT, TRY TO PROCESS IMMEDIATELY (DEPENDENT ON OUTPUT BUSY ; AND ECHOING REQUIREMENT).: ; 2. ELSE, IF TERMINAL IS SLAVED, DISCARD THE CHARACTER.@ ; 3. ELSE, IF AN AST IS NOT SPECIFIED, FORK TO ABORT SOL00}|{ccccICITED+ ; INPUT AND START AN UNSOLICITED INPUT.O ; 4. ELSE, QUEUE AN ASTE ;. 30$:E BIT #S1.PTH!S1.RSP,(R5) ;;;DOING READ WITH SPEC. PROC.OR PASSTHRU?V BNE 80$ ;;;IF NE, YES...SKIP  .IF DF T$$RPR > BIT #S5.RPO,U.TST5-U.TSTA(R5) ;;;PROMPT OUTPUT IN PROGRESS?/ BNE RETCS ;;;IF NE, YES...CAN'T PROCESS NOWD  .ENDC  ASSUME S1.USI,100000I/ TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?C BPL 40$ ;;;IF PL, NO...SKIPI ;A= ; CHARACTER IS CONTROL-C, AND AN UNSOLICITED INPUT IS BUSY.TA ; 1. IF OUTPUT IS NOT BUSY ACCEPT CTRL-C WHICH WILL RESTART THE: ; UNSOLICITED INPUT.)H ; 2. ELSE, CANNOT PROCESS NOW SINCE UNLIKE THE PROCESSING OF ALL OTHERB ; CHARACTERS, CTRL-C PROCESSING FORCES THE OUTPUT OF A PROMPT@ ; WITHOUT REGARD FOR THE ECHO/NOECHO STATUS OF THE TERMINAL ; & BIT #S1.OBY,(R5) ;;;IS OUTPUT BUSY?; BEQ RETCC ;;;IF EQ, NO...^C STARTS AN UNSOLICITED INPUT  RETCS:5 SEC ;;;SET INDICATION WE CAN'T PROCESS CHARACTER  RETURN ;;;ALL DONEI ;Y9 ; CHARACTER IS CONTROL-C AND A SOLICITED INPUT IS BUSY.E ;  40$:  .IFT ;T$$CCAT  .IF DF T$$SPL 0 MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX  .IFF ;T$$SPLC & MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX  .ENDC ;T$$SPL 5 MOV U.TAST(R4),R3 ;;;GET AST BLOCK IF THERE IS ONET/ BEQ 60$ ;;;IF EQ, ASTS NOT SPECIFIED...SKIP;. BITB #TF.XCC,A.PRM+5(R3) ;;;PASS ^C TO AST? BNE 60$ ;;;IF NE, NO...SKIPN8 BITB #AF.QUE,A.PRM+5(R3) ;;;IS AN AST ALREADY QUEUED?/ BEQ 10$ ;;;IF EQ, NO...ASTS MAY BE POSSIBLEP  .ENDC ;T$$CCA  50$:9 TST (SP)+ ;;;POP RETURN ADDRESS TO TOSS THE CHARACTER - RETURN ;;;RETURN BACK TO CALLER'S CALLER$ 60$: ASSUME U2.SLV,2006 TSTB U.CW2-U.TSTA(R5) ;;;IS THIS A SLAVED TERMINAL?- BMI 50$ ;;;IF MI, YES...THROW AWAY THE ^C   .IF DF A$$CLI&C$$CTCS > BIT #S3.CTC,4(R5) ;;;DOES THIS TERMINAL EXPECT NOTIFICATION: BEQ 130$ ;;;IF EQ, NO..CONTINUE WITH NORMAL PROCESSING@ MOV U.MUP-U.TSTA(R5),R3 ;;;GET THIS CLI OFFSET INTO CPB TABLE3 BIC #^CUM.CLI,R3 ;;;ELIMINATE ALL BUT THE OFFSETT6 MOV $CPTBL(R3),R3 ;;;POINT TO CPB FOR THIS TERMINALG BIT #CP.CTC,C.PSTS(R3) ;;;DOES THIS CLI ACCEPT NOTIFICATION PACKET?0; BEQ 130$ ;;;IF EQ, NO...CONTINUE WITH NORMAL PROCESSINGB6 MOV #FR.KIL,R3 ;;;FORK TO QUEUE NOTIFICATION PACKET: CALL FORK ;;;QUEUE FORK REQUEST - THIS CODE ASSUMES.... ;;; ...THAT FPKIL IS ENTERED WITH BIT...$ ;;; ...UM.KIL CLEARED IN U.MUP3 CALL GCTAB ;;;CHECK FOR ^C IN TYPE-AHEAD BUFFERO$ BCS 50$ ;;;IF CS BUFFER IS CLEAR, CMPB R2,#CH.CTC ;;;MAKE SURE IT IS THE ^C5 BNE 50$ ;;;IF NE, IT ISN'T...IGNORE THE CHARACTERP9 CALL RCTAB ;;;REMOVE CHARACTER FROM TYPE-AHEAD BUFFERB0 BR 50$ ;;;RETURN FOR NEXT FORK QUEUE ROUTINE  .IFF ;A$$CLI&C$$CTC  BR 130$ ;;;N - JUMPA  .ENDC ;A$$CLI&C$$CTCF  .PAGE ' .SBTTL . CHARACTER IS NOT CONTROL-CP ;S ; CHARACTER IS NOT CONTROL-C ;. 70$: ASSUME S1.IBY,200 TSTB (R5) ;;;IS INPUT BUSY?E BPL 90$ ;;;IF PL, NO...SKIPB ; 1 ; CHARACTER IS NOT CONTROL-C AND INPUT IS BUSY: 5 ; 1. IF ECHO IS REQUIRED AND OUTPUT IS BUSY, RETURNE: ; WITH CC-C = 1 (CHARACTER CAN NOT BE PROCESSED NOW).? ; 2. IF OUTPUT IS BUSY WITH THE PROMPT OF A READ WITH PROMPT, ; ; THE READ HAS NOT STARTED YET SO RETURN WITH CC-C = 1$+ ; (CHARACTER CANNOT BE PROCESSED NOW).AB ; 3. ELSE, RETURN WITH CC-C =0 (CHARACTER CAN BE PROCESSED NOW). ;: 80$:# BIT #S1.OBY,(R5) ;;;OUTPUT BUSY?N. BEQ RETCC ;;;IF EQ, NO...PROCESS CHARACTER. BIT #S1.RNE,(R5) ;;;IS LINE IN NOECHO MODE?. BEQ RETCS ;;;IF EQ, NO...CAN'T PROCESS NOW! " .IF DF T$$RPR# >$ BIT #S5.RPO,U.TST5-U.TSTA(R5) ;;;PROMPT OUTPUT IN PROGRESS?/% BNE RETCS ;;;IF NE, YES...CAN'T PROCESS NOW & ' .ENDC ;T$$RPR( ) RETCC:* CLC ;;;CLEAR CARRY$+ RETURN ;;;RETURNN, ; 5- ; CHARACTER IS NOT CONTROL-C AND INPUT IS NOT BUSY:RH. ; 1. IF UNSOLICITED INPUT ASTS ARE SET UP, REQ00};}|tt tfDATAUEST A FORK TO GIVE ONE.G/ ; NOTE A SPECIAL CASE - IF THE AST BLOCK IS "LOCKED", DO NOT FORK.5H0 ; THE AST BLOCK IS LOCKED WHEN IT IS STILL IN THE TASK'S AST QUEUE,G1 ; OR WHEN TF.NOT WAS SPECIFIED AT ATTACH AND THE TASK HAS NOT DONEO02 ; A READ SINCE THE PREVIOUS AST WAS QUEUED.13 ; 2. ELSE, IF THE TERMINAL IS ATTACHED, RETURN.C04 ; 3. ELSE, FORK TO START AN UNSOLICITED INPUT.5 ; H6 ; IN ALL OF THE ABOVE CASES, RETURN WITH CC-C = 1 TO INDICATE THAT THE/7 ; CHARACTER CAN NOT BE PROCESSED IMMEDIATELY.G8 ;N9 90$:4: TST U.ATT-U.TSTA(R5) ;;;IS THE TERMINAL ATTACHED?; < .IF DF T$$CCA= > BEQ 120$ ;;;IF EQ, NO...SKIP? @ .IF DF T$$SPLA 0B MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBXC D .IFF ;T$$SPLDE <F MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX (TERMINAL IS ATTACHED"G ;;;SO THERE MUST BE ONE)H I .ENDC ;T$$SPLJ -K MOV U.TAST(R4),R3 ;;;GET AST BLOCK ADDRESSO,L BEQ RETCS ;;;IF EQ, NONE...NO AST SET UP5M TST A.PRM+10(R3) ;;;ASTS WANTED FOR OTHER THAN ^C?D#N BEQ RETCS ;;;IF EQ, NO...RETURNUO 100$: >P BITB #AF.LCK!AF.QUE,A.PRM+5(R3) ;;;IS ACB LOCKED OR QUEUED?2Q BNE RETCS ;;;IF NE, YES...CAN'T REQUEST IT NOWR 110$:2S T .IF DF T$$REDU CV BIT #S5.BCC!S5.DAO!S5.VER,R2 ;;;WAS HARD RECEIVE ERROR DETECTED?;0W BNE 50$ ;;;IF NE, YES...THROW AWAY CHARACTERX Y .ENDC ;T$$REDZ =[ MOV #FR.AST,R3 ;;;SET UP TO FORK FOR UNSOLICITED INPUT ASTO\ BR 140$ ;;;SKIP ] ^ .IFF ;T$$CCA _ <` BNE RETCS ;;;IF NE, TERMINAL IS ATTACHED...CAN'T PROCESSa b .ENDC ;T$$CCAc d 120$:06e TSTB U.CW2-U.TSTA(R5) ;;;IS THIS A SLAVED TERMINAL?4f BMI 50$ ;;;IF MI, YES...THROW THE CHARACTER AWAYg Bh ; NOTE: CHANGING THE ABOVE INSTRUCTION FROM BMI 50$ TO BMI RETCSFi ; WILL CAUSE CHARACTERS TYPED TO AN UNATTACHED SLAVED TERMINAL TO BE#j ; SAVED IN THE TYPE-AHEAD BUFFER.;k l .IF DF T$$SERm ?n BIT #UM.CMD,U.MUP-U.TSTA(R5) ;;;COMMAND ALREADY IN PROGRESS?S/o BNE RETCS ;;;IF NE, YES...CAN'T PROCESS NOWIp q .ENDC ;T$$SERr s .IF DF T$$IDOt 2u TST $MCRPT ;;;IS THE MCR DISPATCHER INSTALLED?2v BEQ RETCS ;;;IF EQ, YES...CAN'T PROCESS IT NOWw x .ENDC ;T$$IDOy z 130$:Y{ | .IF DF T$$MOD} 2~ BITB #US.DSB,U.STS-U.TSTA(R5) ;;;LINE DISABLED?9 BNE 50$ ;;;IF NE, YES...DON'T START UNSOLICITED INPUTL  .ENDC ;T$$MOD 7 MOV #FR.SUI,R3 ;;;FORK TO START AN UNSOLICITED INPUTC 140$:U' CALL FORK ;;;QUEUE THE FORK REQUESTS: BR RETCS ;;;RETURN TO INDICATE WE CAN'T PROCESS IT NOW .DSABL LSB  .PAGE$6 .SBTTL . PCTAB - PUT CHARACTER IN TYPE-AHEAD BUFFER ; ;+: ; **-PCTAB - PUT A CHARACTER INTO THE TYPE-AHEAD BUFFER. ;OH ; THIS ROUTINE PLACES A CHARACTER INTO A TERMINAL'S TYPE-AHEAD BUFFER. ;I ; INPUTS: ; R2 = CHARACTER $ ; R5 => U.TSTA OF THE TERMINAL UCB ; ; OUTPUTS:8 ; CC-C = 0 IF CHARACTER SUCCESSFULLY STORED IN BUFFER< ; = 1 IF CHARACTER WAS NOT STORED DUE TO FULL BUFFER ; ; REGISTERS MODIFIED: R3, R4 ;- ;W .ENABL LSB  PCTAB:  .IF DF T$$SPL - MOV #120000+U.TTBF,R3 ;;;SET TABUF POINTER  .IFF ;T$$SPLC 0 MOV U.TTAB-U.TSTA(R5),R3 ;;;GET TABUF POINTER( BNE 10$ ;;;IF NE...THERE IS A BUFFERC MOVB R2,U.TTAB+1-U.TSTA(R5) ;;;STORE CHAR. IN SINGLE-CHAR. TABUF59 INCB U.TTAB-U.TSTA(R5) ;;;MARK THE TABUF AS BEING FULLC CLC ;;;SHOW SUCCESS STATUS  RETURN ;;;ALL DONE  10$:3 BIT #1,R3 ;;;IS THIS A SINGLE CHARACTER BUFFER? 7 SEC ;;;ASSUME IT IS (AND IN USE) SO SET ERROR FLAG / BNE 20$ ;;;IF NE, IT IS...RETURN WITH ERROR0  .ENDC ;T$$SPL ) CALL PCBUF ;;;PUT CHARACTER IN BUFFERU$ BCS 20$ ;;;IF CS, BUFFER IS FULL1 CALL SNDXOF ;;;SEE IF WE NEED TO SEND AN XOFFV* CLC ;;;RETURN WITH SUCCESS INDICATION RETURN ;;;ALL DONEC   .PAGE5= .SBTTL . PCBUF - PUT CHARACTER INTO STANDARD FORMAT BUFFERA ; ;+< ; **-PCBUF - PUT A CHARACTER INTO A STANDARD FORMAT BUFFER ;CG ; THIS ROUTINE PLACES A CHARACTER INTO A BUFFER FORMATTED AS FOLLO00}|{ccccWS:  ;2% ; +---------------+---------------+0% ; | RETRIEVAL PTR | STORE PTR |U% ; +---------------+---------------+2% ; | BUFFER SIZE | CHARACTER CNT |N% ; +---------------+---------------+V% ; | CHARACTER BUFFER |A% ; \ \% ; +-------------------------------+C ;N ; INPUTS: ; R2 = CHARACTER ' ; R3 => TOP OF STANDARD FORMAT BUFFER  ;A ; OUTPUTS:R8 ; CC-C = 0 IF CHARACTER SUCCESSFULLY STORED IN BUFFER< ; = 1 IF CHARACTER WAS NOT STORED DUE TO FULL BUFFER ;0 ; REGISTERS MODIFIED: R4 ;- ; PCBUF:' CLR R4 ;;;PREPARE FOR BYTE TRANSFERE; BISB (R3)+,R4 ;;;GET OFFSET WHERE TO STORE THE CHARACTER-) INC R3 ;;;SKIP OVER RETRIEVAL POINTERA9 CMPB (R3)+,(R3)+ ;;;IS THE BUFFER FULL (COUNT = SIZE)?-) SEC ;;;ASSUME YES AND SET ERROR FLAG / BEQ 20$ ;;;IF EQ, YES...RETURN ERROR STATUSM9 ADD R3,R4 ;;;SET POINTER IN BUFFER TO STORE CHARACTERR# MOVB R2,(R4) ;;;STORE CHARACTER $ INC -(R3) ;;;COUNT THE CHARACTER% INC -(R3) ;;;UPDATE STORE POINTERM? CMPB 3(R3),(R3) ;;;TIME TO WRAP (STORE = SIZE)? (CLEAR CC-C)E# BNE 20$ ;;;IF NE, NO...ALL DONEF5 CLRB (R3) ;;;ELSE, SET POINTER AT START OF BUFFERO 20$: RETURN ;;;ALL DONER .DSABL LSB   .PAGEC> .SBTTL . GCTAB - GET A CHARACTER FROM THE TYPE-AHEAD BUFFER ;$ ;+7 ; GCTAB - GET A CHARACTER FROM THE TYPE-AHEAD BUFFER.I ;I ; INPUTS:$ ; R5 => U.TSTA OF THE TERMINAL UCB ;H ; OUTPUTS:C7 ; CC-C = 0 IF CHARACTER WAS OBTAINED FROM THE BUFFERT% ; = 1 IF THE BUFFER WAS EMPTYEF ; R2 = CHARACTER RETRIEVED FROM THE BUFFER (NOTE THAT THE CHARACTER% ; IS NOT REMOVED FROM THE BUFFER!)RH ; IF THERE IS ANY UNPROCESSED DEFAULT INPUT, RETURN THE NEXT CHARACTERF ; OF IT IN R2 AND WITH CC-C = 0 BEFORE CHECKING THE TYPEAHEAD BUFFER ;R# ; REGISTERS ALTERED: R2, R3, R4C ;- ;E  .PSECT MAP5 GCTAB::P  .IF DF T$$EIO  ASSUME S6.RDI,100000  6 TST U.TST6-U.TSTA(R5) ;;;LOOKING FOR DEFAULT INPUT? BPL 3$ ;;;N - JUMP  .IF DF T$$SPL 0 MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX  .IFF ;T$$SPLR & MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX  .IFTF ;T$$SPL : CLR R2 ;;;PREVENT FUTURE SIGN EXTENSION AND CLEAR CC-C0 BIT #S1.IBF,@R5 ;;;IS DEFAULT INPUT BUFFERED? BNE 1$ ;;;Y - JUMP  .IFT ;T$$SPL, ; MOV U.TDIP(R4),KISAR6 ;;;MAP USER'S DEFAULT INPUT BUFFERD3 BISB @U.TDIP+2(R4),R2 ;;;GET A CHARACTER FROM ITT  .IFF ;T$$SPLK 7 MOV U.TDIP+2(R4),R3 ;;;GET POINTER TO NEXT CHARACTER > MOV U.TDIP(R4),KISAR6 ;;;MAP USER'S BUFFER (MAY UNMAP UCBX)" BISB @R3,R2 ;;;GET A CHARACTER ! .ENDC ;T$$SPL" $# MOV $DALED,KISAR6 ;;;REMAP DRIVER9$ RETURN ;;;RETURN WITH CHARACTER IN R2 AND CC-C CLEAR1H% 1$: BISB @U.TDIP+2(R4),R2 ;;;GET A CHARACTER FROM DEFAULT INPUT BUFFER9& RETURN ;;;RETURN WITH CHARACTER IN R2 AND CC-C CLEARU' ( .ENDC ;T$$EIO) * 3$: ;;;REFERENCE LABELR+ , .IF DF T$$SPL- =. MOV #120000+U.TTBF+1,R2 ;;;POINT TO TABUF RETRIEVE POINTERH'/ CLR R3 ;;;PREPARE FOR BYTE TRANSFER @0 BISB (R2)+,R3 ;;;GET RETRIEVE POINTER & POINT TO ACTIVE COUNT1 2 .IFF ;T$$SPLL3 04 MOV R5,R3 ;;;POINT TO CELL CONTAINING THE...G5 ADD #U.TTAB-U.TSTA,R3 ;;; ...ADDRESS OF THE TABUF (ALSO CLEARS CC-C))$6 MOV (R3),R2 ;;;GET TABUF POINTER77 BEQ 5$ ;;;IF EQ, NOT ONE...INDICATE BUFFER IS EMPTYD78 BITB #1,(R3)+ ;;;IS THIS THE SINGLE CHARACTER TABUF?E 9 BNE 10$ ;;;IF NE, YES...SKIP': INC R2 ;;;POINT TO RETRIEVE POINTERO@; MOVB (R2)+,R3 ;;;GET RETRIEVE POINTER & POINT TO ACTIVE COUNT< = .IFTF ;T$$SPL> %? TSTB (R2)+ ;;;IS THE TABUF EMPTY?T5@ BNE 7$ ;;;IF EQ, YES...RETURN WITH THAT INDICATEDEA 5$: JMP RETCS.B 7$:A'C ADD R2,R3 ;;;MAKE POINTER IN BUFFERE1D INC R3 ;;;POINT TO NEXT CHARACTER TO RETRIEVETE F .IF DF T$$REDG ,H CMPB -(R2),#1 ;;;LAST CHARACTER IN TABUF?I BNE 10$ ;;;IF NE, NO...SKIPI;J MOV U.TST5-U.TSTA(R5),R2 ;;;GET HARD RE00};}|tt tfDATACEIVE ERROR FLAGSI<K BIC #^C,R2 ;;;CLEAR IRRELEVANT BITS:L BR 20$ ;;;RETURN WITH FLAGS AND CC-C CLEAR (FROM CMPB)M N .ENDC ;T$$REDO P 10$:Q CLR R2 ;;;CLEAR R2 AND CC-C,R 20$:-S BISB (R3),R2 ;;;PUT CHARACTER IN LOW BYTE $T RETURN ;;;RETURN WITH CHARACTERU V W .PAGERAX .SBTTL . RCTAB - REMOVE A CHARACTER FROM THE TYPE-AHEAD BUFFER Y ;CZ ;+:[ ; RCTAB - REMOVE A CHARACTER FROM THE TYPE-AHEAD BUFFER.<\ ; MUST BE CALLED ONLY IF THERE IS A CHARACTER TO REMOVE!!!I] ; IF THERE IS UNPROCESSED DEFAULT INPUT, DECREMENT CHARACTER COUNT LEFTB^ ; _ ; INPUTS:$` ; R5 => U.TSTA OF THE TERMINAL UCBa ;.b ; OUTPUTS: NONE0c ; d ; REGISTERS ALTERED: R3, R4 e ;-f ;Sg .PSECT MAP5.6h i RCTAB::Wj k .IF DF T$$EIOl m ASSUME S6.RDI,100000 n 6o TST U.TST6-U.TSTA(R5) ;;;LOOKING FOR DEFAULT INPUT?p BPL 3$ ;;;N - JUMP<q INC U.TDIP+2(R4) ;;;POINT TO NEXT DEFAULT INPUT CHARACTER;r DEC U.TDIC(R4) ;;;ONE LESS DEFAULT INPUT CHARACTER TO GOV s BEQ 1$ ;;;BRANCH IF ALL DONE<t BIT #S1.IBF,@R5 ;;;ARE DEFAULT INPUT CHARACTERS BUFFERED?u BEQ 2$ ;;;N - RETURN9v DEC U.TDIP(R4) ;;;REDUCE COUNT OF CHARACTERS IN BUFFERG,w BNE 2$ ;;;BUFFER IS NOT YET EMPTY - JUMPFx MOV #T$$BFL-4,U.TDIP(R4) ;;;BUFFER IS EMPTY - RESET CHARACTER COUNTFy MOV U.TDIP+2(R4),R3 ;;;GET POINTER ONE CHARACTER PAST END OF BUFFER0z SUB #T$$BFL,R3 ;;;BACK UP TO BUFFER LINK WORD0{ MOV @R3,U.TDIP+2(R4);;;SET NEW CURRENT BUFFER<| ADD #4,U.TDIP+2(R4) ;;;POINT TO FIRST CHARACTER WITHIN IT } RETURNEF~ 1$: BIC #S6.RDI,U.TST6-U.TSTA(R5);;;NO MORE DEFAULT INPUT TO PROCESS  2$: RETURN  .ENDC ;T$$EIO  3$: ;;;REFERENCE LABELB  .IFT ;T$$SPL; = MOV #120000+U.TTBF+1,R3 ;;;POINT TO TABUF RETRIEVE POINTERE  .IFF ;T$$SPLA 1 MOV U.TTAB-U.TSTA(R5),R3 ;;;GET START OF TABUF 4 BIT #1,R3 ;;;IS THIS THE SINGLE CHARACTER TABUF? BNE 20$ ;;;IF NE, YES...SKIP' INC R3 ;;;POINT TO RETRIEVE POINTER  .ENDC ;T$$SPL ( INCB (R3) ;;;UPDATE RETRIEVE POINTER* CMPB (R3)+,1(R3) ;;;DID WE WRAP AROUND? BNE 10$ ;;;IF NE, NO...SKIP9 CLRB -1(R3) ;;;ELSE, RESET POINTER TO START OF BUFFERC 10$:' CALL SNDXON ;;;POSSIBLY SEND AN XON02 DECB (R3) ;;;UPDATE COUNT OF BYTES LEFT TO GET  .IF DF T$$RED 3 BEQ 30$ ;;;IF EQ, LAST CHARACTER REMOVED...SKIPB  .IFTF ;T$$RED  RETURN ;;;ALL DONE   .IF NDF T$$SPL.  20$:@ CLR U.TTAB-U.TSTA(R5) ;;;MARK SINGLE-CHARACTER TABUF AS EMPTY  .ENDC ;NDF T$$SPL  .IFT ;T$$RED   30$:C BIC #S5.BCC!S5.DAO!S5.VER,U.TST5-U.TSTA(R5) ;;;CLEAR ERROR FLAGSR  .ENDC ;T$$RED  RETURN ;;;ALL DONE0 .PAGELB .SBTTL . SNDXOF - SEND XOFF IF TYPE-AHEAD BUFFER IS NEARLY FULL ;S ;+A ; SNDXOF - SEND XOFF IF HOSTSYNC ENABLED AND TABUF NEARLY FULL.T ;M ; INPUTS:" ; R3 => TOP OF TYPE-AHEAD BUFFER$ ; R5 => U.TSTA OF THE TERMINAL UCB ; ; OUTPUTS: NONE- ;A ; REGISTERS ALTERED: R4  ;- ;P .ENABL LSBC SNDXOF: 5 BIT #S4.HSY,6(R5) ;;;HOST SYNCHRONIZATION ENABLED?5& BEQ 20$ ;;;IF EQ, NO...JUST RETURN  .IF DF T$$SPL = MOVB U.TBSZ-U.TSTA(R5),R4 ;;;GET SIZE OF TYPE-AHEAD BUFFERS> SUB #XHIPNT,R4 ;;;COMPUTE CHAR. COUNT AT WHICH TO SEND XOFF : CMPB 2(R3),R4 ;;;DID WE REACH THE HIGH THRESHOLD POINT?  .IFF ;T$$SPL  ? CMPB 2(R3),#XHIPNT ;;;DID WE REACH THE HIGH THRESHOLD POINT?  .ENDC ;T$$SPL * BNE 20$ ;;;IF NE, NO...DON'T SEND XOFFF BIS #S5.OXF!S5.XOF,U.TST5-U.TSTA(R5) ;;;REQUEST XOFF OUTPUT & STATE BR 10$ ;;;JOIN COMMON CODE B .SBTTL . SNDXON - SEND XON IF TYPE-AHEAD BUFFER IS NEARLY EMPTY ;( ;+E ; SNDXON - SEND XON IF XOFF PREVIOUSLY SENT AND TABUF NEARLY EMPTY.C ;A ; INPUTS:: ; R3 => TABUF ACTIVE BYTE COUNT BEFORE BEING DECREMENTED$ ; R5 => U.TSTA OF THE TERMINAL UCB ;P ; OUTPUTS: NONED ;E ; REGISTERS ALTERED: R4 ;- ;N SNDXON:> BIT #S5.OXF,U.TST5-U.TSTA(R5) ;;;PREVIOUSLY OUTPU00~|{ccccT AN XOFF?# BEQ 20$ ;;;IF EQ, NO...ALL DONEF? CMPB (R3),#XLOPNT+1 ;;;DID WE REACH THE LOW THRESHOLD POINT? - BHI 20$ ;;;IF HI, NO...DON'T SENT XON YETY5 BIC #S5.OXF,U.TST5-U.TSTA(R5) ;;;RESET XOFF STATUSO6 BIS #S5.XON,U.TST5-U.TSTA(R5) ;;;SET XON STATUS BIT 10$:; MOV R2,-(SP) ;;;SAVE REGISTERS DESTROYED BY CTRD ROUTINE  MOV R3,-(SP) ;;;L ASSUME CT.STA,0* CLR R2 ;;;SET INDEX FOR "START OUTPUT"2 CALL CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINE* MOV (SP)+,R3 ;;;RESTORE SAVED REGISTERS MOV (SP)+,R2 ;;;O 20$: RETURN ;;;ALL DONET .DSABL LSBT  .PAGEO6 .SBTTL . ABOX/ABOXL - ABORT CURRENT TERMINAL OUTPUT ;  ;+H ; ABOXL - LOCK OUT INTERRUPTS AND CALL CONTROLLER-DEPENDENT ROUTINE TO ; ABORT THE CURRENT OUTPUT.  ;- ;V .PSECT MAP5  ABOXL:: # CALL LOCKI ;LOCK OUT INTERRUPTS, ABOX:L1 MOV #CT.ABO,R2 ;;;SET INDEX FOR "ABORT OUTPUT"S ;;;FALL THRU TO "CTRD" 4 .SBTTL . CTRD - CALL CONTROLLER DEPENDENT ROUTINE ;S ;+- ; CTRD - CALL CONTROLLER DEPENDENT ROUTINE.R ;; ; INPUTS: ; R2 = ROUTINE INDEX: ; 0 - START OUTPUTA ; 2 - ABORT OUTPUTR ; 4 - RESUME OUTPUT ; 6 - STOP OUTPUT ; 10 - POWER-UP (RSX-11M) ; 12 - MODEM TIMER (RSX-11M) + ; 14 - GET/SET LINE PARAMETERS (RSX-11M)A$ ; 10 - MODEM TIMER (RSX-11M-PLUS), ; 12 - CONTROLLER POWER-UP (RSX-11M-PLUS)& ; 14 - UNIT POWER-UP (RSX-11M-PLUS)* ; 16 - CONTROLLER ONLINE (RSX-11M-PLUS)+ ; 20 - CONTROLLER OFFLINE (RSX-11M-PLUS)+$ ; 22 - UNIT ONLINE (RSX-11M-PLUS)% ; 24 - UNIT OFFLINE (RSX-11M-PLUS)=0 ; 26 - GET/SET LINE PARAMETERS (RSX-11M-PLUS)  ; R5 => U.TSTA OF TERMINAL UCB ; ; OUTPUTS:U4! ; THE CONTROLLER DEPENDENT ROUTINE IS CALLED WITH:C" ; R2 = PHYSICAL UNIT NUMBER * 2 (ONLY IF MULTIPLEXERS IN SYSTEM) /# ; R3 => CSR ADDRESS FOR TERMINAL'S CONTROLLERR$ ; R4 => UCBX FOR THE TERMINAL &% ; R5 => U.TSTA OF THE TERMINAL'S UCB& ;T#' ; REGISTERS ALTERED: R2, R3, R4 ( ;-) ;R* CTRD::+ , .IF DF R$$MPL- 2. MOV U.SCB-U.TSTA(R5),R3 ;;;GET SCB FOR THIS UCB/ MOV S.KRB(R3),R3 ;;;GET KRB+0 MOVB K.PRM(R3),R4 ;;;GET CONTROLLER TYPE.A1 ADD CTBL(R4),R2 ;;;POINT TO DISPATCH TABLE FOR CONTROLLER TYPEN2 MOV (R3),R3 ;;;GET CSR3 4 .IFF ;R$$MPLU5 36 MOVB U.CTYP-U.TSTA(R5),R4 ;;;GET CONTROLLER TYPE=A7 ADD CTBL(R4),R2 ;;;POINT TO DISPATCH TABLE FOR CONTROLLER TYPER%8 MOV U.SCB-U.TSTA(R5),R3 ;;;GET SCBL9 MOV S.CSR(R3),R3 ;;;GET CSR: ; .ENDC ;R$$MPL< = .IF DF T$$SPL> 0? MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX@ A .IFF ;T$$SPLB 8C MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX (IF THERE IS ONE)D E .ENDC ;T$$SPLF G .IF DF T$$MUXH )I MOV (R2),-(SP) ;;;PUSH ROUTINE ADDRESS(8J MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET PHYSICAL UNIT NUMBERK ASL R2 ;;;MULTIPLY BY 2O+L CALLR @(SP)+ ;;;CALL ROUTINE AND RETURNSM N .IFF ;T$$MUXOO +P CALLR @(R2)+ ;;;CALL ROUTINE AND RETURNLQ R .ENDC ;T$$MUXS T .PAGE =U .SBTTL . GETPIC - GET PREVIOUS CHARACTER FROM INPUT BUFFER V ;TW ;+5X ; GETPIC - GET PREVIOUS CHARACTER FROM INPUT BUFFERTY ;T Z ; INPUTS:[ ; R4 => UCBX FOR THE TERMINAL $\ ; R5 => U.TSTA OF THE TERMINAL UCB] ; ^ ; OUTPUTS: -_ ; CC-C = 0 IF THERE IS A PREVIOUS CHARACTER(%` ; = 1 IF THERE IS NO CHARACTERAa ; R2 = CHARACTER 'b ; R3 => CHARACTER IN THE INPUT BUFFERR1c ; U.TIP, U.TIP+2, U.TIC AND U.TTIC "DOWN-DATED";5d ; (CHARACTER LOGICALLY REMOVED FROM INPUT BUFFER) e ; f ; REGISTERS ALTERED: R2, R3Ug ;-h ; i j GETPIC:E$k MOV R4,-(SP) ;;;SAVE UCBX POINTERl ASSUME U.TCI,0I:m MOV (R4)+,R3 ;;;GET CURRENT PACKET (IF SOLICITED INPUT)n ASSUME U.TIP,U.TCI+2O9o MOV (R4)+,R2 ;;;GET CURRENT BUFFER (IF BUFFERED INPUT)H,p ADD #4,R2 ;;;POINT AT START OF DATA AREA,q BIT #S1.IBF,(R5) ;;;DOING BUFFERED INPUT? r BNE 10$ ;;;IF NE, YES...SKIP9s MOV I.PRM+2(R3),R2 ;;;GET START ADDRESS OF TASK BUFFERt 10$::u MOV (R4),R3 ;;;GET CURRENT CHARACTER POINTER (U.TIP+2)7v CMP R3,R2 ;;;POINTING AT START00 ~;}|tt tfDATA OF (CURRENT) BUFFER? -w BHI 50$ ;;;IF HI, NO...ALL IS OK, SO SKIP.,x BIT #S1.IBF,(R5) ;;;DOING BUFFERED INPUT?9y BEQ 30$ ;;;IF EQ, NO...RETURN WITH INPUT BUFFER EMPTY+8z MOV U.TFIB-(R4),R3 ;;;GET FIRST INPUT BUFFER.{ CMP R3,-(R4) ;;;ARE WE IN THE FIRST BUFFER?+| BEQ 30$ ;;;IF EQ, YES...EXIT WITH ERROR A} CLR U.TIC-U.TIP(R4) ;;;CLEAR U.TIC (SWITCHING BACK TO PREVIOUS (~ ;;;BUFFER, WHICH IS FULL JUST NOW). ADD -(R2),U.TTIC-U.TIP(R4) ;;;UPDATE U.TTIC ; K ; SCAN LIST OF INPUT BUFFERS UNTIL THE BUFFER PREVIOUS TO THE ONE POINTED  ; TO BY R2 IS FOUND. ;( 20$:+ CMP (R3),(R4) ;;;POINTING TO OUR BUFFER?O BEQ 40$ ;;;IF EQ, YES...SKIP/ MOV (R3),R3 ;;;ELSE GET POINTER TO NEXT ONEU BR 20$ ;;;LOOP ; 8 ; NO CHARACTERS ARE IN THE BUFFER - EXIT WITH CC-C = 1 ;T 30$:' MOV (SP)+,R4 ;;;RESTORE UCBX POINTERI SEC ;;;RETURN WITH CC-C = 1 RETURN ;;;ALL DONEU ;S+ ; PREVIOUS BUFFER FOUND - R3 POINTS TO ITT ;T 40$:/ MOV R3,(R4)+ ;;;MAKE THIS THE CURRENT BUFFER : ADD #T$$BFL,R3 ;;;POINT JUST AFTER LAST CHAR. IN BUFFER ;:F ; WE NOW HAVE R3 POINTING JUST AFTER THE LAST CHARACTER IN THE INPUTG ; BUFFER. THE UCBX IS UPDATED IF WE HAD TO GO TO THE PREVIOUS BUFFER.; ; 50$:# DEC R3 ;;;STEP BACK 1 CHARACTERX! MOV R3,(R4)+ ;;;UPDATE U.TIP+2M INC (R4) ;;;UPDATE U.TIC' MOV (SP)+,R4 ;;;RESTORE UCBX POINTER ;;;FALL THRU TO "GETRIC" .PAGEO1 .SBTTL . GETRIC - GET A RANDOM INPUT CHARACTER  ;R ;+) ; GETRIC - GET A RANDOM INPUT CHARACTER# ;L ; INPUTS:# ; R3 => CHARACTER TO BE RETRIEVED ; R4 => UCBX FOR THE TERMINALA ;T ; OUTPUTS:E ; R2 = CHARACTERU ; CC-C = 0 ;P ; REGISTERS ALTERED: R2P ;- ;F GETRIC:" CALL MAPIB ;;;MAP INPUT BUFFER9 CLR R2 ;;;PREPARE TO RECEIVE CHARACTER AND CLEAR CC-C;> BISB (R3),R2 ;;;GET CHARACTER WITHOUT SIGN EXTEND PROBLEMS RETURN ;;;RETURN TO CALLERO .PAGET7 .SBTTL . PUTNIC - PUT NEXT INPUT CHARACTER IN BUFFER  ;R ;+/ ; PUTNIC - PUT NEXT INPUT CHARACTER IN BUFFER ;3 ; INPUTS: ; R2 = CHARACTER TO BE STORED ; R4 => UCBX FOR THE TERMINALU$ ; R5 => U.TSTA OF THE TERMINAL UCB ; ; OUTPUTS:E% ; CHARACTER STORED IN INPUT BUFFER. ; U.TIP+2 AND U.TIC UPDATED. ; ; REGISTERS ALTERED: R3I ;- ;R PUTNIC:C. MOV U.TIP+2(R4),R3 ;;;GET CHARACTER POINTER& CALL MAPIB ;;;MAP THE INPUT BUFFER' MOVB R2,(R3) ;;;STORE THE CHARACTERN" CALL @(SP)+ ;;;RESTORE MAPPING. INC U.TIP+2(R4) ;;;UPDATE CHARACTER POINTER* DEC U.TIC(R4) ;;;UPDATE CHARACTER COUNT RETURN ;;;ALL DONER .PAGE4( .SBTTL . MAPD - MAP DRIVER DATA SPACE ;  ;+ ; MAPD - MAP DRIVER DATA SPACE ;- ;E  .IF DF T$$COM  MAPD::  .IF NDF T$$SPL / MOV #0,KDSAR5 ;;;MAP TTCOM IN D-SPACE APR 5N5 PAR5S==.-4 ;;;FILLED IN AT VIRGIN INITIALIZATION   .ENDC ;NDF T$$SPL ) MOV #0,KINAR6 ;;;MAP TOP 4K OF DRIVERC5 PAR6I==.-4 ;;;FILLED IN AT VIRGIN INITIALIZATION2 BR RESM ;;;  .ENDC ;T$$COM $ .SBTTL . MAPIB - MAP INPUT BUFFER ;  ;+ ; MAPIB - MAP INPUT BUFFER ;D ; INPUTS: ; R4 => UCBX FOR THE TERMINAL-# ; R5 = U.TSTA OF THE TERMINAL UCB  ;. ; OUTPUTS: ! ; INPUT BUFFER MAPPED IN KISAR66 ; CALLER CALLED BACK AS A COROUTINE - WITH CC-C = 0.; ; "RETURN" LEADS BACK TO THIS ROUTINE WHICH THEN RESTORES.> ; KISAR6 AND RETURNS TO CALLER'S CALLER WITH CC-C PRESERVED. ;AO ; NOTE - WHEN THE CALLER IS CALLED AS COROUTINE, THE UCBX MAY NOT BE MAPPED!C ;C ; REGISTERS ALTERED: NONE  ;- ;R MAPIB:" CLC ;;;ASSUME WANT CC-C CLEAR, BIT #S1.IBF,(R5) ;;;DOING BUFFERED INPUT?0 BNE 10$ ;;;IF NE, YES...DON'T CHANGE MAPPING* MOV U.TIP(R4),KISAR6 ;;;MAP TASK BUFFER 10$:# CALL @(SP)+ ;;;CALL CALLER BACK   .IF NDF T$$COMR  MAPD::  .ENDC ;NOT T$$COM  RESM:.& MOV $DALED,KISAR6 ;;;RESTORE KISAR6 RETURN ;;;RETURN TO CALLER   .ENDN CALLER IS CALLE00~|{cccc .TITLE TTRW .IDENT /07.10/ ;D; 8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;  ;R ; 25-JAN-78 PETER WANNHEDENL ;L ; PREVIOUSLY MODIFIED BY:O; ; P. WANNHEDEN; D. R. DONCHIN ; T. LEKAS; S. C. ADAMSA; R. S. PHILPOTT;R; MODIFICATION HISTORY: ;; S.C. ADAMS 21-FEB-86 07.009; SA454 -- FIX PROBLEMS WITH TYPING CONTROL CHARACTERS ; TO CONTINUATION LINES;R; S.C. ADAMS 16-JUN-86 07.01-; SA462 -- ELIMINATE REDUNDANT INSTRUCTIONL;E; L. KOGAN 08-SEP-86 07.025; LK715 -- ADD SUPPORT FOR Q-BUS DMA TRANSFER FROM; A TASK BUFFER;E; S.C. ADAMS 30-DEC-86 07.036; SA466 -- POINT TO U.TFOB BEFORE JUMPING TO WRITE1;; L. KOGAN 20-FEB-87 7.04A<; LK720 -- SUPPORT DIRECT TRANSFER FOR "PURE" IO.WAL ONLY;.; S.C. ADAMS 18-MAR-87 07.05; SA469 -- FIX BUG IN LK720;R; S.C. ADAMS 30-APR-87 07.06?; SA471 -- DEALLOCATE TERMINATOR TABLE ON ABORTED EIO TF.RPR 9; CLEAR POINTER TO READ WITH PROMPT BUFFER TO AVOID -/; DOUBLE DEALLOCATION AFTER ABORTED IO.RPR ;F; L. KOGAN 08-MAY-87 7.07R<; LK724 -- FIX IO.RPR!TF.BIN PROCESSING FOR DMA TRANSFERS;O; L. KOGAN 26-JUN-87 7.089; LK726 -- SUPPORT Q-BUS DMA TRANSFER FOR REMOTE LINESE;A; L. KOGAN 30-JUN-87 7.096; LK727 -- FIX THE PROBLEM WITH ABORTING THE OUTPUT#; FOR Q-BUS DMA TERMINAL LINES-;7; L. KOGAN 02-JUL-87 7.10A<; LK728 -- CHANGE DMA IO.WAL PACKET FORMAT (NO FLAG WORD); (INCLUDES LK727)F;+; ****** T T R W ******O;NH; THIS MODULE CONTAINS THE ROUTINES TO STARTUP AND COMPLETE A READ ORP; WRITE REQUEST THAT HAS BEEN DEQUEUED FOR A TERMINAL. BOTH TYPES OF REQUESTSK; HAVE THREE PARTS. THE FIRST STEP DOES PRE-PROCESSING OF THE PARAMETERSGM; CONTAINED IN THE I/O PACKET NECESSARY TO PROCEED TO THE SECOND STEP. THE K; SECOND STEP SETS UP BUFFER POINTERS, ETC. FOR THE NEXT PART OF THE DATA7M; TRANSFER. THIS STEP IS REPEATED UNTIL THE TRANSFER FULLY COMPLETES. THEM; FINAL STEP CLEANS UP AND PASSES THE I/O REQUEST BACK TO THE SYSTEM WITH ASJ ; COMPLETION STATUS. NOTE THAT BOTH SOLICITED AND UNSOLICITED INPUT ARE"!; HANDLED BY THE INPUT ROUTINES.";-#;A($ .SBTTL .MCALLS AND SYMBOL DEFINITIONS%& .MCALL TTSYM$"' TTSYM$ ;DEFINE TF.XXX SYMBOLS() .IF DF T$$SPC!T$$CCA!T$$EIO*+ .MCALL PKTDF$5, PKTDF$ ;DEFINE CLI COMMAND BUFFER HEADER OFFSETSR'- ;AND ACB OFFSETS AND IOPX OFFSETSI. .ENDC ;T$$SPC!T$$CCA!T$$EIO/0 .PSECT MAP5.612.PAGEP43 .SBTTL PPEIO - EXTENDED READ/WRITE PRE-PROCESSING4;T5;+B6; **-PPEIO - PRE-PROCESSING FOR EXTENDED READ AND WRITE (IO.EIO)7;EI8; THIS ROUTINE DOES THE SETUP NECESSARY TO START UP AN EXTENDED READ ORB29; WRITE REQUEST. THE FOLLOWING STEPS ARE TAKEN:A:; 1. LOCATE THE I/O PACKET EXTENSION (IOPX) ASSOCIATED WITH THEC;;; IO.EIO REQUEST'S I/O PACKET. THE IOPX IS REMOVED FROMS<; THE IOPX LIST.OD=; 2. MOVE THE I/O FUNCTION MODIFIERS FROM THE IOPX TO THE FUNCTION=>; CODE FIELD IN THE CURRENT I/O PACKET. THE FUNCTION CODER=?; IS FLAGGED AS AN IO.EIO REQUEST BY SETTING THE HIGH BIT.EA@; 3. ALL PARAMETERS THAT WERE EARLIER SAVED IN THE IOPX ARE NOW :A; TRANSFERRED TO THE I/O PACKET FOR THE IO.EIO REQUEST.B; 4. THE IOPX IS DEALLOCATED.:@C; 5. DISPATCH TO THE ROUTINE FOR HANDLING THE SPECIFIC TYPE OFD; I/O REQUEST.UE; MF; *** NOTE *** AT PRESENT, THIS ROUTINE ASSUMES THAT THE ONLY REQUEST THAT/FG; WILL GET PASSED TO IT IS AN EXTENDED READ REQUEST (IO.EIO!TF.RLB).FH; ANY IO.EIO!TF.WLB OPERATION IS EXPECTED TO HAVE BEEN MAPPED INTO A?I; NORMAL IO.WLB REQUEST PRIOR TO BEING QUEUED (WITH NO IOPX).RJ;L K; INPUTS:%L; R3 => CURRENT I/O REQUEST PACKETH M; R4 => UCBX FOR THE TERMINAL%N; R5 => U.TSTA OF THE TERMINAL UCBJO; U.TRTT(R4) => TERMINAT00~;}|tt tfDATAOR TABLE FOR THE READ, IF ANY (SET UP BY FPGRQ).P; I.LNK(R3) = 0*Q;E R; OUTPUTS:TS; IOPX IS DEALLOCATEDAGT; CURRENT I/O PACKET IS SET UP FOR PROCESSING BY "PPRLB" OR "PPRPR1".EU; $V; REGISTERS MODIFIED: R0, R1, R2W;-X; YZ .IF DF T$$EIO[\ ASSUME I.XLNK,0] ASSUME I.XLNK+2,I.XIOPO^ ASSUME I.XIOP+2,I.XTCB)_ ASSUME I.XTCB+2,I.XMOD ` ASSUME I.XMOD+4,I.XRBFPa ASSUME I.XRBF+4,I.XRBL b ASSUME I.XRBL+2,I.XTMOTc ASSUME I.XTMO+2,I.XPBFd ASSUME I.XPBF+4,I.XPBLTe ASSUME I.XPBL+2,I.XPBVSf gPPEIO::.&h MOV R5,R0 ;GET COPY OF UCB POINTER@i ADD #U.TIXL-U.TSTA,R0 ;MAKE POINTER TO U.TIXL (IOPX LISTHEAD)j10$:2k MOV R0,R1 ;MAKE THIS THE PREVIOUS IOPX POINTER>l MOV (R1),R0 ;LOCATE THE NEXT IOPX (MUST BE HERE SOMEWHERE)mCn CMP I.XIOP(R0),R3 ;DOES THIS IOPX BELONG TO THE CURRENT REQUEST?-o BNE 10$ ;IF NE, NO...LOOP TILL WE FIND ITX5p MOV (R0),(R1) ;REMOVE THIS IOPX FROM THE WAIT LISTXq>r ADD #I.XMOD,R0 ;POINT PAST LINK, I/O PACKET AND TCB OFFSETS?s MOV (R0)+,I.FCN(R3) ;STORE REQUESTED MODIFIERS IN I/O PACKETUt-u TST (R0)+ ;SKIP OVER UNUSED MODIFIER WORDTvEw BIS #S6.EIO,U.TST6-U.TSTA(R5) ;INDICATE REQUEST IS (WAS) AN IO.EIOX&x MOV R3,R1 ;COPY I/O PACKET ADDRESS8y ADD #I.PRM,R1 ;MAKE A POINTER INTO THE PARAMETER LIST@z MOV (R0)+,(R1)+ ;COPY 1.ST ADDRESS DOUBLE WORD OF DATA BUFFER@{ MOV (R0)+,(R1)+ ;COPY 2.ND ADDRESS DOUBLE WORD OF DATA BUFFER+| MOV (R0)+,(R1)+ ;COPY DATA BUFFER LENGTHP-} MOV (R0)+,(R1)+ ;COPY TIMEOUT FOR THE READM~20$:B MOV (R0)+,(R1)+ ;COPY 1.ST ADDRESS DOUBLE WORD OF PROMPT BUFFERB MOV (R0)+,(R1)+ ;COPY 2.ND ADDRESS DOUBLE WORD OF PROMPT BUFFER- MOV (R0)+,(R1)+ ;COPY PROMPT BUFFER LENGTHV" MOV (R0),(R1) ;COPY PROMPT VFC. SUB #I.XPBV,R0 ;POINT BACK TO START OF IOPX MOV R3,-(SP) ;SAVE R3# MOV #I.XLEN,R1 ;GET SIZE OF IOPXU CALL $DEACB ;DEALLOCATE IOPX MOV (SP)+,R3 ;RESTORE R3  .IF DF T$$RPR; BIT #TF.RPR,I.FCN(R3) ;DID USER REQUEST A READ W/PROMPT?F4 BEQ PPRLB1 ;IF EQ, NO...PROCESS AS A NORMAL READ7 JMP PPRPR1 ;GO PROCESS THE PROMPT PART AS AN OUTPUT+ .IFF ;T$$RPRO .IF DF B$$MAP/ BR PPRLB1 ;PROCESS AS A NORMAL READ REQUEST .ENDC ;B$$MAP .ENDC ;T$$RPR .ENDC ;T$$EIO.PAGEO& .SBTTL INPUT REQUEST PRE-PROCESSING6 .SBTTL . PPRSD - READ-SPECIAL-DATA REQUEST (IO.RSD);O;+<; **-PPRSD - PRE-PROCESSING FOR READ-SPECIAL-DATA (IO.RSD)=; **-PPRLB - PRE-PROCESSING FOR READ-LOGICAL-BLOCK (IO.RLB)R;;I; THIS ROUTINE DOES THE SETUP NECESSARY TO START UP AN IO.RSD OR IO.RLB 6; REQUEST. ANY OF THE FOLLOWING STEPS MAY BE TAKEN:B; 1. FOR ENTRY AT "PPRSD", THE HIGH BYTE OF THE FUNCTION CODE IS;; CLEARED, SINCE IT MAY BE NECESSARY TO STORE OTHER READ"; MODIFIERS FOR LATER CHECKING.G; 2. FOR ENTRY AT "PPRLB", THE UNSOLICITED INPUT AST CONTROL BLOCK IS<; UNLOCKED IN CASE IT IS LOCKED DUE TO A NOTIFICATION AST>; HAVING BEEN SENT (TF.NOT MODIFIER ON THE ATTACH REQUEST).A; 3. THE I/O REQUEST PACKET BECOMES THE CURRENT REQUEST PACKET.UD; 4. THE MODIFIERS FROM THE READ REQUEST ARE COMBINED WITH CERTAIN>; TERMINAL CHARACTERISTICS TO DEFINE WHAT THE MODIFIERS FOR?; THE CURRENT READ WILL BE. FOR EXAMPLE, IF THE TERMINAL ISH?; SET TO "NOECHO" MODE, THE READ MODIFIER TF.RNE WILL BE SET <; REGARDLESS OF WHETHER THE USER SPECIFIED IT IN THE QIO.9; THE RESULTING MODIFIERS ARE SAVED IN THE I/O PACKET.H7; 5. THE TIMEOUT REQUEST MODIFIER/VALUE IS PROCESSED.@; 6. THE APPROPRIATE STATUS BITS ARE ESTABLISHED TO MARK INPUT*; BUSY AND INITIALIZE INPUT PROCESSING.=; 7. A REQUEST FOR "LEADING LINEFEED" IS MADE IF NECESSARY.FH; 8. CONTROL IS PASSED TO THE ROUTINES TO START BUFFERED OR UNBUFFERED#; INPUT, WHICHEVER IS NECESSARY.H;D ; INPUTS:$; R3 => CURRENT I/O REQUEST PACKET; R4 => UCBX FOR THE TERMINALE$; R5 => U.TSTA OF THE TERMINAL UCB4; I.LNK(R3) = 0 IF THE REQUEST IS IO.RLB OR IO.RSDB; = 1 IF THIS IS THE RE00"~|{ccccAD PART OF A READ AFTER PROMPT REQUEST,; (THE PROMPT OUTPUT HAS BEEN COMPLETED) ; OUTPUTS:AC; R2 => FIRST INPUT BUFFER (IF BUFFERED INPUT IS TO BE STARTED)D&; (R4) => CURRENT I/O REQUEST PACKET2; UCB STATUS AND UCBX INITIALIZED TO START INPUT;I$; REGISTERS MODIFIED: R0, R1, R2;-;: .IF DF B$$MAP PPRSD::T= CLRB I.FCN+1(R3) ;CLEAR OUT HIGH BYTE OF THE FUNCTION CODEM$ BR RLB1 ;CONTINUE IN COMMON CODE .ENDC ;B$$MAP7 .SBTTL . PPRLB - READ-LOGICAL-BLOCK REQUEST (IO.RLB)T PPRLB::  .IF DF T$$EIOG BIC #S6.EIO,U.TST6-U.TSTA(R5) ;INDICATE THAT THIS IS NOT EXTENDED IO  .ENDC ;T$$EIO- CLRB I.FCN+1(R3) ;CLEAR FLAGS IN HIGH BYTE  PPRLB1:  .IF DF T$$CCAE MOV U.TAST(R4),R0 ;GET UNSOLICITED INPUT AST BLOCK IF THERE IS ONE # BEQ RLB1 ;IF EQ, NOT ONE...SKIP3C BICB #AF.LCK,A.PRM+5(R0) ;UNLOCK THE AST BLOCK IN CASE IT WAS...N ; ...LOCKED DUE TO TF.NOTP .ENDC ;T$$CCARLB1:B; BIC #S5.ITI,U.TST5-U.TSTA(R5) ;INDICATE THAT THIS IS NOT ;IMMEDIATE TIMEOUTA ASSUME U.TCI,0 0 MOV R3,(R4)+ ;SAVE THE CURRENT PACKET ADDRESS;CO; SET UP THE FULL READ MODIFIERS FOR THE CURRENT READ REQUEST. THIS INVOLVESK; TAKING THE MODIFIERS SPECIFIED WITH THE READ AND "OR'ING" THEM WITH THEM; PERMANENT CHARACTERISTICS FLAGS. NOTE THAT THE MODIFIERS MAY EXTEND INTO C; THE HIGH BYTE OF I.FCN IF CONTROL WAS PASSED HERE FROM "PPEIO".M; NOTE: IF THERE IS EVER A READ MODIFIER WITH THE SAME BIT VALUE AS S1.TSYEL; AND S3.TSY, THIS HERE ROB PHILPOTT MEMORIAL BIT SETTING CODE WILL BREAK!;  ASSUME TF.RAL,S3.RALA ASSUME TF.RNE,S3.NECT ASSUME TF.RPT,S3.PTHR ASSUME TF.RES,S3.RES.A MOV I.FCN(R3),R0 ;GET ALL READ MODIFIERS (COULD BE FROM PPEIO)A/ BIC #4,R0 ;CLEAR MODIFIERS THAT WON'T MAPT; MOV 4(R5),R1 ;GET THE CURRENT INPUT CHARACTERISTICS BITS @ BIC #^C,R1 ;CLEAN THEM UP; BIS R1,R0 ;"OR" IN PERM CHARACTERISTICS WITH TEMP FLAGSU> MOV R0,I.FCN(R3) ;SAVE THE COMPLETE FLAGS IN THE I/O PACKET;T; SET UP RST AND RSP;7 BIT #TF.RST, R0 ;DOING OLD-STYLE READ W/ SPEC. TERM?M  BEQ 5$ ;BR IF NO >  BIS #S1.RSP!S1.RNF!S1.TNE,R0 ;FORCE SPEC PROC AND NO FILTER 5$: 3  BIT #TF.RTT,R0 ;NEW-STYLE READ WITH TERM. TABLE?A BEQ 10$ ;BR IF NOR6 BIS #S1.RST,R0 ;SAY WE'RE USING SPECIAL TERMINATORS10$: .IF DF T$$EIO  MOV R0,R1 ;GET FUNCTION CODE ASSUME TF.RDI,S6.RDIE ASSUME TF.RLU,S6.RLU6 BIC #^C,R1 ;ISOLATE RDI AND RLU BITS; BIS R1,U.TST6-U.TSTA(R5) ;AND PLOP THEM INTO STATUS WORDO .ENDC ;T$$EIO;) ; SET UP TTSYNC AND PASTHRU AS FOLLOWS:.G!; 1. OLD STYLE "TF.RAL" AND "SET /RPA (S3.RAL)" MAP INTO PASTHRU MODEN"; WITH TTSYNC DISABLED.G#; 2. NEW STYLE "TF.RPT" AND "PASTHRU MODE" ARE INDEPENDENT OF TTSYNC.TC$; 3. IF TTSYNC IS DISABLED, TF.RPT IS EQUIVALENT TO OLD "TF.RAL".T%;O& ASSUME S3.RAL,S1.PTHS' ASSUME S3.TSY,S1.TSYS3( BIT #TF.RAL,R0 ;WAS EITHER TF.RAL OR S3.RAL SET? 7) BEQ 20$ ;IF EQ, NO...SKIP TO CHECK FOR PASTHRU MODEI<* BIC #S1.TSY,(R5) ;CLEAR TTSYNC FOR OLD READ-PASS-ALL MODE:+ BIC #S1.TSY,R0 ;CLEAR TTSYNC FOR OLD READ-PASS-ALL MODE7, BR 30$ ;SKIP TO FORCE PASTHRU MODE ON THE READ ALSOT-20$:3. BIT #TF.RPT,R0 ;WAS EITHER TF.RPT OR S3.PTH SET?D;/ BEQ 40$ ;IF EQ, NO...SKIP TO FINISH MODIFIER PROCESSING 030$:1;2 BIS #S1.PTH,R0 ;BOTH TF.RPT AND TF.RAL USE PASSTHRU MODE3;ML4; ESTABLISH THE TIMEOUT VALUE TO BE USED FOR THIS READ REQUEST. NOTE THATN5; NORMAL READS MULTIPLY THE TIMEOUT VALUE BY TEN. "IO.EIO" TAKE THE TIMEOUTL6; VALUE AS SPECIFIED. A ZERO TIMEOUT ON A NORMAL READ WILL TIME OUT WHICHM7; IS A CHANGE FROM THE OLD BEHAVIOR. A ZERO TIMEOUT TIMES OUT IMMEDIATELY,:G8; RETURNING DATA THAT IS CURRENTLY IN THE TYPE-AHEAD BUFFER (IF ANY).Q9;.:40$:0; CLR R1 ;ASSUME ZERO-LENGTH TIMEOUT SPECIFIED< ASSUME TF.TMO,2006= TSTB R000*~;}|tt tfDATA ;IS USER REQUESTING A TIMEOUT ON THE READ?,> BPL 70$ ;IF PL, NO...SKIP TIMEOUT CHECKS8? MOVB I.PRM+6(R3),R1 ;GET USER SPECIFIED TIMEOUT VALUE$@ BNE 45$ ;IF NE, NOT ZERO TIMEOUTFA BIS #S5.ITI,U.TST5-U.TSTA(R5) ;INDICATE IMMEDIATE TIMEOUT IS NEEDED'B BR 70$ ;AND VALUE IS READY TO STASH.C45$:D .IF DF T$$EIOE=F BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS/IS THIS AN EXTENDED IO?E,G BNE 70$ ;IF SO, INTERPRET VALUE DIRECTLYHI .ENDC ;T$$EIOJK;EAL; MULTIPLY THE SPECIFIED TIMEOUT VALUE BY TEN FOR NORMAL READS.EM;N4N CMPB R1,#<377/10.> ;EXCEED MAXIMUM TIMEOUT VALUE?O BLOS 50$ ;IF LOS, NOP6Q MOV #377,R1 ;SET MAXIMUM TIMEOUT LENGTH IN SECONDS"R BR 70$ ;USE THIS TIMEOUT VALUES50$:T .IF DF R$$EISU'V MUL #10.,R1 ;ADJUST TO UNITS OF TEN WX .IFF ;R$$EISYZ ASL R1 ;MULTIPLY BY TWOT$[ MOV R1,-(SP) ;SAVE PARTIAL RESULT\ ASL R1 ;MAKE IT X 4E] ASL R1 ;MAKE IT X 8A'^ ADD (SP)+,R1 ;(X 8) + (X 2) = (X 10)_` .ENDC ;R$$EISab70$:/c MOVB R1,U.TITI-U.TIP(R4) ;SAVE TIMEOUT VALUEPBd MOVB R1,I.PRM+6(R3) ;SAVE TIMEOUT VALUE IN I/O PACKET FOR LATERe;?f; TURN NECESSARY MODIFIERS INTO INPUT STATUS FLAGS IN U.TSTA. g;;h ASSUME TF.RST,S1.RSTi ASSUME S3.NEC,S1.RNEj ASSUME S3.RES,S1.RES k ASSUME TF.RNF,S1.RNF.l ASSUME TF.TNE,S1.TNERmFn BIC #^C,R06o ;CLEAR UNDESIRED STATUS BITS FROM READ MODIFIERS5p BIS R0,(R5) ;ESTABLISH NEW INPUT PROCESSING FLAGS*q BIC #S2.CTO,2(R5) ;READ CLEARS ^O STATE:r MOVB #TF.RLB,I.FCN+1(R3) ;REMEMBER THAT THIS WAS A READs;R:t; DETERMINE WHETHER OR NOT TO OUTPUT A LEADING LINEFEED.u;S0v BIT #S1.RNE,(R5)+ ;IS INPUT ECHOING REQUIRED?w BNE 80$ ;IF NE, NO...SKIP x ASSUME S3.FDX,2004y TSTB 2(R5) ;IS THE LINE SET TO FULL DUPLEX MODE?.z BMI 80$ ;IF MI, NO...SKIP LEADING LINEFEED.{ BIT #S2.FLF,(R5) ;NEED TO FORCE A LINEFEED?0| BEQ 80$ ;IF EQ, NO...DON'T OUTPUT ONE - SKIP?} MOV #PRLF,-(SP) ;OUTPUT LEADING LF WHEN WE EXIT THIS ROUTINER~80$: .IF DF T$$EIO$ BIS #S1.IBY,-(R5) ;SET INPUT BUSY ASSUME S6.RDI,100000E2 TST U.TST6-U.TSTA(R5) ;DEFAULT INPUT SPECIFIED?: BMI 90$ ;IF NE YES, BUFFER STATUS HAS ALREADY BEEN SET) BIS #S1.IBF,@R5 ;ASSUME BUFFERED INPUTT .IFF ;T$$EIO E BIS #S1.IBY!S1.IBF,-(R5) ;SET INPUT BUSY AND ASSUME BUFFERED INPUT .ENDC ;T$$EIO90$:D MOVB U.TCHP-U.TSTA(R5),U.TIHP-2(R4) ;SAVE INITIAL CURSOR POSITION .IF DF T$$RPR8 TST (R3) ;HAVE WE JUST FINISHED OUTPUTTING A PROMPT?  BEQ RDBCHK ;IF EQ, NO...SKIP/ CLR (R3) ;RESET THE COMPLETION STATUS FIELDT> TST I.PRM+16(R3) ;DID THE PROMPT SUCCESSFULLY INITIALIZE..." ; ...INTERMEDIATE BUFFERING?3 BEQ UNBI ;IF EQ, NO...GO AND DO UNBUFFERED READF? MOV U.TFIB-U.TIP(R4),R2 ;ELSE, GET THE FIRST INPUT BUFFER...S/ ; ...WHICH WAS ALLOCATED BEFORE PROMPTING BR BUFRD ;DO BUFFERED READ .ENDC ;T$$RPR.PAGEO' .SBTTL INPUT REQUEST BUFFER HANDLING(A .SBTTL . RDBCHK - DETERMINE NEED FOR BUFFERED/UNBUFFERED INPUTF;NK; RDBCHK - DETERMINE THE TYPE OF INPUT BUFFERING TO BE USED ON THIS READ.3;D RDBCHK: . CALL $TSTBF ;SHOULD WE DO A BUFFERED READ?. BCS UNBI ;IF CS, NO...DO AN UNBUFFERED ONE .IF DF T$$EIO ASSUME S6.RDI,100000 5 TST U.TST6-U.TSTA(R5) ;READING WITH DEFAULT INPUT?T0 BPL 10$ ;IF EQ NO, NEED TO ALLOCATE A BUFFERD MOV U.TDIF-U.TIP(R4),R2 ;USE DEFAULT INPUT BUFFERS FOR INPUT DATA+ BNE 20$ ;IF NE HAVE A BUFFER WE CAN USEE. BR UNBI ;ELSE NOT ENOUGH BUFFERS AVAILABLE .ENDC ;T$$EIO10$:1 CALL ALTB ;GET A BUFFER FOR THE BUFFERED READ 5 BCS UNBI ;IF CS, FAILED...MUST DO UNBUFFERED READ20$:( MOV R2,-(SP) ;SAVE THE BUFFER ADDRESS2 CALL $INIBF ;INITIALIZE INTERMEDIATE BUFFERING, MOV (SP)+,R2 ;RETRIEVE THE BUFFER ADDRESS .DSABL LSB/ .SBTTL . BUFRD - SET UP TO DO BUFFERED INPUTI;,&; BUFRD - SET UP FOR BUFFERED INPUT.;002~|{ccccBUFRD:( ADD #U.TTIC-U.TIP,R4 ;POINT TO U.TTIC MOV R4,R1 ;COPY POINTERS3 MOV I.PRM+4(R3),(R1)+ ;SET UP MAXIMUM BYTE COUNT  ASSUME U.TFIB,U.TTIC+2 ;R0; BUFRD1 - LINK CURRENT BUFFER TO PREVIOUS ONE;R BUFRD1:, MOV R2,(R1) ;LINK FIRST BUFFER TO U.TFIB) .SBTTL . NXTIB - GET NEXT INPUT BUFFERE;;+$; **-NXTIB - GET NEXT INPUT BUFFER;I; *** NOTE *** THIS ROUTINE IS ALSO CALLED AT DEVICE PRIORITY FROM THE); INPUT DONE INTERRUPT SERVICE ROUTINE.;U ; INPUTS:; R2 => NEW INPUT BUFFER%; R4 => U.TTIC OF THE TERMINAL UCBXM(; U.TTIC = TOTAL REMAINING BYTE COUNT; ; OUTPUTS:F$; R4 => U.TIC OF THE TERMINAL UCBX#; NEW BUFFER LINKED TO OLD BUFFER?; SECOND WORD OF NEW BUFFER SET UP WITH LOGICAL BUFFER LENGTH1; U.TIP, U.TIP+2, U.TIC, AND U.TTIC ARE UPDATED:; CC-Z = 0 IF THE INPUT BYTE COUNT IS NOT YET EXHAUSTED; = 1 OTHERWISEO;E$; REGISTERS MODIFIED: R2, R3, R4;-;T NXTIB::I5 TST (R2)+ ;POINT TO SECOND WORD OF THE NEW BUFFERU7 MOV #T$$BFL-4,(R2) ;SET LOGICAL LENGTH OF THE BUFFER=- SUB (R2),(R4) ;ADJUST U.TTIC APPROPRIATELYS3 BPL 10$ ;IF PL, THERE IS MORE ROOM STILL...SKIPF= ADD (R4),(R2) ;WENT BELOW ZERO - ADJUST LOG. BUFFER LENGTHW CLR (R4) ;U.TTIC <-- 0 ASSUME U.TIP,U.TTIC-610$:$ CMP -(R4),-(R4) ;POINT TO U.TIP+2C CMP -(R4),-(R2) ;POINT R4 TO U.TIP AND R2 TO START OF THE BUFFERE.PAGEG. .SBTTL GENERAL INPUT/OUTPUT BUFFER HANDLING: .SBTTL . UPUB - UPDATE UCBX PARAMETERS FOR BUFFERED I/O;M;+E; **-UPUB - UPDATE PARAMETERS IN UCBX FOR BUFFERED INPUT OR OUTPUT.T;I/; THIS ROUTINE IS CALLED IN THREE SITUATIONS:R#; 1. AT PRIORITY 0 TO START INPUT)); 2. AT DEVICE PRIORITY TO START OUTPUTTD; 3. AT DEVICE PRIORITY FROM THE OUTPUT OR INPUT INTERRUPT SERVICEC; ROUTINE TO SWITCH FROM THE CURRENT PARTIAL BUFFER TO THE NEXT.I; ; INPUTS:"; R2 => INPUT OR OUTPUT BUFFERB; R4 => U.TIP (INPUT) OR U.TOP (OUTPUT) OF THE TERMINAL'S UCBX!; 2(R2) = LOGICAL BUFFER LENGTH; ; OUTPUTS:A; R2 => SECOND WORD OF BUFFERD*; R4 => U.TIC/U.TOC OF THE TERMINAL UCBXI ; U.TIP, U.TIP+2, U.TIC (OR U.TOP, U.TOP+2, U.TOC) ARE UPDATED FOR NEXT. ; PARTIAL TRANSFER.) ; CC-Z = 0 IF THERE IS MORE WORK TO DOM ; = 1 OTHERWISER ;S ; REGISTERS MODIFIED: R2, R4;-;NUPUB::3 MOV R2,(R4)+ ;U.TIP+0/U.TOP+0 <-- BUFFER ADDRESS 3 CMP (R2)+,(R2)+ ;SKIP OVER LINK AND LENGTH WORDSU< MOV R2,(R4)+ ;U.TIP+2/U.TOP+2 <-- START OF DATA IN BUFFER6 MOV -(R2),(R4) ;U.TIC/U.TOC <-- BYTE COUNT FOR THIS" ;(POSSIBLY PARTIAL) TRANSFER  RETURNA/ .SBTTL . UNBI - ESTABLISH NON-BUFFERED INPUT ;)!; UNBI - DO NON-BUFFERED INPUT.L;SUNBI: & CLR I.PRM+16(R3) ;USE $IOFIN AT END* BIC #S1.IBF,(R5) ;SHOW UNBUFFERED INPUT  ASSUME U.TIP,!5" .SBTTL . UPUNB - UPDATE UCB FOR NON-BUFFERED INPUT #;S$;+1%; **-UPUNB - UPDATE UCB FOR NON-BUFFERED INPUT.&;V '; INPUTS:$(; R3 => CURRENT I/O REQUEST PACKET$); R4 => U.TIP OF THE TERMINAL UCBX*; +; OUTPUTS:%,; R4 => U.TTIC OF THE TERMINAL UCBXR@-; U.TIP, U.TIP+2, U.TIC, U.TTIC UPDATED FOR NON-BUFFERED INPUT.; /; REGISTERS MODIFIED: R3, R40;-1; 2UPUNB::P/3 ADD #I.PRM,R3 ;POINT TO PARAMETERS IN PACKET A4 MOV (R3)+,(R4)+ ;U.TIP+0 <-- BUFFER ADDRESS (ADRS DOUBLE WORD) @5 MOV (R3)+,(R4)+ ;U.TIP+2 <-- 2.ND HALF OF ADDRESS DOUBLE WORD6 ASSUME U.TIC,F(7 MOV (R3)+,(R4)+ ;U.TIC <-- BYTE COUNT8 ASSUME U.TTIC,9 CLR (R4) ;U.TTIC <-- 0: RETURN ;ALL DONEO;<=.PAGE="> .SBTTL INPUT REQUEST COMPLETION3? .SBTTL . FPIRD - INPUT REQUEST DONE FORK PROCESSD@;TA;+/B; **-FPIRD - INPUT REQUEST DONE FORK PROCESS.C;::D; THIS ROUTINE IS ENTERED FROM THE FORK DISPATCHER WHEN:<E; 1. AN END OF LINE WAS DETECTED (OR A HARD RECEIVE ERROR)%F; 2. AN INTERMEDIATE BUFFER IS FULLLBG; 3. THE USER TASK BUFFER IS FULL (NON-BUFFERED SOLICITED INPUT)H;;HI; 00:~;}|tt tfDATAAFTER INITIALIZING, THIS ROUTINE DISPATCHES TO PROCESS COMPLETION OF*J; EITHER SOLICITED OR UNSOLICITED INPUT.K;. L; INPUTS:M; R4 => UCBX OF THE TERMINAL$N; R5 => U.TSTA OF THE TERMINAL UCBO;TP; OUTPUTS: NONE.Q;T(R; REGISTERS MODIFIED: R0, R1, R2, R3S;-T;I UFPIRD::RV ASSUME U.TCI,0H+W MOV (R4)+,R3 ;GET CURRENT REQUEST PACKET(X ASSUME U.TIP,U.TCI+27Y MOV (R4)+,R1 ;GET CURRENT BUFFER (IF BUFFERED INPUT)AZ ASSUME U.TIC,U.TIP+4F[ TST (R4)+ ;POINT TO U.TIC\ ASSUME U.TTIC,U.TIC+26] ADD (R4)+,(R4) ;ADD U.TIC TO U.TTIC TO GET TOTAL..."^ ; ...REMAINING BYTES TO READ=_ BEQ IRQDON ;IF EQ, THE BUFFER IS FULL...COMPLETE THE READS/` TST (R3) ;HAS A COMPLETION STATUS BEEN SET?..a BNE IRQDON ;IF NE, YES...COMPLETE THE READb;-Mc; HERE WE ARE DOING BUFFERED INPUT AND THE CURRENT BUFFER IS FULL. WE WILLCNd; TRY TO ALLOCATE ANOTHER BUFFER AND CONTINUE THE READ. NOTE THAT THE INPUTKe; ISR HAS ALREADY CHECKED WHETHER THERE IS ANOTHER BUFFER ALLOCATED (THIS If; COULD BE THE CASE IF THE OPERATOR DID RUBOUT OR CTRL-U). IF THERE IS 9g; ANOTHER BUFFER ALLOCATED ALREADY, WE DON'T COME HERE.Bh; 'i CALL ALTB ;GET ANOTHER INPUT BUFFER ;j BCC BUFRD1 ;IF CC, LINK TO PREVIOUS BUFFER AND CONTINUEY(k MOV #IE.NOD,(R3) ;SET AN ERROR STATUSl ASSUME S1.USI,100000A-m TST (R5) ;ARE WE DOING UNSOLICITED INPUT?R n BPL IRQDON ;IF PL, NO...SKIPo;UAp; UNSOLICITED INPUT REQUIRES ANOTHER BUFFER, WHICH WE FAILED TOEEq; ALLOCATE. THE STATUS "IE.NOD" WILL FORCE A ^U TO FLUSH THE INPUT.Er;A*s JMP USIDON ;COMPLETE UNSOLICITED INPUTt;TIu; SOLICITED INPUT REQUIRES ANOTHER BUFFER, WHICH WE FAILED TO ALLOCATE.T:v; WE WILL RETURN PARTIAL INPUT WITH THE STATUS "IE.NOD".w;Uxy.PAGEI3z .SBTTL . IRQDON - AN INPUT REQUEST HAS COMPLETEDS{;1$|; IRQDON - INPUT REQUEST COMPLETED};S ~IRQDON:P .IF DF T$$ACD# MOV U.ACB-U.TSTA(R5),R2 ;GET ACBN- BEQ 30$ ;TERMINAL DOESN'T HAVE ONE - JUMPE0 CLR U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING2 MOV (R3),A.IOS(R2) ;SET INPUT COMPLETION STATUS3 MOV #A.INPU,R0 ;SET INPUT COMPLETION ENTRY POINTR CALL $SWACD ;CALL ACD ? MOV A.IOS(R2),(R3) ;SET POSSIBLY DIFFERENT INPUT STATUS CODET: BIT #UA.TRA,U.AFLG-U.TSTA(R5) ;TRANSFER CHARACTERS NOW? BEQ 30$ ;IF EQ, NO...SKIP10$:# MOV U.ACB-U.TSTA(R5),R0 ;GET ACBS/ ADD #A.SMAP,R0 ;POINT TO TRANSFER PARAMETERSA1 BIT #S1.IBF,(R5) ;ARE WE DOING BUFFERED INPUT?O BEQ 20$ ;IF EQ, NO...SKIPU( MOV R1,R2 ;COPY INPUT BUFFER ADDRESS3 CMP (R2)+,(R2)+ ;POINT PAST LINK AND COUNT WORDS( MOV R5,(R2)+ ;SAVE R5 IN INPUT BUFFER) MOV R3,(R2)+ ;ALSO SAVE PACKET ADDRESSV5 MOV (R0)+,(R2)+ ;SAVE ACD BUFFER APR BIAS (A.SMAP)D9 MOV (R0)+,(R2)+ ;SAVE ACD BUFFER DISPLACEMENT (A.SBUF)O0 MOV I.PRM+16(R3),(R2)+ ;SAVE TASK PCB ADDRESS8 MOV I.PRM(R3),(R2)+ ;SAVE TASK BUFFER APR BIAS OFFSET1 MOV (R0),(R2) ;SAVE ACD BUFFER LENGTH (A.SLEN) 4 BR 30$ ;TRANSFER WILL OCCUR WHEN $FINBF CALLS US20$: MOV R4,-(SP) ;SAVE R41 MOV (R0)+,R1 ;GET ACD BUFFER APR BIAS (A.SMAP)O5 MOV (R0)+,R2 ;GET ACD BUFFER DISPLACEMENT (A.SBUF), SUB #20000,R2 ;CONVERT TO AN APR5 ADDRESS/ MOV (R0),R0 ;GET ACD BUFFER LENGTH (A.SLEN)D4 MOV U.TIP-U.TTIC(R4),R3 ;GET TASK BUFFER APR BIAS> MOV U.TIP+2-U.TTIC(R4),-(SP) ;SAVE TASK BUFFER DISPLACEMENT? ADD R0,U.TIP+2-U.TTIC(R4) ;UPDATE DISPLACEMENT FOR NEXT TIMER- MOV (SP)+,R4 ;GET TASK BUFFER DISPLACEMENT 8 CALL $BLXIO ;TRANSFER FROM ACD BUFFER TO TASK BUFFER MOV (SP)+,R4 ;RESTORE R40& MOV U.TCI-U.TTIC(R4),R3 ;RESTORE R30 CLR U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING6 MOV #A.CALL,R0 ;SET TRANSFER COMPLETION ENTRY POINT. CALL $SWACD ;CALL ACD TO DEALLOCATE BUFFERB BIT #UA.CAL,U.AFLG-U.TSTA(R5) ;ACD HAVE ANOTHER BUFFER TO COPY?' BNE 10$ ;IF NE, YES...LOOP TO DO ITA= BIS #UA.TRA,U.AFLG-U.TSTA(R5) ;SET FLAG FOR CHECKING LATERE30$: .ENDC ;T$$ACD, CLRB U.TITI-U.TTIC(R4) ;CLEAR INPUT TIMER1 BIT #S1.IBF,(R5) ;ARE WE DOING BUFF00B~|{ccccERED INPUT? < BEQ SOLIDN ;IF EQ, NO...MUST BE SOLICITED INPUT, SO SKIP2 MOV (R1),R2 ;GET NEXT BUFFER (IF THERE IS ONE)0 CALL DELTB ;DEALLOCATE ALL REMAINING BUFFERS) CLR (R1) ;THIS IS NOW THE LAST BUFFER ASSUME S1.USI,100000S- TST (R5) ;ARE WE DOING UNSOLICITED INPUT?E/; BMI USIDON ;IF MI, YES...SKIP TO FINISH ITA3 BPL SOLIDN ;IF PL, NO...PROCESS SOLICITED INPUT0. JMP USIDON ;IF MI, YES...SKIP TO FINISH IT.PAGEC/ .SBTTL . SOLIDN - SOLICITED INPUT COMPLETIONN;F&; SOLIDN - SOLICITED INPUT COMPLETED;T ; INPUTS:$; R3 => CURRENT I/O REQUEST PACKET%; R4 => U.TTIC OF THE TERMINAL UCBXE$; R5 => U.TSTA OF THE TERMINAL UCB;C SOLIDN:H( CALL IRESEL ;RESET INPUT STATE FLAGS/ BIC #S1.IBY,(R5) ;INDICATE INPUT IS NOW IDLED> BIC #S5.ITI,U.TST5-U.TSTA(R5) ;CLEAR IMMEDIATE TIMEOUT FLAG5 CLR U.TCI-U.TTIC(R4) ;CLEAR PACKET POINTER (U.TCI)P= MOV U.TRTT-U.TTIC(R4),R2 ;GET THE TERMINATOR TABLE ADDRESS  BEQ 10$ ;IF EQ, NONE...SKIPO. CALL DETB ;DEALLOCATE THE TERMINATOR TABLE8 CLR U.TRTT-U.TTIC(R4) ;CLEAR TERMINATOR TABLE ADDRESS10$: .IF DF T$$RPR3 MOV U.TFPB-U.TTIC(R4),R2 ;GET PROMPT BUFFER LIST BEQ 20$ ;IF EQ, NONE...SKIPI- CALL DELTB ;DEALLOCATE ALL PROMPT BUFFERS ' CLR U.TFPB-U.TTIC(R4) ;CLEAR POINTER-20$: .ENDC ;T$$RPR- MOV I.PRM+4(R3),R1 ;GET MAXIMUM BYTE COUNTO4 SUB (R4)+,R1 ;SUBTRACT REMAINING BYTES TO READ...' ; ...YIELDING BYTES ACTUALLY READ 0 TST (R3) ;COMPLETION STATUS ALREADY PRESENT?4 BNE 30$ ;IF NE, YES...SKIP TO COMPLETE THE INPUT/ INC (R3) ;BUFFER FULL - SET STATUS = IS.SUC .IF DF T$$ESC9 BIT #S1.ESC,(R5) ;IN THE MIDDLE OF AN ESCAPE SEQUENCE?S, BEQ 30$ ;IF EQ, NO...ALL IS OKAY SO SKIP@ MOV #IE.PES&377,(R3) ;SET ERROR FOR "PARTIAL ESCAPE SEQUENCE"4 BIC #S1.ESC,(R5) ;GET OUT OF ESCAPE SEQUENCE MODE5 CLRB U.TISV-U.TFIB(R4) ;CLEAR INPUT STATE VARIABLEO .ENDC ;T$$ESC30$: .IF DF T$$EIO;3B; IF THIS WAS AN IO.EIO AND THERE ARE MORE CHARACTERS IN THE TAB:; AND THE SYSTEM SUPPORTS ICS, REQUEST ICS NOTIFICATION.;== BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS/IS THIS AN EXTENDED IO?  BEQ 50$ ;IF NOT NO ICS .IF DF T$$ICS1 MOV R3,-(SP) ;SAVE REGISTER DESTROYED BY GCTABT5 CALL GCTAB ;ANY CHARACTERS SITTING IN TYPE-AHEAD?G! MOV (SP)+,R3 ;RESTORE REGISTER  BCS 40$ ;IF CS, NO - SKIPS/ FRKBIT BIS,#FR.ICS ;REQUEST ICS NOTIFICATION. .ENDC ;T$$ICS?40$: BIC #S6.EIO!S6.RLU!S6.RDI,U.TST6-U.TSTA(R5);;CLEAR FLAGS50$: .ENDC ;T$$EIO9 BIT #S1.IBF,(R5) ;ARE WE DOING BUFFERED INPUT? ;**-1.  BEQ 70$ ;IF EQ, NO...SKIPE  ASSUME U.TFIB,U.TTIC+2 0  MOV (R4),R4 ;GET FIRST INPUT BUFFER (U.TFIB):  MOV R4,I.PRM+12(R3) ;STORE POINTER IN PACKET FOR $FINBF  .IF DF T$$SPL9 MOV KISAR6,I.PRM+14(R3) ;STORE MAPPING INFO FOR $FINBF$> SUB #200,I.PRM+14(R3) ;$FINBF EXPECTS MAPPING THROUGH APR 5 .IFF ;T$$SPLN9 MOV KISAR5,I.PRM+14(R3) ;STORE MAPPING INFO FOR $FINBFR .IFTF ;T$$SPL60$:= MOV (R4)+,R2 ;GET LINK TO NEXT BUFFER, POINT TO BYTE COUNT / MOV #T$$BFL,(R4) ;SET TOTAL LENGTH OF BUFFERM MOV R2,R4 ;GET NEXT BUFFER$ BNE 60$ ;IF NE, FOUND ONE...LOOP70$:8 BIT #TF.XOF,I.FCN(R3) ;SEND XOFF AT INPUT COMPLETION?  BEQ 80$ ;IF EQ, NO...SKIPR! ASSUME S3.FDX,200+" TSTB 4(R5) ;IS THIS A FULL DUPLEX LINE?4:# BMI 80$ ;IF MI, YES...TRANSMIT MAY BE BUSY SO SKIP XOF$ MOV R3,-(SP) ;SAVE R3*% MOV #ASXOFF,R3 ;POINT TO XOFF CHARACTER&' .IFT ;T$$SPL(.) MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX*+ .IFF ;T$$SPL ,$- MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX./ .ENDC ;T$$SPL061 CALL ECHRL ;"ECHO" XOFF WITH INTERRUPTS LOCKED OUT2 MOV (SP)+,R3 ;RESTORE R3)380$:45 .IF DF T$$ACD6#7 MOV U.ACB-U.TSTA(R5),R2 ;GET ACBS48 BEQ 90$ ;IF EQ, TERMINAL DOESN'T HAVE ONE...SKIP59 BIT #UA.TRA,U.AFLG-U.TSTA(R5) ;DOING TRANSFER NOW?S: BEQ 90$ ;IF EQ, NO...SKIPV3;00J~;}|tt tfDATA MOV A.IOS+2(R2),R1 ;GET TRANSFER LENGTH FROM ACB+< BIT #S1.IBF,(R5) ;DOING A BUFFERED READ?V= BEQ 90$ ;IF EQ, NO...SKIP.B> INC I.PRM+12(R3) ;SET BUFFER ADDRESS ODD FOR NON-STD $FINBF USE?90$:@A .ENDC ;T$$ACDB2C CALLR DONE ;COMPLETE THE CURRENT INPUT REQUESTDE .PSECT MAP5FGH.PAGE$*I .SBTTL . NXTOB - GET NEXT OUTPUT BUFFERJK;QL;+&M; **-NXTOB - GET NEXT OUTPUT BUFFER.N;BKO; *** NOTE *** THIS ROUTINE IS CALLED AT DEVICE PRIORITY FROM THE OUTPUTSP; INTERRUPT SERVICE ROUTINETQ;. R; INPUTS:&S; R4 => U.TOP+2 OF THE TERMINAL UCBX$T; R5 => U.TSTA OF THE TERMINAL UCBU;. V; OUTPUTS:1-W; IF THERE IS ANOTHER OUTPUT BUFFER LINKED:F X; CC-Z = 0$Y; R4 => U.TOC OF THE TERMINAL UCBX1Z; U.TOP, U.TOP+2, U.TOC UPDATED FOR NEXT BUFFERC[;5\; IF NOTHING MORE TO OUTPUT: ]; CC-Z = 1$^; R4 => U.TOP OF THE TERMINAL UCBX_;T `; REGISTERS MODIFIED: R2, R4a;-b;O cNXTOB::Sde .IF DF T$$ACDf5g BIT #S2.OBF,2(R5) ;;;ARE WE DOING BUFFERED OUTPUT?T/h BEQ 10$ ;;;IF EQ, NO...RETURN WITH CC-Z = 1Eij .ENDC ;T$$ACDk6l MOV -(R4),R2 ;;;GET START OF CURRENT BUFFER (U.TOP);m BEQ 10$ ;;;IF EQ, THIS WAS AN ECHO...EXIT WITH CC-Z = 14+n MOV (R2),R2 ;;;GET START OF NEXT BUFFERT1o BEQ 10$ ;;;IF EQ, NONE...RETURN WITH CC-Z = 1N:p MOVB OPTIMR,U.TOTI-U.TOP(R4) ;;;SET UP THE OUTPUT TIMER%q JMP UPUB ;;;GO AND UPDATE THE UCBDr10$:#s RETURN ;;;RETURN WITH CC-Z = 1tu4v .SBTTL . USIDON - UNSOLICITED INPUT HAS COMPLETEDw;U)x; USIDON - UNSOLICITED INPUT COMPLETED.Iy;-Gz; THIS ROUTINE WILL ALLOCATE A CLI COMMAND BUFFER IN THE SYSTEM POOL. J{; THE INPUT BUFFERS ARE THEN COPIED INTO THE CLI BUFFER AND IT IS QUEUEDI|; TO THE CLI TASK. IF CONTINUATION LINES ARE TO FOLLOW (LAST CHARACTER.6}; OF THIS BUFFER IS A HYPHEN), SIMULATE A CONTRTL-C.~;T ; INPUTS:(; SECOND WORD OF FIRST RECEIVE BUFFER:; <0 - ERRORR; 0 - BUFFER FULL; IS.SUC - SUCCESS.; IS.TMO - TIME-OUT; >IS.TMO - CTRL-U COMPLETED;D USIDON:C7 MOV #M$$CRB-4+1,-(SP) ;GET MAX LENGTH OF CLI COMMANDA ;PLUS 1 FOR TERMINATOR2 SUB (R4)+,(SP) ;GET NUMBER OF BYTES READ PLUS 1 CMP (R3),#IS.TMO ;TIME-OUT? BEQ 50$ ;Y - JUMPS" CMPB (R3)+,#IS.SUC ;TEST STATUS BLO 50$ ;BUFFER FULL - JUMP  BLT 40$ ;ERROR - JUMPT$ BGT 30$ ;CTRL-U COMPLETED - JUMP ;ELSE SUCCESS!, TST $MCRPT ;IS MCR DISPATCHER INSTALLED?- BEQ 50$ ;IF NOT THEN ECHO ^U TO TELL USER  .IF DF T$$SPCC BIC #UM.KIL,U.MUP-U.TSTA(R5) ;RESET CLI CONTINUATION LINE STATUSA .ENDC ;T$$SPC .IF DF T$$SER= MOV #CC.TTD,-(SP) ;ASSUME NEED TO SET CC.TTD IN CLI PACKET: TSTB U.TFPB-U.TFIB(R4) ;HERE BECAUSE USER TYPED CTRL-C? BEQ 10$ ;N - JUMPT= BIT #UM.CMD,U.MUP-U.TSTA(R5) ;COMMAND ALREADY IN PROGRESS?M% BEQ 10$ ;N - NOTHING UNUSUAL THENP8 CLR (SP) ;DON'T SET CC.TTD SO THAT COMPLETION OF THE0 ;COMMAND WE ARE ABOUT TO SEND WON'T AFFECT+ ;THE SERIAL PROCESSING ALREADY IN USEM10$:6 MOV (SP)+,U.TFPB-U.TFIB(R4) ;GET ZERO OR CC.TTD BIT> BIC #UM.CMD,U.MUP-U.TSTA(R5) ;RESET COMMAND IN PROGRESS BIT7 BIT #UM.SER,U.MUP-U.TSTA(R5) ;CLI TYPEAHEAD ENABLED?B BEQ 20$ ;N - JUMPS? BIS #UM.CMD,U.MUP-U.TSTA(R5) ;Y - SHOW A COMMAND IS UNDERWAYP20$: .ENDC ;T$$SER2 CMP (SP),#1 ;ONE BYTE READ? (MUST BE A RETURN) BNE 100$ ;N - JUMP .IF DF T$$SPC0 MOV #CC.PRM,R1 ;SET PROMPT REQUEST STATUS BIT6 BIS U.TFPB-U.TFIB(R4),R1 ;OR IN POSSIBLE CC.TTD BIT MOV R5,R2 ;GET UCB ADDRESS SUB #U.TSTA,R2 ;D0 CALL $QCNTP ;QUEUE PROMPT REQUEST TO THE CLI .IFF ;T$$SPC5 MOV #4,R1 ;Y - ONLY ALLOCATE 4 BYTES FROM THE DSRB CALL $ALOCB ; BCS 50$ ;FAILED - JUMP MOV R0,R1 ;SAVE ADDRESSD" TST (R0)+ ;SKIP PAST LINK WORD# MOV R5,(R0) ;INSERT UCB ADDRESS : SUB #U.TSTA-1,(R0) ;+1 TO INDICATE A SPECIAL MCR PACKET/ BR 140$ ;QUEUE THIS SHORT PACKET TO THE CLIT .IFTF ;T$$SPC30$: BR 200$ ;B00R~|{ccccRANCH AIDS40$: BR 210$ ;,50$: JMP 220$ ;SA454.100$: ;**-2 .IFT ;T$$SPC $ MOV (SP),R1 ;GET CHARACTER COUNT7 ADD #C.CTXT+77,R1 ;ROUND UP TO NEXT 32 WORD BOUNDARYB> ASH #-6,R1 ;COMPUTE NUMBER OF SECONDARY POOL BLOCKS NEEDED$ CALL $ALSEC ;ALLOCATE CLI BUFFER BCS 220$ ;FAILURE - JUMP# MOVB (R3),-(SP) ;SAVE TERMINATOR1 .IF NDF T$$SPL 4 MOV U.TFPB-U.TFIB(R4),-(SP) ;SAVE CLI STATUS WORD .IFTF ;NDF T$$SPL  MOV R0,KISAR6 ;MAP CLI BUFFER MOV #140002,R2 ;POINT TO IT3 MOV $MCRPT,(R2)+ ;SET CLI DISPATCHER TCB ADDRESSF  MOV R5,(R2) ;SET UCB ADDRESS SUB #U.TSTA,(R2)+ ; .IFT ;NDF T$$SPLP& MOV 4(SP),(R2) ;SET CHARACTER COUNT .IFF ;NDF T$$SPLR& MOV 2(SP),(R2) ;SET CHARACTER COUNT .IFTF ;NDF T$$SPL DEC (R2)+ ;LESS TERMINATOR .IFT ;NDF T$$SPL" MOV (SP)+,(R2)+ ;SET STATUS BIT .IFF ;NDF T$$SPLS. MOV U.TFPB-U.TFIB(R4),(R2)+ ;SET STATUS BIT .ENDC ;NDF T$$SPL) CLR (R2)+ ;CLEAR TEXT STARTING OFFSET)& MOVB (SP)+,(R2)+ ;INSERT TERMINATOR: MOVB R1,(R2)+ ;SET NUMBER OF SECONDARY POOL BLOCKS USED" MOV $DALED,KISAR6 ;REMAP DRIVER* MOV (R4),R1 ;GET FIRST BUFFER (U.TFIB)" MOV R4,-(SP) ;SAVE UCBX POINTER MOV R2,R4 ;CHANGE HANDSF$ MOV 2(SP),R2 ;GET CHARACTER COUNT! MOV R5,-(SP) ;SAVE UCB POINTER .IFF ;T$$SPC2) MOV #M$$CRB,R1 ;GET SIZE OF CLI BUFFER$ CALL $ALOCB ;ALLOCATE CLI BUFFER BCS 220$ ;FAILURE - JUMP< MOVB (R3),@U.TIP+2-U.TFIB(R4) ;STORE TERMINATOR IN BUFFER4 MOV (SP),R2 ;GET TOTAL NUMBER OF CHARACTERS READ ;PLUS TERMINATOR0  MOV R0,-(SP) ;SAVE CLI COMMAND BUFFER ADDRESS  TST (R0)+ ;SKIP LINK WORDF#  MOV R5,(R0) ;INSERT UCB ADDRESSC  SUB #U.TSTA,(R0)+ ;*  MOV (R4),R1 ;GET FIRST BUFFER (U.TFIB) .IFTF ;T$$SPC110$:C, MOV (R1)+,-(SP) ;SAVE LINK TO NEXT BUFFER TST (R1)+ ;SKIP SECOND WORD6 MOV #T$$BFL-4,R3 ;GET MAX NUMBER OF BYTES IN BUFFER CMP R3,R2 ;TOO MANY? BLE 120$ ;N - JUMP MOV R2,R3 ;Y - ADJUST120$:,. SUB R3,R2 ;GET NUMBER OF BYTES STILL TO GO130$:M .IFT ;T$$SPCP7 MOVB (R1)+,R5 ;GET NEXT CHARACTER FROM DRIVER BUFFERW  MOV R0,KISAR6 ;MAP CLI BUFFER-  MOVB R5,(R4)+ ;PUT CHARACTER IN CLI BUFFER1)! MOV $DALED,KISAR6 ;REMAP DRIVER BUFFER;"# .IFF ;T$$SPC$)% MOVB (R1)+,(R0)+ ;COPY INTO CLI BUFFER&' .IFTF ;T$$SPC( ) DEC R3 ;DECREMENT BYTE COUNT** BGT 130$ ;IF GT, LOOP FOR MORE TO COPY + MOV (SP)+,R1 ;GET NEXT BUFFER!, BNE 110$ ;THERE IS ONE - LOOP,-. .IFT ;T$$SPCN/ 0 MOV R0,KISAR6 ;MAP CLI BUFFER;1 MOVB #CH.CR,-(R4) ;DELIMIT BUFFER WITH A CARRIAGE RETURNR.2 MOVB -(R4),4(SP) ;SAVE LAST INPUT CHARACTER%3 MOV $DALED,KISAR6 ;REMAP DATASPACE $4 MOV (SP)+,R5 ;RESTORE UCB POINTER%5 MOV (SP)+,R4 ;RESTORE UCBX POINTERP86 MOV R0,R1 ;GET SECONDARY POOL COMMAND BUFFER ADDRESS)7 CALL $QCPKT ;QUEUE CLI COMMAND BUFFERY89 .IFF ;T$$SPC :'; MOV (SP)+,R1 ;GET CLI COMMAND BUFFERR2< MOVB -2(R0),(SP) ;N - SAVE LAST INPUT CHARACTER=140$:)> CALL $QMCRL ;QUEUE CLI COMMAND BUFFERL?@ .ENDC ;T$$SPCAB .IF DF R$$MPLC.D CMPB (SP),#'- ;WAS LAST CHARACTER A HYPHEN?EF .IF DF A$$CLIG!G BNE 205$ ;N - JUMP ;SA454 3I MOV U.MUP-U.TSTA(R5),R2 ;GET CLI OFFSET ;**-1R-J BIC #^C,R2 ;SEPARATE OUT CLI INDEXC/K MOV $CPTBL(R2),R2 ;POINT TO CLI PARSER BLOCKT7L BIT #CP.SGL,C.PSTS(R2) ;CONTINUATION LINES ACCEPTED?MN .ENDC ;A$$CLIO4P BEQ 300$ ;Y - CONTINUATION LINES TO FOLLOW, JUMPP BR 205$ ;SA454P ;SA454P .IFTF ;R$$MPL ;SA454P ;SA454P200$: ;SA454SP .IFT ;R$$MPL ;SA454PP ;SA454CP TST U.TFPB-U.TFIB(R4) ;ARE WE DOING A CONTINUATION LINE? ;SA4545'P BPL 205$ ;PL - NO -BRANCH ;SA454CIP FRKBIT BIS,#FR.KIL ;AN ERROR OCCURED, SO KILL THE CONTIN. LINE. ;SA454RP205$: ;SA454LQR .ENDC ;R$$MPLS$U TST (SP)+ ;CLEAN STA00Z~;}|tt tfDATACK ;**-1(V CALL IRESEL ;RESET INPUT STATE FLAGS>W BIC #S1.USI!S1.IBY,(R5) ;CLEAR ADDITIONAL INPUT STATE FLAGS=X CLR U.TFPB-U.TFIB(R4) ;CLEAN UP TEMPORARY VARIABLE WE USED Y8Z FRKBIT BIS,#FR.GRQ ;TRY TO GET ANOTHER REQUEST PACKET[5\ CLR U.TCI-U.TFIB(R4) ;CLEAR PACKET POINTER (U.TCI)I'] MOV (R4),R2 ;GET FIRST INPUT BUFFERC8^ CALLR DELTB ;DEALLOCATE ALL INPUT BUFFERS AND RETURN_;T5`; ERROR DURING UNSOLICITED INPUT. THESE ERRORS ARE:-a; 1. FAILURE TO ALLOCATE CLI COMMAND BUFFERKb; 2. TIME-OUTL%c; 3. BUFFER FULL WITH NO TERMINATORB&d; IN EITHER CASE, SIMULATE A CTRL-U.e;Tf210$:A2g CMPB -(R3),#IE.EOF ;END-OF-FILE (CTRL-Z TYPED)?3h BEQ 200$ ;Y - DON'T ECHO ^U (^Z ALREADY ECHOED) i220$:E!j BIT #S1.OBY,(R5) ;OUTPUT BUSY?I8k BNE 200$ ;Y - WE CANNOT BEGIN OUTPUT OF A ^U BECAUSE+l ;OUTPUT IS ALREADY BUSY. WE CAN'T DOCm ;ANYTHING BUT GIVE UPUn230$:*o MOVB #CH.CTU,(SP) ;GET CTRL-U CHARACTER$p ;(OVERWRITE OLD WORD ON STACK)3q BR 310$ ;REQUEST POST-FORK PROCESSING OF CTRL-U r;Ws; CLI CONTINUATION EXPECTEDEt;Eu300$:ECv MOVB #CH.CTC,(SP) ;GET CTRL-C CHARACTER (OVER OLD WORD ON STACK)Zwx .IF DF T$$SPCy=z MOV #100000,U.TFPB-U.TFIB(R4) ;SET CLI CONTINUATION PROMPT({| .ENDC ;T$$SPC}~310$: ;REFERENCE LABELU .IF DF T$$SERA BIC #UM.CMD,U.MUP-U.TSTA(R5) ;SHOW NO CLI COMMANDS IN PROGRESSU .ENDC ;T$$SER .IF DF T$$MOD' BITB #US.DSB!US.CRW,U.STS-U.TSTA(R5)T, ;LINE DISABLED OR WAITING FOR CARRIER? BNE 200$ ;Y - JUMP .ENDC ;T$$MOD .IF DF T$$SPL= MOVB (SP)+,U.TECO-U.TSTA(R5) ;LOAD CHARACTER FOR POST-FORK .IFF ;T$$SPL= MOVB (SP)+,U.TECB-U.TFIB(R4) ;LOAD CHARACTER FOR POST-FORK .ENDC ;T$$SPL  ;PROCESSING IN ECHO BUFFERB FRKBIT BIS,# ;TRY TO GET ANOTHER PACKET (FR.GRQ)( ;REQUEST POST-FORK PROCESSING) ;TRY TO GET ANOTHER PACKET (FR.GRQ)S, ;REQUEST POST-FORK PROCESSING (FR.PFP) RETURN ;RETURNE.PAGE ' .SBTTL OUTPUT REQUEST PRE-PROCESSING.. .SBTTL . PPWLB - WRITE-SPECIAL-DATA REQUEST;A;+!; **-PPWSD - WRITE SPECIAL DATAT6; **-PPRPR - WRITE THE PROMPT OF A READ-AFTER-PROMPT"; **-PPWLB - WRITE-LOGICAL-BLOCK; ; INPUTS:; R3 I/O PACKET ADDRESS; I.LNK = 0; R4 UCBX ADDRESSO; R5 POINTER TO U.TSTA;;  .ENABL LSBT .IF DF B$$MAP PPWSD::T7 BIC #TF.RCU!TF.WBT,I.FCN(R3) ;CLEAR DISALLOWED BITSO@ MOVB I.PRM+10(R3),U.TDYP(R4) ;STORE THE DATA TYPE (4TH PARM)C CLR I.PRM+10(R3) ;NO VFC OR CURSOR POSITIONING ALLOWED (FOR CUP)A8 CLR I.PRM+6(R3) ;NO VFC OR CURSOR POSITIONING ALLOWED BR WLB1 ;DO THE OUTPUT .ENDC ;B$$MAP7 .SBTTL . PPRPR - WRITE PROMPT OF A READ-AFTER-PROMPT .IF DF T$$RPR PPRPR::KA CLRB I.FCN+1(R3) ;WIPE OUT HIGH BYTE FOR LATER CHECKS IN PPRLB" MOV R3,R2 ;COPY PACKET POINTER& ADD #I.PRM+16,R2 ;POINT TO I.PRM+168 MOV (R2),-(SP) ;SAVE 2.ND WORD OF ADDRESS DOUBLE WORD7 MOV -(R2),2(R2) ;MOVE VFC/CURSOR-CONTROL TO I.PRM+16 / MOV -(R2),2(R2) ;MOVE BYTE COUNT TO I.PRM+14C4 MOV (SP)+,(R2) ;MOVE 2.ND WORD OF ADW TO I.PRM+12 PPRPR1: 4 INC (R3) ;SET STATUS NON-ZERO TO INDICATE IO.RPR ;(FOR EASIER CHECKING)7 CLR U.TFOB(R4) ;CLEAR POINTER TO FIRST OUTPUT BUFFERC .IF DF B$$MAP. CLRB U.TDYP(R4) ;INDICATE DATA TYPE 0, TEXT .ENDC ;B$$MAP  BR WLB2 ;BYPASS TF.CCO CHECK .ENDC ;T$$RPR/ .SBTTL . PPWLB - WRITE-LOGICAL-BLOCK REQUEST);); PPWLB - WRITE LOGICAL BLOCKM; PPWLB::) .IF DF T$$CUP8 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:T .ENDC ;B$$MAP( BIT #TF.CCO,I.FCN(R3) ;CANCEL CTRL-O? BEQ WLB3 ;N - JUMPWLB2:T BIC #S2.CTO,2(R5) ;Y - DO ITMWLB3: / BIT #S2.CTO,2(R5) ;OUTPUT STOPPED BY CTRL-O?- ;(CAN ON00b~|{ccccLY HAPPEN IF TERM. IS ATTACHED)U  BNE 10$ ;Y - FINISH DIRECTLY. CALL ALTB ;ALLOCATE AN INTERMEDIATE BUFFER" BCC 30$ ;IF CC, GOT ONE...SKIP .IF DF T$$EIO< MOV U.TDIF(R4),R2 ;GET FIRST DEFAULT INPUT BUFFER, IF ANY0 CALL DELTB ;DEALLOCATE DEFAULT INPUT BUFFERS  CLR U.TDIF(R4) ;CLEAR POINTER .ENDC ;T$$EIO2 MOV #IE.NOD&377,R0 ;ERROR - NO BUFFER AVAILABLE BR 20$ ;SKIP10$: MOV #IS.SUC,R0 ;SUCCESS20$:( JMP IOFIN ;FINISH THE OUTPUT REQUEST30$:- MOV R3,U.TCO(R4) ;U.TCO <-- PACKET ADDRESSY-  MOVB I.FCN(R3),R0 ;GET IO SUBFUNCTION CODEI   .IF DF T$$RPR   TST (R3) ;PROMPT FOR IO.RPR? BEQ 40$ ;N - JUMP ASSUME TF.WAL,TF.BIN*4S( ASL R0 ;SHIFT SUBF. CODE LEFT 2 BITS  ASL R0O .IF DF T$$CUP ASSUME TF.RCU,S2.RCUR6 BIC #TF.RCU,R0 ;CAN'T DO CURSOR RESTORE WITH IO.RPR .ENDC ;T$$CUP# BIS #S1.IBY,(R5) ;SET INPUT BUSYS6 ADD #10,R3 ;ADVANCE PACKET POINTER SO OFFSET I.PRM* ;FROM R3 POINTS AT PROMPT PARAMETERS9 MOV R2,U.TFPB(R4) ;SAVE POINTER TO FIRST PROMPT BUFFERC  .ENDC ;T$$RPR!"40$:# ASSUME S2.WAL,TF.WALF$ ASSUME S2.RCU,TF.RCUN% BIC #^C,R0-& ;CLEAR ALL BUT WAL AND RCU SUBFUNCTIONSS%' TST (R5)+ ;POINT TO STATUS WORD 22( BIC #S2.WAL!S2.PCU!S2.RCU,(R5) ;CLEAR OLD FLAGS&) BIS R0,(R5) ;OR INTO STATUS WORD 2 * MOV R4,R1 + ADD #U.TOC,R1 ;POINT TO U.TOC, CLR (R1)+ ;CLEAR U.TOC- ASSUME U.TTOC,U.TOC+25. MOV I.PRM+4(R3),(R1)+ ;U.TTOC <-- TOTAL BYTE COUNT/ ASSUME U.TFOB,U.TTOC+2P(0 MOV R2,(R1) ;LINK BUFFER TO LISTHEAD1;$.2; INTERPRET AND SAVE VERTICAL FORMAT CONTROL3; )4 BIC #S2.CR,(R5) ;ASSUME NO TRAILING CR056 .IF DF T$$CUP7/8 TSTB I.PRM+7(R3) ;CURSOR POSITION SPECIFIED?T9 BEQ 50$ ;N - JUMP2;: MOV I.PRM+6(R3),U.TOC(R4) ;Y - SAVE CURSOR POS. IN U.TOC ; BIS #S2.PCU,(R5) ;SET FLAG1 < BR 80$ ;=50$:>? .ENDC ;T$$CUP@4A MOV #VFCRT,R0 ;POINT TO RECOGNITION TABLE FOR VFCB60$:C TSTB (R0)+ ;END OF TABLE?ND BMI 70$ ;Y - JUMPT"E CMPB -1(R0),I.PRM+6(R3) ;MATCH?F BNE 60$ ;N - LOOP G70$:*H SUB #CHRT+1,R0 ;GET INDEX IN CHRD TABLEI ASL R0 ;MAKE WORD INDEXR5J MOVB CHRD(R0),U.TVFC(R4) ;STORE ENCODED VFC IN UCB3&K ;(SEE MODULE "TTDAT" FOR CODING)L ASSUME ,0P2M BISB CHRD+1(R0),1(R5) ;SAVE CR FLAG IN U.TSTA+2N80$:%O TST -(R5) ;POINT TO STATUS WORD 1PQ .IF DF T$$RPRR,S MOV U.TCO(R4),R0 ;GET REAL PACKET POINTER:T MOV SP,I.PRM+16(R0) ;ASSUME WE CAN BUFFER ALL OUTPUT IN(U ;ONE LIST - MAKE I.PRM+16 NON-ZEROVW .IFF ;T$$RPR$X:Y MOV SP,I.PRM+16(R3) ;ASSUME WE CAN BUFFER ALL OUTPUT IN(Z ;ONE LIST - MAKE I.PRM+16 NON-ZERO[\ .ENDC ;T$$RPR] ^ .DSABL LSBC_.PAGE (` .SBTTL OUTPUT REQUEST BUFFER HANDLING(a .SBTTL . WRITE1 - FILL OUTPUT BUFFERSb;Ec;+5d; **-WRITE1 - FILL OUTPUT BUFFERS WITH OUTPUT DATA.We; f; INPUTS:)g; U.TFOB POINTER TO FIRST OUTPUT BUFFER h; R3 POINTER TO PACKET!i; (ADVANCED 4 WORDS IF IO.RPR)Aj; R4 POINTER TO UCBXk; R5 POINTER TO U.TSTA&l; U.TCHP CURRENT HORIZONTAL POSITION$m; U.TCVP CURRENT VERTICAL POSITION*n; U.TVFC ENCODED VERTICAL FORMAT CONTROLo;-p; qWRITE1:Crs .IF DF T$$RPRtu ASSUME U.TCHP&1,0v ASSUME U.TCVP,U.TCHP+1D@w MOV U.TCHP-U.TSTA(R5),-(SP) ;SAVE CURRENT HOR. AND VERT. POS.xy .ENDCz{| .IF DF T$$CUP}9~; SAVE CURRENT HORIZONTAL AND VERTICAL POSITION IN CASET ; CURSOR RESTORE IS REQUESTED.;  ASSUME U.TSHP&1,0 ASSUME U.TSVP,U.TSHP+1  .IF DF T$$RPR MOV (SP),U.TSHP(R4) .IFF ;T$$RPR# MOV U.TCHP-U.TSTA(R5),U.TSHP(R4)  .ENDC ;T$$RPR) MOV #EXPC3,EXPCP ;SET POINTER TO EXPC3 .IFTF ;T$$CUP ; LK720S; ; LK720X; CHECK IF 'PURE' IO.WAL. IF IT IS 'PURE', MEANING NO VFC, CURSOR POSITIONING, ; LK720U; ETC. TRANSFER IS DONE DIRECTLY FROM A TASK BUFFER, OTHERWISE TRANSFER IS ; LK720S7; DONE THROUGH INTERMEDIATE TTDRV 00j~;}|tt tfDATABUFFERS ; LK720A; ; LK720 ; LK720R .IF DF T$$DMA ; LK720 ; LK720 ; LK720R/ BIT #S2.WAL,2(R5) ;DOING IO.WAL? ; LK720# BEQ 5$ ;NO ; LK720X@ BIT #S5.DMA,U.TST5-U.TSTA(R5) ;CHECK FOR DMA DEVICE ; LK7200 BEQ 5$ ;NO. SETUP INTERNAL BUFFERS ; LK720@ BIT #S1.IBY,(R5) ;CHECK IF IO.RPR!TF.BIN IN PROGERSS ; LK724/ BNE 5$ ;YES. SETUP REGULAR OUTPUT ; LK724  ; LK720 .IF DF T$$CUP ; LK720R ; LK720AB BIT #S2.PCU!S2.RCU!S2.CR,2(R5) ;CURSOR POS. REQUESTED? ; LK720 ; LK720  .IFF ;DF T$$CUP ; LK720 ; LK720;: BIT #S2.CR,2(R5) ;CARRIAGE RETURN AT THE END? ; LK720 ; LK720.! .IFTF ;DF T$$CUP ; LK720L ; LK720 1 BNE 5$ ;YES. SETUP INTERNAL BUFFERS ; LK7205 ; LK720.! .ENDC ;DF T$$CUP ; LK720  ; LK720O- TSTB U.TVFC(R4) ;CHECK FOR VFC ; LK720D1 BNE 5$ ;YES. SETUP INTERNAL BUFFERS ; LK720B ; LK720C" MOV U.TCO(R4),R3 ; ; LK7207 MOV R1,-(SP) ;SAVE R1. $TSTBF WILL KILL IT ; LK72072 CALL $TSTBF ;CHECK IF TASK IS FIXED ; LK7207 BCC 3$ ;NOT FIXED - USE INTERMEDIATE BUFFER ;SA469 ; LK720 > .IF LT T$$BFL-12 ;CHECK IF BUFFER HAS ENOUGH SPACE ; LK720 .ERROR ; LK720  .ENDC ; LK720; ; LK7201;SETUP TRANSFER FROM A TASK BUFFER ; LK720 ; ; LK720 ; LK720P0 MOV U.TFOB(R4),R2 ;GET BUFFER ADDR ; LK720/ MOV I.PRM(R3),R1 ;GET TASK BUFFER ; LK720( CLR R0 ; ; LK720I* ASHC #6,R0 ;GET PHYS. ADDR ; LK7200 CLR (R2)+ ;CLEAR LINK WORD FOR WAL ; LK728- TST (R2)+ ;STEP TO NEXT OFFSET ; LK720 2 MOV U.TTOC(R4),(R2)+ ;SETUP COUNTER ; LK720+ MOV R0,(R2)+ ;GET HIGH 6 BITS ; LK720 7 MOV I.PRM+2(R3),(R2) ;GET VIRTUAL ADDRESS ; LK720P1 BIC #160000,(R2) ;CONVERT TO OFFSET ; LK720 ) ADD R1,(R2) ;GET LOW ADDR ; LK720U* ADC -(R2) ;ADJUST HIGH BITS ; LK720< CLR U.TTOC(R4) ;CLEAR TOTAL BYTE COUNTER IN UCBX ; LK720: MOV (SP)+,R1 ;RESTORE R1 (SAVED BEFORE $TSTBF) ; LK720E BIC #S2.FLF,2(R5) ;;CLEAR FORCE-LF FLAG (LF IS FORCED ONLY ; LK720N- ;ON ECHO, NOT ON TASK OUTPUT) ; LK720 E BIS #S5.DWA,U.TST5-U.TSTA(R5); SET DMA IO.WAL IN PROGRESS ; LK726  JMP 80$ ;GO ON ; LK720R ; LK7202)3$: MOV (SP)+,R1 ;RESTORE R1 ;SA469 5$: ;SA469R ;SA469 .ENDC ;T$$DMA ;SA469 ;SA469 ;SA469, MOV U.TFOB(R4),R0 ;GET FIRST BUFFER IN R0- MOV #SETOBF,-(SP) ;FIRST SET UP NEW BUFFERF .IFT ;T$$CUP2, BIT #S2.PCU,2(R5) ;CURSOR POS. REQUESTED? BEQ 10$ ;N - JUMPC/ MOV U.TOC(R4),R2 ;Y - GET CURSOR COORDINATESA! SUB #401,R2 ;ADJUST TO BASE 0I6 MOV #CPOS,EXPCP ;SET POINTER TO CURSOR POS. ROUTINE CALL @(SP)+ ;CALL COROUTINES- MOV #EXPC3,EXPCP ;RESTORE POINTER TO EXPC3;  BIC #S2.PCU,2(R5) ;CLEAR FLAG  BR 40$ ; .ENDC ;T$$CUP;0; CHECK IF ANY LEADING LF'S SHOULD BE INSERTED;F10$:% TSTB U.TVFC(R4) ;GET VFC CHARACTERF' BEQ 40$ ;NO LEADING LF OR FF - JUMP2 .IF DF T$$RPR&T$$EIOS; BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS THIS AN EXTENDED I/O?  BEQ 15$ ;BR IF NOT, MOV U.TCO(R4),R2 ;GET SAVED OUTPUT PACKET TST (R2) ;IS THIS IO.RPR BEQ 15$ ;IF EQ, NO8 TSTB U.TCHP-U.TSTA(R5) ;AT LEFT (OTHER RIGHT) MARGIN?$ BNE 40$ ;IF NE NO, JUMP AND PRAY15$: .ENDC ; DF T$$RPR&T$$EIO( MOVB U.TVFC(R4),R2 ;GET VFC CHARACTER BPL 30$ ;FF - JUMP20$:# MOVB #CH.LF,R2 ;ONE OR MORE LF'SF30$: CALL @(SP)+ ;INSERTF" INCB U.TVFC(R4) ;ANY MORE LF'S? BEQ 35$ ;N - JUMPU BMI 20$ ;Y - LOOPH) CLRB U.TVFC(R4) ;JUST DID A FF - CLEART;M&; INSERT CHARACTERS FROM TASK BUFFER;T35$: .IF DF T$$RPR&T$$EIO1; BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS THIS AN EXTENDED I/O?M BEQ 40$ ;BR IF NOT, MOV U.TCO00r~|{cccc(R4),R2 ;GET SAVED OUTPUT PACKET TST (R2) ;IS THIS IO.RPR BEQ 40$ ;IF EQ, NO0 BIS #S2.ELF,2(R5) ;SET THE EAT-A-LINEFEED BIT .ENDC ; DF T$$RPR&T$$EIO40$: ;REFERENCE LABEL .IF DF T$$ACD8 TST U.ACB-U.TSTA(R5) ;DOES THIS TERMINAL HAVE AN ACD? BEQ 48$ ;N - JUMPAA BIT #UA.TRN,U.AFLG-U.TSTA(R5) ;IN THE MIDDLE OF A TRANSLATION?4 BNE 44$ ;Y - CONTINUE FROM POINT OF INTERRUPTION? TST U.TTOC(R4) ;HAVE WE ALREADY BEEN THROUGH THIS CODE PATH?T* BEQ 60$ ;Y - JUST OUTPUT A TRAILING CR442$: CLR U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING MOV R0,-(SP) ;SAVE R0? MOV #A.TRAN,R0 ;SET OUTPUT CHARACTER TRANSLATION ENTRY POINT CALL $SWACD ;CALL ACD MOV (SP)+,R0 ;RESTORE R0TG BIT #UA.TRN,U.AFLG-U.TSTA(R5) ;DOES ACD WANT TO PERFORM TRANSLATION?M BEQ 48$ ;N - JUMPLA CLR U.TTOC(R4) ;ACD WILL DETERMINE NUMBER OF CHARACTERS OUTPUTN'44$: MOV U.ACB-U.TSTA(R5),R2 ;GET ACBUA ADD #A.SMAP,R2 ;POINT TO SYSTEM STATE BUFFER PARAMETERS OFFSET$146$: MOV (R2)+,KISAR6 ;MAP BUFFER PASSED BY ACD-, MOVB @(R2)+,R2 ;GET CHARACTER FROM BUFFER, MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING3 CALL @(SP)+ ;INSERT CHARACTER INTO TTDRV BUFFERC# MOV U.ACB-U.TSTA(R5),R2 ;GET ACBT9 ADD #A.SMAP+2,R2 ;POINT TO SYSTEM STATE BUFFER ADDRESSM INC (R2)+ ;UPDATE POINTER- DEC @R2 ;DECREMENT COUNT6 BEQ 42$ ;ZERO - CALL ACD TO GET NEXT BUFFER IF ANY7 CMP -(R2),-(R2) ;BACKUP TO BUFFER ADDRESS DOUBLEWORDT1 BR 46$ ;LOOP TO GET AND INSERT NEXT CHARACTERV .ENDC ;T$$ACD<48$: TST U.TTOC(R4) ;ANY MORE CHARACTERS FROM TASK BUFFER?+ ;(THERE WON'T BE IF WE COME HERE FROM' ;"FPORD" TO OUTPUT A TRAILING CR)D BEQ 60$ ;N - JUMPB,50$: MOV I.PRM(R3),KISAR6 ;MAP TASK BUFFER+ MOVB @I.PRM+2(R3),R2 ;GET NEXT CHARACTERC, MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING! CALL @(SP)+ ;INSERT CHARACTERT1 INC I.PRM+2(R3) ;UPDATE POINTER IN TASK BUFFERP- DEC U.TTOC(R4) ;DECREMENT TOTAL BYTE COUNTP BNE 50$ ;MORE TO DO - LOOP;.; CHECK IF TRAILING CARRIAGE RETURN REQUIRED;R*60$: BIT #S2.CR,2(R5) ;INSERT CR AT END? BEQ 70$ ;N - JUMPE MOVB #CH.CR,R2 ;Y - DO IT CALL @(SP)+ ;D* BIC #S2.CR,2(R5) ;CLEAR CR AND ELF FLAG70$: .IF DF T$$CUP /  BIT #S2.RCU,2(R5) ;CURSOR RESTORE REQUESTED?V  BEQ 80$ ;N - JUMP /  MOV U.TSHP(R4),R2 ;Y - GET SAVED CURSOR POS.T6  MOV #CPOS,EXPCP ;SET POINTER TO CURSOR POS. ROUTINE CALL @(SP)+ ;CALL COROUTINEB- MOV #EXPC3,EXPCP ;RESTORE POINTER TO EXPC3  BIC #S2.RCU,2(R5) ;CLEAR FLAG .ENDC ;T$$CUP80$:+ MOV -(R1),R2 ;GET POINTER TO NEXT BUFFERN% BEQ 90$ ;NO UNUSED BUFFERS - JUMP4 CLR (R1) ;END THE LIST WITH THE LAST USED BUFFER7 CLZ ;CLEAR CC-Z TO TELL DELTB TO DEALLOCATE A LISTU- CALL DELTB ;DEALLOCATE THE UNUSED BUFFERS 90$: .IF DF T$$RPR0 MOV U.TCO(R4),R3 ;RESTORE REAL PACKET POINTER  ;**-1 ! .IFTF ;T$$RPR"9# TST I.PRM+16(R3) ;DID WE MANAGE TO BUFFER ALL THE DATAT$ ;IN ONE BUFFER LIST?% BEQ WRITE2 ;N - JUMP5& CALL $TSTBF ;Y - TEST IF TASK CAN BE CHECKPOINTEDR' BCS CLR16 ;N - JUMP9() .IFT ;T$$RPRS* + TST (R3) ;IS THIS AN IO.RPR?, BEQ 100$ ;N - JUMP-. .IF DF T$$EIO/0 ASSUME S6.RDI,100000A152 TST U.TST6-U.TSTA(R5) ;READING WITH DEFAULT INPUT?0-3 BPL 95$ ;IF EQ NO, MUST ALLOCATE A BUFFERRF4 MOV U.TDIF(R4),U.TFIB(R4) ;USE DEFAULT INPUT BUFFERS FOR INPUT DATA15 BNE 100$ ;IF NE THERE ARE SOME BUFFERS TO USET/6 BR CLR16 ;ELSE NOT ENOUGH AVAILABLE BUFFERSE78 .ENDC ;T$$EIO9.:95$: CALL ALTB ;ALLOCATE FIRST INPUT BUFFER;< BCS CLR16 ;FAILED - JUMP.= MOV R2,U.TFIB(R4) ;OK - SAVE BUFFER POINTER>? .IFTF ;T$$RPR@A100$:D2B CALL $INIBF ;INITIALIZE INTERMEDIATE BUFFERINGC BR WRITE2 ;START OUTPUTHDCLR16:&E CLR I.PRM+16(R3) ;USE $IOFIN AT ENDF4G .SBTTL . WRITE2 - START OUTPUT OF THE BUFFER LISTH; ,I; WRITE2 - START OUTPUT OF THE BUFFER LISTJ;R KWRITE2:ELM .IFT ;T00z~;}|tt tfDATA$$RPR1NO TST (R3) ;IO.RPR?LP BEQ 10$ ;N - JUMPC?Q BIS #S5.RPO,U.TST5-U.TSTA(R5) ;SET PROMPT OUTPUT IN PROGRESSR CLR (R3) ;INITIALIZE STATUSM#S10$: CMP (SP)+,(SP)+ ;CLEAN STACKITU .IFF ;T$$RPR$VW TST (SP)+ ;CLEAN STACKXY .ENDC ;T$$RPRZ0[ MOV #STAXL,-(SP) ;START OUTPUT OF BUFFER LIST\] JMP LOCKI ;3^_`.PAGEEBa .SBTTL . PRLF - OUTPUT LEADING LF FOR SOLICITED INPUT IF NEEDEDb;R?c; PRLF - OUTPUT LEADING LF FOR SOLICITED INPUT AT LEFT MARGIN.d;TePRLF:fg .IF DF T$$SPLh.i MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBXjk .IFF ;T$$SPLOl$m MOV U.TUX-U.TSTA(R5),R4 ;GET UCBXno .ENDC ;T$$SPLp7q CALL EXCR1 ;EXPAND A CARRIAGE RETURN (YIELDING LF!)(rs MOV #ECHSTR,-(SP) ;OUTPUT LFR t JMP LOCKIu.PAGE(?v .SBTTL . INSERT - INSERT (EXPANSION OF) CHARACTER IN BUFFER.w;Ex;+Ry; INSERT - INSERT (THE EXPANSION OF) ONE CHARACTER IN THE CURRENT OUTPUT BUFFER.z;E {; INPUTS:'|; R0 CURRENT POINTER IN OUTPUT BUFFERR6}; R1 POINTER TO SECOND WORD IN CURRENT OUTPUT BUFFER~; R2 CHARACTER TO INSERT; R4 POINTER TO UCBX; R5 POINTER TO U.TSTA;C ; OUTPUT:NF; 1. IF (THE EXPANSION OF) THE CHARACTER FITS IN THE CURRENT BUFFER,B; OR IF IT DOES NOT BUT ANOTHER BUFFER IS SUCCESSFULLY ALLOCATED;; AND LINKED TO THE OLD BUFFER, THE CHARACTER IS INSERTED6; AND THE CALLER IS CALLED BACK AS A COROUTINE WITH:; R0 UPDATED/; R1 POINTER TO SECOND WORD IN CURRENT BUFFER0; (MAY BE A NEW BUFFER); R2 DESTROYED; R3-R5 UNCHANGEDN7; THE CALLER MAY NOW LOAD ANOTHER CHARACTER IN R2 AND44; HAVE IT INSERTED BY A "CALL @(SP)+" INSTRUCTION.;T@; 2. ELSE, IF THIS IS THE PROMPT FOR AN IO.RPR, THE HORIZONTAL5; AND VERTICAL POSITION AND THE WRAP-AROUND CONTEXTU4; IS RESTORED, AND THE ERROR IE.NOD IS RETURNED TO$; THE TASK. (NO RETURN TO CALLER).;A@; 3. ELSE, OUTPUT IS STARTED WITH THE CURRENT LIST OF BUFFERS.; (NO RETURN TO CALLER).;-;0  .ENABL LSBA INSERT:) MOV R3,-(SP) ;SAVE R310$: CLR -(SP) ;CLEAR FLAGN MOV R2,-(SP) ;SAVE CHARACTERN ASSUME U.TCHP&1,0 ASSUME U.TCVP,U.TCHP+1U5 MOV U.TCHP-U.TSTA(R5),-(SP) ;SAVE CURRENT POSITION , MOV 2(R5),-(SP) ;SAVE WRAP-AROUND CONTEXT( ;(IF EXPANDED STRING DOES NOT FIT)< BIC #S2.FLF,2(R5) ;CLEAR FORCE-LF FLAG (LF IS FORCED ONLY# ;ON ECHO, NOT ON TASK OUTPUT)S .IF DF T$$CUP4 CALL @EXPCP ;EXPAND CHAR. OR CURSOR POS. COMMAND .IFF ;T$$CUPN  CALL EXPC3 ;EXPAND CHARACTER .ENDC ;T$$CUP7 BVC 15$ ;IF V IS SET, THIS CHAR. IS TO BE DISCARDEDA  ASL 6(SP) ;CLEAR SAVED CARRY BR 40$ ;GO TO RESTORE STACKR15$:. BEQ 30$ ;SINGLE CHARACTER EXPANSION - JUMP ROL 6(SP) ;SAVE CC-C) ADD R2,(R1) ;UPDATE BUFFER BYTE COUNTB' CMP (R1),#T$$BFL-4 ;DOES STRING FIT?  BHI 50$ ;N - JUMPO20$:, MOVB (R3)+,(R0)+ ;COPY STRING INTO BUFFER SOB R2,20$ ;LOOP  BR 40$R30$:9 CMP (R1),#T$$BFL-4 ;ROOM FOR ONE MORE CHAR. IN BUFFER?A BHIS 60$ ;N - JUMP& MOVB R2,(R0)+ ;Y - INSERT CHARACTER INC (R1) ;UPDATE BYTE COUNT40$:> CMP (SP)+,(SP)+ ;POP SAVED POSITION AND WRAP-AROUND CONTEXT" MOV (SP)+,R2 ;RESTORE CHARACTER= ROR (SP)+ ;NEED TO CALL EXPCHR AGAIN WITH THIS CHARACTER?T BCS 10$ ;Y - LOOP MOV (SP)+,R3 ;N - RESTORE R3F! CALL @(SP)+ ;CALL CALLER BACK: BR INSERT ;DO IT AGAIN;G/; CHARACTER EXPANSION DOES NOT FIT IN BUFFER.H; RESTORE CURRENT HORIZONTAL AND VERTICAL POSITION AND STATE VARIABLE.;;50$:* SUB R2,(R1) ;RESTORE BUFFER BYTE COUNT;(K; RESTORE PREVIOUS WRAP AND POSITION CONTEXT. *** NOTE *** MOST BITS OFWK; U.TSTA+2 ARE MODIFIED ONLY AT SYSTEM STATE OR DURING CHARACTER ECHOING.OJ; ECHOING CAN NOT INTERRUPT US HERE BECAUSE INPUT PROCESSING IS DISABLEDJ; BY S1.DSI. HOWEVER, A FEW BITS ARE MODIFIED DURING INPUT PRIOR TO THEJ; S1.DSI CHECK (^O, ^S, TABUF FULL). THE STATE OF THES BITS MUST NOT BE*; DISTURBED WHEN RESTORING WRAP CONTEXT.00~|{cccc;S60$:E BIC #S2.BEL!S2.CTO!S2.CTS,(SP) ;CLEAR BITS WE DON'T WANT TO AFFECTF BIC #^C,2(R5) ;WIPE OUT BITS WE WANT TO RESET) BIS (SP)+,2(R5) ;RESTORE STATUS WORD 2T ASSUME U.TCHP&1,0 ASSUME U.TCVP,U.TCHP+1A8 MOV (SP)+,U.TCHP-U.TSTA(R5) ;RESTORE CURRENT POSITION;Y"; ALLOCATE ANOTHER OUTPUT BUFFER;D+ MOV -(R1),R2 ;GET POINTER TO NEXT BUFFER(6 BNE 70$ ;THERE IS A FREE BUFFER IN THE LIST - JUMP& CALL ALTB ;ALLOCATE ANOTHER BUFFER70$:1 MOV R2,R0 ;GET BUFFER ADDRESS (IF WE GOT ONE)R" MOV (SP)+,R2 ;RESTORE CHARACTER1 MOV R2,(SP)+ ;POP FLAG WORD (DON'T TOUCH CC-C)E MOV (SP)+,R3 ;RESTORE R32 .IF DF T$$RPR BCS 80$ ;FAILED - JUMP .IFF ;T$$RPRT* BCS CLR16 ;FAILED - CLEAR I.PRM+16 AND ;START OUTPUT .ENDC ;T$$RPR' MOV R0,(R1) ;LINK NEW BUFFER TO OLDT4 .SBTTL . SETOBF - INITIALIZE OUTPUT BUFFER HEADER SETOBF:L# TST (R0)+ ;POINT TO SECOND WORDN! MOV R0,R1 ;SAVE POINTER IN R1 . CLR (R0)+ ;INITIALIZE BYTE COUNT AND POINT ;TO START OF DATA AREA% BR INSERT ;START USING NEW BUFFER ;E; FAILED TO ALLOCATE BUFFER; .IF DF T$$RPR80$:, MOV U.TCO(R4),R3 ;GET REAL PACKET POINTER TST (R3) ;IO.RPR?L'  BEQ CLR16 ;N - START PARTIAL OUTPUT  ;AFTER CLEARING I.PRM+16!  TST (SP)+ ;POP RETURN ADDRESS  ASSUME U.TCHP&1,0  ASSUME U.TCVP,U.TCHP+1E8 MOV (SP)+,U.TCHP-U.TSTA(R5) ;RESTORE CURRENT POSITION/ BIC #S2.WRA,2(R5) ;CLEAR WRAP-AROUND CONTEXTI= MOV #IE.NOD&377,(R3) ;GET STATUS FOR "NO BUFFER AVAILABLE" CLR I.PRM+16(R3) ;USE $IOFINE- ;FALL THRU TO "FPORD" TO FINISH REQUEST .ENDC ;T$$RPR  .DSABL LSBO.PAGEG# .SBTTL OUTPUT REQUEST COMPLETION;' .SBTTL . FPORD - OUTPUT REQUEST DONEL;U;+ ; FPORD - OUTPUT REQUEST DONE.;P7; COME HERE WHEN ALL OUTPUT BUFFERS HAVE BEEN OUTPUT. 4; TRANSFER MAY OR MAY NOT BE COMPLETED - IF IT IS,7 ; STATUS IS STORED IN THE LINK WORD OF THE IO PACKET.O!;O:"; THIS ROUTINE IS ENTERED FROM THE FORK DISPATCHER WITH:#; R4 UCBX ADDRESSP$; R5 POINTER TO U.TSTA%;-&;H 'FPORD::D#( MOV U.TCO(R4),R3 ;GET I/O PACKET$) TST (R3) ;STATUS PRESENT?G* BNE ORQDON ;Y - JUMP+ TST U.TTOC(R4) ;ALL DONE?!, BNE 10$ ;N - MORE TO DO, JUMP3- ;NOTE - THIS CANNOT HAPPEN WHEN DOING IO.RPR!H*. BIT #S2.CR,2(R5) ;TRAILING CR REQUIRED?/ BEQ 20$ ;IF EQ, NO...SKIP 010$:'0 MOV R4,R1 ;POINT TO UCBX ;SA466 80 ADD #U.TFOB,R1 ;POINT TO FIRST OUTPUT BUFFER ;SA4660 ;SA4661 JMP WRITE1 ;BRANCH AID220$:!3 INC (R3) ;SET STATUS = IS.SUC405 .SBTTL . ORQDON - OUTPUT REQUEST HAS FINISHED6;7; OUTPUT DONE.8;E 9ORQDON:B1: CLR U.TCO(R4) ;CLEAR POINTER TO PACKET TO SHOW%; ;NOT DOING TASK OUTPUT ANY MORE $< BIC #S1.OBY,(R5) ;SET OUTPUT FREE=>; .IF DF T$$EIO?;5B@; BIC #S5.FMT,U.TST5-U.TSTA(R5);INITIALIZE OUTPUT FORMATTING BITA;RB; .ENDC ;T$$EIOXCD .IF DF T$$RPREAF BIT #S5.RPO,U.TST5-U.TSTA(R5) ;WAS THIS PROMPT OF RPR REQUEST?G BEQ 20$ ;N - JUMPDAH BIC #S5.RPO,U.TST5-U.TSTA(R5) ;CLEAR PROMPT OUTPUT IN PROGRESSN%I TSTB (R3) ;HAVE AN ERROR ALREADY?J BMI 10$ ;Y - JUMPK4L FRKBIT BIS,#FR.GRQ ;TRY ANOTHER PACKET WHEN INPUT1M ;HAS BEEN STARTED (LINE MAY BE FULL DUPLEX)#N JMP PPRLB1 ;NOW DO THE READ,O ;(LEAVE LINK WORD NON-ZERO TO INDICATEP ;DOING IO.RPR)Q10$:#R BIC #S1.IBY,(R5) ;SET INPUT FREE$1R CLR U.TFPB(R4) ;CLEAR BUFFER POINTER ;SA471TY ;**-6HZ .IF DF T$$EIO[<\ MOV U.TDIF(R4),R2 ;GET FIRST DEFAULT INPUT BUFFER, IF ANY0] CALL DELTB ;DEALLOCATE DEFAULT INPUT BUFFERS ^ CLR U.TDIF(R4) ;CLEAR POINTER5^ MOV U.TRTT(R4),R2 ;ANY TERMINATOR TABLE? ;SA471P%^ BEQ 16$ ;BRANCH IF NOT ;SA471E'^ CALL DETB ;DEALLOCATE IT ;SA471B5^ CLR U.TRTT(R4) ;AND CLEAR OUT THE POINTER ;SA471T^16$: ;SA471_` .ENDC ;T$$EIOab .ENDC ;T$$RPRcd20$:ef .IF DF T$$ACD00~~|tt tfDATAg8h TST U.ACB-U.TSTA(R5) ;DOES THIS TERMINAL HAVE AN ACD?i BEQ 30$ ;N - JUMP(4j MOV #A.OUTP,R0 ;SET OUTPUT COMPLETION ENTRY POINTk CALL $SWACD ;CALL ACDTlm .ENDC ;T$$ACDno30$:-p MOV U.TFOB(R4),R2 ;GET FIRST OUTPUT BUFFERN&q CALL DELTB ;DEALLOCATE ALL BUFFERS4r MOV I.PRM+4(R3),R1 ;GET NUMBER OF BYTES REQUESTED%s SUB U.TTOC(R4),R1 ;SUBTRACT U.TTOCRt;TBu; IF A REQUEST IS ABORTED (BY TIME-OUT OR IO.KIL), WE RETURN THE@v; NUMBER OF BYTES TRANSFERRED, INCLUDING THE CURRENT (PARTIAL)?w; BUFFER. THERE IS NO WAY WE CAN FIND OUT HOW MANY BYTES FROMN@x; THE TASK'S BUFFER CORRESPOND TO THE NUMBER OF EXPANDED BYTES)y; THAT WE SENT FROM THE CURRENT BUFFER.Az;{ ASSUME TF.WIR,2004| TSTB I.FCN(R3) ;DOES USER WANT INPUT REDISPLAYED?}~ .IF DF T$$BTW BMI 40$ ;IF MI, YES...DO ITB, CMPB I.PRI(R3),#251. ;WAS THIS AN IO.WBT? BNE 70$ ;N - JUMPA ASSUME S3.FDX,200! TSTB 4(R5) ;FULL DUPLEX LINE?E BMI 70$ ;Y - JUMPR40$: .IFF ;T$$BTWE6 BPL 70$ ;IF PL, NO...JUST FINISH THE INPUT REQUEST .ENDC ;T$$BTW ASSUME S1.IBY,200 TSTB (R5) ;INPUT BUSY? BPL 70$ ;N - JUMPE;O?; WE JUST FINISHED AN IO.WBT THAT BROKE THROUGH AN INPUT ON A(@; NON-FULL-DUPLEX LINE. FAKE A CTRL-R TO REDISPLAY THE CURRENT; INPUT LINE.I;.E; THERE CANNOT BE A FORK REQUEST PENDING FOR INPUT DONE (OR PARTIAL-E; INPUT DONE) SINCE INPUT FORK REQUESTS ARE PROCESSED BEFORE OUTPUTI; FORK REQUESTS.; .IF DF T$$SPLB MOVB #CH.CTR,U.TECO-U.TSTA(R5) ;PUT CTRL-R CHAR. IN ECHO BUFFER .IFF ;T$$SPLM; MOVB #CH.CTR,U.TECB(R4) ;PUT CTRL-R CHAR. IN ECHO BUFFER .ENDC ;T$$SPL3 FRKBIT BIS,#FR.PFP ;REQUEST POST-FORK PROCESSINGL .IF DF T$$ESC;SE; IF WE ARE IN THE MIDDLE OF AN ESCAPE SEQUENCE, WE MUST RUB IT OUTQ?; SINCE THE ESCAPE SEQUENCE AND CTRL-R ROUTINES SHARE U.TISV.N7; FURTHERMORE, CTRL-R DOES NOT WORK IF S1.ESC IS SET.R;T( BIT #S1.ESC,(R5) ;IN ESCAPE SEQUENCE? BEQ 70$ ;N - JUMP( MOV R3,-(SP) ;SAVE R3/ CALL RUBESC ;Y - RUBOUT THE ESCAPE SEQUENCE, MOV (SP)+,R3 ;RESTORE R3C .ENDC ;T$$ESC70$:A CLR I.PRM+12(R3) ;TELL $FINBF NO BUFFERS TO COPY OR DEALLOCATE;.; FALL THRU TO "DONE";W.PAGET, .SBTTL DONE - GENERAL I/O DONE PROCESSING;Q;+(; DONE - DO I/O COMPLETION PROCESSING.;H ; INPUT:; R1 IOSB WORD 2; R3 POINTER TO PACKET; I.LNK = IOSB WORD 1; R5 POINTER TO U.TSTA%; I.PRM+16 0 IF $IOFIN TO BE USED,V ; NON-0 IF $QUEBF TO BE USED; ; OUTPUT:H; I/O REQUEST FINISHED.M;P%; REGISTERS ALTERED: R0,R1,R2,R3,R4C;-;:DONE::9 FRKBIT BIS,#FR.GRQ ;TIME TO TRY TO GET ANOTHER PACKET.  MOV (R3),R0 ;GET IOSB WORD 1  TST I.PRM+16(R3) ;USE $QUEBF? BEQ 10$ ;N - JUMP CALLR $QUEBF ;FINISH IOO10$: CALLR $IOFIN ;FINISH IO: .END WORD 2; R3 POINTER TO PACKET; I.LNK = IOSB WORD 1; R5 POINTER TO U. .TITLE TTSUB .IDENT /06.01/;N8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;Y ;  ; 02-FEB-78 PETER WANNHEDEN ;: ; PREVIOUSLY MODIFIED BY:O;O; P. WANNHEDEN; D. R. DONCHIN ; T. LEKAS; R. PHILPOTT ; S. ADAMS;;; MODIFICATIONS:;R; L. Kogan 02-NOV-85 06.01@; LK700 -- FIX SF.SMC/SF.GMC FOR NON-SETTABLE CHARACTERISTICS8; FOR NON-OVERLAID TERMINAL DRIVER (EX. SET /PARITY; FOR DL-11).;;>?@ .MCALL PKTDF$,EVNDF$U A PKTDF$N B EVNDF$BCD .PSECT MAP6E;YF;+;G; TTSUBR - MISCELLANEOUS SUBROUTINES FOR TERMINAL DRIVER.FH;-I; J;E0K.SBTTL ALUCBX - ALLOCATE A UCB EXTENSION BLOCKL;WM;+-N; ALUCBX - ALLOCATE A UCB EXTENSION (UCBX).IO; P; INPUT:Q; R5 POINTER TO U.TSTAR; S; OUTPUT:g*T; IF SUCCESS, OR IF UCBX ALREA00~|{ccccDY EXISTS: U; CC-C 0V; R4 POINTER TO UCBXW; U.TUX POINTS TO UCBX1X; UCBX INITIALIZED (ONLY IF UCBX WAS ALLOCATED)-Y;Z; IF FAILURE:. [; CC-C 1\;F]; REGISTERS ALTERED: R0,R2,R4^;-_;6`a .IF NDF T$$SPLRbc;L d .ENABL LSBNe;Rf ASSUME U.TUX,U.TSTA-20gALUCBX::MOV -(R5),R4 ;IS THERE ALREADY A UCBX?h CLC ;ASSUME YES#i BNE 10$ ;Y - EXIT WITH CC-C = 0O$j CALL ALTB ;N - ALLOCATE A BUFFER(k BCS 10$ ;FAILED - EXIT WITH CC-C = 1l MOV R2,@R5 ;SAVE POINTERm;Tn; INITIALIZE A FEW CELLSo; p ASSUME U.TCI,0N$q ;U.TCI ALREADY CLEARED BY ALTB+r CLR U.TCO(R2) ;NO CURRENT OUTPUT REQUESTE-s CLRB U.TISV(R2) ;INITIALIZE STATE VARIABLE,t ASSUME U.TITI&1,0u ASSUME U.TOTI,U.TITI+10v CLR U.TITI(R2) ;CLEAR INPUT AND OUTPUT TIMERS@w CLR U.TFPB(R2) ;CLEAR PROMPT BUF ADDRS/UNSOLICITED INPUT FLAG,x CLR U.TRTT(R2) ;ASSUME NOT A RTT FUNCTIONyz .IF DF T$$EIO{;| CLR U.TDIF(R2) ;CLEAR FIRST DEFAULT INPUT BUFFER POINTERR}~ .ENDC ;T$$EIO, .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB9 ADD #U.TAST,R2 ;POINT TO UNSOLICITED INPUT ACB ADDRESSO/X = U.TAST ;SYMBOL NEEDED FOR ASSUME MACROST .IF DF T$$CCA6 CLR (R2)+ ;CLEAR ACB POINTER FOR UNSOLICITED INPUT X = X + 2E .ENDC ;T$$CCA .IF DF T$$SCA ASSUME U.TSCA,X X = X + 2 1 CLR (R2)+ ;CLEAR SWITCH CHARACTER ACB POINTERC .ENDC ;T$$SCA .IF DF T$$MHU ASSUME U.TMHA,X X = X + 2E- CLR (R2)+ ;CLEAR MODEM HANGUP ACB POINTER  .ENDC ;T$$MHU .IF DF T$$ICS ASSUME U.TICA,X X = X + 2N( CLR (R2)+ ;CLEAR ICS ACB/TEP POINTER .ENDC ;T$$ICS .IF DF T$$OOB ASSUME U.TOBA,X X = X + 2T' CLR (R2) ;CLEAR OOB ACB/TEP POINTER .ENDC ;T$$OOB, .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB ;EXIT WITH CC-C = 0I210$: MOV (R5)+,R4 ;RESTORE R5 AND GET UCBX IN R4# ;(OR 0 IF COMING FROM DEUCBX)M20$: RETURN ;RETURN;(; 2.SBTTL DEUCBX - DEALLOCATE A UCB EXTENSION BLOCK;;+); DEUCBX - DEALLOCATE UCBX IF POSSIBLE. ;N ; INPUT:; R5 POINTER TO U.TSTA; ; OUTPUT:;9; IF LINE IS IDLE (BOTH INPUT AND OUTPUT), NOT ATTACHED +; AND THERE ARE NO FORK REQUESTS PENDING,E.; THE UCBX (IF THERE IS ONE) IS DEALLOCATED.;!; REGISTERS ALTERED: R0,R2,R4E;-;-;I*DEUCBX::MOV @R5,-(SP) ;GET STATUS WORD 16 BIC #^C,@SP ;CLEAR ALL BUT INPUT AND ;OUTPUT BUSY FLAGS9 BIS U.TFRQ-U.TSTA(R5),@SP ;OR WITH FORK REQUEST FLAGS5 BIS U.ATT-U.TSTA(R5),(SP)+ ;OR WITH ATTACH POINTERN# BNE 20$ ;IF NE DON'T DEALLOCATEA .IF DF T$$IDO0 TST $MCRPT ;IS THE MCR DISPATCHER INSTALLED?1 BEQ 20$ ;IF EQ NO - DON'T DEALLOCATE THE UCBX .ENDC ;T$$IDO MOV -(R5),R2 ;GET UCBX BEQ 10$ ;NONE - EXIT! CLR (R5)+ ;OK - CLEAR POINTER: ;FALL THRU TO "DETB"; .DSABL LSBB .IFTF ;NDF T$$SPL;A%.SBTTL DEALLOCATE A TERMINAL BUFFERT;.;+&; DETB - DEALLOCATE TERMINAL BUFFER.;U ; INPUT:; R2 BUFFER ADDRESSC;N ; OUTPUT:28; BUFFER DEALLOCATED TO TT-DRIVER POOL OR SYSTEM POOL.;$; REGISTERS ALTERED: R0,R2;-;;Q+DETB:: CMP R2,#120000 ;IN TT-DRIVER POOL? BLO 10$ ;N - JUMP6 MOV FREEB,@R2 ;Y - ADD TO FRONT OF FREE BUFFER LIST MOV R2,FREEB RETURNN10$: MOV R1,-(SP) ;SAVE R1,R3 MOV R3,-(SP)S! MOV R2,R0 ;GET BUFFER ADDRESS MOV #T$$BFL,R1 ;GET LENGTHN* CALL $DEACB ;DEALLOCATE TO SYSTEM POOL MOV (SP)+,R3 ;RESTORE REG'S MOV (SP)+,R1E RETURN .PSECT MAP5, .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB.PAGE; .SBTTL . DQACB - AST CONTROL BLOCK WAS DEQUEUED BY SYSXTC;,;+3; **-DQACB - AST CONTROL BLOCK DEQUEUE PROCESSINGV;BF; THIS SUBROUTINE IS CALLED WHEN SYSXT DEQUEUES AN AST CONTROL BLOCKM; THAT HAS A.CBL=0 AND THE DOUBLEWORD ADDRESS OF THIS ROUTINE IN A.KSR5 AND L; A.DQSR. IF THIS ACB GOT MARKED FOR DELETE00~~|tt tfDATA WHILE IT WAS IN THE AST QUEUEJ; (AF.MDE SET), DEALLOCATE THE BLOCK NOW. OTHERWISE CLEAR THE FLAG THAT5 ; INDICATES THE BLOCK IS IN THE AST QUEUE (AF.QUE).! ;BO ; IF THE ACB IS FOR UNSOLICITED INPUT AST'S AND THE ACB IS NOT LOCKED (AF.LCKL ; SET DUE TO TF.NOT CONSIDERATIONS), ATTEMPT TO GET ANOTHER CHARACTER FROM; ; THE TYPEAHEAD BUFFER, WHICH WILL REQUEUE THE AST BLOCK. ;H ; INPUTS: ; R0 => LINK WORD IN AST BLOCK; ; OUTPUTS: NONE.; "; REGISTERS MODIFIED: R1,R3,R5;-; DQACB::Q# CALL MAPD ;MAP DRIVER DATA AREAE) MOVB A.PRM+5(R0),R1 ;GET THE ACB FLAGS ASSUME AF.MDE,200( BPL 3$ ;IF PL, NOT MARKED FOR DELETE MOV R0,-(SP) ;SAVE R0  JMP DEACB1 ;GO TO DEALLOCATE 3$:C!<" BICB #AF.QUE,A.PRM+5(R0) ;CLEAR FLAG SAYING WE ARE QUEUED#$ .IF DF T$$OOB%&& BIT #AF.OOB,R1 ;IS THIS AN OOB AST?' BEQ 5$ ;BR IF NO;( TSTB A.PRM+24(R0) ;ANYTHING IN THE OOB TYPE AHEAD BUFFERS) BEQ 10$ ;IF NOT, WE'RE DONED0* MOV #FR.OOB,R3 ;STILL MORE CHARACTERS WAITING+;, MTPS #TTPRI ;DISABLE INTERUPTS WHILE CHANGING FORK LIST '- CALL FORK ;;;SO SET UP FORK REQUESTB . MTPS #0 ;RE-ENABLE INTERPUTS/ BR 7$05$:P12 .ENDC ;T$$OOB3-4 BIT #TF.AST,R1 ;IS THIS ACB FOR AN IO.ATA?,+5 BEQ 10$ ;IF EQ, NO...NOTHING ELSE TO DO%6 BIT #AF.LCK,R1 ;IS THE ACB LOCKED?B77 BNE 10$ ;IF NE, YES...DON'T CHECK MORE UNSOL. INPUT.,8 MOV A.PRM+2(R0),R5 ;GET POINTER TO U.TSTA97$::; .IF DF M$$PRO<3= CLR R3 ;IF A SWITCH TO ANOTHER CPU TAKES PLACE,G,> ;NO SPECIAL FORK PROCESSING ROUTINE IS,? ;REQUIRED - JUST GET ANOTHER CHARACTER!@ ;FROM THE TYPE-AHEAD BUFFERN%A CALL SWCPU ;SWITCH TO CORRECT CPUB;C;C; IF WE FALL THRU HERE, WE ARE ALREADY ON THE CORRECT CPUD;QEF .ENDC ;M$$PROG)H CALL SETDSI ;DISABLE INPUT PROCESSING I10$:3J RETURN ;SIMULATE RETURN FROM A FORK PROCESSINGN0K ;ROUTINE IN ORDER TO GET ANOTHER CHARACTER!L ;FROM THE TYPE-AHEAD BUFFERM,N .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOBOP; Q;PR;+BS; DELTB0 - DRIVER ENTRY POINT TO DEALLOCATE INTERMEDIATE BUFFERS*T; FOR INPUT REQUEST. CALLED FROM $FINBF.U; V; INPUT:$W; R0 POINTER TO FIRST INPUT BUFFERX;-Y;EZ;A#[DELTB0::CALL MAPD ;MAP DATA AREA\] .IF DF T$$ACD^&_ BIT #1,R0 ;DO BUFFER TRANSFER NOW?` BEQ 10$ ;N - JUMP (a MOV R0,-(SP) ;Y - SAVE BUFFER ADDRESS4b CALL UBTRA ;CALL ROUTINE TO PERFORM THE TRANSFER'c MOV (SP)+,R0 ;RESTORE BUFFER POINTERNd DEC R0 ;MAKE EVENUef .ENDC ;T$$ACDg#h10$: MOV R0,R2 ;GET FIRST BUFFER 'i CALLR DELTB1 ;"FALL THRU" TO DELTB1j;Ok;U=l.SBTTL DELTB - DEALLOCATE A LINKED LIST OF TERMINAL BUFFERSRm;In;+2o; DELTB - DEALLOCATE A LIST OF TERMINAL BUFFERS.p;A q; INPUT:,r; R2 ADDRESS OF FIRST BUFFER IN LIST, OR 0#s; CC-Z 0 IF R2 POINTS TO A BUFFERMt; u; OUTPUT: Bv; BUFFER POINTED TO BY R2 AND ALL FOLLOWING BUFFERS DEALLOCATED.w;Nx; REGISTERS ALTERED: R0,R2y;-z;N{;|} .PSECT MAP6~ DELTB1::# MOV @R2,-(SP) ;SAVE LINK TO NEXTF% CALL DETB ;DEALLOCATE THIS BUFFERH  MOV (SP)+,R2 ;GET NEXT BUFFER*DELTB:: BNE DELTB1 ;THERE IS ONE - LOOP  RETURNR.PAGE7 .SBTTL . IRESET - RESET INPUT STATE PROCESSING FLAGS7; AND IRESEL (SAME AS IRESET BUT FIRST CALLS LOCKI);C;+'; **-IRESET - RESET INPUT STATE FLAGST;K; THIS ROUTINE RESETS THE FLAGS IN U.TSTA THAT AFFECT THE INPUT PRE-INPUTEL; AND INPUT PROCESSES OF THE TERMINAL DRIVER. ALL FLAGS ARE FIRST CLEAREDK; AND NEW SETTINGS ARE DERIVED FOR CERTAIN ONES FROM THE CURRENT STATE OFK; THE TERMINAL CHARACTERISTICS (U.TSTA+4). NOTE THAT THIS ROUTINE MAY BEM; CALLED FROM EITHER INTERRUPT STATE WHEN A TERMINATOR IS SEEN OR FROM FORKG+; LEVEL WHEN COMPLETING AN INPUT REQUEST.T;S ; INPUTS:%; R5 => U.TSTA OF THE TERMINAL UCBT;G ; OUTPUTS:H=; U.TSTA FLAGS SET ACCORDING TO CHARACTERISTICS IN U.TSTA+4-;E; REGISTERS MODIFIED: NONE.T;-00~|{cccc;V IRESEL::" CALL LOCKI ;LOCK OUT INTERUPTS IRESET::D BIC #S1.TNE!S1.RST!S1.PTH!S1.RNE!S1.TSY!S1.RES!S1.RNF!S1.RSP,(R5) ;;CLEAR UNWANTED FLAGS0 MOV 4(R5),-(SP) ;;GET CURRENT CHARACTERISTICS> BIC #^C,(SP) ;;CLEAR EXTRANEOUS FLAGS ASSUME S3.RAL,S1.PTHI ASSUME S3.NEC,S1.RNE  ASSUME S3.TSY,S1.TSYT8 BIT #S3.RAL,(SP) ;;IS TERMINAL IN READ-PASS-ALL MODE? BEQ 10$ ;;IF EQ, NO...SKIPD BIC #S1.TSY,(SP) ;;READ-PASS-ALL FORCES NO TTSYNC (S1.PTH IS SET)10$:4 BIT #S3.PTH,4(R5) ;;IS TERMINAL IN PASSTHRU MODE? BEQ 20$ ;;IF EQ, NO...SKIP4 BIS #S1.PTH,(SP) ;;SET PASSTHRU MODE IN THE FLAGS20$:0 BIS (SP)+,(R5) ;;UPDATE THE INPUT STATE FLAGS RETURN ;;ALL DONE .PAGE8 .SBTTL . LOCKI/LOCKR - LOCK OUT INTERRUPTS AND RETURN; ;+ ; LOCKI - LOCK OUT INTERRUPTS..; THIS IS A COROUTINE THAT WORKS AS FOLLOWS:,; 1. RAISE PRIORITY TO LOCK OUT INTERRUPTS1; 2. CALL CALLER (OR CALL ROUTINE WHOSE ADDRESS(; IS ON TOP OF STACK); 3. DROP PRIORITY ; 4. RETURNS;-;+LOCKI:: MTPS #TTPRI ;LOCK OUT INTERRUPTSH! CALL @(SP)+ ;;;CALL COROUTINEA&LOCKR:: MTPS #0 ;;;ALLOW INTERRUPTS RETURN ;RETURN;; ERRORS IN GET/SET SPEED, PARITY OPTIONS OR FLOW CONTROLO;T,YJLPAR:: ;DJ11, DL11 DON'T HAVE SETTABLEYLLPAR:: ;LINE PARAMETERS 2YCLPAR:: ;NEITHER DOES THE PRO VIDEO INTERFACE3 TST R1 ;WAS THIS A NOTIFICATION OF FLOW CONTROL  ;CHANGE?+ BEQ 10$ ;IF EQ NO - GO REPORT THE ERRORO5 RETURN ;Else just return. The port doesn't need# ;to be notified.10$: .IF DF D$$H11!D$$Z11!D$$V11 .IF DF T$$OVL* TST (SP)+ ;POP RETURN ADDRESS IN MPROT$ MOV (SP)+,KINAR5 ;RESTORE MAPPING@ CMP (SP)+,(SP)+ ;POP RETURN ADDRESSES OF THIS AND THAT ;**-3 ; LK700: .IFF ;T$$OVL ; LK700 ; LK700P, TST (SP)+ ;POP RETURN ADDRESS ; LK700 ; LK700  .ENDC ;T$$OVL ; LK7001 ; LK700P MOV (SP)+,R3 ;RESTORE R3E! TST (SP)+ ;POP RETURN ADDRESSn' MOV (SP)+,R1 ;RESTORE BUFFER POINTER. DEC R1 ;AND BACK IT UP1 CMP (SP)+,(SP)+ ;RETURNS FROM SPDPRM AND MCXSP  .ENDC ;D$$H11!D$$Z11!D$$V112 CALLR ERCNSC ;CONTROLLER SPEED IS NOT SETTABLE.PAGEA, .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB: .SBTTL . DEACB/DEACB1 - DEALLOCATE AN AST CONTROL BLOCK;R;+.; **-DEACB - DEALLOCATE AN AST CONTROL BLOCK;L@; THIS ROUTINE IS CALLED WHEN AN AST CONTROL BLOCK NEEDS TO BEF; DEALLOCATED OR A TSA EVENT PACKET NEEDS TO BE PASSED TO IT'S OWNERG; FOR DEALLOCATION PROCESSING. AN ACB IS DISTINGUISHED FROM A TEP BYDM; OFFSETS A.CBL/E.VSIZ. AN ACB HAS A ZERO IN THIS WORD; A TEP IS NON-ZERO.OL; IF THE PACKET IS A TEP, IT IS MARKED FOR DELETE AND QUEUED TO THE OWNER.J; IF IT IS AN ACB, IT IS MARKED FOR DELETE AND A CHECK IS MADE TO SEE IFL; IT IS IN A TASK'S AST QUEUE (AF.QUE SET). IF SO, IT WILL BE DEALLOCATEDL; WHEN IT IS DEQUEUED LATER ON (WITH A CALL TO DQACB). OTHERWISE THE SIZE1; OF THE ACB IS OBTAINED AND IT IS DEALLOCATED.; ; INPUTS:; FOR ENTRY AT DEACB:B; (R4) => UCBX LOCATION HOLDING ADDRESS OF ACB/TEP TO DEALLOCATE1; R5 => UCB FOR THE TERMINAL IF PACKET IS A TEPE;A; FOR ENTRY AT DEACB1: H; R0 => THREAD WORD OF THE ACB (STRUCTURE HAS NEGATIVE OFFSETS) OR TEP;E; OUTPUTS: NONE.;TB; REGISTERS MODIFIED: R2 MAY BE DESTROYED BY THE OWNER ROUTINE;-;N  .ENABL LSB DEACB::I  MOV R0,-(SP) ;SAVE R0  MOV (R4),R0 ;GET THE ACB/TEP!  BEQ 30$ ;IF EQ, NONE...RETURN*  CLR (R4) ;INDICATE IT HAS BEEN DELETED .IF DF T$$TSA ASSUME A.CBL,E.VSIZ/ TST A.CBL(R0) ;IS THIS AN AST CONTROL BLOCK?L' BEQ 10$ ;IF EQ, YES...DEALLOCATE ITT MOV R3,-(SP) ;SAVE REGISTER MOV R1,-(SP) ;SAVE REGISTER, MOV R0,R3 ;COPY TEP ADDRESS FOR QUEUEING/ BISB #EF.MDE,E.VFLG(R3) ;MARK TEP FOR DELETE 5 CALL QUETEP ;PASS TEP TO NETWORK FOR00~~|tt tfDATA DEALLOCATIONS BR 20$ ;SKIP TO FINISH UP 10$: .ENDC ;T$$TSA4 BISB #AF.MDE,A.PRM+5(R0) ;MARK THE ACB FOR DELETE; BITB #AF.QUE,A.PRM+5(R0) ;IS ACB CURRENTLY IN AST QUEUE?4 BNE 30$ ;IF NE, YES...WAIT FOR IT TO BE DEQUEUED ;T'!; HERE TO ACTUALLY DEALLOCATE AN ACB..";L #DEACB1::($ MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS% MOV R1,-(SP) ;SAVE REGISTER-& MOVB A.PRM+4(R0),R1 ;GET LENGTH OF THE ACB./' CMP -(R0),-(R0) ;BACK UP TO START OF THE ACBT%( CALL $DEACB ;DEALLOCATE THE BLOCKO)20$:!* MOV (SP)+,R1 ;RESTORE REGISTER'+ MOV (SP)+,R3 ;RESTORE PACKET ADDRESSR,30$:- MOV (SP)+,R0 ;RESTORE R0B. RETURN ;ALL DONE / 0 .DSABL LSBN1,2 .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB345;+B6; **-MPROT- MAP AND CALL SPECIFIED ROUTINE WITHIN THE ROOT (MAINC7; APR5 MAPPING) OF THE TERMINAL DRIVER, RESTORE PREVIOUS MAPPINGI8; AND RETURN TO CALLER9;E :; INPUTS:H;;.0<; 2(SP) = ADDRESS OF APR5 ROUTINE TO BE CALLED3=; (SP) = ADDRESS OF TO WHICH TO RETURN WHEN DONEM>;P ?; OUTPUTS:@;S A; NONE.VB;+ C; ALL REGISTERS ARE PRESERVED.D;-;E .IF DF T$$OVL ;IF SYSTEM CONTAINS MEMORY-OVERLAID TTDRVSF GMPROT::-H MOV 2(SP),-(SP) ;DUPLICATE ADDRESS TO CALL9I MOV 2(SP),4(SP) ;PUT RETURN ADDRESS WHERE IT SHOULD BEI)J MOV KINAR5,2(SP) ;SAVE CURRENT MAPPING ,K MOV ROTMAP,KINAR5 ;MAP MAIN ROOT OF TTDRV!L CALL @(SP)+ ;AND CALL ROUTINEN$M MOV (SP)+,KINAR5 ;RESTORE MAPPINGN RETURN ;RETURN TO CALLERSOP;+HQ; **-MPEXT- MAP AND CALL SPECIFIED ROUTINE WITHIN THE OVERLAY (TTEXT),1R; RESTORE PREVIOUS MAPPING AND RETURN TO CALLER.S; T; INPUTS:YU;C-V; R1 = ADDRESS OF APR5 ROUTINE TO BE CALLEDW;V X; OUTPUTS:Y;C Z; NONE. [;L \; ALL REGISTERS ARE PRESERVED.];-^ _MPEXT::U)` MOV KINAR5,-(SP) ;SAVE CURRENT MAPPINGA,a MOV EXTMAP,KINAR5 ;MAP MAIN ROOT OF TTDRVb CALL (R1) ;AND CALL ROUTINE $c MOV (SP)+,KINAR5 ;RESTORE MAPPINGd RETURN ;RETURN TO CALLEROef;+%g; **-TRANSFERS TO AND FROM THE ROOTEh;D i; TRANSFER FROM TTINI TO QPEIOj kQPETRA::'l MOV EXTMAP,KINAR5 ;MAP THE EXTENSIONm CALLR QPEIO1 ;JMP TO QPEIO1An;S!o; TRANSFER FROM QPEIO1 TO QPWLBVp qQPWTRA::"r MOV ROTMAP,KINAR5 ;MAP THE ROOTs CALLR QPWLB ;JMP TO QPWLBt;X u; TRANSFER FROM TTATT TO QUEUEv wQUETRA::"x MOV ROTMAP,KINAR5 ;MAP THE ROOTy CALLR QUEUE ;JMP TO QUEUELz{ .ENDC ;T$$OVL|}; ~;O*.SBTTL ALTB - ALLOCATE A TERMINAL BUFFER;;+$; ALTB - ALLOCATE TERMINAL BUFFER.; ; INPUT:; NONE;Q ; OUTPUT:P; IF SUCCESS:T ; CC-C 02; R2 POINTER TO BUFFER WITH LENGTH T$$BFL BYTES.; FIRST WORD CLEARED.;1; IF FAILURE: ; CC-C 1;R; REGISTERS ALTERED: R0,R2;-;B;P,ALTB:: MOV FREEB,R2 ;GET FIRST FREE BUFFER BEQ 20$ ;NONE - JUMP+ MOV @R2,FREEB ;POINT TO NEXT FREE BUFFERE 10$: CLR @R2 ;CLEAR LINK WORD  RETURN20$: MOV R1,-(SP) ;SAVE R1% MOV #T$$BFL,R1 ;SET DESIRED LENGTH ( CALL $ALOCB ;ALLOCATE IN SYSTEM POOL MOV (SP)+,R1 ;RESTORE R1  MOV R0,R2 ;GET BUFFER IN R2C BCC 10$ ;OK - JUMP' RETURN ;ELSE RETURN WITH CARRY SETR.PAGEL .IFT ;NDF T$$SPLUG.SBTTL CKTAB - CHECK FOR TYPE-AHEAD BUFFER ALLOCATION OR DEALLOCATIONB;V;+?; CKTAB - CHECK WHETHER TYPE-AHEAD BUFFER SHOULD BE ALLOCATEDF; OR DEALLOCATED.R;F ; INPUT:; R5 POINTER TO U.TSTA=; S3.TAB 0 DEALLOCATE TYPE-AHEAD BUFFER IF ONE IS ALLOCATEDS+; (LOSING ALL CHARACTERS STORED IN IT) 6; 1 ALLOCATE TYPE-AHEAD BUFFER IF NONE IS ALLOCATED0; (LOSING SINGLE CHARACTER IF THERE IS ONE);R; REGISTERS ALTERED: R0,R2;-;L;*CKTAB:: CALL LOCKI ;LOCK OUT INTERRUPTS4 MOV U.TTAB-U.TSTA(R5),R2 ;;;GET TYPE-AHEAD BUFFER BEQ 10$ ;;;NONE - JUMP) BIT #1,R2 ;;;SINGLE-CHARACTER BUFFER?O BNE 10$ ;;;Y - JUMPD;; TYPE-AHEAD BUFFER EXISTS;.* BIT #S3.TAB,4(R5) ;;;DEALLOCATE BUFFER? BNE 20$ ;;;N - JUMP CALL DETB ;;;Y - D00~|{ccccO IT3 CLR U.TTAB-U.TSTA(R5) ;;;SHOW NO BUFFER ANY MOREF BR 20$ ;;;;$; TYPE-AHEAD BUFFER DOES NOT EXIST;N,10$: BIT #S3.TAB,4(R5) ;;;ALLOCATE BUFFER? BEQ 20$ ;;;N - JUMPL CALL ALTB ;;;Y - DO IT BCS 20$ ;;;FAILED - JUMP5 MOV R2,U.TTAB-U.TSTA(R5) ;;;SAVE POINTER TO BUFFER" CLR (R2)+ ;;;INITIALIZE HEADER MOV #*400,@R2 ;;;; ; ALL DONE;E220$: RETURN ;;;RETURN VIA COROUTINE THAT DROPS ;;;PRIORITY  .ENDC ;NDF T$$SPL.PAGET,.SBTTL EXPCHR - EXPAND AN OUTPUT CHARACTER;R;+C; EXPCHR - THIS MODULE CONTAINS THE ROUTINES TO EXPAND CHARACTERS:'; INTO STRINGS ON OUTPUT AS REQUIRED.;2@; THESE ROUTINES ARE CALLED BOTH AT SYSTEM STATE (WHEN SETTING<; UP A WRITE REQUEST) AND FROM THE INPUT INTERRUPT SERVICE=; ROUTINE (TO GENERATE AN ECHO). THEREFORE, THE MODULE MUST@; BE REENTRANT.L;-;E;0; EXPAND A CHARACTER;O;+ ; EXPCHR - EXPAND A CHARACTER.;. ; INPUT:; R2 CHARACTER; R5 POINTER TO U.TSTA&; U.TCHP CURRENT HORIZONTAL POSITION$; U.TCVP CURRENT VERTICAL POSITION9; S2.FLF 1 IF LINE FEED MUST BE OUTPUT BEFORE NEXT ECHOU/; S2.ELF 1 IF A LINE-FEED SHOULD BE DISCARDEDA;T ; OUTPUT:N+; IF THE EXPANSION IS A SINGLE CHARACTER:E ; CC-Z 1U; R2 UNCHANGEDT!; IF THE EXPANSION IS A STRING:E ; CC-Z 0M!; R2 LENGTH OF EXPANDED STRINGE"; R3 POINTER TO EXPANDED STRING6; IF CHARACTER SHOULD BE KEPT AND PRESENTED AGAIN ON4; NEXT CALL TO EXPCHR (ONLY RELEVANT IF CC-Z = 0): ; CC-C 1H/; IF CHARACTER SHOULD NOT BE PRESENTED AGAIN:O ; CC-C 02;; IF THE CHARACTER IS A LINE-FEED AND SHOULD BE DISCARDEDE ; CC-V 1E; R2 UNCHANGEDC ; ALWAYS:<; U.TCHP UPDATED TO POSITION AFTER STRING HAS BEEN OUTPUT<; U.TCVP UPDATED TO POSITION AFTER STRING HAS BEEN OUTPUT/; S2.FLF 1 IF A CARRIAGE RETURN WAS RETURNEDR ; 0 ELSE 7; S2.ELF 0 IF THE V-BIT GETS SET OR IF THE CHARACTERP*; WAS ANY ONE EXCEPT CR ,ESC,BSP OR FF; ; REGISTERS ALTERED: R2,R3;C@ ; THE PROPER WAY TO USE EXPCHR IS TO FIRST SAVE THE CHARACTER,@ ; THEN CALL EXPCHR, THEN OUTPUT THE STRING DESCRIBED BY R2,R3.> ; IF CC-C WAS SET ON RETURN FROM EXPCHR, ON THE NEXT CALL TO@ ; EXPCHR THE SAME CHARACTER MUST BE PRESENTED IN R2, OTHERWISE ; THE NEXT CHARACTER.G;-;U;  .ENABL LSBF;R2EXCR1:: MOVB #CH.CR,R2 ;EXPAND A CARRIAGE RETURN BR EXPCHR ;G;E,EXPC3:: BIT #S2.WAL,2(R5) ;WRITE PASS ALL? BEQ EXPCHR ;N - JUMP  SEZ ;Y - EXIT WITH CC-Z = 1  RETURN ;P;Y8EXPCHR::CLR -(SP) ;INITIALIZE FLAG TO 0 TO EXIT WITH:" ; CC-C = 0 (DON'T KEEP CHAR) ; CC-Z = 1 (OUTPUT CHAR)8 MOVB U.TCHP-U.TSTA(R5),@SP ;GET CURRENT HOR. POSITION  TST (R5)+ ;POINT TO U.TSTA+2,  MOVB @R5,R3 ;GET CONTEXT FOR WRAP-AROUND,! BIC #^C,R3 ;CLEAR IRRELEVANT BITS" ASSUME S2.WRA,6# JMP @OSDSP(R3) ;DISPATCHN$;B%;C0&; DEFAULT CASE - NO SPECIAL THINGS IN PROGRESS';L-(EXPC0:: BIT #S2.FLF,@R5 ;FORCE A LINE FEED?T) BNE 40$ ;Y - JUMPR* CMPB R2,#CH.ESC ;ESCAPE?(+ BEQ EXESC ;Y - JUMP0#, CMPB R2,#CH.CR ;CARRIAGE RETURN?'2- BHI EXDEF ;N - HIGHER, CAN'T BE IN RECOGNITION&. ;TABLE - JUMP TO DEFAULT ROUTINE%/ BEQ EXCRJ ;CARRIAGE RETURN - JUMPS;0 MOV #EXCRT,R3 ;POINT TO START OF CHAR. RECOGNITION TABLEC1 ;FALL THRU TO "CHRDSP"2;3;S#4; DISPATCH ACCORDING TO CHARACTERA5;6;+-7; CHRDSP - DISPATCH ACCORDING TO CHARACTER.R8;S 9; INPUT::; R2 CHARACTER+;; R3 START OF CHARACTER RECOGNITION TABLEM<; =; OUTPUT:E<>; JUMPS TO CHARACTER PROCESSING ROUTINE WITH R2 UNCHANGED.?;-@;NA;$BCHRDSP::TSTB (R3)+ ;END OF TABLE?C BEQ 30$ ;Y - JUMPED CMPB R2,-1(R3) ;MATCH?E BNE CHRDSP ;N - LOOP+F30$: SUB #CHRT+1,R3 ;GET OFFSET FROM CHRTTG ASL R3 ;MAKE WORD INDEX!H JMP @CHRD(R3) ;JUMP TO ROUTINEI.PAGE J;TK;CL; EXPAND ESCAPEAM;N ASSUME U.TCVP, JOEXESC: CLR U.TCHP-(R5) ;CLEAR HORIZONTAL00~~|tt tfDATA AND VERTICAL POSITION%P JMP 180$ ;OUTPUT THE ESCAPE AS ISQ;PR; FORCE LINE FEEDAS;R4T40$: CMPB R2,#CH.LF ;IS THE CHARACTER A LINE FEED?U BEQ EXLF ;Y - JUMP$V BR 50$ ;N - NEED CHARACTER AGAINW;$X; DO THE LINE FEED FOR WRAP-AROUNDY; :ZEXPC1:: ADD #S2.WRB,@R5 ;NEXT TIME GO TO EXPC2 TO DO THE[ ;CHARACTER ITSELF \ BR 50$ ;];P^;O2_; EXPAND FORM FEED AND VERTICAL TAB IF NECESSARY`;aEXVT::0bEXFF:: BIT #S4.HFF,4(R5) ;SIMULATE FORM FEEDS?c BNE 110$ ;N - JUMPd;I7e50$: COMB 1(SP) ;WE NEED CHARACTER AGAIN, EXIT WITH:Pf ; CC-C = 1 (KEEP CHAR) g ; CC-Z = 0 (OUTPUT STRING)h; i;Ej; EXPAND LINE FEEDk;U-lEXLF:: BIC #S2.FLF,@R5 ;CLEAR FORCE-LF FLAG)m BIT #S2.ELF,@R5 ;SHOULD WE EAT THE LF?n BEQ 55$ ;BR IF NOR0o BIC #S2.ELF,@R5 ;NEXT SHOULD NOT BE DISCARDEDBp CMP -(R5),(SP)+ ;POINT TO U.TSTA AND POP THE FLAG OFF THE STACKq SEV ;SET STATUS BIT r RETURNs55$:t MOV #ASLF,R3 ;POINT TO LFu BIS #400,@SP ;EXIT WITH: v ; CC-C = ? (NO CHANGE) w ; CC-Z = 0 (OUTPUT STRING);x INCB U.TCVP-(R5) ;UPDATE CURRENT VERTICAL POS.S5y CALL 190$ ;RESET POSITION IF CROSSED A PAGE LIMIT:,z BHIS 60$ ;BRANCH IF CROSSED A PAGE LIMIT{ CMPB R2,#CH.FF ;FORMFEED?| BEQ 90$ ;Y - JUMP } BR 70$ ;N - JUMP-~60$: CMPB R2,#CH.FF ;IS THE CHARACTER A FF?) BEQ 80$ ;Y - JUMP $70$: CMPB R2,#CH.VT ;IS THIS A VT? BNE 120$ ;N - JUMP= BITB #7,U.TCVP-(R5) ;ARE WE AT A VERT. TAB STOP?E BNE 90$ ;N - JUMPC;80$: BIC #140000,@SP ;Y - DON'T WANT CHAR AGAIN EXIT WITH. ; CC-C = 0 (DON'T KEEP)R  ; CC-Z = 0 (OUTPUT STRING), ; CC-N = 0 (INSURE CC-V = 0 AFTER ROL)-90$: BIT #U2.CRT,U.CW2-(R5) ;CRT?P BEQ 120$ ;N - JUMP3 MOV #4,R2 ;Y - ECHO 4 LF'S IN PLACE OF FF OR VTC- SUB R2,R3 ;POINT TO FIRST OF 4 LINE FEEDS8- BIT #S4.VFL,4(R5) ;VERTICAL FILL REQUIRED?A BEQ 100$ ;N - JUMP2 MOV #<1+NLFF>*4,R2 ;Y - ECHO 4 LF'S PLUS FILLER. SUB R2,R3 ;POINT TO START OF OUTPUT STRINGB100$: MOVB U.TCVP-(R5),-(SP) ;UPDATE VERTICAL POSITION6 ADD #3,@SP ;(ADD 3 SINCE 1 LF WAS ALREADY COUNTED)B MOVB (SP)+,U.TCVP-(R5) ;MUCH PAIN FOR ADD TO ODD ADRS7 CALL 190$ ;CORRECT POSITION IF CROSSED A PAGE LIMIT,# BIC #140000,@SP ;DON'T KEEP CHARR7110$: BR 180$ ;FILL CHARACTERS ALREADY ACCOUNTED FORB.120$: MOV #1,R2 ;ASSUME NO FILLERS REQUIRED- BIT #S4.VFL,4(R5) ;VERTICAL FILL REQUIRED?E BEQ 180$ ;N - JUMP2 ADD #NLFF,R2 ;Y - ADD NUMBER OF FILL CHARACTERS1 BR 180$ ;DON'T CHANGE HOR. POS. OR BYTE COUNTA;I;; EXPAND BACKSPACE;E$EXBSP:: TSTB @SP ;AT LEFT MARGIN?/ BEQ 180$ ;Y - EXIT (DON'T CHANGE HOR. POS.)D DECB @SP ;N - BACKSPACET BR 170$ ;EXITD;GEXCRJ: BR EXCR ;BRANCH AIDO;E;AF; CR AND LF FOR WRAP-AROUND HAVE BEEN DONE. DO THE CHARACTER ITSELF.=; NOTE - THE CHARACTER MUST BE EITHER A HORIZONTAL TAB OR AT;; "NORMAL" CHARACTER, SINCE ONLY THOSE CAUSE WRAP-AROUND. ;A4EXPC2:: BIC #S2.WRA,@R5 ;CLEAR WRAP-AROUND CONTEXT" CMPB R2,#CH.HT ;HORIZONTAL TAB? BNE EXDEF ;N - JUMP;;S; EXPAND HORIZONTAL TABI;*EXHT:: MOV @SP,R3 ;GET CURRENT HOR.POS.( BIC #S2.ELF,@R5 ;CLEAR DISCARD LF BIT/ BIS #7,@SP ;POINT JUST BEFORE NEXT TAB STOP0 BIT #S4.HHT,4(R5) ;HARDWARE HOR. TAB PRESENT? BNE 130$ ;Y - JUMP$ MOV R3,R2 ;GET CURRENT HOR. POS.. SUB @SP,R2 ;GET NUMBER OF SPACES NECESSARY ;NEGATED AND OFF BY 1C NEG R2 ;MAKE POSITIVE INC R2 ;ADJUST MOV #ASHT,R3 ;POINT TO HTAB/ BIS #400,@SP ;OUTPUT IS A STRING, EXIT WITH: ! ; CC-C 0 (DON'T KEEP CHAR.)H ; CC-Z 0 (OUTPUT STRING)" BR 130$ ;CHECK FOR WRAP-AROUND;#;F; EXPAND NORMAL CHARACTER;# EXDEF::N( BIC #S2.ELF,@R5 ;CLEAR DISCARD LF BIT' BIT #140,R2 ;NON-SPACING CHARACTER?B BEQ 180$ ;Y - EXIT@ BIT #U3.UPC,U.CW3-(R5) ;TERMINAL SUPPORT LOWERCASE? BEQ 130$ ;Y - JUMP6 ;NOTE THAT LOWER TO UPPER CASE CONVE00~|{ccccRSION IS NOT6 ;PERFORMED HERE FOR THE GR CHARACTER SET SINCE A6 ;TERMINAL CAPABLE OF DISPLAYING 8-BIT CHARACTERS* ;WILL NEVER GET PAST THE CHECK ABOVE, CMPB R2,#141 ;CHARACTER NEED CONVERTING? BLO 130$ ;N - JUMP CMPB R2,#172 ;SECOND CHECK BHI 130$ ;N - JUMP/ BICB #40,R2 ;CONVERT LOWERCASE TO UPPERCASEC7130$: CMPB @SP,U.CW4-(R5) ;AT RIGHT MARGIN?< BLO 160$ ;N - JUMP( BIT #S3.ACR,2(R5) ;AUTO CR-LF WANTED? BEQ 160$ ;N - JUMP0 COMB 1(SP) ;NEED CHARACTER AGAIN, EXIT WITH: ; CC-C = 1 (KEEP CHAR)  ; CC-Z = 0 (OUTPUT STRING)< ADD #S2.WRB,@R5 ;SET STATE VARIABLE TO COME BACK AT EXPC1 ;TO DO THE LINE FEED! ;FIRST DO A CARRIAGE RETURNB;0; ; EXPAND A CARRIAGE RETURN;E!EXCR:: BIS #400,@SP ;EXIT WITH:  ; CC-C = ? (NO CHANGE)  ; CC-Z = 0 (OUTPUT STRING) ASSUME S4.HFL,7+ MOVB 4(R5),R2 ;GET HOR. FILL REQUIREMENTT( BIC #^C,R2 ;CLEAR OTHER BITS CMP R2,#7 ;FILL FOR LA30S? BNE 150$ ;N - JUMP) MOVB @SP,R2 ;Y - GET CURRENT HOR.POS. .IF DF R$$EIS ASH #-3,R2 ;DIVIDE BY 8  .IFFE ASR R2 ;DIVIDE BY 8  ASR R2L  ASR R2 .ENDC# CMP R2,#9. ;WITHIN TABLE RANGE?D BLOS 140$ ;Y - JUMP( MOV #9.,R2 ;N - SET TO HIGHEST VALUE4140$: MOVB HORFT(R2),R2 ;GET FILL COUNT FROM TABLE!150$: MOV #ASCR,R3 ;POINT TO CR5. MOVB #-1,@SP ;INITIALIZE CURRENT HOR. POS.$ ;BOTH BYTE COUNT AND HOR. POS." ;WILL BE INCREMENTED ON EXIT1 BIS #S2.FLF,@R5 ;FORCE A LINEFEED ON NEXT ECHO INC R2 ;INCR. BYTE COUNT;#; #160$: INCB @SP ;UPDATE HOR. POS.A?170$: MOVB @SP,U.TCHP-(R5) ;STORE UPDATED HOR. POS.#180$: TST -(R5) ;POINT TO U.TSTA CLRB @SP ;CLEAR LOW BYTE+ ROL (SP)+ ;GET FLAGS TO GENERATE PROPERO  ;CONDITION CODES  RETURN ;B ;8 190$: CMPB U.TCVP-(R5),U.TLPP-(R5)  ;CROSSED A PAGE LIMIT? BLO 200$ ;N - RETURN- CLRB U.TCVP-(R5) ;Y - RESET TO 0S) BIT #U2.CRT,U.CW2-(R5) ;CRT? BEQ 200$ ;N - RETURN3 MOVB U.TLPP-(R5),U.TCVP-(R5)A! ;Y - CRT'S SCROLL, NOT ROLL>: DECB U.TCVP-(R5) ;CURSOR STAYS ON BOTTOM LINE200$: RETURN;  .DSABL LSBE;R;P .IF DF T$$CUP.PAGE?.SBTTL CPOS - SUBROUTINE TO EXPAND CURSOR POSITIONING COMMAND-;T ;+B!; CPOS - EXPAND CURSOR COORDINATES TO CURSOR POSITIONING COMMAND#"; SUITABLE FOR THE TERMINAL TYPE.2#; $; INPUT:.%; R2 LOW BYTE: COLUMN NUMBER (STARTING AT 1)+&; HIGH BYTE: LINE NUMBER (STARTING AT 1).'; R5 POINTER TO U.TSTA(;5 ); OUTPUT:-+*; R2 LENGTH OF CURSOR POSITIONING COMMANDS,+; R3 POINTER TO CURSOR POSITIONING COMMAND ,; CC-C 0 -; CC-Z 0.;E/; REGISTERS ALTERED: R2,R30;-1;2;3CPOS::4; 25; USE U.TTYP TO DETERMINE HOW TO EXPAND COMMAND.6;/7 MOVB U.TTYP-U.TSTA(R5),R3 ;GET TERMINAL TYPES$8 BEQ CPOS0 ;NOT RECOGNIZED - JUMP9 CMP R3,#TTPHI ;RECOGNIZED?: BHI CPOS0 ;N - JUMP:<; MOVB TTYP1-1(R3),R3 ;Y - GET CURSOR POS. TYPE IN BITS 6-7<= .IF DF R$$EIS>"? ASH #-5,R3 ;GET IT IN BITS 1-2@A .IFF B C ASL R3 ;SHIFT INTO BITS 9-10 D ASL R3 ; E ASL R3 ;F SWAB R3 ;GET IT IN BITS 1-20GH .ENDCI%J BIC #^C6,R3 ;CLEAR ALL OTHER BITS7K BEQ CPOS0 ;NO CURSOR POSITIONING IMPLEMENTED - JUMPO*L MOV R2,-(SP) ;SAVE ORIGINAL COORDINATES)M BIC #100000,R2 ;CLEAR SCREEN CLEAR BITG4N MOV R2,U.TCHP-U.TSTA(R5) ;SET NEW CURSOR POSITION(O JMP @CPOST-2(R3) ;JUMP VIA JUMP TABLEP Q .ENABL LSB RS;I/T; TYPE 0 - CURSOR POSITIONING NOT IMPLEMENTED;U;T+VCPOS0: CLR R2 ;EXPAND INTO A SINGLE NULLH+W RETURN ;RETURN WITH CC-C = 0, CC-Z = 1;X;SY; TYPE 1 - VT05BZ;-5[CPOS1:: ADD #401*40,R2 ;BIAS BOTH COORDINATES BY 40B!\ MOVB R2,CP1+20 ;STORE X COORD.T(] SWAB R2 ;GET Y COORD. AND CLEAR CC-C!^ MOVB R2,CP1+13 ;STORE Y COORD.C _ MOV #7,R2 ;STRING LENGTH = 7$` MOV #CP1+12,R3 ;POINTER TO STRING00~~|tt tfDATA&a TST (SP)+ ;CLEAR SCREEN REQUESTED?b CLZ ;(LEAVE CC-Z CLEAR)c BPL 10$ ;N - RETURN 5d SUB #12,R3 ;POINT TO CLEAR SCREEN ESCAPE SEQUENCEP2e ADD #12,R2 ;ADD THAT TO CURSOR POSITION OUTPUTf10$: RETURN ;RETURNCg; h; TYPE 2 - VT52 AND VT50Hi;=jCPOS2:: SWAB R2 ;GET COLUMN IN HIGH BYTE, LINE IN LOW BYTE .k ADD #401*40,R2 ;BIAS BOTH COORDINATES BY 40-l MOV #CP2+6,R3 ;POINT TO COMMAND STRING + 2Y!m MOV R2,@R3 ;STORE COORDINATESG6n TST -(R3) ;POINT TO START OF STRING AND CLEAR CC-Co MOV #4,R2 ;LENGTH = 4?&p TST (SP)+ ;CLEAR SCREEN REQUESTED?q CLZ ;(LEAVE CC-Z CLEAR)r BPL 10$ ;N - RETURN 8s SUB #4,R3 ;Y - POINT TO CLEAR SCREEN ESCAPE SEQUENCEt BR 20$ ;FINISH IT OFF u;Rv; TYPE 3 - VT100w;5#xCPOS3:: MOV R0,-(SP) ;SAVE R0, R1 y MOV R1,-(SP) ;H)z MOV #CP3A,R3 ;POINT AT FINAL CHARACTER &{ CALL 30$ ;EXPAND X-COORD. TO ASCII#| MOVB #';,-(R3) ;INSERT DELIMITER} SWAB R2 ;GET Y-COORD.I~ CALL 30$ ;EXPAND ITI MOV (SP)+,R1 ;RESTORE R0, R1C MOV (SP)+,R0 ;L5 MOVB #'[,-(R3) ;INSERT CONTROL SEQUENCE INTRODUCERC& MOVB #CH.ESC,-(R3) ; .. (BACKWARDS) MOV #CP3A+1,R2 ;,8 SUB R3,R2 ;GET STRING LENGTH AND CLEAR CC-C AND CC-Z* TST (SP)+ ;WAS CLEAR SCREEN REQUESTED? CLZ ;(LEAVE CC-Z CLEAR) BPL 10$ ;N - RETURN( MOVB #'J,-(R3) ;INSERT...5 MOVB #'2,-(R3) ;...CLEAR SCREEN ESCAPE SEQUENCE...A+ MOVB #'[,-(R3) ;...INTO OUTPUT STRING...# MOVB #CH.ESC,-(R3) ;...BACKWARDS 520$: ADD #4,R2 ;ADD THAT TO CURSOR POSITION OUTPUT( RETURN ;RETURN'30$: CLR R1 ;! BISB R2,R1 ;GET NUMERIC VALUE  INC R1 ;ADJUST TO BASE 1 .IF DF R$$EIS)40$: CLR R0 ;CLEAR HIGH ORDER DIVIDEND- DIV #10.,R0 ;DIVIDE BY 10C .IFF ;R$$EIS?40$: MOV R1,R0 ;GET DIVIDENDL MOV #10.,R1 ;GET DIVISOR CALL $DIV ;DIVIDE BY 10' .ENDC ;R$$EIS+ BIS #'0,R1 ;BIAS REMAINDER BY ASCII /0/O! MOVB R1,-(R3) ;STORE IN STRING, MOV R0,R1 ;GET QUOTIENTA# BNE 40$ ;NON-ZERO - DO IT AGAINN RETURN ;RETURN  .ENDC ;T$$CUP  .DSABL LSB .PAGEE..SBTTL UBTRA - BUFFERED ACD TRANSFER ROUTINE;D;+B; UBTRA - TRANSFER BUFFERS FROM THE ACD TO A TASK AT $FINBF TIME;D ; INPUT:7; R0 ADDRESS OF BUFFER CONTAINING TRANSFER PARAMETERS;V ; OUTPUT:TE; THE CHARACTERS DESCRIBED BY THE BUFFER PARAMETERS ARE TRANSFERREDS=; FROM THE ACD TO THE TASK. THE ACD IS THEN CALLED BACK TO C; DEALLOCATE ITS BUFFER AND POSSIBLY TO REQUEST ANOTHER TRANSFER.I;I; REGISTERS ALTERED: ALL;-;;;P .IF DF T$$ACD*UBTRA:: ADD #3,R0 ;POINT PAST LINK WORD  MOV (R0)+,R5 ;GET UCB ADDRESS' MOV (R0)+,R3 ;GET I/O PACKET ADDRESST3 MOV I.PRM+2(R3),R4 ;GET TASK BUFFER DISPLACEMENTF10$: MOV R3,-(SP) ;SAVE R31 MOV (R0)+,R1 ;GET ACD BUFFER APR BIAS (A.SMAP)B5 MOV (R0)+,R2 ;GET ACD BUFFER DISPLACEMENT (A.SBUF)T, SUB #20000,R2 ;CONVERT TO AN APR5 MAPPING% MOV (R0)+,R3 ;GET TASK PCB ADDRESSO& MOV P.REL(R3),R3 ;GET TASK APR BIAS- ADD (R0)+,R3 ;COMPUTE TASK BUFFER APR BIASP120$: MOV (R0),R0 ;GET TRANSFER LENGTH (A.SLEN)O% CALL $BLXIO ;PERFORM THE TRANSFERT5 MOV R3,R1 ;SAVE R3 IN CASE ACD CONTINUES TRANSFER+ MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSC0 CLR U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING4 MOV #A.CALL,R0 ;SET TRANSFER CALLBACK ENTRY POINT CALL $SWACD ;CALL ACDE- BIT #UA.CAL,U.AFLG-U.TSTA(R5) ;MORE TO GO?P BEQ 30$ ;N - JUMP+, MOV R3,-(SP) ;Y - SAVE I/O PACKET ADDRESS+ MOV R1,R3 ;RESTORE TASK BUFFER APR BIASE# MOV U.ACB-U.TSTA(R5),R0 ;GET ACB01 ADD #A.SMAP,R0 ;POINT TO ACD BUFFER PARAMETERSO( MOV (R0)+,R1 ;GET ACD BUFFER APR BIAS, MOV (R0)+,R2 ;GET ACD BUFFER DISPLACEMENT, SUB #20000,R2 ;CONVERT TO AN APR5 MAPPING BR 20$ ;DO THE TRANSFERL 30$: RETURN .ENDC ;T$$ACD .ENDENTRY POINT CALL $SWACD ;CALL ACDE- BIT #UA.CAL,U.AFLG-U.TSTA(R5) ;MORE TO GO?P BEQ 30$ ;N - JUMP+, MOV R3,-(SP) ;Y - SAVE I/O PACKET ADDRESS+ MOV R1,00~~{cccc6; XEPRE.MAC PREFIX FILE FOR ASSEMBLING THE XE DRIVER&U$$NTS=3 ;NUMBER OF XMT RINGS ENTRIES*U$$NRS=8. ;NUMBER OF TRANMIT RING ENTRIES$U$$NCT=1 ;NUMBER OF UNA CONTROLLERS*U$$NPC=8. ;NUMBER OF PORTS PER CONTROLLER'L'c.=0$;:!; Multicast address chain entries$;: M$LNK:'L' .BLKW 1 ; Link pointer%M$ADD:'L' .BLKW 3 ; Multicast addressi M$LEN:'L' .PSECT .IF NB LST  .NLISTl .IFFr .MACRO EPMDF$,X,Y,Z .ENDM EPMDF$p .ENDC .ENDM EPMDF$ ; Default user defined)LF$PAD='B' 4 ;  .TITLE TTYHV2 .IDENT /06.08/N;E7; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;E ;  ; 28-AUG-82 DALE R. DONCHINM ; ; MODIFICATIONS:;Z!; D. R. DONCHIN 05-JUN-83 05.01I4; DD173 -- FIX MINOR PROBLEMS WITH DHU/DHV11 CODE;;!; D. R. DONCHIN 14-SEP-83 05.02 "; DD179 -- ADD HOSTSYNC SUPPORT;!; D. R. DONCHIN 16-OCT-83 05.03NB; DD183 -- FIX SETTING OF SPEED WHEN NOABAUD AND PARITY ARE SET; ; S.C. ADAMS 23-APR-84 05.04D; SA170 -- CHANGE S4.XOF,XON,HPC,HPO TO S5.(ETC) AND S1.OBF TO S2=; AND CHANGE S3.ABP AND S3.ABD. AND CHANGE .OBF AND .CTS;8!; D. R. DONCHIN 15-JUN-84 05.05 ; DD186 -- ADD DHU11 SUPPORTO; !; D. R. DONCHIN 15-JUN-84 05.06 B ; DD187 -- IMPROVE MODEM HANDLING TO MEET EUROPEAN REQUIREMENTS!;0!"; D. R. DONCHIN 15-JUN-84 05.07O-#; DD193 -- FIX SOME MODEM CONTROL PROBLEMS$;1!%; D. R. DONCHIN 15-JUN-84 05.08B0&; DD195 -- FIX BUFFER LOSS AND ABORT PROBLEMS';0!(; D. R. DONCHIN 18-SEP-84 05.09O.); DD203 -- FIX DHV11 SUPPORT ON I/D SYSTEMS*;N"+; T. Lekas 2-Nov-84 05.10, 05.11<,; TL334 -- Port is notified of flow control status change-;-!.; D. R. DONCHIN 17-OCT-84 05.12R/;C=0; DD205 -- FIX TIMING PROBLEM WHEN ABORTING DHU/DHV OUTPUTE1;R2; L. KOGAN 4-FEB-85 05.13 ;3; LK605 -- FIX SETTING TC.PAR AND TC.EPA CHARACTERISTICSC4;L5; L. KOGAN 29-APR-85 05.14+6; LK607 -- FIX CONDITIONAL CODE (D$$VMD)F7;S8; L. KOGAN 5-JUN-85 05.15$9; LK608 -- FIX THE SELLIN PROBLEM:;3;; L. KOGAN 27-AUG-85 05.16B<; LK609 -- SETUP THE RIGHT LINE BEFORE CHANGING LINE PARAMETERS<;o<;d'<; MODIFIED FOR RSX-11M-PLUS V4.0 BY: <; <; L. KOGAN 18-JUN-86 6.01C4<; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT<;T<; L. KOGAN 08-SEP-86 6.02B5<; LK715 -- ADD SUPPORT FOR Q-BUS DMA TRANSFER FROM <; A TASK BUFFER<; <; L. KOGAN 01-DEC-86 6.03 ?<; LK717 -- FIX DISABLED TERMINAL PROBLEM AFTER HIGH PRIORITYN2<; OUTPUT IS ABORTED INSTEAD OF REGULAR OUTPUT<;<; L. KOGAN 29-DEC-86 6.049<; LK718 -- FIX SINGLE CHARACTER TRANSFER TO DHU11 LINEE<;<;<; L. KOGAN 20-FEB-87 6.05M<<; LK720 -- SUPPORT DIRECT TRANSFER FOR "PURE" IO.WAL ONLY<; <; D. DONCHIN 24-FEB-87 6.06SA<; DD721 -- BETTER HANDLE MIXED XOFF/XON AND QIO OUTPUT STREAMSR<; <; L. KOGAN 26-JUN-87 6.07 9<; LK726 -- SUPPORT Q-BUS DMA TRANSFER FOR REMOTE LINESL<;-<; L. KOGAN 02-JUL-87 6.08E<<; LK728 -- CHANGE DMA IO.WAL PACKET FORMAT (NO FLAG WORD)<; =;+0>; CONTROLLER-DEPENDENT ROUTINES FOR DHU/DHV11.?;-@;EA;ABC .IF DF D$$V11DE .MCALL UCBDF$FG UCBDF$ ;DEFINE UCB SYMBOLS0HI .IF DF R$$MPLJK .MCALL KRBDF$LM KRBDF$ ;DEFINE KRB SYMBOLS7NO .IFF ;R$$MPL PQ .MCALL SCBDF$RS SCBDF$ ;DEFINE SCB SYMBOLSTU .ENDC ;R$$MPLVW .PSECT MAP5X;PY;-Z; EQUATED SYMBOLSR[; "\; DHU/DHV11 REGISTER DEFINITIONS];E#^CSR = 0 ;CONTROL STATUS REGISTERK%_RBUF = 2 ;RECEIVER BUFFER REGISTER*`TXCHAR = 2 ;TRANSMIT CHARACTER REGISTER#aLPR = 4 ;LINE PARAMETER REGISTER$!bSTAT = 6 ;LINE STATUS REGISTERU0bFIFODT = 6 ;DHU FIFO DATA REGISTER ; LK7180bFIFOSZ = 6 ;DHU FIFO SIZE REGISTER ; LK718%cLNCTRL = 10 ;LINE CONTROL REGISTER2dBFADR1 = 12 ;TRANSMIT BUFFER ADDRESS 1 REGISTER2eBFADR2 =00~~|tt tfDATA 14 ;TRANSMIT BUFFER ADDRESS 2 REGISTER3fBFCNT = 16 ;TRANSMIT DMA BUFFER COUNTER REGISTERRg;Ng ; LK718 Dg; DEFINITION FOR THE CONTROLLER ID BIT IN STAT REGISTER ; LK718g; ; LK7182gDHUID = 400 ; DHUID=0 INDICATES DHV11 ; LK718)g ; DHUID=1 INDICATES DHU11 ; LK718h;Oi;+j; YVSTAX - START OUTPUT.7k; NOTE - NON-BUFFERED OUTPUT CURRENTLY NOT SUPPORTED.8l;N m; INPUT:>n; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.o; U.TOP+2 BUFFER POINTERRp; U.TOC BYTE COUNT q;T r; OUTPUT: s; OUTPUT STARTED.Ft; U.TOP+2 UNCHANGEDu; U.TOC UNCHANGEDv;w; REGISTERS ALTERED: R4Lx;-y;Iz;Tz; ; LK720Wz; BUFFERED OUTPUT FOR ALL QIO, EXCEPT IO.WAL IS ALWAYS DONE FROM THE TERMINAL ; LK720 Nz; DRIVER BUFFERS. IN CASE OF IO.WAL FOR Q-BUS SYSTEMS OUTPUT MAY BE ; LK720Mz; DONE FROM THE TASK BUFFER WITHOUT INTERMEDIATE TRANSFER INTO THE ; LK7202.z; CHAIN OF USUAL TTDRV BUFFERS ; LK720Rz; ONLY ONE INTERNAL TTDRV BUFFER IS USED FOR THIS TRANSFER. THIS BUFFER ; LK720Rz; DOES NOT CONTAIN DATA. IT CONTAINS INFORMATION FOR DIRECT OUTPUT FROM ; LK720%z; THE TASK BUFFERS. ; LK720;z; ; LK720z; OFFSETS ; LK720Wz; ; LK720*z; 0 - LINK WORD (CONTAINS 0) ; LK720z; 2 - LENGTH ; LK7202z; 4 - NUMBER OF BYTES FOR DMA TRANSFER ; LK7202z; 6 - HIGH BYTE OF TASK BUFFER ADDRESS ; LK7203z; 10 - LOW BYTES OF TASK BUFFER ADDRESS ; LK720z; ; LK7208z; THE REST OF THE OUTPUT BUFFER IS NOT USED ; LK720z; ; LK720Xz; IN A REGULAR QIO WE HAVE AS MANY PHYSICAL DATA TRANSFERS AS WE HAVE INTERNAL ; LK720Vz; OUTPUT BUFFERS CHAINED FOR TASK OUTPUT. FOR 'PURE' IO.WAL WE HAVE ONLY ONE ; LK720)z; PHYSICAL DATA TRANSFER ; LK7200z; ; LK720 { .ENABL LSB |;BJ}YVSTAX::BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;HIGH PRIORITY OUTPUT REQUESTED?>} BEQ 7$ ;;;N -POSSIBLY BEGIN NORMAL PRIORITY OUTPUT ; LK718H} BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT ALREADY IN PROGRESS? ; LK718@} BEQ 8$ ;;;Y - DO HIGH PRIOR.OUTPUT AT NEXT INTERRUPT ; LK718M} BIS #S5.HPO,U.TST5-U.TSTA(R5);;;SHOW BUSY DOING HIGH PRIOR. OUTPUT ; LK718A} ; LK718 3}STAXH: CALL SELLIN ;;;SELECT THE LINE ; LK718C,} MOV R3,R4 ;;;COPY CSR ADDRESS ; LK7182} BIT #DHUID,STAT(R3) ;;;CHECK FOR DHU ; LK718(} BEQ 2$ ;;;NO. THIS IS DHV ; LK718=} TSTB FIFOSZ(R3) ;;;IF DHU CHECK IF FIFO HAS SPACE ; LK718U'} BEQ 8$ ;;;NO SPACE. EXIT ; LK718A/} ADD #FIFODT,R4 ;;;POINT TO FIFODT ; LK718B} ; LK718 <}2$: BIT #S5.XOF,U.TST5-U.TSTA(R5);;;OUTPUT XOF? ; LK718} BEQ 3$ ;;;NO ; LK718G=} BIC #S5.XOF,U.TST5-U.TSTA(R5);;;RESET INDICATION ; LK718E+} MOV YVXOFF,-(SP) ;;;SET XOFF ; LK718R} BR 4$ ;;;GO ON ; LK718} ; LK718T:}3$: BIC #S5.XON,U.TST5-U.TSTA(R5);;;RESET XON ; LK718)} MOV YVXON,-(SP) ;;;SET XON ; LK718D} ; LK718S-}4$: CMP R3,R4 ;;;IF EQUAL - DHV ; LK718 (} BNE 5$ ;;;NO. THIS IS DHU ; LK718;} MOV (SP)+,TXCHAR(R3);;;OUTPUT XON/XOFF FOR DHV ; LK718S!} BR 6$ ;;;ALL DONE ; LK7187} ; LK718 :}5$: MOVB (SP)+,(R4) ;;;OUTPUT XON/XOFF FOR DHU ; LK718'} TSTB (SP)+ ;;;ADJUST SP ; LK718S} ; LK718.}6$: JMP 60$ ;;;INITIALIZE OUTPUT ; LK718} ; LK718OC}7$: BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;HIGH PRIOR. OUTPUT ; LK718 "} ;;;IN PROGRESS? ; LK718=} BEQ STAXN ;;;Y - DO NORMAL PRIOR. OUTPUT ON NEXT ; LK718;} ;;;INTERRUPT ; LK718#}8$: JMP 70$ ;;;EXIT ; LK718F} ; LK718)}STAXN: ;;;REFERENCE LABEL ; LK718  ;**-17 .IF DF T$$ACD. BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BNE 10$ ;;;Y - JUMP" ADD #U.TOC,R4 ;;;POINT TO U.TOC(STAXM: CALL SELLIN ;;;SELECT THE LINE- CALL MOUT ;;;GET NEXT CHARACTER TO OUTPUT5; MOVB R2,U.ADMA-U.TSTA(R5) ;;;PUT CHARACTER IN DMA BUFFER ? BIS #100000,U.ADMA-U.TSTA(R5) ;;;SET TRANSMIT DATA VA00~~{ccccLID BIT - JMP 50$ ;;;INITIATE THE OUTPUT ; LK718M ; LK718  .ENDC ;T$$ACD ;**-2*10$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2(STAX1: CALL SELLIN ;;;SELECT THE LINEG BICB #200,BFADR2+1(R3) ;;;DISABLE THE XMITTER IN CASE WE'RE X-OFF'EDD ; LK728O .IF DF T$$DMA ; LK728 ; LK728CG BIT #S5.DWA,U.TST5-U.TSTA(R5);;;CHECK FOR IO.WAL IN PROGRESS ; LK728; BNE 48$ ;;;NO ; LK728 ; LK728- .ENDC ;T$$DMA ; LK728A ; LK728 > MOV (R4),BFADR1(R3) ;;;SET VIRTUAL BUFFER ADDRESS (U.TOP+2) CLRB BFADR2(R3) ;;;= CMP (R4)+,#120000 ;;;SET CC-C IF BUFFER IS IN PRIMARY POOL ;NR; FOR 22-BIT SYSTEMS, CHECK FOR THE PRESENCE OF UMRS. THE CHECKING IS DIFFERENT!; FOR RSX-11M AND RSX-11M-PLUS.;D .IF DF M$$EXT .IF DF R$$MPL4 BIT #HF.UBM,$HFMSK ;;;UMRS EXIST? SET CC-Z IF NO .IFF ;R$$MPLB4 BIT #177777,$UMRPT ;;;UMRS EXIST? SET CC-Z IF NO .ENDC ;R$$MPL .ENDC ;M$$EXT;VR; IN I/D SYSTEMS, BUFFERS CAN BE IN EITHER TTCOM OR PRIMARY POOL, EACH REQUIRINGP; DIFFERENT RELOCATION CONSTANTS IF THERE ARE NO UMRS. FOR NON-I/D SYSTEMS WEO; ONLY NEED TO COMPUTE A PHYSICAL ADDRESS FOR BUFFERS IN THE DRIVER'S PRIVATE-"; POOL FOR SYSTEMS WITHOUT UMRS.;D .IF DF K$$DAS" BNE 30$ ;;;UMRS PRESENT - JUMP, BLO 20$ ;;;BUFFER IN PRIMARY POOL - JUMPG ADD RELCV+2,BFADR1(R3) ;;;ADD RELOCATION CONSTANT TO VIRTUAL ADDRESSCH MOVB RELCV,BFADR2(R3) ;;;(NOTE: RELCV MUST NOT HAVE BITS 6 AND 7 SET) ADCB BFADR2(R3) ;;; BR 40$ ;;;JOIN COMMON CODE=20$: ADD RELCV+6,BFADR1(R3) ;;;ADD POOL RELOCATION CONSTANT/D MOVB RELCV+4,BFADR2(R3) ;;;(RELCV MUST NOT HAVE BITS 6 AND 7 SET) ADCB BFADR2(R3) ;;; BR 40$ ;;;JOIN COMMON CODE030$: BLO 40$ ;;;BUFFER IN PRIMARY POOL - JUMP .IF DF T$$SPLE SUB #20000,BFADR1(R3) ;;;FORCE BUFFER ADDRESS TO MAP THROUGH UMR 5; .ENDC ;T$$SPL .IFF ;K$$DASC .IF DF M$$EXT" BNE 40$ ;;;UMRS PRESENT - JUMP .ENDC ;M$$EXT, BLO 40$ ;;;BUFFER IN PRIMARY POOL - JUMPG ADD RELCV+2,BFADR1(R3) ;;;ADD RELOCATION CONSTANT TO VIRTUAL ADDRESSCH MOVB RELCV,BFADR2(R3) ;;;(NOTE: RELCV MUST NOT HAVE BITS 6 AND 7 SET) ADCB BFADR2(R3) ;;; .ENDC ;K$$DAS*40$: MOV @R4,BFCNT(R3) ;;;SET BYTE COUNT4 BR 49$ ;;;DMA TRANSFER FROM INT. BUFFER ; LK720 ; LK720A .IF DF T$$DMA ; LK720 ; LK720K*48$: MOV R0,-(SP) ;;;SAVE R0 ; LK7200 MOV R4,R0 ;;;NOW R0 POINTS U.TOP+2 ; LK7207 ADD #U.TFOB-U.TOP-2,R0;;;SET R0 TO U.TFOB ; LK720L MOV (R0),R0 ;;; ; LK720A CMP (R0)+,(R0)+ ;;;SET R0 AT THE BEGINNING OF BUFFER ; LK720L: MOV (R0)+,BFCNT(R3) ;;;SET BYTE COUNT FOR DMA ; LK720; MOV (R0)+,BFADR2(R3);;;SET 6 HIGH BITS OF ADDR ; LK720E: MOV (R0),BFADR1(R3);;;SET LOW 16 BITS OF ADDR ; LK720) MOV (SP)+,R0 ;;;RESTORE R0 ; LK720  ; LK720  .ENDC ;T$$DMA ; LK720; ; LK72049$: ; LK720O9 BISB #200,BFADR2(R3) ;;;ENABLE DMA TRANSFER ; LK720T% ASSUME S2.CTS,100000 ; LK720;650$: TST 2(R5) ;;;OUTPUT STOPPED BY CTRL-S? ;**-2' BMI 70$ ;;;YES- DON'T RESUME OUTPUTB;R;;;+; YVRESX - RESUME OUTPUT.;( ; INPUT:>; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 0I;-; ;7)YVRESX::CALL SELLIN ;;;SELECT THE LINE2 .IF DF T$$ACD- BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT  BNE 60$ ;;;Y - JUMP 2 BIT #DHUID,STAT(R3) ;;;CHECK FOR DHU ; LK718, BEQ 55$ ;;;LINE IS DHV -> 55$ ; LK718= TSTB FIFOSZ(R3) ;;;IF DHU CHECK IF FIFO HAS SPACE ; LK71820 BEQ 70$ ;;;NO SPACE. TRY NEXT TIME ; LK718I MOVB U.ADMA-U.TSTA(R5),FIFODT(R3) ;;;INITIATE SINGLE CHAR XFER ; LK7182> BR 60$ ;;;INITIATE OUTPUT REGARDLESS OF XOFF STATE ; LK718K55$: MOV U.ADMA-U.TSTA(R5),TXCHAR(R3);;;INITIATE SINGLE CHAR XFER ; LK718$ ; LK718O 00~~|tt tfDATA ; LK718F ;**-1E .ENDC ;T$$ACD760$: MOVB #200,BFADR2+1(R3) ;;;ENABLE THE TRANSMITTER5 .IF NDF D$$VMD5 YVMTIM:: .ENDC ;D$$VMD 70$: RETURNH;A  .DSABL LSB;7;;;+; YVABOX - ABORT OUTPUT. ;M ; INPUT:> ; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ;  ;-;E;U YVABOX:: .IF DF T$$ACD. BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BEQ 10$ ;;;N - RETURN .ENDC ;T$$ACD ; LK717L BIT #S5.HPO,U.TST5-U.TSTA(R5);;;HIGH PRIORITY OUTPUT IN PROGRESS? ; LK7172 BNE 10$ ;;;YES - DO NOT ABORT OUTPUT ; LK717 ; LK717C7 BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT IN PROGRESS? BNE 10$ ;;;N - JUMPA" CALL SELLIN ;;;SELECT THE LINE6 BIS #1,LNCTRL(R3) ;;;ABORT THE CURRENT DMA TRANSFER? CMP (SP)+,#LOCKR ;;;REMOVE RETURN ADDRESS - WAS IT TO LOCKR? BNE 10$ ;;;N - JUMPO MTPS #0 ;;;ALLOW INTERRUPTS 4 TST (SP)+ ;REMOVE RETURN ADDRESS TO FORK ROUTINE6 10$: RETURN ;RETURN WITHOUT SIGNALLING OUTPUT DONE!; ";O#;+$; YVSTOX - STOP OUTPUT.S%; &; INPUT:>'; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. (; S2.CTS 1T);-*;S+;),YVSTOX::CALL SELLIN ;;;SELECT THE LINES=- BICB #200,BFADR2+1(R3) ;;;CLEAR THE TRANSMITTER ENABLE BITR. RETURN ;;;P/;O0;;12 .IF DF T$$GMC!T$$SMC!D$$VMD34;+%5; YVLPAR - GET/SET LINE PARAMETERS.A6;I 7; INPUT:8; R0 BIT 15: 0 = SET SPEED9; 1 = GET SPEEDE69; BIT 13: 1 = SET 7-BIT CHARACTER LENGTH ; LK710?9; BIT 12: 1 = CHECK IF 7-BIT CHARACTER IS SUPPORTED ; LK710=:; BIT 11: 1 = SET SPEED SELECTED BY AUTO-BAUD DETECT LOGIC+;; BIT 10: 1 = SET DEVICE DEPENDENT SPEEDA#<; (USED FOR SETTING PARITY)C$=; BIT 9: 1 = GET/SET ANSWER SPEED%>; BIT 8: 0 = GET/SET RECEIVE SPEED ?; 1 = GET/SET TRANSMIT SPEED@; IF SET SPEED:1A; BITS 0-7: NEW SPEED PARAMETER (S.XXX SYMBOL) B;:(C; R1 Flow control status change flags.D;P*E; BIT 0: 1 = Enable input flow control.+F; BIT 1: 1 = Disable input flow control.-+G; BIT 2: 1 = Enable output flow control.T,H; BIT 3: 1 = Disable output flow control.I;IJ; BITS 4-15: ReservedK; >L; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.M; N; OUTPUT:WO; IF GET SPEED REQUESTED:/'P; R4 POINTER TO DHU/DHV11 SPEED TABLEN Q; CC-C 0R;IS; IF SET SPEED REQUESTED:NT; CC-C 0 IF OK!U; 1 IF ILLEGAL SPEED SPECIFIED V;oLW; NOTE THAT THIS ROUTINE CAN BE EXECUTED AT BOTH SYSTEM STATE (IN RESPONSEPX; TO A SF.GMC OR SF.SMC QIO) AND FROM THE INPUT INTERRUPT SERVICE ROUTINE (FORY; AUTO-BAUD DETECT).Z; [;-\; ];o^; _YVLPAR::+` TST R1 ;Called for flow control change?Ta BEQ 5$ ;If EQ no - go on. "b RETURN ;Not processed for DZ.c5$:E&c .IF DF T$$GMC ! T$$SMC ; LK710c ; LK710 ;c BIT #20000,R0 ;CHECK IF WE VALIDATE 7-BIT CHAR. ; LK710c BEQ 7$ ;NO ; LK710Fc RETURN ; LK710Hc7$: ; LK710,c BIT #10000,R0 ;CHECK SET 7-BIT ; LK710+c BEQ 8$ ;NO. SET SPEED-PARITY ; LK710E;c BR SETLN1 ;SET 7-BIT AND OTHER LINE PARAMETERS ; LK710-c8$: ; LK710c ; LK710a&c .ENDC ;T$$GMC ! T$$SMC ; LK710de .IF DF D$$VMDf0g BIT #4000,R0 ;SET SPEED FOR AUTO-BAUD DETECT?h BEQ 20$ ;N - JUMP;(i BIT #2000,R0 ;DEVICE DEPENDENT SPEED?j BNE 10$ ;Y - JUMPA#k BIC #177400,R0 ;CLEAR UPPER BYTE;7l MOVB SPDHV-1(R0),R0 ;GET DEVICE DEPENDENT SPEED BITS /m10$: BIC #^C<17>,R0 ;CLEAR ALL BUT SPEED BITS;n MOV R0,R2 ;GET A COPY op .IF DF R$$EISq:r ASH #4,R2 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITIONst .IFF ;R$$EIS7u<v CALL SHIFT4 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITIONwx .ENDC ;R$$EISy(z BIS R0,R2 ;ADD IN RECEIVE SPEED BITS6{ MOVB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED IN DATABASE/| BR SETLN1 ; AND SET NEW SPEED IN CONTROLLER#}20$: ;REFERENCE LABEL~ .ENDC ;D$$VMD .IF DF T$$GMC&T$$00~~{ccccSMCD# MOV R0,R4 ;SAVE INPUT PARAMETERB( SWAB R4 ;PUT FLAGS IN LOW ORDER BYTE BPL 30$ ;SET SPEED - JUMPA .ENDC .IF DF T$$GMC0 MOV #SPDHV,R4 ;POINT TO DHU/DHV11 SPEED TABLE! RETURN ;RETURN WITH CC-C = 0I .ENDC ;T$$GMC .IF DF T$$SMC!D$$VMDR .IF NDF T$$GMCP# MOV R0,R4 ;SAVE INPUT PARAMETERT* SWAB R4 ;PUT FLAGS IN LOWER ORDER BYTE .ENDC ;NDF T$$GMC)30$: BIC #177400,R0 ;CLEAR R0 HIGH BYTE$& MOVB SPDHV-1(R0),R2 ;GET SPEED BITS SEC ;ASSUME ERROR) BMI 40$ ;NOT A SUPPORTED SPEED - JUMP  ASRB R4 ;SET ANSWER SPEED? BEQ 50$ ;N - JUMPC .IF DF D$$VMD/ BICB #17,U.CW3+1-U.TSTA(R5) ;CLEAR OLD VALUEE3 BISB R2,U.CW3+1-U.TSTA(R5) ;SET NEW ANSWER SPEED$ CLC ;SHOW SUCCESS .IFF ;D$$VMDF7 SEC ;ATTEMPT TO SET ANSWER SPEED W/O MODEM SUPPORTA .ENDC ;D$$VMD 40$: RETURN;N&50$: BCS 60$ ;TRANSMIT SPEED - JUMP5 BICB #17,U.CW3-U.TSTA(R5) ;CLEAR OLD RECEIVE SPEEDE! BR 70$ ;JUMP TO SET NEW SPEEDB;60$: BICB #360,U.CW3-U.TSTA(R5) ;CLEAR OLD TRANSMIT SPEEDE .IF DF R$$EIS2 ASH #4,R2 ;SHIFT SPEED BITS TO PROPER POSITION .IFF ;R$$EISL4 CALL SHIFT4 ;SHIFT SPEED BITS TO PROPER POSITION .ENDC ;R$$EIS.70$: BISB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED# CALL LOCKI ;LOCK OUT INTERRUPTSA5 MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW LINE PARAMETERS:% BR SETLIN ;;;GO AND LOAD INTO LPRC .ENDC ;DF T$$SMC!D$$VMD .ENDC ;T$$GMC!T$$SMC!D$$VMD; ;+; YVPWUP - POWER-UP.;T ; INPUT:>; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0R ; US.DSB 0C;-; ;T  .ENABL LSBP .IF DF R$$CON:YVCONL::BIT #HF.UBM,$HFMSK ;UMRS PRESENT ON THIS SYSTEM? BEQ YVCPUP ;N - JUMP, MOV #UMR5S,R0 ;GET ADDRESS OF SAVED UMR 5& MOV #UBMPR+<5*4>,R1 ;POINT AT UMR 5  MOV (R0)+,(R1)+ ;SET UP UMR 5 MOV (R0)+,(R1)+ ; .IF NDF T$$SPLT  MOV (R0)+,(R1)+ ;SET UP UMR 6 MOV (R0)+,(R1)+ ; .ENDC ;NDF T$$SPL YVCPUP:: .IFF ;R$$CONN%YVPWUP::TST R2 ;IS THIS LINE ZERO?: BNE 30$ ;N - JUMPU .IFTF ;R$$CON! MOV #40,@R3 ;SET MASTER RESETC010$: BIT #40,@R3 ;IS RESET FUNCTION COMPLETE?  BNE 10$ ;N - LOOP UNTIL DONE .IFT ;R$$CON54 BIT #20000,@R3 ;DID INTERNAL DIAGNOSTICS SUCCEED? BEQ 20$ ;Y - JUMP(? MOVB #IE.FHE,$SCERR ;INDICATE FATAL HARDWARE ERROR ON DEVICE$  RETURN .IFTF ;R$$CON(20$: MOV #40100,@R3 ;ENABLE INTERRUPTS .IFT ;R$$CONP  RETURNF YVUONL:: YVUPUP:: .ENDC ;R$$CON'30$: CALL LOCKI ;LOCK OUT INTERRUPTSF" CALL SELLIN ;;;SELECT THE LINE5 BIS #4,LNCTRL(R3) ;;;ENABLE RECEIVER FOR THIS LINEM ; LK710LK BISB #US.OIU,U.STS-U.TSTA(R5) ;;;SET OUTPUT INTERRUPT UNEXPECTED ; LK710G ; LK720B .IF DF T$$DMA ; LK720H ; LK720T2 BIT #HF.QB,$HFMSK ;;;CHECK FOR Q-BUS ; LK720 BEQ 33$ ;;;NO ; LK720J BIS #S5.DMA,U.TST5-U.TSTA(R5) ;;;SET BIT TELLING DHV/DHU IS DMA ; LK720'33$: ;;;REFERENCE LABEL ; LK7200 ; LK720O .ENDC ;T$$DMA ; LK720; ; LK720B .IF DF D$$VMD 8  BIC #S5.ABP,U.TST5-U.TSTA(R5) ;;;RESET AUTO-BAUD MODE/  BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;REMOTE LINE?R  BEQ 40$ ;;;N - JUMP@  BISB #US.CRW,U.STS-U.TSTA(R5) ;;;SET WAITING FOR CARRIER FLAG2 MOV R3,-(SP) ;;;SAVE POSSIBLY MODIFIED REGISTER# CALL YVMTMA ;;;SET MODEM STATUSL! MOV (SP)+,R3 ;RESTORE REGISTERR) CALL LOCKI ;LOCK OUT INTERRUPTS AGAIN0 .ENDCSETLN1: ; REFERENCE LABEL?40$: MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW SPEED AND PARITY BITSK)SETLIN: CALL SELLIN ;;;SELECT THE LINEU* SWAB R2 ;;;PUT SPEED BITS IN HIGH BYTE7 RORB R2 ;;;PUT PARITY ENABLE BIT IN PROPER POSITION$1 BICB #^C<40>,R2 ;;;CLEAR ALL BUT PARITY ENABLE;& TST U.CW3-U.TSTA(R5) ;;;ODD PARITY? BMI 60$ ;;;Y00~~|tt tfDATA - JUMPD) BIS #100,R2 ;;;N - SET TO EVEN PARITYM<60$: BIT #140000,R2 ;;;TRANSMIT SPEED 134.5 BAUD OR LOWER? BNE 70$ ;;;N - JUMP0(  BIS #200,R2 ;;;Y - SET TWO STOP BITS.!70$: BIS #30,R2 ;;;SET EIGHT BIT CHARACTERSB! BIT #S5.CLN,U.TST5-U.TSTA(R5) ;;;CHECK 7-BIT CHARACTER ; LK710+! BEQ 75$ ;;;NO LEAVE IT 8-BIT ; LK710E'! BIC #10,R2 ;;;SET 7-BIT ; LK710 ;!75$: MOV R2,LPR(R3) ;;;LOAD NEW LINE PARAMETERS ; LK710E! ; LK710U!; ; LK710#; ;**-19$; WHEN RETURNING VIA COROUTINE "LOCKI", CC-C IS CLEARED:%;#& RETURN ;RETURN ' ( .DSABL LSB )* .IF DF R$$CON+ ,YVCOFF::#- CALL LOCKI ;LOCK OUT INTERRUPTS#. MOV #40,@R3 ;;;SET MASTER RESETH / RETURN 0YVUOFF::#1 CALL LOCKI ;LOCK OUT INTERRUPTSR"2 CALL SELLIN ;;;SELECT THE LINEB3 BIC #11004,LNCTRL(R3) ;;;DROP DTR, RTS AND DISABLE THE RECEIVER4 RETURN ;;;DROP PRIORITY56 .ENDC ;R$$CON78;9; :;+$;; INPUT INTERRUPT SERVICE ROUTINE.<;-=;1>; 3? DS.CHG = 70000 ;DATASET STATUS CHANGE CONDITION:@ A .ENABL LSB B;RCD .IF DF R$$MPLE/F$YVINP::TTSET$ YV ;;;SAVE R2, R3 AND SET UP: G ;;; R3 = CSR ADDRESSH ;;; R4 = KRB ADDRESSIJ .IFF ;R$$MPLVK-L$DVINP::TTSET$ DV ;;;SAVE R2,R3 AND SET UPLM ;;; R3 = CSR"N ;;; R4 = ADDRESS OF UCB LISTOP .IFTF ;R$$MPLQ6R10$: MOV RBUF(R3),R5 ;;;GET NEXT CHARACTER FROM SILO#S BPL 70$ ;;;SILO IS EMPTY - JUMP !T MOV R5,-(SP) ;;;SAVE CHARACTER*U SWAB R5 ;;;GET LINE NUMBER IN LOW BYTE V CALL MUXUCB ;;;GET UCB IN R5)W MOV (SP)+,R2 ;;;RETRIEVE CHAR + STATUS*X BCS 10$ ;;;BAD LINE - IGNORE CHARACTER2Y MOV R2,-(SP) ;;;CHECK FOR DATASET STATUS CHANGE2Z BIC #^C,@SP ;;;CLEAR ALL BUT ERROR BITS.[ CMP #DS.CHG,(SP)+ ;;;DATASET STATUS CHANGE?\ BEQ 20$ ;;;Y - JUMPS]^ .IFF ;R$$MPL._#` MOV R3,-(SP) ;;;SAVE CSR ADDRESS;ab .IFTF ;R$$MPLc'd MOV R4,-(SP) ;;;SAVE KRB/UCB ADDRESS 7e CALL ICHAR1 ;;;DO COMMON INPUT INTERRUPT PROCESSINGL*f MOV (SP)+,R4 ;;;RESTORE KRB/UCB ADDRESSgh .IFF ;R$$MPL(ij MOV (SP)+,R3 ;;;RESTORE CSRkl .IFT ;R$$MPLNm%n MOV @R4,R3 ;;;RESTORE CSR ADDRESSEop .ENDC ;R$$MPLq8r BR 10$ ;;;TRY TO GET ANOTHER CHARACTER FROM THE SILOs;#St; WE ARE HERE BECAUSE FRAMING ERROR, DATA OVERRUN AND PARITY ERROR BITS WERE SET,.Pu; WHICH MEANS THAT EITHER A DATASET STATUS CHANGE HAS OCCURRED OR A DIAGNOSTICv; MESSAGE HAS BEEN RECEIVEDw; (x20$: BIT #1,R2 ;;;DIAGNOSTIC MESSAGE?y BNE 10$ ;;;Y - IGNORERz{ .IF DF D$$VMD|};.~; PROCESS MODEM STATUS CHANGE ;S MOV R4,-(SP) ;;;SAVE R4< MOV #100000,R4 ;;;SHOW THAT INTERFACE SUPPORTS DSR SIGNAL' BIT #10,R2 ;;;IS CLEAR TO SEND SET?H BEQ 30$ ;;;N - JUMPO* BIS #100,R4 ;;;Y - SET APPROPRIATE BIT,30$: BIT #20,R2 ;;;IS CARRIER DETECT SET? BEQ 40$ ;;;N - JUMPE) BIS #40,R4 ;;;Y - SET APPROPRIATE BITO"40$: BIT #40,R2 ;;;IS RING SET? BEQ 50$ ;;;N - JUMPB* BIS #200,R4 ;;;Y - SET APPROPRIATE BIT50$: TSTB R2 ;;;IS DSR SET  BPL 53$ ;;;N - JUMPC+ BIS #40000,R4 ;;;Y - SET APPROPRIATE BITP-53$: CALL SELLIN ;;;SETUP THE CORRECT LINET7 CALL MODISR ;;;DO COMMON MODEM INTERRUPT PROCESSING . BVC 57$ ;;;NO SPECIAL ACTION NEEDED - JUMP BCS 55$ ;;;DROP DTR - JUMP- BIS #11000,LNCTRL(R3) ;;;RAISE DTR AND RTS- BR 65$ ;;;AND TRY TO SERVICE ANOTHER LINE 055$: BIC #11000,LNCTRL(R3) ;;;DROP DTR AND RTS*57$: BCS 65$ ;;;NO CALL ANSWERED - JUMP1 MOVB U.CW3+1-U.TSTA(R5),R2 ;;;GET ANSWER SPEED;/ BICB #^C<17>,R2 ;;;CLEAR ALL BUT SPEED FIELD0@ MOVB R2,U.CW3-U.TSTA(R5) ;;;SET NEW RECEIVE SPEED IN DATABASE .IF DF R$$EIS2 ASH #4,R2 ;;;SET TRANSMIT SPEED = ANSWER SPEED .IFF ;R$$EISA4 CALL SHIFT4 ;;;SET TRANSMIT SPEED = ANSWER SPEED .ENDC ;R$$EISA BISB R2,U.CW3-U.TSTA(R5) ;;;SET NEW TRANSMIT SPEED IN DATABASE; MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW SPEED AND PARITY BITS6 ASSUME S4.ABD,100000 0 TST 6(R5) 00~{cccc;;;AUTO-BAUD SPEED DETECT ENABLED? BPL 60$ ;;;N - JUMP2, MOV #273,R2 ;;;Y - SET LINE TO 4800 BAUD*60$: CALL SETLIN ;;;SET LINE PARAMETERS!65$: MOV (SP)+,R4 ;;;RESTORE R4 .ENDC ;D$$VMD8 BR 10$ ;;;TRY TO GET A CHARACTER FROM THE INPUT SILO;4>; SILO IS NOW EMPTY. SEE IF CONTROLLER IS READY TO TRANSMIT;B%70$: MOV @R3,R5 ;;;XMIT READY SET?S$ BMI 75$ ;;;Y - GO DO OUTPUT WORK RETURN ;;;RETURN ; ;A;+%; OUTPUT INTERRUPT SERVICE ROUTINE.6;-;T;D .IF DF R$$MPL/$YVOUT::TTSET$ YV ;;;SAVE R2, R3 AND SET UP:T ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS .IFF ;R$$MPLP-$DVOUT::TTSET$ DV ;;;SAVE R2,R3 AND SET UPB ;;; R3 = CSR" ;;; R4 = ADDRESS OF UCB LIST .ENDC ;R$$MPL9 MOV @R3,R5 ;;;GET INTERRUPTING LINE NUMBER AND STATUS@, BPL 10$ ;;;CHECK THAT THERE IS AN ACTION+75$: MOV R4,-(SP) ;;;SAVE KRB/UCB ADDRESS?80$: MOV R5,-(SP) ;;;SAVE INTERRUPTING LINE NUMBER AND STATUST* SWAB R5 ;;;GET LINE NUMBER IN LOW BYTE  CALL MUXUCB ;;;GET UCB IN R5+ MOV (SP)+,R2 ;;;RETRIEVE TRANSMIT STATUS4! BCS 130$ ;;;BAD LINE - IGNOREP .IF DF R$$CON, BITB #US.OFL,U.ST2-U.TSTA(R5) ;;;OFFLINE? BNE 130$ ;;;Y - JUMP .ENDC ;R$$CON .IF DF T$$SPL- MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAP UCBX@0 MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLS& MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX .ENDC ;T$$SPL ; DD721S; ; DD721N; WE'RE HERE BECAUSE AN OUTPUT REQUEST HAS COMPLETED OR WAS ABORTED ; DD721; ; DD721< CALL SELLIN ;;;SELECT THE LINE THAT INTERRUPTED ; DD721; ; DD721R; TO MAKE LATER ERROR CHECKING EASIER, MERGE THE DMA ABORT BIT (BIT 0 OF ; DD721D; THE LNCTRL CSR) WITH THE DMA ERROR BIT (ALREADY IN R2) ; DD721; ; DD7216 ASL R2 ;;;SHIFT A ZERO INTO THE LOW-ORDER ; DD721> BISB LNCTRL(R3),R2 ;;;COMBINE ERROR BITS TOGETHER ; DD721B BIC #1,LNCTRL(R3) ;;;RESET ABORT BIT FOR NEXT TRANSFER ; DD721; ; DD721X; CHECK IF XOFF/XON SHOULD BE OUTPUT NOW (POSSIBLY BETWEEN QIO OUTPUT BUFFERS) ; DD721; ; DD721? BIC #100000,R2 ;;;ASSUME DON'T NEED XOFF/XON OUTPUT ; DD721EN BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;ANY HIGH PRIORITY REQUEST PENDING? ; DD721# BEQ 85$ ;;;N - JUMP ; DD721;6 CALL STAXH ;;;START HIGH PRIORITY OUTPUT ; DD7218 BIS #100000,R2 ;;;REMEMBER THAT WE DID THIS ; DD721; ; DD7219; PROCESS ANY ERRORS FROM PREVIOUS TRANSFER ; DD721; ; DD721285$: MOV R3,-(SP) ;;;SAVE CSR ADDRESS ; DD7216 ASR R2 ;;;DID WE ABORT PREVIOUS TRANSFER? ; LK720$ BCS 110$ ;;;Y - JUMP ; DD721G BIT #10000,R2 ;;;DID THE CONTROLLER ABORT PREVIOUS TRANSFER? ; DD721I# BEQ 90$ ;;;N - JUMP ; DD721A MOVB #1,U.TOTI(R4) ;;;SET TIMER TO EXPIRE IN 1 SECOND ; DD721P: BR 120$ ;;;WAIT UNTIL THEN TO COMPLETE OUTPUT ; DD721; ; DD721+; DETERMINE WHAT TO DO NEXT ; DD721S; ; DD721=90$: TST R2 ;;;DID WE JUST START XOFF/XON OUTPUT? ; DD721V8 BMI 120$ ;;;Y - DON'T START ANY MORE OUTPUT ; DD721L BITB #US.OIU,U.STS-U.TSTA(R5) ;;;ANY QIO (OR ACD) OUTPUT PENDING? ; DD721$ BNE 120$ ;;;N - JUMP ; DD721; ; DD721U; WE HAVE NO OUTPUT IN PROGRESS BUT HAVE QIO OUTPUT TO DO. DETERMINE IF WE ; DD721EY; SHOULD START IT FROM THE BEGINNING (S5.HPO SET) OR CONTINUE IT (S5.HPO CLEAR) ; DD721D; ; DD721F BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;JUST STARTING QIO OUTPUT? ; DD721# BEQ 95$ ;;;N - JUMP ; DD721D? CALL STAXN ;;;BEGIN QIO OUTPUT DELAYED BY XOFF/XON ; DD721; BR 120$ ;;;CLEAR S5.HPO AND GO ON TO NEXT LINE ; DD721D; ; DD721P; POSSIBLY CONTINUE (IF MORE BUFFERS OR CHARACTERS) QIO OR ACD OUTPUT ; DD721; ; DD721'95$: ;;;REFERENCE LABEL ; DD721H ;**-24 .IF DF T$$ACD. BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? B00 |tt tfDATANE 100$ ;;;Y - JUMP" ADD #U.TOC,R4 ;;;POINT TO U.TOC' DEC @R4 ;;;ANYTHING LEFT TO OUTPUT?; BEQ 110$ ;;;N - JUMP+ CALL STAXM ;;;INITIATE ANOTHER TRANSFERO6 BR 120$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED   .ENDC ;T$$ACD + 100$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2   ; LK728C  .IF DF T$$DMA ; LK728  ; LK7281C  BIT #S5.DWA,U.TST5-U.TSTA(R5);;;CHECK IO.WAL COMPLETION ; LK728F!  BNE 110$ ;;;YES ; LK728)  ; LK728T  .ENDC ;T$$DMA ; LK728  ; LK728NE 104$: CALL NXTOB ;;;GET NEXT OUTPUT BUFFER IF THERE IS ONE ; LK728   ; LK728 $  BEQ 110$ ;;;N - JUMP ; LK728; ;**-27; WE GOT ANOTHER OUTPUT BUFFER - START OUTPUTTING IT.; ! TST -(R4) ;;;POINT TO U.TOP+2 " MOV (SP)+,R3 ;;;GET CSR ADDRESS CALL STAX1 ;;;START OUTPUT; BR 122$ ;;;CLEAR S5.HPO AND GO ON TO NEXT LINE ; LK720P110$: ; LK720K BIC #S5.DWA,U.TST5-U.TSTA(R5);;;CLEAR DMA IO.WAL IN PROGRESS BIT ; LK720K5 CALL ODONE ;;;DO OUTPUT DONE PROCESSING ; LK720N6120$: MOV (SP)+,R3 ;;;RESTORE CSR POINTER ; LK720O122$: BIC #S5.HPO,U.TST5-U.TSTA(R5) ;;;NO XOFF/XON OUTPUT IN PROGRESS ; LK720O; ; LK720; ;**-5,; SEE IF ANY OTHER LINE COMPLETED TRANSMIT;(/130$: MOV (SP),R4 ;;;RESTORE KRB/UCB ADDRESSR! MOV @R3,R5 ;;;XMIT READY SET?P' BMI 80$ ;;;Y - DO IT ALL OVER AGAIN$  TST (SP)+ ;;;CLEAN STACK/! JMP 10$ ;;;SEE IF ANY MORE INPUT WORK TO DOR";I # .DSABL LSBC$;D%;;&;O'( .IF NDF R$$EIS )*;J+; SUBROUTINE TO SHIFT R2 4 BIT POSITIONS TO THE LEFT FOR NON-EIS SYSTEMS,;5-SHIFT4: ASL R2 ;SHIFT ONCEU. ASL R2 ;TWICE2/ ASL R2 ;THRICE0 ASL R2 ;LAST TIME5 1 RETURNF23 .ENDC ;NDF R$$EIS45;*6; SUBROUTINE TO SELECT LINE ON DHU/DHV117;R8;;9SELLIN: MOV #40100,-(SP) ;;;INCLUDE INTERRUPT ENABLE BITSA7: BISB U.UNIT-U.TSTA(R5),(SP) ;;;GET THE LINE NUMBER #; MOV (SP)+,@R3 ;;;SELECT THE LINE< RETURN ;;;S=> .IF DF D$$VMD?@;FA;RB;+C; YVMTIM - MODEM TIME-OUT D;-E;BF;SG H .ENABL LSBFI*JYVMTIM::CALL LOCKI ;LOCK OUT INTERRUPTS"K CALL SELLIN ;;;SELECT THE LINE2L BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;IS LINE REMOTE?M BNE 10$ ;;;Y - JUMP0N BIC #400,LNCTRL(R3) ;;;SET LINK TYPE TO LOCAL#O BR 20$ ;;;PROCESS MODEM TIMEOUTSBPYVMTMA: CALL LOCKI ;LOCK OUT INTERRUPTS (LINE ALREADY SELECTED)5Q10$: BIS #400,LNCTRL(R3) ;;;SET LINK TYPE TO REMOTET:R20$: CALL HLMTIM ;;;DO COMMON MODEM TIME-OUT PROCESSING1S BEQ 30$ ;;;IF EQ Z-BIT SET - DROP DTR AND RTSB.T BIS #11000,LNCTRL(R3) ;;;ASSERT DTR AND RTSU RETURN ;;;N0V30$: BIC #11000,LNCTRL(R3) ;;;DROP DTR AND RTSW RETURN ;;;UX Y .DSABL LSBEZ[ .ENDC ;D$$VMD\] .ENDC ;D$$V11^_` .END;SET LINK TYPE TO LOCAL#O BR 20$ ;;;PROCESS MODEM TIMEOUTSBPYVMTMA: CALL LOCKI ;LOCK OUT INTERRUPTS (LINE ALREADY SELECTED)5Q10$: BIS #400,LNCTRL(R3) ;;;SET LINK TYPE TO REMOTET:.NLIST .IDENT /06.01/D); TTMAC - ASSEMBLY PREFIX FILE FOR TTDRV.E7; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.T;T; 13-FEB-78 PETER WANNHEDENB;#; PREVIOUSLY MODIFIED BY:E;O; P. WANNHEDEN ; C. F. SPITZP; D. R. DONCHIN ; S. ADAMS ; B. MCCARTHYV ; R. PHILPOTT ;G%; MODIFIED FOR RSX-11M-PLUS V4.0 BY:C;A;E; L. KOGAN 20-FEB-87:; LK720 -- SUPPORT DIRECT TRANSFER FOR "PURE" IO.WAL ONLY;U;H;M;S; S. C. ADAMS 2-APR-87;; SA470 - - THIS SPACE IS INTENTIONALLY LEFT BLANK TO MAKEN+; LINES MATCH UP TO LINES IN M-PLUS TTMACR"; FOR EASE OF FUTURE MAINTENANCE;T;E;P .MCALL UCBDF$, TTSYM$;3$ UCBDF$ ,,TTDEF ;DEFINE UCB OFFSETS TTSYM$ ;DEFINE TC.XXX SYMBOLS;N; ; ASSEMBLY PARAMETERSO;I3T$$BFL= 76 ;TYPEAHEAD BUFFER LENGTH - ALSO LENGTH  ;OF THE UCB EXTENSIONV5M$$ANS= 30. ;SECONDS TO WAIT FOR CARRIER AFTER RINGP7M$$CAR= 2 ;SECONDS TO WAIT FOR LOST CARRIER TO RETURNS4M$$DIS= 2 ;SECONDS TO WAIT FOR DISCONNECT TO OCCUR .IF DF R$$P00~{ccccRO+; USE PRIORITY 7 ON THE PRO SERIES HARDWAREM,; ALL DEVICES INTERRUPT AT THE SAME PRIORITYTTPRI= 340 ;PRIORITY 7 .IFF ;R$$PROUTTPRI= 240 ;PRIORITY 5 .ENDC ;R$$PRO1M$$CRI= M$$CRB-4 ;NUMBER OF BYTES OF INFORMATIONO ;IN CLI COMMAND BUFFER!T$$CTX= 0 ;^X FLUSHES TYPEAHEAD .OPTIME= 15. ;DEFAULT OUTPUT TIMEOUT INTERVAL;A/.IIF DF T$$BTW,T$$CTR=0 ;T$$BTW FORCES T$$CTRTO.IIF DF P$$GEN!T$$OVL,D$$Z11=0 ;DZ11 SUPPORT FOR PREGENNED OR RSX11MPL SYSTEMSO4.IIF DF P$$GEN,D$$LMD=0 ;INCLUDE DL11 MODEM SUPPORT4.IIF DF P$$GEN,D$$ZMD=0 ;INCLUDE DZ11 MODEM SUPPORT:.IIF DF P$$GEN!T$$OVL,D$$V11=0 ;INCLUDE DHU/DHV11 SUPPORT9.IIF DF P$$GEN,D$$VMD=0 ;INCLUDE DHU/DHV11 MODEM SUPPORTB;.IIF DF D$$M11!D$$ZMD!D$$LMD!D$$VMD,T$$MOD=0 ;MODEM SUPPORTFA.IIF DF D$$H11!D$$J11!D$$Z11!D$$V11,T$$MUX=0 ;MULTIPLEXER SUPPORTU3.IIF DF R$$MPL,R$$EIS=0 ;RSX-11M-PLUS EIS SUPPORT$..IIF DF M$$EIS,R$$EIS=0 ;RSX-11M EIS SUPPORTF.IIF DF P$$OOL&T$$COM,T$$SPL=0 ;USE SECONDARY POOL FOR UCBX AND TABUFG.IIF DF R$$MPL&P$$OOL,T$$SPC=0 ;USE SECONDARY POOL CLI COMMAND BUFFERS1N.IIF NDF R$$PRO,.IIF DF R$$MPL,T$$SER=0 ;SERIAL COMMAND PROCESSING (CLI TABUF)I.IIF DF A$$CLI, .IIF DF M$$CLI, .ERROR ;ILLEGAL COMBINATION OF PARAMETERSM5XLOPNT= 10. ;SEND XON WHEN 10 CHARS. LEFT IN TABUF1J.IIF NDF T$$SPL,XHIPNT=T$$BFL-4-10. ;SEND XOFF 10 CHARS. BEFORE TABUF FULL6.IIF DF T$$SPL,XHIPNT=10. ;SAME FOR I/D-SPACE SYSTEMS5.IIF DF T$$SPL,T$$DMA=0 ;IO.WAL FROM A TASK BUFFER  ;FOR I/D-SPACE SYSTEMSA+.IIF DF T$$LTH,T$$MOD=0 ;IF LAT THEN MODEME .IF DF T$$OVLH.IIF NDF T$$SPL,T$$ONI=0 ;DEFINE THIS SYMBOL FOR OVERLAID/NON-I/D DRIVER .ENDC ;T$$OVL0 .IF DF T$$TSA ;IF SYSGEN HAS DEFINED T$$TSA...*T$$OOB=0 ;OUT-OF-BAND CHARACTER HANDLING)T$$ICS=0 ;INPUT COUNT STATE RECOGNITIONI)T$$SCA=0 ;SWITCH CHARACTER RECOGNITION F! ;AND TERMINAL MANAGEMENT MODED*T$$MHU=0 ;MODEM HANG-UP NOTIFICATION AST?; GENERATE ERRORS IF ALL SUPPORT NEEDED FOR TSA IS NOT INCLUDED;2.IIF NDF R$$IIC, .ERROR ;INTERNAL I/O COMPLETION$.IIF NDF A$$TRP, .ERROR ;AST SUPPORT5.IIF NDF T$$SMC, .ERROR ;SET MULTIPLE CHARACTERISTICSO5.IIF NDF T$$GMC, .ERROR ;GET MULTIPLE CHARACTERISTICSY%.IIF NDF T$$EIO, .ERROR ;EXTENDED I/O  .ENDC ;T$$TSAE; GENERATE ERRORS IF FUNCTIONALITY REQUIRING AST SUPPORT IS REQUESTEDW&; BUT AST SUPPORT IS NOT IN THE SYSTEM .IF NDF A$$TRPM. .IIF DF T$$CCA, .ERROR ;UNSOLICITED INPUT AST1 .IIF DF T$$SCA, .ERROR ;SWITCH CHARACTER SUPPORTS- .IIF DF T$$MHU, .ERROR ;MODEM HANG-UP NOTIFYT .ENDC ;A$$TRPL; GENERATE ERRORS IF FUNCTIONALITY REQUIRING INTERNAL I/O COMPLETION SUPPORT); IS REQUESTED BUT R$$IIC IS NOT DEFINED.G .IF NDF R$$IICE1 .IIF DF T$$ICS, .ERROR ;INPUT COUNT STATE CHANGE., .IIF DF T$$OOB, .ERROR ;OUT-OF-BAND SUPPORT .ENDC ;R$$IIC O .MACRO FRKBIT INS,VAL .IF DF M$$PRO* CACHE$ SAVE ;NOW WANT NON-CACHED VALUES .IFTF ; DF M$$PRO+ 'INS' 'VAL',U.TFRQ-U.TSTA(R5) ;DO WHATEVERC .IFT ; DF M$$PRO) CACHE$ UNSAVE ;SET CACHE BACK AS IT WAST .ENDC ; DF M$$PRO .ENDM FRKBIT ;N;O .MACRO TTSET$ TYPER JSR R2,TTSETI S O .IF DF R$$MPL B R .WORD 'TYPE'CTBPD  .IFFN R .WORD 'TYPE'UCB $ .ENDC .ENDM TTSET$A;C G .IF NDF R$$MPLO .;O#; DEFINE CONTROLLER TYPES (RSX-11M)I;TTTDL=0ATTTDZ=2TTTTDH=4TTTDJ=6 TTTDM=10 ;DM11-BBATTTDV=14 T;N C .ENDC ;NDF R$$MPL D;$;O-; DEFINE CHARACTERS WITH SPECIAL SIGNIFICANCEC; CH.BSL= 134$'CH.AES=37 ;ALTERNATE ESCAPE CHARACTERS#CH.RBR=175 ;RIGHT BRACE (ALTMODE)NCH.TLD=176 ;TILDE (ALTMODE)TCH.LCA=141 ;LOWERCASE ACH.LCZ=172 ;LOWERCASE Z CH.BSP= 10 CH.CR= 15 CH.CTC= 3 CH.CTO= 17 CH.CTQ= 21 CH.CTR= 22 CH.CTS= 23 CH.CTU= 25 CH.CTX= 30 CH.CTZ= 32 CH.DOL= '$ CH.ESC= 33 CH.FF= 141 CH.HT= 11T CH.LF= 12D CH.NUL= 0= CH.ONE= '1 CH.PLU= '+ CH.RUB= 177D CH.SP= 40N CH.VT= 13C CH.ZER= '0;D;$A; DEFINE LEGAL READ/WRITE MODIFIER COMBINATIONS BASED ON SELECTED3; TERMINAL DRIVER SUPPORT:;P0; TF.LGW :== LEG00|tt tfDATAAL WRITE-LOGICAL-BLOCK MODIFIERS/; TF.LGR :== LEGAL READ-LOGICAL-BLOCK MODIFIERSO8; TF.LER :== LEGAL EXTENDED-READ-LOGICAL-BLOCK MODIFIERS;TF.LGW = TF.WAL!TF.CCO!TF.WIRQ' .IIF DF T$$BTW, TF.LGW = TF.LGW!TF.WBTH' .IIF DF T$$CUP, TF.LGW = TF.LGW!TF.RCU +TF.LGR = TF.RST!TF.RAL!TF.RNE!TF.XOF!TF.TMO 9TF.LER = TF.LGR!TF.RLU!TF.RTT!TF.RPT!TF.RNF!TF.TNE!TF.RDI=. .IIF DF T$$RPR, TF.LER = TF.LER!TF.RPR!TF.BIN' .IIF DF T$$ESC, TF.LER = TF.LER!TF.RES3; ;M(; DEFINE OFFSETS IN UCB EXTENSION (UCBX);W .ASECTC.= 00U.TCI: .BLKW 1 ;IF SOLICITED INPUT IN PROGRESS:. ; POINTER TO CURRENT INPUT REQUEST PACKET& ;IF UNSOLICITED INPUT IN PROGRESS:- ; POINTER TO SECOND WORD IN FIRST BUFFER  ;IF INPUT IDLE:  ; 0/U.TIP: .BLKW 2 ;IF BUFFERED INPUT IN PROGRESS:L- ; FIRST WORD = POINTER TO CURRENT BUFFERT) ; SECOND WORD = POINTER TO NEXT BYTE  ; IN CURRENT BUFFER' ;IF NON-BUFFERED INPUT IN PROGRESS: / ; FIRST WORD = KISAR6 BIAS FOR TASK BUFFERX/ ; SECOND WORD = VIRTUAL ADDRESS IN KISAR61# ; OF NEXT BYTE IN TASK BUFFER 8U.TIC: .BLKW 1 ;REMAINING BYTES IN CURRENT INPUT BUFFER0U.TTIC: .BLKW 1 ;TOTAL REMAINING BYTES TO INPUT ;(EXCLUDING CURRENT BUFFER) :U.TFIB: .BLKW 1 ;POINTER TO FIRST INPUT BUFFER (ONLY WITH ;BUFFERED INPUT),U.TCO: .BLKW 1 ;IF TASK OUTPUT IN PROGRESS:/ ; POINTER TO CURRENT OUTPUT REQUEST PACKETU) ;IF ECHO IN PROGRESS, OR OUTPUT IDLE:  ; 0>U.TOP: .BLKW 2 ;FIRST WORD = POINTER TO CURRENT OUTPUT BUFFER* ;SECOND WORD = POINTER TO NEXT BYTE IN ;CURRENT OUTPUT BUFFER9U.TOC: .BLKW 1 ;REMAINING BYTES IN CURRENT OUTPUT BUFFERR1U.TTOC: .BLKW 1 ;TOTAL REMAINING BYTES TO OUTPUT ;(EXCLUDING CURRENT BUFFER)0U.TFOB: .BLKW 1 ;POINTER TO FIRST OUTPUT BUFFER0U.TFPB: .BLKW 1 ;FIRST PROMPT BUFFER FOR IO.RPR&U.TISV: .BLKB 1 ;INPUT STATE VARIABLE7U.TIHP: .BLKB 1 ;INITIAL HORIZONTAL POSITION FOR INPUTG .IF NDF T$$SPLEU.TECB: ;ECHO BUFFER2 .ENDC .BLKB 1)U.TVFC: .BLKB 1 ;VERTICAL FORMAT CONTROLDU.TITI: .BLKB 1 ;INPUT TIMER U.TOTI: .BLKB 1 ;OUTPUT TIMER+U.TSHP: .BLKB 1 ;SAVED HORIZONTAL POSITIONF)U.TSVP: .BLKB 1 ;SAVED VERTICAL POSITIONE;O+U.TRTT: .BLKW 1 ;SPECIAL TERMINATORS TABLE. .IF DF T$$EIO:U.TDIP: .BLKW 2 ;POINTERS TO CURRENT DEFAULT INPUT BUFFER=U.TDIC: .BLKW 2 ;COUNT OF REMAINING DEFAULT INPUT CHARACTERSP7U.TDIF: .BLKW 1 ;POINTER TO FIRST DEFAULT INPUT BUFFERF .ENDC ;T$$EIO/U.TTID: .BLKB 1 ;TERMINAL ID DEFINED ON IO.ATTC .IF DF B$$MAP>U.TDYP: .BLKB 1 ;OFFSET IN UCB EXTENSION FOR DATA TYPE (BYTE) .ENDC ;B$$MAP .EVEN&U.TAST: .BLKW 1 ;POINTER TO AST BLOCK ;0 IF NO AST SET UPT .IF DF T$$SCA?U.TSCA: .BLKW 1 ;POINTER TO SWITCH CHARACTER AST CONTROL BLOCK. .ENDC ;T$$SCAE .IF DF T$$MHUL2U.TMHA: .BLKW 1 ;POINTER TO MODEM HANG-UP NOTIFY  ;AST CONTROL BLOCK .ENDC ;T$$MHUO .IF DF T$$ICSU6U.TICA: .BLKW 1 ;POINTER TO TEP FOR INPUT COUNT STATE .ENDC ; T$$ICSI .IF DF T$$OOB0U.TOBA: .BLKW 1 ;POINTER TO TEP FOR OUT-OF-BAND .ENDC ; T$$OOB .IF DF T$$SPL9U.TTBF: ;TYPEAHEAD BUFFER FOLLOWS UCBX FOR 2NDARY POOLS .ENDC ;T$$SPL(T$$UXL= . ;DEFINE UCB EXTENSION LENGTH .PSECTS;O;O,; DEFINE BITS IN FORK REQUEST BYTE (U.TFRQ).5; FORK REQUESTS ARE PROCESSED IN ASCENDING BIT ORDER.FA; NOTE - INPUT DONE (FR.IRD) MUST BE PROCESSED BEFORE OUTPUT DONEU@; (FR.ORD) FOR THE SIMULATED CTRL-R FOLLOWING AN IO.WBT TO WORK.; SEE NOTE IN MODULE TTRW.;OFR.IRD= 1 ;INPUT DONEOFR.ORD= 2 ;OUTPUT DONE'FR.SUI= 4 ;START OF UNSOLICITED INPUTSX= 4 T .IF DF T$$CCA&A$$TRPR LX= X*2/FR.AST= X ;CHARACTER THAT CAUSES AST RECEIVED   .ENDC ;T$$CCA&A$$TRPE H .IF DF M$$PRO X= X*20FR.TIM= X ;TIME-OUT (ON MULTI-CPU SYSTEM ONLY) E .ENDC ;M$$PRO N .IF DF T$$SPCX= X*2$FR.KIL= X ;SEND KILL PACKET TO CLI .ENDC ;T$$SPC .IF DF T$$OOB)X= X*22FR.OOB= X ;SEND TSA EVENT PACKET FOR OUT-OF-BAND ;CHARACTER R .ENDC ;00"&{ccccT$$OOB  .IF DF T$$ICSX= X*27FR.ICS= X ;SEND TSA EVENT PACKET FOR TABUF GOING FROM40 ;ZERO TO NON-ZERO (INPUT COUNT STATE CHANGE) .ENDC ;T$$ICSA .IF DF T$$SCAE,X= X*2 ;SEND AST TO TASK ASKING FOR SWITCH$FR.SCA= X ; CHARACTER NOTIFICATION .ENDC ;T$$SCATX= X*2FR.GRQ= X ;GET REQUEST PACKET$ .IF DF T$$LTHX= X*2%FR.LAT= X ;MAP AND CALL LAT PROCESS$ .ENDC ;T$$LTHX= X*24FR.PFP= X ;PROCESS CHAR. IN U.TECB (U.TECO) AT END, ;OF FORK PROCESSING. NOTE - THIS MUST BE% ;THE HIGHEST USED BIT IN U.TFRQ!! ;N;S=; DEFINE CONTROLLER DEPENDENT ROUTINE DISPATCH TABLE OFFSETS.PF; REGISTER R2 IS SET TO THE REQUIRED OFFSET BEFORE THE CTRD ROUTINE ISD; CALLED TO TRANSFER CONTROL TO THE APPROPRIATE CONTROLLER DEPENDENT=; MODULE. THESE VALUES ARE AFFECTED BY GET/SET PARAMETER ANDEI; RECONFIGURATION CONDITIONAL CODE, WHICH MAKES IT EASIER TO CONTEND WITHCI; AND DEFINE THE SYMBOLS HERE THAN TO PROVIDE THE PROPER CONDITIONAL CODE &; WHEREVER THE CTRD ROUTINE IS CALLED.;CT.STA= 0 ;START OUTPUTNCT.ABO= 2 ;ABORT OUTPUTECT.RES= 4 ;RESUME OUTPUTCT.STP= 6 ;STOP OUTPUTX= 6 .IF NDF R$$CON X= X+2CT.PWR= X ;POWER-UPR .IFTF ;NDF R$$CONX= X+2CT.TIM= X ;MODEM TIME-OUT  .IFF ;NDF R$$CONX= X+2 CT.CPW= X ;CONTROLLER POWER-UPX= X+2CT.UPW= X ;UNIT POWER-UPX= X+2CT.CON= X ;CONTROLLER ONLINEX= X+2CT.COF= X ;CONTROLLER OFFLINERX= X+2CT.UON= X ;UNIT ONLINEX= X+2CT.UOF= X ;UNIT OFFLINEN .ENDC ;NDF R$$CON* .IF DF T$$GMC!T$$SMC!D$$M11!D$$ZMD!D$$VMDX= X+2$CT.PRM= X ;GET/SET LINE PARAMETERS* .ENDC ;T$$GMC!T$$SMC!D$$M11!D$$ZMD!D$$VMD.LISTWER-UPR .IFTF ;NDF R$$CONX= X+2CT.TIM= X ;MODEM TIME-OUT  .IFF ;NDF R$$CONX= X+2 CT.CPW= X ;CONTROLLER POWER-UPX= X+2CT.UPW= X ;UNIT POWER-UPX= X+2CT.CON= X ;CONTROLLER ONLINEX= X+2CT.COF= X ;CONTROLLER OFFLINERX= X+2CT.UON= X ;UNIT ONLINEX= X+2CT.UOF= X ;UNIT OFFLINEN .TITLE TTOISF .IDENT /05.04/;; 6; COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;T<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ;M; 23-JAN-78 PETER WANNHEDENR;O; PREVIOUSLY MODIFIED BY:C;R; P. WANNHEDEN; D. R. DONCHIN ; T. LEKAS;-; MODIFICATIONS:; ; D. R. DONCHIN 05-JUN-83 05.01,; DD173 -- FIX MINOR PROBLEMS IN DHV11 CODE;N; D. R. DONCHIN 14-SEP-83 05.02U ; DD179 -- ADD HOSTSYNC SUPPORT; ; S. C. ADAMS 23-APR-84 05.03A4; SA170 -- CHANGE S4.XOF,XON,HPC TO S5. XOF,XON,HPC.; CHANGE S1.CTS TO S2.CTS. AND CHANGE S1.OBF;Y; S. C. ADAMS 21-MAY-84 05.04C(; SA195 -- ELIMINATE REDUNDANT BIT TEST .PSECT MAP5; 2; PROFESSIONAL 300 SERIES PRINTER PORT DEFINITIONS; .PDBUF = 173400 ;RECEIVER DATA BUFFER REGISTERPSTS = 173402 ;STATUS REGISTERCPMODE = 173404 ;MODE REGISTER!PCMND = 173406 ;COMMAND REGISTER;:; PROFESSIONAL 300 SERIES INTERRUPT CONTROLLER DEFINITIONS;O4ICCSR = 173202 ;INTERRUPT CONTROLLER 0 CSR REGISTER5PRINTR = 5 ;PRINTER RECEIVER INTERRUPT REQUEST LEVELT8PXINTR = 6 ;PRINTER TRANSMITTER INTERRUPT REQUEST LEVEL*CLSIMR = 50 ;CLEAR SINGLE IMR BIT COMMAND)STSIRR = 130 ;SET SINGLE IRR BIT COMMAND3(STSIMR = 70 ;SET SINGLE IMR BIT COMMAND; ;7;+*; COMMON OUTPUT INTERRUPT SERVICE ROUTINE.1; USED BY FOLLOWING CONTROLLER TYPES: DJ, DL, DZ.T;; INPUT: ; R2 BITMASK FOR TRANSMIT ENABLE; R3 CSR ADDRESS; R5 POINTER TO U.TSTA;F ; OUTPUT:O,; NEXT CHARACTER IS OUTPUT, IF THERE IS ONE.:; IF NECESSARY, A SWITCH IS MADE TO THE NEXT OUTPUT BUFFER"; (ONLY IF DOING BUFFERED OUTPUT).5; IF NO MORE CHARACTERS TO OUTPUT, ODONE IS CALLED TOI!; PERFORM OUTPUT-DONE PROCESSING.S;L; REGISTERS ALTERED: R2,R3,R4 ;-;I;E .MCALL HWDDF$,UCBDF$7;+* HWDDF$ ;DEFINE HARDWARE RELATED SYMBOLS UCBDF$ ;DEFINE UCB SYMBOLSR .ENABL LSB  .IF DF D$$J11!D$$L11!D$$Z11;T;SOUTISR:: .IF DF R$$CON* BIT00*|tt tfDATAB #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 CONTINUE0025{cccc .IFTF ;R$$PRO*95$: MOVB @-(R4),6(R3) ;;;OUTPUT CHARACTER .IFT ;R$$PROR97$: ;;;REFERENCE LABEL .ENDC ;R$$PRO INC @R4 ;;;UPDATE POINTER  RETURN ;;;RETURNA;D100$: MOV @SP,R2 ;;;RESTORE R2N3 MOV #ODONE,@SP ;;;DO OUTPUT DONE PROCESSING BEFORED ;;;INTERRUPT IS DISMISSED:7110$: BIC R2,4(R3) ;;;DISABLE TRANSMISSION ON THIS LINEG .IF DF R$$PRO; D; FOR THE PROFESSIONAL 300 SERIES MACHINES BOTH METHODS OF EFFECTINGE; THE INTERRUPT ENABLE BITS ARE LEFT IN PLACE SO THAT THE SYSTEM WILLC; WORK ON BOTH THE REAL HARDWARE AND THE BRIDGE SYSTEM. THE BRIDGE:D; SYSTEM CONSISTS OF AN 11/23-PLUS SYSTEM WITH AN INTERFACE ON IT TO; THE CTI BUS.;T?; ON THE REAL HARDWARE THE BIC R2... IS IGNORED. ON THE BRIDGE ?; SYSTEM THE FOLLOWING INSTRUCTION IS IGNORED BECAUSE IT WRITES1; INTO THE BOOT ROMI;L> MOV #STSIMR!PXINTR,ICCSR ;;;DISABLE TRANSMISSION ON THIS LINE ;;;FOR THE PRINTER PORT .ENDC ;R$$PRO RETURN ;;;R  .ENDC ;D$$J11!D$$L11!D$$Z11 T .DSABL LSBM;L; .ENDON BOTH THE REAL HARDWARE AND THE BRIDGE SYSTEM. THE BRIDGE:D; SYSTEM CONSISTS OF AN 11/23-PLUS SYSTEM WITH AN INTERFACE ON IT TO; THE CTI BUS.;T?; ON THE REAL HARDWARE THE BIC R2... IS IGNORED. ON THE BRIDGE ?; SYSTEM THE FOLLOWING INSTRUCTION IS IGNORED BECAUSE IT WRITES1; INTO THE BOOT ROMI;L> MOV #STSIMR!PXINTR,ICCSR ;;;DISABLE TRANSMISSION ON THIS LINE ;;;FOR THE PRINTER PORT .ENDC ;R$$PRO RETURN ;;;R  .ENDC ;D$$J11!D$$L11!D$$Z11 T .TITLE TTJZ .IDENT /05.02/O;T6; COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;-<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;Y;M; 27-JAN-78 PETER WANNHEDEN ;O; PREVIOUSLY MODIFIED BY:N;T; P. WANNHEDEN ; C. F. SPITZR; D. R. DONCHIND;B; MODIFICATIONS:;I; D. R. DONCHIN 14-SEP-83 05.01E ; DD179 -- ADD HOSTSYNC SUPPORT; ; S. C. ADAMS 23-APR-84 05.02!8; SA170 -- CHANGE S4.HPC TO S5.HPC AND S1.CTS TO S2.CTS; ; ;+2; COMMON ROUTINES FOR DJ-11 AND DZ-11 CONTROLLERS.;-;; H .IF DF D$$J11!D$$Z11D D .MCALL UCBDF$, SCBDF$;D UCBDF$ ;DEFINE UCB SYMBOLSE SCBDF$ ;DEFINE SCB SYMBOLS. .PSECT MAP5;7;E;+; YJSTAX/YZSTAX - START OUTPUT.F; ; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.TOP+2 BUFFER ADDRESSI; U.TOC BYTE COUNT ; S1.CTO 0 ;-;C;P .ENABL LSB.; YJSTAX::PYZSTAX::BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;ANY HIGH PRIORITY CHARACTERS TO OUTPUT?3 BNE YZRESX ;;;Y - DO IT REGARDLESS OF XOFF STATUS ASSUME S2.CTS,100000( TST 2(R5) ;;;OUTPUT STOPPED BY CTRL-S? BMI 10$ ;;;Y - IGNORE ;B;E;+ ; YJRESX/YZRESX - RESUME OUTPUT.;C; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 0 ;-;D;RYJRESX:::YZRESX::BIS $BTMSK(R2),4(R3) ;;;ENABLE TRANSMIT INTERRUPTS% ;;;THE FIRST INTERRUPT WILL START. ;;;(OR RESUME) OUTPUT.10$: RETURN ;;;.;5;T;+A; JZOUT - COMMON OUTPUT INTERRUPT PROCESSING FOR DJ-11 AND DZ-11. ;I; INPUT:-; 2(SP) POINTER TO CONTROLLER REGISTER (BYTE)T5; THAT CONTAINS INTERRUPTING LINE NUMBER IN BITS 0-3-; R3 CSR ADDRESS; R4 KRB ADDRESS (RSX-11M+)O"; R4 ADDRESS OF UCB LIST (RSX-11M); ; OUTPUT:R9; FIRST, ALL LINES THAT REQUIRE OUTPUT WORK ARE SERVICED.J=; NEXT, IF ANY LINE REQUIRES INPUT WORK, THE SILO IS EMPTIED.P>; IF AT THAT TIME OUTPUT WORK IS AGAIN REQUIRED (THERE WILL BE6; IF THERE WAS ANY INPUT THAT REQUIRES ECHO), THE LOOP'; LOOKING FOR OUTPUT WORK IS REENTERED.D@; ON RETURN, ALL OUTPUT AND INPUT WORK THAT CAN BE DONE IS DONE.;T; REGISTERS ALTERED: R2,R5;-;E;M6JZOUT:: MOVB @2(SP),R5 ;;;GET INTERRUPTING LINE NUMBER6 CALL MUXUCB ;;;CHECK LINE NUMBER AND GET UCB ADDRESS1 MOV $BTMSK(R2),R2 ;;;GET BITMASK FOR XMIT ENABLER BCS 30$ ;;;BAD LINE - JUMP  .IF DF R$$MPL ,! MOV R4,-(SP) ;;;SAVE KRB POINTERT6 CALL OUTISR ;;;DO COMMON OUTPUT INTERRUPT PROCESSING$ MOV (SP)+,R4 ;;;R00:<|tt tfDATAESTORE KRB POINTER# MOV @R4,R3 ;;;RESTORE CSR POINTERR S .IFF ;R$$MPL  R MOV R3,-(SP) ;;;SAVE CSR ) MOV R4,-(SP) ;;;SAVE ADDRESS OF UCB LISTT6 CALL OUTISR ;;;DO COMMON OUTPUT INTERRUPT PROCESSING, MOV (SP)+,R4 ;;;RESTORE ADDRESS OF UCB LIST$ MOV (SP)+,R3 ;;;RESTORE CSR ADDRESS  .ENDC ;R$$MPL ;20$: TST @R3 ;;;XMIT READY? BMI JZOUT ;;;Y - LOOP ;PA; NO MORE LINES REQUIRE OUTPUT WORK. SEE IF ANY INPUT WORK TO DO. ;I* MOV 2(R3),R5 ;;;GET A CHARACTER FROM SILO BPL 10$ ;;;NONE - EXIT- CALL MUXIN1 ;;;OK - PROCESS INPUT CHARACTERE& ;;;MUXIN1 RETURNS TO OUR CALLER IF ;;;NO OUTPUT WORK TO DO & BR JZOUT ;;;OUTPUT WORK TO DO - LOOP; >; OUTPUT INTERRUPT OCCURRED ON A LINE THAT WE DON'T RECOGNIZE.:; I DON'T KNOW HOW IT GOT HERE BUT LET'S TRY TO PREVENT IT; FROM HAPPENING AGAIN.;:.30$: BIC R2,4(R3) ;;;DISABLE XMIT ON THAT LINE BR 20$ ;;;; .DSABL LSB  P .ENDC ;D$$J11!D$$Z11U O;T;O .END MOV 2(R3),R5 ;;;GET A CHARACTER FROM SILO BPL 10$ ;;;NONE  .TITLE TTATTB .IDENT /06.14/i;p; COPYRIGHT (c) 1987 BY+; DIGITAL EQUIPMENT CORPORATION, MAYNARD,.*; MASSACHUSETTS. ALL RIGHTS RESERVED.; C; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDVC ; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE C ; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISRC ; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORRC ; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND.3 ; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED.T;1C; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTEC; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITALU; EQUIPMENT CORPORATION.;C; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF>; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;;O; 09-FEB-78 PETER WANNHEDENH;,; PREVIOUSLY MODIFIED BY: ;W; P. WANNHEDEN; C. F. SPITZR; D. R. DONCHINN; B. S. MCCARTHY ; T. LEKAS ; S. C. ADAMSR!; R. S. PHILPOTT";M"; "; MODIFICATION HISTORY:T";C"; L. KOGAN 4-APR-86 6.048"; LK709 -- FIX CONDITIONALS WHEN SF.SMC IS DEFINED AND"; SF.GMC IS NOT DEFINED";"; L. KOGAN 18-JUN-86 6.05B3"; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORTE";Q"; S.C. ADAMS 14-JUNE-86 6.06!"; SA459 -- FIX COMMENT IN MCOOB "; !"; S. R. CLOUTIER 23-JUN-86 6.07D="; ADD CALL TO LAT PORT DRIVER, ON DETACH, IF TERMINAL IS A "; LAT APPLICATION TERMINAL.";L"; S.C. ADAMS 5-AUG-86 6.08 "; SA464 -- ADD LAT 5.1 SUPPORT";I"; S.C. ADAMS 5-AUG-86 6.09@"; SA465 -- REMOVE RESTRICTION THAT TERMINAL CANNOT BE ATTACHEDD"; FOR AST NOTIFICATION TO SET OTHER NOTIFICATION CHARACTERISTICS"; "; S. R. CLOUTIER 7-AUG-86 6.10C"; SRC SUPPLY STATUS IE.DNR IN ROUTINE PPHNG BEFORE CALLING KILLO1-";C="; CHECK TO SEE IF I/O PACKET HAS BEEN TAKEN BY LAT PROCESS #"; IN PPHNG BEFORE COMPLETING I/OC"; "; S. R. CLOUTIER 9-SEP-86 6.11D"; SRC MAKE CORRECTIONS TO MCMAP AND MCQDP LAT APPLICATION TERMINAL "; ROUTINES";""; T. M. SCHOELLER 10-DEC-86 6.12D"; TMS050 -- REMAP APR5 BEFORE CALLING CKTAB VIA CHANGING THE STACK";I"; L. KOGAN 26-FEB-87 6.13A8"; LK722 -- DO NOT KILL I/O ON LOCAL LINES AFTER IO.HNG";"; S.C. ADAMS 12-JUN-87 6.14OB"; SA473 -- CHECK THAT LAT PROCESS IS INSTALLED BEFORE GET OR SET"; CHARACTERSITICS ";R"; #;+$; ****** T T A T T ******C%; F&; THIS MODULE CONTAINS THE ROUTINES TO PROCESS I/O REQUESTS WITH THE'; FOLLOWING FUNCTION CODES:L2(; IO.ATT, IO.DET, IO.HNG, IO.GTS, SF.GMC, SF.SMCL); MOST OF THIS PROCESSING IS DONE WHEN THE I/O REQUEST IS REMOVED FROM THEN*; TERMINAL'S REQUEST QUEUE. HOWEVER, IO.GTS AND IO.GMC ARE NEVER PUT IN THEM+; QUEUE SO THEIR PROCESSING ROUTINE IS CALLED IMMEDIATELY FROM TTINI. ALSO P,; CONTAINED IN THIS MODULE IS THE ROUTINE FOR DEALLOCATING AST CONTROL BLOCKS.O-; IT IS CALLED FROM THE EXECUTIVE WHEN AN AST HAS 00B5{ccccBEEN DEQUEUED AND EFFECTED.O.;-/;Q(0 .SBTTL .MCALLS AND SYMBOL DEFINITIONS132 .IF DF T$$TSA!T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB34 .MCALL EVNDF$,PKTDF$S5,6 EVNDF$ ;DEFINE TSA EVENT PACKET OFFSETS-7 PKTDF$ ;DEFINE AST CONTROL BLOCK SYMBOLSD839 .ENDC ;T$$TSA!T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOBN:; .IF NDF R$$MPLE<= .MCALL HWDDF$,SCBDF$>? HWDDF$ ;DEFINE KINAR5@ SCBDF$ ;DEFINE S.DMCSAB .ENDCCDE .IF DF T$$GTSFG .MCALL TTSYM$H-I TTSYM$ ;DEFINE F1.XXX AND F2.XXX SYMBOLSJ;B?K; DEFINE TERMINAL SUPPORT WORDS RETURNED BY AN IO.GTS REQUEST$L;TM; ALWAYS SUPPORTED OPTIONS:LN;D2OTSP1 = F1.ACR!F1.BUF!F1.CCO!F1.HLD!F1.LWC!F1.RNE0PTSP1 = TSP1!F1.RST!F1.SYN!F1.TRW!F1.UTB!F1.VBFQ;DRTSP2 = F2.FDX!F2.SFFS;!&T; CONDITIONALLY SUPPORTED OPTIONS:U;R#V.IIF DF T$$BTW TSP1 = TSP1!F1.BTW#W.IIF DF T$$CCA TSP1 = TSP1!F1.UIAB#X.IIF DF T$$ESC TSP1 = TSP1!F1.ESQ#Y.IIF DF T$$RPR TSP1 = TSP1!F1.RPR #Z.IIF DF T$$RUB TSP1 = TSP1!F1.RUBX[;F#\.IIF DF T$$GMC TSP2 = TSP2!F2.GCHI#].IIF DF T$$SMC TSP2 = TSP2!F2.SCHT#^.IIF DF T$$CUP TSP2 = TSP2!F2.CUPT#_.IIF DF T$$EIO TSP2 = TSP2!F2.EIO1#`.IIF DF T$$TSA TSP2 = TSP2!F2.NCTSab .ENDC ;T$$GTScd.PAGET;e .SBTTL PPATT - POST-QUEUE PROCESSING FOR ATTACH REQUESTSAf;Ug;+8h; **-PPATT - POST-QUEUE PROCESSING FOR ATTACH REQUESTSi;DHj; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.ATT REQUEST HASHk; BEEN DEQUEUED FOR A TERMINAL. ALWAYS SAVE THE USER-DEFINED TERMINAL'l; ID AND PROCESS IO.ATT SUBFUNCTIONS.m;D n; INPUTS: o; R5 => U.TSTA OF TERMINAL UCB?p; R4 => UCBX FOR TERMINAL (GUARANTEED TO EXIST AND BE MAPPED)Dq; R3 => CURRENT I/O PACKETr;s; OUTPUTS: NONE.t;T,u; REGISTERS MODIFIED: R0, R1, R2, R3, R4v;-w;Exy;MOVE THIS TO APR6z{ .IF NDF T$$OVLS|} .PSECT MAP6~ .ENDC ;NDF T$$OVL1 .IF DF T$$ONI ;IF AN OVERLAID NON I/D SYSTEMH:$DALED: .WORD 0 ;THIS WILL BE INITIALIZED BY TTDAT CODE1 ;THIS MUST BE THE FIRST WORD IN THE OVERLAYS .IF DF T$$GMC!T$$SMC5;AB; TABLE OF CHARACTERISTIC CODES FOR GET MULTIPLE CHARACTERISTICSI; FUNCTION (SF.GMC) AND SET MULTIPLE CHARACTERISTICS FUNCTION (SF.SMC).;9; EACH RECOGNIZED CODE HAS A 1-WORD ENTRY IN THE TABLE.,; THIS WORD CONTAINS ONE OF THE FOLLOWING:;*; 1. IF THE WORD NOT = 0 AND BIT 15 = 0:=; LOW BYTE = A BITMASK THAT MAPS THE DESIRED CHARACTERISTICD9; VALUE IN THE PROPER BYTE IN THE UCB. BITS ARE SET FORT"; RELEVANT BITS IN THE UCB BYTE.8; HIGH BYTE = OFFSET FROM START OF THE UCB TO THE BYTE-; THAT CONTAINS THE DESIRED CHARACTERISTIC.T;I; 2. IF BIT 15 = 1:C8; THE WORD IS THE ADDRESS OF A SUBROUTINE THAT HANDLES#; THIS PARTICULAR CHARACTERISTIC.W?; (ALL VIRTUAL ADDRESSES IN THE DRIVER ARE 120000 OR HIGHER).W;; 3. IF THE WHOLE WORD = 0:0>; THIS CHARACTERISTIC IS NOT RECOGNIZED BY SF.GMC OR SF.SMC.;A;S*; DEFINE MACRO TO GENERATE TABLE ENTRIES;T .MACRO MCGEN NAME,OFS,BMB .IF LE NAME-MCHI .=MCTAB+<2*>O .IF NB BM .IF LE BM-377 .BYTE BM,OFS  .IFFE .BYTE BM/400,OFS+1I .ENDC .IFF= .WORD OFS .ENDC .IFF ! .ERROR ;ILLEGAL CHARACTERISTICH .ENDC .ENDM MCGEN;6MCHI == TC.MAX-1 ;HIGHEST RECOGNIZED CHARACTERISTIC;)MCTAB:: .REPT MCHI- .WORD 0 ;INITIALIZE WHOLE TABLE TO ZEROSN .ENDR, MCGEN TC.WID,U.CW4,377 ;NUMBER OF COLUMNS4 MCGEN TC.LPP,U.TLPP,377 ;NUMBER OF LINES PER PAGE .IF DF D$$H11!D$$Z11!D$$V11% MCGEN TC.RSP,MCRSP ;RECEIVE SPEED& MCGEN TC.XSP,MCXSP ;TRANSMIT SPEED6 MCGEN TC.PAR,MCPAR ;PARITY GENERATION AND CHECKING$ MCGEN TC.EPA,MCEPA ;PARITY SENSE8 MCGEN TC.CLN,MCCLN ;7-BIT CHARRACTER LENGTH ; LK710 .IF DF T$$MOD$ MCGEN TC.ASP,MCASP ;ANSWER SPEED7 MCGEN TC.ABD,U.TSTA+6,S4.ABD ;AUTO-BAUD SPEED DETECTT .ENDC ;T$$MOD .ENDC ;D$$H11!D$$Z11!D$$V112 MCGEN TC.ISL,U.UNIT,377 ;00J<|tt tfDATASUB-LINE ON CONTROLLER% MCGEN TC.TTP,MCTTP ;TERMINAL TYPE1# MCGEN TC.SCP,U.CW2,U2.CRT ;SCOPE < MCGEN TC.HFL,U.TSTA+6,S4.HFL ;HORIZONTAL FILL REQUIREMENT: MCGEN TC.VFL,U.TSTA+6,S4.VFL ;VERTICAL FILL REQUIREMENT3 MCGEN TC.HFF,U.TSTA+6,S4.HFF ;HARDWARE FORM-FEEDR- MCGEN TC.HHT,U.TSTA+6,S4.HHT ;HARDWARE TAB> MCGEN TC.ACR,U.TSTA+4,S3.ACR ;AUTOMATIC CR-LF ON LONG LINES- MCGEN TC.PPT,U.TSTA+4,S3.PPT ;PRINTER-PORT;5 MCGEN TC.SMR,U.CW2,U2.LWC ;LOWERCASE INPUT ENABLEDN .IF DF T$$ESC9 MCGEN TC.ESQ,U.CW2,U2.ESC ;ESCAPE SEQUENCES RECOGNIZED .ENDC ;T$$ESC .IF DF T$$MOD$ MCGEN TC.DLU,MCRMT ;DIAL-UP LINE .ENDC. MCGEN TC.HLD,U.CW2,U2.HLD ;HOLD-SCREEN MODE( MCGEN TC.NEC,U.TSTA+4,S3.NEC ;NO-ECHO- MCGEN TC.SLV,U.CW2,U2.SLV ;SLAVED TERMINALH1 MCGEN TC.PRI,U.CW2,U2.PRV ;PRIVILEGED TERMINALA, MCGEN TC.FDX,U.TSTA+4,S3.FDX ;FULL DUPLEX= MCGEN TC.PTH,U.TSTA+4,S3.PTH ;PASS-THROUGH MODE IS ENABLEDO% MCGEN TC.BIN,MCBIN ;READ-PASS-ALL$@ MCGEN TC.8BC,U.TSTA+4,S3.8BC ;8 BIT CHARACTERS PASSED ON READ6 MCGEN TC.TBF,MCTBF ;TYPE-AHEAD BUFFER ACTIVE COUNT( MCGEN TC.CTS,MCCTS ;CONTROL-S STATUS5 MCGEN TC.HSY,MCHSY ;HOST/TERMINAL SYNCHRONIZATIONE) MCGEN TC.ANI,U.TSTA+6,S4.ANI ;ANSI CRT/ MCGEN TC.AVO,U.TSTA+6,S4.AVO ;ADVANCED VIDEO+ MCGEN TC.BLK,U.TSTA+6,S4.BLK ;BLOCK MODEA( MCGEN TC.DEC,U.TSTA+6,S4.DEC ;DEC CRT* MCGEN TC.EDT,U.TSTA+6,S4.EDT ;EDIT MODE& MCGEN TC.RGS,U.TSTA+6,S4.RGS ;REGIS0 MCGEN TC.SFC,U.TSTA+6,S4.SFC ;SOFT CHARACTERS;. .IF DF R$$MPL!A$$CLIS .IF DF C$$CTC7 MCGEN TC.TLC,U.TSTA+4,S3.CTC ;CONTROL-C NOTIFICATION. .ENDC ;C$$CTC) MCGEN TC.NBR,U.MUP,UM.NBR ;NOBROADCASTY .ENDC ;R$$MPL!A$$CLIN .IF DF T$$ACD6 MCGEN TC.ACD,MCACD ;ANCILLARY CONTROL DRIVER (ACD) .ENDC ;T$$ACD0 MCGEN TC.RAT,U.TSTA+4,S3.TAB ;READ-AHEAD TYPE .IF DF T$$SERA  MCGEN TC.TBM,U.MUP,UM.SER ;TYPEAHEAD BUFFER MODE (TASK OR CLI)   .ENDC ;T$$SER ;.  .IF DF T$$OOB< MCGEN TC.OOB,MCOOB ;OUT-OF-BAND/HELLO/INCLUDE CHARACTERS .ENDC ;T$$OOB .IF DF T$$ICS2 MCGEN TC.ICS,MCICS ;NOTIFY OF CHANGE IN TABUF ;(INPUT COUNT STATE)Y .ENDC ;TT$ICS .IF DF T$$SCA1 MCGEN TC.SSC,MCSSC ;SPECIFY SWITCH CHARACTERS 5 MCGEN TC.TMM,MCTMM ;EXIT TERMINAL MANAGEMENT MODEN .ENDC ;T$$SCA+ MCGEN TC.TSY,MCTSY ;OUTPUT FLOW CONTROL( .IF DF T$$MHU ;MODEM HANG-UP NOTIFY: MCGEN TC.MHU,MCMHU ;REQUEST MODEM HANG-UP NOTIFICATION .ENDC ;T$$MHU ;SA464$ .IF DF T$$LTH&M$$NET ;SA464 ;SA464E MCGEN TC.QDP,MCQDP ;GET QUEUE DEPTH AND LAT CONNECT STATUS ;SA464 4 MCGEN TC.MAP,MCMAP ;SET UP LAT MAPPING ;SA464 ;SA464$ .ENDC ;T$$LTH&M$$NET ;SA464 !"" .=MCTAB+<2*MCHI> ;END OF TABLE#;E$;D%& .ENDC ;T$$GMC!T$$SMCN'( .ENDC ; T$$ONIF) *PPATT::=+ MOVB I.PRM+2(R3),U.TTID(R4) ;SAVE USER-DEFINED TERMINAL ID,,- .IF DF T$$ESC.5/ BIT #TF.ESQ,I.FCN(R3) ;TASK WANT ESCAPE SEQUENCES?01 .IF DF T$$CCA23 BEQ 10$ ;IF EQ, NO...SKIP45 .IFF ;T$$CCA 6*7 BEQ ADHSUC ;COMPLETE SUCCESSFUL ATTACH89 .ENDC ;T$$CCA:,; BIS #S3.RES,4(R5) ;REMEMBER TO PARSE THEM<10$:= .ENDC ;T$$ESC>? .IF DF T$$CCA@<A BIT #TF.AST,I.FCN(R3) ;ATTACH FOR UNSOLICITED INPUT AST?3B BEQ 19$ ;IF EQ, NO...COMPLETE SUCCESSFUL ATTACH3C MOV I.PRM+4(R3),-(SP) ;GET CONTROL-C AST ADDRESSM2D BEQ 15$ ;IF EQ, NONE...CHECK OTHER AST ADDRESS7E BIT #TF.XCC,I.FCN(R3) ;CONFLICTING SUBFUNCTION CODE?C)F BNE 20$ ;IF NE, YES...RETURN AN ERRORG15$:H .IF NDF S$$LIBQI<J BIS I.PRM(R3),(SP) ;"OR" IN UNSOLICITED INPUT AST ADDRESS&K ASR (SP)+ ;WAS EITHER ADDRESS ODD?-L BCS 30$ ;IF CS, YES...INVALID AST ADDRESSCMN .IFF ;S$$LIBTO=P BIS I.PRM(R3),(SP)+ ;"OR" IN UNSOLICITED INPUT AST ADDRESS QR .ENDC ;S$$LIBS5T BEQ 30$ ;IF EQ, NEITHER ADDRESS SPECIFIED...ERRORR,U MOV #24.,R1 ;SET SIZE OF ACB TO AL00R5{ccccLOCATE:V ADD #U.TAST,R4 ;POINT TO ATTACH ACB POINTER IN THE UCBX.W CALL ALACB ;ALLOCATE AN ACB FOR THE ATTACH-X BCS 40$ ;IF CS, ALLOCATION FAILED...ERRORPEY MOVB I.FCN(R3),(R0)+ ;PUT FUNCTION CODE MODIFIERS IN ACB FLAG BYTEE;Z MOV I.PRM+4(R3),(R0)+ ;SAVE CONTROL-C AST ADDRESS IN ACBRA[ MOV I.PRM(R3),(R0) ;LIKEWISE FOR UNSOLICITED INPUT AST ADDRESSO\] .IFTF ;T$$CCA^-_19$: BR ADHSUC ;COMPLETE SUCCESSFUL ATTACH `a .IFT ;T$$CCAFbc20$: TST (SP)+ ;CLEAN STACK9d30$: MOV #IE.SPC,R0 ;SET ILLEGAL AST ADDRESS ERROR CODEA"e BR 50$ ;JOIN COMMON ERROR CODE0f40$: MOV #IE.NOD,R0 ;ERROR - NO DYNAMIC MEMORY;g50$: CLR U.ATT-U.TSTA(R5) ;CLEAR POINTER SET UP BY $GSPKTThi .IF DF T$$ESCj=k BIC #S3.RES,4(R5) ;DON'T REMEMBER ESCAPE SEQUENCES ANYMOREAlm .ENDC ;T$$ESCn&o BR ADHFIN ;COMPLETE ATTACH REQUESTpq .ENDC ;T$$CCArs.PAGEC;t .SBTTL PPDET - POST-QUEUE PROCESSING FOR DETACH REQUESTSu; v;+8w; **-PPDET - POST-QUEUE PROCESSING FOR DETACH REQUESTSx;SHy; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.DET REQUEST HASKz; BEEN DEQUEUED FOR A TERMINAL. FLUSH THE TYPEAHEAD BUFFER IF NECESSARY,CI{; CLEAN UP TERMINAL STATUS, AND DEALLOCATE UNNECESSARY DATA STRUCTURES.R|;O }; INPUTS: ~; R5 => U.TSTA OF TERMINAL UCB7; R4 => UCBX FOR TERMINAL (ONLY IF T$$SPL IS DEFINED); R3 => CURRENT I/O PACKET;; OUTPUTS: NONE.;E,; REGISTERS MODIFIED: R0, R1, R2, R3, R4;-;T PPDET::U .IF DF T$$SER= BIT #UM.SER,U.MUP-U.TSTA(R5) ;DETACH WHILE IN SERIAL MODE?R( BNE 10$ ;Y - DON'T FLUSH TABUF, JUMP .ENDC ;T$$SER .IF DF T$$IDO, TST $MCRPT ;IS THE DISPATCHER INSTALLED?) BEQ 10$ ;IF EQ NO - DON'T FLUSH TABUF .ENDC ;T$$IDO, MOV R3,-(SP) ;SAVE CURRENT PACKET ADDRESS .IF DF T$$OVL! MOV #I1CTXL,-(SP) ;GET ADDRESSA0 CALL MPROT ;CALL ROUTINE TO FLUSH TYPE AHEAD .IFF ;T$$OVL18 CALL I1CTXL ;FLUSH TYPE-AHEAD BUFFER WITH INTERRUPTS ;LOCKED OUTM .ENDC ;T$$OVL+ MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESST*10$: BIC #S2.CTO,2(R5) ;CLEAR CTRL-O BIT" BIS #S2.IRQ!S2.ORQ!S2.SRQ,2(R5)0 ;LOOK FOR ALL SORTS OF PACKET IN THE QUEUE ;NEXT TIME .IF DF T$$ESC= BIC #S3.RES,4(R5) ;DON'T LOOK FOR ESCAPE SEQUENCES ANYMORE. .ENDC ;T$$ESC% .IF DF T$$SCA!T$$MHU!T$$ICS!T$$OOBO1 BIC #S3.TME!S3.MHE!S3.ICE,4(R5) ;DISABLE THESEV9 BIC #S5.TMM,U.TST5-U.TSTA(R5) ;AND TERMINAL MANAGEMENTR% .ENDC ;T$$SCA!T$$MHU!T$$ICS!T$$OOB, .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB .IF NDF T$$SPL)$ MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX5 BEQ ADHSUC ;IF EQ, UCBX IS GONE...COMPLETE DETACHE .ENDC ;T$$SPL9 ADD #U.TAST,R4 ;POINT TO UNSOLICITED INPUT ACB ADDRESSF/X = U.TAST ;SYMBOL NEEDED FOR ASSUME MACROSC .IF DF T$$CCA5 CALL DEACB ;DEALLOCATE ATTACH ACB IF THERE IS ONER' TST (R4)+ ;SKIP TO NEXT ACB POINTER- X = X + 2N .ENDC ;T$$CCA .IF DF T$$SCA ASSUME U.TSCA,X X = X + 2 6 CALL DEACB ;DEALLOCATE SWITCH CHARACTER ACB IF ONE' TST (R4)+ ;SKIP TO NEXT ACB POINTERC .ENDC ;T$$SCA .IF DF T$$MHU ASSUME U.TMHA,X X = X + 22 CALL DEACB ;DEALLOCATE MODEM HANGUP ACB IF ONE' TST (R4)+ ;SKIP TO NEXT ACB POINTER  .ENDC ;T$$MHU .IF DF T$$ICS ASSUME U.TICA,X X = X + 2C- CALL DEACB ;DEALLOCATE ICS ACB/TEP IF ONE ' TST (R4)+ ;SKIP TO NEXT ACB POINTER; .ENDC ;T$$ICS .IF DF T$$OOB ASSUME U.TOBA,X- CALL DEACB ;DEALLOCATE OOB ACB/TEP IF ONE  .ENDC ;T$$OOB, .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB ;SA4647 .IF DF T$$LTH ; IF LAT TERMINALS IN SYSTEM ;SA464E ;SA464C BIT #S6.LAT,U.TST6-U.TSTA(R5) ;LAT APPLICATION TERMINAL? ;SA464;0 BEQ 20$ ; IF EQ - NO, JUST COMPLETE ;SA464 ;SA464 .IF DF T$$OVL ;SA464 ;SA464+ MOV #LHDET,-(SP) ;GET ADDRESS ;SA464N00Z<|tt tfDATA. CALL MPROT ;CALL ROUTINE IN TTLH ;SA464 ;SA464 .IFF ;T$$OVL ;SA464  ;SA464, CALL LHDET ;CALL TTLH DIRECTLY ;SA464 ; ;SA464  .ENDC ;T$$OVL ;SA464 ;SA4642 BCS PPHNG ; IF CS, HANG UP THE LINE.. ;SA464 ;SA464 .ENDC ;T$$LTH ;SA464 ;SA46420$: ;SA464 ;SA464) BR ADHSUC ;COMPLETE SUCCESSFUL DETACH .PAGEVA .SBTTL PPHNG - POST-QUEUE PROCESSING FOR MODEM HANGUP REQUESTSE;T;+>; **-PPHNG - POST-QUEUE PROCESSING FOR MODEM HANGUP REQUESTS; H; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.HNG REQUEST HASG; BEEN DEQUEUED FOR A TERMINAL. INITIATE A TIMEOUT ON THE LINE WHICHF=; WILL CAUSE DTR TO DROP AND THE TERMINAL TO BE LOGGED OUT.;;H ; INPUTS: ; R5 => U.TSTA OF TERMINAL UCB7; R4 => UCBX FOR TERMINAL (ONLY IF T$$SPL IS DEFINED)T; R3 => CURRENT I/O PACKET;G; OUTPUTS: NONE.;Q$; REGISTERS MODIFIED: R0, R1, R2;-; PPHNG::* .IF DF T$$SPL)  MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBX  MOV #120000,R4 ;POINT TO UCBX   .IFF ;T$$SPLH ) MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBXL .ENDC ;T$$SPL .IF DF T$$MOD- BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?G> BEQ ADHSUC ;IF EQ, LINE IS LOCAL. DO NOT KILL I/O ; LK722 ; LK722R0 MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS ;**-29 BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIERS6 MOV #CT.TIM,R2 ;SET INDEX FOR MODEM TIMEOUT ROUTINE .IF DF T$$OVL* MOV #CTRD,-(SP) ;GET ADDRESS OF ROUTINE% CALL MPROT ;AND MAP AND CALL CTRDT  .IFF ;T$$OVLT!:" CALL CTRD ;INITIATE TIMEOUT WHICH WILL CAUSE DTR TO BE2# ;DROPPED AND THE USER OF THE LINE LOGGED OUT$ .ENDC ;T$$OVL%+& MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS && BNE 20$ ;IF NE, FINISH I/O ;SRC8& RETURN ;ELSE RETURN (PACKET WAS TAKEN BY LAT) ;SRC(10$: ;**-1A)* .ENDC ;T$$MOD+', MOV R3,-(SP) ;SAVE IO PACKET POINTERR-. .IF DF T$$OVL/,0 MOV #I1CTXL,-(SP) ;GET ADDRESS OF ROUTINE*1 CALL MPROT ;AND MAP AND CALL FLUSH TAB234 .IF NDF T$$SPL56 TST R4 ;IS THERE A UCBX?/7 BEQ 15$ ;IF NOT, DON'T KILL INPUT OR OUTPUTU89 .ENDC ;NDF T$$SPL:5; MOV #IE.ABO&377,R0 ;SET COMPLETION STATUS FOR READ ,< MOV #KILLI1,-(SP) ;GET ADDRESS OF ROUTINE+= CALL MPROT ;AND MAP AND CALL KILL INPUTN<= MOV #IE.DNR&377,R0 ;SET COMPLETION STATUS FOR WRITE ;SRC,> MOV #KILLO1,-(SP) ;GET ADDRESS OF ROUTINE,? CALL MPROT ;AND MAP AND CALL KILL OUTPUT@A .IFF ;T$$OVLIBC CALL I1CTXL ;FLUSH TABDE .IF NDF T$$SPLFG TST R4 ;IS THERE A UCBX?/H BEQ 15$ ;IF NOT, DON'T KILL INPUT OR OUTPUTLIJ .ENDC ;NDF T$$SPLK5L MOV #IE.ABO&377,R0 ;SET COMPLETION STATUS FOR READOM CALL KILLI1 ;KILL INPUTIN<N MOV #IE.DNR&377,R0 ;SET COMPLETION STATUS FOR WRITE ;SRCO CALL KILLO1 ;KILL OUTPUTPQ .ENDC ;T$$OVLR.S15$: MOV (SP)+,R3 ;RESTORE IO PACKET POINTERT20$:U .IF DF T$$MHUV1W BIT #S3.MHE,4(R5) ;IS CHARACTERISTIC ENABLED?$X BEQ ADHSUC ;BR IF NOYZ .IF DF T$$SPL[6\ MOV #120000,R4 ;POINT TO UCBX. IT IS POSSIBLE THAT+] ;A CALL FROM FPORD TO THE EXEC CAUSES.*^ ;US TO LOSE THE VALUE THAT WAS IN R4_` .IFF ;T$$SPLSa)b MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBXcd .ENDC ;T$$SPLe%f MOV U.TMHA(R4),R1 ;GET ACB ADDRESSLgh .IF DF T$$OVLij MOV #QUEAEN,-(SP)k CALL MPROT ;QUE AST TO TASK lm .IFF ;T$$OVL:n+o CALL QUEAEN ;QUEUE AST TO ATTACHED TASK pq .ENDC ;T$$OVLr .ENDC ;T$$MHUstu;Su; HERE TO COMPLETE AN IO.ATT, IO.DET, IO.ORG OR IO.HNG I/O WITH A SUCCESS ;SA464 >w; (ADHSUC) OR A PRESET (ADHFIN) COMPLETION STATUS. ;**-1x;H yADHSUC:4%z MOV #IS.SUC,R0 ;SET SUCCESS STATUSX {ADHFIN:,| .IF DF T$$OVL}%~ CLR R1 ;CLEAR SECOND WORD OF IOSB4& CALLR $IOFIN ;FINISH IO AND RETURN .IFF ;T$$OVLA( JMP IOFIN ;F00b5{ccccINISH OFF THE I/O PACKET .ENDC ;T$$OVL ;SA464 ;SA464.PAGE ;SA464O ;SA464 .IF DF T$$LTH ;SA464 ;SA464F .SBTTL PPORG - POST-QUEUE PROCESSING FOR ORIGINATE REQUESTS ;SA464; ;SA464O;+ ;SA464K; **-PPORG - POST-QUEUE PROCESSING TO ORIGINATE A CONNECTION TO A ;SA464 .; TERMINAL SERVER (ORIGINATE) ;SA464; ;SA464;P; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.ORG REQUEST HAS ;SA464O; BEEN DEQUEUED FOR A TERMINAL. CHECK THAT THIS HAS BEEN ESTABLISHED ;SA464 J; AS A LAT APPLICATION TERMINAL AND IF SO, CALL THE LAT PROCESS. ;SA464; ;SA464P; INPUTS: ;SA464O,; R5 => U.TSTA OF TERMINAL UCB ;SA464@; R4 => UCBX FOR TERMINAL (ONLY IF T$$SPL IS DEFINED) ;SA464(; R3 => CURRENT I/O PACKET ;SA464; ;SA464("; OUTPUTS: NONE. ;SA464; ;SA464U); REGISTERS MODIFIED: R0 ;SA464O;- ;SA464; ;SA464 PPORG:: ;SA464  .IF DF T$$SPL ;SA464 ;SA4643 MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBX ;SA464S+ MOV #120000,R4 ;POINT TO UCBX ;SA464  ;SA464 .IFF ;T$$SPL ;SA464S ;SA4643 MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBX ;SA464 ;SA464 .ENDC ;T$$SPL ;SA464 ;SA464C BIT #S6.LAT,U.TST6-U.TSTA(R5) ;LAT APPLICATION TERMINAL? ;SA464E: BNE 10$ ;IF NE, YES...CAN ORIGINATE CONNECTION ;SA464B MOV #!,R0 ;CONNECTION REJECTED ;SA464 ;SA4649 BR ADHFIN ;COMPLETE REQUEST WITH ERROR STATUS ;SA464#10$: ;SA4641 MOV R3,-(SP) ;SAVE I/O PACKET POINTER ;SA464 < MOV R3,R0 ;GET IRP ADDRESS TO R0 FOR LAT PROCESS ;SA464= MOV #PO$ORG,R3 ;GET ORIGINATE CODE FOR LAT PROCESS ;SA464  ;SA464 .IF DF T$$OVL ;SA464 ;SA4645 MOV #LTPRC,-(SP) ;GET ADDRESS OF ROUTINE ;SA464.0 CALL MPROT ;AND MAP AND CALL LTPRC ;SA464 ;SA464 .IFF ;T$$OVL ;SA4644 ;SA464* CALL LTPRC ;CALL LAT PROCESS ;SA464 ;SA464 .ENDC ;T$$OVL ;SA464 ;SA4644 MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS ;SA464- TST R0 ;ERROR BACK FROM PROCESS? ;SA464 ; BNE ADHFIN ;IF NE, NO - ERROR, COMPLETE REQUEST ;SA4644; RETURN ;ELSE RETURN, LAT WILL COMPLETE REQUEST ;SA464V) ;WHEN CONNECTION COMPLETES ;SA464A ;SA464 ;SA464 .ENDC ;T$$LTH ;SA464 ;SA464 ;SA464.PAGE4C .SBTTL PPSPC/PPSPC1 - POST-QUEUE PROCESSING FOR SPECIAL REQUESTS.;;;+8; **-PPSPC - POST-QUEUE PROCESSING FOR SF.SMC REQUESTSD; **-PPSPC1 - POST-QUEUE PROCESSING FOR IO.GTS AND SF.GMC REQUESTS;6N; THESE ROUTINES ARE DISPATCHED TO FROM TTINI TO PROCESS IO.GTS, SF.GMC, ANDO; SF.SMC REQUESTS. PPSPC IS USED WHEN AN SF.SMC REQUEST IS DEQUEUED. PPSPC1 K; IS USED WHEN AN IO.GTS OR SF.GMC REQUESTS ARE INITIATED, SINCE THEY CAN4; COMPLETE ASYNCHRONOUSLY.; ; INPUTS:$; R5 => U.TSTA OF THE TERMINAL UCB; R3 => CURRENT I/O PACKET;T; OUTPUTS: NONE.;C,; REGISTERS MODIFIED: R0, R1, R2, R3, R4L; R1 IS PRIMARILY USED AS A POINTER INTO THE USER'S CHARACTERISTIC BUFFER.;-;T;KEEP THIS IN APR 5F .IF NDF T$$OVL. .PSECT MAP5 .ENDC ;T$$OVL .IF DF T$$SMC PPSPC::  .IF NDF T$$SPL / .IF DF T$$OVL ;IF OVERLAID TTDRV ;TMS050E ;TMS050< MOV (SP),-(SP) ;FORCE A REMAP FIRST BEFORE CKTAB ;TMS050< MOV 4(SP),2(SP) ;BRING UP THE APR BIAS ON STACK ;TMS050@ MOV #CKTAB,4(SP) ;THIS REQUEST MAY WANT TO CREATE OR ;TMS050- ;REMOVE A TYPE-AHEAD BUFFER - ;TMS050O& ;CHECK ON THE WAY OUT ;TMS050 ;TMS050I4 .IFF ;DF T$$OVL ;IF NOT OVERLAID TTDRV ;TMS050 ;TMS0507 MOV #CKTAB,-(SP) ;THIS REQUEST MAY WANT TO CREATE ORP# 00j<|tt tfDATA;REMOVE A TYPE-AHEAD BUFFER -D ;CHECK ON THE WAY OUT ! .ENDC ;DF T$$OVL ;TMS050R ;TMS050A .ENDC ;NDF T$$SPL2 MOV #IRESEL,-(SP) ;RESET S1 BITS ON THE WAY OUT .ENDC ;T$$SMC .IF DF T$$GTS!T$$GMC!T$$SMC8PPSPC1::MOV I.PRM(R3),KISAR6 ;MAP USER BUFFER IN APR 6> MOV I.PRM+2(R3),R1 ;GET START OF BUFFER (WE KNOW IT IS ON A ;WORD BOUNDARY)R .ENDC ;T$$GTS!T$$GMC!T$$SMC .IF DF T$$GTS' CMP I.FCN(R3),#IO.GTS ;IS IT IO.GTS?M9 BNE CHKCHR ;IF NE, NO...CHECK GET/SET CHARACTERISTICS;.3; PROCESS REQUESTS TO GET TERMINAL DRIVER SUPPORT;N: MOV #TSP1,(R1)+ ;STORE FIRST WORD OF SUPPORT PARAMETERS. CMP I.PRM+4(R3),#2 ;WANTS MORE THAN 1 WORD?5 BEQ JCHRSC ;IF EQ, NO...GIVE ONLY WHAT USER WANTS6% MOV #TSP2,(R1)+ ;STORE SECOND WORDI .ENDC ;T$$GTS .IF DF T$$GTS!T$$GMC!T$$SMC JCHRSC:R" JMP CHRSUC ;FINISH OFF REQUEST CHKCHR: -; BR NXTCHR ;CHECK CHARACTERISTICS SUPPORTG .ENDC ;T$$GTS!T$$GMC!T$$SMC.PAGEH? .SBTTL . NXTCHR - PROCESSING LOOP FOR SF.GMC/SF.SMC REQUESTS  .IF DF T$$GMC!T$$SMC(;RF; LOOP HERE TO START PROCESSING NEXT CHARACTERISTIC FROM USER BUFFER;W NXTCHR:Q& SUB #2,I.PRM+4(R3) ;ANY MORE TO DO?9 BMI JCHRSC ;IF MI, NO...FINISH SUCCESSFUL I/O REQUEST: MOVB (R1)+,R0 ;GET NEXT CHARACTERISTIC FROM USER BUFFER. BEQ ERCNIH ;IF EQ, BAD CODE...RETURN ERROR CMP R0,#MCHI ;TOO HIGH?2 BHI ERCNIH ;IF HI, YES...RETURN BAD CODE ERROR ASL R0 ;MULTIPLY CODE BY 2) ADD #MCTAB-2,R0 ;MAKE POINTER IN MCTABM .IF DF T$$SPL9 MOV $DALED,KISAR6 ;MAP CHARACTERISTIC TABLE (IN TTCOM)O .IFTF ;T$$SPL CLR R2 ;INIT BITMASK+ BISB (R0)+,R2 ;GET BITMASK FOR THIS CODEO# MOVB (R0)+,R4 ;GET OFFSET IN UCBI4 MOV -(R0),R0 ;GET FULL WORD IF SUBROUTINE ADDRESS .IFT ;T$$SPLU- MOV I.PRM(R3),KISAR6 ;RESTORE TASK MAPPINGN) TST R0 ;IS CHARACTERISTIC RECOGNIZED?E .ENDC ;T$$SPL: BEQ ERCNIH ;IF EQ, UNRECOGNIZED CHARACTERISTIC...ERROR6 BPL 10$ ;IF PL, NOT A SUBROUTINE...PROCESS BITMASK@ CMP R0,#160000 ;NEGATIVE OFFSET (NOT A SUBROUTINE AFTER ALL)?5 BHIS 10$ ;IF HIS, NOT A SUBROUTINE ADDRESS...SKIPS .IF DF T$$GMC&T$$SMCH< CMP I.FCN(R3),#SF.GMC ;DO TEST FOR SF.GMC BEFORE DISPATCH .ENDC ;T$$GMC&T$$SMCD7 CALL (R0) ;DISPATCH TO ROUTINE TO HANDLE SPECIAL...O$ ;...CASES OF SF.GMC AND SF.SMC. BR NXTCHR ;LOOP TO GET NEXT CHARACTERISTIC 10$:+  ADD R5,R4 ;POINT TO UCB OFFSET + U.TSTA.4  SUB #U.TSTA,R4 ;BACK UP POINTER TO THE UCB OFFSET   .ENDC ;T$$GMC!T$$SMCN .IF DF T$$GMC&T$$SMCI' CMP I.FCN(R3),#SF.SMC ;IS IT SF.SMC?U6 BEQ 100$ ;IF EQ, YES...PROCESS SET CHARACTERISTICS .ENDC ;T$$GMC&T$$SMC; .IF DF T$$GMC;T>; PROCESS REQUEST TO RETURN TERMINAL CHARACTERISTICS TO USER;I5 MOVB (R4),(R1) ;STORE CURRENT VALUE IN USER BUFFER  MOVB R2,R0 ;COPY BITMASK COMB R0 ;INVERT IT' BICB R0,(R1) ;CLEAR IRRELEVANT BITSS20$:  ASRB R2 ;SHIFT BITMASK RIGHT! BCS 30$ ;CARRY - JUMP3" RORB (R1) ;SHIFT VALUE IN USER BUFFER RIGHT TOOM# BR 20$ ;LOOP$30$:-% INC R1 ;SKIP OVER VALUE FIELD JUST STOREDS.& BR NXTCHR ;LOOP TO GET NEXT CHARACTERISTIC'( .ENDC ;T$$GMC)* .IF DF T$$SMC+,;C3-; PROCESS REQUEST TO SET TERMINAL CHARACTERISTICSR.;I/100$: <0 MOVB -1(R1),R0 ;GET CHARACTERISTIC CODE WE ARE PROCESSING/1 CMPB #TC.WID,R0 ;WANT TO CHANGE BUFFER SIZE?0,2 BNE 110$ ;IF NE, NO...SKIP TO NEXT CHECK33 CMPB #15.,(R1) ;TRYING TO MAKE BUFFER TOO SMALL?+4 BLO 200$ ;IF LO, NO...SKIP TO SET WIDTHI)5 BR ERCVL1 ;RETURN INVALID VALUE ERRORR6110$:O*7 CMPB #TC.ISL,R0 ;WANT TO CHANGE U.UNIT??8 BEQ ERCFIX ;IF EQ, YES...NOT ALLOWED - FIXED CHARACTERISTICF89 CMPB #TC.PRI,R0 ;TRYING TO CHANGE TERMINAL PRIVILEGE?>: BEQ ERCPRI ;IF EQ, YES...NOT ALLOWED - PRIVILEGE VIOLATION;< .IF DF T$$MOD=;> CMPB #TC.ABD,R0 ;WANT TO CHANGE00r5{cccc AUTOBAUD CHARACTERISTIC?E-? BEQ 120$ ;IF EQ, YES...MUST BE PRIVILEGED 8@ CMPB #TC.ASP,R0 ;WANT TO CHANGE DEFAULT ANSWER SPEED?4A BNE 200$ ;IF NE, NO...PROCESS THE CHARACTERISTICB120$: 1C MOV I.TCB(R3),R0 ;GET ISSUING TASK TCB ADDRESS 1D BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED?L6E BEQ ERCPRI ;IE EQ, NO...RETURN PRIVILEGE VIOLATIONFG .ENDC ;T$$MODHI200$:B+J MOV R2,-(SP) ;SAVE BITMASK TO BE CHANGEDE0K MOVB (R1),R0 ;GET NEW VALUE FROM USER BUFFERL210$:; M ASRB R2 ;SHIFT BITMASK RIGHT.N BCS 220$ ;IF CS, SHIFTED FAR ENOUGH...SKIP!O ROLB R0 ;SHIFT NEW VALUE LEFT #P BR 210$ ;LOOP FOR MORE SHIFTING2Q220$:N(R ROLB R2 ;PICK UP LOST BIT FROM CARRY'S COMB R2 ;INVERT RIGHT-ADJUSTED MASK %T BITB R2,(R1)+ ;NEW VALUE IN RANGE?;6U BNE ERCVAL ;IF NE, NO...RETURN INVALID VALUE ERROR"V BICB (SP)+,@R4 ;CLEAR OLD VALUEW BISB R0,@R4 ;SET NEW VALUEXY .IF DF T$$SERZ.[ CMPB -2(R1),#TC.TBM ;SERIAL CHARACTERISTIC?\ BNE 300$ ;IF NE, NO...SKIP$] TSTB R0 ;NOSERIAL NOW IN EFFECT?^ BNE 300$ ;IF NE, NO...SKIPB_ BIC #UM.CMD,U.MUP-U.TSTA(R5) ;ELSE, YES...CLEAR CMD IN PROGRESS`300$:2ab .ENDC ;T$$SERc!d CMPB #TC.PTH,-2(R1) ;PASSTHRU? e BNE 301$ ;BR IF NOTD$f BIC #S1.PTH,(R5) ;CLEAR OLD VALUEgh ASSUME S1.PTH*400,S3.PTHNi$j SWAB R0 ;GET BYTE IN RIGHT PLACE%k BISB R0,(R5) ;SET OR CLEAR S1.PTH4l301$:Wm/n;PROCESS FORMFEED AND NO-ECHO CHARACTERISITCSTo;E9p CMPB #TC.NEC,-2(R1) ;IS THIS A NO-ECHO CHARACTERISTIC?T)q BNE 303$ ;BR IF NOT TO CHECK FORMFEED 4r BIC #U2.NEC,U.CW2-U.TSTA(R5) ;Y - CLEAR OLD VALUEst ASSUME S4.HFF*400,U2.HFFu ASSUME S3.NEC*400,U2.NEC*2vw ASRB R0 ;GET NEW VALUE x BR 305$ ;BR TO SET NEW VALUEy303$:1:z CMPB #TC.HFF,-2(R1) ;IS THIS A FORMFEED CHARACTERISTIC?8{ BNE NXTCHR ;IF NE, NO...LOOP FOR NEXT CHARACTERISTIC=| BIC #U2.HFF,U.CW2-U.TSTA(R5) ;Y - CLEAR OLD FORMFEED VALUE }305$:H5~ BISB R0,U.CW2+1-U.TSTA(R5) ;SET NEW FORMFEED VALUE + BR NXTCHR ;LOOP FOR NEXT CHARACTERISTIC  .ENDC ;T$$SMC.PAGE#6 .SBTTL . ERROR HANDLING FOR GET/SET CHARACTERISTICS;4'; ERRORS IN SF.GMC OR SF.SMC REQUESTS.; .IF DF T$$GMC!T$$SMCWHERCNIH: MOV #!,R0 ;ILLEGAL CHARACTERISTIC TYPE .ENDC ;T$$GMC!T$$SMCI CHRFN1:H1 DEC R1 ;BACK UP CHARACTERISTIC BUFFER POINTERC BR CHRFIN ;FINISH IT OFF .IF DF T$$SMC:ERCPRI: MOV #IE.PRI&377,R0 ;ATTEMPT TO EXCEED PRIVILEGES BR CHRFN1 ;FINISH IT OFF9ERCVAL: TST (SP)+ ;CLEAN UP STACK FOR THIS ENTRY POINTT1 DEC R1 ;BACK UP CHARACTERISTIC BUFFER POINTER4 ERCVL1:SB MOV #!,R0 ;ILLEGAL CHARACTERISTIC VALUE BR CHRFIN ;FINISH IT OFFJERCFIX: MOV #!,R0 ;ATTEMPT TO CHANGE FIXED CHAR. BR CHRFN1 ;FINISH IT OFF .IF DF D$$H11!D$$Z11!D$$V11IERCSPD: MOV #!,R0 ;INVALID SPEED FOR CONTROLLER0 BR CHRFN1 ;FINISH IT OFF .ENDC ;D$$H11!D$$Z11!D$$V11 .IFTF ;T$$SMCKERCNSC:: MOV #!,R0 ;NOT A SETTABLE CHARACTERISTICO BR CHRFN1 ;FINISH IT OFF .IFT ;T$$SMC0, .IF DF T$$SPL!T$$SCA!T$$MHU!T$$ICS!T$$OOBGERCUPN: MOV #!,R0 ;STORAGE ALLOCATION FAILUREH BR CHRFN1 ;FINISH IT OFF, .ENDC ;T$$SPL!T$$SCA!T$$MHU!T$$ICS!T$$OOB% .IF DF T$$SCA!T$$MHU!T$$ICS!T$$OOB*@ERCIAA: MOV #!,R0 ;ILLEGAL AST ADDRESS BR CHRFN1 ;FINISH IT OFF% .ENDC ;T$$SCA!T$$MHU!T$$ICS!T$$OOBM .ENDC ;T$$SMC .IF DF T$$GTS!T$$GMC!T$$SMC CHRSUC:H1 MOV #IS.SUC,R0 ;SET SUCCESSFUL COMPLETION CODE. .ENDC ;T$$GTS!T$$GMC!T$$SMC CHRFIN:U0 SUB I.PRM+2(R3),R1 ;GET OFFSET IN USER BUFFER1 MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING.& JMP $IOFIN ;FINISH THE I/O REQUEST.PAGED4 .SBTTL . GET/SET TERMINAL CHARACTERISTICS SUPPORT4 .SBTTL . MC*SP - TERMINAL SPEED (RCV/XMT/ANSWER) .IF DF T$00z<|tt tfDATA$GMC!T$$SMC;$); GET/SET RECEIVE/TRANSMIT/ANSWER SPEED$;G .IF DF D$$H11!D$$Z11!D$$V11 ;ONLY DH11, DZ11 AND DHV11 CAN SET SPEEDC MCRSP::I MCXSP:: .IF DF T$$MOD MCASP:: .ENDC ;T$$MOD .IF DF T$$GMC&T$$SMCU BEQ 310$ ;GET SPEED - JUMP .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC;R ; SET SPEEDD;., MOVB (R1)+,R0 ;SET SPEED - GET USER VALUE3 BEQ ERCVAL ;IF EQ, INVALID CHARACTERISTIC VALUEE CMP R0,#SPHI ;IN RANGE?8 BHI ERCVAL ;IF HI, NO...INVALID CHARACTERISTIC VALUE2 CALL SPDPRM ;CALL CONTROLLER DEPENDENT ROUTINE, BCC 10$ ;IF CC, SUCCESSFUL SPEED SETTING? MOV #ERCSPD,(SP) ;CHANGE RETURN ADDRESS TO PROCESS THE ERRORC10$:- RETURN ;RETURN FOR MORE/ERROR COMPLETION3 .ENDC ;T$$SMC .IF DF T$$GMC; ; GET SPEED$;*310$: MOV #100000,R0 ;INDICATE GET SPEED' INC R1 ;BUMP POINTER IN USER BUFFERE2 CALL SPDPRM ;CALL CONTROLLER DEPENDENT ROUTINE .IF DF T$$MOD" BIT #1000,R0 ;GET ANSWER SPEED? BEQ 320$ ;N - JUMP0 MOVB U.CW3+1-U.TSTA(R5),R0 ;GET ANSWER SPEED? BR 330$ ;JOIN COMMON CODED .ENDC ;T$$MOD 320$:G+  MOVB U.CW3-U.TSTA(R5),R0 ;GET SPEED BITS:'  CMPB -2(R1),#TC.XSP ;TRANSMIT SPEED?L-  BNE 330$ ;N - MUST BE RECEIVE SPEED, JUMPG  .IF DF R$$EIS< ASH #-4,R0 ;PUT TRANSMIT SPEED BITS INTO PROPER POSITION .IFF ;R$$EISS8 ASR R0 ;PUT TRANSMIT SPEED BITS INTO PROPER POSITION  ASR R0 ;  ASR R0 ;  ASR R0 ; .ENDC ;R$$EIS0330$: BIC #^C<17>,R0 ;CLEAR ALL BUT SPEED BITS .IF DF T$$SPL!T$$ONI$- MOV $DALED,KISAR6 ;MAP DRIVER SPEED TABLES2 ! .ENDC ;T$$SPL!T$$ONI)"*# MOV R4,-(SP) ;SAVE START OF SPEED TABLE/$ MOV #SPHI,R2 ;GET NUMBER OF ENTRIES IN TABLE %340$: CMPB R0,(R4)+ ;MATCH?E& BEQ 350$ ;Y - JUMP' SOB R2,340$ ;N - LOOPO2( MOV @SP,R4 ;UNRECOGNIZED SPEED - RETURN A ZERO))350$: SUB (SP)+,R4 ;GET OFFSET IN TABLEI*+ .IF DF T$$ONI!T$$SPL ,-- MOV I.PRM(R3),KISAR6 ;RESTORE TASK MAPPING ./ .ENDC ;T$$ONI!T$$SPL 0'1 MOVB R4,-1(R1) ;STORE IN USER BUFFER+2 RETURN ;RETURN FOR NEXT CHARACTERISTIC234 .ENDC ;T$$GMC56.PAGE)7 .SBTTL . MCPAR/MCEPA - PARITY OPTIONS8;V49; GET/SET PARITY GENERATION AND CHECKING AND SENSE:;, ; .ENABL LSB< =MCPAR:: >? .IF DF T$$GMC&T$$SMCL@8A BEQ 1000$ ;GET PARITY GENERATION AND CHECKING - JUMPBC .ENDC ;T$$GMC&T$$SMCIDE .IF DF T$$SMCFG;T&H; SET PARITY GENERATION AND CHECKINGI;T8J BIC #U3.PAR,U.CW3-U.TSTA(R5) ;ASSUME DISABLING PARITY K TSTB (R1)+ ;CHECK ASSUMPTIONL BEQ 1010$ ;CORRECT - JUMPAFM BIS #U3.PAR,U.CW3-U.TSTA(R5) ;ENABLE PARITY GENERATION AND CHECKING8N BR 1010$ ;JOIN COMMON CODE TO CHANGE LINE PARAMETERSOP .ENDC ;T$$SMCQR .IF DF T$$GMCST;A&U; GET PARITY GENERATION AND CHECKINGV;QW1000$:+X CLRB (R1) ;ASSUME PARITY IS NOT ENABLED+Y BIT #U3.PAR,U.CW3-U.TSTA(R5) ;CHECK THATCZ BEQ 1030$ ;CORRECT - JUMPR*[ INCB (R1) ;SHOW THAT PARITY IS ENABLED7\ BR 1030$ ;JOIN COMMON CODE TO CHECK LINE PARAMETERSH]^ .ENDC ;T$$GMC_`;Ca; GET/SET PARITY SENSEb;U cMCEPA::(de .IF DF T$$GMC&T$$SMC f&g BEQ 1020$ ;GET PARITY SENSE - JUMPhi .ENDC ;T$$GMC&T$$SMCjk .IF DF T$$SMClm;Dn; SET PARITY SENSEo; p;q BIC #U3.OPA,U.CW3-U.TSTA(R5) ;ASSUME SETTING EVEN PARITYS r TSTB (R1)+ ;CHECK ASSUMPTIONs BNE 1010$ ;CORRECT - JUMPK/t BIS #U3.OPA,U.CW3-U.TSTA(R5) ;SET ODD PARITYRu1010$:7v MOV #6000,R0 ;INDICATE DEVICE DEPENDENT SPEED FORMAT .w BISB U.CW3-U.TSTA(R5),R0 ;GET CURRENT SPEED8x BR 1040$ ;RESET TO CURRENT SPEED AND PARITY SETTINGSyz .ENDC ;T$$SMC{| .IF DF T$$GMC}~; ; GET PARITY SENSE;;1020$:  CLRB (R1) ;ASSUME ODD PARITY ASSUME U3.OPA,100000# TST U.CW3-U.TSTA(R5) ;CHECK THAT( BMI 1030$ ;CORRECT - JUMPS INCB (R1) ;SHOW EVEN PARITYN1030$: INC R1 ;BUMP POINTER%005{cccc MOV #100000,R0 ;INDICATE GET SPEEDP .ENDC ;T$$GMC .IF DF T$$GMC ! T$$SMC ;N1040$:8 CALL CTRPRM ;MAKE SURE INTERFACE HAS SETTABLE PARITY5 RETURN ;RETURN TO CALLER FOR NEXT CHARACTERISTICS .ENDC ;DF T$$GMC ! T$$SMC ; LK710 B .SBTTL . MCCLN - SETTING (7/8-BIT) CHARACTER LENGTH ; LK710 ; LK7100; ; LK710,; GET/SET CHARACTER LENGTH ; LK710; ; LK710 ; LK7100MCCLN:: ; LK710 ; LK710 $ .IF DF T$$GMC&T$$SMC ; LK710 ; LK710$0 BEQ 1050$ ;GET CHAR LENGTH - JUMP ; LK710 ; LK710T& .ENDC ; T$$GMC&T$$SMC ; LK710 ; LK710R .IF DF T$$SMC ; LK710 ; LK710 ; ; LK710,; SET 7-BIT CHARACTER LENGTH ; LK710; ; LK7108 BIC #S5.CLN,U.TST5-U.TSTA(R5) ;ASSUME 8-BIT ; LK710+ TSTB (R1)+ ;CHECK ASSUMPTION ; LK710) BEQ 1060$ ;CORRECT - JUMP ; LK710L5 BIS #S5.CLN,U.TST5-U.TSTA(R5) ;SET 7-BIT ; LK710 A BR 1060$ ; JOIN COMMON CODE TO CHANGE LINE PARAMETERS ; LK710M ; LK710  .ENDC ;T$$SMC ; LK710$ ; LK710 .IF DF T$$GMC ; LK710 ; LK710; ; LK710'; GET CHARACTER LENGTH ; LK710E; ; LK710 ; LK71001050$: ; LK710S' CLRB (R1) ;ASSUME 8-BIT ; LK710R6 BIT #S5.CLN,U.TST5-U.TSTA(R5) ;CHECK THAT ; LK710) BEQ 1070$ ;CORRECT - JUMP ; LK710T* INCB (R1) ;SET 7-BIT LENGTH ; LK710? BR 1070$ ;JOIN COMMON CODE TO CHECK LINE PARAMETERS ; LK710  ; LK710N .ENDC ;T$$GMC ; LK710  ; LK710F ; LK7107 .IF DF T$$SMC ; LK710 ; LK710E;1060$: MOV #10000,R0 ;INDICATE SET 7-BIT LENGTH ; LK710  BR 1080$ ; LK710 ; LK710C$ .ENDC ; DF T$$SMC ; LK710 ; LK710- .IF DF T$$GMC ; LK710 ; LK710E*1070$: INC R1 ;BUMP POINTER ; LK7100 MOV #20000,R0 ;INDICATE GET LENGTH ; LK710 ; LK710R% .ENDC ;DF T$$GMC ; LK710 ; LK710 & .IF DF T$$GMC ! T$$SMC ; LK710 ; LK710F1080$: ; LK710@ CALL CTRPRM ;MAKE SURE INTERFACE HAS SETTABLE LENGTH ; LK710> RETURN ;RETURN TO CALLER FOR NEXT CHARACTERISTICS ; LK710 ; LK710S. .ENDC ;DF T$$GMC ! T$$SMC ; LK710 ; LK7100 ; LK710E  .DSABL LSBR;P9; LOCAL SUBROUTINE TO CALL CONTROLLER-DEPENDENT ROUTINE ;7 SPDPRM: & CMPB -2(R1),#TC.RSP ;RECEIVE SPEED? BEQ 10$ ;IF EQ, YES...SKIP( BIS #400,R0 ;N - FLAG TRANSMIT SPEED10$: .IF DF T$$MOD% CMPB -2(R1),#TC.ASP ;ANSWER SPEED?  BNE CTRPRM ;IF NE, NO...SKIP& BIS #1000,R0 ;Y - FLAG ANSWER SPEED .ENDC ;T$$MOD CTRPRM:  MOV R1,-(SP) ;Save R1- CLR R1 ;Indicate not flow control change.  .ENDC ;D$$H11!D$$Z11!D$$V11 .ENABLE LSBCTRPR2: MOV #10$,-(SP); CALL MPCCOR ;MAP DRIVER DATA AND RETURN AS A CO-ROUTINE 7 MOV #CT.PRM,R2 ;SET INDEX FOR LINE PARAMETER ROUTINE. .IF DF T$$OVL* MOV #CTRD,-(SP) ;GET ADDRESS OF ROUTINE  CALL MPROT ;AND GOTO ROUTINE: RETURN ;CAN'T USE CALLR CAUSE OF STACK INPUT TO MPROT .IFF ;T$$OVLW9 CALLR CTRD ;CALL CONTROLLER ROUTINE AND PRESERVE CC-C  .ENDC ;T$$OVL10$:- MOV (SP)+,R1 ;Restore R1 and preserve CC-C1 RETURN ;Done;N .DSABLE LSB.PAGE1= .SBTTL . MCTSY, MCHSY, MCBIN - FLOW CONTROL STATUS CHANGEN  .ENABL LSBP"MCTSY:: ; OUTPUT FLOW CONTROL .IF DF T$$GMC&T$$SMCL2 BEQ 9100$ ;GET OUTPUT FLOW CONTROL INFO - JUMP .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC;E; SET OUTPUT FLOW CONTROL;F6 MOV #^B<1000>,-(SP) ; ASSUME NO OUTPUT FLOW CONTROL8 BIC #S3.TSY,-U.TSTA(R5) ; ASSUME NO TTSYNCH! TSTB (R1)+ ; CHECK ASSUMPTION-) BEQ 9900$ ; CORREC00<|tt tfDATAT - NOTIFY THE PORTB2 BIS #S3.TSY,-U.TSTA(R5) ; SET TTSYNCH8 MOV #^B<0100>,(SP) ; SET FLAG FOR ENABLE FLOW CONTROL BR 9900$ ; NOTIFY THE PORT .ENDC ;T$$SMC .IF DF T$$GMC39100$: CLRB (R1) ; ASSUME NO OUTPUT FLOW CONTROLT- BIT #S3.TSY,-U.TSTA(R5) ; CHECK  BEQ 9950$ ; CORRECT - RETURN( INCB (R1) ; SHOW OUTPUT FLOW CONTROL BR 9950$ ; AND RETURNS .ENDC ;T$$GMC!MCHSY:: ; Input flow controlA .IF DF T$$GMC&T$$SMCO1 BEQ 9200$ ;Get input flow control info - JumpS .ENDC ;T$$GMC&T$$SMC# .IF DF T$$SMC;A; Set input flow control;N5 MOV #^B<0010>,-(SP) ; ASSUME NO INPUT FLOW CONTROLG7 BIC #S4.HSY,-U.TSTA(R5) ; Assume no HSYNCHO! TSTB (R1)+ ; Check assumptionA) BEQ 9900$ ; Correct - Notify the portE1 BIS #S4.HSY,-U.TSTA(R5) ; Set HSYNCHB8 MOV #^B<0001>,(SP) ; SET FLAG FOR ENABLE FLOW CONTROL BR 9900$ ; Notify the port .ENDC ;T$$SMC .IF DF T$$GMC29200$: CLRB (R1) ; Assume no input flow control- BIT #S4.HSY,-U.TSTA(R5) ; Check  BEQ 9950$ ; Correct - Return( INCB (R1) ; Show output flow control BR 9950$ ; And return. .ENDC ;T$$GMC  MCBIN:: ; Read Pass All   .IF DF T$$GMC&T$$SMC0 , BEQ 9300$ ;Get read pass all info - Jump .ENDC ;T$$GMC&T$$SMCY .IF DF T$$SMC;E; Set read pass allC;L6 MOV #^B<1000>,-(SP) ; ASSUME NO OUTPUT FLOW CONTROL; BIS #S3.RAL,-U.TSTA(R5) ; Assume read pass allu! TSTB (R1)+ ; Check assumptionS) BNE 9900$ ; Correct - Notify the port ; BIC #S3.RAL,-U.TSTA(R5) ; Set no read pass all 4 BIT #S3.TSY,-U.TSTA(R5) ; TTSYNCH now?9 BEQ 9900$ ; If EQ no - Notify port of no flow control9 MOV #^B<0100>,(SP) ; Set the output flow control flags$  BR 9900$ ; Notify the port!" .ENDC ;T$$SMC#$ .IF DF T$$GMC%.&9300$: CLRB (R1) ; Assume not read pass all-' BIT #S3.RAL,-U.TSTA(R5) ; Checkm ( BEQ 9950$ ; Correct - Return") INCB (R1) ; Show read pass all* BR 9950$ ; And return+, .ENDC ;T$$GMC-. .IF DF T$$SMC/0;dA1; Notify the port of the flow control status change. The flags2; are passed in R1.-3;f449900$: MOV (SP),-(SP) ; Duplicate the top of stack5 MOV R1,2(SP) ; Save R1l!6 MOV (SP)+,R1 ; Settup the flagt)7 CALLR CTRPR2 ; Call the port and exitC89 .ENDC ;T$$SMC:; .IF DF T$$GMC<=9950$:)> INC R1 ; POINT TO NEXT CHARACTERISTIC$? RETURN ; All done with this one@A .ENDC ;T$$GMCB C .DSABL LSB0D.PAGErEF*G .SBTTL . MCTTP - TERMINAL TYPE OPTIONSH;I; GET/SET TERMINAL TYPEtJ;o KMCTTP::tLM .IF DF T$$GMC&T$$SMC N&O BEQ 460$ ;GET TERMINAL TYPE - JUMPPQ .ENDC ;T$$GMC&T$$SMCsRS .IF DF T$$SMCTU;lV; SET TERMINAL TYPE.LW; IF THE TYPE IS RECOGNIZED (CONTAINED IN THE TABLES TTYP1, TTYP2, TTYP3),LX; SET THE CORRESPONDING IMPLICIT CHARACTERISTICS. IMPLICIT CHARACTERISTICSY; ARE: Z; TC.HHT [; TC.HFF \; TC.HFL ]; TC.LPP ^; TC.SCP _; TC.VFL `; TC.WIDa;7b; IN ADDITION, THE CURSOR POSITIONING TYPE IS STORED.Ec; 0d; IN ANY CASE, STORE NEW TYPE VALUE IN U.TTYP.e;Tf CLR R2 ;GET NEW TYPE VALUE-g BISB @R1,R2 ;WITHOUT SIGN EXTEND PROBLEMSs"h BEQ 440$ ;ZERO - UNKNOWN, JUMP*i CMPB R2,#TTPHI ;IN TERMINAL TYPE TABLE?j BHI 440$ ;N - UNKNOWN, JUMPTk1l MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGT/m TSTB TTYP2-1(R2) ;UNSUPPORTED TERMINAL TYPE?Rn BEQ 435$ ;Y - JUMPAo BIC #U2.CRT,U.CW2-U.TSTA(R5) ;ASSUME 0 FOR ALL CHARACTERISTICS=p BIC #S4.HFF!S4.HHT!S4.HFL!S4.VFL,6(R5) ;MORE BITS TO CLEAR Cq BIC #U3.UPC,U.CW3-U.TSTA(R5) ;ASSUME TERMINAL SUPPORTS LOWERCASE;r CMPB R2,#T.AS35 ;CHECK THAT+s BHI 400$ ;ASSUMPTION WAS CORRECT - JUMP0>t BIS #U3.UPC,U.CW3-U.TSTA(R5) ;FORCE CONVERSION TO UPPERCASE9u400$: MOVB TTYP1-1(R2),R0 ;GET IMPLICIT CHARACTERISTICSI,v BICB #300,R0 ;CLEAR OUT CURS005{ccccOR POS. TYPEw;(<x; HFF,HFL,HHT,VFL MUST BE IN THE LOW BYTE OF STATUS WORD 4y;2z .IIF GE S4.HFF-400 .ERROR{ .IIF GE S4.HFL-400 .ERROR| .IIF GE S4.HHT-400 .ERROR} .IIF GE S4.VFL-400 .ERROR7~ BISB R0,6(R5) ;STORE IMPLICIT CHARACTERISTICS IN LOWT ;BYTE OF STATUS WORD 4C BIC #U2.HFF,U.CW2-U.TSTA(R5) ;ASSUME NEW TYPE DOESN'T SUPPORT FF#4 BITB #S4.HFF,R0 ;WAS FORMFEED CHARACTERISTIC SET? BEQ 420$ ;N - JUMP> BIS #U2.HFF,U.CW2-U.TSTA(R5) ;INDICATE TERMINAL SUPPORTS FF420$:P? MOVB TTYP2-1(R2),U.CW4-U.TSTA(R5) ;STORE IMPLICIT PAGE WIDTHAA MOVB TTYP3-1(R2),U.TLPP-U.TSTA(R5) ;STORE IMPLICIT PAGE LENGTH0  BPL 430$ ;NOT A SCOPE - JUMP: BICB #200,U.TLPP-U.TSTA(R5) ;CLEAR SCOPE FLAG IN U.TLPP= BIS #U2.CRT,U.CW2-U.TSTA(R5) ;INDICATE TERMINAL IS A SCOPE430$:2< .IIF LT S4.ABD-400 .ERROR ; ABD MUST BE IN THE HIGH BYTED BICB #^C,7(R5) ;SET EXTENDED TERMINAL CHARACTERISTICS BISB TTYP4-1(R2),7(R5) ; ...D435$: ;REFERENCE LABEL- MOV I.PRM(R3),KISAR6 ;RESTORE TASK MAPPINGT440$:C1 MOVB (R1),U.TTYP-U.TSTA(R5) ;SET TERMINAL TYPE5@ BIC #U2.L3S!U2.VT5,U.CW2-U.TSTA(R5) ;CLEAR TERMINAL TYPE BITS CMPB (R1)+,#T.L30S ;LA30S?; BNE 450$ ;N - JUMP? BIS #U2.L3S,U.CW2-U.TSTA(R5) ;OTHERWISE, SET LA30S TYPE FLAG BR 455$ ;SKIP TO FINISH.#450$: CMPB -1(R1),#T.VT05 ;VT05B?H BNE 455$ ;IF NE, NO...SKIP? BIS #U2.VT5,U.CW2-U.TSTA(R5) ;OTHERWISE, SET VT05B TYPE FLAG-455$:5+ RETURN ;RETURN FOR NEXT CHARACTERISTICV .ENDC ;T$$SMC .IF DF T$$GMC;; GET TERMINAL TYPEA;;460$:N< MOVB U.TTYP-U.TSTA(R5),(R1)+ ;GIVE USER THE TERMINAL TYPE+ RETURN ;RETURN FOR NEXT CHARACTERISTIC .ENDC ;T$$GMC.PAGEL3 .SBTTL . MCTBF - TYPEAHEAD BUFFER COUNT OPTIONS; B; FLUSH TYPEAHEAD OR GET TYPEAHEAD BUFFER ACTIVE CHARACTER COUNT; MCTBF::. .IF DF T$$GMC&T$$SMCU BEQ 510$ ;GET COUNT - JUMP .ENDC ;T$$GMC&T$$SMC  .IF DF T$$SMC;V; FLUSH THE TYPE-AHEAD BUFFERF;$% INC R1 ;SKIP PAST DUMMY SET VALUE9 CALL MPCCOR ;MAP DATABASE AND COME BACK AS CO-ROUTINET .IF DF T$$OVL! MOV #I1CTXL,-(SP) ;GET ADDRESS0 CALL MPROT ;CALL ROUTINE TO FLUSH TYPE AHEAD  RETURN ;BACK FROM COROUTINE .IFF ;T$$OVLY9 CALLR I1CTXL ;FLUSH TYPE-AHEAD BUFFER WITH INTERRUPTS ;LOCKED OUTF .ENDC ;T$$OVL .ENDC ;T$$SMC .IF DF T$$GMC;$9; GET THE NUMBER OF CHARACTERS IN THE TYPE-AHEAD BUFFER ;A510$:E .IF DF T$$SPL7 MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP THE UCBX AND TABUF # MOV #120000+U.TTBF,R2 ;GET TABUF. .IFF ;T$$SPLM1 MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGU& MOV U.TTAB-U.TSTA(R5),R2 ;GET TABUF .IFTF ;T$$SPL, MOVB 2(R2),R2 ;GET ACTIVE CHARACTER COUNT .IFF ;T$$SPLR( MOV I.PRM(R3),KISAR6 ;MAP USER BUFFER .ENDC ;T$$SPL' MOVB R2,(R1)+ ;STORE COUNT IN BUFFERU+ RETURN ;RETURN FOR NEXT CHARACTERISTICA .ENDC ;T$$GMC.PAGEL8 .SBTTL . MCTYP/MCTBS - TYPEAHEAD BUFFER SIZE OPTIONS;.; GET/SET TYPEAHEAD BUFFER PRESENCE AND SIZE;$ .IF DF T$$SPL  .ENABL LSBR MCTYP::N .IF DF T$$GMC&T$$SMCR! BEQ 520$ ;GET PRESENCE - JUMP .ENDC ;T$$GMC&T$$SMCI .IF DF T$$SMC; 1; ENABLE TYPEAHEAD WITH AN OPTIMAL DEFAULT SIZEF;; MOV #<<2*64.>->,R2 ;COMPUTE OPTIMAL TABUF SIZEE)  TSTB (R1)+ ;ASSUME ENABLING TYPEAHEADT  BNE 530$ ;CORRECT - JUMP!  CLR R2 ;INDICATE NO TYPEAHEADS  BR 530$ ;ENFORCE THATT  .ENDC ;T$$SMC .IF DF T$$GMC; K; RETURN WHETHER TYPEAHEAD IS ENABLED OR DISABLED (ENABLED IMPLIES A SIZE.; OF 2 OR GREATER);2520$: MOVB #1,(R1)+ ;ASSUME TYPEAHEAD IS ENABLED BR 580$ ;CHECK THAT  .ENDC ;T$$GMC;P!; GET/SET TYPEAHEAD BUFFER SIZEF; MCTBS::<  .IF DF T$$GMC&T$$SMCE!" BEQ 570$ ;GET COUNT - JUMP#$00<|tt tfDATA .ENDC ;T$$GMC&T$$SMC%& .IF DF T$$SMC'(;5); SET THE SIZE OF THE TYPEAHEAD BUFFER (0 -> 255.).T4*; A SIZE OF ZERO OR ONE IMPLIES TYPEAHEAD DISABLED+;%, CLR R2 ;PREPARE TO PICK UP A BYTE -- BISB (R1)+,R2 ;GET THE USER SPECIFIED SIZEO).530$: MOV R1,-(SP) ;SAVE BUFFER POINTERS>/ MOV #120000+U.TAST,R1 ;SET POINTER TO UNSOLICITED INPUT ACB 0X = U.TAST12 .IF DF T$$CCA364 MOV (R1)+,-(SP) ;SAVE UNSOLICITED INPUT ACB ADDRESS 5X = X + 267 .ENDC ;T$$CCA89 .IF DF T$$SCA:; ASSUME U.TSCA,X <X = X + 25= MOV (R1)+,-(SP) ;SAVE SWITCH CHARACTER ACB ADDRESS>>? .ENDC ;T$$SCA@A .IF DF T$$MHUBC ASSUME U.TMHA,X DX = X + 2;1E MOV (R1)+,-(SP) ;SAVE MODEM HANGUP ACB ADDRESSHFG .ENDC ;T$$MHUHI .IF DF T$$ICSJK ASSUME U.TICA,X LX = X + 20,M MOV (R1)+,-(SP) ;SAVE ICS ACB/TEP ADDRESSNO .ENDC ;T$$ICSPQ .IF DF T$$OOBRS ASSUME U.TOBA,X TX = X + 2I,U MOV (R1)+,-(SP) ;SAVE OOB ACB/TEP ADDRESSVW .ENDC ;T$$OOBXY MOV R2,R1 ;PUT SIZE IN R1 "Z BNE 540$ ;SETTING NOTYPEAHEAD? [ MOV #1,R1 ;Y - SET SIZE TO 1\540$: MOV R1,-(SP) ;SAVE SIZE$<] ADD #T$$UXL+4+77,R1 ;COMPUTE TOTAL NUMBER OF BYTES NEEDED:^ ASH #-6,R1 ;CONVERT TO NUMBER OF SECONDARY POOL BLOCKS)_ CALL $ALSEC ;ATTEMPT TO ALLOCATE THEM` BCS 560$ ;FAILURE - JUMP<a MOV R0,-(SP) ;SAVE ADDRESS OF SEC POOL RETURNED BY $ALSEC7b MTPS #TTPRI ;PREVENT INTERRUPTS WHILE CHANGING SIZE1cd .IF DF T$$OVLe,f MOV $DALED,KISAR6 ;;MAP TO DATA FOR MPROT<g MOV #DEUCBX,-(SP) ;;DEALLOCATE THE CURRENT UCBX AND TABUFh CALL MPROT ;; ... ij .IFF ;T$$OVL-k3l CALL DEUCBX ;;DEALLOCATE CURRENT UCBX AND TABUFUmn .IFTF ;T$$OVLo*p MOV (SP)+,R0 ;;RETRIEVE THE NEW ADDRESS1q MOVB (SP),U.TBSZ-U.TSTA(R5) ;;SET THE NEW SIZEE/r BIS #S3.TAB,4(R5) ;;ASSUME SETTING TYPEAHEAD s DEC (SP)+ ;;CHECK THATt BNE 550$ ;;CORRECT - JUMPI&u BIC #S3.TAB,4(R5) ;;SET NOTYPEAHEADv550$:w .IFT ;T$$OVLx4y MOV #STUCBX,-(SP) ;;CREATE THE NEW UCBX AND TABUFz CALL MPROT ;; ... %{ MOV I.PRM(R3),KISAR6 ;; REMAP TASKO|} .IFF ;T$$OVLF~/ CALL STUCBX ;;CREATE THE NEW UCBX AND TABUFU .ENDC ;T$$OVL: MOV #120000+X,R1 ;;POINT TO FIRST UCBX CELL TO BE MOVED@ .IIF DF T$$OOB, MOV (SP)+,-(R1) ;;RESTORE OOB ACB/TEP POINTER@ .IIF DF T$$ICS, MOV (SP)+,-(R1) ;;RESTORE ICS ACB/TEP POINTERE .IIF DF T$$MHU, MOV (SP)+,-(R1) ;;RESTORE MODEM HANGUP ACB POINTER$E .IIF DF T$$SCA, MOV (SP)+,-(R1) ;;RESTORE SWITCH CHAR. ACB POINTERDE .IIF DF T$$CCA, MOV (SP)+,-(R1) ;;RESTORE UNSOL. INPUT ACB POINTER! MTPS #PR0 ;;ENABLE INTERRUPTSX, MOV (SP)+,R1 ;RESTORE TASK BUFFER POINTER$ RETURN ;GET NEXT CHARACTERISTIC; >; ALLOCATION FAILURE TRYING TO CREATE A NEW TYPEAHEAD BUFFER;)560$:ESTKPOP = X - U.TAST + 2F. ADD #STKPOP,SP ;CLEAR PARAMETERS FROM STACK, MOV (SP)+,R1 ;RESTORE TASK BUFFER POINTER. TST (SP)+ ;CLEAN RETURN ADDRESS FROM STACK) JMP ERCUPN ;REPORT ALLOCATION FAILURE  .ENDC ;T$$SMC .IF DF T$$GMC;E(; GET THE SIZE OF THE TYPEAHEAD BUFFER;;570$:TD MOVB U.TBSZ-U.TSTA(R5),(R1)+ ;GET SIZE ASSUMING TYPEAHEAD ENABLED580$:H+ BIT #S3.TAB,4(R5) ;IS TYPEAHEAD ENABLED?Y BNE 590$ ;CORRECT - JUMP  CLRB -1(R1) ;RETURN SIZE = 0590$:U$ RETURN ;GET NEXT CHARACTERISTIC .ENDC ;T$$GMC  .DSABL LSB  .ENDC ;T$$SPL.PAGET$ .SBTTL . MCCTS - CONTROL-S STATE;; GET/SET CONTROL-S STATUS;L MCCTS:: .IF DF T$$GMC&T$$SMC " BEQ 630$ ;GET ^S STATUS - JUMP .ENDC ;T$$GMC&T$$SMC7 .IF DF T$$SMC;,; SET OR CLEAR ^S CONDITIONE;A0 MOVB (R1)+,R2 ;GET NEW VALUE FROM USER BUFFER> CALL MPCCOR ;MAP DRIVER DATA AND COME BACK AS A CO-ROUTINE TSTB R2 ;ARE WE SETTING ^S?  BNE 610$ ;Y - JUMP;H; NOTE: DUE TO MAPPING COMPLICATIONS, THE FOLLOWING CODE IS DUPLICATED; FROM I1CTSL AND I1CTQL, ;N - FAKE A ^Q. TASK MAPPED O005{ccccN RETURN# CALL LOCKI ;LOCK OUT INTERRUPTSC, BIC #S2.CTS,2(R5) ;;;CLEAR CONTROL-S FLAG2 MOV #CT.RES,R2 ;;;SET INDEX FOR "RESUME OUTPUT"B BITB #US.OIU,U.STS-U.TSTA(R5) ;;;EXPECTING AN OUTPUT INTERRUPT?% BNE 660$ ;;;IF NE, NO...JUST EXITL  BR 620$-610$: ;FAKE A ^S, RETURN WILL REMAP TASK# CALL LOCKI ;LOCK OUT INTERRUPTSE* BIS #S2.CTS,2(R5) ;;;SET CONTROL-S FLAG0 MOV #CT.STP,R2 ;;;SET INDEX FOR "STOP OUTPUT"620$:R .IF DF T$$OVL* MOV #CTRD,-(SP) ;GET ADDRESS OF ROUTINE  CALL MPROT ;AND GOTO ROUTINE  RETURNC .IFF ;T$$OVLA3 CALLR CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINEU .ENDC ;T$$OVL .ENDC ;T$$SMC .IF DF T$$GMC;P!; GET TERMINAL ^S AND ^O STATUST;L1630$: CLRB @R1 ;ASSUME NEITHER ^S OR ^O IS SETM ASSUME S2.CTS,100000K, TST 2(R5) ;VERIFY ASSUMPTION FOR ^S BIT& BPL 640$ ;ASSUMED CORRECTLY - JUMP0 INCB @R1 ;ASSUMPTION WAS WRONG - SET THE BIT9640$: BIT #S2.CTO,2(R5) ;VERIFY ASSUMPTION FOR ^O BITO" BEQ 650$ ;^O IS NOT SET - JUMP6 BISB #2,@R1 ;^O IS SET, SET CORRESPONDING USER BIT650$:O! INC R1 ;SKIP PAST VALUE FIELD ; LK709 .ENDC ;T$$GMC ; LK709  ; LK709A% .IF DF T$$GMC!T$$SMC ; LK709E ; LK709M3660$: RETURN ;GET NEXT CHARACTERISTIC ; LK709E ; LK709S% .ENDC ;T$$GMC!T$$SMC ; LK709  ; LK709S ;**-3-.PAGEB- .SBTTL . MCACD - ANCILLARY CONTROL DRIVERI .IF DF T$$ACD; *; GET/SET ANCILLARY CONTROL DRIVER (ACD);T MCACD::S .IF DF T$$GMC&T$$SMC+ BEQ 810$ ;GET ACD IDENTIFICATION NUMBERK .ENDC ;T$$GMC&T$$SMC   .IF DF T$$SMC  ;3 ; SET/RESET THE ACD ASSOCIATED WITH THIS TERMINAL  ;M4 MOV R1,-(SP) ;SAVE CHARACTERISTICS BUFFER POINTER( MOV R3,-(SP) ;SAVE I/O PACKET POINTER1 CLR -(SP) ;ASSUME NO TARGET ACD WAS SPECIFIED # TSTB @R1 ;CHECK THAT ASSUMPTIONA BEQ 730$ ;VALID - JUMP;H; SEARCH THE ACB LIST (LISTHEAD IS $ACDHD) FOR THE PROTOTYPE ACB WHICHM; HAS THE SAME IDENTIFICATION NUMBER AS THE NUMBER SPECIFIED BY THE REQUESTI;I> MOV $ACDHD,R0 ;TARGET ACD SPECIFIED, FIND ITS PROTOTYPE ACB< BEQ 710$ ;THERE ARE NO ACDS IN THE SYSTEM - RETURN ERRORK700$: CMPB A.NUM(R0),@R1 ;HAVE WE FOUND THE MATCHING PROTOTYPE ACD BLOCK?  BEQ 720$ ;Y - JUMP- MOV A.LIN(R0),R0 ;N - GET NEXT ACB IN LISTF BNE 700$ ;KEEP LOOKING710$: TST (SP)+ ;CLEAN STACK + MOV (SP)+,R3 ;RESTORE I/O PACKET POINTER 7  MOV (SP)+,R1 ;RESTORE CHARACTERISTICS BUFFER POINTERI.! TST (SP)+ ;CLEAN RETURN ADDRESS FROM STACK&" JMP ERCVL1 ;RETURN BAD VALUE ERROR#$;S4%; FOUND THE ACB. CHECK IF CONNECTS ARE DISALLOWED&;O'I(720$: BITB #AS.DLT!AS.DIS,A.STA(R0) ;ACD MARKED FOR DELETE OR DISABLED?H)* BNE 710$ ;Y - ERRORK+;",; ATTEMPT TO ALLOCATE A FULL ACB-; 8. MOV R0,-(SP) ;SAVE R0 DESTROYED BY ALLOCATION ROUTINE+/ CLR R1 ;EXTRA STEP TO AVOID SIGN EXTENDP-0 BISB A.FLEN(R0),R1 ;SET LENGTH OF FULL ACB+1 2 CALL $ALOCB ;ALLOCATE AN ACB3;4 MOV R0,R2 ;COPY ACB ADDRESS WITHOUT AFFECTING CARRY BITC75 MOV (SP)+,R0 ;RESTORE R0 WITHOUT AFFECTING CARRY BIT.'6 BCS 710$ ;ALLOCATION FAILED - ERROR7;I8; SAVE THE ADDRESS OF THE FULL ACB, AND COPY THE COMMON FIELDS FROM THE9; PROTOTYPE ACB INTO IT:;2; MOV R2,@SP ;REPLACE ZERO WITH FULL ACB ADDRESS&< INC A.ACC(R0) ;UPDATE ACD USE COUNT0= MOV (R0)+,(R2)+ ;COPY RELOCATION BIAS (A.REL)7> MOV (R0)+,(R2)+ ;COPY DISPATCH TABLE POINTER (A.DIS)9? MOV (R0)+,(R2)+ ;COPY FIRST FUNCTION MASK WORD (A.MAS) <@ MOV (R0)+,(R2)+ ;COPY SECOND FUNCTION MASK WORD (A.MAS+2)<A MOV (R0),(R2) ;COPY ID NUMBER (A.NUM) AND LENGTH (A.FLEN)BC;OJD; IF THE TERMINAL IS CURRENTLY LINKED TO AN ACD, FIND THE PROTOTYPE ACB.JE; IF IT CANNOT BE FOUND THEN A SERIOUS ERROR HAS OCCURRED AND THE SYSTEMF; IS CRASHED.SG;I0H730$: MOV U.ACB-U.TSTA(R5),R2 ;GET CURRENT ACBI BEQ 770$ ;NONE -00<|tt tfDATA JUMP(7J MOV $ACDHD,R0 ;SEARCH THE ACB LIST FOR ITS PROTOTYPEA;K BEQ 750$ ;LIST IS EMPTY YET TERMINAL HAS AN ACD - CRASHM>L740$: CMPB A.NUM(R0),A.NUM(R2) ;IS THIS THE RIGHT PROTOTYPE?M BEQ 760$ ;Y - JUMP3N MOV A.LIN(R0),R0 ;GET NEXT PROTOTYPE ACB IN LISTO BNE 740$ ;KEEP LOOKING<P750$: CRASH ;CAN'T FIND PROTOTYPE OF CURRENT ACD - CRASHQ;OMR; FOUND THE PROTOTYPE. DECREMENT THE USE COUNT AND DISCONNECT THE ACD FROM>S; THE TERMINAL. THEN ALERT THE ACD TO WHAT HAS TAKEN PLACE.T;J/U760$: DECB A.ACC(R0) ;DECREMENT THE USE COUNTT?V CLR U.ACB-U.TSTA(R5) ;DISASSOCIATE THE ACD FROM THE TERMINAL <W MOV #A.DISC,R1 ;SET TO CALL ACD AT DISCONNECT ENTRY POINT0X MOV R2,R0 ;MAKE ACB ADDRESS AVAILABLE TO ACDY CALL 790$ ;SWITCH TO ACDZ;SC[; COMPLETE DISCONNECT PROCESSING BY DEALLOCATING THE OLD FULL ACB \;R-] MOV R2,R0 ;COPY ADDRESS OF NOW UNUSED ACB.+^ CLR R1 ;EXTRA STEP TO AVOID SIGN EXTENDA-_ BISB A.FLEN(R0),R1 ;SET LENGTH OF FULL ACB `#a CALL $DEACB ;DEALLOCATE THE ACBEbc;R,d; CONNECT THE NEW ACD IF ONE WAS SPECIFIEDe;55f770$: MOV @SP,R0 ;GET THE NEW ACD FULL ACB ADDRESSI#g BEQ 780$ ;NONE SPECIFIED - EXITEh;PEi; INFORM THE ACD OF THE CONNECT AND THEN PERFORM THE CONNECT ITSELFSj; :k CLRB A.IOS(R0) ;ASSUME CONNECT REQUEST WILL BE ACCEPTED=l MOV #A.CONN,R1 ;SET TO CALL ACD AT ITS CONNECT ENTRY POINTW m CALL 790$ ;SWITCH TO THE ACDn$o MOV (SP),R0 ;GET THE ACB ADDRESS0p TSTB A.IOS(R0) ;WAS CONNECT REQUEST ACCEPTED?qr BEQ 775$ ;Y - JUMP+s CLR R1 ;EXTRA STEP TO AVOID SIGN EXTENDIBt BISB A.FLEN(R0),R1 ;SET LENGTH OF FULL ACB THE ACD HAS REJECTED#u CALL $DEACB ;DEALLOCATE THE ACBv BR 710$ ;RETURN AN ERRORLw775$: MOV R0,U.ACB-U.TSTA(R5) ;LINK THE ACB TO CONNECT ACD TO THE TERMINALx;Ny; SET/RESET EXIT PROCESSINGz;#{780$: TST (SP)+ ;CLEAN STACK +| MOV (SP)+,R3 ;RESTORE I/O PACKET POINTERO7} MOV (SP)+,R1 ;RESTORE CHARACTERISTICS BUFFER POINTERT+~ TSTB (R1)+ ;POINT TO THE NEXT PARAMETER+ RETURN ;RETURN FOR NEXT CHARACTERISTICT; P; SUBROUTINE TO SET UP STACK PARAMETERS AND THEN CALL THE EXECUTIVE SUBROUTINE<; WHICH SWITCHES FROM THE DRIVER TO THE ACD AND BACK AGAIN;E790$:7( MOV KINAR5,-(SP) ;SET CURRENT MAPPING .IF DF T$$COM0 MOV KDSAR5,-(SP) ;SET CURRENT D-SPACE MAPPING .ENDC' MOV R1,-(SP) ;SET ENTRY POINT OFFSETI< JMP $SWAC1 ;JUMP TO ROUTINE TO AVOID EXTRA STACK STORAGE .ENDC ;T$$SMC .IF DF T$$GMC;E=; RETURN THE IDENTICATION NUMBER OF THE CURRENT ACD, IF ANYR;E=810$: CLRB (R1)+ ;ASSUME THERE IS NO ACD FOR THIS TERMINALI- MOV U.ACB-U.TSTA(R5),R0 ;GET THE ACD BLOCKC BEQ 820$ ;NONE - JUMP9: MOVB A.NUM(R0),-1(R1) ;RETURN ITS IDENTIFICATION NUMBER820$:+ RETURN ;RETURN FOR NEXT CHARACTERISTICM .ENDC ;T$$GMC .ENDC ;T$$ACD.PAGET6 .SBTTL . MCRMT - LOCAL/REMOTE/DIALOUT LINE STATUS;K; GET/SET REMOTE STATUS;;C .IF DF T$$MOD MCRMT::  .IF DF T$$GMC&T$$SMCR* BNE 100$ ;IF NE, SET NEW REMOTE STATUS .ENDC ;T$$GMC&T$$SMCC .IF DF T$$GMC;A; GET REMOTE STATUSH; $ CLRB (R1)+ ;ASSUME LINE IS LOCAL7 BIT #U2.RMT,U.CW2-U.TSTA(R5) ;IS THIS A REMOTE LINE?/ BEQ 10$ ;IF EQ, NO...ASSUMPTION WAS CORRECTS& INCB -1(R1) ;ASSUME LINE IS REMOTE. BIT #S4.DLO,6(R5) ;IS THIS A DIAL-OUT LINE?/ BEQ 10$ ;IF EQ, NO...ASSUMPTION WAS CORRECT + INCB -1(R1) ;TELL USER LINE IS DIAL-OUT10$:+ RETURN ;RETURN FOR NEXT CHARACTERISTICE .ENDC ;T$$GMC .IF DF T$$SMC;$&; SET LINE REMOTE/NOREMOTE/DIAL-OUT.;(; THE STATE OF THE LINE IS AS FOLLOWS:;S5; LOCAL -> U2.RMT CLEAR, S4.DLO CLEAR, US.DSB CLEAR G; INCOMING CALLS -> U2.RMT SET, S4.DLO CLEAR, US.DSB SET IF NO CALLERL; OUTGOING CALLS -> U2.RMT SET, S4.DLO SET, US.DSB SET IF NO CALLER/CALLEE;?100$:1+ MOV I.TCB(R3),R0 ;GET ISSUING TASK'S TCBI1 BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED?005{cccc4 BEQ 190$ ;IF EQ, NO...RETURN PRIVILEGE VIOLATION@ BIT #U2.RMT,U.CW2-U.TSTA(R5) ;DETERMINE REMOTE STATUS OF LINE* BNE 110$ ;IF NE, LINE IS REMOTE...SKIP. TSTB @R1 ;IS USER SETTING THE LINE REMOTE?( BNE 200$ ;IF NE, YES...SKIP TO DO IT- INC R1 ;LINE IS ALREADY IN REQUESTED MODEB+ RETURN ;RETURN FOR NEXT CHARACTERISTICR;T; LINE IS REMOTE OR DIAL-OUT;/110$:. TSTB (R1) ;IS USER SETTING THE LINE LOCAL?( BEQ 200$ ;IF EQ, YES...SKIP TO DO IT;SH; RESET OR SWITCH BETWEEN REMOTE AND DIAL-OUT. DON'T HANGUP THE LINE.;24 CMPB #1,(R1)+ ;IS USER SETTING THE LINE DIAL-OUT?3 BNE 120$ ;IF NE, YES...SKIP TO MAKE IT DIAL-OUT + BIC #S4.DLO,6(R5) ;SET LINE DIAL-IN ONLYE+ RETURN ;RETURN FOR NEXT CHARACTERISTIC 120$: ' BIS #S4.DLO,6(R5) ;SET LINE DIAL-OUTR+ RETURN ;RETURN FOR NEXT CHARACTERISTICE;E+; ERROR PROCESSING FOR SET REMOTE OPTIONS); 190$:I. TST (SP)+ ;CLEAN RETURN ADDRESS FROM STACK* JMP ERCPRI ;RETURN PRIVILEGE VIOLATION;E<; HERE TO DISPATCH ON CONTROLLER TYPE TO CHANGE LINE STATE;;200$:E .IF DF R$$MPL# MOV U.SCB-U.TSTA(R5),R0 ;GET SCBK MOV S.KRB(R0),R0 ;GET KRB) MOVB K.PRM(R0),R0 ;GET CONTROLLER TYPE  .IFF ;R$$MPLA1 MOVB U.CTYP-U.TSTA(R5),R0 ;GET CONTROLLER TYPEA .ENDC ;R$$MPL* ADD R0,PC ;DISPATCH BY CONTROLLER TYPE BR RMTDL ;DL11 BR RMTDZ ;DZ11 BR RMTDH ;DH11 BR RMTDJ ;DJ11% CRASH ;DM11 - SHOULDN'T GET HEREU! BR RMTDC ;PRO VIDEO INTERFACEE BR RMTDV ;DHV11T  RETURN ;TTLH (LAT)A   .IF DF D$$M11   .IF DF R$$MPLRMTDH:# MOV U.SCB-U.TSTA(R5),R0 ;GET SCBB MOV S.KRB(R0),R0 ;GET KRB* MOVB K.CON(R0),R0 ;GET CONTROLLER INDEX( ASRB R0 ;CONVERT TO A COUNT (0 TO N) MOVB R0,-(SP) ;SAVE IT .IF DF T$$SPL!T$$ONIR+ MOV $DALED,KISAR6 ;MAP DRIVER DATA SPACE; .ENDC ;T$$SPL!T$$ONIB .IF DF T$$ONI0 MOV YMC12,R0 ;GET POINTER TO DM11-BB KRB LIST  .IFF ;T$$ONIE!0" MOV YMCP1,R0 ;GET POINTER TO DM11-BB KRB LIST#$ .ENDC ;T$$ONI%& .IF DF T$$SPL!T$$ONIM'*( MOV I.PRM(R3),KISAR6 ;REMAP TASK BUFFER)* .ENDC ;T$$SPL!T$$ONIG+7, CMPB L.NUM-L.KRB(R0),(SP)+ ;IS THIS KRB IN THE LIST?0,- BLOS RMTER ;IF LOS, NO...RETURN AN ERROR./ .IFF ;R$$MPL.01RMTDH:#2 MOV U.SCB-U.TSTA(R5),R0 ;GET SCB "3 TST S.DMCS(R0) ;GET DM11-BB CSR,4 BEQ RMTER ;IF EQ, NONE...REPORT AN ERROR56 .ENDC ;R$$MPL78 .ENDC ;D$$M119: .IF DF D$$VMD;<RMTDV:=> .ENDC ;D$$VMD?@ .IF DF D$$LMDABRMTDL:CD .ENDC ;D$$LMDEF .IF DF D$$ZMDGHRMTDZ:IJ .ENDC ;D$$ZMDK:L BIC #U2.RMT,U.CW2-U.TSTA(R5) ;ASSUME SETTING LINE LOCAL,M BIC #S4.DLO,6(R5) ;CANNOT DIAL OUT EITHER!N CMPB @R1,#1 ;ASSUMPTION TRUE?)O BLO 20$ ;IF LO, YES...GO SET IT LOCALU#P BEQ 15$ ;IF EQ, SET LINE REMOTE('Q BIS #S4.DLO,6(R5) ;SET LINE DIAL-OUTQR15$:5S BIS #U2.RMT,U.CW2-U.TSTA(R5) ;ALLOW INCOMING CALLS$T20$:*U INCB U.TMTI-U.TSTA(R5) ;SET MODEM TIMER9V BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIERC W TSTB (R1)+ ;LINE NOW REMOTE?*X BNE 30$ ;IF NE, YES...ALL DONE WITH IT5Y BICB #US.DSB,U.STS-U.TSTA(R5) ;LOCAL - ENABLE LINEZ30$:+[ RETURN ;RETURN FOR NEXT CHARACTERISTICR\; !]; LINE STATUS CANNOT BE CHANGED ^;E_` .IF NDF D$$M11abRMTDH:cd .ENDC ;NDF D$$M11ef .IF NDF D$$VMDIghRMTDV:ij .ENDC ;NDF D$$VMDkl .IF NDF D$$LMDCmnRMTDL:op .ENDC ;NDF D$$LMDqr .IF NDF D$$ZMDRstRMTDZ:uv .ENDC ;NDF D$$ZMDwxRMTDJ:yRMTDC:zRMTER:"{ TST (SP)+ ;CLEAN OFF THE STACK8| JMP ERCNSC ;RETURN NON-SETTABLE CHARACTERISTIC ERROR}~ .ENDC ;T$$SMC .ENDC ;T$$MOD.PAGEO4 .SBTTL . MCSSC - TERMINAL MGMT SWITCH CHARACTERS .IF DF T$$SCA;F%; GET/SET FOR SET SWITCH CHARACTERSD;MH; WHEN ISSUED VIA INTERNAL I/O, THE CHARACTERISTIC BUFFER FORMAT IS:;N+; +-------------------------00<|tt tfDATA------------+$+; 1 | RESERVED | TC.SSC | 0+; |-------------------------------------|:&; 3 | TEP ADDRESS OR 0 | 2+; +-------------------------------------+H;EA; THE ASSOCIATED TEP MUST BE PROPERLY FORMATTED WITH THE SWITCHG'; CHARACTERS STORED IN OFFSET E.VSWC.I;HC; WHEN ISSUED FROM A TASK, THE CHARACTERISTIC BUFFER FORMAT IS:C;T+; +-------------------------------------+O+; 1 | RESERVED | TC.SSC | 0+; |-------------------------------------|&; 3 | AST ADDRESS OR 0 | 2+; |-------------------------------------|-0; 5 | SWITCH CHARACTERS | 4+; +-------------------------------------+E; MCSSC::T: MOV #U.TSCA,R4 ;SET OFFSET INTO UCBX OF ACB/TEP POINTER .IF DF T$$SMCA MOV #S3.TME,R2 ;IDENTIFY FLAG TO ENABLE/DISABLE CHARACTERISTICF6 MOV #22.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDED .IFTF ;T$$SMC; CALL GSAENC ;GET/SET STANDARD ASYNCH EVENT NOTIFICATION-- ;IT MAY RETURN WITH INTERRUPTS DISABLED  .IFT ;T$$SMC- .IF DF T$$GMC. BVS 100$ ;IF VS, REQUEST WAS SF.GMC...SKIP .ENDC ;T$$GMC5 ;;;CO-ROUTINE DISABLED INTERRUPTS TIL WE FINISH.. BNE 10$ ;;;IF NE, WE HAVE AN ACB TO MODIFY2 TST (R1)+ ;;;ELSE, USER CLEARED CHARACTERISTIC7 BR 1000$ ;;;RETURN TO GSAENC TO COMPLETE PROCESSING010$:> MOV (R1)+,A.PRM+6(R2) ;;;STORE SWITCH CHARACTERS IN THE ACB .IF DF T$$GMC, BR 1000$ ;;;SKIP TO RETURN TO CO-ROUTINE .ENDC ;T$$GMC .ENDC ;T$$SMC .IF DF T$$GMC;C-; GET TERMINAL MANAGEMENT SWITCH CHARACTERS.;100$:N. BNE 110$ ;IF NE, WE HAVE AN ACB/TEP...SKIP6 CLR (R1)+ ;INDICATE SWITCH CHARACTERS ARE DISABLED  BR 1000$ ;FINISH OFF REQUEST110$:  .IF DF R$$IIC9 BCC 120$ ;IF CC, CURRENT SETTING IS FOR AN ACB...SKIP0? MOV E.VSWC(R2),(R1)+ ;STORE SWITCH CHARACTERS IN USER BUFFERB+ BR 1000$ ;FINISH OFF THE CHARACTERISTICK120$:U .ENDC ;R$$IIC@ MOV A.PRM+6(R2),(R1)+ ;STORE SWITCH CHARACTERS IN USER BUFFER .ENDC ;T$$GMC1000$:B SUB #2,I.PRM+4(R3) ;CO-ROUTINE PROCESSED 2 MORE BYTES OF BUFFER6 RETURN ;RETURN TO CO-ROUTINE OR TO GET NEXT CHAR..PAGE2 .SBTTL . MCTMM - EXIT TERMINAL MANAGEMENT MODE; (; GET/SET FOR TERMINAL MANAGEMENT MODE;G;O!; CHARACTERISTIC PACKET FORMAT:,; ; +------------------------+; | 0 | TC.TMM |; +------------------------+; MCTMM::; .IF DF T$$GMC&T$$SMC)- BEQ 2120$ ;GET TERMINAL MANAGEMENT STATUS .ENDC ;T$$GMC!T$$SMC: .IF DF T$$SMC;-E; CHECK FOR ERRORS, EITHER TRYING TO ENABLE TM WITH A QIO OR TRYINGT%; TO EXIT TM WHEN TM IS NOT ACTIVE..;  TSTB (R1)+ ;EXITING TM?G4 BNE 2110$ ;BR IF NOT. CANNOT ENABLE TM WITH QIO/ BIT #S5.TMM,U.TST5-U.TSTA(R5) ;ARE WE IN TM?T2 BEQ 2110$ ;TRYING TO EXIT WHEN WE'RE NOT IN IT+ MOV R1,-(SP) ;SAVE REGISTERS OVER KILLI1- MOV R3,-(SP)M;); MAP UCBX, AND TERMINATE PENDING READS2;G  .IF DF T$$SPL  MOV #120000,R4 ;POINT TO UCBX7 MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP THE UCBX AND TABUFR  .IFF ;T$$SPLW 1 MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGI/ MOV U.TUX-U.TSTA(R5),R4 ;GET POINTER TO UCBX2  .IFTF ;T$$SPL - MOV #IS.TMM,R0 ;REASON FOR CANCELLED READSA  .IF DF T$$OVL  .IF DF T$$SPL  MOV $DALED,KISAR6  .ENDC ;T$$SPL , MOV #KILLI1,-(SP) ;GET ADDRESS OF ROUTINE  CALL MPROT ;AND GOTO ROUTINE  .IFF ;T$$OVL ( CALL KILLI1 ;TERMINATE PENDING READS  .ENDC ;T$$OVL ' MOV (SP)+,R3 ;RESTORE PACKET ADDRESS'! MOV (SP)+,R1 ;RESTORE BUFFER POINTERI;" BIC #S5.TMM,U.TST5-U.TSTA(R5) ;CLEAR TERMINAL MANG'T BIT4# $ .IF DF R$$IIC% "& BIS #S2.IRQ!S2.ORQ!S2.SRQ,2(R5)'' ;SET BITS TO POSSIBLY RESTART I/O ( ) .ENDC ;R$$IIC* + .IFF ;T$$SPL , 0- MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER. / .ENDC ;005{ccccT$$SPL0 +1 RETURN ;RETURN FOR NEXT CHARACTERISTIC2 3 .IF DF T$$OVL&T$$SPLC4 05 MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER6 7 .ENDC ;T$$OVL&T$$SPLS8 9 ;E: ; USER ERROR; ;P< 2110$:= JMP ERCVAL ;ILLEGAL VALUE5> ? .ENDC ;T$$SMC@ A .IF DF T$$GMCB C ; &D ; GET TERMINAL MANAGEMENT MODE STATEE ;!F 2120$:$G CLRB (R1)+ ;ASSUME TM NOT ACTIVE/H BIT #S5.TMM,U.TST5-U.TSTA(R5) ;IS TM ACTIVE? I BEQ 2130$ ;BR IF NOSJ INCB -1(R1) ;SAY ENABLEDK 2130$:+L RETURN ;RETURN FOR NEXT CHARACTERISTICCM N .ENDC ;T$$GMCO P .ENDC ;T$$SCAQ R .PAGEI4S .SBTTL . MCMHU - MODEM HANGUP EVENT NOTIFICATIONT U .IF DF T$$MHUV W ; *X ; GET/SET FOR MODEM HANG-UP NOTIFICATIONY ;AZ ; GET/SET PACKET:C,[ ; +-------------------------------------+.\ ; 1 | RESERVED | TC.MHU | 0,] ; |-------------------------------------|1^ ; 3 | ADDRESS OF AST (TASK) OR TEP (TSA) | 2Q,_ ; +-------------------------------------+` ; a MCMHU::R:b MOV #U.TMHA,R4 ;SET OFFSET INTO UCBX OF ACB/TEP POINTERc d .IF DF T$$SMCe Af MOV #S3.MHE,R2 ;IDENTIFY FLAG TO ENABLE/DISABLE CHARACTERISTIC6g MOV #20.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDEDh i .ENDC ;T$$SMCj ;k CALL GSAENC ;GET/SET STANDARD ASYNCH EVENT NOTIFICATION-l .m RETURN ;RETURN TO GET NEXT CHARACTERISTICn o .ENDC ;T$$MHUp q .PAGE-9r .SBTTL . MCICS - INPUT COUNT STATE EVENT NOTIFICATION s t .IF DF T$$ICSu v ;-1w ; GET/SET CHARACTERISTIC BUFFER FORMAT FOR ICS:Rx ;T,y ; +-------------------------------------+,z ; 1 | RESERVED | TC.ICS | 0,{ ; |-------------------------------------|1| ; 3 | ADDRESS OF AST (TASK) OR TEP (TSA) | 2 ,} ; +-------------------------------------+~ ;A ; MCICS::T: MOV #U.TICA,R4 ;SET OFFSET INTO UCBX OF ACB/TEP POINTER  .IF DF T$$SMC A MOV #S3.ICE,R2 ;IDENTIFY FLAG TO ENABLE/DISABLE CHARACTERISTICF6 MOV #20.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDED  .ENDC ;T$$SMC ; CALL GSAENC ;GET/SET STANDARD ASYNCH EVENT NOTIFICATION+ + RETURN ;RETURN FOR NEXT CHARACTERISTIC   .ENDC ;T$$ICS  .PAGE-= .SBTTL . MCOOB - OUT-OF-BAND CHARACTER EVENT NOTIFICATION   .IF DF T$$OOB  ;-" ; GET/SET OUT-OF-BAND CHARACTERS ;#K ; WHEN THIS CHARACTERISTIC IS ISSUED VIA INTERNAL I/O, THIS IS THE FORMAT) ; OF THE GET/SET CHARACTERISTIC BUFFER:D ;E, ; +-------------------------------------+* ; 1 | RESERVED | TC.OOB | 0, ; |-------------------------------------|1 ; 3 | OOB TEP ADDRESS OR ZERO | 2O, ; +-------------------------------------+ ; ; ; NOTE THAT THE TEP MUST BE FORMATTED WITH THE BIT MASKS.F ;OF ; WHEN ISSUED FROM A USER TASK, THE CHARACTERISTIC BUFFER FORMAT IS: ;, ; +-------------------------------------+) ; 1 | RESERVED | TC.OOB | 0G, ; |-------------------------------------|+ ; 3 | OOB AST VIRTUAL ADDRESS | 2|, ; |-------------------------------------|& ; 5 | OOB BIT MASK 1 | 4, ; |-------------------------------------|& ; 7 | OOB BIT MASK 2 | 6, ; |-------------------------------------|- ; 11 | HELLO/CLEAR BIT MASK 1 | 10S, ; |-------------------------------------|3 ; 13 | HELLO/CLEAR BIT MASK 2 | 12-, ; |-------------------------------------|3 ; 15 | INCLUDE BIT MASK 1 | 14|, ; |-------------------------------------|3 ; 17 | INCLUDE BIT MASK 2 | 16 , ; +-------------------------------------+ ;- ;-I ; IN HELLO/CLEAR BIT MASKS, 0 => CLEAR OOB; 1 => HELLO OOB. ;SA459-H ; CHARACTERS THAT ARE CLEAR OOB CANNOT ALSO BE INCLUDE OOB. ;**-1 ; MCOOB::-: MOV #U.TOBA,R4 ;SET OFFSET INTO UCBX OF ACB/TEP POINTER  .IF DF T$$SMC = CLR R2 ;INDICATE NO FLAG TO ENABLE/DISABLE CHARACTERISTIC 6 MOV #52.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDED  .IFTF ;T$$SMC ; CALL GSAENC ;GET/SET STAND00<|tt tfDATAARD ASYNCH EVENT NOTIFICATION+- ;IT MAY RETURN WITH INTERRUPTS DISABLED   .IFT ;T$$SMCL  .IF DF T$$GMC . BVS 100$ ;IF VS, REQUEST WAS SF.GMC...SKIP  .ENDC ;T$$GMC 5 ;;;CO-ROUTINE DISABLED INTERRUPTS TIL WE FINISHV. BNE 10$ ;;;IF NE, WE HAVE AN ACB TO MODIFY4 ADD #12.,R1 ;;;ELSE, USER CLEARED CHARACTERISTIC- BR 1000$ ;;;SKIP FOR RETURN TO CO-ROUTINEV 10$: ;TO ; PERFORM CONSISTENCY CHECKS ON THE OOB BITMASKS SUPPLIED BY THE TASK. THETN ; RULES SPECIFY THAT NO CLEAR-OOB CHARACTERS CAN BE INCLUDE-OOB AND THAT ALLN ; CLEAR-OOB AND INCLUDE-OOB CHARACTERS MUST BE DECLARED AS OOB CHARACTERS INM ; THE FIRST BITMASK DOUBLEWORD. AN ERROR IN THE FIRST CHECK (CLEAR/INCLUDEDK ; CONFLICT) WILL LEAVE THE BUFFER POINTER AT THE OFFENDING CLEAR-OOB MASK N ; WORD. FAILING THE SECOND CHECK LEAVES THE BUFFER POINTER AT THE OFFENDING! ; OOB DECLARATION BITMASK WORD.  ;E$ ADD #A.PRM+5,R2 ;;;POINT TO FLAGS% CLRB (R2) ;;;INITIALIZE FLAG BYTE @ BISB #AF.OOB,(R2)+ ;;;SET OOB FLAG AND POINT TO OOB MASK WORD & MOV (R1)+,(R2)+ ;;;STORE OOB MASK 1& MOV (R1)+,(R2)+ ;;;STORE OOB MASK 2. MOV (R1)+,(R2)+ ;;;STORE HELLO/CLEAR MASK 1. MOV (R1)+,(R2)+ ;;;STORE HELLO/CLEAR MASK 2* MOV (R1)+,(R2)+ ;;;STORE INCLUDE MASK 1* MOV (R1)+,(R2)+ ;;;STORE INCLUDE MASK 2& CLR (R2)+ ;;;INIT OOB TABUF HEADER- CLRB (R2)+ ;;;INIT OOB TABUF ACTIVE COUNT ( MOVB #10.,(R2) ;;;INIT OOB TABUF SIZE, BR 1000$ ;;;SKIP TO RETURN TO CO-ROUTINE 30$:5 MOV #ERCVL1,2(SP) ;;;FORCE RETURN TO ERROR ROUTINE : RETURN ;;;EXIT CO-ROUTINE FOR RETURN TO ERROR ROUTINE  .ENDC ;T$$SMC  .IF DF T$$GMC  ;T. ; GET OUT-OF-BAND CHARACTER AST AND BITMASKS ;E 100$: . BNE 110$ ;IF NE, WE HAVE AN ACB/TEP...SKIP$ CLRB -3(R1) ;CLEAR RESERVED BYTE& CLR (R1)+ ;CLEAR FIRST OOB BITMASK' CLR (R1)+ ;CLEAR SECOND OOB BITMASKF% ADD #8.,R1 ;SKIP REST OF BITMASKSI BR 1000$ ;FINISH OFF REQUEST 110$:E  .IF DF R$$IIC 9 BCC 120$ ;IF CC, CURRENT SETTING IS FOR AN ACB...SKIP  ;RQ ; WE GET HERE WHEN GET WAS DONE FROM EXTERNAL I/O BUT THE GOTTEN CHARACTERISTICF  ; WAS OF THE INTERNAL I/O TYPE ;N= ADD #E.VOBM,R2 ;POINT TO WHERE OOB BITMASKS START IN A TEPN* BR 130$ ;FINISH OFF THE CHARACTERISTIC 120$:R  .ENDC ;R$$IIC ? ADD #A.PRM+6,R2 ;POINT TO WHERE OOB BITMASKS START IN AN ACBS 130$:D# MOV (R2)+,(R1)+ ;COPY OOB MASK 1B# MOV (R2)+,(R1)+ ;COPY OOB MASK 2E+ MOV (R2)+,(R1)+ ;COPY HELLO/CLEAR MASK 1C+ MOV (R2)+,(R1)+ ;COPY HELLO/CLEAR MASK 2R+ MOV (R2)+,(R1)+ ;COPY OOB INCLUDE MASK 1R+ MOV (R2)+,(R1)+ ;COPY OOB INCLUDE MASK 2A  .ENDC ;T$$GMC  1000$:E SUB #12.,I.PRM+4(R3) ;CO-ROUTINE PROCESSED 12 MORE BYTES OF BUFFER$6 RETURN ;RETURN TO CO-ROUTINE OR TO GET NEXT CHAR.  .ENDC ;T$$OOB  .PAGE ;SRC&SA4BD .IF DF T$$LTH&M$$NET ;THIS IS CONDITIONAL ADDITIONALLY ON ;SA4735 ;A NET AS $LTEEP IS NOT DEFINED W/O NET. ;SA473(4 ;IF THE SYSTEM DOESN'T HAVE A NETWORK, ;SA473. ;THE LAT CODE WON'T EVER EXECUTE ;SA473 ;SRC&SAH .SBTTL . MCMAP - GET/SET MAPPING FOR LAT APPLICATION TERMINAL ;SRC&SA ;SRC&SA.U ; BUFFER FOR ESTABLISHING MAPPING AND ESTABLISHING TERM AS LAT APPLICATION: ;SRC&SAT ; ;SRC&SA7 ; +-------------------------------------+ ;SRC&SA4 ; |BUFFER SIZE OR 0| TC.MAP | ;SRC&SA7 ; |-------------------------------------| ;SRC&SA / ; | UP TO 16. BYTES | ;SRC&SA 1 ; | FOR SERVER NAME | ;SRC&SAE ; | . | ;SRC&SAS7 ; |-------------------------------------| ;SRC&SAO/ ; | SERVICE NAME | ;SRC&SAF ; | . | ;SRC&SA  ; | . | ;SRC&SAA7 ; |-------------------------------------| ;SRC&SA-2 ; | PORT NAME | ;SRC&SA ; | . | ;SRC&SA; ; | . | ;SRC&SA-7 ; +-------------------------------------+ ;S005{ccccRC&SAY ; ;SRC&SAQ ; WHEN THE BUFFER SIZE IS ZERO, WE ARE VOIDING THE MAPPING AND THE LAT ;SRC&SAST ; APPLICATION TERMINAL STATUS. IN THIS CASE, NO BUFFER FOLLOWS THE WORD ;SRC&SAR ; CONTAINING TC.MAP AND THE 0 BYTE. ELSE, THE BUFFER SIZE MUST BE LESS ;SRC&SAT ; THAN OR EQUAL TO 52. AND MUST BE EVEN. EACH NAME IS ALLOWED TO BE 16. ;SRC&SA3 ; BYTES IN LENGTH WITH A TRAILING 0. ;SRC&SAS ; ;SRC&SA7 ; SET LAT BY DEFAULT SETS NOBRO AND SLAVE ;SRC&SA-; ; SET NOLAT BY DEFAULT CLEARS NOBRO AND SLAVE ;SRC&SAI ; ;SRC&SA ; ;SRC&SA MCMAP:: ;SRC&SA% .IF DF T$$GMC!T$$SMC ;SRC&SAN ;SRC&SAW. CMPB #52., (R1) ;CORRECT SYNTAX? ;SRC&SA, BLO ERSYN ;IF 52. OR LESS, OK ;SRC&SA( BITB #1,(R1) ;IS IT ODD? ;SRC&SA& BNE ERSYN ;NOT ALLOWED ;SRC&SA 10$: ;SRC&SAT1 MOV $CTLST,R2 ;GET FIRST CONTROLLER ;SRC&SARB 15$: CMP U.DCB-U.TSTA(R5),L.DCB(R2) ;IS THIS OUR UNIT? ;SRC&SA+ BEQ 20$ ;IF EQ, YES - BRANCH ;SRC&SA + MOV (R2),R2 ;GET NEXT ENTRY ;SRC&SA ' BNE 15$ ;IF NE, CHECK IT ;SRC&SA.0 17$: TST (SP)+ ;POP RETURN ADDRESS ;SRC&SA) JMP ERCNSC ;PROCESS ERROR ;SRC&SA  ; ;SRC&SA< 20$: CMP L.NAM(R2),#"LH ;SHOULD BE LH CONTROLER ;SRC&SA5 BNE 17$ ;IF NOT, BRANCH - MAP NOT LEGAL ;SRC&SA> CMP $LTEEP,#$SPVEX ;IS THERE A RETURN INSTRUCTION ;SA473' ;AT THE LAT ENTRY POINT? ;SA473,1 BEQ 17$ ;IF SO, LAT IS NOT INSTALLED ;SA473  ; ;SRC$SA4  CLR -(SP) ;SRC$SA42 MOVB (R1),(SP) ;SAVE SIZE OF BUFFER ;SRC$SA46 MOV R3,-(SP) ;SAVE POINTER TO I/O PACKET ;SRC$SA4  MOV #PO$MAP,R3 ;SRC$SA49 MOV (SP),R0 ;GET IRP ADDRESS TO R0 FOR LAT ;SRC$SA4R+ ;USER BUFFER IN R1 FOR LAT ;SRC$SA4 C MOV KISAR6,R2 ;GET MAPPING OF USER BUFFER TO R2 FOR LAT ;SRC$SA4$ ;SRC$SA42 MOV KISAR6,-(SP) ;SAVE APR6 MAPPING ;SRC$SA46 MOV $DALED,KISAR6 ;MAP DRIVER DATA AREA ;SRC$SA4 ;SRC$SA4  .IF DF T$$OVL ;SRC$SA47 MOV #LTPRC,-(SP) ;GET ADDRESS OF ROUTINE ;SRC$SA4S- CALL MPROT ;AND GO TO ROUTINE ;SRC$SA4  ;SRC$SA4 .IFF ;T$$OVL ;SRC$SA4P ;SRC$SA42 CALL LTPRC ;CALL MAP TO LAT PROCESS ;SRC$SA4 ;SRC$SA4  .ENDC ;T$$OVL ;SRC$SA4 ;SRC$SA45 MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPING ;SRC$SA4 6 MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS ;SRC$SA43 MOV (SP)+,R2 ;GET BUFFER LENGTH BACK ;SRC$SA48 TST R0 ;DID WE GET AN ERROR BACK FROM LAT? ;SRC$SA4( BNE ERLAT ;IF NE, ERROR ;SRC$SA46 CMPB #SF.GMC,I.FCN(R3) ;WAS THIS A GET? ;SRC$SA4, BEQ 50$ ;IF EQ, YES - RETURN ;SRC$SA4 ;SRC$SA4 ; ;SRC$SA4AE ; SET LAT APPLICATION TERMINAL CHARACTERISTICS, BUT NOT ;SRC$SA4C0 ; S6.LAT (LAT PROCESS DOES THIS) ;SRC$SA4 ; ;SRC$SA4;) TSTB (R1) ;LAT OR NOLAT? ;SRC$SA4E- BEQ 30$ ;EQ -> NOLAT - BRANCH ;SRC$SA4E ;SRC$SA4& .IF DF R$$MPL!A$$CLI ;SRC$SA4 ;SRC$SA47 BIS #UM.NBR,U.MUP-U.TSTA(R5) ;SET NOBRO ;SRC$SA4M ;SRC$SA4& .ENDC ;R$$MPL!A$$CLI ;SRC$SA4 ;SRC$SA4@ BIS #U2.SLV,U.CW2-U.TSTA(R5) ;SET TERMINAL SLAVED ;SRC$SA4 BR 50$ ;SRC$SA4S ; ;SRC$SA4A: ; SET NOLAT (S6.LAT CLEARED BY LAT PROCESS) ;SRC$SA4 ; ;SRC$SA4T 30$: ;SRC$SA4& .IF DF R$$MPL!A$$CLI ;SRC$SA4 ;SRC$SA4: BIC #UM.NBR,U.MUP-U.TSTA(R5) ;SET BROADCAST ;SRC$SA4 ;SRC$SA4& .ENDC ;R$$MPL!A$$CLI ;SRC$SA4 ;SRC$SA4A BIC #U2.SLV,U.CW2-U.TSTA(R5) ;SET TERMINAL UNSLAVED ;SRC$SA4  ;SRC$SA4 ; ;SRC$SA4;1 50$: INC R1 ;UPDATE BUFFER POINTER ;SRC$SA4R+ ADD R2,R1 ;SKIP OVER BUFFER ;SRC$SA4 G SUB R2,I.PRM+4(R3) ;ROUTINE PROCESSED BUFFER LEN CHARACTERS ;SRC$SA40 RETURN ;DONE ;SRC$SA4$ ;SRC$SA4& .ENDC ;T$$GMC&T$$SM00<|tt tfDATAC ;SRC$SA4 ;SRC$SA4 .PAGE ;SRC$SA4 R .SBTTL MCQDP - GET CONNECT STATUS/QUEUE DEPTH OF LAT APPLICATION TERM. ;SRC$SA4 ;SRC$SA4 ; ;SRC$SA4UG ; SET MULTIPLE CHARACTERISTICS FOR MCQDP IS NOT ALLOWED. ;SRC$SA4I ; ;SRC$SA4O  ; RETURN IS: ;SRC$SA4! ; 0 = CONNECTED ;SRC$SA4S* ; -1 = DISCONNECTED ;SRC$SA4* ; 1 -> 255 = QUEUE DEPTH ;SRC$SA4 ; ;SRC$SA4  MCQDP:: ;SRC$SA4C ;SRC$SA4& .IF DF T$$GMC&T$$SMC ;SRC$SA4 ;SRC$SA4* BNE 20$ ;SET (NOT ALLOWED) ;SRC$SA4 ;SRC$SA4& .ENDC ;T$$GMC&T$$SMC ;SRC$SA4 ;SRC$SA4  .IF DF T$$GMC ;SRC$SA4 ;SRC$SA42 MOV $CTLST,R2 ;GET FIRST CONTROLLER ;SRC$SA4B 5$: CMP U.DCB-U.TSTA(R5),L.DCB(R2) ;IS THIS OUR UNIT? ;SRC$SA4+ BEQ 8$ ;IF EQ, YES - BRANCH ;SRC$SA4Q, MOV (R2),R2 ;GET NEXT ENTRY ;SRC$SA4' BNE 5$ ;IF NE, CHECK IT ;SRC$SA4  ; ;SRC$SA4 1 7$: BR 20$ ;ERROR, NOT A LAT DEVICE ;SRC$SA4 ; ;SRC$SA4L< 8$: CMP L.NAM(R2),#"LH ;SHOULD BE LH CONTROLER ;SRC$SA45 BNE 7$ ;IF NOT, BRANCH - MAP NOT LEGAL ;SRC$SA4G> CMP $LTEEP,#$SPVEX ;IS THERE A RETURN INSTRUCTION ;SA473' ;AT THE LAT ENTRY POINT? ;SA473.1 BEQ 20$ ;IF SO, LAT IS NOT INSTALLED ;SA473S ;SRC$SA4 ;SRC$SA4Y ; CALL TO LAT PROCESS WILL INSERT THE QUEUE DEPTH INDICATOR IN THE USER BUFFER ;SRC$SA4  ;SRC$SA4 10$: ;SRC$SA4 ;SRC$SA46 MOV R3,-(SP) ;SAVE POINTER TO I/O PACKET ;SRC$SA47 MOV R3,R0 ;GET IRP ADDRESS TO R0 FOR LAT ;SRC$SA4  MOV #PO$GQD,R3 ;SRC$SA42 MOV KISAR6,-(SP) ;Save APR6 mapping ;SRC$SA48 MOV $DALED,KISAR6 ;Map data area in TTCOM ;SRC$SA4; MOV (SP),R2 ;SET UP USER BUFFER MAPPING IN R2 ;SRC$SA4  ;SRC$SA4  .IF DF T$$OVL ;SRC$SA4 ;SRC$SA47 MOV #LTPRC,-(SP) ;GET ADDRESS OF ROUTINE ;SRC$SA4 , CALL MPROT ;AND GOTO ROUTINE ;SRC$SA4 ;SRC$SA4 .IFF ;T$$OVL ;SRC$SA4  ;SRC$SA42 CALL LTRPC ;CALL MAP TO LAT PROCESS ;SRC$SA4 ;SRC$SA4  .ENDC ;T$$OVL ;SRC$SA4 ;SRC$SA45 MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPING ;SRC$SA4C6 MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS ;SRC$SA4  TST R0 ;ERROR? ;SRC$SA4& BNE ERLAT ;IF NE, YES ;SRC$SA4 RETURN ;SRC$SA4 ;SRC$SA4  .ENDC ;T$$GMC ;SRC$SA4 ;SRC$SA4  .IF DF T$$SMC ;SRC$SA4 ;SRC$SA4& ; SET IS NOT ALLOWED ;SRC$SA4 ;SRC$SA41 20$: TST (SP)+ ;POP RETURN ADDRESS ;SRC$SA4.* JMP ERCNSC ;PROCESS ERROR ;SRC$SA4 ;SRC$SA4  .ENDC ;T$$SMC ;SRC$SA4 ;SRC$SA4& .IF DF T$$SMC!T$$GMC ;SRC$SA4 ERSYN: ;SRC$SA44 JMP ERCVAL ;AND JUMP TO PROCESS ERROR ;SRC$SA4 ERLAT: ;SRC$SA4- TST (SP)+ ;POP RETURN ADDRESS ;SRC$SA44' JMP CHRFN1 ;FINISH I/O ;SRC$SA4  ;SRC$SA4& .ENDC ;T$$SMC!T$$GMC ;SRC$SA4 ;SRC$SA4& .ENDC ;T$$LTH&M$$MAP ;SRC$SA4 ;SRC$SA4  .PAGEE .SBTTL TTATT SUBROUTINESC>! .SBTTL . GSAENC - GET/SET GENERAL ASYNCH EVENT NOTIFICATION" %# .IF DF T$$SCA!T$$MHU!T$$ICS!T$$OOB $ % ;C& ;+H' ; **-GSAENC - GET/SET ASYNCHCHRONOUS EVENT NOTIFICATION CHARACTERISTIC( ;4=) ; THIS ROUTINE PROCESSES THE COMMON PART OF AN ASYNCHRONOUS Q* ; EVENT NOTIFICATION CHARACTERISTIC. TO SET ONE OF THESE, THE TERMINAL MUST BENN+ ; ATTACHED AND MAY NOT HAVE UNSOLICITED INPUT AST'S SPECIFIED. THIS ROUTINEO, ; ESTABLISHES AN ACB (UNLESS ONE ALREADY EXISTS) FOR THE REQUESTED CHARACTER-M- ; ISTIC, SAVES THE USER-SPECIFIED AST ADDRESS IN THE ACB, CALLS THE CALLING$N. ; ROUTINE AS A CO-ROUTINE WITH INTERRUPTS LOCKED OUT TO ALLOW SETTING UP THEO/ ; CHARACTERISTIC DEPENDENT PART OF THE ACB. UPON RETURN FROM THE CO-ROUTINE, N0 ; 005{ccccINTERRUPTS ARE ENABLED AND THE MAIN CHARACTERISTIC HANDLER IS RETURNED TO.1 ;,C2 ; NOTE THAT IF THE CHARACTERISTIC IS BEING SET OR DISABLED VIA ANUN3 ; INTERNAL I/O REQUEST, THE CO-ROUTINE SEQUENCE IS NOT EXECUTED AND A RETURN@4 ; TO THE MCXXX DISPATCH ROUTINE (NXTCHR) IS EXECUTED. THIS ISJ5 ; BECAUSE THE CHARACTERISTIC BUFFER IS FORMATTED DIFFERENTLY SINCE A TEPH6 ; IS EXPECTED TO ALREADY CONTAIN THE NEEDED CHARACTERISTIC PARAMETERS.G7 ; BY DESIGN, THE CALLING ROUTINE ASSUMES IT WILL NOT GET RETURNED TO.P8 ;EF9 ; NOTE THAT AN SF.GMC REQUEST FROM A TASK CAN BE HANDLED EVEN IF THEI: ; CHARACTERISTIC CURRENTLY HAS A TEP ASSOCIATED WITH IT. IN THIS CASE,NM; ; THE CO-ROUTINE MUST COPY THE CHARACTERISTIC DEPENDENT PARAMETERS FROM THEE< ; TEP TO THE USER BUFFER.H= ; > ; INPUTS:<? ; R0 = SIZE OF AN AST CONTROL BLOCK FOR THE CHARACTERISTICB@ ; R1 => HIGH BYTE OF CURRENT CHARACTERISTIC ENTRY IN USER BUFFERHA ; R2 = BIT IN STATUS WORD 3 MARKING CHARACTERISTIC AS ENABLED/DISABLEDB ; R3 => CURRENT I/O PACKET.C ; R4 = OFFSET TO ACB/TEP POINTER IN THE UCBX(D ; R5 => U.TSTA OF CURRENT TERMINAL UCBE ;R F ; OUTPUTS:P0G ; WHEN CALLING THE CALLER AS A CO-ROUTINE:<H ; CC-V = SET IF REQUEST IS SF.GMC; CC-V = CLEAR FOR SF.SMC;I ; CC-Z = SET IF NO TEP/ACB EXISTS; CC-Z = CLEAR OTHERWISE0@J ; CC-C = SET IF REQUEST IS SF.GMC AND A TEP IS ASSOCIATED WITH?K ; THE CHARACTERISTIC (ONLY CHECK IF CC-V SET AND CC-Z CLEAR)=<L ; R1 => NEXT WORD OF USER CHARACTERISTIC BUFFER TO PROCESS(M ; R2 => ACB/TEP FOR THE CHARACTERISTIC4N ; R4 => UCBX POINTER TO ACB/TEP FOR CHARACTERISTICO ; 1P ; WHEN RETURNING TO CHARACTERISTIC HANDLER: <Q ; R1 => NEXT WORD OF USER CHARACTERISTIC BUFFER TO PROCESSR ; S ; REGISTERS MODIFIED: NONE.CT ;-U ;= V GSAENC:T/W INC R1 ;SKIP PAST CHARACTERISTIC HIGH BYTE=6X SUB #2,I.PRM+4(R3) ;ASSUME WE WILL PROCESS 2 BYTESY Z .IF DF T$$GMC&T$$SMC [ A\ CMPB #SF.GMC,I.FCN(R3) ;IS THIS REQUEST TO GET CHARACTERISTICSE%] BEQ 1000$ ;IF EQ, YES...GET THEM/^ _ .ENDC ;T$$GMC&T$$SMC ` a .IF DF T$$SMCb .c TST U.ATT-U.TSTA(R5) ;IS TERMINAL ATTACHED?3d BEQ 900$ ;IF EQ, NO...CAN'T SET CHARACTERISTICR5e BIT #1,(R1) ;SPECIFYING ODD ADDRESS FOR AST/TEP?Rf BNE 800$ ;ERROR IF ODD :g MOV (R1)+,-(SP) ;GET REQUESTED AST ADDRESS/TEP POINTER0h MOV R4,-(SP) ;SAVE OFFSET IN UCBX OF POINTERi j .IF DF T$$SPLk 'l MOV #120000,R4 ;SET POINTER TO UCBX,)m MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBXIn o .IFF ;T$$SPL p 1q MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING,r MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX POINTERs t .IFTF ;T$$SPLu 8x ADD (SP)+,R4 ;POINT TO ACB/TEP POINTER IN UCBX ;**-2)y TST (SP) ;ENABLE THE CHARACTERISTIC?Az BNE 100$ ;IF NE, YESR{ ; ,| ; REQUEST IS TO DISABLE THE CHARACTERISTIC} ;S,~ BIC R2,4(R5) ;DISABLE THE CHARACTERISTIC' CALL DEACB ;DEALLOCATE THE ACB/TEP   .IFF ;T$$SPL; 0 MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER  .IFTF ;T$$SPL 5 BIT #1,I.IOSB+4(R3) ;IS THIS AN INTERNAL REQUEST?A- BEQ 10$ ;IF EQ, NO...THIS IS A USER TASKI1 TST (SP)+ ;CLEAN UP STACK TO SKIP CO-ROUTINEO 10$:1 CLR (SP)+ ;CLEAN STACK, CLEAR CC-V, SET CC-Z 0 RETURN ;RETURN TO CO-ROUTINE OR DISPATCHER ;8 ; REQUEST IS TO ENABLE ASYNCHRONOUS EVENT NOTIFICATION ;( 100$:A4 MTPS #TTPRI ;LOCK OUT INTERRUPTS WHILE CHANGING, BIS R2,4(R5) ;;;MARK FUNCTION AS ENABLED  .IF DF R$$IIC 0 BIT #1,I.IOSB+4(R3) ;;;INTERNAL I/O REQUEST?0 BEQ 120$ ;;;IF EQ, NO...MUST BE FROM A TASK8 CMP (SP),(R4) ;;;INTERNAL REQUEST USING CURRENT TEP?1 BEQ 110$ ;;;IF EQ, YES...DON'T DEALLOCATE ITC4 CALL DEACB ;;;DEALLOCATE CURRENT TEP/ACB IF ONE 110$:E+ MOV (SP)+,(R4) ;;;STORE NEW TEP POINTERE TST (SP)+ ;;;CLEAN STACK   .IF NDF T$$SPL( 0 MOV I.PRM(R3),KISAR6 ;;;REMAP THE USER BUFFER  .ENDC ;NDF T$$SPL , BR 150$ ;;;ENABLE INTERRUPTS AND RETURN 120$:  .IFTF ;R$$IIC - MOV R2,-(SP) ;;;SAVE FUNCTION ENABLE FLA00<|tt tfDATAGQ' MOV (R4),R2 ;;;GET CURRENT TEP/ACBR  .IFT ;R$$IICS . BEQ 130$ ;;;IF EQ, NONE...ALLOCATE AN ACB ASSUME A.CBL,E.VSIZ$ TST A.CBL(R2) ;;;IS THIS AN ACB?5 BEQ 140$ ;;;IF EQ, YES...JUST CHANGE AST ADDRESS 7 CALL DEACB ;;;DEALLOCATE TEP BEFORE ACB ALLOCATIONN 130$:(  .IFF ;R$$IIC) ( BNE 140$ ;;;IF NE, USE EXISTING ONE  .ENDC ;R$$IIC , MOV R1,-(SP) ;;;SAVE USER BUFFER POINTER0 MOV R0,R1 ;;;COPY LENGTH OF ACB TO ALLOCATE" CALL ALACB ;;;ALLOCATE AN ACB* MOV (SP)+,R1 ;;;RESTORE BUFFER POINTER* BCS 920$ ;;;IF CS, ALLOCATION FAILURE& CLRB (R0)+ ;;;CLEAR ACB FLAG BYTE 140$:L2 BIS (SP)+,4(R5) ;;;SET FLAG TO ENABLE FUNCTION@ MOV (SP)+,A.AST(R2) ;;;SAVE AST ADDRESS, CLEAR CC-V AND CC-Z  .IFF ;T$$SPL 2 MOV I.PRM(R3),KISAR6 ;;;MAP BACK TO USER BUFFER  .ENDC ;T$$SPL - CALL @(SP)+ ;;;CALL CALLER AS CO-ROUTINEU 150$:R MTPS #0 ;ENABLE INTERRUPTSL RETURN ;BACK TO CALLER ;L$ ; ERROR PROCESSING FOR THE ROUTINE ;; 800$: 9 MOV #!,R0 ;ILLEGAL AST ADDRESS BR 905$ 900$:E= MOV #!,R0 ;ERROR WHEN NOT ATTACHEDE, 905$: CMP (SP)+,(SP)+ ;CLEAN UP THE STACK JMP CHRFIN ;FINISH ERRORC 920$: ;**-4$ MTPS #0 ;;;RE-ENABLE INTERRUPTS0 MOV #ERCUPN,R2 ;SET ERROR COMPLETION ROUTINE. TST -(R1) ;BACK UP BUFFER POINTER ;**-1/ ADD #8.,SP ;CLEAN OFF ALL STACK PARAMETERS . JMP (R2) ;PROCESS THE ERROR AND FINISH UP  .ENDC ;T$$SMC  .IF DF T$$GMC  ;<; ; REQUEST IS TO RETURN CHARACTERISTIC SETTING TO THE USER  ;# 1000$:  .IF DF T$$SPL 4 ADD #120000,R4 ;POINT TO ACB/TEP POINTER IN UCBX) MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBX  .IFF ;T$$SPL4 1 MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGR$ MOV U.TUX-U.TSTA(R5),R2 ;GET UCBX5 BEQ 1010$ ;IF EQ, NONE...CHARACTERISTIC DISABLEDS0 ADD R2,R4 ;POINT TO ACB/TEP POINTER IN UCBX  .IFTF ;T$$SPL , MOV (R4),R2 ;GET ACB/TEP POINTER IF ONE  .IFF ;T$$SPL   1010$:0 MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER  .ENDC ;T$$SPL  .IF DF R$$IIC : BIT #1,I.IOSB+4(R3) ;WAS THIS AN INTERNAL I/O REQUEST?6 BEQ 1020$ ;IF EQ, NO...RETURN FULL CHARACTERISTIC6 MOV R2,(R1)+ ;STORE TEP/ACB ADDRESS IN USER BUFFER TST (SP)+ ;CLEAN STACK RETURN ;ALL DONE 1020$:  .IFTF ;R$$IIC $ TST R2 ;IS THERE AN ACB OR TEP?) BNE 1030$ ;IF NE, YES...CHECK IT OUT42 CLR (R1)+ ;AST DISABLED, CLEAR CC-V, SET CC-Z% BR 1050$ ;SKIP TO FINISH REQUESTS 1030$:  .IFT ;R$$IIC   ASSUME A.CBL,E.VSIZ/ TST A.CBL(R2) ;IS THIS AN ACB? (CLEAR CC-C)I BEQ 1040$ ;IF EQ, YES2 MOV R2,(R1)+ ;STORE TEP POINTER IN USER BUFFER) SEC ;SET FLAG TO SHOW THIS IS A TEP  BR 1050$ ;FINISH REQUEST; 1040$:  .ENDC ;R$$IIC! 9" MOV A.AST(R2),(R1)+ ;STORE AST ADDRESS IN USER BUFFER # 1050$:/$ SEV ;SET CC-V TO INDICATE THIS WAS SF.GMC0% RETURN ;RETURN TO GET CHAR-DEPENDENT STUFF& ' .ENDC ;T$$GMC( %) .ENDC ;T$$SCA!T$$MHU!T$$ICS!T$$OOBR* + .PAGE @, .SBTTL . MPCCOR - MAP DRIVER DATA AND CALL BACK AS CO-ROUTINE- ;. ;+D/ ; **-MPCCOR - MAP DRIVER DATA AREA AND CALL CALLER AS A CO-ROUTINE0 ; J1 ; THIS ROUTINE WILL MAP THE DRIVER DATA AREA AND CALL BACK THE CALLER ASK2 ; A CO-ROUTINE. WHEN THE CALLER EXECUTES A RETURN, THIS ROUTINE WILL MAPI'3 ; BACK TO THE TASK BUFFER AND RETURN.C4 ;O 5 ; INPUTS:>6 ; 2(SP) = RETURN ADDRESS AFTER RESTORING TASK BUFFER MAPPING7 ; R3 => CURRENT I/O PACKET8 ;; 9 ; OUTPUTS:$: ; CC-C PRESERVED.; ; NO REGISTERS ARE MODIFIED BY THIS ROUTINE.< ;-= ;A > MPCCOR:E4? MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESS ON STACK(@ MOV R3,2(SP) ;SAVE I/O PACKET ADDRESSA 1B MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGT1C CALL @(SP)+ ;CALL CALLER BACK AS A CO-ROUTINEE+D MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSA0E MOV I.PRM(R3),KISAR6 ;MAP BACK TO USE005{ccccR BUFFER'F RETURN ;RETURN FROM THE CO-ROUTINESG H .ENDC ;T$$SMC!T$$GMC I J .PAGENAK .SBTTL . ALACB - ALLOCATE AND INITIALIZE AN AST CONTROL BLOCKSL ,M .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOBN O ;P ;+)Q ; **-ALACB - ALLOCATE AST CONTROL BLOCKAR ; FS ; THIS SUBROUTINE ALLOCATES AN AST CONTROL BLOCK AND INITIALIZES THEFT ; FIXED DATA. DATA THAT IS CHARACTERISTIC-DEPENDENT (SUCH AS A.AST)*U ; MUST BE SET BY THE CALLER UPON RETURN.V ; W ; INPUTS:<X ; R1 = SIZE IN BYTES OF ACB TO ALLOCATE (SAVED IN A.PRM+4)Y ; R3 => CURRENT I/O PACKET;Z ; R4 => OFFSET IN UCBX WHERE ADDRESS OF ACB WILL BE SAVEDN[ ; R5 => U.TSTA OF CURRENT UCBS\ ; ] ; OUTPUTS:A;^ ; CC-C CLEAR IF SUCCESSFUL ALLOCATION; CC-C SET OTHERWISEA&_ ; R0 => A.PRM+5 OF THE ALLOCATED ACBB` ; R2 => LINK WORD OF ALLOCATED ACB (ACB'S HAVE NEGATIVE OFFSETS)&a ; (R4) => LINK WORD OF ALLOCATED ACBb ;P.c ; THE ALLOCATED ACB IS FORMATTED AS FOLLOWS:d ; +e ; +-------------------------------------+Z9f ; | TTDRV KINAR5 BIAS | A.KSR5 (-4) +g ; |-------------------------------------|W9h ; | DEQUEUE SUBROUTINE ADDRESS (DQACB) | A.DQSR (-2)R+i ; |-------------------------------------|R&j ; | THREAD WORD (0) | (0)+k ; |-------------------------------------|B3l ; | LENGTH OF CONTROL BLOCK (0) | A.CBLG+m ; |-------------------------------------|C3n ; | # BYTES TO ALLOC ON STACK (16.) | A.BYT +o ; |-------------------------------------|-0p ; | AST ADDRESS (0) | A.AST+q ; |-------------------------------------|-2r ; | # AST PARAMETERS (1) | A.NPR+s ; |-----------------+-------------------|-3t ; | U.TTID | (0) | A.PRMD+u ; |-----------------+-------------------|-)v ; | POINTER TO U.TSTA | A.PRM+2T+w ; |-----------------+-------------------|-5x ; | | ACB SIZE | A.PRM+4O+y ; |-----------------+-------------------+-z ;-{ ; REGISTERS MODIFIED: R1| ;-} ;D~ ALACB: CALL $ALOCB ;ALLOCATE SPACE- BCS 10$ ;BR IF ERROR  .IF DF T$$OVL  .IF DF T$$SPL + MOV KISAR6,-(SP) ;SAVE APR6 DATA MAPPING-, MOV $DALED,KISAR6 ;AND MAP TO DRIVER DATA  .IFTF ;T$$SPL 5 MOV ROTMAP,(R0)+ ;INSERT DRIVER MAIN APR 5 MAPPINGU  .IFT ;T$$SPL+ : MOV (SP)+,KISAR6 ;RESTORE EITHER TASK OR DRIVER MAPPING  .ENDC ;T$$SPL  .IFF ;T$$OVL  9 MOV KINAR5,(R0)+ ;INSERT DRIVER APR 5 MAPPING (A.KSR5)S  .ENDC ;T$$OVL ; MOV #DQACB,(R0)+ ;INSERT POINTER TO ROUTINE TO CALL WHEN % ;AST BLOCK IS DEQUEUED (A.DQSR).) MOV R0,R2 ;SAVE ALLOCATED ACB ADDRESS ) MOV R0,(R4) ;STORE POINTER TO THE ACBN" TST (R0)+ ;SKIP OVER LINK WORD3 CLR (R0)+ ;SET BLOCK LENGTH ZERO TO FORCE SYSXTP0 ;TO CALL US WHEN BLOCK IS DEQUEUED (A.CBL)= MOV #16.,(R0)+ ;ALLOCATE 16. BYTES ON TASK'S STACK (A.BYT);, TST (R0)+ ;SKIP PAST AST ADDRESS (A.AST)# ;THIS WILL BE FILLED IN LATER(8 MOV #1,(R0)+ ;INSERT NUMBER OF AST PARAMETERS (A.NPR)  .IF DF T$$SPL 8 CLRB (R0)+ ;SKIP LOW BYTE OF FIRST PARAMETER (A.PRM)G MOVB 120000+U.TTID,(R0)+ ;SAVE USER DEFINED TERMINAL ID IN HIGH BYTE   .IFF ;T$$SPL+ < CLR (R0)+ ;SKIP OVER FIRST PARAMETER UNTIL LATER (A.PRM)  .IFTF ;T$$SPL 3 MOV R5,(R0)+ ;INSERT POINTER TO U.TSTA (A.PRM+2) 1 MOVB R1,(R0)+ ;SAVE SIZE OF THIS ACB (A.PRM+4)T  .IFF ;T$$SPLT 6 MOV U.TUX-U.TSTA(R5),R1 ;GET POINTER TO TOP OF UCBXD MOVB U.TTID(R1),-4(R0) ;INSERT USER-DEFINED TERMINAL ID (A.PRM+1)  .ENDC ;T$$SPL  10$: RETURN ;ALL DONER , .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB   .PAGED( .SBTTL . QPEIO - EXTENDED I/O REQUEST ;R ;+, ; **-QPEIO - EXTENDED I/O REQUEST (IO.EIO) ; O ; THIS ROUTINE VALIDATES THE PARAMETERS OF AN EXTENDED WRITE OR READ REQUEST.MI ; AN EXTENDED I/O REQUEST IS ONE WITH A FUNCTION CODE OF "IO.EIO" AND A M ; SUBFUNCTION OF "TF.WLB" OR "TF.RLB". ALL MODIFIERS AND PARAMETERS OF THE M 00<|tt tfDATA; REQUEST ARE SET UP IN AN ITEMLIST IN THE USER TASK SPACE INSTEAD OF BEING M ; PASSED FROM THE DPB VIA THE I/O PACKET. THIS MAKES IT POSSIBLE TO CREATEG ; MORE COMPLEX TYPES OF READS AND WRITES THAN CAN BE DONE BY "OR'ING"EN ; SUBFUNCTION BITS TOGETHER. FOR EXAMPLE, AN "IO.RPR" REQUEST CANNOT HAVE AN ; TERMINATOR TABLE SPECIFIED WITH IT (IO.RTT) SINCE THERE IS NOT ENOUGH ROOMO ; IN THE QIO PARAMETER LIST OR IN A NORMAL I/O PACKET FOR THE PROMPT VFC, THE O ; TIMEOUT VALUE, AND THE ADDRESS/LENGTH OF THE DATA BUFFERS. AN EXTENDED I/OEJ ; REQUEST ELIMINATES THIS RESTRICTION BY SPECIFYING THE PARAMETERS IN ANJ ; ITEMLIST POINTED TO BY THE QIO PARAMETER LIST AND BY SAVING ADDITIONALP ; INFORMATION IN AN I/O PACKET EXTENSION. THE USER'S ITEMLIST IS SPECIFIED BYK ; "P1" AND "P2" OF THE QIO PARAMETER LIST. THIS BUFFER HAS BEEN ADDRESS-ON ; CHECKED AND RELOCATED BY THE EXEC AND THE DOUBLEWORD ADDRESS AND LENGTH ISL ; STORED IN I.PRM THROUGH I.PRM+4. THE ITEMLIST HAS THE FOLLOWING FORMAT: ;F ; READ ITEM LIST:N ;N& ; +-------------------------------+ ; | MODIFIER WORD 1 |E& ; |-------------------------------| ; | MODIFIER WORD 2 |Y& ; |-------------------------------|% ; | ADDRESS OF READ DATA BUFFER |M& ; |-------------------------------|% ; | LENGTH OF READ DATA BUFFER | & ; |-------------------------------| ; | TIME OUT VALUE |& ; |-------------------------------|# ; | ADDRESS OF PROMPT BUFFER |T& ; |-------------------------------|# ; | LENGTH OF PROMPT BUFFER |-& ; |-------------------------------| ; | PROMPT VFC |& ; |-------------------------------|$ ; | TERMINATOR TABLE ADDRESS |& ; |-------------------------------|% ; | LENGTH OF TERMINATOR TABLE |-& ; |-------------------------------|& ; | DEFAULT INPUT BUFFER ADDRESS |& ; |-------------------------------|& ; |LENGTH OF DEFAULT INPUT BUFFER |& ; +-------------------------------+ ;  ;  ; WRITE ITEM LIST: ;-& ; +-------------------------------+ ; | MODIFIER WORD 1 |-& ; |-------------------------------| ; | MODIFIER WORD 2 |-& ; |-------------------------------|# ; | ADDRESS OF OUTPUT BUFFER |-& ; |-------------------------------|$ ; | LENGTH OF OUTPUT BUFFER |& ; |-------------------------------|! ; | VFC/CURSOR POSITION |-& ; +-------------------------------+ ;N ; *** NOTE ***+E ; AT PRESENT, THERE ARE TOO FEW PARAMETERS THAT CAN BE SPECIFIED ON-D ; EXTENDED WRITE REQUESTS TO JUSTIFY THE ALLOCATION OF AN IOPX FORG ; THEM. THUS, AN "IO.EIO!TF.WLB" REQUEST PACKET IS CONVERTED TO LOOKG ; LIKE A NORMAL "IO.WLB". NOTE THAT THIS REQUIRES ALL WRITE MODIFIER G ; BITS TO RESIDE IN THE LOW BYTE OF THE ITEMLIST MODIFIER WORD EXCEPTFH ; TF.FMT WHICH IS SPECIAL CASED. IT COMES TO US VIA THE USER MODIFIER% ; WORD OR I.PRM+13 FOR INTERNAL I/O- ;-; ; THE FOLLOWING ACTIONS MAY BE PERFORMED BY THIS ROUTINE:E6 ; 1. VALIDATE THE SIZE OF THE USER-DEFINED ITEMLIST.K ; 2. MAKE SURE NO SUBFUNCTIONS OTHER THAN TF.WLB OR TF.RLB ARE REQUESTED..I ; 3. CONVERT AN "IO.EIO!TF.WLB" REQUEST INTO A NORMAL "IO.WLB" REQUEST."D ; 4. ALLOCATE AN I/O PACKET EXTENSION (IOPX) FROM PRIMARY POOL FOR? ; SAVING PARAMETERS FROM THE USER'S ITEMLIST. IF THE IO.EIOI< ; IS AN INTERNAL I/O REQUEST, I.PRM MUST POINT TO AN IOPX& ; ALLOCATED AND SET UP BY THE USER.G ; 5. VALIDATE AND ADDRESS CHECK PARAMETERS IN THE USER'S ITEMLIST ANDV, ; SAVE NECESSARY INFORMATION IN THE IOPX.7 ; 6. LINK THE IOPX INTO A LIST OF IOPX'S FOR THE UCB.F@ ; 7. REQUEST THAT THE I/O PACKET BE LINKED INTO THE TERMINAL'S ; SCB I/O REQUEST QUEUE." ;  ; INPUTS: ; R3 => IO.EIO REQUEST PACKET  ; R4 => SCB FOR THE TERMINAL ; R5 => UCB FOR THE TERMINAL9 ; I.PRM => PRE-ALLOCATED IOPX IF IO.EIO IS INTERNAL I/OM ;O  ; OUTPUTS:/ ; R3 => IO.WLB REQUEST PACKET PASSED TO QPWLBL:! ; R4 = U.TSTA+2 BITS FOR DE-QUEUE BLOCKING (IN "TSTRQ")'" ; IOPX LINKED INTO I005{ccccOPX LIST (U.TIXL)E# ;.$$ ; REGISTERS MODIFIED: R0, R1, R2% ;-& ;T' ( .IF DF T$$EIO) .IF DF T$$OVL* + QPEIO1::, - .IFF ;T$$OVL . QPEIO::R/ 0 .ENDC ;T$$OVL1 2 .IF DF R$$IIC3 94 MOV I.PRM(R3),R0 ;ASSUME THERE IS A PRE-ALLOCATED IOPX585 BIT #1,I.IOSB+4(R3) ;IS THIS AN INTERNAL I/O REQUEST?6 BEQ 5$ ;IF EQ, NO/7 $8 ; THIS IS AN INTERNAL I/O REQUEST.9 ): BIT #TF.RLB,I.FCN(R3) ;IS THIS A READ?S-; BNE 15$ ;IF YES, IOPX IS ALREADY IN PLACE (< MOV #IO.WLB,I.FCN(R3);MARK AS A WRITE8= MOVB I.PRM+12(R3),I.FCN(R3) ;AND SET THE SUBFUNCTIONS> ? .IF DF T$$OVL@ "A JMP QPWTRA ;TRANSFER FOR QPWLBB C .IFF ;T$$OVLRD #E JMP QPWLB ;PROCESS IT AS IO.WLBIF G .ENDC ;T$$OVLH I 5$:M8J MOV R0,KISAR6 ;OTHERWISE, MAP TO USER ITEMLIST BUFFERK L .IFF ;R$$IIC/M 1N MOV I.PRM(R3),KISAR6 ;MAP USER ITEMLIST BUFFERIO P .ENDC ;R$$IICQ ,R BIT #1,I.PRM+2(R3) ;IS IT WORD ALLIGNED?S BNE 11$ ;IF ODD, BRANCHR=T CMP I.PRM+4(R3),#8. ;IS THE SIZE SMALLER THAN THE MINIMUM?VU BMI 11$ ;IF PL, YES;:V MOV #10.,R0 ;ASSUME CHECKING LENGTH OF TF.WLB ITEMLIST?W MOV #^C,R1 ;INVERSE OF LEGAL WRITE FLAGS ARE INVALIDB<X BIT #TF.WLB,I.FCN(R3) ;IS THIS AN EXTENDED WRITE REQUEST?7Y BNE 10$ ;IF NE, YES...ASSUMPTION WAS CORRECT - SKIP ;Z MOV #24.,R0 ;SET LENGTH OF TF.RLB ITEMLIST TO CHECK FORMA[ MOV #^C,R1 ;INVERSE OF EXTENDED READ FLAGS ARE INVALIDI\ 10$:0] CMP R0,I.PRM+4(R3) ;IS THE ITEMLIST TOO LARGE ^ BPL 12$ ;IF PL, NO, CONTINUE_ 11$:` .IF DF T$$OVLa %b MOV #IE.BAD&377,R0 ;GET ERROR CODE c JMP 930$Td e .IFF ;T$$OVLf g JMP EQPBAD ;ELSE, ERROR h i .ENDC ;T$$OVLj 12$::k BIT R1,@I.PRM+2(R3) ;ARE ANY INVALID MODIFIER BITS SET?7l BNE 25$ ;IF NE, YES...REPORT INVALID FUNCTION ERRORIm <n BIT #TF.WLB,I.FCN(R3) ;IS THIS AN EXTENDED WRITE REQUEST?6o BEQ 20$ ;IF EQ, NO...SKIP TO PROCESS EXTENDED READp ;ALq ; PROCESS AN EXTENDED WRITE REQUEST BY CONVERTING IT TO AN IO.WLB REQUEST.r ; <s MOV I.PRM+2(R3),R2 ;SET POINTER TO START OF USER ITEMLIST@t MOV #IO.WLB,I.FCN(R3) ;CHANGE FUNCTION CODE OF OUR I/O PACKET7u MOVB (R2),I.FCN(R3) ;GET THE WRITE REQUEST MODIFIERS ;v CMP (R2)+,(R2)+ ;SKIP HIGH BYTE AND UNUSED MODIFIER WORDB5w MOV (R2)+,R0 ;GET VIRTUAL ADDRESS OF OUTPUT BUFFER ,x MOV (R2)+,R1 ;GET LENGTH OF OUTPUT BUFFER&y MOV R3,R4 ;COPY I/O PACKET POINTER5z ADD #I.PRM+4,R4 ;POINT TO WHERE BUFFER LENGTH GOESE7{ MOV R1,(R4) ;COPY LENGTH OF SPECIFIED OUTPUT BUFFERS>| MOV (R2),2(R4) ;COPY VFC/CURSOR POSITION INFO TO I/O PACKET} 9~ CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFER/ / BCS 26$ ;IF CS, CHECK FAILED...RETURN ERRORS 7 MOV R2,-(R4) ;SAVE SECOND WORD OF DOUBLEWORD ADDRESSO% MOV R1,-(R4) ;SAVE FIRST WORD ALSOU 1 MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGT  .IF DF T$$OVL # CALLR QPWTRA ;TRANSFER TO QPWLBA  .IFF ;T$$OVL  : JMP QPWLB ;NOW PROCESS PACKET AS NORMAL IO.WLB REQUEST  .ENDC ;DF T$$OVL 15$: JMP 50$ ;BRANCH AIDP  ;NM ; PROCESS AN EXTENDED READ REQUEST BY BUILDING AN IOPX TO HOLD INFO FOR US./ ;  ASSUME I.XLNK,0 ASSUME I.XLNK+2,I.XIOP  ASSUME I.XIOP+2,I.XTCBO ASSUME I.XTCB+2,I.XMODS ASSUME I.XMOD+4,I.XRBFI ASSUME I.XRBF+4,I.XRBL$ ASSUME I.XRBL+2,I.XTMOR ASSUME I.XTMO+2,I.XPBFD ASSUME I.XPBF+4,I.XPBLR ASSUME I.XPBL+2,I.XPBV ASSUME I.XPBV+2,I.XTTBP ASSUME I.XTTB+4,I.XTTL  ASSUME I.XTTL+2,I.XDBF  ASSUME I.XDBF+4,I.XDBL5 H 20$: BIT #TF.RLB,I.FCN(R3) ;THIS ISN'T A WRITE, SO IT BETTER BE A READ* BNE 27$ ;IF EQ, INVALID FUNCTION ERROR 25$: .IF DF T$$OVL % MOV #IE.IFC&377,R0 ;GET ERROR CODEI  .IFF ;DF T$$OVL & JMP EQPIFC ;ELSE, INVALID FUNCTION  .ENDC ;DF T$$OVLB ; 26$: JMP 930$ ;ALWAYS NEEDED AS BRANCH STRETCHER ANYWAY.S  27$:4 MOV I.PRM+4(R3),R1 ;GET SPECIFIED EIO BUFFER SIZE3 MOV @I.PRM+2(R3),R4 ;GET SPECIFIED FUNCTION MASKT) BIT #TF.RDI,R4 ;READ W/ DEFAULT I00 <|tt tfDATANPUT?  BEQ 272$ ;BR IF NO RDI6 CMP R1,#24. ;IF RDI, MAKE SURE ALL 24. BYTES THERE BNE 11$ ;IF LESS, ERRORE BR 29$ ;ELSE, OK CONTINUE 272$:V, BIT #TF.RTT,R4 ;READ W/ TERMINATOR TABLE? BEQ 274$ ;BR IF NO RTT8 CMP R1,#20. ;IF RTT, CHECK MIN. REQUIRED BYTES THERE BMI 11$ ;IF LESS, ERRORE BR 29$  274$:  .IF DF T$$RPR " BIT #TF.RPR,R4 ;READ W/ PROMPT? BEQ 276$ ;BR IF NO RPR7 CMP R1,#14. ;CHECK MINIMUM REQUIRED BYTES SPECIFIEDI BMI 11$ ;IF LESS, ERROR BR 29$  276$:O .ENDC ; DF T$$RPR # BIT #TF.TMO,R4 ;READ W/ TIMEOUT?  BEQ 29$ ;BR IF NOT* CMP R1,#10. ;CHECK ALL BYTES SPECIFIED BMI 11$ ;IF LESS, ERRORT 29$:= MOV #I.XLEN,R1 ;SET SIZE OF AN I/O PACKET EXTENSION (IOPX)C< CALL $ALOCB ;ALLOCATE IOPX FROM PRIMARY POOL (IOPX IN.../ ; ...DRIVER POOL IS A MAPPING NIGHTMARE!)T+ BCS 910$ ;IF CS, NO FREE POOL...GIVE UPR MOV R0,R4 ;COPY IOPX ADDRESS9 MOV R3,-(SP) ;SAVE CURRENT I/O PACKET (IO.EIO) ADDRESSR& MOV R0,-(SP) ;AND SAVE IOPX ADDRESS ;R4 ; INITIALIZE AN IOPX FOR AN EXTENDED READ REQUEST. ;B" TST (R4)+ ;SKIP PAST LINK WORD6 MOV R3,(R4)+ ;FILL IN ASSOCIATED I/O PACKET ADDRESS0 MOV I.TCB(R3),(R4)+ ;FILL IN TASK TCB ADDRESS< MOV I.PRM+2(R3),R3 ;USE R3 AS A POINTER INTO THE ITEMLIST3 MOV (R3)+,(R4)+ ;SAVE FUNCTION MODIFIERS IN IOPXH- MOV (R3)+,(R4)+ ;MOVE UNUSED MODIFIER WORDI8 MOV (R3)+,R0 ;GET VIRTUAL ADDRESS OF READ DATA BUFFER MOV (R3),R1 ;GET BUFFER SIZE 9 CALL CKBFB ;CHECK FOR READ ACCESS AND RELOCATE BUFFERT 0 BCS 920$ ;IF CS, CHECK FAILED...RETURN ERROR6 MOV R1,(R4)+ ;SAVE FIRST WORD OF ADDRESS DOUBLEWORD7 MOV R2,(R4)+ ;SAVE SECOND WORD OF ADDRESS DOUBLEWORD;. MOV (R3)+,(R4)+ ;SAVE LENGTH OF READ BUFFER. MOV (R3)+,(R4)+ ;SAVE TIMEOUT VALUE IN IOPX  .IF DF T$$RPR 5 MOV (R3),R0 ;GET VIRTUAL ADDRESS OF PROMPT BUFFERI' MOV 2(R3),R1 ;GET PROMPT BUFFER SIZEA8 BIT #TF.RPR,-14(R4) ;EXTENDED READ W/PROMPT FUNCTION? BEQ 30$ ;IF EQ, NO...SKIPO 9 CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFERE 0 BCS 920$ ;IF CS, CHECK FAILED...RETURN ERROR6 MOV R1,(R4)+ ;SAVE FIRST WORD OF ADDRESS DOUBLEWORD7 MOV R2,(R4)+ ;SAVE SECOND WORD OF ADDRESS DOUBLEWORDN " TST (R3)+ ;POINT TO THE LENGTH0 MOV (R3)+,(R4)+ ;SAVE LENGTH OF PROMPT BUFFER+ MOV (R3)+,(R4)+ ;SAVE PROMPT VFC IN IOPXR BR 33$  30$:  .ENDC ;T$$RPR 1 ADD #6.,R3 ;SKIP PAST UNUSED ITEMLIST OFFSETST- ADD #8.,R4 ;SKIP PAST UNUSED IOPX OFFSETS  33$:: BIT #TF.RTT,-24(R4) ;READ W/TERMINATOR TABLE SPECIFIED? BEQ 35$ ;IF EQ, NO...SKIPU ? ; BIT #TF.PTT,-24(R4) ;WANT TO USE PREVIOUS TERMINATOR TABLE?M= ; BNE 35$ ;IF NE, YES...DON'T BOTHER TO CHECK TABLE PARAM.T 0 MOV (R3)+,R0 ;GET ADDRESS OF TERMINATOR TABLE/ MOV (R3),R1 ;GET LENGTH OF TERMINATOR TABLEE 9 CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFERR 4 BCS 920$ ;IF CS, CHECK FAILED...RETURN THE ERROR6 MOV R1,(R4)+ ;COPY FIRST WORD OF ADDRESS DOUBLEWORD5 MOV R2,(R4)+ ;COPY LAST WORD OF ADDRESS DOUBLEWORDP3 MOV (R3)+,(R4)+ ;COPY LENGTH OF TERMINATOR TABLE 5 BR 37$ ;BRANCH SINCE POINTERS ARE ALREADY CORRECTM 35$:5 CMP (R3)+,(R3)+ ;SKIP PAST UNUSED ITEMLIST OFFSETST, ADD #6,R4 ;SKIP PAST UNUSED IOPX OFFSETS 37$:D BIT #TF.RDI,I.XMOD-I.XDBF(R4) ;READ WITH DEFAULT INPUT SPECIFIED? BEQ 40$ ;IF EQ NO < MOV (R3)+,R0 ;GET VIRTUAL ADDRESS OF DEFAULT INPUT BUFFER0 MOV (R3),R1 ;GET DEFAULT INPUT BUFFER LENGTH 9! CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFERE" 0# BCS 920$ ;IF CS, CHECK FAILED...RETURN ERROR6$ MOV R1,(R4)+ ;SAVE FIRST WORD OF ADDRESS DOUBLEWORD7% MOV R2,(R4)+ ;SAVE SECOND WORD OF ADDRESS DOUBELWORDS7& MOV (R3)+,(R4)+ ;SAVE LENGTH OF DEFAULT INPUT BUFFERX' ;E:( ; EXTENDED READ ITEMLIST PARAMETERS HAVE BEEN VALIDATED.) ;N* 40$:1+ MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGT, &- MOV (SP)+,R0 ;RETRIEVE IOPX POINTER.. MOV (SP)+,R3 ;RESTORE I005{ccccO.EIO PACKET POINTER/ ; @0 ; LINK THE CURRENT IOPX INTO THE U.TIXL LIST FOR THE TERMINAL.1 ;02 50$:E3 MOV U.TIXL(R5),(R0) ;POINT THIS IOPX TO FIRST IOPX IN LIST, IF ANYRA4 MOV R0,U.TIXL(R5) ;THIS IOPX NOW BECOMES THE FIRST IN THE LISTW65 MOV #S2.IRQ,R4 ;READS MUST BLOCK IF INPUT IS ACTIVE6 7 .IF DF T$$RPR8 69 BIT #TF.RPR,I.XMOD(R0);WAS READ W/PROMPT SPECIFIED?/: BEQ 60$ ;IF EQ, NO...ALL CHECKING COMPLETEDAE; MOV #S2.IRQ!S2.ORQ,R4 ;PROMPT MUST BLOCK IF ACTIVE INPUT OR OUTPUTS< 60$:= > .ENDC ;T$$RPR? @ .IF DF T$$OVLA !B JMP QUETRA ;TRANSFER TO QUEUERC D .IFF ;DF T$$OVLE F JMP QUEUE ;QUEUE THE REQUESTG H .ENDC ;DF T$$OVLI ;/J ; ERROR PROCESSING FOR EXTENDED I/O REQUESTS.IK ;NL M 910$: 7N MOV #IE.NOD&377,R0 ;SET ERROR FOR NO NODES AVAILABLE3O BR 930$ ;RETURN ERROR (REMAP DRIVER ON THE WAY)EP 920$:P+Q MOV R0,R4 ;SAVE ERROR COMPLETION STATUSE&R MOV (SP)+,R0 ;RETREIVE IOPX ADDRESS#S MOV #I.XLEN,R1 ;GET SIZE OF IOPX $T CALL $DEACB ;DEALLOCATE THE IOPX,U MOV (SP)+,R3 ;RETRIEVE I/O PACKET ADDRESS(V MOV R4,R0 ;RESTORE COMPLETION STATUSW 930$:J,X .IF DF T$$OVL ;IF THE DRIVER IS OVERLAIDY 1Z MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGE[ CLR R1 ;INPUT TO $IOFIN \ CALLR $IOFIN ;FINISH REQUEST] ^ .IFF ;DF T$$OVL_ 5` JMP EQPFIN ;FINISH THE I/O REQUEST WITH THE ERROR$a b .IFT ;T$$OVLVc d e .PAGEN;f .SBTTL . BUFFER ADDRESS CHECKING AND RELOCATION ROUTINESLg ; h ;+4i ; **-CKBFR - ADDRESS CHECK BUFFER FOR READ ACCESS:j ; **-CKBFB - ADDRESS CHECK BUFFER FOR READ/WRITE ACCESSk ;EKl ; THESE ROUTINES PERFORM THE DESCRIBED ADDRESS CHECKING ON A USER BUFFER. m ;MIn ; NOTE: THIS CODE IS DUPLICATED FROM TTINI IN THE OVERLAID/EXTENDED I/ONIo ; DRIVER DUE TO MAPPING CONSIDERATIONS. THE CODE MUST RUN IN APR5 BUTIFp ; CAN'T BE EASILY TRANSFERRED TO FROM THE OVERLAY SINCE DATA APR6 IS<q ; NOT MAPPED TO THE DRIVER'S DATA, BUT TO THE USER BUFFER.r ;I s ; INPUTS:'t ; R0 => USER BUFFER (VIRTUAL ADDRESS)Fu ; R1 = LENGTH OF USER BUFFERDv ; w ; OUTPUTS:R,x ; CC-C = 0 IF ADDRESS CHECK WAS SUCCESSFUL$y ; CC-C = 1 IF ADDRESS CHECK FAILED6z ; R0 = ERROR CODE FOR ADDRESS CHECK FAILURE REASON:0{ ; "IE.SPC" IF SPECIFIED BUFFER LENGTH IS ZEROD| ; "IE.SPC" IF BUFFER NOT WORD ALIGNED OR EXEC ADDRESS CHECK FAILS8} ; "IE.BAD" IF BUFFER SIZE IS GREATER THAN 8128. BYTES/~ ; R1 = BIAS OF RELOCATED USER BUFFER ADDRESST7 ; R2 = DISPLACEMENT OF RELOCATED USER BUFFER ADDRESS  ;B ; REGISTERS MODIFIED: R0 ;- ;H  .IF DF A$$CHK .ENABL LSB   CKBFR:  .IF DF R$$MPL 7 MOV #$CKBFR,-(SP) ;SET UP CALL FOR READ-ACCESS CHECK  BR 10$ ;SKIP TO COMMON CODEA  .IFTF ;R$$MPL  CKBFB:  .IFT ;R$$MPL  8 MOV #$CKBFB,-(SP) ;SET UP CALL FOR WRITE-ACCESS CHECK 10$:  .IFTF ;R$$MPL ! TST R1 ;IS BUFFER SIZE VALID?15 BEQ 900$ ;IF EQ, NO...RETURN INVALID BUFFER ERRORI8 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?7 BHI 920$ ;IF HI, YES...RETURN BAD BUFFER SIZE ERROR  .IFT ;R$$MPL   .IF DF X$$HDR = MOV (SP),-(SP) ;DUPLICATE MAPPING ROUTINE ADDRESS ON STACKH. MOV KISAR6,2(SP) ;SAVE CURRENT EXEC MAPPING- MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADER   .IFTF ;X$$HDR 5 CALL @(SP)+ ;CALL REQUESTED ADDRESS CHECK ROUTINEF  .IFT ;X$$HDRT - MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGN  .ENDC ;X$$HDR  .IFF ;R$$MPL, + CALL $ACHKB ;DO NORMAL ADDRESS CHECKING   .ENDC ;R$$MPL - BCS 910$ ;IF CS, IT FAILED...RETURN ERRORP  .IFF ;A$$CHKH  CKBFR: CKBFB:  .IFTF ;A$$CHK ; CALL $RELOC ;RELOCATE ADDRESS AND CONVERT TO DOUBLEWORDM RETURN ;ALL DONEI  .IFT ;A$$CHKK  900$: 8 .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS  910$:FC MOV #IE.SPC&377,R0 ;SET COMPLETION ERROR CODE FOR INVALID BUFFERP BR 990$ ;SKIP; 920$:  8 .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS =00|tt tfDATA MOV #IE.BAD&377,R0 ;SET COMPLETION ERROR CODE FOR BAD SIZER 990$:O SEC ;RETURN WITH ERROR FLAG RETURN ;ALL DONE. .DSABL LSB   .ENDC ;A$$CHK   .ENDC ;T$$OVL .ENDC ;T$$EIO   .END  .IFT ;A$$CHKK  900$: 8 .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS  910$:FC MOV #IE.SPC&377,R0 ;SET COMPLETION ERROR CODE FOR INVALID BUFFERP BR 990$ ;SKIP; 920$:  8 .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS = .TITLE TTMOD  .IDENT /06.07/;U=; COPYRIGHT (c) 1986,1987 BY DIGITAL EQUIPMENT CORPORATION.U; ALL RIGHTS RESERVED.;R>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;T ;A ; 26-FEB-78 PETER WANNHEDEN. ;; ; PREVIOUSLY MODIFIED BY:P;; P. WANNHEDEN; C. F. SPITZ#; D. R. DONCHINA ; S. ADAMS;; MODIFICATIONS:;;R; L. KOGAN 02-NOV-85 06.019; LK701 -- FIX THE PROBLEM WITH DISABLING REMOTE LINES2; WHEN "CARRIER DETECT" IS SET BEFORE "RING" !; SIGNALR;; L. KOGAN 02-NOV-85 06.02:; LK702 -- FIX THE PROBLEM WITH DISABLING REMOTE LINES 1; WHEN CTS IS DROPPED FOR ABOUT 1/2 SEC AND ; THEN REASSERTED;N; S. ADAMS 16-JUNE-86 06.03D,; SA461 -- ON MODEM ANSWER CLEAR PASSTHRU;#!; S. R. CLOUTIER 8-AUG-86 06.04<; SRC -- ADD LHMHUP ENTRY POINT TO MHUP - CALLED BY TTLH2; DURING A STOP SESSION OR TIMEOUT. STATUS IS ; SUPPLIED IN R0 BEFORE CALL;C2; CHANGE MHUP TO SUPPLY STATUS TO KILLO1 IN R0;A; L. KOGAN 09-JAN-1987 06.05>; LK719 -- QUEUE AST ROUTINE AFTER HARDWARE DISCONNECT WHEN=; "MODEM HANG-UP AST" CHARACTERICTIC IS ENABLED (S3.MHE)T;E; T. Schoeller 6-FEB-87 06.06U>; TMS054 -- CORRECT SRC TO GET RID OF STATUS BEFORE RETURN.; ; T. Schoeller 7-MAR-87 06.07>; TMS055 -- Force R5 back to U.TSTA in USECDL!USECDH!USECDZ;I;S5;E6; 78 .PSECT MAP5.69; :;+#;; TTMOD - MODEM SUPPORT ROUTINES.H$<; CONTAINS THE FOLLOWING ROUTINES:=;*>; MODISR MODEM INTERRUPT SERVICE ROUTINE)?; HLMTIM SUBROUTINE TO SERVICE TIME-OUTS.@; MANS SUBROUTINE TO ANSWER A CALL ON A LINE%A; MHUP SUBROUTINE TO HANG UP A LINE B;-C;rD;BEF .IF DF T$$MODG H .ENABL LSB IJ;+JK; MODISR - INTERRUPT SERVICE ROUTINE FOR DATASET STATUS CHANGE INTERRUPT;L; ON DM11-BB, DL11-E OR DHV11, OR FROM DZ11 POLL SEQUENCESM;E N; INPUT:=O; R4 BIT 15: 1 IF INTERFACE SUPPORTS "DATASET READY" SIGNALS/P; BIT 14: 1 IF DATASET SHOWS "DATASET READY",Q; BIT 7: 1 IF RING HAS OCCURRED (DM11-BB)#R; 1 IF LINE IS RINGING (DL11-E)S2S; 1 RING INTEGRATED OVER THREE SAMPLES (DHV11).T; BIT 6: 1 IF DATASET SHOWS "CLEAR TO SEND"+U; BIT 5: 1 IF DATASET SHOWS "CARRIER ON"SV; R5 POINTER TO U.TSTAW;R X; OUTPUT:R'Y; 1. IF LINE IS NOT REMOTE, DROP DTR.T7Z; 2. IF LINE IS DISABLED AND NOT WAITING FOR CARRIER:E<[; 2.1 IF BIT 1 OF $TTPRM IS 0, AND NO RING SEEN, DROP DTR.F\; 2.2 IF BIT 1 OF $TTPRM IS 0, AND RING SEEN, SET A TIMER FOR M$$ANSA]; SECONDS AND RAISE DTR. (ANSWER A CALL AND WAIT FOR CARRIER.)S;^; 2.3 IF BIT 1 OF $TTPRM IS 1, AND DSR IS OFF, NO ACTION.SD_; 2.4 IF BIT 1 OF $TTPRM IS 1, AND DSR AND CARRIER AND CTS ARE ON,.`; ENTER SUBROUTINE MANS TO ANSWER THE CALL.Ea; 2.5 IF BIT 1 OF $TTPRM IS 1, DSR IS NOT AVAILABLE AND CARRIER ANDT"b; CTS ARE BOTH ON, SAME AS 2.4.Ec; 2.6 IF BIT 1 OF $TTPRM IS 1, DSR IS NOT AVAILABLE AND CARRIER ANDE$d; CTS ARE NOT BOTH ON, NO ACTION.Fe; 2.7 IF BIT 1 OF $TTPRM IS 1, AND DSR IS ON BUT CARRIER AND CTS ARE@f; NOT BOTH ON, SET A TIMER FOR M$$ANS SECONDS. (ANSWER A CALLg; AND WAIT FOR CARRIER.) 3h; 3. IF LINE IS DISABLED AND WAITING FOR CARRIER:Di; (RING FLAG IS IGNORED) 5j; 3.1 IF DSR IS OFF, DROP DTR AND HANG UP THE LINE.B?k; 3.2 IF CARRIER AND CTS ARE ON, CLEAR WAITING FLAG AND ENTERC?l; SUBROUTINE "MANS". (CARRIER APPEARED WITHIN WAITING00"5{cccc PERIODR$m; M$$ANS AFTER ANSWERING A CALL.),n; 3.3 IF CARRIER OR CTS IS OFF, NO ACTION.6o; 4. IF LINE IS ENABLED AND NOT WAITING FOR CARRIER:5p; 4.1 IF DSR IS OFF, DROP DTR AND HANG UP THE LINE. 2q; 4.2 IF CARRIER AND CTS ARE BOTH ON, NO ACTION.Gr; 4.3 IF BIT 0 OF $TTPRM IS 0, AND CARRIER OR CTS IS OFF, SET A TIMERDEs; FOR M$$CAR SECONDS AND SET WAITING FLAG. (CARRIER LOST, WAIT FORCt; IT TO RETURN.),Hu; 4.4 IF BIT 0 OF $TTPRM IS 1, AND CARRIER OR CTS IS OFF, DROP DTR ANDv; HANG UP THE LINE.2w; 5. IF LINE IS ENABLED AND WAITING FOR CARRIER:6x; (NOTE - THIS IS THE STATE THE LINE SHOULD STAY IN5y; UNTIL A BYE COMMAND HAS BEEN SUCCESSFULLY QUEUEDD6z; AFTER HAVING FAILED EARLIER AS RESULT OF HANG-UP.5{; IN THIS STATE, DTR SHOULD BE OFF SO THAT CARRIERI8|; WILL NEVER BE SEEN - CASE 5.4 SHOULD NEVER HAPPEN.)4}; 5.1 IF RING SEEN, DROP DTR AND HANG UP THE LINE.5~; 5.2 IF DSR IS OFF, DROP DTR AND HANG UP THE LINE.I@; 5.3 IF CARRIER OR CTS IS OFF, NO ACTION. (LINE STILL WITHOUT*; CARRIER, WAIT FOR CARRIER TO RETURN.);; 5.4 IF CARRIER AND CTS ARE BOTH ON, CLEAR WAITING FLAG.A7; (LINE RETURNED TO NORMAL CONDITION AFTER TEMPORARYE; LOSS OF CARRIER.);E; IN EITHER CASE:A ; CC-V 0$; CC-C 0 IF A CALL WAS ANSWERED; 1 NO ACTIONW; 1.; CC-C 0 CALLER SHOULD ENABLE DTR AND RTS); 1 CALLER SHOULD DISABLE DTR AND RTSL;; REGISTERS ALTERED: R2,R4;-;U; 6MODISR::BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;REMOTE LINE? BEQ 47$ ;;;N - IGNOREI COMB R4 ;;;INVERT FLAGSN- ROLB R4 ;;;GET INVERTED RING FLAG IN CC-CA4 MOVB U.STS-U.TSTA(R5),R2 ;;;GET DSB AND CRW FLAGS/ BIC #^C,R2 ;;;CLEAR JUNK BITSE ASSUME US.DSB,2 ASSUME US.CRW,4; JMP @MDSP(R2) ;;;DISPATCH ACCORDING TO DSB AND CRW FLAGS; 1; CASE 2 - DISABLED AND NOT WAITING FOR CARRIERA;S2MODI2:: BIT #2,$TTPRM ;;;ENABLE DTR BEFORE RING? BNE 3$ ;;;Y - JUMP2 BCS 30$ ;;;RING NOT SEEN - NO ACTION ; LK701G MOVB #M$$ANS+1,U.TMTI-U.TSTA(R5) ;;;SET TIMER = M$$ANS SECONDS ;**-1L9 BISB #US.CRW,U.STS-U.TSTA(R5) ;;;SET CARRIER-WAIT FLAGS1 SEV ;;;SET CC-V (CC-C IS CLEAR) TO RAISE DTRS RETURN2 3$: ROL R4 ;;;CHECK DSR FLAGS7 BVS 25$ ;;;DSR OFF - NO ACTION (BUT LEAVE DTR HIGH)A? BIT #600,R4 ;;;DSR ON (OR N/A) - HOW ABOUT CARRIER AND CTS?O9 BEQ MANS ;;;CARRIER AND CTS BOTH ON - ANSWER THE CALLA/ BCC 30$ ;;;DSR IS NOT AVAILABLE - NO ACTIONB* TST R4 ;;;DSR IS AVAILABLE - IS IT ON? BEQ 30$ ;;;N - JUMPMD5$: MOVB #M$$ANS+1,U.TMTI-U.TSTA(R5) ;;;SET TIMER = M$$ANS SECONDS% BR 20$ ;;;GO AND WAIT FOR CARRIERS;S-; CASE 3 - DISABLED AND WAITING FOR CARRIER;T$MODI3:: ROL R4 ;;;CHECK DSR FLAGS/ BVS 45$ ;;;DSR WENT AWAY - HANG UP THE LINET= BIT #600,R4 ;;;DSR ON (OR N/A) - CARRIER AND CTS BOTH ON?R BNE 30$ ;;;N - JUMP; BR MANS ;;;ANSWER CALL;R0; CASE 4 - ENABLED AND NOT WAITING FOR CARRIER;T$MODI4:: ROL R4 ;;;CHECK DSR FLAGS/ BVS 45$ ;;;DSR WENT AWAY - HANG UP THE LINE#1 BIT #600,R4 ;;;CARRIER AND CTS STILL BOTH ON?C BEQ 30$ ;;;Y - JUMPD? BIT #1,$TTPRM ;;;DROP LINE IMMEDIATELY UPON LOSS OF CARRIER?A BNE 45$ ;;;Y - JUMPOC MOVB #M$$CAR+1,U.TMTI-U.TSTA(R5) ;;;SET TIMER FOR M$$CAR SECONDSL" BR 20$ ;;;GO AND SET WAIT FLAG;-,; CASE 5 - ENABLED AND WAITING FOR CARRIER;;!MODI5:: BCC 45$ ;;;RING - JUMP ROL R4 ;;;CHECK DSR FLAGSI/ BVS 45$ ;;;DSR WENT AWAY - HANG UP THE LINEK SEC ;;;SET CC-C+ BIT #600,R4 ;;;CARRIER AND CTS BOTH ON?T BNE 40$ ;;;N - JUMPC4 BIT #1,$TTPRM ;;;DROP LINE IMMEDIATELY? ; LK7022 BNE 40$ ;;;NO - RETURN TO THE CALLER ; LK702* BR 50$ ;;;BOTH ON - CLEAR WAITING FLAG ;;;AND EXIT WITH CC-C = 1M810$: MOVB #1,U.TMTI-U.TSTA(R5) ;;;SET TIMER = 1 SECOND=20$: BISB #US.CRW,U.STS-U.TSTA(R5) ;;;SET CARRIER-WAIT FLAGO25$: CLV ;;;SHOW NO ACTION%30$: SEC ;;;SHOW NO CALL ANSWERED4 40$: RETURN ;-); COME HERE TO HANG UP LINE IMMEDIATELY;#64500*|tt tfDATA$: CALL 10$ ;;;START TIMER, SET CARRIER-WAIT FLAGB47$: .WORD SEC!SEV ;;;SET CC-V AND CC-C TO DROP DTR UPON RETURN RETURN ;T; ;+$; SUBROUTINE MANS - ANSWER A CALL.;A ; INPUT:; R5 POINTER TO U.TSTA;M ; OUTPUT: ?; UCB IS INITIALIZED. DISABLE AND CARRIER-WAIT FLAGS CLEARED.,%; CC-C 0 TO INDICATE CALL ANSWERED.A;; REGISTERS ALTERED: NONE;-; ;HMANS:: ;**-1R .IF DF USECDL!USECDH!USECDZ .IFTF ;USECDL!USECDH!USECDZ: BIS #S2.FLF,2(R5) ;;;INITIALIZE STATUS WORD 2 ;TMS055# CLC ;;;AND CLEAR CC-C ;**-1P .IFFU3 TST (R5)+ ;;;POINT TO 2ND STATUS WORD ;TMS055 < BIC #S2.WRA!S2.WRB!S2.CR,(R5)+ ;;;INITIALIZE STATUS WORDS2 BIC #S3.FDX!S3.8BC!S3.RAL!S3.PTH,(R5) ;SA4615 ;;;CLEAR FULL DUPLEX, 8 BIT CHARACTERS, ;SA461E/ ;;;READ-ALL, NO-ECHO AND PASSTHRU ;SA461N) BIS #S3.ACR,(R5)+ ;;;SET ACR ;**-1 ) BIC #^C,(R5) ;;;" SUB #6,R5 ;;;POINT TO U.TSTA) CLR U.TST5-U.TSTA(R5) ;;;CLEAR U.TST5OC BIC #U2.CRT!U2.HLD!U2.L3S!U2.VT5!U2.ESC,U.CW2-U.TSTA(R5) ; DD168* ;;;INITIALIZE CHARACTERISTICS WORD 2- BIC #U3.UPC,U.CW3-U.TSTA(R5) ;;;AND WORD 3;* MOV #72.,U.CW4-U.TSTA(R5) ;;;AND WORD 49 CLRB U.TTYP-U.TSTA(R5) ;;;SET TERMINAL TYPE TO UNKNOWNX .ENDC .IF DF R$$MPL!A$$CLI-1 BIC #UM.CLI,U.MUP-U.TSTA(R5) ;;;SET MCR AS CLI+ .ENDC .IF DF M$$CLI1  MOV #$MCRPT,U.CLI-U.TSTA(R5) ;;;SET MCR AS CLIT   .ENDC   .IF DF T$$SERC BIC #UM.SER!UM.CMD,U.MUP-U.TSTA(R5) ;;;RESET SERIAL COMMAND MODET .ENDC .IF DF D$$M11!D$$ZMD!D$$VMD ASSUME S4.ABD,10000034 TST 6(R5) ;;;AUTO-BAUD DETECT SET FOR THIS LINE?/ BPL 50$ ;;;IF NOT,DON'T START ABD DETECTIONRD BIS #S5.ABP,U.TST5-U.TSTA(R5) ;;;Y - INITIATE AUTO-BAUD DETECTION= MOV #S.4800,U.CW4-U.TSTA(R5) ;;;SET INITIAL AUTOBAUD SPEEDN .ENDC ;D$$M11!D$$ZMD!D$$VMD@50$: CLRB U.TMTI-U.TSTA(R5) ;;;STOP MODEM TIMER AND CLEAR CC-C+60$: BICB #US.DSB!US.CRW,U.STS-U.TSTA(R5).+  ;;;ENABLE LINE AND CLEAR WAITING FLAG%! RETURN ;;;RETURN WITH CC-V CLEARV" # .DSABL LSB4$%&;+7'; HLMTIM - TIME-OUT ON DM11-BB, DL11-E, DHV11 OR DZ11(;L ); INPUT:*; R5 POINTER TO U.TSTA+; ,; OUTPUT:P-; IF CARRIER-WAIT FLAG = 0:AF.; IF LINE IS LOCAL, RETURN TO CALLER WITH Z-BIT SET, WHICH INDICATES(/; THAT DTR AND RTS SHOULD BE DROPPED.I0; IF LINE IS REMOTE, RETURN TO CALLER WITH Z-BIT CLEAR, WHICH INDICATESC)1; THAT DTR AND RTS SHOULD BE ASSERTED.(2; 3; ELSE:A:4; CALLER CALLED AS COROUTINE WITH INTERRUPTS LOCKED OUT.55; ON RETURN FROM CALLER, THE FOLLOWING IS EXPECTED:T6;T7; R5 UNCHANGED8; DTR AND RTS DROPPED.9;-:;N;;@<HLMTIM::BITB #US.CRW,U.STS-U.TSTA(R5) ;;;ARE WE STILL WAITING?= BNE 20$ ;;;Y - JUMPS0> BIT #2,$TTPRM ;;;DON'T ASSERT DTR UNTIL RING?6? BEQ 10$ ;;;Y - JUMP (LEAVING CC-Z SET TO DROP DTR)2@ BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;IS LINE REMOTE?9A10$: RETURN ;;;RETURN TO CALLER WITH Z-BIT INDICATION(<B20$: SEZ ;;;SET Z-BIT TO TELL CALLER TO DROP DTR AND RTS-C CALL @(SP)+ ;;;CALL CALLER AS A COROUTINEE7D CALL @(SP)+ ;;;ALLOW INTERRUPTS (RETURN TO LOCKI IS $E ;;;ASSUMED TO BE ON THE STACK)?F MOVB #M$$DIS+1,U.TMTI-U.TSTA(R5) ;SET TIMER = M$$DIS SECONDS/G BITB #US.DSB,U.STS-U.TSTA(R5) ;LINE ENABLED? "H BEQ MHUP ;Y - HANG UP THE LINE4I BICB #US.CRW,U.STS-U.TSTA(R5) ;CLEAR WAITING FLAG J RETURNUKL; M; N;+O; SUBROUTINE MHUP - HANG UP.'P; MAY ONLY BE CALLED AT SYSTEM STATE!:Q; R; INPUT:S; R5 POINTER TO U.TSTA:T; US.DSB 0 TO PREVENT THAT A RING IS ANSWERED BEFORE THEU; TERMINAL IS LOGGED OFFR2V; LINE PHYSICALLY HUNG UP (DTR AND RTS DROPPED).W; X; OUTPUT:V(Y; IF ANY I/O WAS ACTIVE, IT IS KILLED.7Z; IF TERMINAL WAS LOGGED ON, A BYE COMMAND IS QUEUED.E'[; IF BYE COMMAND SUCCESSFULLY QUEUED:I\; US.DSB 1 (LINE DISABLED)A]; US.CRW 0 (NOT WAITING)R ^; ELSE:_; US.DSB 0 (L0029{ccccINE ENABLED)`; US.CRW 1 (WAITING)Aa;Y%b; REGISTERS ALTERED: R0,R1,R2,R3,R4 c;-d; e;I>eMHUP:: MOV #IE.DNR&377,R0 ;SET DEFAULT STATUS, IE.DNR ;SRC,eLHMHUP::MOV R0,-(SP) ;SAVE STATUS ;SRCIe BISB #US.CRW,U.STS-U.TSTA(R5) ;ASSUME FAILURE TO SEND BYE COMMAND ;SRCA4g ;THIS ALSO PREVENTS PROCESSING OF INPUT ;**-1h ;INTERRUPTSMij .IF DF T$$SPLkGl MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;MAP UCBX JUST IN CASE (IT MAY NOT BE.6m ;MAPPED IF WE COME HERE FOR POWER UP PROCESSING)no .ENDC ;T$$SPLp(q CALL I1CTXL ;FLUSH TYPE-AHEAD BUFFER6r BIC #S5.ABP,U.TST5-U.TSTA(R5) ;RESET AUTO-BAUD MODEst .IF DF T$$SPLu.v MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBXwx .IFF ;T$$SPL.y$z MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX{ BEQ 10$ ;NONE - JUMP|} .ENDC ;T$$SPL~) ASSUME U.TITI&1,0 ;U.TITI MUST BE EVEN ASSUME U.TOTI,U.TITI+10 CLR U.TITI(R4) ;CLEAR INPUT AND OUTPUT TIMERS5 MOV (SP),R0 ;GET STATUS TO RETURN TO TASK ;SRC 6 CALL KILLI1 ;KILL INPUT (IF ANY IN PROGRESS) ;SRC8 MOV (SP),R0 ;GET STATUS TO RETURN TO TASK ;TMS0548 CALL KILLO1 ;KILL OUTPUT (IF ANY IN PROGRESS) ;**-2 ;WITH STATUS IE.DNRU;10$: TST (SP)+ ;GET RID OF STATUS OFF THE STACK ;TMS054T ;**-1X .IF DF M$$MUP4 BIT #U2.LOG,U.CW2-U.TSTA(R5) ;TERMINAL LOGGED ON? BNE 20$ ;N - JUMP .IF DF T$$SPC% CLR R1 ;SET STATUS TO REQUEST BYEU MOV R5,R2 ;SET UCB ADDRESS SUB #U.TSTA,R2 ;S$ CALL $QCNTP ;QUEUE A BYE COMMAND .IFF ;T$$SPC)0 MOV #M$$CRB,R1 ;GET CLI COMMAND BUFFER LENGTH* CALL $ALOCB ;ALLOCATE A CLI CMD BUFFER BCS 40$ ;FAILED - EXIT" MOV R0,R1 ;COPY BUFFER POINTER" TST (R0)+ ;SKIP OVER LINK WORD MOV R5,R2 ;" SUB #U.TSTA,R2 ;GET UCB ADDRESS# MOV R2,(R0)+ ;INSERT UCB ADDRESST' MOV #"BY,(R0)+ ;INSERT "BYE" COMMAND MOV #'E!,(R0)+C$ CALL $QMCR ;QUEUE COMMAND TO MCR .ENDC ;T$$SPC .ENDC ;M$$MUPA; THE LINE MAY HAVE BECOME NON-REMOTE. IF SO, LEAVE IT ENABLED.;V120$: BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?  BEQ 30$ ;N - JUMP  ; LK719$ .IF DF T$$MHU ; LK719C ; LK719; BIT #S3.MHE,4(R5) ;IS CHARACTERISTIC ENABLED? ; LK719.! BEQ 25$ ;BR IF NO ; LK719, ; LK719R .IF DF T$$SPL ; LK719B ; LK719#. MOV #120000,R4 ;POINT TO UCBX. ; LK719 ; LK719. .IFF ;T$$SPL ; LK719 ; LK719M4 MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBX ; LK719 ; LK719R .ENDC ;T$$SPL ; LK719  ; LK719M0 MOV U.TMHA(R4),R1 ;GET ACB ADDRESS ; LK719 ; LK719  .IF DF T$$OVL ; LK719I ; LK719L" MOV #QUEAEN,-(SP) ; LK719* CALL MPROT ;QUE AST TO TASK ; LK719 ; LK719K .IFF ;T$$OVL ; LK719 ; LK719T5 CALL QUEAEN ;QUEUE AST TO ATTACHED TASK ; LK719$ ; LK719 .ENDC ;T$$OVL ; LK719U .ENDC ;T$$MHU ; LK719L ; LK719K25$: ; LK719 - BISB #US.DSB,U.STS-U.TSTA(R5) ;Y - DISABLEH=30$: BICB #US.CRW,U.STS-U.TSTA(R5) ;CLEAR CARRIER-WAIT FLAG.40$: RETURN ;  .ENDC ;T$$MOD;;V .END-(SP) ; LK719* CALL MPROT ;QUE AST TO TASK ; LK719 ; LK719K .IFF ;T$$OVL ; LK719 ; LK719T5 CALL QUEAEN ;QUEUE AST TO ATTACHED TASK ; LK719$ ; LK719 .ENDC ;T$$OVL ;  .TITLE TTYH .IDENT /06.03/K;B; COPYRIGHT (c) 1983,1986,1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;0>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;  ;7 ; 27-JAN-78 PETER WANNHEDENT ;  ; PREVIOUSLY MODIFIED BY:K;.; P. WANNHEDEN; C. F. SPITZ ; D. R. DONCHINL; R. PHILPOTTA ; S. ADAMS ; L. KOGAN;; MODIFICATIONS:;N;$; L. KOGAN00:|tt tfDATA 02-NOV-85 06.01<; LK703 -- DO NOT DISABLE REMOTE LINE WHEN DTR IS DROPPED;I; L. KOGAN 18-JUN-86 6.024; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT;D"; TODD SCHOELLER 27-Nov-86 06.03?; TMS047 -- SET TIMER TO EXPIRE IN THE UCB EXTENSION INDEXED; OFF OF THE CORRECT R4.;E0;1;2;+,3; CONTROLLER-DEPENDENT ROUTINES FOR DH-11.4;-5;P6;78 .IF DF D$$H119:; .MCALL UCBDF$<= UCBDF$ ;DEFINE UCB SYMBOLSI>? .IF DF R$$MPL@A .MCALL KRBDF$BC KRBDF$ ;DEFINE KRB SYMBOLSTDE .IFF ;R$$MPLOFG .MCALL SCBDF$HI SCBDF$ ;DEFINE SCB SYMBOLSLJK .ENDC ;R$$MPLLM .PSECT MAP5N;OO;HP; EQUATED SYMBOLS3Q; R; DH-11 REGISTER DEFINITIONSS; TSCR = 0 ;SYSTEM CONTROL REG.F$UNRC = 2 ;NEXT RECEIVED CHAR. REG.VLPR = 4 ;LINE PARAMETER REG.R WCAR = 6 ;CURRENT ADDRESS REG.XBCR = 10 ;BYTE COUNT REG.YBAR = 12 ;BUFFER ACTIVE REG.FZ;D[; \;+]; YHSTAX - START OUTPUT.7^; NOTE - NON-BUFFERED OUTPUT CURRENTLY NOT SUPPORTED.L_; `; INPUT:>a; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.b; U.TOP+2 BUFFER POINTERc; U.TOC BYTE COUNTd; e; OUTPUT:Bf; OUTPUT STARTED. g; U.TOP+2 UNCHANGEDh; U.TOC UNCHANGEDi;Rj; REGISTERS ALTERED: R4Rk;-l;Rm;. n .ENABL LSBIo;R pYHSTAX::Cq BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;HIGH PRIORITY OUTPUT REQUESTED?A7r BEQ 5$ ;;;N - POSSIBLY BEGIN NORMAL PRIORITY OUTPUTX?s BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT ALREADY IN PROGRESS?P<t BEQ 60$ ;;;Y - DO HIGH PRIORITY OUTPUT AT NEXT INTERRUPTGu BIS #S5.HPO,U.TST5-U.TSTA(R5);;;SHOW BUSY DOING HIGH PRIORITY OUTPUTT6v ;;;IN CASE A NORMAL PRIORITY REQUEST COMES ALONG(wSTAXH: CALL SELLIN ;;;SELECT THE LINE3x BIT #S5.XOF,U.TST5-U.TSTA(R5) ;;;OUTPUT AN XOFF?y BEQ 3$ ;;;N - JUMP8z BIC #S5.XOF,U.TST5-U.TSTA(R5) ;;;Y - RESET INDICATION{| .IF DF T$$SPL}3~ MOV #YVXOFF-20000,CAR(R3) ;;;POINT TO DMA BUFFER .IFF ;T$$SPL.- MOV #YVXOFF,CAR(R3) ;;;POINT TO DMA BUFFER$ .IFTF ;T$$SPL BR 4$ ;;;JOIN COMMON CODESN3$: BIC #S5.XON,U.TST5-U.TSTA(R5) ;;;NOT XOFF, MUST BE XON, RESET INDICATION .IFT ;T$$SPLY, MOV #YVXON-20000,CAR(R3) ;;;OUTPUT AN XON .IFF ;T$$SPL#' MOV #YVXON,CAR(R3) ;;;OUTPUT AN XON .ENDC ;T$$SPL04$: MOV #-1,BCR(R3) ;;;SET TO OUTPUT ONE CHAR.= BR YHRESX ;;;INITIATE THE OUTPUT REGARDLESS OF XOFF STATE;P5$: BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;HIGH PRIORITY OUTPUT REQUEST IN PROGRESS?< BNE 60$ ;;;Y - DO NORMAL PRIORITY OUTPUT AT NEXT INTRPT.STAXN: ;;;REFERENCE LABEL .IF DF T$$ACD. BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BNE 10$ ;;;Y - JUMP0" ADD #U.TOC,R4 ;;;POINT TO U.TOC:STAXM: MOV R2,-(SP) ;;;SAVE R2 DESTROYED BY MOUT ROUTINE- CALL MOUT ;;;GET NEXT CHARACTER TO OUTPUT3; MOVB R2,U.ADMA-U.TSTA(R5) ;;;PUT CHARACTER IN DMA BUFFERU MOV (SP)+,R2 ;;;RESTORE R2 CALL SELLIN ;;;SELECT LINE( MOV R5,CAR(R3) ;;;POINT TO DMA BUFFER! ADD #U.ADMA-U.TSTA,CAR(R3) ;;;L* MOV #-1,BCR(R3) ;;;OUTPUT ONE CHARACTER! BR 50$ ;;;INITIATE THE OUTPUT  .ENDC ;T$$ACD*10$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2 CALL SELLIN ;;;SELECT LINESTAX1: .IF DF T$$SPL3 MOV (R4),CAR(R3) ;;;SET BUFFER ADDRESS (U.TOP+2)O' CMP (R4)+,#120000 ;;;IN SYSTEM POOL?M/ BLO 20$ ;;;Y - UMR MAPPING IS CORRECT, JUMPBB SUB #20000,CAR(R3) ;;;FORCE BUFFER ADDRESS TO MAP THROUGH UMR 520$: ;;;REFERENCE LABEL .IFF ;T$$SPLD .IF DF M$$EXT4 MOV (R4)+,CAR(R3) ;;;SET BUFFER ADDRESS (U.TOP+2) .IFF ;M$$EXTO0 MOV (R4)+,-(SP) ;;;GET VIRTUAL BUFFER ADDRESS% CMP @SP,#120000 ;;;IN SYSTEM POOL? 8 BLO 40$ ;;;Y - VIRTUAL ADDRESS = PHYS. ADDRESS, JUMP? ADD RELC+2,@SP ;;;ADD RELOCATION CONSTANT TO VIRTUAL ADDRESS0 MOV RELC,-(SP) ;;; BCC 30$ ;;;NO CARRY - JUMP+ ADD #20,@SP ;;;ADD CARRY TO HIGH 2 BITSR+ BIC #^C<60>,@SP ;;;NORMALIZE HIGH 2 BITS:00B9{cccc;30$: BISB (SP)+,@R3 ;;;LOAD 2 HIGH BITS OF 18-BIT ADDRESS$$40$: MOV (SP)+,CAR(R3) ;;;LOAD CAR .ENDC ;M$$EXT .ENDC ;T$$SPL ASSUME U.TOC,E3 MOV @R4,BCR(R3) ;;;SET BYTE COUNT (U.TOC) IN BCRS NEG BCR(R3) ;;;NEGATE IT ASSUME S2.CTS,100000A.50$: TST 2(R5) ;;;OUTPUT STOPPED BY CTRL-S?) BMI 60$ ;;;IF SO, DON'T RESUME OUTPUT,; ;;+; YHRESX - RESUME OUTPUT.A;0 ; INPUT:>; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 0S;-; ;AHYHRESX::BIS $BTMSK(R2),BAR(R3) ;;;SET BIT IN BAR TO START TRANSMISSION .IF NDF D$$M11 YHMTIM:: .ENDC ;D$$M1160$: RETURN ;;;R;; .DSABL LSBT;O; ;+; YHABOX - ABORT OUTPUT.;A ; INPUT:>; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; ; REGISTERS ALTERED: R3U;-;;+YHABOX::CALL YHSTOX ;;;STOP TRANSMISSIONN CALL SELLIN ;;;SELECT LINE# CLR BCR(R3) ;;;CLEAR BYTE COUNT9 CLR BCR(R3) ;;;DO IT AGAIN - CONTROLLER MAY HAVE BEENB+ ;;;DOING A READ-MODIFY-WRITE CYCLE ONN0 ;;;THE BYTE COUNT REGISTER WHEN WE CLEARED ;;;IT FIRST TIME RETURN ;;;;;B;+; YHSTOX - STOP OUTPUT.B;A ; INPUT:>; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 1N;-;;IIYHSTOX::BIC $BTMSK(R2),BAR(R3) ;;;CLEAR BIT IN BAR TO STOP TRANSMISSIONI  RETURN ;;;E ;  ;L   .ENABL LSBR .IF DF T$$GMC!T$$SMC!D$$M11;+%; YHLPAR - GET/SET LINE PARAMETERS.B; ; INPUT:; R0 BIT 15: 0 = SET SPEED; 1 = GET SPEEDN6; BIT 13: 1 = SET 7-BIT CHARACTER LENGTH ; LK710?; BIT 12: 1 = CHECK IF 7-BIT CHARACTER IS SUPPORTED ; LK710=; BIT 11: 1 = SET SPEED SELECTED BY AUTO-BAUD DETECT LOGICN+; BIT 10: 1 = SET DEVICE DEPENDENT SPEED#; (USED FOR SETTING PARITY)L$; BIT 9: 1 = GET/SET ANSWER SPEED%; BIT 8: 0 = GET/SET RECEIVE SPEEDN ; 1 = GET/SET TRANSMIT SPEED; IF SET SPEED:1; BITS 0-7: NEW SPEED PARAMETER (S.XXX SYMBOL) ;:( ; R1 Flow control status change flags.!;P*"; BIT 0: 1 = Enable input flow control.+#; BIT 1: 1 = Disable input flow control.-+$; BIT 2: 1 = Enable output flow control.T,%; BIT 3: 1 = Disable output flow control.&;I'; BITS 4-15: Reserved(; >); REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.*; +; OUTPUT:W,; IF GET SPEED REQUESTED:/"-; R4 POINTER TO DH11 SPEED TABLE .; CC-C 0/;0; IF SET SPEED REQUESTED: 1; CC-C 0 IF OK!2; 1 IF ILLEGAL SPEED SPECIFIED13; L4; NOTE THAT THIS ROUTINE CAN BE EXECUTED AT BOTH SYSTEM STATE (IN RESPONSEP5; TO A SF.GMC OR SF.SMC QIO) AND FROM THE INPUT INTERRUPT SERVICE ROUTINE (FOR6; AUTO-BAUD DETECT).7;i8;-9;t:; ;;o <YHLPAR::=+> TST R1 ;Called for flow control change? ? BEQ 5$ ;If EQ no - go on.N"@ RETURN ;Not processed for DH.A5$:S&A .IF DF T$$GMC ! T$$SMC ; LK710A ; LK710C;A BIT #20000,R0 ;CHECK IF WE VALIDATE 7-BIT CHAR. ; LK710 A BEQ 7$ ;NO ; LK7101A RETURN ; LK710RA7$: ; LK710,A BIT #10000,R0 ;CHECK SET 7-BIT ; LK710+A BEQ 8$ ;NO. SET SPEED-PARITY ; LK710P;A BR SETLN1 ;SET 7-BIT AND OTHER LINE PARAMETERS ; LK710A8$: ; LK710A ; LK710a&A .ENDC ;T$$GMC ! T$$SMC ; LK710A ; LK710N0B BIT #4000,R0 ;SET SPEED FOR AUTO-BAUD DETECT?C BEQ 20$ ;N - JUMP (D BIT #2000,R0 ;DEVICE DEPENDENT SPEED?E BNE 10$ ;Y - JUMPA#F BIC #177400,R0 ;CLEAR UPPER BYTE76G MOVB SPDH-1(R0),R0 ;GET DEVICE DEPENDENT SPEED BITS/H10$: BIC #^C<17>,R0 ;CLEAR ALL BUT SPEED BITSII MOV R0,R2 ;GET A COPYOJK .IF DF R$$EISL:M ASH #4,R2 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITIONNO .IFF ;R$$EIS P<Q CALL SHIFT4 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITIONRS .ENDC ;R$$EIST(U BIS R0,R2 ;ADD IN RECEIVE SPEED BITS6V MOVB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED IN DATABASE5W BR SETLN1 00J|tt tfDATA;SET PARITY AND NEW SPEED IN CONTROLLER4X20$: ;REFERENCE LABELY .IF DF T$$GMC&T$$SMCDZ#[ MOV R0,R4 ;SAVE INPUT PARAMETERC(\ SWAB R4 ;PUT FLAGS IN LOW ORDER BYTE] BPL 30$ ;SET SPEED - JUMPF^_ .ENDC`a .IF DF T$$GMCb*c MOV #SPDH,R4 ;POINT TO DH11 SPEED TABLE!d RETURN ;RETURN WITH CC-C = 0Sef .ENDC ;T$$GMCgh .IF DF T$$SMC!D$$M11.ij .IF NDF T$$GMCSk#l MOV R0,R4 ;SAVE INPUT PARAMETERV*m SWAB R4 ;PUT FLAGS IN LOWER ORDER BYTEno .ENDC ;NDF T$$GMCp)q30$: BIC #177400,R0 ;CLEAR R0 HIGH BYTER%r MOVB SPDH-1(R0),R2 ;GET SPEED BITSDs SEC ;ASSUME ERROR)t BMI 40$ ;NOT A SUPPORTED SPEED - JUMPIu ASRB R4 ;SET ANSWER SPEED?v BEQ 50$ ;N - JUMPwx .IF DF D$$M11y/z BICB #17,U.CW3+1-U.TSTA(R5) ;CLEAR OLD VALUEE3{ BISB R2,U.CW3+1-U.TSTA(R5) ;SET NEW ANSWER SPEED$| CLC ;SHOW SUCCESS}~ .IFF ;D$$M11F7 SEC ;ATTEMPT TO SET ANSWER SPEED W/O MODEM SUPPORTA .ENDC ;D$$M11 40$: RETURN;N&50$: BCS 60$ ;TRANSMIT SPEED - JUMP5 BICB #17,U.CW3-U.TSTA(R5) ;CLEAR OLD RECEIVE SPEEDD! BR 70$ ;JUMP TO SET NEW SPEEDB;60$: BICB #360,U.CW3-U.TSTA(R5) ;CLEAR OLD TRANSMIT SPEEDE .IF DF R$$EIS2 ASH #4,R2 ;SHIFT SPEED BITS TO PROPER POSITION .IFF ;R$$EISL4 CALL SHIFT4 ;SHIFT SPEED BITS TO PROPER POSITION .ENDC ;R$$EIS.70$: BISB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED! BR 100$ ;GO AND LOAD INTO LPRR .ENDC ;T$$SMC!D$$M11 .IF DF D$$M11&R$$CONBYMLPAR::RETURN .ENDC .ENDC ;T$$GMC!T$$SMC!D$$M11;P;+; YHPWUP - POWER-UP.;P ; INPUT:>; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0 ; US.DSB 0I;-;.;R .IF DF R$$CON YHCONL:: .IF DF M$$EXT, MOV #UMR5S,R0 ;GET ADDRESS OF SAVED UMR 5& MOV #UBMPR+<5*4>,R1 ;POINT AT UMR 5  MOV (R0)+,(R1)+ ;SET UP UMR 5 MOV (R0)+,(R1)+ ; .IF NDF T$$SPL$  MOV (R0)+,(R1)+ ;SET UP UMR 6 MOV (R0)+,(R1)+ ; .ENDC ;NDF T$$SPL .ENDC ;M$$EXT YHCPUP:: .IFF%YHPWUP::TST R2 ;IS THIS LINE ZERO?E BNE 80$ ;N - JUMP. .IFTF/ MOV #4000,@R3 ;CLEAR SILO, UARTS, CONTROLLER$ MOV #20100,@R3 ;ENABLE INTERRUPTS .IFT  RETURNT YHUONL:: YHUPUP:: .ENDC ;R$$CON80$: ;REFERENCE LABEL .IF DF D$$M11- BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE? BEQ 100$ ;N - JUMP6 BIC #S5.ABP,U.TST5-U.TSTA(R5) ;RESET AUTO-BAUD MODE .IF NDF R$$MPLL# MOV U.SCB-U.TSTA(R5),R0 ;GET SCB4 TST S.DMCS(R0) ;IS THERE REMOTE SUPPORT FOR LINE? BNE 90$ ;Y - JUMP.3 BIC #U2.RMT,U.CW2-U.TSTA(R5) ;N - SET LINE LOCALT+ BR 100$ ;FORGET THAT IT WAS EVER REMOTEE90$: ;REFERENCE LABEL .IFTF ;NDF R$$MPL> BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIER FLAG .IFT ;NDF R$$MPLT MOV R3,-(SP) ;SAVE DH11 CSR- CALL YHMTIM ;ENABLE INTERRUPTS ON DM11-BBT! MOV (SP)+,R3 ;RESTORE DH11 CSRE .ENDC ;NDF R$$MPL .IF DF R$$CON# MOV U.SCB-U.TSTA(R5),R0 ;GET SCB ! MOV S.KRB(R0),R0 ;GET DH11 KRBB* MOVB K.CON(R0),R0 ;GET CONTROLLER INDEX0 ADD YMCP1,R0 ;POINT TO POINTER TO DM11-BB KRB MOV @R0,R0 ;GET DM11-BB KRB : MOVB U.UNIT-U.TSTA(R5),R1 ;GET UNIT NUMBER OF THIS LINE3 ASL R1 ;CONVERT FROM BYTE OFFSET TO WORD OFFSET; BIS $BTMSK(R1),K.PRM-2(R0) ;SET ENABLE BIT FOR THIS LINE3 BIT #KS.OFL,K.STS(R0) ;IS DM CONTROLLER OFFLINE?V BNE 100$ ;Y - JUMP MOV R3,-(SP) ;SAVE YH CSR MOV @R0,R3 ;GET YM CSR0 CALL YHMTMA ;LET DM KNOW ABOUT THIS LINE NOW MOV (SP)+,R3 ;RESTORE YH CSR. .ENDC ;R$$CON .ENDC( 100$: CALL LOCKI ;LOCK OUT INTERRUPTS@ SETLN1: MOV U.CW3-U.TSTA(R5),R2 ;GET NEW SPEED AND PARITY BITS) SETLIN: CALL SELLIN ;;;SELECT THE LINEO%  SWAB R2 ;;;PUT IN HIGH ORDER BYTE&  ROR R2 ;;;SHIFT TO PROPER POSITION ROR R2 ;;;. BIC #140017,R2 ;;;CLE00R9{ccccAR EXTRANEOUS NONSENSE5 BIT #30000,R2 ;;;TRANSMIT SPEED 110 BAUD OR LOWER?V BNE 110$ ;;;N - JUMP& BIS #4,R2 ;;;Y - SET TWO STOP BITS2110$: BIS #3,R2 ;;;SET FOR EIGHT BIT CHARACTERSC BIT #S5.CLN,U.TST5-U.TSTA(R5) ;;;CHECK 7-BIT CHARACTERS ; LK710 , BEQ 115$ ;;;NO LEAVE IT 8-BIT ; LK710& BIC #1,R2 ;;;SET 7-BIT ; LK710<115$: MOV R2,LPR(R3) ;;;LOAD NEW LINE PARAMETERS ; LK710 ; LK710R; ;**-19; WHEN RETURNING VIA COROUTINE "LOCKI", CC-C IS CLEAREDE;E RETURN ;RETURN#  .DSABL LSBT .IF DF R$$CON YHCOFF::# CALL LOCKI ;LOCK OUT INTERRUPTSS1  MOV #4000,@R3 ;;;CLEAR SILO, UARTS, CONTROLLERH ! RETURNC "YHUOFF::## CALL LOCKI ;LOCK OUT INTERRUPTS-"$ CALL SELLIN ;;;SELECT THE LINE0% CLR LPR(R3) ;;;SET TO 0 BAUD TO DISABLE LINE& RETURN ;;;DROP PRIORITY'( .ENDC ;R$$CON)*;L+;A,;+$-; INPUT INTERRUPT SERVICE ROUTINE..;-/;;0; 1 .ENABL LSBI2;A34 .IF DF R$$MPL5/6$YHINP::TTSET$ YH ;;;SAVE R2, R3 AND SET UP:S7 ;;; R3 = CSR ADDRESS8 ;;; R4 = KRB ADDRESS9: .IFF ;R$$MPLR;-<$DHINP::TTSET$ DH ;;;SAVE R2,R3 AND SET UPR= ;;; R3 = CSR"> ;;; R4 = ADDRESS OF UCB LIST?@ .ENDC ;R$$MPLA.B CALL MUXINP ;;;DO COMMON MULTIPLEXER INPUTC ;;;CHARACTER PROCESSINGT5D ;;;MUXINP DISMISSES INTERRUPT IF NO OUTPUT WORK,E BR 10$ ;;;XMIT READY - GO DO OUTPUT WORKF;G;H;+%I; OUTPUT INTERRUPT SERVICE ROUTINE. J;-K;L;IMN .IF DF R$$MPLO/P$YHOUT::TTSET$ YH ;;;SAVE R2, R3 AND SET UP: Q ;;; R3 = CSR ADDRESSR ;;; R4 = KRB ADDRESSST .IFF ;R$$MPLEU-V$DHOUT::TTSET$ DH ;;;SAVE R2,R3 AND SET UP4W ;;; R3 = CSR"X ;;; R4 = ADDRESS OF UCB LISTYZ .ENDC ;R$$MPL[>\10$: BIC #100077,@R3 ;;;CLEAR TRANSMIT DONE, UNIT NUMBER AND&] ;;;2 HIGH BITS OF UNIBUS ADDRESS#^ MOV R4,-(SP) ;;;SAVE KRB ADDRESSU_` .IF DF R$$MPLa-b ADD K.OFF(R4),R4 ;;;GET START OF UCB TABLEcd .ENDC ;R$$MPLe+f20$: MOV (R4)+,R5 ;;;GET NEXT UCB ADDRESS )g BEQ 80$ ;;;JUMP IF LINE IS NOT IN USEh CMP R5,#-1 ;;;END OF LIST?i BEQ 90$ ;;;Y - JUMPOjk .IF DF R$$CONl%m BITB #US.OFL,U.ST2(R5) ;;;OFFLINE? n BNE 80$ ;;;Y - JUMP op .ENDC ;R$$CONp ;TMS047#&p MOV R4,-(SP) ;;;SAVE R4 ;TMS047'p MOV R3,-(SP) ;;;SAVE CSR ;TMS047Sp ;TMS047(p .IF DF T$$SPL ;TMS047.p ;TMS047A2p MOV U.TAPR(R5),@#KDSAR5 ;;;MAP UCBX ;TMS047:p MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX ;TMS047/p ADD #U.TSTA,R5 ;;;POINT TO U.TSTA ;TMS047p ;TMS047Fp .IFF ;T$$SPL ;TMS047p ;TMS047N'p ASSUME U.TSTA, ;TMS047E4p ADD #U.TUX,R5 ;;;POINT TO UCBX POINTER ;TMS047(p MOV (R5)+,R4 ;;;GET UCBX ;TMS047p ;TMS047Mp .ENDC ;T$$SPL ;TMS0474p ;TMS0474*r BIT #2000,@R3 ;;;NXM BIT SET? ;**-1s BEQ 30$ ;;;N - JUMPTt BIS #400,@R3 ;;;Y - CLEAR IT;8u MOVB #1,U.TOTI(R4) ;;;SET TIMER TO EXPIRE IN 1 SECOND+u BR 60$ ;;;GO ON TO NEXT LINE ;TMS047ABw30$: TST BCR(R3) ;;;HAS THIS LINE COMPLETED TRANSMISSION? ;**-1#w BNE 60$ ;;;N - JUMP ;TMS047AM BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;ANY HIGH PRIORITY OUTPUT REQUEST PE;**-18 BEQ 35$ ;;;N - JUMPC/ MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET UNIT NUMBER$ ASL R2 ;;; .. TIMES 2 , CALL STAXH ;;;START HIGH PRIORITY OUTPUT5 BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED D35$: BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT INTERRUPT UNEXPECTED? BNE 45$ ;;;Y - JUMP I BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;JUST STARTING NORMAL PRIORITY OUTPUT?A5 BEQ 37$ ;;;N - COMPLETE INTERRUPTED OUTPUT STREAML BIC #S5.HPO,U.TST5-U.TSTA(R5) ;;;START NORMAL (NOT HIGH) PRIORITY REQUEST/ MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET UNIT NUMBER( ASL R2 ;;; .. TIMES 2? CALL STAXN ;;;BEGIN OUTPUT DELAYED BY HIGH PRIORITY REQUEST 5 BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETEDP37$: .IF00Z|tt tfDATA DF T$$ACD. BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BNE 40$ ;;;Y - JUMP#" ADD #U.TOC,R4 ;;;POINT TO U.TOC' DEC @R4 ;;;ANYTHING LEFT TO OUTPUT?$ BEQ 50$ ;;;N - JUMPP/ CALL STAXM ;;;Y - INITIATE ANOTHER TRANSFERR5 BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED  .ENDC ;T$$ACD*40$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+28 CALL NXTOB ;;;GET NEXT OUTPUT BUFFER IF THERE IS ONE BEQ 50$ ;;;N - JUMPC;A7; WE GOT ANOTHER OUTPUT BUFFER - START OUTPUTTING IT. ;D! TST -(R4) ;;;POINT TO U.TOP+2  MOV (SP)+,R3 ;;;GET CSR/ MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET UNIT NUMBERC ASL R2 ;;; .. TIMES 2E CALL STAX1 ;;;START OUTPUT BR 70$ ;;;K45$: BIC #S5.HPO,U.TST5-U.TSTA(R5) ;;;NO HIGH PRIORITY OUTPUT IN PROGRESSA5 BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETEDA;./50$: CALL ODONE ;;;DO OUTPUT DONE PROCESSINGE*60$: MOV (SP)+,R3 ;;;RESTORE CSR POINTER!70$: MOV (SP)+,R4 ;;;RESTORE R4T;80$: BICB #60,@R3 ;;;CLEAR 2 HIGH BITS OF UNIBUS ADDRESS-* ;;;TO AVOID OVERFLOW INTO BIT 6 WHEN! ;;;INCREMENTING LINE NUMBER5% INCB @R3 ;;;INCREMENT LINE NUMBER; BR 20$ ;;;GO TRY NEXT LINE; 9; ALL LINES SCANNED. SEE IF ANY LINE COMPLETED TRANSMIT)!; "BEHIND" US IN THE SCAN LOOP.R;*90$: MOV (SP)+,R4 ;;;RESTORE KRB ADDRESS+ ;;; OR ADDRESS OF UCB LIST (RSX-11M)T TST @R3 ;;;XMIT RDY SET?' BMI 10$ ;;;Y - DO IT ALL OVER AGAIN:;(7; ALL OUTPUT WORK DONE. SEE IF ANY INPUT WORK NEEDED.I;T. MOV NRC(R3),R5 ;;;GET A CHARACTER FROM SILO BPL 100$ ;;;NONE - EXITC- CALL MUXIN1 ;;;PROCESS AS INPUT INTERRUPTN& BR 10$ ;;;OUTPUT WORK TO DO - JUMP5 ;;;MUXIN1 DISMISSES INTERRUPT IF NO OUTPUT WORKM;D;S;;B .IF NDF R$$EISO;J; SUBROUTINE TO SHIFT R2 4 BIT POSITIONS TO THE LEFT FOR NON-EIS SYSTEMS;RSHIFT4: ASL R2 ;SHIFT ONCED ASL R2 ;TWICE  ASL R2 ;THRICE ASL R2 ;LAST TIME  RETURN  .ENDC ;NDF R$$EIS;I&; SUBROUTINE TO SELECT LINE ON DH11.;F;I<SELLIN: BICB #77,@R3 ;;;CLEAR LINE NUMBER AND 2 HIGH BITS ;;;OF 18-BIT ADDRESS, BISB U.UNIT-U.TSTA(R5),@R3 ;;;SELECT LINE100$: RETURN ;;;;  .DSABL LSB .IF DF D$$M11 .IF DF R$$CON YMCONL:: YMCPUP::" CALL LOCKI ;RAISE OUR PRIORITY% BIC #1040,@R3 ;;;STOP DM11-BB SCAN $10$: BIT #20,@R3 ;;;SCAN STOPPED? BNE 10$ ;;;N - WAIT% CLR R0 ;;;INITIALLY SET TO LINE 0!20$: MOV R0,@R3 ;;;SELECT LINEU$ ASL R0 ;;;CONVERT TO WORD OFFSET< BIT $BTMSK(R0),K.PRM-2(R2) ;;;SHOULD WE ENABLE THIS LINE? BEQ 30$ ;;;N - JUMPT6 BIS #7,2(R3) ;;;Y - ASSERT DTR, RTS AND LINE ENABLE30$: ASR R0 ;;;RESTORE COUNTS$ INC R0 ;;;INCREMENT TO NEXT LINE' CMP R0,#15 ;;;GONE THRU EVERY LINE?: BLE 20$ ;;;N - LOOPU- BIS #140,@R3 ;;;ENABLE SCAN AND INTERRUPTSA) RETURN ;;;RETURN WILL LOWER PRIORITY YMCOFF::# CALL LOCKI ;LOCK OUT INTERRUPTSE/ BIC #1140,@R3 ;;;DISABLE SCAN AND INTERRUPTS YMSTAX:: YMABOX:: YMRESX:: YMSTOX:: YMMTIM:: YMUPUP:: YMUONL:: YMUOFF::  RETURN ;;;; .ENDC ;R$$CON;++; DM11-BB DATASET STATUS CHANGE INTERRUPTR;-;T;O .IF DF R$$MPL/$DM11B::TTSET$ YM ;;;SAVE R2, R3 AND SET UP:R ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS .IFF ;R$$MPLU-$DM11B::TTSET$ DM ;;;SAVE R2,R3 AND SET UP  ;;; R3 = DH11 CSR;%! ;;; R4 = ADDRESS OF DH UCB LIST;#" MOV -4(R4),R3 ;;;GET DM11-BB CSRT#$ .ENDC ;R$$MPL%3& BIC #240,@R3 ;;;CLEAR DONE FLAG AND DISABLE SCAN.' MOV (R3)+,R5 ;;;GET LINE NUMBER IN BITS 0-3(( CALL MUXUCB ;;;GET POINTER TO U.TSTA") BCS 10$ ;;;UNKNOWN LINE - JUMP"* MOV @R3,R4 ;;;GET MODEM STATUS7+ CALL MODISR ;;;DO COMMON MODEM INTERRUPT PROCESSINGA., BVC 10$ ;;;NO SPECIAL ACTION NEEDED - JUMP- BCS 5$ ;;;DROP DTR - JUMPD1. BIS #7,@R3 ;;;ASSERT DTR, RTS AND LINE ENABLES!/ BIS #40,-(R3) ;;;REENABLE SCANB 0 RETURNM405$: BIC #6,@R3 00bg{cccc;;;DEASSERT DTR AND RTS ; LK703.210$: BIS #40,-(R3) ;;;REENABLE SCAN ;**-1&3 BCS 30$ ;;;NO CALL ANSWERED - JUMP%4 MOV U.SCB-U.TSTA(R5),R3 ;;;GET SCBG56 .IF DF R$$MPL7*8 MOV @S.KRB(R3),R3 ;;;GET DH CSR ADDRESS9: .IFF ;R$$MPLS;)< MOV S.CSR(R3),R3 ;;;GET DH CSR ADDRESSP=> .ENDC ;R$$MPL?1@ MOVB U.CW3+1-U.TSTA(R5),R2 ;;;GET ANSWER SPEEDP/A BICB #^C<17>,R2 ;;;CLEAR ALL BUT SPEED FIELDNAB MOVB R2,U.CW3-U.TSTA(R5) ;;;SAVE NEW RECEIVE SPEED IN DATABASE$CD .IF DF R$$EISE2F ASH #4,R2 ;;;SET TRANSMIT SPEED = ANSWER SPEEDGH .IFF ;R$$EISI4J CALL SHIFT4 ;;;SET TRANSMIT SPEED = ANSWER SPEEDKL .ENDC ;R$$EISMBN BISB R2,U.CW3-U.TSTA(R5) ;;;SAVE NEW TRANSMIT SPEED IN DATABASE;O MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW SPEED AND PARITY BITSSP ASSUME S4.ABD,1000000Q TST 6(R5) ;;;AUTO-BAUD SPEED DETECT ENABLED?%R BPL 20$ ;;;IF NOT, DON'T SET BAUDU,S MOV #314,R2 ;;;Y - SET LINE TO 4800 BAUD)T20$: JMP SETLIN ;;;SET LINE PARAMETERSU;D$V30$: RETURN ;;;DISMISS INTERRUPTW; X; Y;+Z; YHMTIM - MODEM TIME-OUT[;-\;L];F^_ .IF DF R$$MPL`*aYHMTIM::MOV U.SCB-U.TSTA(R5),R3 ;GET SCB!b MOV S.KRB(R3),R3 ;GET DH11 KRBE*c MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX0d ADD YMCP1,R3 ;POINT TO POINTER TO DM11-BB KRB!e MOV @(R3)+,R3 ;GET DM11-BB CSR)fg .IFF ;R$$MPLDh*iYHMTIM::MOV U.SCB-U.TSTA(R5),R3 ;GET SCB%j MOV S.DMCS(R3),R3 ;GET DM11-BB CSR kl .ENDC ;R$$MPLm nYHMTMA:E"o CALL LOCKI ;DISABLE INTERRUPTSp BIC #1040,@R3 ;;;STOP SCAN $q10$: BIT #20,@R3 ;;;SCAN STOPPED?r BNE 10$ ;;;N - WAIT$s BIC #17,@R3 ;;;CLEAR LINE NUMBERt;-2u; NOTE - CANNOT USE BYTE INSTRUCTIONS ON DM11-BBv;E/w MOVB U.UNIT-U.TSTA(R5),R4 ;;;GET LINE NUMBERAx BIS R4,(R3)+ ;;;SELECT LINE6y CALL HLMTIM ;;;DO COMMON MODEM TIME-OUT PROCESSING1z BEQ 20$ ;;;IF EQ Z-BIT SET - DROP DTR AND RTSR1{ BIS #7,@R3 ;;;ASSERT DTR, RTS AND LINE ENABLE| BR 30$ ;;;ENABLE SCAN/}20$: BIC #17,@R3 ;;;DROP DTR, RTS, SEC. XMITB~ INC @R3 ;;;SET LINE ENABLE330$: BIS #140,-(R3) ;;;ENABLE SCAN AND INTERRUPTSW$ RETURN ;;;RETURN FROM COROUTINE .ENDC ;D$$M11 .ENDC ;D$$H11 .ENDBv;E/w MOVB U.UNIT-U.TSTA(R5),R4 ;;;GET LINE NUMBERAx BIS R4,(R3)+ ;;;SELECT LINE6y CALL HLMTIM ;;;DO COMMON MODEM TIME-OUT PROCESSING1z BEQ 20$ ;;;IF EQ Z-BIT SET - DROP DTR AND RTSR1{ BIS #7,@R3 ;;;ASSERT DTR, RTS AND LINE ENABLE| BR 30$ ;;;ENABLE SCAN/}20$: BIC #17,@R3 ;;;DROP DT .TITLE TTYZ .IDENT /06.01/ ;L7; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION$; ALL RIGHTS RESERVED.;R>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;E ; ; 27-JAN-78 PETER WANNHEDEN  ;C ; PREVIOUSLY MODIFIED BY:;R; P. WANNHEDEN; C. F. SPITZE; D. R. DONCHIN$; S. C. ADAMS# ; T. LEKAS;E; MODIFICATION HISTORY:W;O; L. KOGAN 18-JUN-86 6.014; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT;I ;c!" .PSECT MAP5#;N$;+,%; CONTROLLER-DEPENDENT ROUTINES FOR DZ-11.&;-';R(;F)* .IF DF D$$Z11+,; EQUATED SYMBOLSR-;E.; DZ-11 REGISTER DEFINITIONS/;F#0CSR = 0 ;CONTROL AND STATUS REG.N-1RBUF = 2 ;RECEIVER BUFFER REG. (READ-ONLY)F,2LPR = 2 ;LINE PARAMETER REG. (WRITE-ONLY)!3TCR = 4 ;TRANSMIT CONTROL REG. )4MSR = 6 ;MODEM STATUS REG. (READ-ONLY)N15TBUF = 6 ;TRANSMITTER BUFFER REG. (WRITE-ONLY) 6;07;N8 9 .ENABL LSBE:; .IF DF T$$GMC!T$$SMC!D$$ZMD<=;+%>; YZLPAR - GET/SET LINE PARAMETERS.T?;I @; INPUT:A; R0 BIT 15: 0 = SET SPEEDB; 1 = GET SPEED 6B; BIT 13: 1 = SET 7-BIT CHARACTER LENGTH ; LK710?B; BIT 12: 1 = CHECK IF 7-BIT CHARACTER IS SUPPORTED ; LK710 =C; BIT 11: 1 = SET SPEED SELECTED BY AUTO-BAUD DETECT LOGICE+D; BIT 10: 1 = SET DEVICE DEPENDENT SPEED#E; (USED FOR SETTING PARITY)Y$F; BIT 9: 1 = GET/SET ANSWER SPEEDG; IF SET SP00j|tt tfDATAEED:1H; BITS 0-7: NEW SPEED PARAMETER (S.XXX SYMBOL)TI;!(J; R1 Flow control status change flags.K;A*L; BIT 0: 1 = Enable input flow control.+M; BIT 1: 1 = Disable input flow control.1+N; BIT 2: 1 = Enable output flow control.,O; BIT 3: 1 = Disable output flow control.P;TQ; BITS 4-15: ReservedR;S>S; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.T;V U; OUTPUT: V; IF GET SPEED REQUESTED:E"W; R4 POINTER TO DZ11 SPEED TABLE X; CC-C 0Y;Z; IF SET SPEED REQUESTED: [; CC-C 0 IF OK!\; 1 IF ILLEGAL SPEED SPECIFIED1]; L^; NOTE THAT THIS ROUTINE CAN BE EXECUTED AT BOTH SYSTEM STATE (IN RESPONSEP_; TO A SF.GMC OR SF.SMC QIO) AND FROM THE INPUT INTERRUPT SERVICE ROUTINE (FOR`; AUTO-BAUD SPEED DETECT).a; b;-c; d;o eYZLPAR::fg .IF DF D$$ZMD!T$$GMC!T$$SMCh+i TST R1 ;Called for flow control change?Oj BEQ 5$ ;If EQ no - go on. "k RETURN ;Not processed for DZ.l5$: l ; LK710 ;l BIT #20000,R0 ;CHECK IF WE VALIDATE 7-BIT CHAR. ; LK710l BEQ 7$ ;NO ; LK710Fl RETURN ; LK710Hl7$: ; LK710,l BIT #10000,R0 ;CHECK SET 7-BIT ; LK710+l BEQ 8$ ;NO. SET SPEED-PARITY ; LK710E;l BR SETLN1 ;SET 7-BIT AND OTHER LINE PARAMETERS ; LK710 l8$: ; LK710l ; LK710 l ; LK7100m BIT #4000,R0 ;SET SPEED FOR AUTO-BAUD DETECT?n BEQ 10$ ;N - JUMPg,o BIT #2000,R0 ;SET DEVICE DEPENDENT SPEED?p BEQ 20$ ;N - JUMP1/q BIC #^C<17>,R0 ;CLEAR ALL BUT NEW SPEED BITSCr BR 40$ ;SET NEW SPEED;s10$: ;REFERENCE LABELtu .ENDC ;D$$ZMD!T$$GMC!T$$SMCvwx .IF DF T$$GMC&T$$SMC yz TST R0 ;GET OR SET SPEED?E{ BPL 20$ ;SET - JUMPE|} .ENDC ;T$$GMC&T$$SMCD~ .IF DF T$$GMC* MOV #SPDZ,R4 ;POINT TO DZ11 SPEED TABLE! RETURN ;RETURN WITH CC-C = 0B .ENDC ;T$$GMC .IF DF T$$SMC!D$$ZMDQ(20$: MOV R0,R4 ;COPY SPEED PARAMETERS# BIC #177400,R0 ;CLEAR UPPER BYTEM% MOVB SPDZ-1(R0),R0 ;GET SPEED BITSW SEC ;ASSUME ERROR! BMI 30$ ;ILLEGAL SPEED - JUMPN" BIT #1000,R4 ;SET ANSWER SPEED? BEQ 40$ ;N - JUMPF .IF DF D$$ZMD6 BICB #17,U.CW3+1-U.TSTA(R5) ;CLEAR OLD ANSWER SPEED3 BISB R0,U.CW3+1-U.TSTA(R5) ;SET NEW ANSWER SPEED CLC ;SHOW SUCCESS .ENDC ;D$$ZMD 30$: RETURN 640$: MOVB R0,U.CW3-U.TSTA(R5) ;SET NEW RECEIVE SPEED .IF DF R$$EIS4 ASH #4,R0 ;SHIFT BITS TO TRANSMIT SPEED POSITION .IFF ;R$$EISV1 ASL R0 ;SHIFT BITS TO TRANSMIT SPEED POSITIONR ASL R0 ; ASL R0 ; ASL R0 ; .ENDC ;R$$EIS3 BISB R0,U.CW3-U.TSTA(R5) ;SET NEW TRANSMIT SPEED .ENDC ;T$$SMC!D$$ZMDR .ENDC ;T$$GMC!T$$SMC!D$$ZMD@SETLN1: MOV U.CW3-U.TSTA(R5),R2 ;GET NEW SPEED AND PARITY BITS7SETLIN: BIC #^C<140017>,R2 ;CLEAR EXTRANEOUS NONSENSEU+ CMPB R2,#2 ;IS SPEED 110 BAUD OR LOWER? BGT 50$ ;N - JUMPA' BIS #20000,R2 ;Y - SET TWO STOP BITSO,50$: SWAB R2 ;PUT BITS IN PROPER POSITION; BIS #10030,R2 ;SET 8 BIT CHARACTERS AND TURN RECEIVER ONR- BISB U.UNIT-U.TSTA(R5),R2 ;SET LINE NUMBERC BIT #S5.CLN,U.TST5-U.TSTA(R5) ;;;CHECK 7-BIT CHARACTERS ; LK710S+ BEQ 75$ ;;;NO LEAVE IT 8-BIT ; LK710D' BIC #10,R2 ;;;SET 7-BIT ; LK710G;75$: MOV R2,LPR(R3) ;;;LOAD NEW LINE PARAMETERS ; LK710L ; LK710S CLC ;SHOW SUCCESS ;**-1 RETURNR;;5;+; YZPWUP - POWER UP.; ; INPUT:>; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0O ; US.DSB 0N;-;5;; .IF DF R$$CON YZCONL:: YZCPUP:: .IFFI%YZPWUP::TST R2 ;IS THIS LINE ZERO?E BNE 70$ ;N - JUMPD .IFTF2 MOV #20,@R3 ;Y - CLEAR SILO, UARTS, CONTROLLER60$: BIT #20,@R3 ;DONE? BNE 60$ ;N - LOOPK( BIS #40140,@R3 ;Y - ENABLE INTERRUPTS .IFT RETURN YZUONL:: YZUPUP:: .ENDC ;R$$CON70$: ;REFERENCE LABEL .IF DF D$00rg{cccc$ZMD6 BIC #S5.ABP,U.TST5-U.TSTA(R5) ;RESET AUTO-BAUD MODE MOV R2,-(SP) ;SAVE R2 .IFTF ;D$$ZMD, CALL SETLN1 ;SET INITIAL CHARACTERISTICS! ;IN LINE PARAMETER REGISTERE .IFT ;D$$ZMDM MOV (SP)+,R2 ;RESTORE R2@- BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?B BEQ 150$ ;N - RETURN> BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIER FLAG;F;;+; YZMTIM - MODEM TIMER.P; ; INPUT:>; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-;5;U;- .IFTF ;D$$ZMD YZMTIM:: .IFT ;D$$ZMD8 MOV $BTMSK(R2),R2 ;GET BIT CORRESPONDING TO THIS LINE# CALL LOCKI ;LOCK OUT INTERRUPTSG4 CALL HLMTIM ;;;CALL COMMON MODEM TIMEOUT ROUTINE) BEQ 80$ ;;;IF EQ Z-BIT SET - DROP DTRR BISB R2,TCR+1(R3) ;;;SET DTRE  RETURN ;;;.( 80$: BICB R2,TCR+1(R3) ;;;DEASSERT DTR  RETURN ; ;;+; YZPOLL - POLL MODEM STATUS.;U ; INPUT:; R5 POINTER TO U.TSTA;-;E;N*YZPOLL::MOV U.SCB-U.TSTA(R5),R3 ;GET SCB .IF DF R$$MPL MOV @S.KRB(R3),R3 ;GET CSR .IFF ;R$$MPLE MOV S.CSR(R3),R3 ;GET CSR  .ENDC ;R$$MPL!6" MOVB U.UNIT-U.TSTA(R5),R2 ;GET PHYSICAL UNIT NUMBER# ASL R2 ;MULTIPLY BY 2 8$ MOV $BTMSK(R2),R2 ;GET BIT CORRESPONDING TO THIS LINE% CLR R4 ;START OFF FRESHC& BITB R2,MSR(R3) ;RING ON?' BEQ 90$ ;N - JUMP(( BIS #200,R4 ;Y - SET APPROPRIATE BIT%)90$: BITB R2,MSR+1(R3) ;CARRIER ON?S* BEQ 100$ ;N - JUMP(+ BIS #140,R4 ;Y - SET APPROPRIATE BIT9,100$: MOV R2,-(SP) ;SAVE R2 DESTROYED BY MODISR ROUTINE5- CALL MODISR ;DO COMMON MODEM INTERRUPT PROCESSING-. BVC 120$ ;NO SPECIAL ACTION NEEDED - JUMP5/ BCS 110$ ;DROP DTR - JUMP#0 BISB (SP)+,TCR+1(R3) ;ASSERT DTRT 1 RETURN;*2110$: BICB (SP)+,TCR+1(R3) ;DEASSERT DTR 3 RETURNF64120$: MOV (SP)+,R2 ;POP STACK WITHOUT AFFECTING CC-C'5 BCS 150$ ;NO CALL ANSWERED - RETURNA6 ASSUME S4.ABD,100000R07 TST 6(R5) ;;;AUTO-BAUD SPEED DETECT ENABLED?&8 BPL 130$ ;;;IF NOT, DON'T SET BAUD*9 MOVB #14,R2 ;Y - SET LINE TO 4800 BAUD: BR SETLIN ;C;;130$: MOVB U.CW3+1-U.TSTA(R5),R0 ;GET REMOTE ANSWER SPEED04< BICB #^C<17>,R0 ;CLEAR ALL BUT ANSWER SPEED FIELD= BR 40$ ;SET THAT SPEED>? .ENDC ;D$$ZMD@A150$: RETURNB C .DSABL LSB1DEF .IF DF R$$CONG HYZCOFF::.I MOV #20,@R3 ;CLEAR SILO, UARTS, CONTROLLERJ10$: BIT #20,@R3 ;DONE?K BNE 10$ ;N - LOOP4 L RETURNR MYZUOFF::#N CLR -(SP) ;GET A TEMPORARY WORD?@O BISB U.UNIT-U.TSTA(R5),(SP) ;SET LINE NUMBER BUT RECEIVER OFF.P MOV (SP)+,LPR(R3) ;LOAD NEW LINE PARAMETERSQR .IF DF D$$ZMDS8T MOV $BTMSK(R2),R2 ;GET BIT CORRESPONDING TO THIS LINEU BICB R2,TCR+1(R3) ;DROP DTRVW .ENDC ;D$$ZMDX Y RETURNDZ[ .ENDC ;R$$CON\];S^;S_;+$`; INPUT INTERRUPT SERVICE ROUTINE.a;-b;0c; d .ENABL LSBRe;Ofg .IF DF R$$MPLh/i$YZINP::TTSET$ YZ ;;;SAVE R2, R3 AND SET UP:j ;;; R3 = CSR ADDRESSk ;;; R4 = KRB ADDRESSlm .IFF ;R$$MPL)n-o$DZINP::TTSET$ DZ ;;;SAVE R2,R3 AND SET UPRp ;;; R3 = CSR"q ;;; R4 = ADDRESS OF UCB LISTrs .ENDC ;R$$MPLt.u CALL MUXINP ;;;DO COMMON MULTIPLEXER INPUTv ;;;CHARACTER PROCESSING;5w ;;;MUXINP DISMISSES INTERRUPT IF NO OUTPUT WORK,x BR 10$ ;;;XMIT READY - GO DO OUTPUT WORKy;z;{;+%|; OUTPUT INTERRUPT SERVICE ROUTINE. };-~;;I .IF DF R$$MPL/$YZOUT::TTSET$ YZ ;;;SAVE R2, R3 AND SET UP:  ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS .IFF ;R$$MPLE-$DZOUT::TTSET$ DZ ;;;SAVE R2,R3 AND SET UP4 ;;; R3 = CSR" ;;; R4 = ADDRESS OF UCB LIST .ENDC ;R$$MPL10$: MOV R3,-(SP) ;;;C' INC @SP ;;;POINT TO BYTE CONTAININGM1 ;;;INTERRUPTING LINE NUMBER (CSR HIGH BYTE)M0 CALL JZOUT ;;;DO OUTPUT INTERRUPT PROCESSING% ;;;(COMMON FOR DJ-11 AND DZ-11) TST (SP)+ ;;;CLEAN STACK;L;;+; YZABOX - ABORT OUTPUT.; ; INPUT:00z{|tt tfDATA>; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.TOC 0 ; U.TTOC 0E; ; YZSTOX - STOP OUTPUT.; ; INPUT:>; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 1(;-;;@ YZABOX::YZSTOX::RETURN ;;;RETURN;R  .DSABL LSBM .ENDC ;D$$Z11;Z;; .ENDUT INTERRUPT PROCESSING% ;;;(COMMON FOR DJ-11 AND DZ-11) TST (SP)+ ;;;CLEAN STACK;L;;+; YZABOX - ABORT OUTPUT.; ; INPUT: .TITLE TTCISC .IDENT /05.03/N;O6; COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.; <; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;;;O; 23-JAN-78 PETER WANNHEDENT;(; PREVIOUSLY MODIFIED BY:;+; P. WANNHEDEN ; C. F. SPITZ; D. R. DONCHINT; ; MODIFICATIONS:;N!; DD158 12-OCT-82 DALE R. DONCHIN <; DISALLOW INPUT PROCESSING CONCURRENT WITH FORK PROCESSING;E; S. C. ADAMS 24-OCT-83 5.01&; SA135 -- REFERENCE U.TFRQ AS A WORD;B; S. C. ADAMS 18-JUN-84 5.02; SA251 -- FIX SIMULATED ^R; ; S. C. ADAMS 1-MAR-85 5.03D*; SA367 -- ADD TTSET1 ENTRY POINT FOR LAT;I;C;+D; CONTROLLER INDEPENDENT ROUTINES TO SET UP FOR INTERRUPT PROCESSING; AND TO QUEUE A FORK REQUEST.;-;+;  .MCALL UCBDF$,SCBDF$P UCBDF$ ,,TTDEFC SCBDF$ O .IF DF R$$MPL  .MCALL KRBDF$ E KRBDF$I  .ENDC ;R$$MPL R .PSECT MAP5;N;I;+*; TTSET - COMMON INTERRUPT SET UP ROUTINE.;1; INPUT:; R2 SAVED BY CALL (JSR R2)./; POINTS TO POINTER TO CTB POINTER. (RSX-11M+)I'; POINTS TO CONTROLLER TYPE. (RSX-11M)5; R4 SAVED BY $INTSV. "; CONTAINS CONTROLLER NUMBER * 2.; R5 SAVED BY $INTSV.N;T ; OUTPUT:O; R2 FREE TO USE; R3 CSR ADDRESS; R4 KRB ADDRESS; R5 FREE TO USE; ;; CALLS CALLER BACK AS COROUTINE WITH ALL OF DRIVER MAPPED.F:; CALLER EXECUTES "RETURN" BACK TO THIS ROUTINE TO RESTORE:; REGISTERS, QUEUE A FORK REQUEST IF NECESSARY AND DISMISS; THE INTERRUPT.;-; ;U .ENABL LSBD; TTSET:: MOV R3,-(SP) ;;;SAVE R3T& MOV KISAR6,-(SP) ;;;SAVE KERNEL APR 6 .IF DF T$$COM2 MOV KINAR6,-(SP) ;;;SAVE KERNEL INSTRUCTION APR 6 .ENDC ;T$$COM  .IF DF R$$MPL V, ADD @(R2)+,R4 ;;;GET POINTER TO KRB POINTER MOV @R4,R4 ;;;GET KRB ADDRESSF MOV @R4,R3 ;;;GET CSR ADDRESSC CALL MAPD ;;;MAP DATA AREA  .IFFF  CALL MAPD ;;;MAP DATA AREA7 ADD (R2)+,R4 ;;;CALCULATE POINTER TO UCB TABLE POINTERU- MOV (R4),R4 ;;;GET ADDRESS OF UCB/CSR TABLE/ MOV (R4)+,R3 ;;;GET CSR AND POINT TO UCB TABLE) ; .ENDC ;R$$MPL R CALL @R2 ;;;CALL CALLER6 .IF DF T$$COM5 MOV (SP)+,KINAR6 ;;;RESTORE KERNEL INSTRUCTION APR 6 .ENDC ;T$$COM) MOV (SP)+,KISAR6 ;;;RESTORE KERNEL APR 6O MOV (SP)+,R3 ;;;RESTORE R2, R3  MOV (SP)+,R2 ;;;F MTTSET1:: .IF DF M$$PRO / MOV $TTUQP,R4 ;;;GET POINTER TO UCB QUEUE HEADL% TST (R4)+ ;;;ANYTHING IN UCB QUEUE? , BNE 10$ ;;;Y - QUEUE FORK BLOCK AND RETURN RETURN ;;;N - RETURNS$10$: CALLR 100$ ;;;QUEUE FORK BLOCK C .IFFP T% TST $TTUQ ;;;ANYTHING IN UCB QUEUE? BEQ 20$ ;;;N - RETURN6- MOV #$TTFB+2,R4 ;;;POINT TO PC IN FORK BLOCKO+ TST (R4)+ ;;;FORK BLOCK ALREADY IN QUEUE?M BNE 20$ ;;;Y - RETURNR! CALL $FORK0 ;;;QUEUE FORK BLOCK  R .IFTF R;'; COME HERE AT SYSTEM STATE, PRIORITY 0D;$!FP000:: CALL MAPD ;MAP DATA AREAN! CALL LOCKI ;LOCK OUT INTERRUPTS + CALL 30$ ;;;PROCESS ALL UCBS IN UCB QUEUEQ;EH; COME BACK HERE WITH INTERRUPTS LOCKED OUT, UCB QUEUE EMPTY AND LOCKED.M; CLEAR FORK PC TO SHOW FORK BLOCK NOT IN QUEUE, UNLOCK UCB QUEUE AND RETURN. ;N R .IFT V CLR 6(R4) ;;;CLEAR FORK PC% JMP 130$ ;;;GO AND UNLOCK UCB QUEUE  E .IFFQ E CLR 4(R4) ;;;CLEAR FORK PC L .IFTF ;20$: RETURN ;;;RETURN.30$: ;;;REFERENCE LABEL S .IFTT P/ MOV $TTUQP,R4 ;;;GET POINTER TO UCB QUEUE HEADN) LOCK$ -LK.SPN(R4),SPIN ;;;LOCK UCB QUEUE   .IFFC ) MOV #$TTUQ,R4 ;;;POINT TO UCB QUEUE HEADE T .IFTF S' MOV (R4)+,R5 00g{cccc;;;GET FIRST UCB IN QUEUE BEQ 20$ ;;;NONE - RETURN MOV @R5,-(R4) ;;;DEQUEUE UCB  BNE 40$ ;;;NOT LAST - JUMP7 MOV R4,2(R4) ;;;LAST UCB DEQUEUED - UPDATE PTR TO LASTA/40$: INC @R5 ;;;SHOW UCB NOT IN QUEUE ANY MORE  C .IFTR C, ULOCK$ -LK.SPN(R4),SPIN ;;;UNLOCK UCB QUEUEA BIS #S1.DSI,U.TSTA-U.TFLK(R5) ;;;DISABLE INPUT PROC. DURING FORKN  .ENDC E+ CALL 60$ ;;;PROCESS ALL FORK REQUEST BITSU ;;;FOR THIS UCB& BR 30$ ;;;TRY TO DEQUEUE ANOTHER UCB;;;+$; SETDSI - DISABLE INPUT PROCESSING.; A; SOME SYSTEM STATE ROUTINES WHICH ARE NOT CALLED FROM THE DRIVERC; FORK DISPATCHER MAY DISABLE INPUT CHARACTER PROCESSING BY CALLINGD9; THIS ROUTINE. THE CALLER IS CALLED BACK AS A COROUTINE.Y>; ON RETURN HERE, ALL FORK REQUESTS FOR THE UCB ARE PROCESSED.C; AFTER THAT, INPUT PROCESSING IS ENABLED AND AN ATTEMPT IS MADE TOR1; RETRIEVE CHARACTERS FROM THE TYPE-AHEAD BUFFER.R;-;B;U1SETDSI::BIS #S1.DSI,@R5 ;DISABLE INPUT PROCESSINGA CALL @(SP)+ ;CALL CALLER! CALL LOCKI ;LOCK OUT INTERRUPTS ; ;E<; FIND ALL BITS THAT ARE SET IN THE FORK LEVEL REQUEST BYTE.9; FOR EACH BIT FOUND, CLEAR IT AND CALL THE CORRESPONDING ; FORK LEVEL ROUTINE.E;H-50$: ADD #U.TFLK-U.TSTA,R5 ;;;POINT TO U.TFLKR ASSUME U.TFRQ, 060$: TST -(R5) ;;;ANY BITS SET IN REQUEST WORD? BEQ 80$ ;;;N - JUMP ! MTPS #0 ;;;Y - ALLOW INTERRUPTSC2 MOV #FRKTB-2,R2 ;GET START OF TABLE WITH POINTERS ;TO FORK LEVEL ROUTINESB CLR R3 ;INITIALIZE BITMASK# SEC ;MAKE SURE WE SHIFT IN A ONEK70$: ROL R3 ;SHIFT MASK LEFTD! TST (R2)+ ;UPDATE TABLE POINTERL BIT R3,@R5 ;THIS BIT SET?# BEQ 70$ ;N - LOOP (WITH CC-C = 0)S BIC R3,@R5 ;Y - CLEAR IT .IF DF T$$SPL' ADD #U.TSTA-U.TFRQ,R5 ;POINT TO U.TSTAA) MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;MAP UCBX;, MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPL0 ASSUME U.TSTA, M% ADD #U.TUX-U.TFRQ,R5 ;POINT TO U.TUX  MOV (R5)+,R4 ;GET UCBX IN R4U .IFTF ;T$$SPL T! CALL @(R2)+ ;CALL ROUTINE WITH:E ; R4 = POINTER TO UCBX  ; R5 = POINTER TO U.TSTA " MTPS #TTPRI ;LOCK OUT INTERRUPTS% BR 50$ ;;;GET NEXT FORK REQUEST BIT ;TA; NO MORE PROCESSING AT ZERO PRIORITY. ENABLE PROCESSING OF INPUT#E; CHARACTERS AND SEE WHAT IS WAITING FOR US IN THE TYPE-AHEAD BUFFER.P;B-80$: ADD #U.TSTA-U.TFRQ,R5 ;;;POINT TO U.TSTAX9 BIC #S1.DSI,@R5 ;;;ENABLE PROCESSING OF INPUT CHARACTERSU .IF DF T$$SER4SERPRO:: ;;;SERIALLY PROCESS CHARACTERS FROM TABUF .ENDC ;T$$SER .IFT ;T$$SPLN; MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAKE SURE UCBX IS MAPPEDU .ENDC ;T$$SPL9 CALL NXTIC ;;;PROCESS CHARACTERS FROM TYPE-AHEAD BUFFERI; TST U.TFRQ-U.TSTA(R5) ;;;ANY FORK REQUESTS NOW PENDING?I BEQ 20$ ;;;N - RETURNS, BIS #S1.DSI,@R5 ;;;DISABLE INPUT PROCESSING- BR 50$ ;;;PROCESS ANY PENDING FORK REQUESTS;;N;OE; POST-FORK PROCESSING. PICK UP CHARACTER FROM U.TECB AND PROCESS IT.;F-FPPFP:: MOV #NXTIC,@SP ;MODIFY RETURN ADDRESSA" MTPS #TTPRI ;LOCK OUT INTERRUPTS .IF DF T$$SPL6 MOVB U.TECO-U.TSTA(R5),R2 ;;;GET CHARACTER TO PROCESS .IFF ;T$$SPL;/ MOVB U.TECB(R4),R2 ;;;GET CHARACTER TO PROCESSY .ENDC ;T$$SPL+ BIC #S1.DSI,@R5 ;;;ENABLE INPUT PROCESSINGN P .IF DF T$$MOD % BITB #US.DSB!US.CRW,U.STS-U.TSTA(R5)A, ;;;LINE DISABLED OR WAITING FOR CARRIER? BNE 20$ ;;;Y - JUMP  .ENDC ;T$$MOD C" CALLR ICH2A ;;;PROCESS CHARACTER;N;R S .IF DF M$$PRO ;+ ; SWCPU - SWITCH TO CORRECT CPU.;M; INPUT:(; R3 BITMASK TO SET IN FORK REQUEST BYTE; R5 POINTER TO U.TSTA;2 ; OUTPUT:R<; IF ALREADY EXECUTING ON THE CORRECT CPU (THE ONE THAT OWNS9; THE UNIBUS WHERE THE CONTROLLER SITS), IMMEDIATE RETURN@ ; TO CALLER.;T8; ELSE, FORK REQUEST BIT SET IN UCB. UCB ADDED TO END OF6; TARGET CPU'S UCB QUEUE, UNLESS IT IS ALREADY QUEUED.9; TARGET CPU'S FORK BLOCK QUEUED TO FORK QUEUE, UNLESS ITC/; IS ALREADY QUEUED. RETURN TO CALLER'S CALLER.F; ; REGISTERS ALTERED: R4 ;-;T;O(SWCPU:: MOV U.SCB-U.TSTA(R5),R4 ;GET SCB MOV S.KRB(R4),R4 ;GET KRB1 BIT K.URM(R00|tt tfDATA4),@$CPURM ;ALREADY ON THE RIGHT CPU?E BNE 140$ ;Y - RETURN> MOV K.URM(R4),@SP ;N - SAVE URM AND POP RETURN ADDRESS - WANT! ;TO RETURN TO CALLER'S CALLERT' MOV #$URMTB,R4 ;GET START OF URM TABLEB,90$: BIT @SP,(R4)+ ;IS THIS THE CORRECT CPU? BEQ 90$ ;N - LOOPE TST (SP)+ ;CLEAN STACK; MOV $TTUQT-$URMTB-2(R4),R4 ;GET POINTER TO POINTER TO LASTR" ;UCB IN TARGET CPU'S UCB QUEUE; CALL 110$ ;PLACE FORK REQUEST (NO NEED TO RAISE PRIORITY,)' ;WE ARE ON THE WRONG CPU ANYWAY...).100$: LOCK$ -LK.SPN-2(R4),SPIN ;LOCK UCB QUEUE' TST 6(R4) ;FORK BLOCK ALREADY QUEUED?) BNE 130$ ;Y - JUMP! ADD #6,R4 ;N - POINT TO FORK PC  MOV #FP000,@R4 ;SET FORK PC CLR -(R4) ;CLEAR LINK WORD CALL $QFORK ;QUEUE FORK BLOCKT CMP -(R4),-(R4) ;BACK UP R4' BR 130$ ;UNLOCK FORK BLOCK AND RETURNM $ .IFTF B;R;R;+9; FORK - SET FORK LEVEL REQUEST AND ADD UCB TO UCB QUEUE.B;E; INPUT:(; R3 BITMASK TO SET IN FORK REQUEST BYTE; R5 POINTER TO U.TSTA;N ; OUTPUT:C8; REQUEST BIT SET IN UCB. UCB ADDED TO END OF UCB QUEUE,; UNLESS IT WAS ALREADY QUEUED.E; ; REGISTERS ALTERED: R4 ;-;A;#FORK:: P .IFT  K) MOV $TTUQP,R4 ;;;POINT TO UCB QUEUE HEADR0 TST (R4)+ ;;;POINT TO POINTER TO LAST IN QUEUE0110$: LOCK$ -LK.SPN-2(R4),SPIN ;;;LOCK UCB QUEUE  .IFFO A5 MOV #$TTUQ+2,R4 ;;;POINT TO POINTER TO LAST IN QUEUER E .IFTF ( BIS #S1.DSI,@R5 ;;;FORCE INPUT TO TABUF# ;;;PREVENT RETRIEVAL FROM TABUFY) ADD #U.TFRQ-U.TSTA,R5 ;;;POINT TO U.TFRQ, BIS R3,(R5)+ ;;;SET REQUEST BIT (U.TFRQ) ASSUME U.TFLK, # BIT #1,@R5 ;;;UCB ALREADY QUEUED?E BEQ 120$ ;;;Y - JUMP MOV R5,@(R4)+ ;;;N - QUEUE IT MOV R5,-(R4) ;;;SET NEW LASTR CLR @R5 ;;;CLEAR LINK WORD)120$: ADD #U.TSTA-U.TFLK,R5 ;;;RESTORE R5( , .IFT; K3130$: ULOCK$ -LK.SPN-2(R4),SPIN ;;;UNLOCK UCB QUEUE  P .ENDC A140$: RETURN ;;; F .DSABL LSB1 I 5 .ENDCE INPUT TO TABUF# ;;;PREVENT RETRIEVAL FROM TABUFY) ADD #U.TFRQ-U.TSTA,R5 ;;;POINT TO U.TFRQ, BIS R3,(R5)+ ;;;SE .TITLE TTCANM .IDENT /06.01/M;->; COPYRIGHT (c) 1983, 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;N ;$ ; 06-FEB-78 PETER WANNHEDEN ; ; PREVIOUSLY MODIFIED BY:; ; P. WANNHEDEN; C. F. SPITZV; D. R. DONCHINL; M. S. HARVEY; S. C. ADAMSL; B. S. MCCARTHY;N; MODIFIED BY:;P!; S. R. CLOUTIER 1-AUG-86 06.01'; REQUIRE STATUS AS INPUT ON KILLO1 ,; SUPPLY STATUS IN TTICK FOR KILLO1 CALLJ;LK;+@L; THIS MODULE CONTAINS ENTRY POINTS FOR THE FOLLOWING ROUTINESM; CALLED BY THE EXECUTIVE:N;YO; TTCAN - CANCEL IO P; TTPWUP - POWER-UPQ;-R;S;6T .MCALL DCBDF$,HWDDF$U;V DCBDF$ ;DEFINE DCB SYMBOLS $W HWDDF$ ;DEFINE HARDWARE SYMBOLSXY .IF DF T$$EIOZ[ .MCALL PKTDF$ \ PKTDF$]^ .ENDC ;T$$EIO_ ` .IF DF R$$MPLa b .MCALL KRBDF$c 8d KRBDF$ ;DEFINE KRB SYMBOLS e f .IFF ;R$$MPL g Yh .MCALL SCBDF$i Lj SCBDF$ ;DEFINE SCB SYMBOLSDk Ol .ENDC ;R$$MPLmn .PSECT MAP5o;Np;q;Lr.SBTTL TTCAN - CANCEL I/Os;At;+'u; TTCAN - CANCEL CURRENT IO REQUESTS.>v; THIS ROUTINE IS CALLED FROM THE EXECUTIVE TO CANCEL (KILL)-w; CURRENT IO REQUESTS FOR A TASK ON A LINE.S>x; THE UC.KIL BIT IN U.CTL IN THE UCB IS SET FOR ALL TERMINAL5y; UNITS TO FORCE THE EXECUTIVE TO CALL THIS ROUTINE ,z; EVEN THOUGH THE UNIT IS NOT MARKED BUSY.{;-|;.};RA~; TTCN1 IS CALLED FROM TTINI TO KILL READS OR WRITES (OR BOTH)L?; AS REQUESTED FROM AN INTERNAL I/O KILL PACKTET. SELECTION D; IS BASED ON THE SUBFUNCTION BIT IN THE INTERNAL I/O KILL PACKET.;- ; INPUT: H"; R1=>TCB FOR WHICH TO KILL I/O"; R5=>UCB FOR WHICH TO KILL I/O0; R3=>FUNCTION(S) TO KILL (IF ENTRY AT TTCN1); ; .ENABL LSBE; TTCAN::L .IF DF R$$IIC: MOV #,R3 ;IF00g{cccc CALLED AT TTCAN, BOTH READS! ; AND WRITES WILL BE KILLED TTCN1::C .ENDC ;R$$IIC MTPS #0 ;;;ALLOW INTERRUPTSH CALL MAPD ;MAP DATA AREA .IF DF T$$EIO& MOV R5,R0 ;GET COPY OF UCB POINTER9 ADD #U.TIXL,R0 ;MAKE POINTER TO U.TIXL (IOPX LISTHEAD)::3$: MOV R0,R4 ;CURRENT IOPX POINTER BECOMES BACKPOINTER ASSUME I.XLNK,0%5$: MOV @R4,R0 ;POINT TO NEXT IOPX BEQ 7$ ;NONE - JUMP ) CMP I.XTCB(R0),R1 ;DO TASK TCBS MATCH?# BNE 3$ ;N - JUMP .IF DF R$$IIC9 BIT #TF.RLB,R3 ;ARE WE KILLING READS? IF SO, THIS MUST$0 ;HAVE AN IOPX SINCE ONLY READS HAVE IOPX'S BEQ 3$ ;BR IF NO .ENDC ;R$$IIC ASSUME I.XLNK,0& MOV @R0,@R4 ;REMOVE IOPX FROM LIST MOV R1,-(SP) ;SAVE REGISTERSD MOV R3,-(SP)R# MOV #I.XLEN,R1 ;GET SIZE OF IOPXP CALL $DEACB ;DEALLOCATE IOPX" MOV (SP)+,R3 ;RESTORE REGISTERS MOV (SP)+,R17 BR 5$ ;LOOP7$: ;REFERENCE LABELS .ENDC ;T$$EIO .IF DF T$$SPL. MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX$ MOV U.TAPR(R5),@#KDSAR5 ;MAP UCBX" ADD #U.TSTA,R5 ;POINT TO U.TSTA .IFF ;T$$SPLR ADD #U.TUX,R5 ;POINT TO U.TUX ASSUME U.TSTA,U.TUX+2- MOV (R5)+,R4 ;GET UCBX AND POINT TO U.TSTAP# BEQ 40$ ;NONE - LINE IDLE- JUMP .ENDC ;T$$SPL ASSUME U.TCI,0 ( MOV @R4,R0 ;GET CURRENT INPUT PACKET BEQ 10$ ;NONE - JUMP& BIT #S1.USI,@R5 ;UNSOLICITED INPUT? BNE 10$ ;Y - IGNORE.) CMP I.TCB(R0),R1 ;FROM THE RIGHT TASK?M BNE 10$ ;N - JUMPU .IF DF R$$IIC, BIT #TF.RLB,R3 ;DO WE WANT TO KILL READS? BEQ 10$ ;BR IF NO . .IFTF ;R$$IIC) MOV #IE.ABO&377,(R0) ;SET ABORT STATUSS CALL KILLI ;KILL INPUT210$: MOV U.TCO(R4),R0 ;GET CURRENT OUTPUT PACKET BEQ 40$ ;NONE - JUMP) CMP I.TCB(R0),R1 ;FROM THE RIGHT TASK?V BNE 40$ ;N - JUMPN .IFT ;R$$IIC$- BIT #TF.WLB,R3 ;DO WE WANT TO KILL WRITES?U BEQ 40$ ;BR IF NON  .ENDC ;R$$IIC) MOV #IE.ABO&377,(R0) ;SET ABORT STATUSU BR KILLO ;KILL OUTPUT;T;R8.SBTTL KILLO1 - KILL OUTPUT WITH STATUS SUPPLIED IN R0;++; KILLO1 - KILL OUTPUT WITH STATUS IE.DNR '; USED FOR TIME-OUT OR MODEM HUNG UP.I; ; INPUT:$; R0 - STATUS (IO.DNR IN LO BYTE); R4 POINTER TO UCBX; R5 POINTER TO U.TSTA;H"; REGISTERS ALTERED: R0,R1,R2,R3;-;.;R5KILLO1::MOV U.TCO(R4),R3 ;GET CURRENT OUTPUT PACKETS BNE 20$ ;THERE IS ONE - JUMP% BIT #S1.OBY,@R5 ;ECHO IN PROGRESS?7 BEQ 40$ ;NO - JUMP/ CALL SETDSI ;YES - DISABLE INPUT PROCESSINGL= BISB #US.OIU,U.STS-U.TSTA(R5) ;INTERRUPTS NOT EXPECTED NOWL# BIC #S1.OBY,@R5 ;SET OUTPUT FREE RETURNR$20$: MOV R0,@R3 ;OK - LOAD STATUS ;FALL THRU TO "KILLO"O;I;B/.SBTTL KILLO - KILL OUTPUT WITH STATUS IE.ABO.;;++; KILLO - KILL OUTPUT WITH STATUS IE.ABO..;R ; INPUT: ; R4 POINTER TO UCBX ; R5 POINTER TO U.TSTA: ; I.LNK IN CURRENT OUTPUT REQUEST PACKET CONTAINS STATUS ; TO RETURN TO TASK ;U'; NOTE - MUST EXECUTE ON CORRECT CPU!P;S"; REGISTERS ALTERED: R0,R1,R2,R3;-;P;TKILLO:: SAVNR ;SAVE R4,R5@) CALL SETDSI ;DISABLE INPUT PROCESSINGV/ BIC #S2.WRA,2(R5) ;CLEAR WRAP-AROUND CONTEXTK7 CALL ABOXL ;ABORT OUTPUT WITH INTERRUPTS LOCKED OUTT? BISB #US.OIU,U.STS-U.TSTA(R5) ;DISABLE RECOGNITION OF OUTPUTO ;INTERRUPTS4 FRKBIT BIC,#FR.ORD ;PREVENT MULTIPLE COMPLETIONS  CALLR FPORD ;SAY OUTPUT DONE;C;N..SBTTL KILLI1 - KILL INPUT WITH STATUS IN R0;+C ; KILLI1 - KILL SOLICITED OR UNSOLICITED INPUT WITH STATUS IN R0.<!; USED TO KILL INPUT BECAUSE OF TIME-OUT OR MODEM HUNG UP.";D #; INPUT: $; R0 STATUS (IS.TMO OR IE.DNR)%; R4 POINTER TO UCBX&; R5 POINTER TO U.TSTA';P"(; REGISTERS ALTERED: R0,R1,R2,R3);-*;,+;-, ASSUME U.TCI,0 )-KILLI1::MOV @R4,R3 ;GET CURRENT PACKET. BEQ 40$ ;NONE - RETURN!/ MOV R0,@R3 ;OK - STORE STATUSR0 ;FALL THRU TO "KILLI"C100|tt tfDATA;N2;S.3.SBTTL KILLI - KILL INPUT WITH STATUS IE.ABO4; 5;+*6; KILLI - KILL INPUT WITH STATUS IE.ABO.7;S 8; INPUT:9; R4 POINTER TO UCBX:; R5 POINTER TO U.TSTA9;; I.LNK IN CURRENT INPUT REQUEST PACKET CONTAINS STATUS)<; TO RETURN TO TASK=; '>; NOTE - MUST EXECUTE ON CORRECT CPU! ?;E"@; REGISTERS ALTERED: R0,R1,R2,R3A;-B;CC;DKILLI:: SAVNR ;SAVE R4,R5E)E CALL SETDSI ;DISABLE INPUT PROCESSINGM$F TST U.TCO(R4) ;DOING TASK OUTPUT?G BNE 30$ ;Y - JUMPH;DI; IF WE ARE KILLING A READ WITH ECHO, IT IS POSSIBLE THAT THE ECHOBJ; HAS NOT YET COMPLETED. IF SO, WE MUST LOGICALLY KILL THE ECHO.K;TAL BISB #US.OIU,U.STS-U.TSTA(R5) ;SET OUTPUT INTERRUPT UNEXPECTEDT#M BIC #S1.OBY,@R5 ;SET OUTPUT FREEU8N30$: FRKBIT BIC,#FR.IRD ;PREVENT MULTIPLE COMPLETIONS O BIC #S1.ESC!S1.DEC!S1.DPR,@R5&P ;GET OUT OF ESCAPE SEQUENCE MODEQ ;CLEAR DEFERRED ECHO FLAGI%R ;CLEAR DEFERRED PROCESSING FLAGT.S CLRB U.TISV(R4) ;CLEAR INPUT STATE VARIABLET CALLR FPIRD ;SAY INPUT DONE U40$: RETURN ;RETURNSV;TW;HX OY .IF DF M$$PROZ E,[.SBTTL FPTIM - FORK LEVEL TIME-OUT ROUTINE\;C]; THIS ROUTINE IS ENTERED FROM THE FORK DISPATCHER AFTER A SWITCH,^; TO THE CORRECT CPU TO HANDLE A TIME-OUT._;I`a .IF DF T$$SPLb1cFPTIM:: CALL 70$ ;HANDLE TIME-OUT ON THIS UNITde .IFF ;T$$SPLEfg ASSUME U.TUX,U.TSTA-2$hFPTIM:: TST -(R5) ;POINT TO U.TUX*i CALL 70$ ;HANDLE TIME-OUT ON THIS UNITjk .ENDC ;T$$SPLl3m TST (SP)+ ;ROUTINE RETURNS AS A COROUTINE - POPTn ;RETURN ADDRESS&o RETURN ;RETURN TO FORK DISPATCHERp q .ENDC ;M$$PROr s;t;H(u.SBTTL TIME - TIME-OUT (DRIVER TIMER).v;Aw;A#xTTICK:: CALL MAPD ;MAP DATA AREAA-y MOV #DCB0,R3 ;POINT TO POINTER TO TT0: DCB>z MOV #$SCDV1,-(SP) ;GET ADDRESS OF DEVICE TABLE SCAN ROUTINE{ $| .IF NDF T$$MOD } ,~80$: P .ENDC ;NOT T$$MOD U&60$: CALL @(SP)+ ;GET NEXT TERMINAL BCS CLINS ;ALL DONE - JUMP+ CMP D.NAM(R3),#"TT ;IS DEVICE NAME "TT"?T BNE 100$ ;N - ABORT SCAN+ BIT #DV.TTY,U.CW1(R5) ;IS IT A TERMINAL? BEQ 100$ ;N - ABORT SCAN .IF DF R$$CON+ BITB #US.OFL,U.ST2(R5) ;IS UNIT OFFLINE?C# BNE 60$ ;Y - GO ON TO NEXT UNITV .ENDC ;R$$CON;T#; FOUND A TERMINAL. CHECK TIMERS.D;  .IF DF T$$SPL" ADD #U.TSTA,R5 ;POINT TO U.TSTA270$: MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX+ MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;MAP UCBXA .IFF ;T$$SPLP  ADD #U.TUX,R5 ;POINT TO U.TUX ASSUME U.TSTA,U.TUX+2170$: MOV (R5)+,R4 ;GET UCBX AND POINT TO U.TSTA .ENDC ;T$$SPL BEQ 80$ ;NONE - JUMP MOV R4,R1 ;F' ADD #U.TITI,R1 ;POINT TO INPUT TIMER$0 MOV #IS.TMO,R0 ;GET STATUS FOR INPUT TIME-OUT. MOV #KILLI1,R2 ;POINT TO KILL INPUT ROUTINE  CALL 110$ ;CHECK INPUT TIMER ASSUME S2.CTS,100000 * TST 2(R5) ;OUTPUT STOPPED BY CTRL-S?$ BMI 80$ ;Y - IGNORE OUTPUT TIMER .IF DF T$$SPL8 MOV #120000,R4 ;RESTORE CLOBBERED R4 TO POINT TO UCBX MOV R4,R1 ;U .IFF ;T$$SPL5 MOV -2(R5),R1 ;GET UCBX .ENDC ;T$$SPL( ADD #U.TOTI,R1 ;POINT TO OUTPUT TIMER3 MOV #IE.DNR&377,R0 ;MOVE STATUS TO R0 FOR KILLO1M/ MOV #KILLO1,R2 ;POINT TO KILL OUTPUT ROUTINEM! CALL 110$ ;CHECK OUTPUT TIMERR E .IF DF T$$MOD I80$: .IF NDF R$$CON02 BITB #US.OFL,U.ST2-U.TSTA(R5) ;IS UNIT OFFLINE? BEQ 90$ ;N - JUMPT= CLRB U.TMTI-U.TSTA(R5) ;Y - RESET TIMER TO PREVENT TIMEOUTO BR 60$ ;GO ON TO NEXT UNIT .ENDC ;NDF R$$CON90$: MOV R5,R1 ;5. ADD #U.TMTI-U.TSTA,R1 ;POINT TO MODEM TIMER0 MOV #MTIM,R2 ;POINT TO MODEM TIME-OUT ROUTINE  CALL 110$ ;CHECK MODEM TIMER  .IF DF D$$ZMD/ MOV #U2.DZ1!U2.RMT,-(SP) ;PUSH BITS TO CHECKOE BIC U.CW2-U.TSTA(R5),(SP)+ ;IS LINE SERVICED BY A DZ11 AND REMOTE?O BNE 60$ ;N - JUMP, .IF DF M$$PRO9 MOV #FR.TIM,R3 ;GET FORK REQUEST BIT FOR MODEM TIMEOUT A MOV #60$,-(SP00g{cccc) ;GO ON TO NEXT LINE IF THIS ONE NOT ON THIS CPUT6 CALL SWCPU ;SWITCH TO THE CORRECT CPU IF NECESSARY9 CALLR YZPOLL ;POLL THE DZ11 FOR MODEM STATUS SINCE ITR4 ;DOESN'T INTERRUPT ON MODEM STATUS TRANSITIONS .IFF ;M$$PRO8 CALL YZPOLL ;POLL THE DZ11 FOR MODEM STATUS SINCE IT4 ;DOESN'T INTERRUPT ON MODEM STATUS TRANSITIONS .ENDC ;M$$PRO .ENDC ;D$$ZMD .ENDC ;T$$MOD O BR 60$ ;LOOP; 5; FOUND A DEVICE OTHER THAN A TERMINAL - ABORT SCAN(;G#100$: ADD #S$$SPA,SP ;FLUSH STACKT;P"; ALL DONE - REQUEUE CLOCK BLOCK; (CLINS:: MOV #$TTCB,R0 ;GET CLOCK BLOCK' CLR R1 ;CLEAR HIGH ORDER DELTA TIME % MOV $TKPS,R2 ;LOW ORDER = 1 SECONDS+ MOV #C.SYST,R4 ;TYPE = SYSTEM SUBROUTINEO2 CALLR $CLINS ;INSERT IN CLOCK QUEUE AND RETURN;N;T 110$: TSTB @R1 ;TIMER ACTIVE? BEQ 120$ ;N - RETURN DECB @R1 ;Y - UPDATE TIMER" BEQ 130$ ;TIMER EXPIRED - JUMP120$: RETURN ;RETURN130$:  N .IF DF M$$PRO G; WE JUST DECREMENTED THE TIMER TO 0, BUT WE MAY BE ON THE WRONG CPU.B7; SET TIMER BACK TO +1 AND SWITCH TO THE CORRECT CPU.C;  INCB @R1 ;SET TIMER TO +1' MOV #FR.TIM,R3 ;GET FORK REQUEST BIT% CALL SWCPU ;SWITCH TO CORRECT CPUN;<; IF WE FALL THRU HERE, WE ARE ALREADY ON THE CORRECT CPU.;$( CLRB @R1 ;FINALLY SET THE TIMER TO 0  .IF DF T$$SPL '  MOV #120000,R4 ;RESTORE UCBX POINTERI   .IFF ;T$$SPLE0 MOV U.TUX-U.TSTA(R5),R4 ;RESTORE UCBX POINTER .ENDC ;T$$SPL I .ENDC ;M$$PRO  .IF DF T$$CON # MOV U.SCB-U.TSTA(R5),R3 ;GET SCBE E .IF DF R$$MPL  MOV S.KRB(R3),R3 ;GET KRB TSTB K.PRM(R3) ;DL11? BNE 140$ ;N - JUMP ASSUME K.CSR,0   MOV @R3,R3 ;GET CSR ADDRESSE! E" .IFF ;R$$MPLH# R $ TSTB U.CTYP-U.TSTA(R5) ;DL11?% BNE 140$ ;N - JUMP$& MOV S.CSR(R3),R3 ;GET CSR ADDRESS' ( .ENDC ;R$$MPL) +* BIT #20,4(R3) ;TERMINAL IN CONSOLE MODE?(!+ BNE 120$ ;Y - IGNORE TIME-OUT, C- .ENDC ;T$$CON. .!/140$: JMP @R2 ;HANDLE TIME-OUTN0; 1 .DSABL LSBU2;(3 3 4 .ENABL LSBE5 .6 .IF DF T$$MOD7 M8;K9; HANDLE MODEM TIME-OUT :;(;;MTIM: MOV #CT.TIM,R2 ;SET INDEX FOR MODEM TIMEOUT ROUTINEV-< CALLR CTRD ;DO CONTROLLER-DEPENDENT STUFFP= > .ENDC ;T$$MOD?;T@; A.SBTTL TTPWUP - POWER-UP.PB;MC;+D; TTPWUP - POWER-UP.E;-F;G;CHI .IF DF R$$CONJ KTTINIT::LM .IFFLN OTTPWUP::PQ .ENDCR TS .IF DF T$$COMT C'U MOV $TTCOM,R0 ;GET TTCOM PCB ADDRESSTVW .IF NDF R$$CONBX'Y BEQ 20$ ;NOT A VIRGIN SYSTEM - JUMP.Z[ .ENDC ;NDF R$$CON\6] BIS #PS.NSF,P.STAT(R0) ;MARK TTCOM AS NONSHUFFLABLE9^ MOV P.REL(R0),KINAR6 ;MAP INITIALIZATION CODE IN APR 6R_` .IF DF T$$SPLa'b CALL INIT ;DO VIRGIN INITIALIZATIONLcd .IFF ;T$$SPLe,f CALL INIT+20000 ;DO VIRGIN INITIALIZATION,g ;THE INIT ROUTINE IS BUILT FOR MAPPING*h ;IN APR5, BUT IS NOW MAPPED IN APR 6ij .ENDC ;T$$SPLk'l20$: CALL MAPD ;MAP DRIVER DATA AREAm n .IFF ;T$$COMo p CALL MAPD ;MAP DATA AREAqr .IF NDF R$$CON;s't BNE 30$ ;NOT A VIRGIN SYSTEM - JUMPRuv .ENDC ;NDF R$$CONwx Ry .IF NDF R$$MPLIz L{ MOV R3,-(SP) ;SAVE R3| MOV R4,-(SP) ;SAVE R4} ~ .IFTF N2 MOV @#KISAR5,R0 ;COPY REAL START OF DRIVER DATA0 ADD #200,R0 ;ADD THE EQUIVALENT OF 4 K WORDS& MOV R0,@#KISAR6 ;MAP REST OF DRIVER .IF NDF T$$SPLP& MOV R0,@#$DALED ;SAVE DRIVER KISAR6 .ENDC ;NDF T$$SPL' CALL INIT ;DO VIRGIN INITIALIZATIONC  .IFTD R MOV (SP)+,R4 ;RESTORE R4 MOV (SP)+,R3 ;RESTORE R3Y - .ENDC ;NDF R$$MPL $ .ENDC ;T$$COM N30$: ;REFERENCE LABEL  .IF NDF R$$MPL,  .IF DF T$$ACD1 TST U.ACB(R5) ;DOES THIS TERMINAL HAVE AN ACD?I BEQ 40$ ;N - JUMP0" ADD #U.TSTA,R5 ;POINT TO U.TSTA, MOV #A.POWE,R0 ;SET POWERFAIL ENTRY POINT CALL $SWACD ;CAL00|tt tfDATAL ACDV, SUB #U.TSTA,R5 ;RESTORE R5 TO UCB ADDRESS .ENDC ;T$$ACD'; SET UP DATABASES OF UCB'S AND CSR'S;D R.40$: MOVB U.CTYP(R5),R2 ;GET CONTROLLER TYPE% MOV TTUCB(R2),R1 ;POINT TO D'X'UCBL9 ADD R3,R1 ;POINT TO TABLE POINTER FOR THIS CONTROLLER' MOV (R1),R1 ;POINT TO UCB/CSR TABLE  .IF DF D$$M11 CMP #TTTDH,R2 ;IS IT A DH11?D BNE 50$ ;N - JUMPM- MOV S.DMCS(R4),-2(R1) ;FILL IN DM11-BB CSR# .ENDC ;D$$M11250$: MOV S.CSR(R4),(R1)+ ;FILL IN CONTROLLER CSR& MOVB U.UNIT(R5),R2 ;GET UNIT NUMBER" ASL R2 ;CONVERT TO WORD OFFSET, ADD R2,R1 ;ADD POINTER AND UNIT NUMBER*2 MOV R5,(R1) ;PLUG IN UCB Y .ENDC ;NDF R$$MPL I .IF DF M$$EXT .IF DF D$$H11!D$$V11O  .IF DF R$$MPL( BIT #HF.UBM,$HFMSK ;UNIBUS MAP EXIST?$ BEQ 60$ ;N - SKIP INITIALIZATION .IFF ;R$$MPL" TST $UMRPT ;UNIBUS MAP EXISTS?* BEQ 60$ ;IF EQ NO, SKIP INITIALIZATION .ENDCA; LOAD THE UMR(S) TO MAP DRIVER WITH 18-BIT ADDRESSES IDENTICALR; TO 16-BIT ADDRESSESL;; .IF DF T$$UMR& MOV #UMR5S,R1 ;POINT TO SAVED UMR 5& MOV #UBMPR+<5*4>,R2 ;POINT TO UMR 5$ MOV (R1)+,(R2)+ ;INITIALIZE UMR 5 MOV (R1)+,(R2)+ .IF NDF T$$SPL$ MOV (R1)+,(R2)+ ;INITIALIZE UMR 6 MOV (R1)+,(R2)+ B .ENDC ;NDF T$$SPL .ENDC ; DF T$$UMR60$: ;REFERENCE LABEL .ENDC ;D$$H11!D$$V11Q .ENDC ;M$$EXT  .IF DF R$$CON  RETURNS .IFFE" ADD #U.TSTA,R5 ;POINT TO U.TSTA6 CALL CKTAB ;CHECK WHETHER TYPE-AHEAD BUFFER SHOULD" ;BE ALLOCATED OR DEALLOCATED M .IF DF T$$MOD N' BICB #US.CRW!US.DSB,U.STS-U.TSTA(R5)E ;ASSUME LOCAL LINE  .ENDC P1 MOV #CT.PWR,R2 ;SET ROUTINE INDEX FOR POWER-UPV1 CALLR CTRD ;CALL CONTROLLER DEPENDENT ROUTINEN ;AND RETURN .ENDC ;R$$CON B  .DSABL LSBC;H;$ .END .ENDC ;M$$EXT  .IF DF R$$CON  RETURNS .TITLE TTINIB .IDENT /06.06/T; =; COPYRIGHT (c) 1986,1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;I>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;) ;S ; 02-FEB-78 PETER WANNHEDEND ;M ; PREVIOUSLY MODIFIED BY:;Q; P. WANNHEDEN; C. F. SPITZ ; D. R. DONCHIN, ; T. LEKAS; S. C. ADAMSE; R. S. PHILPOTT;N;S; MODIFIED BY:;3; L. KOGAN 02-NOV-85 06.016; LK705 -- MAKE 11M AND 11M+ TTDRV MODULES IDENTICAL;G ; S. C. ADAMS 16-JUNE-86 06.02@; SA460 -- ALLOW BROADCAST WRITE TO TI: OF NON-PRIVILEGED TASK ; AND CLEAN UP SOME COMMENTS; "; S. C. ADAMS 20-AUGUST-86 06.03; SA464 -- ADD ROUTINE QPORG;B'; TODD SCHOELLER 12-DECEMBER-86 06.04Y9; TMS051 -- CORRECT QPORG TO USE CORRECT BLOCKING BITS.;R'; B. S. MCCARTHY 31-DECEMBER-86 06.05E<; BM380 -- CORRECT QPORG SO THAT FORK CALL GOES TO CORRECT ; ROUTINE.-;.$; T. M. SCHOELLER 14-AUG-87 06.06>; TMS060 -- If a privilege violation occurs during an IO.HNG7; or an IO.ORG, pop the return address off the stack (; before jumping to error processing.;;+;M; ****** T T I N I ****** ;DC; THIS MODULE CONTAINS THE ROUTINES TO INITIATE A NEW I/O REQUESTML; FOR A TERMINAL. THERE ARE THREE PARTS TO THIS. FIRST, THE I/O REQUESTSI; ARE VALIDATED PRIOR TO PLACING THEM IN THE DEVICE'S I/O PACKET QUEUE.OI; THIS MUST OCCUR WHILE THE USER TASK WHICH ISSUED THE REQUEST IS STILLMK; THE CURRENT TASK. NEXT, THE REQUEST IS PLACED IN THE REQUEST QUEUE FORpK; THE TERMINAL. FINALLY, ANY REQUEST IN THE QUEUE WHICH CAN BE INITIATED.F ; IS DEQUEUED AND PASSED TO A FUNCTION-DEPENDENT INITIATION ROUTINE.!;-";T# .MCALL PKTDF$ $ PKTDF$ %& .PSECT MAP5'.PAGEND( .SBTTL TTINI - TERMINAL DRIVER I/O REQUEST INITIATION ENTRY POINT);A*;+.+; **-TTINI - REQUEST INITIATION ENTRY POINT.,;OM-; THIS ROU00g{ccccTINE IS CALLED FROM "DRQIO" WHEN A TASK HAS ISSUED AN I/O REQUESTM.; FOR A TERMINAL. THE CALL IS MADE PRIOR TO QUEUEING THE I/O PACKET TO THE M/; SCB QUEUE SINCE TERMINALS HAVE THE "UC.QUE" BIT SET IN THEIR UCB'S. THISSL0; IS DONE WHILE THE TASK CONTEXT IS STILL VALID, SINCE MANY FUNCTIONS WILLM1; NEED ADDITIONAL PARAMETER CHECKS NOT DONE BY THE EXECUTIVE. THIS ROUTINEEJ2; WILL MAP THE DRIVER DATA AREA (SINCE WE WERE CALLED FROM THE EXEC) AND>3; DISPATCH ON THE FUNCTION CODE TO VALIDATE THE I/O REQUEST.4;O 5; INPUTS:,6; R1 => I/O REQUEST PACKET TO BE PROCESSED(7; R4 => SCB FOR THE REQUESTED TERMINAL(8; R5 => UCB FOR THE REQUESTED TERMINAL9; :; OUTPUTS: NONE.;; $<; REGISTERS MODIFIED: R0, R1, R3=;->; ?TTINI::N#@ CALL MAPD ;MAP DRIVER DATA AREAI&A MOV R1,R3 ;COPY I/O PACKET POINTER1B MOVB I.FCN+1(R3),R0 ;GET THE I/O FUNCTION CODE&C ASL R0 ;CONVERT IT TO A WORD INDEXDE .IF DF R$$IICF5G CALLR @QPDSP(R0) ;DISPATCH TO PROCESS THIS REQUESTHHI .IFF ;R$$IICJ7K CALLR @QPDSP-2(R0) ;DISPATCH TO PROCESS THIS REQUESTLM .ENDC ;R$$IICNOP .IF DF T$$EIO&T$$OVLOQFR;HERE IS THE STUB FOR TRANSFERING TO THE OVERLAY. QPEIO IS IN TTATT.S TQPEIO::1,U CALLR QPETRA ;BRANCH TO TRANSFER IN APR6VW .ENDC ;T$$EIO&T$$OVLRXY.PAGE/=Z .SBTTL FPGRQ - GET A REQUEST PACKET FROM THE REQUEST QUEUEC[;\;+4]; FPGRQ - GET A REQUEST PACKET FROM THE I/O QUEUE.A^; THIS SUBROUTINE IS ENTERED EITHER FROM THE REQUEST INITIATOR, _; OR FROM THE FORK DISPATCHER.`;0 a; INPUT:b; R5 POINTER TO U.TSTA+c; S1.DSI 1 TO PREVENT PROCESSING OF INPUTOd;V e; OUTPUT:R:f; IF THERE IS AN IO.WBT PACKET IN THE QUEUE, A CTRL-Q ISg; SIMULATED.h;8i; AS MANY PACKETS AS CAN BE DEQUEUED FROM THE IO QUEUEj; ARE STARTED.k;%l; REGISTERS ALTERED: R0,R1,R2,R3,R4 m;-n; o;E p .ENABL LSB qFPGRQ::Ar BIT #FR.PFP,U.TFRQ-U.TSTA(R5) ;POST-FORK PROCESSING REQUESTED?T/s BNE FPRET ;IF NE, YES...MUST DO THAT FIRST.t uGRQPKT:Hvw .IF NDF T$$SPL0x?y MOV #DEUCBX,-(SP) ;IF TSTRQ OR $GSPKT FAILS, DEALLOCATE UCBXSz{ .IFTF ;NDF T$$SPL|+} CALL TSTRQ ;TEST IF ANYTHING TO DEQUEUE 3~ ;IF NOT, DEALLOCATE UCBX AND RETURN TO CALLER 0 MOV R3,-(SP) ;SAVE FLAGS IN CASE $GSPKT FAILS- MOV #GRQAC,R2 ;POINT TO ACCEPTANCE ROUTINE1( SUB #U.TSTA,R5 ;POINT TO START OF UCB$ MOV R5,-(SP) ;SAVE POINTER TO UCB CALL $GSPKT ;GET A PACKETG' MOV (SP)+,R5 ;RESTORE POINTER TO UCB.5 BCC 10$ ;IF CC, SUCCESSFULLY GOT A REQUEST...SKIP$;O; NOPKDQ - NO PACKET CAN CURRENTLY BE DEQUEUED. EITHER THERE WERE NO PACKETSFK; OR THE ACCEPTANCE ROUTINE ABBORTED THE SCAN AND BRANCHED HERE DIRECTLY.,;L NOPKDQ:A+ ADD #U.TSTA,R5 ;POINT TO UCB STATUS WORDL9 BIC (SP)+,2(R5) ;CLEAR FLAGS THAT WE SHOULD NOW IGNOREAFPRET: RETURN ;ALL DONEP;TI; FOUND A REQUEST PACKET THAT CAN BE PROCESSED. IT'S ADDRESS IS IN R1.C;10$: .IFT ;NDF T$$SPLT? CMP (SP)+,(SP)+ ;CLEAN STACK OF FLAGS AND DEALLOCATE ROUTINE .IFF ;NDF T$$SPLN# TST (SP)+ ;CLEAN STACK OF FLAGSE .ENDC ;NDF T$$SPL .IF DF T$$BTW' MOV U.SCB(R5),R3 ;GET POINTER TO SCB20$:8 MOV (R3),R3 ;GET POINTER TO NEXT I/O PACKET IN QUEUE BEQ 30$ ;IF EQ, NONE...SKIPW1 CMP I.UCB(R3),R5 ;IS THAT PACKET FOR THIS UCB?N) BNE 20$ ;IF NE, NO...SKIP THIS PACKETA= CMPB I.PRI(R3),#251. ;IS REQUEST FOR A BREAKTHROUGH WRITE?, BEQ 40$ ;IF EQ, YES...ACCEPT THE REQUEST30$:E BIC #S2.BRQ,U.TSTA+2(R5) ;OTHERWISE, SHOW NO MORE IO.WBTS IN QUEUET40$: .ENDC ;T$$BTW- ADD #U.TSTA,R5 ;POINT TO FIRST STATUS WORD" MOV R1,R3 ;COPY PACKET POINTER< CLR (R3) ;CLEAR LINK WORD USED TO HOLD COMPLETION STATUSA MOVB I.FCN+1(R3),R1 ;GET I/O REQUEST FUNCTION CODE (HIGH BYTE)  .IF DF T$$SPL/ MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;MAP THE UCBX. MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX .IFTF ;T$$SPL .IIF NDF T$$SPL, N$$SPL00|tt tfDATA=0 .IF DF T$$MOD!N$$SPLB;+E; NOTE - HERE WE ASSUME NUMERIC VALUES FOR FUNCTION CODES ACCORDING;); TO WHAT IS DESCRIBED IN MODULE TTDAT!S;T7 CMP R1,#IO.RPR/400 ;IS REQUEST ONE OF THE FOLLOWING: / ; IO.RPR, IO.RTT, IO.EIO, IO.RSD, IO.WSD?; BHIS 50$ ;IF HIS, YES...REQUIRE UCBX AND DO MODEM CHECKY2 CMP R1,#IO.ATT/400 ;IS IT ONE OF THE FOLLOWING:' ; IO.DET, IO.GTS, SF.GMC, SF.SMC?08 BHI 91$ ;IF HI, YES...DON'T NEED UCBX OR MODEM CHECK6 ;OTHERWISE, REQUEST IS IO.ATT, IO.WLB, OR IO.RLB .ENDC ;T$$MOD!N$$SPL  .IF DF T$$MOD: BEQ 60$ ;IF EQ, IO.ATT...NEED UCBX BUT NOT MODEM CHECK .IFTF ;T$$MOD50$: .IFT ;T$$MODNC BITB #US.DSB!US.CRW,U.STS-U.TSTA(R5) ;IS THE LINE DISABLED OR...2 ; ...WAITING FOR CARRIER (CHECKED ONLY ON...2 ; ...IO.RLB, IO.WLB, IO.RPR, IO.RTT, IO.EIO,' ; ...IO.RSD, AND IO.WSD REQUESTS)F- BEQ 60$ ;IF EQ, NO...REQUEST CAN CONTINUEB. BIT #S4.DLO,6(R5) ;IS THIS A DIAL-OUT LINE?2 BNE 60$ ;IF NE, YES...LET THE REQUEST BE TRIED< MOV #IE.DNR&377,R0 ;ELSE, RETURN "DEVICE NOT READY" ERROR* JMP 910$ ;SKIP TO COMPLETE THE REQUEST60$: .ENDC ;T$$MOD .IFF ;T$$SPL.0 CALL ALUCBX ;ALLOCATE UCBX IF IT ISN'T THERE0 BCS 105$ ;IF CS, NO FREE POOL...RETURN ERROR .ENDC ;T$$SPL .IF DF T$$EIO8 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 LOOPT ASSUME I.XLNK,0) MOV (R2),R2 ;GET POINTER TO NEXT IOPXP6 BR 70$ ;CHECK THIS ONE (IT MUST BE HERE SOMEWHERE)73$:= BIT #TF.RDI,I.XMOD(R2) ;READ WITH DEFAULT INPUT SPECIFIED? BEQ 80$ ;IF EQ NO> MOV I.XDBL(R2),U.TDIC(R4) ;SAVE DEFAULT INPUT BUFFER LENGTH6 MOV R1,-(SP) ;SAVE R1 IN CASE THIS IS USER TASK EIO? CALL $TSTBF ;SHOULD WE ATTEMPT TO BUFFER THE DEFAULT INPUT?P BCS 77$ ;IF CS NO ;FH; ATTEMPT ALLOCATING AND FILLING TTDRV BUFFERS WITH DEFAULT INPUT DATA;S) BIS #S1.IBF,@R5 ;ASSUME BUFFERED INPUTT3 MOV R2,-(SP) ;SAVE IOPX POINTER ACROSS ALTB CALL 7 CALL ALTB ;ALLOCATE A BUFFER TO STORE DEFAULT INPUT , MOV R2,R0 ;PASS THE BUFFER ADDRESS TO R0+ MOV (SP)+,R2 ;RESTORE IOPX ADDRESS TO R2;1  BCS 77$ ;IF CS, NO BUFFER IS AVAILABLE - JUMPS=  MOV R0,U.TDIF(R4) ;SAVE FIRST DEFAULT INPUT BUFFER ADDRESSE?  MOV #T$$BFL-4,U.TDIP(R4) ;SET SIZE OF DATA PORTION OF BUFFER=  MOV R0,U.TDIP+2(R4) ;SET DATA POINTER TO FIRST DATA BUFFERL?  ADD #4,U.TDIP+2(R4) ;POINT PAST BUFFER HEADER TO DATA ITSELF)74$: CLR (R0)+ ;CLEAR BUFFER LINK WORDB5 MOV R0,R1 ;SAVE POINTER TO BUFFER CHARACTER COUNTLG MOV #T$$BFL-4,(R0)+ ;SET MAXIMUM DATA THAT CAN BE STORED IN 1 BUFFERR;75$: MOV I.XDBF(R2),KISAR6 ;MAP USER DEFAULT INPUT BUFFERA= MOVB @I.XDBF+2(R2),-(SP) ;GET CHARACTER FROM USER'S BUFFERT" MOV $DALED,KISAR6 ;REMAP DRIVER5 MOVB (SP)+,(R0)+ ;INSERT CHARACTER INTO OUR BUFFERR6 INC I.XDBF+2(R2) ;UPDATE POINTER INTO USER'S BUFFER+ DEC I.XDBL(R2) ;ONE LESS CHARACTER TO GOD BEQ 79$ ;IF EQ ALL DONER= DEC (R1) ;MORE CHARACTERS YET TO GO - IS OUR BUFFER FULL?O: BNE 75$ ;IF NE NO - INSERT MORE CHARACTERS INTO BUFFER9 MOV R2,-(SP) ;YES - SAVE IOPX POINTER ACROSS ALTB CALL2= CALL ALTB ;ALLOCATE ANOTHER BUFFER TO STORE DEFAULT INPUT,, MOV R2,R0 ;PASS THE BUFFER ADDRESS TO R0+ MOV (SP)+,R2 ;RESTORE IOPX ADDRESS TO R2,5 BCS 76$ ;IF CS, NO ADDITIONAL BUFFER IS AVAILABLE++ MOV R0,-(R1) ;LINK OLD BUFFER TO NEW ONED,  BR 74$ ;STUFF CHARACTERS INTO NEW BUFFER!;$N"; COME HERE IF NOT ENOUGH TTDRV BUFFERS COULD BE ALLOCATED TO CONTAIN ALL OF.#; THE CHARACTERS OF THE USER'S DEFAULT INPUT$;T8%76$: MOV R2,-(SP) ;SAVE IOPX POINTER ACROSS DELTB CALL9& MOV U.TDIF(R4),R2 ;GET ADDRESS OF FIRST OF OUR BUFFERS ' CALL DELTB ;DEALLOCATE THEMS%( MOV (SP)+,R2 ;RESTORE IOP00€g{ccccX POINTER+);R8*; SAVE POINTERS TO USER'S DEFAULT INPUT BUFFER IN UCBX+;U@,77$: MOV I.XDBF(R2),U.TDIP(R4) ;SAVE APR BIAS OF USER'S BUFFER@- MOV I.XDBF+2(R2),U.TDIP+2(R4) ;SAVE VIRTUAL ADDRESS OF BUFFER/. CLR U.TDIF(R4) ;NO DEFAULT BUFFERS ALLOCATED */ BIC #S1.IBF,(R5) ;DO NON-BUFFERED INPUT0;D.1; PROCESS AN IO.RTT (TF.RTT) REQUEST, IF ANY2;I379$:4 MOV (SP)+,R1 ;RESTORE R1(580$:=6 BIT #TF.RTT,I.XMOD(R2) ;READ W/TERMINATOR TABLE SPECIFIED?E37 BEQ PKTDSP ;IF EQ, NO...SKIP TO DISPATCH PACKET8J9 MOV I.XTTB(R2),I.PRM+10(R3) ;COPY 1.ST ADDRESS DOUBLE WORD OF NEW TABLEL: MOV I.XTTB+2(R2),I.PRM+16(R3) ;COPY 2.ND ADDRESS DOUBLE WORD OF NEW TABLE;*< MOV I.XTTL(R2),R0 ;COPY LENGTH OF TABLE$= CMP R0,#32. ;IS IT OVER 32 BYTES>? BHI 92$ ;YES, SET TO 32.@ BR 100$ ;JOIN COMMON CODENAB .ENDC ;T$$EIOCD90$:9E CMP R1,#IO.RTT/400 ;IS THIS A READ W/TERMINATOR TABLE?#F BEQ 92$ ;IF EQ YESG91$:(H BR PKTDSP ;DISPATCH ON FUNCTION CODEI92$:&J MOV #32.,R0 ;COPY A 32. BYTE TABLEKL100$:RM MOV R0,-(SP)SN CALL ALTB ;ALLOCATE A TABLEEO MOV (SP)+,R0(:P105$: BCS 900$ ;IF CS, ALLOCATION FAILED...RETURN ERROR3Q MOV R2,U.TRTT(R4) ;SAVE TERMINATOR TABLE ADDRESSCR110$:.,S MOV I.PRM+10(R3),KISAR6 ;MAP USER'S TABLE6T MOVB @I.PRM+16(R3),-(SP) ;RETRIEVE AN ENTRY FROM IT,U MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING2V MOVB (SP)+,(R2)+ ;COPY ENTRY TO ALLOCATED TABLE(W INC I.PRM+16(R3) ;POINT TO NEXT ENTRYX SOB R0,110$ ;LOOP TIL DONE*Y MOV U.TRTT(R4),R0 ;FORM REMAINING COUNTZ ADD #32.,R0 ;...[ SUB R2,R0 ;... \ BEQ PKTDSP ;ALL DONE IF ZERO]115$:0"^ CLRB (R2)+ ;ZERO REST OF TABLE_ SOB R0,115$ ;...(`; BR PKTDSP ;FALL THROUGH TO "PKTDSP"a.PAGE@b .SBTTL PKTDSP - DISPATCH ON FUNCTION CODE TO INITIATE REQUESTc;Pd;+=e; **-PKTDSP - DISPATCH ON FUNCTION CODE TO INITIATE REQUESTPf;-g;V hPKTDSP:)/i ASL R1 ;CONVERT FUNCTION CODE TO WORD INDEX(jk .IF DF T$$ACDl>m MOV #UA.ALL,U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING FLAGS9n MOV U.ACB-U.TSTA(R5),R0 ;GET ACD CONTROL BLOCK ADDRESSQ&o BEQ 120$ ;IF EQ, NONE THERE...SKIP!p MOV R1,R2 ;COPY FUNCTION CODE3q CMPB R2,#30. ;FUNCTION CODE IN FIRST MASK WORD?Pr BLOS 117$ ;Y - JUMPT9s TST (R0)+ ;BUMP ACB POINTER TO CHECK SECOND MASK WORD%t SUB #32.,R2 ;REDUCE FUNCTION CODEUIu117$: BIT $BTMSK(R2),A.MAS(R0) ;IS THE ACD INTERESTED IN THIS FUNCTION?Rv BEQ 120$ ;IF EQ, NO...SKIP5w MOV #A.DEQU,R0 ;SET I/O PACKET DEQUEUE ENTRY POINTRx CALL $SWACD ;CALL THE ACDS9y BIT #UA.ALL,U.AFLG-U.TSTA(R5) ;ALLOW THIS I/O REQUEST?Q&z BNE 120$ ;IF NE, YES...CONTINUE ON?{ MOV U.ACB-U.TSTA(R5),R0 ;GET ACD CONTROL BLOCK ADDRESS AGAINC9| MOV A.IOS(R0),R0 ;GET I/O ERROR CODE TO RETURN TO TASK(} BR 910$ ;FINISH I/OO~120$:C .ENDC ;T$$ACD .IF DF T$$OVL8 MOV PPDSP-2(R1),R1 ;GET ADDRESS TO WHICH TO DISPATCH% ASL R1 ;CONVERT TO A REAL ADDRESS;. BCS 130$ ;AND SEE IF ROUTINE IS IN OVERLAY$ CALL MPEXT ;MAP AND CALL ROUTINE  BR 140$ ;C130$:T& CALL (R1) ;IT'S NOT IN THE OVERLAY140$:T .IFF ;T$$OVLN* CALL @PPDSP-2(R1) ;DO OR START FUNCTION .ENDC ;T$$OVL4 JMP GRQPKT ;LOOP TO DEQUEUE ANYTHING ELSE WE CAN;T2; ERROR HANDLING FOR REQUEST INITIATION ROUTINE.;.900$:AC MOV #IE.NOD&377,R0 ;RETURN ERROR FOR INSUFFICIENT DYNAMIC MEMORYW910$:I .IF DF T$$EIO) CMP R1,#IO.EIO/400 ;IS THIS AN IO.EIO? ; BNE 990$ ;IF NE, NO...JUST FINISH OFF PACKET WITH ERRORE# MOV R0,-(SP) ;SAVE RETURN STATUSR& MOV R5,R0 ;GET COPY OF UCB POINTER@ ADD #U.TIXL-U.TSTA,R0 ;MAKE POINTER TO U.TIXL (IOPX LISTHEAD)980$:7 MOV R0,R1 ;CURRENT IOPX POINTER BECOMES BACKPOINTERI ASSUME I.XLNK,0# MOV (R1),R0 ;POINT TO NEXT IOPXOB CMP I.XIOP(R0),R3 ;DOES THIS IOPX BELONG TO CURRENT I/O PACKET?- BNE 980$ ;IF NE,NO...LOOP TILL WE FIND ITD ASSUME I.XLNK,0' MOV (R0),(R1) ;REMOVE IOPX FROM LIST % MOV R3,-(SP) ;SAVE POINTE00ʀ|tt tfDATAR TO IOPXT# MOV #I.XLEN,R1 ;GET SIZE OF IOPXN  CALL $DEACB ;DEALLOCATE IOPX* MOV (SP)+,R3 ;RESTORE POINTER FOR IOFIN; MOV U.TDIF(R4),R2 ;GET DEFAULT INPUT BUFFER LIST POINTER ' CALL DELTB ;DEALLOCATE THEM, IF ANYI# MOV (SP)+,R0 ;RESTORE ERROR CODE,990$:T .ENDC ;T$$EIO& CALL IOFIN ;FINISH THE I/O REQUEST' JMP GRQPKT ;TRY FOR ANOTHER REQUEST.  .DSABL LSBI.PAGE .SBTTL TTINI SUBROUTINES(B .SBTTL . GRQAC - $GSPKT ACCEPTANCE ROUTINE FOR GET RQST (FPGRQ);;+Q; **-GRQAC - $GSPKT ACCEPTANCE ROUTINE FOR GETTING A NEW REQUEST PACKET (FPGRQ)R;-;TGRQAC:@ CMP I.UCB(R1),G$$SPA(SP) ;IS THIS PACKET FOR THE CURRENT UCB? SEC ;ASSUME ERROR+ BNE 10$ ;IF NE, NO...ASSUMPTION CORRECTE ASSUME S2.IRQ,S1.IBY ASSUME S2.ORQ,S1.OBY; BITB I.PRM+7(R1),U.TSTA(R5) ;CAN WE PROCESS THIS PACKET? 5 BNE 20$ ;IF NE, NO...SKIP TO CHECK FOR SCAN ABORTTM; IF TERMINAL IS IN TERMINAL MANAGEMENT MODE AND THE REQUEST IS AN INTERNALPI; I/O REQUEST, REJECT THIS PACKET. THIS IS A BIT OF A HACK. WHEN TIMEWL; PERMITS, WE COULD USE EVENT PACKETS TO TELL THE NET TO STOP SENDING I/O.;S .IF DF T$$SCA & R$$IIC?@ BIT #S5.TMM,U.TST5(R5) ;IS TERMINAL IN TERM. MANAGEMENT MODE?# BEQ 5$ ;IF NOT, SO FAR, SO GOOD 8 BIT #1,I.IOSB+4(R1) ;IF TMM, IS IT ALSO INTERNAL I/O?* BNE 10$ ;REJECT.. SEC STILL FROM ABOVE5$:O .ENDC ;T$$SCA & R$$IIC .IF DF T$$BTW ASSUME S3.FDX,200> TSTB U.TSTA+4(R5) ;IS THIS A FULL DUPLEX LINE? (CLEAR CC-C), BMI 10$ ;IF MI, YES...ACCEPT THIS PACKET3 BIT #S1.IBY!S1.OBY,U.TSTA(R5) ;IS ANYTHING BUSY?S, BEQ 10$ ;IF EQ, NO...ACCEPT THIS REQUEST;L; THE LINE IS NOT IN FULL DUPLEX MODE, AND EITHER INPUT OR OUTPUT IS BUSY.O; IN THIS CASE, THE ONLY PACKET WE CAN ACCEPT IS IO.WBT. IO.WBT PACKETS HAVE M; PRIORITY 251., AND ALL OTHERS HAVE LOWER PRIORITY. IF THIS PACKET IS NOT$P; AN IO.WBT, WE KNOW THAT THERE ARE NO IO.WBT'S FURTHER DOWN THE QUEUE EITHER,; SO WE ABORT THE SCAN.C;C? CMPB I.PRI(R1),#251. ;IS THIS AN IO.WBT? (CLEAR CC-C IF YES)Y' BNE 30$ ;IF NE, NO...ABORT THE SCAN;1;IM; DON'T BEGIN AN IO.WBT FUNCTION IF A READ IS ACTIVE THAT SPECIFIED TF.XOF.AL; THIS IS NECESSARY TO PREVENT A COLLISION BETWEEN THE IO.WBT DATA AND THE; XOF CHARACTER OUTPUT.C;H9 BIT #S1.USI,U.TSTA(R5) ;UNSOLICITED INPUT IN PROGRESS?. BNE 10$ ;Y - ACCEPT IO.WBT .IF DF T$$SPL" MOV U.TAPR(R5),KDSAR5 ;MAP UCBX  MOV #120000,R2 ;POINT TO UCBX .IFF ;T$$SPL D MOV U.TUX(R5),R2 ;GET UCBX (THERE MUST BE ONE SINCE LINE IS BUSY) .ENDC ;T$$SPLC TSTB U.TISV(R2) ; CHECK IF ^R AFTER IO.WBT IS IN PROGRESS ;LK705A4 BNE 30$ ; YES DO NOT TAKE ANOTHER IO.WBT ;LK7050 MOV @R2,R2 ;GET CURRENT INPUT PACKET ;**-2! BEQ 10$ ;NONE - ACCEPT IO.WBTT< BIT #TF.XOF,I.FCN(R2) ;READ IS ACTIVE - TF.XOF SPECIFIED?: BNE 30$ ;Y - REJECT IO.WBT AND STOP SCAN AT THIS POINT;5&; ACCEPT THE CURRENT REQUEST PACKET. ;T   .IFF ;T$$BTWT 1  CLC ;RETURN WITH CC-C CLEAR TO ACCEPT PACKETE .ENDC ;T$$BTW10$: RETURN ;ALL DONET;IH; IF PACKET REQUIRES BOTH INPUT AND OUTPUT TO BE FREE, ABORT THE SCAN.@; OTHERWISE JUST REJECT THE PACKET BY RETURNING WITH CC-C SET.;  ASSUME S2.ORQ,100 ASSUME S2.IRQ,20020$:@ CMPB I.PRM+7(R1),#S1.IBY!S1.OBY ;ARE BOTH INPUT AND OUTPUT...0 ; ...REQUIRED TO BE FREE FOR THIS REQUEST?8 BLO 10$ ;IF LO, NO...RETURN TO REJECT THIS PACKET.... ; ...CC-C WAS SET BY COMPARE INSTRUCTION;CP; WE FOUND A PACKET THAT REQUIRES BOTH INPUT AND OUTPUT TO BE FREE. ABORT THEL ; SCAN SO THE PACKET WILL GET A CHANCE TO BE DEQUEUED ONCE ALL REQUESTS IN!; FRONT OF IT ARE DONE. ";A#30$:$ ADD #G$$SPA,SP ;FLUSH STACK'% MOV (SP)+,R5 ;RESTORE POINTER TO UCB0,& CLR (SP) ;DON'T CHANGE FLAGS IN U.TSTA+25' JMP NOPKDQ ;FINISH AS THOUGH NO PACKET TO DEQUEUE (.PAGETB) .SBTTL . KILAC - $GSPKT ACCEPTANCE ROUTINE FO00Ҁg{ccccR KILL I/O (QPKIL)*;+;+5,; **-KILAC - KILL I/O ACCEPTANCE ROUTINE FOR $GSPKTU-;PL.; "$GSPKT" CALLS THIS ROUTINE WITH AN I/O PACKET TO BE CHECKED AGAINST THE!/; KILL I/O ACCEPTANCE CRITERIA:DF0; 1. THE I/O PACKET UCB ADDRESS MUST MATCH THE I/O KILL REQUEST UCB.F1; 2. THE I/O PACKET TCB ADDRESS MUST MATCH THE I/O KILL REQUEST TCB.F2; 3. IF THE I/O KILL SUBFUNCTION WAS TF.WLB, THE I/O PACKET FUNCTION.3; CODE MUST BE "IO.EIO!TF.WLB" OR "IO.WLB".F4; 4. IF THE I/O KILL SUBFUNCTION WAS TF.RLB, THE I/O PACKET FUNCTIONC5; CODE MUST BE "IO.EIO!TF.RLB", "IO.RLB", "IO.RPR", OR "IO.RTT".$6;" 7; INPUTS:58; R1 => I/O REQUEST PACKET TO BE ACCEPTED/REJECTED. *9; G$$SPA(SP) => UCB OF PACKETS TO ACCEPT):; G$$SPA+2 => I/O KILL REQUEST PACKETL;;U <; OUTPUTS:.)=; CC-C = 0 IF PACKET IS TO BE ACCEPTEDI)>; = 1 IF PACKET IS TO BE REJECTEDL?;U @; REGISTERS MODIFIED: R2, R3A;-B;CD .IF DF R$$IICEFKILAC:@G CMP I.UCB(R1),G$$SPA(SP) ;IS THIS PACKET FOR THE CORRECT UCB?(H BNE 30$ ;IF NE, NO...DON'T ACCEPT IT<I MOV G$$SPA+2(SP),R3 ;GET POINTER TO KILLER REQUEST PACKET7J CMP I.TCB(R1),I.TCB(R3) ;PACKET FOR THE CORRECT TCB?(K BNE 30$ ;IF NE, NO...DON'T ACCEPT IT8L MOVB I.FCN(R3),R3 ;GET KILLER PACKET SUBFUNCTION CODE3M MOVB I.FCN+1(R1),R2 ;GET PACKET SUBFUNCTION CODENO .IF DF T$$EIOP?Q CMPB #IO.EIO/400,R2 ;IS THIS PACKET AN EXTENDED I/O REQUEST?R BNE 5$ ;IF NOT, BRSET;WARNING: THIS ASSUMES THAT IO.RLB/400,TF.RLB AND IO.WLB/400,TF.RLB U@V MOVB I.FCN(R1),R2 ;GET NON-EXTENDED I/O REQUEST FUNCTION CODEW5$:OXY .ENDC ;T$$EIOZ8[ CMPB #IO.RPR/400,R2 ;IS THIS AN OLD-FASHIONED IO.RPR?\ BEQ 10$ ;IF EQ, YES...SKIP9] CMPB #IO.RTT/400,R2 ;IS THIS AN OLD-FASHIONED IO.RTT?F^ BNE 20$ ;IF NE, NO...SKIP1_10$:7` MOVB #TF.RLB,R2 ;MAKE THESE LOOK LIKE STRAIGHT READSCa20$:3b CLC ;ASSUME WE ARE GOING TO ACCEPT THIS PACKET.c BITB R3,R2 ;IS THIS A PACKET TO BE KILLED?#d BNE 40$ ;IF NE, YES...ACCEPT ITBe30$:"f SEC ;DON'T ACCEPT THIS PACKETg40$:h RETURN ;ALL DONEOij .ENDC ;R$$IICkl.PAGEO3m .SBTTL I/O REQUEST PRE-QUEUE PROCESSING ROUTINESD-n .SBTTL . QPKIL - INTERNAL I/O KILL REQUESTPo;.p;+1q; **-QPKIL - INTERNAL I/O KILL REQUEST (IO.KIL)$r; Ks; THIS ROUTINE PROCESSES AN I/O REQUEST WITH A FUNCTION CODE OF ZERO. ANDMt; I/O PACKET WILL ONLY HAVE THIS FUNCTION CODE IF IT IS AN INTERNAL (SYSTEM Mu; STATE) I/O REQUEST. IT PERFORMS FUNCTIONS SIMILAR TO THE DRIVER'S CANCELLv; I/O ENTRY POINT "TTCAN". HOWEVER, IF CAN BE SPECIFIED THAT ONLY READ ORKw; ONLY WRITE REQUESTS ARE TO BE CANCELLED. THIS IS DONE WITH THE REQUESTDNx; MODIFIERS "TF.WLB" AND "TF.RLB". A "$GSPKT" ACCEPTANCE ROUTINE IS USED TOPy; FIND ALL SPECIFIED REQUESTS IN THE SCB QUEUE. AN I/O KILL REQUEST IS ALWAYSPz; PROCESSED AND COMPLETED IMMEDIATELY, SO IT IS NEVER PLACED IN THE SCB QUEUE.{; |; INPUTS:!}; R3 => I/O KILL REQUEST PACKETT~; R4 => SCB FOR THE TERMINAL; R5 => UCB FOR THE TERMINAL; I.FCN = TF.WLB OR TF.RLB,9; I.TCB => TCB OF TASK WHOSE REQUESTS ARE TO BE ABORTEDE;R ; OUTPUTS:E9; SPECIFIED I/O REQUESTS ARE ABORTED WITH STATUS IE.ABOA;F$; REGISTERS MODIFIED: R0, R1, R2;-; .IF DF R$$IIC QPKIL::E .IF DF M$$PRO1 BIT S.URM(R4),@$CPURM ;ALREADY ON CORRECT CPU?I BNE 5$ ;IF NE YES, CONTINUEH9; CONVERT PARAMETER LIST PART OF I/O PACKET INTO A FORKC"; BLOCK FOR INTERPROCESSOR FORK.* ADD #I.PRM+12,R3 ;POINT TO KISAR5 FIELD+ MOV KINAR5,(R3) ;INSERT DRIVER I MAPPINGO& MOV R4,-(R3) ;SAVE R4 IN FORK BLOCK9 MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCKT0 MOV R3,R4 ;POINT R4 AT FORK BLOCK FOR $FORK1& CALL $FORK1 ;SWITCH TO CORRECT CPU9 SUB #I.PRM+4,R3 ;POINT BACK TO BEGINNING OF FORK BLOCK) CALL MAPD ;RE-MAP DRIVER5$: .ENDC ; DF M$$PRO, MOV R3,-(SP) ;SAVE REQUEST PACKET POINTER) MOV R5,-(SP) ;SAVE CURRENT UCB POINTERE0 ;**NOTE: THESE A00ڀ|tt tfDATARE SAVED FOR INSPECTION...+ ; ...IN THE $GSPKT ACCEPTANCE ROUTINE 9 MOV I.TCB(R3),R1 ;GET TCB OF TASK TO KILL REQUESTS FORU> MOV I.FCN(R3),R3 ;GET FUNCTION CODE OF THINGS TO KILL IN R3? CALL TTCN1 ;CANCEL SELECTIVE I/O (DEPENDS ON TF.WLB/TF.RLB)R10$:$ MOV (SP),R5 ;RESTORE UCB ADDRESS3 MOV #KILAC,R2 ;SET POINTER TO ACCEPTANCE ROUTINE CALL $GSPKT ;GET A PACKETO. BCS 20$ ;IF CS, NO MORE PACKETS...ALL DONE3 MOV R1,R3 ;COPY KILLED PACKET ADDRESS FOR IOFIN 4 MOV #IE.ABO&377,R0 ;SET REQUEST COMPLETION STATUS* CALL IOFIN ;FINISH OFF THE I/O REQUEST# BR 10$ ;LOOK FOR ANOTHER PACKETR20$: TST (SP)+ ;CLEAN STACK< MOV (SP)+,R3 ;GET BACK ADDRESS OF I/O KILL REQUEST PACKET* MOV #IS.SUC&377,R0 ;SUCCESSFUL I/O KILL JMP IOFIN ;FINISH I/O KILL .ENDC ;R$$IIC.PAGEE; .SBTTL . BUFFER ADDRESS CHECKING AND RELOCATION ROUTINESE;;+4; **-CKBFR - ADDRESS CHECK BUFFER FOR READ ACCESSG; **-CKBFRW - ADDRESS CHECK BUFFER FOR READ ACCESS AND WORD ALIGNMENTT:; **-CKBFB - ADDRESS CHECK BUFFER FOR READ/WRITE ACCESS;K; THESE ROUTINES PERFORM THE DESCRIBED ADDRESS CHECKING ON A USER BUFFER.V;+ ; INPUTS:'; R0 => USER BUFFER (VIRTUAL ADDRESS)V; R1 = LENGTH OF USER BUFFERI; ; OUTPUTS:N,; CC-C = 0 IF ADDRESS CHECK WAS SUCCESSFUL$; CC-C = 1 IF ADDRESS CHECK FAILED6; R0 = ERROR CODE FOR ADDRESS CHECK FAILURE REASON:0; "IE.SPC" IF SPECIFIED BUFFER LENGTH IS ZEROD; "IE.SPC" IF BUFFER NOT WORD ALIGNED OR EXEC ADDRESS CHECK FAILS8; "IE.BAD" IF BUFFER SIZE IS GREATER THAN 8128. BYTES/; R1 = BIAS OF RELOCATED USER BUFFER ADDRESSC7; R2 = DISPLACEMENT OF RELOCATED USER BUFFER ADDRESS ;B; REGISTERS MODIFIED: R0;-;H .IF DF A$$CHK  .ENABL LSB CKBFRW:I0 BIT #1,R0 ;DOES BUFFER START ON ODD ADDRESS?6 BNE 910$ ;IF NE, YES...RETURN INVALID BUFFER ERROR CKBFR::R .IF DF R$$MPL7 MOV #$CKBFR,-(SP) ;SET UP CALL FOR READ-ACCESS CHECKO BR 10$ ;SKIP TO COMMON CODEE .IFTF ;R$$MPL CKBFB::E .IFT ;R$$MPL.8 MOV #$CKBFB,-(SP) ;SET UP CALL FOR WRITE-ACCESS CHECK10$: .IFTF ;R$$MPL! TST R1 ;IS BUFFER SIZE VALID?S5 BEQ 900$ ;IF EQ, NO...RETURN INVALID BUFFER ERROR8 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?7 BHI 920$ ;IF HI, YES...RETURN BAD BUFFER SIZE ERRORN .IFT ;R$$MPL .IF DF X$$HDR= MOV (SP),-(SP) ;DUPLICATE MAPPING ROUTINE ADDRESS ON STACKC. MOV KISAR6,2(SP) ;SAVE CURRENT EXEC MAPPING- MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADER. .IFTF ;X$$HDR5 CALL @(SP)+ ;CALL REQUESTED ADDRESS CHECK ROUTINEF .IFT ;X$$HDRT- MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGN .ENDC ;X$$HDR .IFF ;R$$MPL,+ CALL $ACHKB ;DO NORMAL ADDRESS CHECKING  .ENDC ;R$$MPL -  BCS 910$ ;IF CS, IT FAILED...RETURN ERRORP   .IFF ;A$$CHKHCKBRW: CKBFR:: CKBFB::M .IFTF ;A$$CHK; CALL $RELOC ;RELOCATE ADDRESS AND CONVERT TO DOUBLEWORDV RETURN ;ALL DONER .IFT ;A$$CHK900$:H8 .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS910$: C MOV #IE.SPC&377,R0 ;SET COMPLETION ERROR CODE FOR INVALID BUFFER.  BR 990$ ;SKIP!920$:$"8# .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS$=% MOV #IE.BAD&377,R0 ;SET COMPLETION ERROR CODE FOR BAD SIZE&990$:F ' SEC ;RETURN WITH ERROR FLAG( RETURN ;ALL DONE.) * .DSABL LSB+, .ENDC ;A$$CHK-..PAGE A/ .SBTTL . TSTRQ - CHECK I/O REQUEST QUEUE FOR PACKET TO DEQUEUE0;1;+&2; SUBROUTINE TSTRQ - TEST I/O QUEUE.3; 4; INPUT:5; R5 POINTER TO U.TSTA6;E 7; OUTPUT:S<8; IF THERE IS (POTENTIALLY) A PACKET IN THE I/O QUEUE THAT9; CAN BE PROCESSED:I@:; RETURN TO CALLER WITH R3 = MASK OF BITS TO CLEAR IN U.TSTA+2";; IF NO PACKET COULD BE DEQUEUED<;R =; IF NOT:>; RETURN TO CALLER'S CALLER.?;L@; REGISTERS ALTERED: R3A;-B;B CTSTRQ::/D MOV (00g{ccccR5),R3 ;GET FIRST TERMINAL STATUS WORD E COM R3 ;INVERT ITUCF BIC #^C,R3 ;CLEAR ALL TO SEE WHAT CAN BE DEQUEUED 1G BIS #S2.SRQ,R3 ;OR WITH "SPECIAL REQUEST" FLAG<H BIT R3,2(R5) ;IS ANYTHING IN QUEUE THAT CAN BE PROCESSED?8I BEQ 10$ ;IF EQ, NO...POP OUR WAY OUT OF THIS ROUTINECJ BIT #S2.BRQ,2(R5) ;IS THERE A "BREAKTHROUGH WRITE" IN THE QUEUE?C6K BNE 20$ ;IF NE, YES...IT CAN POSSIBLY BE PROCESSEDLM ASSUME S3.FDX,200N+O TSTB 4(R5) ;USER ON A FULL DUPLEX LINE?M6P BMI 20$ ;IF MI, YES...IT CAN POSSIBLY BE PROCESSED9Q BIT #S1.IBY!S1.OBY,(R5) ;IS ANYTHING BUSY ON THE LINE?E4R BEQ 20$ ;IF EQ, NO...RETURN TO PROCESS A REQUESTS10$:=T TST (SP)+ ;POP RETURN ADDRESS SO WE WON'T PROCESS REQUEST U20$:V RETURN ;ALL DONE WXY.PAGEOZ .PSECT MAP5.6[$\ .SBTTL . WRITE REQUEST PROCESSING'] .SBTTL . QPWSB - WRITE SPECIAL DATA ^;E_;+*`; **-QPWSD - WRITE SPECIAL DATA (IO.WSD)a;-b;0cd .IF DF B$$MAPe fQPWSD::D;g BIC #^C,I.FCN(R3) ;CLEAR DISALLOWED BITSO*h BIS #TF.WAL,I.FCN(R3) ;SET REQUIRED BIT>i CMP #T.RSDN,I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?'j BHIS QPWLB1 ;IF HIS, YES...CONTINUER8k BR EQPBAD ;ELSE, RETURN REQUEST WITH BAD PARAMENTERSlm .ENDC ;B$$MAPn(o .SBTTL . QPWLB - WRITE LOGICAL BLOCKp;Tq;+,r; **-QPWLB - NORMAL WRITE REQUEST (IO.WLB)s;-t; uQPWLB::vw .IF DF T$$CUPxBy MOV I.PRM+6(R3),I.PRM+10(R3) ;SAVE VFC/CURSOR-CONTROL FOR LATERz{ .ENDC ;T$$CUP| }QPWLB1:;9~ MOV #S2.ORQ,R4 ;A WRITE MUST BLOCK IF OUTPUT IS ACTIVER .IF DF T$$BTW@ BITB #TF.WBT,I.FCN(R3) ;IS THIS A BREAKTHROUGH WRITE REQUEST?< BEQ CKBFLN ;IF EQ, NO...CHECK BUFFER LENGTH AND QUEUE IT .IF DF M$$MUP* MOV I.TCB(R3),R0 ;GET ISSUEING TASK TCB= BIT #T3.PRV!T3.CLI,T.ST3(R0) ;IS TASK PRIVILEGED OR A CLI? 2 BNE 10$ ;IF NE, YES...DO BREAKTHROUGH ;SA4607 CMP T.UCB(R0),R5 ;IS THE IO.WBT TO OWN TI:? ;SA460C0 BNE EQPPRI ;IF NOT, DON'T ALLOW IT ;SA46010$: ;SA460 ;**-1  .ENDC ;M$$MUP8 MOVB #251.,I.PRI(R3) ;CHANGE REQUEST TO PRIORITY 251.? BIS #TF.CCO,I.FCN(R3) ;BREAKTHROUGH IMPLIES CANCEL CONTROL-OCF MOV #S2.ORQ!S2.BRQ,R4 ;FLAG BREAKTHROUGH REQUEST AND WAIT FOR WRITE .ENDC ;T$$BTW8 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST.PAGEE# .SBTTL . READ REQUEST PROCESSING & .SBTTL . QPRSD - READ SPECIAL DATA; ;+1; **-QPRSD - READ SPECIAL DATA REQUEST (IO.RSD)T;-; .IF DF B$$MAP QPRSD:: : BIC #^C,I.FCN(R3) ;CLEAR DISALLOWED BITS6 BIS #,I.FCN(R3) ;FORCE REQUIRED BITS6 TST I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?3 BEQ EQPBAD ;ZERO IS NOT ALLOWED, BAD PARAMETERSW> CMP #T.RSDN,I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?> BHIS CKBFLN ;IF HIS, YES...FINISH CHECKS AND QUEUE REQUEST BR EQPBAD ;BAD PARAMETERSR .ENDC ;B$$MAP& .SBTTL . QPRPR - READ AFTER PROMPT;(;+1; **-QPRPR - READ AFTER PROMPT REQUEST (IO.RPR);-;.  .ENABL LSBC .IF DF T$$RPR QPRPR::#< MOV I.PRM+10(R3),R0 ;GET VIRTUAL ADDRESS OF PROMPT BUFFER. MOV I.PRM+12(R3),R1 ;GET PROMPT BUFFER SIZEE MOV #S2.IRQ!S2.ORQ,R4 ;PROMPT MUST BLOCK IF INPUT OR OUTPUT ACTIVE(< CALL CKBFR ;CHECK READ ACCESS AND RELOCATE PROMPT BUFFER; BCC 10$ ;IF CC, OK...GO STORE ADDRESS AND QUEUE REQUESTP< BR IOFIN ;CHECK FAILED...COMPLETE REQUEST WITH THE ERROR .ENDC ;T$$RPR/ .SBTTL . QPRTT - READ WITH TERMINATOR TABLER;;+:; **-QPRTT - READ WITH TERMINATOR TABLE REQUEST (IO.RTT);-;1 QPRTT::E@ MOV #S2.IRQ,R4 ;READ W/TERMINATORS MUST BLOCK IF INPUT ACTIVEH; BIT #TF.PTT,I.FCN(R3) ;WANT TO USE PREVIOUSLY SPECIFIED TERM. TABLE?=; BNE CKBFLN ;IF NE, YES...DON'T BOTHER CHECKING PARAMETERP7 MOV I.PRM+10(R3),R0 ;GET ADDRESS OF TERMINATOR TABLEU6 MOV #32.,R1 ;LENGTH OF TABLE IS FIXED AT 32. BYTES= CALL CKBFRW ;CHECK READ AC00|tt tfDATACESS AND RELOCATE TABLE ADDRESSR: 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 WORD 8 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST  .DSABL LSB ' .SBTTL . QPRLB - READ LOGICAL BLOCKA;E;++; **-QPRLB - NORMAL READ REQUEST (IO.RLB)O;-; QPRLB::18 MOV #S2.IRQ,R4 ;NORMAL READ MUST WAIT FOR ACTIVE READ8 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST.PAGEI .SBTTL . ERROR HANDLING;T.; EQPPRI - RETURN PRIVILEGE VIOLATION ERROR.;W EQPPRI:E= MOV #IE.PRI&377,R0 ;SET ERROR CODE FOR PRIVILEGE VIOLATIONR= BR IOFIN ;FINISH I/O REQUEST (NO NEED TO RESTORE MAPPING)T;Q-; EQPBAD - RETURN ERROR FOR BAD PARAMETERS.B;A EQPBAD::< MOV #IE.BAD&377,R0 ;SET ERROR FOR BAD PARAMETER SPECIFIED .IF DF A$$CHK7 BR EQPFIN ;FINISH REQUEST (REMAP DRIVER ON THE WAY); B; EQPSPC - RETURN ERROR BECAUSE OF INVALID BUFFER SPECIFICATION.; EQPSPC:IA MOV #IE.SPC&377,R0 ;SET ERROR FOR ILLEGAL BUFFER SPECIFICATIONQ:; BR EQPFIN ;RETURN THE ERROR (REMAP DRIVER ON THE WAY) .ENDC ;A$$CHK EQPFIN:: .IF DF T$$EIO, MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING .ENDC ;T$$EIO IOFIN::% CLR R1 ;CLEAR SECOND WORD OF IOSBD& CALLR $IOFIN ;FINISH IO AND RETURN.PAGE. .SBTTL . CKBFLN - FINAL BUFFER LENGTH CHECK;?; CKBFLN - CHECK THAT BUFFER LENGTH IS WITHIN (1,8K-64) BYTESF;O CKBFLN:   .IF DF A$$CHK 5  MOV I.PRM+4(R3),R1 ;GET LENGTH OF TRANSFER REQUEST 6  BEQ EQPSPC ;IF EQ, RETURN ZERO BUFFER LENGTH ERROR8 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?7 BHI EQPBAD ;IF HI, BUFFER IS TOO BIG...RETURN ERROR .ENDC ;A$$CHK> .SBTTL QUEUE - PLACE I/O REQUEST PACKET INTO TERMINAL QUEUE;HA; R4 NOW CONTAINS FLAGS TO BE USED BY THE ACCEPTANCE ROUTINE FOC@; GETTING PACKETS FROM THE QUEUE VIA $GSPKT. SAVE THE FLAGS IN; I.PRM+7 OF THE I/O PACKET.;. QUEUE::K= ADD #U.TSTA,R5 ;POINT UCB POINTER TO THE FIRST STATUS WORD .IF DF T$$ACD8 MOV #UA.ALL,U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING# MOV U.ACB-U.TSTA(R5),R0 ;GET ACBP!  BEQ 10$ ;THERE IS NONE - JUMPT)! MOVB I.FCN+1(R3),R1 ;GET FUNCTION CODEB#" ASL R1 ;CONVERT TO A WORD INDEXI3# CMPB R1,#30. ;FUNCTION CODE IN FIRST MASK WORD?O$ BLOS 5$ ;Y - JUMPN9% TST (R0)+ ;BUMP ACB POINTER TO CHECK SECOND MASK WORDK%& SUB #32.,R1 ;REDUCE FUNCTION CODEEG'5$: BIT $BTMSK(R1),A.MAS(R0) ;IS THE ACD INTERESTED IN THIS FUNCTION?H( BEQ 10$ ;N - JUMP@) MOV #A.ACCE,R0 ;Y - SET TO I/O REQUEST ACCEPTANCE ENTRY POINT* CALL $SWACD ;CALL ACDB9+ BIT #UA.ALL,U.AFLG-U.TSTA(R5) ;ALLOW THIS I/O REQUEST?T, BNE 10$ ;Y - JUMP1,- SUB #U.TSTA,R5 ;POINT TO BEGINNING OF UCB. MOV U.ACB(R5),R0 ;GET ACB9/ MOV A.IOS(R0),R0 ;GET I/O ERROR CODE TO RETURN TO TASKN0 BR IOFIN ;FINISH I/O110$:23 .ENDC ;T$$ACD405 ASSUME ,006 MOVB R4,I.PRM+7(R3) ;SAVE FLAGS IN I/O PACKET'7 BNE 20$ ;PACKET CANNOT BE PROCESSED8 ;IMMEDIATELY - JUMP 9: .IF DF T$$GTS!T$$GMCP;>< CMPB #IO.HNG/256.,I.FCN+1(R3) ;IS THIS HANGUP OR GET CHAR.?(= BEQ 15$ ;IF EQ, IT'S A HANG - BRANCH>? .IF DF T$$OVL@2A MOV #PPSPC1,R1 ;GET ADDRESS OF ROUTINE IN TTEXT#B CALLR MPEXT ;MAP IT AND CALL ITRCD .IFF ;T$$OVLTE%F CALLR PPSPC1 ;PROCESS IMMEDIATELYGH .ENDC ;T$$OVLI15$:J .ENDC ;T$$GTS!T$$GMC2KL .IF DF T$$OVLM1N MOV #PPHNG,R1 ;GET ADDRESS OF ROUTINE IN TTEXT #O CALLR MPEXT ;MAP IT AND CALL ITIPQ .IFF ;T$$OVLR$S CALLR PPHNG ;PROCESS IMMEDIATELYTU .ENDC ;T$$OVLVW20$:EX BICB #S2.SRQ!S2.BRQ,I.PRM+7(R3) ;CLEAR SRQ AND BRQ FLAGS IN PACKETF2Y MOV U.SCB-U.TSTA(R5),R0 ;GET I/O QUEUE LISTHEAD!Z MOV R3,R1 ;GET PACKET POINTERP[ CALL $QINSP ;INSERT PACKET=\ BIT #S2.SRQ,R4 ;SPECIAL FUNCTION (IO.ATT, IO.00g{ccccDET, IO.SMC)?C] BEQ 30$ ;N - JUMPN+^ MOV #S2.SRQ,R4 ;Y - CLEAR ALL OTHER BITS_30$:/` BISB R4,2(R5) ;SET FLAGS TO INDICATE WHAT WELa ;PUT IN THE QUEUEL)b ;NOTE - MUST BE DONE A F T E R WEH c ;PUT PACKET IN THE QUEUE!!de .IF DF M$$PROf%g MOV #FR.GRQ,R3 ;COME BACK AT FPGRQA%h CALL SWCPU ;SWITCH TO CORRECT CPUUi;U;j; IF WE FALL THRU HERE, WE ARE ALREADY ON THE CORRECT CPUEk;Nlm .ENDC ;M$$PROn)o CALL SETDSI ;DISABLE INPUT PROCESSINGTp.q FRKBIT BIS,#FR.GRQ ;POST "GET REQUEST" FORK0r RETURN ;LET SETDSI DISPATCH IT. THAT'S WHATs ;IT GETS PAID FOR.tu.PAGEI0v .SBTTL . QPATT/QPDET - ATTACH/DETACH REQUESTSw; x;+/y; **-QPATT - ATTACH TERMINAL REQUEST (IO.ATT)E/z; **-QPDET - DETACH TERMINAL REQUEST (IO.DET)Q{;CM|; ENTRY POINT "QPATT" PERFORMS UNSOLICITED INPUT AST ADDRESS ADJUSTMENT FORLO}; SUPERVISOR MODE LIBRARIES (IF SUPPORTED) AND THEN FALLS THROUGH TO "QPDET".N~; FROM QPDET, CONTROL IS TRANSFERRED TO THE PACKET QUEUEING ROUTINE WITH THED; DEQUEUE BLOCKING FLAGS SET TO CHECK FOR ACTIVE INPUT AND OUTPUT.;E ; INPUTS:.; R3 => I/O PACKET FOR ATTACH/DETACH REQUEST; R5 => UCB FOR THE TERMINAL;A ; OUTPUTS:M!; R3 => I/O PACKET TO BE QUEUEDT(; R4 = REQUEST DEQUEUE BLOCKING FLAGS; $; REGISTERS MODIFIED: R0, R1, R2;-;T QPATT::J .IF DF S$$LIB< BITB #TF.AST,I.FCN(R3) ;ATTACH FOR UNSOLICITED INPUT AST? BEQ QPDET ;IF EQ NOO2 MOV I.PRM(R3),R2 ;GET ALL CHARACTER AST ADDRESS+ CALL $CALTA ;ADJUST FOR SUPER/USER MODEH$ MOV R2,I.PRM(R3) ;AND PUT IT BACK0 MOV I.PRM+4(R3),R2 ;GET CONTROL C AST ADDRESS+ CALL $CALTA ;ADJUST FOR SUPER/USER MODE& MOV R2,I.PRM+4(R3) ;AND PUT IT BACK .ENDC ;S$$LIB QPDET::ED MOV #S2.IRQ!S2.ORQ!S2.SRQ,R4 ;BLOCK REQUEST IF EITHER INPUT OR...5 ; ...OUTPUT ACTIVE AND MARK AS SPECIAL FUNCTIONT' JMP QUEUE ;QUEUE UP THE REQUEST NOWN.PAGE& .SBTTL . QPSPC - "SPECIAL" REQUESTS; ;+?; **-QPSPC - HANDLE "SPECIAL" REQUESTS (IO.GTS/SF.GMC/SF.SMC)M;I; THIS ROUTINE CHECKS PARAMETERS FOR THE "GET TERMINAL SUPPORT" AND THEAL; "GET/SET MULTIPLE CHARACTERISTICS" FUNCTIONS. THE USER BUFFER FOR THESEK; REQUESTS MUST BE WORD-ALIGNED. THE IO.GTS AND SF.GMC FUNCTIONS WILL BERN; PASSED TO "QUEUE" WITH NO DEQUEUE BLOCKING FLAGS SET. THIS ALLOWS THEM TOL; BE PROCESSED SYNCHRONOUSLY (NEVER QUEUED). AN SF.SMC FUNCTION MUST WAITI; FOR ACTIVE INPUT AND OUTPUT REQUESTS TO FINISH BEFORE BEING DEQUEUED.S;L ; INPUTS:$; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMINAL; ; OUTPUTS:T!; R3 => I/O PACKET TO BE QUEUEDH(; R4 = REQUEST DEQUEUE BLOCKING FLAGS;T$; REGISTERS MODIFIED: R0, R1, R2;-;G .IF DF T$$GTS!T$$GMC!T$$SMC QPSPC::E .IF DF T$$GTS!T$$GMCF9 CLR R4 ;ASSUME REQUEST IS IO.GTS OR SF.GMC - IF SO...(5 ; ...IT IS PROCESSED SYNCHRONOUSLY (NOT QUEUED)C .ENDC ;T$$GTS!T$$GMCS .IF DF T$$GTSG CMP I.FCN(R3),#IO.GTS ;IO.GTS? ;GET TERMINAL DRIVER SUPPORT REQUEST?5 .IF DF T$$GMC!T$$SMC 0 BEQ 20$ ;IF EQ, YES...CHECK BUFFER ALIGNMENT .IFF ;T$$GMC!T$$SMC9 BNE EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERROR .ENDC ;T$$GMC!T$$SMC$ .ENDC ;T$$GTS .IF DF T$$GMC? CMP I.FCN(R3),#SF.GMC ;GET MULTIPLE CHARACTERISTICS REQUEST?  .IF DF T$$SMC0 BEQ 20$ ;IF EQ, YES...CHECK BUFFER ALIGNMENT .IFF ;T$$SMC9 BNE EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERRORR .ENDC ;T$$SMC .ENDC ;T$$GMC .IF DF T$$SMC? CMP I.FCN(R3),#SF.SMC ;SET MULTIPLE CHARACTERISTICS REQUEST?!9 BNE EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERRORT+ MOV I.TCB(R3),R0 ;GET ISSUING TASK'S TCB. CMP T.UCB(R0),R5 ;IS THIS TERMINAL HIS TI:?* BEQ 10$ ;IF EQ, YES...REQUEST IS LEGAL1 BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED?2 BNE 10$ ;IF NE YES, OK7 JMP J2EQPR ;IF EQ, NO...CAN'T ALLOW US00|tt tfDATAER TO DO THISF10$:E MOV #S2.IRQ!S2.ORQ!S2.SRQ,R4 ;SF.SMC MUST BLOCK IF INPUT OR OUTPUT$6 ; ...IS ACTIVE. ALSO FLAG AS "SPECIAL" FUNCTION .ENDC ;T$$SMC20$: .IF DF A$$CHK, MOV I.PRM+2(R3),-(SP) ;GET BUFFER ADDRESS2 BIS I.PRM+4(R3),(SP) ;"OR" IN THE BUFFER LENGTH7 ROR (SP)+ ;IS EITHER THE ADDRESS OR THE LENGTH ODD? 1 BCC 30$ ;IF CC, BUFFER IS WORD-ALIGNED...SKIPS8 JMP EQPSPC ;RETURN ERROR FOR BUFFER NOT WORD-ALIGNED30$: .ENDC ;A$$CHK? JMP CKBFLN ;CHECK FOR VALID BUFFER LENGTH AND QUEUE REQUEST  .ENDC ;T$$GTS!T$$GMC!T$$SMC; O; EQPIFC - RETURN AN ERROR DUE TO ILLEGAL FUNCTION CODE OR INVALID MODIFIERS.;D% .IF DF T$$GTS!T$$GMC!T$$SMC!T$$EIO   EQPIFC::F  MOV #IE.IFC&377,R0 ;SET ERROR FOR ILLEGAL FUNCTION CODE OR MODIFIER=  JMP EQPFIN ;FINISH OFF THE REQUEST (RESTORE MAPPING ALSO)R % .ENDC ;T$$GTS!T$$GMC!T$$SMC!T$$EIOE.PAGER .PSECT MAP5" .SBTTL . QPHNG - HANGUP REQUEST;;+&; **-QPHNG - HANGUP REQUEST (IO.HNG);UQ; THIS ROUTINE CHECKS AN IO.HNG REQUEST. A NON-PRIVILEGED TASK CAN HANG ;SA460RT; UP ONLY ITS "TI:" LINE. PRIVILEGED TASKS CAN HANG UP ANY LINE. A HANGUP ;SA460U; REQUEST, LIKE AN IO.WBT OR GET CHARACTERISTICS, BREAKS THROUGH THE QUEUE. ;SA460O; ;**-3 ; INPUTS:$; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMINAL;M ; OUTPUTS:E!!; R3 => I/O PACKET TO BE QUEUED("; R4 = REQUEST DEQUEUE BLOCKING FLAGS#;$; REGISTERS MODIFIED: R0%;-&; 'QPHNG::S/' CALL PREQUE ;SET UP FOR QUEUEING ;TMS051G.' CLR R4 ;IO.HNG WAITS FOR NOTHING ;TMS051+' JMP QUEUE ;QUEUE THE REQUEST ;TMS051 ' ;TMS051 ' .IF DF T$$LTH ;TMS051A' ;TMS051TF' .SBTTL . QPORG - INITIATE A CONNECTION TO A TERMINAL SERVER ;TMS051'; ;TMS051';+ ;TMS051 6'; **-QPORG - ORIGINATE REQUEST (IO.ORG) ;TMS051'; ;TMS0518'; THIS ROUTINE CHECKS AN IO.ORG REQUEST. ;TMS051'; ;TMS051'; INPUTS: ;TMS0510'; R3 => I/O PACKET FOR THE REQUEST ;TMS051+'; R5 => UCB FOR THE TERMINAL ;TMS051E'; ;TMS051'; OUTPUTS: ;TMS051 .'; R3 => I/O PACKET TO BE QUEUED ;TMS0514'; R4 = REQUEST DEQUEUE BLOCKING FLAGS ;TMS051'; ;TMS051*'; REGISTERS MODIFIED: R0 ;TMS051';- ;TMS051O'; ;TMS051'QPORG:: ;TMS051/' CALL PREQUE ;SET UP FOR QUEUEING ;TMS051UH' MOV #S2.IRQ!S2.ORQ,R4 ;ORIGINATE MUST WAIT FOR READ AND WRITE ;TMS051+' JMP QUEUE ;QUEUE THE REQUEST ;TMS0511' ;TMS051H' .ENDC ;T$$LTH ;TMS051 ' ;TMS051T'PREQUE: ;TMS0514) MOV I.TCB(R3),R0 ;GET ISSUING TASK'S TCB ;**-1.* CMP T.UCB(R0),R5 ;IS THIS TERMINAL HIS TI:?,+ BEQ J2QUE ;IF EQ, YES...ALLOW THE HANGUP1, BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED? <- BEQ J2EQPR ;IF EQ, NO...RETURN PRIVILEGE VIOLATION ERROR.J2QUE:/ .IF DF M$$PRO0$1 MOV U.SCB(R5),R4 ;GET SCB ADDRESS12 BIT S.URM(R4),@$CPURM ;ALREADY ON CORRECT CPU?T32 BEQ 5$ ;IF EQ NO, FORK TO CORRECT CPU ; BM380C2 ; BM3805"2 .IFTF ; DF M$$PRO ; BM3802 ; BM380M2 RETURN ; BM380G2 ; BM380!2 .IFT ; DF M$$PRO ; BM380A2 ; BM380QH2; CONVERT PARAMETER LIST PART OF I/O PACKET INTO A FORK BLOCK ; BM380I2; (AND THE RETURN ADDRESS) FOR INTERPROCESSOR FORK. SINCE THIS ; BM380K2; IS A SUBROUTINE, WE MUST REMEMBER CALLER ADDRESS IN FORK BLOCK ; BM380S72; OR THE INTERPROCESSOR FORK DOES NOTHING. ; BM380F2; ; BM380F25$: ADD #I.PRM+14,R3 ;POINT PAST KISAR5 FIELD IN FORK BLOCK ; BM38042 MOV (SP)+,(R3) ;REMEMBER RETURN ADDRESS ; BM380D2 MOV KINAR5,-(R3) ;INSERT DRIVER I MAPPING IN KISAR5 FIELD ; BM380.: CLR -(R3) ;CLEAR R4 IN FORK BLOCK ;**-79; MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCKR0< MOV R3,R4 ;POINT R4 AT FORK BLOCK FOR $FORK1&= CALL $F00{ccccORK1 ;SWITCH TO CORRECT CPU9> SUB #I.PRM+4,R3 ;POINT BACK TO BEGINNING OF FORK BLOCKC? CALL MAPD ;RE-MAP DRIVER;? JMP @I.PRM+14(R3) ;DISPATCH TO ORIGINAL CALLER ; BM380AA ;**-1FB .ENDC ; DF M$$PROCFJ2EQPR: ;**-25F TST (SP)+ ;POP RETURN ADDRESS OFF STACK ;TMS060R0G JMP EQPPRI ;RETURN PRIVILEGE VIOLATION ERRORHI .ENDFORK BLOCK ;**-79; MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCKR0< MOV R3,R4 ;POINT R4 AT FORK BLOCK FOR $FORK1&= CALL $F .TITLE TTTBL7 .IDENT /06.01/ ; 8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ;  ; 08-MAY-78 PETER WANNHEDEN  ;O ; PREVIOUSLY MODIFIED BY:F;M; C. F. SPITZ ; D. R. DONCHINO ; T. LEKAS; S. C. ADAMS ;$; MODIFICATIONS:; ; S. C. ADAMS 3-JAN-86 6.00 7; SA452 -- ADD SUPPORT FOR USER-WRITTEN PORT DRIVER ;1"; K. L. FELDMANN 26-MAR-86 06.01A; KLF009 -- TEST FOR CONTROLLER ERROR BEFORE DEALLOCATING UCBX ;S#$ .PSECT MAP5%;R&;+3'; THIS MODULE CONTAINS THE DRIVER DISPATCH TABLE.EA(; IN A SYSTEM THAT SUPPORTS KERNEL DATA SPACE, THIS MODULE MUSTA)); BE BUILT INTO THE TASK IMAGE "TTDRV".FD*; THIS IS IN CONTRAST TO ALL OTHER DRIVER DATA, WHICH IS CONTAINEDC+; IN THE MODULE "TTDAT" AND IS BUILT INTO THE TASK IMAGE "TTCOM". ,;--;2.;D/; DRIVER DISPATCH TABLEP0;R1 .IF DF B$$MAP2=3 .IIF NDF,T$$SPC,.ERROR ;ASSUME THAT THERE IS NO SECONDARYE*4 ;POOL BUFFERS FOR BITMAP SYSTEMS.)5 ;FOR NOW THERE IS NO SUPPORT FORO"6 ;I/D SPACE BITMAP SYSTEMS728 .WORD R$OUTD ;OUTPUT COMPLETION ROUTINE FOR CT$9 .WORD G$IN ;INPUT ROUTINE FOR CT:; .ENDC ;B$$MAP<= .IF DF T$$SPC>9? .WORD NXTCMD ;ROUTINE TO PROCESS THE NEXT CLI COMMANDT@A .ENDC ;T$$SPCB/C .WORD DELTB0 ;ROUTINE TO DEALLOCATE BUFFERSV)D$TTTBL::.WORD TTINI ;REQUEST INITIATORE .WORD TTCAN ;CANCEL I/O >F .WORD $NLTMO ;TIME-OUT - USE SPECIAL NULL TIME-OUT ROUTINEGH .IF DF R$$CONI'J .WORD TTPWFL ;POWERFAIL ENTRY POINT .K .WORD TTKRB ;KRB STATUS CHANGE ENTRY POINT.L .WORD TTUCB ;UCB STATUS CHANGE ENTRY POINTMN .IFFOOP .WORD TTPWUP ;POWER-UPQR .IF DF B$$MAPS5T .WORD FORVMR,FORVMR ;VMR REQUIRES THAT THESE WORDSO%U ;BE HERE AND THAT THEY POINT TOO#V ;TO AN ADDRESS IN THE DRIVER.F#W ;THIS IS BECAUSE VMR DOES NOT X ;BELIEVE IN M-PLUS SYSTEMS&Y ;WITHOUT RECONFIGURATION SUPPORTZ[ .ENDC ;B$$MAP\]^ .ENDC_`a .IF DF R$$MPLbcMc .IIF DF B$$MAP .IRP X, ;SA452OWe ;**-1Ne .IIF NDF B$$MAP .IRP X, ;SA452Wg ;**-1 hi .IF IDN X,LHOjk .IF DF T$$LTHlm .ASCII /LH/n .WORD $LHDEVI o .WORD 0pLHCTBP::.WORD 0;qr .ENDC ; T$$LTHCsXs ;SA452Os .ENDC ; IDN X,LH ;SA452 Xs ;SA452Qs .IF IDN X,US ;SA452 Ps .IF DF T$$USP ;SA452Xs ;SA452Ps .ASCII /US/ ;SA452Os .WORD $USINP ;SA4525Os .WORD $USOUT ;SA452 Os .WORD 0 ;SA452 VsUSCTBP::.WORD 0 00 |tt tfDATA ;SA452Xs ;SA452Os .ENDC ; T$$USP ;SA452 Os .ENDC ; IDN X,US ;SA452;Xs ;SA452Is .IF DIF X,LH ;SA452AIs .IF DIF X,US ;SA452 Xs ;SA452Wu ;**-1 v .IF DF D$$'X'11wx .ASCII /Y'X'/yz .IF IDN X,M{| .WORD $DM11B;}~ .IFF  .WORD $Y'X'INP  .WORD $Y'X'OUT  .ENDC .WORD 0 .IF IDN X,M .IF NDF T$$COM  YMCP1::  .ENDC ;NDF T$$COM .ENDC ;IDN X,M Y'X'CTBP::.WORD 0  .ENDCO .ENDC ; DIF X,US ;SA452 O .ENDC ; DIF X,LH ;SA452 X ;SA452W ;**-1 .ENDR $TTTBE::.WORD 0 ;END OF TABLE;$; .IF DF T$$COM+; POINTER TO PCB FOR COMMON BLOCK "TTCOM";T*$TTCOM::.BLKW 1 ;TO BE FILLED IN BY VMR/ ;CLEARED BY DRIVER INITIALIZATION ROUTINE  .ENDC ;T$$COM .IFF ;R$$MPL 7$NLTMO::CLR S$$SPC+2(SP) ;FORCE $SCDVT ON TO NEXT DCB 8 INCB S.CTM(R4) ;RESET TIMEOUT COUNT FOR THE NEXT TIME RETURN ;  .ENDC ;R$$MPL .IF DF R$$CON9TTPWFL::MOV KINAR6,-(SP) ;SAVE KERNEL INSTRUCTION APR 6% BCC 20$ ;BRANCH ON UNIT POWERFAIL7 MOV #CT.CPW,R4 ;GET CONTROLLER POWERFAIL OFFSET CODER0 BR TTDSP ;GO TO COMMON CONTROLLER DISPATCHER620$: ADD #U.TSTA,R5 ;POINT TO UCB STATUS TRIPLE-WORD .IF DF T$$ACD8 TST U.ACB-U.TSTA(R5) ;DOES THIS TERMINAL HAVE AN ACD? BEQ 30$ ;N - JUMPD, MOV #A.POWE,R0 ;SET POWERFAIL ENTRY POINT CALL $SWACD ;CALL ACDI .ENDC ;T$$ACD530$: MOV #CT.UPW,R2 ;GET UNIT POWERFAIL OFFSET CODE * BR TTCRD ;GO TO UNIT DEPENDENT ROUTINE9TTKRB:: MOV KINAR6,-(SP) ;SAVE KERNEL INSTRUCTION APR 6T) BCS 20$ ;BRANCH IF CONTROLLER OFFLINET .IF DF T$$COM% TST $TTCOM ;GET TTCOM PCB ADDRESSP' BEQ 10$ ;ALREADY INITIALIZED - JUMPF .IFF ;T$$COMT" TST $DALED ;GET KISAR6 MAPPING' BNE 10$ ;ALREADY INITIALIZED - JUMPV .ENDC ;T$$COM MOV R2,-(SP) ;SAVE R2% CALL TTINIT ;INITIALIZE THE WORLD MOV (SP)+,R2 ;RESTORE R2U810$: MOV #CT.CON,R4 ;GET CONTROLLER ONLINE OFFSET CODE0 BR TTDSP ;GO TO COMMON CONTROLLER DISPATCHER920$: MOV #CT.COF,R4 ;GET CONTROLLER OFFLINE OFFSET CODEE0 BR TTDSP ;GO TO COMMON CONTROLLER DISPATCHER9TTUCB:: MOV KINAR6,-(SP) ;SAVE KERNEL INSTRUCTION APR 6J/ BCS 10$ ;BRANCH IF WANT TO SET UNIT OFFLINEE1 ADD #U.TSTA,R5 ;POINT TO UCB STATUS TRIPLEWORD- CALL MAPD ;MAP DATA AREA .IF DF T$$SPL- CALL ALUCBX ;ALLOCATE A UCBX FOR THIS UCBM/ BCS TTRET1 ;RETURN WITH CC-C SET IF FAILUREG .IFF ;T$$SPLO7 CALL CKTAB ;ALLOCATE TYPE-AHEAD BUFFER IF NECESSARY .IFTF ;T$$SPL .IF DF T$$MOD' BICB #US.CRW!US.DSB,U.STS-U.TSTA(R5)N ;ASSUME LOCAL LINE .ENDC4 MOV #CT.UON,R2 ;SET ROUTINE INDEX FOR UNIT ONLINE5 BR TTCRD ;GO TO UNIT DEPENDENT ROUTINE DISPATCHERP<10$: CLRB U.TMTI(R5) ;PREVENT MODEM TIMEOUT FROM OCCURRING& ADD #U.TSTA,R5 ;ADVANCE UCB POINTERJ MOV #CT.UOF,R2 ;SET ROUTINE INDEX FOR UNIT OFFLINE ; KLF009L MOV KISAR6,-(SP) ;SAVE CURRNT APR 6 MAPPING ; KLF009F CALL MAPD ;MAP DRIVER DATA AREA ; KLF009F CALL CT00{ccccRD ;CALL UNIT DEPENDENT ROUTINE ; KLF009Z ; KLF009 .IFT ;T$$SPLH TSTB $SCERR ;CHECK FOR ERROR IN UNIT DEPENDENT ROUTINE ; KLF009F BMI TTRET ;IF MI, ERROR - DON'T DEALLOCATE UCBX ; KLF009. CALL DEUCBX ;DEALLOCATE THE UCBX AND TABUF .IFTF ;T$$SPLF BR TTRET ;GO TO COMMON RETURN CODE ; KLF009W ;**-2 5TTDSP: MOV KISAR6,-(SP) ;SAVE CURRENT APR 6 MAPPING # CALL MAPD ;MAP DRIVER DATA AREA  MOV @R2,R3 ;GET CSRT) MOVB K.PRM(R2),R1 ;GET CONTROLLER TYPER. ADD CTBL(R1),R4 ;GET DISPATCH TABLE POINTER2 CALL @(R4)+ ;CALL CONTROLLER DEPENDENT ROUTINE& BR TTRET ;GO TO COMMON RETURN CODE5TTCRD: MOV KISAR6,-(SP) ;SAVE CURRENT APR 6 MAPPINGT# CALL MAPD ;MAP DRIVER DATA AREA *  CALL CTRD ;CALL UNIT DEPENDENT ROUTINE6 TTRET: MOV (SP)+,KISAR6 ;RESTORE ENTRY APR 6 MAPPING< TTRET1: MOV (SP)+,KINAR6 ;RESTORE KERNEL INSTRUCTION APR 6  RETURNL  .IFT ;T$$SPLA  .ENABL LSB2;;;+;I; ALUCBX - ALLOCATE A UCB EXTENSION (UCBX) AND TYPEAHEAD BUFFER (TABUF)T8; STUCBX - SET UP A UCB EXTENSION AND TYPEAHEAD BUFFER;E ; INPUT:@; R0 APR BIAS OF 1ST SECONDARY POOL BLOCK (IF ENTRY AT STUCBX); R5 POINTER TO U.TSTA; ; OUTPUT:I; IF SUCCESS: ; CC-C 0K; UCBX AND CONTIGUOUS TABUF ALLOCATED FROM SECONDARY POOL AND INITIALIZEDM;G ; IF FAILURE:S !; CC-C 1J"; IE.ALC RETURNED IN $SCERR TO INDICATE FAILURE TO BRING TERMINAL ONLINE#; $;-%;@&ALUCBX: CALL 20$ ;GET NUMBER OF SECONDARY POOL NODES REQUIRED7' CALL $ALSEC ;ALLOCATE THEM FOR USE BY THIS TERMINAL )( BCS 10$ ;BRANCH ON ALLOCATION FAILURE I)STUCBX::MOV R0,U.TAPR-U.TSTA(R5) ;THESE NODES BECOME THE UCBX AND TABUFR** MOV R0,@#KDSAR5 ;MAP THE UCBX AND TABUF,+ MOV #120000,R4 ;SET THEIR VIRTUAL ADDRESS, ASSUME U.TCI,0C%- CLR @R4 ;NO CURRENT INPUT REQUEST +. CLR U.TCO(R4) ;NO CURRENT OUTPUT REQUEST -/ CLRB U.TISV(R4) ;INITIALIZE STATE VARIABLE 0 ASSUME U.TITI&1,01 ASSUME U.TOTI,U.TITI+1T02 CLR U.TITI(R4) ;CLEAR INPUT AND OUTPUT TIMERS@3 CLR U.TFPB(R4) ;CLEAR PROMPT BUF ADDRS/UNSOLICITED INPUT FLAG&4 CLR U.TRTT(R4) ;NO TERMINATOR TABLE56 .IF DF T$$EIO7;8 CLR U.TDIF(R4) ;CLEAR FIRST DEFAULT INPUT BUFFER POINTER 9: .ENDC ;T$$EIO;<;0=,> .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB?9@ ADD #U.TAST,R4 ;POINT TO UNSOLICITED INPUT ACB ADDRESSO/AX = U.TAST ;SYMBOL NEEDED FOR ASSUME MACROSTBC .IF DF T$$CCAD6E CLR (R4)+ ;CLEAR ACB POINTER FOR UNSOLICITED INPUT FX = X + 2EGH .ENDC ;T$$CCAIJ .IF DF T$$SCAKL ASSUME U.TSCA,X MX = X + 2 1N CLR (R4)+ ;CLEAR SWITCH CHARACTER ACB POINTEROP .ENDC ;T$$SCAQR .IF DF T$$MHUST ASSUME U.TMHA,X UX = X + 2NV-W CLR (R4)+ ;CLEAR MODEM HANGUP ACB POINTER XY .ENDC ;T$$MHUZ[ .IF DF T$$ICS\] ASSUME U.TICA,X ^X = X + 2N(_ CLR (R4)+ ;CLEAR ICS ACB/TEP POINTER`a .ENDC ;T$$ICSbc .IF DF T$$OOBde ASSUME U.TOBA,X fX = X + 2T(g CLR (R4)+ ;CLEAR OOB ACB/TEP POINTERhi .ENDC ;T$$OOBj,k .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOBlm ASSUME U.TTBF,Xn o CLR (R4)+ ;INITIALIZE HEADER2p CLRB (R4)+ ;RESET ACTIVE COUNT AND CLEAR CARRY1q MOVB U.TBSZ-U.TSTA(R5),(R4) ;SET SIZE OF TABUFR r RETURNU5s10$: MOVB #IE.ALC,$SCERR ;INDICATE CAUSE OF FAILUREI"t RETURN ;RETURN WITH CARRY SETu;v;+w;+*x; DEUCBX - DEALLOCATE THE UCBX AND TABUFy;S z; INPUT:{; R5 POINTER TO U.TSTA|;A }; OUTPUT: 2~; UCB EXTENSION AND TYPEAHEAD BUFFER DEALLOCATED;-;OADEUCBX::MOV U.TAPR-U.TSTA(R5),R0 ;GET ADDRESS OF UCBX AND TABUF ' CLR U.TAPR-U.TSTA(R5) ;CLEAR POINTERE4 CALL 20$ ;GET THE NUMBER OF BLOCKS TO DEALLOCATE: CALLR $DESEC ;DEALLOCATE THE UCBX AND TABUF AND RETURN;UI; CALCULATE THE NUMBER OF SECONDARY POOL BLOCK00|tt tfDATAS REQUIRED TO CONTAIN THERL; UCB EXTENSION AND A TYPEAHEAD BUFFER WHOSE SIZE IS KEPT IN OFFSET U.TBSZ;S,20$: CLR R1 ;PREVENT UNWANTED SIGN EXTENDG BISB U.TBSZ-U.TSTA(R5),R1 ;GET THE SIZE OF THE TABUF LESS ITS HEADER@ ADD #T$$UXL+4+77,R1 ;INCLUDE TABUF HEADER, UCBX, AND ROUND UP= ASH #-6,R1 ;CONVERT TO NUMBER OF SEC POOL BLOCKS REQUIREDE% RETURN ;RETURN WITH RESULT IN R1  .DSABL LSBL .ENDC ;T$$SPL .ENDC ;R$$CON .IF DF T$$SER;O;+;B); NXTCMD - PROCESS THE NEXT CLI COMMANDE; ; INPUT:; R0 UCB ADDRESS;K ; OUTPUT: E; THE COMMAND IN PROGRESS BIT (UM.CMD) IS CLEARED AND AN ATTEMPT ISBE; MADE TO PROCESS CHARACTERS FROM THE TYPEAHEAD BUFFER. FOR MULTI-$D; PROCESSOR SYSTEMS, IF WE ARE NOT ON THE CORRECT CPU, FORK TO GETG; THERE WITH A NULL FORK REQUEST, SINCE AFTER FORK PROCESSING WE WILLH>; TRY TO PROCESS CHARACTERS FROM THE TYPEAHEAD BUFFER ANYWAY;-;C$NXTCMD: CALL MAPD ;MAP THE DRIVER SAVNR ;SAVE R4 AND R5" MOV R0,R5 ;GET THE UCB ADDRESS" ADD #U.TSTA,R5 ;POINT TO U.TSTA> BIC #UM.CMD,U.MUP-U.TSTA(R5) ;ENABLE CLI COMMAND PROCESSING .IF DF M$$PRO! CLR R3 ;SET NULL FORK REQUESTY5 CALL SWCPU ;SWITCH TO THE CORRECT CPU (NO RETURN) / ;OR FALL THRU IF ALREADY ON THE RIGHT CPUH .ENDC ;M$$PRO# CALL LOCKI ;LOCK OUT INTERRUPTSL: CALLR SERPRO ;;;SERIALLY PROCESS CHARACTERS FROM TABUF .ENDC ;T$$SER .IF DF B$$MAP!R$$PROR+NXTCMD:: ;THIS SHOULD NOT BE CALLED FORT ;P/OS SYSTEMSD0FORVMR: CRASH ;THIS NEEDS TO BE HERE FOR VMR# ;THIS IS BECAUSE VMR DOES NOTS  ;BELIEVE IN M-PLUS SYSTEMS& ;WITHOUT RECONFIGURATION SUPPORT .ENDC ;B$$MAP!R$$PROC; ;N .END ;OR FALL THRU IF ALREADY ON THE RIGHT CPUH .ENDC ;M$$PRO# CALL LOCKI ;LOCK OUT INTERRUPTSL: CALLR SERPRO ;;;SERIALLY PROCESS CHARACTERS FROM TABUF .ENDC ;T$$SER .IF DF B$$MAP!R$$PROR+NXTC .TITLE TTCT .IDENT /02.01/E;; COPYRIGHT (c) 1984 BY(; DIGITAL EQUIPMENT CORPORATION, MAYNARD'; MASSACHUSETTS. ALL RIGHTS RESERVED.E;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED.A; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSELA; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISRA; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORA; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND1; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED.1;A; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTAA; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;SA; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFM<; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;R;T;O; 3-JUL-82 TONY LEKASE;R; MODIFICATIONS:;H(; WMG029 2-MAR-83 WILLIAM M. GERACI/; ADD ERROR PASSING CAPABILITY FOR TFW TO PASST; ERROR STATUS TO TTDRV (P/OS)R;S; S. C. ADAMS 2-MAY-84 02.01*; SA170 -- SUPPORT CHANGES TO STATUS BITS;C;G;+4; CONTROLLER-DEPENDENT ROUTINES FOR CT VIDEO DISPLAY;-;  .IF DF B$$MAP .PSECT MAP5;.;+; YCSTAX - START OUTPUT.;S; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; ; R2 PHYSICAL UNIT NUMBER * 2T#; (ONLY IF MULTIPLEXERS IN SYSTEM)O; R3 CSR ADDRESS; R4 UCBX ADDRESS-; R5 POINTER TO U.TSTA;D; U.TOP BUFFER LIST POINTER; U.TOC BYTE COUNTR;A; NOTE:;; THE VIDEO TASK SHOULD DECREMENT T.OREM AS DATA IS REMOVEDP8; FROM THE BUFFERS. THE COUNT IN THE SECOND STATUS WORD:; THAT IS RETURNED TO THE USER IS THE ORIGINAL COUNT MINUS ; T.OREM. ;5*; Intermediate input and output buffer. - ;:!; byte contentsN-; ------------------------------------N@; 0-1 link to next buffer (0 if this is last).; 2 logical buffer length!; 3 reserved; 4-47 dataT;00"{cccc;H; NOTE:A;S,; THE OUTPUT TIMER IS BEING CLEARED BECAUSE-; SOME OUTPUT TO THE VIDEO TASK, FOR EXAMPLEU; GIDIS, MAY TAKE A LONG TIME. ;-; 3YCSTAX::CALL MAPD ;SETTUP TERMINAL DRIVER MAPPINGe% CLRB U.TOTI(R4) ;CLEAR OUTPUT TIMER !; COMPUTE THE TOTAL TRANSFER SIZE-: MOV U.TTOC(R4),T.OREM ;GET THE NUMBER OF BYTES IN THE XFR% ;THAT ARE NOT CURRENTLY BUFFERED)6 ADD U.TOC(R4),T.OREM ;ADD IN THE AMOUNT FOR THE FIRST# ;BUFFER OR FOR THE ECHO BUFFER # TST U.TCO(R4) ;BUFFER CHAIN USED?E$ BEQ 10$ ;IF EQ NO - COPY THE DATA: MOV U.TOP(R4),T.OPKP ;MOV THE BUFFER LIST ADDRESS FOR TFW7; NOW WE ADD IN THE COUNTS FOR THE EXTRA BUFFERS IF ANYL0; THIS CODE DEPENDS ON THE MAXIMUM BUFFER LENGTH; BEING LESS THAN 128.4 MOV T.OPKP,R1 ;GET THE ADDRESS OF THE FIRST BUFFER.5$: MOVB U.TDYP(R4),3(R1) ;STORE THE DATA TYPE2 MOV (R1),R1 ;GET THE POINTER TO THE NEXT BUFFER/ BEQ REQEST ;IF EQ NO MORE - REQUEST THE TASK & MOVB 2(R1),R0 ;GET THE BUFFER LENGTH$ ADD R0,T.OREM ;ADD IT TO THE COUNT BR 5$ ;TRY FOR SOME MOREA0; COPY THE SINGLE BUFFER INTO A BUFFER IN TFWCOM=10$: MOV #T.TBUF,T.OPKP ;MOV THE BUFFER LIST ADDRESS FOR TFW + MOV U.TOC(R4),R1 ;GET THE CHARACTER COUNTF2 MOVB R1,T.TBUF+2 ;PUT THE LENGTH INTO THE BUFFER9 MOV #T.TBUF+4,R0 ;POINT TO DATA AREA OF THE TEMP BUFFER,3 MOV U.TOP+2(R4),R3 ;GET THE SOURCE BUFFER ADDRESSO#20$: MOVB (R3)+,(R0)+ ;MOVE A BYTE  SOB R1,20$ ;DO THEM ALL BR REQEST ;REQUEST THE TASK;F;+; YCABOX - ABORT OUTPUT.;I; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;T; NOTE:,; THE VIDEO TASK MUST NOT USE ANY CHARACTERS+; FROM THE BUFFER AFTER TF.ABO HAS BEEN SET)0; BECAUSE THE BUFFER WILL HAVE BEEN DEALLOCATED.;U4; GET THE CHARACTER(S) AND THEN TEST THE BIT. IF IT$; IS SET DO NOT USE THE CHARACTER(S);-;P3YCABOX::CALL MAPD ;SETTUP TERMINAL DRIVER MAPPINGR' BIS #TF.ABO,T.FLAG ;SET THE ABORT BITD' CLR T.OPKP ;CLEAR THE BUFFER POINTERK" BR REQEST ;AND REQUEST THE TASK;;+!; YCSTOX - STOP (SUSPEND) OUTPUT.R;N; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-;R3YCSTOX::CALL MAPD ;SETTUP TERMINAL DRIVER MAPPING ) BIS #TF.SPN,T.FLAG ;SET THE SUSPEND BITE" BR REQEST ;AND REQUEST THE TASK;T;+; YCRESX - RESUME OUTPUT.O;S; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-;N3YCRESX::CALL MAPD ;SETTUP TERMINAL DRIVER MAPPINGK+ BIC #TF.SPN,T.FLAG ;CLEAR THE SUSPEND BIT;" BR REQEST ;AND REQUEST THE TASK;S;+; YCPWUP - POWER-UP.; ; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-; .IF DF R$$CONYCCONL::,YCCPUP::RETURN ;ONLY INIT FOR UNIT ONLINEYCUONL::YCUPUP:: .IFFEYCPWUP:: .ENDC ;R$$CON, CALL MAPD ;SETTUP TERMINAL DRIVER MAPPING$ TST # ;32 WORD ALIGNED? BEQ 5$ ;IF EQ YES - OK- CRASH ;OOOPS65$: MOV #VT.NAM,R3 ;GET THE ADDRESS OF THE TASKS NAME) CALL $SRSTD ;GET THE TASKS TCB ADDRESS  BCC 10$ ;BRANCH IF NO ERRORS+ CRASH ;TASK NOT INSTALLEDN)10$: MOV R0,VT.TCB ;SAVE THE TCB ADDRESSL= MOV #</64.>,VT.APR ;TFWCOM'S OFFSET IN TTDRVP7 ADD @#KISAR5,VT.APR ;COMPUTE TFWCOMS PHYSICAL ADDRESSP2 MOV #TFWPAR,R3 ;GET THE ADDRESS OF TFWCOM'S NAME. CALL $SRNAM ;GET THE PARTITIONS PCB ADDRESS BCC 20$ ;IF CC OK CRASH ;PARTITION NOT AROUNDO?20$: MOV VT.APR,P.REL(R2) ;FILL IN BASE ADDR IN 32. WORD BLOCKSH7 MOV #</64.>,P.BLKS(R2) ;AND THE LENGTH, BIS #TF.INT,T.FLAG ;SET THE INITIALIZE BIT5REQEST: MOV VT.TCB,R0 ;SETTUP THE TASK'S TCB ADDRESSS! CALLR $EXRQN ;REQUEST THE TASKT; ;+; G$IN - DRIVER INPUT ROUTINEK;R:; THIS ROUTINE IS CALLED IN SYSTEM STATE BY THE VIDEO TASK9; TO INFORM THE DRIVER THAT THERE IS INPUT WAITING IN THEH; INPUT BUFFER.A;E; REGISTERS MODIFIED:K; ALL;-;R;N@; DEFINE THE KEY MATRIX CODES FOR INTERRUPT AND DO HERE FOR NOW.@; THESE DEFINITIONS SHOULD BE PROVIDED BY THE TERMINAL TASK CODE!; SINCE 00*|tt tfDATATHEY ARE "DEFINED" BY IT.H;N(K.INT = 144 ;MATRIX CODE FOR INTERRUPT K.DO = 175 ;MATRIX CODE FOR DO2G$IN:: MTPS #TTPRI ;LOCK OUT TERMINAL INTERRUPTS/ CLR R4 ;;;INDICATE THAT THIS IS CONTROLLER 0 3 TTSET$ YC ;;;CALL TTSET SETTUP FOR POSSIBLE FORKR/ MOV #.TTCT+U.TSTA,R5 ;;;SETTUP FOR ICHAR1 CALLF* MOV #T.INBF,R0 ;;;GET THE BUFFER ADDRESS% ;;;ASSUME THE TYPE BYTE IS FIRST $ MOVB (R0)+,R2 ;;;GET THE DATA TYPE$ CMP #T.RSDN,R2 ;;;LEGAL DATA TYPE?, BHIS 5$ ;;;IF HIS YES - PROCESS THE INPUT CRASH ;;;BAD DATA TYPE 5$: ASL R2 ;;;MAKE IT AN INDEX* MOV R2,DTYPE ;;;SAVE THE DATA TYPE INDEX& ;;;ASSUME THAT THE LENGTH IS NEXT.10$: MOVB (R0)+,R1 ;;;GET THE CHARACTER COUNT( BEQ 50$ ;;;IF EQ NO CHARACTERS - EXIT .IF DF T$$IDO TST R2 ;;;DATA TYPE ZERO?. BNE 15$ ;;;NE NO - CAN'T BE INTERRUPT OR DO$ CMPB #K.INT,(R0) ;;;INTERRUPT KEY?% BEQ 100$ ;;;EQ YES - GO PROCESS ITT CMPB #K.DO,(R0) ;;;DO KEY?% BEQ 100$ ;;;EQ YES - GO PROCESS ITF) BR 15$ ;;;AND GO PROCESS THE CHARACTERB;DA; WE HAVE AN INTERRUPT OR DO KEY. IF THIS TERMINAL IS NOT IN RPAT=; MODE THEN CONVERT THE INTERRUPT-DO SEQUENCE TO A CONTROL-C.0;M100$:)% BIT #S1.PTH,(R5) ;;;READ-PASS-THRU?51 BNE 15$ ;;;NE YES - PROCESS CHARACTER IS USUALO CMPB #K.DO,(R0) ;;;DO KEY?' BEQ 110$ ;;;EQ YES - GO DEAL WITH ITT, INC IDOFLG ;;;SET THE INTERRUPT SEEN FLAG( BR 50$ ;;;AND EXIT DISCARDING THE KEY,110$: TST IDOFLG ;;;WAS INTERRUPT PRESSED?1 BEQ 15$ ;;;EQ NO - GO PROCESS DO AS NORMAL KEY ) CLR IDOFLG ;;;CLEAR THE INTERRUPT FLAGO2 MOV #CH.CTC,R2 ;;;CONVERT INTERRUPT-DO TO CTRL-C CALLR ICHAR1 ;;;PROCESSES IT  .ENDC ;T$$IDO-15$: CLR IDOFLG ;;;CLEAR THE INTERRUPT FLAG5. ;;;ASSUME THAT TYPE SPECIFIC DATA IS NEXT& ;;;ASSUME THAT IT IS WORD ALIGNED0 TST (R0)+ ;;;PASS OVER THE TYPE SPECIFIC INFO;SA; IF WE HAVE A MULTI CHARACTER INPUT SEQUENCE FOR DATA TYPE ZERO,YE; (I.E. A CONTROL OR ESCAPE SEQUENCE), MAKE SURE THAT THERE IS ENOUGH C; ROOM IN THE TYPEAHEAD BUFFER FOR IT. IF THERE IS NOT ENOUGH ROOMA.; THEN DISCARD THE CHARACTERS AND ECHO A BELL.;L# CMP #1,R1 ;;;ONLY ONE CHARACTER?% BEQ 20$ ;;;EQ YES - GO PRECESS IT.; TST DTYPE ;;;DATA TYPE 0?$ BNE 20$ ;;;NE NO - GO PROCESS IT. .IF DF T$$SPL$ MOV #120000+U.TTBF,R3 ;;;GET TABUF .IFF ;T$$SPL & MOV U.TTAB-U.TSTA(R5),R3 ;;;GET TABUF- BEQ 20$ ;;;NONE - GO PROCESS THE CHARACTER $ BIT #1,R3 ;;;SINGLE-CHAR. BUFFER?% BNE 20$ ;;;Y - GO PROCESS THE CHAR  .ENDC ;T$$SPL+ MOVB 2(R3),R3 ;;;GET CURRENT ACTIVE COUNTR0 ADD R1,R3 ;;;ACTIVE COUNT INCLUDING NEW CHARS+ CMPB R3,#T$$BFL-4 ;;;TOO MANY CHARACTERS?. BLOS 20$ ;;;LOS NO - PROECSS THE CHARACTERS1 CALLR BELL ;;;ECHO A BELL AND DISCARD THE CHARE ;;;NOW COMES THE DATA120$: CLR R2 ;;;PREPARE R0 (STATUS MUST BE ZERO) " BISB (R0)+,R2 ;;;GET A CHARACTER MOV R0,-(SP) ;;;SAVE R0- MOV R1,-(SP) ;;;AND R1 TST DTYPE ;;;DATA TYPE 0?, BEQ 30$ ;;;IF EQ YES - HANDLE NORMAL TEXT* CALL IRSD1 ;;;HANDLE SPECIAL DATA INPUT BR 40$ ;;;GO GET THE NEXT ONE+30$: CALL ICHAR1 ;;;DO COMMON INPUT PROC.P 40$: MOV (SP)+,R1 ;;;RESTORE R1 MOV (SP)+,R0 ;;;AND R0 SOB R1,20$ ;;;LOOP TILL DONEL50$: RETURN ;AND EXIT;S;+5; IRSD1 - INPUT CHARACTER PROCESSING FOR SPECIAL DATA ;P.; THIS ROUTINE IS CALLED FOR EACH SPECIAL DATA/; INPUT CHARACTER. THIS ROUTINE DOES BASICALLY&; THE SAME THING AS ICHAR1 EXCEPT THAT-; IT WILL PUT THE DATA IN A SPECIAL TYPEAHEADE/; BUFFER UNLESS THERE IS AN IO.RSD OUTSTANDING.A/; IT IS SIMPLER AND PROBABLY SHORTER TO DO THISL; SEPARATLY HERE.M; ; INPUTS:P ; R2 BYTE(; R5 POINTER TO U.TSTA3; DTYPE DATA PATH SPECIFIER 1 < DTYPE < 2*T.RSDN+1D;L ; OUTPUTS:2; ANY OF THE FOLLOWING ACTIONS IS TAKEN, DEPENDENT; ON LINE STATUS.I;D0; 1. BYTE IS STORED IN THE APPROPRIATE DATA TYPE; SPECIFIC TYPEAHEAD BUFFER.S;U,; 2. BYTE IS STORED IN THE INPUT BUFFER OF A; PENDING IO.RSD.;L5; 3. BYTE IS IGNORED IF THE TYPEAHEAD BUFFER IS FULL. ,; A002{ccccT A LATER TIME SUPPORT COULD BE ADDED TO&; RETURN AN ERROR FOR THIS SITUATION.;A; REGISTERS ALTERED: R2,R3,R4 ;-;(-IRSD1: MOV DTYPE,R3 ;;;GET THE TABUF ADDRESSF MOV T.RSDT(R3),R3 ;;;+# TSTB 2(R3) ;;;ANYTHING BUFFERED?O! BNE 100$ ;;;Y - BUFFER THIS TO + CALL RSDPRC ;;;CAN WE PROCESS THIS BYTE?T BCS 100$ ;;;NO - GO STORE ITI CALLR ICHAR2 ;;;GO PROCESS IT5; PUT THE CHARACTER INTO THE CORRECT TYPEAHEAD BUFFER.1100$: MOVB (R3)+,R4 ;;;GET OFFSET WHERE TO STORE  INC R3 ;;;SKIP OVER 1 BYTEO" CMPB (R3)+,(R3)+ ;;;BUFFER FULL?' BEQ 200$ ;;;Y - IGNORE THE CHARACTER ( ADD R3,R4 ;;;MAKE POINTER INTO BUFFER" MOVB R2,(R4) ;;;STORE CHARACTER( INC -(R3) ;;;INCREMENT ACTIVE COUNTER$ INC -(R3) ;;;UPDATE STORE POINTER! CMPB (R3),3(R3) ;;;WRAP-AROUND?; BNE 200$ ;;;N - JUMPE2 CLRB (R3) ;;;Y - SET POINTER AT START OF BUFFER200$: RETURN ;;;RETURN ;H;+A; RSDPRC - DETERMINE WHETHER A SPECIAL DATA BYTE CAN BE PROCESSEDE;F; INPUT:; R5 POINTER TO U.TSTA;I ; OUTPUT:T$; IF CHARACTER CAN BE PROCESSED NOW:; R4 I/O PAKET ADDRESS; CC-C 0;C(; IF CHARACTER CAN NOT BE PROCESSED NOW:; CC-C 1;2; REGISTERS ALTERED: R4R;-;-=RSDPRC::BIT #S1.DSI!S1.USI,(R5) ;;;INPUT PROCESSING DISABLED?P& ;;;OR UNSOLICITED INP INPROGRESS?# BNE 10$ ;;;Y - CAN'T PROCESS NOWR ASSUME S1.IBY,200 TSTB (R5) ;;;INPUT BUSY? # BPL 10$ ;;;N - CAN'T PROCESS NOWP$ MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX, BEQ 10$ ;;;NONE - CAN'T PROCESS IT (COULD& ;;;HAPPEN FOR EXAMPLE WHEN CTRL-C( ;;;IS TYPED ON AN IDLE SLAVED TERM) ASSUME U.TCI,00$ MOV (R4),R4 ;;;GET PACKET ADDRESS1 CMPB #IO.RSD/400,I.FCN+1(R4) ;;;IS IT AN IO.RSD?-# BNE 10$ ;;;N - CAN'T PROCESS NOW5. TST (PC)+ ;;;RETURN CARRY CLEAR, PROCESS IT10$: SEC ;;;RETURN CARRY SET  RETURN ;;;RETURN;;+; R$OUTD - OUTPUT DONE ROUTINE;U:; THIS ROUTINE IS CALLED IN SYSTEM STATE BY THE VIDEO TASK=; TO INFORM THE DRIVER THAT THE TASK IS DONE WITH THE CURRENTI; OUTPUT BUFFERS;P; REGISTERS MODIFIED:L; ALL;-;T> .IIF DF,T$$SPL,.ERROR ;THIS CODE ASSUMES UCBX IN PRIMARY POOL ;OR PRIVATE BUFFER POOL3R$OUTD::MTPS #TTPRI ;LOCK OUT TERMINAL INTERRUPTS;/ CLR R4 ;;;INDICATE THAT THIS IS CONTROLLER 0C3 TTSET$ YC ;;;CALL TTSET SETTUP FOR POSSIBLE FORKE) CLR T.OPKP ;;;CLEAR THE BUFFER POINTERD@ BIC #,T.FLAG ;;;CLEAR THE ABORT AND SUSPEND BITS. MOV #.TTCT+U.TSTA,R5 ;;;SETTUP FOR ODONE CALL, MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX ADDRESS8 MOV T.OREM,U.TTOC(R4) ;;;RESTORE BYTES TRANSFERED COUNT/ CLR U.TOC(R4) ;;;SHOW CURRENT BUFFER ALL DONER6 MOV T.STAT,@U.TCO(R4) ;;;GET PACKET COMPLETION STATUS2 CALLR ODONE ;;;FINISH OFF THE OUTPUT AND RETURN;D;+); CTICK - TIMER ROUTINE FOR CT VIDEO TASK;;A3; THIS ROUTINE IS CALLED ONCE EVERY CT$TIC TICKS TOC.; PROVIDE TIMER SERVICES FOR THE CT VIDEO TASK;L ; INPUTS: ; NONE;N ; OUTPUTS:4; THE THREE CT TIMERS ARE CHECKED AND THE VIDEO TASK; IS NOTIFIED IF THEY RUN OUTC;-;E3CTICK:: CALL MAPD ;SETTUP TERMINAL DRIVER MAPPINGC% CLR -(SP) ;GET A WORD ON THE STACKU" TST T.BTMR ;BLINK TIMER ACTIVE?) BEQ 10$ ;IF EQ NO - TRY THE NEXT TIMERO" DEC T.BTMR ;DECREMENT THE TIMER$ BNE 10$ ;IF NE, NOT TIMED OUT YET, BIS #TF.BTM,(SP) ;SET THE BLINK TIMER FLAG'10$: TST T.CTMR ;CURSOR TIMER ACTIVE? ) BEQ 20$ ;IF EQ NO - TRY THE NEXT TIMER " DEC T.CTMR ;DECREMENT THE TIMER$ BNE 20$ ;IF NE, NOT TIMED OUT YET- BIS #TF.CTM,(SP) ;SET THE CURSOR TIMER FLAG-+; T.STMR IS MAINTAINED IN SECONDS, NOT TICSI-20$: TST T.STMR ;SCREEN BLANK TIMER ACTIVE?C BEQ 30$ ;IF EQ NO - FINISH UP, DEC STIMER ;SCREEN TICS COUNTER FINISHED? BPL 30$ ;IF PL NO - FINISH UP- MOV $TKPS,STIMER ;RESET SCREEN TICS COUNTERB) DEC T.STMR ;DECREMENT THE SCREEN TIMER$ BNE 30$ ;IF NE, NOT TIMED OUT YET3 BIS #TF.STM,(SP) ;SET THE SCREEN BLANK TIMER FLG C430$: BIS (SP),T.FLAG ;SET ANY BITS IN THE FLAG WORD TST (SP)+ ;ANY TIMERS GO OFF?1 BEQ CTQUEK ;IF EQ NO - REQUEUE THE 00:<|tt tfDATACLOCK BLOCKD CALL REQEST ;REQUEST THE TASK. ASSUME .,CTQUEK ;AND REQUEUE THE CLOCK BLOCK;E;+ ; CTQUEK - QUEUE THE CLOCK BLOCK;-;C+CTQUEK::MOV #$CTCB,R0 ;GET THE CLOCK BLOCK * CLR R1 ;CLEAR THE HIGH ORDER DELTA TIME) MOV #CT$TIC,R2 ;SET THE LOW ORDER DELTA * MOV #C.SYST,R4 ;TYPE = SYSTEM SUBROUTINE1 CALLR $CLINS ;INSERT IN CLOCK QUEUE AND RETURNG;;+-; UNUSED ENTRY POINTS, SHOULD NEVER BE CALLEDD;-;(-$YCOUT:: ;OUTPUT INTERRUPT SERVICE ROUTINEQ,$YCINP:: ;INPUT INTERRUPT SERVICE ROUTINEYCMTIM::CRASH ;MODEM TIMERT .ENDC ;B$$MAP .ENDBLOCK;E;+ ; CTQUEK - QUEUE THE CLOCK BLOCK;-;C+CTQUEK::MOV #$CTCB,R0 ;GET THE CLOCK BLOCK * CLR R1 ;CLEAR THE HIGH ORDER DELTA TIME) MOV #CT$TIC,R2 ;SET THE LOW ORDER DELTA * MOV #C.SYST,R4 ;TYPE = SYSTEM SUBROUTINE1 CALLR $CLINS ;INSERT IN CLOCK QUEUE AND RETURNG;;+-; UNUSED ENTRY POINTS, SHOULD NEVER BE CALLEDD;-;(-$YCOUT:: ;OUTPUT INTERRUPT SERVICE ROUTINEQ,$YCINP:: ;INP2 .TITLE LPDRV - RSX-11M-PLUS LINE PRINTER DRIVER) .SBTTL LPDRV - DESCRIPTION AND HISTORYE .IDENT /13.03/ ;A8; COPYRIGHT (c) 1981 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;E ;N ; B. S. MCCARTHY 13-AUG-81 ;8; BASED ON THE ORIGINAL NOVEL BY D. N. CUTLER, AND THE6; ORIGINAL KMC LP DRIVER FOR RSX11M, BY YOURS TRULY.;;.-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:;B; J. W. BERZLE; -; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:Y; #; B. S. MCCARTHY 26-FEB-86 13.02T;,; BM380 -- CONVERT TO USE EXEC VECTORING;S#; B. S. MCCARTHY 26-FEB-86 13.03 ;+; BM388 -- FIX REGISTER USAGE IN VECTORM; TRANSLATE ROUTINE;;B3; LP11/LS11/LA180 LINE PRINTER CONTROLLER DRIVERI; WITH KMC-11 DMA SUPPORTD; .PAGE-! .SBTTL . - MACRO LIBRARY CALLS/DEFINITIONS"#;$; MACRO LIBRARY CALLS%;E&(' .MCALL ABODF$, HWDDF$, PKTDF$, UCBDF$' .MCALL SCBDF$ ; BM380(%) ABODF$ ; DEFINE TASK ABORT CODES-'* HWDDF$ ; DEFINE HARDWARE REGISTERSE'+ PKTDF$ ; DEFINE I/O PACKET OFFSETS , UCBDF$ ; DEFINE UCB OFFSETS9, SCBDF$ ,,SYSDEF ; DEFINE VARIABLE SCB OFFSETS ; BM380T-.;/; EQUATED SYMBOLS0;11?2; SOME OF THESE DEFINITIONS ARE INCLUDED FOR INFORMATION ONLY(3; AND ARE NOT REFERENCED IN THE DRIVER45;E46; LINE PRINTER STATUS WORD BIT DEFINITIONS (U.CW2)7;8*9LS11 = 100000 ; LS11 PRINTER (1=YES)9:CRJT = 40000 ; CARRIAGE RETURN JUST OUTPUT (1=YES) 0;FORM = 20000 ; FORM FEED REQUIRED (1=YES)6<CRTY = 10000 ; CARRIAGE RETURN REQUIRED (1=YES)3=ABRT = 4000 ; ABORT REQUEST IF HUNG (1=YES)B7>LFCT = 3000 ; UNPROCESSED LINE FEED COUNT FIELD7?LFBT = 1000 ; UNPROCESSED LINE FEED ADD/SUB BITI@@BHLD = 400 ; BYTE HELD BACK FOR CARRIAGE RETURN (1=YES)-AOFFL = 200 ; PRINTER OFFLINE (1=YES)S(BLOWER = 100 ; LOWER CASE (1=YES)5CPWRFLG = 40 ; POWER FAIL RECOVERY IN PROGRESST;DRQINPR = 20 ; REQUEST IN PROGRESS WHEN POWER FAILEDU5EKNOWN = 10 ; PRINTER KNOWN TO KMC-11 (1=YES)U3FBLCT = 7 ; UNPROCESSED BLANK COUNT FIELDH3GBLBT = 1 ; UNPROCESSED BLANK ADD/SUB BITFHI; >J; LINE PRINTER HORIZONAL POSITION AND HELD BACK BYTE (U.CW3)K;HL#MHORPS = 0 ; HORIZONAL POSITIONINHELDB = 1 ; BYTE HELD BACK OPQ;E4R; DEFINE TIMEOUT WITH NO ERROR BIT IN S.STS FOR LPS;)T'UTMONO=200 ; 1=TIMEOUT WITH NO ERRORNVW;TX; K.PRM STATUS BITS Y;SZ-[KMCLOA = 1 ; KMC-11 MICROCODE LOADED '\KPKMC = 2 ; THIS IS A KMC KRBL]^ .PAGE-_ .SBTTL . - KMC11 SPECIFIC DATA DEFINITIONS &`; KMC-11/COMM-IOP-LP BIT DEFINITIONSab; KMC CSR WORD 0 (SEL0)Rc-dRUN = 100000 ; RUN BIT (1=KMC RUNNING):eMC = 40000 ; MASTER CLEAR (SET TO 1 TO CLEAR KMC)>fRQI 00B{cccc = 200 ; REQUEST INPUT (SET TO REQUEST KMC INPUT_=gIEO = 20 ; OUTPUT INTERRUPT ENABLE (SET TO ENABLE)R<hIEI = 1 ; INPUT INTERRUPT ENABLE (SET TO ENABLE)ij; KMC CSR WORD 1 (SEL2)Ek)lPRTNUM = 3400 ; PRINTER NUMBER MASK,mRDYO = 200 ; READY OUTPUT (1=READY)+nRDYI = 20 ; READY INPUT (1=READY)N&oFNCBSI = 3 ; BASE IN FUNCTION)pFNCCTI = 1 ; CONTROL IN FUNCTIONN0qFNCBAI = 0 ; BUFFER ADDRESS IN FUNCTIONrs; KMC CSR WORD 2 (SEL4) t8uPOLCNT = 177400 ; POLLING COUNT FOR BASE IN FUNCTIONvw; KMC CSR WORD 3 (SEL6)Lx;yKOPKOE = 200 ; KILL ON ERROR OPTION (FOR CONTROL IN)(.zKOPNXT = 40 ; DON'T EXPAND TABS OPTION-{KOPVTL = 20 ; CONVERT VT TO LF OPTION2|KOPDRN = 10 ; DISCARD RUBOUTS/NULLS OPTION<}KOPDNP = 4 ; DISCARD NON-PRINTING CHARACTERS OPTION8~KOPLUC = 2 ; CONVERT LOWER TO UPPER CASE OPTION7KOPFPR = 1 ; FAST PRINTER OPTIMIZATIONS OPTION:KMCABF = 10 ; KILL (ABORT) FINISHED ON CONTROL OUT>KMCNXM = 6 ; NON-EXISTENT MEMORY (WE CAN'T GET THIS?)3KMCONL = 4 ; PRINTER ERROR CONDITION CLEAR <KMCOFL = 2 ; PRINTER ERROR OCCURED (PAPER JAM,ETC.);BEXT = 140000 ; BUS EXTENSION BITS FOR BUFF. ADDR. INC%KILASN = 20000 ; KILL ASSIGN BIT KILL = 10000 ; KILL BIT; BUFFER DESCRIPTOR BITS-LASTBF = 100000 ; LAST DESCRIPTOR IN LIST=;AB; DEFINE THE SYMBOL "L$$PRN" EITHER IN THE RSXMC.MAC CONDITIONALB; ASSEMBLY FILE FOR YOUR SYSTEM OR REMOVE THE SEMICOLON (;) FROMA; THE LINE CONTAINING THE SYMBOL IN THE KMC LINE PRINTER DRIVERT ; (LKDRV).;L,;L$$PRN=0 ; SYMBOL TO PASS RUBOUTS/NULLS;)-VC$LP = 0 ; VECTORED LP DRIVER. ; BM380F;F; LOCAL DATA;N, .IF DF K$$MLP ; KMC LINE PRINTER SUPPORT-KMCCTB: .WORD 0 ; ADDRESS OF $KMCTB IN CTB-UNITPF: .WORD 0 ; THIS IS A UNIT POWERFAIL= .ENDC ; DF K$$MLP;O@; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);O6CNTBL: .BLKW L$$P11 ; ADDRESS OF UNIT CONTROL BLOCK ; BM380&; EXECUTIVE VECTOR AREA ; BM380 ; BM380IEXEVEC: .WORD 0 ; VECTOR FLAG (<>0 -> VECTOR ALREADY TRANSLATED); BM380V ; BM380$KISA6:: .WORD KISAR6 ; BM380$DVMSG:: .WORD $DVMSG ; BM380"FORK:: .WORD $FORK ; BM380$GTPKT:: .WORD $GTPKT ; BM380 ; BM380 .IF NDF LD$LP ; BM380 ; BM380$INTSV:: .WORD $INTSV ; BM380 ; BM380! .ENDC ; NDF LD$LP ; BM380O ; BM380$IODON:: .WORD $IODON ; BM380$MPUBM:: .WORD $MPUBM ; BM380$SCERR:: .WORD $SCERR ; BM380$STMAP:: .WORD $STMAP ; BM380$ULDRQ:: .WORD $ULDRQ ; BM380 ; BM380(EXEVCL=<<<.-EXEVEC>/2>-1> ; BM380 ; BM380;;8; DRIVER DISPATCH TABLE - DDT$ CAN'T GENERATE THIS ONE;0-$LPTBL:: ; START OF DRIVER DISPATCH TABLE01 .WORD LPINI ; D.VINI - INITIATION ENTRY POINT3- .WORD LPCAN ; D.VCAN - CANCEL ENTRY POINT . .WORD LPOUT ; D.VTIM - TIMEOUT ENTRY POINT3 .WORD LPPWF ; D.VPWF - POWERFAIL RECOVERY ENTRYR .IF DF K$$MLP2 .WORD LPKRB ; D.VKRB - KRB STATUS CHANGE ENTRY2 .WORD LPUCB ; D.VUCB - UCB STATUS CHANGE ENTRY .IFF>5 .WORD LPPWF ; D.VPWF - NO KRB STATUS CHANGE ENTRYD5 .WORD LPPWF ; D.VPWF - NO UCB STATUS CHANGE ENTRY .ENDC ; DF K$$MLP* ; D.VINT - START OF INTERRUPT VECTOR ; CONTROL INFORMATION/ .ASCII /LP/ ; FOR "LP" CONTROLLERSO3 .WORD $LPINT ; SINGLE INTERRUPT ENTRY POINTP( .WORD 0 ; VECTOR TABLE TERMINATOR4LPCTB: .WORD $LPCTB ; POINTER TO CTB KRB TABLE .IF DF K$$MLP) .ASCII /KM/ ; FOR "KM" CONTROLLERSE, .WORD $LKINP ; TWO INTERRUPT VECTORS,) .WORD $LKOUT ; ONE UNUSED ($LKINP)L( .WORD 0 ; VECTOR TABLE TERMINATOR4KMCTB: .WORD $KMCTB ; POINTER TO CTB KRB TABLE00J<|tt tfDATA .ENDC ; DF K$$MLP-$LPTBE::.WORD 0 ; END OF DISPATCH TABLE  .PAGE3 .SBTTL LPINI - LINE PRINTER CONTROLLER INITIATORE;+8; **-LPINI-LP11/LS11 LINE PRINTER CONTROLLER INITIATOR;:L; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUESTP; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE EXECU-P; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN ATTEMPTK; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IS K; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER-T@; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.;S ; INPUTS:E;T<; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;I ; OUTPUTS:;NG; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT- G; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER- ; ATION IS INITIATED.M;- .ENABL LSBQ"LPINI: GTPKT$ LP,L$$P11,,CNTBL,T;A3; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:C;L); R1=ADDRESS OF THE I/O REQUEST PACKET.I/; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.; R3=CONTROLLER INDEX.+; R4=ADDRESS OF THE STATUS CONTROL BLOCK.O<; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;R+; LINE PRINTER I/O REQUEST PACKET FORMAT: ; $; WD. 00 -- I/O QUEUE THREAD WORD.2; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.7; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK.,B; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTER TASK HEADER.L; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK HEADER (UCB).); WD. 05 -- I/O FUNCTION CODE (IO.WLB).E2; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.2; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.G; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140000).5; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.S5; WD. 12 -- RELOCATION BIAS OF I/O BUFFER. (I.PRM)F-; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER. /; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.E$; WD. 15 -- CARRIAGE CONTROL BYTE.; WD. 16 -- NOT USED.A; WD. 17 -- NOT USED. ; WD. 20 -- NOT USED.I;) .IF DF K$$MLP 2  BIT #KP.OFL,S.KTB+2(R4) ; VERIFY PORT IS ONLINE  BNE 5$ ; IF NE, IT'S OFFLINE,  MOV S.KTB+2(R4),R0 ; GET ADDRESS OF KMC11+  BEQ 5$ ; IF EQ, THIS PRINTER NOT ON KMC @ BIT #KMCLOA,K.PRM(R0) ; IS THE MICROCODE LOADED FOR THE KMC ?* BNE LKINI ; IF NE, MICROCODE IS LOADED .ENDC ; DF K$$MLP;5$: MOV R5,R3 ; CALCULATE ADDRESS OF PRINTER STATUS WORD  ADD #U.CW2,R3 ;> BIC #FORM!CRTY!ABRT!LFCT!BHLD!BLCT,(R3) ; CLEAR STATUS BITS3 MOVB I.PRM+6(R1),R0 ; GET CARRIAGE CONTROL BYTEB* BEQ LPIN1 ; IF EQ, NO CARRIAGE CONTROL1 CMPB #'$,R0 ; CARRIAGE RETURN AT END OF LINE?2 BEQ 10$ ; IF EQ, NOK: BIS #CRTY,(R3) ; SET FOR CARRIAGE RETURN AT AND OF LINE510$: CMPB #'+,R0 ; LINE FEED AT BEGINNING OF LINE?? BEQ LPIN1 ; IF EQ, NOC1 CMPB #'1,R0 ; FORM FEED AT BEGINNING OF LINE?$ BNE 20$ ; IF NE, NOA> ADD #FORM-LFBT,(R3) ; SET FOR FORM FEED AT BEGINING OF LINE, 20$: ADD #LFBT,(R3) ; ADD IN ONE LINE FEED! CMPB #'0,R0 ; DOUBLE SPACE?E" BNE LPIN1 ; IF NE, NO(# ADD #LFBT,(R3) ; ADD IN ONE LINE FEED/$LPIN1: CALL LPRNT ; FILL LINE PRINTER BUFFER2)% BCS 35$ ; IF CS, REQUEST NOT FINISHED3/& MOV S.PKT(R4),R1 ; GET ADDRESS OF I/O PACKET:5' MOV I.PRM+4(R1),R1 ; GET NUMBER OF BYTES PROCESSEDQ-( MOV #IS.SUC&377,R0 ; SET SUCCESSFUL STATUSE0( CALL @IODON ; FINISH I/O OPERATION ; BM380* BR LPINI ; ;**-18+35$: BITB #TMONO,S.STS(R4) ; TIMEOUT NO ERROR BIT SET?, BEQ 40$ ; IF EQ, NOD<- MOVB #2,S.CTM(R4) ; SET TIME OUT COUNT TO 2 (MIN. 1 SEC.). BR 41$ ; SKIP </40$: MOVB S.ITM(R4),S.CTM(R4) ; RESET DEVICE TIMEOUT COUNT*041$: MOV @S.KRB(R4),R4 ; GET CSR ADDRESS,1 BISB #100,(R4) ; ENABLE PRINTER INTERRUPT 2 RETURNE 3 .DSABL LSBM4 .PAGE:5 .SBTTL LKINI - KMC11 PRINTER INITIALIZATION ENTRY POINT6;+D7; **-LKINI-LP11/LS1100R{cccc WITH KMC-11 LINE PRINTER CONTROLLER INITIATOR8;-9: .IF DF K$$MLP;7<LKINI: MOV R5,CNTBL(R3) ; SAVE ADDRESS OF REQUEST UCB$.= BIC #ABRT,U.CW2(R5) ; CLEAR REQUEST ABORTED>;O*?; CONVERSION OF ADDRESS FOR A NPR DEVICE@;:A; ON AN 18-BIT MACHINE, THENBB; U.BUF = HIGH ORDER 2 BITS OF PHYSICAL ADDRESS IN BITS 4 AND 55C; U.BUF+2 = LOW ORDER 16 BITS OF PHYSICAL ADDRESS.ED; ON AN 11/70, THENA@E; U.BUF = HIGH ORDER 6 BITS OF PHYSICAL ADDRESS IN HIGH BYTE.5F; U.BUF+2 = LOW ORDER 16 BITS OF PHYSICAL ADDRESS.TGH MOV R1,-(SP) ; SAVE R1.I MOV R2,-(SP) ; AND R2%J MOV U.BUF(R5),R1 ; RELOCATION BIASU,K MOV U.BUF+2(R5),R2 ; DISPLACEMENT ADDRESS/L ASL R2 ; REMOVE APR6 BIAS FROM DISPLACEMENT M ASL R2 ;(N CLC ; GET 2 BITS OF RELOCATION BIAS O ROR R1 ;1P RORB R2 ; TO FILL 8 LOW ORDER BITS OF ADDRESS Q ASR R1 ; R RORB R2 ;O)S SWAB R2 ; SWAP TO COLLECT 8 MORE BITSA/T BISB R1,R2 ; INSERT UPPER 8 BITS OF ADDRESSE'U SWAB R2 ; SWAP BACK TO REAL ADDRESSR*V CLRB R1 ; CLEAR LOW BYTE OF UPPER BITSWX .IF NDF M$$EXTMY1Z ASH #-4,R1 ; PUT BITS <17:18> OF ADDRESS INTOB[ ; BITS <4:5>\] .ENDC^%_ MOV R1,U.BUF(R5) ; HIGH ORDER BITSB:` MOV R2,U.BUF+2(R5) ; LOW ORDER 16 BITS OF PHYS. ADDRESSa MOV (SP)+,R2 ; RESTORE R2b MOV (SP)+,R1 ; AND R1cde .IF DF M$$MGE&M$$EXTAf,f CALL @STMAP ; SETUP UNIBUS MAP ; BM380h ;**-1i .ENDC ; M$$MGE&M$$EXTj0k; TEST TO SEE IF KMC KNOW'S ABOUT THIS PRINTER"l; AND ISSUE BASE IN IF NECESSARYm/nLKIN1: BIT #KNOWN,U.CW2(R5) ; PRINTER KNOWN ?Ho BNE 10$ ; IF NE, YES#p CALL WTKMC ; WAIT FOR KMC READY>,q MOV @S.KRB(R4),6(R0); FILL IN CSR ADDRESS0r MOV #L$$KPC*256.,4(R0) ; SET UP POLLING COUNT&s CLR R4 ; SCRATCH FOR UNIT/FUNCTION't BISB U.UNIT(R5),R4 ; SET UNIT NUMBER!u SWAB R4 ; PUT IT IN HIGH BYTE(v BIS #FNCBSI,R4 ; SET BASE IN FUNCTION$w MOV R4,2(R0) ; AND ISSUE FUNCTION)x MOV U.SCB(R5),R4 ; RESTORE SCB ADDRESS'+y BIS #KNOWN,U.CW2(R5) ; SET PRINTER KNOWNFzA{; TEST TO SEE IF PRINTER HAS BEEN INITIALIZED FOR CORRECT WIDTHE |; (CURRENT SET WIDTH IN U.CW3)}:~10$: CMPB U.CW4(R5),U.CW3(R5) ; BUF SIZE CURRENT WIDTH ?/ BEQ 20$ ; IF EQ, YES, CONTROL IN WAS ISSUEDC# CALL WTKMC ; WAIT FOR KMC READYU .IF NDF L$$PRNR9 MOV #KOPDRN,R4 ; SET FUNCTION TO DISCARD RUBOUTS/NULLSS .IFF / CLR R4 ; SET FUNCTION TO PASS RUBOUTS/NULLSC .ENDC, BIT #LOWER,U.CW2(R5) ; LOWER CASE PRINTER' BNE 11$ ; IF NE, LOWER CASE PRINTERT3 BIS #KOPLUC,R4 ; SET LOWER TO UPPER CASE SUPPORTT11$: ; REF LABELD .IF DF L$$11R' BIT #LS11,U.CW2(R5) ; FAST PRINTER ?E BNE 12$ ; IF NE, NO22 BIS #KOPFPR,R4 ; SET FAST PRINTER OPTIMIZATIONS .ENDC ; DF L$$11R&12$: MOV R4,6(R0) ; SET OPTIONS WORD* MOV U.CW4(R5),4(R0) ; SET PRINTER WIDTH- CLR R4 ; SCRATCH FOR UNIT NUMBER/FUNCTIONT* BISB U.UNIT(R5),R4 ; SET IN UNIT NUMBER! SWAB R4 ; PUT IT IN HIGH BYTEE+ BIS #FNCCTI,R4 ; SET CONTROL IN FUNCTIONS  MOV R4,2(R0) ; ISSUE FUNCTION) MOV U.SCB(R5),R4 ; RESTORE SCB ADDRESS 2 MOVB U.CW4(R5),U.CW3(R5) ; SET PRINTER SIZE SET8; BUILD ADDRESS BUFFER IN I/O PACKET AND ISSUE REQUEST20$: ; REFERENCE LABELD .IF DF M$$MGE & M$$EXT0) MOV R1,-(SP) ; SAVE I/O PACKET ADDRESSS0 CALL @MPUBM ; MAP UNIBUS TO MEMORY ; BM3803 MOV (SP)+,R1 ; RESTORE I/O PACKET ADDRESS ;**-1U .ENDC ; M$$MGE & M$$EXT# CALL WTKMC ; WAIT FOR KMC READYN> MOV U.BUF+2(R5),I.PRM+10(R1) ; SET LOW PART OF BUFFER ADDR.4 MOV U.CNT(R5),I.PRM+12(R1) ; AND LENGTH OF BUFFER0 MOV U.BUF(R5),R0 ; GET HIGH TWO BITS OF ADDR. SWAB R0 ; PUT IN HIGH BYTE" ASR R0 ; SHIFT INTO BITS 10/11  ASR R0 ;) BIS #LASTBF,R0 ; SET FOR LAST FUNCTIONM( BISB I.PRM+6(R1),R0 ; SET VFC BITS IN3 MOV R0,I.PRM+14(R1) ; STORE INTO BUFF ADDR DESC.V8; BUFFER DESCRIPTOR BUILT IN WORDS 4,5,6 OF PARAM LIST) MOV @S.KTB+2(R4),R0 ; POINT TO KMC CSRO00Z<|tt tfDATA# CLR 6(R0) ; CLEAR OUT KILL BITSM# MOV R1,R4 ; COPY PACKET ADDRESS.0 ADD #I.PRM+10,R4 ; POINT TO BUFFER DESCRIPTOR( MOV R4,4(R0) ; FILL IN BUFFER ADDRESS$ CLR R4 ; SCRATCH FOR UNIT NUMBER* BISB U.UNIT(R5),R4 ; SET IN UNIT NUMBER! SWAB R4 ; PUT IT IN HIGH BYTEE$ MOV R4,2(R0) ; AND START TRANSFER"25$: RETURN ; EXIT FROM DRIVER .ENDC ; DF K$$MLP .PAGE4 .SBTTL LPPWF - LINE PRINTER POWERFAIL ENRTY POINT;TM; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUSESLM; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDITIONF4; THAT COUND EXIST IN RESTARTING THE I/O OPERATION;LPPWF: .IF DF K$$MLP' BCC 5$ ; BR IF CONTROLLER POWERFAILU( INC UNITPF ; INDICATE UNIT POWERFAIL55$: BIT #KP.OFL,S.KTB+2(R4) ; VERIFY PORT IS ONLINE ! BNE 10$ ; IF NE, IT'S OFFLINE , MOV S.KTB+2(R4),R0 ; GET ADDRESS OF KMC11, BEQ 10$ ; IF EQ, THIS PRINTER NOT ON KMC? BIT #KMCLOA,K.PRM(R0) ; IS THE MICROCODE LOADED FOR THE KMC?C) BEQ 10$ ; IF EQ, MICROCODE NOT LOADEDC# JMP LKPWF ; DO POWERFAIL FOR LKT/10$: MOV #0,UNITPF ; ZERO UNIT POWERFAIL FLAGO  .IFF ; DF K$$MLP ; BM380 ; BM380: CALL LPKRB ; TRANSLATE EXEC ENTRY POINT VECTOR ; BM380 ; BM380 .ENDC ; DF K$$MLP  RETURN ;O .PAGE5 .SBTTL LKPWF - KMC11 PRINTER POWERFAIL ENTRY POINT ; F; UNIT POWERFAIL PROCESSING MARKS A DEVICE AS UNKNOWN AND OF UNKNOWNF; WIDTH. FOR CONTROLLER POWERFAIL CALLS, THE MICROCODE IS MARKED ASG; NOT LOADED. THE MICROCODE LOADER (MCL...) IS REQUESTED. IF MCL...:I; IS NOT INSTALLED AN ERROR MESSAGE IS ISSUED. IF THERE IS NO POOL, AB7; RETURN IS EXECUTED AND LPDRV WILL NOT USE THE KMC. ;  .IF DF K$$MLP  .ENABL LSB30LKPWF: TST UNITPF ; IS THIS A UNIT POWERFAIL?, BEQ LKPWF0 ; IF EQ, CONTROLLER POWERFAIL! DEC UNITPF ; SET BACK TO ZEROR4 BIS #PWRFLG,U.CW2(R5) ; SET POWERFAIL IN PROGRESS& TST CNTBL(R3) ; REQUEST IN PROGRESS BEQ 10$ ; IF EQ, NOM7 BIS #RQINPR,U.CW2(R5) ; SET REQUEST IN PROGRESS FLAGI110$: BIC #KNOWN,U.CW2(R5) ; SET PRINTER UNKNOWNE- CLRB U.CW3(R5) ; AND SET THE WIDTH TO ZEROB RETURN ; EXIT FROM DRIVERLKPWF0: ; CTB IS IN R3 MOV R2,R4 ; PUT KRB INTO R4S( MOV #0,R5 ; MICROCODE FILENAME INDEX8 BIC #KMCLOA,K.PRM(R4) ; INDICATE MICROCODE NOT LOADED.13$: CALL @ULDRQ ; REQUEST LOADER ; BM380 BCC 15$ ; BR IF OK ;**-1E. BEQ 20$ ; IF EQ, TASK MCL... NOT INSTALLED BNE 40$ ; IF NE, NO POOL*15$: MOV #MC,@(R4) ; MASTER CLEAR KMC-11 BR 40$ ; RETURN( > 20$: MOV #T.NKLF,R0 ; MESSAGE NUM "MICROCODE LOADER NOT ..."2  CALLR @DVMSG ; PRINT MESSAGE AND EXIT ; BM380  ;**-1 40$: RETURN4 .ENDC ; DF K$$MLP  .DSABL LSBD .PAGE8 .SBTTL $LPINT - LINE PRINTER INTERRUPT HANDLING ENTRY;+9; **-$LPINT-LP11/LS11 LINE PRINTER CONTROLLER INTERUPTS$;-$LPINT:: ;;; REF LABEL? INTSV$ LP,PR4,L$$P11,,CNTBL ;;; GENERATE INTERRUPT SAVE CODE; MOV U.SCB(R5),R4 ;;; GET ADDRESS OF STATUS CONTROL BLOCK;( MOV @S.KRB(R4),R4 ;;; GET CSR ADDRESS, CLRB (R4) ;;; DISABLE PRINTER INTERRUPTS3 CALL @FORK ;;; CREATE A SYSTEM PROCESS ; BM380;& MOV U.SCB(R5),R4 ; GET SCB ;**-1&  MOV @S.KRB(R4),R3 ; GET CSR ADDRESS! TST (R3) ; PRINTER READY?N" BMI LPOUT1 ; IF MI, NO8# MOV R5,R3 ; CALCULATE ADDRESS OF PRINTER STATUS WORD$ ADD #U.CW2,R3 ;)% CALL LPRNT ; FILL LINE PRINTER BUFFERL*& BCC LPINT1 ; IF CC, OPERATION FINISHED8' MOVB S.ITM(R4),S.CTM(R4) ; RESET DEVICE TIMEOUT COUNT&( MOV @S.KRB(R4),R4 ; GET CSR ADDRESS,) BISB #100,(R4) ; ENABLE PRINTER INTERRUPT * RETURN6+LPINT1: MOV S.PKT(R4),R1 ; GET ADDRESS OF I/O PACKET5, MOV I.PRM+4(R1),R1 ; GET NUMBER OF BYTES PROCESSED3-- MOV #IS.SUC&377,R0 ; SET SUCCESSFUL STATUSY4-60$: CALL @IODON ; FINISH I/O OPERATION ; BM380/ JMP LPINI ; ;**-1U01 .PAGE62 .SBTTL $LKINT - KMC11 PRINTER INTERRUPT ENTRY POI00b{ccccNT34;+95; **-$LPINT-LP11/LS11 LINE PRINTER CONTROLLER INTERUPTS(06; (INTERRRUPTS ARE FROM COMM IOP, NOT PRINTER)7;;88; INPUT INTERRUPTS SHOULD NOT OCCUR, AND ARE THEREFORE9; DISMISSED IMMEDIATELY.:;.+;; OUTPUT INTERRUPTS ARE CAUSED FOUR WAYS:V<;M==; 1) - BUFFER ADDRESS OUT - INDICATES SUCCESSFUL COMPLETIONR>; OF AN OUTPUT OPERATION:;?; 2) - CONTROL OUT - KMCABF SET IN KCS3 - ABORT COMPLETED B@; 3) - CONTROL OUT - KMCONL SET IN KCS3 - PREVIOUS ERROR CLEARED9A; 4) - CONTROL OUT - OTHER - ERROR CONDITION ON PRINTERTB;-C .IF DF K$$MLP&D$LKINP:: ; IGNORE INPUT INTERRUPTS-E ; ($LPINP IS NEEDED TO MAKE DRIVER LOADOF ; CORRECTLY)G"H .IF NDF L$$DRV ! M$$MGE ! LD$LPIJ RTIKL .IFFRM N RETURNAOP .ENDCQ .PAGE R .ENABL LSB S$LKOUT:: ;;; REF LABELT"U .IF NDF L$$DRV ! M$$MGE ! LD$LPV:V JSR R5,@INTSV ;;; SINCE THERE'S ONE KMC VECTOR, ; BM380<X .WORD ^C&PR7 ;;; NORMAL UCB CALC. DOESN'T WORK ;**-1YZ .ENDC[#\ ADD KMCCTB,R4 ;;; POINT INTO KRB 0] ADD #10,R4 ;;; ADD DISPLACEMENT TO CTB TABLE#^ MOV (R4),R4 ;;; GET KRB ADDRESSN$_ MOV R4,-(SP) ;;; SAVE KRB ADDRESS#` MOV (R4),R4 ;;; GET CSR ADDRESS /a MOV 2(R4),R5 ;;; GET PRINTER NUMBER FROM KMC(b BIC #^C,R5 ;;; STRIP OFF JUNK$c SWAB R5 ;;; INTO LOW HALF OF REG$d ASL R5 ;;; AND CREATE WORD INDEX#e MOV (SP)+,R4 ;;; GET KRB ADDRESSS/f ADD K.OFF(R4),R5 ;;; ADD OFFSET TO KRB TABLE;!g ADD R4,R5 ;;; ADD KRB ADDRESS1#h MOV (R5),R5 ;;; GET UCB ADDRESS;1i BEQ 90$ ;;; IF EQ, DISMISS SPURIOUS INTERRUPTMj MOV (R4),R4 ;;; GET KMC CSR $k MOV R5,-(SP) ;;; SAVE UCB ADDRESS*l MOV 6(R4),R5 ;;; GET PRINTER ERROR CODE"m SWAB R5 ;;; PUT INTO HIGH BYTE"n CLRB R5 ;;; CLEAR OUT LOW BYTE1o BISB 2(R4),R5 ;;; AND MERGE IN INTERRUPT CAUSE +p BIC #IEO,(R4) ;;; DISABLE KMC INTERRUPTST"q BIC #RDYO,2(R4) ;;; RELEASE KMC,r MOV R5,R4 ;;; INTERRUPT CAUSE/ERROR BYTE's MOV (SP)+,R5 ;;; RESTORE UCB POINTER 7s CALL @FORK ;;; CREATE A SYSTEM PROCESS ; BM380Q&u MOV U.SCB(R5),R0 ; GET SCB ;**-1$v MOV @S.KTB+2(R0),R0 ; GET KMC CSR+w BIS #IEO,(R0) ; RE-ENABLE KMC INTERRUPTSV$x MOV R4,R0 ; COPY INTERRUPT CAUSE(y MOV R4,R1 ; COPY POSSIBLE ERROR BYTE%z SWAB R1 ; AND MOVE IT TO LOW BYTE({ MOV U.SCB(R5),R4 ; GET SCBP&| BIT #1,R0 ; WAS IT A CONTROL OUT ?}~ BNE 70$ ; IF NE, YES& MOV #IS.SUC,R0 ; SET SUCCESS STATUS060$: MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS0 MOV I.PRM+4(R1),R1 ; GET REQUESTED BYTE COUNT0 CALL @IODON ; FINISH I/O OPERATION ; BM380& MOV U.SCB(R5),R4 ; GET SCB ;**-1# MOV S.KTB+2(R4),R4 ; GET KMC KRB-+ MOVB K.CON(R4),R4 ; GET CONTROLLER INDEXI) CLR CNTBL(R4) ; CLEAR CONTROLLER TABLEL& JMP LPINI ; AND START DRIVER AGAIN)70$: CMPB #KMCABF,R1 ; ABORT FINISHED ?# BNE 80$ ; IF NE, YES ABORT DONE+LKOUT1: MOV #IE.ABO,R0 ; SET ABORT STATUSR BR 60$ ; AND OUT NORMALLYM+80$: CMPB #KMCONL,R1 ; PRINTER BACK NOW ?I( BNE LKOUT ; IF NE, NO, MUST BE ERROR$ RETURN ; ELSE YES, THAT'S NICE.90$: MOV (R4),R4 ; GET CSRE  BIC #RDYO,2(R4) ; RELEASE KMC" RETURN ; AND EXIT FROM DRIVER  .DSABL LSBR .ENDC ; DF K$$MLP .PAGE2 .SBTTL LPOUT - LINE PRINTER TIMEOUT ENTRY POINT;A; DEVICE TIMEOUT RESULTS IN A NOT READY MESSAGE BEING OUTPUT ATSE; A SYSGEN SPECIFIED INTERVAL. TIMEOUTS ARE CAUSED BY POWERFAILURE;!; AND PRINTER FAULT CONDITIONS. ;N  .ENABL LSBBLPOUT: .IF DF K$$MLP4 BIT #KP.OFL,S.KTB+2(R4) ;;; VERIFY PORT IS ONLINE# BNE 10$ ;;; IF NE, IT'S OFFLINES. MOV S.KTB+2(R4),R0 ;;; GET ADDRESS OF KMC11. BEQ 10$ ;;; IF EQ, THIS PRINTER NOT ON KMCA BIT #KMCLOA,K.PRM(R0) ;;; IS THE MICROCODE LOADED FOR THE KMC?M BEQ 10$ ;;; IF EQ, NO# JMP LKOUT ;;; DO TIMEOUT FOR LKE .ENDC ; DF K$$MLP$10$: MOV @S.KRB(R4),R3 ;;; GET CSR+ CLRB (R3) ;;; DISABLE PRINTER INTERRUPTN  MTPS #0 ;;; ALLOW INTERRUPTS(LPOUT1: MOV R5,R3 ; CALCULATE ADDRESS7 MOV #IE.A00j<|tt tfDATABO&377,R0 ; ASSUME REQUEST IS TO BE ABORTED0 ADD #U.CW2,R3 ; ADJUST TO PRINTER STATUS WORD" BIT #ABRT,(R3) ; ABORT REQUEST? BEQ 70$ ; IF EQ, NO 0 CALL @IODON ; FINISH I/O OPERATION ; BM380 JMP LPINI ; ;**-1T*70$: MOV @S.KRB(R4),R2 ; GET CSR ADDRESS TST (R2) ; PRINTER READY?/ BMI DEVNR ; DEVICE NOT READY(ERROR BIT SET)49 BITB #TMONO,S.STS(R4) ; WAS TIMEOUT WITH NO ERROR BIT?P BNE 71$ ; IF NE, YES? BISB #TMONO,S.STS(R4) ; NO, SET THE BIT(TO CLEAR WHEN IODON)A( JMP LPIN1 ; GO BACK AND PRINT BUFFER@71$: BICB #TMONO,S.STS(R4) ; 2 TIMEOUTS WITH NO ERROR => ERROR BR DEVNR ; DEVICE NOT READY  .DSABL LSBC .PAGE8 .SBTTL LKOUT - KMC11 LINE PRINTER TIMEOUT ENTRY POINT;0:; TIMEOUT PROCESSING IS ENTERED FOR ANY OF THE FOLLOWING;A;; 1. FOLLOWING AN IO.KIL, IF THE REQUEST IS NOT COMPLETEDT>; NORMALLY BEFORE THE NEXT TIMEOUT CHECK, THEN A HARDWARE; ABORT IS ISSUED HERE.;S>; 2. AFTER A DEVICE ERROR, THE TIMEOUT SECTION TAKES CARE OF"; ISSUING NOT READY MESSAGES.;T .IF DF K$$MLP&LKOUT: MTPS #0 ;;; ALLOW INTERRUPTS; BIT #PWRFLG,U.CW2(R5) ; POWERFAIL RECOVERY IN PROGRESS ?  BEQ 99$ ; IF EQ, NOO/ BIC #PWRFLG,U.CW2(R5) ; CLEAR POWERFAIL FLAGI* BIT #ABRT,U.CW2(R5) ; ABORT REQUESTED ?3 BNE LKOUT1 ; IF NE, YES, BUT REQUEST IS ALREADYE, ; ABORTED (AND HOW) DUE TO KMC FAILUREB BIT #RQINPR,U.CW2(R5) ; REQUEST IN PROGRESS WHEN WE WENT DOWN ? BEQ 96$ ; IF EQ, NOT4 BIC #RQINPR,U.CW2(R5) ; CLEAR REQUEST IN PROGRESS0 MOV S.PKT(R4),R1 ; RESTORE I/O PACKET ADDRESS# JMP LKIN1 ; AND RESTART REQUESTB296$: CLRB S.STS(R4) ; CLEAR FAKE CONTROLLER BUSY1 BICB #US.BSY,U.STS(R5) ; AND DECLARE UNIT IDLE2* JMP LPINI ; TRY TO ACTIVATE CONTROLLER.99$: BIT #ABRT,U.CW2(R5) ; ABORT REQUESTED ? BEQ DEVNR ; IF EQ, NOL% CALL WTKMC ; WAIT TILL IT'S READYC& MOV #KILL,6(R0) ; SET KILL FUNCTION CLR 4(R0) ; NO BUFF ADDR' CLR R1 ; SCRATCH FOR PRINTER NUMBER#* BISB U.UNIT(R5),R1 ; SET IN UNIT NUMBER! SWAB R1 ; PUT IT IN HIGH BYTE 7 MOV R1,2(R0) ; FILL IN PRINTER NUMBER AND START KILL6$ RETURN ; WAIT TIL IT'S ALL OVER .ENDC ; DF K$$MLP .PAGE0 .SBTTL . - DEVICE NOT READY MESSAGE PROCESSOR%; PROCESS DEVICE NOT READY MESSAGES;DEVNR: ; REF LABELV .IF DF T$$KMG4 MOV #T.NDNR,R0 ; SET FOR DEVICE NOT READY MESSAGE .IFTF ; DF T$$KMG/ MOVB #1,S.CTM(R4) ; SET TIMEOUT FOR 1 SECONDP .IFT ; DF T$$KMGN, DECB S.STS(R4) ; TIME TO OUTPUT MESSAGE ? BNE 120$ ; IF NE, NO .IF NDF L$$PTOE6 MOVB #15.,S.STS(R4) ; SET TO OUTPUT NEXT MESSAGE IN ; 15. SECONDS   .IFF ; NDF L$$PTO 9  MOVB #L$$PTO,S.STS(R4) ; SET TO OUTPUT NEXT MESSAGE INI  ; L$$PTO SECONDS3  BNE 110$ ; IF NE, LP NOT READY MESSAGES ENABLEDM7 INCB S.STS(R4) ; LP NOT READY MESSAGE NOT WANTED, SO.  BR 120$ ; RE-BUSY CONTROLLER .ENDC ; NDF L$$PTO10110$: CALLR @DVMSG ; OUTPUT MESSAGE ; BM380 ;**-1 .ENDC ; DF T$$KMG120$: RETURN ; OUT !  .DSABL LSBM .PAGE1 .SBTTL LPCAN - LINE PRINTER CANCEL ENTRY POINT5; E; CANCEL I/O OPERATION-FORCE I/O TO COMPLETE IF DEVICE IS NOT READYT;E 7!LPCAN: CMP R1,I.TCB(R0) ;;; REQUEST FOR CURRENT TASK?E" BNE 10$ ;;; IF NE, NOB<# BIS #ABRT,U.CW2(R5) ;;; SET FOR ABORT IF DEVICE NOT READY$% .IF DF K$$MLP&4' BIT #KP.OFL,S.KTB+2(R4) ;;; VERIFY PORT IS ONLINE#( BNE 10$ ;;; IF NE, IT'S OFFLINE0.) MOV S.KTB+2(R4),R0 ;;; GET ADDRESS OF KMC11.* BEQ 10$ ;;; IF EQ, THIS PRINTER NOT ON KMCA+ BIT #KMCLOA,K.PRM(R0) ;;; IS THE MICROCODE LOADED FOR THE KMC? , BEQ 10$ ;;; IF EQ, NOF<- MOVB #1,S.CTM(R4) ;;; FORCE TIMEOUT IN 1 SECOND (OR LESS)./ .ENDC ; DF K$$MLP0110$: RETURN ;;;23 .PAGE/4 .SBTTL LPKRB - KRB STATUS CHANGE ENTRY POINTA5 6; ON ENTRY:R7;*8; R3 = CTB ADDRESS FOR THE CONTROLLER*9; R2 = KRB ADDRESS FOR THE CONT00r{ccccROLLER):; 0(SP) = RETURN ADDRESS FOR COMPLETION29;; 2(SP) = RETURN ADDRESS FOR CALLER OF THE EXEC ROUTINEI<;N2=; C = 0 IF THE CALL IS FOR CONTROLLER ONLINE3>; C = 1 IF THE CALL IS FOR CONTROLLER OFFLINE,?;@; $SCERR IS PRESET TO 1RA;MB:BLPKRB: ; CONTROLLER STATUS CHANGE ENTRY POINT ; BM3801B ; AND EXEC VECTOR TRANSLATE ROUTINE ; BM380 B ; BM380B .IF DF K$$MLP ; BM380B ; BM380/B BCS 25$ ; BR IF CONTROLLER OFFLINE ; BM380 B ; BM380!B .IFTF ; DF K$$MLP ; BM380LB ; BM380>B; FILL IN EXEC VECTOR IF WE HAVEN'T DONE SO ALREADY ; BM380B ; BM3802B TST EXEVEC ; EXEC VECTOR TRANSLATED ? ; BM3801B BNE 15$ ; IF NE, YES - DON'T REPEAT. ; BM380T+B MOV R3,-(SP) ; SAVE A REGISTER ; BM380U$B MOV R2,-(SP) ; OR TWO ; BM3801B MOV @#112,R0 ; R0 > TABLE OF ENTRIES ; BM380 <B MOV (R0),R0 ; AND APR BIAS (1ST WORD OF TABLE). ; BM3805B MOV KINAR6,-(SP) ; SAVE I-SPACE MAPPING. ; BM380 =B MOV (R0),KINAR6 ; MAP COMMON THROUGH I-SPACE APR6. ; BM380;2B MOV #EXEVEC,R3 ; R3 > EXEC VECTOR AND ; BM3809B MOV #EXEVCL,R2 ; R2 = LENGTH OF VECTOR AREA. ; BM380E2B CALL @#140004 ; TRANSLATE THE VECTORS. ; BM3807B MOV (SP)+,KINAR6 ; RESTORE I-SPACE MAPPING. ; BM380R$B MOV (SP)+,R2 ; RESTORE ; BM380'B MOV (SP)+,R3 ; REGISTERS ; BM380>%B15$: ; REFERENCE LABEL ; BM3800B ; BM380 B .IFT ; DF K$$MLP ; BM380B ; BM380B ; BM3803F BIT #KPKMC,K.PRM(R2); IS THIS A KMC KRB? ;**-3 $G BEQ 40$ ; IF EQ, NO, JUST RETURN'H MOV R3,KMCCTB ; SAVE LOCATION OF CTBMI MOV R2,R4 ; PUT KRB INTO R4E(J MOV #0,R5 ; MICROCODE FILENAME INDEX7J CALL @ULDRQ ; REQUEST THE MICROCODE LOADER ; BM380T&L BCC 40$ ; BR IF SUCCESSFUL ;**-16M BNE 30$ ; IF NE, NO POOL, REJECT ONLINE TRANSITIONNCN20$: MOVB #IE.NST,@SCERR ; MICROCODE LOADER NOT INSTALLED ; BM3800 P BR 40$ ; AND RETURN ;**-1Q/R25$: BIT #KPKMC,K.PRM(R2) ; IS THIS A KMC KRBM$S BEQ 40$ ; IF EQ, NO, JUST RETURN5T BIC #KMCLOA,K.PRM(R2) ; CLEAR MICROCODE LOADED BITC&U MOV #MC,@(R2) ; MASTER CLEAR KMC-11 V BR 40$ ;W7W30$: MOVB #IE.NOD,@SCERR ; INDICATE NO POOL ; BM380DW ; BM380!W .IFTF ; DF K$$MLP ; BM380$Y ;**-1 Z40$: RETURNBZ ; BM380 Z .IFT ; DF K$$MLP ; BM380Z ; BM380[\ .PAGE/] .SBTTL LPUCB - UCB STATUS CHANGE ENTRY POINT;^ _; ON ENTRY:1`;1a; R5 = ADDRESS OF UCB OR UNIT CHANGIN STATUS"b; R4 = ADDRESS OF SCB OF UNIT3c; R3 = CONTROLLER INDEX (UNDEFINED IF S.KRB=0)C)d; 0(SP) = RETURN ADDRESS FOR COMPLETION9e; 2(SP) = RETURN ADDRESS FOR CALLER OF THE EXEC ROUTINEOf; 2g; C = 0 IF THE CALL IS FOR CONTROLLER ONLINE3h; C = 1 IF THE CALL IS FOR CONTROLLER OFFLINE i;Bj; $SCERR IS PRESET TO 1 "kLPUCB: BCS 10$ ; BR IF OFFLINE,l BIT #1,S.KTB(R4) ; IS THE LP PORT ONLINE!m BEQ 10$ ; IF EQ, YES, ITS OK4m MOVB #IE.CNR,@SCERR ; REJECT TRANSITION ; BM380o ;**-11p10$: BIC #KNOWN,U.CW2(R5) ; SET PRINTER UNKNOWNN q RETURNSrs .ENDC ; DF K$$MLPtu .PAGEv .SBTTL . SUBROUTINESEwx;E*y; SUBROUTINE TO FILL LINE PRINTER BUFFERz;C{,|LPRNT: MOV @S.KRB(R4),R1 ; GET CSR ADDRESS2} MOV U.BUF+2(R5),R0 ; GET ADDRESS OF USER BUFFER~ .IF DF M$$MGE6 MOV U.BUF(R5),@KISA6 ; MAP TO USER BUFFER ; BM380 ;**-1 .IFTF!5$: MOV #5,R2 ; SET LOOP COUNT10$: TST (R1) ; TEST ERRORT  BPL 20$ ; BRANCH IF NO ERROR4 MOV R5,R3 ; CALCULATE ADDRESS OF RELOCATION BIAS ADD #U.BUF,R3 ;/ MOV S.PKT(R4),R1 ; GET ADDRESS OF I/O PACKETU+ ADD #I.PRM,R1 ; POINT TO RELOCATION BIASL* MOV (R1)+,(R3)+ ; RESET RELOCATION BIAS) MOV (R1)+,(R3)+ ; RESET BUFFER ADDRESSF# MOV (R1),(R3) ; RESET BYTE COUNTR  SEC ;  RETURN ;"20$: TSTB (R1) ; TEST BIT READY  BMI 40$ ;3  DEC R2 ; BNE 10$ ; LOOP AGAIN SEC ; SET BIT CARRYD30$: MOV R0,U.BUF+2(R5) ; SAVE ADDRESS OF NEXT BYT00z<|tt tfDATAE IN USER BUFFER .IFT3; MOV @KISA6,U.BUF(R5) ; SAVE MAPPING INFORMATION ; BM380M ;**-1 .ENDC  RETURN ;135$: TST -(R3) ; ADJUST TO PRINTER STATUS WORD(K40$: BIT #FORM!LFCT!BHLD!BLCT,(R3) ; FORM, LINE FEED, BYTE HELD, OR BLANKF BEQ 50$ ; IF EQ, NOT, BIT #BLCT,(R3) ; ANY BLANKS TO BE OUTPUT? BNE 80$ ; IF NE, YES7 BIT #BHLD,(R3) ; BYTE HELD BACK FOR CARRIAGE RETURN?A BNE 65$ ; IF NE, YES+ BIT #FORM,(R3) ; FORM FEED TO BE OUTPUT?O BNE 60$ ; IF NE, YES+ SUB #LFBT,(R3)+ ; REDUCE LINE FEED COUNT + MOVB #12,R2 ; SET TO OUTPUT A LINE FEED  BR 100$ ;C050$: TST U.CNT(R5) ; ANY MORE BYTES TO OUTPUT? BNE 70$ ; IF NE, YES2 BIT #CRTY,(R3) ; CARIAGE RETURN AT END OF LINE? BEQ 30$ ; IF EQ, NO. BIC #CRTY,(R3)+ ; CLEAR CARRIAGE RETURN BIT1 MOVB #15,R2 ; SET TO OUTPUT A CARRIAGE RETURNB  BR 100$ ; ,60$: BIC #FORM,(R3)+ ; CLEAR FORM FEED BIT+ MOVB #14,R2 ; SET TO OUTPUT A FORM FEEDE  BR 100$ ;O;65$: BIC #BHLD,(R3) ; CLEAR BYTE HELD FOR CARRIAGE RETURNF% MOVB 3(R3),R2 ; RETRIEVE HELD BYTET  BR 150$ ; 570$: MOVB (R0)+,R2 ; GET NEXT BYTE FROM USER BUFFER  .IF DF M$$MGE' BIT #20000,R0 ; OVERFLOW 4K BOUNDRY?E BEQ 75$ ; IF EQ, NOB% BIC #20000,R0 ; CLEAR OVERFLOW BIT+4 ADD #200,@KISA6 ; UPDATE RELOCATION BIAS ; BM380 ;**-1 .ENDC+75$: DEC U.CNT(R5) ; DECREMENT BYTE COUNTR CMPB #177,R2 ; RUBOUT? BEQ 50$ ; IF EQ, YES, TST (R3)+ ; ADJUST TO HORIZONAL POSITION  CMPB #11,R2 ; HORIZONAL TAB? BNE 90$ ; IF NE, NOI3 MOVB (R3),-(SP) ; GET CURRENT HORIZONAL POSITION;< BIS #177770,(SP) ; CALCULATE BLANK COUNT TO NEXT TAB STOP NEG (SP) ;$ BIS (SP)+,-(R3) ; SET BLANK COUNT&80$: DEC (R3)+ ; REDUCE BLANK COUNT' MOVB #' ,R2 ; SET TO OUTPUT A BLANKE%90$: BHI 110$ ; IF HI, OUTPUT BYTE1$ CMPB #15,R2 ; LF, CR, VT, OR FF? BLO 110$ ; IF LO, NO CMPB #13,R2 ; VERTICLE TAB?5 BEQ 110$ ; IF EQ, YES3-100$: CLRB (R3) ; CLEAR HORIZONAL POSITION,  BR 120$ ; 0110$: CMPB (R3),U.CW4(R5) ; CARRIAGE OVERFLOW? BHIS 35$ ; IF HIS, YES, INCB (R3) ; INCREMENT HORIZONAL POSITION"120$: TST -(R3) ; LS11 PRINTER? .IF DF L$$11R BMI 150$ ; IF MI, YES+" CMPB R2,#15 ; CARRIAGE RETURN? BHI 130$ ; IF HI, NO BEQ 160$ ; IF EQ, YESI CMPB R2,#14 ; FORM FEED? BEQ 140$ ; IF EQ, YESB CMPB R2,#12 ; LINE FEED? BEQ 140$ ; IF EQ, YES5130$: BIT #CRJT,(R3) ; CARRIAGE RETURN JUST OUTPUT?R BEQ 150$ ; IF EQ, NO: BIS #BHLD,(R3) ; SET BYTE HELD BACK FOR CARRIAGE RETURN& MOVB R2,3(R3) ; SAVE BYTE HELD BACK/ MOVB #15,R2 ; SET TO OUTPUT CARRIAGE RETURN :140$: BIC #CRJT,(R3) ; CLEAR CARRIAGE RETURN JUST OUTPUT .IFTF; +; TEST THE PRINTER CASE INDICATION IN CW2 &; IF IT DOES NOT INDICATE LOWER CASE-; FORCE LOWER CASE CHARACTERS TO UPPER CASE ;150$:2- BIT #LOWER,U.CW2(R5) ; LOWER CASE PRINTER?' BNE 155$ ; IF NE, YES, SKIP CONVERTJ CMPB #141,R2 ; 'a' OR ABOVEQ BHI 155$ ; IF HI, NO$ CMPB #172,R2 ; YES, 'z' OR BELOW BLO 155$ ; IF LO, NO  BIC #40,R2 ; YES, CONVERT IT#155$: MOVB R2,2(R1) ; OUTPUT BYTE$ JMP 5$ ; GO AGAINR .IFTU8160$: BIS #CRJT,(R3) ; SET CARRIAGE RETURN JUST OUTPUT  JMP 5$ ; .ENDC;S.; SUBROUTINE TO WAIT FOR THE KMC TO BE READY;T ; INPUTS:C ;$ ; R5 = UCB ADDRESS OF THE PRINTER$ ; R4 = SCB ADDRESS OF THE PRINTER ; ; OUTPUTS:;R; R0 = KMC CSR ADDRESSO .IF DF K$$MLP2WTKMC: MOV @S.KTB+2(R4),R0 ; GET KMC CSR ADDRESS$ BIS #RQI,(R0) ; REQUEST KMC INPUT*10$: TST (R0) ; IS THE KMC-11 RUNNING ?0 BPL 20$ ; IF PL, KMC NOT RUNNING - POWERFAIL$ BIT #RDYI,2(R0) ; READY BIT SET ?' BEQ 10$ ; IF EQ, NO, WAIT SOME MORE& BIC #RQI,(R0) ; CLEAR REQUEST INPUT RETURN ; YES, BO BACK;G; WE WERE WAITING FOR THE KMC BUT THE KMC IS NOT RUNNING. THEREFORE,DL; WE WILL GO TO THE POWERFAIL CODE WHICH00{cccc WILL REQUEST THE MICROCODE LOADERJ; TO RELOAD THE MICROCODE TO THE KMC. IF UNSUCCESSFUL, WE WILL CONTINUE ; PRINTING WITHOUT THE KMC.I!;"?#20$: BIS #PWRFLG!RQINPR,U.CW2(R5) ; SET POWERFAIL IN PROGRESSN/$ TST (SP)+ ; WE WON'T BE RETURNING TO CALLERY(% MOV S.KTB+2(R4),R2 ; GET KRB ADDRESS"& MOV KMCCTB,R3 ; GET CTB ADDRESS&' JMP LKPWF0 ; FINISH IN COMMON CODE( .ENDC ; DF K$$MLP)* .ENDHE KMC BUT THE KMC IS NOT RUNNING. THEREFORE,DL; WE WILL GO TO THE POWERFAIL CODE WHICH .TITLE TTLH .IDENT /X02.32/; ; Authors: BEN LEVIN 14-JUN-84; Tony LekasR;;; X02.04 4-Feb-85 GDS '; Raise priority before calling TTSETR ; ; X02.05 5-Feb-85 GDS+ ; Raise priority before calling FORK alsoT ;E ; X02.06 7-Feb-85 GDSE=; Create new routine for fork calls - use S.KRB+22 for flag.;; to call new entry in TTSET called TTSET1 which will putU5; the terminal driver fork block on the fork queue.S;A; X02.07 7-Feb-85 GDS; Make fork routine work!!!T; No longer need S.KRB+22;u; X02.08 8-Feb-85 GDS4#; Raise priority for call to ODON4;b; X02.09 20-Feb-85 GDS7; Raise priority before calling ICHAR1,MANS, and MHUPa;r; X02.10 27-Feb-85 GDS-; Must save R4 and R5 before calling TTSET1wA; Don't stop taking input into type ahead buffer after receive n; stopped state  ;1!; X02.11 16-Apr-85 GDSE"; Don't bother to check S2.CTS before filling slots. Servers shouldE#; be using credits to control data flow, and we don't always see an$$; XON. This will cause us to hang!,%; (S2.CTS will be cleared at LHSTOX entry)&;eF'; Allow optional parameter of terminal number requested to be passedC(; on start session. A value of zero means next available terminali); may be assigned.*;t+; X02.12 19-Apr-85I,; Change LHLPAR routine to not create a Data_b slot if nothing is being--; changed ( R1 =0)1.; Reduce size of LHLPAR routine and remove BPT.s/;l0; X02.13 22-Apr-85G1; Include fix to $LHOUT routine to check for Data_B slots in transmitc 2; list. 3;3; X02.14 19-FEB-86 EMcK3; Easiest fix for LAT/CTERM bug. Instead of toggling TT's online/offlineuJ3; when we're using them toggle the US.DSB bit (enable read/write). ThisF3; way we'll get our IO.HNG when a user DIS SESS ALL from the server.3;L3; X02.15 21-MAR-86 EMc03; Do not return error on CON ONLINE for units.3;)3; X02.16 21-MAR-86 EMc*3; Set US.DSB bit at CON ONL entry point.3;p#3; X02.17 18-MAR-86 S. R. Cloutiern(3; Add error codes for LAT V5.1 SupportE3; Fix unit select algorithim in $LHSTS to look for unit # correctlyRA3; Add code to return proper error code if error occurs on starti3;e"3; X02.18 1-APR-86 S. R. Cloutier=3; Do not allow start session if NCT has terminal attached. S3; "3; X02.19 8-MAY-86 S. R. Cloutier:3; Reset terminal on disconnect, if application termional3;#3; X02.20 19-JUN-86 S. R. Cloutier <3; Streamline calling sequence to LAT process in initiating-3; connection from LAT application terminal.53;p;3; Add $LHGTD entry point for starting output to Implicit i/3; connections for Lat Application Terminals..o3;e#3; X02.21 23-JUN-86 S. R. Cloutier <3; Add LHDET routine called from TTATT upon DET function to:3; check if terminal session (application only) should be3; disconnected upon detach.n3; !3; X02.22 25-JUN-86 Dale Donchinl<3; fix PRNTO to calculate available buffer space correctly!3; Fix CLEAN to clear UL.NOD 3;t#3; X02.23 26-JUN-86 S. R. Cloutierc=3; Use high 4 bits of U.CREN as Link Status extension, since $3; credits can only be 4 bits long.3;a3; "3; X02.24 7-JUL-86 S. R. Cloutier3;-A3; Make changes to support LE.HIP (Hangup in progress) Sub-staten:3; to prevent loss of data during IO.HNG operations, with,3; data still to be sent to terminal server3;#3; X02.25 23-JUL-86 S. R. Cloutierl3; -3; Change PRNTO to do nothing if U.TOC is 0.o3;l#3; X02.26 31-JUL-86 S. 00<|tt tfDATAR. Cloutier3;@3; Add more Process Request codes for lat application terminals3;n#3; X02.27 31-JUL-86 S. R. Cloutiert3; 83; Add $LHTMO - Implicit connection timed out or error.3;u"3; X02.28 1-AUG-86 S. R. Cloutier3;E-3; Fix $LHSTP to not corrupt location 0 !!!!e3;l"3; X02.29 4-AUG-86 S. R. Cloutier3;hF3; Change HLMTIM to call LAT process to mark a session for disconnect3; during H.I.P. State!3; Make LTPRC entry point global.3;s3; X0230 20-NOV-86 K. L. NoelS3;CC3; KLN026 -- Make sure LAT lines which are still logged in are notn3; given away3; "3; X0231 1-APR-87 S. R. Cloutier3;E3; SRC -- Add code to start LAT output on a LAT Application Terminal8:3; if output is Non-task in nature (such as a FLF or ^Z)3;a$3; X0232 18-MAY-87 S. R. Cloutier3;RC3; SRC -- do not start session in $LHSTS if terminal is a reserveds3; LAT Application TerminalH3; @3; Don't hang up terminal on 2nd IO.HNG, let lat process finish3; output or time out.4 05; 96; Controller-Dependent routine for LH Device (LAT HOST) 7; G8; LH devices are considered to be remote terminals, connected through G9; the LAT-multiplexer and are always setup in the data base as remote-:; terminals.;;a <; LH port data base structure:H=; LH port belongs to a 'TT' device and has its own DCB (Generic device>; name is 'TT').1?; LH port data base has one contigious SCB/KRB.oB@; LH controller has a CTB, linked to CTB list ($CTLST) and has a4A; generic controller name (L.NAM) 'LH' (LAT host).B;i C; Calls:D; From port to process: 2E; The SCB/KRB block will contain two words with:F; LAT process bias/virtual address. $MPPRO routine willG; map and call it.rH; From process to port:a;I; The first address in the driver dispatch table for the'<J; LH controller will be used by LCP to set up the calling%K; information for the LAT process.tL;sMN .IF DF T$$LTHOP;a!Q; UCB Extentions for LH devices)!R; -----------------------------n"S ; Status/control informationT; U.LINS ; Link status:T; U.CREN ; Transmit credits counter (low 4 bits) ;SRC:T ; Link Status Extension (High 4 bits of U.CREN) ;SRC-V ; Server/circuit identification ;**-1 WX; U.SRVN ; Server numberY; U.SESN ; Session numberh!Z ; Parametrs on receive data [ \; U.RSBB ; Receive slot bias*]; U.RBHA ; Receive slot header virtual#^; U.RSDV ; Receive data virtuale%_ ; XMT intermediate buffer chain-`#a; U.TRLH ; XMT listhead addressl+b; U.TRSC ; XMT remained bytes in buffer 'c; U.SLSZ ; Maximum slot size on XMT4d ; Virtual circuit CCBae%f; U.CCBA ; CCB address (low core)gh;e(i; Link Status Word U.LINS word in UCBj; ----------------k;#########################l;modify UCBDF for these %m; UL.TRS=1 ; 1-XMT stopped, 0-Notc%n ; >255 Char. for slot. Hold it.so(p; UL.TDA=2 ; 1-XMT data avail, 0-Not'q ; Data in XMT queue (set by port)er.s UL.XON=4 ; 1-Notify the process of an XON+t ; 0-Notify the process of output datau)v; UL.RDA=10 ; 1-RCV data avail, 0-Not 'w ; Data in RCV queue (set by proc);x1y UL.NTO=20 ; 1-Non task output pending, o-Notdz6{ UL.NOD=40 ; 1-ODONE call defered because too much"| ; data was buffered, 0 - Not}'~; UL.RSS=100 ; 1-RCV stopped, 0-Not' ; RCV stopped by TTDRV on receive! ; if no resources available,'; UL.LEN=200 ; 1-Link enable, 0-Nott' ; toggled by start/stop link calle; >; Link Statue Extension bits (High 4 bits of U.CREN) ;SRC; ;SRCa+;LE.HIP=20 ; hangup in progress ;SRCs1 ; set if LHMTIM is called by terminal ;SRCt. ; driver before all available data ;SRC' ; has been sent to server. ;SRCa3 ; subsequent I/O will not complete until ;SRCs3 ; data has been sent, and bit is cleared ;SRCv ; ;SRCe/;LE.TDC=40 ; Transmit data completed ;SRC / ; Bit set during00{cccc .HIP when the data ;SRCk( ; has all been transmitted. ;SRC ; ;SRCU/;LE.CIP=100 ; Connection in progress ;SRC 4 ; Bit set when a connection to a terminal ;SRC2 ; server is pending. Set after output ;SRC: ; has been attempted to a Lat Application Term, ;SRC6 ; but no connection has been established to ;SRC4 ; the terminal server associated with the ;SRC ; terminal. ;SRC ; ;SRCs<LE.ORG=200 ; Bit set by $LHSTS if connection result ;SRC- ; of IO.ORG (Explicit connection) ;SRCd ; ;SRC ; ;SRC=; ;SRCi; Error Codes ;SRC; ----------- ;SRCM; NOTE: Do not change there codes without checking LAT process module ;SRCeF; LATPRT. Some of there codes are common to both, and are not ;SRCC; globaly defined. Adding a code will not cause a problem. ;SRCw ;SRCER$SUC=0 ; Sucess ;**-2 %ER$MLE=-1 ; Maximum links exeededL$ER$IDN=-2 ; Incorrect identifyer%ER$SYN=-3 ; Synchronization errord(ER$UDC=-4 ; Undefined operation code*ER$NDR=-5 ; No data ready for transmit'ER$LND=-6 ; LH data base not loadedO%ER$NRR=-7 ; No receive data readyh%ER$OVR=-10 ; Data overrun occuredA'ER$SIU=-11 ; Service In Use ;SRCb*ER$PNU=-12 ; Port Name Unknown ;SRC,ER$SNO=-13 ; Service Not offered ;SRC; ;**-1(; Process-to-Port Call Operation Codes(; ------------------------------------PR$STS=0 ; Start sessionPR$RCV=2 ; ReceivePR$XMT=4 ; Transmit-PR$DSC=6 ; Stop sessione9PR$GTD=10 ; Get transmit data for app. terminal ;SRC BPR$TMO=12 ; Connect request timed out in implicit connect ;SRC; ;**-1#; Port-to-Process Operation CodesS#; ------------------------------- +PO$DSC=0 ; Stop session ("BYE" by task);*;PO$FLO=2 ; Flow control status change!;PO$HST=2 ; Host sync toggleda%;PO$TST=4 ; Terminal sync toggeld-PO$XON=6 ; XON-;PO$XOF=10 ; XOFF (possible data overrun)PO$ABO=12 ; Abort outputPO$OUT=14 ; Start output5PO$MSD==16 ; Mark a session for disconnect ;SRCBPO$CNT=20 ; initiate implicit connection from terminal ser;SRC5PO$ORG==22 ; ininate connection from IO.ORG ;SRCS(PO$GQD==24 ; Get QUEUE depth ;SRC2PO$MAP==26 ; Set/Get Mapping parameters ;SRC; ;**-1; 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; -----------------r6BF$NOR=0 ; Normal data. Includes non task output.$BF$RPR=1 ; IO.RPR Prompt string.(BF$FLO=2 ; Flow control information.;I$; Maximum number of queued buffers$; --------------------------------;M MAXBUF=4;S;+++; % .MCALL DCBDF$,UCBDF$,CTBDF$,SCBDF$s .MCALL UCBDF$,CCBDF$- DCBDF$ ; Define DCB UCBDF$ ,,TTDEF ; Define UCBu CTBDF$ ; Define CTB SCBDF$ ; Define SCB CCBDF$ ; Define CCB t .PSECT MAP6;-D; $LHGTD - Get transmit data from task, and start output. ;SRCI; this is called by LAT process upon terminal server establishing ;SRCoP; connection to Lat Application Terminal during an IMPLICIT connection. ;SRCJ; Completion of I/O is delayed until connection is established and ;SRC#; must be re-started.. ;SRC-; ;SRC -; Inputs: R5 - pointer to U.TSTA ;SRC; ;SRCC.$LHGTD::MOV R1,R5 ; Point to U.TSTA ;SRC& CALL MUCBX ; Map the UCBX ;SRC( TST U.TCO(R4) ; Task output? ;SRC< BNE LHSTAX ; if so, fall through to start output. ;SRC, TSTB U.TOC(R4) ; Non-Task output? ;SRC. BNE LHSTAX ; if NE, yes - go do it. ;SRC5 RETURN ; Else return - could be bad call.. ;SRCa; ;SRCn; ;SRC %; LHSTAX - Start Output Entry PointR; ; Input:A; Registers R2-R5 are standard f00<|tt tfDATAor controller-dependent routine;;!; R2 - Phisical unit number * 2S&; (only if multiplexers in system); +; R3 - CSR address (unused for LH device)C; R4 - UCBX addresso; R5 - Pointer to U.TSTA; ;;T LHSTAX::9 CLRB U.TOTI(R4) ; LAT process deals with timers ;SRCo" MOV R1,-(SP) ; Save R1 ;SRC" MOV R2,-(SP) ; Save R2 ;SRC; ;SRCA BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Lat Application Terminal? ;SRC/ BEQ 7$ ; if EQ - no, normal output.. ;SRCn8 BITB #UL.LEN,U.LINS-U.TSTA(R5) ; link Enabled? ;SRC+ BNE 7$ ; If NE - Yes, continue.. ;SRCs; ;SRC-P; here, we have output, but no link is enabled on an application terminal ;SRCL; We must call the LAT process, and try to establish the connection. ;SRC; ;SRCD BISB #LE.CIP,U.CREN-U.TSTA(R5) ; Show connection in progress ;SRCD BISB #US.DSB,U.STS-U.TSTA(R5) ; Toggle read/write so no more ;SRC) ; I/O is possible to this TT ;SRCn) ; until connection completes ;SRC./ MOV #PO$CNT,R3 ; show connect reason ;SRC + CALL LTPRC ; call LAT process.. ;SRC + MOV (SP)+,R2 ; Restore Registers ;SRCn MOV (SP)+,R1 ; And ;SRCr RETURN ; Return ;SRCe ;SRC7$: ;SRCc; ;SRC% ; Buffer chain in U.TFOB ;SRCN* ; Check high priority output ;**-48 BIT #S5.HPC,U.TST5-U.TSTA(R5) ; High priority output? BEQ OUTPUT ; Branch if not& ; XON or XOF bits set. Let lat( ; know and exit (no odone call!)2 BIT #S5.XOF,U.TST5-U.TSTA(R5) ; Output an XOFF? BEQ 10$ ; Branch if notM5 BIC #S5.XOF,U.TST5-U.TSTA(R5) ; Yes-clear XOFF bitR7 BISB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED on link ! BR IODON ; All done for now; ; Not XOFF, must be XONr;n410$: BIC #S5.XON,U.TST5-U.TSTA(R5) ; Clear XON bit7 BICB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED clearedo7 BISB #UL.XON,U.LINS-U.TSTA(R5) ; Set reason for forkO& BR DOFORK ; Jump to call process0OUTPUT: ; Continue normal priority output: BICB #UL.XON,U.LINS-U.TSTA(R5) ; Settup reason for fork! TST U.TCO(R4) ; Task output?Y( BNE 5$ ; If NE yes - go process it* CALL PRNTO ; Process non task output BR DOFORK ; And exit5$: ;SRCO@ MOV U.TRLH-U.TSTA(R5),R1 ; R1-XMT buffers chain starts ;**-1/ BEQ 30$ ; Branch if there is no XMT chaina+10$: TST (R1) ; There is an XMT chain-  BEQ 20$ ; Find end ofK MOV (R1),R1 ; XMTs BR 10$ ; Chain:20$: MOV U.TFOB(R4),(R1) ; Link new chain to XMT chain( BR 50$ ; And go to stamp new chainF30$: MOV U.TFOB(R4),U.TRLH-U.TSTA(R5) ; No XMT chain-create it (link# ; new buffers to xmt chain) $ ; Stamp all new chain with 0! ; In the left byte of the.& ; Second word-don't deallocate ; this buffer in LHOUT950$: MOV U.TFOB(R4),R1 ; R1-first buffer in new chainn2 MOV #BF$RPR,R3 ; Assume that this is a prompt@  BIT #S5.RPO,U.TST5-U.TSTA(R5) ; Is prompt output in progress?!  BNE 60$ ; If NE yes - go on   ASSUME BF$NOR,0$  CLR R3 ; This is normal output+  CLR U.TFOB(R4) ; Take the buffers fromi ; the class driver,60$: MOVB R3,3(R1) ; Set the buffer type TST (R1) ; Last buffer?e- BEQ 100$ ; If 0-YES, chain done, branche* MOV (R1),R1 ; If not-get next buffer BR 60$ ; And repeate(100$: CLR U.TOP(R4) ; First buffer=0& CLR U.TOC(R4) ; Remaining bytes=06 BISB #UL.TDA,U.LINS-U.TSTA(R5) ; Set XMT-DATA-AVAIL DOFORK:$$ CALL PRIFRK ; Do priority fork#IODON: MOV (SP)+,R2 ; Registers  MOV (SP)+,R1 ; And ' MTPS #TTPRI ; Raise to priority 5 ) SAVNR ; Save and restore R4 and R5S+ CALL TTSET1 ; Go put TT fork block onf  ; fork queue if needed! MTPS #0 ; Back to zero " RETURN # t$;nA%; Called by terminal driver on IO.KILL. All data in XMT buffers <&; will be lost. LAT processor will be 00{cccccalled to cancel all,'; pending transmit and receive operations.(; )LHABOX::'* CALL CLEAN ; Clean up the buffersO(+ MOV #PO$ABO,R3 ; Param-abort output#, CALL LTPRC ; Call LAT process - RETURNi-; ;SRC . S/;n60; Terminal driver calls to do a time-out processing.A1; This entry point will be called on IO.HNG or "BYE" command to /2; disconnect link and logoff remote terminal.n2; ;SRCLI2; If and transmit data is still outstanding, the session is marked ;SRCtK2; for hangup (HIP) in the status extension. The LAT process is then ;SRCK2; called to mark the session block disconnect in progress (DIP), the ;SRCuK2; IO.HNG or IO.DET I/O packet is saved and a return is executed back ;SRC82; to PPHNG in TTATT, which calls this routine. ;SRCI2; The terminal is disabled from receiving any new data I/O packets ;SRC2; (US.DSB set). ;SRCr2; ;SRCL2; Once all the transmit data has been sent to the server, the session ;SRCK2; block is cleaned up, the session is disonnected, and the IO.HNG or ;SRCs02; IO.DET is finished ($IOFIN called). ;SRC2; ;SRCoJ2; If this routine is called a 2nd time, for any reason, the session ;SRC-2; is unconditionaly disconnected. ;SRC,2; ;SRCo2; ;SRC $2; INPUTS: IF DF T$$OVL ;SRC&2; R5 - U.TSTA of terminal ;SRC2; ;SRC;42; 6(SP) = IRP Address of IO.HNG or IO.DET ;SRC(2; 4(SP) = Return PC in PPHNG ;SRC&2; 2(SP) = KINAR5 or TTATT ;SRC(2; (SP) = Return PC in MPROT ;SRC2; ;SRCi2; .IF NDF T$$OVL ;SRC&2; R5 - U.TSTA of terminal ;SRC2; ;SRCi42; 2(SP) = IRP Address of IO.HNG or IO.DET ;SRC(2; (SP) = Return PC in TTATT ;SRC2; ;SRC 2LHMTIM:: ;SRCDF2 BITB #UL.TDA,U.LINS-U.TSTA(R5) ; is there transmit data avail? ;SRC.2 BEQ 5$ ; if EQ - no, hang up line.. ;SRC=2 BITB #LE.HIP,U.CREN-U.TSTA(R5) ; Hangup In progress? ;SRC(,2 BNE 5$ ; if NE - yes, hang it up! ;SRC@2 BISB #LE.HIP,U.CREN-U.TSTA(R5) ; show hangup in progress ;SRC:2 BISB #US.DSB,U.STS-U.TSTA(R5) ; Toggle read/write ;SRC2 ;SRC2 .IF DF T$$OVL ;SRC2 ;SRC-2 MOV 6(SP),R0 ; Recover IRP address ;SRC)2 CLR 6(SP) ; Clear IRP address ;SRC2 ;SRC2 .IFF ;T$$OVL ;SRCa2 ;SRC-2 MOV 2(SP),R0 ; Recover IRP address ;SRC )2 CLR 2(SP) ; Clear IRP address ;SRCa2 ;SRC2 .ENDC ;T$$OVL ;SRC2 ;SRC82 MOV #PO$MSD,R3 ; Function - Mark SES disconnect;SRC/2 CALL LTPRC ; Call LAT process direct ;SRCT,2 TST R0 ; Did LAT take I/O packet? ;SRC02 BEQ 20$ ; if EQ, yes - Let LAT try to ;SRC)2 ; send remaining data before ;SRC2 ; hanging up line ;SRC 2 .IF DF T$$OVL ;SRC2 ;SRC-2 MOV R0,6(SP) ; Recover IRP address ;SRCe2 ;SRC2 .IFF ;T$$OVL ;SRCa2 ;SRC-2 MOV R0,2(SP) ; Recover IRP address ;SRCS2 ;SRC2 .ENDC ;T$$OVL ;SRCA2 BICB #LE.HIP,U.CREN-U.TSTA(R5) ; Clear Hangup in Progress ;SRC 2; ;SRCT;25$: MOV #PO$DSC,R3 ; Function code-disconnect line ;SRC,%27$: MOV R1,-(SP) ; Save R1 ;SRCe:2 BICB #17,U.CREN-U.TSTA(R5) ; Clear credits field ;SRC0< CALL LTPRC ; Call LAT process direct ;**-9+= MOV R5,R1 ; R1-UCB address for $LHSTP;,> CALL $LHSTP ; Stop line-will call MHUP? ; And clear the lineE? BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Is this a Lat Application Term;SRC;)? BEQ 10$ ; if not, just return ;SRCU+? MOV #-1,R3 ; Set up R3 for call ;SRC*? CALL LHST1 ; Reset terminal... ;SRC.?10$: MOV (SP)+,R1 ; Restore register ;SRC?20$: RETURN ;SRCB ;**-2UC;(GD; Line parameters have changed. Only flow control change informationeFE; is processed for now. A buffer will be allocated and the info put F; in it.G;l HLHLPAR::I MOV R1,-(SP)a,J BEQ 40$ ; If EQ, Nothing b00<|tt tfDATAeing changedK MOV R0,-(SP)pL MOV R2,-(SP);(M CALL ALTB ; Allocate T$$BFL buffer/N BCS 30$ ; If CS, No buffer - report error#O ; Link word cleared in ALTB &P MOVB #BF$FLO,3(R2) ; Set the type.Q MOVB R1,4(R2) ; Fill in the control flags-R MOV U.SCB-U.TSTA(R5),R0 ; Get SCB addressa9S MOVB S.KRB+6(R0),2(R2) ; Fill in the Data_b slot sizesT1U MOV R5,R0 ; Compute address of buffer chaintV ADD #U.TRLH-U.TSTA,R0 ; ...W10$:-X TST (R0) ; Any link? (Also clear carry)a)Y BEQ 20$ ; If EQ, End of chain found,Z MOV (R0),R0 ; Get next buffer in chain+[ BR 10$ ; Loop till end of chain found\20$:$] MOV R2,(R0) ; New end of chain^30$:%_ MOV (SP)+,R2 ; Restore registers ` MOV (SP)+,R0 ; ...aa40$:b MOV (SP)+,R1 ; ... c RETURN ; Returnde;(@e; If CON ONL set the write disabled bit and let it rip. ;EMCFe; If CON OFF return an error so nobody can muck with our TT's. ;EMCe; ;EMC;eLHUONL:: ;EMCrAe BISB #US.DSB,U.STS-U.TSTA(R5) ; disable read/writes on TT ;EMC e RETURN ;EMCjLHUOFF:: ;**-46k MOVB #IE.DNR,$SCERR ; Return error code in $SCERR l RETURNn mLHSTOX::>n BIC #S2.CTS,-U.TSTA(R5) ; We can't be XOFFed fromo ; a server pLHCOFF:: qLHCONL:: rLHCPUP:: sLHUPUP:: tLHPWUP:: uLHRESX::v RETURN ; And exitw p xPRIFRK:y MOV R4,-(SP) ; Save R4s+z MOV #FR.LAT,R3 ; LAT fork mask bit set '{ MTPS #TTPRI ; Raise to priority 5/| CALL FORK ; Queue fork block (R4 altered)t} MTPS #0 ; Back to zero~ MOV (SP)+,R4 ; Restore R4  RETURN  N;EN; Data message received from server. Each UCB contains bias/virtual addressK; of a slot header for that link. The slot header contains the slot data; size byte.;N; Look through UCB chain and send to TTDRV all slots where the "receive data; available" bit is set.;MI; If a slot is done, then the data counter in the slot header will be 0rQ; and the C.STS word in the CCB (number of slots in buffer) will be decrementede ; by 1.(;RH; If "RCV-STOPPED" state is set (TTDRV back-offed with XOFF because ofH; resources allocation failure) data will not be copied from the slot.-; Check RSV-STOPPED on entry and after eacht@; return from ttdrv when outputting a character (ICHAR1 call).I; In this case data slot counter will contain number of characters leftG; in slot, and U.RSDV will contain address (virtual) of the next byte-; to output. C.STS will not be decremented.o; ; Note:lJ; UL.RDA bit is set by lat process only for lines, that have information$; available for current operation.;r ; Input:; None ; Output:o"; R3-status: 0-success, <0-error; R1,R2-Destroyedy; Other registers - preserved ; Usage:'; R5 - U.TSTA address of current UCB ; R2 - LH'S DCB addresst;l $LHINP:: CLR R3 ; Assume successn! CLR R2 ; First entry in DCBe(10$: CALL FNDUCB ; Find next LH UCB TST R5 ; Next UCB found? BNE 20$ ; Branch if yesR ; No more UCBS RETURN ; And exit*20$: ; R5-next (first) UCB'S U.TSTA0 BITB #UL.LEN,U.LINS-U.TSTA(R5) ; Link enable? BEQ 10$ ; No-get next UCBr; BITB #UL.RDA,U.LINS-U.TSTA(R5) ; Receive data available?  BEQ 10$ ; No-get next UCBo;rE; The following code can be used when the LAT architecture providesAH; a way to send the XOFF charcter to stop the server from sending moreH; data. Meanwhile, the LAT Process tests this bit, and will not extendG; any more credits to the server until it is cleared. Note - there is A; still room in the typeahead buffer for a few more characters! ;k>; BITB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED on that link?; BEQ 25$ ; No-copy slota ; BR 10$ ; And get next UCB)25$: ; UCB found-prepare copy slots$ MOV R2,-(SP) ; Save DCB address8 MOV U.RBHA-U.TSTA(R5),R1 ; R1-slot header V.A. start4 ADD #SL$SBC,R00{cccc1 ; R1-slot size byte virtual addr( MOV R1,R4 ; Save it (needed later)- MOV #-1,R2 ; R2<0 (get char. operation)r/ CALL GCHR ; Returns R2-slot size on righth CLR R0 ; Prepeare R0 BISB R2,R0 ; R0-slot sizeS7 MOV U.RSDV-U.TSTA(R5),R1 ; R1-slot data virt. start5*30$: ; Loop-move slot char. in loop- MOV #-1,R2 ; R2<0 (get char. operation)y- CALL GCHR ; Get character (R2 on right)" MOV R0,-(SP) ; Save registers MOV R1,-(SP) ; MOV R4,-(SP) ;1' MTPS #TTPRI ; Raise to priority 54/ CALL ICHAR1 ; Move char. from R2 to TTDRVR MTPS #0 ; Back to zero% MOV (SP)+,R4 ; Restore registers  MOV (SP)+,R1 ;; MOV (SP)+,R0 ; & INC R1 ; Point to next character= BITB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED on that link?o BNE 40$ ; Yes-process it& SOB R0,30$ ; Copy all characters135$: MOV U.CCBA-U.TSTA(R5),R2 ; R2-CCB address* CLR U.CCBA-U.TSTA(R5) ; Show slot done, DEC C.STS(R2) ; Decrement slots counter@ BICB #UL.RDA,U.LINS-U.TSTA(R5) ; Clear receive data available;tK; When the entire slot has been processed do not update the slot counter. G; This is not necessary and it allows the LAT process to use one slott*; for multiple start session slots.;C# BR 50$ ; Slot done-process it "40$: ; Slot done or stopped) DEC R0 ; Was not decremented by SOBA+ BEQ 35$ ; Branch if it is really doneS9 MOV R1,U.RSDV-U.TSTA(R5) ; Store current data virtualo0 MOV R4,R1 ; Restore slot data counter addr% MOV R0,R2 ; R2>=0-put operationh, CALL GCHR ; Put counter in slot header+50$: MOV (SP)+,R2 ; Restore DCB addresse$ CLR R3 ; Return status-success BR 10$ ; Get next UCBp a;#########################;update comments;p>; The port scans the UCB chain to find the corresponding UCB?; (session/server IDS) and fills the output buffer. The scane'; starts from the specified UCB (R1).;;eD; After filling each slot the credits counter is decremented by 1.C; If the credits counter is 0, no information will be transferredn2; to the output buffer for this particular link.;dE; Operation fills the output buffer according to next set of rules:C>; - Go through all UCBs and fill all slots for UCBs with the; UL.TDA bit set;e7; - Stop when there is no more room in output buffer;rB; - If there is room in the buffer after the path through all ofA; the UCBs has been made and there is XMT-STOPPED links startt/; again if there are any credits available;sG; - the message is filled until the message maximum length is reachedf.; or until all of the data has been moved.;l ; Input:F; R1 - UCB address to start scanning or 0 (start from the beginning); R2 - Server number$; R4 - Address of CCB, containing:; Buffer bias C.BUFo7; Buffer virtual addr C.BUF+2 -After message header .; Buffer length C.CNT -Without MSG header0 ; Maximum slot length to fill out is in U.SLSZ ;t ; Output: * ; R1 - UCB address were scan was stopped ; R2 - Server numberM; R3 - Status: 0-success, >0-number of links in XMT-STOPPED state, <0-errorb$; R4 - Address of CCB, containing:; Buffer bias C.BUFn6; Virtual end of data C.BUF+2 (next available byte); Remaining in buffer C.CNT;n; ; Note: C; U.TRSC, U.TRSA and UL.TDA are cleared when all of the XMT chain K; has been copied into the output buffer and all XMT buffers deallocated.f;u ; Note:L%; Register 1 is used as a bit mask:dA; - Bit 1 is set if R1, provided on call from LAT process::; contained address of the UCB in the middle of the UCB:; chain or terminal driver call LHSTAX from ODONE call.;; In that case we need to repeate loop once more.)C; - Bit 2 is set if any of the links has a transmit credit.  ;A!;U "$LHOUT::# MOV R1,-(SP) ; Save R1i$ MOV R2,-(SP) ; Save R2t%*& CLR R3 ; Prepare XMT stopped counter00<|tt tfDATA'' CLR R2 ; Start from the beginnings1( CALL FNDUCB ; Ret. DCB (R2) & 1-st UCB (R5) 0) CMP R1,R5 ; LAT calls with 1-st UCB in R1?* BNE 1$ ; Branch if not$+ CLR R1 ; Yes-clear R1 bit mask*, BR 15$ ; And go to process first UCB'-1$: ; Not 1-st UCB in R1 on callp&. TST R1 ; LAT calls with 0 in R1?./ BEQ 15$ ; Yes-start proc. First UCB (R5)(0 ; R1 not EQL 1-st UCB, and not 0$1 ; -LAT calls with UCB in the!2 ; Middle of the UCB chainp,3 MOV R1,R5 ; In R5-UCB address to start)4 MOV #1,R1 ; Set repetition bit mask #5 BR 15$ ; And process that UCB 6'72$: ; Look through all UCB chaina8 CLR R2 ; Start from firste9 CLR R1 ; Clear bit maskA":5$: ; Continue through UCBs$; CALL FNDUCB ; Next (first) UCB< TST R5 ; All UCBs done?R+= BNE 15$ ; No-continue processing UCBS >? ; All UCBs processed/@ BIT #1,R1 ; Do we have request to repeat?e+A BNE 2$ ; Yes-start from the beginningRB ; And clear all maskC"D ; At least once we alreadyE ; Processed all UCBs+F TST R3 ; Any links have been stopped?o$G BEQ 10$ ; No-all done, get outH!I ; There are stopped linkst(J BIT #2,R1 ; Any link has a credit?,K BNE 2$ ; Yes-repeat from the beginningL ; No-get outM,N10$: ; All done-went through all UCBS%O ; No XMT stopped links, or noT$P ; More credits, or buffer isQ ; Full-returnsR MOV (SP)+,R2 ; Restore/S MOV R5,R1 ; UCB address were scan stoppedtT TST (SP)+ ; RegistersrU RETURN ; And exitV5W15$: BITB #UL.LEN,U.LINS-U.TSTA(R5) ; Link enabled?lX BEQ 5$ ; No-get next linkr3Y CMP (SP),U.SRVN-U.TSTA(R5) ; Requested circuit?a Z BNE 5$ ; Not-get next linkZ ;SRCAZ14$: BITB #LE.HIP,U.CREN-U.TSTA(R5) ; hangup in progress? ;SRCl,Z BEQ 114$ ; IF eq - normal output ;SRCCZ BITB #UL.TDA!UL.NTO,U.LINS-U.TSTA(R5) ; XMT data available? ;SRCV0Z BNE 114$ ; if NE, something available ;SRCDZ BISB #LE.TDC,U.CREN-U.TSTA(R5) ; Set Transmit data completed ;SRC%Z BR 16$ ; Format STOP slot ;SRCSZ; ;SRCeBZ114$: BITB #UL.TDA,U.LINS-U.TSTA(R5) ; XMT data available? ;SRC1Z BNE 16$ ; If set -check next condition ;SRCtZ ; UL.TDA not set ;SRCZ ;SRCZ ;SRC>^ BITB #UL.NTO,U.LINS-U.TSTA(R5) ; Did we have stalled ;**-3_ ; non task output?-` BEQ 5$ ; No UL.TDA & no UL.NTO-next UCB;a ; Yes, we did, we did!2b CALL PRNTO ; Try to put it into output queue?c BITB #UL.TDA,U.LINS-U.TSTA(R5) ; Now is there any to output?T"d BEQ 5$ ; If EQ no - next UCBee ;SRCe ;SRCf ASSUME S2.CTS,100000Cg16$:h; Pi; The following lines of code have been commented out because the architectureKj; doesn't allow flow control between server and host with characters, butlOk; instead uses credits to control the flow of data. Therefore, if we have the 'l; the credits, we will send the data.Cm;R0n; TST -U.TSTA(R5) ; XOFFED by user?!o; BMI 5$ ; Yes-get next linktp;a6q; Of course there is a buffer! (Used for debug only)5r; TST C.BUF+2(R4) ; Check if output buffer addr 00!s; BEQ 5$ ; Yes-get next linkn$t ; Test for available credits(u ; Should always be the last test2u MOVB U.CREN-U.TSTA(R5),R0 ; Get credits ;SRCu BIC #177760,R0 ; * ;SRCi+u TSTB R0 ; any credits available? ;SRC &w BLE 5$ ; No-get next link ;**-10x BIS #2,R1 ; Set bit mask-credits availabley ; UCB found (R5)zz; ;SRCt6~ BIT #1,C.BUF+2(R4) ; Slot on even boundary? ;**-3 BEQ 18$ ; Branch if yes4# INC C.BUF+2(R4) ; Make it even1 DEC C.CNT(R4) ; Decrement I/O buffer counterf18$: ;SRC> BITB #UL.TDA,U.LINS-U.TSTA(R5) ; Transmit data avail? ;SRC- BNE 119$ ; if NE, yes - go get it! ;SRC & ; Else must be completion ;SRC ; of .HIP ;SRC> CMP C.CNT(R4),#SL$SDS 00{cccc; I/O buff avail > slot header? ;SRC$ BHI 19$ ; Branch if yes ;SRC? BISB #UL.TRS,U.LINS-U.TSTA(R5) ; Set transmitt stopped ;SRCv BR 10$ ; and exit ;SRC; ;SRCE19$: BICB #LE.HIP,U.CREN-U.TSTA(R5) ; Clear hangup in progress ;SRCO5 BICB #17,U.CREN-U.TSTA(R5) ; Clear credits ;SRC." MOV R3,-(SP) ; Save R3 ;SRC" MOV R2,-(SP) ; Save R2 ;SRC9 SUB #SL$SDS,C.CNT(R4) ; Subtract out slot header ;SRCo6 MOV C.BUF+2(R4),R2 ; Get slot header address ;SRC< ADD #SL$SDS,C.BUF+2(R4) ; Point at next avail. byte ;SRC4 MOV #321,R3 ; Slot type, reason code DIAG ;SRC/ CALL FILSH ; Fill in the slot header ;SRCe% MOV (SP)+,R2 ; Restore R2 ;SRCB% MOV (SP)+,R3 ; Restore R3 ;SRCa" BR 5$ ; Go do next UCB ;SRC ;SRC0119$: ; Copy XMT chain in I/O buffer ;SRC* MOV R2,-(SP) ; Save DCB address ;SRC6 MOV R3,-(SP) ; Save R3 (XMT-STOPPED counter) ;SRC* CLR -(SP) ; Initialize the slot type% ; to zero which is for Data_aF2 MOV C.BUF+2(R4),-(SP) ; Save start of the slot; MOV U.TRLH-U.TSTA(R5),R2 ; R2-first buffer in XMT chain;# ; U.TRSC=0 if new XMT chainV. TST U.TRSC-U.TSTA(R5) ; All new XMT chain? BNE 20$ ; No-branch ; Yes, new chainA MOVB 2(R2),U.TRSC-U.TSTA(R5) ; U.TRSC-bytes in first XMT buffe=20$: CMP C.CNT(R4),#SL$SDS ; I/O buff avail > slot header?( BHI 25$ ; Branch if yesu$ ; I/O buff avail= BITB #UL.TDA,U.LINS-U.TSTA(R5) ; All buffers moved to slot?% BNE 110$ ; If not-no ODONE callsC BITB #UL.NOD,U.LINS-U.TSTA(R5) ; ODONE deferred because too much ; data buffered?! BEQ 105$ ; If EQ no - Go onM< BICB #UL.NOD,U.LINS-U.TSTA(R5) ; Clear defered ODONE flag) CALL PRIFRK ; Do priority fork call,  BR 110$ ; And go ons E 105$: BIT #S5.RPO,U.TST5-U.TSTA(R5) ; Is prompt output in progress?i0  BEQ 110$ ; If EQ no - ODONE already called  ; ODONE processing MOV R1,-(SP) ; Save R1  MOV R4,-(SP) ; Save R4E* CALL MUCBX ; Returns UCBX addr in R4& ; By now S1.DSI is set by fork  BIC #S1.DSI,(R5) ; Clear it" MTPS #TTPRI ; Raise priority/ CALL ODONE ; And call ODONE for that linkl MTPS #0 ; Back to zero8 BIS #S1.DSI,(R5) ; Reset S1.DSI for other processes& ; Remeber-ODONE corr. R2,R3,R4 MOV (SP)+,R4 ; Restore R4 MOV (SP)+,R1 ; Restore R1& ; ODONE could call LHSTAX with ; Output to do1 BITB #UL.TDA,U.LINS-U.TSTA(R5) ; Is that true?E BEQ 110$ ; Branch if not BIS #2,R1 ; Otherwise-" ; Set mask to repeate loop4 110$: MOV (SP)+,R3 ; Restore XMT-STOPPED counter'! MOV (SP)+,R2 ; Restore DCB address " JMP 5$ ; Get next UCBa#&$200$: CMP (SP)+,(SP)+ ; Incr stack/% MOV (SP)+,R3 ; Restore XMT-STOPPED counter '& MOV (SP)+,R2 ; Restore DCB addressr' JMP 10$ ; And exit( r);<*; The LAT process calls this entry point to start session.M+; The initial setup for link follows all of the rules for remote terminals.fJ,; Look through all UCBs to find disabled units and set up all parametrs.-;O .; Input:L.; R1 - Port number requested or zero for next available port -LO BYTE ;SRCB.; R1 - HI Byte - 100000 set if specific port is requested ;SRC..; 40000 Set if solicited connection ;SRC7.; 20000 Set by $LHSTS if specified port found ;SRC 4.; 10000 Set if connection result of IO.ORG ;SRC.; ;SRCt!.; R2 - Server number ;SRC .; 00ҁ{cccc ;SRCl. ;SRC1; Output: ;**-2k2; R1 - Session number 3; R2 - Unchanged"4; R3 - 0 if success, <0 if error5; R5 - UCB address6;q 7$LHSTS::+8 MOV R2,-(SP) ; Save R2 (server number) 49 MOV #ER$LND,R3 ; Assume error (no LH data base)&: CLR R2 ; Prepeare call to FNDUCB4;5$: CALL FNDUCB ; R2=DCB addr (0 on first call)$< ; Returns R2=DCB address (0)= ; R5-First UCB number &> BCS SEXIT ; Exit if no DCB found?@ ; DCB found $@ TST R5 ; Next UCB found? ;SRC%@ BNE 10$ ; Branch if found ;SRCn@; ;SRCU1@ TST R1 ; Were we requesting a specific ;SRC5#@ BEQ 7$ ; If not, branch ;SRCM0@ BIT #20000,R1 ; Did we find our unit? ;SRC#@ BEQ 6$ ; If not, branch ;SRCa0@ MOV #ER$SIU,R3 ; Service in use error ;SRC@ BR SEXIT ; Exit ;SRCr0@6$: MOV #ER$PNU,R3 ; No such port here ;SRC@ BR SEXIT ; Exit ;SRCn;@7$: MOV #ER$MLE,R3 ; Assume error (MAX. lines exeed;SRC @ BR SEXIT ; Exit ;SRC @ ;SRC-@10$: ; UCB found (R5-UCB address) ;SRC 1@ TST R1 ; Does Process want a specific u;SRCc2@ BEQ 15$ ; If EQ, No - give next one avai;SRC?@ CMPB R1,U.UNIT-U.TSTA(R5) ; Is this the unit requested ;SRC *@ BNE 5$ ; If NE, N0 - look again ;SRC0@ BIS #20000,R1 ; Set bit- we found unit ;SRCE@15$: BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Is this Lat App Terminal? ;SRC (@ BEQ 20$ ; If no, just branch ;SRC6@ BIT #40000,R1 ; Is this solicited connection ;SRC1@ BEQ 5$ ; If EQ - no, don't give this TT;SRCo<@20$: BITB #UL.LEN,U.LINS-U.TSTA(R5) ; Link enabled? ;SRC(@ BNE 5$ ; Get next if enabled ;SRCA@ BIT #1,U.CCBA-U.TSTA(R5) ; Reserved Application Terminal?;SRC ,@ BNE 5$ ; if NE, yes - Check next. ;SRC8@ BIT #F4.NCT,$FMASK+6 ; Does system have NCT...? ;SRC2@ BEQ 30$ ; If no, don't check for NCT att;SRC(@ TST $NCTPT+4 ; Is NCT active? ;SRC1@ BEQ 30$ ; If not, no need to check ATT ;SRC1D@ CMP U.ATT-U.TSTA(R5),$NCTPT+4 ; Does NCT have this unit att? ;SRC1@ BEQ 5$ ; If EQ yes, try for another TT:;SRCT@ ; ;SRClJ@30$: BIT #U2.LOG,U.CW2-U.TSTA(R5) ; Is terminal still logged in? ;KLN026#@ BEQ 5$ ; If eq, yes ;KLN026lN .IF DF T$$SPL ;**-13O+P TST U.TAPR-U.TSTA(R5) ; UCBX allocated?D(Q BEQ 5$ ; If EQ this one is no goodRS .ENDC ;DF T$$SPLrT&U ; Found disabled/requested UCB:U MOV (SP),U.SRVN-U.TSTA(R5) ; Store server number ;SRC#U CLR R3 ; Return success ;SRC;RULHST1: BICB #US.OFL!US.PDF,U.ST2-U.TSTA(R5) ; Set unit online and clear priv;SRCAU BICB #US.DSB!US.CRW,U.STS-U.TSTA(R5) ; Toggle read/write ;SRCr4U CLRB U.LINS-U.TSTA(R5) ; clear link status ;SRC8U CLR U.TRSC-U.TSTA(R5) ; Clear XMT queue counter ;SRC6U CLRB U.CREN-U.TSTA(R5) ; Clear credits field ;SRC*U TST R3 ; New session (R3 Clear) ;SRC0U BNE 5$ ; if NE, no - don't set IO.ORG ;SRC#U BIT #10000,R1 ; IO.ORG? ;SRCoU BEQ 5$ ; if EQ, no ;SRC DU BISB #LE.ORG,U.CREN-U.TSTA(R5) ; Set bit in status extension ;SRC>U5$: MOVB U.SESN-U.TSTA(R5),R1 ; Return session number ;SRC(U ; And link status extension ;SRCB] BIC #S2.CTS,-U.TSTA(R5) ; Make sure not XOFFed ;**-72^ BISB #U2.RMT,U.CW2-U.TSTA(R5) ; Set line remote._ BIC #100000,6(R5) ; No autobaud detectionA_ BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Lat Application Terminal? ;SRCE+_ BEQ 10$ ; if EQ - no, call MANS ;SRC1/_ CLR U.TST5-U.TSTA(R5) ; Reset U.TST5 ;SRC;4_ CLRB U.TMTI-U.TSTA(R5) ; Clear modem timer ;SRC-_ BR 20$ ; Continue in common code.. ;SRCR_; ;SRCs1_10$: MTPS #TTPRI ; Raise to priority 5 ;SRCo0a CALL MANS ; Answer the call-sets all ;**-1'b ; Characteristics & line enable,c MTPS #0 ; Back to zeroc; ;SRC0,c20$: TST R3 ; Called from LHMTIM? ;SRC.c BNE RET1 ; if NE - yes, just return ;SRC;c BISB #UL.LEN,U.LINS-U.TSTA(R5) ; Show link enabled ;SRCU+cSEXIT: MOV (SP)+,R2 ; Restore R2 ;SRCCcRET1: RETURN 00ځ<|tt tfDATA ;SRCrc ;SRCc Bc; ;SRC 1c; **-$LHTMO - A solicit has timed out ;SRCMc; ;SRCsMc; This routine is called by LAT Process when a solicit has timed out. ;SRC Nc; Any outstanding I/O is killed, and the current I/O is completed with ;SRCGc; Error status in R3 returned in the IOSB of the issuing task. ;SRCEc; ;SRC ,c; INPUT: R1 - U.TSTA of terminal ;SRCc; R2 - Error code ;SRCVc; ;SRCr%c; OUTPUT: R1 - Unchanged ;SRCR,c; R3 - 0 If success, <0 if error ;SRCq; ;**-13or; Other registers preserveds; As$LHTMO::BIT #S6.LAT,U.TST6-U.TSTA(R1) ; Is this a L.A.T.? ;SRCc%s BEQ ERR1 ; If not, error! ;SRCa"s MOV R0,-(SP) ; Save R0 ;SRC's MOV R2,R0 ; Move error code ;SRCt)s SWAB R0 ; Get code to hi byte ;SRCi/s BISB #IE.DNR,R0 ; Get DNR to lo byte ;SRCR-s BR STP ; Finish I/O, clean up, etc ;SRCos; ;SRCs; ;SRCDs; The LAT process calls this entry point to stop a session. ;SRC<s; In R1 is the UCB address of the session to stop. ;SRCs; ;SRCTs; Input: ;SRCTs; R1 - UCB address ;SRCcs; Output: ;SRCs; R1 - Unchanged ;SRC,s; R3 - 0 if success, <0 if error ;SRCs; R5 - modified ;SRC s; ;SRC (s; Other registers preserved ;SRCs; ;SRCBs$LHSTP:: ;SRCe8s BITB #UL.LEN,U.LINS-U.TSTA(R1) ; Line enabled? ;SRC%s BNE STP1 ; Branch if Yes ;SRCi/sERR1: MOV #ER$SYN,R3 ; Synchr. error ;SRCB!s RETURN ; And return ;SRC s; ;SRC;s; ;SRC 'sSTP1: MOV R0,-(SP) ; Save R0 ;SRCR7s MOV #IE.DNR&377,R0 ; Return DNR error to task ;SRCS,s ; Save reg. destroyed by LHMHUP ;SRC*sSTP: MOV R1,R5 ; R5-UCB address ;SRC#} MOV R1,-(SP) ; Save R1 ;**-9r~ MOV R2,-(SP) ; Save R2; MOV R4,-(SP) ; Save R4e& MOV R0,-(SP) ; Save status ;SRC- CALL MUCBX ; Map UCBX buffer (R4) ;SRCY( CALL CLEAN ; Cleanup buffers ;SRC: BISB #US.DSB,U.STS-U.TSTA(R5) ; Toggle read/write ;SRC8 CLRB U.LINS-U.TSTA(R5) ; Clear all link states ;SRC( MOV (SP)+,R0 ; Restore status ;SRC- MTPS #TTPRI ; Raise to priority 5 ;SRCa6 CALL LHMHUP ; Kill all I/Os and hang the lin;SRC% ; Clobbers R0,R1,R2,R3 ;**-9  MTPS #0 ; Back to zero CLR R3 ; Return success( MOV (SP)+,R4 ; Restore( MOV (SP)+,R2 ; RegistersC MOV (SP)+,R1 ;B MOV (SP)+,R0 ;  RETURNA ;O; --* LHDET - Check to see if Lat Application Terminal session should be ;SRCC; disconnected. ;SRC; ;SRCs; ;SRC+E; A session is disconnected if the original connection to the ;SRC;E; application terminal at the terminal server was an implicit ;SRC D; connection. Lat Process is mapped and called to check the ;SRC*; status in the circuit block. ;SRC; ;SRC+; Called by TTATT ;SRCR; ;SRC+-; Inputs: R5 - U.TSTA of terminal ;SRCc; ;SRCl4; Outputs: CS if terminal is to be hung up ;SRC; CC if not. ;SRC ; ;SRC ILHDET:: BITB #LE.ORG,U.CREN-U.TSTA(R5) ; Session result of IO.ORG? ;SRC;0 BNE 10$ ; if NE yes, don't hang up TT ;SRC= BITB #LE.HIP,U.CREN-U.TSTA(R5) ; Hangup in progress? ;SRCp0 BNE 10$ ; if NE, yes - don't hang up. ;SRC- SEC ; show terminal to be hung up ;SRC10$: RETURN ;SRC ; ; Common Subroutines;-; FNDUCB-find next LH UCBc9; Returns LH port first UCB and next/first UCB address.h ; Input:%; R2-DCB address (0 if first entry) #; R5-Current UCB's U.TSTA addressU ; Output:R; R2=0 on input:.; R2-DCB address (0 if no LH CTB/DCB found); R5-First UCB's U.TSTA'; Carry set if no LH'S CTB/DCB foundg; R2=DCB on input:; R2-Unchanged-.; R5-Next UCB's address (0 if no more UCBs);e FNDUCB:R TST R2 ; First entry?C BNE 30$ ; Branch if no00{cccctt' MOV $CTLST,R2 ; First CTB in chain(10$: CMP L.NAM(R2),#"LH ; TT device? BEQ 20$ ; BR if yes: MOV (R2),R2 ; Next CTB% BNE 10$ ; If NE, Check next one  SEC ; CTB not found+ RETURN ; Return with no LH data baseL*20$: MOV L.DCB(R2),R2 ; R2-DCB address, MOV D.UCB(R2),R5 ; R5-First UCB address ADD #U.TSTA,R5 ; R5-U.TSTA- CLC ; CTB found$ RETURN ; R2-DCB, R5-First UCB?30$: CMPB U.SESN-U.TSTA(R5),D.UNIT+1(R2) ; Current unit-last? BLT 40$ ; BR if notB* CLR R5 ; No more units (return R5=0) BR 50$ ; And exit )40$: ADD D.UCBL(R2),R5 ; R5-Next unit50$: RETURN ; And exit;1; MOVSB - Move source buffer into output buffert ; Input: ; R0 - Number of bytes to copy; R5 - UCB address, were:D%; U.TRLH-U.TSTA - Source address-; U.TRSC-U.TSTA - Number of bytes leftB-; Send word in U.TRLH buffer-buffer size8; R4 - CCB address, containing output buffer bias/virt5; Output buffer should be biased through APR6. ; Output:eK; C.BUF+2(R4) Modified - points to the first free byte in the output buffi=; C.CNT(R4) Modified - remaining bytes in the output bufferu;u ; Note:uD; Algorithm works for I/D space and non-I/D space systems. KISARi,;; found for source buffer mapping always maps data space.; ; All registers preservedt;fMOVSB: MOV R0,-(SP) ; Save R0u MOV R1,-(SP) ; Save R1e MOV R2,-(SP) ; Save R2b MOV R3,-(SP) ; Save R3f MOV R4,-(SP) ; Save R4P2 SUB R0,C.CNT(R4) ; C.CNT-Avail. in I/O buffer7 MOV U.TRLH-U.TSTA(R5),R2 ; R2-Source buffer address4 CLR R1 ; Settup for BISB1 BISB 2(R2),R1 ; R1-Number of bytes in buffer * ADD #4,R2 ; R2-Bytes start in buffer" ADD R1,R2 ; R2-End of buffer8 SUB U.TRSC-U.TSTA(R5),R2 ; R2-Current byte in buffer# MOV R2,R1 ; R1-Source addressV' ; Make R2 APR5 biased for BLXIOa. BIC #160000,R2 ; Clear APR number in R2, BIS #120000,R2 ; Make R2 APR-5 biased" ; Set in R1 bias for BLXIO( ASH #-12.,R1 ; R1-Real APR number*2$ ; ASH may be used here (EIS)# ; -we are using M-PLUS only2) BIC #177761,R1 ; Clear all junk bitsA) MOV KISAR0(R1),R1 ; R1-Buffer biasA+ MOV C.BUF(R4),R3 ; R3-Destination biasS0 MOV C.BUF+2(R4),R4 ; R4-Destination address CALL $BLXIO ; Move data ; R0-Changed ; R2-Last source byte+1  ; R4-Last output byte+1B ; R1,R3-PreservedP MOV R4,R1 ; Store R4% MOV (SP)+,R4 ; Restore CCB in R4 8 MOV R1,C.BUF+2(R4) ; New current V.A. in outp. buff MOV (SP)+,R3 ; Restore R3 MOV (SP)+,R2 ; Restore R2 MOV (SP)+,R1 ; Restore R1 MOV (SP)+,R0 ; Restore R0  RETURNM;R4; MUCBX - Map UCBX buffer on call from LAT process;4 ; Note:nC; Need that only if UCBX is being used on calls from LAT process.; ; Input:; R5 - U.TSTA ;SRCL; ;**-1 ; Output:R; None;MUCBX: .IF DF T$$SPL ; I/D space systems ,  MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ; Map UCBX-  MOV #120000,R4 ; R4-Virtual UCBX address    .IFF ;T$$SPL   ; Non I/D space systems & MOV U.TUX-U.TSTA(R5),R4 ; Get UCBX .ENDC ;T$$SPL  RETURN  C;f$; PRNTO - Process non task output.;e9; Allocate buffers and move the output into the buffersL.; updating U.TOC and U.TOP+2 in the process.; >; Link these buffers to the end of the U.TRLH chain with the@; buffer type set to zero. (Not prompt or flow control info.);A=; If enough buffers cannot be allocated exit with U.TOC and ?; U.TOP+2 settup for the remainder. Else U.TOC will be zero.;V3 ; If any buffers were added to U.TRLH set UL.TDA.L!; "; Input:#; R5-UCB address$;r%PRNTO:& MOV R0,-(SP) ;' MOV R1,-(SP) ; Save( MOV R2,-(SP) ; Registers) MOV R3,-(SP) ;d* MOV R4,-(SP) ;s+*, CALL MUCBX 00<|tt tfDATA ; Returns UCBX addr in R4+, TSTB U.TOC(R4) ; anything to do? ;SRC *, BEQ 70$ ; if EQ, just return.. ;SRC6-5$: MOV U.TRLH-U.TSTA(R5),R1 ; R1-XMT buffers chain+. BEQ 30$ ; Branch if there is no chainm&/10$: TST (R1) ; There is a chain-0 BEQ 20$ ; Find end ofe$1 MOV (R1),R1 ; Terminal buffers2 BR 10$ ; Chain$3 ; R1-addr of the last buffer<420$: CMPB #BF$FLO,3(R1) ; Is this a Flow control buffer?-5 BEQ 30$ ; If EQ yes - Don't put in data-6 CMPB #T$$BFL-4,2(R1) ; Is this one full?T'7 BEQ 30$ ; If EQ yes - get new one3725$: MOV R1,R2 ; Settup register for call ;SRC ,9 CALL 200$ ; Move the characters ;**-1: BR 50$ ; Check if done;,<30$: CALL ALTB ; Allocate T$$BFL buffer(= BCS 60$ ; Branch if alloc. failure&> ; Buffer allocated, R2=address&? ; Build dest. buff from source/@ CLR (R2) ; Clear last buffer link pointer A ASSUME BF$NOR,0&B CLR 2(R2) ; Clear count and type%C CALL 200$ ; Move the characters 'D TST R1 ; Is there a U.TRLH chain? E BNE 45$ ; Yes-branch6F MOV R2,U.TRLH-U.TSTA(R5) ; No-new buffer-first oneG BR 50$ ; And out&H45$: ; R1 points to last buffer/I MOV R2,(R1) ; Link buffer to U.TRLH chainr/J50$: TSTB U.TOC(R4) ; Did we do it all yet? K BNE 5$ ; If NE no - Go onL BR 70$ ; All donefM;N60$: BISB #UL.NTO,U.LINS-U.TSTA(R5) ; Note waiting outputO70$: MOV (SP)+,R4 ; Restore P MOV (SP)+,R3 ;eQ MOV (SP)+,R2 ; RegistersaR MOV (SP)+,R1 ; S MOV (SP)+,R0 ;cT RETURN ; And exitU;n0V; Move the data and update counts and pointersW;oX; R2 - Buffer addresstY;5 Z200$: MOV R2,-(SP) ; Save R2"[ CLR -(SP) ; Prepare for BISB,\ BISB 2(R2),(SP) ; Get current in buffer,] MOV (SP),-(SP) ; Duplicate top of stack/] MOV #T$$BFL-4,R0 ; Get buffer size ;DD405 8] SUB (SP),R0 ; get remaining space in buffer ;DD405*a CLR R3 ; Prepare for the BISB ;**-3(b BISB U.TOC(R4),R3 ; R3-string countc CMPB R3,R0 ; Will it fit? )d BHI 230$ ; If HI no - Do one buffere e MOV R3,R0 ; Move all of it,f230$: SUB R0,R3 ; Compute the remaining%g MOVB R3,U.TOC(R4) ; And store itR+h ADD R0,(SP) ; Add in these charactersS3i MOVB (SP)+,2(R2) ; Move byte counter in bufferu8j MOV U.TOP+2(R4),R3 ; R3-source buffer start address+k ADD R0,U.TOP+2(R4) ; Update the sourcen.l ADD #4,R2 ; Data start address in buffer3m ADD (SP)+,R2 ; Address in buffer for this datai7n242$: MOVB (R3)+,(R2)+ ; Move byte from echo buffer "o SOB R0,242$ ; Move all bytes"p ; Destination buffer built9q BISB #UL.TDA,U.LINS-U.TSTA(R5) ; Data is now available r MOV (SP)+,R2 ; Restore R2 s RETURNnt eu;a2v; CLEAN - Cleanup after an abort or stop sessionw;e;x; Deallocate all buffers other than prompt buffers. Clear9y; transmit data available flag. An IO.RPR buffer chain <z; will be the last thing in the list except for a possible:{; DATA_B buffer which will be deallocated along with the|; IO.RPR chain later.};R!~CLEAN: MOV R1,-(SP) ; Save R1  MOV R2,-(SP) ; Save R2/ MOV U.TRLH-U.TSTA(R5),R2 ; Get the listheadi* BEQ 30$ ; Branch if no buffers ;SRC410$: CMPB #BF$RPR,3(R2) ; Is this IO.RPR? ;**-1, BEQ 30$ ; If EQ yes - Don't deallocate) MOV (R2),-(SP) ; Get the next buffer $ CALL DETB ; Delete this buffer' MOV (SP)+,R2 ; Get the next bufferi) BNE 10$ ; And go on if there is oneAC30$: BICB #UL.TDA!UL.NOD,U.LINS-U.TSTA(R5) ; Clear the flag ;SRCn2 CLR U.TRLH-U.TSTA(R5) ; Clear XMT queue ;**-1/ CLR U.TRSC-U.TSTA(R5) ; Clear queue counterA MOV (SP)+,R2e MOV (SP)+,R1Q RETURN ; And all done C .PSECT MAP5;,D; FILSH - Fill in slot header session number and slot length bytes;a ; Input:; R2 - Slot header address; R3 - Slot type3; C.BUF+2(R4) - Next available byte in I/O buffere; U.SESN - Slot number; ; Output:e; Bytes filled00{cccc in slot headerN;LFILSH: MOV R1,-(SP) ; Save R10 MOV C.BUF+2(R4),R1 ; R1-Next available byte0 SUB R2,R1 ; R1-Filled bytes in slot (+HDR)1 SUB #SL$SDS,R1 ; Filled bytes without header % MOV @#KISAR6,-(SP) ; Save APR60 MOV C.BUF(R4),@#KISAR6 ; Map output buffer5 MOVB R1,SL$SBC(R2) ; Fill slot counter in header ; MOVB U.SESN-U.TSTA(R5),SL$SID(R2) ; Fill slot identifyera/ MOVB R3,SL$TYP(R2) ; Fill in the slot typeb+ MOV (SP)+,@#KISAR6 ; Restore mappingl MOV (SP)+,R1 ; Restore R1  RETURN ;R6; GCHR - Get/Put character from/into unmapped buffer;R ; Input:; U.RSBB - Buffer bias; R1 - Byte virtual addressd; R2-t*; <0 - Get character from buffer to R2,; >=0 - Put character from R2 into buffer; $; Output for R2<0 - low byte in R2; GCHR:n& MOV @#KISAR6,-(SP) ; Save APR 66 MOV U.RSBB-U.TSTA(R5),@#KISAR6 ; Map input buffer TST R2 ; Test R2 BGE 10$ ; Branch if >=0e CLR R2 ; Prepare R2+) BISB (R1),R2 ; Move character in R2 BR 20$ ; Donea/10$: MOVB R2,(R1) ; Move character from R220$:0 MOV (SP)+,@#KISAR6 ; Restore APR6 mapping  RETURN;G(; Call to LAT process: (APR 5 always).;c;; Call to LAT process is being made using $MPPRO routine. <; Bias of the LAT process is stored in S.KRB+2 of the scb.?; Virtual address of LAT is stored in the S.KRB+4 of the SCB.T; -FPLAT:: ; This entry included in FRKTB ; Table in TTDAT module ; +; Call from fork process comes here with:a; R4-UCBX address; R5-UCB addressr; MOV R3,-(SP) ; Save R3S3 BITB #UL.XON,U.LINS-U.TSTA(R5) ; Called for XON?  BEQ 10$ ; If EQ no - go on+ MOV #PO$XON,R3 ; Set the function codem! BR CALLT ; Call LAT processs10$: MOV R0,-(SP) ; Save R0S< BITB #UL.NTO,U.LINS-U.TSTA(R5) ; Non task output pending?, BNE 40$ ; If NE yes - Don't call ODONE@ BIT #S5.RPO,U.TST5-U.TSTA(R5) ; Is prompt output in progress?) BNE 40$ ; If NE yes - No ODONE callh;iP; Find out how many data buffers we have. If it is too many don't call ODONE.; CLR R0 ; Init the count 0 MOV U.TRLH-U.TSTA(R5),R3 ; Get start of list& BEQ 30$ ; Branch if no more list#20$: INC R0 ; Update the countr' MOV (R3),R3 ; Get the next buffer& BNE 20$ ; Branch if there is one#30$: CMP R0,#MAXBUF ; Too many? " BLOS 35$ ; If LOS no - Go on6 BISB #UL.NOD,U.LINS-U.TSTA(R5) ; Note no ODONE call# BR 40$ ; And call LAT processO$35$: BIC #S1.DSI,(R5) ; Clear it' MTPS #TTPRI ; Raise to priority 5t& CALL ODONE ; Process the request MTPS #0 ; Back to zero8 BIS #S1.DSI,(R5) ; Reset S1.DSI for other processes40$: MOV (SP)+,R0I+ MOV #PO$OUT,R3 ; Set the function code ! BR CALLT ; Call LAT process$;n?; Direct call if priority message has to go out. In this case ; LAT should not call $LHOUT.S; Input parametrs:; R3-Operation code;l; R5-UCB addressc;ALTPRC:: ;SRCC" MOV R3,-(SP) ; Save R3 ;SRC(CALLT: MOV R4,-(SP) ; Save R4 ;SRC3 MOV U.SCB-U.TSTA(R5),R4 ; R4-SCB address ;**-7t  MOV S.KRB+2(R4),-(SP) ; Bias# MOV S.KRB+4(R4),-(SP) ; Virtual:. CALL $MPPRO ; Maps and calls LAT process ; Restores SPL&  MOV (SP)+,R4 ; Restore R4 ;**-3  MOV (SP)+,R3 ; Restore R3  RETURN ; And exit  ;A8; The LAT process calls LAT port at common entry point!; with the function code in R3.s;$$LHDEV:: ; LH port entry point& CLR R4 ; Always controller zero!  MTPS #TTPRI ; Raise to PR5. TTSET$ LH ; Map APR6 for termianl driver MTPS #0 ; Back to zero* CALL LHDEV6 ; Go into the Map6 psect MTPS #TTPRI ; Raise agains" RETURN ; Exit through TTSET .PSECT MAP6$LHDEV6: CLR R2 ; No DCB address, CALL FNDUCB ; Go get first UCB address- MOV U.SCB-U.TSTA(R5),R5 ; Get SCB addr00|tt tfDATAesse/ MOV S.KRB+10(R5),R1 ; Get input parameters  MOV S.KRB+12(R5),R2 ; ...! MOV S.KRB+14(R5),R3 ; ..." MOV S.KRB+16(R5),R4 ; ...'# MOV R5,-(SP) ; Save address of SCB $$ CALL @LHDSP(R3) ; Call function'% MOV (SP)+,R0 ; Restore SCB addressi5& MOV R1,S.KRB+10(R0) ; Return function parameters' MOV R2,S.KRB+12(R0) ; ....( MOV R3,S.KRB+14(R0) ; ...) MOV R4,S.KRB+16(R0) ; ...* MOV R5,S.KRB+20(R0) ; ... + RETURN,- .ENDC ;T$$LTH./ .ENDCB addr .TITLE LADRV  .IDENT /05.01/A;A(; DIGITAL EQUIPMENT CORP., MAYNARD MASS.; B; COPYRIGHT (c) 1977, 1982, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;C<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;D;OA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON AIA; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU-$A; SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANYLA; OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADEDA; AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEMOA; AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE TO ANDD=; OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.E;TA; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUTU; EQUIPMENT CORPORATION.; A; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITSI5; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.S;W;,;R; CHARLES A. SAMUELSON; MICHAEL SCHWARTZ; CLARK A. D'ELIAW; ; NOV. 22, 1977L;O; MODIFIED BY:;X?; PKW029 -- MOVE A LABLE SO THAT A SECTION OF CODE IS EXECUTEDH; C; PKW032 -- MAKE SURE ALL OF RANDOM CHANNEL LIST IS MAPPED BY UMRSA'; IMPROVE COMMENTS ON IBUF AND RDAM;O;; LPA11 LABORATORY PERIPHERAL ACCELERATOR CONTROLLER DRIVERN;O;R;O;; MACRO LIBRARY CALLSS;S* .MCALL HWDDF$,PKTDF$,TCBDF$,UCBDF$,SCBDF$% HWDDF$ ;DEFINE HARDWARE REGISTERSP% PKTDF$ ;DEFINE I/O PACKET OFFSETS./ SCBDF$ ;DEFINE STATUS CONTROL BLOCK OFFSETSW- TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS- UCBDF$ ;DEFINE UNIT CONTROL BLOCK OFFSETSC; ; QIO DIRECTIVE DESCRIPTIONS;K; IO.LOD, ... ,'; BUF - BUFFER OF MICRO - CODE TO LOADC#; BUFFER SIZE MUST BE 2048. BYTES #; ISSUEING TASK MUST BE PRIVILEGEDT%; VERIFIES NO ACTIVE USERS FOR LPA11 ; HARDWARE RESETS LPA11"; LOADS AND VERIFIES MICRO - CODE&; STARTS LPA11 AND ENABLES INTERRUPTS,; RETURNS WHEN READY IN INTERRUPT IS POSTED4; THIS IS A TRANSFER FUNCTION-(THE QIO DOES ADDRESS(; CHECKS AND RELOCATES THE USER BUFFER);F; IO.INI, ... ,L/; BUF - BUFFER CONTAINING LPA11 INITIALIZE RDAK*; BUFFER SIZE MUST BE AT LEAS 278. BYTES#; ISSUEING TASK MUST BE PRIVILEGEDR'; SENDS AN INITIALIZE COMMAND TO LPA11A;M"; IO.CLK, ... ,%; MODE - LPA11 CLOCK START MODE WORDEE; CKCSR - IMAGE TO WRITE INTO LPA11 REAL TIME CLOCK CONTROL REGISTEREL; PRESET - IMAGE TO WRITE INTO LPA11 REAL TIME CLOCK PRESET BUFFER REGISTER&; ISSUES AN LPA11 CLOCK START COMMAND;K; IO.STA, ... ,*; BUF - POINTER TO LPA11 SAMPLE START RDA*; BUFFER SIZE MUST BE AT LEAST 40. BYTES.; ISSUES AN LPA11 DATA TRANSFER START COMMAND4; THIS IS A TRANSFER FUNCTION-(THE QIO DOES ADDRESS(; CHECKS AND RELOCATES THE USER BUFFER);O+; SUBFUNCTION CODE DIFFINTIONS FOR IO.STA ;E9; BIT 0 = 0 GIVE AST FOR EVERY BUFFER IF AST SPECIFIEDK5; BIT 0 = 1 GIVE AST ONLY FOR EXCEPTION CONDITIONS1;E;T; IO.STP, ... ,E;T; CALL MUST SUPPLY LUNO+; USERID - USER INDEX NUMBER <0-7> TO STOP>2; STOPPING TASK MUST BE THE SAME AS STARTING TASK;R;Z$; DEFAULT UIC OF LOADER TASK = [1,1];N'TUIC=401 ;DEFAULT UIC OF LOADER TASKI;S;T;S; ASSEMBLY CONDITIONALS ;D; M$$MGE ;MEMORY MANAGEMENT; A$$CHCK ;ADDRESS CHECKN; A$$TRP ;AST SUPPORT"; M$$EXT ;22 BIT 11/70 EXT MEM.$; M$$PRO ;MULTI-PROCESSOR SUPPORT!; R$$MPL ;RSX-11M PLUS SUPPORTC;I;C;I; 00{ccccDRIVER DISPATCH TABLE ;  .IF NDF R$$MPL " DDT$ LA,L$$A11,,, .IFFN( DDT$ LA,L$$A11,,,, .ENDC;S .IF GT L$$A11-1;Z,TEMP: .BLKW 1 ;TEMP STORAGE FOR CONT. NUM.;4 .ENDC;U;U .PAGE# .SBTTL ONLINE/OFFLINE ENTRY POINTSN;I$; CONTROLLER STATUS CHANGE ROUTINE;T; INPUTS: R2 = KRB ADDRESS;!; C = 0 ,BRING CONTROLLER ONLINE !; C = 1 ,TAKE CONTROLLER OFFLINE ;M(; OUTPUTS: $SCERR= UNCHANGED FOR SUCCESS!; = ERROR CODE FOR FAILUREV;D;A8; THE LPA11-K IS BOTH A UNIT AND ITS OWN CONTROLLER. ALLD; THE REAL WORK WILL BE DONE AT THE UNIT ONLINE/OFFLINE ENTRY POINT.;N .IF DF R$$MPL#LAKRB: RETURN ;ALWAYS SUCCESSFULR;;;;;;;;;U; UNIT STATUS CHANGE ROUTINE.;T; INPUTS: R3 = CONTROLLER INDEXI; R4 = SCB POINTERU; R5 = UCB POINTER;N; C = 0 ,BRING UNIT ONLINE ; C = 1 ,TAKE UNIT OFFLINEN;(; OUTPUTS: $SCERR= UNCHANGED FOR SUCCESS!; = ERROR CODE FOR FAILUREE;; LAUCB: BCS 100$ ! CALLR LAPWF ;BRING UNIT ONLINE $100$: TST S.PKT(R4) ;ANYONE ACTIVE? BNE 200$ ;YES, BRANCH, MOV #U.LAUT,R0 ;POINT TO ACTIVE USER TABLE ADD R5,R0 ; IN THE UCB:" MOV #8.,R2 ;MAXIMUM OF 8. USERS$110$: TST (R0)+ ;THIS USER ACTIVE? BNE 200$ ;YES, BRANCH DEC R2 ;DECREMENT COUNTER BGT 110$ ;TRY THE NEXT USER( MTPS S.PRI(R4) ;;; LOCK OUT INTERRUPTS2 MOV #40000,@S.CSR(R4) ;;; HARDWARE RESET LPA11-K MTPS #0 ;;; ALLOW INTERRUPTSR% RETURN ;LPA11-K READY FOR OFFLINE15200$: MOVB #IE.RSU&377,$SCERR ;RESOURCE IN USE ERRORK RETURN ;NO OFFLINE YET .ENDC .PAGE: .SBTTL LPA11 DRIVER I/O INITIATOR ENTRY POINT - LAINI -**;;J; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUESTD; IS RECEIVED FOR THE LPA11 LABORATORY PERIPHERAL ACCELERATOR. FIVEE; FUNCTIONS ARE RECOGNIZED BY THE LPA11 DRIVER. SPECIAL USER BUFFERSSF; ARE ADDRESS CHECKED WHERE NECESSARY. ERROR FREE REQUESTS ARE PLACED4; IN THE I/O QUEUE THAT IS MAINTAINED BY THE DRIVER.;G; ADDRESS CHECKING FOR THE USER'S DBP BUFFER IS DONE IN THE QIO ROUTINEF; BEFORE THIS DRIVER IS CALLED.T; ; INPUTS:I;I"; R1=ADDRESS OF I/O REQUEST PACKET$; R4=ADDRESS OF STATUS CONTROL BLOCK9; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATEDH;P ; OUTPUTS:;P;; A QUEUED I/O PACKET WITH USER BUFFERS ADDRESS CHECKED ANDH=; RELOCATED. PACKET MAY BE DEQUEUED WHEN $GTPKT IS CALLED IFH&; IT IS THE ONLY PACKET IN THE QUEUE.;C1; FUNCTION INDEPENDENT I/O REQUEST PACKET FORMAT:I;."; WD. 00 -- I/O QUEUE THREAD WORD./; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBERO0; WD. 02 -- ADDRESS OF THE TCB OF REQUESTER TASK?; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTER TASK HEADERBC; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK HEADER; WD. 05 -- I/O FUNCTION CODEP/; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCKE/; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCKAB; WD. 10 -- I/O STATUS BLOCK ADDRESS (READ OR DISPLACEMENT+140000)3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. ; ;U;H>; THE I/O PACKET PARAMETER LIST IS USED BY THE DRIVER TO STORE$; INFORMATION REGARDING THE REQUEST.=; THIS INFORMATION IS CALCULATED AS THE REQUEST IS PROCESSED.A7; CONVENTIONS FOR I/O PACKET PARAMETER LIST USEAGE ARE: ;U;EB; WD. 12 - I.PRM -FIRST PARAMETER SUPPLIED BY ISSUEING TASKS QIOC; WD. 13 - I.PRM+2 -SECOND PARAMETER SUPPLIED BY ISSUEING TASKS QIOUB; WD. 14 - I.PRM+4 -THIRD PARAMETER SUPPLIED BY ISSUEING TASKS QIOH; WD. 15 - I.PRM+6 -LOW ORDER 16 BITS OF PHYSICAL ADDRESS OF REQUEST RDAH; WD. 16 - I.PRM+10-HIGH ORDER 2 BITS OF PHYSICAL ADDRESS OF REQEUST RDAH; WD. 17 - I.PRM+12-EVENT FLAG MASK FOR CONTINUING DATA TRANSFER REQUEST&; WD. 20 - I.PRM+14-EVENT FLAG ADDRESS(; WD. 21 - I.PRM+16-RESERVED FOR RSX-11M;;D;2-LAINI: MOV R1,-(SP) ;SAVE I/O PACKET ADDRESSG" TST I.IOSB+4(R1) ;IOSB SUPPLIED?% BEQ ELABAD ;NO, BAD PARAMETERS ERR % MOV I.FCN(R1),R3 ;I/O FUNCTION CODEE BIC #377,R3 ;CLEAR LOW BYTE% CMP #IO.INI,R3 ;INITIALIZE REQUEST?  BNE 5$ ;NO, CON00 |tt tfDATATINUEQ JMP LAINIT ;YES)5$: CMP #IO.CLK,R3 ;CLOCK START REQUEST?R BNE 15$ ;NO, CONTINUE JMP LACLOK ;YES#15$: CMP #IO.STP,R3 ;STOP REQUEST?R BNE 2$ ;NO  JMP LASTOP ;YES;GI; IT IS EITHER A LOAD MICRO-CODE REQUEST OR A START DATA TRANSFER REQEUSTR2; COPY USER BUFFER POINTERS SO $GTWRD WILL OPERATE;;,2$: MOV I.PRM(R1),U.BUF(R5) ;RELOCATION BIAS$ MOV I.PRM+2(R1),U.BUF+2(R5) ;OFFSET CMP #IO.STA,R3 ;START? BNE 3$ ;NOE JMP LASTRT ;YES%3$: CMP #IO.LOD,R3 ;LOAD MICRO-CODE?N# BNE ELAIFC ;NO, ILLEGAL FUNCTIONI JMP LALOAD ;YES, JMP TO LOAD;E;$-; *******************************************#;S<; ** - ERROR HANDLING PATHS FOR LADRV - INITIATOR ENTRY ONLYH; INTERRUPT ROUTINES AND OTHER ENTRY POINTS REPORT THEIR OWN ERRORS;;O3ELAIFC: MOV #IE.IFC&377,R0 ;ILLEGAL FUNCTION ERROR$" BR EROR ;FINISH ERROR HANDLING;I,ELAPRI: MOV #IE.PRI&377,R0 ;PRIVILEGE ERROR BR EROR ;T9ELASPC: MOV #IE.SPC&377,R0 ;USER BUFFER ADDR CHECK ERROR3 BR EROR;-6ELABCC: MOV #IE.BCC&377,R0 ;LOAD ERROR FOR MICRO-CODE BR EROR ;EXIT;@ELARSU: MOV #IE.RSU&377,R0 ;RESOURCE IN USE - CANNOT INITIALIZE BR EROR;L<ELANOD: MOV #IE.NOD&377,R0 ;SYSTEM DYNAMIC MEMORY EXHAUSTED BR EROR;T+ELABAD: MOV #IE.BAD&377,R0 ;BAD PARAMETERS;EROR: ! MOV (SP)+,R3 ;ERROR ENCOUNTEREDO CLR R1 ;SET UP IOSB WORD 2R CALLR $IOFIN ;I/O COMPLETION.;&;,,ELAPR2: MOV #IE.PRI&377,R0 ;PRIVILEGE ERROR BR ERORGT;,7ELASP2: MOV #IE.SPC&377,R0 ;USER BUFF ADDR CHECK ERROR ; ERORGT: MOV (SP)+,R3 CLR R1 CALL $IOFIN BR GETPKT;-; *******************************************E;C .PAGE7 .SBTTL RETREIVE I/O PACKET AND ISSUE REQUEST TO LPA-11E;Y; INSERT PACKET IN I/O QUEUE5; THE DRIVER WAS ENTERED BEFORE THE PACKET WAS QUEUED-; NOW WE PUT IT IN THE QUEUE AND GO TO $GTPKTC;R/QUEPKT: ;QUEUE AN I/O PACKET FOR THE DRIVERM% MOV (SP)+,R1 ;GET ADDRESS OF PACKET7= MOV R4,R0 ;SCB ADDRESS OF CONTROLLER TO INSERT PACKET INTO,( CLR I.PRM+16(R1) ;INITIALIZE FLAG WORD CALL $QINSP ;INSERT IN QUEUE ;AND FALL THROUGH TO $GTPKT;*6; TRY TO RETREIVE AN I/O PACKET AND TRANSMITT TO LPA11;IGETPKT:C; D; BEFORE WE DEALLOCATE A NEW REQUEST FROM THE CONTROLLERS I/O QUEUE,:; TRY AND FETCH A STOP REQUEST FROM THE STOP REQUEST QUEUE;I MOV U.SCB(R5),R4 ;POINT TO SCB! TSTB S.STS(R4) ;CONTOLLER BUSY?T BEQ 198$I JMP 14$ ;YES, GO AWAY,198$: MOV U.LASL(R5),R1 ;LOOK AT STOP QUEUE BEQ 200$ ;EMPTY, TRY $GTPKT& MOV (R1),U.LASL(R5) ;NEW FIRST ENTRY# INCB S.STS(R4) ;SET CONTOLER BUSYU& BISB #US.BSY,U.STS(R5) ;SET UNIT BUSY2 MOV R1,S.PKT(R4) ;SET CURRENT I/O PACKET ADDRESS0 MOVB S.CON(R4),R3 ;MOVE CONTROLLER INDEX TO R3 .IF DF M$$PRO0 CALL $CFORK ;WE MUST RUN ON CORRECT PROCESSOR .ENDC! BR 210$ ;GIVE REQUEST TO LPA11B;)?; TRY AND RETREIVE AN I/O PACKET FROM THE CONTROLLERS I/O QUEUEI;J;1200$: CALL $GTPKT BCS 14$6210$: MOV R5,UCBSV(R3) ;SAVE UCB PTR. FOR INT ROUTINE9 BICB #US.MDM,U.STS(R5) ;CLEAR ABORT CURRENT REQUEST FLAG.2 CMP #IO.LOD,I.FCN(R1) ;A LOAD MICROCODE FUNCTION? BNE 220$ 3 MOVB S.ITM(R4),S.CTM(R4) ;SET DEVICE TIMEOUT COUNTE BR 12$ 220$:4 .IF DF M$$EXT' CMP #IO.INI,I.FCN(R1) ;INITIALIZE RDA?L BNE 222$ ;NO, BRANCHN2 MOV #139.*2,U.CNT(R5) ;LENGTH OF RDA TO BE MAPPED8 MOV I.PRM+6(R1),U.BUF+2(R5) ;LOW 16 BITS OF RDA ADDRESS: MOVB I.PRM+10(R1),U.BUF+1(R5) ;HIGH 6 BITS OF RDA ADDRESS CALL MAP ;GO MAP UMR'S)? MOV M.UMVL(R3),I.PRM+6(R1) ;LOW 16 BITS OF UMR VIRTUAL ADDRESSA< MOVB M.UMVH(R3),I.PRM+10(R1) ;HIGH 2 BITS (IN BITS 4 AND 5)+ ASR I.PRM+10(R1) ;MOVE THOSE ADDRESS BITS,$ ASR I.PRM+10(R1) ; TO BITS 2 AND 3 BR 250$0222$: CMP #IO.STA,I.FCN(R1) ;START I/O FUNCTION? BNE 250$ ;NO, BRANCH % TST I.PRM+16(R1) ;ANY UMR'S MAPPED?;0 BNE 250$ ;YES, START CONVERTED TO STOP PACKET3 MOV I.PRM+2(R1),U.CNT(R5) ;LENGTH OF MAPPED REGION)% MOV I.PRM+6(R1),R2 ;GET RDA ADDRESSS' MOV 4(R2),U.BUF+2(R5) ;USW LOW 16 BITS(( MOVB 6(R2),U.BUF+1(R5) ;USW HIGH 2 BITS CALL MAP ;GO 00{ccccMAP UMR'S) MOV R5,-(SP) ;SAVE UCB POINTER! ADD #4,R2 ;POINT TO USW IN RDAE. MOV M.UMVL(R3),(R2)+ ;POINT LPA TO MAPPED USW) MOVB M.UMVH(R3),R5 ;GET USW HIGH 2 BITS." BIC #^C<377>,R5 ;CLEAR HIGH BYTE ASRB R5 ;MOVE TO BITS 0 AND 1 ASRB R5 ASRB R5 ASRB R5 MOVB R5,(R2)+ ;STORE INTO RDAS& MOVB (R2)+,R0 ;GET VALID BUFFER MASK" BIC #^C<7>,R0 ;ISOLATE MASK BITS9225$: ADD M.UMVL(R3),(R2)+ ;ADD UMR BASE ADDRESS LOW BITSO" ADC (R2) ;DONT FORGET THE CARRY. ADD R5,(R2)+ ;ADD UMR BASE ADDRESS HI 2 BITS DEC R0P BGE 225$ ;BRANCH IF NOT DONE ) MOV I.PRM+6(R1),R2 ;GET THE RDA ADDRESS # ADD #50,R2 ;INDEX TO RCL ADDRESSH4 ADD M.UMVL(R3),(R2)+ ;ADD UMR BASE ADDRESS LOW BITS" ADC (R2) ;DONT FORGET THE CARRY! ADD R5,(R2) ;ADD THE HIGH BITSR# MOV (SP)+,R5 ;RESTORE UCB POINTER250$:R .ENDC3 MOVB S.ITM(R4),S.CTM(R4) ;SET DEVICE TIMEOUT COUNTI* MOV S.CSR(R4),R0 ;GET DEVICE CSR ADDRESS7 MOV I.PRM+6(R1),4(R0) ;SET LOW 16 BITS OF RDA ADDRESSA4 BIC #14,(R0) ;CLEAR PREVIOUS EXTENDED ADDRESS BITS MOV I.PRM+10(R1),R2 INC R2 ;SET GO BITP BIS R2,(R0) ;GIVE TO LPAR 12$: RETURN0; &; THERE IS NOTHING TO DO FOR THIS UNIT>; CHECK TO SEE IF ANY DYNAMIC STOREAGE NEEDS TO BE DEALLOCATED;E+14$: TST (R4) ;BECAUSE I/O LIST IS EMPTY? BNE 12$ ;NO, JUST EXIT +16$: MOV U.LADS(R5),R0 ;ANY DSR ALLOCATED?. BEQ 12$ ;NO, EXIT@ MOV (R0),U.LADS(R5) ;YES, REMOVE THIS PACKET AND POINT TO NEXT% MOV #30.*2,R1 ;DEALLOCATE 30. WORDS ! CALL $DEACB ;DEALLOCATE BUFFERV" BR 16$ ;CONTINUE TILL NONE LEFT .PAGE;2=; THIS SUBROUTINE SETS UP THE UNIBUS MAPPING REGISTERS NEEDEDT6; TO MAP THIS USER'S REQUEST WITH THE FOLLOWING STEPS:;O9; - GET A WORK BLOCK FROM POOL TO USE AS A MAPPING BLOCK4:; - SET UP THE MAPPING BLOCK BY REQUESTING UMRS FROM EXEC4; - MAKE SURE WE ARE UNDER THE SYSGEN DEFINED LIMIT; - LOAD THE UMRS;T;M .IF DF M$$EXT4MAP: MOV (SP),-(SP) ;RESERVE A WORD AT TOP OF STACK# MOV R1,-(SP) ;SAVE PACKET POINTER  MOV R2,-(SP) ;SAVE R2E MOV R5,-(SP) ;SAVE UCB POINTER MOV #20.,R1 ;GET 10. WORDST CALL $ALOCB ; FROM POOLG BCC 10$ ;BRANCH IF SUCCESSFUL& MOV #IE.NOD&377,-(SP) ;SET ERROR CODE BR 15$-&10$: MOV 4(SP),R3 ;GET PACKET POINTER0 MOV R0,I.PRM+4(R3) ;STORE POINTER TO NEW BLOCK MOV (SP),R5 ;GET UCB POINTERK# MOV U.SCB(R5),R4 ;GET SCB POINTERD) CLR (R0) ;INITIALIZE CONTEXT SAVE WORD CALL $STMP1 ;SET UP THE UMR'S6 MOV (SP)+,10(SP) ;MOVE DQUMR POINTER TO TOP OF STACK( TST -10(R0) ;WERE WE BLOCKED BY EXEC? BNE 12$ ;YES, REPORT IT* MOV M.UMRN(R0),R3 ;GET NUMBER OF UMR'S*4 ASR R3 ;GET NUMBER OF UMR'S ASR R3 4 SUB R3,U.LAUB+2(R5) ;SUBTRACT FROM TOTAL AVAILABLE BGE 20$ ;BRANCH IF ALL THEREA* ADD R3,U.LAUB+2(R5) ;RESTORE TOTAL VALUE& MOV #IE.DUN&377,-(SP) ;SET ERROR CODE BR 13$E812$: MOV #IE.BLK&377,-(SP) ;EXEC BLOCKED DRIVER FOR UMRS,13$: MOV R0,R2 ;COPY MAPPING BLOCK POINTER$ CALL $DEUMR ;DEALLOCATE THE UMR'S+ SUB #10,R0 ;POINT TO START OF WORK BLOCK) MOV #20.,R1 ;10. WORDS LONG$ CALL $DEACB ;RETURN BLOCK TO POOL"15$: MOV (SP)+,R0 ;POP ERROR CODE# MOV (SP)+,R5 ;RESTORE UCB POINTER' MOV U.SCB(R5),R4 ;RESTORE SCB POINTERL MOV (SP)+,R2 ;RESTORE R26 MOV (SP)+,2(SP) ;MOV PACKET POINTER OVER RETURN ADDR TST (SP)+ ;CLEAN STACK)- CLR S.PKT(R4) ;CLEAR CURRENT PACKET POINTER7* CLRB S.STS(R4) ;MARK CONTROLLER NOT BUSY+ BICB #US.BSY,U.STS(R5) ;MARK UNIT NOT BUSY JMP ERORE/20$: MOV R0,R3 ;COPY POINTER TO MAPPING BLOCKF MOV (SP)+,R5 ;GET UCB POINTER # MOV U.SCB(R5),R4 ;GET SCB POINTERO CALL $MPUB1 ;LOAD THE UMR'S MOV (SP)+,R2 ;RESTORE R2* MOV (SP)+,R1 ;RESTORE THE PACKET POINTER" MOV #1,I.PRM+16(R1) ;MARK MAPPED RETURNR .ENDC .PAGE! .SBTTL DEVICE INITIALIZE REQUESTR;D;=; ***** PROCESS AN INITIALIZE REQUEST FOR LPA11 *************E;O/; FUNCTION DEPENDENT I/O REQUEST PACKET FORMAT:Y;B<; WD. 12 -- VIRTUAL ADDRESS OF RDA BUFFER FOR INITIALIZATION2; WD. 13 -- LENGTH IN BYTES OF THE INIT RDA BUFFER; WD. 14 -- NOT USED2; WD. 00|tt tfDATA15 -- LOW ORDER 16 BITS OF PHYSICAL RDA ADDRC; WD. 16 -- HIGH ORDER 2 BITS OF PHYSICAL RDA ADDR-BIT POS. 3 AND 2E; WD. 17 -- NOT USED; WD. 20 -- NOT USED; '; RDA FORMAT FOR INITIALIZATION COMMAND;B8; WD. 00 -- MODE WORD-CONTAINS MICROCODE VERSION NO. AND; INITIALIZE CODE (000)*3; WD. 01 THRU 12 -- DEVICE ADDRESSES ON THE I/O BUSC; :; REMAINDER OF BUFFER IS THE DEDICATED MODE DISPATCH TABLE;; WHICH IS A TABLE OF CONSTANTS REQUIRED FOR DEDICATED MODEU); PROCESS AN INITIALIZE REQUEST FOR LPA11 ;ELAINIT: : CMP I.PRM+2(R1),#139.*2 ;MUST SPECIFY AT LEAST 139. WORDS BHIS 10$R# JMP ELASPC ;ERROR, RDA TOO SHORTS;); INITIALIZING TASK MUST BE PRIVILEGED!!!I;I110$: MOV I.TCB(R1),R0 ;GET TCB OF REQUESTOR TASKI( BIT #T3.PRV,T.ST3(R0) ;TASK PRIVILEGED? BNE 15$ JMP ELAPRI ;NO, ERROR&15$: MOV I.PRM(R1),R0 ;ADDRESS OF RDA  .IF DF A$$CHK!M$$MGET D- MOV #139.*2,R1 ;LENGTH OF INIT RDA IN BYTESE' CALL $ACHCK ;CALL ADDR CHECK ROUTINEU BCC 20$ JMP ELASPC ;ERROR RETURNED120$: ;REF LABLEI .IF DF R$$MPL;TH; THIS IS HERE BECAUSE IO.INI IS MARKED AS A CONTROL FUNCTION IN THE DCBE; EVEN THOUGH IT IS REALLY A TRANSFER FUNCTION. THAT WAS DONE TO GETB&; THE RDA ADDRESS IN THE CORRECT FORM.H; M DOESNT NEED THIS BECAUSE A TASK IS NOT CHECKPOINTABLE OR SHUFFLEABLE'; IF T.IOC <> 0, AND COMMONS DONT MOVE.;4 MOV W.BATT(R2),R2 ;POINT TO ATTACHMENT DESC OF BUF% INCB A.IOC(R2) ;INCREMENT I/O COUNTA& MOV (SP),R3 ;POINT R3 TO I/O PACKET2 MOV R2,I.AADA(R3) ;STORE ATT DESC ADDR SO $IOFIN" ;WILL DECREMENT THE I/O COUNT .ENDC ;R$$MPL .ENDC ;A$$CHK!M$$MGEO N5 CALL CVTP ;CONVERT RDA ADDRESS TO PHYSICAL ADDRESSN& MOV (SP),R3 ;POINT R3 TO I/O PACKETE MOV R1,I.PRM+6(R3) ;SAVE LOW ORDER 16 BITS OF PHYSICAL RDA ADDRESSE .IF DF M$$EXT) ASR R2 ;RIGHT JUSTIFY THE ADDRESS BITSO ASR R2 .ENDC, MOV R2,I.PRM+10(R3) ;AND HIGH ORDER 2 BITS) JMP QUEPKT ;INSERT PACKET IN I/O QUEUEP .PAGE .SBTTL PROCESS CLOCK START RDA.;A;);S;; ***** PROCESS LPA11-K REAL TIME CLOCK START RDA *********U;/; FUNCTION DEPENDENT I/O REQUEST PACKET FORMAT:;L!; WD. 12 -- CLOCK START MODE WORDY9; CONTAINS CLO CK ID (A OR B) AND CLO CK START CODEV; WD. 13 -- CLOCK STATUS WORDR; WD. 14 -- CLOCK PRESET WORDS,; WD. 15 -- LOW ORDER 16 BITS OF RDA ADDRESSC; WD. 16 -- HIGH ORDER 2 BITS-ALWAYS ZERO FOR THIS FUNCTION BECAUSED:; THE RDA IS IN THE I/O PACKET ITSELF WHICH RESIDES IN ; KERNEL ADDRESS SPACE ; WD. 17 -- NOT USED; WD. 20 -- NOT USED;P;-C; RDA FOR CLOCK START COMMAND IS 1ST 3 PARAMETER WORDS IN IO PACKETR;ELACLOK: 1 MOV I.PRM(R1),R0 ; INSURE THIS IS A CLOCK START ' BIC #^C<7>,R0 ;ISOLATE LOW THREE BITSC1 DEC R0 ;IF A CLOCK START,SHOULD GO FROM 1 TO 0D! BEQ 5$ ;YES, LEGAL CLOCK START5' JMP ELABAD ;NO, BAD PARAMETERS ERRORD:5$: MOV R1,I.PRM+6(R1) ;MAKE I/O PACKET A CLOCK START RDA0 ADD #I.PRM,I.PRM+6(R1) ;POINT RDA ADDRESS TO IT3 CLR I.PRM+10(R1) ;KERNAL MODE IS PHYSICAL ADDRESS- JMP QUEPKT ; ;-;O .PAGE .SBTTL LOAD MICRO CODE ; 5; ******* FUNCTION TO LOAD MICRO CODE ***************L7; ALSO DOES A HARDWARE INITIALIZE AND START UP OF LPA11;C/; FUNCTION DEPENDENT I/O REQUEST PACKET FORMAT:I; "; WD. 12 -- 16 BIT RELOCATION BIAS; WD. 13 -- OFFSET); WD. 14 -- LENGTH IN BYTES OF MICRO-CODEM; WD. 15 -- NOT USED; WD. 16 -- NOT USED; WD. 17 -- NOT USED; WD. 20 -- NOT USED;+4; ***** THERE IS NO RDA FOR THE LOAD COMMAND *******;LLALOAD:PD CMP I.PRM+4(R1),#1024.*2 ;MUST LOAD EXACTLY 1024 MICRO INSTRUCTIONS" BEQ 5$ ;PROPER NUMBER, CONITNUE: JMP ELASPC ;ERROR - INCORRECT NUMBER OF BYTES IN BUFFER;Z#; LOADING TASK MUST BE PRIVILEGED!!I;D85$: MOV I.TCB(R1),R2 ;ISSUEING TASK MUST BE PRIVILEGED!( BIT #T3.PRV,T.ST3(R2) ;TASK PRIVILEGED? BNE 10$ ;YES, CONTINUEF JMP ELAPRI ;NO, ERROR; /; CHECK TO MAKE SURE THERE ARE NOT ACTIVE USERS8; WE DON'T WANT TO DO A HARDWARE RESET FOR THE POOR GUY!;D#10$: TST S.PKT(R4) ;ANYONE ACTIVE?I BEQ 15$ ;NO00"{cccc, OKAY SO FARD12$: JMP ELARSU ;YES, ERRORS015$: MOV #U.LAUT,R0 ;POINT TO ACTIVE USER TABLE ADD R5,R0 ;IN UCB MOV #8.,R2S20$: TST (R0)+ ;A USER HERE?& BNE 12$ ;YES, RESOURCE IN USE ERROR DEC R2 ;END OF LIST?S BGT 20$ ;NO CONTINUE3;V; HARDWARE RESET LPA11-K; .IF DF M$$PRO! CALL $CFORK ;CORRECT PROCESSOR .ENDC, MTPS S.PRI(R4) ;;;GO TO PRIORITY OF DEVICE MOV #40000,@S.CSR(R4) ;;;RESETT MTPS #0 ;;;RESET PRIORITY;S?; GET 1024 WORDS FROM USER BUFFER AND LOAD INTO MICRO PROCESSORP"; CHECK EACH WORD LOADED TO VERIFY;T% CLR R0 ;R0 IS ADDRESS TO LOAD INTOR* MOV S.CSR(R4),R1 ;POINT R1 TO DEVICE CSR-22$: CALL $GTWRD ;GET WORD FROM USER BUFFERU CLR (R1) ;CLEAR CSR MOV R0,4(R1) ;SET CRAM ADDRESS MOV (SP),6(R1) ;CRAM CONTENTS MOV #2000,(R1) ;SELECT ADDRESS BIS #20000,(R1) ;WRITE CRAMC CLR (R1) ;RESET;;(; NOW VERIFY THAT IT IS THERE FOR GRINNS;R MOV R0,4(R1) ;CRAM ADDRESS( MOV #2000,(R1) ;SELECT CRAM AT ADDRESS CMP (SP)+,6(R1) ;DATA EQUALR BEQ 26$ ; YES,OKH, JMP ELABCC ;NO, LOAD ERROR FOR MICRO-CODE26$: INC R0 ;NEXT WORD CMP R0,#1024. ;END OF WCS? BLT 22$ ;NOT YETG2 MOV #104000,(R1) ;SET RUN AND ENABLE ARBITRATION .REPT 5% NOP ;WAIT FOR THINGS TO GET GOINGP .ENDR3 BIS #100,(R1)+ ;SET INTERRUPT ENABLE FOR READY INB3 BIS #100,(R1) ;SET INTERRUPT ENABLE FOR READY OUT JMP QUEPKTT; ;I .PAGE! .SBTTL STOP LPA11 ACTIVE REQUESTM;D7; ****** ISSUE A STOP RDA COMMAND TO LPA11-K **********+;R.; FUNCTION DEPENDENT I/O REQUEST PACKET FORMAT; ; WD. 12 -- USER INDEX TO STOP; WORDS 13 THRU 20 NOT USEDC;R?; THE STOP QIO MUST CONTAIN A LUN (POINT TO CORRECT CONTROLLER);=; ROUTINE USES TCB ADDRESS TO ESTABLISH UNIQUENESS OF REQUESTN ; TO STOP. N;F; ******** NOTE !!! THIS STOP PACKET IS IMMEDIATELY DEALLOCATED. THEE; ORIGINAL START PACKET WAS CONVERTED INTO A STOP PACKET IN THE READYEE; OUT INT. ROUTINE, AFTER THE START REQUEST WAS ACCEPTED. IT IS THATM/; PACKET THAT GETS QUEUED FOR THE STOP REQUEST.E;I;RLASTOP:C/ MOV I.PRM(R1),R0 ;PARAM IS USER INDEX TO STOP & BIC #^C<7>,R0 ;INSURE INDEX FROM 0-7! ASL R0 ;MAKE INTO A WORD INDEX ADD R5,R0 ;POINT TO UCB+INDEX, MOV U.LAUT(R0),R1 ;GET PACKET PTR OF START BEQ 40$ ;USER NOT ACTIVE*& MOV (SP),R3 ;GET PACKET PTR OF STOP;E7 CMP I.TCB(R3),I.TCB(R1) ;STOP TASK SAME AS START TASK?E BNE 40$ ;NO, NOT THIS USERD= CLR U.LAUT(R0) ;CLEAR TABLE ENTRY SO WE WON'T BE HERE AGAINI ;THIS USER MATCHES!!!!S;E:; INSERT THE STOP PACKET INTO THE STOP QUEUE FOR THE LPA11E; A SEPARATE I/O QUEUE IS MAINTAINED BY THE DRIVER FOR STOP FUNCTIONS0;E MOV U.LASL(R5),(R1) ;INSERT NEXT ENTRY POINTER INTO CURRENT POINTERM3 MOV R1,U.LASL(R5) ;POINT STOP QUEUE TO THIS ENTRY ;S$ CLR R0 ;STATUS IS REQEUST PENDING,36$: MOV (SP)+,R3 ;ADDRESS OF "STOP" PACKET CLR R1 ;IOSB(2) IS ZERO. CALL $IOFIN ;DEALLOCATE STOP COMMAND PACKET' JMP GETPKT ;LOOK FOR SOMETHING TO DOH; !40$: MOV #1,R0 ;USER NOT ACTIVES BR 36$N;T;S .PAGE+ .SBTTL PROCESS START DATA TRANSFER REQUESTA;E6; ***** PROCESS START DATA TRANSFER RDA **************;C; ADDRESS CHECKING AND RELOCATION OF USER DATA BUFFERS IS DONE HEREN$; (BEFORE THE I/O PACKET IS QUEUED);U/; FUNCTION DEPENDENT I/O REQUEST PACKET FORMAT:T;N7; WD. 12 -- RELOCATION BIAS OF ADDR OF INPUT RDA BUFFERR$; WD. 13 -- INPUT RDA ADDRESS OFFSET(; WD. 14 -- LENGTH OF INPUT RDA IN BYTES5; WD. 15 -- LOW ORDER 16 BITS OF PHYSICAL RDA ADDRESSS=; WD. 16 -- HIGH ORDER 2 BITS - ALWAYS ZERO FOR THIS FUNCTIONR1; BECAUSE THE "REAL" RDA BUFFER IS DYNAMICALLY 5; ALLOCATED IN SYSTEM DYNAMIC MEMORY IE. IN KERNELG; ADDRESS SPACE.E; WD. 17 -- EVENT FLAG MASK; WD. 20 -- EVENT FLAG ADDRESS ; WD. 21 -- RESERVED FOR RSX-11M;Q; ***** NOTE !!!<; ONCE THE 1ST TWO I.PRM WORDS HAVE BEEN MOVED FROM THE I/O <; PACKET TO THE UCB (FOR USE BY $GTWRD), THESE LOCATIONS ARE=; NO LONGER NEEDED FOR THE INPUT RDA ADDRESS AND ARE FREE FOR C; OTHER USEFUL DATA. THIS ROUTINE00*|tt tfDATA STORES THE FOLLOWING INFORMATIONN; IN THESE TWO WORDS:E;E%; WD. 12 -- I.PRM+0-BUFFER WORD COUNTLC; WD. 13 -- I.PRM+2-#WORDS TO BE MAPPED BY UMR'S (22-BIT MODE ONLY);D?; THE READY OUT ROUTINE STORES THE FOLLOWING INFORMATION IN THE1; SECOND OF THESE TWO WORDS:;*); WD. 13 -- I.PRM+2 - THE STOP RDA ITSELFS;VB; WHEN THE UMR'S HAVE TO BE MAPPED IN GETPKT, A BLOCK IS ALLOCATED?; FROM POOL. THE ADDRESS OF THAT BLOCK IS STORED HERE FOR LATERS/; DEALLOCATION FOLLOWING A READY-OUT INTERRUPT:U;E%; WD. 14 -- I.PRM+4-UMR MAPPING BLOCKN;ED; NOTE THAT THE ORIGINAL DATA FROM THESE LOCATIONS HAS BEEN SAVED IN;; THE UCB ENTRY POINT TO THE DRIVER (NEAR LABEL 2$) AT THED;; THE UCB AT THE ENTRY POINT TO THE DRIVER (NEAR LABEL 2$). ;1(; NOTE FOR MACRO PROGRAMMERS USING QIOS:;-L; THE FOLLOWING RDA IS NOT THE SAME STRUCTURE AS THE IBUF ARRAY. THE RDA ISO; A DESCRIPTOR ARRAY PASSED TO THE LPA BY A QIO TO INITIATE A DATA SWEEP. IBUF O; IS SET UP BY THE SUPPORT ROUTINES TO HOLD PARAMETERS AND STRUCTURES NECESSARYRN; TO CONTROL A SWEEP. THESE INCLUDE BUFFER ADDRESSES, USER AND DEVICE QUEUES,P; FLAG WORDS, USER ID, ETC. IT ALSO INCLUDES THE USW AND THE IOSB. THE SUPPORTQ; ROUTINES CREATE AN RDA USING THE INFORMATION IN IBUF AND PASS THE RDA TO LADRV.O; Q; THIS DRIVER WAS WRITTEN IN CONJUNCTION WITH THE SUPPORT ROUTINES AND IT EXPECTSAA; A CERTAIN STRUCTURE IN IBUF. THERE ARE ONLY THREE CONSTRAINTS:I;I*; 1 - THE IBUF ARRAY MUST BE 80 BYTES LONG1; 2 - THE USW MUST BE THE THIRD WORD OF THE ARRAY P; 3 - THE IOSB PASSED TO THE DRIVER MUST NOT BE THE FIRST TWO WORDS OF THE ARRAY;EO; CONSTRAINT 3 EXISTS BECAUSE THE DRIVER EXPECTS TWO CONSECUTIVE 2-WORD IOSB'S PM; STARTING AT THE ADDRESS THAT IS PASSED IN THE I/O PACKET. IF THE FIRST TWOOH; WORDS WERE SPECIFIED AS THE IOSB, THE DRIVER WOULD OVERWRITE THE USW. M; THE SUPPORT ROUTINES USE THE FIRST TWO WORDS OF THE ARRAY AS A USER IOSB. NR; THEY HAVE THE DOUBLE IOSB USED BY THE DRIVER LOCATED HIGHER IN THE IBUF ARRAY. J; THEY COMMUNICATE WITH THE DRIVER USING THE DOUBLE IOSB, AND BEFORE THEY G; RETURN FROM A CALL THEY MOVE THE APPROPRIATE DATA TO THE USER IOSB. R&; THUS THE REQUIRED FORMAT OF IBUF IS:;P"; WORD 00 - UNDEFINED (NOT IOSB)"; WORD 01 - UNDEFINED (NOT IOSB); WORD 02 - USW; WORDS 03-47 - UNDEFINED ; Q; WITHIN THESE CONSTRAINTS MACRO PROGRAMMERS MAY SET UP IBUF IN ANY WAY THEY WISH ; @; THE RDA BUFFER AS SET UP BY THE CALLING ROUTINE IS AS FOLLOWS:;V; WORD 00 - LPA-11 MODE WORD2; WORD 01 - NUMBER OF WORDS TO TRANSFER PER BUFFER(; WORD 02 - ADDRESSS OF USER STATUS WORD-; WORD 03 - LOW BYTE ONLY - VALID BUFFER MASKT; WORD 04 - BUFFER 0 ADDRESS; WORD 05 - BUFFER 1 ADDRESS; WORD 06 - BUFFER 2 ADDRESS; WORD 07 - BUFFER 3 ADDRESS; WORD 10 - BUFFER 4 ADDRESS; WORD 11 - BUFFER 5 ADDRESS; WORD 12 - BUFFER 6 ADDRESS; WORD 13 - BUFFER 7 ADDRESS*; WORD 14 - ADDRESS OF RANDOM CHANNEL LIST; WORD 15 - DELAY WORD?; WORD 16 - CHANNEL INCR (HIGH BYTE) / START CHANNEL (LOW BYTE) 5; WORD 17 - NUMBER OF CHANNELS TO SAMPLE IN SEQUENCE D@; WORD 20 - NUMBER OF CLOCK OVERFLOWS BETWEEN STARTS OF SEQUENCE0; WORD 21 - EVENT MARK WORD / DIGITAL START WORD; WORD 22 - START WORD MASK ; WORD 23 - EVENT MARK MASK 5; WORD 24 - NUMBER OF ELEMENTS IN RANDOM CHANNEL LISTS; ?; THIS ROUTINE CONVERTS THIS INPUT FORMAT RDA INTO THE REAL RDA1=; WHICH IS USED BY THE LPA-11. THIS ROUTINE DOES THE ADDRESST<; CHECKING AND RELOCATION OF USER BUFFERS CONVERTING THEM TO<; 2 WORD PHYSICAL ADDRESSES. IT DOES THE SAME FOR THE RANDOMA; CHANNEL LIST AND USER STATUS WORD. THE FINAL RDA IS CREATED INE>; TASK DYNAMIC MEMORY AND POINTED TO BY WORDS 15 AND 16 IN THE ; I/O PACKET.2; LASTRT:D* MOV #30.*2,R1 ;ALLOCATE DYNAMIC STOREAGE CALL $ALOCB BCC 42$ ;GOT ONEC JMP ELANOD;4; LINK THIS PACKET INTO THE LIST OF DSR FOR THE UNIT;A;42$: MOV U.LADS(R5),(R0) ;POINT THIS PACKET TO NEXT PACKET . MOV R0,U.LADS(R5) ;POINT LIST TO THIS PACKET/ TST (R0)+ ;POINT R0 TO SECOND WORD OF PACKETE;I& MOV (SP),R2 ;002{ccccGET I/O PACKET ADDRESS- MOV R0,I.PRM+6(R2) ;SAVE ADDRESS OF NEW RDAC, CLR I.PRM+10(R2) ;EXTENDED ADDRESS IS ZERO% MOV R0,R3 ;COPY ADDRESS OF NEW RDAK CALL $GTWRD ;MODE MOV (SP)+,(R3)L/ BIC #7,(R3) ;MAKE SURE THIS IS A "START" RDA; BIS #2,(R3)+E CALL $GTWRD ;TRANSFER COUNT0 MOV (SP),(R3)+ ;LEAVE COUNT ON STACK FOR LATER/ BLE 62$ ;ERROR, TRANSFER COUNT MUST BE 1-32K* MOV (SP),I.PRM(R2) ;SAVE BUFF WORD COUNT+ ASL (SP) ;MAKE TRANSFER COUNT BYTE VALUEP( CALL $GTWRD ;USER STATUS WORD ADDRESS D .IF DF A$$CHK!M$$MGE2 ;/ MOV #120,R1 ;ADDRESS CHECK ENTIRE IBUF ARRAYE MOV (SP),R0 ;GET USW ADDRESS - SUB #4,R0 ;PT TO START OF IBUF(=IOSB ADDR)E CALL $ACHCK( BCS 60$ ;ADDRESS CHECK ERROR IF C SET A .ENDC B# MOV (SP),R0 ;RESTORE USW ADDRESSR CALL CVTP ;RLOCATE USWE$ MOV R1,(R3)+ ;SAVE USW ADDRESS LOW ASR R2, ASR R2 & MOVB R2,(R3)+ ;SAVE USW ADDRESS HIGH .IF DF M$$EXT/ MOV #76.,R4 ;OFFSET FROM USW TO FIRST BUFFERP .ENDC* MOV #8.,-(SP) ;COUNTER FOR EIGHT BUFFERS! CALL $GTWRD ;NUMBER OF BUFFERS; MOVB (SP),(R3)+ ;SAVE IN RDA4 BIC #^C<7>,(SP) ;AND OUT ALL BUT NUMBER OF BUFFERS# CLR -(SP) ;HIGH 2 BITS OF OFFSETA"44$: CALL $GTWRD ;BUFFER ADDRESS MOV (SP),R0 . .IF DF A$$CHK!M$$MGE  E MOV 12(SP),R1 ;ADDRESS CHECK CALL $ACHCK BCS 154$ ;ADDRESS CHECK ERROR W .ENDC  .IF NDF M$$EXT2% MOV (SP)+,R0 ;GET ADDRESS OF BUFFER CALL CVTP# MOV R1,(R3)+ ;SAVE ADDRESS IN RDAT ASR R2 ASR R2 MOV R2,(R3)+) .IFFR TST (SP)+ ;CLEAN STACKW2 MOV R4,(R3)+ ;SET BUFFER ADDR AS OFFSET FROM USW! MOV (SP),(R3)+ ;SET HIGH 2 BITSL& ADD 10(SP),R4 ;SPAN PAST THIS BUFFER" ADC (SP) ;DONT FORGET THE CARRY .ENDC& DEC 4(SP) ;COUNT DOWN TOTAL BUFFERS' DEC 2(SP) ;COUNT DOWN BUFFERS TO USEC BGE 44$ ;LOOP TIL DONE4) MOV (SP)+,R2 ;GET HIGH 2 BITS OF OFFSET.) TST (SP)+ ;CLEAN BUFFER TO USE COUNTERS'46$: DEC (SP) ;ANY BUFFERS NOT IN USE; BLT 50$ ;NO, ALL DONE$ CALL $GTWRD ;FETCH WORD FROM USER TST (SP)+ ;IGNORE CLR (R3)+ ;CLEAR NEW RDAE CLR (R3)+ BR 46$ ;AND LOOP/50$: MOV R2,(SP) ;CLEAR STACK OF BUFFER COUNT4/ CALL $GTWRD ;GET RANDOM CHANNEL LIST ADDRESST MOV (SP)+,R0. C .IF DF A$$CHK!M$$MGE  N* BEQ 52$ ;RCL NOT IN USE IF ADDRESS ZERO& MOV #2,R1 ;ADDRESS CHECK FIRST WORD CALL $ACHCK BCS 57$ ;ERROR, BAD BUFFER52$: + .ENDC U .IF NDF M$$EXTE CALL CVTP ;RELOCATE MOV R1,(R3)+ ;SAVE IN RDA  ASR R2  ASR R2L% MOV R2,(R3)+ ;SAVE HIGHT ORDER BITS(* TST (SP)+ ;CLEAN HIGH 2 BITS FROM STACK .IFF3 MOV R4,(R3)+ ;OFFSET FROM USWR& MOV (SP)+,(R3)+ ;SET UMR HIGH 2 BITS .ENDC) MOV #6,-(SP) ;SEVEN MORE ENTRIES IN RDA(54$: CALL $GTWRD MOV (SP)+,(R3)+ DEC (SP) ;END?C BGE 54$ ;NO, LOOP TST (SP)+ .IF DF M$$EXT CALL $GTWRD ;GET RCL LENGTH+ ADD (SP),R4 ;ADD WORD COUNT TWICE TO GETC, ADD (SP)+,R4 ;FINAL LENGTH FOR UMR MAPPING" MOV 4(SP),R3 ;GET PACKET POINTER* MOV R4,I.PRM+2(R3) ;SAVE FOR UMR MAPPING6 MOV (SP),R0 ;CHECK THAT REGION STARTING WITH THE USW1 MOV R4,R1 ;AND (R4) BYTES LONG IS WITHIN USER'SV7 CALL $ACHCK ;ADDRESS SPACE. THE USER SHOULD KNOW THAT(6 BCS 60$ ;HIS IBUF,RCL AND BUFFERS MUST BE CONTIGUOUS' MOV U.SCB(R5),R4 ;RESTORE SCB POINTER$ .ENDC, ADD #4,SP ;CLEAR USW AND COUNT FROM STACK" MOV (SP),R3 ;GET PACKET POINTER8 MOVB I.EFN(R3),R0 ;CALCULATE EVENT FLAG MASK FOR LATER MOV R5,-(SP) ;SAVE R5S$ MOV I.TCB(R3),R5 ;TASK TCB ADDRESS. CALL $CEFI ;CONVERT EFN TO MASK AND ADDRESS MOV (SP)+,R5 ;RESTORE R5+ MOV R0,I.PRM+12(R3) ;SAVE EVENT FLAG MASKG- MOV R1,I.PRM+14(R3) ;AND EVENT FLAG ADDRESSE$ JMP QUEPKT ;FINISH IN COMMON CODE;H; ERROR - BAD BUFFER ADDRESS;O154$: TST (SP)+S"55$: TST (SP)+ ;CLEAR FROM STACK"56$: TST (SP)+ ;CLEAR FROM STACK"57$: TST (SP)+ ;CLEAR FROM STACK(60$: TST (SP)+ ; CLEAN STACK SOME MORE%62$: TST (SP)+ ;WHAT A CLEAN STACK!V64$: JMP ELASP2 ; BAD BUFFER;) .PAGE% .SBTTL READY IN INTERRUPT PROCESSINGE00:|tt tfDATA;T.; INTERRUPT SUBROUTINE FOR READY IN INTERRUPTS;V; ********************H; LABEL $LAOUT:: IS ADDED TO CONFORM TO RSX-11M SYSGEN NAMING CONVENTIONC; WHICH SPECIFIES THAT FOR DUAL VECTORED DEVICES, THE LOW VECTOR IS5G; NAMED $XXINP AND THE HIGH VECTOR IS NAMED $XXOUT. FOR THE LPA-11 KMCAH; MODULE, THE HIGHEST PRIORTY VECTOR (THE OUTPUT) MUST COME FIRST. THUSH; THE OUTPUT VECTOR IS NAMED $LAINP AND THE INPUT VECTOR IS NAMED $LAOUT; ********************;$LAOUT::; ;ILARDI::P INTSV$ LA,PR5,L$$A11,,! CALL $FORK ;;;GO TO FORK LEVEL;*); FORK PROCESSING FOR READY IN INTERRUPTSE;O1 MOV U.SCB(R5),R4 ;POINT TO STATUS CONTROL BLOCKC. CLRB S.CTM(R4) ;CLEAR DEVICE TIMEOUT COUNTER4 CLRB S.STS(R4) ;CLEAR CONTROLER STATUS TO NOT BUSY/ BICB #US.BSY,U.STS(R5) ;CLEAR UNIT BUSY STATUS % MOV S.PKT(R4),R3 ;REQUEST FINISHED?T BEQ 70$ ;YESS$ MOV #1,R0 ;FINISH IT SUCCESSFULLY CLR S.PKT(R4) ;MARK FREE. BIT #2,I.PRM+16(R3) ;DID WE RUN OUT OF POOL? BEQ 66$ ;NO, BRANCH* BIC #2,I.PRM+16(R3) ;YES, CLEAR THAT BIT0 MOV #IE.NOD&377,R0 ;SET APPROPRIATE ERROR CODE'66$: CLR R1 ;SECOND IOSB WORD IS ZEROO .IF DF M$$EXT CMP #IO.INI,I.FCN(R3) BEQ 68$7 CMP #IO.STA,I.FCN(R3) ;START PACKET CONVERTED TO STOP?  BNE 69$ ;NO, BRANCH$ TST I.PRM+16(R3) ;ANY UMRS MAPPED? BEQ 69$ ;NO, BRANCH"68$: CALL UNMAP ;YES, UNMAP THEM' MOV U.SCB(R5),R4 ;RESTORE SCB POINTERY0 CALL $DQUMR ;WAKE UP PROCESS WAITING FOR UMRS69$: .ENDC) CALL $IOFIN ;END OF REQUEST PROCESSING,-70$: JMP GETPKT ;TRY AND GET ANOTHER PACKETD;7 .PAGE. .SBTTL LPA11-K READY OUT INTERRUPT PROCESSING;B5; INTERRUPT SUBROUTINE FOR LPA11 READY OUT INTERRUPTSR;; ******************H; LABEL $LAINP:: IS ADDED TO CONFORM TO RSX-11M SYSGEN NAMING CONVENTION9; SEE COMMENT AT INPUT INTERRUPT FOR FURTHER EXPLANATION.8; ******************;A$LAINP::;ULARDO::R INTSV$ LA,PR5,L$$A11,,3 MOV #U.LAFB+6,R4 ;;;POINT TO READY OUT FORK BLOCKN ADD R5,R4 ;;;" CALL $FORK1 ;;;GO TO FORK LEVEL;P0; FORK PROCESSING FOR LPA11 READY OUT INTERRUPTS;. MOV U.SCB(R5),R4 ;POINT TO SCB& MOV S.CSR(R4),R2 ;DEVICE CSR ADDRESS% MOV 2(R2),R0 ;LPA11 OUT STATUS WORD*+ MOV 6(R2),R1 ;GET MAINTENANCE STATUS BYTEO1 BIC #200,2(R2) ;ACKNOWLEDGE READY OUT INTERRUPT  MOV R0,R3 ;GET USER INDEX ASL R3 ;MAKE WORD OFFSET* BIC #^C<16>,R3A# ADD R5,R3 ;POINT TO USRTB IN UCBP& BIC #377,R0 ;AND OUT READY OUT BYTE- BEQ 100$ ;EQUAL IS START REQUEST PROCESSED;% BPL 71$ ;POSITIVE IS NORMAL STATUS JMP 102$ ;MINUS IS ERROR1;E.; COMMON CODE FOR REPORTING NORMAL USER STATUS;O71$:1 MOV U.LAUT(R3),R2 ;GET I/O PACKET ADDRESS IN R2R0 MOV I.PRM(R2),R1 ;SET WORD COUNT IN IOSB WD. 2"; IOSB WD. 1 =400 FROM LPA11-K72$: MOV R5,-(SP) ;SAVE UCB" MOV R3,-(SP) ;SAVE USRTB POINTER+ MOV U.LAUT(R3),R3 ;POINT R3 TO I/O PACKETR% BEQ 75$ ;IF NO USER NOW, JUST EXITP0 MOV I.TCB(R3),R2 ;POINT TO REQUESTING TASK TCB+ BIT #T2.ABO,T.ST2(R2) ;TASK BEING ABORTED?7! BNE 75$ ;YES, SKIP EVENT FLAG J$ MOV I.IOSB+2(R3),R4 ;GET IOSB BIAS& MOV I.IOSB+4(R3),R2 ;GET IOSB OFFSET ADD #4,R2 ;POINT TO 2ND IOSBG& CMP #140100,R2 ;MAPPING STILL VALID? BHI 172$ ;YES, BRANCH* SUB #64.,R2 ;NO, MAP NEXT 32-WORD BLOCK INC R4:172$:R ( .IF DF M$$MGE V MOV KISAR6,-(SP) ;SAVE KISAR6M MOV R4,KISAR6 ;MAP USER'S IOSB C .IFTF 7! MOV R0,(R2)+ ;STORE STATUS BYTEM MOV R1,(R2) ;IOSB HIGH WORD N .IFTT # MOV (SP)+,KISAR6 ;RESTORE MAPPINGO D .ENDC;$5; ***************************************************I; 73$: I .IF DF A$$TRP T;SA; IF BIT 0 OF THE QIO FUNCTION CODE IS SET, DO NOT QUEUE AST HEREN;T3 BIT #1,I.FCN(R3) ;IS SUBFUNCTION CODE BIT 0 SET?;" BNE 74$ ;YES, DO NOT QUEUE AST;7 TST I.AST(R3) ;AST REQUESTED?V BEQ 74$ ;NO* MOV #6.*2,R1 ;YES, ALLOCATE AN AST BLOCK CALL $ALOCB$ BCS 77$ ;ERROR, NO DYNAMIC MEMORY MOV R0,R1 ;COPY BLOCK ADDRESS+ TST (R0)+ ;POINT PAST AST LIST LINK WORD $ MOV #6.*2,(R0)+ ;SIZE OF AST00B{cccc BLOCK> MOV #8.*2,(R0)+ ;NUMBER OF BYTES TO ALLOCATE ON USER'S STACK* MOV I.AST(R3),(R0)+ ;AST VIRTUAL ADDRESS< MOV #1,(R0)+ ;NUMBER OF EXTRA WORDS TO PUT ON USER'S STACK# MOV I.IOSB(R3),(R0) ;IOSB ADDRESS;' ADD #4,(R0) ;POINT TO 2ND IOSB BLOCK' MOV I.TCB(R3),R0 ;POINT TO TASK'S TCB$. ADD #T.ASTL,R0 ;POINT TO TASK'S AST LISTHEAD3 CALL $QINSF ;INSERT AST BLOCK IN TASK'S AST LISTY74$: , .ENDC B% MOV I.TCB(R3),R5 ;POINT TO TASK TCBA( MOV I.PRM+12(R3),R0 ;SET ARGS FOR SETM MOV I.PRM+14(R3),R1 CALL $SETMN;E;F75$: CMP (SP)+,(SP)+ ;CLEAN STACK I;T76$: RETURN ;RETURN;D;S M;#D; WE RAN OUT OF POOL FOR AST BLOCK. QUEUE STOP PACKET FOR THIS USER9; AND SET BIT 2 OF I.PRM+16 TO SET UP PROPER ERROR CODE.L; .IF DF A$$TRP *77$: MOV (SP)+,R3 ;POP USER TABLE POINTER MOV (SP)+,R5 ;POP UCB POINTER 5 MOV U.LAUT(R3),R2 ;GET THIS USER'S CONVERTED PACKET,' CLR U.LAUT(R3) ;DEACTIVATE THIS ENTRYO7 MOV U.LASL(R5),(R2) ;MOVE STOP QUEUE BEHIND THIS USERV) MOV R2,U.LASL(R5) ;SET NEW QUEUE HEADER:/ BIS #2,I.PRM+16(R2) ;MARK FOR 'NO POOL' ERRORT, JMP GETPKT ;TRY TO DEALLOCATE STOP PACKET P .ENDC ;C;Q;E; STATUS RETURN OF ZEROR'; TRANSFER REQUEST SUCCESSFULLY STARTEDP;E100$: 2 MOV S.PKT(R4),R2 ;GET CURRENT I/O PACKET ADDRESS& MOV R2,U.LAUT(R3) ;STORE IT IN USRTB" MOV R3,R1 ;RETURN INDEX TO USER SUB R5,R1 ;GET INDEX BACK ASR R1C* CLR S.PKT(R4) ;RELINQUISH CURRENT PACKET;L@; THE FOLLOWING CODE TURNS THE ORIGONAL START REQUEST I/O PACKET@; INTO A STOP PACKET FOR ITSELF. THIS ALLOWS ANYONE TO STOP THE,; REQUEST BY SIMPLY RE-QUEUEING THIS PACKET.; MOVB R1,I.PRM+3(R2) ;USER I.D. MOVB #3,I.PRM+2(R2) ;STOP!6 MOV R2,I.PRM+6(R2) ;ADDRESS OF STOP RDA WE JUST MADE8 ADD #I.PRM+2,I.PRM+6(R2) ;ADD IN OFFSET TO PROPER PLACE' CLR I.PRM+10(R2) ;CLEAR EXTENDED BITS @; ABOVE 5 INSTR. CREATE 1 WORD STOP RDA WHICH RESIDES IN IPRM+2.; . BITB #US.MDM,U.STS(R5) ;CANCEL I/O REQUESTED? BNE 101$ ;YES, GO CANCELO& CLR R0 ;IOSB WORD 1 ON ACCEPT START; E; TIMEOUT RAISED TO 255 SEC. IN CASE USER SPECIFIED AN EXTREMELY SLOW F; CLOCK RATE AND IS USING DEDICATED MODE. AFTER THE LPA GETS THE FIRSTD; 256 WORDS OF DATA, IT WILL ISSUE A READY-IN. THE DRIVER WILL CLEARG; THE TIMEOUT THERE. IF THE LPA WILL BE WAITING LONGER THAN 255 SECONDSPB; BEFORE IT CAN ISSUE A READY-IN (DATA SWEEP DELAYED FOR HOURS FOR>; INSTANCE) THIS TIMEOUT CAN BE DISABLED HERE (AND ONLY HERE).; C; ANY READY-IN WILL CLEAR THE TIMEOUT. THUS, IF THE DRIVER RECEIVESOB; ANOTHER REQUEST SUCH AS A CLOCK QIO, THE TIMEOUT LENGTHENED HEREB; WILL BE NULLIFIED WHEN THE LPA ISSUES THE READY-IN FOLLOWING THE; CLOCK REQUEST.;F1 MOVB #255.,S.CTM(R4) ;STRETCH TIMEOUT COUNT NOW. JMP 72$ ;NO, CONTINUE; I; US.MDM FLAGS THAT A CANCEL I/O OCCURED FOR TASK WHILE START REQUEST WASEG; IN PROGRESS. IMMEDIATELY QUEUE A STOP FOR THIS USER INTO THE DRIVERSH; STOP REQUEST QUEUE.L;H6101$: MOV U.LAUT(R3),R1 ;POINT TO ORIGINAL I/O PACKET8 CLR U.LAUT(R3) ;FLAG THAT THE REQUEST IS BEING STOPPED; MOV U.LASL(R5),(R1) ;INSERT IN DRIVERS STOP REQUEST QUEUEU MOV R1,U.LASL(R5) ;POINT TO IT RETURN ;BACK TO CALLER;E); ERROR REPORTED (STATUS RETURN NEGATIVE) ; DISPATCH ON ERROR BITS; 102$:O MOV R0,R2 ;COPY STATUST. BIC #^C<160000>,R2 ;EXTRACT ERROR TYPE FIELD' CMP R2,#160000 ;FATAL HARDWARE ERROR?U BNE 104$ ;NOI. BISB #IE.FHE&377,R0 ;YES, SET RSX ERROR CODE" CLRB S.CTM(R4) ;NO TIME OUTS NOW# BR LAOUT2 ;REPORT ERROR TO USERS(104$:L CMP R2,#140000 ;START ERROR? BEQ 106$ ;YES4 MOV U.LAUT(R3),R2 ;USER ERROR, GET I/O PACKET PNTR BEQ 76$ ;USER NOT ACTIVE NOWT% CLR U.LAUT(R3) ;DEACTIVATE THE USERO% MOV R2,R3 ;COPY I/O PACKET ADDRESST, CMP #124000,R0 ;RESULT OF USW BIT 14 STOP? BNE 103$ ;NO#5 MOVB #IS.SUC&377,R0 ;YES, SET RSX STATUS AS SUCCESS0 ;SIGN EXTEND 0 TO HIGH BYTE1 MOV I.PRM(R2),R1 ;SET WORD COUNT IS IOSB WORD 2O BR 111$ ;FINISH103$:O0 CMP #121400,R0 ;BUFFER OVERRUN/UNDERRUN ERROR? BNE 110$ 00J|tt tfDATA ;NOR3 BISB #IE.DAO&377,R0 ;SET RSX OVERRUN ERROR STATUSU BR 111$ ;FINISH106$:I7 MOV S.PKT(R4),R3 ;START ERROR, GET I/O PACKET POINTERL BEQ 76$ ;NO USER HERE NOW% CLR S.PKT(R4) ;CLEAR PACKET POINTERT110$:#. BISB #IE.ABO&377,R0 ;SET RSX STATUS AS ABORT111$:# .IF DF M$$EXT$ TST I.PRM+16(R3) ;ANY UMRS MAPPED? BEQ 113$ ;NO, BRANCHH- CALL UNMAP ;YES, UNMAP AND DEALLOCATE THEM # MOV U.SCB(R5),R4 ;GET SCB POINTER$' CALL $DQUMR ;WAKE UP WAITING PROCESSR .ENDC&113$: CALLR $IOFIN ;FLUSH THE PACKET;T .PAGE+ .SBTTL DEVICE TIME-OUT AND POWERFAIL LOGICI;M'; DEVICE TIME-OUT AND DEVICE POWER FAILC ; RESET LPA11B8; SET I/O COMPLETION FOR ALL USERS WITH STATUS OF IE.PWR;N;T; POWER FAIL ----. ; REQUEST LOADER TASK IF PRESENT;LAPWF: F .IF DF R$$MPL+ BCC 115$ ; IF CC, UNIT POWERFAIL RECOVERYN. RETURN ; IF CS, CONTROLLER RECOVERY, RETURN115$:E .ENDC R .IF DF M$$MGE & L$$DRV & LD$LAD RB MOV S.FRK+8.(R4),U.LAFB+8.(R5) ;INITIALIZES FORK BLOCK IN UCB FOR% ;FORK1 CALL. NEEDED FOR MAPPEDE% ;SYSTEMS WITH LOADABLE DRIVERSE .ENDC U N MOV R5,R3 ;LOADER TASK NAME( ADD #U.CW2,R3 ;IN UCB U.CW2 AND U.CW3* CALL $SRSTD ;IS IT INSTALLED IN SYSTEM?& BCS 112$ ;NO, DON'T LOAD ON STARTUP* MOV #TUIC,R1 ;DEFAULT UIC OF LOADER TASK MOV R4,-(SP) ;SAVE R4 AND R5 MOV R5,-(SP) * CALL $TSKRT ;REQUEST LOADER TASK TO RUN! MOV (SP)+,R5 ;RESTORE R5 AND R4L MOV (SP)+,R4.112$: MOV #IE.VER&377,R0 ;UNRECOVERABLE ERROR( CLRB S.CTM(R4) ;CLEAR TIME OUT COUNTER CLR R1 ;ZERO IOSB+2' BR LAOUT2 ;LET ANY ACTIVE USERS KNOWN;; DEVICE TIME OUT ;OLAOUT: .IF DF M$$PRO! CALL $CFORK ;CORRECT PROCESSORL .ENDC+ MOV 2(R2),R1 ;;;GET LAST READY OUT STATUSD ;;;DATA MAY BE IRRELEVANT CLRB R1 ;;;CLEAR LOW BYTE. BIS R1,R0 ;;;COMBINE LPA STATUS WITH IE.DNR- MOV 6(R2),R1 ;;;GET MAINTENANCE STATUS WORD8LAOUT2: MOVB S.PRI(R4),@#PS ;;;GO TO PRIORITY OF DEVICE8 MOV #40000,@S.CSR(R4) ;;;DO A DEVICE RESET TO MAKE SURE CLRB @#PS ;;;RESET PRIORITY5 CLRB S.STS(R4) ;CLEAR CONTROLLER STATUS TO NOT BUSYO/ BICB #US.BSY,U.STS(R5) ;CLEAR UNIT BUSY STATUS$' BICB #US.MNT,U.STS(R5) ;UNMAPPING FLAGL) MOV S.PKT(R4),R3 ;A REQUEST IN PROCESS?A BEQ 116$ ;NO  .IF DF M$$EXT% TST I.PRM+16(R3) ;ANY UMR'S MAPPED? BEQ 114$ ;NO, BRANCHP# CALL UNMAP ;DEALLOCATE THE UMR'S;. BISB #US.MNT,U.STS(R5) ;MARK UMRS DEALLOCATED114$:@ .ENDC! CALL $IOFIN ;DEALLOCATE PACKET, MOV U.SCB(R5),R4 ;POINT TO SCB- CLR S.PKT(R4) ;CLEAR CURRENT PACKET POINTERR116$: MOV #-7,-(SP)O MOV #U.LAUT,R2O# ADD R5,R2 ;POINT TO USRTB IN UCBC120$: MOV (R2),R3 ;NEXT ENTRY. BEQ 122$ ;NO REQUEST ACTIVE MOV R2,-(SP)R .IF DF M$$EXT% TST I.PRM+16(R3) ;ANY UMR'S MAPPED?E BEQ 121$ ;NO, BRANCH;# CALL UNMAP ;DEALLOCATE THE UMR'SB. BISB #US.MNT,U.STS(R5) ;MARK UMRS DEALLOCATED121$:. .ENDC1 CALL $IOFIN ;REQEUST ACTIVE, TELL HIM ITS OVER MOV (SP)+,R2O122$: CLR (R2)+ ;CLEAR ENTRY& INC (SP) ;ANY MORE ENTRIES IN LIST? BLE 120$ ;YES, CONTINUE TST (SP)+ ;ALL DONE, EXIT .IF DF M$$EXT; MOV U.LAUB(R5),U.LAUB+2(R5) ;INITIALIZE #OF AVAILABLE UMRSQ/ BITB #US.MNT,U.STS(R5) ;ANY UMR'S DEALLOCATED?F BEQ LACANG ;NO, BRANCH($ CALL $DQUMR ;DEQU WAITING PROCESS3 BICB #US.MNT,U.STS(R5) ;CLEAR UMR DEALLOCATED FLAGB .ENDC BR LACANG;  .PAGE;C#; ********************************* ;E@; THIS SUBROUTINE WILL UNMAP THIS USER'S UMRS AND RETURN THEM TO@; THE LPA POOL. IT WILL DEALLOCATE THE WORK BLOCK TAKEN FROM DSR; IN SUBROUTINE 'MAP'.;+ .IF DF M$$EXT5UNMAP: MOV I.PRM+4(R3),R2 ;GET ADDRESS OF WORK BLOCKT ADD #10,R2 ;POINT TO MAP AREA# MOV R3,-(SP) ;SAVE PACKET POINTERT, MOV M.UMRN(R2),R3 ;GET #OF UMRS TO RECOVER ASR R3W ASR R3O' ADD R3,U.LAUB+2(R5) ;RECOVER THE UMRSD$ CALL $DEUMR ;DEALLOCATE THE UMR'S& MOV (SP),R3 ;RESTORE PACKET POINTER MOV R0,-(SP) ;SAVE IOSBS MOV R1,-(SP) ;SAVE IOSB+2S MOV R5,-(SP) ;SAVE UCB POINTER/ MOV I.PRM+4(R3)00RW{cccc,R0 ;GET ADDRESS OF WORK BLOCKE' MOV #20.,R1 ;WORK BLOCK IS 10. WORDS.) CALL $DEACB ;RETURN WORK BLOCK TO POOL;# MOV (SP)+,R5 ;RESTORE UCB POINTERR MOV (SP)+,R1 ;RESTORE IOSB+2 MOV (SP)+,R0 ;RESTORE IOSB& MOV (SP)+,R3 ;RESTORE PACKET POINTER! CLR I.PRM+16(R3) ;MARK UNMAPPED. RETURN) .ENDC .PAGE .SBTTL CANCEL I/O ENTRY;E"; CANCEL I/O FOR A PARTICULAR TASK2; ALL REQUESTS ARE SCANNED FOR THE TCB OF THE TASK6; EACH ACTIVE REQUEST FOR THE TASK IS MARKED FOR ABORT:; ACTUAL REQUEST STOP IS ISSUED AT READY IN INTERRUPT TIME; LACAN:2 MOV #U.LAUT,R0 ;;;POINT TO ACTIVE REQUEST TABLES ADD R5,R0 ;;;IN UCB6 MOV #8.,R2 ;;;NINE POSSIBLE ENTRIES + CURRENT ENTRY* MOV S.PKT(R4),R3 ;;;REQUEST IN PROGRESS?$ BEQ 126$ ;;;NO REQUEST IN PROCESS" CMP I.TCB(R3),R1 ;;;TCB'S MATCH?" BNE 126$ ;;;NO, DON'T CANCEL ITD BISB #US.MDM,U.STS(R5) ;;;YES, MARK REQ. FOR ABORT WHEN IT FINISHES(126$: MOV (R0)+,R3 ;;;NEXT USER ACTIVE? BEQ 130$ ;;;NOA' CMP I.TCB(R3),R1 ;;;TASK TCB'S MATCH?S BNE 130$ ;;;NOA;IF; STOP THE REQUEST BY PLACING THE ORIGONAL I/O PACKET INTO THE DRIVERS; STOP I/O QUEUE; 5 MOV U.LASL(R5),(R3) ;;;INSERT NEXT INTO NEW CURRENTR. MOV R3,U.LASL(R5) ;;;INSERT CURRENT AS FIRST;S& CLR -2(R0) ;;;DEALLOCATE USER TABLE130$: DEC R2 ;;;NEXT USER " BGT 126$ ;;;STILL SOME TO CHECK MTPS #0 ;;;RESET PRIORITY2LACANG: JMP GETPKT ;GO TO GET A PACKET IF WE CAN .PAGE .SBTTL MISC SERVICE ROUTINESB;1-; CONVERT VIRTUAL ADDRESS TO PHYSICAL ADDRESSM; ENTRYB; R0 - CONTAINS VIRTUAL ADDRESSR;E; EXIT; R0 - DESTROYED!; R1 - PHYSICAL ADDRESS BITS 0-15P"; R2 - PHYSICAL ADDRESS BITS 16-17; R3, R4, R5 PRESERVED;UCVTP: V .IF DF M$$MGE I" MOV R0,R2 ;COPY VIRTUAL ADDRESS SWAB R2 ;EXTRACT APR NUMBER .REPT 4 ASR R2E .ENDR BIC #^C<16>,R2S1 MOV UISAR0(R2),R2 ;PAGE ADDRESS FIELD FROM KT11A" MOV R0,R1 ;COPY VIRTUAL ADDRESS ASL R1 ;EXTRACT BLOCK NUMBERC ASL R1R SWAB R1 BIC #^C<177>,R1 ;BLOCK NUMBERP- ADD R2,R1 ;BLOCK NUMBER+PAGE ADDRESS BLOCKT MOV R1,R2 SWAB R2 ;EXTRACT BITS 16-17 .IF NDF M$$EXTR- BIC #^C<14>,R2 ;PHYSICAL ADDRESS BITS 16-177 .IFF4. BIC #^C<374>,R2 ;PHYSICAL ADDRESS BITS 16-21 .ENDC .REPT 6 ;GET BLOCK * 64.A ASL R1X .ENDR BIC #^C<77>,R04( ADD R0,R1 ;PHYSICAL ADDRESS BITS 0-15 S .IFF, - MOV R0,R1 ;LOW 16 BITS IS PHYSICAL ADDRESSO CLR R2L D .ENDC R RETURNA .ENDK NUMBERC ASL R1R SWAB R1 BIC #^C<177>,R1 ;BLOCK NUMBERP- ADD R2,R1 ;BL .TITLE XMDRV  .IDENT /04.1/;V); COPYRIGHT (C) 1976, 1977,1979,1980,1981.5; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. 01754T;6<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE<; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS:; SOFTWARE OR ANY OTHER COPIES THEREOF MAY NOT BE PROVIDED>; OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.;L?; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT17; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ; DIGITAL EQUIPMENT CORPORATION.;F>; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY@; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.; ; VERSION 04;H; DMC-11 DRIVER ;T;E/; MPP005 -- ALLOW MODE CHANGE ONLY WHEN DEVICE ; IS OFFLINED; $; RC006 -- GENERAL FIX UP FOR M V3.2;#; IZ004 -- CORRECT UMR DEALLOCATIONR; E; RWS002 -- CORRECT SYSTEM CRASH BECAUSE NO I/O PACKET ON QUEUE AFTERG*; IOKILL OR LINE GOING DOWN SPR11-60550# .SBTTL LIBRARY MACROS ;JFR002I* .MCALL CUCDF$,INTSV$,PKTDF$,SCBDF$,UCBDF$( CUCDF$ ;COMMUNICATIONS UCB DEFINITIONS PKTDF$ ;I/O PACKET DEFINITIONS SCBDF$ ;SCB DEFINITIONSA UCBDF$ ;UCB DEFINITIONS  -' .SBTTL CONDITIONAL ASSEMBLY PARAMETERSE; 22 BIT ADDRESSINGE .IIF DF M$$MGE & M$$EXT, X$$22=0; 18 BIT ADDRESSING .IF DF M$$MGE0.IIF NDF M$$EXT, X$$18=0.ENDC #; QIO DRIV00Z|tt tfDATAER PLUS 22 BIT ADDRESSINGE.IIF DF X$$22 Q$$22=0  X$$M11=X$$M11 ; DON'T LAUGHN ; LOADABLE DRIVER MAPPING NEEDED .IIF DF M$$MGE & LD$XM, X$$LDM=0; DYNAMIC UMR ALLOCATION COUNT .IF DF R$$MPL!V$$RSN&Q$$22B.IIF NDF XM$UMR, XM$UMR=5 .IIF NE XM$UMR-3, XM$UMR=5.ENDCE I .SBTTL EQUATED SYMBOLSI; BIT ASSIGNMENTS BIT0=1BIT1=2BIT2=4BIT3=10BIT4=20TBIT5=40NBIT6=100BIT7=200BIT8=400 BIT9=1000 BIT10=2000 BIT11=4000 BIT12=10000I BIT13=20000, BIT14=40000D BIT15=100000; CSR INDEX VALUESSEL0=0SEL2=2; SEL0 ASSIGNMENTSRUN=BIT15 ;RUN'MC=BIT14 ;MASTER CLEARI*RDYI=BIT7 ;MICROPROCESSOR READY FOR INPUT!IEI=BIT6 ;INPUT INTERRUPT ENABLENRQI=BIT5 ;REQUEST INV!TYPE=BIT2!BIT1!BIT0 ;REQUEST TYPEMRELEAS=RQI!IEI ;PORT RELEASE5; SEL0 INPUT TRANSACTION TYPES-BACCI=RQI ;BUFFER ADDRESS/CHARACTER COUNT IN2CNTLI=RQI!BIT0 ;CONTROL IN4BASEI=RQI!BIT1!BIT0 ;BASE INXMT=BACCI ;TRANSMIT BUFFERIRCV=BACCI!BIT2 ;RECEIVE BUFFER09PERR=BASEI ;CAUSE PROCEDURE ERROR BY DOING BASE IN TWICE0; SEL2 ASSIGNMENTS+RDYO=BIT7 ;MICROPROCESSOR READY FOR OUTPUT "IEO=BIT6 ;OUTPUT INTERRUPT ENABLE; SEL6 ASSIGNMENTS (CNTLI)HDX=BIT10 ;HALF DUPLEX=,SCNDRY=BIT11 ;HALF DUPLEX SECONDARY STATIONMOP=BIT8 ;MAINTENANCE MODER; SEL6 ASSIGNMENTS (BASEI)FRESUME=BIT12 ;RESUME AFTER POWERFAIL (PERIPHERALS HANDBOOK IS WRONG!); SEL6 ASSIGNMENTS (CNTLO)/DATACK=BIT0 ;RETRANSMISSION THRESHOLD EXCEEDEDI/TIMOUT=BIT1 ;NO REMOTE RESPONSE FOR 21 SECONDSC4ORUN=BIT2 ;MESSAGE RECEIVED BUT NO BUFFER AVAILABLE'MAINT=BIT3 ;DDCMP MAINTENANCE RECEIVEDR*LOST=BIT4 ;MESSAGE RECEIVED > BUFFER SIZE;DISCON=BIT6 ;MODEM DATA SET READY LEAD WENT FROM ON TO OFFE!START=BIT7 ;DDCMP START RECEIVEDN1MEMORY=BIT8 ;UNIBUS TIME-OUT ON MEMORY REFERENCE6BUG=BIT9 ;PROGRAM BUG!U<UNXINT=BIT14 ;UNEXPECTED INTERRUPT, NO I/O PACKET AVAILABLE(FATAL=TIMOUT!MAINT!LOST!START!MEMORY!BUG; U.CW3 ASSIGNMENTST0U3.ERR=BIT15 ;HAS FATAL ERROR OCCURRED? (1=YES).U3.KIL=BIT14 ;HAS I/O KILL BEEN DONE? (1=YES)(U3.PWF=BIT13 ;HAS POWER FAILED? (1=YES)-U3.MOD=HDX!SCNDRY!MOP ;CURRENT OPERATING MODEE.U3.FRK=BIT0 ;IS FORK PROCESS RUNNING? (1=YES); UCB DISPLACEMENTS USED .ASECTT .=U.VCB+2(U.XQ: .BLKW 1 ;TRANSMIT LISTHEAD ADDRESS'U.RQ: .BLKW 1 ;RECEIVE LISTHEAD ADDRESS U.ERR: .BLKW 1 ;ERROR STATUSU.LEN=.E .PSECTP0; MAXIMUM NUMBER OF BUFFERS WHICH DMC CAN HANDLE .IF DF Q$$22 .IF DF V$$RSN!R$$MPLT.IIF EQ XM$UMR-3, MAXBUF=1.ENDCO.IIF NDF MAXBUF, MAXBUF=2T.ENDCS.IIF NDF MAXBUF, MAXBUF=7); LISTHEAD DISPLACEMENTS .ASECT= .=0 .BLKW 2 ;SENT QUEUE .BLKW 2 ;WAIT QUEUE"IOTYPE: .BLKB 1 ;SEL0 REQUEST TYPECOUNT: .BLKB 1 ;SENT COUNT .IF DF Q$$22UMR: .BLKW 1 ;NEXT UMR TO USEK*UMRSUM: .BLKW 1 ;SUM OF BOTH UMR ADDRESSES .ENDC .PSECTA; FIRST UMR ADDRESSWFIRSTUMR=1702000; WHERE BUFFER ADDRESS AND COUNT ARE TO BE FOUND X.PRM=I.PRMA"; DEVICE INITIALIZATION WAIT TIMES<S.WAIT=200. ;LOOP COUNTDOWN VALUE WAITING FOR RDYI TO BE SET1C.WAIT=100. ;DITTO WAITING FOR RDYI TO BE CLEAREDT D .SBTTL LOCAL DATA; MICROPROCESSOR BASE TABLE(S):; *** WARNING *** THIS MUST BE THE FIRST ASSEMBLY LOCATIONBASE: .REPT X$$M11 .BLKW 128.  .ENDR; DRIVER DISPATCH TABLES .IF DF R$$MPL( DDT$ XM,X$$M11,,INIT,CNTBL,NEW .IFF$ DDT$ XM,X$$M11,,INIT,CNTBL .ENDC; TEMPORARY UNIT SAVEC .IF GT X$$M11-1 TEMP: .BLKW 1A .ENDC ; LISTHEADSTLIST: .REPT X$$M11 .WORD 0,.-2 ;COMPLETED BUFFERST# .WORD 0,.-2 ;TRANSMITS SENT (U.XQ)D .WORD 0,.-2 ;TRANSMITS WAITINGE .BYTE XMT,0 .IF DF Q$$22 .BLKW 2 .IFTF" .WORD 0,.-2 ;RECEIVES SENT (U.RQ) .WORD 0,.-2 ;RECEIVES WAITING .BYTE RCV,0 .IFTM .BLKW 2 .ENDC .ENDR$; MULTIPLE UNIT BASE TABLE ADDRESSES .IF NDF X$$LDM1 .IF GT X$$M11-1BTAB:W BADDR=BASE .REPT X$$M11I .WORD BADDRBADDR=BADDR+256. .ENDR .ENDC .ENDC"; MULTIPLE UNIT LISTHEAD ADDRESSES .IF GT X$$M11-1XLTAB: XLADDR=LIST+4O .REPT X$$M11E .WORD XLADDR. .IF DF Q$$22NXLADDR=XLADDR+32. .IFF0XL00bW{ccccADDR=XLADDR+24.T .ENDC .ENDR .ENDC; ADDRESS EXTENSION BITS .IF DF M$$MGE"AXTAB: .WORD 0,40000,100000,140000 .ENDC I .SBTTL INITIATE I/O;+; **-XMINIT-INITIATE DMC I/O;T ; INPUTS:A; R5=UCB ADDRESS;. ; OUTPUTS:; ALL I/O PACKETS PROCESSED;D; NOTE:.>; IF TIMER IS ACTIVE, DISCONNECT ERROR RECOVERY IS IN PROGRESS;- XMRET: RETURNU%XMINIT: MOV U.SCB(R5),R4 ;SCB ADDRESS1! TSTB S.CTM(R4) ;IS TIMER ACTIVE?1# BNE XMRET ;IF NE, YES - MUST WAITL* MOVB S.STS(R4),-(SP) ;SAVE ACTIVITY COUNT, CLRB S.STS(R4) ;DECLARE CONTROLLER NOT BUSY+ BICB #US.BSY,U.STS(R5) ; AND IDLE THE UNIT0- CALL $GTPKT ;GET AN I/O PACKET IF AVAILABLE- MOVB (SP)+,S.STS(R4) ;RESTORE ACTIVITY COUNTA# BCS XMRET ;IF CS, NO MORE PACKETSL; ; $GTPKT RETURNS THE FOLLOWING:; R1=I/O PACKET ADDRESSC"; R2=PHYSICAL UNIT NUMBER (U.UNIT); R3=CONTROLLER INDEX (S.CON)O; R4=SCB ADDRESS; R5=UCB ADDRESS;. MOV R5,R2 ;UCB ADDRESS ADD #U.CW2,R2 ;U.CW2 ADDRESST9 CMPB #IO.INL/256.,I.FCN+1(R1);IS IT A TRANSFER FUNCTION?  BLOS 2$ ;IF LOS, NOL) JMP TRAN ;ELSE IT IS A TRANSFER REQUEST ;E; CONTROL FUNCTION;T(2$: BNE 20$ ;IF NE, MODE CHANGE REQUEST* TSTB I.FCN(R1) ;IS IT TERMINATE FUNCTION? BNE 10$ ;IF NE, YESR;A; INITIALIZE (IO.INL)R;R- BIT #U2.ONL,(R2) ;IS DEVICE ALREADY ON-LINE?  BNE PKTOK ;IF NE, YESU# MOV R5,CNTBL(R3) ;SAVE UCB ADDRESSO .IF GT X$$M11-1, MOV XLTAB(R3),R0 ;TRANSMIT LISTHEAD ADDRESS .IFF#* MOV #LIST+4,R0 ;TRANSMIT LISTHEAD ADDRESS .ENDC0 MOV R0,U.XQ(R5) ;SAVE TRANSMIT LISTHEAD ADDRESS# ADD #COUNT,R0 ;POINT TO SENT COUNTS CLRB (R0)+ ;ZERO IT OUT .IF DF Q$$22  .IF DF V$$RSN!R$$MPLN .IF NDF R$$MPLT/ TST S.MPR+2(R4) ;DOES UMR BLOCK ALREADY EXIST?  .IFF + MOV S.KRB(R4),R2 ; MOV KRB ADDRESS INTO R22( ADD K.OFF(R2),R2 ;POINT TO UMR AREA + 2+ SUB #M.LGTH,R2 ;POINT TO START OF UMR AREAV! TST (R2) ; IS IT ALREADY SET UP? .ENDC BNE 6$ ;IF NE, YES (!!!) MOV R0,-(SP) ;SAVE R0% MOV R1,-(SP) ;AND THE PACKET ADDRESS. MOV R2,-(SP) ;AND SAVE R22 MOV #M.LGTH,R1 ;SET SIZE OF BLOCK TO BE REQUESTED- CALL $ALOCB ;TRY TO ALLOCATE THE DATA BLOCK. BCS 4$ ;IF C-SET WE FAILED0 MOV #,M.UMRN(R0) ;SETUP UMR COUNT * 4" CALL $ASUMR ;TRY TO GET THE UMRS BCC 5$ ;IF C-CLEAR WE GOT THEM, CALL $DEACB ;ELSE GIVE BACK THE DATA BLOCK4$: MOV (SP)+,R2 ;RESTORE R2! MOV (SP)+,R1 ;AND PACKET ADDRESS  TST (SP)+ ;POP THE STACK6 BR XMRSU ;AND REPORT THE RESOURCE ALLOCATION FAILURE5$: MOV (SP)+,R2 ;RESTORE R2 .IF NDF R$$MPL,) MOV M.UMRA(R0),S.MPR(R4) ;SAVE FIRST UMRZ. MOV R0,S.MPR+2(R4) ;AND THE UMR BLOCK ADDRESS .IFFA$ MOV M.UMRA(R0),(R2) ;SAVE FIRST UMR) MOV R0,2(R2) ; AND THE UMR BLOCK ADDRESST .ENDC= MOV R5,M.UMVL(R0) ;MARK THE UMR BLOCK (FOR SYSTEM DEBUGGING)E) MOV (SP)+,R1 ;RESTORE THE PACKET ADDRESSC' MOV (SP)+,R0 ;AND THE LISTHEAD POINTERR .ENDC .IF NDF R$$MPLC16$: MOV S.MPR(R4),R2 ;FIRST UMR IS FOR BASE TABLE  .IFFE.6$: MOV S.KRB(R4),R2 ; MOV KRB ADDRESS INTO R2( ADD K.OFF(R2),R2 ;POINT TO UMR AREA + 2+ SUB #M.LGTH,R2 ;POINT TO START OF UMR AREAR* MOV (R2),R2 ;R2=FIRST UMR FOR BASE TABLE .ENDC9 CMP (R2)+,(R2)+ ;SECOND AND THIRD UMRS ARE FOR TRANSMITS ! MOV R2,(R0)+ ;SECOND UMR ADDRESS, MOV R2,(R0) .IF EQ MAXBUF-2 & CMP (R2)+,(R2)+ ;GET TO THE THIRD UMR .ENDCC4 ADD R2,(R0)+ ;SUM OF SECOND AND THIRD UMR ADDRESSES .IFTF/ MOV R0,U.RQ(R5) ;SAVE RECEIVE LISTHEAD ADDRESSS .IFT # ADD #COUNT,R0 ;POINT TO SENT COUNTM CLRB (R0)+ ;ZERO IT OUTD8 CMP (R2)+,(R2)+ ;FOURTH AND FIFTH UMRS ARE FOR RECEIVES! MOV R2,(R0)+ ;FOURTH UMR ADDRESS, MOV R2,(R0) .IF EQ MAXBUF-2.& CMP (R2)+,(R2)+ ;GET TO THE FIFTH UMR .ENDC 4 ADD R2,(R0) ;SUM OF FOURTH AND FIFTH UMR ADDRESSES .IFF, CLRB COUNT(R0) ;ZERO OUT RECEIVE SENT COUNT .ENDC& CALL SETDMC ;INITIALIZE DMC HARDWARE$ BCS XMINF ;IF CS, HARDWARE TROUBLE' BIS #U2.ONL,U.CW2(R5) ;SET ON-LINE BITR8 BIC #^C,U.CW3(R5) ;CLEAR EVERYTHING EXCEPT MODE$ BR PKTOK ;RETURN SUCCESSFUL STATUS;+; TERMINAT00j|tt tfDATAE (IO.TRM);R&10$: MOV R1,-(SP) ;SAVE PACKET ADDRESS CLR R0 ;NO SPECIAL ERROR CODEM CALL KILL ;KILL THE DEVICE-16$: MOV (SP)+,R1 ;RESTORE THE PACKET ADDRESSO$ BR PKTOK ;RETURN SUCCESSFUL STATUS;; MODE CHANGE FUNCTION;U)20$: BIT #U2.ONL,(R2) ;IS DEVICE ON-LINE?  BNE XMDNR ;IF NE, YES4 BITB #IO.HDX,I.FCN(R1);IS SUB-FUNCTION HALF-DUPLEX? BNE 30$ ;IF NE, YES 4 BITB #IO.FDX,I.FCN(R1);IS SUB-FUNCTION FULL DUPLEX? BEQ XMIFC ;IF EQ, NO;N; FULL DUPLEX (IO.FDX);E6 BIT #U2.LIN,(R2) ;WAS DEVICE SYSGENED AS HALF-DUPLEX? BNE XMIFC ;IF NE, YESE, BIC #U2.HDX,(R2)+ ;SET FULL DUPLEX IN U.CW2$ CLR (R2) ;HALF-DUPLEX MODE BIT OFF BR 50$R;O; HALF-DUPLEX (IO.HDX);S030$: BIS #U2.HDX,(R2)+ ;SET HALF-DUPLEX IN U.CW2$ MOV #HDX,(R2) ;HALF-DUPLEX MODE BIT( TST I.PRM(R1) ;LOOK AT QIO PARAMETER P1! BEQ 40$ ;IF EQ, PRIMARY STATIONP+ BIS #SCNDRY,(R2) ;IF NE, SECONDARY STATION..40$: TST I.PRM+2(R1) ;LOOK AT QIO PARAMETER P2 BEQ 50$ ;IF EQ, NORMAL MODE ' BIS #MOP,(R2) ;IF NE, MAINTENANCE MODEC50$: ;FALL THRU TO PKTOKB I .SBTTL FINISH I/O PACKETH;+0; **-PKTOK-FINISH PACKET WITH STATUS OF "IS.SUC"; **-FINPKT-ALTERNATE ENTRYO; ; INPUTS: ; R1=I/O PACKET ADDRESS2; R5=UCB ADDRESS;D; CALLING SEQUENCE:# ; JMP PKTOKF;P ; OUTPUTS:; PACKET FINISHEDO(; XMINIT CALLED TO START ANY NEW PACKETS;-.PKTOK: MOV #IS.SUC&377,-(SP);SUCCESSFUL STATUS)FINPKT: MOV R1,-(SP) ;SAVE PACKET ADDRESSI! CALL XMINIT ;TRY ANOTHER PACKETO% MOV (SP)+,R3 ;RESTORE PACKET ADDRESST MOV (SP)+,R0 ;STATUS WORD 1 CLR R1 ;STATUS WORD 2 = 0I! CALLR $IOFIN ;FINISH I/O PACKETF;S; DEVICE NOT READY; !XMINF: .IF DF R$$MPL!V$$RSN&Q$$22R CALL DEUMR ;DE-ALLOCATE UMR'SE .ENDCXMDNR: MOV #IE.DNR&377,-(SP) BR FINPKT;#; ILLEGAL BUFFER; XMSPC: MOV #IE.SPC&377,-(SP) BR FINPKT; ; ILLEGAL FUNCTION CODE;XMIFC: MOV #IE.IFC&377,-(SP) BR FINPKT;S; RESOURCE ALLOCATION FAILUREC;  .IF DF R$$MPL!V$$RSN&Q$$22AXMRSU: MOV #IE.RSU&377,-(SP) BR FINPKT .ENDC T% .SBTTL PROCESS QIO TRANSFER FUNCTION ;T; TRANSFER FUNCTIONR;O*TRAN: BIT #U2.ONL,(R2) ;IS DEVICE ON-LINE? BEQ XMDNR ;IF EQ, NO .IF DF X$$225 BIT #160000,I.PRM+4(R1) ;IS BUFFER SIZE >= 4K WORDS?E# ;BUFFER MUST BE MAPPED BY 1 UMRE .IFF5 BIT #140000,I.PRM+4(R1) ;IS BUFFER SIZE >= 8K WORDS?  .ENDCU+ BNE XMSPC ;IF NE, YES - BUFFER IS TOO BIG$ INCB S.STS(R4) ;INCR ACTIVITY COUNT .IF DF X$$18) MOV I.PRM(R1),R0 ;GET NPR EXTENSION BITSU+ SWAB R0 ;AND SHIFT FROM BIT POSITIONS 5-4R ASL R0 ;TO BIT POSITIONS 15-14 ASL R0F- BIS R0,I.PRM+4(R1) ;THEN AND WITH BYTE COUNTS .ENDCN7 CMPB #IO.WLB/256.,I.FCN+1(R1) ;IS IT A WRITE FUNCTION?0 BEQ 10$ ;IF EQ, YESE;I!; RECEIVE DATA (IO.RLB OR IO.RNS)B;A* MOV U.RQ(R5),R0 ;RECEIVE LISTHEAD ADDRESS BR 20$B;E"; TRANSMIT DATA (IO.WLB OR IO.WNS);X/10$: MOV U.XQ(R5),R0 ;TRANSMIT LISTHEAD ADDRESST/20$: MOV #XMINIT,-(SP) ;SET TO RETURN TO XMINITV ;FALL THRU TO TRYE N+ .SBTTL TRY TO GIVE TRANSFER REQUEST TO DMCI;+,; **-TRY-TRY TO GIVE TRANSFER REQUEST TO DMC; ; INPUTS:R+; R0=SENT Q LISTHEAD ADDRESS (U.XQ OR U.RQ); R1=I/O PACKET ADDRESSN; R4=SCB ADDRESS; R5=UCB ADDRESS;1$; OUTPUTS IF PORT WAS NOT AVAILABLE:; R0=WAIT Q LISTHEAD ADDRESS; R2,R3=DESTROYED ; R4=CSR ADDRESS; PACKET QUEUED ON WAIT QT;I.; OUTPUTS IF PORT WAS AVAILABLE BUT NOT READY:; R0=WAIT Q LISTHEAD ADDRESS; R2,R3=DESTROYEDE; R4=CSR ADDRESS; REQUEST TYPE!IEI LEFT IN SEL0; PACKET QUEUED ON WAIT QR;Q*; OUTPUTS IF PORT WAS AVAILABLE AND READY:; R2,R3=DESTROYEDC; R4=CSR ADDRESS$; DMC GIVEN BUFFER ADDRESS AND COUNT; DMC PORT RELEASEDE; SENT COUNT INCREMENTED; PACKET QUEUED ON SENT Q ;-'TRY: MTPS S.PRI(R4) ;DISABLE INTERRUPTS MOV S.CSR(R4),R4 ;;;CSR ADDRESS TST 4(R0) ;;;IS WAIT Q EMPTY?Q+ BNE 30$ ;;;IF NE, NO - NO ACTION POSSIBLEV! CALL PORT ;;;IS PORT AVAILABLE?  BCS 30$ ;;;IF CS, NO- BIT #RDYO,2(R4) ;;;IS OUTPUT TRANSFER READY?I( BNE 20$ ;;;IF NE, YES - USE INTERRUPTS M00rW{ccccOV #4,R2 ;;;LOOP COUNTA.10$: BIT #RDYI,(R4) ;;;IS DMC READY FOR INPUT? BNE 40$ ;;;IF NE, YES  SOB R2,10$ ;;;,20$: BIS #IEI,(R4) ;;;ENABLE INPUT INTERRUPT BIS #IEI,(R4) ;;;TWICE /30$: CMP (R0)+,(R0)+ ;;;WAIT Q LISTHEAD ADDRESSR( CALL $QINSF ;;;INSERT PACKET ON WAIT Q ;;;NOTE-$QINSF DESTROYS R2 BR 50$ ;;;*40$: CALL GIVE ;;;GIVE PACKET INFO TO DMC%50$: MTPS #0 ;;;RE-ENABLE INTERRUPTSI RETURN T4 .SBTTL LOAD DATA PORT WITH BUFFER ADDRESS AND COUNT;+.; **-GIVE-GIVE BUFFER ADDRESS AND COUNT TO DMC;A ; INPUTS:#; R0=SENT Q LISTHEAD ADDRESS; R1=I/O PACKET ADDRESSE; R4=CSR ADDRESS; DMC READY FOR INPUTR;; ; OUTPUTS:; R2,R3=DESTROYED#$; DMC GIVEN BUFFER ADDRESS AND COUNT; DMC PORT RELEASED ; SENT COUNT INCREMENTED; PACKET INSERTED ON SENT Q ;-,GIVE: INCB COUNT(R0) ;;;INCREMENT SENT COUNT .IF DF Q$$22A$ MOV R0,R2 ;;;COPY LISTHEAD ADDRESS" MOV UMR(R2),R0 ;;;NEXT UMR TO USE1 MOV UMRSUM(R2),UMR(R2) ;;;RESET NEXT UMR ADDRESS SUB R0,UMR(R2) ;;;B& MOV R2,-(SP) ;;;SAVE LISTHEAD ADDRESS0 MOV X.PRM(R1),R2 ;;;PUT 18 BIT ADDRESS IN R2,R3 SWAB R2 ;;;  MOV X.PRM+2(R1),R3 ;;;D4 CALL MAP22 ;;;DO 22 BIT MAPPING AND LOAD DATA PORT, BIS X.PRM+4(R1),6(R4) ;;;INCLUDE BYTE COUNT) MOV (SP)+,R0 ;;;RESTORE LISTHEAD ADDRESST .IFFE1 MOV X.PRM+2(R1),4(R4) ;;;GIVE DMC BUFFER ADDRESS # MOV X.PRM+4(R1),6(R4) ;;;AND COUNT, .ENDC% BIC #RELEAS,(R4) ;;;RELEASE THE PORTN) CALLR $QINSF ;;;INSERT PACKET ON SENT QR ;;;NOTE-$QINSF DESTROYS R2 ( .SBTTL INITIALIZE DMC HARDWAREI;+#; **-SETDMC-INITIALIZE DMC HARDWARE ; ; INPUTS:R; R3=CONTROLLER INDEX (S.CON)M; R4=SCB ADDRESS; R5=UCB ADDRESS; U3.MOD=DMC MODEO;D ; OUTPUTS:; R0,R2,R3=DESTROYED; R4=CSR ADDRESS; CARRY CLEAR=OK); CARRY SET=HARDWARE NOT WORKING PROPERLYX;- .ENABL LSB;3SETDMC: CLR U.ERR(R5) ;CLEAR ERROR STATUS AND C-BIT .IF DF X$$22 .IF NDF R$$MPL ) MOV S.MPR(R4),R0 ;GET THE BASE TABLE UMRE .IFFE+ MOV S.KRB(R4),R0 ; MOV KRB ADDRESS INTO R0( ADD K.OFF(R0),R0 ;POINT TO UMR AREA + 2+ SUB #M.LGTH,R0 ;POINT TO START OF UMR AREA ! MOV (R0),R0 ;GET BASE TABLE UMRC .ENDC .ENDC MOV S.CSR(R4),R4 ;CSR ADDRESS# BIS #MC,(R4) ;MASTER CLEAR THE DMC3C; THE FOLLOWING INSTRUCTION NEEDED WITH COMIOP BOARD AND OK WITHOUTN( MOV #RUN,(R4) ;START THE MICROPROCESSOR- BIS #IEO,2(R4) ;ENABLE COMPLETION INTERRUPTS ' MOVB #BASEI,(R4) ;BASE IN REQUEST TYPE CALL WRDYIS ;WAIT FOR RDYI SET BCS 40$ ;IF CS, TROUBLEK;R2; THE BASE TABLE ADDRESS IS CALCULATED AS FOLLOWS:0; IF UNMAPPED, USE EITHER "#BASE" OR "BTAB(R3)".=; IF MAPPED AND DMC DRIVER IS NOT LOADABLE, SAME AS UNMAPPED.;; IF MAPPED AND DMC DRIVER IS LOADABLE, USE KISAR5 CONTENTSE; SHIFTED LEFT 6 PLACES.L;N9; THUS, THE UMR IS ALWAYS SET TO THE ADDRESS OF THE FIRSTV<; BASE TABLE AND THE 18 BIT ADDRESS IS ADJUSTED ACCORDINGLY.;P .IF DF X$$LDM CLR R2 ;NO EXTENSION BITS YETE .IF DF X$$22 ASR R3 ;CALCULATE UNIT # * 400 SWAB R3 MOV R3,-(SP) ;SAVE IT ON STACKE5 MOV KISAR5,R3 ;UMR ALWAYS POINTS TO FIRST BASE TABLE  .IFF% ASL R3 ;BASE TABLE DISPLACEMENT/100I' ADD KISAR5,R3 ;PLUS DRIVER ADDRESS/100M .IFTFM" MOV #6,-(SP) ;NOW MULTIPLY BY 100#5$: ASL R3 ;BY SHIFTING R2,R3 LEFT ROL R2 ;6 PLACES DEC (SP) ;DONE?D BNE 5$ ;IF NE, NO  TST (SP)+ ;PURGE LOOP COUNTS .IFT2 CALL MAP22 ;DO 22 BIT MAPPING AND LOAD DATA PORT5 ADD (SP)+,4(R4) ;ADJUST BY MULTIPLE BASE TABLE INDEXL .IFF% MOV R3,4(R4) ;LOW 16 BITS OF ADDRESSO ASL R2 ;MAKE A WORD INDEX , MOV AXTAB(R2),6(R4) ;ADDRESS EXTENSION BITS .ENDC; .IFFE .IF GT X$$M11-1A+ MOV BTAB(R3),4(R4) ;LOW 16 BITS OF ADDRESSI .IFF( MOV #BASE,4(R4) ;LOW 16 BITS OF ADDRESS .ENDC  CLR 6(R4) ;NO EXTENSION BITS .ENDC3 CALL WRDYIC ;RELEASE PORT AND WAIT FOR RDYI CLEARR BCS 40$ ;IF CS, TROUBLE* MOVB #CNTLI,(R4) ;CONTROL IN REQUEST TYPE CALL WRDYIS ;WAIT FOR RDYI SET BCS 40$ ;IF CS, TROUBLEL0 MOV U.CW3(R5),-(SP) ;STRIP MODE BITS FROM U.CW3 BIC #^C,(SP)R MOV (SP)+,600z|tt tfDATA(R4) ;SET DMC MODE ;FALL THRU TO WRDYIC;E&; RELEASE PORT AND WAIT FOR RDYI CLEAR;B*WRDYIC: BIC #RELEAS,(R4) ;RELEASE THE PORT MOV #C.WAIT,R2 ;LOOP COUNTB'10$: BIT #RDYI,(R4) ;IS RDYI STILL SET?N BEQ 40$ ;IF EQ, NO SOB R2,10$ # BR 30$ ;RDYI NOT CLEARED PROPERLYY;L; WAIT FOR RDYI SETS;R"WRDYIS: MOV #S.WAIT,R2 ;LOOP COUNT!20$: BIT #RDYI,(R4) ;IS RDYI SET?  BNE 40$ ;IF NE, YES SOB R2,20$L!30$: SEC ;RDYI NOT SET PROPERLYE 40$: RETURNC .DSABL LSB. > .SBTTL DO 22 BIT MAPPINGE;+/; **-MAP22-DO 22 BIT MAPPING AND LOAD DATA PORTT;D ; INPUTS:D; R0=UMR ADDRESS; R2,R3=22 BIT PHYSICAL ADDRESS ; R4=CSR ADDRESS; ; OUTPUTS:; R0,R2,R3=DESTROYED"; UMR LOADED WITH PHYSICAL ADDRESS*; DATA PORT LOADED WITH 18 BIT UMR ADDRESS;- .IF DF X$$22 &MAP22: MOV R3,(R0) ;COPY R2,R3 TO UMR- BIC #1,(R0)+ ;FIRST WORD OF UMR MUST BE EVENS MOV R2,(R0)+ * SUB #FIRSTU+4,R0 ;UMR# IS NOW IN BITS 6-2 SWAB R0 ASL R0( CLR R2 ;FORM AN 18 BIT NUMBER IN R2,R0- ASL R0 ;WITH BITS 17-13 CONTAINING THE UMR#M ROL R2D ASL R0A ROL R2D ROR R3 ;ODD/EVEN BIT TO CARRY & ADC R0 ;AND THEN TO BIT 0 OF ADDRESS2 MOV R0,4(R4) ;LOW 16 BITS OF ADDRESS TO DATA PORT ASL R2 ;MAKE A WORD INDEXS9 MOV AXTAB(R2),6(R4) ;ADDRESS EXTENSION BITS TO DATA PORT  RETURN .ENDC , .SBTTL PROCESS RDYI INTERRUPT;); PROCESS RDYI INTERRUPT;EC$XMINP::INTSV$ XM,PR5,X$$M11,,CNTBL ;;;GENERATE INTERRUPT SAVE CODEA0 JSR R0,XMSET ;;;DO INTERRUPT SETUP AND TRANSFER .WORD SEL0 ;;;CSR INDEX $ .WORD XMTRDY ;;;TRANSFER ADDRESSES .WORD BAD .WORD BAD .WORD FPERR .WORD RCVRDY .WORD BAD .WORD BAD .WORD BAD;; DMC READY FOR TRANSMIT BUFFERR; 4XMTRDY: MOV U.XQ(R5),R0 ;;;TRANSMIT LISTHEAD ADDRESS$ JSR R1,RDYINT ;;;GIVE BUFFER TO DMC;A; DMC READY FOR RECEIVE BUFFER;B3RCVRDY: MOV U.RQ(R5),R0 ;;;RECEIVE LISTHEAD ADDRESSR$ JSR R1,RDYINT ;;;GIVE BUFFER TO DMC;N; FORCE PROCEDURE ERROR ;E5FPERR: BIC #RELEAS,(R4) ;;;CLEAR RQI WHICH WILL CAUSER BR XMINTX ;;;CNTLO INTERRUPT D3 .SBTTL PROCESS COMPLETION OR CONTROL OUT INTERRUPTD;O; PROCESS COMPLETION INTERRUPT;DC$XMOUT::INTSV$ XM,PR5,X$$M11,,CNTBL ;;;GENERATE INTERRUPT SAVE CODEM0 JSR R0,XMSET ;;;DO INTERRUPT SETUP AND TRANSFER .WORD SEL2 ;;;CSR INDEXF$ .WORD XMTCOM ;;;TRANSFER ADDRESSES .WORD CNTLO .WORD BAD .WORD BAD .WORD RCVCOMH .WORD CNTLO .WORD BAD .WORD BAD;E; TRANSMIT BUFFER COMPLETE; 4XMTCOM: MOV U.XQ(R5),R0 ;;;TRANSMIT LISTHEAD ADDRESS) JSR R1,BUFCOM ;;;PROCESS BUFFER COMPLETET;D; RECEIVE BUFFER COMPLETEN; 3RCVCOM: MOV U.RQ(R5),R0 ;;;RECEIVE LISTHEAD ADDRESST) JSR R1,BUFCOM ;;;PROCESS BUFFER COMPLETEN; ; CONTROL OUTE;P)CNTLO: MOV 4(R4),R0 ;;;COPY SEL6 CONTENTS # BIC #RDYO,(R4) ;;;RELEASE THE PORTS( BIS R0,U.ERR(R5) ;;;UPDATE ERROR STATUS& BIT #FATAL,R0 ;;;IS IT A FATAL ERROR? BEQ 20$ ;;;IF EQ, NO/ BIT #BUG,R0 ;;;IS IT DISCONNECT ERROR PART 2?B BEQ 10$ ;;;IF EQ, NO MOV U.SCB(R5),R4 ;;;SCB ADDRESS; MOVB #2,S.CTM(R4) ;;;SET TIMER FOR BETWEEN 1 AND 2 SECONDS ) ;;;NOTE-ONLY 1 SECOND DELAY IS NEEDED.+ BR XMFRK ;;;CAN'T MASTER CLEAR UNTIL THENR*10$: BIS #MC,-(R4) ;;;MASTER CLEAR THE DMC BR XMFRK ;;;START FORK PROCESS.20$: BIT #DISCON,R0 ;;;IS IT DISCONNECT ERROR? BEQ XMINTX ;;;IF EQ, NOU. MOVB #PERR!IEI,-2(R4);;;CAUSE PROCEDURE ERROR ;;;FALL THRU TO XMINTX; ; EXIT FROM INTERRUPT ;DBAD:"XMINTX: MOV (SP)+,R0 ;;;RESTORE R0# JMP $INTXT ;;;EXIT FROM INTERRUPTA E1 .SBTTL SETUP FOR INTERRUPT ROUTINES AND TRANSFERN;+4; **-XMSET-SETUP FOR INTERRUPT ROUTINES AND TRANSFER;M ; INPUTS:'; R0=CALLING REGISTERE; INTSV$ HAS BEEN DONE;;; CALLING SEQUENCE:C; JSR R0,XMSET&; .WORD ;;;CSR INDEX (EITHER 0 OR 2)); .BLKW 8. ;;;TRANSFER ADDRESSES BY TYPEI; ; OUTPUTS: (IF VALID INTERRUPT)2; R4=CSR ADDRESS; R5=UCB ADDRESS; (SP)=SAVED R0N;*; ALTERNATE RETURN: (IF INVALID INTERRUPT); RETURN TO $INTXT;-0XMSET: TST R5 ;;;HAS UCB BEEN ENTERED IN TABLE? BEQ XMINTX ;;;IF EQ, NOO( BIT #00W{ccccU2.ONL,U.CW2(R5);;;IS DMC ON-LINE? BEQ XMINTX ;;;IF EQ, NON MOV U.SCB(R5),R4 ;;;SCB ADDRESS MOV S.CSR(R4),R4 ;;;CSR ADDRESS ADD (R0)+,R4 ;;;PLUS CSR INDEX1 MOV (R4),-(SP) ;;;STRIP EVERYTHING BUT TYPE BITS  BIC #^C,(SP)A ASL (SP) ;;;MAKE A WORD INDEXU. ADD (SP)+,R0 ;;;ADD TO TRANSFER TABLE ADDRESS JMP @(R0)+ ;;;AND GO!S D .SBTTL RDYI INTERRUPT ROUTINES ;+; **-RDYINT-GIVE BUFFER TO DMC;- ; INPUTS:T+; R0=SENT Q LISTHEAD ADDRESS (U.XQ OR U.RQ)X; R1=CALLING REGISTERB; R4=CSR ADDRESS; R5=UCB ADDRESS; 2(SP)=INTERRUPT SAVED R0;; CALLING SEQUENCE:S; JSR R1,RDYINTS;R ; OUTPUTS:$; DMC GIVEN BUFFER ADDRESS AND COUNT; DMC PORT RELEASEDP5; ATTEMPT MADE TO SETUP ANOTHER BUFFER OF EITHER TYPEP; INTERRUPT EXITED;-"RDYINT: MOV R2,-(SP) ;;;SAVE R2,R3 MOV R3,-(SP) ;;;D- CMP (R0)+,(R0)+ ;;;ADVANCE TO WAIT Q ADDRESSI0 CALL $QRMVF ;;;REMOVE FIRST PACKET FROM WAIT Q! ;;;NOTE-$QRMVF DESTROYS R2,R3 , BCS 20$ ;;;NO PACKET ON QUEUE IF CARRY SET+ CMP -(R0),-(R0) ;;;RESET TO SENT Q ADDRESSE! CALL GIVE ;;;GIVE BUFFER TO DMC* CALL ITRY ;;;TRY TO SETUP ANOTHER BUFFER%10$: MOV (SP)+,R3 ;;;RESTORE R1,R2,R3A MOV (SP)+,R2 ;;;T MOV (SP)+,R1 ;;;P" BR XMINTX ;;;EXIT FROM INTERRUPT220$: BIS #UNXINT,U.ERR(R5) ;;;FLAG ERROR CONDITION! BR 10$ ;EXIT AFTER POPING STACK; C% .SBTTL COMPLETION INTERRUPT ROUTINESR;+#; **-BUFCOM-PROCESS BUFFER COMPLETEF; ; INPUTS: +; R0=SENT Q LISTHEAD ADDRESS (U.XQ OR U.RQ)N; R1=CALLING REGISTERR; R4=CSR ADDRESS+2; R5=UCB ADDRESS; 2(SP)=INTERRUPT SAVED R0;G; CALLING SEQUENCE:C; JSR R1,BUFCOMT;E ; OUTPUTS:1; CHARACTER COUNT STORED IN X.PRM+4 OF I/O PACKETV*; PACKET MOVED FROM SENT Q TO COMPLETION Q; DMC PORT RELEASEDR5; ATTEMPT MADE TO SETUP ANOTHER BUFFER OF EITHER TYPEN*; FORK PROCESS STARTED IF IT'S NOT RUNNING; INTERRUPT EXITED;-"BUFCOM: MOV R2,-(SP) ;;;SAVE R2,R3 MOV R3,-(SP) ;;;T' DECB COUNT(R0) ;;;DECREMENT SENT COUNTA* CALL $QRMVF ;;;REMOVE PACKET FROM SENT Q! ;;;NOTE-$QRMVF DESTROYS R2,R3D0 MOV 4(R4),X.PRM+4(R1);;;PUT COUNT IN I/O PACKET .IF DF M$$MGE8 BIC #140000,X.PRM+4(R1) ;;;CLEAR ADDRESS EXTENSION BITS .ENDC# BIC #RDYO,(R4) ;;;RELEASE THE PORTT4 MOV U.XQ(R5),R0 ;;;TRANSMIT SENT Q LISTHEAD ADDRESS1 CMP -(R0),-(R0) ;;;COMPLETION Q LISTHEAD ADDRESSE. CALL $QINSF ;;;INSERT PACKET ON COMPLETION Q ;;;NOTE-$QINSF DESTROYS R2 TST -(R4) ;;;SEL0 ADDRESST* CALL ITRY ;;;TRY TO SETUP ANOTHER BUFFER! MOV (SP)+,R3 ;;;RESTORE R1,R2,R3  MOV (SP)+,R2 ;;;- MOV (SP)+,R1 ;;;R ;;;FALL THRU TO XMFRK; T .SBTTL FORK PROCESSING.; (; START FORK PROCESS IF IT'S NOT RUNNING;R7XMFRK: BIT #U3.FRK,U.CW3(R5);;;IS FORK PROCESS RUNNING?T BNE XMINTX ;;;IF NE, YES MOV (SP)+,R0 ;;;RESTORE R0D6 BIS #U3.FRK,U.CW3(R5);;;INDICATE FORK PROCESS RUNNING% CALL $FORK ;;;CREATE SYSTEM PROCESSP;I; FORK LEVEL PROCESSINGD;R2 MOV U.XQ(R5),R0 ;TRANSMIT SENT Q LISTHEAD ADDRESS/ CMP -(R0),-(R0) ;COMPLETION Q LISTHEAD ADDRESSS"10$: MOV U.SCB(R5),R4 ;SCB ADDRESS# MTPS S.PRI(R4) ;DISABLE INTERRUPTST6 CALL $QRMVF ;;;REMOVE FIRST PACKET FROM COMPLETION Q BCS 20$ ;;;IF CS, Q WAS EMPTYR! MTPS #0 ;;;RE-ENABLE INTERRUPTS " MOV #IS.SUC&377,R2 ;STATUS WORD 1/ MOV X.PRM+4(R1),R4 ;STATUS WORD 2 = BYTE COUNTS! CALL RAP ;RETURN THE I/O PACKETP BR 10$ ;AND TRY AGAINR420$: BIC #U3.FRK,U.CW3(R5);;;NO MORE FORK PROCESSING! MTPS #0 ;;;RE-ENABLE INTERRUPTST0 BIT #FATAL,U.ERR(R5) ;HAS FATAL ERROR OCCURRED? BEQ EXIT ;IF EQ, NOS' BIT #LOST,U.ERR(R5) ;WAS IT LOST DATA?  BEQ 30$ ;IF EQ, NO1 MOV U.RQ(R5),R0 ;RECEIVE SENT Q LISTHEAD ADDRESS 2 MOV #IE.DAO&377,R2 ;RETURN FIRST PACKET ON SENT Q( CALL DQRAP0 ;WITH A STATUS OF "IE.DAO"$30$: MOV #U3.ERR,R0 ;FATAL ERROR BIT0 MOV #IE.CNR&377,R2 ;ASSUME DDCMP START RECEIVED3 BIT #START,U.ERR(R5) ;WAS IT DDCMP START RECEIVED?: BNE RQP ;IF NE, YES;' BIT #TIMOUT,U.ERR(R5);WAS IT TIME-OUT?- BEQ RQPABO ;IF EQ, NO#' MOV #IE.TMO&377,R2 ;TIMEOUT ERROR CODE? BR RQP ;RETURN ALL PACKETS # .SBTTL TIMEOUTA;+; **-XMT00|tt tfDATAMO-TIMEOUT ENTRY POINT;M ; INPUTS:,; R3=CONTROLLER INDEX (S.CON)R; R4=SCB ADDRESS; R5=UCB ADDRESS; ; OUTPUTS:.; DISCONNECT ERROR RECOVERY IS COMPLETED (QIO);-XMOUT:, BIS #MC,@S.CSR(R4) ;MASTER CLEAR THE DEVICE% CALLR XMINIT ;TIMER BLOCKED PACKETS, R .SBTTL CANCEL I/O AND POWERFAIL;+"; **-XMCANC-CANCEL I/O ENTRY POINT*; **-XMPWRF-POWERFAIL RECOVERY ENTRY POINT;, ; INPUTS:#; R0=A(I/O PACKET) CANCEL ONLY; R1=TCB ADDRESS (CANCEL ONLY); R3=CONTROLLER INDEX (S.CON) ; R4=SCB ADDRESS; R5=UCB ADDRESS;U ; OUTPUTS:; DEVICE IS KILLED;-XMPWF:0 MTPS #PR7 ;;; DISABLE INTERUPTS FROM THE WORLD. MOV #U3.PWF,R0 ;;;INDICATE POWERFAIL OCCURRED BR KILL ;;;CXMCAN:+ MOV #U3.KIL,R0 ;INDICATE I/O KILL WAS DONEI/ ; NOTE THAT INTERRUPTS ARE NOT DISABLED FORP ; THE NEXT FOUR INSTRUCTIONS ;FALL THRU TO KILL - .SBTTL KILL THE DMC;+; **-KILL-KILL THE DEVICEI!; **-RQP,RQPABO-ALTERNATE ENTRIESD;S ; INPUTS:L; R0=KILL REASON; R4=SCB ADDRESS; R5=UCB ADDRESS;5 ; OUTPUTS:; R0,R1,R2,R3,R4=DESTROYED; DMC MASTER CLEARED IF ON-LINE7; U2.ONL BIT CLEARED;; ALL PACKETS DEQUEUED AND RETURNED WITH STATUS OF "IE.ABO"R;-5KILL: BIT #U2.ONL,U.CW2(R5) ;;;IS THE DEVICE ON-LINE?  BNE 1$ ;;; IF NE THEN YESA" MTPS #0 ; ALLOW INTERRUPTS AGAIN BR EXIT ;IF EQ, NO11$: BIS #MC,@S.CSR(R4) ;;;MASTER CLEAR THE DEVICEI MTPS #0 ; ALL INTERRUPTS AGAIN3RQPABO: MOV #IE.ABO&377,R2 ;STATUS WORD 2 FOR LATER 'RQP: BIS R0,U.CW3(R5) ;SAVE KILL REASONE, BIC #U2.ONL,U.CW2(R5) ;IT'S NOT ON-LINE NOW .IF DF R$$MPL!V$$RSN&Q$$22C CALL DEUMR ;DE-ASSIGN UMR'ST .ENDC2 MOV U.XQ(R5),R0 ;TRANSMIT SENT Q LISTHEAD ADDRESS' CALL 10$ ;RETURN ALL TRANSMIT PACKETS;1 MOV U.RQ(R5),R0 ;RECEIVE SENT Q LISTHEAD ADDRESSE710$: CALL (PC) ;DO THE FOLLOWING FOR SENT Q AND WAIT Q 020$: CALL DQRAP0 ;DEQUEUE AND RETURN ONE PACKET! BCC 20$ ;IF CC, Q WAS NOT EMPTYA* CMP (R0)+,(R0)+ ;ADVANCE TO NEXT LISTHEAD EXIT: RETURN;:; QUEUE AN AST TO THE CCPL;A E) .SBTTL DEQUEUE AND RETURN ONE I/O PACKETN;+3; **-DQRAP/DQRAP0-DEQUEUE AND RETURN ONE I/O PACKETG/; **-RAP-RETURN AN ALREADY DE-QUEUED I/O PACKETS; ; INPUTS:A; R0=LISTHEAD ADDRESSU; R2=I/O STATUS WORD 1; R4=I/O STATUS WORD 2; ; OUTPUTS:; R1,R3,R4=DESTROYED-; CARRY CLEAR=PACKET DEQUEUED AND RETURNED OK ; CARRY SET=QUEUE WAS EMPTYA;- .ENABL LSBT,DQRAP0: CLR R4 ;ENTRY FOR STATUS WORD 2 = 0'DQRAP: MOV R2,-(SP) ;SAVE STATUS WORD 1E$ CALL $QRMVF ;DEQUEUE AN I/O PACKET ;NOTE-$QRMVF DESTROYS R2,R3N BCC 5$ ;IF CC, Q WAS NOT EMPTY BR 10$ ;RETURN WITH CARRY SETO%RAP: MOV R2,-(SP) ;SAVE STATUS WORD 1-5$:D$ MOV R0,-(SP) ;SAVE LISTHEAD ADDRESS MOV R1,R3 ;PACKET ADDRESS  MOV 2(SP),R0 ;STATUS WORD 1 MOV R4,R1 ;STATUS WORD 2" MOV U.SCB(R5),R4 ;GET SCB ADDRESS$ DECB S.STS(R4) ;DECR ACTIVITY COUNT$ CALL $IOFIN ;FINISH THE I/O PACKET ;NOTE-$IOFIN SAVES ONLY R5 CLC ;INDICATE SUCCESS' MOV (SP)+,R0 ;RESTORE LISTHEAD ADDRESS (10$: MOV (SP)+,R2 ;RESTORE STATUS WORD 1 RETURN2 .DSABL LSB; C .SBTTL DE-ASSIGN UMR'S0;+/; **-DEUMR-DEASSIGN UMR'S (FOR QIO DRIVER ONLY)T;W ; INPUTS:D; R5=UCB ADDRESS;V ; OUTPUTS:; R0,R3=DESTROYED ; R4=SCB ADDRESS; S.MPR+2(R4)=CLEAREDO;- .IF DF R$$MPL!V$$RSN&Q$$22MDEUMR: MOV R2,-(SP) ;SAVE R2 MOV R1,-(SP) ;AND R1 " MOV U.SCB(R5),R4 ;GET SCB ADDRESS .IF NDF R$$MPL* MOV S.MPR+2(R4),R2 ;GET UMR BLOCK ADDRESS .IFFS+ MOV S.KRB(R4),R2 ; MOV KRB ADDRESS INTO R2S( ADD K.OFF(R2),R2 ;POINT TO UMR AREA + 2+ SUB #M.LGTH,R2 ;POINT TO START OF UMR AREAA TST (R2) ;IS UMR ASSIGNED ?D .ENDC$ BEQ 10$ ;IF EQ, NO UMR BLOCK (!!!) .IF NDF R$$MPLA" CLR S.MPR+2(R4) ;ZERO THE POINTER .IFF CLR (R2) ;ZERO THE POINTER# MOV 2(R2),R2 ;R2=UMR BLOCK ADDRESSS .ENDC# MOV R2,R0 ;COPY UMR BLOCK ADDRESSV CALL $DEUMR ;DE-ASSIGN UMR'S' MOV #M.LGTH,R1 ;SETUP UMR BLOCK LENGTH$ CALL $DEACB ;DE-ALLOCATE UMR BLOCK10$: MOV (SP)+,R1 ;RESTORE R1  MOV (SP)+,R2 ;AND R2R RETURNK .ENDC P8 .SBTTL TRY 00H{ccccTO SETUP ANOTHER BUFFER FROM INTERRUPT LEVEL;+:; **-ITRY-TRY TO SETUP ANOTHER BUFFER FROM INTERRUPT LEVEL;O ; INPUTS:(; R4=CSR ADDRESS; R5=UCB ADDRESS;) ; OUTPUTS:; R0=DESTROYED>; REQUEST TYPE!IEI LEFT IN SEL0 IF EITHER WAIT Q WAS NOT EMPTY&; RECEIVE REQUESTS ARE ATTEMPTED FIRST;-+ITRY: MOV U.RQ(R5),R0 ;;;TRY RECEIVES FIRST.& CALL IPORT ;;;IS THE PORT AVAILABLE?( BCC 10$ ;;;IF CC, YES (PORT IS LOADED)& MOV U.XQ(R5),R0 ;;;THEN TRY TRANSMITS& CALL IPORT ;;;IS THE PORT AVAILABLE? BCS 20$ ;;;IF CS, NO'10$: BIS #IEI,(R4) ;;;SET INTERRUPT BITR BIS #IEI,(R4) ;;;TWICE 20$: RETURN ;;;L;+; **-PORT-REQUEST THE DATA PORT55; **-IPORT-REQUEST THE DATA PORT FROM INTERRUPT LEVEL ;E ; INPUTS:N+; R0=SENT Q LISTHEAD ADDRESS (U.XQ OR U.RQ)V; R4=CSR ADDRESS;T ; OUTPUTS IF PORT WAS AVAILABLE: ; CARRY CLEARE; REQUEST TYPE LEFT IN SEL0T;P$; OUTPUTS IF PORT WAS NOT AVAILABLE: ; CARRY SETA;- .ENABL LSB,%IPORT: TST 4(R0) ;;;IS WAIT Q EMPTY?;' BEQ 10$ ;;;IF EQ, YES - NOTHING TO DOS4PORT: CMPB #MAXBUF,COUNT(R0) ;;;CAN DMC ACCEPT MORE?+ BEQ 10$ ;;;IF EQ, NO - NO ACTION POSSIBLE ;;;NOTE-CARRY IS NOW CLEAR. BIT #RDYI!RQI,(R4) ;;;IS PORT ALREADY IN USE?, BNE 10$ ;;;IF NE, YES - NO ACTION POSSIBLE1 MOVB IOTYPE(R0),(R4) ;;;SET REQUEST TYPE AND RQIU BR 20$ ;;;%10$: SEC ;;;INDICATE UNAVAILABILITYS20$: RETURN ;;;T .DSABL LSB  .IF DF R$$MPL;A;:; ; CONTORLER ONLINE ENTRY POINT:;R;T;4=; THE OLRSR ROUTINE WILL ENTER THIS DRIVER AT THE XMKRB LABLEO:; TO BRING THE DEVICE ONLINE OR OFFLINE. IF THE DEVICE IS<; COMMING ONLINE, THE UNIT IS MASTER CLEARED AND THE RUN BIT?; IS CLEARED. THE RUN BIT IS THEN TESTED. IF IT IS STILL SET,BA; THE BS1 SWITCH IS TURNED ON WHICH MAKES IT IMPOSSIBLE TO DIABLE;?; THE UNIT. THIS CONDITION IS NOT ALLOWED IN M+ AND THE ONLINEU@; COMMAND WILL FAIL. IF THE DEVICE IS COMMING OFFLINE, A MASTER9; CLEAR IS ISSUED AND THE RUN BIT IS CLEARED. NO TEST IS4 ; NECESSARY.;T; ;L ; INPUTS: ;V; R2 = KRB ADDRESSO; R3 = CTB ADDRESSC0; CARRY BIT CLEARED IF DEVICE IS TO COME ONLINE-; CARRY BIT SET IF DEVICE IS TO COME OFFLINEB;;S;EXMKRB:+ MOV #MC,@K.CSR(R2) ; MASTER CLEAR THE UNITT( BIC #RUN,@K.CSR(R2) ; CLEAR THE RUN BIT2 BCS 1$ ; IF DEVICE IS COMMING OFFLINE THE RETURN> BIT #RUN,@K.CSR(R2) ; ELSE TEST IF RUN BIT IS REALLY CLEARED.! BEQ 1$ ; IF YES THE ALL IS WELL A MOVB #IE.DNR&377,$SCERR ; ELSE THE RUN BIT BEING LOCKED ON MEANS4+ ; THAT THE BS1 SWITCH IS ON WHICH MEANS ) ; THE THAT A DOWNLINE LOAD CAN NOT BE + ; AVOIDED. WE DO NOT WANT THIS IN THISE ; THIS IN THE SYSTEM.E1$: RETURN ; GO BACK;S;E;M#; UNIT ONLINE - OFFLINE ENTRY POINTE;T;U;T=; WHEN THE UNIT IS BROUGHT ONLINE THE OLRSR ROUTINE CALLS THEE?; DRIVER AT THIS POINT WITH THE CARRY BIT CLEAR AND FOR OFFLINEI:; WITH THE CARRY BIT SET. WHEN COMMING ONLINE THE UNIT IS=; SET UP USING THE DRIVER ROUTINE "SETDMC". WHEN THE UNIT ISOA; OFFLINE A MASTER CLEAR IS ISSUED AND THE RUN BIT IS TURNED OFF.H;A;W ; INPUTS:C;N;B; R3 = CONTROLLER INDEX ; R4 = SCB ADDRESS; R5 = UCB ADDRESS;Y;M ; OUTPUTS:; ;G; NONE;;XMUCB:" BCC 3$ ; IF CC, THIS ONL REQUEST1$:" MOV S.KRB(R4),R2 ; R2=KRB ADDRESS+ MOV #MC,@K.CSR(R2) ; MASTER CLEAR THE UNITH( BIC #RUN,@K.CSR(R2) ; CLEAR THE RUN BIT3$: RETURN ; GO BACK .ENDC .ENDEN COMMING ONLINE THE UNIT IS=; SET UP USING THE DRIVER ROUTINE "SETDMC". WHEN THE UNIT ISOA; OFFLINE A MASTER CLEAR IS ISSUED AND THE RUN BIT IS TUz@Ds@p@<&Kq@:2@`@@}s@'@e;@<&%t@<&9@h&@zձ@h'@?T@?S@X@,l@4@'@=@@=@' q@t @`;@<&D@hp!@:$9:@2X@ r!hyp( SYpAjpjff(L &LLA" "00H|tt tfDATA<&9<&Kq<&D   'B DLD>B( (@@P <&%t ' q44 t BB <&%t\\VVZZ WW '  SYi+cOF:LINCDGNLLW HEDLD -- Not enough contiguo&(*:08@HPZbZus file spaceDLD -- Odd address or non-existent memory errorDLD -- Directive error = %DDLD -- I/O error = %DDLD -- Read error = %DDLD -- Wait error = %DDLD -- Region creation errorDLD -- Window creation errorDLD -- Command line errorDLD --R Syntax errorDLD -- Parse errorDLD -- QIOW errorDLD -- File not foundDLD -- File close errorDLD -- Get partition parameters errorDLD -- Mapping errorDLD -- Partition too smallDLD -- Partition not foundDLD -- Data structure error in BIC-BINaJ input fileDLD -- Write error = %DDLD -- Parity error%NLow address = %O%NHigh address = %Oe w SYTICLPartition name: %2RPartition base: %O Size: %O (32. word blocks)File name: %XTransfer address: %Om  DLD -- Diagnostic loader DLD takes a BIC/BIN binary file, converts it to asystem image file and then loads it into a u ser-specifiedpartition. The binary file must have been converted fromDOS format using the /IM switch of FLX.Switches:  /HE -- types this help file /NL -- inhibits the partition load. the conversion is still performed.  /LI -- lists file and partition information /NC -- do not clear the rest of the partition following the program load. default is to clear /OFF:N - offset from the start of partition by nX32 words /LW -- Accounts for the DOS link word that may exist in bytes 0-1 of every input blockExamples:DLD>/HELP => types the help messageDLD>=COPY1 .BIN/NL/LI => convert copy1.bin to copy1.sys and list program information. do not load into partitionDLD>TST=RL DP => convert RLDP.BIC to RLDP.SYS and load it into the partition TSTDLD>TST=RLDP.SYS/NC/OFF:1 => load RLDP.SYS into partition TST at an offset of 32. words. conversion is not done and the rest of the partition is nxot cleared%Na piw0 b Hww^f:p w"ȕ0 w 2X p08?SR`=jr0x@=5z  A E` ~ NJ D>:%wwnwRȕ* $JR$9:Tsbjv~~ w# 5wE4 %zbw# ,"% > 6 . @=.4NR' qXhp!|# ww7 |UtwzN4v 4# wB7 82.U,' q h'F4JvN,lR4V'\h'v&wl      w L7 7 5\d wF   w %w5T%$%A7J 7F x 6 5"&wn  5 B 7%  FP5  F wV "&7 !5  4 @<p7ww t4 5X $ w`UBwb JF w*v(4484<'J$ pt`~vf~ 4 ww# w# w5 5w w J842X(,' q2h&<@' qFhp!vz:    &blh "p7 00HQ{cccc6wH7 tV7 7 5@8 ppu JJw7 yw  mn5   @ Lw  p*b@ (`\w  <8w s vrwj  fV s*.NsnBRwJ  F62w*  &w   dw  D2Rr|xw  $\Xw  <8w L vrwj 2 6 VLv2:fVRwJ  h B2.w&e n B xcs x    P 4 hDn Pbf`n|4  6eB  ` PLw & & &  f& & & Ε 0,6 .2X "}s*`JN?T^p:22 0,47 H V  v 0,40X^ձhn`;6  %  RNw V  .*w|   ,0sPV Tstxs*td `wX @WtmB~7 m&y xWtB~5   `  |@j nz ~| P  j B   4  7 7 "  $~5j5 b j X\l"eh n jZ7`R R L& H  D:7 6 vw,7 %  z 7  d1 t~4f4e6  &4  6 J4f4e6 @4 f(.e;84<B`;LV4Zffx~ձ 4   B~"4f4e6 V  0 w  & 4`;246fLV Psn"7 U@eAtE7  Et m-pf-dz~ vn> f^ 5V  Bt  wm47< *f4e6 @4 f(.e;84<B`;LV4Zffx .TITLE KCLOKB CLOCK 'B' CONTROL .IDENT /M01.01/;;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.L;/>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 5-SEP-77 ;E; B. SCHREIBER 15-MAY-78; 9; BLS048 -- CORRECT NUMBER OF ARGUMENTS ACCEPTED FOR CALLS;T&; THIS ROUTINE CONTROLS KW11-K CLOCK B;L; SYSTEM MACRO CALLS;  .MCALL CINT$S, KSWDF$, KDVDF$ KSWDF$U KDVDF$U C;+; CLOCKB -- CLOCK B CONTROLD;O; CALLING SEQUENCE:A; /; CALL CLOCKB (IRATE, IPRSET, MODE, IND, [LUN]); ; INPUTS:E;O; IRATE IS THE RATE (0-7) .; IPRSET IS THE PRESET (TWOS COMPLEMENT 0-255); MODE IS THE MODE FLAGD; 0 - INTERRUPT MODE; 1 - NON-INTERRUPT MODEE; LUN IS IGNORED;A ; OUTPUTS:;0/; IND 0 UNABLE TO START CLOCK B (BAD ARGS, ETC00QS|tt tfDATA)L!; 1 CLOCK B STARTED SUCCESSFULLY1;C;-CLOCKB:: ;REF LABELC .IF DF K$W11K0 CALL .K.PAA ;VALIDATE ARGS AND PUSH ONTO STACK .WORD 5 ;5 ARGUMENTS .WORD 0 ;NONE REQUIRED BCC 10$ ;IF CC OKO .IFTF ;K$W11K' MOV #4,R4 ;STORE CODE IN 4TH ARGUMENT  CLR R3 ;STORE 0 FOR ERRORP& CALLR .IESTO ;STORE ERROR AND RETURN .IFT ;K$W11K 10$: MOV (SP)+,R0 ;GET THE RATE BNE 40$ ;IF PRESENT FORGE ON- CLR .CLK16 ;ELSE ZERO 16-BIT SOFTWARE CLOCKE320$: CMP (SP)+,(SP)+ ;PIP IPRSET AND MODE ADDRESSEST BR 110$ ;RETURN SUCCESS)40$: MOV (R0),R0 ;GET THE SPECIFIED RATE BNE 60$ ;IF NE GO AHEADS CLR @.KBCSR ;ELSE STOP CLOCK B BR 20$ ;GO RETURN *60$: BIC #^C<7>,R0 ;CLEAR ALL BUT LOW BITS ASL R0 ;POSITION FOR CSR& MOV R0,.KBRAT ;SET FOR ENABLE ROUTINE! MOV (SP)+,R0 ;GET PRESET ADDRESST BNE 70$ ;IF NE GO HANDLE* MOV #.NEG1,R0 ;ELSE USE DEFAULT OF 1 TICK*70$: MOV (R0),.KBPRE ;SET THE CLOCK PRESET MOV (SP)+,R0 ;GET THE MODE WORD BNE 80$ ;IF NE OK(" MOV #.ZEROW,R0 ;DEFAULT IS MODE 0;80$: MOV (R0),.KBMOD ;SET FLAG FOR INTERRUPT ENABLE ROUTINEI. BIT #K$ACIN,.KBFLG ;ARE WE ALREADY CONNECTED? BEQ 100$ ;IF EQ NO--GO CONNECT CALL .KBSTRT ;YES--START CLOCK BR 110$ ;RETURN SUCCESSLG100$: CINT$S .KBVEC,#$KBASE,#.KBINT,#.KBEDI,#PR6 ;CONNECT TO INTERRUPTS+ BCS 120$ ;IF CS SKIP1 BIS #K$ACIN,.KBFLG ;FLAG CONNECTED TO INTERRUPTSU110$: MOV #1,R0 ;SET SUCCESS( BR 140$ ;RETURN 120$: CLR R0 ;SET FAILURE#140$: MOV (SP)+,R1 ;GET IND ADDRESSO# BEQ 160$ ;IF EQ SKIP STATUS STORE0 MOV R0,(R1) ;STORE IND RESULTF*160$: TST (SP)+ ;CLEAN LUN ARG FROM STACK RETURNE - .SBTTL .KBEDI CLOCK B ENABLE/DISABLE ROUTINEN;+.; .KBEDI -- ENABLE/DISABLE ROUTINE FOR CLOCK B; C; THIS ROUTINE IS CALLED BY THE EXECUTIVE TO ENABLE/DISABLE CLOCK BO;T ; INPUTS:B;11; C-SET DISCONNECTING CLOCK FROM INTERRUPT VECTORE; STOP CLOCK AND RETURN;1; C-CLEAR ENABLING CLOCK; START CLOCK; ;- .PSECT .KSCT1(.KBEDI: BCS .KBDSC ;IF CS GO DISCONNECT1 BIS #K$ACIN,.KBFLG ;FLAG CONNECTED TO INTERRUPTSE&.KBSTRT:MOV .KBCSR,R2 ;GET CSR ADDRESS CLR (R2) ;STOP THE CLOCK+ MOV #KB$OIE!KB$B2A!KB$ENB,R0 ;ENABLE CLOCKT$ BIT #1,.KBMOD ;SHOULD WE INTERRUPT? BEQ 20$ ;IF EQ YES--GO AHEAD6 MOV #KB$B2A!KB$ENB,R0 ;NO--DO NOT LET CLOCK INTERRUPT!20$: BIS .KBRAT,R0 ;SET RATE BITS ! MOV .KBPRE,2(R2) ;SET THE PRESETV MOV R0,(R2) ;AND THE CSR RETURN%.KBDSC: CLR @.KBCSR ;DISABLE CLOCK BK- BIC #K$ACIN,.KBFLG ;NOTE NO LONGER CONNECTEDC RETURNG;+%; .KBINT -- CLOCK B INTERRUPT ROUTINEC; ; INPUTS:T;; NONE; ; OUTPUTS:;C; .CLK16 IS INCREMENTED BY ONE;O;--.KBINT::INC .CLK16 ;;;COUNT CLOCK B OVERFLOWT- RETURN ;;;END OF CLOCK B INTERRUPT ROUTINE  Y( .SBTTL ICLOKB READ CLOCK B 16 BIT CLOCK;+; ICLOKB -- READ CLOCK B;S ; INPUTS:;; ; NONE; ; OUTPUTS:;2?; THE VALUE OF THE 16 BIT CLOCK IS RETURNED IN R0 FOR A FORTRAN ; FUNCTION CALL.; ;-$ICLOKB::MOV .CLK16,R0 ;GET THE VALUE RETURNE .IFF ;K$W11K+ICLOKB:: CLR R0  RETURN  .ENDC ;K$W11K .END; NONE; ; OUTPUTS:;C; .CLK16 IS INCREMENTED BY ONE;O;--.KBINT::INC .CLK16 ;;;COUNT CLOCK B OVERFLOWT- RETURN ;;;END OF CLOCK B INTERRUPT ROUTINE  Y( .SBTTL ICLOKB READ CLOCK B 16 BIT CLOCK;+; ICLOKB -- READ CLOCK B;S ; INPUTS:;; ; NONE; ; OUTPUTS:;2?; THE VALUE OF THE 16 BIT CLOCK IS RETURNED IN R0 FOR A FORTRAN ; FUNCTION CALL.; ;-$ICLOKB::MOV .CLK16,R0 ;GET THE VALUE RETURNE .IFF ;K$W11K+ICLOKB::CC COPYRIGHT (C) 1977/C DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.C>C THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>C SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>C INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>C ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>C MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>C SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>C TO AND OWNERSHIP OF THE SOFTWARE SHALL AT AL00ST{ccccL TIMES REMAIN C IN DEC.CI?C THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?C NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL C EQUIPMENT CORPORATION.CO=C DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9C ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.IC C VERSION 01C B. SCHREIBER 15-JUL-77CECE:C MSH001 M.HARVEY CORRECTED FUNCTION RETURN VARIABLECTCH=C THIS ROUTINE COMPUTES RATES AND PRESETS FOR THE CLOCK GIVENS(C THE DESIRED DWELL (INTER-SAMPLE TIME). C+"C XRATE -- COMPUTE RATE AND PRESETC C CALLING SEQUENCE: *C CALL XRATE (DWELL, IRATE, IPRSET, IFLAG)1C OR: HERTZ = XRATE (DWELL, IRATE, IPRSET, IFLAG) C C INPUTS:RCO5C DWELL (REAL*4) THE DESIRED DWELL IN DECIMAL SECONDSE2C IFLAG (INTEGER*2) 0 IF CLOCK A, NON-0 IF CLOCK BCS C OUTPUTS:CH6C IRATE (INTEGER*2) THE SELECTED CLOCK RATE (1-7) OR 0!C IF NO RATE COULD BE SELECTEDH8C IPRSET (INTEGER*2) THE TWOS-COMPLEMENT CLOCK PRESET TO)C BE USED IN A CALL TO A SWEEP ROUTINEIC.5C HERTZ (REAL*4) (IF CALLED AS A FUNCTION) THE ACTUALLC DWELL USED.CLC-4 REAL*4 FUNCTION XRATE (DWELL, IRATE, IPRSET, IFLAG), REAL*4 DWELL, PRESET, DWLMAX, BDWLMX, TICKS INTEGER*2 IRATE, IPRSET, ID) DIMENSION DWLMAX(5), TICKS(5), BDWLMX(5) CC$C DWLMAX CONTAINS THE MAXIMUM DWELL0C (INTER-SAMPLE TIME) WHICH MAY BE OBTAINED FOR%C PARTICULAR CLOCK RATE FOR CLOCK A.SCC1 DATA DWLMAX / 0.065535, 0.65535, 6.5535, 65.535,K 1 655.35 /BCS$C BDWLMX CONTAINS THE MAXIMUM DWELL0C (INTER-SAMPLE TIME) WHICH MAY BE OBTAINED FOR'C A PARTICULAR CLOCK RATE FOR CLOCK B. CC0 DATA BDWLMX / 0.000255, 0.00255, 0.0255, 0.255, 1 2.55 /,CL2C TICKS IS THE NUMBER OF CLOCK TICKS OBTAINED FORC A PARTICULAR CLOCK RATE.(C 3 DATA TICKS / 1000000.0, 100000.0, 10000.0, 1000.0,L 1 100.0 /! IF (DWELL .LT. .000001) GOTO 200 CR0C FIND THE FASTEST CLOCK RATE WHICH WILL PERMIT2C THE REQUESTED DWELL. CHOOSING THE FASTEST RATE#C WILL GIVE THE FINEST RESOLUTION.MCD DO 100 I = 1, 5 IF (IFLAG .NE. 0) GOTO 5A# IF (DWELL .GT. DWLMAX(I)) GOTO 100F GOTO 7B% 5 IF (DWELL .GT. BDWLMX(I)) GOTO 1005C.C I CONTAINS THE SELECTED RATECT 7 IRATE = ICR(C COMPUTE THE CLOCK PRESET FOR THE USERC  PRESET = DWELL * TICKS (I) ! IF (PRESET - 32768.0) 10, 20, 300CLC PRESET LT 32768.0CD 10 IPRSET = -IFIX (PRESET) GOTO 40CHC PRESET EQ 32768.0CH 20 IPRSET = "100000 GOTO 40CLC PRESET GT 32768.0CA$ 30 IPRSET = IFIX (65535.0 - PRESET)C2C RETURN THE RATE SELECTED TO USER IF CALLED AS A6C FUNCTION. HE CAN SEE IF HE WAS KILLED BY ROUNDOFF.C.. 40 XRATE = AINT(PRESET + 0.05) / TICKS(I) GOTO 900T 100 CONTINUEE 200 IRATE = 0 900 RETURNK ENDT FOR THE USERC  PRESET = DWELL * TICKS (I) ! IF (PRESET - 32768.0) 10, 20, 300CLC PRESET LT 32768.0CD 10 IPRSET = -IFIX (PRESET) GOTO 40CHC PRESET EQ 32768.0CH 20 IPRSET = "100000 GOTO 40CLC PRESET GT 32768.0CA$ 30 IPRSET =$ .TITLE KAADMP BURST MODE D/A OUTPUT .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 18-OCT-77;E,; THIS MODULE PERFORMS BURST MODE D/A OUTPUT;T; SYSTEM MACRO CALLS;  .MC00T|tt tfDATAALL KSWDF$ KSWDF$O D$ .SBTTL .AADMP BURST MODE D/A OUTPUT;+-; .AADMP -- DUMP BUFFERS TO D/A IN BURST MODEN;IG; THIS ROUTINE PERFORMS OUTPUT TO THE AA11 IN BURST MODE (NOT INTERRUPTT; OR CLOCK DRIVEN).B;I ; INPUTS:Q;M3; R4 POINTS TO SWB (.AASWB). SWB MUST BE ALL SET UP ; ; OUTPUTS:;A<; IF IEFN WAS SPECIFIED CORRECTLY, PERFORM BURST MODE OUTPUT<; AT USER TASK LEVEL UNTIL END OF SWEEP IS DETECTED. IF IEFN,; WAS INCORRECTLY SPECIFIED, RETURN IE.BAD .;Y;-..AADMP::MOV S.WUSW(R4),R3 ;POINT TO IBUF ARRAY# TST S.WNBF(R4) ;CONTINUOUS OUTPUT?2 BMI 20$ ;IF MI YES--MUST HAVE COMPLETION ROUTINE= CMP S.WNBF(R4),IB.NBF(R3) ;LESS BUFFERS TO DO THAN SUPPLIED?(0 BHI 20$ ;IF HI NO--GO CHECK COMPLETION ROUTINEA BIS #S$WEFN,S.WFL2(R4) ;YES--SET EFN FLAG SO WE DON'T CALL CMPLR  BR 40$ ;SKIP AHEAD720$: BIT #S$WEFN,S.WFL2(R4) ;EFN OR COMPLETION ROUTINE?T5 BNE 300$ ;IF NE EFN--ERROR--NEED COMPLETION ROUTINEN; #; SET UP TO START BURST MODE OUTPUTB;.040$: MOVB S.WBNO(R4),R5 ;GET FIRST BUFFER NUMBER ASL R5 ;MAKE WORD INDEXC" ADD R3,R5 ;POINT INTO IBUF ARRAY9 MOV IB.BUF(R5),R5 ;AND PULL OUT THE FIRST BUFFER ADDRESSR;;"; ENTER LOOP FOR BURST MODE OUTPUT;I- BIS #S$WACT,S.WFL2(R4) ;DECLARE SWEEP ACTIVEB-200$: CALL .AAGWD ;GET D/A DATUM FROM BUFFERD ROL R2 ;SAVE C-BIT# MOV S.WCSR(R4),R1 ;GET CSR ADDRESSW .IF NDF Q$$BUSP)220$: TSTB (R1) ;MAKE SURE UNIT IS READYR" BPL 220$ ;WAIT FOR THE READY BIT .ENDC ;Q$$BUS% CLR R0 ;PREPARE TO GET CHANNEL BYTER) BISB S.WCHB(R4),R0 ;GET THE CHANNEL BYTEW$ ADD R0,R1 ;POINT TO THE PROPER DAC MOV R3,(R1) ;OUTPUT TO DAC% CALL .AANXC ;UPDATE TO NEXT CHANNEL& ROR R2 ;CHECK THE C-BIT FROM GETWORD BCC 200$ ;IF CC KEEP GOING+240$: CALL .AAAST ;CALL COMPLETION ROUTINE ( BIT #S$WSTP,S.WFL2(R4) ;SHOULD WE STOP? BEQ 200$ ;IF EQ NO) RETURN ;YES--RETURN TO CALLER OF DASWP2; &; NO COMPLETION ROUTINE AND ONE NEEDED;21300$: MOV #-,@S.WUSW(R4) ;SET STATUSC RETURN ;BACK TO CALLERN B2 .SBTTL .AAAST "AST" ROUTINE FOR BURST MODE OUTPUT;+8; .AAAST -- CALL COMPLETION ROUTINE IN BURST MODE OUTPUT;C ; INPUTS: ;D; R4 POINTS TO SWB;R ; OUTPUTS:;H+; IF SUPPLIED, COMPLETION ROUTINE IS CALLEDG;G; NO REGISTERS ARE ALTERED;L;-2.AAAST: BIT #S$WEFN,S.WFL2(R4) ;USING EVENT FLAGS?! BNE 40$ ;IF NE YES--SKIP IT ALLS* MOV R5,-(SP) ;SAVE REGISTERS FROM FORTRAN MOV R4,-(SP)N MOV R3,-(SP)2 MOV R2,-(SP)I MOV R1,-(SP)W MOV R0,-(SP)A/ CALL @S.WEFN(R4) ;CALL USER COMPLETION ROUTINEA$20$: MOV (SP)+,R0 ;RESTORE REGISTERS MOV (SP)+,R1T MOV (SP)+,R2T MOV (SP)+,R3B MOV (SP)+,R4T MOV (SP)+,R5 40$: RETURNI 1 .SBTTL .AAGWD GET WORD FOR BURST MODE D/A OUTPUTO;+4; .AAGWD -- GET WORD FROM USER BUFFER FOR D/A OUTPUT; ; INPUTS: ;W; R5 BUFFER POINTER ; R4 POINTS TO SWB; ; OUTPUTS:;P; R3 DATA WORD; C-CLEAR NOT END OF BUFFERF'; C-SET END OF BUFFER OR STOP REQUESTEDM;R;-(.AAGWD::MOV (R5)+,R3 ;GET NEXT DATA WORD, CLC ;PRESET C-BIT FOR "NOT END OF BUFFER" DEC S.WCNT(R4) ;END OF BUFFER?S BGT 200$ ;IF GT NO) MOV S.WUSW(R4),R2 ;YES--GET IBUF ADDRESS MOV R2,R1 ;COPY IT+ ADD #IB.USQ,R1 ;POINT TO USER BUFFER QUEUE .REPT 8.U TSTB (R1)+ ;FIND THE FREE SLOT BMI 20$ ;IF MI FOUND IT .ENDM BR 140$ ;NO FREE SLOTS? >20$: MOVB S.WBNO(R4),-(R1);SET JUST FINISHED BUFFER INTO QUEUE/ BIT #S$WSEB!S$WSTP,S.WFL2(R4) ;STOP NECESSARY?S BNE 100$ ;IF NE YES" TST S.WNBF(R4) ;CONTINUOUS OUTPUT BMI 40$ ;IF MI YES) DEC S.WNBF(R4) ;NO--CHECK ENOUGH BUFFERS( BEQ 120$ ;IF EQ ALL DONE*40$: ADD #IB.DVQ,R2 ;POINT TO DEVICE QUEUE* MOVB (R2),R1 ;GET NEXT BUFFER NO. TO USE BMI 140$ ;IF MI ERRORB .REPT 3$ MOVB 1(R2),(R2)+ ;PUSH QUEUE AROUND MOVB 1(R2),(R2)+ ;..." BMI 60$ ;WATCH FOR THE QUICK OUT .ENDM% MOVB 1(R2),(R2)+ ;MOVE THE LAST BYTEJ! MOVB #-1,(R2) ;MARK END OF QUEUET/60$: MOVB R1,S.WBNO(R4) ;SET NEW CURRENT BUFFERE ASL R1 ;MAKE A WORD INDEXB# ADD S.WUSW(R4),R1 ;INDEX INTO IBUFI) MOV IB.BUF(R1),R5 ;GET POIN00T‚ZĂ]ɂccccTER TO BUFFER . MOV S.WSIZ(R4),S.WCNT(R4) ;RESET BUFFER COUNT. BR 180$ ;RETURN WITH C-SET FOR END OF BUFFER;E#; STOP BECAUSE S$WSTP!S$WSEB IS SET;;M7100$: MOV #-,@S.WUSW(R4) ;SET ABORT STATUSU BR 160$ ;FINISH UP;.; DONE OUTPUTTINGF;T1120$: MOV #IS.SUC,@S.WUSW(R4) ;SET SUCCESS STATUSH BR 160$ ;FINISH ;,; DATA OVERRUN (NO BUFFER);M>140$: MOV #-,@S.WUSW(R4) ;SET DATA OVERRUN STATUS;N; SET STOP AND C-BIT;;*160$: BIS #S$WSTP,S.WFL2(R4) ;FLAG TO STOP/ BIC #S$WACT,S.WFL2(R4) ;DECLARE SWEEP INACTIVEE180$: SEC ;SET C-BIT 200$: RETURN .ENDR END OF BUFFER;E#; STOP BECAUSE S$WSTP!S$WSEB IS SET;;M7100$: MOV #-,@S.WUSW(R4) ;SET ABORT STATUSU BR 160$ ;FINISH UP;.; DONE OUTPUTTINGF;T1120$: MOV #IS.SUC,@S.WUSW(R4) ;SET SUCCESS STATUSH BR 160$ ;FINISH ;,; DATA OVERRUN (NO BUFFER);M>140$: MOV #-,@S.WUSW(R4) ;SET DATA OVERRUN STATUS;N; SET STOP AND C-BIT;;*160$: BIS #S$WSTP,S.WFL2(R4) ;FLAG TO STOP/, .TITLE KAASO3 D/A OUTPUT WITH SCOPE CONTROL .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 25-OCT-77;E>; THIS MODULE CONTAINS THE SYNCH. CLOCK ROUTINE FOR D/A OUTPUT; WITH SCOPE CONTROL WORDS.T;E; SYSTEM MACRO CALLS;H .MCALL KSWDF$, KDVDF$ KSWDF$E KDVDF$N .PSECT .KSCT1 O7 .SBTTL .AASO3 SYNCHRONOUS CLOCK ROUTINE FOR D/A OUTPUT ;+E; .AASO3 -- SYNCH. CLOCK ROUTINE FOR D/A OUTPUT W/SCOPE CONTROL WORDSO;R ; INPUTS:; R4 POINTS TO SWB; R3 AVAILABLE; ; OUTPUTS: ; C-CLEAR OK); C-SET FORK REQUESTED FOR EOB OR EOSWEEPL; >; NOTE: THE BUFFER MUST BE A MULTIPLE OF WORDS. THIS; IS NOT CHECKED BY SOFTWARE.C;O;- .IF NDF Q$$BUS 0.AASO3::CLR -(SP) ;;;SET C-BIT SAVER ONTO STACK( CALL .KRDWD ;;;READ SCOPE CONTROL WORD/ BIC #^C,R3 ;;;TRIM TO LEGAL SCOPE BITSH$ MOV R3,@S.WCSR(R4) ;;;OUTPUT TO CSR%10$: CALL .KRDWD ;;;READ A DATA WORDF ROL (SP) ;;;SAVE C-BIT MOV R3,-(SP) ;;;SAVE DATA WORDP% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSP, MOVB S.WCHB(R4),-(SP);;;GET 2*(CHANNEL + 1). CLRB 1(SP) ;;;MAKE SURE WE ONLY ADD LOW BYTE$ ADD (SP)+,R3 ;;;POINT TO PROPER DAC$ MOV (SP)+,(R3) ;;;WRITE DATA TO DAC ROR (SP) ;;;CHECK C-BITS BCC 20$ ;;;IF CC CONTINUEA& ROL (SP) ;;;SET PERMANENT C-BIT FLAG) BIT #S$WSTP,S.WFL2(R4) ;;;SHOULD WE STOPI BNE 40$ ;;;IF NE YES+20$: CALL .AANXC ;;;NO--GO TO NEXT CHANNELL3 CMP S.WCHX(R4),S.WNCH(R4) ;;;DONE ENOUGH CHANNELS?B BNE 10$ ;;;NO--DO MORE 40$: ROR (SP)+ ;;;RESTORE C-BIT RETURND .ENDC ;Q$$BUS .ENDSP);;;GET 2*(CHANNEL + 1). CLRB 1(SP) ;;;MAKE SURE WE ONLY ADD LOW BYTE$ ADD (SP)+,R3 ;;;POINT TO PROPER DAC$ MOV (SP)+,(R3) ;;;WRITE DATA TO DAC ROR (SP) ;;;CHECK C-BI$ .TITLE KADAGR A/D AUTO-GAIN RANGING .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENS00]ʂ^ς|tt tfDATAE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-SEP-77;E?; THIS ROUTINE PERFORMS AUTO GAIN RANGING FOR THE AD11-K/AM11-KS .MCALL KSWDF$, KDVDF$ KSWDF$O KDVDF$R .PSECT .KSCT1 S, .SBTTL .ADAGR A/D AUTO-GAIN RANGING ROUTINE;+%; .ADAGR -- PERFORM AUTO-GAIN RANGINGO;A ; INPUTS: ; *; A/D CONVERTER MUST HAVE THE DONE BIT SET; R3 POINTS TO CSR;Q ; OUTPUTS:;T; R3 CONVERTED VALUE;O;-.ADAGR::MOV R2,-(SP) ;;;SAVE R2I% MOV 2(R3),R2 ;;;READ CONVERTED VALUEC .IF DF A$$M11/ CLR -(SP) ;;;SET THE GAIN BITS ONTO THE STACK7- CMP R2,#4000 ;;;IS NUMBER IN NEGATIVE RANGE?  BGE 20$ ;;;IF GE YES NEG R2 ;;;NEGATE RESULT! BEQ 100$ ;;;IF ZERO GET OUT NOW1- BIC #^C<7777>,R2 ;;;ONLY LOOK AT TWELVE BITSI120$: CMP R2,#4200 ;;;NEED TO SAMPLE ABOVE GAIN 4?A BLT 30$ ;;;IF LT YES" CMP R2,#5000 ;;;SAMPLE AT GAIN 1? BGE 100$ ;;;IF GE YES4 MOV #<1*20>*400,(SP) ;;;NO--SET TO SAMPLE AT GAIN 4 BR 40$ ;;;GO SAMPLER530$: MOV #<2*20>*400,(SP) ;;;SET TO SAMPLE AT GAIN 16$# CMP R2,#4040 ;;;SAMPLE AT GAIN 16?I BGE 40$ ;;;IF GE YES5 MOV #<3*20>*400,(SP) ;;;NO--SET TO SAMPLE AT GAIN 64;-40$: BIS (SP),(R3) ;;;SET CORRECT MUX CHANNEL0 INC (R3) ;;;START CONVERSION$ MOV #TMO$AD,R2 ;;;GET TIMEOUT COUNT.60$: BIT #AD$ERR!AD$DON,(R3) ;;;ERROR OR DONE? BMI 80$ ;;;IF MI ERROR BNE 100$ ;;;IF NE DONE" DEC R2 ;;;NOT YET--CHECK TIMEOUT BGT 60$ ;;;IF GT NOT TIMEOUT) MOV #ADTMOV,R3 ;;;YES--SET TIMEOUT VALUEO BR 90$ ;;;RETURN280$: MOV 2(R3),R3 ;;;READ VALUE TO CLEAR CONVERTER" MOV #ADERRV,R3 ;;;SET ERROR VALUE(90$: TST (SP)+ ;;;CLEAR GAIN FROM STACK BR 120$ ;;;RETURNA*100$: MOV 2(R3),R3 ;;;READ CONVERTED VALUE- BIS (SP)+,R3 ;;;INSERT GAIN BITS INTO RESULT .IFF ;A$$M11; MOV R2,R3 ;;;POSITION RESULT .ENDC ;A$$M11 120$: MOV (SP)+,R2 ;;;RESTORE R2 RETURNE .END;IF NE DONE" DEC R2 ;;;NOT YET--CHECK TIMEOUT BGT 60$ ;;;IF GT NOT TIMEOUT) MOV #ADTMOV,R3 ;;;YES--SET TIMEOUT VALUEO BR 90$ ;;;RETURN280$: MOV 2(R3),R3 ;;;READ VALUE TO CLEAR CONVERTER" MOV #ADERRV,R3 ;;;SET ERROR VALUE(90$: TST (SP)+ ;;;CLEAR GAIN FROM STACK BR 120$ ;;;RETURNA*100$: MOV 2(R3),R3 ;;;READ CONVE( .TITLE KADDRV ROUTINES TO DRIVE THE ADC .IDENT /M01.00/; ; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.M;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 4-SEP-77 ;E;; THIS MODULE CONTAINS ROUTINES TO ACCESS THE A/D CONVERTERG;T; SYSTEM MACRO CALLS;T .MCALL CINT$S,KDVDF$,KSWDF$ KDVDF$S KSWDF$L .IF DF N$AD11 N;+1; THE A/D SWEEP OPERATES IN THE FOLLOWING MANNER:C;O5; 1) CONNECT FIRST ACTIVE A/D CONVERTER TO INTERRUPTSA*; 2) ARM CLOCK (THIS IS HANDLED ELSEWHERE),; 3) ENABLE FIRST A/D CONVERTER TO INTERRUPT; ; UPON RECEIVING INTERRUPT: ; .; 1) READ INTERRUPTING A/D CONVERTER AND STORE8; 2) FOR ALL OTHER 'NCHN'-1 SAMPLES, SET THE 'GO' BIT IN8; THE PROPER ADCSR AND TWIDDLE WITH A TIMEOUT WAITING; FOR THE00^҂Ă]ɂcccc CONVERSION.;; 3) AFTER ALL 'NCHN' SAMPLES HAVE BEEN TAKEN, RE-ARM FIRST.; A/D TO INTERRUPT AGAIN.;- . .SBTTL .ADCNI CONNECT A/D TO INTERRUPT VECTOR;+/; .ADCNI -- CONNECT A/D CONVERTER TO INTERRUPTSM;O ; INPUTS: ;D6; SWEEP CONTROL BLOCK ALL SETUP WITH R4 POINTING TO IT;T ; OUTPUTS:;C ; C-CLEAR SUCCESSFULLY CONNECTED; C-SET COULD NOT CONNECTA;S;-5.ADCNI::CALL .ADSLI ;SELECT PROPER INTERRUPT ROUTINEN' BCS 60$ ;IF CS INT ROUTINE NOT LOADEDA) MOV S.WAUA(R4),R3 ;GET PTR TO ACTIVE UCB ADD R4,R3 ;REALLY POINT TO ITE: BIT #UF$CIN,U.FLG(R3) ;IS IT ALREADY CONNECTED TO VECTOR? BNE 40$ ;YES--DON'T RETRYA< CINT$S U.VEC(R3),#$KBASE,#.ADINT,#.ADEDI,S.WPRI(R4),#.ADAST" BCS 60$ ;IF CS COULD NOT CONNECT/ BIS #UF$CIN,U.FLG(R3);FLAG CONNECTED TO VECTORG40$: CLC ;FLAG GOOD 60$: RETURN  C2 .SBTTL .ADEDI A/D ENABLE/DISABLE ROUTINE FOR CINT;+7; .ADEDI -- ENABLE/DISABLE CONNECT TO INTERRUPT ROUTINEB;6A; THIS ROUTINE IS CALLED BY THE EXECUTIVE ON CONNECTS/DISCONNECTSA%; FROM INTERRUPT VECTORS FOR THE A/D.O;E ; INPUTS:C;U'; R1 POINTS TO INTERRUPT TRANSFER BLOCKO+; C-SET DISCONNECTING FROM INTERRUPT VECTORE(; C-CLEAR CONNECTING TO INTERRUPT VECTOR;A ; OUTPUTS:;I; A/D CONVERTER IS DISABLED#.; .KTKCB IS FILLED IN WITH TCB ADDRESS OF TASK;C;- .PSECT .KSCT1:.ADEDI: MOV .ADSWB+S.WCSR,R0 ;GET CSR ADDRESS OF CONVERTER: MOV 2(R0),R2 ;READ CONVERTER IN CASE LINGERING CONVERSION CLR (R0) ;STOP CONVERTER7 MOV @#$TKTCB,.KTKCB ;GET MY TCB ADDRESS FOR FUTURE REFI RETURNV O+ .SBTTL .ADSLI SELECT A/D INTERRUPT ROUTINEI;+$; .ADSLI -- SELECT INTERRUPT ROUTINE;N ; INPUTS:M;T ; SWB SETO; ; OUTPUTS:;C ; C-CLEAR OK-; .ADINT MODIFIED TO VECTOR TO PROPER ROUTINE ; AND S.WSTR SET IN .ADSWBL;I$; C-SET INTERRUPT ROUTINE NOT LOADED;S;- .PSECTA=.ADSLI::MOV #.ADSTR,S.WSTR(R4) ;SET UP THE ST ROUTINE ADDRESSR* MOV #.ADIN0,R3 ;THIS IS ROUTINE OF CHOICE2 MOV S.WNCH(R4),-(SP);GET # OF CHANNELS ONTO STACK .IF DF A$$M11 ! U$$ADIR0 BIT #S$WACA,S.WFL2(R4) ;ABS CHANNEL ADDRESSING?2 BNE 40$ ;IF NE YES--CHECK OUT NUMBER OF CHANNELS2 MOV S.WFLG(R4),-(SP);NO--GET MODE WORD ONTO STACK) BIC #^C<7>,(SP) ;CLEAR ALL BUT GAIN BITSE .ENDC ;A$$M11 ! U$$ADIN4 .IF DF U$$ADI ;USER-SUPPLIED A/D INTERRUPT ROUTINE& CMP (SP),#7 ;USER INTERRUPT ROUTINE? BEQ 50$ ;IF EQ YES .IFTF ;U$$ADI .IF DF A$$M11' CMP (SP)+,#5 ;IS IT PROGRAMMABLE GAIN?E BEQ 20$ ;IF EQ YES1 MOV #.ADIN2,R3 ;NO--ASSUME SINGLE CHANNEL W/GAINU DEC (SP)+ ;SEE IF ONE CHANNEL  BEQ 60$ ;IF EQ YES0 MOV #.ADIN3,R3 ;NO--SET FOR MULT CHANNEL W/GAIN BR 60$ ;GO FINISH UP<20$: MOV #.ADIN4,R3 ;ASSUME SINGLE CHANNEL PROGRAMMABLE GAIN DEC (SP)+ ;CHECK # OF CHANNELS BEQ 60$ ;IF EQ ALL SET6 MOV #.ADIN5,R3 ;ELSE SET FOR MULT CHANNELS PROG. GAIN BR 60$ ;FINISH UPT .ENDC ;A$$M11740$: DEC (SP)+ ;ABS CHANNEL ADDRESSING--CHECK CHANNELS+ BEQ 60$ ;IF EQ ALL SET/ MOV #.ADIN1,R3 ;ELSE SET FOR MULTIPLE CHANNELSA .IFT ;U$$ADIN# BR 60$ ;SKIP TO STORE ISR ADDRESSN50$: TST (SP)+ ;CLEAR STACK& MOV #.ADINU,R3 ;USE USER-SUPPLIED ISR .ENDC ;U$$ADI%60$: TST R3 ;SEE IF WE GOT A ROUTINE $ BEQ 100$ ;IF EQ ROUTINE NOT LOADED .IF DF M$$MGE ADD $KRLC5,R3 ;RELOCATE TO APR5 .ENDC ;M$$MGE6 MOV R3,.ADINT+2 ;SET THE INTERRUPT VECTOR XFR ADDRESS CLC ;SET GOOD RETURN0 RETURNP(100$: SEC ;FLAG INT ROUTINE NOT LOADED RETURN6 # .SBTTL .ADSTR ENABLE A/D CONVERTER ;+'; .ADSTR/.ADENX -- ENABLE A/D CONVERTER; ; INPUTS:T;T ; .ADSTR --S;"; R4 POINTS TO SWEEP CONTROL BLOCK; R3 AVAILABLE;- ; .ADENX --;."; R4 POINTS TO SWEEP CONTROL BLOCK; R3 POINTS TO CSR;Q ; OUTPUTS:;O1; ADCSR IS ARMED TO INTERRUPT ON CLOCK OR TRIGGER3;E/; NOTE: THIS ROUTINE MAY BE CALLED AT ANY LEVELT;;;- .PSECT .KSCT1*.ADSTR::MOV S.WCSR(R4),R3 ;GET CSR ADDRESS8.ADENX::BIT #S$WNOV,S.WFLG(R4) ;TRIGGER DRIVEN SAMPLING? BNE 20$ ;IF NE YES .IF NDF Q$$BUS2 MOV #AD$OVE!AD$ENB,-(SP) ;NO--SET OVERFLOW ENABLE00^ڂ_݂|tt tfDATA BR 40$120$: MOV #AD$ESE!AD$ENB,-(SP) ;SET TRIGGER ENABLEB .IFF ;Q$$BUSB9 MOV #AD$IEN!AD$OVE!AD$ENB,-(SP) ;NO--SET OVERFLOW ENABLE BR 40$T820$: MOV #AD$IEN!AD$ESE!AD$ENB,-(SP) ;SET TRIGGER ENABLE .ENDC ;Q$$BUS<40$: MOVB S.WCHB(R4),1(SP);SET CHANNEL NUMBER INTO CSR-TO-BE% MOV (SP)+,(R3) ;JAM A/D CSR REGISTERC RETURN  T$ .SBTTL .DSBAD DISABLE A/D CONVERTER;+!; .DSBAD -- DISABLE A/D CONVERTER$;I ; INPUTS:;F"; R4 POINTS TO SWEEP CONTROL BLOCK;P ; OUTPUTS:;F; A/D CONVERTER IS DISABLEDV; ALL REGISTERS INTACT;T;- .IF GT N$AD11-1*.DSBAD::MOV R3,-(SP) ;SAVE R3 ON THE STACK MOV R4,R3 ;GET SWB ADDRESS# ADD #S.WUCB,R3 ;POINT TO FIRST UCB-3 MOV S.WUNT(R4),-(SP);SET COUNT OF UNITS ONTO STACKV.20$: BIT #UF$CIN,U.FLG(R3) ;IS UNIT CONNECTED? BEQ 40$ ;IF EQ NO ( CLR @U.CSR(R3) ;YES--DISABLE INTERRUPTS&40$: ADD #U.LGTH,R3 ;POINT TO NEXT UCB# DEC (SP) ;CHECK IF DONE ALL UNITSI BGT 20$ ;IF GT NO4 TST (SP)+ ;YES--CLEAR STACK MOV (SP)+,R3 ;YES--RESTORE R3 RETURNS .IFF ;N$AD11-1T*.DSBAD::CLR @S.WCSR(R4) ;DISABLE CONVERTER RETURN3 .ENDC ;N$AD11-1 .ENDC ;N$AD11 .ENDSWB ADDRESS# ADD #S.WUCB,R3 ;POINT TO FIRST UCB-3 MOV S.WUNT(R4),-(SP);SET COUNT OF UNITS ONTO STACKV.20$: BIT #UF$CIN,U.FLG(R3) ;IS UNIT CONNECTED? BEQ 40$ ;IF EQ NO ( CLR @U.CSR(R3) ;YES--DISABLE INTERRUPTS&40$: ADD #U.LGTH,R3 ;POINT TO NEXT UCB# DEC (SP) ;CHECK IF DONE ALL UNITSI BGT 20$ ;IF GT NO4 TST (SP)+ ;YES--CLEAR STACK MOV (SP)+,R3 ;YES--RESTORE 3 .TITLE KADIN0 SINGLE CHANNEL A/D INTERRUPT HANDLER .IDENT /M01.01/; ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01.01 ; B. SCHREIBER 15-SEP-77;E; MODIFIED BY:;U; M. HARVEY 6-MAR-79 ; MSH030 ALWAYS CLEAR ERROR BIT; D; THIS MODULE SAMPLES ONE A/D CHANNEL IN ABSOLUTE CHANNEL ADDRESSING; MODE. .MCALL KDVDF$, KSWDF$ KDVDF$T KSWDF$E .PSECT .KSCT1 G6 .SBTTL .ADIN0 SUPER-FAST SINGLE CHANNEL A/D INTERRUPT;+<; .ADIN0 -- SINGLE CHANNEL NO GAIN RANGING INTERRUPT ROUTINE;SB; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER SELECTED ABSOLUTE; CHANNEL ADDRESSING.E;Y ; INPUTS:;E8; R4 SET BY A JSR R4,.ADIN0; THIS INSTRUCTION IS LOCATED/; PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB. R,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB);N ; OUTPUTS:; 0; THE DATA WORD IS WRITTEN INTO THE USER BUFFER.;$;; OPTIONALLY, A FORK WILL BE REQUESTED IN ORDER TO STOP THES<; SWEEP (CAN BE INDUCED BY A NUMBER OF REASONS) OR TO SET AN;; EVENT FLAG OR QUEUE AN AST TO SIGNAL THE END OF A BUFFER.R;T;-5.ADIN0::MOV R3,(SP) ;;;SAVE R3, OVERWRITING SAVED R4 & ;;;WHICH WE DON'T NEED TO PRESERVE .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE. MOV S.WCSR(R4),R3 ;;;GET CSR REGISTER ADDRESS TST (R3) ;;;CHECK FOR ERRORS* BPL 20$ ;;;IF PL NO ERRORS--GO READ DATA& BIC #AD$ERR,(R3) ;;;ERROR--CLEAR FLAG- MOV 2(R3),R3 ;;;READ DATA TO CLEAR CONVERTER " MOV #ADERRV,R3 ;;;SET ERROR VALUE BR 40$ ;;;GO WRITE INTO BUFFER'20$: MOV 2(R3),R3 ;;;READ DATA FROM ADC 040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER .IFT ;M$$MGEV# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6R .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3;1 BCC 80$ ;;;IF CC NOT END OF BUFFER OR SWEE00_|ɂccccP END;9 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE GOING TO STOP THE SWEEP BEQ 60$ ;;;IF EQ NOR3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTING 660$: CALLR .KEFQI ;;;DO THE FORK LEVEL THING AND EXIT80$: RETURN ;EXITE .ENDC ;M$$MGE .ENDWRITE INTO BUFFER'20$: MOV 2(R3),R3 ;;;READ DATA FROM ADC 040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER .IFT ;M$$MGEV# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6R .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3;1 BCC 80$ ;;;IF CC NOT END OF BUFFER OR SWEE@ .TITLE KADIN1 MULTIPLE CHANNEL ABS CHANNEL ADDRESSING INTERRUPT .IDENT /M01.01/;R ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.E;R>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01.01 ; B. SCHREIBER 15-SEP-77;E; MODIFIED BY:;U; M. HARVEY 6-MAR-79 ; MSH030 ALWAYS CLEAR ERROR BIT; F; THIS INTERRUPT ROUTINE SAMPLES MULTIPLE CHANNELS IN ABSOLUTE CHANNEL; ADDRESSING MODE. .MCALL KSWDF$, KDVDF$ KSWDF$T KDVDF$C .PSECT .KSCT1 9 .SBTTL .ADIN1 MULTIPLE CHANNEL NO GAIN RANGING INTERRUPTI;+>; .ADIN1 -- MULTIPLE CHANNEL NO GAIN RANGING INTERRUPT ROUTINE;H?; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER CHOSE ABSOLUTET,; CHANNEL ADDRESSING WITH MULTIPLE CHANNELS.;H ; INPUTS:E;70; R4 SET BY A JSR R4,.ADIN1; THIS INSTRUCTION IS6; LOCATED PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB.,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB);L ; OUTPUTS:;MB; THE 'NCHN' CHANNELS ARE SAMPLED AND WRITTEN INTO THE USER BUFFER;;-8.ADIN1::MOV R3,(SP) ;;;SAVE R3, OVERWRITING R4 ON STACK .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE MOV R2,-(SP) ;;;SAVE R2' CLR -(SP) ;;;CLEAR "FORK NEEDED" FLAG % MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSLE.AD1DC::CLRB (R3) ;;;DISABLE CLOCK/ST FROM STARTING MORE CONVERSIONSS/ TST (R3) ;;;CHECK RESULTS OF FIRST CONVERSION $ ;;;(STARTED BY CLOCK OR TRIGGER) BPL 80$ ;;;IF PL GO READ DATAM BR 60$ ;;;ELSE GO HANDLE ERROR;N'; COME HERE FOR ALL SUBSEQUENT CHANNELS;I<20$: MOVB S.WCHB(R4),1(R3);;;SET THE CHANNEL NUMBER INTO CSR INC (R3) ;;;START CONVERSION( MOV #TMO$AD,R2 ;;;GET THE TIMEOUT COUNT.40$: BIT #AD$ERR!AD$DON,(R3) ;;;ERROR OR DONE? BMI 60$ ;;;IF MI ERROR BNE 80$ ;;;IF NE DONE" DEC R2 ;;;NOT YET--CHECK TIMEOUT BGT 40$ ;;;NO TIMEOUT YETI% MOV #ADTMOV,R3 ;;;TIMEOUT--SET VALUER BR 100$ ;;;GO STORE VALUEE;Y; ERROR ;G60$: ;;;REF LABEL. BIC #AD$ERR,(R3) ;;;CLEAR CONVERTER ERROR BIT' MOV 2(R3),R3 ;;;READ CONVERSION ANYHOWA) MOV #ADERRV,R3 ;;;SET TO STORE A/D ERRORT BR 100$ ;;;GO STOREO;R; READ DATA FROM A/D CONVERTER;M)80$: MOV 2(R3),R3 ;;;READ CONVERTED VALUE:*100$: CALL .KWRWD ;;;WRITE WORD TO BUFFER BCC 120$ ;;;IF CC CONTINUE" ROL (SP) ;;;SET THE FLAG TO FORK3 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE SUPPOSED TO STOP?M BNE 140$ ;;;IF NE YES--GO STOP,120$: CALL .ADNXC ;;;SWITCH TO NEXT CHANNEL) MOV S.WCSR(R4),R3 ;;;PICK UP CSR ADDRESS38 CMP S.WCHX(R4),S.WNCH(R4) ;;;HAVE WE DONE ALL CHANNELS? BNE 20$ ;;;IF NE NOD' CALL .ADENX ;;;YES--ARM A/D CONVERTOR0; -; WE ARE ALL DONE SAMPLING FOR THIS INTERRUPTR;M7140$: ROR (SP)+ ;;;PICK UP THE FORK FLAG AND POP STACK. MOV (SP)+,R2 ;;;RESTORE R2R .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6G .ENDC MOV (SP)+,R3 ;;;RESTORE R3W- BCC 180$ ;;;IF00|}~tt tfDATA CC NO FORK NEEDED--JUST EXITG1 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE STOPPING SWEEP?L BEQ 160$ ;;;IF EQ NO3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTINGA4160$: CALLR .KEFQI ;;;FORK AND SET EFN OR QUEUE AST ;;;AND EXIT-180$: RETURN ;EXIT .ENDE ALL DONE SAMPLING FOR THIS INTERRUPTR;M7140$: ROR (SP)+ ;;;PICK UP THE FORK FLAG AND POP STACK. MOV (SP)+,R2 ;;;RESTORE R2R .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6G .ENDC MOV (SP)+,R3 ;;;RESTORE R3W- BCC 180$ ;;;IF< .TITLE KADIN2 SINGLE CHANNEL GAIN RANGING INTERRUPT HANDLER .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-SEP-77;E@; THIS MODULE SAMPLES ONE A/D CHANNEL WITH GAINS 1, 4, 16, OR 64 .MCALL KDVDF$, KSWDF$ KDVDF$O KSWDF$R .PSECT .KSCT1 S= .SBTTL .ADIN2 SINGLE CHANNEL A/D INTERRUPT HANDLER WITH GAINN;+8; .ADIN2 -- SINGLE CHANNEL SINGLE GAIN INTERRUPT ROUTINE;OE; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER SELECTED ONE CHANNELO.; TO BE SAMPLED AT ONE GAIN (1, 4, 16, OR 64).;L ; INPUTS:S; 8; R4 SET BY A JSR R4,.ADIN2; THIS INSTRUCTION IS LOCATED/; PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB. ,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB); ; OUTPUTS:;0; THE DATA WORD IS WRITTEN INTO THE USER BUFFER.;C;; OPTIONALLY, A FORK WILL BE REQUESTED IN ORDER TO STOP THED<; SWEEP (CAN BE INDUCED BY A NUMBER OF REASONS) OR TO SET AN;; EVENT FLAG OR QUEUE AN AST TO SIGNAL THE END OF A BUFFER. ; ;-5.ADIN2::MOV R3,(SP) ;;;SAVE R3, OVERWRITING SAVED R4,& ;;;WHICH WE DON'T NEED TO PRESERVE .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE. MOV S.WCSR(R4),R3 ;;;GET CSR REGISTER ADDRESS TST (R3) ;;;CHECK FOR ERRORS* BPL 20$ ;;;IF PL NO ERRORS--GO READ DATA' MOV 2(R3),R3 ;;;READ CONVERSION ANYHOWO" MOV #ADERRV,R3 ;;;SET ERROR VALUE BR 40$ ;;;GO WRITE INTO BUFFER,20$: MOV 2(R3),-(SP) ;;;READ CONVERTED VALUE MOV (R3),R3 ;;;COPY CSR . BIC #147777,R3 ;;;CLEAR ALL BUT THE GAIN BITS1 BIS (SP)+,R3 ;;;SET THE TOTAL A/D VALUE TO STOREI040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER .IFT ;M$$MGEP# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6V .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3(1 BCC 80$ ;;;IF CC NOT END OF BUFFER OR SWEEP ENDO9 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE GOING TO STOP THE SWEEP BEQ 60$ ;;;IF EQ NOE3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTINGV960$: CALLR .KEFQI ;;;FORK, SET EFN OR QUEUE AST AND EXIT 80$: RETURN ;EXIT  .ENDC ;M$$MGE .ENDITS1 BIS (SP)+,R3 ;;;SET THE TOTAL A/D VALUE TO STOREI040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER .IFT ;M$$MGEP# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6V .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3(1 BCC 80$ ;;;IF CC NOT= .TITLE KADIN3 MULTIPLE CHANNEL SINGLE GAIN INTERRUPT ROUTINE .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE 00~ɂccccWHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-SEP-77;EE; THIS INTERRUPT ROUTINE SAMPLES MULTIPLE CHANNELS WITH A SINGLE GAINH; (I.E. GAIN 1, 4, 16, OR 64)O .MCALL KSWDF$, KDVDF$ KSWDF$A KDVDF$M .PSECT .KSCT1 = .SBTTL .ADIN3 MULTIPLE CHANNEL SINGLE GAIN INTERRUPT HANDLERI;+:; .ADIN3 -- MULTIPLE CHANNEL SINGLE GAIN INTERRUPT ROUTINE;A?; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER CHOSE MULTIPLE 6; CHANNEL SAMPLING WITH A FIXED GAIN (1, 4, 16, OR 64); ; INPUTS:T;P0; R4 SET BY A JSR R4,.ADIN3; THIS INSTRUCTION IS6; LOCATED PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB.,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB);1 ; OUTPUTS:;.B; THE 'NCHN' CHANNELS ARE SAMPLED AND WRITTEN INTO THE USER BUFFER;T;-8.ADIN3::MOV R3,(SP) ;;;SAVE R3, OVERWRITING R4 ON STACK .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE MOV R2,-(SP) ;;;SAVE R2' CLR -(SP) ;;;CLEAR "FORK NEEDED" FLAGA% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESS6E.AD3DC::CLRB (R3) ;;;DISABLE CLOCK/ST FROM STARTING MORE CONVERSIONSS/ TST (R3) ;;;CHECK RESULTS OF FIRST CONVERSION $ ;;;(STARTED BY CLOCK OR TRIGGER) BPL 80$ ;;;IF PL GO READ DATA.' BR 60$ ;;;ELSE HANDLE ERROR CONDITIONR;E'; COME HERE FOR ALL SUBSEQUENT CHANNELS:; <20$: MOVB S.WCHB(R4),1(R3);;;SET THE CHANNEL NUMBER INTO CSR INC (R3) ;;;START CONVERSION( MOV #TMO$AD,R2 ;;;GET THE TIMEOUT COUNT.40$: BIT #AD$ERR!AD$DON,(R3) ;;;ERROR OR DONE? BMI 60$ ;;;IF MI ERROR BNE 80$ ;;;IF NE DONE:" DEC R2 ;;;NOT YET--CHECK TIMEOUT BGT 40$ ;;;NO TIMEOUT YETT% MOV #ADTMOV,R3 ;;;TIMEOUT--SET VALUEE BR 100$ ;;;GO STORE VALUEO;O; ERROR);B+60$: MOV 2(R3),R3 ;;;READ CONVERSION ANYHOWL) MOV #ADERRV,R3 ;;;SET TO STORE A/D ERROR  BR 100$ ;;;GO STOREN;:; READ DATA FROM A/D CONVERTER;S780$: MOV 2(R3),-(SP) ;;;READ CONVERTED VALUE ONTO STACKR" MOV (R3),R3 ;;;READ CSR CONTENTS* BIC #147777,R3 ;;;CLEAR ALL BUT GAIN BITS5 BIS (SP)+,R3 ;;;CREATE A/D INPUT WORD WITH GAIN BITSI*100$: CALL .KWRWD ;;;WRITE WORD TO BUFFER BCC 120$ ;;;IF CC CONTINUE" ROL (SP) ;;;SET FORK NEEDED FLAG3 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE SUPPOSED TO STOP?B BNE 140$ ;;;IF NE YES--GO STOP,120$: CALL .ADNXC ;;;SWITCH TO NEXT CHANNEL) MOV S.WCSR(R4),R3 ;;;PICK UP CSR ADDRESSE8 CMP S.WCHX(R4),S.WNCH(R4) ;;;HAVE WE DONE ALL CHANNELS? BNE 20$ ;;;IF NE NO ' CALL .ADENX ;;;YES--ARM A/D CONVERTORS;B-; WE ARE ALL DONE SAMPLING FOR THIS INTERRUPT(;+.140$: ROR (SP)+ ;;;CHECK THE FORK NEEDED FLAG MOV (SP)+,R2 ;;;RESTORE R2D .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6E .ENDC MOV (SP)+,R3 ;;;RESTORE R34- BCC 180$ ;;;IF CC NO FORK NEEDED--JUST EXITF1 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE STOPPING SWEEP?E BEQ 160$ ;;;IF EQ NO3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTINGH8160$: CALLR .KEFQI ;FORK, SET EFN OR QUEUE AST AND EXIT180$: RETURN ;EXIT .END CONVERTORS;B-; WE ARE ALL DONE SAMPLING FOR THIS INTERRUPT(;+.140$: ROR (SP)+ ;;;CHECK THE FORK NEEDED FLAG MOV (SP)+,R2 ;;;RESTORE R2D .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6E .ENDC MOV (SP)+,R3 ;;;RESTORE R34- BCCA .TITLE KADIN4 SINGLE CHANNEL AUTO GAIN RANGING INTERRUPT HANDLER .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO 00tt tfDATAONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-SEP-77;E=; THIS MODULE SAMPLES ONE A/D CHANNEL WITH AUTO GAIN RANGING.E .MCALL KDVDF$, KSWDF$ KDVDF$  KSWDF$N .PSECT .KSCT1 E5 .SBTTL .ADIN4 SAMPLE 1 A/D CHANNEL WITH GAIN RANGINGO;+>; .ADIN4 -- SINGLE CHANNEL AUTO GAIN RANGING INTERRUPT ROUTINE;L@; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER SELECTED SINGLE*; CHANNEL SAMPLING WITH AUTO GAIN RANGING.; ; INPUTS:R;A8; R4 SET BY A JSR R4,.ADIN4; THIS INSTRUCTION IS LOCATED/; PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB. -,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB); ; OUTPUTS:;R0; THE DATA WORD IS WRITTEN INTO THE USER BUFFER.;F;; OPTIONALLY, A FORK WILL BE REQUESTED IN ORDER TO STOP THE <; SWEEP (CAN BE INDUCED BY A NUMBER OF REASONS) OR TO SET AN;; EVENT FLAG OR QUEUE AN AST TO SIGNAL THE END OF A BUFFER.E;T;-5.ADIN4::MOV R3,(SP) ;;;SAVE R3, OVERWRITING SAVED R4G& ;;;WHICH WE DON'T NEED TO PRESERVE .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE. MOV S.WCSR(R4),R3 ;;;GET CSR REGISTER ADDRESS8.AD4DC::CLRB (R3) ;;;DISABLE ANY MORE CONVERSION STARTS TST (R3) ;;;CHECK FOR ERRORS* BPL 20$ ;;;IF PL NO ERRORS--GO READ DATA' MOV 2(R3),R3 ;;;READ CONVERSION ANYHOWB" MOV #ADERRV,R3 ;;;SET ERROR VALUE BR 40$ ;;;GO WRITE INTO BUFFER920$: CALL .ADAGR ;;;PERFORM AUTO GAIN RANGING AND RETURNO ;;;THE CONVERTED VALUE IN R3040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER1 CALL .ADSTR ;;;RE-ENABLE CONVERTER TO INTERRUPTP .IFT ;M$$MGEM# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6I .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3O1 BCC 80$ ;;;IF CC NOT END OF BUFFER OR SWEEP ENDS9 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE GOING TO STOP THE SWEEP  BEQ 60$ ;;;IF EQ NOO3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTINGO860$: CALLR .KEFQI ;;;FORK SET EFN OR QUEUE AST AND EXIT80$: RETURN ;EXIT .ENDC ;M$$MGE .ENDIN R3040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER1 CALL .ADSTR ;;;RE-ENABLE CONVERTER TO INTERRUPTP .IFT ;M$$MGEM# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6I .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3O1; .TITLE KADIN5 MULTIPLE CHANNEL AUTO GAIN RANGING INTERRUPT .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-SEP-77;EA; THIS INTERRUPT ROUTINE SAMPLES MULTIPLE CHANNELS WITH AUTO GAINT ; RANGING. .MCALL KSWDF$, KDVDF$ KSWDF$P KDVDF$O .PSECT .KSCT1 T; .SBTTL .ADIN5 MULTIPLE CHANNEL AUTO GAIN RANGING INTERRUPTE;+@; .ADIN5 -- MULTIPLE CHANNEL AUTO GAIN RANGING INTERRUPT ROUTINE; ?; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER CHOSE MULTIPLEE*; CHANNEL SAMPLING WITH AUTO GAIN RANGING.;O ; INPUTS:O;A0; R4 SET BY A JSR R4,.ADIN5; THIS INSTRUCTION IS6; LOCATED PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB.,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB)00Lɂcccc;O ; OUTPUTS:;NB; THE 'NCHN' CHANNELS ARE SAMPLED AND WRITTEN INTO THE USER BUFFER;T;-8.ADIN5::MOV R3,(SP) ;;;SAVE R3, OVERWRITING R4 ON STACK .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE MOV R2,-(SP) ;;;SAVE R2+ CLR -(SP) ;;;CLEAR THE "FORK NEEDED" FLAGH% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSD.AD5DC::CLRB (R3) ;;;STOP CLOCK/ST FROM STARTING ANOTHER CONVERSION/ TST (R3) ;;;CHECK RESULTS OF FIRST CONVERSIOND$ ;;;(STARTED BY CLOCK OR TRIGGER) BPL 80$ ;;;IF PL GO READ INPUT BR 60$ ;;;ELSE GO HANDLE ERROR; '; COME HERE FOR ALL SUBSEQUENT CHANNELSA;5<20$: MOVB S.WCHB(R4),1(R3);;;SET THE CHANNEL NUMBER INTO CSR INC (R3) ;;;START CONVERSION( MOV #TMO$AD,R2 ;;;GET THE TIMEOUT COUNT.40$: BIT #AD$ERR!AD$DON,(R3) ;;;ERROR OR DONE? BMI 60$ ;;;IF MI ERROR BNE 80$ ;;;IF NE DONE" DEC R2 ;;;NOT YET--CHECK TIMEOUT BGT 40$ ;;;NO TIMEOUT YETR% MOV #ADTMOV,R3 ;;;TIMEOUT--SET VALUER BR 100$ ;;;GO STORE VALUEE;Y; ERROR ;G+60$: MOV 2(R3),R3 ;;;READ CONVERSION ANYHOW0) MOV #ADERRV,R3 ;;;SET TO STORE A/D ERROR  BR 100$ ;;;GO STOREN;A; READ DATA FROM A/D CONVERTER;S.80$: CALL .ADAGR ;;;PERFORM AUTO GAIN RANGING*100$: CALL .KWRWD ;;;WRITE WORD TO BUFFER BCC 120$ ;;;IF CC CONTINUE" ROL (SP) ;;;SET FORK NEEDED FLAG3 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE SUPPOSED TO STOP?R BNE 140$ ;;;IF NE YES--GO STOP,120$: CALL .ADNXC ;;;SWITCH TO NEXT CHANNEL) MOV S.WCSR(R4),R3 ;;;PICK UP CSR ADDRESSA8 CMP S.WCHX(R4),S.WNCH(R4) ;;;HAVE WE DONE ALL CHANNELS? BNE 20$ ;;;IF NE NOV' CALL .ADENX ;;;YES--ARM A/D CONVERTOR ;G-; WE ARE ALL DONE SAMPLING FOR THIS INTERRUPTS;0/140$: ROR (SP)+ ;;;CHECK THE FORK REQUEST FLAG$ MOV (SP)+,R2 ;;;RESTORE R2T .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6  .ENDC MOV (SP)+,R3 ;;;RESTORE R3 - BCC 180$ ;;;IF CC NO FORK NEEDED--JUST EXITN6 BIT #S$WSTP,S.WFL2(R4) ;;;YES--ARE WE STOPPING SWEEP? BEQ 160$ ;;;IF EQ NO3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTING;:160$: CALLR .KEFQI ;;;FORK, SET EFN OR QUEUE AST AND EXIT180$: RETURN ;EXIT .ENDOR ;G-; WE ARE ALL DONE SAMPLING FOR THIS INTERRUPTS;0/140$: ROR (SP)+ ;;;CHECK THE FORK REQUEST FLAG$ MOV (SP)+,R2 ;;;RESTORE R2T .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6  .ENDC MOV (SP)+,R3 ;;;RESTORE R3 - BCC 180$ ;;;IF CC NO FORK NEEDED--JUST EXITN6 BIT #S$WSTP,S.WFL2(R4) ;;;YES--ARE WE STOPPING SWEEP? BEQ 160$ ;;;IF EQ NO3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTING;:160$: & .TITLE KAST AST ROUTINES FOR K-SERIES .IDENT /M01.00/;D; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.#;C>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 7-SEP-77 ;E=; THIS MODULE CONTAINS ALL THE AST ROUTINES FOR THE DIFFERENTE ; SWEEPS. ;S; SYSTEM MACRO CALLS;D& .MCALL KSWDF$, ASTX$S, CINT$S, SETF$S KSWDF$A ' .SBTTL .ADAST HANDLE AST FOR A/D SWEEP ;++; .ADAST -- HANDLE AST QUEUED FOR A/D SWEEPD;O ; INPUTS:C;T&; STACK VECTOR ADDRESS ON TOP OF STACK;N ; OUTPUTS:;/; DISCONNECTS A/D CONVERTERS IF STOPPING SWEEP.R4; SETS EVENT FLAG IF NECESSARY, AND CALLS COMPLETION ; ROUTINE.;Y;- .ENABL LSB  .IF DF N$AD117.ADAST::MOV R0,(SP) ;SAVE R0, OVERWRITE VECTOR ADDRESS  MOV R1,-(SP) ;SAVE  MOV R2,-(00L tt tfDATASP) ; REST MOV R3,-(SP) ; OF$% MOV R4,-(SP) ; REGISTERS MOV R5,-(SP) ;...0 MOV #.ADSWB,R4 ;POINT TO AD SWEEP CONTROL BLOCK( BIT #S$WSTP,S.WFL2(R4) ;STOPPING SWEEP?0 BNE 60$ ;IF NE YES--GO FIX IOSB AND DISCONNECT .IFTF ;N$AD11D; COME TO 20$ TO CALL COMPLETION ROUTINE, RESTORE REGISTERS AND EXIT+; COME TO 40$ TO RESTORE REGISTERS AND EXIT;?; REGISTERS MUST BE ON STACK, WITH R5 AT TOP, AND R0 AT BOTTOM.O;W220$: CALL @S.WEFN(R4) ;NO--CALL COMPLETION ROUTINE40$: MOV (SP)+,R5 ;RESTORE MOV (SP)+,R4 ; THE$ MOV (SP)+,R3 ; REGISTERS MOV (SP)+,R2M MOV (SP)+,R1P MOV (SP)+,R0P ASTX$SB .IFT ;N$AD11P;L; STOPPING THE SWEEP;B,60$: CALL .DSCAD ;DISCONNECT A/D CONVERTERS& CALL .KLQRM ;REMOVE FROM CLOCK QUEUE .IF DF K$$W11 .IF DF FT$MOP! TST .KUCNT ;ANYONE USING CLOCK?S( BNE 80$ ;IF NE DO NOT DISCONNECT CLOCK .ENDC ;FT$MOP( CALL 400$ ;LAST USER--DISCONNECT CLOCK .ENDC ;K$$W11 -< .SBTTL SWEEP END--FILL IN I/O STATUS BLOCK AND CLEAN UP SWB;R?; COME TO 80$ TO TERMINATE A SWEEP. THE EVENT FLAG IS SET OR ARB; COMPLETION ROUTINE WILL BE CALLED. THE SWB IS THEN CLEARED OUT. ; (FLAGS).;E .IFTF ;N$AD11080$: CALL 100$ ;CLEAR SWB AND SET EFN IF NEEDED3 BCC 20$ ;IF CC WE NEED TO CALL COMPLETION ROUTINED) BR 40$ ;ELSE WE SET AN EVENT FLAG--DONEK;BC; ROUTINE TO CLEAR OUT SWB. IN ADDITION, SETS EVENT FLAG IF NEEDED.$;L ; OUTPUTS:;N*; C-CLEAR NEED TO CALL COMPLETION ROUTINE; C-SET EFN WAS SET--ALL DONE;N0100$: CLR S.WEFM(R4) ;CLEAR EVENT FLAG MASK WORD' CLR S.WEFA(R4) ;AND EVENT FLAG ADDRESSP CLR S.WFLG(R4) ;ZERO FLAG WORDH( MOV S.WFL2(R4),R0 ;GET SECOND FLAG WORD; BIC #^C,S.WFL2(R4) ;CLEAR ALL BITS EXCEPT A/D FLAGI. CLC ;PRE-SET C-BIT TO INDICATE CMPL ROUTINE3 BIT #S$WEFN,R0 ;ARE WE USING EVENT FLAGS OR AST'S?D' BEQ 120$ ;IF EQ NOT USING EVENT FLAGSN+ SETF$S S.WEFN(R4) ;ELSE SET THE EVENT FLAG % SEC ;SET C-BIT TO INDICATE EFN SETO 120$: RETURN .ENDC ;N$AD11 S$ .SBTTL .DRAST HANDLE DR11 SWEEP AST;+.; .DRAST -- AST ROUTINE FOR DIGITAL I/O SWEEPS;F ; INPUTS:P;C+; STACK VECTOR ADDRESS OF DEVICE AST IS FOR4;0 ; OUTPUTS:;A%; NORMAL COMPLETION ROUTINE IS CALLEDE8; STOPPING SWEEP - DR11 IS DISCONNECTED FROM INTERRUPTS,1; AND EVENT FLAG OR COMPLETION ROUTINE IS CALLEDV; AS APPROPRIATE.;B;- .IF DF N$DR11&.DRAST::MOV R1,-(SP) ;SAVE R1 ON STACK, MOV 2(SP),R1 ;GET VECTOR ADDRESS FROM STACK' MOV R0,2(SP) ;SAVE R0 WHERE VECTOR WAS$ MOV R2,-(SP) ;SAVEA MOV R3,-(SP) ; THE MOV R4,-(SP) ; REST- MOV R5,-(SP) ; OF THE REGISTERST1 MOV #.DRUTB,R0 ;GET POINTER TO SWEEP BLOCK TABLEP(200$: MOV (R0)+,R4 ;GET NEXT SWB ADDRESS BEQ 40$ ;IF EQ ALL DONED. CMP S.WUBX+U.IVEC(R4),R1 ;INPUT VECTOR RIGHT? BEQ 220$ ;IF EQ YESO/ CMP S.WUBX+U.OVEC(R4),R1 ;OUTPUT VECTOR RIGHT?. BNE 200$ ;IF NE NO9220$: BIT #S$WSTP,S.WFL2(R4) ;YES--ARE WE STOPPING SWEEP? 8 BEQ 20$ ;IF EQ NO--GO CALL COMPLETION ROUTINE AND EXIT;; STOPPING SWEEP;7280$: MOV S.WUBX+U.IVEC(R4),R3 ;ASSUME INPUT DISCONNECTM BIT #S$WIOF,S.WFL2(R4) ;CHECK" BNE 300$ ;IF NE INPUT DISCONNECT0 MOV S.WUBX+U.OVEC(R4),R3 ;NO--GET OUTPUT VECTOR 300$: CINT$S R3,,#0 ;DISCONNECT0 BIC #UF$CIN,S.WUBX+U.FLG(R4) ;FLAG DISCONNECTED BR 80$ ;FINISH UP0 .ENDC ;N$DR11 S$ .SBTTL .KWAST HANDLE AST'S FOR KW11;+?; .KWAST -- AST ROUTINE FOR CLOCK DRIVEN SWEEPS (EXCEPT GTHIST)T;I ; INPUTS:;Q; STACK VECTOR ADDRESS OF CLOCKO;O ; OUTPUTS:;%; NORMAL COMPLETION ROUTINE IS CALLEDU7; STOPPING SWEEP - KW11 IS DISCONNECTED FROM INTERRUPTSS2; (UNLESS MULT. OPERATIONS) AND EVENT FLAG IS SET/; OR COMPLETION ROUTINE CALLED AS APPROPRIATE.R;0;- .IF DF K$$W117.KWAST::MOV R0,(SP) ;SAVE R0, OVERWRITE VECTOR ADDRESS MOV R1,-(SP) ;HO HUM MOV R2,-(SP) ;SAVE THEM AWAYA MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP)  .IF NDF FT$MOPR& MOV .KASWB,R4 ;GET ACTIVE SWB ADDRESS/ BIT #S$WSTP,S.WFL2(R4) ;ARE WE STOPPING SWEEP?U1 BEQ 20$ 00LVɂcccc;IF EQ NO--CALL COMPLETION ROUTINE,EXIT" CALL 400$ ;YES--DISCONNECT CLOCK BR 80$ ;AND FINISH UP( .IFF ;FT$MOPA- MOV #<.KLQUU-S.WCLQ>,R4 ;POINT TO QUEUE HEADU.320$: MOV S.WCLQ(R4),R4 ;LINK TO NEXT IN QUEUE BEQ 380$ ;IF EQ END OF QUEUE, TST S.WFLG(R4) ;AST REQUEST FOR THIS SWEEP? BPL 320$ ;IF PL NO--IGNORE/ BIC #S$WAST,S.WFLG(R4) ;CLEAR AST REQUEST FLAGM/ BIT #S$WSTP,S.WFL2(R4) ;ARE WE STOPPING SWEEP?4 BEQ 360$ ;IF EQ NO--CONTINUE% CALL .KLQRM ;YES--REMOVE FROM QUEUEP1340$: CALL 100$ ;CLEAR SWB AND SET EFN IF NEEDEDI& BCS 320$ ;IF CS WE SET EFN--ALL DONE<360$: MOV R4,-(SP) ;SAVE SWB POINTER FROM COMPLETION ROUTINE/ CALL @S.WEFN(R4) ;CALL USER COMPLETION ROUTINER" MOV (SP)+,R4 ;RESTORE SWB POINTER BR 320$ ;CONTINUE SCANNING3380$: TST .KUCNT ;ARE THERE ANY MORE ACTIVE SWEEPS; BNE 40$ ;IF NE YES--ALL DONE! CALL 400$ ;NO--DISCONNECT CLOCK BR 40$ ;AND QUIT .ENDC ;FT$MOP;E; DISCONNECT CLOCK; -400$: MOV .KAVEC,R0 ;GET CLOCK VECTOR ADDRESSU' CALL 500$ ;DISCONNECT FROM INTERRUPTS  .IF DF Q$$BUS$ ADD #4,R0 ;DISCONNECT OTHER VECTOR CALL 500$ ;... .ENDC ;Q$$BUS; BIC #K$ACIN!K$ACTV!K$AGTD,.KAFLG ;FLAG NO LONGER CONNECTED $ ;AND NO GTHIST IN PROGRESS RETURN ;DONE 500$: CINT$S R0,,#0 ;DISCONNECT RETURNE .ENDC ;K$$W11 .DSABL LSB4 .ENDE YES--ALL DONE! CALL 400$ ;NO--DISCONNECT CLOCK BR 40$ ;AND QUIT .ENDC ;FT$MOP;E; DISCONNECT CLOCK; -400$: MOV .KAVEC,R0 ;GET CLOCK VECTOR ADDRESSU' CALL 500$ ;DIS) .TITLE KBFRMG BUFFER MANAGEMENT ROUTINES .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-AUG-77;E5; THIS MODULE CONTAINS ROUTINES FOR BUFFER MANAGEMENT ;G; SYSTEM MACRO CALLS;R .MCALL KSWDF$ KSWDF$H O, .SBTTL RLSBUF RELEASE BUFFER TO BUFFER POOL;+/; RLSBUF -- RELEASE A BUFFER TO THE BUFFER POOLJ; >; THIS ROUTINE IS CALLED BY THE USER TO DECLARE A BUFFER READY; FOR THE ISR TO USE. ;I; CALLING SEQUENCE:O; &; CALL RLSBUF (IBUF, IND, N1,N2,...N8);R ; INPUTS:Y;S+; IBUF THE IBUF ARRAY USED TO START A SWEEPP9; N1-N8 ARE THE BUFFERS TO RELEASE (MAY HAVE 1-8 BUFFERS); ; OUTPUTS:;O; IND RETURNS STATUS; 0 BAD BUFFER NUMBER; 1 BUFFERS RELEASED OK3; BUFFERS ARE INSERTED INTO THE DEVICE BUFFER QUEUEE;F;-&RLSBUF::MOV 2(R5),R1 ;GET IBUF ADDRESS MOV R1,R4 ;MAKE A COPY* MOVB (R5),R3 ;SET NUMBER OF ARGS INTO R3& CMP (R5)+,(R5)+ ;POINT TO IND ADDRESS( SUB #2,R3 ;IS THERE AN ARGUMENT THERE? BLE 80$ ;IF LE NO--QUIT NOW,% MOV (R5)+,R0 ;GET/CHECK IND ARGUMENTI# INC R0 ;MAKE -1 (DEFAULT) GO TO 01 BEQ 10$ ;IF EQ LEAVE AT 0E$ DEC R0 ;NOT DEFAULTED--GET IT BACK# MOV #1,(R0) ;SET SUCCESS INTO INDD&10$: MTPS #PR6 ;;;LOCK OUT INTERRUPTS020$: MOV @(R5)+,R2 ;;;GET THE NEXT BUFFER NUMBER BMI 25$ ;;;IF MI ERROR+ CMP R2,IB.NBF(R1) ;;;IS IT A LEGAL NUMBER?K BLO 30$ ;;;IF LO YES25$: TST R0 ;;;WAS IND GIVEN? BEQ 60$ ;;;IF EQ NOO DEC (R0) ;;;YES--MAKE 1 INTO 0 BR 60$ ;;;FINISH UPB,30$: ADD #IB.DVQ,R1 ;;;POINT TO DEVICE QUEUE .REPT 8.A) TSTB (R1)+ ;;;FIND THE END OF THE QUEUE1# BMI 40$ ;;;IF MI WE HAVE FOUND ITR .ENDM BR 60$ ;;;SHOULD NOT HAPPEN)-40$: MOVB R2,-(R1) ;;;ENTER BUFFER INTO QUEUEC$00Vtt tfDATA MOV R4,R1 ;;;RESET POINTER TO IBUF$ DEC R3 ;;;DECREMENT ARGUMENT COUNT* BGT 20$ ;;;IF GT MORE BUFFERS TO RELEASE!60$: MTPS #0 ;;;ALLOW INTERRUPTS 80$: RETURNT R% .SBTTL INXTBF SET NEXT BUFFER TO USEQ;+"; INXTBF -- SET NEXT BUFFER TO USE;0; CALLING SEQUENCE::;D; IND = INXTBF (IBUF, N [,IND])E; ; INPUTS:A;%; IBUF IS THE IBUF FROM A SWEEP STARTU+; N IS THE NUMBER OF THE NEXT BUFFER TO SET.;M ; OUTPUTS:;;; R0/IND 0 IF ERROR0 ; 1 IF OK;);-INXTBF::CLR R4 ;ASSUME FAILURE1 MOV 2(R5),R0 ;GET IBUF ADDRESSR) CALL .FDSWI ;FIND SWB THAT GOES WITH IT; BCS 80$ ;IF CS FORGET IT MOV @4(R5),R2 ;GET BUFFER # BMI 80$ ;MI IS ILLEGAL CMP R2,IB.NBF(R0) ;IS IT LEGAL? BHIS 80$ ;IF HIS NO-" MTPS #PR6 ;;;LOCK OUT INTERRUPTS& CMPB R2,S.WBNO(R1) ;;;CURRENT BUFFER?& BEQ 60$ ;;;IF EQ YES--CANNOT NEXT IT( ADD #IB.DVQ,R0 ;;;POINT TO DEVICE QUEUE% CMPB R2,(R0)+ ;;;IS IT ALREADY NEXT?M BEQ 50$ ;;;IF EQ YES--GET OUTR% MOV #1,R3 ;;;COUNT OF BYTES TO MOVE  .REPT 7 CMPB R2,(R0)+ ;;;IS THIS IT?  BEQ 20$ ;;;IF EQ YES* INC R3 ;;;NO--COUNT ANOTHER BYTE TO MOVE .ENDM( BR 60$ ;;;NOT IN QUEUE--CANNOT NEXT IT+20$: DEC R0 ;;;BACK UP TO BYTE IN QUESTIONA040$: MOVB -(R0),1(R0) ;;;PUSH QUEUE DOWN OVER IT DEC R3 ;;;CHECK FOR ENOUGH BGT 40$ ;;;DO ALL NEEDED( MOVB R2,(R0) ;;;MAKE NEW 'NEXT' BUFFER50$: INC R4 ;;;FLAG SUCCESS!60$: MTPS #0 ;;;ALLOW INTERRUPTSD'80$: MOV R4,R0 ;POSITION STATUS RETURNR" CMPB (R5),#3 ;WERE THERE 3 ARGS?) BNE 100$ ;IF NE NO--DO NOT STORE STATUSI, MOV 6(R5),R1 ;YES--GET POSSIBLE IND ADDRESS CMP #-1,R1 ;WAS IT DEFAULTED?. BEQ 100$ ;IF EQ YES  MOV R0,(R1) ;NO--STORE STATUSC 100$: RETURN O. .SBTTL RMVBUF REMOVE BUFFER FROM DEVICE QUEUE;++; RMVBUF -- REMOVE BUFFER FROM DEVICE QUEUE;T; CALLING SEQUENCE:D;M!; CALL RMVBUF (IBUF, IBUFNO, IND)F&; OR: IND = IRMVBF (IBUF, IBUFNO, IND); ; INPUTS:W;T%; IBUF IS THE IBUF FROM A SWEEP STARTT'; IBUFNO IS THE BUFFER NUMBER TO REMOVEA;? ; OUTPUTS:;F; IND 1 SUCCESSO; 0 NOT IN QUEUER;R;-IRMVBF:: ;REF LABELE&RMVBUF::MOV 2(R5),R0 ;GET IBUF ADDRESS MOV @4(R5),R1 ;GET BUF #R& ADD #IB.DVQ,R0 ;POINT TO DEVICE QUEUE" MOV #7,R2 ;SET MAX COUNT TO MOVE" MTPS #PR6 ;;;LOCK OUT INTERRUPTS .REPT 8.  CMPB R1,(R0)+ ;;;IS THIS IT?  BEQ 20$ ;;;IF EQ YES* DEC R2 ;;;NO--DEC COUNT OF BYTES TO MOVE .ENDM BR 80$ ;;;NOT IN QUEUE.20$: DEC R0 ;;;BACKUP PTR TO BYTE IN QUESTION TST R2 ;;;ANY TO MOVE?. BEQ 60$ ;;;IF EQ NO--JUST REMOVED LAST ENTRY#40$: MOVB 1(R0),(R0)+ ;;;MOVE QUEUEV DEC R2 ;;; BGT 40$ ;;;O%60$: MOVB #-1,(R0) ;;;END WITH A ZERO5 MOV #1,R0 ;;;SET STATUSD BR 100$ ;;;FINISH UP'80$: CLR R0 ;;;SET NOT IN QUEUE STATUS"100$: MTPS #0 ;;;ALLOW INTERRUPTS& CMPB (R5),#3 ;ARE THERE 3 ARGUMENTS?( BLO 120$ ;IF LO NO--DON'T STORE STATUS, MOV 6(R5),R1 ;YES--GET POSSIBLE IND ADDRESS CMP R1,#-1 ;WAS IT DEFAULTED?C BEQ 120$ ;IF EQ YESY MOV R0,(R1) ;NO--STORE STATUSO 120$: RETURN * .SBTTL .FDSWI FIND SWB GIVEN 'IBUF' ARRAY;+;; .FDSWI -- FIND SWEEP CONTROL BLOCK GIVEN THE 'IBUF' ARRAYM; ; INPUTS:;; /; R0 'IBUF' ARRAY ADDRESS (SAME AS USW ADDRESS)$;; ; OUTPUTS:;:; C-CLEAR FOUND SWEEPQ; R1 POINTS TO SWB;S; C-SET COULD NOT FIND SWB; R1 0; ; REGISTERS ALTERED:;; R1; ;-*.FDSWI::MOV #SWB0,R1 ;START WITH FIRST SWB(20$: CMP R0,S.WUSW(R1) ;IS THIS THE SWB? BEQ 40$ ;IF EQ YES( MOV S.WLNK(R1),R1 ;NO--LINK TO NEXT SWB BNE 20$ ;IF MORE GO CHECK  CLR R1 ;ELSE RETURN 0  SEC RETURNR; ; FOUND SWBI; 40$: CLC RETURNB .ENDN THE 'IBUF' ARRAYM; ; INPUTS:;; /; R0 'IBUF' ARRAY ADDRESS (SAME AS USW ADDRESS)$;; ; OUTPUTS:;:; C-CLEAR FOUND SWEEPQ; R1 POINTS TO SWB;S; C-SET COULD NOT FIND SWB; R1 0; ; REGISTERS ALTERED:;; R1; ;-*.FDSWI::MOV #SWB0,R1 ;START WITH FIRST SWB(20$: CMP R0,S.WUSW(R1) ;IS THIS THE SWB? BEQ 40$ ;IF EQ YES( MOV S.WLNK(R1),R1 ;NO--LINK TO NEXT SWB BNE 20$ ;IF MORE GO CHECK  CLR R1 ;ELSE R00W"X'ɂcccc .TITLE KCLOKA CLOCK A CONTROL .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 5-SEP-77 ;E>; THIS ROUTINE ACCEPTS RATES AND PRESETS TO BE USED LATER WITH ; CLOCK A.;S; SYSTEM MACRO CALLS;D .MCALL KSWDF$ KSWDF$E A;++; CLOCKA -- SET RATE AND PRESET FOR CLOCK AN;M; CALLING SEQUENCE:T; (; CALL CLOCKA (IRATE, IPRSET,IND, [LUN]);L ; INPUTS:N;U'; IRATE IS THE DESIRED CLOCK RATE (0-7)N3; IPRSET IS THE 16-BIT 2S COMPLEMENT PRESET TO LOADO; LUN IS IGNORED;I ; OUTPUTS:;O; IND RETURNS STATUS; 0 BAD ARGUMENTS.; 1 CLOCK RATE AND PRESET SET FOR SWEEP START<; FLAGS ARE SET SO SWEEP ROUTINES KNOW THIS ROUTINE HAS BEEN ; CALLED.;L;-CLOCKA:: .IF DF K$$W11& CALL .K.PAA ;VALIDATE AND STACK ARGS .WORD 4 ;4 ARGSA! .WORD 14 ;1ST TWO ARGS REQUIREDN BCC 10$ ;IF CC CONTINUEO .IFTF ;K$$W11% MOV #3,R4 ;STORE IN THIRD ARG (IND)  CLR R3 ;STORE 0 FOR ERROR72 CALLR .IESTO ;TRY TO STORE ERROR CODE AND RETURN .IFT ;K$$W11N 10$: MOV @(SP)+,R0 ;GET THE RATE( BIC #^C<7>,R0 ;CLEAR UNINTERESTING BITS ASL R0 ;MAKE INTO CLOCK RATE A .IF DF Q$$BUS ASL R0 ;A COUPLE MORE SHIFTS& ASL R0 ;FOR THE Q-BUS VERSION PLEASE .ENDC ;Q$$BUS MOV R0,.KARAT ;SAVE FOR LATER$ MOV @(SP)+,.KAPRE ;STORE THE PRESET MOV (SP)+,R0 ;GET IND ADDRESS" BEQ 20$ ;IF EQ SKIP STATUS STORE MOV #1,(R0) ;SET SUCCESS20$: TST (SP)+ ;SKIP THE LUN ( BIS #K$ACAC,.KAFLG ;FLAG WE WERE CALLED .ENDC ;K$$W11 100$: RETURN .END$W11N 10$: MOV @(SP)+,R0 ;GET THE RATE( BIC #^C<7>,R0 ;CLEAR UNINTERESTING BITS ASL R0 ;MAKE INTO CLOCK RATE A .IF DF Q$$BUS ASL R0 ;A COUPLE MORE SHIFTS& ASL R0 ;FOR THE Q-BUS VERSION PLEASE .- .TITLE KSWDF SWEEP CONTROL BLOCK DEFINITIONSO .IDENT /M01.01/;I ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.C;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01.01 ; B. SCHREIBER 6-JUL-77E;E; MODIFIED BY:;U; M. S. HARVEY 13-MAY-795; MSH035 -- DEFINE INTERRUPT CONTROL FLAG FOR DR11-KA;O;R;; THIS MODULE DEFINES THE SWEEP CONTROL BLOCK (SWB) OFFSETS+; AND FLAG VALUES CONTAINED WITHIN THE SWB.J  .MACRO KSWDF$;+#; SWB - SWEEP CONTROL BLOCK OFFSETS ;OC; THERE IS ONE SWEEP CONTROL BLOCK FOR EACH POSSIBLE TYPE OF SWEEP:R>; A/D, D/A, DIGITAL INPUT, DIGITAL OUTPUT, GATHERING HISTOGRAM; DATA. ;C;- .ASECTE.=0C2S.WLNK: .BLKW 1 ;LINK TO NEXT SWEEP CONTROL BLOCK%S.WFLG: .BLKW 1 ;SWEEP CONTROL FLAGS-S.WFL2: .BLKW 1 ;MO00X*tt tfDATARE FLAGSBS.WUSW: .BLKW 3 ;USER STATUS WORD: USER, EXEC APR6 RELOC AND BIAS'S.WBNO: .BLKB 1 ;CURRENT BUFFER NUMBER  .BLKB 1 ;SPARE BYTEI!S.WEBF: .BLKB 1 ;BUFFER IN ERROR7S.WLBF: .BLKB 1 ;LAST BUFFER COMPLETED (SEE KRWBF.MAC)S/S.WIBP: .BLKW 2*N$$MBF ;INITIAL BUFFER POINTERSF;S.WBPX: .BLKW 1 ;POINTER TO S.WBPT <.+2>(+RELOC IF MAPPED)G)S.WBPT: .BLKW 2 ;CURRENT BUFFER POINTERS(S.WSIZ: .BLKW 1 ;SIZE OF BUFFER (WORDS)/S.WCNT: .BLKW 1 ;COUNT OF WORDS LEFT IN BUFFER @S.WNBF: .BLKW 1 ;NUMBER OF BUFFERS TO FILL OR NEGATIVE IF CONT- ; INUOUS SAMPLING ?S.WEFN: .BLKW 1 ;0, EFN, OR ADDRESS OF USER COMPLETION ROUTINE13S.WSCR: .BLKW 1 ;SYNCHRONOUS CLOCK ROUTINE ADDRESS.S.WSTS: .BLKW 1 ;FINAL STATUS1S.WSTR: .BLKW 1 ;SCHMITT TRIGGER ROUTINE ADDRESST! ;**NOTE**USER VIRTUAL ADDRESS .S.WEFM: .BLKW 1 ;EVENT FLAG MASK (FROM $CEFI)1S.WEFA: .BLKW 1 ;EVENT FLAG ADDRESS (FROM $CEFI) 5S.WKNT: ;VIRTUAL ADDRESS, EXEC APR6 RELOC AND BIASN1 ;OF KOUNT PARAMETER FOR GTHIST. NOTE: THESER4 ;THREE WORDS OVERLAP S.WMSK, S.WCSR, AND S.WPRI.8S.WMSK: .BLKW 1 ;MASK OF BITS TO SIMULATE ST1 ON (DR11))S.WCSR: .BLKW 1 ;ACTIVE UNIT CSR ADDRESSR0S.WPRI: .BLKW 1 ;DEVICE HARDWARE PRIORITY LEVEL .IF DF FT$MOP .IF NDF M$$MGEM3S.WCLX: ;ACTIVE CLOCK QUEUE--UNMAPPED EXEC LEVELA .IFF ;M$$MGEE2S.WCLX: .BLKW 1 ;ACTIVE CLOCK QUEUE--APR5 MAPPING .ENDC ;M$$MGE2S.WCLQ: .BLKW 1 ;ACTIVE CLOCK QUEUE--TASK MAPPING .ENDC ;FT$MOP*S.WUBX: ;DR11 UNIT CONTROL BLOCK OFFSET ;+ ; FOLLOWING CELLS ARE FOR AD/DA SWEEP ONLYS ;>S.WCHB: .BLKB 1 ;CHANNEL BYTE TO LOAD IN HIGH BYTE OF A/D CSR-S.WCBX: .BLKB 1 ;SAVED ORIGINAL CHANNEL BYTE )S.WICH: .BLKW 1 ;STARTING CHANNEL NUMBERW(S.WCCH: .BLKW 1 ;CURRENT CHANNEL NUMBER5S.WHCH: .BLKW 1 ;HIGHEST CHANNEL ACCESSED THIS SWEEPE7S.WCHX: .BLKW 1 ;NUMBER OF CHANNELS (RESET FOR S.WNCH)Q2S.WNCH: .BLKW 1 ;NUMBER OF CHANNELS (DECREMENTED),S.WMXC: .BLKW 1 ;MAXIMUM NUMBER OF CHANNELS#S.WCHI: .BLKW 1 ;CHANNEL INCREMENTL0S.WGNW: .BLKW 1 ;DATA WORD FOR GAIN INFORMATION0S.WUNT: .BLKW 1 ;NUMBER OF UNITS ON THIS DEVICE0S.WAUA: .BLKW 1 ;OFFSET TO ACTIVE UCB. (ADD R4) S.WUCB: ;THE UCB'S START HERE;+"; UCB - UNIT CONTROL BLOCK OFFSETS; (; UCB'S ARE USED BY THE ADSWP, AND DASWP,; THE DR11 UCB HAS U.FLG, U.IVEC, AND U.OVEC;.;-.=0 U.FLG: .BLKW 1 ;UNIT FLAGSO%U.IVEC: ;DR11 INPUT VECTOR ADDRESS U.VEC: .BLKW 1 ;VECTOR ADDRESSB&U.OVEC: ;DR11 OUTPUT VECTOR ADDRESS!U.CSR: .BLKW 1 ;CSR OF THIS UNIT.-U.MAXC: .BLKW 1 ;MAX # CHANNELS ON THIS UNITU.LGTH=.;+; OFFSETS INTO IBUF ARRAYI;-.=0 "IB.IOS: .BLKW 2 ;I/O STATUS BLOCK#IB.USQ: .BLKW 5 ;USER BUFFER QUEUE%IB.DVQ: .BLKW 5 ;DEVICE BUFFER QUEUES#IB.NBF: .BLKW 1 ;NUMBER OF BUFFERSA$IB.BUF: ;BEGINNING OF BUFFER LIST C;+4; FLAGS IN THE SWEEP CONTROL BLOCK (SWB) WORD S.WFLG;-7S$WAST = 100000 ;AST REQUEST FOR THIS SWEEP (SIGN BIT)C;(FREE) = 40000 ; ;(FREE) = 20000 ;R;(FREE) = 10000 ;W;(FREE) = 4000 ;.'S$WTSS = 2000 ;TIME-STAMPED SAMPLINGS4S$WNOV = 1000 ;NON-CLOCK OVERFLOW DRIVEN SAMPLING&S$WEXT = 400 ;EXTERNAL START (ST1);(FREE) = 200 ;K;(FREE) = 100 ;U1S$CTRL = 40 ;INTERRUPTS BY CONTROL LINE (DR11-K) +S$WAGR = 5 ;AUTO GAIN RANGING (AD11)I9S$WSIB = 2 ;SET INTENSIFY BIT AFTER X/Y PAIR (AA11)B4S$WEZB = 1 ;EXTERNAL EVENT TIME FROM ZERO BASE ; MODE (HISTOGRAM)3S$WSCW = 1 ;SCOPE CONTROL WORD PRESENT (AA11)(7S$WSTZ = 1 ;ST2 FIRING ZEROES COUNTER (HISTOGRAM) @S$WUSR = S$WTSS!S$WNOV!S$WEXT!S$CTRL!7 ;FLAGS WHICH USER MAY SET% ;(N O T E: SOME FLAGS IN LOW BYTES ; ARE NOT USED AT PRESENT);+; FLAGS IN WORD S.WFL2;-,S$WACT = 100000 ;SWEEP IS ACTIVE (SIGN BIT)/S$WDLY = 40000 ;SWEEP REQUESTS DELAY (LDELAY) +S$WDIF = 20000 ;DIFFERENTIAL INPUT (AD11)1/S$WEFN = 10000 ;EFN SETTING AS OPPOSED TO ASTR#S$WSTP = 4000 ;REQUESTED TO STOPS'S$WSEB = 2000 ;STOP AT END OF BUFFER(-S$WACA = 1000 ;ABSOLUTE CHANNEL ADDRESSINGN6S$WSST = 400 ;SIMULATE00X2Y4Z9cccc SCHMITT TRIGGER (DIGO SETS)9S$WA$D = 200 ;THIS IS A/D SWEEP BLOCK (MUST BE 200!!)L(S$WADC = 100 ;SETADC HAS BEEN CALLED"S$WFRK = 40 ;FORK IN PROGRESS0S$WIOF = 20 ;INPUT (1) OR OUTPUT (0) (DR11)BS$W2CL = ^C ;CLEAR ALL BITS BUT THESE;+; FLAGS IN U.FLG;-9UF$ACT = 100000 ;UNIT WILL BE/IS ACTIVE IN CURRENT SWEEP;5UF$CIN = 40000 ;UNIT IS CONNECT TO INTERRUPT VECTORF%UF$AMK = 20000 ;AD11 HAS AM11 ON ITL D;+; FLAGS IN .KAFLG AND .KBFLG;-!K$ACTV = 100000 ;CLOCK IS ACTIVE #K$ADLY = 40000 ;DELAY IN PROGRESS "K$AGTD = 20000 ;GTHIST IS ACTIVE2K$ACIN = 10000 ;CLOCK IS CONNECTED TO INTERRUPTS(K$ACAC = 4000 ;CLOCKA HAS BEEN CALLED1K$AOVF = 2000 ;CLOCK A HAS OVERFLOWED (GTHIST)>6K$AFRK = 1000 ;FORK IN PROGRESS FOR CLOCK (MULTIPLE ;CLOCK DRIVEN SWEEPS ONLY) .PSECTI .MACRO KSWDF$ .ENDM .ENDM .ENDIS CONNECT TO INTERRUPT VECTORF%UF$AMK = 20000 ;AD11 HAS AM11 ON ITL D;+; FLAGS IN .KAFLG AND .KBFLG) .TITLE KCOMM COMMON RO DATA FOR K-SERIES .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; ; VERSION 01; B. SCHREIBER 19-AUG-77;EE; THIS MODULE CONTAINS THE READ-ONLY DATA BASE AND GLOBAL DEFINITIONS  E .SBTTL GLOBAL DEFINITIONS;+; GLOBAL DEFINITIONS;LB; THE FOLLOWING DEFINITIONS MAY BE ALTERED BY THE USER BY EDITTING ; THIS FILE:; :; ADTMOV THE VALUE RETURNED IN THE BUFFER WHEN THERE IS AN5; A/D TIMEOUT (THE A/D DID NOT CONVERT FAST ENOUGH).;E<; ADERRV THE VALUE RETURNED IN THE BUFFER WHEN THE A/D ERROR4; FLAG IS RAISED ON A CONVERSION (USUALLY INDICATES/; THAT CONVERSIONS ARE OCCURRING TOO RAPIDLY).7;E8; TMO$AD THE TIMEOUT COUNT USED WHEN WAITING FOR THE A/D5; TO CONVERT. IF YOU SEE A LOT OF "ADTMOV"'S IN THE 0; BUFFER, YOU MAY WISH TO INCREASE THIS NUMBER.;A;- .PSECT .KSCT02$KBASE:: ;LABEL TO DEFINE BEGINNING OF DATA BASE$ADTMOV == 177776 ;A/D TIMEOUT VALUE"ADERRV == 177777 ;A/D ERROR VALUE!TMO$AD == 25. ;A/D TIMEOUT COUNTE7I$BFVW == 171717 ;'IBUF' VALIDATION WORD (TO DETERMINE  ; IF SETIBF WAS CALLED) Y .SBTTL READ-ONLY DATA BASEN; ; A ZERO WORDA;L.ZEROW::.WORD 0D.NEG1:: .WORD 177777.ONE:: .WORD 1 .IF DF M$$MGE;R@; APR5 RELOCATION FACTOR TO ADD TO ADDRESSES AT TASK LEVEL SO WE4; MAY REFERENCE THEM AT EXEC LEVEL ON MAPPED SYSTEM.;AB$KRLC5::.WORD 120000-<$KBASE & 177700> ;VALUE TO BE ADDED FOR APR5 .ENDC .ENDADERRV == 177777 ;A/D ERROR VALUE!TMO$AD == 25. ;A/D TIMEOUT COUNTE7I$BFVW == 171717 ;'IBUF' VALIDATION WORD (TO DETERMINE  ; IF SETIBF WAS CALLED) Y .SBTTL READ-ONLY DATA BASEN; ; A ZERO WORDA;L.ZEROW::.WORD 0D.NEG1:: .WORD 177777.ONE:: .WORD 1 .IF DF M$$MGE;R2 .TITLE KCVADF CONVERT A/D INPUT TO FLOATING POINT .IDENT /M01.01/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.B;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES T00Z:p?tt tfDATAO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 22-SEP-77;E; B. SCHREIBER 13-JUN-78; 8; BLS054 -- CONVERT THE ARGUMENT RATHER THAN ITS ADDRESS; ; FROM THE LPS ROUTINE CVSWG; <; THIS ROUTINE CONVERTS A/D INPUT TO A FLOATING POINT NUMBER;M; TABLE OF GAIN VALUES;UGAIN: .BYTE 6,4,2,0  1 .SBTTL CVADF CONVERT A/D INPUT TO FLOATING POINTB;+/; ROUTINE TO CONVERT SWITCH GAIN TO FLOATING PT ;R; CVADF (IVAL, [VAL])S;R; IVAL = SWITCH GAIN VALUE;E; BITS 15-12 GAIN ; 0=GAIN1E ; 1=GAIN4 ; 2=GAIN16 ; 3=GAIN64;2; BITS 11-0 VALUE ALWAYS PLUS-;-;+; INPUT R5 = ^ TO ARG LIST (FORTRAN FORMAT)H;I; OUTPUT VALUE IN R0-R1E;S; USE VAR=(64*VALUE)/GAINR;-CVADF:: MOV @2(R5),R2 ;GET IVALN% BMI 40$ ; IF MINUS HANDLE SPECIALLYU MOV R2,R1 ;ISOLATE GAIN, BIC #147777,R2 ;D BIC R2,R1 ;N CLR R0 ;CLEAR HIGH ORDER SWAB R2 ; PICK UP GAIN*1 ASR R2  ASR R2P ASR R2  ASR R2A( MOVB GAIN(R2),R2 ; GET NUMBER OF SHIFTS BEQ 60$ ; IF =0 THEN DONE 20$: ASL R1  ROL R0 DEC R2N BNE 20$ BR 60$2$40$: MOV #-1,R0 ; SET A MINUS PARAM MOV R2,R1;+(; ROUTINE TO FLOAT A DOUBLE WORD INTEGER; INPUT R0 -- HIGH ORDER; R1 -- LOW ORDER;I; OUTPUT R0-R1 FLOATING VALUE; R2,R3 DISTROYED;-60$: MOV R1,R3 ;FIND 0 FIRSTR CLR R2 ; CLEAR EXPONENT WORD BIS R0,R3/ BEQ 140$ ; IF ZERO SET R0=0 AND R1=0 AND R2=02 TST R0 ;TEST MINUS BPL 80$ ;R3 BIS #400,R2 ;IF MINUS SET SIGN BIT IN EXPON. WORDR$ NEG R0 ;2'S COMPLEMENT DOUBLE WORD NEG R1A SBC R0 ;(80$: BISB #240,R2 ;SET HIGHEST EXPONENT100$: ASL R1 ;NORMALIZE NUMBERM* ; BY SEARCHING FOR C BIT (HIDDEN NORM) ROL R0R BCS 120$0 DEC R2 ;DECREASE EXPONENTO BR 100$ ;U+120$: CLRB R1 ; SET UP R0,R1 FROM R2,R0,R1D BISB R0,R1V SWAB R1 CLRB R0 BISB R2,R0; SWAB R0 SWAB R2 ASR R2, ROR R01 ROR R1 #140$: CMPB (R5),#2 ;TWO ARGUMENTS?T' BNE 160$ ;IF NE NO--NO VALUE TO STORE, MOV 4(R5),R2 ;YES--GET ADDRESSO$ MOV R0,(R2)+ ;STORE HIGH ORDER PART# MOV R1,(R2) ;STORE LOW ORDER PARTB160$: RETURN ; .ENDXPONENT100$: ASL R1 ;NORMALIZE NUMBERM* ; BY SEARCHING FOR C BIT (HIDDEN/ .TITLE KDIGO SET DIGITAL INPUT START FOR SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 5-SEP-77 ;E;; THIS ROUTINE ENABLES A DR11 INPUT BIT(S) TO START A SWEEPG;T; SYSTEM MACRO CALLS;T .MCALL KSWDF$, KDVDF$, CINT$S KSWDF$A KDVDF$  M* .SBTTL DIGO SET DIGITAL INPUT START EVENT;++; DIGO -- SET DR11 INPUT BIT TO START SWEEP ;I; CALLING SEQUENCE:C;T"; CALL DIGO (IUNIT, MASK, [KOUNT]);I ; INPUTS:R;O'; IUNIT DR11 UNIT NUMBER (DEFAULT IS 0)O ; MASK MASK TO SELECT START BITS/; IF DEFAULTED IMMEDIATELY SIMULATE ST1 FIRINGD(; IF ZERO, CANCEL PENDING DIGITAL START7; KOUNT RECEIVES THE VALUE OF THE 16-BIT SOFTWARE CLOCK ; IF MASK IS DEFAUL00pBI9ccccTED.;M ; OUTPUTS:;T ; DR11 IS ENABLED TO START SWEEP;K;-4DIGO:: CALL .K.PAA ;VALIDATE ARGS AND PUSH ON STACK .WORD 3 ;3 ARGS- .WORD 0 BCS 100$ ;IF CS ERROR ! MOV (SP)+,R0 ;GET UNIT # ADDRESSA BNE 20$ ;IF GIVEN GO MOV #.ZEROW,R0 ;ELSE USE 0 20$: MOV (R0),R0 ;GET UNIT #  ASL R0 ;CONVERT TO WORD INDEXR MOV (SP)+,R1 ;GET MASK ADDRESSL" BEQ 200$ ;IF EQ SIMULATE ST1 NOW .IF DF N$DR11# MOV .DRUTB(R0),R4 ;GET SWB ADDRESSO" CMP R4,#DRSW0 ;IS IT A LEGAL SWB? BLO 120$ ;IF LO NO CMP R4,#.DRUTB ;MAYBE...  BHIS 120$ ;IF HIS NO$ MOV (R1),S.WMSK(R4) ;READ MASK BITS# BEQ 300$ ;IF EQ STOP DIGO REQUEST3;GB; WE MUST NOW CONNECT TO INTERRUPTS AND ENABLE FOR INPUT INTERRUPT;S TST S.WFL2(R4) ;ACTIVE SWEEP? BPL 40$ ;IF PL NO 5 BIT #S$WNOV,S.WFLG(R4) ;YES--IS IT INTERRUPT DRIVEN?O BEQ 40$ ;IF EQ NOP* BIT #S$WIOF,S.WFL2(R4) ;YES--IS IT INPUT?" BNE 60$ ;IF NE YES--SKIP CONNECT40$: MOV R4,R3 ;POINT TO SWBD) SUB #4,R3 ;BACK UP TO INTERRUPT ROUTINE8 BIS #S$WSST,S.WFL2(R4) ;FLAG SIMULATING SCHMITT TRIGGER= CINT$S S.WUBX+U.IVEC(R4),#$KBASE,R3,#.DREDI,S.WPRI(R4) ;CINT # BCS 320$ ;IF CS COULD NOT CONNECTM60$: ;REF LABEL .IF DF M$$MGE5 MOV #.DRIN3+120000-<$KBASE&177700>,-2(R4) ;PT TO ISR? .IFF ;M$$MGEL! MOV #.DRIN3,-2(R4) ;POINT TO ISRS .ENDC ;M$$MGE8 BIS #DI$ENB,@S.WCSR(R4) ;SET INPUT INTERRUPT ENABLE BIT .ENDC ;N$DR11$80$: TST (SP)+ ;SKIP KOUNT ARGUMENT 100$: RETURN;W; ILLEGAL UNIT;C&120$: CMP (SP)+,(SP)+ ;CLEAN THE STACK RETURN4;F; SIMULATE SCHMITT TRIGGER NOW;N200$: ;REF LABEL, .IF NDF FT$MOPS/ MOV .KASWB,R4 ;GET SWB ADDRESS OF ACTIVE SWEEPC BEQ 80$ ;NOTHING TO DO IF ZERO- BIT #S$WEXT,S.WFLG(R4) ;WANT EXTERNAL START?2 BEQ 80$ ;IF EQ NO.% MTPS #PR6 ;YES--LOCK OUT INTERRUPTSI. CALL @S.WSTR(R4) ;;;CALL SCHMITT TRIG ROUTINE/ BIC #S$WEXT,S.WFLG(R4) ;;;CLEAR EXT START FLAGC .IFF ;FT$MOPT1 MOV #.KLQUU-S.WCLQ,R4 ;POINT TO CLOCK QUEUE HEADL MTPS #PR6 ;LOCK OUT INTERRUPTS'210$: MOV S.WCLQ(R4),R4 ;;;LINK TO NEXTU BEQ 220$ ;;;IF EQ ALL DONE/ BIT #S$WEXT,S.WFLG(R4) ;;;WANT EXTERNAL START?. BEQ 210$ ;;;IF EQ NO--IGNORE3 CALL @S.WSTR(R4) ;;;YES--CALL SCHMITT TRIG ROUTINE$/ BIC #S$WEXT,S.WFLG(R4) ;;;CLEAR EXT START FLAG  BR 210$ ;;;CONTINUE  .ENDC ;FT$MOP'220$: MOV (SP)+,R3 ;;;GET KOUNT ADDRESS  BEQ 280$ ;;;IF EQ NOT GIVENL .IF DF K$W11K: MOV .CLK16,(R3) ;;;YES--STORE 16 BIT CLOCK AT TIME OF ST1 .IFF ;K$W11KH# CLR (R3) ;;;NO CLOCK--CLEAR KOUNT .ENDC ;K$W11K280$: ;;;REF LABELB .IF DF K$$W11) MOV .KACSR,R3 ;;;GET CLOCK A CSR ADDRESSE= BIC #KA$STF!KA$STI!KA$STE,(R3) ;;;DISABLE CLOCK SCHMITT TRIG 1 BIT #KA$ENB,(R3) ;;;SEE IF CLOCK ALREADY ENABLEDW* BNE 290$ ;;;IF NE YES??--DON'T RE-ARM IT" INC (R3) ;;;SET CLOCK A'COUNTING .ENDC ;K$$W11"290$: MTPS #0 ;;;ALLOW INTERRUPTS RETURN ;DONE;F; KILL PENDING REQUEST;R9300$: BIT #S$WSST,S.WFL2(R4) ;SIMULATING SCHMITT TRIGGER?1 BEQ 80$ ;IF EQ NO--JUST RETURN-320$: BIC #S$WSST,S.WFL2(R4) ;YES--WE WERE...A6 BIC #DI$ENB,@S.WCSR(R4) ;CLEAR INPUT INTERRUPT ENABLE BR 80$ ;RETURN .ENDKA$STI!KA$STE,(R3) ;;;DISABLE CLOCK SCHMITT TRIG 1 BIT #KA$ENB,(R3) ;;;SEE IF CLOCK ALREADY ENABLEDW* BNE 290$ ;;;IF NE YES??--DON'T RE-ARM IT" INC (R3) ;;;SET CLOCK A'COUNTING .ENDC ;K$$W11"290$: MTPS #0 ;;;ALLOW INTERRUPTS RETURN ;DONE;F; KILL PENDING REQUEST;R9300$: BIT #S$WSST,S.WFL2(R4) ;SIMULATING SCHMITT TRIGGER?1 BEQ 80$ ;IF EQ NO--JUST RETURN-320$: BIC #S$WSST,S.WF" .TITLE KDISWP DIGITAL INPUT SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE 00JPtt tfDATA TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 11-SEP-77;E@; THIS MODULE INITIATES A DIGITAL INPUT SWEEP THROUGH THE DR11-K;H; SYSTEM MACRO CALLS;E .MCALL KSWDF$ KSWDF$  T' .SBTTL DISWP DIGITAL INPUT SWEEP STARTC;+.; DISWP -- START DIGITAL INPUT SWEEP ON DR11-K;C; CALLING SEQUENCE:I;A;; CALL DISWP (IBUF,LBUF,NBUF,MODE,IPRSET,IEFN,LDELAY,IUNIT)I;N ; INPUTS:O;; SEE DOCUMENTATIONR;O ; OUTPUTS:;H(; SWEEP IS STARTED UNLESS ERROR DETECTED;Q;-"DISWP:: MOV R5,-(SP) ;SAVE ARG PTR& CALL .K.PAA ;VALIDATE ARGS AND STACK .WORD 8. ;EIGHT ARGS# .WORD 300 ;MASK FOR REQUIRED ARGSH BCC 10$ ;IF CC CONTINUEC, MOV #-,R3 ;ELSE SET ERROR CODE CLR R4 ;IN CASE MULT SWEEPSE& BR 600$ ;STORE ERROR CODE AND RETURN410$: MOV 16(SP),R0 ;REACH DOWN AND GET IUNIT ADDRESS BNE 20$ ;IF NOT DEFAULTED GO MOV #.ZEROW,R0 ;ELSE USE UNIT 0"20$: MOV (R0),R0 ;GET UNIT NUMBER ASL R0 ;CONVERT TO INDEX3 MOV .DRUTB(R0),R4 ;GET SWEEP CONTROL BLOCK ADDRESS ! CMP R4,#DRSW0 ;ENSURE A REAL SWBK BLO 200$ ;IF LO ERRORS CMP R4,#.DRUTB ;CHECK HIGH ENDO BHIS 200$ ;IF HIS ERRORA. CALL .K.SET ;SET UP SWEEP BLOCK AND VALIDATE BCS 200$ ;IF CS ERROR DETECTED$ CALL .K.DLY ;CHECK DELAY PARAMETER BCS 300$ ;IF CS ERRORE" TST (SP)+ ;POP OFF IUNIT ADDRESS0 BIS #S$WIOF,S.WFL2(R4) ;FLAG THAT THIS IS INPUT( CALL .K.STB ;SET UP BUFFER INFORMATION+ BCS 400$ ;IF CS ILLEGAL NUMBER OF BUFFERSO8 BIT #S$WNOV,S.WFLG(R4) ;IS THIS INTERRUPT DRIVEN SWEEP?- BEQ 60$ ;IF EQ NO--SYNCHRONOUS CLOCK DRIVEN) CALL .DRCNI ;CONNECT DR11 TO INTERRUPTSC BCS 300$ ;IF CS ERROR$% CALL .DRSTR ;ENABLE DR11 INTERRUPTS  BR 80$ ;FINISH UPA;; SYNCRHONOUS CLOCK SWEEP START;L60$: ;REF LABEL .IF DF K$$W11/ CALL .DRSSC ;SELECT SYNCHRONOUS CLOCK ROUTINED& CALL .KLQIN ;INSERT INTO CLOCK QUEUE* CALL .KWCNI ;CONNECT CLOCK AND ENABLE IT BCS 300$ ;IF CS ERROR; .IFF ;K$$W11B5 MOV #-,R3 ;SET CLOCK OPTION NOT PRESENTT BR 500$ .ENDC ;K$$W11/80$: BIS #S$WACT,S.WFL2(R4) ;FLAG SWB IS ACTIVEC MOV (SP)+,R5 ;RESTORE ARG PTR RETURNF; ; ERROR RETURNSS; ; BAD PARAMETERS;T&200$: MOV #-,R3 ;SET CODE BR 500$;E; RESOURCE IN USE ;R&300$: MOV #-,R3 ;SET CODE BR 500$;Y; BAD BUFFER SPECIFICATION; 400$: MOV #-,R3 E2500$: MOV R5,SP ;RESTORE PRE-.K.PAA STACK POINTER600$:F, CALL .KLQRM ;REMOVE FROM QUEUE IF INSERTED# MOV #1,R4 ;STORE IN 1ST PARAMETERN MOV (SP)+,R5 ;RESTORE ARG PTR% CALLR .IESTO ;STORE CODE AND RETURN  .ENDC MOV (SP)+,R5 ;RESTORE ARG PTR RETURNF; ; ERROR RETURNSS; ; BAD PARAMETERS;T&200$: # .TITLE KDOSWP DIGITAL OUTPUT SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 11-SEP-77;EA; THIS MODULE INITIATES A DIGITAL OUTPUT SWEEP THROUGH THE DR11-KT;S; SYST00RW9ccccEM MACRO CALLS; .MCALL KSWDF$ KSWDF$O A( .SBTTL DOSWP DIGITAL OUTPUT SWEEP START;+/; DOSWP -- START DIGITAL OUTPUT SWEEP ON DR11-KC;G; CALLING SEQUENCE:A;S;; CALL DOSWP (IBUF,LBUF,NBUF,MODE,IPRSET,IEFN,LDELAY,IUNIT)N;O ; INPUTS:;; SEE DOCUMENTATIONO;B ; OUTPUTS:;S(; SWEEP IS STARTED UNLESS ERROR DETECTED;M;-"DOSWP:: MOV R5,-(SP) ;SAVE ARG PTR& CALL .K.PAA ;VALIDATE ARGS AND STACK .WORD 8. ;EIGHT ARGS# .WORD 300 ;MASK FOR REQUIRED ARGSD BCC 10$ ;IF CC OKM0 MOV #-,R3 ;ELSE SET BAD PARAMETERS CLR R4 ;IN CASE MULT SWEEPSE$ BR 600$ ;STORE ERROR CODE AND EXIT410$: MOV 16(SP),R0 ;REACH DOWN AND GET IUNIT ADDRESS BNE 20$ ;IF NOT DEFAULTED GO MOV #.ZEROW,R0 ;ELSE USE UNIT 0"20$: MOV (R0),R0 ;GET UNIT NUMBER ASL R0 ;CONVERT TO INDEX3 MOV .DRUTB(R0),R4 ;GET SWEEP CONTROL BLOCK ADDRESSW! CMP R4,#DRSW0 ;ENSURE A REAL SWBL BLO 200$ ;IF LO ERRORA CMP R4,#.DRUTB ;CHECK HIGH END BHIS 200$ ;IF HIS ERRORR. CALL .K.SET ;SET UP SWEEP BLOCK AND VALIDATE BCS 200$ ;IF CS ERROR DETECTED$ CALL .K.DLY ;CHECK DELAY PARAMETER BCS 300$ ;IF CS ERROR " TST (SP)+ ;POP OFF IUNIT ADDRESS1 BIC #S$WIOF,S.WFL2(R4) ;FLAG THAT THIS IS OUTPUT ( CALL .K.STB ;SET UP BUFFER INFORMATION+ BCS 400$ ;IF CS ILLEGAL NUMBER OF BUFFERSV8 BIT #S$WNOV,S.WFLG(R4) ;IS THIS INTERRUPT DRIVEN SWEEP?- BEQ 60$ ;IF EQ NO--SYNCHRONOUS CLOCK DRIVENB) CALL .DRCNI ;CONNECT DR11 TO INTERRUPTSE BCS 300$ ;IF CS ERROR % CALL .DRSTR ;ENABLE DR11 INTERRUPTSW BR 80$ ;GO FINISH UP;S; SYNCRHONOUS CLOCK SWEEP STARTL;K60$: .IF DF K$$W11/ CALL .DRSSC ;SELECT SYNCHRONOUS CLOCK ROUTINEF& CALL .KLQIN ;INSERT INTO CLOCK QUEUE* CALL .KWCNI ;CONNECT CLOCK AND ENABLE IT BCS 300$ ;IF CS ERROR .IFF ;K$$W11 5 MOV #-,R3 ;SET CLOCK OPTION NOT PRESENTH BR 500$ ;RETURN STATUS .ENDC ;K$$W11080$: BIS #S$WACT,S.WFL2(R4) ;FLAG UNIT IS ACTIVE MOV (SP)+,R5 ;RESTORE ARG PTR RETURN ;O; ERROR RETURNS ;A; BAD PARAMETERS;200$: MOV #-,R3 BR 500$;L; RESOURCE IN USEK;0300$: MOV #-,R3 BR 500$;C; BAD BUFFER SPECIFICATION;C400$: MOV #-,R3K2500$: MOV R5,SP ;RESTORE PRE-.K.PAA STACK POINTER1600$: CALL .KLQRM ;REMOVE FROM QUEUE IF INSERTED# MOV #1,R4 ;STORE IN 1ST ARGT MOV (SP)+,R5 ;RESTORE ARG PTR CALLR .IESTO ;STORE AND RETURN .END$WACT,S.WFL2(R4) ;FLAG UNIT IS ACTIVE MOV (SP)+,R5 ;RESTORE ARG PTR RETURN ;O; ERROR RETURNS ;A; BAD PARAMETERS;( .TITLE KDSCAD DISCONNECT A/D CONVERTERS .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 26-SEP-77;E=; THIS ROUTINE DISCONNECTS THE A/D CONVERTERS FROM INTERRUPTSE; ; SYSTEM MACRO CALLS;T .MCALL KSWDF$,CINT$SO KSWDF$T E( .SBTTL .DSCAD DISCONNECT A/D CONVERTERS;+5; .DSCAD -- DISCONNECT A/D CONVERTERS FROM INTERRUPTSI;U8; THIS ROUTINE IS CALLED AT AST LEVEL WHEN IT IS TIME TO:; DISCONNECT THE A/D CONVERTERS FROM THE INTERRUPT SYSTEM.;O ; INPUTS:O;H; R4 POINTS TO SWB ; R3,R2 FREE;A ; OUTPUTS:; 5; ALL A/D CONVERTERS THAT ARE CONNECTED TO INTERRUPTSS; ARE DISCONNECTED.E; ;-&.DSCAD::MOV R4,R3 ;GET POINTER TO SWB# ADD #S.WUCB,R3 ;POINT TO 00Z[_tt tfDATAFIRST UCBC' MOV S.WUNT(R4),R2 ;GET NUMBER OF UNITST920$: BIT #UF$CIN,U.FLG(R3) ;UNIT CONNECTED TO INTERRUPTS?C BEQ 40$ ;NO--LOOK AT NEXTR1 CINT$S U.VEC(R3),,#0 ;DISCONNECT FROM INTERRUPTS ) BIC #UF$CIN,U.FLG(R3) ;FLAG DISCONNECTEDT!40$: ADD #U.LGTH,R3 ;LOOK AT NEXTT DEC R2 ;SEE IF MORE TO DO BGT 20$ ;IF GT YES RETURN ;ALL DONEP .END; ALL A/D CONVERTERS THAT ARE CONNECTED TO INTERRUPTSS; ARE DISCONNECTED.E; ;-&.DSCAD::MOV R4,R3 ;GET POINTER TO SWB# ADD #S.WUCB,R3 ;POINT TO  .TITLE KDSDGO DISABLE DIGO .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 1-OCT-77 ;E>; THIS ROUTINE IS CALLED TO DISABLE DR11 INPUT INTERRUPTS FROMA; UNITS WHICH ARE SIMULATING START EVENTS WHEN A REAL ST1 OCCURS.A;A; SYSTEM MACRO CALLS; .MCALL KSWDF$,KDVDF$N KSWDF$  KDVDF$O .PSECT .KSCT1 C& .SBTTL .DSDGO DISABLE DIGO INTERRUPTS;+#; .DSDGO -- DISABLE DIGO INTERRUPTS ;I=; THIS ROUTINE IS CALLED BY THE KW11-K INTERRUPT ROUTINE WHEN <; A ST1 HAS OCCURRED. WE THEN LOOK AT ALL THE DR11'S TO SEE;; IF WE ARE SIMULATING A SCHMITT TRIGGER ON ANY, AND IF SO,7; DISABLE INPUT INTERRUPTS.L;T ; INPUTS:R;I; NONE;U ; OUTPUTS:;T8; DR11'S WHICH WERE SET TO SIMULATE SCHMITT TRIGGERS ARE ; DISABLED.Y;M;-.DSDGO::MOV R2,-(SP) ;;;SAVE R2N7 MOV .DRXPT,R3 ;;;GET POINTER TO DR11 SWB POINTER TABLEO.20$: MOV (R3)+,R2 ;;;GET NEXT DR11 SWB ADDRESS BEQ 40$ ;;;IF EQ ALL DONEH6 BIT #S$WSST,S.WFL2(R2) ;;;SIMULATING SCHMITT TRIGGER? BEQ 20$ ;;;IF EQ NOD* BIC #S$WSST,S.WFL2(R2) ;;;YES--CLEAR FLAG4 BIC #DI$ENB,@S.WCSR(R2) ;;;DISABLE INPUT INTERRUPTS BR 20$ ;;;LOOK AT MORE40$: MOV (SP)+,R2 ;;;RESTORE R2O RETURN  .END;T8; DR11'S WHICH W' .TITLE KDVDF K-SERIES HARDWARE DEFINES .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 27-JUN-77;E"; THIS MODULE DEFINES THE CSR BITS Y .MACRO KDVDF$ .IF NDF L$$SI1 ;+/; KA$XXX - KW11-K CLOCK 'A' CSR BIT DEFINITIONSA;-(KA$STF = 100000 ;ST1 EVENT HAS OCCURRED,KA$STI = 40000 ;ST1 EVENT INTERRUPT ENABLE2KA$STE = 20000 ;ST1 EVENT ENABLES KA$ENA (ENABLE ; COUNTER)(KA$RIM = 0400 ;REPEATED INTERVAL MODE*KA$EEM = 1000 ;EXTERNAL EVENT TIME MODE/KA$EZB = 1400 ;EXTERNAL EVENT TIME FROM ZEROM ; BASE MODE3KA$MDF = 200 ;OVERFLOW OR COUNTER TO BUFFER XFR- ; HAS OCCURREDD,KA$MFE = 100 ;MODE FLAG INTERRUPT ENABLE3KA$OVF = 40 ;00bW9ccccCOUNTER 'A' OVERFLOW HAS OCCURRED *;KA$RAT = 16 ;MASK FOR CLOCK 'A' RATE"KA$ENB = 1 ;ENABLE CLOCK 'A';+.; KB$XXX - KW11-K CLOCK 'B' CSR BIT DEFINTIONS;-3KB$OVF = 200 ;COUNTER 'B' OVERFLOW HAS OCCURRED +KB$OIE = 100 ;OVERFLOW INTERRUPT ENABLE0$KB$B2A = 40 ;FEED B TO A ENABLE&;KB$ATO = 20 ;AUTO INCREMENT MODE*;KB$RAT = 16 ;MASK FOR CLOCK 'B' RATE"KB$ENB = 1 ;CLOCK 'B' ENABLE;+3; AD$XXX - AD11-K A/D CONVERTOR CSR BIT DEFINITIONSE;-AD$ERR = 100000 ;ERROR FLAGAD$DON = 200 ;DONE FLAG "AD$ENB = 100 ;INTERRUPT ENABLE7AD$OVE = 40 ;KW11-K OVERFLOW STARTS A/D CONVERSION 9AD$ESE = 20 ;EXTERNAL EVENT INITIATES A/D CONVERSIONE%AD$GO = 1 ;START A/D CONVERSION ;+4; DO$XXX - DR11-K DIGITAL OUTPUT CSR BIT DEFINITIONS4; DI$XXX - DR11-K DIGITAL INPUT CSR BIT DEFINITIONS;-7DO$FLG = 100000 ;EXTERNAL DATA ACCEPTED ON EXT. DEVICEL)DO$ENB = 40000 ;ENABLE OUTPUT INTERRUPT 2DO$BUF = 4 ;OFFSET FROM CSR TO OUTPUT BUFFER6DI$FLG = 200 ;EXTERNAL DATA READY FROM EXT. DEVICE(DI$ENB = 100 ;ENABLE INPUT INTERRUPT1DI$BUF = 2 ;OFFSET FROM CSR TO INPUT BUFFER   .IF NDF L$$PS1I;+3; DA$XXX - AA11-K D/A CONVERTOR CSR BIT DEFINITIONSS;-4DA$ERA = 10000 ;ERASE DATA IN STORAGE OSCILLOSCOPE!DA$WTU = 4000 ;WRITE THRU MODEUDA$STO = 2000 ;STORE-2DA$BT9 = 1000 ;BIT 9 (DIGITAL SIGNAL AVAILABLE)DA$RDY = 200 ;READY #;DA$ENB = 100 ;INTERRUPT ENABLE DA$EXD = 20 ;EXTERNAL DELAYDA$MDE = 14 ;MASK FOR MODEN'DA$FIE = 2 ;FAST INTENSIFY ENABLE 4DA$INT = 1 ;GENERATE INTENSIFY PULSE IN MODE 09DA$SCO=DA$ERA!DA$WTU!DA$STO$DA$BT9!DA$MDE!DA$FIE!DA$INT ; ( ;BITS LEGAL FOR USER TO SET IN SCOPE ;CONTROL WORDE .IFF ;L$$PS1S4DA$ERA = 10000 ;ERASE DATA IN STORAGE OSCILLOSCOPE(DA$WTU = 4000 ;SET WRITE THROUGH MODEDA$STO = 2000 ;STORET DA$CHN = 1000 ;CHANNEL SELECT DA$COL = 400 ;COLOR SELECTDA$RDY = 200 ;READY=#;DA$ENB = 100 ;INTERRUPT ENABLE DA$EXD = 20 ;EXTERNAL DELAYDA$MDE = 14 ;MODE(DA$FIE = 2 ;FAST INTENSIFY ENABLEDA$INT = 1 ;INTENSIFYR@DA$SCO = DA$ERA!DA$WTU!DA$STO!DA$CHN!DA$COL!DA$MDE!DA$FIE!DA$INT* ;BITS LEGAL FOR USER TO SET WITH SCOPE .ENDC ;L$$PS1 .IFF ;L$$SI1  .IF DF Q$$BUS;+!; KWV11 CLOCK CSR BIT DEFINITIONS ;-'KA$STF = 100000 ;ST2 EVENT HAS OCCUREDA,KA$STI = 40000 ;ST2 EVENT INTERRUPT ENABLE)KA$STE = 20000 ;ST2 EVENT ENABLES CLOCK=:KA$MDF = 200 ;OVERFLOW OR CTR TO BUFFR XFR HAS OCCURED'KA$OVF = 200 ;OVERFLOW HAS OCCURREDF.KA$IOO = 100 ;INTERRUPT ON OVERFLOW ENABLE"KA$MFE = 100 ;MODE FLAG ENABLE&;KA$RAT = 30 ;MASK FOR CLOCK RATE(KA$RIM = 2 ;REPEATED INTERVAL MODE*KA$EEM = 4 ;EXTERNAL EVENT TIME MODE9KA$EZB = 6 ;EXTERNAL EVENT TIME FROM ZERO BASE MODENKA$ENB = 1 ;ENABLE CLOCK;+1; AD$XXX - ADV11 A/D CONVERTOR CSR BIT DEFINTIONS ;-AD$ERR = 100000 ;ERROR FLAG(AD$IEN = 40000 ;ERROR INTERRUPT ENABLEAD$DON = 200 ;DONE FLAGR"AD$ENB = 100 ;INTERRUPT ENABLE6AD$OVE = 40 ;CLOCK OVERFLOW STARTS A/D CONVERSION6AD$ESE = 20 ;EXTERNAL EVENT STARTS A/D CONVERSION%AD$GO = 1 ;START A/D CONVERSION;;+3; DO$XXX - DRV11 DIGITAL OUTPUT CSR BIT DEFINITIONSM3; DI$XXX - DRV11 DIGITAL INPUT CSR BIT DEFINITIONSR;-(DO$FLG = 100000 ;EXTERNAL DATA ACCEPTED)DO$ENB = 40 ;OUTPUT INTERRUPT ENABLED2DO$BUF = 2 ;OFFSET TO OUTPUT BUFFER FROM CSR%DI$FLG = 200 ;EXTERNAL DATA READYD(DI$ENB = 100 ;INPUT INTERRUPT ENABLE1DI$BUF = 4 ;OFFSET TO INPUT BUFFER FROM CSRW .ENDC ;Q$$BUS .ENDC ;L$$SI1 .MACRO KDVDF$ .ENDM .ENDM .ENDAD$GO = 1 ;START A/D CONVERSION;;+3; DO$XXX - DRV11 DIGITAL OUTPUT CSR BIT DEFINITIONSM3; DI$XXX - DRV11 DIGITAL INPUT CSR BIT DEFINITIONSR;-(DO$FLG = 100000 ;EXTERNAL DATA ACCEPTED)DO$ENB = 40 ;OUTPUT INTERRUPT ENABLED2DO$BUF = 2 ;OFFSET TO OUTPUT BUFFER FROM CSR%DI$FLG = 200 ;EXTERNAL DATA 00j[_tt tfDATA# .TITLE KEFQA SET EFN AND QUEUE AST .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 4-SEP-77 ;E;; THIS MODULE SETS EVENT FLAGS OR QUEUES AST'S FOR A SWEEP.G;T; SYSTEM MACRO CALLS;T .MCALL KSWDF$ KSWDF$  .PSECT .KSCT1 : .SBTTL .KEFQI INTERRUPT LEVEL SET EFN AND QUEUE AST ENTRY;+8; .KEFQI -- SET EFN AND QUEUE AST (FROM INTERRUPT LEVEL);E ; INPUTS:A; 0; STACK MUST BE AT LEVEL 0 (FOR RETURN TO INTSV); ; OUTPUTS:;O4; SYSTEM PROCESS IS CREATED, AND EFN IS SET OR EVENT-; FLAG IS QUEUED. A RETURN IS THEN EXECUTED.D;I; NOTE:E;O7; THIS ROUTINE IS ENTERED AT INTERRUPT LEVEL, AND EXITSE7; AT FORK LEVEL (UNLESS A FORK IS ALREADY IN PROGRESS).C;C5; THIS ROUTINE SHOULD BE ENTERED VIA A "CALLR .KEFQI";;- .ENABL LSBR;.KEFQI::BIT #S$WFRK,S.WFL2(R4) ;;;FORK ALREADY IN PROGRESS?F) BNE 40$ ;;;IF NE YES--DO NOT FORK AGAIN7 BIS #S$WFRK,S.WFL2(R4) ;;;NO--DECLARE FORK IN PROGRESS ' CALL @#$FORK2 ;;;CREATE SYSTEM PROCESSE# CLR (R3) ;DECLARE FORK BLOCK FREET3 BIC #S$WFRK,S.WFL2(R4) ;FORK NO LONGER IN PROGRESS5;***; BR .KEFQA ;SET EFN OR QUEUE AST AS APPROPRIATEV . .SBTTL .KEFQA SET EVENT FLAGS AND QUEUE AST'S;+'; .KEFQA -- SET EVENT FLAG OR QUEUE AST ;E ; INPUTS:A;A; R4 POINTS TO SWB; ; OUTPUTS:;/; AST QUEUED IF S$WEFN=0 OR IF STOPPING A SWEEP .; EFN SET IF S$WEFN=1 AND NOT STOPPING A SWEEP;I1; NOTE: THIS ROUTINE IS CALLED ONLY AT FORK LEVELP;R;-/.KEFQA::BIT #S$WSTP,S.WFL2(R4) ;STOPPING SWEEP?3% BNE 5$ ;IF NE YES--ALWAYS QUEUE ASTF, BIT #S$WEFN,S.WFL2(R4) ;SETTING EVENT FLAG? BNE 10$ ;IF NE YES--GO DO IT 5$: CALLR @#$QASTC ;QUEUE AN AST#10$: MOV R5,-(SP) ;SAVE ITB ADDRESSS" MOV .KTKCB,R5 ;GET MY TCB ADDRESS* MOV S.WEFA(R4),R1 ;GET EVENT FLAG ADDRESS& BNE 20$ ;IF NE $CEFI HAS BEEN CALLED' MOV S.WEFN(R4),R0 ;FIRST CALL--GET EFN + CALL @#$CEFI ;CONVERT TO ADDRESS AND MASK MOV R0,S.WEFM(R4) ;SET MASK MOV R1,S.WEFA(R4) ;AND ADDRESS 20$: MOV S.WEFM(R4),R0 ;GET MASK CALL @#$SETM ;SET EVENT FLAG" MOV (SP)+,R5 ;RESTORE ITB ADDRESS 40$: RETURN .DSABL LSBF ?@ .SBTTL .KWEFQ SET EFN OR QUEUE AST FOR MULT CLOCK DRIVEN SWEEPS;+>; .KWEFQ -- SET EFN OR QUEUE AST FOR MULT. CLOCK DRIVEN SWEEPS;S ; INPUTS:F;42; INTERRUPT LEVEL, STACK CLEAR FOR RETURN TO INTXT;S ; OUTPUTS:;M<; AT MOST ONE AST QUEUED, EFNS SET FOR ALL REQUESTING SWEEPS;O;- .IF DF K$$W11 & FT$MOPE/.KWEFQ::BIT #K$AFRK,.KAFLG ;;;FORK IN PROGRESS?& BNE 120$ ;;;IF NE YES--DO NOT REFORK0 BIS #K$AFRK,.KAFLG ;;;NO--FLAG FORK IN PROGRESS' CALL @#$FORK2 ;;;CREATE SYSTEM PROCESS# CLR (R3) ;DECLARE FORK BLOCK FREES0 BIC #K$AFRK,.KAFLG ;CLEAR FORK IN PROGRESS FLAG- CLR -(SP) ;SET "AST QUEUED" FLAG ONTO STACKE .IF DF M$$MGE? MOV #<.KLQUX-S.WCLX>+120000-<$KBASE & 177700>,R4 ;PT TO Q HEADP .IFF ;M$$MGES* MOV #<.KLQUX-S.WCLX>,R4 ;PT TO QUEUE HEAD .ENDC ;M$$MGE(20$: MOV S.WCLX(R4),R4 ;MOVE TO NEXT SWB BEQ 100$ ;IF EQ END OF QUEUE= TST S.WFLG(R4) ;REQUEST FOR THIS SWEEP (S$WAST IS SIGN BIT)?;! BPL 20$ ;IF PL NO--MOVE TO NEXT#- BIT #S$WSTP,S.WFL2(R4) ;YES--STOPPING SWEEP?E& BNE 40$ ;IF NE YES--ALWAYS QUEUE AST/ BIT #S$WEFN,S.WFL2(R4) ;NO--USING EVENT FLAGS?T BNE 60$ ;IF NE Y00rt9ccccES--GO SET IT.40$: TST (SP) ;HAVE WE ALREADY QUEUED AN AST?) BNE 20$ ;IF NE YES--DON'T QUEUE ANOTHER $ INC (SP) ;NO--FLAG WE HAVE NOW THO CALL @#$QASTC ;QUEUE AST; BR 20$ ;CHECK REST OF QUEUE4.60$: BIC #S$WAST,S.WFLG(R4) ;CLEAR AST REQUEST MOV R5,-(SP) ;SAVE R5" MOV .KTKCB,R5 ;GET MY TCB ADDRESS* MOV S.WEFA(R4),R1 ;GET EVENT FLAG ADDRESS& BNE 80$ ;IF NE $CEFI HAS BEEN CALLED' MOV S.WEFN(R4),R0 ;FIRST CALL--GET EFNE/ CALL @#$CEFI ;CONVERT EFN TO MASK AND ADDRESSA! MOV R0,S.WEFM(R4) ;REMEMBER MASKI MOV R1,S.WEFA(R4) ;AND ADDRESSD 80$: MOV S.WEFM(R4),R0 ;GET MASK( CALL @#$SETM ;SET REQUESTED EVENT FLAG MOV (SP)+,R5 ;RESTORE R5L BR 20$ ;SCAN REST OF QUEUE100$: TST (SP)+ ;CLEAR STACKB120$: RETURN ;DONE .ENDC ;K$$W11 & FT$MOP, .ENDVE R5" MOV .KTKCB,R5 ;GET MY TCB ADDRESS* MOV S.WEFA(R4),R1 ;GET EVENT FLAG ADDRESS& BNE 80$ ;IF NE $CEFI HAS BEEN CALLED' MOV S.WEFN(R4),R0 ;FIRST CALL--GET EFNE/ CALL @#$CEFI ;CONVERT EFN TO MASK AND ADDRESSA! MOV R0,S.WEFM(R4) ;RE+ .TITLE KFLT16 FLOAT 2'S COMPLEMENT INTEGER .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 22-SEP-77;E4; THIS ROUTINE CONVERTS TWO'S COMPLEMENT INTEGERS TO; FLOATING POINT NUMBERS; 5; FROM THE RT11 ROUTINE FLT16 AND THE FORTRAN LIBRARYL; ROUTINE $IR.E N. .SBTTL FLT16 FLOAT AN UNSIGNED 16-BIT INTEGER;+); FLT16 -- FLOAT A 2'S COMPLEMENT INTEGERS;L; CALLING SEQUENCES:;O; VAL = FLT16 (IVAL); CALL FLT16 (IVAL, VAL)O; ; INPUTS: ;R ; IVAL 16 BIT INTEGER TO CONVERT;I ; OUTPUTS:;O"; VAL 32 BIT CONVERTED REAL NUMBER;E;-.FLT16:: MOV @2(R5),R0 ;PICKUP VALUE TO CONVERT6 CALL .FLT16 ;CALL INTERNAL ROUTINE TO CONVERT NUMBER) CMPB (R5),#2 ;WERE THERE TWO ARGUMENTS?E+ BNE 10$ ;IF NE NO--NO 'VAL' TO STORE INTO% MOV 4(R5),R2 ;YES--GET 'VAL' ADDRESSA CMP #-1,R2 ;WAS IT DEFAULTED?+$ BEQ 10$ ;IF EQ YES--SKIP THE STORE1 MOV R0,(R2)+ ;STORE MS PART OF RESULT INTO 'VAL'  MOV R1,(R2) ;STORE LS PART 10$: RETURNN;+; .FLT16 -- INTERNAL FLT16;O ; INPUTS:I; ; R0 16 BIT NUMBER TO CONVERTE;D ; OUTPUTS:;E; R0,R1 32-BIT CONVERTED NUMBERC; ;-8.FLT16::MOV R0,-(SP) ;PUSH ONTO STACK AND CHECK SIGN BIT. BPL 40$ ;IF PL CAN USE $IR (OR WHAT IS LEFT)" MOV R0,-(SP) ;PUSH ON STACK AGAIN! BIC #100000,(SP) ;CLEAR SIGN BITS CLRB (SP) ;CLEAR LS HALF SWAB (SP) ;MOVE MS HALF! ADD #44000,(SP) ;ADD IN EXPONENTE MOV (SP)+,R0 ;GET MS HALF SWAB (SP) ;WORK ON LS HALF CLRB (SP) ;CLEAR OUT REST:20$: MOV (SP)+,R1 ;GET LS HALF RETURN ;DONEN;S; HERE IF NOT LARGEU;R%40$: CLR -(SP) ;MAKE ROOM FOR RESULTR! MOV R0,R1 ;GET INTEGER ARGUMENT BEQ 120$ ;IF EQ ALL DONE, MOV #220,R2 ;GET MAX POSSIBLE EXPONENT + 1) CLRB 2(SP) ;CLEAR LOWEST ORDER FRACTIONP!80$: ROL R1 ;LOOK FOR NORMAL BIT0 BCS 100$ ;IF CS FOUND IT DEC R2 ;DECREASE EXPONENT  BR 80$ ;TRY AGAIN,100$: MOVB R1,3(SP) ;SAVE LOW ORDER FRACTION CLRB R1 ;A4 BISB R2,R1 ;COMBINE EXPONENT AND HI ORDER FRACTION( SWAB R1 ;(NOTE THAT SWAB CLEARS C-BIT)1 ROR R1 ;INSERT SIGN IN RESULT (ALWAYS POSITIVE): RORB 3(SP)M MOV R1,(SP) ;STORE RESULT,120$: MOV (SP)+,R0 ;GET RESULT MOV (SP)+,R1 ;... 140$: RETURN .ENDMAX POSSIBLE EXPONENT + 1) CLRB 2(SP) 00z~_tt tfDATA2 .TITLE KIESTO STORE ERROR CODE FROM ABORTED SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 6-JUL-77 ;E?; THIS ROUTINE STORES THE ERROR CODE FROM AN ABORTED SWEEP INTOS; THE USER'S I/O STATUS BLOCK. ;+2; .IESTO -- STORE ERROR CODE INTO I/O STATUS BLOCK;NB; THIS ROUTINE IS USED TO STORE THE ERROR CODE INTO THE I/O STATUSE; BLOCK FOR A SWEEP WHICH NEVER GOT STARTED (BAD PARAMETERS, RESOURCE ; IN USE, ETC.)M; ; INPUTS:.;O(; R5 POINTS TO THE FORTRAN ARGUMENT LIST0; R4 THE ARGUMENT NUMBER OF THE I/O STATUS BLOCK!; R3 STATUS CODE TO STORE IN IOSB ; ; OUTPUTS:;.:; THE VALUE IS STORED IN THE I/O STATUS BLOCK (IF PRESENT);F; REGISTERS ALTERED:;S; R4;S;-5.IESTO::CMPB R4,(R5) ;CAN IOSB BE IN PARAMETER LIST?I# BHI 20$ ;IF HI NO--USER LOSES BIGI ASL R4 ;CONVERT TO WORD INDEXE- ADD R5,R4 ;R4 NOW POINTS TO WORD CONTAINING  ; ADDRESS OF IOSB& CMP #-1,(R4) ;WAS ARGUMENT DEFAULTED? BEQ 20$ ;IF EQ YES--LOSE BIG MOV R3,@(R4) ;STORE STATUS 20$: RETURNM .ENDR OF THE I/O STATUS BLOCK!; R3 STATUS CODE TO STORE IN IOSB ; ; OUTPUTS:;.:; THE VALUE IS STORED IN THE I/O STATUS BLOCK (IF PRESENT);F; REGISTERS ALTERED:;S/ .TITLE KKWDRV KW11 HARDWARE INTERFACE ROUTINESE .IDENT /M01.00/; ; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 4-SEP-77 ;E:; THIS MODULE CONTAINS ROUTINES THAT ACCESS THE KW11 CLOCK;S; SYSTEM MACRO CALLS;  .MCALL CINT$S,KSWDF$,KDVDF$ KSWDF$E KDVDF$  , .SBTTL .KWCNI CONNECT CLOCK A TO INTERRUPTS;+/; .KWCNI -- CONNECT CLOCK A TO INTERRUPT VECTORO;E ; INPUTS: ; ; DATA BASE SET ;M ; OUTPUTS:;A; C-CLEAR CONNECT OK; C-SET COULD NOT CONNECTO;S;- .ENABL LSB .KWCNI::.IF DF FT$MOP $ TST .KAFLG ;ARE WE ALREADY ACTIVE?+ BMI 100$ ;YES--**SHOULD CHECK EXT START**E .ENDC ;FT$MOP% BIT #K$ACIN,.KAFLG ;IS IT CONNECTED?C" BNE 20$ ;YES--DON'T TRY IT AGAIN$ MOV .KAVEC,R1 ;CONNECT FIRST VECTOR CALL 200$ ;... BCS 120$ ;IF CS THEN ERROR .IF DF Q$$BUS ADD #4,R1 ;CONNECT ST2 VECTORN CALL 200$ ;... BCS 120$O .ENDC ;Q$$BUS1 BIS #K$ACIN,.KAFLG ;FLAG CONNECTED TO INTERRUPTS .KWCN0:: ;REF LABELL#20$: MOV .KACSR,R1 ;GET CSR ADDRESS 2 MOV .KAPRE,2(R1) ;SET PRESET INTO PRESET REGISTER .IF DF M$$MGEC MOV #.KWIN1+120000-<$KBASE&177700>,R3 ;ASSUME SWEEPING IMMEDIATELY$ .IFF ;M$$MGET, MOV #.KWIN1,R3 ;ASSUME SWEEPING IMM00t9ccccEDIATELY .IFTF ;M$$MGE7 MOV #KA$RIM!KA$ENB,R2 ;ASSUME A/D, NO EXT ST, NO DELAYH( BIT #S$WA$D,S.WFL2(R4);IS THIS THE A/D? BNE 40$ ;IF NE YES=30$: MOV #KA$RIM!KA$MFE!KA$ENB,R2 ;SET REPT INTRVL, MODE FLAG. ;ENABLE, AND CLOCK ENABLEU,40$: BIT #S$WEXT,S.WFLG(R4) ;EXTERNAL START? BEQ 60$ ;IF EQ NO9 BIS #KA$STI!KA$STE,R2 ;YES--SET ST INT ENABLE, ST ENABLED ;COUNTER8 BIC #KA$ENB,R2 ;CLEAR CLOCK ENABLE--ST WILL START CLOCK .IFT ;M$$MGEM6 MOV #.KWIN0+120000-<$KBASE&177700>,R3 ;SET FOR ST ISR .IFF ;M$$MGE MOV #.KWIN0,R3 ;SET FOR ST ISR  .IFTF ;M$$MGE.60$: BIT #S$WDLY,S.WFL2(R4) ;IS THERE A DELAY? BEQ 80$ ;IF EQ NO:% BIS #K$ADLY,.KAFLG ;YES--FLAG DELAY $ BIC #KA$RIM,R2 ;CLEAR REPT INTERVAL% BIS #KA$MFE,R2 ;SET MODE FLAG ENABLE4 .IFT ;M$$MGE?= MOV #.KWIN0+120000-<$KBASE&177700>,R3 ;SET FOR EXT START INEN .IFF ;M$$MGE& MOV #.KWIN0,R3 ;SET FOR EXT START ISR .IFTF ;M$$MGE'70$: MOV .KADLY,2(R1) ;SET DELAY PRESETI*80$: BIS .KARAT,R2 ;SET RATE INTO CSR WORD4 MOV R3,.KWINT+2 ;SET ISR INTO INTERRUPT INSTRUCTION MOV R2,(R1) ;SET CLOCK CSR& BIS #K$ACTV,.KAFLG ;FLAG CLOCK ACTIVE100$: CLC ;FLAG OK120$: RETURN ;=200$: CINT$S R1,#$KBASE,#.KWINT,#.KWEDI,#PR6,#.KWAST ;CONNECT# RETURN  .ENDC ;M$$MGE .DSABL LSBM;?"; ENABLE DISABLE INTERRUPT ROUTINE;, .PSECT .KSCT1*.KWEDI: CLR @.KACSR ;DISABLE CLOCK ALWAYS- MOV @#$TKTCB,.KTKCB ;REMEMBER MY TCB ADDRESS: RETURNL (+ .SBTTL .KWIN? CLOCK "A" INTERRUPT ROUTINESE;+7; .KWIN0 -- CLOCK "A" INTERRUPT ROUTINE FOR ST OR DELAYI;R ; INPUTS:V;,; NONE;C ; OUTPUTS:;#;- .ENABL LSB 6.KWIN0::MOV R3,(SP) ;;;SAVE R3, OVERWRITE R4 ON STACK .IF NDF FT$MOPS MOV (R4),R4 ;;;GET SWB ADDRESS .IFF ;FT$MOP4 MOV .KLQUX,R4 ;;;GET SWB ADDRESS (ONLY 1ST CAN HAVE ;;;DELAY OR EXT START!)C .ENDC ;FT$MOP .IF DF M$$MGE .IFTF ;M$$MGE) MOV .KACSR,R3 ;;;GET CLOCK A CSR ADDRESSS# TST (R3) ;;;CHECK SCHMITT TRIGGERK) BMI 100$ ;;;IF MI SCHMITT TRIGGER FIRED % BIT #K$ADLY,.KAFLG ;;;DOING A DELAY?E BEQ 90$ ;;;NO--ALL DONE & BIC #K$ADLY,.KAFLG ;;;YES--CLEAR FLAG CLR (R3) ;;;DISABLE CLOCK; MOV .KAPRE,2(R3) ;;;SET PRESET& MOV R3,-(SP) ;;;SAVE R3 (CSR ADDRESS) .IFT ;M$$MGE6 MOV S.WSTR(R4),R3 ;;;GET USER MODE ST ROUTINE ADDRESS' ADD $KRLC5,R3 ;;;RELOCATE TO EXEC MODEC" CALL (R3) ;;;CALL THE ST ROUTINEC MOV #.KWIN1+120000-<$KBASE & 177700>,.KWINT+2 ;;;RESET INT ROUTINET .IFF ;M$$MGEC$ CALL @S.WSTR(R4) ;;;CALL ST ROUTINE* MOV #.KWIN1,.KWINT+2 ;;;RESET INT ROUTINE .IFTF ;M$$MGE/ BIC #S$WEXT,S.WFLG(R4) ;;;CLEAR EXT START FLAGS, BIT #S$WNOV,S.WFLG(R4) ;;;NON-CLOCK DRIVEN? BNE 85$ ;;;IF NE YESI10$: MOV #KA$RIM!KA$MFE!KA$ENB,R3 ;;;SET REPT INTRVL AND MODE FLAG ENABLEW1 BIT #S$WA$D,S.WFL2(R4) ;;;IS THIS THE A/D SWEEP?D BEQ 20$ ;;;IF EQ NOT9 MOV #KA$RIM!KA$ENB,R3 ;;;YES--NO CLOCK INTERRUPTS PLEASEI(20$: BIS .KARAT,R3 ;;;INCLUDE CLOCK RATE#40$: MOV R3,@(SP)+ ;;;SET CLOCK CSR60$: MOV (SP)+,R3 ;;;RESTORE R3I 80$: RETURNI)85$: TST (SP)+ ;;;CLEAR CSR OFF OF STACK; BR 60$ ;;;GO EXIT INTERRUPT4;;9; HERE IF NOT SCHMITT TRIGGER OR DELAY...MUST HAVE GOTTENK>; A DIGITAL INPUT START. FIX UP AND GO HANDLE REGULAR SAMPLING ; INTERRUPT.;N90$: ;;;REF LABEL .IFT ;M$$MGEA7 MOV #.KWIN1+120000-<$KBASE&177700>,.KWINT+2 ;;;SET ISRQ .IFF ;M$$MGEM MOV #.KWIN1,.KWINT+2 ;;;SET ISR .IFTF ;M$$MGE( BR KWIN1A ;;;HANDLE SAMPLING INTERRUPT;,; HERE IF ST1 FIREDS;?100$: BIC #KA$STF!KA$STI!KA$STE,(R3) ;;;DISABLE SCHMITT TRIGGER; ;;;AND CLEAR ST FLAG .IF DF N$DR11( CALL .DSDGO ;;;DISABLE DIGO IF ENABLED .ENDC ;N$DR112 BIT #S$WDLY,S.WFL2(R4) ;;;IS THERE A DELAY TO DO?3 BNE 300$ ;;;IF NE YES--WILL GET ANOTHER INTERRUPTF .IFT ;M$$MGE$. MOV S.WSTR(R4),R3 ;;;GET ST USER MODE ADDRESS' ADD $KRLC5,R3 ;;;RELOCATE TO EXEC MODE# CALL (R3) ;;;CALL ST ROUTINEC MOV #.KWIN1+120000-<$KBASE & 177700>,.KWINT+2 ;;;RESET INT ROUTINEI .IFF ;M$$MGE% CALL @S.WSTR(R4) ;;;CALL STR ROUT00_tt tfDATAINEI* MOV #.KWIN1,.KWINT+2 ;;;RESET INT ROUTINE .ENDC ;M$$MGE/ BIC #S$WEXT,S.WFLG(R4) ;;;CLEAR EXT START FLAGD BR 300$ ;;;GO FINISH UP# D;+5; .KWIN1 -- CLOCK "A" INTERRUPT FOR SYNCHRONOUS SWEEPN;E ; INPUTS: ;T; R4 POINTS TO .KASWX ;$ ; OUTPUTS:;W<; ALL ACTIONS NECESSARY FOR CLOCK DRIVEN SWEEP ARE PERFORMED;E;-6.KWIN1::MOV R3,(SP) ;;;SAVE R3--OVERWRITE R4 ON STACK .IF NDF FT$MOP7' MOV (R4),R4 ;;;GET ACTIVE SWB ADDRESS  .IFTF ;FT$MOP4KWIN1A: BIC #KA$MDF,@.KACSR ;;;CLEAR CLOCK MODE FLAG .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE .IFF ;FT$MOPD% CLR -(SP) ;;;CLEAR FORK NEEDED FLAGK .IF DF M$$MGE1 MOV #<.KLQUX-S.WCLX>+120000-<$KBASE & 177700>,R4 .IFF ;M$$MGEA* MOV #<.KLQUX-S.WCLX>,R4 ;;;POINT TO QUEUE .ENDC ;M$$MGE+210$: MOV S.WCLX(R4),R4 ;;;LINK TO NEXT SWB3 BEQ 215$ ;;;IF EQ ALL DONE2 MOV S.WFL2(R4),R3 ;;;GET FLAGS AND SEE IF ACTIVE? BPL 210$ ;;;IF PL NOT ACTIVE' TSTB R3 ;;;ACTIVE--IS THIS A/D SWEEP?;& BMI 210$ ;;;IF MI YES--DO NOT BOTHER1 CALL @S.WSCR(R4) ;;;YES--CALL SYNC CLOCK ROUTINEM BCC 210$ ;;;IF CC CONTINUE' BIS #S$WAST,S.WFLG(R4) ;;;SET AST FLAGD" INC (SP) ;;;SET FORK NEEDED FLAG BR 210$ ;;;CONTINUER!215$: TST (SP)+ ;;;NEED TO FORK?U BEQ 240$ ;;;IF EQ NO .IFT ;FT$MOP;3 CALL @S.WSCR(R4) ;;;CALL SYNCHRONOUS CLOCK ROUTINE BCC 240$ ;;;IF CC OK* BIT #S$WSTP,S.WFL2(R4) ;;;STOP THE SWEEP? BEQ 220$ ;;;IF EQ NO$ CLR @.KACSR ;;;YES--STOP THE CLOCK .ENDC ;FT$MOP220$: ;;;REF LABELM .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6  .ENDC ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3S .IF NDF FT$MOP 4 CALLR .KEFQI ;;;FORK SET EFN OR QUEUE AST AND EXIT .IFF ;FT$MOPU .IF DF M$$MGE1 MOV #<.KLQUX-S.WCLX>+120000-<$KBASE & 177700>,R4 .IFF ;M$$MGE * MOV #<.KLQUX-S.WCLX>,R4 ;;;POINT TO QUEUE .ENDC ;M$$MGE4 MOV .KUCNT,-(SP) ;;;SET CLOCK USER COUNT ONTO STACK;09; RUN THROUGH CLOCK QUEUE TO SEE IF WE NEED TO STOP CLOCKN;;+225$: MOV S.WCLX(R4),R4 ;;;LINK TO NEXT SWB$ BEQ 227$ ;;;IF EQ ALL DONE# TST S.WFL2(R4) ;;;IS SWEEP ACTIVE?M BMI 225$ ;;;IF MI YESS DEC (SP) ;;;NO--DEC USE COUNTE BR 225$ ;;;CONTINUE SCANNING#227$: TST (SP)+ ;;;ANY USERS LEFT?D BGT 230$ ;;;IF GT YES-# CLR @.KACSR ;;;NO--STOP THE CLOCK:230$: CALLR .KWEFQ ;;;FORK, SET EFN OR QUEUE AST AND EXIT .ENDC ;FT$MOP240$:V .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6U .ENDC ;M$$MGE 300$: MOV (SP)+,R3 ;;;RESTORE R3 320$: RETURN .DSABL LSB  .ENDO NEXT SWB$ BEQ 227$ ;;;IF EQ ALL DONE# TST S.WFL2(R4) ;;;IS SWEEP ACTIVE?M BMI 225$ ;;;IF MI YESS DEC (SP) ;;;NO--DEC USE COUNTE BR 225$ ;;;CONTINUE SCANNING#227$: TST (SP)+ ;;;ANY USERS LEFT?D BGT 230$ ;;;IF GT YES-# CLR @.KACSR ;;;NO--STOP THE CLOCK:230$: CALLR .KWEFQ ;;;FORK, SET EFN OR QUEUE AST AND EXIT .ENDC ;FT$MOP240$:V .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6U .ENDC ;M$$MGE 300$: MOV (SP)+,R3 ;;;RESTORE R3 320$: RE& .TITLE KLQSUB CLOCK QUEUE SUBROUTINES .IDENT /M01.01/;A; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.S;N>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION M01.01; B. SCHREIBER 15-NOV-77;E; MODIFIED BY:;U ; MSH017 M. HARVEY OCT. 12, 1978*; CORRECT CONDITION009ccccALIZATION FOR NO CLOCK;A9; THIS MODULE CONTAINS ROUTINES TO MODIFY THE CLOCK QUEUE ;D; SYSTEM MACRO CALLS;O .MCALL KSWDF$ KSWDF$C O- .SBTTL .KLQIN INSERT SWEEPS INTO CLOCK QUEUEN;+); .KLQIN -- INSERT SWEEP INTO CLOCK QUEUEO;R8; THIS ROUTINE SETS UP A SWEEP TO BE IN THE CLOCK QUEUE.;L ; INPUTS:S; ; R4 POINTS TO SWB ; R3 FREE ;N ; OUTPUTS:;D5; [NOT MULTIPLE SWEEPS] .KASWB AND .KASWX ARE SET UP.E8; [MULTIPLE SWEEPS] SWB IS ENTERED INTO CLOCK QUEUE.,; [BOTH] ACTIVE FLAG IS SET FOR CLOCK;H;-.KLQIN:: ;REF LABELO .IF NDF FT$MOPU MOV #.KASWX,R3 ;POINT TO KASWX* MOV R4,(R3)+ ;SET SWB ADDRESS INTO .KASWX* MOV R4,(R3) ;SET SWB ADDRESS INTO .KASWB .IF DF M$$MGE* ADD $KRLC5,-(R3) ;RELOCATE .KASWX TO APR5 .ENDC ;M$$MGE .IFF ;FT$MOPU MTPS #PR6 ;LOCK OUT INTERRUPTS: MOV .KLQUU,S.WCLQ(R4) ;;;LINK NEW ACTIVE SWEEP INTO QUEUE MOV R4,.KLQUU ;;; .IF DF M$$MGE MOV R4,R3 ;;;COPY PTRS" ADD $KRLC5,R3 ;;;RELOCATE TO APR54 MOV .KLQUX,S.WCLX(R4) ;;;LINK INTO EXEC LEVEL QUEUE MOV R3,.KLQUX ;;;...F .ENDC ;M$$MGE( INC .KUCNT ;;;COUNT ANOTHER CLOCK USER MTPS #0 ;;;ALLOW INTERRUPTS .ENDC ;FT$MOP RETURN ;SWEEP IS IN THE QUEUE M, .SBTTL .KLQRM REMOVE SWEEP FROM CLOCK QUEUE;+); .KLQRM -- REMOVE SWEEP FROM CLOCK QUEUEP; ; INPUTS:N;R.; CALLED AT USER LEVEL WITH R4 POINTING TO SWB;E ; OUTPUTS:;M; SWB IS REMOVED FROM QUEUE$;E;-.KLQRM:: ;REF LABEL .IF NDF FT$MOPE CLR .KASWB ;CLEAR SWB ADDRESSR CLR .KASWX ;...C .IFF ;FT$MOPV MOV R3,-(SP) ;SAVE R3 MOV R2,-(SP) ;AND R2N" MTPS #PR6 ;;;LOCK OUT INTERRUPTS( MOV #.KLQUU-S.WCLQ,R3 ;;;POINT TO QUEUE/20$: MOV R3,R2 ;;;REMEMBER FROM WHENCE WE CAMET+ MOV S.WCLQ(R3),R3 ;;;LINK TO NEXT IN QUEUE. BEQ 40$ ;;;IF EQ MUST NOT HAVE BEEN IN QUEUE% CMP R4,R3 ;;;IS THIS THE RIGHT ONE?W BNE 20$ ;;;IF NE NO4 MOV S.WCLQ(R3),S.WCLQ(R2) ;;;YES--UNLINK FROM QUEUE .IF DF M$$MGE1 MOV S.WCLX(R3),S.WCLX(R2) ;;;AND FROM EXEC QUEUE  .ENDC ;M$$MGE" DEC .KUCNT ;;;DECREASE USE COUNT% BGT 40$ ;;;IF GT CLOCK STILL ACTIVED .IFTF ;FT$MOP .IF DF K$$W11- BIC #K$ACTV,.KAFLG ;;;CLOCK NO LONGER ACTIVE0 .ENDC ;K$$W11M .IFF ;FT$MOP !40$: MTPS #0 ;;;ALLOW INTERRUPTST MOV (SP)+,R2 ;RESTORE REGISTERS MOV (SP)+,R3 ;... .ENDC ;FT$MOP RETURN  .ENDRIGHT ONE?W BNE 20$ ;;;IF NE NO4 MOV S.WCLQ(R3),S.WCLQ(R2) ;;;YES--UNLINK FROM QUEUE .IF DF M$$MGE1 MOV S.WCLX(R3),S.WCLX(R2) ;;;AND FROM EXEC QUEU$ .TITLE KPAA PUSH ARGUMENT ADDRESSES .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 23-JUN-77;E5; SUBROUTINE TO PUSH FORTRAN ARGUMENT LIST ONTO STACK  ;+@; .K.PAA -- SUBROUTINE TO PUSH ARGUMENT ADDRESSES ONTO THE STACK;E; CALLING SEQUENCE: ; CALL .K.PAAC; .WORD MAXARG; .WORD BITMAP0; (BIT0 FOR LAST ARG, BIT1 FOR NEXT TO LAST...);D ; INPUTS: ;C&; R5 ADDRESS OF ARGUMENT ADDRESS TABLE$; MAXARG MAXIMUM NUMBER OF ARGUMENTS1; BITMAP BIT MAP WITH ONES FOR REQUIRED ARGUMENTSS; ; OUTPUTS:; #; C-CLEAR ARGUMENTS SET UP ON STACKC9; STACK SETUP WITH ADDRESSES OR 0 FOR DEFAULTED ARGUMENTSU2; R5 HOLDS OLD SP FOR ERROR RECOVERY (CLEAN STACK);8; C-SET REQUIR00_tt tfDATAED ARG NOT PRESENT, ILLEGAL NUMBER OF ARGS; STACK IS CLEARN$; R5 STILL POINTING TO ARGUMENT LIST;A; REGISTERS ALTERED:;I; R4,R3,R2,R1,R0; ;-+.K.PAA::MOV (SP)+,R3 ;GET ADDRESS OF RETURNE) MOV SP,R4 ;PRESERVE SP IN CASE OF ERRORM$ MOV (R3)+,R2 ;R2=MAX # OF ARGUMENTS0 MOV (R3)+,R1 ;R1=BIT MAP OF MANDATORY ARGUMENTS ;R3=RETURN ADDRESS. MOVB (R5),R0 ;GET ACTUAL NUMBER OF ARGUMENTS4 SUB R0,R2 ;PUSH A ZERO FOR EACH ARGUMENT NOT GIVEN) BMI 160$ ;IF MI THEN TOO MANY ARGUMENTS ' BEQ 40$ ;IF EQ ALL ARGUMENTS SUPPLIEDO20$: ROR R1 ;SEE IF MANDATORY BCS 160$ ;IF CS YES--ERROR( CLR -(SP) ;NO--SET A ZERO ON THE STACK& DEC R2 ;DO ALL UNSPECIFIED ARGUMENTS BNE 20$ ;WAIT FOR R2=0;V5; NOW SEE IF ANY MORE ARGS TO PROCESS (GIVEN IN CALL)R;A140$: MOV R0,R2 ;PICK UP COUNT OF ARGS LEFT TO DOA BEQ 120$ ;IF EQ ALL DONE. INC R2 ;ELSE SET R2 TO ADR OF WORD FOLLOWING ; ADDRESS LIST ASL R2 ;SET R2=2*(R0+1)+R5- ADD R5,R2 ;NOW R2 POINTS JUST PAST LAST ARG ;U>; PUSH GIV .TITLE TTYL .IDENT /05.01/U;T6; COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;P<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;;N; 27-JAN-78 PETER WANNHEDEN;;I; PREVIOUSLY MODIFIED BY:N;; P. WANNHEDEN ; C. F. SPITZT; D. R. DONCHINS ; T. LEKAS;D; MODIFICATIONS:;;; D. R. DONCHIN 15-JUN-84 05.01@; DD187 -- IMPROVE MODEM HANDLING TO MEET EUROPEAN REQUIREMENTS;;.;+*; CONTROLLER-DEPENDENT ROUTINES FOR DL-11.;-;B;I A> .IIF DF R$$PRO .IIF NDF D$$C11 .ERROR ;R$$PRO REQUIRES D$$C11 .IF DF D$$L11 R L .IF DF R$$MPL S .MCALL KRBDF$ Y KRBDF$ ;DEFINE KRB SYMBOLSF C .ENDC ;R$$MPL  .MCALL HWDDF$,UCBDF$E" HWDDF$ ;DEFINE HARDWARE SYMBOLS UCBDF$ ;DEFINE UCB SYMBOLSP .PSECT MAP5;I;; EQUATED SYMBOLSO;I; DL-11 REGISTER DEFINITIONS;JRCSR = 0 ;RECEIVER STATUS REG. $RBUF = 2 ;RECEIVER DATA BUFFER REG."XCSR = 4 ;TRANSMITTER STATUS REG.'XBUF = 6 ;TRANSMITTER DATA BUFFER REG.A;2; PROFESSIONAL 300 SERIES PRINTER PORT DEFINITIONS; .PDBUF = 173400 ;RECEIVER DATA BUFFER REGISTERPSTS = 173402 ;STATUS REGISTER PMODE = 173404 ;MODE REGISTER!PCMND = 173406 ;COMMAND REGISTERF;:; PROFESSIONAL 300 SERIES INTERRUPT CONTROLLER DEFINITIONS;L4ICCSR = 173202 ;INTERRUPT CONTROLLER 0 CSR REGISTER5PRINTR = 5 ;PRINTER RECEIVER INTERRUPT REQUEST LEVELT8PXINTR = 6 ;PRINTER TRANSMITTER INTERRUPT REQUEST LEVEL*CLSIMR = 50 ;CLEAR SINGLE IMR BIT COMMAND)STSIRR = 130 ;SET SINGLE IRR BIT COMMAND3;S;E;+; YLRESX - RESUME OUTPUT.;U; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 0 ;-; ;D6YLRESX::BIS #100,XCSR(R3) ;;;SET XMIT INTERRUPT ENABLE .IF DF R$$PRO;ND; FOR THE PROFESSIONAL 300 SERIES MACHINES BOTH METHODS OF EFFECTINGE; THE INTERRUPT ENABLE BITS ARE LEFT IN PLACE SO THAT THE SYSTEM WILLEC; WORK ON BOTH THE REAL HARDWARE AND THE BRIDGE SYSTEM. THE BRIDGE=D; SYSTEM CONSISTS OF AN 11/23-PLUS SYSTEM WITH AN INTERFACE ON IT TO; THE CTI BUS.;+A; ON THE REAL HARDWARE THE BIS #100... IS IGNORED. ON THE BRIDGEAF; SYSTEM THE FOLLOWING TWO INSTRUCTIONS ARE IGNORED BECAUSE THEY WRITE; INTO THE BOOT ROMS;X6 MOV #CLSIMR!PXINTR,ICCSR ;;;SET XMIT INTERRUPT ENABLE ;;;FOR PRINTER PORTB MOV #STSIRR!PXINTR,ICCSR ;;;CAUSE ANY PENDING INTERRUPTS TO OCCUR .ENDC ;R$$PRO;M;L;+; YLABOX - ABORT OUTPUT.;A; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.TOC 0 ; U.TTOC 0C;N!; YLSTOX - STOP (SUSPEND) OUTPUT.E;A; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 1S;-;N;RYLABOX::YLSTOX:: W .IF NDF D$$LMDB YLMTIM:: M .ENDC ;D$$LMD C RETURN ;;; ;E;P;+; YLPWUP - POWER-UP.;N; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0X ; US.DSB 0U;-;;N .ENABL LSBT .009ccccIF DF R$$CONYLCONL::6YLCPUP::SEC ;SET CARRY BIT FOR CONTROLLER OPERATIONSYLUONL::YLUPUP:: .IFFTYLPWUP:: .ENDC ;R$$CON MOVB RBUF(R3),R0 ;EMPTY RBUFE N .IF DF D$$LMD S4 BIS #140,@R3 ;ENABLE DATASET AND RECEIVE INTERRUPTS B .IFF ;D$$LMD ( BIS #100,@R3 ;ENABLE RECEIVE INTERRUPTS .IF DF R$$PRO6 MOV #CLSIMR!PRINTR,ICCSR ;;;ENABLE RECEIVE INTERRUPTS ;;;FOR PRINTER PORT .ENDC ;R$$PRO RETURN ;RETURN  .IFT ;D$$LMD- 6 BCS 10$ ;RETURN IF PERFORMING A CONTROLLER OPERATION+ BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?O BEQ 10$ ;N - RETURN< BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIER FLAG;Y;U;+; YLMTIM - MODEM TIMER.B;#; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-;0;R(YLMTIM::CALL LOCKI ;LOCK OUT INTERRUPTS0 CALL HLMTIM ;;;CALL COMMON MODEM TIMER ROUTINE& BEQ 5$ ;;;IF EQ Z-BIT SET - DROP DTR# BISB #6,@R3 ;;;ASSERT DTR AND RTST RETURN ;;; 65$: BICB #17,@R3 ;;;CLEAR DTR, RTS, READER ENABLE AND ;;;SECONDARY XMITR/10$: RETURN ;;;RETURN TO COROUTINE THAT HANGS- ;;;UP LINE IF NECESSARY- S .IFTF ;D$$LMD  .IF DF R$$CONYLCOFF::YLUOFF:: CLR @R3 ;DISABLE THE WORLD8 .IIF DF R$$PRO .ERROR ;R$$CON SHOULD NOT BE DEFINED FOR ;PRO 300 SERIES MACHINES RETURN  .ENDC ;R$$CON;L;M;+"; INPUT INTERRUPT SERVICE ROUTINE.;-;;;F  .IF DF R$$MPL R$YLINP::& TTSET$ YL ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS$ MOV K.OWN(R4),R5 ;;;GET UCB ADDRESS R .IFF ;R$$MPLO R$DLINP:: .IF EQ D$$L11-1& CLR R4 ;;;SET UP DL CONTROLLER INDEX .ENDC$ TTSET$ DL ;;;SAVE R2,R3 AND SET UP ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST S MOV (R4),R5 ;;;GET UCB ADDRESS 0 .ENDC ;R$$MPL R" ADD #U.TSTA,R5 ;;;POINT TO U.TSTA .IFT ;D$$LMDP E% MOV @R3,R2 ;;;SAVE INTERRUPT STATUS ( BPL 20$ ;;;NO DATASET INTERRUPT - JUMP MOV R2,R4 ;;;GET A COPY;" ASL R4 ;;;GET RING BIT IN BIT 15 SWAB R4 ;;;GET IT IN BIT 74 MOV R2,-(SP) ;;;SAVE R2 DESTROYED BY MODISR ROUTINE& CALL MODISR ;;;CALL COMMON MODEM ISR, BVC 16$ ;;;NO SPECIAL ACTION NEEDED - JUMP BCS 15$ ;;;DROP DTR - JUMP# BISB #6,@R3 ;;;ENABLE DTR AND RTSC4 BR 16$ ;;;AND LOOK IF FURTHER PROCESSING IS NEEDED&15$: BICB #6,@R3 ;;;CLEAR DTR AND RTS16$: MOV (SP)+,R2 ;;;RESTORE R2E$20$: TSTB R2 ;;;RECEIVER INTERRUPT? BPL 10$ ;;;N - EXITA  .ENDC ;D$$LMD M .IF DF R$$PRO ASSUME H2.BRG,100000 - TST $HFMSK+2 ;;;IS THIS A PRO BRIDGE SYSTEM?7 BMI 30$ ;;;IF NE YES' MOV PDBUF,R2 ;;;GET RECEIVED CHARACTERI BR 40$ ;;;AND CONTINUE .IFTF ;R$$PRO.30$: MOV RBUF(R3),R2 ;;;GET RECEIVED CHARACTER .IFT ;R$$PRO 40$: ;;;REFERENCE LABEL .ENDC ;R$$PRO+ CALLR ICHAR1 ;;;DO COMMON INPUT CHARACTER  ;;;PROCESSING AND RETURN;: .DSABL LSB ;R;O;+"; OUTPUT INTERRUPT SERVICE ROUTINE;-;B;1  .IF DF R$$MPL .$YLOUT::& TTSET$ YL ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS$ MOV K.OWN(R4),R5 ;;;GET UCB ADDRESS .IFF ;R$$MPL  R$DLOUT:: .IF EQ D$$L11-1& CLR R4 ;;;SET UP DL CONTROLLER INDEX .ENDC$ TTSET$ DL ;;;SAVE R2,R3 AND SET UP ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST I MOV (R4),R5 ;;;GET UCB ADDRESS  .ENDC ;R$$MPL N" ADD #U.TSTA,R5 ;;;POINT TO U.TSTA;;U;+; YLSTAX - START OUTPUT.;-; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.TOP+2 BUFFER POINTERC; U.TOC BYTE COUNT4;-;A;E6YLSTAX::MOV #100,R2 ;;;GET BITMASK FOR XMIT INTERRUPT) BIS R2,XCSR(R3) ;;;ENABLE XMIT INTERRUPTC .IF DF R$$PROC MOV #CLSIMR!PXINTR,ICCSR ;;;ENABLE XMIT INTERRUPT FOR PRINTER PORT  .ENDC ;R$$PRO7 CALLR OUTISR ;;;DO COMMON OUTPUT INTERRUPT PROCESSINGB D .ENDC ;D$$L11 $;L;N .END#U.TSTA,R5 ;;;POINT TO U.TSTA;;U;+; YLSTAX - START OUTPUT.;-; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.TOP+2 BUFFER POINTERC00_tt tfDATA  .TITLE XEDRV - QIO UNA driver .IDENT /02.01/M  .ENABL LC;T; COPYRIGHT (C) 1985S1; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.S;T@ ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A@ ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE@ ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR@ ; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE@ ; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH@; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE@; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.N;PA; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTRA; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITALB; EQUIPMENT CORPORATION.;N@; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF;; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.;E; MODULE DESCRIPTION;N:; UNA QIO Driver. This driver attempts to simulate theC; the DECnet Direct Line Access (DLX) functionality for the UNA.E;L;L+; DISTIBUTED SYSTEMS SOFTWARE ENGINEERING  ;M1 ; MODIFIED FOR RSX-11M-PLUS V3.0 UPDATE B BY:R ;  ;E ; A. Kojnok 06-Aug-85 DF ; Added line of code to INIXM routine to load R5 with Port # ; Status Table address.  ;E ; A. Kojnok 12-Aug-85TE ; Corrected the CHKERR subroutine. The poll flag was set RF ; and cleared incorrectly. Removed clearing the CS.POL A ; flag bit from PDMDON interrupt service entry routine and A ; put it in FNINI routine. ;S ; A. Kojnok 20-Aug-85MF ; Added test to INIXM routine to see if a transmission is H ; already in progress. If yes, wait for transmit interrupt ( ; to initiate next transmit. ;d ; A. Kojnok 22-Oct-85jN ; New code was added to the XMTINT routine to replace the call to O ; GTPST subroutine. The code was added to test for the case where M ; the port was close before the xmit has been completed. In suchtL ; a case the Port Status Table addr saved in the task header is 6 ; zero and will cuase the driver to crash. ;l ; A. Kojnok 22-Oct-85 M ; The time out value for the reset function in CTINI routine has M ; been changed to the time out value used for self test. This iseK ; due because the DELUA for the reset tests if a self test has A ; already been run. If not, a self test is executed.r ;  ; L. Kogan 15-Nov-85 2.01t9 ; LK705 -- Added Adam Kojnok's changes to RSX packst ;sA;dBC >D .SBTTL ****************************************************>E .SBTTL * UNA Driver Data Structures And Offset Definitions*>F .SBTTL ****************************************************GH.IF NDF L$LISTI .IIF NDF L$$IST,.NLISTiJ .IIF NDF L$$IST,.DSABL CRFhK.ENDCoLM .SBTTL Register ConventionsN;2O; **********************************************2P; * Register Conventions used by this driver *2Q; **********************************************R;kS;6T; R5 = Almost always points to the Port State Table<U; R4 = Almost always points to the Controller State TableV; R3 = I/O packetW; R2 = Work register*;X; R1 = Ring routines use it to return ring entry address$Y; R0 = Work register.Z;i[\ ] .SBTTL Local Macros^;D_; INTERNAL MACRO DEFINITIONS`;sa.MACRO .DSECT START,CREFb.IIF B , .DSABL CRF*c.IIF DF L$$IST, .DSABL CRFd.ASECTe. = 0 f.IIF DF L$$IST, .ENABL CRFg.IIF B , .ENABL CRFkh.IF NB i. = START j.ENDC k.ENDM .DSECTlm.MACRO .BSECT START,CREFn.IIF B , .DSABL CRFTo.IIF DF L$$IST, .DSABL CRFp.ASECTq. = 1er.IF IDN , s. = 400 t.ENDCnu.IIF DF L$$IST, .ENABL CRFv.IIF B , .ENABL CRFw.ENDM .BSECTxy.MACRO .ASSUME ARG1,COND,ARG2Nz.IF COND -{.IFF |.ERROR ARG1 ;"COND ARG2" fails}.ENDCF~.ENDM .ASSUMEL.MACRO APR5PC SUBNAMPC$$$$=.-IMPUR.IF GT 20000-PC$$$$F.IFF9.ERROR ; Subroutine "SUBNAM" out of APR5 address spaceD.ENDC.ENDM APR5PC .MACRO $QPKT,QUEUE, JSR R0,QPAKTI .WORD QUEUEA .ENDM $QPKT .MACRO $DQPKT,QUEUE JSR R0,DQPAK0 .WORD QUEUEI .ENDM $DQPKTA  .SBTTL UNA conditionals;D; UNA conditionals;U6KISAR5 = 172352 ; Kernel instruction PAR 5 address6KISAR6 = 172354 ; Kernel instruction PAR 6 address/KDSAR5 = 172372 ; Kernel data PAR 5 addressI/KDSAR6 = 172374 ; Kernel data PAR 6 addresse= .IIF NDF U$$NCT .ERROR ; Number of controllers not definedF .IIF NDF U$$NPC .ERROR ; Number of ports per controller not defined9 .IIF NDF U$$NRS .ERROR ; Receive ring size not defined : .IIF NDF U$$NTS .ERROR ; Transmit ring size not defined; .ASSUME U$$NCT GE 1 ; Number of controllers must be GE 1l@ .ASSUME U$$NPC GE 1 ; Number of ports/controller must be GE 17 .ASSUME U$$NRS GE 1 ; Receive ring size must be GE 1A8 .ASSUME U$$NTS GE 1 ; Transmit ring size must be GE 1  .SBTTL System macros , .MCALL PKTDF$,UCBDF$,DLXDF$,CHRDF$,EPMDF$% .MCALL TCBDF$,SCBDF$,PCBDF$,HDRDF$t .IF DF R$$MPL ; If RSX-11M+ .MCALL KRBDF$,CTBDF$o' CTBDF$ ; Controller Table Offsetsm! KRBDF$ ; Define KRB offsetsS .ENDC( PKTDF$ ; Define I/O packet offsets! UCBDF$ ; Define UCB offsetss! DLXDF$ ; Define DLX offsetsE' CHRDF$ ; Define other DLX offsetsG, EPMDF$ ; Ethernet protocol module defs! TCBDF$ ; Define TCB offsetsT( SCBDF$ ,,SYSDEF ; Define SCB offsets! PCBDF$ ; Define PCB offsets ) HDRDF$ ; Define Task Header offsets  ; .SBTTL Controller State Table;-J; Controller state table offsets. The controller state table resides atF; the beginning of the driver for APR5 mapping reasons. Some of theM; controller state table buffers reside in the permanently mapped with UMRs;I; region at the end of the driver. Each of these buffers have pointers; to them in the table.s;+ .DSECT,#C.FLAG: .BLKW 1 ; UNA flags byteF1 ; UNA software flag bits (used in C.FLAG)a- CS.PWF = 2 ; Power fail processing flagl1 CS.SER = 10 ; Status error encounterede) CS.INT = 40 ; Interrupt pendinge6 CS.ENP = 100 ; Receive end packet encountered1 CS.POL = 200 ; UNA poll function neededf' CS.GST = 400 ; Get status nexth= CS.INI = 1000 ; Controller initialization in progressf& CS.STP = 2000 ; Device stopped+ CS.OFL = 100000 ; Controller offline;2C.OPRT: .BLKW 1 ; Count of number of ports open(C.PORT: .BLKW 1 ; Port list ROOT word,C.PROL: .BLKW 2 ; Protocol list root word3C.PCBP: .BLKW 1 ; UNA Port Control Block pointere2C.UDBP: .BLKW 1 ; UNA Unibus Data Block pointer9C.INIW: .BLKW 1 ; Controller init completed wait queuei-C.RTRY: .BLKW 1 ; Initialize retry countern%C.INDX: .BLKW 1 ; Controller indexr;zJ; These pointers are used by the diagnostic non-DLX function processors.;;-C.KIR6: .BLKW 1 ; Non-DLX KISAR6 save area;.C.DGBP: .BLKW 1 ; Diagnostic buffer pointer2C.DGBE: .BLKW 1 ; Diagnostic buffer end pointer7C.DGBS: .BLKW 1 ; Start address of diagnostic buffer ;n?; These pointers are used by the function processing routinesW;K8C.CFNC: .BLKW 1 ; Address of I/O packet for which the/ ; ... current function is being performedKAC.FUNS: .BLKW 1 ; Current primary/secondary function save areat3C.PFNC: .BLKW 1 ; Pending control function queue.+C.CTMR: .BLKW 1 ; Control function timer;B-; RECEIVE PROCESSING POINTERS AND WORK AREAB; *C.RCVB: .BLKW 1 ; RCV ring base address/C.RCVF: .BLKW 1 ; RCV ring next free address3C.RCVC: .BLKW 1 ; RCV ring current entry addressr(C.RSEQ: .BLKW 1 ; RCV sequence number00_tt tfDATA#C.RCVW: .BLKW 1 ; RCV wait queue+C.RCVD: .BLKW 1 ; RCV pending completione,C.RBFL: .BLKW 1 ; RCV receive buffer list5C.RML: .BLKW 1 ; RCV received message lengthc0C.POVH: .BLKW 1 ; RCV protocol overhead9C.STRT: .BLKW 1 ; RCV Start buffer addr of current rcvR;K/; TRANSMIT PROCESSING POINTERS AND WORK AREASa;s*C.XMTB: .BLKW 1 ; XMT ring base address5C.XMTF: .BLKW 1 ; XMT ring next free entry addressr3C.XMTC: .BLKW 1 ; XMT ring current entry address4C.XSEQ: .BLKW 1 ; XMT ring entry sequence numbersC.XMTT: .BLKW 1 ; XMT timer3 C.XMWQ: .BLKW 1 ; XMT FIFO I/O packet wait queue11 C.XMTP: .BLKW 1 ; XMT pending completion queueB > C.XHDR: .BLKW 1 ; XMT dest-source-protocol-byte.count+  ; buffers list (Transmit Headers)R;T!; CONTROLLER INTERNAL SAVE AREAa;s* ; Controller internal info save area3C.LOAD: .BLKW 1 ; Work area during load + C.PADDs1C.PADD: .BLKW 3 ; Node address (SEE C.LOAD!!!)r-C.MODE: .BLKW 1 ; UNA default MODE (14001)n. ; UNA will pad short transmit messages% ; Enable H4000 collision testt! ; Enable Half Duplex modeX'C.MCDV: .BLKW 1 ; Micro code versionR4C.MLT: .BLKW 1 ; # of multicast addresses enabled.C.PSTA: ; Last read port status save area.C.RREV: .BLKW 1 ; Microcode revision number/C.MMAX: .BLKW 1 ; Max number of mulicast IDs 5C.MXCT: .BLKW 1 ; Max length of counter data blockB& C.WRKP: .BLKW 1 ; Work area pointer! " .IF DF R$$MPL ; If RSX-11M+#2$C.CTB: .BLKW 1 ; CTB - Controller Table for KRB2%C.KRB: .BLKW 1 ; KRB - Controller Request Block&' .ENDC(,)C.UCB: .BLKW 1 ; UCB - Unit Control Block.*C.SCB: .BLKW 1 ; SCB - Status Control Block6+C.DCB: .BLKW 1 ; DCB - Device Control Block Address+,C.CSR: .BLKW 1 ; CSR for this controllerb&-C.LOG: .BLKW 10. ; Error log packet+.C.LEN =. ; Controller DState Table size /0 r"1 .SBTTL Port State Table Offsets2;r3; Port State Table Offsets4;L 5 .DSECT-(6P.NXTP: .BLKW 1 ; Next port link word#7P.FLAG: .BLKW 1 ; Port flag word %8 PS.OPN = 1 ; Port open flag bit>9 PS.DER = 2 ; Delayed error - Dropped a received message8: PS.XIN = 4 ; Line requires init function (IO.XIN)"; PS.ADR = 10 ; Address found#< PS.PRO = 20 ; Protocol foundc+= PS.MLC = 40 ; Multicast list changeda'>P.PTCB: .BLKW 1 ; Owning TCB addressb?P.LUN: .BLKW 1 ; Owning LUN'@P.MCST: .BLKW 2 ; Multicast listheadaA;bKB; Used by Auxilliary buffer processor to save addr info for driver duringLC; transmit processing.D;<EP.XDAD: .BLKW 3 ; Holds Ethernet address for transmission=FP.XPRO: .BLKW 1 ; Holds Ethernet protocol for transmissioniG;qKH; Used by Auxilliary buffer processor to save addr info for driver during=I; receive processing.J;.@KP.RDAD: .BLKW 3 ; Holds Ethernet destination addr for receive@LP.RSAD: .BLKW 3 ; Holds Ethernet destination addr for receive8MP.RPRO: .BLKW 1 ; Holds Ethernet protocol for receiveN'OP.RCVT: .BLKW 1 ; Receive timer saven3PP.CTBL: .BLKW 1 ; Controller state table pointer &QP.WORK: .BLKW 4 ; General work area'RP.LENG: ; Port data structure sizerST U .SBTTL Protocol entry offsetsV;i W; Define protocol list entriesX;f Y .DSECTrZPL.LNK: .BLKW 1 ; Link word#[PL.FLG: .BLKB 1 ; Protocol flagsE/\ LF.EXC = LF$EXC ; Exclusive access protocolB*] LF.DEF = LF$DEF ; Default user defined/^ LF.PAD = LF$PAD ; Protocol requires paddingt_PL.USE: .BLKB 1 ; Use count`PL.PRO: .BLKW 1 ; Protocol&aPL.DEF: ; Pointer to default port.bPL.EXC: .BLKW 1 ; Pointer to exclusive port+cPL.ADD: .BLKW 2 ; Address chain listheadr,dPL.LEN: ; Length of protocol list entryef%g .SBTTL Address chain entry offsets.h;ri; Address chain entries j; k .DSECTBlAD.LNK: .BLKW 1 ; Link word%mAD.ADD: .BLKW 3 ; Ethernet addresso+nAD.PRT: .BLKW 1 ; Address of owning portd)oAD.LEN: ; Addre00ƒ9ccccss chain entry lengthapq'r .SBTTL Multicast address chain entry st;;#u; Multicast address chain entries v;l w .DSECTL!xML.LNK: .BLKW 1 ; Link pointerv&yML.ADD: .BLKW 3 ; Multicast address3zML.LEN: ; Multicast address chain entry lengthe{|,} .SBTTL UNA hardware interface definitions~;2; UNA CSR/Data Structure Offsets and Definitions;B; CSR offsetsd;D  .DSECT PCSR0: .BLKW ; Primary CSR*PCSR1: .BLKW ; State and self-test CSR%PCSR2: .BLKW ; Buffer address CSR0PCSR3: .BLKW ; Buffer address (extended) CSR;;; PCSR0 bit definitionsi;r,R0.SEI = 100000 ; Status Error Interrupt-R0.CEI = 40000 ; Command Error Interruptd,R0.RXI = 20000 ; Receive Ring Interrupt-R0.TXI = 10000 ; Transmit Ring Interruptt/R0.CSI = 4000 ; Command Success Interruptu:R0.RUI = 2000 ; Receive Buffer Unavailable InterruptR0.RSV = 1000 ; RESERVED+R0.FEI = 400 ; Fatal Error Interrupte+R0.INT = 200 ; Interrupt Summary Bit*R0.IE = 100 ; Interrupt Enable Bit#R0.RST = 40 ; UNA Reset Bitn,R0.RMT = 20 ; UNA Remote Console Bit&R0.PCM = 17 ; UNA Command Bits; #; UNA primary command definitionse;iCM.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/ReceiveECM.BOO = 5 ; Boot Command !CM.PDM = 10 ; Polling Demand "CM.TMO = 11 ; Sanity Timer On#CM.TMF = 12 ; Sanity Timer Off%CM.TMR = 13 ; Sanity Timer Reset0%CM.STP = 17 ; Stop UNA Operationt# .SBTTL CSR1 register definitions ; ; PCSR1 bit definitionsi;.R1.PWR = 100000 ; Transceiver Power Status ; 0 = failure, 1 = OK$R1.CAB = 40000 ; Cabling Status ; 0 = failure, 1 = OK 1R1.SLF = 37400 ; Self-test Return Code Fielde'R1.CER = 200 ; Command Error Bit%R1.STA = 7 ; UNA State FieldT; +; UNA hardware state bits (Used in C.STA) ; ST.RST = 0 ; Reset State%ST.PRI = 1 ; Primary Load StateNST.RDY = 2 ; Ready State ST.RUN = 3 ; Running State&ST.UHL = 5 ; UNIBUS Halted State"ST.NHL = 6 ; NI Halted State-ST.HLT = 7 ; UNIBUS and NI Halted State ( .SBTTL UNA Port Control Block offsets;; Port Control Block offsets;n  .DSECTe"CB.CMD: .BLKB 1 ; Function Byte&CB.MBZ: .BLKB 1 ; Must Be Zero Byte)CB.ADD: ; Physical Address(1st word)t.CB.UDB: .BLKW 1 ; UNIBUS Data Block Address4CB.MAX: ; Max multicast addr allowed for device3CB.UD2: ; UNIBUS Data Block Address (Extended)g/CB.AD2: .BLKB 1 ; Physical Address(2nd word))CB.LEN: .BLKB 1 ; Length of Data Block -CB.LN2: ; Alternate Length of Data Block/CB.AD3: .BLKW 1 ; Physical Address(3rd word) &CB.SIZ: ; Port Control Block Size .SBTTL Ring Descriptor Block; <; Ring Descriptor Block (Used for codes FN.RRG and FN.WRG);o  .DSECTU/RD.XMB: .BLKW 1 ; Transmit Ring Base AddressX2RD.XME: .BLKB 1 ; Transmit Ring Base (Extended)/RD.XML: .BLKB 1 ; Transmit Ring Entry Length4RD.XMN: .BLKW 1 ; Transmit Ring Number of Entries.RD.RCB: .BLKW 1 ; Receive Ring Base Address9RD.RCE: .BLKB 1 ; Receive Ring Base Address (Extended)P.RD.RCL: .BLKB 1 ; Receive Ring Entry Length3RD.RCN: .BLKW 1 ; Receive Ring Number of Entries )RD.SIZ: ; Ring Discriptor Block Size  .SBTTL Line status bits;.7; Line status bits (Used for codes FN.RLS and FN.CLS);X/LS.ERR = 100000 ; Logical OR of Status BitsD)LS.MER = 40000 ; Multiple Errors Bit-LS.CDF = 20000 ; Collision Detect FailedE"LS.RSV = 10000 ; Reserved Bit#LS.TME = 4000 ; Timeout Error )LS.RRE = 1000 ; Receiver Ring Error)LS.XRE = 400 ; Transmit Ring Errorh%LS.RAM = 100 ; RAM operationalb#LS.REV = 77 ; ROM REV Leveli .SBTT00ʃ_tt tfDATAL Ring entry offsets;a; Ring entry offsets;s  .DSECT(#RG.LEN: .BLKW 1 ; Segment Length$RG.ADD: .BLKW 1 ; Segment Address/RG.AD2: .BLKB 1 ; Segment Address (Extended)rRG.FLG: .BLKB 1 ; Flags Byteo,RG.RLN: .BLKB 1 ; Received Message Length1RG.ERR: .BLKB 1 ; Error Word (and TDR or MLEN)0RG.ACT: .BLKB 1 ; Ring Entry Active Flag Byte/RG.SEQ: .BLKB 1 ; Ring Entry Sequence Number ;RG.UMR: .BLKW 1 ; UMR assignment block save during xmitse6RG.VAD: .BLKW 1 ; Virtual Address of receive buffer)RG.LNK: .BLKW 1 ; Ring Entry Link WordLRG.SIZ: ; Ring Entry Size; "; Ring flag byte bit definitions;K% RF.OWN = 200 ; UNA Ownership BitG)  ; 0=Owned by driver, 1=Owned by UNAK& RF.ERR = 100 ; Combined Error Bit) RF.FRM = 40 ; Receive Framing Error* RF.OFL = 20 ; Receive Overflow Error4RF.MOR = 20 ; Transmit Multiple Retries Needed%RF.CRC = 10 ; Receive CRC Errorl-RF.ONE = 10 ; Transmit One Retry Neededr=RF.MLT = 4 ; Receive No Multicast Error(Set by driver) ,RF.DEF = 4 ; Transmit Packet Deferred#RF.STP = 2 ; Start of Packett!RF.ENP = 1 ; End of Packet ;RF.OPN = 200 ; Open circuit(Set by driver in low byte)<RF.SHT = 100 ; Short circuit(Set by driver in low byte);r#; Ring error word bit definitionse;v)RE.BFL = 100000 ; Buffer Length ErrorM*RE.UTO = 40000 ; UNIBUS Timeout Error3RE.NCH = 20000 ; No Data Chaining Enabled(RCV)R/RE.LCL = 10000 ; Late Collision Error(XMT)i0RE.LCR = 4000 ; Loss of Carrier Error(XMT)2RE.RTY = 2000 ; Retries Execeeded Error(XMT)9 RE.CIR = 14000 ; Short or Open Circuit (w/TDR value)0"!RE.TDR = 1777 ; TDR Bit Mask6"RE.MLN = 7777 ; Received Message Length Bit Mask#$"% .SBTTL UNA MODE bit definitions&';i(; UNA MODE bit definitions0);u9*MD.PRM = 100000 ; UNA will accept all incoming framesr:+MD.ENL = 40000 ; UNA will accept all multicast frames3,MD.DRC = 20000 ; Disable receive data chainingL:-MD.TPD = 10000 ; UNA will pad short transmit messages1.MD.ECT = 4000 ; Enable H4000 collision test0:/MD.DMT = 1000 ; Disable maintainence messages (loop,,0 ; boot, request ID, memory load)*1MD.DTC = 10 ; Disable transmit CRC02MD.LOO = 4 ; Enable controller loopback-3MD.HDX = 1 ; Enable Half Duplex mode 4526 .SBTTL DIAGNOSTIC (non DLX functions) FUNCTIONS78;l,9; DIAGNOSTIC (non DLX functions) FUNCTIONS:; F;; The following diagnostic functions will have the following format:<;s=; C.TYP = Function code0>; C.DATI = Not Used/?; C.DATO = Size of buffer starting at C.CHRLn&@; C.STAT = Status Code (See CHRDF$))A; C.CHRL = Start of Input/Ouput Buffer B; C; OCTAL WORDSOD; BUFFER SIZE$E; FUNCTION REQUIREDF;lG;lH; CONTROL BLOCK FUNCTIONSII;T'JFN.NOP = 0 ; NOP Function 33l4KFN.LSM = 1 ; Load and Start Microaddress 16LFN.RDA = 2 ; Read Default Physical Address 3/MFN.RPA = 4 ; Read Physical Address 30/NFN.WPA = 5 ; Write Physical Address 3u6OFN.RML = 6 ; Read Multicast List From UNA 368PFN.WML = 7 ; Write Multicast List To UNA (illegal)7QFN.RRG = 10 ; Read Ring Format (illegal)I7RFN.WRG = 11 ; Write Ring Format (illegal) (SFN.RCN = 12 ; Read Counters 400TFN.CCN = 13 ; Read and Clear Counters 40(UFN.RMD = 14 ; Read UNA Mode 1(VFN.WMD = 15 ; Write UNA Mode 1*WFN.RLS = 16 ; Read Line Status 106XFN.CLS = 17 ; Read and Clear Line Status 10$YFN.DMP = 20 ; Dump Internal RAM$ZFN.LOA = 21 ; Load Internal RAM/[FN.RSY = 22 ; Read System ID Max 144N0\FN.WSY = 23 ; Write System ID Max 1441]FN.RSA = 24 ; Read Load Server Address 3i6^FN.WSA = 25 ; Write Load Server Address 3_`; Software functionsa'bFN.DIG = 26 ; G00҃9ccccet Diagnostic Data. .c ; This function code is used to dispatch1d ; ... to the diagnostic functions processor2eFN.UML = 27 ; UNA microcode support task wait.)f ; This function is used to time out-g ; ... a response from the support task. hi+j .SBTTL Receive Buffer Offset Definitions k;i%l; Receive Buffer Offset Definitions m;; n .DSECTSoM.LNK: .BLKW 1 ; Link word &pM.ERR: .BLKW 1 ; Error status bytes-q ; Low byte = RDRB+5, High byte = RDRB+7 3r ; (RDRB means Receive Descriptor Ring Buffer) ,sM.MLEN: .BLKW 1 ; Lenth of data in buffer(tM.DADD: .BLKW 3 ; Destination address#uM.SADD: .BLKW 3 ; Source addressivM.PRO: .BLKW 1 ; Protocol/wM.DATA: .BLKW 1 ; Start of data (No padding) )xM.PDTA: .BLKW 1 ; Start of padded datauy .BLKW 255. ; Data bufferz .BLKW 2 ; Room for CRC4{M.DBSZ = .-M.DATA ; Receive data buffer area size"|M.SIZE: ; Receive buffer size}~' .SBTTL Other offsets and definitionse; ; Timer values;e2RSTIM = 10 ; Timeout value for reset command.SLFTIM = 16 ; Timeout value for self-test5CNTTIM = 2 ; Timeout value for control functionsi.XMTTIM = 30 ; Timeout value for transmits7UMLTIM = 180. ; UNA microcode support task responsea ; ... timeout value.2RETRYC = 3 ; Controller initialize retry count$ .IF NDF R$$MPL ; If NOT RSX-11M+6U.UCBX = U.CNT ; Define U.UCBX for none M+ systems .ENDC ; R$$MPLi-SENDBK = 8. ; Send and request block sizeS)FCOPN = 33 ; Open function code value; ; Maximum trasmit buffer sizee;7; 1518.-M; <XMTBSZ = 1518.-<6+6+2+2+4> ; Maximum transmit buffer size2UMRWBS = 20. ; UMR wait block size 10. words;u; DEFINE BITS ;nBIT0 = 1rBIT1 = 2.BIT2 = 4 BIT3 = 10BIT4 = 20DBIT5 = 40nBIT6 = 100BIT7 = 200BIT8 = 400eBIT9 = 1000kBIT10 = 2000BIT11 = 4000BIT12 = 10000BIT13 = 20000BIT14 = 40000BIT15 = 100000+ .SBTTL Error Log Definitions and OffsetsM; ; Error log types ;u&ER.SER = 1 ; Status Error Interrupt'ER.STC = 2 ; Status Change InterruptER.RCV = 3 ; Receive Error ER.XMT = 4 ; Transmit Error4ER.RBU = 5 ; Receive Buffer Unavailable Interrupt+ER.FCI = 6 ; Fatal controller initialize;7; Error log offsets=;0  .DSECT (E.LENG: .BLKW 1 ; Error packet lengthE.TYPE: .BLKB 1 ; Error typeI&E.TMO: .BLKB 1 ; Time out flag byteE.CSR0: .BLKW 1 ; PCSR0E.CSR1: .BLKW 1 ; PCSR1&E.PCB: .BLKW 4 ; Port control block3E.FLG: .BLKB 1 ; Flag byte of xmt/rcb ring entryS4E.ERR: .BLKB 1 ; Error byte of xmt/rcv ring entryE.MODE: .BLKW 1 ; Mode bits#E.SIZE: ; Size of error packet  l* .SBTTL UMR mapped communications region;iJ; This area consists of various buffers that must reside in a UMR mappedK; region. Therefore, these buffers will be a part of the permanently UMR H; mapped region after the driver code. The controller state table has1; pointers that point to each of these buffers.:;B,C.WKSZ = 140. ; Controler work area size  .DSECT =C.PCB: .BLKB CB.SIZ ; UNA Port Control Block Buffer (PCBB)i=C.UDB: .BLKB RD.SIZ ; UNA Unibus Data Block Buffer (UDBB)T-C.RRNG: .BLKB U$$NRS*RG.SIZ ; RCV ring areahNC.XRNG: .BLKB *2; XMT ring area (2 entries for each transmit).C.XHED: ; Start of transmit header buffer .REPT U$$NTS ;= .BLKB 2+6+6+2+2 ; XMT Link-Dest-Source-Protocol-Byte.countt ; ... bufferss .ENDR .BLKW C.WKSZ ; Work buffer+C.BASZ: ; UMR mapped buffers area sizei $ .SBTTL I/O Packet Usage By Driver; ; I/O Packet extension offsets;.0IP.EXT = I.PRM ; I/O packet extension pointer  .DSECTN1IX.ADR: .BLKW 1 ; I/O buffer addr (high order)*<IX.AUX: .BLKW 1 00ڃ_tt tfDATA ; APR6 bias of Aux.characteristics buffer<IX.DIG: .BLKW 1 ; APR6 bias of optional diagnostic buffer/IX.FCN: .BLKW 1 ; Non-DLX function save areal(IXSIZE: ; I/O packet extension size;L;W; I/P Packet Parameter Area M; +-----------------------------------------------------------------------+rM; |Extn Ptr| P1 | Size | P2 | Size | P3 | Size |Not used|kM; +-----------------------------------------------------------------------+h; I.PRM |;; | +- Low 16 bits of buffers physical address ; |A"; | I/O Packet Extension2; | +-----------------------------------+2; +--> |P1 Bias |P2 Bias |P3 Bias |Scratch |-; +-------------------------------------+- ; | V.; | +- High bits of P1 physical address; |; V ; IX.PRM; ; I/O Packet Use For RECEIVESz; ===========================-;-; While in receive wait queue-; --------------------------- ;|! ; I.FCN - Receive wait timerfF ; I.PRM - This word will be pointing to the I/O packet extension.9 ; I.PRM+2 - I/O status save when receive is completed. " ; I.PRM+4 - Receive byte count.* ; IX.FCN - Hold address of owning port;- ; While in function wait queue ; ----------------------------;F; I.PRM - This word will be pointing to the I/O packet extension.; IX.FCN - Function code.-;- ; I/O Packet Use For TRANSMITS ; ============================;|; While in transmit queues; ------------------------;l; I.FCN - Retry countF; I.PRM - This word will be pointing to the I/O packet extension.;; I.PRM+2 - I/O status save when transmit has completed.d&; I.PRM+4 - Transmitted byte count.E; IX.FCN - Holds protocol flag bits while in transmit wait queue. C ; IX.FCN - Holds the following while in transmit pending queue:F4!; Low byte = flag byte of transmit ring entry6"; High byte = error byte of transmit ring entry#;n$; While in Function Queue-%; -----------------------.&; '; I.FCN - Retry counterK(; I.PRM - This word will be pointing to the I/O packet extension. ThesE); I/O packet extension will be used to store the relocationt3*; bias for each buffer in the I/O packet.l+; IX.FCN - Function code. ,;N.-; I/O Packet Use For SET/GET CHARACTERISTICS..; ==========================================/; K0; I.PRM - This word will be pointing to the I/O packet extension. The C1; I/O packet extension will be used to store the relocationC12; bias for each buffer in the I/O packet. <3; IX.FCN - Function code. (when setting multi cast addr)4;k95; I/O Packet Use For CONTROL FUNCTION (Micro code load) 96; =====================================================-7;t#8; I.PRM - I/O packet extensionF(9; I.PRM+2 - Virtual address of buffer:; I.PRM+4 - Buffer size';; I.PRM+6 - End of buffer +1 pointer <;i=; IX.FCN - Functionx>;o?@A.IF NDF L$LISTB .IIF NDF L$$IST,.LISTC .IIF NDF L$$IST,.ENABL CRF D.ENDCsE>F .SBTTL ****************************************************>G .SBTTL * UNA QIO Processing Routines *>H .SBTTL ****************************************************IJ .PSECT ; UNA driver PSECT!KL$LIST = 0 ; List prefix file'LUNAST: ; UNA driver start addressM ; *** NOTE ***i&N ; This module must be the first%O ; ... module in the task buildPQ R .SBTTL Driver Impure AreaST;+U; Driver Impure AreaV;-WIMPUR:8X .REPT U$$NCT ; Make room for controller state tables:Y .BLKB C.LEN+ ; ... and port state tablesZ .ENDR [IMPRE: ; End of impure area\B]RELCT: .WORD -1,-1 ; Relocation constant used to compute Unibus3^ ; ... address within the UMR mapped region of 1_ ; ... the driver. Initially -1 to indicate*+` ; ... driver needs to be initialized.a(b .IF NDF R$$MPL ; If NOT 009ccccRSX-11M-PLUSc=dCNTBL: .BLKW U$$NCT ; UCB save table for interrupt serviceef .ENDC ; R$$MPL$g@hCTABL: .BLKW U$$NCT ; Controller Table Pointers. Indexed viai ; ... controller index.l,jENDCTB: .WORD 0 ; End of controller table$kDAPR6: .BLKW 1 ; Driver APR6 save-lUABKS: .WORD 0 ; UMR assignment block save -mMLTCB: .WORD 0 ; Microcode loader TCB save @nCVIRA: .WORD CBASE ; Virtual address of CBASE. used by UNAIN.o;pCACUM: .WORD 0 ; Time accumulator, used by CLOCK routine-)qCLKBK: .WORD 0 ; Clock Block save area ?rCTPTR: .WORD 0 ; Current controller pointer. Used by CLOCK.B&sCLKFG: .BYTE 0 ; Clock running flagt .EVENuv .IF DF R$$MPL<wCSCRET: .BLKW 1 ; Controller Status Change return addressx .ENDCyz{ (| .SBTTL $XETBL - Driver dispatch table}(~$XETBL::.WORD XEINI ; Initialization .WORD XECAN ; Cancel I/OR .WORD XETMO ; Timeout .WORD XEPWF ; Powerfail .IF DF R$$MPL+ .WORD XECSC ; Controller status changeL2 .WORD XETMO ; Unit status change (do nothing)& .ASCII /XE/ ; Generic device name) .WORD $XEINT ; Interrupt entry pointn% .WORD 0 ; End of interrupt entryL0XECTB: .WORD 0 ; Pointer to KRB table in CTB"$XETBE::.WORD 0 ; End of table .ENDC;+I; QIO$ validation table. Each entry consistes of two words as follows:X; ; .BYTE SUB FUNCTION MASKOF; .BYTE BIT 200 SET --> FUNCTION INVALID IF LUN NOT ALREADY IN USE ; (NO OPEN HAS BEEN ISSUED)'; .WORD ADDRESS OF FUNCTION PROCESSORc;-5QIOTBL: .WORD 100370,XECLN ; Close LUN (FC = 7)O3 .WORD 100370,XEXMT ; Write (FC = 31, IO.XTM)E2 .WORD 100370,XERCV ; Read (FC = 32, IO.XRC)2 .WORD 000370,XEOPN ; Open (FC = 33, IO.XOP)3 .WORD 100160,XETRM ; Close (FC = 34, IO.XTR)l7 .WORD 100370,XEINL ; Initialise (FC = 35, IO.XIN)4 .WORD 000200,XECTL ; Control (FC = 36, IO.XTL): .WORD 100360,XECHR ; Characteristics (FC = 37, IO.XCH) E) .SBTTL XEINI - I/O request initiationR;+#; **-XEINI-I/O request initiationX; I; This routine is entered from the EXEC when an I/O packet is availableMG; for processing. The request parameters must be validated within theE ; context of the calling task.;O; NOTED; UC.QUE bit is set in U.CTL of the UCB. Therefore, the EXEC doesE; not queue requests for the driver. The driver itself keeps trackIC; of the it's I/O packets. Thus the driver does not call $GTPKT.;- ; Inputs:E"; R1 = Address of the I/O packet(; R4 = Address of status control block&; R5 = Address of unit control block; ); Outputs: (to QIO processing routines)r,; R2 = LUN on which the request was issued; R3 = Address of I/O packet,; R4 = Address of requesting task's header/; (Task header will be mapped on RSX11M-Plus)E1; R5 = Address of Port State Table (if present)h;v#XEINI: NOP ; Word for patching' .IF DF DEBUGt BPT .ENDC) .IF NDF R$$MPL ; If NOT RSX-11M-PLUSd MOV U.SCB(R5),R3 ; R3 = SCBe, MOV S.CON(R3),R3 ; R3 = Controller index= MOV R5,CNTBL(R3) ; Save UCB pointer for interrupt routinet .ENDC ; R$$MPL' CMP RELCT,#-1 ; Driver initialized?o BEQ IEABO ; No=+ MOV R1,R3 ; Copy address of I/O packete3 MOV #IXSIZE,R1 ; Get I/O packet extension block  CALL $ALOCB ; ...+ BCS 70$ ; Resource allocation failure.hA MOV I.PRM(R3),IX.ADR(R0) ; Save high address word in extension 1 MOV R0,IP.EXT(R3) ; Save I/O packet extension;( CLR IX.FCN(R0) ; Clear function word% CALL MPTHDR ; Map to task header * ; On return, R0=Task Header address+ MOV I.LN2(R3),R2 ; Compute LUN on whichv$ SUB #H.LUN-2,R2 ; this request SUB R0,R2 ; was issueds( ASR R2 ; Each entry is 4 bytes long ASR R2 ; ...e/ MOVB I.FCN+1(R3),R1 ; Get I/O function codeR0 BIC #^C<177>,R1 ; Isolate real function code/ SUB #7,R1 ; Is this a 'close LUN' reque00_tt tfDATAst? BEQ 20$ ; If EQ, yesI- SUB #21,R1 ; Normalise to dispatch tablen"20$: ASL R1 ; Form table index ASL R1 ; ...6 ADD #QIOTBL,R1 ; Compute address in dispatch table< MOV #IE.ONP&377,R0 ; Assume invalid subfunction bits set< BITB I.FCN(R3),(R1)+ ; Any invalid subfunction bits set? BNE 30$ ; If NE, yesR3 TSTB (R1)+ ; Should the LUN already be in use?n BMI 40$ ; If MI, yes 2 MOV #IE.ALN&377,R0 ; Assume LUN already in use' TST @I.LN2(R3) ; Is the LUN in use?  BEQ 60$ ; If EQ, no030$: CALLR RQALT ; Complete request in error240$: MOV #IE.IFC&377,R0 ; Assume LUN not in use7 MOV @I.LN2(R3),R5 ; Get address of Port State Table3% BIC #1,R5 ; Remove LUN interlocks$ BEQ 30$ ; If EQ, LUN not in use6 CMP I.TCB(R3),P.PTCB(R5) ; Port owned by same task?8 BNE NOTIF ; If NE, user abort notification required3 CMPB R2,P.LUN(R5) ; Still accessed on same LUN?; BNE NOTIF ; If NE, no750$: MOV P.CTBL(R5),R4 ; R4 = Controller State TableQ1 MOV #IE.DNR&377,R0 ; Assume device is stoppedr+ BIT #CS.STP,C.FLAG(R4) ; Device stopped?U+ BNE 30$ ; Yes, return device not readyr60$:* CALL MAPDRV ; Map to 2nd 4K of driver2 CALLR @(R1)+ ; Dispatch to processing routineF70$: MOV #+,R0 ; Resource allocation failure CLR R1 ; ...n#  CALLR $IOFIN ; Post completionN 9  APR5PC XEINI ; Make sure XEINI is in APR5 addr spaceo   M2 .SBTTL NOTIF - Deliver user abort notification;+,; **-NOTIF-Deliver user abort notification;BB; The physical link in use by this user has been taken over by aA; previleged task. Complete this I/O request in error and stopv,; further operation on this physical link.;- ; Inputs::; R3 = Address of I/O packet;R;NOTIF: CLR @I.LN2(R3) ; No further activity on this linkI;+3; **-IEABO-Complete I/O request with abort status ; 2; Complete the I/O request with an abort status. ;- !; Inputs:o"; R3 = Address of I/O packet#;r2$IEABO: MOV #IE.ABO&377,R0 ; Set up abort status % BR RQALTh&';+.(; **-ISSUC-Complete I/O request successfully); **-RQALT-Alternate entry*;d+; Complete the I/O request.n,;- -; Inputs:..; R3 = Address of I/O packet/;s40ISSUC: MOV #IS.SUC&377,R0 ; Set up success status(1RQALT: CLR R1 ; No additional status23;+#4; **-RQDON-Perform I/O completionu5;#6; Perform general I/O completion. 7;- 8; Inputs:!9; R0 = First word of I/O statuso":; R1 = Second word of I/O status;; R3 = Address of I/O packet<; =RQDON: MOV R4,-(SP) ; Save R43> MOV IP.EXT(R3),-(SP) ; Save I/O packet extensionr@? BIS #,R0 ; Tell user, this is a broadcast channel"@ CALL $IOFIN ; Post completion7A MOV (SP)+,R0 ; R0 = Address of I/O packet extensions3B MOV #IXSIZE,R1 ; R1 = I/O packet extension size-C CALL $DEACB ; Deallocate extension block D MOV (SP)+,R4 ; Restore R4 E RETURN ; Return to callerrFGH O6I .SBTTL XEOPN - Establish access to a physical linkJ;+0K; **-XEOPN-Establish access to a physical linkL;GM; This function is called to gain access to a specific physical link.>N;- O; Inputs:i,P; R2 = LUN on which the request was issuedQ; R3 = Address of I/O packetR; R4 = Controller State Tablee,S; I.PRM+1 - High byte of physical address.T; I.PRM+2 - Low 16 bits of physical address)U; I.PRM+4 - Length of stringRV; I.PRM+6 - Initial timeoutW; I.PRM+7 - Mode: (Ignored)X;- Y .ENABL LSBsZXEOPN:[ .IF DF DEBUG\ BPT] .ENDC^6_ CALL MAPBF ; Convert data buffer physical address(` ; ... to bias and virtual address*a CALL GTPRT ; Find and allocate a portb BCS RQALT ; If CS, errorc;3>d; R5 = Port Control Block, R4 = controller state table basee;M(f MOV #IE.NSF,R0 ; Assume line stopped/g BIT #CS.STP,C.FLAG(R4) ; Controller stopped?Ph BNE RQALT ; Yesi%j C009ccccALL MPTHDR ; Map to task headert/k MOV R5,@I.LN2(R3) ; Mark this LUN as active )l CALL MAPDRV ; Restore driver mappingm9n MOV I.TCB(R3),P.PTCB(R5) ; Save TCB in port save areae1o MOVB R2,P.LUN(R5) ; Set up owning TCB and LUNL:p MOVB I.PRM+6(R3),P.RCVT(R5) ; Save receive timer valueqCr MOV #PS.XIN!PS.OPN,P.FLAG(R5); Pretend link needs initialization s,t INC C.OPRT(R4) ; INC count of open ports;u MOVB I.PRM+6(R3),P.RCVT(R5) ; Save receive timeout countR1v BIS #PS.OPN,P.FLAG(R5) ; Indicate port is opena/w BIT #CS.OFL,C.FLAG(R4) ; Controller offline?t(x BNE 50$ ; Yes, try to initialize ity BR 20$ ; return successz9{ APR5PC XEOPN ; Make sure XEOPN is in APR5 addr space |} o~;+; **-XEINL-Initialise channel,;TC; This function is called to restart operation of a physical link); following an error.i;- ; Inputs:I; R3 = Address of I/O packet; I.PRM - Initial timeout; I.PRM+1 - Mode:; R4 = Controller State TableN:; R5 = Address of Port Status physical link access block; XEINL:: ; LK705 .IF DF DEBUG ;**-1 BPT .ENDC: BIT #PS.XIN,P.FLAG(R5) ; Port needs to be initialized? BEQ 30$ ; No? MOVB I.PRM+6(R3),P.RCVT(R5) ; Save timeout time for receives 6 BIT #CS.OFL,C.FLAG(R4) ; Is the link state offline? BNE 40$ ; If NE, yes 5 BIC #PS.XIN,P.FLAG(R5) ; Indicate line initializedi020$: CALLR ISSUC ; Otherwise, return success130$: CALLR IEABO ; Abort the function requestc@40$: MOVB @IP.EXT(R3),P.RCVT(R5) ; Save receive timeout value=50$: $QPKT C.INIW ; Queue packet to initialize wait queueP960$: CALLR CTINI ; Initialize controller. Initialize + ; .. will test if init already underr- ; .. way. If so, no action is taken.t) ; .. Init complete will return I/OE ; .. done on this item.9 APR5PC XEINL ; Make sure XEINL is in APR5 addr spacer  .DSABL LSBs C$ .SBTTL XETRM - Terminate channel .SBTTL XECLN - Close LUN;+; **-XETRM-Terminate channel; **-XECLN-Close LUN;I4; This routine is called to close an open channel.;- ; Inputs:I"; R3 = Address of the I/O packet; R4 = Controller State Tablee$; R5 = Address of Port State Table;tXECLN: .IF DF DEBUGm BPT .ENDCXETRM: .IF DF DEBUGi BPT .ENDC+ CLR P.FLAG(R5) ; Indicate port not openr. DEC C.OPRT(R4) ; Decrement open port count6 CALL RLPRT ; Release port related data structures% CALL MPTHDR ; Map to task header*< BIC #1,@I.LN2(R3) ; Make sure LUN interlock bit is clear; %; Return I/O requests for this portA;s, MOV R3,-(SP) ; Save I/O packet for close) MOV R4,R2 ; Point to xmit wait queuee ADD #C.XMWQ,R2 ; ...0 CALL 20$ ; Remove I/O packets for this port, MOV R4,R2 ; Point to receive wait queue ADD #C.RCVW,R2 ; ...0 CALL 20$ ; Remove I/O packets for this port- MOV R4,R2 ; Point to function wait queuet ADD #C.PFNC,R2 ; ...0 CALL 20$ ; Remove I/O packets for this port) MOV R4,R2 ; Point to init wait queuec ADD #C.INIW,R2 ; ...0 CALL 20$ ; Remove I/O packets for this port/ MOV (SP)+,R3 ; Restore I/O packet for closet' CALL MPTHDR ; Map to task's header.4 CLR @I.LN2(R3) ; Ensure no more I/O on this link/ BIT #CS.OFL,C.FLAG(R4) ; Controller offline?. BNE 10$ ; yes6 MOV #IS.SUC,I.PRM+2(R3) ; Save I/O status in packet CLR I.PRM+4(R3) ; ...i6 CALLR STMLT ; Write Multicast addresses to device10$:! CALLR ISSUC ; Return success *20$: MOV (R2),R3 ; Get next I/O packet BEQ 40$ ; No more' CALL MPTHDR ; Map to task's header(1 CMP @I.LN2(R3),R5 ; I/O packet owned by port?L BNE 30$ ; No " MOV (R3),(R2) ; Dequeue packet MOV R2,-(SP) ; Save R2# CALL IEABO ; Abort the request ' MOV (SP)+,R2 ; Restore list pointer BR 20$ ; Look at next item +30$:00_tt tfDATA MOV R3,R2 ; R2 points to next item# BR 20$ ; Continue to next itemd$40$: RETURN ; Return after call9 APR5PC XECLN ; Make sure XECLN is in APR5 addr spacek $  .SBTTL XEXMT - Transmit data;+; **-XEXMT-Transmit data;,D; This function is called to transmit data from the physical link.;- ; Inputs:"; R3 = Address of the I/O packet;; I.PRM+1 - High byte of physical address of data buffer =; I.PRM+2 - Low 16 bits of physical address of data buffer2$; I.PRM+4 - Length of data bufferA; I.PRM+6 - Virtual address of optional characteristics buffera8 ; I.PRM+10- Length of optional characteristics buffer< ; I.PRM+12- Virtual address of optional diagnostic buffer3 ; I.PRM+14- Length of optional diagnostic buffer  ; R4 = Controller State Tableh! ; R5 = Address Port State Table; ;; I.PRM+1 - High byte of physical address of data bufferh=; I.PRM+2 - Low 16 bits of physical address of data bufferh;lXEXMT: .IF DF DEBUG BPT .ENDC3 CALL BFCHK ; Validate optional characteristicsn ; .. buffer BCS 70$ ; If CS, invalidf/ TST I.PRM+6(R3) ; Do we have an AUX buffer?u" BEQ 50$ ; If EQ, none present2 CALL XMTCH ; Process transmit characteristics' BCS 20$ ; Error in characteristics  ,! MOV P.FLAG(R5),-(SP) ; Get port flag word4" BIC #^C,(SP) ; Clear unwanted bits@# CMPB (SP)+,#PS.ADR!PS.PRO ; Do we have protocol/address pair?-$ BNE 50$ ; If NE, Ethernet address and/or!% ; .. protocol not supplieda2& MOV R4,R0 ; Generate pointer to protocol list' ADD #C.PROL,R0 ; ...(10$:$) MOV (R0),R0 ; Get next protocol** BEQ 50$ ; Not found, invalid protocol<+ CMP P.XPRO(R5),PL.PRO(R0) ; Is this the callers protocol?, BNE 10$ ; Noe1- MOV IP.EXT(R3),R1 ; R1 = I/O packet extensionaD. MOV PL.FLG(R0),IX.FCN(R1) ; Temp save protocol flags in extension/30 MOV #IE.SPC&377,R0 ; Assume buffer is too large11 CMP I.PRM+4(R3),#XMTBSZ ; Is buffer too large? )2 BHI 60$ ; If HI, buffer is too large03.4 BIT #CS.OFL,C.FLAG(R4) ; Controller online?35 BEQ 40$ ; If EQ, yes ... initiate transmissiont607 MOV #IE.DNR&377,R0 ; Assume device not ready?8 BIT #PS.XIN,P.FLAG(R5) ; Line requires initialize function?109 BNE 20$ ; Yes, must issue IO.XIN or Close &: ; .. Open*; MOV #IE.ABO&377,R0 ; Abort the request>< BIS #PS.XIN,P.FLAG(R5) ; Indicate, port must be initialized=20$: CLR R1 ;C"> CALLR RQDON ; Post completion?30$: RETURN ;@6A40$: $QPKT C.XMWQ ; Queue packet to transmit queue%B BR INIXM ; Initiate transmission C:D50$: MOV #IE.BAD&377,R0 ; Return bad parameter(s) errorE60$:F CALLR RQALT ;G$H70$: CLR R1 ; Zero status word 2.I BR XMTDN ; Do xmit done, maybe user wantsJ ; ... diagnostic infoKLM p(N .SBTTL INIXM - Initiate transmissionO;+"P; **-INIXM-Initiate transmissionQ;tBR; Initiate transmission of the next available I/O packets on theS; physical link.T;- U; Inputs::$V; R5 = Address of port state table*W; R4 = Address of controller state tableX; Y; Registers modified:3Z; R0, R1, R2, R3, R4, R5[;e6[INIXM:: CLR -(SP) ; Set transmit counter ; LK705[ ; LK705[; ; LK705Y[; NOTE, we must not set up transmits until the current transmits have completed.; LK705iY[; Setting up the transmit ring and polling the UNA during a transmit will cause ; LK705 /[; the UNA to get out of sunc!!! ; LK705s[; ; LK705+[ CALL MAPDRV ; Map to driver ; LK705e?[ MOV C.XMTC(R4),R1 ; Get current transmit ring entry ; LK705 6[ TSTB RG.ACT(R1) ; Transmission under way? ; LK705=[ BNE 30$ ; Yes, wait for interrupt to start ; LK7050%[ ; ... next transmit! ; LK705m[ ; LK705iC]10$: MOV C.XMWQ(R4),R3 ; Any transmit I/O packets waiting? ;**-1p^ BEQ 30$ ; If EQ, no_?_ CALL GTPST ; Load R5 with Port Status Table address; LK009cccc705t_ ; LK705 2` CALL XMTCH ; Process transmit characteristicsa(b CALL GTXMH ; Get xmit header buffer0c BCS 30$ ; None available, wait for xmits tod ; ... completem1e MOV C.XMWQ(R4),R3 ; Get next transmit requestsfg9h MOV P.XDAD(R5),(R0)+ ; Put destination address into 7i MOV P.XDAD+2(R5),(R0)+ ; ... transmit buffer header3j MOV P.XDAD+4(R5),(R0)+ ;4k MOV C.PADD(R4),(R0)+ ; Put source address into7l MOV C.PADD+2(R4),(R0)+ ; ... Transmit buffer headerm MOV C.PADD+4(R4),(R0)+ ;An MOV P.XPRO(R5),(R0)+ ; Put protocol into xmit buffer headere>o MOV I.PRM+4(R3),(R0) ; Assume padding. Set byte count inp ; ... transmit header4q SUB #14.,R0 ; R0 -> begin of transmit headerr,s CALL GFXRE ; Get a transmit ring packettAu MOV #14.,RG.LEN(R1) ; Put transmit buffer length in packetevw;VHx; NOTE - We cannot move the relocation value into the ring as this mayNy; set the ownership bit and we are not ready for the UNA to take this entry.z;)8{ MOV RELCT+2,-(SP) ; Put relocation constant on stack| MOV RELCT,-(SP) ; ...M,} ADD R0,(SP) ; Convert packet address to$~ ADC 2(SP) ; ... Unibus address.8 MOV (SP)+,RG.ADD(R1) ; Put unibus address of segment& MOVB (SP)+,RG.AD2(R1) ; ... segment4 BIC #374,RG.AD2(R1) ; Make sure MBZ bits are off6 MOV R0,RG.VAD(R1) ; Save virtual address of header1 MOV IP.EXT(R3),R2 ; R2 = I/O packet extensionh; BIT #LF.PAD,IX.FCN(R2) ; Protocol uses padded messages?  BEQ 20$/ ADD #2,RG.LEN(R1) ; Account for byte count 20$:1 MOV R1,-(SP) ; Save header ring entry addressn+ CALL UMRMP ; Map user buffer with UMRsU0 MOV (SP)+,R0 ; Get header ring entry into r0B MOVB #RF.STP!RF.OWN,RG.FLG(R0) ; Set start of chain and UNA own7 $DQPKT C.XMWQ ; Dequeue I/O packet from wait queueG1 MOV IP.EXT(R3),R0 ; R0 = I/O packet extensionI3 CLR IX.FCN(R0) ; Clear tranmit status save wordF) MOVB #3,I.FCN(R3) ; Set retry counters/ $QPKT C.XMTP ; Queue to xmit pending queuen& INC (SP) ; Indicate poll required" BR 10$ ; Go, do next transmit30$:* TST (SP)+ ; Did we transmit anything? BNE 40$ ; Yes RETURN ; No, just return40$:- CALL POLRG ; Do Poll Ring command to UNAo. MOV #XMTTIM,C.XMTT(R4) ; Set transmit timer CALLR CLOCK ; Start clock;0,; We get here from transmit done interrupt;;<XMTDN: TST I.PRM+12(R3) ; Do we have a diagnostic buffer? BEQ 10$ ; No$- MOV R0,I.PRM+2(R3) ; Save I/O status code4 MOV R1,I.PRM+4(R3) ; Save byte count of transmit6 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;B; We get here from the non-DLX module after it has processed the8; function requests in the optional diagnostic buffer.;;5XDIDN: MOV I.PRM+2(R3),R0 ; R0 = Saved status code2 MOV I.PRM+4(R3),R1 ; R1 = Characters processed CALLR RQDON ; Do I/O done  .DSABL LSBo V .SBTTL XERCV - Receive datas;+; **-XERCV-Receive dataP; C; This function is called to receive data from the physical link.;- ; Inputs:t"; R3 = Address of the I/O packet;; I.PRM+1 - High byte of physical address of data bufferp=; I.PRM+2 - Low 16 bits of physical address of data bufferb$; I.PRM+4 - Length of data bufferA; I.PRM+6 - Virtual address of optional characteristics bufferc8; I.PRM+10- Length of optional characteristics buffer<; I.PRM+12- Virtual address of optional diagnostic buffer3; I.PRM+14- Length of optional diagnostic buffer ; R4 = Controller State Tablee%; R5 = Address of port status table;=  .ENABL LSB XERCV: .IF DF DEBUG  BPT .ENDC6 CALL MAPBF ; Convert data buffer physical address( ; ... to bias00 _tt tfDATA and virtual address3 CALL BFCHK ; Validate optional characteristicss ; .. buffer BCS 50$ ; If CS, invalid-3 MOV #IE.SPC&377,R0 ; Assume buffer is too large-# CMP I.PRM+4(R3),#XMTBSZ ; Is it?i, BHI BUFERR ; If HI, buffer is too large: BIT #CS.OFL,C.FLAG(R4) ; Is the link online? ; LK705" BNE 10$ ; If NE, yes ;**-1: MOV #IE.VER&377,R0 ; Assume we have a delayed error to ; .. report+ BIT #PS.DER,P.FLAG(R5) ; Delayed error?  BEQ 40$ ; Nov4 BIC #PS.DER,P.FLAG(R5) ; Clear delayed error bit. BR 20$ ; Return packet with delayed error;10$: MOV #IE.ABO&377,R0 ; Assume fatal error in progress 4 BIS #PS.XIN,P.FLAG(R5) ; Port must be initialized20$: CLR R1 ; ...f/ CALLR RQDON ; Complete the receive request; 30$: RETURNl:40$: MOVB P.RCVT(R5),I.FCN(R3) ; Set timer in I/O packet1 MOV IP.EXT(R3),R0 ; R0 = I/O packet extension) MOV R5,IX.FCN(R0) ; Save port address50 $QPKT C.RCVW ; Queue the receive I/O packet! CALL CLOCK ; Start the clocke BR 30$ ; Return.50$: MOV R0,I.PRM+2(R3) ; Save status codes CLR I.PRM+4(R3) ; ...a;n-; We get here after the receive is completes;i<RCVDN: TST I.PRM+12(R3) ; Do we have a diagnostic buffer? BEQ RDIDN ; No, that's it!T8 MOV IP.EXT(R3),R0 ; Get I/O packet extention pointer< MOV #FN.DIG,IX.FCN(R0) ; Set diagnostic function code and ; ... show I/O complete6 $QPKT C.PFNC ; Queue packet to pending function Q+ CALLR FNINI ; Try to initiate function2BUFERR: CALLR RQALT ; Return with buffer error;cF; We get here after the non-DLX functions in the optional diagnostic ; buffer have been processed.: ;I. RDIDN: MOV I.PRM+2(R3),R0 ; R0 = I/O status#  MOV I.PRM+4(R3),R1 ; Byte countM"  CALLR RQDON ; Return I/O done  .DSABL LSB I* .SBTTL XECHR - Set/Get characteristics;+$; **-XECHR-Set/Get characteristics; J; This routine is called to set/get multiple characteristics to/from the.; DLC associated with this physical channel.;- ; Inputs:"; R3 = Address of the I/O packet?; I.PRM+1 - High byte of physical address of characteristicsp; bufferA; I.PRM+2 - Low 16 bits of physical address of characteristics); buffer/ ; I.PRM+4 - Length of characteristics bufferS!; R4 = Controller State Table ."; R4 = Address of physical link access block#;S$XECHR:% .IF DF DEBUG & BPT' .ENDC(/) BIT #CS.OFL,C.FLAG(R4) ; Controller offline?m* BEQ 10$ ; Noi)+ CALLR IEABO ; Return with abort code ,10$:6- CALL MAPBF ; Convert data buffer physical address(. ; ... to bias and virtual address8/ MOV #IE.ONP&377,R0 ; Assume illegal subfunction code00 MOVB I.FCN(R3),R1 ; Get the subfunction code1 ASR R1 ; Form word indexr2 ASR R1 ; ... 3 BIT #1,R1 ; Is it odd4 BNE XRQALT ; Yes, no good!n25 CMP #CHMAX,R1 ; Is the subfunction code valid?6 BLOS XRQALT ; If LOS, noO'7 CALLR @CHFNC(R1) ; Perform functionB879XRQALT: CALLR RQALT ; Complete the request in error:;<;+*=; Set/Get characteristics function table>;-,?CHFNC: .WORD STCHR ; Set characteristics&@ .WORD GTCHR ; Get characteristicsACHMAX= .-CHFNCBCD 1(E .SBTTL XECTL - Control QIO processorF;+"G; **-XECTL-Control QIO processorH;#<I; Controll functions are only valid during Microcode load.BJ; The control function is used to pass a buffer of ECO MicrocodeAK; segments to this driver. Therefore, the driver must validateLL; the following:M;-&N; 1. The calling task is privileged.O; 2. It's name is UML...4P; 3. The controller must be in initialization modeQ; R; Inputs:RS; R3 = Address of I/O packet(T; I.PRM+2 = Micro code segment bufferU; I.PRM+4 = Buffer sizeV; R4 = Controller State TableeWXECTL:X .IF DF DEBUGnY BPTZ .ENDC[0\ CALL MAPBF ; map physical address of buffer].^ MOV #IE.SPC&377,R0 ; Assume 009ccccbuffer too big/_ CMP I.PRM+4(R3),#8192.-64. ; Is it too largel#` BHIS 20$ ; Buffer is too large a3b MOV #IE.PRI&377,R0 ; Assume privilege violationM.c MOV I.TCB(R3),R1 ; R1 = Task Control Block.d BIT #T3.PRV,T.ST3(R1) ; Is task privileged?e BEQ 20$ ; No f.g MOV #IE.BAD&377,R0 ; Assume bad parameters,h MOV I.PRM+6(R3),R2 ; Get controller info6i CMP R2,#ENDCTB-CTABL ; Controller index reasonable?!j BHIS 20$ ; No, bad parameterok BIT #1,R2 ; Is it even? l BNE 20$ ; No, bad parameter6m MOV CTABL(R2),R4 ; Get Controller State Table ptr.n0o MOV #IE.IFC&377,R0 ; Assume invalid function(p CMP MLTCB,R1 ; Is tasks name MLT...?0q BNE 20$ ; Invalid function for anyone else.r@s BIT #CS.INI,C.FLAG(R4) ; Are we initializing this controller?0t BEQ 20$ ; No, then this function is invalidu-v MOVB I.FCN(R3),R2 ; R2 = Load subfunctionT&w BMI 20$ ; Minus, invalid functionx y ASL R2 ; Make it word index,z CMP R2,#LOADND-LOADTB ; Valid subfunction{ BHIS 20$ ; No|A} CMP C.FUNS(R4),#FN.UML ; Is this 1st response by support task?3~ BNE 10$ ; Noa+ CLR C.CTMR(R4) ; Clear controller timere* CLR C.CFNC(R4) ; No function is active- CLR C.FUNS(R4) ; Clear function save word 10$:& CALLR @LOADTB(R2) ; Go to function#20$: CALLR RQALT ; Return error,LOADTB: .WORD LODUM ; load UNA microcode .WORD ENDLOD ; End of loadc .WORD ABRTLD ; Abort loadLOADND=. ; End of table3ENDLOD: MOV #IS.SUC,R0 ; R0 = I/O success statusP CALLR RQALT ; Returni*ABRTLD: CALL FTL ; Do fatal processing BR ENDLOD ; End of load n7 .SBTTL XECSC - Controller Status Change entry pointe;+1; **-XECSC-Controller status change entry pointC;@C; This routine is entered from the executive when the status of aH; controller must be changed (online => offline or offline => online).;- ; Inputs:D3; R2 = KRB address for controller changing status&; R3 = CTB address for the above KRB*; (SP) = Return address for completion7; 2(SP) = Return address for intermediate completionN,; 'C' Clear = Offline => online transition,; 'C' Set = Online => offline transition; ; Outputs:; On return through (SP):o; $SCERR = 1 if successful; $SCERR = Error code if not; ; Registers modified:l; R0, R1, R2, R3, R4, R5;l! .IF DF R$$MPL ; RSX-11M-PLUS$XECSC:: NOP ; Word for patching* MOV (SP)+,CSCRET ; Save return address ROL R1 ; Save "C" bit/ CMP RELCT,#-1 ; Was controller initialized?s BNE 5$ ; Yesc MOV L.DCB(R3),R5 ; R5=DCB  MOV D.UCB(R5),R5 ; R5=UCBe MOV U.SCB(R5),R4 ; R4=SCBi+ MOVB K.IOC(R2),R3 ; R3=Controller index ! CALL XELOA ; Init controller! BCS 60$ ; Init failed, exit!5$:i* CALL MAPDRV ; Map to 2nd 4K of driver) MOV #CTABL,R0 ; R0 = Controller table10$:' MOV (R0)+,R4 ; R4 = Next controller(! BEQ 40$ ; No more, just exit7 CMP C.KRB(R4),R2 ; Do we have the right controller?a& BNE 10$ ; No, get next controller2 MOV R3,C.CTB(R4) ; Save CTB address for driver3 ROR R1 ; Is this offline => online transition? BCC 50$ ; Yes6 BIS #KS.OFL,K.STS(R2) ; Indicate controller offline# CALL FTL ; Do fatal processing7 BIS #CS.STP,C.FLAG(R4) ; Indicate controller stoppedM;TC; Now, check if all controllers have stopped. If so, then returnt; static UMR to system.;;o) MOV #CTABL,R0 ; R0 = controller tablee* MOV #U$$NCT,R1 ; R1 = # of controllers20$:2 MOV (R0)+,R4 ; Get next controller state table BEQ 30$ ; No more/ BIT #CS.STP,C.FLAG(R4) ; Controller stopped? BNE 20$ ; Yes) BR 40$ ; At least one still running!o;l>; All controllers have stopped. Return static UMR to system;C30$:2 .IF DF M$$EXT ; If extended memory supported?5 MOV UABKS,R2 ; Now, point to UMR assignment block" BEQ 40$ ; No assignment block00_tt tfDATA. CALL $DEUMR ; Return static UMR to system) .REPT 6 ; Clear UMR assignment block  CLR (R2)+ .ENDR# CLR UABKS ; Show no static UMR$ .ENDC ; M$$EXT,40$: CALLR @CSCRET ; Return to initiator:50$: BIC #KS.OFL,K.STS(R2) ; Turn off offline bit in KRB0 BIC #CS.STP,C.FLAG(R4) ; Turn off stop switch@ MOV K.CSR(R2),C.CSR(R4) ; Save CSR in Controller Status Table2 .IF DF M$$EXT ; If extended memory supported?- TST UABKS ; Static UMR already assigned?C  BNE 40$ ; Already allocated  CALL GSUMR ; Get static UMR .ENDC ; M$$EXT BR 40$ ; All is well >60$: MOV #IE.ABO,$SCERR ; Abort, driver did not have enough BR 40$ ; ... buffer space9 APR5PC XECSC ; Make sure XECSC is in APR5 addr space .ENDC ; RSX-11M-PLUS s, .SBTTL FNINI - Function Initiate Routine;+<; This routine initiates a function in the function queue.;uB; All non-DLX functions request in the user buffer are processedI; before control is given to the next I/O packet in the function queue. ;-  FNINI:  .IF DF DEBUGw  BPT  .ENDC% MOV #1,R3 ; Assume poll requiredh0 TST C.CFNC(R4) ; Function processing active?- BNE 40$ ; Yes, interrupt will start nextd ; ... function 9 BIT #CS.POL,C.FLAG(R4) ; Need to issue a poll command?e BEQ 10$ ; NoA BIC #CS.POL,C.FLAG(R4) ; Indicate poll command issued ; LK705+ MOV #CM.PDM,R0 ; Set up primary command  CALL LODCM ; Do Poll Ringsc BR 40$ ; Set timerx310$: BIT #CS.GST,C.FLAG(R4) ; Need to get status? BEQ 20$ ; Yes$ MOV #FN.RLS,R1 ; Read UNA status CALLR LODFN ; ... BR 40$ ; Set timero20$:( $DQPKT C.PFNC ; Get next I/O packet  BCS 40$ ; Nothing to do!.!" CLR R1 ; Clear high byte41# MOV IP.EXT(R3),R0 ; R0 = I/O packet extensionN*$ MOVB IX.FCN(R0),R1 ; get function code% BEQ 50$ ; Zero is a NOP+& BMI ABORT ; No negative function codes'3( CMP R1,#FN.WML ; Write multicast list function?) BNE 30$ ; NoG5* MOV R3,C.CFNC(R4) ; Save packet as current actives+ ; ... function flag*, CALLR STMLT ; Do write multicast list-*.30$: CMP R1,#FN.DIG ; Non-DLX functions-/ BNE ABORT ; Something must be very wrongo50 MOV R3,C.CFNC(R4) ; Save packet as current active31 ; ... function flag'2 CALLR NDLXD ; Do non-DLX functionst3440$: RETURN ;r50650$: MOV I.PRM+2(R3),R0 ; Recover status code#7 MOV I.PRM+4(R3),R1 ; Byte countl#8 CALL RQDON ; Return I/O packet;(9 BR FNINI ; Try to get next function:;ABORT: < .IF DF DEBUG ; If debugging=> BPT ; Breakr? BR ABORT ; Loop on breakC@A .IFF B&C CRASH ; Some thing is very wrongDE .ENDC ; DEBUGFGH F#I .SBTTL XEPWF - Device powerfailvJ;+K; **-XEPWF-Device powerfailLL;LGM; This routine is entered from the EXEC at powerfail recovery, systemI%N; boot and device driver load time.O;- P; Inputs: Q;tR; For RSX-11M+S; T; R3 = Controller Table (CTB) 'U; R2 = Kontroller Request Block (KRB)V;FW; For RSX-11MgX;Y; R3 = Controller indexB.Z; R4 = Address of Status Control Block (SCB)&[; R5 = Address of Unit Control Block\;.]; Registers modified:^; R0, R1, R2, R3, R4, R5_;o`XEPWF:a .IF DF DEBUGFb BPTc .ENDCd%e .IF NDF R$$MPL ; If not RSX-11M+ef3g CMP RELCT,#-1 ; Controller already initialized? h BNE 10$ ; Yes!i BR XELOA ; No, initialize itoj10$:kl .IFF m+n CMP RELCT,#-1 ; Controller initialized? o BEQ XETMO ; No, just returnpq .ENDC ; R$$MPLr)s MOV #CTABL,R0 ; R0 = Controller tablett*u CALL MAPDRV ; Map to 2nd 4K of driverv3w20$: MOV (R0)+,R4 ; R4 = Controller status table1x BEQ 30$ ; That is it!)y CALL FTL ; Do fatal error processingz BR 20$ ; Do all of them{|30$:/} .IF DF M$$EXT ; Extended memory supported?l~4 CALL $MPUBM ;00"9cccc Reload UMR map register to 2nd 4K .ENDC ; M$$EXT;+ ; **-XECAN-Cancel I/O requests; **-XETMO-Device timeoutj;e(; These routines perform no operation.;-%XECAN: ;;; Should this be a NOPC%XETMO: RETURN ;;; Return to exec9 APR5PC XEPWF ; Make sure XEPWF is in APR5 addr spaceQ T1 .SBTTL $XELOA - Initialize driver at load timen;+,; **-$XELOA-Initialize driver at load time;$?; This code is called at the time when the driver is loaded.a>; This code initializes the driver data structures and saves"; pointers to system data bases.;- ; Inputs: ; R3 = Controller indexo.; R4 = Address of Status Control Block (SCB)&; R5 = Address of Unit Control Block; ; Outputs:); Driver data structurs are initializedE;s#XELOA: NOP ; Room for patching  CALL SALL ; Save registersm .IF DF DEBUGO BPT .ENDC .IF DF M$$MGE;TD; Compute APR6 value. We must do this here as the initialize code ; may live in the APR6 region.;r7 MOV @#KISAR5,DAPR6 ; DAPR6 = Driver start addr bias$ BIT #40000,#DREND ; Driver GT 4K BEQ 10$ ; Noo7 ADD #200,DAPR6 ; Yes, account for 4K mapped by APR5n  BR 20$ ; 10$:6 MOV #CBASE,-(SP) ; Get base of communications area% BIC #160000,(SP) ; Clear APR bitsn, ADD #77,(SP) ; Point past current sliver2 ASR (SP) ; Compute offset in slivers to CBASE ASR (SP) ; ...t ASR (SP) ; ...t ASR (SP) ; ...i ASR (SP) ; ...a ASR (SP) ; ...g& ADD (SP)+,DAPR6 ; Add to APR5 bias;D(; Compute new vertual address of CBASE; 2 MOV #CBASE,R0 ; R0 = Old virtual addr of CBASE5 BIC #177700,R0 ; R0 = Offset into 1st APR6 sliver/ BIS #140000,R0 ; R0 = Virtual addr of CBASEi1 MOV R0,CVIRA ; Save new virtual addr of CBASEn.20$: CALL MAPDRV ; Map to 2nd 4K of driver .ENDC ; M$$MGE0 CALL UNAIN ; Initialize UNA data structures# BCS 30$ ; Failed to initializeA+ .IF NDF R$$MPL ; If "NOT" RSX-11M-PLUSP3 MOV CTABL(R3),R4 ; R4 = Controller Status Tablea- CALL GSUMR ; Assign static UMR to driver0 .IFFl, CLR RELCT ; Indicate driver initialized9 CLR RELCT+2 ; ... "XECSC" will init relocation valuer .ENDC ; R$$MPL!30$: RETURN ; Return to exec; APR5PC $XELOA ; Make sure $XELOA is in APR5 addr space  A .SBTTL QPAKT - Queue I/O packet to specified controller queue;;+0; **-QPAKT-Queue I/O packet to specified queue;XA; Queue an I/O packet to the end of specified controller queue.a;-; Calling sequence:a; JSR R0,QPKT ; .WORD ;d ; Inputs:i"; R3 = Address of the I/O packet/; R4 = Address of the controller state table ;$; Registers modified: ; None;e@QPAKT:: MOV R3,-(SP) ; Save address of the I/O packet ; LK705# MOV R2,-(SP) ; Save R2 ;**-1e7 MOV R4,R2 ; Copy address of Controller State TableQ2 ADD (R0)+,R2 ; Compute address of the listhead,10$: MOV R2,R3 ; Save address of current& MOV (R2),R2 ; Get address of next5 BNE 10$ ; Loop till we find the end of the queue% MOV 2(SP),(R3) ; Link new to last 6 CLR @2(SP) ; Clear link pointer in new I/O packet% MOV (SP)+,R2 ; Restore I/O packet  MOV (SP)+,R3 ; Restoe R2 RTS R0 ; Return h: .SBTTL DQPAK - Dequeue I/O packet from specified queue;+A; **-DQPAK-Dequeue I/O packet from one of the controller queues ;m;; Dequeue an I/O packet from one of the I/O queues on thed; controller state table.,;-; Calling sequence:; JSR R0,DQPKTi ; .WORD ;V ; Inputs:;. ; R4 = Address of the controller state table ;t ; Outputs:" ; R3 = Address of the I/O packet$ ; 'C' Clear - I/O packet available-; 'C' Set - No more I/O packets availableQ;-; Registers modified:s; R3;e DQPAK: MOV R2,-(SP) ; Save R20 MOV R4,R2 ;00*_tt tfDATA Compute address of the listhead ADD (R0)+,R2 ; ...+ SEC ; Assume no I/O packets availableo. MOV (R2),R3 ; Get next entry on the queue BEQ 10$ ; If EQ, none0 MOV (R3),(R2) ; Unlink I/O packet from queue1 CLR (R3) ; Clear link pointer (clears C-bit)!10$: MOV (SP)+,R2 ; Restore R2h RTS R0 ; Return /0 .SBTTL MPTHDR - Map to Task Header Subroutine ;++!; **-MPTHDR-Map to Task Header Subroutine";#; Maps APR6 to Task Header$; %; Inputs:,&; R3 = I/O packet address ';e (; Outputs:); R0 = Task Header address*; +; Registers R0 changed,;- -MPTHDR:G-. MOV I.TCB(R3),R0 ; Get task's TCB addressQ=/ MOV T.PCB(R0),R0 ; then PCB address for task's window 0R(0 ; (PCB=Partition Control Block)61 MOV P.HDR(R0),-(SP) ; Task header in primary pool?23#4 .IF DF R$$MPL ; If RSX11M-PLUSk15 .IF DF M$$MGE ; Memory management supported? 6/7 BNE 10$ ; If NE, header is in primary poolr28 MOV P.REL(R0),@#KISAR6 ; Map to the task header91: .IF DF K$$DAS ; Kernel data spcae supported?6; MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space< .ENDC ; K$$DAS6= MOV #140000,(SP) ; Task header is at offset 140000>10$:? .ENDC ; M$$MGE@ .ENDC ; R$$MPLA+B MOV (SP)+,R0 ; R0 = Task Header address C RETURN ;D;E APR5PC MPTHDR ; Make sure MPTHDR is in APR5 addr space FGH a/I .SBTTL MAPDRV - Map APR6 to 2nd 4K of driverdJ;+*K; **-MAPDRV-Map APR6 to 2nd 4K of driverL; !M; Maps 2nd 4K of driver to APR6$N; O; Inputs:a P; DAPR6oQ; R; Ouputs:SS; NoneT;DU; Registers undisturbedV;- WMAPDRV:D1X .IF DF M$$MGE ; Memory menagement supported? Y0Z MOV DAPR6,@#KISAR6 ; Map to 2nd 4K of driver[1\ .IF DF K$$DAS ; Kernel data space supported?]6^ MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space_` .ENDC ; K$$DASab .ENDC ; M$$MGEc RETURN ; Return to callerd;e APR5PC MAPDRV ; Make sure MAPDRV is in APR5 addr space2fgh e>i .SBTTL ****************************************************>j .SBTTL * Interrupt Handling Routines *>k .SBTTL ****************************************************l+m .SBTTL INTTB - Interrupt Dispatch TableFno;S%p; INTERRUPT TRANSFER DISPATCH TABLEq;VrINTTB:)s .WORD RCVINT ; Receive Ring Interrupt*t .WORD XMTINT ; Transmit Ring Interrupt,u .WORD CMSINT ; Command Success Interrupt7v .WORD RBUINT ; Receive Buffer Unavailable Interrupt)w .WORD CMINT ; Command Error Interrupt*)x .WORD SERINT ; Status Error Interrupt )y .WORD STCINT ; State Change Interrupt z {INTMSK:B'| .WORD BIT13 ; Receive interrupt bit*(} .WORD BIT12 ; Transmit interrupt bit'~ .WORD BIT11 ; Command interrupt bitE: .WORD BIT10 ; Receive buffer unavailable interrupt bit- .WORD BIT14 ; Command error interrupt bit , .WORD BIT15 ; Status error interrupt bit+ .WORD BIT8 ; State change interrupt bit;;i,; PRIMARY COMMAND INTERRUPT DISPATCH TABLE; CODE! .WORD RSTDN ; Reset Done -4S# .WORD SLFDN ; Self-test Done -2N!CMDDTB: .WORD INTEXT ; NOP 0% .WORD GPBDN ; Get Control Block 1e& .WORD GCMDON ; Secondary Command 2 .WORD INTEXT ; Not used 3 .WORD STRDN ; Start 4O .WORD INTEXT ; Boot 5a .WORD INTEXT ; Not used 6 .WORD INTEXT ; Not used 7" .WORD PDMDON ; Poll Demand 10% .WORD INTEXT ; Sanity Timer On 11e& .WORD INTEXT ; Sanity Timer Off 12( .WORD INTEXT ; Sanity Timer Reset 13 .WORD INTEXT ; Not used 14  .WORD INTEXT ; Not used 15f .WORD INTEXT ; Not used 16N .WORD INTEXT ; Stop 17 ;o(; SECONDARY COMMAND INTERRUPT DISPATCH; CODE. CM2DTB:  .WORD INTEXT ; Nop 0N/ .WORD LSMDN ; Load and Start Microaddress 1.1 .WORD RDADN ; Read Default Physical Address 2u .WORD INTEXT ; Nop 3l+ .WORD INTEXT ; Read Physical Address 4 + .WORD ILLINT ; Write Physical Address 0029cccc52) .WORD ILLINT ; Read Multicast List 6) .WORD WMLDN ; Write Multicast List 7I+ .WORD ILLINT ; Read Ring Descriptor 10t+ .WORD WRGDN ; Write Ring Descriptor 11 % .WORD ILLINT ; Read Counters 12 - .WORD ILLINT ; Read and Clear Counters 13D! .WORD ILLINT ; Read Mode 14N! .WORD WMEDN ; Write Mode 15' .WORD RLSDON ; Read Line Status 16d0 .WORD ILLINT ; Read and Clear Line Status 17+ .WORD ILLINT ; Dump Internal Memory 20I* .WORD LOADN ; Load Internal Memory 21% .WORD ILLINT ; Read System ID 22.& .WORD ILLINT ; Write System ID 23' .WORD ILLINT ; Read Load Server 241( .WORD ILLINT ; Write Load Server 25* .WORD ILLINT ; Diagnostic function 262 .WORD MLTMO ; No response from microcode ldr27 N;R=; Secondary command interrupt dispatch table for diagnosticS@; functions interrupt service dispatch. The driver determinesB; to use this table by looking at the subfunction byte in C.FUNSA; If the sign bit is set, the function is a diagnostic functionI+; and this table is used for dispatching.3; CODE CM2NDT:d .WORD INTEXT ; Nop 0 0 .WORD ILLINT ; Load and Start Microaddress 11 .WORD DRADN ; Read Default Physical Address 2r .WORD INTEXT ; Nop 3* .WORD DRPDN ; Read Physical Address 4* .WORD DWADN ; Write Physical Address 5( .WORD DMLDN ; Read Multicast List 6* .WORD ILLINT ; Write Multicast List 7+ .WORD ILLINT ; Read Ring Descriptor 10s, .WORD ILLINT ; Write Ring Descriptor 11$ .WORD DRCDN ; Read Counters 12, .WORD DRCCD ; Read and Clear Counters 13  .WORD DRMDN ; Read Mode 14! .WORD DWMDN ; Write Mode 15r& .WORD DRSTD ; Read Line Status 16/ .WORD DRCSD ; Read and Clear Line Status 17 + .WORD ILLINT ; Dump Internal Memory 204+ .WORD ILLINT ; Load Internal Memory 21$ .WORD DRSID ; Read System ID 22% .WORD DWSID ; Write System ID 23L& .WORD DRSDN ; Read Load Server 24' .WORD DWSAD ; Write Load Server 25n t( .SBTTL UNAI - UNA Interrupt Routine;+;C%; **- UNAI - UNA INTERRUPT HANDLINGO;MJ; The conditions that can cause an interrupt are checked, and a dispatchM; made to handle each interrupt present. The order of interrupt handling isD; shown below:; Receive Ring InterruptI; Transmit Ring Interrupt; Command Success Interrupt); Receive Buffer Unavailable InterruptI; Command Error Interrupt; Software Error InterruptD; State Change interrupt;tL; The interrupt service entry will set CS.INT in the controller flag word.O; This bit indicates that an interrupt has taken place and enables the drivereF; to service all interrupts before it processes the receive buffers.; ; INPUT:; PCSR0 Interrupt Bits Set;R!; OUTPUT TO INTERRUPT ROUTINES:i; R4 = Controller State Tablec; All registers availableB; ;-UNAI:e;I"; Do some interrupt housekeeping;w/ INTSE$ XE,PR5,U$$NCT ;;; Dev.name, priority+ .IF NDF R$$MPL ;;; If NOT RSX-11M-PLUSC! MOV U.SCB(R5),R4 ;;; R4 = SCB . MOV S.CON(R4),R4 ;;; R4 = Controller index .ENDC ;;; R$$MPL  MOV R4,-(SP) ;;; Save R4 9 MOV CTABL(R4),R4 ;;; R4 = Controller State Table AddrC8 BIS #CS.INT,C.FLAG(R4) ;;; Indicate interrupt occured 9 MOV U.SCB(R5),R4 ;;; Point to Controller Status Blocki& CLRB S.CTM(R4) ;;; Disable timeout2 ADD #S.FRK+6,R4 ;;; Point to end of Fork Block. TST -4(R4) ;;; Fork Block already in use? BEQ 10$ ;;; If EQ no. MOV (SP)+,R4 ;;; Restore R4 $ RETURN ;;; Exit from interrupt5 10$: MOV (SP)+,(R4) ;;; Put saved R4 in Fork Block , CALL $FORK1 ;;; Create a system process  MOV U.SCB(R5),R0 ; R0 = SCBT< CLR S.FRK+2(R0) ; Free fork block for further interrupts  .IF DF DEBUGS BPT .ENDC : MOV CTABL(R4),R4 ; R4 = Controller State Table Address9 BIC #CS.INT,C.FLAG(R4) ; Clear interrupt seen flag bit *00:_tt tfDATA CALL MAPDRV ; Map to 2nd 4K of driver 5 MOV R0,-(SP) ; Save registers not saved by INTSX$  MOV R1,-(SP) ; ... MOV R2,-(SP) ; ... MOV R3,-(SP) ; ...(! MOV C.CSR(R4),R0 ; Get PCSR0 address0" MOV (R0),-(SP) ; Get PCSR0 contents on stack=# MOVB 1(SP),1(R0) ; Clear all interrupt bits that were sete$ % ;p)& ; Cycle through the possible interrupts' ; -( CLRB (SP) ; Just keep the interrupt bitse') CLR R0 ; Initialize index registera* 20$:>+ BIT INTMSK(R0),(SP) ; Is this the reason for the interrupt, BEQ 30$ ; If EQ, No...v- MOV R0,-(SP) ; Save R0,. CALL @INTTB(R0) ; Call interrupt routine/ MOV (SP)+,R0 ; Restore R00 01 30$: TST (R0)+ ; Bump pointer to next reason/2 BIC INTMSK-2(R0),(SP) ; Clear out old reasonP)3 BNE 20$ ; If NE, Still more bits setr4 5 ; .6 ; All interrupts handled - dismiss interrupt7 ; N8 ; At this point the driver tests if there are some received messages waiting9 ; to be processed.: ;T$; ; o If not, the driver just exitsM< ; o Otherwise, the driver tests if another interrupt has taken place while '= ; servicing the current interrupt.e> ;MH? ; o If yes, just exit current interrupt. Next interrupt will process#@ ; the received messages.eEA ; o If their had not been an interrupt while servicing the current JB ; interrupt, the driver will finish processing the received messages.C ;vD <E BIT #CS.ENP,C.FLAG(R4) ; Did we see a receive end packet?F BEQ 40$ ; No .G BIT #CS.INT,C.FLAG(R4) ; Interrupt pending?2H BNE 40$ ; Yes, let next interrupt process theI ; ... received messages.e+J CALL RCCMP ; process received messagessK 8L CALL GTRBF ; Make sure all entries have rcv buffersM .N 40$: TST (SP)+ ; Restore the stack pointer$O MOV (SP)+,R3 ; Restore registersP MOV (SP)+,R2 ; ...Q MOV (SP)+,R1 ; ...R MOV (SP)+,R0 ; ...(S RETURN ; Exit interrupt processingT ;U APR5PC $XEINT ; Make sure $XEINT is in APR5 addr space V W X I1Y .SBTTL RCVINT - Receive Ring Interrupt HandlerYZ [ ;+\ ;t/] ; **- RCVINT - RECEIVE RING INTERRUPT HANDLERs^ ; A_ ; This routine is called when a receive ring interrupt has beenaJ` ; detected. The ring is checked for the next current ring entry. If nonea ; exist the routine exits.b ;sGc ; If a buffer has been received, the ring info is saved in the bufferPEd ; header and the buffer is queued for receive done processing. AndX3e ; the ring is scanned for another receive packet.f ; Eg ; The ring is emptied. All interrupts serviced before the receivedh ; messages are completed. i ;R j ; INPUTS:'k ; R4 = Controller State Table addressel ; m ;- n RCVINT:so ;a&p ; Loop to retreive the receive chainq ;e2r 10$: CALL GCRRE ; Get receive done ring packet(s BEQ 50$ ; No more completed entriest BCC 20$ ; No errorsu 0v CALL CHKERR ; Check if we have a real errorw BCC 20$ ; All is wellx +y MOV R4,R2 ; Generate error packet addrez ADD #C.LOG,R2 ; ... 4{ MOV #ER.RCV,E.TYPE(R2) ; Put error code in packet=| MOVB RG.FLG(R1),E.FLG(R2) ; Put Ring's flag byte in packet7} MOVB RG.ERR(R1),E.ERR(R2) ; Put error byte in packetC&~ CLR R3 ; No associated I/O packet' CALL ERLOG ; Log the receive error  20$:9 MOV RG.VAD(R1),R3 ; R3 = Virtual address of rec.buff.i7 MOVB RG.FLG(R1),M.ERR(R3) ; Save error word of entryk8 MOVB RG.ERR(R1),M.ERR+1(R3) ; Save ring error by also> MOV RG.RLN(R1),M.MLEN(R3) ; Save length of received message 7 $QPKT C.RCVD ; Queue buffer for receive completion 6 BITB #RF.ENP,RG.FLG(R1) ; Did we get an end packet? BEQ 30$ ; NoR@ BIS #CS.ENP,C.FLAG(R4) ; Indicate, we have seen an end packet 30$:$ CALL RLPKT ; Release ring entry BR 10$ ; Get the rest > 50$: CALLR GTRBF ; Refresh the receive buffer ring ; LK705 ;**-3  * .SBTTL CHKERR - Check out receive error ;+& ; **-CHKERR- Check out receive error ;LH ; This routine makes sure that, in00B9cccc fact, there is an error. There are; ; two conditions under which a CRC error is not an error:; ;w ; 1. Loop back mode@ ; 2. The transmitting controller is the receiving controller. ; G ; In the above cases, the controller is merely saying that no CRC wase ; generated. ;: ; Inputs:  ; R1 = Receive ring entry  ;; ; Outputs:# ; C-bit set on real error present- ; C-bit clear for no error ;  ; Registers not disturbede ;-@ CHKERR: BITB #RF.ENP,RG.FLG(R1) ; Is this an end ring entry?2 BEQ 10$ ; Only end entry has correct statusF BITB #RF.FRM!RF.OFL,RG.FLG(R1) ; Frame Error or Message overflow?( BNE 30$ ; Yes, that is real errorO BITB #/400,RG.ERR(R1) ; Buffer length error or Unibu; LK705a: BNE 30$ ; ... time out error. That is error! ;**-1 6 BIT #MD.LOO,C.MODE(R4) ; Are we in loopback mode?- BNE 10$ ; Yes, we always get CRC error ; ... in loopback mode.; MOV C.STRT(R4),R0 ; Get 1st buffer of current receive?) BEQ 30$ ; None found, assume errorc ;tG ; It is possible that C.STRT(R4) does not contain the starting buffer?M ; for the currently received message. If there was no start entry received(I ; for this message, then the message will be dicarded by RCCMP routine.  ;.E CMP C.PADD(R4),M.SADD(R0) ; Was message transmitted by this UNA?p BNE 30$ ; No$( CMP C.PADD+2(R4),M.SADD+2(R0) ; Well? BNE 30$ ; Nok( CMP C.PADD+2(R4),M.SADD+2(R0) ; Well? BNE 30$ ; Noe9 10$: BICB #RF.ERR!RF.CRC,RG.FLG(R1) ; Clear error bits " CLC ; Indicate good return 20$: RETURN ; ' 30$: SEC ; Indicate error returns BR 20$ ; Return  y2 .SBTTL XMTINT - Transmit Ring Interrupt Handler  ;+ ; 0 ; **- XMTINT - TRANSMIT RING INTERRUPT HANDLER ; B ; This routine is called when a transmit ring interrupt has beenH ; generated. The ring is checked for the next completed entry. If none ; exists the routine exits.B ;$E ; If an entry is found the entry is checked for any errors. ErrorsH ; are logged by the driver. If the transmit was error free the statusI ; code is saved in the I/O packet at I.PRM and processing of the packetM ; continues. ;I ; INPUTS:l ; R4 = Controller State TableT ;A ;- XMTINT:U ;N4 ; Loop to retreive the next transmit chain on ring ; 8 10$: CALL GCXRE ; Get next completed xmit ring entry( BEQ 70$ ; No more completed entries' MOV C.XMTP(R4),R3 ; R3 = I/O packet " BCC 20$ ; Successful transmit 5 MOV R4,R2 ; Generate pointer to error log packet  ADD #C.LOG,R2 ; ...e4 MOV #ER.XMT,E.TYPE(R2) ; Put error code in packet= MOVB RG.FLG(R1),E.FLG(R2) ; Put Ring's flag byte in packetN7 MOVB RG.ERR(R1),E.ERR(R2) ; Put error byte in packetM$ CALL ERLOG ; Log transmit error 5 20$: MOV IP.EXT(R3),R2 ; R2 = I/O packet extensione8 BISB RG.ERR(R1),IX.FCN+1(R2) ; Save error status bits# BISB RG.FLG(R1),IX.FCN(R2) ; ...3 $ CALL RLPKT ; Release ring entry 1 BITB #RF.STP,RG.FLG(R1) ; Was this start entryo BEQ 30$ ; No@ MOV C.XHDR(R4),@RG.VAD(R1) ; Put transmit header in free list" MOV RG.VAD(R1),C.XHDR(R4) ; ..." BR 10$ ; See if there is more / 30$: BITB #RF.ENP,RG.FLG(R1) ; End-of-packet?n BEQ 10$ ; NoR  B MOV #XMTTIM,C.XMTT(R4) ; Assume xmit not active, restart timer.? MOV (R3),C.XMTP(R4) ; Remove I/O packet from xmit pending Qi BNE 40$ ; More in ring?) CLR C.XMTT(R4) ; Clear transmit timeri 40$:2 .IF DF M$$EXT ; If extended memory supported? + MOV RG.UMR(R1),R2 ; R2 = UMR wait blockA+ ADD #10,R2 ; R2 = UMR assignment blockM MOV R3,-(SP) ; Save R3 CALL $DEUMR ; Deassign UMR  MOV (SP)+,R3 ; Restore R3G  MOV C.UCB(R4),R0 ; R0 = UCB$7 MOV U.UCBX+6(R0),@RG.UMR(R1); Free up UMR wait block $ MOV RG.UMR(R1),U.UCBX+6(R0) ; ...  .ENDC ; M$$EXT  ;r  ; Got the whole transmit chain ; > MOV R4,-(SP00J_tt tfDATA) ; Save controller state table pointer ; LK7055 ; ... we have to do this in case GTPST ; LK705 " ; ... distroys it ; LK705; CALL GTPST ; Restore Port Status Table pointer ; LK705R@ MOV (SP)+,R4 ; Restore controller state table pointer; LK705 ; LK705 % TST R5 ; Port closed? ; LK705M BNE 45$ ; No ; LK705e1 CALL IEABO ; Yes, abort the request ; LK705)* BR 10$ ; Complete next item ; LK705 45$: ; LK705t+ MOV #IS.SUC,R0 ; Assume success ;**-2l# MOV I.PRM+4(R3),R1 ; Byte count  1 MOV IP.EXT(R3),R2 ; R2 = I/O packet extension " BIT #RF.ERR,IX.FCN(R2) ; Error? BEQ 60$ ; No 3 BIT #RE.RTY,IX.FCN(R2) ; Retry due to collisions; BEQ 50$ ; No + DECB I.FCN(R3) ; Should we try it again0 BEQ 50$ ; Noo< MOV C.XMWQ(R4),(R3) ; Yes, insert at front of wait queue MOV R3,C.XMWQ(R4) ; ...q BR 10$ ; Go, do next ! ," 50$: MOV #IE.ABO&377,R0 ; R0 = Abort code# CLR R1 ; R1 = 0 byte countm1$ 60$: CALL XMTDN ; Do transmit done processingo% BR 10$ ; Do next if any& 0' 70$: CALLR INIXM ; Try to start up transmits( ) * 4+ .SBTTL CMSINT - Command Success Interrupt Handler2, .SBTTL CMEINT - Command Error Interrupt Handler- ;+. ;o2/ ; **- CMSINT - Command Success Interrupt Handler00 ; **- CMEINT - Command Error Interrupt Handler1 ;MD2 ; These routines are called when a command done interrupt has beenM3 ; detected. If the command completes with success the C-Bit is cleared upon K4 ; entry to the command done routines. If the command completes with error0=5 ; the C-Bit is set when entering the command done routines..6 ; H7 ; The command function (C.FUNS=Primary/secondary func code) is used toH8 ; dispatch to the command done routine. If the sign bit is set in theJ9 ; function code indicates the command was issued by the non-DLX functionI: ; processor and CM2NDT table is used to dispatch to the done processor. ; ;e < ; INPUTS:l= ; R4 = Controller State Tablee7> ; C.CFNC = Address of I/O packet for current functione-? ; C.FUNS = Primary/Secondary function codess@ ;- A .ENABL LSBeB C CMSINT:oD ;sE ; Command success interruptiF ;.,G CLR R0 ; Set up "ROL R0" for zero C-bitH BR 10$ ; Join common codeI J ; *K ; Command error interrupt (also timeout)L ; M CMINT:7N MOV #100000,R0 ; Set up "ROL R0" for non-zero C-bitsO 10$:-P CLRB C.CTMR(R4) ; Clear any pending timero.Q MOV C.CFNC(R4),R3 ; Get I/O packet address/R CLR C.CFNC(R4) ; Clear I/O packet save wordt2S MOVB C.FUNS(R4),R1 ; Get primary function code.T BIC #100000,R1 ; Make sure sign bit is off U ASL R1 ; Make it word indexV ROL R0 ; Set/Clear C-bit +W CALLR @CMDDTB(R1) ; Dispatch to routine X ,Y INTEXT: RETURN ; Used for commands with"Z ; ... no completion routine[ \ ;V] ; Secondary command dispatch^ ;n_ GCMDON: ROR R0 ; Save C-bitT3` CALL GTPST ; Restore Port Status Table pointer,,a MOVB C.FUNS+1(R4),R1 ; Get function byte*b BMI 20$ ; Must be diagnostic functionc d ASL R1 ; Make it word indexe ROL R0 ; Set/Clear C-bitu)f JMP @CM2DTB(R1) ; Dispatch to routineog (h 20$: BIC #177600,R1 ; Clear sign bits i ASL R1 ; Make it word indexj 1k .IF DF M$$MGE ; Memory management supported?hl 5m MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic bufferrn 1o .IF DF K$$DAS ; Kernel data space supported?i6p MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceq .ENDC ; K$$DASr s .ENDC ; M$$MGEt u ROL R0 ; Set/Clear C-bitu.v MOV C.DGBP(R4),R0 ; Restore buffer pointer*w JMP @CM2NDT(R1) ; Go to done processorx ;y APR5PC GCMDON ; Make sure GCMDON is in APR5 addr spacesz { .DSABL LSB | } ~ ;+ ; **-PDMDON- Poll Demand Done; ;rF ; This routine clears the C.CFNC flag and the CS.POL flag bit in theD ; controller flag word (C.FLAG) and passes control to the function ; processor (FNINI). ;t ; INPUTS:a ; R4 = Controller State Table ; PDMD00R9ccccON:  BCS 10$ ; Fatal9 CALLR FNINI ; Try to initiate another function ;**-1r 10$: CALLR FTL ; Fatal error   r7 .SBTTL RBUINT - Receive Buffer Unavailable Interruptd  ;+ ; 5 ; **- RBUINT - Receive Buffer Unavailable InterruptD ;G ; This routine is called when a buffer unavailable interrupt has beent9 ; generated. The event is logged via the error logger.  ;u ; INPUTS:r ; R4 = Controller State TableS ;  ; REGISTERS MODIFIED:a ; R0,R1,R2 ;N ;-9 RBUINT: MOV R4,R2 ; Generate error log packet pointerh ADD #C.LOG,R2 ; ... 4 MOV #ER.RBU,E.TYPE(R2) ; Put error code in packet CLR R3 ; No I/O packetv* CALL ERLOG ; Log the error ; LK705 ; LK705e6 CALL GTRBF ; Refresh receive buffer ring ; LK705. BNE 10$ ; We added some buffers ; LK705< RETURN ; No receive buffs, return from int serv; LK705 ; LK705 > 10$: CALLR POLRG ; Tell UNA to get receive buffers ; LK705 ;**-3 1 .SBTTL SERINT - Status Error Interrupt Handlero1 .SBTTL STCINT - State Change Interrupt HandlerT, .SBTTL ILLINT - Illegal Interrupt Handler ;+ ;p/ ; **- SERINT - Status Error Interrupt Handler5/ ; **- STCINT - State Change Interrupt Handler * ; **- ILLINT - Illegal Interrupt Handler ;dI ; These routines are called as a result of the corresponding interruptstL ; being generated. The error is logged. These error are considered fatal. ;b ; INPUTS:5 ; R4 = Controller State TableB ;E ; REGISTERS MODIFIED:r ; R0,R1,R3 ;B ;- SERINT:a ;n2 ; Queue up a control request to read line status ;n9 BIS #CS.GST,C.FLAG(R4) ; Indicate get status in C.FLAGa+ CALLR FNINI ; Try to do the Get Statusp ;d/ ; We get here after the Read Status interrupt ;4 RLSDON: BIT #1,R3 ; Is this driver's get status?) BEQ 10$ ; Go to normal service entryT1 BIC #CS.GST,C.FLAG(R4) ; Clear Get Status flaga1 MOV R4,R2 ; Generate eror log packet pointera ADD #C.LOG,R2 ; ... = MOV #ER.SER,E.TYPE(R2) ; Put status error code into packet 7 MOV C.PCBP(R4),R0 ; R0 = Port Control Block pointerB3 MOV (R0)+,E.PCB(R2) ; Put Status word in packeta MOV (R0)+,E.PCB+2(R2) ; ... MOV (R0)+,E.PCB+4(R2) ; ... MOV (R0)+,E.PCB+6(R2) ; ... MOV C.CSR(R4),R0 ; Get CSR3 MOV (R0),E.CSR0(R2) ; Put PCSR0 in error packet 3 MOV 2(R0),E.CSR1(R2) ; Put PCSR1 in error packet  CLR R3 ; No I/O packetV CALL ERLOG ; Log the errore( CALLR FTL ; Do UNA fatal processing : 10$: CALLR RLSDN ; Go to Read Status interrupt service STCINT:0 ILLINT:r1 BIT #CS.OFL,C.FLAG(R4) ; Is controller online?  BEQ 10$ ; Yes RETURN ; " 10$: MOV C.CSR(R4),R0 ; Get CSR. MOV R4,R2 ; Generate error packet pointer ADD #C.LOG,R2 ; ...t4 MOV #ER.STC,E.TYPE(R2) ; Put error type in packet1 MOV (R0),E.CSR0(R2) ; PCSR0 into error packetp1 MOV 2(R0),E.CSR1(R2) ; PCSR1 into error packet $ CLR R3 ; There is no I/O packet( CALL ERLOG ; Log State Change Error( CALLR FTL ; Do UNA fatal processing  .SBTTL CLOCK - Clock Routine ;+ ; **-CLOCK-Clock Routine ;A ; This routine performs all the timing services for the driver.G ;- ;M ; Inputs:G ; R4 = Controller State TableA< ; C.CTMR = Controller Timer. Times out command functions.# ; C.XMTT = Transmit timeout timer - ; C.RCVW = I/O packet in receive wait queue( ; I.FCN holds timeout value  ;R ; Outputs:C ; None zero timers are decremented. Each timer that goes to zeroLA ; will cause a specific timeout service routine to be executed.u ;C ; If the wait time of receive I/O packets has expired, the packet B ; is removed from the receive wait list and I/O done with IE.TMO# ; status is returned to the user.T ;C ;l4 CLOCK:: TSTB CLKFG ; Is clock running? ; LK705& BNE 30$ ; Yes, just exit. ;**-1 * TST CLKBK ; Do we have a clock block? BNE 20$ ; Yes 3 00Z_tt tfDATA10$: MOV #C.LGTH,R1 ; R1 = Length of clock block ) CALL $ALOCB ; Allocate a clock blocku BCS 10$ ; Not available. MOV R0,CLKBK ; Save address of clock block 20$:+ INCB CLKFG ; Indicate clock is running# MOV CLKBK,R0 ; R0 = Clock Blockl4 MOV #CLKTMO,C.SUB(R0) ; Set addr of timer service( CLR R1 ; R1 = High order delta time( MOV $TKPS,R2 ; R2 = Ticks per second MOV R4,-(SP) ; Save R4 MOV R5,-(SP) ; Save R56 MOV R4,R5 ; R5 = Identifier (Contr.State Tbl.Ptr)+ MOV #C.SYST,R4 ; Declare system routinec5 CALL $CLINS ; Request insertion into clock queue1 MOV (SP)+,R5 ; Restore R5, MOV (SP)+,R4 ; Restore R4b# 30$: RETURN ; Return to callera  ;i) ; We get here after clock queue timeoutl ;  CLKTMO:T* CALL MAPDRV ; Map to 2nd 4K of driver! 4" MOV #CTABL,CTPTR ; Save controller table pointer3# MOV @CTPTR,R4 ; Get next contr. state table ptr 2$ CLR CACUM ; Clear controller time accumulator% 10$:%& TSTB CLKFG ; Clock been stopped? ' BEQ 80$ ; Yes, just exit.( .) MOV C.UCB(R4),R0 ; R0 = Unit Control Block0* MOV U.DCB(R0),R0 ; R0 = Device Control Block%+ TST D.DSP(R0) ; Driver in memory? , BEQ 80$ ; No, just exit.t- '. TST C.CTMR(R4) ; Command timer set?T/ BEQ 30$ ; NoV&0 DEC C.CTMR(R4) ; Dec command timer1 BNE 20$ ; No timeout yetr.2 CALL CMINT ; Execute timeout for commands<3 20$: BIS C.CTMR(R4),CACUM ; Accum.time for clock insertion4 ,5 30$: TST C.XMTT(R4) ; Transmit timer set?6 BEQ 50$ ; No$#7 DEC C.XMTT(R4) ; Dec xmit timerB8 BNE 40$ ; No timeout yeto)9 CALL FTL ; Do fatal error processingr': CLR CACUM ; Clear time accumulatore ; BR 80$ ; Do next controller<< 40$: BIS C.XMTT(R4),CACUM ; Accum.time for clock insertion= 7> 50$: MOV R4,R3 ; Generate pointer to receive wait Q ? ADD #C.RCVW,R3 ; ...@ 60$:1A MOV R3,R2 ; Save privious I/O packet pointer(.B MOV (R3),R3 ; Get next I/O packet in listC BEQ 80$ ; No moreD ,E TSTB I.FCN(R3) ; I/O packet's timer set?"F BEQ 60$ ; No, don't bother itG #H DECB I.FCN(R3) ; Dec timer byte I BEQ 70$ ; not yet timed out9J BISB I.FCN(R3),CACUM ; Accum.time for clock insertiono%K BR 60$ ; Process next I/O packet L 0M 70$: MOV (R3),(R2) ; Dequeue packet from listN /O MOV R2,-(SP) ; Save privious packet pointerW#P MOV #IE.TMO,R0 ; Timeout statusSQ CLR R1 ; ...c)R CALL RQDON ; Return timeout I/O done/*S MOV (SP)+,R2 ; Restore privious packetT &U MOV R2,R3 ; Make privious current(V BR 60$ ; Do next I/O packet in listW 80$:,X ADD #2,CTPTR ; Point to next controller6Y MOV @CTPTR,R4 ; R4 = Next controller's state table.Z BNE 10$ ; Process next controllers timers5[ CLRB CLKFG ; Assume timers done for this contrl.k$\ TST CACUM ; Any more timers set%] BEQ 90$ ; Yes, restart the clockE^ CALL CLOCK ; Restart clockR_ 90$:` RETURN ; Return to execta ;b APR5PC CLKTMO ; Make sure CLKTMO is in APR5 addr spacec d e f 0g .IF DF E$$DVC ; Device error log supported?h i j .SBTTL ERLOG - Error Logger k ;+l ; **-ERLOG-Error logger@m ;,n ; Interface to $LOGERro ;a p ; Inputs:B9q ; R3 = Address of I/O packet (or zero if no I/O packet) r ; R4 = Controller State Tablets ; t ; Outputs:u ; Nonev ;ew ; All registers preservedex ; )y ERLOG: CALL SALL ; Save all registersR.z MOV C.UCB(R4),R5 ; R5 = Unit Control Block0{ MOV U.SCB(R5),R4 ; R4 = Status Control Block9| CLRB S.ROFF(R4) ; 0 offset to 1st reg of err.log.pkt.oB} MOV #/2,S.RCNT(R4) ; Save # of reg. to copy for err.log/~ MOV #E.SIZE,R1 ; R1 = Error log packet size$3 MOV R3,S.PKT(R4) ; Save I/O packet for err.log.a' BNE 10$ ; We do have an I/O packet=$ CLR R4 ; No I/O packet, no SCB.  ; ( ; R1 = Error log packet size in bytes1 ; R3 = I/O packet address (0 if no I/O packet)! ; R4 = SCB (0 if no I/O packetn ; R5 = UCBM ;S0 10$: CALL $LOGER ; Attempt to log er00b9ccccr packet) BCS 40$ ; Unable to log error packetp MOV U.SCB(R5),R4 ; R5 = SCB4 CLR R2 ; Get ready for BISB0 BISB S.RCNT(R4),R2 ; R2 = Word count to copy0 MOV 2(SP),R0 ; Generate error packet pointer ADD #C.LOG,R0 ; ...W@ MOV C.MODE-C.LOG(R0),E.MODE(R0) ; Save current mode in packet7 20$: MOV (R0)+,(R1)+ ; Copy data to error log packet  DEC R2 ; ...s BNE 20$ ; ..., TST S.PKT(R4) ; Do we have an I/O packet BNE 30$ ; Yes$ CLR R4 ; No I/O packet, no SCB., 30$: CALL $FNERL ; Finish this error log7 40$: MOV 2(SP),R2 ; Generate pointer to error packet  ADD #C.LOG,R2 ; ....3 MOV #/2,R3 ; Error packet size in wordsR 50$: CLR (R2)+ ; Zero packet DEC R3 ; ...  BNE 50$ ; ...6 CALL MAPDRV ; Make sure we are mapped to driver's. RETURN ; ... APR6 space before returning 9 APR5PC ERLOG ; Make sure ERLOG is in APR5 addr space)  .IFFe 0 ERLOG: RETURN ; NOP if no error log support  .ENDC ; E$$DVC   # .SBTTL RCCMP - Receive complete2 ;+ ; **-RCCMP-Receive completep ; M ; This routine is called after all the interrupts have been serviced. ThisRL ; routine scans the receive complete pending queue for a complete message.J ; Upon finding a complete message, the destination is found and the data" ; transfered to the user buffer. ;- ; Inputs:s ; R4 = Controller State Table ;  ; Registers modified:R ; R0, R1, R2, R3 ;g0 RCCMP: CALL MAPDRV ; Map to 2nd 4K of driver  CLR R1 ; Init error status; MOV #-<6+6+2>,C.RML(R4) ; Assume normal receive overheadi 10$:; MOV C.RCVD(R4),R5 ; Get first item of received messagest" BEQ 60$ ; No more, Just exit.- BITB #RF.STP,M.ERR(R5) ; Start of message?i BNE 30$ ; YesE MOV (R5),C.RCVD(R4) ; No, deque receive buffer from received listf> MOV C.RBFL(R4),(R5) ; Insert buffer in free receive buffer MOV R5,C.RBFL(R4) ; ... list# BR 10$ ; Find start of messageD 20$:) MOV (R5),R5 ; Get next message blockn/ BEQ 60$ ; No more, wait for rest to arrives 30$:; BITB #RF.ENP,M.ERR(R5) ; Is this the end of the message?s BEQ 20$ ; Nom 1 BIC #170000,M.MLEN(R5) ; Clear high order bitsR1 MOV M.MLEN(R5),C.RML(R4) ; Save message length;@ SUB #4+6+6+2,C.RML(R4) ; Account for CRC/Dest/Source/protocol - BITB #RF.ERR,M.ERR(R5) ; Error in message? + BNE 50$ ; Discard messages with errors  8 MOV C.RCVD(R4),R5 ; Get buffer with protocol/address+ MOV R4,R1 ; Point to protocol listheadQ ADD #C.PROL,R1 ; ...; 40$: MOV (R1),R1 ; Get addr of next protocol list entry ! BNE 70$ ; If NE, we have one$& 50$: CALLR 210$ ; ... else no more! 60$: CALLR 200$ ; Just returnM  70$: CMP PL.PRO(R1),M.PRO(R5)t" BNE 40$ ; If NE, keep looking , MOVB PL.FLG(R1),R0 ; Save protocol flags G MOV PL.EXC(R1),R3 ; Assume this is an exclusive or default protocolr BIT #LF.EXC,R0 ; Is it?  BNE 100$ ; If NE, it is 4 ADD #PL.ADD,R1 ; Point to address chain listhead> 80$: MOV (R1),R1 ; Get address of next address chain entry, BNE 90$ ; If NE, another entry to check+ BIT #LF.DEF,R0 ; Default owner enabled?e, BEQ 50$ ; If EQ, no ... toss the packet/ BR 100$ ; Process packet for default ownerE H 90$: CMP M.SADD(R5),AD.ADD(R1) ; Compare address of received message, BNE 80$ ; ... to protocol's addresses" CMP M.SADD+2(R5),AD.ADD+2(R1) ; BNE 80$ ;" CMP M.SADD+4(R5),AD.ADD+4(R1) ; BNE 80$ ; 2 MOV AD.PRT(R1),R3 ; Get address of owning port 7 100$: BIT #1,M.DADD(R5) ; Was this message sent to an ; ... multicast address?D BEQ 120$ ; If EQ, nol) MOV R3,R1 ; Get pointer to multicast / ADD #P.MCST,R1 ; ... address chain listhead  7 110$: MOV (R1),R1 ; Get pointer to next multicaste ; ... address block BEQ 50$ ; If EQ, no moreeB CMP M.DADD(R5),ML.ADD(R1) ; Compare message multicast address0 BNE00j_tt tfDATA 110$ ; ... to the multicast addresses/ CMP M.DADD+2(R5),ML.ADD+2(R1) ; ... enabled.t BNE 110$ ;1" CMP M.DADD+4(R5),ML.ADD+4(R1) ;  BNE 110$  120$:l4 BIT #LF.PAD,R0 ; Does this protocol use padding? BEQ 130$ ; If EQ, not; MOV M.DATA(R5),C.RML(R4) ; yes, first word is byte count: MOV #2,C.POVH(R4) ; Account for byte count in 1st word ; ... of messagek ;BJ ; At this point we have found the destination port. Now we have to find- ; the I/O packet associated with that port.t ;l 130$:d' MOV R3,R5 ; Put port address in R5;, MOV R4,R3 ; Generate receive wait Q ptr ADD #C.RCVW,R3 ; ... 140$:01 MOV R3,R2 ; Save privious I/O packet pointero& MOV (R3),R3 ; Get next I/O packet. BEQ 50$ ; None there, discard the message1 MOV IP.EXT(R3),R1 ; R1 = I/O packet extensiono6 CMP IX.FCN(R1),R5 ; I/O packet owned by this port? BNE 140$ ; Loop till found & MOV (R3),(R2) ; Dequeue I/O packet  ;hH ; We found the owner of the message. Now we must transfer the message ; to the user buffer. ;V4 MOV #IE.DAO&377,-(SP) ; Assume data overrun error! 2" MOV I.PRM+4(R3),R1 ; Get size of user's buffer:# CMP C.RML(R4),R1 ; Is data block > than user's buffer?$ BHI 150$ ; If HI, yes % MOV C.RML(R4),R1 ; get count0& MOV #IS.SUC&377,(SP) ; ... and return success:' 150$: MOV R1,C.RML(R4) ; Save byte count for completion/( MOV R1,-(SP) ; Save byte count for I/O donea) 1* 160$: MOV R3,-(SP) ; Save registers R3, R4, R5 + MOV R4,-(SP) ; ..e, MOV R5,-(SP) ; ..e- &. MOV C.RCVD(R4),R0 ; Get 1st buffer4/ ADD #M.DADD,R0 ; Point to destination addr field70 MOV (R0)+,P.RDAD(R5) ; Save destination addr in porta1 MOV (R0)+,P.RDAD+2(R5) ; ... 2 MOV (R0)+,P.RDAD+4(R5) ; ...C23 MOV (R0)+,P.RSAD(R5) ; Save source addr in port4 MOV (R0)+,P.RSAD+2(R5) ; ...O5 MOV (R0)+,P.RSAD+4(R5) ; ... 46 MOV (R0)+,P.RPRO(R5) ; Save protocol addr in port7 ,8 MOV R4,R5 ; R5 = Controller State Table9 170$:R*: CALL MAPDRV ; Map to 2nd 4K of driver; 7< MOV #M.DBSZ,R0 ; R0 = Byte count (assume full buff)D= SUB C.POVH(R5),R0 ; ...n> 5? CMP R0,C.RML(R5) ; Less than full receive buffer?n@ BLO 180$ ; No3A MOV C.RML(R5),R0 ; Yes, use byte count in C.RML55B 180$: SUB R0,C.RML(R5) ; Account for current block C #D MOV DAPR6,R1 ; Source APR5 bias E +F MOV C.RCVD(R5),R2 ; Source displacementR8G MOVB M.ERR(R2),-(SP) ; Save START/STOP bits on stack1H ADD #M.DATA,R2 ; Point to data area of bufferV6I BITB #RF.STP,(SP)+ ; Is this 1st buffer of messageJ BNE 185$ ; Yese?K SUB #M.DATA-M.DADD,R2 ; No, so data starts where destination5?L ADD #M.DATA-M.DADD,R0 ; Account for added data in this blockCCM SUB #M.DATA-M.DADD,C.RML(R5); Subtract added data from remainder)2N BGE 185$ ; We have not exceeded the remainder6O ADD C.RML(R5),R0 ; Adjust byte count of this block-P CLR C.RML(R5) ; Indicate this block is it 0Q 185$: ; ... address is in the first buffer"R MOV R0,-(SP) ; Save byte countS 5T ADD C.POVH(R5),R2 ; Add padding overhead, if any. #U SUB #20000,R2 ; Biased for APR5N8V CLR C.POVH(R5) ; Padding overhead only for 1st blockW 1X MOV I.PRM+2(R3),R4 ; Destination displacement.(Y MOV @I.PRM(R3),R3 ; Destination APR6Z [ CALL $BLXIO ; Copy the data\ !] MOV (SP)+,R0 ; Get byte countC)^ MOV 4(SP),R3 ; Get I/O packet addresso1_ ADD R0,I.PRM+2(R3) ; Increment buffer pointer` :a MOV C.RCVD(R5),R0 ; Dequeue buffer From receive done Q)b BEQ 230$ ; Something is wrong, stop!,;c MOV (R0),C.RCVD(R5) ; Dequeue buffer from received listsd 4e MOV C.RBFL(R5),(R0) ; Insert buffer in free listf MOV R0,C.RBFL(R5) ; ...Mg 0h BIT #RF.ENP,M.ERR(R0) ; Was it an END buffer?i BEQ 187$ ; No'j TST C.RML(R5) ; Is char count zero?a k BNE 230$Vl %m 187$: TST C.RML(R5) ; Are we done?R"n BNE 170$ ; No, get next blocko /p MOV (SP)+,R5 ; Restore registers R5, R4, R3Mq MOV (SP)+,R4 ; ...r MOV00r9cccc (SP)+,R3 ; ...s 5t TST I.PRM+6(R3) ; Auxilliary char. buffer exists?(#u BEQ 190$ ; If EQ, none present 7v CALL RCVCH ; Process received msg. characteristicsew x 190$:t=y MOV (SP)+,I.PRM+4(R3) ; Save byte count and I/O completionW3z MOV (SP)+,I.PRM+2(R3) ; ... status in I/O packetL3{ CALL RCVDN ; Post completion on the I/O packet$| BR 220$ ; Continue } ;~ 200$: BIC #CS.ENP,C.FLAG(R4) ; Clear end packet seen flag;3 CALLR GTRBF ; Add some buffers to receive ring. @ 210$: MOV C.RCVD(R4),R5 ; Get first item of received messages BEQ 200$ ; We must be donef2 MOV (R5),C.RCVD(R4) ; Deque from received list7 MOV C.RBFL(R4),(R5) ; Insert into receive free listM MOV R5,C.RBFL(R4) ; ...I' BITB #RF.ENP,M.ERR(R5) ; Last block?; BEQ 210$ ; No9 220$: CALLR RCCMP ; look for another received message$ 4 230$: MOV (SP)+,R5 ; Restore registers R5, R4, R3 MOV (SP)+,R4 ; ... MOV (SP)+,R3 ; ...* MOV (SP)+,I.PRM+4(R3) ; Save byte count TST (SP)+ ; Tidy stack;4 MOV #IE.DAO&377,I.PRM+2(R3) ; Indicate data error" CLR I.PRM+4(R3) ; Zero receive! CALL RCVDN ; Post completion # BR 220$ ; Process next receivee   s> .SBTTL ****************************************************> .SBTTL * QIO UNA characteristics processing routines *> .SBTTL **************************************************** = .SBTTL RCVCH - Process receive auxilliary characteristics. ;+7 ; **-RCVCH-Process receive auxilliary characteristicsT ;tI ; Process the characteristics present in the auxilliary characteristicsR" ; buffer on the receive request. ;- ; Inputs:" ; R3 = Address of the I/O packet< ; I.PRM+6 - Virtual address of the characteristics buffer3 ; I.PRM+10- Length of the characteristics bufferc ; R4 = Controller State TableB ; R5 = Port State table* ;* ; Registers modified:  ; R0, R1, R2 ;P7 RCVCH: MOV IP.EXT(R3),R0 ; R0 = I/O packet extensionR 1 .IF DF M$$MGE ; Memory management supported? . MOV IX.AUX(R0),@#KISAR6 ; Map to AUX buffer 1 .IF DF K$$DAS ; Kernel data space supported?s6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spcae .ENDC ; K$$DAS  .ENDC ; M$$MGE A MOV I.PRM+6(R3),R0 ; Point to start of characteristics buffer1 MOV R0,P.WORK(R5) ; Create end of user buffert9 ADD I.PRM+10(R3),P.WORK(R5) ; P.WORK = End user buffer  > 10$: MOV #CS.IGN,R1 ; Assume characteristic will be ignored5 MOV (R0),R2 ; Get next characteristics type code 0 SUB #CC.ADR,R2 ; Normalise for DLX functions4 BLT 20$ ; If LT, not one of our characteristics ASL R2 ; Form word offset CMP R2,#RCMAX ; In range?  BHIS 20$ ; If HIS, no- CLR C.DATO(R0) ; Assume no data available 5 CALL @RCVTBL(R2) ; Dispatch to processing routine  @ 20$: MOV R1,C.STAT(R0) ; Return status of this characteristic4 ADD C.DATI(R0),R0 ; Point to next characteristic ADD #C.CHRL,R0 ; ...( CMP R0,P.WORK(R5) ; Are we done yet? BLO 10$ ; If LO, no * CALL MAPDRV ; Map to 2nd 4K of driver RETURN;  ;+* ; Receive characteristics dispatch table ;- RCVTBL:: .WORD RCVDAD ; Get source field from received message9 .WORD RCVPRO ; Get protocol field from received msg.V6 .WORD RCVADR ; Get dest. field from received msg. RCMAX =.-RCVTBL  9 APR5PC RCVCH ; Make sure RCVCH is in APR5 addr spaceo   h; .SBTTL RCVADR - Get destination field from received msg.  ;+6 ; **-RCVADR-Get destination field from received msg. ;;0 ; Get destination field from received message. ;- ; Inputs:i) ; R0 = Address of characteristics block.9 ; R1 = Default status (CS.IGN = Characteristic ignored)." ; R3 = Address of the I/O packet0 ; R5 = Port State table (contains source addr) ; ; Outputs:, ; R1 = Status to return for characteristic ;aD RCVADR: CMP C.DATI(R0),#6 ; Are there at least 6 bytes available? BLO 10$ ; If LO, no  MOV P.RDAD(R500z_tt tfDATA),C.CHRL(R0) MOV P.RDAD+2(R5),C.CHRL+2(R0) MOV P.RDAD+4(R5),C.CHRL+4(R0)> MOV #6,C.DATO(R0) ; Fill in Ethernet address and it's size1 MOV #CS.SUC,R1 ; Return successful completions 10$: RETURNr ; APR5PC RCVADR ; Make sure RCVADR is in APR5 addr space=  t8 .SBTTL RCVPRO - Get protocol field from received msg. ;+6 ; **-RCVPRO-Get protocol field from received message ;R- ; Get protocol field from received message. ;- ; Inputs:O) ; R0 = Address of characteristics blockM9 ; R1 = Default status (CS.IGN = Characteristic ignored)R" ; R3 = Address of the I/O packet$ ; R5 = Address of Port State Table ;S  ; Outputs:, ; R1 = Status to return for characteristic ; D RCVPRO: CMP C.DATI(R0),#2 ; Are there at least 2 bytes available? BLO 10$ ; If LO, no  MOV P.RPRO(R5),C.CHRL(R0)? MOV #2,C.DATO(R0) ; Fill in Ethernet protocol and it's size1 MOV #CS.SUC,R1 ; Return successful completion-  10$: RETURN  ; APR5PC RCVPRO ; Make sure RCVPRO is in APR5 addr spaceC  h9 .SBTTL RCVDAD - Get source field from received message ;+4 ; **-RCVDAD-Get source field from received message ;=* ; Get source field from received message ;-  ; Inputs:I) ; R0 = Address of characteristics blocka9 ; R1 = Default status (CS.IGN = Characteristic ignored)L" ; R3 = Address of the I/O packet ; R5 = Port State Tables ;  ; Outputs:, ; R1 = Status to return for characteristic! ;RD" RCVDAD: CMP C.DATI(R0),#6 ; Are there at least 6 bytes available?# BLO 10$ ; If LO, no$ 6% MOV P.RSAD(R5),C.CHRL(R0) ; Put Sender's Ethernet>& MOV P.RSAD+2(R5),C.CHRL+2(R0) ; ... address into AUX buffer&' MOV P.RSAD+4(R5),C.CHRL+4(R0) ; ...>( MOV #6,C.DATO(R0) ; Fill in Ethernet address and it's size1) MOV #CS.SUC,R1 ; Return successful completionL* + 10$: RETURNo, ;- APR5PC RCVDAD ; Make sure RCVDAD is in APR5 addr space. / S>0 .SBTTL XMCHR - Process transmit auxilliary characteristics1 ;+82 ; **-XMCHR-Process transmit auxilliary characteristics3 ; I4 ; Process the characteristics present in the auxilliary characteristicsA#5 ; buffer on the transmit request.t6 ;- 7 ; Inputs:V"8 ; R3 = Address of the I/O packet<9 ; I.PRM+6 - Virtual address of the characteristics buffer3: ; I.PRM+10- Length of the characteristics buffer ; ; R4 = Port Status Table.< ; R5 = Address of the Controller State Table= ;> ; Registers modified:H? ; R0, R1, R2@ ; 7A XMTCH: MOV IP.EXT(R3),R0 ; R0 = I/O packet extensionaB 1C .IF DF M$$MGE ; Memory management supported? D .E MOV IX.AUX(R0),@#KISAR6 ; Map to AUX bufferF 1G .IF DF K$$DAS ; Kernel data space supported? 6H MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceI .ENDC ; K$$DASJ K .ENDC ; M$$MGEL FM BIC #PS.ADR!PS.PRO,P.FLAG(R5) ; Clear addr/protocol found flag bitsN AO MOV I.PRM+6(R3),R0 ; Point to start of characteristics bufferiP 2Q MOV R0,P.WORK(R5) ; Compute end of user buffer<R ADD I.PRM+10(R3),P.WORK(R5) ; P.WORK = End of user bufferS >T 10$: MOV #CS.IGN,R1 ; Assume characteristic will be ignored5U MOV (R0),R2 ; Get next characteristics type codea0V SUB #CC.ADR,R2 ; Normalise for DLX functions4W BLT 20$ ; If LT, not one of our characteristicsX ASL R2 ; Form word offsetY CMP R2,#XMMAX ; In range?rZ BHIS 20$ ; If HIS, no5[ CALL @XMTTBL(R2) ; Dispatch to processing routinea\ @] 20$: MOV R1,C.STAT(R0) ; Return status of this characteristic4^ ADD C.DATI(R0),R0 ; Point to next characteristic_ ADD #C.CHRL,R0 ; ...(` CMP R0,P.WORK(R5) ; Are we done yet?a BLO 10$ ; If LO, nob *c CALL MAPDRV ; Map to 2nd 4K of driver d RETURNRe f ;++g ; Transmit characteristics dispatch table h ;-?i XMTTBL: .WORD XMTADR ; Define Ethernet address for transmitR9j .WORD XMTPRO ; Define Ethernet protocol for transmit k XMMAX =.-XMTTBLal 9m APR5PC XMTCH ; Make sure XMTCH is in APR5 addr spaceun o 7p .SBTTL XMTADR - Define Ethernet009cccc address for transmitnq ;+2r ; **-XMTADR-Define Ethernet address for transmits ;RIt ; Define the Ethernet address to be used for this message transmission.pu ;- v ; Inputs:r)w ; R0 = Address of characteristics blockt9x ; R1 = Default status (CS.IGN = Characteristic ignored)D"y ; R3 = Address of the I/O packet.z ; R5 = Address of the Controller State Table{ ;a | ; Outputs:,} ; R1 = Status to return for characteristic~ ;CE XMTADR: CMP C.DATI(R0),#6 ; Are there at least 6 bytes of address?a BLO 10$ ; If LO, no : MOV C.CHRL(R0),P.XDAD(R5) ; Fill in Ethernet address& MOV C.CHRL+2(R0),P.XDAD+2(R5) ; ...& MOV C.CHRL+4(R0),P.XDAD+4(R5) ; ...= BIS #PS.ADR,P.FLAG(R5) ; Indicate Ethernet address seen=3 MOV #CS.SUC,R1 ; Return successful completion  10$: RETURNh ; APR5PC XMTADR ; Make sure XMTADR is in APR5 addr spacea  p8 .SBTTL XMTPRO - Define Ethernet protocol for transmit ;+3 ; **-XMTPRO-Define Ethernet protocol for transmitf ;eJ ; Define the Ethernet protocol to be used for this message transmission. ;- ; Inputs:) ; R0 = Address of characteristics blockM9 ; R1 = Default status (CS.IGN = Characteristic ignored)5" ; R3 = Address of the I/O packet2 ; R5 = Address of the physical link access block ; ; Outputs:, ; R1 = Status to return for characteristic ;iF XMTPRO: CMP C.DATI(R0),#2 ; Are there at least 2 bytes of protocol? BLO 10$ ; If LO, no 9 MOV C.CHRL(R0),P.XPRO(R5) ; Fill in Ethernet protocoli? BIS #PS.PRO,P.FLAG(R5) ; Indicate Ethernet protocol seen.7 MOV #CS.SUC,R1 ; Return successful completion  10$: RETURNf ; APR5PC XMTPRO ; Make sure XMTPRO is in APR5 addr spaceo  - .SBTTL GTCHR - Get device characteristicsc ;+' ; **-GTCHR-Get device characteristics  ;tE ; The get characteristics function is used to read device dependenta, ; characteristics for Ethernet interfaces. ;- ; Inputs:V ; R3 = Address of I/O packet ; R4 = Contoller State Table ; r5 = Port State Tablea ;h ; Registers modified:M ; R0, R1, R2 ;; .ENABL LSBf GTCHR: MOV R3,-(SP) ; Save R3 1 .IF DF M$$MGE ; Memory management supported?  ; MOV @IP.EXT(R3),@#KISAR6 ; Map to characteristics buffer 1 .IF DF K$$DAS ; Kernel data space supported? 6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS  .ENDC ; M$$MGE 9 MOV I.PRM+2(R3),R0 ; R0 = Virtual addr of user bufferB MOV R0,P.WORK+4(R5) ; Save start addr for later. We will need1 ; ... it to compute how much of the bufferN% ; ... we were able to process.S4 MOV R0,-(SP) ; Compute address past end of block ADD I.PRM+4(R3),(SP) ; ...) A MOV C.PROL(R4),P.WORK(R5) ; Save protocol and multicast listr: MOV P.MCST(R5),P.WORK+2(R5) ; ... pointer in work area. 4 10$: MOV (R0),R2 ; Get next characteristics type BEQ 40$ ; No more 2 SUB #CC.DST,R2 ; Normalise for driver dispatch4 BLT 20$ ; If LT, not one of our characteristics ASL R2 ; Form word offset CMP R2,#GETMAX ; In range? BHIS 20$ ; If HIS, no- MOV #CS.IGN,R1 ; Assume request too smallp 5 CALL @GETTBL(R2) ; Dispatch to processing routineV BR 20$ ;O + 15$: MOV #CE.UDF,R1 ; Undefined functionM CLR R2 ; Nothing processedp 9 20$: MOV R1,C.STAT(R0) ; Return status of this requestc= MOV R2,C.DATO(R0) ; Return length of returned information;? 30$: ADD C.DATI(R0),R0 ; Point to next characteristics blocko ADD #C.CHRL,R0 ; ...# CMP R0,(SP) ; Are we done yet?G BLO 10$ ; If LO, no 40$:# TST (SP)+ ; Clean up the stacks- MOV (SP)+,R3 ; Restore I/O packet address  * CALL MAPDRV ; Map to 2nd 4K of driver > MOV P.CTBL(R5),R4 ; Restore Controller State Table pointer8 MOV R0,R1 ; Indicate we processed all of the bufferA SUB P.WORK+4(R5),R1 ; Compute number of characteristics proc.r% MOV #CS.SUC,R0 ; Indicate success(" CALLR RQDON00_tt tfDATA ; Post completion .DSABL LSB# ;+& ; Get characteristics dispatch table ;-< GETTBL: .WORD GETDST ; Get remote address/protocol pairs+ .WORD GETMCT ; Get a multicast addressp GETMAX =.-GETTBL 9 APR5PC GTCHR ; Make sure GTCHR is in APR5 addr space5  e4 .SBTTL GETDST - Get remote address/protocol pairs ;+/ ; **-GETDST-Get remote address/protocol pairs+ ;,I; Get the next protocol and associated addresses enabled for this port.t;- ; Inputs:R); R0 = Address of characteristics blockS4; R1 = Default status (CE.RTS = Request too small); R3 = Address of I/O packet; R4 = Controller State Table ; R5 = Port State Tablet; ; Outputs:, ; R1 = Status to return for characteristic+ ; R2 = # of bytes of returned information  ;T ; Registers modified:r; R1, R2, R4; 4GETDST: CLR R2 ; Assume no output data available: CMP C.DATI(R0),#4 ; Enough space for a protocol entry? BLO 100$ ; If LO, no& CLR -(SP) ; Reserve cell on stack510$: MOV #CS.SUC,R1 ; Assume successful completion 1 MOV R0,R2 ; Compute address of output buffer= ADD #C.CHRL,R2 ; ...4 MOV P.WORK(R5),R4 ; Get next protocol list entry BEQ 50$ ; If EQ, no moree8 MOV (R4),P.WORK(R5) ; Move on down the protocol list5 MOV C.DATI(R0),(SP) ; Set up remaining byte countD2 SUB #4,(SP) ; ... for building characteristic  CLR -(SP) ; Initialise flag: MOV PL.PRO(R4),(R2)+ ; Assume we will use this protocolC  MOV PL.FLG(R4),(R2)+ ; Set up flags and usage count for protocolf4! ADD #PL.ADD,R4 ; Point to address chain listhead"3#20$: MOV (R4),R4 ; Get next address chain entry,$ BEQ 40$ ; If EQ, no moret,% CMP AD.PRT(R4),R5 ; Is it for this port?)& BNE 20$ ; If NE, no ... keep lookingi-' INC (SP) ; Indicate valid protocol foundb2( SUB #6,2(SP) ; Reduce count of remaining bytes-) BLT 30$ ; If LT, insufficient space left9* MOV AD.ADD(R4),(R2)+ ; Copy address into output bufferl+ MOV AD.ADD+2(R4),(R2)+ ; ...p, MOV AD.ADD+4(R4),(R2)+ ; ...o- BR 20$ ; Keep looking.%/30$: MOV #CS.DAO,R1 ; Data overrunV2040$: TST (SP)+ ; Was this protocol acceptable?1 BEQ 10$ ; If EQ, no2'350$: TST (SP)+ ; Clean up the stack.4 SUB R0,R2 ; Compute length of output data5 SUB #C.CHRL,R2 ; ...6100$: RETURN7;8 APR5PC GETDST ; Make sure GETDST is in APR5 addr space;9: n*; .SBTTL GETMCT - Get a multicast address<;+%=; **-GETMCT-Get a multicast addressV>;D9?; Get the next multicast address enabled for this port.B@;- A; Inputs:i)B; R0 = Address of characteristics blocku4C; R1 = Default status (CE.RTS = Request too small)D; R3 = Address of I/O packetE; R4 = Controller State Table F; R5 = Port State TablemG;l H; Outputs:,I; R1 = Status to return for characteristic+J; R2 = # of bytes of returned information K; L; Registers modified:nM; R4N;E8OGETMCT: MOV R0,R2 ; Compute address of output bufferP ADD #C.CHRL,R2 ; ...=Q CMP C.DATI(R0),#6 ; Enough space for a multicast address?-R BLO 20$ ; If LO, noS:T MOV P.WORK+2(R5),R4 ; Get next multicast address entryU BEQ 10$ ; If EQ, no more=V MOV (R4),P.WORK+2(R5)AW MOV ML.ADD(R4),(R2)+ ; Copy multicast address to output bufferX MOV ML.ADD+2(R4),(R2)+ ; ...tY MOV ML.ADD+4(R4),(R2)+ ; ...#Z.[10$: MOV #CS.SUC,R1 ; Return success status2\20$: SUB R0,R2 ; Compute length of output data] SUB #C.CHRL,R2 ; ... ^ RETURN_9` APR5PC GTMCT ; Make sure GTMCT is in APR5 addr spacerab a-c .SBTTL STCHR - Set device characteristicsMd;+'e; **-STCHR-Set device characteristicssf;yGg; The set characteristics function is used to set up device dependent(Hh; functions for the Ethernet interfaces (e.g. Protocol/address pairs).i;- j; Inputs:Vk; R3 = Address of I/O packetl; R4 = Controller State Tableum; R5 = Port State Table,n;;o; Registers modified: p; R0, R1, R2, R3, R4q;. r .ENABL LSBs009cccc(tSTCHR: MOV R3,-(SP) ; Save I/O packetu1v .IF DF M$$MGE ; Memory management supported? w;x MOV @IP.EXT(R3),@#KISAR6 ; Map to characteristics buffery1z .IF DF K$$DAS ; Kernel data space supported?e6{ MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space| .ENDC ; K$$DAS}~ .ENDC ; M$$MGE< MOV I.PRM+2(R3),R0 ; R0 = Characteristics buffer pointer; MOV R0,P.WORK(R5) ; Save start addr of buffer. We willi+ ; ... need it to compute how much ofB. ; ... the buffer we were able to procss< MOV R0,P.WORK+2(R5) ; Initialize how far we got pointer.4 MOV R0,-(SP) ; Compute address past end of block ADD I.PRM+4(R3),(SP) ; ...;410$: MOV (R0),R2 ; Get next characteristics type BEQ 30$ ; No more. MOV #CE.UDF,R1 ; Assume undefined function% SUB #CC.DST,R2 ; Make it an indexr4 BLT 20$ ; If LT, not one of our characteristics ASL R2 ; Form word offset CMP R2,#SETMAX ; In range? BHIS 20$ ; If HIS, no- MOV #CE.RTS,R1 ; Assume request too smallV MOV R0,-(SP) ; Save R05 CALL @SETTBL(R2) ; Dispatch to processing routinea MOV (SP)+,R0 ; Restore R0D% BCS 40$ ; If CS, stop processingV ; ... characteristics920$: MOV R1,C.STAT(R0) ; Return status of this request ; ADD C.DATI(R0),R0 ; Point to next characteristics block  ADD #C.CHRL,R0 ; ...> MOV R0,P.WORK+2(R5) ; Indicate how far we got successfully# CMP R0,(SP) ; Are we done yet? BLO 10$ ; If LO, no130$: MOV #CS.SUC,R1 ; Indicate, processed allM ; ... characteristics'40$: TST (SP)+ ; Clean up the stacko- MOV (SP)+,R3 ; Restore I/O packet address46 MOV P.CTBL(R5),R4 ; Restore Controller State Table* CALL MAPDRV ; Map to 2nd 4K of driverE SUB P.WORK(R5),P.WORK+2(R5) ; Compute how much we have processed 8 MOV P.WORK+2(R5),I.PRM+4(R3) ; Save it in I/O packet9 MOV R1,I.PRM+2(R3) ; Save status code in I/O packetA5 BIT #PS.MLC,P.FLAG(R5) ; Multicast list changed?M BEQ 50$ ; Noi3 MOV IP.EXT(R3),R0 ; R0 = I/O packet extensionB MOV #FN.WML,IX.FCN(R0) ; Write Multicast List to UNA function8 $QPKT C.PFNC ; Queue packet to function pending Q/ CALLR FNINI ; Try to initiate a functionK(50$: MOV I.PRM+2(R3),R0 ; R0 = Status- MOV I.PRM+4(R2),R1 ; R1 = Bytes processedV( CALLR RQDON ; Return status to user  .DSABL LSBR;+&; Set characteristics dispatch table;-?SETTBL: .WORD SETDST ; Define remote address/protocol pairsi+ .WORD SETMCT ; Set a multicast addressxSETMAX =.-SETTBL9 APR5PC STCHR ; Make sure STCHR is in APR5 addr spaceP 7 .SBTTL SETDST - Define remote address/protocol pairs ;+2; **-SETDST-Define remote address/protocol pairs; E; Define a number of address/protocol pairs for the specified port.R;- ; Inputs:t-; R0 = Address of the characteristics block4; R1 = Default status (CE.RTS = Request too small); R3 = Address of I/O packet; R4 = Controller State tableD; R5 = Port State Table ;s ; Outputs:,; R1 = Status to return for characteristic=; 'C' Clear - Address/protocol entries successfully created 9; 'C' Set - failed to create address/protocol entriesr; ; Registers modified:; R0, R2, R4;e=SETDST: MOV R0,R4 ; Copy address of characteristics block 8 CLR P.WORK+4(R5) ; Show no allocations performed yet CLR P.WORK+6(R5) ; ...; MOV C.DATI(R4),R2 ; Get length of characteristics block=+ SUB #4,R2 ; Remove protocol descriptor / BEQ 15$ ; Br if no addresses - only headert( BLT 200$ ; If LT, request too small410$: SUB #6,R2 ; Remove another Ethernet address  BGT 10$ ; If GT, more to go( BMI 200$ ; If MI, request too small715$: MOV #CE.PCN,R1 ; Assume protocol usage conflictdA20$: MOV P.CTBL(R5),R2 ; Get address of protocol list listheadc ADD #C.PROL,R2 ; ...930$: MOV (R2),R2 ; Get address of next protocol blocko00_tt tfDATA BEQ 50$ ; If EQ, no moreB8 CMP PL.PRO(R2),C.CHRL(R4) ; Protocol already in list?' BNE 30$ ; If NE, not this protocol03 MOVB PL.FLG(R2),R0 ; Get current protocol flagsv; BISB C.CHRL+2(R4),R0 ; ... or'd with new protocol flags9 BIT #LF.EXC,R0 ; Did either request exclusive access?E0 BNE 200$ ; If NE, yes ... protocol conflict- BITB #LF.DEF,C.CHRL+2(R4) ; Default owner?l9 BEQ 40$ ; If EQ, we are not enabling a default owner . BITB #LF.DEF,PL.FLG(R2) ; Can we enable it?4 BNE 200$ ; If NE, default owner already enabledC40$: MOVB PL.FLG(R2),-(SP) ; Check for consistent padding request BIC #^C,(SP) ; ...r MOVB C.CHRL+2(R4),R0 ; ... BIC #^C,R0 ; ...2 CMP R0,(SP)+ ; Did they both request the same? BNE 200$ ; If NE, noE( BR 60$ ; Use current protocol block:50$: MOV #PL.LEN,R1 ; Get length of protocol list entry% CALL $ALOCB ; Allocate the block 7 MOV #CE.RES,R1 ; Assume resource allocation failurei) BCS 200$ ; If CS, allocation failurer3 MOV R0,R2 ; Copy address of the protocol blockr$ CLR (R0)+ ; Clear the link word0 MOVB C.CHRL+2(R4),(R0)+ ; Copy protocol flags" CLRB (R0)+ ; Zero usage count3  MOV C.CHRL(R4),(R0)+ ; Fill in the protocol type4  CLR (R0)+ ; Assume no default or exclusive user,  CLR (R0) ; Build address chain listhead  MOV R0,2(R0) ; ...  MOV R4,-(SP) ; Temp save R4h3 MOV P.CTBL(R5),R4 ; R4 = Controller state tablel/ MOV R2,@C.PROL+2(R4) ; Add protocol entry too0 MOV R2,C.PROL+2(R4) ; ... end of master list MOV (SP)+,R4 ; Restore R4+?60$: BITB #LF.EXC!LF.DEF,C.CHRL+2(R4) ; Exclusive or default?f4 BEQ 70$ ; If EQ, not exculsive or default owner9 MOV R5,PL.DEF(R2) ; Set up default or exclusive ownerA@70$: MOV R2,P.WORK+4(R5) ; Save address of the protocol block= MOV C.DATI(R4),R2 ; Get size of the characteristics block  SUB #4,R2 ; Remove overhead0 BEQ 75$ ; If EQ, no addresses to be enabled% CALL BLDADR ; Build address list, BCS 200$ ; If CS, failure@75$: MOV P.WORK+4(R5),R2 ; Get address of protocol list entry9 80$: MOV P.WORK+6(R5),R0 ; Get next address list entryQ! BEQ 90$ ; If EQ, no morer," MOV (R0),P.WORK+6(R5) ; Save next address'# CLR (R0) ; Clear out the link word)2$ MOV R0,@PL.ADD+2(R2) ; Add address entry to theC% MOV R0,PL.ADD+2(R2) ; ... end of the list on the protocol block (& INCB PL.USE(R2) ; Update usage count' BR 80$ ; ... and loop(')90$: BITB #LF.EXC!LF.DEF,C.CHRL+2(R4)S;* BEQ 100$ ; If EQ, not an exclusive or default protocole%+ INCB PL.USE(R2) ; Inc usage count:,,100$: MOV #CS.SUC,R1 ; Set success status- CLC ; Indicate success . RETURN/0;+O1; We are unable to build the protocol block and/or the address blocks becauseVP2; of an address or protocol conflict or a resource allocation failure. Release>3; the data structures we have allocated and return an error.4;-5+6200$: MOV R1,-(SP) ; Save the error code @7210$: MOV P.WORK+6(R5),R0 ; Get next address block to release8 BEQ 220$ ; If EQ, noneI79 MOV (R0),P.WORK+6(R5) ; Save addr of next addr block13: MOV #AD.LEN,R1 ; Set length of an address block'; CALL $DEACB ; Deallocate the blocko< BR 210$ ; ... and loop/=8>220$: CALL SCNPR ; Scan for inactive protocol blocks)? MOV (SP)+,R1 ; Recover the error codeR@ SEC ; Indicate failure A RETURNlB;C APR5PC SETDST ; Make sure SETDST is in APR5 addr spaceaDE r8F .SBTTL SCNPR - Scan protocol list for unused entriesG;+2H; **-SCNPR-Scan protocol list for unused entriesI;OHJ; Scan the protocol list for entries which have a zero usage count andK; return them to the pool.L;- M; Inputs:t$N; R5 = Address of Port State tableO;P; Registers modified:;Q; R0, R1, R2, R4R;o>SSCNPR: MOV P.CTBL(R5),R2 ; Get address of protocol listheadT ADD #C.PROL,R2 ; ...3U10$: MOV (R2),R0 ; Get next protocol list entry 009ccccV BEQ 40$ ; If EQ, no more.W1X TSTB PL.USE(R0) ; Is this block still in use?Y BEQ 20$ ; If EQ, no&Z MOV R0,R2 ; Move on down the list[ BR 10$ ; ...i\7]20$: MOV (R0),(R2) ; Unlink protocol entry from listt'^ BNE 30$ ; If NE, not last in chain A_ MOV P.CTBL(R5),R4 ; Make sure we have Controller State Tabble-` MOV R2,C.PROL+2(R4) ; Fix up tail pointer,:a30$: MOV #PL.LEN,R1 ; Get length of protocol list entry$b MOV R2,-(SP) ; Save list pointer'c CALL $DEACB ; Deallocate the blockQ'd MOV (SP)+,R2 ; Restore list pointerte BR 10$ ; ... and loopf g40$: RETURN hij ,-k .SBTTL BLDADR - Build address list entriesil;+(m; **-BLDADR-Build address list entriesn;r-o; Build the specified address list entries.ip;- q; Inputs:5:r; R2 = # of bytes remaining in the characteristics block-s; R4 = Pointer to the characteristics blockM$t; R5 = Address of port state tableu;t v; Outputs:#w; R1 = Error code (if applicable)L;x; 'C' Clear - Address list entries successfully allocatede7y; 'C' Set - Failed to allocate address list entriesTz;{; Registers modified:L |; R0, R2};e-~BLDADR: MOV R4,-(SP) ; Get a free registerr6 ADD #C.CHRL+4,R4 ; Point to first Ethernet address@10$: MOV #CE.IUM,R1 ; Assume illegal use of multicast address/ BIT #1,(R4) ; Is this a multicast address?  BNE 100$ ; If NE, yes7 MOV P.WORK+4(R5),R0 ; Get pointer to protocol entry= ADD #PL.ADD,R0 ; ...- CALL CHKADD ; Check for address conflicts3 MOV #CE.PCN,R1 ; Assume protocol usage conflicta- BCS 100$ ; If CS, address already in usei4 MOV R5,R0 ; Get pointer to list of address list1 ADD #P.WORK+6,R0 ; ... entries just allocated - CALL CHKADD ; Check for address conflictA, MOV #CE.MCE,R1 ; Assume address conflict- BCS 100$ ; If CS, address already in useB" MOV R2,-(SP) ; Save byte count8 MOV #AD.LEN,R1 ; Get length of an address list entry% CALL $ALOCB ; Allocate the blockf% MOV (SP)+,R2 ; Restore byte count 7 MOV #CE.RES,R1 ; Assume resource allocation failure,) BCS 100$ ; If CS, allocation failure  MOV P.WORK+6(R5),(R0)7 MOV R0,P.WORK+6(R5) ; Link block onto pending chaine$ TST (R0)+ ; Skip over link word  .REPT 3. MOV (R4)+,(R0)+ ; Fill in Ethernet address .ENDR0 MOV R5,(R0)+ ; Set up address of owning port; SUB #6,R2 ; Remove another ethernet address from countr BNE 10$ ; If NE, loop% MOV #CS.SUC,R1 ; Indicate success  TST (PC)+ ; ...!100$: SEC ; Indicate failurea# MOV (SP)+,R4 ; Recover registerf  RETURNt a* .SBTTL CHKADD - Check for address match;+%; **-CHKADD-Check for address matchh;E; Scan an address list for a match on a specified Ethernet address.+;- ; Inputs:t*; R0 = Address of listhead to be scanned+; R4 = Address of 3 word Ethernet address;;v ; Outputs:#; R1 = Error code (if applicable) 1; 'C' Clear - No match on any entry in the listu3; 'C' Set - Match on an entry in the list foundd; ; Registers modified: ; R0;gBCHKADD: MOV #CE.ACN,R1 ; Assume possible address usage conflict&10$: CLC ; Assume no more entries4 MOV (R0),R0 ; Get address of next entry in list BEQ 20$ ; If EQ, no more-4 CMP AD.ADD(R0),(R4) ; Check for matching address BNE 10$ ; If NE, no match CMP AD.ADD+2(R0),2(R4) ; ...p BNE 10$ ; ... CMP AD.ADD+4(R0),4(R4) ; ...l BNE 10$ ; ...+ SEC ; Indicate a match has been found 20$: RETURN ; Return 6 .SBTTL SETMCT - Enable a multicast address for port;+(; **-SETMCT-Enable a multicast address;:; Enable a new multicast address for the specified port.;- ; Inputs:e-; R0 = Address of the characteristics block4; R1 = Default status (CE.RTS = Request too small)*; R4 = Address of controller state table$; R5 = Address of port state table;C ; Outputs:,; R1 = Status to return fo00_tt tfDATAr characteristic<; 'C' Clear - Multicast address entry successfully created8; 'C' Set - Failed to create multicast address entry;o; Registers modified:n ; R0, R2;aDSETMCT: CMP C.DATI(R0),#6 ; Do we have a valid multicast address?' BLO 100$ ; If LO, no ... too smallo# BEQ 10$ ; If EQ, exactly right=& MOV #CE.RTL,R1 ; Request too large BR 100$ ; ... and exitt710$: MOV #CE.NMA,R1 ; Assume not a multicast addressC2 BIT #1,C.CHRL(R0) ; Is it a multicast address? BEQ 100$ ; If EQ, nou/ MOV R5,R2 ; Get multicast address listheade ADD #P.MCST,R2 ; ...B20$: MOV (R2),R2 ; Get address of next multicast address entry BEQ 30$ ; If EQ, no moreD CMP ML.ADD(R2),C.CHRL(R0)" BNE 20$ ; If NE, keep looking  CMP ML.ADD+2(R2),C.CHRL+2(R0)  BNE 20$  CMP ML.ADD+4(R2),C.CHRL+4(R0)  BNE 20$6 MOV #CE.MCE,R1 ; Multicast address already enabled  BR 100$<30$: MOV R0,-(SP) ; Save address of characteristics blockA MOV #ML.LEN,R1 ; Get length of a multicast address list entryi' CALL $ALOCB ; Allocate a new block 5 MOV (SP)+,R2 ; R2 = Addr of characteristics blockm# BCS 100$ ; If CS, no resources; MOV C.CHRL(R2),ML.ADD(R0)  MOV C.CHRL+2(R2),ML.ADD+2(R0)  MOV C.CHRL+4(R2),ML.ADD+4(R0)5 CLR (R0) ; Link to end of multicast address list4 MOV R0,@P.MCST+2(R5) ; ...E MOV R0,P.MCST+2(R5) ; ...y; BIS #PS.MLC,P.FLAG(R5) ; Indicate multicast list changed 3 MOV #CS.SUC,R1 ; Indicate successful completion ! TST (PC)+ ; Indicate success!100$: SEC ; Indicate failurel  RETURNV ;  APR5PC SETMCT ; Make sure SETMCT is in APR5 addr space    - .SBTTL STMLT - Enable multicast addresses;+'; **-STMLT-Enable multicast addresses(;L>; The following function will inform the UNA which multicast ; addresses have been enabled.;- ; Input:; R5 = Port status table; R4 = Controller state tablet; R3 = Address of I/O packet#; I.PRM+2 = Caller's I/O statuso&; I.PRM+4 = Caller's R1 I/O status;$ ; Output:d); Multicast list is written to the UNA.E; 'C' bit set on error'; 'C' bit cleared for good I/O statusT( ; I/O DONE IS RETURNED FOR THE REQUEST!; " .ENABL LSBl#%$STMLT: CALL SALL ; Save registersw&% CALL BLDML ; Build multicast list&3' TSTB C.MLT(R4) ; Do we have multicast addressesu1( BEQ 20$ ; No, just return I/O status to user )2* MOV C.PCBP(R4),R2 ; R2 = Port Control Block'+ CLR (R2)+ ; Clear function word ,3- CMPB C.MLT(R4),C.MMAX(R4) ; Max number exceeded?s5. BHI 10$ ; Yes, put UNA in all multicast moder/40 MOV RELCT,(R2) ; Put unibus relocation in PCB1 MOV RELCT+2,2(R2) ; ...>2 ADD C.WRKP(R4),(R2)+ ; Add offset into UMR mapped region3 ADC (R2)+ ; ...t:4 MOVB C.MLT(R4),-(R2) ; Put # of milticast addr in PCBB15 MOV #FN.WML,R1 ; R1 = Write multicast list *6 CALLR LODFN ; Execute the function78;n"9; Enable all multicast addresses:;cA;10$: BIS #MD.ENL,C.MODE(R4) ; Enable all multicast addressess<< MOV C.MODE(R4),(R2) ; Put it in Port Control Block (PCB)+= MOV #FN.WMD,R1 ; Write mode function *> CALLR LODFN ; Execute the function?@;()A; Write Multicast Address list completeeB;CWMLDN: BCS 40$ ; Error?M-D20$: MOV I.PRM+2(R3),R0 ; R0 = Status codei<E30$: MOV I.PRM+4(R3),R1 ; R1 = Length of buffer processed"F CALLR RQDON ; Report I/O doneGFH40$: CMPB #IO.XCH/400,I.FCN+1(R3) ; Are we processing char.function?'I BNE 20$ ; No, keep caller's statusr,J MOV #IE.ABO&377,R0 ; Set up abort status!K BR 20$ ; Return abort statusWL M .DSABL LSBoN n2O .SBTTL BLDML - Build multicast addresses tableP;+,Q; **-BLDML-Build multicast addresses tableR;;S; Build the multicast address table for the set multicastR T; function.iU;- V; Inputs:4#W; R5 = Points to Port State TableeX; Y; Outputs:7Z; 'C' Clear - Control function pro009cccccessing may proceed(3[; 'C' Set - Control function processing delayed;\;k]; Registers modified:M ^; R0, R1_; :`BLDML: CLR C.MLT(R4) ; Zero multicast addresses counter.a MOV R4,R1 ; Compute address of port table!b ADD #C.PORT,R1 ; ... listhead5c10$: MOV (R1),R1 ; Get address of next port table d BEQ 80$ ; If EQ, no morele-f MOV R1,R0 ; Compute address of multicast )g ADD #P.MCST,R0 ; ... address listheadl7h20$: MOV (R0),R0 ; Get next multicast address entrypi BEQ 10$ ; If EQ, no more jk MOV R1,-(SP) ; Save R1, R2l MOV R2,-(SP) ; ...m2n MOV C.WRKP(R4),R1 ; Get pointer to work buffero CLR R2 ; Clear high bytec3p MOVB C.MLT(R4),R2 ; Get # of addresses to checke#q BEQ 50$ ; If EQ, none to checkrBs30$: CMP ML.ADD(R0),(R1) ; Check for matching multicast addresst BNE 40$ ; If NE, no matchu CMP ML.ADD+2(R0),2(R1)t v BNE 40$w CMP ML.ADD+4(R0),4(R1)s9x BEQ 60$ ; If EQ, multicast address already in buffersy)z40$: ADD #6,R1 ; Skip over this entry#{ SOB R2,30$ ; Check all entriesR|<}50$: MOV ML.ADD(R0),(R1)+ ; Fill in this multicast address~ MOV ML.ADD+2(R0),(R1)+i MOV ML.ADD+4(R0),(R1)+,8 INCB C.MLT(R4) ; Update count of multicast addresses(60$: MOV (SP)+,R2 ; Restore registers MOV (SP)+,R1 ; ...C CMPB C.MLT(R4),C.MMAX(R4) ; Have we reached max multicast addr.1= BLOS 20$ ; Loop for next address to enable for this portQ70$: SEC ; ...d  BR 90$ ;$80$: CLC ; Indicate good return90$: RETURN ; l> .SBTTL ****************************************************> .SBTTL * Non-DLX Function Processors *> .SBTTL ****************************************************7 .SBTTL NDLXF - Dispatch table for non-DLX functions ;+); Dispatch table for non-DLX functions.e; ; Format: /; .WORD ADDR ; Address of function processore); .BYTE FLAGS ; Flag bits, if set TRUE.?; .BYTE SIZE ; Max size of input/output data buffer required0;T; Flag bit definitions:T;-)F.PRIV = 1 ; Read privelege flag bit*1F.LESS = 2 ; Buffer may be less than maximumo$F.READ = 4 ; Function is a readNDLXF:# .WORD INVFUN ; 00 NOP function. .BYTE 0 ; Filler byte  .BYTE 0 ; Filler byte 7 .WORD INVFUN ; 01 Load and Start Microcode Address & .BYTE 0 ; Must be priveleged% .BYTE 0 ; One word of inputs+ .WORD REDDAD ; 02 Read Default Address 5 .BYTE F.READ ; Anyone can use this functiond3 .BYTE 3*2 ; Requires 3 word output bufferf# .WORD INVFUN ; 03 NOP functiony .BYTE 0 ; Filler byte  .BYTE 0 ; Filler byte, .WORD REDADD ; 04 Read Physical Address5 .BYTE F.READ ; Anyone can use this functioni3 .BYTE 3*2 ; Requires 3 word output bufferr- .WORD WRTADD ; 05 Write Physical Addressv+ .BYTE F.PRIV ; Must be privilageds- .BYTE 3*2 ; Requires 3 word input address2 .WORD REDMLT ; 06 Read Multicast Address List1 .BYTE F.LESS!F.READ ; Must be privilagedf/ .BYTE 6*10. ; Requires max of 10. addressesY3 .WORD INVFUN ; 07 Write Multicast Address Listr .BYTE 0 ; Filler bytea .BYTE 0 ; Filler byteA' .WORD INVFUN ; 10 Read Ring Format .BYTE 0 ; Filler bytew .BYTE 0 ; Filler byteD( .WORD INVFUN ; 11 Write Ring Format .BYTE 0 ; Filler bytee .BYTE 0 ; Filler byter$ .WORD READCT ; 12 Read Counters; .BYTE F.LESS!F.READ ; Anyone can use this function - .BYTE 32.*2 ; Output buffer > 0 and < 32.s. .WORD READCC ; 13 Read And Clear CountersC .BYTE F.PRIV!F.LESS!F.READ; Must be priveleged, BUF can be < maxY- .BYTE 32.*2 ; Output buffer > 0 and < 32.1  .WORD REDMOD ; 14 Read Mode/ .BYTE F.READ ; Anyone can use this functionb* .BYTE 1*2 ; Requires a one word buffer! .WORD WRTMOD ; 15 Write Modee* .BYTE F.PRIV ; Must be priveleged 00_tt tfDATAuser+ .BYTE 1*2 ; Requires a one word buffer!' .WORD REDSTA ; 16 Read Port Statuso/ .BYTE F.READ ; Anyone can use this functions0 .BYTE 4*2 ; Four word output buffer required1 .WORD REDCST ; 17 Read And Clear Port StatusB0 .BYTE F.PRIV!F.READ ; Must be priveleged user0 .BYTE 4*2 ; Four word output buffer required+ .WORD INVFUN ; 20 Dump Internal Memoryo% .BYTE 0 ; Must be priveleged user - .BYTE 0 ; Buff size is tested by function.+ .WORD INVFUN ; 21 Load Internal MemoryY% .BYTE 0 ; Must be priveleged user- .BYTE 0 ; Buff size is tested by functionY% .WORD REDSID ; 22 Read System IDo< .BYTE F.LESS!F.READ ; Not priveleged, buffer can be < 1402 .BYTE 200. ; Up to 200. bytes of buffer needed& .WORD WRTSID ; 23 Write System ID; .BYTE F.PRIV!F.LESS ; Priveleged user, buff can be < 140I2 .BYTE 200. ; Up to 200. bytes of buffer needed/ .WORD REDLOA ; 24 Read Load Server Addresss% .BYTE F.READ ; Anyone can read it;& .BYTE 3*2 ; 3 word buffer required/ .WORD WRTLOA ; 25 Write Load Server Addressz* .BYTE F.PRIV ; Must be priveleged user& .BYTE 3*2 ; 3 word buffer requiredCHRMAX = .-NDLXF . .SBTTL NDLXD - Non-DLX function dispatcher;+(; **-NDLXD-Non-DLX function dispatcher; G; This routine is called to process the non-DLX function(s) specifiedEL; in the user buffer pointed to by the optional diagnostic buffer pointer.; J; If the optional diagnostic buffer is specified, this routine is calledN; before and after the receive or transmit is completed. On the first pass,O; the function requests with sign bit set are processed. On the second pass,N0; the positive function request are processed.;pL; Each function is handled individually. The request function code is usedJ; as dispatch table index and a dispatch made to the individual handler.H; Each handler performs the required action and then returns to FUNSUC>; or FUNUNS and the next requset is processed in the buffer.;J; If an individual request fails the request is left uncompleted and theI; next request in the buffer is processed. An invalid function request J; will terminate processing of the diagnostic buffer as it does not know-; how to step to the next request function.t;oP; This procedure is followed until the end-of-buffer is reached, at which time%; the control request is completed.u;a6; A Characteristics buffer has the following format:;r; Function Code ; Byte Count In; Byte Count Out ; Status; Data ;t ; Next Function Code or 0 ; ...r ;t ; INPUTS:r; R5 -> Port State Table ; R4 -> Controller State Table; R3 = Address of I/O packetu9; I.PRM+12(R3) = Virtual address of diagnostic buffers9; I.PRM+14(R3) = Length of optional diagnostic buffere); I.PRM(R3) = I/O packet extension; ; OUTPUTS:?; Function requests in the diagnostic buffer processed beforeo2; control is returned to the function processor.;;-  .ENABL LSBNDLXD: .IF DF M$$MGE1 MOV IP.EXT(R3),R0 ; R0 = I/O packet extensionS5 MOV IX.DIG(R0),@#KISAR6 ; Map to diagnostic buffera 1! .IF DF K$$DAS ; Kernel data space supported?+6" MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space# .ENDC ; K$$DAS$>% MOV @#KISAR6,C.KIR6(R4) ; Save mapping to diagnostic buffer&' .ENDC ;M$$MGE(?) MOV I.PRM+12(R3),R0 ; R0 = Vitual addr of diagnoctic buffer*++ MOV R0,C.DGBP(R4) ; Save buffer pointer.-, MOV R0,C.DGBE(R4) ; Compute end of bufferD$- ADD I.PRM+14(R3),C.DGBE(R4) ; ....10$:*/ MOV (R0),R1 ; Get next function value"0 BLE INVFUN ; Invalid function122 BIC #177600,R1 ; Generate dispatch table index3 ASL R1 ; ...64 ASL R1 ; ...a5$6 CMP R1,#CHRMAX ; Valid function?7 BHIS INVFUN ; No;18 ADD #NDLXF,R1 ; Point to dispatch table entry$.9 CMP (R1),#INVFUN ; Is it a valid function?-: BEQ INVFUN ; Mark it as invalid functionP;;< BIT #F.00„9ccccPRIV,2(R1) ; Function for priveleged tasks only? = BEQ 40$ ; NoI>2? MOV I.TCB(R3),R2 ; R2 = TCB of requesting task5@ BIT #T3.PRV,T.ST3(R2) ; Is this a priveleged task?c$A BEQ INVFUN ; No, ignore requestB40$:4C CMPB #-1,3(R1) ; Function tests the buffer size?&D BEQ 60$ ; Skip buffer size check.E(F MOV C.DATI(R0),R2 ; R2 = Buffer sizeG)H CMPB R2,3(R1) ; Is buffer big enough?II BEQ 60$ ; yes$J BGT 70$ ; It can't be > maximum/K BIT #F.LESS,2(R1) ; Is it ok if it is less? L BEQ 80$ ; No, buffer errornM60$:)N ADD #C.CHRL,R0 ; Point to data buffer;7O MOV R0,C.DGBP(R4) ; Save curent pointer into bufferIPQ .IF DF M$$MGER S CALL MAPDRV ; Map to driverTU .ENDC ; M$$MGE-V'W CALLR @(R1) ; Dispatch to functionXY; Z; Request too largec[;0\70$: MOV #CE.RTL,C.STAT(R0) ; Buffer too large#] BR 100$ ; Process next requesth^_;Q`; Request too small$a;I1b80$: MOV #CE.RTS,C.STAT(R0) ; Request too small #c BR 100$ ; Process next request,de;r)f; Privelege violation, invalid function g;b hINVFUN:M,i MOV #CE.INV,C.STAT(R0) ; Invalid functionj BR 130$ ; Return$k100$:'l ADD #C.CHRL,R0 ; Point to data area.m8nBUMP: ADD C.DATI-C.CHRL(R0),R0 ; Point to next request/o CMP R0,C.DGBE(R4) ; Are we at end of bufferV'p BLO 10$ ; Go, process next requestq/r130$: CALL MAPDRV ; Map to 2nd 4K of driveru9s CMPB I.FCN+1(R3),#IO.XRC ; Is this a receive function?st BNE 140$ ; No3u CALL RDIDN ; Return to receive diagnostic doneg%v BR 150$ ; Initiate next function5w140$: CALL XDIDN ; Return to xmit diagnostic done.x150$: CALLR FNINI ; Initiate next functiony9z APR5PC NDLXD ; Make sure NDLXD is in APR5 addr space0{M|FUNSUC: MOV #CS.SUC,C.STAT-C.CHRL(R0); Indicate function request successful1} BR BUMP ; Do next request~9FUNUNS: MOV #CE.DNF,C.STAT-C.CHRL(R0); Indicate failure  BR BUMP ; Do next request  .DSABL LSB 0' .SBTTL REDDAD - Read Default Addresse( .SBTTL REDADD - Read Physical Address+ .SBTTL REDLOA - Read Load Server Addresst;+; %; **- REDDAD - Read Default Address &; **- REDADD - Read Physical Address); **- REDLOA - Read Load Server Addressp;D; These three routines are called to retreive the address desired.J; The UNA command is set up and the data returned is moved to the user'sI; buffer. If the user's buffer is too small a data overrun condition isS ; given.;0 ; INPUTS:E; R5 = Port State Tablee; R4 = Controller State Tablel$; R3 = Address of I/O status block*; R0 = Pointer to user diagnostic buffer;a;-  .ENABL LSB5REDDAD: MOV #FN.RDA+200,R1 ; Move in function codeR  BR 10$r5REDADD: MOV #FN.RPA+200,R1 ; Move in function coder  BR 10$ 5REDLOA: MOV #FN.RSA+200,R1 ; Move in function codea10$:% CALLR LODFN ; Load port functionf  .DSABL LSBi+DRADN: ; Entry for interrupt dispatche+DRPDN: ; Entry for interrupt dispatcha+DRSDN: ; Entry for interrupt dispatch3" BCS 10$ ; If carry set, error .IF DF M$$MGE* CALL MAPDRV ; Map to 2nd 4K of driver& MOV C.PCBP(R4),R1 ; Point past PCB ADD #10,R1 ; ...r+ MOV -(R1),-(SP) ; Save address on stack  MOV -(R1),-(SP) ; ... MOV -(R1),-(SP) ; ...05 MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic bufferL, .IF DF K$$DAS ; If data space supported6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS1 MOV (SP)+,(R0) ; Store address in user buffer MOV (SP)+,2(R0) ; ...e MOV (SP)+,4(R0) ; ...; MOV #6,C.DATO-C.CHRL(R0) ; Save number of bytes returned( .IFFn0 MOV C.PCBP(R4),R1 ; Point to 2nd word of PCB TST (R1)+ ; ...1 MOV (R1)+,(R0) ; Store address in user buffer) MOV (R1)+,2(R0) ; ...( MOV (R1)+,4(R0) ; ...o; MOV #6,C.DATO-C.CHRL(R0) ; Save number of bytes returnedd .ENDC ;M$$MGE$ CALLR FUNSUC ; Comp00ʄ_tt tfDATAlete request10$:" CALLR FUNUNS ; Request failed; APR5PC REDDAD ; Make sure REDDAD is in APR5 addr spaceP ) .SBTTL WRTADD - Write physical addressn, .SBTTL WRTLOA - Write load server address;+;('; **- WRTADD - Write Physical AddressT*; **- WRTLOA - Write Load Server Address;sI; This routine sets the load server or physical address of the UNA. TheH; address in the diagnostic buffer is given to the UNA using the Write9; Physical Adress or Write Load Server Address command.;R ; INPUTS:e; R5 = Port State Table ; R4 = Controller State Table ; R3 = Address of I/O packet ; R0 = Request function header;;B;-  .ENABL LSBa WRTADD:d- MOV #FN.WPA+200,R1 ; Set up function codea  BR 10$ WRTLOA:L- MOV #FN.WSA+200,R1 ; Set up function coder10$: .IF DF M$$MGE5 MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic buffern, .IF DF K$$DAS ; If data space supported6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS( ADD #6,R0 ; Point to end of address+ MOV -(R0),-(SP) ; Save address on stackk MOV -(R0),-(SP) ; ...o MOV -(R0),-(SP) ; ...* CALL MAPDRV ; Map to 2nd 4K of driver' MOV C.PCBP(R4),R2 ; Get PCB address CLR (R2)+ ; ...  MOV (SP)+,(R2)+ ; Set up PCB MOV (SP)+,(R2)+ ; ...  MOV (SP)+,(R2)+ ; ...4 .IFFM. MOV C.PCBP(R4),R2 ; Get port control block" CLR (R2)+ ; Skip command word MOV (R0),(R2)+ ; Set up PCBs MOV 2(R0),(R2)+ ; ...D MOV 4(R0),(R2)+ ; ...i .ENDC ;M$$$MGE 9  CMP R1,#FN.WPA+200 ; Are we writing physical address?   BNE 20$ ; No)=  MOV -(R2),C.PADD+4(R4) ; Save physical addr as source addrM  MOV -(R2),C.PADD+2(R4) ; ...s MOV -(R2),C.PADD(R4) ; ...V)20$: CALLR LODFN ; Load port function   .DSABL LSB++DWADN: ; Entry for interrupt dispatch4+DWSAD: ; Entry for interrupt dispatch # BCS 10$ ; If carry set, error.)+ CALLR FUNSUC ; Return function success10$:' CALLR FUNUNS ; Return unsuccessful; APR5PC WRTADD ; Make sure WRTADD is in APR5 addr space $& .SBTTL REDMLT - Read Multicast List ;+!;r$"; **- REDMLT - Read Multicast List#; $; DESCRIPTION:%;P &; INPUTS:V'; R5 = Port State Table;(; R4 = Controller State TableB); R3 = Address of I/O packet*; R0 = Address of user buffer:+;;,;- - .ENABL LSBd .REDMLT:'/ MOV C.PCBP(R4),R1 ; Get PCB addressL0 TST (R1)+ ;51 MOV RELCT,(R1) ; Put unibus relocator addr in PCBn2 MOV RELCT+2,2(R1) ; ... 03 ADD C.WRKP(R4),(R1)+ ; Compute unibus address4 ADC (R1) ; ... 5/6 MOVB #10.,1(R1) ; Ask for all ten addresses 57 MOV #FN.RML+200,R1 ; Read Multicast list function8 CALLR LODFN9:DMLDN: ; BCS 30$3< MOV C.DATI-C.CHRL(R0),R2 ; Get users buffer sizes= CMP #60.,R2 ; Is it > max> BHIS 10$ ; No? MOV #60.,R2 ; Make it max@10$:;A MOV R2,C.DATO-C.CHRL(R0) ; Save number of bytes returnedM,B MOV C.WRKP(R4),R1 ; Point to work buffer&C MOV R0,-(SP) ; Save buffer addressD ASR R2 ; Make count wordsEF .IF DF M$$MGEG20$:*H CALL MAPDRV ; Map to 2nd 4K of driver#I MOV (R1)+,-(SP) ; Get next word (J MOV C.KIR6(R4),@#KISAR6 ; Map to userK,L .IF DF K$$DAS ; If data space supported6M MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceN .ENDC ; K$$DASO)P MOV (SP)+,(R0)+ ; Move the parameters0Q DEC R2 ; Dec.counter(R BNE 20$ ; Loop till donerS MOV (SP)+,R0 ; Restore R0oTU .IFFuV<W20$: MOV (R1)+,(R0)+ ; Copy multicast list to user bufferX DEC R2 ; Dec.counter$Y BNE 20$ ; Loop till done;Z MOV (SP)+,R0 ; Restore R0V[\ .ENDC ;M$$MGE]"^ CALLR FUNSUC ; Return success_30$:$` CALLR FUNUNS ; Complete requesta b .DSABL LSBMc;d APR5PC REDMLT ; Make sure REDMLT is in APR5 addr space ef  g .SBTTL READCT - Read Counters*h .SBTTL READCC - Read And Clear Counters00҄9ccccij;+k; l; **- READCT - Read Counters(m; **- READCC - Read And Clear Countersn;(Jo; This routine is called to retreive the counters maintained by the UNA.p;$ q; INPUTS:lr; R5 = Port State TableRs; R4 = Controller State Tablet; R3 = Address of I/O packet'u; R0 = User diagnostic buffer pointerev;qw;- x .ENABL LSBS yREADCT:A zREADCC:T+{ MOV C.PCBP(R4),R1 ; Get the PCB address | TST (R1)+ ; Point at PCBB+25} MOV RELCT,(R1) ; Put unibus relocator addr in PCB~ MOV RELCT+2,2(R1) ; ...-0 ADD C.WRKP(R4),(R1)+ ; Compute unibus address ADC (R1)+ ; ... MOV #64.,(R1) ; Set byte- MOV #FN.RCN+200,R1 ; Assume Read CountersU .IF DF M$$MGE5 MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic buffere, .IF DF K$$DAS ; If data space supported6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE< CMP C.TYP-C.CHRL(R0),#FN.RCN; Is it Read Counter function BEQ 10$ ; Yes: MOV #FN.CCN+200,R1 ; No, it is Read and Clear Counters10$: .IF DF M$$MGE  CALL MAPDRV ; Map to driver .ENDC ; M$$MGE' CALLR LODFN ; Execute the functionr+DRCDN: ; Entry for interrupt dispatch#+DRCCD: ; Entry for interrupt dispatchF BCS 40$ ; Success5 MOV C.DATI-C.CHRL(R0),-(SP) ; Get user buffer sizev" ASR (SP) ; Make it word count1 .IF DF M$$MGE ; If memory management wupport,* CALL MAPDRV ; Map to 2nd 4K of driver .IFTF ;M$$MGE0 MOV @C.WRKP(R4),R2 ; Get counters word count5 CMP R2,(SP) ; Can user buffer hold all counters? BLOS 20$ ; Yes0 MOV (SP),R2 ; Use word count of user buffer20$:( MOV C.KIR6(R4),@#KISAR6 ; Map to user, .IF DF K$$DAS ; If data space supported6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS; MOV R2,C.DATO-C.CHRL(R0) ; Save number of bytes returnedn ASL C.DATO-C.CHRL(R0) ; .... MOV C.WRKP(R4),R1 ; Point to data returned. TST (R1)+ ; Skip count of words in buffer* MOV R0,(SP) ; Save R0 on stack .IFT ;M$$MGE30$:* CALL MAPDRV ; Map to 2nd 4K of driver# MOV (R1)+,-(SP) ; Get next word(( MOV C.KIR6(R4),@#KISAR6 ; Map to user, .IF DF K$$DAS ; If data space supported6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS) MOV (SP)+,(R0)+ ; Move the parameterse DEC R2 ; Dec.counter) BNE 30$ ; Loop till done1 .IFF ;M$$MGEu230$: MOV (R1)+,(R0)+ ; Copy data to user buffer DEC R2 ; Dec.countere BNE 30$ ; Loop till doneG .ENDC ;M$$MGE MOV (SP)+,R0 ; Restore R0r" CALLR FUNSUC ; Return success40$:" CALLR FUNUNS ; Request failed  .DSABL LSBD; APR5PC READCT ; Make sure READCT is in APR5 addr spacep a .SBTTL REDMOD - Read Mode;+;(; **- REDMOD - Read Mode;e6; This function reads the current mode from the UNA.; ; INPUTS:M; R5 = Port State Table+; R4 = Controller State Tabler; R3 = Address of I/O packet; R0 = Address of user buffer;N;-  .ENABL LSBV REDMOD:;* MOV #FN.RMD+200,R1 ; Read mode command' CALLR LODFN ; Execute the function DRMDN:( BCS 10$ ; If CS, error with command .IF DF M$$MGE* CALL MAPDRV ; Map to 2nd 4K of driver .ENDC ;M$$MGE' MOV C.PCBP(R4),R1 ; Get PCB addressf+ MOV 2(R1),C.MODE(R4) ; Save current mode .IF DF M$$MGE/ MOV C.KIR6(R4),@#KISAR6 ; Map to user buffera, .IF DF K$$DAS ; If data space supported6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ;M$$MGE2 MOV C.MODE(R4),(R0) ; Save Mode in user buffer; MOV #2,C.DATO-C.CHRL(R0) ; Save number of bytes returned $ CALLR FUNSUC ; Complete request10$:" CALLR FUNUNS ; Request failed; APR5PC REDMOD ; Make sure REDMOD is in APR5 addr space    r  .SBTTL WRTMOD - Write M00ڄ_tt tfDATAodeE ;+ ;V; **- WRTMOD - Write mode ;bD; This routine is used to set the mode word in the UNA. To useG; this function, the user should first do a Get Mode to get a copy of.I; the current UNA mode and set all bits currently set to avoid changingVG; a request from other users. A copy of this requested mode is saved I; in case an enable all multicast must be done. The interrupt entry isPG; shared with the set multicast if enable all multicast must be done. ;D ; INPUTS:E; R5 = Port State TableD; R4 = Controller State Tableu; R3 = Address of I/O packet$; R0 = Pointer to user data buffer;,;-  .ENABL LSBt WRTMOD:o  .IF DF M$$MGE!8" MOV C.KIR6(R4),@#KISAR6 ; Restore user buffer mapping#,$ .IF DF K$$DAS ; If data space supported6% MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space& .ENDC ; K$$DAS'( .IFTF ;M$$MGE)&* MOV (R0),-(SP) ; Get new mode bits+, .IFTa-*. CALL MAPDRV ; Map to 2nd 4K of driver/0 .ENDC ;M$$MGE1+2 MOV C.PCBP(R4),R2 ; Get the PCB address '3 CLR (R2)+ ; Clear out old functiont%4 MOV (SP)+,(R2) ; Fill in new mode.=5 BIS #MD.TPD,(R2)+ ; Make sure transmit padding is enabled,6,7 MOV #FN.WMD+200,R1 ; Write mode function%8 CALLR LODFN ; Load port function9:DWMDN:; BCS 10$ ; If CS, errora<= .IF DF M$$MGE>*? CALL MAPDRV ; Map to 2nd 4K of driver@A .ENDC ;M$$MGEB'C MOV C.PCBP(R4),R1 ; Get PCB addressM.D MOV 2(R1),C.MODE(R4) ; Save as current modeEF .IF DF M$$MGEG(H MOV C.KIR6(R4),@#KISAR6 ; Map to userI,J .IF DF K$$DAS ; If data space supported6K MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceL .ENDC ; K$$DASMN .ENDC ;M$$MGEO"P CALLR FUNSUC ; Return successQ10$:"R CALLR FUNUNS ; Request failedS;T APR5PC WRTMOD ; Make sure WRTMOD is in APR5 addr spaceVUV t#W .SBTTL REDSTA - Read Port StatusM-X .SBTTL REDCST - Read And Clear Port StatusMYZ;+[;C!\; **- REDSTA - Read Port Status+]; **- REDCST - Read And Clear Port StatusI^;;K_; This function is called to implement the Read Port Status command. TheRP`; channel status is put in the first three words of the user's buffer followedPa; by the value of the last self-test performed (and power/cable bits). (PCSR1)Db; If the user's buffer is not long enough, the request is returnedc; "unsupported"Td;S e; INPUTS:tf; R5 = Port State Table-g; R4 = Controller State Tableh; R3 = Address of I/O packeti; R0 = Address of user bufferRj;nk;- l .ENABL LSB mREDSTA:h nREDCST: o .IF DF M$$MGEp:q MOV C.KIR6(R4),@#KISAR6 ; Map to user diagnostic bufferr,s .IF DF K$$DAS ; If data space supported6t MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceu .ENDC ; K$$DASvw .IFTF ;M$$MGEx3y MOV #FN.RLS+200,R1 ; Assume Read Status Commandn=z CMP C.TYP-C.CHRL(R0),#FN.RLS; Is this Read Status function { BEQ 10$ ; Yes-| MOV #FN.CLS+200,R1 ; It is Read And Cleara}10$:~ .IFT ;M$$MGE * CALL MAPDRV ; Map to 2nd 4K of driver .ENDC ; M$$MGE' CALLR LODFN ; Execute the functionpDRSTD:DRCSD: BCS 20$ ; IF CS, errorI .IF DF M$$MGE* CALL MAPDRV ; Map to 2nd 4K of driver. MOV C.PCBP(R5),R1 ; Get address of the PCB TST (R1)+ ; Point to data/ MOV (R1)+,-(SP) ; Save status data on stackR MOV (R1)+,-(SP) ; ...  MOV (R1)+,-(SP) ; ...$: MOV C.KIR6(R4),@#KISAR6 ; Map to user diagnostic buffer, .IF DF K$$DAS ; If data space supported6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS6 MOV (SP)+,(R0)+ ; Store status info in user buffer MOV (SP)+,(R0)+ ; ... MOV (SP)+,(R0)+ ; ...t .IFF ;M$$MGE. MOV C.PCBP(R4),R1 ; Get address of the PCB TST (R1)+ ; Point to PCB+2(5 MOV (R1)+,(R0)+ ; Copy Status info to user buffer- MOV (R1)+,(R0)+ ; ...- MOV (R1)+,(R0)+ ; ...K .ENDC ;M$$MGE&009cccc 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 LSB+; APR5PC REDSTA ; Make sure REDSTA is in APR5 addr space V! .SBTTL REDSID - Read System IDe;+;1; **- REDSID - Read System ID1;0B; This routine is called to retreive the system ID from the UNA.;V ; INPUTS: ; R5 = Port State TableE; R4 = Controller State TableC; R3 = Address of I/O packet'; R0 = User diagnostic buffer pointer0; ;-  .ENABL LSBR REDSID: + MOV C.PCBP(R4),R1 ; Get the PCB address  TST (R1)+ ; Point at PCBB+25 MOV RELCT,(R1) ; Put unibus relocator addr in PCBa MOV RELCT+2,2(R1) ; ...T0 ADD C.WRKP(R4),(R1)+ ; Compute unibus address ADC (R1)+ ; ..., MOV #100.,(R1) ; Store word count in PCB0 MOV #FN.RSY+200,R1 ; Read system ID function' CALLR LODFN ; Execute the functionC+DRSID: ; Entry for interrupt dispatcha BCS 20$ ; Success? MOV C.DATI-C.CHRL(R0),R2 ; R2 = # of bytes requested by userV; MOV R2,C.DATO-C.CHRL(R0) ; Save number of bytes returnedt  ASR R2 ; Make it word count. MOV C.WRKP(R4),R1 ; Point to data returned# MOV R0,-(SP) ; Save R0 on stack  .IF DF M$$MGE10$:* CALL MAPDRV ; Map to 2nd 4K of driver# MOV (R1)+,-(SP) ; Get next byte;( MOV C.KIR6(R4),@#KISAR6 ; Map to user, .IF DF K$$DAS ; If data space supported6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS) MOV (SP)+,(R0)+ ; Move the parametersV DEC R2 ; Dec.countere BNE 10$ ; Loop till doneA MOV (SP)+,R0 ; Restore R0 .IFFK610$: MOV (R1)+,(R0)+ ; Move parameters to user area DEC R2 ; Dec.counter  BNE 10$ ; Loop till doneD MOV (SP)+,R0 ; Restore R0 .ENDC ; M$$MGE" CALLR FUNSUC ; Return success20$:" CALLR FUNUNS ; Request failed  .DSABL LSB; APR5PC REDSID ; Make sure REDSID is in APR5 addr space  S" .SBTTL WRTSID - Write system ID;+; ; **- WRTSID - Write system ID;;F; This routine is called to set the system ID parameters in the UNA.M; To use this command the user should first execute a Get System ID commandI; so that default parameter values may be obtained. The user will thenCL; change the fields desired and issue this command to write the parameters; back to the UNA.;. ; INPUTS:; R5 = Port State Table  ; R4 = Controller State Table  ; R3 = Address of I/O packet% ; R0 = Request function data buffer  ;D ;-  .ENABL LSB WRTSID:s .IF DF M$$MGE( MOV C.KIR6(R4),@#KISAR6 ; Map to user, .IF DF K$$DAS ; If data space supported6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ;M$$MGE: MOV C.DATI-C.CHRL(R0),R1 ; R1 = byte count of system ID  ASR R1 ; Make it word count+ MOV R1,-(SP) ; Save word count on stackt( MOV C.WRKP(R4),R2 ; R2 = Work buffer MOV R0,-(SP) ; Save R010$:  .IF DF M$$MGE!(" MOV C.KIR6(R4),@#KISAR6 ; Map to user#,$ .IF DF K$$DAS ; If data space supported6% MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space& .ENDC ; K$$DAS'#( MOV (R0)+,-(SP) ; Get next byter*) CALL MAPDRV ; Map to 2nd 4K of driver)* MOV (SP)+,(R2)+ ; Move the parametersR+, DEC R1 ; Dec.counterD- BNE 10$ ; Loop till doneu./ .IFF,0,1 MOV (R0)+,(R2)+ ; Move ID to work buffer2 DEC R1 ; Dec.counter3 BNE 10$ ; Loop till done045 .ENDC ; M$$MGE6&7 MOV (SP)+,R0 ; Restore R0 at entry8)9 MOV C.PCBP(R4),R1 ; Get PCB+2 address: TST (R1)+ ; ...3; MOV RELCT,(R1) ; Generate unibus address in PCBS< MOV RELCT+2,2(R1) ; ...e= ADD C.WRKP(R4),(R1)+ ; ...;> ADC (R1)+ ; ...,? MOV (SP)+,(R1) ; Store word count in PCB-@ MOV #FN.WSY+200,R1 ; Set up function code;%A C00_tt tfDATAALLR LODFN ; Load port functionMB+CDWSID: ; Entry for interrupt dispatchRD BCS 20$ ; Function failed"E CALLR FUNSUC ; Return successF20$:"G CALLR FUNUNS ; Request failedH I .DSABL LSBVJ;K APR5PC WRTSID ; Make sure WRTSID is in APR5 addr spaceVLM 1>N .SBTTL ****************************************************>O .SBTTL * UNA QIO Driver Subroutines *>P .SBTTL ****************************************************QR,S .SBTTL SALL - Save Registers Co-routineT;+&U; **-SALL- Save Registers Co-routineV;sW; Saves registers R0 - R5.X;l Y; Input:Z; None[;u\;-&]SALL: MOV R0,-(SP) ; Save registers^ MOV R1,-(SP) ; ..._ MOV R2,-(SP) ; ...` MOV R3,-(SP) ; ...a MOV R4,-(SP) ; ...)b MOV 12(SP),-(SP) ; Get return address*/c MOV R5,14(SP) ; Replace return addr with R5 #d CALL @(SP)+ ; Return to caller $e MOV (SP)+,R4 ; Restore registersf MOV (SP)+,R3 ; ...g MOV (SP)+,R2 ; ...h MOV (SP)+,R1 ; ...i MOV (SP)+,R0 ; ...j MOV (SP)+,R5 ; ...k RETURN ;l7m APR5PC SALL ; Make sure SALL is in APR5 addr spaceno ;p .SBTTL BFCHK - Validate optional characteristics buffer.q;+5r; **-BFCHK-Validate optional characteristics buffer(s;;Ft; Check the optional characteristics buffer supplied on transmit andu; receive functions.v;- w; Inputs: x; R3 = Address of I/O packet!y; R5 = Port State Table address(Az; I.PRM+6 - Virtual address of optional characteristics bufferM8{; I.PRM+10- Length of optional characteristics buffer<|; I.PRM+12- Virtual address of optional diagnostic buffer3}; I.PRM+14- Length of optional diagnostic buffera~;s ; Outputs:7; I/O packet extension is set up with relocation biase; for P2 and P3 (; R0 = Error code if buffer is invalid/; 'C' Clear - Buffer is valid or not supplied !; 'C' Set - Buffer is invalida;; Registers modified: ; R0, R1, R2;6 BFCHK: MOV R4,-(SP) ; Save R4$ CLR -(SP) ; Get a work register1 MOV IP.EXT(R3),R4 ; R4 = I/O packet extension-7 MOV I.PRM+6(R3),R0 ; Get address of optional buffer-1 BEQ 50$ ; No optional characteristics bufferu+ MOV I.PRM+10(R3),R1 ; Get buffer lengtht BEQ 40$ ; If EQ, illegal % CMP R1,#XMTBSZ ; Is it too large?e BHI 40$ ; If HI, yes ' CALL MPTHDR ; Map to task's headere7 MOV I.PRM+6(R3),R0 ; Get address of optional buffer" ; ... "MPTHDR" distroyed it  .IF DF R$$MPL ; If RSX-11M++ CALL $CKBFB ; Address check the buffer4 .IFF + CALL $ACHKB ; Address check the buffere .ENDC ; R$$MPL$ BCS 40$ ; If CS, illegal buffer* CALL $RELOC ; Relocate buffer address' MOV R1,2(R4) ; Store bias of buffer5 MOV R2,I.PRM+6(R3) ; ... and it's virtual addressI3 .IF DF M$$MGE ; If memory management supported3 MOV R1,@#KISAR6 ; Map to characteristics buffer, .IF DF K$$DAS ; If data space supported6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE1 MOV #I.PRM+6,R0 ; R0 = Offset into I/O packetM1 CALL CKCHR ; Validate characteristics bufferL. BCS 40$ ; Error in characteristics buffer<10$: MOV I.PRM+12(R3),R1 ; Get optional diagnostic buffer# BEQ 70$ ; No diagnostic buffer$+ MOV I.PRM+14(R3),R1 ; Get buffer length BEQ 60$ ; If EQ, illegala% CMP R1,#XMTBSZ ; Is it too large?D BHI 60$ ; If HI, yest' CALL MPTHDR ; Map to task's headerr8 MOV I.PRM+12(R3),R0 ; Get address of optional buffer" ; ... "MPTHDR" distroyed it  .IF DF R$$MPL ; If RSX-11M++ CALL $CKBFB ; Address check the buffer  .IFFh+ CALL $ACHKB ; Address check the buffer, .ENDC ; R$$MPL$ BCS 60$ ; If CS, illegal buffer* CALL $RELOC ; Relocate buffer address' MOV R1,4(R4) ; Store bias of buffer6 MOV R2,I.PRM+12(R3) ; ... and it's virtual address3 .IF D009ccccF M$$MGE ; If memory management supported3 MOV R1,@#KISAR6 ; Map to characteristics buffer, .IF DF K$$DAS ; If data space supported6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE2 MOV #I.PRM+12,R0 ; R0 = Offset into I/O packet1 CALL CKCHR ; Validate characteristics bufferL BCC 30$ ; Buffer is OKa( BR 60$ ; Clr diag buffer parameters)30$: CLC ; Assume there was no errorv MOV (SP)+,R0 ; Get status$ BEQ 35$ ; All was well ! SEC ; Indicate error return !35$: MOV (SP)+,R4 ; Restore R4* CALL MAPDRV ; Map to 2nd 4K of driver RETURN ; Return to callerp>40$: MOV #IE.SPC&377,(SP) ; Set up illegal buffer error code050$: CLR I.PRM+6(R3) ; Indicate no AUX buffer9 CLR I.PRM+10(R3) ; No optional characteristics bufferB BR 10$ ; Return>60$: MOV #IE.SPC&377,(SP) ; Set up illegal buffer error code870$: CLR I.PRM+12(R3) ; Indicate no diagnostic buffer CLR I.PRM+14(R3) ; ... BR 30$ ; Done9 APR5PC BFCHK ; Make sure BFCHK is in APR5 addr spaceV t2 .SBTTL CKCHR - Validate characteristics buffer;+,; **-CKCHR-Validate characteristics buffer; F; Validate that the characteristics buffer is in the correct format.;- ; Inputs: 7; R0 = Offset in I/O packet to characteristics buffer"; R3 = Address of the I/O packet; APR6 is mapped to buffer; ; Outputs:6; 'C' Clear - Characteristics buffer format is valid8; 'C' Set - Characteristics buffer format is invalid;a+CKCHR: MOV R1,-(SP) ; Get some registerst MOV R2,-(SP) ; ... 5  ADD R3,R0 ; Compute address of buffer descriptorh 4  MOV (R0)+,R1 ; Get virtual address of the buffer/  MOV (R0),R0 ; Get # of bytes in the buffer410$: TST R0 ; Any more bytes left in the buffer?, BEQ 40$ ; If EQ, no ... buffer is valid  BLT 30$ ; Buffer is invalid9 CMP R0,#C.CHRL ; Enough space for a char. descriptor?  BLO 30$ ; If LO, no8 BIT #1,C.DATI(R1) ; Next charac. block word aligned? BNE 30$ ; If NE, no: BIT #1,C.DATO(R1) ; Just in case it is an output buff. BNE 30$ ; If NE, no1 CLR C.STAT(R1) ; Clear characteristics statush< SUB C.DATI(R1),R0 ; Remove space for this characteristic SUB #C.CHRL,R0 ; ...? ADD C.DATI(R1),R1 ; Point to next characteristic descriptorv ADD #C.CHRL,R1 ; ...  BR 10$ ; and loop!"30$: SEC ; Indicate error(#40$: MOV (SP)+,R2 ; Restore registers$ MOV (SP)+,R1 ; ...% RETURN ;&9' APR5PC CKCHR ; Make sure CKCHR is in APR5 addr spaceR() t-* .SBTTL GTPRT - Assign a port to requestorI+;+',; **-GTPRT-Assign a port to requestort-;iF.; Parse the string, search the controller ports for a free /; port..0;- 1; Inputs:2; R3 = Address of I/O packet%3; I.PRM - Bias of stringD24; I.PRM+2 - Virtual address of string)5; I.PRM+4 - Length of string+6;; 7; Outputs:#8; R0 = Error code (if applicable)R)9; IE.NSF - No such in systemK%:; R5 = Address of Port Status Block/;; 'C' Clear - successfully assigned+ <; 'C' Set - Assignment error=;o>; Registers modified:L?; R0, R1, R2, R4, R5@;nAGTPRT:*B MOV R3,-(SP) ; Save I/O packet address:C MOV I.PRM+2(R3),R0 ; Get virtual address of the string@D MOV I.PRM+4(R3),R4 ; Compute address of the end of string +1E3F .IF DF M$$MGE ; If memory management supporteduG1H MOV @IP.EXT(R3),@#KISAR6 ; Map to input stringSI,J .IF DF K$$DAS ; If data space supported6K MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceL .ENDC ; K$$DASMN .ENDC ; M$$MGEO)P CMPB #'L,(R0) ; Check for DELUA first Q BNE 5$ ; No, must be DEUNA!-R TSTB (R0)+ ; Skip over the "l" characterPS CMPB #'U,(R0)+ ; Is it LUA?sT BNE 20$ ; No, errorU BR 7$ ; DELUA so far!V,W5$: CMPB #'U,(R0)+ ; Check for UNA device00_tt tfDATAX BNE 20$ ; ...Y CMPB #'N,(R0)+ ; ...Z BNE 20$ ; ...[7$: CMPB #'A,(R0)+ ; ...\ BNE 20$ ; ..."] CMPB #'-,(R0)+ ; Check for "-"^ BNE 20$ ; Syntax errorv_)` MOVB (R0),R1 ; Get controller numberN!a CMPB R1,#'0 ; Below ASCII 0?)b BLT 20$ ; Yes, error"c CMPB (R0),R1 ; Above ASCII 7?d BGT 20$ ; Yes, errorh(e BIC #177770,R1 ; Clear unwanted bitsf2g CMP R1,#U$$NCT-1 ; Is controller number valid?(h BHI 20$ ; Invalid controller numberi+j ASL R1 ; Covert it to controller indexR0k MOV CTABL(R1),R4 ; R5=Controller State Tablel)m MOV R4,R5 ; Gen pointer to port list)1n ADD #C.PORT,R5 ; Point to port list root word,o10$: MOV (R5)+,R5 ; Get next port addressp BEQ 20$ ; End of list,q BIT #PS.OPN,P.FLAG(R5) ; This port open?r BNE 10$ ; No#s CLC ; Indicate good returnCt BR 30$ ; Returnn-u20$: MOV #IE.NSF,R0 ; Say, no such linel)v SEC ; Indicate no available portnw30$:*x CALL MAPDRV ; Map to 2nd 4K of drivery MOV (SP)+,R3 ; Restore R3Rz RETURN ;{9| APR5PC GTPRT ; Make sure GTPRT is in APR5 addr space}~ .  .SBTTL MAPBF - Map to buffer;+; **-MAPBF-Map to buffer; A; This routine takes the physical address in I.PRM+2 and IX.ADR ;; and computes APR5 bias and displacement for I/O buffer.c;- ; Inputs:; R3 = I/O packet address:); I.PRM+2 = Low order physical address*; I.PRM+1 = High order physical address; ; Output:V; KISAR6 mapped with bias; R2 = Displacemento;R; Registers R1 changed; MAPBF: MOV R0,-(SP) ; Save R06 MOV I.PRM+2(R3),R1 ; R1 = Low order buffer address: MOV @IP.EXT(R3),R0 ; R0 = High order bits in high byte;eI; For 18 bit systems the high bits are in bits 4 and 5. Otherwise, thes4; high byte contains the high bits of the address.;O/ .IF DF M$$EXT ; Extended memory supported?a* SWAB R0 ; High order bits in low byte .IFF ; If 18 bit systemA/ ASR R0 ; Move bits 4 and 5 to bits 0 and 1 ASR R0 ; ...g ASR R0 ; ...M ASR R0 ; ... 2 BIC #177774,R0 ; Make sure high bits are clear .ENDC ; M$$EXT1 .IF DF M$$EIS ; If extended instrucation set & ASHC #-6.,R0 ; Calculate APR bias .IFFh  .REPT 6! ROR R0 ; Divide by octal 100o ROR R1 ; ...O .ENDR .ENDC ; M$$EIS! MOV R1,@I.PRM(R3) ; Save bias ; BIC #177700,I.PRM+2(R3) ; R2 = Offset into 1st 100 bytes; BIS #140000,I.PRM+2(R3) ; R2 = Virtual address of buffer " MOV (SP)+,R0 ; R0 = Restore R0 RETURN ; Return to caller;9 APR5PC MAPBF ; Make sure MAPBF is in APR5 addr space $/ .SBTTL GTXMH - Get a transmit header packetH;+); **-GTXMH-Get a transmit header packet;.8; This routine will allocate a transmit header packet.;- ; Inputs:+; Transmit header list (C.XBUF root word));a ; Output:B ; R0 points to transmit header,; 'C' Clear - Transmit header packet found0; 'C' Set - Transmit packet header NOT found; ; Registers R1 changed; 'GTXMH: MOV R2,-(SP) ; Save R2 and R3  MOV R3,-(SP) ;* $DQPKT C.XHDR ; Get a transmit packet1 MOV R3,R0 ; Put transmit packet header in R1*$ MOV (SP)+,R3 ; Restore R3 and R2 MOV (SP)+,R2 ; RETURN ; e2 .SBTTL GTPST - Get address of Port State Table;+,; **-GTPST-Get address of Port State Table; C; This routine gets the address of the port control block via the ; I/O packet.m;c ; Inputs:T; R3 = Address of I/O packet;d ; Outputs:$; R5 = Address of Port State Table*; R4 = Address of Controller State Table;s; Registers Changed0 ; R4, R5;-6GTPST: BIT #CS.INI,C.FLAG(R4) ; Are we initializing?- BNE 20$ ; Yes, init does not use a port.e. BIT #1,R3 ; Do we have a real I/O packet? BNE 20$ ; No, just return.e- MOV I.TCB(R3),R5 ; Get task's TCB address : M009ccccOV T.PCB(R5),R5 ; .. then PCB addr of task's window 0) ; .. (PCB=Partition Control Block)o/ TST P.HDR(R5) ; Task Header in primary pools .IF DF R$$MPL .IF DF M$$MGE/ BNE 10$ ; If NE, header is in primary pool0. MOV P.REL(R5),@#KISAR6 ; Map to task header, .IF DF K$$DAS ; If data space supported6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS10$: .ENDC ;M$$MGE .ENDC ;R$$MPL, MOV @I.LN2(R3),R5 ; Get port state table( BIC #1,R5 ; Clear LUN interlock bit2 MOV P.CTBL(R5),R4 ; Get Controller State Table* CALL MAPDRV ; Map to 2nd 4K of driver#20$: RETURN ; Return to caller.9 APR5PC GTPST ; Make sure GTPST is in APR5 addr spaceo   V+  .SBTTL LODFN - Load Secondary Functoion(  .SBTTL LODCM - Load Primary Function ;+;S'; **- LODFN - Load Secondary Functione%; **- LODCM - Load Primary FunctionC;MF; These simple routines load the requested commands into the UNA and; intitiate the request.;o ; Inputs:V; R4 = Controller State TableS; R3 = Address of I/O packet(; R1 = Secondary Function (LODFN only)*; R0 = Primary Function (only for LODCM);s; Registers Modified: ; R0,R1;;-  .ENABL LSBa!LODFN:#" MOV #CM.GCM,R0 ; Set up command .# MOVB R0,C.FUNS(R4) ; Save Primary Function7$ MOVB R1,C.FUNS+1(R4) ; Save secondary function codeF/% BIC #177740,R1 ; Make sure its a legal codee1& MOV R1,@C.PCBP(R4) ; Set up secondary command ' BR 10$.()LODCM:)* CLRB C.FUNS+1(R4) ; No function value+3,10$: MOV R3,C.CFNC(R4) ; Save addr of I/O packet 3- MOVB @C.CSR(R4),-(SP) ; Get current CSR contentsC5. BICB #R0.PCM,(SP) ; Clear out any command present4/ BIC #^C,R0 ; Make sure we save only code"0 BISB R0,(SP) ; Set command in01 MOVB (SP)+,@C.CSR(R4) ; Issue primary command263 MOVB R0,C.FUNS(R4) ; Save current primary function4&5 MOVB #CNTTIM,C.CTMR(R4) ; Set timer67 CALL CLOCK ; Start timerB89 RETURN ;: ; .DSABL LSBR<= f'> .SBTTL POLRG - Poll Ring SubroutineR?@;+A; "B; **-POLRG-Poll Rings SubroutineC;;HD; This routine is called when a transmit request or requests have beenNE; added to the transmit chain or when a receive buffer has been added to theKF; receive chain. If the poll request flag already set, the routine exits.MLG; Otherwise CS.POL is set in the controller flag and controll is passed toH; the function initiator. I; J;t K; INPUTS:L; R4 = Controller State TableSM;N; REGISTERS MODIFIED:-O; NoneP;oQ;- R .ENABL LSB 8SPOLRG: BIT #CS.POL,C.FLAG(R4) ; Poll flag already set?T BNE 10$ ; Yes, just returne7U BIS #CS.POL,C.FLAG(R4) ; Request a poll of the rings /V CALLR FNINI ; Try to initiate the function#W10$: RETURN ; Return to callerfXY d"Z .SBTTL LODUM - Load UNA memory[;+\;L]; **-LODUM-Load UNA memory^;c _; Inputs:s`; R3 - Address of I/O packeta; R4 - Controller State Tableb;= c; Outputs:d; IS.SUC - Sucessful LoadRAe; IS.ABO - Time out or fatal controller error, load is aborted.Sf;Cg;-h .ENABLE LSBiLODUM:.j MOV I.PRM+2(R3),R0 ; R0 = Microcode bufferk7l MOV R0,C.LOAD+2(R4) ; Compute end of buffer pointerI$m ADD I.PRM+4(R3),C.LOAD+2(R4); ...7n MOV R0,C.LOAD+4(R4) ; Save it again as work pointerO5o MOV C.RBFL(R4),C.LOAD+6(R4) ; Get a receive bufferN7p MOV @C.LOAD+6(R4),C.RBFL(R4); Dequeue receive bufferkq10$:/r MOV R3,C.CFNC(R4) ; Save I/O packet addresss3t .IF DF M$$MGE ; If memory management supportedtu5v MOV @IP.EXT(R3),@#KISAR6 ; Map to microcode bufferBw,x .IF DF K$$DAS ; If data space supported6y MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spacez .ENDC ; K$$DAS{+| MOV @#KISAR6,C.LOAD(R4) ; Save APR6 bias.}~ .ENDC ; M$$MGE4 MOV (R0)+,-(SP) ; Save byte count of this record4 MOV (R0)+,-(SP) ; Save UNA internal load address* CALL MAPDRV ;00 _tt tfDATA Map to 2nd 4K of driver: MOV C.WRKP(R4),R1 ; Get pointer to scratch area (UDBB)/ MOV 2(SP),(R1) ; Set byte count of transfer@8 BEQ 40$ ; If EQ, End of load sections in this block4 BMI 70$ ; Branch to load start address function/ MOV (SP)+,6(R1) ; Copy the WCS load addressS4 CLR 10(R1) ; Clear high order byte of load addr7 CMP (SP),#512.-4. ; Is byte count GT a disk buffer?o BHI 35$ ; Yes, abort load8 ADD #4,C.LOAD+4(R4) ; Point to next record in buffer ADD (SP),C.LOAD+4(R4) ; ...1 MOV RELCT,2(R1) ; Set relocation bias in UDBBB MOV RELCT+2,4(R1) ; ...b- MOV C.LOAD+6(R4),R3 ; Use receive buffer.n3 ADD R3,2(R1) ; Compute Unibus address of bufferc ADC 4(R1) ; ...20$:1 .IF DF M$$MGE ; If memory management supportS/ MOV C.LOAD(R4),@#KISAR6 ; Map to user bufferr, .IF DF K$$DAS ; If data space supported6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE1 MOVB (R0)+,-(SP) ; Copy data from user bufferR* CALL MAPDRV ; Map to 2nd 4K of driver* MOVB (SP)+,(R3)+ ; Copy to load buffer$ DEC (SP) ; Decrement byte count BNE 20$ ; Loop till donef TST (SP)+ ; Tidy stack.9 MOV C.PCBP(R4),R3 ; Get pointer to Port Control Block1 MOV RELCT,2(R3) ; Set relocation bias in UDBB MOV RELCT+2,4(R3) ; ...a) ADD R1,2(R3) ; Compute Unibus address6 ADC 4(R3) ; .../ MOV C.CFNC(R4),R3 ; Restore R3 for "LODFN".M, MOV #FN.LOA,R1 ; Microcode load function' CALLR LODFN ; Execute the functionn;r#; We get here after the interruptl;u%LOADN: BCS 30$ ; Errors are fatalu, MOV C.LOAD+4(R4),R0 ; Get buffer pointer8 CMP R0,C.LOAD+2(R4) ; Have we reached end of buffer?% BLO 10$ ; No, continue with load2! BEQ 50$ ; Yes, end of buffer30$:# CALL IEABO ; Abort the request34 CALL MAPDRV ; Make sure we are mapped to driver# CALL FTL ; Do fatal processingf$ BR 60$ ; Free up receive buffer135$: TST (SP)+ ; Remove byte count from stackn BR 30$ ; Abort load;f; End of buffer;40$:  CMP (SP)+,(SP)+ ; Tidy stack50$:9 MOV #IS.SUC&377,R0 ; Successful load of load sections 6 MOV C.LOAD+4(R4),R1 ; Compute number of characters& SUB I.PRM+2(R3),R1 ; ... processed! CALL RQDON ; Return I/O done ;60$: MOV C.RBFL(R4),@C.LOAD+6(R4); Free up receive bufferd$ MOV C.LOAD+6(R4),C.RBFL(R4) ; ... RETURN ;; ; End of loadu;70$:+ MOV C.PCBP(R4),R1 ; Get the PCB addressn/ MOV (SP)+,2(R1) ; Move in the start addressb7 CLR 4(R1) ; Clear high order addr (DELUA specific) TST (SP)+ ; Get rid of -15 MOV #FN.LSM,R1 ; Load and start microcode address17 CALL LODFN ; Issue the command, the interrupt will;) ; return control to LSMDN in CTINIO# BR 50$ ; Return I/O completionL  .DSABL LSBr9 APR5PC LODUM ; Make sure LODUM is in APR5 addr space  3 .SBTTL FTL - Fatal controller error processor4;+!; **-FTL-FATAL controller error+;)9; This subroutine performs fatal controller processing. ;-;( ; Inputs:c; R4 = Controller State Table1;M ; Outputs:;a; 1. The controller is reset1; 2. If controller initializing, retry 3 times.w0; 3. Port related data structures are released;; 4. All I/O packets are returned to the requesting tasks; with IE.ABO status code.U:; 5. All ports belonging to the controller are marked as6; requiring initialization (IO.XIN QIO function).9; This is required to simulate DECnet functionality.n;e  .ENABL LSB'FTL: CALL SALL ; Save all registers % TST C.CSR(R4) ; Do we have a CSR? BEQ 10$ ; Noe8 MOVB #R0.RST,@C.CSR(R4) ; Reset the UNA so that it is* ; ... put in a known state. Do not ; ... enable interrupts.s/10$: CLR C.CTMR(R4) ; Clear controller timert) CLR C.XMTT(R4) ; Clear transmit timerl, BIS #CS.OFL,C009cccc.FLAG(R4) ; Indicate offline CLR CLKFG ; Stop the clock 0 BIT #CS.INI,C.FLAG(R4) ; Are we initializing? BEQ 20$ ; non+  DECB C.RTRY(R4) ; Decrement retry count (  BLE 20$ ; We have tried three times ;w? ; we will try to initialize the controller up to three times.R ;t8 MOV #-2,C.FUNS(R4) ; Set up current command dispatch= MOVB #RSTIM,C.CTMR(R4) ; Set up timer for possible failure < MOVB #R0.IE,@C.CSR(R4) ; Re-enable interrupts, cleared by ; ... reset9 MOV C.INIW(R4),C.CFNC(R4) ; Get 1st waiting I/O packeth BR 95$ ; Return;I(; Release port related data structures; 620$: BIC #CS.INI,C.FLAG(R4) ; No longer initializing& MOV R4,R0 ; Generate port address ADD #C.PORT,R0 ; ...,30$: MOV (R0),R5 ; Get next port in list BEQ 40$ ; No more!4. CALL RLPRT ; Release port data structures6 BIS #PS.XIN,P.FLAG(R5) ; Set requirs initialization# MOV R5,R0 ; Point to next portn BR 30$ ; Go, get next port. ;t.!; Return I/O packets with IE.ABO status code";p-#40$: MOV R4,R5 ; Point to xmit wait queue $ ADD #C.XMWQ,R5 ; ... % CALL 100$ ; Abort Q entries&,' MOV R4,R5 ; Point to receive wait queue( ADD #C.RCVW,R5 ; ...$) CALL 100$ ; Abort queue entries*,+ MOV R4,R5 ; Point to xmit pending queue, ADD #C.XMTP,R5 ; ...-50$:3. MOV (R5),R3 ; R3 = Transmit pending I/O packete/ BEQ 60$ ; No more40 MOV C.XMTC(R4),R2 ; Get next item from xmit ringA1 MOV RG.LNK(R2),C.XMTC(R4) ; Move current pointer to next entrye2?3 MOV C.XHDR(R4),@RG.VAD(R2) ; Insert xmit header in free listQ"4 MOV RG.VAD(R2),C.XHDR(R4) ; ...526 .IF DF M$$EXT ; If extended memory supported?758 MOV C.XMTC(R4),R2 ; Get xmit data entry from ringe+9 MOV RG.UMR(R2),R2 ; R2 = UMR wait blockn:/; ADD #10,R2 ; Point to UMR assignment block(< CALL $DEUMR ; Deassign UMRI=> MOV C.UCB(R4),R1 ; R1 = UCB?@ .IFTF ; M$$EXTA/B MOV C.XMTC(R4),R2 ; R2 = Current ring entry)CD .IFT ; M$$EXToEGF MOV U.UCBX+6(R1),@RG.UMR(R2); Insert wait block into wait block listl$G MOV RG.UMR(R2),U.UCBX+6(R1) ; ...HI .ENDC ; M$$EXTJAK MOV RG.LNK(R2),C.XMTC(R4) ; Move current pointer to next entrydL"M MOV (R5),R3 ; R3 = I/O packet#N MOV (R3),(R5) ; Deque from listD*O CALL IEABO ; Return with abort status P BR 50$ ; Loop till all doneQ60$:0R MOV R4,R5 ; Point to pending function queueS ADD #C.PFNC,R5 ; ...$T CALL 100$ ; Abort queue entriesU)V MOV R4,R5 ; Point to init wait queueRW ADD #C.INIW,R5 ; ...$X CALL 100$ ; Abort queue entriesY+Z MOV R4,R5 ; Point received buffer listT[ ADD #C.RCVD,R5 ; ...\70$:*] MOV (R5),R0 ; Get next receive buffer^ BEQ 90$ ; We are done3_ MOV (R0),(R5) ; Deque buffer from received list 4` MOV C.RBFL(R4),(R0) ; Insert buffer in free lista MOV R0,C.RBFL(R4) ; ...V b BR 70$ ;tc5d90$: CLR C.CFNC(R4) ; There is no current functionLe CLR C.FUNS(R4) ; ...1f95$: BR FRERCV ; Free up receive ring buffersRg-h100$: MOV (R5),R3 ; Get next item in listqi BEQ 120$ ; Done j MOV (R3),(R5) ; Dequeue itemk;+Gl; We must check if the request is an open request. If it is, we haveuHm; to free up the port assigned to it and clear the 2nd word of the lunn; entry in the task header.,o;-6p MOVB I.FCN+1(R3),-(SP) ; Get function code for this+q BIC #^C<177>,(SP) ; Clear unwanted bits 0r CMP (SP)+,#FCOPN ; Is this an open function?"s BNE 110$ ; No, just abort it.'t CALL MPTHDR ; Map to task's header -u MOV @I.LN2(R3),R0 ; R0 = Port State Table -v BIC #1,R0 ; Clear possible interlock bit+'w CLR P.FLAG(R0) ; Show port not openo;x CLR @I.LN2(R3) ; Show not open in 2nd word of LUN entryi*y CALL MAPDRV ; Map to 2nd 4K of driverz({110$: CALL IEABO ; Abort the request| BR 100$ ; Do next itemc}$~120$: RETURN ; Return to caller8 APR5PC FTL ; Make sure FTL is in APR5 address space  .DS00_tt tfDATAABL LSB1 o* .SBTTL FRERCV - Free up receive buffers;+"; **-FRERCV-Free receive buffers;r@; This routine deallocates the buffers assigned to the receive; ring entries.S;o ; Inputs:; Receive ring entries;p ; Outputs:1; Receive buffers are returned to the free list ;r; Registers modified: ; R0;-5FRERCV: MOV C.RCVB(R4),R0 ; R0 = Receive ring baseN/10$: TSTB RG.ACT(R0) ; Is this entry active?e BEQ 20$ ; No5> CLRB RG.ACT(R0) ; Deactivate it. So we don't do this again1 MOV RG.VAD(R0),R1 ; Get Unibus addr of bufferr- MOV C.RBFL(R4),(R1) ; Insert in free listt MOV R1,C.RBFL(R4) ; ...e*20$: MOV RG.LNK(R0),R0 ; Get next entry) BEQ 30$ ; Not yet initialized, skip.u4 CMP R0,C.RCVB(R4) ; Have we scanned all entries? BNE 10$ ; Noi#30$: RETURN ; Return to callerR .( .SBTTL CTINI - Initialize Controller;+;G"; **-CTINI-Initialize Controller;QE; This routine is called to start up the UNA hardware. This processaQ; involves several commands to the UNA hardware and for this reason the routine K; is actually a series of smaller routines executed after a Commmand Done ; Interrupt.G; If this is the first time the device has been used since the drivereM; has been loaded, then a self-test will be run on the UNA. After a timeouteJ; has expired, the UNA will be checked for a "READY" state. If "READY",H; then the Port Control Block is given to the UNA and Read Port StatusO; command is executed to obtain the microcode revision number. The microcode ?; load support task is run passing to it the revision number.lH; After the hardware operation has been verified the rings are set up.L; The UNA control command block is given to the UNA and this block is usedH; to issue the Read Ring Descriptor and Read Mode commands to the UNA.D; If at any time a control request fails or times out the start upJ; procedure is aborted and all outstanding request will be returned with; IE.ABO I/O status code.h;r ; BEGIN:; ENABLE INTERRUPTSd ; RESET UNAp; SELFTEST UNA; IF READY STATE&; IFF REPORT ERROR - ABORT"; IFT GIVE PCB TO CONTROLLERG; READ PORT STATUS TO OBTAIN MICROCODE REVISION NUMBER NEEDEDh ; BY MICROCODE SUPPORT TASKD; RUN MICRO CODE SUPPORT TASK AND PASS TO IT THE MICROCODE9; REVISION #, CSR OF CONTROLLER AND CONTROLLER INDEX; LOAD MICROCODE; SET UP RINGSe; WRITE DEFAULT MODE; INITIALIZE RINGSh; START UNA ; ENDIFI;U ; INPUTS:E; R4 = Controller State TableR;-   .ENABL LSBECTINI:: ; LK7057 BIT #CS.INI,C.FLAG(R4) ; Are we initializing ;**-1B BEQ 10$ ; yes RETURN ; No, return.;D; Perform a reset on device ; 510$: CALL FRERCV ; Free up receive buffers from aR  ; ... privious initialize6 BIS #CS.INI,C.FLAG(R4) ; Say initialize in progress. MOVB #RETRYC,C.RTRY(R4) ; Set retry counter' MOV R3,C.CFNC(R4) ; Save I/O packetN8 MOV #-2,C.FUNS(R4) ; Set up current command dispatchF MOVB #SLFTIM,C.CTMR(R4) ; Set up timer for possible failure ; LK705? MOVB #R0.RST,@C.CSR(R4) ; Reset the UNA so that it is ;**-1;! ; ... put in a known state< MOVB #R0.IE,@C.CSR(R4) ; Re-enable interrupts, cleared by ; ... reset BR 20$ ; Start clock;RSTDN:( BCS 30$ ; Timeout error with device;t%; Perform a self-test on the deviceT;)' MOV R3,C.CFNC(R4) ; Save I/O packet)/ MOV #-1,C.FUNS(R4) ; Set up current commandt> MOVB #SLFTIM,C.CTMR(R4) ; Set up timer for possible failure; MOVB #CM.SLF!R0.IE,@C.CSR(R4); Issue a self-test commandR20$: CALLR CLOCK ; Start clock; ; Self-test done entry;+SLFDN: ; Entry for interrupt dispatchp) BCS 30$ ; UNA hard error, go log it.0& MOV C.CSR(R4),R2 ; Get CSR address) MOV PCSR1(R2),R2 ; Get PCSR1 contents' BIC #177760,R2 ; Extract sta00"9ccccte bits)9 CMP #ST.RDY,R2 ; Ready? (This also checks transceiverN ; and cable bits)' BNE 30$ ; Nope - something's wrongu o;e8; Set up and execute Get Control Block address command;o& MOV C.CSR(R4),R2 ; Get CSR address5 MOV RELCT,PCSR2(R2) ; Put relocation bias in UDBB ( MOV RELCT+2,PCSR3(R2) ; ... High bits0 ADD C.PCBP(R4),PCSR2(R2) ; Set up PCB address ADC PCSR3(R2) ;d+ MOV #CM.GPB,R0 ; Set up primary commandt  CALLR LODCM ; Load commands ;b1 ; Get Control Block Address function completion  ;c+ GPBDN: ; Entry for interrupt dispatch  BCS 30$ ; Function failed;;; Read Controller Status to get microcode revision numberc;d. MOV #FN.RLS,R1 ; R1 = Read Status function% CALLR LODFN ; Load port functionn8UMLNAM: .RAD50 /UML.../ ; Micro code loader task nameRLSDN:! BCS 30$ ; Read status failedA7 MOV C.PCBP(R4),R1 ; R1 = Port Control Block addressm# TST (R1)+ ; Skip function words8 MOV (R1)+,C.RREV(R4) ; Save microcode revision number? MOV (R1)+,C.MMAX(R4) ; Save max # of multicast addr possible 1 MOV (R1)+,C.MXCT(R4) ; Save counter block sizes* MOV R3,-(SP) ; Save I/O packet address. MOV #UMLNAM,R3 ; Point to loader task name-  CALL $SRSTD ; See if loader is installedN,! MOV R0,MLTCB ; Save microcode loader TCB!" BCC 25$ ; Fatal if not thereR# $ .IF DF R$$MPL ; If RSX-11M+%;& MOV #T.NKLF,R0 ; "Microcode loader not present" messagec ' CALL $DVMSG ; Print message-( MOV (SP)+,R3 ; Restore I/O packet address+-) BR LSMDN1 ; Continue with initializationi* + .IFF ;,-- MOV (SP)+,R3 ; Restore I/O packet address(/. BR 30$ ; This is fatal if loader not there /0 .ENDC ; R$$MPL11225$: MOV (SP)+,R3 ; Restore I/O packet addressM/3 MOV #SENDBK,R1 ; Set length of block needed2&4 CALL $ALOCB ; Allocate core block$5 BCS 25$ ; Loop until you get it6#7 MOV R0,R1 ; Copy block addresst%8 CLR (R0)+ ; Skip over first words79 MOV C.INDX(R4),(R0)+ ; Put controller index in blockB: MOV C.DCB(R4),R2 ; R2 = DCBl6; MOV D.NAM(R2),(R0)+ ; Put controller name in block6< MOV C.PCBP(R4),R2 ; Get Port Control Block address/= BIC #177700,2(R2) ; Isolate revision number2> MOV 2(R2),(R0) ; Save revision number in block?-@ CLRB 1(R0) ; Clear DELUA/DEUNA flag byteC$A MOV C.CSR(R4),R2 ; R2 = CSR addr4B BIT #20,PCSR1(R2) ; Is controller DEUNA or DELUAC BEQ 27$ ; DEUNAD INCB 1(R0) ; DELUAvE27$:;F MOV R3,C.CFNC(R4) ; Save I/O packet of current functioncKG MOV #+CM.GCM,C.FUNS(R4) ; Set wait for microcode loader taskrH*I MOV MLTCB,R0 ; R0 = Task Control Block&J ; R1 = Address of message block2K CALL $EXRQF ; Request microcode loader to runL+M MOV #UMLTIM,C.CTMR(R4) ; Set timer value0N CALLR CLOCK ; Start clockOP;VDQ; We get here if the Microcode Loader Task does not respond within!R; the time out value specified.AS;ITMLTMO:UV;vHW; We get here on a time out or controller error. This code will forceX; fatal initialization..Y;R6Z30$: MOV R4,R2 ; Generate error log packet pointer[ ADD #C.LOG,R2 ; ...l1\ MOV #ER.FCI,E.TYPE(R2) ; Fatal controller initC] MOV C.CSR(R4),R0 ; Get CSR1^ MOV (R0)+,E.CSR0(R2) ; PCSR0 into error packet 1_ MOV (R0)+,E.CSR1(R2) ; PCSR1 into error packet'` MOV C.PCBP(R4),R0 ; Get PCB pointere5a ADD #E.PCB,R2 ; Point to PCB save in error packets.b MOV (R0)+,(R2)+ ; Save PCB in error packetc MOV (R0)+,(R2)+ ; ...rd MOV (R0)+,(R2)+ ; ...le MOV (R0)+,(R2)+ ; ...a-f MOV R3,-(SP) ; Save address of I/O packeto&g CLR R3 ; No associated I/O packeth CALL ERLOG ; Log the error %i MOV (SP)+,R3 ; Restore I/O packetRj$k CALLR FTL ; Do fatal processinglm;nGn; We will come here after the micro code has been successfully loadedMo;PpLSMDN:0q BCS 30$ ; If CS, error - abort the functionr;s-s; Set up Get Ring Descriptor Command in PCBet00*_tt tfDATA;i8uLSMDN1: MOV C.PCBP(R4),R2 ; Get Command Block Address+v TST (R2)+ ; Skip to second word in PCBM0w MOV RELCT,(R2) ; Put relocation bias in UDBB%x MOV RELCT+2,2(R2) ; ... High bitsL7y ADD C.WRKP(R4),(R2)+ ; Move in scratch block addressOz ADC (R2)+ ; ...{; |; Set up the ring descriptor}; 3~ MOV C.WRKP(R4),R2 ; Retrieve descriptor addresss0 MOV RELCT,(R2) ; Put relocation bias in UDBB% MOV RELCT+2,2(R2) ; ... High bits3 ADD C.XMTB(R4),(R2)+ ; Compute unibus address of! ADC (R2) ; ... transmit ringm( TSTB (R2)+ ; Skip high address byte9 MOVB #,(R2)+ ; Fill in entry size (in words) 3 MOV #U$$NTS*2,(R2)+ ; Fill in number of entries0 MOV RELCT,(R2) ; Put relocation bias in UDBB% MOV RELCT+2,2(R2) ; ... High bits 3 ADD C.RCVB(R4),(R2)+ ; Compute unibus address of  ADC (R2) ; ... receive ring( TSTB (R2)+ ; Skip high address byte9 MOVB #,(R2)+ ; Fill in entry size (in words)41 MOV #U$$NRS,(R2)+ ; Fill in number of entries ; ; Load the write ring request ;h& MOV #FN.WRG,R1 ; Secondary command" CALLR LODFN ; Execute command;#$; Write Ring Descriptor completion;WRGDN: BCS 30$ ; Function Failed;i2; Set up the operating mode (padding, CRC, etc.);R' MOV C.PCBP(R4),R2 ; Get PCB address * MOV C.MODE(R4),2(R2) ; Set default mode& MOV #FN.WMD,R1 ; Secondary command" CALLR LODFN ; Execute command;(; Write Mode completion(; +WMEDN: ; Entry for interrupt dispatcht BCS 30$ ; Function failed;#; Initialize the rings;* MOV R3,-(SP) ; Save current I/O packet" CALL INIRG ; Initialize rings3 CALL GTRBF ; Allocate buffers for receive ring% MOV (SP)+,R3 ; Restore I/O packet . MOV #FN.RDA,R1 ; R1 = Read default address CALLR LODFN ; do it!(; +; Read default address interrupt completea;mRDADN: BCS 30$ ; Function failed/ MOV C.PCBP(R4),R0 ; R0 = Port Control Block  TST (R0)+ ; Skip 1st word. MOV (R0)+,C.PADD(R4) ; Save default address MOV (R0)+,C.PADD+2(R4) ; ...R MOV (R0)+,C.PADD+4(R4) ; ...t;C; Issue the Start requests;+ MOV #CM.STR,R0 ; Set up primary commande$ CALLR LODCM ; Issue the command;e; Start request completion;e,STRDN: ; Entry from interrupt dispatch# BCS 30$ ; Something went wrongr840$: $DQPKT C.INIW ; Deque item from init wait queue BCS 50$ ; No more) CALL ISSUC ; Return success I/O done; BR 40$ ; Loop till no moreD50$:/ CLR C.FLAG(R4) ; Indicate controller online * CALLR POLRG ; Request controller poll  .DSABL LSBr s4 .SBTTL UMRMP - Map transmit I/O buffer with UMRs;+&; **-UMRMP- Map I/O buffer with UMRs;rH; This routine gets a trasmit ring packet, UMR maps the I/O buffer andH; sets up the transmit ring entry. This routine does not set the end#; packet flag in the ring entry. ; ; Inputs: ; R3 = Address of I/O packet; R4 = Controller State Tabler; ; Output:C'; R1 = Pointer to transmit ring entry;L;-%UMRMP: CALL SALL ; Save registers.; E; NOTE - For each transmit header buffer there is a UMR wait block.N; This routine is called by the INIXM routine. A header buffer is allocatedL; before this routine is called. Therefore, there must be a free transmit; ring entry. ;n, CALL GFXRE ; Get a transmit ring packet& BEQ 20$ ; Crash if none available  .IF DF R$$MPL ; If RSX-11M+ MOV C.KRB(R4),R2 ; R2 = KRB .ENDC ; R$$MPL MOV C.UCB(R4),R5 ; R5 = UCBL MOV C.SCB(R4),R4 ; R4 = SCB1 MOV IP.EXT(R3),R0 ; R0 = I/O packet extension . MOV I.PRM+4(R3),RG.LEN(R1) ; Segment length ; Assume 22 bit systeme@ MOV I.PRM+2(R3),RG.ADD(R1) ; Low order 16 bits of buffer addr1 .IF DF M$$EXT ; If extended memory supportedC2 MOVB 1(R0),RG.AD2(R1) ; High order address bits .IFF ; I0029ccccf 18 bit systemF= MOV (R0),R0 ; Bits 4 & 5 of R0 contain high address bits/ ASR R0 ; Move bits 4 and 5 to bits 0 and 1; ASR R0 ; ...C ASR R0 ; ...  ASR R0 ; ...(2 BIC #177774,R0 ; Make sure high bits are clear0 MOVB R0,RG.AD2(R1) ; High order address bits .IFTF ; M$$EXTF  MOVB #RF.ENP!RF.OWN,RG.FLG(R1) ; Set END of chain and UNA owner bit   .IFT ; M$$EXTu   .IF DF R$$MPL ; If RSX-11M+1 BIT #FE.EXT,$FMASK ; Is this a 22-bit system?s BEQ 10$ ; If EQ no07 BIT #KS.EXT,K.STS(R2) ; Extended memory supported?R BNE 10$ ; If NE yes* TST @#$UMRHD+2 ; Unibus map available? BEQ 10$ ; No  .IFF ; If not RSX-11M+5 BIT #DV.EXT,U.CW1(R5) ; Extended memory supported?e BNE 10$ ; Yes( TST @#$UMRPT ; Unibus map available? BEQ 10$ ; No1 .ENDC ; R$$MPL,  MOV U.UCBX+6(R5),R0 ; Get UMR wait block(! BEQ 20$ ; Crash, something is wrong7" MOV (R0),U.UCBX+6(R5) ; Dequeue the assignment blockI=# MOV R0,RG.UMR(R1) ; Save UMR wait block PTR in ring entryd$1% MOV IP.EXT(R3),R2 ; R2 = I/O packet extensionU;& MOV I.PRM+2(R3),U.BUF+2(R5) ; Set low 16 bits of address 6' MOVB 1(R2),U.BUF+1(R5) ; Set high 6 bits of address5( MOV I.PRM+4(R3),U.CNT(R5) ; Byte count of transfer;)* MOV R1,R3 ; Save R1 in R3(+ CALL $STMP1 ; Set up the Unibus map+, MOV RG.UMR(R3),R0 ; R0 = UMR wait blockB+- ADD #10,R0 ; R0 = UMR assignment block(). CALL $MPUB1 ; Map Unibus to transferl/+0 MOV RG.UMR(R3),R0 ; R0 = UMR wait block +1 ADD #10,R0 ; R0 = UMR assignment block >2 MOV M.UMVL(R0),RG.ADD(R3) ; Set low 16 bits of virtual addr$3 CLR -(SP) ; Get a work register04 MOVB M.UMVH(R0),(SP) ; Get high virtual addr15 ASR (SP) ; Get ext.bits 4 & 5 into bit 0 & 16 ASR (SP) ; ...S7 ASR (SP) ; ... 8 ASR (SP) ; ... $9 BIC #^C<3>,(SP) ; Clear high bit;: MOVB (SP)+,RG.AD2(R3) ; Put extension bits in ring entryc ; MOV R3,R1 ; R1 = Ring entry<= .ENDC ; M$$EXT>9?10$: BITB #374,RG.AD2(R1) ; Must not have high bits onR@ BNE 20$ ; This is very bad(A RETURN ;BC20$: D .IF DF DEBUG ; If debuggingEF BPT ; Breakr!G BR 20$ ; Loop on break pointgHI .IFFrJ K CRASH ; Something is wrongLM .ENDC ; DEBUGPNO S,P .SBTTL GSUMR - Get Static UMR for driverQ;+BR; **-GSUMR-Get static UMR and compute Unibus relocation constantS;bDT; This routine maps the device communications area and the receive@U; buffers with a UMR. In addition, it computes the relocationEV; constant for virtual memory address to Unibus address conversion.W;D X; Inputs:fY; R4 = Controller State TablerZ;B [; OUTPUTS:.\; 1. Upper 4K of driver is mapped with a UMR8]; (starting at 1st 64 byte boundry following CBASE)3^; 2. Relocation constant computed (RELCT,RELCT+2)_;G`;-a%bGSUMR: CALL SALL ; Save registers c d .IF DF R$$MPL ; If RSX-11M+ef MOV C.KRB(R4),R2 ; R2 = KRBegh .ENDC ; R$$MPLij MOV C.UCB(R4),R5 ; R5 = UCB kl CLR R0 ; Clear R0 & R1u m CLR R1 ;s*n CLR RELCT ; Make relocation bias zeroo CLR RELCT+2 ; ...)p CMP #120000,#UNAST ; Loadable driver? q BNE 60$ ; If not EQ noe9r MOV @#KISAR5,R1 ; Yes, copy real start of driver areaws1t .IF DF M$$EIS ; If extended instrucation setRu-v ASHC #6.,R0 ; Calculate physical addressvwx .IFFy$z MOV R1,R0 ; Get start of driver4{ SWAB R0 ; Do non-EIS emulation of "ASHC #6.,R0"6| BIC #177400,R0 ; ... To calculate physical address} SWAB R1 ; ...~ BIC #377,R1 ; ... ROR R0 ; ...o ROR R1 ; ... ROR R0 ; .... ROR R1 ; ...N .ENDC ; M$$EIS/ .IF DF M$$EXT ; Extended memory supported?e: MOV #CBASE,-(SP) ; Get communication area base address+ SUB #120000,(SP) ; Subtract driver base05 BIC #77,(SP) ; We are dealing with 64 byte blocksM. ADD (SP)+,R1 ; Compute physical addr00:_tt tfDATAess of% ADC R0 ; ... communications area;CF; Set up selected UMR to map all of the driver's receive buffers andG; device communications areas and save relocation constant for Unibus ; address computation.;  .IF DF R$$MPL ; If RSX-11M+1 BIT #FE.EXT,$FMASK ; Is this a 22-bit system?, BEQ 50$ ; If EQ non7 BIT #KS.EXT,K.STS(R2) ; Extended memory supported?r BNE 50$ ; If NE yes* TST @#$UMRHD+2 ; Unibus map available? BEQ 50$ ; Noe) MOV R2,R4 ; Copy KRB address into R4c4 ADD K.OFF(R2),R4 ; Point to UMR assignment block SUB #M.LGTH,R4 ; ... .IFF5 BIT #DV.EXT,U.CW1(R5) ; Extended memory supported?f BNE 50$ ; Yes( TST @#$UMRPT ; Unibus map available? BEQ 50$ ; No= MOV C.SCB(R4),R4 ; Pointer to UMR assignment block in SCB  ADD #S.MPR,R4 ; ...E .ENDC ; R$$MPL/ TST M.UMRN(R4) ; Static UMR already set up?@ BNE 70$ ; If NE yes4 MOV R1,M.BFVL(R4) ; Set up LO 16-Bits of address4 MOVB R0,M.BFVH(R4) ; Set up HI 6-bits of address. MOV #4,M.UMRN(R4) ; Set up count for 1 UMR720$: MOV R4,R0 ; Copy UMR work area pointer into R0e" CALL $ASUMR ; Go assign UMR's BCS 20$ ; If CS, try againv, MOV R4,UABKS ; Save UMR assignment block;RI; Load selected UMR to map receive buffers 18-bit addresses transformed"; from 16-bit virtual addresses.;43 MOV R4,R3 ; Copy UMR work area pointer into R3E+ MOV U.SCB(R5),R4 ; Retrieve SCB addresst! CALL $MPUB1 ; Map the Unibus 3 MOV R3,R0 ; Copy UMR work area pointer into R0  BR 40$ ; and continue730$: MOV R4,R0 ; Copy UMR work area pointer into r0L+ MOV U.SCB(R5),R4 ; Retrieve SCB addressI=40$: MOV M.UMVL(R0),R1 ; Get LO 16-bits of virtual address9 MOVB M.UMVH(R0),R0 ; Get HI 2-bits of virtual addressd/ .IF DF M$$EIS ; If extended insruction sete3 ASH #-4,R0 ; Shift bits <4:5> right into <0:1>o .IFFU/ ASR R0 ; Shift bits <4:5> right into <0:1>  ASR R0 ; ... ASR R0 ; ...p ASR R0 ; ...n .ENDC ; M$$EIS; G; Compute and save the double word relocation constant to transform aN; a virtual address within the UMR mapped communications area into an 18-bit ; address.;d=50$: MOV CVIRA,-(SP) ; (SP) = Communications area vir.addrs$ BIC #77,(SP) ; Clear offset bits5 SUB (SP)+,R1 ; Subtract UMR mapped communications:& SBC R0 ; ... base virtual address60$:8 MOV R0,RELCT+2 ; Save relocation constant (HI order)! MOV R1,RELCT ; ... (LO order) - .IFF ; If extended memory not supported ? SUB #120000,R1 ; Compute relocation bias for 18 bit machinei SBC R0 ; ...n- MOV R0,RELCT+2 ; Save relocation bias forb) MOV R1,RELCT ; ... for PCB, UDB, etc.S60$:8 .IFTF ; In either case for extended memory support RETURN ; Return to callerb, .IFT ; If extended memory is supported<70$: MOV R4,-(SP) ; Save mapping assignment block pointer MOV U.SCB(R5),R4 ; R4 = SCB,1 CALL $MPUBM ; Reload Unibus mapping registerd3 MOV (SP)+,R4 ; Restore assignment block pointerm* BR 30$ ; Go, compute relocation value .ENDC ; M$$EXT 7 .SBTTL RLPRT - Release port related data structuresP;+1; **-RLPRT-Release port related data structurese;eJ; Return all port related data structures to DSR. The multicast addressF; list is released and the protocol list is scanned for address listA; entries which are owned by this port which are then released.M;- ; Inputs:b$; R5 = Address of Port State Table;s; Registers Preservedn;%RLPRT: CALL SALL ; Save registersl3 MOV R5,R2 ; Generate pointer to multicast listR ADD #P.MCST,R2 ; ... roots710$: MOV (R2),R0 ; R0 = Next mulicast address blockc BEQ 15$ ; That is it!' MOV #ML.LEN,R1 ; Size of this blocke MOV (R0),(R2) ; Dequeue it MOV R2,-(SP) ; Save R26  CALL $DEACB ; Deallocate the mu00B9cccclticast addr block  MOV (SP)+,R2 ; restore R2   BR 10$ ; Do nextn 15$:5  CLR P.MCST(R5) ; Reset multicast address listheadr MOV R5,P.MCST+2(R5) ; ...L! ADD #P.MCST,P.MCST+2(R5) ; ...R120$: MOV P.CTBL(R5),R4 ; Compute protocol list.) ADD #C.PROL,R4 ; ... listhead address0;30$: MOV (R4),R4 ; Get addr of next protocol list entrys BEQ 80$ ; If EQ, no more @ BITB #LF.EXC!LF.DEF,PL.FLG(R4); Exclusive or default protocol+ BEQ 40$ ; If EQ, not an exclusive portu7 CMP R5,PL.EXC(R4) ; Is protocol owned by this port?  BNE 40$ ; If NE, no1 DECB PL.USE(R4) ; Reduce protocol usage counta$40$: MOV R4,R2 ; Compute address' ADD #PL.ADD,R2 ; ... chain listheadM;50$: MOV (R2),R0 ; Get pointer to next addr chain entry. BEQ 30$ ; If EQ, no moreV=  CMP R5,AD.PRT(R0) ; Is this protocol in use by this port? ! BEQ 60$ ; If EQ, yes '" MOV R0,R2 ; Move on down the chaine # BR 50$c$7%60$: MOV (R0),(R2) ; Unlink address block from chainL'& BNE 70$ ; If NE, not last in chaint/' MOV R2,PL.ADD+2(R4) ; Close up tail pointer ,(70$: DECB PL.USE(R4) ; Reduce usage count4) MOV #AD.LEN,R1 ; Get size of address chain entry* MOV R2,-(SP) ; Save R25+ CALL $DEACB ; Deallocate the address chain entry, MOV (SP)+,R2 ; Restore R2- BR 50$ ; Try next entry.;/80$: CALL SCNPR ; Remove inactive protocol list entriesV0 RETURN ; Return 12 e>3 .SBTTL ****************************************************>4 .SBTTL * UNA Ring Handling Subroutines *>5 .SBTTL ****************************************************6+7 .SBTTL INIRG - Initialize Ring pointersz89;+:;a&;; **-INIRG- Initialize Ring Pointers<; C=; This routine is called to initialize the rings used by the UNA.sA>; The ring pointers used by the other ring routines are set up.e?;i @; INPUTS:cA; R4 = Controller State TableRB; C; REGISTERS PRESERVED*D;- EINIRG::*&F MOV R0,-(SP) ; Save work registersG MOV R1,-(SP) ; ...H;gI; Initialize receive ring.J; 8K MOV C.RCVB(R4),C.RCVF(R4) ; Restart next free pointer=L MOV C.RCVB(R4),C.RCVC(R4) ; Restart current active pointer+M MOV #U$$NRS,R0 ; R0 = Receive ring size.N MOV C.RCVB(R4),R1 ; R1 = Receive ring baseO10$:#P CALL CLRING ; Clear ring entryd0Q MOV R1,RG.LNK(R1) ; Copy descriptor address.7R ADD #RG.SIZ,RG.LNK(R1) ; Plus length of a descriptorE1S MOV RG.LNK(R1),R1 ; Update descriptor pointerPT DEC R0 ; One less to doU BNE 10$ ; Loop till donenVOW MOV C.RCVB(R4),RG.LNK-RG.SIZ(R1); Set link word to point to first descriptorrX;MY; Initialize transmit ringZ;c8[ MOV C.XMTB(R4),C.XMTF(R4) ; Restart next free pointer=\ MOV C.XMTB(R4),C.XMTC(R4) ; Restart current active pointer0/] MOV #,R0 ; R0 = Receive ring sizeR.^ MOV C.XMTB(R4),R1 ; R1 = Receive ring base_20$:#` CALL CLRING ; Clear ring entryp0a MOV R1,RG.LNK(R1) ; Copy descriptor address.7b ADD #RG.SIZ,RG.LNK(R1) ; Plus length of a descriptor 1c MOV RG.LNK(R1),R1 ; Update descriptor pointer;d DEC R0 ; One less to doe BNE 20$ ; Loop till doneafDg MOV C.XMTB(R4),RG.LNK-RG.SIZ(R1); Set link word to point to firsth ; ... descriptor49i CLR C.RSEQ(R4) ; Clear receive sequence # accumulator$:j CLR C.XSEQ(R4) ; Clear transmit sequence # accumulatork$l MOV (SP)+,R1 ; Restore registersm MOV (SP)+,R0 ; ...n RETURN ; Exit to calleroo!pCLRING: MOV R2,-(SP) ; Save R2R4q MOV #RG.SIZ/2,R2 ; R2 = Word count of ring entry%r10$: CLR (R1)+ ; Clear ring entrys DEC R2 ; Count downt BNE 10$ ; Loop till donen(u SUB #RG.SIZ,R1 ; Restore R1 at entryv MOV (SP)+,R2 ; Restore R2rw RETURN ; Returnpxyz C3{ .SBTTL GFRRE - Get next free receive ring entry|};+~; -; **-GFRRE-Get next free receive ring entry;(C; This routine is called to get the next free receive ring entry.EJ; If no free entry is available a BEQ condition 00J_tt tfDATAis returned. The routineI; uses the ring pointers set up by INIRNG and updates these pointers as ; required.n;n ; INPUTS: ; R4 = Controller State TableZ;; ; OUTPUTS:(; R1 -> Free Ring Entry (or 0 if none);R;;; REGISTERS MODIFIED:; R1;-1GFRRE: MOV C.RCVF(R4),R1 ; Get next ring entry / TSTB RG.ACT(R1) ; Is this an active packet? BEQ 20$ ; Noi2 CLR R1 ; Indicate no receive packet available$10$: TST R1 ; Set condition code RETURN ; Return to callerr20$:2 MOV RG.LNK(R1),C.RCVF(R4) ; Update free pointer% CLRB RG.FLG(R1) ; Clear flag byte& CLRB RG.ERR(R1) ; Clear error word. INCB C.RSEQ(R4) ; Generate sequence number< MOVB C.RSEQ(R4),RG.SEQ(R1) ; Put sequence # in ring entry, INCB RG.ACT(R1) ; Indicate packet active BR 10$ ; Return to caller 4 .SBTTL GFXRE - Get next free transmit ring entry;+;e.; **-GFXRE-Get next free transmit ring entry;oD; This routine is called to get the next free transmit ring entry.J; If no free entry is available a BEQ condition is returned. The routineI; uses the ring pointers set up by INIRNG and updates these pointers asq ; required.; ; INPUTS:.; R4 = Controller State Tablee; ; OUTPUTS:(; R1 -> Free Ring Entry (or 0 if none);e; REGISTERS MODIFIED:; R1;-GFXRE:+ MOV C.XMTF(R4),R1 ; Get next ring entry' TSTB RG.ACT(R1) ; Is packet active?i BEQ 20$ ; No 7 CLR R1 ; Indicate no transmit ring entry available $10$: TST R1 ; Set condition code RETURN ; Return to callerT20$:2 MOV RG.LNK(R1),C.XMTF(R4) ; Update free pointer% CLRB RG.FLG(R1) ; Clear flag byted& CLRB RG.ERR(R1) ; Clear error word. INCB C.XSEQ(R4) ; Generate sequence number7 MOVB C.XSEQ(R4),RG.SEQ(R1) ; Return sequence # in R2I. INCB RG.ACT(R1) ; Indicate entry is active BR 10$ ; Return to caller )1 .SBTTL GCRRE - Get current receive ring entryR;+;n+; **-GCRRE-Get current receive ring entryR; I; This routine is called to get a completed ring entry from the receive(<; ring. If none is available a BEQ condition is returned.;lF; If a ring entry is found the error bit is tested and the C-bit set; if an error is found.; ; INPUTS:.*; R4 = Address of Controller State Table;T ; OUTPUTS:; R1 -> Ring Entry or 00; Z-Bit set if no entry9; C-Bit set if valid ring entry and error in ring entryR;; R1 modified*;-GCRRE:;c); Check to see if an entry is available ;d+ MOV C.RCVC(R4),R1 ; Get next ring entryv' TSTB RG.ACT(R1) ; Is packet active? ) BEQ 10$ ; No - show no current entry 2 BITB #RF.OWN,RG.FLG(R1) ; Do we own this entry? BEQ 20$ ; Yes,10$: CLR R1 ; No - show no current entry BR 50$ ; ...S;e=; Got an entry - check sequence numbers and update pointers ; =20$: INCB C.RSEQ+1(R4) ; Update Sequence Number, check forr ; overflowd! BNE 30$ ; Skip overflow codeh1 TSTB RG.SEQ(R1) ; Ring entry overflowed also?C# BNE 100$ ; No - sequence error  BR 40$ ;R=30$: CMPB C.RSEQ+1(R4),RG.SEQ(R1) ; Sequence numbers match?n BNE 100$ ; No - crash40$:5 MOV RG.LNK(R1),C.RCVC(R4) ; Update current pointer ;s&; Set up conditions codes for caller;450$: ; Converge here for condition code set up& TST R1 ; Do we have a ring entry? BEQ 70$ ; No - just exitr2 BITB #RF.STP,RG.FLG(R1) ; Is this a start entry BEQ 55$ ; NoT@ MOV RG.VAD(R1),C.STRT(R4) ; Save start buffer addr for CHKERR55$:> BITB #RF.ERR,RG.FLG(R1) ; Yes - then do we have any errors? SEC ; Default to error$ BNE 60$ ; Yes - default correct CLC ; Set no errorsd$60$: CLZ ; Set buffer available670$: RETURN ; Return with Z and C cond. codes set ;e1 ; Ring has gone out of sequence - serious errore ;n 100$:  .IF DF DEBUG ; If debugging BPT* BR 1000R9cccc0$ ; Don't loose the break point .IFFN CRASH ; Serious error; .ENDC ; DEBUGo 9 .SBTTL GCXRE - Get current active transmit ring entrya;+;S3; **-GCXRE-Get current active transmit ring entryt;eJ; This routine is called to get a completed ring entry from the transmit< ; ring. If none is available a BEQ condition is returned.!;gF"; If a ring entry is found the error bit is tested and the C-bit set#; if an error is found.$; %; INPUTS:;*&; R4 = Address of Controller State Table'; (; OUTPUTS:); R1 -> Ring Entry or 0 *; Z-Bit set if no entryB9+; C-Bit set if valid ring entry and error in ring entry,;-; R1 modifiedG.;-/GCXRE:0;n)1; Check to see if an entry is available 2;d+3 MOV C.XMTC(R4),R1 ; Get next ring entrym&4 TSTB RG.ACT(R1) ; Is packet active)5 BEQ 10$ ; No - show no current entryn26 BITB #RF.OWN,RG.FLG(R1) ; Do we own this entry?7 BEQ 20$ ; Yes,810$: CLR R1 ; No - show no current entry9 BR 50$ ; ...r:;;b=<; Got an entry - check sequence numbers and update pointerse=;n9>20$: BITB #RF.STP,RG.FLG(R1) ; Is this the start entry?n? BEQ 25$ ; No 8@ MOV RG.LNK(R1),R1 ; Get data entry for this transmit;A BITB #RF.OWN,RG.FLG(R1) ; Do we own the data entry also?r1B BNE 10$ ; No, wait until we own both entries5C MOV C.XMTC(R4),R1 ; Yes, return with header entry.D25$:9E INCB C.XSEQ+1(R4) ; Update Sequence Number, check forCF ; overflow !G BNE 30$ ; Skip overflow coder1H TSTB RG.SEQ(R1) ; Ring entry overflowed also?r#I BNE 100$ ; No - sequence errorB J BR 40$ ;F=K30$: CMPB C.XSEQ+1(R4),RG.SEQ(R1) ; Sequence numbers match?RL BNE 100$ ; No - crashM40$:5N MOV RG.LNK(R1),C.XMTC(R4) ; Update current pointereOP;r&Q; Set up conditions codes for callerR;n4S50$: ; Converge here for condition code set up&T TST R1 ; Do we have a ring entry?U BEQ 70$ ; No - just exitr>V BITB #RF.ERR,RG.FLG(R1) ; Yes - then do we have any errors?W SEC ; Default to error$X BNE 60$ ; Yes - default correctY CLC ; Set no errors$Z60$: CLZ ; Set buffer available6[70$: RETURN ; Return with Z and C cond. codes set\];a1^; Ring has gone out of sequence - serious erroru_; `100$: a .IF DF DEBUG ; If debuggingbc BPT ; Serious error )d BR 100$ ; Don't lose the break pointef .IFF g%h CRASH ; Something is very wrong ij .ENDC ; DEBUG.klm&n .SBTTL RLRPK - Release ring packeto;+ p; **-RLRPK-Release ring packetq;Y<r; This routine releases a ring packet by clearing clearings; it's active flag byte.t;R u; INPUT:v; R1 -> Ring packet.w;s1xRLPKT: CLRB RG.ACT(R1) ; Make packet available y RETURN ;z{| 5} .SBTTL STRBF - Set up receive buffers on the ringi~;+;B.; **-STRBF-SET UP RECEIVE BUFFER ON THE RING;K; These routine, if it can, will allocate receive buffers for all receive3; ring entries and puts them on the receive ring. ;R ; INPUTS:n'; R4 - Address Controller state table ;g ; OUTPUTS:; None;; REGISTERS CHANGEDt; ; R3, R1;-GTRBF:. CLR -(SP) ; Indicate, no new ring entries810$: MOV C.RBFL(R4),R3 ; Get next free receive buffer BEQ 20$ ; No more2 CALL GFRRE ; Get next free receive ring entry3 BEQ 20$ ; No free entries - just return buffer,7 MOV (R3),C.RBFL(R4) ; Dequeue buffer from free list- ; Clear ring entry save area in bufferg; MOV R3,RG.VAD(R1) ; Save virtual addr of receive bufferl CLR (R3)+ ; M.LNK CLR (R3)+ ; M.ERR CLR (R3)+ ; M.MLEN ;H; NOTE - We cannot move the relocation value into the ring as this mayN; set the ownership bit and we are not ready for the UNA to take this entry.;R8 MOV RELCT+2,-(SP) ; Put relocation constant on stack MOV RELCT,-(SP) ; ...b, ADD R3,(SP) ; Convert packet address to$ ADC 2(SP) ; ... U00Z_tt tfDATAnibus address.8 MOV (SP)+,RG.ADD(R1) ; Put unibus address of segment. MOVB (SP)+,RG.AD2(R1) ; ... into ring entry7 BIT #374,RG.AD2(R1) ; High order bits must be clear . BNE 40$ ; Something is very wrong, CRASH!B MOV #M.SIZE-M.DADD.,RG.LEN(R1); Set buffer length in ring entry- MOVB #RF.OWN,RG.FLG(R1) ; Set owner to UNA0 INC (SP) ; Say, we added buffer to the ring BR 10$ ; Try another one ;*; Receive ring loaded or no more buffers;C'20$: TST (SP)+ ; Did we do anythingV  RETURN ; Return ; LK705 ;**-540$:  .IF DF DEBUG ; If debugging BPT ; just break .IFFd CRASH ; Otherwise, CRASH .ENDC ; DEBUGg 2 .SBTTL UMRMPA - UMR mapped communications area;+,; **-UMRMPA-UMR mapped communications area;rG; This (UP TO 4K) area is mapped with a UMR. This area contains data <; structures used to communicate with the UMR controllers.>; i.e. - PCB, UDBB, etc. The remainder of the space is used; for receive buffers.;-CBASE:5 .REPT U$$NCT ; Generate UMR mapped communicationB ; ... buffers!.=.+C.BASZ ; GEN mapped areaw .ENDR3RCVBFA: .BLKW 1 ; Start of receive buffers areaA;NBPERC: .BLKW 1 ; TEMP SAVE # OF BUFFERS PER CONTROLLERa4RCVBFL: .BLKW 1 ; Temp receive buffers list root w1 .SBTTL UNAIN - UNA driver initialization codes;+3; **-UNAIN-RSX QIO UNA driver initialization code ; F; This routine sets up and initializes the driver's data structures.K; Once the driver is initialized, this code becomes a part of the receive.O; buffers. This routine is called by the load routine at load time ($XELOA).t;f ; Inputs:e7; IMPUR, CBASE work areas, CVIRA (CBASE VIRTUAL ADDR)R;R ; Outputs:/; The driver data structures are initialized.;; All registers are used;--UNAIN:ASL R3 ; Make word controller indexR" MOV R3,-(SP) ; Save R3, R4, R5 MOV R4,-(SP) ; ... MOV R5,-(SP) ; ...;e&; Create UMR wait buffer list in UCB;e5 MOV #U$$NTS,R0 ; R0 = # of UMR wait blocks neededv7 ADD #U.UCBX+10,R5 ; R5 = Addr of 1st UMR wait blocki' MOV R5,-2(R5) ; Init list root wordu10$:, MOV R5,(R5) ; Create link to next block ADD #UMRWBS,(R5) ; ...* MOV (R5),R5 ; R3 points to next block$ DEC R0 ; Dec wait block counter BNE 10$ ; Loop till donek3 CLR -UMRWBS(R5) ; Clear link word of last entry ;54; Compute number of receive buffers per controller; - MOV CVIRA,R1 ; R1 = CBASE virtual addressV/ BIC #160000,R1 ; R1 = Area size below CBASE7 MOV #8192.-256.,R0 ; R0 = MAX receive area possible. SUB R1,R0 ; R0 = Communications area size8 SUB #RCVBFA-CBASE,R0 ; Adjust for communications area/  MOV R0,R2 ; Save receive buffers area size  A  CMP R0,# ; Do we have at least 1 buff/control.?i  BGE 20$ ; Yes$  CALLR 130$ ; No receive buffers20$: CLR R1 ; Clear counter '30$: INC R1 ; Generate buffer countM9 SUB #,R0 ; Compute # of buff/controllerR# BGT 30$ ; Loop to get quotientM;1; ALLOCATE THE BUFFERS; - MOV CVIRA,R0 ; R0 = CBASE VIRTUAL ADDRESSt: ADD #RCVBFA-CBASE,R0 ; R0 = VIRTUAL ADDRESS OF "RCVBFA"3 MOV R1,2(R0) ; Save # of buffers per controllers3 MOV R0,4(R0) ; Init receive buff list root wordl3 MOV R0,R1 ; R1 = Start of receive buffers area 5 ADD R2,R0 ; R0 points beyond last receive buffer -40$: MOV R1,(R1) ; Generate chain pointer# ADD #M.SIZE,(R1) ; ...'  MOV (R1),R1 ; POINT TO NEXT BUFFERo! CMP R1,R0 ; ARE WE DONE" BLO 40$ ; LOOP TILL DONEM4# CLR -M.SIZE(R1) ; CLEAR LINK WORD OF LAST BUFFER$;C!%; Clear controller state tablesR&;"A' MOV #/2,R0 ; R0 = Word count of controller tablesR3( MOV #IMPUR,R1 ; R1 = Start of controller tablesM)50$:-* CLR (R1)+ ; Clear controller tables areaD+ DEC R0 ; Decrement counterr,00b9cccc BNE 50$ ; Loop till doneR-;)$.; Clear mapped communications area/;EB0 MOV #/2,R0 ; R0 = Word count of controller tables21 MOV CVIRA,R1 ; R1 = Start of controller tables260$:-3 CLR (R1)+ ; Clear controller tables areaC4 DEC R0 ; Decrement countere5 BNE 60$ ; Loop till done/687 MOV #IMPUR,R1 ; R1 = Address of 1st controller table)8 MOV #CTABL,R4 ; R4 = Controller table:/9 MOV #U$$NCT,R5 ; R5 = Number of controllers:;C/;; Start controller state table initializationi<;n1= MOV CVIRA,R3 ; R3 = Virtual addrress of CBASEE7>70$: MOV #U$$NPC,R0 ; R0 = # of ports per controllerl?5@ MOV R1,R2 ; R2 = Address of 1st controller tablel8A ADD #C.LEN,R2 ; R2 = Address of word after 1st tableB1C MOV R4,C.INDX(R1) ; Generate controller index D SUB #CTABL,C.INDX(R1) ; ...E6F MOV R2,C.PORT(R1) ; Initialize port list root word0G MOV R1,(R4)+ ; Save controller table pointerH ; ... in CTABL:I MOV #CS.OFL,C.FLAG(R1) ; Indicate controller is offlineJ K .IF DF R$$MPL ; If RSX-11M+L:M BIS #CS.STP,C.FLAG(R1) ; Indicate controller is stoppedNO .ENDC ; R$$MPLP Q .IF DF DEBUG ; If debugging;R MOV #MD.TPD!MD.LOO,C.MODE(R1); Default mode is loop backbS .ENDC ; DEBUGNT%U .IF NDF DEBUG ; If not debuggingB8V MOV #MD.TPD!MD.ECT,C.MODE(R1) ; See UNA mode bit def.W .ENDC ; DEBUG X7Y MOV R1,C.PROL+2(R1) ; Set end protocol list pointer !Z ADD #C.PROL,C.PROL+2(R1) ; ...F[;13\; Create list of port state tables for controllerM];;@^80$: MOV R1,P.CTBL(R2) ; Save Control.State Table ptr in port?_ MOV R2,P.MCST+2(R2) ; Initialize multicast list end pointerd!` ADD #P.MCST,P.MCST+2(R2) ; ...O&a MOV R2,(R2) ; Generate port chain)b ADD #P.LENG,(R2) ; Point to next portI)c MOV (R2),R2 ; R2 = Next port pointerOd DEC R0 ; One less to doe BNE 80$ ; Loop till doneM2f CLR -P.LENG(R2) ; Clear link word of next portg;A6h; Allocate UMR mapped data structures for controlleri; 9j MOV R3,C.PCBP(R1) ; Set PCBB addr in controller table)-k ADD #CB.SIZ,R3 ; Point to word after PCBBVl<m MOV R3,C.UDBP(R1) ; Set UDBB address in controller table,n ADD #RD.SIZ,R3 ; R3 => Receive ring areao;n#p; Initialize receive ring pointer q;i.r MOV R3,C.RCVB(R1) ; Save receive ring base6s MOV R3,C.RCVF(R1) ; Receve ring free entry pointer:t MOV R3,C.RCVC(R1) ; Receive ring current entry pointeru8v ADD #U$$NRS*RG.SIZ,R3 ; Account for receive ring sizew;o$x; Initialize transmit ring pointery;B/z MOV R3,C.XMTB(R1) ; Save transmit ring baseP8{ MOV R3,C.XMTF(R1) ; Transmit ring free entry pointer;| MOV R3,C.XMTC(R1) ; Transmit ring current entry pointerR}=~ ADD #*2,R3 ; Account for transmit ring size+ ; (2 XMIT RING ENTRIES PER TRANSMIT)e;M#; Initialize transmit header liste;p4 MOV #U$$NTS,R0 ; R0 = # of transmit ring entries7 MOV R3,C.XHDR(R1) ; init xmit header list root wordr90$:. MOV R3,(R3) ; Create transmit header list ADD #2+6+6+2+2,(R3) ; ...) MOV (R3),R3 ; ... DEC R0 ; Dec counter  BNE 90$ ; Loop till donet0 CLR -22(R3) ; Clear link word of last entry3 MOV R3,C.WRKP(R1) ; Save pointer to work buffert5 ADD #C.WKSZ,R3 ; Add in controller work area size ;R+; Allocate receive buffers for controllerr;e4 MOV NBPERC,R0 ; R0 = # of buffers per controller5 MOV #RCVBFL,R2 ; R2 = Receive buffer list pointero2 MOV (R2),C.RBFL(R1) ; Point to list of buffers100$:i1 MOV (R2),R2 ; Allocate buffers to controller  DEC R0 ; ...  BNE 100$ ; ...E4 MOV (R2),RCVBFL ; Dequeue buffers just allocated4 CLR -M.SIZE(R2) ; Clear link word in last buffer? ADD #C.LEN+,R1; Point to next controller area ( DEC R5 ; Decrement controller count! BNE 70$ ; Do next controllerR$ CLC ; Indicate successful init)110$: MOV (SP)+,R5 ; Restore registerss MOV (SP)+,R4 ; ... MOV (00jl_tt tfDATASP)+,R3 ; ...' BCS 120$ ; We failed to initialize ;l'; Save pointers to KRB, SCB, DCB, UCB ; 1 MOV CTABL(R3),R0 ; Get controller state tableu9 MOV R4,C.SCB(R0) ; Save SCB in controller state tablew  .IF DF R$$MPL ; If RSX-11M+? MOV S.KRB(R4),C.KRB(R0) ; Save KRB in controller state table  .IFFt2 MOV S.CSR(R4),C.CSR(R0) ; Save controller's CSR .ENDC ; R$$MPL9 MOV R5,C.UCB(R0) ; Save UCB in controller state tableP? MOV U.DCB(R5),C.DCB(R0) ; Save DCB in controller state tableo$120$: RETURN ; Return to caller%130$: SEC ; Indicate init failedR BR 110$ ; Return !DREND: ; End of driver code;)DRVSIZ=DREND-IMPUR ; Driver area size>RBFASZ=<16384.-64.>-DRVSIZ-196. ; Receive buffers area size( .BLKB RBFASZ ; Receive buffers area RCBEND: .ENDS(R4),C.CSR(R0) ; Save controller's CSR .ENDC ; R$$MPL9 MOV R5,C.UCB(R0) ; Save UCB in controller state tableP? MOV U.DCB(R5),C.D .TITLE TTMIS  .IDENT /04.01/t;a;; COPYRIGHT (c) 1983,1985 BY DIGITAL EQUIPMENT CORPORATION.d; ALL RIGHTS RESERVED.;$<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;i;b; 23-JAN-78 PETER WANNHEDENS; ; PREVIOUSLY MODIFIED BY:E;r ; C. F. SPITZl; D. R. DONCHINM;S; MODIFICATIONS:;S; S. C. ADAMS 18-MAY-85 04.01 ; SA381 -- MOVE TO MAP5.6; ;S;+0; COMMON MULTIPLEXER INTERRUPT SERVICE ROUTINES.,; USED BY FOLLOWING CONTROLLERS: DH, DJ, DZ.;-; ;  3 .IF DF T$$MUX U .MCALL UCBDF$,SCBDF$   .IF DF R$$MPL $ .MCALL KRBDF$ S KRBDF$ ;DEFINE KRB SYMBOLSM B .ENDC ;R$$MPL  UCBDF$ ;DEFINE UCB SYMBOLSM SCBDF$ ;DEFINE SCB SYMBOLS3 .PSECT MAP5.6 .IF DF D$$H11!D$$J11!D$$Z11;E;r;+4; MUXINP - INPUT INTERRUPT SERVICE FOR MULTIPLEXERS.;; INPUT:; R3 CSR ADDRESS; R4 KRB ADDRESS (RSX-11M+)6"; R4 ADDRESS OF UCB LIST (RSX-11M);R; ALTERNATE ENTRY - MUXIN1.D; ; INPUT:; R3 CSR ADDRESS; R4 KRB ADDRESS (RSX-11M+)D"; R4 ADDRESS OF UCB LIST (RSX-11M)!; R5 CHARACTER + STATUS FROM SILOR'; CC-N 1 IF R5 CONTAINS VALID CHARACTER;; OUTPUT FROM BOTH:U0; SILO EMPTIED. IF TRANSMIT READY IS SET IN CSR,6; A RETURN TO CALLER IS MADE WITH R3 AND R4 UNCHANGED.+; ELSE A RETURN TO CALLER'S CALLER IS MADE.T;R; REGISTERS ALTERED: R2,R5;-;:; !MUXIN1::MOV R5,-(SP) ;;;SAVE CHARS( SWAB R5 ;;;GET LINE NUMBER IN LOW BYTE CALL MUXUCB ;;;GET UCB IN R5' MOV (SP)+,R2 ;;;RETRIEVE CHAR + STATUS4+ BCS MUXINP ;;;BAD LINE - IGNORE CHARACTER  T .IF DF R$$MPL A& MOV R4,-(SP) ;;;OK - SAVE KRB ADDRESS0 CALL ICHAR1 ;;;DO COMMON INPUT INTERRUPT PROC.$ MOV (SP)+,R4 ;;;RESTORE KRB ADDRESS# MOV @R4,R3 ;;;RESTORE CSR ADDRESSR  .IFFT MOV R3,-(SP) ;;;SAVE CSR& MOV R4,-(SP) ;;;SAVE ADDR OF UCB LIST0 CALL ICHAR1 ;;;DO COMMON INPUT INTERRUPT PROC.) MOV (SP)+,R4 ;;;RESTORE ADDR OF UCB LISTG MOV (SP)+,R3 ;;;RESTORE CSR  .ENDC ;R$$MPL I4MUXINP::MOV 2(R3),R5 ;;;GET NEXT CHARACTER FROM SILO BMI MUXIN1 ;;;OK - JUMP ;R;; SILO IS NOW EMPTY. SEE IF CONTROLLER IS READY TO TRANSMITB;D TST @R3 ;;;XMIT RDY SET? BMI 10$ ;;;Y - RETURN.* TST (SP)+ ;;;N - POP 1.ST RETURN ADDRESS10$: RETURN ;;;RETURND .ENDC ;D$$H11!D$$J11!D$$Z11;;;A;+$; MUXUCB - GET UCB FROM LINE NUMBER.;T; INPUT:; R4 KRB ADDRESS (RSX-11M+)R"; R4 ADDRESS OF UCB LIST (RSX-11M); R5 LINE NUMBER IN BITS 0-3; ; OUTPUT:C; R2 LINE NUMBER * 2&; R5 POINTER TO U.TSTA (IF VALID LINE); CC-C 0 IF VALID LINE; 1 IF INVALID LINE;R; REGISTERS ALTERED: R2,R5;-;O;R-MUXUCB::BIC #^C17,R5 ;;;CLEAR IRRELEVANT BITSD E .IF DF R$$MPL - MOV R5,R2 ;;;COPY LINE NUMBER1$ ASL R2 ;;;MAKE INDEX FOR UCB TABLE" CMPB K.HPU(R4),R5 ;;;LINE IN USE?# BLO 10$ ;;;N - EXIT WITH CC-C SETF MOV R4,R5 ;;;GET KRB ADDRESS+ ADD K.OFF(R4),R5 ;;;ADD OFFSET TO UCB LIST - ADD R2,R5 ;;;ADD LINE NUMBER * 2 - YIELDING3 ;;;POINTER TO UCB POINTERB MOV @R5,R00rs9cccc5 ;;;GET UCB POINTERF1 ADD #U.TSTA,R5 ;;;POINT TO U.TSTA AND CLEAR CC-CI10$: RETURN ;;;RETURNL E .IFF ;R$$MPLO R ASL R5 ;;;GET UNIT NUMBER * 2R MOV R5,R2 ;;;SAVE IT ADD R4,R5 ;;;GET UCB POINTER MOV (R5),R5 ;;;POINT TO UCBA BEQ 10$ ;;;LINE NOT IN USE1 ADD #U.TSTA,R5 ;;;POINT TO U.TSTA AND CLEAR CC-C  RETURN ;;;RETURNR 510$: SEC ;;;SET CC-C RETURN ;;;RETURND F .ENDC ;R$$MPL A .ENDC ;T$$MUX N;U;R .ENDYIELDING3 ;;;POINTER TO UCB POINTERB MOV @R5,R .TITLE TTUS .IDENT /01.00/;6; COPYRIGHT (c) 1986 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;;; 7-NOV-85 STEPHANIE ADAMS;; MODIFICATIONS:;;+/; STUB PORT DRIVER FOR USER-WRITTEN PORT DRIVER;E; THIS MODULE PROVIDES THE INTERFACE BETWEEN TTDRV AND A USER-WRITTEN; PORT DRIVER:;B; 1. IN THE CONTROLLER ON-LINE CODE, INITIALIZE CELLS IN THE USER 7; PORT TO CONTAIN ADDRESSES OF TTDRV'S ENTRY POINTS.;M; 2. IN THE INPUT AND OUTPUT SERVICE ROUTINES, PERFORM GENERAL TTDRV SERVICES; ?; 3. CALL THE APPROPRIATE ROUTINE IN THE PORT DRIVER VIA $MPPRO; ;- .IF DF T$$USP  .MCALL KRBDF$  .MCALL HWDDF$,UCBDF$,PRTDF$# HWDDF$ ;DEFINE HARDWARE SYMBOLS UCBDF$ ;DEFINE UCB SYMBOLS$ PRTDF$ ;DEFINE USER PORT OFFSETS KRBDF$ ;DEFINE KRB SYMBOLS3.IIF NDF R$$MPL, .ERROR ;SUPPORTED ONLY ON M-PLUSB.IIF NDF R$$CON, .ERROR ;SOME OF THE OFFSETS THAT FOLLOW REQUIRE/ ;THIS TO BE A SYSTEM WITH RECONFIGURATION.; ; LOCAL DATA; .PSECT MAP5 .PAGE .SBTTL RESUME OUTPUT;+; USRESX - RESUME OUTPUT.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USRESX::* MOV #P.RRES+120000,R0 ;SET UP USER OFFSET. CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL ABORT OUTPUT;+; USABOX - ABORT OUTPUT.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.TOC 0 ; U.TTOC 0;-USABOX::+ MOV #P.RABO+120000,R0 ;SET UP USER ADDRESS. CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL STOP OUTPUT;+!; USSTOX - STOP (SUSPEND) OUTPUT.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 1;-USSTOX::+ MOV #P.RSTO+120000,R0 ;SET UP USER ADDRESS. CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL POWER UP;+; USPWUP - POWER-UP.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USCPUP::+ MOV #P.RCPU+120000,R0 ;SET UP USER ADDRESS. CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .PAGE .SBTTL CONTROLLER ON-LINE;+; USCONL - CONTROLER ON-LINE;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; R0 AND R1 ARE DESTROYED;-USCONL::1 MOV KISAR6,-(SP) ;SAVE THE CURRENT APR6 MAPPING# MOV K.OWN(R2),R5 ;GET UCB ADDRESS# MOV U.DCB(R5),R1 ;GET DCB ADDRESS# MOV D.PCB(R1),R1 ;GET PCB ADDRESS; MOV P.REL(R1),KISAR6 ;MAP TO USER TO PLUG IN OUR ADDRESSES% MOV #140000,R0 ;SET UP USER ADDRESS3 ADD @#140000+P.ROFF,R0 ;ADD OFFSET TO TTDRV TABLE2 TST P.TTII(R0) ;HAS IT ALREADY BEEN INITIALIZED? BNE 10$ ;BR IF INIT. ALREADY;!; FILL IN TT: DRIVER ENTRY POINTS;( MOV #ICHAR1,P.TTII(R0) ;INPUT INTERRUPT( MOV #ODONE,P.TTOI(R0) ;OUTPUT INTERRUPT2 MOV #FP000,P.TTFP(R0) ;FORK PROCESSING SUBROUTINE/10$: MOV (SP)+,KISAR6 ;AND RESTORE OUR MAPPING3 MOV #P.RCON+120000,R0 ;GET USER OFFSET FOR ON-LINE CALLR MAPUSR ;AND CALL USER .PAGE .SBTTL UNIT ON-LINE;+; USUONL - UNIT ON-LINE;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USUONL::+ MOV #P.RUON+120000,R0 ;SET UP USER ADDRESS- CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL UNIT POWER-UP;+; USUPUP - UNIT POWER-UP.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; R0 AND R1 ARE DESTROYED;-USUPUP::+ MOV #P.RUPU+120000,R0 ;SET UP U00z_tt tfDATASER ADDRESS- CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL MODEM TIMER;+; USMTIM - MODEM TIMER.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USMTIM::+ MOV #P.RMTI+120000,R0 ;SET UP USER ADDRESS- CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .PAGE .SBTTL CONTROLLER OFF-LINE;+; USCOFF - CONTROLLER OFF-LINE;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; R0 AND R1 ARE DESTROYED;-USCOFF::1 MOV KISAR6,-(SP) ;SAVE THE CURRENT APR6 MAPPING# MOV K.OWN(R2),R5 ;GET UCB ADDRESS# MOV U.DCB(R5),R1 ;GET DCB ADDRESS# MOV D.PCB(R1),R1 ;GET PCB ADDRESS; MOV P.REL(R1),KISAR6 ;MAP TO USER TO PLUG IN OUR ADDRESSES% MOV #140000,R0 ;SET UP USER ADDRESS3 ADD @#140000+P.ROFF,R0 ;ADD OFFSET TO TTDRV TABLE( CLR (R0) ;INDICATE CONTROLLER HAS NOT ;BEEN INITIALIZED' MOV (SP)+,KISAR6 ;RESTORE OUT MAPPING+ MOV #P.RCOF+120000,R0 ;SET UP USER ADDRESS. CALLR MAPUSR ;AND CALL ROUTINE TO CALL USER .PAGE .SBTTL UNIT OFF-LINE;+; USUOFF - UNIT OFF-LINE;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USUOFF::+ MOV #P.RUOF+120000,R0 ;SET UP USER ADDRESS- CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .PAGE( .SBTTL INPUT INTERRUPT SERVICE ROUTINE;+"; INPUT INTERRUPT SERVICE ROUTINE.;-$USINP::'; TTSET$ US ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS%; MOV K.OWN(R4),R5 ;;;GET UCB ADDRESS CALL MAPD + CALLR ICHAR1 ;;;DO COMMON INPUT CHARACTER ;;;PROCESSING AND RETURN .PAGE) .SBTTL OUTPUT INTERRUPT SERVICE ROUTINE;+"; OUTPUT INTERRUPT SERVICE ROUTINE;- $USOUT::'; TTSET$ US ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS$ MOV K.OWN(R4),R5 ;;;GET UCB ADDRESS .PAGE .SBTTL START OUTPUT;+; USSTAX - START OUTPUT.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USSTAX::* MOV #P.RSTA+120000,R0 ;;;GET USER ADDRESS, CALLR MAPUS1 ;;;AND GO TO THE USER ROUTINE8; CALLR OUTISR ;;;DO COMMON OUTPUT INTERRUPT PROCESSING .SBTTL CHANGE LINE PARAMETERS;+!; USLPAR - CHANGE LINE PARAMETERS;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USLPAR::* MOV #P.RLPA+120000,R0 ;;;GET USER ADDRESS-; CALLR MAPUS1 ;;;AND GO TO THE USER ROUTINE .PAGE .SBTTL LOCAL SUBROUTINES;; LOCAL SUBROUTINES; .PAGE;+/; MAPUSR - MAP TO AND CALL THE USER SUBROUTINE.;F; INPUT: R0 - OFFSET IN THE USER'S CODE OF THE ROUTINE TO BE CALLED; R5 - UCB ADDRESS;; R1 IS DESTROYED?; DATA APR5 IS DESTROYED FOR THE USER ROUTINE BY $MPPRO BUT%; RESTORED LATER FOR TTDRV'S USE.;-MAPUS1:, SUB #U.TSTA,R5 ;ADJUST BACK TO START OF UCBMAPUSR:" MOV U.DCB(R5),R1 ;GET DCB ADDRESS" MOV D.PCB(R1),R1 ;GET PCB ADDRESS9 MOV P.REL(R1),-(SP) ;GET APR BIAS FOR USER'S APPLICATION. MOV R0,-(SP) ;SET UP VIRTUAL ADDRESS FOR USER6 CALL $MPPRO ;USE EXEC ROUTINE TO MAP IT AND CALL IT RETURN ;BACK TO CALLER .ENDC ;T$$USP  .END UCB ADDRESS;; R1 IS DESTROYED?; DATA APR5 IS DESTROYED FOR THE USER ROUTINE BY $MPPRO BUT%; RESTORED LATER FOR TTDRV'S USE.;-MAPUS1:, SUB #U.TSTA,R5 ;ADJUST BACK TO START OF UCBMAPUSR:" MOV U.DCB(R5),R1 ;GET DCB ADDRESS" MOV D.PCB(R1),R1 ;GET PCB ADDRESS9 MOV P.REL(R1),-(SP) ;GET APR BIAS FOR USER'S APPLICATION. MOV R0,-(SP) ;SET UP VIRTUAL ADDRESS FOR USER6 CALL $MPPRO ; .TITLE SYSIDe .IDENT /01.00/  e; ; COPYRIGHT (c) 1984, 1985 BY(; DIGITAL EQUIPMENT CORPORATION, MAYNARD'; MASSACHUSETTS. ALL RIGHTS RESERVED.F;SA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED.A; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE A; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS1A; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR A; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO ANDA1; OWNERS00ccccHIP OF THE SOFTWARE IS HEREBY TRANSFERED. ; A; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTAA; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;SA; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFM<; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;R,; CREATED BY SYSBLD ON 03-SEP-87 AT 18:44:44;O; MODIFIED BY:;NA; THIS MODULE CONTAINS THE SYSTEM BASE LEVEL AND VERSION NUMBERS..F; IT MUST RESIDE IN THE FIRST 4K OF I AND D SPACE ON KERNEL D SYSTEMS. .ENABL LC .NLIST BEX  S$SYTYP:: .IF DF P$$3XX .ASCII \ProMicro/RSX\ .IFFO. .IF DF R$$MIC ;SYSTEM NAME USED BY UTILITIES .ASCII \Micro/RSX \ .IFFS .IF DF R$$CPR .ASCII \VAX-CPR/RSX \ .IFFS .ASCII /RSX-11M-PLUS/ .ENDC ; DF R$$CPR N .ENDC ; DF R$$MIC .ENDC ; DF P$$3XX ?$SYSID::.ASCII /40 / ;SYSTEM IDENTIFICATION - MUST BE 4 CHARSN -$VERSN::.ASCII /4.0 / ;SYSTEM VERSION NUMBERVF$SYSNM::.WORD S$$NM1,S$$NM2,S$$NM3 ;SYSTEM NAME (NODE NAME FOR DECNET) .END SYSTEMS. .ENABL LC .NLIST BEX  S$SYTYP:: .IF DF P$$3XX .ASCII \ProMicro/RSX\ .IFFO. .IF DF R$$MIC ;SYSTEM NAME USED BY UTILITIES .ASCII \Micro/RSX \ .IFFS .IF DF R$$CPR .ASCII \VAX-CPR/RSX \ .IFFS .ASCII /RSX-11M-PLUS/ .ENDC ; DF R$$CPR N .ENDC ; DF R$$MIC .ENDC ; DF P$$3XX ?$SYSID::.ASCII /40 / ;SYSTEM IDENTIFICATION - MUST BE 4 CHARSN -$VERSN::.ASCII /4.0 / ;SYSTEM VERSION NUMBERVF$SYSNM::.WORD S$$NM1,S$$NM2,S$$NM3 ;SYSTEMEN ARGUMENTS ONTO STACK IN REVERSE ORDER, CONVERTING!; DEFAULTED ARGUMENTS INTO ZEROES ;-60$: MOV -(R2),-(SP) ;PUSH ONE& CMP #-1,(SP) ;WAS ARGUMENT DEFAULTED? BEQ 80$ ;IF EQ YES ROR R1 ;NO--ROTATE BIT MAP BR 100$ ;M-80$: ROR R1 ;DEFAULTED ARG--WAS IT REQUIRED?M BCS 160$ ;IF CS YES--ERROR CLR (SP) ;NO--CHANGE TO ZERO100$: DEC R0 ;LOOP; BNE 60$ ;O#120$: CLC ;BETTER SAFE THAN SORRY  BR 180$ ;GO EXIT;2; HERE IF AN ERROR WAS DETECTEDO;S160$: MOV R4,SP ;RESTORE SP" SEC ;FLAG AN ERROR HAS OCCURRED# BR 200$ ;GO RETURN WITH R5 INTACTR6180$: MOV R4,R5 ;COPY OLD SP FOR LATER ERROR RECOVERY200$: JMP (R3) ;ROUTINE EXITE .END BEQ 80$ ;IF EQ YES ROR R1 ;NO--ROTATE BIT MAP BR 100$ ;M-80$: ROR R1 ;DEFAULTED ARG--WAS IT REQUIRED?M BCS 160$ ;IF CS YES--ERROR CLR (SP) ;NO--CHANGE TO ZERO100$: DEC R0 ;LOOP; BNE 60$ ;O#120$: CLC ;BETTER SAFE THAN SORRY  BR 180$ ;GO EXIT;2; HERE IF AN ERROR WAS DETECTEDO;S160$: MOV R4,SP ;RESTORE SP" SEC/ .TITLE KMUL INTEGER MULTIPLY MAGNITUDE NUMBERS .IDENT /03/;; COPYRIGHT (C) 1977, 1978.; DIGITAL EQUIPMENT CORP., MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE@; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION@; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT1; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC.;@; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT@; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL; EQUIPMENT CORPORATION.;D@; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY?; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.C;E ; VERSION 03; ; D. N. CUTLER 10-FEB-72;+-; **-.KMUL-INTEGER MULTIPLY MAGNITUDE NUMBERSS;P ; INPUTS:C;O; R0=MULTIPLIER.; R1=MULTIPLICAND.;M ; OUTPUTS:; ); DOUBLE WORD RESULT IS RETURNED WITH THEF); HIGH PART IN R0 AND THE LOW PART IN R1.N;W9; REGISTERS R2, R3, R4, AND R5 ARE PRESERVED ACROSS CALL.N;- .ENABL LSBI&.KMUL:: MOV R0,-(SP) ;SAVE R0 FOR ADDS MOV #21,-(SP) ;SET REPEAT COUNT CLR R0 ;CLEAR HIGH PARTO 10$: ROR R0 ;DOUBLE RIGHT SHIFT ROR R1 ; BCC 20$ ;IF CC DO NOT ADD ADD 2(SP),R0 ;- CLC ;CLEAR CARRY INDICATORI&20$: DEC (SP) ;DECREMENT REPEAT COUNT BGT 10$ ;IF GT MORE TO GOE CMP (SP)+,(SP)+ ;CLEAN STACKU RETURN ;  .ENDRD RESULT IS RETURNED WITH THEF); HIGH PART IN R0 AND THE LOW PART IN R1.N;W9; REGISTERS R2, R3, R4, AND R5 ARE PRESERVED00_tt tfDATA .TITLE KRWBF READ/WRITE BUFFER .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; ; VERSION 01; B. SCHREIBER 14-JUL-77;E4; THIS MODULE READS AND WRITES THE USERS DATA BUFFER;E; SYSTEM MACRO CALLS;S .MCALL KSWDF$ KSWDF$H .PSECT .KSCT1 A< .SBTTL .KRDWD READ WORD FROM USER BUFFER AT INTERRUPT LEVEL;+;; .KRDWD -- READ WORD FROM USER BUFFER (AT INTERRUPT LEVEL)O;E ; INPUTS:A; ; R4 SWEEP CONTROL BLOCK POINTER;O ; OUTPUTS:;; C-CLEAR READ WORD OK; R3 HOLDS DATUM;R,; C-SET READ WORD OK--END OF BUFFER OR SWEEP;C; REGISTERS ALTERED:;I; NONE; ;-B.KRDWD::MOV S.WBPX(R4),R3 ;;;GET POINTER TO CURRENT BUFFER POINTER .IF DF M$$MGE) MOV (R3)+,@#KISAR6 ;;;MAP TO USER BUFFERS .IFTF ;M$$MGE4 MOV @(R3),-(SP) ;;;READ WORD FROM BUFFER ONTO STACK) ADD #2,(R3) ;;;INCREMENT BUFFER POINTER .IFT ;M$$MGEE) BIT #20000,(R3) ;;;OVERFLOW 4K BOUNDARY?A BEQ 40$ ;;;IF EQ NOL' BIC #20000,(R3) ;;;YES--CLEAR OVERFLOWL. ADD #200,-(R3) ;;;ADVANCE TO NEXT 4K BOUNDARY .IFTF ;M$$MGE 40$: CLC ;;;PRESET FOR SUCCESS0 DEC S.WCNT(R4) ;;;DECREMENT SAMPLE COUNT (C-OK)$ BGT 60$ ;;;IF GT NOT END OF BUFFER$ CALL .BFSWT ;;;YES--SWITCH BUFFERS$ SEC ;;;SET C-BIT FOR FORK REQUEST!60$: MOV (SP)+,R3 ;;;RESTORE WORD) RETURNW" ;;;M$$MGE CONDITIONAL CONTINUES = .SBTTL .KWRWD WRITE WORD INTO USER BUFFER AT INTERRUPT LEVELR" ;;;M$$MGE CONDITIONAL CONTINUED;+'; .KWRWD -- WRITE WORD INTO USER BUFFERO;F6; THIS ROUTINE WRITES A DATA WORD INTO THE USER BUFFER;F ; INPUTS:;0; R3 DATA WORD ; R4 SWEEP CONTROL BLOCK POINTER;C ; OUTPUTS:;O ; C-CLEAR OK;6;; C-SET OK BUT FORK REQUEST FOR END OF BUFFER, DONE, OR DAOB;E; REGISTERS ALTERED:;O; NONE;E;-&.KWRWD::MOV R3,-(SP) ;;;SAVE DATA WORD; MOV S.WBPX(R4),R3 ;;;GET POINTER TO CURRENT BUFFER POINTERW .IFT ;M$$MGEE) MOV (R3)+,@#KISAR6 ;;;MAP TO USER BUFFERC .IFTF ;M$$MGE/ MOV (SP)+,@(R3) ;;;WRITE WORD INTO USER BUFFER-20$: ADD #2,(R3) ;;;INCREMENT BUFFER POINTERU .IFT ;M$$MGE ) BIT #20000,(R3) ;;;OVERFLOW 4K BOUNDARY?R BEQ 40$ ;;;IF EQ NO ' BIC #20000,(R3) ;;;YES--CLEAR OVERFLOWK. ADD #200,-(R3) ;;;ADVANCE TO NEXT 4K BOUNDARY .IFTF ;M$$MGE"40$: CLC ;;;PRESET C FOR SUCCESS) DEC S.WCNT(R4) ;;;DECREMENT SAMPLE COUNTW) ;;; (**DEC DOES NOT AFFECT C-BIT**) " BGT 60$ ;;;IF GT BUFFER NOT DONE& CALL .BFSWT ;;;END OF BUFFER--SWITCH$ SEC ;;;SET C-BIT FOR FORK REQUEST60$: RETURN ;;;R" ;;;M$$MGE CONDITIONAL CONTINUES B0 .SBTTL .BFSWT SWITCH BUFFERS AT INTERRUPT LEVEL" ;;;M$$MGE CONDITIONAL CONTINUED;+!; .BFSWT -- SWITCH TO NEXT BUFFERC;R ; INPUTS:;D"; R4 POINTS TO SWEEP CONTROL BLOCK ; R3 SCRATCH;; ; OUTPUTS:;C; BUFFERS SWITCHED;C;-K.BFSWT::MOVB S.WBNO(R4),S.WLBF(R4) ;;;REMEMBER LAST BUFFER IN CASE OF ERRORC .IFT ;M$$MGE$< MOV S.WUSW+2(R4),@#KISAR6 ;;;MAP TO USER STATUS WORD (IBUF) .IFTF ;M$$MGE' MOV S.WUSW+4(R4),R3 ;;;GET USW ADDRESS- ADD #IB.USQ,R3 ;;;POINT TO USER BUFFER QUEUET .REPT 8.C, TSTB (R3)+ ;;;LOOK FOR EMPTY SLOT IN QUEUE BMI 10$ ;;;IF MI WE FOUND IT .ENDM- BR 100$ ;;;IF QUEUE IS FULL CALL IT OVERRUNT+ ;;;EVEN THO IT IS REALLY UNDERRUN(!!??) A10$: MOVB 00ccccS.WBNO(R4),-(R3) ;;;ENTER BUFFER NUMBER INTO USER QUEUE,8 BIT #S$WSEB!S$WSTP,S.WFL2(R4) ;;;STOP AT END OF BUFFER?* ;;;OR JUST PLAIN STOP SWEEP? BNE 60$ ;;;IF NE YES' TST S.WNBF(R4) ;;;CONTINUOUS SAMPLING?+ BMI 20$ ;;;IF MI YES' DEC S.WNBF(R4) ;;;NO--DEC BUFFER COUNTF$ BEQ 80$ ;;;IF EQ SWEEP IS COMPLETE/20$: MOV S.WUSW+4(R4),R3 ;;;POINT TO IBUF AGAINI3 ADD #IB.DVQ,R3 ;;;POINT AT THE DEVICE BUFFER QUEUES: MOVB (R3),S.WBNO(R4) ;;;GET THE NEXT BUFFER NUMBER TO USE# BMI 100$ ;;;IF MI WE HAVE OVERRUN; .REPT 3/ MOVB 1(R3),(R3)+ ;;;MOVE THE QUEUE DOWN A BYTEF MOVB 1(R3),(R3)+ ;;;...% BMI 50$ ;;;TRY THE EASY OUT 3 TIMESS .ENDM140$: MOVB 1(R3),(R3)+ ;;;MOVE THE LAST ENTRY DOWNU) MOVB #-1,(R3) ;;;CLOSE QUEUE WITH A (-1)S850$: MOVB S.WBNO(R4),R3 ;;;GET NEW CURRENT BUFFER NUMBER ASL R3 ;;;MULTIPLY V ASL R3 ;;; BY 4 ADD R4,R3 ;;;INDEX INTO SWBD5 ADD #S.WIBP,R3 ;;; AND INTO INITIAL BUFFER POINTERSS% MOV (R3)+,S.WBPT(R4);;;MOVE POINTERS & MOV (R3)+,S.WBPT+2(R4) ;;;INTO S.WBPT0 MOV S.WSIZ(R4),S.WCNT(R4) ;;;RESET BUFFER COUNT RETURN ;;;DONE;V2; HERE WHEN S$WSEB IS TRUE (STOP AT END OF BUFFER);IE60$: MOV #-,S.WSTS(R4) ;;;SET STATUS OF ABORT FOR S$WSEBM$ BR 120$ ;;;FLAG TO STOP AND RETURN;; ALL BUFFERS SAMPLED ;G)80$: MOV #IS.SUC,S.WSTS(R4) ;;;SET STATUSU BR 120$ ;;;FINISH UP;4; DATA OVERRUN OR DONE SAMPLING;D?100$: MOV #-,S.WSTS(R4) ;;;SET DATA OVERRUN STATUSW,120$: BIS #S$WSTP,S.WFL2(R4) ;;;FLAG TO STOP= MOVB S.WLBF(R4),S.WEBF(R4) ;;;SET BUFFER IN ERROR NUMBER FORC) ;;;IGTBUF/IWTBUF (MAY NOT BE IN$' ;;;ERROR, BUT ACTUALLY END OF* ;;;SWEEP, BUT ITS ALL THE SAME!)4 BIC #S$WACT,S.WFL2(R4) ;;;SWEEP IS NO LONGER ACTIVE140$: RETURN ;;; .ENDC ;M$$MGE .END: MOV #IS.SUC,S.WSTS(R4) ;;;SET STATUSU BR 120$ ;;;FINISH UP;4; DATA OVERRUN OR DONE SAMPLING;D?100$: MOV #-,S.WSTS(R4) ;;;SET DATA OVERRUN STATUSW,120$: BIS #S$WSTP,S.WFL2(R4) ;;;FLAG TO STOP= M( .TITLE RCLOKB READ CLOCK B FROM FORTRAN .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 24-OCT-77;EC; THIS MODULE READS CLOCK B AND RETURNS THE VALUE IN FLOATING POINT  S .SBTTL RCLOKB;+<; RCLOKB -- READ CLOCK B AND RETURN RESULT IN FLOATING POINT;N; CALL:C; ; TIME = RCLOKB (RLAST [,PTIME]);T ; INPUTS: ;C6; RLAST IS THE VALUE TO BE SUBTRACTED FROM THE CURRENT2; 16-BIT SOFTWARE CLOCK TIME BEFORE RETURNING THE ; RESULT.;E ; OUTPUTS:;L; TIME,PTIME RETURN THE RESULT;;-'RCLOKB::CALL ICLOKB ;READ 16-BIT CLOCKE1 CALL .FLT16 ;CONVERT TO FLOATING POINT IN R0,R1- TST (R5)+ ;SKIP THE COUNT WORD# MOV (R5)+,R4 ;GET ADDRESS OF RLASTO CMP #-1,R4 ;WAS IT DEFAULTED? ! BEQ 40$ ;IF EQ YES--WE ARE DONEE$ MOV (R4),-(SP) ;NO--PUSH ONTO STACK% BIS 2(R4),(SP)+ ;AND SEE IF IT WAS 0T BEQ 40$ ;IF EQ YES# MOV (R4)+,R2 ;NO--GET THE ARGUMENTM MOV (R4)+,R3 ;.... CALL .KSUB ;SUBTRACT RLAST FROM CURRENT TIME ; (RETURN IN R0:R1)-40$: CMP -4(R5),#2 ;WERE THERE TWO ARGUMENTS?C BLT 100$ ;IF LT NO* CMP (R5),#-1 ;YES--WAS 2ND ARG DEFAULTED? BEQ 100$ ;IF EQ YES-) MOV (R5),R4 ;NO--GET ADDRESS OF 2ND ARG5" MOV R0,(R4)+ ;STORE TIME ARGUMENT M00_tt tfDATAOV R1,(R4)+ ;... 100$: RETURN .ENDQ YES--WE ARE DONEE$ MOV (R4),-(SP) ;NO--PUSH ONTO STACK% BIS 2(R4),(SP)+ ;AND SEE IF IT WAS 0T BEQ 40$ ;IF EQ YES# MOV (R4)+,R2 ;NO--GET THE ARGUMENTM MOV (R4)+,R3 ;.... CALL .KSUB ;SUBTRACT RLAST FROM CURRENT TIME ; (RETURN IN R0:R1)-40$: CMP -4(R5),#2 ;WERE THERE TWO ARGUMENTS?C BLT 100$ ;IF LT NO* CMP (R5),#-1 ;YES--WAS 2ND ARG DEFAULTED? BEQ 100$ ;IF EQ YES-) MOV (R5),R4 ;NO--GET ADDRESS OF 2ND ARG5" MOV R0,(R4)+ ;STORE TIME ARGUMENT M,?-?- S'SYSYSYSYTICLSY~Ϛγ<<'~Z.-|dddd":6:d|?-4)%γϚsγP(J*)e?E? & f Yw:  w2   *  + 23E Ew ,(   Е-   0@A *(W e`fÊ    E  w ' ť ť 0B 'Aaw '' UD$BA '&( U BQ Е*  & & @( F'f  e ee e &f w   w &&f Z&1e? ww & fYw  nw`j  50-Ar?reE |f&vn  m  bABDEFIMNOPQRSTUXYZ<>=MXd^)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw n%&& D¥%  B&ХVA ` C ed!  aeNb A  Е%̥V P Е Bf  & enB& eZ;& e6Hŀ ȕ  nЕ Ћ  Е Е & e & eЕ A %& eA Е Е A A   $Е.  AЕ; ~    A &EA  HE 6Dw #D&& bЕ- eaePPPЕ-$w T#D  &Е. ce Z# Е:   Bw  &, 7$$#e#1   55@ ( ͥ#@>E5uu  < B5@[W& AɥNfv & fA5e&5 4Q4 ea  5  #5 55U00cccc J u l n5 w 5u@`Bf@ΥY!T55W Υ5  @A > ;`e Υ 1 % Υ Υ##e D APPH 8    5@f >:55&HJ1B(ҔȊ 1E c0 1 p   ` %lEwz0F5%$&Bl, @%  : E͵L `Ӵӕ, J :؆*l,ʘ `Bp585Υ T b` % 51 1 5BBl>ʥ]ʥ: N Nҕ. L&Bl.0Ҕ lȊ `Ewe  w @ ( C a   e%/e.Ґqӥ0    e&f, B * ͋'% ͥ!ͥE%,  K5  PB2 %pˋ5J J J @ EͥAA In flf ws$e$,fL " . {"{^{`w wdbD z D/5% %%  S0Ԋ8cP @"s JD%b p w  w 5 tBh?lYjU@055   w @pK5˥t)) ‹5Up55AɥAeu@A55U4 H   &fwD 51 e !`Be`@&  Ae G`5 >  =8.E*450 [ 5e BCœG 5œ8  wP53 3 3 VBA%&  F %  "@ DAD`wU5 .wFBe[  VSY P @ʥ_*& a& Βf&  ߥ&ߥ&wc   :w, 5e 0ε% @   ҕ: B .5 ewN  w"1 B C` x˥.ӥ- ꇂf&Nf& HCB`ק&ק&S?ҕ[e ҕ, ҕ] B¥]¥> B=C` ޒΕ. ˥- N Q NN0KQ ˥. D wѕ0 Τ   ͋ 5D ѕ. B@ⳐB15   ; ( F BU1 1 1 5\ w>58Be8bbbeJbb#3 AA ܃ BP5U ueLEewjh @B`0 %!wh Tw~wק&ק&@w .5BA8 ևB  u BEC`  D ccє  D ɔɥaɥz Bއ&e # ˔Ee0  fEB`F ~ . ӥ:  ӥ:@! $  @! U`eUU5U mɥ[ɥ<"@  ˥.   z0Q UDeĤ _ Uċ5E  lU0 E pU5 . 5E0 U L. x; n Ċ- bU " & N ӥ"   U5CM% E A5Q`C _C&  p2 && ˥A˥Z˥a˥z ˥*˥% ˥$˥_  ˥0 ˥9 ˥7 U   ˋ˥ ˥ #  .0 µ1!0  5 55   e5& Y5 T SP K  E > V 5&@@   ) % e  C   r 00_tt tfDATA &V p 0 p 0    5wr     @  ppp 0 0 0  1 1 1 veN*PU5D e0  S  ,rw ` 4@  %P $ N05E65Q M ̥ I5 5A@p 8 ȥ 45  % D`P`_ ,/O&PXVUTSEEuB 5 =/5 *@ %E E E  M͊    ` ͊ udEE5 p U 5@\ .% - / ,3e"5550% @L @ R , %P Eewjup1 b5 E v#  j *  P P &1u A  ) fL .H@ D,  4  .   &f .D̥  w f 2 & 2r  4  8 <0w d& l   &ap aB#E   *   uD5e`w eE< .f p2  , ,p l J a b! ZP PH  8P PH f ` %5w N #5 ȥ ȋ5ȋ1 1 ".#Հ && rpp  f `0   0  &f 0 &V &  K&1 f & >%8 5`0+&! u  0   P 0 & %  5U e G 16 z,* M` R4 ʥ,  , 0<U: .% 0e  8`ee 08 6& $ʥ-  % 1ʥ* ;%8 ʥ72& 0cV +  42% x`0. ,5%5  ʥ*5   0  # # # % 8w R 1ʥ* ʥ%%Z$@e.!%'  & e a  A ҥ*B 40 Jʥ*ʥ7  ˕ ʥ" ʥaʥz‹  &^6 BBd; Ee0 `IҐ `e   8. 1  `̥ @ $ ! 1  ŀ f&&  pp   & &   & r w  JPUUp. ]<  ΊUE A .   6  J6 6 ev 66m t  `0 4"4 $e$t "4 &&e  0 Dw&D& %%%p& TI>)**5 ( f FJ) @&;,J)( 7 Nf& Fe &>)f& 0e  ʜ ( ( V 3%l  ʜ )" ʜ ( ( w>)J) J) ufSY: Enter a wildcard filespec: $SEARCH error -- STS=%P, STV=%P%N %VA%NNo files matching %VA%N%NTotal of %D files matching %VA%N00cccc * * w eE D` bl lrw \  B eE"s    s-  Csl&f &  m  f A N  %&   `@ ` B   & A @    F X%  <,,8*++ +,88-++-++++++,,.. S'SYSYSYSYTICLSY~Ϛγ<<'~Z.|t#t#t#t#..t#.:%γϚ@@γP)+*PpN+e?E? & f YwB  w:  w2   *  + 23E Ew 8)   Е-   0@A 6)W e`fÊ    E  w ( ť ť 0B (Aaw (' UD$BA (&( U BQ Е*  & & @( R(f  e ee e &f w   w,'&f f'1e? ww & fYw  nw`j  5.A?eE t&  m  bABDEFIMNOPQRSTUXYZ<>=MXd^)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw z&&& D¥%  B&ХVA ` C ed!  aeNb A  Е%̥V P Е Bf  & enB& eZ;& e6Hŀ ȕ  nЕ Ћ  Е Е & e & eЕ A %00_tt tfDATA& eA Е Е A A   $Е.  AЕ; ~    A &EA  HE 6Dw $D&& bЕ- eaePPPЕ-$w `$D  &Е. ce f$ Е:   Bw  &, 7(%P %$e%1   55@ ( ͥ#@>E5uu  < B5@[W& AɥNfv & fA5e&5 4Q4 ea  5  #5 55U J u l n5 w 5u@`Bf@ΥY!T55W Υ5  @A > ;`e Υ 1 % Υ Υ##e D APPH 8    5@f >:55&HJ1B(ҔȊ 1E c0 1 p   ` %lEwz0F5%$&Bl, @%  : E͵L `Ӵӕ, J :؆*l,ʘ `Bp585Υ T b` % 51 1 5BBl>ʥ]ʥ: N Nҕ. L&Bl.0Ҕ lȊ `Ewe  w @ ( C a   e%/e.Ґqӥ0    e&f8. B * ͋'% ͥ!ͥE%,  K5  PB2 %pˋ5J J J @ EͥAA In flf ws$e$,fL " . {"{^{`w wdbD z D/5% %%  S0Ԋ8cP @"s JD%b p w  w 5 tBh?lYjU@055   w @pK5˥t)) ‹5Up55AɥAeu@A55U4 H   &fwD 51 e !`Be`@&  Ae G`5 >  =8.E*450 [ 5e BCœG 5œ8  wP53 3 3 VBA%&  F %  "@ DAD`wU5 .wFBe[  VSY P @ʥ_*& a& Βf&  ߥ&ߥ&wc   :w, 5e 0ε% @   ҕ: B .5 ewN  w"1 B C` x˥.ӥ- ꇂf&Nf& HCB`ק&ק&S?ҕ[e ҕ, ҕ] B¥]¥> B=C` ޒΕ. ˥- N Q NN0KQ ˥. D wѕ0 Τ   ͋ 5D ѕ. B@ⳐB15   ; ( F BU1 1 1 5\ w>58Be8bbbeJbb#3 AA ܃ BP5U ueLEewjh @B`0 %!wh Tw~wק&ק&@w .5BA8 ևB  u BEC`  D ccє  D ɔɥaɥz Bއ&e # ˔Ee0  fEB`F ~ . ӥ:  ӥ:@! $  @! U`eUU5U mɥ[ɥ<"@  ˥.   z0Q UDeĤ _ Uċ5E  lU00ącccc0 E pU5 . 5E0 U L. x; n Ċ- bU " & N ӥ"   U5CM% E A5Q`C _C&  p2 && ˥A˥Z˥a˥z ˥*˥% ˥$˥_  ˥0 ˥9 ˥7 U   ˋ˥ ˥ #  .0 µ1!0  5 55   e5& Y5 T SP K  E > V 5&@@   ) % e  C   r  &V p 0 p 0    5wr     @  ppp 0 0 0  1 1 1 veN*PU5D e0  S  ,rw ` 4@  %P $ N05E65Q M ̥ I5 5A@p 8 ȥ 45  % D`P`_ ,/O&PXVUTSEEuB 5 =/5 *@ %E E E  M͊    ` ͊ udEE5 p U 5@\ .% - / ,3e"5550% @L @ R , %P Eewjup1 b5 E v#  j *  P P &1u A  ) fL .H@ D,  4  .   &f .D̥  w f 2 & 2r  4  8 <0w d& l   &ap aB#E   *   uD5e`w eE< .f p2  , ,p l J a b! ZP PH  8P PH f ` %5w N #5 ȥ ȋ5ȋ1 1 ".#Հ && rpp  f `0   0  &f 0 &V &  K&1 f & >%8 5`0+&! u  0   P 0 & %  5U e G 16 z,* M` R4 ʥ,  , 0<U: .% 0e  8`ee 08 6& $ʥ-  % 1ʥ* ;%8 ʥ72& 0cV +  42% x`0. ,5%5  ʥ*5   0  # # # % 8w R 1ʥ* ʥ%%Z$@e.!%'  & e a  A ҥ*B 40 Jʥ*ʥ7  ˕ ʥ" ʥaʥz‹  &^6 BBd; Ee0 `IҐ `e   8. 1  `̥ @ $ ! 1  ŀ f&&  pp   & &   & r w  JPUUp. ]<  ΊUE A .   6  J6 6 ev 66m t  `0 4"4 $e$t "4 &&e  0 Dw&D& %%%p& 00̅Ѕ_tt tfDATATIN*R,j,5 )  fBZ* @&7-Z**f& Le n )  f* @& ,*( 7 3 pUf& e ;1* 1-ff& e  N*   Ȝ ) R N* ) 8w%lN* 2*   wl*N*Z* Z*wj,SY: From: To: $RENAME error -- STS=%P, STV=%P File %VA renamed to %VA%NTotal of %D files matching %VA renamed%N%NNo files matching %VA%N N, N, w eE D` bl lrw \  B eE"s    s-  Csl&f &  m  f A N  %&   `@ ` B   & A @     % < -T.* , N,,,,4..,,.,,,,,,8.,?-?- S'SYSYSYSYTICLSY~Ϛγ<<'~Z8-|4444.,B,4(?-4 γϚ@γP(T*)e?E? & f Yw: w2   *  + 23E Ew 6(   Е-   0@A 4(W e`fÊ    E  w ' ť ť 00ԅcccc0B 'Aaw '' UD$BA '&( U BQ Е*  & & @( P'f  e ee e &f w   w*&&f d&1e? ww & fYw  nw`j  58-Ar?reE |f&vn  m  bABDEFIMNOPQRSTUXYZ<>=MXd^)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw x%&& D¥%  B&ХVA ` C ed!  aeNb A  Е%̥V P Е Bf  & enB& eZ;& e6Hŀ ȕ  nЕ Ћ  Е Е & e & eЕ A %& eA Е Е A A   $Е.  AЕ; ~    A &EA  HE 6Dw #D&& bЕ- eaePPPЕ-$w ^#D  &Е. ce d# Е:   Bw  &, 7&$$#e$1   55@ ( ͥ#@>E5uu  < B5@[W& AɥNfv & fA5e&5 4Q4 ea  5  #5 55U J u l n5 w 5u@`Bf@ΥY!T55W Υ5  @A > ;`e Υ 1 % Υ Υ##e D APPH 8    5@f >:55&HJ1B(ҔȊ 1E c0 1 p   ` %lEwz0F5%$&Bl, @%  : E͵L `Ӵӕ, J :؆*l,ʘ `Bp585Υ T b` % 51 1 5BBl>ʥ]ʥ: N Nҕ. L&Bl.0Ҕ lȊ `Ewe  w @ ( C a   e%/e.Ґqӥ0    e&f, B * ͋'% ͥ!ͥE%,  K5  PB2 %pˋ5J J J @ EͥAA In flf ws$e$,fL " . {"{^{`w wdbD z D/5% %%  S0Ԋ8cP @"s JD%b p w  w 5 tBh?lYjU@055   w @pK5˥t)) ‹5Up55AɥAeu@A55U4 H   &fwD 51 e !`Be`@&  Ae G`5 >  =8.E*450 [ 5e BCœG 5œ8  wP53 3 3 VBA%&  F %  "@ DAD`wU5 .wFBe[  VSY P @ʥ_*& a& Βf&  ߥ&ߥ&wc   :w, 5e 0ε% @   ҕ: B .5 ewN  w"1 B C` x˥.ӥ- ꇂf&Nf& HCB`ק&ק&S?ҕ[e ҕ, ҕ] B¥]¥> B=C` ޒΕ. ˥- N Q NN0K00܅Ѕ_tt tfDATAQ ˥. D wѕ0 Τ   ͋ 5D ѕ. B@ⳐB15   ; ( F BU1 1 1 5\ w>58Be8bbbeJbb#3 AA ܃ BP5U ueLEewjh @B`0 %!wh Tw~wק&ק&@w .5BA8 ևB  u BEC`  D ccє  D ɔɥaɥz Bއ&e # ˔Ee0  fEB`F ~ . ӥ:  ӥ:@! $  @! U`eUU5U mɥ[ɥ<"@  ˥.   z0Q UDeĤ _ Uċ5E  lU0 E pU5 . 5E0 U L. x; n Ċ- bU " & N ӥ"   U5CM% E A5Q`C _C&  p2 && ˥A˥Z˥a˥z ˥*˥% ˥$˥_  ˥0 ˥9 ˥7 U   ˋ˥ ˥ #  .0 µ1!0  5 55   e5& Y5 T SP K  E > V 5&@@   ) % e  C   r  &V p 0 p 0    5wr     @  ppp 0 0 0  1 1 1 veN*PU5D e0  S  ,rw ` 4@  %P $ N05E65Q M ̥ I5 5A@p 8 ȥ 45  % D`P`_ ,/O&PXVUTSEEuB 5 =/5 *@ %E E E  M͊    ` ͊ udEE5 p U 5@\ .% - / ,3e"5550% @L @ R , %P Eewjup1 b5 E v#  j *  P P &1u A  ) fL .H@ D,  4  .   &f .D̥  w f 2 & 2r  4  8 <0w d& l   &ap aB#E   *   uD5e`w eE< .f p2  , ,p l J a b! ZP PH  8P PH f ` %5w N #5 ȥ ȋ5ȋ1 1 ".#Հ && rpp  f `0   0  &f 0 &V &  K&1 f & >%8 5`0+&! u  0   P 0 & %  5U e G 16 z,* M` R4 ʥ,  , 0<U: .% 0e  8`ee 08 6& $ʥ-  % 1ʥ* ;%8 ʥ72& 0cV +  42% x`0. ,5%5  ʥ*5   0  # # # % 8w R 1ʥ* ʥ%%Z$@e.!%'  & e00cccc a  A ҥ*B 40 Jʥ*ʥ7  ˕ ʥ" ʥaʥz‹  &^6 BBd; Ee0 `IҐ `e   8. 1  `̥ @ $ ! 1  ŀ f&&  pp   & &   & r w  JPUUp. ]<  ΊUE A .   6  J6 6 ev 66m t  `0 4"4 $e$t "4 &&e  0 Dw&D& %%%p& TIH)**5 ( fFT) @&;,T)( 7 Xf& Ne &H)f& (e  ʜ ( ( V 3%l  ʜ )" ʜ ) ( wH)T) T) ufSY: File(s) to erase: $ERASE error -- STS=%P, STV=%P%N File %VA deleted%NNo files matching %VA%N%NTotal of %D files matching %VA deleted%N * * w eE D` bl lrw \  B eE"s    s-  Csl&f &  m  f A N  %&   `@ ` B   & A @    F X%  F,,8+ +++,88"-++"-++++++,,&& S SYSYSYSYTICLSY~Ϛγ<< ~Z&|,,,,V,j,, & γϚ@00Ѕ_tt tfDATAγP#e?E? & f Yw  *  + 23E Ew !   Е-   0@A !W e`fÊ    E  w ! ť ť 0B !Aaw ' UD$BA 6!&( U BQ Е*  & & @( f  e ee e &f w   w|&f 1e? ww & fYw  nw`j  5&Aj?jeE ^&~f  m  bABDEFIMNOPQRSTUXYZ<>=MXd^)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA ` C ed!  aeNb A  Е%̥V P Е Bf  & enB& eZ;& e6Hŀ ȕ  nЕ Ћ  Е Е & e & eЕ A %& eA Е Е A A   $Е.  AЕ; ~    A &EA  HE 6Dw D&& bЕ- eaePPPЕ-$w D  &Е. ce  Е:   Bw &, 7xl4eV1   55@  ͥ#@>E5uu  < 5@[W& AɥNfv & fA5e&5 4Q4 ea  5  #5 55U  u . 05 w 5u&f& B * ͋'% ͥ!ͥE%,  K5  PB2 %pˋ5J J J @ EͥAA In flf ws$e$,fL " . {"{^{`w wdbD z D/5% %%  S0Ԋ8cP @"s JD%b p w  w 5 tBh?lYjU@055   w @pK5˥t)) ‹5Up55AɥAeu@A55U4 H   &fwD 51 e !`Be`@&  Ae G`5 >  =8.E*450 [ 5e BCœG 5œ8  wP53 3 3 VBA%&  F %  "@ DAD`wU5 .wFBe[  VSY P @ʥ_*& a& Βf&  ߥ&ߥ&wc   :w, 5e 0ε% @   ҕ: B .5 ewN  w"1 B C` x˥.ӥ- ꇂf&Nf& HCB`ק&ק&S?ҕ[e ҕ, ҕ] B¥]¥> B=C` ޒΕ. ˥- N Q NN0KQ ˥. D wѕ0 Τ   ͋ 5D ѕ. B@ⳐB15   ; ( F BU1 1 1 5\ w>58Be8bbbeJbb#3 AA ܃ BP5U ueLEewjh00cccc @B`0 %!wh Tw~wק&ק&@w .5BA8 ևB  u BEC`  D ccє  D ɔɥaɥz Bއ&e # ˔Ee0  fEB`F ~ . ӥ:  ӥ:@! $  @! U`eUU5U mɥ[ɥ<"@  ˥.   z0Q UDeĤ _ Uċ5E  lU0 E pU5 . 5E0 U L. x; n Ċ- bU " & N ӥ"   U5CM% E A5Q`C _C&  p2 && ˥A˥Z˥a˥z ˥*˥% ˥$˥_  ˥0 ˥9 ˥7 U   ˋ˥ ˥ #  .0 µ1!0  5 55   e5& Y5 T SP K  E > 5&@@   ) % e  C   r  &V p 0 p 0    5wr     @  ppp 0 0 0  1 1 1 veN*PU5D e0  S  ,rw ` 4@  %P $ N05E65Q M ̥ I5 5A@p 8 ȥ 45  % D`P`_ ,/O&PXVUTSEEuB 5 =/5 *@ %E E E  M͊    ` ͊ udEE5 p U 5@\ .% - / ,3e"5550% @L @@ R , %P Eewjup1 b5 E v#  j *  P P &1u A  ) fL .H@ D,  4  .   &f .D̥  w f 2 & 2r  4  8 <0w d& l   &ap aB#E   *   uD5e`w eE< .f p2  , ,p l J a b! ZP PH  8P PH f ` %5w  #5 ȥ ȋ5ȋ1 1 ".#Հ && rpp  f `0   0  &f 0 &V &  K&1 . 1  `̥ @ $ ! 1  ŀ f&& x pp   & &   & . w  PUUp. ]<  ΊUE A .   6  J6 6 ev 66m t  `0 4"4 $e$t "4 &&e  0 Dwb&D& %%%p& TI #"$:$5 " !f`L*# @&JAF-*#*'" !f(0j# @&%,j#( f& e  ʜ g" 3 H" | #5"5"5"5@"5 "5"5"5"5"5"#"  #*# B*# u00_tt tfDATAf Enter the default name string: Enter the primary name string: $PARSE error -- STS=%P, STV=%P$PARSE expanded string is %VA%N File name bits (FNB) are %P (DEV%I, NOD%I, DIR%I, NAM%I, QUO%I, TYP%I, VER%I, WDI%I, WNA%I, WTY%I, WVE%I) $ $ w eE D` bl lrw \  B eE"s    s-  Csl&f &  m  f A N  %&   `@ ` B   & A @    ` V ~ > %$& R$V$Z$^$& l&b$b$l&b$b$b$b$b$b$&; ; EXEC MACROS;;;T/; ASSUME MACRO FOR CHECKING SYMBOL DEPENDENCIESL;D  .MACRO ASSUME A,B=0..IIF NE - .ERROR ;EXPRESSIONS NOT EQUAL .ENDM ;O; CALL SUBROUTINEB;9 .MACRO CALL SUBR ARGC .IF IDN <$INTSV>, JSR R5,$INTSV .WORD ^C&PR7 .IFF .IF IDN <$SAVNR>, JSR R5,$SAVNR .IFFe .IF IDN <$SWSTK>, EMT 376 .WORD ARG .IFFS JSR PC,SUBR .ENDC .ENDC .ENDC .ENDM;!; CALL AND RETURN FROM SUBROUTINE:; .MACRO CALLR SUBR JMP SUBRC .ENDM;; CRASH SYSTEM;F .MACRO CRASHL IOT .ENDM; ; SUPERVISOR MODE SUPPORT MACROS;- .MACRO MFPD$ XE .IF DF S$$LIB!U$$DASM MFPD X .IFFS MFPI XB .ENDC .ENDM .MACRO MTPD$ XF .IF DF S$$LIB!U$$DASJ MTPD XT .IFFO MTPI X> .ENDC .ENDM;N*; DIRECTIVE REGISTER SAVE AND SET PRIORITY;I .MACRO DIRSV$ JSR R5,$DIRSV .ENDM;S; SET DIRECTIVE STATUS;N .MACRO DRSTS VALUE TRAP VALUER .ENDM;B;; INTERRUPT SAVE GENERATION MACRO FOR ERROR LOGGING DEVICES;R ) .MACRO INTSE$ DEV,PRI,NCTRLR,PSWSV,UCBSV $'DEV'INT::V .IF NDF LD$'DEV JSR R5,$INTSE .WORD ^C&PR7 .ENDC GTUCB$ UCBSV,NCTRLR,DEV+ MOV U.SCB(R5),R4 ;;;GET OWNERS SCB ADDRESSF .IF DF VC$'DEV'4 BIC #S2.ACT,S.VST2(R4) ;;;INDICATE I/O IS FINISHED RST21=.-2V* MOV S.VKRB(R4),R4 ;;;RETRIEVE KRB ADDRESS RKRB1=.-2J .IFFD3 BIC #S2.ACT,S.ST2(R4) ;;;INDICATE I/O IS FINISHEDA) MOV S.KRB(R4),R4 ;;;RETRIEVE KRB ADDRESSB .ENDC/ MOVB K.CON(R4),R4 ;;;RETRIEVE CONTROLLER INDEXI .ENDM ;A9; INTERRUPT SAVE GENERATION FOR NON-ERROR LOGGING DEVICESN;L) .MACRO INTSV$ DEV,PRI,NCTRLR,PSWSV,UCBSV. .IF NDF LD$'DEV JSR R5,$INTSV .WORD ^C&PR7 .ENDC GTUCB$ UCBSV,NCTRLR,DEV .ENDM;25; GENERATE CODE TO LOAD UCB ADDRESS INTO R5 -- CALLED-0; ONLY BY INTSE$, INTSV$, AND TTSET$ (IN TTDRV).;B .MACRO GTUCB$ UCBSV,NCTRLR,DEVR .IF NB / .IF GT NCTRLR-1 MOV UCBSV(R4),R5R .IFF MOV UCBSV,R5. .ENDC .IFFO .IF DF LD$'DEVE3 MOV 'DEV'CTB,R5 ;;;GET ADDRESS OF KRB TABLE IN CTBA# ADD R4,R5 ;;;ADD CONTROLLER INDEXE) MOV (R5),R5 ;;;GET KRB ADDRESS FROM CTB, .IFFC1 MOV $'DEV'CTB(R4),R5 ;;;GET KRB ADDRESS FROM CTBR .ENDC0 MOV K.OWN(R5),R5 ;;;RETRIEVE OWNERS UCB ADDRESS .ENDC .ENDM L  ;R5; GET I/O PACKET MACRO -- AUTOMATE UNIT DETERMINATIONT;$ N( .MACRO GTPKT$ DEV,NCTRLR,ADDR,UCBSV,SUC .IF DF VC$'DEV' CALL @GTPKT .IFFR CALL $GTPKT .ENDC .IF B U BCC 65535$N RETURNO65535$:  .00ccccIFFE BCS ADDR' .ENDC .IF B  $$$=0 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN ,
$$$=1 .IF B .IF EQ $$$/ MOV R5,S.OWN(R4)U .ENDC .ENDC .IFFO .IF GT NCTRLR-1 MOV R5,UCBSV(R3), .IFFB MOV R5,UCBSV  .ENDC .ENDC .ENDM F  L;G+; GENERATE THE DEVICE DISPATCH TABLE -- DDTR;R 1 .MACRO DDT$ DEV,NCTRLR,INY,INX,UCBSV,NEW,BUF,OPT> .IF NB  .WORD 'DEV'CHK$ .ENDC .IF NB > .WORD 'DEV'DEA  .IFFD .IF NB , .WORD 1 ;ENTRY SHOULD NOT BE USED - CRASH .ENDC .ENDC .ENABL LSB1 .IF B $'DEV'TBL::.WORD DEV'INI .IFFD$'DEV'TBL::.WORD DEV'INX .ENDC .WORD DEV'CAN .WORD DEV'OUT .IF B .WORD 65533$R .WORD 0 .WORD 65531$. .IFFM .WORD DEV'PWF .WORD DEV'KRB .WORD DEV'UCB .ENDC .IF DIF ,P .ASCII /DEV/D .IF B  .WORD $'DEV'INT .IFF, .IRP X,U .WORD $'DEV''XO .ENDM .ENDC .WORD 0 .IF DF LD$'DEVF'DEV'CTB: .WORD 0  .IFFD $$$=0 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IF EQ $$$N'DEV'CTB: .WORD $'DEV'CTBE .IFFO'DEV'CTB: .WORD $RHCTB .ENDC .ENDC .ENDC .IF DF LD$'DEVO$'DEV'TBE::.WORD 0 .ENDC .IF NB <UCBSV: .BLKW NCTRLR  .ENDC .IF B 65531$: BITB #UC.PWF,U.CTL(R5) BEQ 65532$O65533$: BCS 65532$ JMP DEV'PWF65532$: RETURN .ENDC .DSABL LSBR .ENDM;$; PROCESSOR STATUS READ/WRITE1;. .MACRO MFPS DST MOVB @#PS,DST .ENDM .MACRO MTPS SRC .IF IDN <#0>,. CLRB @#PS .IFF$ MOVB SRC,@#PS .ENDC .ENDM . E;$'; MULTIPROCESSOR LOCK AND UNLOCK MACROSD;C  R# .MACRO LOCK$ ADDR,TYPE,?LAB1,?LAB2F$$$=0' .IF IDN ,$$$=1C .IF DF M$$PRO MOV #'ADDR,-(SP)T CALL $MLOCK .ENDC .ENDC $ .IF IDN ,$$$=16 .IF DF M$$PROLAB1: ASRB ADDRD BCC LAB13 CACHE$ BYPASS .IF DF L$$DBG .NTYPE TMP,ADDR .IF EQ TMP-67 TSTB ADDR+1 .IFF .IF EQ TMP&70-10M TSTB 1'ADDR .IFF .IF EQ TMP&70-60. TSTB 1+ADDR .IFFC1 .ERROR ;INCORRECT ADDRESSING MODE FOR LOCK BLOCK. .ENDC .ENDC .ENDC BMI LAB2  CRASHLAB2: .IF EQ TMP-67 MOVB $PROCN,ADDR+1L .IFFB .IF EQ TMP&70-10N MOVB $PROCN,1'ADDRC .IFFD .IF EQ TMP&70-60D MOVB $PROCN,1+ADDRK .IFFC+ .ERROR ;INCORRECT ADDRESSING MODE IN LOCK$ .ENDC .ENDC .ENDC .ENDC .ENDC .ENDC4 .IIF EQ $$$ .ERROR ;NOT SPIN OR WAIT IN LOCK$ MACRO .ENDM T  .MACRO ULOCK$ ADDR,TYPE,?LAB1 .IF DF M$$PRO .IF IDN , MOV #'ADDR,-(SP) CALL $MULCK .ENDC .IF IDN , .IF DF L$$DBG .NTYPE TMP,ADDR .IF EQ TMP-67 CMPB $PROCN,ADDR+1E .IFF7 .IF EQ TMP&70-10+ CMPB $PROCN,1'ADDRM .IFFN .IF EQ TMP&70-60D CMPB $PROCN,1+ADDRM .IFFD, .ERROR ;INCORRECT ADDRESSING MODE IN ULOCK$ .ENDC .ENDC .ENDC BEQ LAB CRASHLAB: .IF EQ TMP-67 COMB ADDR+1 .IFF  .IF EQ TMP&70-10S COMB 1'ADDR .IFFM .IF EQ TMP&70-60 COMB 1+ADDR .IFF,, .ERROR ;INCORRECT ADDRESSING MODE IN ULOCK$ .ENDC .ENDC .ENDC .ENDC CACHE$ RESTOR MOVB #1,ADDR, .ENDC .ENDC .ENDM T  .MACRO LCKDF$ TYPE- .IF IDN , .BYTE 1 .BYTE -1& .ENDC .IF IDN , .BYTE 1 .BYTE -16 .BYTE 1 .BYTE -1D .WORD 0 .ENDC .ENDM T D%LK.SPN=2 ;LENGTH OF SPIN LOCK BLOCK&LK.WAT=10 ;LENGTH OF WAIT LOCK BLOCK - ; !; DEFINITIONS FOR CACHE OPERATION;M ' .IF DF P$$D70 & M$$PRO& 6$FLUSH=1*400 ;CACHE FLUSH OPERATION&BYPASS=2*400 ;CACHE BYPASS OPERATION . .ENDC C . C;C; MACRO FOR CACHE OPERATION;N  .MACRO CACHE$ ARG,ARG2. .IF DF P$$D70 & M$$PROI < .IF IDN ,. BIC #BYPASS,@$MPCSR+6 .ENDC W .IF IDN ,6 BIS #BYPASS,@$MPCSR+6 .ENDC . .IF IDN , BIS #FLUS00 tt tfDATAH,@$MPCSR+6N .ENDC  .IF IDN ,F MOV @$MPCSR+6,-(SP) BIC #^C,(SP)  .IF DIF , BIC (SP),@$MPCSR+6M .IFF BIS #BYPASS,@$MPCSR+6 .ENDC .ENDC Y .IF IDN ,S BIC #BYPASS,@$MPCSR+6 BIS (SP)+,@$MPCSR+6 .ENDC  .ENDC .ENDM  A;A; SAVE NONVOLATILE REGISTERS;M .MACRO SAVNRI JSR R5,$SAVNR .ENDM;A; STATE SWITCHING MACRO;F .MACRO SWSTK$ ARG CALL $SWSTK,ARG .ENDM;'; TALLY A FIELD IN SYSTEM ACCOUNT BLOCK$;S .MACRO TALLY$ OFF,CND,PROCR .IF DF X$$ACC&A$$CNT&CNDS MOV R0,-(SP)S MOV #140002+OFF,R0R .IF IDN ,, CALL $ACINP .IFF ; IDN , CALL $ACINC .ENDC ; IDN ,N .ENDC ; DF X$$ACC&A$$CNT&CNDB .ENDM;R5; CPR SEND MACRO -- SEND A PACKET TO CPRAME OR CPRSYSN;A$ .MACRO CPSEN$ OPCODE,BUF,LEN,SHRBAS .MCALL MOV$ MOV$ SHRBAS MOV$ LENT MOV$ BUF MOV$ OPCODE .IF DF VC$CPR S CALL @CPSEN .IFF CALL $CPSEN .ENDC ;VC$CPR .ENDM .IIF NDF S$$YDF , .LISTCR .IF DF X$$ACC&A$$CNT&CNDS MOV R0,-(SP)S MOV #140002+OFF,R0R .IF IDN ,, CALL $ACINP .IFF ; IDN , CALL $ACINC .ENDC ; IDN ,N .ENDC ; DF X$$ACC&A$$CNT&CNDB .ENDM;R5; CPR SEND MACRO -- SEND A PACKET TO CPRAME OR CPRSYSN;A$ .MACRO CPSEN$ OPCODE,BUF,LEN,SHRBAS .MCALL MOV$ MOV$ SHRBAS MOV$ LENT MOV$ BUF MOV$ OPCODE .IF DF VC$CPR S CALL @CPSEN .IFF CALL $CPSEN .ENDC ;VC$CPR.; .; SYSGEN.CMD;.;/.; RSX-11M-PLUS SYSGEN -- Chain to SYSGEN.CLBF.;.;.;#.; COPYRIGHT (c) 1979, 1985 BYl).; DIGITAL EQUIPMENT CORPORATION, MAYNARD;(.; MASSACHUSETTS. ALL RIGHTS RESERVED..;B.; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDB.; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSEB.; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISB.; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORB.; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND3.; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED. .;B.; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTB.; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL.; EQUIPMENT CORPORATION.N.;B.; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF=.; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.I.;.; Version: 03.01S.;.; Written by:.;.; J. C. Franzini .;.; Modified for M-PLUS V3.0 by: .;!.; J. C. Franzini 31-Aug-84 03.01L.; JCF177 -- Add $SGNFI.; .ENABLE GLOBALT .ENABLE SUBSTITUTIONE<.; Get device and directory containing SYSGEN command files.! .PARSE "]" $SGNFI JUNKSS .SETS $SGNFI $SGNFI+"]"".; Chain to SGNMAIN in SYSGEN.CLB. .CHAIN '$SGNFI'SYSGEN.CLB/LBFOR THE USE OR RELIABILITY OF=.; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.I.;.; Version: 03.01S.;.; Written by:.;.; J. C. Franzini .;.; Modified for M-PLUS V3.0 by: .;!.;.; SGNPREFIX.CMD.;..; RSX-11M-PLUS SYSGEN -- Prefix Command File2.; Allow unsupported systems to be generated..;.;.;>.; COPYRIGHT (c) 1982, 1985 BY DIGITAL EQUIPMENT CORPORATION..; ALL RIGHTS RESERVED.S.;=.; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDY?.; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.P.;.; Version: 03.01E.;.; Written by:.;.; J. C. Franzini.;.; Modified for M-PLUS V3.0 by: .;!.; J. C. Franzini 27-Aug-84 03.01.; JCF174 -- cleanupC.;F.; This command file can be used to generate nonstandard systems or toI.; predefine the SYSGEN questions which are not saved in the saved answerI .; files.MC.; EDIT THIS COMMAND FILE AT YOUR OWN RISK. IF YOU EDIT THIS FILE,ND.; SYSGEN AND THE RESULTING SYSTEM WILL NOT BE SUPPORTED BY DIGITAL.J.; To use this command file, edit it as you wish and leave it in [200,200]=.; with the name SGNPREFIX.CMD. Then invoke SYSGEN normally.L.; SYSGEN will find the latest version00cccc of this command file in [200,200] andF.; will use the symbols defined in it to perform a nonstandard SYSGEN.G.; SYSGEN will try to warn you that you are using SGNPREFIX to generatesB.; a nonstandard system by printing out one of the messages below.G.; As long as your edited copy of SGNPREFIX remains in [200,200], everyA-.; SYSGEN you perform will be affected by it.o .ENABLE GLOBALn .ENABLE SUBSTITUTION  .DISABLE LOWERCASET .SETT Y .SETF NB.; ***************************************************************B.; * *B.; * !!! WARNING !!! *.; * *B.; * IF YOU CHANGE THE DEFINITIONS OF THE FOLLOWING VARIABLES, *B.; * THE RESULTING SYSTEM WILL NOT BE SUPPORTED. *B.; * *B.; ***************************************************************/ .SETF $18BIT ! 22-bit system will be generated*?.; .SETT $18BIT ! 18-bit system will be generated (UNSUPPORTED) 9 .SETF $M$PRO ! Single processor system will be generated G.; .SETT $M$PRO ! Multiprocessor system will be generated (UNSUPPORTED)U .SETL SUPRTD #$18BIT&#$M$PROL .IFT SUPRTD .GOTO 10* ;B ; ***************************************************************B ; ***************************************************************B ; ** **B ; ** WARNING -- THIS SYSTEM WILL NOT BE SUPPORTED BY DIGITAL **B ; ** **B ; ***************************************************************B ; *************************************************************** ;.10: .; Continue9 .SETN SPACE ! Mark current size of symbol table*J.; The following symbols control nonstandard, unsupported SYSGEN behavior.4.; .SETT $B$LIN ! Output the baseline RSXMC symbol5.; .SETT $P$GEN ! Output the pregenned RSXMC symbolN(.; .SETT $USACF ! Use the ACF results?.;9.; .SETS $NL "SY:" ! Create output files during PREPGEN*.;P.; Normally SYSGEN creates its output files in [200,200] and [11,10]. If $DIRCTM.; is defined, SYSGEN will create the output files in that directory instead.S.;;.; .SETS $DIRCT ! Create output files in defaulto7.; .IF $DIRCT EQ "[]" .SETS $DIRCT ! ...directoryv.;..; .SETT $SYSBL ! Generate system for SYSBLD .IF EQ SPACE .GOTO 20 ;B ; ***************************************************************B ; * *B ; * WARNING -- This is a nonstandard, unsupported SYSGEN *B ; * because SGNPREFIX has defined special symbols. *B ; * *B ; *************************************************************** ;.20: .; Continue9 .SETN SPACE ! Mark current size of symbol tableCG.; The following symbols are the answers to the SYSGEN setup questions.*H.; If any of these symbols are defined here, the corresponding questions(.; will not be asked when SYSGEN is run.7.; .SETL $EC N ! Always want the explanation printed?R6.; .SETL $SVUI1 Y ! Use saved answers for Executive?J.; .SETS $SVNI1 $DIRCT+"SYSGENSA1.CMD" ! Executive input saved answer fileK.; .SETS $SVNO1 $DIRCT+"SYSGENSA1.CMD" ! Executive output saved answer fileS8.; .SETL $SVUI2 Y ! Use saved answers for peripherals?L.; .SETS $SVNI2 $DIRCT+"SYSGENSA2.CMD" ! Peripherals input saved answer fileM.; .SETS $SVNO2 $DIRCT+"SYSGENSA2.CMD" ! Peripherals output saved answer filee;.; .SETL $SVUI3 Y ! Use saved answers for nonpriv builds?tN.; .SETS $SVNI3 $DIRCT+"SYSGENSA3.CMD" ! Nonpriv build input saved answer fileN.; .SETS $SVNO3 $DIRCT+"SYSGENSA3.CMD" ! Nonpriv build output saved answer fil*.; .SETL $PREP Y ! Want to do a PREPGEN?7.; .SETS $RP "SY:" ! Disk containing distribution kit 4.; .SETL $RNACF N ! Autoconfigure the host system?9.; .SETL $ACFDF Y 00tt tfDATA! Override the Autoconfigure results?.3.; .SETL $COMPL Y ! Want to do a complete SYSGEN?u8.; .SETL $CONT N ! Want to continue a previous SYSGEN?,.; .SETS $CONT1 "A" ! Section to restart at .IF EQ SPACE .GOTO 30 ;B ; ***************************************************************B ; * *B ; * WARNING -- Some of the SYSGEN questions will not be asked *B ; * because SGNPREFIX has defined the answers. *B ; * *B ; *************************************************************** ;.30: .; Continue .EXIT ction to restart at .IF EQ SPACE .GOTO 30 ;B ; ***************************************************************B ; * *B ; * WARNING -- Some of the SYSGEN questions will not be asked *B ; * because SGNPREFIX has defined the answers. *B ;<0W 7@-=ww[wH wswaw`OwEw""-w#w{Q8wT[=wxdwdHw twww(0wP9 :@tW T99\.;.; SGNMAIN.CMD.;3.; RSX-11M-PLUS SYSGEN -- Mainline command file=.;.;.;.; COPYRIGHT (c) 1987 BYU+ .; DIGITAL EQUIPMENT CORPORATION, MAYNARDo* .; MASSACHUSETTS. ALL RIGHTS RESERVED. .;D .; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDD .; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSED.; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISD.; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORD.; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND5.; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.c.;D.; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTD.; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL.; EQUIPMENT CORPORATION.D.;D.; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF?.; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL..;.; Version: 10.16 .;.; Written by:.;.; J. C. FranziniR.;! .; Modified for M-PLUS V2.1 by: !.;".; J. C. FranziniR#.;!$.; Modified for M-PLUS V3.0 by:D%.;#&.; J. C. Franzini 26-Jan-84 10.00U8'.; JCF154 -- improve test for kit installed correctly(.;#).; J. C. Franzini 13-Aug-84 10.01T,*.; JCF157 -- support SYSGEN under the AME+.;#,.; J. C. Franzini 13-Aug-84 10.02E -.; JCF169 -- changes for BL20..;#/.; J. C. Franzini 27-Aug-84 10.03G0.; JCF174 -- cleanupn1.;#2.; J. C. Franzini 31-Aug-84 10.04;300$cccc.; JCF177 -- add $SGNFI4.;#5.; J. C. Franzini 16-Nov-84 10.05J/6.; JCF201 -- force terminal to /NONAMED mode.7.;#8.; J. C. Franzini 18-Feb-85 10.06 -9.; JCF223 -- fix JCF201 to work under V2.1s:.;#;.; J. C. Franzini 8-Mar-85 10.07 *<.; JCF240 -- check exit status from ACF=.;#>.; J. C. Franzini 5-Apr-85 10.08n(?.; JCF247 -- make sure NL: is on line@.;!A.; G. N. Larsen 15-Apr-85 10.09A7B.; GL0010 -- make sure target system disk is mountedFC.;!D.; G. N. Larsen 7-Jun-85 10.10 9E.; GNL021 -- set default protection to rwed,rwed,rwe,r;F.;!G.; G. N. Larsen 2-Jul-85 10.11dBH.; GNL024 -- additional changes to support SYSGEN under the AMEI.;#J.; J. C. Franzini 15-Aug-85 10.12.3K.; JCF268 -- add more assignments for VAX-11 RSXtL.;M.;M.;!M.; L.B. McCulley 3-Nov-86 10.15 @M.; LBM035 -- Fix BL display for Version 4.0 Internal FT and<M.; edit description of section for rebuilding tasks.M.;!M.; J. W. Berzle 30-Jan-86 10.16r@M.; JWB189 -- Fix Baselevel and Copyright display for V4.0 FTN.; Documentation by:O.;P.; M. J. TardiffQ.; RGS.; This command file must run on the current and previous versions of;$T.; RSX-11M-PLUS and on VAX-11 RSX.U0V.; SYSGEN is supported on the following disks:W.;X.; RP04, RP05, RP06l!Y.; RM02, RM03, RM05, RM80, RP07- Z.; RK07s[.; RA60, RA80, RA81t\D].; Variable names and use conventions in the SYSGEN command files:^.;F_.; $a$aaa contains the value associated with the RSXMC symbol a$$aaaO`.; a$aaaa contains the value associated with the data structure offset a.aaaaMa.; aa'xxx' type symbols should be thought of as arrays or tables, where thes b.; variable xxx is the index.c.;/d.; TEMPN, TEMPNn temporary numeric variables .e.; TEMPS, TEMPSn temporary string variables/f.; TEMPL, TEMPLn temporary logical variablesRg.;Jh.; These temporary variables should only be used for short-term, obviousMi.; purposes: counters, indices, intermediate values, temporary work areas,aIj.; etc. They should NEVER have any long-term significance. The entireaIk.; life or scope of any one usage should be visible at a glance. Never El.; expect a temporary variable to be intact over a subroutine call. m.;Nn.; DFLTN temporary numeric variable holding default response for a questionMo.; DFLTS temporary string variable holding default response for a questionsNp.; DFLTL temporary logical variable holding default response for a questionq.;Mr.; The following string variables define all the drivers in a given system.gKs.; Each variable contains a class of drivers. The drivers are classifiedbGt.; by whether they are DIGITAL-supplied or user-supplied, resident ortLu.; loadable, with resident or loadable data bases. The strings are of the6v.; form: dd,dd,dd,... where dd is a device mnemonicw.;Fx.; $DSRR DIGITAL-supplied resident drivers with resident data basesFy.; $DSLR DIGITAL-supplied loadable drivers with resident data basesFz.; $DSLL DIGITAL-supplied loadable drivers with loadable data basesC{.; $USRR User-supplied resident drivers with resident data baseseC|.; $USLR User-supplied loadable drivers with resident data basesiC}.; $USLL User-supplied loadable drivers with loadable data bases.~.;7.; Global Symbols: * - defined in this command filev.;(.; $DCLI* restore CLI to DCL when done.; $EC* expanded commentsn.; $PREP* PREPGENS.; $RP* release disk3.; $SVNI1* Executive saved answer input file nameI5.; $SVNI2* peripherals saved answer input file namesC.; $SVNI3* nonprivileged task builds saved answer input file namee4.; $SVNO1* Executive saved answer output file name6.; $SVNO2* peripherals saved answer output file nameD.; $SVNO3* nonprivileged task builds saved answer output file name4.; $SVUI1* use saved answers for Executive options;.; $SVUI2* use saved answers for peripheral configurationR<.; $SVUI3* use saved answers for nonprivileged task buildsD.; $SYGEN*00,tt tfDATA lower-level command files have been invoked from SYSGEN.;L.; NOTE: The answers to the questions in this module are not saved in theO.; saved answer files. However, the answers can be pre-defined in SGNPREFIX.d.; File usage:.;.; @SGNPREFIX .; @ACFANSl.; .CHAIN /LB:SGNNXTl  .ENABLE GLOBALd .ENABLE SUBSTITUTIONt .ENABLE ESCAPEu .DISABLE LOWERCASEr ; ; RSX-11M-PLUS SYSGEN BL40v ; ; COPYRIGHT (c) 19870 ; DIGITAL EQUIPMENT CORP., MAYNARD MA., 01754 ; .SETT $SYGENN .SETT Y .SETF N .SETS COLON ":" .SETF $CE .SETF $CD .SETF $AE .SETF $BE .SETF $BP .SETF $BN .SETF $VM .SETF $AD9.; Define these symbols in case SGNPREFIX is not aroundl. .SETF $18BIT ! SGNPREFIX redefines this !. .SETF $M$PRO ! SGNPREFIX redefines this !. .SETF $B$LIN ! SGNPREFIX redefines this !. .SETF $P$GEN ! SGNPREFIX redefines this !1 .SETS $DIRCT "" ! SGNPREFIX redefines this !0. .SETF $SYSBL ! SGNPREFIX redefines this !7 .TESTFILE SGNPREFIX.CMD ! Is prefix file available?E .IF NE 1 .GOTO 10$ @SGNPREFIX.CMDEN.10: .IFT .OR .IF EQ 5 .GOTO 12 ! always F on AME ;J ; SGN -- Warning: This terminal is nonprivileged. If all the requiredJ ; tasks are not installed, or if you do not have write-access toJ ; the necessary UFDs on the target system disk, this SYSGEN will& ; not complete successfully.A.12: .SETF $DCLI ! remember if CLI was DCL so we can restore itp .IF NE "DCL" .GOTO 20 .SETT $DCLI ; SET TERM MCRI.20: .; Continue0.; Set terminal to /NONAMED mode if necessary.9 .IF EQ 5 .GOTO 22 ! If EQ, AME, nonamed moden= .IFNDF .GOTO 22 ! If NDF, pre-V2.1, nonamed moden3 .SETN F4$NAM 1000 ! Define bit mask for F4.NAM K .PARSE "," JUNKS JUNKS JUNKS FMASK4 JUNKS ! Get 4th feature mask 4 .SETN TEMPN 'FMASK4'&F4$NAM ! Isolate bit F4.NAM= .IF TEMPN EQ 0 .GOTO 22 ! If EQ, named dir not supported $ .IF NE "[]" SET /NONAMED'.; ! If NE, named mode, reset itS.22: .; Continue. .IF NE "[200,200]" SET /UIC=[200,200]C .IFDF .AND .IF EQ 6 SET /DPRO=[RWED,RWED,RWE,R]eV .IFDF .AND .IF EQ 5 SET PROT=(SY:RWED,OW:RWED,GR:RWE,WO:R)/DEFAULT .IFNDF $EC .GOTO 24 .IFF $EC .GOTO 39.24: .; Continue ;@ ; To exit from the SYSGEN procedure at any time, type CTRL/Z. ;B ; If you are unsure of the answer to a question for which a de-1 ; fault answer exists, use the default answer.2 ; ; ;7 ;===================================================>: ; Choosing SYSGEN Options '' at '

50 0* 7 5eE@`    mb7` \ 8` E^w  .|%  xwz<E B a 7 :&  77 7 w  m777w m5ml   ~m7zl 7z5)m7blw bm0mh 7Tmv7:l 7:w 8   "$ 5$mmw &   07zw~  P &  #% | , w F 6     wL n   8V V& 804e6(> l 7 @ 2 ^2 b)2 P2 Z- ze wxP   T |   h7 Z7 VP RN NT`U2E( g  6&f  m   |804e6(> ~ $p8f&  )` D8 w .7 `7 ^ 7F8>8$ h ,* :7 *7 (0* w & H5& aC|w  7 ,raC`w     R 8f  ,&,L44e6(>  %  U? a 8  8 `7 7 7 7 vfj& ~ >6vwRF7B(e"FeB$$$e((޷<Rw<J  w<@    .w<$"# H`  %W5@5 Of &F t6vw7|7 *7<&5@   T  `  (  h  R f  L75wv * 7+D+P+\+j+`,,,~+/++,,+ -- -*-0--&------//----w z7 7 () X5 t5 f5 ۷ P5 F    T T   7 @%% 8)5@v ^)D lm47 ) W, W,s,  %%  T W, W,, & d [>ۂ` .5 h7 `mE  ) F) w7 2 l&@A 8mPـet s Lk g & .e^ & eT  Q ~ I & e& 4' zx teje?  eE  B B B P   f& e   T& ve#5H"5  &e  ڀ^  v& e7~ &  @A m׀e7Nmv xׁ mew)0& ^   h) w d2 J J D,Db@T&0 e H ق  (  J    w   j1 A `A ~ & e "  (%wL75m) P  je lv  ߂@5mD  45@(  fA R@e 47 #   E     sN  7 | v7 r l؆wmd`\Zww ׂ` צ ^ *  #A 55 5@ @@ mՂ 7 7 %1%o|mtX) J     p`  Z,,  %% 71e- (7%%   ŀ%7%w`% 7 @w 5bwD%wB 75)7j5dU`EQ 5Um    7E  ,Xy 55P   |e55c 5@, )p eEp r &rP   m545X, :5@ &)p eEp rP rP   m\ $) A e  fe -B.  <' v55D RD  B5  .5e 57Ltp 5 7 , j  5  77lw e 7555ll5 & ev7E dEbn V 57 wZP& E$ b5~Z<EVD 0%0%5e" Z.% mB l . 57  e  U5@%J%` fmV& 0mւeeA A )  ևfE @mt5 @ @ @ 55B5m4,5 fE J5& V75m A A A ,3X s,w 5>-7 7 7 7 ) h7l 7&fEjEA j `A "$ &5 `eN F (&8) E R e 2Dm& e   8  Dm& R R  hw  ) Hw$) 8w~|5 Lf& <) b)     2) )PH  00.sUTl1DATADATADATADATADATADATADATA PPZ) w Dm& $) z7fEjEhwA  vA "$ 5 ,,7lV VHP VH @me, w    rT,` r)w)u u u u C eE P75 5 5 wn& e&b e & l  e hw(E    f eA A* e5"5,$    &- 7 me &r m  d  w P B74 p5@2 #  ` E@ 7"|7 5  J > , z5@ | w,w e8  00  Hw 5@6) 5"8e  v 00 !  r d e d ^5@ 5 : d|$  ~| 7R7 D7 Bw 8 2.mP777w  m 5ml   ~m 7l 75)m7lw mm 7m7l 7w   vxmjvmfr  ߔ  x * `  7h7b & Uw F&  < R7w  r &  #%  N 7 7 7 7 Bfj& ~ 6vw7(e"eB$$$e((<nw<f  w<\    Jw<@># `  %W5@5 Of &F @6vwT7H7 *7<&5@      |`   4  R f  7Qwv F 7%* ,  5bUwp = E5UB@@P+Z20%A5R w= U% e U%  * % &. 0%M- x0% T - b0% >,- L0%5' "~7 v7 t7 f7 dR 0%|*x*- 4 j- 5* -,2 -&,--0%5 |**+ |*+ ӊm5  ӊmN+ h1+ ^5d| 5p - 45 VT . t* $wXmTZw TmHN  e  - l, , , 5 1 w hf ^0%-ZҪҘ" "    m %\\  5X", -2X"$"    j <, -AC,-AL,-CM,-CP,-DA, -EA,@-FP,-HD,-PI,@-PM,-PR,-SE, -SL,-TR,-MU,-ID,00.UTl1DATADATADATADATADATADATADATA%N*** Root segment: %2R%3N*** Segment: %2R%3NR-O mem limits: %P %P %P %U.%NR-O mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NR/W mem limits: %P %P %P %U.%NR/W mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NDisk blk limits: %P %P %P %U.%NDisk blk limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%N%2NMemory allocation synopsis:%2NSection%44STitle Ident File%N-------%44S----- ----- ----%N%2R:(%VA%VA%VA%VA%VA%VA %P %P %U.%N%30S%P %P %U. %2R %2R %X%N%3NGlobal symbols:%2N%F) w 0 -B *- \*~F 5-P+.4"   |5.p+ "   T --* 05  +   |5OR@I5J@J@   e ` +5p# 5J@J@   e ` t+ , 7, W, 5e&e85c& P [ :0% ,b w w 5m7  w,7 x e !  rB 240( w 1J p5RaU%U% %$$ , )w dF 0%$; 5 5  tmRm bp5   , w 7 ,s&*-, e"8 ** U  mp**0%   <  (    f  H w "  a 7    RO,RW,D,I,@GBL,LCL, REL,ABS,OVR,CON,SAV,$$$,%2NFile: %X Title: %2R Ident: %2R%N <%2R>: %P %P %P %U.%N >>>>>>>>>>>> Undefined reference: %2R%2N%7S ,R+,T,T,T,,++++++,+Z,w 5w <    *z*  x*B J  + e <x*w e"  f -:؈  x* 5%ڂ` &  : p`  7 >e" x* l JR RRR * f& > , J *-DV -P Pw4;&*/  lh * *& > * 0%   ~t%~V&"&L'L'L'L'F'f&&&&&&J'&&w  (  %%  %B   % ߂` 7H7DGw:w6- %RRB 6GD ŵŵ ŵ mݷ &mwŵ 7 ŀ7  m`ݐ-, 7%  7 F۰p ` ߇h%  5 %w fp5@b5@V%\PHPJPLPNPPPVPXPZP\P^5eН@ 2E@@3 P# \7P E@`  6t(  % 5 w ! ~5 j00.UT3eaeksN x|1o  ,  s, ,  3X     s, wW^"b"~"""w  :# F` 7b5505t- U U 2ZTT N PJH &e" j5m47 \5 5) & D <5 jTTR5 ԕT -:  dZ   , 50-  - . v b bZCet5 A  1,1, 5m   % ^!ZB (D@e 2w7 Det=j x+&  h+ ^w F  T   e~ |wnw CTEoU`5 TT  ""  , <   ""w-3XJ a &! -h D  4SA {RJ33mH3 3 < 4 , @5 eVL  e&& f &  J  #w~0   3 3 4@ 5 Xw6  5 855\5 T ~@e"VR t4-   7, eA  ",œԕ5   mE %  5 5 D 555 UA TTԕ@ԕ f   7z  # ! w tj7`7\b @wR  & I wB  7 (      7       ~7W!i g B w 8@   w @ 55 @a \@@a RP $ & . @  0w> ,w6      w` eP PPЕ % Z!XB p ` `w ~te8  00  8&   p`    &      7  70& e =wj   wN P& B     m f Bw( -& & mv߁e > @l55 mJ  @  w & ߷  >7w  ^ &  #% b : T J FL * `  (77 & U7 7 7 7 fj& ~ 6vw7(e"eB$$$e((vݷ<zw<r  w<h    Vw<LJ# `  . %XW5@5 Of &F 6vw77 *7<&5@    < `     R f  7]wv R R77 2&4 8(އ   w  EE J3    0  * w & f w X R  b& ff 2 ,  $ N   !6 U 4)00.UTl1DATADATADATADATADATADATADATAV)  5RO'5RW'5SV'5'B .(+*+  &• H   ; w ; !,:& u@5e, RNOWE 5& , ! [ ]   )@ 55 ,.@ L4 V5ȕf  .ڂ5@ wз w w^ -ЋSV هw t  ڇw deB$&ww (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$f $* rсeE  ,*( e(  eRRR צv" pbeBeRRRRR R R  X&50e N"ppple5let ͇v p|54e6(5 J xH  ·0 H p|54e6(5 ,䇷  ·7 bw\ Xe·)w@ 7 > I χ AZ    5^Vȋ+& ȥ+ȥ-  U  f  *u  u  ¥ ¥ ȥ ȥ  &  m  f A N  % & & @( Bf  e ee e 77778 8H8]888889/9]9{999 :;:[::::;@;_;;;;;<+3>X>x>>>>?77778<8q8888,9I9k99999":>:e::::;>;p;;;;X>>>>?&?]????-@ -- *DIAG*- -- *FATAL*-  DC!n   ` ~ F t"6 .6<7!7D7 D5 &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e ܺ0? H@&  m  f A N  %00.UT3eaekIllegal Get Command Line error code%2NCommand syntax error%2N%VA%2NRequired input file missing%2NIllegal switch%2N%VA%2NNo dynamic storage available%2NIllegal error-severity code %P %P %P%2NCommand I/O error%2NIndirect file open failure%2N%VA%2NIndirect command syntax error%2N%VA%2NIndirect file depth exceeded%2N%VA%2NI/O error on input file %X%2NOpen failure on file %X%2NSearch stack overflow on segment %2R%2NPass control stack overflow at segment %2R%2NFile %X has illegal format%2NModule %2R ambiguously defines P-section %2R%2NModule %2R multiply defines P-section %2R%2NModule %2R multiply defines xfr addr in seg %2R%2NModule %2R illegally defines xfr addr %2R %P%2NP-section %2R has overflowed%2NModule %2R ambiguously defines symbol %2R%2NModule %2R multiply defines symbol %2R%2NInsufficient APRs available to map read-only root%2NSegment %2R has address overflow: allocation deleted%2NAllocation failure on file %X%2NI/O error on output file %X%2NLoad addr out of range in module %2R%2NTruncation error in module %2R%2N%D undefined symbols segment %2R%2NInvalid keyword identifier%2N%VA%2NOption syntax error%2N%VA%2NToo many parameters%2N%VA%2NIllegal multiple parameter sets%2N%VA%2NInsufficient parameters%2N%VA%2NTask has illegal memory limits%2NOverlay directive has no operands%2N%VA%2NIllegal overlay directive%2N%VA%2NOverlay directive syntax error%2N%VA%2NRoot segment is multiply defined%2N%VA%2NLabel or name is multiply defined%2N%VA%2NNo root segment specified%2NBlank P-section name is illegal%2N%VA%2NIllegal P-section/segment attribute%2N%VA%2NIllegal overlay description operator%2N%VA%2NToo many nested .ROOT/.FCTR directives%2N%VA%2NToo many parentheses levels%2N%VA%2NUnbalanced parentheses%2N%VA%2NIllegal logical unit number%2N%VA%2NIllegal number of logical units%2N%VA%2NIllegal default priority specified%2N%VA%2NIllegal ODT or task vector size%2NIllegal filename%2N%VA%2NIllegal device/volume%2N%VA%2NLookup failure on file %X%2NIllegal directory%2N%VA%2NIncompatable reference to library P-section %2R%2NIllegal reference to library P-section %2R%2NResident library memory allocation conflict%2N%VA%2NLookup failure resident library file - %X%2NIllegal partition/common block specified%2N%VA%2NNo memory available for library %2R%2NPIC libraries may not reference other libraries%N%VAIllegal APR reservation%N%VAI/O error library image file%N%VARequired partition not specified%2NInvalid APR reservation%N%VAComplex relocation error-divide by zero module %2R%2NWork file I/O error%2NLookup failure on system library file%2NUnable to open work file%2NNo virtual memory storage available%2NModule %2R not in library%2NIncorrect library module specification%N%VA%2NLibrary file %X has incorrect format%2NResident library has incorrect address alignment%2N%VA%2NPartition %2R has illegal memory limits%2NInvalid partition/common block specified%2N%VA%2NTask build aborted via request%2N%VA%2NDisk image core allocation too large%2N%VA%2NInvalid window block specification%2N%VA%2NTask requires too many window blocks%2NTask has illegal physical memory limits%N%P %P %P%2NLibrary references overlaid library%2N%VA%2NTask image file %X is non-contiguous%2NVirtual section has illegal address limits%2N%VA%2NFile %X attempted to store data in virtual section%2NResident library mapped array allocation too large%2N%VA%2NInvalid reference to mapped array by module%2R%2NEnd of file reached before .END in %X%2NSymbol %2R not found for patch %2NSegment %2R not found for patch %2NSupervisor mode completion routine is undefined %2NLibrary not built as a supervisor mode library%N%VA%2NSupervisor-mode library reference error%N%VA%2NIllegal system size specified %2NConflicting base addresses in cluster library %2NLibrary %2R not found in any cluster%2NIllegal cluster configuration %2NCluster library element %2R does not have null root%2NModule %2R contains incompatible autolo00.U0Vl1DATADATADATADATADATADATADATAad vectors%2NCluster library element %2R is not resident overlaid%2NSegment not found to address round%2N%VA%2NLibrary build not requested - ignoring option%2N%VA%2NIncompatible OTS module%2Ne"îN@RJ w +$7! -nþw "&f 0e"L@ %wD÷>Á e"ìN@RJ w EChH@ e-- $ ' -FÖ7",a(Q$ H"7`&wwA ̡ D |,((UW  &[q$W 2$ 'TITISYSYTICLOV<$ R ^<&f& v @J* J L l' VFY>P{L}000 VT3eaekH(VFY Version M0529 (ANSI)VFY -- [0,0]File ID %P,%P %X Owner [%O,%O]file ID %P,%P Summary: mult = %D. free = %D. bad = %D. Header map error I/O error reading file header - Error code %D. Bad file header %D. Lost files were found Rescan of volume to find all files with multiple allocation%NIndex indicates Bitmap indicates %N File header does not exist?TSYUPREFRIDDE0LO@DVLIRC HDAL xQzSY SYt:#zSYz( d<ww0 p  d   Z J n8&0    5   500 P : E  5 5@ d  tw6    N5B- h*U4 ) &7 "J V6L @ `ww!!  pmp!+ 05*5ww,w,- -5@xw5@lwNw  R t &E     0 6 e p 0 mp  85E JE!:w\pppm  U- ,PwHt \5\  Bd "  w,Jd*  dw5  vp  w &v D\!4wVU5 #5   beUT  aP 7 87 Z7 R7 Pv 8@]>]<d,*( 5 .  ` D BC % >d '&1 X  P   $ $, $L $P $` |, t$ lH dHj \$ T L$$ D$4 <ZB 4 ,l $lh ~ ~  ~H ~ ~ ~ $( $ 8 | r  $ L < H  # \5ew p, Bv     5Bw< 50  (r- DUt-E D  E E ܁ZL&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&f &ff  &[q &[q` $  H6 p6Z66l66~6666H66 000VVl1DATADATADATADATADATADATADATA & & @( *f  e ee e [1,3]The following files were not in any directoryFailed to open directory fileFailed to close directory fileI/O error reading directory file They have been entered in directory %VA They are still lost, could not find directory %VA Failed to enter file - Error code %D. File successfully entered as %X Error code %D. - Directory [%I] As a result, no files will be entered in %VAThe following directory entries were invalid[%I] File ID %P,%P,%P %X - %IFile not foundInvalid version numberReserved field was non-zero %D. Invalid directory entries were found %3A,%3A%VA!&!60#  jm J܇T  E  z6|  l J Jp\\p^^pVBpXDpZF.NN7 Z5 5@wx$\ j1 0 $p&6L wr Fp%hd [5b  n 6 J  Zw0 6w@  H- &R&&&eH&&& )TTTLTTT NeBL p *  Te& d* d v5@jd\ XUP 5> (!# >  ` *a 5d\ ~ 5, d) T X*1 *dI pp b <& % h "mX  P-  -  D`#+:Q , d " Jd  LR 8 2 ,ȕ RW0W9 D!  P e ѥ  Rd m& R&  m  f A N  %Failed to find INDEXF.SYS;1 in MFD - Will open index by file ID 1,1Failed to find BITMAP.SYS;1 in MFD - Will open bitmap by file ID 2,2%NConsistency check of index and bitmap on %2A%O: Listing of index on %2A%O: Read check of files on %2A%O: - Blocking factor %D. Storage control block (VBN 1 of BITMAP.SYS) is corruptedContinuing with an approximation of the size of the volumeOnly the "blocks free" value is validThe "blocks used" value is valid in the line beginning "index indicates"The "blocks free" value is valid in the line beginning "bitmap indicates" P356w7 L & T5 # # * D TwvBDH  L ( `   z7w CC e  zå~ `eBC    @> $M 5   5^J 60Jx$& k7,\67,^0U|# F 0W~ mz  J M5@Fd5( $:5%0e04E'f( 7w  @72 w&!!wR1!r    fD V EB ( 2E7 L ~LJB`w6  :5   $6 fQ 5SY7 v#   !7 L5|(5f #5L"# !# * D BD !~:  j e7 eB$& \! e      000VT3eaek Failed to open file for read check - Error code %D. Error starting at VBN %O,%P, LBN %O,%P - Error code %D. Error at VBN %O,%P, LBN %O,%P - Error code %D. File ID %P,%P %X 6x  `ˋl,,dL!# >C 8$eR # # # ll p!& T9%s ~%f 0r d N   B 6 vwD 3 4 %*1p sas &ffd  *  `e @ j  !  CbB a(d L:&5   e   Е.Е/e Е.w  Multiple allocation %O,%P Bad block number %O,%P Block is marked free %O,%P File is marked for delete I/O error writing file header - Error code %D.. blocks free, . blocks used out of %N%2A%O: has Delete this header [Y/N/Q/G]? o `5 `\ŀ *H ` @ @`e  @w eB w V&   ; = 6 ^ w0 Z w@ T  * w0^5 \5 w@@ z   4 xCaB T  dw@ B  X   S   d mp    |w 3 E E ^ H  t@wt5 M5@F $f8d f, )ĝ*ĥY!ĥyĥNĥnĥQĥqU $ĥGĥgU@"U 5mA  " d e\^ w`f D  2 f %  Е.f h&L dRPT   `A    0w Z L     & & @( :f  e ee e Get Command Line - I/O ErrorGet Command Line - Bad @ File NameGet Command Line - Max @ File Depth ExceededGet Command Line - Failed to Open @ File1!w  >75& & A&?mE @χ7pnn7lR`0 +"+"0 0 0 0 0 C"C"6 n^"^"v T}"}"( 7 7 7 7 7 w@8 7, @ nVCD CD CD    I* D@*Z* @B@7 7 *5 555 U@5@v5n!s!& h 0 b | f  @ : w b`` ` ` L,"h(% w 5 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f  P aAAf@pnp C*8֋ l88*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ ŀajTI& af* n*`V @e,w 0jjlj ɥ@@aujk,bp 5f fˇ ȕ 000%VVl1DATADATADATADATADATADATADATA‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & l8 *Zw  8jDl@ (TeBT85l@ @( D eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@   % '&  m  f A N  %f&7 7 7 P f  v%1  11 1 1 11~ & & @( ~ f  e ee e kz?TLBOPzLB  Illegal deviceOpen failure on bit mapOpen failure on temporary fileFailed to allocate space for temp fileFailed to detach deviceFailed to attach deviceCommand syntax errorI/O error on input fileI/O error on output fileIllegal switchOpen failure on listing fileOpen failure on index fileNo dynamic memory available - Partition too smallClose failure on bit mapClose failure on index fileClose failure on temporary fileClose failure on listing fileIllegal response - try againSY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VAI/O Error Code %D.QI/O Error Code %D.""""""## 6 5  5*+5U5 5   BBCU% B  2 v $5 % 7   |UfUh|&& *| Е ȕ-ȕ     k#  B"Qe85)E$ %& e eUU" & ""e e\^$% 5R  "eH 8 -- 88 "j Az# & & & & f& & & Ν )  % bU" 29# BB  8&S# f#  %nfw ^b& LB&a    W111 D K  M ?   U%    vM !D  E e@P   & SY&  & SY& p 5 %   H)000-V3V3eaekP &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e є &  m  f A N  %|x,11W  &[q$W TITISYSYSYSY0RV0,/00l SLP -- Command file checksum is %P SLP -- *DIAG*-Error in command file %X checksum + |.$5%&/      55 7 4   n 57 zEU ;**-EW**w *|.@E<E1E.E09EŠ$"EŠEŠEŠťNE E EEEŋዾ  |. Ee   7 |.7'w )E |. ť DEe7!\w R P|.T' >"a  abpd $ef  \5  X75-&  .#P}.7&`¥¥¥ ¥¥ef  d w (f `5 V?l& h&V&5@)5:5@2 5 *  @@|.& dE@` 5 qx.  55 .% % W ''R Ћ e% Bl -,v.v% " r%&50   `:-62 E ` .7 .%E  w ' E DW!!  l `h  !! A  l003VVl1DATADATADATADATADATADATADATA!h   F !%*" ~8 : 2 * w47w n )5   5 V J  *` 0e |55 ~hp5p {.B ɋW W UB 7 : |.D#E05*w UB |. Х U B B 5EeЕ  Е |. " ^ @AAŁ@<(lxPDC@@UE  E  &@AU@@U w Z#-. 7 7  -ĥ/7 $ ĥ, %#ĥ;ĭIĥ ĥ 7 ~ x r    .  @. < 45 r # ?5  z# / ZE ` 5@ 855`# B` eB$&< w !@pdf 0- B$ĵ4ĵ!%'% %E$e@ P    e e  e & ĵ V 11@ XBe w \ ?  |. P !> !   (  ` E  ,%:` j-fZ7 7  N)w F w < 6|. :BC ̋Ԥ D(7  5( 7 w p6R.# ,4":B -0 # -   w fm^ 7 X6wH  B 7 84,6w"D  ٝ 7 (% 7 &fwtp 7 h7fj @,q `-KacJE[ !m*&@  ) L R  7 f@  &  5]U E :&@E A  ̆  E vE cXV A<9 @  . &f   < .  8  " .$   ̥ZḀ90      & & @( lf  e ee e &f& v `T<0BSYVbAUgBFgCMfCSfTRfSQ fRS@fNSf,7 SLP>Z&Ip 6 U u !!7!\!s! NSY hDBfSPg &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e f** aB ¥*W W c@ %w 5 funhj uhdB$ 0jwaw< 8 v8w &  @ *AdBbAep& f   003VV3eaekP 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 Z5f fˇ ȕ v‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ bDlljaCeH###33 & 8 *(w h 8jDl@ TeBT85l@ @( D eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@SY hAUgBFgCMfCSfTRfSQ fRS@fNSf%N%1R -- *DIAG* -Open failure correction input file %XOpen failure line listing file %XOpen failure source output file %XPremature EOF correction input file %XIllegal Get Command Line error codeI/O error command input fileIndirect file open failure%N%VAIndirect command syntax error%N%VAIndirect file depth exceeded%N%VAI/O error source output file %XI/O error line listing file %XIllegal switch or filespec%N%VAIllegal filename%N%VAIllegal device name%N%VACommand syntax error%N%VAPremature EOF command input fileI/O error correction input file %XIllegal directory%N%VAI/O error command output fileIllegal error/severity code %P %P %PLine number error%N%VA%D lines truncated by audit trail%N%1R -- *FATAL* -%2N%VA%N(;,!ȁ",!;8ʆ8,8!ȁ",!"/L!"/ "І!";ʄ/.".&P"/F".."Іh."+8`"+`"̆'&1 , <1 $ <1p  *1  <1 <1h  *10 *1| *1 *1 *1$ <1, <1 *18 *1 *1@ *1D *1 *1X *1L *1< *1H5ew , Bv     5Bw* 003V5Vl1DATADATADATADATADATADATADATA#/,0-.!-.1 xD- E %     U EU |.. 5  (5(UW       wE5 E  W ͇5  ,E 1f"//@#-&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&f &  m  f A N  %&ff  &[q &[q*11 &r 1<1[q}P1 1*1E`Wd111|,((nW  &[q$W lTITISYSYSYSYOV0lZT00SYl' @ ZAP>005VV3eaekP _(|bd  ` MX|7$7" "77077& - * 7 z5x&fb x  N  p 6 wX3wm@  JEe  E Jeww7z77r7pnhXhlfTe"eN@e7 64 6.e"/  57e7X6e- w 7 7|7 ~ 7rjm^bdR Df f &f &ff , w 5 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 jjlj ɥ@@aujk,bp "5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *  w f  8jDl@ hTeBT85l@ @( D eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@wJ54 @ E7 7ffd :f 5h X R%G  3 ,  &@ N`fd f 5 eew ͇   %f  @   w(a62 vp7n v er e wVa5 Z et Ne `w fɋP7w4 @(6 vl(  e.e e   ݀f z  v06 2bE Z V REL J @e0? .&  "0  No such relocation registerAddress not within segmentNo such segmentToo many argumentsNo such internal registerUnrecognized commandNo open locationCannot be used in byte modeError in file specificationOpen failure for task image fileError on command inputI/O error on task image fileNot a task image or no task headerVerify failureNot implementedSegment table overflowv0LnZAP -- (@'&1 | t lT d0 \.b T  L8 D< <  4  ,.* $@J  , X   $ L H5ew , Bv 005VVl1DATADATADATADATADATADATADATA     5Bw 4ST50  (r- DUt-E D  E E ܁.T&wRE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff  &[q &[q`  T h |.|T @|, .AB6RO6LI6wD 7 7 7 7  # q #0 b ^`a \ L ȕ ~D@ȕ| f840#5# :R eXVPN ea a   wrw6 m  B  pbe \-``? & & Am&E722* &-  w  `R  Fw  8ww P$a e 7   %5 0 0 0 0 0 0 ewd`(  5@wX5 (XW  H  ?mp f0 0 0 w7 ,  W  5 7 77   7 ' 7 7  p 0 0 0 0 0 el-hB   T n7lZ-VL F7lD @8 27 .e2"6 6 W  5 5   C`D`0E`, ?6` v`  v`  l(˕5 7x7v > > 3@W˕5 7: > > 3@ :e  ׭q 5 AwHB  A  ?mp0 0 0  M˕5 77 > > 3@ ~e2. ׭ H0 0 0  <׭ ?wx˕5 7 > > 3@ e  ׭ 5 AwH  A  ?mp0 0 0  pe$  ׭ H0 0 0  . ׭u 5 ?e   Pe ClRN0 0 0  ׭  ?de^e,  )hf | !Xfe hHf \ 5@m,  "N 5hh( 005VV3eaek  v( L( @ N ( ( N d- N  N N N  B  ( b  @ B( N e%w  e& H' Zew)  &6E?`e 6e 5 Y m   @` ȕȕ 5@ ȕ 1 1  -xze 1 dde t1%H he>-:w R we *  [ E1 qle 1 e 1 `   ɕɕɕ5@ ɕ  ep-l$   6 % ]Le \m@?622e B11qle "1 e 1 ` ɕ 5@ ɕ  e-h   z e 77 ~Z|e H @e\e l% w. 8%e"  J % RootI-space rootD-space rootSharedI-space sharedD-space sharedI-spaceI- andD-spaceOverlayNo disk allocationNo disk allocation (I)No disk allocation (D)Null'''''''''''' ($(<(ZAP Version COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1983Segment table: @wR  5B`  wZ2/      5@         @!   &  ~ f     :w47 7  7 7 7   l#@@m@  m @`7 #  l# x7 o- \ 7l# 7\#F 7@ ### 7 "7 ^7 \D4>;8N<F0( & -R - e\## 7  eN#7 w   |# 7 f   7  mx +Ef5\T 7 L 7FW 0W 7 2 @`7&0 fɋ ɭ@ f7$ $#E l<$w\ m lV$ |t<f^ iW  5f  7 Z7 TY@ l`$bm@X67NHm(@o m*e7"5,( 77 5 7W 57w6$7 lqt J wL-R > |v 7j% b= FXEe0 6, .@E :\#wN-"(_  @N  > N f7 &eA ll$\#0 l#1-  \#0 l#"-~ |\#xl# -0^  r %w"a 4.E *5   N# l# &N# j r$% 7 7  wEm l$ ߄~ : 4: h   .p  , . L\# % $    Μ$  w l$NN N N N  LJe& " e e" 7 7 7 7 w -l#- \#  B\#  D\# :,;+-*.CQ$ACFHLMQX ^_@>e $w.- e (r T00@YV3eaekVR842. T fd`^`^ZXVTPNEL V p~# 0fF *TV rw @r  @4  f7     *  n f6     Z  P -<(&" " E6~ >wHe fH  fG w && 8#-&& FFFf    RB Ee`%  D~% b ,  . ⭇% *DIAG* *WARN* *ERROR* *FATAL* I/ODSW???= -- DDE-fְfEĥЕЕ Е Е v?d ^ P Е.Е %  `-h7be~ A Vְ& & &  &ְ& & & Ε )Fe `M f&P&N&L&J&HҰҰ&^&e\&e*+ϰ̰ F   Nf  f V eq q"9q,4&& & 00  & & & & \& & V& Ε U)O  n<& ff& Z& V& Ε ) *eq  f  hTf  TTf  @ Hf  , LB0:[1,6]SYSSCAN.TMP;1l xSYSSCAN.TMP;2zSY eBCrrU>p (f# xf @ ^ z   b f  & & @( f  e ee e &f& v  GwBȹ޹+·Wy߷5۸HUAB not found in listNo startup transaction foundExiting due to errorBad transaction length.%N block(s) of secondary pool may be lostTransaction not in secondary poolUAB listhead not zero on shutdownTransactions follow SABExitingOn scan file openOn scan file PUT$Error during scan file renameOn scan file closeOn scan file deleteCan't write transaction fileUndefined message number %D. at PC %P Directive error. $DSW=%P PC is just before %P FCS %3A error code = %B %Nfile: %2A%O:[%3A,%3A]%X Can't close transaction fileCan't init new blocksCan't init new blocks. I/O error = %BCan't write attributes. I/O error = %BCan't write attributesCan't open transaction file (by ID)('&1  l  d   T ° € ” 5ew , Bv     5Bwb 00@!YA[l1DATADATADATADATADATADATADATA8WXtf-? D- E %     U EU 5  (5(UW       wE5 E  W ͇5  ,E jX&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&  m  f A N  %&ff  &[q &[q &r [q} E`W*#:d?\?\  A@WY2SYSYSYSYTICL`"wX&``lHH````````````r1Tk&`````)`$M````!k```z.``` @`8`````````COPR. (C) DIGITAL 1983& f& :&D4ed$ ߕ?7*&D& RwE ߕ x  f&ߕnHw> 2<6ep   7 @B@0"1 C&5@<E*X7   &waZw!w:bbbbbbbbF 3&w\C& $ `PPPPP7, 6         &e$) mѕ1e !  :  jwBll00A [V3eaek Ez&f  ~xrKN 7 N^ 0 w!&7 U705@ "    ;-B %f$ $ P%     VU@wHeUE@ E7 4` v w P -< r 38B*ff,l,ZXXXQj(dXkj      @ @ <<<JRSX11Mhwv w W- e i%ffffM3 3*B@ ׆' Bچ ~bD , H` !H $ $~bD &N` bb b"p SYSTEM CRASH AT LOCATION REGISTERS R0=R1=R2=R3= R4=R5=SP=PS= SYSTEM STACK DUMP LOCATION CONTENTS ULJD7LPP.ltH  C b C $C  ,W V H Dww• 6•    B B B e0  • %tfŀ fŀ͋瀵¥ %L   $   `< . W  , $ BP  D ]@YEC%  B-55   ۇH4t B ¥@ " 5¥  5 6-P uuu ՀB Dŀ4   JBeE@f  HD< @s s!3   BN B  &5f&D lΊ L  w ' $ X5 `$  r e 5 N V   Ae  \    ԃ t < ae>@0 %TI@&  m  f A N  %Ce@Be eB 5 B@@ w&& @ &  B E eaa E! @@@P@@@P &w @"c @   B  B B B  lEU w&A@c@   @  7le7 0  . "   PmA HB2"2, ĥ 0p!  : sp J0wC C s E1q@eE@EU  Z&&A1q 5@0 0 IB:Jb ZB*p2*p*7 Z'w@H p74 5 P@ W ^ wDw4 ,3, ZB* 2**Uwb@B  f %@B Blf Nm% 0tD>e 50E0  ~e355 5 (C p l B&5 IB6  e Q6  ɕe E  5 .w ' w w ~ffvE w  ! wJw l&  %Pc T dM  G  A 4De - m K  F N r a( w w     ) B! @  5  L `; 8-,47LGa r7 l d    ť   D  B' #  00A([[l1DATADATADATADATADATADATADATA   ~w !#%')+-/13579;=?AC@6<V< @40N|ppPrRNHp`"8T(P U0& xwww t d&$e %wC F K 5^  @w D&  D * enrRs  `   2  E  # !$eBeh &F m TE$ #w w ɋwr t @&D9 33E ~l s!f@ F D de<fQ$D @    7 @*wwbݶ ݇D  4B݃ ݂ ݇  w j   `㕀  e  ~SW f&$ B  ;b8#5f(  -m N " H $ e4 K e   U 5   U@ 4 U e B & 2 Xt Sf  mf&N @55:&@`2 5& 055' BU@  m6 eN```e  U@ f @ V&f& e&  <&f( *&f   w@ 5ew &f @5& & ׬ & v  TTT&& r&  T- /Ae e 0 0!00  h  w ε5-P @ 8T% $  l"d ! ` w V @ wTA5 EK0 wwweB&  H E5 A  r &  E& && & & & && 5 6 & & 5  VE" "Q  (0(5  & & @B  -6@B Bm -$4@2 l t U 5@ EE "  e  >55  5 A2B, A 5  Tcc ~@ 5Z$ 5  5 LU- U@ e @ e f5  f : 5  5 @,A1. e2 5 b@ wb骉" RB  0  0@wU  0 @ |SS 0 P  W  W eXAaeU4twXee " " E@  z,,5   E 20 W r  r  `!E @e2 ra!a e dE2eN!E $  `  !f 4  $ 0`   0GE M{s$i, !L"! Rsn      51 % y wp 5  & B  3 @P3  4e Jbbb % N\ Ur C 55@  wwJw F@ D   <5 *5`H5 5 >  6 5F15-55< p #w% r 5@ w     wp   l @ dwy wy\ % @mwJ$& ʕ uw J +55`5`u  @l e% 1 hOq 5@ q er r Mq 5E@ @2 4Jwrq r r  @4GM IE$C,G#$~%$ 00A0[V3eaeks## #1$  %#  ##5RUE w*  UB @P3  4eJbb  )wJw 4@  # &D 5   D   =   #3#5#4 rM#w(5  Am vw|  P%&'& Ns%%UL w@  B  e . D ( @P3s(@@-5  4 dE 5%w f JGeA  Jbbw Z@ D%‡ $ sX,((EuE?e@3 wf5E % fN 5 %5 5@  l55   %w  Zw w n   fvʋ  %  EUH%4J E?E? &E E@E@ U UrKO MUW$Y, 0x()*) rsT(     X(51 %d(Q w eV( \ J  3e 4B 3@ @P35   4e @ bb  ʋ A 55@  w2WO  WM@ww N@ C  5E@ D   V C @ @ 5 ( W( w / 555V 5?  ,w)   %k(l( w5 wF     V(  u 3W(  AA w5@ w5(55  N 0K 4wD5 Q  V(w.V( @mwl%wb uw u  rrrw 55`5`u BW(W( l(l(W( B $2M wwLW(c(l(&& ʋf U V(w. @mE5 5`u  5`w^ @l e% 1  ` F  Dw&  & %   "   E$C,G-v.&/x. `sh- l-1$  %-5RUE wNj- B߂ B d 3 P@ @P3  4 0eJbbb N 5 5w $ 55Jw |@ D E@ 4 D  9k-  j-55 k-4 ZU w   Am . wd  r  j-ɖɖr` ` d   a2 a2 GE M]li,y|qtyq{s$}Tu\ud/n1~2p1 sd/sh/1       $/f/ l51 %/w| @%/=U%/7U@3y wDf/   % !f& Nes & N  UCe@B U  4e Jbbb 5 2h/r C 55@  w>wR5 ʕ N\Jw @ 4D  5 "5 "Uʕ N\ @mE > w5E tH58  G5@ > w5`A 5".53 5F.5@"  5455w05"5    P   f/   l @ >w&wxy\" % @m%$& zʕ uw J   J"5@ ,j/l/Ug/5 ej/%p/j/3f/w g/wVg/j/j/ @4ʕG& N B B  & N 03BPt/5  te7ve00A8[[l1DATADATADATADATADATADATADATA  w55`5`u @l& :e# 1   5 y ;[q ;U@ ;YW ;UU G` CY9[ Y9[@Pp66666775566V6(;;";|;;;;99996D9ؖضȅ""""::::D999:L::L:D9D9f9:L9:D9999999D9:5878 js44@ 344 e 4w4 "@"3 4 4 4 x43 4f#5@  E@ [#e"5 % 44W w\5 $E@ E E7u] Gw v E E7u] E A w%'5@ !"AeI I I I " qmqewu#@U5 EU5 UU345 45 Fr 4 @r" 2 2 r4EC ߕ"r U  w55 5 5 5 U E U 4 r 44 5  w U wB  dU w,,w `@ D4 BA"5 U E0 5@5@ y55 $E55 5@@ lw @<*5 55 y^5wf5 5 U 2 555 w 5 U y5E 54U % 44wV5 U 5 5  "wyD55 U@   ! 5 @3`44$Al4 5 5 5@   AA w.wA"4s"4s4s4"yD55!y5:5[5 ,4e155 4"44wE @ 5 5" E 5 U 05 ,,5 $wu U Al5 U 5 U E@  E  (w5N% 5 U  r NE% 5 U 5 5 U E 5 U 5 U f  f   Jсq "q 6сq q" CrAE@G@O@`A@I@ I@@Pp=?>? s<V@"4 <@ 3<@ <%DU@<1 E e =w43 <5 ҋw21q5 u1 wD 5@ 1 w25 1 Uu5 s<3 < EW,~5 G5@ r< < < ,oA 5UU`55 5E 5E@w E 55 < 2  ^$<4 JE@5 E 5 5@ʕ<5  Uw5@5"  U@  r  E%3 2 >U ^Z ^U  Dw"* ^Ce E    0 U@5#wE_}U E @$U+00A@[V3eaek 1e8e0ew$5E  HDw5K5x  ;5   < U55 0 * '5 U A5 B@ w5? AΥ Υ )Υ (Υ *Υ HΜU w$U5 &  eaCEe3e e +(E5 e3 Ez a5 E ΋† 5 w Ce5@a ŀ4 wf˕6 _B R @ (T nΥ  BE U 9 Υ ΋ U >f*5*E u 8ԇՀ 5eΥ PC  ŁΥΥ, Ξ59UΕ\e wBΥ \CEsΥΥ}ΥUWCΥ U5xwU E5EB5@p 5. UE.T n PCe%PPE zCG.HHw ` t4ww`5. 4U@,U.w `t& e5`EΥΥ ΥwU EΜEwxEU sGU@DCe ILLLPNXNNNORP^PfP bQJ bQJ@ bQJjQJPbK`PnKPJ PJ@PHKPPZKpPHK jQJ (sI3 I3 I3I UI02 -5 ) :I@ 5UIEUIE e%Id IzUIAe EB BsIe r2 2er2 w.W- (5 @III5@ TI(IIIHusI 5@  w5 %3 IEU@IU5 U IE E=u] UIU U I5 IREW E W 5 UR5RJ J4ߕ ʋIUI U IKI,UI5I5@I 5 I5 IUI5  wʋ  E I{I 45I  IIw%LI;II3 I3 I I ILIU@I  ʿ 5 E@II II I I ww ޴@ 5IEI ~DI2 E#J#G'5 #5 5 5#, #  ,IU 5 E E%5U 3I5 I E- 5U 5U 5U 5U 5@U E I y*I5IQEI3 IE% I   %!Iwf5 ʥʥʥ"555I5 w55 {Iw\ I E%% 55I4E I  5 !UI@I 5  I IIh I`b IZIIOIIIII II13 I 8eII  5IIIII I I IEI IIw|Iw< ^PIU I 45 5 A _ IE T5 LPI !5=5@I#5 ;IQI  IIE U@  0QI I5 ,IIIII5 A EI xwF5I#f I   4q "q " q q" RQDB QQH2JRbR&RDB R&RH2JRJR+RRDK#bRRHRRRDK#RRHRR$4SSDL%RSHPvSSRSDL%4SRSHPvSvSSSDMn(SSHi T$TSDMn(SSHi T00AH[[l1DATADATADATADATADATADATADATA T" `TBTDP-$TBTH8TT~TDP-`T~TH8T T0TTDR/TTH`8UPUUDR/TUH`8U8UUnUDUTʠ?8pkPUnUH:VUZVUDUTʠ?8pkUUH:VV::VhKgVxVMU$x0kZVxV@V:V,@ Kg&WVMM(x5xVV@WW6 WDWMSD"Ix&WDW@WfWW%RXWMT =xWW@WW4xX0XTT0HX0XH`X`X pXXTI xXXXXCO X0XXXCL X0XXXLB XQXSY XQ RSX-11M/RSX-11M-PLUS Standalone Copy System V03 АPP0֦ PRSe  * w X7 z e e j-fw^Xҫ `7ƫb<L f777 <2`@h%`X`VvvM0XmvMrPwxA@7XR i8eddkdd>dPdd,j d(tdDdDdd"'dXXXXPd?d2eFePeF,Pdj>ndPdd,j d(td6DdDdd"'dXXXXPd?d2eFePeF,Pdj>nevfh2(gf2,PejU(g(f|f|fz$Xzzrg$gXXXXXXf?|fUTX$22g6gX$@2uXfUUffbgAhtgA,fjh(ghghgiz~zzghXXXXXXtgxhga~'A'h"hi$@A uXtgngngNhdh`hd,tgjJh(hThThjfPhhX`hThJI| qd q|hhd$PdtX`hJJZhZh&i2i8i2,`hj}@i(\i_ ,i,iz~ziiXXXXXX8i,i@?~2ii(g$P2tX8i@@2i2ijj$j,8ijE8j(Hjjjf ʠjjX$jj87|QQ|jjh$RtX$j88jjj,$jjE; k k_ @  D:dk 8ZV0Nk_ @ :d0kkAPU0kj:dpkkyk kkKg_kkkkR%kk8d8e00AX[[l1DATADATADATADATADATADATADATA00A`[V3eaek00Ah[[l1DATADATADATADATADATADATADATA00Ap[V3eaekzĠDĔ<Îjt4>,~~~rvR<<<<B6v¶<<<<&& e2 *(7 (@ Il,& "@ Il. 1@ W,    <&UD 5G  w <z ,܁1 1 7 8 '@E3` @E    h&e2 *(2&ۇf1 U er $"r  @l s2 U  " (&2ۀe    e Հ   K KՀ2  Z  e  S  tՀl w:4 w"4 w J&,<0 FKU  .<0 S  0  mA m v w7 < `p1  e0 2  5@UUIe & 55w*0Z_!"ޤP!@ !! "ޤ"ޤ`"ؤ`ЦH/ܥH /Ԡ:xDw5A5 500Ax[[l1DATADATADATADATADATADATADATAw,e D   `4 5 5 U@w w^5Ew wsҠ  * v b B@Z 5@UUIe & 55w5w5w 5w5@wH @wpEEw C @ E%%  5 zE?~UeAf& l w tՀe " jlEC  e ef1  &0U@Z @E5  X7 0 Ut  h V a,,5   w7 U *  1 1   6r@ E wPE$UtC& 5@  tՀfZ UIU& t vrEs1 q15 U P& 53& %&e `B  5  U@5 U w .U      E  J  & @e$f rif w5@ w`wPU  zU  6& > R  % % E& w& Uwz5 w    @0 "& w wl    @  eQPQR%I*ew wr e g3 4ŀՀtŀ <_!V"0PJ$ҥ % @% % ` pX@ l ҥҥ@!PΧ  h00A[V3eaekDw5A%P , ` ,,  U5U vD   ^`4 5w 5Etw wzs  \ H x7 He%  @7 ) 7 D v .  1 E 1@ơ  & p 5E EB@ 5@UUIe Z T55w\5w5w5wf5w @wpEEw C  5 E?~UeAf& l F w tՀe  E5  7@ 0 6Ut  h a,,5   w7 U 6 1 1   jr@ E wE$UtC& 5@  tՀf UIU& " $ Es1 q1E 5 U  ,  5@    wp xU      E 6@ E%E0 %E@ f w5@ w U   H E & w B U   % 1 % E0 U & wp5 wj5  ^U  N&f& "w w 5@  w U 1  U 1  U 1 1  " U@ E0 f   w w 5@  wf nU 1 U 1  U 1 1  ,  U@ E0 fw w@ "e Lg3 4ŀՀtԠŀ aՀC3A E tx5 "5  NU  >&f& w& <eH  AAŀՀt44ŀ4  bf w aD @E ! E c U fA E%% U E0 @EW e e  C  q  Fw H e EwU E 1 E 111q1 wj w5EU \z ^ XEu u"@ E 5@UUE@ ~f E% EX E  5 U 5 U 5 U 5 U%U &, @, pN wvEwX we &f&  w5EP xtU 55U 5U E@ EUU, @, pfA %#%E& wZEw< w(e$ Z  s@$ ZfXW,MUBCEE C3!Cl Af$5%MUED-f lΊ 7 Df50wU4 pwFE @3 E1    s,s, "w f ʠBdXj87|Q Ơ[qsu~nLqUq >Q  T6wVf׭ 7 :de n,dwbwt@E0 7bc2>P5 F$P WaWz SW WW w ($ D  <  0 5 W W   wJ e  w%] ) R1%& D7Е : Е Е-Е-Е  00A[[l1DATADATADATADATADATADATADATA7 wB S/  ڢ@ 5 ڢ\ 1 ̢ qҢ& ilE J Е: 3 W +s:&a"rr􂄜l v|a     & & .  & ɋ=     f a-aawPra`` -``7 ` ` r  #  nS dS7 k7   V x OS =H ` CK 9%TI+@%TI%0 5@ !5 A@  t 8 ,2&D 55 &f&@  2eMt h h% hDe  &i@ w`TSMHRSIUIC  5 5  8`5D 1$ [// ~09 l%fN :EAC ~ ? @ :8 6 0 ~1u ~ݦ t"!e H  [ 8u¥, (u¥]wD " t .U M Ԧ ԦA٦  7 @E  H@@]   zV@wNfdw6 Nw*(w"u \      u`u 5`Ce ]   l%  u`u 5` #\\  x l5ArpU g  7 [  t4& f  & &cv c6`NA B  u 5 BA u5P 4 X]:://>J&zQQAA wL^Y;; c [d5 7   :/U9Ġ` FU , ¥ = ߕʠ=twZ[[Z5ZĠ? ߕZZZ6 Z̋ӕ AMu @ӕ-A A< ӕ- "> U U @ Dae0e0S   5 w 6T S (̋:w (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA \`EAa$  *  + 23E Ew    Е-   0@A _W e`fÊ    E  w v ť ť 0B _Aa & & @( j_f  e ee e &f z~zVxXXXXXXj@?~  zPDB!؇DK$ևDL&DM)DPz.DRr1 DU:MM8ևMSMևMT @ևMU:f RSX-11M/RSX-11M-PLUS Standalone Configuration and Disk Sizing Program Valid switches are: /CSR=nnnnnn to change the default device CSR /VEC=nnn to change the default device vector /FOR=n to change the default magtape formatter number /DEV to list all default device CSR and vectors ) Device CSR Vector CSR Statu00A[V3eaeksƄ) ------ ------ ------ ---------- Invalid device Device not in system") Only one device of this type is allowedP Input I/O errorf Input line too long Enter first device:  Enter second device:  Syntax errorȅ Invalid CSRڅ Invalid vector Invalid formatter number  Waiting for UDA to initialize0< Hit RETURN and enter date and time as 'TIM HH:MM MM/DD/YY'p FOR=Not Presentb  7 |  , j ֆ,w3 z7 p  p1 twfw^$ l":4/*3WaWz ыwRbwLw 7 h `7X7TԇߕЇ7 "|  X      N 2 V   `        "! a  rE55 ww @2ʋ55  i 5   @U 55 ( 5 @ @ ɖ5  q z7 PEDA@A    w7 7 -$ w77Q-w- -w~xn%MMdbwNwJ(  h F . 2( ąw 5  %:w`p 2օw%MM -www „ Q,W,MU OD7ZЕ PP%MM r B | Е  T ^Е   DЕ x  8} 07z e lwf   *  + 23E Ew    Е-   0@A W e`fÊ    E 7 &fw 7 7 @,q `-KacJE[ !m@  ) L R  j7j f@  &  5]U E( :&@E A  ̆  E vE c  @  . &fd  6 :  8  " .$ B  8̥ZḀ90     DEVCSRVECFORjnrv/܊҂҂:/Žʎ=†:=†j=†&f &  m  f A N  %w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C &ff fPBdXjJI| q 00A[[l1DATADATADATADATADATADATADATA 7 7 7 7 7 7 \e e@ wwww ] f [wZjwZ7Y7W7T R  Jީ */w  (&   U  Fw d w 1 L w| R wn5 t-5@ xwF55U5^ awDE`]N \Z  w;< R ,( 2 a  w(    n w8 f׭wZ RwLU vEpU@jE]^$   w7>  b|m^86]5 -L@-F:  (_m.@ RS   5 &rb nhw (w B̬ _XU"  Z  0 f " 7 w>3&&R  5@0ƭ | 5 'lW xq tqeE8  &fN<6 <B : B "m,A m$eA w7$Wp>U&   `w &f ݨ R ~ `D p :`Hw B  p(l hd77 7(7&f <& b 5 - - 7 U5 wB w  mA meA S FFB2t2p.e(w "&f& (7*7 V7 T 0" 0w `;W 8 < x`U5 CE- -F D  A  xpelw f  eRw L&f&>8v n  6 `@ S  &0PHP@PJPKP H &f m 1 5 $!m pU &- - 7 U % 5 `h (ƱEV,R$ 5(` &  6&   `@ ` B   & A @    z~zzVxXXXXXXjxa~'00A[V3eaek7 7 7 7 7y 7v 7o 7l c j 7g 8Xf` w" " w2 w0 ы T 5wQ7QwQT- e w  -hQ-dQ$RRRRRFQ @QR TE 6 V T  Tlgl  zT  TiY\e.2+ r7 P7 P7 P%DU" T $R%DU S;7 .pP LSEdPT V S S 7|PT w>)} wB$OwOT%pj^V7Q(7"H$  O%DB%d7  mЕ.Ow~O@Oj T5 5 uЋ f%T" Pf tni FMT -- Syntax errorDevice does not support formattingDevice not in systemFailed to attach device Start formattingDevice offlineUnrecoverable error - Device write lockedDevice not ready Start verification Operation complete Device driver missing Entering manual modeCylinder = Track = Sector = Manufacturer's Bad Sector File corruptDisk is an alignment cartridgeFatal hardware errorFailed to read Manufacturer's Bad Sector FilePrivilege violation ** WARNING - Data will be lost on : ** FMT>Invalid value for the DENSITY switchFailed to format -- volume has been alteredMedia format error -- volume has been alteredVerify Operation of FMT failedInvalid OperationParity error on deviceBad Block on deviceCommand I/O errorCommand too long Continue? [Y OR N]: Response out of rangeMarked bad in Manufacturer's Bad Sector File Error reading dataBlock = Header compare error Error writing header Error reading header Error writing data Start badblock utilityBAD :/LI/OVRUnable to run badblock utilityError limit exceededDisplacement = No track descriptor foundInvalid switchError setting diskette densitySkip displacement = ECC position = Error reading track descriptor recordError writing track descriptor recordTrack descriptor record: Manual defect information: Unable to read any Skip Sector FileSkip Sector File is corrupt, reading nextMarked defect in Skip Sector File ** WARNING - Error rate may increase**WLT switch missingbZ&"  dL ^LЕ " zH KEHTwgwx)00A[[l1DATADATADATADATADATADATADATA00A[V3eaek00A[[l1DATADATADATADATADATADATADATA00A[V3eaek00A[[l1DATADATADATADATADATADATADATA  \T  |  DK \DB6kDB2/6kDMi ]DM/ ]DR`7 kDR/ fDR7 kDRD/" lnDRav 2 lnDL( `DLP `DYnDYnDYnDP@ VoDP8 VoDUp??L , x z   b &7v   %L %, % %DMx Q@ rT f ~%DRJ5 J  h^RVT  W VTѝɝ  ,䴱Q  \Е.Qw: 0@` m$@ 76w4%DL%DYt" Dw |w 2w lw Q w Tw R j " ȥ#  ‹>7 7 h " wzД&  m %$ 7 ̳ ,3" " az Ћ w,(V FV.Vx:Vp %DKh%DP`  7 H 7 7!B'1<ZR ew d 4 0 ( 0ZR     Ϋ7 7 7 nQ$W"CE f%w@B  z-%7   -x -n-h7 ` Z-V НıН ݼ wJ?:ZR" PPPP "   ew %ZRP ̩ew  63" " ɋɥ ɥ ɥ ѕ 7 $ݰw 0v" Tv7 ʰ x  T ww 2~*w7 t"lO7I%DYR>%DLJ:%DUB6*%DM4%DR,+%DU$'%DY%DU%DY7﯇﯇诇᯷̯' wh%DUƯY%DU` VP%DM%DR%DLqiw%$ T N"  ȧ 5 ~wf & T  - ׆ N "   " Z X @Je@ D b    -" b  ` 7 $ p  ,? /)m:w $"   R" L 5Pw.   ۆѭ˭T N 7 D" ,N6A R  "-7  "  5w  e " , ҥ   e7 Z" A  R       h ~-` 7 %"7 67 47 2" 2 d ."     Z䆇T ]U@@E@P -T7 ^RVT& D aae" EPCDU -~7 v  w  7h " R-P J^RVT W VTɝьѝѝIѝ e w   B /1 @/ 00A[V3eaek7`  @`  `  ܤ` p7 " d m " 7 n  6-27 * " ( FA~ 5w`  ewm ~  ->  j7  " m z" 7  < p X tb ^pD b, < `[6 "6"472m*, 7!$ e wm | " b,6 # 5-5-5- &f  &#mm ew -lbw `  >rm-8B$$EU^RVT EP-`f U -U m7? ` 7 7 7 " w m ^RVT MUu : | 8 b^ ݆CZtXpT`` 8 eT7 D" <  " " -7 " dZ_T 5w6 , ewm T   - ߟh b ,j7 b "  <"  :6   |" x b, h^cX "F><7:m24 7!, ewm < T" b, #5-  5-5-&f mm DeXwR -,"w x /}- U h U^RVT EP0 0 m$7% " w  bR%Ux淔r5 5  & h $ ԝThe RP07 is not supported at this time Dn  ʖ7 w H ,P ' " ?-V7 w7 7 $  6  w" E   r  d " U$  0 " , " &  wƕx  e we <҆   " " ewe ( F"   ` "1,1, ee Vejwd 鴆 4  ]*m& <The RA80 is not supported at this time jp b  .64& & & & f&&  & ΕH ,,wswrjwbК&wR~wBw:7 ԓ7 _ 7 7 "  8 &  e B Twę7TQ$HTw swTw~~wnܙ00A[[l1DATADATADATADATADATADATADATAOw^̙wNw>w. @w    *  + 23E Ew N   Е-   0@A LW e`fÊ    E w ' UD$BA 8&( U BQ \Е*  w  ť ť 0B Aa&37 &fw 7 7 @,q `-KacJE[ !m@  ) L R  j7j f@  &  5]U E( :&@E A  ̆  E vE c  @  . &fu  Z ^  8  " .$ B  8̥ZḀ90     VEVERIFYNOVENOVERIFYMANMANUALOVRDENSDENSITYWLTERLBADVEVERIFYDOUBLEHIGHSINGLELOWuuuuuuuuuvv vvvvv$v+v҂[҂[[hv:[/vvvvvvvvv ww-v@vwvv[lv[lv[lv[lv=[lv[lv\lv\lv‚\:‚$\:‚,\:†4\lvYH\lvX\lv=̆f\lv=̆\lv&f &  m  f A N  %&   `@ ` B   & A @    w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C &ff z$XzzrVxXXXXXXj?UTX$X~ \  hg 7 F 524 5D    @   @5lwl      7 |7 8 q 7 --]--3 l" ` Z ^4  Z  > B4 5&UE * |- :-0  ` 5 |5EU7 7 h4 v4 5@   a 5@ 5ډUxvpw*0  0 7 d7 7 , 7 n X567  U, > '  4  )4 E5 x> > >4 7 4 7 55 .S '  p4  (4  Z4 5 (7 HB4 ~7 ~ n5` 5\w5@H4 ~4 8 D&w ?wx7v5 5 7  7 -- g De@ w R~L~r~4 T~4 f F~ R~ *~e "~4~R$݉ } ^|B } ~ ! 54-F`-<V }4  }4 7 7 }4 }4 w~eeW-$w- w- w- Ae ww`ww 7 5׉ |v e 4 FUD| H{ || " 7 7 wx wZ00A[V3eaekXT.$3D)^B8XXKrIOO&ee5R 5Hw =52W P3 & & ff& && Ε& &̋ )&V  Ve && & ff& && Ε & 04  & & ff& && Ε &D& & & & & & & && Ε )e5#~ 5W P ! & & ff& && Ε &e 04    Up!  f&ȋ )>ȋ00A[[l1DATADATADATADATADATADATADATA/ ȕ# 5U5# 5 5U ȋ   &V LމU   :UމU   5v5l"މ 5Z߉ e @E  5$57ɉDw-w- w- 558ȉ,w-w- 556ʉAe w`w 5܉ ̋ )̋! ̋ )̋U0!& & & & & f& && Εf & & & & & f& && Εf  & & & & & & & && Εf & & & & & & & && Εf` 2h  f  4 e tCw f&f<  [ M:5}v Mv : Mv :5h  / v M /\v -Vv ՋU@  6-: PMW delN   5"C$ W A $e$ $<$<6wvIe JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC .M@    e  T T T T H1CdT T L $)dL t dL d  m  74Onqq LmO r "1,45EE@"5EE@@PU@5E@5U5@5- N|NvN nN7 /^NHNTN PN@NHNDNw 4N "1,&&&("DY~p "DU p p p7M Hp MH"5 U5@ 5@U@ zMerM lMhM^M^V  0M &M0M R 5f  Mҕ UJ-LcLc GE ,5 (U ) "$ XXX -- COMMAND I/O ERROR XXX -- COMMAND TOO LONG7 & .      ls  d`-, "7Z4& & &  f&& "& Ε *%" ``&az ׭(" #  & & &  f&& & & Ε  ~ -x fwF  DSC> LBN(S)=DMi DM DL( DLP DR` DRa 2(DR DR_ .5   w   |zf!DU0 & & & & ff& && Ε&` &̋ )̋UX!$ !  Pe W#5 *   D%U!4  #̉  &6    Ή # ewwww   V5 `%5 V%w&> U4!&4 eB   ̉]5@U@D De 5 ,8 [7.*E  ` C r[Bm@  ~Ή<]e!Їx4 4,   %67 2 $ pqr C5f`A  ZeBB  ZU ZB ZUw-w#r\ GN`v 6`," -#(vv," -#Nv( e$w![3M uweއDD7 7 D|Dxf n b ZT  Y5   -f7 &C`BB  4  `Y Dj500A[V3eaekE@a. 1 D  5 v  t nߚ 2 w @ @a4 w^Z $fZ JZ   BACKUP @ ~?Е:  X  e  @ Е. ?Е; 8?AePD  R@ EҝERҝҝ j2\ ~ d e  ee ee eѝ@ѝ;6     PUKCABX J1 Xt`Zt \4`\X4 X4 5X4  w(X XzXP  P     LXwZw\RX "w7ݡ&f6Xȋҕ-ҕ-ȋ ҕ ҕ:ҕ:W  +W4  IE W- Jwwjx5Ww4wTHwV>wX:wFB->dDe J 5TW h  5,  ݲ5lȋ $WeE  W RU:E2VeV . /  74e . V eV xGW-W-W- w-  CCHBp7G6V   &  @@]   !EeB  4 W- W- W- 0sssswfwȋ 55 Be    5Е  ZU NU  8Ueȕ(Ue[ȕUe  X:TeЕ Be Be $PTeJPPPlTTeT@lT0  lT>e\8`Sehلe4w 24  # 5SeF  r f -D-6ىedtSeAR  8,  p  4  +"Se SeFM`wW#d ^* 5*4ufR 4 Re:D   eB # 7 x ) >ff <+ 'RReZʕ77:ReV (Re:M 4  r*   ReVׁQe:M Q Qe  5Qe: (7 zQ  F&@Q 4 4 8Q 7 l4  mPvu ABP BCmB P GePM 70 &&  Z= 4 e P >=4 W PW#EOW-F1'5@v5p4 w5`- 5L-r x̕%W-V14 P ÉW PW#EOW-V2E4 5@ 5EwV 55@ w 5 e  M7   e M7 &&5F9ȕ05& Oו G9ȕ0  l, ‰wH55   2w5@w51&&-Zd#ӸӴx|t7 *E^, %"ddE?:X PFLBӄӀ86PN62.*MezMedM4 rM4 ىw 4 wP &5~  4  ( ÉP 5:0 L( B4 P 5  4   ̋ 55!߉E4 NL e :    ډU| x-&&UT  L-r>w‰ ) K4 K HDTR1Pf00 HDR2 ^ "4 &&X 7777777777 ФРАЌ.*.*tp5H5@< 7 E400A[[l1DATADATADATADATADATADATADATA< Z"5 5@7  X"EJ4 J4 7 wÉW P C($  0 EϷ e  H7  && (5d  r 9ȕ0 4P 8 +HDlR1hO9ȕ0 fЕ0 P( HDR2P  lU!U& EOEO> F1F20 V1V2"EE|g .7 P( ^P R   ! 7* E5@ w -. 4- "vH  F  4 7 7e &Y&&e C͂ B Z %5zD  u`u 5`& 4  چ  lj v  w`>w P7 @E:6z>2  - 2, =W AxaɋU =eBCD r=== .& & & & f=& & & Ε -f7 ^ȱU U.!. rn F>B-ȇ45&0 De<UU5  e5 W   U55 l lh5| X X 5 . ZTɇ d  5$  ɇ "ɇ    x   5   ̋4Ns# B Օ%ՕN L>eՔ  L> Ք  L>Ք 8 L>eՔ F>Ք Օ%ՕN L>e Ք \>e K\>Ք F>Ք  L>eՔ  &f D Dae  ae4 W fՊcB &VP̊̊ff&f @e    : 64  f&&e Cǂ B , ) v  w`w v ?p`  4  E`f     Un JE^Ƈ77h&&f$$ ? ? ?÷ @ R  @A W ~ЋP  P|z7 ÷ 7 7 BT@eV@e  w-w# A-B#ABCeD!W  Uxerwpw l. > f > = - v > mс  B @   B  e ,%-   p t  `· Z‡f   B `eBE  NՎ e@ &f  D aeDE  @  U% # `BECeB N`v @EN% 6 % @` %  7 8B ~< eA w pb  mt ReE  \ 0  @  膇BCUG   Â7  wG  x;7w   CeB  :;Cb`f^ @ Fe% I P( -  0  P  @U⿇ppqqr<4  x<4 ee L ЇX<4 R 58& H xU" 0 ,4  f&&e  C B V %5ЫD fu`u 5`& 4  ׆  lj v  w`w v v$   tE`f dTVPR  |  u`u 5` 4  ҉ w`6w 47`0% T%  ̪ʪȪ P U&&<%4 0% 5l5bA5TbW-5@X$eZ7d7bwX$ 55 B5W- 55FwDwکw ֩w ҩe 5Ew2 55F4 U2$4 @$4 w7 4$ w75Z"ER7 "7 |xR7 PT&& FXBT x 7 ިP 5  pl 0 Z# 455.j]W-eW-U-jP-d L-^ Hewr @ V7P8" wV7T5mFXw Vm>PE n mHw Fm@ P  5U4 w55.5  |7 d)& & & & & & & && ΕP 7<d    5  qU5$5     UڦUԦ 5 '5 ؉ۉ)& & & & f& && Ε  #    5b-  5L-v F  @ F w&  )w ԣ %7l7hUUĥ#   e ` eFBeAA  nBj DU LePPJ @eA  2m2 , $B L4 44 ! $KsSeK Ke"(ܢ0$U%Ks 0 0  f B rt4 <&N EeA w ` X/%!CBPd@ d4 t d@ d@-A-ew!܇ > &mB  < 7 ʡ ġ 5  mB  0;&fzf zf z e _vߋt ***THIS VOLUME DOES NOT CONTAIN A HARDWARE BOOTABLE SYSTEM *** <w $&ff=elC    5p   d     A &@d &@ |&m ZM NM` BM`5u  . @ @ e@ M`u 5`BW @ `u  #;eu o efA eS S S fB CeS S S A eS S S gB ee -w- ;h L " E`f mBe?E?D!CE?      & YL S` E`Sa RBN7 d<*6 e P _ P  e@ A00A\V3eaekP  5 wW 55   *  + 23E Ew    Е-   0@A W e`fÊ    E  w  ť ť 0B <Aa & & @( f  e ee e &3&f& v 7 X&fwB> 7 6748 @,q `-KacJE[ !m@  ) L R  7 f@  &  5]U E~ :r&@E A ^V ̆  E vE c&$   @  . &fm     8  " .$  ̥ZḀ90     w ' UD$BA v&( U BQ Е* DSC>ABDEFIMNOPQRSTUXYZ<>=MXd^)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA B C ed!  aeNb A  Е%̥V P Е Bf n & ePB& e<;& eh6Hŀ ȕ  nЕ Ћ  Е Е & e & eЕ A %& eA d Е Е A FA   $Е. . AЕ; `    A &EA  HE 6Dw 4D&& bЕ- eaePPPЕ-$w D  &Е. ce  Е:   B P( ( (   @ @ @ @  P( P(RWDENSAPBADVECMPBL800160062501600MANOVRNOAUTOhqkqpqsqwqzq~qqqqqqqq ȁq=.ȁqʄ҂F҂F\qb:,q/ rd r> / r>  r6r rTr@ r rtr=A&A AAA?????@@@:A@???????@@@@?:A:A&A??@AA@"@@@&A?&A?A~?~?~?~??      x 00A0\V3eaek       <  X%N%VA%VR on %VA%O:%VA%D%N [%R,%R] %X Tape %M Disk %M . Press "RETURN" when done%NFile ID %P LBN %T.%N%NFile ID %P,%P LBN %T.%N File ID %P%NFile ID %P,%P VBN %T.%N%NFile ID %P,%P "BRU -- *FATAL* -- BRU -- *WARNING* -- BRU - I/O error code w $7 P D7  54E 545 "XPE.<"8%$  "E 6U"VU x7 &7 6   CCCC 7 ! ( " ! !&" !  C -" ѕ"D w5 $ 6"5 ?" Z!00A8\\l1DATADATADATADATADATADATADATA7 z p!"^Ҝ7 R! ,! HB!)" !7 * ("2" 7    ! " " 7 -ߋH"P Е Е 70 L"H7B!" ! ` 7 xw0 z njh " Z%P L FB}"6f"! 7 7 7 wN05zw B%E (7 PJއД  D  ( . W   " WAɥZы  &fRʋ  ҋ% BOTBPIEOTIDINDEXF.SYSIOMFDOPENUFDVBN,9^w~W`z}K# v_RuL`;Jm9ahw~WJm9a)&pt!w:<% N t!w:<0  \C^(}""` \C^K(KTl~C;Qd_spox# v_RBx@}[MDv}[MDv`ԅ}[MDlr}[MD"h)""`YyHq&o~x%e}&i'XmnL9v<I qZI9r<R qZI9r<W8 kM}X:""`8|X88? }WLH!8?}Ѕ`z;rz`uqE_sp{DvWoLYZa\gIv,{Dlr{DqE_spmy&mnL9XkLe \C^vat!^t!^UNEX"` H}`' X""`K"w:K""`K"w:N`:w:""`Iqv+a \C^v""`Iqv+ &""`Iqv+ &2! =rp_sp""`uL`;# #t!w:vK%K/ \C^K&Hl"Iq_sp&Hl"ZI9r&IIquqE_sp&I} uHZZ ^K&I!s!NJ"""`&I4K`H fwL&M 'K@&N`' X2l*"h)""`2""`e4B[MDlre4B[MD"h)""`e4B[MDqE_sp,:Y Kw^z`)&pt:#&Hl"Iq_spt:#&WqE_spt:#vv,y:i~LQt99#"v8Wp`8;8}@:`8tvp`8:`vLT`fM+:`M sZL"K69#"_a\gUN@:" ""`:)e j)R:)!y;:)r}:)5OpMvQ1ZqQ`&Iv`ԅ4REplr4R""`R6x+_WSZSZE~pWE} uH,]a w!@~Y \C^(}&FaY&8"' XY% mnL9|X8v +-LqZZ ^Exss:`L;!@~Q]:FQ%:va\gxxge!X[qj@5aYs:)h;?WL 2@pm}%:dF%:lvKq`?}U67 >7 <7 : 7*%%cc7       7  Dm|ܒ|܎vz7  % xe@J "f,` ^@ 5V 5x 5x F E` e 5 J5 w5@p `n Pj5!5  b   Pe41UH ܸ E@܇  e  R$ R$ ̉ P5n 0D2  w(5@ w w $b5 r | 4 4  4p7 55 .5 e)n e R$ 5^R$ ̉Հ5<  Ї5X EPEH 58 E0  > 57~7rn7  00A@\V3eaek & )7Vұw 7 Ҁ   llC  4+le  DE a@ e ѱw 4`t  px&4e "Zѱ2Ή[ w0w,  "C C`"e 4AE@ w` 0 )e  ח,  , ,  e ww &f& f R@ee . " ee    e 11+e  e5- - 585l7 ϡ5 Z  5<25U0& 5U(5UP 5 UHx Uև* ^5U@%H#%p- e%5@ ϡ52  % % % wM%w#z@%w-l8    U2% % % K-s-s-% s-  %  s-  e5`5L05<VR$* 5( 9  9 e9e 99 8e 9 "!  e9 e @ wH%NVOL%M. %VA%A%VA%A%Y %3Z%N[%R,%R]%N%X 5F D 58 x5, (5 \ 5 JUˇ:+62|)7 7 P|) &<)7 D7 BP)5fJ5@^5TB5> U~7lw 7l| 5*,5@"5$5 w ; 55w x;  ~ wHw N҈J҄҇%N%N[%R,%R]%N%N%X57 \ 05 D ;;  wH%NTotal of %T. blocks in %M. files%Nʆʂ | l %  e  * Nw Hf    ! aW ef eM  ( *7  Nχe _vߋt ***THIS VOLUME DOES NOT CONTAIN A HARDWARE BOOTABLE SYSTEM *** &R (=R 5@"$L= LFТNЎJз> ~& D ~xl7 e 7@VTdEπ5  @ U:5U@  5 U5U@ X 5U Ǝ7 t݊nj55 ^ b f j E@EU b@*5 T\H5FH  5p) 5^ <7 7 5Dhd ~ԲԮ 5 e5U` E E7 ǞUjt^E `@ )75 )5 ) )׭  )׭ ۉ5%5U` |E E7 whU&|hĊrE ·&& d \W c RW  H5 n E 5҉U  7   wŇ  @ B   56;`  l V  H  EeL7x7-p߇XU 7L7J77T   Rd    77 ć  *  + 23E Ew    Е-   0@A W e`fÊ    E  w d  ť ť 0B  Aaw 2 ' UD$BA D &( U BQ Е*  & & @( f  e ee e P.l.... . ... ///& & &''&'4'B'R'd' p'~''''''''' (( ( *(:(N(\( f( r(((( (((( () ) ).)B)R)b)t))))) )) )00AH\\l1DATADATADATADATADATADATADATA)**6*J*Z* f*"***&* ** *++*+8+ B+ L+P+ \+t++ ++"++,,*,>,R,Z,n,,,,, ,, , ,-2- <-N- Z-$~- --"-- - -- . .. &.4. @.ABDEFIMNOPQRSTUXYZ<>=MXd^)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw :&& D¥%  B&ХVA C ed!  aeNb A  Е%̥V P Е Bf  & eB& e;& e@6Hŀ ȕ  nЕ Ћ  Е Е & e6 & e"Е A %& eA  Е Е A A   $Е.  AЕ;    A &EA  HE 6Dw PD&& bЕ- eaePPPЕ-$w D  &Е. ce  Е:   B'&1 L` Lb Ld L>b |LBg tLng lLj dLq \Lnu TL8w LL` DLj <Lj 4Lo ,LXn $Lu Lw Lw L L$ Lĝ L0 L L L L L L> Lޕ5ew , Bv    5Bwn 5  (5(UW       wE5 E  W ͇5  ,E  LHHKNJDI&w@E U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&  m  f A N  %&f &   `@ ` B   & A @    &ff MLLr}'`@LLeIqL4`@LLQp MpLLZ] MD,LLFwz4M[)LLee4HM`e6`}h`05Z$0_p`ʳX )ȴ´w(:`= )vpjwW "HE7"DA%U U E/%+UE $"UF*$EOAF# 5hwwN5 XE P5@L5 @U 8 T5   -h`-p` ) ) p7XjT` &5. L@ H&w $w5hwZwnβwƲ )P ww` )e U7 7 7 pw P\5'T^HUP: w5j   Uw^]W750"ޱ ޱΣT5 5 5w\w pP T5 n5Ңw@|7 5Up \`\ Z-VPJ׭Ϊ<%6.`U5P -V-R-Lq  %EZְܰƢΰ_55w\5wPU >5 5rUm5iEdw fP5<5@#5| wU(05 V ׭7 7 5@rw` $%!7ҡ wtU8J¡ \&%#7(5@ 5 ĠО PPz7`v5Swj5 5U 5P @ 5\ 5   5>%Ex5 .M5( 2 E\E R UJU Bw5  0 5ҟ5@5tUn505w χ ) %`(Up ("5 5 z 00AP\V3eaekUnxb) Pƭ 8@ rE: )  nrn p-lP(`ZR׭ԦB%<   U P z%HD~%R1~4%R2~4%VO~K%L1~GԞ5 -~>-~:-~6  )  )t x p )P \ ^~ ֥ w@5hAVR$ 6׭   >P $%V1}%F1}A   5 xR$ U |5@R ׭&  B z 4 r & d %P%UF }Z  7М^P n j7Z%EO|m%F1|%V1| 4؁  }| x| t|  5̣ Eȩ`ة`5` U" 9!56   )ةЩʩ` )%75 UU@ EE%@5%5\!55o7 6`" T )"T wm,w *5t PEhm~w &fp\ w`w H 54e0mHԚw Қ55ؙ5@w<58UzVR Uء5ҡw )EdJ%i )E,w%YME&⠷ Uh5bw. )ELا%1 )E0ا%#5-ƙșه-ԇ555 BE U;\nXEUȠU РU f E Ex DxEwRU@| RE@rxw: "5$Y5@5hU T x0Ʀ5 EwUwv * ,Ux xEt0zwBU П 5@ƟJ0^ & E/5 5 BEU -EHU ~ w5hE`U XUL5HE@  U07 65!5 )E w5  )EpU@ޞ ,w5@ƞwXE&7 ^Uz 5w5!%(&f$    Չ00$ wdUf &5*$%UFv%HEvωt oEfefE ewr h։Z%DAdvT2Ef   B!e7p7p7l waf77 ֜ҕ7 ҕ׉7 4, >r$r & & & & f & & & Ε  E #eBae5 e0e0 w%(w $ 鉀5E5U5Uz 5rUjl )* %w씠ΛEZ7 b%NFile ID %P,%P LBN %T.%NDr 55ޓ 5@ "64x 5ܛ55QP 5vwdwdx 5V \XT#  %xҔ 11tP5C5? 08<  /00fxRRR0x P x    P  ؚ  8-4P%(׭%  UpP  ؒZeP >Pe .eP eP  5Б5ȑV R$  P  5ș( `eZ<$ dž`P< zP%HD%R1fx005.&4x H%HD %R2&x (  R$  )~#׭xp`r\b%% 5z%ƘZgx >5 D =0x P5 h 'x TP x .*   z P beP XFl^xU@ԗx%7|7z770xP$   E  )00AX\\l1DATADATADATADATADATADATADATA 7ۉ, w77 7   RU0 0`   AP  n%P `5 %  8%PN%UF "%4 %UF ~ )W w`VOL1BACKUPD%B1111001001 HDR1HDR2 00010001000100 00000 00000 000000DECFILE11A U0414404144 M 00 EOF1EOF2EOV1EOV2 L L L& L$ L. Lĝ L> L%NBackup file ID %P,%P LBN %T.%NRecovered `w v7 x5 ԭw-\5RPV N -vwpU mf4w .&` V-NNi  Ҧ w펣  W!f_@_ `%ģ`D` D``` -HD`m m5`m~w x9m"mj5``e LHE@e C C` fe ڤw֤ jΤ H---e w -ޢҢ-֢ʢ7 Ƣ Ȣ ¢w Ӈw   `7 <-\E  * ^7 677a e~wmtw fӇh  55f.(ࣱw %7^7Z7 ʣ 7 HU *7>7:4,0(` pn扷 J eew  & & & &  w`& & & Ε w z҇w d `V` & & & & f & & & Ε Uw 4҇- Ƣ T C C`e   E `D 7!̠w!Ơe pj bҠ햠 @  555@©w50U @眠$,  Ut5nw:Eb 4EVwbEL TN؟@80 L璨 .U5wE Ew5 =E Uި6X2TEUĨU ̨U 4 b E E~wXU@ XE@x~w@ (5*\5 C5kUZ ɶ~Ξʞ5&EwUw V ,U~ ~E| xwhE Ч V5@ƧJ \ L E/5 5 hEE -EHE ~ w5hE`U XUL5HE@ r \U07 655 E֭ w,5E J w5@wE& -Ԧf` cPL -,mUF-$mHE-mDA-Tny(5|w5p%(&f$    Չ00$ wjUf &5 $%UF~%HE~ωt roEfefE ewR H։Z%DAD~T2Ef   B!e7v7v7r wal7Н7 7 ڝ׉7 :x2 djJj & & & & f & & & Ε  E &eBae5ee w%UF^k(w $ 鉀5E5U5Uz 5rUjlb ~ wʜƜ稣E47 <%NFile ID %P,%P LBN %T.%NjjjE z 5ԣ7 7 7 m5 -Qwz L"$z 7 p7 j wF-VU \VFmD"HE"DA"UF,CO/,NT+ (U ,@y    e-7 7 U wxwp".M  7 7 mW". e- -7 x-xnjlmhf\` rmT-U F7 <87 0  &- '- #  m m -7 - e & mB mB-<2U  |x trr5jww"HE&"DAU R U DE>"%U.E ("UF#5) w5 E 5@5 U  -7 -7 V500A`\V3eaek   w ^m P  |u vw 8ȇw "    ` eeW 0W! w w4w,w LJw ~5җt`UdVn ܖҖؖΖwh5֟pwtw7$5xw wȥwޥw5R 5 J5Dwww 0$ȕ5&(5@Z5Z  UFX5 7 <5@Uwl Unj<7^$5@45 0F> 5О  pp5s7s 577Ф77`wL 5z-5 ,b5$ 2 5 5 E : U *w55ԕ $ 55@L52TU̝ޝ450 5z w nŇ5P/5  5>50!5*U^ȓt~@7 7 $<5@(  U@ $E E 8wU֜^u0М w5b  @< 8"~ - u Et vUh5 xR$ U8J5@ 5>R ׭( ڒ В n Lw%UFBt%HE:t%AD4t$5\U L -  $ 4 4  "7     d  Eet U d  ީک֩-ة-Щjx55:545h 5$Βq w$p 5-:"pJBX|JF7 B 76Z J7  DU EޘؘИE% e E%H %z 77 7 nf Z2ef  w`7 Ҧ7 5rvnrUИ-ژP P   $x521b x " W,COW,NT e w!ҎҎw`Ύf 5ԏ ew h򎠎 ގE ~ ::55% / 5 )%HE*p%AD$p!%UFp 5 %UFp %HEo%ADo  \ B J$ef  w` 7` w E捜⍘XBRUBACKUPVOLp5 wwb` )e U77 n5z EnvX`L`w E T7 5@D  55@"  D 7 5:5@6z v$֌ 7 Rp\n. fPNLJPN %@ 2U@w Hw 4525, 5@ `pl55 >֋΋$.COFNTB < *$  * w R$ w UȔU ~@<7 >7 $:6U`BZ R  P  Ɵ 7Ȋ   ݮ 7`   ݌݉@`  f  w(e- BwR  0΢ʢ Ƣ " &U ދ֋  P P Lmēme‰7ຉ 7 Ftp j 7ef|v *w> 874 2,]*VPʝB>   ̒Ē7 rErw 4 ` e  pDl@ 50U@ 5ډ5ԉ 65ĉ2 h ~ nfĈ & Z5 7 Z@  @< &v,r(w 6 5.  R  T:6쇷 w 7 އ5-: Ƈ‡ew Uw ʸHB<Vb7 2. 7 600Ah\\l1DATADATADATADATADATADATADATAd p$dw L6, &rb^ | 5 #p W,COW,NTe w!҆B`V$  wa w w ҷ Vn lL dL \L& TL$ LL. DL ,Lh $L L L\ Lޡ L0 L L L L L>UpEjЍ̍7 ERE4 UJ!r!r! r!  r! U e |: /0(f$^E@dbXX  mތČ ֌(5r? ،p $ EX7 nwDU @ Hw%ww|xtZn e5 e w %z %5Ќe 5@E@w877ڋ7֋E7 7 ʋƄ  ܉wn7eބ 7,5Jy54щ5*Љw.5Ӊ7 U E``7V(N$& ".5Ƌ5x  5@wU5\܊P m<: w~ЊȊE@Lz N ݉dxpv lw^dZh-V:4LH,B e5Ԋ %%z %e w5 EމU-55v5n e 5T5J 5B U6 f-&5 5 ځ5ԁm 55@ - %DAnPE@܉ @7 7  <:e4׉w  5*, " e 5j Љ ,5VӉw5Hщ5: 5,#fE ee&f R  ְ5 w8N 5Ԉ  5@̈wUw5 w  ԇw-ʇw 5@ 5 852mpp "5 5 N w E0>U4 f w 5@&~v~p@RRrèE@LDU U@ڇ5 5 5  5 މ ^ ކ5> 5 6mvzw t5& d 5N5@L  5 :5 ~5~5~ 5 5~U E X7.L 7 5ĆwwE h҅U%~ ąwLw5pEh eą w~UBw5 }5}w#w w 譇w#5} #w# #w#5 }5} #w# #w#5օ w ԅ hw 5} # #5 j}5d}e &E e  5^%„%պ? L 5 |5| w (5| 5 |5|m bJ --  5b|yUUm{ :5@r -8}>{ %DAJE@Z w &&( U(55 0 -5{y@5{ރ -6-.ƒ v w w V7 7 ڂ E `w ze  ){5{5{  % H B >b7 xt{7 V HƆt{{׉xJw ƪHEADDATANw   5ւ5 ΂5 z5z 5xze`e07 |5$XҁƁn-ƁjE !  F`` 0`H V *R7ሁ7a 5@&ezetwmjd  55   22e55 ueef Xs&zf!3 X !5 3 \f)%X  ΀7 ȀXyX  5J 5 Bw w |t7 "U    7 \w^ee 5 x5x 5x `(5€000 `&  `e xvzpB `~ ^C7 x:77f*x\7 rnx7 P Bnxx׉7 4 r00Ap\V3eaekL R& & & & f & & & Ε U  wew~E 7 ~  w`~e  & & & &  f& & & Ε ~~~-LD %w %NFile ID %P,%P LBN %T.%NRecovered x 7 5 ~5v5 ~wp5lv}5 ~ 5~e U ~~q q, Ub~7 |7 zvv-}wt tt|}t-v}wB7 87 6v2 6U~ J} e q q,   ww TtB Ht @Cm8t :t-- t@`   - tw >u@pw̺jd d \ tuu`|uuuJ|0 XuR| , Ju0|`u5|HuU@|Dt@tTtPs}s}ssePs " *erss 7 t7 js fs7 ^st^sZsetm| tm|t58|E0|5 s5s ts st {5{wPw5 s5s f".w5@{e.Fs5 ns5hs  TU{ l .`{7 7 7*s7&s7r 5\{  \`EJ{ $U>{58{50{-r,r rerrer   e7r(z5z r|rvr7 r7zzw5z ^5zwPw zwX <5zw5zw"5xzG7rElzhzU`z5 Zz*5 Rz&U@JzqqU4z 5"zqwEzU zq0q,q B7`q7`q5yBUy 5yhqwEyw$ 7  ] 8q2qpʝp5yE p qq E Xypppp7|pwn5MXh Pw Fhw @he8h-4h 7 (h$hvvmhr  g-gg TvPvmgr J t$EDp5 bh5\hoo U@zp54h ,oooo5Zp ERp  UFp  h . F(00Ax\\l1DATADATADATADATADATADATADATAH*J, d5oU@owufufՀ Uo  `ee   `eѕѕ tt t ttt0 f 7NfwLf7Bfw@f8f0f.f  ҕeeN e%%J L 7e w `&eW   etet etet e5bn  we w 58nwTeW &@eNtoDX F tUi5~iUvinh-n  nnh-nNah |E0Dib4 7a n  No5i w(7&e0 5 `5`=f&& 00"(&&  v`N 6,   p` a e % % ewF5phe0B ,a%      7aw Jw w(  $(    `` ఐ   ‰ `d % l  $)7<`e  $ ($) 47`e` h `A Ae  ‰`L $)& eP %wf Jm7Jm7Hm05 g P $ 7!m 7`mw mb_  *ml 7 B_7 @_ w2_w b.U*_)U PU H w w7 ^.^w .  `d $) A T  A @% A ``` ` w  We0,a  C`B W  R C`B H  Cw  w!Aapp&j0 e   j ^ ^  Tp pmH p m>p  6e -.fjw Ȍ]]7 Lj7 Ed?5 dZz:7 8U$&7 U7 ғ7 Г 7 5@F7V7܅52eeST Œ5B 5$7$5 ؄,,5ʄЄ-7-Ȅ5.e< P 5  -d |- p.*5P7 7  5> 7 00A\V3eaek5,5$8ܑ4ؑ-U  Ⱦ   w,W 7w4 ,măe5emzmxwpn 5 \W cW  M-xM-zM-pM5Lw Ћ e2 ؐ   zv _EeK p eK N0 `\&  -\ , 5É& 轈 ܽ  5f&f "ɜ n ފ L ĝʕ b Ɗ ĝ Nĝ @SevfEbN -v-p E /f& N N  %6  NW!W!%%U%  wr jfF  l eVw P   w17 W ~  f U%E   qA `   W  1  F   d $  V N   荦%h7{^zjjf r   "$   E w   ~ j ҁ fB> L`d wD nq1 qA ,$    % oeL  ow JRZbjrzt:#z xQz kzNNz*O:zt:#zt:#z kz Hz7 UTPw~ hew ꌗ  j֌^ҌZ-.    ֆ <~mme5de7|wv rpl   eRw L@  e8w 2  xe   ^\ XVf  P4 H D e 42 @ |S 3ee@  H w 8 ъ  wX VR    w 54{  & T   J UU W 5%e  " 6. -  55Pu  5{  - 6D Daee T D Da - - %-%! &-̃ƃ -5P -  - e &  S ee@ 7nwljw'  W D E E `w tѦwP~z8wd@ @ d FBB `8w 2 DMi DM/ DL(( DLP( DRD/"" DRav 22 (DR7  DR/ DR`7    ҝ7 7 l7 j-DU `|rJyFy6y2y5 -Fe-$-75CREATED™DENSITY Ꙙ DIRECTORYꙞDISPLAY@ERRORS⚞EXCLUDEEXTEND HEADERS\IMAGE INITIALIZE*INVOLUME>LENGTHJ@MAXIMUM ⚞ NOPRESERVE XOUTVOLUMEbДPOSITION PROTECTION>REVISED⚘REWIND 4TAPE_LABELښVERIFYʚ WINDOWSGROUPOWNERSYSTEM WORLD BEGINNINGBLOCKENDMIDDLE AUTOMATICMANUALOVERRIDEAFTERBEFORERESTORESAVERWED / .; 89.[,]@2 2  From: To: BRU>LBN(s)=556jUx7 Pp}=L p F   V ̦h̢h w ʟ&Bx 4x m.x PPHx tx l x dx \w poE tdo5^o Vo5Po  $ R5 (o   o5ow6q   aS Hm5nUn 4m m5n5n-lmlm;Un n:5an Un5n 5@~n 5rn5ln5\n 5vR 5 4n  fl `l~l\lzlUn5nwPNlNl lH|lxlztlpl5 m5mUvU v5m7 n7 .l5m l5ml5 m  kkkkk{W/ W W 7 0n w(n X  iw `tz! d twmmjY <Iz!ȕ  ׽;6m05lUl l5@lU@llE@l5lw X \ 7l  ewd5lw X * @   jUtERl@ZzHX 7>l  D70l 7&l5lX xw Fw 7l 7k w5k  3 Pwk   6  @kW,w ewV Vwd " ~7k5XkX׽wCwywy .f-vhk7x `xx r =x =x=xSȋGȊ h-hA>9A6e0#=x:ȋ. (i5j-id-i׭׭ePxНNxȝFx Bx-@xMFUr 7 $kd7 ke7 ka׽F-Nh FheW!Mu׽U0X W*  &f ,M W*   u 00Ћ`  l׽>W*  D%ڄ >T W. W* @ u  W;  W*  5 B*ƕ ͕ҕ  B`   B >8jg 5hpZgp7 "gY68:<>2T W( ҝ rW) hY i i wi B0 1 . ,`*`(W.w h  wh B0    `W8 W9W- w h  W0W9 Bwh W#  B0  e ff e U  %ee e`u W.   5o  :  SӁ ԋˋ bf W( & W:HW:D &W-m Hppe eXUUUW-Q V EL dID0ye:UUW   e < ((g  g & <W:  <  W) Y Օ0 uU? Jf (W!F U Bf`I& ȋ W:wfF  $7w  7w׭s!ss``- &az ȕ <3 /:,+-) 7 f wfe xS   j   `E    ` Eew W0WZW9WA &6ȋPwFw 00A\V3eaek(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$f&f ` *  נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 ~נ%נ*נ-נ.נ0נ9נAנZȠ yנ0נ7נ*נ,A jȠh f  oנ"A   #A aנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; dנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (w^נ/* . ,נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e  !ddC    D%*.C U 0 0 W ,Uw6W /@ : ^BDaW-Ί WNWOD!BΊz CECCD! D! ΋5  e ΐ TpRpR΋pBC5N KR΋KBAE:D0CĊ f eB  Dҁ CSĊ  WB E Br Ε f)& 6 l(*  E 'W " =N  W :+W = 1 #W ,W / %W %W *Հ W <W [W >W ] v(* 6 ew Z w P& W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C N"'XXXXj?<pk R7 f7I7J7G7D7<7979| Z\VX& & A!?mE7 7%%% rfw7  %DYP 5 v7sn @%DFfP7 7 cw  c6w 0  -2e--$w  w*    77  n7 7 t `   mVw J 4  v ew   ' Е.  r n  XT 7  b>8f  %DBE   --   ݶ   A B e  Cd ' BAD>P(m۶ j n DMiB DMB DRD"" DRa 22@ (DR`  DR  ` DR DL((( DLP(( ???? ( 4 n ! 00A\\l1DATADATADATADATADATADATADATA   7<  w" bЕ.wp & 7 7"$  cx7  Е.cw~<c e@ -`-ZP4 ' C%DBHEv  ><  & PНН ( Е:Е P "5 5 uЋ f%H7t Pf `ZU*,0 b f`!   Dw$ 2Cm  w& $wN!W@ B C e270 B  7 7 7v fwfW! W# E-޷-ڷ  !9ȷƷ 4eB !VRmRLw FB e.w (  KV   , & "  "Q New mw &R%  RRRR% % dwAE, @@`$ Ce@ 7>w< f   BAD -- BAD -- Syntax errorIllegal deviceNot in systemFailed to attachBlock 0 bad - Do not use as system diskBad Block File overflowUnrecoverable error - Write lockedNot readyTotal bad blocks= 000000000Handler/Driver missingFailed to write Bad Block FilePrivilege violationManufacturer's Bad Sector File corruptis an alignment cartridgeFatal hardware errorFailed to read Manufacturer's Bad Sector FileBAD -- Invalid switchBad block found - LBN= 0000000000BAD -- Command I/O errorBAD -- Command too longBAD>LBN(S)= BAD -- Invalid block number - 00000000000BAD -- Duplicate block number - 00000000000Bad Block File not foundFailed to read Software Bad Sector File Volume label incorrectHome block not foundFailed to read BADBLK.SYS headerBAD -- Block already allocated LBN= 00000000000LBNS allocated to BADBLK.SYS= LBNS in bad block file= Allocation failure  &" - &wvw7 󷊓󷊎 % wn|R b   v 6 w7J0@ -" % "  lȋ ? D  J 7 w7  r A & Eew -f-`w* 0| :7@ Dw & BwBw>&$ e .% (  (? ȋ dM   ^%wL    e  ˭ 7t7n* X H w$XZTwdJF :f  JKw R -*TT ݴ  T B҂ `hTT ew$ DBC>E37J .¥:  &  W"C fNl fD`N %7! 0 % Ҕ  &@  Е Е 1  A 2  Е:      f%    0  a ff a Q % %ea e`q  ¥#Ћ ¥.Ћȋȥ ȥ ȥ:ȥ,Ћȥ ȥ ww Qew  쬴𷋨 - w`w  cW t.ԝԊ% 4 e"7  cW te%Kw  *  + 23E Ew    Е-   0@A zW e`fÊ    E w h' UD$BA z&( U BQ \Е* &37 &fw 7 7 @,q `-KacJE[ !m@00A\V3eaek  ) L R  j7j f@  &  5]U E( :&@E A  ̆  E vE c  @  . &f     8  " .$ B  8̥ZḀ90     w 5 funhj tuhdB$ 8jwaw< 8 v8w &  .*AdBbAep& f   P aAAf@pnp DC*8֋ 88*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ ŀajTI& af* v*`V @e,w jjlj ɥ@@aujk,bp 5f fˇ ȕ 6‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ Dllja!CeH###33@# & 8 *j>w  8jDl@ TeBT85l@ @( D 8eB& # * An5j)f & 2/      RՀa@LIOVRMANUPDRETRYLISTOVERRIDEMANUALUPDATEPATPATTERNALOALLOCATE҂҂:/<BHNd<BHNjjTT:=‚:†f&f ` *  נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 ~נ%נ*נ-נ.נ0נ9נAנZȠ yנ0נ7נ*נ,A jȠh f  oנ"A   #A aנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; dנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (w^נ/* . ,נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e  !ddC    D%*.C U 0 0 W ,Uw6W /@ : ^BDaW-Ί WNWOD!BΊz CECCD! D! ΋5  e ΐ TpRpR΋pBC5N KR΋KBAE:D0CĊ f eB  Dҁ CSĊ  WB E Br Ε f)& 6 l(*  E 'W " =N  W :+W = 1 #W ,W / %W %W *Հ W <W [W >W ] v(* 6 e%!'n'&  m  f A N  %&f &   `@ ` B   & A @    w *8I <*=)98  eB &&  U **e *Nlv ΋*.)  & #!)&eP(e && p* w00A\\l1DATADATADATADATADATADATADATAeB  8 T $&w p* F  w T*D `  ww 6( D  8#"#)%ĥ ĥ w 0 *0 @Q$    0 40 60))eB \  :# & 3&*w #( P) @#**fff >  &*wL. P35(8e$8w22&(e %p8q #) *R*)@#0l C# 028 00ĥۇAĥĊ  000 < 0 @0 &*0 @ u D# eB&B pB T *  eBe>  # #D #&0 #   0@e 6@#040 6w0!p2w   ) 8C * ) *w* X ep p  C  =  0* = Eե^ A e@ ߇ Ep p  8 V *`)w ^C#    D w B(B C DBe ?D(1 >&ff w *) H* w46l0w  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C 82e&( n0 0 0 80 B0 0 0 0)#0.0+1(e  \%&p*w f( f)f |) .  .8Ae f"( UCɗ&+(e$&% *w *#   U@e l  e`w1  %,,  w &*D !UqqC ӥ:  Ce    *w *  )Ĕ%.&%;D  5)5@DD ͥ*Ce ta%wUX5@ 5U U*U  5@XU@5 U*U  ʥ*%C!.D` F*weC5U5  5 5@e*w ,BC "& <SY&*p0p21E%0*w(*e "f D CB.E141612epl2l0p xMw    f Pu   e6p 4 8 j | : V  f t&* v*. 00l  0 *w feE D` bl lrw "  B eE"s    s-  Csl0f(& e %&&eH U   Ef p  wr *) l0, *) $ )*)0,40,6 8  ***  DP5R RRR  6 p 4 0`p f 64 `46  $e*w ) !f F  e) . e6p 4 208*w(*Ge(  1 5&e  1-1- 111 rrrrr &  Be X 1 w* w &Ba +- ʥ# . 00A\V3eaekU 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@,*1 U4 6w Bfep`pw8e2 0,0, f 톇,, w ,     .%  eB U5UU < plp & NeՀ)*f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ w . ҥ[, &]  5 s  D w1 z  h 1 1 1 1 1 1 DEee $ $ ʫt HʫIH0ʫ,HʫWH8ʫyHʫH ̫H̫pEH̫dH̫+gHϫxdHϫfHϫyH$ѫ,xH`zѫBxHѫxHѫHnSH髭FHZHdfHz}H뫽HH:HlhHHFHGH6zGH6GH2xZHfH\}HHH`XsHxQH& sHlHlUH_H_HHXHXzHQH&RHRHRHSHRSHSHSHBTH~THTHUH$HnUHUzⰀHXHVHDWHWHxVHX)HX4H0XHfH9HLHS}Hd@yH mxxH znHHpHr{Hr{Hr{Hr{Hr{Hr{Hr{Hr{Hr{Hr8|Hr`|Hr|Hr|Hzr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hzr|Hr|Hr|HuHuHuXHvHvy:HvaHvgH&H &zH@&&H&Hd&H zd&H d&Hd&Hd&#Hd&#Hd&#Hd&4&Hd&NHd&THd&UH@d&gYHd&^Hd&eH@d&eHd&#Hz)NqH)rH )#H")ZH)faH)fH )wH)vyH)މH$)H)H).H,){:H)FH()Hz)KH)H)H )Ue Hg,H>hH>i8^HlH!lpH$zl.H>l8YHmH(nHHnHoH>op&H6pH&pqHr<H rHBr|qH:sL H,s qH9s<}HzsHs(HtHt:H/tGH0uHfHԃt Hԃ4FHԃ LHԃZH@ԃgH. HH. Hz2 H3 H4 H5 HHHHHHTHT*KHTSH@T^HTLHH2z@H H6g'H4 H0HhLH00A\\l1DATADATADATADATADATADATADATAZH`Hz}H~HH*HH H HzHeH"ZH HHHH HHxdHHHH"@H#k'H za(H sH/GH H!bH$H"zKHH2 qHŞHHfaH(fH*R;H DHD #H@D#HDKHD4fH D6qHDCHzDH!H"LH#~H&H)8^H,FH -H2H3KH4H5H6H7p:H 7R;Hzd(xHf`H iyHjyHlp!Hl8YHpXzHr !HtHvHvxdHxHH쩔HH:TH̫HsH6l;HYO_HXѫO H,ZѫhH,\鍒H!)H CLAEND ;END PACKET HANDLER( .WORD CLAERR ;PORT/CLASS ERROR HANDLER) .WORD CLACMD ;(T)MSCP COMMAND INITIATORE .WORD SCUCB ;SCAN UCB LIST .WORD -1 ;TERMINATOR FBITS = 0N$ .IIF DF,E$$LOG FBITS = FBITS!JM.ERL$ .IIF DF,DU$CHK FBITS = FBITS!JM.CHK$ .IIF DF,M$$EXT FBITS = FBITS!JM.EXT$ .IIF DF,K$$DAS FBITS = FBITS!JM.DAS# .IIF DF,DEBUG FBITS = FBITS!JM.DBG=$ .IIF DF,TERMNL FBITS = FBITS!JM.TER;= ; LOCAL DATA;R/IOPSEQ:.WORD 0 ;COMMAND PACKET SEQUENCE NUMBERC8LSTPKT:.WORD 0 ;ADDRESS OF LAST ABORTABLE IOP IN C.OLHD*RADNAM:.WORD 0 ;PORT COMMON NAME IN RAD50' .RAD50 /OM/ ;END OF PORT COMMON NAMEO.COMPCB:.WORD 0 ;STORAGE FOR PORT PCB ADDRESS/SAVSTK:.WORD 0 ;SAVE STACK ADDRESS IN DELAYEDT% ;CONTROLLER TRANSITION TO ON-LINE! .IF NDF R$$MPL ;RSX-11M ONLY! .IF DF D$$DSK ;IF DISK CLASS 1DUDCB: .WORD 0 ;POINTER TO DU:'S FIRST DCB4DUDCB2: .WORD 0 ;POINTER TO DU:'S CURRENT DCB .ENDC ;D$$DSK0 .IF DF T$$APE ;IF TAPE CLASS1MUDCB: .WORD 0 ;POINTER TO MU:'S FIRST DCB 4MUDCB2: .WORD 0 ;POINTER TO MU:'S CURRENT DCB .ENDC ;T$$APEF .ENDC ;NDF R$$MPL> .IIF DF E$$LOG KEEPR1: .WORD 0 ;TO HOLD R1 DURING CLADAT CODE .PAGE. .SBTTL IOFUN - I/O FUNCTION TRANSLATION TABLE;T; I/O FUNCTION DISPATCH TABLE;;-IOFUN:- FUNCT RLB,RD,RD.L,CMDRLB ;READ LOGICAL BLOCK . FUNCT WLB,WR,WR.L,CMDWLB ;WRITE LOGICAL BLOCK2 FUNCT SEC,GUS,GUS.L,CMDGUS ;SENSE CHARACTERISTICS .IF DF D$$DSK' FUNCT LOV,RD,RD.L,CMDRLB ;LOAD OVERLAY 7 FUNCT STC,AVL,AVL.L,CMDSTC ;SET DEVICE CHARACTERISTICSD. FUNCT RPB,RD,RD.L,CMDRLB ;READ PHYSICAL BLOCK/ FUNCT RLC,RD,RD.L,CMDRLB ;READ WITH READ CHECK  .IF DF R$$MPL/ FUNCT LDO,RD,RD.L,CMDRLB ;LOAD D SPACE OVERLAY * FUNCT SCF,RD,RD.L,CMDRLB ;SHADOW CATCH UP .ENDC/ FUNCT WPB,WR,WR.L,CMDWLB ;WRITE PHYSICAL BLOCKR1 FUNCT WLC,WR,WR.L,CMDWLB ;WRITE WITH WRITE CHECKE7 FUNCT WDD,WR,WR.L,CMDWDD ;WRITE WITH DELETED DATA MARKT= FUNCT INL,GUS,GUS.L,CMDGUS ;INITIALIZE (FOR RCT REPLACEMENT)V* FUNCT RPL,RPL,RPL.L,CMDRPL ;REPLACE BLOCK0 FUNCT TRM,0,0,CMDTRM ;TERMINATE RCT PROCESSING .IFF ;D$$DSKK+ FUNCT EOF,WTM,WTM.L,CMDEOF ;WRITE EOF MARKC( FUNCT SPF,REP,REP.L,CMDSPF ;SPACE FILES) FUNCT SPB,REP,REP.L,CMDSPB ;SPACE BLOCKSR( FUNCT RWD,REP,REP.L,CMDRWD ;REWIND UNIT9 FUNCT RWU,AVL,AVL.L,CMDRWU ;REWIND AND TURN UNIT OFFLINEWG FUNCT SMO,AVL,AVL.L,CMDSMO ;MOUNT AND SET TAPE CHARACTERISTICS ;JJM300I8 FUNCT STC,ONL,ONL.L,CMDSTC ;SET CHARACTERISTICS ;**-18 FUNCT DSE,ERS,ERS.L,CMDEOF ;ERASE (DATA SECURITY ER .IIF NDF S$$YDF , .NLIST .TITLE RSXMC .IDENT /M4.1/;,; COPYRIGHT (C) 1976, 1977, 1978, 1979, 1983/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.E; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AG00A\V3eaekREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; O; VERSION M4.1 BASELEVEL 35E; 0; CREATED BY SYSGEN VERSIONS 3.2.2d / 2:3.2.2d ;AR$$11S=0 ;RSX-11S SYSTEMSM$$MGE=0 ;MEMORY MANAGEMENTI$$RDN=0 ;I/O RUNDOWN$D$$YNM=0 ;DYNAMIC MEMORY ALLOCATIONP$$LAS=0 ;PLAS SUPPORTM D$$IAG=0 ;USER MODE DIAGNOSTICS%N$$MOV=33. ;SIZE OF BLXIO 'MOV' TABLE T$$SYN=0 ;XON/XOFF SUPPORTE5C$$TTY=177564 ;REGISTER/STACK DUMP DEVICE CSR ADDRESSUC$$RSH=177564 ;CRASH REPORTING+C$$ORE=256. ;SIZE OF DYNAMIC STORAGE REGIONM6S$$YSZ=108.*32. ;SIZE OF PHYSICAL MEMORY IN 32W BLOCKSH$$RTZ=60. ;LINE FREQUENCY %K$$CSR=177546 ;LINE CLOCK CSR ADDRESS%K$$CNT=177546 ;COUNT REGISTER ADDRESS0K$$TPS=60. ;TICKS PER SECOND K$$LDC=1 ;LOAD COUNT VALUEM9K$$IEN=115 ;CLOCK INTERRUPT ENABLE (KW11-P AT LINE FREQ)U&;;;;D$$WCK=0 ;DISK WRITECHECK SUPPORT"R$$JPO=0 ;OFFSET RECOVERY SUPPORT*R$$JP1=1. ;RJ/RWP04\05\06 PACK CONTROLLERS%R$$K11=1. ;RK11 RK05 DISK CONTROLLERS6*R$$L11=1. ;RL11 DISK CARTRIDGE CONTROLLERS&R$$611=1. ;RK611 DISK CART CONTROLLERS)R$$P11=1. ;RP11-C\E DISK PACK CONTROLLERSZ&R$$M11=1. ;RWM03 DISK PACK CONTROLLERS&R$$UDA=1. ;RA80/UDA50 DISK CONTROLLERS&T$$J16=1. ;TM02/03 MAGTAPE CONTROLLERS$T$$M78=1. ;TM78 MAGTAPE CONTROLLERS+T$$M11=1. ;TM/TMA/TMB11 MAGTAPE CONTROLLERSK$T$$S11=1. ;TS04/TS11 MAGTAPE SYSTEMSS$$ECC=0 ;SHARRED ECC CODEO(D$$L11=1. ;DL11 A/B/C/D LINE INTERFACES$V$$CTR=400 ;HIGHEST INTERRUPT VECTOR-R$$JPO=0 ;RP04/05/06 OFFSET RECOVERY SUPPORT1'R$$6OF=0 ;RK06 OFFSET RECOVERY SUPPORTR'R$$MOF=0 ;RM03 OFFSET RECOVERY SUPPORT1LD$DU=0 ;LOADABLE DUDRVZ1DU$R0=2 ;NUMBER OF RESPONSE RINGS, CONTROLLER 0 0DU$C0=2 ;NUMBER OF COMMAND RINGS, CONTROLLER 0"L$$DRV=0 ;LOADABLE DRIVER SUPPORTB$$LV1="38 ;BASE LEVELMB$$LV2="B* ;REVISIONP#S$$NM1="RS ;SYSTEM NAME (6 CHARS)M S$$NM2="X1 S$$NM3="1M0S$$HFC=30. ;MINIMUM TICKS BETWEEN SHUFFLER RUNS&M$$CRB=84. ;MCR COMMAND BUFFER LENGTHR$$11M=0 ;RSX-11M SYSTEM/;0;F& .IIF DF C$$CKP&T$$BUF!A$$BIO K$$AST=0 .IIF DF A$$BIO&T$$BUF K$$AST=0 .IIF DF P$$OFF K$$AST=0 .IIF DF P$$SRF&G$$EFN K$$AST=0;R; ; EXEC MACROSS;S;GB; ASSUME MACRO FOR CHECKING ADJACENCY AND OFFSET VALUE ASSUMPTIONS;D 0 .MACRO ASSUME A,B=0 .IF NE - " .ERROR ;EXPRESSION(S) NOT EQUAL .ENDC .ENDM Y;M; CALL SUBROUTINE$;2 .MACRO CALL SUBR ARG3 .IF IDN <$INTSV>, JSR R5,$INTSV .IF DF L$$SI1 .WORD ARG .IFFG .WORD ^C&PR7 .ENDC .IFF .IF IDN <$SAVNR>, JSR R5,$SAVNR .IFF  .IF IDN <$SWSTK>, EMT 376 .WORD ARG .IFF JSR PC,SUBR .ENDC .ENDC .ENDC .ENDM;C!; CALL AND RETURN FROM SUBROUTINEC;K .MACRO CALLR SUBR JMP SUBRS .ENDM;; CRASH SYSTEM;A .MACRO CRASH- IOT .ENDM;P*; DIRECTIVE REGISTER SAVE AND SET PRIORITY;  .MACRO DIRSV$ JSR R5,$DIRSV .ENDM;; SET DIRECTIVE STATUS;J .MACRO DRSTS VALUE TRAP VALUEA .ENDM;..; GENERATE INTERRUPT ROUTINE ENTRY POINT LABEL;, .IF DF E$$DVC .MACRO INTLB NUM,NAMS $'NAM'NUM'T::E .ENDM .ENDC;F;; INTERRUPT SAVE GENERATION MACRO FOR ERROR LOGGING DEVICESL;D. .MACRO INTSE$ DEV,PRI,NCTRLR,PSWSV,UCBSV,?LAB! .IF DF L$$DRV & LD$'DEV & M$$MGE $'DEV'INT:: .IF NDF E$$DVCI .IF EQ NCTRLR-1 CLR R4V .ENDC .ENDC .IFF  .IF NDF E$$DVC.,$'DEV'INT::INTSV$ DEV,PRI,NCTRLR,PSWSV,UCBSV .IF EQ NCTRLR-1 CLR R4 .ENDC .MEXITL .IFFA$$$=0A .REPT NCTRLR INTLB \$$$,DEVU JSR R5,$INTSE SCBLB \$$$,DEV .IF DF L$$SI1 .WORD PRI .IFFU .WORD ^C&PR7 .ENDC .IF GT NCTRLR-$$$-1 BR LAB  .ENDC $$$=$$$+1R .ENDRLAB: .ENDC .ENDC GTUCB$ UCBSV,NCTRLR .ENDM;S9; INTERR00A\B\l1DATADATADATADATADATADATADATAUPT SAVE GENERATION FOR NON-ERROR LOGGING DEVICESN;) .MACRO INTSV$ DEV,PRI,NCTRLR,PSWSV,UCBSVV" .IF NDF L$$DRV ! M$$MGE ! LD$'DEV .IF GT NCTRLR-1 .IF B MFPS TEMP .IFF MFPS PSWSVR .ENDC .IFTF JSR R5,$INTSV .IF DF L$$SI1 .WORD PRI .IFFT .WORD ^C&PR7 .ENDC .IFTB .IF B MOV TEMP,R4 .IFFI MOV PSWSV,R4D .ENDC BIC #177760,R4F ASL R4R .ENDC .ENDC GTUCB$ UCBSV,NCTRLR .ENDM;.5; GENERATE CODE TO LOAD UCB ADDRESS INTO R5 -- CALLEDN; ONLY BY INTSE$ AND INTSV$O;R .MACRO GTUCB$ UCBSV,NCTRLRA .IF NB I .IF GT NCTRLR-1 MOV UCBSV(R4),R5  .IFFE MOV UCBSV,R5F .ENDC .IFF. .IF GT NCTRLR-1 MOV CNTBL(R4),R5P .IFFR MOV CNTBL,R5F .ENDC .ENDC .ENDM;1; PROCESSOR STATUS READ/WRITE<;> .IF NDF L$$SI1B .MACRO MFPS DST MOVB @#PS,DST .ENDM .MACRO MTPS SRC .IF IDN <#0>, CLRB @#PS .IFF. MOVB SRC,@#PS .ENDC .ENDM .ENDC;E; SAVE NONVOLATILE REGISTERS;N .MACRO SAVNR JSR R5,$SAVNR .ENDM;/; GENERATE STATUS CONTROL BLOCK REFERENCE LABELV; .IF DF E$$DVC .MACRO SCBLB NUM,NAME .WORD $'NAM'NUM .ENDM .ENDC; ; RETURN FROM SUBROUTINE; .MACRO RETURN RTS PCN .ENDM;.; SOB LOOP INSTRUCTION;T .IF NDF M$$EIS .MACRO SOB A,BB DEC A BNE B .ENDM .ENDC;.; STATE SWITCHING MACRO.;I .MACRO SWSTK$ ARG CALL $SWSTK,ARG .ENDM;.=; GET I/O PACKET MACRO -- USED FOR RSX-11M-PLUS COMPATIBILITY;.( .MACRO GTPKT$ DEV,NCTRLR,ADDR,UCBSV,SUC CALL $GTPKT .IF B L BCC 65535$  RETURN65535$:F .IFFD BCS ADDR  .ENDC .IF B  .IFFM .IF GT NCTRLR-1 MOV R5,UCBSV(R3)O .IFFU MOV R5,UCBSVA .ENDC .ENDC .ENDM;MQ; GENERATE THE DRIVER DISPATCH TABLE -- DDT (USED FOR RSX-11M-PLUS COMPATIBILITY);E) .MACRO DDT$ DEV,NCTRLR,INY,INX,UCBSV,NEW $'DEV'TBL:: .IF B  .WORD DEV'INI .IFF .WORD DEV'INX .ENDC .WORD DEV'CAN .WORD DEV'OUT .WORD DEV'PWF .IF NB NEWA, .ERR NEW ; UNSUPPORTED RSX-11M-PLUS FEATURE .ENDC .IF NB CUCBSV: .BLKW NCTRLR5 .ENDC .ENDM .IIF NDF S$$YDF , .LIST  .IFFM .IF GT NCTRLR-1 MOV R5,UCBSV(R3)O .IFFU MOV R5,UCBSVA .ENDC .ENDC .ENDM;MQ; GENERATE THE DRIVER DISPATCH TABLE -- DDT (USED FOR RSX-11M-PLUS COMPATIBILITY);E) .MACRO DDT$ DEV,NCTRLR,INY,INX,UCBSV,NEW $'DEV'TBL:: .IF B  .WORD DEV'INI .IFF .WORD DEV'INX .ENDC .WORD DEV'CAN .WORD DEV'OUT .WORD DEV'PWF .IF NB NEWA, .ERR zoMXDpHn1Hu~HH먃2H& 먺3H, 3H 3H D~HH+HHpzHJ!H:^HDW^HHeH|KHCEH$ WEH, wHl$CTH$rH$yH =&Hx =&Hx ='Ht z='Ht >MHCHjCHhCHjC:HCKHlD8HD:HDFHDrHEO HXE&H$GRH\G gHzH\}HJ4H|J@ HtJt HJ HJKH J;dH JVdHHJeH4J gHlJwHPJÅHJLHMsH[NsH zP\Hb:zoMXDpHn1Hu~HH먃2H& 먺3H, 3H 3H D~HH+HHpzHJ!H:^HDW^HHeH|KHCEH$ WEH, wHl$CTH$rH$yH =&Hx =&Hx ='Ht z='Ht >MHCHjCHhCHjC:HCKHlD8HD:HDFHDrHEO HXE&H$GRH\G gHzH\}HJ4H|J@ HtJt HJ HJKH J;dH JVdHHJeH4J gHlJwHPJÅHJLHMsH[NsH zP\Hb:H!b\}H bHJRcL HeHeHeHveeHeHeĊHeHQiHisHiTtH*ziH k:H$k\}H#kHRl:HlHl:H&laHHl\}H%lHvSm:H)m\}Hn(mH Tp:Hz.p'MHp(MHzp@QHp\}H-pHTq'MHq(MHrH"r? H6rp Hrr HrH|rH0rH0rHrHrH4zrHrH.r2H`r HHr7!H8r#HNr#HNr-H@r.Hr:Hr1r'MHTr(MHdrxQHTr SH<rkHzr!mHrpHrYqH<r[q00B\V3eaekHRrsHVrvwHrwHr#yHrNyHrryHryHryHr\}H/rHr}H(zrHrHrHrHrH8Ut^HtqHuH:Vv?TH vHyfH*Hf `;H$ yHH"zsHsHp+sH,.sH6sH8sH ;sH0=sH&BxHrHC HH8rHVrHWrHzfHfHfH©FHߩ0 HeH |H$eH HXCTH,KH,KH,MH4:H6}Hz6H6H6ԀH6߀H 74H 7fH 7&H 74FHD 7H8H"HngHsH-Hx~H|zɪ+gHn˪pHz˪sHժ:H8ժ\}Hx5ժHWת3HتHت4MH ت5MH تVNH تYeH تfH۪:HM۪\}H"Iz۪HWܪHV@ܪ:H @ܪ\}H =ܪHWݪKH ݪHV#HZH`H`H`H`@H`H`H`zH`@H`Hn-}HL -P}HH AXH AqHAsHFsHKQHKZHLHO`KHOKHO NHzOHR9HR,:HRR;HRSHT|H<Tz}HW|qHtktLHfkBMHjmQHq~ZH>qZHDuHbuHbzzTHtzTHjzTH}#H}eH6H [MH$eMHLhMHXxH@HH@wHyH‹HzH H }H*}HZ}HZH^H^H@H>&Ht'H &H(Hf(H,HvzʫL Hʫt HʫIH0ʫ,HʫWH8ʫyHʫH ̫H̫pEH̫dH̫+gHϫxdHϫfHϫyH$ѫ,xH`zѫBxHѫxHѫHnSH髭FHZHdfHz}H뫽HH:HlhHHFHGH6zGH6GH2xZHfH\}HHH`XsHxQH& sHlHlUH_H_HHXHXzHQH&RHRHRHSHRSHSHSHBTH~THTHUH$HnUHUzⰀHXHVHDWHWHxVHX)HX4H0XHfH9HLHS}Hd@yH mxxH znHHpHr{Hr{Hr{Hr{Hr{Hr{Hr{Hr{Hr{Hr8|Hr`|Hr|Hr|Hzr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hr|Hzr|Hr|Hr|HuHuHuXHvHvy:HvaHvgH&H &zH@&&H&Hd&H zd&H d&Hd&Hd&#Hd&#Hd&#Hd&4&Hd&NHd&THd&UH@d&gYHd&^Hd&eH@d&eHd&#Hz)NqH)rH )#H")ZH)faH)fH )wH)vyH)މH$)H)H).H,){:H)FH()Hz)KH)H)H )Ue Hg,H>hH>i8^HlH!lpH$zl.H>l8YHmH(nHHnHoH>op&H6pH&pqHr<H rHBr|qH:sL H,s qH9s<}HzsHs(HtHt:H/tGH0uHfHԃt Hԃ4FHԃ LHԃZH@ԃgH. HH. Hz2 H3 H4 H5 HHHHHHTHT*KHTSH@T^HTLHH2z@H H6g'H4 H0HhLHZH`Hz}H~HH*HH H HzHeH"ZH HHHH HHxdHHHH"@H#k'H za(H sH/GH H!bH$H"zKHH2 qHŞHHfaH(fH*R;H DHD #H@D#HDKHD4fH D6qHDCHzDH!H"LH#~H&H)8^H,FH -H2H3KH4H5H6H7p:H 7R;Hzd(xHf`H iyHjyHlp!Hl8YHpXzHr !HtHvHvxdHxHH쩔HH:TH̫HsH6l;HYO_HXѫO H,ZѫhH,\鍒H!)H|,BBn  WTITISYSYOVvpRjtTITIDRDRDBhB   pF|pF P(:u~HVN (Uq8(swxp4'(:dIqLq;}@v0(vXYM`|h    7  !5 j   z J dw fh`   W W W;W! E     P   ȕ  R e   W vW W  4  a( imM?& &  7R  7< w % 7 w<  m%m.M*2v  lb mX mN7F z:&N`  .m(w$7v Vw |EE CC w jE E C & E   e0А  E C    ¥  ¥ Е Pɋ fw f   W K: b^e`  LB$  :"Br wd  f) N B'<  "11 CBBl fD B wT<pbd  f`å00C\V3eaekfåå å å 'b VMR>Pb78 bD 7 5"5,7 \bD7 J 5"5,7 Z bwN VwD  \wP5YmV 5%G`V  R m  e E@e B`  * l  b0 hJwEp     R` w8@     m*E B`eEJ  )p fbCw Rb % Dww 7|w  Dm PP&@A  @mE Е:& .  ¥8¥9& ɋ=     f& &3U#U]RO_tS _"_$-{fXu~ZDF\G g^H\}`J beĊdBxfC h6l;jsl-n˪sp#rtvAqxah zhh|lh.~phrR9Tz}x@(ϫxdϫfѫO ѫBxѫxѫhѫa Zfl.og,hFxZӍZȸ@κԼھ@:^&CE(=&*D:,e.t^0v2v""4v?T68r8|:e<쩔>6@6B6ԀD74F7fH7&JT|LTNmQPqZR[MTz}V'&1 *H "@  $   f# V" B B& B^( NH N Nd! N$ N' ZP &H V# bz b& n: zn r0 j0 bL0 Z0 R0 J8 B L8 : 9 2 <: *"; ":L85ew , Bv    5Bw 00C\\l1DATADATADATADATADATADATADATA:i5  5U  E U *5@*& E& & f&ËDef Ë )̋U&  m  f A N  %&ff &f HzH H HB$"%"**"6,".H N5Hl Zb#&Jf#&Vh#&2lH$nvHy0y0dz|0<zL8L8< :::h::::L8` L8`"L8\.L8:L8p R闠/cP`R]IZ 6闠=U W PwM J d E| Lw Local TI: - Global ȥ=7 B7 @ȥ/$ r5"TIlJ .j=g  [ t M:T Q/NGKBHLE Bb7 ,  eD87 p |Jff  7 0 b TIJw 2& (f  55 7" f w  f  w7 8 NPPA 6 Е:Е ffD7 \w N BЕ *΋8 ֋7 "wr    @A¥Z w <7 7 %7   J %L wx $ x E (&&<(&&X2-H,-D)̵ & $ #-@  %( X> % e%JwwefR( l   T *eH w*77 & U Enter filename: . zSYyIM T  wwH pfCfph F1fȕ  8ww et DR  HZ# N &  V %=SY7 : B 7,\7^LB: B 7,\b7^\v HD  # Pww $n 2* e   0 H -w>#0 7 e e\ w  B* b&߷"p d  L%5R%^>w 0 4"P1eEC` 6J`"e?E?JM J`*n w %p7 jf    J HwTSMHRSIUIC#  & i# tt/3 \0%9" Q @e:NW K UW ;E¥:B UW ;<  j /u $  # *)e !"[ uW ¥,  uW ¥]> =wĝ! "&fj 7z 00C\V3eaekb0  ~R 7V # E C @  ~ p Bu`u 5`Ce    pl~%  u`u 5` ! x  z P Pb5cu 6 2 | $t-t-^   8T!r7H (BA Tu5P  ~U#ˋ#A B  u 5 & f  ~& v z6`N 0 0 0 8 9 L8 L8 : "L8 .l8 :L8 Offline Loaded UnloadedCOMDEVDRIVERDYNAMICMAINSUB SYS TASK 7 7 7Х:k h    w w- J  wbD  Pȕ 3!f&7 6 ( H d55Y  FQ  8 ~wl 4` bw wF - 5  5   Е A Е   .Е "  Е  z-  x5 H- ^r5Xk5  JЕ Е-Е fw0t Е:Z 4Е Е(fw <  $ Е)5c " - g 5     wH *wl1  I q   Е0Е0MAINSUBTOPBOTPARITYSPEEDUICSYSUICNETUICMAXEXTPUBBUFPOOLSIZEPOOLPLCTLWCHKRNDCRNDLRNDHSWPCSWPRLOGONCRTLOWERESCSEQREMOTESLAVEPRIVBROECHOASR33LA30SVT05BFORMFEEDHFILLVFILLTYPEAHEADFORMFEEDWRAPFDXEBCHHTRPAABAUDAVOANSIBLKMODDECEDITREGISSOFTHSYNCTTSYNCPASTHRUPRINTER_PORTASR33KSR33ASR35LA30SLA30PLA36VT05BVT50VT52VT55VT61LA180SLA120LA12LA34LA38LA100LA50LQP01LQP02LN03DTC01LA210LQP03VT100VT101VT102VT105VT125VT131VT132PC3XXVT2XXTERMLINESTASKCOMDEVSYSODDEVEN       @  @    !" HBHBHBPBPBBHP PPPBB0BBB0B0PB0B0B0BB0B0BPPPPPPPPP  +[05075110134.515020030060012001800240048009600EXTAEXTB5075110134.51503006001200180020002400360048007200960005075110134.515030060012001800200024004800720096001920038400##<%D%*)%%%-/&*V+-,J.J.J...-^'^'^'^'^'^'^'^'^'^'^'^'(^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'(&7 8 4:/7NO t 5%<D25&  5%D |"ы ɋw & w(C u wu |  w:~ r z r jrnݗ:oU%ȥ*  @l l  ^U\ 6Y:Vȥ*  T T  FUD (=::{         B#5)    % % 5R%w pd/7 ^+V T& 'C @ U%¥: ȥ- ȥ+ ȥ*  e  w\ dww  C¥A¥Zb[d W b D_,X W VDT]N- -|5IR x972 d b.:+ -j w`& 51$ (5 7e2v 6wN  C 5 %݇w / ,C 5w& N-5 v Z50%%00C\\l1DATADATADATADATADATADATADATAw$ NwNwC fj5w%nw, e e% 5~_7m` b% 7 ٷ  C S% %  ;  b5 ;5@ 7% "5@ ! * f" / | `%!awb%85$ C :5 , e B B C C 03CbPb طC E5 ۿ ȥ0ȥ9 %! K%! ы ɋ \؄En!/!B+E EEE WU & ee`! 0\!U E55+u& _ \C - w&& 5K5 J5@ F"5@ ! *f" < 4 p$¥:! z* ^ @//5@  P77 $ bwd C (5EU@ E E@ ֆ  ׇ U ߇" ( !ȥ*2 T   e? `- j* `dwd Fȥ* &  큀 v5 %5% C ̆H Be?  w zE F nb7 Xf -  N%  # PCM@`Ln H *q 7 w~d CEbP^ 5wP<&C 5@!5%DX%DY%MT%MM%MS  ݇wD5Hb> 2D~ &Du05 7u4u&5 l+w"5@^$ > b& W uW M ۇ5@wHww 5Zw5FC 5 w& $-t T <ۇ &ݗK W   ʋ3  BK :s @ ҋʋ  L0 0 Z1 8 9LB  LB0:x" 7 d/ 7N ~sȕ |nkȕ lfc_$ 4  Tz 43 6:97H67J27Br7Dn7Fj#)7JwH7>w<P@!** #$" w t 7\ b wF %LB- 7ww )( wB00C]V3eaek R> P"5@"^!R" (R"eI ! ` RT# J# B*" :6# 28 *L8 ": .l8 .8&##*##/##3#$7##;#>$?#~$C#2$G#$K#$O#&$PRITASKUICCKPPARPMDINCSLVIOPCLIFIX!   </ " A  < w&w( wVW w!! $ T{ L[p wtW q,e wiW f]ZUUU U@U@U!! LYN(O%UE SE  e wb5%UJ% w` 2L0 *8,N" .T"`wa www `!  " " !5@w ~*,-. 01O2 w|B e26657b : e> !e& ^we e 57U 5@ 55j5e5a5 \ *XE 7.r  7R bw 4 : -t-n"h#-8"/!B$ ZR  5 HU+wz7 t--w$P >|75@(5wp Z55@LU@l5>565UNA @  5  57mBm?5V%8 65 7 @7  w5 5 U 7 5@5U W-`v/ "qwwwwb ~fR5 A A A 55W W wB @5?=w 5  5 "A m,m(eE A A A B 5  B 55 5^ Dw<5 Edb    N%5  5J\ U ` [ wU@H5@E@:5 z+wE"5 U5U N5K55f 5? 555 5@5 5 w`5w`-ws"{ w| w} wv5 <54565UB 2 ( u wz5@P X 5 5 A  llwwTU | eE| xwwe5  b w X7R  e T"2,  Y5WuV ,A  s- I, C5  P w AT :wT wN@5%5  BE 5678 9:;4<c wfס A A A A A A   TB p5R%T X  J R > TU5E  A A A A E E wz eT @E? L X8FBP"ea 7&(#*  W#OVC" |ȕ:" dPT  U% <  ) Lwe     % F p+)%"b >7lw PD #wd!** D D D D D D 5551&$ 0,% "77w71lI t& e 7 2w F b'zE d #N ҇ b@T  eAw  "7 mw  lb w&@T 5:um: u:"m:A< e>`u$C&7 zv7 fbVea eNJ` B7 @5 LW&bD w7 l, f w- Nmf f5 &< 5   5 5 5 (5 mDm  :2b xw}x d Xwe Ne7 64 dVz` E,U( &, 25fb> we &j w5U wJ6 5 ,7  z55E  &zme jjmJ pe Tf#bP   */ ,m &b@@ Ze@@ ew %eD cD J%f,rew ew  ^b 42eD 4b   U   m.D  BE@&  e Z7$h B7T D7 w  7 u w r  dM   $00C]V3eaek7ww$ )( nw"S &&& p&wrw"jw!b@$7 Fw 8w8@A R@m7&h&f )&&  dz&])WT@p& 7lw &$e<p&` f/& & p7$ w  t dȕ   Е. . %$B w#*( && &$r&ea < 7(H @ ( |> wn @0 8Z1 08 (9 L8  9  <: .l85wF wBEU 0 =59m2v D+7 ` @ mf5  7 : m5   D&7 fB CmjC  D t5 $C~ & fn  F8\B u& . b 74x A DAM w7 N C: f  7 p fff x x5J :q55  eNrX 5 0R8  $5W f |(W Q | W K |W ~ WW q |W x  | 7 wM] wW-QW-|L 0w , b 7t -@ ~ h7wwl )( wj"S  2! FIXEDFILE ID:( d7 7 & ,  w ȥ   w` bD7L D5   | w xw-pw-j ff(& N f&fA vA nЕ w\w"Xw!Tw!Hw"D&@$7b wT wT@A @m7B w n%@V 5Dw&> 58m7 $ 3 2!  #2!ppp ) @ TqmI 2 8A <A 4Е B Е H w 0 A A Е W cЕ W Е  Е.Е  PA  @5  0000ȕ0Е НН pЕ:Е- db B B B Ee0P  V! `. "Е,  Е)P!5 6 w$ w:://--JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC;; c w0&   Z0w9w:¥- /;U$$U$$U$$U WU US ¥- RK 0E9A̋;:8¥ ¥ 2 7. 7$ %5%ZZT h x jwv 7z h$ P̋Е AMu 6Е-A W  P$P$P$Е- wJ w&@ e0e0P7$ʋ % ҋ wڡ@7 <@7 ,-V00C]\l1DATADATADATADATADATADATADATAf 7Z  . 0 L0 0 x0 pZ1 h8 `9 X.l8 P   w b 5@@  w8 0wBOOTDENS@p - * K:$5 !  7 lע/ 7 `  |ы ɋע wx ӕ VM =N < 6݇: %DX%DY  W   ע0ӥ9רAӥZDD $ MM@ PP  MS@ CT@DTMT@ DU< D MU@ DXDY, 4  ,%DYn 7 7 Pz 8 %DX%DY e $wC %MM%MUU׭@ wP    @    &  ! !pp  !p!  -! P`@ 50w77 :!  l ]) F  2b!0  J'@ wZJ  T7F- 1-Kw 6fl .rl &~l l l l l l n n l l l l l l 0 8 L8 97w  !@ eDɕɋ Sɵ    z   C0 e! N z _ e W!D 4 @ a   U_7w  !@Dɕɋ Sɵ   d  bV '  e eW! , @ a   U_7(w   C0 e! N z _ e W!D 4 @ a   U  e  (11 50Uɕɋ Eɕ5W,ɋ eɕ_7tw  V '  e eW! , @ a   U 11 Uɕɋ Eɕ5W,ɋ ɕ_00C ]V3eaek7pnw  Rxɋ Ue> S  $  2!e   !     W! eee C0 e! N z _ e W!D 4 @ a   U_7 w  xɋ Ue8 S  $ !e   !    W! eeV '  e eW! , @ a   U_7FRw  "N##$B% 7w5#SMA#UMw 9U Pɋ R`5P 5 MeP7 JNe<7 >eCɋ.*7 ($ ɋ DE%%  UWE%Pm  E e4m  f E   6U T ~z 90 e! z> w8 _ e w!"D  @  2 a   U 9U Pɋ _2 a   U B B B B B D B D 77e<eeQCɋ7 7  ɋ DE%%  UjWpE%PmXR N EB _2 a   UR`1 5P 5 _2 a   UQ00t@KPsP0 f E 7eeePe~ vw`w 7`w`w 7`w`w 7`P H0  V  L% <%  & !  4 4  4m t  B@_7^w  ""##x$$ 7w5#SMA#UMw 9U Pɋ R`5P 5 MeP7 JNe<7 >eCɋ.*7 ($ ɋ DE%%  UWE%Pm  E e4m  f E   6Ujb T RN #: w4  e ew!  @  * a   U 9U Pɋ _* a   Ue7 eeCɋ7 7  ɋ DE%%  UWE%Pmtn j E^ 00C(]\l1DATADATADATADATADATADATADATA" _* a   UR`1 5P 5 _* a   UQ00N%%%KPsP0 f E 7eeePe~7wP H0 SK3s ~  t% d%  N !  4 4  .4m t  rp_  b7`!b & bJJee@fefeU7J`B!  "  e 7&w zKp ͇ %b "H!  E% % e w ,  w|e@_A   b7`!b & bJJee@fefeU7J`B!  "  e 7&w zKp ͇ %b "H!  E% % e w ,  w|e@_A 7w  7 C0 e! N z _ e W!D 4 @ a   U7F P ɕ ɕ  ɕ  I  ɕ I ~I z r a( fɋ `@ VS PS  @ E :@P!  $ɋ Q$e   ~w*DaD 5_7hw  b7V '  e eW! , @ a   U7F P ɕ ɕ  ɕ  I  ɕ ~I tI p h a( \ɋ V@ LS FS  6 E 0@P!  ɋ Q$   w4DaD 5_00C0]V3eaek7w  7 C0 e! N z _ e W!D 4 @ a   U 5 U  7a7b D % D ``` ` U 5155 E 55q5  !mm5UU E_7lw  b7jV '  e eW! , @ a   U 5 U  7a7b D % D ``` ` U 5155 E 55q5  !mm5UU E_7w  7 C0 e! N z _ e W!D 4 @ a   UL0  KPsP7 veR`J `R`J ` R`J `eee6edhP H0 (  4 `! 4 4 4  > 4m t  _7w  d7V '  e eW! , @ a   UL0.! b!  KPsP7eeeZe7whP H0 SK3s(  4 ~! 4 4 4  \ 4m t  _" .#5wh T ~r F pe 8¥: w¥/w@1# ! 0   ¥= x ݇e?ڇ Jw# .#   ć¥= 辇  6w ,w dwR .w-5? 97  w-l, n,p NF ] w  wQVuW wD嗠A¥Zb37t VĜ3E x,   ,3 \5 7f  > t~ 7H 3  VR J"P : #! w %& 1)($" hw&   L *eH w*77 & U:~!!\}!:!a!YM!|!<!t!!%!v:!va!l:!la!h:!ha!j:!ja!z:!za!mƦ!Q!:^!CE!=&!D:!e!t^!v!v""!v?T!8r!|!e!쩔!6!6!6Ԁ!00C8]\l1DATADATADATADATADATADATADATA74!7f!7&!T|!T!mQ!qZ![M!z}!Z"<"ęsySYPARSIZE 2& 2# ># J# 0 L0 d9 8 L8 :L8XXCOM >m(4w . |%05@8 :-""S$"m T Ul6"w"  5 -   ^ & 7~> b A  |-z%%k p 5 2 w7D5 5 "5 5 5 5 5 5  5~&mBm wD- w N7 @7U5 >7x8 R7h B DmAwP C l @B Bm7!XwL7$ R   u7(w 2C w-   w   *  eE  V *K@@ p Z>@ e@ e`w Z #ȝgb wN wH" "w(5n70o"  J wNۡ 7  ۇAwFww *w(777`D g we? w  ÐVT`Pw Jb>Eebb H  .!bb  7F ` ew b $7 b& ~77 Pe,+3 e$5!7e >sΜ &  7 Aaw &ewA  pwjw*7p  f @!Ke A!s X e s B!B7 te B! s  ΊaE Z7 ( RwwV ~j$" w5w!Lw!&Na%vۂ~!  !7 J!B B ~ %= wf) X )  *,*,*,*,*.*,*,*` $ ~!#-@n n(r5op e    l p R!&$ [ X w| $ D< ,5r w%TThn l ^ t %TTK427 d) ww-|,  $ 00C@]V3eaek \ v5** + 0+ +wD+J 6r0+>$6-%(   d  T J : 4  v  h t Pt vbBd f-,hd) dw- F 5@Q$5@Q$5 Q$5`׬* Q$w R,   pw d5@@555 < aF x  2Yz t e w2 wT &bL7L7B7 d) "w-, l -tz e ߁   $4 bw^ 7,z x  Xb*w$h :; P 7> 777  z5H  T 6w -TT Je7t - W wF yrݒwX%TTJ + 7Z #7ND+0+   zU%   `7b>5^Н 6 e 7 8z$Th b " n FlH . ߇d &  ȝB U4 ߇$_ @E  _ @"##### # ###!!!!!!!!!! 8 #"# #$XX:"77 ewr# d He !" <" .# t. |! ~*""1  d#)fdb7|wzP !* "$" w~!  !7 v!n n  %= wfz$  z$  $%%%%%%%` $ ~!#-@n n(r5op Fe  F   4p ,R!&$ [  z7 r¥: Q& "uXY jw>& Z w-5 w 7 77  4w- \ @A 6@mU, ~v4x V`[  b6F 7,0 0  \ x0 7 7E 7 HË t5 7,7z " P( w ,  ,5   e wN%TT@% " E> %TT\w ( " xwn' 9w- "5@Q$5@Q$5 Q$5@׬* Q$ |  6 J# "v ` # + n 7$h  5@@555  a, 7 7n' =w-, < D 3  n @ %TT F vxwbw6z B%w"  t % 7-  -&   f - EUP߷Nw z x w%TT65$2&&ĜwX* (3 ( $5% 70t   >ۅcĊ $XX:"77 ewz( d He !" <" v # b 4! d!* $" 2w~!  !7 !   %= wf*)  00CH]\l1DATADATADATADATADATADATADATA*)  ))))))))` $ ~!#-@n n(r5op e     p |R!&$ [ &>& " " " " " " " " " " " "! " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "!t!{hqb 5b   Е, ݲ p Е]w wp z | d\ > wR  5 x ЕNЕO v  d  Е.w  H  Е.w , $  exebB @   | Е.w O E R x  Е  B wV  5j, exb%&% lt %I 2 8 0  % œ E 5@  *F&  wN5! H D- w t 7 h A @  Е:A ,  0000 FD- #Е:Q5 D5I  V- M , 5  D7 ww [ E E 5@~ F Е:F Е:& Е:& w.  55@  LЕNЕO <S T * Z5 V 6  (\ bDe?  Е:    = -`#()#'%& (!""l$bK   Е.Е:A Е.w -i w P @ bA Е. Е:w 5@5` $ ЕNЕO  ` ` Rb  2D,D&Nv b&>D8D X Е.wPPA Е: ЕNЕOAV Е=  Е:%w7 5,%#%_ %_ r x& l D- jD jD- `w t w-LWw-FS7X @fD    H 7\ @N   - P* @ w b Rw$VN Bfl 6@ B`B%  N 1e - -      B` %%e?  N   x`  hw:%v7t VD7 H w f ·5! 5 00CP]V3eaek&@ Cm@& (4& ,N @ &f 7X 6 DD7 5! C    w  w@ w w@ @m 7f `ז% N Հ5 5 7Vw 2J  $:~ 7 5U@7 A )@ & f ff 6 7w  h5  ߇wHhf 4.&B RR  RR e   %  5  m wb \ f &78 N NmD-7 5! v- B- K-s-5 $ ) % w :B- N r wHj N7Z  0*  B Bm  B Bm VB-  PB- 7 Ԗ IA AmC &@ @m  B  B `*  X% 7 Ԗ A  u sw0f *ݍ   wA#w^  < B-  &$B Aw8 A AmB  B  7R ܡ74 w 5!&7 l5  5 @@m 0 0 Z1 8 9 H7wwL )( (w"S   `V T @wBN LK I  bN( 0> x 9| `0ww"w!@$7 N w @ w@A @m7$> #*(Hw )  |xt)ڇ~@ 7lFw @d@ 5!< e>% @ea d@w j  w" %TI[w 䗠=P w R%TID%TT%NL? r6b7~ @7 l -2B!7R 5!B B 6 7* q C DEFGw 88 0.l8 w  ť ť 0B <Aaw |(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$  *  + 23E Ew 煐   Е-   0@A dW e`fÊ    E  & & @( f  e ee e ABDEFIMNOPQRSTUXYZ<>=MXd^)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA C ed!  aeNb A  Е%̥V P Е Bf B & e$B& e;& e56Hŀ ȕ  nЕ Ћ  Е Е & e & eЕ A %& eA Е Е A A   $Е.  AЕ; 4    A &EA  HE 6Dw D&& bЕ- eae00CX]\l1DATADATADATADATADATADATADATAPPPЕ-$w D  &Е. ce J Е:   `Bw 5 funhj tuhdB$ 8jwaw< 8 v8w &  `*AdBbAep& f  4 P aAAf@pnp dC*8֋ 88*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ ŀajTI& af* v*`V @e,w jjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ \Dllja!CeH###33@#  & 8 *11w z 8jDl@ TeBT85l@ @( D eB& # xAn5j)f & 2/      RՀa@ &:  9 L8 : "L8 "; .l8 :L8w v d) 8C * ) *wx* rep p  C  =  0* = Eե^ A e@ ߇ Ep p  8 V *`)w, C#    D w *D   w *) l0, *) $ )*)0,40,6 e6p 4 8 0  j  J 8  ***  DP5R RRR *0+1(e  @%&p*w f( f)f 8Ae f"( UCɗ&+(e$&% 141612epl2l0p,*1 U4 6w Bfep`pw8e2 8'8;(8O<8cP8wd8x8 8 w 6 dDE%L8!eD 8ywwwwwww8J99Д & WW 7 99Д Bee9 r^X ^7 fLWWW $t @<w^ ,wB8Pv8)wVMR -- *DIAG*-*FATAL*- ݆2 ݒ1 ݶ: : : : : : :00C`]V3eaekeX<Illegal Get Command Line error codeCommand syntax errorSystem image is RSX-11M-PLUSIllegal switchIllegal error severity code %PCommand I/O errorIndirect file open failureIndirect command syntax errorIndirect file depth exceededI/O error on input file %XOpen failure on file %XIllegal file specificationFile %X has inconsistent dataFile %X has illegal formatIllegal functionSyntax errorDevice %2A%O: not in systemInvalid keywordInvalid UIC::::::;%;@;^;{;;;;;<< <<<e<Task image I/O errorToo many lunsTask name already in useTask image currently installedFile not task imageSpecified partition for common blockSpecified partition too smallPrivileged task larger than 12KBase address must be on a 4K boundaryIllegal first APRNot enough APRs for task imagePartition not commonCommon block parameter mismatch %2RCheckpoint area too smallTask and partition bases mismatchUndefined common block %2RCommon block is task partition %2RCommon block not loaded %2RLength mismatch common block %2RBase mismatch common block %2R::::::";@;`;;;;;; <,;[;s;;;;;;<<4<e,=Partition %2R not in system, defaulting to GENLoadable driver support not in systemDriver built with wrong STB fileFile %X not a valid driver task imageIllegal driver task APR usagePartition %2R is a commonDriver already residentDriver requires running system for LOAd/UNLoadDriver not loadedDriver cannot be unloadedDevice %2A%O: is attachedCheckpoint space too small, using checkpoint fileNo checkpoint space, ^assuming not checkpointableReceive data or by reference list not emptyPrivileged task overmaps I/O pageInvalid interrupt vectorInterrupt vector already in useLine not DZ11Invalid speedTask image virtual address overlaps common block %2R:::;*;H;b;z;;;;;! x 2,,  *)  j. 00l  0 *e6p 4 8 (  b ~ B ) d!f 4  e) . e6p 4 08*w) . .0,0, f 톇,, w      .% P eB U5UU  plp & NeՀ)**&f D E/fC A B f&  BeA @0  (@0 a@eA  B0 AB  f  ZC @*141612epl2l0p,*1 U4 6w8 LBfep`pw8e2 0+1(e  @%&p*w^ f( f)f :8Ae f"( UCɗ&+(e$&% &   `@ ` B   & A @    00Cp]V3eaekf&f ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ0נ9נAנZנ_נ:  Vנ[ȕ]נ<ȕ>ȋ8 |נ%נ*נ-נ.נ0נ9נAנZȠ |נ0נ7נ*נ,A lȠj h  qנ"A   #A cנ$נ%נ*נ0נ9נAנZנ_נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (wZנ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0f&f E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D D cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ f 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 w `( D D 8#"#)%ĥ ĥ w 0 *0 @Q$    0 40 60))eB   :# 3&*w ,#( P) @#**fff b r&*wL. P35(8e$8w22&(e f%p8q #)  *R*)@#0l C# 028 00ĥۇAĥĊ  000 0 @0 &*0 @ u # eB&B &B  *  eBe>  # #D #&0 #   :0@e 6@#040 6w!p2w (B C DBe ?D(1 >w eE D` bl lrw   B eE"s    s-  Cslw (BC "& <SY&*p0p21E%0*w8(*e "f D CB.E141612epl2l0p0f(& e %&&eH U   Ef p  wV " f &* *    f bu   *8Ae f"( UCɗ&+(e$&%  Mw 0+1(e  %&p*wd f( f)f @82e&( 0 0 0 80 B0 0 0 0)#0.. 00l  0 *e6p 4 8 b f $ @ ,*1 lU4 6w Bfep`pw8e2 *) 00Cx]\l1DATADATADATADATADATADATADATAl0, *) $ )*)0,40,6 eB  8 X$&w @*   "w $ (ww  ww  ww BC "& <SY&*p0p21E%0*w(*e "f D CB.E    f Pu   w (*#   U@e   ew1  %,,  w *D !UqqC ӥ:  Ce D   (*w *  )Ĕ%.&%;D  5)5@DD ͥ*Ce a%wUX5@ 5U U*U  5@XU@5 U*U  ʥ*%C!.D` *weC5U5  5 5@e**0+1(e  @%&p*w f( f)f 8Ae f"( UCɗ&+(e$&% (*Ge(  1 5&e  1-1- 111 rrrrr &  Be 0 1 w* w &Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ w pف ҥ[, &]  5 s  D w$1 z   1 1 1 1 1 1 DEee $ $ w `*8I *=)98  eB &&  U **e *Nlv ΋*.)  & #!)&eP(e && ~p* w*8Ae f"( UCɗ&+(e$&% 0+1(e  %&p*wr f( f)f N82e&( J0 0 0 80 B0 0 0 0)#0.) . .w LeE D` bl lrw   B eE"s    s-  Csl ) !f  b e) . e6p 4 08*w141612epl2l0p,*18e2  U4 6w0,0, f 톇,, w z     .% > eB U5UU . plp & NeՀ)*00D]V3eaek .TITLE BFCTLP .IDENT /07/ E;N ; COPYRIGHT (C) 1974, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.E;AA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDV9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.R;B ; VERSION 07;.; D. N. CUTLER 26-DEC-73;N; PREVIOUSLY MODIFIED BY:A;R; D. N. CUTLER; T. J. MILLER;1; MODIFIED BY:;A; T. J. MILLER 9-MAY-77E;*; TM082 -- SAVE AND RESTORE R5 IN $BLXIO.;S; T. J. MILLER 14-AUG-77;T;; TM099 -- REMOVE UNEEDED CONDITIONALIZATION FOR RSX-11M+. ; ; J. E. PROVINO 24-JUN-79 ;I:; JP131 -- CHANGE CONDITIONALS FOR NEW REAL TIME DEVICES.;I;D; BUFFER CONTROL ROUTINESL;E; MACRO LIBRARY CALLSA;R .MCALL HWDDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS;+*; **-$GTBYT-GET NEXT BYTE FROM USER BUFFER;FB; THIS ROUTINE IS CALLED TO GET THE NEXT BYTE FROM THE USER BUFFERC; AND RETURN IT TO THE CALLER ON THE STACK. AFTER THE BYTE HAS BEENL0; FETCHED, THE NEXT BYTE ADDRESS IS INCREMENTED.;E ; INPUTS:D;N:; R5=ADDRESS OF THE UCB THAT CONTAINS THE BUFFER POINTERS.; ; OUTPUTS:; <; THE NEXT BYTE IS FETCHED FROM THE USER BUFFER AND RETURNEDC; TO THE CALLER ON THE STACK. THE NEXT BYTE ADDRESS IS INCREMENTED.$;H*; ALL REGISTERS ARE PRESERVED ACROSS CALL.;- .ENABL LSBB0$GTBYT::MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESS* MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING ) MOV U.BUF(R5),KISAR6 ;MAP TO USER BUFFER 8 MOVB @U.BUF+2(R5),4(SP) ;GET NEXT BYTE FROM USER BUFFER* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING. BR 20$ ;TAKE COMMON EXIT FOR ADDRESS UPDATE ;+(; **-$PTBYT-PUT NEXT BYTE IN USER BUFFER;D>; THIS ROUTINE IS CALLED TO PUT A BYTE IN THE NEXT LOCATION IND; USER BUFFER. AFTER THE BYTE HAS BEEN STORED, THE NEXT BYTE ADDRESS; IS INCREMENTED.; ; INPUTS:S;:; R5=ADDRESS OF THE UCB THAT CONTAINS THE BUFFER POINTERS.B; 2(SP)=BYTE TO BE STORED IN THE NEXT LOCATION OF THE USER BUFFER.;F ; OUTPUTS:;B8; THE BYTE IS STORED IN THE USER BUFFER AND REMOVED FROM2; THE STACK. THE NEXT BYTE ADDRESS IS INCREMENTED.; *; ALL REGISTERS ARE PRESERVED ACROSS CALL.;-1$PTBYT::MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING D, MOV U.BUF(R5),KISAR6 ;MAP TO USER BUFFER 3 MOVB 4(SP),@U.BUF+2(R5) ;STORE BYTE IN USER BUFFERE* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING/ MOV (SP)+,(SP) ;COLLAPSE STACK REMOVING BYTE U. BR 20$ ;TAKE COMMON EXIT FOR ADDRESS UPDATE ;+*; **-$GTWRD-GET NEXT WORD FROM USER BUFFER;BB; THIS ROUTINE IS CALLED TO GET THE NEXT WORD FROM THE USER BUFFERC; AND RETURN IT TO THE CALLER ON THE STACK. AFTER THE WORD HAS BEENR/; FETCHED, THE NEXT WORD ADDRESS IS CALCULATED.S;; ; INPUTS:T;P:; R5=ADDRESS OF THE UCB THAT CONTAINS THE BUFFER POINTERS.;( ; OUTPUTS:;)<; THE NEXT WORD IS FETCHED FROM THE USER BUFFER AND RETURNEDB; TO THE CALLER ON THE STACK. THE NEXT WORD ADDRESS IS CALCULATED.;;*; ALL REGISTERS ARE PRESERVED ACROSS CALL.;-2$GTWRD::MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESS * MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING ) MOV U.BUF(R5),KISAR6 ;MAP TO USER BUFFER 7 MOV @U.BUF+2(R5),4(SP) ;GET NEXT WORD FROM USER BUFFERX* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING. BR 10$ ;TAKE COMMON EXIT FOR ADDRESS UPDATE ;+ R(; **-$PTWRD-PUT NEXT WORD IN USER BUFFER;T=; THIS ROUTINE IS CALED TO PUT A WORD IN THE NEXT LOCATION INSD; USER BUFFER. AFTER THE WORD HAS BEEN STORED, THE NEXT WORD ADDRESS; IS CALCULATED.; ; INPUTS:D;O:; R5=ADDRESS OF THE UCB THAT CONTAINS THE BUFFER POINTERS.=; 2(SP)=WORD TO BE STORED IN THE NEXT LOCATION OF THE BUFFER.F; ; OUTPUTS:;(8; THE WORD IS STORED IN THE USER BUFFER AND REMOVED FROM1; THE STACK. THE NEXT WORD ADDRESS IS CALCULATED. ;T*; ALL REGISTERS ARE PRESERVED ACROSS CALL.;-1$PTWRD::MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING , MOV U.BUF(R5),KISAR6 ;MAP TO USER BUFFER 1 MOV 4(SP),@U.BUF+2(R5);STORE WORD IN USER BUFFERN* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING/ MOV (SP)+,(SP) ;COLLAPSE STACK REMOVING WORD 610$: INC U.BUF+2(R5) ;CALCULATE ADDRESS OF NEX00D]E]l1DATADATADATADATADATADATADATAT WORD 320$: INC U.BUF+2(R5) ;INCREMENT NEXT BYTE ADDRESS H2 CMP U.BUF+2(R5),#160000 ;OVERFLOW 28K BOUNDARY?  BLO 30$ ;IF LO NOX% SUB #20000,U.BUF+2(R5) ;REDUCE BY 4KL+ ADD #200,U.BUF(R5) ;ADJUST RELOCATION BIAS30$: RETURN S .DSABL LSBE;+2; **-$GTCWD-GET NEXT WORD FROM USER CONTROL BUFFER;C; THIS ROUTINE IS CALLED TO GET THE NEXT WORD FROM THE USER CONTROL E; BUFFER AND RETURN IT TO THE CALLER ON THE STACK. AFTER THE WORD HAS 4; BEEN FETCHED, THE NEXT WORD ADDRESS IS CALCULATED.; ; INPUTS:U;F:; R5=ADDRESS OF THE UCB THAT CONTAINS THE BUFFER POINTERS.;0 ; OUTPUTS:;BD; THE NEXT WORD IS FETCHED FROM THE USER CONTROL BUFFER AND RETURNEDB; TO THE CALLER ON THE STACK. THE NEXT WORD ADDRESS IS CALCULATED.;*; ALL REGISTERS ARE PRESERVED ACROSS CALL.;-1 .IF DF A$$D01!A$$F11!I$$CAD!U$$ADM!I$$PAD!I$$P14 0$GTCWD::MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESS* MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING 1 MOV U.CBF(R5),KISAR6 ;MAP TO USER CONTROL BUFFERR7 MOV @U.CBF+2(R5),4(SP) ;GET NEXT WORD FROM USER BUFFERH* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING5 ADD #2,U.CBF+2(R5) ;CALCULATE ADDRESS OF NEXT WORD S/ BIT #20000,U.CBF+2(R5) ;OVERFLOW 4K BOUNDRY? N BEQ 10$ ;IF EQ NOW+ BIC #20000,U.CBF+2(R5) ;CLEAR OVERFLOW BITR+ ADD #200,U.CBF(R5) ;ADJUST RELOCATION BIAS 10$: RETURN ;  .ENDC;+; **-$BLXIO-MOVE BLOCK OF DATA.L;TC; THIS ROUTINE IS CALLED TO MOVE DATA IN MEMORY IN A MAPPED SYSTEM.C;R ; INPUTS:M;T; R0=NUMBER OF BYTES TO MOVE..; R1=SOURCE APR5 BIAS.; R2=SOURCE DISPLACEMENT.M; R3=DESTINATION APR6 BIAS.E; R4=DESTINATION DISPLACEMENT.;L ; OUTPUTS:;O!; DESCRIBED MOVE IS ACCOMPLISHED.(; R0 ALTERED D; R1,R3 PRESERVED 8; R2,R4 POINT TO LAST BYTE OF SOURCE AND DESTINATION + 1 ; ?; NOTE: THE COUNT INPUT IN R0 MUST NOT BE ZERO AND IT MUST NOT ;; BE LARGE ENOUGH TO CROSS APR BOUNDARIES (THIS TYPICALLY D!; MEANS A MAXIMUM OF 4K-63). ;- !$BLXIO::MOV R5,-(SP) ;SAVE R5 T( MOV #KISAR6,R5 ;POINT TO KERNAL APR6 $ MOV (R5),-(SP) ;SAVE KERNAL APR6 / MOV R3,(R5) ;SET UP KERNAL APR6 FOR TRANSFER % MOV -(R5),-(SP) ;SAVE KERNAL APR5 P/ MOV R1,(R5) ;SET UP KERNAL APR5 FOR TRANSFER 2 .IF NDF N$$MOVY%10$: MOVB (R2)+,(R4)+ ;MOVE NEXT BYTE  DEC R0 ;MORE TO MOVE?U BNE 10$ ;IF NE YES .IFF MOV #1,-(SP) ;PUSH LOW BIT MASK" BIT (SP),R2 ;SOURCE ADDRESS ODD? BEQ 10$ ;IF EQ NOO" MOVB (R2)+,(R4)+ ;MOVE FIRST BYTE DEC R0 ;REDUCE COUNT+10$: BIT (SP),R4 ;DESTINATION ADDRESS ODD? ( BNE 50$ ;IF NE YES, PERFORM BYTE MOVES)20$: SUB #N$$MOV*2,R0 ;MOVE ENTIRE BLOCK?F BCC 40$ ;IF CC YES# BIC R0,(SP) ;REMAINING COUNT ODD?  BNE 30$ ;IF NE NOO DEC R0 ;ADJUST NEGATIVE COUNTN-30$: SUB R0,PC ;INDEX INTO MOVE INSTRUCTIONSB40$: ;REF LABEL .REPT N$$MOV$ MOV (R2)+,(R4)+ ;MOVE A WORD, .ENDR BCC 20$ ;IF CC MORE TO GOU" BR 80$ ;EXIT THROUGH COMMON CODE50$: ASL R0 ;DOUBLE COUNT)60$: SUB #N$$MOV*2,R0 ;MOVE ENTIRE BLOCK?T BCC 70$ ;IF CC YES. SUB R0,PC ;ELSE INDEX INTO MOVE INSTRUCTIONS70$: ;REF LABEL .REPT N$$MOVN MOVB (R2)+,(R4)+ ;MOVE A BYTE .ENDR BCC 60$ ;IF CC MORE TO GOE80$: TST (SP)+ ;POP CONSTANTU BNE 90$ ;IF NE NO MORE TO MOVE! MOVB (R2)+,(R4)+ ;MOVE LAST BYTE090$: ;REF LABEL .ENDC( MOV (SP)+,(R5)+ ;RESTORE KERNAL APR5 ' MOV (SP)+,(R5) ;RESTORE KERNAL APR6 B MOV (SP)+,R5 ;RESTORE R5 E RETURN ; .END SUB #N$$MOV*2,R0 ;MOVE ENTIRE BLOCK?T BCC 7 .TITLE CTDRV .IDENT /08/;; COPYRIGHT (C) 1974, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 08;; D. N. CUTLER 13-MAR-74;; PREVIOUSLY MODIFIED BY:;; P. J. BEZEREDI; D. N. CUTLER; C. A. D'ELIA ; B. LYONS;; MODIFIED BY:;; P. J. BEZEREDI 05-JUL-78;9; PB079 -- INSURE R2 CONTAINS CSR ADDRESS BEFORE LOGGING ; 00E]V3eaek AN ERROR.T;; P. J. BEZEREDI 18-JUL-78;H7; PB081 -- EXPAND I/O ACTIVITY IMFORMATION REPORTED ATD; TIME OF AN ERROR.F;R&; TA11 TAPE CASSETTE CONTROLLER DRIVER; @; NOTE: THIS IS A MINIMAL DRIVER AND CONTAINS NO ERROR RECOVERY.;; MACRO LIBRARY CALLS ;N .MCALL HWDDF$,PKTDF$ $ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS; ; ERROR PROCESSING CONTROL TABLE;.2ERRTB: .BYTE IE.DNR&377,1000/400 ;DEVICE NOT READY/ .BYTE IE.WLK&377,10000/400 ;DRIVE WRITE LOCKED( .BYTE IE.EOT&377,20000/400 ;END OF TAPE' .BYTE IE.EOF&377,4000/400 ;END OF FILEO( .BYTE IE.DAO&377,2000/400 ;DATA OVERRUN( .BYTE IE.VER&377,377 ;BLOCK CHECK ERROR; ; LEGAL FUNCTION DISPATCH TABLEA; (LGFCN: .WORD IO.RLB ;READ LOGICAL BLOCK .BYTE 105,10. ;W .WORD RDBLK ;D# .WORD IO.WLB ;WRITE LOGICAL BLOCKT .BYTE 103,10. ;A .WORD WRBLK ; ! .WORD IO.EOF ;WRITE END OF FILE .BYTE 101,10. ;I .WORD WREOF ;0 .WORD IO.RWD ;REWIND .BYTE 117,34. ;/ .WORD WREOF ;L .WORD IO.SPB ;SPACE BLOCK0 .BYTE 115,128. ; .WORD SPCBK ;, .WORD IO.SPF ;SPACE FILE .BYTE 113,128. ;4 .WORD SPCBK ;;E; DRIVER DISPATCH TABLEE;E( DDT$ CT,T$$A11 ;GENERATE DISPATCH TABLE;+2; **-CTINI-TA11 TAPE CASSETTE CONTROLLER INITIATOR;1H; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUEG; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE1H; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN AH; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IH; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER>; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.;I ; INPUTS:E;:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;H ; OUTPUTS:;NB; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAB; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OP; ATION IS INITIATED.E;- .ENABL LSBS=CTINI: GTPKT$ CT,T$$A11,CTPWF ;GET NEXT I/O PACKET TO PROCESS.; 1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:E;T'; R1=ADDRESS OF THE I/O REQUEST PACKET.R-; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.I; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.E:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;ID; TA11 TAPE CASSETTE FUNCTION INDEPENDENT I/O REQUEST PACKET FORMAT:;E"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK.T@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.B; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR TASK HEADEB; WD. 05 -- I/O FUNCTION CODE (IO. RLB 1 IO.RWD/IO.SPB/IO.SPF/IO.E0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.B; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140003; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.U; - MOV #LGFCN,R3 ;POINT TO LEGAL FUNCTION TABLE + MOV #6,R0 ;SET NUMBER OF ENTRIES IN TABLE-.10$: CMP I.FCN(R1),(R3)+ ;FUNCTION CODE MATCH? BEQ 20$ ;IF EQ YES+ CMP (R3)+,(R3)+ ;POINT TO NEXT TABLE ENTRYK! DEC R0 ;ANY MORE TABLE ENTRIES?D BGT 10$ ;IF GT YES0 MOV #IE.IFC&377,R0 ;SET ILLEGAL FUNCTION STATUS BR 50$ ;FINISH IN COMMON CODEO;N; FUNCTION CODE MATCH FOUND ; ,20$: SWAB R2 ;SWAP UNIT NUMBER TO LEFT BYTE- BISB (R3)+,R2 ;MERGE FUNCTION CODE WITH UNITT( MOVB (R3)+,S.ITM(R4) ;SPACING FUNCTION? BPL 30$ ;IF PL NOO;L/; SPACING FUNCTION DEPENDENT I/O PACKET FORMAT:;:@; WD. 12 -- SPACING COUNT (POSITIVE=FORWARD, NEGATIVE=BACKWARD).; WD. 13 -- NOT USED. ; WD. 14 -- NOT USED.D; WD. 15 -- NOT USED.E; WD. 16 -- NOT USED. ; WD. 17 -- NOT USED.7; WD. 20 -- NOT USED.O;T5 BISB #S3.SIP,S.ST3(R4) ;SET POSITIONING IN PROGRESSC= MOV U.BUF(R5),I.PRM+4(R1) ;MOVE SPACING COUNT TO COMMON PLAC < MOV U.BUF(R5),U.CNT(R5) ;MOVE SPACING COUNT TO COMMON PLACE$ BEQ 40$ ;IF EQ NO SPACING REQUIRED BPL 30$ ;IF PL SPACE FORWARD00E]]l1DATADATADATADATADATADATADATA) NEG U.CNT(R5) ;CONVERT TO POSITIVE COUNT:+ NEG I.PRM+4(R1) ;CONVERT TO POSITIVE COUNT,( SUB #4,R2 ;CONVERT TO REVERSE FUNCTION; :; READ/WRITE LOGICAL FUNCTION DEPENDENT I/O PACKET FORMAT:;S+; WD. 12 -- RELOCATION BIAS OF DATA BUFFER. ; WD. 13 -- DATA BUFFER ADDRESS.-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.R; WD. 15 -- NOT USED.A; WD. 16 -- NOT USED.A; WD. 17 -- NOT USED.T; WD. 20 -- NOT USED.T; H; NO FUNCTION DEPENDENT PARAMETERS ARE REQUIRED FOR REWIND AND WRITE EOF;R?30$: MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNT;2 MOV (R3),U.CW2(R5) ;SET INITIAL INTERRUPT ADDRESS( CALL $BMSET ;SET I/O ACTIVE IN BIT MAP% MOV R2,@S.CSR(R4) ;INITIATE FUNCTION:;8; CANCEL I/O OPERATION IS A NOP FOR TA11 TAPE CASSETTES.;ACTCAN: ;REF LABEL; H; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUH; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDIT3; THAT COULD EXIST IN RESTARTING THE I/O OPERATION.I;ECTPWF: RETURN ;.;4; NO SPACING REQUIREDT;V940$: MOV #IS.SUC&377,R0 ;SET SUCCESSFUL COMPLETION STATUST50$: BR 110$ ;B;+4; **-$CTINT-TA11 TAPE CASSETTE CONTROLLER INTERRUPTS;-5 INTSE$ CT,PR6,T$$A11 ;;;GENERATE INTERRUPT SAVE CODET MOV R3,-(SP) ;;;SAVE R3' MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCBN> MOVB S.ITM(R4),S.CTM(R4) ;;;RESET CURRENT DEVICE TIMEOUT COUN' MOV S.CSR(R4),R3 ;;;GET ADDRESS OF CSR $ BIT #200,(R3)+ ;;;TRANSFER REQUEST? BNE 60$ ;;;IF NE YES, MOV -2(R3),U.CW3(R5) ;;;SAVE CURRENT STATUS.60$: CALL @U.CW2(R5) ;;;CALL INTERRUPT ROUTINE. BIS #S2.ACT,S.ST2(R4) ;;;SET I/O ACTIVE FLAG5 MOV (SP)+,U.CW2(R5) ;;;SAVE INTERRUPT RETURN ADDRESSR MOV (SP)+,R3 ;;;RESTORE R3E# JMP $INTXT ;;;EXIT FROM INTERRUPT ;C#; SPACING FUNCTION (FILE AND BLOCK)U;BSPCBK: BMI 70$ ;;;IF MI ERROR) DEC U.CNT(R5) ;;;DECREMENT SPACING COUNTV BLE 70$ ;;;IF LE DONEC& INC -(R3) ;;;INITIATE NEXT OPERATION- CALL @(SP)+ ;;;SET INTERRUPT RETURN ADDRESS  BR SPCBK ;;;GO AGAIN)70$: CLR -(R3) ;;;CLEAR INTERRUPT ENABLEC' TST (SP)+ ;;;REMOVE RETURN FROM STACK2 MOV (SP)+,R3 ;;;RESTORE R3T' CALL $FORK ;;;CREATE A SYSTEM PROCESST# MOV U.CW3(R5),R1 ;GET FINAL STATUS  BPL 90$ ;IF PL SUCCESS. BICB #^C<7*2>,R1 ;CLEAR ALL BUT FUNCTION CODE, CMPB #5*2,R1 ;FORWARD OR REVERSE FUNCTION? BLE 100$ ;IF LE FORWARDR5 BIC #120777,R1 ;CLEAR ERROR, BOT, UNIT, AND FUNCTIONC BEQ 40$ ;IF EQ NO ERRORS BR 100$ ;ANALYZE ERROR;S; READ LOGICAL FUNCTIONS; RDBLK: BMI WREOF ;;;IF MI ERROR& DEC U.CNT(R5) ;;;DECREMENT BYTE COUNT" BLT 80$ ;;;IF LT NO MORE TO READ/ MOV (R3),-(SP) ;;;READ BYTE FROM DATA REGISTERE( CALL $PTBYT ;;;PUT BYTE IN USER BUFFER- CALL @(SP)+ ;;;SET INTERRUPT RETURN ADDRESS  BR RDBLK ;;;GO AGAIN;N; WRITE LOGICAL FUNCTION;O WRBLK: BMI WREOF ;;;IF MI ERROR& DEC U.CNT(R5) ;;;DECREMENT BYTE COUNT# BLT 80$ ;;;IF LT NO MORE TO WRITEB* CALL $GTBYT ;;;GET BYTE FROM USER BUFFER1 MOVB (SP)+,(R3) ;;;WRITE BYTE INTO DATA REGISTER:- CALL @(SP)+ ;;;SET INTERRUPT RETURN ADDRESSE BR WRBLK ;;;GO AGAIN'80$: INC U.CNT(R5) ;;;ADJUST BYTE COUNT,- BIS #20,-(R3) ;;;INITIATE LAST BYTE SEQUENCEP- CALL @(SP)+ ;;;SET INTERRUPT RETURN ADDRESS ;T(; REWIND AND WRITE END OF FILE FUNCTIONS;A+WREOF: CLR -(R3) ;;;CLEAR INTERRUPT ENABLEL' TST (SP)+ ;;;REMOVE RETURN FROM STACKR MOV (SP)+,R3 ;;;RESTORE R3B' CALL $FORK ;;;CREATE A SYSTEM PROCESS <90$: MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL COMPLETION STATUS# MOV U.CW3(R5),R1 ;GET FINAL STATUSP BPL 110$ ;IF PL SUCCESS +100$: SWAB R1 ;SWAP ERROR BITS TO LOW BYTEC2 MOV #ERRTB,R2 ;GET ADDRESS OF ERROR CONTROL TABLE,105$: CLR R0 ;PICKUP NEXT ERROR STATUS CODE BISB (R2)+,R0 ; BITB (R2)+,R1 ;ERROR BIT SET? BEQ 105$ ;IF EQ NO. BITB #26,R1 ;WRITE LOCK, TIMING OR OFF-LINE? BEQ 110$ ;IF EQ NO' MOV S.CSR(R4),R2 ;RETREIVE CSR ADDRESS  CALL $DVERR ;LOG DEVICE ERRORR BR 110$ ;FINISH I/O;MH; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING TERMINATED. TIMEF; USUALLY CAUSED BY POWERF00E]F]G]eaekAILURE BUT ALSO MAY BE THE RESULT OF A HARD-; WARE FAILURE.T;)CTOUT: CALL $DTOER ;;;LOG DEVICE TIMEOUTT6110$: MOV S.PKT(R4),R1 ;RETRIEVE ADDRESS OF I/O PACKET7 BICB #S3.SIP,S.ST3(R4) ;RESET POSITIONING IN PROGRESS;- MOV I.PRM+4(R1),R1 ;GET ORIGINAL COUNT VALUEO+ SUB U.CNT(R5),R1 ;SUBTRACT COUNT REMAINING)2 MOV #401,R2 ;SET CURRENT AND FINAL RETRY COUNT=1# CALL $IODON ;FINISH I/O OPERATIONM JMP CTINI ;GO AGAINL .DSABL LSBR .ENDTION BEING TERMINATED. TIMEF; USUALLY CAUSED BY POWERF .TITLE CVRTM .IDENT /02/ ;; ; COPYRIGHT (C) 1974, 1976, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;.A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED$9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.M;R ; VERSION 02;I; D. N. CUTLER 12-AUG-73;,; PREVIOUSLY MODIFIED BY:;V; D. N. CUTLER;E; MODIFIED BY:;R;+; **-$CVRTM-CONVERT TIME;;C; THIS ROUTINE IS CALLED TO CONVERT A TIME INTERVAL-TIME UNITS PAIRR; TO A CLOCK TICKS COUNT.P; ; INPUTS:T;.; R3=ADDRESS OF TIME INTERVAL-TIME UNITS PAIR.;9 ; OUTPUTS:;Q7; IF AN ILLEGAL TIME INTERVAL (GREATER THAN 15 BITS) OR ;; ILLEGAL TIME UNITS (ZERO OR GREATER THAN 4) IS SPECIFIED,E;; THEN A DIRECTIVE STATUS OF 'D.RS93' IS RETURNED. ELSE THEO<; TICKS COUNT IS RETURNED WITH THE HIGH ORDER PART IN R0 AND=; THE LOW ORDER PART IN R1. R3 IS ADVANCED BY 4 THUS POINTINGT); PAST THE TIME INTERVAL-TIME UNITS PAIR.D;-'$CVRTM::MOV (R3)+,R1 ;GET TIME INTERVAL & BMI 70$ ;IF MI ILLEGAL TIME INTERVAL MOV (R3)+,R0 ;GET TIME UNITSR DEC R0 ;BACK OFF BY ONE  CMP R0,#3 ;LEGAL UNITS?A BHI 70$ ;IF HI NOT# ASL R0 ;CONVERT TO DISPATCH INDEXU ADD R0,PC ;DISPATCHH10$: BR 50$ ;1=TICKS  BR 30$ ;2=SECONDSU BR 20$ ;3=MINUTESR MOV #60.,R0 ;4=HOURS( CALL $MUL ;CALCULATE NUMBER OF MINUTES TST R0 ;OVERFLOW 16 BITS?A BNE 70$ ;IF NE YES120$: CMP R1,#1440. ;MORE THAN ONE DAY OF MINUTES?M BHI 70$ ;IF HI YES( MOV #30.,R0 ;MULTIPLY BY 60. SECONDS/2- CALL $MUL ;PRODUCT CANNOT OVERFLOW 16 BITS.3# MOV $TKPS,R0 ;GET TICKS PER SECONDK ASL R0 ;MULTIPLY BY 2 BR 40$ ;'30$: MOV $TKPS,R0 ;GET TICKS PER SECONDR&40$: CALL $MUL ;CALCULATE TICKS COUNT"50$: MOV R0,R2 ;TICKS COUNT ZERO? BIS R1,R2 ; BNE 60$ ;IF NE NO INC R1 ;MAKE TICKS COUNT 160$: RETURN ;N(70$: DRSTS D.RS93 ;SET DIRECTIVE STATUS .ENDE 70$ ;IF NE YES120$: CMP R1,#1440. ;MORE THAN ONE DAY OF MINUTES?M BHI 70$ ;IF HI YES( MOV #30.,R0 ;MULTIPLY BY 60. SECONDS/2- CALL $MUL ;PRODUCT C .TITLE DKDRV .IDENT /09/;; COPYRIGHT (C) 1974, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 09;; D. N. CUTLER 19-OCT-73;; PREVIOUSLY MODIFIED BY:;; P. J. BEZEREDI; D. N. CUTLER; C. A. D'ELIA;; MODIFIED BY:;; P. J. BEZEREDI 14-DEC-77;6; PB050 -- REMOVE UNNEEDED CONDITIONALS FOR RSX-11M+.;; P. J. BEZEREDI 21-AUG-78;6; PB083 -- ADDITION OF SOFTWARE VOLUME VALID SUPPORT.; ; P. J. BEZEREDI 06-OCT-78; 1; PB089 -- MAKE USE OF EXTENDED INSTRUCTION SET.C;E;D; RK11 CARTRIDGE DISK DRIVER;N; MACRO LIBRARY CALLSR;O .MCALL HWDDF$,PKTDF$E$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;J; EQUATED SYMBOLS ;LRETRY=8. ;ERROR RETRY COUNTD; ; LOCAL DATA;E>; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);1<RTTBL: .BLKW R$$K11 ;ERROR RETRY COUNT AND DRIVE RESET FLAG;A; DIAGNOSTIC FUNCTION TABLE;.!FUNTBL: .WORD IO.HMS!IQ.UMD, 05159 .WORD IO.BLS!IQ.UMD, 0511!FUNTB0: .WORD IO.RDH!IQ.UMD, 2505R .WORD IO.WDH!IQ.UMD, 2503 .WORD IO.WCK!IQ.UMD, 0507FUNTBE:$;E; DRIVER DISPATCH TABLEA;R( DDT$ DK,R$$K11 ;GENERATE DISPATCH TABLE;+3; **-DKINI-RK11 CARTRIDGE DISK CONTROLLER INITIATOR ;NH; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUEG; IS QUEUED AND AT THE END OF A PREVIOUS I00G]]l1DATADATADATADATADATADATADATA/O OPERATION TO PROPAGATE THE H; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN AH; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IH; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER>; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.;P ; INPUTS:;+:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;H ; OUTPUTS:;NB; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAB; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OP; ATION IS INITIATED.E;- .ENABL LSBS=DKINI: GTPKT$ DK,R$$K11,DKCAN ;GET NEXT I/O PACKET TO PROCESS.; 1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:E;T'; R1=ADDRESS OF THE I/O REQUEST PACKET.R-; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.I; R3=CONTROLLER INDEX.(; R4=ADDRESS OF THE STATUS CONTROL BLOCK:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;E0; RK11 CARTRIDGE DISK I/O REQUEST PACKET FORMAT:;A"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK.A@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.B; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR TASK HEADE1; WD. 05 -- I/O FUNCTION CODE (IO.RLB OR IO.WLB).I0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.B; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140003; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.A; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER.S+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.3-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.K; WD. 15 -- NOT USED.O9; WD. 16 -- LOW BYTE MUST BE ZERO AND HIGH BYTE NOT USED. 0; WD. 17 -- LOGICAL BLOCK NUMBER OF I/O REQUEST.A; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. ADRS ELSE NOT USEDN<; WD. 21 -- DIAGNOSTIC REG. BLK ADRS (REAL OR DISPL.+140000);(= MOV #RETRY&377,RTTBL(R3) ;CLEAR POSITIONING AND SET RETRIESS$ CALL $VOLVD ;VALIDATE VOLUME VALID BCS 8$ ;IF CS WE FAILED) TST R0 ;TRANSFER FUNCTION? BMI 1$ ;IF MI YES/ TST I.PRM+2(R1) ;SIZE THE DISK? BPL 8$ ;IF PL NO# ASH #13.,R2 ;POSITION UNIT NUMBER ' MOV S.CSR(R4),R0 ;RETREIVE CSR ADDRESS  MOV R2,6(R0) ;SELECT THE DRIVEL MOV R0,R2 ;COPY CSR ADDRESSD# JMP 130$ ;PASS REGISTERS AND EXIT 1$: ;REF LABELU .IF DF M$$EXT, CALL $STMAP ;SET UP UNIBUS MAPPING ADDRESS .ENDC8 CMPB #IO.HMS/^D<256>,I.FCN+1(R1) ;DIAGNOSTIC FUNCTION? BNE 5$ ;IF NE NO. MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE-2$: CMP (R0)+,I.FCN(R1) ;FUNCTION CODE MATCH? BEQ 3$ ;IF EQ YESE# TST (R0)+ ;BYPASS CONTROLLER CODE#' CMP #FUNTBE,R0 ;END OF FUNCTION TABLE?R BEQ 5$ ;IF EQ YES  BR 2$ ;TRY AGAIN)3$: CMP R0,#FUNTB0 ;POSITIONING FUNCTION?S BHI 4$ ;IF HI NO6 INCB RTTBL+1(R3) ;YES, INDICATE POSITIONING OPERATION44$: BIS (R0),U.BUF(R5) ;SET CONTROLLER FUNCTION BITS BR 10$ ;GO CHECK BLOCK NUMBERM/5$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTIONE1 BIS #505,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTIONC6 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?% BHIS 9$ ;IF HIS FUNCTION IS ILLEGALB8$: JMP 120$ ;EXIT#,9$: BEQ 10$ ;IF EQ FUNCTION IS READ LOGICAL4 SUB #2,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTION-10$: CALL $BLKCK ;CHECK LOGICAL BLOCK NUMBERO+ CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBERG TST R1 ;WHICH SURFACE? BEQ 15$ ;IF EQ SURFACE 0 BIS #20,R0 ;SET SURFACE 1 BITO-15$: MOVB U.UNIT(R5),R1 ;RETREIVE UNIT NUMBERG( ASH #13.,R1 ;POSITION UNIT SELECT BITS% ASH #5,R2 ;POSITION CYLINDER NUMBER51 BIS R1,R2 ;MERGE UNIT BITS WITH CYLINDER NUMBERI( BIS R0,R2 ;MERGE TRK/SEC WITH CYLINDER0 MOV R2,I.PRM+10(R3) ;SAVE STARTING DISK ADDRESS;S; INITIATE I/O OPERATION;R30$: ;REF LABEL .IF DF M$$EXT% CALL $MPUBM ;MAP UNIBUS TO TRANSFER  .ENDC% MOV S.CSR(R4),R2 ;GET ADDRESS OF CSRC9 MOV S.PKT(R4),R1 ;RETRIEVE ADDRESS OF I/O REQUEST PACKET ; MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUN00G]]G]eaekT3+ ADD #6,R2 ;POINT TO DISK ADDRESS REGISTER , MOV I.PRM+10(R1),(R2) ;INSERT DISK ADDRESS. MOV U.BUF+2(R5),-(R2) ;INSERT BUFFER ADDRESS8 MOV U.CNT(R5),-(R2) ;INSERT NUMBER OF BYTES TO TRANSFER! ROR (R2) ;CONVERT TO WORD COUNTE$ NEG (R2) ;MAKE NEGATIVE WORD COUNT TST -(R2) ;POINT BACK TO CSR+ MOV #IE.DNR&377,R0 ;ASSUME DRIVE NOT READY TSTB -4(R2) ;IS DRIVE READY? BMI 31$ ;IF MI YES/ BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP?M BNE 35$ ;IF NE YES/ BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC OPERATION?  BNE 51$ ;IF NE YES# CALL $DVERR ;LOG DEVICE NOT READYI JMP 110$ ;FINISH UPV531$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UPR( CALL $BMSET ;SET I/O ACTIVE BIT IN MAP+ MOV U.BUF(R5),(R2) ;;;LOAD FUNCTION AND GO(;;<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;E#DKCAN: RETURN ;;;NOP FOR THE RK11T;+:; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND>; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT=; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVES?; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANY1A; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESS ; THE UNIT IS ALREADY READY.;-3DKPWF: TSTB S.STS(R4) ;IS THE DRIVE CURRENTLY BUSY?I BEQ 36$ ;IF EQ NO 0 MOVB #3,S.STS(R4) ;WAIT A MAXIMUM OF 45 SECONDS.35$: MOVB #15.,S.CTM(R4) ;15 SECONDS AT A TIME236$: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UP RETURNT;+*; **-$DKINT-RK11 DISK CONTROLLER INTERUPTS;-8 INTSE$ DK,PR5,R$$K11 ;;;SAVE REGISTERS AND SET PRIORITY- TSTB RTTBL+1(R4) ;;;DRIVE RESET IN PROGRESS?E BEQ 50$ ;;;IF EQ NO & MOV R4,-(SP) ;;;SAVE CONTROLLER INDEX' MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCBD) MOV @S.CSR(R4),R4 ;;;GET CONTENTS OF CSRV$ BMI 40$ ;;;IF MI DRIVE RESET ERROR' BIT #20000,R4 ;;;DRIVE RESET COMPLETE?  BNE 40$ ;;;IF NE YES TST (SP)+ ;;;CLEAN STACK RETURN ;;;S-40$: MOV (SP)+,R4 ;;;RESTORE CONTROLLER INDEXT+50$: CALL $FORK ;;;CREATE A SYSTEM PROCESSI" MOV R4,R3 ;COPY CONTROLLER INDEX% MOV U.SCB(R5),R4 ;GET ADDRESS OF SCBT% MOV S.CSR(R4),R2 ;GET ADDRESS OF CSRE/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERV) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESST7 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION EXECUTED?S51$: BNE 130$ ;IF NE YESE TST (R2) ;ANY ERRORS?, BPL 65$ ;IF PL NOP CALL $DVERR ;LOG DEVICE ERRORT* MOV -2(R2),R1 ;SAVE ERROR STATUS REGISTER-53$: MOV S.PKT(R4),R0 ;GET I/O PACKET ADDRESS0& BITB #IQ.X,I.FCN(R0) ;INHIBIT RETRIES BNE 80$ ;IF NE YES" DECB RTTBL(R3) ;ANY MORE RETRIES? BLE 80$ ;IF LE NO MOV #1,(R2) ;CLEAR CONTROLLER 9 CLRB RTTBL+1(R3) ;CLEAR POSSIBLE DRIVE RESET IN PROGRESSV*55$: BIT #110000,R1 ;DRIVE RESET REQUIRED? BEQ 70$ ;IF EQ NO;560$: MOVB #1,RTTBL+1(R3) ;SET DRIVE RESET IN PROGRESSE. MOVB S.ITM(R4),S.CTM(R4) ;RESET TIMEOUT COUNT, MOV S.PKT(R4),R1 ;GET ADDRESS OF I/O PACKET0 MOV I.PRM+10(R1),6(R2) ;SET PROPER DRIVE NUMBER MOV #515,(R2) ;RESET DRIVES RETURN ;./65$: ASRB RTTBL+1(R3) ;DRIVE RESET IN PROGRESS?S BCC 75$ ;IF CC NOY70$: JMP 30$ ;RETRY FUNCTIONE975$: BITB #IO.WLC&377,I.FCN(R1) ;WRITE WITH WRITE CHECK?E BNE 76$ ;IF NE YES- BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED?T BEQ 110$ ;IF EQ NO076$: MOV U.BUF(R5),R1 ;GET CURRENT FUNCTION CODE- BIT #1*2,R1 ;WRITE OR WRITE CHECK FUNCTION?S BEQ 110$ ;IF EQ NO- BIS #2*2,U.BUF(R5) ;SET WRITE CHECK FUNCTIONI* BIT #2*2,R1 ;WAS FUNCTION A WRITE CHECK? BNE 110$ ;IF NE YESR4 MOV #RETRY&377,RTTBL(R3) ;REINITIALIZE RETRY COUNT% BR 70$ ;START WRITE CHECK OPERATION0080$: MOV #IE.WLK&377,R0 ;ASSUME WRITE LOCK ERROR! BIT #20000,R1 ;WRITE LOCK ERROR?K BNE 110$ ;IF NE YESS- MOV #IE.WCK&377,R0 ;ASSUME WRITE CHECK ERRORT ASR R1 ;GOOD ASSUMPTION?# BCS 110$ ;IF CS WRITE CHECK ERRORO, MOV #IE.VER&377,R0 ;SET UNRECOVERABLE ERROR.110$: MOV 2(R2),R1 ;GET WORDS LEFT TO TRANSFER+ ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFER 6 ADD U.CNT(R5),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED MOV #1,(R2) ;CLEAR CONTROLLERA2120$: MOVB S.CON(R4),R3 ;RETREIVE 00G]]]DATADATADATADATADATADATADATACONTROLLER INDEX/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTK/ BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT1# CALL $IODON ;FINISH I/O OPERATION ! JMP DKINI ;PROCESS NEXT REQUEST ;DE; DEVICE TIMEOUT RESULTS IN A CONTROL AND DRIVE RESET FOLLOWED BY THE C; I/O OPERATION BEING REPEATED UNLESS THE OPERATION WAS DIAGNOSTIC.FA; TIMEOUTS ARE USUALLY CAUSED BY POWERFAILURE BUT MAY ALSO BE THE ; RESULT OF A HARDWARE FAILURE.R;7DKOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP?R BEQ 125$ ;;;IF EQ NO- DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET?N BEQ 125$ ;;;IF EQ YESM MTPS #0 ;;;ALLOW INTERRUPTSL JMP 30$ ;N-125$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSYE3 BICB #US.SPU,U.STS(R5) ;;;RESET DRIVE SPINNING UPN# CALL $DTOER ;;;LOG DEVICE TIMEOUT 0 BCC 140$ ;IF CC TIMEOUT DURING NORMAL FUNCTION5130$: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASKL) BR 110$ ;DIAGNOSTIC PROCESSING COMPLETED)140$: MOV #110000,R1 ;SET FOR DRIVE RESET. BR 53$ ; .DSABL LSBN .END BEQ 1E TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER (FROM IOSUB.MAC)E;N E;+); .KRLOC -- RELOCATE USER VIRTUAL ADDRESS ;E5; THIS ROUTINE TRANSFORMAS A 16 BIT USER ADDRESS INTOO?; A RELOCATION BIAS AND DISPLACEMENT IN BLOCK RELATIVE TO APR6. ;O ; INPUTS:T; %; R0 USER VIRTUAL ADDRESS TO RELOCATE;O ; OUTPUTS:; ,; R1 RELOCATION BIAS TO BE LOADED INTO PAR6.2; R2 DISPLACEMENT IN BLOCK PLUS 140000 (PAR6 BIAS);B; REGISTERS ALTERED:;A; R1;S;-.KRLOC:: ;REF LABEL .IF NDF M$$MGEE" MOV R0,R2 ;COPY PHYSICAL ADDRESS CLR R1 ;CLEAR RELOCATION BIAS .IFFL! MOV R0,R1 ;COPY VIRTUAL ADDRESS% CLR R2 ;ZERO APR NUMBER ACCUMULATOR  ASL R1 ;COLLECT APR NUMBER ROL R2 ; ASL R1 ; ROL R2 ; ASL R1 ; ROL R2 ; ASL R2 ;CONVERT TO APR INDEX CLRB R1 ;CLEAR EXTRANEOUS BITS+ SWAB R1 ;COLLECT BLOCK NUMBER IN LOW BYTEN ROR R1 ;- ADD UISAR0(R2),R1 ;CALCULATE RELOCATION BIAS)! MOV R0,R2 ;COPY VIRTUAL ADDRESS14 BIC #177700,R2 ;CLEAR ALL BUT DISPLACEMENT IN BLOCK BIS #140000,R2 ;SET APR 6 BIASD .ENDC ;M$$MGE RETURN ;A .ENDFFL! MOV R0,R1 ;COPY VIRTUAL ADDRESS% CLR R2 ;ZERO APR .NLIST .TITLE KPRE .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I;  ;HB; ASSEMBLY PREFIX FILE FOR K-SERIES PERIPHERAL SUPPORT SUBROUTINES; YM$$MGE=0 ;MAPPED SYSTEM%N$$MBF=8. ;MAXIMUM NUMBER OF BUFFERSAK$$W11=1 ;KW11-K CLOCK SUPPORTLK$W11K=1 ;KW11-K CLOCK G$$HST=0 ;GTHIST DATA BASEO$FT$MOP=0 ;MULT. CLOCK DRIVEN SWEEPS'N$AD11=1 ;AD11-K A/D CONVERTER SUPPORTNA$$M11=0 ;AM11-K SUPPORTIN$DR11=1 ;DR11-K SUPPORTT N$AA11=1 ;AA11-K D/A CONVERTERS)N$$SWB=5 ;NUMBER OF SWEEP CONTROL BLOCKST;OC; MACRO TO DEFINE JUMP TO SUBROUTINE WITH RETURN TO CALLER'S CALLERE;Y .MACRO CALLR ARGS JMP ARG .ENDM;O3; MACROS TO REFERENCE PSW FOR NON-LSI-11 PROCESSORSM;8 .IF NDF L$$SI1R .00]]]eaekMACRO MFPS DST1 MOVB @#PS,DST .ENDM .MACRO MTPS SRC .IF IDN <#0>, CLRB @#PS .IFF MOVB SRC,@#PS .ENDC .ENDM .ENDC .LIST;AD11-K A/D CONVERTER SUPPORTNA$$M11=0 ;AM11-K SUPPORTIN$DR11=1 ;DR11-K SUPPORTT N$AA11=1 ;AA11-K D/A CONVERTERS)N$$SWB=5 ;NUMBER OF SWEEP CONTROL BLOCKST;OC; MACRO TO DEFINE JUMP TO SUBROUTINE WITH RETURN TO CALLER'S CALLERE;Y .MACRO CALLR ARGS JMP ARG .ENDM;O3; MACROS TO REFERENCE PSW FOR NON-LSI-11 PROCESSORSM;8 .IF NDF L$$SI1R .$ .TITLE KSTB SETUP BUFFERS FOR SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 19-JUL-77;E<; THIS MODULE SETS UP THE BUFFER INFORMATION PART OF THE SWB;T; SYSTEM MACRO CALLS;T .MCALL KSWDF$ KSWDF$  2 .SBTTL .K.STB SET UP BUFFER INFORMATION FOR SWEEP;+'; .K.STB -- SETUP BUFFER INFO FOR SWEEP ;C ; INPUTS:U;1; R4 POINTS TO SWEEP CONTROL BLOCK WHICH HAS BEENT; SETUP BY .K.SET;N ; OUTPUTS:;; C-CLEAR ALL OK:; THE BUFFER POINTERS (CURRENT AND INITIAL) ARE SETUP FOR%; EACH BUFFER SPECIFIED BY THE USER. ;D!; C-SET ILLEGAL NUMBER OF BUFFERSB;1; REGISTERS ALTERED:;L; R0-R3 ; ;-.K.STB::MOV R5,-(SP) ;SAVE R52 MOV S.WBPT(R4),R5 ;PICKUP POINTER TO 'IBUF' ARRAY ; (SETUP BY .K.SET)S- MOV R5,S.WUSW(R4) ;SET USER MODE USW ADDRESSS MOV R5,R0 ;COPY FOR .KRLOC CALL .KRLOC ;RELOCATE TO APR6I# MOV R1,S.WUSW+2(R4) ;SET APR6 BIASB& MOV R2,S.WUSW+4(R4) ;AND DISPLACEMENT* ADD #IB.DVQ,R5 ;POINT TO THE DEVICE QUEUE4 MOVB (R5),S.WBNO(R4) ;GET THE CURRENT BUFFER SET UP3 BMI 220$ ;IF MI RLSBUF HAS NOT BEEN CALLED--ERRORO .REPT 7' MOVB 1(R5),(R5)+ ;MOVE THE QUEUE DOWN  .ENDM! MOVB #-1,(R5) ;MARK END OF QUEUEP) MOV S.WBPT(R4),R5 ;GET PTR TO IBUF AGAIN 0 ADD #IB.NBF,R5 ;POINT TO NUMBER OF BUFFERS WORD3 MOV (R5)+,-(SP) ;PUSH NUMBER OF BUFFERS ONTO STACKC BLE 200$ ;IF LE THEN ERROR) CMP (SP),#8. ;CHECK FOR TOO MANY BUFFERSV BHI 200$ ;IF HI YESI. CLRB 1(SP) ;@SP=<#BUFFERS>,;E9; RUN THROUGH THE USER BUFFER LIST AND RELOCATE AS NEEDEDB;2/20$: MOV (R5)+,R0 ;GET NEXT USER BUFFER ADDRESS CALL .KRLOC ;RELOCATE TO APR6V! MOVB 1(SP),R3 ;GET BUFFER NUMBERV ASL R3 ;MULTIPLY ASL R3 ; BY 4W5 ADD R4,R3 ; TO INDEX INTO THE SWEEP CONTROL BLKI: ADD #S.WIBP,R3 ;INDEX INTO S.WIBP INITIAL BUFFER POINTERS4 MOV R1,(R3)+ ;SET APR6 BIAS (0 ON UNMAPPED SYSTEMS)7 MOV R2,(R3)+ ;SET DISPLACEMENT (PHYS ADDR ON UNMAPPED)F> CMPB 1(SP),S.WBNO(R4);IS THIS BUFFER THE FIRST BUFFER TO USE? BNE 40$ ;IF NE NOB3 MOV R1,S.WBPT(R4) ;YES--SET CURRENT BUFFER POINTER+ MOV R2,S.WBPT+2(R4) ; ...40$: INCB 1(SP) ;NEXT BUFFER  DECB (SP) ;MORE TO DO? BGT 20$ ;IF GT YES CLR (SP)+ ;NO--CLEAR STACK BR 300$ ;GO RETURN; ; ILLEGAL NUMBER OF BUFFERSO;L4200$: TST (SP)+ ;CLEAR NUMBER OF BUFFERS FROM STACK220$: SEC ;FLAG AN ERROR300$: MOV (SP)+,R5 ;RESTORE R5 RETURN ;RETURN WITH C CORRECT .ENDDDR ON UNMAPPED)F> CMPB 1(SP),S.WBNO(R4);IS THIS BUFFER THE FIRST BUFFER TO USE? BNE 40$ ;IF NE NOB3 MOV R1,S.WBPT(R4) ;YES--SET CURRENT BUFFER POINTER+ MOV R2,S.WBPT+2(R4) ; ...40$: INCB 1(SP) ;NEXT BUFFER  DECB (SP) ;MORE TO DO? BGT 20$ ;IF GT YES CLR (SP)+ ;NO--CLEAR STACK00]I]]DATADATADATADATADATADATADATA) .TITLE KSTIBF SETUP IBUF ARRAY FOR SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-AUG-77;E'; THIS ROUTINE SETS UP THE 'IBUF' ARRAYT A;+#; SETIBF -- INITIALIZE 'IBUF' ARRAYR; 3; THIS ROUTINE SETS UP THE 'IBUF' ARRAY FOR A SWEEPL;T; CALLING SEQUENCE:C;8; CALL SETIBF (IBUF, IND, LPATAB, BUF1, BUF2,... , BUFN);I ; INPUTS:O;E#; IBUF IS AN ARRAY OF DIMENSION 40.M#; BUFN IS THE ADDRESS OF BUFFER 'N'R1; LPADTB UNUSED--PRESENT FOR LPA-11 COMPATIBILITY ; ; OUTPUTS:;O; IND RETURNS THE STATUS4; 0 TOO MANY BUFFERS--ADJUSTED FOR MAXIMUM (N$$MBF); 1 IBUF SET OK ; THE IBUF ARRAY IS INITIALIZED;T;-)SETIBF::MOVB (R5),R1 ;GET # OF ARGUMENTS' TST (R5)+ ;SKIP COUNTERU MOV (R5)+,R2 ;GET IBUF ADDRESS  MOV (R5)+,R3 ;GET IND ADDRESS INC R3 ;CHECK FOR -1 BEQ 5$ ;IF EQ LEAVE IT 0 DEC R3 ;GET ADDRESS BACK MOV #1,(R3) ;INIT TO SUCCESS5$: TST (R5)+ ;SKIP LPATABR# SUB #3,R1 ;ONLY COUNT THE BUFFERSP: MOV #I$BFVW,(R2)+ ;SET THE IBUF VALIDATION WORD INTO WD 1& CLR (R2)+ ;CLEAR SECOND WORD OF IBUF MOV #-1,(R2) ;INITIALIZE QUEUES .REPT 9.  MOV (R2)+,(R2) ;... .ENDM TST (R2)+ ;MOVE TO NEXT WORD) CMP R1,#N$$MBF ;LEG .TITLE DPDRV .IDENT /08/; ; COPYRIGHT (C) 1974, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 08;; D. N. CUTLER 9-FEB-74;; PREVIOUSLY MODIFIED BY:;; P. J. BEZEREDI; D. N. CUTLER; C. A. D'ELIA;; MODIFIED BY:;;; P. J. BEZEREDI 14-DEC-77;6; PB050 -- REMOVE UNNEEDED CONDITIONALS FOR RSX-11M+.;; P. J. BEZEREDI 21-AUG-78; 6; PB083 -- ADDITION OF SOFTWARE VOLUME VALID SUPPORT.;I; P. J. BEZEREDI 01-FEB-79;S8; PB097 -- ISSUE RECALIBRATE IF HEADER NOT FOUND ERROR.;O&; RP11-C/E DISK PACK CONTROLLER DRIVER;H; MACRO LIBRARY CALLSN; .MCALL HWDDF$,PKTDF$ $ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;.; EQUATED SYMBOLS ;LRETRY=8. ;ERROR RETRY COUNT ; ; LOCAL DATA;7>; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER); <RTTBL: .BLKW R$$P11 ;ERROR RETRY COUNT AND POSITIONING FLAG;A ; DIAGNOSTIC FUNCTION CODE TABLE;-"FUNTBL: .WORD IO.HMS!IQ.UMD, 20015 .WORD IO.BLS!IQ.UMD, 20011O .WORD IO.RDH!IQ.UMD, 14105C .WORD IO.WDH!IQ.UMD, 14103  .WORD IO.WCK!IQ.UMD, 00107 FUNTBE:T;H; DRIVER DISPATCH TABLER;S( DDT$ DP,R$$P11 ;GENERATE DISPATCH TABLE;+2; **-DPINI-RP11-C/E DISK PACK CONTROLLER INITIATOR; H; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUEG; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THENH; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN AH; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IH; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER>; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.;I ; INPUTS:E;:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;H ; OUTPUTS:;NB; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAB; 00I]]]eaekING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OP; ATION IS INITIATED.E;- .ENABL LSBS5DPINI: GTPKT$ R$$P11 ;GET NEXT I/O PACKET TO PROCESS ;S1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:E;Q'; R1=ADDRESS OF THE I/O REQUEST PACKET. -; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB. ; R3=CONTROLLER INDEX.); R3=ADDRESS OF THE STATUS CONTROL BLOCK.C:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;T:; RP11-C/E DISK PACK CONTROLLER I/O REQUEST PACKET FORMAT:; "; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK. @; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.B; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR TASK HEADE1; WD. 05 -- I/O FUNCTION CODE (IO.RLB OR IO.WLB).R0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.B; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140003; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.A; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER.S+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.3-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.K; WD. 15 -- NOT USED.O9; WD. 16 -- LOW BYTE MUST BE ZERO AND HIGH BYTE NOT USED. 0; WD. 17 -- LOGICAL BLOCK NUMBER OF I/O REQUEST.A; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. ADRS ELSE NOT USEDN<; WD. 21 -- DIAGNOSTIC REG. BLK ADRS (REAL OR DISPL.+140000);(< MOV #RETRY&377,RTTBL(R3) ;CLEAR RECAL FLAG AND SET RETRIES$ CALL $VOLVD ;VALIDATE VOLUME VALID BCS 8$ ;IF CS WE FAILED  TST R0 ;TRANSFER FUNCTION? BMI 1$ ;IF MI YES TST I.PRM+2(R1) ;SIZE THE DISK? BPL 8$ ;IF PL NO, MOVB R2,U.BUF+1(R5) ;STUFF UNIT SELECT BITS' MOV S.CSR(R4),R2 ;RETREIVE CSR ADDRESSS- CALL 200$ ;ABORT CONTROLLER AND SELECT UNITE# JMP 105$ ;PASS REGISTERS AND EXITF1$: ;REF LABELR .IF DF M$$EXT, CALL $STMAP ;SET UP UNIBUS MAPPING ADDRESS .ENDC) MOVB R2,U.BUF+1(R5) ;INSERT DRIVE NUMBER 8 CMPB #IO.HMS/^D<256>,I.FCN+1(R1) ;DIAGNOSTIC FUNCTION? BNE 5$ ;IF NE NO. MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE-3$: CMP (R0)+,I.FCN(R1) ;FUNCTION CODE MATCH? BEQ 4$ ;IF EQ YESM# TST (R0)+ ;BYPASS CONTROLLER CODE ' CMP #FUNTBE,R0 ;END OF FUNCTION TABLE?R BEQ 5$ ;IF EQ YESO BR 3$ ;TRY AGAIN44$: BIS (R0),U.BUF(R5) ;SET CONTROLLER FUNCTION BITS' BR 10$ ;GO CHECK LOGICAL BLOCK NUMBERL/5$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTIONC1 BIS #105,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTIONC6 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?# BHIS 9$ ;IF HIS FUNCTION IS LEGALG"8$: JMP 100$ ;FUNCTION IS ILLEGAL%9$: BEQ 10$ ;IF EQ FUNCTION WAS READ4 SUB #2,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTION-10$: CALL $BLKCK ;CHECK LOGICAL BLOCK NUMBERR+ CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBER$3 MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESSB" SWAB R1 ;SWAP TRACK TO HIGH BYTE$ BIS R1,R0 ;MERGE TRACK WITH SECTOR3 MOV R0,I.PRM+12(R3) ;SAVE TRACK AND SECTOR ADDRESSC;N; INITIATE I/O OPERATION;F30$: ;REF LABEL .IF DF M$$EXT% CALL $MPUBM ;MAP UNIBUS TO TRANSFER$ .ENDC% MOV S.CSR(R4),R2 ;GET ADDRESS OF CSRW9 MOV S.PKT(R4),R1 ;RETRIEVE ADDRESS OF I/O REQUEST PACKETI; MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNTL- CALL 200$ ;ABORT CONTROLLER AND SELECT UNITR, ADD #10,R2 ;POINT TO DISK ADDRESS REGISTER8 MOV I.PRM+12(R1),(R2) ;INSERT TRACK AND SECTOR ADDRESS1 MOV I.PRM+10(R1),-(R2) ;INSERT CYLINDER ADDRESSC. MOV U.BUF+2(R5),-(R2) ;INSERT BUFFER ADDRESS8 MOV U.CNT(R5),-(R2) ;INSERT NUMBER OF BYTES TO TRANSFER! ROR (R2) ;CONVERT TO WORD COUNTC$ NEG (R2) ;MAKE NEGATIVE WORD COUNT TST -(R2) ;POINT BACK TO CSR+ MOV #IE.DNR&377,R0 ;ASSUME DRIVE NOT READYT8 MOV -4(R2),-(SP) ;GET CONTENTS OF DRIVE STATUS REGISTER COM (SP) ;COMPLEMENT STATUSE, BIT #140000,(SP)+ ;DRIVE READY AND ON-LINE? BEQ 31$ ;IF EQ YES/ BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP?V BNE 35$ ;IF NE YES- BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC REQUE00I]]]DATADATADATADATADATADATADATAST?) BNE 39$ ;IF NE YES) CALL $DVERR ;LOG DEVICE NOT READY ERRORB JMP 90$ ;FINISH I/O(531$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UP : CMPB #IO.RDH!IQ.UMD&377,I.FCN(R1) ;READ HEADER FUNCTION? BEQ 33$ ;IF EQ YES; CMPB #IO.WDH!IQ.UMD&377,I.FCN(R1) ;WRITE HEADER FUNCTION?T BNE 34$ ;IF NE NOE833$: BIT #360,10(R2) ;SYNCHRONIZE THE SECTOR COUNTER ...2 BNE 33$ ;... ON THE NEXT INDEX PULSE IN CASE ...1 BIT #360,10(R2) ;... A UNIT OTHER THAN 0 WAS ...I. BNE 33$ ;... SELECTED FOR HEADER OPERATIONS.,34$: CALL $BMSET ;SET I/O ACTIVE IN BIT MAP* MOVB U.BUF(R5),(R2) ;LOAD FUNCTION AND GO;.<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;7DPCAN: RETURN ;;;NOP FOR RP11;+:; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND>; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT=; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVED?; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANYAA; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESSB; THE UNIT IS ALREADY READY.;-/DPPWF: TSTB S.STS(R4) ;IS DRIVE CURRENTLY BUSY?  BEQ 36$ ;IF EQ NOI0 MOVB #5,S.STS(R4) ;WAIT A MAXIMUM OF 75 SECONDS.35$: MOVB #15.,S.CTM(R4) ;15 SECONDS AT A TIME236$: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UP RETURNE;+4; **-$DPINT-RP11-C/E DISK PACK CONTROLLER INTERRUPTS;-8 INTSE$ DP,PR5,R$$P11 ;;;SAVE REGISTERS AND SET PRIORITY' MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCBT' MOV S.CSR(R4),R4 ;;;GET ADDRESS OF CSR * BIC #20100,(R4) ;;;CLEAR INTERRUPT ENABLE4 MOVB #377,-4(R4) ;;;CLEAR ATTENTION SUMMARY BITS ON/ CLRB -4(R4) ;;;BOTH OLD AND ECO'D CONTROLLERSV' CALL $FORK ;;;CREATE A SYSTEM PROCESSN MOV R4,R2 ;COPY ADDRESS OF CSR* MOV U.SCB(R5),R4 ;RETRIEVE ADDRESS OF SCB- MOVB S.CON(R4),R3 ;RETRIEVE CONTROLLER INDEX*) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSR/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERR7 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION EXECUTED?C39$: BNE 105$ ;IF NE YEST) ASRB RTTBL+1(R3) ;HOME SEEK IN PROGRESS?  BCS 59$ ;IF CS YES TST (R2) ;ANY ERRORS?T BPL 50$ ;IF PL NON CALL $DVERR ;LOG DEVICE ERRORC+40$: BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?S BNE 60$ ;IF NE YES" DECB RTTBL(R3) ;ANY MORE RETRIES? BLE 60$ ;IF LE NOR% BIT #1371,-2(R2) ;RECOVERABLE ERROR?E BEQ 60$ ;IF EQ NOM BIT #14000,-4(R2) ;SKI OR HNF?D BEQ 46$ ;IF EQ NO3845$: MOVB #1,RTTBL+1(R3) ;SET HOME SEEK IN PROGRESS FLAG5 MOVB S.ITM(R4),S.CTM(R4) ;RESET DEVICE TIMEOUT COUNTN- CALL 200$ ;ABORT CONTROLLER AND SELECT UNITS- BIS #20015,(R2) ;INITIATE HOME SEEK FUNCTIONS RETURN ; %46$: JMP 30$ ;RETRY ENTIRE OPERATIONR@50$: BITB #IO.WLC&377,I.FCN(R1) ;WRITE FOLLOWED BY WRITE CHECK? BNE 51$ ;IF NE YES5 BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED BY MCR?( BEQ 90$ ;IF EQ NOR)51$: MOVB U.BUF(R5),R1 ;GET LAST FUNCTION)- BIT #1*2,R1 ;WRITE OR WRITE CHECK FUNCTION?  BEQ 90$ ;IF EQ NOO- BIS #2*2,U.BUF(R5) ;SET WRITE CHECK FUNCTION(/ BIT #2*2,R1 ;WAS LAST FUNCTION A WRITE CHECK?O BNE 90$ ;IF NE YES. MOV #RETRY,RTTBL(R3);REINITIALIZE RETRY COUNT% BR 46$ ;START WRITE CHECK OPERATIONR%59$: TST (R2) ;HOME SEEK SUCCESSFUL?L BPL 46$ ;IF PL YES260$: MOV #IE.WLK&377,R0 ;ASSUME DRIVE WRITE LOCKED. MOV -2(R2),R1 ;GET CONTENTS OF ERROR REGISTER! BMI 90$ ;IF MI WRITE LOCK ERRORV- MOV #IE.WCK&377,R0 ;ASSUME WRITE CHECK ERROR1 BIT #10,R1 ;WRITE CHECK ERROR? BNE 90$ ;IF NE YES( MOV #IE.VER&377,R0 ;UNRECOVERABLE ERROR290$: MOV 2(R2),R1 ;GET WORDS REMAINING TO TRANSFER+ ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFER(6 ADD U.CNT(R5),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED! CALL 200$ ;ABORT THE CONTROLLERE2100$: MOVB S.CON(R4),R3 ;RETREIVE CONTROLLER INDEX/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNT(/ BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT # CALL $IODON ;FINISH I/O OPERATIONK! JMP DPINI ;PROCESS NEXT REQUEST;#E; DEVICE TIMEOUT RESULTS IN A HOME SEEK FOLLOWED BY THE I/O OPERATIONUC; BEING REPEATED UNLESS THE OPERATION WAS DIAGNOSTIC. TIMEOUTS ARER@; USUALLY CA00I]J]]eaekUSED BY POWERFAILURE BUT MAY ALSO BE THE RESULT OF A; HARDWARE FAILURE.A; 7DPOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP?S BEQ 104$ ;;;IF EQ NO- DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET?R BEQ 104$ ;;;IF EQ YESE MTPS #0 ;;;ALLOW INTERRUPTSR BR 46$ ;RETRY ENTIRE OPERATION-104$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY3 BICB #US.SPU,U.STS(R5) ;;;RESET DRIVE SPINNING UPW# CALL $DTOER ;;;LOG DEVICE TIMEOUTE0 BCC 110$ ;IF CC TIMEOUT DURING NORMAL FUNCTION5105$: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASKE( BR 90$ ;DIAGNOSTIC PROCESSING COMPLETE5110$: MOVB U.UNIT(R5),1(R2) ;SET CURRENT UNIT NUMBER ) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS4' BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?4 BNE 90$ ;IF NE YES" DECB RTTBL(R3) ;ANY RETRIES LEFT? BLE 90$ ;IF LE NOI BR 45$ ;;+?; THIS ROUTINE WILL ABORT THE CONTROLLER AND SELECT THE CURRENTE>; UNIT. A DELAY IS INITIATED BETWEEN EACH CONTROLLER ABORT TO<; ALLOW THE HARDWARE TIME TO SETTLE DOWN ON FAST PROCESSORS.;-(200$: MOV #1,(R2) ;ABORT THE CONTROLLER- BICB -(SP),(SP)+ ;GIVE THE HARDWARE TIME ...U% BICB -(SP),(SP)+ ;... TO SETTLE DOWN 3 MOV #1,(R2) ;CLEAR ANY ERRORS CAUSED BY THE ABORTI- BICB -(SP),(SP)+ ;GIVE THE HARDWARE TIME ... % BICB -(SP),(SP)+ ;... TO SETTLE DOWNF) MOVB U.BUF+1(R5),1(R2) ;SELECT THE UNIT RETURN ;E .DSABL LSB  .ENDR AND SELECT THE CURRENTE>; UNIT. A DELAY IS INITIATED BETWEEN EACH CONTROLLER ABORT TO<; ALLOW THE HARDWARE TIME TO SETTLE DOWN ON FAST PROCESSORS. .TITLE DRAFFI .IDENT /01/ N; ; COPYRIGHT (C) 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.E;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED 9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;A ; VERSION 01;P; J. E. PROVINO 18-JUL-781; ;+ ; **-$DRSAF-SPECIFY CPU AFFINITY;N9; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ADD CPU AFFINITYA; TO THE CURRENT TASK.;M ; DPB FORMAT:S;R#; WD. 00 -- DIC(161.),DPB SIZE(2.).R; WD. 01 -- AFFINITY MASKI; ; INPUTS:D; 2; R2=ADDRESS OF SECOND STATUS WORD OF CURRENT TASK ; R3=POINTER TO WD. 1 IN THE DPB/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.C,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;A5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK);-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.-&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.U6; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THE TASK1; HAS AN INSTALLED AFFINITY OR IF THE SPECIFIED-; AFFINITY IS INVALID.;-   .IF DF M$$PRO D .ENABL LSBO;$DRSAF::BIT #T2.AFF,(R2) ;WAS TASK INSTALLED WITH AFFINITY?S BNE 10$ ;YES IF NE( MOV T.RRM(R5),R0 ;GET REQUIRED RUN MASK% BIS (R3),R0 ;ADD SPECIFIED AFFINITYE, CALL $TSTAM ;IS TASK'S NEW AFFINITY VALID? BCS 10$ ;NO IF CSU- MOV R0,T.RRM(R5) ;SET AFFINITY IN TASK'S TCB+1 MOV T.PCB(R5),R0 ;GET ADDRESS OF TASK REGION PCB 4 BIS (R3),P.RRM(R0) ;SAVE DIRECTIVE RELATED AFFINITY6 CALL $SETRT ;FORCE TASK TO RUN ON REQUIRED PROCESSOR CLC ;SUCCESSI RETURN910$: DRSTS D.RS8 ;DIRECTIVE INCONSISTANT WITH TASK STATEF R;+; **-DRRAF-REMOVE AFFINITY;YC; THIS DIRECTIVE REMOVES AFFINITY WHICH WAS PREVIOUSLY SPECIFIED BYB; THE DRAAF DIRECTIVE.;A ; DPB FORMAT: ;T#; WD. 0 -- DIC. (163.),DBP SIZE(2.)B;1 ; INPUTS:C;8; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK; R3=ADDRESS OF THE DBP + 2R.; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK+; R5=ADDRESS OF THE TCB OF THE CURRENT TASKO;N5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK):;S-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.T&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED6; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF TASK WAS; INSTALLED WITH AFFINITY;- D<$DRRMA::BIT #T2.AFF,(R2) ;WAS TASK INSTALLED WITH AFFINITY? BNE 10$ ;YES IF NE1 MOV T.PCB(R5),R0 ;GET ADDRESS OF TASK REGION PCB . CLR P.RRM(R0) ;CLR DIRECTIVE RELATED AFFINITY* CALL $SETAP ;RECALCULATE TASK'S AFFINITY CLC ;SUCCESSP RETURNE .DSAB00J]K]L]DATADATADATADATADATADATADATAL LSBA P .ENDC T A .ENDS-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.T&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED6; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF TASK WAS; INSTALLED WITH AFFINITY;- D<$DRRMA::BIT #T2.AFF,(R2) ;WAS TASK INSTALLED WITH AFFINITY? BNE 10$ ;YES IF NE1 MOV T.PCB(R5),R0 ;GET ADDRESS OF TASK REGION PCB . CLR P.RRM(R0) ;CLR DIRECTIVE RELATED AFFINITY* CALL $SETAP ;RECALCULATE TASK'S AFFINITY CLC ;SUCCESSP RETURNE .DSAB .TITLE DRDARI .IDENT /04/ F; ; COPYRIGHT (C) 1974, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.P;5A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDA9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.E; ; VERSION 04;O; D. N. CUTLER 30-AUG-73;O; PREVIOUSLY MODIFIED BY:D;.; T. J. MILLER;U; MODIFIED BY:;N; T. J. MILLER 14-AUG-77; ;; TM099 -- REMOVE UNEEDED CONDITIONALIZATION FOR RSX-11M+. ;F+; DISABLE/ENABLE AST RECOGNITION DIRECTIVESL;R; MACRO LIBRARY CALLS; .MCALL TCBDF$, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+#; **-$DRDAR-DISABLE AST RECOGNITIONF;IL; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DISABLE RECOGNITION OF ASYNCHRONOUSK; SYSTEM TRAPS FOR THE ISSUING TASK. FURTHER AST'S ARE QUEUED AS THEY OCCUR7; AND WILL BE EFFECTED WHEN AST RECOGNITION IS ENABLED.I;D ; DPB FORMAT:J;I"; WD. 00 -- DIC(99.),DPB SIZE(1.).;U ; INPUTS:I;N9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.I+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.L,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;O5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)D;B-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.F&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE REJECTED.8; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST RECOG-; NITION IS ALREADY DISABLED.9;- . .ENABL LSBS;$DRDAR::BIT #T2.DST,(R2) ;AST RECOGNITION ALREADY DISABLED?A BNE 10$ ;IF NE YES* BIS #T2.DST,(R2) ;DISABLE AST RECOGNITION( RETURN ;RETURN DIRECTIVE STATUS OF +1;+"; **-$DREAR-ENABLE AST RECOGNITION; G; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO RECOGNIZE ASYNCHORONOUS SYSTEMIJ; TRAPS FOR THE ISSUING TASK. AST'S THAT HAVE BEEN QUEUED WHILE AST RECOG-/; NITION WAS DISABLED ARE EFFECTED IMMEDIATELY.';S ; DPB FORMAT:I;S#; WD. 00 -- DIC(101.),DPB SIZE(1.).L;9 ; INPUTS: ;.9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.L+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.#/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.R,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;N5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)E;S-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. &; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.I8; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST RECOG-; NITION IS NOT DISABLED..;-3$DREAR::BIT #T2.DST,(R2) ;AST RECOGNITION DISABLED?A BEQ 10$ ;IF EQ NO ) BIC #T2.DST,(R2) ;ENABLE AST RECOGNITIONR2 CALLR $SETRT ;FORCE A REDISPATCHING OF PROCESSOR'10$: DRSTS D.RS8 ;SET DIRECTIVE STATUSF .DSABL LSBT  .END: (DIRECTIVE STATUS AND PS RETURNED TO TASK)E;S-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. &; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.I8; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST RECOG-; NITION IS NOT DISABLED..;-3$DREAR::BIT #T2.DST,(R2) ;AST RECOGNITION DISABLED?A BEQ 10$ ;IF EQ NO ) BIC #T2.DST,(R2) ;ENABLE AST RECOGNIT .TITLE DRDCPE .IDENT /05/ I;T ; COPYRIGHT (C) 1974, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDR9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.+;S ; VERSION 05; ; D. N. CUTLER 5-SEP-73I; ; PREVIOUSLY MODIFIED BY:'; ; T. J. MILLER;O; MODIFIED BY:;O; T. J. MILLER 6-JUN-77R;I7; TM088 -- CLEAR CHECKPOINT PCB WORD ON DISABLE CHECK- ; POINTING.2;T; T. J. MILLER 14-AUG-7700L]M]]eaek;.;; TM099 -- REMOVE UNEEDED CONDITIONALIZATION FOR RSX-11M+.8;9; T. J. MILLER 7-FEB-78O;R); TM122 -- DISABLE CHECKPOINTING IN PCB. ;F); DISABLE/ENABLE CHECKPOINTING DIRECTIVESE;; MACRO LIBRARY CALLSC;I .MCALL TCBDF$, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+!; **-$DRDCP-DISABLE CHECKPOINTING ;'F; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DISABLE THE CHECKPOINTABILITY; OF THE ISSUING TASK.;P ; DPB FORMAT:N;S"; WD. 00 -- DIC(95.),DPB SIZE(1.).;J ; INPUTS:-;-9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.S+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.I,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R6; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK).;A-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.A&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.T;; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF CHECKPOINTINGT); IS ALREADY DISABLED FOR ISSUING TASK.:; DIRECTIVE STATUS OF 'D.RS10' IS RETURNED IF THE ISSUING; TASK IS NOT CHECKPOINTABLE.O;- .ENABL LSB .$DRDCP::BIT #T2.CHK,(R2) ;TASK CHECKPOINTABLE? BNE 20$ ;IF NE NOH$ MOV T.PCB(R5),R0 ;POINT TO TASK PCB8 BIT #PS.CHK,P.STAT(R0) ;CHECKPOINTING ALREADY DISABLED? BNE 30$ ;IF NE YES. BIS #PS.CHK,P.STAT(R0) ;DISABLE CHECKPOINTING  .IF DF C$$INT ' CLR P.DPCB(R0) ;CLEAR DISK PCB ADDRESSI  .ENDC ,10$: RETURN ;RETURN DIRECTIVE STATUS OF +1(20$: DRSTS D.RS10 ;SET DIRECTIVE STATUS;+ ; **-$DRECP-ENABLE CHECKPOINTING;:E; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ENABLE THE CHECKPOINTABILITYB; OF THE ISSUING TASK.; ; DPB FORMAT:S;("; WD. 00 -- DIC(97.),DPB SIZE(1.).;B ; INPUTS: ;Y9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. +; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)S;R-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.N&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.H;; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF CHECKPOINTINGT; IS ALREADY ENABLED.7;-1$DRECP::BIT #T2.CHK,(R2) ;IS TASK CHECKPOINTABLE?  BNE 30$ ;IF NE NOH$ MOV T.PCB(R5),R0 ;POINT TO TASK PCB0 BIT #PS.CHK,P.STAT(R0) ;CHECKPOINTING DISABLED? BEQ 30$ ;IF EQ YES  5 .IF DF C$$INT 1 TST P.DPCB(R0) ;IS TASK CONNECTED TO INTERRUPTS?T' BNE 30$ ;IF NE YES, CANNOT ENABLE CKPF R .ENDC U S- BIC #PS.CHK,P.STAT(R0) ;ENABLE CHECKPOINTINGS/ CALLR $NXTSK ;REASSIGN PARTITION IF NECESSARYD'30$: DRSTS D.RS8 ;SET DIRECTIVE STATUS .DSABL LSBT R .ENDABLED.7;-1$DRECP::BIT #T2.CHK,(R2) ;IS TASK CHECKPOINTABLE?  BNE 30$ ;IF NE NOH$ MOV T.PCB(R5),R0 ;POINT TO TASK PCB0 BIT #PS.CHK,P.STAT(R0) ;CHECKPOINTING DISABLED? BEQ 30$ ;IF EQ YES  5 .IF DF C$$INT 1 TST P.DPCB(R0) ;IS TASK CONNECTED TO  .TITLE DRGLIS .IDENT /09.03/2 U;&; COPYRIGHT (c) 1974,1978,1979,1986 1; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;RC; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED1; ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.e ;  ; VERSION 08 ;V ; D. N. CUTLER 18-SEP-73;; PREVIOUSLY MODIFIED BY:n;v; D. N. CUTLER; T. J. MILLER; T. J. MILLER; J. E. PROVINO.;<; MODIFIED BY:;.; K. L. NOEL 17-DEC-86 09.00;ID; KLN031 - ADD SUPPORT FOR REMOTE LUN ASSIGNMENTS AND GDVI DIREC.;9!; B. S. MCCARTHY 5-MAR-87 09.01R;,.; BM385 -- ADD $DRGL1 LABEL FOR MOVEMENT TO; VECTOR COMMONE;M; K. L. NOEL 6-APR-87 09.02 ;C+; KLN040 -- CHANGE $IMASG CALL TO A JUMP ; ; K. L. NOEL 12-MAY-87 09.03;-C; KLN044 -- CHANGE ERROR PATHS TO NOT DO A DRSTS IN REMOTE CASES";J#;L$; MACRO LIBRARY CALLS %; &' .MCALL HWDDF$&( HWDDF$ ;DEFINE HARDWARE REGISTERS( 00M]]L]DATADATADATADATADATADATADATA ;KLN031K3( .IF DF C$$RMT ;REMOTE TASK SUPPORT ;KLN031V( ;KLN031.( .MCALL CPRDF$ ;KLN031,( CPRDF$ ;KLN031L( ;KLN031 ( .ENDC ; C$$RMT ;KLN031(; ;KLN031!(; LOCAL SYMBOLS ;KLN031A(; ;KLN031(MAP5 = 120000 ;KLN031(MAP6 = 140000 ;KLN031?(GL$BUF = 2 ;SIZE OF LOCAL BUFFER STORAGE FOR GLUN$ ;KLN031A.(GL$SIZ = 3. ;DPB SIZE FOR GLUN$ ;KLN031-(GD$SIZ = 4. ;DPB SIZE FOR GDVI$ ;KLN031 ?(GN$SIZ = 8. ;DPB SIZE FOR GIN$ (GET ASSIGNED DEVICE) ;KLN031V( ;KLN031.)*;+!+; **-$DRGLI-GET LUN INFORMATION ,; F-; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A SIX WORD BUFFER WITHJ.; INFORMATION ABOUT A DEVICE THAT IS ASSIGNED TO A SPECIFIED LUN. IF RE-L/; QUESTS TO THE DEVICE HAVE BEEN RE-DIRECTED, THEN THE INFORMATION RETURN-(0; ED PERTAINS TO THE RE-DIRECT DEVICE.1;32; DPB FORMAT:.3;B#4; WD. 00 -- DIC(5.),DPB SIZE(3.).=,5; WD. 01 -- LUN TO RETURN INFORMATION FOR.+6; WD. 02 -- ADDRESS OF A SIX WORD BUFFER.E7;N8; BUFFER FORMAT:9;.&:; WD. 00 -- NAME OF ASSIGNED DEVICE.<;; WD. 01 -- UNIT NUMBER OF ASSIGNED DEVICE AND FLAGS BYTE.0<; WD. 02 -- FIRST DEVICE CHARACTERISTICS WORD.1=; WD. 03 -- SECOND DEVICE CHARACTERISTICS WORD.0>; WD. 04 -- THIRD DEVICE CHARACTERISTICS WORD.1?; WD. 05 -- FOURTH DEVICE CHARACTERISTICS WORD.-@;T A; INPUTS:3B; ;C; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. %D; R3=ADDRESS OF THE LUN IN THE DPB..1E; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.N.F; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.G;I7H; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)EI;F/J; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.S(K; DIRECTIVE STATUS OF +1 IS RETURNED.!L; C=1 IF DIRECTIVE IS REJECTED. 9M; DIRECTIVE STATUS OF 'D.RS5' IS RETURNED IF NO DEVICEV'N; IS ASSIGNED TO THE SPECIFIED LUN.UO;-P Q .ENABL LSBSQ ; BM385OQ .IF DF D$$PAR ; BM385AQ ; BM385TQ$DRGL1:: ; BM385Q ; BM385R!Q .IFF ; DF D$$PAR ; BM385CQ ; BM385.Q$DRGLI:: ; BM385Q ; BM385U"Q .ENDC ; DF D$$PAR ; BM385Q ; BM385YQ ;KLN031RUQ;IF GDVI SUPPORT IS INCLUDED, DPB VALIDATION OF THE SIZE FIELD HAS NOT BEEN ;KLN031A0Q;DONE AT THIS POINT. DO IT HERE. ;KLN031Q ;KLN031IQ .IF EQ G$$DVI ;KLN031SQ ;KLN0318?Q CMPB #GL$SIZ,-1(R3) ;IS SIZE CONSISTENT WITH GLUN? ;KLN031G"Q BEQ 98$ ;IF EQ YES ;KLN031Q ;KLN031D?Q CMPB #GD$SIZ,-1(R3) ;IS SIZE CONSISTENT WITH GDVI? ;KLN031B"Q BEQ 98$ ;IF EQ YES ;KLN031Q ;KLN031B.Q DRSTS D.RS99 ;DPB INVALID ERROR ;KLN031Q ;KLN031I!Q .ENDC ;EQ G$$DVI ;KLN031IQ ;KLN031 6Q98$: CALL $MPLUN ;MAP LUN TO UCB ADDRESS ;KLN031+Q BCC 105$ ;IF CC DEVICE FOUND ;KLN031 Q ;KLN031 Q .IF DF C$$RTB ;KLN031RQ ;KLN031T?Q BIT #T4.DFB,T.ST4(R5) ;TASK HAVE DEFERRED BINDING? ;KLN031 !Q BEQ 99$ ;IF EQ NO ;KLN031RQ ;KLN031T3Q BIT #F5.RTB,$FMSK5 ;RUN TIME BINDING? ;KLN031L/Q BNE 100$ ;IF SO, DO IMPLICIT ALUN ;KLN031 Q ;KLN0310.Q99$: DRSTS D.RS5 ;IF NOT, ERROR ;KLN031Q100$: ;KLN031,Q JMP $IMASG ;DO IMPLICIT ALUN ; KLN040Q ; KLN040 Q .ENDC ;C$$RTB ; KLN035Q105$: ; KLN0353Q; ; KLN035 LQ; THIS ENTRY POINT IS FOR GIN$ SUBFUNCTION GET ASSIGNED DEVICE ; KLN0356Q; AT THIS POINT: R3 = WD 02 OF THE DPB ; KLN0358Q; R2 = UCB ADDRESS OF DEVICE OR 0 (GIN$) ; KLN035Q; ; KLN035Q$RTINF:: ; KLN035T-Q MOV R3,-(SP) ;SAVE DPB ADDRESS ; KLN035D1T MOV R2,R4 ;SAVE ADDRESS OF DEVICE UCB ;**-2 .V MOV #6*2,R1 ;SET LENGTH OF BUFFER ;**-11V CMPB #GL$SIZ,-3(R3) ;IS THIS GLUN? ;KLN031B#V BEQ 110$ ;IF EQ YES ;KLN031N8V MOV 2(R3),R1 ;GET LENGTH OF BUFFER FROM DPB ;KLN0316V110$: MO00M^]]eaekV (R3),R3 ;GET ADDRESS OF BUFFER ;KLN031%W CALL $ACHKP ;ADDRESS CHECK BUFFER /W MOV (SP)+,R5 ;RESTORE DPB ADDRESS ;KLN031GW ;KLN031 1W .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN031W ;KLN031P5W BIT #F5.RTK,$FMSK5 ;REMOTE TASK SUPPORT ;KLN031D#W BNE 130$ ;IF NE YES ;KLN031SW ;KLN031 0W120$: JMP 2$ ;JOIN NON REMOTE CODE ;KLN031W ;KLN031 W130$: ;KLN031W; ;KLN031@W; IF THIS IS GIN$, THERE IS NO UCB ADDRESS TO CHECK ;KLN031W; ;KLN0310W CMPB #GN$SIZ,-3(R5) ;IS THIS GIN$ ;KLN031#W BEQ 140$ ;IF EQ YES ;KLN031NW; ;KLN031DW; CHECK FOR GENERIC DEVICE TYPE BEFORE SENDING TO CPRAME ;KLN031W; ;KLN031+W MOV (R4),R1 ;GET DCB ADDRESS ;KLN031:W CMP R1,$XXLOW ;IS DCB LOWER THAN LOWER BOUND? ;KLN031/W BLO 120$ ;IF LO YES, NOT GENERIC ;KLN031:W CMP R1,$XXHGH ;IS DCB HIGHER THAN UPPER BOUND? ;KLN0310W BHI 120$ ;IF HIGH YES, NOT GENERIC ;KLN031W; ;KLN0311W; GET A REQUEST PACKET FROM CPRBUF ;KLN031TW; ;KLN031QW; NOTE: IF SIZE OF REQUEST PACKET OR DPB OF GLUN, GDVI OR GIN$ IS EVER ;KLN031ERW; MADE LARGER, THE NUMBER OF BLOCK TO ALLOCATE MAY NEED TO BE INCREASED ;KLN031W; ;KLN031<W140$: MOV #1,R1 ;ASSUME ONLY ONE BLOCK IS NEEDED ;KLN031DW MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START ;KLN0312W CALL $CPALO ;GET BUFFER FROM CPRBUF ;KLN031W; ;KLN031)W; FILL IN REQUEST PACKET ;KLN031W; ;KLN031(W MOV R0,KISAR6 ;MAP PACKET ;KLN0311W MOV #MAP6,R1 ;GET ADDRESS OF HEADER ;KLN031B8W MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST ;KLN031(W CLRB H$ICNT(R1) ;NO ITEMS ;KLN031.W ADD #P$DPB,R1 ;POINT TO DPB AREA ;KLN031W; ;KLN031.W; COPY DPB INTO REQUEST PACKET ;KLN031W; ;KLN031;W MOV R5,R3 ;COPY POINTER TO USER BUFFER ADDRESS ;KLN031B2W SUB #4,R3 ;POINT TO BEGINNING OF DPB ;KLN031,W MOVB 1(R3),R2 ;GET SIZE OF DPB ;KLN0310W160$: MOV (R3)+,(R1)+ ;COPY A WORD ;KLN031+W SOB R2,160$ ;LOOP UNTIL DONE ;KLN031EW; ;KLN031AW; CHANGE ADDRESS IN DPB TO OFFSET FROM TOP OF HEADER ;KLN031TW; ;KLN031-W MOVB -3(R5),R2 ;GET SIZE OF DPB ;KLN031L W ASL R2 ;IN BYTES ;KLN031MW ADD #,R2 ;ADD SIZE OF HEADER AND EXTRA STORAGE AREA ;KLN031C7W MOV R2,MAP6+H$SIZE+4 ;STORE OFFSET IN DPB ;KLN0313W; ;KLN031BW; STORE REAL ADDRESS OF USER BUFFER IN REQUEST PACKET ;KLN031W; ;KLN0318W MOV (R5),(R1) ;STORE ADDRESS OF USER BUFFER ;KLN031W ;KLN031 W; ;KLN031(W; SEND REQUEST TO CPRAME ;KLN031W; ;KLN031:W SUB #,R1 ;GET SIZE OF REQUEST PACKET ;KLN031%W CPSEN$ #SN$DIR,R0,R1 ;KLN031W; ;KLN031&W; GET RESPONSE PACKET ;KLN031W; ;KLN031/W MOV R0,-(SP) ;SAVE PACKET ADDRESS ;KLN0313(W MOV R0,KISAR6 ;MAP PACKET ;KLN031W; ;KLN031 W; CHECK STATUS ;KLN031WW; - IF ERROR OCCURED AND THIS IS GIN$, CHECK DEVICE NAME FIELD FOR TRANSLATED ;KLN031N!W; DEVICE NAME ;KLN031DW; ;KLN031;W CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURNED? ;KLN031I"W BNE 200$ ;IF NE NO ;KLN031W; ;KLN0310W; TRANSFER BUFFERS INTO USER AREA ;KLN031W; ;KLN0314W MOVB MAP6+H$SIZE+1,R0 ;GET SIZE OF DPB ;KLN031 W ASL R0 ;IN BYTES ;KLN031BW ADD #,R0 ;POINT TO ADDRESS OF USER BUFFER ;KLN0315W MOV (R0),R0 ;GET ADDRESS OF USER BUFFER ;KLN031N8W CALL $RELOC ;GET BIAS AND OFFSET OF BUFFER ;KLN0313W MOV R1,R3 ;SET UP DEST BIAS FOR BLXIO ;KLN0311W MOV R2,R4 ;SET UP DEST DISPLACEMENT ;KLN031K6W MOV (SP),R1 ;SET UP SOURCE BIAS FOR APR5 ;KLN031BW MOV #<6*2>,R0 ;GET SIZE OF BUFFER ASSUMING THIS IS GLUN ;KLN0314W MOVB MAP6+H$SIZE+1,R2 ;GET SIZE OF DPB ;KLN031-W CMPB #GL$SIZ,R2 ;IS THIS GLUN? ;KLN031#W BEQ 180$ ;IF EQ YES ;KLN031D>W00M^]L]DATADATADATADATADATADATADATA MOV MAP6+H$SIZE+6,R0 ;GET SIZE OF BUFFER FROM DPB ;KLN031!W ASL R0 ; IN BYTES ;KLN031C3W180$: ASL R2 ;GET SIZE OF DPB IN BYTES ;KLN031,@W ADD #,R2 ;SET UP SOURCE DISPLACEMENT ;KLN031>W190$: CALL $BLXIO ;RETURN EQUIVALENCE NAME STRING ;KLN031W; ;KLN031.W; CPRAME HAS RETURNED AN ERROR ;KLN031RW; - IF THIS IS GIN$, CHECK DEVICE NAME FIELD FOR TRANSLATED DEVICE NAME ;KLN031W; ;KLN031W200$: ;KLN0310W MOV (SP)+,R0 ;GET BUFFER BIAS BACK ;KLN031W ;KLN031 6W CMPB #GN$SIZ,MAP6+H$SIZE+1 ;IS THIS GIN? ;KLN031"W BNE 210$ ;IF NE NO ;KLN031W ;KLN031A9W MOV MAP6+H$SIZE+10,R4 ;DEVICE NAME RETURNED? ;KLN0311#W BNE 250$ ;IF NE YES ;KLN031LW ;KLN031L3W210$: CALLR $CPDEA ;DEALLOCATE BUFFER ;KLN031NW ;KLN031W245$: ;KLN044=W RETURN ;JUST RETURN SINCE KXDRV SET ERROR IN DSW ;KLN044 W ;KLN044$W250$: ;KLN0319W MOV MAP6+H$SIZE+4,-(SP) ;SAVE BUFFER ADDRESS ;KLN031N4W MOV MAP6+H$SIZE+12,R5 ;GET UNIT NUMBER ;KLN031-W CALL $CPDEA ;DEALLOCATE BUFFER ;KLN031 W; ;KLN031SW; CPRAME HAS RETURN A TRANSLATED LOGICAL DEVICE NAME, LOOK FOR IT IN OUR ;KLN031KW; TABLES ;KLN031W; ;KLN031)W MOV R4,R0 ;GET DEVICE NAME ;KLN031 )W MOV R5,R1 ;AND UNIT NUMBER ;KLN031T+W CALL $CVDVN ;GET UCB ADDRESS ;KLN031S%W BCS 245$ ;IF CS ERROR ;KLN031$W; ;KLN031;W; NOW WE REJOIN COMMON CODE TO FILL IN BUFFER ;KLN031MW; ;KLN0312W MOV (SP)+,R3 ;RESTORE BUFFER ADDRESS ;KLN031W ;KLN031 W; ;KLN0316W; MAKE SURE THIS IS NOT A GENERIC DEVICE ;KLN031W; ;KLN0311W MOV R2,R4 ;MOVE UCB ADDRESS INTO R4 ;KLN031;2W MOV (R4),R2 ;GET BACK POINTER TO DCB ;KLN0313W CMP R2,$XXLOW ;LOWER THAN LOWER BOUND? ;KLN031C!W BLO 3$ ;IF LO YES ;KLN0313W CMP R2,$XXHGH ;HIGHER THAN HIGH BOUND? ;KLN031;!W BHI 3$ ;IF HI YES ;KLN031DW ;KLN031 3W RETURN ;RETURN WITH ERROR STATUS SET ;KLN031SW ;KLN031 W .ENDC ;C$$RTK ;KLN031W ;KLN031W2$: ;KLN031W$GLINF:: ;KLN0312W MOV (R4),R2 ;GET BACK POINTER TO DCB ;KLN031W3$: ;KLN0314Y TST (R2)+ ;POINT TO ADDRESS OF FIRST UCB ;**-1"Z MOV R4,R0 ;COPY ADDRESS OF UCB2[ SUB (R2)+,R0 ;CALCULATE RELATIVE ADDRESS OF UCB.\ MOV (R2)+,(R3)+ ;INSERT GENERIC DEVICE NAME2] MOV (R2)+,(R3) ;PICK UP LOW UNIT NUMBER FOR DCB#^ MOV (R2)+,R1 ;PICK UP UCB LENGTHE-_ CALL $DIV ;CALCULATE RELATIVE UNIT NUMBER .` ADD R0,(R3)+ ;CALCULATE LOGICAL UNIT NUMBER*a MOVB #200,-(R3) ;ASSUME RESIDENT DRIVERb TST (R2) ;DRIVER RESIDENT?c BNE 5$ ;IF NE YESD2d CLRB (R3) ;ELSE INDICATE DRIVER IS NONRESIDENTe5$: INC R3 ;ADVANCE POINTER5f ADD #U.CW1,R4 ;POINT TO FIRST CHARACTERISTICS WORD+7g MOV (R4)+,(R3)+ ;INSERT DEVICE CHARACTERISTICS WORDS+h MOV (R4)+,(R3)+ ;i MOV (R4)+,(R3)+ ;j MOV (R4),(R3) ; >k BIT #DV.ISP!DV.OSP,U.CW1-U.CW4(R4) ;IS IT A SPOOLED DEVICE?l BEQ 9$ ;IF EQ NO>m CMP U.ATT-U.CW4(R4),R5 ;IS ISSUING TASK THE DESPOOLER TASK?n BEQ 9$ ;IF EQ YES, DONES>o MOV U.RED-U.CW4(R4),R0 ;PICK UP ADDRESS OF INTERMEDIATE UCB=p MOV U.CW4(R0),(R3) ;RETURN BUFFER SIZE OF INTERMEDIATE DEV 6q TST -(R3) ;THIRD CHARACTERISTICS WORD IS UNDEFINED7r MOV (R4),-(R3) ;RETURN BUFFER SIZE OF SPOOLED DEVICEC7s BIC #^C,-(R3) ;CLR ALL BUT SPOOL BITS4:t BIS U.CW1(R0),(R3) ;RETURN INTERMEDIATE CHARACTERISTICS-u9$: RETURN ;RETURN DIRECTIVE STATUS OF +1 )v10$: DRSTS D.RS5 ;SET DIRECTIVE STATUSSwx .ENDE DESPOOLER TASK?n BEQ 9$ ;IF EQ YES, DONES>o MOV U.RED-U.CW4(R4),R0 ;PICK UP ADDRESS OF INTERMEDIATE UCB=p MOV U.CW4(R0),(R3) ;RETURN BUFFER SIZE OF INTERMEDIATE DEV 6q TST -(R3) ;THIRD CHARACTERISTICS WORD IS UNDEFINED7r MOV (R4),-(R3) ;RETURN BUFFER SIZE OF SPOOLED DEVICEC7s BIC #^C,-(R3) ;CLR ALL BUT SPOOL BITS4:t BIS U.CW1(R0),(R300N^O^]eaek .TITLE DRGSS( .IDENT /04.01/P ;(; COPYRIGHT (C) 1974, 1976, 1979, 19871; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.H;(C; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED; ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.# ;H ; VERSION 04 ;N ; D. N. CUTLER 31-AUG-73;R; PREVIOUSLY MODIFIED BY:;;$; D. N. CUTLER; J. E. PROVINO ;T;K&; MODIFIED FOR RSX-11M-PLUS V4.0 BY:;!; L. B. MCCULLEY 23-MAR-87 4.01O;.9; LBM050 - SUPPORT PROCESSORS WITHOUT SWITCH REGISTERS ;9;9;9; MACRO LIBRARY CALLSI;  .MCALL HWDDF$& HWDDF$ ;DEFINE HARDWARE REGISTERS ;+ !; **-$DRGSS-GET SENSE SWITCHES";RL#; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO STORE THE CONTENTS OF THE CONSOLE@$; SWITCH REGISTER IN THE ISSUING TASK'S DIRECTIVE STATUS WORD.%;&; DPB FORMAT:L';%(; WD. 00 -- DIC(125.),DPB SIZE(1.).I);R *; INPUTS: +;B;,; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.5--; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. 1.; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK../; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.0;G71; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)2;H<3; C=0 WITH A DIRECTIVE STATUS EQUAL TO THE CONTENTS OF THE4; CONSOLE SWITCH REGISTER.N5;-678 .IF DF G$$TSS99$DRGSS:: ;LBM050B9 BIT #HF.SWR,$HFMSK ; HARDWARE SWITCH REGISTER PRESENT? ;LBM050/9 BEQ 1$ ; NO, DON'T TRY TO READ IT ;LBM050 :9 MOV SWR,$SWR ; YES, READ IT INTO SYSCM STORAGE ;LBM050891$: MOV $SWR,2(SP) ; RETURN VALUE FROM SYSCM ;LBM0509 RETURN ;LBM050 H ;**-14I .ENDCJKL .ENDTIVE STATUS AND PS RETURNED TO TASK)2;H<3; C=0 WITH A DIRECTIVE STATUS EQUAL TO THE CONTENTS OF THE4; CONSOLE SWITCH REGISTER.N5;-678 .IF DF G$$TSS99$DRGSS:: ;LBM050B9 BIT #HF.SWR,$HFMSK ; HARDWARE SWITCH REGISTER PRESENT? ;LBM050/9 BEQ 1$ ; NO, DON'T TRY TO READ IT ;LBM050 .TITLE DRSST .IDENT /05/ I;Z ; COPYRIGHT (C) 1974, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.T;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDA9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.H;D ; VERSION 05;; D. N. CUTLER 30-AUG-73;N; PREVIOUSLY MODIFIED BY:M;:; D. N. CUTLER;K; MODIFIED BY:;I; T. J. MILLER 14-AUG-77;I;; TM099 -- REMOVE UNEEDED CONDITIONALIZATION FOR RSX-11M+.K;W; T. J. MILLER 10-DEC-77; :; TM100 -- ACCEPT ODD SST VECTOR ADDRESS AS SPECIFICATION4; OF "OTHER" MODE FOR SST SERVICE ROUTINE IF SUPER; LIBRARIES ARE SUPPORTED.;W; MACRO LIBRARY CALLSA;C .MCALL HDRDF$% HDRDF$ ;DEFINE TASK HEADER OFFSETSH;+,; **-$DRSDV-SPECIFY DEBUGGING AID SST VECTOR;.F; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO RECORD THE ADDRESS AND LENGTHF; OF A VECTOR OF SST SERVICE ROUTINE ENTRY POINTS FOR USE BY AN INTRA-; TASK DEGUGGING AID (E.G. ODT) ;- ; DPB FORMAT:.; $; WD. 00 -- DIC (103.),DPB SIZE(3.).&; WD. 01 -- ADDRESS OF THE SST VECTOR.0; WD. 02 -- NUMBER OF ENTRIES IN THE SST VECTOR.;P; SST VECTOR FORMAT:;P7; WD. 00 -- TRAPS TO 4 (ODD ADDRESS, NONEX MEM, ETC.).; WD. 01 -- SEGMENT FAULT. @; WD. 02 -- TRACE TRAP (T-BIT) OR EXECUTION OF BPT INSTRUCTION.-; WD. 03 -- EXECUTION OF AN IOT INSTRUCTION. =; WD. 04 -- EXECUTION OF AN ILLEGAL OR RESERVED INSTRUCTION.T4; WD. 05 -- EXECUTION OF A NON RSX EMT INSTRUCTION.-; WD. 06 -- EXECUTION OF A TRAP INSTRUCTION. 6; WD. 07 -- PDP 11/40 FLOATING POINT EXCEPTION FAULT.;C ; INPUTS: ;-9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.R+; R3=ADDRESS OF THE SECOND WORD IN THE DPB.S/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)R;I-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED..=; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF PART OF VECTO00O^P^]DATADATADATADATADATADATADATARP/; IS OUTSIDE OF ISSUING TASK'S ADDRESS SPACE,N0; VECTOR ADDRESS OF ZERO IS SPECIFIED, OR THE*; VECTOR SIZE IS GREATER THAN 31. WORDS.;- .ENABL LSBB<$DRSDV::ADD #H.ODVL,R4 ;POINT TO ODT VECTOR LENGTH IN HEADER" BR 10$ ;FINISH UP IN COMMON CODE;+#; **-$DRSTV-SPECIFY TASK SST VECTORE;NI; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO RECORD THE ADDRESS AND LENGTH OFIJ; A VECTOR OF SST SERVICE ROUTINE ENTRY POINT FOR USE BY THE ISSUING TASK.;A ; DPB FORMAT: ;R#; WD. 00 -- DIC(105.),DPB SIZE(3.).T&; WD. 01 -- ADDRESS OF THE SST VECTOR.0; WD. 02 -- NUMBER OF ENTRIES IN THE SST VECTOR.; ; SST VECTOR FORMAT:;A7; WD. 00 -- TRAPS TO 4 (ODD ADDRESS, NONEX MEM, ETC.).;; WD. 01 -- SEGMENT FAULT. B; WD. 02 -- TRACE TRAP (T-BIT) OR EXECUTION OF A BPT INSTRUCTION.-; WD. 03 -- EXECUTION OF AN IOT INSTRUCTION.C=; WD. 04 -- EXECUTION OF AN ILLEGAL OR RESERVED INSTRUCTION.O4; WD. 05 -- EXECUTION OF A NON RSX EMT INSTRUCTION.-; WD. 06 -- EXECUTION OF A TRAP INSTRUCTION.I6; WD. 07 -- PDP 11/40 FLOATING POINT EXCEPTION FAULT.;O ; INPUTS:2; 9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.A+; R3=ADDRESS OF THE SECOND WORD IN THE DPB. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)R;I-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E&; DIRECTIVE STATUS OF +1 IF RETURNED.; C=1 IF DIRECTIVE IS REJECTED..=; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF PART OF VECTORP/; IS OUTSIDE OF ISSUING TASK'S ADDRESS SPACE,N/; VECTOR ADDRESS OF ZERO IS SPECIFIED, OR THEO*; VECTOR SIZE IS GREATER THAN 31. WORDS.;-=$DRSTV::ADD #H.TKVL,R4 ;POINT TO TASK VECTOR LENGTH IN HEADERK(10$: MOV (R3)+,R0 ;GET ADDRESS OF VECTOR BEQ 20$ ;IF EQ DEASSIGN VECTOR' MOV (R3),R1 ;GET LENGTH OF SST VECTOR= BEQ 15$ ;IF EQ DEASSIGN VECTOR CMP (R3),#31. ;VECTOR TOO BIG?+ BHI 30$ ;IF HI YES# ASL R1 ;CONVERT LENGTH TO BYTES I S U .IF DF S$$LIB T$ BIC #1,R0 ;INSURE LOW BIT IS CLEAR O .IFTF A' CALL $ACHKW ;ADDRESS CHECK SST VECTORO,15$: MOV (R3),(R4) ;SET SST VECTOR LENGTH # ASL (R4) ;CONVERT LENGTH TO BYTESS : .IFTT ,-20$: MOV -(R3),R2 ;PICK UP SST VECTOR ADDRESS:. CALL $CALTA ;CALCULATE PROPER VECTOR ADDRESS# MOV R2,-(R4) ;STORE PROPER ADDRESS  T .IFF  S,20$: MOV -(R3),-(R4) ;SET SST VECTOR ADDRESS P .ENDC ; T( RETURN ;RETURN DIRECTIVE STATUS OF +1(30$: DRSTS D.RS98 ;SET DIRECTIVE STATUS .DSABL LSB .END#1,R0 ;I .TITLE DTDRV .IDENT /10/;; COPYRIGHT (C) 1974, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 10;; D. N. CUTLER 1-DEC-73;; PREVIOUSLY MODIFIED BY:;; P. J. BEZEREDI; D. N. CUTLER; C. A. D'ELIA; F. L. STRAIGHT; T. J. MILLER;; MODIFIED BY:;; P. J. BEZEREDI 13-MAY-77;'; PB029 -- I/O DATA STRUCTURE CHANGES.;.; P. J. BEZEREDI 14-DEC-77;6; PB050 -- REMOVE UNNEEDED CONDITIONALS FOR RSX-11M+.;O; E. L. BAATZ 18-JUN-78 ;S); EB148 -- REMOVE EXPLICIT PS REFERENCE.M;O; P. J. BEZEREDI 05-JUL-78;C9; PB079 -- INSURE R2 CONTAINS CSR ADDRESS BEFORE LOGGING ; AN ERROR.L;1; P. J. BEZEREDI 18-JUL-78;F7; PB081 -- EXPAND I/O ACTIVITY INFORMATION REPORTED AT'; TIME OF AN ERROR.;.; P. J. BEZEREDI 21-AUG-78;6; PB083 -- ADDITION OF SOFTWARE VOLUME VALID SUPPORT.;R ; TC11 DECTAPE CONTROLLER DRIVER;I; MACRO LIBRARY CALLS0;  .MCALL ABODF$,HWDDF$,PKTDF$" ABODF$ ;DEFINE TASK ABORT CODES$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;-; EQUATED SYMBOLS ;U-WAIT=100000 ;WAITING TO SELECT UNIT (1=YES)N,ABRT=40000 ;ABORT CURRENT FUNCTION (1=YES)RETRY=5. ;ERROR RETRY COUNT ;T ; LOCAL DATA;>; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);3>; DIAGNOSTIC FUNCTIONS IO.RNF AND IO.RNR USE BIT 7 OF RTTBL AS!00P ^^]eaek; A FLAG FOR INTERRUPT SERVICING.I<RTTBL: .BLKW T$$C11 ;ERROR RETRY COUNT AND DRIVE RESET FLAG;+; DRIVER DISPATCH TABLE ;-( DDT$ DT,T$$C11 ;GENERATE DISPATCH TABLE;+,; **-DTINI-TC11 DECTAPE CONTROLLER INITIATOR;TH; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUEG; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THEH; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN AH; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IH; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER>; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.;R ; INPUTS:H;B:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;H ; OUTPUTS:;NB; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAB; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OP; ATION IS INITIATED.E;- .ENABL LSBS=DTINI: GTPKT$ DT,T$$C11,DTPWF ;GET NEXT I/O PACKET TO PROCESS.; 1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:E;T'; R1=ADDRESS OF THE I/O REQUEST PACKET.R-; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.I; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.E:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;I); TC11 DECTAPE I/O REQUEST PACKET FORMAT:E;I"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK.,@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTER TASK HEADER.B; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK HEADE@; WD. 05 -- I/O FUNCTION CODE (IO.RLB,IO.RLV,IO.WLB, OR IO.WLV).0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.B; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140003; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.EA; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER.O+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.O-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.D; WD. 15 -- NOT USED. 9; WD. 16 -- LOW BYTE MUST BE ZERO AND HIGH BYTE NOT USED.C0; WD. 17 -- LOGICAL BLOCK NUMBER OF I/O REQUEST.;; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. BLK. ADDRESSOB; WD. 21 -- DIAGNOSTIC REG. BLK. ADDRESS (REAL OR DISPL. + 140000);($ CALL $VOLVD ;VALIDATE VOLUME VALID BCS 8$ ;IF CS WE FAILEDS TST R0 ;TRANSFER FUNCTION? BPL 8$ ;IF PL NO .IF DF M$$EXT, CALL $STMAP ;SET UP UNIBUS MAPPING ADDRESS .ENDC: MOV #<8.*256.>+RETRY,RTTBL(R3) ;SET ROCK AND RETRY COUNTS$ MOV R1,R0 ;COPY I/O PACKET ADDRESS& ADD #I.FCN,R0 ;POINT TO FUNCTION CODE- BITB #IQ.UMD,(R0) ;DIAGNOSTIC FUNCTION CALL?D BEQ 4$ ;IF EQ NO5 CLRB RTTBL(R3) ;NO RETRIES FOR DIAGNOSTIC OPERATIONSO. CMP #IO.RNF!IQ.UMD,(R0) ;READ BLOCK FORWARD? BNE 2$ ;IF NE NO: MOV #IO.RLB!IQ.UMD,(R0) ;CONVERT TO READ LOGICAL FORWARD BR 3$ ;F12$: CMP #IO.RNR!IQ.UMD,(R0) ;READ BLOCK REVERSE? BNE 4$ ;IF NE NO: MOV #IO.RLV!IQ.UMD,(R0) ;CONVERT TO READ LOGICAL REVERSE23$: BIS #200,RTTBL(R3) ;SET READ BLOCK NUMBER FLAG/4$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTIONO MOV R5,R3 ;COPY ADDRESS OF UCB4 ADD #U.BUF+1,R3 ;POINT TO HIGH BYTE OF MEM.EXT WORD# MOVB R2,(R3) ;INSERT DRIVE NUMBERC. BISB #105,-(R3) ;ASSUME READ LOGICAL FUNCTION7 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?)# BHIS 9$ ;IF HIS FUNCTION IS LEGALB8$: JMP 195$ ;ILLEGAL FUNCTION($9$: BEQ 10$ ;IF EQ FUNCTION IS READ0 BIS #10,(R3) ;CONVERT TO WRITE LOGICAL FUNCTION310$: BIT #IO.WLV&377,I.FCN(R1) ;REVERSE DIRECTION?B BEQ 20$ ;IF EQ NO * BIS #4000,(R3) ;SET REVERSE DIRECTION BIT'20$: CLRB U.CW2+1(R5) ;CLEAR ABORT FLAG#) CALL $BLKCK ;CHECK LOGICAL BLOCK NUMBERO, MOV R0,U.PRM(R5) ;SAVE LOGICAL BLOCK NUMBER;5; INITIATE I/O OPERATION;U30$: ;REF LABEL .IF DF M$$EXT% CALL $MPUBM ;MAP UNIBUS TO TRANSFER  .ENDC% MOV S.CSR(R4),R0 ;GET ADDRESS OF CSR2 CMP (R0)+,(R0)+ ;POINT TO BUFFER ADDRESS REGISTER, MOV U.BUF+2(R5),(R0) ;INSERT BUFFER ADDRESS8 MOV U.C00P(^^]DATADATADATADATADATADATADATANT(R5),-(R0) ;INSERT LENGTH OF TRANSFER IN BYTES* CLR U.PRM+2(R5) ;CLEAR FINAL ERROR STATUS( ROR (R0) ;CONVERT LENGTH TO WORD COUNT$ NEG (R0) ;MAKE NEGATIVE WORD COUNT6 MOVB U.BUF+1(R5),-(R0) ;INSERT UNIT AND DIRECTION BIT0 BIS #WAIT,U.CW2(R5) ;SET WAITING TO SELECT UNIT- MOVB #11,-(R0) ;STOP TRANSPORT (SELECT UNIT) $35$: BIT #100200,(R0) ;SELECT ERROR? BMI 40$ ;IF MI YES# BEQ 35$ ;IF EQ DRIVE NOT SELECTED;2 BIC #WAIT,U.CW2(R5) ;CLEAR WAITING TO SELECT UNIT; MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNTT% CALL $BMSET ;INDICATE I/O IS ACTIVE)3 BISB #S3.SIP,S.ST3(R4) ;;;SHOW SEARCH IN PROGRESSH( MOVB #103,(R0) ;START SEARCH FOR BLOCK.;CH; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUH; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDIT3; THAT COULD EXIST IN RESTARTING THE I/O OPERATION.I;$DTPWF: RETURN ;$; ; OUTPUT SELECT ERROR MESSAGEA;U840$: MOV #T.NDSE,R0 ;SET FOR DEVICE SELECT ERROR MESSAGE6 MOVB #1,S.CTM(R4) ;RESET CURRENT DEVICE TIMEOUT COUNT( DECB S.STS(R4) ;TIME TO OUTPUT MESSAGE? BNE DTPWF ;IF NE NO = MOVB #15.,S.STS(R4) ;SET TO OUTPUT NEXT MESSAGE IN 15. SECON  CALLR $DVMSG ;OUTPUT MESSAGE;IB; CANCEL I/O OPERATION - FORCE I/O TO COMPLETE IF DEVICE NOT READY;T4DTCAN: CMP R1,I.TCB(R0) ;;;REQUEST FOR CURRENT TASK? BNE 50$ ;;;IF NE NOE9 BIS #ABRT,U.CW2(R5) ;;;SET FOR ABORT IF DEVICE NOT READYR50$: RETURN ;;;;M@; DEVICE TIMEOUT USUALLY OCCURS BECAUSE THE DRIVER IS WAITING TOB; SELECT A UNIT. TIMEOUTS MAY ALSO OCCUR AS A RESULT OF A HARDWARE; FAILURE OR A POWERFAILURE.;E1DTOUT: MOV S.PKT(R4),R1 ;;;GET I/O PACKET ADDRESSE4 BITB #IQ.UMD,I.FCN(R1) ;;;DIAGNOSTIC FUNCTION CALL? BNE 165$ ;;;IF NE YESF. MOV U.CW2(R5),R1 ;;;WAITING TO SELECT A UNIT? BMI 55$ ;;;IF MI YES# CALL $DTOER ;;;LOG DEVICE TIMEOUT$(55$: MTPS #0 ;;;ALLOW DEVICE INTERRUPTS4 MOV #IE.ABO&377,R0 ;ASSUME REQUEST IS TO BE ABORTED ASL R1 ;ABORT REQUEST? BPL 30$ ;IF PL NOH JMP 190$ ;ABORT REQUESTE;+-; **-$DTINT-TC11 DECTAPE CONTROLLER INTERUPTS ;-8 INTSE$ DT,PR6,T$$C11 ;;;SAVE REGISTERS AND SET PRIORITY MOV R3,-(SP) ;;;SAVE R38 MOV U.SCB(R5),R3 ;;;GET ADDRESS OF STATUS CONTROL BLOCK> MOVB S.ITM(R3),S.CTM(R3) ;;;RESET CURRENT DEVICE TIMEOUT COUN4 MOV S.CSR(R3),R3 ;;;GET ADDRESS OF COMMAND REGISTER+ TSTB RTTBL(R4) ;DIAGNOSTIC READ BLOCK NO.?D BMI 150$ ;IF MI YES#* BIT #2,(R3) ;;;BLOCK SEARCH IN PROGRESS? BEQ 150$ ;;;IF EQ NO TST (R3) ;;;SEARCH ERROR?J BPL 70$ ;;;IF PL NOE TST -(R3) ;;;END ZONE? BMI 110$ ;;;IF MI YEST& BIT #20000,(R3)+ ;;;MARK TRACK ERROR?( BNE 120$ ;;;IF NE YES-TRY TO BYPASS IT860$: MOV #100000,U.PRM+2(R5) ;;;SET UNRECOVERABLE ERROR( BIC #100,(R3) ;;;CLEAR INTERRUPT ENABLE BR 160$ ;;;V070$: MOV 6(R3),-(SP) ;;;GET CURRENT BLOCK NUMBER5 CMPB U.BUF+1(R5),1(R3) ;;;MOVING IN FINAL DIRECTION?B BNE 80$ ;;;IF NE NO;* CMP (SP),U.PRM(R5) ;;;BLOCK NUMBER MATCH? BEQ 130$ ;;;IF EQ YES;380$: BIT #4000,(R3) ;;;MOVING IN FORWARD DIRECTION?I BEQ 90$ ;;;IF EQ YES% ADD #2,(SP) ;;;ADD TURN AROUND BIASB. CMP U.PRM(R5),(SP)+ ;;;TURN AROUND NECESSARY? BR 100$ ;;;R.90$: SUB #2,(SP) ;;;SUBTRACT TURN AROUND BIAS. CMP (SP)+,U.PRM(R5) ;;;TURN AROUND NECESSARY?100$: BLE 120$ ;;;IF LE NO & TST -(R3) ;;;POINT TO ERROR REGISTER-110$: TST (R3)+ ;;;POINT TO COMMAND REGISTERN DECB RTTBL+1(R4) ;;;DRIVE HUNG? BLT 60$ ;;;IF LT YES% MOV #4000,-(SP) ;;;GET DIRECTION BIT17 BIC (R3),(SP) ;;;.NOT.COMMAND REGISTER.AND.DIRECTION BA8 BIC #4000,(R3) ;;;.NOT.DIRECTION BIT.AND.COMMAND REGIST4 BIS (SP)+,(R3) ;;;DIRECTION BIT.OR.COMMAND REGISTER"120$: INC (R3) ;;;CONTINUE SEARCH) MOV U.SCB(R5),R4 ;;;RETREIVE SCB ADDRESS BR 140$ ;;;M2130$: TST (SP)+ ;;;REMOVE BLOCK NUMBER FROM STACK, MOV U.SCB(R5),R4 ;;;RETRIEVE ADDRESS OF SCB4 BICB #S3.SIP,S.ST3(R4) ;;;RESET SEARCH IN PROGRESS0 MOV U.BUF(R5),(R3) ;;;START READ/WRITE FUNCTION 140$: MOV (SP)+,R3 ;;;RESTORE R3. BIS #S2.ACT,S.ST2(R4) ;;;SET I/O ACTIVE FLAG RETURN ;;;O.150$: BICB #100,00P0^3^4^eaek(R3) ;;;CLEAR INTERRUPT ENABLE TST (R3) ;;;ANY ERRORS?( BPL 160$ ;;;IF PL NO ERRORS , MOV -(R3),U.PRM+2(R5) ;;;SAVE ERROR STATUS 160$: MOV (SP)+,R3 ;;;RESTORE R3' CALL $FORK ;;;CREATE A SYSTEM PROCESS " MOV R4,R3 ;COPY CONTROLLER INDEX6 MOV U.SCB(R5),R4 ;GET ADDRESS OF STATUS CONTROL BLOCK2 MOV S.CSR(R4),R2 ;GET ADDRESS OF COMMAND REGISTER1 MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL COMPLETION ) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSR2 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION CALL?165$: BNE 180$ ;IF NE YES* MOV U.PRM+2(R5),R1 ;RETREIVE ERROR STATUS BEQ 180$ ;IF EQ SUCCESS CALL $DVERR ;LOG DEVICE ERRORR" BIT #63000,R1 ;RECOVERABLE ERROR? BEQ 170$ ;IF EQ NO" DECB RTTBL(R3) ;ANY MORE RETRIES? BLE 170$ ;IF LE NO' MOVB #8.,RTTBL+1(R3) ;RESET ROCK COUNT  JMP 30$ ;TRY AGAIN3170$: MOV #IE.WLK&377,R0 ;ASSUME DRIVE WRITE LOCKEDM# BIT #10000,R1 ;DRIVE WRITE LOCKED?C BNE 180$ ;IF NE YESR( MOV #IE.VER&377,R0 ;UNRECOVERABLE ERROR3180$: MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS82 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION CALL? BEQ 187$ ;IF EQ NO+ CALL $CRPAS ;PASS UNIBUS DEVICE REGISTERSR/187$: MOV U.CNT(R5),R1 ;GET ORIGINAL BYTE COUNT;3 ADD 2(R2),R1 ;CALCULATE NUMBER OF BYTES TRANSFERED0 ADD 2(R2),R1 ;V%190$: MOVB #11,(R2) ;STOP TAPE MOTIONJ/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTU/ BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNTT(195$: CALL $IODON ;FINISH I/O OPERATION JMP DTINI ;GO AGAINR .DSABL LSB8 .END.T(R4),R1 ;RETREIVE I/O PACKET ADAL NUMBER OF BUFFERS?O BLOS 10$ ;IF LOS YES. MOV #N$$MBF,R1 ;NO--SET FOR MAX WE CAN HANDLE TST R3 ;SEE IF IND DEFAULTED, BEQ 10$ ;IF EQ YES--SKIP STATUS ALTERATION, CLR (R3) ;NOTE THAT TOO MANY BUFFERS GIVEN(10$: MOV R1,(R2)+ ;SET NUMBER OF BUFFERS220$: MOV (R5)+,(R2)+ ;SET BUFFER ADDRESS INTO IBUF DEC R1 ;DONE?  BGT 20$ ;IF GT NOE RETURN  .ENDBUF MOV #-1,(R2) ;INITIALIZE QUEUES .REPT 9.  MOV (R2)+,(R2) ;... .ENDM TST (R2)+ ;MOVE TO NEXT WORD) CMP R1,#N$$MBF ;LEG .TITLE KSTOP STOP A SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 16-AUG-77; ; SYSTEM MACRO CALLS;O .MCALL KSWDF$ KSWDF$  ( .SBTTL STPSWP STOP AN IN PROGRESS SWEEP;+%; STPSWP -- STOP AN IN-PROGRESS SWEEP ;M; CALLING SEQUENCE:;I ; CALL STPSWP (IBUF, IWHEN, IND);I ; INPUTS:O;A2; IBUF IS THE IBUF USED IN A CALL TO START A SWEEP ; IWHEN SPECIFIES THE STOP TIME:; 0 IMMEDIATELY (DEFAULT) ; +N AT END OF CURRENT BUFFER ; -N (RESERVED)O; IND RETURNS THE STATUS+; 0 COULD NOT FIND SWB OR SWEEP NOT ACTIVEE; 1 SWEEP STOPPED;R ; OUTPUTS:; ; THE SWEEP IS STOPPED;;-STPSWP:: ;REF LABEL & CALL .K.PAA ;VALIDATE ARGS AND STACK .WORD 3 ;THREE ARGST .WORD 4 ;IBUF REQUIRED BCS 80$ ;IF CS CAN'T HELP OUTA CLR R2 ;ASSUME FAILURE MOV (SP)+,R0 ;GET IBUF ADDRESS  CALL .FDSWI ;FIND SWBO BCC 10$ ;IF CC CONTINUEC TST (SP)+ ;POP IWHEN ADDRESS BR 60$ ;FINISH UP %10$: MTPS #PR6 ;;;DISABLE INTERRUPTS(/ MOV #S$WSEB,R0 ;;;ASSUME STOP AT END OF BUFFERN" MOV (SP)+,R3 ;;;GET IWHEN ADDRESS. BEQ 20$ ;;;IF EQ DEFAULTED--STOP IMMEDIATELY" TST (R3) ;;;NO--SEE WHEN TO STOP( BNE 40$ ;;;IF NE STOP AT END OF BUFFER008^9^?^DATADATADATADATADATADATADATA&20$: MOV #S$WSTP,R0 ;;;SET TO STOP NOW; CLR S.WCNT(R1) ;;;THIS SHOULD FORCE A BUFFER SWITCH TO GET % ;;; THE ISR TO REALIZE HE IS DONEU+40$: BIS R0,S.WFL2(R1) ;;;SET THE STOP FLAG$ MTPS #0 ;;;ALLOW INTERRUPTS  INC R2 ;SET SUCCESS "60$: MOV (SP)+,R0 ;GET IND ADDRESS BEQ 80$ ;IF EQ NOT SUPPLIEDS MOV R2,(R0) ;SET STATUS 80$: RETURNM .ENDR3 ;;;GET IWHEN ADDRESS. BEQ 20$ ;;;IF EQ DEFAULTED--STOP IMMEDIATELY" TST (R3) ;;;NO--SEE WHEN TO STOP( BNE 40$ ;;;IF NE STOP AT END OF BUFFER .NLIST .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; A; MACROS TO FACILITATE CALLING FORTRAN SUBROUTINES FROM MACRO-11.U;O ; VERSION 01; C. D'ELIA 17-NOV-77S;  S;+8; INITS -- INITIALIZE FOR STRUCTURED FORTRAN CALL MACROS;L; CALLING SEQUENCE:N; ; INITS; ; EFFECTS:;O; SETS THE GLOBAL LISTING FLAG; SETS THE ASSEMBLER PASS FLAG;L;- .MACRO INITS LST=0M$LST=LST .IF NDF $PASS$PASS=0P .IFF.$PASS=1E .ENDC .ENDM S L;+"; CALLS -- CALL FORTRAN SUBROUTINE;O; CALLING SEQUENCE:H; ; CALLS SUBR,;S; WHERE:;E ; SUBR IS THE SUBROUTINE TO CALL;R:; ARG1,..ARGN ARE THE ARGUMENTS TO PASS TO THE SUBROUTINE.1; THEY MAY EITHER BE CONSTANTS (1,5,8,12,ETC.-- ,; TAKEN AS DECIMAL NUMBERS ("." APPENDED))+; OR MEMORY LOCATIONS (IDATA, BUF, ETC.).N(; IF AN ARGUMENT IS DEFAULTED (",,") A-; MINUS 1 (177777) WILL BE INSERTED FOR THEF(; ARGUMENT ADDRESS (FORTRAN STANDARD).;. ; EXAMPLES:;; CALLS SUB1,<5,18,ARG3>; CALLS SUB2,N; CALLS SUB3,<,,,IOUT>;1;- .MACRO CALLS SUBR,ARGLST .PSECT $ARGL$$$1=.E .BLKB 2$NARG=01 .IRP X, .IF B .WORD 177777O .IFF .NTYPE $T,X .IF NE $T-67N .ERROR X ;INVALID ARGUMENTE .MEXITM .ENDC GENARG XE .ENDC $NARG=$NARG+1O .ENDM$$2=. .=$$1C .BYTE $NARG,0.=$$2T .PSECTL .IIF GT $LST, .LIST MOV #$$1,R5 JSR PC,SUBR .IIF GT $LST, .NLISTT .ENDM O A T A .MACRO GENARG ARG .IF DF $C'ARG .WORD $C'ARG> .PSECT $CONS$ .IF EQ .-$C'ARG$C'ARG: .WORD ARG'. .ENDC .PSECT $ARGL$ .IFFG .IF NDF $PASS .ERROR ;FAILED TO CALL "INITS" .MEXITA .ENDC .IF EQ $PASSO TSTARG ARG,\ARG .IFFP .WORD ARG .ENDC .ENDC .ENDM L A .MACRO TSTARG SYM,VAL .IF IDN , .PSECT $CONS$$C'SYM: .WORD SYM'.$ .PSECT $ARGL$ .WORD $C'SYMS .IFF. .WORD SYM .ENDC .ENDM .LIST PC,SUBR .IIF GT $LST, .NLISTT .ENDM O A T A .MACRO GENARG ARG .IF DF $C'ARG .WORD $C'ARG> .PSECT $CONS$ .IF EQ .-$C'ARG$C'ARG: .WORD ARG'. .ENDC .PSECT $ARGL$ .IFFG .IF NDF $PASS .ERROR ;FAILED TO CALL "INITS" .MEXITA .ENDC .IF EQ $PASSO TSTARG ARG,\ARG .IFFP .WORD ARG .ENDC1 .TITLE KSUB SINGLE PRECISION FL. PT. SUBTRACTION .IDENT /M02.00/A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;:; COPYRIGHT (C) 1977, 1978, DIGITAL EQUIPMENT CORPORATION.; H.J.;+'; .KSUB -- SINGLE PRECISION SUBTRACTION;); THIS ROUTINE SUBTRACTS R2:R3 FROM R0:R1; ; INPUTS:;,; R0:R1, R2:R3 SINGLE PRECISION REAL NUMBERS; ; OUTPUTS:;; R0:R1 = R0:R1 - R2:R31; PRECISION SHOULD BE GOOD TO 00@^3^4^eaek24 BITS OF MANTISSAL;R;-,.KSUB:: ADD #100000,R2 ;NEGATE SECOND NUMBER MOV R4,-(SP) ;SAVE R4 AND R5R MOV R5,-(SP)M2 MOV #2,R5 ;R5 GETS SIGNS AND C GETS 1 EVENTUALLY ASL R0 ;GET SIGN OF 1 BEQ NOAD1 ;ITS 0., RESULT IS 2 ROR R5 ;SAVE SIGNR ASL R2 ;GET SIGN OF 2K BEQ NOAD2 ;ITS 0., RESULT IS 1 RORB R5 ;SAVE ITS SIGN' MOV R5,-(SP) ;PUT SIGNS AWAY FOR LATER, RORB R0 ;CARRY IS 1 - SET IMPLIED NORM BIT MOV R0,R4 ;MAKE COPY OF IT CLRB R4 ;ISOLATE EXPONENTO+ BIC R4,R0 ;CLEAR EXPONENT OUT OF MANTISSA SWAB R4 ;GET EXPONENT, SEC ;PERFORM SAME FOR 2 RORB R2 MOV R2,R5 CLRB R5 BIC R5,R2# SWAB R5 ;R4 IS EXP 1, R5 IS EXP 2T=;WE WANT R5 TO BE FINAL EXPONENT AND R4 TO BE NEGATIVE SCALERR# SUB R5,R4 ;HOW ARE WE NORMALIZED?L BEQ ALGND ;PERFECT+ BMI 5$ ;1 IS SMALLER, SCALE IT TO 2'S EXPS# ADD R4,R5 ;1 IS BIGGER, SWITCH'EMS NEG R4 ;FIX SHIFT COUNT  SWAB (SP) ;CORRECT SIGNS MOV R2,-(SP) ;SWITCH MANTISSA'S MOV R3,R2 MOV R1,R3 MOV R2,R1 MOV R0,R2 MOV (SP)+,R0U F*5$: CMP #-9.,R4 ;IS SHIFT LESS THAN BYTE?$ BLT BITSHF ;BRANCH IF YES TO DO IT& ADD #16.,R4 ;IS SHIFT LESS THAN WORD) BGE BYTSHF ;BRANCH IF YES TO BYTE SHIFT & CLR R1 ;SHIFT > WORD, CLEAR LOW WORD! ADD #8.,R4 ;IS SHIFT > 24 BITS?L) BGE WRDSHF ;BRANCH IF NOT TO WORD SHIFTS' ;ADDEND IS INSIGNIFICANT - CLEAN UP54INAD: ASL R3 ;FORCE MANTISSA UP FOR PUTTING IN SIGN$ ROL R2 ;ALWAYS LEAVES CARRY CLEAR!%INAD2: SWAB R5 ;PUT EXP IN HIGH PARTM3 BISB R2,R5 ;PUT IN MANTISSA WITHOUT IMPLIED BIT!!! ROLB (SP)+ ;GET SIGN FROM STACKN ROR R5 ;PUT INTO RESULTH ROR R3 ;RESCALE LOW PART* MOV R5,R2 ;MOVE HIGH PART TO RESULT SPOT&NOAD1: MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R4L" MOV R2,R0 ;SET RESULT INTO R0:R1 MOV R3,R1 ;... RETURN ;DONEINOAD2: ROL R5 ;GET SIGN OF 1  ROR R0 ;PUT BACK INTO IT MOV R0,R2 ;MOVE TO RESULT REGS MOV R1,R3! BR NOAD1 ;BRANCH INTO EXIT CODEA4BYTSHF: CLRB R1 ;BYTE SHIFT, LOW BYTE INSIGNIFICANT SWAB R1 ;PERFORM BYTE SHIFTH SWAB R04WRDSHF: BIS R0,R1 ;MOVES R0 INTO CORRECT BYTE OF R1- CLR R0 ;R0 ONLY HAD 1 BYTE, NOW IT HAS NONE SUB #8.,R4 ;REFIX SHIFT COUNTS#BITSHF: ASR R0 ;NORMALIZE TO COUNTE ROR R1S INC R4P BMI BITSHF ;BRANCH IF NOT DONE- ROL R4 ;R4 IS ZERO FROM SHIFT LOOP - SET IT+ ADD R4,R1 ;TO THE ROUNDING BIT AND ROUND.  ADC R0 1ALGND: CMPB 1(SP),(SP) ;SEE IF SIGNS ARE THE SAMEB* BNE SUBT ;BRANCH IF NOT SAME TO SUBTRACT ADD R1,R3 ;ADD LOW PARTS ADC R2 ;ADD IN CARRY TO HIGH ADD R0,R2 ;ADD HIGH PARTSS. CMP #377,R2 ;ANOTHER HACK TO HANDL@ OVERFLOW. BCC INAD ;BRANCH IF NO CARRY OUT OF MANTISSA- INCB R5 ;BUMP EXP SINCE WE DON'T SHIFT LEFT 1 BEQ 1$ ;CANT ALTER CARRY SO WE USE INCB AND BEQB- SBC R4 ;THIS CLEARS THE CARRY IF R4=1, THUSO' ;PREVENTING US FROM ROUNDING TWICE.T& ADC R3 ;NOW ROUND WITH THE CAREFULLY BCC INAD2 ;(SHORTCUT); ADCB R2 ;MANIPULATED CARRY.E0 ADCB R5 ;BUMP EXP IF MANTISSA OVERFLOWED TWICE. BCC INAD2 ;WE ARE EVER VIGILANT FOR OVERFLOW1$: ;REF LABELH SETZ: CLR R2 CLR R3 ;ZERO THE RESULTO0NOAD0: CMP (SP)+,R0 ;POP THE SIGNS OFF THE STACK BR NOAD1 ;AND GO STORE ITM X$SUBT: SUB R1,R3 ;SUBTRACT LOW PARTS SBC R2 ;REDUCE HIGH BY CARRY SUB R0,R2 ;SUBTRACT HIGH PARTS+ BMI 2$ ;MAKE POSITIVE AND FIX RESULT SIGNF% TSTB R2 ;ARE WE ALREADY NORMALIZED?N BMI INAD ;BRANCH IF YESI DEC R5 ;ADJUST EXPONENT2 BLE 6$ ;BRANCH IF UNDERFLOW5! ASR R4 ;SHIFT ROUND BIT BACK INT ROL R3 ;NORMALIZE 1 PLACER ROL R2 , BEQ 3$ ;BRANCH IF HIGH PART 0 TO CHECK LOW(5$: TSTB R2 ;ARE WE ALREADY NORMALIZED? BMI INAD ;BRANCH IF YEST ASL R3 ;NORMALIZE RESULT ROL R2M DEC R5 ;ADJUST EXP&4$: BGT 5$ ;BRANCH IF DIDNT UNDERFLOW6$: ;REF LABELR BR SETZ ;GO SET RESULT TO 0.$2$: SWAB @SP ;SWITCH RESULTANT SIGN NEG R2 ;MAKE RESULT UNSIGNED NEG R3 SBC R2 ' BGT 5$ ;BRANCH IF NOT ZERO TO NORM ITN&3$: MOV R3,R2 ;START WITH 8 BIT SHIFT2 BEQ NOAD0 ;BRANCH IF LOW PART ZERO, RESULT IS 0.& SWAB R3 ;TEST HIGH PART OF LOW ORDER)00H^I^?^DATADATADATADATADATADATADATA BEQ 1$ ;BRANCH IF ZERO FOR 16 BIT SHIFTE! CLR R2 ;IF NOT JUST 8 BIT SHIFTR0 BISB R3,R2 ;MOVE HIGH PART OF LOW ORDER 8 BITS CLRB R3 ;REMOVE THEM SUB #8.,R5 ;ADJUST EXP BR 4$ ;NORMALIZE WHATS LEFTR1$: CLR R3 ;CLEAR LOW ORDER SUB #16.,R5 ;ADJUST EXPE' BR 4$ ;NORMALIZE WHATS LEFT, OPTIMIZEN$ ;TO COMBINE WITH JUST ABOVE CODE .END ZERO TO NORM ITN&3$: MOV R3,R2 ;START WITH 8 BIT SHIFT2 BEQ NOAD0 ;BRANCH IF LOW PART ZERO, RESULT IS 0.& SWAB R3 ;TEST HIGH PART OF LOW ORDER)$ .TITLE KGHIST EVENT TIMING ROUTINES .IDENT /M01.01/; ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01.01 ; B. SCHREIBER 25-OCT-77;E; MODIFIED BY:;U; M. S. HARVEY 7-JUN-79T-; MSH037 -- CLEAR CLOCK A COUNTER ON ST1 FORE; POST-STIMULUS TIME MODET;E>; THIS MODULE CONTAINS ALL ROUTINES NECESSARY FOR EVENT TIMING;T; SYSTEM MACRO CALLS;O .MCALL KSWDF$, KDVDF$, CINT$S KSWDF$  KDVDF$U A) .SBTTL GTHIST EVENT TIMING START ROUTINEP;+$; GTHIST -- START EVENT TIMING SWEEP;O; CALLING SEQUENCE:I;O;; CALL GTHIST (IBUF, LBUF, NBUF, MODE, IPRSET, IEFN, KOUNT)I; ; OUTPUTS:;0; SWEEP IS STARTED;C;-"GTHIST::MOV R5,-(SP) ;SAVE ARG PTR0 CALL .K.PAA ;VALIDATE ARGS AND PUSH ONTO STACK .WORD 7 ;MAX OF 7 ARGS .WORD 140 ;IBUF, LBUF REQUIRED BCC 20$ ;IF CC CONTINUEE' MOV #-,R3 ;SET ERROR CODEO BR 600$ ;STORE ERROR AND EXIT$!20$: MOV #.TDSWB,R4 ;POINT TO SWB.- BEQ 200$ ;IF EQ DATA BASE WAS NOT GENNED IN' CALL .K.SET ;SET UP IBUF THROUGH IEFN BCS 200$ ;IF CS ERROR MOV R4,R3 ;POINT TO SWBN( ADD #S.WKNT,R3 ;POINT TO KOUNT ARGUMENT- MOV (SP)+,R0 ;GET KOUNT ADDRESS OFF OF STACKT+ MOV R0,(R3)+ ;SET VIRTUAL ADDRESS INTO SWBV BNE 40$ ;IF NE GO RELOCATE- CLR (R3)+ ;ELSE CLEAR BOTH WORDS OF ADDRESS, CLR (R3)+ ;... BR 60$ ;SKIP AHEAD#40$: CALL .KRLOC ;RELOCATE TO APR6R" MOV R1,(R3)+ ;SET APR6 RELOCATION MOV R2,(R3)+ ;SET APR6 BIAS)60$: CALL .K.STB ;SET UP BUFFER POINTERS ' BCS 400$ ;IF CS ILLEGAL SPECIFICATIONF& CALL .KLQIN ;INSERT INTO CLOCK QUEUE! CALL .TDCNI ;CONNECT AND ENABLE#) BCS 300$ ;IF CS CALL IT RESOURCE IN USEP- BIS #S$WACT,S.WFL2(R4) ;FLAG SWEEP IS ACTIVE,9 BIS #K$AGTD,.KAFLG ;FLAG TIME DATA GATHERING IN PROGRESSE MOV (SP)+,R5 ;RESTORE ARG PTR RETURNS; ; ERROR RETURNS3; ; BAD PARAMETERS;A200$: MOV #-,R3 T BR 500$;M; RESOURCE IN USER;E300$: MOV #-,R3 BR 500$;:; ILLEGAL BUFFER SPECIFICATION;R400$: MOV #-,R32500$: MOV R5,SP ;RESTORE PRE-.K.PAA STACK POINTER+600$: CALL .KLQRM ;REMOVE FROM CLOCK QUEUE3& MOV #1,R4 ;STORE INTO FIRST ARGUMENT MOV (SP)+,R5 ;RESTORE ARG PTR+ CALLR .IESTO ;STORE ERROR CODE AND RETURND * .SBTTL .TDCNI CONNECT CLOCK TO INTERRUPTS;+2; .TDCNI -- CONNECT TO INTERRUPTS FOR EVENT TIMING;E ; INPUTS:$;O!; .TDSWB SET UP (R4 POINTS TO IT)M; ; OUTPUTS:;R!; C-CLEAR CONNECT OK, CLOCK ARMED; C-SET COULD NOT CONNECTF;S;-..TDCNI: CALL .TDSLI ;SELECT INTERRUPT ROUTINE* MOV .KAVEC,R2 ;PICK UP THE VECTOR ADDRESS .IF DF Q$$BUS+ ADD #4,R2 ;CONNECT SCHMITT TRIGGER VECTORE .IFTF ;Q$$BUS CLR R3 ;FIRST DISCONNECT CALL 200$ ;ENSURE DISCONNECTED MOV #.TDINT,R3 ;NOW CONNECT .IF00P^3^4^eaekT ;Q$$BUSO! CALL 200$ ;CONNECT CLOCK VECTORO) BCS 220$ ;IF CS DO NOT TRY OTHER VECTOR % SUB #4,R2 ;POINT TO OVERFLOW VECTORS CLR R3 ;FIRST DISCONNECT CALL 200$ ;... MOV #.TDOVF,R3 ;NOW CONNECT .ENDC ;Q$$BUS/200$: CINT$S R2,#$KBASE,R3,#.TDEDI,#PR6,#.KWASTU 220$: RETURN;+1; .TDSLI -- SELECT EVENT TIMING INTERRUPT ROUTINEA;#!; SETS UP .TDINT IN THE DATA BASEO;;-%.TDSLI: MOV #.TDIN1,R3 ;ASSUME MODE 1T .IF NDF Q$$BUSR TST S.WFLG(R4) ;IS IT?T BNE 20$ ;IF NE YES# MOV #.TDIN0,R3 ;NO--SET FOR MODE 0C20$: ;REF LABEL .ENDC ;Q$$BUS .IF DF M$$MGE ADD $KRLC5,R3 ;RELOCATE TO APR5 .ENDC ;M$$MGE+ MOV R3,-2(R4) ;POINT ISR TO PROPER ROUTINER RETURNN T6 .SBTTL .TDEDI ENABLE/DISABLE ROUTINE FOR EVENT TIMING;+"; .TDEDI -- ENABLE/DISABLE ROUTINE;->; THIS ROUTINE IS CALLED BY THE EXEC ON A CONNECT TO INTERRUPT; OR A DISCONNECT.;- ; INPUTS: ; ; NONE;; ; OUTPUTS:;; CLOCK IS ARMED IF CONNECTW!; CLOCK IS DISABLED IF DISCONNECTY;;- .PSECT .KSCT1,.TDEDI: MOV .KACSR,R0 ;GET CLOCK CSR ADDRESS BCS 60$ ;IF CS THEN DISCONNECT CLR (R0) ;STOP CLOCK2 MOV @#$TKTCB,.KTKCB ;GET MY TCB ADDRESS FOR LATER1 BIC #K$AOVF,.KAFLG ;CLEAR SOFTWARE OVERFLOW FLAG/ .IF DF M$$MGE6 MOV #.TDSWB+120000-<$KBASE & 177700>,R3 ;POINT TO SWB .IFF ;M$$MGEE MOV #.TDSWB,R3 ;POINT TO SWBC .ENDC ;M$$MGE .IF NDF Q$$BUS-) TST S.WFLG(R3) ;WHAT MODE ARE WE TIMING?- BNE 40$ ;IF NE THEN INTER STIMULUS INTERVALE;F*; SET FOR POST-STIMULUS TIME DATA (MODE 0);I; MOV #KA$EEM!KA$STI!KA$STE,R2 ;EXTERNAL EVENT MODE, SCHMITT + ; TRIGGER INTERRUPT ENABLE, AND SCHMITTK ; TRIGGER ENABLES COUNTERF BR 50$ ;START CLOCK AND RETURN .ENDC ;Q$$BUS;A,; INTER-STIMULUS INTERVAL TIME DATA (MODE 1);S40$: ;REF LABEL B MOV #KA$EZB!KA$MFE!KA$STI!KA$ENB,R2 ;SET EXT EVENT TIME FROM ZERO ;BASE, MODE FLAG ENABLE,$ ;ST INTERRUPT ENABLE, AND CLOCK ;COUNT ENABLEE&50$: BIS .KARAT,R2 ;INCLUDE CLOCK RATE MOV R2,(R0) ;ARM CLOCK RETURN ;; ; DISCONNECT;T60$: CLR (R0) ;STOP CLOCK RETURNM - .SBTTL .TDIN0 MODE 0 (PST) INTERRUPT ROUTINE;+*; .TDIN0 -- MODE 0 (PST) INTERRUPT ROUTINE; ; INPUTS:;.:; JSR R4 HERE FROM DATA BASE. R4 WILL THEN POINT TO .TDSWB;) ; OUTPUTS:A; IF ST1 FIRED, CLR CLOCK AND ENABLE OVERFLOWS AND ST2 INTERRUPTS 2; IF OVERFLOW, NOTE THAT AND ENABLE ST1 INTERRUPTSA; IF NEITHER OF ABOVE, STORE CLOCK BUFFER CONTENTS IN USER BUFFERA; OR -1 IF RECENT OVERFLOWM;R;- .ENABL LSB .IF NDF Q$$BUS 6.TDIN0::MOV R3,(SP) ;;;SAVE R3, OVERWRITE R4 ON STACK .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE' MOV .KACSR,R3 ;;;GET CLOCK CSR ADDRESS.' TST (R3) ;;;CHECK FOR SCHMITT TRIGGERH+ BMI 200$ ;;;IF MI SCHMITT TRIGGER 1 FIREDF( BIT #KA$OVF,(R3) ;;;DID CLOCK OVERFLOW?" BNE 300$ ;;;IF NE YES--GO HANDLE> BIC #KA$MDF,(R3) ;;;NO--SCHMITT TRIG 2 FIRED--CLEAR MODE FLAG MOV 2(R3),R3 ;;;READ CLOCKF3 BIT #K$AOVF,.KAFLG ;;;DID CLOCK OVERFLOW RECENTLY?  BEQ 20$ ;;;IF EQ NO % BIC #K$AOVF,.KAFLG ;;;YES--CLEAR FLGE6 MOV #177777,R3 ;;;STORE -1 TO INDICATE CLOCK OVERFLOW/20$: CALL .KWRWD ;;;WRITE VALUE TO USER BUFFER, .IFT ;M$$MGES# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6M .ENDC ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3 " BCC 120$ ;;;IF CC NO FORK NEEDED .IFTF ;Q$$BUS;+<; .TDFXT -- INTERRUPT EXIT FROM TIME DATA INTERRUPT ROUTINES; 2; THIS EXIT IS TAKEN WHEN IT IS NECCESARY TO FORK.; ; INPUTS:F;A; R4 POINTS TO SWB;O ; OUTPUTS:;B<; FORK REQUESTED, AST QUEUED OR EVENT FLAG SET. IF STOPPING; SWEEP, CLOCK IS DISABLED.O;D;-..TDFXT: BIT #S$WSTP,S.WFL2(R4) ;;;STOP NEEDED? BEQ 100$ ;;;IF EQ NO CLR @.KACSR ;;;YES--STOP CLOCK+ BIC #K$AGTD,.KAFLG ;;;NO LONGER DOING THISP100$: ;;;REF LABELB .IF NDF FT$MOPO5 CALLR .KEFQI ;;;FORK, SET EFN OR QUEUE AST AND EXITP .IFF ;FT$MOPD/ BIS #S$WAST,S.WFLG(R4) ;;;SET AST REQUEST FLAGE5 CALLR .KWEFQ ;;;FORK, SET EFN OR QUEUE AST AND EXITI .ENDC ;00X^^^?^DATADATADATADATADATADATADATAFT$MOP 120$: RETURN .IFT ;Q$$BUSS;U; HERE IF SCHMITT TRIGGER FIREDG; ;200$: BIC #KA$STF!KA$ENB,(R3) ;;;CLEAR SCHMITT TRIGGER FLAGF ;;; AND STOP CLOCK" CLR 2(R3) ;;; CLEAR CLOCK BUFFER6 BIS #KA$MFE!KA$ENB,(R3) ;;;ENABLE OVERFLOW INTERRUPTS& ;;; AND START CLOCK W/COUNTER=0. MOV S.WKNT+4(R4),R3 ;;;GET KOUNT ADDRESS BIAS' BEQ 400$ ;;;IF EQ SKIP THE WHOLE DEALD .IF DF M$$MGE/ MOV S.WKNT+2(R4),@#KISAR6 ;;;MAP TO KOUNT WORD; .IFTF ;M$$MGE INC (R3) ;;;INKREMENT KOUNTT( BR 400$ ;;;RESTORE REGISERS AND RETURN;; CLOCK OVERFLOW;G300$: CLR (R3) ;;;STOP CLOCKT1 BIS #K$AOVF,.KAFLG ;;;FLAG THAT CLOCK OVERFLOWED;< MOV #KA$EEM!KA$STI!KA$STE,-(SP) ;;;SET EXT EVENT TIME MODE,& ;;; SCHMITT TRIG INTERRUPT ENABLE,' ;;; AND SCHMITT TRIG ENABLE COUNTERT* BIS .KARAT,(SP) ;;;INCLUDE THE CLOCK RATE$ MOV (SP)+,(R3) ;;;JAM THE CLOCK CSR400$: ;;;REF LABEL .IFT ;M$$MGEW# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6; .ENDC ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3N RETURN0 .ENDC ;Q$$BUS .DSABL LSBN < .SBTTL .TDIN1 INTER-STIMULUS INTERVAL (MODE 1) EVENT TIMING;+%; .TDIN1 -- ISI (MODE 1) EVENT TIMING;V ; INPUTS:$6; JSR R4 HERE FROM DATA BASE. R4 THEN POINTS TO .TDSWB;T ; OUTPUTS:+; IF OVERFLOW, SET SOFTWARE FLAG AND RETURN K; ELSE STORE CLOCK BUFFER CONTENTS OR -1 IF RECENT OVEFLOW INTO USER BUFFERT;C;- .ENABL LSB;6.TDIN1: MOV R3,(SP) ;;;SAVE R3, OVERWRITE R4 ON STACK' MOV .KACSR,R3 ;;;GET CLOCK CSR ADDRESSP .IF NDF Q$$BUSN$ BIT #KA$OVF,(R3) ;;;CLOCK OVERFLOW? BNE 100$ ;;;IF NE YESI. BIC #KA$MDF,(R3) ;;;NO--CLEAR MODE (ST2) FLAG .IFF ;Q$$BUSS# BIC #KA$STF,(R3) ;;;CLEAR ST2 FLAG$ .ENDC ;Q$$BUS .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE# MOV 2(R3),R3 ;;;READ CLOCK COUNTERO0 BIT #K$AOVF,.KAFLG ;;;DID WE RECENTLY OVERFLOW? BEQ 40$ ;;;IF EQ NO-& BIC #K$AOVF,.KAFLG ;;;YES--CLEAR FLAG, MOV S.WKNT+4(R4),R3 ;;;GET ADDRESS OF KOUNT BEQ 30$ ;;;IF EQ SKIP IT .IFT ;M$$MGE$* MOV S.WKNT+2(R4),@#KISAR6 ;;;MAP TO KOUNT .IFTF ;M$$MGE INC (R3) ;;;INKREMENT KOUNTC%30$: MOV #177777,R3 ;;;AND STORE A -1/40$: CALL .KWRWD ;;;WRITE VALUE TO USER BUFFER; .IFT ;M$$MGE # MOV (SP)+,@#KISAR6 ;;;RESTORE APR6P .ENDC ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3C# BCS .TDFXT ;;;IF CS GO FORK, ETC.D RETURN ;;;INTERRUPT EXIT4 .IF DF Q$$BUS;+0; .TDOVF -- OVERFLOW INTERRUPT ROUTINE FOR KWV11;3 ; INPUTS:R; !; CALLED HERE FROM INTERRUPT SAVET; ; OUTPUTS:;%; SOFTWARE CLOCK OVERFLOW FLAG IS SETK;T;-.TDOVF::MOV R3,-(SP) ;;;SAVE R3R' MOV .KACSR,R3 ;;;GET CLOCK CSR ADDRESSS .IFTF ;Q$$BUS;K; HERE IF CLOCK OVERFLOW;B6100$: BIS #K$AOVF,.KAFLG ;;;FLAG WE HAD CLOCK OVERFLOW .IFF ;Q$$BUSC7 BIC #KA$OVF!KA$MDF,(R3) ;;;CLEAR OVERFLOW , MODE FLAGSF .IFT ;Q$$BUSD. BIC #KA$OVF,(R3) ;;;CLEAR CLOCK OVERFLOW FLAG .ENDC ;Q$$BUS MOV (SP)+,R3 ;;;RESTORE R3K RETURN ;;;EXIT INTERRUPTA .DSABL LSBI .ENDSAVET; ; OUTPUTS:;%/1 SUB XRATE (DWELL, IRATE%, IPRSET%, IFLAG%) &! &! COPYRIGHT (C) 1977 &1! DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. &! &@! THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A &@! SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE &@! INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR &@! ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE &@! MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH &@! SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE &@! TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN & ! IN DEC. & ! &RA! THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT &AA! NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL & ! EQUIPMENT CORPORATION. &! &L?! DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF & ;! ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. & ! &A! VERSION 01 &! B. SCHREIBER 15-JUL-77 &! & 3! CONVERTED TO BASIC-PLUS-2: K. ALTMANN 8-DEC-700`^e^4^eaek7 &S?! THIS ROUTINE COMPUTES RATES AND PRESETS FOR THE CLOCK GIVEN &L*! THE DESIRED DWELL (INTER-SAMPLE TIME). &2 !+ &$! XRATE -- COMPUTE RATE AND PRESET &! &I! CALLING SEQUENCE: &S/! CALL XRATE (DWELL, IRATE%, IPRSET%, IFLAG%) & ! & ! INPUTS: &P! &O9! DWELL (FLOATING) THE DESIRED DWELL IN DECIMAL SECONDS &R3! IFLAG% (INTEGER) 0 IF CLOCK A, NON-0 IF CLOCK B &S! &S ! OUTPUTS: &! &7! IRATE% (INTEGER) THE SELECTED CLOCK RATE (1-7) OR 0 & #! IF NO RATE COULD BE SELECTED & 9! IPRSET% (INTEGER) THE TWOS-COMPLEMENT CLOCK PRESET TO & +! BE USED IN A CALL TO A SWEEP ROUTINE &R! &L! &E!- &#5 DIMENSION DWLMAX(5), TICKS(5) &R! &&&! DWLMAX CONTAINS THE MAXIMUM DWELL &2! (INTER-SAMPLE TIME) WHICH MAY BE OBTAINED FOR &3! PARTICULAR CLOCK RATE FOR EITHER CLOCK A OR B. &I! &I7 IF IFLAG% = 0% THEN &E DWLMAX(1%) = 0.065535 & \DWLMAX(2%) = 0.65535 &: \DWLMAX(3%) = 6.5535 & \DWLMAX(4%) = 65.535 & \DWLMAX(5%) = 655.35 & ELSE & DWLMAX(1%) = 0.000255 & \DWLMAX(2%) = 0.00255 &  \DWLMAX(3%) = 0.0255 & \DWLMAX(4%) = 0.255 &E \DWLMAX(5%) = 2.55 &25 ! &4! TICKS IS THE NUMBER OF CLOCK TICKS OBTAINED FOR &! A PARTICULAR CLOCK RATE. & ! &E TICKS(1%) = 1000000.0 &  \TICKS(2%) = 100000.0 & \TICKS(3%) = 10000.0 &  \TICKS(4%) = 1000.0 & \TICKS(5%) = 100.0 &N%30 IF DWELL < .000001 THEN GOTO 700 &A40 ! &2! FIND THE FASTEST CLOCK RATE WHICH WILL PERMIT &4! THE REQUESTED DWELL. CHOOSING THE FASTEST RATE &%! WILL GIVE THE FINEST RESOLUTION. &.! &  FOR I% = 1% TO 5% &( \ IF DWELL > DWLMAX(I%) THEN GOTO 500 &&70 ! I% CONTAINS THE SELECTED RATE &! &  IRATE% = I% &! &R*! COMPUTE THE CLOCK PRESET FOR THE USER &! &( \ PRESET = DWELL * TICKS(I%) & 3 \ IF PRESET = 32768.0 THEN IPRSET% = 32767% + 1% &0< ELSE IF PRESET > 32768.0 THEN IPRSET% = 65535.0 - PRESET & ELSE IPRSET% = - PRESET &H-400 XRATE = INT(PRESET + 0.05) / TICKS(I%) &R \ GOTO 900 & 500 NEXT I% &700 IRATE% = 0% &I 900 SUBENDRESOLUTION. &.! &  FOR I% = 1% TO 5% &( \ IF DWELL > DWLMAX(I%) THEN GOTO 500 &&70 ! I% CONTAINS THE SELECTED RATE &! &  IRATE% = I% &! &R*! COMPUTE THE CLOCK PRESET FOR THE USER &! &( \ PRESET = DWELL * TICKS(I%) & 3 \ IF PRESET = 32768.0 THEN IPRSET% = 32767% + 1% &0< ELSE IF PRESET > 32768.0 THEN IPRSET% = 65535.0 - PRESET & ELSE IPRSET% = - PRESET &H-400 XRATE = INT(PRESET + 0.05) / TICKS(I%) &R \ GOTO 900 & 500 NEXT I% &700 IRATE% = 0% &I<0O*9@>ZvE G  O .MACRO KDVDF$ .IF NDF L$$SI1;+/; KA$XXX - KW11-K CLOCK 'A' CSR BIT DEFINITIONS;-(KA$STF = 100000 ;ST1 EVENT HAS OCCURRED,KA$STI = 40000 ;ST1 EVENT INTERRUPT ENABLE2KA$STE = 20000 ;ST1 EVENT ENABLES KA$ENA (ENABLE ; COUNTER)(KA$RIM = 0400 ;REPEATED INTERVAL MODE*KA$EEM = 1000 ;EXTERNAL EVENT TIME MODE/KA$EZB = 1400 ;EXTERNAL EVENT TIME FROM ZERO ; BASE MODE3KA$MDF = 200 ;OVERFLOW OR COUNTER TO BUFFER XFR ; HAS OCCURRED,KA$MFE = 1000h^^^?^DATADATADATADATADATADATADATA0 ;MODE FLAG INTERRUPT ENABLE3KA$OVF = 40 ;COUNTER 'A' OVERFLOW HAS OCCURREDA*;KA$RAT = 16 ;MASK FOR CLOCK 'A' RATE"KA$ENB = 1 ;ENABLE CLOCK 'A';+.; KB$XXX - KW11-K CLOCK 'B' CSR BIT DEFINTIONS;-3KB$OVF = 200 ;COUNTER 'B' OVERFLOW HAS OCCURREDM+KB$OIE = 100 ;OVERFLOW INTERRUPT ENABLE $KB$B2A = 40 ;FEED B TO A ENABLE&;KB$ATO = 20 ;AUTO INCREMENT MODE*;KB$RAT = 16 ;MASK FOR CLOCK 'B' RATE"KB$ENB = 1 ;CLOCK 'B' ENABLE;+3; AD$XXX - AD11-K A/D CONVERTOR CSR BIT DEFINITIONS ;-AD$ERR = 100000 ;ERROR FLAGAD$DON = 200 ;DONE FLAGK"AD$ENB = 100 ;INTERRUPT ENABLE7AD$OVE = 40 ;KW11-K OVERFLOW STARTS A/D CONVERSIONK9AD$ESE = 20 ;EXTERNAL EVENT INITIATES A/D CONVERSIONO%AD$GO = 1 ;START A/D CONVERSIONE;+4; DO$XXX - DR11-K DIGITAL OUTPUT CSR BIT DEFINITIONS4; DI$XXX - DR11-K DIGITAL INPUT CSR BIT DEFINITIONS;-7DO$FLG = 100000 ;EXTERNAL DATA ACCEPTED ON EXT. DEVICE )DO$ENB = 40000 ;ENABLE OUTPUT INTERRUPT-2DO$BUF = 4 ;OFFSET FROM CSR TO OUTPUT BUFFER6DI$FLG = 200 ;EXTERNAL DATA READY FROM EXT. DEVICE(DI$ENB = 100 ;ENABLE INPUT INTERRUPT1DI$BUF = 2 ;OFFSET FROM CSR TO INPUT BUFFERE  .IF NDF L$$PS1E;+3; DA$XXX - AA11-K D/A CONVERTOR CSR BIT DEFINITIONSD;-4DA$ERA = 10000 ;ERASE DATA IN STORAGE OSCILLOSCOPE!DA$WTU = 4000 ;WRITE THRU MODEIDA$STO = 2000 ;STORET2DA$BT9 = 1000 ;BIT 9 (DIGITAL SIGNAL AVAILABLE)DA$RDY = 200 ;READY #;DA$ENB = 100 ;INTERRUPT ENABLEB DA$EXD = 20 ;EXTERNAL DELAYDA$MDE = 14 ;MASK FOR MODEX'DA$FIE = 2 ;FAST INTENSIFY ENABLEB4DA$INT = 1 ;GENERATE INTENSIFY PULSE IN MODE 09DA$SCO=DA$ERA!DA$WTU!DA$STO$DA$BT9!DA$MDE!DA$FIE!DA$INT ;( ;BITS LEGAL FOR USER TO SET IN SCOPE ;CONTROL WORDE .IFF ;L$$PS1R4DA$ERA = 10000 ;ERASE DATA IN STORAGE OSCILLOSCOPE(DA$WTU = 4000 ;SET WRITE THROUGH MODEDA$STO = 2000 ;STORED DA$CHN = 1000 ;CHANNEL SELECT DA$COL = 400 ;COLOR SELECTDA$RDY = 200 ;READYE#;DA$ENB = 100 ;INTERRUPT ENABLE= DA$EXD = 20 ;EXTERNAL DELAYDA$MDE = 14 ;MODE(DA$FIE = 2 ;FAST INTENSIFY ENABLEDA$INT = 1 ;INTENSIFYD@DA$SCO = DA$ERA!DA$WTU!DA$STO!DA$CHN!DA$COL!DA$MDE!DA$FIE!DA$INT* ;BITS LEGAL FOR USER TO SET WITH SCOPE .ENDC ;L$$PS1 .IFF ;L$$SI10 .IF DF Q$$BUS;+!; KWV11 CLOCK CSR BIT DEFINITIONS0;-'KA$STF = 100000 ;ST2 EVENT HAS OCCURED;,KA$STI = 40000 ;ST2 EVENT INTERRUPT ENABLE)KA$STE = 20000 ;ST2 EVENT ENABLES CLOCK0:KA$MDF = 200 ;OVERFLOW OR CTR TO BUFFR XFR HAS OCCURED'KA$OVF = 200 ;OVERFLOW HAS OCCURRED;.KA$IOO = 100 ;INTERRUPT ON OVERFLOW ENABLE"KA$MFE = 100 ;MODE FLAG ENABLE&;KA$RAT = 30 ;MASK FOR CLOCK RATE(KA$RIM = 2 ;REPEATED INTERVAL MODE*KA$EEM = 4 ;EXTERNAL EVENT TIME MODE9KA$EZB = 6 ;EXTERNAL EVENT TIME FROM ZERO BASE MODEIKA$ENB = 1 ;ENABLE CLOCK;+1; AD$XXX - ADV11 A/D CONVERTOR CSR BIT DEFINTIONSP;-AD$ERR = 100000 ;ERROR FLAG(AD$IEN = 40000 ;ERROR INTERRUPT ENABLEAD$DON = 200 ;DONE FLAGO"AD$ENB = 100 ;INTERRUPT ENABLE6AD$OVE = 40 ;CLOCK OVERFLOW STARTS A/D CONVERSION6AD$ESE = 20 ;EXTERNAL EVENT STARTS A/D CONVERSION%AD$GO = 1 ;START A/D CONVERSION ;+3; DO$XXX - DRV11 DIGITAL OUTPUT CSR BIT DEFINITIONSE3; DI$XXX - DRV11 DIGITAL INPUT CSR BIT DEFINITIONSR;-(DO$FLG = 100000 ;EXTERNAL DATA ACCEPTED)DO$ENB = 40 ;OUTPUT INTERRUPT ENABLER2DO$BUF = 2 ;OFFSET TO OUTPUT BUFFER FROM CSR%DI$FLG = 200 ;EXTERNAL DATA READYE(DI$ENB = 100 ;INPUT INTERRUPT ENABLE1DI$BUF = 4 ;OFFSET TO INPUT BUFFER FROM CSRV .ENDC ;Q$$BUS .ENDC ;L$$SI1 .MACRO KDVDF$ .ENDM .ENDMO .MACRO KSWDF$;+#; SWB - SWEEP CONTROL BLOCK OFFSETS-;VC; THERE IS ONE SWEEP CONTROL BLOCK FOR EACH POSSIBLE TYPE OF SWEEP:T>; A/D, D/A, DIGITAL INPUT, DIGITAL OUTPUT, GATHERING HISTOGRAM; DATA.E;=;- .ASECTP.=0T2S.WLNK: .BLKW 1 ;LINK TO NEXT SWEEP CONTROL BLOCK%S.WFLG: .BLKW 1 ;SWEEP CONTROL FLAGSN00p^e^4^eaekS.WFL2: .BLKW 1 ;MORE FLAGSBS.WUSW: .BLKW 3 ;USER STATUS WORD: USER, EXEC APR6 RELOC AND BIAS'S.WBNO: .BLKB 1 ;CURRENT BUFFER NUMBER1 .BLKB 1 ;SPARE BYTEM!S.WEBF: .BLKB 1 ;BUFFER IN ERROR 7S.WLBF: .BLKB 1 ;LAST BUFFER COMPLETED (SEE KRWBF.MAC)H/S.WIBP: .BLKW 2*N$$MBF ;INITIAL BUFFER POINTERST;S.WBPX: .BLKW 1 ;POINTER TO S.WBPT <.+2>(+RELOC IF MAPPED)T)S.WBPT: .BLKW 2 ;CURRENT BUFFER POINTERSP(S.WSIZ: .BLKW 1 ;SIZE OF BUFFER (WORDS)/S.WCNT: .BLKW 1 ;COUNT OF WORDS LEFT IN BUFFER @S.WNBF: .BLKW 1 ;NUMBER OF BUFFERS TO FILL OR NEGATIVE IF CONT- ; INUOUS SAMPLING ?S.WEFN: .BLKW 1 ;0, EFN, OR ADDRESS OF USER COMPLETION ROUTINE13S.WSCR: .BLKW 1 ;SYNCHRONOUS CLOCK ROUTINE ADDRESS.S.WSTS: .BLKW 1 ;FINAL STATUS1S.WSTR: .BLKW 1 ;SCHMITT TRIGGER ROUTINE ADDRESST! ;**NOTE**USER VIRTUAL ADDRESS .S.WEFM: .BLKW 1 ;EVENT FLAG MASK (FROM $CEFI)1S.WEFA: .BLKW 1 ;EVENT FLAG ADDRESS (FROM $CEFI) 5S.WKNT: ;VIRTUAL ADDRESS, EXEC APR6 RELOC AND BIASN1 ;OF KOUNT PARAMETER FOR GTHIST. NOTE: THESER4 ;THREE WORDS OVERLAP S.WMSK, S.WCSR, AND S.WPRI.8S.WMSK: .BLKW 1 ;MASK OF BITS TO SIMULATE ST1 ON (DR11))S.WCSR: .BLKW 1 ;ACTIVE UNIT CSR ADDRESSR0S.WPRI: .BLKW 1 ;DEVICE HARDWARE PRIORITY LEVEL .IF DF FT$MOP .IF NDF M$$MGEM3S.WCLX: ;ACTIVE CLOCK QUEUE--UNMAPPED EXEC LEVELA .IFF ;M$$MGEE2S.WCLX: .BLKW 1 ;ACTIVE CLOCK QUEUE--APR5 MAPPING .ENDC ;M$$MGE2S.WCLQ: .BLKW 1 ;ACTIVE CLOCK QUEUE--TASK MAPPING .ENDC ;FT$MOP*S.WUBX: ;DR11 UNIT CONTROL BLOCK OFFSET ;+ ; FOLLOWING CELLS ARE FOR AD/DA SWEEP ONLYS ;>S.WCHB: .BLKB 1 ;CHANNEL BYTE TO LOAD IN HIGH BYTE OF A/D CSR-S.WCBX: .BLKB 1 ;SAVED ORIGINAL CHANNEL BYTE )S.WICH: .BLKW 1 ;STARTING CHANNEL NUMBERW(S.WCCH: .BLKW 1 ;CURRENT CHANNEL NUMBER5S.WHCH: .BLKW 1 ;HIGHEST CHANNEL ACCESSED THIS SWEEPE7S.WCHX: .BLKW 1 ;NUMBER OF CHANNELS (RESET FOR S.WNCH)Q2S.WNCH: .BLKW 1 ;NUMBER OF CHANNELS (DECREMENTED),S.WMXC: .BLKW 1 ;MAXIMUM NUMBER OF CHANNELS#S.WCHI: .BLKW 1 ;CHANNEL INCREMENTL0S.WGNW: .BLKW 1 ;DATA WORD FOR GAIN INFORMATION0S.WUNT: .BLKW 1 ;NUMBER OF UNITS ON THIS DEVICE0S.WAUA: .BLKW 1 ;OFFSET TO ACTIVE UCB. (ADD R4) S.WUCB: ;THE UCB'S START HERE;+"; UCB - UNIT CONTROL BLOCK OFFSETS;H(; UCB'S ARE USED BY THE ADSWP, AND DASWP,; THE DR11 UCB HAS U.FLG, U.IVEC, AND U.OVEC;;-.=0BU.FLG: .BLKW 1 ;UNIT FLAGSE%U.IVEC: ;DR11 INPUT VECTOR ADDRESSBU.VEC: .BLKW 1 ;VECTOR ADDRESSM&U.OVEC: ;DR11 OUTPUT VECTOR ADDRESS!U.CSR: .BLKW 1 ;CSR OF THIS UNITN-U.MAXC: .BLKW 1 ;MAX # CHANNELS ON THIS UNITAU.LGTH=.;+; OFFSETS INTO IBUF ARRAYN;-.=0I"IB.IOS: .BLKW 2 ;I/O STATUS BLOCK#IB.USQ: .BLKW 5 ;USER BUFFER QUEUE'%IB.DVQ: .BLKW 5 ;DEVICE BUFFER QUEUEB#IB.NBF: .BLKW 1 ;NUMBER OF BUFFERS $IB.BUF: ;BEGINNING OF BUFFER LIST U;+4; FLAGS IN THE SWEEP CONTROL BLOCK (SWB) WORD S.WFLG;-7S$WAST = 100000 ;AST REQUEST FOR THIS SWEEP (SIGN BIT)L;(FREE) = 40000 ;M;(FREE) = 20000 ;T;(FREE) = 10000 ;.;(FREE) = 4000 ; 'S$WTSS = 2000 ;TIME-STAMPED SAMPLINGE4S$WNOV = 1000 ;NON-CLOCK OVERFLOW DRIVEN SAMPLING&S$WEXT = 400 ;EXTERNAL START (ST1);(FREE) = 200 ;B;(FREE) = 100 ;U;(FREE) = 40 ; +S$WAGR = 5 ;AUTO GAIN RANGING (AD11)B9S$WSIB = 2 ;SET INTENSIFY BIT AFTER X/Y PAIR (AA11)+4S$WEZB = 1 ;EXTERNAL EVENT TIME FROM ZERO BASE ; MODE (HISTOGRAM)3S$WSCW = 1 ;SCOPE CONTROL WORD PRESENT (AA11)07S$WSTZ = 1 ;ST2 FIRING ZEROES COUNTER (HISTOGRAM) 9S$WUSR = S$WTSS!S$WNOV!S$WEXT!7 ;FLAGS WHICH USER MAY SETN% ;(N O T E: SOME FLAGS IN LOW BYTE  ; ARE NOT USED AT PRESENT);+; FLAGS IN WORD S.WFL2;-,S$WACT = 100000 ;SWEEP IS ACTIVE (SIGN BIT)/S$WDLY = 40000 ;SWEEP REQUESTS DELAY (LDELAY)B+S$WDIF = 20000 ;DIFFERENTIAL INPUT (AD11)//S$WEFN = 10000 ;EFN SETTING AS OPPOSED TO ASTT#S$WSTP = 4000 ;REQUESTED TO STOPT'S$WSEB = 2000 ;STOP AT END OF BUFFERO-S$WACA = 1000 ;ABSOLUTE CHANNEL ADDRESSINGG6S$WSST = 400 ;SIMULATE SCHMITT TRIGGER (DIGO SETS)9S$WA$D00x^z^?^DATADATADATADATADATADATADATA = 200 ;THIS IS A/D SWEEP BLOCK (MUST BE 200!!) (S$WADC = 100 ;SETADC HAS BEEN CALLED"S$WFRK = 40 ;FORK IN PROGRESS0S$WIOF = 20 ;INPUT (1) OR OUTPUT (0) (DR11)BS$W2CL = ^C ;CLEAR ALL BITS BUT THESE;+; FLAGS IN U.FLG;-9UF$ACT = 100000 ;UNIT WILL BE/IS ACTIVE IN CURRENT SWEEP45UF$CIN = 40000 ;UNIT IS CONNECT TO INTERRUPT VECTOR %UF$AMK = 20000 ;AD11 HAS AM11 ON ITC N;+; FLAGS IN .KAFLG AND .KBFLG;-!K$ACTV = 100000 ;CLOCK IS ACTIVE$#K$ADLY = 40000 ;DELAY IN PROGRESSC"K$AGTD = 20000 ;GTHIST IS ACTIVE2K$ACIN = 10000 ;CLOCK IS CONNECTED TO INTERRUPTS(K$ACAC = 4000 ;CLOCKA HAS BEEN CALLED1K$AOVF = 2000 ;CLOCK A HAS OVERFLOWED (GTHIST)S6K$AFRK = 1000 ;FORK IN PROGRESS FOR CLOCK (MULTIPLE ;CLOCK DRIVEN SWEEPS ONLY) .PSECTI .MACRO KSWDF$ .ENDM .ENDMNNECT TO INTERRUPT VECTOR %UF$AMK = 20000 ;AD11 HAS AM11 ON ITC N;+; FLAGS IN .KAFLG AND .KBFLG;-!K$ACTV = 100000 ;CLOCK IS ACTIVE$#K$" .TITLE KSET SETUP ARGS FOR SWEEPS .IDENT /M02.00/;O ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;K>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 02.00 ; B. SCHREIBER 23-JUN-77;E; PREVIOUSLY MODIFIED BY:U;; B. SCHREIBER; M. S. HARVEY;H; MODIFIED BY:; ; M. S. HARVEY 9-OCT-79P6; MSH025 -- TRAP GROUP GLOBAL EVENT FLAG USE AS ERROR;I; ;; THIS ROUTINE POPS THE ARGUMENTS OFF OF THE STACK AND SETS "; UP THE SWEEP CONTROL BLOCK (SWB);A;O; SYSTEM MACRO CALLS;Q .MCALL KSWDF$, CLEF$S KSWDF$U ) .SBTTL .K.SET SET UP SWEEP CONTROL BLOCKY;+%; .K.SET -- SETUP SWEEP CONTROL BLOCKT;P ; INPUTS:C;; STACK SETUP FROM .K.PAAS.; R5 OLD SP BEFORE .K.PAA (RETURNED BY .K.PAA)&; R4 SWEEP CONTROL BLOCK (SWB) POINTER; ; OUTPUTS:;#; C-CLEAR SWEEP CONTROL BLOCK SETUP2); ALL ARGUMENTS THROUGH 'IEFN' HAVE BEENR; POPPED OFF OF THE STACK; ; C-SET ARGUMENT ERROR"; SP RESET TO VALUE BEFORE .K.PAA;L; REGISTERS ALTERED:; ; R3,R2C;C;-,.K.SET::MOV (SP)+,R3 ;POP OFF RETURN ADDRESS& TST S.WFL2(R4) ;SWEEP ALREADY ACTIVE? BMI 300$ ;IF MI YES--ERROR. BIC #S$W2CL,S.WFL2(R4) ;CLEAR FLAGS AS NEEDED, CLR S.WSTS(R4) ;CLEAR SWEEP I/O STATUS WORD MOV (SP)+,R1 ;GET IBUF ADDRESSN% CMP (R1),#I$BFVW ;WAS SETIBF CALLED?:# BNE 300$ ;IF NE NO--BAD ARGUMENTSE# CLR (R1) ;YES--SET OP IN PROGRESS 6 TSTB IB.DVQ(R1) ;HAS RLSBUF BEEN CALLED FOR 1 BUFFER? BMI 300$ ;IF MI NO--ERRORL/ MOV R1,S.WBPT(R4) ;YES--SAVE ADDRESS FOR LATER ; MOVB #-1,S.WEBF(R4) ;INIT ERROR BUFFER NUMBER TO NO BUFFERS+ MOV @(SP)+,S.WSIZ(R4) ; PICKUP BUFFER SIZEI BLE 300$ ;IF LE THEN ERROR, MOV S.WSIZ(R4),S.WCNT(R4) ;INIT THE COUNTER! MOV (SP)+,R2 ;GET 'NBUF' ADDRESSU BEQ 10$ ;IF EQ SET DEFAULT TST (R2) ;WAS IT POSITIVE? BGT 20$ ;IF GT YES&10$: MOV #.NEG1,R2 ;DEFAULT TO FOREVER/20$: MOV (R2),S.WNBF(R4) ;SET NUMBER OF BUFFERSR! MOV (SP)+,R2 ;GET 'MODE' ADDRESSF BNE 60$ ;IF NE GO STORE-* MOV #.ZEROW,R2 ;IF DEFAULTED STORE A ZERO$60$: MOV (R2),R2 ;PICKUP USER FLAGS8 BIC #^C,R2 ;CLEAR FLAGS USER SHOULD NOT HAVE ON( MOV R2,S.WFLG(R4) ;SET THE FLAGS IN SWB/ BIT #S$WTSS,R2 ;IS THIS TIME-STAMPED SAMPLING?E BEQ 100$ ;IF EQ NO--SKIP9 BIC #1,S.WSIZ(R4) ;YES--ENSURE EVEN # OF WORDS IN BUFFER;7 BIC #1,S.WCNT(R4) ; (JUST00^^4^eaek A BIT OF PROTECTION FOR ISR)27100$: MOV S.WSIZ(R4),2(R1) ;INIT IOSB(2) TO BUFFER SIZER# MOV (SP)+,R2 ;GET 'IPRSET' ADDRESSE .IF DF K$$W11 BEQ 140$ ;IF EQ SKIP/ BIT #S$WNOV,S.WFLG(R4) ;NON-OVERFLOW SAMPLING?(! BNE 160$ ;IF NE YES--SKIP CHECKC .IF DF FT$MOP, TST .KAFLG ;IS THERE ANOTHER ACTIVE SWEEP? BPL 140$ ;IF PL NO--SKIP CHECK# CMP (R2),.KAPRE ;YES--SAME PRESET?G BNE 300$ ;IF NE NO--ERRORP .IFTF ;FT$MOP MOV (R2),.KAPRE ;SET THE PRESET4140$: BIT #S$WNOV,S.WFLG(R4) ;NON-OVERFLOW SAMPLING? BNE 160$ ;IF NE YES.. TST .KAFLG ;NO--ARE ANY OTHER SWEEPS ACTIVE? .IFF ;FT$MOP' BMI 300$ ;IF MI YES--ERROR .IFT ;FT$MOP; BPL 150$ ;IF PL NO--OKAY' BIT #K$AGTD,.KAFLG ;YES--IS IT GTHIST?  BNE 300$ ;IF NE YES--ERROR150$:T .ENDC ;FT$MOP) BIT #K$ACAC,.KAFLG ;WAS 'CLOCKA' CALLED? , BEQ 300$ ;IF EQ NO--NO CLOCK RATE, AND NOT$ ; NON-OVERFLOW DRIVEN SAMPLING .IFF ;K$$W11;;140$: BIT #S$WNOV,S.WFLG(R4) ;NON-OVERFLOW DRIVEN SAMPLING?.+ BEQ 300$ ;IF EQ NO--LOSE BECAUSE NO CLOCK; .ENDC ;K$$W11; 7;LAST ARG TO CHECK IS THE EVENT FLAG/COMPLETION ROUTINEB;3$160$: MOV (SP)+,R2 ;GET ADDRESS OR 0! BEQ 165$ ;IF EQ USE DEFAULT EFNB; TST (R2) ;SEE IF EFN PRESENT (0 IS HALT SO CAN'T BE AST!)-& BNE 170$ ;IF NE YES--GO CHECK IT OUT4165$: MOV #.KDFEF,R2 ;NO--USE THE DEFAULT EVENT FLAG$ BR 180$ ;WE KNOW ITS AN EVENT FLAG8170$: CMP (R2),#96. ;IS IT AN EVENT FLAG OR ROUTINE ADDR# BLOS 180$ ;IF LOS THEN EVENT FLAGD$ BIT #1,R2 ;MAKE SURE LEGAL ADDRESS BNE 300$ ;IF NE ERROR2 MOV R2,S.WEFN(R4) ;SET COMPLETION ROUTINE ADDRESS BR 200$ ;GO EXIT-180$: CMP (R2),#64. ;GROUP GLOBAL EVENT FLAG?R BHI 300$ ;IF HI YES, ERROR TST (R2) ;CHECK EFN LEGALITY BLE 300$ ;IF LE THEN ILLEGAL+ MOV (R2),S.WEFN(R4) ;SET EVENT FLAG NUMBERT# CLEF$S (R2) ;CLEAR THE EVENT FLAGE BCS 300$ ;ILLEGAL EVENT FLAG2 BIS #S$WEFN,S.WFL2(R4) ;NOTE THAT EVENT FLAG USED200$: CLC ;FLAG ALL IS WELLB BR 900$ ;RETURNH;E3;SOME SORT OF ERROR--RESET SP AND RETURN WITH C-SETE;0.300$: MOV R5,SP ;RESTORE SP TO ORIGINAL VALUE" SEC ;LET CALLER KNOW OF PROBLEM!900$: JMP (R3) ;RETURN TO CALLERO + .SBTTL .K.DLY SETUP/CHECK DELAY FROM STARTT;+3; .K.DLY -- SETUP/CHECK 'LDELAY' ARGUMENT FOR SWEEPL;M ; INPUTS:E;R(; (SP) ADDRESS OF 'LDELAY' ARGUMENT OR 0 ; R4 SWEEP CONTROL BLOCK POINTER#; R5 ORIGINAL SP AS SETUP BY .K.PAAW;( ; OUTPUTS:;E; C-CLEAR SETUP OK; .KADLY ZERO OR DELAY;&; C-SET CLOCK ACTIVE, OR DELAY ILLEGAL"; SP RESET TO VALUE BEFORE .K.PAA;0; REGISTERS ALTERED:;R; R3,R2R;N;--.K.DLY::MOV (SP)+,R3 ;PICK OFF RETURN ADDRESSM( MOV (SP)+,R2 ;GET 'LDELAY' ADDRESS OR 0 BNE 20$ ;IF NE GO USE IT& MOV #.ZEROW,R2 ;SET ADDRESS OF A ZERO20$: .IF DF K$$W11" TST .KAFLG ;IS THE CLOCK ACTIVE? BMI 60$ ;IF MI YES/ BIT #S$WA$D,S.WFL2(R4) ;IS THIS THE A/D SWEEP?I$ BNE 40$ ;IF NE YES--DELAY IS LEGAL0 BIT #S$WNOV,S.WFLG(R4) ;NO--IS IT CLOCK DRIVEN?& BNE 60$ ;IF NE YES--DELAY IS ILLEGAL'40$: MOV (R2),.KADLY ;NO--SET THE DELAYA BEQ 100$ ;IF EQ NO DELAY& NEG .KADLY ;MAKE IT TWO'S COMPLEMENT2 BIS #S$WDLY,S.WFL2(R4) ;NOTE THAT DELAY NECESSARY BR 80$ ;RETURN .ENDC ;K$$W11; ;CLOCK IS ACTIVE ALREADY;A(60$: TST (R2) ;WAS AN LDELAY SPECIFIED? BEQ 80$ ;IF EQ NO--OKO70$: SEC ;YES--ERROR MOV R5,SP ;RESET SP ON ERROR BR 100$ ;GO RETURN80$: CLC ;GOOD RETURNS!100$: JMP (R3) ;RETURN TO CALLERL .END--IS IT CLOCK DRIVEN?& BNE 60$ ;IF NE YES--DELAY IS ILLEGAL'40$: MOV (R2),.KADLY ;NO' .TITLE KADGCH GET CHANNEL INFO FOR A/DL .IDENT /02.00/T; ; COPYRIGHT (C) 1977, 1978, 1980/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.C;$>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO TH00R^^U^DATADATADATADATADATADATADATA .TITLE EXENDU .IDENT /00/ ;E; COPYRIGHT (C) 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.F; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;E ; VERSION 00;; T. J. MILLER 23-OCT-77;S@; THIS MODULE ENDS THE READ-ONLY EXECUTIVE IN SYSTEMS SUPPORTING; KERNEL DATA SPACE.;) P&$EXEND:: ;END OF READ ONLY EXECUTIVE - .END ;PLACE SECOND OF MINUTE IN BUFFERR CLC RETURN  E;H ; ERESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 02.00 ; B. SCHREIBER 5-JUL-77E;E; MODIFIED BY:;U; M. S. HARVEY 4-JAN-80T(; MSH082 -- CORRECT GAIN RANGING OPTION;T:; THIS MODULE CHECKS THE CHANNEL INFORMATION FOR A/D SWEEP;N; SYSTEM MACRO CALLS;N .MCALL KSWDF$ KSWDF$I .IF DF N$AD11 .IF DF A$$M11<GAINTB: .BYTE 20,40,60 ;TABLE OF GAIN BITS FOR GAINS 4,16,64 .EVEN .ENDC ;A$$M11 E- .SBTTL .ADGCH GATHER A/D CHANNEL INFORMATIONA;+'; .ADGCH -- GET A/D CHANNEL INFORMATIONS;T ; INPUTS:Y;C7; STACK SETUP FROM .K.PAA AND ALL INFORMATION UP TO THE ; CHANNEL PICKED OFFS1; R5 HOLDS OLD SP BEFORE .K.PAA (SETUP BY .K.PAA)N ; R4 SWEEP CONTROL BLOCK ADDRESS;E ; OUTPUTS:;A ; C-CLEAR CHANNEL STUFF SETUP OK-; S.WICH SETUP WITCH STARTING CHANNEL NUMBER'; S.WNCH SETUP WITH NUMBER OF CHANNELSB0; S.WAUA SETUP WITH THE ACTIVE UNIT UCB ADDRESS;4;.'; C-SET ERROR IN CHANNEL SPECIFICATIONSH!; SP RESET TO VALUE BEFORE .K.PAA;;-+.ADGCH::MOV (SP)+,R3 ;PICKUP RETURN ADDRESSU+ BIT #S$WADC,S.WFL2(R4) ;WAS SETADC CALLED?N3 BNE 300$ ;IF NE YES--WE DON'T HAVE TO DO ANYTHINGL0 TST S.WCHI(R4) ;DO WE HAVE A CHANNEL INCREMENT? BNE 10$ ;IF NE YES$ MOV #1,S.WCHI(R4) ;NO--DEFAULT TO 12 BIC #S$WDIF,S.WFL2(R4) ;AND NO DIFFERENTIAL INPUT .IF DF A$$M11110$: BIT #S$WACA,S.WFL2(R4) ;ABS CHAN ADDRESSING?E BNE 15$ ;IF NE YES. BIT #7,S.WFLG(R4) ;NO--ARE ANY GAIN BITS SET?- BNE 15$ ;IF NE YES--NOT ABS CHAN ADDRESSING.4 BIS #S$WACA,S.WFL2(R4) ;NO--SET ABS CHAN ADDRESSING .IFF ;A$$M11A710$: BIS #S$WACA,S.WFL2(R4) ;SET ABS CHANNEL ADDRESSINGW .IFTF ;A$$M11.15$: CALL .ADCMC ;COMPUTE CHANNEL I .TITLE LRDRV3 .IDENT /05/; COPYRIGHT (C) 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.B2; DIGITAL EQUIPMENT OF CANADA LTD, KANATA, ONTARIO;RA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDR9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.E;T ; VERSION 05; ; DAVID R. CROWE;I; PREVIOUSLY MODIFIED BY: ;E; DAVID H. CHAN; HELEN GORDON; PATRICIA C. LEE ;L; MODIFIED BY:;;; R. E. CALDWELL 21-AUG-79;T'; RC011 -- USE CORRECT FORM OF GTPKT$..;LF; PARALLEL COMMUNICATIONS LINK (PCL) RECEIVER DRIVER FOR RSX-11M-PLUS.;T; MACRO LIBRARY CALLS.;I .MCALL PKTDF$,TCBDF$,UCBDF$$ PKTDF$ ;DEFINE I/O PACKET OFFSETS- TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS. UCBDF$ ;DEFINE UCB OFFSETST;+A; THIS DRIVER IS IN ONE OF A NUMBER OF SOFTWARE STATES DURING ITS @; OPERATION. ITS CURRENT STATE IS DEFINED IN THE LOW ORDER BYTE9; OF U.CW2 IN THE UCB. HANDLER STATES ARE DEFINED BELOW.2;U; INDEX MEANING; 0 NO TASK CONNECTED.%; 2 TASK CONNECTED BUT NOT TRIGGERED.K); 4 TASK TRIGGERED & AWAITING ATF OR RTF.T3; 6 TASK CONNECTED & TIMED OUT AWAITING ATF OR RTF.C;$; ... BUSY STATES .../8; THE CONTROLLER IS CONSIDERED BUSY BY RSX-11M WHILE THEE; HANDLER IS IN THESE STATES. THEREFORE ONLY THE INTERRUPT PROCESSORF=; NEED CONCERN ITSELF WITH THEM. BUSY STATES ARE AS FOLLOWS:R; ; -2 ATF IN PROGRESS. 6; -4 TASK CONNECTED, NOT TRIGGERED, & HAS ATF PENDING.; -6 RTF IN PROGRESS.; ; LEGAL FUNCTIONS BY STATE. ; FUN00U^^4^eaekCTION LEGAL STATES; CRX 0T ; RTF 4, 6 ; ATF 2, 4, 6G ; DRX 2, 4, 6 ;-;++; HANDLER UCB WORK AREA OFFSET DEFINITIONS.T;-4U.TASK = U.CNT+2 ;TCB ADDR OF CONNECTED TASK [WORD]/U.TEF = U.TASK+2 ;TRIGGER EVENT FLAG NO. [WORD]S1U.TRSB = U.TEF+2 ;REAL ADDRESS OF TRIGGER STATUSC3U.BUF1 = U.TRSB+4 ;ADDRESS OF RETURN BUFFER (2 WDS) +U.AADA = U.BUF1+4 ;ATACHMENT DESCR. STORAGE ; BUFFER [2 WORDS];+?; THE HARDWARE REGISTERS ARE DEFINED RELATIVE TO THE RCR, WHOSECA; ADDRESS IS FOUND IN THE S.CSR FIELD OF THE SCB AT RUN TIME.;-$RCR = 0 ;RECEIVER COMMAND REGISTER.#RSR = 2 ;RECEIVER STATUS REGISTER.O,RDDB = 4 ;RECEIVER DESTINATION DATA BUFFER.+RDBC = 6 ;RECEIVER DESTINATION BYTE COUNT. -RDBA = 10 ;RECEIVER DESTINATION BUS ADDRESS. %RDCRC = 12 ;RECEIVER DESTINATION CRCT;+"; RECEIVER COMMAND REGISTER (RCR).;-REJ = 100000 ;REJECT (R/W) "RCNPR = 40000 ;RECEIVER NPR (R/W)"RCVWD = 20000 ;RECEIVE WORD (R/W)'IB04 = 10000 ;IDENTIFICATION BITS (RO)SIB03 = 4000 ; "IB02 = 2000 ; "IB01 = 1000 ; "IB00 = 400 ; " LDSILO = 200 ;LOAD SILO (R/W)!IE = 100 ;INTERRUPT ENABLE (R/W)O&A17 = 40 ;EXTENDED ADDRESS BITS (R/W) A16 = 20 ; "6#DTIRDY = 10 ;DATA INPUT READY (RO),INHADI = 4 ;INHIBIT ADDRESS INCREMENT (R/W)"BDINIT = 2 ;BOARD INITIALIZE (WO)RCVDAT = 1 ;RECEIVE DATA (R/W)G;IB = IB04!IB03!IB02!IB01!IB00 ;UNION OF IDENTIFICATION BITS ;+!; RECEIVER STATUS REGISTER (RSR).V;-ERR = 100000 ;ERROR (RO)T*NEXLOC = 40000 ;NONEXISTENT LOCATION (RO)&MEMOFL = 20000 ;MEMORY OVERFLOW (R/W))TXMERR = 10000 ;TRANSMISSION ERROR (R/W)EPAR = 4000 ;PARITY (R/W)RTIMOUT = 2000 ;TIME OUT (R/W)(BCOFL = 1000 ;BYTE COUNT OVERFLOW (R/W)%DTORDY = 400 ;DATA OUTPUT READY (RO)I(SUCTXF = 200 ;SUCCESSFUL TRANSFER (R/W)BUSY = 100 ;BUSY (RO)"RECOM = 40 ;REJECT COMPLETE (R/W)CHNOPN = 20 ;CHANNEL OPEN (RO)URSPB1 = 10 ;RESPONSE B1 (RO)RSPB0 = 4 ;RESPONSE B0 (RO)RSPA1 = 2 ;RESPONSE A1 (RO)RSPA0 = 1 ;RESPONSE A0 (RO);+; FUNCTION DISPATCH TABLEO;- FUNTBL: .IRP X, .WORD IO.'X, XS .ENDM .WORD 0 ;TERMINATOR0;+; DEVICE DISPATCH TABLE ;-- DDT$ LR,L$$R11,,CHK ;GENERATE DISPATCH TABLE(;+0; LRCHK - PCL RECEIVER DRIVER PARAMETER CHECKING; B; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/OD; REQUEST IS RECEIVED FOR THE PARALLEL COMMUNICATIONS LINK RECEIVER.E; SOME PCL RECEIVER REQUESTS CONTAIN INFORMATION THAT MUST BE CHECKEDRG; IN THE CONTEXT OF THE ISSUING TASK; THEREFORE, THE I/O REQUEST IS NOT#; QUEUED BEFORE CALLING THE DRIVER.O;I ; INPUTS:.;M ; R1 = ADDRESS OF THE I/O PACKET*; R4 = ADDRESS OF THE STATUS CONTROL BLOCK;; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATEDR;I ; OUTPUTS:;HE; IF FUNCTION IS IO.CRX, ADDRESS CHECK IS PERFORMED FOR IOSB(8 BYTES) ;IA; IF THE QIO FUNCTION IS IO.ATF THEN THE RETURN BUFFER ADDRESS ISI9; CHECKED TO DETERMINE WHETHER IT LIES WITHIN THE ISSUING D; TASK'S ADDRESS SPACE. IF IT DOES THEN THE RETURN BUFFER ADDRESS IS>; RELOCATED AND STORED IN THE I/O PACKET. IF IT IS NOT A VALID@; ADDRESS THEN AN ILLEGAL BUFFER STATUS IS RETURNED AS THE FINAL; I/O STATUS OF THE REQUEST.;=;; FOR ALL FUNCTION CODES, THE I/O PACKET IS INSERTED IN THE ?; CONTROLLER QUEUE AND THE DEVICE INITIATOR IS ENTERED TO START ; THE CONTROLLER.;-1LRCHK: CMP #IO.CRX,I.FCN(R1) ;IS FUNCTION 'CRX'?R BNE 5$ ;IF NE NO# MOV R1,R3 ;SAVE IO PACKET ADDRESSI2 MOV I.PRM+2(R3),R0 ;GET VIRTUAL ADDRESS OF BUFFER MOV #4.,R1 ;GET LENGTH 4 BYTES CALL $ACHKB ;CHECK THE ADDRESS BCS 10$ ;IF CS BAD' MOV W.BATT(R2),R2 ;GET ATT. DESC. ADD.S$ INCB A.IOC(R2) ;INCREMENT I/O COUNT) MOV R2,I.PRM+6(R3) ;SAVE ATT. DESC. ADDRI" CALL $RELOC ;RELOCATE THE BUFFER MOV R1,I.PRM+2(R3) ;STORE BIAST" MOV R2,I.PRM+4(R3) ;STORE ADDRESS& MOV R3,R1 ;RESTORE IO PACKET ADDRESS BR 20$ ;CONTINUE55$: CMP #IO.ATF,I.FCN(R1) ;IS FUNCTION CODE = 'ATF'?  BNE 20$ ;IF NE NOS;D; 'ATF' FUNCTION - SET UP REGISTERS FOR ADDRESS CHECK AND RELOCATION;G$; R000U^^U^DATADATADATADATADATADATADATA = ADDRESS TO CHECK AND RELOCATE ; R3 = ADDRESS OF THE I/O PACKET;B+ MOV R1,R3 ;SAVE ADDRESS OF THE I/O PACKET(9 MOV I.PRM+6(R3),R0 ;GET VIRTUAL ADDRESS OF RETURN BUFFERS;A2; VALIDATE THE RETURN BUFFER ADDRESS FOR THIS TASK;+5 MOV #12.,R1 ;SET LENGTH OF RETURN BUFFER TO 6 WORDS CALL $ACHCK ;CHECK THE ADDRESS BCC 15$ ;IF CC OKN;F; INVALID RETURN BUFFER ADDRESS - SET ILLEGAL BUFFER STATUS AND FINISH;S210$: MOV #IE.SPC&377,R0 ;SET ILLEGAL BUFFER STATUS$ CALLR $IOFIN ;FINISH I/O OPERATION;S$; RELOCATE THE RETURN BUFFER ADDRESS; ,15$: MOV W.BATT(R2),R2 ;GET ATT. DESC. ADDR.$ INCB A.IOC(R2) ;INCREMENT I/O COUNT* MOV R2,I.AADA+2(R3) ;SAVE PTR FOR $IODONE CALL $RELOC ;RELOCATE ADDRESSD3 MOV R1,I.PRM+6(R3) ;RELOCATION BIAS ==> I/O PACKETR3 MOV R2,I.PRM+10(R3) ;16-BIT ADDRESS ==> I/O PACKETD% MOV R3,R1 ;RESTORE R1 TO I/O PACKETI;E$; INSERT THE I/O PACKET IN THE QUEUE;S(20$: MOV R4,R0 ;R0 = I/O QUEUE LISTHEAD( CALL $QINSP ;GO INSERT PACKET IN QUEUE; $; NOW GET THE I/O PACKET TO PROCESS.;E1LRINI: GTPKT$ LR,L$$R11,,,T ;GET I/O PACKET MACRO;1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:C;T!; R1 = ADDRESS OF THE I/O PACKET.R/; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB.R; R3 = CONTROLLER INDEX.+; R4 = ADDRESS OF THE STATUS CONTROL BLOCK.6<; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;E; I/O REQUEST PACKET FORMAT:;N; WD.00 = I/O QUEUE THREAD WORDR.; WD.01 = REQUEST PRIORITY, EVENT FLAG NUMBER.(; WD.02 = TCB ADDRESS OF REQUESTER TASK.;; WD.03 = POINTER TO 2ND LUN WORD IN REQUESTER TASK HEADER.CB; WD.04 = CONTENTS OF 1ST LUN WORD IN REQUESTER TASK HEADER (UCB).; WD.05 = I/O FUNCTION CODE..; WD.06 = VIRTUAL ADDRESS OF I/O STATUS BLOCK..; WD.07 = RELOCATION BIAS OF I/O STATUS BLOCK.9; WD.10 = I/O STATUS BLOCK ADDRESS DISPLACEMENT + 140000. 1; WD.11 = VIRTUAL ADDRESS OF AST SERVICE ROUTINE.S;; WD.12 = FIRST PARAMETER OR RELOCATION BIAS OF DATA BUFFER0;; WD.13 = SECOND PARAMETER OR 16-BIT ADDRESS OF DATA BUFFERS2; WD.14 = THIRD PARAMETER OR LENGTH OF DATA BUFFER>; WD.15 = FOURTH PARAMETER OR RELOCATION BIAS OF RETURN BUFFER<; WD.16 = FIFTH PARAMETER OR 16-BIT ADDRESS OF RETURN BUFFER;/ MOV I.TCB(R1),R0 ;GET TCB ADDRESS OF REQUESTOR 0 BITB #T2.ABO,T.ST2(R0) ;IS TASK BEING ABORTED? BEQ 10$ ;IF EQ NOK CALLR IEVER ;YES, IT'S FATAL210$: MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE.20$: CMP (R0),I.FCN(R1) ;FUNCTION CODES MATCH? BEQ 30$ ;IF EQ YES$ CMP (R0)+,(R0)+ ;MOVE TO NEXT ENTRY TST (R0) ;END OF TABLE?  BNE 20$ ;IF NE NON$ CALLR IEIFC ;YES, ILLEGAL FUNCTION*30$: JMP @2(R0) ;GO TO FUNCTION PROCESSOR;+; PROCESS 'CRX' FUNCTION;-4CRX: CMP I.PRM(R1),#96. ;IF TRIGGER EVENT FLAG > 64, BHI 20$ ;IF HI BAD. TSTB U.CW2(R5) ;IS A TASK ALREADY CONNECTED ? BNE 10$ ;IF NE YES6 MOV I.PRM(R1),U.TEF(R5) ;SAVE TRIGGER EVENT FLAG NO.< MOV I.PRM+2(R1),U.TRSB(R5) ;SAVE THE ADDRESS OF THE TRIGGER- MOV I.PRM+4(R1),U.TRSB+2(R5) ;STATUS BUFFER(, MOV I.TCB(R1),U.TASK(R5) ;SAVE TCB ADDRESS2 MOV I.PRM+6(R1),U.AADA(R5) ;SAVE ATT. DESC. ADDR.( CALL PRCRX ;CONNECT TASK FOR RECEPTION( CALLR ISSUC ;INDICATE SUCCESS AND EXIT,10$: CALLR IEDAA ;SOMEONE ALREADY CONNECTED*20$: CALLR IEBAD ;BAD PARAMETER SPECIFIED;+/; **-PRCRX-PERFORM ACTUAL CONNECT FOR RECEPTIONE;$?; THIS ROUTINE IS CALLED TO CONNECT THE RECEIVER FOR RECEPTION.N<; IT ACTIVATES THE HARDWARE TO RECEIVE A WORD, WHICH WILL BEE; TREATED AS A FLAGS WORD. IT SETS THE SOFTWARE STATE OF THE HANDLERS@; TO 2. THE ROUTINE SHOULD BE CALLED WHENEVER THE HANDLER WISHES; TO RECEIVE A FLAGS WORD.;C ; INPUTS:R0; R4 = ADDRESS OF THE STATUS CONTROL BLOCK (SCB).; R5 = ADDRESS OF THE UNIT CONTROL BLOCK (UCB);0 ; OUTPUTS:6; THE RECEIVER IS INITIALIZED (BDINIT) & RCVWD IS SET.); THE HANDLER IS SET TO SOFTWARE STATE 2.U ; R0 IS SET POINTING TO THE RCR.;-'PRCRX: MOV U.BUF(R5),-(SP) ;SAVE BUFFERR MOV U.BUF+2(R5),-(SP) ;ADDRESS MOV U.CNT(R5),-(SP) ;& COUNT./ MOV U.TRSB(R5),U.BUF(R5) ;MOVE TRIGGER STATUS 5 MOV U.TRSB+2(R5),U.BUF+2(00U^^4^eaekR5) ;BUFFER ADDR TO U.BUF.S# MOV #4,U.CNT(R5) ;LOAD BYTE COUNT.N% CLR -(SP) ;SET STATUS BYTE TO ZERO.N CALL $PTBYT ; " $ MOV (SP)+,U.CNT(R5) ;RESTORE BUFFER MOV (SP)+,U.BUF+2(R5) ;ADDRESS MOV (SP)+,U.BUF(R5) ;& COUNT.% MOV S.CSR(R4),R0 ;GET ADDRESS OF RCRO' BIS #BDINIT,(R0) ;INITIALIZE RECEIVER. 2 BIS #RCVWD!IE,(R0) ;PREPARE TO RECEIVE A FLAG WD.+ MOVB #2,U.CW2(R5) ;SET HANDLER STATE TO 2.U RETURN ;);+; PROCESS 'RTF' FUNCTION;-8RTF: CMP I.TCB(R1),U.TASK(R5) ;RTF FROM CONNECTED TASK? BEQ 10$ ;IF EQ YES' CALLR IEDNA ;NO, DEVICE NOT AVAILABLER*10$: MOVB U.CW2(R5),R0 ;GET HANDLER STATE.% BIC #^C6,R0 ;MASK OUT UNWANTED BITSR2 JMP @RTFJMP(R0) ;PROCESS FUNCTION ACCORDING STATERTFJMP: .WORD IEDNA ;STATE 0R .WORD IENTR ;STATE 2 .WORD RTFS4 ;STATE 4 .WORD RTFS6 ;STATE 6+RTFS4: MOV S.CSR(R4),R0 ;GET ADDRESS OF RCRW+ BIS #REJ!IE,(R0) ;SET REJECT & INT ENABLE.2- MOVB #-6,U.CW2(R5) ;SET HANDLER STATE TO -6.N( MOVB S.ITM(R4),S.CTM(R4) ;SET TIME OUT RETURN ;T1RTFS6: MOVB #2,U.CW2(R5) ;SET HANDLER STATE TO 2.V$ CALLR IEDNR ;FORCE DRIVE NOT READY;+; PROCESS 'ATF' FUNCTION;-ATF: ;REF LABEL .IF DF M$$EXT( CALL $STMAP ;SET UP UNIBUS MAP ADDRESS .ENDC4 MOV I.PRM+6(R1),U.BUF1(R5) ;RELOCATION BIAS ==> UCB6 MOV I.PRM+10(R1),U.BUF1+2(R5) ;16-BIT ADDRESS ==> UCB4 CMP I.TCB(R1),U.TASK(R5) ;ATF FROM CONNECTED TASK? BEQ 10$ ;IF EQ YES' CALLR IEDNA ;NO, DEVICE NOT AVAILABLEN*10$: MOVB U.CW2(R5),R0 ;GET HANDLER STATE." BIC #^C6,R0 ;CLEAR UNWANTED BITS5 JMP @ATFJMP(R0) ;PROCESS FUNCTION ACCORDING TO STATEIATFJMP: .WORD IEDNA ;STATE 0F .WORD ATFS2 ;STATE 2 .WORD PRATF ;STATE 4 .WORD RTFS6 ;STATE 6ATFS2: MOVB #-4,U.CW2(R5)% CLRB S.CTM(R4) ;NO TIME OUT ON THIS5 RETURN ;;+); **-PRATF-PERFORM ACCEPTANCE OF TRANSFERB;AA; THIS ROUTINE IS CALLED TO INITIATE THE RECEPTION OF THE MESSAGE?@; WHICH HAS JUST BEEN ACCEPTED. THE STATE OF THE HANDLER IS SET<; TO -2, WHICH INDICATES THAT THE HANDLER IS BUSY PERFORMING; THE ACCEPT TRANSFER FUNCTION.);R ; INPUTS:I0; R4 = ADDRESS OF THE STATUS CONTROL BLOCK (SCB).; R5 = ADDRESS OF THE UNIT CONTROL BLOCK (UCB);E ; OUTPUTS:D; THE RDBC & RDBA ARE SET UP, & AN NPR RCVDAT FUNCTION IS INITIATED.!; THE HANDLER IS SET TO STATE -2. ; R0 IS SET POINTING TO THE RCR.; R2 IS DESTROYED.;-PRATF: ;REF LABEL .IF DF M$$EXT# CALL $MPUBM ;MAP UNIBUS TO MEMORYE. MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS .ENDC% MOV S.CSR(R4),R0 ;GET ADDRESS OF RCR9 MOV U.BUF+2(R5),RDBA(R0) ;LOAD BUFFER ADDRESS REGISTER.D" MOV U.CNT(R5),R2 ;GET BYTE COUNT. NEG R2 ;NEGATE IT & LOAD& MOV R2,RDBC(R0) ;BYTE COUNT REGISTER.- MOVB #-2,U.CW2(R5) ;SET HANDLER STATE TO -2.U9 BIS #RCNPR!RCVDAT!IE,U.BUF(R5) ;SET RCNPR, RCVDAT, IE, & 0 BIS U.BUF(R5),(R0) ;EXTENDED ADDR BITS IN RCR.( MOVB S.ITM(R4),S.CTM(R4) ;SET TIME OUT RETURN ;L;+; PROCESS 'DRX' FUNCTION;-,DRX: TSTB U.CW2(R5) ;IS ANY TASK CONNECTED ? BEQ 10$ ;IF EQ NOR( MOV I.TCB(R1),R1 ;YES, GET TCB ADDRESS., CMP R1,U.TASK(R5) ;IS THIS TASK CONNECTED ? BNE 10$ ;IF NE NOG CALL PRDRX ;DO THE DISCONNECTI CALLR ISSUC ;EXIT WITH SUCCESS'10$: CALLR IEDNA ;DEVICE NOT AVAILABLEN;+3; **-PRDRX-PERFORM ACTUAL DISCONNECT FROM RECEPTIONN; =; THIS ROUTINE DISCONNECTS THE RECEIVING TASK FROM RECEPTION..;M ; INPUTS:4; R1 = ADDRESS OF TCB FOR TASK.R; R4 = SCB ADDRESS.S; R5 = UCB ADDRESS.;R ; OUTPUTS:4; THE I/O REQUEST COUNT FOR THE TASK IS DECREMENTED.'; THE RECEIVER IS INITIALIZED (BDINIT). ; THE HANDLER STATE IS SET TO 0. ; R0 IS SET POINTING TO THE RCR.;-;PRDRX: MOV U.AADA(R5),R0 ;GET ATTACHMENT DESCRIPTOR ADDRESS$ DECB A.IOC(R0) ;DECREMENT I/O COUNT% MOV S.CSR(R4),R0 ;GET ADDRESS OF RCRI- BIS #BDINIT,(R0) ;INITIALIZE RECEIVER BOARD.S, CLR U.AADA(R5) ;CLEAR ATTACHED REGION DESC.4 CLR U.TASK(R5) ;CLEAR TCB ADDRESS OF CONNECTED TASK% CLR U.TEF(R5) ;CLEAR EVENT FLAG ALSO( CLRB U.CW2(R5) ;SET HANDLER STATE TO 0. RETURN ; ;+,; **-$LRINT-PCL RECE00U^^U^DATADATADATADATADATADATADATAIVER INTERRUPT PROCESSOR;<; INTERRUPTS ARE PROCESSED DEPENDING UPON THE HANDLER STATE.;-$LRINT::6 INTSV$ LR,PR5,L$$R11 ;;;GENERATE INTERRUPT SAVE STUFF% MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS.% MOV S.CSR(R4),R4 ;;;GET RCR ADDRESS.( BIC #IE,(R4) ;;;DISABLE PCL INTERRUPTS.& CALL $FORK ;;;CREATE A FORK PROCESS. MOV R4,R0 ;COPY RCR ADDRESSE# MOV U.SCB(R5),R4 ;GET SCB ADDRESS.R& MOVB U.CW2(R5),R2 ;GET HANDLER STATE.6 JMP @INTJMP(R2) ;PROCESS INTERRUPT ACCORDING TO STATE .WORD INTM6 ;STATE -6I .WORD INTM4 ;STATE -4  .WORD INTM2 ;STATE -2DINTJMP: .WORD INTP0 ;STATE 0 .WORD INTP2 ;STATE 2  .WORD INTP4 ;STATE 4  .WORD INTP6 ;STATE 6V;B<; THE VARIOUS INTERRUPT STATE PROCESSORS WHICH ARE JUMPED TOG; THROUGH THE INTJMP TABLE ARE ENTERED WITH REGISTERS SET AS FOLLOWS:A; R0 = RCR ADDRESS; R2 = HANDLER STATE; R4 = SCB ADDRESS; R5 = UCB ADDRESS;1INTM6: BIT #ERR!SUCTXF,RSR(R0) ;ERROR OF SUCTXF?R BNE 10$ ;IF NE YES" BIT #RECOM,RSR(R0) ;IS RECOM SET? BEQ 10$ ;IF EQ NOT% CALL PRCRX ;RECONNECT FOR RECEPTIOND CALLR ISSUC ;EXIT WITH SUCCESS'10$: CALLR IEFHE ;FATAL HARDWARE ERRORAINTM4:INTP2: INTP6: TST RSR(R0) ;ANY ERRORS? BMI 10$ ;IF MI YES' BIT #RECOM,RSR(R0) ;REJECT COMPLETION?  BNE 20$ ;IF NE YES( BIT #DTORDY,RSR(R0) ;DATA OUTPUT READY? BNE 40$ ;IF NE YES/ CALLR PRCRX ;RECONNECT FOR RECEPTION AND EXITD(10$: BIT #PAR,(R0) ;IS IT PARITY ERROR ? BNE 20$ ;IF NE YES NOP)20$: CALL PRCRX ;RECONNECT FOR RECEPTION , MOVB R2,U.CW2(R5) ;MOVE STATE TO AS BEFORE. RETURN ;E#40$: TST R2 ;IS HANDLER STATE -4 ?S, BGE 60$ ;IF GE NO, GIVE FLAGS WORD TO TASK TST RDDB(R0) ; CALLR PRATF ;ACCEPT TRANSFER360$: MOV U.BUF(R5),-(SP) ;SAVE BUFFER ADDR & COUNT.P MOV U.BUF+2(R5),-(SP) ;Y MOV U.CNT(R5),-(SP) ;= MOV U.TRSB(R5),U.BUF(R5) ;LOAD TRIGGER STATUS BLOCK ADDRESSN MOV U.TRSB+2(R5),U.BUF+2(R5) ;+ MOV #4,U.CNT(R5) ;LOAD A BIG ENOUGH COUNT.2 CMP R2,#2 ;IS THE STATUS=2?  BEQ 70$ ;IF EQ YES4 MOV #&377,R2 ; STATE 6 ==> STATUS IE.DAO70$: ASRB R2 ; " MOV (R0),R3 ;GET CONTENTS OF RCR( BIC #^C,R3 ;ISOLATE TRANSMITTER ID. BIS R3,R2 ;MERGE WITH STATUS.P$ MOV R2,-(SP) ;GET FIRST STATUS WORD" CALL $PTWRD ;PUT IN USERS BUFFER+ MOV RDDB(R0),-(SP) ;GET SECOND STATUS WORDR" CALL $PTWRD ;PUT IN USERS BUFFER6 MOV (SP)+,U.CNT(R5) ;RESTORE COUNT AND BUFFER ADDRESS MOV (SP)+,U.BUF+2(R5) ;. MOV (SP)+,U.BUF(R5) ;# MOVB #4,U.CW2(R5) ;SET STATE TO 4.S# BIS #IE,(R0) ;REENABLE INTERRUPTS..- MOV U.TEF(R5),R0 ;GET TRIGGER EVENT FLAG NO.:4 MOV U.TASK(R5),R5 ;GET TCB ADDR FOR CONNECTED TASK. BEQ 90$ ;IF EQ NONEA- CALL $CEFI ;CONV EVENT FLAG TO MASK & ADDR." BCS 90$ ;IF CS NO FLAG SPECIFIED BIS R0,(R1) ;SET FLAGS.90$: CALLR $DRDSE ;DECLARE SIGNIFICANT EVENT. INTM2: TST RSR(R0) ;ANY ERRORS? BMI M2ERR ;IF MI YES$ TSTB RSR(R0) ;SUCCESSFUL TRANSFER? BPL M2PAR ;IF PL NOR)M2SUC: MOV (R0),R2 ;GET CONTENTS OF RCR.2) BIC #^C,R2 ;RETRIEVE TRANSMITTER ID.A' BIS #IS.SUC,R2 ;MERGE IN RETURN STATUST% BIT #RECOM,RSR(R0) ;REJECT COMPLETE?, BEQ 10$ ;IF EQ NOC% INC R2 ; +2 FOR TRUNCATED RECEPTION210$: MOV RDBC(R0),R1 ;COMPUTE LENGTH OF RECEPTION. ADD U.CNT(R5),R1 ;S MOV U.BUF(R5),-(SP) ;SAVE U.BUF% MOV U.BUF+2(R5),-(SP) ;SAVE U.BUF+2N MOV U.CNT(R5),-(SP) ;SAVE U.CNT3 MOV U.BUF1(R5),U.BUF(R5) ;RELOCATION BIAS ==> UCBU BEQ 20$ ;IF EQ ZEROL5 MOV U.BUF1+2(R5),U.BUF+2(R5) ;16-BIT ADDRESS ==> UCB  BR 30$ ;GO MOVE THE REGISTERSV;R7; RELOCATION BIAS = 0 CHECK FOR NON-ZERO 16-BIT ADDRESS;T920$: MOV U.BUF1+2(R5),U.BUF+2(R5) ;16-BIT ADDRESS ==> UCBI" BEQ 40$ ;IF EQ NO RETURN ADDRESS;0#; REGISTERS REQUESTED - RETURN THEM ;E.30$: MOV (R0)+,-(SP) ;GET CONTENTS OF REGISTER% CALL $PTWRD ;PUT IT IN USERS BUFFER * MOV (R0)+,-(SP) ;GET CONTENTS OF REGISTER% CALL $PTWRD ;PUT IT IN USERS BUFFERA* MOV (R0)+,-(SP) ;GET CONTENTS OF REGISTER% CALL $PTWRD ;PUT IT IN USERS BUFFERD* MOV (R0)+,-(SP) ;GET CONTENTS OF REGISTER% CALL $PTWRD ;PUT IT IN USERS BUFFERO* M00U^^4^eaekOV (R0)+,-(SP) ;GET CONTENTS OF REGISTER% CALL $PTWRD ;PUT IT IN USERS BUFFER=;C; CONTINUE PROCESSING ;U'40$: MOV (SP)+,U.CNT(R5) ;RESTORE U.CNTE( MOV (SP)+,U.BUF+2(R5) ;RESTORE U.BUF+2# MOV (SP)+,U.BUF(R5) ;RESTORE U.BUFP% CALL PRCRX ;RECONNECT FOR RECEPTION) MOV R2,R0 ;COPY STATUS CODEL" CALLR IODON ;FINISH I/O AND EXIT*M2ERR: MOV RSR(R0),R1 ;GET CONTENTS OF RSR$ BIT #BCOFL,R1 ;CHECK FOR BYTE COUNT BNE 10$ ;IF NE OVERFLOWN2 BIT #PAR!TXMERR,R1 ;PARITY OR TRANSMISSION ERROR? BNE M2PAR ;IF NE YES$ BIT #TIMOUT,R1 ;CHECK FOR TIME OUT. BNE M2TIME ;IF NE YES) BIT #MEMOFL!NEXLOC,R1 ;NEM OR OVERFLOW?P BNE M2OFL ;IF NE YES* CALLR IEBBE ;INDICATE TRANSMISSION ERROR;; BYTE COUNT OVERFLOWE;R/10$: BIC #BCOFL,RSR(R0) ;CLEAR ERROR CONDITION.# BIS #REJ!IE,(R0) ;TRUNCATE MESSAGER RETURN ;S;/; PARITY OR TRANSMISSION ERROR; +M2PAR: CALL PRCRX ;RECONNECT FOR RECEPTIONO BR IEBBE ;FLAG IE.BBEI;E; RECEIVER TIMEOUT;X,M2TIME: CALL PRCRX ;RECONNECT FOR RECEPTION! BR IEDNR ;FLAG DEVICE NOT READYC;K*; NONEXISTENT LOCATION OR MEMORY OVERFLOW.;#+M2OFL: CALL PRCRX ;RECONNECT FOR RECEPTIONO) BR IESPC ;INDICATE NONEXISTENT LOCATIONN*INTP0: BIS #BDINIT,(R0) ;INITIALIZE BOARD. RETURN ;F+INTP4: CALL PRCRX ;RECONNECT FOR RECEPTIONE+ MOVB #6,U.CW2(R5) ;SET HANDLER STATE TO 6. RETURN ;N;+%; **-LRCAN-CANCEL I/O SERVICE ROUTINEN; :; THIS ENTRY POINT IS ENTERED WHEN AN IO.KIL FUNCTION IS9; ISSUED REGARDLESS OF WHETHER THE DEVICE IS BUSY OR NOT. ;N ; INPUTS:V,; R0 = ADDRESS OF ACTIVE I/O PACKET (IF ANY)%; R1 = ADDRESS OF TCB OF CURRENT TASK ; R3 = CONTROLLER INDEXO; R4 = SCB ADDRESS; R5 = UCB ADDRESS;N ; OUTPUTS:6; 1. IF TASK TERMINATION IS IN PROGRESS, THEN BOARD IS1; INITIALIZED & TASK (IF ANY) IS DISCONNECTED.67; 2. OTHERWISE, IF REQUEST IS OUTSTANDING, THEN TASK IS; RECONNECTED FOR RECEPTION.T>; 3. REGARDLESS OF RUN DOWN STATUS, IF REQUEST IS OUTSTANDING,2; THEN COMPLETION IS INDICATED WITH STS=IE.ABO.;-7LRCAN: CMP R1,U.TASK(R5) ;;;REQUEST FOR CONNECTED TASK?E BNE 10$ ;;;IF NE NOE% MOV S.CSR(R4),R3 ;;;GET RCR ADDRESS.R$ BIC #IE,(R3) ;;;DISABLE INTERRUPTS. MTPS #0 ;;;LOWER PRIORITY:/ BITB #T2.HLT,T.ST2(R1) ;TASK BEING TERMINATED?O BEQ 20$ ;IF EQ NOZ0 MOVB U.CW2(R5),R2 ;YES, RETRIEVE HANDLER STATE. CALL PRDRX ;DISCONNECT TASKT TSTB R2 ;IS UNIT BUSY? BLT 30$ ;IF LT YES10$: RETURN ;F"20$: TSTB U.CW2(R5) ;IS UNIT BUSY? BGE 10$ ;IF GE YES+ CALL PRCRX ;ABORT OPERATION AND RECONNECTR30$: BR IEABO ;;+; POWERFAIL AND TIMEOUTK;-)LROUT: TSTB U.CW2(R5) ;IS TASK CONNECTED?G BEQ 10$ ;IF EQ YES% CALL PRCRX ;RECONNECT FOR RECEPTION /10$: BITB #US.BSY,U.STS(R5) ;IS THE UNIT BUSY?T BEQ LRPWF ;IF EQ NO* BR IEDNR ;YES, ABORT OUTSTANDING REQUESTLRPWF: RETURN ;T;+-; PROCESS ERROR CONDITIONS AND CALL I/O DONE.N;-%IEABO: MOV #IE.ABO&377,R0 ;ABORT TASK BR IODON ;)IEBAD: MOV #IE.BAD&377,R0 ;BAD PARAMETERSY BR IODON ;3IEDAA: MOV #IE.DAA&377,R0 ;DEVICE ALREADY CONNECTED BR IODON ;1IEBBE: MOV #IE.BBE&377,R0 ;BAD TRANSMISSION ERRORK BR IODON ;/IEDNA: MOV #IE.DNA&377,R0 ;DEVICE NOT AVAILABLEE BR IODON ;+IEDNR: MOV #IE.DNR&377,R0 ;DEVICE NOT READYB BR IODON ;/IEFHE: MOV #IE.FHE&377,R0 ;FATAL HARDWARE ERROR BR IODON ;0IEIFC: MOV #IE.IFC&377,R0 ;INVALID FUNCTION CODE BR IODON ;-IENTR: MOV #IE.NTR&377,R0 ;TASK NOT TRIGGEREDO BR IODON ;)IESPC: MOV #IE.SPC&377,R0 ;ILLEGAL BUFFERO BR IODON ;6IEVER: MOV #IE.VER&377,R0 ;PARITY OR HARD DEVICE ERROR BR IODON ;/ISSUC: MOV #IS.SUC&377,R0 ;SUCCESSFUL OPERATIONO%IODON: CALL $IOALT ;PROCESS I/O DONE  JMP LRINI ;AND TRY FOR MORE .ENDV #IE.DNR&377,R0 ;DEVICE NOT READYB BR IODON ;/IEFHE: MOV #IE.FHE&377,R0 ;FATAL HARDWARE ERROR BR IODON ;0IEIFC: MOV #IE.IFC&377,R0 ;INVALID FUNCTION CODE BR IODON ;-IENTR: MOV #IE.NTR&377,R0 ;TASK NOT TRIGGEREDO BR IODON ;)IESPC: MOV #IE.SPC&377,R0 ;ILLEGAL BUFFERO BR IODON ;6IEVER: MOV #IE00V^^U^DATADATADATADATADATADATADATA .TITLE MKDRV .IDENT /02/;; COPYRIGHT (C) 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 02;; J. REED 6-OCT-78;; MODIFIED BY:;; J.E.POLLACK 18-JUL-79;%; EP011 -- ADD CLEAR MEMORY FUNCTION;; B. S. MCCARTHY;'; VARIOUS BUG FIXES THROUGHOUT HISTORY;;;; MKA11 MEMORY DRIVER;; >; THE MKA11 MEMORY DRIVER IS THE INTERFACE BETWEEN HRC AND THE@; MEMORY CSRS. THE ONLY TASK THAT MAY ACCESS THIS DRVIER IS HRC.; ;S; MACRO LIBRARY CALLSU;R# .MCALL HWDDF$,PKTDF$,MKDEF$,UCBDF$R HWDDF$N PKTDF$C MKDEF$E UCBDF$ ; DEFINE UCB OFFSETS;S; BIT ASSIGNMENTSE;- BIT0 = 1I BIT1 = 2J BIT2 = 4L BIT3 = 101 BIT4 = 20O BIT5 = 40 BIT6 = 100 BIT7 = 200B BIT8 = 400U BIT9 = 1000 BIT10 = 2000O BIT11 = 4000  BIT12 = 10000E BIT13 = 20000E BIT14 = 40000N BIT15 = 100000E;C ; CSR OFFSETSA;T CSR1 = 0 ;$ CSR2 = 2 ; SECOND CSR CONTROL WORD R;A; BIT DEFINITIONS FOR MK11 CSRSK;$> PROG = BIT10 ; BOX CONTROL 1 => PROGRAMMMABLE, 0 => MANUAL? ECC = BIT1 ; ECC DISABLE 1 => SINGLE BIT ERRORS DETECTABLE  SIZ = BIT3 ;L4 SEIND = BIT4 ; SBE SEEN 1=> SINGLE BIT ERROR SEEN CONSEL = BIT9 ;& IIN = BIT11 ; INTERNAL INTERLEAVE OGMSK = PROG!777 ; BAS1 = EPT ; BAS2 = OGMSK!PROG ;6 INMSK = BIT12!BIT13!BIT14 ; EXTERNAL INTERLEAVE MASK$ PROPTR = BIT3 ; PROTECTION POINTER;&; OFFSETS INTO THE MK UCB PRIVATE DATA;A? U.KCTR = U.CNT+2 ; COUNTER OF KRBS SCANNED FOR THE CURRENT BOXN< U.STAD = U.CNT+4 ; POINTER TO STATUS WORD OF USER PARAMETER ; BUFFER; U.PWRV = U.CNT+6 ; POWER FAIL VECTOR FOR INTERNAL ROUTINES4: U.CSAV = U.CNT+10 ; START OF 8-WORD CSR SAVE AREA FOR CSR( ; CONTENTS OF ALL PORTS OF THIS BOX.;K;R; MISC. PARAMETERS; ' GRANUL = +10. ; GRANULARITY OF MEMORY!0 ; ONE UNIT OF BASE ADDRESS = 2**GRANUL BYTES GRASHF = 2000 ; 1**GRANUL;F; FUNCTION JUMP TABLER;TFCNLST:' .BYTE IO.ORG/400 ; SET/READ BOX ORIGINN' .BYTE IO.INT/400 ; SET/READ INTERLEAVE+, .BYTE IO.IIN/400 ; READ INTERNAL INTERLEAVE) .BYTE IO.PRG/400 ; SET/READ PROGRAMMABLEL% .BYTE IO.ERR/400 ; READ ERROR STATUS $ .BYTE IO.GRN/400 ; READ GRUNULARITY! .BYTE IO.SIZ/400 ; READ BOX SIZE * .BYTE IO.RSA/400 ; READ ERROR INFORMATION .BYTE IO.CST/400 ; ' .BYTE IO.MSK/400 ; SET DIAGONSTIC MASK .BYTE IO.CLM/400 ; CLEAR MEMORY .BYTE 0 ; TERMINATOR;A; SERVICE ROUTINE ADDRESSES ;L8FCNJMP: .WORD IOORG ; SERVICE ROUTINE ADDRESSES FOR THE% .WORD IOINT ; ABOVE FUNCTIONS CODES+ .WORD IOIIN ;0 .WORD IOPRG ;  .WORD IOERR ;E .WORD IOGRN ;/ .WORD IOSIZ ;L .WORD IORSA ;0 .WORD IOCST ;A .WORD IOMSK ;R .WORD IOCLM ;U;Y;.; ERROR CODE STORAGE BUFFERZ;;Y8ECOD1: .WORD 0 ; STATUS RETURN VALUES FOR I/O OPERATIONECOD2: .WORD 0 ;0; ;G; DEVICE DISPATCH TABLEL;0;  DDT$ MK,M$$K11,,,,T; ;M;TD; IN ADDITION TO THE NORMAL $GTPKT OPERATION, A CALL WILL BE MADE TO@; THE ROUTINE $CFORK. THIS ROUTINE WILL DETERMINE THE PROCESSOR>; THAT IS CURRENTLY EXECUTING THIS ROUTINE AND COMPARE IT WITH=; THE ONE INDICATED IN THE SCB AT S.URM. IF THEY ARE THE SAMECA; THEN A RETURN IS EXECUTED AND PROCESSING CONTINUES. IF THEY ARES?; DIFFERENT THEN $CFORK SAVES THE CONTEXT IN THE FORK BLOCK ANDRA; ENTERS THIS REQUEST INTO THE FORK QUE FOR THE PROPER PROCESSOR.AC; CONTROL IS RETURNED TO THE CALLERS CALLER WITH THE CARRY BIT SET.NB; IN THIS CASE CONTROL WILL RETURN TO THE DRIVER WHICH WILL RETURN; TO THE EXEC.;L;T.PAGET;P;E;R; DRIVER INITALIZE ENTRY POINT;S .ENABLE LSBMKINI: GTPKT$ MK,M$$K11,,,T ;E;B; REGISTER SUMMARY:E;E; R0 = UNDEFINED; R1 = ADDRESS OF I/O PACKET(; R2 = PHYICAL UNIT NUMBER ON CONTROLLERD; R3 = CONTROLLER INDEX IN LIST OF ALL SIMILAR CONTROLLERS IN SYSTEM; R4 =00V^^4^eaek ADDRESS OF SCBO; R5 = ADDRESS OF UCBA; ;T; ; I/O PACKET FORMAT:;S;L; I.LNK: I/O QUEUE THREAD WORDN; I.PRI: REQUEST PRIORITY; I.EFN: EVENT FLAG NUMBERE*; I.TCB: ADDRESS OF TCB OF REQUESTOR TASK9; I.LN2: ADRESS OF LUN2 WORD IN HEADER OF REQUESTOR TASK; I.UCB: ADDRESS OF UCB; I.FCN: I/O FUNCTION CODEM.; I.IOSB: VIRTUAL ADDRESS OF I/O STATUS BLOCK.; +2: RELOCATION BIAS OF I/O STATUS BLOCK>; +4: DISPLACEMENT OF I/O STATUS BLOCK (RELATIVE TO APR6)0; I.AST: VIRTUAL ADDRESS OF AST SERVICE ROUTINE-; I.PRM: RELOCATION BIAS OF FIRST I/O BUFFER&; +2: DISPLACMENT RELATIVE TO APR6; +4: BUFFER SIZE IN BYTES; ;N;L;N;E;;I;B; IN THE USER BUFFER.U;O;A5 CLR U.KCTR(R5) ; CLEAR THE PORT POINTER JUST IN CASER8 MOV U.BUF+2(R5),-(SP) ; SAVE THE PRESENT BUFFER ADDRESS6 MOV (SP),U.STAD(R5) ; SAVE THE INITIAL BUFFER ADDRESS; ADD #10,U.STAD(R5) ; AND ADD THE OFFSET TO THE STATUS WORDL@ MOV U.STAD(R5),U.BUF+2(R5) ; SET UP THE USER BUFFER STATUS WORD3 MOV #IS.SUC,-(SP) ; INDICATE SUCCESS TO START WITHB' MOV (SP),ECOD1 ; INITALIZE FOR SUCCESSA CLR ECOD2 ;T* CALL $PTWRD ; AND PUT IT INTO THE BUFFER3 MOV (SP)+,U.BUF+2(R5) ; RESTORE THE BUFFER ADDRESSO;A;C;U; THEN WE EXIT WITH AN ERROR.T;J; 8 MOV I.TCB(R1),R3 ; GET THE ADDRESS OF THE TASK CONTROL  ; BLOCK INTO R3.; BIT #T3.PRV,T.ST3(R3); TEST THE PRIVILEGE BIT OF THE THIRD5 ; STATUS WORD IN THE TCB) BEQ 3$ ; IF EQUAL THEN THE TASK IS NOT ' ; PRIVILEGED AND WE RETURN AN ERROR# CMP R3,$HRCPT ; WAS IT HRC... ? BEQ 5$ ; YES -- PROCEEDDA3$: MOV #IE.PRI&377,-(SP) ; ELSE WE MOVE THE ERROR ONTO THE STACK " JMP ERROR ; AND REPORT THE ERROR;)+; SELECT SERVICE ROUTINE FROM FUNCTION CODE ;N5$:T3 MOV #FCNLST,R0 ; POINT TO VECTOR OF FUNCTION CODES 6$:S8 CMPB I.FCN+1(R1),(R0) ; IS THIS THE REQUESTED FUNCTION? BEQ 7$ ; BR IF YES/ TSTB (R0)+ ; HAVE WE SEEN THE TERMINATOR YET?E BNE 6$ ; BR IF NOT2 MOV #IE.IFC&377,-(SP) ; SET ILLEGAL FUNCTION CODE JMP ERROR ; TAKE ERROR RETURNW7$: 0 SUB #FCNLST,R0 ; OBTAIN OFFSET IN FUNCTION LIST! ASL R0 ; CONVERT TO WORD OFFSETR= MOV FCNJMP(R0),U.PWRV(R5) ; SAVE THE FUNCTION ROUTINE IN THE  ; POWERFAIL RECOVERY BUFFERI, JMP @FCNJMP(R0) ; AND GO TO SERVICE ROUTINE;C.PAGEF; STARTING ADDRESS OF BOX:;CA; IF MS.SET BIT IS SET THIS FUNCTION WILL CHANGE ALL OF THE PORTSS@; ON THIS BOX TO THE STARTING ADDRESS SUPPLIED IN THE FIRST WORDD; OF THE USER BUFFER. IF ANY OF THE PORTS ARE IN THE 'FORCED PANEL'B; MODE SO THAT THEY CANNOT BE PROGRAMMED THE ERROR CODE IE.WLK&377D; IS RETURNED IN THE IOSB AND NO FURTHER ATTEMPT IS MADE TO CONTINUE@; PROGRAMMING THE REST OF THE PORTS. IF ANY PORT FAILS TO ACCEPTA; THE STARTING ADDRESS BUT INDICATES THAT IT IS PROGRAMMABLE, THEPG; ERROR CODE IE.FHE&377 IS RETURNED IN THE IOSB AND NO FURTHER ATTEMPT N9; IS MADE TO CONTINUE PROGRAMMING THE STARTING ADDRESSES.N;DG; IF MS.SET IS NOT SET THIS FUNCTION WILL REPORT THE STARTING ADDRESSESR@; OF ALL OF THE PORTS ON THIS BOX IN THE FIRST FOUR WORDS OF THE; USER BUFFER.; :; STATUS IS RETURNED IN THE FIFTH WORD OF THE USER BUFFER.; ;EIOORG:11$:' CALL ROUND ; SET UP ON EACH PROCESSORN12$:" TST U.KCTR(R5) ; ARE WE THRU YET? BEQ 19$ ; IF EQUAL THEN WE ARE9 CALL RESET ; RESET THE REGISTERS AFTER RETURN FROM FORKI. BITB #MS.SET,I.FCN(R1) ; IS IT A SET FUNCTION$ BEQ 16$ ; GIVE HIM THE INFORMATION' CALL $GTWRD ; GET THE ADDRESS DESIREDW= SUB #2,U.BUF+2(R5) ; RESET THE BUFFER ADDRESS SO THAT WE CANI+ ; GET THE SAME PARAMETER THE NEXT TIME.B MOV (SP)+,R0 ; INTO R0E, BIC #^C777,R0 ; RESET ALL BUT ADDRESS FIELD+ BIS #PROG,R0 ; MASK IN THE PROGRAMABLE BITN; MOV CSR2(R4),R3 ; GET THE PRESENT STATE OF THE CSR INTO R3B4 BIC #OGMSK,R3 ; CLEAR OUT THE STARTING ADDRESS BITS6 BIS R0,R3 ; PUT THE DESIRED STARTING ADDRESS INTO R3/ MOV R3,CSR2(R4) ; PUT THE RESULTS INTO THE CSRH" BIT #PROG,CSR2(R4) ; DID IT TAKE?! BNE 13$ ; IF NOT EQUAL THEN YES,; MOV #IE.WLK&377,-(SP) ; PUSH THE ERROR CODE O00V^^U^DATADATADATADATADATADATADATANTO THE STACK : CALL STATUS ; REPORT THE PRESENT OF A WRITE LOCKED PORT, ; TO THE USER IN THE BUFFER STATUS WORD. BR 11$ ; AND GO AROUND AGAIN13$:4 CMPB R0,CSR2(R4) ; IS THE CORRECT ADDRESS ASSERTED? BEQ 11$ ; IF EQUAL THEN YESS< MOV #IE.FHE&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK JMP ERROR ; REPORT THE ERROR16$:0 MOV CSR2(R4),-(SP) ; GET THE ADDRESS INTO -(SP). BIC #^C777,(SP) ; RESET ALL BUT ADDRESS FIELD. CALL GTURM ; GET THE UNIBUS RUN MASK INTO R3( ASH #4,R3 ; SHIFT MASK TO UPPER 4 BITS2 BIS R3,(SP) ; THEN SET IT INTO THE RETURN TO THE ; BUFFER.E0 CALL $PTWRD ; PUT THE RESULTS INTO THE BUFFER" BR 11$ ; AND GO GET THE NEXT ONE19$: JMP SUC ; FINISH UPA;R;?;B; EXTERNAL INTERLEAVINGE;;VIOINT:21$:' CALL ROUND ; SET UP ON EACH PROCESSORK22$:" TST U.KCTR(R5) ; ARE WE THRU YET? BEQ 29$ ; IF EQUAL THEN WE ARE9 CALL RESET ; RESET THE REGISTERS AFTER RETURN FROM FORKD. BITB #MS.SET,I.FCN(R1) ; IS IT A SET FUNCTION BEQ 26$ ; GIVE THE INFORMATION: CALL $GTWRD ; GET THE DESIRED INTERLEAVING FUNCTION CODE" MOV (SP)+,R0 ; AND GET IT INTO R0" BIT #370,R0 ; IS IT A GOOD CODE? BEQ 23$ ; IF EQUAL THE YES< MOV #IE.BAD&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK JMP ERROR ; REPORT THE ERROR23$:@ SUB #2,U.BUF+2(R5) ; RESET THE BUFFER ADDRESS TO THE FIRST WORD/ ; SO THAT WE CAN GET THE FACTOR ON THE NEXTE ; PASS( ASL R0 ; GET THE INTERLEAVING FUNCTION$ ASL R0 ; INTO THE RIGHT POSISTION# ASL R0 ; FOR ASSERTION ON THE CSRI ASL R0L SWAB R0, BIS #PROG,R0 ; MASK IN THE PROGRAMMABLE BIT; MOV CSR2(R4),R3 ; GET THE PRESENT STATE OF THE CSR INTO R3O9 BIC #INMSK,R3 ; CLEAR OUT THE INTERNAL INTERLEAVING BITSS* BIS R0,R3 ; SET THE INTERLEAVING FACTOR/ MOV R3,CSR2(R4) ; PUT THE RESULTS INTO THE CSR+" BIT #PROG,CSR2(R4) ; DID IT TAKE?, BNE 24$ ; IF EQUAL THEN IT IS PROGRAMMABLE< MOV #IE.WLK&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK6 CALL STATUS ; REPORT THE EXISTANCE OF A WRITE LOCKED) ; PORT IN THE USER BUFFER STATUS WORDS BR 21$ ; AND GO AGAINA24$:4 CMPB R3,CSR2(R4) ; IS THE CORRECT ADDRESS ASSERTED? BEQ 21$ ; IF EQUAL THEN YESB26$:7 MOV CSR2(R4),-(SP) ; GET THE CSR WORD 2 ONTO THE STACK 2 BIC #107777,(SP) ; CLEAR OUT THE REST OF THE WORD/ SWAB (SP) ; GET THE CODE INTO A READABLE FORMR ASR (SP) ASR (SP)B ASR (SP)F ASR (SP) . CALL GTURM ; GET THE UNIBUS RUN MASK INTO R30 BIS R3,(SP) ; SET IT INTO THE HIGH BYTE OF THE ; RETURNED WORDO& CALL $PTWRD ; BUT IT INTO THE BUFFER# BR 21$ ; GO TO THE NEXT PROCESSORG29$: JMP SUC ; FINISH UP(;S;E; INTERNAL INTERLEAVING?;B;2IOIIN:31$:' CALL ROUND ; SET UP ON EACH PROCESSORE32$:" TST U.KCTR(R5) ; ARE WE THRU YET? BEQ 39$ ; IF EQUAL THEN WE ARE9 CALL RESET ; RESET THE REGISTERS AFTER RETURN FROM FORK5 BITB #MS.SET!MS.CLR,I.FCN(R1) ; IS IT A SET FUNCTIONT BEQ 36$ ; IF EQUAL THEN NO; MOV CSR2(R4),R0 ; GET THE PRESENT CONTENTS OF THE CSR INTO  ; R0' BITB #MS.CLR,I.FCN(R1); IS IT A CLEAR?  BEQ 34$ ; IF EQUAL THEN NO3 BIC #IIN,R0 ; CLEAR THE INTERNAL INTERLEAVING BIT- MOV R0,CSR2(R4) ; MOV THE IMAGE INTO THE CSR1! BIT #IIN,CSR2(R4) ; DID IT WORK?R' BEQ 31$ ; IF EQUAL THEN YES IT WORKEDT33$:< MOV #IE.FHE&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK JMP ERROR ; REPORT THE ERROR34$:1 BIS #IIN,R0 ; SET THE INTERNAL INTERLEAVING BITT* MOV R0,CSR2(R4) ; TRY TO PROGRAM THE PORT BIT #IIN,CSR2(R4) ; IS IT SET?F. BNE 31$ ; IF NOT EQUAL THEN YES AND GO AGAIN35$:< MOV #IE.WLK&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK5 CALL STATUS ; INDICATE THAT ONE OF THE PORTS CANNOTM ; BE INTERLEAVED BR 31$ ; AND GO AGAIN;36$: BIT #IIN,CSR2(R4) ; IS IT SET% BEQ 38$ ; IF EQUAL THEN IT IS CLEAR3 MOV #1,-(SP) ; INDICATE SET37$:/ CALL GTURM ; GET THE UNIBUS RUN MASK INTO R3 BIS R3,(SP) ; REPORT ITE' CALL $PTWRD ; PUT IT INTO THE BUFFER;# BR 31$ ; GO TO THE NEXT PROCESSORS38$: MOV #0,-(SP) ; SHOW CLEARED BR 37$ ; GO AGAINN39$: JMP SUC ; FINISH U00V^^4^eaekPK;7;S; MANUAL-PROGRAMMABLE MODE;T;SIOPRG:41$:' CALL ROUND ; SET UP ON EACH PROCESSORN42$:" TST U.KCTR(R5) ; ARE WE THRU YET? BEQ 49$ ; IF EQUAL THEN WE ARE9 CALL RESET ; RESET THE REGISTERS AFTER RETURN FROM FORKV5 BITB #MS.SET!MS.CLR,I.FCN(R1) ; IS IT A SET FUNCTION  BEQ 46$ ; IF EQUAL NO. BITB #MS.CLR,I.FCN(R1); IS IT A CLEAR COMMAND! BNE 43$ ; IF NOT EQUAL THEN YES 2 BIS #PROG,CSR2(R4) ; SET THE BANK TO PROGRAMMABLE BIT #PROG,CSR2(R4) ; IS IT SET:! BNE 41$ ; IF NOT EQUAL THEN YES < MOV #IE.WLK&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK1 CALL STATUS ; INDICATE THAT ONE OF THE PORTS IS  ; FORCED TO THE PANEL. BR 41$ ; AND GO AGAINC43$:, BIC #PROG,CSR2(R4) ; SET THE BANK TO MANUAL# BIT #PROG,CSR2(R4) ; IS IT CLEARED;' BEQ 41$ ; IF EQUAL THEN IT IS CLEAREDU< MOV #IE.FHE&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK JMP ERROR ; REPORT THE ERROR46$:# MOV #1,-(SP) ; ASSUME PROGRAMMABLEM BIT #PROG,CSR2(R4) ; IS IT SET?0 BNE 48$ ; IF NOT EQUAL THEN IT IS PROGRAMMABLE3 MOV CSR2(R4),R2 ; GET THE IMAGE OF THE CSR INTO R2+ BIS #PROG,R2 ; SET THE PROGRAMMABILITY BITS* MOV R2,CSR2(R4) ; MOVE IT BACK TO THE CSR0 BIT #PROG,CSR2(R4) ; IS IT FORCED TO THE PANEL?6 BEQ 47$ ; IF EQUAL THEN IT IS NOT AND WE REPORT THIS ; PORT AS NOT PROGRAMMABLE.L/ BIC #PROG,CSR2(R4) ; PUT IT BAC THE WAY IT WASC( BR 48$ ; AND REPORT IT AS PROGRAMMABLE47$:4 CLR (SP) ; ELSE INDICATE FORCED TO THE FRONT PANEL48$:4 CALL GTURM ; GET THE UNIBUS RUN MASK INTO THE HIGH ; BYTE OF R3+ BIS R3,(SP) ; SET IT INTO THE RETURN WORDN/ CALL $PTWRD ; PUT THE RESULTS INTO THE PACKETI# BR 41$ ; GO TO THE NEXT PROCESSORO49$: JMP SUC ; FINISH UP ;S; !; ERROR CORRECTION ENABLE-DISABLEF;U;TIOERR:. CALL GTONE ; GET ONTO THE DESIRED PROCESSOR52$:9 CALL RESET ; RESET THE REGISTERS AFTER RETURN FROM FORK 5 BITB #MS.SET!MS.CLR,I.FCN(R1); IS IT A SET FUNCTION?;/ BEQ 55$ ; IF NOT EQUAL THEN REPORT THE STATUSC2 BITB #MS.CLR,I.FCN(R1) ; IS IT A DISABLE REQUEST?! BNE 53$ ; IF NOT EQUAL THEN YESE' BIC #ECC,(R4) ; ELSE CLEAR THE ECC BIT  BIT #ECC,(R4) ; IS IT CLEAR?E% BEQ 59$ ; IF EQUAL THEN IT IS CLEARO< MOV #IE.FHE&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK JMP ERROR ; REPORT THE ERROR53$: BIS #ECC,(R4) ; SET THE ECC BIT BIT #ECC,(R4) ; IS IT SET?S' BNE 59$ ; IF NOT EQUAL THEN IT IS SET< MOV #IE.FHE&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK JMP ERROR ; REPORT THE ERROR55$: MOV #0,-(SP) ; ASSUME DISABLEDS BIT #ECC,(R4) ; IS IT ENABLED? , BNE 56$ ; IF NOT EQUAL THEN IT IS DISABLED" INC (SP) ; ELSE INDICATE ENABLED56$: CALL $PTWRD ; REPORT SAMEU59$: JMP SUC ; FINISH UPE;E;7; GRANULARITY CHECKR;C; IOGRN:5 MOV #GRASHF,-(SP) ; SET THE GRANULARITY AT 64K BYTES,& CALL $PTWRD ; PUT IT INTO THE BUFFER JMP SUC2 ; GO HOME; ;N; BOX SIZE CHECK;E;IOSIZ:- CALL GTONE ; GET ONTO THE DESIRED PROCESSORS72$:9 CALL RESET ; RESET THE REGISTERS AFTER RETURN FROM FORKE% MOV #SIZ,(R4) ; REQUEST THE BOX SIZEL3 MOV (R4),-(SP) ; GET THE SIZE ONTO THE STACK FOR AI ; CALL TO $PTWRD( BIC #100377,(SP) ; CLEAN UP THE GARBAGE$ SWAB (SP) ; SET SIZE INTO LOW BYTE& CALL $PTWRD ; OUT IT INTO THE BUFFER JMP SUC ; GO HOME ;S;T$; GET PARAMETERS ON SINGLE BIT ERROR;D; IORSA:- CALL GTONE ; GET ONTO THE DESIRED PROCESSOR 82$:9 CALL RESET ; RESET THE REGISTERS AFTER RETURN FROM FORKE5 BIT #SEIND,(R4) ; IS THE SINGLE BIT ERROR INDICATED?A! BNE 83$ ; IF NOT EQUAL THEN YESR< MOV #IE.IDS&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK JMP ERROR ; REPORT THE ERROR83$:7 MOV (R4),-(SP) ; PUSH THE ARRAY ADDRESS ONTO THE STACK 3 MOV CSR2(R4),R0 ; GET THE STARTING ADDRESS INTO R0 ( ASRB (SP) ; GET THE ARRAY ADDRESS INTO% ASRB (SP) ; THE FORM OF X TIMES 32KD ASRB (SP) ; AND THEN WE WILL+ ASRB (SP) ; CORRECT FOR WHICH SIDE OF THEE BIT #CONSEL,R0 ; OF THE BOX.R1 BEQ 84$ ; IF EQUAL THEN IT IS ON THE RIGHT SIDEB" ; AND WE HAVE THE RIGHT NUMBER7 ADD #1,(SP) ; ELSE WE AR00V^^U^DATADATADATADATADATADATADATAE ON THE ODD SIDE AND WE MUSTE ; ADD ONE TO CORRECT.J84$:7 ADD R0,(SP) ; ADD THE STARTING ADDRESS TO THE RESULTSA/ SWAB (SP) ; NOW WE GET INTO A 32. WORD FACTORG$ BIC #377,(SP) ; WITHOUT THE GARBAGE ASL (SP)E ASL (SP) - MOV (SP),R0 ; AND WE SAVE THE RESULTS IN R0 < CALL $PTWRD ; THEN WE PUT THE LOWER END OF THE RANGE INTO- ; INTO THE FIRST OUTPUT WORD OF THE ARRAYB4 ADD #GRASHF,R0 ; ADD THE GRANULARITY TO THE RESULTS# MOV R0,-(SP) ; AND PUT THE RESULTSR9 CALL $PTWRD ; INTO THE SECOND WORD OF THE BUFFER AS THE ; UPPER LIMIT OF THE RANGE JMP SUC ; AND GO HOME ;R;G; SYSTEM STATUS FUNCTION;A;SIOCST:91$:' CALL GTKRB ; GET THE NEXT KRB INTO R3)0 BEQ 93$ ; IF EQUAL THEN THIS IS THE END OF THE) ; KRB TABLE AND WE ARE THRU WITH THIS  ; PART OF THE FUNCTION.T= MOVB K.URM(R3),-(SP) ; PUT THE UNIBUS RUN MAP ONTO THE STACKO0 BIT K.URM(R3),$URMST ; IS THE PROCESSOR ONLINE?5 BEQ 92$ ; IF EQUAL THEN IT IS OFFLINE AND WE DO NOTT ; SET THE SIGN BIT.T6 BISB #200,(SP) ; ESLE IT IS ONLINE AND WE SO INDICATE92$:+ CALL $PTBYT ; PUT IT IN THE OUTPUT BUFFERY' ADD #2,U.KCTR(R5) ; UPDATE THE COUNTER: BR 91$ ; AND GO AGAINN93$:* CLR U.KCTR(R5) ; CLEAR THE OFFSET COUNTER> MOV U.STAD(R5),U.BUF+2(R5) ; SET THE BUFFER TO THE FIFTH WORD? SUB #4,U.BUF+2(R5) ; AND SUBTRACT FOUR SO THAT WE POINT TO THES ; THIRD WORD.T94$:0 MOV U.DCB(R5),R3 ; GET THE DCB ADDRESS INTO R3@ MOV D.MSK(R3),-(SP) ; GET THE FIRST FUNCTION MASK WORD ONTO THE ; STACKT& CALL $PTWRD ; PUT IT INTO THE BUFFER; MOV D.MSK+10(R3),-(SP) ; GET THE SECOND FUNCTION MASK WORDB ; ONTO THE STACK' CALL $PTWRD ; PUT IT INTO THE BUFFERD JMP SUC ; GO HOMER;K;(; ; DIAGNOSTIC MASK FUNCTION;V;S;(IOMSK:- CALL GTONE ; GET ONTO THE DESIRED PROCESSORB) CALL RESET ; AND GET THE REGISTERS BACK 0 BITB #MS.SET,I.FCN(R1) ; IS THIS A SET FUNCTION, BEQ 102$ ; IF EQUAL THEN IT IS A READ ONLY ; FUNCTION5 CALL $GTWRD ; ELSE WE GET THE #2 WORD OF THE BUFFERT* MOV (SP)+,(R4) ; AND MOVE IT INTO THE CSR4 CALL $GTWRD ; AND WE GET THE #3 WORD OF THE BUFFER. MOV (SP)+,CSR2(R4) ; AND MOVE IT INTO THE CSR102$: : MOV (R4),-(SP) ; PUSH THE FIRST WORD OF THE CSR ONTO THE ; STACKC* CALL $PTWRD ; AND PUT IT INTO THE BUFFER. MOV CSR2(R4),-(SP) ; AND THEN THE SECOND WORD CALL $PTWRD ; INTO THE BUFFERM! JMP SUC ; THEN EXIT WITH STATUSC/ JMP SNAP ; AND END WITH THE SNAPSHOT ROUTINE.Y; ; CLEAR MEMORY BOX; IOCLM:6 CALL GTONE ; MOVE OURSELVES TO THE CLOSEST PROCESSOR CALL RESET ; SETUP REGISTERS;N=; R4 = CSR ADDRESS FOR THE PORT ACCESSING THE TARGET BOX FROMO; 'THIS' PROCESSOR;$ MOV R5,-(SP) ; SAVE UCB ADDRESS* MOV (R4),-(SP) ; SAVE STARTING CSR1 VALUE' MOV CSR2(R4),R3 ; PICK UP BASE ADDRESSM( BIT #PROG,R3 ; IS THE BOX PROGRAMMABLE? BEQ 118$ ; BR IF NOT% BIC #^C777,R3 ; ISOLATE BASE ADDRESSS* CMP #77,R3 ; IS THE BOX SET AT INFINITY?' BLOS 120$ ; BR IF YES, NOT ACCESSABLE= ASH #GRANUL,R3 ; CONVERT TO UNITS OF 32WORDS FROM 32K WORDS.S! MOV #SIZ,(R4) ; ASK FOR BOX SIZE MOV (R4),R5 ; PICK UP SIZE$ BIC #100377,R5 ; ISOLATE SIZE FIELD- ASL R5 ; CONVERT TO COUNT OF 32 WORD BLOCKSU4 BEQ 118$ ; BR IF SIZE=0 (A MEMORY ERROR CONDITION);M ; NOW CLEAR ALL CELLS IN THE BOX;M CLR R2 ; SOURCE DATA- MOV #ECC,(R4) ; SET BOX TO IGNORE ECC ERRORSC112$:,! MOV R3,-(SP) ; SAVE BASE ADDRESS7% MOV R5,-(SP) ; AND SAVE THE BOX SIZEO114$: 5 MOV R3,KISAR6 ; MAP VIA APR6 TO THE NEXT 32WORD UNITR- MOV #140000,R1 ; POINT TO THE BLOCK TO CLEAR# .REPT 32.4 MOV R2,(R1)+ ; USE A VECTOR OF MOVE INSTRUCTIONS TO .ENDR ; CLEAR MEMORYE! INC R3 ; BUMP THE BLOCK POINTER . SOB R5,114$ ; LOOP FOR ALL BLOCKS IN THE BOX MOV (SP)+,R5 ; RESTORE SIZE( MOV (SP)+,R3 ; AND RESTORE BASE ADDRESS+ BIT #PROPTR,(R4) ; IS THIS THE SECOND PASSO! BNE 116$ ; BR IF YES, WERE DONEP? MOV #PROPTR ! ECC,(R4) ; TOGGLE THE PROTECTION POINTER FOR THE$ ; SECOND PASS; BR 112$ ; AND CLEAR IT AGAIN116$: MOV (SP)+,(R4) ; 00V^^4^eaekRESTORE CSR1 MOV (SP)+,R5 ; RESTORE UCB JMP SUC2 ; WERE DONE!T118$:O MOV (SP)+,(R4) ; RESTORE CSR1 MOV (SP)+,R5 ; RESTORE UCBM( MOV #IE.BAD&377,-(SP) ; PARAMETER ERROR JMP ERROR ; 120$:B MOV (SP)+,(R4) ; RESTORE CSR1 MOV (SP)+,R5 ; RESTORE UCBR. MOV #IE.OFL&377,-(SP) ; MEMORY NOT ACCESSABLE JMP ERROR ; .DSABLE LSB;S&; INTERRUPT ENTRY POINT LABEL FOR LOAD-; MEMORY ERRORS ARE SERVICED BY THE EXECUTIVE ;O$MKINT::- RETURN ; THIS IS THE INTERRUPT ENTRY POINTP ; THAT WILL NEVER BE USEDP.PAGE ;T; ;;J&; UTILITY SUBROUTINES AND ENTRY POINTS;(; ;E;R;S; SUBROUTINE ROUND;T?; THIS ROUTINE IS USED TO STEP THRU ALL OF THE PORTS ASSOCIATED 0; WITH THE BOX OF MEMORY CURRENTLY BE ACCESSED. ;; THE CURRENT OFFSET INTO THE KTB IS RETAINED IN THE UCB ATE:; U.KCTR. THIS POSITION IS CLEARED WHEN ALL KRBS HAVE BEEN ; DELT WITH.;O;O ; INPUTS:Y;R=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDH ; OUTPUTS:5; THE CARRY BIT INDICATES IF THE DRIVER IS EXECUTINGP4; ON THE PROPER PROCESSOR. IF THE BIT IS CLEAR THEN3; THE PROPER PROCESSOR HAS CONTROL AND THE ROUTINE -; MAY CONTINUE EXECUTION. IF THE BIT IS SETR7; THEN THE CALLER MUST DISMISS HIMSELF AND RETURN FROME*; THE FORK LEVEL ON THE PROPER PROCESSOR.;T;EROUND: U/ MOV U.SCB(R5),R4 ; GET THE SCB ADDRESS INTO R4L' CALL GTKRB ; GET THE NEXT KRB INTO R3 A MOV R3,S.KRB(R4) ; MOVE THE TABLE ENTRY INTO THE KRB WORD IN THEA ; SCB 3 BEQ 5$ ; IF EQUAL THEN THE ENTRY IN THE KRB TABLE . ; IS THE ZERO WORD AT THE END OF THE TABLE* ; SO WE ARE FINISHED AND MUST CLEAN UP- ; THE COUNTER AND INDICATE SUCCESS TO THEC ; CALLER4 ADD #2,U.KCTR(R5) ; ELSE WE MUST UPDATE THE COUNTER< MOV K.URM(R3),S.URM(R4) ; MOVE THE UNIBUS RUN MASK FOR THIS0 BIT K.URM(R3),$URMST ; IS THE PROCESSOR ONLINE?0 BEQ ROUND ; IF EQUAL THEN IT IS OFFLINE AND WE ; SKIP THIS PORT6 BIT #KS.OFL,K.STS(R3) ; ELSE IS THE CONTROLER ONLINE?5 BEQ 2$ ; IF EQUAL THEN IT IS ONLINE AND WE CONTINUER- TST (SP)+ ; ELSE WE HAVE A BAD SITUATION SOT# ; WE THROW AWAY THE DRIVER CALLD1 MOV #IE.OFL&377,-(SP) ; SET UP THE OFFLINE ERRORE! BR ERROR ; AND REPORT THE ERROR.2$:R( MOV (SP)+,R4 ; SAVE THE CALLER INTO R4 2 CALL $CFORK ; CALL THE CONDITIONAL FORK ROUTINE.2 ; IF WE ARE EXECUTING ON THE CORRECT PROCESSOR+ ; THEN WE WILL RETURN HERE AND CONTINUE / ; IF NOT THEN WE WILL RETURN TO THE CALLERSR/ ; CALLER AFTER WE ARE ENTERED INTO THE FORK 3 ; QUEUE. WHEN WE ARE DEQUEUED WE SHALL CONTINUE  ; FROM HERE.....MAYBEI1 MOV R4,-(SP) ; RESTORE THE CALLER ONTO THE STACK# RETURN ; AND RETURN TO HIM.5$: 4 CLR U.KCTR(R5) ; CLEAR THE COUNTER TO INDICATE THAT* ; WE HAVE COMPLETED THE CIRCUIT OF THE ; PORTS.$ RETURN ; AND RETURN TO THE CALLER;W; SUBROUTINE RESET;C>; THIS ROUTINE RESETS R4 AND R1 AFTER A RETURN FROM FORK LEVELA; USING THE UCB ADDRESS IN R5 TO LINK WITH THE CSR ADDRESS IN THER!; KRB AND THE I/O PACKET ADDRESS. ;U ; INPUTS:E;E=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDR;( ; OUTPUTS:; R1=ADDRESS OF THE I/O PACKETT; R4=ADDRESS OF THE CSR;$;-RESET: MOV U.SCB(R5),R4 ; GET THE SCB ADDRESS 2 MOV S.PKT(R4),R1 ; GET THE PACKET ADDRESS INTO R1/ MOV S.KRB(R4),R4 ; GET THE KRB ADDRESS INTO R4# MOV (R4),R4 ; AND THE CSR INTO R4U RETURN ; RETURN TO CALLER;U;F; ; SUBROUTINE ERROR; =; THIS ROUTINE IS THE COMMON ERROR REPORTING PROCESS FOR THISN=; DRIVER. THE COMMUNICATION WITH THE CALLER IS THRU THE IOSB.F<; AFTER THE ERROR PARAMETERS ARE SET UP IN R0 AND R1 CONTROLB; IS PASSED TO THE ROUTINE 'SNAP' WHICH LOGS THE PRESENT CONDITION9; OF THE PORTS IN THE DEVICE DEPENDENT BUFFER IN THE UCB.T;; THAT ROUTINE CALLS $IODON AND JUMPS TO THE INITIALIZATION ; ENTRY POINT FOR MORE WORK.;V;4 ; INPUTS: ; ; (SP)=ERROR CODE; R4=CSR ADDRESSL;=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDN;R;R ; OUTPUTS:;S;R; R0=ERROR CODE; 9; R1=PORT NUMBER IN HIGH BYTE AND00V^^U^DATADATADATADATADATADATADATA BOX NUMBER IN LOW BYTEH;R=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDT;R;I;'ERROR:* MOV (SP)+,R0 ; GET THE ERROR CODE INTO R0' MOV R0,ECOD1 ; SAVE THE CODE FOR IODONU. CMP #IE.IFC&377,R0 ; IS IT A BAD PARAMETER OR ; ILLEGAL FUNCTION?R2 BGE 3$ ; IF EQUAL OR GREATER YES AND WE WILL NOT ; REPORT A URM3 CMP #IE.PRI&377,R0 ; IS IT A PRIVILEDGE VIOLATION?N1 BEQ 3$ ; IF EQUAL THEN YES AND WE RETURN NO URMS6 CALL GTURM ; ELSE WE GET THE CURRENT UNIBUS RUN MASK3 MOV R3,R1 ; AND SET IT UP TO REPORT THRU THE IOSBT3$:BA MOVB U.UNIT(R5),ECOD2 ; GET THE UNIT NUMBER INTO THE LOW BYTE OFP ; R1 FOR THE $IODON CALL. = MOV U.STAD(R5),U.BUF+2(R5) ; GET THE BUFFER STATUS WORD INTOR ; BUFFER ADDRESS= MOV #IE.ABO&377,-(SP) ; PUT THE FUNCTION STATUS ON THE STACKR3 CALL $PTWRD ; PUT IT INTO THE BUFFER STATUS WORDI6 JMP SNAP ; NOW GO TO THE SNAPSHOT ROUTINE TO LOG THE! ; CURRENT STATUS OF THIS BOX.S;C; ;R;;; SUBROUTINE GTONE;T;I>; THIS ROUTINE CONTINUES PROCESSING ON THE PROCESSOR INDICATED;; IN THE USER BUFFER. IF THE PORT REQUESTED IS OUT OF RANGEH8; FOR THIS BOX THEN THE CALLER IS CLEARED FROM THE STACK4; AND THE ERROR IS REPORTED THRU THE ROUTINE 'ERROR'; ; INPUTS:D;S=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDR;C:; THE PORT DESIRED IN THE CURRENT WORD OF THE USER BUFFER;;;WGTONE:4 CALL $GTWRD ; GET THE DESIRED PORT FROM THE BUFFER4 CMP #-1,(SP) ; DID THE CALLER SPECIFY A 'WILD CARD' ; PORT NUMBER? BNE 1$ ; BR IF NOT/ MOV $CPBIT,(SP) ; IF SO SUBSTITUTE THE URM FORT ; THE CURRENT PROCESSORA1$:+ CALL GTPRT ; GT THE KRB OF THE PORT IN R4M& TST R4 ; IS IT THE END OF THE TABLE? BNE 2$ ; IF NOT EQUAL THEN NON4 TST (SP)+ ; ELSE WE HAVE AN ERROR CONDITION AND WE ; MUST THROW AWAY THE CALLERB MOV #IE.BAD&377,-(SP) ; AND INDICATE THAT WE HAVE A BAD PARAMETER BR ERROR ; AND REPORT SAME. 2$:F0 BIT K.URM(R4),$URMST ; IS THE PROCESSOR ONLINE?) BNE 4$ ; IF NOT EQUAL THEN IT IS ONLINEB3$: 5 TST (SP)+ ; ELSE WE HAVE AND ERROR CONDITION AND WER ; MUST THROW AWAY THE CALLER< MOV #IE.OFL&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK BR ERROR ; REPORT THE ERROR?4$:E, BIT #KS.OFL,K.STS(R4) ; IS THE PORT ONLINE?1 BNE 3$ ; IF NOT EQUAL THEN IT IS OFFLINE AND WER ; HAVE AN ERROR CONDITION./ MOV U.SCB(R5),R3 ; GET THE SCB ADDRESS INTO R3M4 MOV R4,S.KRB(R3) ; PUT THE KRB ADDRESS INTO THE SCB7 MOV K.URM(R4),S.URM(R3) ; PUT THE UNIBUS RUN MASK INTO ; THE SCBS% MOV (SP)+,R4 ; SAVE THE CALLER IN R4A, CALL $CFORK ; GET ON THE CORRECT PROCESSOR" MOV R4,-(SP) ; RESTORE THE CALLER RETURN ; AND CONTINUE; ;O;E;A;; SUBROUTINE GTPRT; ;O<; THIS ROUTINE RETURNS THE KRB ADDRESS THAT IS ON THE UNIBUSC; RUN MASK INDICATED BY THE CURRENT STACK WORD. IF THE MASK IS NOTD&; FOUND THEN A ZERO VALUE IS RETURNED.;R; ; INPUTS:M;R=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDS;M;); (SP)=THE UNIBUS RUN MASKT;; ; OUTPUT;M.; R4=ADDRESS OF THE KRB WITH THE DESIRED MASK; ;E;NGTPRT:' CALL GTKRB ; GET THE NEXT KRB INTO R3H% TST R3 ; IS IT THE END OF THE TABLE+ BEQ 3$ ; IF EQUAL THEN YES AND WE USE THE ( ; ZERO VALUE OF R3 TO INDICATE SAME.0 CMP 2(SP),K.URM(R3) ; IS THIS THE DESIRED PORT?0 BEQ 3$ ; IF EQUAL THEN IT IS AND WE RETURN THE ; VALUE.; ADD #2,U.KCTR(R5) ; ELSE WE BUMP THE OFFSET COUNTER TO THEB ; NEXT ADDRESS BR GTPRT ; AND GO AGAIN3$:P0 MOV R3,R4 ; GET IT INTO THE REPORTING REGISTER5 MOV (SP),2(SP) ; GET THE CALLER INTO THE SECOND SLOT TST (SP)+ ; CLEAN THE STACKN" CLR U.KCTR(R5) ; ZERO THE COUNTER RETURN ; AND GO BACKQ; ;I;Q; ;N; SUBROUTINE GTKRB; ; ?; THIS ROUTINE RETURNS THE ADDRESS OF THE KRB POINTED TO BY THES%; OFFEST COUNTER AT U.KCTR(R5) IN R3. ;N; ; INPUTS:E;N;E=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDU;R; 7; U.KCTR(R5)=OFFSET TO DESIRED KRB IN THE S.KTB TABLE.P;M;RGTKRB:+ MOV U.KCTR(R5),R3 ; GET00V^^4^eaek THE OFFSET INTO R3,* ADD U.SCB(R5),R3 ; ADD IN THE SCB ADDRESS3 MOV S.KTB(R3),R3 ; GET THE ADDRESS OF THE KRB INTOE ; R3 RETURN ; GO BACK ;B;Q; ;I;Q; ;N; ; SUBROUTINE STATUS;;H=; THIS ROUTINE WILL PUT THE SECOND WORD ON THE STACK INTO THE !; STATUS WORD OF THE USER BUFFER. ;N; ; INPUTS:E=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDA; 2(SP)=ERROR CODE;K;(;=STATUS: > MOV U.BUF+2(R5),-(SP) ; PUT THE CURRENT BUFFER ADDRESS ON THE ; STACKEC MOV U.STAD(R5),U.BUF+2(R5) ; MOVE THE STATUS WORD ADDRESS INTO THEK ; BUFFER SLOT 4 MOV 4(SP),-(SP) ; PUT THE ERROR CODE ONTO THE STACK2 CALL $PTWRD ; PUT THE ERROR CODE INTO THE BUFFER3 MOV (SP)+,U.BUF+2(R5) ; RESTORE THE BUFFER ADDRESS ( MOV (SP)+,(SP) ; AND CLEAN UP THE STACK RETURN ; GO BACK;;N; SUBROUTINE SUC; >; THIS ROUTINE HANDLES A SUCCESSFULL COMPLETION OF A FUNCTION.;E=; SUCCESS IS INDICATED IN THE IOSB AND THE BUFFER STATUS WORDT;F ; INPUTS: ;T=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSED ;D;DSUC:3 MOV #IS.SUC,ECOD1 ; SET UP SUCCESS IN FOR THE IOSBT$ CLR ECOD2 ; ZERO THE 2ND IOSB WORD;D; ; ; SUBROUTINE SNAP ; D; THIS ROUTINE IS USED TO GET A 'SNAPSHOT' OF THE MEMORY CSRS STORED@; IN WORDS U.CSAV TO U.CSAV+2. THESE WORDS ARE USED AFTER A REAL;; POWERFAIL TO RESET THE MEMORY TO IT'S PREVIOUS CONDITION.LA; THIS ROUTINE IS ENTERED FROM BOTH ERROR AND SUCCESS CONDITIONS.E;F; ; INPUTS:T;F5; R0= DATA FOR THE FIRST WORD OF THE I/O STATUS BLOCKC;E6; R1= DATA FOR THE SECOND WORD OF THE I/0 STATUS BLOCK=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDS;O;SNAP:2 CALL SNAP1 ; GET ALL OF THE CSRS COPIED INTO THE ; U.CSAV AREAOSUC2:E5 CLR U.PWRV(R5) ; CLEAR THE POWERFAIL RECOVERY VECTORW MOV ECOD1,R0 ; FIRST IOSB WORDE MOV ECOD2,R1 ; SECOND IOSB WORD% CALL $IODON ; CLEAN UP THE FUNCTION # MOV U.SCB(R5),R0 ; GET SCB ADDRESSO" CLR S.KRB(R0) ; CLEAR KRB ADDRESS- CLR S.URM(R0) ; AND REQUIRED UNIBUS RUN MASK $ JMP MKINI ; GO GET THE NEXT PACKET;D; ; ; ; SUBROUTINE SNAP1;R; ;; THIS ROUTINE IS USED TO GET AN IMAGE OF THE CSRS THAT AREP<; CURRENTLY ONLINE INTO THE IMAGE STORAGE BUFFER THAT STARTS; AT U.CSAV IN THE UCB.R;P;( ; INPUTS: ; ;E=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDE;2; ; OUTPUT:S;O;&; CSR IMAGES ARE IN THE STORAGE BUFFER;V;S;R;R .ENABLE LSB5$:C) ADD #2,U.KCTR(R5) ; ADVANCE TO NEXT PORTMSNAP1:& CALL GTKRB ; GET A KRB ADDRESS IN R3 BEQ 10$+ BIT K.URM(R3),$URMST ; IS THIS CPU ONLINE?S# BEQ 5$ ; BR IF NOT. TRY NEXT PORTT* MOV U.SCB(R5),R4 ; ENSURE WE HAVE THE SCB MOV R3,S.KRB(R4) ; SET THE SCB : MOV K.URM(R3),S.URM(R4) ; SET THE MASK FOR THE CONTROLLER, MOV (SP)+,R4 ; GET RETURN ADDRESS TO CALLER! CALL $IFORK ; GO TO A PROCESSOR- MOV R4,-(SP) ; SAVE RETURN ADDRESS TO CALLER ( CALL GTKRB ; AND REFRESH THE REGISTERS/ MOV (R3),R3 ; OBTAIN CSR ADDRESS. SINCE "ALL"T$ ; ACCESSABLE REGISTERS HAVE BEEN& ; SET THE SAME BY OUR CALLER, PCIK$ ; ANY KRB TO GET THE CSR ADDRES.? MOV CSR1(R3),U.CSAV(R5) ; SAVE THE MEMORY CONTROLLER REGISTERS 0 MOV CSR2(R3),U.CSAV+2(R5) ; AGAINS A POWER FAIL% CLR U.KCTR(R5) ; CLEAN UP FROM GTKRB 10$: RETURN ;V .DSABLE LSB;U;A;E;T;A; SUBROUTINE GTURM;O7; THIS ROUTINE PUTS THE UNIBUS RUN MASK FOR THE CURRENTC ; PORT INTO THE HIGH BYTE OF R3.;E;G ; INPUTS:V;3; R4=KRB ADDRESSA;E; ; OUTPUT:T; +; R3=UNIBUS RUN MASK FOR PORT IN HIGH BYTE ; ;EGTURM: MOV U.SCB(R5),R4  MOV S.KRB(R4),R4C= MOV K.URM(R4),R3 ; GET THE UNIBUS RUN MASK INTO THE LOW BYTEL, SWAB R3 ; MOVE THE MASK INTO THE HIGH BYTE RETURNO; ;L.PAGER;K;(; MKPWF:MKOUT:MKCAN:1 RETURN ; THESE TWO POINTS SHOULD NEVER BE USED& ; ON THIS DRIVER BUT JUST IN CASE.;P7; THESE ARE THE ENTRY POINTS FOR THE ONLINE AND OFFLINE ; STATUS CHANGES.E;G; .ENABLE LSB;=MKKRB:! BCS 30$ ; BR IF OFFLINE REQUEST=" ; 00V^W^X^DATADATADATADATADATADATADATAOFFLINE IS CONSIDERED ALWAYS! ; SUCCESSFUL. *** CAUTION ***R% ; THIS ASSUMPTION IS MADE SO THATR" ; A UNIT CAN GO OFFLINE WHEN A& ; CPU GOES OFFLINE. HRC MUST CHECK& ; TO INSURE THAT OFFL COMMANDS MAY" ; NEVER GET HERE WITH THE BOX  ; MEMORY ON-LINE.W;N; CONTROLLER ONLINE SERVICE ;N& MOV K.OWN(R2),R1 ; PICK UP OWNING UCB BEQ 25$ ; BR IF NONE) MOVB U.UNIT(R1),R1 ; GET BOX UNIT NUMBERE ASL R1 ; CONVERT TO WORD INDEX= CMP #160000,$MKCSR(R1) ; IS THE EXECUTIVE TABLE ENTRY DUMMY?E% BLO 30$ ; NO, SKIP CSR MODIFICATION ' MOV K.CSR(R2),R1 ; PICK UP CSR ADDRESSR& MOV #BAS1,(R1) ; MOVE BOX TO INFINITY. MOV #BAS2,CSR2(R1) ; LOAD ADDRESS AND CONTROL BR 30$ ; RETURN TO EXECUTIVE;E; UNIT ONLINE/OFFLINE SERVICE ;OMKUCB:& BCC 30$ ; NOP IF UNIT ONLINE REQUEST; UNIT OFFLINE SERVICE;U MOV R5,R1 ; COPY UCB ADDRESS BR 15$ ; TO COMMON CODE 10$: MOV K.OWN(R2),R1 ; GET UCBN BEQ 25$ ; BR IF NO UCB15$:( MOVB U.UNIT(R1),R1 ; PICK UP BOX NUMBER! ASL R1 ; CONVERT TO WORD OFFSETR/ CMP #160000,$MKCSR(R1) ; IS BOX ADDRESS DUMMY?D* BHI 30$ ; BR IF YES, OFFLINE MAY PROCEED25$:9 MOVB #IE.ONL,$SCERR ; OTHERWISE MARK STATUS CHANGE ERRORR30$: RETURN ; TO EXEC .DSABLE LSB .ENDCE ;OMKUCB:& BCC 30$ ; NOP IF UNIT ONLINE REQUEST; UNIT OFFLINE SERVICE;U MOV R5,R1 ; COPY UCB ADDRESS BR 15$ ; TO COMMON CODE 10$: MOV K.OWN(R2),R1 ; GET UCBN BEQ 25$ ; BR IF NO UCB15$:( MOVB U.UNIT(R1),R1 ; PICK UP .TITLE NLDRV( .IDENT /04/ ;;E; COPYRIGHT (C) 1976, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.$;IA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDG9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.C;M ; VERSION 03;O; E. L. BAATZ 22-JUL-76 ; ; MODIFIED BY:;.; ERIC BAATZ 20-JAN-794; EB188 -- CONVERT FOR RSX-11M-PLUS (USE DDT$ MACRO);W; ; NULL DEVICE DRIVER.A;;; MACRO LIBRARY CALLSO;A; EQUATED SYMBOLS+; ; LOCAL DATA;T9; NO CONTROLLER IMPURE DATA TABLES (THERE IS NO DEVICE TO ; CAUSE INTERRUPTS)I; ; DRIVER DISPATCH TABLEY;D DDT$ NL,,NONE,,,NEW;+7; NLDRV AND DRQIO IMPLEMENT A DEVICE NL:, WHICH ACTS AS 5; 1) A SINK FOR ALL INFORMATION SEND TO IT (IO.WLB)C?; 2) A SOURCE FOR AN INFINITE NUMBER OF END OF FILES (IO.RLB)B?; 3) A SOURCE FOR AN INFINITE NUMBER OF NULL RECORDS (IO.RLB)U$; IF "IE.EOF" IS CHANGED TO "IS.SUC";-;VE; DRQIO (BECAUSE THE UC.QUE BIT IS SET IN THE UCB) SETS THE REGISTERSA; TO THE FOLLOWING:E;M; R1 = ADDRESS OF I/O PACKET; R4 = ADDRESS OF SCBE; R5 = ADDRESS OF UCBD;A); ONLY TWO FIELDS OF AN I/O PACKET MATTER /; I.FCN+1 = THE I/O FUNCTION CODE. ONLY IO.WLBS ; AND IO.RLB MAKE IT TO NLDRV-; I.PRM+4 = IF I.FCN+1 IS IO.WLB, THIS IS THE .; NUMBER OF BYTES THE CALLER WANTS TO WRITE;)-NLINI: MOV R1,R3 ;POINT AT PACKET FOR $IOFINS, MOV #IS.SUC&377,R0 ;A WRITE ALWAYS SUCCEEDS/ MOV I.PRM+4(R1),R1 ;SAY EVERYTHING WAS WRITTENT. CMPB #IO.WLB/400,I.FCN+1(R3) ;WANTS TO WRITE? BEQ 10$ ;IF EQ YES! MOV #IE.EOF&377,R0 ;IT IS A READO CLR R1 ;READ NO CHARACTERS%10$: CALLR $IOFIN ;FINISH OFF PACKETT TNLCAN:NLOUT:NLPWF:NLKRB:NLUCB: RETURN. .END AND IO.RLB MAKE IT TO NLDRV-; I.PRM+4 = IF I.FCN+1 IS IO.WLB, THIS IS THE .; NUMBER OF BYTES THE CALLER WANTS TO WRITE;)-NLINI: MOV R1,R3 ;POINT AT PACKET FOR $IOFINS, MOV #IS.SUC&377,R0 ;A WRITE ALWAYS SUCCEEDS/ MOV I.PRM+4(R1),R1 ;SAY EVERYTHING WAS WRITTENT. CMPB #IO.WLB/400,I.FCN+1(R3) ;WANTS TO WRIT .TITLE PPDRVN .IDENT /03.01/1 M; ; COPYRIGHT (C) 1975, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.O;$A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDN9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.B;2; VERSION 03.01'; ; THOMAS J. MILLER 25-NOV-74;S; PREVIOUSLY MODIFIED BY:V;K; C. A. D'ELIA; T. J. MILLER;I; MODIFIED BY:;:; K. E. KINNEAR 22-JUN-77E;D&; KK004 -- NEW I/O DATA BASE SUPPORT.;T; E. L. BAATZ 18-JUN-78;N(; E00X_^4^eaekB148 -- REMOVE EXPLICIT PS REFERENCE;; PC11 PAPER TAPE PUNCH DRIVER;I; MACRO LIBRARY CALLST;,# .MCALL ABODF$,HWDDF$,PKTDF$,TCBDF$S" ABODF$ ;DEFINE TASK ABORT CODES+ HWDDF$ ;DEFINE HARDWARE REGISTER SYMBOLST$ PKTDF$ ;DEFINE I/O PACKET OFFSETS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS; ; EQUATED SYMBOLS ;V6; PAPER TAPE PUNCH STATUS WORD BIT DEFINITIONS (U.CW2);:9WAIT=100000 ;WAITING FOR DEVICE TO COME ON-LINE (1=YES)S0ABORT=40000 ;ABORT CURRENT I/O REQUEST (1=YES)/TRAIL=200 ;CURRENTLY PUNCHING TRAILER (1=YES)P; ;**-16; DRIVER DISPATCH TABLEA;T ; KK004$ DDT$ PP,P$$P11 ; KK004 ;**-4;+5; **-PPINI-PC11 PAPER TAPE PUNCH CONTROLLER INITIATOR;TJ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUESTN; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE EXECU-N; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN ATTEMPTI; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER ISNI; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER- >; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.; ; INPUTS:1;A:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;E ; OUTPUTS:;EE; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT-RE; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-T; ATION IS INITIATED. ;- .ENABL LSBN,PPINI: GTPKT$ PP,P$$P11,PPPWF,,T ; KK004 ;**-2;N1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:M;I'; R1=ADDRESS OF THE I/O REQUEST PACKET. -; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.H; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.N:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;D-; PAPER TAPE PUNCH I/O REQUEST PACKET FORMAT:A;R"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK.,@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTER TASK HEADER.J; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK HEADER (UCB).9; WD. 05 -- I/O FUNCTION CODE (IO.WLB, IO.ATT OR IO.DET).E0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.E; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140000). 3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. *; WD. 12 -- RELOCATION BIAS OF I/O BUFFER.+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.D-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED. ; WD. 15 -- NOT USED.-; WD. 16 -- NOT USED. ; WD. 17 -- NOT USED.A; WD. 20 -- NOT USED. ;-* CLR U.CW2(R5) ;CLEAR ALL SWITCHES ;**-1= CMPB I.FCN+1(R1),#IO.WLB/256. ;WRITE LOGICAL BLOCK FUNCTION?- BEQ 10$ ;IF EQ YES, MOV I.TCB(R1),R0 ;GET REQUESTOR TCB ADDRESS+ BIT #T2.ABO,T.ST2(R0) ;TASK BEING ABORTED? * BNE 65$ ;IF NE YES - DON'T PUNCH TRAILER= BIS #TRAIL,U.CW2(R5) ;OTHERWISE FUNCTION IS ATTACH OR DETACH " ; SET FLAG TO PUNCH TRAILER- MOV #170.,U.CNT(R5) ;SET COUNT FOR 170 NULLS 910$: BIS #WAIT,U.CW2(R5) ;ASSUME WAIT FOR DEVICE OFF LINEO! TST @S.CSR(R4) ;DEVICE OFF LINE?- BMI 80$ ;IF MI YES>20$: BIC #WAIT,U.CW2(R5) ;DEVICE ON LINE, CLEAR WAIT CONDITION, MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUT COUNT' MOV #100,@S.CSR(R4) ;ENABLE INTERRUPTSD;K; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUSESNK; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDITION 2; THAT COULD EXIST IN RESTARTING THE I/O OPERATION;;PPPWF: RETURN ;L;+6; **-$PPINT-PC11 PAPER TAPE PUNCH CONTROLLER INTERUPTS;-$PPINT:: ;;;REF LABELI5 INTSV$ PP,PR4,P$$P11 ;;;GENERATE INTERRUPT SAVE CODEE8 MOV U.SCB(R5),R4 ;;;GET ADDRESS OF STATUS CONTROL BLOCK0 MOVB S.ITM(R4),S.CTM(R4) ;;;RESET TIMEOUT COUNT8 MOV S.CSR(R4),R4 ;;;POINT R4 TO CONTROL STATUS REGISTER# MOV (R4)+,U.CW3(R5) ;;;SAVE STATUSE BMI 60$ ;;;IF MI, ERRORN. SUB #1,U.CNT(R5) ;;;DECREMENT CHARACTER COUNT BCS 50$ ;;;IF CS, THEN DONET. TSTB U.CW2(R5) ;;00X_Y _^DATADATADATADATADATADATADATA;CURRENTLY PUNCHING TRAILER? BPL 30$ ;;;IF PL NOC- CLRB (R4) ;;;LOAD NULL INTO OUTPUT REGISTER BR 40$ ;;;BRANCH TO LOAD ITV330$: CALL $GTBYT ;;;GET NEXT BYTE FROM USER BUFFERV2 MOVB (SP)+,(R4) ;;;LOAD BYTE INTO OUTPUT REGISTER'40$: JMP $INTXT ;;;EXIT FROM INTERRUPTO&50$: INC U.CNT(R5) ;;;RESET BYTE COUNT+60$: CLR -(R4) ;;;DISABLE PUNCH INTERRUPTSR% CALL $FORK ;;;CREATE SYSTEM PROCESS " MOV U.SCB(R5),R4 ;POINT R4 TO SCB) MOV S.PKT(R4),R1 ;POINT R1 TO I/O PACKETN3 MOV I.PRM+4(R1),R1 ; AND PICK UP CHARACTER COUNT?3 SUB U.CNT(R5),R1 ;CALCULATE CHARACTERS TRANSFERREDT/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERV TST U.CW3(R5) ;DEVICE ERROR?  BPL 70$ ;IF PL NOV:65$: MOV #IE.VER&377,R0 ;UNRECOVERABLE HARDWARE ERROR CODE*70$: CALL $IODON ;INITIATE I/O COMPLETION( BR PPINI ;BRANCH BACK FOR NEXT REQUEST; G; DEVICE TIMEOUT RESULTS IN A NOT READY MESSAGE BEING PUT OUT 4 TIMES AVI; MINUTE. TIMEOUTS ARE CAUSED BY POWERFAILURE AND PUNCH FAULT CONDITIONS.;V1PPOUT: CLRB @S.CSR(R4) ;;;DISABLE PUNCH INTERRUPTB MTPS #0 ;;;ALLOW INTERRUPTST680$: MOV #IE.DNR&377,R0 ;ASSUME DEVICE NOT READY ERROR3 MOV U.CW2(R5),R1 ;ARE WE WAITING FOR DEVICE READY? * BPL 70$ ;IF PL NO, TERMINATE I/O REQUEST4 MOV #IE.ABO&377,R0 ;ASSUME REQUEST IS TO BE ABORTED ASL R1 ;ABORT REQUEST? BMI 70$ ;IF MI YES TST @S.CSR(R4) ;PUNCH READY?O BPL 20$ ;IF PL YES* MOV #T.NDNR,R0 ;SET FOR NOT READY MESSAGE, MOVB #1,S.CTM(R4) ;SET TIMEOUT FOR 1 SECOND( DECB S.STS(R4) ;TIME TO OUTPUT MESSAGE? BNE PPPWF ;IF NE NOU? MOVB #15.,S.STS(R4) ;SET TO OUTPUT NEXT MESSAGE IN 15. SECONDS3 CALLR $DVMSG ;OUTPUT MESSAGE .DSABL LSBC;)C; CANCEL I/O OPERATION-FORCE I/O TO COMPLETE IF DEVICE IS NOT READYE;O4PPCAN: CMP R1,I.TCB(R0) ;;;REQUEST FOR CURRENT TASK? BNE 10$ ;;;IF NE NO : BIS #ABORT,U.CW2(R5) ;;;SET FOR ABORT IF DEVICE NOT READY10$: RETURN ;;;L .ENDV #T.NDNR,R0 ;SET FOR NOT READY MESSAGE, MOVB #1,S.CTM(R4) ;SET TIMEOUT FOR 1 SECOND( DECB S.STS(R4) ;TIME TO OUTPUT MESSAGE? B .TITLE PRDRVE .IDENT /03.01/S S;); COPYRIGHT (C) 1975, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;SA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDI9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.F;C; VERSION 03.01E;$; THOMAS J. MILLER 2-DEC-74.;(; PREVIOUSLY MODIFIED BY:I;N; C. A. D'ELIA;R; MODIFIED BY:;#; K. E. KINNEAR 22-JUN-77Y;S&; KK004 -- NEW I/O DATA BASE SUPPORT.; ; E. L. BAATZ 18-JUN-78T; (; EB148 -- REMOVE EXPLICIT PS REFERENCE;N$; PC11/PR11 PAPER TAPE READER DRIVER; ; MACRO LIBRARY CALLSN;O .MCALL ABODF$,HWDDF$,PKTDF$" ABODF$ ;DEFINE TASK ABORT CODES+ HWDDF$ ;DEFINE HARDWARE REGISTER SYMBOLSN$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;F; EQUATED SYMBOLS0;7; PAPER TAPE READER STATUS WORD BIT DEFINITIONS (U.CW2)E;Y)TRAIL=100000 ;CURRENTLY READING TRAILER#; ;**-16; DRIVER DISPATCH TABLE ;  ; KK004. DDT$ PR,P$$R11 ; KK004 ;**-4;+;; **-PRINI-PC11/PR11 PAPER TAPE READER CONTROLLER INITIATOR ;VJ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUESTN; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE EXECU-N; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN ATTEMPTI; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER ISDI; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER- >; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.;I ; INPUTS:1;P:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;E ; OUTPUTS:;EE; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT-RE; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-T; ATION IS INITIATED. ;- .ENABL LSBN,PRINI: GTPKT$ PR,P$$R11,PRPWF,,T ; KK004 ;**-2;N1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:M;I'; R1=ADDRESS OF THE I/O REQUEST PACKET. -; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.H; R3=CONTR00Y_^4^eaekOLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.N:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;D.; PAPER TAPE READER I/O REQUEST PACKET FORMAT:;R"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK.,@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTER TASK HEADER.J; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK HEADER (UCB).9; WD. 05 -- I/O FUNCTION CODE (IO.RLB, IO.ATT OR IO.DET).E0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.E; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140000). 3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. *; WD. 12 -- RELOCATION BIAS OF I/O BUFFER.+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.D-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED. ; WD. 15 -- NOT USED.-; WD. 16 -- NOT USED. ; WD. 17 -- NOT USED.A; WD. 20 -- NOT USED. ;-5 MOVB I.FCN+1(R1),R2 ;MOVE FUNCTION CODE TO R2 ;**-163 CMPB R2,#IO.RLB/256. ;READ LOGICAL BLOCK FUNCTION?  BEQ 10$ ;IF EQ YES3 MOV #IS.SUC&377,R0 ;OTHER FUNCTIONS ALWAYS SUCCEED(2 CLR R1 ;RETURN 0 IN SECOND WORD OF STATUS BUFFER' CMPB R2,#IO.ATT/256. ;ATTACH FUNCTION? BNE 50$ ;IF NE NO, CALL $IODON9 BIS #TRAIL,U.CW2(R5) ;SET FLAG TO READ TRAILER IF ATTACH- BR 60$ ;CALL $IODON 010$: MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUT COUNT2 TST @S.CSR(R4) ;ERROR BIT SET IN STATUS REGISTER? BPL 15$ ;IF PL NO, INITIATE IO< TST U.CW2(R5) ;IS THIS THE FIRST READ FOR ATTACHED PROCESS?2 BMI 70$ ;IF MI YES, RETURN DEVICE NOT READY CODE0 ; (OTHERWISE HANDLE AS EOF UPON INTERRUPT)715$: MOV #101,@S.CSR(R4) ;ENABLE READER WITH INTERRUPTSP;#+; IN-PROGRESS TRANSFERS ARE NOT TERMINATED. ;NPRCAN:;K; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUSESOK; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDITIONR2; THAT COULD EXIST IN RESTARTING THE I/O OPERATION;IPRPWF: RETURN ;);+<; **-$PRINT-PC11/PR11 PAPER TAPE READER CONTROLLER INTERUPTS;-$PRINT:: ;;;REF LABEL5 INTSV$ PR,PR4,P$$R11 ;;;GENERATE INTERRUPT SAVE CODEM8 MOV U.SCB(R5),R4 ;;;GET ADDRESS OF STATUS CONTROL BLOCK0 MOVB S.ITM(R4),S.CTM(R4) ;;;RESET TIMEOUT COUNT8 MOV S.CSR(R4),R4 ;;;POINT R4 TO CONTROL STATUS REGISTER# MOV (R4)+,U.CW3(R5) ;;;SAVE STATUS  BMI 40$ ;;;IF MI, ERRORD" TST U.CW2(R5) ;;;READING TRAILER? BPL 20$ ;;;IF PL NOD# TSTB (R4) ;;;IS BYTE READ A NULL?N BEQ 30$ ;;;IF EQ YES+ CLR U.CW2(R5) ;;;NO LONGER READING TRAILERA&20$: MOVB (R4),-(SP) ;;;PUSH BYTE READ( CALL $PTBYT ;;;PLACE IT IN USER BUFFER& DEC U.CNT(R5) ;;;DECREMENT BYTE COUNT BEQ 40$ ;;;IF EQ READ COMPLETE 30$: INC -(R4) ;;;ENABLE READER# JMP $INTXT ;;;EXIT FROM INTERRUPTS%40$: CLR -(R4) ;;;DISABLE INTERRUPTSE% CALL $FORK ;;;CREATE SYSTEM PROCESSA" MOV U.SCB(R5),R4 ;POINT R4 TO SCB) MOV S.PKT(R4),R1 ;POINT R1 TO I/O PACKET 3 MOV I.PRM+4(R1),R1 ; AND PICK UP CHARACTER COUNTB3 SUB U.CNT(R5),R1 ;CALCULATE CHARACTERS TRANSFERREDD/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERE TST U.CW3(R5) ;DEVICE ERROR?N BPL 50$ ;IF PL NOC, MOV #IE.EOF&377,R0 ;RETURN END OF FILE CODE#50$: CLR U.CW2(R5) ;CLEAR FLAG WORD;*60$: CALL $IODON ;INITIATE I/O COMPLETION( BR PRINI ;BRANCH BACK FOR NEXT REQUEST;UH; DEVICE TIMEOUT RESULTS IN THE RETURN OF A DEVICE NOT READY ERROR CODE.;S2PROUT: CLR @S.CSR(R4) ;;;DISABLE READER INTERRUPTS MTPS #0 ;;;ALLOW INTERRUPTSH.70$: MOV #IE.DNR&377,R0 ;DEVICE NOT READY CODE BR 50$ ;CALL $IODONM .DSABL LSB7 .ENDME SUCCESSFUL TRANSFERE TST U.CW3(R5) ;DEVICE ERROR?N BPL 50$ ;IF PL NOC, MOV #IE.EOF&377,R0 ;RETURN END OF FILE CODE#50$: CLR U.CW2(R5) ;CLEAR FLAG WORD;*60$: CALL $IODON ;INITIATE I/O COMPLETION( BR PRINI ;BRANCH BACK FOR NEXT REQUEST;UH; DEVICE TIMEOUT RESULTS IN THE RETURN OF A DEVICE NOT READY ERROR CODE.;S2PROUT: CLR @S.CSR(R4) ;;;DISABLE READER INTERRUPTS MTPS #0 ;;;ALLOW INTERRUPTSH.70$: MOV #IE.DNR&377,R0 ;DEVICE NOT RE00_ _^DATADATADATADATADATADATADATANFORMATION2 MOV (SP)+,R2 ;GET ADDRESS OF FIRST CHANNEL NUMBER BNE 20$ ;IF NE GO GET IT) MOV #.ZEROW,R2 ;DEFAULT--POINT AT A ZERO)20$: MOV (R2),R2 ;GET THE CHANNEL NUMBER(! BMI 200$ ;IF MI SURELY AN ERROR$, BIT #S$WDIF,S.WFL2(R4) ;DIFFERENTIAL INPUT? BEQ 40$ ;IF EQ NO1' BIC #1,R2 ;YES--FORCE AN EVEN CHANNEL-40$: CMP R2,S.WMXC(R4) ;LEGAL CHANNEL NUMBER?S BHI 200$ ;IF HI NO$ MOV (SP)+,R1 ;GET ADDRESS OF 'NCHN' BNE 60$ ;IF NE GO GET IT) MOV #.ZEROW,R1 ;DEFAULT--POINT AT A ZEROC60$: MOV (R1),R1 ;GET 'NCHN'R! BMI 200$ ;IF MI CANNOT BE LEGALB BNE 80$ ;IF NE OKG INC R1 ;ELSE SET TO 1 CHANNELT'80$: MOV R1,-(SP) ;SAVE 'NCHN' ON STACKT& MOV R1,-(SP) ;MAKE A DESTROYABLE COPY! MOV R2,R1 ;SET STARTING CHANNELL)90$: ADD S.WCHI(R4),R1 ;INCREMENT CHANNELQ1 DEC (SP) ;THE FULL NUMBER OF CHANNEL INCREMENTS: BGT 90$ ;...$ TST (SP)+ ;KEEP THE STACK STRAIGHT0 DEC R1 ;DON'T CHECK ONE AFTER THE LAST CHANNEL' CMP R1,S.WMXC(R4) ;LAST CHANNEL LEGAL?R BHI 200$ ;IF HI NO--ERROR6 MOV R1,S.WHCH(R4) ;SET HIGHEST CHANNEL WE WILL ACCESS' MOV R2,S.WICH(R4) ;SET INITIAL CHANNEL ' MOV R2,S.WCCH(R4) ;AND CURRENT CHANNELP2 MOV (SP),S.WNCH(R4) ;AND NUMBER OF CHANNELS TO DO7 MOV (SP)+,S.WCHX(R4) ;SET THE SAVED NUMBER OF CHANNELSD3 MOV R3,-(SP) ;PUT RETURN ADDRESS BACK ON THE STACKU .IF GT N$AD11-12 CALL .ADXCH ;GO SETUP THE UCB POINTER IN THE SWB .ENDC ;N$AD11-1 CLR S.WGNW(R4) ;CLEAR GAIN WORD .IFT ;A$$M11.* BIT #7,S.WFLG(R4) ;WAS ANY GAIN SELECTED?3 BEQ .STCHB ;IF EQ NO--SET CHANNEL BYTE AND RETURNE& MOV S.WFLG(R4),R3 ;YES--GET FLAG WORD" BIC #^C<7>,R3 ;CLEAR ALL BUT GAIN% CMP R3,#5 ;IS IT PROGRAMMABLE GAIN?N. BEQ .STCHB ;IF EQ YES--WILL SAMPLE AT GAIN 1# BHI .STCHB ;IF HI NOT A REAL GAINC DEC R3 ;MAKE 2-4 IN RANGE 1-3R% BEQ .STCHB ;IF GAIN 1 SKIP THE REST % MOVB R3,S.WGNW(R4) ;STORE GAIN VALUE 7 MOVB GAINTB-1(R3),S.WGNW+1(R4) ;STORE GAIN BITS IN SWB( .ENDC ;A$$M11( BR .STCHB ;SET CHANNEL BYTE AND RETURN;N; ERROR--RESET STACK;T200$: MOV R5,SP ;RESET STACKE SEC!240$: JMP (R3) ;RETURN TO CALLERT; 1; SETADC WAS CALLED...JUST CLEAR STACK AND RETURN5;I9300$: CMP (SP)+,(SP)+ ;POP OFF ADDRESSES OF ICHN AND NCHNP CLC ;FLAG SUCCESS JMP (R3) ;RETURN TO CALLER C- .SBTTL .STCHB COMPUTE CHANNEL BYTE FOR SWEEPG;+$; .STCHB -- SET S.WCHB FOR A/D SWEEP;EB; THIS ROUTINE COMPUTES THE INITIAL CHANNEL BYTE FOR THE A/D SWEEP; ; INPUTS:$;1; SWEEP CONTROL BLOCK SET UP; ; OUTPUTS:;N; S.WCHB AND S.WCBX SET UP;$;-6.STCHB::MOV S.WAUA(R4),R3 ;GET ACTIVE UNIT UCB ADDRESS ADD R4,R3 ;POINT TO THE UCBE' MOV S.WICH(R4),R2 ;GET INITIAL CHANNEL$ .IF DF A$$M110 BIT #S$WACA,S.WFL2(R4) ;ABS CHANNEL ADDRESSING? BEQ 100$ ;IF EQ NO .IFTF ;A$$M11;B; ABS CHANNEL ADDRESSING;T-40$: MOV R4,-(SP) ;SET SWB ADDRESS ONTO STACKA% ADD #S.WUCB,(SP) ;POINT TO FIRST UCBH%45$: CMP R3,(SP) ;BACK TO FIRST UCB?P BHI 50$ ;IF HI NO% TST (SP)+ ;YES--KEEP STACK STRIAGHTP BR 120$ ;FINISH UP$50$: SUB #U.LGTH,R3 ;NO--BACK UP ONE+ MOV #16.,-(SP) ;ASSUME NO AM11 ON THIS A/DA BIT #UF$AMK,U.FLG(R3) ;CORRECT? BEQ 60$ ;IF EQ YES$ MOV #64.,(SP) ;NO--MAKE 64 CHANNELS"60$: SUB (SP)+,R2 ;BACK UP CHANNEL BR 45$ ;GO ON1 .IFT ;A$$M11&100$: BIC #^C<17>,R2 ;CLEAR EXTRA BITS .ENDC ;A$$M11)120$: BISB S.WGNW+1(R4),R2 ;SET GAIN BITS#% MOVB R2,S.WCHB(R4) ;SET CHANNEL BYTEC* MOVB R2,S.WCBX(R4) ;AND SAVE CHANNEL BYTE) CLC ;FLAG SUCCESS (RETURN FROM .ADGCH)R RETURNB 2) .SBTTL .ADCMC COMPUTE NUMBER OF CHANNELSC;+>; .ADCMC -- COMPUTE NUMBER OF CHANNELS INFORMATION FOR A SWEEP;G@; THIS ROUTINE WILL SET UP THE SWB FOR THE AD11 WITH THE CORRECT<; CHANNEL INFORMATION DEPENDING ON WHETHER ABSOLUTE CHANNEL D; ADDRESSING IS IN EFFECT. IT WILL ALSO SET THE CORRECT MAX CHANNEL+; INFORMATION INTO THE SWEEP CONTROL BLOCK.A;B ; INPUTS: ;S$; R4 POINTS TO A SWEEP CONTROL BLOCK;W ; OUTPUTS:;V.; THE SWB AND UNIT CONTROL BLOCKS ARE MODIFIED;A;-.ADCMC: MOV R3,-(SP) ;SAVE R3C MOV R4,R3 ;GET00 _[#_4^eaek SWB POINTER# ADD #S.WUCB,R3 ;POINT TO FIRST UCBN( MOV #-1,R2 ;INIT CHANNEL COUNTER TO -1 .IF GT N$AD11-10 MOV S.WUNT(R4),-(SP) ;SET # OF UNITS ONTO STACK .IFTF ;N$AD11-1;H; BACK HERE FOR EACH UNITR;I%20$: MOV #16.,R1 ;ASSUME 16 CHANNELSC .IF DF A$$M11/ BIT #UF$AMK,U.FLG(R3) ;THIS AD11 HAVE AN AM11? BEQ 40$ ;IF EQ NOP> BIT #S$WACA,S.WFL2(R4) ;YES--ARE WE DOING ABSOLUTE CHAN ADDR?+ BEQ 40$ ;IF EQ NO--16 CHAN EVEN WITH AM11+ MOV #64.,R1 ;YES--INCREASE TO 64 CHANNELSG .ENDC ;A$$M1140$: ADD R1,R2 ;UP THE COUNTER/ MOV R2,U.MAXC(R3) ;SET MAX CHANNEL WORD IN UCBG .IFT ;N$AD11-1S! ADD #U.LGTH,R3 ;MOVE TO NEXT UCBS DEC (SP) ;SEE IF MORE TO DO BGT 20$ ;IF GT YES--GO DO IT( INC (SP)+ ;CLEAR UNIT COUNT FROM STACK .ENDC ;N$AD11-1< MOV R2,S.WMXC(R4) ;SET MAX CHANNEL # IN SWEEP CONTROL BLOCK MOV (SP)+,R3 ;RESTORE R34 RETURNR E* .SBTTL .ADNXC ADVANCE TO NEXT A/D CHANNEL;+-; .ADNXC -- INCREMENT TO THE NEXT A/D CHANNELR;E7; THIS ROUTINE ADVANCES .ADSWB TO THE NEXT A/D CHANNEL. ; ; INPUTS:M;R; R4 POINTS TO SWB; .ADSWB SETUP;C ; OUTPUTS:;A2; R3 SETUP TO THE UCB OF THE CORRECT A/D CONVERTOR(; .ADSWB INCREMENTED TO THE NEXT CHANNEL;S;- .PSECT .KSCT1;.ADNXC::DEC S.WNCH(R4) ;;;DECR THE NUMBER OF CHANNELS TO DO.& BLE 60$ ;;;IF LE WE HAVE DONE ENOUGH2 ADD S.WCHI(R4),S.WCCH(R4) ;;;MOVE TO NEXT CHANNEL9 ADD S.WCHI(R4),S.WCHB(R4) ;;;INCREMENT CHANNEL BYTE ALSOC .IF GT N$AD11-1, MOV S.WAUA(R4),R3 ;;;GET ACTIVE UCB .TITLE UTSUB1 .IDENT /02/;C; COPYRIGHT (C) 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDT9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.1; ; VERSION 02;E; T. J. MILLER 23-OCT-77;XB; THIS MODULE CONTAINS ROUTINES WHICH MAY BE CALLED AT TASK STATE.;E; MODIFIED BY:;.; J. E. PROVINO 22-JUN-79;; JP130 -- FIX CONDITIONALS. ;U; J. E. PROVINO 16-JUL-79A;F2; JP135 -- USE EIS INSTRUCTIONS IN $MUL AND $DIV.;;+,; **-$MUL-INTEGER MULTIPLY MAGNITUDE NUMBERS;P ; INPUTS:Y;D; R0=MULTIPLIER.; R1=MULTIPLICAND.;D ; OUTPUTS:;E); DOUBLE WORD RESULT IS RETURNED WITH THER); HIGH PART IN R0 AND THE LOW PART IN R1.;E9; REGISTERS R2, R3, R4, AND R5 ARE PRESERVED ACROSS CALL.O;-$$MUL:: TST R0 ;NEGATIVE MULTIPLIER? BMI 5$ ;IF MI YESD TST R1 ;NEGATIVE MULTIPLICAND? BMI 5$ ;IF MI YESI MUL R1,R0 ;MULTIPLY R1 BY R0 RETURN ;7"5$: MOV R0,-(SP) ;SAVE R0 FOR ADDS MOV #21,-(SP) ;SET REPEAT COUNT CLR R0 ;CLEAR HIGH PARTM 10$: ROR R0 ;DOUBLE RIGHT SHIFT ROR R1 ; BCC 20$ ;IF CC DO NOT ADD ADD 2(SP),R0 ;E&20$: DEC (SP) ;DECREMENT REPEAT COUNT BGT 10$ ;IF GT MORE TO GOH CMP (SP)+,(SP)+ ;CLEAN STACKT RETURN ;4;+*; **-$DIV-INTEGER DIVIDE MAGNITUDE NUMBERS;T ; INPUTS:I;M; R0=DIVIDEND.; R1=POSITIVE DIVISOR.;; ; OUTPUTS:;L1; QUOTIENT IS RETURNED IN R0 AND REMAINDER IN R1. ;B9; REGISTERS R2, R3, R4, AND R5 ARE PRESERVED ACROSS CALL.V;-;$DIV:: MOV R2,-(SP) ;SAVE R2 FOR INTERFACE TO DOUBLE DIVIDER$ MOV R1,R2 ;COPY DIVISOR FOR $DBDIV$ BMI 20$ ;IF MI DIVISOR IS NEGATIVE BEQ 30$ ;IF EQ DIVISOR IS ZERO) MOV R0,R1 ;SET UP DIVIDEND IN R0 AND R1 CLR R0 ; DIV R2,R0 ;DIVIDE R0,R1 BY R210$: MOV (SP)+,R2 ;RESTORE R2M RETURN ;E-20$: CLR R1 ;ZERO HIGH-ORDER WORD FOR $DBDIVS+ CALL $DBDIV ;PERFORM THE DIVIDE OPERATIONT BR 10$ ;$30$: MOV R0,R1 ;MOVE DIVIDEND TO R1 MOV #177777,R0 ;QUOTIENTA BR 10$ ;;+7; **-$DBDIV-DOUBLE-PRECISION DIVIDE MAGNITITUDE NUMBERSE; ; INPUTS:D; ; R0=LOW-ORDER PART OF DIVIDEND.!; R1=HIGH-ORDER PART OF DIVIDEND.A; R2=POSITIVE DIVISOR.;S ; OUTPUTS:;V ; R0=LOW-ORDER PART OF QUOTIENT.; R1=REMAINDER.'; R2=UNDEFINED FOR POSSIBLE FUTURE USE.V; R3-R5 ARE PRESERVED.;T<; NOTE: IT IS THE CALLER'S RESPONSIBILITY TO INSURE THAT THE5; DIVISION OF THE INPUT OPERANDS YIELDS NO MORE THAN0; 16 BITS IN THE QUOTIENT.T;-&$DBDIV::MOV #16.,-(SP) ;SET LOOP COU00[(_\._^DATADATADATADATADATADATADATANT30$: ASL R0 ;DOUBLE LEFT SHIFTN ROL R1 ;" CMP R1,R2 ;SUBTRACT OUT DIVISOR? BLO 40$ ;IF LO NO ! SUB R2,R1 ;SUBTRACT OUT DIVISORO INC R0 ;ADD IN LOW BIT$40$: DEC (SP) ;DECREMENT LOOP COUNT BGT 30$ ;IF GT MORE TO GO  TST (SP)+ ;CLEAN STACK RETURN ;I;+!; **-$CAT5-CONVERT ASCII TO RAD50; ; INPUTS:I;H/; R0=ADDRESS OF NEXT CHARACTER IN INPUT BUFFER.D; R1=PERIOD DISPOSITION FLAG.I+; IF R1 EQ 0, THEN PERIOD IS A TERMINATOR.T0; IF R1 NE 0, THEN PERIOD IS A RAD50 CHARACTER.;: ; OUTPUTS:;E6; C=1 IF SCAN WAS TERMINATED BY A NON-RAD50 CHARACTER./; C=0 IF THREE RAD50 CHARACTERS WERE CONVERTED. 9; NOTE: IF EITHER CASE THE FOLLOWING VALUES ARE RETURNED.R0; R0=ADDRESS OF NEXT CHARACTER IN INPUT BUFFER.; R1=PACKED RAD50 CHARACTERS.; R2=TERMINAL CHARACTER.E; R3 IS PRESERVED.;- S .IF DF R$$DSP S+$CAT5:: SAVNR ;SAVE NONVOLITILE REGISTERSR MOV R3,-(SP) ;SAVE R3 AS WELL+ MOV R1,-(SP) ;SAVE PERIOD DISPOSITION FLAG1 CLR R1 ;CLEAR ACCUMULATION/ MOV #CVTBL,R3 ;GET ADDRESS OF CONVERSION TABLE &10$: MOVB (R0)+,R5 ;GET NEXT CHARACTER- MOV #CNTRL,R4 ;GET ADDRESS OF CONTROL STRING CMPB (R4)+,R5 ;RAD50 CHARACTER? BLO 60$ ;IF LO NOD CMPB (R4)+,R5 ;ALPHABETIC?R BLOS 50$ ;IF LOS YES CMPB (R4)+,R5 ;RAD50 CHARACTER? BLO 60$ ;IF LO NOR CMPB (R4)+,R5 ;NUMERIC? BLOS 40$ ;IF LOS YES CMPB (R4)+,R5 ;"$"? BEQ 30$ ;IF EQ YES CMPB (R4)+,R5 ;"SPACE"? BEQ 60$ ;IF EQ YES# TST (SP) ;PERIOD RAD50 CHARACTER? BEQ 60$ ;IF EQ NOU CMPB (R4)+,R5 ;"."? BEQ 40$ ;IF EQ YES BR 60$ ;20$: SUB #' -11,R5 ;SPACEE30$: SUB #11-22,R5 ;"$",!40$: SUB #22-100,R5 ;PERIOD/DIGIT50$: SUB #100,R5 ;ALPHABETIC?% MOV R0,-(SP) ;SAVE NEXT BYTE ADDRESS;& MOV (R3)+,R0 ;GET CONVERSION CONSTANT MOV R1,-(SP) ;SAVE ACCUMULATION MOV R5,R1 ;SET MULTIPLIER)" CALL $MUL ;SCALE RAD50 CHARACTER MOV R1,R5 ;RESULT TO R5B- MOV (SP)+,R1 ;RETRIEVE PREVIOUS ACCUMULATIONB) MOV (SP)+,R0 ;RETRIEVE NEXT BYTE ADDRESS0 ADD R5,R1 ;ACCUMULATE RESULT& CMP R3,#CVTBL+6 ;CONVERTED THREE YET? BLO 10$ ;IF LO NO0$ TST (SP)+ ;CLEAN STACK-CLEAR CARRY BR 70$ ;*60$: COM (SP)+ ;CLEAN STACK AND SET CARRY+70$: MOVB -1(R0),R2 ;GET TERMINAL CHARACTER  MOV (SP)+,R3 ;RESTORE R33 RETURN ;N6CNTRL: .BYTE 'Z,'A,'9,'0,'$,' ,'. ;CONTROL BYTE STRING .EVEN.CVTBL: .WORD 50*50 ;RAD50 PACK MULTIPLICATION .WORD 50 ; .WORD 1 ;R .ENDC + ;+&; **-$SAVNR-SAVE NONVOLATILE REGISTERS; >; THIS ROUTINE IS A CO-ROUTINE THAT SAVES REGISTERS R4 AND R5.;-$SAVNR::MOV R4,-(SP) ;SAVE R4! MOV R5,-(SP) ;SET RETURN ADDRESSC MOV 4(SP),R5 ;RESTORE R5  CALL @(SP)+ ;CALL THE CALLER MOV (SP)+,R4 ;RESTORE R4V MOV (SP)+,R5 ;RESTORE R5H$ RETURN ;RETURN TO ORIGINAL CALLER;+&; **-$UTEND-END OF UTILITY SUBROUTINES; G; THIS ADDRESS IS THE LAST ADDRESS IN THE KERNEL DATA SPACE EXEC OR THEI<; MULTIPROCESSING EXEC WHICH A PRIVILEGED TASK NEEDS TO MAP.;-;- N $UTEND:: ; S .END THIS ROUTINE IS A CO-ROUTINE THAT SAVES REGISTERS R4 AND R5.;-$S .TITLE XWDRV .IDENT /02/ ;; COPYRIGHT (C) 1976, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 02;; SCOTT G. DAVIS 21-JUL-76;; DUE ALMOST ENTIRELY TO XUDRV;; MODIFIED BY:;; R. E. CALDWELL 26-JUL-79;3; RC003 -- REMOVE UNNEEDED CONDITIONALS FOR M-PLUS#; AND USE DDT$ AND GTPKT$ MACROS.;); DUP11 SYNCHRONOUS COMMUNICATIONS DRIVER;D; MACRO LIBRARY CALLSY;H .MCALL PKTDF$,HWDDF$A$ PKTDF$ ;DEFINE I/O PACKET OFFSETS$ HWDDF$ ;DEFINE HARDWARE REGISTERS .MCALL UCBDF$,CUCDF$O UCBDF$ ; DEFINE UCB OFFSETS$ CUCDF$ ;COMMUNICATIONS UCB LABELS;; EQUATED SYMBOLS ;T;D; RXCSR BIT ASSIGNMENTS ;O!DTSTCH= 100000 ;DATA SET CHANGEB"RING= 40000 ;RING LINE ASSERTEDCTS= 20000 ;CLEAR TO SENDCRRIER= 10000 ;CARRIER STATEN!RECACT= 4000 ;RECEIVER ACTIVEDSRDY= 1000 ;DATA 00\0_#_4^eaekSET READYSSTRSYN= 400 ;STRIP SYNCRXDONE= 200 ;RECEIVER DONEF+RCVENB= 100 ;RECEIVER INTERRUPT ENABLED2DSINTE= 40 ;DATA SET CHANGE INTERRUPT ENABLE&SCHSYN= 20 ;SEARCH SYNC MODE BITRTS= 4 ;REQUEST TO SEND%TRMRDY= 2 ;DATA TERMINAL READYD;X; RXDBUF BIT ASSIGNMENTS;T(RXERR= 100000 ;RECEIVER ERROR "OR" BIT/OVRNER= 40000 ;RECEIVER OVERRUN ERROR IF SET ;; PARCSR INITIALIZATION VALUES;E(DECMOD= 100000 ;SET DDCMP/BISYNCH MODE&CRCINH=1000 ;INHIBIT CRC CALCULATION4INITMD=DECMOD!CRCINH ;PARAMETER INITIALIZATION BITS;1'TSOM=400 ;TRANSFER - START OF MESSAGE ; ;A; TXCSR BIT ASSIGNMENTSN;E5DNAINT= 100000 ;SET ON DATA NOT AVAILABLE INTERRUPTR%MSTRST= 400 ;MASTER DEVICE RESETT&TXDONE= 200 ;TRANSMITTER DONE BIT2TXINTE= 100 ;TRANSMITTER INTERRUPT ENABLE BIT4DNAEN= 40 ;ENABLE DATA NOT AVAILABLE INTERRUPT+SEND= 20 ;TRANSMITTER ENABLE (GO) BITE"HDPX= 10 ;HALF DUPLEX IF SET;I; DRIVER DISPATCH TABLEL;A DDT$ XW,D$$W11,P .PAGE;+G;**- XWINI - DUP-11 SYNCHRONOUS COMMUNICATION CONTROLLER I/O INITIATOR ;S?; XWINI IS ENTERED WHEN AN I/O REQUEST IS QUEUED ON THE DEVICE,A4; AND AT THE END OF EACH QIO REQUEST WHICH OBEYS THE;; NORMAL RSX-11M INPUT/OUTPUT LOGIC FLOW. IF THE DEVICE ISR8; AVAILABLE AND A REQUEST IS IN THE QUEUE FOR THAT UNIT,; THE REQUEST IS INITIATED.E0; IF NO REQUEST EXISTS FOR THAT UNIT OR IF IT IS>; BUSY, AN EXIT IS TAKEN TO THE CALLER. NOTE THAT BECAUSE OF=; THE NATURE OF THE DUP-11, EACH UNIT IS A CONTROLLER ITSELF, /; HAS ITS OWN SCB, AND THEREFORE ITS OWN QUEUE. 9; EACH TIME XWINI IS CALLED, IT IS CALLED TO SERVICE ONLYU!; THE UNIT SPECIFIED IN THE CALL.E;O ; INPUTS:R;E#; R4 = STATUS CONTROL BLOCK ADDRESSI*; R5 = ADDRESS OF THE UCB TO BE INITIATED.;V ; OUTPUTS:;E,; IF A REQUEST IS SUCCESSFULLY DEQUEUED, THE$; DEVICE IS INITIATED APPROPRIATELY.;- R .ENABL LSB  I9XWINI: TSTB U.CW2(R5) ;UNSOLICITED (HDPX) RECEIVE ACTIVE?A BPL 10$ ;IF NOT, PROCEED% JMP 180$ ;ACTIVATE NO NEW OPERATIONF710$: GTPKT$ XW,D$$W11,,,T ;GET AN I/O PACKET TO PROCESSH;M1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ; ); R1 = ADDRESS OF THE I/O REQUEST PACKET.R/; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB.=; R3 = CONTROLLER INDEX +; R4 = ADDRESS OF THE STATUS CONTROL BLOCK.T*; R5 = ADDRESS OF THE UCB SPECIFIED IN THE; XWINI CALL. .;-!; DUP11 I/O REQUEST PACKET FORMATT; ; WORD CONTENTD;D; 0 I/O QUEUE THREAD WORD$); 1 REQUEST PRIORITY, EVENT FLAG NUMBER .; 2 ADDRESS OF THE TCB OF THE REQUESTER TASK/; 3 POINTER TO SECOND LUN WORD IN TASK HEADERR&; 4 CONTENTS OF FIRST LUN WORD (UCB); 5 I/O FUNCTION CODEE); 6 VIRTUAL ADDRESS OF I/O STATUS BLOCK ); 7 RELOCATION BIAS OF I/O STATUS BLOCKE=; 10 I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT +140000)S,; 11 VIRTUAL ADDRESS OF AST SERVICE ROUTINE#; 12 RELOCATION BIAS OF I/O BUFFERT!; 13 BUFFER ADDRESS FOR TRANSFER"; 14 TOTAL BYTE COUNT TO TRANSFER5; 15 BYTE COUNT FOR SECOND PART OF TRANSMISSION OR 0 ; 16 NOT USED; 17 NOT USED; 20 NOT USED;S/20$: MOV S.CSR(R4),R2 ;GET RECEIVER CSR ADDRESSI, ADD #I.FCN+1,R1 ;POINT TO I/O FUNCTION CODE3 CMPB #IO.INL/256.,(R1) ;CHECK IF TRANSFER FUNCTIONO& BLOS 70$ ;BRANCH ON CONTROL FUNCTION8 BIT #U2.ONL,U.CW2(R5) ;IS DEVICE ON LINE (INITIALIZED?) BEQ 90$ ;CAN'T TRANSFER IF NOT$ BIT #DSRDY,(R2) ;IS DATA SET READY?! BEQ 90$ ;IF NOT, CAN'T TRANSFERR& CMPB #IO.RLB/256.,(R1) ;READ LOGICAL?$ BEQ 40$ ;YES, SERVICE READ REQUEST;O/; FALL THROUGH HERE ON TRANSMIT (WRITE LOGICAL)S;& BIS #RTS,(R2) ;ASSERT REQUEST TO SEND( MOVB U.SYNC(R5),R0 ;LOAD SYNC CHARACTER3 MOVB S.ITM(R4),S.CTM(R4) ;INITIALIZE TIMEOUT COUNT.. MOVB U.NSYN(R5),R3 ;NUMBER OF SYNCS IN LEADER/30$: MOVB R3,U.NSYC(R5) ;LOAD SYNC LEADER COUNT)" ADD #4,R2 ;POINT TO TRANSMIT CSR% BIS #SEND,(R2)+ ;ENABLE TRANSMISSION#;D; ***** NOTE *****;D:; SINCE TSOM IS SET THROUGHOUT THE TRANSMISSION, DAT00\8_._^DATADATADATADATADATADATADATAA LATE ; ERRORS WILL NEVER BE DETECTED.;E; ***** *****; BIC #177400,R0 ;CLEAR HIGH BYTE BIS #TSOM,R0 ;SET TSOMB MOV R0,(R2) ;SEND CHAR+TSOM # TST -(R2) ;CLEAR DATA LATE ERRORSC* BIS #DNAEN!TXINTE,(R2) ;ENABLE INTERRUPTS: BR 180$ ;RETURN - INTERRUPT CODE PROPAGATES TRANSMISSION;R; RECEIVE FUNCTION INITIATION ;C40$: ;REFERENCE LABEL# MOV R5,R0 ;SET UP TRANSFER VECTOR22 ADD #U.RBUF,R0 ;RECEIVE TRANSFER INFORMATION HERE# MOV U.BUF(R5),(R0)+ ;TRANSFER BIAST" MOV U.BUF+2(R5),(R0)+ ;AND OFFSET MOV U.CNT(R5),(R0) ;AND COUNT$ BIC #SCHSYN,(R2) ;FORCE RE-SYNCHING* TSTB 2(R2) ; ENSURE RECEIVE BUFFER CLEAR1 BIS #STRSYN!RCVENB!SCHSYN,(R2) ; ENABLE RECEIVERE5 BR 180$ ;RETURN - INTERRUPT CODE PROPAGATES RECEIVEB;$@; CONTROL FUNCTION INITIATION (INITIATE OR TERMINATE CONTROLLER,; OR CHANGE OPERATING MODE);:170$: BNE 110$ ;IF NOT EQUAL, MODE CHANGE REQUESTC CMP (R2)+,(R2)+ ;POINT TO TXCSR BIS #MSTRST,(R2) ;RESET DEVICEF TSTB -(R1) ;START FUNCTION?V" BNE 100$ ;IF NON-ZERO, TERMINATE;C; DO START FUNCTION INITIATION;N, TST U.CW2(R5) ;DEVICE TO BE IN HALF DUPLEX? BPL 80$ ;NO, IF PLUS( BIS #HDPX,(R2) ;PUT IN HALF DUPLEX MODE-80$: MOV #INITMD,R0 ;GET WORD SIZE, SYNC MODEO) BISB U.SYNC(R5),R0 ;OR IN SYNC CHARACTERI+ MOV R0,-(R2) ;INITIALIZE DEVICE PARAMETERS; BIS #STRSYN!TRMRDY!SCHSYN,-(R2) ;NOW INITIALIZE CONTROLLERU) BIS #U2.ONL,U.CW2(R5) ;MARK UNIT ON LINE; BR 160$ ;RETURN SUCCESSFUL;R ; CAN'T ESTABLISH COMMUNICATIONS;C@90$: MOV #IE.DNR&377,R0 ;SAY CAN'T INITIALIZE DEVICE (NOT READY) BR 170$ ;DO I/O DONE;); FUNCTION WAS TERMINATE LINE;LE100$: BIC #^C,U.CW2(R5) ;CLEAR OPERATING STATUSN# BR 160$ ;RETURN SUCCESSFUL STATUSB;.$; SERVICE DEVICE MODE CHANGE REQUEST;R6110$: BITB #IO.HDX,-(R1) ;SUBFUNCTION SAY HALF DUPLEX? BEQ 120$ ;IF ZERO, NOA6 BIS #U2.HDX,U.CW2(R5) ;SAY HALF DUPLEX CHARACTERISTIC1120$: BITB #IO.FDX,(R1) ;SET MODE TO FULL DUPLEX?S! BEQ 150$ ;DON'T SET FULL DUPLEXM, BIT #U2.LIN,U.CW2(R5) ;IS LINK FULL DUPLEX?" BEQ 140$ ;IF SO, RUN FULL DUPLEX2130$: MOV #IE.IFC&377,R0 ;MARK AS ILLEGAL FUNCTION BR 170$ ;AND TERMINATE6140$: BIC #U2.HDX,U.CW2(R5) ;PUT IN FULL DUPLEX IN UCB2150$: BITB #IO.SYN,(R1) ;SYNC CHARACTER SPECIFIED? BEQ 160$ ;NO, IF NOT SET9 MOVB I.PRM-I.FCN(R1),U.SYNC(R5) ;MARK NEW SYNC CHARACTERFXWSUCC: ;REFERENCE LABEL22160$: MOV #IS.SUC&377,R0 ;RETURN SUCCESSFUL STATUSXWFIN: ;REFERENCE LABEL-170$: CLRB S.STS(R4) ;CLEAR CONTROLLER STATUSB- BICB #US.BSY,U.STS(R5) ;MARK UNIT IDLE, ALSOQ! MOV R0,-(SP) ;SAVE STATUS WORD 1$- MOV S.PKT(R4),-(SP) ;SAVE OLD PACKET ADDRESS" CALL XWINI ;INITIATE NEXT PACKET% MOV (SP)+,R3 ;GET OLD PACKET ADDRESS 0 MOV I.PRM+4(R3),R1 ;RETURN REQUESTED ITEM COUNT$ MOV (SP)+,R0 ;RESTORE STATUS WORD 1$ CALLR $IOFIN ;TERMINATE OLD PACKET180$: RETURN ;;U; POWER FAIL SERVICE;XWPWF: ;REFERENCE LABEL( CLRB S.CTM(R4) ;DISABLE DEVICE TIMEOUTS3 MOV #IE.DNR&377,R0 ;PUT ERROR CODE IN R0 FOR DWTMOB BR XWOUT ;FINISH I/O ABORT;T; I/O CANCELLATION SERVICE;V ; INPUTS: ; R0=I/O PACKET ADDRESS#; R1=TCB ADDRESS OF TASK TO CANCEL ; R4=SCB ADDRESSK; R5=UCB ADDRESSGXWCAN: ;;;REFERENCE LABEL* CMP R1,I.TCB(R0) ;;;CANCEL FOR THIS TASK? BNE 180$ ;;;JUST RETURN IF NOT4 CMPB #IO.WLB/256.,I.FCN+1(R0) ;;;TRANSMIT FUNCTION?! BEQ 180$ ;;;LET TRANSMIT FINISH% TST U.RCNT(R5) ;;;RECEIVER FINISHED?. BLE 180$ ;;;RETURN IF YESU0 BIC #RCVENB!SCHSYN,@S.CSR(R4) ;DISABLE RECEIVER5 MOV #IE.ABO&377,R0 ;;;PUT ERROR CODE IN R0 FOR XWOUTL' BR XWOUT ;;;FINISH OFF RECEIVE PACKET/;K; TIMEOUT SERVICE ROUTINES;F ; INPUTS:N; &; R0 = DEVICE TIMEOUT STATUS 'IE.DNR'; R3 = CONTROLLER INDEX; R4 = ADDRESS OF SCB; R5 = ADDRESS OF UCB;XWOUT: ;;;REFERENCE LABEL% MOV S.CSR(R4),R4 ;;;GET RECEIVER CSRN4 BIC #TXINTE!SEND!DNAEN,4(R4) ;;;DISABLE TRANSMITTER" BIC #RTS,(R4) ;;;TURN OFF CARRIER MTPS #0 ;;;ALLOW INTERRUPTS,210$: JMP XWTXND ;WAIT FOR SOFTWARE TIMEOUT .DSAB00\@_G_4^eaekL LSBO 7;;-; **- $XWINP - DUP-11 INPUT INTERRUPT SERVICE;;I$XWINP:: ;;;REFERENCE LABELI5 INTSV$ XW,PR5,D$$W11 ;;;GENERATE INTERRUPT SAVE CODEI( CALL XWSET ;;;SET CSR IN R4, UCB IN R5+ BIC #STRSYN,(R4)+ ;;; EXIT STRIP SYNC MODED- MOV (R4),R4 ;;;CONTENTS OF RCV BUFFER IN R4L) MOV KISAR6,-(SP) ;;;SAVE CURRENT MAPPINGB, MOV U.RBUF(R5),KISAR6 ;;;MAP TO USER BUFFER3 MOVB R4,@U.RBUF+2(R5) ;;;STORE BYTE IN USER BUFFER;, MOV (SP)+,KISAR6 ;;;RESTORE CURRENT MAPPING) DEC U.RCNT(R5) ;;;SEE IF COUNT SATISFIED; BEQ 30$ ;;;YES, IF EQUAL& INC U.RBUF+2(R5) ;;;BUMP BYTE ADDRESS3 BIT #20000,U.RBUF+2(R5) ;;;OVERFLOWED 4K BOUNDARY?  BEQ 20$ ;;;NO, IF ZERO. BIC #20000,U.RBUF+2(R5) ;;;CLEAR OVERFLOW BIT! ADD #200,U.RBUF(R5) ;;;BUMP BIAS$20$: RETURN ;;;EXIT FROM INTERRUPT;N; REQUEST SATISFIEDP;;30$: ;REFERENCE LABEL$ MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS+ BIC #RCVENB,@S.CSR(R4) ;;;DISABLE RECEIVERS CALL $FORK ;;;GO TO FORK LEVEL% JMP XWSUCC ;COMPLETE SUCCESSFUL I/O  S; ,; **- $XWOUT - TRANSMITTER INTERRUPT SERVICE;C$XWOUT:: ;;;REFERENCE LABELS5 INTSV$ XW,PR5,D$$W11 ;;;GENERATE INTERRUPT SAVE CODE0 CALL XWSET ;;;SET RECEIVE CSR IN R4, UCB IN R5 ADD #4,R4 ;;;POINT TO TX CSR" TST (R4)+ ;;;DATA NOT AVAILABLE? BPL 10$ ;;;NO, IF NOT SET; ; CHECK DATA LATE;& TSTB -2(R4) ;;;TRANSMITTER DONE SET?& BPL 60$ ;;;IF NOT, DISMISS INTERRUPT*10$: BIT #CTS,-6(R4) ;;;CLEAR TO SEND SET? BEQ 20$ ;;;IF NOT, SEND A SYNC$ TSTB U.NSYC(R5) ;;;SYNC COUNT ZERO?" BEQ 30$ ;;;IF YES, TRANSMIT DATA/ DECB U.NSYC(R5) ;;;DECREMENT SYNC LEADER COUNTI! BLE 30$ ;;;IF LE, TRANSMIT DATAE220$: MOVB U.SYNC(R5),(R4) ;;;SEND A SYNC CHARACTER BR 50$ ;;;EXIT;4; SET UP AND TRANSMIT A BYTE; /30$: DEC U.CNT(R5) ;;;CHECK COUNT (0 NOT VALID)E BGE 40$ ;;;IF NOT, CONTINUE! TST U.CW2(R5) ;;;IN HALF DUPLEX? " BPL 80$ ;;;IF NOT, NO TURNAROUND% CMP #-3,U.CNT(R5) ;;;SENT TWO MARKS? $ BGE 70$ ;;;IF SO, TURN LINE AROUND MOVB #-1,(R4) ;;;OUTPUT A MARKC BR 50$ ;;;DISMISS INTERRUPTE.40$: CALL $GTBYT ;;;GET NEXT BYTE FROM BUFFER$ MOVB (SP)+,(R4) ;;;OUTPUT CHARACTER-50$: MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS BACKN0 MOVB S.ITM(R4),S.CTM(R4) ;;;RESET TIMEOUT COUNT%60$: BR XWSXT ;;;EXIT FROM INTERRUPTU'70$: BIC #SEND,-(R4) ;;;DON'T IDLE SYNCE+ TST -(R4) ;;;CLEAR RECEIVE DONE AND ERROR;* BIC #SCHSYN!RTS,-(R4) ;;;TURN OFF CARRIER% BIS #SCHSYN,(R4) ;;;FORCE RESYNCHINGO' ADD #6,R4 ;;;POINT TO TRANSMIT BUFFERR880$: BIC #TXINTE!DNAEN!SEND,-(R4) ;;;DISABLE TRANSMITTER% CALL $FORK ;;;CREATE SYSTEM PROCESST- MOV #IS.SUC&377,R0 ;RETURN SUCCESSFUL STATUSPXWTXND: ;REFERENCE LABELR$ MOV U.SCB(R5),R4 ;RESTORE SCB TO R4 JMP XWFIN ;MARK COMPLETION .PAGE;6; XWSET - SET UP REGISTER R4 WITH CSR ADDRESS, R5 WITH8; UCB ADDRESS. UNIT NUMBER IN LOW ORDER 4 BITS OF UNIT.; XWSET: ;;;REFERENCE LABEL& TST R5 ;;;TEST FOR VALID UCB ADDRESS BEQ 10$ ;;;IF NO UCB, TROUBLE;' BIT #U2.ONL,U.CW2(R5) ;;;UNIT ON LINE?N+ BEQ 10$ ;;;IF NOT ON LINE, CAN'T TRANSFERC* MOV U.SCB(R5),R4 ;;;FIRST GET SCB ADDRESS+ MOV S.CSR(R4),R4 ;;;NOW DEVICE CSR ADDRESSX RETURN ;;;AND NOW RETURNV010$: TST (SP)+ ;;;CLEAR STACK OF RETURN ADDRESS'XWSXT: JMP $INTXT ;;;DISMISS INTERRUPTP .END R4 WITH CSR ADDRESS, R5 WITH8; UCB ADDRESS. UNIT NUMBER IN LOW ORDER 4 BITS OF UNIT.; XWSET: ;;;REFERENCE LABEL& TST R5 ;;;TEST FOR VALID UCB ADDRESS BEQ 10$ ;;;IF NO UCB, TROUBLE;' BIT #U2.ONL,U.CW2(R5) ;;;UNIT ON LINE?N+ BEQ 10$ ;;;IF NOT ON LINE, C ADDRESS ADD R4,R3 ;;;REALLY GET IT520$: CMP S.WCCH(R4),U.MAXC(R3) ;;;GOING TO NEXT AD11?T! BLOS 40$ ;;;IF LOS NO--ALL DONET;H ; MOVE TO THE NEXT A/D CONVERTOR;  .IF DF A$$M11; BICB #^C<77>,S.WCHB(R4) ;;;ASSUME AM11/ABS CHAN ADDRESSING.! BIT #UF$AMK,U.FLG(R3) ;;;AM11-K?N# BEQ 25$ ;;;IF EQ NO--MUST RE-MASKE2 BIT #S$WACA,S.WFL2(R4) ;;;ABS CHANNEL ADDRESSING?$ BNE 30$ ;;;IF NE YES--MASK IS FINE .ENDC ;A$$M11?25$: BICB #^C<17>,S.WCHB(R4) ;;;NO--MUST RE-MASK TO 16 CHANNELSC*30$: A00H_K_^DATADATADATADATADATADATADATADD #U.LGTH,R3 ;;;MOVE R3 TO NEXT UCB% MOV R3,S.WAUA(R4) ;;;POINT SWB TO ITO6 SUB R4,S.WAUA(R4) ;;;MAKE IT RELATIVE TO START OF SWB9 MOV U.CSR(R3),S.WCSR(R4) ;;;PUT ACTIVE UNIT CSR INTO SWB .ENDC ;N$AD11-140$: RETURN ;;;/; (; ALL REQUESTED CHANNELS ARE DONE--RESET;MD60$: MOV S.WCHX(R4),S.WNCH(R4) ;;;RESET THE NUMBER OF CHANNELS TO DO4 MOV S.WICH(R4),S.WCCH(R4) ;;;AND THE CHANNEL NUMBER1 MOVB S.WCBX(R4),S.WCHB(R4) ;;;RESET CHANNEL BYTE. ;;;DROP INTO .ADXCH K+ .SBTTL .ADXCH COMPUTE UCB ADDRESS FOR AD11 ;+0; .ADXCH -- COMPUTE THE UCB ADDRESS FOR THE AD11;B=; THIS ROUTINE COMPUTES THE UCB ADDRESS OF THE AD11 GIVEN THER,; CHANNEL NUMBER IN THE SWEEP CONTROL BLOCK.; ; INPUTS:D;1&; R4 POINTS TO A/D SWEEP CONTROL BLOCK; .ADSWB SETUP;N ; OUTPUTS:;0; R3 POINTS TO CORRECT UCB; S.WAUA SETUP IN THE SWBN; S.WCSR SET UP IN SWB;,; NOTE:);;:; THIS ROUTINE MAY BE EXECUTED AT EITHER TASK OR INTERRUPT; LEVEL.;.;- .IF GT N$AD11-1 .ADXCH::MOV R4,R3 ;POINT TO SWB& ADD #S.WUCB,R3 ;POINT UP TO FIRST UCB<20$: CMP S.WCCH(R4),U.MAXC(R3) ;CAN CHANNEL BE ON THIS UNIT?* BLOS 40$ ;IF LOS YES--FOUND CORRECT UNIT% ADD #U.LGTH,R3 ;NO--BUMP TO NEXT UCB BR 20$ ;KEEP A'LOOKING/40$: MOV R3,S.WAUA(R4) ;POINT TO UCB IN THE SWB5 SUB R4,S.WAUA(R4) ;MAKE PTR RELATIVE TO START OF SWBA3 MOV U.CSR(R3),S.WCSR(R4) ;SET CSR ADDRESS INTO SWBE ;FOR FASTER ACCESS  .ENDC ;N$AD11-1 RETURN ;BACK TO CALLER. .ENDC ;N$AD11 .END.ADXCH::MOV R4,R3 ;POIN) .TITLE KBFSTS RETURN SWEEP BUFFER STATUST .IDENT /M01.02/;4 ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.N;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01.01 ; B. SCHREIBER 16-AUG-77;E; MODIFIED BY:;U; M. S. HARVEY 11-MAY-795; MSH031 -- CORRECT EVENT FLAG AND ARG LIST HANDLINGA;O1; TL092 -- CORRECT IWTBUF USE OF THE DEFAULT EFNN; C; THIS ROUTINE RETURNS INFORMATION ABOUT BUFFERS IN USE FOR A SWEEP ;U; SYSTEM MACRO CALLS;O .MCALL WTSE$S, KSWDF$, CLEF$S KSWDF$ Q# .SBTTL IBFSTS RETURN BUFFER STATUSE;+ ; IBFSTS -- RETURN BUFFER STATUS;I; CALLING SEQUENCE:E; ; CALL IBFSTS (IBUF, ISTAT)E;Y ; INPUTS:;E'; IBUF IS THE 'IBUF' FROM A SWEEP STARTE5; ISTAT IS AN ARRAY OF DIMENSION 'N' (N IS THE NUMBER3(; OF BUFFERS) WHICH RECEIVES THE STATUS; 2 IN DEVICE QUEUEO; 1 IN USER QUEUEH ; 0 UNKNOWN; -1 CURRENT BUFFERR;I;-"IBFSTS::TST (R5)+ ;SKIP ARG COUNT MOV (R5)+,R0 ;GET IBUF ADDRESSO MOV (R5)+,R2 ;GET ISTAT ADDRESS MOV R2,R3 ;COPY FOR A SECOND+ MOV IB.NBF(R0),R4 ;GET # OF BUFFERS IN USEN&20$: CLR (R3)+ ;CLEAR OUT ISTAT ARRAY DEC R4A BGT 20$ ;... CALL .FDSWI ;FIND SWB BCS 120$ ;SKIP IT IF NOT FOUND" MTPS #PR6 ;;;LOCK OUT INTERRUPTS0 MOVB S.WBNO(R1),R3 ;;;GET CURRENT BUFFER NUMBER ASL R3 ;;;MAKE WORD INDEX % ADD R2,R3 ;;;POINT INTO ISTAT ARRAY3 MOV #-1,(R3) ;;;STORE CURRENT BUFFER STATUS FOR ITS MOV R0,R3 ;;;POINT AT IBUF( ADD #IB.DVQ,R3 ;;;POINT TO DEVICE QUEUE+ MOV #2,R4 ;;;SET 'IN DEVICE QUEUE' STATUS %40$: MOVB (R3)+,R5 ;;;GET NEXT BUFFER  BMI 60$ ;;;IF MI END OF QUEUE+ ASL R5 ;;;MAKE WORD INDEXC ADD R2,R5 ;;;INDEX INTO ISTATI MOV R4,(R5) ;;;STORE STATUSI BR 40$ ;;;CONTINUE260$: ADD #IB.USQ,R0 ;;;POINT TO USER QUEUE IN IBUF DEC R4 ;;;MA00P_`T_4^eaekKE A 2 INTO A 1L380$: MOVB (R0)+,R5 ;;;GET NEXT ITEM FROM USER QUEUES BMI 100$ ;;;IF MI ALL DONE ASL R5 ;;;MAKE WORD INDEXR ADD R2,R5 ;;;POINT INTO ISTATF MOV R4,(R5) ;;;STORE STATUSE BR 80$ ;;;CONTINUE"100$: MTPS #0 ;;;ALLOW INTERRUPTS 120$: RETURN 5 .SBTTL IWTBUF WAIT FOR BUFFER;+#; IWTBUF -- WAIT FOR BUFFER TO FILLR;N;; THIS ROUTINE WAITS FOR A BUFFER TO FILL BY WAITING ON THEE; SPECIFIED EVENT FLAG.T;E; CALLING SEQUENCE: ;P(; IBUFNO = IWTBUF (IBUF, IEFN [,IBUFNO]);A ; INPUTS:L;0-; IBUF IS THE 'IBUF' PARAM FROM A SWEEP STARTU3; IEFN IS (HOPEFULLY) THE 'IEFN' FROM A SWEEP STARTR;N ; OUTPUTS:;5*; IBUFNO IS THE NEXT BUFFER NUMBER TO USE.;S;+;-$IWTBUF::MOVB (R5),R3 ;GET ARG COUNT" TST (R5)+ ;POINT TO IBUF POINTER MOV (R5)+,R0 ;GET IBUF POINTER) MOV .KDFEF,R2 ;ASSUME DEFAULT EVENT FLAGN' CMP R3,#2 ;IS IEFN ARGUMENT POSSIBLE?L BLT 3$ ;IF LT NO& CMP (R5),#-1 ;USE DEFAULT EVENT FLAG? BEQ 3$ ;IF EQ YESB- TST @(R5) ;ARE WE SURE ITS NOT THE DEFAULT?U# BEQ 3$ ;IF EQ NO, ITS THE DEFAULTF MOV @(R5),R2 ;GET EVENT FLAGH(3$: TST (R5)+ ;POINT TO IBUFNO ARGUMENT* CALL .FDSWI ;FIND SWB ASSOCIATED WITH IT BCS 6$ ;IF CS SKIP IT+' TST S.WSTS(R1) ;IS SWEEP STILL ACTIVE?U) BNE 5$ ;IF NE WE ARE NO LONGER SAMPLINGV ;SO GO RETURN -1 TO USER1 MOVB IB.USQ(R0),R1 ;SEE IF A BUFFER IS AVAILABLE,# BPL 5$ ;IF PL BUFFER IS AVAILABLET WTSE$S R2 ;WAIT FOR ONE- 5$: CLEF$S R2 ;CLEAR EVENT FLAG 6$: BR IGTB0 ;GO TO COMMON CODE U .SBTTL IGTBUF GET BUFFER NUMBER ; IGTBUF -- RETURN BUFFER NUMBER;)4; THIS ROUTINE RETURNS THE NEXT BUFFER NUMBER TO USE;U; CALLING SEQUENCE:F; "; IBUFNO = IGTBUF (IBUF [,IBUFNO]); ; INPUTS:T;S1; IBUF IS THE 'IBUF' FROM A CALL TO START A SWEEP ;A ; OUTPUTS:;M$; IBUFNO IS THE BUFFER NUMBER TO USE;V;-)IGTBUF::MOVB (R5),R3 ;GET ARGUMENT COUNTB INC R3 ;MAKE SAME AS IWTBUFL TST (R5)+ ;SKIP COUNT WORD# MOV (R5)+,R0 ;GET IBUF/USW ADDRESS$-IGTB0: CALL .FDSWI ;FIND SWEEP CONTROL BLOC .TITLE DQDRV .IDENT /04.07/ ;5; COPYRIGHT (C) 1981 BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; VERSION 04.07;; P. J. BEZEREDI 01-NOV-77;; PREVIOUSLY MODIFIED BY:;; P. J. BEZEREDI;; MODIFIED BY:;; P. J. BEZEREDI 06-DEC-79;4; PB144 -- RETURN IE.BBE IF MANUFACTURER BAD HEADER; IS DETECTED.;; R. T. PERRON 12-DEC-79;Q/; RP026 -- CORRECT MULTI-CONTROLLER OPERATION.9;B; R. T. PERRON 16-OCT-80;O2; RP040 -- CORRECT SEEK ERROR RECOVERY ALGORITHM.;I; P. J. BEZEREDI 18-MAR-81; -; PB228 -- ADD SUPPORT FOR RLV12 CONTROLLER.E; ; P. J. BEZEREDI 08-APR-81; 4; PB232 -- RESTORE SCB ADDRESS AFTER CALL TO $FORK.;Y; P. J. BEZEREDI 09-APR-81;E;; PB235 -- ADDITION OF REQUEST QUEUE OPTIMIZATION SUPPORT.;P; P. J. BEZEREDI 06-MAY-81;C3; PB242 -- ADD SUPPORT FOR RTEM AND CLEANUP A BIT.N;-; RL11/RL01 DISK DRIVERO;C;U.MCALL HWDDF$,PKTDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS; ;****************.; ; EQUATED SYMBOLS;,RETRY= ^D<8> ;CONTROLLER ERROR RETRY COUNT;RLCNT= ^D<7> ;NUMBER OF REGISTERS TO LOG ON ERROR ; PB228 2RLBPT= ^D<512*20> ;BYTES PER RL01 SURFACE ;**-1)RLSPU= ^D<15> ;TIME FOR RL01 TO SPIN UPSLD$DQ=0P;I;****************P; ; RL11 DEVICE REGISTER OFFSETS;2"RLCS= 0 ;CONTROL STATUS REGISTERRLBA= 2 ;BUS ADDRESS REGISTERD RLDA= 4 ;DISK ADDRESS REGISTER!RLMP= 6 ;MULTI-PURPOSE REGISTERS4RLBAE= 10 ;BUS ADDRESS EXTENSION REGISTER ; PB228;*;****************A; ; RLCS BIT ASSIGNMENTS; ERR= 100000 ;COMPOSITE ERRORDE= 040000 ;DRIVE ERRORE"NXM= 020000 ;NON-EXISTANT MEMORYDLT= 010000 ;DATA LATEHNF= 010000 ;HEADER NOT FOUND<DCK= 004000 ;DATA CHECK ERROR HCRC= 004000 ;HEADER CRC ERROR#OPI= 002000 ;OPERATION INCOMPLETE2/A17= 000040 ;EXTENDED ADDRESS BIT 17 ; PB2200`X_K_^DATADATADATADATADATADATADATA8B/A16= 000020 ;EXTENDED ADDRESS BIT 16 ; PB228IDRDY= 1 ;DRIVE READYWCHK= 2 ;WRITE CHECK FUNCTIONSWRITE= 2 ;WRITE OFFSET$GSTS= 4 ;GET DRIVE STATUS FUNCTIONSEEK= 6 ;SEEK FUNCTION RDH= 10 ;READ HEADERS FUNCTIONREAD= 14 ;READ DATA FUNCTIONIE= 100 ;INTERRUPT ENABLEOCRDY= 200 ;CONTROLLER READYN;0;**************** ;N; RLDA STATUS CODEST;HMRK= 1 ;MARKER BITSTS= 2 ;GET STATUS BITSN= 4 ;SIGN BIT FOR SEEKRST= 10 ;DRIVE RESET BIT(HS= 20 ;HEAD SELECT BIT FOR DIFFERENCE,REV= 200!MRK ;REVERSE SEEK DIFFERENCE WORD;D;**************** ;W!; RLMP GET STATUS BIT ASSIGNMENTSR; WDE= 100000 ;WRITE DATA ERRORU!CHE= 040000 ;CURRENT HEAD ERRORN WLS= 020000 ;WRITE LOCK STATUS"SKTO= 010000 ;SEEK TIMEOUT ERRORSPD= 004000 ;SPEED ERRORWGE= 002000 ;WRITE GATE ERROR0VC= 001000 ;VOLUME CHECK!DSE= 000400 ;DRIVE SELECT ERRORADT= 000200 ;DRIVE TYPE!HSS= 000100 ;HEAD SELECT STATUSKCO= 000040 ;COVER OPENHH= 000020 ;HEADS HOMEBH= 000010 ;BRUSHES HOME.SLM= 000005 ;DRIVE IN SEEK-LINEAR MODE STATE;*;****************P;T ; LOCAL DATA;N; CONTROLLER IMPURE DATA TABLESD,; THESE ARE INDEXED BY THE CONTROLLER NUMBER;L7RTTBL: .BLKW R$$L11 ;RETRY COUNT FOR CURRENT OPERATIONOBPRMSV: .BLKW R$$L11*6 ;PARAMETER SAVE AREA FOR WRITE CHECK ; PB228; ;**-1;;****************0;0;DRIVER DISPATCH TABLE;T> DDT$ DQ,R$$L11,NEW=Y,OPT=Y ;GENERATE DISPATCH TABLE ; PB228;0;****************H;0;+.; **-DLINI-RL11/RL01 DISK CONTROLLER INITIATOR;0B; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/OA; REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TOEE; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLER G; IS NOT BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST.CB; ELSE A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPTD; IS SUCCESSFUL, THEN THE NEXT I/O OPERATION IS INITIATED. A RETURN!; TO THE CALLER IS THEN EXECUTED.0;+ ; INPUTS:I8; R5= ADRS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;N ; OUTPUTS:?; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST ISE?; WAITING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THEF-; DRIVER INITIATES THE REQUESTED I/O FUNCTIONS;- DQINI: NOP NOP NOP CALL $GTPKT BCC X NOP RETURNTX: NOP;A1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:A;M$; R1= ADRS OF THE I/O REQUEST PACKET1; R2= PHYSICAL UNIT NUMBER OF THE REQUESTED DRIVE ; R3= CONTROLLER INDEX,; R4= ADRS OF THE STATUS CONTROL BLOCK (SCB)2; R5= ADRS OF THE UCB OF THE DRIVE TO BE INITIATED;I6; RL11/RL01 DISK CONTROLLER I/O REQUEST PACKET FORMAT:; !; WD. 00 -- I/O QUEUE THREAD WORDS/; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBERT1; WD. 02 -- ADRS OF THE TCB OF THE REQUESTOR TASK <; WD. 03 -- POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER1; WD. 04 -- CONTENTS OF FIRST LUN WORD (UCB ADRS) ; WD. 05 -- I/O FUNCTION CODEH,; WD. 06 -- VIRTUAL ADRS OF I/O STATUS BLOCK/; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCKN;; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT +140000)I/; WD. 11 -- VIRTUAL ADRS OF AST SERVICE ROUTINES1; WD. 12 -- MEMORY EXTENSION BITS OF I/O TRANSFERW'; WD. 13 -- BUFFER ADRS OF I/O TRANSFER ,; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED; WD. 15 -- NOT USED.D;; WD. 16 -- LOW BYTE MUST BE ZERO AND HIGH BYTE IS NOT USEDD9; WD. 17 -- LOW PART OF LOGICAL BLK NUMBER OF I/O REQUEST A; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. BLK. ELSE NOT USED C; WD. 21 -- DIAGN. REG. BLOCK ADDRESS (DISPL.+140000) ELSE NOT USEDS;O&; DRIVER USAGE OF WORDS IN I/O PACKET:5; I.PRM+6 (WD. 15) - EXTENDED ADDRESS BITS ; PB228-A; I.PRM+10 (WD. 16) - CYLINDER # OR DESIRED DISK ADDRESS ; PB235FI; I.PRM+12 (WD. 17) - SECTOR/SURFACE # OR BYTES REMAINING TO XFER ; PB235O; ;**-364 CALL $RQCND ;REQUEST ACCESS TO CONTROLLER ; PB2353 MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS ; PB235S, MOV S.KRB(R4),R3 ;GET KRB ADDRESS ; PB2426 MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX ; PB200``_T_4^eaek426 MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNT ; PB2424 CALL DLVV ;PROCESS VOLUME VALID FUNCTIONS ; PB2426 BIT #FE.EXT,$FMASK ;IS THIS A 22-BIT SYSTEM? ; PB228 BEQ 15$ ;IF EQ NO ; PB2287 BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? ; PB228  BEQ 10$ ;IF EQ NO ; PB2288 MOVB U.BUF+1(R5),R0 ;GET EXTENDED ADDRESS BITS ; PB2282 MOV R0,I.PRM+6(R1) ;SAVE THEM FOR LATER ; PB2281 ASH #4,R0 ;PUT THEM IN THE RIGHT PLACE ; PB228;1 BIC #^C<60>,R0 ;JUST GET THE LOW 2 BITS ; PB228E' MOV R0,U.BUF(R5) ;SAVE THEM ; PB228T BR 15$ ; ; PB228:10$: CALL $STMAP ;SETUP UNIBUS MAPPING REGISTERS ; PB228;15$: MOVB U.UNIT(R5),U.BUF+1(R5) ;SET UNIT NUMBER ; PB228 4 MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION ;**-226 BIS #READ!IE,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTION+ CMPB #IO.RLB/^D<256>,I.FCN+1(R1) ;REALLY?B- BHIS 20$ ;IF HIS FUNCTION IS LEGAL ; PB242R, CALLR DLFIN ;FUNCTION IS ILLEGAL ; PB242020$: BEQ 25$ ;IF EQ FUNCTION IS A READ ; PB242? SUB #WRITE,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTION ;**-3T>25$: MOV I.PRM+12(R1),R0 ;RETRIEVE SECTOR AND SURFACE ; PB2357 MOV I.PRM+10(R1),R2 ;RETRIEVE CYLINDER NUMBER ; PB235S) ASH #7,R2 ;PUT IT IN POSITION ; PB235R4 BIS R0,R2 ;MERGE IN THE SECTOR AND SURFACE ; PB2358 MOV R2,I.PRM+10(R1) ;SAVE DESIRED DISK ADDRESS ; PB2350 BIC #^C<77>,R0 ;ISOLATE SECTOR NUMBER ; PB235A MOV U.CNT(R5),I.PRM+12(R1) ;ASSUME ONLY ONE XFER NEEDED ; PB23521 MOV #^D<40>,R2 ;SET SECTORS PER SURFACE ; PB2356 SUB R0,R2 ;CALCULATE SECTORS LEFT ON SURFACE ; PB235- SWAB R2 ;GET BYTES LEFT ON SURFACE ; PB235C= CMP U.CNT(R5),R2 ;ARE ADDITIONAL TRANSFERS REQUIRED? ; PB235E BLOS 30$ ;IF LOS NO ; PB235< MOV R2,U.CNT(R5) ;SET BYTE COUNT FOR FIRST TRANSFER ; PB228030$: MOV S.KRB(R4),R3 ;GET KRB ADDRESS ; PB2356 MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX ; PB235; MUL #6,R3 ;FORM AN INDEX INTO PARAMETER SAVE AREA ; PB235O- ADD #PRMSV,R3 ;POINT TO THIS ENTRY ; PB235S6 MOV U.BUF(R5),(R3)+ ;SAVE INITIAL PARAMETERS ; PB235( MOV U.BUF+2(R5),(R3)+ ;... ; PB235% MOV U.CNT(R5),(R3)+ ;... ; PB235( MOV I.PRM+10(R1),(R3)+ ;... ; PB235( MOV I.PRM+12(R1),(R3)+ ;... ; PB235( MOV I.PRM+6(R1),(R3)+ ;... ; PB228 ;**-37R;+*; THIS SECTION WILL INITIATE THE OPERATION;-=DLINIO: BIT #FE.EXT,$FMASK ;IS THIS A 22-BIT SYSTEM? ; PB2282 BEQ 5$ ;IF EQ NO ; PB228I7 BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? ; PB228O BNE 5$ ;IF NE YES ; PB228/ CALL $MPUBM ;MAP UNIBUS TO TRANSFER ; PB228M55$: MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS ; PB228(4 MOV S.PKT(R4),R3 ;GET ADDRESS OF I/O PACKET ;**-11. CLRB U.CW2+1(R5) ;CLEAR DRIVE FLAGS ; PB242( CALL DLGST ;GET DRIVE STATUS ; PB242- MOV RLMP(R2),R1 ;GET THE STATUS INFO ;**-4 + BIC #WLS!DT!HSS,R1 ;REMOVE IRRELEVANT BITS.$ BIT #DRDY,(R2) ;IS THE DRIVE READY? BEQ 20$ ;IF EQ NO ; PB242= BITB #US.VV,U.STS(R5);IS SOFTWARE VOLUME VALID SET? ; PB2422 BEQ 10$ ;IF EQ NO ; PB242, BIT #VC,R1 ;IS VOLUME CHECK SET? ; PB242% BNE 25$ ;IF NE YES, ERROR ; PB242 *10$: BIC #VC,R1 ;IGNORE VC BIT ; PB2427 CMP #HH!BH!SLM,R1 ;HEADS, BRUSHES AND STATE OK? ;**-1R BEQ 30$ ;IF EQ YES ; PB242S@20$: BITB #US.SPU,U.STS(R5) ;IS THE DRIVE SPINNING UP? ; PB2427 BNE DLPWF1 ;IF NE YES, WAIT FOR IT TO SPIN UP ; PB242./ CALL DLDVER ;LOG DRIVE NOT READY ERROR ;**-3 825$: MOV #IE.DNR&377,R0 ;SET RETURN ERROR CODE ; PB242$ CALLR DLFIN ;EXIT FATAL ; PB242>30$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UP ; PB242* CALL DLRST ;RESET DRIVE ERRORS ; PB242; MOV I.PRM+10(R3),R0 ;RETREIVE STARTING DISK ADDRESS ;**-31( CALL DLDIFF ;CALCULATE DIFFERENCE WORD3DLGO: BEQ 40$ ;IF EQ NO SEEK IS NECESSARY ; PB242T0 MOV #SEEK,R1 ;GET CODE FOR SEEK FUNCTION ;**-1 CALL DLXCT ;EXECUTE THE SEEK6 BMI DLEROR ;IF MI ERROR DURING SEEK FUNCTION ; PB242;40$: MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUT COUNT ; PB228 7 BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? ; PB228  BEQ 45$ ;IF EQ NO ; PB228? MOV I.PRM+6(R3),RLBAE(R2) 00`h_K_^DATADATADATADATADATADATADATA;LOAD EXTENDED ADDRESS BITS ; PB228+45$: ADD #RLMP,R2 ;POINT TO RLMP ; PB228A, MOV U.CNT(R5),R1 ;GET BYTE COUNT ; PB228& ROR R1 ;MAKE IT A WORD COUNT ;**-3 NEG R1 ;ALSO NEGATIVE MOV R1,(R2) ;LOAD WORD COUNT4 MOV I.PRM+10(R3),-(R2) ;LOAD STARTING DISK ADDRESS* MOV U.BUF+2(R5),-(R2) ;LOAD BUS ADDRESS( CALL $BMSET ;SET I/O ACTIVE BIT IN MAP, MOV U.BUF(R5),-(R2) ;;;LOAD FUNCTION AND GO;+<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;-DQCAN: RETURN ;;;NOP FOR RL11X;+:; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND>; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT=; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVER?; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANY A; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESSS; THE UNIT IS ALREADY READY.;-/DQPWF: TSTB S.STS(R4) ;IS DRIVE CURRENTLY BUSY? ! BEQ DLPWF2 ;IF EQ NO ; PB242I< MOVB #4,S.STS(R4) ;ALLOW FOR A FULL MINUTE TO SPIN UP ;**-1>DLPWF1: MOVB #RLSPU,S.CTM(R4);EXTEND TIMEOUT FOR UNIT ; PB242>DLPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UP ; PB242 RETURN ; ;**-2 ;+%; **-$DLINT-RL11/RL01 DISK CONTROLLER &; INTERRUPT AND ERROR SERVICE ROUTINES;-8 INTSE$ DQ,PR5,R$$L11 ;;;SAVE REGISTERS AND SET PRIORITY' CALL $FORK ;;;CREATE A SYSTEM PROCESSI1 MOV U.SCB(R5),R4 ;RETRIEVE SCB ADDRESS ; PB232R5 TSTB U.CW2+1(R5) ;REVERSE SEEK IN PROGRESS? ; PB242I" BMI DLINIO ;IF MI YES ; PB2422 MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS ; PB2357 MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL OPERATION ;**-5S. MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS# MOV (R2),R1 ;GET CONTENTS OF RLCSN. BMI DLEROR ;IF MI AN ERROR OCCURRED ; PB228@ SUB U.CNT(R5),I.PRM+12(R3) ;GET BYTES LEFT TO TRANSFER ; PB228' BEQ DLPASS ;IF EQ NONE LEFT ; PB228AA MOV I.PRM+12(R3),U.CNT(R5) ;ASSUME LAST TRANSFER COMING ; PB228R= CMP I.PRM+12(R3),#RLBPT ;IS THIS THE LAST TRANSFER? ; PB228D! BLOS 10$ ;IF LOS YES ; PB228@< MOV #RLBPT,U.CNT(R5);TRANSFER A WHOLE TRACKS WORTH ; PB228810$: BIC #CRDY,R1 ;CLEAR CRDY TO START FUNCTION ; PB228? MOV R1,U.BUF(R5) ;SAVE CURRENT FUNCTION AND ADDRESS BITS ;**-8C4 MOV RLBA(R2),U.BUF+2(R5) ;SAVE CURRENT BUS ADDRESS7 BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? ; PB228P BEQ 20$ ;IF EQ NO ; PB228? MOV RLBAE(R2),I.PRM+6(R3) ;SAVE EXTENDED ADDRESS BITS ; PB228R;20$: MOV I.PRM+10(R3),R0 ;GET INITIAL DISK ADDRESS ; PB228 & MOV R0,R1 ;COPY DISK ADDRESS ;**-1- BIS #77,R0 ;UPDATE CYLINDER AND SURFACE ...A& INC R0 ;... LEAVING SECTOR BITS ZERO+ MOV R0,I.PRM+10(R3) ;SAVE NEW DISK ADDRESS80 CALL DLDIF0 ;CALCULATE MID-TRANSFER DIFFERENCE+ CALLR DLGO ;GO DO THE OPERATION ; PB242; ; PB2423DLEROR: BIT #DRDY,R1 ;IS THE DRIVE READY? ; PB242?! BNE DLERR ;IF NE YES ; PB242;> MOVB S.ITM(R4),S.CTM(R4) ;WAIT FOR DRIVE TO QUIESCE ; PB242; MOVB #1,U.CW2+1(R5) ;FLAG SETTLE DOWN IN PROGRESS ; PB242  RETURN ; ;**-6C7DLERR: MOV (R2),R1 ;RETRIEVE CONTENTS OF RLCS ; PB242 5 BITB #IQ.UMD,I.FCN(R3) ;DIAGNOSTIC FUNCTION? ;**-1M3 BNE DLPASS ;IF NE YES, GO PASS REGISTERS ; PB242I) MOV R1,-(SP) ;SAVE RLCS CONTENTS ;**-1L CALL DLDVER ;LOG DEVICE ERROR 1 MOV (SP),R1 ;RETRIEVE CONTENTS OF RLCS ; PB144T5 MOV #IE.BBE&377,R0 ;ASSUME BAD BLOCK ERROR ; PB144 % COM (SP) ;TOGGLE THE BITS ; PB144T0 BIT #HCRC!OPI,(SP)+ ;BAD BLOCK ERROR? ; PB144! BEQ DLFIN ;IF EQ YES ; PB144 6 MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERROR ;**-1# BIT #NXM,R1 ;NON-EXISTANT MEMORY?B! BNE DLFIN ;IF NE YES ; PB242F% BIT #DE,R1 ;DRIVE PROBLEMS? ;**-1E BEQ 50$ ;IF EQ NO ; PB2425 CALL DLGST ;EXECUTE GET DRIVE STATUS FUNCTION ;**-1R% BIT #WGE,RLMP(R2) ;WRITE GATE ERROR?T BEQ DLFIN ;IF EQ NO ; PB2425 BIT #WLS,RLMP(R2) ;IS THE DRIVE WRITE LOCKED? ;**-1 BEQ DLRTY ;IF EQ NO ; PB2425 MOV #IE.WLK&377,R0 ;SET WRITE LOCK ERROR CODE ;**-1 BR DLFIN ; ; PB242750$: BIT #10,U.BUF(R5) ;WRITE CHECK FUNCTION? ; PB242 BNE DLRTY ;IF NE NO ;00`p_T_4^eaek PB242, BIT #OPI,R1 ;OPERATION INCOMPLETE? ;**-3! BNE DLRTY ;IF NE YES ; PB242*) BIT #DCK,R1 ;WRITE CHECK ERROR? ;**-1 BEQ DLRTY ;IF EQ NO ; PB242: MOV #IE.WCK&377,R0 ;YES, SET WRITE CHECK ERROR CODE ;**-1=DLRTY: MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS ; PB242W/ BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES? ;**-1P! BNE DLFIN ;IF NE YES ; PB242E1 MOV S.KRB(R4),R3 ;RETRIEVE KRB ADDRESS ; PB2422 MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX ; PB242/ DECB RTTBL(R3) ;ANY MORE RETRIES LEFT? ;**-1, BLE DLFIN ;IF LE NO ; PB242/DLIO: CALL DLRST ;RESET DRIVE ERRORS ; PB2421. JMP DLINIO ;RETRY ENTIRE OPERATION ; PB242 ;**-2>DLPASS: BITB #IQ.UMD,I.FCN(R3) ;DIAGNOSTIC FUNCTION? ; PB242 BEQ 10$ ;IF EQ NO ; PB242; MOV I.PRM+14(R3),KISAR6 ;SET BUFFER RELOCATION BIAS ;**-2R1 MOV I.PRM+16(R3),R3 ;GET REGISTER BUFFER ADDRESSE) CALL REGPAS ;MOVE REGISTERS INTO BUFFER  BR DLFIN ;EXIT ; PB242B10$: BITB #IO.WLC&377,I.FCN(R3) ;WRITE WITH WRITE CHECK? ; PB242 BNE 20$ ;IF NE YES ; PB242N5 BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED? ;**-3 BEQ DLFIN ;IF EQ NO ; PB242920$: MOV U.BUF(R5),R1 ;GET CURRENT FUNCTION CODE ; PB242I4 BIT #WCHK,R1 ;WRITE OR WRITE CHECK FUNCTION? ;**-2 BEQ DLFIN ;IF EQ NO ; PB242. BIT #10,R1 ;WAS FUNCTION WRITE CHECK? ;**-1! BEQ DLFIN ;IF EQ YES ; PB242B, MOV S.KRB(R4),R1 ;GET KRB ADDRESS ; PB2356 MOVB K.CON(R1),R1 ;RETRIEVE CONTROLLER INDEX ; PB235/ MOV #RETRY,RTTBL(R1);RESET RETRY COUNT ;**-2P; MUL #6,R1 ;FORM AN INDEX INTO PARAMETER SAVE AREA ; RP0265 ADD #PRMSV,R1 ;... ;**-1 1 MOV (R1)+,U.BUF(R5) ;RESTORE STARTING PARAMETERSR MOV (R1)+,U.BUF+2(R5) ;... MOV (R1)+,U.CNT(R5) ;...  MOV (R1)+,I.PRM+10(R3) ;...  MOV (R1)+,I.PRM+12(R3) ;... ( MOV (R1)+,I.PRM+6(R3) ;... ; PB228* BR DLIO ;START THE WRITE CHECK ; PB242 ; PB242;DLFIN: MOV S.PKT(R4),R2 ;GET ADDRESS OF I/O PACKET ; PB242E3 MOV I.PRM+4(R2),R1 ;GET TOTAL TRANSFER SIZE ;**-4E9 SUB I.PRM+12(R2),R1 ;CALCULATE BYTES TRANSFERED ; PB228A, MOV S.KRB(R4),R3 ;GET KRB ADDRESS ; PB2356 MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX ; PB2351 MOVB RTTBL(R3),R2 ;GET FINAL RETRY COUNT ;**-2U3 BIS #RETRY*^D<256>,R2 ;MERGE STARTING RETRY COUNT(. CALL $RLCN ;RELEASE THE CONTROLLER ; PB235# CALL $IODON ;FINISH I/O OPERATIONT! JMP DQINI ;PROCESS NEXT REQUEST;;+$; **-DLOUT-RL11/RL01 DISK CONTROLLER; DEVICE TIMEOUT ROUTINE;V9; DEVICE TIMEOUT RESULTS IN THE OPERATION BEING REPEATED.M=; TIMEOUTS ARE USUALLY CAUSED BY A POWER FAILURE BUT MAY ALSO)*; BE THE RESULT OF A HARDWARE MALFUNCTION.;-6DQOUT: MOV S.PKT(R4),R3 ;;;RETREIVE I/O PACKET ADDRESS1 BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP?6 BEQ 20$ ;;;IF EQ NO ; PB2426 DECB S.STS(R4) ;;;HAVE WE WAITED A MINUTE YET? ;**-1 BNE 10$ ;;;IF NE NO ; PB242/ INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY ;**-1T( BR 30$ ;;;LOG DEVICE TIMEOUT ; PB242+10$: MTPS #0 ;;;ALLOW INTERRUPTS ; PB242H+ BR DLIO ;RETRY ENTIRE OPERATION ; PB242U920$: ASRB U.CW2+1(R5) ;;;IS DRIVE SETTLING DOWN? ; PB242S BNE 30$ ;;;IF NE NO ; PB242) MTPS #0 ;;;YES, ALLOW INTERUPTS ;**-5 ( JMP DLERR ;PROCESS THE ERROR ; PB242+30$: MTPS #0 ;;;ALLOW INTERRUPTS ; PB242N5 BITB #IQ.UMD,I.FCN(R3) ;DIAGNOSTIC FUNCTION? ;**-2E3 BNE DLPASS ;IF NE YES, GO PASS REGISTERS ; PB242 ) CALL DLDTER ;LOG DEVICE TIMEOUT ;**-11 MOV #IE.DNR&377,R0 ;SET DEVICE NOT READY ;**-1 & JMP DLRTY ;RETRY OPERATION ; PB242 ;**-6;+0; **-DLXCT,DLGST,DLRST-RL11/RL01 DISK CONTROLLER; FUNCTION EXECUTION ROUTINES;E5; THIS ROUTINE WILL EXECUTE A GET DRIVE STATUS OR ANYN9; NON-INTERRUPTABLE FUNCTION AND WAIT FOR ITS COMPLETION.;: ; INPUTS:;; R1 = FUNCTION CODE; R2 = CSR ADDRESS; R5 = UCB ADDRESS;C ; OUTPUTS: ; R1 = CONTENTS OF RLCS (TESTED); FUNCTION EXECUTEDB;-<DLRST: MOV #RST!STS!MRK,RLDA(R2) ;SET MESSAGE CODES IN RLDA/ CALL DLDST ;DO THE DRIVE RESET FIRST ; PB242T?DLGST: MOV #STS!MRK,RLDA(R2) ;SET MESSAGE CODES IN 00`x_K_^DATADATADATADATADATADATADATARLDA ;**-1T5DLDST: MOV #GSTS,R1 ;SET GET STATUS FUNCTION ; PB242E/DLXCT: MOV R1,-(SP) ;SAVE FUNCTION CODE ;**-1T/ MOVB U.UNIT(R5),1(SP);MERGE CURRENT DRIVE BITSI MOV (SP)+,(R2) ;LOAD RLCS;10$: BIT #100200,(R2) ;FUNCTION COMPLETE OR ERROR? ; PB242U BEQ 10$ ;IF EQ NO ; PB2423 MOV (R2),R1 ;SAVE RLCS AND TEST FOR ERRORS ;**-2- RETURN ;V;+%; **-DLDIFF-RL11/RL01 DISK CONTROLLER (; CYLINDER ADDRESS DIFFERENCE CALCULATOR; <; THIS SUBROUTINE CALCULATES THE DIFFERENCE WORD USED IN THE@; SEEK OPERATION. IF A HEADER CANNOT BE READ AFTER 16. RETRIES,A; AN ERROR WILL BE LOGGED AND A ONE CYLINDER REVERSE SEEK WILL BER=; ISSUED. THE SEEK IS FOLLOWED BY A READ HEADERS TO CAUSE AN ; INTERRUPT.;( ; INPUTS:O; R0 = DESIRED DISK ADDRESSU; ;**-1Q ; OUTPUTS:; R1 = DIFFERENCE WORD$; RLDA = LOADED WITH DIFFERENCE WORD&; IF EQ NO SEEK IS NECESSARY ;**-1;-7DLDIFF: MOV #RETRY*2,-(SP) ;SET READ HEADER RETRY COUNT :10$: MOV #RDH,R1 ;CODE FOR READ HEADERS FUNCTION ; PB242* CALL DLXCT ;EXECUTE THE FUNCTION ;**-1. BPL 20$ ;IF PL FUNCTION EXECUTED OK ; PB242% DEC (SP) ;ANY RETRIES LEFT? ;**-1R BGT 10$ ;IF GT YES ; PB242 > CMP (SP)+,(SP)+ ;REMOVE RETRY COUNT AND CALLERS ADDRESS ;**-1 CALL DLDVER ;LOG HEADER ERROR  CALL DLRST ;RESET DRIVE15 MOV #REV,RLDA(R2) ;LOAD REVERSE SEEK DIFFERENCE WORDD) MOV #SEEK,R1 ;GET CODE FOR SEEK FUNCTION-7 MOV #IE.VER&377,R0 ;ASSUME THE SEEK WILL FAIL ; PB242N CALL DLXCT ;EXECUTE THE SEEK& BMI DLFIN ;IF MI WE FAILED ; PB242- BIC #377,R1 ;CLEAR OUT FUNCTION BITS ;**-1I+ BIS #IE!RDH,R1 ;LOAD CODES FOR READ HEADER @ MOVB #200,U.CW2+1(R5);INDICATE REVERSE SEEK IN PROGRESS ; PB242< MOVB S.ITM(R4),S.CTM(R4) ;SET DEVICE TIMEOUT COUNTER ;**-1# MOV R1,(R2) ;LOAD FUNCTION AND GOL! RETURN ;WAIT FOR THE INTERRUPTL-20$: TST (SP)+ ;REMOVE RETRY COUNT ; PB242V. MOV RLMP(R2),R1 ;RETREIVE HEADER WORD ;**-13DLDIF0: BIC #77,R0 ;MASK OUT SECTOR BITS ; PB228L BIC #77,R1 ;... ;**-2B% CMP R0,R1 ;DO WE NEED TO DO A SEEK?B BEQ 40$ ;IF EQ NO ; PB242/ MOV R0,-(SP) ;SAVE DESIRED DISK ADDRESS ;**-1D' BIC #^C<100>,(SP) ;ISOLATE SURFACE BIT ( ASR (SP) ;PUT INTO THE PROPER POSITION ASR (SP) ;... ! BIC #100,R0 ;REMOVE SURFACE BIT BIC #100,R1 ;...) SUB R0,R1 ;SUBTRACT DESIRED FROM ACTUALN.; BEQ 30$ ;IF EQ ONLY CHANGE SURFACE ; PB242- BCC 30$ ;IF CC ACTUAL .GE. DESIRED ; PB242D6 NEG R1 ;ACTUAL < DESIRED, MAKE POSITIVE DIFFERE;**-21 BIS #SN,R1 ;SET SIGN FOR MOVE TO CENTER OF DISKD'30$: INC R1 ;SET MARKER BIT ; PB242Q+ BIS (SP)+,R1 ;MERGE IN SURFACE BIT ;**-1I& MOV R1,RLDA(R2) ;LOAD DIFFERENCE WORD40$: RETURN ; ; PB242P ;**-2;+%; **-DLDXXX-RL11/RL01 DISK CONTROLLER,; ERROR LOGGING ROUTINES;CB; THIS ROUTINE IS CALLED WHENEVER A DEVICE ERROR OR DEVICE TIMEOUTD; OCCURS. A CORE BLOCK THE SIZE OF THE REGISTER BUFFER IS ALLOCATEDB; AND THE UNIBUS REGISTERS ALONG WITH THE DRIVE STATUS INFORMATIONB; ARE TRANSFERED INTO THE CORE BLOCK AND THE APPROPRIATE EXECUTIVE>; ERROR LOGGING ROUTINE IS CALLED. FINALLY, THE CORE BLOCK IS<; DEALLOCATED AND THE CSR AND CONTROLLER INDEX ARE RESTORED.; ?; IF FOR ANY REASON THE CORE BLOCK CANNOT BE ALLOCATED THEN THEKB; EXECUTIVE ERROR LOGGING ROUTINE WILL NOT BE CALLED AND THE ERRORA; SEQUENCE NUMBER WILL BE UPDATED TO INDICATE THAT A MISSED ERROR ; CONDITION OCCURRED.R;F ; INPUTS:C; R2 = CSR ADDRESS; R4 = SCB ADDRESS; ; OUTPUTS:#; R0, R1 ARE DESTROYED ; PB242T"; R3 = CONTROLLER INDEX ;**-1;- .ENABL LSB ; PB242NADLDVER: MOV #$DVERR,-(SP) ;ADDRESS OF EXEC ERROR ROUTINE ; PB242  BR 10$ ; ; PB242BDLDTER: MOV #$DTOER,-(SP) ;ADDRESS OF EXEC TIMEOUT ROUTINE ; PB24210$: TST (SP)+ ; PB242 BR 30$ ; PB242N9 MOV #RLCNT*2,R1 ;GET NUMBER OF BYTES TO ALLOCATE ; PB242E, CALL $ALOCB ;ALLOCATE A CORE BLOCK ;**-6- BCC 20$ ;IF CC BLOCK WAS ALLOCATED ; PB242S5 INC $ERRSQ ;INDICATE A MISSED ERROR CONDITION ;**-1R< CMP (SP)+,#$DTOER ;ALLOCATION FAILURE, TIMEOUT IN PROGRES00`_T_4^eaekS? BNE 30$ ;IF NE NO ; PB2354 MOV @S.KRB(R4),R2 ;;;RETRIEVE CSR ADDRESS ; PB2350 BIC #IE,(R2) ;;;CLEAR INTERRUPT ENABLE ; PB235% MTPS #0 ;;;ALLOW INTERRUPTS ;**-2I7 BR 30$ ;DON'T LOG ERROR IF ALLOCATION FAILURE ; PB242 320$: MOV R0,R3 ;SET POINTER TO CORE BLOCK ; PB242C2 MOV @S.KRB(R4),R2 ;GET REAL CSR ADDRESS ; PB2354 CALL REGPAS ;MOVE REGISTERS INTO CORE BLOCK ;**-3$ MOV R0,R2 ;COPY CORE BLOCK ADDRESS. CALL @(SP)+ ;CALL EXEC ERROR LOGGING ROUTINE) MOV R2,R0 ;GET BACK CORE BLOCK ADDDRESS 3 MOV #RLCNT*2,R1 ;GET NUMBER OF BYTES TO DEALLOCATEC( CALL $DEACB ;DEALLOCATE THE CORE BLOCK030$: MOV S.KRB(R4),R3 ;GET KRB ADDRESS ; PB235- MOV (R3),R2 ;RETRIEVE CSR ADDRESS ; PB235F6 MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX ; PB235 RETURN ;**-3 .DSABL LSB ; PB242E;+@; MOVE THE CONTROLLER/DRIVE REGISTERS INTO THE SPECIFIED BUFFER.; ; INPUTS:V; R2 = CSR ADDRESS; R3 = BUFFER ADDRESSP;-!REGPAS: MOV (R2),(R3)+ ;MOVE RLCSV MOV RLBA(R2),(R3)+ ;MOVE RLBA MOV RLDA(R2),(R3)+ ;MOVE RLDA MOV RLMP(R2),(R3)+ ;MOVE RLMP& CLR (R3)+ ;ASSUME NO RLBAE ; PB2287 BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? ; PB2283 BEQ 10$ ;IF EQ NO ; PB228+ MOV RLBAE(R2),-2(R3);MOVE RLBAE ; PB228E.10$: CLR (R3)+ ;EXTRA WORD IS BLANK ; PB2287 CALL DLGST ;EXECUTE GET DRIVE STATUS FUNCTION ; PB228I- MOV RLMP(R2),(R3) ;SAVE DRIVE STATUS ;**-1V RETURN ;A ; PB242;+ ; PB2423; **-DLVV-PROCESS VOLUME VALID FUNCTIONS ; PB242); ; PB242RD; THIS ROUTINE WILL VALIDATE VOLUME VALID AND HANDLE DEVICE ; PB2428; SPECIFIC VOLUME VALID AND SIZING FUNCTIONS. ; PB242; ; PB242 ; INPUTS: ; PB242&; R1 = I/O PACKET ADDRESS ; PB242; R4 = SCB ADDRESS ; PB242+; R5 = UCB ADDRESS ; PB242; ; PB242T; OUTPUTS: ; PB242 ?; IF THIS IS A TRANSFER FUNCTION ONLY R0 IS DESTROYED. ; PB242 @; IF THIS IS A VOLUME VALID FUNCTION, THE PROPER ACTION ; PB242?; IS TAKEN AND CONTROL IS TRANSFERED DIRECTLY TO THE ; PB242E+; PROPER PLACE IN THE DRIVER. ; PB242 ;- ; PB242 ; PB2423DLVV: CALL $VOLVD ;VALIDATE VOLUME VALID ; PB242N$ BCS 20$ ;IF CS WE FAILED ; PB242/ TST R0 ;IS THIS A TRANSFER FUNCTION? ; PB242  BMI 30$ ;IF MI YES ; PB242 2 MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS ; PB242- MOV R1,R3 ;COPY I/O PACKET ADDRESS ; PB242 1 CALL DLRST ;RESET DRIVE AND GET STATUS ; PB242U+ TST I.PRM+2(R3) ;SIZE THE DISK? ; PB242K BPL 10$ ;IF PL NO ; PB242% TST (SP)+ ;REMOVE RETURN ; PB242E0 CALLR DLPASS ;PASS REGISTERS AND EXIT ; PB242:10$: BIT #VV$SET,I.PRM+2(R3) ;SET VOLUME VALID? ; PB242 BEQ 25$ ;IF EQ NO ; PB2425 MOV RLMP(R2),R1 ;GET THE STATUS INFORMATION ; PB242?. BIT #DRDY,(R2) ;IS THE DRIVE READY? ; PB242 BEQ 20$ ;IF EQ NO ; PB2425 BIC #WLS!DT!HSS,R1 ;REMOVE IRRELEVANT BITS ; PB242 9 CMP #HH!BH!SLM,R1 ;HEADS, BRUSHES AND STATE OK? ; PB242U BEQ 25$ ;IF EQ YES ; PB242??20$: BICB #US.VV,U.STS(R5);CLEAR SOFTWARE VOLUME VALID ; PB242 2 MOV #IE.DNR&377,R0 ;SET DRIVE NOT READY ; PB242)25$: TST (SP)+ ;REMOVE RETURN ; PB242R# CALLR DLFIN ;FINISH UP ; PB242Q30$: RETURN ; ; PB242M ; PB235;+ ; PB2353; **-DLCHK-VALIDATE AND CONVERT THE LBN ; PB235 ; ; PB235 B; THIS ROUTINE IS CALLED FROM $DRQRQ TO DO LBN PROCESSING ; PB235B; FOR DEVICES WHICH SUPPORT QUEUE OPTIMIZATION. IF BLKC2 ; PB235B; DETECTS AN ERROR IT WILL RETURN TO THE CORRECT PLACE IN ; PB235+; $DRQRQ AFTER CALLING $IOALT. ; PB235R; ; PB235N; INPUTS: ; PB235&; R1 = I/O PACKET ADDRESS ; PB235; R4 = SCB ADDRESS ; PB235Q; R5 = UCB ADDRESS ; PB235 ; ; PB235 ; OUTPUTS: ; PB235V@; IF THE CHECKS SUCCEED, THEN THE LBN IN THE I/O PACKET ; PB235=; IS REPLACED BY THE DISK ADDRESS. R1 IS PRESERVED. ; PB235; ; PB235 A; IF THE CHECKS FAIL, THE $IOALT IS ENTERED WITH A FINAL ; PB235I@; STATUS OF IE.BLK AND A RETURN TO THE CORRE00`_K_^DATADATADATADATADATADATADATACT PLACE IN ; PB235"; $DRQRQ IS EXECUTED. ; PB235; ; PB235S+; R0, R2, AND R3 ARE DESTROYED. ; PB235 ; ; PB235SE; NOTE: ALL FUNCTIONS PUT INTO THE DRIVER QUEUE ARRIVE HERE. ; PB235 E; THESE FUNCTIONS INCLUDE, IO.ATT, IO.DET, AND ACP FUNCTIONS. ; PB235B;- ; PB235 ; PB235 ; PB2357DQCHK: CALL $LEKAS ;CHECK FOR AN ACP FUNCTION ; PB235/ BCS 30$ ;IF CS IT IS, LEAVE IT ALONE ; PB235A< CMPB #IO.ATT/256.,I.FCN+1(R1) ;IS THIS AN ATTACH? ; PB235- BEQ 30$ ;IF EQ YES, LEAVE IT ALONE ; PB235 ; CMPB #IO.DET/256.,I.FCN+1(R1) ;IS THIS A DETACH? ; PB235 - BEQ 30$ ;IF EQ YES, LEAVE IT ALONE ; PB235U1 MOV I.FCN(R1),-(SP) ;GET FUNCTION CODE ; PB235B. BIC #7,(SP) ;REMOVE QUALIFIER BITS ; PB2359 CMP #IO.STC,(SP)+ ;IS IT A SET CHARACTERISTICS? ; PB235;- BEQ 30$ ;IF EQ YES, LEAVE IT ALONE ; PB235C= MOV I.PRM+12(R1),R0 ;RETRIEVE STARTING BLOCK NUMBER ; PB235V> BITB #IO.WPB&377,I.FCN(R1) ;PHYSICAL BLOCK FUNCTION? ; PB235 BNE 20$ ;IF NE YES ; PB235 2 CALL $BLKC2 ;CHECK LOGICAL BLOCK NUMBER ; PB2359 CMPB #IO.WLB/256.,I.FCN+1(R3) ;WRITE FUNCTION? ; PB235Q BNE 10$ ;IF NE NO ; PB235@ BITB #IO.WLT&377,I.FCN(R3) ;WRITE LAST TRACK FUNCTION? ; PB235 BNE 10$ ;IF NE YES ; PB2358 MOV R0,I.PRM+6(R3) ;SAVE STARTING BLOCK NUMBER ; PB2355 ADD #20.,(R1) ;ADD 1 TRACKS WORTH OF BLOCKS ; PB235I- MOV R3,R1 ;COPY I/O PACKET ADDRESS ; PB235 2 CALL $BLKC2 ;CHECK LOGICAL BLOCK NUMBER ; PB235C MOV I.PRM+6(R3),R0 ;RESTORE ORIGINAL STARTING BLOCK NUMBER ; PB235 010$: ASL R0 ;CONVERT BLOCKS TO SECTORS ; PB235;20$: MOV S.PKT(R4),R3 ;RETRIEVE I/O PACKET ADDRESS ; PB235 ! CLR R2 ;NO HIGH BITS ; PB235,3 CALL $CVLBN ;CONVERT LBN TO DISK ADDRESS ; PB2351+ ASH #6,R1 ;POSITION SURFACE BIT ; PB2353/ BIS R1,R0 ;MERGE SURFACE WITH SECTOR ; PB235,= MOV R0,I.PRM+12(R3) ;SAVE SECTOR AND SURFACE ADDRESS ; PB235 = MOV R2,I.PRM+10(R3) ;SAVE STARTING CYLINDER ADDRESS ; PB235K- MOV R3,R1 ;COPY I/O PACKET ADDRESS ; PB235O30$: RETURN ; ; PB235  ; PB228;+ ; PB2287; **-DLKRB-CONTROLLER ONLINE/OFFLINE ROUTINE ; PB228 ; ; PB228BD; THIS ROUTINE WILL HANDLE RECONFIGURATION CALLS FOR ONLINE ; PB228J; CONTROLLER AND OFFLINE CONTROLLER FOR THE RL11, RLV11 AND RLV12. ; PB228; ; PB228AK; FOR ONLINE, IT WILL DETERMINE IF THE RLBAE REGISTER EXISTS AND IF ; PB228SH; SO, IT WILL INSURE THAT THE ADDRESS BITS ARE REPLICATED IN THE ; PB228; CSR. ; PB228; ; PB228B2; FOR OFFLINE, KS.EXT WILL BE CLEARED. ; PB228; ; PB2288; INPUTS: ; PB228; R2 = KRB ADDRESS ; PB228; R3 = CTB ADDRESS ; PB228E%; C=1 IF OFFLINE REQUEST ; PB228O$; C=0 IF ONLINE REQUEST ; PB228; ; PB228H; OUTPUTS: ; PB228PA; FOR ONLINE, KS.EXT WILL BE SET IF THE CONTROLLER HAS A ; PB228B; VALID RLBAE. ; PB228-; FOR OFFLINE, KS.EXT IS CLEARED. ; PB228S;- ; PB228 ; PB2288DQKRB: BIC #KS.EXT,K.STS(R2) ;ASSUME NO RLBAE ; PB228* BCS 20$ ;IF CS OFFLINE REQUEST ; PB2286 BIT #FE.EXT,$FMASK ;IS THIS A 22-BIT SYSTEM? ; PB228 BEQ 20$ ;IF EQ NO ; PB2286 CALL $SGFIN ;TURN NXM'S INTO SET CARRY BITS ; PB228- MOV (R2),R4 ;RETREIVE CSR ADDRESS ; PB228 6 BIS #A16!A17,(R4) ;SET EXTENDED ADDRESS BITS ; PB228* CLR RLBAE(R4) ;CLEAR RLBAE BITS ; PB228. BCS 10$ ;IF CS RLBAE DOES NOT EXIST ; PB2288 BIT #A16!A17,(R4) ;DID THE ADDRESS BITS CLEAR? ; PB228 BNE 10$ ;IF NE NO ; PB2288 BIS #KS.EXT,K.STS(R2) ;YES, SET RLBAE PRESENT ; PB228410$: BIC #A16!A17,(R4) ;RESET ADDRESS BITS ; PB22820$: RETURN ; ; PB228B ; PB228;+ ; PB2282; **-DLUCB-UNIT ONLINE/OFFLINE ROUTINE ; PB228; ; PB228 D; THIS ROUTINE WILL HANDLE RECONFIGURATION CALLS FOR ONLINE ; PB228;; UNIT AND OFFLINE UNIT FOR RL01 AND RL02 DRIVES. ; PB228$; ; PB228 F; FOR ONLINE, IF KS.EXT IS SET THEN DV.EXT IS ALSO SET. THIS ; PB228D; IS DONE TO ELIMINATE UNNECESSARY CODE TO RETREIVE THE KRB 00`_a_b_c_d_k ; PB228; ADDRESS. ; PB2280; ; PB228)-; FOR OFFLINE, DV.EXT IS CLEARED. ; PB228 ; ; PB228 ; INPUTS: ; PB228$; R3 = CONTROLLER INDEX ; PB228; R4 = SCB ADDRESS ; PB228B; R5 = UCB ADDRESS ; PB228R$; C=1 IF ONLINE REQUEST ; PB228%; C=0 IF OFFLINE REQUEST ; PB228D; ; PB228B; OUTPUTS: ; PB228 <; FOR ONLINE, DV.EXT IS SET IN THE UCB IF KS.EXT IS ; PB228; SET IN THE KRB. ; PB228N-; FOR OFFLINE, DV.EXT IS CLEARED. ; PB228D;- ; PB228 ; PB2288DQUCB: BIC #DV.EXT,U.CW1(R5) ;ASSUME NO RLBAE ; PB228* BCS 10$ ;IF CS OFFLINE REQUEST ; PB2281 MOV S.KRB(R4),R2 ;RETREIVE KRB ADDRESS ; PB228E7 BIT #KS.EXT,K.STS(R2) ;DOES THE RLBAE EXIST? ; PB228  BEQ 10$ ;IF EQ NO ; PB2286 BIS #DV.EXT,U.CW1(R5) ;YES, SET BIT IN UCB ; PB22810$: RETURN ; ; PB228  ;**-1 .ENDISET IN THE UCB IF KS.EXT IS ; PB228; SET IN THE KRB. ; PB228N-; FOR OFFLINE, DV.EXT IS CLEARED .TITLE DR1ST .IDENT /01/ ;; COPYRIGHT (C) 1981, 1982/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 01;; B. S. MCCARTHY 14-JUL-81;; MODIFIED BY:;;; THIS MODULE MARKS THE START OF THE FIRST DIRECTIVE COMMON;$DR1ST:: .END .TITLE DR1ND .IDENT /01/ ;; COPYRIGHT (C) 1981, 1982/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 01;; B. S. MCCARTHY 14-JUL-81;; MODIFIED BY:;9; THIS MODULE MARKS THE END OF THE FIRST DIRECTIVE COMMON;$DR1ND:: .END .TITLE NETLC .IDENT /01.02/ ;; COPYRIGHT (C) 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 01;; J. E. PROVINO 21-SEP-78;; MODIFIED BY:;; J. FORECAST 19-OCT-78*; JF001 -- ADD ACTIVE LINE COUNT ($ACTLN);; J. FORECAST 22-OCT-80; JF002 -- NEW TIMER SUPPORT;+*; LOW CORE DATABASE FOR DECNET SUPPORT ;- .IF DF M$$NET8$PUMR:: .WORD 0 ; STARTING UMR BIAS FOR THIS PROCESSOR 2$UMRPT::.WORD 0 ; POINTER TO UMR ALLOCATION BLOCK ; FOR THIS PROCESSOR,$ACTLN::.WORD 0 ; COUNT OF ACTIVE NPR LINES .IF DF M$$PRO?$M100Q::.WORD 0,.-2 ; PROCESSOR DEPENDANT 100 MSEC TIMER QUEUEV .IFFP$M100Q:: .ENDC  .ENDC  9 T .END JF001 -- ADD ACTIVE LINE COUNT ($ACTLN);; J. FORECAST 22-OCT-80; JF002 -- NEW TIMER SUPPORT;+*; LOW CORE DATABASE FOR DECNET SUPPORT ;- .  .IIF NDF L$$CDA .TITLE CRASH! .IIF DF DL$$CD .TITLE DLCRSH ! .IIF DF DU$$CD .TITLE DUCRSH ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;B;$; P. J. BEZEREDI 24-OCT-77;I&; MODIFIED FOR RSX-11M-PLUS V2.0 BY:;$; P. J. BEZEREDI; B. S. MCCARTHY; R. T. PERRON; C. SESTOKAS ;E&; MODIFIED FOR RSX-11M-PLUS V2.1 BY:;; P. J. BEZEREDI ; T. LEKAS; B. S. MCCARTHY; J. M. LAWLER ; C. SESTOKAS !; S. M. THOMAS";N-"; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:"; "; J. W. BERZLE"; G. N. LARSEN"; J. M. LAWLER"; B. S. MCCARTHY"; M. PETTENGILL"; C. SESTOKAS"; J. G. WEHNER"; P. K. M. WEISS";C"; MODIFIED BY:";D"; C. SESTOKA00d_K_^DATADATADATADATADATADATADATAS 28-OCT-86 05.00";.,"; CS008 -- FIX DU CONTROLLER ONLINE CHECK";"; K. L. NOEL 19-AUG-86 05.01";F+"; KLN020 -- ADD SUPPORT FOR CRASH ON KXJEh;i;.j; CRASH DUMP ROUTINESYk; l; m; MACRO LIBRARY CALLSn;.%o .MCALL HWDDF$,BTJMP$,UDADF$,BGCK$A1 o .MCALL CPRDF$ ; KLN020 p UDADF$Z q HWDDF$Nq CPRDF$ ; KLN020rs; t; LOCAL MACROSu;Tv .MACRO PUSH ARG w SUB #2,SPx MOV ARG,(SP). y .ENDM PUSHz{|;I,}; C$$CDA = 0 LOADABLE CRASH DRIVER SUPPORT,~; C$$CDA = N RESIDENT CRASH DRIVER SUPPORT;KD; WHEN RESIDENT CRASH DRIVER SUPPORT IS SELECTED, THIS MODULE WILLB; INCLUDE THE EXECUTIVE CRASH CODE ALONG WITH A SPECIFIC DRIVER.;D; WHEN LOADABLE CRASH DRIVER SUPPORT IS SELECTED, THIS MODULE WILLD; ONLY INCLUDE THE EXECUTIVE CRASH CODE. THIS MODULE IS ASSEMBLED>; ONCE FOR EACH LOADABLE CRASH DRIVER AFTER THE EXECUTIVE IS?; ASSEMBLED. WHEN THIS MODULE IS BEING ASSEMBLED FOR A CRASHI=; DRIVER THE FOLLOWING CONDITIONALS ARE DEFINED IN A PREFIXR ; FILE:S"; L$$CDA - LOADABLE CRASH DRIVER%; XX$$CD - XX CRASH DRIVER SELECTED  .IF DF C$$CDA .IIF GT,C$$CDA R$CRSH = 0 .ENDC. .IF DF, L$$CDA ;IF ASSEMBLING CRASH DRIVER, .NLIST CND ;DON'T LIST EXEC CRASH MODULE .IFF ; DF L$$CDAC .PAGE .IF DF C$$CDA;+'; **-$CRASH-SYSTEM CRASH DUMP ROUTINEF9; **-$PANIC-SYSTEM CRASH DUMP ROUTINE (REF. ENTRY ONLY)E;SD; THIS ROUTINE IS ENTERED VIA A JUMP WHENEVER A FATAL SYSTEM ERROR; (IOT) IS DETECTED.;A; THIS ROUTINE PERFORMS A MEMORY DUMP THAT CAN BE DIRECTED TO AC>; DISK OR TAPE. ONCE THE DUMP IS FINISHED THE SYSTEM MAY BE+; RE-BOOTED OR ANOTHER DUMP MAY BE TAKEN. C; IF ENTRY IS AT $CRALT, IT IS ASSUMED THAT THE MEMORY MANAGEMENT"; REGISTERS ARE PROPERLY SET UP.;$ ; INPUTS:+; ; KERNEL STACK;D ; OUTPUTS:;*>; A CORE IMAGE OF THE SYSTEM IS DUMPED ONTO THE DUMP DEVICE.;-;+.;**-$TRINT-GENERAL TRAP INTERCEPTION ROUTINE; E; THIS ENTRY POINT ADDRESS MAY BE PLACED IN ANY VECTOR TO ALLOW THEC-; SETTING OF THE C BIT AND AN RTI EXECUTED.H;-$TRINT:: ;REFERENCE LABEL 3TRP04: BIS #1,2(SP) ;SET CARRY ON TRAPS THROUGH 4  RTI ;RETURN .IFTF ;C$$CDA .IF DF M$$PRO;P?; NOTE: THIS CODE ONLY WORKS PROPERLY FOR UP TO 4 PROCESSORS.4; MODIFICATIONS WILL HAVE TO BE MADE TO HANDLE THE; DEC HARDWARE ALPHABET.;/$CRAL1::MOV #$STACK-4,SP ;POINT TO PS PC PAIRI5 MOV #$CRMS5,R1 ;GET ADDRESS OF MESSAGE TO BE TYPED & MOV R4,R3 ;COPY PROCESSOR BIT MASK BR WRMSG ;%$CRAL2::ADD #6,SP ;CLEAN THE STACK 5 MOV #$CRMS4,R1 ;GET ADDRESS OF MESSAGE TO BE TYPEDY" MOV R5,R3 ;COPY PROCESSOR MASK:WRMSG: CALL $DISAN ;DISABLE SANITY TIMERS (ALL OF THEM)' CLR R0 ;INITIALIZE PROCESSOR NUMBER $10$: CLC ;CLEAR CARRY FOR ROTATE# ROR R3 ;ROTATE R3 RIGHT ONE BITT BCS 30$ ;IF CS TYPE MESSAGE BEQ 50$ ;IF EQ DONET3 BR 40$ ;INCREMENT PROCESSOR NUMBER AND GO AGAINT'30$: MOV R0,R2 ;CALCULATE CPU LETTERR ADD #'A,R2 ; MOVB R2,$CRCPU ;R( MOV R1,-(SP) ;SAVE ADDRESS OF MESSAGE CALL TYPE ;TYPE MESSAGEA, MOV #$CRCPU,R1 ;GET ADDRESS OF CPU LETTER$ CALL TYPE ;TYPE PROCESSOR LETTER+ MOV (SP)+,R1 ;RESTORE ADDRESS OF MESSAGE(40$: INC R0 ;ADVANCE PROCESSOR NUMBER BR 10$ ;GO AGAIN50$: ;REFERNCE LABELE .IF DF D$$DXD) CLR $DXDRL ;INDICATE DON'T JMP TO DXD  .ENDC ; DF D$$DXDM BR $CRASH ;GO DO THE CRASH .ENDC ;M$$PRO .PAGE;AC; THIS ROUTINE IS ENTERED FROM THE DIRECTIVE DISPATCHER IF AN EMTM@; IS DONE AT SYSTEM STATE. THE PC PRIOR TO THE TRAP IS SAVED.; <; IF WE GOT HERE DUE TO A BUGCHECK (EMT 374 OR 375) AND IFE; THE FACILITY ERROR CODE AT $BCFAC IS ZERO THEN THE NEXT TWO WORDSBH; IN THE I-STREAM AFTER THE EMT INSTRUCTION ARE THE FACILITY AND ERROR@; CODES. THESE CODES WILL BE STORED AND A CRASH WILL BE DONE.H00d__b_c_d_k; THIS ROUTINE IS ALSO CALLED WHEN AN IOT HAS OCCURED IN SYSTEM STATE.D; THIS IS USUALLY AS A RESULT OF AN OLD STYLE CRASH. IN THIS CASE@; THE FACILITY AND ERROR CODES WILL HAVE BEEN SETTUP BY SSTSR.F; THIS IS ALSO CALLED FOR A TRAP OR NON BUGCHECK EMT IN SYSTEM STATEA; IN THIS CASE THE FACILITY AND ERROR CODES ARE FILLED IN AND AH; CRASH IS DONE.;0$CREMT::MOV (SP),$BCPC ;SAVE THE PRE-CRASH PC3 TST $BCFAC ;HAVE THE CODES BEEN SAVED ALREADY?R" BNE $CRENT ;NE YES - GO CRASH- MOV (SP),-(SP) ;DUPLICATE PC ON THE STACKE3 SUB #2,(SP) ;POINT AT THE TRAP/EMT INSTRUCTIONF$ MFPI @(SP) ;GET THE INSTRUCTION( BIC #1,(SP) ;GET READY FOR THE TEST3 CMP (PC)+,(SP) ;IS THIS EMT 374/375 (BUGCHECK)?R  EMT 374( BEQ 20$ ;IF EQ YES - SAVE THE CODES8 BGCK$A BF.INT,BE.EMT,INTERNAL ;ASSUME EMT INSTRUCTION. CMPB #&377,1(SP) ;EMT INSTRUCTION?"  BEQ 10$ ;IF EQ YES - GO CRASH2  BGCK$A BF.INT,BE.TRP,INTERNAL ;TRAP INSTRUCTION( 10$: CMP (SP)+,(SP)+ ;CLEAN THE STACK  BR $CRENT ;GO CRASH# 20$: TST (SP)+ ;CLEAN THE STACKT, ADD #2,(SP) ;POINT TO THE FACILITY CODE& MFPI @(SP) ;GET THE FACILITY CODE MOV (SP)+,$BCFAC ;STORE IT, ADD #2,(SP) ;GET THE ERROR CODE ADDRESS' MFPI @(SP)+ ;GET THE FACILITY CODEE MOV (SP)+,$BCERR ;STORE IT;N .PAGE?; IF CDA SUPPORT IS INCLUDED IN THE SYSTEM THIS ENTRY WILL DOA; A CRASH DUMP. IF CDA SUPPORT IS NOT INCLUDED AND THIS IS NOTLB; A P/OS SYSTEM A HALT WILL BE DONE. IF THERE IS NO CDA SUPPORTA; AND THIS IS A P/OS SYSTEM R0 AND R1 WILL BE SETTUP AND A JUMP,D; INTO THE BOOT ROM WILL BE DONE TO DISPLAY THE FACILITY AND ERROR ; CODES.;+ $CRENT::$PANIC:: ;REFERENCE LABELR $CRASH::!" .IFF ;C$$CDA #$ .IF DF R$$PRO%'& MOV $BCFAC,R0 ;GET THE FACILITY CODE.$' MOV $BCERR,R1 ;GET THE ERROR CODE*( BTJMP$ ;HAVE THE ROM SHOW THE MESSAGE)* .IFF ;R$$PROR+*,60$: HALT ;WE DON'T HAVE CRASH SO HALT- BR 60$ ;OH NO YOU DON'T!./ .ENDC ;R$$PRO012 .IFT ;C$$CDAS3495 MOV #TRP04,@#4 ;SET UP TO SET CARRY ON TRAPS THROUGH 4 678 .IF DF M$$PRO9(: BIS #4,SR3 ;ENABLE KERNEL DATA SPACE); BIS #1,SR0 ;TURN ON MEMORY MANAGEMENT$< ;THIS TRANSFERS CONTROL TO THE*= ;CRASH ROUTINE IN THE PRIVATE MEMORY> ;FOR THIS PROCESSORC?@ .ENDCAB0C MOV (SP)+,$CRUPC ;SAVE USER PC FROM THE STACK0D MOV (SP)+,$CRUST ;SAVE USER PS FROM THE STACK>E$CRALT:: ;ALTERNATE ENTRY POINT USED BY 'X' COMMAND TO XDTFGH .IF DF M$$PROI4J CALL $DISAN ;DISABLE SANITY TIMERS (ALL OF THEM)KL .ENDCMNO .IF DF D$$DXDP(Q MOV KINAR5,$DXDK5 ;SAVE APR 5 FOR DXD R MOV $DXDRL,KINAR5 ;MAP TO DXD%S BEQ CRSH ;IF EQ DXD NOT INSTALLEDT(T JMP @$DXDEP ;JUMP TO DXD ENTRY POINT0U$DXDRT::MOV $DXDK5,KINAR5 ;RESTORE KERNEL APR5$V RTT ;RETURN FROM WHENCE WE CAME8WCRSH: MOV $DXDK5,KINAR5 ;RESTORE MAPPING FOR THE CRASHXY .ENDC ; DF D$$DXDZ[9\ MOV #TRP04,@#4 ;SET UP TO SET CARRY ON TRAPS THROUGH 4.]^_ .IF DF M$$PRO`#a CACHE$ BYPASS ;BYPASS THE CACHEEbc .ENDCdef .PAGEgAh; DUMP ALL VOLATILE PROCESSOR REGISTERS TO CRASH STACK ($CRSST),i4j TSTB $CRDMP ;HAVE REGISTERS ALREADY BEEN DUMPED?k BEQ 5$ ;NO IF EQ l JMP 70$ ;P"m5$: MOV PS,$CRSST ;STORE FULL PS=n MOV #PMODE!PR7,PS ;LOCK OUT INTERRUPTS, PREVIOUS MODE USERHo MOV SP,$CRSST-2 ;;;SAVE SPP2p MOV $CRUPC,$CRSST-4 ;;;SAVE PC BEFORE IOT CRASH2q MOV $CRUST,$CRSST-6 ;;;SAVE PS BEFORE IOT CRASH1r MOV #$CRSST-6,SP ;;;RESET SP TO INTERNAL STACKYs MFPI SP ;;;SAVE USER'S SPtuv .IF DF S$$LIBw3x MOV #PSMODE!PR7,PS ;;;SET PREVIOUS MODE TO SUPERAyz .ENDC{|} MFPI SP ;;;GET SUPER SPL*~ PUSH CPUERR ;;;SAVE CPU ERROR REGISTER- NOP ;;;THIS INSTRUCTION MUST BE HERE FORS+ ;;;THE 11/60. UNLESS THE APPROPRIATEP( ;;;ECO HAS BEEN APPLIED, ACCESSING$ ;;;THE CPU ERROR REGISTER WILL# ;;;CAUSE THE NEXT INSTRUCTION, ;;;T00d_K_^DATADATADATADATADATADATADATAO BE SKIPPED4 PUSH MEMERR ;;;SAVE MEMORY SYSTEM ERROR REGISTER/ PUSH MEMCTL ;;;SAVE MEMORY CONTROL REGISTER& MOV R0,-(SP) ;;;SAVE REGISTER SET 1 MOV R1,-(SP) ;;;  MOV R2,-(SP) ;;; MOV R3,-(SP) ;;;P MOV R4,-(SP) ;;;L MOV R5,-(SP) ;;;S0 PUSH SR0 ;;;SAVE MEMORY MANAGEMENT REGISTERS PUSH SR0+2 ;;; PUSH SR0+4 ;;; PUSH SR3 ;;;% BIC #40,SR3 ;;;DISABLE UNIBUS MAP,4 MOV #UINDR0,R0 ;;;SETUP TO SAVE FIRST SET OF APRS MOV #32.,R1 ;;;N10$: PUSH (R0) ;;;SAVE APRP! ADD #2,R0 ;;;MOVE TO NEXT ONES* SOB R1,10$ ;;;LOOP UNTIL ALL ARE SAVED6 MOV #SISDR0,R0 ;;;SETUP TO SAVE SECOND SET OF APR'S MOV #64.,R1 ;;;,20$: PUSH (R0) ;;;SAVE APR! ADD #2,R0 ;;;MOVE TO NEXT ONE(* SOB R1,20$ ;;;LOOP UNTIL ALL ARE SAVED, MOV #UBMPR,R0 ;;;GET ADDRESS OF FIRST UMR* MOV #62.,R1 ;;;NUMBER OF UMR'S TO SAVE30$: PUSH (R0) ;;;SAVE A UMRU! ADD #2,R0 ;;;MOVE TO NEXT ONET* SOB R1,30$ ;;;LOOP UNTIL ALL ARE SAVED6 INCB $CRDMP ;;;PROCESSOR REGISTERS HAVE BEEN SAVED .PAGE;:; AT THIS POINT, THE FORMAT OF THE CRASH STACK (STARTING#; FROM THE BOTTOM, IS AS FOLLOWS:S;M%; OFFSET REGISTER NAME ADDRESSS&; ------ ------------- -------;;; - - - - - - UNIBUS MAPPING REGISTERS - - - - - -;; 8; $CRSST-540 UNIBUS MAP REGISTER 31 (HIGH HALF) 1703667; $CRSST-536 UNIBUS MAP REGISTER 31 (LOW HALF) 170364; ; ... ...8; $CRSST-350 UNIBUS MAP REGISTER 1 (HIGH HALF) 1702027; $CRSST-346 UNIBUS MAP REGISTER 1 (LOW HALF) 170200A;>; - - - - - - MEMORY MANAGEMENT REGISTERS - - - - - -;R9; $CRSST-344 KERNEL DATA SPACE ADDRESS REG. 7 172376R ; ... ...9; $CRSST-326 KERNEL DATA SPACE ADDRESS REG. 0 172360 9; $CRSST-324 KERNEL INST SPACE ADDRESS REG. 7 172356 ; ... ...9; $CRSST-306 KERNEL INST SPACE ADDRESS REG. 0 172340I9; $CRSST-304 KERNEL DATA SPACE DESCRIPTOR REG. 7 172336C ; ... ...9; $CRSST-266 KERNEL DATA SPACE DESCRIPTOR REG. 0 172320 9; $CRSST-264 KERNEL INST SPACE DESCRIPTOR REG. 7 172316- ; ... ...9; $CRSST-246 KERNEL INST SPACE DESCRIPTOR REG. 0 172300 9; $CRSST-244 SUPER DATA SPACE ADDRESS REG. 7 172276S ; ... ...9; $CRSST-226 SUPER DATA SPACE ADDRESS REG. 0 172260 9; $CRSST-224 SUPER INST SPACE ADDRESS REG. 7 172256S ; ... ...9; $CRSST-206 SUPER INST SPACE ADDRESS REG. 0 172240 9; $CRSST-204 SUPER DATA SPACE DESCRIPTOR REG. 7 172236S ; ... ...9; $CRSST-166 SUPER DATA SPACE DESCRIPTOR REG. 0 172220 9; $CRSST-164 SUPER INST SPACE DESCRIPTOR REG. 7 172216S ; ... ...9; $CRSST-146 SUPER INST SPACE DESCRIPTOR REG. 0 172200 9; $CRSST-144 USER DATA SPACE ADDRESS REG. 7 177676S ; ... ...9; $CRSST-126 USER DATA SPACE ADDRESS REG. 0 177660 9; $CRSST-124 USER INST SPACE ADDRESS REG. 7 177656S ; ... ...9; $CRSST-106 USER INST SPACE ADDRESS REG. 0 177640 9; $CRSST-104 USER DATA SPACE DESCRIPTOR REG. 7 177636S ; ... ...9; $CRSST-066 USER DATA SPACE DESCRIPTOR REG. 0 177620 9; $CRSST-064 USER INST SPACE DESCRIPTOR REG. 7 177616S ; ... ...9; $CRSST-046 USER INST SPACE DESCRIPTOR REG. 0 177600  .PAGE%; OFFSET REGISTER NAME ADDRESS%; ------ ------------- ------- ;.@; - - - - - - MEMORY MANAGEMENT CONTROL REGISTERS - - - - - -;#; $CRSST-044 SR3 (MMR3) 172516N#; $CRSST-042 SR2 (MMR2) 177576#; $CRSST-040 SR1 (MMR1) 177574P#; $CRSST-036 SR0 (MMR0) 177572 ;T:; - - - - - - USERS GENERAL REGISTERS - - - - - -;U; $CRSST-034 USER R5 ; ... ...; $CRSST-022 USER R0;TA; - - - - - - MEMORY CONTROL/ERROR REGISTERS - - - - - - ;S/; $CRSST-020 MEMORY CONTROL REGISTER 177746-3; $CRSST-016 MEMORY SYSTEM ERROR REGISTER 177744A*; $CRSST-014 CPU ERROR REGISTER 177766;C@; - - - - - - STACK POINTERS, CRASH CONTEXT - - - - - -;'; $CRSST-012 SUPERVISOR STACK POINTERC!; $CRSST-010 USER STACK PO00d__b_c_d_kINTERT ; $CRSST-006 PS PRIOR TO CRASH ; $CRSST-004 PC PRIOR TO CRASH"; $CRSST-002 SP AT TIME OF CRASH; $CRSST PS AFTER CRASH .PAGE'; SET UP SYSTEM TO PERFORM CRASH DUMPR .IF DF M$$PRO- MOVB $PROC2,R0 ;;;GET PROCESSOR NUMBER * 2T .IFFY3 CLR R0 ;;;USE PROC 0 ON SINGLE PROCESSOR SYSTEMG .IFTF8  INC $CRFLG(R0) ;;;INDICATE (TO OTHER PROCESSORS) THAT+  ;;;THIS PROCESSOR HAS DUMPED ITS REGST   .IFF  .IF DF K$$DAS* BIS #4,SR3 ;;;ENABLE KERNEL DATA SPACE .ENDC* BIS #1,SR0 ;;;MAKE SURE MEM MGMT IS ON .IFTR8 TSTB $CRFPR ;;;IS THIS THE FIRST PROCESSOR TO CRASH? BGE 31$ ;;;IF GE NOP- MOVB $PROCN,$CRFPR ;;;SAVE ID OF PROCESSORE ! .IF NE M$$PRO-1"/# MOV $URMST,R1 ;;;DETERMINE ONLINE PROCESSORS$ BIC $CPMSK,R1 ;;;*% BIC $CPBIT,R1 ;;;EXCLUDE THIS PROCESSOR,& MOV #MP.CRH,R2 ;;;GET CRASH FUNCTION CODE3' CALL $IIFNX ;;;NOTIFY OTHER PROCESSORS TO CRASH3( CACHE$ BYPASS ;;;SET THE CACHE BYPASS BIT AGAIN.)* .IFTF+',31$: CALL $IIOPN ;;;OPEN UP THE IIST-. .IFTR/01 .ENDC ; NE M$$PRO-123 .IFTF ; DF M$$PRO45;B@6; IF WE'RE HERE DUE TO A BUGCHECK, OUTPUT THE BUGCHECK MESSAGE7;87 .IF NE C$$CDA-20 ; NOT CRASH TRHOUGH KXJ ; KLN0208)9 TST $BCFAC ;;;BUGCHECK FACILITY SET ?B: BEQ 315$ ;;;IF EQ NO+; MOV #$BCMSG,R0 ;;;POINT TO FIRST MESSAGEF%< MOV $BCPC,R3 ;;;GET PC OF BUGCHECK != CALL OCTSTR ;;;OUTPUT MESSAGEE,> MOV $BCFAC,R3 ;;;GET FACILITY OF BUGCHECK!? CALL OCTSTR ;;;OUTPUT MESSAGEN.@ MOV $BCERR,R3 ;;;GET ERROR CODE OF BUGCHECK!A CALL OCTSTR ;;;OUTPUT MESSAGE;B CALL TYPE ;;;OUTPUT TRAILEREC315$: ;;;REFERENCE LABEL &C .ENDC ; NE C$$CDA-20 ; KLN020DE .IFT ; DF M$$PROUFG .IF NE M$$PRO-1H2I MOV #$CRMS2,R1 ;;;INDICATE REGS HAVE BEEN SAVED!J CALL TYPE ;;;TYPE THE MESSAGEP0K MOV $CRKRB,R1 ;;;GET CRASH DEVICE KRB ADDRESS0L BEQ 35$ ;;;IF EQ ASSUME PROCESSOR HAS ACCESS?M BIT K.URM(R1),@$CPURM ;;;DOES THIS PROC HAVE ACCESS TO DISK?ON BNE 35$ ;;;YES IF NEO32$: JMP $CRSHT ;;;HALT*P35$: ASRB $CRLCK ;;;LOCK THE CRASH LOCK%Q BCC 32$ ;;;HALT IF LOCK IS LOCKED19R MOV #$CRMS1,R1 ;;;PROC IS WAITING FOR OTHERS TO FINISH !S CALL TYPE ;;;TYPE THE MESSAGE7T40$: MOV #,R0 ;;;GET NUMBER OF PROCESSORSE9U50$: BIT $BTMSK(R0),$URMST ;;;IS THIS PROCESSOR ONLINE?MV BEQ 55$ ;;;NO IF EQ 8W TST $CRFLG(R0) ;;;HAS PROCESSOR DUMPED ITS REGISTERS?3X BEQ 40$ ;;;IF EQ NO, WAIT FOR ALL PROCS TO DUMPC)Y55$: SUB #2,R0 ;;;CHECK NEXT PROCESSORIZ BGE 50$ ;;;GO AGAIN;[\ .ENDC]^_ .ENDC`a4b70$: MOV #PR7,PS ;;;MAKE SURE WE'RE AT PRIORITY 7cd0e .IF EQ, C$$CDA ;LOADABLE CRASH DRIVER SUPPORTf.g BIS #60,@#SR3 ;;; TURN ON MEMORY MANAGEMENT:h MOV @#$CRPAR,@#KINAR5 ;;; RELATIVE ADDRESS OF CRASH PARij .IF DF K$$DASk-l MOV @#$CRPAR,@#KDSAR5 ;;; MAP D SPACE ALSOTmn .ENDC ;DF K$$DASo&p BNE 80$ ;;; CRASH DRIVER IS LOADED)q MOV #$CRMS7,R1 ;;; MOVE IN THE MESSAGESr CALL TYPE ;;; TYPE IT OUTOs75$: HALT ;;; AND STOPt BR 75$ ;;; STOP !.u80$: JMP @120000 ;;; JMP TO CRASH PARTITIONvw .ENDC ; EQ, C$$CDAxy .ENDC ; DF C$$CDAz{ .ENDC ; DF L$$CDA|%} .IF DF, C$$CDA ;CRASH DUMP SUPPORTA4} .IF EQ C$$CDA-20 ; CRASH THROUGH KXJ ; KLN020} ; KLN0207}PBNH== 0 ; SET UP TO IGNORE THIS IN LOWCR ; KLN020A}PBNL== 0 ; KLN020$} ; KLN020} ; KLN020>} MOV $CSFSV,@#KXCSRF ;;; SET ALL OF MEMORY SHARED ; KLN020,} MOV $CSHSV,@#KXCSRH ;;; ... ; KLN020>} MOV $KXPTR,R0 ;;; GET ADDRESS OF KXJ DRIVER'S DCB ; KLN0206} MOV D.UCB(R0),R0 ;;; GET ADDRESS OF UCB ; KLN0206} MOV U.SCB(R0),R0 ;;; GET ADDRESS OF SCB ; KLN0206} MOV S.KRB(R0),R0 ;;; GET ADDRESS OF KRB ; KLN0204} MOV K.CSR(R0),R0 ;;; GET TPR0 ADDRESS ; KLN020?} MOV #RI$CRH,4(R0) ;;; SET CRASH NOTIFICATION CODE ; KLN020K;} MOV $KXVC1,R1 ;;; GET00d_K_^DATADATADATADATADATADATADATA ADDRESS OF FIRST VECTOR ; KLN020S8} ADD #4,R1 ;;; GET ADDRESS OF SECOND VECTOR ; KLN020A} MOV R1,@#KXJQIR ;;; NOTIFY HOST THROUGH VECTOR 2 ; KLN020A8}90$: HALT ;;; HALT TO LET HOST COPY MEMORY ; KLN020*} BR 90$ ;;; DON'T CONTINUE ; KLN020} ; KLN020%} .IFF ; EQ C$$CDA-20 ; KLN020R} ; KLN020~>; THE FOLLOWING CODE SHOULD BE ASSEMBLED INTO EXECUTIVE WHEN>; RESIDENT CRASH DUMP DRIVER SUPPORT IS INCLUDED. IT SHOULD?; BE INCLUDED IN THE CRASH DRIVER WHEN LOADABLE CRASH SUPPORT2; IS SELECTED.8 .IF DF, L$$CDA!R$CRSH ;RESIDENT CRASH OR CRASH DRIVER;F"; TYPE MESSAGE AND WAIT FOR USER;:AGAIN: .IF DF, L$$CDA % MOV CRMS0,R1 ;;; TYPE USER MESSAGET .IFF0( MOV #$CRMS0,R1 ;;; USER CRASH MESSAGE .ENDC ; DF L$$CDA CALL TYPE ;;;  HALT ;;;WAIT FOR THE USER JMP DUMP ;;;GO DUMP MEMORY .IFTF ; DF L$$CDA!R$CRSHL;+7; **-OCTSTR-OUTPUT AN ASCIZ STRING, THEN OCTAL NUMBER ,; **-OCTOUT-OUTPUT OCTAL NUMBER TO CONSOLE;, ; INPUTS:H(; R0=ADDRESS OF ASCIZ STRING IF OCTSTR; (RETURNED UPDATED) ; R3=BINARY VALUE TO OUTPUT;-.OCTSTR: MOV R0,R1 ;;;COPY ADDRESS OF STRING CALL TYPE ;;;OUTPUT IT& MOV R1,R0 ;;;UPDATE OUTPUT POINTER .IF DF, L$$CDA ; GL003L7OCTOUT: MOV BCBUF,R1 ;;;POINT TO SCRATCH AREA ; GL003; .IFF ; DF L$$CDA ; GL003F1OCTOUT: MOV #$BCBUF,R1 ;;;POINT TO SCRATCH AREAA .ENDC ; DF L$$CDA ; GL003! MOV #6,R2 ;;;SET LOOP COUNTERC!10$: MOV R3,R4 ;;;COPY RESIDUEA6 BIC #177770,R4 ;;;STRIP OFF ALL BUT LAST OCT. DIGIT, ADD #60,R4 ;;;MAKE IT AN ASCII CHARACTER' MOVB R4,-(R1) ;;;STORE THE CHARACTER . ROR R3 ;;;SHIFT RESIDUE ONE RIGHT (WE KNOW' ;;;C IS CLEAR FROM THE ADD ABOVE),0 ASR R3 ;;;SHIFT TWO (C MAY NOT BE CLEAR, BUT  ;;;NOW WE KNOW SIGN BIT IS ASR R3 ;;;SHIFT THREEF+ SOB R2,10$ ;;;LOOP UNTIL SIX CHARACTERSR* ;;;FALL THROUGH TO TYPE ROUTINE WITH$ ;;;R1 POINTING TO SCRATCH AREA;+!; **-TYPE-TYPE AN ASCIZ MESSAGE;# ; INPUTS:S; R1=ADDRESS OF TEXT STRINGT;-9TYPE: MOV #C$$RSH,R5 ;;;GET CSR ADDRESS OF PRINT DEVICET%10$: MOVB (R1)+,R2 ;;;GET CHARACTER # BEQ 40$ ;;;IF EQ END OF MESSAGEC CALL 30$ ;;;PRINT CHARACTER3 CMPB #15,R2 ;;;CARRIAGE RETURN (OR LINE FEED) ?  BLT 10$ ;;;IF LT NOT EITHERR) CLR R2 ;;;OUTPUT SOME FILL CHARACTERSP$ MOV #5,R4 ;;;FIVE WILL BE ENOUGH!20$: CALL 30$ ;;;OUTPUT A FILL ! SOB R4,20$ ;;;LOOP UNTIL DONE+ BR 10$ ;;;LOOP%30$: TSTB (R5) ;;;IS DEVICE READY? BPL 30$ ;;;IF PL NON# MOVB R2,2(R5) ;;;PRINT CHARACTER;40$: RETURN ;;;P .IFT ; DF L$$CDA!R$CRSH;+.; **-CKSUM-VERIFY CHECKSUM OF DEVICE ADDRESS; 4; THIS ROUTINE WILL VERIFY THAT THE DEVICE ADDRESS(; HAS NOT BEEN CORRUPTED BY THE CRASH.;- .IF DF, L$$CDA ; GL0038CKSUM: MOV @CRSBN,-(SP) ;;;GET HIGH ORDER BITS ; GL0030 ADD @CRSB2,(SP) ;;;ADD LOW ORDER BITS ; GL0033 CMP (SP)+,@CRSCS ;;;COMPARE WITH CHECKSUM; GL003) .IFF ; DF L$$CDA ; GL003$2CKSUM: MOV @#$CRSBN,-(SP) ;;;GET HIGH ORDER BITS, ADD @#$CRSBN+2,(SP) ;;;ADD LOW ORDER BITS. CMP (SP)+,@#$CRSCS ;;;COMPARE WITH CHECKSUM .ENDC ; DF L$$CDA ; GL003 BEQ 10$ ;;;IF EQ OK  HALT ;;;WAIT FOR USER BR CKSUM ;;;TRY AGAIN.10$: RETURN ;;;F;+!; **-DUMP-DUMP THE SYSTEM IMAGE,; @; THIS ROUTINE IS USED TO DUMP THE SYSTEM IMAGE ONTO THE CRASHC; DUMP MEDIA. WHEN THE DUMP IS FINISHED THE SYSTEM MAY BE EITHER+; RE-BOOTED OR ANOTHER DUMP MAY BE TAKEN.:;@ ; INPUTS: ; NONE. ; ; OUTUTS:@; IMAGE DUMPED.D;-#DUMP: ;;;DUMP IMAGE ONTO MEDIAA* .IF DF, L$$CDA ; LOADABLE CRASH DRIVER 8  MOV @CRKRB,R0 ;;; GET DUMP DEVICE KRB ADDRESS ; GL003-  BNE 5$ ;;; IF NE GET CSR FROM KRB ; GL003F8  MOV CRCSR,R0 ;;; GET ADDRESS OF WORD WITH CSR ADDRESS5 5$: MOV (R0),R0 ;;; G00d__b_c_d_kET CSR OF DUMP DEVICE ; GL003C- ;;; (K.CSR IS GUARANTEED TO BE 0);GL003D- MOV @CRSUN,R3 ;;; GET UNIT NUMBER ; GL003O .IFF ; DF L$$CDA ; GL0031 MOV @#$CRKRB,R0 ;;;GET DUMP DEVICE KRB ADDRESSU$ BNE 5$ ;;;IF NE GET CSR FROM KRB9 MOV #$CRCSR,R0 ;;;GET ADDRESS OF WORD WITH CSR ADDRESSR,5$: MOV (R0),R0 ;;;GET CSR OF DUMP DEVICE& ;;;(K.CSR IS GUARANTEED TO BE 0)% MOV @#$CRSUN,R3 ;;;GET UNIT NUMBERC .ENDC ; DF L$$CDA ; GL003/DUMP1: ;;;DUMMY LABEL SO DUMP ROUTINES CAND) ;;;USE ANY LOCAL LABEL THEY WANT TOE  ;;;USE ! .IFTF ; DF L$$CDA!R$CRSHU"#$ .IF EQ C$$CDA-1%&;D'; DT(;@); THIS ROUTINE DUMPS ALL OF PHYSICAL MEMORY UP TO A MAXIMUM OF*; 124K WORDS+;B,-,.PBNH== 0 ;;;HIGH ORDER TC11 BLOCK NUMBER+/PBNL== 1 ;;;LOW ORDER TC11 BLOCK NUMBER 051 CALL CKSUM ;;;CHECK BLOCK NUMBER AGAINST CHECKSUMR!2 SWAB R3 ;;;POSITION UNIT BITS.3 MOV R3,R1 ;;;COPY3.4 BIS #4003,R1 ;;;SET FOR READ LBN IN REVERSE!5 MOV R1,(R0) ;;;START THE TAPEL*610$: BIT #100200,(R0) ;;;ERROR OR READY?7 BEQ 10$ ;;;IF EQ NO(8 BPL DUMP ;;;IF PL MOVE UNTIL ENDZONE'920$: MOV R3,R1 ;;;RETRIEVE UNIT BITSH(: BIS #3,R1 ;;;SET TO READ LBN FORWARD!; MOV R1,(R0) ;;;START THE TAPE;*<30$: BIT #100200,(R0) ;;;ERROR OR READY?$= BMI DUMP ;;;IF MI ERROR, RESTART> BEQ 30$ ;;;IF EQ WAITC6? SUB @#$CRSBN+2,6(R0);;;ARE WE AT THE BLOCK WE WANT?@ BNE 20$ ;;;IF NE NOC/A CLR 2(R0) ;;;SET WRITE ALL OF MEMORY (UP TOR.B CLR 4(R0) ;;;TO 124K) IN 64K WORD SEGMENTS#C MOV R3,R1 ;;;RETRIEVE UNIT BITS+D BIS #15,R1 ;;;SET TO WRITE DATA FORWARD #E MOV R1,(R0) ;;;WRITE ALL MEMORY !F50$: CLR 2(R0) ;;;KEEP WRITING1G TST (R0) ;;;ANY ERRORS?H BPL 50$ ;;;IF PL NOT)I BIT #400,-2(R0) ;;;NONEXISTENT MEMORY?OJ BEQ WERR ;;;IF EQ NO, RETRYR!K BIS #1,R3 ;;;SET TO STOP TAPEWL MOV R3,(R0) ;;;STOP TAPE M BR $CRSHT ;;;SUCCESS, FINISHNO .ENDCPQR .IF EQ C$$CDA-2ST;AU; DKV;P=W; IF THE EXECUTIVE DOES NOT SUPPORT 22-BIT ADDRESSING, THIS,;X; ROUTINE DUMPS ALL OF PHYSICAL MEMORY UP TO A MAXIMUM OFTY; 124K WORDS.VZ;R=[; IF THE EXECUTIVE SUPPORTS 22-BIT ADDRESSING, THIS ROUTINE>\; DUMPS ALL OF PHYSICAL MEMORY UP A MAXIMUM OF APPROXIMATELY0]; 1.2 MEGAWORDS OF MEMORY (FILLS UP THE RK05).^; _,`PBNH== 0 ;;;HIGH ORDER RK11 DISK ADDRESS+aPBNL== 1 ;;;LOW ORDER RK11 DISK ADDRESSSb5c CALL CKSUM ;;;CHECK DISK ADDRESS AGAINST CHECKSUM%d ASH #13.,R3 ;;;POSITION UNIT BITSU)e MOV #401,(R0) ;;;RESET RK11 CONTROLLERI1f BIS @#$CRSBN+2,R3 ;;;SET STARTING DISK ADDRESSA#g MOV R3,6(R0) ;;;SET DISK ADDRESS'h CLR @#UBMPR ;;;INITIALIZE FIRST UMREi CLR @#UBMPR+2 ;;;... 8j BIS #60,@#SR3 ;;;ENABLE 22-BIT MAPPING AND UNIBUS MAP2k ;;;(KERNEL D HAS BEEN CONDITIONALLY ENABLED)'l40$: MOV 6(R0),R3 ;;;GET DISK ADDRESS 1m BIC #160017,R3 ;;;EXTRACT CYLINDER AND SURFACED0n CMP #14420,R3 ;;;ABOUT TO WRITE CYLINDER THAT#o ;;;CANNOT ORDINARILY BE READ?P)p BEQ $CRSHT ;;;IF EQ YES, STOP WRITINGE,q CLR 4(R0) ;;;INITIALIZE TRANSFER ADDRESS2r MOV #-6000,2(R0) ;;;WRITE 3K WORDS (1 CYLINDER)#s MOV #403,(R0) ;;;START THE WRITEL*t45$: BIT #100200,(R0) ;;;ERROR OR READY?u BEQ 45$ ;;;IF EQ NO2v BMI 50$ ;;;IF MI ERROR6w ADD #14000,@#UBMPR ;;;POINT TO NEXT 3K WORD SEGMENTx ADC @#UBMPR+2 ;;;...D*y BR 40$ ;;;GO AGAIN UNTIL END OF MEMORY.z50$: BIT #2000,-2(R0) ;;;NONEXISTENT MEMORY? { BNE $CRSHT ;;;YES IF NE HALT|} .ENDC~ .IF EQ C$$CDA-3; ; MT;N>; THIS ROUTINE DUMPS ALL OF PHYSICAL MEMORY (UP TO A MAXIMUM;; OF 124K WORDS) IN 512 BYTE RECORDS AT 800 BPI (9-TRACK)R; -PBNH== 0 ;;;BLOCK NUMBER IGNORED FOR TM11PBNL== 0 ;;;( SWAB R3 ;;;POSITION UNIT SELECT BITS- BIS #60001,R3 ;;;MERGE DENSITY AND GO BITS MOV R3,R2 ;;;COPY% BIS #16,R2 ;;;SET REWIND FUNCTIONO# MOV R2,(R0) ;;;START THE REWINDS*10$: BIT #100200,(R0) ;;;ERROR OR READY?" BMI WERR ;;;IF MI 00d_K_^DATADATADATADATADATADATADATAERROR, RETRY BEQ 10$ ;;;IF EQ NO " CLR (R0) ;;;CLEAR MTC REGISTER* CLR 4(R0) ;;;START TO WRITE ALL MEMORY" MOV R3,R2 ;;;RETRIEVE MTC BITS( BIS #4,R2 ;;;SET WRITE DATA FUNCTION BIC #1,R2 ;;;CLEAR GO BIT1$ MOV R2,(R0) ;;;LOAD MTC REGISTER330$: MOV #500,R1 ;;;WAIT FOR TAPE TO SETTLE DOWNG35$: DEC R1 ;;;WAIT BNE 35$ ;;;IF NE LOOPB, MOV #-512.,2(R0) ;;;SET 512. BYTE RECORDS" BIS #1,(R0) ;;;START THE WRITE*40$: BIT #100200,(R0) ;;;ERROR OR READY? BEQ 40$ ;;;IF EQ NOY# BPL 30$ ;;;IF PL WRITE FINISHED0& TSTB -2(R0) ;;;NONEXISTENT MEMORY? BPL WERR ;;;IF PL NO, RETRYM" MOV R3,R2 ;;;RETRIEVE MTC BITS& BIS #10000,R2 ;;;SET CLEAR FUNCTION  MOV R2,(R0) ;;;LOAD FUNCTION50$: TSTB (R0) ;;;READY?T BPL 50$ ;;;IF PL NO;' BIS #6,R3 ;;;SET WRITE EOF FUNCTIONC# MOV R3,(R0) ;;;DO THE WRITE EOFO60$: TSTB (R0) ;;;READY?T BPL 60$ ;;;IF PL NOS" CLR (R0) ;;;CLEAR MTC REGISTER& BR $CRSHT ;;;SUCCESSFUL COMPLETION .ENDC .IF EQ C$$CDA-4;F; MM;T9; THIS ROUTINE DUMPS ALL OF PHYSICAL MEMORY IN 512 BYTE ; RECORDS AT 800 BPI;I.PBNH== 0 ;;;BLOCK NUMBER IGNORED FOR TJU16PBNL== 0 ;;;' BIS (PC)+,R3 ;;;SET MODE AND DENSITYT8$TDNSY::.WORD 1300 ;;;DEFAULT TO 800 BPI, NORMAL MODE/ MOV @#$CRSFM,R2 ;;;RETRIEVE FORMATTER NUMBER& CALL 120$ ;;;SELECT FORMATTER/UNIT1 MOV 26(R0),R4 ;;;RETRIEVE DEVICE TYPE REGISTER+ BIT #40000,R4 ;;;IS THIS A MASSBUS TAPE? BEQ 10$ ;;;IF EQ NO + BIT #10000,10(R0) ;;;NON EXISTENT DRIVE?R BNE WERR ;;;IF NE, YES.M# BIT #50,R4 ;;;TM02/3 FORMATTER?0 BNE 20$ ;;;IF NE YES+10$: MOV #$CRMS6,R1 ;;;NO, ILLEGAL DEVICE=/ BR WERR1 ;;;PRINT OUT MESSAGE AND TRY AGAINS-20$: BIT #2000,R4 ;;;IS SLAVE UNIT PRESENT?P BEQ WERR ;;;IF EQ NO& CLR @#$CRBAE ;;;INITIALIZE BAE FLAG" MOV R0,R4 ;;;;COPY CSR ADDRESS3 ADD #26,R4 ;;;ADD OFFSET TO DRIVE TYPE REGISTER330$: ADD #2,R4 ;;; R4 > REGISTER (11/24 PROBLEM)Q' TST (R4) ;;; DEVICE REGISTER THERE?; BCC 30$ ;;;IF CC IT EXISTS/ SUB #34,R4 ;;;SUB # OF DEVICE REGISTERS + 2R SUB R0,R4 ;;;$, BNE 40$ ;;;IF NE IT'S AN RH70 CONTROLLER+ COM @#$CRBAE ;;;IT'S NOT, RESET BAE FLAGS2 CLR @#UBMPR ;;;AND INITIALIZE FIRST UNIBUS ...* CLR @#UBMPR+2 ;;;;... MAPPING REGISTERS<40$: BIS #60,@#SR3 ;;;ENABLE 22 BIT MAPPING AND UNIBUS MAP7 MOV #<4*4>,R5 ;;;NUMBER OF 512 BYTE RECORDS/4K BLOCKG& CALL 120$ ;;;SELECT FORMATTER/UNIT+ MOV #7,(R0) ;;;START THE TAPE REWINDING  MOV #40000,R1 ;;;PAUSE$)50$: SOB R1,50$ ;;;LOOP FOR DELAY TIME :60$: BIT #20000,12(R0) ;;;POSITIONING STILL IN PROGRESS? BNE 60$ ;;;IF NE YES TSTB 12(R0) ;;;DRIVE READY?O BPL 60$ ;;;IF PL NOR* MOV #60,(R0) ;;;LOAD THE WRITE FUNCTION+ CLR 4(R0) ;;;SET TO WRITE ALL OF MEMORY)70$: MOV #-256.,2(R0) ;;;SET WORD COUNTN& MOV #-512.,6(R0) ;;;SET FRAME COUNT/ BIS #1,(R0) ;;;START TO WRITE ALL OF MEMORY #80$: TSTB 12(R0) ;;;DRIVE READY?R BPL 80$ ;;;IF PL NOI# DEC R5 ;;;DECREMENT BLOCK COUNT" BNE 100$ ;;;IF NE USE SAME UMR. TST @#$CRBAE ;;;;IS THE BAE REGISTER THERE? BEQ 90$ ;;;IF EQ YES? ADD #<1024.*4*2>,@#UBMPR ;;;NO, POINT UMR TO NEXT 4K OF MEM;# ADC @#UBMPR+2 ;;;DOUBLE WORD ADDH" CLR 4(R0) ;;;RESET BUS ADDRESS090$: MOV #<4*4>,R5 ;;;RESET TO # BLOCKS PER 4K+100$: BIT #40000,(R0) ;;;TRANSFER ERRORS?S BEQ 70$ ;;;IF EQ NO,* BIT #4000,10(R0) ;;;NONEXISTENT MEMORY? BEQ WERR ;;;IF EQ NO& CALL 130$ ;;;SELECT FORMATTER/UNIT$ MOV #27,(R0) ;;;WRITE EOF ON TAPE,110$: TSTB 12(R0) ;;;IS TAPE DRIVE READY? BPL 110$ ;;;IF PL NO) CLR (R0) ;;;CLEAR CONTROLLER REGISTER2& BR $CRSHT ;;;SUCCESSFUL COMPLETION-120$: BIS #40,10(R0) ;;;RESET RH CONTROLLERD$ MOV R2,10(R0) ;;;SELECT FORMATTER MOV R3,32(R0) ;;;SELECT UNITO0130$: TSTB 12(R0) ;;;IS THE TAPE DRIVE READY? BPL 130$ ;;;IF PL NO RETURN ;;;EXIT# .ENDC! .IIF EQ C$$CDA-5 CDA$DB=0 ;;; " 00d__b_c_d_k .IIF EQ C$$CDA-11 CDA$DR=0 ;;;   .IF DF CDA$DB!CDA$DRE  ;E ; DB AND DR1; >; THE LOCAL SYMBOLS REFERENCED ABOVE, CDA$DB AND CDA$DR, ARE:; USED WITHING THE FOLLOWING COMMON CODE DRIVER BELOW TO<; DIFFERENTIATE BETWEEN RP04/5/6 AND RM02/3/5 TYPE DRIVES.;R-; THIS ROUTINE DUMPS ALL OF PHYSICAL MEMORY;;E(PBNH== 0 ;;;DEFAULT CYLINDER ADDRESS0PBNL== 1 ;;;DEFAULT TRACK AND SECTOR ADDRESS5 CALL CKSUM ;;;CHECK DISK ADDRESS AGAINST CHECKSUMB( MOV #40,10(R0) ;;;RESET RH CONTROLLER  MOVB R3,10(R0) ;;;SELECT UNIT1 MOV 26(R0),R4 ;;;RETRIEVE DEVICE TYPE REGISTERY+ BIT #40000,R4 ;;;IS THIS A MASSBUS DISK?E BNE 5$ ;;;IF NE NO)  BIC #^C<777>,R4 ;;;CLR EXTRANEOUS BITSI+! BIT #20,R4 ;;;IS IT A DISK OF INTEREST?E" BEQ 5$ ;;;IF EQ NO+# CMP #25,R4 ;;;IS IT RP04/5/6 OR RM02/3?$ BHIS 10$ ;;;IF HIS YES% CMP #27,R4 ;;;IS IT RM05?;& BEQ 10$ ;;;IF EQ YES*'5$: MOV #$CRMS6,R1 ;;;NO, ILLEGAL DEVICE+( BR WERR1 ;;;PRINT MESSAGE AND TRY AGAIN;*)10$: CLR @#$CRBAE ;;;INITIALIZE BAE FLAG"* MOV R0,R4 ;;;;COPY CSR ADDRESS3+ ADD #26,R4 ;;;ADD OFFSET TO DRIVE TYPE REGISTERI>,20$: ADD #2,R4 ;;; R4 > register (11/24 and 11/84 problem)."- TST (R4) ;;; Device reg there?. BCC 20$ ;;;IF CC IT EXISTS// SUB #50,R4 ;;;SUB # OF DEVICE REGISTERS + 2 0 SUB R0,R4 ;;;,1 BNE 30$ ;;;IF NE IT'S AN RH70 CONTROLLER+2 COM @#$CRBAE ;;;IT'S NOT, RESET BAE FLAG$23 CLR @#UBMPR ;;;AND INITIALIZE FIRST UNIBUS ...*4 CLR @#UBMPR+2 ;;;;... MAPPING REGISTERS<530$: BIS #60,@#SR3 ;;;ENABLE 22 BIT MAPPING AND UNIBUS MAP%6 MOV #40,10(R0) ;;;CLEAR CONTROLLER 7 MOVB R3,10(R0) ;;;SELECT UNIT(8 MOV #23,(R0) ;;;DO A PACK ACKNOWLEDGE)9 MOV @#$CRSBN,34(R0) ;;;SELECT CYLINDER?.: MOV @#$CRSBN+2,6(R0);;;SET SECTOR AND TRACK$; CLR 4(R0) ;;;ZERO BUFFER ADDRESS)< MOV #14000,32(R0) ;;;SET 16-BIT FORMAT 7=40$: MOV #-<256.*4*4>,2(R0) ;;;WORD COUNT = 4K WORDSE0> MOVB #61,(R0) ;;;START TO WRITE ALL OF MEMORY2?50$: MOV #10,-(SP) ;;; Stack - delay loop count.8@51$: BIS -(SP),(SP)+ ;;; Delay for 11/84 (DR) problem.A DEC (SP) ;;; End of delay?,B BNE 51$ ;;; IF NE, No - delay some more.!C TST (SP)+ ;;; Maintain stack.O&D BIT #100200,(R0) ;;;READY OR ERROR?E BEQ 50$ ;;;IF EQ NEITHER.F TST @#$CRBAE ;;;;IS THE BAE REGISTER THERE?G BEQ 60$ ;;;IF EQ YES?H ADD #<1024.*4*2>,@#UBMPR ;;;NO, POINT UMR TO NEXT 4K OF MEM0#I ADC @#UBMPR+2 ;;;DOUBLE WORD ADD "J CLR 4(R0) ;;;RESET BUS ADDRESS)K60$: BIT #40000,(R0) ;;;TRANSFER ERROR?yL BEQ 40$ ;;;IF EQ NO-0M BIT #4000,10(R0) ;;;NONEXISTENT MEMORY ERROR?+N BNE $CRSHT ;;;IF NE YES, ELSE I/O ERRORFOP .ENDCQRS .IF EQ C$$CDA-6TU;aV; DMW;B=X; IF THE EXECUTIVE DOES NOT SUPPORT 22-BIT ADDRESSING, THISR;Y; ROUTINE DUMPS ALL OF PHYSICAL MEMORY UP TO A MAXIMUM OF Z; 124K WORDS.A[;1=\; IF THE EXECUTIVE SUPPORTS 22-BIT ADDRESSING, THIS ROUTINE@!]; DUMPS ALL OF PHYSICAL MEMORY.R^;)<_; NOTE THAT THE STANDARD METHOD OF DUMPING ALL OF PHYSICAL<`; MEMORY (DUMPING UNTIL THE CONTROLLER DETECTS NONEXISTENTDa; MEMORY) DOES NOT WORK, BECAUSE THE RK611 WRITES AN UNCORRECTABLEBb; ECC ERROR IN THE LAST SECTOR IT WRITES UNDER THOSE CONDITIONS.c;Ed-ePBNH== 0 ;;;RK06 DEFAULT CYLINDER ADDRESSR0fPBNL== 1 ;;;DEFAULT SECTOR AND TRACK ADDRESSg5h MOV #TRP04,@#114 ;;;POSITION TRAP CATCHER FOR NON-S#i ;;;EXISTENT MEMORY TRAPS WHENN'j ;;;SIZE REGISTER > SIZE OF MEMORY5k CALL CKSUM ;;;CHECK BLOCK NUMBER AGAINST CHECKSUM %l CLR R2 ;;;ASSUME DRIVE IS AN RK06 .m MOV #40,10(R0) ;;;CLEAR THE RK611 SUBSYSTEM#n MOV R3,10(R0) ;;;SELECT THE UNITN,o MOV #1,(R0) ;;;SELECT THE DRIVE FUNCTIONp10$: TSTB (R0) ;;;READY?Iq BPL 10$ ;;;IF PL NO=&r BIT #400,12(R0) ;;;IF THIS AN RK07?%s BEQ 20$ ;;;IF EQ NO, IT'S AN RK06Kt BIS #2000,R2 ;;;SET RK07 BIT 2u20$: MOV #40,10(R0) ;;;CLEAR THE RK611 SUBSYSTEM#v MOV R3,10(R0) ;;;SELECT THE UNITE$w MOV R2,R1 ;;;COPY DRIVE TYPE BIT+x BIS #3,R1 ;;;GET PACK ACK FUNCTION CODE(00d_K_^DATADATADATADATADATADATADATAy MOV R1,(R0) ;;;DO A PACK ACKNOWLEDGEz30$: TSTB (R0) ;;;READY?6{ BPL 30$ ;;;IF PL NO0$| MOV 12(R0),R1 ;;;GET DRIVE STATUS} COM R1 ;;;COMPLEMENT'~ BIT #100301,R1 ;;;DRIVE READY TO GO?B# BNE WERR ;;;IF NE NO, TRY AGAINR' MOV @#$CRSBN,20(R0) ;;;LOAD CYLINDER + MOV @#$CRSBN+2,6(R0);;;LOAD SECTOR/TRACKR$ BIS #23,R2 ;;;SET WRITE FUNCTION' CLR @#UBMPR ;;;INITIALIZE FIRST UMR; CLR @#UBMPR+2 ;;;...V8 BIS #60,@#SR3 ;;;ENABLE 22-BIT MAPPING AND UNIBUS MAP2 ;;;(KERNEL D HAS BEEN CONDITIONALLY ENABLED), MOV #140000,R5 ;;;SET TO MAP THROUGH APR61 CLR @#KISAR6 ;;;POINT AT FIRST BYTE OF 4K WORDT! MOV #77406,@#KISDR6 ;;;SEGMENTB550$: CLR 4(R0) ;;;START AT BEGINNING OF MEMORY ...F ;;;... OR UNIBUS MAP2 MOV #-2000,2(R0) ;;;WRITE 1K WORDS PER TRANSFER  BIS R2,(R0) ;;;START WRITING*60$: BIT #100200,(R0) ;;;READY OR ERROR? BEQ 60$ ;;;IF EQ NEITHER BMI WERR ;;;IF MI ERRORB6 ADD #4000,@#UBMPR ;;;POINT TO NEXT 1K WORD BOUNDARY ADC @#UBMPR+2 ;;;2 ADD #40,@#KISAR6 ;;;POINT AT FIRST WORD OF NEXT ;;;TRANSFER6= CMP #170000,@#KISAR6 ;;;IS IT ABOVE HIGHEST POSSIBLE WORD?7 BEQ $CRSHT ;;;IF EQ YES00 TST (R5) ;;;DOES FIRST WORD OF NEXT TRANSFER ;;;EXIST?  BCC 50$ ;;;IF CC YES BR $CRSHT ;;;DONE  .ENDC .IIF EQ C$$CDA-7 CDA$DL=0 .IF DF CDA$DL!DL$$CD!H$$GEN;;; DL;E; IF THE EXECUTIVE DOES NOT SUPPORT 22-BIT ADDRESSING, THIS ROUTINEW?; DUMPS ALL OF PHYSICAL MEMORY UP TO A MAXIMUM OF 124K WORDS.A;S=; IF THE EXECUTIVE SUPPORTS 22-BIT ADDRESSING, THIS ROUTINEI!; DUMPS ALL OF PHYSICAL MEMORY.;Q<; NOTE THAT THE STANDARD METHOD OF DUMPING ALL OF PHYSICAL@; MEMORY (DUMP MEMORY UNTIL THE CONTROLLER DETECTS NONEXISTENTD; MEMORY) DOES NOT WORK ON A Q-BUS CPU WHERE SOME MEMORY IS UNUSEDE; BECAUSE IT "OVERLAPS" THE I/O PAGE. FOR EXAMPLE, A 124K WORD CPUFA; WITH FOUR 32K WORD MEMORY BOARDS. UNDER THOSE CIRCUMSTANCES,C; BECAUSE THE RL01/02 CONTROLLER DOES NOT ASSERT THE Q-BUS SIGNAL@; DECLARING AN I/O PAGE ADDRESS TO BE AN I/O PAGE ADDRESS, THE*; MEMORY WILL ANSWER I/O PAGE ADDRESSES.;T$ .IF NE C$$CDA ;IF RESIDENT CRASHPBNH== 0 ;;;NOT USED1PBNL== 2 ;;;RL01/02 CYLINDER,TRACK AND SECTORY .ENDC ; EQ C$$CDA;E(; **** IMPORTANT - PLEASE NOTE ****;SD; WITH LOADABLE CRASH DUMP SUPPORT, PBNL AND PBNH ARE DEFINED WITH>; GLOBAL DEFINITIONS IN THE BUILD FILE FOR EACH DRIVER. ANYD; MODIFICATIONS MADE HERE TO PBNL OR PBNH MUST BE ALSO MADE IN THE; CORRESPONDING BUILD FILE.G;R .IF DF H$$GEN .IF DF, L$$CDA ; GL003DLDU: INCB CRDEV ; GL003C' CMPB #'L,@CRDEV ;;;IS THIS THE RL11?L .IFF ; DF L$$CDAR.DLDU: CMPB #'L,$CRDEV+1 ;;;IS THIS THE RL11? .ENDC ; DF L$$CDA BEQ RL11 ;;;IF EQ YESL& ;;;ONLY DL/DU FOR P$$GEN SYSTEMS* JMP MSCPDV ;;;GO TO MSCP CRASH ROUTINE .ENDC,RL11: CALL CKSUM ;;;CHECKSUM DISK ADDRESS .IF DF, L$$CDA ; GL003- CLR @CRBAE ;;;INITIALIZE BAE FLAG ; GL003 .IFF ; DF L$$CDA ; GL003 CLR @#$CRBAEG .ENDC ; DF L$$CDA ; GL003, BIS #60,(R0) ;;;SET EXTENDED ADDRESS BITS" CLR 10(R0) ;;;CLEAR RLBAE BITS( BCS 2$ ;;;IF CS RLBAE DOES NOT EXIST' BIT #60,(R0) ;;;DID ADDRESS BITS SET1 BEQ 3$ ;;;IF EQ YES; .IF DF, L$$CDA ; GL003/2$: COM @CRBAE ;;;NO, RESET BAE FLAG ; GL003N .IFF ; DF L$$CDA ; GL003;(2$: COM @#$CRBAE ;;;NO, RESET BAE FLAG .ENDC ; DF L$$CDA ; GL0032 CLR @#UBMPR ;;;AND INITIALIZE FIRST UNIBUS ...* CLR @#UBMPR+2 ;;;;... MAPPING REGISTERS;3$: BIS #60,@#SR3 ;;;ENABLE 22 BIT MAPPING AND UNIBUS MAP ; MOV #<1920.*4>,-(SP) ;;;NUMBER OF BLOCKS IN 1920K WORDS 1 MOV #<4*4>,R5 ;;;NUMBER OF BLOCKS PER 4K WORDSS, SWAB R3 ;;;MOVE UNIT NUMBER TO HIGH BYTE( BIS #4,R3 ;;;SET GET STATUS FUNCTION- MOV #13,4(R0) ;;;SET CODES TO CLEAR DRIVER ' MOV R3,(R0)00d__b_c_d_k ;;;EXECUTE THE FUNCTIONB*10$: BIT #100200,(R0) ;;;READY OR ERROR? BEQ 10$ ;;;IF EQ NEITHER# BMI WERRX ;;;IF MINUS I/O ERROR.0  ADD #4,R3 ;;;CONVERT TO READ HEADER FUNCTION   .IF DF, L$$CDA ; GL003 7  MOV @CRSB2,R4 ;;; SAVE STARTING DISK ADDRESS ; GL003R .IFF ; DF L$$CDA ; GL003V2 MOV @#$CRSBN+2,R4 ;;;SAVE STARTING DISK ADDRESS .ENDC ; DF L$$CDA ; GL0033 CLR 2(R0) ;;;SET BUFFER ADDRESS FOR FIRST WRITER"15$: MOV R3,(R0) ;;;READ HEADER)20$: BIT #100200,(R0) ;;;DONE OR ERROR?0 BEQ 20$ ;;;IF EQ NEITHER# BMI WERRX ;;;IF MINUS I/O ERRORR) MOV 6(R0),R1 ;;;GET HEADER INFORMATIONA* MOV R4,R2 ;;;COPY DESIRED DISK ADDRESS" XOR R1,R2 ;;;FORM A DIFFERENCE$ BIC #77,R2 ;;;IGNORE SECTOR BITS% BEQ 40$ ;;;IF EQ NO SEEK REQUIREDL* MOV R4,R2 ;;;COPY DESIRED DISK ADDRESS+  BIC #177,R1 ;;;ISOLATE CYLINDER ADDRESS 3! BIC #177,R2 ;;;ISOLATE CYLINDER ADDRESS DESIREDS-" SUB R2,R1 ;;;SUBTRACT DESIRED FROM ACTUAL '# BHIS 25$ ;;;IF HIS ACTUAL >=DESIREDR/$ NEG R1 ;;;ACTUAL < DESIRED, MAKE POS. DIFF.R4% BIS #4,R1 ;;;SET SIGN FOR MOVE TO CENTER OF DISK &25$: INC R1 ;;;SET MARKER BIT(' BIT #100,R4 ;;;WHICH HEAD DO WE WANT ( BEQ 30$ ;;;IF EQ IT'S HEAD 0) BIS #20,R1 ;;;SET HEAD 1+*30$: MOV R1,4(R0) ;;;LOAD DIFFERENCE WORD,)+ SUB #2,R3 ;;;CONVERT TO SEEK FUNCTION7!, MOV R3,(R0) ;;;START THE SEEK*-35$: BIT #100200,(R0) ;;;READY OR ERROR?. BEQ 35$ ;;;IF EQ NEITHER / BMI WERRX ;;;IF MI I/O ERROR0040$: MOV R4,4(R0) ;;;LOAD DESIRED DISK ADDRESS01 MOV #-256.,6(R0) ;;;LOAD ONE BLOCK WORD COUNT&2 BIC #17,R3 ;;;REMOVE FUNCTION BITS$3 BIS #12,R3 ;;;SET WRITE FUNCTION"4 MOV R3,(R0) ;;;START THE WRITE*545$: BIT #100200,(R0) ;;;ERROR OR READY?6 BEQ 45$ ;;;IF EQ NEITHER7 BMI 70$ ;;;IF MI ERROR08 DEC (SP) ;;;DUMPED MAXIMUM AMOUNT OF MEMORY?9 BEQ 72$ ;;;IF EQ YES#: DEC R5 ;;;DECREMENT BLOCK COUNT !; BNE 60$ ;;;IF NE USE SAME UMRI<= .IF DF, L$$CDA ; GL003>4? TST @CRBAE ;;;IS THE BAE REGISTER THERE? ; GL003@A .IFF ; DF L$$CDA ; GL003AB5C TST @#$CRBAE ;;;IS THE BAE REGISTER THERE? ; GL003IDE .ENDC ; DF L$$CDA ; GL003FG BEQ 50$ ;;;IF EQ YES?H ADD #<1024.*4*2>,@#UBMPR ;;;NO, POINT UMR TO NEXT 4K OF MEM4#I ADC @#UBMPR+2 ;;;DOUBLE WORD ADDI"J CLR 2(R0) ;;;RESET BUS ADDRESS5K50$: MOV #<4*4>,R5 ;;;NUMBER OF BLOCKS PER 4K WORDSDL60$: MOV (R0),R3 ;;;GET CSR3M BIC #^C<1460>,R3 ;;;ISOLATE UNIT AND EX MEM BITSL$N ADD #2,R4 ;;;MOVE TO NEXT SECTOR"O MOV R4,R1 ;;;COPY DISK ADDRESS(P BIC #^C<77>,R1 ;;;GET THE SECTOR BITS!Q CMP #50,R1 ;;;OVERRUN COMING?TR BNE 40$ ;;;IF NE NON$S BIS #77,R4 ;;;INCREMENT TRACK... T INC R4 ;;;...SET SECTOR TO 0*U BIS #10,R3 ;;;SET READ HEADER FUNCTIONV BR 15$ ;;;AND GO AGAIN-W70$: BIT #20000,(R0) ;;;NONEXISTENT MEMORY?S X BEQ WERRX ;;;IF EQ I/O ERROR$Y72$: TST (SP)+ ;;;CLEAN THE STACKZ[\ .IF NDF H$$GENC]^ BR $CRSHT ;;;DUMP DONE_` .IFFab JMP $CRSHT ;;;DUMP DONERcd .IFTFe&fWERRX: TST (SP)+ ;;;CLEAN THE STACKgh .IFFOi#j JMP WERR ;;;GO TO ERROR HANDLERTkl .ENDCmn"o .ENDC ; DF CDA$DL!H$$GEN!DL$$CDpqr .IF EQ C$$CDA-10Sst;0u; DDv; >w; THIS ROUTINE DUMPS ALL OF PHYSICAL MEMORY UP TO A LIMIT OFx; 124K WORDSy;Oz/{PBNH== 0 ;;;NOT USED BY TU58 TAPE CARTRIDGE%|PBNL== 1 ;;;STARTING BLOCK NUMBER}F~; THIS CODE INTERFACES WITH A TU58 VIA A DL11 ASYNCHRONOUS INTERFACE0 CALL CKSUM ;;;CHECKSUM STARTING BLOCK NUMBER7 MOV #TRP04,@#114 ;;;POSITION NONEXISTENT MEMORY TRAPP, ;;;CATCHER FOR CPU'S WHERE MEMORY SIZE" ;;;REGISTER > SIZE OF MEMORY3 CLR @#KISAR6 ;;;WANT TO POINT TO PHYSICAL MEMORY & MOV #77406,@#KISDR6 ;;;THROUGH APR6; INITIALIZE TU58I' CLR -(SP) ;;;RESERVE SPACE ON STACK # MOV R3,-(SP) ;;;SAVE UNIT NUMBER BIS #1,4(R0) ;;;SEND BREAKN$ MOV #6,R2 ;;;SET TO SEND 6 NULLS 5$: CLRB 6(R0) ;;;SEND A NULL CALL XWAIT ;;; SOB R2,5$ ;;00d_K_^DATADATADATADATADATADATADATA;LOOPS CLR 4(R0) ;;;CLEAR BREAK% TST 2(R0) ;;;DUMP RECEIVER BUFFERO MOVB #4,6(R0) ;;;SEND INITC CALL XWAIT ;;;WAIT% MOVB #4,6(R0) ;;;SEND ANOTHER INITC CALL XWAIT ;;;WAIT%10$: TSTB (R0) ;;;RECEIVED A BYTE?, BPL 10$ ;;;IF PL NO) CMPB #20,2(R0) ;;;RECEIVED A CONTINUE? " BNE 35$ ;;;IF NE NO, I/O ERROR; SEND COMMAND PACKET2 MOV @#$CRSBN+2,R2 ;;;SAVE STARTING TU58 ADDRESS915$: MOV #140000,R1 ;;;INITIALIZE POINTER TO FIRST BYTEI ;;;MAPPED BY APR6L% MOVB #2,6(R0) ;;;SEND COMMAND FLAGT CALL XWAIT ;;;WAIT3 MOVB #12,6(R0) ;;;SEND COMMAND PACKET BYTE COUNTW; MOV #<12*400+2>,R4 ;;;INITIALIZE COMMAND PACKET CHECKSUM  CALL XWAIT ;;;WAIT& MOVB #3,6(R0) ;;;SEND WRITE OP CODE CALL XWAIT ;;;WAIT+ CLRB 6(R0) ;;;SEND A NULL MODIFIER BYTE31 MOV #3,R5 ;;;UPDATE PACKET CHECKSUM FOR THOSEC# CALL CKSM ;;;TWO BYTES AND WAITE& MOVB (SP),6(R0) ;;;SEND UNIT NUMBER, MOV #4,R3 ;;;SET COUNTER TO SEND 4 NULLS( ;;;(SWITCHES, LOW BYTE OF SEQUENCE& ;;;NUMBER, HIGH BYTE OF SEQUENCE( ;;;NUMBER, LOW BYTE OF BYTE COUNT)#20$: CALL XWAIT ;;;WAIT FOR DL11R CLR 6(R0) ;;;SEND A NULL SOB R3,20$ ;;;LOOP3 MOV (SP),R5 ;;;UPDATE PACKET CHECKSUM FOR FIRST- CALL CKSM ;;;FOUR OF THOSE BYTES AND WAITN7 MOVB #<1024.*2/400>,6(R0) ;;;SEND HIGH ORDER BYTE OFU) ;;;NUMBER OF BYTES TO TRANSFERD2 MOV #<1024.*2>,R5 ;;;UPDATE PACKET CHECKSUM FOR2 CALL CKSM ;;;TRANSFER BYTE COUNT AND THEN WAIT/ MOV R2,R3 ;;;COPY TU58 LOGICAL BLOCK NUMBERH* MOVB R3,6(R0) ;;;SEND LOW ORDER BYTE OF ;;;LOGICAL BLOCK NUMBER  SWAB R3 ;;;R CALL XWAIT ;;;WAIT FOR DL11U+ MOVB R3,6(R0) ;;;SEND HIGH ORDER BYTE OF; ;;;LOGICAL BLOCK NUMBERS+ MOV R2,R5 ;;;UPDATE PACKET CHECKSUM FORW. CALL CKSM ;;;LOGICAL BLOCK NUMBER AND WAIT3 MOVB R4,6(R0) ;;;SEND LOW ORDER BYTE OF CHECKSUMS SWAB R4 ;;;2 CALL XWAIT ;;;WAIT FOR DL11M4 MOVB R4,6(R0) ;;;SEND HIGH ORDER BYTE OF CHECKSUM2; SEND PROMISED DATA TO TU58 IN 128 BYTE PACKETS: MOV #<1024.*2/128.>,2(SP) ;;;NUMBER OF 128 BYTE PACKETS% ;;;PER 1K WORDS OF MEMORYI*30$: TSTB (R0) ;;;RECEIVED A CHARACTER? BPL 30$ ;;;IF PL NO) CMPB #20,2(R0) ;;;RECEIVED A CONTINUE? '35$: BNE DEND ;;;IF NE NO, I/O ERRORK1 MOV #<128./2>,R3 ;;;NUMBER OF WORDS PER PACKETR CALL XWAIT ;;;WAIT FOR DL11K1 MOVB #1,6(R0) ;;;SEND DATA PACKET COMMAND FLAGD CALL XWAIT ;;;WAIT FOR DL11G4 MOVB #128.,6(R0) ;;;SEND NUMBER OF DATA BYTES PER ;;;DATA PACKET: MOV #<128.*400+1>,R4 ;;;INITIALIZE DATA PACKET CHECKSUM CALL XWAIT ;;;WAIT FOR DL11O540$: MOV (R1),R5 ;;;WILL USE DATA WORD IN CHECKSUME3 MOVB (R1)+,6(R0) ;;;SEND FIRST BYTE OF DATA WORDC CALL XWAIT ;;;WAIT FOR DL11N' MOVB (R1)+,6(R0) ;;;SEND SECOND BYTE// CALL CKSM ;;;FACTOR DATA WORD INTO CHECKSUMI ;;;AND THEN WAIT3 SOB R3,40$ ;;;LOOP FOR EACH DATA WORD OF PACKETC3 MOVB R4,6(R0) ;;;SEND LOW ORDER BYTE OF CHECKSUMS SWAB R4 ;;;A CALL XWAIT ;;;WAIT FOR DL114 MOVB R4,6(R0) ;;;SEND HIGH ORDER BYTE OF CHECKSUM' DEC 2(SP) ;;;DECREMENT PACKET COUNT( BNE 30$ ;;;IF NE SEND ANOTHER PACKET*; CLEAR OUT END PACKET MESSAGE FROM TU583 MOV #14.,R3 ;;;NUMBER OF BYTES IN AN END PACKETV*50$: TSTB (R0) ;;;RECEIVED A CHARACTER? BPL 50$ ;;;IF PL NO ! TST 2(R0) ;;;DUMP CHARARACTERA SOB R3,50$ ;;;LOOP3 CMP #<7600-40>,@#KISAR6 ;;;HAVE SENT 124K WORDS?; BNE 70$ ;;;IF NE NOU)60$: CMP (SP)+,(SP)+ ;;;CLEAN OFF STACKT BR $CRSHT ;;;SUCCESS470$: TST (R1) ;;;DOES NEXT MEMORY LOCATION EXIST?+ BCS 60$ ;;;IF CS NO (NONEXISTENT MEMORY ' ;;;TRAP CATCHER CAUGHT REFERENCE) 1 ADD #4,R2 ;;;UPDATE TU58 LOGICAL BLOCK NUMBER;0 ADD #40,@#KISAR6 ;;;POINT AT NEXT 1K WORDS OF ;;;PHYSICAL MEMORY& JMP 15$ ;;;REPEAT 1K WORD TRANSFER0CKSM: ADD R5,R4 ;;;ADD 2ND WORD TO FIRST WITH+ ADC R4 ;;;END AROUND TREATMENT OF C-BITS,XWAIT: TSTB 4(R0) ;;;DL11 TRANSMIT RE00d__b_c_d_kADY? BPL XWAIT ;;;IF PL NOC RETURN ;;; (DEND: CMP (SP)+,(SP)+ ;;;RESTORE STACK .ENDC .IIF EQ, C$$CDA-12 CDA$MS=0: .IF DF CDA$MS!MS$$CD ;LOADABLE OR RESIDENT CRASH DRIVER; ; MS ;O= ; IF THE EXECUTIVE DOES NOT SUPPORT 22-BIT ADDRESSING, THIS< ; ROUTINE DUMPS ALL OF PHYSICAL MEMORY (UP TO A MAXIMUM OF/ ; 124K WORDS) IN 512 BYTE BLOCKS AT 1600 BPI.  ;=; IF THE EXECUTIVE SUPPORTS 22-BIT ADDRESSING, THIS ROUTINE0@; DUMPS ALL OF PHYSICAL MEMORY IN 512 BYTE BLOCKS AT 1600 BPI.; $ .IF NE C$$CDA ;IF RESIDENT CRASH-PBNH== 0 ;;;BLOCK NUMBER IGNORED FOR TS11PBNL== 0 ;;; .ENDC ; EQ C$$CDAD; (; **** IMPORTANT - PLEASE NOTE ****;ED; WITH LOADABLE CRASH DUMP SUPPORT, PBNL AND PBNH ARE DEFINED WITH>; GLOBAL DEFINITIONS IN THE BUILD FILE FOR EACH DRIVER. ANYD ; MODIFICATIONS MADE HERE TO PBNL OR PBNH MUST BE ALSO MADE IN THE!; CORRESPONDING BUILD FILE.";U#$%& .IF DF, L$$CDA1'( ADD #12,MSCR12) MOV MSCR1,R5 ;;; ADDRESS OF COMMAND PACKET MUST*+ .IFF ; DF L$$CDA ; GL003C,9- MOV #<$MSCR1+12>,R5 ;;; ADDRESS OF COMMAND PACKET MUSTQ./ .ENDC ; DF L$$CDA ; GL0030-1 BIC #3,R5 ;;;BE ON A DOUBLE WORD BOUNDARY 52 MOV #8.,-(R5) ;;;LENGTH OF COMMAND PACKET IN BYTES /3 CLR -(R5) ;;;UPPER 2 BITS OF COMMAND PACKETV4 ;;;ADDRESS56 .IF DF, L$$CDAP7(8 MOV MSCR2,-(R5) ;;; LOW ORDER 16 BITS9: .IFF ; DF L$$CDA;*< MOV #$MSCR2,-(R5) ;;; LOW ORDER 16 BITS=> .ENDC ; DF L$$CDA?7@ MOV #100004,-(R5) ;;;WANT TO "WRITE CHARACTERISTICS" 0A MOV R5,R4 ;;;COPY POINTER TO COMMAND PACKET.'B ;;;IF R4.EQ.R5, MS: BEING SET UP.$0C MOV R0,R1 ;;;FORM POINTER TO STATUS REGISTERD TST -(R1) ;;;M3E CALL 200$ ;;;ISSUE COMMAND, WAIT FOR SUBSYSTEM,%F ;;;READY, AND HANDLE ANY ERRORSP4G MOV #142010,(R5) ;;;REWIND AND CLEAR VOLUME CHECK'H CALL 200$ ;;;ISSUE COMMAND AND WAIT%I MOV #100005,(R5)+ ;;;WANT TO WRITEM6J MOV #20000,(R5) ;;;ASSUME DATA TRANSFER VIA UMR #1.KL .IF DF, L$$CDA ; GL003MN BIT #HF.UBM,@HFMSK ;;;UMPs ?MOP .IFF ; DF L$$CDA ; GL003AQ!R BIT #HF.UBM,@#$HFMSK ;;;UMPs ?EST .ENDC ; DF L$$CDA ; GL003U,V BNE 10$ ;;;IF NE, YES. DT TRFR - UMR #1.1W CLR (R5) ;;;Q BUS - NO UMR'S; START FROM @ 0.,X10$: TST (R5)+ ;;;R5 > CMD PKT, 3RD WORD.#Y CLR (R5)+ ;;;CLR HI ORD @ BITS.O0Z MOV #512.,(R5) ;;;512 BYTE PER DATA TRANSFER.'[ CLR @#UBMPR+4 ;;;INITIALIZE UMR #1 -M0\ CLR @#UBMPR+6 ;;; USED TO MAP DATA TRANSFERS.9] BIS #60,@#SR3 ;;;ENABLE 22 BIT MAPPING AND UNIBUS MAP.@1^ MOV #<1920./4>,R3 ;;;R3 - MAX # OF 4KW BLOCKS.=_40$: MOV #<4*4>,R2 ;;;R2 - #512 BYTE RECORDS/4KW MEM BLOCK.A#`50$: MOV #9.,R5 ;;;RETRY COUNT+1E%a CALL 200$ ;;;ISSUE WRITE AND WAIT 0b ADD #512.,2(R4) ;;;BUMP START ADDRESS OF DATAc ADC 4(R4) ;;;3/d SOB R2,50$ ;;;LOOP UNTIL REACH RECORD LIMIT"e ;;; (OR UNTIL ERROR IN 200$)9f ADD #<1024.*4*2>,@#UBMPR+4 ;;;BUMP ADDRESS OF UMR 1 BYR!g ADC @#UBMPR+6 ;;;4K WORDSNhi .IF DF, L$$CDA ; GL003j.k BIT #HF.UBM,@HFMSK ;;;USING UMR'S? ; GL003lm .IFF ; DF L$$CDA ; GL003n'o BIT #HF.UBM,@#$HFMSK ;;;USING UMR'S?Rpq .ENDC ; DF L$$CDA ; GL003rs BEQ 60$ ;;;IF EQ, NO. +t MOV #20000,2(R4) ;;;DT TRF PER UMR #1 @.2)u60$: DEC R3 ;;;WROTE MAX # 4KW BLOCKS?4v BNE 40$ ;;;IF NE, NO.;wx;TCy; NOTE THAT THE FOLLOWING BRANCH IS NEVER TAKEN IF 180$ IS FALLEN1Bz; INTO (R5 IS NEVER EQUAL TO R4, BECAUSE R5 IS A RETRY COUNT AND<{; R4 IS AN ADDRESS, UNLESS 180$ IS BRANCHED TO FROM BELOW)|;M}.~180$: CMP R4,R5 ;;; MS: DEVICE BEING SETUP?% BEQ 280$ ;;;IF EQ YES, ERROR EXITF3 MOV #100011,(R4) ;;;WANT TO FORMAT (WRITE A TAPE3 ;;;MARK)  MOV R4,(R1) ;;;ISSUE COMMAND&190$: TSTB (R0) ;;;SUBSYSTEM READY? BPL 190$ ;;;IF PL NO) JMP $CRSHT ;;; SUCCESSFUL TERMINATIONT*200$: MOV R3,-(SP) ;;;SAVE BLOCK COUNTER%210$: MOV R4,(R1) ;;;ISSUE COMMAND &225$: TSTB (R0) ;00d_K_^DATADATADATADATADATADATADATA;;SUBSYSTEM READY? BPL 225$ ;;;IF PL NO MOV (R0),R3 ;;;GET STATUS  BMI 250$ ;;;IF MI ERROR8( MOV (SP)+,R3 ;;;RESTORE BLOCK COUNTER1 BIC #1000,(R4) ;;;MAKE SURE "WRITE DATA RETRY"0 ;;;BIT IS CLEARR RETURN ;;;3 .IF DF, L$$CDA ; GL003250$: ADD #6,MSCR3 ; GL003. BIT #1,@MSCR3 ;;;END OF TAPE SEEN? ; GL003 .IFF ; DF L$$CDA ; GL003T.250$: BIT #1,@#$MSCR3+6 ;;;END OF TAPE SEEN? .ENDC ; DF L$$CDA ; GL003 BNE 180$ ;;;IF NE YESU& BIT #4000,R3 ;;;NONEXISTENT MEMORY? BNE 180$ ;;;IF NE YESA- BIC #^C<16>,R3 ;;;ISOLATE TERMINATION CODE+- CMP #12,R3 ;;;RECOVERABLE ERROR (TAPE HAS  ;;;NOT MOVED)? BEQ 270$ ;;;IF EQ YES - CMP #10,R3 ;;;RECOVERABLE ERROR (TAPE HAS, ;;;MOVED ONE RECORD)? # BNE 280$ ;;;IF NE NO, I/O ERROR36 BIS #1000,(R4) ;;;CHANGE COMMAND TO "SPACE REVERSE, ;;;ERASE, WRITE DATA"@)270$: DEC R5 ;;;EXHAUSTED RETRY COUNT?C BNE 210$ ;;;IF NE NO,280$: TST (SP)+ ;;;DISCARD RETURN ADDRESS .ENDC ; DF CDA$MS!MS$$CD;: .IIF EQ C$$CDA-13 .ERROR C$$CDA ;DX CRASH NOT SUPPORTED: .IIF EQ C$$CDA-14 .ERROR C$$CDA ;DY CRASH NOT SUPPORTED: .IIF EQ C$$CDA-15 .ERROR C$$CDA ;MF CRASH NOT SUPPORTED .IIF EQ C$$CDA-16 CDA$DU=0 .IF DF CDA$DU!H$$GEN!DU$$CD;0; DU; @; THIS ROUTINE DUMPS ALL OF MEMORY ONTO A REMOVABLE MEDIA MSCPA; TYPE DEVICE. CURRENTLY THE VALID DEVICES ARE RA60, RC25, AND$ ; RX50. ;I$ .IF NE C$$CDA ;IF RESIDENT CRASH)PBNH== 0 ;;;STARTING BLOCK NUMBER ...$PBNL== 1 ;;;...P .ENDC ; EQ C$$CDA;R(; **** IMPORTANT - PLEASE NOTE ****; D; WITH LOADABLE CRASH DUMP SUPPORT, PBNL AND PBNH ARE DEFINED WITH>; GLOBAL DEFINITIONS IN THE BUILD FILE FOR EACH DRIVER. ANYD; MODIFICATIONS MADE HERE TO PBNL OR PBNH MUST BE ALSO MADE IN THE; CORRESPONDING BUILD FILE.V; .MSCPDV: CALL CKSUM ;;;CHECKSUM DISK ADDRESS;; AT THIS TIME:F;$; R0=CSR ADDRESS; R3=UNIT NUMBER%; CONTROLLER IS IN AN UNKNOWN STATE;=! .IF EQ,C$$CDA ; LOADABLE CRASH' CLR RELOC ;;;CLEAR RELOCATION WORDS  CLR RELOC+2 .ENDC ; EQ C$$CDA7 MOV #$DUCSH,R2 ;;;GET ADDRESS OF INTIALIZATION TABLES0 MOV (R2)+,R4 ;;;GET ADDRESS OF COMMAND PACKET1 MOV (R2)+,R5 ;;;GET ADDRESS OF RESPONSE PACKETD< MOVB R3,P.UNIT(R4) ;;;STORE UNIT NUMBER IN COMMAND PACKET, CLR R3 ;;;ASSUME EXTENDED MEMORY SUPPORT# MOV #4000,R1 ;;;SETUP FOR STEP 1R, MOV R1,(R0)+ ;;;INITIALIZE PORT INTERFACE*10$: TST (R0) ;;;ANY CONTROLLER ERRORS? BPL 12$ ;;;IF PL NO JMP WERR ;;;ERROR ROUTINEC312$: BIT R1,(R0) ;;;IS CONTROLLER AT RIGHT STEP?A BEQ 10$ ;;;IF EQ NO, WAITA) CMP #4000,R1 ;;;DID WE JUST DO STEP 1?+ BNE 15$ ;;;IF NE NOM! .IF EQ,C$$CDA ; LOADABLE CRASHE;P; FIGURE RELOCATION WORD:IE; - IF 22 BIT ADDRESSING, THEN THE RELOCATION BIAS WILL BE ADDED TON:; THE VIRTUAL ADDRESS TO GIVE A 22 BIT PHYSICAL ADDRESSG; - IF NOT, THE RELOCATION BIAS WILL BE USED AS THE UMR VALUE AND THEO0; PHYSICAL ADDRESS WILL BE MAPPED USING UMR 5;;. MOV @KISA5,RELOC ;;;ADDRESS OF CODE ; GL003  .REPT 6! ASL RELOC ;;;CHANGE TO 22 BITA ROL RELOC+2 .ENDR  CLR 4(R2) ;;;CLEAR HIGH WORD'  MOV #RINGS,2(R2) ;;;ADDRESS OF RINGSR8  BIT #1000,(R0) ;;;CONTROLLER SUPPORT EXTENDED MEMORY?&  BEQ 13$ ;;; EQ, NO - MUST USE UMRS/  SUB #120000,RELOC ;;;SUBTRACT VIRTUAL 120000I1 SBC RELOC+2 ;;;TO MAKE ADDR RELOCATION EASIERO0 ADD RELOC,2(R2) ;;;ADD RELOCATION (LOW WORD) ADC 4(R2) ;;;ADD THE CARRY2 ADD RELOC+2,4(R2) ;;;ADD RELOCATION (HIGH WORD)* BR 15$ ;;;BRANCH AROUND UMR SETUP CODE413$: MOV RELOC,@#UBMPR+24;;;SET UP UMR 5 ; GL003$ MOV RELOC+2,@#UBMPR+26 ; GL003 COM R3 ;;;SET UMR FLAG .ENDC ; EQ C$$CDA" .IF NE,C$$CDA ; RESIDENT CRASH8 BIT #1000,(R0) ;;;CONTROLLER SUPPORT EXTENDED MEMORY? BNE 15$ ;;;IF 00d`_b_c_d_kEQ YES COM R3 ;;;NO, SET UMR FLAG .ENDC ; NE C$$CDA 5!15$: MOV (R2)+,(R0) ;;;SEND STEP WORD TO CONTROLLERC" ASL R1 ;;;MOVE STEP BITA!# BPL 10$ ;;;IF PL KEEP STEPING(/$ MOV (R2)+,R2 ;;;GET ADDRESS OF RESPONSE RING %"& .IF EQ, C$$CDA ; LOADABLE CRASH'%( TST R3 ;;;EXTENDED MEMORY SUPPORT2&) BNE 17$ ;;;NE, NO - MUST USE UMR'S&* MOV R5,(R2) ;;;RESET RESPONSE RING/+ ADD RELOC,(R2)+ ;;;ADD RELOCATION (LOW WORD) -, MOV RELOC+2,(R2) ;;;RELOCATION (HIGH WORD)1- ADC (R2)+ ;;;ADD THE CARRY%. MOV R4,(R2) ;;;RESET COMMAND RINGC// ADD RELOC,(R2)+ ;;;ADD RELOCATION (LOW WORD)O-0 MOV RELOC+2,(R2) ;;;RELOCATION (HIGH WORD)B1 ADC (R2) ;;;ADD THE CARRY'2 CMP -(R2),-(R2) ;;;DECREMENT 2 WORDSE"3 BR 18$ ;;;BRANCH AROUND RESETS45 .ENDC ; EQ C$$CDA6*717$: MOV R5,(R2)+ ;;;RESET RESPONSE RING%8 MOV R4,2(R2) ;;;RESET COMMAND RING;2918$: CALL RSET ;;;RESET OWNERSHIP WORDS IN RING:;N!;; CONTROLLER IS NOW INITIALIZED;(<; NEXT, PUT CONTROLLER AND UNIT ONLINE=;T>; R0=CSR ADDRESS +2)?; R1=100000 ("OWN")C.@; R2=ADDRESS OF SECOND WORD OF RESPONSE RINGA; R3=EXTENDED MEMORY FLAGLB; R4=COMMAND PACKET ADDRESS2C; R5=RESPONSE PACKET ADDRESSD;R8E MOVB #OP.ONL,P.OPCD(R4) ;;;LOAD ONLINE FUNCTION CODE)F CLR P.BCNT(R4) ;;;NO WORD COUNT NEEDEDV%G CALL IO ;;;DO THE ONLINE FUNCTIONV<H MOVB #OP.GUS,P.OPCD(R4) ;;;LOAD GET UNIT STATUS FUNCTION I CALL IO ;;;DO THE GET STATUS>J BIT #UF.RMV,P.UNFL(R5) ;;;IS THIS A REMOVEABLE MEDIA UNIT?K BNE 20$ ;;;IF NE YESL%M .IF DF, L$$CDA ;;; LOADABLE CRASH2N"O MOV CRMS6,R1 ;;; ILLEGAL DEVICEPQ .IFF ; DF L$$CDAFR#S MOV #$CRMS6,R1 ;;;ILLEGAL DEVICE TU .ENDC ; DF L$$CDAV+W BR WERR1 ;;;PRINT MESSAGE AND TRY AGAINE?X20$: MOVB #OP.WR,P.OPCD(R4) ;;;LOAD WRITE DATA FUNCTION CODEL4Y MOV #<512.*4*4>,P.BCNT(R4) ;;;BYTE COUNT FOR 4KWZ&[ .IF DF, L$$CDA ;;; LOADABLE CRASH\,] MOV @CRSB2,P.LBN(R4) ;;; SET STARTING LBN!^ MOV @CRSBN,P.LBN+2(R4) ;;; ...D_` .IFF ; DF L$$CDAIa0b MOV @#$CRSBN+2,P.LBN(R4) ;;; SET STARTING LBN#c MOV @#$CRSBN,P.LBN+2(R4) ;;; ...Ede .ENDC ; DF L$$CDAf(g CLR P.BUFF(R4) ;;;START AT PHYSICAL 0h CLR P.BUFF+2(R4) ;;;...*i BIS #60,@#SR3 ;;;ENABLE 22-BIT AND UMRS,j TST R3 ;;;EXTENDED ADDRESSING SUPPORTED?k BEQ 30$ ;;;IF EQ YES l CLR @#UBMPR+4 ;;;NO, USE UMRSm CLR @#UBMPR+6 ;;;...F:n MOV #20000,P.BUFF(R4) ;;;SET BUFFER ADDRESS THRU UMR 1o; 9p; ALL INITIAL VALUES ARE SETUP. NOW TRANSFER THE DATA.q; $r30$: CALL IO ;;;WRITE 4KW TO DISK3s ADD #<4*4>,P.LBN(R4);;;MOVE TO NEXT STARTING LBN(t ADC P.LBN+2(R4) ;;;...;(u TST R3 ;;;EXTENDED MEMORY SUPPORTED?v BEQ 40$ ;;;IF EQ YES2w ADD P.BCNT(R4),@#UBMPR+4 ;;;UPDATE UMR ADDRESSx ADC @#UBMPR+6 ;;;...Xy BR 30$ ;;;KEEP WRITING:z40$: ADD P.BCNT(R4),P.BUFF(R4) ;;;UPDATE BUFFER ADDRESS{ ADC P.BUFF+2(R4) ;;;...| BR 30$ ;;;};R?~; DO THE I/O AND CHECK FOR ERRORS. THE ONLY VALID ERRORS ARES,; NON-EXISTANT MEMORY AND INVALID COMMAND.;C  .ENABL LSBE6IO: TST -2(R0) ;;;FORCE CONTROLLER TO LOOK AT RINGS,10$: TST (R0) ;;;CONTROLLER STILL ONLINE?$ BMI 20$ ;;;IF MI, NO. ;CS0087 TST (R2) ;;;CONTROLLER SEND BACK A RESPONSE? ;**-1P3 BMI 10$ ;;;IF MI NO, IT STILL "OWNS" THE PACKET  TST P.STS(R5) ;;;ANY ERRORS?N BNE 20$ ;;;IF NE YES3RSET: BIS #100000,(R2) ;;;SET OWN FLAG INTO RINGS0 BIS #100000,4(R2) ;;;...A RETURN ;;;R"20$: TST (SP)+ ;;;CLEANUP STACK1 CMP #ST.NXM,P.STS(R5) ;;;NON-EXISTANT MEMORY?.% BEQ $CRSHT ;;;IF EQ YES, ALL DONEC6 CMPB #ST.CMD,P.STS(R5) ;;;DID WE OVERRUN THE DISK?% BEQ $CRSHT ;;;IF EQ YES, ALL DONE # ;;;NO, FATAL ERROR, FALL THRUO  .DSABL LSBA" .ENDC ; DF CDA$DU!H$$GEN!DU$$CD .PAGE .IIF EQ, C$$CDA-17 CDA$MU=0: .IF DF CDA$MU!MU$$CD ;LOADABLE OR RESIDENT CRASH DRIVER;R; MU;LH; IF 22-BIT ADDRESSING IS NOT SUPPORTED, THEN THIS ROUTINE DUMPS ALLD; OF PHYSICAL MEMORY (TO A MAX OF 124K WORDS) IN 00d`K_^DATADATADATADATADATADATADATA512 BYTE BLOCKS.;.@; IF 22-BIT ADDRESSING IS SUPPORTED, THEN THIS ROUTINE DUMPS/; ALL OF PHYSICAL MEMORY IN 512 BYTE BLOCKS.;; $ .IF NE C$$CDA ;IF RESIDENT CRASH3PBNH== 0 ;;;BLOCK NUMBER IGNORED FOR MU: DEVICEEPBNL== 0 ;;; .ENDC ; NE C$$CDA; RESTRICTION:;DA; WITH LOADABLE CRASH DUMP SUPPORT, PBNL .AND. PBNH ARE DEFINEDL?; WITH GLOBAL DEFINITIONS IN THE BUILD FILE FOR EACH DRIVER.D;AA; ANY MODIFICATIONS MADE HERE TO PBNL OR PBNH MUST BE ALSO MADEO%; IN THE CORRESPONDING BUILD FILE. ;R9; R0 - CSR, R3 = UNIT NUMBER, CNTRL IN AN UNKNOWN STATE5" .IF EQ C$$CDA ; LOADABLE CRASH( CLR RELOC ;;; Clear relocation words CLR RELOC+2 .ENDC ; EQ C$$CDA3 MOV #$MUCSH,R2 ;;; R2 > MU: Initialization tableI' MOV (R2)+,R4 ;;; R4 > Command packetP( MOV (R2)+,R5 ;;; R5 > Response packet8 MOVB R3,P.UNIT(R4) ;;; Command packet <-- Unit number) CLR R3 ;;; R3 - IF EQ, THEN 22 bit @. * MOV #4000,R1 ;;; R1 - setup for Step 1.1 MOV R1,(R0)+ ;;; Initialize the MU: controllerC'10$: TST (R0) ;;; Controller errors?  BPL 12$ ;;; IF PL, No.( JMP WERR ;;; Else - indicate error.312$: BIT R1,(R0) ;;; Controller at correct step?C( BEQ 10$ ;;; IF EQ, No - Wait for it.) CMP #4000,R1 ;;; Just complete Step 1?> BNE 15$ ;;; IF NE, No. .PAGE" .IF EQ C$$CDA ; LOADABLE CRASH; Setup relocation words:i;b@; If 22 bit @, THEN the relocation bias will be added to the*; virtual @ to give a 22 bit physical @.;tD; If not, THEN the relocation bias will be used as the UMR value2; and the physical @ will be mapped using UMR 5.1 MOV @KISA5,RELOC ;;; > MU: crash code. ; GL003r  .REPT 6 ASL RELOC ;;; Convert to ROL RELOC+2 ;;; 22 bit @.R .ENDR% CLR 4(R2) ;;; Clear high (@) wordN+ MOV #RINGS,2(R2) ;;; and setup Rings @.A6 BIT #1000,(R0) ;;; MU: controller in 22 bit @ mode?% BEQ 13$ ;;; IF EQ, NO - use UMRS. ; Setup 22 bit RING @.( SUB #120000,RELOC ;;; Subtract APR #5) SBC RELOC+2 ;;; virtual @ (120000).u* ADD RELOC,2(R2) ;;; RELOC,+2 > physical ADC 4(R2) ;;; 22 bit @& ADD RELOC+2,4(R2) ;;; of Rings.' BR 15$ ;;; 22 bit @ of Rings setup. ; Setup Rings @ via UMR #5. *13$: MOV RELOC,@#UBMPR+24 ;;; Use UMR #5* MOV RELOC+2,@#UBMPR+26 ;;; for Rings @., COM R3 ;;; R3 - IF NEQ, THEN using UMRs. .ENDC ; EQ C$$CDA" .IF NE,C$$CDA ; RESIDENT CRASH6 BIT #1000,(R0) ;;; MU: controller in 22 bit @ mode? BNE 15$ ;;; IF NEQ, No.C, COM R3 ;;; R3 - IF NEQ, THEN using UMRs. .ENDC ; NE C$$CDA<15$: MOV (R2)+,(R0) ;;; Next Init step word to controller.+ ASL R1 ;;; Prepare for next Init phase.p( BPL 10$ ;;; IF PL, more Init phases.' MOV (R2)+,R2 ;;; R2 > Response ring. .PAGE" .IF EQ C$$CDA ; LOADABLE CRASH TST R3 ;;; 22 bit @ mode?g% BNE 17$ ;;; IF NE, No - use UMRs.; 22 bit @ modeE MOV R5,(R2) ;;; Update ADD RELOC,(R2)+ ;;; > to" MOV RELOC+2,(R2) ;;; Response ADC (R2)+ ;;; ring. MOV R4,(R2) ;;; Update ADD RELOC,(R2)+ ;;; > to! MOV RELOC+2,(R2) ;;; Command  ADC (R2) ;;; ring.!  CMP -(R2),-(R2) ;;; R2 > RSP+2p  BR 18$ ;;; and cont.P  .ENDC ; EQ C$$CDA  ; Use UMRs217$: MOV R5,(R2)+ ;;; Update > to Response ring.. MOV R4,2(R2) ;;; Update > to Response ring.,18$: CALL RSET ;;; Controller owns rings.- MOV #401,-2(R4) ;;; Setup virt ckt/credit.;; Controller initialized - put controller and unit online;C#; R0 > Device SA register (CSR+2) ; R1 = 100000 ("OWN" mask); R2 > RSP+2+; R3 IF EQ - 22 BIT @, ELSE NE - UMRs.;-; R4 > Command packet R5 > Response packetp;B$; Clear the command packet fields.+ MOV R4,R1 ;;; R1 > Command packet area. 7 MOV -4(R4),-(SP) ;;; Stack has size of CMD PKT area.t*117$: CLR (R1)+ ;;; Clear CMD PKT area./  SUB #2,(SP) ;;; At the end of CMD PKT area?v+! BNE 117$ ;;; I00d`_b_c_d_kF NE, No - keep clearing.z%" TST (SP)+ ;;; Maintain the stack.%#; Setup controller characteristics. ?$ MOVB #OP.SCC,P.OPCD(R4) ;;; Setup CONTROLLER characteristics25% MOV #0,P.CNTF(R4) ;;; for no extraneous messages. & CALL IO ;;; Issue request.'; ONLINE the controller.+( MOVB #OP.ONL,P.OPCD(R4) ;;; Setup ONLINE %) CLR P.BCNT(R4) ;;; function code.a* CALL IO ;;; Issue request.+;Rewind the unit4, MOVB #OP.REP,P.OPCD(R4) ;;; Setup to Reposition -2- MOV #MD.CSE!MD.RWD,P.MOD(R4) ;;; Rewind to BOT.. CALL IO ;;; Issue request.)/; Write 512. byte memory areas to tape.t=0 MOVB #OP.WR,P.OPCD(R4) ;;; Setup WRITE DATA function code,r11 MOV #512.,P.BCNT(R4) ;;; 512. byte count anda52 MOV #MD.CSE,P.MOD(R4) ;;; no serious exceptions.N3 CLR (R4) ;;; CMD Ref <-- 0..)4 CLR P.BUFF(R4) ;;; Assume 22 bit @ andB.5 CLR P.BUFF+2(R4) ;;; start at physical 0.36 BIS #60,@#SR3 ;;; Enable 22-bit @ mode and UMRS.P7 TST R3 ;;; 22 bit @ mode?-8 BEQ 20$ ;;; IF EQ, Yes.((9 CLR @#UBMPR+4 ;;; Initialize UMR #1 -1: CLR @#UBMPR+6 ;;; used to map data transfers.a<;19$: MOV #20000,P.BUFF(R4) ;;; Data transfer per UMR #1 @.><20$: MOV #<4*4>,R1 ;;; R1-#512 byte records/4KW mem block.$=25$: INC (R4) ;;; CMD Ref <-- +1.+>; Cmd PKT setup - write 512. byte record..+?30$: CALL IO ;;; Write 512. byte record.'@ ADD #512.,P.BUFF(R4) ;;; > next 512.a(A ADC P.BUFF+2(R4) ;;; byte of memory.3B SOB R1,25$ ;;; Keep writing until 4KW boundary.BC TST R3 ;;; 22 bit @ mode?RD BEQ 20$ ;;; IF EQ, Yes. 2E ADD #<1024.*4*2>,@#UBMPR+4 ;;; Increment UMR #1F ADC @#UBMPR+6 ;;; by 4KW.R+G BR 19$ ;;; Write next 4KW memory block.VHJI; Start I/O and check for errors - only valid error is non-existing mem.)J; All other errors are unrecoverable.b K .ENABL LSB6LIO: MOV #60,-4(R5) ;;; Response packet - max lenght.6M TST -2(R0) ;;; Start I/O - Controller polls rings.+N10$: TST (R0) ;;; Controller yet ONLINE?nO BPL 15$ ;;; IF PL, OK.(P TST (SP)+ ;;; Else - maintain stack,*Q MOV #SAMSG,R1 ;;; R1 > SA error message R BR WERR1 ;;; and issue it.S1T15$: TST (R2) ;;; Controller yet own RSP ring?oU BMI 10$ ;;; IF MI, Yes. "V MOV P.STS(R5),-(SP) ;;; Isolate"W BIC #^C<37>,(SP) ;;; end code.X TST (SP)+ ;;; Success?2Y BNE 20$ ;;; IF NE, No -error, can't handle it.Z.[RSET: BIS #100000,(R2) ;;; Controller 'OWNS'%\ BIS #100000,4(R2) ;;; the rings.T ] RETURNC^%_20$: TST (SP)+ ;;; Maintain stack.P1` CMP #ST.NXM,P.STS(R5) ;;; Non-existing memory?0a BEQ WTMK ;;; IF EQ, Yes - write TMK and end.0b CMP #ST.HST,P.STS(R5) ;;; Max allowed memory?0c BEQ WTMK ;;; IF EQ, Yes - write TMK and end.7d MOV #PSTMSG,R1 ;;; Else - R1 > P.STS error message.Ce1f; Write a TMK and complete Crash to MU: device.:gWTMK: CMPB #OP.WTM,P.OPCD(R4) ;;; Already tried to WTMK?.h BEQ WERR1 ;;; IF EQ, Yes - then end crash..i MOVB #OP.WTM,P.OPCD(R4) ;;; Write a TMK and5j MOV #MD.CSE,P.MOD(R4) ;;; no serious exceptions.M,k CALL RSET ;;; Controller owns the rings.l CALL IO ;;; Issue request.(m CMP #PSTMSG,R1 ;;; Had a P.STS error?.n BEQ WERR1 ;;; IF EQ, Yes - then end crash.o BR $CRSHT ;;; All done.Sp q .DSABL LSB rs .ENDC ; DF CDA$MU!MU$$CDt .PAGEuvw .IFT ; DF L$$CDA!R$CRSHxyz;+G{; WHEN AN ERROR IS DETECTED BY A CRASH ROUTINE, CONTROL IS TRANSFERED,G|; HERE EITHER BY A JUMP, BR, OR BY SIMPLY FALLING THRU TO THIS SIMPLE}; ERROR HANDLER.~;- .IF DF, L$$CDA+WERR: MOV CRMS3,R1 ;;; INDICATE I/O ERRORC .IFF ; DF L$$CDA.,WERR: MOV #$CRMS3,R1 ;;;INDICATE I/O ERROR .ENDC ; DF L$$CDA'WERR1: CALL TYPE ;;;TYPE OUT MESSAGE" JMP AGAIN ;;;WAIT FOR THE USER;+G; AFTER THE DUMP HAS SUCCESSFULLY COMPLETED, THE CRASH ROUTINE SHOULDAG; BRANCH TO HERE SO THAT THE PROCESSOR MAY BE HALTED AND ANOTHER DUMPE ; BE TAKEN.,;-!$CRSHT: HALT ;;;WAIT FOR USER .IF DF L$$CDA  JMP @CRALTF .IFF ;DF L$00d```t`TADATADATADATADATADATA$CDA JMP @#$CRALTD .ENDC ;DF L$$CDA. .PAGE, .IF DF DU$$CD!MU$$CD ; DU/MU CRASH DRIVER%; CRASH DATA BASE FOR DU/MU DEVICESRK; RESTRICTION - any changes to this table must ALSO BE MADE IN LOWCR.MAC.:; For Resident crash - this is in exec CRASH module area:; and for loadable CRASH, it's in the DU/MU crash area. ; COMMAND AND RESPONSE PACKETS" .WORD 60 ; Packet length - 48.5 .WORD 1 ; Virtual circuit and credit/debit field.F)CMDPKT: .WORD 1 ; Command packet area.C  .REPT 23. .WORD 0 ; initially - 0s. .ENDR .BLKW 2 ; Envelope.S,RSPPKT: .BLKW 24. ; Response packet area.; COMMAND RINGS  .BLKW 2RINGS:-RSP: .WORD RSPPKT ; Response packet ring -c1 .WORD 100000 ; Packet "owned" by controller.f,CMD: .WORD CMDPKT ; Command packet ring -1 .WORD 100000 ; Packet "owned" by controller.; INITIALIZATION TABLE $DUCSH::'$MUCSH::.WORD CMDPKT ; > CMD packet.  .WORD RSPPKT ; > RSP packet.9 .WORD 100000 ; STEP 1 - lenght of rings,IE,Int vec/4.! .WORD RINGS ; 2 - lo ordS. .WORD 0 ; 3 - and hi ord @ of Rings. .WORD 1 ; 4. .WORD RSP ; > Response ringD%RELOC: .WORD 0,0 ;RELOCATION WORDSD .ENDC ; DF DU$$CD!MU$$CD ) .IF DF CDA$MU!MU$$CD ; MU CRASH DRIVERcP.NDCD = P.OPCD0  .NLIST BEXe=SAMSG: .ASCIZ <15><12><12>!CRASH -- I/O [SA] DEVICE ERROR;!CAPSTMSG: .ASCIZ <15><12><12>!CRASH -- I/O (P.STS) DEVICE ERROR;!>  .LIST BEX .ENDC ; DF CDA$MU!MU$$CDt .PAGE .IF DF H$$GEN. .IIF EQ C$$CDA-7, PBNL==2 ;DEFAULT TO RL11 .ENDC .ENDC ; DF L$$CDA!R$CRSHO& .ENDC ; EQ C$$CDA-20 ; KLN020 .ENDC ;C$$CDA .END.ENDC ; DF DU$$CD!MU$$CD ) .IF DF CDA$MU!MU$$CD ; MU CRASH DRIVERcP.NDCD = P.OPCD0  .NLIST BEXe=SAMSG: .ASCIZ <15><12><12>!CRASH -- I/O [SA] DEVICE ERROR;!CAPSTMSG: .ASCIZ <15><12><12>!CRASH -- I/O (P.ST;O?; MSPRE.MAC - PREFIX FILE FOR BUILDING MS LOADABLE CRASH DRIVER;O; Created 13-MAY-83A;3L$$CDA=0 ; LOADABLE CRASH DRIVERS TO BE ASSEMBLEDSMS$$CD=0 ; CRASH DRIVER IS MSER IS MSS.LIST;?; DLPRE.MAC - PREFIX FILE FOR BUILDING DL LOADABLE CRASH DRIVERO;p; Created 13-MAY-83O;3L$$CDA=0 ; LOADABLE CRASH DRIVERS TO BE ASSEMBLEDBDL$$CD=0 ; CRASH DRIVER IS DL3-MAY-83;3L$$CDA=0 ; LOADABLE CRASH DRIVERS TO BE ASSEMBLEDDL$$CD=0 ; CRASH DRIVER IS DU  BIT #IQ.X!IQ.Q!IQ.UMD,I.FCN(R3) ;ILLEGAL SUBMODIFIERS BEQ 10$ ;IT'S OK 0 JMP ILEGAL ;EXIT WITH ILLEGAL FUNCTION CODE*10$: CALL CMDCOM ;GET A COMMAND PACKET6 MOV I.PRM(R3),P.RBN+2(R1) ;REPLACEMENT BLOCK NUMBER6 MOV I.PRM+2(R3),P.RBN(R1) ;REPLACEMENT BLOCK NUMBER4 MOV I.PRM+4(R3),P.LBN+2(R1) ;LOGICAL BLOCK NUMBER2 MOV I.PRM+6(R3),P.LBN(R1) ;LOGICAL BLOCK NUMBER' MOV I.PRM+10(R3),P.MOD(R1) ;MODIFIERS? MOV I.PRM+6(R3),I.PRM+12(R3) ;CLEAR SPACE FOR RETURN ADDRESSM$ PUSH <#CLACMD> ;RETURN TO CLACMD' CALL CMDSEN ;ISSUE THE RPL COMMAND;;O(; RETURN TO THIS POINT WITH END PACKET; + MOV P.CRF+2(R1),R0 ;GET THE IOP ADDRESS B MOV I.PRM+12(R0),I.PRM+6(R0) ;PUT THE LOGICAL BLOCK NUMBER BACK% CALL ENDERR ;SET UP THE END CODEL  PUSH <#0> ;NO BYTE COUNTP! CALLR ENDCOM ;FINISH UP"# .PAGE,$ .SBTTL CMDRSN - READ VOLUME SERIAL NUMBER%;+'&; **-CMDRSN-READ VOLUME SERIAL NUMBERP';RL(; THE READ VOLUME SERIAL ROUTINE WILL READ THE 4-BYT00t `_b_c_d_kE VOLUME SERIAL NUMBERJ); CONTAINED IN THE DEVICE'S SECOND UCB EXTENSION INTO A BUFFER SPECIFIED*; IN THE I/O PACKET.+; ,; INPUTS:2-;R&.; R0 ADDRESS OF FUNCTION TABLE ENTRY/; R2 QST ADDRESS0; R3 I/O PACKET ADDRESS 1; R4 SCB ADDRESS2; R5 UCB ADDRESS3; 4; OUTPUTS:5;B6; R0 SUCCESS CODE7; R1 BYTES TRANSFERED8; R2-R5 PRESERVEDR9;-<CMDRSN: ;**-2F= BITB #IQ.X!IQ.Q!IQ.UMD,I.FCN(R3) ;DO WE HAVE ANY ILLEGAL MODIFIERS?> BEQ 10$ ;NOPE, CONTINUE(? CALLR ILEGAL ;ILLEGAL FUNCTION CODEF?10$: PUSH ;SAVE SCB, IOP, QST, AND BYTE COUNT ;PKW109DE MOV #X.VSER+120000,R0 ;GET DISPLACEMENT FOR SERIAL NUMBER ;**-5)F CALL 30$ ;TRANSFER THE SERIAL NUMBERP-G MOV 4(SP),R3 ;RETRIEVE I/O PACKET ADDRESSA6H CMP #6,I.PRM+4(R3) ;DO WE WANT THE UNIT FLAGS TOO?I BNE 20$ ;IF NE NO4J ADD #4,I.PRM+2(R3) ;POINT AT WORD FOR UNIT FLAGSK ADCB I.PRM+1(R3) ;...,)L MOV #2,(SP) ;TRANSFER JUST TWO BYTES?;M MOV #X.UNFL+120000,R0 ;GET DISPLACEMENT FOR UNIT FLAGSN&N CALL 30$ ;TRANSFER THE UNIT FLAGS,O MOV #6,(SP) ;SET TOTAL BYTES TRANSFERED'P20$: POP ;SET BYTES TRANSFEREDT7Q POP ;RESTORE QST, IOP, AND SCB ADDRESSESI#R MOV #IS.SUC&377,R0 ;SET SUCCESSE6S PUSH <#CLACMD> ;RETURN TO STARTING ANOTHER COMMANDT CALLR ENDCM1OU5V30$: MOVB I.PRM+1(R3),R2 ;SET HI 6-BITS OF ADDRESST1W MOV I.PRM+2(R3),R3 ;SET LO 16-BITS OF ADDRESS2X ASHC #10.,R2 ;CALCULATE DISPLACEMENT AND BIASY ASHC #-10.,R3 ;...5Z MOV R3,R4 ;COPY DESTINATION DISPLACEMENT INTO R4 1[ BIS #140000,R4 ;SET DESTINATION BIAS FOR APR6F-\ MOV R2,R3 ;COPY DESTINATION BIAS INTO R3(] MOV R0,R2 ;COPY SOURCE DISPLACEMENT)^ MOV 2(SP),R0 ; GET # OF BYTES TO MOVE ._ MOV U.UC2X(R5),R1 ;GET SOURCE BIAS INTO R13_ CALLR @BLXIO ;MOVE THE DATA AND RETURN ;GM112. ;**-62 .ENDC ;D$$DSKT .PAGE .IF DF,T$$APE ;JJM304J .SBTTL CMDRWD - PROCESS ROUTINE FOR IO.RWD AND IO.RWU FUNCTIONS ;JJM304;+ ;**-3,/; **-CMDRWD-ROUTINE TO HANDLE REWIND FUNCTIONB;4K; THIS ROUTINE WILL PROCESS THE RSX IO.RWD AND IO.RWU FUNCTIONS FOR TAPESA;O; ; INPUTS: ;Y&; R0=ADDRESS OF FUNCTION TABLE ENTRY; R2=ADDRESS OF QST ; R3=ADDRESS OF I/O PKTT; R4=ADDRESS OF SCB; R5=ADDRESS OF UCBH;A ; OUTPUTS:;.; R0=STATUS CODE; R2-R5 ARE PRESERVED.;; U.CW2, BIT M.AEOV CLEAR ON SUCCESSFUL REWIND OPERATIONE8; U.CW2, BIT M.REW SET TO INDICATE TAPE IS REWINDING<; U.STS, BIT US.PWF CLEAR POWERFAIL BIT TO ALLOW COMMANDS;;<; THE VALUE TO PUT INTO IOSB+2 IS ON THE STACK FOR ENDCOM;- CMDRWU:OA PUSH #MD.UNL!MD.CSE ;SET UNLOAD AND 'CLR SER EXCEPT' MODIFIER  BR CMDRWC ;JOIN COMMON CODE CMDRWD: ; PUSH #MD.RWD!MD.IMM!MD.CSE ;SET REWIND, IMMEDIATE, AND" ;'CLR SER EXCEPT' MODIFIERS!CMDRWC: ;COMMON ENTRY POINTW2 CALL CMDCOM ;ALLOCATE (T)MSCP PACKET AND FILL ;COMMAND FIELDS) BIS (SP)+,P.MOD(R1) ;SET THE MODIFIERST, PUSH <#CLACMD> ;SAVE ROUTINE ADD ON STACK+ CALL CMDSEN ;SEND COMMAND TO CONTROLLERO;+; END PACKET PROCESSINGM;-C BICB #EF.EOT,P.FLGS(R1) ;DO NOT USE EOT FLAG ON REWINDS ;JJM314'( CMP #ST.AVL,P.STS(R1);UNIT AVAILABLE? BNE 5$ ;NO.+ CLR P.STS(R1) ;INDICATE SUCCESS (ST.SUC)M5$: 0 CALL ENDERR ;SET UP STATUS TO RETURN TO USER) CMP #IS.SUC&377,R0 ;WAS IT SUCCESSFUL?  BNE 10$ ;NOP+ BISB #US.PWF,U.STS(R5);SET POWERFAIL BITBC BIC #M.PEOV!M.RWD!M.SER!M.TMK!M.EOT!M.AEOV,U.CW2(R5) ;NEW STATESNA BIS #M.BOT,U.CW2(R5) ;INDICATE THAT TAPE IS AT BOT (OR WILL BE- ;WHEN THE CONTROLLER GETS DONE WITH IT)O+10$: PUSH <#0> ;VALUE TO PUT INTO IOSB+2 * CALLR ENDCOM ;DO COMMON END PROCESSING .PAGE ;JJM300? .SBTTL CMDSMO - MOUNT AND SET TAPE CHARACTERISTICS ;JJM300 ;+ ;JJM300NQ; **-CMDSMO-PROCESS ROUTINE FOR IO.SMO (MOUNT AND SET CHARACTERISTICS) ;JJM300.; ;JJM300V; THIS ROUTINE PERFORMS THE FUNCTION00t(```t`TADATADATADATADATADATA OF SETTING THE TAPE CHARACTERISTICS AND ;JJM300W; BRINGING THE UNIT TMSCP ONLINE. FOR TAPES THAT SUPPORT MULTIPLE DENSITIES, ;JJM300GV; THIS MUST FIRST MAKE SURE THE TAPE UNIT IS TMSCP AVAILABLE. IF IT IS NOT, ;JJM300V; AN AVAILABLE COMMAND MUST BE ISSUED, FOLLOWED BY AN ONLINE COMMAND SO THAT ;JJM300J; THE TAPE DENSITY CAN BE SET TO THAT SPECIFIED BY THE USER. ;JJM300; ;JJM300; INPUTS: ;JJM300 ; ;JJM3002; R0=ADDRESS OF FUNCTION TABLE ENTRY ;JJM300#; R2=ADDRESS OF QST ;JJM300;'; R3=I/O PACKET ADDRESS ;JJM300E#; R4=ADDRESS OF SCB ;JJM300N#; R5=ADDRESS OF UCB ;JJM300 ; ;JJM300; OUTPUTS: ;JJM300; ;JJM300!; R0=STATUS CODE ;JJM300F; R1=DESTROYED ;JJM300H%; R2-R5 ARE PRESERVED ;JJM300 ;- ;JJM300Y ;JJM3000CMDSMO: ;JJM300> BIT #M.BOT,U.CW2(R5) ;ARE WE AT BEGINNING OF TAPE? ;JJM3008 BNE 10$ ;YES. CONTINUE WITH DENSITY SETTING ;JJM3006 CALLR ILEGAL ;NO. IO.SMO IS ILLEGAL THEN ;JJM300 ;JJM300CL10$: BIT #UU.BLK,U.UTIL(R5) ;DOES UNIT SUPPORT MULTIPLE DENSITIES? ;JJM3002 BNE 200$ ;NO. NOTHING TO DO IN HERE ;JJM300/ MOV Q.CST(R2),R0 ;GET CST ADDRESS ;JJM300Y4 MOV R3,C.EXTN(R0) ;SAVE R3 TEMPORARILY ;JJM3008 CALL PIOPAL ;A "FALSE" IOP FOR AVN COMMAND ;JJM3007 MOV #AVNFUN,R0 ;FUNCTION CODE ENTRY TO USE ;JJM300B2 CALL CMDCOM ;BUILD TEMPLATE COMMAND ;JJM300H BIS #MD.CSE,P.MOD(R1) ;SET 'CLEAR SERIOUS EXCEPTION' MODIFIER ;JJM3000 PUSH <#CLACMD> ;WHERE TO RETURN TO ;JJM300- CALL CMDSEN ;ISSUE THE COMMAND ;JJM300E8 PUSH ;SAVE WHAT WILL BE USED LATER ;JJM300; MOV #IS.SUC,R0 ;NON-ZERO -> RETURN IOP TO POOL ;JJM300- PUSH <#0> ;NO IOSB DATA EITHER ;JJM300J0 CALL ENDCMO ;CLEAN UP PACKET USED ;JJM300/ MOV Q.CST(R2),R0 ;GET CST ADDRESS ;JJM300N4 MOV C.EXTN(R0),R3 ;RESTORE IOP ADDRESS ;JJM300, POP ;RETURN REGISTERS ;JJM3009200$: CALLR CMDONL ;ISSUE THE ONLINE COMMAND ;JJM300L .PAGE. .SBTTL CMDSPB - PROCESS ROUTINE FOR IO.SPB;+7; **-CMDSPB-PROCESS ROUTINE FOR IO.SPB (SPACE BLOCKS)E; J; THIS ROUTINE PERFORMS THE FUNCTION OF SPACING FORWARD OR BACKWARD OVER?; A SPECIFIED NUMBER OF BLOCKS. IF A NEGATIVE BLOCK COUNT IS L; SPECIFIED, THE SKIPPING IS DONE IN THE REVERSE DIRECTION. FOR UNLABELEDJ; TAPE, SPACING BLOCKS PAST EOV (TWO CONSECUTIVE TAPE MARKS OR BOT/TMRK); IS NOT PERMITTED.J; ; INPUTS: ;L&; R0=ADDRESS OF FUNCTION TABLE ENTRY; R2=ADDRESS OF QSTD; R3=I/O PACKET ADDRESSO; R4=ADDRESS OF SCBP; R5=ADDRESS OF UCBO1; U.CW2, BIT M.AEOV=TAPE AT OR PAST LOGICAL EOTM; ; OUTPUTS:; ; R0=STATUS CODE4; R1=STATUS INFORMATION (NUMBER OF BLOCKS SKIPPED); R2-R5 ARE PRESERVEDC1; U.CW2, BIT M.AEOV=TAPE AT OR PAST LOGICAL EOTN;- CMDSPB::1 TST I.PRM(R3) ;ANY BLOCKS ACTUALLY SPECIFIED?T- BNE 10$ ;YES. FURTHER PROCESSING NEEDED6 MOV #IS.SUC&377,R0 ;INDICATE SUCCESS (NOP THE I/O)$ CALLR CMDXIT ;COMMON ERROR EXIT=10$: BITB #US.MNT,U.STS(R5) ;IS THE UNIT MOUNTED? ;PKW109O3 BEQ 20$ ;YES. OK TO DO THIS TYPE OF CMD ;**-3 4 MOV #IE.PRI&377,R0 ;ERROR. TAPE MUST BE MOUNTED$ CALLR CMDXIT ;COMMON ERROR EXITD20$: BITB #US.LAB,U.STS(R5) ;WORKING WITH A LABELED TAPE? ;PKW1092 BNE 30$ ;YES. SKIP LOGICAL EOV CHECKS ;**-49 BIT #M.AEOV,U.CW2(R5) ;ARE WE PAST LOGICAL END OF TAPE ) BEQ 30$ ;NO. GO TO COMMON PROCESSING3) TST I.PRM(R3) ;TEST SPACING DIRECTIONC BLE 30$ ;BACKWARD IS OK.T6 MOV #IE.EOV&377,R0 ;INDICATE EOV ON UNLABELED TAPE$ CALLR CMDXIT ;COMMON ERROR EXIT 5 30$: CALL CMDCOM ;BUILD A SKELETON COMMAND PACKETA7 BIS #MD.CSE,P.MOD(R1) ;SET 'CLR SER EXCEPT' MODIFIER4 CLR P.RECC+2(R1) ;HIGH ORDER WORD OF BLOCK COUNT6 MOV I.PRM(R3),P.RECC(R1) ;DEFAULT SPACE BLOCK COUNT& BGE 40$ ;GOING FORWARD DIRECTION.4 BIS #MD.REV,P.MOD(R1) ;INDICA00t0`_b_c_d_kTE REVERSE DIRECTION6 NEG P.RECC(R1) ;INDICATE POSITIVE NUMBER OF BLOCKS4 40$: BITB #US.LAB,U.STS(R5) ;IS THIS LABELED TAPE?' BNE 50$ ;YES. SKIP LEOT PROCESSINGE% TST I.PRM(R3) ;FORWARD DIRECTION?& BLE 50$ ;NO. SKIP LEOT PROCESSING@ BIS #MD.DLE,P.MOD(R1) ;SET TO DETECT LEOT FOR UNLABELED TAPES< 50$: CLR P.TMGC(R1) ;INSURE NO TAPE MARKS WILL BE SKIPPED8 CLR P.TMGC+2(R1) ;HIGH ORDER WORD OF TAPE MARK COUNT" PUSH <#CLACMD> ;RETURN ADDRESS% CALL CMDSEN ;ISSUE TMSCP COMMANDE ;RH ; END PACKET PROCESSING. CONTROL RETURNS HERE WHEN THE END PACKET FORI ; THIS COMMAND IS RECEIVED. AT THIS POINT, THE I/O IS EFFECTIVELY DONEEG ; SO IT IS NECESSARY TO SET UP THE RETURN STATUS FOR THE USER. OTHER = ; FLAGS HAVE TO BE SET TO SHOW THE RESULT OF THE OPERATION.E! ;R%" CALL ENDERR ;GET RSX STATUS CODE -# CMP R0,#IE.EOV&377 ;WAS LEOT ENCOUNTERED?P$ BNE 60$ ;NO.O7% BIS #M.AEOV,U.CW2(R5) ;INDICATE THAT LOGICAL EOT HITAB& BIC #M.BOT!M.PEOV!M.RWD!M.SER!M.TMK!M.EOT,U.CW2(R5) ;NEW STATES3' 60$: PUSH ;NUMBER OF BLOCKS SKIPPEDT4( CMP R0,#IE.EOF&377 ;WAS A TAPE MARK ENCOUNTERED?) BNE 70$ ;NO.Y/* INC (SP) ;COUNT TAPE MARK AS BLOCK SKIPPEDR0+ 70$: CALLR ENDCOM ;GO TO COMMON CLEANUP CODE, .PAGE.- .SBTTL CMDSPF - PROCESS ROUTINE FOR IO.SPF. ;+6/ ; **-CMDSPF-PROCESS ROUTINE FOR IO.SPF (SPACE FILES)0 ;EJ1 ; THIS ROUTINE PERFORMS THE FUNCTION OF SPACING FORWARD OR BACKWARD OVERG2 ; A SPECIFIED NUMBER OF TAPE MARKS. IF A NEGATIVE TAPE MARK COUNT ISEL3 ; SPECIFIED, THE SKIPPING IS DONE IN THE REVERSE DIRECTION. FOR UNLABELEDI4 ; TAPE, SPACING FILES PAST EOV (TWO CONSECUTIVE TAPE MARKS OR BOT/TMRK)C5 ; IS NOT PERMITTED. 6 ;E 7 ; INPUTS:L8 ;D&9 ; R0=ADDRESS OF FUNCTION TABLE ENTRY: ; R2=ADDRESS OF QST ; ; R3=I/O PACKET ADDRESS< ; R4=ADDRESS OF SCBC= ; R5=ADDRESS OF UCB(1> ; U.CW2, BIT M.AEOV=TAPE AT OR PAST LOGICAL EOTU? ;N @ ; OUTPUTS:A ; B ; R0=STATUS CODE3C ; R1=STATUS INFORMATION (NUMBER OF FILES SKIPPED)PD ; R2-R5 ARE PRESERVEDC1E ; U.CW2, BIT M.AEOV=TAPE AT OR PAST LOGICAL EOTNF ;- G CMDSPF::5H TST I.PRM(R3) ;ANY TAPE MARKS ACTUALLY SPECIFIED?M-I BNE 10$ ;YES. FURTHER PROCESSING NEEDEDE6J MOV #IS.SUC&377,R0 ;INDICATE SUCCESS (NOP THE I/O)$K CALLR CMDXIT ;COMMON ERROR EXIT=K 10$: BITB #US.MNT,U.STS(R5) ;IS THE UNIT MOUNTED? ;PKW109C3P BEQ 20$ ;YES. OK TO DO THIS TYPE OF CMD ;**-4U4Q MOV #IE.PRI&377,R0 ;ERROR. TAPE MUST BE MOUNTED$R CALLR CMDXIT ;COMMON ERROR EXITDR 20$: BITB #US.LAB,U.STS(R5) ;WORKING WITH A LABELED TAPE? ;PKW1092W BNE 30$ ;YES. SKIP LOGICAL EOV CHECKS ;**-49X BIT #M.AEOV,U.CW2(R5) ;ARE WE PAST LOGICAL END OF TAPE )Y BEQ 30$ ;NO. GO TO COMMON PROCESSING3)Z TST I.PRM(R3) ;TEST SPACING DIRECTIONC[ BLE 30$ ;BACKWARD IS OK.T6\ MOV #IE.EOV&377,R0 ;INDICATE EOV ON UNLABELED TAPE$] CALLR CMDXIT ;COMMON ERROR EXIT^ 5_ 30$: CALL CMDCOM ;BUILD A SKELETON COMMAND PACKETA7` BIS #MD.CSE,P.MOD(R1) ;SET 'CLR SER EXCEPT' MODIFIER8a CLR P.TMGC+2(R1) ;HIGH ORDER WORD OF TAPE MARK COUNT5b MOV I.PRM(R3),P.TMGC(R1) ;DEFAULT SPACE FILE COUNT &c BGE 40$ ;GOING FORWARD DIRECTION.4d BIS #MD.REV,P.MOD(R1) ;INDICATE REVERSE DIRECTION5e NEG P.TMGC(R1) ;INDICATE POSITIVE NUMBER OF TMRKST4f 40$: BITB #US.LAB,U.STS(R5) ;IS THIS LABELED TAPE?'g BNE 50$ ;YES. SKIP LEOT PROCESSING %h TST I.PRM(R3) ;FORWARD DIRECTION?&i BLE 50$ ;NO. SKIP LEOT PROCESSING@j BIS #MD.DLE,P.MOD(R1) ;SET TO DETECT LEOT FOR UNLABELED TAPES8k 50$: CLR P.RECC(R1) ;INSURE NO BLOCKS WILL BE SKIPPED4l CLR P.RECC+2(R1) ;HIGH ORDER WORD OF BLOCK COUNT"m PUSH <#CLACMD> ;RETURN ADDRESS%n CALL CMDSEN ;ISSUE TMSCP COMMAND;o ;AHp ; END PACKET PROCESSING. CONTROL RETURNS HERE WHEN THE END PACKET FORIq ; THIS COMMAND IS RECEIVED. AT THIS POINT, THE I/O IS EFFECTIVELY DONE.Gr ; SO IT IS NECESSARY TO SET UP THE RETURN STATUS FOR THE USER. OTHER$=s ; FLAGS HAVE TO BE SET TO SHOW THE RESULT OF THE OPERATION.Dt ; %u CALL ENDERR ;GET RSX STATUS C00t8```t`TADATADATADATADATADATAODER-v CMP R0,#IE.EOV&377 ;WAS LEOT ENCOUNTERED?Cw BNE 60$ ;NO.I7x BIS #M.AEOV,U.CW2(R5) ;INDICATE THAT LOGICAL EOT HITAAy BIC #M.PEOV!M.BOT!M.RWD!M.SER!M.TMK!M.EOT,U.CW2(R5) ;NEW STATET7z 60$: PUSH ;NUMBER OF TAPE MARKS SKIPPEDR,{ CALLR ENDCOM ;GO TO COMMON CLEANUP CODE| } .ENDC ;T$$APEY~ .PAGE; .SBTTL CMDXIT - COMMON ERROR EXIT - INCLUDES ILEGAL EXIT. ;+ ; - ; **-ILEGAL-EXIT WITH ILLEGAL FUNCTION CODEE ; **-CMDXIT-COMMON ERROR EXITR ;EJ ; THIS ROUTINE PROVIDES A SIMPLE AND COMMON EXIT PATH FOR COMMAND ERRORSI ; THAT ARE DETECTED BEFORE ANY I/O IS ACTUALLY ISSUED TO THE CONTROLLERC ;E ; INPUTS:D ;R$ ; R0=RSX ERROR CODE TO BE RETURNED ;P ; OUTPUTS: ;N ; CONTROL IS PASSED TO ENDCM1C ;E ;-4 ILEGAL: MOV #IE.IFC&377,R0 ;ILLEGAL FUNCTION CODE CMDXIT:  CLR R1 ;NO BYTE COUNT6 PUSH #CLACMD ;RETURN TO CLACMD TO FIND MORE TO DO- CALLR ENDCM1 ;JOIN COMMON END PROCESSINGI .PAGE* .SBTTL CMDSEN - SEND OFF COMMAND PACKET ;+A ; **-CMDSEN-ROUTINE TO SEND CMD PKT AND ADD IOP TO C.OLHD QUEUEE ;A@ ; THIS ROUTINE WILL SEND THE (T)MSCP PACKET TO THE CONTROLLER.A ; IT ALSO WILL ADD THE IOP TO THE END OF THE OUTSTANDING QUEUE.ND ; IF THE COMMAND IS THE OLDEST, THEN THE COMMAND STATUS IS UPDATED@ ; AND THE TIMEOUT COUNT IS UPDATED AND THE TIMER GETS STARTED. ; ; INPUTS:M ;R ; R1=COMMAND PACKET ADDRESS  ; R2=QST ADDRESS ; R3=I/O PACKET ADDRESSN ; R4=SCB ADDRESS ; R5=UCB ADDRESS ;M ; OUTPUTS: ;  ; R0-R1-R3 DESTROYEDN ; R2-R4-R5 PRESERVEDC ;- CMDSEN:A< POP ;ADDR TO RETURN TO WHEN END PKT ARRIVES0 CALLV PORT,PORSEN ;SEND CMD PKT TO CONTROLLER0 MOV (R2),R0 ;/*Q.CST*/ ;ADDR OF CST ;**-1< ADD #C.OLHD,R0 ;POINT TO QUEUE OF OUTSTANDING I/O PACKETS# MOV R3,R1 ;POINTS TO IOP TO ADD 0 CALL @QINSF ;INSERT IOP INTO QUEUE ;GM112! ;R2 GETS DESTROYED ;**-1S6 MOV S.QST(R4),R2 ;RESTORE THE QST ADDRESS ;PKW109' MOV R3,R0 ;I/O PKT ADDRESS ;**-1 ' MOV (R2),R3 ;/*Q.CST*/ ;ADDR OF CSTS6 CMP R0,C.OLHD(R3) ;IS THIS COMMAND NOW THE OLDEST ? BNE 20$ ;NOD ;AF ; RESET TIME-OUT COUNT FOR NEW OLDEST COMMAND AND MAYBE RESET BSYUCB ;Q  MOVB S.ITM(R4),S.CTM(R4)AA MOV S.BSYU(R4),R1 ;R1 IS THE ADDRESS OF THE PREVIOUS BUSY UNIT,- BEQ 10$ ;IF NO UNIT IS BUSY CHANGE BSYUCBS: BICB #US.BSY,U.STS(R1) ;CLEAR BUSY BIT ON OLD BUSY UNIT< 10$: BISB #US.BSY,U.STS(R5) ;SET BUSY BIT ON NEW BUSY UNIT# MOV R5,S.BSYU(R4) ;CHANGE BSYUCB-9 MOV #-1,C.CMST(R3) ;SET COMMAND STATUS PROGRESS TO MAXL1 MOV #-1,C.CMST+2(R3);UNSIGNED DOUBLE PRECISION$ 20$:& RETURN ;RETURN TO CALLER'S CALLER  .PAGE) .SBTTL CMDSIO - START NEXT I/O REQUEST. ;+: ; **-CMDSIO-TRY TO START NEXT I/O REQUEST FROM SCB QUEUE ;ID ; THIS ROUTINE WILL TRY TO START THE NEXT I/O REQUEST FROM THE SCBC ; QUEUE. THIS ROUTINE WILL DISPATCH TO THE FUNCTION CODE SPECIFIC.( ; ROUTINE WHICH WILL RETURN TO CLACMD. ; ; INPUTS:U ;; ; R2=ADDRESS OF QST# ; R3=ADDRESS OF CSTA ; R4=ADDRESS OF SCBA ; R5=ADDRESS OF UCB( ;N ;D ; OUTPUTS: ;. ; R0=ADDRESS OF FUNCTION CODE ENTRY IN TABLE ; R1=DESTROYED ; R3=I/O PACKET ADDRESS/ ; R2-R4-R5 ARE PRESERVED ;R ;-  CMDSIO: ;**-1/ MOV #XXACC,R2 ;ADDRESS OF ACCEPTANCE ROUTINET ;X' ; MAKE BUSY UNIT TEMPORARILY NON-BUSYII ; IT IS ONLY BUSY SO THAT THE TIME-OUT COUNT IN THE SCB IS DECREMENTED.I ;T  MOV S.BSYU(R4),R0 BEQ 10$ BICB #US.BSY,U.STS(R0) 10$: ;GM103' .IF DF D$$DSK ;IF DISK ;GM103  ;GM1037 BISB #C2.SHD,C.FLAG(R3);SET RECURSIVE FLAG ;GM103N ;GM103 .IFTF ;D$$DSK ;GM103 ;GM1034 CALL @GSPKT ;GET I/O PACKET TO PROCESS ;GM112 ; ;**-2 ; MAKE BUSY UNIT BUSY AGAINX ; . MOV S.QST(R4),R2 ;WE NEED THE QST ;GM103 ;GM103 .IFT ;D$$DSK ;GM103D ;GM103' MOV (R2),R3 ;GET THE00t@`_b_c_d_k CST ;GM103B< BICB #C2.SHD,C.FLAG(R3);CLEAR THE RECURSION FLAG ;GM103 ;GM103 .ENDC ;D$$DSK ;GM103 ;GM103 MOV S.BSYU(R4),R0 BEQ 20$ BISB #US.BSY,U.STS(R0)F 20$: ;PKW109 A .IF DF D$$DSK&DU$CHK ;IF QUEUE OPTOMIZATION SUPPORTED ;PKW1093 BCS 30$ ;IF CS, NO PACKETS LEFT, EXIT ;PKW109  ; ;PKW109V ; UNFORTUNATELY WE NOW HAVE TO CHANGE SECTOR, TRACK, AND CYLINDER THAT QUEUE ;PKW109< ; OPTOMIZATION NEEDED BACK INTO AN LBN NUMBER. ;PKW109 ; ;PKW109B CMPB #IO.RLB/256.,I.FCN+1(R1) ;DATA TRANSFER REQUEST? ;PKW1092 BLO CMDRED ;IF LO NO, LEAVE IT ALONE ;PKW1096 MOV I.PRM+10(R1),R2 ;GET CYLINDER NUMBER ;PKW1096 MOVB U.PRM+1(R5),R0 ;GET TRACKS/CYLINDER ;PKW1096 MUL R0,R2 ;TRACKS UP TO CURRENT CYLINDER ;PKW109; MOVB I.PRM+13(R1),R2 ;GET CURRENT TRACK NUMBER ;PKW109OC ADD R3,R2 ;ADD TRACKS IN CYLINDERS TO GET CURRENT TRACK ;PKW109E2 MOVB U.PRM(R5),R0 ;GET SECTORS/TRACK ;PKW1094 MUL R0,R2 ;SECTORS UP TO CURRENT TRACK ;PKW1096 MOVB I.PRM+12(R1),R0 ;GET CURRENT SECTOR ;PKW1090 ADD R0,R3 ;GET TOTAL SECTOR NUMBER ;PKW109$ ADC R2 ;HIGH AND LOW ;PKW1097 MOV R2,I.PRM+10(R1) ;SAVE HIGH LBN NUMBER ;PKW109L6 MOV R3,I.PRM+12(R1) ;SAVE LOW LBN NUMBER ;PKW109, MOV S.QST(R4),R2 ;GET THE QST ;PKW109/ BR CMDRED ;GO PROCESS THE PACKET ;PKW109A 30$: ;PKW109  .IFF ;PKW109E BCC CMDRED ;PKW109T% .ENDC ;D$$DSK&DU$CHK ;PKW109C ;PKW109A ;**-3V1 MOV (R2),R3 ;**Q.CST** GET THE CST ;PKW106 4 BIT #C1.DQU,(R3) ;SHOULD WE CALL $DQUMR? ;**-2! BEQ 40$ ;IF EQ NO ;PKW109M/ BIC #C1.DQU,(R3) ;CLEAR THE BIT OUT ;**-10 ; ;PKW106X ; DO NOT CHANGE THE FOLLOWING CALL AND RETURN TO A JUMP: $DQUMR IS A COROUTINE ;PKW106 ; ;PKW106' CALL @DQUMR ;AND CALL IT ;GM112W 40$: RETURN ;PKW109 ;+ ;**-5  ; - THE MAGIC IS BACK!! -D ; 2 ; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GSPKT ; + ; R1 = ADDRESS OF THE I/O REQUEST PACKET.01 ; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB.;; ; R3 = KRB ADDRESS (UNLESS 0 THEN R3 = CONTROLLER INDEX). 0 ; R4 = ADDRESS OF THE STATUS CONTROLLER BLOCK.> ; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ;S/ ; UDA50 CLASS DISK I/O REQUEST PACKET FORMAT.L ;U, ; WD 00 -- I/O QUEUE THREAD WORD (I.LINK).A ; WD 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER (I.EFN & I.PRI).> ; WD 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK (I.TCB).I ; WD 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER (I.LN2). F ; WD 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR'S TASK HEADER ; (I.UCB).7 ; WD 05 -- I/O FUNCTION CODE (IO.RLB/IO.WLB) (I.FCN).D: ; WD 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK (I.IOSB).< ; WD 07 -- RELOCATION BIAS OF I/O STATUS BLOCK (I.IOSB+2).E ; WD 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140000)E ; (I.IOSB+4).F< ; WD 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE (I.AST). ; < ; FOLLOWING FORMAT APPLIES TO ALL DATA TRANSFER FUNCTIONS:! ; J" ; WD 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER (I.PRM).6# ; WD 13 -- BUFFER ADDRESS OF I/O TRANSFER (I.PRM+2).8$ ; WD 14 -- NUMBER OF BYTES TO BE TRANSFERED (I.PRM+4).G% ; WD 15 -- DIAGNOSTIC SUPPLIMENTAL PARAMETER ELSE NOT USED (I.PRM+6).TE& ; WD 16 -- HIGH PART OF LOGICAL BLOCK NUMBER AND HIGH BYTE NOT USEDS' ; (I.PRM+10).EH( ; WD 17 -- LOW PART OF LOGICAL BLOCK NUMBER OF I/O REQUEST (I.PRM+12).H) ; WD 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. BLOCK ADRS ELSE NOT USED* ; (I.PRM+14). G+ ; WD 21 -- DIAGNOSTIC REG. BLOCK ADRS (REAL OR DISPLACEMENT + 140000)1, ; (I.PRM+16). - ;O%. ; SET CHARACTERISTICS FUNCTION CODEE/ ;B 0 ; WD 12 --.1 ; WD 13 -- PARAMETER SPECIFICATION (I.PRM+2)2 ; 0 = RESET VOLUME VALID3 ; 1 = SET VOLUME VALID,4 ; 2 = RESET VOLUME VALID, SPIN UNIT DOWN(5 ; 3 = SET VOLUME VALID, SPIN UNIT UP,6 ; -1 = 00tH```t`TADATADATADATADATADATASIZE UNIT (VOLUME VALID UNCHANGED) 7 ; WD 14 --8 ;9 ;-9: CMDRED: ;ENTRY POINT FOR REISSUING I/O'S ON RECOVERYO: ;PKW10618: CLRB I.PRM+11(R1) ;CLEAR INTERNAL FLAG BYTE ;PKW106*: MOV R1,R3 ;SAVE IOP ADDRESS ;PKW106: ;PKW106I3: .IF DF M$$PRO ;MULTIPROCESSOR SYSTEM ;PKW106-,: TST S.URM(R4) ;UNIBUS RUN MASK ;PKW106': BEQ 37$ ;NONE, CONTINUE ;PKW106V : MOV @CPURM,-(SP) ;GM1121: BIT S.URM(R4),@(SP)+ ;OK ON THIS CPU ;GM112U': BNE 37$ ;YES, JUST EXIT ;PKW106 7: ; GET FORK BLOCK AND QUEUE IT IN FORK LIST ;PKW106 9: MOV (R2),R1 ;/*Q.CST*/ ;GET THE CST ADDRESS ;PKW1061>: DEC C.UMCT(R1) ;DECREMENT THE UMR WAIT BLOCK COUNT ;PKW106B: ADD #C.UMRW,R1 ;POINT TO THE BEGINNING OF THE WAIT BLOC ;PKW106?: MOV #-1,R2 ;SET COUNTER TO -1 BECAUSE WE INCREMENT ;PKW106;5: 32$: INC R2 ;INCREMENT THE INDEX COUNTER ;PKW106 /: TST (R1) ;IS THERE A BLOCK HERE? ;PKW106 1: BEQ 33$ ;IF EQ NO, ALLOCATE ANOTHER ;PKW106 0: BIT #1,(R1)+ ;IS THE BLOCK IN USE? ;PKW106(: BNE 32$ ;YES, TRY ANOTHER ;PKW106.: MOV -(R1),R0 ;GET THE WAIT BLOCK ;PKW106(: BR 35$ ;GO TO COMMON CODE ;PKW106E: 33$: PUSH ;SAVE THE TABLE ADDRESS AND BLOCK INDEX ;PKW106 5: MOV #UMRWTB,R1 ;SET LENGTH OF CORE BLOCK ;PKW106 +: CALL @ALOCB ;GET A WAIT BLOCK ;GM112.: POP ;RESTORE REGISTERS ;PKW106&: BCC 34$ ;WE GOT ONE,OK ;PKW106): ;NO POOL, EXIT GRACEFULLY ;PKW106L,: MOV S.QST(R4),R2 ;GET THE QST ;PKW1061: MOV (R2),R1 ;/*Q.CST*/ GET THE CST ;PKW106 H: INC C.UMCT(R1) ;WE'RE NOT GOING TO USE A WAIT BLOCK AFTER ALL ;PKW1068: MOV #IE.NDR&377,R0 ;SET NO DYNAMIC MEMORY ;PKW106: CLR R1 ; ;PKW106B': JMP @IOFIN ;COMPLETE I/O ;GM112S=: 34$: MOV S.URM(R4),(R0)+ ;PUT IN UNIBUS RUN MASK ;PKW106 @: MOV R0,(R1) ;PUT THE NEW BLOCK ADDRESS IN THE TABLE ;PKW1069: 35$: INC (R1) ;SHOW THAT THE BLOCK IS IN USE ;PKW106TE: MOVB R2,I.PRM(R3) ;SAVE UMR WAIT BLOCK INDEX IN I/O PACKET ;PKW106 M: BISB #IP.UMR,I.PRM+11(R3) ;MARK THE I/O AS HAVING A UMR WAIT BLOCK ;PKW106G1: MOV R0,R4 ;PUT THE FORK BLOCK IN R4 ;PKW106#-: CLR (R0)+ ;CLEAR THE FORK LINK ;PKW10663: MOV #36$,(R0)+ ;PUT IN RETURN ADDRESS ;PKW106E+: MOV R5,(R0)+ ;R5, UCB ADDRESS ;PKW106;9: MOV R3,(R0)+ ;IOP ADDRESS (COMES BACK IN R4) ;PKW106E*: MOV @KISR5,(R0)+ ;APR 5 BIAS ;GM1121: CALLR @QFORK ;QUEUE THE FORK BLOCK ;GM112W1: 36$: MOV R4,R3 ;RESTORE IOP ADDRESS ;PKW106EC: MOV U.SCB(R5),R4 ;RECOVER R4 WHICH IS DESTROYED BY FORK ;PKW106A,: MOV S.QST(R4),R2 ;RESTORE QST ;PKW106;: MOV S.PBIA(R4),@KISR6 ;MAP APR 6 TO PORT DRIVER ;GM112R9: MOV S.PBIA(R4),@#KINAR6 ; KERNAL INST SPACE ;PKW106N8: MOV R3,R1 ;RESTORE THE IOP IN R1 FOR $VOLVD ;PKW106: 37$: ;PKW106 : .ENDC ;M$$PRO ;PKW106 : ;PKW106R> ;**-3 .> .IF DF D$$DSK ;DISK DRIVER ONLY ;PKW109D> CMP #IO.SMD,I.FCN(R1) ;IS IT A SET MEDIA DENSITY FUNCTION? ;GM102*> BNE 39$ ;NO, THEN CALL VOLVD ;GM102B> BITB #US.UMD,U.ST2(R5) ;DEVICE ATTACHED FOR DIAGNOSTICS? ;GM102*> BEQ 39$ ;NO, THEN CALL VOLVD ;GM102@> BISB #US.VV,U.STS(R5) ;SET THE VV BIT FOR LATER CHECK ;GM1025> 39$: CALL @VOLVD ;CHECK THE VOLUME VALID ;GM102$,B BCC 40$ ;IF IT WAS OK, CONTINUE ;**-3#C CALLR ENDCM1 ;GO FINISH THE I/O D 40$:D .ENDC ;D$$DSK ;PKW109DF ;**-1V1F MOV I.FCN(R3),R1 ;GET FUNCTION CODE ;PKW106 ;H BIC #IQ.Q!IQ.X!IQ.UMD,R1 ;CLEAR OUT ANY MODIFIERS ;**-1CDH MOV R1,EIOFUN ;INITIALIZE END OF TABLE WITH USER I/O CODE ;PKW1095H MOV #IOFUN,R0 ;ADD OF I/O FUNCTION TABLE ;PKW109GH 50$: ;PKW109S-H CMP R1,(R0) ;I/O CODES MATCH ? ;PKW109 H BEQ 60$ ;YES ;PKW109O7H ADD #FOSIZ,R0 ;POINT TO NEXT FUNCTION CODE ;PKW109 &H BR 50$ ;KEEP ON LOOKING ;PKW109JH 60$: JMP @FO.CMD(R0) ;DISPATCH TO FUNCTION CODE SPECIFIC ROUTINE ;PKW109L .PAGE ;**-3M .SBTTL CMDSTC - SET STATUSQN ;+O ; **-CMDSTC-P ;TLQ 00tP`_b_c_d_k; THIS ROUTINE DISPATCHES ALL IO.STC COMMANDS. ONLINE AND GET UNIT STATUSUR ; COMMANDS ARE PASSED OFF TO OTHER ROUTINES. AVAILABLE COMMANDS ARE PROCESSED HERE S ;0QT ; FOR DISKM THE IO.STC FUNCTION WILL DO ONE OF THE FOLLOWING ACTIONS, DEPENDINGU ; ON THE VALUE IN I.PRM+2:V ;CW ; I.PRM+2 ActionX ; ------- ------OY ; 0 SET UNIT AS AVAILABLECZ ; 1 SET UNIT AS ONLINE0[ ; 2 SET UNIT AVAILABLE, AND SPIN UNIT DOWN\ ; 3 SAME AS 1-] ; -1 GET UNIT STATUSC^ ;-J_ ; FOR TAPE, THIS ROUTINE PERFORMS THE SET CHARACTERISTIC FUNCTION. THISG` ; MEANS THAT A TMSCP ONLINE COMMAND IS ISSUED, FOLLOWED BY A GET UNITNIa ; STATUS COMMAND. IF THE STC FUNCTION IS ISSUED BY CON/HRC, THE ONLINE Ab ; COMMAND IS NOT ISSUED; THE GET UNIT STATUS COMMAND IS ISSUED.Ic ; CON/HRC IS CONSIDERED TO HAVE SENT THE STC FUNCTION IF BOTH ARE TRUE:Id ;C8e ; 1. UNIT IS ATTACHED FOR DIAGNOSTICS (US.UMD IS SET)5f ; 2. STC COMMAND HAS THE IQ.UMD SUBFUNCTION BIT SET g ;N h ; INPUTS: i ; &j ; R0 ADDRESS OF FUNCTION TABLE ENTRYk ; R2 QST ADDRESSl ; R3 I/O PACKET ADDRESSTm ; R4 SCB ADDRESSn ; R5 UCB ADDRESSo ;Y p ; OUTPUTS:q ;Tr ;- s CMDSTC: t .IF DF D$$DSK ;IF DISK u -v TST I.PRM+2(R3) ;IS IT A GET UNIT STATUS?E w BGE 10$ ;NOPE, KEEP LOOKING!x CALLR CMDGUS ;GO DO IT THEREVy 1z 10$: BIT #1,I.PRM+2(R3) ;IS IT AN ONL COMMAND?.{ BEQ 20$ ;NOPE,CONTINUET!| CALLR CMDONL ;GO DO IT THEREM} -~ 20$: CALL CMDCOM ;GO GET A COMMAND PACKET 7 TST I.PRM+2(R3) ;SHOULD WE SPIN IT DOWN TOO? ;**-3  BEQ 30$ ;NOPE,KEEP GOINGC? MOV U.UC2X(R5),@KISR6 ;MAP SECOND UCB EXTENSION ;GM112U4 MOV X.UNFL+140000,R0 ;RETRIEVE UNIT FLAGS ;**-2; MOV S.PBIA(R4),@KISR6 ;RESTORE PORT MAPPING ;GM112 2 BIT #UF.RMV,R0 ;IS THE DISK REMOVABLE? ;**-2- BEQ 30$ ;NO, DON'T SPIN DOWN FIXED DISKS;0 MOV #MD.SPD,P.MOD(R1) ;SET SPIN DOWN MODIFIERA 30$: PUSH <#CLACMD> ;RETURN TO STARTING OTHER COMMANDS ;PKW109O CALL CMDSEN ;**-4T  ;R( ; RETURN TO THIS POINT WITH END PACKETM ; REGISTERS ARE THE SAME EXCEPT THAT R1 CONTAINS AN END PACKET INSTEAD OF AT ; COMMAND PACKET.M ;U< CALL ENDERR ;CHANGE END CODE TO RSX STATUS CODE ;PKW110( PUSH <#0> ;NO BYTE COUNT ;PKW110@ CMP #ST.SDI!ST.CON,P.STS(R1) ;WAS SPIN DOWN IGNORED? ;PKW110* BNE 70$ ;NO, JUST FINISH UP ;PKW110 ; ;PKW1104 ; WE HAVE TO SPIN DOWN THE OTHER UNIT ;PKW110 ; ;PKW110> CALL ENDCMO ;GO FINISH THE COMMAND, AND COME BACK ;PKW110: MOV U.UC2X(R5),@KISR6 ;MAP SECOND UCB EXTENSION ;GM1126 MOV X.MLUN+140000,R2 ;GET MULTI-UNIT CODE ;PKW1107 MOV S.PBIA(R4),@KISR6 ;RESTORE PORT MAPPING ;GM112O4 MOV R5,R0 ;SAVE THE ORIGINAL UCB IN R0 ;PKW110< PUSH #SCUCB ;NOW SEARCH TO FIND ONE THAT MATCES ;PKW110* 40$: CALL @(SP)+ ;GET A UCB ;PKW110/ BCC 50$ ;WE GOT ONE, CHECK IT OUT ;PKW110V= MOV S.QST(R4),R2 ;RESTORE THE QST BEFORE EXITING ;PKW1100. RETURN ;END OF UCB SEARCH, EXIT ;PKW110 ;PKW110M; 50$: CMP R0,R5 ;IS IT THE UCB WE STARTED WITH? ;PKW110V- BEQ 40$ ;YES, GET THE NEXT ONE ;PKW1100: MOV U.UC2X(R5),@KISR6 ;MAP SECOND UCB EXTENSION ;GM1129 MOV X.MLUN+140000,R1 ;GET THE MULTI-UNIT CODE ;PKW110S7 MOV S.PBIA(R4),@KISR6 ;RESTORE PORT MAPPING ;GM112 2 CMP R1,R2 ;MULTI UNIT CODE THE SAME? ;PKW110- BNE 40$ ;NOPE, GET ANOTHER ONE ;PKW110S8 ADD #10,SP ;WE FOUND IT, FLUSH THE UCB SCAN ;PKW110: BIS #UU.IOS,U.UTIL(R5) ;SET THE STALL I/O BIT ;PKW1108 MOV #T.NIOS,R0 ;I/O STALLED CONSOLE MESSAGE ;PKW110' CALL @DVMSG ;GO PRINT IT ;GM112X, MOV S.QST(R4),R2 ;GET THE QST ;PKW1101 MOV (R2),R3 ;/*Q.CST*/ AND THE CST ;PKW1100+ CALL PIOPAL ;ALLOCATE A PIOP ;PKW110V? MOV #AVNFUN,R0 ;SET UP THE AVAILABLE FUNCTION TABLE ;PKW110 + CALL CMDCOM ;GO GET A PACKET ;PKW1104= MOV #MD.SPD,P.MOD(R1) ;SET THE SPIN DOWN MODIFIER ;PKW110N< PUSH #CLACMD ;SEE IF WE CAN START MORE COMMANDS ;PKW110/ CALL CMDSEN 00tX```t`TADATADATADATADATADATA ;SEND OFF THE PACKET ;PKW110  ; ;PKW110X ; END PACKET RETURNS HERE. WE CAN'T REALLY DO ANYTHING INTELLIGENT IF THE I/O ;PKW1106 ; IS NOT A SUCCESS, SO JUST COMPLETE IT. ;PKW110 ; ;PKW110( PUSH <#0> ;NO BYTE COUNT ;PKW1101 MOV #IS.SUC&377,R0 ;SHOW SUCCESSFUL ;PKW110P) 70$: JMP ENDCOM ;FINISH IT ;PKW110  ;**-13 .IFF ;D$$DSK - IF TAPEN ;**-1W7 BIT #IQ.UMD,I.FCN(R3) ;USER MODE DIAGNOSTIC BIT SET?S, BEQ 20$ ;NO. DO ONLINE/GET-UNIT-STATUS4 BITB #US.UMD,U.ST2(R5) ;ATTACHED FOR DIAGNOSTICS?, BEQ 20$ ;NO. DO ONLINE/GET-UNIT-STATUS 3 MOV #GUSFUN,R0 ;ISSUE A GET-UNIT-STATUS COMMANDO1 CALL CMDCOM ;BUILD THE COMMAND PACKET NEEDEDS$ PUSH <#CLACMD> ;WHENCE TO RETURN# CALL CMDSEN ;ISSUE THE COMMAND  ;W ; END PACKET PROCESSINGF ; ) MOV P.STS(R1),R0 ;GET THE STATUS CODE - BIC #^C,R0 ;GET MAJOR STATUS CODE#) CMP R0,#ST.AVL ;IS IT AVAILABLE CODE?S BNE 10$ ;NO.;1 CLR R0 ;/*ST.SUC*/ ; INDICATE SUCCESS ANYWAYT0 10$: CALL ENDERR ;CONVERT TO RSX STATUS CODE& PUSH <#0> ;NO STATUS FOR IOSB + 2+ CALLR ENDCOM ;AND GO CLEAN UP PROPERLYO6 20$: BIT #M.BOT,U.CW2(R5) ;ARE WE AT BOT? ;JJM3000 BEQ 25$ ;NO. DO NOT WORRY ABOUT IT ;JJM300H BIT #UU.BLK,U.UTIL(R5) ;DOES UNIT SUPPORT MULTIPLE DENSITIES? ;JJM3001 BNE 25$ ;NO. NOTHING TO DO IN HERE ;JJM300>/ MOV Q.CST(R2),R0 ;GET CST ADDRESS ;JJM300;4 MOV R3,C.EXTN(R0) ;SAVE R3 TEMPORARILY ;JJM3005 CALL PIOPAL ;GET A PIOP FOR THE COMMAND ;JJM300N7 MOV #AVNFUN,R0 ;FUNCTION CODE ENTRY TO USE ;JJM300A2 CALL CMDCOM ;BUILD TEMPLATE COMMAND ;JJM300C BIS #MD.CSE,P.MOD(R1) ;SET 'CLEAR SERIOUS EXCEPTION' MOD ;JJM300 0 PUSH <#CLACMD> ;WHERE TO RETURN TO ;JJM300- CALL CMDSEN ;ISSUE THE COMMAND ;JJM300I4 PUSH ;SAVE REGISTERS FOR LATER ;JJM300= MOV #IS.SUC,R0 ;NON-ZERO -> RETURN PACKET TO POOL ;JJM300J- PUSH <#0> ;NO IOSB DATA EITHER ;JJM300I0 CALL ENDCMO ;CLEAN UP PACKET USED ;JJM300/ MOV Q.CST(R2),R0 ;GET CST ADDRESS ;JJM300C, MOV C.EXTN(R0),R3 ;RESTORE R3 ;JJM300- POP ;RESTORE REGISTERS ;JJM300E< 25$: CALLR CMDONL ;ISSUE ONLINE/GET-UNIT-STATUS ;JJM300 ;**-4  .ENDC ;D$$DSK .PAGE .IF DF,D$$DSK ;JJM304* .SBTTL CMDTRM - PROCESS RCT TERMINATION ;+ ;**-2/ ; **-CMDTRM- PROCESS RCT TERMINATION REQUESTSP ;JJ ; THIS SECTION DOES ALL THE PROCESSING SPECIFIC TO TERMINATION REQUESTS.M ; I.PRM CONTAINS THE ADDRESS OF THE I/O THAT MUST BE RESTARTED, AND I.PRM+2/ ; CONTAINS THE STATUS CODE RETURNED FROM RCT.P ;1 ; INPUTS:R ;I+ ; R0 ADDRESS OF FUNCTION TABLE ENTRYE ; R2 QST ADDRESS; ; R3 I/O PACKET ADDRESS ; R4 SCB ADDRESS  ; R5 UCB ADDRESS3 ; ; OUTPUTS: ;O ;- CMDTRM:I? BIT #IQ.X!IQ.Q!IQ.UMD,I.FCN(R3) ;THESE MODIFIERS ARE ILLEGALR BEQ 10$ ;IT'S OKS CALLR ILEGAL  & 10$: MOV R5,R0 ;COPY THE UCB TO R09 ADD #U.BPKT,R0 ;ADD THE OFFSET TO THE BAD BLOCK QUEUEE< MOV I.PRM(R3),R1 ;GET THE I/O THAT INITIATED THE REPLACE5 BEQ 40$ ;IF NO IOP THEN JUST COMPLETE WITH SUCCER PUSH ;SAVE R3R2 CALL @QRMVA ;REMOVE IT FROM THE QUEUE ;GM1129 MOV (SP),R3 ;GET R3, BUT LEAVE IT ON THE STACK ;**-13- CMPB #IS.SUC,I.PRM+2(R3) ;DID RCT SUCCEED? " BNE 20$ ;NO, COMPLETE THE I/O2 MOV R4,R0 ;COPY THE SCB TO R0 (S.LHD IS AT 0)= CALL @QINSP ;INSERT THE IOP BACK IN THE SCB QUEUE ;GM112 ) MOV S.QST(R4),R2 ;RESTORE R2 ;**-1  BR 30$ ;COMMON END POINTR 20$: MOV S.QST(R4),R2 ;RESTORE R2+ MOV I.PRM+2(R3),R0 ;GET THE STATUS CODEW1 MOV I.PRM(R3),R3 ;MOVE THE ORIGINAL IOP TO R3A CLR R1 ;NO BYTE COUNT CALL ENDCM1 ;FINISH THE I/O  30$: POP ;RESTORE R3* 40$: MOV #IS.SUC&377,R0 ;SUCCESS STATUS CLR R1 ;NO BYTE COUNT) PUSH <#CLACMD> ;TRY TO START MORE I/O # CALLR ENDCM1 ;FINISH THE I.TRM;  .ENDC ;D$$DSKT .PA00t``_b_c_d_kGE? .SBTTL ENDCOM - COMMON PROCESSING TO COMPLETE AN I/O REQUEST  ;+< ; **-ENDCOM - COMMON PROCESSING TO COMPLETE AN I/O REQUESTC ; **-ENDCMO - ALTERNATE ENTRY POINT FOR ENDCOM (RETURN TO CALLER)T ; ROUTINE DESCRIPTION  ;R ; INPUTS:C ;: ; R0=STATUS (0 -> DO NOT CALL $IOFIN, I/O STILL PENDING) ; R1=END PACKETV ; R2=ADDRESS OF QSTS ; R3=I/O PACKET ADDRESSY ; R4=ADDRESS OF SCBC ; R5=ADDRESS OF UCB  ; (SP)=BYTECOUNT ;F( ; OUTPUTS: (FALLING THROUGH TO ENDCM1) ;A ; R0,R2-R5 ARE PRESERVED ; R1 IS SET TO BYTECOUNT ;-  ENDCMO:+6 MOV (SP),-(SP) ;COPY TOP OF STACK TO A TEMPORY CELL. MOV 4(SP),2(SP) ;GET SPACE FOR SECOND VALUE' MOV (SP)+,2(SP) ;FINISH THE EXCHANGE  ENDCOM:  .IF DF E$$LOG " TST R0 ;IS THERE ENDING STATUS- BEQ 10$ ;NO, THEN WE DON'T LOG THE PACKETVA BITB #EF.LOG,P.STS(R1) ; IS THERE AN ERRORLOG PACKET TO FOLLOWS BEQ 10$ ;NO, THEN DON'T LOG; CMPB #OP.ONL!OP.END,P.OPCD(R1);ONLINE COMMAND? ;JJM313D) BEQ 10$ ;DO NOT LOG PACKET ;JJM313  ;JJM313T .IF DF,T$$APE ;JJM313> CMPB #OP.AVL!OP.END,P.OPCD(R1);AVAILABLE COMMAND? ;JJM313) BEQ 10$ ;DO NOT LOG PACKET ;JJM313S .ENDC ;T$$APE ;JJM313M ;JJM313& CALL LERR ;LOG THE ERROR ;**-3 10$: .ENDC ;E$$LOG ;**-16! BIT #IQ.UMD,I.FCN(R3);USER MODE DIAGNOSTIC REQUEST?" BEQ 70$ ;NOQ,# PUSH ;SAVE WORK REGISTERS"$ MOV R3,R0 ;COPY OF IOP ADDRESS% & .IF DF T$$APE' 5( CMPB #IO.EOF/256.,I.FCN+1(R3) ;WRITE EOF FUNCTIOND) BEQ 20$ ;IF EQ YES1* CMPB #IO.RWD/256.,I.FCN+1(R3) ;REWIND FUNCTION?+ BNE 30$ ;IF EQ YES3, 20$: MOV I.PRM+14(R3),I.PRM+16(R3) ;RELOCATE BIAS 2- MOV I.PRM+12(R3),I.PRM+14(R3) ;RELOCATE ADDRESS. 30$:/ .IFTF ;T$$APE0 .1 MOV I.PRM+14(R0),R3 ;DESTINATION APR 6 BIAS2 BEQ 40$ ;NO BUFFER/3 MOV I.PRM+16(R0),R4 ;REGISTER BUFFER ADDRESSR4 BEQ 40$ ;NO BUFFER5 $6 MOV R1,R2 ;R2 IS THE SOURCE DISP*7 SUB #ENVLEN,R2 ;BACK TO START OF HEADER/8 BIC #160000,R2 ;R2 IS ADDRESS IN APR 5 RANGEQ9 BIS #120000,R2 ;C29 MOV @KISR6,R1 ;R1 IS SOURCE APR 5 BIAS ;GM1120; MOV #RPLEN+ENVLEN,R0;NUMBER OF BYTES ;**-1); CALL @BLXIO ;MOVE THE DATA ;GM112,= 40$: ;**-1A> .IFT ;T$$APE.? %@ MOV 2(SP),R3 ;RESTORE IOSB ADDRESS;5A CMPB #IO.EOF/256.,I.FCN+1(R3) ;WRITE EOF FUNCTIONIB BEQ 50$ ;IF EQ YES1C CMPB #IO.RWD/256.,I.FCN+1(R3) ;REWIND FUNCTIONVD BNE 60$ ;IF EQ YES2E 50$: MOV I.PRM+14(R3),I.PRM+12(R3) ;RESTORE BIAS1F MOV I.PRM+16(R3),I.PRM+14(R3) ;RESTORE ADDRESS G 60$:H .ENDC ;T$$APEI 1J POP ;RESTORE ORIGINAL CONTENTSEM 70$: ;**-2Y2N PUSH ;SAVE COMPLETION CODE/IOP ADDRESS*O CALLV PORT,PKTDR ;DEALLOCATE END PACKET&P MOV R3,R1 ;SAVE THE PACKET ADDRESS/Q MOV (R2),R0 ;/*Q.CST*/ ;GET THE CST ADDRESSE&R ADD #C.OLHD,R0 ;POINT TO QUEUE HEAD7S CMP R1,(R0) ;IS THIS THE OLDEST PACKET IN THE QUEUEE(T BNE 90$ ;NO, DON'T BOTHER WITH TIMERU ;+:V ; MUST TAKE CARE OF TIMER BECAUSE OLDEST COMMAND IS DONEW ;D$X TST (R1) ;OTHER PACKETS ON QUEUE)Y BEQ 80$ ;NO, THEN DON'T RESTART TIMERCZ ;TB[ ; RESET TIME-OUT COUNT FOR NEW OLDEST COMMAND AND RESET BUSY UCB\ ;D>^ MOV (R1),R1 ;R1 IS THE ADDRESS OF THE NEW OLDEST CMD ;**-14_ MOV I.UCB(R1),R1 ;R1 IS THE UCB OF THE NEW OLDEST.` BICB #US.BSY,U.STS(R5) ;CLEAR OLD BUSY UNIT,a BISB #US.BSY,U.STS(R1) ;SET NEW BUSY UNIT,b MOV R1,S.BSYU(R4) ;REMEMBER NEW BUSY UNIT&c MOVB S.ITM(R4),S.CTM(R4) ;SET TIMER2d MOV (R0),R1 ;GET BACK THE IOP WE'RE WORKING ON e BR 90$1f ;T9g ; STOP THE TIMER THERE ARE NO MORE COMMANDS OUTSTANDINGIh ;i 80$:j CLRB S.CTM(R4) ;STOP TIMEROk BICB #US.BSY,U.STS(R5)Yl CLR S.BSYU(R4) ;CLEAR BSYUCBSm 90$:9m CALL @QRMVA ;REMOVE THE PACKET FROM THE QUEUE ;GM112S1o MOV S.QST(R4),R2 ;RESTORE QST ADDRESS ;**-15;p POP ;RESTORE IOP ADDR, COMPL CODE, BYTE COUNTSq ;Tr ; FALL THROUGH TO ENDCM1s ;Nt .PAGEKu .SBTTL ENDCM1 - A00th```t`TADATADATADATADATADATALTERNATE ENTRY POINT FOR COMMANDS WITHOUT AN END PACKET v ;+Hw ; **-ENDCM1 - ALTERNATE ENTRY POINT FOR COMMANDS WITHOUT AN END PACKETx ; ROUTINE DESCRIPTION0y ; z ; INPUTS:4{ ;O:| ; R0=STATUS (0 -> DO NOT CALL $IOFIN, I/O STILL PENDING)} ; R1=BYTECOUNT~ ; R2=ADDRESS OF QSTV ; R3=I/O PACKET ADDRESS  ; R4=ADDRESS OF SCBR ; R5=ADDRESS OF UCBE ; ; OUTPUTS: ;R ; R0-R1 DESTROYED ; R2,R4-R5 ARE PRESERVED ; R3 IS SET TO CST ;- ENDCM1:.  ;.) ;DEALLOCATE UMRS IF THEY WERE ALLOCATEDM ; F BITB #IP.UMR,I.PRM+11(R3) ;A UMR WAIT BLOCK ALLOCATED FOR THI ;**-2 BEQ 20$ ;IF EQ NO PUSH ;SAVE R2 AND R30 BICB #IP.UMR,I.PRM+11(R3) ;CLEAR THE UMR FLAG' MOV (R2),R2 ;/*Q.CST*/ ;GET THE CST1/ BIS #C1.DQU,(R2) ;SET THE BIT TO CALL $DQUMRC: ADD #C.UMRW,R2 ;POINT TO THE BEGINNING OF THE WAIT BLOC) MOVB I.PRM(R3),R3 ;GET THE BLOCK INDEXR# PUSH ;SAVE THE BLOCK INDEX ( ASL R3 ;MAKE THE INDEX A WORD OFFSET3 ADD R3,R2 ;ADD IT TO THE BEGINNING OF THE TABLE " DEC (R2) ;CLEAR THE IN USE BIT% PUSH ;SAVE THE TABLE ADDRESS7 MOV (R2),R2 ;GET THE ADDRESS OF THE BLOCK FOR DEUMR) ADD #10,R2 ;POINT TO THE MAPPING INFO MOV S.QST(R4),R3 ;GET THE QST' MOV (R3),R3 ;/*Q.CST*/ ;NOW THE CSTE; INC C.UMCT(R3) ;INCREMENT THE UMR ASSIGNMENT BLOCK COUNTN, CALL @DEUMR ;DEASSIGN THE UMRS ;GM112@ POP ;RESTORE THE BLOCK INDEX AND BLOCK ADDRESS ;**-1M .IIF DF D$$DSK CMP #DUUMR,R3 ;IS IT A DYNAMICALLY ALLOCATED BLOCK? ;PKW107AM .IIF DF T$$APE CMP #MUUMR,R3 ;IS IT A DYNAMICALLY ALLOCATED BLOCK? ;PKW107 BGE 10$ ;IF GE, NO ;**-2 PUSH ;SAVE R0 AND R1+ MOV (R2),R0 ;MOV THE ADDRESS FOR $DEACBQD .IIF DF M$$PRO TST -(R0) ;ADJUST FOR EXTRA WORD FOR URM ;PKW1066 CLR (R2) ;CLEAR THE ADDRESS IN THE TABLE ;PKW1062 MOV #UMRWTB.,R1 ;LENGTH OF THE BLOCK ;PKW1063 CALL @DEACB ;DEALLOCATE THE WAIT BLOCK ;GM112S+ POP ;RESTORE R1 AND R0 ;**-3T& 10$: POP ;RESTORE R3 AND R2/ 20$: TST R0 ;DO WE COMPLETE THIS IO ;**-3C BEQ 40$ ;NO, THEN WE EXIT* BITB #IP.FAK,I.PRM+11(R3) ;IS IT A PIOP BEQ 30$ ;NO, FINISH THE I/O2: MOV R3,R1 ;MOVE ADDRESS OF PIOP TO R1 FOR DEALLOCATION2 MOV (R2),R3 ;/*Q.CST*/ ;WE NEED CST FOR PIOPDE% CALLR PIOPDE ;DEALLOCATE THE PIOP  ;GM104 30$: PUSH ;GM104 ;GM104= CALL @IODSA ;SPECIAL ENTRY POINT FOR MSCP DEVICES ;GM104S ;GM104 POP ;GM104R ;GM104C MOV U.SCB(R5),R4 ;RECOVER R4 WHICH IS DESTROYED BY $IOFIN ;**-15 ( MOV S.QST(R4),R2 ;RESTORE QST ADDRESS 40$:+ MOV (R2),R3 ;/*Q.CST*/ ;CST IS RESTOREDR RETURN ;RETURN TO CALLERR  .PAGE8 .SBTTL ENDERR - TRANSLATE MSCP ERROR CODE TO RSX CODE ;+4 ; **-ENDERR- TRANSLATE MSCP ERROR CODE TO RSX CODE ;:G ; THIS ROUTINE LOOKS AT THE CURRENT END PACKET, POINTED TO BY R1, ANDTF ; TRANSLATES THE MSCP ERROR RETURNED TO THE RSX EQUIVALENT. IN SOMEI ; ERRORS, ADDITIONAL ACTION IS REQUIRED, E.G. FOR POSITION LOST ERRORS,S# ; THE POWER FAIL BIT MUST BE SET.T ;R ; INPUTS:T ;E ; R1=ADDRESS OF END PACKET ; R2=ADDRESS OF QSTE ; R3=I/O PACKET ADDRESSC ; R4=ADDRESS OF SCB  ; R5=ADDRESS OF UCBA ;C ; OUTPUTS: ; / ; R0=RSX ERROR STATUS (CAN BE IS.SUC AS WELL)O ; R1-R5=PRESERVED> ; POWERFAIL FLAG SET IF TMSCP ERROR IS ST.POL(POSITION LOST) ;N ;- ENDERR:S .IF DF T$$APE ;TAPE ONLY  5 BITB #EF.EOT,P.FLGS(R1) ;WAS PHYSICAL EOT REACHED?R BEQ 10$ ;NO.O5 MOVB P.OPCD(R1),R0 ;GET US THE ACTUAL OPCODE USEDT9 BIC #177400!OP.END,R0 ;CLEAR ALL BUT THE OPCODE ITSELF1 CMP R0,#OP.RD ;WAS THIS EITHER READ FUNCTION?2 BEQ 10$ ;YES. DON'T REPORT EOT ON SUCH THINGS5 MOV #IE.EOT&377,R0 ;INDICATE PHYSICAL END OF TAPES< BIC #M.AEOV!M.BOT!M.RWD!M.SER!M.TMK,U.CW2(R5) ;NEW STATES" BIS #M.EOT,U.CW2(R5) ;NEW STATE- RETURN ;THAT'S ALL WE NEED FOR THIS ONE; 10$: .IFTF ;T$$APEO00tp`_b_c_d_k . PUSH ;SAVE. NEED AS A WORK REGISTER, MOV P.STS(R1),R1 ;GET TMSCP STATUS CODES- BIC #^C,R1 ;CLEAR OUT THE SUBCODEL  .IFT ;T$$APE * CMP #ST.AVL,R1 ;IS THE UNIT AVAILABLE?, BEQ 20$ ;YES. THIS MEANS CERTAIN STATE. CMP #ST.BOT,R1 ;IS THERE A BOT INDICATION? BNE 30$ ;NO.T, 20$: BIS #M.BOT,U.CW2(R5) ;INDICATE AT BOTD BIC #M.AEOV!M.PEOV!M.RWD!M.SER!M.TMK!M.EOT,U.CW2(R5) ; NEW STATES 30$: .IFTF ;T$$APE  0 MOVB RSXTAB(R1),R0 ;TRANSLATE THE ERROR CODE5 BIC #177400,R0 ;CLEAR OUT THE HIGH BYTE OF STATUS;  .IFT ;T$$APE ) CMPB R1,#ST.POL ;POSITION LOST ERROR? BNE 40$ ;NO. GO CLEAN UP5 BISB #US.PWF,U.STS(R5) ;SET POWERFAIL BIT FOR UNITE 40$:2 POP ;RESTORE END PACKET ADDRESS ;PKW105 ;PKW105B  .IFF ;DISK ONLY ;PKW105 ;PKW105T2 POP ;RESTORE END PACKET ADDRESS ;PKW1057 CMP P.STS(R1),#ST.DAT ;IS IT FORCED ERROR? ;PKW105* BNE 50$ ;NO, LEAVE IT ALONE ;PKW105= MOV #IE.FER&377,R0 ;SET FORCED ERROR STATUS CODE ;PKW105  50$: ;PKW105 .ENDC ;PKW105 ;PKW105B8 CMP #ST.OFL,P.STS(R1) ;WAS IT UNIT OFFLINE? ;PKW105' BNE 60$ ;NOPE, JUST EXIT ;PKW105<: MOV #IE.IDU&377,R0 ;ST.OFL MEANS NO SUCH UNIT ;PKW105 60$: ;PKW105L. RETURN ;AND GO BACK TO THE CALLER ;**-3  .PAGE .IF DF,D$$DSK ;JJM304# .SBTTL ENDSIO - TRY TO STALL I/OR ;+ ;**-25 ;**-ENDSIO- TRY TO STALL I/O ;  ; INPUTS: ;**-1O ;E ; R1 END PACKET ADDRESS ; R2 QST ADDRESS ; R3 (P)IOP ADDRESS;! ; R4 SCB ADDRESS" ; R5 UCB ADDRESS# ;P $ ; OUTPUTS:2% ; CARRY CLEAR - R1-R5 PRESERVED, I/O NOT STALLED/& ; CARRY SET - R2,R4,R5 PRESERVED, I/O STALLEDM& ;- ;PKW10916& ENDSIO: MOV P.STS(R1),R0 ;GET STATUS WORD ;PKW1096& BIC #^C,R0 ;CLEAR SUBSTATUS BITS ;PKW109.& CMP #ST.OFL,R0 ;OFFLINE TO DISK ;PKW1092& BEQ 5$ ;YES, SHOULD TRY TO STALL I/O ;PKW1092& CMP #ST.AVL,R0 ;HOW ABOUT AVL STATE? ;PKW1090& BNE 20$ ;NOT THAT EITHER, CONTINUE ;PKW109& 5$: ;PKW1094* BITB #IP.FAK,I.PRM+11(R3) ;IS IT A PIOP? ;**-32+ BNE 20$ ;YES, LET PIOP'S THROUGH FOR RECOVERY=+ BIT #UU.SIO,U.UTIL(R5) ;DOES THIS UNIT STALL I/O? ;PKW109W/ BEQ 20$ ;IF EQ NO ;**-3;/0 BITB #US.MNT,U.STS(R5) ;IS THE UNIT MOUNTED? !1 BNE 20$ ;NO, DON'T STALL I/O 01 CLR R0 ;INDICATE NOT TO FINISH I/O ;PKW109<3 PUSH ;SAVE THE IOP AND SHOW NO BYTE COUNT ;**-1)4 CALL ENDCMO ;CLEAN UP THE END PACKETE%4 POP ;GET THE IOP ;PKW10914 ;PKW109K94 .IF DF D$$DSK&DU$CHK ;IF QUEUE OPTIMIZATION ;PKW1094 ;PKW109T=4 MOV I.UCB(R1),R5 ;MAKE SURE WE HAVE THE RIGHT UCB ;PKW109H,4 CALL REQUE ;RECONVERT THE LBN ;PKW1094 ;PKW109B%4 .ENDC ;D$$DSK&DU$CHK ;PKW109T4 ;PKW109O=4 MOV R4,R0 ;MOVE THE S.LHD QUEUE TO R0 FOR $QINSB ;PKW109K=4 CALL @QINSB ;INSERT AT THE BEGINNING OF THE QUEUE ;GM112*=4 BIT #UU.IOS,U.UTIL(R5) ;DID WE ALREADY STALL I/O? ;PKW109G54 BNE 10$ ;YES, DON'T REISSUE THE MESSAGE ;PKW109 89 BIS #UU.IOS,U.UTIL(R5) ;SET THE STALL I/O BIT ;**-4+: MOV #T.NIOS,R0 ;SET I/O STALLED MESSAGE &: CALL @DVMSG ;GO SEND IT ;GM112)> MOV S.QST(R4),R2 ;RESTORE R2 ;**-3 /> 10$: SEC ;SHOW THAT WE STALLED IT ;PKW109W@ RETURN ;**-1OA !B 20$: CLC ;WE DIDN'T STALL ITT C RETURNID E .ENDC ;D$$DSKQb .PAGE ;**-28I/c .SBTTL FINIO - FINISH UP ALL I/O IN A QUEUE(d ;+/e ;**-FINIO-FINISH ALL I/O IN A QUEUE AS IE.FHE;f ;D g ; INPUTS:Th ;S i ; R1 INITIAL POINTER FOR QUEUEj ; R2 QST ADDRESSk ; R4 SCB ADDRESSl ; R5 UCB ADDRESSm ;/ n ; OUTPUTS:o ; R2,R4,R5 PRESERVEDp ;-q FINIO:+r MOV R1,R3 ;COPY THE QUEUE ADDRESS TO R3-%s MOV (R3),R3 ;GET THE FIRST PACKET ,t BEQ 20$ ;THERE AREN'T ANY, SO JUST LEAVE$u CLR (R1) ;REINITIALIZE THE QUEUEv MOV R1,2(R1) ;.../w 10$: MOV #IE.FHE&377,R0 ;FATAL H00tx```t`TADATADATADATADATADATAARDWARE ERRORIx CLR R1 ;NO BYTE COUNT 3y PUSH <(R3)> ;SAVE LINK TO NEXT IOP IN THE QUEUESz CALL ENDCM1 ;GO FINISH IT /{ POP ;GET LINK TO NEXT IOP IN THE QUEUEA| BNE 10$ ;GO DO THE NEXT ONE5 } 20$: RETURN ~  .PAGE ;**-3750 .SBTTL GCSSIO - INITIATE A GET COMMAND STATUS ;+; ;**-GCSSIO-INITIATE A GET COMMAND STATUS COMMAND (OP.GCS)B ;$ ; INPUTS:' ;, ; R2 ADDRESS OF QST ; R3 ADDRESS OF CST ; R4 ADDRESS OF SCB ; R5 ADDRESS OF UCB ;B ; OUTPUTS: ;  ;- GCSSIO:K$ TST C.OLHD(R3) ;I/O STILL THERE?% BNE 10$ ;IF NE, YES, CHECK ON IT 1 BIC #C1.GCS,(R3) ;FORGET ABOUT ISSUING OP.GCST* JMP CLACMD ;GO TRY TO START SOMETHING ; 9 ; ISSUE 'GET COMMAND STATUS' COMMAND FOR OLDEST COMMAND ;  10$:0 BIS #C1.TMO,(R3) ;WE'RE NOW IN TIMEOUT STATE. BIC #C1.GCS,(R3) ;SHOW THAT WE DID THE GCS. MOV #GCSFUN,R0 ;GET THE GCS FUNCTION TABLE1 MOVB FO.SZ(R0),R0 ;GET THE SIZE OF THE PACKETD" CALLV PORT,PKTAC ;GET A PACKET< MOV C.OLHD(R3),R0 ;GET THE ADDRESS OF THE OLDEST COMMAND- MOV #OP.GCS,P.OPCD(R1) ;SET UP GCS OP CODE1= MOVB I.PRM+11(R0),P.OTRF(R1) ;OUTSTANDING REFERENCE NUMBERR> BIC #^C<17>,P.OTRF(R1) ;CLEAR OUT ALL BUT THE SEQUENCE BITS= MOV R0,P.OTRF+2(R1) ;IOP ADDRESS IS THE SECOND CRF NUMBER;= MOV R0,P.CRF(R1) ;USE THE IOP FOR BOTH OF THE CRF NUMBERSD MOV R0,P.CRF+2(R1) ;... 1 MOV I.UCB(R0),R5 ;GET THE CORRECT UCB ADDRESS 5 MOVB U.UNIT(R5),P.UNIT(R1) ;SET UP THE UNIT NUMBER + CLRB P.UNIT+1(R1) ;UNIT IS ALWAYS <=255E' CALLV PORT,PORSEN ;SEND THE COMMANDP/ JMP CLACMD ;GO TRY TO START OTHER COMMANDSR  .PAGE@ .SBTTL GUSSIO - START AND PROCESS AN OP.GUS REQUEST ;JJM304. .SBTTL CMDGUS - GET UNIT STATUS ;JJM304 ;+ ;**-1 2 ;**-GUSSIO - START AND PROCESS AN OP.GUS REQUEST ; J ; THIS ROUTINE ISSUES GUS COMMANDS. THE GUSSIO ENTRY POINT WILL ISSUE A% ; FOR ANY UNIT THAT HAS UU.GUS SET.M ;. ; INPUTS:I ; " ; ASSUMES ONE SCB PER CONTROLLER ; R2=ADDRESS OF QSTW ; R4=ADDRESS OF SCBR ; R5=ADDRESS OF UCBM ; ; OUTPUTS: ; IF C1.GUS IS CLEARED THEND ;  ; R2=ADDRESS OF QSTU ; R3=ADDRESS OF CSTS ; R4=ADDRESS OF SCBJ ; R5=ADDRESS OF UCB- ;U ;**-CMDGUS - GET UNIT STATUS ;  ; ROUTINE DESCRIPTIONA ;DO ; CONTROL IS PASSED TO THIS POINT WHEN A GET UNIT STATUS COMMAND IS ISSUED BYI* ; THE USER, SUCH AS IN AN IO.STC COMMAND ; ; INPUTS:T ; & ; R0=ADDRESS OF FUNCTION TABLE ENTRY ; R2=ADDRESS OF QST  ; R3=ADDRESS OF IOP  ; R4=ADDRESS OF SCB  ; R5=ADDRESS OF UCB ; ; OUTPUTS: ;. ; R2-R5 ARE PRESERVED  ;  ;- .ENABL LSB  CMDGUS: * PUSH <#CLACMD> ;RETURN TO CLASS COMMAND BR 30$ ;GO TO COMMON CODEG GUSSIO:T ; # ; LOOK FOR UNITS NEEDING OP.GUS'S  ;T" PUSH <#SCUCB> ;START A UCB SCAN! 10$: CALL @(SP)+ ;GO GET A UCBI BCC 20$ ;WE GOT ONEN JMP 190$ ;NONE LEFT, EXITN5 20$: BIT #UU.GUS,U.UTIL(R5) ;IS AN OP.GUS REQUIRED? $ BEQ 10$ ;IF EQ, NO, TRY NEXT ONE- BIC #UU.GUS,U.UTIL(R5) ;LEAVE UU.GUS STATEO9 BIS #UU.SER,U.UTIL(R5) ;MAKE SURE WE'RE IN SERIAL MODE CALL PIOPAL ;GO GET A PIOP5 PUSH <#200$> ;RETURN TO ISSUING MORE GUS COMMANDS: 30$: MOV #GUSFUN,R0 ;R0 POINTS TO TABLE ENTRY FOR OP.GUS& CALL CMDCOM ;SET UP COMMAND PACKET3 CALL CMDSEN ;SEND THE COMMAND TO THE CONTROLLER   ;I+ ; PROCESS END PACKET FOR OP.GUS - INPUTS:E ;, ; R1=ADDRESS OF END PKTU ; R3=ADDRESS OF IOP  ; R2=ADDRESS OF QST  ; R4=ADDRESS OF SCBE ; R5=ADDRESS OF UCB( ;L   .IF DF D$$DSK ;S% ; SAVE INFORMATION IN UCB EXTENSIONL ;. PUSH ;SAVE END PACKET, QST, IOP>$ MOV #,R0 ;SET NUMBER OF BYTES TO MOVE ;**-3.% MOV R1,R2 ;COPY MSCP PACKET POINTER TO R22& ADD #P.MLUN,R2 ;UPDATE OFFSET INTO MSCP PACKET4& MOV @KISR6,R1 ;GET PACKET'S BASE ADDRESS ;GM112+( SUB #20000,R2 ;BIAS IT PROPERLY ;**-110) MOV U.UC200t`_b_c_d_kX(R5),R3 ;GET DESTINATION APR6 BIAS6* MOV #X.MLUN+140000,R4 ;GET DESTINATION DISPLACEMENT)* CALL @BLXIO ;MOVE THE DATA ;GM1126* MOV U.SCB(R5),R4 ;RESTORE THE SCB ADDRESS ;PKW109* ;PKW109 A* .IF DF D$$DSK&DU$CHK ;IF QUEUE OPTOMIZATION SUPPORTED ;PKW109E* ;PKW109M7* MOV 4(SP),R2 ;RETRIEVE MSCP PACKET POINTER ;PKW109N<* MOVB P.TRCK(R2),U.PRM(R5) ;SET UP SECTORS/TRACK ;PKW1091* MOVB P.GRP(R2),R0 ;GET TRACKS/GROUP ;PKW109A:* MUL P.CYL(R2),R0 ;MULTIPLY BY GROUPS/CYLINDER ;PKW1099* MOVB R1,U.PRM+1(R5) ;SET UP TRACKS/CYLINDER ;PKW109P-* MOV R1,R0 ;SET UP FOR MULTIPLY ;PKW109M8* MUL P.TRCK(R2),R0 ;COMPUTE SECTORS/CYLINDER ;PKW1092* MOV U.CW3(R5),R3 ;SET UP MAX LBN ... ;PKW109&* MOVB U.CW2(R5),R2 ;... ;PKW1090* DIV R1,R2 ;COMPUTE CYLINDERS/UNIT ;PKW1097* MOV R2,U.PRM+2(R5) ;SET UP CYLINDERS/UNIT ;PKW109R* ;PKW109A%* .ENDC ;D$$DSK&DU$CHK ;PKW109TG ; ;**-280PH ; THE NEXT SECTION OF CODE SETS MULTI-UNIT CODES FOR THE UNIT. IF THE MULTI-RI ; UNIT CODE OF THIS UNIT MATCHES THAT OF ANY OTHER UNITS ON THE CONTROLLER, UU.SPJ ; IS SET IN THE UCB OF THE FIXED DISK. THIS INDICATES THAT I/O CAN BE STALLEDNK ; TO THIS UNIT. FOR M-PLUS, US.MUN IS SET IN THE UCB OF THE REMOVABLE DISK.PL ; THIS TELLS DISMOUNT TO ISSUE WARNING MESSAGES ABOUT MULTI-UNIT SPIN DOWN AND?M ; TO PREVENT NON-PRIVILEGED USERS FROM SPINNING DOWN THE DISKHN ; 0Q MOV 4(SP),R1 ;GET THE END PACKET BACK ;**-2(R MOV P.UNFL(R1),R0 ;GET THE UNIT FLAGS-S MOV P.MLUN(R1),R2 ;AND THE MULTI-UNIT CODET(T BEQ 90$ ;IF NO CODE, UNIT IS OFFLINEU MOV R5,R3 ;SAVE THE UCB +V PUSH #SCUCB ;GET THE UCB SEARCH ADDRESSA!W 50$: CALL @(SP)+ ;GO GET A UCBNX BCS 90$ ;ALL DONE "Y CMP R5,R3 ;IS IT THE SAME UCB? Z BEQ 50$ ;YES, GO GET ANOTHER1Z PUSH <@KISR6> ;SAVE THE PORT MAPPING ;GM112D:Z MOV U.UC2X(R5),@KISR6 ;MAP THE SECOND EXTENSION ;GM1123a MOV 140000+X.UNFL,R1 ;GET THE UNIT FLAGS ;**-6K0b MOV 140000+X.MLUN,R4 ;AND THE MULTI-UNIT CODE*b POP <@KISR6> ;REMAP THE PORT ;GM1129m CMP R2,R4 ;ARE THE MULTI-UNIT CODES THE SAME? ;**-103n BNE 50$ ;NO, GO TRY ANOTHER -o BIT #UF.RMV,R0 ;IS THE ORIGINAL REMOVABLE?+p BNE 60$ ;IF NE YESCq BIS #UU.SIO,U.UTIL(R3) ;SET BIT TO INDICATE DEVICE CAN STALL I/OSAq BICB #US.MUN,U.ST2(R3) ;DON'T HAVE DMO ISSUE MESSAGES ;PKW109D#s BR 70$ ;BRANCH AROUND ;**-1EEs 60$: BISB #US.MUN,U.ST2(R3) ;INDICATE DEVICE IS MULTI-UNIT ;PKW109*6u 70$: BIT #UF.RMV,R1 ;IS THE OTHER REMOVABLE? ;**-1v BNE 80$ ;IF NE YESCw BIS #UU.SIO,U.UTIL(R5) ;SET BIT TO INDICATE DEVICE CAN STALL I/O Aw BICB #US.MUN,U.ST2(R5) ;DON'T HAVE DMO ISSUE MESSAGES ;PKW109H$y BR 50$ ;FINISH THE SCAN ;**-1Ey 80$: BISB #US.MUN,U.ST2(R5) ;INDICATE DEVICE IS MULTI-UNIT ;PKW109L${ BR 50$ ;FINISH THE SCAN ;**-1@{ 90$: POP ;RESTORE IOP, QST, AND END PACKET ;PKW110{ ;PKW110 &{ .IFF ;D$$DSK - IF TAPE ;PKW110{ ;PKW110 9{ MOV P.MEDI(R1),U.MEDI(R5) ;SAVE THE MEDIA ID ;PKW110E:{ MOV P.MEDI+2(R1),U.MEDI+2(R5) ;IT'S TWO WORDS ;PKW110{ ;PKW110 ,{ .IFTF ;D$$DSK - BOTH DRIVERS ;PKW110{ ;PKW110W{ ; ;PKW110I{ ; NOW WE CHECK OUT THE STATUS CODE AND TAKE APPROPRIATE ACTION ;PKW110T{ ; ;PKW110E{ CALL ENDERR ;TRANSLATE THE MSCP END CODE INTO AN RSX CODE ;PKW110S3{ PUSH #0 ;PUT A FLAG WORD ON THE STACK ;PKW110.C{ MOV P.STS(R1),-(SP) ;PUT THE STATUS IN A TEMPORARY CELL ;PKW110D6{ BIC #^C,(SP) ;GET THE MAJOR CODE ;PKW1107{ CMP #ST.AVL,(SP)+ ;WAS IT UNIT AVAILABLE? ;PKW110 0{ BNE 140$ ;NO, LEAVE THE ERROR CODE ;PKW110{ ; ;PKW110A{ ; SPECIAL PROCESSING IF THE STATUS WAS UNIT-AVAILABLE ;PKW110O{ ; ;PKW110={ MOV #IS.SUC,R0 ;RETURN SUCCESS AS THE STATUS CODE ;PKW110SL{ BIT #UU.ATN,U.UTIL(R5) ;WAS THIS A GUS FROM AN ATTENTION MESSAGE? ;PKW110,{ BEQ 170$ ;NOPE, JUST CONTINUE ;PKW110{ ;PKW110 ({ .IFF ;D$$DSK - TAPE ONLY ;PK00t```t`TADATADATADATADATADATAW110{ ;PKW110J={ BIT #UU.BLK,U.UTIL(R5) ;SHOULD WE DO THE ONLINE? ;PKW110?,{ BEQ 170$ ;NOPE, JUST CONTINUE ;PKW110{ ;PKW110 ,{ .IFTF ;D$$DSK - BOTH DRIVERS ;PKW110{ ;PKW110I;{ INC (SP) ;MARK THE FLAG WORD AS NEEDING AN ONL ;PKW110T%{ BR 170$ ;GO FINISH UP ;PKW110S{ ;PKW110I*{ .IFT ;D$$DSK - DISK DRIVER ;PKW110{ ;PKW11018{ 140$: TST P.STS(R1) ;WAS THE STATUS SUCCESS? ;PKW110'{ BNE 170$ ;NO, FINISH UP ;PKW1100{ ; ;PKW110G{ ; SPECIAL PROCESSING IF THE STATUS WAS SUCCESS - UNIT ONLINE ;PKW1101S{ ; IF THIS IS THE GUS AFTER AN ONL, THEN REQUEST RCT AND RESTART STALL I/O ;PKW110D{ ; ;PKW110<{ BIT #UU.SER,U.UTIL(R5) ;WERE WE IN SERIAL MODE? ;PKW1104{ BEQ 170$ ;NO, MUST HAVE BEEN AN IO.STC ;PKW1103 PUSH ;R1 IS A PARAMETER FOR RQRCT ;**-40R. CLR R1 ;R1=0 TELLS RCT WE ARE INITIALIZING CALL RQRCTW POP ;RESTORE R1 ;**-1 ; SEE IF INIT WAS STALLING I/O B BIT #UU.IOS,U.UTIL(R5) ;IS I/O STALLED TO THIS DEVICE? ;PKW110& BEQ 170$ ;NOPE, CONTINUE ;**-2: BIC #UU.IOS,U.UTIL(R5) ;CLEAR THE STALL I/O BIT ;**-25 BISB #US.VV,U.STS(R5) ;SET VOLUME VALID ;PKW109WG PUSH ;SAVE STUFF THAT $DVMSG IS GOING TO WRECK ;PKW110S6 MOV #T.NIOR,R0 ;SET THE I/O RESUMED MESSAGE ;**-2' CALL @DVMSG ;GO PRINT IT ;GM112 . POP ;GET 'EM BACK ;PKW110 ; ;**-4@ ; IF SPECIAL ONLINE PUT STATUS CODE IN $SCERR AND CLEAR UU.SPC ;(I 170$: BIC #UU.ATN!UU.SER,U.UTIL(R5) ;EXIT SERIAL AND ATN STATE ;PKW110 - BIT #UU.SPC,U.UTIL(R5) ;$SCOFL? ;PKW110S! BEQ 180$ ;IF EQ, NO ;**-1V6 MOVB R0,@SCERR ;SET UP ERROR CODE FOR EXEC ;GM1128 BIC #UU.SPC,U.UTIL(R5) ;NOLONGER SPECIAL CASE ;**-1- 180$: PUSH <#0> ;NO BYTE COUNT ;PKW110E ;**-6D .IFF ;IF TAPE 140$: ;PKW110G 170$: BIC #UU.ATN!UU.SER,U.UTIL(R5) ;CLEAR ATN AND SER FLAGS ;JJM350N8 BIC #M.DEFM,U.CW2(R5) ;CLEAR DEFAULT FLAGS ;**-316 BITB #EF.EOT,P.FLGS(R1) ;EOT ENCOUNTERED ? ;**-3 BEQ 60$ ;NO0 BISB #M.EOT,U.CW2(R5) ;YES, ENCOUNTERED EOT 60$:5 BIT #UF.WPH,P.UNFL(R1) ;HARDWARE WRITE-PROTECTED ?D BEQ 70$ ;NO8 BIS #M.HWL,U.CW2(R5) ;YES, HARDWARE WRITE-PROTECTED 70$:% BIT #TF.PE,P.FORM(R1) ;1600 BPI ? BEQ 80$ ;NO( BIS #M.1600,U.CW2(R5) ;YES, 1600 BPI1 BR 90$ ;DO NOT CHECK MORE DENSITIES ;JJM350N 80$: ;**-1N% BIT #TF.GCR,P.FORM(R1) ;6250 BPI ?U BEQ 90$ ;NO( BIS #M.6250,U.CW2(R5) ;YES, 6250 BPI% 90$: ;REFERENCE LABEL ;JJM350S2 CMP #ST.OFL,R0 ;UNIT OFFLINE ? ;**-6 BNE 110$ ;NO(, BIS #M.SER,U.CW2(R5) ;YES, SELECT ERROR110$: " PUSH ;SET IOSB+2 VALUE CMP I.FCN(R3),#IO.STC  BEQ 120$P CMP I.FCN(R3),#IO.SMO  BEQ 120$  2  MOV U.CW2(R5),(SP) ;VALUE TO BE USED FOR IOSB+2 120$: ;PKW110 .ENDC ;D$$DSK ;**-2 : CALL ENDCMO ;GO FINISH UP, AND COME BACK HERE ;PKW1100 TST (SP)+ ;SHOULD WE DO AN ONLINE? ;PKW110* BEQ 220$ ;NOPE, JUST RETURN ;PKW1105 JMP ONLSIO ;GO ISSUE THE ONLINE COMMAND ;PKW1101 ;PKW110#7; NO UNIT'S REQUIRE OP.GUS'S - LEAVE THE C1.GUS STATER190$:O1 MOV (R2),R3 ;/*Q.CST*/ ;R3 IS THE CST ADDRESS' BIC #C1.GUS,(R3) ;LEAVE C1.GUS STATE7 JMP CLACMD ;GOTO CLACMD TO LOOK FOR SOMETHING TO DO2; 6; GO BACK TO TOP OF LOOP FOR PROCESSING MORE PACKETS200$:G+ CALLV PORT,PKTCH1 ;DO WE HAVE RESOURCES?T' ; ONLY NEED ONE CREDIT SINCE THIS1 ; IS AN IMMEDIATE CMDR  BCS 210$ ;NO RESOURCES, QUIT% JMP 10$ ;WE'RE OK, GO TRY ANOTHER'210$: ADD #10,SP ;FLUSH THE UCB SCANR%220$: RETURN ;GO HOME ;PKW1106! .DSABL LSB ;DISABLE LOCAL SYMBOL DEFINITION ;**-1" .PAGE," .SBTTL LERR - LOG AN ERROR ;JJM3045" .SBTTL CERR - LOG A CONTROLLER ERROR ;JJM304 % .IF DF E$$LOG ;**-2R&;+/'; **- CERR - CONTROLLER ER00t`_b_c_d_kROR LOGGING ROUTINEK(;;L); THE CONTROLLER ERROR LOGGING ROUTINE WILL CAUSE THE CREATION OF AN ERRORL*; LOG PACKET, COPY THE VALUES OF THE TWO I/O PAGE REGISTERS INTO THE ERRORL+; LOG PACKET AND REQUEST THE ERROR LOGGING SUB-SYSTEM TO CAPTURE THE DATA.,; -; INPUTS:3.; R0 = ERROR CODE (IE.FHE FOR CONTROLLER FAILURE)/; R3 = CST ADDRESS0; R4 = SCB ADDRESS1; R5 = UCB ADDRESS2; 3; OUTPUTS:4; B5; THE ERROR (OR TIME OUT) ON THE SPECIFIED CONTROLLER IS LOGGED.6;C7;-9 .ENABL LSB ;**-1:CERR: 5; PUSH ;SAVE REGISTERS (WE NEED R0)A-? MOV S.KRB(R4),R2 ;GET KRB ADDRESS ;**-3E%@ MOV K.CSR(R2),R2 ;GET CSR ADDRESSEH; ;**-7&I; SET UP CONTROLLER ERROR LOG PACKETJ;OK'L MOV #4,C.MLNG(R3) ;SET PACKET LENGTH0.M MOVB #-2,C.VCIX(R3) ;SET VIRTUAL CIRCUIT ID(N MOVB #20,C.CRED(R3) ;SET CREDIT FIELD&O MOV (R2),C.IP(R3) ;SAVE IP REGISTER'P MOV 2(R2),C.SA(R3) ;SAVE SA REGISTERT"Q MOV #C.IP,R1 ;ADJUST R1 TO ...7R ADD R3,R1 ;... POINT TO CONTROLLER ERROR LOG PACKET .S ;THIS IS ADJUSTED LATER TO POINT TO MLNG T BR 10$ ;AND LOG ERROR PACKETV;+ ;**-1K)W; **- LERR - UNIT ERROR LOGGING ROUTINE X;7JY; THE UNIT ERROR LOGGING ROUTINE WILL CAUSE THE CREATION OF AN ERROR LOGIZ; PACKET, COPY THE CONTENTS OF THE MSCP ERROR LOG PACKET INTO THE ERROR2L[; LOG PACKET AND REQUEST THE ERROR LOGGING SUB-SYSTEM TO CAPTURE THE DATA.\;) ]; INPUTS:V^;R-_; R0 = COMPLETION STATUS (IS.SUC OR IE.XXX)0`; R1 = ADDRESS OF CURRENT RESPONSE RING PACKETa; R4 = SCB ADDRESSb; R5 = UCB ADDRESSc;L d; OUTPUTS:e; .f; THE ERROR ON THE SPECIFIED UNIT IS LOGGED.h;- ;**-1GijLERR:(k PUSH ;SAVE REGISTERSBl10$: CLRB S.ROFF(R4) ;ZERO OFFSET TO FIRST REGISTER OF ERROR ...m ;... LOG PACKET 6n MOV #MSGLNG,R2 ;GET OFFSET TO BEGINNING OF ENVELOPE2o ADD R1,R2 ;ADD BASE ADDRESS OF RESPONSE PACKET!p PUSH (R2) ;GET MESSAGE LENGTHT2q ADD #-,(SP) ;ADD EXTRA FOR THE ENVELOPE7r CMP #RSPLNG,(SP) ;DID WE EXCEED MAXIMUM PACKET SIZE?5s BHIS 30$ ;IF HIS NO B{20$: TST (SP)+ ;PACKET PLUS ENVELOPE EXCEEDS MAXIMUM SIZE ;**-7$| BR 80$ ;EXIT, CAN'T ERROR LOG IT/}30$: MOV (SP),R2 ;COPY NUMBER OF BYTES TO R2.H MOVB (SP)+,S.RCNT(R4) ;SET NUMBER OF REGISTERS TO COPY FOR ... ;**-1 ;... ERROR LOG- CLR S.PKT(R4) ;ASSUME NO I/O PACKET ACTIVE,2 MOV CREDIT(R1),R0 ;OBTAIN MESSAGE/CREDIT FIELDS5 BIC #^C,R0 ;CLR ALL BUT MESSAGE TYPE FIELDXA CMPB #,R0 ;IS THIS RESPONSE A DATAGRAM PACKET?C BEQ 40$ ;IF EQ Y* MOV P.CRF+2(R1),R3 ;GET THE IOP ADDRESS* BEQ 40$ ;NO PACKET...... NOT POSSIBLE?G BITB #IP.FAK,I.PRM+11(R3);NO, ARE WE DOING AN INTERNAL I/O FUNCTION?E BNE 40$ ;IF EQ YESB MOV P.CRF+2(R1),S.PKT(R4) ;NO, COPY I/O PACKET ADDRESS FOR ... ;... ERROR LOGGERT ;IS I/O ACTIVE?K BR 50$ ;NO, GO ON TO LOG ITA40$: CLR R4 ;NO, CLR R450$: PUSH R1 ;SAVE R1 AGAIN+ MOV R2,R1 ;COPY NUMBER OF BYTES INTO R1>;T; INTERFACE TO $LOGER:;C ; INPUTS: ;Q.; R1 = LENGTH OF DATA TO BE LOGGED, IN BYTES,; R4 = SCB ADDRESS (ZERO IF NO I/O PACKET); R5 = UCB ADDRESS;N ; OUTPUTS:;I; C = 1 UNABLE TO LOG ERROR4;I; C = 0 ABLE TO LOG ERRORS;R2; R1 = ADDRESS OF DATA AREA IN ERROR LOG PACKET%; R3 = ADDRESS OF ERROR LOG PACKET; ; NOTE:O;O; R4 AND R5 ARE PRESERVED;#; R0, R2, AND R3 MAY BE DESTROYEDA-; KISAR6 IS DESTROYED BY $LOGER ON 11M PLUSR;5 CALL @LOGER ;ATTEMPT TO LOG ERROR PACKET ;GM112= BCS 20$ ;EXIT IF WE CAN'T LOG THE ERROR (POP STACK) ;**-1D5 MOV R1,R4 ;COPY R1 INTO R0 FOR DESTINATION ;**-1N5 POP R2 ;RESTORE POINTER TO MSCP PACKET FOR SOURCE. BCS 80$ ;IF CS, UNABLE TO LOG ERROR PACKET$ PUSH R2 ;SAVE DESTROYED REGISTER2 ADD #MSGLNG,R2 ;OFFSET TO BEGINNING OF ENVELOPE/ BIC #160000,R2 ;R2 IS ADDRESS IN APR 5 RANGE BIS #120000,R2 ;B( MOV U.SCB(R5),R3 ;RESTORE SCB ADDRESS(00t```t`TADATADATADATADATADATA MOV S.PBIA(R3),R1 ;MAP TO PORT DRIVER CLR R0 ;SETUP FOR "BISB"> BISB S.RCNT(R3),R0 ;SET NUMBER OF REGISTERS (WORDS) TO COPY1 MOV @KISR6,R3 ;GET DESTINATION BIAS ;GM112S- PUSH R3 ;MAY BE NEEDED FOR $FNERL ;**-1O* CALL @BLXIO ;MOVE THE DATA ;GM112 ;**-1O" MOV U.SCB(R5),R4 ;R4 IS THE SCB> MOV S.PBIA(R4),@KISR6 ;MAP APR 6 TO PORT DRIVER ;GM112= .IIF DF,K$$DAS MOV S.PBIA(R4),@#KINAR6 ; KERNAL DATA ;**-104 POP R3 ;RECOVER MAPPING BIAS FOR ERRORLOG PACKET& POP R1 ;RESTORE REGISTER ;**-14, MOV (SP),R0 ;GET STATUS WHICH CAME IN R0  TST S.PKT(R4) ;IS I/O ACITVE? BNE 70$ ;IF NE YES CLR R4 ;NO, CLR R4 CLR R2 ;DON'T FORGET R2M; ;D; INTERFACE TO $FNERL:;B ; INPUTS:T;T; R0 = FIRST I/O STATUS WORD.; R2 = STARTING AND FINAL ERROR RETRY COUNTS4; R3 = ADDRESS OF ERROR LOG PACKET (BIAS IF MPLUS),; R4 = SCB ADDRESS (ZERO IF NO I/O PACKET); R5 = UCB ADDRESS; ; OUTPUTS:;I,; THE SPECIFIED ERROR LOG PACKET IS LOGGED;R ; NOTE:;V; R4 AND R5 ARE PRESERVEDA#; R1, R2, AND R3 MAY BE DESTROYEDI;B70$: CALL @FNERL ;FINISH LOGGING THIS ERROR LOG PACKET ;GM112 ;**-1D.80$: POP ;RESTORE REGISTERS; MOV S.PBIA(R4),@KISR6 ;MAP APR 6 TO PORT DRIVER ;GM112I= .IIF DF,K$$DAS MOV S.PBIA(R4),@#KINAR6 ; KERNAL DATA ;**-2I RETURN ;EXIT ;**-1  .DSABL LSBO .ENDC .PAGE7 .SBTTL MAPD - COROUTINE TO MAP THE PORT ;JJM304R5 .SBTTL SAVREG - COROUTINE TO SAVE R0-R3 ;JJM3044;+ ;**-1A(; **-MAPD-SAVE AND LATER RESTORE APR 6; R0 IS DESTROYED;-MAPD:I$ POP R0 ;REMEMBER WHERE TO RETURN& PUSH @KISR6 ;SAVE APR 6 ;GM112= MOV S.PBIA(R4),@KISR6 ;MAP APR 6 TO PORT DRIVER ;GM112R ;**-2. ;**-1.8 PUSH @#KINAR6 ;SAVE INSTRUCTION SPACE APR 6 ;PKW109C MOV S.PBIA(R4),@#KINAR6 ;FOR I/D SYSTEMS MAP BOTH I AND D ;**-1- ;**-1O/  CALL (R0) ;CALL CALLER BACK AS A CO-ROUTINEA ;- ; COROUTINE RETURN POINT ;- 9  POP @#KINAR6 ;RESTORE INSTRUCTION SPACE APR 6 ;PKW109R  ;PKW109D6  POP @KISR6 ;RESTORE PREVIOUS APR6 MAPPING ;GM112 ;**-2G RETURN ;RETURN4;+*; **-SAVREG-SAVE AND LATER RESTORE R0-R3;- SAVREG: 0 PUSH ;STORE R0 TEMPORARILY ON THE STACK- MOV 2(SP),R0 ;GET THE RETURN ADDRESS IN R0 < POP <(SP)> ;MOVE THE ORIGINAL R0 OVER THE RETURN ADDRESS8 PUSH ;SAVE R1-R3 AND THE RETURN ADDRESS MOV 10(SP),R0 ;RESTORE R04 CALL @(SP)+ ;CALL BACK THE CALLER AS A COROUTINE;W ; COROUTINE RETURN POINT!;P+" POP ;RESTORE THE REGISTERS1 # RETURN $% .PAGE4% .SBTTL CMDONL - ISSUE ONLINE COMMANDS ;PKW110%;+ ;PKW110)4; **-CMDONL- DEVICE ONLINE ;**-14R5;PQ6; CONTROL IS PASSED TO THIS POINT WHEN AN ONLINE REQUEST IS ISSUED BY THE USER, 7; AS IN AN IO.STC COMMANDH8;U 9; INPUTS::; &;; R0=ADDRESS OF FUNCTION TABLE ENTRY<; R1==; R2=ADDRESS OF QSTR>; R3=ADDRESS OF IOPC?; R4=ADDRESS OF SCBA@; R5=ADDRESS OF UCBOA;N B; OUTPUTS:C; IF C1.ONL IS CLEARED THENED; E; R2=ADDRESS OF QSTRF; R3=ADDRESS OF IOPBG; R4=ADDRESS OF SCBNH; R5=ADDRESS OF UCBI; J;-;JONLSIO: MOV (R2),R3 ;MAKE SURE WE HAVE THE CST ;PKW1105J CALL PIOPAL ;GO GET A PSEUDO I/O PACKET ;PKW110EMCMDONL: ;**-27M MOV #ONLFUN,R0 ;GET TABLE ENTRY FOR OP.ONL ;PKW110<] BIS #UU.SER,U.UTIL(R5) ;SERIAL MODE FOR THIS ONE ;**-15&^ CALL CMDCOM ;SET UP COMMAND PACKET_#` .IF DF T$$APE ;TAPE CONDITIONALOa;N1b; TAPE SET UP DENSITY AND (USER SETTABLE BITS?) c; 5d BIT #UU.BLK,U.UTIL(R5) ;ONLY 1 DENSITY SUPPORTED?E6e BNE 40$ ;YES. USE 0 (CONTROLLER PICKS DENSITY)f)g BIT #M.1600,I.PRM(R3) ;YES, 1600 BPIWh BEQ 30$ ;NO $i BIS #TF.PE,P.FORM(R1) ;1600 BPI)j BR 40$ ;IGNORE NEXT DENSITY CHECKRk30$:)l BIT #M.6250,I.PRM(R3) ;00t`_b_c_d_kYES, 6250 BPIUm BEQ 40$ ;NOA&n BIS #TF.GCR,P.FORM(R1) ;6250 BPI ?o40$:p .ENDC ;T$$APEq6q PUSH #CLACMD ;TRY TO ISSUE MORE COMMANDS ;PKW1103r CALL CMDSEN ;SEND THE COMMAND TO THE CONTROLLERBst;K+u; PROCESS END PACKET FOR OP.ONL - INPUTS:Bv;$w; R1=ADDRESS OF END PKTEx; R2=ADDRESS OF QSTy; R3=ADDRESS OF (P)IOPz; R4=ADDRESS OF SCB3{; R5=ADDRESS OF UCBF|;.7}; FOR DISK SAVE SOME INFORMATION IN THE UCB EXTENSION ~;R, BIC #UU.SER,U.UTIL(R5) ;LEAVE SERIAL MODE .IF DF D$$DSK6 CMP #ST.ONL,P.STS(R1) ;WAS THE UNIT ALREADY ONLINE?) BEQ 70$ ;YES, SKIP ALL OF THIS STUFFI; ;**-4%; SAVE INFORMATION IN UCB EXTENSIONM;O; PUSH ;SAVE END PACKET, QST, AND IOP ;PKW109 > MOV #,R0 ;SET NUMBER OF BYTES TO MOVE ;**-1. MOV R1,R2 ;COPY MSCP PACKET POINTER TO R22 ADD #P.UNSZ,R2 ;UPDATE OFFSET INTO MSCP PACKET4 MOV @KISR6,R1 ;GET PACKET'S BASE ADDRESS ;GM112+ SUB #20000,R2 ;BIAS IT PROPERLY ;**-10 MOV U.UC2X(R5),R3 ;GET DESTINATION APR6 BIAS6 MOV #X.UNSZ+140000,R4 ;GET DESTINATION DISPLACEMENT) CALL @BLXIO ;MOVE THE DATA ;GM112E5 MOV 4(SP),R2 ;RETRIEVE MSCP PACKET POINTER ;**-1>) MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESS3 MOV P.UNSZ(R2),U.CW3(R5) ;SET UP THE MAX LBN ...V8 MOVB P.UNSZ+2(R2),U.CW2(R5) ;... FOR PROPER OPERATION< POP ;RESTORE IOP, QST, AND END PACKET ;PKW109 ;**-16 .ENDC ;D$$DSK MOV P.STS(R1),R0B* BIC #^C,R0 ;ISOLATE MAJOR CODE* BNE 70$ ;IF NOT SUCCESS, ST.SUC, SKIP;,=; UNIT IS NOW ON-LINE, FIND OUT ABOUT IT BY DOING AN OP.GUST;;* MOV (R2),R0 ;/*Q.CST*/ ;R0 IS THE CST) BIS #C1.GUS,(R0) ;ENTER C1.GUS STATER ;STATE= SERIAL, GUS, RDY,' BIS #UU.SER!UU.GUS!UU.RDY,U.UTIL(R5)V0 BICB #US.SPU,U.STS(R5) ;CLEAR SPINNING UP BIT .IF DF T$$APE;QA; IF TAPE AND IF (IO.STC!IO.SMO) THEN LEAVE THE POWERFAIL STATE;M CMP I.FCN(R3),#IO.STC  BEQ 60$ CMP I.FCN(R3),#IO.SMO  BNE 70$60$: BICB #US.PWF,U.STS(R5) .ENDC ;T$$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. CONTINUET' MOV #IE.DNR&377,R0 ;DEVICE NOT READYB BR 110$ ;JOIN COMMON CODE(D80$: CMP #ST.OFL,R1 ;IS IT MSCP OFFLINE, WHICH MEANS NO SUCH UNIT? BNE 90$ ;NO. CONTINUEF- MOV #IE.IDU&377,R0 ;ILLEGAL DEVICE OR UNITE BR 100$ ;JOIN COMMON CODEN90$:% MOV #IS.SUC&377,R0 ;ASSUME SUCCESSS3 BIC #^C,R1 ;ISOLATE MAJOR CODE IS ST.SUC BEQ 110$ ;IF SUCCESS OKS .IF DF D$$DSK ;PKW110)6 CMP #ST.MFE,R1 ;IS IT MEDIA FORMAT ERROR? ;PKW110% BNE 95$ ;NO, CONTINUE ;PKW110> MOV #IE.BCC&377,R0 ;SET UP FOR MEDIA FORMAT ERROR ;PKW110( BR 110$ ;JOIN COMMON CODE ;PKW110 .ENDC ;D$$DSK ;PKW110I?95$: MOV #IE.OFL&377,R0 ;ELSE SET TO DEVICE OFFLINE ;PKW110VU100$: .IIF NDF R$$MPL&T$$APE BISB #US.OFL,U.ST2(R5) ;RSX-11M DISK DRIVER ONLY ;**-1C110$:B POP ;RESTORE R12 PUSH <#0> ;ZERO BYTE COUNT FOR ONLINE COMMANDS CALLR ENDCOMK;  .PAGE ;**-12E/ .SBTTL PIOPAL - ALLOCATE A PSEUDO I/O PACKET9;+5; **-PIOPAL-ROUTINE TO ALLOCATE A PSEUDO I/O PACKET ;ED; THIS ROUTINE WILL ALLOCATE A PSEUDO I/O PACKET FROM PRIMARY POOL;N ; INPUTS: ;P; R2=ADDRESS OF QSTO; R3=ADDRESS OF CSTD; R4=ADDRESS OF SCBV; R5=ADDRESS OF UCBP;A;S ; OUTPUTS:; ; R0-R1 ARE DESTROYED ; R2-R4-R5 ARE PRESERVED,; R3=PIOP ADDRESS IF SUCESSFULLY ALLOCATED%; C=0 PIOP IS SUCESSFULLY ALLOCATED ; C=1 PIOP CANNOT BE ALLOCATED;- PIOPAL:A3 MOV #18.*2,R1 ;SIZE OF PIOP TO ALLOCATE IN BYTEST PUSH ;SAVE R21 CALL @ALOCB ;ALLOCATE PIOP FROM POOL ;GM112A" POP ;RESTORE R2 ;**-1+ BCS 30$ ;CANNOT ALLOCATE PIOP - GET OUT $ MOV R0,R3 ;PUT I/O PKT ADD IN R3 PUSH <#18.> ;PACKET LENGTH)20$: CLR (R0)+ ;CLEAR A WORD AT A00t```t`TADATADATADATADATADATA TIME $  DEC (SP) ;ONE LESS WORD TO CLEAR  BGT 20$ ;GO DO ENTIRE PACKET!  TST (SP)+ ;CLEAN UP THE STACKP7  MOVB #IP.FAK,I.PRM+11(R3) ;SET TO 1 TO INDICATE PIOPT'  MOV R5,I.UCB(R3) ;SET UP UCB ADDRESSI CLC ;CLEAR CARRYI BR 40$ ;AND EXIT730$: MOV #177773,R3 ;PUT A BAD ADDRESS IN R3 SINCE NOM ;POOL AVAILABLET SEC ;SET CARRYB 40$: RETURN  .PAGE1 .SBTTL PIOPDE - DEALLOCATE A PSEUDO I/O PACKET;+7; **-PIOPDE-ROUTINE TO DEALLOCATE A PSEUDO I/O PACKETT;M<; THIS ROUTINE WILL DEALLOCATE A PSEUDO I/O PACKET. IF THE;; PIOP IS FROM POOL, THEN DEALLOCATE IT FROM SYSTEM POOL,.=; ELSE IT IS FROM THE CST SO JUST MARK THE FIRST WORD AS -13 ; TO INDICATE THAT IT IS FREE.; ; INPUTS:  ;;!; R1=ADDRESS OF PIOP"; R3=ADDRESS OF CSTE#; R4=ADDRESS OF SCB $; R5=ADDRESS OF UCBS%;;&;A '; OUTPUTS:(; ); R0-R1 DESTROYEDB*; R2-R5 ARE PRESERVED +;O,;- -PIOPDE:+. PUSH ;SAVE R2,R3L1/ MOV R1,R0 ;ADD OF PIOP IN POOL TO DEALLOCATEW00 MOV #18.*2,R1 ;NUMBER OF BYTES TO DEALLOCATE*0 CALL @DEACB ;DEALLOCATE PIOP ;GM112(2 POP ;RESTORE R3,R2 ;**-13 RETURN ;4] .PAGE ;**-40C] .IF DF,D$$DSK ;JJM304N^ .SBTTL RECSIO - CONTINUE RECOVERY FROM A CONDITION THAT REQUIRED A RE-SYNCHa;+ ;**-2SHb;**-RECSIO-CONTINUE RECOVERY FROM A CONDITION THAT REQUIRED A RE-SYNCHc;REd; AFTER ALL UNITS ARE BROUGT BACK ON-LINE FROM THE TIME-OUT ROUTINEVEe; THEN ALL OUTSTANDING I/O IS RE-ISSUED AND C1.REC STATE IS CLEARED f;T g; INPUTS:Ah; i; R2 ADDRESS OF QST j; R3 ADDRESS OF CST k; R4 ADDRESS OF SCB"l; R5 ADDRESS OF A UCBm;D n; OUTPUTS:o;p; R2,R3,R4 PRESERVEDq; R5 IS A UCB ADDRESSIr;- sRECSIO:tFu; PROPER OPERATION OF THIS CODE DEPENDS ON THE FACT THAT THIS DRIVERDv; ALWAYS TRYS TO START MORE COMMANDS AFTER IT COMPLETES PROCESSINGw; ANY RECEIVED END PACKETS.Hx;LAy; RECOVERY INVOLVES THREE STAGES AND IS CONTROLLED BY THE STATE@z; BITS C1.R1, C1.R2 AND C1.REC. THE THREE BITS ARE RELATED TOA{; THREE PARTS OF RECOVERY; ISSUING ON-LINES, RE-TRYING ON-LINES (|; AND RE-ISSUING OUTSTANDING COMMANDS.};=~; C1.R1 IS SET TO INDICATE THAT IT IS TIME TO TRY AND BRING<; "SPINNING UP" UNITS (US.SPU SET) BACK ON-LINE. C1.R1 IS;; CLEARED AFTER UNITS ARE MARKED AS NEEDING TO BE BROUGHTO>; ON-LINE. IF, AFTER ALL ON-LINES COMPLETE, THERE ARE STILL6; UNITS THAT DIDN'T COME READY THE DRIVER WILL SET A<; TIME-OUT. WHEN THE TIME-OUT COMES DUE C1.R1 WILL BE SET>; AND CONTROL WILL TRANSER HERE WHERE WE WILL TRY TO ON-LINE<; THE UNITS AGAIN. THIS BEHAVIOR IS REPEATED UNTIL EITHER1; ALL UNITS ARE READY OR RE-TRYS ARE EXHAUSTED. ; <; IF POSSIBLE IT WOULD BE BETTER TO HAVE LIMITLESS RE-TRYS9; FOR THE SYSTEM DISK. THIS IS NOT CURRENTLY THE CASE.A;D?; C1.R2 REMAINS SET AS LONG AS THERE ARE STILL UNITS SPINNING,; UP.E;L?; C1.REC REMAINS SET UNTIL ALL OUTSTANDING COMMANDS HAVE BEENE>; RE-ISSUED AND COMPLETED. THE OLDEST COMMAND MUST COMPLETE@; BEFORE SUBSEQUENT OUTSTANDING COMMANDS ARE RE-ISSUED AND ALLC; RE-ISSUED COMMANDS MUST COMPLETE BEFORE NEW I/O MAY BE STARTED.E;R=; IF C1.R1 IS SET THEN MARK UNITS THAT NEED TO COME ON-LINET); AND GOTO ONLSIO TO START THE COMMANDSY;D BIT #C1.R1,(R3)0 BEQ 40$ ;THIS SECTION DONE ONLY IF C1.R1 SET1 BIC #C1.R1,(R3) ;CLEAR C1.R1 SO THAT THIS WILL ;ONLY BE DONE ONCE.T; MOV #SCUCB,-(SP) ;PUSH "SCAN UCB'S" ROUTINE ON THE STACK (10$: CALL @(SP)+ ;CALL THE CO-ROUTINE BCS 30$ ;IF CS, ALL DONE3 BITB #US.SPU,U.STS(R5) ;IS THIS UNIT SPINNING UP  BEQ 10$ ;IF NOT, GO AGAINE BIT #UU.SER,U.UTIL(R5)R- ;ON-LINE IN PROGRESS (FROM ATTEN. MSG)?  BNE 10$ ;IF SO, GO AGAIN, INC U.CNT(R5) ;COUNT THIS ON-LINE ATTEMPT. CMP U.CNT(R5),#120. ;RE-TRY COUNT EXCEEDED?! BLE 20$ ;IF LE, NO, TRY AGAINL? BICB #US.SPU,U.STS(R5) ;RE-TRYS EXHAUSTED, 00t`_b_c_d_kCLEAR SPINNING UP#% CLR U.CNT(R5) ; AND RE-TRY COUNT.OC BIS #UU.ABO,U.UTIL(R5); REMEMEBER TO ABORT ALL I/O FOR THIS UNITI- ;OTHERWISE IF THE UNIT SUDDENLY BECOMESH5 ;ON-LINE SUBSEQUENT RE-ISSUED I/O WILL SUCCEED. BR 10$ ;TRY NEXT UNITR20$: BIS #UU.SER!UU.GUS!UU.ATN,U.UTIL(R5) ;GET UNIT STATUS, AND THEN ONL ;PKW110$ BR 10$ ;GO THROUGH LOOP ;**-2<30$: BIS #C1.GUS,(R3) ;SET GET UNIT STATUS STATE ;PKW110 JMP GUSSIO ;PKW110; ;**-2B; AT THIS POINT C1.R1 IS CLEAR BUT C1.R2 MAY BE SET. C1.R2 WILLE; BE CLEARED WHEN ALL UNITS HAVE BECOME READY AND HAVE BEEN BROUGHTSE; BACK ON-LINE OR WHEN RE-TRYS HAVE BEEN EXHAUSTED. THIS CONDITIONS/; IS TRUE WHEN US.SPU IS CLEAR FOR ALL UNITS. ; >; THIS SECTION OF CODE WILL SET A TIME-OUT IF ANY UNITS HAVE?; FAILED TO SPIN UP. AT THE END OF THE TIME-OUT CONTROL WILL*@; TRANSFER TO RECSIO WITH C1.R1 SET SO THAT MORE ON-LINES WILL ; BE TRYED. ;;440$: BIT #C1.R2,(R3) ;IN SECOND STAGE OF RECOVERY?' BEQ 90$ ;IF EQ, NO, TRY THIRD STAGE. BIC #C1.R2,(R3) ;ASSUME ALL UNITS ARE READY; MOV #SCUCB,-(SP) ;PUSH "SCAN UCB'S" ROUTINE ON THE STACK (50$: CALL @(SP)+ ;CALL THE CO-ROUTINE BCS 60$ ;IF CS, ALL DONE3 BITB #US.SPU,U.STS(R5) ;IS THIS UNIT SPINNING UP  BEQ 50$ ;IF NOT, GO AGAIN + BIS #C1.R2,(R3) ;SET C1.R2, NOT DONE YETT BR 50$ ;TRY NEXT UNITR60$: BIT #C1.R2,(R3) ;DONE?A& BEQ 90$ ;IF EQ, YES, DO NEXT STAGE/ TST C.OLHD(R3) ;WAITING FOR I/O TO COMPLETE?C BEQ 70$ ;IF YES, EXIT  ;LATER AFTER END PACKETS, ;ARE COMPLETED WE WILL BE CALLED AGAIN* ;AT WHICH TIME WE CAN SET A TIME-OUT ;FOR ON-LINE RE-TRYS  RETURN 70$:* TST S.BSYU(R4) ;IS A UNIT BUSY ALREADY?* BNE 80$ ;IF NE, YES WE MUST BE WAITING( ;FOR A TIME-OUT SO DON'T RE-SET IT+ MOV R5,S.BSYU(R4) ;ELSE, SET A UNIT BUSY  BISB #US.BSY,U.STS(R5)T- MOVB #2,S.CTM(R4) ;SET A 2 SECOND TIME-OUTD80$: RETURN ;EXITO;WH; AT THIS POINT C1.R1 AND C1.R2 MUST BE CLEAR AND IT IS THEREFORE TIME; TO RE-ISSUE I/O.;C90$:, BIC #C1.REC,(R3) ;ASSUME WE ARE FINISHED6 MOV C.REQU(R3),R1 ;R1 IS THE FIRST IOP FROM C.REQU ;ANY I/O TO RESTART? + BEQ 130$ ;NO, THEN SEE IF WE ARE DONE? ) BIS #C1.REC,(R3) ;WE ARE NOT DONE YETU: CMP R1,C.REDO(R3) ;IS THIS THE OLDEST AT TIME OF FAIL?" BEQ 110$ ;IF YES, GO START IT6 TST C.OLHD(R3) ;WE KNOW THE OLDEST HAS STARTED BUT# ;ARE WE STILL WORKING ON IT? , BEQ 100$ ;IF EQ, NO, SO GO CLEAR C.REDO9 CMP C.OLHD(R3),C.REDO(R3) ;ARE WE STILL WORKING ON IT?B, BEQ 150$ ;YES, SO WAIT FOR IT TO FINISH<100$: CLR C.REDO(R3) ;OTHERWISE WE MUST HAVE FINISHED THE% ;OLDEST COMMAND SO ITS TIME TOT ;FORGET IT.;&; START PROCESS OF RE-ISSUING AN I/O; R1 IS THE I/O PACKET; R3 IS THE CST ; R4 IS THE SCB;10110$: MOV I.UCB(R1),R5 ;R5 IS THE UCB ADDRESS  MOV R3,R02 ADD #C.REQU,R0 ;R0 IS THE POINTER TO THE QUEUE1 CALL @QRMVA ;REMOVE THE FIRST ENTRY ;GM112CD BIT #UU.ABO,U.UTIL(R5) ;DID THIS UNIT FAIL TO BECOME READY? ;**-1- BEQ 120$ ;IF EQ, NO, GO RE-ISSUE THE I/OE' ;OTHERWISE COMPLETE IT AS IE.DNRT$ MOV R1,R3 ;R3 IS THE I/O PACKET7 MOV #IE.DNR&377,R0 ;R0 IS IE.DNR (DEVICE NOT READY)S$ CLR R1 ;R1 IS A ZERO BYTE COUNT" CALL ENDCM1 ;COMPLETE THE I/O( BR 90$ ;GO TRY TO START ANOTHER I/O4120$: MOV S.QST(R4),R2 ;RESTORE THE QST ;PKW1061 JMP CMDRED ;RESTART ENTRY IN CMDSIO ;PKW106E; ;**-1.; WE ARE NOT DONE UNTIL I/O'S HAVE COMPLETED;F130$:C- TST C.OLHD(R3) ;STILL WORKING ON COMMANDS?R BNE 150$ ;YES, JUST EXIT ;ELSE WE ARE DONEN* CLRB S.CTM(R4) ;STOP TIMER JUST IN CASE%  MOV S.BSYU(R4),R1 ;GET UCB ADDRESSI  BEQ 140$ ;IF NONE SKIP)  BICB #US.BSY,U.STS(R1) ;CLEAR BUSY BIT;)  CLR S.BSYU(R4) ;CLEAR BUSY UNIT IN SCBA 140$:R8 CLR C.REDO(R3) ;FORGET ABOUT OLDEST COMMAND IF IT WAS ;THE ONLY COMMANDS' CALLR CLACMD 00t```t`TADATADATADATADATADATA ;START ANY PENDING I/O +150$: BIS #C1.REC,(R3) ;STILL RECOVERINGE RETURN ;RETURN TO CALLERT .PAGE3 .SBTTL RQRCT - REQUEST REPLACEMENT CONTROL TASKJ;+8; **- RQRCT - REQUEST REPLACEMENT CONTROL TASK ROUTINE;T>; THE REQUEST THE REPLACEMENT CONTROL TASK ROUTINE IS CALLEDA; TO INITIALIZE THE SPECIFIED UNIT OR TO REPLACE A BAD BLOCK ONB; THE SPECIFIED UNIT.I;A ; INPUTS:;C?; R1 = ADDRESS OF CURRENT RESPONSE RING PACKET IF REPLACEMENT '; OR ELSE ZERO IF INITIALIZATIOND ; R2 = ADDRESS OF THE QST,!; R3 = ADDRESS OF THE IOPR"; R4 = ADDRESS OF THE SCB#; R5 = ADDRESS OF THE UCB.$;R %; OUTPUTS:&;T8'; THE REPLACEMENT CONTROL TASK IS REQUESTED TO REPLACE((; THE BAD BLOCK ON THE SPECIFIED UNIT.);N*;-+,-RQRCT: ;REF LABEL!. PUSH ;SAVE R0-R3 :. MOV U.UC2X(R5),@KISR6 ;MAP SECOND UCB EXTENSION ;GM11264 MOV X.UNFL+140000,R1 ;RETRIEVE UNIT FLAGS ;**-5+5 MOV X.RCTS+140000,R0 ;RETRIEVE RCT SIZEE75 MOV S.PBIA(R4),@KISR6 ;RESTORE PORT MAPPING ;GM112-8 TST R0 ;DOES IT EVEN HAVE AN RCT? ;**-2 9 BEQ 20$ ;NOPE, JUST EXIT>: BIT #UF.RPL,R1 ;CONTROLLER INITIATED BAD BLOCK REPLACEMENT? D BNE 20$ ;IF NE YES ;**-9+D TST @RCTPT ;IS RCT INSTALLED? ;GM112 F BNE 40$ ;IF NE YES ;**-1=G MOV #T.NRCT,R0 ;SET MESSAGE "REPLACEMENT CONTROLL TASK ...;H ;... NOT INSTALLED"G+H10$: CALL @DVMSG ;GO PRINT IT ;GM112 5H20$: TST R1 ;WAS THIS ON INITIALIZATION? ;PKW109S6H BEQ 30$ ;YES, DON'T CHANGE THE ERROR CODE ;PKW109CH MOV #IE.BBE&377,6(SP) ;SET BAD BLOCK ERROR IN STORED R0 ;PKW109N;K30$: SEC ;SET CARRY TO INDICATE NO NEED TO REQUES ;**-2LL BR 90$ ;EXITM40$: ;REF LABEL8M CMP @RCTPT,I.TCB(R3) ;IS THE I/O FROM RCT? ;GM112%O BNE 50$ ;NO, REQUEST RCT ;**-1V"P CLR R0 ;GET A WORKING REGISTER#Q MOV 4(SP),R1 ;GET THE END PACKETI$R BISB P.FLGS(R1),R0 ;GET THE FLAGS+S SWAB R0 ;PUT THE FLAGS IN THE HIGH BYTEO=T BIS R0,6(SP) ;SET THE FLAG BITS IN THE I/O STATUS ON STACKEU BR 30$ ;EXITV/W50$: MOV #12.,R1 ;SET LENGTH OF BLOCK NEEDEDS+W CALL @ALOCB ;GET A CORE BLOCK ;GM112O$Y BCC 60$ ;IF CC GOT ONE ;**-1Z MOV #T.NUER,R0 ;SET MESSAGE[ BR 10$ ;GO ON,/\60$: MOV R0,R3 ;SET ADDRESS OF MESSAGE BLOCKE,] TST (R0)+ ;POINT TO SECOND WORD IN BLOCK6^ MOV 4(SP),R1 ;DO WE HAVE AN INITIALIZATION REQUEST?_ BEQ 70$ ;IF EQ YESE` MOV P.CRF+2(R1),(R0)+ ;NO, INSERT I/O PACKET ADDRESS (REPLACEMENTSa ;REQUIRED INDICATOR)#b MOV R5,(R0)+ ;INSERT UCB ADDRESS08c MOV P.FBBK+2(R1),(R0)+ ;INSERT HI LBN TO BE REPLACED6d MOV P.FBBK(R1),(R0)+ ;INSERT LO LBN TO BE REPLACEDe BR 80$ ;AND CONTINUE2f70$: CLR (R0)+ ;INSERT INITIALIZATION INDICATOR#g MOV R5,(R0)+ ;INSERT UCB ADDRESSS"h CLR (R0)+ ;CLR LO LBN POSITION"i CLR (R0)+ ;CLR HI LBN POSITION0j80$: MOV R3,R1 ;COPY ADDRESS OF MESSAGE BLOCK4j MOV @RCTPT,R0 ;PICK UP RCT'S TCB ADDRESS ;GM112-j CALL @EXRQF ;REQUEST RCT TO RUN ;GM112 4m CLC ;CLR CARRY TO INDICATE RCT REQUESTED ;**-21n90$: POP ;RESTORE R3,R2,R1 AND R0Bo RETURN ;EXITPpq .ENDC ;D$$DSKT .PAGE ;**-46= .SBTTL SCUCB - GET ADDR OF NEXT UCB ON CONTROLLERN;+N; ** - SCUCB - SCAN UCB'S ASSOCIATED WITH SPECIFIED CONTROLLER (SCB ADDRESS);R;+ ; INPUTS: ;I; R5 = UCB ADDRESS;S ; OUTPUTS:;;V; R1=DESTROYED; R4 = SCB ADDRESS; R5 = UCB ADDRESS; CARRY CLEAR=UCB FOUNDR ; CARRY SET=NO MORE UCBS;-SCUCB:- POP ;RETRIEVE RETURN ADDRESS ;**-2  PUSH ;SAVE R5 AND R3' MOV U.SCB(R5),R3 ;GET ADDRESS OF SCBL' MOV S.KRB(R3),R3 ;GET ADDRESS OF KRBL, ADD K.OFF(R3),R3 ;OFFSET TO THE UCB 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? BEQ 10$ ;IF EQ NO5 MOV U.SCB(R5),R4 ;GET ADDRESS OF SCB FOR THIS UNIT% PUSH ;SAVE UCB TABLE PO00t`u`_c_d_kINTER % MOV 2(SP),R3 ;RETRIEVE CALLER'S R3:( CLC ;CLR CARRY TO SHOW WE FOUND ONE# CALL (R1) ;CALL THE CALLER BACK A POP ;GET RETURN ADDRESS AND POINTER TO NEXT UCB ENTRYG BR 10$ ;TRY THE NEXT UCB20$: ;REF LABEL+ POP ;RESTORE ORIGINAL R3 AND R5E5 MOV U.SCB(R5),R4 ;GET ADDRESS OF SCB FOR THIS UNIT3# SEC ;SET CARRY TO SHOW THE ENDE JMP (R1) ;EXITJ .PAGE ;**-1261K .SBTTL TMOGCS - PROCESS END PACKET FROM OP.GCS L;+=M;**-TMOGCS-RESPOND TO RECEIPT OF END PKT FOR OP.GCS COMMAND:N;CQ; INPUTS: ;**-2FR;O$S; R1 ADDRESS OF END PKT T; R2 ADDRESS OF QST U; R3 ADDRESS OF CSTV; W; OUTPUTS:X;ELY; IF THE COMMAND IS MAKING PROGRESS OR HAS COMPLETED THEN DO NOTHING1Z; OTHERWISE INITIATE A RE-SYNCHRONIZATIONU[;- \TMOGCS:E/] BIC #C1.TMO,(R3) ;INDICATE OP.GCS COMPLETED.,^ MOV P.OTRF+2(R1),R0 ;GET THE IOP ADDRESS._ CMP R0,C.OLHD(R3) ;IS IT THE SAME COMMAND?0` BNE 30$ ;NO, THE COMMAND MUST HAVE FINISHED1a MOVB I.PRM+11(R0),R0 ;GET THE SEQUENCE NUMBER13b BIC #^C<17>,R0 ;CLEAR ALL BUT THE LOW FOUR BITSF7c CMP R0,P.OTRF(R1) ;BOTH REFERENCE NUMBERS THE SAME?:,d BNE 30$ ;NO, COMMAND MUST HAVE FINISHED$e TST P.CMST(R1) ;REF NUMBER ZERO?4f BNE 10$ ;NO, WE HAVE TO SEE IF IT MADE PROGRESS5g TST P.CMST+2(R1) ;HOW ABOUT THE OTHER REF NUMBER? 5h BEQ 30$ ;IT'S ZERO TOO, THE COMMAND HAS FINISHEDS;i10$: CMP P.CMST+2(R1),C.CMST+2(R3) ;DID IT MAKE PROGRESS? j BHI 20$ ;NO, TIME OUT ERRORk BLO 30$ ;YES, JUST RETURNAl CMP P.CMST(R1),C.CMST(R3) ;HIGH WORD WAS EQUAL, CHECK LOW WORDO0m BLO 30$ ;IF LOWER THEN IT DID MAKE PROGRESS.n20$: CALLV PORT,PKTDR ;DEALLOCATE END PACKET%o JMP TMOERR ;JMP TO TIME OUT ERROR .p30$: CALLV PORT,PKTDR ;DEALLOCATE END PACKET q RETURNRrs .ENDT P.CMST+2(R1) ;HOW ABOUT THE OTHER REF NUMBER? 5h BEQ 30$ ;IT'S ZERO TOO, THE COMMAND HAS FINISHEDS;i10$: CMP P.CMST+2(R1),C.CMST+2(R3) ;DID IT MAK .TITLE OLRSRT .IDENT /04.01/S;C; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.E; ALL RIGHTS RESERVED.;R<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; K. E. KINNEAR 27-JUN-78;;); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:<;C; P. J. BEZEREDI;G; MODIFIED BY:;.; J. M. LAWLER 01-JUN-82 04.01;O,; JL110 -- CONDITIONALIZE MODULE ON R$$CON &; ADD SUBROUTINE $VOLSC FOR PHASE 2"; SUPPORT OF AUTOMOUNT/DISMOUNT;S;; ); ONLINE RECONFIGURATION SERVICE ROUTINESE;P T;+3; **-$KRBSC-CALL DRIVER AT KRB STATUS CHANGE ENTRY.R;SB; THIS ROUTINE WILL CALL THE DRIVER AT ITS KRB STATUS CHANGE ENTRYD; SPECIFIED IN THE DDT. IF THE DRIVER IS A COMMON INTERRUPT DRIVER,C; THEN IT WILL BE CALLED AT THE CI.KRB ENTRY. ENTRY CONDITIONS AREG9; DETAILED IN THE ROUTINE BODY. IF THE ENTRY ADDRESS = 0 9; THEN THE DRIVER OR COMMON INTERRUPT ROUTINE WILL NOT BET ; CALLED.F;P ; INPUTS: ;P3; $SCDEV=KRB ADDRESS OF CONTROLLER CHANGING STATUS.N"; $SCOFL=BYTE FLAG ONLINE/OFFLINE:;+'; -1 --> ONLINE TO OFFLINE TRANSITION.H'; 0 --> OFFLINE TO ONLINE TRANSITION.L;; 100 --> OFFLINE TO ONLINE TRANSITION SPECIAL CASE.E;T3; $SCCTB=CTB ADDRESS OF CONTROLLER CHANGING STATUS.N; ; OUTPUTS:;A=; DRIVER HAS BEEN CALLED AT ENTRY. WHEN $SCDEV GOES TO ZERO,OB; THEN $SCERR (BYTE VALUE) CONTAINS STATUS (I.E. WHETHER OPERATION?; WAS ACCEPTED OR REJECTED). NEGATIVE VALUES SIGNAL REJECTION, $; ONE SIGNALS SUCCESSFUL COMPLETION.; B; $SCDEV MAY TAKE SOME TIME TO GO TO ZERO. ALLOW AT LEAST 60 SECS.;F; NO REGISTERS ARE PRESERVED.F;N"; APR5/APR6 MAPPING IS PRESERVED.;-<; NOTE: $KRBSC AND $UCBSC MUST NOT BE USED TOGETHER, AS THEY%; USE COMMON PARAMETER PASSING AREAS.S;- ( .IF DF R$$CON ;RECONFIGURATION SUPPORT .ENABL LSBC&$KRBSC::MOV $SCCTB,R3 ;GET CTB ADDRESS$ MOVB #1,$SCERR ;SHOW SUCCESS STATUS' MOV KINAR5,-(SP) ;SAVE I-SPACE MAPPINGE I V .IF DF K$$DAS00u```t`TADATADATADATADATADATA I' MOV KDSAR5,-(SP) ;SAVE D-SPACE MAPPING.  .ENDC M T8 MOV #REMAP,-(SP) ;SET ADDRESS TO RESTORE KISAR5, KDSAR5+ MOV L.DCB(R3),R4 ;GET DCB POINTER FROM CTBP8 BITB #LS.CIN,L.STS(R3) ;IS THIS A COMMON INTERRUPT CTB? BNE 10$ ;IF NE YES A;H:; DRIVER IS NOT COMMON INTERRUPT DRIVER -- HAS UCB AND MAY; OR MAY NOT BE LOADED DRIVER.; .1 MOV D.UCB(R4),R5 ;GET ANY UCB FOR DRIVER MAPPING, MOV D.DSP(R4),R4 ;GET DRIVER DISPATCH TABLE BNE 5$ ;IF NE DRIVER IS LOADED ;D; DRIVER IS NOT LOADED -- RETURN IE.HWR (HANDLER NOT RESIDENT) ERROR; $ MOVB #IE.HWR,$SCERR ;SET ERROR CODE T25$: MOV U.SCB(R5),R2 ;GET SCB ADDRESS (OF ANY SCB)) MOV S.KS5(R2),KINAR5 ;MAP DRIVER I SPACEH A M .IF DF K$$DAS ) MOV S.KS5(R2),KDSAR5 ;MAP DRIVER D SPACEO O .ENDC U D BR 15$ ;REENTER FLOW910$: ADD #CI.KRB-D.VKRB,R4 ;MAKE R4 LOOK LIKE DDT POINTER 15$: ;REFERENCE LABEL N  .IF DF M$$PRO G MOV $SCDEV,R2 ;GET KRB ADDRESS & MOV K.URM(R2),R2 ;GET UNIBUS RUN MASK MOV #20$,R3 ;SET UP FOR $EXROP CALLR $EXROPS N .IFTF ;&; AT THIS POINT, WE ARE ON CORRECT CPU; 20$: ;REFERENCE LABEL R .IFT  % MOV $SCCTB,R3 ;GET CTB ADDRESS AGAIN  P .ENDC M . MOV $SCDEV,R2 ;GET KRB ADDRESSK) ASRB $SCOFL ;CHECK IF ONLINE OR OFFLINE4 BCS 30$ ;IF CS OFFLINE TRANSITION (DONT CHECK CSR)" MOV #30$,-(SP) ;SET UP FOR $SGFIN" CALL $SGFIN ;WE EXPECT NXM TRAPS ;P>; SEE IF DRIVER IS COMMON INTERRUPT DRIVER. IF IT IS, THEN IF>; ITS CI.CSR ENTRY IS NON-ZERO, CALL IT THERE TO TEST THE CSR.@; OTHERWISE, TEST THE CSR JUST LIKE WE DO FOR ALL OTHER DEVICES.;  00 BITB #LS.CIN,L.STS(R3) ;IS IT COMMON INT DRIVER" BEQ 23$ ;IF EQ NO -- NORMAL TEST/ TST D.VKRB+(R4) ;IS CI.CSR ZEROA# BEQ 23$ ;IF EQ YES -- NORMAL TESTN ;S5; CALL COMMON INTERRUPT DRIVER AT CI.CSR ENTRY POINT.#;,; ENTRY CONDITIONS:F;; R2=KRB ADDRESS.X; R3=CTB ADDRESS.;7; $SGFIN HAS BEEN CALLED, THEREFORE DRIVER IS PROTECTEDE5; FROM NXM TRAPS. ON TST INSTRUCTIONS, IF C BIT CLR,T6; THEN LOCATION WAS THERE. IF C BIT SET, THEN LOCATION; CAUSED A NXM TRAP.; 3; NO REGISTERS ARE AVAILABLE FOR USE -- DRIVER MUSTR&; SAVE AND RESTORE ANY REGISTERS USED.;D; EXIT CONDTIONS:B;4; NO REGISTERS CAN BE CHANGED.;Q; IF DEVICE PRESENT, C BIT CLR.A#; IF DEVICE NOT PRESENT, C BIT SET.E;Y I. CALL @D.VKRB+(R4) ;CALL DRIVER BR 24$ ;REENTER CODE FLOW#23$: TSTB @(R2) ;IS THE CSR THERE? 24$: BCC 25$ ;IF CC YES. MOVB #IE.OFL,$SCERR ;SHOW NO CSR ERROR STATUS25$: RETURN ;EXIT $SGFIN230$: TSTB $SCERR ;HAVE WE ALREADY FOUND AN ERROR?4 BMI 50$ ;IF MI YES -- SKIP CALL TO DRIVER AND EXIT, ASRB $SCOFL ;GET OFFLINE BIT INTO SIGN BIT ;X@; CALL DRIVER AT KRB STATUS CHANGE ENTRY. ENTRY CONDITIONS ARE:;R; INPUTS TO DRIVER: ;D); R2=KRB ADDRESS FOR KRB CHANGING STATUS.L#; R3=CTB ADDRESS FOR THE ABOVE KRB.R); 0(SP)=RETURN ADDRESS FOR COMPLETION.T.; 2(SP)=RETURN ADDRESS TO CALLER OF $KRBSC.'; CARRY BIT CONTAINS STATUS TRANSITION: ;O(; C=1 --> ONLINE TO OFFLINE TRANSITION.(; C=0 --> OFFLINE TO ONLINE TRANSITION.;? ; $SCERR=1.I=; $SCOFL=POSITIVE/NON-ZERO IF SPECIAL OFFLINE TO ONLINE CASE.F;E#; RETURNED INFORMATION FROM DRIVER:I; +; DRIVER MUST EVENTUALLY RETURN CONTROL TO: ;:6; 0(SP) THEN THE RETURN STATUS IS CONTAINED IN $SCERR:;A,; $SCERR < 0 --> OPERATION NOT SUCCESSFUL.(; $SCERR = 1 --> OPERATION SUCCESSFUL./; $SCERR = 0 --> SPECIAL CASE OPERATION STILL$; IN PROGRESS.;T+; IF $SCERR < 0, THEN VALUE IS ERROR CODE.N;O;; DRIVER MUST RETURN WITHIN 60 SECS. (USE THE S.CTM TIMEOUT.; FEATURE IF NECESSARY.);P,; ALL REGISTERS ARE AVAILABLE TO THE DRIVER.;E ;A; AT THIS TIME, THE CARRY BIT CONTAINS INFORMATION FOR THE DRIVERR;R O<40$: MOV D.VKRB(R4),R0 ;TEST FOR ZERO WITHOUT CHANGING C-BIT! BEQ 50$ ;IF EQ DONT CALL DRIVERE CALL @D.VKRB(R4) ;CALL DRIVER#50$: MOV $SCDEV,R2 ;GET KRB ADDRESS # MOVB $SCOFL,R0 ;GET DESIRED STATUS  MOVB $SCERR,R1 ;GET ERROR TYPE S00u``_c_d_kXT R1 ;MAKE R1 ALL 1'S OR 0'S- XOR R1,R0 ;FLIP BITS IN R0 IF R1 SHOW ERRORC+ BIC #^C,R0 ;R0 CONTAINS KS.OFL BITS= BIC #KS.OFL,K.STS(R2) ;MAKE SURE OFFLINE BIT IS PROPER STATE4 BIS R0,K.STS(R2) ;SET OFFLINE BIT TO DESIRED STATUS F;+8; **-$OLRNT-ONLINE RECONFIGURATION NOTIFICATION ROUTINE.;H=; THIS ROUTINE WILL CLEAR $SCDEV AND SET EVENT FLAG 1 FOR THED; TASK POINTED TO BY $HRCPT.;$ ; INPUTS:E;R; NONE. ;M ; OUTPUTS:;G; NONE.D;A; NO REGISTERS ARE PRESERVED.R;- ,$OLRNT::CLR $SCDEV ;SHOW OPERATION COMPLETE" MOV #1,R0 ;SET EVENT FLAG TO SET& MOV $HRCPT,R5 ;GET HRC... TCB ADDRESS BEQ 60$ ;IF EQ NOT INSTALLED( BIT #TS.EXE,T.STAT(R5) ;IS TASK ACTIVE?' BNE 60$ ;IF NE NO -- DON'T CALL $SETF 7 BIT #T2.SEF,T.ST2(R5) ;IS TASK STOPPED FOR EVENT FLAG?C( BNE 60$ ;IF NE YES -- DON'T CALL $SETF MOV R5,R1 ;CREATE ADDRESS WORD) ADD #T.EFLG,R1 ;POINT TO FIRST TASK WORD ' CALLR $SETM ;SET HRC'S EVENT FLAG ONEG 60$: RETURNA ;+9; **-$UCBSC-CALL DRIVER AT UCB STATUS CHANGE ENTRY POINT. ; @; THIS ROUTINE WILL CALL A DRIVER AT ITS UCB STATUS CHANGE ENTRY; POINT.;T ; INPUTS:;Q2; $SCDEV=UCB ADDRESS OF UNIT WITH CHANGING STATUS.-; $SCOFL=BYTE VALUE OF DESIRED STATUS CHANGE:C; '; -1 --> ONLINE TO OFFLINE TRANSITION.T(; 0 --> OFFLINE TO ONLINE TRANSITION.;; 100 --> OFFLINE TO ONLINE TRANSITION SPECIAL CASE.D;. ; OUTPUTS:;T>; DRIVER HAS BEEN CALLED AT D.VUCB ENTRY. WHEN $SCDEV GOES TO<; ZERO THEN $SCERR (BYTE VALUE) CONTAINS RETURN STATUS (I.E.?; WHETHER OPERATION WAS ACCEPTED OR REJECTED). NEGATIVE VALUESB7; SIGNIFY REJECTION, ONE SIGNALS SUCCESSFUL COMPLETION.D4; IF THE ENTRY POINT IN THE DRIVER EQUALS ZERO, THEN; THE DRIVER IS NOT CALLED. ;N); $SCDEV MAY TAKE UP TO 60 SECS TO CLEAR.I;N; NO REGISTERS ARE PRESERVED.E;A!; APR5/APR6 MAPPING IS PRESERVED.T;N<; NOTE: $UCBSC SHOULD NOT BE USED WHILE $KRBSC IS IN USE DUE#; TO COMMON USE OF PARAMETER AREAS. ;- G&$UCBSC::MOV $SCDEV,R5 ;GET UCB ADDRESS T S .IF DF M$$PRO ." MOV U.SCB(R5),R4 ;GET SCB ADDRESS* MOV S.KRB(R4),R3 ;GET KRB ADDRESS, IF ANY BEQ 65$ ;IF EQ NO KRB ADDRESSO) MOV K.URM(R3),S.URM(R4) ;SET URM FOR SCBV65$: ;REFERENCE LABEL R .ENDC  L' MOV KINAR5,-(SP) ;SAVE I-SPACE MAPPING  C R .IF DF K$$DAS E' MOV KDSAR5,-(SP) ;SAVE D-SPACE MAPPINGN S .ENDC T N8 MOV #REMAP,-(SP) ;SET ADDRESS TO RESTORE KISAR5, KDSAR5 E  .IF DF M$$PRO R0 CALL $IFORK ;CONTINUE EXECUTION ON CORRECT CPU B D .ENDC S .;D/; WE ARE NOW EXECUTING ON THE CORRECT PROCESSOR;V K"70$: MOV (R5),R3 ;GET DCB ADDRESS" MOV U.SCB(R5),R4 ;GET SCB ADDRESS" MOV D.DSP(R3),R2 ;GET DDT ADDRESS! BNE 80$ ;IF NE DRIVER IS LOADED N;; DRIVER IS NOT LOADED;S $ MOVB #IE.HWR,$SCERR ;SET ERROR CODE BR 90$ ;EXIT WITH COMMON CODE-(80$: MOVB #1,$SCERR ;SHOW SUCCESS STATUS" MOV S.KRB(R4),R3 ;GET KRB ADDRESS BEQ 85$ ;IF EQ NO KRB.( MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX85$: ;REFERENCE LABEL   .IF NDF M$$PROD , MOV S.KS5(R4),KINAR5 ;SET UP KERNEL MAPPING V K .IF DF K$$DAS 7 MOV S.KS5(R4),KDSAR5 ;SET UP KERNEL DATA SPACE MAPPINGV D .ENDC G D .ENDC  E3 TST D.VUCB(R2) ;DOES THE DRIVER WANT TO BE CALLED?O BEQ 90$ ;IF EQ NOV4 ASRB $SCOFL ;SET CARRY BIT FOR DRIVER IF NECESSARY M;C); CALL DRIVER AT UCB STATUS CHANGE ENTRY.T;; INPUTS TO DRIVER:T;B5; R3=CONTROLLER INDEX. IF S.KRB=0 THEN R3 UNDEFINED.;); R4=ADDRESS OF THE STATUS CONTROL BLOCK.B'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.K); 0(SP)=RETURN ADDRESS FOR COMPLETION.K.; 2(SP)=RETURN ADDRESS TO CALLER OF $UCBSC.'; CARRY BIT CONTAINS STATUS TRANSITION:C;G(; C=1 --> ONLINE TO OFFLINE TRANSITION.(; C=0 --> OFFLINE TO ONLINE TRANSITION.;I ; $SCERR=1.R=; $SCOFL=POSITIVE/NON-ZERO IF SPECIAL OFFLINE TO ONLINE CASE.L;I#; RETURNED INFORMATION FROM DRIVER:;N/; THE DRIVER MUST EVENTUALLY RETURN CONTROL TO:S;B,; 0(SP) AND THEN RETURN STATUS IS IN $SCERR:;S+; $SCERR < 0 --> OPERATION NOT SUCCESSFUL.N00u```t`TADATADATADATADATADATA'; $SCERR = 1 --> OPERATION SUCCESSFUL.O/; $SCERR = 0 --> SPECIAL CASE OPERATION STILLE; IN PROGRESS.;I*; IF $SCERR < 0, THEN VALUE IS ERROR CODE.;O@; DRIVER MUST RETURN CONTROL WITHIN 60 SECS. (USE S.CTM TIMEOUT; IF NECESSARY.);R,; ALL REGISTERS ARE AVAILABLE TO THE DRIVER.;O L CALL @D.VUCB(R2) ;CALL DRIVER(90$: MOV $SCDEV,R5 ;GET UCB ADDRESS BACK. MOVB $SCOFL,R0 ;GET DESIRED STATUS OF OFL BIT MOVB $SCERR,R1 ;GET ERROR VALUE. SXT R1 ;MAKE R1 ALL 1'S OR 0'S FROM SIGN BIT. XOR R1,R0 ;FLIP BITS IN R0 IF R1 SHOWS ERROR8 BIC #^C,R0 ;R0 CONTAINS DESIRED STATE OF US.OFL; BICB #US.OFL,U.ST2(R5) ;CLEAR OUT OFFLINE BIT JUST IN CASE3 BISB R0,U.ST2(R5) ;SET ACTUAL BIT VALUE INTO U.ST2C" BR $OLRNT ;EXIT THRU COMMON CODE .DSABL LSB  ;I=; REMAP -- RESET KINAR5/(KDSAR5) WITH SAVED VALUE AND RETURN.0;M $REMAP: ;REFERENCE LABEL  V .IF DF K$$DAS S. MOV (SP)+,KDSAR5 ;RESTORE DATA SPACE REGISTER V .ENDC R ;/ MOV (SP)+,KINAR5 ;RESTORE ALTERNATIVE REGISTER  RETURNS ;+&; **-$CPUSC-CPU STATUS CHANGE ROUTINE.;O>; THIS ROUTINE WILL PERFORM THE EXECUTIVE ACTIONS NECESSARY TO.; BRING A CPU ONLINE OR TO TAKE A CPU OFFLINE.;E ; INPUTS:T;LC; $SCDEV=MASK WITH BIT SET FOR CPU WHOSE STATUS SHOULD CHANGE. ONLY; ONE BIT SHOULD BE SET./-; $SCOFL=BYTE VALUE OF DESIRED STATUS CHANGE:;A'; -1 --> ONLINE TO OFFLINE TRANSITION.$'; 0 --> OFFLINE TO ONLINE TRANSITION. ;C ; OUTPUTS:; ; CPU ONLINE:;V4; THE CPU HAS BEEN "BOOTED" THRU THE IIST, AND THEN0; INTERRUPTED INTO THE $PENT PROCESSOR ENTRY. 7; AT THIS POINT THIS ROUTINE WILL RETURN TO THE CALLERE; WITH:;RF; R2=MASK OF PROCESSORS WHO DIDN'T RESET THE INTERRUPT MASKS (IF ANY).;S:; WHEN THE PROCESSOR COMMING ONLINE CALLS $CPNIT (AT THE 5; VERY END OF THE $PENT PROCESS) IT WILL ATTEMPT TO D9; INTERRUPT THE CURRENTLY ONLINE CPUS TO SEE IF THEY CANN8; RECEIVE FROM IT. IT WILL LEAVE THE MASK OF THOSE WHO5; CAN'T HEAR IT IN $SCRET, AND THEN ENTER $OLRNT TO "(; NOTIRY HRC... THAT THE CPU IS ONLINE.; ; CPU OFFLINE:; 9; THE CALLER WILL BE RETURNED TO AFTER THE NECESSARY CPUC8; HAS BEEN INTERRUPTED WITH THE OFFLINE FUNCTION. WHEN9; LOCAL EVENT FLAG ONE IS SET, THE PROCESSOR HAS HALTED.O;O; NO REGISTERS ARE PRESERVED.H;!; APR5/APR6 MAPPING IS PRESERVED.T;LD; THIS ROUTINE SHARES COMMON DATA AND PARAMETER AREAS WITH THE OTHERD; $XXXSC ROUTINES IN THIS MODULE. THEY SHOULD ONLY BE USED ONE AT A; TIME.T;- R  .IF DF M$$PRO N($CPUSC::TSTB $SCOFL ;ONLINE OR OFFLINE? BMI 30$ ;IF MI GOING OFFLINE T;C; BRING CPU ONLINE;T F% CLRB $SCERR ;NO IMMEDIATE ERROR YETE% MOV #C.LGTH,R1 ;ALLOCATE CLOCK BLOCKN( CALL $ALOCB ;OF CORRECT SIZE FROM POOL/ BCC 10$ ;IF CC BLOCK ALLOCATED OK, ADDR IN R0V4 MOVB #IE.NOD,$SCERR ;BAD NEWS -- NO POOL SPACE LEFT RETURN ;EXIT BACK TO OLRSRN310$: MOV R0,-(SP) ;SAVE CLOCK QUEUE BLOCK FOR LATERN) BIS $SCDEV,$IIMSK ;SET INTERRUPT MASK UP / CALL $IISTM ;MAKE EVERYONE SET UP THEIR MASKSC0 MOV R2,-(SP) ;SAVE PEOPLE WHO DIDN'T DO THE JOB/ MOV $SCDEV,R1 ;GET THE CPU COMING ONLINE AGAIN' CALL $IBXMT ;SEND HIM A BOOT MESSAGE!  CLR $SCRET ;CLEAR OUT STATUS) MOV 2(SP),R0 ;GET CLOCK QUEUE BLOCK BACKE3 MOV (SP)+,(SP) ;SLIDE STATUS RETURN DOWN ONE FRAME + MOV #20$,C.SUB(R0) ;SET SUBROUTINE ADDRESSP# MOV $TKPS,R2 ;GET TICKS PER SECONDT) CLR R1 ;CLEAR OUT HIGH ORDER DELTA TIMEU ASL R2O ASL R2 ;WAIT FOR 4 SECONDS! MOV #C.SYST,R4 ;SET REQUEST TYPEM& MOV $TKTCB,R5 ;SET REQUEST IDENTIFIER$ CALL $CLINS ;INSERT IN CLOCK QUEUE MOV (SP)+,R2 ;GET STATUS BACK RETURNI O;N); SUBROUTINE FOR INTERPROCESSOR INTERRUPTS;E (20$: MOV R4,R0 ;GET CLOCK BLOCK ADDRESS MOV #C.LGTH,R1 ;SET LENGTHC% CALL $DEACB ;DEALLOCATE CLOCK BLOCKN MOV $SCDEV,R1 ;GET PROCESSOR(S) CALLR $IIXMT ;INTERRUPT THEM $;S; BRING CPU OFFLINEC;T C&30$: MOV #MP.STP,R2 ;SET STOP FUNCTION% MOV $SCDEV,R1 ;GET CPU'S TO DO IT TOS% CLR $SCRET ;CLEAR OUT STATUS RETURNM& CLRB $SCERR ;CLEAR OUT STATUS RE00u`v`_c_d_kTURN! CALLR $IIFNX ;TRANSMIT FUNCTION V;+; **-$CPOFF-TAKE CPU OFFLINE.I;OD; THIS ROUTINE WILL TAKE A CPU OFFLINE. IT WILL RESET THE INTERRUPTC; MASKS OF ALL OTHER ONLINE PROCESSORS TO NOT ALLOW INTERRUPTS FROMAD; THIS ONE, WILL RESET THE IIST ON THIS CPU TO ALLOW INTERRUPTS FROMD; ANYONE, WILL DECLARE A SIGNIFICANT EVENT, AND CLEAR OUT THE ONLINE%; BIT FROM $URMST FOR THIS PROCESSOR.$;E ; INPUTS:P; ; NONE.T; ; OUTPUTS:;L; NONE.T;S; NO REGISTERS ARE PRESERVED.O;- UB$CPOFF::BIC $CPBIT,$IIMSK ;PREPARE TO RESET THE INTERRUPT MASKS OF% CALL $IISTM ;ALL OTHER ONLINE CPUS.L: CALL $IIOPN ;INITIALIZE OUR IIST, TO ALLOW INT AND BOOTS1 CLRB $CXDBL ;IN CASE CONTEXT SWITCHING DISABLEDP. BIC $CPBIT,$URMST ;SHOW US NOT ONLINE ANYMORE2 CALLR $DRDSE ;DECLARE SIGNIFICANT EVENT AND EXIT A .ENDC T .IFF ; DF R$$CON $KRBSC::$OLRNT::$UCBSC::$CPOFF:: RETURNE .ENDC ; DF R$$CON!; **-$VOLSC-VOLUME STATUS CHANGE S; <; THIS SUBROUTINE IS CALLED BY A DRIVER WHEN HARDWARE VOLUME;; VALID STATUS CHANGES. MINIMALLY, $VOLSC RE-SETS SOFTWAREL8; VOLUME VALID. IF THE VOLUME MOUNTED FOREIGN THEN THIS9; IS THE ONLY ACTION TAKEN ON THE UNIT. IF THE VOLUME ISC9; MOUNTED FILE-STRUCTURED OR NOT MOUNTED THE VERIFICATIONO9; TASK WILL BE REQUESTED TO EITHER MOUNT OR RE-MOUNT THE 5; VOLUME. ADDITIONALLY, I/O WILL BE STALLED TO UNITS0; MOUNTED WITH A FILE-STRUCTURE UNTIL THE VOLUME; STATUS CAN BE VERIFIED.A; ; INPUTS: ; (; R5=UCB ADDRESS OF UNIT WITH TRANSITION;R ; OUTPUTS:; ; NONE.T;C; R4,R5 PRESERVED ;L;- .ENABL LSBL $VOLSC:: ;# .IF DF R$$AMD ;AUTOMOUNT/DISMOUNT  SAVNR T5 BICB #US.VV,U.STS(R5) ;RE-SET SOFTWARE VOLUME VALID 1 BITB #US.FOR,U.STS(R5) ;VOLUME MOUNTED FOREIGN ?T* BNE 20$ ;IF NE, YES - NOTHING MORE TO DO) BITB #US.MNT,U.STS(R5) ;VOLUME MOUNTED ?L BNE 10$ ;IF NE, NO6 BISB #US.SIO,U.ST2(R5) ;STALL I/O FOR MOUNTED VOLUMES;10$: BISB #US.TRN,U.ST2(R5) ;SET FLAG FOR VERIFICATION TASKB0 MOV $VERTK,R0 ;TCB ADDRESS OF VERIFICATION TASK" CALLR $EXRQN ;UNSTOP/REQUEST VER .IFTF ; DF R$$AMD20$: RETURN ; .DSABL LSB  .ENDC ; DF R$$AMD S .END BICB #US.VV,U.STS(R5) ;RE-SET SOFTWARE VOLUME VALID 1 BITB #US.FOR,U.STS(R5) ;VOLUME MOUNTED FOREIGN ?T* BNE 20$ ;IF NE, YES - NOTHING MORE TO DO) BITB #US.MNT,U.STS(R5) ;VOLUME MOUNTED ?L BNE 10$ ;IF NE, NO6 BISB #US.SIO,U.ST2(R5) ;STALL I/O FOR MOUNTED VOLUMES;10$: BISB #US.TRN,U.ST2(R5) ;SET FLAG FOR VERIFICATION TASKB0 MOV $VERTK,R0 ;TCB ADDR .TITLE NVRUPT .IDENT /01.01/$; ; COPYRIGHT (C) 1982; ALL RIGHTS RESERVED/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.$;D?; THIS SOFTWARE IS FURNISHED UNDER LICENSE AND MAY ONLY BE USED 6; OR COPIED ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;2; VERSION 01.01 ;H; M. C. OZUR 16-APR-82;N; MODIFIED BY:; ;N; T. LEKAS 3-JUNE-82 01.01;B/; TL191 -- CHANGE REFERENCES TO $CTFEA AND CF.M-; TO THE SECOND HARDWARE FEATURE MASK WORDE;I; MACRO LIBRARY CALLST;0 .MCALL HWDDF$% HWDDF$ ; DEFINE HARDWARE REGISTERSY .ENABL LC; *; INCREMENT THE KEYSTROKE COUNT IN THE NVR;R+$KEYUP::BIT #H2.NVR,$HFMSK+2 ;NVR PRESENT?S BEQ 10$ ;IF EQ NON SEC ;SET CARRY FOR INCREMENTP' ADCB @#N.KEY ;ADD CARRY TO FIRST BYTEE) ADCB @#N.KEY+2 ;CASCADE CARRY THROUGH...R" ADCB @#N.KEY+4 ; THE NEXT 3 BYTES ADCB @#N.KEY+6 ;N10$: RETURN ;DONE1; 2; INCREMENT THE RX50'S READ/WRITE COUNT IN THE NVR;D+$DZAUP::BIT #H2.NVR,$HFMSK+2 ;NVR PRESENT?R BEQ 10$ ;IF EQ NOC SEC ;SET CARRY FOR INCREMENTR' ADCB @#N.DZA ;ADD CARRY TO FIRST BYTER) ADCB @#N.DZA+2 ;CASCADE CARRY THROUGH...K" ADCB @#N.DZA+4 ; THE NEXT 3 BYTES ADCB @#N.DZA+6 ;I10$: RETURN ;DONE ; 2; INCREMENT THE RD50'S READ/WRITE COUNT IN THE NVR;E+$DWAUP::BIT #H2.NVR,$HFMSK+2 ;NVR PRESENT? BEQ 10$ ;IF EQ NO  SEC ;SET CARRY FOR INCREMENT' ADCB @#N.DWA ;ADD CARRY TO FIRST BYTEH) ADCB @#N.DWA+2 ;CASCADE CARRY THROUGH...D" ADCB @#N.DWA+4 ; THE NEXT 3 BYTES ADCB @#N.DWA+6 ;I10$: RET00v`w``t`TADATADATADATADATADATAURN ;DONE ; 0; INCREMENT THE MINUTES OF O/S UPTIME IN THE NVR;T+$UPTUP::BIT #H2.NVR,$HFMSK+2 ;NVR PRESENT?K BEQ 10$ ;IF EQ NOH SEC ;SET CARRY FOR INCREMENTI' ADCB @#N.UPT ;ADD CARRY TO FIRST BYTE ) ADCB @#N.UPT+2 ;CASCADE CARRY THROUGH..." ADCB @#N.UPT+4 ; THE NEXT 3 BYTES ADCB @#N.UPT+6 ; ! MOV $NVRCT,$NVRTM ;RESET COUNTERN10$: RETURN ;DONEW;+7; $SETCK - SETUP NONVOLATILE CLOCK (MC146818 CMOS Chip)R;H; Description:;+5; Copies the RSX date/time vector (from SYSCM) to the 8; NV clock chip. This is done when the date/time vector8; is modified via the SET TIME directive. Once the chip2; is update, RSX and the clock chip maintain time6; independently of each other. The clock chip will be7; read at boot time to reload the RSX date/time vector.T;-,$SETCK::MOV $CKCSR,R5 ;GET THE CT CLOCK CSR2: BIS #206,-2(R5) ;ENABLE "SET" MODE, BINARY DATA, 24 HOUR. ; UPDATES INHIBITED.-5$: BIT #200,-4(R5) ;IS AN UPDATE IN PROGRESSt( BNE 5$ ;IF NE, YES WAIT FOR COMPLETION- MOV #$TTNS,R4 ;GET POINTER TO SECONDS VECTORt MOV R5,R3 ;POINT TO SECONDS...! SUB #30,R3 ; IN THE CLOCK CHIP) MOV #3,R2 ;COPY SECONDS, MINUTES, HOURSi10$: MOV -(R4),(R3)+ ;MOVE IT  CLR (R3)+ ;CLEAR THE ALARMS SOB R2,10$ ;DONE?o CLR (R3)+ ;CLEAR DAY OF WEEK" MOV #3,R2 ;COPY DAY, MONTH, YEAR20$: MOV -(R4),(R3)+ ;MOVE IT2 SOB R2,20$ ;DONE?D5 BIC #200,-2(R5) ;DISABLE "SET" MODE. UPDATE STARTED.I RETURN ;DONE  .END IN PROGRESSt( BNE 5$ ;IF NE, YES WAIT FOR COMPLE .TITLE DDDRVH .IDENT /03.02/4;5D; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;S ;C ; M. B. GROSSMAN 10/15/78E ;  ; P. J. CARR ; J. GALLANT ; ! ; MODIFIED BY: 15-AUG-86 3.02 I ; 8 ; G. MARIGOWDA GM001 -- CONVERT TO USE EXEC VECTORING ; ;A; TU58 TAPE CARTRIDGE DRIVER;A; THIS DRIVER INTERFACES WITH THE TU58 VIA A DL11 AT 9600 BAUD. B; COMMANDS, DATA AND DEVICE STATUS ARE FORMATTED INTO STRUCTURED?; PACKETS OF BYTES IN ACCORDANCE WITH RADIAL SERIAL PROTOCOL.B;D; MACRO LIBRARY CALLSC;N0 .MCALL HWDDF$,PKTDF$,QIOSY$,SCBDF$ ;GM001 QIOSY$ ;GM001 SCBDF$ ,,SYSDEF ;GM001L. HWDDF$ ;DEFINE HARDWARE REGISTERS ;**-1&! PKTDF$ ;DEFINE I/O PACKET OFFSETS"; #; EQUATED SYMBOLS$;%RTRY= 2 ;RETRY COUNT1&DDNUM= 6 ;NUMBER OF REGISTERS TO LOG ON ERROR ';V'(; TU58 RADIAL SERIAL PROTOCOL SYMBOLSA);D*; INSTRUCTION SETR+;D,READ= 2 ;READ INSTRUCTIONF-WRITE= 3 ;WRITE INSTRUCTIONS4.POSIT= 5 ;POISITION INSTRUCTION -USER MODE DIAG.3/DIAG= 7 ;DIAGONOSE INSTRUCTION -USER MODE DIAG.40TYPU58= 12 ;OPCODE TO CHECK FOR OLD OR NEW TU581; 2; FLAGSD3; 4DATA= 1 ;DATA FLAG5CNTL= 2 ;CONTROL FLAG 6INIT= 4 ;INITIALIZE FLAG7CONT= 20 ;CONTINUE FLAG 8END= 2 ;END FLAG9; !:; DL11 INTERFACE OFFSET SYMBOLSO;;-<DDRCS= 0 ;RECEIVE CONTROL STATUS REGISTER%=DDRBF= 2 ;RECEIVE BUFFER REGISTER 1>DDXCS= 4 ;TRANSMITTER CONTROL STATUS REGISTERT)?DDXBF= 6 ;TRANSMITTER BUFFER REGISTERU@;OA; DL11 BIT ASSIGNMENTSB;ECRDONE= 200 ;RECEIVER DONE'DRIE= 100 ;RECEIVER INTERRUPT ENABLER$EERR= 100000 ;RECEIVER DATA ERROR FTRDY= 200 ;TRANSMITTER READY*GTIE= 100 ;TRANSMITTER INTERRUPT ENABLEHBRK= 1 ;TRANSMIT BREAKI;J; LOCAL BIT ASSIGNMENTSK;12LFLCTL = 10 ;FLOW CONTROL BIT IN SWITCH BYTE OFM ;COMMAND PACKET (BIT 3)!NNTU58 = 1 ;NEW TU58 MICROCODE $OCHKDON = 2 ;TU58 TYPE CHECK DONE(PTU58C = 10 ;TU58 IS SENDING CONTINUE/QTRNACK = 20 ;TRANSMITTING THE ACK CHARACTERR;S; LOCAL DATAT;V=UWORD1: .BLKW T$$U58 ;STORAGE FOR LAST THREE WORDS THAT ARE0-VWORD2: .BLKW T$$U58 ;TO GO IN ERROR PACKETIWWORD3: .BLKW T$$U58 ;W; ;GM001 *W; MAKE GTPKT$ A LOCAL MACRO ;GM001W; ;G00w``_c_d_kM0014W .MACRO GTPKT$ DEV,NCTRLR,ADDR,UCBSV,SUC ;GM001W CALL @GTPKT ;GM001W .IF B ;GM0015W BCC 65535$ ;GM001;W RETURN ;GM001W65535$: ;GM001 W .IFF ;GM001W BCS ADDR ;GM001RW .ENDC ;GM001AW .IF B ;GM001W $$$=0 ;GM001WW .IF B ;GM001W .IF EQ $$$ ;GM001E W MOV R5,S.OWN(R4) ;GM001W .ENDC ;GM001EW .ENDC ;GM001 W .IFF ;GM001W .IF GT NCTRLR-1 ;GM001L W MOV R5,UCBSV(R3) ;GM001W .IFF ;GM001W MOV R5,UCBSV ;GM001W .ENDC ;GM001MW .ENDC ;GM001GW .ENDM ;GM001;W ;GM001W; ;GM001D1W; EXECUTIVE ENTRY POINT VECTOR TABLE ;GM001BW; ;GM0011W ;GM001;WEXEVEC: .WORD 0 ;FLAG FOR VECTOR NOT YET FILLED ;GM001MW ;GM001#W ALOCB: .WORD $ALOCB ;GM001;#W BLKCK: .WORD $BLKCK ;GM001.#W DEACB: .WORD $DEACB ;GM0011#W DTOER: .WORD $DTOER ;GM001 #W DVERR: .WORD $DVERR ;GM001#W ERRSQ: .WORD $ERRSQ ;GM001 "W FORK: .WORD $FORK ;GM001#W GTBYT: .WORD $GTBYT ;GM001 #W GTPKT: .WORD $GTPKT ;GM001#W IODON: .WORD $IODON ;GM001 #W PTBYT: .WORD $PTBYT ;GM001 #W VOLVD: .WORD $VOLVD ;GM001AW ; ;GM001F#W KISR6: .WORD KISAR6 ;GM001W ; ;GM001B(W EXEVCL=<<<.-EXEVEC>/2>-1> ;GM001W ; ;GM001 %Y;DRIVER DISPATCH TABLE ;**-1WZ;D<Z DDT$ DD,T$$U58,,,,NEW ;2 INT. ENTRY PTS ; GM001\ ;**-1 ];;^; PROGRAM SEQUENCE CONTROL_; 9`; PROGRAM FLOW IS CONTROLLED BY A POINTER TO A TABLE OFR;a; ADDRESSES. THIS SEQUENCE CREATES AND DECODES THE RADIAL6b; SERIAL PACKET INFORMATION. THE ACTUAL USER DATA IS;c; TRANSFERRED WITHIN THE INTERRUPT SERVICE ROUTINE (ISR).A9d; THIS METHOD PERMITS US TO WAIT FOR INTERRUPTS WITHOUTE=e; HAVING TO PRESERVE ANY PROCESSOR REGISTERS (INCLUDING THET9f; STACK). REPETITIVE SECTIONS OF CODE CAN BE EXECUTED A ;g; NUMBER OF TIMES WITHOUT LOOP COUNTERS. THIS METHOD ALSOG9h; DECREASES PROGRAM SIZE BY ALLOWING US TO USE BRANCHESBi; RATHER THAN JSR'S.j;;k; THE POINTER (LOCATION RADD) IS INCREMENTED VIA THE CODE:l; IN RTBK (RETURN BACK). RTBK THEN SHIFTS CONTROL TO THE>m; ADDRESS POINTED TO BY RADD. RTBK IS CALLED BY RMSG/SMSG OR<n; THE INTERRUPT SERVICE ROUTINE WHENEVER THE DL11 IS READY4o; TO PERFORM THE NEXT NON-DATA TRANSFER OPERATION.p;TCq; THE MODIFIED RADIAL SERIAL PROTOCOL ALGORITHM IS THE FOLLOWING:Ir;I?s; ISSUE A COMMAND TO THE TU58 WITH THE OPCODE 12 AND THE FLOWECt; CONTROL BIT SET. RECEIVE THE FIRST BYTE OF THE TU58'S RESPONSE.HDu; IF IT'S A '1', IT IS AN OLD TU58. THE '1' IS THE FLAG FOR A DATAFv; PACKET. IF THE RESPONSE IS A '2', IT IS A NEW TU58. THE '2' IS THEDw; FLAG FOR AN END PACKET. FLUSH THE REST OF THE TU58'S RESPONSE BYEx; SENDING THE TU58 AN INIT COMMAND. THE MEMORY LOCATION FLGTYP WILL Dy; HAVE BIT 0 SET FOR THE NEW TU58 AND BIT 0 WILL BE CLEARED FOR AN z; OLD TU58.I{;IE|; THE COMMAND PACKET THAT AUTOCONFIGURES THE TU58 LOOKS AS FOLLOWS: };O~; BYTE BYTE CONTENTSR; ---- ---------------N; 0 FLAG - 2I; 1 BYTE COUNT 12 ; 2 OPCODE 12; 3 MODIFIER 0S; 4 UNIT #6; 5 SWITCHES 10 (FLOW CONTROL BIT SET - BIT 3); 6 SEQUENCE # 0U; 7 SEQUENCE # 0D; 8 BYTE COUNT 0A; 9 BYTE COUNT 0L; 10 BLOCK # 00; 11 BLOCK # 0 ; 12 CHECK SUM-LOWO; 13 CHECK SUM-HIGH;; !; CTAB- COMMAND PACKET SEQUENCET;5=; CONE IS THE ADDRESS RETURNED TO WHEN THE DL11 IS READY TO <; SEND THE FIRST BYTE OF THE 14. BYTE COMMAND PACKET. CTWO>; IS THE ADDRESS RETURNED TO WHEN READY FOR THE SECOND BYTE,?; ETC. CFIF IS EXECUTED AFTER ALL BYTES IN THE COMMAND PACKET ; ARE SENT.E; =CTAB: .WORD CHALF,CONE,CTWO,CTHR,CFOUA,CFOUB,CFIV,CSIX,CSEV 0 .WORD CEIG,CNIN00w```t`TADATADATADATADATADATA,CTEN,CELE,CTWE,CTHI,CFOR,CFIF;C!; ITAB- INITIALIZATION SEQUENCEO; PITAB: .WORD IONE,ITWOA,ITWOB,ITWOC,ITWOD,ITWOE,ITHR,IFOU,IFIV,ISIX ;INIT. SEQ.;H ; TTAB- TRANSMIT DATA SEQUENCE;R1TTAB: .WORD TONE,TTWO,TTHR,TFOU,TFOUA,TFIV,TSIXO; ; RTAB- RECEIVE DATA SEQUENCER;EHRTAB: .WORD RONE,RTWO,RTHR,RFOU ;INCOMING (READ) DATA PACKET ADDRESSES; $; ETAB- END PACKET DECODE SEQUENCE; AETAB: .WORD EONE,ETWO,ETHR,EFOU,EFIV,ESIX,ESEV ;READ END PACKET1 .WORD EEIG,ENIN,ETEN,EELE,ETWE,ETHI ;FROM TU58C; #; TYPTAB - DETERMINE TYPE OF TU58;B@TYPTAB: .WORD CONE,CTWO,TYPTHR,CFOUB,CFIV,TYPSIX,TYPSEV,TYPSEV5 .WORD TYPSEV,TYPSEV,TYPSEV,TYPSEV,CTHI,CFOR,TYPFIF@ .WORD TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSXT2 .WORD TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSVT;T@; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);K$RDAT: .BLKW T$$U58 ;RECEIVED DATA-RADD: .BLKW T$$U58 ;RETURN ADDRESS POINTERP*DBUF: .BLKW T$$U58 ;DL11 BUFFER ADDRESS1CKSM1: .BLKW T$$U58 ;CHECKSUM STORAGE-1ST WORDF$ ;ALSO TEMPORARY DRIVER STORAGE1CKSM2: .BLKW T$$U58 ;CHECKSUM STORAGE-2ND WORDT$ ;ALSO TEMPORARY DRIVER STORAGE*FLAG: .BLKW T$$U58 ;LOW BYTE-BYTE COUNT ;HIGH BYTE-SEND/REC. FLAG./WCNT: .BLKW T$$U58 ;BYTES LEFT TO BE WRITTEN# ;ALSO USED FOR RETURN ADDRESS  ;DURING IOPKT SUBROUTINE/ ;ALSO USED FOR INITIALIZATION RETRY COUNTD+FLGTYP: .BLKW T$$U58 ;BIT 0 - 0 OLD TU58B ; 1 NEW TU581. ;BIT 1 - 0 NOT COMPLETED TU58 TYPE CHECK$ ; 1 COMPLETED TU58 TYPE CHECK* ;BIT 3 - 0 TU58 NOT SENDING CONTINUE) ; - 1 TU58 IS SENDING CONTINUEE. ;BIT 4 - 0 NOT TRANSMITTING THE ACK CHAR* ; - 1 TRANSMITTING THE ACK CHAR;++; **-DDINI- TU58 TAPE CARTRIDGE INITIATORE;@; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AND; I/O REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION>; TO PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIEDB; CONTROLLER IS NOT BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THEA; NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IS EXECUTED. IF5B; THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPERATION:; IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.;D ; INPUT:;A=; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATEDQ;I ; OUTPUT:W;N>; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST<; IS WAITING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED7; AND THE DRIVER INITIATES THE REQUESTED I/O FUNCTIONM;- .ENABL LSB3DDINI: GTPKT$ DD ;GET NEXT I/O PACKET TO PROCESSE;.3; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ;I); R1=ADDRESS OF THE I/O REQUEST PACKET. ; R2=PHYSICAL UNIT NUMBER.; R3=CONTROLLER INDEX.+; R4=ADDRESS OF THE STATUS CONTROL BLOCK.O<; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;R8; TU58 TAPE CARTRIDGE DRIVE I/O REQUEST PACKET FORMAT:;E$; WD. 00 -- I/O QUEUE THREAD WORD.2; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.7; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK./?; WD. 03 -- POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER.N@; WD. 04 -- CONTENTS OF 1ST LUN WORD IN REQUESTOR TASK HEADER.@; WD. 05 -- I/O FUNCTION CODE (IO.RLB, IO.WLB, IO.DGN, IO.BLS)2; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.2; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.&; WD. 10 -- I/O STATUS BLOCK ADDRESS4; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE,; WD. 12 -- RELOCATION BIAS OF DATA BUFFER,; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER); WD. 14 -- NUMBER OF BYTES TO TRANSFERN; WD. 15 -- NOT USED7; WD. 16 -- LOW BYTE MUST BE ZERO, HIGH BYTE NOT USED .; WD. 17 -- LOGICAL OR PHYSICAL BLOCK NUMBER; WD. 20 -- NOT USED;L; DRIVE USUAGE OF UCBD;-+; U.CW2+1 --- STORES DRIVER'S RETRY COUNTD;-;+5; THE TU58 UTILIZES RADIAL SERIAL PROTOCOL. ALL I/OT7; COMMANDS ARE INITIATED BY SENDING A COMMAND MESSAGER00wa`_c_d_k7; PACKET CONSISTING OF 14. BYTES OF INFORMATION. DATAR5; IS THEN TRANSFERRED TO THE UNIT (WRITE) OR TO THE 8; USER'S BUFFER (READ) IN MESSAGE PACKETS OF UP TO 1287 ; BYTES EACH. TERMINATION OF AN OPERATION BY THE TU58 4 ; IS SIGNALED BY THE UNIT'S SENDING AN END MESSAGE4 ; PACKET WHICH CONTAINS INFORMATION CONCERNING THE ; SUCCESS OF THE TRANSFER. ;-; ;D, MOVB #RTRY,U.CW2+1(R5) ;STORE RETRY COUNT1 CALL @VOLVD ;VALIDATE VOLUME VALID ; GM001B$ BCC 10$ ;IF CC SUCCESS ;**-15$: JMP XIT ;EXIT"10$: TST R0 ;TRANSFER FUNCTION? BPL 5$ ;IF PL NO4 MOV S.CSR(R4),DBUF(R3) ;STORE DL11 BUFFER ADDRESS1 MOV R3,R4 ;R4 IS USED FOR CONTROLLER INDEXINGN, CALL @BLKCK ;CHECK PARAMETERS ; GM0018 ADD #DDXBF,DBUF(R4) ;SAVE DL11 XMITTER BUFFER ;**-1;N; SEND COMMAND PACKETI;E<RINI: MOV #TYPTAB-2,RADD(R4); POINT TO WORD PRIOR TO TABLE1 CLR FLAG(R4) ;SET FLAG FOR TRANSMIT INTERRUPTSV; CLR FLGTYP(R4) ;CLEAR FLAG TYPE WORD,DEFAULT IS OLD TU58 !  BR 145$ ;PREPARE TO SEND BYTE0;!RINI1: MOV #CTAB-2,RADD(R4) ;POINT TO WORD PRIOR TO TABLESA" BIC #TU58C!TRNACK,FLGTYP(R4); CLEAR ACK AND TU58 CONTINUE FLAGU1# CLR FLAG(R4) ;SET FLAG FOR TRANSMIT INTERRUPTSK!$ BR 145$ ;PREPARE TO SEND BYTEB%;F&; SEND COMMAND PACKET.'; ,(CHALF: BITB #NTU58,FLGTYP(R4) ; NEW TU58 ?) BNE 15$ ; YES0* JMP RTBK ; NO - DON'T SEND INITIAL CONTINUEA+15$: MOVB #CONT,@DBUF(R4) ; SEND CONTINUE TO ASSURE A RESPONSER#, BR 145$ ; PREPARE TO SEND BYTE4-CONE: MOVB #CNTL,@DBUF(R4) ;SEND COMMAND FLAG BYTE!. BR 145$ ;PREPARE TO SEND BYTE +/CTWO: MOV #10.,@DBUF(R4) ;SEND BYTE COUNTR30 MOVB #10.,CKSM1+1(R4) ;CREATE CHECKSUM WORD FROMA)1 MOVB #CNTL,CKSM1(R4) ; FIRST TWO BYTESE 2 BR 145$03CTHR: CALL IOPKT ;STORE I/O PKT ADDRESS IN R14;BF5; POSITION AND DIAGNOSE FUNCTIONS ARE USER MODE DIAGNOSTIC FUNCTIONS6;D;7 CMP #IO.DGN!IQ.UMD,I.FCN(R1) ;TU58 INTERNAL DIAGNOSTICS?N8 BNE 40$ ;IF NE NOR19 MOV #DIAG,CKSM2(R4) ;CREATE NEXT CHECKSUM WORDO0: MOVB #DIAG,@DBUF(R4) ;SEND DIAGNOSTIC OP CODE; BR 140$ ;CONTINUE OPERATION 7<40$: CMP #IO.BLS!IQ.UMD,I.FCN(R1) ;POSITION FUNCTION?1= BNE 60$ ;IF NE NOC2> MOV #POSIT,CKSM2(R4) ;CREATE NEXT CHECKSUM WORD&? MOVB #POSIT,@DBUF(R4) ;SEND OP CODE@ BR 140$ ;CONTINUEE9A60$: CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL BLOCK?RB BNE 72$ ; IF NO NES1C MOV #READ,CKSM2(R4) ;CREATE NEXT CHECKSUM WORDN)D MOVB #READ,@DBUF(R4) ;SEND READ OPCODEE BR 110$ ;CONTINUER:F72$: CMPB #IO.WLB/256.,I.FCN+1(R1); WRITE LOGICAL BLOCK?G BEQ 100$ ;IF EQ YES$H MOV (SP)+,R1 ;RESTORE R1:>H CALL @FORK ;ENSURE PRIORITY=0 AND REGISTERS SAVED ; GM0015J MOV #IE.IFC&377,R0 ;ILLEGAL FUNCTION CODE ;**-1U/K CLR CKSM2(R4) ;CLEAR BYTES TRANSFERRED COUNTL JMP IOCMP ;EXIT7M100$: MOV #WRITE,CKSM2(R4) ;CREATE NEXT CHECKSUM WORDR+N MOVB #WRITE,@DBUF(R4) ;SEND WRITE OPCODE20O110$: BITB #US.WCK,U.STS(R5) ;WRITE CHECK SET? P BNE 141$ /Q CMPB #20,I.FCN(R1) ;IS WLC OR RLC REQUESTED? R BNE 140$ ;IF NE NO S BR 141$T;L>U; SEND A MODIFIER BYTE OF ONE FOR WRITECHECKS AND READCHECKSV; ,WCFOUA: MOVB #1,CKSM2+1(R4) ;ALTER CHECKSUM#X MOVB #1,@DBUF(R4) ;SEND MODIFIERG1Y ADD #2,RADD(R4) ;SKIP OVER NEXT RETURN ADDRESS Z BR 160$ ;CONTINUE6[140$: ADD #2,RADD(R4) ;SKIP OVER NEXT RETURN ADDRESS \141$: MOV (SP)+,R1 ;RESTORE R1>] MOV CKSM2(R4),WORD1(R4) ;STORE OP CODE AND COMMAND MODIFIER^145$: JMP SMSG_;5`; SEND A MODIFIER BYTE OF ZERO FOR READS AND WRITESEa; &bCFOUB: CLRB @DBUF(R4) ;SEND MODIFIER)c160$: CALL CHKPT ;CHECKSUM CALCULATIONT d BR 145$.eCFIV: MOVB U.UNIT(R5),@DBUF(R4) ;SEND UNIT #f MOVB U.UNIT(R5),CKSM2(R4) g BR 145$*hCSIX: BITB #NTU58,FLGTYP(R4) ;OLD TU58 ?i BEQ 162$ ;YES=j MOVB #FLCTL,@DBUF(R4); SET FLOW CONTROL BIT IN SWITCH WORD 2k MOVB #FLCTL,CKSM2+1(R4); KEEP TRACK OF CHECKSUM l BR 160$ ;Wm162$: CLRB @DBUF(R4) ; SEND 0Nn CLRB CKSM2+1(R4)M o BR 160$pCSEV:D+qCEIG: CLRB @DBUF(R4) ;SEND TWO ZERO BYTESE r B00wa``t`TADATADATADATADATADATAR 145$3sCNIN: CALL IOPKT ;STORE I/O PACKET ADDRESS IN R1T%t ADD #I.PRM,R1 ;POINT TO PARAMETERS.u MOV (R1)+,U.BUF(R5) ;INSERT RELOCATION BIAS/v MOV (R1)+,U.BUF+2(R5) ;INSERT BUFFER ADDRESSI&w MOV (R1),CKSM2(R4) ;CREATE CHECKSUM+x MOVB (R1),@DBUF(R4) ;SEND LOW BYTE COUNTL y BR 141$z; {; NOTE: |;M@}; THE TU58 REQUIRES THAT THE NUMBER OF BYTES TO BE TRANSFERREDA~; BE EVEN AND THAT THE STARTING ADDRESS OF THE DATA TRANSFER BE; ON A WORD BOUNDARY.F;; CTWE: ;SEND HIGH BLOCK NO.8CTEN: MOVB CKSM2+1(R4),@DBUF(R4) ;SEND HIGH BYTE COUNT  BR 160$0CELE: CALL IOPKT ;STORE I/O PKT ADDRESS IN R12 MOVB I.PRM+12(R1),@DBUF(R4) ;SEND LOW BLOCK NO. MOV I.PRM+12(R1),CKSM2(R4),  BR 141$3CTHI: MOVB CKSM1(R4),@DBUF(R4) ;SEND LOW CHECKSUM  BR 145$6CFOR: MOVB CKSM1+1(R4),@DBUF(R4) ;SEND HIGH CHECKSUM;E7; AFTER THE COMMAND PACKET IS SENT THE TU58 RESPONDS.T4; ITS RESPONSE DEPENDS ON THE OPERATION REQUESTED.8; A CONTINUE IS SENT IN RESPONSE TO A WRITE, THE FIRST5; DATA PACKET IS SENT IN RESPONSE TO A READ, AND ANT5; END PACKET IS SENT IN RESPONSE TO A DIAGNOSTIC ORS8; POSITION COMMAND. ALSO AN END PACKET MAY BE RECEIVED3; ON A FAILURE TO READ THE FIRST RECORD PROPERLY. ;C<; DETERMINE THE APPROPRIATE INITIAL RESPONSE FROM THE TU58-; AND RECEIVE THE FIRST BYTE FROM THE TU58.;( INCB FLAG+1(R4) ;SET FLAG FOR RECEIVE0 SUB #DDXBF-DDRBF,DBUF(R4) ;SET RECEIVE BUFFER, BR 25$ ;READ THE RESPONSE BYTE FROM TU580CFIF: CALL IOPKT ;STORE I/O PKT ADDRESS IN R1- CMPB #IO.DGN/256.,I.FCN+1(R1) ;DIAGNOSTIC?K BEQ 170$ ;IF EQ YES + JMP DPACK ;ELSE DATA PACKET OR CONTINUEN 170$: MOV (SP)+,R1 ;RESTORE R1% BR ENDP ;DO END PACKET PROCESSINGR;; DETERMINE TU58 TYPE COMMANDT;T:TYPTHR: MOV #TYPU58,CKSM2(R4); CREATE NEXT CHECKSUM WORD0 MOVB #TYPU58,@DBUF(R4); SEND TU58 TYPE OPCODE" JMP 145$ ;PREPARE TO SEND BYTEDTYPSIX: MOVB #FLCTL,@DBUF(R4); SET FLOW CONTROL BIT IN SWITCH BYTE+ MOVB #FLCTL,CKSM2+1(R4); CREATE CHECKSUMS JMP 160$ ; CREATE CHECKSUM;TYPSEV: CLRB @DBUF(R4) ; NOT IMPORTANT FOR COMMAND PACKETD# JMP 145$ ; PREPARE TO SEND BYTE@TYPFIF: CMPB RDAT(R4),#END ;NEW TU58? (WILL RETURN END PACKET) BNE 200$ ;NO< BIS #NTU58!CHKDON!TRNACK,FLGTYP(R4); SET FLAG TO NEW TU58 BR 206$ ; FLUSH END PACKET6200$: CMPB RDAT(R4),#DATA ; DATA PACKET - OLD TU58 ?& BEQ 204$ ; YES - FLUSH DATA PACKET JMP NTRY ; RETRY;204$: BIS #CHKDON,FLGTYP(R4); TU58 TYPE CHECK IS COMPLETE1. JMP NTRY1 ;FLUSH DATA PACKET BY DOING INIT>206$: ADD #DDXBF-DDRBF,DBUF(R4); POINT TO TRANSMITTER BUFFER JMP SMSG ; SEND A CONTINUE6TYPSXT: JMP RMSG ; FLUSH THE REST OF THE END PACKET@TYPSVT: ADD #DDXBF-DDRBF,DBUF(R4); POINT TO TRANSMITTER BUFFER# JMP RINI1 ; NEW TU58 - USE MRSP;0<; RECEIVE AND MANIPULATE THE TU58'S END PACKET INFORMATION; :ENDP: MOV #ETAB-2,RADD(R4) ;POINT TO END PACKET SEQUENCE+ CMPB RDAT(R4),#CNTL ;COMMAND/END PACKET?  BR 24$H;SC; AT EONE WE SHOULD HAVE RECEIVED THE BYTE COUNT OF AN END PACKETD ; WHICH IS ALWAYS EQUAL TO 10.;M+EONE: CMPB RDAT(R4),#10. ;BYTE COUNT=10.?24$: BEQ 25$ ;IF EQ YES JMP NTRY ;25$: JMP RMSG ;READ A BYTEF/ETWO: CMPB RDAT(R4),#100 ;OP CODE=END PACKET?J  BR 24$ 3ETHR: MOVB RDAT(R4),CKSM1(R4) ;STORE SUCCESS CODEE MOVB RDAT(R4),WORD2(R4) ;  BR 25$ ;4EFOU: MOVB RDAT(R4),WORD2+1(R4) ;STORE UNIT SELECTEFIV: ;DUMP BYTESESIX:NESEV: BR 25$BEEIG: MOVB RDAT(R4),CKSM2(R4) ;STORE BYTE TRANSFERRED COUNT -LOW MOVB RDAT(R4),WORD3(R4) ;  BR 25$QEENIN: MOVB RDAT(R4),CKSM2+1(R4) ;STORE BYTE TRANSFERRED COUNT -HIGHB MOVB RDAT(R4),WORD3+1(R4) ;ETEN::EELE: ETWE: BR 25$ ;DUMP BYTESRCETHI: CALL @FORK ;ENSURE PRIORITY=0 AND REGISTERS SAVED ; GM001,/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESS ;**-1W TSTB CKSM1(R4) ;SUCCESSFUL?) BGT ERRPT ;IF GT YES, BUT HAD RETRIESE& BEQ ENDOP ;IF EQ, COMPLETE SUCCESS. MOV #IE.DNR&377,R0 ;ASSUME DE00wa`_c_d_kVICE NOT READY/ CMPB CKSM1(R4),#-9. ;CARTRIDGE NOT IN PLACE?) BEQ ERRPT ;IF EQ YES* MOV #IE.WLK&377,R0 ;ASSUME WRITE-LOCKED& CMPB CKSM1(R4),#-11. ;WRITE-LOCKED? BEQ ERRPT ;IF EQ YES. MOV #IE.FHE,R0 ;ASSUME FATAL HARDWARE ERROR' CMPB CKSM1(R4),#-33. ;MOTOR STOPPED?G BEQ ERRPT ;IF EQ YES1 MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORT'ERRPT: CALL LOGERR ;LOG DEVICE ERROR  BR ENDOP ;;+; **-LOGERR-LOG DEVICE ERROR ; **-LOGTMO-LOG DEVICE TIMEOUT;A; D; ALLOCATE A CORE BLOCK, FILL IT WITH THE APPROPRIATE INFORMATION,A; CALL THE EXECUTIVE ERROR LOGGING ROUTINE, DEALLOCATE THE CORE); BLOCK, AND RETURN BACK TO THE CALLER.B;R=; IF FOR ANY REASON THE CORE BLOCK CANNOT BE ALLOCATED THEN:; THE EXECUTIVE ERROR LOGGING ROUTINE WILL NOT BE CALLED=; AND THE ERROR SEQUENCE NUMBER WILL BE UPDATED TO INDICATER+; THAT A MISSED ERROR CONDITION OCCURRED.N;-(LOGERR: MOV R0,-(SP) ;SAVE STATUS CODE2 MOV DVERR,-(SP) ;TO LOG DEVICE ERROR ; GM001 BR 70$ ; ;**-1T(LOGTMO: MOV R0,-(SP) ;SAVE STATUS CODE4 MOV DTOER,-(SP) ;TO LOG DEVICE TIMEOUT ; GM001;70$: MOV #DDNUM*2,R1 ;NUMBER OF BYTES TO ALLOCATE ;**-1 1 CALL @ALOCB ;ALLOCATE A CORE BLOCK ; GM001D. BCC 80$ ;IF CC BLOCK WAS ALLOCATED ;**-16 TST (SP)+ ; POP CO-ROUTINE ADDRESS THAT WAS PUT ON: INC @ERRSQ ;INDICATE A MISSED ERROR CONDITION ; GM001$ BR 90$ ;END I/O ROUTINE ;**-1+80$: MOV R0,R1 ;COPY CORE BUFFER POINTERO( MOV DBUF(R4),R3 ;STORE BUFFER ADDRESS  TST -(R3) ;POINT TO DL11 CSR: MOV (R3)+,(R1)+ ;MOVE DL11 RECEIVE CSR INTO CORE BUFFER* MOV (R3)+,(R1)+ ;...DL11 RECEIVE BUFFER, MOV (R3)+,(R1)+ ;... DL11 TRANSMITTER CSR3  MOV WORD1(R4),(R1)+ ;OPCODE AND COMMAND MODIFIERI4  MOV WORD2(R4),(R1)+ ;SUCCESS CODE AND UNIT SELECT9  MOV WORD3(R4),(R1) ;BYTE COUNT LOW AND BYTE COUNT HIGHE$  MOV R4,R3 ;SAVE CONTROLLER INDEX$  MOV U.SCB(R5),R4 ;GET SCB ADDRESS+ MOV R0,R2 ;SET WITH CORE BUFFER POINTER+ CALL @(SP)+ ;CALL ERROR LOGGING ROUTINET* MOV R2,R0 ;RESTORE CORE BUFFER POINTER' MOV R3,R4 ;RESTORE CONTROLLER INDEXR5 MOV #DDNUM*2,R1 ;GET NUMBER OF BYTES TO DEALLOCATE31 CALL @DEACB ;DEALLOCATE CORE BLOCK ; GM001)490$: MOV (SP)+,R0 ;RESTORE I/O STATUS CODE ;**-1  RETURNCENDOP: CALL IOPKT- CMPB #IO.DGN/256.,I.FCN+1(R1) ;DIAGNOSTIC?C BNE 95$ ;IF NE NO3@ MOV I.PRM+14(R1),@KISR6 ;SET BUFFER RELOCATION BIAS ; GM001; MOV I.PRM+16(R1),R0 ;GET REGISTER BUFFER ADDRESS ;**-1C3 MOV DBUF(R4),R3 ;GET DL11 RECEIVE BUFFER ADDRESSR( TST -(R3) ;POINT TO REC. CSR ADDRESS7 MOV (R3)+,(R0)+ ;MOV REC. CSR CONTENTS TO USER BUFF. * MOV (R3)+,(R0)+ ;MOV REC. BUFF CONTENTS+  MOV (R3)+,(R0)+ ;MOV TRANS. CSR CONTENTSR,! MOV (R3)+,(R0)+ ;MOV TRANS. BUFF CONTENTS/" MOV CKSM1(R4),(R0) ;MOV TU58 END PACKET INFON2# MOV #IS.SUC&377,R0 ;STORE I/O COMPLETION STATUS $95$: TST (SP)+ ;RESTORE STACK%;T1&; COMMON EXIT CODE-ALL OPERATIONS COMPLETE HEREI';B9(IOCMP: MOV CKSM2(R4),R1 ;PICKUP BYTES TRANSFERRED COUNTE3)XIT: MOVB U.CW2+1(R5),R2 ;STORE FINAL RETRY COUNTD1* BIS #RTRY*^D<256>,R2 ;MERGE INTIAL RETRY COUNTU* CALL @IODON ; GM001;', JMP DDINI ;NEXT I/O PACKET ;**-1+ - .DSABL LSBR.;ED/; WE ENTER HERE WHEN AN UNEXPECTED AND UNDESIRED BYTE IS RECEIVED.A0; THE TU58 IS REINITIALIZED AND IF THE RETRY COUNT IS => 0, THEMC1; I/O FUNCTION IS STARTED OVER. OTHERWISE, AN ERROR IS LOGGED ANDI2; THE OPERATION IS ABORTED.H3; 4 .ENABL LSBM/5NTRY: DECB U.CW2+1(R5) ;DECREMENT RETRY COUNT?6NTRY1: ADD #DDXBF-DDRBF,DBUF(R4); POINT TO TRANSMITTER BUFFERY7;5=8; TINIT TRIES TO REINITIALIZE THE TU58. IT WILL ATTEMPT THE;<9; INITIALIZATION ROUTINE OF SENDING BREAK, CLEARING BREAK,1:; SENDING TWO INIT'S, AND RECEIVING A CONTINUE.R;;TC<TINIT: CLR FLAG(R4) ;SET FOR TRANSMIT WITH NO USER DATA TRANSFERI2= MOV #ITAB-2,RADD(R4) ;POINT TO INITIALIZE TABLE> BR 50$ ;WAIT?;E=@; NULL TIMING CHARACTERS ARE SENT AT IONE AND ITWO TO ALLOW@00wa``t`TADATADATADATADATADATAA; ENOUGH TIME FOR THE BREAK BIT TO CAUSE A FRAMING ERROR. THIS5B; SIGNALS THE TU58 TO STOP TRANSMITTING AND LISTEN.C;I2DIONE: MOV DBUF(R4),CKSM1(R4) ;TEMP. STORE BUFFER,E SUB #DDXBF-DDXCS,CKSM1(R4) ;POINT TO XCSR*F BIS #BRK,@CKSM1(R4) ;SEND BREAK TO TU58GITWOA: ;SEND TIMING NULLSHITWOB:IITWOC:JITWOD:*KITWOE: CLRB @DBUF(R4) ;SEND ANOTHER NULLL50$: JMP SMSG ;WAITM;T:N; ITHR AND IFOU WILL CLEAR THE BREAK CONDITION AND ISSUE>O; TWO INITIALIZE COMMANDS TO THE TU58. (THE FIRST IS IGNOREDP; BY THE CONTROLLER).EQ;A(RITHR: BIC #BRK,@CKSM1(R4) ;CLEAR BREAK7S SUB #DDXCS-DDRBF,CKSM1(R4) ;TEMP. STORE REC. BUFFER)%T TSTB @CKSM1(R4) ;DUMP REC. BUFFER#0UIFOU: MOVB #INIT,@DBUF(R4) ;SEND ANOTHER INIT.V BR 50$ ;WAITW;T<X; A CHARACTER IS RECEIVED AT ISIX. IF IT IS A CONTINUE, WE-Y; HAVE SUCCESSFULLY INITIALIZED THE DEVICE.UZ;6[IFIV: SUB #DDXBF-DDRBF,DBUF(R4) ;POINT TO REC. BUFF.(\ INCB FLAG+1(R4) ;SET FLAG FOR RECEIVE9] BISB #TU58C,FLGTYP(R4) ; TU58 MUST SEND A CONTINUE NOWY^ JMP RMSG ;WAIT0_ISIX: ADD #DDXBF-DDRBF,DBUF(R4) ;POINT TO XBUFC` BICB #TU58C,FLGTYP(R4) ; TU58 CONTINUE ALREADY SENT - CLEAR FLAG1a TSTB U.CW2+1(R5) ;RETRY?Fb BGT 60$ ;IF GT YES>b CALL @FORK ;ENSURE PRIORITY=0 AND REGISTERS SAVED ; GM001,d MOV #IE.FHE&377,R0 ;FATAL ERROR ;**-1+e CLR CKSM2(R4) ;CLEAR BYTE TRANSFER COUNT%f MOV #200,CKSM1(R4) ;SET ERROR CODE 2g SUB #DDXBF-DDRBF,DBUF(R4) ;POINT TO REC. BUFFER!h JMP ERRPT ;ERROR LOG AND EXIT4)i60$: BITB #NTU58,FLGTYP(R4); NEW TU58 ?Rj BNE 62$ ;YES7k BITB #CHKDON,FLGTYP(R4); COMPLETED TU58 TYPE CHECK ?C&l BNE 62$ ;YES - IT MUST BE OLD TU58)m JMP RINI ;DETERMINE TU58 TYPE - RETRYF.n62$: JMP RINI1 ;SEND COMMAND PACKET - RETRYo;R>p; HERE DATA PACKETS SENT BY THE TU58 ARE READ. THE NUMBER OF>q; DATA BYTES IN THE PACKET IS RECEIVED AT RONE. IT IS STORED>r; IN LOCATION FLAG AND THE CHECKSUM IS INITIALIZED. THE DATA=s; IS TRANSFERRED WITHIN THE INTERRUPT SERVICE ROUTINE WHERE=t; THE CHECKSUM IS ALSO VERIFIED. THE FIRST BYTE OF THE NEXT=u; PACKET IS RECEIVED AT RFOU AND IF IT IS A DATA FLAG, THIS6v; CODE IS ENTERED AGAIN.w;-xDPACK: CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ?:$y BNE 102$ ;IF NE NO -IT'S A WRITEz MOV (SP)+,R1 ;RESTORE R1T){RFOU: CMPB RDAT(R4),#DATA ;DATA PACKET?| BEQ 96$ ;IF EQ YES}94$: JMP ENDPA+~96$: MOVB #DATA,CKSM1(R4) ;START CHECKSUMD, MOV #RTAB-2,RADD(R4) ;POINT TO READ TABLE BR 100$ ;READ A BYTE0RONE: MOVB RDAT(R4),FLAG(R4) ;STORE BYTE COUNT? MOVB RDAT(R4),CKSM1+1(R4) ;STORE HIGH BYTE OF FIRST CHECKSUMV100$: JMP RMSG; 4; AT THIS POINT WE SEND A DATA PACKET TO THE TU58.:; THE DATA FLAG BYTE IS SENT AT TONE. THE NUMBER OF DATA6; BYTES IN THIS PACKET IS SENT AT TTWO. DATA IS THEN<; TRANSFERRED ALONG WITH THE CHECKSUM WITHIN THE INTERRUPT;; SERVICE ROUTINE. RETURN TO THIS SEGMENT IS MADE AT TFIVE8; AND THE FIRST BYTE OF THE NEXT PACKET IS RECEIVED AT5; TSIX, IF IT IS A CONTINUE ANOTHER PACKET IS SENT.T8; WHEN THE TU-58 HAS RECEIVED ALL THE DATA IT SENDS AN;; END PACKET FLAG INSTEAD OF A CONTINUE (THIS ALSO OCCURSO6; IF THE TU58 ENCOUNTERS AN ERROR WRITING THE DATA).;E6102$: MOV I.PRM+4(R1),WCNT(R4) ;DUPLICATE BYTE COUNT MOV (SP)+,R1 ;RESTORE R1IHTSIX: BICB #TU58C,FLGTYP(R4) ; TU58 ALREADY SENT CONTINUE - CLEAR FLAG( CMPB RDAT(R4),#CONT ; CONTINUE FLAG ? BNE 94$ ;IF NE NO 8 MOV #TTAB-2,RADD(R4) ;POINT TO TRANSMIT (WRITE) TABLE% CLRB FLAG+1(R4) ;SET TRANSMIT FLAG 1 ADD #DDXBF-DDRBF,DBUF(R4) ;SET TRANSMIT BUFFERA' BR 130$ ;PREPARE TO SEND FIRST BYTE ,TONE: MOVB #DATA,@DBUF(R4) ;SEND FLAG BYTE' MOVB #DATA,CKSM1(R4) ;START CHECKSUM./ CMP #128.,WCNT(R4) ;MORE THAN 1 PACKET LEFT?T BLO 120$ ;IF L0 YES+?125$: MOVB WCNT(R4),CKSM1+1(R4) ;CREATE HIGH BYTE OF CHECKSUME+ CLRB WCNT(R4) ;ZERO REMAINING BYTE COUNTO  BR 130$<120$: MOVB #128.,CKSM1+1(R4) ;CREATE HIGH BYTE OF CHECKSUM. SUB #128.,WCNT(R4) ;ADJUST REMAINING COUNT130$: JMP SMSG3TTWO: 00w a`_c_d_kMOVB CKSM1+1(R4),@DBUF(R4) ;SEND BYTE COUNTA4 MOVB CKSM1+1(R4),FLAG(R4) ;SET UP FLAG BYTE COUNT  BR 130$)TFIV: INCB FLAG+1(R4) ;SET RECEIVE BYTE(0 SUB #DDXBF-DDRBF,DBUF(R4) ;SET RECEIVE BUFFER? BISB #TU58C,FLGTYP(R4) ;TU58 CAN SEND CONTINUE FOR MORE DATA( BR 100$ ;READ A BYTE  .DSABL LSBK;'; IOPKT PUTS I/O PACKET ADDRESS IN R1N; ; OUTPUT:2;O; R1 = I/O PACKET ADDRESSH=; (SP) = FORMER CONTENTS OF R1 TO BE RESTORED BY THE CALLERC;0IOPKT: MOV (SP)+,WCNT(R4) ;SAVE RETURN ADDRESS MOV R1,-(SP) ;PRESERVE R1 MOV R4,-(SP) ;PRESERVE R4$ MOV U.SCB(R5),R4 ;GET SCB ADDRESS( MOV S.PKT(R4),R1 ;GET I/O PKT ADDRESS MOV (SP)+,R4 ;RESTORE R4E5 JMP @WCNT(R4) ;NOTE R1 WILL BE RESTORED BY PROGRAMN; @; RTBK (RETURN BACK) INCREMENTS THE RETURN ADDRESS POINTER AND; THEN JUMPS THERE. ;S/RTBK: ADD #2,RADD(R4) ;POINT TO NEXT LOCATIONP? MOV @RADD(R4),-(SP) ;MOVE RETURN ADDRESS LOCATION ONTO STACKY* JMP @(SP)+ ;RETURN TO ADDRESS IN TABLE;S;; THIS ROUTINE IS JUMPED TO IN ORDER TO SEND INFORMATION.(@; THE MAIN PROGRAM CONTINUES VIA THE INTERRUPT SERVICE ROUTINEB; CODE (SPT), UNLESS WRITE DATA IS TO BE TRANSFERRED (DATA COUNT; FLAG = NON-ZERO).L;E  .ENABL LSBA/SMSG: SUB #DDXBF-DDXCS,DBUF(R4) ;POINT TO CSRE, BIT #TRDY,@DBUF(R4) ;IS TRANSMITTER READY  BEQ 20$2SREC: ADD #DDXBF-DDXCS,DBUF(R4) ;POINT TO BUFFER% BITB #NTU58,FLGTYP(R4); NEW TU58 ?  BEQ 16$ ;NOC9 BITB #TRNACK,FLGTYP(R4) ; ACK CHAR FOR NEW TU58 MRSP ?H BEQ 16$ ; NO2 MOVB #CONT,@DBUF(R4) ;MUST BE READING FROM TU58+ ;ACK TU58 THAT CHAR HAS BEEN RECEIVEDU5 BICB #TRNACK,FLGTYP(R4); COMPLETED THE ACKNOWLEDGEE( JMP RPT1 ;PROCESS THE CHAR JUST READ16$: TSTB FLAG(R4) ;BYTE COUNT 0 BEQ RTBK ;IF EQ YES $ JMP SPT ;GO TO SEND DATA ROUTINE020$: BIS #S2.ACT,S.ST2(R4) ;SET I/O ACTIVE BIT/ BIS #TIE,@DBUF(R4) ;SET TRANS. INTER. ENABLE(& MOV U.SCB(R5),R4 ;STORE SCB ADDRESS( MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUT  RETURNH  .DSABL LSB ;A; THIS ROUTINE IS JUMPED TO IN ORDER TO RECEIVE INFORMATION VIAH@; THE DL11. IF RECEIVER DONE IS SET, THEN A RETURN TO THE MAINA; PROGRAM IS INITIATED VIA THE INTERRUPT SERVICE ROUTINE (RPT).?; IF THE DL11 DONE BIT IS CLEAR, A RETURN IS EXECUTED AND THES@; INTERRUPT SERVICE ROUTINE WILL RETURN CONTROL TO THE PROGRAM<; WHEN THE DONE BIT IS SET AND WHEN ALL READ DATA HAS BEEN%; TRANSFERRED TO THE USER'S BUFFER.S;M  .ENABL LSB./RMSG: SUB #DDRBF-DDRCS,DBUF(R4) ;POINT TO CSR$ BIT #RDONE,@DBUF(R4) ;BYTE READY? BEQ 20$ ;IF EQ NOM+RREC: JMP RPT ;IF YES ENTER READ ROUTINE 20$: BIS #S2.ACT,S.ST2(R4) ;0 BIS #RIE,@DBUF(R4) ;SET REC. INTERRUPT ENABLE( MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESS# MOVB #40.,S.CTM(R4) ;SET TIMEOUTH  RETURNE  .DSABL LSBO; ; CHKPT CREATES A CHECKSUM; ; INPUT:; ; CKSM2(R4) = WORD TO BE ADDED; CKSM1(R4) = OLD CHECKSUM;E ; OUTPUT:;; CKSM1(R4) = NEW CHECKSUM;D/CHKPT: ADD CKSM2(R4),CKSM1(R4) ;ADD TWO WORDS( ADC CKSM1(R4) ;ADD CARRY  ;FALL THROUGH TO RETURNF;E; END LOCAL ROUTINES;S;+ ; DDCAN-CANCEL I/O ENTRY POINT4; CANCEL I/O IS A NOP FOR FILE STRUCTURED DEVICES.;-DDCAN: RETURN ;GM001 ;GM001;+ ;GM0019; **-DDKRB-CONTROLLER ONLINE/OFFLINE ROUTINE ;GM001; ;GM001 2DDKRB: BCS 20$ ;IF CS OFFLINE REQUEST ;GM001) TST EXEVEC ;IF DONE ALREADY ;GM001H! BNE 20$ ;SKIP THIS ;GM001)# MOV R2,-(SP) ;SAVE R2 ;GM001S# MOV R3,-(SP) ;SAVE R3 ;GM001G+ MOV KINAR6,-(SP) ;SAVE KINAR6 ;GM0018 MOV @#112,R0 ;GET ADDRESS OF TABLE OF ENTRIES ;GM001C MOV (R0),R0 ;GET ADDRESS OF APR BIAS (1ST WORD IN TABLE) ;GM001 ; MOV (R0),KINAR6 ;MAP COMMON THROUGH I-SPACE APR6 ;GM001B, MOV #EXEVEC,R3 ;POINT TO VECTOR ;GM0014 MOV #EXEVCL,R2 ;SPECIFY LENGTH OF VECTOR ;GM0010 CALL @#140004 ;TRANSLATE THE VECTOR ;GM001. MOV (SP)+,KINAR6 00w(a``t`TADATADATADATADATADATA;RESTORE KINAR6 ;GM001& MOV (SP)+,R3 ;RESTORE R3 ;GM001& MOV (SP)+,R2 ;RESTORE R2 ;GM00120$: RETURN ;GM001 ;GM001  ;**-1D ;+5 ; POWERFAIL REQUIRES NO OPERATION. REINITIALIZATIONS? ; OF THE TU58 WILL OCCUR DURING NORMAL OPERATION IF REQUIRED.  ;-DDPWF: RETURNA ; GM001#;+ ; GM001T5; **-DDUCB-UNIT ONLINE/OFFLINE ROUTINE ; GM001O;- ; GM0014DDUCB: RETURN ; GM0010 ; GM001R;+ ;**-1 ,; **-$DDINT TU58 INTERRUPT SERVICE ROUTINE;M); INTERRUPTS ARE ISSUED WHEN EITHER THER'; RECEIVE OR TRANSMIT CSR'S INTERRUPT%; ENABLE IS SET BY ROUTINES RMSG OR &; SMSG. THEY INDICATE THAT THE DL-11&; HAS RECEIVED A BYTE OF INFORMATION'; OR CAN ACCEPT A BYTE OF INFORMATION:; FOR TRANSMITTING. ;-  .ENABL LSB $DDOUT:: ;;;2 INT. ENTRY PTS8 INTSE$ DD,PR4,T$$U58 ;;;SAVE REGISTERS & SET PRIORITY/ BIC #,@DBUF(R4) ;;;CLEAR INTERRUPTS0 MOV R1,-(SP) ;;;SAVE R1&  MOV U.SCB(R5),R1 ;;;GET SCB ADDRESS"! CLRB S.CTM(R1) ;;;CLEAR TIMEOUT" MOV (SP)+,R1 ;;;RESTORE R1R#;S:$; FLAG+1 IS SET FOR A TRANSMIT OPERATION AND CLEARED FOR;%; A RECEIVE OPERATION. FLAG IS CHECKED TO DETERMINE IF WEB&; HAVE DATA TO TRANSFER.';C(( TSTB FLAG+1(R4) ;;;RECEIVE INTERRUPT?) BEQ 3$ ;IF EQUAL NO =* BIT #TRNACK,FLGTYP(R4); IN PROCESS OF ACKNOWLEDGING CHAR ? ++ BEQ RPT ;NO -- JUST A RECEIVE INTERRUPTE6, ADD #DDXBF-DDXCS,DBUF(R4); POINT TO TRANSMIT BUFFER3- MOVB #CONT,@DBUF(R4) ;ACK THE CHAR THAT WAS READC5. BICB #TRNACK,FLGTYP(R4); COMPLETED THE ACKNOWLEDGEO2/ JMP RPT1 ; CONTINUE WITH THE RECEIVE INTERRUPT03$:D/1 ADD #DDXBF-DDXCS,DBUF(R4) ;;;POINT TO BUFFERE)2 TSTB FLAG(R4) ;;;TRANSMIT DATA PACKET?T3 BNE SPT ;;;IF NE YES45$: JMP RTBK ;;;ELSE RETURN5;QA6; SPT IS THE CODE USED TO SEND USER DATA TO THE TU58. A RUNNINGL@7; CHECKSUM IS KEPT AND IS SENT AS THE LAST TWO CHARACTERS OF AB8; DATA PACKET (TTHR,TFOU). AFTER ALL DATA HAS BEEN SENT, CONTROL"9; IS PASSED TO THE MAIN PROGRAM.:;B=:SPT: CALL @GTBYT ;;;PUT USER'S DATA BYTE ON STACK ; GM001 << BITB #1,FLAG(R4) ;;;CHECK FOR EVEN OR ODD BYTE NO. ;**-1-= BNE 20$ ;;;IF NE ODD,THEREFORE HIGH ORDERG> ;;;BYTE IN CHECKSUMT7? MOVB (SP)+,CKSM2(R4) ;;;SAVE LOW ORDER CHECKSUM BYTEU,@ MOVB CKSM2(R4),@DBUF(R4) ;;;TRANSMIT BYTE A BR 30$H>B20$: MOVB (SP)+,CKSM2+1(R4) ;;;SAVE HIGH ORDER CHECKSUM BYTE.C MOVB CKSM2+1(R4),@DBUF(R4) ;;;TRANSMIT BYTE#D CALL CHKPT ;;;GENERATE CHECKSUMR,E30$: DECB FLAG(R4) ;;;DECREMENT DATA COUNTF35$: JMP SMSGT@GTTHR: MOVB CKSM1(R4),@DBUF(R4) ;;;SEND LOW ORDER CHECKSUM BYTE H BR 35$R:ITFOU: MOVB CKSM1+1(R4),@DBUF(R4) ;;;SEND HIGH ORDER BYTE J BR 35$R+KTFOUA: BITB #NTU58,FLGTYP(R4); NEW TU58 ?)L BNE 39$ ; YES 3M38$: JMP RTBK ; NO - CONTINUE NOT NEEDED FOR RSP JN39$: MOVB #CONT,@DBUF(R4) ; SEND CONTINUE AFTER TRANSMITTING DATA PACKET O BR 35$ ;P;;Q; RPT CHECKS FOR AN ERROR CONDITION IN THE DL11'S RECEIVE;<R; BUFFER. IF DATA IS TO BE RECEIVED THIS ROUTINE TRANSFERS:S; THE CHARACTER IN THE USER'S BUFFER AND KEEPS A RUNNING=T; CHECKSUM. AFTER ALL DATA IS RECEIVED, THE FINAL TWO BYTESR@U; OF THE PACKET ARE PRESENT AT RTWO AND RTHR AND IF THEY EQUAL?V; THE CHECKSUM, THEN CONTROL IS RETURNED TO THE MAIN PROGRAM. W; 3XRPT: ADD #DDRBF-DDRCS,DBUF(R4) ;;;POINT TO BUFFERU1Y MOV @DBUF(R4),RDAT(R4) ;;;STORE RECEIVED INFO.TZ BPL 80$ ;;;IF PL NO ERRORH![40$: JMP NTRY ;;;ATTEMPT RETRYD)\80$: BITB #NTU58,FLGTYP(R4); NEW TU58 ?E4] BEQ RPT2 ;NO-DO NOT HAVE TO ACKNOWLEDGE THE DATAB^ BITB #TU58C,FLGTYP(R4) ; DATA COULD BE A CONTINUE IF FLAG SET ?_ BEQ 82$ ; NO - MUST ACK IT,` CMPB RDAT(R4),#CONT ; IS DATA A CONTINE ?7a BEQ RPT2 ; YES - THE CONTINUE IS FROM TU58 - NO ACK 8b82$: BIS #TRNACK,FLGTYP(R4); YES - MUST ACKNOWLEDGE IT6c ADD #DDXBF-DDRBF,DBUF(R4); POINT TO TRANSMIT BUFFER1d JMP SMSG ;NEW TU58-ACKNOWLEDGE CHAR JUST READN:eRPT1: SUB #DDXBF-DDRBF,DBUF(R4); POINT TO 00w0ax4a_c_d_kRECEIVE BUFFER(fRPT2: TSTB FLAG(R4) ;;;DATA TO RECEIVEg BEQ 5$ ;;;IF EQ NO+h MOVB RDAT(R4),-(SP) ;;;PUT DATA ON STACK 8h CALL @PTBYT ;;;PUT DATA INTO USER'S BUFFER ; GM001=j BITB #1,FLAG(R4) ;;;ODD OR EVEN BYTE (FOR CHECKSUM) ;**-1B3k BNE 90$ ;;;IF NE ODD (HIGH ORDER CHECKSUM BYTE)5l MOVB RDAT(R4),CKSM2(R4) ;;;LOW ORDER CHECKSUM BYTET m BR 100$<n90$: MOVB RDAT(R4),CKSM2+1(R4) ;;;HIGH ORDER CHECKSUM BYTE o CALL CHKPTD-p100$: DECB FLAG(R4) ;;;DECREMENT DATA COUNTU q BR 160$=rRTWO: MOVB RDAT(R4),CKSM2(R4) ;;;RECEIVE LOW ORDER CHECKSUM s BR 160$7tRTHR: MOVB RDAT(R4),CKSM2+1(R4) ;;;RECEIVE HIGH ORDER4u CMP CKSM1(R4),CKSM2(R4) ;;;ARE CHECKSUMS CORRECT? v BNE 40$3w160$: JMP RMSG ;;;READ FIRST BYTE OF NEXT PACKET x .DSABL LSBIy;+<z; TIMEOUT IS ENTERED WHEN THE DL11 DOES NOT RESPOND WITHIN;{; A CERTAIN PRESET TIME TO THE SUBROUTINES SMSG AND RMSGS7|; SETTING INTERRUPT ENABLE AND ISSUING A RETURN. THIS05}; INDICATES A HARDWARE FAILURE OF THE DL11 OR TU58.~;-DDOUT:5 BIC #,@DBUF(R3) ;;;CLEAR INTERRUPT ENABLE6$ MOV R3,R4 ;COPY CONTROLLER INDEX& TSTB FLAG+1(R4) ; RECEIVE TIMEOUT ? BNE 2$ ; YES81$: SUB #DDXBF-DDXCS,DBUF(R4); POINT TO RECEIVE BUFFER  BR 6$ ; 52$: BIT #TRNACK,FLGTYP(R4);IN PROCESS OF ACK CHAR ?R( BEQ 4$ ; NO - JUST A RECEIVE TIMEOUT2 BIC #TRNACK,FLGTYP(R4);CLEAR MUST ACK CHAR FLAG  BR 1$ ; 84$: ADD #DDRBF-DDRCS,DBUF(R4); POINT TO RECEIVE BUFFER&6$: CALL LOGTMO ; LOG TIMEOUT ERROR% MOV R4,R3 ; COPY CONTROLLER INDEXE9 ADD #DDXBF-DDRBF,DBUF(R4); POINT TO TRANSMITTER BUFFERC* DECB U.CW2+1(R5) ;DECREMENT RETRY COUNT# BLE 10$ ;IF LE, NO RETRIES LEFT  JMP TINIT ;RE-INIT AND RETRY210$: CLR CKSM2(R3) ;CLEAR BYTE TRANSFERRED COUNT$ MOV #IE.TMO&377,R0 ;TIMEOUT ERROR  JMP ENDOP .ENDIVE TIMEOUT2 BIC #TRNACK,FLGTYP(R4);CLEAR MUST ACK CHAR FLAG  BR 1$ ; 84$: ADD #DDRBF-DDRCS,DBUF(R4); POINT TO RECEIVE BUFFER&6$: CALL LOGTMO ; LOG TIMEOUT ERROR% MOV R4, .TITLE DLDRV  .IDENT /07.01/ o;2P; COPYRIGHT (C) 1982, 1983, 1984, 1985, 1986 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;. ; P. J. BEZEREDI ; R. T. PERRON ; P. J. CARR ; D. R. DONCHINR ; J. GALLANT;s; MODIFIED BY:; ; G. MARIGOWDA 18-NOV-85;=; GM101 FIX ERROR RECOVERY, WAIT FOR DRIVE SANE 85P V07.00.; ; GM102 EXEC VECTORING V07.01;;O; RL11/RL01 DISK DRIVER4 ;5!;6*!.MCALL HWDDF$,PKTDF$,QIOSY$ ;GM102.# HWDDF$ ;DEFINE HARDWARE REGISTERS ;**-1&$ PKTDF$ ;DEFINE I/O PACKET OFFSETS$ QIOSY$ ;GM102$; ;GM102 &; EQUATED SYMBOLS ;**-1';E.(RETRY= ^D<8> ;CONTROLLER ERROR RETRY COUNT5)RLCNT= ^D<7> ;NUMBER OF REGISTERS TO LOG ON ERROR,*RLBPT= ^D<512*20> ;BYTES PER RL01 SURFACE++RLSPU= ^D<15> ;TIME FOR RL01 TO SPIN UP7,; -; RL11 DEVICE REGISTER OFFSETS.;$/RLCS= 0 ;CONTROL STATUS REGISTER!0RLBA= 2 ;BUS ADDRESS REGISTER$"1RLDA= 4 ;DISK ADDRESS REGISTER#2RLMP= 6 ;MULTI-PURPOSE REGISTERP-3RLBAE= 10 ;BUS ADDRESS EXTENSION REGISTER 4; 5; RLCS BIT ASSIGNMENTS6; 7ERR= 100000 ;COMPOSITE ERROR8DE= 040000 ;DRIVE ERRORL$9NXM= 020000 ;NON-EXISTANT MEMORY:DLT= 010000 ;DATA LATE!;HNF= 010000 ;HEADER NOT FOUNDY!<DCK= 004000 ;DATA CHECK ERROR5"=HCRC= 004000 ;HEADER CRC ERROR%>OPI= 002000 ;OPERATION INCOMPLETE(?A17= 000040 ;EXTENDED ADDRESS BIT 17(@A16= 000020 ;EXTENDED ADDRESS BIT 16ADS0= 000400 ;DRIVE SELECT 0PBDS1= 001000 ;DRIVE SELECT 1CDRDY= 1 ;DRIVE READY!DWCHK= 2 ;WRITE CHECK FUNCTIONBEWRITE= 2 ;WRITE OFFSET&FGSTS= 4 ;GET DRIVE STATUS FUNCTIONGSEEK= 6 ;SEEK FUNCTION"HRDH= 10 ;READ HEADERS FUNCTION IREAD= 14 ;READ DATA FUNCTIONJIE= 100 ;INTERRUPT ENABLE4KCRDY= 200 ;CONTROLLER READY L;0M; RLDA S00x8a``t`TADATADATADATADATADATATATUS CODESN;0OMRK= 1 ;MARKER BITPSTS= 2 ;GET STATUS BITQSN= 4 ;SIGN BIT FOR SEEKRRST= 10 ;DRIVE RESET BIT*SHS= 20 ;HEAD SELECT BIT FOR DIFFERENCE.TREV= 200!MRK ;REVERSE SEEK DIFFERENCE WORDU;#V; RLMP GET STATUS BIT ASSIGNMENTSW;=!XWDE= 100000 ;WRITE DATA ERRORT#YCHE= 040000 ;CURRENT HEAD ERRORS"ZWLS= 020000 ;WRITE LOCK STATUS$[SKTO= 010000 ;SEEK TIMEOUT ERROR\SPD= 004000 ;SPEED ERROR!]WGE= 002000 ;WRITE GATE ERRORE^VC= 001000 ;VOLUME CHECK#_DSE= 000400 ;DRIVE SELECT ERRORT`DT= 000200 ;DRIVE TYPE#aHSS= 000100 ;HEAD SELECT STATUS=bCO= 000040 ;COVER OPENcHH= 000020 ;HEADS HOMEdBH= 000010 ;BRUSHES HOME0eSLM= 000005 ;DRIVE IN SEEK-LINEAR MODE STATEf; g; DRIVE STATUS FLAGSh;='iRVSK= 200 ;REVERSE SEEK IN PROGRESS02jSDWN= 100 ;DRIVE ERROR SETTLE DOWN IN PROGRESSkl;m; LOCAL DATAn;K!o; CONTROLLER IMPURE DATA TABLESE.p; THESE ARE INDEXED BY THE CONTROLLER NUMBERq;09rRTTBL: .BLKW R$$L11 ;RETRY COUNT FOR CURRENT OPERATION<sPRMSV: .BLKW R$$L11*6 ;PARAMETER SAVE AREA FOR WRITE CHECKsVC$DL = 0 ;GM102s; ;GM102E1s; EXECUTIVE ENTRY POINT VECTOR TABLE ;GM1020s; ;GM102Ns ;GM102;sEXEVEC: .WORD 0 ; FLAG FOR VECTOR NOT YET FILLED ;GM102Ns ;GM102#sALOCB: .WORD $ALOCB ;GM102G#sBLKC2: .WORD $BLKC2 ;GM102#sBMSET: .WORD $BMSET ;GM102#sCVLBN: .WORD $CVLBN ;GM102 #sDEACB: .WORD $DEACB ;GM102;#sDTOER: .WORD $DTOER ;GM102#sDVERR: .WORD $DVERR ;GM102 #sERRSQ: .WORD $ERRSQ ;GM102 !sFORK: .WORD $FORK ;GM102#sFMASK: .WORD $FMASK ;GM102 #sGTPKT: .WORD $GTPKT ;GM102 #sIODON: .WORD $IODON ;GM102L#sMPUBM: .WORD $MPUBM ;GM102N!sRLCN: .WORD $RLCN ;GM102D#sRQCND: .WORD $RQCND ;GM102D#sSTMAP: .WORD $STMAP ;GM102D#sSGFIN: .WORD $SGFIN ;GM102D#sVOLVD: .WORD $VOLVD ;GM102Ds; ;GM102;#sKISR6: .WORD KISAR6 ;GM102s; ;GM102R!sSCTM: .WORD S.CTM ;GM102R!sSITM: .WORD S.ITM ;GM102F!sSKRB: .WORD S.KRB ;GM102$!sSOWN: .WORD S.OWN ;GM102D!sSPKT: .WORD S.PKT ;GM102O!sSSTS: .WORD S.STS ;GM102.!sSST2: .WORD S.ST2 ;GM102 s; ;GM102M(sEXEVCL=<<<.-EXEVEC>/2>-1> ;GM102s; ;GM102AsS.VCTM = -1 ;GM102sS.VITM = -1 ;GM102sS.VKRB = -1 ;GM102sS.COWN = -1 ;GM102sS.VPKT = -1 ;GM102sS.VSTS = -1 ;GM102sS.VST2 = -1 ;GM102s; ;GM102 *s; SCB REFERENCE PATCH TABLE ;GM102s; ;GM102 s ;GM102&sSCBPAT: .WORD CTM1,SCTM ;GM102s .WORD CTM2,SCTM ;GM102s .WORD CTM3,SCTM ;GM102s .WORD CTM4,SCTM ;GM102<s .WORD ITM1,SITM ;GM102 s .WORD ITM2,SITM ;GM102 s .WORD ITM3,SITM ;GM102 s .WORD RKRB1,SKRB ;GM102s .WORD KRB1,SKRB ;GM1022s .WORD KRB2,SKRB ;GM102s .WORD KRB3,SKRB ;GM102Ss .WORD KRB4,SKRB ;GM102 s .WORD KRB5,SKRB ;GM102Ts .WORD KRB6,SKRB ;GM102 s .WORD KRB7,SKRB ;GM102 s .WORD KRB10,SKRB ;GM102 s .WORD KRB11,SKRB ;GM102 s .WORD KRB12,SKRB ;GM102 s .WORD KRB13,SKRB ;GM102 s .WORD KRB14,SKRB ;GM102s .WORD PKT1,SPKT ;GM1020s .WORD PKT2,SPKT ;GM1020s .WORD PKT3,SPKT ;GM1021s .WORD PKT4,SPKT ;GM1020s .WORD PKT5,SPKT ;GM1020s .WORD PKT6,SPKT ;GM1020s .WORD PKT7,SPKT ;GM1020s .WORD STS1,SSTS ;GM1020s .WORD STS2,SSTS ;GM1020s .WORD STS3,SSTS ;GM1020s .WORD STS4,SSTS ;GM1021 s .WORD RST21,SST2 ;GM102.s .WORD 0 ;END OF THE TABLE ;GM102s; ;GM1022u; ;**-1v;DRIVER DISPATCH TABLEw;P7x DDT$ DL,R$$L11,NEW=Y,OPT=Y ;GENERATE DISPATCH TABLEOyz;+0{; **-DLINI-RL11/RL01 DISK CONTRO00x@a4a_c_d_kLLER INITIATOR|;.D}; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/OC~; REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TODG; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLER,I; IS NOT BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST.ND; ELSE A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPTF; IS SUCCESSFUL, THEN THE NEXT I/O OPERATION IS INITIATED. A RETURN#; TO THE CALLER IS THEN EXECUTED.I;/ ; INPUTS:T:; R5= ADRS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;E ; OUTPUTS:A; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST ISOA; WAITING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THES/; DRIVER INITIATES THE REQUESTED I/O FUNCTIONT;-9DLINI: GTPKT$ DL,R$$L11 ;GET NEXT I/O PACKET TO PROCESS ;E3; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:S;S&; R1= ADRS OF THE I/O REQUEST PACKET3; R2= PHYSICAL UNIT NUMBER OF THE REQUESTED DRIVEI; R3= CONTROLLER INDEX.; R4= ADRS OF THE STATUS CONTROL BLOCK (SCB)4; R5= ADRS OF THE UCB OF THE DRIVE TO BE INITIATED; 8; RL11/RL01 DISK CONTROLLER I/O REQUEST PACKET FORMAT:;,#; WD. 00 -- I/O QUEUE THREAD WORDS1; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER3; WD. 02 -- ADRS OF THE TCB OF THE REQUESTOR TASKT>; WD. 03 -- POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER3; WD. 04 -- CONTENTS OF FIRST LUN WORD (UCB ADRS); WD. 05 -- I/O FUNCTION CODEH.; WD. 06 -- VIRTUAL ADRS OF I/O STATUS BLOCK1; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK5=; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT +140000)R1; WD. 11 -- VIRTUAL ADRS OF AST SERVICE ROUTINE,3; WD. 12 -- MEMORY EXTENSION BITS OF I/O TRANSFER ); WD. 13 -- BUFFER ADRS OF I/O TRANSFERD.; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED; WD. 15 -- NOT USED.2=; WD. 16 -- LOW BYTE MUST BE ZERO AND HIGH BYTE IS NOT USED ;; WD. 17 -- LOW PART OF LOGICAL BLK NUMBER OF I/O REQUESTC; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. BLK. ELSE NOT USEDIE; WD. 21 -- DIAGN. REG. BLOCK ADDRESS (DISPL.+140000) ELSE NOT USEDI;E(; DRIVER USAGE OF WORDS IN I/O PACKET:-; I.PRM+6 (WD. 15) - EXTENDED ADDRESS BITSE:; I.PRM+10 (WD. 16) - CYLINDER # OR DESIRED DISK ADDRESSC; I.PRM+12 (WD. 17) - SECTOR/SURFACE # OR BYTES REMAINING TO XFERD;-6 CALL @RQCND ;REQUEST ACCESS TO CONTROLLER ;GM1026 MOV S.VPKT(R4),R1 ;GET I/O PACKET ADDRESS ;GM102PKT1=.-2 ;GM102 / MOV S.VKRB(R4),R3 ;GET KRB ADDRESS ;GM102 KRB1=.-2 ;GM102-7 MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX ;**-3I/ MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNT- CALL DLVV ;PROCESS VOLUME VALID FUNCTIONS7 BIT #FE.EXT,@FMASK ;IS THIS A 22-BIT SYSTEM ;GM102S BEQ 15$ ;IF EQ NO ;**-1S0 BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? BEQ 10$ ;IF EQ NOA1 MOVB U.BUF+1(R5),R0 ;GET EXTENDED ADDRESS BITS;* MOV R0,I.PRM+6(R1) ;SAVE THEM FOR LATER* ASH #4,R0 ;PUT THEM IN THE RIGHT PLACE* BIC #^C<60>,R0 ;JUST GET THE LOW 2 BITS MOV R0,U.BUF(R5) ;SAVE THEM BR 15$ ;<10$: CALL @STMAP ;SETUP UNIBUS MAPPING REGISTERS ;GM102/ CALL @MPUBM ;MAP UNIBUS TO MEMORY ;GM102I:15$: MOV S.VPKT(R4),R1 ;GET I/O PACKET ADDRESS ;GM102PKT2=.-2 ;GM102 8 MOVB U.UNIT(R5),U.BUF+1(R5) ;SET UNIT NUMBER ;**-3. MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION8 BIS #READ!IE,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTION- CMPB #IO.RLB/^D<256>,I.FCN+1(R1) ;REALLY?R& BHIS 20$ ;IF HIS FUNCTION IS LEGAL$ CALLR DLFIN ;FUNCTION IS ILLEGAL)20$: BEQ 25$ ;IF EQ FUNCTION IS A READ ; SUB #WRITE,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTIONP725$: MOV I.PRM+12(R1),R0 ;RETRIEVE SECTOR AND SURFACEE0 MOV I.PRM+10(R1),R2 ;RETRIEVE CYLINDER NUMBER! ASH #7,R2 ;PUT IT IN POSITION1. BIS R0,R2 ;MERGE IN THE SECTOR AND SURFACE1 MOV R2,I.PRM+10(R1) ;SAVE DESIRED DISK ADDRESSU( BIC #^C<77>,R0 ;ISOLATE SECTOR NUMBER; MOV U.CNT(R5),I.PRM+12(R1) ;ASSUME ONLY ONE XFER N00xHa``t`TADATADATADATADATADATAEEDEDH* MOV #^D<40>,R2 ;SET SECTORS PER SURFACE0 SUB R0,R2 ;CALCULATE SECTORS LEFT ON SURFACE& SWAB R2 ;GET BYTES LEFT ON SURFACE7 CMP U.CNT(R5),R2 ;ARE ADDITIONAL TRANSFERS REQUIRED?0 BLOS 30$ ;IF LOS NOF6 MOV R2,U.CNT(R5) ;SET BYTE COUNT FOR FIRST TRANSFER330$: MOV S.VKRB(R4),R3 ;GET KRB ADDRESS ;GM102RKRB2=.-2 ;GM102E7 MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX ;**-1B5 MUL #6,R3 ;FORM AN INDEX INTO PARAMETER SAVE AREAI% ADD #PRMSV,R3 ;POINT TO THIS ENTRYE/ MOV U.BUF(R5),(R3)+ ;SAVE INITIAL PARAMETERS MOV U.BUF+2(R5),(R3)+ ;... MOV U.CNT(R5),(R3)+ ;...G MOV I.PRM+10(R1),(R3)+ ;...U MOV I.PRM+12(R1),(R3)+ ;...F MOV I.PRM+6(R1),(R3)+ ;...;+,; THIS SECTION WILL INITIATE THE OPERATION;-<DLINIO: MOV @S.VKRB(R4),R2 ;RETREIVE CSR ADDRESS ;GM102KRB3=.-2 ;GM102 8 MOV S.VPKT(R4),R3 ;GET ADDRESS OF I/O PACKET ;GM102PKT3=.-2 ;GM102A/ CLRB U.CW2+1(R5) ;CLEAR DRIVE FLAGS ;**-2I7 BITB #US.VV,U.STS(R5) ;IS SOFTWARE VOLUME VALID SET? BEQ 5$ ;IF EQ NO CALL DLGST ;GET DRIVE STATUS BR 6$ ;SKIP RESET(-5$: CALL DLRST ;RESET DRIVE AND GET STATUS.*6$: MOV RLMP(R2),R1 ;GET THE STATUS INFO- BIC #WLS!DT!HSS,R1 ;REMOVE IRRELEVANT BITS& BIT #DRDY,(R2) ;IS THE DRIVE READY? BEQ 20$ ;IF EQ NO 6 BITB #US.VV,U.STS(R5);IS SOFTWARE VOLUME VALID SET? BEQ 10$ ;IF EQ NOC$ BIT #VC,R1 ;IS VOLUME CHECK SET?. BNE 20$ ;IF NE ERROR OR POWERFAIL RECOVERY6 CALL DLRST ;CLEAR ANY OTHER DRIVE ERROR CONDITIONS' MOV RLMP(R2),R1 ;GET THE STATUS INFOS- BIC #WLS!DT!HSS,R1 ;REMOVE IRRELEVANT BITS& BIT #DRDY,(R2) ;IS THE DRIVE READY? BEQ 20$ ;IF EQ NO)610$: CMP #HH!BH!SLM,R1 ;HEADS, BRUSHES AND STATE OK? BEQ 35$ ;IF EQ YES920$: BITB #US.SPU,U.STS(R5) ;IS THE DRIVE SPINNING UP?1 BNE DLPWF1 ;IF NE YES, WAIT FOR IT TO SPIN UP?* CALL DLDVER ;LOG DRIVE NOT READY ERROR025$: MOV #IE.DNR&377,R0 ;SET RETURN ERROR CODE CALLR DLFIN ;EXIT FATALS&30$: CALL DLRST ;RESET DRIVE ERRORS635$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UP6 MOV I.PRM+10(R3),R0 ;RETREIVE STARTING DISK ADDRESS* CALL DLDIFF ;CALCULATE DIFFERENCE WORD, DLGO: BEQ 40$ ;IF EQ NO SEEK IS NECESSARY+  MOV #SEEK,R1 ;GET CODE FOR SEEK FUNCTIONT  CALL DLXCT ;EXECUTE THE SEEK0  BMI DLEROR ;IF MI ERROR DURING SEEK FUNCTION= 40$: MOVB S.VITM(R4),S.VCTM(R4) ;SET TIMEOUT COUNT ;GM102 ITM1=.-4 ;GM102T CTM1=.-2 ;GM102R8 BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? ;**-1 BEQ 45$ ;IF EQ NO,9 MOV I.PRM+6(R3),RLBAE(R2) ;LOAD EXTENDED ADDRESS BITS;"45$: ADD #RLMP,R2 ;POINT TO RLMP# MOV U.CNT(R5),R1 ;GET BYTE COUNTD  ROR R1 ;MAKE IT A WORD COUNT NEG R1 ;ALSO NEGATIVER  MOV R1,(R2) ;LOAD WORD COUNT6 MOV I.PRM+10(R3),-(R2) ;LOAD STARTING DISK ADDRESS, MOV U.BUF+2(R5),-(R2) ;LOAD BUS ADDRESS3 CALL @BMSET ;SET I/O ACTIVE BIT IN MAP ;GM10247 MOV U.BUF(R5),-(R2) ;;;LOAD FUNCTION AND GO ;**-1E;+>; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;-!DLCAN: RETURN ;;;NOP FOR RL11E !;+<"; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND@#; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT?$; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVE2A%; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANYSC&; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESSV'; THE UNIT IS ALREADY READY.(;-)5*DLPWF: BCS DLCAN ;IGNORE CONTROLLER POWERFAIL CALLO4* TSTB S.VSTS(R4) ;IS DRIVE CURRENTLY BUSY ;GM102*STS1=.-2 ;GM102+", BEQ DLPWF2 ;IF EQ NO ;**-1A, MOVB #4,S.VSTS(R4) ;ALLOW FOR A FULL MINUTE TO SPIN UP ;GM102N,STS2=.-2 ;GM102A,DLPWF1: MOVB #RLSPU,S.VCTM(R4);EXTEND TIMEOUT FOR UNIT ;GM102 ,CTM2=.-2 ;GM102K?/DLPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UP ;**-2R 0 RETURN ;X12;+'3; **-$DLINT-RL11/RL01 DISK CONTROLLERD(4; INTERRUPT AND 00xPa4a_c_d_kERROR SERVICE ROUTINES5;-:6 INTSE$ DL,PR5,R$$L11 ;;;SAVE REGISTERS AND SET PRIORITY36 CALL @FORK ;;;CREATE A SYSTEM PROCESS ;GM102P28 MOV U.SCB(R5),R4 ;RETRIEVE SCB ADDRESS ;**-159 BITB #RVSK,U.CW2+1(R5) ;REVERSE SEEK IN PROGRESS? #9 BEQ 5$ ; ;GM102..9 JMP DLIO1 ;IF NE YES ;GM102A9 5$: MOV @S.VKRB(R4),R2 ;RETRIEVE CSR ADDRESS ;GM102 9KRB4=.-2 ;GM102T:< MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL OPERATION ;**-2:< MOV S.VPKT(R4),R3 ;RETRIEVE I/O PACKET ADDRESS ;GM102<PKT4=.-2 ;GM102T.> MOV (R2),R1 ;GET CONTENTS OF RLCS ;**-1'? BMI DLEROR ;IF MI AN ERROR OCCURREDR:@ SUB U.CNT(R5),I.PRM+12(R3) ;GET BYTES LEFT TO TRANSFERA BEQ DLPASS ;IF EQ NONE LEFT;B MOV I.PRM+12(R3),U.CNT(R5) ;ASSUME LAST TRANSFER COMING 7C CMP I.PRM+12(R3),#RLBPT ;IS THIS THE LAST TRANSFER? D BLOS 10$ ;IF LOS YES5E MOV #RLBPT,U.CNT(R5);TRANSFER A WHOLE TRACKS WORTHR1F10$: BIC #CRDY,R1 ;CLEAR CRDY TO START FUNCTIONK;G MOV R1,U.BUF(R5) ;SAVE CURRENT FUNCTION AND ADDRESS BITS 6H MOV RLBA(R2),U.BUF+2(R5) ;SAVE CURRENT BUS ADDRESS0I BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST?J BEQ 20$ ;IF EQ NO(9K MOV RLBAE(R2),I.PRM+6(R3) ;SAVE EXTENDED ADDRESS BITSE4L20$: MOV I.PRM+10(R3),R0 ;GET INITIAL DISK ADDRESS M MOV R0,R1 ;COPY DISK ADDRESS/N BIS #77,R0 ;UPDATE CYLINDER AND SURFACE ...0(O INC R0 ;... LEAVING SECTOR BITS ZERO-P MOV R0,I.PRM+10(R3) ;SAVE NEW DISK ADDRESSR2Q CALL DLDIF0 ;CALCULATE MID-TRANSFER DIFFERENCE#R CALLR DLGO ;GO DO THE OPERATIONBS+TDLEROR: BIT #DRDY,R1 ;IS THE DRIVE READY?B!T BEQ 25$ ;IF NE YES ;GM101)2T MOV RLMP(R2),R1 ;GET THE STATUS INFO ;GM1018T BIC #WLS!DT!HSS,R1 ;REMOVE IRRELEVANT BITS ;GM101;T CMP #HH!BH!SLM,R1 ;HEADS, BRUSHES AND STATE OK? ;GM101R+T BEQ DLERR ;YES, THEN DO RETRY ;GM101ADT25$: MOVB S.VITM(R4),S.VCTM(R4);WAIT FOR DRIVE TO QUIESCE ;GM101TITM2=.-4 ;GM101ATCTM3=.-2 ;GM101L?W MOVB #SDWN,U.CW2+1(R5) ;FLAG SETTLE DOWN IN PROGRESS ;**-2D X RETURN ;BY0ZDLERR: MOV (R2),R1 ;RETRIEVE CONTENTS OF RLCS0[ BITB #IQ.UMD,I.FCN(R3) ;DIAGNOSTIC FUNCTION?,\ BNE DLPASS ;IF NE YES, GO PASS REGISTERS#] MOV R1,-(SP) ;SAVE RLCS CONTENTS !^ CALL DLDVER ;LOG DEVICE ERRORD*_ MOV (SP),R1 ;RETRIEVE CONTENTS OF RLCS-` MOV #IE.BBE&377,R0 ;ASSUME BAD BLOCK ERRORVa COM (SP) ;TOGGLE THE BITSR(b BIT #HCRC!OPI,(SP)+ ;BAD BLOCK ERROR?c BEQ DLFIN ;IF EQ YES1d MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORT%e BIT #NXM,R1 ;NON-EXISTANT MEMORY? f BNE DLFIN ;IF NE YESg BIT #DE,R1 ;DRIVE PROBLEMS?h BEQ 50$ ;IF EQ NO31i CALL DLGST ;EXECUTE GET DRIVE STATUS FUNCTION,'j BIT #WGE,RLMP(R2) ;WRITE GATE ERROR? k BEQ DLFIN ;IF EQ NOL0l BIT #WLS,RLMP(R2) ;IS THE DRIVE WRITE LOCKED?m BEQ DLRTY ;IF EQ NOV0n MOV #IE.WLK&377,R0 ;SET WRITE LOCK ERROR CODEo BR DLFIN ;/p50$: BIT #10,U.BUF(R5) ;WRITE CHECK FUNCTION?q BNE DLRTY ;IF NE NO&r BIT #OPI,R1 ;OPERATION INCOMPLETE?s BNE DLRTY ;IF NE YES#t BIT #DCK,R1 ;WRITE CHECK ERROR?Nu BEQ DLRTY ;IF EQ NOR6v MOV #IE.WCK&377,R0 ;YES, SET WRITE CHECK ERROR CODE@vDLRTY: MOV S.VPKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS ;GM102vPKT5=.-2 ;GM102F2x BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES? ;**-1y BNE DLFIN ;IF NE YES4y MOV S.VKRB(R4),R3 ;RETRIEVE KRB ADDRESS ;GM102yKRB5=.-2 ;GM1023{ MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX ;**-1E)| DECB RTTBL(R3) ;ANY MORE RETRIES LEFT?I} BLE DLFIN ;IF LE NOR'~DLIO: CALL DLRST ;RESET DRIVE ERRORSE,DLIO1: JMP DLINIO ;RETRY ENTIRE OPERATION7DLPASS: BITB #IQ.UMD,I.FCN(R3) ;DIAGNOSTIC FUNCTION?S BEQ 10$ ;IF EQ NOI> MOV I.PRM+14(R3),@KISR6;SET BUFFER RELOCATION BIAS ;GM102; MOV I.PRM+16(R3),R3 ;GET REGISTER BUFFER ADDRESS ;**-1 + CALL REGPAS ;MOVE REGISTERS INTO BUFFERD BR DLFIN ;EXIT;10$: BITB #IO.WLC&377,I.FCN(R3) ;WRITE WITH WRITE CHECK?I BNE 20$ ;IF NE YES0 BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED?00xXa``t`TADATADATADATADATADATA BEQ DLFIN ;IF EQ NOD220$: MOV U.BUF(R5),R1 ;GET CURRENT FUNCTION CODE/ BIT #WCHK,R1 ;WRITE OR WRITE CHECK FUNCTION?I BEQ DLFIN ;IF EQ NOC) BIT #10,R1 ;WAS FUNCTION WRITE CHECK?M BEQ DLFIN ;IF EQ YES/ MOV S.VKRB(R4),R1 ;GET KRB ADDRESS ;GM102;KRB6=.-2 ;GM102 7 MOVB K.CON(R1),R1 ;RETRIEVE CONTROLLER INDEX ;**-1) MOV #RETRY,RTTBL(R1);RESET RETRY COUNT.5 MUL #6,R1 ;FORM AN INDEX INTO PARAMETER SAVE AREAY ADD #PRMSV,R1 ;...T3 MOV (R1)+,U.BUF(R5) ;RESTORE STARTING PARAMETERSD MOV (R1)+,U.BUF+2(R5) ;... MOV (R1)+,U.CNT(R5) ;...# MOV (R1)+,I.PRM+10(R3) ;...C MOV (R1)+,I.PRM+12(R3) ;... MOV (R1)+,I.PRM+6(R3) ;...5 BIC #10,U.BUF(R5) ;CONVERT TO WRITE CHECK FUNCTION," BR DLIO ;START THE WRITE CHECK>DLFIN: MOV S.VPKT(R4),R2 ;GET ADDRESS OF I/O PACKET ;GM102PKT6=.-2 ;GM102,6 MOV I.PRM+4(R2),R1 ;GET TOTAL TRANSFER SIZE ;**-12 SUB I.PRM+12(R2),R1 ;CALCULATE BYTES TRANSFERED/ MOV S.VKRB(R4),R3 ;GET KRB ADDRESS ;GM102TKRB7=.-2 ;GM102R7 MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX ;**-1M+ MOVB RTTBL(R3),R2 ;GET FINAL RETRY COUNT.5 BIS #RETRY*^D<256>,R2 ;MERGE STARTING RETRY COUNT)0 CALL @RLCN ;RELEASE THE CONTROLLER ;GM102/ CALL @IODON ;FINISH I/O OPERATION ;GM102,, JMP DLINI ;PROCESS NEXT REQUEST ;**-2;+&; **-DLOUT-RL11/RL01 DISK CONTROLLER; DEVICE TIMEOUT ROUTINE;B;; DEVICE TIMEOUT RESULTS IN THE OPERATION BEING REPEATED.4?; TIMEOUTS ARE USUALLY CAUSED BY A POWER FAILURE BUT MAY ALSOM,; BE THE RESULT OF A HARDWARE MALFUNCTION.;-BDLOUT: MOV S.VPKT(R4),R3 ;;;RETRIEVE I/O PACKET ADDRESS ;GM102PKT7=.-2 ;GM102N; BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP? ;**-1  BEQ 20$ ;;;IF EQ NOT; DECB S.VSTS(R4) ;;;HAVE WE WAITED A MINUTE YET? ;GM102STS3=.-2 ;GM102/! BNE 10$ ;;;IF NE NO ;**-1M4 INCB S.VSTS(R4) ;;;LEAVE CONTROLLER BUSY ;GM102STS4=.-2 ;GM102) BR 30$ ;;;LOG DEVICE TIMEOUT ;**-1F#10$: MTPS #0 ;;;ALLOW INTERRUPTSL# BR DLIO ;RETRY ENTIRE OPERATION920$: BITB #SDWN,U.CW2+1(R5) ;;;IS DRIVE SETTLING DOWN?  BEQ 30$ ;;;IF EQ NO # MTPS #0 ;;;YES, ALLOW INTERUPTS  JMP DLERR ;PROCESS THE ERROR#30$: MTPS #0 ;;;ALLOW INTERRUPTS.0 BITB #IQ.UMD,I.FCN(R3) ;DIAGNOSTIC FUNCTION?, BNE DLPASS ;IF NE YES, GO PASS REGISTERS# CALL DLDTER ;LOG DEVICE TIMEOUT)+ MOV #IE.DNR&377,R0 ;SET DEVICE NOT READY2 JMP DLRTY ;RETRY OPERATION;+2; **-DLXCT,DLGST,DLRST-RL11/RL01 DISK CONTROLLER; FUNCTION EXECUTION ROUTINESP;O7; THIS ROUTINE WILL EXECUTE A GET DRIVE STATUS OR ANYO;; NON-INTERRUPTABLE FUNCTION AND WAIT FOR ITS COMPLETION.E; ; INPUTS:R; R1 = FUNCTION CODE; R2 = CSR ADDRESS; R5 = UCB ADDRESS;M ; OUTPUTS:"; R1 = CONTENTS OF RLCS (TESTED); FUNCTION EXECUTEDG;->DLRST: MOV #RST!STS!MRK,RLDA(R2) ;SET MESSAGE CODES IN RLDA( CALL DLDST ;DO THE DRIVE RESET FIRST:DLGST: MOV #STS!MRK,RLDA(R2) ;SET MESSAGE CODES IN RLDA.DLDST: MOV #GSTS,R1 ;SET GET STATUS FUNCTION)DLXCT: MOV R1,-(SP) ;SAVE FUNCTION CODE 1 MOVB U.UNIT(R5),1(SP);MERGE CURRENT DRIVE BITSW MOV (SP)+,(R2) ;LOAD RLCS610$: BIT #ERR!CRDY,(R2) ;FUNCTION COMPLETE OR ERROR? BEQ 10$ ;IF EQ NOE. MOV (R2),R1 ;SAVE RLCS AND TEST FOR ERRORS  RETURN ; ;+'; **-DLDIFF-RL11/RL01 DISK CONTROLLER!*; CYLINDER ADDRESS DIFFERENCE CALCULATOR; >; THIS SUBROUTINE CALCULATES THE DIFFERENCE WORD USED IN THEB; SEEK OPERATION. IF A HEADER CANNOT BE READ AFTER 16. RETRIES,C; AN ERROR WILL BE LOGGED AND A ONE CYLINDER REVERSE SEEK WILL BER?; ISSUED. THE SEEK IS FOLLOWED BY A READ HEADERS TO CAUSE AN; INTERRUPT.;( ; INPUTS: ; R0 = DESIRED DISK ADDRESS ;Q ; OUTPUTS:; R1 = DIFFERENCE WORD&; RLDA = LOADED WITH DIFFERENCE WORD; IF EQ NO SEEK IS NECESSARY;-9DLDIFF: MOV #RETRY*2,-(SP) ;SET READ HEADER RETRY COUNTS310$: MOV #RDH,00x`a4a_c_d_kR1 ;CODE FOR READ HEADERS FUNCTION$ CALL DLXCT ;EXECUTE THE FUNCTION' BPL 20$ ;IF PL FUNCTION EXECUTED OKR DEC (SP) ;ANY RETRIES LEFT?R BGT 10$ ;IF GT YES: CMP (SP)+,(SP)+ ;REMOVE RETRY COUNT AND CALLERS ADDRESS! CALL DLDVER ;LOG HEADER ERRORU CALL DLRST ;RESET DRIVED7 MOV #REV,RLDA(R2) ;LOAD REVERSE SEEK DIFFERENCE WORD + MOV #SEEK,R1 ;GET CODE FOR SEEK FUNCTION 0 MOV #IE.VER&377,R0 ;ASSUME THE SEEK WILL FAIL  CALL DLXCT ;EXECUTE THE SEEK BMI DLFIN ;IF MI WE FAILED1 BIC #^C,R1 ;GET ONLY UNIT SELECT BITST- BIS #IE!RDH,R1 ;LOAD CODES FOR READ HEADERC= MOVB #RVSK,U.CW2+1(R5) ;INDICATE REVERSE SEEK IN PROGRESSYA MOVB S.VITM(R4),S.VCTM(R4) ;SET DEVICE TIMEOUT COUNTER ;GM102CITM3=.-4 ;GM102OCTM4=.-2 ;GM102R. MOV R1,(R2) ;LOAD FUNCTION AND GO ;**-1#  RETURN ;WAIT FOR THE INTERRUPTC% 20$: TST (SP)+ ;REMOVE RETRY COUNT3(  MOV RLMP(R2),R1 ;RETREIVE HEADER WORD+ DLDIF0: BIC #77,R0 ;MASK OUT SECTOR BITSI  BIC #77,R1 ;...C' CMP R0,R1 ;DO WE NEED TO DO A SEEK? BEQ 40$ ;IF EQ NO * MOV R0,-(SP) ;SAVE DESIRED DISK ADDRESS) BIC #^C<100>,(SP) ;ISOLATE SURFACE BIT* ASR (SP) ;PUT INTO THE PROPER POSITION ASR (SP) ;...0# BIC #100,R0 ;REMOVE SURFACE BIT4 BIC #100,R1 ;...+ SUB R0,R1 ;SUBTRACT DESIRED FROM ACTUAL1'; BEQ 30$ ;IF EQ ONLY CHANGE SURFACE& BCC 30$ ;IF CC ACTUAL .GE. DESIRED6 NEG R1 ;ACTUAL < DESIRED, MAKE POSITIVE DIFFERENCE3 BIS #SN,R1 ;SET SIGN FOR MOVE TO CENTER OF DISK30$: INC R1 ;SET MARKER BIT% BIS (SP)+,R1 ;MERGE IN SURFACE BITR( MOV R1,RLDA(R2) ;LOAD DIFFERENCE WORD40$: RETURN ;L !;+'"; **-DLDXXX-RL11/RL01 DISK CONTROLLERI#; ERROR LOGGING ROUTINES$;#D%; THIS ROUTINE IS CALLED WHENEVER A DEVICE ERROR OR DEVICE TIMEOUTF&; OCCURS. A CORE BLOCK THE SIZE OF THE REGISTER BUFFER IS ALLOCATEDD'; AND THE UNIBUS REGISTERS ALONG WITH THE DRIVE STATUS INFORMATIOND(; ARE TRANSFERED INTO THE CORE BLOCK AND THE APPROPRIATE EXECUTIVE@); ERROR LOGGING ROUTINE IS CALLED. FINALLY, THE CORE BLOCK IS>*; DEALLOCATED AND THE CSR AND CONTROLLER INDEX ARE RESTORED.+; A,; IF FOR ANY REASON THE CORE BLOCK CANNOT BE ALLOCATED THEN THERD-; EXECUTIVE ERROR LOGGING ROUTINE WILL NOT BE CALLED AND THE ERRORC.; SEQUENCE NUMBER WILL BE UPDATED TO INDICATE THAT A MISSED ERROR /; CONDITION OCCURRED.T0; 1; INPUTS:B2; R2 = CSR ADDRESS3; R4 = SCB ADDRESS4;I 5; OUTPUTS:6; R0, R1 ARE DESTROYED7; R3 = CONTROLLER INDEXU8;-9 : .ENABL LSBOA:DLDVER: MOV DVERR,-(SP) ;ADDRESS OF EXEC ERROR ROUTINE ;GM102H< BR 10$ ; ;**-1XB<DLDTER: MOV DTOER,-(SP) ;ADDRESS OF EXEC TIMEOUT ROUTINE ;GM102?>10$: MOV #RLCNT*2,R1 ; GET NUMBER OF BYTES TO ALLOCATE ;**-1T0> CALL @ALOCB ;ALLOCATE A CORE BLOCK ;GM102.@ BCC 20$ ;IF CC BLOCK WAS ALLOCATED ;**-19@ INC @ERRSQ ;INDICATE A MISSED ERROR CONDITION ;GM102DC@ CMP (SP)+,DTOER ;ALLOCATION FAILURE, TIMEOUT IN PROGRESS? ;GM102YC BNE 30$ ;IF NE NO ;**-25C MOV @S.VKRB(R4),R2 ;RETRIEVE CSR ADDRESS ;GM102ECKRB10=.-2 ;GM1021E BIC #IE,(R2) ;;;CLEAR INTERRUPT ENABLE ;**-1EF MTPS #0 ;;;ALLOW INTERRUPTSR1G BR 30$ ;DON'T LOG ERROR IF ALLOCATION FAILURE ,H20$: MOV R0,R3 ;SET POINTER TO CORE BLOCK0H MOV @S.VKRB(R4),R2 ;GET CSR ADDRESS ;GM102HKRB11=.-2 ;GM1027J CALL REGPAS ;MOVE REGISTERS INTO CORE BLOCK ;**-1M&K MOV R0,R2 ;COPY CORE BLOCK ADDRESS0L CALL @(SP)+ ;CALL EXEC ERROR LOGGING ROUTINE+M MOV R2,R0 ;GET BACK CORE BLOCK ADDDRESST5N MOV #RLCNT*2,R1 ;GET NUMBER OF BYTES TO DEALLOCATE23N CALL @DEACB ;DEALLOCATE THE CORE BLOCK ;GM1023N30$: MOV S.VKRB(R4),R3 ;GET KRB ADDRESS ;GM102ONKRB12=.-2 ;GM102.Q MOV (R3),R2 ;RETRIEVE CSR ADDRESS ;**-2/R MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX2 S RETURN- T .DSABL LSB2UV;+BW; MOVE THE CONTROLLER/DRIVE REGISTERS INTO THE SPECIFIED BUFFER.X;E Y; INPUTS:SZ; R2 = CSR ADDRESS[; R3 = BUFFER ADDRESSI00xha``t`TADATADATADATADATADATA\;-]#^REGPAS: MOV (R2),(R3)+ ;MOVE RLCST _ MOV RLBA(R2),(R3)+ ;MOVE RLBA ` MOV RLDA(R2),(R3)+ ;MOVE RLDA a MOV RLMP(R2),(R3)+ ;MOVE RLMPb CLR (R3)+ ;ASSUME NO RLBAE0c BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST?d BEQ 10$ ;IF EQ NO2"e MOV RLBAE(R2),-2(R3);MOVE RLBAE&f10$: CLR (R3)+ ;EXTRA WORD IS BLANK1g CALL DLGST ;EXECUTE GET DRIVE STATUS FUNCTIONO'h MOV RLMP(R2),(R3) ;SAVE DRIVE STATUSE i RETURN ;Ejk;+*l; **-DLVV-PROCESS VOLUME VALID FUNCTIONSm;E=n; THIS ROUTINE WILL VALIDATE VOLUME VALID AND HANDLE DEVICEM/o; SPECIFIC VOLUME VALID AND SIZING FUNCTIONS.)p;V q; INPUTS:Vr; R1 = I/O PACKET ADDRESSs; R4 = SCB ADDRESSt; R5 = UCB ADDRESSu;1 v; OUTPUTS:8w; IF THIS IS A TRANSFER FUNCTION ONLY R0 IS DESTROYED.9x; IF THIS IS A VOLUME VALID FUNCTION, THE PROPER ACTION8y; IS TAKEN AND CONTROL IS TRANSFERED DIRECTLY TO THE!z; PROPER PLACE IN THE DRIVER.{;-|5|DLVV: CALL @VOLVD ;VALIDATE VOLUME VALID ;GM102S%~ BCS 20$ ;IF CS WE FAILED ;**-1V( TST R0 ;IS THIS A TRANSFER FUNCTION? BMI 40$ ;IF MI YES0 MOV @S.VKRB(R4),R2 ;GET CSR ADDRESS ;GM102KRB13=.-2 ;GM102. MOV R1,R3 ;COPY I/O PACKET ADDRESS ;**-1* CALL DLRST ;RESET DRIVE AND GET STATUS" TST I.PRM+2(R3) ;SIZE THE DISK? BPL 10$ ;IF PL NOH TST (SP)+ ;REMOVE RETURN0 MOV #IE.SZE&377,R0 ;ASSUME NON-EXISTANT DRIVE% MOV (R2),R1 ;GET CONTENTS OF RLCS0 BIC #^C,R1 ;GET RID OF UNWANTED BITS) CMP #ERR!OPI,R1 ;DOES THE DRIVE EXIST?- BEQ 30$ ;IF EQ NO * MOV #IS.SUC&377,R0 ;YES, ASSUME SUCCESS) CALLR DLPASS ;PASS REGISTERS AND EXIT 210$: BIT #VV$SET,I.PRM+2(R3) ;SET VOLUME VALID? BEQ 25$ ;IF EQ NO . MOV RLMP(R2),R1 ;GET THE STATUS INFORMATION& BIT #DRDY,(R2) ;IS THE DRIVE READY? BEQ 15$ ;IF EQ NO- BIC #WLS!DT!HSS,R1 ;REMOVE IRRELEVANT BITS72 CMP #HH!BH!SLM,R1 ;HEADS, BRUSHES AND STATE OK? BEQ 25$ ;IF EQ YES.15$: MOV #IE.DNR&377,R0 ;SET DRIVE NOT READY920$: BICB #US.VV,U.STS(R5) ;CLEAR SOFTWARE VOLUME VALIDQ 25$: TST (SP)+ ;REMOVE RETURN30$: CALLR DLFIN ;FINISH UP40$: RETURN ;D;+); **-DLCHK-VALIDATE AND CONVERT THE LBNA;;; THIS ROUTINE IS CALLED FROM $DRQRQ TO DO LBN PROCESSINGF;; FOR DEVICES WHICH SUPPORT QUEUE OPTIMIZATION. IF BLKC2 ;; DETECTS AN ERROR IT WILL RETURN TO THE CORRECT PLACE IN ; $DRQRQ AFTER CALLING $IOALT.;S ; INPUTS:B; R1 = I/O PACKET ADDRESSV; R4 = SCB ADDRESS; R5 = UCB ADDRESS; ; OUTPUTS:9; IF THE CHECKS SUCCEED, THEN THE LBN IN THE I/O PACKET 6; IS REPLACED BY THE DISK ADDRESS. R1 IS PRESERVED.;:; IF THE CHECKS FAIL, THE $IOALT IS ENTERED WITH A FINAL9; STATUS OF IE.BLK AND A RETURN TO THE CORRECT PLACE IN; $DRQRQ IS EXECUTED.P;U!; R0, R2, AND R3 ARE DESTROYED.E; >; NOTE: ALL FUNCTIONS PUT INTO THE DRIVER QUEUE ARRIVE HERE.?; THESE FUNCTIONS INCLUDE, IO.ATT, IO.DET, AND ACP FUNCTIONS.S;-;DLCHK: CMPB #IO.ATT/256.,I.FCN+1(R1) ;IS THIS AN ATTACH?T& BEQ 30$ ;IF EQ YES, LEAVE IT ALONE4 CMPB #IO.DET/256.,I.FCN+1(R1) ;IS THIS A DETACH?& BEQ 30$ ;IF EQ YES, LEAVE IT ALONE) MOV I.FCN(R1),-(SP) ;GET FUNCTION CODE & BIC #7,(SP) ;REMOVE QUALIFIER BITS2 CMP #IO.STC,(SP)+ ;IS IT A SET CHARACTERISTICS?& BEQ 30$ ;IF EQ YES, LEAVE IT ALONE6 MOV I.PRM+12(R1),R0 ;RETRIEVE STARTING BLOCK NUMBER- MOV R1,R3 ;ASSUME PHYSICAL BLOCK FUNCTIONE8 BITB #IO.WPB&377,I.FCN(R1) ;PHYSICAL BLOCK FUNCTION? BNE 20$ ;IF NE YES4 CALL @BLKC2 ;CHECK LOGICAL BLOCK NUMBER ;GM102: CMPB #IO.WLB/256.,I.FCN+1(R3) ;WRITE FUNCTION? ;**-1 BNE 10$ ;IF NE NOE: BITB #IO.WLT&377,I.FCN(R3) ;WRITE LAST TRACK FUNCTION? BNE 10$ ;IF NE YES1 MOV R0,I.PRM+6(R3) ;SAVE STARTING BLOCK NUMBERR. ADD #20.,(R1) ;ADD 1 TRACKS WORTH OF BLOCKS& MOV R3,R1 ;COPY I/O PACKET ADDRESS4 CALL @BLKC2 ;CHECK LOGICAL BLOCK NUMBER ;GM102D MOV I.PRM+6(R3),R0 ;RESTORE ORIGINAL STARTING BLOCK NUMBER ;**-1)10$: ASL R0 ;CONVER00xpa4a_c_d_kT BLOCKS TO SECTORS 20$: CLR R2 ;NO HIGH BITS5 CALL @CVLBN ;CONVERT LBN TO DISK ADDRESS ;GM102O, ASH #6,R1 ;POSITION SURFACE BIT ;**-1( BIS R1,R0 ;MERGE SURFACE WITH SECTOR7 MOV R0,I.PRM+12(R3) ;SAVE SECTOR AND SURFACE ADDRESSV6 MOV R2,I.PRM+10(R3) ;SAVE STARTING CYLINDER ADDRESS& MOV R3,R1 ;COPY I/O PACKET ADDRESS30$: RETURN ;;+.; **-DLKRB-CONTROLLER ONLINE/OFFLINE ROUTINE;M=; THIS ROUTINE WILL HANDLE RECONFIGURATION CALLS FOR ONLINE:D; CONTROLLER AND OFFLINE CONTROLLER FOR THE RL11, RLV11 AND RLV12.; E; FOR ONLINE, IT WILL DETERMINE IF THE RLBAE REGISTER EXISTS AND IF B; SO, IT WILL INSURE THAT THE ADDRESS BITS ARE REPLICATED IN THE; CSR.;R(; FOR OFFLINE, KS.EXT WILL BE CLEARED.;, ; INPUTS:;; R2 = KRB ADDRESS; R3 = CTB ADDRESS; C=1 IF OFFLINE REQUEST; C=0 IF ONLINE REQUEST+; ; OUTPUTS::; FOR ONLINE, KS.EXT WILL BE SET IF THE CONTROLLER HAS A; VALID RLBAE.#; FOR OFFLINE, KS.EXT IS CLEARED.A;-0DLKRB: BIC #KS.EXT,K.STS(R2) ;ASSUME NO RLBAE" BCS 20$ ;IF CS OFFLINE REQUEST) TST EXEVEC ;IF DONE ALREADY ;GM102  BNE 2$ ;SKIP THIS ;GM102# MOV R2,-(SP) ;SAVE R2 ;GM102# MOV R3,-(SP) ;SAVE R3 ;GM102L+ MOV KINAR6,-(SP) ;SAVE KINAR6 ;GM102E8 MOV @#112,R0 ;GET ADDRESS OF TABLE OF ENTRIES ;GM102C MOV (R0),R0 ;GET ADDRESS OF APR BIAS (1ST WORD IN TABLE) ;GM102L; MOV (R0),KINAR6 ;MAP COMMON THROUGH I-SPACE APR6 ;GM102F, MOV #EXEVEC,R3 ;POINT TO VECTOR ;GM1024 MOV #EXEVCL,R2 ;SPECIFY LENGTH OF VECTOR ;GM1020 CALL @#140004 ;TRANSLATE THE VECTOR ;GM102- MOV (SP)+,KINAR6 ;RESTOR KINAR6 ;GM1021& MOV (SP)+,R3 ;RESTORE R3 ;GM102& MOV (SP)+,R2 ;RESTORE R2 ;GM1023 MOV #SCBPAT,R0 ;GET PATCH TABLE ADDRESS ;GM102@/1$: MOV (R0)+,R1 ;MOVE TABLE ENTRY ;GM102, BEQ 2$ ;IF EQ END OF THE TABLE ;GM1023 MOV @(R0)+,(R1) ;IF NEQ START TO PATCH ;GM102N# BR 1$ ;COMPLETE IT ;GM102V;2$: BIT #FE.EXT,@FMASK ;IS THIS A 22-BIT SYSTEM? ;GM102E BEQ 20$ ;IF EQ NO ;**-18 CALL @SGFIN ;TURN NXM'S INTO SET CARRY BITS ;GM102. MOV (R2),R4 ;RETREIVE CSR ADDRESS ;**-1/ BIS #A16!A17,(R4) ;SET EXTENDED ADDRESS BITSS" CLR RLBAE(R4) ;CLEAR RLBAE BITS' BCS 10$ ;IF CS RLBAE DOES NOT EXIST$1 BIT #A16!A17,(R4) ;DID THE ADDRESS BITS CLEAR?Q BNE 10$ ;IF NE NOT1 BIS #KS.EXT,K.STS(R2) ;YES, SET RLBAE PRESENT 2 ADD K.OFF(R2),R2 ;CALCULATE OFFSET TO UCB TABLE6 MOV #RLBAE,KE.RHB(R2) ;SET BAE OFFSET IN DATA BASE,10$: BIC #A16!A17,(R4) ;RESET ADDRESS BITS20$: RETURN ; ;+(; **-DLUCB-UNIT ONLINE/OFFLINE ROUTINE;E=; THIS ROUTINE WILL HANDLE RECONFIGURATION CALLS FOR ONLINED3; UNIT AND OFFLINE UNIT FOR RL01 AND RL02 DRIVES.S; ?; FOR ONLINE, IF KS.EXT IS SET THEN DV.EXT IS ALSO SET. THISS=; IS DONE TO ELIMINATE UNNECESSARY CODE TO RETREIVE THE KRB) ; ADDRESS. ;R# ; FOR OFFLINE, DV.EXT IS CLEARED.E ;E ; INPUTS:E; R3 = CONTROLLER INDEX ; R4 = SCB ADDRESS; R5 = UCB ADDRESS; C=1 IF ONLINE REQUESTI; C=0 IF OFFLINE REQUEST; ; OUTPUTS:5; FOR ONLINE, DV.EXT IS SET IN THE UCB IF KS.EXT IS ; SET IN THE KRB.N#; FOR OFFLINE, DV.EXT IS CLEARED.I;-0DLUCB: BIC #DV.EXT,U.CW1(R5) ;ASSUME NO RLBAE" BCS 10$ ;IF CS OFFLINE REQUEST/ MOV S.VKRB(R4),R2 ;GET KRB ADDRESS ;GM102CKRB14=.-2 ;GM1028 BIT #KS.EXT,K.STS(R2) ;DOES THE RLBAE EXIST? ;**-1 BEQ 10$ ;IF EQ NO3. BIS #DV.EXT,U.CW1(R5) ;YES, SET BIT IN UCB 10$: RETURN ;!" .ENDN#QUESTI; C=0 IF OFFLINE REQUEST; ; OUTPUTS:5; FOR ONLINE, DV.EXT IS SET IN THE UCB IF KS.EXT IS ; SET IN THE KRB.N#; FOR OFFLINE, DV.EXT IS CLEARED.I;-0DLUCB: BIC #DV.EXT,U.CW1(R5) ;ASSUME NO RLBAE" BCS 10$ ;IF CS OFFLINE REQUEST/ MOV S.VKRB(R4),R2 ;GET KRB ADDRESS ;GM102CKRB14=.-2 ;GM1028 BIT #KS.EXT,K.STS(R2) ;DOES THE RLBAE EXIST? ;**-1 BEQ 10$ ;IF EQ NO3. BIS #00yxa``t`TADATADATADATADATADATA .TITLE DXDRVL .IDENT /06.02/#;BD; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;O ; H. J. LEV 16-JAN-75 ; P. J. BEZEREDI ; P. J. CARR ;  ; MODIFIED BY:T ;C' ; G. MARIGOWDA 4-AUG-86 V06.02D1 ; GM001 -- CONVERT TO USE EXEC VECTORINGL ; ;G#; RX01 - RX11 FLOPPY DISK DRIVER ;L; FUNCTIONS RECOGNIZED:>; IO.RPB - READ PHYSICAL BLOCK (MAY READ ANY SECTOR ON DISK)@; IO.WPB - WRITE PHYSICAL BLOCK (MAY WRITE ANY SECTOR ON DISK):; IO.WDD - WRITE DELETED DATA - WRITE ANY SECTOR ON DISK5; SETTING THE DELETED DATA MARK IN SECTOR HEADER ?; THE FOLLOWING TWO FUNCTION CODES OPERATE ON 256 WORD BLOCKS=; OF DATA (4 SECTORS) THE DRIVER AUTOMATICALLY INTERLEAVESD6 ; AND SKEWS SECTORS TO OPTIMIZE THE TRANSFER OF DATA9!; SO THAT A LONG READ/WRITE MAY BE DONE WITHOUT LOOSINGU9"; A REVOLUTION OF THE DISK. THE INTERLEAVE FACTOR IS 2 #; AND THE SKEW FACTOR IS 6.O.$; IO.RLB - READ LOGICAL BLOCKS OF 256. WORDS0%; IO.WLB - WRITE LOGICAL BLOCKS OF 256. WORDS.&; :'; IF DELETED DATA IS READ, THE STATUS CODE RETURNED WILL%(; BE IS.RDD, OTHERWISE IT IS IS.SUCI);D*1* .MCALL HWDDF$,PKTDF$,QIOSY$,SCBDF$ ; GM001 /, HWDDF$ ; DEFINE HARDWARE REGISTERS ;**-1K'- PKTDF$ ; DEFINE I/O PACKET OFFSETSA- QIOSY$ ; GM001/ - SCBDF$ ,,SYSDEF ; GM001/; ;**-10; EQUATED SYMBOLSR1; 2!3RETRY = 8. ; ERROR RETRY COUNTS/4DXNUM = 4 ; NUMBER OF REGISTERS TO ERROR LOGR56;O47; RX11 DEVICE REGISTER OFFSETS AND BIT DEFINITIONS8;L9%:RXCS = 0 ; CONTROL STATUS REGISTER ;RXDB = 2 ; DATA BUFFERI<UNIT = 20 ; UNIT SELECT BIT=DONE = 40 ; RX11 DONE">INTEBL = 100 ; INTERRUPT ENABLE0?TR = 200 ; RX11 TRANSFER READY BIT (CPU-SILO)!@INIT = 40000 ; INITIALIZE RX11YAB; C; FUNCTION CODESD;DEGO = 1 ; GO BITFFILL = 0+GO ; FILL SILOGEMPTY = 2+GO ; EMPTY SILO HWRITE = 4+GO ; WRITE A SECTORIREAD = 6+GO ; READ A SECTORJRDSTS = 12+GO ; READ STATUS%KWRTDD = 14+GO ; WRITE DELETED DATAO"LRDERC = 16+GO ; READ ERROR CODEMN;G#O; STATUS REGISTER BIT DEFINITIONSP;=QRDD = 100 ; DELETED DATA READ;SRDY = 200 ; UNIT READY TU;PV; LOCAL DATAW; X;1JY; CONTROLLER TABLE AND RETRY COUNT TABLE ( INDEXED BY CONTROLLER NUMBER)Z; ;[RTTBL: .BLKW R$$X11 ; ERROR RETRY COUNT FOR CURRENT UNITL&\CSRSV: .BLKW R$$X11 ; CSR SAVE AREA\; ; GM001+\; MAKE GTPKT$ A LOCAL MACRO ; GM001D\; ; GM0015\ .MACRO GTPKT$ DEV,NCTRLR,ADDR,UCBSV,SUC ; GM001 \ CALL @GTPKT ; GM001\ .IF B ; GM001\ BCC 65535$ ; GM001\ RETURN ; GM001D\65535$: ; GM001\ .IFF ; GM001 \ BCS ADDR ; GM001\ .ENDC ; GM001\ .IF B ; GM001 \ $$$=0 ; GM001\ .IF B ; GM001U\ .IF EQ $$$ ; GM001!\ MOV R5,S.OWN(R4) ; GM0011\ .ENDC ; GM001\ .ENDC ; GM001\ .IFF ; GM001R \ .IF GT NCTRLR-1 ; GM001!\ MOV R5,UCBSV(R3) ; GM001 \ .IFF ; GM001 \ MOV R5,UCBSV ; GM001 \ .ENDC ; GM001\ .ENDC ; GM001\ .ENDM ; GM001\; ; GM0012\; EXECUTIVE ENTRY POINT VECTOR TABLE ; GM001\; ; GM001<\EXEVEC: .WORD 0 ; FLAG FOR VECTOR NOT YET FILLED ; GM001\ ; GM001 $\ALOCB: .WORD $ALOCB ; GM001$\BMSET: .WORD $BMSET ; GM001$\DEACB: .WORD $DEACB ; GM001$\DTOER: .WORD $DTOER ; GM001$\DVERR: .WORD $DVERR ; GM001$\ERRSQ: .WORD $ERRSQ ; GM001"\FORK: .WORD $FORK ; GM001$\GTPKT: .WORD $GTPKT ; GM001$\IODON: .WORD $IODON ; GM001$\VOLVD: .WORD $VOLVD ; GM001\; ; GM001$\KISR6: .WORD KISAR6 ; GM001\; 00ya4a_c_d_k ; GM001)\EXEVCL=<<<.-EXEVEC>/2>-1> ; GM001 \; ; GM001^; ;**-1_; DRIVER DISPATCH TABLE `; :` DDT$ DX,R$$X11,,,,NEW ;GENERATE DISPATCH TABLE ; GM001b ;**-1Gc;+1d; *** - DXINI FLOPPY DISK CONTROLLER INITIATORDe;SFf; THIS ROUTINE IS ENTERED FROM THE QIO DIRECTIVE WHEN AN I/O REQUESTIg; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPOGATE THEOFh; EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY,Gi; THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST. OTHERWISEJj; A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSHk; THE NEXT I/O OPERATION IS INITIATED. A RETURN TO THE CALLER IS THEN l; EXECUTED. m; n; INPUTS: Do; R5 - ADDRESS OF UCB WHICH IS ASSOCIATED WITH CONTROLLER TO BE INp;D q; OUTPUTS:>r; IF THE CONTROLLER ASSOCIATED WITH THE SPECIFIED UCB IS NOTCs; BUSY AND AN I/O REQUEST IS WAITING TO BE PROCESSED, THE REQUESTI@t; IS DEQUEUED AND THE DRIVER INITIATES THE REQUESTED FUNCTION.u;Ev;- w .ENABL LSBT:xDXINI: GTPKT$ DX,R$$X11 ; GET NEXT I/O PACKET TO PROCESSyz;E2{; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT|; "}; R1 - ADDRESS OF THE I/O PACKETB~; R2 - PHYSICAL UNIT NUMBER OF THE DEVICE TO PERFORM FUNCTION ON,; R3 - CONTROLLER NUMBER MULTIPLIED BY TWO; R4 - ADDRESS OF SCBL9; R5 - ADDRESS OF UCB FOR DEVICE TO PERFORM FUNCTION ONA; .; RX11 FLOPPY DISK I/O REQUEST PACKET FORMAT; #; WD. 00 -- I/O QUEUE THREAD WORDT1; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER3; WD. 02 -- ADDRESS OF TCB OF THE REQUESTING TASKOC; WD. 03 -- POINTER TO SECOND LUN WORD OF REQUESTING TASKS HEADER7; WD. 04 -- CONTENTS OF FIRST LUN WORD ( UCB ADDRESS) C; WD. 05 -- I/O FUNCTION CODE (IO.RLB, IO.RPB, IO.WLB, OR IO.WPB) 1; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK1; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCKID; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT +1400004; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE,; WD. 12 -- RELOCATION BIAS OF DATA BUFFER,; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER); WD. 14 -- NUMBER OF BYTES TO TRANSFERU ; WD. 15 -- NOT USED (IGNORED)7; WD. 16 -- LOW BYTE MUST BE ZERO, HIGH BYTE NOT USED-.; WD. 17 -- LOGICAL OR PHYSICAL BLOCK NUMBER; WD. 20 -- NOT USED;A'; DRIVER USAGE OF WORDS IN I/O PACKET77; I.PRM+6 (WD. 15) - STATUS REGISTER AFTER INTERRUPT/9; I.PRM+10 (WD. 16) - LOGICAL OR PHYSICAL SECTOR NUMBERD/; I.PRM+12 (WD. 17) - SIZE OF "THIS" TRANSFER6; I.PRM+14 (WD. 20) - PHYSICAL SECTOR NUMBER (1-26.)5; I.PRM+15 (WD. 20) - PHYSICAL TRACK NUMBER (0-77.)O;E;T; INITIALIZE DRIVER ;S-10$: MOV #RETRY,RTTBL(R3) ; SET RETRY COUNTR2 CALL @VOLVD ; VALIDATE VOLUME VALID ; GM001& BCS 16$ ; IF CS WE FAILED ;**-1 TST R0 ; TRANSFER FUNCTION?D BPL 16$ ; IF PL NO, TSTB I.PRM+10(R1) ; HIGH BLOCK SPECIFIED? BEQ 20$ ; NO15$: JMP 180$ ; YES, ERROR 16$: JMP 210$ ; EXIT+;D'; SET UP FIRST BLOCK OR SECTOR NUMBERR;(A20$: MOV I.PRM+12(R1),R0 ; GET PHYSICAL OR LOGICAL BLOCK NUMBERH1 MOV #128.,I.PRM+12(R1) ; PRESET TRANSFER SIZEA9 BITB #IO.RPB&377,I.FCN(R1) ; PHYSICAL BLOCK FUNCTION?  BNE 30$ ; YESL- ASL R0 ; CONVERT TO LOGICAL SECTOR NUMBER1 ASL R0 ; WHICH IS LBN*41%30$: MOV R0,I.PRM+10(R1) ; STORE ITB+ MOV #RDSTS,R0 ; GET READ STATUS FUNCTIONG TSTB U.UNIT(R5) ; UNIT 1? BEQ 31$ ; IF EQ NO* BIS #UNIT,R0 ; YES, SET UNIT SELECT BIT431$: MOVB S.CON(R4),R3 ; RETREIVE CONTROLLER INDEX( MOV R0,CSRSV(R3) ; SAVE THIS FUNCTION, MOVB #2,RTTBL+1(R3) ; FLAG THE GET STATUS* MOV S.CSR(R4),R2 ; RETREIVE CSR ADDRESS# MOV R0,(R2) ; DO THE GET STATUSC! JMP 155$ ; START THE FUNCTIONR032$: MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS+ BIT #RDY,I.PRM+6(R1); IS THE UNIT READY?) BNE 35$ ; IF NE YEST(33$: CALL LOGERR ; LOG UNIT NOT READY5 MOV #IE.DNR&377,R0 ; SET UNIT NOT READY ERROR CODEN JMP 200$ ; GOOD-BYE!035$: MOV S00ya``t`TADATADATADATADATADATA.PKT(R4),R3 ; GET I/O PACKET ADDRESS1 CALL TRKSEC ; CONVERT BLOCK # TO TRACK/SECTORN$ BCS 15$ ; IF CS BAD BLOCK NUMBER( MOV S.CSR(R4),R2 ; GET ADDRESS OF CSR3 CMPB #IO.WLB/256.,I.FCN+1(R3) ; WRITE FUNCTION?J BNE 140$ ;IF NE NO;R; FILL SILO BEFORE WRITE;/8 CALL SETBUF ; SET UP BUFFER POINTER AND MAPPING REGI. MOV #FILL,(R2) ; SET "FILL BUFFER" FUNCTION+70$: CLR R3 ; ASSUME NO DATA TO TRANSFERR# DEC R1 ; MORE DATA TO TRANSFER? BLT 74$ ; NO% MOVB (R0)+,R3 ; YES, GET NEXT BYTE ,74$: BITB #TR!DONE,(R2) ; CONTROLLER DONE? BMI 75$ ; IF MI YESB BEQ 74$ ; IF EQ NO BR 90$ ; SILO IS FULLR/75$: MOVB R3,RXDB(R2) ; PUT NEXT BYTE IN SILON( BR 70$ ; AND WAIT TILL IT'S ACCEPTED&90$: TST R1 ; ALL BYTES TRANSFERED? BMI 130$ ; IF MI YES'95$: JMP DXRTY ; RETRY LAST FUNCTION;V; EMPTY SILO AFTER READF;U5100$: MOV #EMPTY,(R2) ; SET "EMPTY BUFFER" FUNCTION8 CALL SETBUF ; SET BUFFER POINTER AND MAPPING REGISTE-110$: BITB #TR!DONE,(R2) ; CONTROLLER DONE?  BMI 111$ ; IF MI YES BEQ 110$ ; IF EQ NOM BR 120$ ; SILO IS EMPTYO2111$: MOVB RXDB(R2),R3 ; GET NEXT BYTE FROM SILO DEC R1 ; DO WE WANT IT? BLT 110$ ; NO ( MOVB R3,(R0)+ ; YES, PUT IT IN BUFFER BR 110$ ; GET NEXT BYTE '120$: TST R1 ; ALL BYTES TRANSFERED?A BGT 95$ ; IF GT ERRORT, MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS' CALL NXTSEC ; UPDATE TO NEXT SECTORL BNE 35$ ; IF NE CONTINUE JMP 193$ ; FINISHED1;I+; INITIATE TRANSFER BETWEEN SILO AND DISK1;;1130$: MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS ( MOV #WRITE,R0 ; ASSUME WRITE FUNCTION( MOV I.FCN(R3),R1 ; COPY FUNCTION CODE% BIC #7,R1 ; REMOVE QUALIFIER BITSV' CMP #IO.WDD,R1 ; WRITE DELETED DATA?  BNE 141$ ; IF NE NO4 MOV #WRTDD,R0 ; SET "WRITE DELETED DATA" FUNCTION BR 141$ ;(140$: MOV #READ,R0 ; SET READ FUNCTION!141$: TSTB U.UNIT(R5) ; UNIT 1?S BEQ 142$ ; IF EQ YES+ BIS #UNIT,R0 ; YES, SET TO SELECT UNIT 15142$: MOVB S.CON(R4),R1 ; RETREIVE CONTROLLER INDEX$3 MOV R0,CSRSV(R1) ; SAVE FUNCTION AND UNIT NUMBER#! CLRB RTTBL+1(R1) ; RESET FLAGS' MOV R0,(R2) ; INITIATE THE FUNCTION4143$: BITB #TR!DONE,(R2) ; TRANSFER READY OR DONE?# BMI 150$ ; IF MI TRANSFER READY  BEQ 143$ ; IF EQ LOOP,' BR 95$ ; ERROR, NO TRANSFER REQUEST8150$: MOVB I.PRM+14(R3),RXDB(R2) ; LOAD SECTOR NUMBER4151$: BITB #TR!DONE,(R2) ; TRANSFER READY OR DONE?#  BMI 152$ ; IF MI TRANSFER READYE  BEQ 151$ ; IF EQ LOOPS'  BR 95$ ; ERROR, NO TRANSFER REQUEST7 152$: MOVB I.PRM+15(R3),RXDB(R2) ; LOAD TRACK NUMBERC5 155$: MOVB S.ITM(R4),S.CTM(R4) ; SET TIME OUT COUNTA3  CALL @BMSET ;SET I/O ACTIVE IN BITMAP ; GM001E4 BIS #INTEBL,(R2) ;;; SET INTERRUPT ENABLE ;**-1 ; GM001Q;+ ; GM001R8; DXKRB-CONTROLLER ONLINE/OFFLINE ROUTINE ; GM001; ; GM001;- ; GM001N2DXKRB: BCS 2$ ;IF CS OFFLINE REQUEST ; GM001* TST EXEVEC ;IF ALREADY DONE ; GM001! BNE 2$ ;SKIP THIS ; GM001 $ MOV R2,-(SP) ;SAVE R2 ; GM001$ MOV R3,-(SP) ;SAVE R3 ; GM001, MOV KINAR6,-(SP) ;SAVE KINAR6 ; GM0019 MOV @#112,R0 ;GET ADDRESS OF TABLE OF ENTRIES ; GM001BD MOV (R0),R0 ;GET ADDRESS OF APR BIAS (1ST WORD IN TABLE) ; GM001< MOV (R0),KINAR6 ;MAP COMMON THROUGH I-SPACE APR6 ; GM001- MOV #EXEVEC,R3 ;POINT TO VECTOR ; GM001-5 MOV #EXEVCL,R2 ;SPECIFY LENGTH OF VECTOR ; GM001U1 CALL @#140004 ;TRANSLATE THE VECTOR ; GM001;/ MOV (SP)+,KINAR6 ;RESTORE KINAR6 ; GM001V( MOV (SP)+,R3 ;RESTORE R3 ; GM001' MOV (SP)+,R2 ;RESTORE R2 ; GM001,2$: RETURN ; GM001-; DXPWF - POWER FAIL ENTRY POINT ;**-1I=; POWER FAIL IS HANDLED BY THE DEVICE TIMING OUT, THEREFORED=; NO WNRK IS DNNE HERE. IT WILL BE HANDLED WHEN THE DEVICEA; TIME OUT ENTRY IS EXECUTED.R;IDXPWF: ; GM001V; ; GM001+; UNIT STATUS CHANGE ROUTINE ; GM001;DXUCB: 00ya4a_c_d_k; GM001M ; GM001N; ;**-1"; DXCAN - CANCEL I/O ENTRY POINT6; CANCEL I/O IS A NOP OP FOR FILE STRUCTURED DEVICES;DXCAN: RETURN ;;;+:; *** - $DXINT - RX11 FLOPPY DISK INTERRUPT ENTRY POINT ;A!;-8" INTSE$ DX,PR5,R$$X11 ;;; GENERATE INTERRUPT SAVE CODE!# MOV R3,-(SP) ;;; SAVE REGISTERD'$ MOV U.SCB(R5),R4 ;;; GET SCB ADDRESS.% MOV S.PKT(R4),R3 ;;; GET I/O PACKET ADDRESS'& MOV S.CSR(R4),R4 ;;; GET CSR ADDRESSE7' MOV RXDB(R4),I.PRM+6(R3) ;;; SAVE CONTROLLER STATUS $( MOV (SP)+,R3 ;;; RESTORE REGISTER*) BIC #INTEBL,(R4) ;;; DISABLE INTERRUPTS4) CALL @FORK ;;; CREATE A SYSTEM PROCESS ; GM001)+ MOV R4,R2 ; COPY CSR ADDRESS ;**-1X%, MOV U.SCB(R5),R4 ; GET SCB ADDRESS+- MOVB S.CON(R4),R3 ; GET CONTROLLER INDEXE. TST (R2) ; ANY ERRORS?/ BPL 160$ ; IF PL NOE-0 BITB #2,RTTBL+1(R3) ; GET STATUS FUNCTION?1 BEQ 156$ ; IF EQ NO 2 JMP 33$ ; DRIVE NOT READYR'3156$: CALL LOGERR ; LOG DEVICE ERROR(4 BR DXRTY ; RETRY FUNCTIONO55160$: BITB #1,RTTBL+1(R3) ; INITIALIZE IN PROGRESS?B6 BNE 170$ ; IF NE YES-7 BITB #2,RTTBL+1(R3) ; GET STATUS FUNCTION?M8 BEQ 161$ ; IF EQ NOV#9 JMP 32$ ; TEST IF UNIT IS READY6:161$: MOV S.PKT(R4),R3 ; RETREIVE I/O PACKET ADDRESS); CMPB #IO.RLB/256.,I.FCN+1(R3) ; READ?;< BNE 165$ ; IF NE NO = JMP 100$ ; GO EMPTY SILO,>165$: CALL NXTSEC ; UPDATE TO NEXT SECTOR? BEQ 195$ ; ALL DONE "@170$: JMP 35$ ; WRITE MORE DATA0A180$: MOV #IE.BLK&377,R0 ; SET BAD BLOCK ERROR B BR 210$ ;I4C190$: MOV #IE.VER&377,R0 ; SET UNRECOVERABLE ERROR D BR 200$ ;SCE193$: BITB #IO.RPB&377,I.FCN(R3) ; READ PHYSICAL BLOCK FUNCTION?Q0F BEQ 195$ ; NO, THEN IGNORE DELETED DATA MARK<G MOV #IS.RDD&377,R0 ; YES, DEFAULT ON READ TO DELETED DATA/H BIT #DD,I.PRM+6(R3) ; WAS DELETED DATA READ? I BNE 200$ ; YES3J195$: MOV #IS.SUC&377,R0 ; NO, SET NORMAL SUCCESSX1K200$: MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS ,L MOV I.PRM+4(R1),R1 ; SET BYTES TRANSFERED9M SUB U.CNT(R5),R1 ; CALCULATE BYTES ACTUALLY TRANSFERED&0N MOVB S.CON(R4),R3 ; RETREIVE CONTROLLER INDEX,O MOVB RTTBL(R3),R2 ; SET FINAL RETRY COUNT/P BIS #RETRY*256.,R2 ; SET INITIAL RETRY COUNTG+P210$: CALL @IODON ; SET DONE ; GM001 /R JMP DXINI ; TRY FOR ANOTHER REQUEST ;**-1DS;MT;+1U; *** - DXOUT - FLOPPY DISK TIMEOUT ENTRY POINT9V;-W,XDXOUT: CALL LOGTMO ;;; LOG DEVICE TIMEOUTYZ;K[; RETRY LAST FUNCTION \;S5]DXRTY: MOVB S.CON(R4),R3 ; RESTORE CONTROLLER INDEXB,^ MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS*_ BITB #IQ.X,I.FCN(R1) ; INHIBIT RETRIES?` BNE 190$ ; IF NE YES%a DECB RTTBL(R3) ; ANY RETRIES LEFT?Sb BEQ 190$ ; NO, ERROR8c MOVB #1,RTTBL+1(R3) ; YES, SET INITIALIZE IN PROGRESS+d MOV #INIT,CSRSV(R3) ; SAVE FUNCTION CODE *e MOV #INIT,(R2) ; INITIALIZE RX01 DRIVESf JMP 155$ ; AND DO IT g .DSABL LSBhi;+j; **-LOGERR-LOG DEVICE ERROR k; **-LOGTMO-LOG DEVICE TIMEOUTl;?m; THESE ROUTINES WILL ALLOCATE A CORE BLOCK, FILL IT WITH THEV>n; REGISTER INFORMATION, CALL THE APPROPRIATE EXECUTIVE ERRORBo; LOGGING ROUTINE, DEALLOCATE THE CORE BLOCK, AND RETURN BACK TOp; THE CALLER.q;Q r; INPUTS:Es; R3=CONTROLLER INDEXRt; R4=SCB ADDRESSu; R5=UCB ADDRESSv;# w; OUTPUTS:x; R2=CSR ADDRESSy; R4=SCB ADDRESSz; R5=UCB ADDRESS{;S |; R0, R1 AND R3 ARE DESTROYED.};-~  .ENABL LSB*7LOGERR: MOV DVERR,-(SP) ; LOG DEVICE ERROR ; GM001T BR 10$ ; ;**-1S;LOGTMO: MOV DTOER,-(SP) ;;; LOG DEVICE TIMEOUT ; GM001I?10$: MOV #DXNUM*2,R1 ; GET NUMBER OF BYTES TO ALLOCATE ;**-1T4 CALL @ALOCB ; ALLOCATE THE ERROR BLOCK ; GM001  BCC 20$ ; IF CC OK ;**-11 INC @ERRSQ ; INDICATE A MISSED ERRO ; GM001 ) CMP (SP)+,DTOER ; TIMEOUT? ; GM001C  BNE 30$ ; IF NE NO ;**-25 BIC #INTEBL,@S.CSR(R4) ;;; CLEAR INTERRUPT ENABLE.  MTPS #0 ;;; ALLOW INTERRUPTS  BR 30$ ;+20$: MOV R0,R1 ; COPY CORE BLOCK ADDRESS0* MOV S.CSR(R4),R2 ; RETREIVE CSR ADDRESS$ MOV (R2),(R00ya``t`TADATADATADATADATADATA1) ; SAVE CSR CONTENTS- BIS CSRSV(R3),(R1)+ ; SET BITS 0-4 IN RXCSL! MOV RXDB(R2),(R1)+ ; SAVE RXDBL, MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS% MOV I.PRM+6(R3),(R1)+ ; SAVE RXESI5 MOV #RDERC,(R2) ; EXECUTE READ ERROR CODE FUNCTIONT(25$: BITB #DONE,(R2) ; WAIT UNTIL DONE BEQ 25$ ; IF EQ NO  MOV RXDB(R2),(R1) ; SAVE RXER& MOV R0,R2 ; GET CORE BLOCK ADDRESS CALL @(SP)+ ; LOG THE ERROR,+ MOV R2,R0 ; GET BACK CORE BLOCK ADDRESSR6 MOV #DXNUM*2,R1 ; GET NUMBER OF BYTES TO DEALLOCATE6 CALL @DEACB ; DEALLOCATE THE ERROR BLOCK ; GM001730$: MOV S.CSR(R4),R2 ; RETREIVE CSR ADDRESS ;**-1R  RETURN ;K  .DSABL LSBM;+@; *** - TRKSEC - CONVERT LOGICAL OR PHYSICAL BLOCK NUMBER TO; TRACK-SECTOR PAIR 5; FROM ALGORITHM BY J GILBERT MODIFIED BY H. JACOBS;R ; INPUT:; R3 - I/O PACKET ADDRESS -; I.PRM+10(R3) - LOGICAL OR PHYSICAL SECTORH;O ; OUTPUT:,!; I.PRM+14(R3) - SECTOR (1-26.) ; I.PRM+15(R3) - TRACK (0-77.); R3 - UNCHANGED; C CLEAR - VALID BLOCKA2; C SET - BAD BLOCK NUMBER (PHYSICAL OR LOGICAL);E;-=TRKSEC: MOV I.PRM+10(R3),R1 ; GET LOGICAL OR PHYSICAL BLOCK MOV #8.,R0 ; SET LOOP COUNTT MOV #6400,R2 ; SET DIVISORE,1$: CMP R2,R1 ; DOES 26 GO INTO DIVIDEND?# BHI 2$ ; BRANCH IF NOT, C CLEAR) SUB R2,R1 ; SUBTRACT 26 FROM DIVIDENDR SEC ; SET CARRY+2$: ROL R1 ; SHIFT DIVIDEND AND QUOTIENTP DEC R0 ; DONE? BGT 1$ ; NO, LOOP! MOVB R1,R0 ; GET TRACK NUMBER  CLRB R1 ; CLEAR TRACK NUMBER& SWAB R1 ; SHIFT DONE SECTOR NUMBER7 BITB #IO.RPB&377,I.FCN(R3) ; PHYSICAL BLOCK WANTED?R BNE 10$ ; YES ' CMP #12.,R1 ; NO, C=1 IF 13<=R1<=25L) ROL R1 ; DOUBLE FOR INTERLEAVE FACTOR" ASL R0 ; ADD TRACK -TRACK SKEW ADD R0,R1 ; SKEW BY 2*TRACKN ADD R0,R1 ; SKEW BY 4*TRACKT ADD R0,R1 ; SKEW BY 6*TRACK;! ASR R0 ; RESTORE TRACK NUMBERI MOV #26.,R2 ; SET MODULUS 75$: SUB R2,R1 ; MODULO SECTOR INTO RANGE -26. TO -1.A) BGE 5$ ; LOOP TILL REMAINDER GOES NEGR& ADD R2,R1 ; CONVERT TO RANGE 0-25.# INC R0 ; LBN0 STARTS ON TRACK 1Y'10$: INC R1 ; CONVERT TO RANGE 1-26.+ MOV R1,I.PRM+14(R3) ; SAVE SECTOR NUMBERR+ MOVB R0,I.PRM+15(R3) ; SAVE TRACK NUMBERL< CMP #77.*256.,I.PRM+14(R3) ; IS IT A VALID TRACK/SECTOR?  RETURN ; ;+9; *** - NXTSEC - UPDATE BLOCK NUMBER , BUFFER ADDRESSS; AND BUFFER POINTER;, ; INPUT:; R3 - I/O PACKET ADDRESSD; R5 - UCB ADDRESS'; I.PRM+10(R3) - CURRENT BLOCK NUMBERI8; I.PRM+12(R3) - BYTES TRANSFERED DURING LAST FUNCTION&; U.CNT(R5) - BYTES LEFT TO TRANSFER; U.BUF(R5) - BUFFER ADDRESS; ; OUTPUT:R'; I.PRM+10(R3) - UPDATED BLOCK NUMBER0%; U.BUF(R5) - UPDATED BY 128. BYTESC5; U.CNT(R5) - UPDATED BY NUMBER OF WORDS TRANSFERED? ; Z SET - ALL BYTES TRANSFERED$; Z CLEAR - MORE BYTES TO TRANSFER ; C CLEAR - VALID TRACK/SECTOR; C SET - BAD BLOCK NUMBER;I;+0NXTSEC: INC I.PRM+10(R3) ; UPDATE BLOCK NUMBER0 ADD #2,U.BUF(R5) ; UPDATE MEMORY BLOCK NUMBER> SUB I.PRM+12(R3),U.CNT(R5) ; UPDATE BYTES LEFT TO TRANSFER  RETURN ; ;+C; *** - SETBUF - SET UP BUFFER POINTER FOR CPU - SILO TRANSFERSK;E ; INPUT:; R3 - I/O PACKET ADDRESSC; R5 - UCB ADDRESS;Y ; OUTPUT:R$; I.PRM+12(R3) - BYTES TO TRANSFER; R0 - BUFFER ADDRESS ; R1 - BYTES TO TRANSFER;A;-1SETBUF: MOV U.BUF+2(R5),R0 ; GET BUFFER ADDRESSI/ MOV #128.,R1 ; DEFAULT TO 128. BYTE TRANSFER 2 CMP U.CNT(R5),R1 ; 128. BYTES LEFT TO TRANSFER? BHIS 10$ ; YES, MOV U.CNT(R5),R1 ; NO, GET RESIDUAL COUNT410$: MOV R1,I.PRM+12(R3) ; STORE BYTES TO TRANSFER9 MOV U.BUF(R5),@KISR6 ; SET MAPPING REGISTER ; GM001U RETURN ; ;**-1 .END5 - UCB ADDRESS;Y ; OUTPUT:R$; I.PRM+12(R3) - BYTES TO TRANSFER; R0 - BUFFER ADDRESS ; R1 - BYTES TO TRANSFER;A;-1SETBUF: MOV U.BUF+2(R5),R0 ; GET BUFFER ADDRESSI/ MOV #128.,R1 ; DEFAULT TO 128. BYTE TRANSFER 2 CMP U.CNT00za4a_c_d_k% .TITLE SAVXT - DW/DZ COMMON DRIVER .IDENT /01.06/O;I7; COPYRIGHT (C) 1982 BY DIGITAL EQUIPMENT CORPORATION:; ALL RIGHTS RESERVED.;S>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;I ; . ; P. J. BEZEREDI / I. P. ZATKOVICH 05-MAY-82 ;M ; MODIFIED BY: ; ; T. LEKAS 11-JUL-822 ; TL203 -- REMOVE UNNEEDED INSTRUCTIONS IN ORDER ; TO GET SAVXT TO FIT. ;  ; P. J. BEZEREDI 13-JUL-82, ; PB322 -- STREAMLINE DRIVER EVEN FURTHER. ;. ; T. LEKAS 15-JUL-82= ; TL205 -- FIX PB322 - THE DRIVER WAS UNMAPPING ITSELF WHENS ; WHEN RUNNING IN APR6S ;I ; M. Pettengill 15-July-1982; ; MLP074 - Correct retry logic to actually retry 4 times 5 ; and to jump to the correct location in boot romI ;- ;2?; THIS MODULE CONTAINS A SPECIAL DRIVER USED BY BOOT AND SAVE $; TO READ AND WRITE SYSTEM IMAGES.;; DRIVER INPUTS:; R2 = NOT USEDJ; R3 = NOT USED2; R4 = UNIT NUMBER/; R5 = 0 USE CSR ADDRESS STORED IN THE DRIVERU(; R5 <> 0 USE CSR ADDRESS STORED IN R5;N; DRIVER OUTPUTS:; R0 = RESIDUAL BLOCK COUNTS@; R2 = POSSIBLE MEMORY SIZE FROM CONFIGURATION TABLE ; PB322; R1 = DEVICE NAME IN ASCIIe; R4 = PHYSICAL UNIT NUMBERr; R5 = CSR ADDRESS; .MCALL HWDDF$ HWDDF$I!";I#; DRIVER TABLE$;A%!& .PSECT DRVTAB,RW,D,GBL,REL,CONI'"( .ASCII /XT/ ; XT COMMON DRIVER)) .WORD XTLLEN ; ADDRESS OF LOAD LENGTHU** .WORD XTSA ; ADDRESS OF BUFFER ADDRESS/+ .WORD XTFUN ; ADDRESS OF FUNCTION CODE/UNITR', .WORD $XTDRV ; DRIVER ENTRY ADDRESS 2- .WORD /2; SIZE OF DRIVER IN WORDS#. .WORD 160 ; WRITE FUNCTION CODE3"/ .WORD 100 ; READ FUNCTION CODE0 .WORD 0 ; UNIT SELECT BITS/1 .WORD XTFUN ; ADDRESS OF FUNCTION CODE WORD(2 .WORD XTCSR ; ADDRESS OF CSR ADDRESS3 4 .PSECTC56;R7; SPECIAL DRIVER8;.9+:$XTDRV::BR XT0 ;;; BR AROUND FIXED STUFF;+;XTNAM: .WORD "XT ;;; GENERIC DEVICE NAMED)<XTCSR: .WORD 0 ;;; DEFAULT CSR ADDRESSD3=XTFUN: .WORD 0 ;;; FUNCTION CODE AND UNIT NUMBERE(>XT0: TST R5 ;;; CSR ADDRESS SUPPLIED?? BNE 5$ ;;; IF NE YES-@ MOV XTCSR,R5 ;;; NO, GET SAVED CSR ADDRESSD8A5$: MOV #1,@#SR0 ;;; MAKE SURE MEMORY MANAGEMENT IS ONFA MOV #1400,@#KISAR3 ;;; MAP TO POSSIBLE CONFIGURATION TABLE ; PB3226A MOVB @#77707,XTSIZ+1;;; SAVE MEMORY SIZE ; PB322*B MOV PC,R3 ;;; SET ADDRESS FOR PIC CODEC ADD #,R3 ;;; .../D MOV @#6,XTBLK ;;; SAVE STARTING BLOCK NUMBER.&E MOVB R4,1(R3) ;;; SAVE THE UNIT NO..F BITB #20,(R3) ;;; IS THIS A WRITE FUNCTION?G BEQ 6$ ;;; IF EQ NOD5H MOV 15$,MOVE ;;; SET GENERIC FILL SILO INSTRUCTIONR(I6$: CMP #401,(R5) ;;; IS THIS AN RD50?J BNE 20$ ;;; IF NE NOK; L; RD50 SETUP CODEMM;4*N MOV #"DW,XTNAM ;;; SET RD50 DEVICE NAME0O BIC #100000,MOVE ;;; CONVERT A MOVB TO A MOVB-P BITB #20,(R3) ;;; IS THIS A READ FUNCTION?DQ BEQ 10$ ;;; IF EQ YES#*R MOVB #60,(R3) ;;; NO, SET WRITE COMMANDS BR XTRTY ;;;)T10$: MOVB #40,(R3) ;;; SET READ COMMANDTU BR XTRTY ;;;0V15$: MOVB (R1)+,(R2) ;;; FILL SILO INSTRUCTIONW;QX; RX50 SETUP CODE Y;E.Z20$: MOV #"DZ,XTNAM ;;; SET RX50 DEVICE NAME [ ASL R4 ;;; SHIFT UNIT NUMBER$\ BISB R4,(R3) ;;; SET UNIT NUMBER];D^; COMMON PARAMETER SETUP_;E7`; TEST NUMBER OF RETRIES. IF MORE THAN FOUR, QUIT ANDB3a; JUMP TO DIAGNOSTIC ROM TO CONTINUE BOOT PROCESSIb; WITH NEXT DEVICE.Fc;E*dXTRTY: DEC (PC)+ ;;; ANY RETRIES LEFT ?e .WORD 4 ;;; (FOUR RETRIES) &e BPL 25$ ;;; IF NE YES ; MLP074De JMP @#167700 ;;; TRY BOOTING THE NEXT DEVICE IN SEQUENCE ; MLP0743h25$: MOV (PC)+,R1 ;;; GET BUFFER ADDRESS ;**-2 iXTSA: .WORD 0 ;;;*j CLC ;;; CONVERT TO 32WD BLOCK ADDRESSk ROL R1 ;;; ...l ROL R1 ;;; ...m SWAB R1 ;;; ...E2n MOV R1,@#KISAR3 ;;; SETUP APR3 TO MAP TO BUFFER#o MOV (PC)+,R4 ;;; GET LOAD LENGTH pXTLLEN: .WORD 0 ;;;$q MOV #0,SBLK ;;; SET STARTING LBNrXTBLK= .00za``t`TADATADATADATADATADATA-4 ;;;*sXTLOOP: MOV (PC)+,R1 ;;; GET CURRENT LBNtSBLK: .WORD 0 ;;;,t TST MOVE ;;; IS THIS AN RD50? ; PB322't BMI DZLOOP ;;; IF MI NO ; PB322Lw; ;**-2x; RD50 BASIC LOOPAy;S+zDWLOOP: TST 20(R5) ;;; IS THE UNIT BUSY?;){ BMI DWLOOP ;;; IF MI YES, WAIT FOR IT;"| INC R1 ;;; MAKE IT LOGICAL I/O} MOV R1,R2 ;;; COPY ITI+~ BIC #177760,R2 ;;; ISOLATE SECTOR NUMBER(/ ASH #-4,R1 ;;; RIGHT JUSTIFY TRACK AND HEAD;' CLR R0 ;;; GET READY FOR THE DIVIDE- DIV #4,R0 ;;; CALCULATE CYLINDER AND HEADG! MOVB R2,6(R5) ;;; SET SECTOR #;! MOVB R0,12(R5) ;;; SET TRACK #  MOV R1,14(R5) ;;; SET HEAD # * MOVB (R3),16(R5) ;;; START THE FUNCTION& BR COMMON ;;; GET INTO COMMON LOOP; ; RX50 BASIC LOOP;;B5DZLOOP: CALL DZTRK ;;; CONVERT LBN TO DISK ADDRESSM( MOVB (R3),4(R5) ;;; LOAD THE FUNCTION" MOVB R1,10(R5) ;;; SET SECTOR # MOVB R0,6(R5) ;;; SET TRACK ## TSTB 22(R5) ;;; CLEAR RX50 SILOR;;; COMMON TRANSFER LOOP;4COMMON: BITB #20,(R3) ;;; IS THIS A READ FUNCTION? BEQ 10$ ;;; IF EQ YES. CALL SILO ;;; NO, FILL SILO BEFORE WRITING110$: CALL WAIT ;;; WAIT FOR FUNCTION TO FINISH ( BCS XTRTY ;;; IF CS ERROR, TRY AGAIN# INC SBLK ;;; UPDATE CURRENT LBN;. BITB #20,(R3) ;;; WAS THIS A READ FUNCTION?& BNE 20$ ;;; IF NE NO, TEST FOR END! CALL SILO ;;; YES, EMPTY SILO 120$: SOB R4,XTLOOP ;;; LOOP IF MORE LBNS REMAIN) BR XTDONE ;;; ALL FINISHED ; PB322 ;**-1 ;!; PERFORM SILO/MEMORY TRANSFERSS;  .ENABL LSB3SILO: MOV #512.,R0 ;;; SET COUNT OF BYTES IN SILOS" MOV R5,R2 ;;; COPY CSR ADDRESS, ADD #20,R2 ;;; POINT TO RX50 DATA BUFFER. MOV #60000,R1 ;;; SET BASE FOR APR6 MAPPING, TST MOVE ;;; IS THIS AN RD50? ; PB322# BMI 5$ ;;; IF MI NO ; PB322;4 SUB #10,R2 ;;; POINT TO RD50 DATA BUFFER ;**-2% ASR R0 ;;; CONVERT BYTES TO WORDSF*5$: CMP #"DW,XTNAM ;;; IS THIS THE RD50? BNE MOVE ;;; IF NE NO ( TSTB 20(R5) ;;; READY FOR NEXT MOVE? BPL 5$ ;;; IF PL NO.AMOVE: MOVB (R2),(R1)+ ;;; EMPTY SILO (WILL CHANGE TO FILL SILO)! SOB R0,5$ ;;; LOOP UNTIL DONE9 ADD #10,@#KISAR3 ;;; UPDATE APR3 MAPPING BY 256. WORDS1( TST (PC)+ ;;; IS THE NXM TRAP SETUP?-TRPFLG: .WORD 0 ;;; FLAG=0 FIRST TIME THRU; BNE XIT ;;; IF NE NO/ MOV @#4,(PC)+ ;;; SAVE CURRENT TRAP 4 VECTOR*TRPPC: .WORD 0 ;;;E MOV @#6,(PC)+ ;;; ...TRPPS: .WORD 0 ;;;H2 INC TRPFLG ;;; INDICATE THAT WE HAVE BEEN HERE MOV #PR7,@#6 ;;; SET NEW PS( MOV PC,R0 ;;; CALCULATE TRAP ADDRESS ADD #,R0 ;;; ...C MOV R0,@#4 ;;; SET NEW PC,XIT: RETURN ;;;N .DSABL LSB@;;"; WAIT FOR OPERATION TO COMPLETE;T2WAIT: TST MOVE ;;; IS THIS THE RD50? ; PB322$ BMI 10$ ;;; IF MI NO ; PB322%5$: TST 20(R5) ;;; DONE? ;**-3S BMI 5$ ;;; IF MI NO*! BITB #1,17(R5) ;;; ANY ERRORS?6 BR 20$ ;;; EXITP!10$: TST 24(R5) ;;; START RX50;)15$: BITB #10,4(R5) ;;; DONE? ;**-1R BEQ 15$ ;;; IF EQ NO" BITB #200,4(R5) ;;; ANY ERRORS?20$: BEQ 30$ ;;; IF EQ NO SEC ;;; INDICATE ERRORP30$: RETURN ;;;;;S-; CONVERT RX50 LBN TO PHYSICAL DISK ADDRESSO;E.DZTRK: CLR R0 ;;; SIGN EXTEND R1 ; TL203= DIV #10.,R0 ;;; DIVIDE BY # OF SECTORS PER TRACK ; TL203R, CMP #4,R1 ;;; C=1 IF 5<=R1<=9. ;**-11+ ROL R1 ;;; DOUBLE FOR INTERLEAVE FACTORB* ASL R0 ;;; ADD FOR TRACK TO TRACK SKEW! ADD R0,R1 ;;; SKEW BY 2*TRACK  ASR R0 ;;; RESTORE TRACK # MOV #10.,R2 ;;; SET MODULUS;430$: SUB R2,R1 ;;; PUT SECTOR IN RANGE -10. TO -13 BGE 30$ ;;; IF GE LOOP UNTIL REMAINDER IS MINUS$ ADD R2,R1 ;;; NORMALIZE SECTOR # INC R1 ;;; FORGET SECTOR 01 INC R0 ;;; CONVERT TRACK TO LOGICAL OPERATION;' CMP R0,#120 ;;; DO WE NEED TO WRAP?0 BNE 40$ ;;; IF NE NO CLR R0 ;;; WRAP AROUND40$: RETURN ;;; ;E; WE ARE FINISHED;;DTRP4: &XTDONE: MOV TRPPC,@#4 ;;; RESTORE PC MOV TRPPS,@#6 ;;; R00za{a_c_d_kESTORE PSA* MOV R4,R0 ;;; GET RESIDUAL BLOCK COUNT. MOV (PC)+,R2 ;;; GET SYSTEM SIZE ; PB322"XTSIZ: .WORD 0 ;;; ; PB322$ MOVB 1(R3),R4 ;;; GET UNIT NUMBER# MOV XTNAM,R1 ;;; GET DEVICE NAMERXTEND: RETURN ;;;  .ENDTRACK TO LOGICAL OPERATION;' CMP R0,#120 ;;; DO WE NEED TO WRAP?0 BNE 40$ ;;; IF NE NO CLR R0 ;;; WRAP AROUND40$: RETURN ;;; ;E; WE ARE FINISHED;;DTRP4: &XTDONE: MOV TRPPC,@#4 ;;; RESTORE PC MOV TRPPS,@#6 ;;; R .TITLE DRGTKD .IDENT /06.00/ ; N; COPYRIGHT (c) 1982, 1983, 1984, AND 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;C>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;R ; VERSION 05.05  ;C ; D. N. CUTLER 27-MAR-74 ;T ;T ; PREVIOUSLY MODIFIED BY:E ;E ; T. J. MILLER ; P. J. BEZEREDI ; J. M. LAWLER ; T. M. MARTIN ; T. LEKAS ;C ;$G ; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 UPDATE F (OR VERSION 4.0) BY:I ;c ; ERIC POSTPISCHIL 9-MAR-87 @ ; 06.00 edp050 -- CORRECT MOVEMENT OF T.PRI FROM WORD TO BYTE' ; AS INDICATED BY HANS PILMEYER.N ;D!;B";D#; MACRO LIBRARY CALLSC$;N%& .MCALL HDRDF$,PCBDF$,TCBDF$'' HDRDF$ ;DEFINE TASK HEADER OFFSETS 3( PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS .) TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS*+;+!,; **-$DRGTK-GET TASK PARAMETERSL-;J.; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A SIXTEEN WORD BUFFER WITH/; TASK PARAMETERS.0;S1; DPB FORMAT: 2; $3; WD. 00 -- DIC(63.),DPB SIZE(2.)./4; WD. 01 -- ADDRESS OF A SIXTEEN WORD BUFFER.H5;I6; BUFFER FORMAT:7;D08; WD. 00 -- FIRST HALF OF ISSUING TASK'S NAME.19; WD. 01 -- SECOND HALF OF ISSUING TASK'S NAME. 2:; WD. 02 -- FIRST HALF OF TASK'S PARTITION NAME.3;; WD. 03 -- SECOND HALF OF TASK'S PARTITION NAME.F@<; WD. 04 -- FIRST HALF OF REQUESTER TASK NAME (NOT SUPPORTED).A=; WD. 05 -- SECOND HALF OF REQUESTER TASK NAME (NOT SUPPORTED).>; WD. 06 -- TASK PRIORITY.?; WD. 07 -- CURRENT TASK UIC.-&@; WD. 10 -- NUMBER OF LOGICAL UNITS.!A; WD. 11 -- PROCESSOR INDICATOR-B; WD. 12 -- STD FLAGS WORD (NOT SUPPORTED).I/C; WD. 13 -- ADDRESS OF TASK SST VECTOR TABLE.E5D; WD. 14 -- SIZE OF TASK SST VECTOR TABLE IN WORDS. $E; WD. 15 -- SIZE OF TASK IN BYTES..F; WD. 16 -- SYSTEM ID CODE (6 FOR RSX-11M+)."G; WD. 17 -- PROTECTION UIC WORD.H;K I; INPUTS:PJ;D;K; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.P5L; R3=ADDRESS OF THE SIXTEEN WORD BUFFER IN THE DPB.U1M; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.N.N; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.O;-CP; NOTE THAT IF THE REQUESTING TASK HAS A NON RESIDENT TASK HEADER ?Q; WE WILL ENTER AT $DRGTK WITH THE TASK HEADER MAPPED THROUGHR?R; KERNEL APR 6. HOWEVER, WE ALSO NEED TO MAP THE USER BUFFERI>S; AREA WITH APR 6. THEREFORE, WE WILL SAVE NECESSARY HEADER@T; INFORMATION IN THE INTERNAL DPB SAVE AREA (WE NO LONGER NEED,U; THE DPB) BEFORE MAPPING THE USER BUFFER.V;O7W; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)HX;R&Y; C=0 WITH A DIRECTIVE STATUS OF +1.Z;-[6\$DRGTK::MOV (R3),R3 ;GET ADDRESS OF 16. WORD BUFFER]^ .IF DF X$$HDRA_3` MOV #$DICSV+2,R0 ;USE INTERNAL DPB FOR SAVE AREAPab .IF DF M$$MUPc)d MOV H.DUIC(R4),(R0)+ ;SAVE DEFAULT UICRef .IFF g'h MOV H.CUIC(R4),(R0)+ ;OR CURRENT UICEij .ENDCk,l MOV H.NLUN(R4),(R0)+ ;SAVE NUMBER OF LUNS2m MOV H.TKVA(R4),(R0)+ ;SAVE TASK SST VECTOR ADDR2n MOV H.TKVL(R4),(R0) ;SAVE LENGTH OF SST VECTOR o ASR (R0)+ ;IN TERMS OF WORDS5p MOV H.WND(R4),R1 ;POINT TO NUMBER OF WINDOW BLOCKSOqr .IF DF U$$DASs7t BIT #T4.DSP,T.ST4(R5) ;TASK HAVE I/D SPACE ENABLED ?Cu BEQ 10$ ;IF EQ, NO8v ADD #W.BLGH,R1 ;YES, POINT TO WINDOW 1 (D SPACE ROOT)w10$: ;REFERENCE LABELxy .ENDC ; DF U$$DASz6{ MOV W.BHVR+2(R1),(R0) ;CALCULATE TASK SIZE IN BYTES| SUB W.BLVR+2(R1),(R0) ;00{aaa`TADATADATADATADATADATA} INC (R0)+ ;V+~ MOV H.CUIC(R4),(R0) ;SAVE PROTECTION UIC .ENDC/ MOV #16.*2,R1 ;SET LENGTH OF BUFFER IN BYTESI. CALL $ACHKP ;ADDRESS CHECK PARAMETER BLOCK+ MOV T.NAM(R5),(R3)+ ;INSERT NAME OF TASKS MOV T.NAM+2(R5),(R3)+ ;, MOV T.PCB(R5),R0 ;GET ADDRESS OF TASK PCB0 MOV P.NAM(R0),(R3)+ ;INSERT NAME OF PARTITION MOV P.NAM+2(R0),(R3)+ ;2 CMP (R3)+,(R3)+ ;POINT TO TASK PRIORITY ADDRESS: MOVB T.PRI(R5),(R3)+ ; INSERT TASK PRIORITY. ;edp050, CLRB (R3)+ ; CLEAR HIGH BYTE. ;edp050 ;**-1; .IF DF X$$HDR1 MOV #$DICSV+2,R4 ;ADDRESS OF SAVED HEADER INFOR MOV (R4)+,(R3)+ ;INSERT UICC* MOV (R4)+,(R3)+ ;INSERT NUMBER OF LUNS* MOV $PRMOD,(R3)+ ;INSERT PROCESSOR TYPE/ TST (R3)+ ;POINT TO TASK SST VECTOR ADDRESSP3 MOV (R4)+,(R3)+ ;INSERT TASK SST VECTOR ADDRESS8 MOV (R4)+,(R3)+ ;INSERT LENGTH OF SST VECTOR IN WORDS' MOV (R4)+,(R3)+ ;TASK SIZE IN BYTESR .IF DF R$$PRO# MOV #11,(R3)+ ;SET CODE FOR P/OSH .IFF ;R$$PRO& MOV #6,(R3)+ ;SET CODE FOR RSX-11M+ .ENDC ;R$$PRO$ MOV (R4),(R3) ;SET PROTECTION UIC .IFF  .IF DF M$$MUP+ MOV H.DUIC(R4),(R3)+ ;INSERT DEFAULT UIC) .IFFC+ MOV H.CUIC(R4),(R3)+ ;INSERT CURRENT UICO .ENDC. MOV H.NLUN(R4),(R3)+ ;INSERT NUMBER OF LUNS* MOV $PRMOD,(R3)+ ;INSERT PROCESSOR TYPE/ TST (R3)+ ;POINT TO TASK SST VECTOR ADDRESSR7 MOV H.TKVA(R4),(R3)+ ;INSERT TASK SST VECTOR ADDRESSO< MOV H.TKVL(R4),(R3) ;INSERT LENGTH OF SST VECTOR IN WORDS) ASR (R3)+ ;CONVERT TO LENGTH IN WORDS45 MOV H.WND(R4),R1 ;POINT TO NUMBER OF WINDOW BLOCKSF .IF DF U$$DAS7 BIT #T4.DSP,T.ST4(R5) ;TASK HAVE I/D SPACE ENABLED ?M BEQ 20$ ;IF EQ, NO8 ADD #W.BLGH,R1 ;YES, POINT TO WINDOW 1 (D SPACE ROOT)20$: ;REFERENCE LABEL .ENDC ; DF U$$DAS6 MOV W.BHVR+2(R1),(R3) ;CALCULATE TASK SIZE IN BYTES SUB W.BLVR+2(R1),(R3) ; INC (R3)+ ;  .IF DF R$$PRO# MOV #11,(R3)+ ;SET CODE FOR P/OS  .IFF ;R$$PROS& MOV #6,(R3)+ ;SET CODE FOR RSX-11M+ .ENDC ;R$$PRO* MOV H.CUIC(R4),(R3) ;SET PROTECTION UIC .ENDC RETURN ;4 .ENDVE I/D SPACE ENABLED ?M BEQ 20$ ;IF EQ, NO8 ADD #W.BLGH,R1 ;YES, POINT TO WINDOW 1 (D SPACE ROOT)20$: ;REFERENCE LABEL .ENDC ; DF U$$DAS6 MOV W.BHVR+2(R1),(R3) ;CALCULATE TASK SIZE IN BYTES SUB W.BLVR+2(R1),(R3) ; INC (R3)+ ;  .IF DF R$$PROKB3 BCS 40$ ;IF CS JUST RETURN -1 AND BE DONE WITH ITB/ ADD #IB.USQ,R0 ;POINT AT THE USER BUFFER QUEUEM" MTPS #PR6 ;;;LOCK OUT INTERRUPTS, MOVB (R0),R2 ;;;GET THE NEXT BUFFER TO USE, BMI 10$ ;;;IF MI NO NEED TO MOVE THE QUEUE .REPT 7/ MOVB 1(R0),(R0)+ ;;;MOVE THE QUEUE DOWN A BYTER .ENDM+ MOVB #-1,(R0) ;;;MARK THE END OF THE QUEUEM9 CMPB R2,S.WEBF(R1) ;;;SHOULD THIS BUFFER SET ERROR CODE?I BNE 10$ ;;;IF NE NO+2 MOV S.WSTS(R1),@S.WUSW(R1) ;;;YES--SET ERROR CODE!10$: MTPS #0 ;;;ALLOW INTERRUPTSI* MOV (R5),R1 ;GET POSSIBLE IBUFNO ADDRESS% CMP R3,#3 ;CAN IBUFNO BE SPECIFIED?  BLT 20$ ;IF LT NO; CMP R1,#-1 ;WAS IT SPECIFIED?R BEQ 20$ ;IF EQ NOF' MOV R2,(R1) ;YES--STORE BUFFER NUMBER '20$: MOV R2,R0 ;POSITION BUFFER NUMBER,+ RETURN ;BACK TO CALLER WITH NUMBER IN R0M;; CANNOT FIND SWB FOR IBUF;O'40$: MOV #-1,R2 ;JUST RETURN NO BUFFERL BR 10$ ;STORE CODE AND RETURNB .END;;IF NE NO+2 MOV S.WSTS(R1),@S.WUSW(R1) ;;;YES--SET ERROR CODE!10$: MTPS #0 ;;;A .TITLE KDIO SINGLE DIGITAL I/OG .IDENT /1.03/;D ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.A;T>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENS00aa_c_d_kE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 1.03; B. SCHREIBER 5-SEP-77T; ; MODIFIED BY:; ; B. SCHREIBER 15-MAY-78;; BLS048 -- CORRECT USE OF MASK. CLEAR SAVED R5 FROM STACKO1; BEFORE SUCCESSFUL ROUTINE EXIT. WRITE VALUEN3; READ FROM DIGITAL REGISTER BACK TO REGISTER INI; ALL CASES.G;I; M. S. HARVEY 12-MAY-79;; MSH034 -- ALTER ONLY THOSE OUTPUT REGISTER BITS THAT HAVEO; BEEN MASK MARKEDS;E9; HB008 -- CONDITIONALIZE WRITE ACCESS TO RECEIVE BUFFERO; FOR Q-BUS DRV11; ;N3; THIS MODULE PROCESSES SINGLE DIGITAL INPUT/OUTPUTB;S; SYSTEM MACRO CALLS;: .MCALL KSWDF$,KDVDF$- KSWDF$L KDVDF$O C' .SBTTL IDINP/DINP SINGLE DIGITAL INPUTO;+#; IDINP/DINP -- SINGLE DIGIAL INPUTT;A; CALLING SEQUENCES:;T(; CALL DINP (IUNIT, [MASK], IOSB, INPUT); OR,; IND = IDINP (IUNIT, [MASK], IOSB, [INPUT]);E-; OR IND = IDINP (IUNIT) !FAST VERSION ONLY ;B ; INPUTS:R;S'; IUNIT IS THE DR11 UNIT (DEFAULT IS 0)C@; MASK SELECTS WHICH BITS WILL BE CLEARED IN DR11 INPUT REGISTER;R ; OUTPUTS:;D-; INPUT RECEIVES THE DATA INPUT FROM THE DR11S+; IND RECEIVES THE DATA INPUT FROM THE DR11V; IOSB RECEIVES THE I/O STATUS; ;- .IF NDF Q$$DIO IDINP::-DINP:: MOV R5,-(SP) ;SAVE ARG PTR & CALL .K.PAA ;VALIDATE AND STACK ARGS .WORD 4 ;4 ARGS  .WORD 2 ;IOSB REQUIRED BCS DIOBAD ;IF CS BAD ARGS MOV (SP)+,R1 ;GET UNIT NUMBER BNE 20$ ;IF NE OKN MOV #.ZEROW,R1 ;ELSE USE 01"20$: MOV (R1),R1 ;GET UNIT NUMBER ASL R1 ;MAKE INDEX& MOV .DRUTB(R1),R1 ;GET POINTER TO SWB+ CMP R1,#DRSW0 ;MAKE SURE LEGAL SWB ADDRESSR BLO 80$ ;IF LO NOT LEGAL& CMP R1,#.DRUTB ;THIS FOLLOWS LAST SWB BHIS 80$ ;IF HIS NOT LEGAL# MOV S.WCSR(R1),R1 ;GET CSR ADDRESSP' MOV DI$BUF(R1),R0 ;READ INPUT REGISTERK MOV (SP)+,R2 ;GET MASK ADDRESS. BNE 30$ ;IF NE GO USE MASK+ MOV #.NEG1,R2 ;ELSE USE DEFAULT OF ALL 1'SM .IF DF L$$SI130$: .IFFB>30$: MOV (R2),DI$BUF(R1) ;CLEAR BITS IN DIGITAL INPUT REGISTER .ENDC&40$: MOV #IS.SUC,@(SP)+ ;STORE SUCCESS" MOV (SP)+,R1 ;GET 'INPUT' ADDRESS BEQ 60$ ;IF EQ SKIP IT MOV R0,(R1) ;ELSE STORE DATA*60$: TST (SP)+ ;CLEAR SAVED R5 FROM STACK RETURNI80$:+DIOBD0: MOV R5,SP ;ILL UNIT--RESTORE STACKS;D; BAD PARAMETERS;12DIOBAD: MOV #-,R3 ;SET VALUE TO STORE" MOV #3,R4 ;STORE IN 3RD ARGUMENT MOV (SP)+,R5 ;GET ARG PTR BACKU- CALLR .IESTO ;TRY TO STORE ERROR AND RETURN .IFF ;Q$$DIOIDINP::!IDINP:: MOV @2(R5),R1 ;GET UNIT #R ASL R1 ;MAKE WORD INDEXS# MOV .DRUTB(R1),R1 ;GET SWB ADDRESSR# MOV S.WCSR(R1),R1 ;GET CSR ADDRESS , MOV DI$BUF(R1),R0 ;READ DR11 INPUT REGISTER .IF NDF L$$SI1E& MOV R0,DI$BUF(R1) ;CLEAR BITS IN DR11 .ENDC RETURN  .ENDC ;Q$$DIO ( .SBTTL IDOUT/DOUT SINGLE DIGITAL OUTPUT;+%; DOUT/IDOUT -- SINGLE DIGITAL OUTPUT4;S; CALLING SEQUENCES:;V(; CALL DOUT (IUNIT, [MASK], IOSB, IDATA); OR+; IOUT = IDOUT (IUNIT, [MASK], IOSB, IDATA)I; ; INPUTS:N; .; IUNIT IS THE DR11 UNIT NUMBER (DEFAULT IS 0)%; MASK SELECTS THE BITS TO BE ALTEREDR.; IDATA IS THE DATA WORD TO OUTPUT TO THE DR11;$ ; OUTPUTS:;D; IOSB RECEIVES THE I/O STATUS<; IOUT RECEIVES A COPY OF THE DR11 OUTPUT REGISTER IF CALLED; AS A FUNCTION.;;D>; NOTE: FOR THE QUICK VERSION, THE ARGUMENTS MASK AND IOSB ARE<; NOT USED, BUT ARE REQUIRED (OR DEFAULTED) TO KEEP THE SAME ; STRUCTURE AS THE SLOW VERSION.;- .IF NDF Q$$DIOIDOUT::IDOUT::, MOV R5,-(SP) ;SAVE ARG PTRN& CALL .K.PAA ;VALIDATE AND STACK ARGS .WORD 4 ;4 ARGSK .WORD 2 ;MASK  BCS DIOBAD ;IF CS BAD ARGS MOV (SP)+,R1 ;GET UNIT NUMBER BNE 20$ ;IF NE GO USEO MOV #.ZEROW,R1 ;ELSE USE 0 "20$: MOV (R1),R1 ;GET UNIT NUMBER A00aaa`TADATADATADATADATADATASL R1 ;MAKE WORD INDEXA" MOV .DRUTB(R1),R1 ;GET PTR TO SWB! CMP R1,#DRSW0 ;SEE IF A REAL SWBN BLO DIOBD0 ;IF LO NO CMP R1,#.DRUTB ;... BHIS DIOBD0 ;IF HIS ILLEGALT# MOV S.WCSR(R1),R1 ;GET CSR ADDRESS. MOV (SP)+,R2 ;GET MASK ADDRESS, BNE 40$ ;IF NE OK  MOV #.NEG1,R2 ;ELSE USE ALL 1S 40$: MOV (R2),R2 ;GET MASKA8 MOV DO$BUF(R1),R0 ;GET CURRENT OUTPUT REGISTER CONTENTS' BIC R2,R0 ;INITIALIZE THE MASKED BITS  COM R2 ;COMPLEMENT MOV (SP)+,R3 ;GET IOSB ADDRESS, MOV @(SP)+,R4 ;GET OUTPUT DATAA BIC R2,R4 ;MASKV3 BIS R0,R4 ;RECOVER PROTECTED OUTPUT REGISTER BITSF- MOV R4,DO$BUF(R1) ;STORE DIGITAL OUTPUT DATA. MOV #IS.SUC,(R3)+ ;SET SUCCESS . MOV R4,R0 ;COPY IN CASE CALLED AS A FUNCTION& TST (SP)+ ;CLEAR SAVED R5 FROM STACK RETURNE .IFF ;Q$$DIO,IDOUT::E DOUT:: MOV @2(R5),R1 ;GET UNIT # ASL R1 ;MAKE WORD INDEXE# MOV .DRUTB(R1),R1 ;GET SWB ADDRESSB( MOV S.WCSR(R1),R1 ;GET DR11 CSR ADDRESS+ MOV @10(R5),DO$BUF(R1) ;WRITE DATA TO DR11D RETURNM .ENDC ;Q$$DIO .ENDTAA BIC R2,R4 ;MASKV3 BIS R0,R4 ;RECOVER PROTECTED OUTPUT REGISTER BITSF- MOV R4,DO$BUF(R1) ;STORE DIGITAL OUTPUT DATA. MOV #IS.SUC,(R3)+ ;SET SUCCESS . MOV R4,R0 ;COPY IN CASE CALLED AS A FUNCTION& TST (SP)+ ;CLEAR SAVED R5 FROM STACK RETURNE .IFF ;Q$$DIO,IDOUT::E DOUT:: MOV @2(R5),R1 ;GET UNIT # ASL R1 ;MAKE WORD INDEXE# MOV .DRUTB(R1),R1 ;GET SWB ADDRESSB( MOV S.WCSR(R1),R1 ;GET DR11 CSR ADDRESS+ MOV @10(R5),DO$BUF(R1) ;WRITE DATA TO DR11D RETURNM .ENDC ;Q$$DIO .TITLE KAADRV ROUTINES FOR AA11 .IDENT /1.01/;O; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;V>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 1.01; B. SCHREIBER 26-SEP-77; ; MODIFIED BY -O;U; HOWARD BERNSTEIN - 8/817; HB013 -- ALLOW SWEEPS TO MULTIPLE AA11'S IN ONE CALLR;P1; THIS MODULE CONTAINS ROUTINES TO DRIVE THE AA11D;; SYSTEM MACRO CALLS;T .MCALL KDVDF$,KSWDF$  KDVDF$  KSWDF$ .IF DF N$AA11 O: .SBTTL DASWP INITIATE SYNCHRONOUS OR BURST MODE D/A SWEEP;+; DASWP -- START D/A SWEEP;S; CALLING SEQUENCE:R;LG; CALL DASWP (IBUF, LBUF, NBUF, MODE, IPRSET, IEFN, LDELAY, ICHN, NCHN); ; INPUTS:.;; SEE DOCUMENTATION-;;-"DASWP:: MOV R5,-(SP) ;SAVE ARG PTR' CALL .K.PAA ;VALIDATE ARGS ONTO STACKT .WORD 9. ;NINE ARGSE# .WORD 600 ;MASK FOR REQUIRED ARGSU0 MOV #.AASWB,R4 ;POINT TO AA SWEEP CONTROL BLOCK BCC 20$ ;IF CC CONTINUEF/ MOV #-,R3 ;ELSE SET BAD ARGUMENTSB& BR 600$ ;STORE ERROR CODE AND RETURN%20$: CALL .K.SET ;SET UP COMMON ARGSD BCS 200$ ;IF CS BAD ARGS CALL .K.DLY ;SEE ABOUT DELAY! BCS 300$ ;IF CS RESOURCE IN USEL# CALL .AAGCH ;GET D/A CHANNEL INFO BCS 200$ ;IF CS BAD ARGS! CALL .K.STB ;SET UP BUFFER INFOP% BCS 400$ ;IF CS ILLEGAL BUFFER SPECT$ BIT #S$WNOV,S.WFLG(R4) ;BURST MODE? BEQ 40$ ;IF EQ NOD# MOV (SP)+,R5 ;YES--RESTORE ARG PTRS% JMP .AADMP ;GO DO BURST MODE OUTPUTN40$: .IF DF K$$W11* CALL .AASSC ;SELECT SYNCH. CLOCK ROUTINE& CALL .KLQIN ;INSERT INTO CLOCK QUEUE CALL .KWCNI ;CONNECT CLOCK! BCS 300$ ;IF CS RESOURCE IN USED- BIS #S$WACT,S.WFL2(R4) ;FLAG SWEEP IS ACTIVEE MOV (SP)+,R5 ;RESTORE R5T RETURNN .IFF ;K$$W110/ MOV #-,R3 ;SET OPTION NOT PRESENTF0 BR 500$ ;AND LET HIM FIGURE OUT CLOCK NOT HERE00aa_c_d_k .ENDC ;K$$W11;T; ERROR RETURNS ; ; BAD PARAMETERS; 200$: MOV #-,R3 BR 500$; ; RESOURCE IN USE;:300$: MOV #-,R3 BR 500$; ; ILLEGAL BUFFER SPECIFICATION; 400$: MOV #-,R33500$: MOV R5,SP ;RESTORE PRE-.K.PAA STACK POINTER I6600$: CALL .KLQRM ;REMOVE FROM QUEUE IN CASE INSERTED MOV #1,R4 ;STORE IN FIRST ARGR MOV (SP)+,R5 ;RESTORE ARG PTR CALLR .IESTO  T .SBTTL SCOPE SCOPE CONTROL$;+; SCOPE -- AA11 SCOPE CONTROLE;; CALLING SEQUENCE:T; "; CALL SCOPE (IUNIT, ICNTRL, IOSB); ; INPUTS: ;I; IUNIT AA11 UNIT #0; ICNTRL DATA FOR CSR OF AA11; IOSB RECEIVES STATUS;3 ; OUTPUTS:;#; ICNTRL MOVED INTO PROPER AA11 CSR0; ;- .IF NDF Q$$BUS!SCOPE:: MOV @2(R5),R0 ;GET UNIT #S BMI 120$ ;IF MI ERRORL MOV #.AASWB,R4 ;POINT TO AASWBS CMP R0,S.WUNT(R4) ;LEGAL UNIT?  BGE 120$ ;IF GE NO MOV @4(R5),R1 ;GET CSR BITS9 BIC #^C,R1 ;CLEAR ILLEGAL BITS FOR USER TO TOUCHA, MOV #<.AASWB+S.WUCB>,R2 ;POINT TO FIRST UCB20$: DEC R0 ;AT CORRECT UNIT? BLT 40$ ;IF LT YES! ADD #U.LGTH,R2 ;NO--MOVE TO NEXTL BR 20$ ;KEEP GOING040$: MOV R1,@U.CSR(R2) ;FOUND IT...OUTPUT TO CSR MOV #IS.SUC,@6(R5) ;SET SUCCESS 100$: RETURN'120$: MOV #3,R4 ;STORE IN 3RD ARGUMENTT& MOV #-,R3 ;BAD ARGUMENTS CALLR .IESTOI .IFF ;Q$$BUSP$SCOPE:: MOV #3,R4 ;STORE IN 3RD ARG+ MOV #-,R3 ;OPTION NOT PRESENTC CALLR .IESTO  .ENDC ;Q$$BUS O* .SBTTL .AAGCH GET D/A CHANNEL INFORMATION;+'; .AAGCH -- GET D/A CHANNEL INFORMATIONI ; INPUTS:$;I; STACK >> RETURN ADDRESSN; ICHN ADDRESS; NCHN ADDRESS; ; OUPUTS:,+; C-CLEAR CHANNEL INFORMATION SET UP IN SWBS; C-SET ILLEGAL CHANNEL NUMBER;U;-(.AAGCH::MOV (SP)+,R3 ;GET RETURN ADDRESS MOV (SP)+,R2 ;GET ICHN ADDRESSN BNE 20$ ;IF NE GO" MOV #.ZEROW,R2 ;ELSE DEFAULT TO 020$: MOV (R2),R2 ;GET ICHNE BMI 200$ ;IF MI ERROR " CMP R2,S.WMXC(R4) ;LEGAL CHANNEL? BHI 200$ ;IF HI NO MOV (SP)+,R1 ;GET NCHNR BNE 40$ ;IF NE OKH MOV #.ZEROW,R1 ;ELSE USE 0O40$: MOV (R1),R1 ;GET NCHN> BMI 200$ ;IF MI ERRORN BNE 60$ ;IF NE OKD INC R1 ;ELSE USE 1 CHANNEL 60$: MOV R1,-(SP) ;SAVE ON STACK ADD R2,R1 ;COMPUTE END CHANNEL$ DEC R1 ;DON'T GO PAST LAST CHANNEL% CMP R1,S.WMXC(R4) ;LEGAL END CHANNEL  BHI 200$ ;IF HI NO$ MOV R1,S.WHCH(R4) ;YES--FILL IN SWB MOV R2,S.WICH(R4) ;... ' MOV R2,S.WCCH(R4) ;SET CURRENT CHANNELP- MOV (SP),S.WNCH(R4) ;SET # OF CHANNELS TO DOH- MOV (SP)+,S.WCHX(R4);AND SAVED # OF CHANNELSE BIC #^C<3>,R2 ;CLEAR TO 0-3 .IF NDF Q$$BUS, INC R2 ;MAKE IT 1-4  .ENDC ;Q$$BUS ASL R2 ;CREATE WORD INDEXL% MOVB R2,S.WCHB(R4) ;SET CHANNEL BYTEV+ MOVB R2,S.WCBX(R4) ;AND SAVED CHANNEL BYTE/ MOV R3,-(SP) ;PUT RETURN ADDRESS BACK ON STACKM .IF GT N$AA11-1! CALL .AAXCH ;SET UP CSR ADDRESS, .ENDC ;N$AA11-1 CLC ;SUCCESS. RETURN;; ; SOME SORT OF ERROR; 200$: MOV R5,SP ;RESET SP SEC ;FLAG PROBLEM JMP (R3) ;RETURN TO CALLER (* .SBTTL .AANXC ADVANCE TO NEXT D/A CHANNEL;+%; .AANXC -- GO TO NEXT CHANNEL ON D/A ;A ; INPUTS:;.; R4 POINTS TO SWB ; R3 FREEE;R ; OUTPUTS:; !; SWB INCREMENTED TO NEXT CHANNELM; ); THIS ROUTINE MAY BE CALLED AT ANY LEVELV;,;- .PSECT .KSCT1/.AANXC::DEC S.WNCH(R4) ;;;DONE ENOUGH CHANNELS?X BLE 60$ ;;;IF LE YES--RESETN) INC S.WCCH(R4) ;;;NO--GO TO NEXT CHANNEL& ADD #2,S.WCHB(R4) ;;;INC CHANNEL BYTE .IF GT N$AA11-1, MOV S.WAUA(R4),R3 ;;;GET ACTIVE UCB ADDRESS ADD R4,R3 ;;;...5 CMP S.WCCH(R4),U.MAXC(R3) ;;;GOING TO NEXT CONVERTERE BLOS 40$ ;;;IF LOS NO ) ADD #U.LGTH,R3 ;;;YES--POINT TO NEXT D/AE6 MOV U.CSR(R3),S.WCSR(R4) ;;;CHANGE ACTIVE CSR IN SWB# SUB R4,R3 ;;;MAKE RELATIVE TO SWB 2 MOV R3,S.WAUA(R4) ;;;STORE ACTIVE UNIT UCB OFFSET# MOV S.WCCH(R4),R3 ;;;GET CHANNEL # BIC #^C<3>,R3 ;;;MAKE 0-3 .IF NDF Q$$BUS : MOVB #2,S.WCHB(R4) ;;;START WITH FIRST CHANNEL ON NEW DAC .IFF ;Q$$BUS$7 CLRB S.WCHB(R4) ;;;START WITH FIRST CHANNEL ON NEW DACD .00aaa`TADATADATADATADATADATAENDC ;Q$$BUS .IFTF ;N$AA11-140$: RETURN ;;; ;V; ALL CHANNELS DONE;;L560$: MOV S.WCHX(R4),S.WNCH(R4) ;;;RESET CHANNEL COUNTV: MOV S.WICH(R4),S.WCCH(R4) ;;;RESET CURRENT CHANNEL NUMBER1 MOVB S.WCBX(R4),S.WCHB(R4) ;;;RESET CHANNEL BYTE; .IFT ;N$AA11-1C;+; .AAXCH -- SET UP CSR AND SWB;E ; INPUTS:#;3; R4 POINTS TO SWB ; R3 FREE$; ; OUTPUTS:;W2; S.WAUA OFFSET FILLED IN SWB (> 1 AA11 IN SYSTEM);; NO OPERATION (1 AA11 IN SYSTEM--DATA FILLED IN AT SYSGEN)O;E;-&.AAXCH::MOV R4,R3 ;POINT TO FIRST UCB# ADD #S.WUCB,R3 ;REALLY POINT AT ITE+20$: CMP S.WCCH(R4),U.MAXC(R3) ;ON THIS AA?; BLOS 40$ ;IF LOS YES& ADD #U.LGTH,R3 ;NO--POINT TO NEXT UCB BR 20$ ;KEEP LOOKING,40$: MOV R3,S.WAUA(R4) ;POINT TO CURRENT UCB$ SUB R4,S.WAUA(R4) ;MAKE IT RELATIVE+ MOV U.CSR(R3),S.WCSR(R4) ;GET CSR INTO SWB4 .ENDC ;N$AA11-1 RETURN U3 .SBTTL .AASSC SELECT D/A SYNCHRONOUS CLOCK ROUTINEN;+:; .AASSC -- SELECT SYNCHRONOUS CLOCK ROUTINE FOR D/A SWEEP;O ; INPUTS:;X; R4 POINTS TO SWB; SWB SET UP FOR SWEEP;B ; OUTPUTS:;N:; S.WSCR IN SWB MODIFIED TO POINT TO CORRECT CLOCK ROUTINE;0;- .PSECT8.AASSC::MOV #.AASO0,R3 ;ASSUME SINGLE CHANNEL D/A OUTPUT .IF NDF Q$$BUSA7 BIT #S$WSCW,S.WFLG(R4) ;SEE IF SCOPE CONTROL WORD MODEE BNE 60$ ;IF NE YES .IFTF ;Q$$BUS0 MOV S.WNCH(R4),R2 ;GET NUMBER OF CHANNELS TO DO DEC R2 ;ONE CHANNEL? BEQ 80$ ;IF EQ YES DEC R2 ;TWO CHANNELS?E BNE 40$ ;IF NE NOK4 CMPB #6,S.WCHB(R4) ;SEE IF TWO CHANNELS ON SAME D/A3 BHI 40$ ;IF HI NO--LAST ON ONE, AND FIRST ON NEXT* MOV #.AASO1,R3 ;YES--SET FOR TWO CHANNELS BR 80$ ;GO STORE ADDRESS+40$: MOV #.AASO2,R3 ;MORE THAN TWO CHANNELSL .IFT ;Q$$BUSP BR 80$ ;GO STORE ADDRESS460$: MOV #.AASO3,R3 ;SET FOR SCOPE CONTROL WORD MODE .ENDC ;Q$$BUS80$: .IF DF M$$MGE ADD $KRLC5,R3 ;RELOCATE TO APR5 .ENDC ;M$$MGE5 MOV R3,S.WSCR(R4) ;STORE SYNC. CLOCK ROUTINE ADDRESSH: MOV #.AAXIT,S.WSTR(R4) ;SET DUMMY SCHMITT TRIGGER ROUTINE RETURNE O+ .SBTTL .AASOX D/A CLOCK INTERRUPT ROUTINES ;+>; .AASO0 -- SYNCH. CLOCK ROUTINE FOR SINGLE CHANNEL D/A OUTPUT;;F; THIS ROUTINE IS CALLED AT CLOCK INTERRUPTS TO OUTPUT ONE D/A CHANNEL;$ ; INPUTS: ; ; R4 POINTS TO SWB ; R3 FREEA;3 ; OUTPUTS:;O(; C-CLEAR WORD OUTPUT, NOT END OF BUFFER@; C-SET WORD OUTPUT, END OF BUFFER, FORK TO SET EFN OR QUEUE AST;$;- .PSECT .KSCT1:.AASO0: MOV S.WCSR(R4),-(SP) ;;;GET CSR ADDRESS ONTO STACK* MOVB S.WCHB(R4),R3 ;;;GET 2*(CHANNEL + 1)- ADD R3,(SP) ;;;POINT AT PROPER DAC REGISTERU( CALL .KRDWD ;;;GET DATA WORD TO OUTPUT% MOV R3,@(SP)+ ;;;WRITE TO PROPER DAC0.AAXIT: RETURN ;;;RETURN WITH C-BIT FROM KRDWD;+F; .AASO1 -- SYNCH. CLOCK ROUTINE FOR 2-CHANNEL D/A OUTPUT ON SAME AA11;UH; THIS ROUTINE IS CALLED AT CLOCK INTERRUPT LEVEL TO OUTPUT TWO CHANNELS; TO THE D/A ON THE SAME AA11.;Q ; INPUTS:$;-; R4 POINTS TO SWB ; R3 FREEO;. ; OUTPUTS:;;$; C-CLEAR TWO CHANNELS OUTPUT TO D/A9; C-SET TWO CHANNELS OUTPUT, FORK TO SET EFN OR QUEUE ASTA;RB; NOTE: IN THE Q-BUS VERSION, IF S$WSIB IS SET, AN INTENSIFY PULSE6; WILL BE SENT THROUGH DAC3 OF THE SELECTED CONVERTER.;N;- .ENABL LSBD/.AASO1: MOV S.WCSR(R4),-(SP) ;;;GET CSR ADDRESSA* MOVB S.WCHB(R4),R3 ;;;GET 2*(CHANNEL + 1)# ADD R3,(SP) ;;;POINT TO FIRST DACE( CALL .KRDWD ;;;READ FIRST CHANNEL DATA! MOV R3,@(SP) ;;;WRITE TO THE DAC$ ADD #2,(SP) ;;;POINT TO SECOND DAC& CALL .KRDWD ;;;READ SECOND DATA WORD% MOV R3,@(SP)+ ;;;WRITE TO SECOND DAC, .IF DF Q$$BUS- BIT #S$WSIB,S.WFLG(R4) ;;;SET INTENSIFY BIT?F BEQ 20$ ;;;IF EQ NON>.A0DLY::BIT -(SP),(SP)+ ;;;YES--DELAY FOR SECOND DAC TO SETTLE/ MOV S.WCSR(R4),R3 ;;;GET CSR (1ST DAC) ADDRESSR" BIS #1,6(R3) ;;;SET INTENSIFY BIT..A1DLY::BIT -(SP),(SP)+ ;;;DO A DELAY OF SORTS$ BIC #1,6(R3) ;;;CLEAR INTENSIFY BIT .ENDC ;Q$$BUS 20$: RETURNM .DSABL LSBW E# .SBTTL .AASO2 N-CHANNEL D/A OUTPUTT;+9; .AASO2 -- SYNCH. CLOCK ROUTINE FOR N-CHANNEL D/A OUTPUTP;;E; THIS ROUTINE IS CALLED AT CL00aa_c_d_kOCK INTERRUPT LEVEL TO OUTPUT MORE THANS; TWO CHANNELS OF D/A OUTPUT.;; ; INPUTS:D;:; R4 POINTS TO SWB ; R3 FREEO;E ; OUTPUTS:;T2; C-CLEAR ALL CHANNELS OUTPUT--DO NOT NEED TO FORK9; C-SET ALL CHANNELS OUTPUT--FORK FOR END OF BUFFER/SWEEP);;F; NOTE: THIS ROUTINE EXPECTS THAT THE SIZE OF THE BUFFER IS A MULTIPLE>; OF WORDS. IF THIS IS NOT THE CASE, UNEXPECTED RESULTS ; WILL OCCUR.;+;-0.AASO2: CLR -(SP) ;;;SET C-BIT SAVER ONTO STACK%10$: CALL .KRDWD ;;;READ A DATA WORDL ROL (SP) ;;;SAVE C-BIT MOV R3,-(SP) ;;;SAVE DATA WORD % MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSP, MOVB S.WCHB(R4),-(SP);;;GET 2*(CHANNEL + 1). CLRB 1(SP) ;;;MAKE SURE WE ONLY ADD LOW BYTE$ ADD (SP)+,R3 ;;;POINT TO PROPER DAC$ MOV (SP)+,(R3) ;;;WRITE DATA TO DAC ROR (SP) ;;;CHECK C-BITH BCC 20$ ;;;IF CC CONTINUET& ROL (SP) ;;;SET PERMANENT C-BIT FLAG) BIT #S$WSTP,S.WFL2(R4) ;;;SHOULD WE STOP BNE 40$ ;;;IF NE YES+20$: CALL .AANXC ;;;NO--GO TO NEXT CHANNELL3 CMP S.WCHX(R4),S.WNCH(R4) ;;;DONE ENOUGH CHANNELS?B BNE 10$ ;;;NO--DO MORE 40$: ROR (SP)+ ;;;RESTORE C-BIT RETURND .ENDC ;N$AA11 .ENDSP);;;GET 2*(CHANNEL + 1). CLRB 1(SP) ;;;MAKE SURE WE ONLY ADD LOW BYTE$ ADD (SP)+,R3 ;;;POINT TO PROPER DAC$ MOV (SP)+,(R3) ;;;WRITE DATA TO DAC ROR (SP) ;;;CHECK C-BITH BCC 20$ ;;;IF CC CONTINUET& ROL (SP) ;;;SET PERMANENT C-BIT FLAG) BIT #S$WSTP,S.WFL2(R4) ;;;SHOULD WE STOP BNE 40$ ;;;IF NE YES+20$: CALL .AANXC ;;;NO--GO TO NEXT CHANNELL3 CMP S.WCHX(R4),S.WNCH(R4) ;' .TITLE KDRDRV DRIVER ROUTINES FOR DR11- .IDENT /V04.00/;+<; COPYRIGHT (c) 1977, 1982 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;(<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.N;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION V04.00; B. SCHREIBER 4-SEP-77E;E; MODIFIED BY:;U; B. SCHREIBER 15-MAY-78<; BLS048 -- CLEAR BITS IN DR11 INPUT REGISTER ON SYNCH. I/O.;H; M. S. HARVEY 12-MAY-799; MSH032 -- IGNORE INTERRUPTS FOLLOWING END OF DATA SWEEPT; ; M. S. HARVEY 12-MAY-79*; MSH033 -- CORRECT STACK MANIPULATION BUG;U; M. S. HARVEY 13-MAY-79B; MSH035 -- IMPLEMENT INPUT SERVICE FOR INTERRUPTS BY CONTROL LINE; ; H. BERNSTEIN 16-SEP-81:; HB015 -- CORRECT ACCESS TO READ ONLY REGISTER FOR Q-BUS;;EB; THIS MODULE CONTAINS THE DR11 INTERRUPT AND CONNECT TO INTERRUPT ; ROUTINES.-;8; SYSTEM MACRO CALLS;I .MCALL KSWDF$, KDVDF$, CINT$S KSWDF$  KDVDF$V 1/ .SBTTL .DRCNI CONNECT DR11 TO INTERRUPT VECTOR ;+,; .DRCNI -- CONNECT DR11 TO INTERRUPT VECTOR;0 ; INPUTS:C;T; R4 SWB ADDRESS; ; OUTPUTS:;V; C-SET COULD NOT CONNECTM; C-CLEAR SUCCESSC;O;-..DRCNI::CALL .DRSLI ;SELECT INTERRUPT ROUTINE1 BIT #UF$CIN,S.WUBX+U.FLG(R4) ;ALREADY CONNECTED?I! BNE 20$ ;IF NE YES--DON'T RETRYL MOV R4,R3 ;COPY SWB ADDRESSN' SUB #4,R3 ;POINT TO INTERRUPT ROUTINE8/ MOV S.WUBX+U.IVEC(R4),R2 ;ASSUME INPUT CONNECT$ BIT #S$WIOF,S.WFL2(R4) ;IS IT? BNE 10$ ;IF NE YES& MOV S.WUBX+U.OVEC(R4),R2 ;NO--GET OVA410$: CINT$S R2,#$KBASE,R3,#.DREDI,S.WPRI(R4),#.DRAST ;CONNECT TO INTERRUPT VECTOR BCS 40$120$: BIS #UF$CIN,S.WUBX+U.FLG(R4) ;FLAG CONNECTEDO CLC 40$: RETURNL R/ .SBTTL .DREDI DR11 ENABLE/DISABLE CINT ROUTINEB;+A; .DREDI -- ENABLE/DIS00aaa`TADATADATADATADATADATAABLE ROUTINE FOR DR11 CONNECT TO INTERRUPTSR;3<; THIS ROUTINE IS CALLED BY THE EXECUTIVE WHEN CONNECTING OR'; DISCONNECTING FROM INTERRUPT VECTORS. ;N ; INPUTS:#;I&; R1 POINT TO INTERRUPT TRANSFER BLOCK;S ; OUTPUTS:;.1; INTERRUPTS FOR THE SPECIFIED DR11 ARE DISABLED.,9; ALL INPUT BITS ARE CLEARED IF THIS IS AN INPUT CONNECT.R;B;- .PSECT .KSCT19.DREDI::MOV X.VEC(R1),R0 ;GET VECTOR ADDRESS OF THIS DR115 MOV .DRXPT,R2 ;GET POINTER TO DR11 SWB POINTER TABLE+,20$: MOV (R2)+,R3 ;GET NEXT DR11 SWB ADDRESS BEQ 60$ ;IF EQ I AM CONFUSED7 CMP S.WUBX+U.IVEC(R3),R0 ;IS THE INPUT VECTOR CORRECT? BEQ 40$ ;IF EQ YES8 CMP S.WUBX+U.OVEC(R3),R0 ;NO--IS OUTPUT VECTOR CORRECT?& BNE 20$ ;IF NE NO--LOOK AT NEXT DR11,40$: MOV S.WCSR(R3),R2 ;GET DR11 CSR ADDRESS4 CMP S.WUBX+U.IVEC(R3),R0 ;IS THIS AN INPUT CONNECT? BNE 50$ ;IF NE NO0 BIC #DI$ENB,(R2) ;YES--DISABLE INPUT INTERRUPTS .IF NDF Q$$BUSH2 MOV #177777,DI$BUF(R2) ;YES--CLEAR ALL INPUT BITS .ENDC ;Q$$BUS BR 60$ ;ALL DONE050$: BIC #DO$ENB,(R2) ;DISABLE OUTPUT INTERRUPTS:60$: MOV @#$TKTCB,.KTKCB ;AND GET MY TCB ADDRESS FOR LATER RETURNI Q/ .SBTTL .DRSSC SELECT SYNCHRONOUS CLOCK ROUTINEC;+,; .DRSSC -- SELECT SYNCHRONOUS CLOCK ROUTINE;0<; THIS ROUTINE SELECTS EITHER .DRISR OR .DROSR FOR THE CLOCK; INTERRUPT ROUTINE TO CALL.;? ; INPUTS: ; ; R4 POINTS TO A COMPLETE SWB-;A ; OUTPUTS:;R>; S.WSCR IS FILLED IN THE SWEEP CONTROL BLOCK POINTED TO BY R48; S.WSTR IS FILLED IN WITH .DRSTR (USER VIRTUAL ADDRESS);B;- .IF DF K$$W11@.DRSSC::MOV #.DRSTR,S.WSTR(R4) ;SET SCHMITT TRIGGER ROUTINE ADDR' MOV #.DROSR,-(SP) ;ASSUME OUTPUT SWEEPC1 BIT #S$WIOF,S.WFL2(R4) ;IS THIS AN OUTPUT SWEEP?- BEQ 20$ ;IF EQ YES* MOV #.DRISR,(SP) ;NO--SET FOR INPUT SWEEP .IF DF K$W11K; BIT #S$WTSS,S.WFLG(R4) ;IS IT TIME-STAMPED INPUT SAMPLING? BEQ 20$ ;IF EQ NO--ALL SET" MOV #.DRIST,(SP) ;YES--SET FOR IT .ENDC ;K$W11K20$: ;REF LABEL .IF DF M$$MGE6 ADD $KRLC5,(SP) ;RELOCATE TO APR5 FOR CLOCK INTERRUPT .ENDC ;M$$MGE! MOV (SP)+,S.WSCR(R4);SET THE SWB; RETURN ;BACK TO CALLER  .ENDC ;K$$W11 S, .SBTTL .DRSLI SELECT DR11 INTERRUPT ROUTINE;+); .DRSLI -- SELECT DR11 INTERRUPT ROUTINEY; ; INPUTS:R;P; R4 POINTS TO SWB ; SWB SET UP; ; OUTPUTS:;#8; PROPER INTERRUPT ROUTINE ADDRESS LOADED INTO INTERRUPT!; TRANSFER VECTOR IN FRONT OF SWBD;T;-..DRSLI::MOV #.DRIN0,-(SP) ;ASSUME SIMPLE INPUT% BIT #S$WIOF,S.WFL2(R4) ;IS IT INPUT?C BNE 20$ ;IF NE YES% MOV #.DRIN2,(SP) ;NO--SET FOR OUTPUTE BR 40$ ;SKIP20$: ;REF LABEL .IF DF K$W11K/ BIT #S$WTSS,S.WFLG(R4) ;TIME STAMPED SAMPLING?S BEQ 40$ ;IF EQ NOR" MOV #.DRIN1,(SP) ;YES--SET FOR IT .ENDC ;K$W11K40$: ;REF LABEL .IF DF M$$MGE" ADD $KRLC5,(SP) ;RELOCATE TO APR5 .ENDC ;M$$MGE0 MOV (SP)+,-2(R4) ;STORE ADDRESS IN FRONT OF SWB+ ; (THIS IS 2ND WORD OF JSR INSTRUCTION)  RETURN ;BACK TO CALLERE P% .SBTTL DRINT DR11 INTERRUPT ROUTINEST;++; .DRIN0 -- DIGITAL INPUT INTERRUPT ROUTINET;R8; THIS ROUTINE IS ENTERED WITH A JSR R4, .DRIN0 FROM THE;; DATA BASE. THIS WILL LEAVE R4 POINTING TO THE PROPER SWB.Q;$ ; INPUTS:R;M; R4 POINT TO SWBS;E ; OUTPUTS:;N8; WORD READ INTO USER BUFFER. IF NECESSARY, FORK TO SET; EVENT FLAG OR QUEUE AN AST.;.;-1.DRIN0::MOV R3,(SP) ;;;SAVE R3--OVERWRITE OLD R4  .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESST6 BIT #S$CTRL,S.WFLG(R4) ;;;INTERRUPT BY CONTROL LINES? BEQ 5$ ;;;IF EQ NO2 BIS #DI$ENB,(R3) ;;;ENABLE INTS AND CLEAR IN FLAG MOV DI$BUF(R3),R3 ;;;GET DATUMI BR 7$%5$: MOV DI$BUF(R3),-(SP) ;;;READ DR114 .IF NDF Q$$BUS% MOV (SP),DI$BUF(R3) ;;;WRITE IT BACKF .ENDC ;Q$$BUS. BIS #DI$ENB,(R3) ;;;ENABLE FOR NEXT INTERRUPT MOV (SP)+,R3 ;;;GET DATUM(7$: CALL .KWRWD ;;;WRITE TO USER BUFFER BR .DRINX ;;;GO TO COMMON CODE .IF DF K$W11K;+3; .DRIN1 -- DR11 INPUT INTERRUPT WITH TIME STAMPINGT;SB; THIS ROUTINE IS ENTE00aa_c_d_kRED WITH A JSR R4,.DRIN1 FROM THE DATA BASE,!; LEAVING R4 POINTING TO THE SWB.E;I ; INPUTS:V;$; R4 POINTS TO SWB;I ; OUTPUTS:;O6; DATA WORD AND VALUE OF 16-BIT SOFTWARE CLOCK AT TIME=; OF SAMPLE ARE WRITTEN INTO THE USER BUFFER. FORK REQUESTEDS.; IF NECCESARY TO SET EVENT FLAG OR QUEUE AST.;P;--.DRIN1::MOV R3,(SP) ;;;SAVE R3--OVERWRITE R4  .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSP5 BIT #S$CTRL,S.WFLG(R4) ;;;INTERRUPT BY CONTROL LINE?1 BEQ 5$ ;;;IF EQ NO2 BIS #DI$ENB,(R3) ;;;ENABLE INTS AND CLEAR IN FLAG MOV DI$BUF(R3),R3 ;;;GET DATUMP BR 7$*5$: MOV DI$BUF(R3),-(SP) ;;;READ DATA WORD .IF NDF Q$$BUSS% MOV (SP),DI$BUF(R3) ;;;WRITE IT BACKF .ENDC ;Q$$BUS. BIS #DI$ENB,(R3) ;;;ENABLE FOR NEXT INTERRUPT MOV (SP)+,R3 ;;;GET DATA WORD(7$: CALL .KWRWD ;;;WRITE TO USER BUFFER" MOV .CLK16,R3 ;;;GET 16 BIT CLOCK CALL .KWRWD ;;;WRITE TO BUFFER BR .DRINX ;;;GO TO COMMON CODE .ENDC ;K$W11K R, .SBTTL .DRIN2 DR11 OUTPUT INTERRUPT ROUTINE;+); .DRIN2 -- DR11 OUTPUT INTERRUPT ROUTINEG;MA; THIS ROUTINE IS CALLED WITH A JSR R4,.DRIN2 FROM THE DATA BASE.;-; THIS LEAVES R4 POINTING TO THE CORRECT SWB.,;B ; INPUTS:R; ; R4 POINTS TO SWB$;S ; OUTPUTS:;B9; WORD IS READ FROM USER BUFFER AND OUTPUT TO DR11. FORKT9; REQUESTED IF END OF BUFFER OR END OF SWEEP TO SET EVENT1; FLAG OR QUEUE AST.;;-1.DRIN2::MOV R3,(SP) ;;;SAVE R3--OVERWRITE OLD R4M .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE+ CALL .KRDWD ;;;READ WORD FROM USER BUFFERO MOV R3,-(SP) ;;;SAVE DATUM % MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESST% BIS #DO$ENB,(R3) ;;;ENABLE INTERRUPTT$ MOV (SP)+,DO$BUF(R3) ;;;OUTPUT DATA;+5; .DRINX -- FINISH UP DR11 INTERRUPT ROUTINE AND EXIT ;R); ENTER HERE TO FINISH UP DR11 INTERRUPT.S; ; INPUTS:U;R.; KISAR6 ON TOP OF STACK (MAPPED SYSTEMS ONLY); R3 NEXT ON STACK; C-SET IF FORK NECESSARY-;E ; OUTPUTS:;3; KISAR6, R3 RESTORED. FORK REQUESTED IF C-BIT SET8; IF STOPPING SWEEP, DR11 IS DISABLED FROM INTERRUPTING.;E;-.DRINX: ;;;REF LABEL .IFT ;M$$MGE,# MOV (SP)+,@#KISAR6 ;;;RESTORE APR63 .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3O! BCC 80$ ;;;IF CC NO FORK NEEDEDH* BIT #S$WSTP,S.WFL2(R4) ;;;STOPPING SWEEP? BEQ 60$ ;;;IF EQ NO ( CALL .DSBDR ;;;YES--DISABLE INTERRUPTS960$: CALLR .KEFQI ;;;FORK, SET EFN OR QUEUE AST AND EXITA 80$: RETURNF;+(; .DSBDR -- DISABLE DR11 FROM INTERRUPTS;R0; THIS ROUTINE DISABLES A DR11 FROM INTERRUPTING; ; INPUTS: ;D; R4 POINTS TO SWBT;. ; OUTPUTS:;I<; INPUT OR OUTPUT INTERRUPTS (AS APPROPRIATE) ARE DISABLED.;R;-1.DSBDR: MOV #DI$ENB,-(SP) ;;;ASSUME INPUT DISABLEE/ BIT #S$WIOF,S.WFL2(R4) ;;;CHECK WITH THE FLAGS$" BNE 20$ ;;;IF NE YES--GO DISABLE2 MOV #DO$ENB,(SP) ;;;NO--DISABLE OUTPUT INTERRUPTS020$: BIC (SP)+,@S.WCSR(R4) ;;;DISABLE INTERRUPTS; MOV #.DRNOP,-2(R4) ;;;REDIRECT INTERRUPTS TO DUMMY ROUTINEL .IFT ;M$$MGER* ADD $KRLC5,-2(R4) ;;;RELOCATE THRU KISAR5 .IFTF ;M$$MGE RETURN;+*; .DRNOP -- DUMMY DR11-K INTERRUPT ROUTINE;T; THIS ROUTINE EATS INTERRUPTS;T ; INPUTS:B;.; R4 POINTS TO SWB; (SP) CONTAINS OLD R4; ; OUTPUTS:;!; EFFECT A NOOP INTERRUPT SERVICET;H;-!.DRNOP::TST (SP)+ ;;;CLEAN STACKB RETURN ;;;LOSE INTERRUPT HERE O2 .SBTTL .DRIN3 SCHMITT TRIGGER SIMULATOR INTERRUPT;+6; .DRIN3 -- SIMULATE SCHMITT TRIGGER INTERRUPT ROUTINE;M<; THIS ROUTINE IS ENTERED WITH A JSR R4,.DRIN3 FROM THE DATA'; BASE, LEAVING R4 POINTING TO THE SWB.; ; INPUTS:P; ; R4 POINTS TO SWB;R ; OUTPUTS:;H9; ALL SWEEPS REQUESTING EXTERNAL EVENT START ARE STARTED. 4; IF CLOCK IS IN THE SYSTEM, IT IS ENABLED TO COUNT.;E;--.DRIN3::MOV R3,(SP) ;;;SAVE R3, OVERWRITE R4S .IFT ;M$$MGEC MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE& MOV S.WCSR(R4),R3 ;;;SET UP R3 TO CSR+ MOV DI$BUF(R3),-(SP) ;;;READ DIGITAL INPUTR .IF NDF Q$$BUS % MOV (SP),DI$BUF(R3) ;;;WRITE IT BACKI00aaa`TADATADATADATADATADATA .ENDC ;Q$$BUS2 BIT (SP)+,S.WMSK(R4);;;ANY LIT BITS SATISFY DIGO?! BNE 10$ ;;;IF NE YES--GO HANDLEU2 BIS #DI$ENB,(R3) ;;;NO--ENABLE FOR NEXT INTERRUPT BR 100$ ;;;GO EXIT210$: BIC #S$WSST,S.WFL2(R4) ;;;YES--CLEAR SST FLAG .IF DF FT$MOP .IF DF M$$MGE< MOV #<.KLQUX-S.WCLX>+120000-<$KBASE & 177700>,R4 ;;;PT TO Q .IFF ;M$$MGEN' MOV #<.KLQUX-S.WCLX>,R4 ;;;PT TO QUEUER .ENDC ;M$$MGE .IF DF K$$W11( MTPS #PR6 ;;;LOCK OUT CLOCK INTERRUPTS .ENDC ;K$$W11/15$: MOV S.WCLX(R4),R4 ;;;LINK TO NEXT IN QUEUES BEQ 80$ ;;;IF EQ ALL DONES/ BIT #S$WEXT,S.WFLG(R4) ;;;WANT EXTERNAL START?S# BEQ 15$ ;;;IF EQ NO--LOOK AT NEXTI* BIC #S$WEXT,S.WFLG(R4) ;;;YES--CLEAR FLAG .IFF ;FT$MOP;! MOV .KASWX,R4 ;;;GET SWB ADDRESSP- BEQ 100$ ;;;I DON'T KNOW WHAT TO DO IF 0!!!00 BIT #S$WEXT,S.WFLG(R4) ;;;DOING EXTERNAL START? BEQ 100$ ;;;IF EQ NO-60$: BIC #S$WEXT,S.WFLG(R4) ;;;YES--CLEAR FLGF .ENDC ;FT$MOP .IF DF M$$MGE3 MOV S.WSTR(R4),-(SP) ;;;PREPARE TO CALL ST ROUTINE4, ADD $KRLC5,(SP) ;;;RELOCATE ADDRESS TO APR5 CALL @(SP)+ ;;;CALL ST ROUTINE .IFF ;M$$MGEE: CALL @S.WSTR(R4) ;;;CALL SCHMITT TRIGGER ROUTINE TO START ;;; SWEEP .ENDC ;M$$MGE .IF DF FT$MOP! BR 15$ ;;;EXAMINE REST OF QUEUE .ENDC ;FT$MOP80$: ;;;REF LABEL .IF DF K$$W11) MOV .KACSR,R3 ;;;GET CLOCK A CSR ADDRESS0; BIC #KA$STF!KA$STI!KA$STE,(R3) ;;CLEAR SCHMITT TRIG ENABLEF# INC (R3) ;;;ENABLE CLOCK TO COUNTE .IF DF FT$MOP2 MTPS S.WPRI(R4) ;;;LOWER PRIORITY TO DEVICE AGAIN .ENDC ;FT$MOP .ENDC ;K$$W11100$: ;;;REF LABELI .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6  .ENDC ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3C RETURN ;;;F > .SBTTL .DRISR/.DROSR/.DRSTR SYNCHRONOUS CLOCK DRIVEN ROUTINES .IF DF K$$W11;+(; .DRISR -- SYNCH. DIGITAL INPUT ROUTINE;CC; THIS ROUTINE IS CALLED AT CLOCK INTERRUPT LEVEL TO INPUT ONE WORDG; FROM THE DR11.;; ; INPUTS:O;T; R4 POINTS TO SWB ; R3 FREEM; ; OUTPUTS:;O<; DATA WORD IS INPUT FROM DR11 AND WRITTEN INTO USER BUFFER.); C-SET NEED FORK TO SET EFN OR QUEUE ASTM; C-CLEAR ALL IS WELLR;;;-,.DRISR::MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESS* MOV DI$BUF(R3),-(SP);READ VALUE FROM DR11 .IF NDF Q$$BUSS0 MOV (SP),DI$BUF(R3) ;;;WRITE BACK TO CLEAR BITS .ENDC ;Q$$BUS MOV (SP)+,R3 ;RETRIEVE VALUE, CALLR .KWRWD ;;;WRITE TO BUFFER AND RETURN .IF DF K$W11K;+0; .DRIST -- DR11 SYNCH. INPUT WITH TIME STAMPING;B>; THIS ROUTINE IS CALLED AT CLOCK INTERRUPT LEVEL TO INPUT ONEB; DATA WORD FROM THE DR11 AND STORE IT AND THE VALUE OF THE 16-BIT$; SOFTWARE CLOCK IN THE USER BUFFER.; ; INPUTS: ;C; R4 POINT TO SWBR ; R3 FREEM;D ; OUTPUTS:;;9; BOTH DATA WORDS (DR11 INPUT AND 16-BIT CLOCK VALUE) AREF; WRITTEN INTO USER BUFFER.I); C-SET NEED FORK TO SET EFN OR QUEUE ASTI; C-CLEAR ALL OK;W;-,.DRIST::MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESS* MOV DI$BUF(R3),-(SP);READ VALUE FROM DR11 .IF NDF Q$$BUS0 MOV (SP),DI$BUF(R3) ;;;WRITE BACK TO CLEAR BITS .ENDC ;Q$$BUS MOV (SP)+,R3 ;RETRIEVE VALUEA* CALL .KWRWD ;;;WRITE WORD TO USER BUFFER( MOV .CLK16,R3 ;;;GET 16-BIT CLOCK VALUE1 CALLR .KWRWD ;;;WRITE TO USER BUFFER AND RETURN .ENDC ;K$W11K;+); .DROSR -- SYNCH. DIGITAL OUTPUT ROUTINEE;N?; THIS ROUTINE IS CALLED AT CLOCK INTERRUPT LEVEL TO OUTPUT ONE-; WORD TO THE DR11.;D ; INPUTS:.;R; R4 POINTS TO SWB ; R3 FREEV;$ ; OUTPUTS:;E.; NEXT DATA WORD FROM BUFFER IS OUTPUT TO DR11+; C-SET FORK NEEDED TO SET EFN OR QUEUE AST; C-CLEAR ALL OK;V;-&.DROSR::CALL .KRDWD ;;;READ DATA WORD MOV R3,-(SP) ;;;SAVE DATA WORDL% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSR6 MOV (SP)+,DO$BUF(R3) ;;;WRITE DATA TO OUTPUT REGISTER- RETURN ;;;RETURN WITH C INTACT FROM .KRDWD  .ENDC ;K$$W11;+2; .DRSTR -- HANDLE SCHMITT TRIGGER START INTERRUPT;A; THIS ROUTINE IS CALLED BY THE SCHMITT TRIGGER INTERRUPT ROUTINEFD; TO START A DIGITAL I/O SWEEP AFTER THE ST FIRING AND/OR DELAY FROM; START EVENT.;-?.DRSTR00bb_c_d_k::BIT #S$WNOV,S.WFLG(R4) ;;;NON-OVERFLOW DRIVEN SAMPLING?A$ BEQ 40$ ;;;IF EQ NO--NOTHING TO DO2 CALL .DRSLI ;;;SELECT INTERRUPT ROUTINE -- COULD* ;;; HAVE BEEN DIGO STARTING THIS SWEEP/ MOV S.WCSR(R4),R3 ;;;YES--GET UNIT CSR ADDRESSH( MOV #DI$ENB,-(SP) ;;;ASSUME INPUT SWEEP+ BIT #S$WIOF,S.WFL2(R4) ;;;CHECK TO BE SURET BNE 20$ ;;;IF NE INPUT SWEEP* MOV #DO$ENB,(SP) ;;;NO--SET OUTPUT ENABLE,20$: BIS (SP)+,(R3) ;;;ENABLE FOR INTERRUPTS 40$: RETURNA .ENDAY FROM; START EVENT.;-?.DRSTR* .TITLE KSTADC SET A/D CHANNEL INFORMATION .IDENT /02.01/; ; COPYRIGHT (C) 1977, 1978, 1980/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 02.01 ; B. SCHREIBER 16-AUG-77;E; MODIFIED BY:;U; M. S. HARVEY 3-JAN-80T/; MSH081 -- CORRECT ARGUMENT VALIDATION CHECKS;O9; HB021 -- FLAG SETADC CALLED WHEN CALL .ADGCH SUCCEEDS;N;C?; THIS ROUTINE SETS UP A/D CHANNEL INFORMATION FOR AN A/D SWEEPI; ; SYSTEM MACRO CALLS;  .MCALL KSWDF$ KSWDF$T ;+'; SETADC -- SET A/D CHANNEL INFORMATION ;U; CALLING SEQUENCE: ; 5; CALL SETADC(IBUF,[IFLAG],[ICHN],[NCHN],[INC],[IND]) ; OR0; INC = (IBUF,[IFLAG],[ICHN],[NCHN],[INC],[IND]);S ; INPUTS:-;-1; IBUF (IGNORED--PRESENT FOR LPA11 COMPATIBILITY)TA; IFLAG IS 0 (DEFAULT) IF ABS CHANNEL ADDRESSING, NON-0 OTHERWISE-1; ICHN IS THE FIRST CHANNEL NUMBER (DEFAULT IS 0)9; NCHN IS THE NUMBER OF CHANNEL INCREMENTS (DEFAULT IS 1)/9; INC IS THE SIZE OF THE CHANNEL INCREMENT (DEFAULT IS 1); USE 2 FOR DIFFERENTIAL INPUT ; ; OUTPUTS:;T!; IND 0 IF ILLEGAL CHANNEL NUMBER; 1 IF ALL OK.; CHANNEL INFORMATION SET IN SWB FOR A/D SWEEP; ;-SETADC:: ;REF LABEL,ISTADC:: ;REF LABELU/ CALL .K.PAA ;VALIDATE AND SETUP ARGS ON STACKA .WORD 6 ;SIX ARGUMENTS. .WORD 40 ;ALL MAY BE DEFAULTED (EXCEPT IBUF) BCS 100$ ;IF CS ERROR % MOV #.ADSWB,R4 ;POINT AT THE A/D SWBI, TST (SP)+ ;POP OFF IBUF ADDRESS (NOT USED)" CLR S.WFLG(R4) ;CLEAR SWEEP FLAGS/ MOV (SP)+,R3 ;GET 'IFLAG' AND SEE IF DEFAULTEDE BNE 10$ ;IF NE NOU% MOV #.ZEROW,R3 ;YES--POINT AT A ZERON10$: MOV (SP)+,R0 ;GET 'ICHN'E MOV (SP)+,R1 ;GET 'NCHN'R MOV (SP)+,R2 ;GET 'INC' BNE 20$ ;IF NE USE GIVEN 'INC'! MOV #.ONE,R2 ;DEFAULT 'INC' TO 1N&20$: CMP #2,(R2) ;DIFFERENTIAL INPUT? BNE 40$ ;IF NE NO;% BIS #S$WDIF,S.WFL2(R4) ;YES--FLAG ITS340$: MOV (R2),S.WCHI(R4) ;SET THE CHANNEL INCREMENT/9 BIS #S$WACA,S.WFL2(R4) ;FLAG ABSOLUTE CHANNEL ADDRESSINGS TST (R3) ;CHECK WITH 'IFLAG' BEQ 45$ ;IF EQ YES- BIC #S$WACA,S.WFL2(R4) ;NO--CLEAR BIT IN SWB3 BIS #7,S.WFLG(R4) ;SET GAIN BITS FOR .ADGCH TO SEE+(45$: MOV SP,R5 ;SET SAVED STACK POINTER' MOV R1,-(SP) ;SET ARGS BACK ONTO STACKI MOV R0,-(SP) ; ...( CALL .ADGCH ;SETUP CHANNEL INFORMATION50$: MOV #1,R0 ;ASSUME SUCCESS BCC 60$ ;IF CC CORRECT CLR R0 ;ELSE SET FOR FAILUREC60$: BIS #S$WADC,S.WFL2(R4) ;FLAG THAT WE WERE HERE (SETADC CALLED)A( MOV (SP)+,R5 ;GET ADDRESS OF IND OR 0  BEQ 80$ ;IF EQ NO 'IND' GIVENA$ MOV R0,(R5) ;STORE RESULT IN 'IND'80$: RETURN ;BACK TO CALLERW;; HERE IF ERROR FROM .K.PAAB; (100$: CLR R0 ;CLEAR FOR FUNCTION RETURN CLR R3 ;SET CODE FOR .IESTOP& MOV #6,R4 ;STORE INTO SIXTH ARGUMENT- CALLR .IESTO ;TRY TO STORE ERROR AND RETURNA .END: MOV #1,R0 ;ASSUME SUCCESS BCC 60$00baa`TADATADATADATADATADATA$ .TITLE KADINP SINGLE CHAN A/D INPUT .IDENT /2.02/;#; COPYRIGHT (C) 1977, 1981/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.T;D>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 2.02; B. SCHREIBER 20-OCT-77; ; MODIFIED BY:; ; M. S. HARVEY 4-JAN-80D(; MSH082 -- CORRECT GAIN RANGING OPTION;T; H. BERNSTEIN 20-OCT-815; HB018 -- ADD UCB OFFSET TO ACCESS SUBSEQUENT UCBs;'; HB039 -- MAKE U.LGTH IMMEDIATE MODEJ; ;C1; THIS MODULE PERFORMS A SINGLE A/D CHANNEL INPUTD; ; SYSTEM MACRO CALLS; .MCALL KSWDF$, KDVDF$ KSWDF$E KDVDF$  R- .SBTTL ADINP/IADINP SINGLE CHANNEL A/D INPUT ;+6; ADINP/IADINP -- SINGLE CHANNEL A/D SINGLE SHOT INPUT;E=; THIS ROUTINE SAMPLES ONE A/D CHANNEL ONE TIME (SINGLE SHOT) ;S; CALLING SEQUENCE: ;H ; CALL ADINP (MODE, ICHAN, IVAL);T; WHERE:;E.; MODE DESCRIBES THE MODE (SEE DOCUMENTATITON) ; ICHAN IS THE CHANNEL TO SAMPLE; IVAL IS THE SAMPLED VALUED; ; OUTPUTS:;M; IVAL THE SAMPLE VALUE/;H;-ADINP:: IADINP::# CALL .K.PAA ;PUSH ARGS ONTO STACKD .WORD 3 ;THREE ARGS .WORD 0 ;NONE REQUIRED. BCS 140$ ;HOW CAN YOU LOSE IF NONE REQUIRED? MOV (SP)+,R0 ;GET MODE ADDRESSI BNE 20$ ;IF NE CONTINUEM& MOV #.ZEROW,R0 ;ELSE USE DEFAULT OF 020$: MOV (R0),R4 ;GET MODE $ MOV (SP)+,R1 ;GET CHANNEL # ADDRESS BNE 40$ ;BR IF SUPPLIEDD MOV #.ZEROW,R1 ;USE CHANNEL 0"40$: MOV (R1),R5 ;GET THE CHANNEL0 CALL .ADIFU ;FIND A/D UNIT AND RETURN WITH CSR( ; ADDRESS IN R3, AND LH OF CSR IN R2( BCS 120$ ;IF CS ILLEGAL CHANNEL NUMBER, MOVB R2,1(R3) ;SET THE CHANNEL INTO THE CSR INC (R3) ;START THE CONVERSION( MOV #TMO$AD,R2 ;GET THE TIMEOUT COUNTER,60$: BIT #AD$ERR!AD$DON,(R3) ;ERROR OR DONE? BMI 80$ ;IF MI ERROR BNE 100$ ;IF NE DONE DEC R2 ;NEITHER--TIMEOUT? BGT 60$ ;NOT YET' MOV #ADTMOV,R0 ;YES--SET TIMEOUT VALUEE BR 120$ ;FINISH UP;C; A/D CONVERSION ERROR; $80$: MOV 2(R3),R0 ;READ VALUE ANYHOW .IF DF Q$$BUS" BIC #AD$ERR,(R3) ;CLEAR ERROR BIT .ENDC ;Q$$BUS MOV #ADERRV,R0 ;SET ERROR VALUE BR 120$ ;FINISH;; "; CONVERSION COMPLETED--READ VALUE;T100$: ;REF LABELM .IF DF A$$M11 CMP R4,#5 ;GAIN RANGING? BNE 110$ ;IF NE NO- CALL .ADIGR ;YES--PERFORM AUTO-GAIN RANGING0 BR 120$ ;RETURNC .IFTF ;A$$M11(110$: MOV 2(R3),R0 ;READ CONVERTED VALUE .IFT ;A$$M11 & TST R4 ;ABSOLUTE CHANNEL ADDRESSING?. BEQ 120$ ;IF EQ YES--SKIP GAIN BIT INSERTION MOV (R3),R1 ;NO--GET CSR WORDC( BIC #147777,R1 ;CLEAR ALL BUT GAIN BITS& BIS R1,R0 ;SET GAIN BITS INTO RESULT .ENDC ;A$$M11$120$: MOV (SP)+,R1 ;GET IVAL ADDRESS- BEQ 140$ ;IF EQ NOPLACE TO STORE--JUST EXIT1 MOV R0,(R1) ;STORE INTO IVAL140$: RETURN ;DONE L' .SBTTL .ADIFU FIND A/D UNIT AND SET UP0;+; .ADIFU -- FIND A/D UNIT$;1 ; INPUTS:O;(; R4 MODE FLAGE; R5 CHANNEL NUMBERA;1 ; OUTPUTS:;;; R3 CSR ADDRESS; R2 LH (CHANNEL) OF CSR; ;-E.ADIFU: MOV #.ADSWB+S.WUCB-U.LGTH,R3 ;POINT TO FIRST UCB MINUS U.LGTHR& MOV #-1,R2 ;INIT THE CHANNEL COUNTER3 MOV .ADSWB+S.WUNT,R1 ;GET NUMBER OF A/D CONVERTERS ; ; HERE FOR EACH CONVERTER;Q%20$: MOV #16.,R0 ;ASSUME 16 CHANNELSI+ ADD #U.LGTH,R3 ;POINT TO FIRST OR NEXT UCBU .IF DF A$$M11) BIT #UF$AMK,U.FLG(R3) ;IS THERE AN AM11? BEQ 40$ ;NO--ONLY 16 CHANNELS % TST R4 ;GAIN RANGING (OF ANY00bb_c_d_k SORT)?A- BNE 40$ ;IF NE YES--NOT ABS CHAN ADDRESSINGE0 MOV #64.,R0 ;ABS CHAN MODE W/AM11--64 CHANNELS .IFTF ;A$$M11-40$: ADD R0,R2 ;COMPUTE LAST CHANNEL ON UNIT#- CMP R5,R2 ;IS DESIRED CHANNEL ON THIS UNIT?. BLOS 100$ ;IF LOS YESD" DEC R1 ;NO--LOOKED AT ALL UNITS? BGT 20$ ;IF GT NOV& CLR R0 ;CLEAR IN CASE WE STORE VALUE SEC ;FLAG A SCREW UPR RETURNU;; WE FOUND THE UNITT;F"100$: MOV R5,R2 ;COPY THE CHANNEL .IFT ;A$$M11L% BIC #^C<77>,R2 ;ASSUME ABS CHAN MODEF TST R4 ;SEE IF SO$ BEQ 120$ ;IF EQ YESH .ENDC ;A$$M11# BIC #^C<17>,R2 ;NO--TRIM SOME MOREH BIC #^C<7>,R4 ;TRIM MODE FLAG( MOVB GAINTB-1(R4),R1 ;GET THE GAIN BITS$ ADD R1,R2 ;TO GET THE CHANNEL BYTE3120$: MOV U.CSR(R3),R3 ;GET THE CSR ADDRESS OF UNITO CLC RETURNT;B; TABLE OF GAIN VALUES; GAINTB: .BYTE 0,20,40,60,0,0,0,0 .EVEN A4 .SBTTL .ADIGR A/D GAIN RANGING FOR SINGLE A/D INPUT;+.; .ADIGR -- SINGLE A/D INPUT AUTO-GAIN RANGING;C ; INPUTS: ;S*; A/D CONVERTER MUST HAVE THE DONE BIT SET; R3 POINTS TO CSR; ; OUTPUTS:;; R0 CONVERTED VALUE;I;-*.ADIGR: MOV 2(R3),R0 ;READ CONVERTED VALUE .IF DF A$$M11 CLR R1 ;CLEAR GAIN BITS2) CMP R0,#4000 ;IS VALUE IN POSITIVE RANGE( BGE 20$ ;IF GE YES NEG R0 ;NEGATE RESULTT BEQ 100$ ;IF EQ GET OUT NOWU& BIC #^C<7777>,R0 ;TRIM TO TWELVE BITS/20$: CMP R0,#4200 ;NEED TO SAMPLE ABOVE GAIN 4?  BLT 30$ ;IF LT YES$ CMP R0,#5000 ;NO--SAMPLE AT GAIN 1? BGE 100$ ;IF GE YESS0 MOV #<1*20>*400,R1 ;NO--SET TO SAMPLE AT GAIN 4 BR 40$ ;GO SAMPLE130$: MOV #<2*20>*400,R1 ;SET TO SAMPLE AT GAIN 16! CMP R0,#4040 ;SAMPLE AT GAIN 16?D BGE 40$ ;IF GE YES1 MOV #<3*20>*400,R1 ;NO--SET TO SAMPLE AT GAIN 64 "40$: BIS R1,(R3) ;SET MUX CHANNEL INC (R3) ;START CONVERSION" MOV #TMO$AD,R0 ;GET TIMEOUT COUNT,60$: BIT #AD$ERR!AD$DON,(R3) ;ERROR OR DONE? BMI 80$ ;IF MI ERROR BNE 100$ ;IF NE DONE DEC R0 ;NOT YET--CHECK TIMEOUT BGT 60$ ;IF GT NOT TIMEOUT' MOV #ADTMOV,R0 ;YES--SET TIMEOUT VALUEN BR 120$ ;RETURN $80$: MOV 2(R3),R0 ;READ VALUE ANYHOW MOV #ADERRV,R0 ;SET ERROR VALUE BR 120$ ;RETURN4(100$: MOV 2(R3),R0 ;READ CONVERTED VALUE BIS R1,R0 ;SET THE FULL VALUET .ENDC ;A$$M11(120$: RETURN ;RETURN WITH SAMPLE IN R0 .END;START CONVERSION" MOV #TMO$AD,R0 ;GET TIMEOUT COUNT,60$: BIT #AD$ERR!AD$DON,(R3) ;ERROR OR DONE? BMI 80$ ;IF MI ERROR BNE 100$ ;IF NE DONE DEC R0 ;NOT YET--CHECK TIMEOUT BGT 60$ ;IF GT NOT TIMEOUT' MOV #ADTMOV,R0 ;YES--SET TIMEOUT VALUEN B .TITLE DRSWS .IDENT /02.00/; ; COPYRIGHT (C) 1982, 1983, 1984/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;?; THIS SOFTWARE IS FURNISHED UNDER LICENSE AND MAY ONLY BE USED6; OR COPIED ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; J. M. LAWLER 03-DEC-82;G; THIS MODULE WAS ORIGINALLY WRITTEN FOR P/OS BY M.C. OZUR ON 21-DEC-81;; MODIFIED BY:;; MACRO LIBRARY CALLS; .MCALL HWDDF$,TCBDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS TCBDF$ ;DEFINE TCB OFFSETS;+; **-$DRSWS-SWITCH STATE 0;0D; THIS DIRECTIVE ALLOWS A PRIVILEGED TASK WHICH IS NOT MAPPED TO THEA; EXECUTIVE TO EXECUTE A SUBROUTINE IN SYSTEM STATE. THE USER ISN@; CALLED BACK ON THE SYSTEM STACK WITH ALL REGISTERS PRESERVED. >; TO RETURN TO TASK LEVEL THE CALLER MERELY EXECUTES A RETURN.; ; DPB FORMAT:T;F#; WD. 00 -- DIC(175.),DPB SIZE(3.).@; WD. 01 -- BASE ADDRESS FOR MAPPING USERS SYSTEM STATE ROUTINE.:; WD. 02 -- VIRTUAL ADDRESS OF USERS SYSTEM STATE ROUTINE.;N ; INPUTS:T;9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.W); R3=ADDRESS OF USER BASE ADDRESS IN DPB.T/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)S;E-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. &; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.A<; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE SPECIFIED; TASK IS NOT PRIVILEGED. :; DIRECTIVE STATUS OF 'D.RS81' IS R00bba`TADATADATADATADATADATAETURNED IF THE VIRTUAL4; ADDRESS OF SYSTEM STATE SUBROUTINE IS NOT WITHIN; 4KW OF BASE ADDRESS;4;- .IF DF S$$WST .ENABL LSB 0$DRSWS::TST (SP)+ ;REMOVE RETURN ADDR TO DRDSP , BIT #T3.PRV,T.ST3(R5) ;IS TASK PRIVILEGED ? BEQ 10$ ;IF EQ, NO& MTPD$ @#H.DSW ;RETURN SUCCESSFUL DSW MOV (R3)+,R0 ;GET BASE ADDRESSS5 MOV (R3)+,-(SP) ;GET ADDRESS OF SYSTEM STATE ROUTINEI. BIC #77,R0 ;CLEAR OUT BYTE WITHIN 32WD BLOCK .IF DF U$$DAS( CALL $RELUI ;RELOCATE TO APR 6 ADDRESS .IFF ; DF U$$DASE( CALL $RELOC ;RELOCATE TO APR 6 ADDRESS .ENDC ; DF U$$DAS ) SUB #20000,R2 ;RELOCATE TO APR 5 ADDRESST; SUB R0,(SP) ;GET DISPLACEMENT FROM BASE TO SYS STATE CODE 8 CMP (SP),#20000 ;TARGET SUBROUTINE WITHIN APR OF BASE ?+ BHIS 20$ ;IF GE, NO - ILLEGAL COMBINATIONC# ADD R2,(SP) ;MAKE APR 5 ADDRESSESD+ MOV R1,KINAR5 ;SET UP KERNEL INSTRUCTION 5E .IF DF K$$DAS B$ MOV R1,KDSAR5 ;SET UP KERNEL DATA 5 .ENDC ; DF K$$DAS5 MOV #$STACK-4,R0 ;POINT TO USER'S PC ON KERNEL STACKF MOV -(R0),R5 ;RESTORE USER'S R5 MOV -(R0),R4 ; R4 MOV -(R0),R3 ; R3 MOV -(R0),R2 ; R2 MOV -(R0),R1 ; R1 MOV -(R0),R0 ; R0<; COMPLETE DIRECTIVE PROCESSING FOR TASK. UPDATE USER SP TO<; REMOVE DPB OR ADDRESS OF DPB FROM THE STACK. A SUCCESSFUL,; DSW HAS ALREADY BEEN RETURNED TO THE USER.! MFPI SP ;GET USER STACK POINTERE. ADD $BTRMV,(SP) ;REMOVE BYTES FROM USER STACK% MTPI SP ;RESTORE USER STACK POINTERR, CLR $BTRMV ;ZERO 'BYTES TO REMOVE' IN CASE" ;PRIVILEGED TASK ISSUES A TRAPA; THE USER IS CALLED BACK WITH THE SAME STACK FORMAT AS A CALL TOV5; $SWSTK. THE STACK WAS ADJUSTED TO REMOVE THE RETURN 5; ADDRESS TO THE DIRECTIVE DISPATCHER AND THE +1 DSW.D; ; 20(SP)=PS PUSHED BY TRAP; 16(SP)=PC PUSHED BY TRAP; 14(SP)=SAVED R5 ; 12(SP)=SAVED R4N; 10(SP)=SAVED R3E; 06(SP)=SAVED R2T; 04(SP)=SAVED R1E; 02(SP)=SAVED R0;!; 00(SP)=RETURN ADDRESS TO SYSXT ) CALLR @(SP)+ ;JUMP TO USER'S SUBROUTINE '10$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONI-20$: DRSTS D.RS81 ;ILLEGAL MAPPING SPECIFIEDD .DSABL LSBS .ENDC ;DF S$$WST  .END; $SWSTK. THE STACK WAS ADJUSTED TO REMOVE THE RETURN 5; ADDRESS TO THE DIRECTIVE DISPATCHER AND THE +1 DSW.D; ; 20(SP)=PS PUSHED BY TRAP; 16(SP)=PC PUSHED BY TRAP; 14(SP)=SAVED R5 ; 12(SP)=SAVED R4N; 10(SP)=SAVED R3E; 06(SP)=SAVED R2T; 04(SP)=SAVED R1E; 02(SP)=SAVED R0;!; 00(SP)=RETURN ADDRESS TO SYSXT ) CALLR @(SP)+ ;JUMP TO USER'S S .TITLE UTLDEF .IDENT /01/;; COPYRIGHT (C) 1982; ALL RIGHTS RESERVED/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;?; THIS SOFTWARE IS FURNISHED UNDER LICENSE AND MAY ONLY BE USED6; OR COPIED ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; T. LEKAS 04-JUN-82;; MODIFIED BY:;;4; THIS MODULE CONTAINS DEFINITIONS AND ROUTINES FROM0; EXEC MODULES THAT HAVE GONE AWAY IN XT SYSTEMS;$ALEB1::SEC ;FAIL MOV (SP)+,(SP)$QEMB:: RETURN$DVCER::$DVERR::$DTOER:: .WORD 0;D;++; **-$LDPWF-CALL DRIVER AT POWERFAIL ENTRY.L;ID; THIS ROUTINE WILL UNCONDITIONALLY CALL THE DRIVER AT ITS POWERFAIL; ENTRY FOR A SINGLE UNIT.;D ; INPUTS:A;M; R2=DDT ADDRESS. ; R3=DCB ADDRESS.E; R4=SCB ADDRESS.S; R5=UCB ADDRESS. ;L ; OUTPUTS:;; NONE;I; NO REGISTERS ARE PRESERVED!;-;S6$LDPWF::MOV KINAR5,-(SP) ;SAVE KERNEL INSTR ADDR REG 5/ MOV KINAR6,-(SP) ;SAVE KERNEL INSTR ADDR REG 6) MOV D.PCB(R3),R3 ;GET DRIVER PCB ADDRESS:% MOV P.REL(R3),KINAR5 ;MAP THE DRIVER+&55$: MOV S.KRB(R4),R3 ;GET KRB ADDRESS BEQ 60$ ;IF EQ NO KRB ADDRESSN( MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX;:; CALL DRIVER AT POWERFAIL ENTRY POINT WITH THE ARGUMENTS:;S; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.R;R"; IF S.KRB=0 THEN R3 IS UNDEFINED.;5(60$: TST D.VPWF(R2) ;IS THERE AN ENTRY ? BEQ 70$ ;IF EQ NON CLC6 CALL @D.VPWF(R2) ;CALL DRIVER AT POWERFAIL ENTRYPOINT70$: ;REFERENCE LABEL00 b!b_c_d_k2 MOV (SP)+,KINAR6 ;RESTORE KERNEL INSTR ADDR REG 62 MOV (SP)+,KINAR5 ;RESTORE KERNEL INSTR ADDR REG 5 RETURN ;O .ENDIEX;:; CALL DRIVER AT POWERFAIL ENTRY POINT WITH THE ARGUMENTS:;S; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.R;R"; IF S.KRB=0 THEN R3 IS UNDEFINED.;5(60$: TST D.VPWF(R2) ;IS THERE AN ENTRY ? BEQ 70$ ;IF EQ NON CLC6 CALL @D.VPWF(R2) ;CALL DRIVER AT POWERFAIL ENTRYPOINT70$: ;REFERENCE LABEL .TITLE MFDRV .IDENT /0.00/;; COPYRIGHT (c) 1983. /; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;=; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE >; USED OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; VERSION 0.00;1 .ENABL LC ; Lower Case - Comments Field, Only !;+;O; MFDRV is presently NOT SUPPORTED and should NOT YET BE USED on RSX11M-PLUS. M; Such support will be provided in an upcoming update. This driver reservesF; space for a supported MFDRV to be provided in that upcoming update.; ;3F; MFDRV is the software interface between the RSX11M Operating System ); and DEC RH70/TM78/TU78 configurations. ;E; The TM78/TU78 DEC Magtape System has the following characteristics: ;SG; TM78 Control Unit - May have up to four (4) TU78 Tape Units attached.G; TU78 Tape Unit - Data Recording Mode is 6250BPI (GCR) or 1600BPI (PE)-F; at 125IPS (Inches/Sec.) Data recording is per ANSI X3.39 (1600BPI); and ANSI X3.54 (6250BPI).;-; d; C. SESTOKAS March 1983; ; EDIT DATE AUTHOR REASONF; ____ ____ ______ ______ ; 001; ;1;O a .SBTTL MACROS;+; MACRO LIBRARY CALLSf;- .MCALL HWDDF$,PKTDF$,UCBDF$ HWDDF$ ; Hardware Registerso PKTDF$ ; I/O Packet OffsetsM% UCBDF$ ; Unit Control Block Offsets4 .IF DF D$$IAG1 .MCALL UMDIO$ ; User Mode Diagnostic Defenitions  .ENDC;+F; Linkage Macros - Used by this Driver servicing TM78/TU78 interrupts.;- ; -- SUBR --.MACRO SUBR ARG.1 MOV #.+12,@#ARG-2*T$$M78 ; Setup Linkage AddressD" JMP ARG ; and GO TO Subroutine. .ENDM SUBR ; -- RTRN --.MACRO RTRN ARGA, JMP @ARG-2*T$$M78 ; Return from Subroutine. .ENDM RTRN , D;+; MACRO DEFENITIONSe;-; -- PUSH -- following forms:t;,; 1. Arguments may be defined or undefined. 7; They are enclosed in < > and separated by commas. i@; Undefined Arguments are null elements signified by a comma.; 2. No Arguments.).MACRO PUSH ARGS ; Push Items on Stack.B,.NARG HWMNY ; Number of Arguments in Call.$ .IF EQ HWMNY ; IF No Arguments,) CLR -(SP) ; THEN Reserve Stack Space.M .MEXIT ;HWMNY .IFF ; IF Arguments. .IRP X,E) .IF B X ; IF Argument missing,-( CLR -(SP) ; THEN Reserve Stack Space. .IFF ; IF Arguments( MOV X,-(SP) ; THEN Put Them on Stack. .ENDC ;X .ENDM ;X, .ENDC ;HWMNY .ENDM PUSH#; -- POP -- same forms as for PUSH.*.MACRO POP ARGS ; Pop Items from Stack.,.NARG HWMNY ; Number of Arguments in Call.$ .IF EQ HWMNY ; IF No Arguments,) INC (SP)+ ; THEN Skip Stack Element. .MEXIT ;HWMNY .IFF ; IF Arguments. .IRP X,& .IF B X ; IF Argument missing,( INC (SP)+ ; THEN Skip Stack Element. .IFF ; IF Arguments2 MOV (SP)+,X ; THEN Pop Them off Stack & to ARG. .ENDC ;X .ENDM ;X, .ENDC ;HWMNY .ENDM POP-:; **** Note PUSH/POP Usage: IF PUSH R2,R3 THEN POP R3,R2. f& .SBTTL TM78 DEVICE, MASSBUS REGISTERSGTMREGS = 22. ; # TM78 Device Registers - not including MFBAE, MFCS3.H3 ; Accessing MFIA may result in MFCS1 C1.CPE set.  ;#MFCS1 = +00 ; Control and Status 1IMFWC = + 2 ; Word CountMFBA = 4 ; UNIBUS AddressMFBC = 6 ; Byte Count#MFCS2 = 10 ; Control and Status 2 MFDI = 12 ; Data InterruptMFDM = 14 ; Data Mode MFAS = 16 ; Attention Summary MFDS = 20 ; Drive StatusMFDB = 22 ; Data BufferPMFDE = 24 ; Diagnostic ErrorMFDT = 26 ; Driv00(bba`TADATADATADATADATADATAe TypeMFSN = 30 ; Serial Number2 MFDR = 32 ; Diagnostic RequestMFDD = 34 ; Diagnostic Data;!MFNDI = 36 ; Non Data Interrupt -MFND0 = 40 ; Non Data Command - Tape Unit 0S*MFND1 = 42 ; | | | - Tape Unit 1*MFND2 = 44 ; | | | - Tape Unit 2-MFND3 = 46 ; Non Data Command - Tape Unit 3=MFIA = 50 ; Internal AddressMFCR = 52 ; Control register .IF DF M$$EXT ; 22 Bit Addr. -MFBAE = 54 ; Bus Address Extension Register4#MFCS3 = 56 ; Control and Status 3r .ENDC ;M$$EXT0 & .SBTTL REGISTER BIT/FIELD DEFENITIONS;+*; MFCS1 REGISTER RH/TM Shareable Register.;-+C1.SC = 100000 ; RH Reg - Special ConditionD*C1.TRE = 40000 ; RH Reg - Transfer Error 3C1.CPE = 20000 ; RH Reg - Control Bus Parity Error *C1.DVA = 4000 ; TM Reg - Drive Available&C1.PSL = 2000 ; RH Reg - Port Select-C1.A17 = 1000 ; RH Reg - UNIBUS @ - A171C1.A16 = 400 ; RH Reg - Extension Bits - A16B4C1.RDY = 200 ; RH Reg - Ready (for Data Transfer)*C1.IE = 100 ; RH Reg - Interrupt Enable6C1.DFC = 76 ; TM Reg - Data Transfer Function Code4C1.GO = 1 ; TM Reg - Go. Initiate data transfer;+3; Data Transfer Function Codes - GO and IE Bit set. ;-$FC.PE = 61 ! C1.IE ; Write 1600 (PE)&FC.GCR = 63 ! C1.IE ; Write 6250 (GCR)"FC.RDF = 71 ! C1.IE ; Read Forward"FC.RDR = 77 ! C1.IE ; Read Reverse$FC.XSN = 73 ! C1.IE ; Extended Sense;+,; MFWC REGISTER MASSBUS Word Count Register ;- 2's complement WORD COUNT.;+); MFBA REGISTER UNIBUS Address Register.n;- 177776. LSB not used.7;+5; MFBC REGISTER TM (Read/Write) Byte Count Register. ;-;+; MFCS2 REGISTER RH REGISTER;-C2.DLT = 100000 ; Data LateG#C2.WCE = 40000 ; Write Check ErrorC%C2.UPE = 20000 ; UNIBUS Parity Error1$C2.NED = 10000 ; Non-existent Drive%C2.NEM = 4000 ; Non-existent MemoryIC2.PGE = 2000 ; Program Error1!C2.MXF = 1000 ; Missed TransferR+C2.DPE = 400 ; MASSBUS Data Parity Error' ;RH TRE Err.NCS2ERR = C2.DLT ! C2.WCE ! C2.UPE ! C2.NED ! C2.NEM ! C2.PGE ! C2.MXF ! C2.DPEC2.OR = 200 ; Output ReadyEC2.IR = 100 ; Input Ready"C2.CLR = 40 ; Controller ClearC2.PAT = 20 ; Parity Test02C2.BAI = 10 ; UNIBUS Address Increment Inhibit&C2.UNT = 7 ; TM Unit Select (0-7) ;+; MFDI REGISTER TM Register;-,DTFLCD = 176000 ; Data Transfer Failure Code"DPR = 400 ; "1" - Drive Present%DTINTC = 77 ; Data Interrupt Code ;+; MFDM REGISTER TM Register;-)DM.SER = 100000 ; Suppress Error Recovery 9DM.FMT = 70000 ; Data (assembly/disassembly) Format Mode;>DM.SKP = 7400 ; Skip Count - Read:'0' fill followed by data.>DM.CNT = 374 ; Record Count - number of to be read/written.&DM.UNT = 3 ; TU Unit Select (0-3);+; MFAS REGISTER TM Register;->AS.BTS = 377 ; Attention Summary: Bit0-Drive0, Bit7-Drive7.;+; MFDS REGISTER TM Register;-4DS.RDY = 100000 ; Unit online - ready for execution.)DS.PRS = 40000 ; Unit has power applied.DS.ONL = 20000 ; Unit online.$DS.REW = 10000 ; Unit is Rewinding.1DS.PE = 4000 ; Unit in 1600(PE) recording mode. #DS.BOT = 2000 ; Unit at tape BOT.y)DS.EOT = 1000 ; Unit detected tape EOT.m9DS.FPT = 400 ; Unit write protected (No Write Ring). t-DS.AVL = 200 ; Drive available to MASSBUS.8DS.SHR = 100 ; Drive shareable to both MASSBUS ports.BDS.MNT = 40 ; Drive in maintenance mode - unavailable for use.9DS.DSE = 20 ; Unit in erase portion of DSE operation.p;+*; MFDB REGISTER RH REGISTER - Data Buffer;-;+/; MFDE REGISTER TM Register - Diagnostic Errorn;-;+); MFDT REGISTER TM Register - Drive Type ;-#DT.TAP = 40000 ; '1' - Tape Devicee#DT.DPT = 4000 ; Dual Port Featurew/DT.WCS = 2000 ; '1' - Writeable Control Store09DT.DTP = 777 ; Drive Type - TM78= 100, TM78/TU78= 101.h a;+,; MFSN REGISTER TM Register - Serial Number;-%SN.SN3 = 170000 ; BCD Serial Number 3.%SN.SN2 = 7400 ; | | | 2o%SN.SN1 = 360 ; | | | 1S%SN.SN0 = 17 ; BCD Serial Number 0+000b!b_c_d_k;+1; MFDR REGISTER TM Register - Diagnostic Request;-;+.; MFDD REGISTER TM Register - Diagnostic Data;-;+8; MFNDI REGISTER TM Register - Non Data Interrupt Status;-'NDFLCD = 176000 ; Non Data Failure Codet"NDUNIT = 1400 ; Tape Unit Number*NDINTCD = 77 ; Non Data Interrupt Code;+F; MFNDx REGISTER(S) TM Register - Non Data Command, Tape Unit (x) 0-3.;-0CMCNTx = 177400 ; Command Count for Tape Unit x.9NDFCTx = 76 ; Non Data Function Code for Tape Unit x.l>GOBITx = 1 ; Go Bit for Non Data Command for Tape Unit x.*; Non Data Transfer Commands - GO Bit set.%ERGGCR= 37 ; Erase 3" Gap, GCR.T#ERGPE= 35 ; Erase 3" Gap, PE.t(WTMGCR= 17 ; Write Tape Mark, GCR.&WTMPE= 15 ; Write Tape Mark, PE.%DSE= 13 ; Data Security Erase.r1SNSE= 11 ; Sense Tape Unit Characteristics.o*RWND= 7 ; Rewind Tape on Tape Unit.5UNLD= 5 ; Rewind and Unload Tape on Tape Unit. $SFTMK= 25 ; Space Forward TMK.$SRTMK= 27 ; Space Reverse TMK.ASLTMK= 47 ; Space Forward TMK/LEOT. IF LEOT, position AEOV.s$SFREC= 21 ; Space Forward REC.$SRREC= 23 ; Space Reverse REC. s;+4; MFIA REGISTER TM Register - TM78 Internal Address;-;+4; MFCR REGISTER TM Register - TM78 Control Register;-5TMRDY = 100000 ; TM78 available for command executionsTMCLR = 40000 ; TM78 Clearn%MCPE = 20000 ; TM78 ROM parity errorR=ILR = 10000 ; TM78 reference to nonexistent MASSBUS registero>CPE = 4000 ; TM78 parity error detect - write to MASSBUS regDEVPAR = 2000 ; TM78 even parity generate/check on MASSBUS cntl bus6HLDA = 1000 ; TM78 microprogram sequencing inhibited?HOLD = 400 ; TM78 HOLD bit - inhibit microprogram sequencingINTDT = 377 ; Internal Data;+=; MFBAE REGISTER RH REGISTER - Bus Address Extension Registero;-GBA.BTS = 77 ; Bus Address bits 21-16. Logical extn of MFBA registerp;+7; MFCS3 REGISTER RH REGISTER - Control and Status Reg 3B;-&C3.APE = 100000 ; Address Parity Error.C3.PEO = 40000 ; Data Parity Error - Odd Word1C3.PEE = 20000 ; Data Parity Error - Even Word b.C3.CEO = 10000 ; Write Check Error - Odd Word/C3.CEE = 4000 ; Write Check Error - Even WordiC3.DW = 2000 ; Double Word!C3.IE = 100 ; Interrupt Enable'C3.IPC = 17 ; Inverted Parity Checks;+; Extended Sense DataB;-0XNDREG = 60. ; 60. bytes - TM78 Error Log Data A .SBTTL TM78 INTERRUPT CODES;+C; TM78 INTERRUPT CODES - Data/Non Data Transfers and TM78 Initiateds;-#; Bit Mask Values Int Code tILG = 1 ; Illegal 0."DON = 2 ; NDT or DT. 1, Done.'TMK = 4 ; NDT or DT. 2, Tape Mark. 0BOT = 10 ; NDT or DT. 3, Beginning of Tape.'EOT = 20 ; NDT or DT. 4, End of Tape.+LEOT = 40 ; NDT. 5, Logical End of Tape. %NOOP = 100 ; NDT. 6, NO OP Command. !RWD = 200 ; NDT. 7, Rewinding. -FPT = 400 ; NDT or DT. 10, Write Protect.BBNRDY = 1000 ; NDT or DT. 11, TM78 not ready to execute command.<NAVL = 2000 ; NDT or DT. 12, TU78 not avail to this port.-OFLN = 4000 ; NDT or DT. 13, TU78 Offline. 3NTEX = 10000 ; NDT or DT. 14, TU78 Non Existant..?NTCP = 20000 ; NDT or DT. 15, Read initiated, not performed.p UNDF = 40000 ; Undefined. 16,AONLN = 100000 ; TM Initiated 17, TU78 < Online. TU78 Sense Data.06RLL = 1 ; DT. 20, Read data OK. GT requested.6RLS = 2 ; DT. 21, Read data OK. LT requested.<RTRY = 4 ; DT. 22, Retry operation - same direction.<RDOP = 10 ; DT. 23, Read Data in opposite direction.:UNRD = 20 ; DT. 24, Data Unreadable after retries.@ERR = 40 ; DT. 25, Data Transfer error - Surp Err RcvryAEOTE = 100 ; DT. 26, Write err after EOT - Surp Err RcvryeCBDTP = 200 ; NDT or DT. 27, Bad tape- Write failure ! Lost PositeBTMFA = 400 ; NDT or DT. 30, TM Fault A - Failure, I/O operationCTUFA = 1000 ; NDT or DT. 31, TU Fault A - Failure, I/O operation <TMFB = 2000 ; TM Initiated 32, TM Fault B - Failure, no I/OTMFB = 4000 ; Not Used. 33,s;008bba`TADATADATADATADATADATAMBFL = 10000 ; TM Initiated 34, Massbus Control Bus Fault.f; TM78 Initiated Interrupts. TMI1= ONLNTMI2= TMFB ! MBFLp%; Data Transfer Operation Interrupts.i ; WRITE2WRTI1= DON ! EOT ! FPT ! NRDY ! NAVL ! OFLN ! NTEX-WRTI2= RTRY ! ERR ! EOTE ! BDTP ! TMFA ! TUFA0 ; READ FWD,3RDFI1= DON ! TMK ! NRDY ! NAVL ! OFLN ! NTEX ! NTCPN@RDFI2= RLL ! RLS ! RTRY ! RDOP ! UNRD ! ERR ! BDTP ! TMFA ! TUFA ; READ REV 9RDRI1= DON ! TMK ! BOT ! NRDY ! NAVL ! OFLN ! NTEX ! NTCP3@RDRI2= RLL ! RLS ! RTRY ! RDOP ! UNRD ! ERR ! BDTP ! TMFA ! TUFA ; XTND SNSd XNSI1= DON ); Non Data Transfer Operation Interrupts.T ; WRITE TMK2WTMI1= DON ! EOT ! FPT ! NRDY ! NAVL ! OFLN ! NTEXWTMI2= BDTP ! TMFA ! TUFA ; SENSE SNSI1= DONSNSI2= TMFA ! TUFA ; SPACE TMK, FWD=.SFTMI1= DON ! NRDY ! NAVL ! OFLN ! NTEX ! NTCPSFTMI2= BDTP ! TMFA ! TUFA ; SPACE TMK, REV 4SRTMI1= DON ! BOT ! NRDY ! NAVL ! OFLN ! NTEX ! NTCPSRTMI2= BDTP ! TMFA ! TUFA ; SPACE TMK/LEOT, FWD5SLTMI1= DON ! LEOT ! NRDY ! NAVL ! OFLN ! NTEX ! NTCPXSLTMI2= BDTP ! TMFA ! TUFA ; SPACE RECORD, FWD4SFRCI1= DON ! TMK ! NRDY ! NAVL ! OFLN ! NTEX ! NTCPSFRCI2= BDTP ! TMFA ! TUFA ; SPACE RECORD, REV:SRRCI1= DON ! TMK ! BOT ! NRDY ! NAVL ! OFLN ! NTEX ! NTCPSRRCI2= BDTP ! TMFA !TUFAO ; ERASE 3" GAP!2ERGI1= DON ! EOT ! FPT ! NRDY ! NAVL ! OFLN ! NTEXERGI2= BDTP ! TMFA ! TUFA  ; DATA SECURITY ERASE,DSEI1= DON ! FPT ! NRDY ! NAVL ! OFLN ! NTEXDSEI2= TMFA ! TUFA ; REWIND ,RWDI1= DON ! RWD ! NRDY ! NAVL ! OFLN ! NTEXRWDI2= TMFA ! TUFA ; UNLOADE&UNLI1= DON ! NRDY ! NAVL ! OFLN ! NTEXUNLI2= TMFA ! TUFA .SBTTL Function Tables ;+$;TM78/TU78 Spacing Subfunction Table;-<.MACRO SPCFCT SPCGCR,SPCPE,TIMOUT,TIMES,SPCVL1,SPCVL2,ISRSRV# .BYTE SPCGCR ; Commands: 6250BPI, .BYTE SPCPE ; 1600BPI. ? .BYTE TIMOUT,TIMES ; Subcycle Time (S.CTM), Subcycles (S.STS).U- .WORD SPCVL1 ; Interrupt validation Mask 1.L- .WORD SPCVL2 ; Interrupt validation Mask 2.' .WORD ISRSRV ; > ISR Service Routine.T .ENDM SPCFCT *SVALI1= +4 ; > Spacing Validation Mask(s).JSPFTMK: SPCFCT SFTMK,SFTMK, 2,120., SFTMI1,SFTMI2, SPCISR ;Space FWD TMK.JSPRTMK: SPCFCT SRTMK,SRTMK, 2,120., SRTMI1,SRTMI2, SPCISR ;Space REV TMK.NSPLTMK: SPCFCT SLTMK,SLTMK, 2,120., SLTMI1,SLTMI2, SPCISR ;Space FWD TMK/LEOTJSPFREC: SPCFCT SFREC,SFREC, 2,120., SFRCI1,SFRCI2, SPCISR ;Space FWD REC.JSPRREC: SPCFCT SRREC,SRREC, 2,120., SRRCI1,SRRCI2, SPCISR ;Space REV REC. v;+ ; Valid TM78/TU78 Function Table;-F.MACRO FUNCT FCT,PREPRO,CMNDGC,CMNDPE,TIMOUT,TIMES,VALI1,VALI2,ISRSRV# .WORD IO.'FCT ; I/O Function Code + .WORD PREPRO ; Preprocessing indications..# .BYTE CMNDGC ; Commands: 6250BPI, # .BYTE CMNDPE ; | 1600BPI. .? .BYTE TIMOUT,TIMES ; Subcycle Time (S.CTM), Subcycles (S.STS).c, .WORD VALI1 ; Interrupt Validation Mask 1., .WORD VALI2 ; Interrupt Validation Mask 2.' .WORD ISRSRV ; > ISR Service Routine.1 .ENDM FUNCT PWR= 1 ; Test US.PWF Indication.WRT= 2 ; Test M.SWL Indication.M2WTPW= PWR!WRT ; Test US.PWF and M.SWL Indication.REV= 4 ; Test for Read Reverse. DT= 8. ; Test for Data Request.R'PREPRO= +2 ; > Pre process I/O request.NCMDGCR= +4 ; > GCR Command..CMDPE= +5 ; > PE Command.$TMOUT= +6 ; > Time out information.#VALI1= +10 ; > Validation Mask(s)..$ISRSRV= +14 ; > ISR Service Routine.*IO.XSN= 37400 ; Function - Not in QIO.MAC.FTBL:OIFUNCT WLB, WTPW!DT, FC.GCR,FC.PE, 3,1, WRTI1,WRTI2, 0 ; WRITEdLFUNCT RLB, PWR!DT, FC.RDF,FC.RDF, 20.,1, RDFI1,RDFI2, 0 ; READ FWDNFUNCT RLV, PWR!REV!DT, FC.RDR,FC.RDR, 20.,1, RDRI1,RDRI2, 0 ; READ REVMFUNCT EOF, WTPW, WTMGCR,WTMPE, 3,1, WTMI1,WTMI2, WTMISR ; WRITE TMKLFUNCT STC, 0, SNSE, SNSE, 2,1, SNSI1,SNSI2, SNSISR ; SET CHARLFUNCT SEC, 0, SNSE, SNSE, 2,1, SNSI1,SNSI2, SNSISR ; SNS CHARMFUNCT SMO, 0, SNSE, SNSE, 2,1, SNSI1,SNSI2, SNSISR ; S/MOU CHR,LFUNCT SPF, P00@b!b_c_d_kWR, 0, 0, 2,120., 0, 0, 0 ; SPC TMKSMFUNCT SPB, PWR, 0, 0, 2,120., 0, 0, 0 ; SPC BLCKS MFUNCT ERS, WTPW, ERGGCR,ERGPE, 3,1, ERGI1,ERGI2, ERGISR ; ERS 3" GP GFUNCT DSE, WTPW, DSE, DSE, 2,160., DSEI1,DSEI2, DSEISR ; DSEEIORWD:CFUNCT RWD, 0, RWND, RWND, 2,60., RWDI1,RWDI2, RWDISR ; REWINDE LNGHT=.-IORWD1FFUNCT RWU, 0, UNLD, UNLD, 2,1, UNLI1,UNLI2, UNLISR ; RWND/UNLD S .IF DF E$$DVC XNDSNS:HLFUNCT XSN, 0, FC.XSN,FC.XSN, 2,1, XNSI1, 0, XNSISR ; XTND SNS .ENDC ;E$$DVCENDFTB=.  .SBTTL OPERATION RETURN CODES;+<; I/O Operation Return Codes per TM78 Interrupt Code Values.;- ; Interrupt Designation/Code+RTRNTB: .BYTE 0 ; ILG 0 - Illegal.D! .BYTE IS.SUC ; DON 1 - Done. & .BYTE IE.EOF ; TMK 2 - Tape Mark./ .BYTE IS.SUC ; BOT 3 - Beginning of Tape. ,( .BYTE IE.EOT ; EOT 4 - End of Tape.0 .BYTE IE.EOV ; LEOT 5 - Logical End of Tape.) .BYTE 0 ; NOOP 6 - No operation.,, .BYTE IS.SUC ; RWD 7 - Start of Rewind.+ .BYTE IE.WLK ; FPT 10 - File Protected.N2 .BYTE IE.DNR ; NRDY 11 - Not ready for Command.7 .BYTE IE.FHE ; NAVL 12 - Not available to this port.o* .BYTE IE.DNR ; OFLN 13 - TU78 Offline. / .BYTE IE.FHE ; NTEX 14 - TU78 non-existant. I: .BYTE IE.FHE ; NTCP 15 - Not cpbl- Rd Init, Not Prfrmd.& .BYTE 0 ; UNDF 16 - Undefined.1 .BYTE 0 ; ONLN 17 - Online (Unsolicited). ( .BYTE IE.DAO ; RLL 20 - Long Record.) .BYTE IS.SUC ; RLS 21 - Short Record.W, .BYTE IE.VER ; RTRY 22 - Retry operation.* .BYTE IE.VER ; RDOP 23 - Read opposite.' .BYTE IE.VER ; UNRD 24 - Unreadable.I6 .BYTE IE.VER ; ERR 25 - Error, Retries suppressed.: .BYTE IE.VER ; EOTE 26 - Error/EOT. Retries suppressed.; .BYTE IE.BBE ; BDTP 27 - Bad Tape. Write err/Posit lost.p' .BYTE IE.FHE ; TMFA 30 - TM Fault A.;' .BYTE IE.FHE ; TUFA 31 - TU Fault A. 6 .BYTE 0 ; TMFB 32 - TM Fault B (Unsolicited). ' .BYTE 0 ; TUFB 33 - Undefined. 5 .BYTE 0 ; MBFL 34 - MASSBUS Control Bus Fault  ; (Unsolicited). .EVEN 2! .SBTTL DEFENITION OF U.CW2/U.CW3;;+; U.CW2 - Characteristics WordB; U.CW3 - Supported Tape Density Identification (Set up by SYSGEN);-;+#; TAPE CHARACTERISTICS (U.CW2) WORD 7; Bits 6,7 and 11 user settable via IO.STC or IO.SMO. .D; Bit 11 only allowed to be updated when tape unit not beyond BOT.5; Returned per IO.SEC request in second status word.);-?M.PEOV= 100000 ; Returned to user as '0' - Driver internal use. 7 ; Unlabelled tape operation - Tape in gap after EOV V< ; (double TMK) having completed forward motion operation.CM.AEOV= 40000 ; Unlabelled tape operation - Tape positioned in gapS? ; between double TMK's (EOV) after forward motion operation. M.BOT= 20000 ; Tape at BOT.@M.1600= 4000 ; * Tape density control - '0'=6250BPI, '1'=1600.$M.HWL= 2000 ; Hardware Write Lock.9M.RWD= 1000 ; Driver indication that unit is rewinding..;M.SER= 400 ; Tape Unit select error (Tape Unit Offline). EM.IWR= 200 ; * Inhibit Write with Extended Inter-record gap (IRG).e(M.SWL= 100 ; * Software write locked.2M.TMK= 40 ; Last Tape Command encountered TMK.2M.EOT= 20 ; Last command encountered EOT mark.6NEWBTS= M.AEOV ! M.BOT ! M.EOT ! M.HWL ! M.SER ! M.TMK7NWBTS1= M.BOT ! M.EOT ! M.HWL ! M.SER ! M.1600=&NWBTS2= M.BOT ! M.EOT ! M.SER;+/; SUPPORTED TAPE DENSITY (U.CW3) IDENTIFICATIONu; 1; Low byte: U.CW2, Bit11='0' - UD.625, 6250BPI.r1; High byte: U.CW2, Bit11='1' - UD.160, 1600BPI. ;- i .SBTTL DRIVER PARAMETERSp#US.SUP=2 ; Supress Error Recoveryw;+5; Driver Parameters - Indexed by RH Controller NumberM;-(CNTBL: .BLKW T$$M78 ; > UCB, I/O Dequd.-DQDIO: .BLKW T$$M78 ; > FTBL, Dequd request.L.DQDUCB: .BLKW T$$M78 ; > UCB - Dequd request.0IOFCT: .BLKW T$$M78 ; > FTBL, I/O Command code..IORTN: .BLKW T$$M78 ; I/O Request restart @. BINPROG: .BLKW T$$M78 ; I/O Status - NEQ= 00Hbba`TADATADATADATADATADATALo Byte,I/O in Progress;% ; Hi Byte,Passed DEV REG's(UMD).'6DTCMD: .BLKW T$$M78 ; I/O Status - NEQ=Data Transfer.DXNSCMD: .BLKW T$$M78 ; I/O Status - NEQ= Lo Byte,XND SNS Operation; ; Hi Byte,Unsolicited I/O.3DTCNT: .BLKW T$$M78 ; Current DATA I/O Byte Count..8DTADR1: .BLKW T$$M78 ; Current Address - U.BUF,U.BUF+1.2DTADR2: .BLKW T$$M78 ; | | | | - U.BUF+2.DRDOPCM: .BLKW T$$M78 ; > FTBL - Read Opposite Function, preprocess.5INTRPT: .BLKW T$$M78 ; I/O Interrupt being serviced.t6INTCD1: .BLKW T$$M78 ; Interrupt code to Int 0 - 172INTCD2: .BLKW T$$M78 ; Bit Code value: 20 - 343TMUNIT: .BLKW T$$M78 ; Lo Byte= TM#, Hi Byte= TU#.B;RSTATN: .BLKW T$$M78 ; MFAS Reg Reset Mask - NDT Commands.TBSPCYET: .BLKW T$$M78 ; Residual (to be yet) spaced BLCK/TMK count6TPCHAR=SPCYET ; Tape Characteristics; IO.SMO/IO.STC.?SPACED: .BLKW T$$M78 ; Spaced BLCK/TMK count - Already spaced.L/SPCNG: .BLKW T$$M78 ; Current I/O Space Count. @RTTBL: .BLKW T$$M78 ; Retry count: +0,Rtrs left. +1,Total rtrs.+ERRPKT: .BLKW T$$M78 ; > Error Log Packet.B .IF GT T$$M78-18TEMP: .BLKW 1 ; PS Save Area. Lo 4 bits - Controller #. .ENDCDCBPTR: .WORD 0 ; > DCB.8$WTRTRY= 50. ; # Re-write attempts.:RDRTRY= 21. ; # Re-read attempts (embedded tape cleans).;+; DRIVER DISPATCH TABLEa;-$MFTBL::' .WORD MFINI ; Initiate I/O Operation 8$ .WORD MFCAN ; Cancel I/O Operation .WORD MFOUT ; Device Timeout .WORD MFPWF ; Powerfail Entry: .PAGE .SBTTL INITIATE I/O OPERATIONSt;+8; -- MFINI -- Initiate TU78/TM78 Mag Tape I/O Operation ;N; Service QIO Directive or Completed I/O request, services remaining requests.;K; IF the Dqu successful, THEN service the request. ELSE RETURN to Caller. ; ; Prior to CALL $GTPKT:m; R5 - > UCB.;; Return from $GTPKT: ;LF; C=1 - Dequeue unsuccessful. Controller Busy or No Request to DQU.; ; C=0 - Dequeue successful.O; R1 - > I/O Pckt..(; R2 - Physical Tape Unit # (U.UNIT).&; R3 - RH Controller Index (S.CON).; R4 - > SCB.; R5 - > UCB.;-0MFINI: CALL $GTPKT ; Outstanding I/O request ?$ BCC 10$ ; IF CC, Yes. Service it./ RETURN ; Controller Busy or No I/O Request. 10$: MOV S.CSR(R4),R2 ; R2=CSR.2 MOV R5,CNTBL(R3) ; Save > UCB, Dqud I/O Request.( MOV I.FCN(R1),R1 ; R1 - Function code./ MOV #FTBL,R0 ; R0 > TM78/TU78 Function Table.e9 BICB #US.SUP,U.STS(R5) ; Assume Error recovery allowed. , CLR RTTBL(R3) ; Assume recovery count = 0. .IF DF D$$IAG) BITB #IQ.UMD,R1 ; Diagnostic function ?. BEQ 15$ ; IF EQ, No.. MOV #100000,RTTBL(R3) ; Diagnostic function," BR 18$ ; No error recovery. 15$: .ENDC ;D$$IAG* BITB #IQ.X,R1 ; Inhibit error recovery ? BEQ 20$ ; IF EQ, No.R=18$: BISB #US.SUP,U.STS(R5) ; Inhibit Driver error recovery. ; Validate I/O Request Support.R>20$: BICB #IQ.X!IQ.UMD!IQ.Q,R1 ; Validate only function code.122$: CMP R1,(R0) ; I/O supported by TM78/TU78 ?  BEQ 30$ ; IF EQ, Yes. $ ADD #LNGHT,R0 ; Next I/O function.1 CMP R0,#ENDFTB ; Any more TM78/TU78 Functions ?+ BNE 22$ ; IF NE, No. Look for match/end.,# MOV #IE.IFC&377,R0 ; Unsupported, BR 45$ ; End request.; Preprocess I/O Request.r!30$: MOV R0,DQDIO(R3) ; > FTBL, / MOV R5,DQDUCB(R3) ; and > UCB Dequd request.e& TST (R0)+ ; > Preprocess functions.,; Function allowed if Powerfailure occured ?6 BIT #PWR,(R0) ; I/O allowed if powerfailure occured? BEQ 40$ ; IF EQ, Yes.2 BITB #US.PWF,U.STS(R5) ; Powerfailure occurence? BEQ 40$ ; IF EQ, No.,< MOV #IE.ABO&377,R0 ; Fnctn not allowed until US.PWF Reset. BR 45$ ; End request.-; Function allowed if Software write locked ? 640$: BIT #WRT,(R0) ; User write locked verification ? BEQ DQD ; IF EQ, No.M< BIT #M.SWL,U.CW2(R5) ; Device user software write locked? BEQ DQD ; IF EQ, No.- MOV #IE.WLK&377,R0 ; Indicate write locked,B"45$: SUBR ENDRQS ; End request, BR MFINI ; Service others. ?; Request DQD - RWD completion or TM78 RDY return entry 00Pb!b_c_d_kpoint. 4B; R2 - CSR, R3 - RH Cont Index(S.CON), R4 - > SCB, R5 - > UCB. ; No I/O to Rewinding Tape Unit.8DQD: MOV DQDUCB(R3),R5 ; > UCB - restart Dequd request.. BIT #M.RWD,U.CW2(R5) ; Tape Unit Rewinding ? BEQ 50$ ; IF EQ, No.o" MTPS #PR5 ; INHIBIT INTERRUPTS.? MOVB #C1.IE,MFCS1(R2) ;;; Allow further interrupts on this RHW2 MOVB #60.,S.STS(R4) ;;; Allow up to 60 checks at1 MOVB #2,S.CTM(R4) ;;; 2 sec intervals for RWD.s" MTPS #PR0 ;;; ALLOW INTERRUPTS.0 BR MFINI ; Service other controller requests.; I/O - only if TM78 Ready.-50$:,; MOV U.SUB(R5),MFCS2(R2) ; Select TM UNIT.) TST MFCR(R2) ; TM78 Ready for command ?t BMI ACTIVE ; IF MI, Yes.W> MOVB S.ITM(R4),S.CTM(R4) ; Check TM78 ready after 2 seconds.1 BR MFINI ; Service other controller requests.C4ACTIVE: PUSH DQDIO(R3) ; Save DQD > preprocessing.1 CLR DQDIO(R3) ; Request about to become active.  POP R0 ; R0 >  TST (R0)+ ; current requestP TST (R0)+ ; I/O Command. ) MOV R0,IOFCT(R3) ; IOFCT > I/O Command.. INC INPROG(R3) ; I/O Active." BIT #DT,-2(R0) ; Data Transfer ? BNE DTIO ; IF NE, Yes.( JMP NDTIO ; Initiate NDT I/O. .PAGE& .SBTTL INITIATE DATA (I/O) SERVICING ;+&; R0 > FTBL I/O Command, R2 - CSR, ;; R3 - Controller Index (S.CON), R4 - > SCB, R5 - > UCB.E;-)DTIO: INC DTCMD(R3) ; Data transfer I/O.C- MOVB U.UNIT(R5),-(SP) ; Tape Unit selection. 3 BIC #^C<3>,(SP) ; Perhaps won't suppress retries.P1 BITB #US.SUP,U.STS(R5) ; Inhibit Error Recovery?  BNE 9$ ; IF NE, Yes./ MOV #RDRTRY,RTTBL(R3) ; Read recovery retries.;, MOV IOFCT(R3),RDOPCM(R3) ; > Read Opposite 0 ADD #LNGHT+2,RDOPCM(R3) ; Function preprocess." BIT #WRT,-2(R0) ; Write request? BEQ 10$ ; IF EQ, No. 9 BIT #M.IWR,U.CW2(R5) ; Inhibit write retries (long gap)?, BNE 8$ ; IF NE, Yes.O3 MOV #WTRTRY,RTTBL(R3) ; Set up for Write recovery.R BR 10$ ; . . Cont. (8$: CLR RTTBL(R3) ; No retries allowed./9$: BIS #DM.SER,(SP) ; Inhibit error recovery.n910$: MOVB RTTBL(R3),RTTBL+1(R3) ; Error Recovery Retries.T' MOV #DTIOGO,IORTN(R3) ; Restart I/O @.M/ POP MFDM(R2) ; Data transfer for Tape Unit x.#3 .IF DF M$$EXT ; 22 Bit Extnd Addr (11/70, 11/44).2 BIT #DV.MBC,U.CW1(R5) ; RH11 ?; BNE 20$ ; IF NE, No - RH70.& CALL $STMAP ; Setup UNIBUS mapping. ASL U.BUF(R5) ; Setup A17,A16# ASL U.BUF(R5) ; address bitst ASL U.BUF(R5) ; into  ASL U.BUF(R5) ; HI Byte.N) CALL $MPUBM ; Setup UMRs for transfer. % MOV S.CSR(R4),R2 ; Restore R2 - CSRB20$: .ENDC ;M$$EXTr .IF NDF M$$EXTs% .IF DF M$$MGE ; 18 Bit Addressing.O MOV R5,R1 ; R1 >D ADD #U.BUF,R1 ; U.BUF. ROL (R1) ; Setup A17,A16t ROL (R1) ; address bits ROL (R1) ; into ROL (R1) ; HI Byte.I .ENDC ;M$$MGE .ENDC ;M$$EXTS& MOV IOFCT(R3),R0 ; R0 > I/O Command.* BIT #REV,-2(R0) ; Read Reverse request ? BEQ 30$ ; IF EQ, No.n6 SUB #2*LNGHT-2,RDOPCM(R3) ; > Read Opposite Function./30$: CALL SETUP ; Setup Data trfr parameters.s; -- DTIOGO -- Start DATA I/OX;G; DTCNT, DTADR1, DTADR2, R0 - > FTBL I/O Command: Normal.or.Opposite, F; R2 - CSR, R3 - Controller Index (S.CON), R4 - > SCB, R5 - > UCB.;18DTIOGO: MOV DTCNT(R3),MFBC(R2) ; Data byte count for TM. MOV MFBC(R2),MFWC(R2) ; and N INC MFWC(R2) ; Word R CLC ; countm ROR MFWC(R2) ; for RH.R$ NEG MFWC(R2) ; (2's complement).? MOV DTADR2(R3),MFBA(R2) ; Transfer address - 16 lo order bits.:1 MOVB (R0),DTADR1(R3) ; I/O code - 6250BPI mode.-' BIT #M.1600,U.CW2(R5) ; 1600BPI mode ?  BEQ 10$ ; IF EQ, No.T1 MOVB 1(R0),DTADR1(R3) ; I/O code - 1600BPI mode. 110$: BITB #US.ABO,U.STS(R5) ; Abort I/O request ? .ENABL LSBT BEQ 15$ ; IF EQ, No.R3ABOEND: MOV #IE.ABO&377,R0 ; Aborting I/O request.;"ENDIT: SUBR ENDRQS ; End request/ JMP MFINI ; and service other I/O requests. 915$: BIC #M.SER,U.CW2(R5) ; Assume Tape Unit selectable.F .DSABL LSBs! MTPS #PR5 ; INHIBIT INTERRUPTSV ; Start I/O; .IF DF M$$EXT 6 BIT #DV.MBC,U.CW100Xbba`TADATADATADATADATADATA(R5) ;;; RH70 (MASSBUS Controller) ? BEQ 20$ ;;; IF EQ, No. / MOVB DTADR1+1(R3),MFBAE(R2) ;;; Start transfer:) MOVB DTADR1(R3),MFCS1(R2) ;;; on 11/70.  BR 22$ ;;; . . cont . .IFTF;20$: MOV DTADR1(R3),MFCS1(R2) ;;; Start transfer on others.22$: .ENDC ;M$$EXT- MOVB 2(R0),S.CTM(R4) ;;; Start I/O Timeout.  MTPS #0 ;;; ALLOW INTERRUPTS.( RETURN ; EXIT while I/O in progress. .PAGE( .SBTTL INITIATE NONDATA (I/O) SERVICING;+&; Initiate Non Data (I/O) servicing:;M%; R0 - > FTBL I/O Command, R2 - CSR,e;; R3 - Controller Index (S.CON), R4 - > SCB, R5 - > UCB.);-4NDTIO: MOV #NDTCMD,IORTN(R3) ; Restart I/O return @.A MOV U.BUF(R5),SPCYET(R3) ; Space Count .or. Tape Characteristics(, CLR U.BUF(R5) ; Init for NDT Command word. TST (R0) ; Spacing Request? BEQ SPACE ; IF EQ, Yes.4; -- STRTIO -- Start NON DATA (not SPACING) requests;l'; U.BUF+1(R5) - Command request count.A;N&; R0 - > FTBL I/O Command, R2 - CSR,;; R3 - Controller Index (S.CON), R4 - > SCB, R5 - > UCB.2;C-NDTCMD: MOVB (R0),U.BUF(R5) ; 6250BPI Mode.C) BIT #M.1600,U.CW2(R5) ; 1600BPI Command?I BEQ 10$ ; IF EQ, No.t9 MOVB 1(R0),U.BUF(R5) ; NDT Command Word - 1600BPI Mode.h010$: BITB #US.ABO,U.STS(R5) ; Abort I/O request? BNE ABOEND ; IF NE, Yes.c TST (R0)+ ; > Timeouts.! MTPS #PR5 ; INHIBIT INTERRUPTSN ; Start I/OI1 MOV #C1.TRE,MFCS1(R2) ;;; Make sure no previous c7 BIC #C1.TRE,MFCS1(R2) ;;; transfer error holds us up. ! MOVB U.UNIT(R5),R3 ;;; Prepare  ASL R3 ;;; for MFNDx ADD R2,R3 ;;; accessing.5 MOV U.BUF(R5),MFND0(R3) ;;; Start Non Data Transfer.d8 MOVB #C1.IE,MFCS1(R2) ;;; Allow interrupts on this RH.$ MOVB (R0)+,S.CTM(R4) ;;; Start I/O$ MOVB (R0)+,S.STS(R4) ;;; Timeout. MTPS #0 ;;; ALLOW INTERRUPTS( RETURN ; EXIT While I/O in progress. H .ENABL LSBT)SPACE: TST SPCYET(R3) ; Space count =0 ?) BNE 10$ ; IF NE, No.s" CLR INPROG(R3) ; No active I/O. & MOV #IS.SUC&377,R0 ; Successful end,$ CLR R1 ; no blocks/files spaced, BR ENDIT ; End request.; Handle Spacing Count.R010$: CLR R1 ; R1 - Space Dir; EQ-FWD, NEQ-REV." TST SPCYET(R3) ; Space Forward ? BPL 20$ ; IF PL, Yes.' NEG SPCYET(R3) ; Count adjustment and. INC R1 ; REV indication.; Space Files/Block's ?,20$: CMP #IO.SPF,-4(R0) ; Space via TMK's ? BEQ 40$ ; IF EQ, Yes.!; Determine Space Blocks Command.B, MOV #SPFREC,IOFCT(R3) ; > Space FWD blocks. TST R1 ; Space records FWD ?  BEQ 30$ ; IF EQ, Yes., MOV #SPRREC,IOFCT(R3) ; > Space REV blocks.; Setup NDT Command.030$: CLR SPACED(R3) ; No Blks/TMK's yet spaced.6 MOVB @IOFCT(R3),U.BUF(R5) ; Set up NDT Function Code.3SPCAGN: MOV #255.,R1 ; R1 - Spacing command count.m/ CMP SPCYET(R3),R1 ; Space GT 255 Blcks/TMKs ?  BHI 35$ ; IF HI, Yes.. MOV SPCYET(R3),R1 ; Space LT 255 Blcks/TMKs.'35$: SUB R1,SPCYET(R3) ; To yet space.s; MOVB R1,U.BUF+1(R5) ; Set up NDT command (spacing) count.T- MOV R1,SPCNG(R3) ; Current I/O space count.Q4 MOV IOFCT(R3),R0 ; R0 > Spacing Subfunction Table./ MOV #NDTCMD,IORTN(R3) ; Restart spacing I/O @.  BR NDTCMD ; Now issue I/O.I ; Determine Space Files Command.-40$: MOV #SPRTMK,IOFCT(R3) ; > Space REV TMK.g TST R1 ; REV TMK ?S BNE 30$ ; IF NE, Yes.) MOV #SPFTMK,IOFCT(R3) ; > Space FWD TMK.) BITB #US.LAB,U.STS(R5) ; Labelled tape ?K BNE 30$ ; IF NE, Yes.. MOV #SPLTMK,IOFCT(R3) ; > Space FWD TMK/LEOT. BR 30$ ; . . cont . u .DSABL LSB, .PAGE .SBTTL CANCEL I/O OPERATION;+; -- MFCAN -- ;R7; Called for QIO IO.KIL request (UC.KIL set in U.CTL) R0; .or. EXEC Task rundown (US.BSY set in U.STS).;I&; Active I/O ends in one of two ways:;; 1. Normal end - Data transfers are allowed to complete. ); Error recovery attempts are aborted.TI; 2. Abnormal end - Other requests are aborted via the Timeout routine.KE; The driver attempts to leave the hardware in a controlled state.O;-; Register configuration upon entry to MFCAN:E6; R0 - > Current I/O Packet. R3 - RH Con00`b!b_c_d_ktroller Index.&; R1 - > Current Task TCB. R4 - > SCB.; R5 - > UCB. ;-;MFCAN: CMP I.TCB(R0),R1 ;;; Active I/O owned by requestor?n BNE 10$ ;;; IF NE, No. + BISB #US.ABO,U.STS(R5) ;;; End active I/O. 10$: RETURN  .SBTTL POWERFAIL ENTRY POINTt;+ ; -- MFPWF --a;nB; Called due to: 1. System power failure and subsequent recovery.; 2. System Bootstrapped.; 3. Driver loaded.;eN; A. US.PWF set: indicates that normal QIO functions are disallowed with the :; exception of IO.RWD, IO.RWU, IO.SMO, IO.SEC, and IO.STC.J; *** Successful IO.RWD, IO.RWU and IO.SMO reset US.PWF and allow normal ; operations to resume.B:; B. Reset controller/devices/U.CW2 and allow Interrupts.;e-; Register configuration upon entry to MFPWF:R; R3 - RH Controller index ; R4 - > SCB ; R5 - > UCB;-8MFPWF: BISB #US.PWF,U.STS(R5) ; Normal QIO's dissalowed.& MOV S.CSR(R4),R2 ; R2 > Device REGS.2 CLR U.CW2(R5) ; Reset Tape Characteristics word.6 BIS #C2.CLR,MFCS2(R2) ; Reset controller and devices.> MOVB #C1.IE,MFCS1(R2) ; Allow Interrupts on this controller.8 MOV U.DCB(R5),DCBPTR ; DCB > - Driver restart fallback.7 MOV R5,CNTBL(R3) ; UCB > - Unsolicited Intrpt Hndlng.w RETURN  .PAGE .SBTTL TIMEOUT ENTRY POINTn;+ ; -- MFOUT --3;R; Called due to S.CTM expiring:;5; 1. Active I/O - :O; a. IF US.ABO set - End request (no recovery), if possible end physical I/O.i*; b. IF Timeout (S.STS=0) - End request.; 2. Request DQD - 5; a. DQD, no I/O issued; M.RWD .or. TM78 not ready.V<; b. I/O issued; TU78 Offline (Sel Err) .or. TM78 cleared.;U-; Register configuration upon entry to MFOUT:c3; R0 = IE.DNR, Device Not Ready, R2 = CSR (S.CSR),n:; R3 - RH Cntrlr Index (S.CON), R4 - > SCB, R5 - > UCB.;-5MFOUT: DECB S.STS(R4) ;;; One less Timeout Subcycle. / BITB #US.ABO,U.STS(R5) ;;; Abort I/O request ?q BEQ 10$ ;;; IF EQ, No.i, MOV #IE.ABO&377,R0 ;;; Request end status.35$: BIC #C1.IE,@S.CSR(R4) ;;; Disable TM Interrupt.D MTPS #0 ;;; Allow interrupts.%7$: SUBR ENDRQS ; End I/O request.l$ CALL CLRTM ; Abort physical I/O. RETURNr*10$: TST INPROG(R3) ;;; I/O In Progress ? BEQ 20$ ;;; IF EQ, No.2- TSTB S.STS(R4) ;;; Timeout Subcycles left ?)) BNE 15$ ;;; IF NE, Yes. Restart Timer.D112$: .IF DF E$$DVC ;;; If Error Logging Device. " PUSH S.RCNT(R5) ;;; Error log - ? MOV #TMREGS,S.RCNT(R5) ;;; Dev Reg's, no MFBAE/MFCS3/XND SNS.e& CALL $DTOER ;;; Log Device Timeout.8 POP S.RCNT(R5) ; Normally Log Dev Reg's and Extnd Sns. .ENDC BR 7$ ; End request.r; Restart TIMER.115$: MOVB S.ITM(R4),S.CTM(R4) ;;; Restart timer.O" RETURN ;;; Until next Timeout.7; DQD Request. Could not previously issue I/O request. l120$: TSTB S.STS(R4) ;;; Timeout Subcycles left ?) BNE 15$ ;;; IF NE, Yes. Restart Timer.e; DQD Request. Timeout.;1 BIT #M.RWD,U.CW2(R5) ;;; Tape Drive Rewinding ?s, BNE 12$ ;;; IF NE, Yes - End DQD request..; MOV U.SUB(R5),MFCS2(R2) ;;; Select TM UNIT.+ TST MFCR(R2) ;;; TM78 Ready for Command ? + BPL 12$ ;;; IF PL, No - End DQD request.5 MTPS #0 ; Allow interrupts.R& JMP DQD ; Servvice pending request. .PAGE .SBTTL INTERRUPT SERVICINGn;+7; $MFINT - TM78/TU78 Mag Tape Interrupt Service Routine;;-MFINT:<; INTSE$ MF,PR5,T$$M78 ;;; Map ISR, Set Processor Priority.;u$; R5 > UCB. R4= RH Controller Index.;; MOV U.SCB(R5),R4 ;;; R4 > SCB18 BICB #C1.IE,@S.CSR(R4) ;;; No IE in TM CS1 pseudo reg.4 MOVB S.CON(R4),R4 ;;; Restore RH Controller Index.5 CALL $FORK ;;; Become Interuptable System Process.D;+=; Interrupt servicing first handles Data Transfer interrupts E; - followed by servicing all Non Data Transfer Attentions present.T;/>; A data transfer request defers non data transfer interrupts &; pending data transfer completion. ;r9; The TM78 can generate solicited/unsolicited interrupts:;VO; 1.Solicited interrupts occur as a result of Data/Non Data Transfer Requests. ;.O; 2.Unsolicited interrupts result from tape units00hbba`TADATADATADATADATADATA coming on line and hardware II; failure. If MFCS1 C1.IE is enabled, unsolicited interrupts can occur.T;-( MOV R4,R3 ; R3 - RH Controller Index.- MOV U.SCB(R5),R4 ; R4 - > SCB. R5 - > UCB. MOV S.CSR(R4),R2 ; R2=CSR.! TST DTCMD(R3) ; Data Transfer ?  BEQ 10$ ; IF EQ, No.e0 SUBR DTINT ; Service Data Transfer Interrupt.+10$: TST MFAS(R2) ; Attention Interrupts ?t BEQ 20$ ; IF EQ, No.r5 SUBR NDINT ; Service Non Data Transfer Interrupts.s&20$: TST INPROG(R3) ; I/O yet active? BEQ 30$ ; IF NE, No.d$ MOV IOFCT(R3),R0 ; R0 > active I/O TST (R0)+ ; timeouts.! MOVB (R0)+,S.CTM(R4) ; Re-start;& MOVB (R0)+,S.ITM(R4) ; I/O timeout., MOVB #C1.IE,MFCS1(R2) ; Wait for interrupt. RETURN;630$: TST DQDIO(R3) ; DQD request to be yet completed? BNE 40$ ; IF EQ, Yes.2 JMP MFINI ; Service any other pending requests.040$: JMP DQD ; Service previously DQD request. .PAGE .SBTTL NDT INTERRUPT SERVICINGT;+(; Non Data Transfer Interrupt Servicing.;y9; Service active ATTNS - both solicited and unsolicited.R; K; The ATTN bit position identifies the TM Unit, Register MFNDI identifies M*; NDT Interrupt Code/Tape Unit (Attn Adr).;.D; If unsolicited: appropriate measures are taken and ATTN is reset.; 4; If solicited: verify interrupt an expected value.<; Unexpected values end the request and driver dependencies.'; If expected, call I/O ending routine.; EI; Control is returned to the ATTN scan routine to service active ATTN's.c;-1 .BLKW T$$M78 ; Reserve space - Return address.s6NDINT: SUBR FNDUNT ; Obtain a TM Unit, ATTN pending.$ BCC 10$ ; IF CC, Found a TM Unit." RTRN NDINT ; No further ATTN's.,10$: SUBR UNSLCT ; Unsolicited Interrupt ?% BCS NDINT ; IF CS, Yes. Any more ?' SUBR VALNDI ; Reasonable Interrupt ?c BCC 20$ ; IF CC, Yes. SUBR LOGERR ; Log Error.v7 MOV #IE.FHE&377,R0 ; Indicate Unrecoverable Situation" SUBR ENDRQS ; and End Request./ RTRN NDINT ; Service pending NDT Interrupts.-120$: CALL RTRNCD ; Set up I/O Return Code - R0.s+ MOV IOFCT(R3),R1 ; R1 > I/O Command code.T9 BIT #M.RWD,U.CW2(R5) ; Perhaps previous RWD operation ?N BEQ 30$ ; IF EQ, No.2 MOV #IORWD+CMDGCR,R1 ; R1 > I/O RWD command code.;30$: ADD #ISRSRV-CMDGCR,R1 ; R1 > I/O Interrupt servicing.  MOV (R1),R1 ; > and Service  MOV #.+10,-2(R1) ; NDT I/O  JMP (R1) ; Requests.I# BR NDINT ; Service other ATTN's.B .PAGE  .SBTTL NDT INTRPT ROUTINESD;+; -- FNDUNT --; F; Subroutine scans MFAS L <- R, to find first active ATTN, TM Unit #. ;V; TM Unit (ATTN) Found - CC:n;; Sets up ATTN reset mask (RSTATN(R3)), Selects TM Unit.t; !; TM Unit (ATTN) Not Found - CS.#;W; R1 - Modified.I;-1 .BLKW T$$M78 ; Reserve space - Return Address./,FNDUNT: MOV #1,R1 ; R1- HI Byte,TM UNIT#. ! ; LO Byte,MFAS Rst Mask. % MOV MFAS(R2),-(SP) ; (SP) - ATTN's,B5 MOVB #8.,1(SP) ; 1(SP) - # of ATTN's to be checked.D10$: ASRB (SP) ; This ATTN ? BCS 20$ ; IF CS, Yes." ASLB R1 ; Update MFAS Rst Mask, SWAB R1 ; and  INCB R1 ; next  SWAB R1 ; UNIT.s' DECB 1(SP) ; One less ATTN to check.s2 BNE 10$ ; IF NE, Check for other ATTN's active. SEC ; No TM UNIT found. BR 30$$920$: MOVB R1,RSTATN(R3) ; NDT Command - ATTN Reset Mask.  SWAB R1 ; Select## MOVB R1,MFCS2(R2) ; and remember # MOVB R1,TMUNIT(R3) ; TM UNIT #.s CLC ; TM UNIT found.%30$: POP ; Return Stack as found.A RTRN FNDUNT .PAGE ?;+; -- UNSLCT --;eG; Unsolicited ATTN's (NDT INTRPT) occur due to tape units coming ONLINE ; .or. equipment failure.T;; Unsolicited ATTN - CS.; Solicited ATTN - CC.;;#; ONLINE interrupts are dismissed..;S?; Equipment Failures (NDT INTRPT's #32.or.#34) are logged and ;2; their TM's reset (no further I/O may proceed).; /; R0 - modified, R4 - cleared if unsolicited.U;-1 .BLKW T$$M78 ; Reserve space - Return Address.P*UNSLCT: MOV MFNDI(R2),R0 ; R0 - [MFNDI];  MOV R0,INTRPT(R3) ; NDT # BIC #^C<1477>,R0 ; 00pb!b_c_d_k INTRPT code.R SWAB R0 ; Remembern# MOVB R0,TMUNIT+1(R3) ; TU Unti#.f SWAB R0 ; n& CMP #17,R0 ; Tape Unit put Online ? BNE 10$ ; IF NE, No.r4 MOV RSTATN(R3),MFAS(R2) ; Unit Online - Reset ATTN.1 BIC #M.RWD,U.CW2(R5) ; Any previous Rewind over.s#7$: SEC ; Unsolicited interrupt. BR 20$ 610$: CMP #32,R0 ; TM Fault B (TM Detected Failure) ? BEQ 15$ ; IF EQ, Yes.4 CMP #34,R0 ; MB Fault (MASSBUS Cntrl Bus Fault) ? BNE 19$ ; IF NE, No.)#15$: TST INPROG(R3) ; Active I/O ?T BNE 17$ ; IF NE, Yes." CLR R4 ; Unsolicited interrupt.-17$: SUBR LOGERR ; Log the Error, Clear TM.a# TST R4 ; Unsolicited interrupt ?  BEQ 7$ ; IF EQ, Yes.,"19$: CLC ; Solicited interrupt.20$: RTRN UNSLCT .PAGE n;+; -- VALNDI --; 8; Validate Non Data Interrupts. Obtain UCB/SCB for ATTN.;#:; 1. If not in configuration, not INPROG or Tape Unit not 5; previously set into Rewind - will take no action. >; Reset the ATTN and continue scanning for additional ATTN's.;/N; This happens when OS systems moved about without correcting the system data N; bases or by adding on equipment that data bases have not been generated for.; H; 2. Validate NDT Interrupt for I/O INPROG or Tape Unit in previous RWD.;n ; INPUTS - ; R2 - CSR, R3 - RH CNTL INDX.;e9; OUTPUTS - CS, INVALID. CC, Valid. Registers preserved.u;-1 .BLKW T$$M78 ; Reserve space - Return Address. "VALNDI: MOV DCBPTR,R5 ; R5 > DCB.E PUSH ; UCB lenght,HI/LO UCB unit #s on Stack " MOV D.UCB(R5),R5 ; R5 > 1st UCB.(5$: CMP R5,U.RED(R5) ; UCB Redirected ? BNE 20$ ; IF NE, Yes. TST INPROG(R3) ; I/O Active ?b BEQ 10$ ; IF EQ, No. 1 CMP R5,CNTBL(R3) ; UCB same as for I/O INPROG ?i BEQ 40$ ; IF EQ, Yes.510$: BIT #M.RWD,U.CW2(R5) ; Tape Unit prev set RWD ?T BEQ 20$ ; IF EQ, No.d0 CMPB U.UNIT(R5),TMUNIT+1(R3) ; Same Tape Unit ? BNE 20$ ; IF NE, No.e,; CMPB U.SUB(R5),TMUNIT(R3) ; Same TM UNIT ? BNE 20$ ; IF NE, No.  MOV U.SCB(R5),R4 ; R4 > SCB. CMPB S.CON(R4),R3 ; Same RH ?  BEQ 42$ ; IF EQ, Yes."20$: CMPB (SP),1(SP) ; Last UCB ? BEQ 30$ ; IF EQ, Yes. ADD 2(SP),R5 ; R5 > next UCB.$$ INCB (SP) ; LO # - Current UCB #.* BR 5$ ; Keep Checking rest of MF UCB's.*30$: MOV RSTATN(R3),MFAS(R2) ; Reset ATTN,! SEC ; Unreasonable Interrupt.; BR 50$ "40$: MOV U.SCB(R5),R4 ; R4 > SCB.,42$: CALL VALIDT ; Validate NDT Interrupt.,50$: POP <,> ; Maintain stack integrity. RTRN VALNDI .PAGE M;+; -- VALIDT -- ;CI; Validate INPROG or prev RWD request INTRPT Code - defined and in range.S;1,; Valid: CC - Described in INTCD1 or INTCD2.;D; Invalid, CS. ;-,VALIDT: PUSH ; Reference values.& MOV IOFCT(R3),R1 ; R1 > I/O command.( CMP R5,CNTBL(R3) ; INPROG Validation ? BEQ 10$ ; IF EQ, Yes.- MOV #IORWD+CMDGCR,R1 ; R1 > RWD I/O command.R110$: ADD #SVALI1,R1 ; R1 > 1st validation mask. n+ MOVB INTRPT(R3),R0 ; R0 - Interrupt Code.n. CMPB R0,#35 ; Interrupt code out of range ? BGE 30$ ; IF GE, Yes.- CLR INTCD1(R3) ; Initialize 0-17 and 20-34 n. CLR INTCD2(R3) ; interrupt bit descriptors.6 MOV #INTCD1,R2 ; R2 > Interrupt 0-17 bit descriptor.& CMPB R0,#17 ; Interrupt 0-17 range? BLOS 20$ ; IF BLOS, Yes.n7 MOV #INTCD2,R2 ; R2 > Interrupt 20-34 bit descriptor.;3 BIC #20,R0 ; Interrupt code in binary/bit range.m( TST (R1)+ ; R1 > 2nd validation mask.620$: ADD R3,R2 ; R2 > correct Intrpt bit descriptor." ASL R0 ; Convert Interrupt Code ADD #$BTMSK,R0 ; TO MOV (R0),R0 ; Bit Mask Value.' MOV R0,(R2) ; Current Intrpt code - I ; per Bit descrition." BIT R0,(R1) ; Valid Interrupt ? BEQ 30$ ; IF EQ, No.r( CLC ; Indicate Interrupt Code Valid.025$: POP ; Maintain stack integrity. RETURN .30$: SEC ; Indicate interrupt code Invalid. BR 25$  .PAGE .SBTTL NDT INTRPT SERVICING;+; Non Data Interrupt Servicing.A;-;+*; Sense Tape Charecteristics - Completion.:; Result of servicing IO.SMO, IO.STC and IO.SEC requests.;000xbba`TADATADATADATADATADATA ; INPUTS -7; R0 - LO BYTE; I/O Request Return Code HI BYTE; 0's. /; R2 - CSR. R3 - RH CNTL INDX. R5 - > UCB.I;r ; OUTPUTS -37; R2 - CSR, R3 - RH CNTL INDX, R4 - > SCB, R5 - > UCB.i;-1 .BLKW T$$M78 ; Reserve space - Return Address.T'SNSISR: CMPB #IS.SUC,R0 ; Successful ?c BEQ 5$ ; IF EQ, Yes.. SUBR LOGERR ; Log Error.I- BIS #M.SER,U.CW2(R5) ; Not avalable for use.-3$: MOV #IE.FHE&377,R0 ; Hardware problems. . BR 25$ ; End request.?5$: BIC #NWBTS1,U.CW2(R5) ; Update BOT,EOT,HWL,SER,1600 status.;- CLR R1 ; Temp BOT,EOT,HWL,SER,1600 status. 1 PUSH MFDS(R2) ; Local copy - Tape Drive Status.U BIT #DS.RDY,(SP) ; Ready ? BNE 10$ ; IF NE, Yes.# BIS #M.SER,R1 ; Not avail for usee BR 20$c10$: BIT #DS.BOT,(SP) ; BOT ? BEQ 12$ ; IF EQ, No.  BIS #M.BOT,R1 ; Status- BOT.12$: BIT #DS.EOT,(SP) ; EOT ? BEQ 14$ ; IF EQ, No.v BIS #M.EOT,R1 ; Status- EOT.'14$: BIT #DS.FPT,(SP) ; Write Locked ?  BEQ 16$ ; IF EQ, No.I' BIS #M.HWL,R1 ; Status- Write locked.S*16$: BIT #DS.PE,(SP) ; Tape Unit 1600BPI? BEQ 20$ ; IF EQ, No.S# BIS #M.1600,R1 ; Status- 1600BPI. /20$: BIS R1,U.CW2(R5) ; Update Tape Char word.  POP ; Maintain Stack.,+ MOV IOFCT(R3),R1 ; R1 > I/O Command code.T' CMP #IO.SEC,-4(R1) ; IO.SEC request ?Q BNE 30$ ; IF NE, No. 925$: MOV U.CW2(R5),R1 ; 2nd I/O Status Word - Tape Char I SUBR ENDRQS ; End Request.t3 RTRN SNSISR ; Return to NDT Interrupt Servicing.; IO.SMO/IO.STC - F30$: BIC #M.SWL!M.IWR,U.CW2(R5) ; Perhaps - No Soft Write Lock, IWR. 0 PUSH TPCHAR(R3) ; Setup - Software write lock< BIC #^C,(SP) ; and Extended gap write control& BIS (SP)+,U.CW2(R5) ; per request.%35$: MOV U.CW2(R5),-(SP) ; (SP)+2 > o1 BIC #^C,(SP) ; Setup - density control.  MOV TPCHAR(R3),-(SP) ; (SP) >3 BIC #^C,(SP) ; Request - density control.r1 CMP (SP),+2(SP) ; Setup/Request densities same?; BEQ 37$ ; IF EQ, Yes.& BIT #M.BOT,U.CW2(R5) ; TU78 at BOT ?. BEQ 40$ ; IF EQ, No - can't change density., BIC #M.1600,U.CW2(R5) ; Set density control$ BIS (SP),U.CW2(R5) ; per request. 37$: POP <,> ; Restore stack. CMP #IO.SMO,-4(R1) ; IO.STC ?  BNE 25$ ; IF NE, Yes.4 BIT #M.BOT,U.CW2(R5) ; IO.SMO only succeeds at BOT. BEQ 3$ ; IF EQ, failure.9 BICB #US.PWF,U.STS(R5) ; Reset Power Failed Indication.q BR 25$ ; End Request. 40$: POP <,> ; Restore stack.0 BR 3$ ; Not BOT, Setup/Request densities NEQ. ,;+!; Completed Space Tape Operation:;B; FWD/REV via TMKS, FWD to LEOT, FWD/REV via Blocks (Records).;y ; INPUTS -7; R0 - LO BYTE; I/O Request Return Code HI BYTE; 0's.t/; R2 - CSR. R3 - RH CNTL INDX. R5 - > UCB.E;$ ; OUTPUTS -e7; R2 - CSR, R3 - RH CNTL INDX, R4 - > SCB, R5 - > UCB.;-1 .BLKW T$$M78 ; Reserve space - Return Address.RFSPCISR: BIT #DON!TMK!BOT!LEOT!NAVL!NTEX!NTCP,INTCD1(R3) ; End request? BNE 20$ ; IF NE, Yes.B BIT #NRDY!OFLN,INTCD1(R3) ; Not ready for command or Unit Offl ? BNE 40$ ; IF NE, Yes. SUBR LOGERR ; Log Error.T710$: MOV SPACED(R3),R1 ; Indicate TMK's/Blocks Spaced. !15$: SUBR ENDRQS ; End Request.I218$: RTRN SPCISR ; Service other NDT Interrupts.O; IS.SUC (Normal End). IF Interrupt code is DON, THEN may need to Restart I/O. B!20$: MOVB MFNDI+1(R2),R1 ; R1 = BIC #^C<3>,R1 ; Tape Unit #. ASL R1 ; Make word index -!# ADD R2,R1 ; To access Residual 2+ MOVB MFND0+1(R1),R1 ; TMK/Block Count.)2 BIC #^C<377>,R1 ; R1 = Residual TMK/Block Count.0 BEQ 30$ ; IF EQ, Current req count exhausted.2 SUB R1,SPCNG(R3) ; SPCNG - TMK's/Block's spaced.?30$: ADD SPCNG(R3),SPACED(R3) ; Maintain TMK's/Block's spaced.e, BIT #DON,INTCD1(R3) ; Interrupt code DON ?$ BEQ 10$ ; IF EQ, No. End Request.2 TST SPCYET(R3) ; Further TMK's/Blocks to Space ? BEQ 10$ ; IF EQ, No.  MOV U.SCB(R5),R4 ; R4 > SCB.0 JMP SPCAGN ; Restart I/O to complete request.-40$: CALL MSG ; OFLN .or. NRDY Intrpt Code. BCC 15$ ; IF CC, End request.# BR 18$ ; Service NDT Interr00b!b_c_d_kupts.  r;+C; Completed: Write Tape Mark; Erase 3" Gap; Data Security Erase;e); Rewind Tape; Rewind/unload Tape.i;M ; INPUTS -7; R0 - LO BYTE; I/O Request Return Code HI BYTE; 0's.B/; R2 - CSR. R3 - RH CNTL INDX. R5 - > UCB.3;; ; OUTPUTS -s7; R2 - CSR, R3 - RH CNTL INDX, R4 - > SCB, R5 - > UCB.R;-8RWDRET: .BLKW T$$M78 ; Reserve space - Return Address.<RWDISR: BIT #M.RWD,U.CW2(R5) ; Rewind previously initiated ? BEQ 30$ ; IF EQ, No..0 BIC #M.RWD,U.CW2(R5) ; End of previous Rewind.& CMPB #IS.SUC,R0 ; Any complications. BEQ 10$ ; IF EQ, No.e- CLR R4 ; TMFA/TUFA error - Req prev ended.M SUBR LOGERR ; Log it.*10$: MOV RSTATN(R3),MFAS(R2) ; Reset ATTN.5 TST DQDIO(R3) ; Driver need compl prev DQD request? BEQ 20$ ; IF EQ, No.,% JMP DQD ; Service pending request.U220$: RTRN RWDISR ; Service other NDT Attentions.@30$: BIT #DON!NRDY!NAVL!OFLN!NTEX,INTCD1(R3) ; Initiated Rewind? BNE 40$ ; IF NE, No. * BIS #M.RWD,U.CW2(R5) ; Rewind initiated.+40$: MOV RWDRET,WTMRET ; Maintain linkage.i BR WTMISR ; End Request. 8WTMRET: .BLKW T$$M78 ; Reserve space - Return Address.WTMISR:LERGISR:0DSEISR:TBUNLISR: BIT #DON!RWD,INTCD1(R3) ; Clear Power Failed Indication ? BEQ 5$ ; IF EQ, No.9 BICB #US.PWF,U.STS(R5) ; Reset Power Failed Indication.U* BIT #RWD,INTCD1(R3) ; Rewind initiated ? BEQ 5$ ; IF EQ, No.' BIS #M.RWD,U.CW2(R5) ; Rewind started.i=5$: BIT #DON!RWD!EOT!FPT!NAVL!NTEX,INTCD1(R3) ; End Request ?; BNE 10$ ; IF NE, Yes.C BIT #NRDY!OFLN,INTCD1(R3) ; Not ready for command, Unit Offline ? BNE 30$ ; IF NE, Yes. SUBR LOGERR ; Log Error.r!10$: SUBR ENDRQS ; End Request.720$: RTRN WTMISR ; Return to NDT Interrupt Servicing.i-30$: CALL MSG ; OFLN .or. NRDY Intrpt Code.. BCC 10$ ; IF CC, End request.# BR 20$ ; Service NDT interrupts.i .PAGE .SBTTL DT INTERRUPT SERVICING;+$; Data Transfer Interrupt Servicing.; .; Service Read/Write/Extended Sense Requests.; ; INPUTS -;$; R2 - CSR R3 - RH CNTRL INDX; R4 - > SCB R5 - > UCB; "; XNSCMD - NEQ=XND SNS Operation.;-1 .BLKW T$$M78 ; Reserve space - Return Address. 3DTINT: BIT #C1.TRE,MFCS1(R2) ; DATA Transfer error?  BNE 30$ ; IF NE, Yes.# TST XNSCMD(R3) ; Extended Sense ?Y BEQ 10$ ; IF EQ, No. - JMP XNSISR ; Endup Extended Sense Request. ; Interrupt code= DON.&10$: MOV #IS.SUC&377,R0 ; Success and.12$: MOV U.CNT(R5),R1 ; # bytes transferred.!14$: SUBR ENDRQS ; End request. '16$: RTRN DTINT ; Service NDT ATTN's.R'25$: MOV #IE.FHE&377,R0 ; Fatal Error.S#27$: SUBR LOGERR ; Log the Error.L BR 14$ ; End request.9; Data trnsfr err; C1.TRE = MFCS2 ! Drive Intrpt NOT DON.n(30$: MOV MFCS2(R2),R0 ; R0 - possible , BIC #^C,R0 ; RH Error indication. BEQ 40$ ; IF EQ, no.S; *****uM; FOR NOW - MFCS2 errors will be considered fatal. Will complete this later.; BR 25$a1; Data trnsfr err; C1.TRE = Drive intrpt NOT DON.4=40$: MOV MFDI(R2),INTRPT(R3) ; Dt Fail Cd, DPR, Dt Intrpt Cd.D' CALL VALIDT ; Validate DT Interrupt.F* BCS 25$ ; IF CS, Invalid - End request.- CALL RTRNCD ; Set up I/O Return Code - R0.f2 MOV INTCD1(R3),R1 ; R1 - Intrpt code 0-17 range?0 BEQ 60$ ; IF EQ, No. Intrpt code 20-34 range.7 BIT #FPT!NAVL!NTEX!NTCP,R1 ; End request (no status) ?S BEQ 44$ ; IF EQ, No.F BIT #NTCP,R1 ; Not capable ?$ BNE 27$ ; IF NE, Yes - log error.42$: CLR R1 ; No status, BR 14$ ; end request.N&44$: BIT #TMK,R1 ; TMK (file mark) ? BEQ 46$ ; IF EQ, No. PUSH R0 ; Remember IE.EOF+ MOV IOFCT(R3),R0 ; R0 - I/O Command code.  BIT #REV,-2(R0) ; REV ?S BNE 45$ ; IF NE, Yes. BIS #M.TMK,U.CW2(R5) ; TMK -I45$: POP R0 ; Restore IE.EOF,  BR 42$ ; end request.0"46$: BIT #BOT,R1 ; Rev into BOT? BEQ 48$ ; IF EQ, No.s BIS #M.BOT,U.CW2(R5) ; BOT andB! BR 42$ ; no bytes transfered.2#48$: BIT #EOT,R1 ; EOT on write ?R BEQ 50$ ; IF EQ, No.4 BIS #M.EOT,U.CW2(R5) ; EOT and# BR 12$ ; bytes transfered.-50$:00bba`TADATADATADATADATADATA CALL MSG ; OFLN .or. NRDY Intrpt Code.E BCC 14$ ; IF CC, End request.# BR 16$ ; Service NDT interrupts.E460$: MOV INTCD2(R3),R1 ;Interrupt code 20-34 range.! BIT #RLL,R1 ; Data GT request?E BNE 42$ ; IF NE, Yes.0 BIT #UNRD!ERR!BDTP!TMFA!TUFA,R1 ; Fatal error ?$ BNE 27$ ; IF NE, Yes - log error.# BIT #EOTE,R1 ; EOT error (write)?e BEQ 64$ ; IF EQ, No.T$ BIS #M.EOT,U.CW2(R5) ; Indicate EOT BR 42$ ; End request.(64$: BIT #RLS,R1 ; Data LT requested ? BEQ 70$ ; IF EQ, No. " MOV MFBC(R2),R1 ; Data trasfered BR 14$ ; and End request.s; Error Recovery: RTRY ! RDOP. p70$: SUBR LOGERR ; Log error.I! DECB RTTBL(R3) ; Retries left ?L% BEQ 14$ ; IF EQ, No - end request.;" BIT #RTRY,R1 ; Retry operation ? BNE 75$ ; IF NE, Yes.1 MOV RDOPCM(R3),R0 ; R0 > FTBL I/O Command code.R.75$: CALL SETUP ; Setup transfer parameters./ JMP @IORTN(R3) ; Restart RH - Error recovery.  .PAGE4 .SBTTL Handle 'Not Ready' or 'Offline' return codes;+ ; -- MSG --Q;o ; INPUTS -(-; INTCD1(R3) - Interrupt code OFLN .or. NRDY.r;e ; OUTPUT -o; CC - end request.O"; CS - MSG handled Interrupt Code.;;-MSG: 3$; Preprocess OFLN/NRDY Intrpt codes.' BIT #NRDY,INTCD1(R3) ; NRDY interrupt?R BNE 20$ ; IF NE, Yes.; OFLN Interrupt.M+5$: BITB #US.SUP,U.STS(R5) ; IQ.X or UMD's?e& BNE 18$ ; IF NE, Yes - end request.! TST U.ACP(R5) ; Associated ACP?a& BNE 15$ ; IF NE, Yes - end request.#10$: PUSH ; Save REG's.u* MOV #T.NDSE,R0 ; 'Select Error' message. CALL $DVMSG ; Output message." POP ; Restore REG's.! CLR INPROG(R3) ; No I/O active,l( INCB DQDIO+1(R3) ; retry I/O Request.& MOV RSTATN(R3),MFAS(R2) ; Reset ATTN.+ MOVB #1,S.STS(R4) ; Start 15 sec timeout. / MOVB #15.,S.CTM(R4) ; Try again in 15 sec. S)14$: SEC ; MSG handled Interrupt code.; 15$: RETURN 18$: CLC ; End request. BR 15$t&; NRDY Interrupt. Check failure code.20$: BPT ; *** DEBUG *** PUSH R0 ; Save R0.# TST DTCMD(R3) ; Data Request?g BEQ 25$ ; IF EQ, NDT.7 MOVB MFDI+1(R2),R0 ; R0 - DT failure code, 0 and DPR.O BR 26$ ; . . Cont.l?25$: MOVB MFNDI+1(R3),R0 ; R0 - NDT failure code, Tape Unit #.R26$: ASR R0 ; R0 =! ASR R0 ; NDT/DT failure code.o! CMP #2,R0 ; Failure Code = 2?  POP R0 ; Restore R0.S BNE 5$ ; IF NE, No.6; Fatal TM error - Clear TM; Log Error; Retry request./ BR 10$ ; DON'T KNOW IF THAT'S WHERE TO GO !!d .PAGE .SBTTL LOG DEVICE ERRORS ;+; -- LOGERR --;T ; INPUTS - /; R2 - CSR, R3 - RH CNTRL INDX, R5 - > UCB,F5; R4 = EQ - Unsolicited I/O error, R0 - Don't care.6;; R4 - > SCB - Solicited I/O error, R0 - I/O Status Code.e;d+; OUTPUTS - REG's Preserved. R1 Altered.R;-1 .BLKW T$$M78 ; Reserve space - Return Address.d$LOGERR: TST R4 ; Unsolicited I/O ? BEQ 10$ ; IF EQ, Yes.+; IF UMD THEN Pass REG's, Don't Log Error.u# .IF DF D$$IAG ; If Diagnostics -S) CALL MFDGNT ; IF UMD - pass DEV REG's.E BCC 10$ ; IF CC, Not UMD.- INCB INPROG+1(R3) ; UMD - DEV REG's passed.I BR 30$ ; May require TM CLR.  .ENDC ;D$$IAG,; NOT UMD. Solicited/unsolicited I/O Error.-10$: .IF DF E$$DVC ; IF Log Device Errors - 1 MOV #,R1 ; R1 - # Bytes to log.L6 .IF DF M$$EXT ; IF 22 Bit Ext Addr (11/70,11/44) - BIT #DV.MBC,U.CW1(R5) ; RH11 ? BEQ 15$ ; IF EQ, Yes.& ADD #4,R1 ; Log MFBAE/MFCS3 Reg(s).15$: .ENDC ;M$$EXT: PUSH <,R3,R2,R0> ; > Error Packet, Save R3,R2,R0 Reg(s).) CALL $LOGER ; Request an Error Packet.G3 ; IF Got it: R1 > Data Area, R3 > Error packet.e6 MOV R3,+6(SP) ; Assume Got it - Save > Error Packet.C POP ; Restore R0,R2,R3 & > to Error Packet.) BCS 30$ ; IF CS, Not logging an error.o7 INC XNSCMD(R3) ; Extended Sense Request to log error.4 TST R4 ; Solicited I/O ?  BNE 18$ ; IF NE, Yes.4 INCB XNSCMD+1(R3) ; Logging Unsolicited I/O error."18$: PUSH ; Save R2,R0. 5 MOV #TMREGS-2,R0 ; R0 - # Dev Reg(s) thru NDT Regs. /20$: MOV (R2)+,(R1)+ ; Mo00b!b_c_d_kve a Device Register. , DEC R0 ; One less Device Register to log.1 BNE 20$ ; IF NE, log rest of device registers.03 CLR (R1)+ ; Log MFIA reg- 0's (might set C1.CPE)a TST (R2)+ ; R2 > MFCR Reg. MOV (R2),(R1)+ ; Log MFCR Reg. POP ; Restore R0,R2.g5 .IF DF M$$EXT ; IF 22 bit Ext Addr (11/70, 11/44) BIT #DV.MBC,U.CW1(R5) ; RH11 ? BEQ 25$ ; IF EQ, Yes.& MOV MFBAE(R2),(R1)+ ; Move MFBAE Reg& MOV MFCS3(R2),(R1)+ ; Move MFCS3 Reg25$: .ENDC ;M$$EXT .ENDC ;E$$DVCC;IF INTRPT #32.OR.#34 - REQUIRE TM CLR BEFORE ANY I/O MAY COMMENCE..330$: MOVB MFDI(R2),-(SP) ; Data request interrupt.$ TST DTCMD(R3) ; QIO Data request ? BNE 35$ ; IF NE, Yes.3 MOVB MFNDI(R2),(SP) ; Else - Non data interrupt..135$: CMP #32,(SP) ; TM Fault B - requires TM CLR  BEQ 40$ ; IF EQ, Yes.. CMP #34,(SP) ; MB Fault B - requires TM CLR. BNE 50$ ; IF NE, No."40$: TST (SP)+ ; Maintain Stack.- CALL CLRTM ; TM CLR and Unit dependencies.:) TST MFCR(R2) ; TM78 ready for command ?R BMI 50$ ; IF MI, Yes.- MOVB S.ITM(R4),S.CTM(R4) ; Check TM78 after F RETURN ; 2 seconds."50$: TST (SP)+ ; Maintain Stack.2; WHAT IS REG STATE IF RETURN HERE AFTER TMOUT ???CONTLG: .IF DF E$$DVC % TST XNSCMD(R3) ; Logging an error ?  BEQ RTNLGR ; IF EQ, No.2 MOV #60.,DTCNT(R3) ; Extended Sense - 60. bytes.2 CLR DTADR1(R3) ; Error Packet in Exec POOL area.A; IS [R1] STILL HERE ? - WHAT IF RETURNED HERE FROM TMOUT ROUTINEd: MOV R1,DTADR2(R3) ; R1 > Dt in Err pckt- after DEV REG's/ MOV #XNDSNS+CMDGCR,R0 ; R0 > FTBL I/O command.h; *** PROBLEM HERE ***" BR RTNLGR ; Handle other ATTNS.:XNSISR: TSTB XNSCMD+1(R3) ; Log error (Unsolicited I/O) ?, BEQ RTNLGR ; IF EQ, No. Return to caller. PUSH ; Save REG's. CLR R2 ; Retry count EQ.M( MOV ERRPKT(R3),R3 ; R3 > Error Packet.& CLR R4 ; R4 .EQ. (Unsolicited I/O).# CALL $FNERL ; End Error Logging.  POP ; Restore REG's.O" CLR XNSCMD(R3) ; Error log done. .ENDC ;E$$DVC=; WILL WE ALWAYS GET BACK TO WHERE ORIGINALLY CALLED FROM ???c)RTNLGR: RTRN LOGERR ; Return to Caller.R .PAGE: .SBTTL ABORT TM78 OPERATION/DRIVER DATA BASE DEPENDENCIES;+ ; -- CLRTM --?;B;; Called by LOERR Interrupt codes #32.or.#34 to reset TM78 %; or by MFOUT to abort physical I/O.Q;; 1. Reset TM78 via TM CLR.<; 2. Update driver data base - for all TU78's on that TM78.); a. Previously started rewinds ended.;;-CLRTM:(; MOVB U.SUB(R5),MFCS2(R2) ; Select and $ BIS #TMCLR,MFCR(R2) ; Reset TM78. PUSH ; Save 'em.D; MOV U.SUB(R5),R0 ; R0 - TM#. % ASL R0 ; Compatibility with S.CON.B MOV DCBPTR,R5 ; R5 > DCB.A# MOV D.UCBL(R5),-(SP) ; UCB lenght,?3 MOV D.UNIT(R5),-(SP) ; HI/LO UCB unit #s on Stack. " MOV D.UCB(R5),R5 ; R5 > 1st UCB.10$:-; CMP U.SUB(R5),R0 ; Same TM Subcontroller ?  BNE 20$ ; IF NE, NO.s) CMPB S.CON(R4),R3 ; Same RH Controler ?r BNE 20$ ; IF NE, No.e% CMP R5,U.RED(R5) ; UCB Redirected ?M BNE 20$ ; IF NE, Yes./ BIC #M.RWD,U.CW2(R5) ; Any previous RWD ended. ( CLRB S.STS(R4) ; No timeout subcycles."20$: CMPB (SP),1(SP) ; Last UCB ? BEQ 30$ ; IF EQ, Yes. ADD 2(SP),R5 ; R5 > next UCB.($ INCB (SP) ; LO # - Current UCB #.. BR 10$ ; Handle other TU's on same RH/TM78.,30$: ADD #4,SP ; Maintain Stack integrity. POP ; Restore 'em.B RETURN  .PAGE .SBTTL SETUP I/O RETURN CODEe;+; -- RTRNCD --;2+; Convert Interrupt to Request Return Code.R;r ; OUTPUT -; *; R0 - LO BYTE: I/O Request Return Code. ;-7RTRNCD: MOVB INTRPT(R3),R0 ; R0 - Interrupt Code only.e, ADD #RTRNTB,R0 ; > I/O Request Return Code$ MOVB (R0),R0 ; and provide it to BIC #^C<377>,R0 ; Caller.L RETURN # .SBTTL SETUP DATA TRFR PARAMETERS ;+ ; -- SETUP --;: ; INPUT - ;M<; R0 > FTBL, I/O command code R3 - Controller Index (S.CON)"; R2 - CSR. R4 > SCB R5 > UCB;C ; OUTPUT -;R@; Correctly setup DTCNT, DTADR1 and DTADR2 for I/O sequencing.; Registers preserved.B;-6SETUP: MOV U00bba`TADATADATADATADATADATA.CNT(R5),DTCNT(R3) ; Setup I/O byte count.8 MOV U.BUF(R5),DTADR1(R3) ; I/O request code, Hi @ bits,- MOV U.BUF+2(R5),DTADR2(R3) ; and Lo @ bits.o BIT #REV,-2(R0) ; Read REV ? BEQ 20$ ; IF EQ, No. SUB #2,DTCNT(R3) ; Read REV -S1 ADD DTCNT(R3),DTADR2(R3) ; Adjust Buffer pointer  BCC 10$ ; to end of $ ADCB DTADR1+1(R3) ; Buffer Area.010$: ADD #2,DTCNT(R3) ; Restore Transfer count. 20$: RETURNp .PAGE .SBTTL END I/O REQUESTO;+ ; -- ENDRQS--g;e-; End solicited request: DQD or I/O active. T;) ; INPUT -O;t;; R0 - I/O Request Return Code, R1 - 2nd I/O Status Word,b.; R2 - CSR, R3 - RH CNTRL INDX, R5 - > UCB.;-1 .BLKW T$$M78 ; Reserve space - Return Address.Q%ENDRQS: MOV U.SCB(R5),R4 ; R4 > SCB.S-; If Usermode Diagnostic - Pass Device Reg's.e, .IF DF D$$IAG ; If Usermode Diagnostics -0 TSTB INPROG+1(R3) ; Passed DEV REG's already ? BNE 5$ ; IF NE, Yes.R. CALL MFDGNT ; IF UMD, THEN Pass TM78 REG's. 5$: .ENDCg+; If Logged an Error - Endup Error Logging.v, .IF DF E$$DVC ; If Error Logging Device - u-; BITB #SP.EIP,S.PRI(R4) ; Logged an Error ?S BEQ 10$ ; IF EQ, No.R. MOV RTTBL(R3),R2 ; Setup Error Retry Counts,- MOV ERRPKT(R3),R3 ; > Error Log Packet and 6 CALL $FNERL ; Endup Err Logging for this request. 10$: .ENDC ; End Request.1 BICB #US.ABO,U.STS(R5) ; Clear Abort indication.D CALL $IODON ; End Request. & MOV U.SCB(R5),R4 ; Restore R4, >SCB./ MOVB S.CON(R4),R3 ; R3, RH CNTL INDX.n% MOV S.CSR(R4),R2 ; R2, CSR.  D! TST DTCMD(R3) ; Data transfer ?u BNE 20$ ; IF NE, Yes.* MOV RSTATN(R3),MFAS(R2) ; Reset TM ATTN.20$: CLR DTCMD(R3) ; Cleart" CLR INPROG(R3) ; Driver Request+ CLR XNSCMD(R3) ; Processing indicators.E RTRN ENDRQS .PAGE7 .SBTTL PASS DEV REG'S TO USER MODE DIAGNOSTIC REQUEST B;+; -- MFDGNT --; 2; Determine if User Mode Diagnostic Function Call.; +; If so - Then pass TM78 device registers.V;. ; INPUTS - ; R2 - CSR ; R4 - > SCB.;V ; OUTPUTS - ; Reg(s) preserved.; CC - Not User Mode Diagnostic Function CallF; CS - User Mode Diagnostic Function Call. TM78 device reg(s) passed.;-1MFDGNT: MOV R1,-(SP) ; Save R1. $CRPAS mungs it.C- MOV S.PKT(R4),R1 ; R1 > current I/O packet.R> BITB #IQ.UMD,I.FCN(R1) ; User Mode Diagnostic Function Call? BEQ 20$ ; IF EQ, No.N2 MOVB S.RCNT(R4),-(SP) ; Pass TM78 Device Reg(s)-? MOVB #TMREGS,S.RCNT(R4) ; MFBAE, MFCS3, XND SNS not included. # MOV R1,-(SP) ; Save > I/O packet..6 CMPB #IO.EOF/256.,I.FCN+1(R1) ; QIO Control Code #6 ? BEQ 10$ ; IF EQ, Yes.6 CMPB #IO.RWD/256.,I.FCN+1(R1) ; QIO Control Code #5 ? BEQ 10$ ; IF EQ, Yes.2 CALL $CRPAS ; Pass device reg(s) - Other QIO's. MOV (SP)+,R1 ; Maintain Stack. BR 15$a510$: MOV I.PRM+14(R1),I.PRM+16(R1) ; Setup I/O packet - MOV I.PRM+12(R1),I.PRM+14(R1) ; for $CRPAS. $ CALL $CRPAS ; Pass device reg(s).1 MOV (SP)+,R1 ; Maintain Stack. R1 > I/O packet.N4 MOV I.PRM+14(R1),I.PRM+12(R1) ; Re-setup I/O packet/ MOV I.PRM+16(R1),I.PRM+14(R1) ; after $CRPAS.l@15$: MOVB (SP)+,S.RCNT(R4) ; Restore # REG(s) passed to ERR LOG.- SEC ; User Mode Diagnostic Function Call. 18$: MOV (SP)+,R1 ; Restore R1. RETURN .20$: CLC ; No User Mode Diag Function Call. BR 18$0 .ENDP+14(R1),I.PRM+16(R1) ; Setup I/O packet - MOV I.PRM+12(R1),I.PRM+14(R1) ; for $CRPAS. $ CALL $CRPAS ; Pass device reg(s).1 MOV (SP)+,R1 ; Maintain Stack. R1 > I/O packet.N4 MOV I.PRM+14(R1),I.PRM+12(R1) ; Re-setup I/O packet/ MOV I.PRM+16(R1),I. .TITLE RDDRV .IDENT /3.1/Q; C; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.S; ALL RIGHTS RESERVED.;#<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;M; MODIFIED BY:; ; B. S. MCCARTHY 3-OCT-82 3.1I;3; BM258 -- CORRECT DRIVER TO USE $CKBFB FOR BUFFER ; CHECKING DUE TO P.IOCC;R ; RECONFIGURATION CONTROL DRIVER;I;+C; THE RECONFIGURATION CONTROL DRIVER PROVIDES THE INTERFACE BE00b!b_c_d_kTWEENID; USER COMMAND LEVEL TASKS WHICH GENERATE REQUESTS TO PERFORM SYSTEMG; RECONFIGURATION FUNCTIONS AND TO RETURN SYSTEM STATUS INDICATIONS ANDR-; A PRIVILEDGED RECONFIGURATION CONTROL TASK.E; THIS DRIVER ACCESS AND ADDRESS CHECKS QIO REQUESTS FROM THE COMMANDOD; TASKS, ENQUEUES THEM INTO THE RECIEVE QUEUE OF THE RECONFIGURATION$; TASK, AND INITIATES ITS EXECUTION.B; EXCEPT IN THE CASE OF ACCESS ERRORS, I/O COMPLETION IS PERFORMED'; DIRECTLY BY THE RECONFIGURATION TASK.P;-;H; LOCAL MACRO DEFINITIONSR;M;D .MCALL OLRDF$,UCBDF$R3 OLRDF$ ; DEFINE ONLINE RECONFIGURATION INTERFACEC UCBDF$ ; DEFINE UCB OFFSETS;I; DEFINE LOCAL VARIABLES; 1 U.LIST=U.CNT+2 ; LISTHEAD FOR PACKET EXTENSION A;D; DRIVER DISPATCH TABLEF; / DDT$ RD,1,NONE ; DEFINE DRIVER DISPATCH TABLEV;+8; **-RDINI-RECONFIGURATION DRIVER INITIATIOR ENTRY POINT;.; B; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE EACH TIME AD; RECONFIGURATION COMMAND TASK ISSUES A QIO TO A LUN ASSIGNED TO THED; RD0: UNIT. THE COMMAND TASK SUPPLIES ONE OR TWO BUFFER ADDRESS ANDB; SIZE DESCRIPTORS AND A FUNCTION CODE. THE QIO DIRECTIVE CODE HASF; VALIDATED THE FIRST BUFFER AND PLACED THE TWO-WORD BUFFER DESCRIPTORE; AT OFFSETS I.BUF+0 AND I.BUF+2 IN THE PACKET. THIS DRIVER IS CALLEDRE; DIRECTLY FROM THE DIRECTIVE SERVICE CODE TO VALIDATE THE ADDITIONALRD; PARAMETERS. THE PACKET IS THEN QUEUED TO THE SCB I/O REQUEST QUEUED; FOR THE UNIT AND A CALL MADE TO $GTPKT TO DEQUEUE THE NEXT REQUEST; IN THAT QUEUE.; ; INPUTS:T; R1= ADDRESS OF I/O PACKETO; R4= ADDRESS OF SCB; R5= ADDRESS OF UCB;D%; THE PACKET IS FORMATTED AS FOLLOWS:E;S; I.LNK: I/O QUEUE THREAD WORD; I.PRI: REQUEST PRIORITYE; I.EFN: EVENT FLAG NUMBER); I.TCB: ADDRESS OF TCB OF REQUESTOR TASKE9; I.LN2: ADDRESS OF LUN2 WORD IN HEADER OF REQUESTOR TASK ; I.UCB: ADDRESS OF UCB; I.FCN: I/O FUNCTION CODE-; I.IOSB: VIRTUAL ADDRESS OF I/O STATUS BLOCK -; +2: RELOCATION BIAS OF I/O STATUS BLOCKH=; +4: DISPLACEMENT OF I/O STATUS BLOCK (RELATIVE TO APR6) .; I.AST: VIRTUA ADDRESS OF AST SERVICE ROUTINE,; I.PRM: RELOCATION BIAS OF FIRST I/O BUFFER<; +2: DISPLACEMENT TO FIRST I/O BUFFER (RELATIVE TO APR6)*; +4: SIZE IN BYTES OF FIRST I/O BUFFER; +6: ; +10:R; +12:; +14:; +16:;O-; I/O FUNCTION CODES SERVICED BY THIS DRIVER:C;AA; IO.MFC = 0,1 MULTIPLE FUNCTIONS AND I/O PARAMETERS ARE SUPPLIEDS; IN THE USERS BUFFER (; IO.RSC = 0,2 READ SYSTEM CONFIGURATION; IO.ATT = 0,3 ATTACH TO UNIT/ ; IO.DET = 0,4 DEATACH FROM UNIT); IO.WSC = N,6 WRITE SYSTEM CONFIGURATIONU; 'N' IS A FUNCTION CODE.S; ;-RDINI:$ MOV R1,R3 ; COPY ADDRESS OF PACKET+ ADD #I.FCN,R1 ; AND POINT TO FUNCTION CODEB! CMPB #IO.ATT/400,1(R1) ; ATTACH?  BEQ 95$ ; YES, GO ENQUEUE1- CMPB #IO.DET/400,1(R1) ; HOW ABOUT A DETACH? BEQ 95$ ; YES, SAME OPERATION.9 CMP #IO.RSC,(R1) ; IS THIS A 'READ FULL CONFIGURATION'? - BEQ 95$ ; YES, THEN JUST GO ENQUEUE REQUESTM2 CMP #IO.HRC,(R1) ; IS THIS A MODE-CHANGE COMMAND? BEQ 140$ ; BR IF YES9 MOV #IE.RSU&377,R0 ; ASSUME THIS CALLER IS NOT ATTACHED.A3 ; FOR THE REMAINDER OF THE FUNCTIONS THE CALLERY, ; MUST BE ATTACHED BEFORE THE REQUEST IS( ; ENQUEUED. THIS SERVES TO GUARENTEE ; CONTINUTITY OF ACCESS,2 ; IF MORE THAN ONE REQUESTOR IS SIMULTANIOUSLY/ ; ATTEMPTING TO ADDRESS THE RECONFIGURATION# ; TASK.;8 CMP I.TCB(R3),U.ATT(R5) ; IS THIS CALLER ATTATCHED YET?& BNE 125$ ; GO ISSUE I/O ERROR RETURN20$:# MOV R3,-(SP) ; SAVE PACKET ADDRESSQ MOV R3,-(SP) ; TWICE.B MOV R3,U.BUF+2(R5) ; SETUP FOR CALL TO $GETWRD, POINT INTO PACKET< ADD #I.PRM,U.BUF+2(R5) ; POINT TO FIRST PARAMETER IN PACKET;F?; COME HERE IF THIS IS EITHER A 'WRITE DEVICE CONFIGURATION' OR ; 'MULTIPLE FUNCTION',; 30$:< MOV #14,U.CNT(R5) ; COUNT OF REMAINING BYTES IN THE PACKET., CMP #IO.MFC,I.FCN(R3) ; MULTI-FUNCTION QIO? BNE 40$ ; BR IF NOTI;SB; CHANGE INPUT BUFFER DESCRIPTOR TO REFERENCE USER SUPPLIED BUFFER;+ ADD #I.PRM+0,00bba`TADATADATADATADATADATAR3 ; POINT TO FIRST PARAMETER(/ MOV (R3)+,U.BUF+0(R5) ; SET ADDRESS FOR $GTWRDA= MOV (R3)+,U.BUF+2(R5) ; REFERENCING THE USERS MULTI-FUNCTIONN MOV (R3),U.CNT(R5) ; BUFFER.40$:/ ; AT THIS POINT U.BUF/U.CNT REFER TO EITHERG, ; THE REMAINDER OF THE PARAMETERS IN THE. ; PACKET ITSELF (FOR A IO.WSC FUNCTION) OR/ ; TO THE USERS SPECIFICATION BUFFER (FOR ANI ; IO.MFC FUNCTION)C MOV #IE.BAD&377,R0 ; ASSUME THE CALLER SUPPLIED A TOO-LARGE BUFFERS: CMP U.CW3(R5),U.CNT(R5); CHECK AGAINST MAXIMUM PARAMETERS! BLO 120$ ; BR IF BUFFER TOO BIG;8 CALL NXTNOD ; ALLOCATE THE FIRST PACKET EXTENSION NODE/ ; AND LINK IT TO THE PACKET EXTENSION LIST. # BCS 110$ ; BR IF ALLOCATION ERRORN50$:( MOV (SP),R1 ; GET PACKET ADDRESS AGAIN> BEQ 150$ ; BR IF THIS WAS A ONESHOT QIO (IO.WSC) AND WE HAVE# ; FINISHED PARAMETER PROCESSINGI* MOV I.FCN(R1),R0 ; GET USER FUNCTION CODE) SWAB R0 ; GET FUNCTION CODE TO LOW BYTEE( CMPB #IO.WSC/400,R0 ; SINGLE OPERATION?% BNE 60$ ; NO, BR IF MULTI-OPERATIONA+ CLR (SP) ; FLAG SINGLE OPERATION COMPLETE BR 70$ ;60$: ; PICKUP TRUE FUNCTION CODEO" ; FROM THE USER COMMAND BUFFER= CALL GETWRD ; GET NEXT WORD FROM USER MULTI-FUNCTION BUFFER: BCS 150$ ; BR IF END OF BUFFER# MOV R1,R0 ; POSITION FUNCION CODE ) SWAB R0 ; GET FUNCTION CODE TO LOW BYTEI;D; VALIDATE NEXT FUNCTION CODEF;R70$:B CMPB #IO.WSC/400,R0 ; THIS MUST BE A WRITE CONFIGURATION FUNCTION BNE 100$ ; ILLEGAL FUNCTION  SWAB R0 ; GET SUBFUNCTIONR) CMPB #MAXFC,R0 ; VERIFY CODE IS IN RANGEG" BLO 100$ ; ILLEGAL FUNCTION CODE: CALL PUTWRD ; PUT FUNCTION CODE TO PACKET EXTENSION LIST# BCS 110$ ; BR IF ALLOCATION ERRORT$ CLR R1 ; COUNT REQUIRED PARAMETERS BIC #^C377,R0 ; ISOLATE COMMAND# BEQ 100$ ; BR IF ILLEGAL FUNCTION + MOVB LEGFCN-1(R0),R0 ; PICKUP CONTROL BYTE$ MOV R0,-(SP) ; SAVE FOR SECOND HALF& CALL MOVPAR ; COPY PARAMETERS IF ANY% MOV (SP)+,R0 ; GET CONTROL WORD BACKB" BCS 110$ ; BR IF PARAMETER ERROR& ASH #-4,R0 ; SHIFT TO SECOND QUARTET' CALL MOVDES ; COPY DESCRIPTORS IF ANYI" BCS 110$ ; BR IF PARAMETER ERROR BR 50$ ; GO FOR NEXT COMMAND80$:% MOV #IE.SPC&377,R0 ; PARAMETER ERRORR BR 120$ ; TAKE ERROR EXITE95$:# BR 170$ ; RELAY BRANCH FROM ABOVEA100$:Q+ MOV #IE.IFC&377,R1 ; ILLEGAL FUNCTION CODEN110$:R5 MOV R1,R0 ; CODE WAS SET BY DETECTING ROUTINE ABOVEN120$: TST (SP)+ ; REMOVE FLAG WORD" MOV (SP)+,R3 ; GET PACKET ADDRESS125$:C2 CLR R1 ; RESET SECOND WORD OF I/O STATUS RETURN ' CALL $IOFIN ; AND RETURN ERROR STATUS ;Y9; NOW CLEAR ANY PARTIAL PACKET EXTENSION LIST BUILT ABOVEB;0130$:O MOV R5,R0 ; POINT TO LISTHEADS ADD #U.LIST,R0E CALL $QRMVF ; REMOVE NEXT NODE" BCS 200$ ; BR IF NO MORE IN LIST+ MOV R1,R0 ; SET ADDRESS OF NODE TO RETURN ( MOV #I.LGTH,R1 ; AND SET ALLOCATED SIZE* CALL $DEACB ; RETURN NODE TO SYSTEM POOL BR 130$ ; GO FOR NEXT IN LISTA;D-; PROCESS PRIVILEGED TASK MODE CHANGE REQUESTC;R140$:T1 MOV I.TCB(R3),R2 ; PICK UP REQUESTOR TCB ADDRESS * BIT #T3.PRV,T.ST3(R2) ; IS IT PRIVILEGED?0 BEQ 146$ ; BR IF NO. NON-PRIVILEGED REQUESTORS ; JUST WAKE UP HRC...O; ADD #I.PRM+0-I.FCN,R1 ; ADVANCE POINTER TO FIRST PARAMETERX1 BIC (R1),U.CW2(R5) ; RESET 'MASK' FROM MODE BITS0 COM (R1) ; OBTAIN 'NOT MASK'9 BIC (R1)+,(R1) ; AND ENSURE 'TRUE' BITS DONT CONTAIN ANY . ; OTHER THAN WHAT WERE SPECIFIED IN 'MASK'< BIS (R1),U.CW2(R5) ; AND SET IN NEW BITS INTO MODE CONTROL.146$:R MOV #IS.SUC,R0 ; SET STATUS" CLR R1 ; SET SECOND STATUS VALUE TST $HRCPT ; DOES HRC EXIST? BNE 147$ ; BR IF NOT/ MOV #IE.OFL&377,R0 ; REVISE STATUS ACCORDINGLYK147$:C+ CALL $IOFIN ; AND TERMINATE I/O OPERATIONR, MOV $HRCPT,R0 ; PICK UP TCB ADDRESS FOR HRC2 BEQ 200$ ; IGNORE OPERATION OF HRC NOT INSTALLED. CALLR $EXRQN ; REQUEST HRC TO CHECK NEW MODE; @; THE FINAL COMMAND HAS BEEN TRANSFERRED TO THE PACKET EXTENSION;1150$:51 CLR R0 ; SET A ZERO COMMAND AS A STOPPER IN THER ; PACKET EXTENSION% CALL PUTWRD ; PUT TO EXTENSION L00b!b_c_d_kISTL# BCS 110$ ; BR IF ALLOCATION ERRORB160$:  TST (SP)+ ; REMOVE FLAG3" MOV (SP)+,R3 ; GET PACKET ADDRESS;CE; COPY PACKET EXTENSION LISTHEAD TO THE PACKET AND ENQUEUE THE PACKET ; TO THE SCB QUEUE.C;B170$:;$ MOV R3,R1 ; RESTORE PACKET ADDERSSB MOV U.LIST+0(R5),I.PRM+14(R1) ; COPY EXTENSION LISTHEAD TO PACKET175$:  CLR U.LIST(R5) ;D% MOV R5,U.LIST+2(R5) ; RESET LISTHEAD$ ADD #U.LIST,U.LIST+2(R5) ; TO EMPTY/ MOV U.SCB(R5),R0 ; POINT TO I/O QUEUE LISTHEAD * CALL $QINSP ; AND INSERT PACKET IN QUEUE& ; FALL THROUGH INTO PACKET DEQUEUE;O,; FETCH THE NEXT PACKET FROM THE INPUT QUEUE6; PERFORM ATTACH AND DETACH FUNCTIONS AS A SIDE EFFECT;Q180$:P. BICB #US.BSY,U.STS(R5) ; MARK DRIVER NOT BUSY# MOV U.SCB(R5),R4 ; GET SCB ADDRESSV* CLRB S.STS(R4) ; TO ALLOW ANOTHER DEQUEUEE GTPKT$ RD,1,130$,,T ; GET NEXT PACKET FROM QUEUE OR RETURN TO CALLERS;S; INPUT:; R1= ADDRESS OF NEXT PACKET; R4= ADDRESS OF SCB; R5= ADDRESS OF UCB;L; PACKET FORMAT:;P ; AS ABOVE.T;C3 MOV $HRCPT,R0 ; GET ADDRESS OF HRC PROCESSING TASK) BNE 190$ ; BR IF SERVICE TASK AVAILABLEQ& MOV #IE.OFL&377,R0 ; 'DEVICE' OFFLINE MOV R1,R3 ; SET UP FOR $IOFINP0 MOV I.PRM+14(R1),R2 ; GET ADDRESS OF FIRST NODE( BEQ 187$ ; NO LIST, GO TAKE ERROR EXIT% MOV R2,U.LIST+0(R5) ; BUILD LISTHEAD185$:T( MOV R2,U.LIST+2(R5) ; LAST NODE POINTER' MOV (R2),R2 ; LOOK FOR REAL LAST NODE  BNE 185$ ; NOT YET187$: , CALL 125$ ; DO I/O DONE ON THIS PACKET AND# ; ELIMENATE ANY PARAMETER LISTSC( BR 180$ ; GO RESET DEVICE NOT BUSY AND ; CHECK FOR ANOTHER PACKET190$:I: CALL $EXRQP ; ENQUEUE TO HRC AND ACTIVATE IF NOT ALREADY BR 180$ ; GO FOR NEXT PACKET;P+; POWERFAIL AND TIMEOUT DRIVER ENTRY POINTSQ;7200$:IRDPWF:RDOUT:RDCAN: RETURNI;R; UTILITY ROUTINES;8;B; COPY PARAMETERS OR BUFFER DESCRIPTORS TO EXTENSION AS INDICATED ; IN THE CONTROL BYTE.;;MOVPAR:8$ BIC #^C17,R0 ; ISOLATE CONTROL BITS BEQ 15$ ; BR IF DONE" MOV R0,R2 ; COPY PARAMETER COUNT10$:. CALL GETWRD ; GET NEXT WORD FROM USER BUFFER$ BCS 15$ ; BR IF NO MORE PARAMETERS MOV R1,R0 ; COPY FOR PUT. CALL PUTWRD ; PUT IT TO THE PACKET EXTENSION' BCS 15$ ; BR IF NODE ALLOCATION ERRORT& SOB R2,10$ ; LOOP FOR ALL PARAMETERS15$: RETURNTMOVDES:, BIC #^C17,R0 ; ISOLATE COUNT OF DESCRIPTORS BEQ 35$ ; BR IF NONE TO MOVE MOV R5,-(SP) ; SAVE A REGISTERR MOV R0,-(SP) ; SAVE THE COUNT10$:; CALL GETBUF ; GET NEXT BUFFER DESCRIPTOR FROM USER BUFFER 1 BCS 28$ ; BRANCH IF INPUT EXHAUSTED PREMATURELYE MOV R0,-(SP) ; SAVE BUFFER SIZE2 MOV R1,R0 ; SET BUFFER RELOCATION ADDRESS (APR6) CALL PUTWRD ; PUT TO EXTENSION" BCS 25$ ; BR IF ALLOCATION ERROR# MOV R2,R0 ; PUT RELOCATION OFFSET 2 CALL PUTWRD ; AND PUT IT TO THE PACKET EXTENSION" BCS 25$ ; BR IF ALLOCATION ERROR! MOV (SP),R0 ; SET BUFFER LENGTHE2 CALL PUTWRD ; AND PUT IT TO THE PACKET EXTENSION25$:4 INC (SP)+ ; CLEAR STACK WITHOUT CHANGING CARRY BIT BCS 30$ ; EXIT IF ERRORE% DEC (SP) ; DEC COUNT OF DESCRIPTORSE BNE 10$ ; LOOP28$: INC (SP)+ ; CLEAN THE STACKR30$:" MOV (SP)+,R5 ; RESTORE A REGISTER35$: RETURN ; ;EC; GET A BUFFER DESCRIPTOR FROM THE USER, ADDRESS CHECK AND RELOCATEA; TO AN APR6 BASE PLUS OFFSET.;UGETBUF: - CALL GETWRD ; GET VIRTUAL ADDRESS OF BUFFERE BCS 50$ ; BR IF NO MOREU MOV R1,R0 ; SET ADDRESS  CALL GETWRD ; GET SIZE WORDN BCS 50$ ; BR IF NO MOREL$ MOV R1,-(SP) ; SAVE SIZE FOR RETURN BNE 5$ ; BR IF REAL DESCRIPTOR' CLR R2 ; INDICATE NO BUFFER AVAILABLE$ BR 40$ ; COMPLETE SCAN5$:L) CALL $CKBFB ; CHECK AND LOCK THE BUFFERR7 BCS 40$ ; AND EXIT IF THERE IS A BUFFER MAPPING ERRORD+ CALL $RELOC ; AND RELOCATE TO APR6 OFFSETL40$:" MOV (SP)+,R0 ; RETURN BUFFER SIZE50$: RETURNC;W1; GET NEXT WORD FROM USER INPUT BUFFER OR PACKET.R; GETWRD:M( MOV #IE.BAD&377,R1 ; ASSUME FETCH ERROR* SUB #2,U.CNT(R5) ; ACCOUNT FOR WORD TAKEN BCS 10$ ; BR IF NO MOREO9 CALL $GTWRD ; USER SYSTEM ROUTIN00bba`TADATADATADATADATADATAE TO ADDRESS THE BUFFERC MOV (SP)+,R1 ; LOAD VALUE CLC ; ENSURE CARRY CLEAR10$: RETURN ; #; PUT WORD TO PACKET EXTENSION LIST ;T; INPUT:; R0=WORD TO PUT); R3=BYTECOUNT OF SPACE REMAINING IN NODEP; R4=NODE FILL POINTER;+PUTWRD:N' SUB #2,(R3) ; ACCOUNT FOR SPACE TAKENE$ BGE 20$ ; BR IF SPACE IS AVAILABLE! ADD #2,(R3) ; CORRECT UNDERFLOWD5 CALL NXTNOD ; ALLOCATE NEXT NODE AND LINK IT TO THEN ; EXTENSION LIST BCC PUTWRD ; TRY AGAIN BR 30$ ; ALLOCATE ERRORO20$: MOV R0,(R4)+ ; PUT WORD TO NODE30$: RETURNE;CH; ALLOCATE ANOTHER NODE FOR THE PACKET EXTENSION LIST AND LINK IT TO THE; LISTHEAD AT U.LIST+0,+2 ;WNXTNOD: JSR R2,$SAVVR ; SAVE R0,R1,R2, MOV #I.LGTH,R1 ; SET SIZE OF EXTENSION NODE MOV R1,R3 ; SET FILL COUNT CALL $ALOCB ; ALLOCATE NODER BCS 10$ ; BR IF ALLOCATE ERROR MOV R0,R4 ; SET FILL POINTER MOV R0,R1 ; AND NODE ADDRESS" MOV R5,R0 ; SET LISTHEAD ADDRESS ADD #U.LIST,R0 ;; CLR (R4)+ ; ZERO LINKWORD % MOV R3,(R4) ; SET 'SPACE REMAINING'T/ MOV R4,R3 ; COPY POINTER TO 'SPACE REMAINING'N3 SUB #4,(R4)+ ; ADJUST TO ACTUAL SPACE AND POINT TO ; FIRST FILL LOCATION$ MOV R3,-(SP) ; AGAINST MODIFICATION4 CALL $QINSF ; INSERT NODE AT END OF EXTENSION LIST! MOV (SP)+,R3 ; RESTORE REGISTERSA RETURNL10$:& MOV #IE.NOD&377,R1 ; ALLOCATION ERROR RETURN,;E0; SPECIFICATION OF LEGAL FUNCTIONS AND ARGUMENTS;R .MACRO CMD NAME $$$TMP=.A .=LEGFCN+-1 .BYTE IO$'NAME&377 .IIF GT .-$$$TMP $$$TMP=. .=$$$TMP $$$CNT=$$$CNT+1 .ENDM $$$CNT=0MLEGFCN:* CMD ONL ; ONLINE, TWO BUFFER DESCRIPTORS+ CMD OFL ; OFFLINE, TWO BUFFER DESCRIPTORS,/ CMD MAI ; MAINTENANCE, TWO BUFFER DESCRIPTORSN CMD ONE ; ON CONDITION CMD IF ; IF CONDITION ( CMD CAC ; CACHE CONTROL, ONE PARAMETER6 CMD MEM ; MIND CONTROL, ONE DESCRIPTOR,ONE PARAMETER- CMD HRC ; CONTROL - SET HRC OPERATING MODES# CMD STN ; SET TASK NAME TWO WORDS. CMD STA ; RETURN DEVICE STATUS! CMD RLI ; LINK, TWO DESCRIPTORST" CMD RUL ; UNLINK, ONE DESCRIPTOR= CMD MBO ; MEMORY BOX ONLINE, 2 PARAMETERS AND 4 DESCRIPTORSD CMD MBF ; MEMORY BOX OFFLINE# CMD RSW ; SWITCH, TWO DESCRIPTORS * CMD WAT ; WRITE ATTRIBUTES, 1 DESCRIPTOR) CMD RAT ; READ ATTRIBUTES, 1 DESCRIPTOR > ASSUME $$$CNT,<<.-LEGFCN>> ; ENSURE NO COMMANDS WERE LEFT OUT MAXFC=.-LEGFCNO .ENDR- CMD HRC ; CONTROL - SET HRC OPERATING MODES# CMD STN ; SET TASK NAME TWO WORDS. CMD STA ; RETURN DEVICE STATUS! CMD RLI ; LINK, .TITLE DRCMTT .IDENT /5.1/N K;N6; COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;M<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;I; MODIFIED FOR VERSION 2.1 BY:;C; J. R. KAUFFMAN 17-OCT-82 5.1N;W/; JRK263 -- MOVE MORE CODE TO DIRECTIVE COMMOND;C; 3; CANCEL MARK TIME AND SCHEDULE REQUESTS DIRECTIVESA;N; MACRO LIBRARY CALLSA;  .MCALL CLKDF$3 CLKDF$ ;DEFINE CLOCK QUEUE CONTROL BLOCK OFFSETSN;+%; **-$DRCMT-CANCEL MARK TIME REQUESTSI3; **-$DRCMS-CANCEL SELECTIVE MARK TIME REQUESTS S;FF; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CANCEL ALL MARK TIME REQUESTSG; (DPB SIZE=1) OR ALL REQUESTS WITH MATCHING EVENT FLAG OR AST ADDRESS 1; (DPB SIZE=3). N ; ; DPB FORMAT.K; ,; WD. 00 -- DIC(27.),DPB SIZE(1. OR 3.). $; WD. 01 -- MATCHING EFN NUMBER %; WD. 02 -- MATCHING AST ADDRESS A ; ; INPUTS:D;9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF WD. 00 + 2. 2; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; ;; NOTE: $DRCMT IS ALSO CALLED FROM THE EXIT DIRECTIVE AND S/; ONLY REQUIRES R5 TO BE LOADED ON ENTRANCE. D;S5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ;-$; C=0 WITH A DIRECTIVE STATUS OF +1.;- .ENABL LSBE%$DRCMS::CMPB -(R3),#1 ;DPB SIZE=1 T/ BEQ $DRCMT ;IF EQ YES, CANCEL ALL MARK TIMES A CMPB (R3)00bb_c_d_k+,#3 ;DPB SIZE=3 & BNE 5$ ;IF NE NO, INVALID DPB SIZE ' MOV (R3)+,R1 ;PICK UP SPECIFIED EFN R. MOV (R3),R2 ;PICK UP SPECIFIED AST ADDRESS  CLR R4 ;SET MARK TIME CODE E, CALLR $CLRSM ;CANCEL SELECTED MARK TIMES .$DRCMT::CLR R4 ;SET TYPE OF REQUEST TO REMOVE, CALLR $CLRMV ;REMOVE ALL REMAINING ENTRIES&5$: DRSTS D.RS99 ;INVALID DPB SIZE  .ENDIVE STATUS OF +1.;- .ENABL LSBE%$DRCMS::CMPB -(R3),#1 ;DPB SIZE=1 T/ BEQ $DRCMT ;IF EQ YES, CANCEL ALL MARK TIMES A CMPB (R3) .TITLE DRRESR .IDENT /07.01/R;RC; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.I; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;C); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ;C ; M. S. FOX ; J. M. LAWLER; T. M. MARTIN; B. S. MCCARTHY;); MODIFIED BY:;L; J. R. KAUFFMAN 7-MAR-83 7.1G;A6; JRK277 -- CORRECT STACK DEPTH FOR ACP QUEUE REORDER;P; MACRO LIBRARY CALLS ;E# .MCALL HDRDF$,PKTDF$,PCBDF$,TCBDF$c% HDRDF$ ;DEFINE TASK HEADER OFFSETST$ PKTDF$ ;DEFINE I/O PACKET OFFSETS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSA, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS ;+ ; **-$DRUNS-UNSTOP TASK ; H; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO UNSTOP A TASK THAT HAS STOPPED ?; ITSELF VIA A STOP DIRECTIVE OR A RECEIVE OR STOP DIRECTIVE. ; ; DPB FORMAT: K ; '; WD. 00 -- DIC(133.),DPB SIZE(3.). L(; WD. 01 -- FIRST HALF OF TASK NAME. ); WD. 02 -- SECOND HALF OF TASK NAME. T ; ; INPUTS: O ; 6; R0=ADDRESS OF THE TCB OF THE TASK TO BE UNSTOPPED. B; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO BE UNSTOPPED. ;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. S.; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. 2; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. /; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; 8; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; 0; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ); DIRECTIVE STATUS OF +1 IS RETURNED. $; C=1 IF DIRECTIVE IS REJECTED. ;; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF THE SPECIFIEDH; TASK IS NOT ACTIVE. 2;; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THE SPECIFIED3.; TASK IS NOT STOPPED, OR STOPPED FOR EVENT ; FLAG(S) OR BUFFERED I/O. R ;-  .ENABL LSB -$DRUNS::TST (R1)+ ;SPECIFIED TASK ACTIVE? T BMI 20$ ;IF MI NO D. BIT #T2.SEF,(R1) ;TASK STOPPED FOR EVENT FLAG BNE 30$ ;IF NE YES$ MOV #T2.STP,R2 ;PICK UP STOP BIT ' BR 5$ ;JOIN COMMON CODE WITH RESUME D ;+!; **-$DRRES-RESUME TASK EXECUTIONI;HL; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO RESUME THE EXECUTION OF A TASK THAT!; HAS ISSUED A SUSPEND DIRECTIVE.K; ; DPB FORMAT: ;P"; WD. 00 -- DIC(47.),DPB SIZE(3.).$; WD. 01 -- FIRST HALF OF TASK NAME.%; WD. 02 -- SECOND HALF OF TASK NAME. ;P ; INPUTS:K;T2; R0=ADDRESS OF THE TCB OF THE TASK TO BE RESUMED.?; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO BE RESUMED.P9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.S+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.S/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.S,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;A5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK);D-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.S&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.S:; DIRECTIVE STATUS OF 'D.RS7 IS RETURNED IF THE SPECIFIED; TASK IS NOT ACTIVE.S;; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THE SPECIFIEDA; TASK IS NOT SUSPENDED.;-$$DRRES::TST (R1)+ ;TASK ACTIVE?  BMI 20$ ;IF MI NOE MOV #T2.SPN,R2 ;GET SUSPEND BIT-5$: BIT R2,(R1) ;TASK CURRENTLY SUSPENDED? S BNE 10$ ;IF NE YES  TST (R1) ;AST IN PROGRESS? BPL 30$ ;IF PL NOD! ASL R2 ;SET PRE AST SUSPEND BITS" BIT R2,(R1) ;WAS TASK SUSPENDED? BEQ 30$ ;IF EQ NOI610$: CMPB $DICSV,#133. ;IS THIS AN00bba`TADATADATADATADATADATA UNSTOP DIRECTIVE?  BEQ 15$ ;IF EQ YES ) BIC R2,(R1) ;CLEAR TASK'S SUSPEND BIT F3 CALLR $SETCR ;SET A CONDITIONAL SCHEDULE REQUEST O,15$: CALLR $EXRQN ;UNSTOP SPECIFIED TASK '20$: DRSTS D.RS7 ;SET DIRECTIVE STATUS2'30$: DRSTS D.RS8 ;SET DIRECTIVE STATUS ;+ Y; **-$DRSTP-STOP TASK ; A; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO STOP THE ISSUING TASK. R ; ; DPB FORMAT: W ; '; WD. 00 -- DIC(131.),DPB SIZE(1.). D ; ; INPUTS: I ; A; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK. F.; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. 2; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. /; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. D ; 8; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; -; C=0 IF DIRECTIVE SUCCESSFULLY COMPLETED. E.; DIRECTIVE STATUS OF 'D.RS22' IS RETURNED. $; C=1 IF DIRECTIVE IS REJECTED. ;; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE ISSUING ; TASK IS AT AST STATE. O ;- T 2$DRSTP::TST (R2) ;IS ISSUING TASK AT AST STATE?  BMI 35$ ;IF MI YES # CALL $STPCT ;STOP ISSUING TASK N) DRSTS D.RS22 ;RETURN SUCCESS WITH +2 C235$: DRSTS D.RS80 ;ISSUING TASK IS AT AST STATE ;+; **-$DRSPN-SUSPEND EXECUTION;=M; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SUSPEND THE EXECUTION OF THE ISSUINGR; TASK. ; ; DPB FORMAT:E; "; WD. 00 -- DIC(45.),DPB SIZE(1.).;' ; INPUTS:R;R9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. +; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.U/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)S;N*; C=0 WITH A DIRECTIVE STATUS OF 'D.RS22'.;-.$DRSPN::BIS #T2.SPN,(R2) ;SUSPEND CURRENT TASK1 CALL $SETRT ;FORCE A REDISPATCHING OF PROCESSORS$ DRSTS D.RS22 ;SET DIRECTIVE STATUS;+; **-$DRATP-ALTER TASK PRIORITY;A; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CHANGE THE TASK PRIORITY ; OF THE SPECIFIED TASK.;A ; DPB FORMAT:D;2 ; WD. 00 -- DIC(9.),DPB SIZE(4.)$; WD. 01 -- FIRST HALF OF TASK NAME.%; WD. 02 -- SECOND HALF OF TASK NAME.T; WD. 03 -- NEW PRIORITY. ;U ; INPUTS:K;2; R0=ADDRESS OF THE TCB OF THE TASK TO BE ALTERED.?; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO BE ALTERED.F9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.E); R3=ADDRESS OF THE LAST WORD IN THE DPB.P/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.E,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;D5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ;E-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.D&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.U1; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF THE ; TASK IS NOT ACTIVE. 0; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF A(; NONPRIVILEGED TASK ATTEMPTS TO RAISE(; ITS PRIORITY ITS INSTALLED PRIORITY.0; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF A'; TASK ATTEMPTS TO ALTER THE PRIORITYC+; OF A CHECKPOINTED TASK WITH OUTSTANDINGT; I/O.2; DIRECTIVE STATUS OF 'D.RS95' IS RETURNED IF THE&; NEW PRIORITY SPECIFIED IS INVALID.;A;-$DRATP:: ;REF LABEL D .IF DF M$$MUP0 BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED? BNE 39$ ;IF NE YES$ CMP R0,R5 ;MODIFYING OWN PRIORITY?) BNE 180$ ;IF NE NO, PRIVILEGE VIOLATIONA8 CMPB (R3),T.DPRI(R0) ;RAISING SELF ABOVE INSTALLED PRI? BLOS 39$ ;IF LOS NOF(180$: DRSTS D.RS16 ;PRIVILEGE VIOLATION .IFTF%170$: DRSTS D.RS95 ;ILLEGAL PRIORITYK39$: ;REF LABEL .ENDC0 MOV R0,R5 ;SAVE TCB ADDR OF TASK TO BE ALTERED TST (R1) ;TASK ACTIVE? BMI 20$ ;IF MI NOD+ MOV (R3),R3 ;GET NEW PRIORITY AND TEST IT" BNE 40$ ;IF NE ONE WAS SPECIFIED) BISB T.DPRI(R5),R3 ;USE DEFAULT PRIORITYR)40$: CMP R3,#250. ;NEW PRIORITY .GT. 250?; BHI 170$ ;IF HI YESL! MOVB R3,-(SP) ;SAVE NEW PRIORITYI TSTB T.IOC(R5) ;ANY I/O ACTIVE? BEQ 100$ ;IF EQ NO1 MOV T.PCB(R5),R1 ;GET PCB A00bb_c_d_kDDRESS OF TARGET TASK9 BIT #PS.OUT!PS.CKP,P.STAT(R1) ;TASK REGION CHECKPOINTED?B* BNE 190$ ;IF NE YES, RETURN IE.RSU ERROR( CLR -(SP) ;PUSH INITIAL LUN NUMBER - 1 .IF DF X$$HDR050$: MOV T.PCB(R5),R1 ;GET ADDRESS OF TASK'S PCB" MOV P.HDR(R1),R4 ;GET HEADER ADDR+ BNE 60$ ;IF NE, RESIDENT HEADER (IN POOL)R1 MOV P.REL(R1),KISAR6 ;OTHERWISE, MAP TASK HEADER1 MOV #140000,R4 ;GET HEADER ADDR60$: ;REFERENCE LABEL .IFF5/50$: MOV T.PCB(R5),R1 ;GET ADDRES OF TASK'S PCBB* MOV P.HDR(R1),R4 ;GET TASK HEADER ADDRESS .ENDC$ CMP (SP),H.NLUN(R4) ;PAST LAST LUN? BHIS 90$ ;IF HIS YES MOV (SP),R1 ;GET LUN -1% CALL $MPLNE ;MAP LUN TO UCB ADDRESS1$ BCS 80$ ;IF CS LUN IS NOT ASSIGNED" MOV R0,-(SP) ;SAVE UCB ADDRESS 0 MOV U.SCB(R0),R4 ;GET PTR TO SCB FOR THIS UCB  CALL 130$ ;REORDER I/O QUEUE# MOV (SP),R0 ;RETRIEVE UCB ADDRESS ! TST U.CW1(R0) ;DEVICE MOUNTABLE?H BPL 79$ ;IF PL NOR! BITB #US.MNT,U.STS(R0) ;MOUNTED?T BNE 79$ ;IF NE NOE% MOV U.ACP(R0),R4 ;PICK UP TCB OF ACPT, BEQ 79$ ;IF EQ MOUNTED FOREIGN WITH NO ACP0 ADD #T.RCVL,R4 ;POINT TO RECEIVE QUEUE LISTHEAD CALL 130$ ;REORDER ACP QUEUE.79$: TST (SP)+ ;REMOVE UCB ADDRESS FROM STACK$80$: INC (SP) ;UPDATE LUN NUMBER # BR 50$ ;CONTINUE THROUGH LUN LOOP)*90$: TST (SP)+ ;POP LUN NUMBER FROM STACK 100$: ; .IF DF A$$CNT' BIT #T2.ABO,T.ST2(R5) ;IS TASK ABORTED) BNE 106$ ;IF NE YESB MOV KISAR6,R0 ;SAVE MAPPING+ MOV T.ACN(R5),KISAR6 ;MAP ACCOUNTING BLOCKE BEQ 105$ ;IF EQ NO ACCOUNTINGO+ CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TAB  BNE 105$ ;IF NE NO; CMPB (SP),@#B.PRI+140000 ;IS NEW PRIORITY HIGHER THAN PREVQ BLOS 105$ ;IF LOS NO5 MOVB (SP),@#B.PRI+140000 ;RECORD NEW HIGHER PRIORITYN$105$: MOV R0,KISAR6 ;RESTORE MAPPING 106$: ; .ENDC ;A$$CNT, MOVB (SP)+,T.PRI(R5) ;SET NEW TASK PRIORITY2 MOV R5,R0 ;GET TCB ADDRESS OF TASK TO BE ALTERED" CALL $ACTRM ;REMOVE TCB FROM ATL$ BCS 110$ ;IF CS TCB NOT YET IN ATL# CALL $ACTTK ;RE-INSERT TCB IN ATL;)110$: MOV T.PCB(R5),R1 ;POINT TO TASK PCB+0 TST P.ATT(R1) ;TASK ATTACHED TO OWN REGION YET? BNE 115$ ;IF NE YESI MOV R5,R0 ;COPY TCB POINTERQ) CALL $ALTRG ;ALTER TASK REGION PRIORITYI BR 129$ ;R<115$: MOV T.ATT(R5),R4 ;POINT TO FIRST ENTRY IN ATTACH QUEUE9120$: TSTB A.MPCT-A.TCBL(R4) ;TASK MAPPED TO THIS REGION?T BEQ 125$ ;IF EQ NO MOV R5,R0 ;COPY TCB POINTERA- MOV A.PCB-A.TCBL(R4),R1 ;POINT TO MAPPED PCBM$ CALL $ALTRG ;ALTER REGION PRIORITY7125$: MOV (R4),R4 ;POINT TO NEXT ATTACHMENT DESCRIPTORC BNE 120$ ;IF NE THERE IS ONE.129$: CALLR $DRDSE ;DECLARE SIGNIFICANT EVENT:130$: MOV #-2,-(SP) ;CONSTRUCT TEMPORARY LISTHEAD ON STACK ADD SP,(SP) ;T CLR -(SP) ;R.140$: MOV R4,R0 ;GET I/O PACKET LISTHEAD ADDR/ MOV R5,R1 ;GET TCB ADDR OF TASK TO BE ALTEREDC, CALL $QRMVT ;REMOVE I/O PACKET BY TCB ADDR% BCS 150$ ;IF CS NO I/O PACKET FOUNDC0 CMPB I.PRI(R1),#250. ;PRIORITY HIGHER THAN 250?" BHI 145$ ;IF HI YES, DON'T TOUCH( MOVB 12(SP),I.PRI(R1) ;SET NEW PRIORITY0145$: MOV SP,R0 ;SET TEMPORARY LISTHEAD ADDRESS2 CALL $QINSF ;INSERT I/O PACKET IN TEMPORARY LIST/ BR 140$ ;CONTINUE THROUGH PACKET REMOVAL LOOPS-150$: MOV SP,R0 ;SET TEMPORARY LISTHEAD ADDRR0 CALL $QRMVF ;REMOVE FIRST I/O PACKET FROM LIST% BCS 160$ ;IF CS NO I/O PACKET FOUND ) MOV R4,R0 ;GET I/O PACKET LISTHEAD ADDRB3 CALL $QINSP ;RE-INSERT I/O PACKET BY NEW PRIORITYC1 BR 150$ ;CONTINUE THROUGH PACKET INSERTION LOOPI9160$: CMP (SP)+,(SP)+ ;CLEAN TEMPORARY LISTHEAD OFF STACK RETURN ;(190$: DRSTS D.RS17 ;RETURN IE.RSU ERROR .DSABL LSB  .END PACKET IN TEMPORARY LIST/ BR 140$ ;CONTINUE THROUGH PACKET REMOVAL LOOPS-150$: MOV SP,R0 ;SET TEMPORARY LISTHEAD ADDRR0 CALL $QRMVF ;REMOVE FIRST I/O PACKET FROM LIST% BCS 160$ ;IF CS NO I/O PACKET FOUND ) MOV R4,R0 ;GET I/O PACKET LISTHEAD ADDRB3 CALL $QINSP ;RE-INSERT I/O PACKET BY NEW PRIORITYC1 BR 150$ ;CONTINUE THROUGH PACKET INSERTION LOOPI9160$: CMP (SP)+,(SP)+ ;CLEAN TEMPORARY LISTHEAD OFF STACK RETURN ;(190$: DRSTS D.RS17 ;RET00Qbbb`TADATADATADATADATADATA .TITLE DRSPW  .IDENT /5.00/;G(; COPYRIGHT (C) 1982, 1983, 1984, 1985$; BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; M. S. FOX 21-MAY-81  ; C ; THIS MODULE WAS ORIGINALLY WRITTEN BY T. J. MILLER ON 26-MAY-77S(; AND HAS BEEN PREVIOUSLY MODIFIED BY:;B; R. E. CALDWELL; B. S. MCCARTHY; T. J. MILLER; J. E. PROVINO.; -; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:C;2; J. M. LAWLER; T. M. MARTIN; B. S. MCCARTHY; -; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:S; ; B. S. MCCARTHY; J. W. BERZLE; J. R. KAUFFMAN;O; MODIFIED BY:;F; J. W. BERZLE 17-OCT-85 5.00O;M+; JWB167 -- USE $QRMVA INSTEAD OF $QRMVTW;N!; P. K. M. WEISS 12-JUN-86 5.01 ;A4; PKW111 -- ALLOW A CLI'S RPOI DIRECTIVES TO WORK;G7; THIS MODULE CONTAINS THE DIRECTIVE ROUTINES AND PRIMARY SUBROUTINESD38; WHICH PROVIDE PARENT-OFFSPRING TASKING SUPPORT.A9;:; MACRO LIBRARY CALLSS;;A<=>%? .MCALL DCBDF$,PKTDF$,TCBDF$,UCBDF$.@A .IF DF N$$DIRBC .MCALL LNMDF$D)E LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETSBFG .ENDC ;DF N$$DIREH0I DCBDF$ ;DEFINE DEVICE CONTROL BLOCK SYMBOLS.J PKTDF$ ;DEFINE I/O PACKET AND OCB OFFSETS.K TCBDF$ ;DEFINE TASK CONTROL BLOCK SYMBOLS.L UCBDF$ ;DEFINE UNIT CONTROL BLOCK SYMBOLSMN;+LO; **-$DRSRC- .TITLE DYCOMW .IDENT /1.0/I;K5; COPYRIGHT (C) 1983 BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;.<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; J. L. GALLANT 26-JUN-83;E; THE RX02 DEVICE DRIVER IS USING THIS DATA COMMON AS AN INTERMEDIATEF; BUFFER SO THAT TASKS ABOVE THE 124K MEMORY SPACE CAN STILL DO I/O TOG; THE FLOPPY. THIS DATA COMMON IS NEEDED ONLY ON 22BIT QBUS PROCESSORS.; .PSECT DYCOM,D,GBL,RW;.3; BUFFER IS 1K WORDS, 1K BYTES FOR EACH CONTROLLER.I;N .BLKW 512.  .IF GT R$$X21-1 .BLKW 512.S .ENDC .ENDDNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; J. L. GALLANT 26-JUN-83;E; THE RX02 DEVICE DRIVER IS USING THIS DATA COMMON AS AN INTERMEDIATEF; BUFFER SO THAT TASKS ABOVE THE 124K MEMORY SPACE CAN STILL DO I/O TOG; THE FLOPPY. THIS DATA COMMON IS NEEDED ONLY ON 22BIT QBUS PROCESSORS.; .PSEC .TITLE DRCPCC .IDENT /03.00/0 ;[; COPYRIGHT (C) 1984/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.F;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDO9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.H;S1; ORIGINALLY PART OF DRREG, ADDED BY T. M. MARTIN;TB; SPLIT INTO SEPARATE MODULE BY B. S. MCCARTHY AS PART OF CREATING?; THIRD DIRECTIVE COMMON WITH PLAS DIRECTIVES (BM292) 28-NOV-83;+;$; **-$DRCPC-CHECKPOINT COMMON REGION;3; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CHECKPOINT08; A NAMED STATIC COMMON REGION. THE ISSUING TASK MUST BE;; PRIVILEGED AND ATTACHED TO THE COMMON BUT NOT NECESSARILYR9; MAPPED. ANY TASK WHICH IS MAPPED TO THE COMMON WHICH IS 8; BEING CHECKPOINTED IS BLOCKED UNTIL THE CHECKPOINT HAS ; COMPLETED.;T ; DPB FORMAT:T; %; WD. 00 -- DIC (205.), DPB SIZE (6.)A.; WD. 01 -- FIRST WORD OF RAD50 PARTITION NAME/; WD. 02 -- SECOND WORD OF RAD50 PARTITION NAME&;(soon) WD. 03 -- SPECIFIED EVENT FLAG2;(soon) WD. 04 -- ADDRESS OF I/O STATUS DOUBLEWORD-;(soon) WD. 05 -- ADDRESS OF USER AST ROUTINEU; ; INPUTS:E; ; R3=ADDRESS OF WD. 00 + 2.E.; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; ; OUTPUTS:; ; DIRECTIVE STATUS;P .IF DF, C$$PCRE8$DRCPC::BIT #T3.PRV,T.ST3(R5) ;IS THE ISSUER PRIVILEGED?" BEQ 25$ ;IF EQ NO, RETURN ERROR& MOV T.ATT(R5),R0 ;POINT TO FIRST ADB110$: MOV A.PCB-A.TCBL(R0),R1 ;PICK UP PCB ADDRESSC) CMP P.NAM(R1),(R3) ;IS THIS THE REGI00bb_c_d_kON?  BNE 20$ ;IF NE NO CMP P.NAM+2(R1),2(R3) ;REALLY?U BEQ 30$ ;IF EQ, FOUND ITS 20$: MOV (R0),R0 ;GET NEXT ADB BNE 10$ ;TRY NEXT ATTACHMENT & DRSTS D.RS94 ;RETURN ERROR 'IE.PNS'*25$: DRSTS D.RS16 ;RETURN ERROR 'IE.PRV')26$: DRSTS D.RS8 ;RETURN ERROR 'IE.ITS'"30$: MOV R1,R4 ;SAVE PCB ADDRESS* ADD #P.STAT,R1 ;POINT TO PCB STATUS WORD9 BIT #PS.CKP!PS.CHK,(R1) ;PARTITION NON CHECKPOINTABLE OR:! ;HAS CHECKPOINT IN PROGRESS?C# BNE 26$ ;IF NE YES, RETURN ERRORT$ BIT #PS.COM,(R1)+ ;IS IT A COMMON? BEQ 26$ ;IF EQ NO- BIT #P2.CPC,(R1) ;CPCR ALREADY IN PROGRESS?: BNE 26$ ;IF NE YEST! MOV R4,R1 ;RESTORE PCB ADDRESSN, TST P.DPCB(R1) ;IS REGION A STATIC COMMON? BEQ 26$ ;IF EQ NO1 BIS #P2.CPC,P.ST2(R1) ;INDICATE CPCR IN PROGRESSR2 CALLR $ICHKP ;AND INITIATE CHECKPOINT OF REGION .ENDC ; DF C$$CPR .ENDUS WORD9 BIT #PS.CKP!PS.CHK,(R1) ;PARTITION NON CHECKPOINTABLE OR:! ;HAS CHECKPOINT IN PROGRESS?C# BNE 26$ ;IF NE YES, RETURN ERRORT$ BIT #PS.C .TITLE DRSRFS .IDENT /05.00/$;B7; COPYRIGHT (c) 1984 BY DIGITAL EQUIPMENT CORPORATION.L; ALL RIGHTS RESERVED.;F<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; ORIGINALLY PART OF DRMAP;A; MOVED TO THIS MODULE BY B. S. MCCARTHY 28-NOV-83 TO ALLOW DRMAPA; TO BE INCLUDED IN THE THIRD DIRECTIVE COMMON. SEE NOTE IN DRMAP$; REGARDING PLACEMENT OF DRSRF/DRRRF; .IF DF P$$LAS# .MCALL HDRDF$,PCBDF$,TCBDF$,WDBDF$ 1 HDRDF$ ;DEFINE HEADER AND WINDOW BLOCK OFFSETS 2 PCBDF$ ;DEFINE PCB AND ATTACHMENT DESCR OFFSETS TCBDF$ ;DEFINE TCB OFFSETSF1 WDBDF$ ;DEFINE WINDOW DEFINITION BLOCK OFFSETSE;+; **-$DRSRF-SEND BY REFERENCEF;CE; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE A SPECIALLY FORMATTEDBD; PACKET INCLUDING A REFERENCE TO A SPECIFIED REGION WITH ADDITIONALE; OPTIONAL INFORMATION SUPPLIED BY THE ISSUING TASK. THE SENDER TASKFI; MUST ITSELF HAVE THE ACCESS SPECIFIED IN THE REFERENCE. THE REFERENCEDF+; REGION IS ATTACHED TO THE RECEIVING TASK.;B ; DPB FORMAT:C;N!; WD. 00 -- DIC(69.),DPB SIZE(5.) ,; WD. 01 -- FIRST HALF OF RECEIVER TASK NAME-; WD. 02 -- SECOND HALF OF RECEIVER TASK NAME-:; WD. 03 -- OPTIONAL EVENT FLAG TO SET WHEN RECEIVE OCCURS.; WD. 04 -- ADDRESS OF WINDOW DEFINITION BLOCK;I ; INPUTS:N;T,; R0=ADDRESS OF THE TCB OF THE RECEIVER TASK9; R1=ADDRESS OF THE TASK STATUS WORD OF THE RECEIVER TASKS9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.E*; R3=ADDRESS OF THE EFN NUMBER IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.D,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 2; INPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:/; W.NRID=ID OF REGION TO BE SENT BY REFERENCE.T.; W.NOFF=OFFSET WORD PASSED WITHOUT CHECKING..; W.NLEN=LENGTH WORD PASSED WITHOUT CHECKING.=; W.NSTS=ALLOWED ACCESS (DEFAULTS TO ACCESS OF SENDER TASK).S-; WS.RED=1 IF READ ACCESS IS TO BE ALLOWED..; WS.WRT=1 IF WRITE ACCESS IS TO BE ALLOWED./; WS.EXT=1 IF EXTEND ACCESS IS TO BE ALLOWED. /; WS.DEL=1 IF DELETE ACCESS IS TO BE ALLOWED.A?; W.NSRB=OPTIONAL ADDRESS OF 8 WORD BUFFER OF ADDITIONAL INFO.I;S5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)E;N-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.R&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED..;; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF A SEND PACKET)4; OR ATTACHMENT DESCRIPTOR COULD NOT BE ALLOCATED.;; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF AN ATTEMPT IS ; MADE TO SEND TO AN ACP TASK.;; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE SPECIFIEDP; HAS HAD A PARITY ERROR.E:; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE DESIRED#; ACCESS TO THE REGION IS DENIED.D9; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF AN INVALIDF; REGION ID WAS SPECIFIED.=; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN INVALID EFND; NUMBER IS SPECIFIED.:; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE ADDRESS7; CHECK OF THE WINDOW DEF BLOCK OR S00bbb`TADATADATADATADATADATAEND BUFFER FAILS.E; 3; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:I; NONE.; 0; THE FORMAT OF THE SEND BY REFERENCE PACKET IS:"; WD. 00 -- RECEIVE QUEUE THREAD.5; WD. 01 -- TCB ADDRESS IF EFN SPECIFIED / 0 IF NOT.D7; WD. 02 -- EFN MASK / FIRST WORD OF SENDER TASK NAME.I;; WD. 03 -- EFN ADDRESS / SECOND WORD OF SENDER TASK NAME.S7; WD. 04 -- REGION ID (ATTACHMENT DESCRIPTOR ADDRESS).E#; WD. 05 -- OFFSET IN REGION WORD.S ; WD. 06 -- LENGTH OF MAP WORD.; WD. 07 -- STATUS WORD.R2; WD. 08 THRU WD. 017 -- CONTENTS OF SEND BUFFER.;->$DRSRF::BIT #T3.ACP!T3.NSD,T.ST3(R0) ;SENDS LEGAL TO RECEIVER? BNE 3$ ;IF NE NO- MOV R0,-(SP) ;SAVE RECEIVER TASK TCB ADDRESS 3 CALL $CEFNG ;CONVERT EFN AND LOCK IF GROUP GLOBAL0$ BCS 4$ ;IF CS NO EFN WAS SPECIFIED6 INCB T.SRCT(R5) ;INCREMENT NUMBER OF INCOMPLETE SREFS& MOV R5,-(SP) ;SAVE SENDER TCB ADDRESS MOV R0,-(SP) ;SAVE EFN MASK MOV R1,-(SP) ;SAVE EFN ADDRESSO BR 5$ ; 03$: DRSTS D.RS2 ;ATTEMPT TO SEND TO AN ACP TASK)4$: CLR -(SP) ;INDICATE NO EFN SPECIFIEDS+ MOV T.NAM(R5),-(SP) ;SAVE SENDER TASK NAME3 MOV T.NAM+2(R5),-(SP) ;55$: MOV (R3),R3 ;PICK UP ADDRESS OF WINDOW DEF BLOCK ( MOV #8.*2,R1 ;SET SIZE TO ADDRESS CHECK5 CALL $ACHKP ;ADDRESS CHECK AND MAP WINDOW DEF BLOCK , ADD #W.NRID,R3 ;POINT TO REGION ID IN BLOCK9 CALL $SRATT ;SEARCH FOR SPECIFIED ATTACHMENT DESCRIPTORT6 CMP (R3)+,-(SP) ;BUMP POINTERS FOR REGION ID (W.NRID)+ MOV (R3)+,-(SP) ;SAVE OFFSET WORD (W.NOFF)S+ MOV (R3)+,-(SP) ;SAVE LENGTH WORD (W.NLEN)(+ MOV (R3)+,-(SP) ;SAVE STATUS WORD (W.NSTS)R% BIC #^C17,(SP) ;CLEAR ALL BUT ACCESST BNE 6$ ;IF NE ACCESS SPECIFIED7 MOVB A.STAT(R5),(SP) ;DEFAULT TO ACCESS OF SENDER TASKS=6$: MOVB A.STAT(R5),-(SP) ;PUSH ATTACHMENT DESCRIPTOR ADDRESSW' COMB (SP) ;COMPUTE ACCESS DENIED MASKT< BITB (SP)+,(SP) ;CHECK SPECIFIED ACCESS AGAINST SENDER TASK BNE 70$ ;IF NE ACCESS DENIED/ MOV -2(R3),-(SP) ;SAVE W.NSTS FOR WS.NAT CHECK(# MOV (R3),R3 ;POINT TO SEND BUFFERS BEQ 10$ ;IF EQ THERE IS NONE( MOV #8.*2,R1 ;SET SIZE TO ADDRESS CHECK0 CALL $ACHKP ;ADDRESS CHECK AND MAP SEND BUFFER* ADD #8.*2,R3 ;POINT TO END OF SEND BUFFER)10$: CALL $ALPKT ;ALLOCATE A SEND PACKET  .IF DF R$$DSP4 ADD #20.*2,R0 ;POINT PAST DESTINATION FOR TASK NAME9 MOV $TNAME+2,-(R0) ;STORE SECOND WORD OF MULTI-USER NAME)# MOV $TNAME,-(R0) ;STORE FIRST WORDE/ CMP -(R0),-(R0) ;POINT TO AREA FOR SEND BUFFER3 .IFFS6 ADD #16.*2,R0 ;POINT PAST DESTINATION FOR SEND BUFFER .ENDC% MOV #8.,R1 ;SET LOOP COUNT FOR COPYR MOV R1,R2 ;COPY LOOP COUNT/20$: MOV R3,-(R0) ;WAS A SEND BUFFER SPECIFIED? BEQ 30$ ;IF EQ NOT$ MOV -(R3),(R0) ;ELSE COPY NEXT WORD30$: DEC R2 ;DONE YET?  BGT 20$ ;IF GT NO- MOV (SP)+,R3 ;RESTORE POINTER TO SEND BUFFERS" MOV (SP),R4 ;PICK UP STATUS WORD140$: MOV (SP)+,-(R0) ;INSERT SAVED WORDS ON STACKS DEC R1 ;DONE YET?P BGT 40$ ;IF GT NOO: MOV A.PCB(R5),R2 ;PICK UP PCB ADDRESS FROM ATT DESCRIPTOR& BIT #PS.PER,P.STAT(R2) ;PARITY ERROR? BNE 90$ ;IF NE YES2 MOV (R0),R5 ;PICK UP SAVED RECEIVER TASK ADDRESS3 MOV $PTCPT,KISAR6 ;REMAP TCB IF IT WAS A PROTOTYPEB. BIT #WS.NAT,R3 ;SHOULD ATT DESCR BE CREATED ? BEQ 45$ ;YES IF EQ/ CMP #^R...,T.NAM(R5) ;SEND TO MULTIUSER TASK ?  BNE 41$ ;IF NE NOE; MOV T.RRFL(R5),R3 ;POINT TO FIRST SEND BY REFERENCE PACKET+,400$: BEQ 45$ ;END OF LIST, DIDN'T FIND ADB9 CMP $TNAME,44(R3) ;THIS SREF FOR RIGHT MULTI-USER COPY ?  BNE 410$ ;IF NE NO CMP $TNAME+2,46(R3) ;MAYBES BNE 410$ ;DEFINITELY NOT* MOV 10(R3),R1 ;POINT TO ADB FOR THIS SREF% CMP A.PCB(R1),R2 ;ADB FOR THIS PCB ?I1 BEQ 49$ ;IF EQ YES, WE DON'T NEED TO CREATE ONET-410$: MOV (R3),R3 ;POINT TO NEXT SREF PACKETY BR 400$ ;AND GO AROUND AGAIN641$: MOV T.ATT(R5),R1 ;GET FIRST ATTACHMENT DESCRIPTOR BEQ 45$ ;IF EQ END OF LIST542$: SUB #A.TCBL,R1 ;POINT TO START OF ATT DESCRIPTORD CMP A.PCB(R1),R2 ;MATCH?, BEQ 49$ ;YES IF EQ. MOV A.TCBL(R1),R1 ;GET NEXT ATT DESCR ADDRESS BNE 42$ ;IF NE GO AGAINS.45$: MOV R0,-(SP) ;SAVE ADDRESS OF SEND PACKET- CALL $CRATT 00bb_c_d_k;ATTACH RECEIVER TASK TO REGIONB) MOV (SP)+,R0 ;RETRIEVE ADDRESS OF PACKETD# BCS 80$ ;IF CS ALLOCATION FAILURER) CMP #120000,R5 ;TARGET TCB IN SEC POOL ?$ BHI 49$ ;IF HI NON; BISB #AS.PRO,A.STAT(R1) ;INDICATE A.TCB POINTS TO SEC POOLQ2 MOV $PTCPT,A.TCB(R1) ;INSERT BIAS OF SEC POOL TCB+49$: MOV R1,10(R0) ;SET REGION ID IN PACKETR# MOV R0,R1 ;COPY POINTER TO PACKETV! TST (R0)+ ;POINT TO TCB ADDRESSA TST (R0)+ ;EFN SPECIFIED?G BEQ 50$ ;IF EQ NOP% MOV (R0)+,-(SP) ;GET EVENT FLAG MASKC* MOV (R0),R0 ;GET EVENT FLAG MASK ADDRESS. BIC #1,R0 ;CLR GRP GLOBAL 2ND WORD INDICATOR/ BIC (SP)+,(R0) ;CLEAR SPECIFIED EVENT FLAG NOWR750$: MOV R5,R0 ;POINT TO RECEIVE BY REFERENCE LISTHEADR ADD #T.RRFL,R0 ;A& CALL $QINSF ;INSERT IN RECEIVE QUEUE1 MOV #AS.RRA,R4 ; GET CODE FOR RECEIVE BY REF ASTR/ CALL $DASTT ;DECLARE RECEIVE BY REFERENCE ASTC+ CALLR $DRDSE ;DECLARE A SIGNIFICANT EVENT 160$: DRSTS D.RS2 ;ATTEMPT TO SEND TO AN ACP TASK$'70$: DRSTS D.RS16 ;PRIVILEGE VIOLATION )80$: CALL $DEPKT ;DEALLOCATE SEND PACKETA! DRSTS D.RS1 ;ALLOCATION FAILUREO)90$: CALL $DEPKT ;DEALLOCATE SEND PACKETE DRSTS D.RS6 ;PARITY ERROR .ENDC .ENDT TO RECEIVE BY REFERENCE LISTHEADR ADD #T.RRFL,R0 ;A& CALL $QINSF ;INSERT IN RECEIVE QUEUE1 MOV #AS.RRA,R4 ; GET CODE FOR RECEIVE BY REF ASTR/ CALL $DASTT ;DECLARE RECEIVE BY REFERENCE ASTC+ CALLR $DRDSE ;DECLARE A SIGNIFICANT EVENT 160$: DRSTS D.RS2 ;ATTEMPT TO SEND TO AN ACP TASK$'70$: DRSTS D.RS16 ;PRIVILEGE VIOLATION )80$: CALL $DEP .TITLE DRSUBL .IDENT /03.35/;;H7; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATIONN; ALL RIGHTS RESERVED.;O>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;T ; B. S. MCCARTHY ;)+ ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:L ;E ; M. S. FOX.; J. M. LAWLER; T. LEKASN; B. S. MCCARTHY;C-; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:N;E; J. R. KAUFFMAN; T. LEKAS.; J. M. LAWLER; T. M. MARTIN; B. S. MCCARTHY;7-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:H;S; S. C. ADAMS ; J. W. BERZLE; J. GEMIGNANI, JR.; J. R. KAUFFMAN; B. S. MCCARTHY; L. B. MCCULLEY; D. P. RABAHY;&; MODIFIED FOR RSX-11M-PLUS V4.0 BY:;R"; R. D. HANEY 14-NOV-85 03.25;.3; RDH010 -- SAVE R2 AROUND $DESEC CALL IN $DLCTXS;A; S. C. ADAMS 03.26;17; SA452 -- REMOVE CHECK FOR TERMINAL NAME IN $SNCMD.;E%; P. K. M. WEISS 12-DEC-86 03.27N; $; PKW120 -- ADD CPR STUB ROUTINES;1%; B. S. MCCARTHY 13-DEC-86 03.28C;M.; BM377 -- MOVE DREIF AND DRDSP INTO DIR11M;.!; K. L. NOEL 06-FEB-86 03.29;B3; KLN034 -- ADD $IMASG CALL FOR RUN TIME BINDINGR;M%; P. K. M. WEISS 10-FEB-87 03.304;80; PKW122 -- MAKE ENTRY POINTS NON-CONDITIONAL;C$; B. S. MCCARTHY 5-MAR-87 03.31;02; BM384 -- ADD STUB TO JUMP BACK TO DISPATCHER ; FOR CPR.;E$; B. S. MCCARTHY 5-MAR-87 03.32;/; BM385 -- NOW MOVE DRGIN, DREXP, DRGLI, AND,; DRGCL INTO THE VECTOR COMMON (A 32 BIT); VIRTUAL ADDRESS SPACE WOULD BE NICEM; RIGHT ABOUT NOW!)-;6 ; K. L. NOEL 6-APR-87 03.33;M7; KLN040 -- CHANGE $IMASG CALL TO A JMP FOR IMPLICIT1 ; ALUN 3;%; B. S. MCCARTHY 12-JUN-87 03.34N;I<; BM400 -- FIX MAPPING OF DISPATCHER WHEN $DRGMX DOES ITS ; RETURN;T#; J. W. BERZLE 1-SEP-87 03.35 ;4; JWB220 -- ADD CHECK FOR PSEUDO DEVICE IN $SNCMD;5K;OLM .IF DF S$$HDWNO .MCALL SHDDF$,PKTDF$T,P SHDDF$ ;DEFINE SHADOW RECORDING OFFSETSQR .ENDC ;S$$HDWSTUV .IF DF P$$LASW%X .MCALL HDRDF$,PCBDF$,TCBDF$,WDBDF$3Y HDRDF$ ;DEFINE HEADER AND WINDOW BLOCK OFFSETSI4Z PCBDF$ ;DEFINE PCB AND ATTACHMENT DESCR OFFSETS[ TCBDF$ ;DEFINE TCB OFFSETSI\ WDBDF$ ;DEFINE WDB OFFSETSM]^^ ;PKW120TN^; THE FOLLOWING TABLE OF VALUES MUST BE ID00bbb`TADATADATADATADATADATAENTICAL TO THE ONE AT THE ;PKW120,^; BEGINNING OF THE KX DRIVER. ;PKW120^ ;PKW120 6^ .IF DF C$$RMT ;IF REMOTE SYSTEM SERVICES ;PKW120^ ;PKW120;^ .ASECT ;PKW120D^ ;PKW120L^ .=120000 ;PKW120^ ;PKW120N6^CPRCON: .BLKW 1 ;UNIT CONNECT ENTRY POINT ;PKW120C^CPRALO: .BLKW 1 ;ALLOCATE BUFFER SPACE AND COMMAND RING ;PKW1205^CPRDEA: .BLKW 1 ;DEALLOCATE BUFFER SPACE ;PKW120W1^CPRSEN: .BLKW 1 ;SEND PACKET TO VMS ;PKW120N^ ;PKW120H^ .PSECT ;PKW120F^ ;PKW120;^ .ENDC ;C$$RMT ;PKW120.^ ;PKW120O_ .PAGE`;+'a; **-$DRDSE-DECLARE SIGNIFICANT EVENTSb; Gc; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DECLARE A SIGNIFICANT EVENT. d;Pe; DPB FORMAT: f; $g; WD. 00 -- DIC(35.),DPB SIZE(1.).h;P i; INPUTS: j;O;k; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. -l; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.N1m; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. .n; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.o; 7p; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)Pq;O&r; C=0 WITH A DIRECTIVE STATUS OF +1.s;F4t; NOTE: THIS DIRECTIVE IS ALSO CALLED A SUBROUTINEu;-vwxy .IF NDF M$$PRO z;{$DRDSE::MOV $ACTHD,@$RQSCH ;SET DISPATCH TO FRONT OF LIST.|} .IFF ~$DRDSE::MOV R0,-(SP) ;SAVE R0 , MOV #$RQTAB,R0 ;POINT TO RESCHEDULE TABLE615$: MOV $ACTHD,(R0)+ ;SET DISPATCH TO FRONT OF LIST. CMP R0,#$RQTAB+ ;AT END OF TABLE? BLO 15$ ;IF LO NOC;SD; WE HAVE JUST CHANGED THE RESCHEDULE POINTERS FOR ALL PROCESSORS.$; WE SHOULD INTERRUPT ALL OF THEM.;% MOV $URMST,R0 ;GET ONLINE BUS RUNSE% BIC $CPMSK,R0 ;ONLY PROCESSORS NOWF BIC $CPBIT,R0 ;NOT US EITHERA& BEQ 25$ ;IF EQ NOBODY TO INTERRUPT MTPS #PR7 ;INHIBIT DEADLOCKS LOCK$ $FORKL,SPIN& BIS R0,$IIPND ;SHOW WORK IS WAITING ULOCK$ $FORKL,SPINH MTPS #025$: MOV (SP)+,R0 ;RESTORE R0P .ENDC8 CLR $SIGFL ;CLEAR TASK WAITING FOR SIGNIFICANT EVENT+ RETURN ;RETURN DIRECTIVE STATUS OF +1F;+'; **-$DFWFS-WAITFOR SINGLE EVENT FLAGT;G; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SUSPEND THE EXECUTION OF THEP5; ISSUING TASK UNTIL A SPECIFIED EVENT FLAG IS SET.Q; ; DPB FORMAT:I;U$; WD. 00 -- DIC(41.),DPB SIZE(2.).3; WD. 01 -- EVENT FLAG NUMBER OF FLAG TO WAITFOR.W;G ; INPUTS:F;S; R0=EVENT FLAG MASK WORD.; R1=EVENT FLAG MASK ADDRESS.C;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.E-; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.+1; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.A.; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;S7; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)E;D&; C=0 WITH A DIRECTIVE STATUS OF +1.;-6$DRWFS::BIC #1,R1 ;CLR GRP GLOBAL 2ND WORD INDCATOR:$DRWS1::BIS #T2.WFR,T.ST2(R5) ;PUT TASK IN WAITFOR STATE+ ;(DO NOT USE R2 BECAUSE OF QIOW CALL)T& MOV R0,T.EFLM(R5) ;SET WAITFOR MASK0 MOV R1,T.EFLM+2(R5) ;SET WAITFOR MASK ADDRESS( CALLR $SETRT ;SET A SCHEDULE REQUEST;+&; **-$DRCSR-CANCEL SCHEDULE REQUESTS;AM; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CANCEL ALL SCHEDULE REQUESTS FOR AD; SPECIFIED TASK.E;D; DPB FORMAT:D;I$; WD. 00 -- DIC(25.),DPB SIZE(3.).&; WD. 01 -- FIRST HALF OF TASK NAME.'; WD. 02 -- SECOND HALF OF TASK NAME.T; ; INPUTS:A;:; R0=ADDRESS OF THE TCB TO CANCEL SCHEDULE REQUESTS FOR.L; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO CANCEL SCHEDULE REQUES;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.R-; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.R1; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.R.; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;O7; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)D;-&; C=0 WITH A DIRECTIVE STATUS OF +1.;-($DRCS1:: ;REF LABEL FOR ERROR LOGGER%$DRCSR::MOV R0,R5 ;SET TCB ADDRESSE* CLR R4 ;SET 00cb_c_d_kINITIAL ENTRY TYPE MINUS 23 CALL (PC) ;REMOVE PERIODIC/SINGLE SHOT REQUESTS ) TST (R4)+ ;ADVANCE TO NEXT ENTRY TYPEU. CALLR $CLRMV ;REMOVE ALL REMAINING ENTRIES;+!; **-$DRGMX-GET MAPPING CONTEXT ;UH; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO RETURN THE MAPPING CONTEXT OF?; THE TASK, I.E. TO FILL IN UP TO N WINDOW DEFINITION BLOCKS, D; WHERE N IS THE TOTAL NUMBER OF WINDOW BLOCKS IN THE TASK HEADER.7; NO INFORMATION IS RETURNED ON UNUSED WINDOW BLOCKS.S;; DPB FORMAT:T;N$; WD. 00 -- DIC(113.),DPB SIZE(2.)7; WD. 01 -- ADDRESS OF THE N WINDOW DEFINITION BLOCKST;T ; INPUTS:;L;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.R.; (R3)=ADDRESS OF N WINDOW DEFINITION BLOCKS1; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.X.; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;F5; INPUT FIELDS IN THE WINDOW DEFINITION BLOCKS ARE:N ; NONE.; 7; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)N;L/; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.-(; DIRECTIVE STATUS OF +1 IS RETURNED.!; C=1 IF DIRECTIVE IS REJECTED.O<; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE ADDRESS7; CHECK OF THE N WINDOW BLOCKS PLUS TERMINATOR WORDD ; FAILS.;S6; OUTPUT FIELDS IN EACH WINDOW DEFINITION BLOCK ARE:@; W.NID=ADDRESS WINDOW ID OF NEXT ESTABLISHED ADDRESS WINDOW.#; W.NAPR=BASE APR OF THE WINDOW.E/; W.NBAS=VIRTUAL BASE ADDRESS OF THE WINDOW.T'; W.NSIZ=SIZE OF THE ADDRESS WINDOW.=.; W.NRID=REGION ID IF MAPPED OR UNMODIFIED.5; W.NOFF=OFFSET IN REGION IF MAPPED OR UNMODIFIED.I2; W.NLEN=LENGTH OF MAP IF MAPPED OR UNMODIFIED.-; W.NSTS=NECESSARY BITS TO RESTORE WINDOW.N2; WS.SIS=1 IF WINDOW IS IN SUPERVISOR I SPACE.# ; WS.MAP=1 IF WINDOW IS MAPPED.W5 ; WS.WRT=1 IF WINDOW IS MAPPED WITH WRITE ACCESS.  ;E> ; NOTE: ON SYSTEMS SUPPORTING NON RESIDENT TASK HEADERS, THE6 ; DIRECTIVE DISPATCHER MAPS THE NON RESIDENT HEADER7; THROUGH APR6. ON THESE SYSTEMS WE WILL USE APR5 TOI7; MAP TO THE USER TASK (N WINDOW DEFINITION BLOCKS).I:; THEREFORE, THIS DIRECTIVE CAN NOT GO INTO A DIRECTIVE*; PARTITION WITHOUT SOME MODIFICATIONS.;E7; WHEN MAPPING TO A TASK REGION, W.BOFF IS OFFSET BY :; THE SIZE OF THE EXTERNAL TASK HEADER. WE WILL ADJUST;; THAT VALUE HERE SO THAT THE TASK DOES NOT KNOW WHETHERN&; OR NOT IT HAS AN EXTERNAL HEADER.;-F$DRGMX::MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOW BLOCKS IN HEADER0 MOV (R4)+,R1 ;PICK UP NUMBER OF WINDOW BLOCKS- MOV R1,-(SP) ;SAVE NUMBER OF WINDOW BLOCKS)- ASL R1 ;CONVERT TO BYTES TO ADDRESS CHECKN  ASL R1 ;  ASL R1 ;) INC R1 ;(INCLUDE WORD FOR TERMINATOR)W  ASL R1 ;9! MOV (R3),R3 ;PICK UP VIRTUAL ADDRESS OF WINDOW BLOCKSE"# .IF DF X$$HDR$&% MOV R3,R0 ;GET VA TO ADDRESS CHECK& CALL $ACHCK ;ADDRESS CHECK)' BCS 50$ ;IF CS, ADDRESS CHECK FAILURE+( CALL $RELOC ;RELOCATE TO KERNEL ADDRESSN!) MOV R1,KISAR5 ;MAP USER BUFFER)* MOV R2,R3 ;GET KERNEL VIRTUAL ADDRESSC-+ SUB #20000,R3 ;AND MAKE IT AN APR5 ADDRESSK,- .IFF ; DF X$$HDRO.7/ CALL $ACHKP ;ADDRESS CHECK AND MAP TO WINDOW BLOCKSR01 .ENDC ; DF X$$HDR23+4 CLR -(SP) ;INITIALIZE WINDOW ID COUNTERU;510$: TST W.BSIZ(R4) ;IS NEXT BLOCK AN ESTABLISHED WINDOW?V6 BNE 11$ ;IF NE YES-7 ADD #W.BLGH,R4 ;POINT TO NEXT WINDOW BLOCKS.8 BR 40$ ;BRANCH TO DETERMINE IF MORE BLOCKS-911$: MOVB (SP),(R3)+ ;SET WINDOW ID (W.NID)I-: MOV (R4)+,-(SP) ;SAVE PCB ADDRESS (W.BPCB)E5; MOV (R4)+,R1 ;PICK UP LOW VIRTUAL ADDRESS (W.BLVR)R9< MOVB -1(R4),(R3) ;GET ITS HIGH BYTE (W.BLVR+1)(W.NAPR)A0= ASLB (R3) ;SHIFT TO FORM APR NUMBER (W.NAPR)> ROLB (R3) ;? ROLB (R3) ;)@ ROLB (R3)+ ;2A MOV R1,(R3)+ ;SET VIRTUAL BASE ADDRESS (W.NBAS)6B MOV (R4)+,R2 ;PICK UP HIGH VIRTUAL ADDRESS (W.BHVR)5C MOV (R4)+,R0 ;PICK ATT DESCRIPTOR ADDRESS (W.BATT)R4D MOV (R4)+,(R3)+ ;SET WINDOW SIZE (W.BSIZ)(W.NSIZ)EF .IF DF X$$HDRG0H MOV (SP)+,R2 ;GET PCB ADDRESS FOR THIS WINDOWI00cbb`TADATADATADATADATADATAJ .IFF ; DF X$$HDRLK%L TST (SP)+ ;IS THIS WINDOW MAPPED?)MN .ENDC ;DF X$$HDR(OP BEQ 20$ ;IF EQ NO 'Q MOV R0,(R3)+ ;SET REGION ID (W.NRID)CR MOV T.ATT(R5),-(SP) ;PUSH ADDRESS OF FIRST ATTACHMENT DESCRIPTOR (S SUB #A.TCBL,(SP) ;POINT TO FIRST WORDT CMP R0,(SP)+ ;TASK REGION? U BNE 15$ ;IF NE NOV9V CLR -2(R3) ;SET IT TO DEFAULT TO TASK REGION (W.NRID)4WX .IF DF X$$HDRY2Z15$: MOV (R4)+,(R3) ;SET OFFSET W.BOFF TO W.NOFF8[ MOVB P.HDLN(R2),R2 ;GET SIZE OF XTRNL HEADER (IF ANY)/\ SUB R2,(R3)+ ;ADJUST OFFSET BY HEADER LENGTHD5] MOV W.BHVR-W.BFPD(R4),R2 ;RESTORE HIGH VA (W.BHVR) ^_ .IFF ; DF X$$HDR`3a15$: MOV (R4)+,(R3)+ ;SET OFFSET (W.BOFF)(W.NOFF) bc .ENDC ; DF X$$HDRde SUB R1,R2 ;CALCULATE LENGTHSf ADD #1,R2 ;,!g ROL R2 ;CONVERT TO 32W BLOCKSI h ROL R2 ; i ROLB R2 ; j SWAB R2 ;O(k MOV R2,(R3)+ ;SET THE LENGTH (W.NLEN)1l TST (R4)+ ;ADVANCE TO LAST PDR IMAGE (W.BFPD) :m MOV (R4)+,(R3) ;PICK UP LAST PDR IMAGE (W.BLPD)(W.NSTS)9n BIC #^C4,(R3) ;CLEAR ALL BUT WRITE ACCESS BIT (W.NSTS)M'o ASR (R3) ;SHIFT INTO PLACE (W.NSTS)(pqr .IF DF U$$DASs4t BITB #20,W.BFPD-W.BLGH(R4) ;USER D SPACE WINDOW ?u BEQ 18$ ;IF EQ NO;2v BIS #WS.UDS,(R3) ;SET USER D SPACE BIT (W.NSTS)w BR 19$ ;SKIP SUPER I CHECKx18$: ;REFERENCE LABELyz .ENDC ; DF U$$DAS{|} .IF DF S$$LIB~5 TSTB W.BFPD-W.BLGH(R4) ;SUPERVISOR I SPACE WINDOW?P BMI 19$ ;IF MI NOM8 BIS #WS.SIS,(R3) ;SET SUPERVISOR I SPACE BIT (W.NSTS) .ENDC<19$: BIS #WS.MAP,(R3)+ ;INDICATE WINDOW IS MAPPED (W.NSTS)  BR 30$ ;;20$: ADD #W.NSTS-W.NRID,R3 ;POINT TO NEXT WINDOW ID BLOCK 4 ADD #W.BLGH-W.BOFF,R4 ;POINT TO NEXT WINDOW BLOCK  CLR (R3)+ ;CLEAR STATUS WORDA30$: TST (R3)+ ;SKIP OVER SEND/RECEIVE BUFFER ADDRESS (W.NSRB)B 40$: INC (SP) ;BUMP WINDOW ID CMP (SP),2(SP) ;DONE YET? BLO 10$ ;IF LO NOS= MOV (SP)+,(R3) ;STORE NUMBER OF HEADER SLOTS AS TERMINATORS NEG (R3) ;AND NEGATE TST (SP)+ ;CLEAN STACK ; BM400B  .IF NDF K$$DAS ; BM400 ; BM400; MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACE ; BM400W ; BM400.# .ENDC ; NDF K$$DAS ; BM400B ; BM400C  RETURN ;D ; BM400S .IF DF X$$HDR ;**-1D!50$: DRSTS D.RS98 ;BAD ADDRESSW .ENDC ; DF X$$HDR" .ENDC ; DF P$$LAS ;JWB213 ;**-1O;+; **-$DRQRQ-QUEUE I/O REQUESTS;NB; THIS ROUTINE IS CALLED TO OPTIONALLY INSERT AN I/O PACKET INTO9; A CONTROLLER QUEUE AND TO CALL THE DRIVER TO INITIATE; ACTIVITY ON THE DEVICE.I;HB; IF THE DEVICE SUPPORTS SEEK OPTIMIZATION AND THE PACKET IS FOR;; A LOGICAL TRANSFER FUNCTION, THE LBN FOR THE REQUEST IS B; BLOCK CHECKED AND CONVERTED TO THE SECTOR/TRACK/CYLINDER FORM.;; THE BLOCK CHECK ROUTINE IS IN THE CORRESPONDING DRIVER.D;L ; INPUTS:2;!; R1=ADDRESS OF THE I/O PACKET.R); R5=ADDRESS OF THE UNIT CONTROL BLOCK.E;A ; OUTPUTS:;I7; IF NO I/O PACKET IS SPECIFIED AS INPUT (R1 = 0) THEA7; DRIVER IS SIMPLY CALLED TO INITIATE ACTIVITY ON THE1; DEVICE. THIS OPTION ALLOWS US TO RE-INITIATEA0; ACTIVITY ON A DEVICE WHEN IT HAS SATISFIED A; STALLED I/O STATE.;I8; IF AN I/O PACKET IS SPECIFIED AS INPUT, IT IS PLACED5; IN THE CONTROLLER QUEUE AND ACTIVITY IS INITIATEDR; ON THE DEVICE.;*; NOTE: R4 IS DESTROYED BY THIS ROUTINE.;-$DRQRQ:: ;REFERENCE LABELN8 MOV U.SCB(R5),R4 ;GET ADDRESS OF STATUS CONTROL BLOCK' MOV (R5),R2 ;GET ADDRESS OF THE DCBR1 MOV KINAR5,-(SP) ;SAVE KERNEL INSTRUCTION APR5  .IF DF K$$DAS* MOV KDSAR5,-(SP) ;SAVE KERNEL DATA APR5 .IFTF ;K$$DAS+ MOV D.PCB(R2),R3 ;GET DRIVER PCB ADDRESSK) BEQ 20$ ;IF EQ DRIVER IS PART OF EXEC > MOV P.REL(R3),KINAR5 ;MAP KERNEL INSTRUCTION APR5 TO DRIVER .IFT ;K$$DASE7 MOV P.REL(R3),KDSAR5 ;MAP KERNEL DATA APR5 TO DRIVERE .IFTF ;K$$DAS%20$:00cb_c_d_k TST R1 ;I/O PACKET TO QUEUE ?N+ BEQ 40$ ;IF EQ, NO - SIMPLY CALL DRIVERO .IF DF S$$HDW; %; COPY THE I/O PACKET FOR SHADOWING;F% MOV R4,-(SP) ;SAVE THE SCB ADDRESSV5 MOV R1,R3 ;COPY THE I/O PACKET ADDRESS FOR $SHFNDP& CALL $SHFND ;THIS DEVICE SHADOWED?! BCS 35$ ;IF CS NO, DON'T COPYE1 CMP ML.PRI(R4),R1 ;IS THIS THE PRIMARY PACKET? ! BNE 35$ ;IF NE NO, DON'T COPYE: MOV #I.LGTH/2,R0 ;GET THE NUMBER OF WORDS IN THE PACKET832$: MOV (R1)+,(R2)+ ;COPY THE NEXT WORD IN THE PACKET' SOB R0,32$ ;LOOP FOR REST OF PACKETL5 SUB #I.LGTH,R1 ;GET THE PRIMARY I/O PACKET ADDRESSY( MOV U.UMB(R5),R0 ;GET THE UMB POINTER@ MOV M.UCBS+2(R0),I.UCB-I.LGTH(R2) ;COPY THE UCB POINTER INTO ;THE SECONDARY PACKETL$35$: MOV (SP)+,R4 ;RESTORE THE SCB' MOV (R5),R2 ;GET ADDRESS OF THE DCB. .ENDC ;S$$HDW, .IF DF D$$CHE ;DISK DATA CACHING SUPPORT- .IF DF K$$DAS ;KERNEL I/D SPACE EXECUTIVE 7 CMP 2(SP),$DRCHE ;REQUEST FROM CACHE? (CHECK KINAR5)  .IFF ;K$$DAS;6 CMP (SP),$DRCHE ;REQUEST FROM CACHE? (CHECK KISAR5) .IFTF ;K$$DAS4 BEQ 350$ ;YES IF EQ; CACHE ALWAYS BYPASSES CACHE1 BIT #DV.MSD,U.CW1(R5) ;POSSIBLY A DISK DEVICE? + BEQ 350$ ;NO IF EQ; DON'T BOTHER CACHERR> BIT #DV.SQD,U.CW1(R5) ;IS THIS POSSIBLE DISK REALLY A TAPE?1 BNE 350$ ;YES IF NE; DON'T CACHE THESE EITHERA: MOV $DRCHE,R0 ;GET BIAS OF CACHER [DIRECTIVE] PARTITION4 BEQ 350$ ;IF EQ NOT PRESENT IN RUNNING EXECUTIVE5 MOV R0,KINAR5 ;ELSE LOAD [I-SPACE] MAPPING IN APR5(2 CALL @#120000 ;HOPE THIS CACHE CALL IS WORTH IT ; NOTE:DG; AN INLINE RETURN FROM THE CACHER FORWARDS THE REQUEST TO THE DRIVERM>; THEREFORE, THE DRIVER MUST BE REMAPPED PRIOR TO CONTINUING- MOV D.PCB(R2),R3 ;GET DRIVER'S PCB ADDRESST2  BEQ 350$ ;IF EQ DRIVER IS RESIDENT OR UNLOADED4  MOV P.REL(R3),KINAR5 ;MAP KERNEL INSTRUCTION APR5   .IFT ;K$$DAST 2 MOV KINAR5,KDSAR5 ;MAP KERNEL DATA APR5 AS WELL .ENDC ;K$$DAS350$:L .ENDC ;D$$CHE7 BIT #S2.OPT,S.ST2(R4) ;SEEK OPTIMIZATION SUPPORTED? BEQ 30$ ;IF EQ NOL9 MOV D.DSP(R2),R2 ;GET ADDRESS OF DRIVER DISPATCH TABLEE8 CALL @D.VCHK(R2) ;CALL DRIVER FOR BLOCK CHECK AND CVT930$: BITB #UC.QUE,U.CTL(R5) ;QUEUE PACKET BEFORE CALL?T BNE 40$ ;IF NE NOR0 MOV R4,R0 ;SET ADDRESS OF I/O QUEUE LISTHEAD1 CALL $QINSP ;QUEUE I/O PACKET IN DEVICE QUEUE$840$: MOV (R5),R2 ;GET ADDRESS OF DEVICE CONTROL BLOCK;+ ; ** W A R N I N G **!;$"; SPM HOOKPOINT NUMBER 16.#;B+$; DO NOT CHANGE THE INSTRUCTION FOLLOWINGO%; LABEL WITHOUT CHECKING SPM&;-'-($SPH16==. ;SPM CHANGES THE INSTRUCTION ATE!) ;THE LOCATION OF THIS LABELF*9+ MOV D.DSP(R2),R2 ;GET ADDRESS OF DRIVER DISPATCH TABLEA,*- CALL @D.VINI(R2) ;CALL DRIVER INITIATOR0.$QOPDN:: ;$BLKC2 RETURNS HERE AFTER AN ERROR/0 .IFTQ1-2 MOV (SP)+,KDSAR5 ;RESTORE KERNEL DATA APR5234 .ENDC5647 MOV (SP)+,KINAR5 ;RESTORE KERNEL INSTRUCTION APR5 8 RETURN ;O9:B;$DRWFA::MOV #$DRWFS,-(SP) ;POINT TO WAIT FOR SINGLE FLAG ROUTINE<=;+->;**-$MPDC1-MAP TO AND CALL DIRECTIVE COMMONG?;EH@; THIS ROUTINE IS CALLED TO TRANSFER CONTROL TO A ROUTINE IN THE FIRSTHA; DIRECTIVE COMMON, THEN RESTORE THE CURRENT MAPPING AND RETURN TO THE B; CALLER.TC; D; INPUTS:BE;R$F; (SP) = RETURN ADDRES AFTER CALL#G; 2(SP) = ROUTINE ADDRESS TO CALLKH; I; OUTPUTS:J;. K; NONE.L;M1M; REGISTERS AND C-BIT ARE PRESERVED ACROSS CALLN;RO;- P .ENABL LSBWQ R$MPDC3::ST .IF DF D$$PARUV .IF DF K$$DASW1X MOV KDSAR5,-(SP) ;SAVE CURRENT D SPACE MAPPINGOY $$$=4Z[ .IFF ; DF K$$DASD\] $$$=2^_ .IFTF ; DF K$$DAS`-a MOV $$$(SP),-(SP) ;COPY ADDRESS OF ROUTINEE;b MOV $$$(SP),$$$+2(SP) ;PUT RETURN ADDRESS IN RIGHT PLACEB0c MOV KINAR5,$$$(SP) ;SAVE CURRENT APR5 MAPPINGde.f MOV $DRAP3,KINAR5 ;MAP 2ND DIRECTIVE COMMONgh .IFT ; DF K$$DAS i2j MOV $DRAP3,00cbb`TADATADATADATADATADATAKDSAR5 ;MAP IT IN DATA SPACE AS WELLkl .ENDC ; DF K$$DASm2n BR 10$ ;FINISH IN COMMON WITH MAP FIRST COMMONop .IFTF ; DF D$$PARq r$MPDC4::st .IFT ; DF D$$PARuv .IF DF K$$DASw1x MOV KDSAR5,-(SP) ;SAVE CURRENT D SPACE MAPPINGSy $$$=4z{ .IFF ; DF K$$DAS|} $$$=2~ .IFTF ; DF K$$DAS- MOV $$$(SP),-(SP) ;COPY ADDRESS OF ROUTINEU; MOV $$$(SP),$$$+2(SP) ;PUT RETURN ADDRESS IN RIGHT PLACEE0 MOV KINAR5,$$$(SP) ;SAVE CURRENT APR5 MAPPING. MOV $DRAP4,KINAR5 ;MAP 2ND DIRECTIVE COMMON .IFT ; DF K$$DAS 2 MOV $DRAP4,KDSAR5 ;MAP IT IN DATA SPACE AS WELL .ENDC ; DF K$$DAS2 BR 10$ ;FINISH IN COMMON WITH MAP FIRST COMMON .IFTF ; DF D$$PAR $MPDC2:: .IFT ; DF D$$PAR .IF DF K$$DAS1 MOV KDSAR5,-(SP) ;SAVE CURRENT D SPACE MAPPINGS $$$=4 .IFF ; DF K$$DAS $$$=2 .ENDC ; DF K$$DAS- MOV $$$(SP),-(SP) ;COPY ADDRESS OF ROUTINEU; MOV $$$(SP),$$$+2(SP) ;PUT RETURN ADDRESS IN RIGHT PLACEE0 MOV KINAR5,$$$(SP) ;SAVE CURRENT APR5 MAPPING. MOV $DRAP2,KINAR5 ;MAP 2ND DIRECTIVE COMMON2 BR 10$ ;FINISH IN COMMON WITH MAP FIRST COMMON" .IFTF ; DF D$$PAR ; BM385 ; BM385$MPDCV:: ; BM385 ; BM385! .IFT ; DF D$$PAR ; BM385  ; BM385$ .IF DF K$$DAS ; BM385 ; BM385N; MOV KDSAR5,-(SP) ;SAVE CURRENT D SPACE MAPPING ; BM385T $$$=4 ; BM385 ; BM385E! .IFF ; DF K$$DAS ; BM385$ ; BM385P $$$=2 ; BM385 ; BM385N" .ENDC ; DF K$$DAS ; BM385 ; BM385 7 MOV $$$(SP),-(SP) ;COPY ADDRESS OF ROUTINE ; BM385 D MOV $$$(SP),$$$+2(SP) ;PUT RETURN ADDRESS IN RIGHT PLACE ; BM385: MOV KINAR5,$$$(SP) ;SAVE CURRENT APR5 MAPPING ; BM385 ; BM385  ; BM385 8 MOV $DRAPV,KINAR5 ;MAP 2ND DIRECTIVE COMMON ; BM385; BR 10$ ;FINISH IN COMMON WITH MAP FIRST COMMON ; BM385 ; BM385  .IFTF ; DF D$$PAR $MPDC1:: .IFT ; DF D$$PAR  .IF DF K$$DAS7 MOV KDSAR5,-(SP) ;SAVE CURRENT D SPACE APR 5 MAPPINGS .ENDC ; DF K$$DAS- MOV $$$(SP),-(SP) ;COPY ADDRESS OF ROUTINEE; MOV $$$(SP),$$$+2(SP) ;PUT RETURN ADDRESS IN RIGHT PLACES0 MOV KINAR5,$$$(SP) ;SAVE CURRENT APR5 MAPPING- MOV $DRAPR,KINAR5 ;MAP TO DIRECTIVE COMMONA)10$: CALL @(SP)+ ;CALL DESIRED ROUTINEB .IF DF K$$DAS; MOV (SP)+,KDSAR5 ;RESTORE PREVIOUS D SPACE APR 5 MAPPINGD .ENDC ; DF K$$DAS- MOV (SP)+,KINAR5 ;RESTORE PREVIOUS MAPPING  RETURN ;( .IFF ; DF D$$PAR , CALLR @(SP)+ ;DIRECT TRANSFER TO ROUTINE .ENDC ; DF D$$PAR  .DSABL LSB;+ ;PKW120U1; **-$CPXXX- STUB ROUTINES FOR CPR ;PKW120S;- ;PKW120GE; THIS MODULE PROVIDES GLOBAL ENTRY POINTS TO MAP AND CALL ;PKW120C8; ROUTINES IN THE KXJ COMMUNICATION DRIVER. ;PKW120; ;PKW120 ;PKW120  .ENABL LSB ;PKW120 ;PKW120V$CPCON:: ;PKW1206 .IF DF C$$RMT ;IF REMOTE SYSTEM SERVICES ;PKW120 ;PKW120;5 MOV #CPRCON,R3 ;SAVE OUR CALLING ADDRESS ;PKW120' BR 10$ ;JOIN COMMON CODE ;PKW120P ;PKW120- .IFTF ;C$$RMT ;PKW1202$CPALO:: ;PKW120 .IFT ;C$$RMT ;PKW120 ;PKW120N5 MOV #CPRALO,R3 ;SAVE OUR CALLING ADDRESS ;PKW120 ' BR 10$ ;JOIN COMMON CODE ;PKW120 ;PKW120 .IFTF ;C$$RMT ;PKW120 $CPDEA:: ;PKW120 .IFT ;C$$RMT ;PKW120 ;PKW120 5 MOV #CPRDEA,R3 ;SAVE OUR CALLING ADDRESS ;PKW120N' BR 10$ ;JOIN COMMON CODE ;PKW120 ;PKW120O .IFTF ;C$$RMT ;PKW120P$CPSEN:: ;PKW120 .IFT ;C$$RMT ;PKW120 ;PKW120C5 MOV #CPRSEN,R3 ;SAVE OUR CALLING ADDRESS ;PKW120O10$: ;PKW120R: MOV @#KINAR5,-(SP) ;SAV00 cb_c_d_kE APR5 I SPACE MAPPING ;PKW120: MOV @#KISAR5,-(SP) ;SAVE APR5 D SPACE MAPPING ;PKW1202 MOV $KXBAS,@#KISAR5 ;MAP THE DRIVER ;PKW1202 MOV $KXBAS,@#KINAR5 ;MAP THE DRIVER ;PKW120+ CALL @(R3) ;CALL THE ROUTINE ;PKW120C= MOV (SP)+,@#KISAR5 ;RESTORE APR5 D SPACE MAPPING ;PKW120T= MOV (SP)+,@#KINAR5 ;RESTORE APR5 I SPACE MAPPING ;PKW120  ;PKW120  .ENDC ;C$$RMT ;PKW120V ;PKW120  RETURN ;PKW120  ;PKW120N .DSABL LSB ;PKW120 ;PKW120M2;$IMASG - IMPLICIT ASSIGN LUN CALL ; KLN034; ; KLN034AY; THIS ROUTINE IS USED BY QIO, GLUN, GDVI ETC. TO JUMP TO ALUN FROM THE OTHER ; KLN034 7; DIRECTIVE COMMONS FOR RUN TIME BINDING ; KLN034R; ; KLN034 $IMASG:: ; KLN034P ; KLN0346 .IF DF C$$RTB ;RUN TIME BINDING SUPPORT ; KLN034 ; KLN0345 MOV $DRAPR,KINAR5 ;MAP TO FIRST COMMON ; KLN03426 MOV $DRAPR,KDSAR5 ;MAP IN D-SPACE ALSO ; KLN034 ; KLN0342 JMP $IMAS1 ;JUMP TO ROUTINE IN DRASG ;KLN040 ;KLN034A .ENDC ; C$$RTB ;KLN034, ;KLN034U;+C; **-$MPPRO- MAP AND CALL SPECIFIED PROCESS THEN RETURN TO CALLERN; G; THIS ROUTINE IS CALLED TO MAP AND CALL THE ROUTINE INDICATED BY THE @; ADDRESS DOUBLE WORD ON THE STACK. MAPPING IS DONE VIA APR5.; ; INPUTS: ;4%; (SP) = RETURN ADDRESS AFTER CALLM#; 2(SP) = ROUTINE ADDRESS TO CALL5&; 4(SP) = MAPPING OF ROUTINE TO CALL; ; OUTPUTS:;$ ; NONE.P;O ; ALL REGISTERS ARE PRESERVED.;- $MPPRO::+ MOV 2(SP),-(SP) ;COPY ADDRESS OF ROUTINE$ MOV KISAR5, 4(SP) ;COPY APR5 BIAS- MOV 6(SP),KISAR5 ;MAP ROUTINE TO BE CALLEDH( MOV 2(SP), 6(SP) ;COPY RETURN ADDRESS .IF DF K$$DAS0 MOV KINAR5,2(SP) ;FOR I/D SYSTEMS SAVE KINAR5% MOV KISAR5, KINAR5 ;AND MAP KINAR54 .IFF ; DF K$$DASE, MOV (SP)+, (SP) ;MOVE ADDRESS OF ROUTINE .IFTF, CALL @(SP)+ ;TRANSFER CONTROL TO PROCESS .IFT ;DF K$$DAS$ MOV (SP)+,KINAR5 ;RESTORE MAPPING .ENDC ; DF K$$DAS$ MOV (SP)+,KISAR5 ;RESTORE MAPPING, RETURN ;TRANSFER CONTROL BACK TO CALLER;+(; **-$FNCLI-FIND CPB FOR SPECIFIED CLI; 6; THIS ROUTINE LOCATES THE CPB FOR THE SPECIFIED CLI; ; INPUTS:E;V*; R3=ADDRESS OF CLI NAME STORED IN RAD50 ; ; OUTPUTS: ;$ ; C=1 CLI DOES NOT EXIST ; C=0 CLI SUCCESSFULLY FOUND); R1=OFFSET TO ENTRY FOR CLI IN $CPTBLT; R4=CPB ADDRESS; 5; REGISTERS R0, R2 AND R3 ARE PRESERVED ACROSS CALL;.;- .IF DF A$$CLIH$FNCLI::MOV #$NMCLI!40000,-(SP) ;GET NUMBER OF CLIS SYSTEM CAN SUPPORT' CLR R1 ;START AT BEGINNING OF TABLES+10$: MOV $CPTBL(R1),R4 ;POINT TO NEXT CPBT BEQ 20$ ;IF EQ, EMPTY SLOT' CMP C.PNAM(R4),(R3) ;IS THIS THE CLI  BNE 20$ ;IF NE NO0  CMP C.PNAM+2(R4),2(R3) ;MAYBE BEQ 30$ ;IF EQ YES420$: TST (R1)+ ;SET OFFSET FOR NEXT SLOT IN TABLE#  DECB (SP) ;IS THERE A SLOT LEFTS! BGT 10$ ;IF GT YES." ASL (SP) ;PUT BIT IN POSITION TO SET CARRY6#30$: ASL (SP)+ ;POP STACK AND SET APPROPRIATE CARRY $ RETURNG%& .IFF ;A$$CLIT'@($FNCLI::MOV #$MCRPT,R4 ;POINT TO MCR'S CPB, ONLY ONE IN SYSTEM*) CLR R1 ;OFFSET TO MCR'S SLOT IN $CPTBL'* CMP C.PNAM(R4),(R3) ;LOOKING FOR MCRR+ BNE 10$ ;IF NE NO", TST 2(R3) ;MATCH MUST BE EXACT- BEQ 20$ ;IF EQ, OK!.10$: SEC ;NOT LOOKING FOR MCR+ /20$: RETURNO0%1$STCLI==-1 ;DEFINE SYMBOL FOR MCRR23;+4; **-$STCLI-SET CLIT5;A6; THIS ENTRY POINT EXISTS SO ROUTINES OUTSIDE THE EXECUTIVE CANPC7; CALL THE ROUTINE TO SET A TERMINALS CLI ON SYSTEMS THAT SUPPORTA8; THE DIRECTIVE COMMON. THE ROUTINE ITSELF RESIDES IN THE DRCLIM(9; MODULE. CHECK THERE FOR ALL DETAILS.:;;;-<= .IFT ;A$$CLIN>?@ .IF DF D$$PARA?B$STCLI::MOV #$STCL1,-(SP) ;GET ADDRESS OF ALT ENTRY IN COMMONC;:CD; R3 POINTS TO THE NAME OF THE CLI THAT THE TE00(cbb`TADATADATADATADATADATARMINAL IS TO BE SETIDE; TO. IF A TASK IS CALLING $STCLI, THE NAME COULD BE IN TASK SPACE>F; THAT WILL BE UNMAPPED WHEN THE DIRECTIVE COMMON IS MAPPED.CG; THEREFORE, $FNCLI MUST BE CALLED BEFORE THE MAPPING IS CHANGED.H;H; NOTE: $MPCM2 MUST PRESERVE ALL REGISTERS AND THE C BIT.I;O'J CALL $FNCLI ;FIND THE SPECIFIED CLI%K CALL $MPDC2 ;MAP AND CALL ROUTINE. L RETURN ;MN .ENDC ;D$$PAROPQ .ENDC ;A$$CLIRST;+1U; **-$SNCMD-SEND NEXT COMMAND TO CLI DISPATCHERAV; @W; THIS ROUTINE IS CALLED UPON COMPLETION OF THE EXECUTION OF ACX; CLI COMMAND, WHEN THE TI: TERMINAL HAS SERIAL COMMAND EXECUTIONIAY; ENABLED. IT CALLS THE TTDRV AT THE APPROPRIATE ENTRY POINT TOHFZ; CAUSE IT TO FIND THE NEXT COMMAND IN THE TYPEAHEAD BUFFER AND SEND$[; IT TO MCR... TO START EXECUTION.\;H ]; INPUTS:L^;"_; R0=UCB ADDRESS OF TI: TERMINAL`;R a; OUTPUTS:b;.c; NONEd;e;-f g$SNCMD::h3i .IF NDF R$$PRO ;NO SERIAL COMMAND MORE FOR P/OSSj;j BIT #DV.PSE,U.CW1(R0) ;IS TI: A PSEUDO DEVICE? ;JWB220 $j BNE 10$ ;IF NE, EXIT ;JWB220:k BIT #UM.SER,U.MUP(R0) ;TERMINAL IN SERIAL COMMAND MODE?l BEQ 10$ ;IF EQ NOTm MOV (R0),R2 ;POINT TO DCB2s MOV KINAR5,-(SP) ;SAVE CURRENT MAPPING ;**-5t MOV KINAR6,-(SP) ;...uvw .IF DF K$$DASx,y MOV KDSAR5,-(SP) ;SAVE DATA SPACE MAPPINGz MOV KDSAR6,-(SP) ;...{| .IFTF}+~ MOV D.PCB(R2),R3 ;POINT TO PCB FOR TTDRV.# MOV P.REL(R3),KINAR5 ;MAP DRIVERE .IFT. MOV P.REL(R3),KDSAR5 ;MAP DRIVER IN D SPACE .IFTF, MOV D.DSP(R2),R2 ;POINT TO DISPATCH TABLE4 CALL @D.VNXC(R2) ;CALL TTDRV TO SEND NEXT COMMAND .IFTT/ MOV (SP)+,KDSAR6 ;RESTORE DATA SPACE MAPPING / MOV (SP)+,KDSAR5 ;RESTORE DATA SPACE MAPPINGP .ENDC6 MOV (SP)+,KINAR6 ;RESTORE INSTRUCTION SPACE MAPPING6 MOV (SP)+,KINAR5 ;RESTORE INSTRUCTION SPACE MAPPING .ENDC ;R$$PRO 10$: RETURNB; THIS MODULE CONTAINS ROUTINES WHICH MUST BE REMOVED FROM OTHERC; DIRECTIVE MODULES SINCE THEY CAN NOT BE PLACED IN THE DIRECTIVEP ; COMMON .IF DF G$$GEF;+E; **-$ELGEF-SUBROUTINE TO ELIMINATE A GROUP GLOBAL EVENT FLAG BLOCKS;DK; THIS SUBROUTINE UNCONDITIONALLY UNLINKS A GROUP GLOBAL EVENT FLAG BLOCK.; AND DEALLOCATES IT.+;R ; INPUTS:S;I;; R0=ADDRESS OF BLOCK POINTING TO BLOCK TO BE DEALLOCATEDA(; R1=ADDRESS OF BLOCK TO BE ELIMINATED;T ; OUTPUTS:;M ; NONE.I;-)$ELGEF::MOV (R1),(R0) ;UNLINK THE BLOCKE- MOV R1,R0 ;SET UP TO DEALLOCATE THE BLOCKH MOV #10.,R1 ;O& CALLR $DEACB ;DEALLOCATE THE BLOCK;+/; **-$DEAGF-DEACCESS GROUP GLOBAL EVENT FLAGST; I; THIS ROUTINE DETERMINES IF GROUP GLOBAL EVENT FLAGS EXIST FOR A TASK.E-; IF THEY DO, THE ACCESS COUNT IN THE GROUPG; GLOBAL EVENT FLAG BLOCK IS DECREMENTED AND THE BLOCK IS DEALLOCATEDO; IF IT IS MARKED FOR DELETE.O;L ; INPUTS:T; ; R3=EVENT FLAG MASK ADDRESS; R4=TASK HEADER ADDRESS; R5=TASK TCB ADDRESS.;, ; OUTPUTS:;L ; NONE.L;;-.$DEAGF::SAVNR ;SAVE NON-VOLATILE REGISTERS) MOVB H.CUIC+1(R4),R4 ;GET GROUP NUMBERO4 CALL $SRGEF ;SEARCH FOR GROUP GLOBAL EVENT FLAGS BCS 10$ ;IF CS NOT FOUND4 BIC #1,R3 ;CLEAR GROUP GLOBAL 2ND WORD INDICATOR( CMP R3,R1 ;GROUP GLOBAL EVENT FLAG ? BLO 10$ ;IF LO NOK. SUB #G.LGTH,R3 ;POINT TO BEGINNING OF BLOCK( CMP R3,R1 ;GROUP GLOBAL EVENT FLAG ? BHIS 10$ ;IF HIS NO45 DECB T.GGF(R5) ;DECR GRP GLOBAL USE COUNT FOR TASK( DEC G.CNT(R1) ;DECREMENT ACCESS COUNT, BNE 10$ ;IF NE CAN'T ELIMINATE FLAGS YET/ BITB #GS.DEL,G.STAT(R1) ;MARKED FOR DELETE ?/ BNE $ELGEF ;IF NE YES, ELIMINATE FLAG GROUPA10$: RETURN ;  .ENDC ; DF G$$GEF;+9;**-$CLEDI-CALL USERS ENABLE DISABLE INTERRUPTS ROUTINEN;GD; THIS ROUTINE IS CALLED FROM THE CINT$ DIRECTIVE TO MAP THE USERS2; ENABLE/DISABLE INTERRUPTS ROUTINE AND CALL IT.;0 ; INPUTS:4;D; R1=ITB000cb_c_d_k ADDRESS; C=0 TO ENABLE INTERRUPTS; C=1 TO DISABLE;M ; OUTPUTS:; ; NONE.I;-;$CLEDR::MOV X.DSI(R1),R2 ; GET ADDRESS OF USER ROUTINE TOD! ; ENABLE/DISABLE INTERRUPTS, BEQ 10$ ; NONE - EXIT02 MOV KINAR5,-(SP) ; SAVE CURRENT MAPPING OF APR55 MOV X.REL(R1),KINAR5 ; MAP ROUTINE IN KERNEL APR 5O .IF DF K$$DAS, MOV KDSAR5,-(SP) ; SAVE D SPACE APR 5 TOO5 MOV X.REL(R1),KDSAR5 ; MAP IN DATA SPACE APR 5 TOOA .ENDC& CALL @R2 ; CALL ROUTINE AND RETURN ; R1 = POINTER TO ITB & ; CC-C = 0 TO ENABLE INTERRUPTS,& ; = 1 TO DISABLE INTERRUPTS .IF DF K$$DAS3 MOV (SP)+,KDSAR5 ; RESTORE D SPACE APR 5 MAPPING, .ENDC ; DF K$$DAS* MOV (SP)+,KINAR5 ; RESTORE APR5 MAPPING10$: RETURN ; EXIT;+ ; BM384R/;**-$DRGLI-GET LUN INFORMANTION ; BM384R*;**-$DRGIN-GET INFORMATION ; BM384+;**-$DREXP-EXTEND PARTITION ; BM384+;**-$DRGCL-GET COMMAND LINE ; BM384 ; ; BM384W; THESE ARE THE TRANSFER STUBS TO MAP THE VECTOR COMMON FOR THESE DIRECTIVES. ; BM384N2; TWO THINGS ARE IMPORTANT TO NOTE: ; BM384; ; BM384K; 1) THE DRTBL TABLES MARK THE DIRECTIVES AS BEING IN THE SECOND ; BM384PL; COMMON SO THAT SAVE AND RESTORE OF THE FIRST COMMONS MAPPING ; BM384J; OCCURS (OTHERWISE RETURN TO THE DISPATHCER IS IMPOSSIBLE). ; BM384; ; BM384K; 2) SINCE THESE STUB ROUTINES USE R1, ALL THE DIRECTIVES IN THE ; BM384 ;; VETOR COMMON MUST NOT USE R1 AS AN INPUT. ; BM384 ;- ; BM384  .ENABL LSB ; BM384 ; BM384T@$DREXP::MOV #$DRXP1,R1 ; GET ADDRESS OF REAL ROUTINE ; BM384- BR 10$ ; FINISH IN COMMON CODE ; BM384  ; BM384 @$DRGCL::MOV #$DRGC1,R1 ; GET ADDRESS OF REAL ROUTINE ; BM384- BR 10$ ; FINISH IN COMMON CODE ; BM384  ; BM3843@$DRGIN::MOV #$DRGN1,R1 ; GET ADDRESS OF REAL ROUTINE ; BM384- BR 10$ ; FINISH IN COMMON CODE ; BM384T ; BM384E@$DRGLI::MOV #$DRGL1,R1 ; GET ADDRESS OF REAL ROUTINE ; BM384- BR 10$ ; FINISH IN COMMON CODE ; BM384P ; BM384TC10$: MOV $DRAPV,KINAR5 ; MAP TO VECTOR COMMON IN I SPACE ; BM384E ; BM384  .IF DF K$$DAS ; BM384C ; BM384 ? MOV $DRAPV,KDSAR5 ; MAP TO VECTOR COMMON IN D SPACE ; BM384M ; BM384M" .ENDC ; DF K$$DAS ; BM384 ; BM384I/ JMP (R1) ; TO PROCESSING ROUTINE ; BM384  ; BM384  .DSABL LSB ; BM384 ; BM384O!;+ ;**-240";**-$DRLOG-LOGICAL NAME TRANSLATION DIRECTIVES#; @$; THIS ENTRY POINT MAPS THE FOURHT COMMON AND TRANSFERS TO THEI%; LOGICAL NAME ROUTINES. SEE MODULE DRLOG FOR DETAILS ON THE OPERATION.C&; ';-( )$DRLOG::*+ .IF DF L$$GCL!N$$DIRT,- .IF DF D$$PAR.1/ MOV $DRAP3,KINAR5 ; MAP THIRD COMMON (I-SPACE) 01 .IF DF K$$DAS213 MOV $DRAP3,KDSAR5 ; MAP THIRD COMMON (D-SPACE)M45 .ENDC ; DF K$$DAS67 .ENDC ; DF D$$PAR8&9 JMP $DRLG1 ; JUMP TO VECTOR COMMON:; .ENDC ; DF L$$GCL!N$$DIRR<= .IF DF L$$GCL> ? .ENABL LSBY@;+IA;**-$DELO1-ROUTINE STUB FILE FOR FOURTH DIRECTIVE COMMON ROUTINE $DELOGEB;L@C; THIS ENTRY POINT MAPS THE FOURTH COMMON AND TRANSFERS TO THED; ROUTINE $DELOG.LE;IF;-G .IFTF ; DF L$$GCLH I$DELO1::JK .IFT ; DF L$$GCL L:M MOV #$DELOG,-(SP) ;GET ADDRESS OF ROUTINE IN 4TH DIRCOMN BR 10$ ;JOIN COMMON CODEOP;+IQ;**-$CRLO1-ROUTINE STUB FILE FOR FOURTH DIRECTIVE COMMON ROUTINE $CRLOGOR;@S; THIS ENTRY POINT MAPS THE FOURTH COMMON AND TRANSFERS TO THET; ROUTINE $CRLOG.-U;1V;-W .IFTF ; DF L$$GCLX Y$CRLO1::Z[ .IFT ; DF L$$GCL\@] MOV #$CRLOG,-(SP) ;GET ADDRESS OF ROUTINE IN DIRECTIVE COMMON^ BR 10$ ;JUMP TO COMMON CODE._`;+Ia;**-$LNTD1-ROUTINE STUB FILE FOR FOURTH DIRECTIVE COMMON ROUTINE $LNTDR;b;D@c; THIS ENTRY POINT MAPS THE FOURTH COMMON 008cbb`TADATADATADATADATADATAAND TRANSFERS TO THEd; ROUTINE $LNTDR.Ue;Sf;-g .IFTF ; DF L$$GCLh i$LNTD1::jk .IFT ; DF L$$GCLEl@m MOV #$LNTDR,-(SP) ;GET ADDRESS OF ROUTINE IN DIRECTIVE COMMONn BR 10$ ;JOIN COMMON CODEop;+Iq;**-$RLRLN-ROUTINE STUB FILE FOR FOURTH DIRECTIVE COMMON ROUTINE $LNTDRDr; @s; THIS ENTRY POINT MAPS THE FOURTH COMMON AND TRANSFERS TO THEt; ROUTINE $RLRL1u;Uv;-w .IFTF ; DF L$$GCLx y$RLRLN::z{ .IFT ; DF L$$GCL |@} MOV #$RTRL1,-(SP) ;GET ADDRESS OF ROUTINE IN DIRECTIVE COMMON~ BR 10$ ;JOIN COMMON CODE;+M; $TBTRN - ROUTINE TO TRANSLATE THE LOGICAL TABLE NUMBER INTO AN HASH TABLER5; OFFSET AND THEN MAP THE HASH TABLE THROUGH KISAR6M;O ; INPUTS:; R3 - TABLE NUMBERU ; OUTPUTS:; CC - SUCCESS:N5; KISAR6 - CONTAINS MAPPING TO START OF HASH TABLEO&; CS - NO HASH TABLE VALUE AVAILABLE; $; R3, KISAR6 ARE DESTROYED BY CALL;F; THIS ROUTINE TAKES THE SPECIFIED LOGICAL TABLE NUMBER AND TURNS ITH; INTO A WORD OFFSET INTO THE HIERARCHY TABLE IN SYSCM. THE HIERARCHYI; TABLE CONTAINS THE SECONDARY POOL POINTERS TO EACH OF THE HASH TABLESHH; IN AN ORDERED, PRECEDENCE-DERIVED SEQUENCE. SINCE THE TABLE NUMBERSG; NO LONGER HAVE ANY PRETENSE OF PRECEDENCE ORDERING, IT IS NECESSARYG; TO HASH THE VALUES INTO THE CORRECT WORD OFFSET. FROM THIS OFFSET,BD; THE APR BIAS OF THE HASH TABLE IS PLACED INTO KISAR6 SO THAT ANYD; 140000-140100 KERNEL DATA REFERENCES WILL ACCESS THE HASH TABLE.;- .IFTF ;DF L$$GCLT $TBTRN:: .IFT ;DF L$$GCL MOV #$TBTRL,-(SP)  BR 10$A;+I;**-$LDEL1-ROUTINE STUB FILE FOR FOURTH DIRECTIVE COMMON ROUTINE $LDELXE;E@; THIS ENTRY POINT MAPS THE FOURTH COMMON AND TRANSFERS TO THE; ROUTINE $LDELX.I;E;- .IFTF ; DF L$$GCL $LDEL1:: .IFT ; DF L$$GCLI7 MOV #$LDELX,-(SP) ; SET ADDRESS TO DIRECTIVE ROUTINE A10$: CALL $MPDC3 ; MAP THE ROUTINE IN THE 3RD DIRECTIVE COMMONS .IFF ; DF L$$GCL SEC .IFTF ; DF L$$GCL  RETURN$  .DSABL LSBT .ENDC ; DF L$$GCL .IF DF P$$3XX;+:; $FLIPM -- THIS ROUTINE COPIES A BUFFER AND INVERTS IT.;T ; INPUTS: 7; R0 = APR 5 ADDRESS OF LAST WD. +2 OF SOURCE BUFFERX; R1 = BIAS OF SOURCE BUFFERG%; R2 = NUMBER OF WORDS TO TRANSFER$,; R3 = APR6 ADDRESS OF TARGET USER BUFFER;E ; OUTPUTS:;; BUFFER IS TRANSFERRED; APR5 BIAS IS NOT RESTORED;- $FLIPM::3 MOV R1,KISAR5 ;SET UP APR5 BIAS OF SOURCE BUFFER#10$: MOV -(R0),(R3)+ ;MOVE A WORD SOB R2,10$ ;LOOP TILL DONE  RETURN$ .ENDC ; DF P$$3XX .MCALL LNMDF$  LNMDF$ MAP5 = 120000 MAP6 = 140000 .IF DF N$$DIRO;+.; $DLCTX -- DELETE A SPECIFIED CONTEXT BLOCK;U ; INPUT:3; R1 = ADDRESS OF THE CONTEXT BLOCK TO BE DELETED ;R ; OUTPUT:U:; USE COUNT IN CONTEXT BLOCK IS DECREMENTED. IF CONTEXT;; BLOCK IS NOT USE BY SOMEONE ELSE, THE SPECIFIED CONTEXT ; BLOCK IS DELETED;0B; ***** NOTE: IT IS THE RESPONSIBILTY OF THE CALLER TO ZERO THE; POINTER TO THE CTX.;3;; REGISTER R1 DESTROYED.;; -M .IFTF ;DF N$$DIR2 $DLCTX:: .IFT MOV R0,-(SP) ;SAVE R0C* MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING$ MOV R1,KISAR6 ;MAP OLD CTX BLOCK+ BEQ 20$ ;IF EQ, NO BLOCK TO DEALLOCATET+ CMPB #1,C.REF+MAP6 ;ONLY ONE REFERENCE?N# BEQ 10$ ;YES, DEALLOCATE BLOCKE( DECB C.REF+MAP6 ;DECREMENT USE COUNT  BR 20$ ;L*10$: MOV R1,R0 ;OLD CONTEXT BLOCK BIAS  CLR R1 ;L( BISB C.DDSL+MAP6,R1 ;GET SIZE OF DDS4 ADD #C.FIXL+77,R1 ;GET FIXED LENGTH PLUS MODULOS( ASH #-6,R1 ;CONVERT INTO 32W BLOCKS$ MOV R2,-(SP) ;SAVE R2 ;RDH010# CALL $DESEC ;DEALLOCATE PACKETT' MOV (SP)+,R2 ;RESTORE R2 ;RDH010B)20$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGL  MOV (SP)+,R0 ;RESTORE R0  RETURNR  ;+. ; $CRCTX -- CREATE A SPECIFIED CONTEXT BLOCK;+'00@cb_c_d_k; R0 = SIZE OF USER BUFFER (IN BYTES)L; R1 = BIAS OF USER BUFFER); R2 = APR5 DISPLACEMENT TO USER BUFFER ;L ; OUTPUT:T; &; R3 = ADDRESS OF NEW CONTEXT BLOCK;T; -M .IFTF ;DF N$$DIRC $CRCTX:: .IFT ;DF N$$DIR* MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING#  MOV R2,-(SP) ;SAVE DISPLACEMENT ! MOV R1,-(SP) ;SAVE BIASP" MOV R0,-(SP) ;SAVE DDS SIZEM## MOV R0,R1 ;GET SIZE OF NEW DDS/$ ADD #C.FIXL+77,R1 ;ADD FIXED SIZE + MODULUST"% ASH #-6,R1 ;CONVERT TO BLOCKS,& CALL $ALSEC ;ALLOCATE BLOCK FOR DDS LNB'' BCS 50$ ;IF CS, ALLOCATION FAILUREF2( MOV R0,R3 ;SET UP SEC. POOL BLK BIAS FOR COPY) MOV R3,KISAR6 ;MAP BLOCK)* CLRB C.REF+MAP6 ;ZERO REFERENCE COUNT:5+ MOV (SP)+,R0 ;SET UP BYTE COUNT OF STRING TO COPYE%, MOVB R0,C.DDSL+MAP6 ;FILL IN SIZEE$- BEQ 10$ ;IF EQ, ZERO LENGTH DDS/. MOVB #1,C.REF+MAP6 ;FILL IN REFERENCE COUNTR/ MOV (SP)+,R1 ;SET UP BIAS%0 MOV (SP)+,R2 ;SET UP DISPLACEMENTO=1 MOV #C.DDS+MAP6,R4 ;SETUP DISPLACEMENT TO STRING IN BLOCKL2 CALL $BLXIO ;COPY DDS 3 BR 20$ ;C$410$: CMP (SP)+,(SP)+ ;CLEAN STACK)520$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGV6 CLC ;INDICATE SUCCESSR7 RETURN ;8$950$: CMP (SP)+,(SP)+ ;CLEAN STACK: MOV (SP)+,R2 ;RESTORE R2%; MOV (SP)+,KISAR6 ;RESTORE MAPPINGS<= .IFTF ;DF N$$DIR,>? SEC ;INDICATE FAILUREF@ RETURN ;AB .ENDC ;DF N$$DIR(CDE .IF DF L$$GCLFG;+EH; $CMPST -- THIS ROUTINE IS USED TO COMPARE A USER SPECIFIED STRINGT6I; AGAINST A CURRENTLY MAPPED LOGICAL NAME BLOCK.J;C K; INPUTS:(1L; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCK;M; BLOCK CONTAINS:'N; WD 1 - BYTE COUNT OF LOGICAL NAME0O; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME8P; WD 3 - APR6 BIASED OFFSET TO START OF LOGICAL NAME.Q; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)*R; BLOCK TYPE NUMBER (HIGH BYTE);S; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLE-T;S=U; THE LOGICAL NAME STRING TO BE COMPARED AGAINST IS MAPPEDG>V; THROUGH APR6. THIS ROUTINE IS ONLY TO BE USED WHEN IT IS@W; KNOWN THAT THE LENGTHS OF THE TWO STRINGS TO BE CHECKED AREX; THE SAME.Y;- Z; OUTPUT:F[;C\; C=0 AND R1 = 0 MATCHD*]; C=0 AND R1 <>0 NO MATCH BUT TRY NEXT0^; C=1 NO MATCH AND EITHER INSERT ON PREVIOUS!_; OR STOP ANY FURTHER SEARCHW`;)a; R2,R3 ARE PRESERVEDb;Rc;-6d$CMPST::MOV KISAR5,-(SP) ;SAVE CURRENT APR5 MAPPINGe MOV R2,-(SP) ;SAVE R2Ef MOV R3,-(SP) ;SAVE R3C1g MOV (R0),R1 ;GET LENGTH OF STRINGS TO VERIFYS0h MOV 4(R0),R3 ;GET APR6 OFFSET TO USER BUFFER"i MOV 2(R0),KISAR5 ;MAP USER LNS.j SUB #20000,R3 ;REDUCE IT TO AN APR5 OFFSET6k MOV #L.NNAM+140000,R2 ;POINT AT LOGICAL NAME STRING:l15$: CALL $CVBUC ;CONVERT NEXT USER CHAR TO UPPER CASE*m CMPB R5,(R2)+ ;COMPARE THE TWO STRINGS3n BLO 30$ ;IF LO INPUT STRING SHOULD OCCUR FIRST-3o BHI 30$ ;IF HI INPUT STRING SHOULD OCCUR LATERI&p SOB R1,15$ ;COMPARE ENTIRE STRING q30$: MOV (SP)+,R3 ;RESTORE R3r MOV (SP)+,R2 ;RESTORE R2,s MOV (SP)+,KISAR5 ;RESTORE KISAR5 MAPPINGt RETURN ;RETURN TO CALLERuvwx;+Cy; $CVBUC - ROUTINE TO CONVERT A SPECIFIED CHARACTER TO UPPER CASE2z;N {; INPUTS:N9|; R3 - POINTER TO NEXT CHARACTER TO DO TRANSLATION UPON }; ~; OUTPUTS:0; R3 - POINTS TO BYTE PAST CHARACTER PROCESSED ; R5 - UPCASED CHARACTER VALUE;- $CVBUC::) CLR R5 ;INITIALIZE THE RETURNED VALUE BISB (R3)+,R5 ;GET THE VALUEI0 CMPB R5,#141 ;CHARACTER IN LOWER CASE RANGE? BLO 10$ ;IF LO NOV5 CMPB R5,#172 ;CHARACTER OUTSIDE LOWER CASE RANGE?E BHI 10$ ;IF HI YES& BICB #40,R5 ;CONVERT TO UPPER CASE 10$: RETURNH;+L; $GTUSR - ROUTINE TO TAKE A RAW UCB ADDRESS, WALK DOWN THE REDIRECT CHAINC; UNTIL A NON-PSEUDO DEVICE IS FOUND, AND THEN PLUG THE USER HASHR?; TABLE ADDRESS WITH THE SECONDARY POOL VALUE FOR THAT DEVICE;R ; INPUTS:E; R1 - RAW UCB ADDRESS;R ; OUTPUTS:D; R1 - UCB A00Hcbb`TADATADATADATADATADATADDRESS OF FIRST DEVICE IN REDIRECT CHAIN THAT IS NOT A; PSEUDO DEVICE=; $USRLG - UPDATED TO HOLD THE U.LOG VALUE OF THE FOUND UCBI;Y;- .IFTF ;DF L$$GCLT $GTUSR::< BIT #DV.PSE,U.CW1(R1) ;CHECK IF SPECIFIED UCB IS A PSEUDO+ BEQ 10$ ;IF EQ, NO, GO AND PLUG $USRLGA7 MOV U.RED(R1),R1 ;GET NEXT DEVICE IN REDIRECT CHAIN " BR $GTUSR ;GO BACK FOR CHECKS10$: .IFT ;DF L$$GCL, CLR $USRLG ;INITIALIZE TO NO HASH TABLE .IFTF ;DF L$$GCLU3 BIT #DV.TTY,U.CW1(R1) ;IS THIS DEVICE A TERMINALC, BEQ 20$ ;IF EQ, NO, LEAVE NO HASH TABLE .IFT ;DF L$$GCL; MOV U.LOG(R1),$USRLG ;SET UP THE USER HASH TABLE ADDRESST .IFTF ;DF L$$GCLP 20$: RETURN  .ENDC ;DF L$$GCL .IF DF D$$PAR ; BM377$ ; BM377R;+ ; BM377 $; **-$DREIF-EXIT IF ; BM377; ; BM377R; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF THE ; BM377L; ISSUING TASK IF, AND ONLY IF, AN INDICATED EVENT FLAG IS CLEAR. ; BM377; ; BM377; DPB FORMAT: ; BM377D; ; BM3770; WD. 00 -- DIC(53.),DPB SIZE(2.). ; BM377J; WD. 01 -- EVENT FLAG NUMBER OF EVENT FLAG THAT MUST BE CLEAR. ; BM377; ; BM377; INPUTS: ; BM377 ; ; BM377); R0=EVENT FLAG MASK WORD. ; BM377;,; R1=EVENT FLAG MASK ADDRESS. ; BM377E; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; BM377 8; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. ; BM377<; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; BM3779; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; BM377S; ; BM377B; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; BM377; ; BM377:; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; BM377F; DIRECTIVE STATUS OF 'D.RS22' IS RETURNED IF THE SPECIFIED ; BM377$; EVENT FLAG IS SET. ; BM377.; C=1 IF DIRECTIVE IS REJECTED. ; BM377D; DIRECTIVE STATUS OF 'D.RS97' IF NO OR AN INVALID EVENT ; BM377*; FLAG NUMBER IS SPECIFIED. ; BM377;- ; BM377S ; BM377R .ENABL LSB ; BM377 ; BM377U4$DREIF::BIT R0,(R1) ;EVENT FLAG CLEAR? ; BM377% BEQ $DREXT ;IF EQ YES ; BM377F1 DRSTS D.RS22 ;SET DIRECTIVE STATUS ; BM377 ; BM377F;+ ; BM377F!; **-$DREXT-EXIT ; BM377 ; ; BM377R; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF THE ; BM377!; ISSUING TASK. ; BM3777; ; BM377; DPB FORMAT: ; BM377 ; ; BM3770; WD. 00 -- DIC(51.),DPB SIZE(1.). ; BM377; ; BM377; INPUTS: ; BM377C; ; BM377E; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; BM377T8; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. ; BM377<; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; BM3779; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; BM377E; ; BM377H; NOTE: THIS DIRECTIVE IS ALSO CALLED FROM THE DISPATCHER AND ; BM377B; THEREFORE ONLY REQUIRES R5 TO BE LOADED ON ENTRANCE. ; BM377; ; BM377H; PRIVILEGED TASKS WHICH DESIRE TO CALL $DREXT DIRECTLY ; BM377F; SHOULD SWITCH TO SYSTEM STATE AND IMMEDIATELY CALL $DREXT ; BM377:; WITHOUT CALLING ANY OTHER EXEC SUBROUTINES. ; BM377:; THIS IS BECAUSE OF POSSIBLE SIDE EFFECTS OF ; BM3775; OTHER EXEC ROUTINES (SUCH AS $TSKRP). ; BM377M; ; BM377<; BECAUSE MANY PRIVILEGED TASKS CALL $DREXT, WE ; BM377>; WILL UNCONDITIONALLY MAP THE TASK HEADER SO THAT ; BM377=; THIS CODE DOES NOT HAVE TO BE ADDED ELSEWHERE. ; BM377D; ; BM377; ; BM377B; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; BM377; ; BM377K; NO STATUS IS RETURNED TO THE ISSUING TASK SINCE THIS DIRECTIVE ; BM377O*; TERMINATES ITS EXECUTION. ; BM377;- ; BM377  ; BM377($DREXT:: ;REFERE00Pcb_c_d_kNCE LABEL ; BM377 ; BM377D .IF DF X$$HDR ; BM377O ; BM377A7 MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADER ; BM377T ; BM377 " .ENDC ; DF X$$HDR ; BM377 ; BM377 .IF DF P$$OFF ; BM377P ; BM377 7 BIT #T3.ACP,T.ST3(R5) ;IS TASK AN ACP? ; BM377 * BNE $DREX1 ;IF NE YES ; BM377@ MOV #EX$SUC,T.EFLG+2(R5) ;SET SUCCESSFUL EXIT STATUS ; BM377K$DREX2::MOV #S.CEXT,T.EFLG(R5) ;SET SUCCESS CODE IN ABORT CODE ; BM377  ; BM377. .ENDC ; BM377 ; BM3777 ; BM377A?$DREX1::MOV $DRAPR,KINAR5 ;MAP THE DIRECTIVE COMMON ; BM377. ; BM377 5 JMP $DREX3 ;AND GO THERE TO FINISH EXIT ; BM377  ; BM377  .PAGE ; BM377 ; BM377A;+ ; BM377B&; **-$TRTRP-TRAP TRAP ; BM377; ; BM377R; THIS ROUTINE IS TRAPPED TO WHEN A TRAP INSTRUCTION IS EXECUTED. IF THE ; BM377Q; STACK DEPTH IS ZERO, THEN A DIRECTIVE STATUS IS TO BE RETURNED. ELSE ; BM3777I; CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE. ; BM377M; ; BM377; INPUTS: ; BM377M; ; BM3778; 2(SP)=PS WORD PUSHED BY TRAP INSTRUCTION. ; BM3778; 0(SP)=PC WORD PUSHED BY TRAP INSTRUCTION. ; BM377; ; BM377; OUTPUTS: ; BM377; ; BM377L; IF THE STACK DEPTH IS ZERO, THEN A DIRECTIVE STATUS IS RETURNED. ; BM377L; ELSE CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE. ; BM377;- ; BM377O ; BM377O .ENABL LSB ; BM377 ; BM377 5$TRTRP::TST $STKDP ;;;STACK DEPTH ZERO? ; BM377 & BNE $EMTRP ;;;IF NE NO ; BM377? MOV (SP)+,R0 ;;;GET ADDRESS + 2 OF TRAP INSTRUCTION ; BM377I4 MFPI -(R0) ;;;PICK UP TRAP INSTRUCTION ; BM377B MOV $DRAPR,KINAR5 ;;;MAP TO DIRECTIVE COMMON (I SPACE) ; BM377A JMP $TRTR1 ;;;CONTINUE PROCESSING IN DIRECTIVE COMMON ; BM377R ; BM377H;+ ; BM377 %; **-$EMTRP-EMT TRAP ; BM377O; ; BM377R; THIS ROUTINE IS TRAPPED TO WHEN AN EMT INSTRUCTION IS EXECUTED. IF THE ; BM377N; STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED. ELSE A TEST IS ; BM377O; MADE TO SEE IF THE EMT INSTRUCTION HAD A CODE OF 377. IF NOT, THEN ; BM377PQ; CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE. ELSE THE ; BM377;3; APPROPRIATE DIRECTIVE IS EXECUTED. ; BM377C; ; BM377; INPUTS: ; BM377 ; ; BM3777; 2(SP)=PS WORD PUSHED BY EMT INSTRUCTION. ; BM3777; 0(SP)=PC WORD PUSHED BY EMT INSTRUCTION. ; BM377X; ; BM377; OUTPUTS: ; BM377; ; BM377K; IF THE STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED. ELSE ; BM377DO; CONTROL IS GIVEN TO THE EMT/TRAP SST ROUTINE OR A DIRECTIVE ROUTINE ; BM377A>; DEPENDENT ON WHETHER THE EMT HAD A CODE OF 377. ; BM377;- ; BM377C ; BM3777; ; BM377J; DETERMINE IF LEGITIMATE ENTRY FROM USER STATE. IF NOT, CRASH ; BM377; ; BM377 ; BM377M<$EMTRP::TST $STKDP ;;;ARE WE AT STACK DEPTH +1? ; BM377# BGT 2$ ;;;IF GT YES ; BM3777. JMP $CREMT ;;;ELSE CRASH SYSTEM ; BM377:2$: DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITY ; BM377@ MOV $DRAPR,KINAR5 ;MAP TO DIRECTIVE COMMON (I SPACE) ; BM377A JMP $EMTR1 ;;;CONTINUE PROCESSING IN DIRECTIVE COMMON ; BM377  ; BM377 J; ROUTINES USED BY DISPATCHER TO CALL OTHER COMMONS THAN FIRST ; BM377 ; BM377;<$DRCL2::MOV $DRAP2,KINAR5 ;MAP TO SECOND COMMON ; BM377 ; BM377  .IF DF K$$DAS ; BM377B ; BM377 5 MOV $DRAP2,KDSAR5 ;MAP IN D-SPACE ALSO ; BM3773 ; BM377;" .ENDC ; DF K$$DAS ; BM377 ; BM377I) CALL @2(SP) ;CALL ROUTINE ; BM377B; MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACE ; BM377O- MOV (SP)+,(SP) ;COLLAPSE STACK 00XcZcb`TADATADATADATADATADATA; BM377U. RETURN ;AND BACK TO DISPATCHER ; BM377 ; BM377 ;$DRCL3::MOV $DRAP3,KINAR5 ;MAP TO THIRD COMMON ; BM377O) CALL @2(SP) ;CALL ROUTINE ; BM377D; MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACE ; BM377,- MOV (SP)+,(SP) ;COLLAPSE STACK ; BM377 . RETURN ;AND BACK TO DISPATCHER ; BM377 ; BM3777 ; BM384CB$FINDR::MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACE ; BM384: JMP $DRFIN ;AND JUMP TO DISPATCHER COMPLETION ; BM384 ; BM384A" .ENDC ; DF D$$PAR ; BM384 ; BM384 .ENDDRAP3,KINAR5 ;MAP TO THIRD COMMON ; BM377O) CALL @2(SP) ;CALL ROUTINE ; BM377D; MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACE ; BM377,- MOV (SP)+,(SP) ;COLLAPSE STACK ; BM377 . RETURN ;AND BACK TO DISPATCHER ; BM377 ; BM3777 ; BM384CB$FINDR::MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACE ; BM384: JMP $DRFIN ;AND JUMP TO DISPATCHER COMPLETION ; BM3 .TITLE ERSUB0 .IDENT /02.06/3;DI; COPYRIGHT (C) 1983, 1984, 1985, 1986 BY DIGITAL EQUIPMENT CORPORATIONU; ALL RIGHTS RESERVED.;R>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;N ;$ ; P. J. BEZEREDI 16-NOV-81 ;E; ;?; J. R. KAUFFMAN ; C. PUTNAM,; S. C. ADAMS ; G. MARIGOWDA;3; ; MODIFIED BY:;W; G. MARIGOWDA 14-JUL-86>; CHANGE THE STACK OFFSET TO ACCESS APR5 MAPPING V02.06;;D3; 4; ERROR LOGGING SUBROUTINES 5;B67; 8; MACRO LIBRARY CALLS9; :: .MCALL CLKDF$,EPKDF$,F11DF$,HDRDF$,HWDDF$,PKTDF$,UCBDF$; .MCALL BGCK$A'< CLKDF$ ;DEFINE CLOCK QUEUE OFFSETSE(= EPKDF$ ;DEFINE ERROR PACKET OFFSETS$> F11DF$ ;DEFINE FILES-11 OFFSETS'? HDRDF$ ;DEFINE TASK HEADER OFFSETSP!@ HWDDF$ ;DEFINE CPU REGISTERSR&A PKTDF$ ;DEFINE I/O PACKET OFFSETSB UCBDF$ ;DEFINE UCB OFFSETSCD;AE; EQUATED SYMBOLSTF;EGHERRTIM= H$$RTZ*2 ;2 SECONDSIIOC= X.IOC+140000 ;I/O COUNTI(JERHL= X.ERHL+140000 ;HARD ERROR LIMIT(KERSL= X.ERSL+140000 ;SOFT ERROR LIMIT(LERSC= X.ERSC+140000 ;SOFT ERROR COUNT(MERHC= X.ERHC+140000 ;HARD ERROR COUNT,NASSUME ERSC, IOC+6 ;ORDERING IS IMPORTANT1OASSUME X.WCNT, X.IOC+10 ;WORDS TRANSFERED COUNT 2PASSUME X.CYLC, X.IOC+14 ;CYLINDERS CROSSED COUNT/QASSUME V.PKSR, V.LABL+12. ;PACK SERIAL NUMBERERSTU .IF DF E$$LOGVW;+ X; **-$DVER1-LOG A DEVICE ERRORY;FZ; THIS ROUTINE IS CALLED TO LOG A DEVICE ERROR. AN ERROR LOG PACKETE[; WILL BE ALLOCATED AND THE CONTEXT OF THE CURRENT TRANSFER WILL BELI\; SAVED. IF AN ERROR IS ALREADY IN PROGRESS FOR THIS DEVICE, THE ERRORDI]; WILL BE IGNORED. INFORMATION CONCERNING ALL ACTIVE DEVICES WILL ALSO, ^; BE SAVED.S_;SH`; THE ERROR CODE IS SETUP TO MARK THIS AS A HARD DEVICE ERROR. IF THEFa; OPERATION IS SUCCESSFUL, THE CODE WILL BE CHANGED TO A SOFT DEVICE/b; ERROR WHEN THE I/O OPERATION IS TERMINATED.c;H d; INPUTS: e;D<f; R2=ADDRESS OF THE BLOCK OF REGISTERS TO LOG (MUST BE THE$g; CSR ADDRESS IF KS.MBC IS SET)h; R4=SCB ADDRESSi; R5=UCB ADDRESSj;A k; OUTPUTS:l;F>m; IF THIS IS THE FIRST OCCURENCE OF THE ERROR, THE ERROR LOG=n; PACKET IS FILED AND THE SCB IS SET TO POINT TO THE PACKET1o; ADDRESS AND THE ERROR IN PROGRESS BIT IS SET.Vp;R&q; NOTE: ALL REGISTERS ARE PRESERVED.r;- s .ENABL LSBHtu .IFTF ; DF E$$LOGvw$DVER1:: ;LOG DEVICE ERRORxy .IFT ; DF E$$LOGUz{ MOV R0,-(SP) ;SAVE REGISTER8| MOV #E$CERR+<400*E$SDVH>,R0 ;GET THE HARD ERROR CODE'} BR 10$ ;JOIN COMMON PROCESSING CODE ~ .IFTF ; DF E$$LOG $DVTM2:: .IFT ; DF E$$LOGO MOV R0,-(SP) ;SAVE REGISTERB MOV #E$CERR+<400*E$STMO>,R0 ;SET UP THE ERROR LOG PACKET FOR...! ;... A DEVICE TIMEOUT ERROR *10$: CALL LOGTST ;CAN WE LOG THE ERROR? BCS 50$ ;IF CS NON MOV R1,-(SP) ;SAVE REGISTERSG MOV R2,-(SP) ;;00`cb_c_d_k MOV R3,-(SP) ;= MOV #SM.HDR!SM.DID!SM.DOP!SM.DAT!SM.DAC,R2 ;SET FLAGS ...M+ ;... HEADER SUBPACKET, DEVICE ID, ...O+ ;... DEVICE OPERATION, DATA, ACTIVITYD: MOVB S.RCNT(R4),R1 ;GET THE NUMBER OF REGISTERS TO SAVE- ASL R1 ;CONVERT IT INTO A NUMBER OF BYTES, MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS1 BIT #KS.MBC,K.STS(R3) ;BAE REGISTERS PRESENT?R BEQ 30$ ;IF EQ NOO2 ADD #4,R1 ;YES, ADD SPACE FOR 2 MORE REGISTERS$ BIS #SM.MBC,R2 ;FLAG IT FOR LATER?30$: MOVB S.ROFF(R4),R3 ;GET THE OFFSET TO THE FIRST REGISTERP2 ADD 2(SP),R3 ;COMPUTE ACTUAL START OF REGISTERS;E$; AT THIS POINT THE REGISTERS ARE:;T); R0 = ENTRY TYPE CODE AND SUBTYPE CODE ,; R1 = LENGTH OF DEVICE REGISTERS IN BYTES; R2 = CONTROL MASK WORD.; R3 = BEGINNING ADDRESS OF DEVICE REGISTERS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;S" MOV KISAR6,-(SP) ; SAVE MAPPING" CALL $CRPK1 ;CREATE THE PACKET BCS 45$ ;IF CS FAILURE9 CMP R0,#E$CERR+<400*E$STMO> ;IS THIS A TIMEOUT ERROR?F BNE 40$ ;IF NE NOE3 MOVB S.ROFF(R4),R2 ;GET OFFSET TO FIRST REGISTERS ASL R2 ;CONVERT IT TO BYTES 4 SUB R2,R1 ;COMPUTE ADDRESS TO STORE CSR CONTENTS7 MOV $DVSAV,(R1) ;PUT SAVED CSR CONTENTS IN SUBPACKET:40$: MOV R3,S.EMB(R4) ;SAVE THE ERROR LOG PACKET ADDRESS.45$: MOV (SP)+,KISAR6 ; RESTORE APR6 MAPPING# MOV (SP)+,R3 ; RESTORE REGISTERS( MOV (SP)+,R2 ; MOV (SP)+,R1 ;E50$: MOV (SP)+,R0 ;4 .ENDC ; DF E$$LOG5 BIS #S2.EIP,S.ST2(R4) ;INDICATE ERROR IN PROGRESS$" CLC ;INDICATE NO UMD FUNCTION RETURN ;F .DSABL LSBA;+@; **-$LGER1-LOG AN ERROR LOG PACKET (NO ERROR NEED BE PRESENT);SF; THIS ROUTINE IS CALLED BY DRIVERS THAT WISH TO CREATE AN ERROR LOGG; PACKET WHEN NO ERROR IS PRESENT, I.E. FOR AN UNSOLICITED INTERRUPT. H; THE PACKET WILL BE CREATED AND THE DRIVER IS RESPONSIBLE FOR FILLING&; IN THE NECESSARY DATA INFORMATION.; ; INPUTS:N;D+; R1=LENGTH OF DATA TO BE LOGGED IN BYTESI:; R4=SCB ADDRESS (IF ZERO THEN NO I/O PACKET IS PRESENT); R5=UCB ADDRESS; ; OUTPUTS:;0; C=1 IF ERROR CANNOT BE LOGGED FOR ANY REASON; C=0 IF ERROR CAN BE LOGGED0; R1=ADDRESS OF DATA AREA IN ERROR LOG PACKET#; R3=ADDRESS OF ERROR LOG PACKETR; ; R4 AND R5 ARE PRESERVEDT; R0, R2 AND R3 ARE DESTROYEDL.; APR6 MAPPING DESTROYED: KISAR6 MAPS PACKET;- .IF DF E$$LOG,$LGER1::CALL LOGTST ;CAN WE LOG THE ERROR BCS 20$ ;IF CS NOG: MOV #E$CDVI+<400*E$SDVI>,R0 ;ASSUME DEVICE INFORMATION2 MOV #SM.HDR!SM.DID!SM.DAT!SM.DAC,R2 ;SET FLAGS& TST R4 ;DO WE HAVE AN SCB ADDRESS? BEQ 10$ ;IF EQ NO=2 BIS #SM.DOP,R2 ;YES, LOG I/O PACKET INFORMATION/ MOV #E$CERR+<400*E$SDVH>,R0 ;SET HARD ERRORL/10$: CLR R3 ;DO NOT FILL DATA SUBPACKET AREA, CALL $CRPK1 ;CREATE THE ERROR LOG PACKET BCS 20$ ;IF CS FAILURE, TST R4 ;DO SE HAVE AN SCB ADDRESS? (C=0) BEQ 20$ ;IF EQ NO 2 MOV R3,S.EMB(R4) ;SAVE ERROR LOG PACKET ADDRESS0 BIS #S2.EIP,S.ST2(R4) ;SET ERROR IN PROGRESS20$: RETURN ;I;+(; **-LOGTST-SEE IF WE CAN LOG AN ERROR; D; THIS ROUTINE WILL CHECK TO SEE IF THE ERROR CANNOT BE LOGGED. IFD; LOGGING IS OFF, OR IF THERE IS ALREADY AN ERROR IN PROGRESS, OR G; IF BOTH LIMITS HAVE BEEN REACHED, THE PACKET WILL BE REJECTED HERE H; INSTEAD OF LATER IN $FERL1 THE ERROR SEQUENCE NUMBER IS INCREMENTED C; IF LOGGING IS ON AND THERE IS NOT ALREADY AN ERROR IN PROGRESS.V;O ; INPUTS:A;S$; R4=SCB ADDRESS OF ZERO IF NO SCB; R5=UCB ADDRESS;R ; OUTPUTS:;*; C=0 IF ERROR CAN POTENTIALLY BE LOGGED!; C=1 IF ERROR CANNOT BE LOGGEDE;--LOGTST: MOV KISAR6,-(SP) ;SAVE APR6 MAPPINGR2 BIT #ES.LOG,$ERFLA ;IS ERROR LOGGING TURNED ON? BEQ 20$ ;IF EQ NON TST R4 ;SCB PRESENT? BEQ 5$ ;IF EQ NO@ BIT #S2.EIP!S2.ENB,S.ST2(R4) ;ERROR IN PROGRESS/LOGGING OFF? BNE 20$ ;IF NE YES"5$: INC $ERRSQ ;COUNT THE ERROR,  BITB #ES.LIM,$ERFLA ;IS LIMIT00hcZcb`TADATADATADATADATADATAING ENABLED?  BEQ 10$ ;IF EQ NOI>  MOV U.UCBX(R5),KISAR6 ;MAP UCB EXTENSION IN SECONDARY POOL  BEQ 10$ ;IF EQ NO EXTENSIOND2  CMPB ERHC,ERHL ;IS THE HARD THRESHOLD EXCEEDED? BLO 10$ ;IF LO NO;2 CMPB ERSC,ERSL ;IS THE SOFT THRESHOLD EXCEEDED? BHIS 20$ ;IF HIS YES"10$: TST R4 ;DO WE HAVE AN SCB? BEQ 30$ ;IF EQ NOE- CLR S.EMB(R4) ;INDICATE NO PACKET JUST YETN  BR 30$ ;"20$: SEC ;CANNOT LOG THE ERROR-30$: MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPINGI  RETURN ;M .ENDC ; DF E$$LOG;+*; **-$FERL1-FINISH ERROR LOGGING PROCESS;EC; THIS ROUTINE IS CALLED AT I/O DONE TIME OR WHEN IT IS NECESSARY A ; TO QUEUE AN ERROR LOG PACKET AFTER A SUCCESSFUL RECOVERY OF AE!; MID-TRANSFER ERROR.D";E #; INPUTS: $; R0=FIRST I/O STATUS WORD,%; R2=STARTING AND FINAL ERROR RETRY COUNTS(&; R3=ERROR LOG PACKET APR BIAS IF R4=0'; R4=SCB ADDRESS OR ZERO(; R5=UCB ADDRESS);R *; OUTPUTS:3+; THE ERROR PACKET IS QUEUED TO THE ERROR LOGGER.),; THE ERROR IN PROGRESS BIT IS CLEARED. -;E.; R1 AND R2 ARE DESTROYED./;-0*1$FERL1:: ;FINISH ERROR LOGGING PROCESS234 .IF DF E$$LOG5"6 MOV KISAR6,-(SP) ; SAVE MAPPING7 MOV R3,-(SP) ;SAVE REGISTER8 TST R4 ;DO WE HAVE AN SCB?+9 BEQ 5$ ;IF EQ NO, R3 HAS PACKET ADDRESS24: MOV S.EMB(R4),R3 ;GET ADDRESS OF ERROR LOG PACKET; BEQ 40$ ;IF EQ NO PACKET!<5$: MOV R0,-(SP) ;SAVE REGISTERB = MOV R3,KISAR6 ; MAP TO PACKET3> MOV @#140004+E$HSBF,R1 ; GET SUBPACKET MASK WORD ? MOV R4,-(SP) ;SAVE R4.@ ROR R1 ;HEADER SUBPACKET IS ALWAYS PRESENT?A MOV #E$HLEN+4,R4 ;ACCOUNT FOR THE LINK WORD, THE LENGTH WORD)B ;...AND THE HEADER SUBPACKET LENGTHA*C ROR R1 ;IS THE TASK SUBPACKET PRESENT?D BCC 6$ ;IF CC - NOT PRESENT8E ADD #E$TLEN,R4 ;ACCOUNT FOR THE TASK SUBPACKET LENGTH2F6$: ROR R1 ;IS THE DEVICE ID SUBPACKET PRESENT?G BCC 7$ ;IF CC - NOT PRESENTS=H ADD #E$ILEN,R4 ;ACCOUNT FOR THE DEVICE ID SUBPACKET LENGTH19I7$: ROR R1 ;IS THE DEVICE OPERATION SUBPACKET PRESENT? J BCC 8$ ;IF CC - NOT PRESENTA3K ADD #E$ORTY,R4 ;GET TO THE "RETRY COUNTS" OFFSETF+L ;...IN THE DEVICE OPERATION SUBPACKET.,M ADD #140000,R4 ; POINT R4 TO RETRY COUNTS0N MOV R2,(R4) ;...AND INSERT THE RETRY COUNTS O8$: MOV (SP)+,R4 ;RESTORE R4P TST R2 ;ANY RETRY COUNTS?E(Q BEQ 30$ ; IF EQ DO NOT UPDATE COUNTS>R MOV U.UCBX(R5),KISAR6 ;MAP UCB EXTENSION IN SECONDARY POOLS BEQ 30$ ;IF EQ NO EXTENSIOND*T MOV #ERHC,R2 ;POINT TO HARD ERROR COUNT!U TSTB R0 ;SUCCESSFUL FUNCTION?V BMI 10$ ;IF MI NO W*X MOV #ERSC,R2 ;POINT TO SOFT ERROR COUNTY10$:-Z BITB #ES.LIM,$ERFLA ; IS LIMITING ENABLED?C9[ BEQ 25$ ; IF EQ NO, DON'T TEST LIMITS OR UPDATE COUNTR:\ CMPB (R2),-2(R2) ;IS THE THRESHOLD EQUALED OR EXCEEDED?] BLO 15$ ;IF LO NO ^; J_; THE LIMIT (HARD OR SOFT) HAS ALREADY BEEN REACHED. DISCARD THE PACKET.`;6a MOV R3,KISAR6 ; REMAP PACKET *b MOV R3,R0 ; SET UP FOR DESEC (POINTER))c MOV @#140002, R1 ; GET LENGTH IN BYTEST<d ADD #77+4,R1 ; ACCOUNT FOR LINK AND LENGTH AND TRUNCATION*e ASH #-6,R1 ; CONVERT TO 32 WORD BLOCKS+f CALL $DESEC ; DEALLOCATE SECONDARY POOLA&g BR 37$ ;...AND FINISH THE CLEAN UPh;MJi; THE LIMIT (HARD OR SOFT) HAS NOT BEEN REACHED. UPDATE THE APPROPRIATE j; COUNTER.k;I&l15$: INCB (R2) ;COUNT ANOTHER ERROR-m INCB (R2) ;ADD ONE MORE FOR OVERFLOW TESTEn BNE 20$ ;IF NE NO OVERFLOW$o DECB (R2) ;NORMALIZE ERROR COUNTp20$: DECB (R2) ;...%q CMPB (R2), -2(R2) ; LIMIT REACHED?r BNE 25$ ; BR IF NO&s MOV R3, KISAR6 ; MAP BACK TO PACKET1t BISB #EH$LMR, E$HFLG+140004 ; YES. TELL ERRLOGS!u25$: CMP R2,#ERHC ; HARD ERROR?v BEQ 30$ ; BR IF YESHw MOV R3,KISAR6 ; REMAP PACKETH2x CMPB #E$STMO,E$HTYS+140004 ;WAS THIS A TIMEOUT?4y BEQ 27$ ;IF EQ - YES, SO CONVERT TO SOFT TIMEOUT4z MOVB #E$SDVS, E$HTYS+140004 ; SET SOFT ERROR CODE{ BR 30$ ; GO TO QUEUE PACKETR;|27$: MOVB #E$STMS,E$HTYS+140004 ;MAKE THIS A SOFT TIMEOUT }30$:(~ CALL $QUPK1 ; QUEUE THE ERROR 00pcb_c_d_kPACKET&37$: MOV (SP)+,R0 ;RESTORE REGISTERS40$: MOV (SP)+,R3 ;B% MOV (SP)+,KISAR6 ; RESTORE MAPPINGE .ENDC ; DF E$$LOG TST R4 ;DO WE HAVE AN SCB? BEQ 50$ ;IF EQ NOR7 BIC #S2.EIP,S.ST2(R4) ;CLEAR ERROR IN PROGRESS FLAGI* CLR S.EMB(R4) ;SHOW NO ERROR LOG PACKET50$: RETURN ;;+%; **-$CRPK1-CREATE ERROR LOG PACKET;0I; THIS ROUTINE IS CALLED TO CREATE AN ERROR LOG PACKET, EITHER FROM THEFI; SEND MESSAGE DIRECTIVE PROCESSING, OR WITHIN THE EXECUTIVE AS PART OFPF; THE PROCESSING OF A MEMORY ERROR, NONSENSE INTERRUPT, TIME CHANGE,); POWER FAIL RECOVERY, OR DEVICE ERROR.; ; INPUTS:;; ; R0=PACKET CODE; R1=LENGTH OF DATA SUBPACKETS; R2=CONTROL MASK WORD3; R3=BEGINNING ADDRESS OF DATA FOR DATA SUBPACKETA'; R4=TCB ADDRESS (FOR TASK SUBPACKET)8; R5=UCB ADDRESS (FOR DEVICE IDENTIFICATION SUBPACKET); ; OUTPUTS:; ; R0=UNCHANGED8; R1=BEGINNING ADDRESS OF DATA SUBPACKET DATA (OFFSET); R2=UNCHANGED.; R3=BEGINNING ADDRESS OF PACKET (APR VALUE); R4=UNCHANGED; R5=UNCHANGED;; C=0 IF A PACKET WAS CREATEDE#; C=1 IF A PACKET WAS NOT CREATED; KISAR6 MAPS PACKET;T; OUTPUT PACKET FORMAT:2;R5; +-----------------------------------------------+ '; | RESERVED FOR PACKET LINK WORD |S5; +-----------------------------------------------+O5; | PACKET LENGTH (LENGTH OF REMAINDER OF PACKET) |D5; +-----------------------------------------------+E; | HEADER SUBPACKET |B ; . .; ; | |5; +-----------------------------------------------+ ; | OTHER SUBPACKETS | ; . .; ; | |5; +-----------------------------------------------+2;- .IF DF E$$LOG*$CRPK1::MOV R5,-(SP) ;SAVE ALL REGISTERS MOV R4,-(SP) ;... MOV R3,-(SP) ;... MOV R2,-(SP) ;... MOV R1,-(SP) ;... MOV R0,-(SP) ;...;DB; CHECK FOR TYPE OF SUBPACKET. NOTE THAT THERE WILL ALWAYS BE AA; HEADER SUBPACKET. AN EXTRA 4 BYTES IS ADDED TO THE LENGTH OF|@; THE HEADER SUBPACKET TO ACCOUNT FOR THE PRECEEDING LINK WORD; AND PACKET LENGTH.( ROR R2 ;BYPASS HEADER SUBPACKET FLAG BCS 5$ ;IF CS IT'S THERE7 BGCK$A BF.ERR,BE.HSP,FATAL ;HEADER SUBPACKET PROBLEM::5$: MOV #E$HLEN+4,R1 ;ADD IN THE LENGTH OF THE SUBPACKET& ROR R2 ;CHECK FOR A TASK SUBPACKET$ BCC 10$ ;IF CC NO TASK SUBPACKET. ADD #E$TLEN,R1 ;ADD IN THE SUBPACKET LENGTH/10$: ROR R2 ;CHECK FOR A DEVICE ID SUBPACKETB) BCC 20$ ;IF CC NO DEVICE ID SUBPACKETE. ADD #E$ILEN,R1 ;ADD IN THE SUBPACKET LENGTH020$: ROR R2 ;CHECK FOR A DEVICE OP. SUBPACKET* BCC 30$ ;IF CC NO DEVICE OP. SUBPACKET. ADD #E$OLEN,R1 ;ADD IN THE SUBPACKET LENGTH;,); CHECK FOR A DEVICE ACTIVITY SUBPACKET ;EG; IF THERE IS A DEVICE ACTIVITY SUBPACKET, THERE WILL BE ONE ENTRY INSE; THE SUBPACKET FOR EACH ACTIVE DEVICE (LESS ONE IF THERE IS ALSO AIC; DEVICE OPERATION SUBPACKET) PLUS THE PREFIX HEADER LENGTH WORD.E;530$: ROR R2 ;CHECK FOR A DEVICE ACTIVITY SUBPACKET / BCC 60$ ;IF CC NO DEVICE ACTIVITY SUBPACKETC< BIT #SM.DOP,4(SP) ;IS THERE A DEVICE OPERATION SUBPACKET? BNE 35$ ;IF EQ NOL CLR R5 ;CLEAR FOR NO UCB&35$: MOV R5,R0 ;SAVE FOR COMPARISON. MOV #$SCDVT,-(SP) ;SETUP FOR COROUTINE CALL%40$: CALL @(SP)+ ;GET THE NEXT UCBE BCS 50$ ;IF CS NO MORE% MOV S.ST2(R4),R3 ;COPY STATUS BITSH COM R3 ;REVERSE THEM7 BIT #S2.LOG!S2.ACT,R3 ;ACTIVE ERROR LOGGING DEVICE?E BNE 40$ ;IF NE NOR CMP R5,R0 ;IS THIS OUR UCB?U) BEQ 40$ ;IF EQ YES, IGNORE THIS ENTRYV% ADD #E$ALEN,R1 ;YES, COUNT THE I/OS BR 40$ ;LOOP250$: ADD #2,R1 ;ADD IN THE LENGTH OF THE PREFIX; ; CHECK FOR A DATA SUBPACKET;O*60$: ROR R2 ;CHECK FOR A DATA SUBPACKET$ BCC 70$ ;IF CC NO DATA SUBPACKET3 ADD 2(SP),R1 ;ADD IN THE LENGTH OF THE SUBPACKETS, ADD #2,R1 ;ADD IN THE PREFIX LENGTH WORD;; ALLOCATE THE PACKET ;V770$: CMP #512.,R1 ;I00xcZcb`TADATADATADATADATADATAS THE PACKET A REASONABLE LENGTH?0 BLO 75$ ;IF LO NO;4(; CONVERT FROM BYTES TO 32 WORD BLOCKS;L!  MOV R1,-(SP) ; SAVE BYTE VALUE0*  ADD #77,R1 ; COMPENSATE FOR TRUNCATION  ASH #-6,R1 ; CONVERT)  CALL $ALSEC ; ALLOCATE SECONDARY POOL$  MOV (SP)+,R1 ; RESTORE BYTE VALUE BCC 80$ ;IF CC WE GOT IT975$: CALLR PKTXIT ;FAILURE, RESTORE REGISTERS AND EXITE480$: MOV R0,-(SP) ;SAVE THE ADDRESS FOR FUTURE USE/ MOV 14(SP),R5 ;RETRIEVE POSSIBLE UCB ADDRESSC;R; CREATE THE PACKETO; ; AT THIS POINT:; ;; R0=ADDRESS OF ALLOCATED BLOCK (TO BE USED AS APR VALUE) ; R1=LENGTH OF ALLOCATED BLOCK; R2=UNDEFINED; R3=UNDEFINED; R4=UNDEFINED; R5=UCB ADDRESS;  7!; AFTER SAVING THE APR6 MAPPING ON THE STACK WE HAVE: ";V4#; 0(SP) SAVED APR6 MAPPING (WILL NOT BE RESTORED),$; 2(SP) SAVED APR BIAS OF ALLOCATED BLOCK%; 4(SP) SAVED ENTRY CODE &&; 6(SP) SAVED DATA SUBPACKET LENGTH"'; 10(SP) SAVED CONTROL WORD MASK(; 12(SP) SAVED DATA ADDRESS); 14(SP) SAVED TCB ADDRESS*; 16(SP) SAVED UCB ADDRESS+; ,;E- .CREPKT:L-/ MOV KISAR6,-(SP) ; SAVE APR6 ON THE STACKU0;N 1 MOV R0,KISAR6 ; MAP TO PACKET2 MOV #140000,R0 ; USE APR 6#3 CLR (R0)+ ; SETUP THE LINK WORD 14 SUB #4,R1 ;THE DATA LENGTH IS LESS THE HEADER )5 MOV R1,(R0)+ ;PUT IN THE PACKET LENGTHS16 MOV #E$HLEN,(R0)+ ;PUT IN THE SUBPACKET LENGTHE17 MOV 10(SP),R2 ;GET THE SAVED CONTROL MASK WORD-8 MOV R2,(R0)+ ;INSERT IT INTO THE SUBPACKETS09 MOV #6+,(R0)+ ;INSERT M-PLUS CODE1: MOV $SYSID,(R0)+ ;INSERT SYSTEM IDENTIFICATIONP; MOV $SYSID+2,(R0)+ ;...<=;6@>; INSERT THE FLAGS WORD, THE ENTRY AND ERROR SEQUENCE NUMBERS,=?; AS WELL AS THE ENTRY CODE, TIME STAMP, PROCESSOR AND URM.S@;,A<B MOV #EH$NOR!<*400>,R3 ;CREATE FLAGS-C BIT #HF.QB,$HFMSK ;IS THIS A Q-BUS SYSTEM?ND BEQ 5$ ;IF EQ NO, SO GO ON0E BIS #,R3;YES, SO SET THE FLAG BIT/F5$: MOV R3,(R0)+ ;NOW PUT IT IN THE SUBPACKET#$G INC $ENTSQ ;COUNT THE NEXT ENTRYH MOV $ENTSQ,(R0)+ ;WRITE IT 4I MOV $ERRSQ,(R0)+ ;PUT IN THE ERROR SEQUENCE COUNT:J MOV 4(SP),(R0)+ ;PUT IN THE ENTRY TYPE CODE AND SUBCODE:K MOV #$TTNS-<6*2>,R3 ;GET THE POINTER TO THE SYSTEM TIME5L MOV #6,R1 ;GET THE NUMBER OF PARAMETERS TO INSERTE:M10$: MOVB (R3)+,(R0)+ ;INSERT THE ITEM IN THE TIME STAMP"N TSTB (R3)+ ;POINT AT NEXT ITEM O SOB R1,10$ ;LOOP UNTIL DONE.6P MOVB $PRMOD,(R0)+ ;PUT IN THE PROCESSOR INFORMATION'Q CLRB (R0)+ ;CLEAR THE RESERVED BYTE RST .IF DF M$$PROU'V MOV @$CPURM,(R0)+ ;GET PROCESSOR URMRWX .IFF ; DF M$$PROUYZ MOV #1,(R0)+ ;ASSUME CPAU[\ .ENDC ; DF M$$PRO]^+_ ROR R2 ;DISCARD THE FLAG FOR THE HEADERO`a;Eb; CREATE THE TASK SUBPACKETNc; d;Re; AT THIS POINT:f;:4g; R0=POINTER TO NEXT FREE ENTRY IN ALLOCATED BLOCKh; R1=UNDEFINED)i; R2=CONTROL MASK WORD, SHIFTED RIGHT 1Lj; R3=UNDEFINEDk; R4=UNDEFINEDl; R5=UCB ADDRESSm;Nn4oCRETSK: ROR R2 ;CHECK THE FLAG FOR TASK SUBPACKET'p BCC CREDID ;IF CC NO TASK SUBPACKET 1q MOV #E$TLEN,(R0)+ ;PUT IN THE SUBPACKET LENGTHV+r MOV 14(SP),R1 ;GET THE SAVED TCB ADDRESSP*s CALL CRTASP ;CREATE THE TASK SUBPACKETtu;E.v; CREATE THE DEVICE IDENTIFICATION SUBPACKETw;x; AT THIS POINT:y;4z; R0=POINTER TO NEXT FREE ENTRY IN ALLOCATED BLOCK{; R1=UNDEFINED)|; R2=CONTROL MASK WORD, SHIFTED RIGHT 2 }; R3=UNDEFINED~; R4=UNDEFINED; R5=UCB ADDRESS;2CREDID: ROR R2 ;IS THERE A DEVICE ID SUBPACKET? BCC CREDOP ;IF CC NO) MOV U.SCB(R5),R4 ;RETRIEVE SCB ADDRESS;8 MOV #E$ILEN,(R0)+ ;INSERT THE LENGTH OF THE SUBPACKET* CALL CRDEVP ;CREATE DEVICE INFORMATION5 BIT #DV.DIR,U.CW1(R5) ;IS THIS A DIRECTORY DEVICE?I) BEQ 5$ ;IF EQ NO, DON'T INTERPRET VCB:- MOV U.VCB(R5),R3 ;GET A POINTER TO THE VCBL BNE 15$ ;IF NE VCB EXISTSB5$: MOV #/2,R3 ;GET THE NUMBER OF WORDS TO CLEAR910$: CLR (R0)+ ;CLEAR OUT THE VOLUME NAME AND00cb_c_d_k PACK ID. ( SOB R3,10$ ;LOOP UNTIL DONE CLEARING, BR 30$ ;DONE WITH THE VOLUME INFORMATION)15$: ADD #V.LABL,R3 ;POINT AT THE LABELT> MOV #/2,R1 ;GET THE NUMBER OF WORDS TO MOVE820$: MOV (R3)+,(R0)+ ;TRANSFER VOLUME NAME AND PACK ID SOB R1,20$ ;LOOP UNTIL DONE'* BIT #DV.SQD,U.CW1(R5) ;IS THIS A DISK? BEQ 30$ ;IF EQ YES4 CMP -(R0),-(R0) ;NO, BACKUP TO PACK SERIAL NUMBER' CLR (R0)+ ;CLEAR PACK SERIAL NUMBERR CLR (R0)+ ;....30$: MOV #1,(R0)+ ;ALL DEVICES ARE OF TYPE 16 MOV U.CW3(R5),(R0)+ ;GET LOW ORDER BLOCKS IN DEVICE8 MOVB U.CW2(R5),(R0)+ ;GET HIGH ORDER BLOCKS IN DEVICE CLRB (R0)+ ;;-A; INSERT THE I/O COUNT INFORMATION AND CLEAR THEM IF REQUESTED.0>; NOTE THAT THIS INFORMATION IS IN SECONDARY POOL AND MAY OR; MAY NOT BE PRESENT.C;)> MOV U.UCBX(R5),KISAR6 ;MAP UCB EXTENSION IN SECONDARY POOL BEQ 35$ ;IF EQ NO EXTENSIONC;0@; MAP TO UCB EXTENSION, SAVE COUNTS ON THE STACK THEN MAP BACK#; TO ERROR PACKET AND FILL IT IN.M;C* MOV #IOC+20, R1 ; GET END OF I/O COUNTS' MOV -(R1),-(SP) ; SAVE THE LOW ORDER < MOV -(R1),-(SP) ; SAVE HIGH ORDER CYLINDERS CROSSED COUNT# MOV -(R1),-(SP) ; SAVE LOW ORDERF< MOV -(R1),-(SP) ; SAVE HIGH ORDER BLOCKS TRANSFERED COUNT4 MOV -(R1),-(SP) ; SAVE SOFT AND HARD ERROR COUNTS# TST -(R1) ; BYPASS ERROR LIMITSN# MOV -(R1),-(SP) ; SAVE I/O COUNTI MOV -(R1),-(SP) ;...( BIT #SM.ZER,26(SP) ; ZERO THE COUNTS? BEQ 33$ ; IF EQ NO CLR (R1)+ ;CLEAR THE COUNTSN CLR (R1)+ ;... TST (R1)+ ;... CLR (R1)+ ;... CLR (R1)+ ;... CLR (R1)+ ;... CLR (R1)+ ;... CLR (R1)+ ;...(33$: MOV 20(SP), KISAR6 ; REMAP PACKET& MOV #7,R3 ; MOVE 7 ITEMS TO PACKET34$: MOV (SP)+,(R0)+ ; GOC SOB R3,34$ ;...S" BR 40$ ;JOIN COMMON CODE BELOW:35$: ADD #16,R0 ;UPDATE POINTER. NOTE: A FLAG IS SET BY, ;...CRDEVP TO INDICATE THE DATA IN THE3 ;...UCB EXTENSION AREA IS INVALID. IT IS DONE 2 ;...THERE RATHER THAN HERE FOR GENERALITY AS% ;...OTHER ROUTINES CALL CRDEVP.(%40$: MOV 2(SP), KISAR6 ; MAP PACKET(;.); CREATE THE DEVICE OPERATION SUBPACKET;M; AT THIS POINT:; 4; R0=POINTER TO NEXT FREE ENTRY IN ALLOCATED BLOCK; R1=UNDEFINED); R2=CONTROL MASK WORD, SHIFTED RIGHT 3N; R3=UNDEFINED; R4=UNDEFINED; R5=UCB ADDRESS; 2CREDOP: ROR R2 ;CHECK FOR PRESENCE OF SUBPACKET' BCC CREIOA ;IF CC NO SUCH SUBPACKETN) MOV U.SCB(R5),R4 ;RETRIEVE SCB ADDRESST1 MOV #E$OLEN,(R0)+ ;INSERT THE SUBPACKET LENGTHS/ MOV S.PKT(R4),R1 ;GET THE I/O PACKET POINTERC( MOV I.TCB(R1),R1 ;GET THE TCB POINTER, CALL CRTASP ;INSERT THE TASK INFORMATION2 CALL CRIOPP ;INSERT THE I/O PACKET INFORMATION% CLR (R0)+ ;NO CURRENT RETRY COUNTM; ; I/O ACTIVITY SUBPACKET;D; AT THIS POINT:;54; R0=POINTER TO NEXT FREE ENTRY IN ALLOCATED BLOCK; R1=UNDEFINED); R2=CONTROL MASK WORD, SHIFTED RIGHT 4N; R3=UNDEFINED; R4=UNDEFINED; R5=UCB ADDRESS;(6CREIOA: ROR R2 ;CHECK FOR AN I/O ACTIVITY SUBPACKET/ BCC CREDAT ;IF CC NO I/O ACTIVITY SUBPACKETT;PF; THE LENGTH OF THE I/O ACTIVITY SUBPACKET WILL BE COMPUTED WHEN THEE; ENTIRE SUBPACKET HAS BEEN CREATED. SAVE THE BEGINNING ADDRESS OFM!; THE SUBPACKET FOR FUTURE USE.K;5 MOV R0,-(SP) ;SAVE THE BEGINNING SUBPACKET ADDRESSN5 CLR (R0)+ ;GET RID OF ANYTHING IN THE LENGTH WORDL- MOV R5,R2 ;SAVE UCB ADDRESS FOR REFERENCE2 MOV #$SCDVT,-(SP) ;SETUP FOR THE COROUTINE CALL(10$: CALL @(SP)+ ;GET THE NEXT DEVICE BCS 20$ ;IF CS DONE;% MOV S.ST2(R4),R3 ;COPY STATUS BITS COM R3 ;TOGGLE THEM 7 BIT #S2.LOG!S2.ACT,R3 ;ACTIVE ERROR LOGGING DEVICE?I BNE 10$ ;IF NE NOR CMP R5,R2 ;IS THIS OUR UCB?S! BEQ 10$ ;IF EQ YES, IGNORE ITU. CALL CRDEVP ;CREATE THE DEVICE INFORMATION+ MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSD/ MOV I.TCB(R1),R1 ;GET THE TASK'S TCB ADDRESSS, CALL CRTASP ;CREATE THE TASK INFORMATION000cZcb`TADATADATADATADATADATA TST -(R0) ;POINT BACK TO THE TI: UNIT NUMBER: MOVB (R0),E$ATIU-E$AFNC(R0) ;INSERT THE TI: UNIT NUMBER2 CALL CRIOPP ;CREATE THE I/O PACKET INFORMATION BR 10$ ;LOOP UNTIL DONEC 5 20$: MOV R0,R2 ;COPY THE CURRENT SUBPACKET ADDRESSR-  SUB (SP),R2 ;COMPUTE THE SUBPACKET LENGTH ;  MOV R2,@(SP)+ ;INSERT THE LENGTH IN THE SUBPACKET PREFIXF ;; CREATE THE DATA SUBPACKETC;D; AT THIS POINT:;R4; R0=POINTER TO NEXT FREE ENTRY IN ALLOCATED BLOCK; R1=UNDEFINED; R2=UNDEFINED; R3=UNDEFINED; R4=UNDEFINED; R5=UNDEFINED;$:CREDAT: BIT #SM.DAT,10(SP) ;DO WE HAVE A DATA SUBPACKET? BEQ 20$ ;IF EQ NON. MOV 6(SP),R3 ;GET THE DATA SUBPACKET LENGTH5 MOV R3,(R0) ;PUT IN THE LENGTH OF THE DATA ITSELF,3 ADD #2,(R0)+ ;ADD IN THE SUBPACKET HEADER LENGTH;7  BIT #SM.MBC,10(SP) ;MASSBUS RHBAE REGISTERS PRESENT? ! BEQ 5$ ;IF EQ NO." SUB #4,R3 ;YES, THEY MAY NOT BE CONTIGUOUS/#5$: MOV R0,-(SP) ;SAVE SUBPACKET DATA ADDRESS1'$ MOV 14(SP), R2 ;GET THE DATA ADDRESSF% BEQ 15$ ;IF EQ, NO DATA5'& MOV R3,R0 ;GET NUMBER BYTES TO MOVEA%' MOV 2(SP),R1 ;DATA BUFFER APR BIAS(;QB); IF THE DATA BUFFER IS MAPPED THROUGH ANY APR'S BUT 5 OR 6, THED*; MAPPING WILL BE TRANSPARENT TO BLXIO. HOWEVER, IF IT'S IN APR6,B+; WE MUST CONVERT IT TO USE 5 AND IF IT'S IN 5, WE MUST RETRIEVE,,; THE SAVED APR5 MAPPING TO PASS TO BLXIO.-;'. CMP #160000,R2 ;IS DATA IN I/O PAGE?O/ BLOS 10$ ;IF YES, BRANCH)0 CMP #140000,R2 ;IS IT LOWER THAT APR6?G1 BHI 7$ ;SEE IF IT'S IN APR5 02 SUB #20000, R2 ;CONVERT APR6 ADDRESS TO APR5 3 BR 10$ ;AND CONTINUE'47$: CMP #120000, R2 ;IS THIS IN APR5?D5 BHI 10$ ;BR IF NOT6;AK7; WARNING: THIS STATEMENT REACHES OUT OF THIS MODULE'S "KNOWN" STACK AREA >8; TO GET THE APR5 MAPPING WHICH WAS SAVED BY ANOTHER MODULE:9;E29 MOV 40(SP),R1 ;ELSE, GET THE SAVED APR5 MAPPING*;10$: MOV 4(SP),R3 ;GET MAPPING TO PACKET< MOV (SP),R4 ;ADDR OF BUFFERS= CALL $BLXIO ;MOVE DATA> MOV R4,R0 ;UPDATE POINTERI7? BIT #SM.MBC,12(SP) ;MASSBUS RHBAE REGISTERS PRESENT?R@ BEQ 15$ ;IF EQ NOB!A MOV 20(SP),R5 ;GET UCB ADDRESS0$B MOV U.SCB(R5),R4 ;GET SCB ADDRESS,C MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESSD MOV R3,R2 ;COPY KRB ADDRESSN'E ADD K.OFF(R3),R2 ;POINT TO UCB TABLEP+F MOV KE.RHB(R2),R2 ;RETREIVE RHBAE OFFSETG MOV 2(SP),KISAR6 ;MAP DATA *H ADD 14(SP),R2 ;FORM AN I/O PAGE ADDRESS'I MOV 2(R2),-(SP) ;COPY BOTH REGISTERS J MOV (R2),-(SP) ;...#K MOV 10(SP), KISAR6 ;REMAP PACKET ,L MOV (SP)+,(R0)+ ;MOVE REGISTERS TO PACKET,M MOV (SP)+,(R0)+ ;MOVE REGISTERS TO PACKET-N15$: MOV (SP)+,R1 ;GET SUBPACKET DATA ADDR.B%O20$: CLC ;PACKET COULD BE CREATEDR&P TST (SP)+ ;DISCARD MAPPING TO DATA+Q MOV (SP)+,R3 ;RESTORE THE PACKET ADDRESS .RPKTXIT: MOV (SP)+,R0 ;RESTORE THE ENTRY CODE0S INC (SP)+ ;DISCARD THE DATA SUBPACKET LENGTH.T MOV (SP)+,R2 ;RESTORE THE CONTROL MASK WORD'U INC (SP)+ ;DISCARD THE DATA ADDRESS(V MOV (SP)+,R4 ;RESTORE THE TCB ADDRESS(W MOV (SP)+,R5 ;RESTORE THE UCB ADDRESSX RETURN ;DONETYZ[;+%\; **-CRTASP-CREATE TASK INFORMATION:];(?^; CREATES THE FOLLOWING INFORMATION IN THE CURRENT SUBPACKET: _;E5`; +-----------------------------------------------++a; | TASK NAME IN RAD50 | b; | |5c; +-----------------------------------------------+Ad; | TASK UIC |5e; +-----------------------------------------------+f; | TASK TI: DEVICE NAME |D5g; +-----------------------+-----------------------+V&h; | FLAGS | TASK TI: UNIT NUMBER |5i; +-----------------------+-----------------------+ j;M k; FLAGS:l; ET$PRV TASK IS PRIVILEGED"m; ET$PRI TERMINAL IS PRIVILEGEDn; o; INPUTS:-)p; R0=POINTER TO SUBPACKET FOR INSERTIONq; R1=POINTER TO TASK TCBr; s; OUTPUTS:t; R0=UPDATEDu; R1 AND R3 ARE DESTROYED-v; R4 AND R5 ARE PRESERVEDw;-x!yCRTASP: SAVNR ;SAVE R4 AND R5-,z MOV T.NAM(R1),(R0)+ ;PUT IN THE TASK NAME{ MOV T.NAM+2(R1),(R0)+ ;...-| MOV T.PCB(R1),R00cb_c_d_k4 ;GET A POINTER TO THE PCBI2} BIT #PS.OUT!PS.CKP,P.STAT(R4) ;TASK IN MEMORY ?)~ BEQ 2$ ;IF EQ, YES - UIC IS AVAILABLER( CLR (R0)+ ;OTHERWISE, ASSUME UIC 0,0  BR 7$ ;D2$: ;REFERENCE LABEL0 .IF DF X$$HDR. MOV KISAR6,-(SP) ;SAVE CURRENT APR6 MAPPING0 MOV P.HDR(R4),R5 ;GET A POINTER TO THE HEADER BNE 5$ ;IF NE IT'S RESIDENT; MOV P.REL(R4),KISAR6;SET APR6 MAPPING TO EXTERNAL HEADER)" MOV #140000,R5 ;SET TO MAP APR6;M5;SAVE UIC AND REMAP PACKET AND INSERT UIC IN PACKETT; '5$: MOV H.CUIC(R5),R5 ; SAVE THE UICA- MOV (SP)+, KISAR6 ; RESTORE PACKET MAPPING  MOV R5,(R0)+ ; INSERT UIC .IFF ; DF X$$HDR0 MOV P.HDR(R4),R4 ;GET A POINTER TO THE HEADER& MOV H.CUIC(R4),(R0)+;INSERT THE UIC .ENDC ; DF X$$HDR7$: ;REFERENCE LABEL , MOV T.UCB(R1),R5 ;GET THE TI: UCB POINTER410$: MOV U.RED(R5),R5 ;FOLLOW THE REDIRECT POINTER. CMP R5,U.RED(R5) ;IS THE DEVICE REDIRECTED? BNE 10$ ;IF NE YES, MOV U.DCB(R5),R3 ;GET THE TI: DCB POINTER. MOV D.NAM(R3),(R0)+ ;INSERT THE DEVICE NAME( CALL CALDEV ;CALCULATE DEVICE UNIT #' CLRB (R0) ;INITIALIZE THE FLAG BYTEX1 BIT #U2.PRV,U.CW2(R5) ;IS THE TI: PRIVILEGED?H BEQ 20$ ;IF EQ NO(- BISB #ET$PRI,(R0) ;MARK THE TI: PRIVILEGEDH620$: BIT #T3.PRV,T.ST3(R1) ;IS THE TASK PRIVILEGED? BEQ 25$ ;IF EQ NOI. BISB #ET$PRV,(R0) ;MARK THE TASK PRIVILEGED-25$: TSTB (R0)+ ;POINT PAST THE FLAG ENTRYR RETURN ;DONE1;+'; **-CRDEVP-CREATE DEVICE INFORMATIONI;?; CREATES THE FOLLOWING INFORMATION IN THE CURRENT SUBPACKET:C;A5; +-----------------------------------------------+T&; | LOGICAL DEVICE NAME MNEMONIC |5; +-----------------------+-----------------------+,.; | CONTROLLER NUMBER | DEVICE UNIT NUMBER |5; +-----------------------+-----------------------+ ,; | PHYSICAL SUBUNIT # | PHYSICAL UNIT # |5; +-----------------------+-----------------------+R'; | PHYSICAL DEVICE NAME MNEMONIC |*5; +-----------------------------------------------+H; | RESERVED | FLAGS |E5; +-----------------------+-----------------------+-;- ; INPUTS:-; R0=POINTER TO DATA AREAN; R4=SCB ADDRESS; R5=UCB ADDRESS;- ; OUTPUTS:; R0=UPDATED; R1 AND R3 ARE DESTROYEDE; R4 AND R5 ARE PRESERVED-;-!CRDEVP: SAVNR ;SAVE R4 AND R5  CLR -(SP) ;CLEAR FLAG WORD- MOV U.DCB(R5),R3 ;GET A POINTER TO OUR DCB-0 TST U.UCBX(R5) ;DOES THE UCB EXTENSION EXIST? BNE 10$ ;IF NE - YES? BIS #EI$NUX,(SP) ;INDICATE ANY UCB EXTENSION DATA IS INVALID >10$: MOV D.NAM(R3),(R0)+ ;PUT IN THE LOGICAL DEVICE MNEMONIC( CALL CALDEV ;CALCULATE DEVICE UNIT #, MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS BEQ 15$ ;IF EQ - NO KRBT* MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX!15$: ASRB R3 ;MAKE IT A NUMBERE) MOVB R3,(R0)+ ;INSERT CONTROLLER INDEX 5 MOVB U.UNIT(R5),(R0)+;GET THE PHYSICAL UNIT NUMBER ( CLRB (R0)+ ;CLEAR THE SUBUNIT NUMBER5 BITB #S3.SLV,S.ST3(R4) ;IS THERE ANY SLAVE UNITS?N BEQ 20$ ;IF EQ NOC6 MOVB U.SNUM(R5),-1(R0) ;YES, INSERT SUBUNIT NUMBER3 BIS #EI$SUB,(SP) ;FLAG AS A SUBCONTROLLER DEVICE ;E>; GET THE PHYSICAL CONTROLLER NAME BY SCANNING THE CTB LIST.;1220$: MOV #$CTLST,R3 ;GET ADDRESS OF CTB LISTHEAD-25$: MOV (R3),R3 ;GET THE NEXT CTB ADDRESS BNE 30$ ;IF NE WE GOT ONEE) MOV U.DCB(R5),R3 ;ELSE GET DCB ADDRESSP8 MOV D.NAM(R3),(R0)+ ;USE DCB NAME FOR CONTROLLER NAME  BR 55$ ;130$: MOV L.DCB(R3),R1 ;GET DCB POINTER FROM CTBBB BITB #LS.CIN,L.STS(R3) ;IS THIS A COMMON INTERRUPT CONTROLLER?, BNE 40$ ;IF NE YES, SEARCH TABLE FOR DCB- CMP R1,U.DCB(R5) ;IS THIS THE CORRECT CTB?C BNE 25$ ;IF NE NO, LOOPE BR 50$ ;IT MUST BE040$: TST (R1)+ ;SKIP COMMON INTERRUPT ADDRESS/45$: TST (R1) ;IS THIS THE END OF THE TABLE? BEQ 25$ ;IF EQ YES3 CMP (R1)+,U.DCB(R5) ;DOES THE DCB MATCH OUR DCB?M BNE 45$ ;IF NE NO ;50$: MOV L.NAM(R3),(R0)+ ;INSERT PHYSICAL CONTROLLER NAMER00cZcb`TADATADATADATADATADATA!55$: MOV (SP)+,(R0)+ ;SET FLAGS  RETURN ;.;+*; **-CRIOPP-INSERT I/O PACKET PARAMETERS;I0; INSERTS THE FOLLOWING I/O PACKET PARAMETERS:; 5; +-----------------------------------------------+; | I/O FUNCTION CODE |5; +-----------------------+-----------------------+1; | RESERVED | FLAGS |B5; +-----------------------+-----------------------+O$; | TRANSFER OPERATION ADDRESS | ; | |5; +-----------------------------------------------+N'; | TRANSFER OPERATION BYTE COUNT |5; +-----------------------------------------------+P; ; INPUTS: ; R0=POINTER TO SUBPACKET DATA ; R4=SCB ADDRESS ; R5=UCB ADDRESS ;- ; OUTPUTS: ; R0=UPDATED; R1 AND R3 ARE DESTROYED ; R4 AND R5 ARE PRESERVED-;-%CRIOPP: MOV R2,-(SP) ;SAVE REGISTER + MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS-& MOV I.FCN(R1),R3 ;GET FUNCTION CODE MOV R3,(R0)+ ;INSERT IT! CLR (R0) ;SETUP FOR THE FLAGS-;-/; OBTAIN A MASK BIT FOR THE I/O FUNCTION CODEN;( MOV U.DCB(R5),R1 ;GET THE DCB POINTER2 ADD #D.MSK+2,R1 ;AND POINT TO THE FUNCTION MASK CLRB R3 ;CLR MODIFIER FLAGS* SWAB R3 ;PUT FUNCTION CODE IN LOW BYTE5  CMP R3,#15. ;IS THE FUNCTION IN THE SECOND MASKS? +! BLOS 10$ ;IF LOS FUNCTION IN FIRST MASKS," SUB #16.,R3 ;NORMALIZE THE FUNCTION CODE'# ADD #8.,R1 ;POINT TO THE SECOND SETG/$10$: ASL R3 ;MAKE FUNCTION CODE A WORD INDEXC?% MOV $BTMSK(R3),R3 ;GET BIT THAT CORRESPONDS TO FUNCTION CODEO&'; 9(; SEE IF THE FUNCTION IS OTHER THAN A TRANSFER FUNCTIONP);R**+ BIT R3,(R1)+ ;IS IT A CONTROL FUNCTION?, BNE 20$ ;IF NE YES)- BIT R3,(R1)+ ;IS IT A NOOPED FUNCTION?O. BNE 20$ ;IF NE YES'/ BIT R3,(R1)+ ;IS IT AN ACP FUNCTION?S0 BNE 20$ ;IF NE YES01 BIS #EO$TRA,(R0) ;FLAG AS A TRANSFER FUNCTION23;F4; INSERT THE OTHER FLAGS5;N62720$: BITB #UC.NPR,U.CTL(R5) ;IS IT A DMA DEVICE?8 BEQ 40$ ;IF EQ NO$)9 BIS #EO$DMA,(R0) ;FLAG AS A DMA DEVICEU,: MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS;; BIT #KS.MBC!KS.EXT,K.STS(R3) ;22-BIT ADDRESSING DEVICE?)< BEQ 35$ ;IF EQ NOT7= BIS #EO$EXT,(R0) ;FLAG AS EXTENDED ADDRESSING DEVICEO:>35$: BITB #S3.SIP,S.ST3(R4) ;IS THE DEVICE POSITIONING?? BEQ 40$ ;IF EQ NOE@40$: MOV S.PKT(R4),R2 ; GET THE POINTER TO THE I/O PACKETCA BIT #1,I.IOSB+4(R2) ; TEST IF THIS IS AN INTERNAL I/O PACKET.B BEQ 41$ ; IF EQ NO<C BIS #EO$IIO,(R0) ; THEN SET THE BIT TO INDICATE IT7D41$: MOV (R0)+,R1 ; GET COPY OF FLAG WORD B2E BIT #EO$EXT,R1 ;DO WE HAVE AN EXTENDED ADDRESS?F BNE 70$ ;IF NE YES(G BIT #EO$DMA,R1 ;IS THIS A DMA DEVICE?H BEQ 90$ ;IF EQ NOIJ; 4K; INSERT THE TRANSFER OPERATION ADDRESS AND LENGTHL; M(N ADD K.OFF(R3),R3 ;POINT TO UMR AREA+2.O MOV -(R3),2(R0) ;INSERT LOW BITS OF ADDRESS0P MOVB -(R3),(R0)+ ;INSERT HIGH BITS OF ADDRESS"Q CLRB (R0)+ ;FORGET ANY GARBAGE"R TST (R0)+ ;POINT PAST LOW BITS S BR 100$ ;I8T70$: MOVB U.BUF+1(R5),(R0);ASSUME HIGH BITS ARE IN UCB:U BIT #KS.EXT,K.STS(R3) ;IS THIS A 22-BIT UNIBUS DEVICE?V BEQ 80$ ;IF EQ NOY+W MOV S.PKT(R4),R2 ;GET I/O PACKET ADDRESS0X MOV I.PRM+6(R2),(R0);GET HIGH BITS OF ADDRESS(Y80$: BIC #^C<377>,(R0)+ ;CLEAR GARBAGEZ BR 95$ ;GO GET LOW BITSI6[90$: MOV U.BUF(R5),(R0)+ ;STORE HIGH BITS OF ADDRESS8\95$: MOV U.BUF+2(R5),(R0)+ ;STORE LOW BITS OF ADDRESS3]100$: MOV U.CNT(R5),(R0)+ ;MOVE IN THE BYTE COUNTP!^ MOV (SP)+,R2 ;RESTORE REGISTER _ RETURN ;U`a;+*b; **-CALDEV-CALCULATE DEVICE UNIT NUMBERc;S;d; THIS ROUTINE WILL CALCULATE THE LOGICAL UNIT NUMBER FORNe; THE GIVEN UCB.f;G g; INPUTS: h; R0=POINTER TO PACKET DATA0i; R3=DCB ADDRESSj; R5=UCB ADDRESSk;7 l; OUTPUTS:+m; UNIT NUMBER STORED IN NEXT PACKET BYTE.:n;-o!pCALDEV: SAVNR ;SAVE R4 AND R5E1q SUB D.UCB(R3),R5 ;COMPUTE RELATIVE UCB ADDRESSF$r CLR R4 ;GET READY FOR THE DIVIDE2s DIV D.UCBL(R3),R4 ;COMPUTE REALTIVE UNIT NUMBER2t ADD D.UNIT(R3),R4 ;CO00cb_c_d_kMPUTE ABSOLUTE UNIT NUMBER'u MOVB R4,(R0)+ ;STORE IN ERROR PACKETS v RETURN ;Awxy;+/z; **-$CREQ1-CREATE AND QUEUE ERROR LOG PACKET{;NE|; THIS ROUTINE CREATES AND QUEUES ERROR LOG PACKET. IT USES $CRPK1AG}; AND $QUPK1. IT'S INPUT IS THE SAME AS THE INPUT TO $CRPK1 AND IT'SE~; OUTPUT IS THE SAME AS THAT FROM $QUPK1. IF THE PACKET CANNOT BE UF; CREATED, $QUPKT IS NOT CALLED AND A RETURN IS MADE WITH CARRY SET. ; KISAR6 MAPPING IS PRESERVED.;B;- $CREQ1::" MOV KISAR6,-(SP) ; SAVE MAPPING# CALL $CRPK1 ; CREATE THE PACKETC% MOV (SP)+,KISAR6 ; RESTORE MAPPING + BCC $QUPK1 ; IF WE GOT PACKET, QUEUE IT) RETURN ; ELSE, RETURN WITH CARRY SETR;+$; **-$QUPK1-QUEUE ERROR LOG PACKET;NH; THIS ROUTINE IS CALLED TO QUEUE AN ERROR LOG PACKET. IF THERE IS NOJ; OTHER PACKET IN THE QUEUE, THE ERROR LOGGER IS REQUESTED WITH A DELAY.H; IF THERE IS ANOTHER PACKET ALREADY IN THE QUEUE, THE ERROR LOGGER IS; REQUESTED IMMEDIATLY.;V ; INPUTS: ;E;; R3=POINTER TO PACKET FOR INSERTION IN QUEUE (APR VALUE)K; ; OUTPUTS:;; R4 AND R5 ARE PRESERVEDC%; ALL OTHER REGISTERS ARE DESTROYEDU;-!$QUPK1::SAVNR ;SAVE R5 AND R4K- MOV R3,R1 ;COPY THE POINTER TO THE PACKETE7 MOV $ERRPT,R5 ;SAVE FOR USE WHEN REQUESTING THE TASK$ BEQ 40$ ;IF EQ NO ERROR LOG TASK7 MOV #$ERHEA,R0 ;GET A POINTER TO THE QUEUE LIST HEADT> CALL $QSPIF ;INSERT THE ENTRY FIFO IN THE QUEUE (2ND POOL)8 CMP (R0)+,(R0) ;IS THIS THE FIRST ENTRY IN THE QUEUE? BNE 20$ ;IF NE NON' MOV KISAR6,-(SP) ; SAVE APR6 MAPPING: MOV R1,KISAR6 ; MAP PACKETR8 BIT #SM.CMD,E$HSBF+140004 ;IS THIS A COMMAND PACKET? BNE 10$ ; IF NO YESA% MOV (SP)+,KISAR6 ; RESTORE MAPPING . MOV #C.LGTH,R1 ;SIZE OF A CLOCK QUEUE ENTRY( CALL $ALOCB ;ALLOCATE THE CORE BLOCK1 BCS 20$ ;IF CS FAILURE, TRY IMMEDIATE REQUESTT& CLR C.UIC(R0) ;INDICATE DEFAULT UIC .IF DF A$$CNT% CLR C.UAB(R0) ;BILL TASK TO SYSTEM  .ENDC ; DF A$$CNT CLR R1 ;HIGH TIME = 0N MOV #ERRTIM,R2 ;LOW TIMEA+ MOV #C.SSHT,R4 ;SINGLE SHOT TASK REQUEST/ CALLR $CLINS ;INSERT THE ENTRY IN THE QUEUEP;?; THERE IS ANOTHER PACKET IN THE QUEUE, SO IMMEDIATLY REQUEST; THE ERROR LOGGER.F;O)10$: MOV (SP)+,KISAR6 ; RESTORE MAPPINGO)20$: MOV R5,R0 ;COPY THE ERROR LOG TCBM) TST T.STAT(R0) ;IS IT ALREADY RUNNING?E( BPL 30$ ;IF PL YES, DON'T REQUEST IT  CLR R1 ;INDICATE DEFAULT UIC" CALLR $TSKRT ;REQUEST THE TASK;CA; THE ERROR LOG TASK IS ALREADY RUNNING, SO DISMISS THE REQUESTT;S30$: RETURN ;EXIT;LB; THE ERROR LOG TASK HAS BEEN REMOVED. DISCARD THE QUEUED ENTRY;E440$: MOV R1,R0 ;COPY THE ERROR LOG PACKET POINTER# MOV KISAR6, -(SP) ; SAVE MAPPINGR  MOV R1,KISAR6 ; MAP TO PACKET0 MOV @#140002,R1 ; GET SIZE OF PACKET IN BYTES8 ADD #77+4,R1 ; ACCOUNT FOR LINK + LENGTH + TRUNCATION* ASH #-6,R1 ; CONVERT TO 32 WORD BLOCKS% MOV (SP)+,KISAR6 ; RESTORE MAPPING, CALLR $DESEC ; DEALLOCATE SECONDARY POOL;+/; **-$QRMV1-REMOVE ENTRY FROM ERROR LOG QUEUE;LH; THIS ROUTINE REMOVES AN ENTRY FROM THE ERROR LOG QUEUE AND TRANSFERS; IT INTO A USER BUFFER.; ; INPUTS:K;I; R4=LENGTH OF USER BUFFER; R5=ADDRESS OF USER BUFFER;;T ; OUTPUTS:;1; R1=LENGTH OF PACKETC; R4=UNCHANGED; R5=UNCHANGED;O'; C=0 PACKET WAS REMOVED SUCCESSFULLYR=; C=1 NO PACKET TO REMOVE OR PACKET TOO LONG. IF R1<>0 THEA?; PACKET WAS TOO LONG, AND R1 CONTAINS THE PACKET LENGTH.+;-"$QRMV1::SAVNR ; SAVE R4 AND R5. CLR R1 ; SAY THE PACKET HAS LENGTH OF ZERO( MOV #$ERHEA,R0 ;GET THE QUEUE POINTER* CALL $QSPRF ; REMOVE PACKET FROM QUEUE! BCS 30$ ;IF CS NO SUCH PACKET" MOV KISAR6,-(SP) ; SAVE MAPPING8 MOV R1,KISAR6 ; MAP TO PACKET - VALUE CAME FROM QSPRF' MOV @#140002,R0 ; GET SIZE OF PACKETA% MOV (SP)+,KISAR6 ; RESTORE MAPPING  MOV R0,-(SP) ; SAVE SIZ00ccb`TADATADATADATADATADATAE ' MOV R4,-(SP) ; SAVE USER BUFFER SIZEW# MOV R5,R4 ; USER BUFFER ADDRESSE) CMP R0,(SP)+ ; IS THE PACKET TOO LONG?A% BHI 20$ ;IF HI PACKET IS TOO LONGE; A; PREPARE FOR $BLXIO.. INPUT IS R0= #BYTES, R1=SOURCE APR5 BIASQE; R2=SOURCE DISPLACEMENT, R3=DESTINATION APR6 BIAS, R4=DEST. DISPL.G; OUTPUT FROM BLXIO IS: R0 ALTERED, R1,R3 PRESERVED, R2 AND R4 POINTE'; TO LAST BYTE OF SOURCE AND DEST. +1T; . MOV #120004,R2 ; SKIP LINK AND LENGTH WORDS# MOV KISAR6,R3 ; PRIV.TASK'S APR6M! CALL $BLXIO ; MOVE THE BUFFERW. 20$: MOV R1,-(SP) ; SWAP R0 AND R1 FOR DESEC  MOV (SP)+,R0 ;...  MOV (SP)+,R1 ;.../  MOV R1,-(SP) ; SAVE SIZE IN BYTES FOR OUTPUT 9  ADD #77+4,R1 ; ACCOUNT FOR LENGTH, LINK AND TRUNCATION " ASH #-6,R1 ; CONVERT TO BLOCKS# CALL $DESEC ; DEALLOCATE PACKETU* MOV (SP)+,R1 ;RESTORE THE PACKET LENGTH DEC R4 ;ADJUST SO THAT IF:! ; R4>R5 WE TRANSFERRED DATA& ; R4R5 WE TRANSFERRED DATA& ; R4; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 02; B. SCHREIBER 5-SEP-77 ;E; MODIFIED BY:;O!; PAUL K. M. WEISS 27-SEP-83 2.00 ; (; PKW036 - ENABLE THE A/D FOR MODE 512.;A*; THIS MODULE INITIATES AN A/D INPUT SWEEP; ; SYSTEM MACRO CALLS;  .MCALL KSWDF$ KSWDF$U T# .SBTTL ADSWP START A/D INPUT SWEEPI;+ ; ADSWP -- START A/D INPUT SWEEP;E; CALLING SEQUENCE:I;N?; CALL ADSWP (IBUF,LBUF,NBUF,MODE,IPRSET,IEFN,LDELAY,ICHN,NCHN)R;L-; SEE DOCUMENTATION FOR ARGUMENT DESCRIPTIONS ;N;-'ADSWP:: MOV R5,-(SP) ;SAVE R5 (ARG PTR)H. CALL .K.PAA ;VALIDATE ARGS AND PUSH ON STACK .WORD 9. ;NINE ARGS2# .WORD 600 ;MASK FOR REQUIRED ARGSF1 MOV #.ADSWB,R4 ;POINT TO A/D SWEEP CONTROL BLOCKP BCC 20$ ;IF CC CONTINUEC, MOV #-,R3 ;ELSE SET ERROR CODE! BR 600$ ;STORE ERROR AND RETURNI*20$: CALL .K.SET ;SETUP COMMON SWEEP ARGS BCS 200$ ;IF CS BAD ARGS) CALL .K.DLY ;SEE ABOUT DELAY FROM STARTF! BCS 300$ ;IF CS RESOURCE IN USEU0 CALL .ADGCH ;GET A/D CHANNEL INFORMATION SETUP BCS 200$ ;IF CS BAD ARGS+ CALL .K.STB ;SETUP BUFFER POINTERS IN SWBP. BCS 400$ ;IF CS ILLEGAL BUFFER SPECIFICATION. CALL .ADCNI ;CONNECT FIRST A/D TO INTERRUPTS) BCS 300$ ;IF CS CALL IT RESOURCE IN USEI& CALL .KLQIN ;INSERT INTO CLOCK QUEUE5 BIT #S$WDLY,S.WFL2(R4) ;IS THERE A DELAY FROM START?I BNE 80$ ;IF NE YES--NEED CLOCK .IF DF K$$W11( BIT #S$WEXT,S.WFLG(R4) ;EXTERNAL START? BNE 80$ ;IF NE YES--NEED CLOCK' ;IF NO CLOCK IN SYSTEM CAN STILL DOT ;EXTERNAL START VIA DIGO .IFTF ;K$$W111 BIT #S$WNOV,S.WFLG(R4) ;TRIGGER DRIVEN SAMPLING?W' BNE 90$ ;IF NE YES--NO NEED FOR CLOCKI80$: .IFT ;K$$W11 00ccccccc CALL .KWCNI ;INITIALIZE CLOCKB) BCS 300$ ;IF CS CALL IT RESOURCE IN USEC- BIS #S$WACT,S.WFL2(R4) ;FLAG SWEEP IS ACTIVED( BIT #S$WEXT,S.WFLG(R4) ;EXTERNAL START?1 BNE 100$ ;IF NE YES--ST ROUTINE WILL ENABLE A/DW .IFF ;K$$W11T1 MOV #-,R3 ;CLOCK OPTION NOT PRESENTE# BR 500$ ;GO RETURN STATUS TO USERC .ENDC ;K$$W11'90$: CALL .ADSTR ;ENABLE A/D CONVERTOR#100$: MOV (SP)+,R5 ;RESTORE ARG PTRI RETURNI;W; ERROR RETURNSE;S; BAD PARAMETERS;&200$: MOV #-,R3 ;SET CODE BR 500$ ;GO TO COMMON CODE;F; RESOURCE IN USEE; &300$: MOV #-,R3 ;SET CODE BR 500$;; ILLEGAL BUFFER SPECIFICATION;T&400$: MOV #-,R3 ;SET CODE2500$: MOV R5,SP ;RESTORE PRE-.K.PAA STACK POINTER1600$: CALL .KLQRM ;REMOVE FROM QUEUE IF INSERTED ' MOV #1,R4 ;SET ARG # TO STORE IT INTO MOV (SP)+,R5 ;RESTORE ARG PTR+ CALLR .IESTO ;SET CODE AND RETURN TO USERT .ENDRNI;W; ERROR RETURNSE;S; BAD PARAMETERS;&200$: MOV #-; within the cacher module itself. On non-I/D systems, only<; APR6 can be used to reference the partition's pool area.%; This limits the pool size to 4KW.o<; On I/D systems, D-space is used to reference 8KW in both; APR5 and APR6.; 4; The UCB extension (UCBX) is mapped in APR6, as a=; convention. It is usually mapped only in the dispatching?; code, and may be dynamically (temporarily) mapped to accessO=; the cells used to maintain the device-specific listheads.l;d< ; The cache statistics buffer is also only mapped in APR6.<!; It is also dynamically (temporarily) mapped by the macro>"; USTAT$ (Update STATistics), in the various pieces of code.#;-A$; The actual cache buffers themselves are never directly mapped>%; during operation, although the executive subroutine $BLXIO#&; will map them to transfer data. ';t'; CHEDBG = 0 '; CHESAN = 0c' CHEDFR = 02) CHESTS = 0 ;Define to enable cache statistics*;d+; Macro callss,;s%- .MCALL CHEDF$ ;Cache definitionse1. .MCALL FILIO$ ;File oriented I/O definitionsm&/ .MCALL PKTDF$ ;Packet definitions30 .MCALL QIOSY$ ;QI/O error and code definitionse&1 .MCALL UCBDF$ ;UCB[X] definitions 2 CHEDF$s 3 FILIO$e 4 PKTDF$y 5 QIOSY$ 6 UCBDF$e7;n8; Macro definitionse9;o%:; USTAT$ - Update Statistics Buffers;;a< .MACRO USTAT$ OFFSET .= .IF DF CHESTS ; Cache statistics enabled?>? MOV #OFFSET, -(SP)h@ CALL $USTAT A TST (SP)+BC .ENDC ; .IFDF CHESTS$D .ENDM USTAT$iE;4F; MESAG$ - Display a message at the system consoleG;L!G .MACRO COPY$ SIZE,ADDRESS,CODE. G .IF B CODE;G MOV #SIZE,-(SP)G .IFFnG MOV #>,-(SP)fG .ENDCG MOV ADDRESS,-(SP) G CALL $COPYG .ENDMG(G .MACRO MESAG$ TEXT,OPCODE,SIZE,PRMLSTG .IF DF CHEDBG G CALL $SAVEBG .IF NB TEXTG MOV #TEXT,-(SP)G CALL .TTMSGG .ENDCG .IF NB OPCODEG .IF NB SIZEG MOV #SIZE,R1hG .ENDC G .IF B SIZE( G CLR R1G .ENDCG MOV #OPCODE,R2NG CALL $PTMSGG .IF NB SIZEG .IRP X, G COPY$ XG .ENDMG .ENDCG CALL $RSTORG .ENDCL .ENDC ;CHEDBGM .ENDM MESAG$N;FO; Offset definitions in I.PRMPP;#Q P1 = 0 ;Parameter 1 (I.PRM+0) R P1.1 = 0 ;S P1.2 = 2 ;A#T P2 = 4 ;Parameter 2 (I.PRM+4) #U P3 = 6 ;Parameter 3 (I.PRM+6)T%V P4 = 10 ;Parameter 4 (I.PRM+10)%W P5 = 12 ;Parameter 5 (I.PRM+12)E%X P6 = 14 ;Parameter 6 (I.PRM+14)SY P6.1 = 14 ;[UQ.UMD]Z P6.2 = 16 ;[UQ.UMD][;P?\; Symbols used internally as "base values" for APR relocation];C8^ APR5.BASE = 120000 ;Base address for APR5 references8_ APR6.BASE = 140000 00ccccccc ;Base address for APR6 references`.a .IF DF K$$DAS ;Kernel I/D space supported.b APRD.BASE = APR5.BASE ;Data begins in APR5c .IFF ;K$$DAS8d APRD.BASE = APR6.BASE ;Non-I/D systems begin in APR6e .ENDCf; g; Macro status bits.h;2?i; BYPASS: All modifiers in the function code to indicate thatM+j; the operation is to be cache bypassed.lk;d>l; EXBUSY: All bits which mark the extent as "busy" or locked/m; pending the completion of another process.n;Ro;EEp BYPASS = ;<1!2!4=7> If set, request is "bypassed"eFp EXBUSY = ;<> If set, extent in use or lockedpp; +p; Definitions for large extent transfers.Dp;e@pMAXTR = 17700 ; size of largest permissible transfer, in bytes<pMAXTRB = 177 ; size of largest transfer, in 64-byte blocks+j; the operation is to be cache bypassed.lk;d>l; EXBUSY: All bits which mark the extent as "busy" or locked/m; pending the completion of another process.n;Ro;EEp BYPAS& .TITLE DCQUE - DC Queue Maintenance .IFDF D$$CHE, .IDENT /1.01/ .PSECT DC$QUE,RO,ID;(; Modified By:;E; J. Kauffman 17-Feb-87 1.01@; JRK330 - Convert E.UCBX to E.UCB for deferred write support; , .SBTTL QINLBN - Insert CED into LBN queue;R= ; This routine will use the two temporary cells, H.TMP1 andB< ; H.TMP2 to place the specified CED into the ascending LBN< ; queue for a device. The two temporaries are supplied by@ ; SEARCH (DCSUB), and are retained in order to position withinA ; the LBN list only once, thereby increasing cache performance.; ; Passed:B0; R0 -> CED to be inserted into the LBN queue.; ; Returned:t; All registers preservedp;; Processing:B;I; CASE TMP1 TMP2L+; ----------------------------- ---- ---- (; I. No elements in queue EQ 0 EQ 0*; II. Becomes first in queue EQ 0 NE 0); III. Becomes last in queue NE 0 EQ 0t); IV. Inserted within queue NE 0 NE 0U+; ----------------------------- ---- ----h;; The following is performed:  ;a !; IF TMP1=0o"; IF TMP2=0#; { ;Case I.E$; CURR.PREV <- 0%; CURR.NEXT <- 0&; X.CCED <- CURRs'; X.CCED+2 <- CURRB (; } ); ELSE 0>-*; { ;Case II.+; CURR.PREV <- 0,; CURR.NEXT <- TMP20-; TMP2.PREV <- CURRq.; X.CCED <- CURRo /; } 0; ELSE 0>V1; IF TMP2=0i2; { ;Case III.-3; CURR.PREV <- TMP1-4; CURR.NEXT <- 05; TMP1.NEXT <- CURR6; X.CCED+2 <- CURR= 7; } 8; ELSE 0> 9; { ;Case IV.:; CURR.PREV <- TMP1.;; TMP1.NEXT <- CURR.<; CURR.NEXT <- TMP2=; TMP2.PREV <- CURR >; }a?; END P@; END UA;X BQINLBN::(C MOV R1,-(SP) ;Obtain a work registerD/E MOV APRD.BASE+H.TMP1,R1 ;Beginning of queue?F BNE 20$ ;No if NEG(H MOV APRD.BASE+H.TMP2,R1 ;Empty queue?I BNE 10$ ;No if NEJ"K CLR E.LPRV(R0) ;CURR.PREV <- 0"L CLR E.LNXT(R0) ;CURR.NEXT <- 0M,N MOV KISAR6,-(SP) ;Save partition mapping/O MOV U.UCBX(R5),KISAR6 ;Map the UCB extensionX,P MOV R0,APR6.BASE+X.CCED ;X.CCED <- CURR.Q MOV R0,APR6.BASE+X.CCED+2 ;X.CCED+2 <- CURR/R MOV (SP)+,KISAR6 ;Restore partition mappingNS BR 40$ ;And exitbT&U10$: CLR E.LPRV(R0) ;CURR.PREV <- 0(V MOV R1,E.LNXT(R0) ;CURR.NEXT <- TMP2(W MOV R0,E.LPRV(R1) ;TMP2.PREV <- CURRX,Y MOV KISAR6,-(SP) ;Save partition mapping/Z MOV U.UCBX(R5),KISAR6 ;Map the UCB extension ,[ MOV R0,APR6.BASE+X.CCED ;X.CCED <- CURR)\ MOV (SP)+,KISAR6 ;Remap the partitionA] BR 40$ ;And exito^*_20$: TST APRD.BASE+H.TMP2 ;End of queue?` BNE 30$ ;No if NEa(b MOV R1,E.LPRV(R0) ;CURR.PREV <- TMP1"c CLR E.LNXT(R0) ;CURR.NEXT <- 0(d MOV R0,E.LNXT(R1) ;TMP1.NEXT <- CURRe,f MOV KISAR6,-(SP) ;Save partition mapping/g MOV U.UCBX(R5),KISAR6 ;Map the UCB ex00ccb`TADATADATADATADATADATAtensionU/h MOV R0,APR6.BASE+X.CCED+2 ;X.CCED+2 <- CURRi)i MOV (SP)+,KISAR6 ;Remap the partitionxj BR 40$ ;And exit6k,l30$: MOV R1,E.LPRV(R0) ;CURR.PREV <- TMP1(m MOV R0,E.LNXT(R1) ;TMP1.NEXT <- CURR$n MOV APRD.BASE+H.TMP2,R1 ;Get TMP2(o MOV R1,E.LNXT(R0) ;CURR.NEXT <- TMP2(p MOV R0,E.LPRV(R1) ;TMP2.PREV <- CURRq&r40$: MOV (SP)+,R1 ;Restore saved R1 s RETURNTt ,u .SBTTL QRMLBN - Remove CED from LBN queuev;p w; Passed:ix; R0 -> CED to removeAy;a z; Returned:s{; All registers preservedC|;;}; Processing:i~;M; CASE .PREV .NEXTh-; ----------------------------- ----- -----:*; I. Only element in queue EQ 0 EQ 0+; II. First element in queue EQ 0 NE 0A*; III. Last element in queue NE 0 EQ 0); IV. Element within queue NE 0 NE 0V-; ----------------------------- ----- -----R;e; IF CURR.PREV=0; IF CURR.NEXT=0 ; {R; X.CCED <- 0; X.CCED+2 <- 0 ; }r; ELSE 0> ; {i ; X.CCED <- CURR.NEXT; NEXT.PREV <- 0 ; }h; END ; ELSE 0>; IF CURR.NEXT=0 ; {Q ; X.CCED+2 <- CURR.PREV; PREV.NEXT <- 0 ; } ; ELSE 0> ; {t ; PREV.NEXT <- CURR.NEXT ; NEXT.PREV <- CURR.PREV ; }; END ; END ; QRMLBN::% MOV R1,-(SP) ;Get a work register 0 MOV E.LPRV(R0),R1 ;Is this the first extent? BNE 20$ ;No if NE, MOV E.LNXT(R0),R1 ;Is this the last one? BNE 10$ ;No if NE0 MOV KISAR6,-(SP) ;Save the partition mapping9 MOV E.UCB(R0),R1 ;Get pointer to UCB address ;JRK33001 MOV U.UCBX(R1),KISAR6 ;Map the UCBX ;JRK330 / CLR APR6.BASE+X.CCED ;X.CCED <- 0 ;**-1E( CLR APR6.BASE+X.CCED+2 ;X.CCED+2 <- 0( MOV (SP)+,KISAR6 ;Remap te partition BR 40$ ;And exit10$: MOV E.LNXT(R0),R1 ;Get NEXT0 MOV KISAR6,-(SP) ;Save the partition mapping= MOV R0,-(SP) ;Save the CED address across mapping ;JRK330l; MOV E.UCB(R0),R0 ;Get the UCB address from CED ;JRK330a1 MOV U.UCBX(R0),KISAR6 ;Map the UCBX ;JRK330 2 MOV (SP)+,R0 ;Restore the CED address ;JRK3308 MOV R1,APR6.BASE+X.CCED ;X.CCED <- CURR.NEXT ;**-1( MOV (SP)+,KISAR6 ;Remap te partition" CLR E.LPRV(R1) ;NEXT.PREV <- 0 BR 40$ ;And exitr20$:% MOV E.LNXT(R0),R1 ;Last in queue?E BNE 30$ ;No if NE MOV E.LPRV(R0),R1 ;a0 MOV KISAR6,-(SP) ;Save the partition mapping= MOV R0,-(SP) ;Save the CED address across mapping ;JRK330e; MOV E.UCB(R0),R0 ;Get the UCB address from CED ;JRK33061 MOV U.UCBX(R0),KISAR6 ;Map the UCBX ;JRK330r2 MOV (SP)+,R0 ;Restore the CED address ;JRK330; MOV R1,APR6.BASE+X.CCED+2 ;X.CCED+2 <- CURR.PREV ;**-1 ( MOV (SP)+,KISAR6 ;Remap te partition" CLR E.LNXT(R1) ;PREV.NEXT <- 0 BR 40$ ;And exit130$: MOV E.LPRV(R0),R1 ;Get PREVE4 MOV E.LNXT(R0),E.LNXT(R1) ;PREV.NEXT <- CURR.NEXT MOV E.LNXT(R0),R1 ;Get NEXT,4 MOV E.LPRV(R0),E.LPRV(R1) ;NEXT.PREV <- CURR.PREV40$:" MOV (SP)+,R1 ;Restore saved R1 RETURN ;And all done 0/ .SBTTL QUPAGE - Move CED to end of age queueR;e ; Passed: ; R0 -> CED to updateR;6 ; Returned:;; All registers preserved ;M QUPAGE::& CALL QRMAGE ; Remove it from list( CALL QADAGE ; Add it at end of list RETURN V, .SBTTL QRMAGE - Remove CED from age queue;T ; Passed:X%; R0 -> CED to remove from age listG;X ; Returned:R; All registers preserved-;.; Processing:M;P; CASE .PREV .NEXT.; ------------------------------ ----- ------; I. Element is only in queue EQ 0 EQ 0a.; II. Element is first in queue EQ 0 NE 0-; III. Element is last in queue NE 0 EQ 0U,; IV. Element is within queue NE 0 NE 0.; ------------------------------ ----- -----;; IF CURR.PREV=0; IF CURR.NEXT=0 ; 00ccccccc{; H.CEDH <- 0; H.CEDH+2 <- 0 ; }X; ELSE 0> ; {r ; H.CEDH <- CURR.NEXT; NEXT.PREV <- 0 ; }-; ELSE 0>; IF CURR.NEXT=0 ; {y; PREV.NEXT <- 0 ; H.CEDH+2 <- CURR.PREV ; }; ELSE 0> ; {E ; NEXT.PREV <- CURR.PREV ; PREV.NEXT <- CURR.NEXT ; }-; END ; END ;. QRMAGE::% MOV R1,-(SP) ;Get a work register & MOV E.APRV(R0),R1 ;First in queue? BNE 20$ ;No if NE%  MOV E.ANXT(R0),R1 ;Only in queue?   BNE 10$ ;No if NE 0  CLR APRD.BASE+H.CEDH ;Initialize the pointers  CLR APRD.BASE+H.CEDH+2  BR 40$-10$:* MOV R1,APRD.BASE+H.CEDH ;H.CEDH <- NEXT" CLR E.APRV(R1) ;NEXT.PREV <- 0  BR 40$ 20$:% MOV E.ANXT(R0),R1 ;Last in queue?- BNE 30$ ;No if NE MOV E.APRV(R0),R1 ;Get PREVi" CLR E.ANXT(R1) ;PREV.NEXT <- 0+ MOV R1,APRD.BASE+H.CEDH+2 ;H.CEDH+2 <- 0M  BR 40$030$:4 MOV E.APRV(R0),E.APRV(R1) ;NEXT.PREV <- CURR.PREV MOV E.APRV(R0),R1 ;Get PREVB4 MOV E.ANXT(R0),E.ANXT(R1) ;PREV.NEXT <- CURR.NEXT40$:"  MOV (SP)+,R1 ;Restore saved R1 ! RETURN0" 8# .SBTTL QADAGE - Add a CED at the end of the age queue$;( %; Passed:E&; R0 -> CED to append to listV';X (; Returned: ); All registers preservedi*;+; Processing:(,;1-; CASE H.CEDH H.CEDH+211.; ----------------------------- ------ --------.*/; I. No elements in queue EQ 0 EQ 0,0; II. First element in queue EQ 0 NE 0+1; III. Last element in queue NE 0 EQ 0(*2; IV. Element within queue NE 0 NE 013; ----------------------------- ------ --------4;5; CURR.NEXT <- 06; IF H.CEDH+2=0 7; {e8; H.CEDH <- CURR9; H.CEDH+2 <- CURRl:; CURR.PREV <- 0;; }l<; ELSE 0>=; {r>; CURR.PREV <- H.CEDH+2.?; PREV.NEXT <- CURR-@; H.CEDH+2 <- CURR-A; }.B; END C; DQADAGE::%E MOV R1,-(SP) ;Get a work register F"G CLR E.ANXT(R0) ;CURR.NEXT <- 0H+I MOV APRD.BASE+H.CEDH+2,R1 ;Is list null? J BNE 10$ ;No if NEK>L MOV R0,APRD.BASE+H.CEDH ;This extent becomes first and last&M MOV R0,APRD.BASE+H.CEDH+2 ;in queue/N CLR E.APRV(R0) ;Indicate no previous eitherUO BR 20$ ;And exitP10$:,Q MOV R1,E.APRV(R0) ;CURR.PREV <- H.CEDH+2(R MOV R0,E.ANXT(R1) ;PREV.NEXT <- CURR.S MOV R0,APRD.BASE+H.CEDH+2 ;H.CEDH+2 <- CURRT20$:"U MOV (SP)+,R1 ;Restore saved R1 V RETURN WX .ENDC ; .IFDF D$$CHEEY .END ;CURR.NEXT <- 0H+I MOV APRD.BASE+H.CEDH+2,R1 ;Is list null? J BNE 10$ ;No if NEK>L MOV R0,APRD.BASE+H.CEDH ;This extent becomes first and last&M MOV R0,APRD.BASE+H.CEDH+2 ;in queue/N CLR E.APRV(R0) ;Indicate no previous eitherUO BR 20$ ;And exitP10$:,Q MOV R1,E.APRV(R0) ;CURR.PREV <- H.CEDH+2(R MOV R0,E.ANXT(R1) ;PREV.NEXT <- CURR.4 .IIF DF R$$MPL .TITLE NETCM - CEX COMMON DATABASE3 .IIF NDF R$$MPL .TITLE CEXCM - CEX COMMON DATABASEr .IDENT /V03.19/ e;e; COPYRIGHT (C) 1987 BYg/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.c;s;"H; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIEDH; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THEH; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHERH; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANYH; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY; TRANSFERRED.;MH; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICEH; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT; CORPORATION.;EH; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS9; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.R;T;T; MODULE DESCRIPTION: ; *; COMMUNICATIONS EXECUTIVE COMMON DATABASE;R; IDENT HISTORY:;A; 1.0000ccb`TADATADATADATADATADATA 14-DEC-79; DECNET-11M/S V3.0O; DECNET-11M-PLUS V1.0;T; 3.00 16-APR-82; DECNET-11M V3.1; DECNET-11M-PLUS V1.1;O; 3.01 09-Sep-82,; Add Network management completion listhead?; Add Phase 4 cells ($NA, $NBRA, $NBEA, $AMAXH, $AMAXC, $HIORD)T;.; 3.02 12-Oct-823; Add cell for maximum protocol overhead from CETABO;I; 3.03 17-Nov-825; Add secondary host listhead for Server Base systems ;U; 3.04 30-Nov-82E; Add Broadcast routing timer ($ROUTB) and Broadcast router priority A ; ($RPRI)-;-; 3.05 16-Dec-82@; Merge NETCM M+ specific cells into common CEXCM, remove unused>; cells ($PBIAS,$PAVL) and remove IAS/D comditionals and code./; Condense new cells to one area of the common. /; Add $DECPT, $NMLST, $SPAR1, and $SPAR2 cells.T; Removed 50msec timer labels.;f; 3.06 20-Dec-82@; Conditionalized $PUMR for RSX11M only. This cell is defined in!; LOWCR for RSX-11M-PLUS systems.;; 3.07 21-DEC-82>; Keep Phase III symbols in for 1 release ($PAVL,$T50Q,$T50CL);y; 3.08 22-Dec-82>; Modify (correct) $XAVL cell to be .WORD 0 instead of .WORD 1;C; 3.09 22-Dec-82=; Remove S$$BAS conditional from $SHLST (Secondary Host List);o; 3.10 22-Dec-82?; Local node name ($NTNAM) must follow remote listhead ($RNNHD)A;c; 3.11 4-Jan-83 ; Correct URM location; ; 3.12 19-Jan-83'; conditionalize title for M and M Plusi;e; 3.13 03-Mar-83?; Place M+ conditional around cells moved to DECnet Home Block.P;e; 3.14 22-Mar-838; Add URM cells at the end of all timer queue blocks for&; RSX-11M-Plus multi-processor systems;n; 3.15 28-Mar-838; Put back 4 cells for 3271 product (uses 1.0 comm exec); ; 3.16 3-May-83i3; Correct table of timer blocks for multiprocessors);s; 3.17 16-Oct-84'; Add symbols for $ZTIME+2 and $NMCLH+2 ;r; 3.18 20-Oct-86(; Add $LTEEP LAT exit entry point vector;f; 3.19 29-May-87<; Increase the size of the Event Descriptor Block by 3 words;o .IF DF M$$NET .IF NDF R$$MPL- .MCALL CCBDF$,NKRDF$,OPTDF$ CCBDF$ ; DEFINE CCB OFFSETS- NKRDF$ <:>,<=> ; DEFINE NETWORK KRB OFFSETS.$ OPTDF$ ; DEFINE CEX OPTIONS FLAGS .PSECT CEXCOM .ENDC ; NDF R$$MPL. M;+(; COMMUNICATION SYSTEM COMMON DATA BASE; ( ORDERING IMPACTS VNP );-;- d/$PDVTA::.BLKW 1 ; ADDRESS OF PDV ADDRESS TABLE2/$SLTMA::.BLKW 1 ; ADDRESS OF SLT ADDRESS TABLEr8$LLCTA::.BLKW 1 ; ADDRESSS OF LLC REVERSE MAPPING TABLE($PDVNM::.BLKW 1 ; NUMBER OF PDV ENTRIES)$SLTNM::.BLKW 1 ; NUMBER OF SYSTEM LINESN'$CCBNM::.BLKW 1 ; # OF CCB'S ALLOCATEDF $CCBSZ::.BLKW 1 ; # BYTES / CCB'$RDBNM::.BLKW 1 ; # OF RDB'S ALLOCATEDX $RDBSZ::.BLKW 1 ; # BYTES / RDB'$SDBNM::.BLKW 1 ; # OF SDB'S ALLOCATEDU $SDBSZ::.BLKW 1 ; # BYTES / SDB7$CCBCT::.BLKW 1 ; COUNTER OF CURRENT # OF CCBS IN POOL :$CCBAF::.BLKW 1 ; COUNTER OF # OF CCB ALLOCATION FAILURES:$LDBAF::.BLKW 1 ; COUNTER OF # OF LDB ALLOCATION FAILURES:$CCBAL::.BLKW 1 ; COUNTER OF # OF DYNAMIC CCB ALLOCATIONS;$RDBTH::.BLKW 1 ; POOL THRESHOLD FOR LDB ALLOCATON FAILURE :$CMPDV::.BLKW 1 ; PDV INDEX OF CURRENT DISPATCHED PROCESS2$ZTIME::.BLKW 1 ; TIME SINCE COUNTERS LAST ZEROED0$ZTIM2::.BLKW 1 ; TIME SINCE SYSTEM LAST ZEROED ' .IF DF M$$PRO .WORD 0 ; UNIBUS RUN MASK  .ENDC5$CMFRK::.WORD 0 ; INITIAL LINK MARKS FORK BLOCK FREE:# .WORD 0 ; ADDRESS OF FORK PROCESST .WORD 0 ; FORK PROCESS QUEUE .WORD .-2- .WORD 0 ; APR5 BIAS FOR FORK LEVEL DISPATCHC# ; FREE WORD ON UNMAPPED SYSTEMSS%$T50Q:: ; PHASE III COMPATIBILITY D'$T100Q::.WORD 0 ; 100 MSEC TIMER QUEUEP .WORD .-2$STMFC:: .IF NDF R$$MPLZA .WORD FC.TIM+FS.STM ; FUNCTION CODE TO DISPATCH 50 MSEC TIMEOUTS; .IFF ; NDF R$$MPL .WORD 0 .ENDC ; R$$MPLP$$T50CL:: ; PHASE III COMPATIBILITY4$T100C::.WORD 0,0,0,0,0 ; 100 MSEC CLOCK QUEUE ENTRY) .WORD 0 ; ADDRESS OF PROCESSING ROUTINET ; (FILLED IN BY NTL)* .WORD 0 ; APR5 BIAS FOR LOADABLE DRIVERS .IF DF M$$PRO .WORD 0 ; Unibus run maskM .ENDC M$LTMFC:: .IF NDF R$$MPLI> .WORD FC.TIM+FS.LTM ; FUNCTION CODE TO DISPATCH L00cccccccONG TIMEOUTS .IFF ; NDF R$$MPL .WORD 0 .ENDC ; NDF R$$MPL+4$T1SCL::.WORD 0,0,0,0,0 ; 1 SECOND CLOCK QUEUE ENTRY) .WORD 0 ; ADDRESS OF PROCESSING ROUTINEP ; (FILLED IN BY NTL)* .WORD 0 ; APR5 BIAS FOR LOADABLE DRIVERS .IF DF M$$PRO .WORD 0 ; Unibus run maskF .ENDC/$DECPT::.WORD 0 ; Pointer to DECnet Home Block -$PSIPT::.WORD 0 ; POINTER TO PSI HOME BLOCKO"$SNAPT::.WORD 0 ; POINTER FOR SNA $DDFNC:: .IF NDF R$$MPLP1 .WORD FC.PWR ; POWERFAIL RECOVERY FUNCTION CODEH .IFF ; NDF R$$MPL .WORD 0 .ENDC ; NDF R$$MPLC,$CCBLH::.BLKW 1 ; POINTER TO FIRST FREE CCB3$SDBCT::.BLKW 1 ; COUNTER OF CURRENT SDB'S IN POOLS:$SDBLH::.BLKW 1 ; POINTER TO FIRST FREE SMALL DATA BUFFER- .BLKW 1 ; SECOND HALF OF ADDRESS DOUBLEWORDD:$SDBAF::.BLKW 1 ; COUNTER OF # OF SDB ALLOCATION FAILURES3$RDBCT::.BLKW 1 ; COUNTER OF CURRENT RDB'S IN POOLO7$RDBLH::.BLKW 1 ; POINTER TO FIRST FREE RECEIVE BUFFER- .BLKW 1 ; SECOND HALF OF ADDRESS DOUBLEWORDW:$RDBAF::.BLKW 1 ; COUNTER OF # OF RDB ALLOCATION FAILURES?$RDQSL::.BLKW 1 ; SYSTEM LINE # TO CHECK ON NEXT BUFFER RETURNE:$RDQCT::.BLKW 1 ; NUMBER OF BUFFER WAIT REQUESTS AND FLAG7$NTLPT::.BLKW 1 ; NTL POINTER TO IMPURE AREA IN NTPOOLR-$CXOPT::.BLKW 1 ; COMM/EXEC OPTIONS INCLUDEDD S1$NBIAS::.BLKW 1 ; POINTER TO NON-UMR MAPPED POOLL8$QBIAS::.BLKW 1 ; POINTER TO UMR-MAPPED PORTION OF POOL>$QSTRT::.BLKW 1 ; ORIGINAL BIAS OF UMR-MAPPED PORTION OF POOL .IF NDF R$$MPLL$$PUMR:: .BLKW 1 ; STARTING UMR BIAS .ENDC U"$PWRF1::.BLKW 1 ; POWER FAIL FLAG4$XBIAS::.BLKW 1 ; BIAS OF EXTENDED SINGLE WORD POOL$$PAVL:: ; PHASE III COMPATIBILITY?$XAVL:: .WORD 0 ; POINTER TO FIRST FREE BLOCK IN EXTENDED POOLR($NMLST::.WORD 0 ; Logical Name Listhead($OBJHD::.BLKW 1 ; OBJECT TABLE LISTHEAD.$TK100:: ; NUMBER OF CLOCK TICKS IN 100 MSEC3$TCK50::.WORD 4 ; NUMBER OF CLOCK TICKS IN 50 MSECL@$SQRCM::.BYTE 0 ; SQ ROOT LIMIT FOR COMPONENT BUFFER ALLOCATION' .BYTE 0 ; NUMBER OF ACTIVE COMPONENTST-$MAXOV::.BLKW 1 ; MAXIMUM PROTOCOL OVERHEAD F,$LGPDV::.BLKW 1 ; PDV INDEX OF EVENT LOGGER3$LGDDB::.BLKW 1 ; ADDRESS OF EVENT LOGGER DATABASE($FILHD::.BLKW 1 ; EVENT FILTER LISTHEAD&$LGSTT::.BLKW 1 ; EVENT LOGGER STATUS+$EVDSC::.BLKW 11. ; EVENT DESCRIPTOR BLOCKJ8$LGFNB::.BLKW 3 ; EVENT LOGGER FILENAME BLOCK - FILE ID .RAD50 /EVENTLOG/ ; FILENAMEM .RAD50 /SYS/ ; FILE TYPE .BLKW ; VERSION NUMBERO .ASCII /LB/ ; DEVICE NAME  .BLKW ; AND UNIT;$LGUIC::.BYTE 6,1 ; UIC FOR LOGGING FILE (DEFAULT = [1,6])P+$LGMON::.RAD50 /MON.../ ; MONITOR TASK NAMEI*$LGCON::.ASCII /CO/ ; CONSOLE DEVICE NAME .WORD 0 ; AND UNITT;$CELFN::.WORD 0 ; CEX LOGGING FUNCTION CODE (MUST BE ZERO)K9$NMCLH::.WORD 0 ; NETWORK MANAGEMENT COMPLETION LISTHEADR$NMCL2::.WORD .-2F .IF DF R$$MPL)$NETPF::.WORD 0 ; POWERFAIL ENTRY POINT 3$NTLAL::.WORD 0 ; NTL POINTER TO CEX POOL LISTHEAD. W .IF DF M$$PRO .,TIMERS: .WORD -1 ; SHOW TIMER IS NOT ACTIVE4 .WORD 0,0,0,0,0 ; PROCESSOR #1 DEPENDANT ONE SECOND .WORD 0 ; TIMER QUEUE BLOCK .WORD 0 .WORD 0$$$STM=.-TIMERSI2 .WORD 0,0,0,0,0 ; PROCESSOR #1 DEPENDANT 100 MSEC .WORD 0 ; TIMER QUEUE BLOCK .WORD 0 .WORD 0$$$LEN=.-TIMERSH .REPT M$$PRO-1K% .WORD -1 ; SHOW TIMER IS NOT ACTIVE28 .WORD 0,0,0,0,0 ; PROCESSOR #2 - N DEPENDANT ONE SECOND .WORD 0 ; TIMER QUEUE BLOCK .WORD 0 .WORD 06 .WORD 0,0,0,0,0 ; PROCESSOR #2 - N DEPENDANT 100 MSEC .WORD 0 ; TIMER QUEUE BLOCK .WORD 0 .WORD 0 .ENDR$$$OFF=2$1SCTB::.REPT M$$PRO@ .WORD TIMERS+$$$OFF ; POINTER TO PROCESSOR DEPENDANT TIMER CELL$$$OFF=$$$OFF+$$$LEN .ENDR $$$OFF=$$$STM0$STMTB::.REPT M$$PRO@ .WORD TIMERS+$$$OFF ; POINTER TO PROCESSOR DEPENDANT TIMER CELL$$$OFF=$$$OFF+$$$LEN .ENDR=$CRESL::LCKDF$ SPIN ; SERIALIZE ACCESS TO COMMEXEC RESOURCES   .ENDC ; M$$PRO  .ENDC ; R$$MPLO*$SHLST::.WORD 0 ; SECONDARY HOST LISTHEAD8$IMASK:: ; For 3271 back compatibility (1.0 comm exec)$EMASK:: ; ....$ETIMR:: ; ...$/$SPAR1::.WORD 0 ; First Dou00ccb`TADATADATADATADATADATAble word spare cellF .WORD 08$PBIAS:: ; For 3271 back combatibility (1.0 comm exec)0$SPAR2::.WORD 0 ; Second Double word spare cell .WORD 0;$< .IF DF R$$MPL ; Leave cells for M+ backwards compatability;$,; Cells to be moved to the DECnet Home Block;A+$ANNHD::.BLKW 1 ; ALIAS NODE NAME LISTHEAD$.$RNNHD::.WORD .+2 ; REMOTE NODE NAME LISTHEAD1 .WORD 0 ; TEMPORARY END OF REMOTE NAME LISTHEADc"$NTNAM::.BLKB 6 ; LOCAL NODE NAME$$NSPNM::.BLKW 1 ; LOCAL NODE NUMBER4$NODID::.BLKW 1 ; LENGTH OF LOCAL NODE IDENT STRING' .BLKB 32. ; LOCAL NODE IDENTIFICATIONy$$HOST:: .BLKW 1 ; HOST NODE ADDRESS4$NLN:: .BLKW 1 ; NUMBER OF ROUTING CHANNELS FOR NSP+$NN:: .BLKW 1 ; NUMBER OF NODES IN NETWORKi$MAXC:: .BLKW 1 ; MAXIMUM COSTt$MAXH:: .BLKW 1 ; MAXIMUM HOPS:-$MAXV:: .WORD 20. ; MAXIMUM VISITATION COUNTW.$SQRTL::.BLKW 1 ; SQUARE ROOT LIMITING FACTOR,$ROUTM::.WORD 30. ; ROUTING TIMER (SECONDS);: .ENDC ; R$$MPLN; !; SYNC AND PAD BUFFER DESCRIPTORS ;B $SYNC==226K $SYNCT==8. $PAD==377 $PADSH==2. $PADKL==10.$SYNB::I .WORD 0 .WORD $SYNBFB .WORD $SYNCTO$PADB:: .WORD 0 .WORD $PADBFO .WORD $PADKLE$PADBF:: .REPT $PADKL; .BYTE $PADD .ENDR$SYNBF:: .REPT $SYNCT; .BYTE $SYNC .ENDR;K; COMM EXEC FREE SPACE POINTER;  .IF NDF R$$MPLS .PSECT $$$POL .WORD 3 ; ROUNDING FACTORL.$CEAVL::.WORD 0 ; POINTER TO FIRST FREE BLOCK .WORD 0 .PSECTN .IFF ; NDF R$$MPL .IF NDF K$$DASE9$LTEEP::.WORD $SPVEX ; LAT PROCESS TASK EXIT ENTRY POINT$) ; ADDRESS. INITIALIZED TO A RETURN IND& ; IN IOSUB, WILL BE FILLED IN WHEN ; LAT IS LOADEDO .IFF ; NDF K$$DAS$LTEEP::.WORD 0. .ENDC ; NDF K$$DASA .ENDC ; NDF R$$MPL. .ENDC ; DF M$$NET .IF DF R$$MPL3$NTEND:: ; END OF ARE TO DEALLOCATE IN SET /NOCEXS ; MCR COMMAND .ENDC ; R$$MPLI C .ENDC .TITLE DRMAP" .IDENT /05.05/P;T8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;0>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;+ ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ;  ; B. S. MCCARTHY ; J. M. LAWLER;F-; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:N;D; J. R. KAUFFMAN;N-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:N;P; B. S. MCCARTHY;R,; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY;9"; J. R. KAUFFMAN 10-FEB-86 05.01; 9; JRK324 -- CORRECT CONDITIONALIZATION ERROR IN $STFMPU;A!; J. R. KAUFFMAN 9-MAY-86 05.02P;N=; JRK329 -- PREVENT UNMAPPED WINDOW CHANGE IN FAST MAPPINGI;F"; B. S. MCCARTHY 13-DEC-86 05.03; 5; BM378 -- RECONDITIONALIZE CACHE BYPASS IN CRAW$,R; AND MAP$ ON C$$CBP;"; B. S. MCCARTHY 31-DEC-86 05.04;I5; BM378 -- CONDITIONALIZE CALLS TO $GTMCT IN ABOVEC;Y ; J. W. BERZLE 24-FEB-87 05.05;E*; JWB195 -- ADD LINE BACK TO RESTORE R17;08 .PAGE9; (:; **-CSM DISPATCHER-DISPATCH CSM ENTRY;;$F<; THIS MODULE IS MAPPED AT SUPERVISOR MODE VIRTUAL ZERO ON DETECTINGI=; THE PRESENCE OF THE FIRST SUPERVISOR MODE WINDOW IN A CONTEXT SWITCH.-H>; THIS ALLOWS TASKS TO HAVE SUPER MODE LIBRARIES AT ARBITRARY STARTING,?; ADDRESSES, DESPITE THE OPERATION OF CSM.@;Y&A; * * * N O T E W E L L * * *B;OHC; THIS CODE MUST BE AT VIRTUAL 0 IN SUPERVISOR MODE. SINCE WE JUST MAPJD; THIS COMMON AS 32WORDS RO IN SYSXT, THIS CODE MUST BE AT THE BEGINNINGE; OF THIS COMMON.PF;C6G; THE ENTRY VECTOR TO SUPERVISOR MODE IS AS FOLLOWS:H;V!I; MOV #COMPLETION-ROUTINE,-(SP)RJ; CSM #ROUTINEK;EEL; NOTE: IMMEDIATE MODE EMULATION OF THE CSM INSTRUCTION IS REQUIRED M; IN THE EXECUTIVE.N;REO; THE CSM INSTRUCTION TRANSFERS CONTROL TO THE ADDRESS CONTAINED IN*JP; SUPERVISOR MODE VIRTUAL 10. AT THIS POINT THE STACK IS THE FO00cccccccLLOWING:Q;ER; (SP) ROUTINE ADDRESS+S; 2(SP) PC (PAST END OF TRANSFER VECTOR)H*T; 4(SP) PS WITH CONDITION CODES CLEARED%U; 6(SP) COMPLETION-ROUTINE ADDRESSTV; 10(SP) RETURN ADDRESSLW;@X; A ROUTINE ADDRESS OF 0 IS SPECIAL CASED TO SUPPORT RETURN TOGY; SUPERVISOR MODE FROM A USER MODE DEBUGGING AID (ODT). IN THIS CASEZ; STACK IS THE FOLLOWING:[; \; (SP) ZEROR&]; 2(SP) PC FROM CSM TO BE DISCARDED&^; 4(SP) PS FROM CSM TO BE DISCARDED-_; 6(SP) SUPER MODE PC SUPPLIED BY DEBUGGER-`; 10(SP) SUPER MODE PS SUPPLIED BY DEBUGGER a;Fbc .IF DF S$$LIBd e .ENABL LSBNf:g; BASE ADDRESS USED FOR RELATIVE ADDRESSES WITHIN MODULEhiBASE:RjCk; DEBUGGER RETURN TO SUPER MODE ENTRY. MUST START AT VIRTUAL ZERORl0m CMP (SP)+,(SP)+ ;CLEAN OFF PS AND PC FROM CSMno;DEp; THIS ENTRY POINT PERFORMS THE NECESSARY STACK MANAGEMENT TO ALLOWR=q; AN RTI FROM SUPER MODE TO EITHER SUPER MODE OR USER MODE.M"r; THE IS AS REQUIRED FOR AN RTI:s;Ct; (SP) SUPER MODE PCu; 2(SP) SUPER MODE PSPv&w TST 2(SP) ;RETURNING TO USER MODE?x BR 70$ ;JOIN COMMON CODEyGz; CSM TRANSFER ADDRESS, THIS WORD MUST BE AT VIRTUAL 10 IN SUPER MODE{*| .WORD CSMSVR-BASE ;CSM DISPATCHER ENTRY}~; DISPATCH CSM ENTRYDCSMSVR: MOV 6(SP),2(SP) ;SET COMPLETION ROUTINE ADDRESS FOR RETURN6 JMP @(SP)+ ;TRANSFER TO SUPER MODE LIBRARY ROUTINE&; EXIT DISPATCHER FOR ODT AND $SRTI:70$: BPL 80$ ;IF PL YES5 MOV #6,-(SP) ;NUMBER OF BYTES FOR (SP), PS, AND PC* ADD SP,(SP) ;COMPUTE CLEAN STACK VALUE* MTPI SP ;SET UP PREVIOUS STACK POINTER080$: RTT ;RETURN TO PREVIOUS MODE AND CALLER .DSABL LSB1 .ENDC ; DF S$$LIB .PAGE;EM; THE FOLLOWING DIRECTIVES RECEIVE AS INPUT POINTERS TO A WINDOW DEFINITIONPL; BLOCK, WHICH SERVES AS A COMMUNICATION AREA BETWEEN THE ISSUING TASK AND@; THE EXECUTIVE. THE FORMAT OF THE WINDOW DEFINITION BLOCK IS:;6; -------------------------------------------------; W.NID ! ! !D#; W.NAPR ! BASE APR ! WINDOW ID !S; ! ! !6; !-----------------------------------------------! ; ! !S,; W.NBAS ! VIRTUAL BASE ADDRESS (BYTES) ! ; ! !B6; !-----------------------------------------------! ; ! !S(; W.NSIZ ! WINDOW SIZE (32W BLOCKS) ! ; ! !M6; !-----------------------------------------------! ; ! !R; W.NRID ! REGION ID !B ; ! !6; !-----------------------------------------------! ; ! ! /; W.NOFF ! OFFSET IN PARTITION (32W BLOCKS) !! ; ! !!6; !-----------------------------------------------! ; ! !.*; W.NLEN ! LENGTH TO MAP (32W BLOCKS) ! ; ! ! 6; !-----------------------------------------------! ; ! ! ; W.NSTS ! STATUS WORD !S ; ! ! 6; !-----------------------------------------------! ; ! ! /; W.NSRB ! SEND/RECEIVE BUFFER ADDR (BYTES) ! ; ! !-6; -------------------------------------------------; ; MACRO LIBRARY CALLSI;2 .IF DF P$$LAS% .MCALL HDRDF$,PCBDF$,TCBDF$,WDBDF$-3 HDRDF$ ;DEFINE HEADER AND WINDOW BLOCK OFFSETSO4 PCBDF$ ;DEFINE PCB AND ATTACHMENT DESCR OFFSETS TCBDF$ ;DEFINE TCB OFFSETS-3 WDBDF$ ;DEFINE WINDOW DEFINITION BLOCK OFFSETS .PAGE;+#; **-$DRCRW-CREATE ADDRESS WINDOW-;-L; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ALLOCATE AN ADDRESS WINDOW IN THEI; HEADER OF THE ISSUING TASK, UNMAPPING AND ELIMINATING ANY OVERLAPPING C; ADDRESS WINDOWS OF THE SAME TYPE, AND OPTIONALLY TO MAP THE NEWC ; WINDOW.B;C; DPB FORMAT:H; $; WD. 00 -- DIC(117.),DPB SIZE(2.)0; WD. 01 -- ADDRESS OF WINDOW DEFINITION BLOCK;E ; INPUTS: ;F;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. .; R3=ADDRESS OF THE WINDOW DEFINITION BLOCK.1; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.T.; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;E4; INPUT FIELDS IN THE WINDOW DEFINITION BL00ccb`TADATADATADATADATADATAOCK ARE:; W.NAPR=BASE APR OF REGION.W+; W.NSIZ=DESIRED SIZE OF ADDRESS WINDOW. C; W.NRID=ID OF REGION TO MAP OR 0 FOR TASK REGION (IF WS.MAP=1).16; W.NOFF=OFFSET WITHIN REGION TO MAP (IF WS.MAP=1).C; W.NLEN=LENGTH TO MAP OR 0 TO DEFAULT TO SMALLER OF WINDOW SIZEU.; OR SIZE LEFT IN PARTITION (IF WS.MAP=1). ; W.NSTS=CONTROL INFORMATION.3; WS.SIS=1 IF WINDOW IS TO BE IN SUPER I SPACE.5&; WS.MAP=1 IF MAPPING IS TO OCCUR.8; WS.WRT=1 IF MAPPING IS TO OCCUR WITH WRITE ACCESS.;7; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)O;R/; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.0(; DIRECTIVE STATUS OF +1 IS RETURNED.!; C=1 IF DIRECTIVE IS REJECTED. 7; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE THES2; DIRECTIVE FAILS IN THE MAPPING STAGE BECAUSE0; THE SPECIFIED REGION HAS INCURRED A PARITY ; ERROR.>; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE SPECIFIED,; ACCESS IS DENIED IN THE MAPPING STAGE.@; DIRECTIVE STATUS OF 'D.RS84' IS RETURNED IF AN INVALID APR-3; WINDOW SIZE COMBINATION IS SPECIFIED OR IF ANI;; INVALID REGION OFFSET-LENGTH COMBINATION IS SPECIFIEDS; IN THE MAPPING STAGE.I=; DIRECTIVE STATUS OF 'D.RS85' IS RETURNED IF THERE ARE NOI; AVAILABLE WINDOW BLOCKS.B; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF AN INVALID REGION+; ID IS SPECIFIED IN THE MAPPING STAGE.A;F5; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE: ; W.NID=ASSIGNED WINDOW ID.+; W.NBAS=VIRTUAL BASE ADDRESS OF WINDOW.F#; W.NLEN=LENGTH ACTUALLY MAPPED.O8; W.NSTS=INDICATION OF ANY CHANGES IN MAPPING STATUS.:; WS.CRW=1 IF ADDRESS WINDOW SUCCESSFULLY ESTABLISHED.6; WS.ELW=1 IF ANY ADDRESS WINDOWS WERE ELIMINATED.4; WS.UNM=1 IF ANY ADDRESS WINDOWS WERE UNMAPPED.;I:; NOTE: ON SYSTEMS SUPPORTING EXTERNAL TASK HEADERS, THE5; DIRECTIVE DISPATCHER COPIES THE USER WDB INTO ANP6; INTERMEDIATE BUFFER AREA. ON EXIT, THE DIRECTIVE3; DISPATCHER WILL WRITE ANY OUTPUT FIELDS TO THEE; USER BUFFER. ;E;-3$DRCRW::MOV R4,-(SP) ;SAVE ADDRESS OF TASK HEADERE5 MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOW BLOCKSS0  MOV (R4)+,R1 ;PICK UP NUMBER OF WINDOW BLOCKS   .IF DF U$$DAS -  MOV R1,-(SP) ;SAVE NUMBER OF WINDOW BLOCKSE .ENDC ; DF U$$DAS8 MOV (R3)+,R2 ;PICK UP APR NUMBER IN HIGH BYTE (W.NID) CLRB R2 ;CLEAR OUT LOW BYTED$ CMP R2,#7*256. ;LEGAL APR NUMBER? BLOS 3$ ; IF LOS YES  JMP 40$ ;C3$:L1 ASR R2 ;CONVERT TO BASE ADDRESS IN 32W BLOCKS 4 MOV R2,(R3) ;STORE VIRTUAL BASE ADDRESS (W.NBAS)' ASR (R3) ;CONVERT TO BYTES (W.NBAS)I ASR (R3) ; SWAB (R3)+ ;' MOV R2,-(SP) ;CALCULATE HIGH ADDRESSL ADD (R3),(SP) ;(W.NSIZ) BCS 40$ ;IF CS ILLEGAL SIZEO% CMP (SP),#2000 ;LEGAL TOP ADDRESS?D  BHI 40$ ;IF HI NO '! MOV R1,-(SP) ;SAVE NUMBER OF WINDOWS"# .IF DF U$$DAS$4% BIT #T4.DSP,T.ST4(R5) ;TASK USE USER DATA SPACE ?&& BEQ 5$ ;IF EQ NO, ONLY WINDOW ZERO' ;CAN'T BE OVERLAPPED'( DEC (SP) ;YES IT DOES, WINDOWS ZERO ) ;AND ONE ARE OFF LIMITSN*+ .ENDC ; DF U$$DAS,/-5$: CMP -(R3),-(R3) ;POINT TO START OF WINDOW;. ;BLOCK (W.NBAS) (W.NID)G3/ MOV #WS.EDS,R0 ;GET NECESSARY BITS FOR SELECTIONI.0 BIC W.NSTS(R3),R0 ;ALL BITS SET IN W.NSTS ?"1 BNE 10$ ;IF NE NO, LEAVE ALONE23 .IF DF U$$DAS485 BIC #WS.SIS,W.NSTS(R3) ;ALWAYS CLEAR SUPER I SINCE IT6 ;WAS JUST A FLAG BIT.>7 BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D SPACE ?/8 BNE 10$ ;IF NE YES, LEAVE WINDOW IN D SPACE @9 BIC #WS.UDS,W.NSTS(R3) ;CLEAR USER DATA SPACE FOR I ONLY TASK:; .IFF ; DF U$$DAST<<= BIC #WS.EDS,W.NSTS(R3) ;ALWAYS LOOKS LIKE IT DEFAULTED TO$> ;I SPACE ON NON I/D SYSTEMS?@ .ENDC ; DF U$$DASAAB10$: TST W.BSIZ(R4) ;POINTING TO AN ESTABLISHED ADDRESS WINDOW?FC BEQ 20$ ;IF EQ NO#DEF .IF DF S$$LIBG>H BIT #WS.SIS,W.NSTS(R3) ;CREATING SUPERVISOR I SPACE WINDOW?I BEQ 14$ ;IF EQ NOT9J TSTB W.BFPD(R4) ;LOOK00dccccccING AT SUPERVISOR I SPACE WINDOW?IK BMI 30$ ;IF MI NOC L BR 15$ ;MN .IFTF ; DF S$$LIBOP14$: ;REFERENCE LABELQR .IF DF U$$DASS9T BIT #WS.UDS,W.NSTS(R3) ;CREATING USER D SPACE WINDOW ? U BEQ 141$ ;IF EQ NO7V BIT #20,W.BFPD(R4) ;LOOKING AT USER D SPACE WINDOW ?4W BEQ 30$ ;IF EQ NOLX BR 15$ ;YESDY141$: ;REFERENCE LABELZ[ .ENDC ; DF U$$DAS\] .IFT ; DF S$$LIB(^_ .IF DF U$$DAS`9a CMPB #216,W.BFPD(R4) ;LOOKING AT USER I SPACE WINDOW ?;b BLT 30$ ;IF LT NO cd .IFF ; DF U$$DAS$e5f TSTB W.BFPD(R4) ;LOOKING AT SUPER I SPACE WINDOW ?g BPL 30$ ;IF PL YEShi .ENDC ; DF U$$DASjkl .IFTFm5n15$: MOV W.BLVR(R4),R0 ;PICK UP LOW VIRTUAL ADDRESSF"o SWAB R0 ;CONVERT TO 32W BLOCKS p ASL R0 ; q ASL R0 ;2r CMP 2(SP),R0 ;POSSIBLE VIRTUAL ADDRESS OVERLAP?s BLOS 30$ ;IF LOS NO,t ADD W.BSIZ(R4),R0 ;CALCULATE HIGH ADDRESS'u CMP R2,R0 ;VIRTUAL ADDRESS OVERLAP?Wv BHIS 30$ ;IF HIS NORwx .IF DF U$$DASy*z TST (SP) ;ALREADY ESTABLISHED WINDOW ?#{ BEQ 17$ ;IF EQ YES, ALLOW UNMAPP|} .IFTF ; DF U$$DAS~0 CMP R1,(SP) ;OVERLAPPING WINDOW ZERO (OR ONE ;IF I/D TASK ?)V .IFT ; DF U$$DASO+ BHIS 40$ ;IF HIS YES, DON'T ALLOW UNMAPL .IFF ; DF U$$DASL) BEQ 40$ ;IF EQ YES, DON'T ALLOW UNMAPS .ENDC ; DF U$$DAS17$: ;REFERENCE LABEL' CALL ELAW ;ELIMINATE ADDRESS WINDOWV020$: TST (SP) ;HAS A WINDOW BEEN ESTABLISHED? BEQ 30$ ;IF EQ YESA CMP (R3)+,(R3)+ ;POINT TO WINDOW SIZE IN BLOCK (W.NID)(W.NBAS)Y@ MOV (R3),W.BSIZ(R4) ;STORE SIZE, ESTABLISHING WINDOW (W.NSIZ)9 MOV -(R3),W.BLVR(R4) ;SET LOW VIRTUAL ADDRESS (W.NBAS)3 MOVB -(R3),R0 ;PICK UP FIRST APR NUMBER (W.NAPR)O- ASL R0 ;CONVERT APR NUMBER TO WORD OFFSET .IFTI= BIT #WS.SIS,W.NSTS-W.NAPR(R3) ;CREATING SUPERVISOR WINDOW?  BNE 25$ ;IF NE YES .ENDC .IF DF U$$DAS; BIT #WS.UDS,W.NSTS-W.NAPR(R3) ;CREATING D SPACE WINDOW ?Q BEQ 23$ ;IF EQ NO+- ADD #UDSDR0,R0 ;POINT TO FIRST D SPACE PDRY BR 25$ ;ENTER COMMON CODE  .ENDC ; DF U$$DAS123$: ADD #UINDR0,R0 ;POINT TO FIRST I SPACE PDRE025$: MOVB R0,W.BFPD(R4) ;SET FIRST PDR ADDRESS% .IF DF M$$PRO!C$$CBP ; BM378U ;**-14 CLR W.BLPD(R4) ;INITIALIZE CACHE BITS IN LAST PDR6 BIT #WS.NBP,W.NSTS-W.NAPR(R3) ;OK TO BYPASS CACHE ?. BEQ 27$ ;IF EQ YES, LEAVE CACHE BITS ALONE< BIS #WB.NBP,W.BLPD(R4) ;REMEMEBER NOT TO BYPASS THE CACHE27$: ;REFERENCE LABEL( .ENDC ; DF M$$PRO!C$$CBP ; BM378 ;**-1D .IF DF U$$DAS4 MOVB 4(SP),-(R3) ;PICK UP TOTAL NUMBER OF WINDOWS ;(W.NID) .IFF ; DF U$$DASF3 MOVB (SP),-(R3) ;PICK UP TOTAL NUMBER OF WINDOWS7 ;(W.NID) .ENDC ; DF U$$DAS. SUB R1,(R3) ;SET ADDRESS WINDOW ID (W.NID)2 CLR (SP) ;INDICATE WINDOW HAS BEEN ESTABLISHED130$: ADD #W.BLGH,R4 ;POINT TO NEXT WINDOW BLOCKW DEC R1 ;MORE WINDOW BLOCKS?S BGT 10$ ;IF GT YES1 TST (SP)+ ;WAS AN ADDRESS WINDOW ESTABLISHED?  BNE 50$ ;IF NE NO* .IF DF U$$DAS3 CMP (SP)+,(SP)+ ;POP CALCULATED HIGH ADDRESS ANDS ;SAVED NUMBER OF WINDOWS .IFF ; DF U$$DASS* TST (SP)+ ;POP CALCULATED HIGH ADDRESS .ENDC ; DF U$$DAS, MOV (SP)+,R4 ;RESTORE TASK HEADER ADDRESS> BIS #WS.CRW,W.NSTS(R3) ;INDICATE ADDRESS WINDOW WAS CREATED2 BIT #WS.MAP,W.NSTS(R3) ;IS WINDOW TO BE MAPPED?+ BNE $DRMAP ;MAP ADDRESS WINDOW AND EXITI  RETURN ;T%40$: DRSTS D.RS84 ;ALIGNMENT ERRORH*50$: DRSTS D.RS85 ;NO AVAILABLE WINDOWS .PAGE;+&; **-$DRELW-ELIMINATE ADDRESS WINDOW;NJ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ELIMINATE THE SPECIFIED ADDRESS,; WINDOW, UNMAPPING IT FIRST IF NECESSARY.; ; DPB FORMAT:;($; WD. 00 -- DIC(119.),DPB SIZE(2.)0; WD. 01 -- ADDRESS OF WINDOW DEFINITION BLOCK;C ; INPUTS:T;M;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.D.; R3=A00dcb`TADATADATADATADATADATADDRESS OF THE WINDOW DEFINITION BLOCK.1; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. .; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;-4; INPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:-; W.NID=ID OF ADDRESS WINDOW TO ELIMINATE.D;7; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)P;M/; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.(; DIRECTIVE STATUS OF +1 IS RETURNED.!; C=1 IF DIRECTIVE IS REJECTED.;; DIRECTIVE STATUS OF 'D.RS87' IS RETURNED IF AN INVALID#; ADDRESS WINDOW WAS SPECIFIED. ;.5; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:8; W.NSTS=INDICATION OF ANY CHANGES IN MAPPING STATUS.9; WS.ELW=1 IF ADDRESS WINDOW SUCCESSFULLY ELIMINATED.I2; WS.UNM=1 IF THE ADDRESS WINDOW WAS UNMAPPED.;->$DRELW::CALL $SRWND ;SEARCH FOR AND VERIFY SPECIFIED WINDOW(ELAW: CALL $UNMAP ;UNMAP IF NECESSARY. BCC 10$ ;IF CC UNMAPPING WAS NOT PERFORMED9 BIS #WS.UNM,W.NSTS(R3) ;INDICATE A WINDOW WAS UNMAPPEDR<10$: CLR W.BSIZ(R4) ;INDICATE ADDRESS WINDOW IS ELIMINATED= BIS #WS.ELW,W.NSTS(R3) ;INDICATE ADDRESS WINDOW ELIMINATEDW  RETURN ;N .PAGE;+"; **-$DRMAP-MAP WINDOW TO REGION ;RD ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO MAP THE SPECIFIED ADDRESSH ; WINDOW TO AN OFFSET IN THE SPECIFIED REGION, UNMAPPING IF NECESSARY. ;C ; DPB FORMAT:L;A$; WD. 00 -- DIC(121.),DPB SIZE(2.)0; WD. 01 -- ADDRESS OF WINDOW DEFINITION BLOCK;M ; INPUTS:I;T;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.R.; R3=ADDRESS OF THE WINDOW DEFINITION BLOCK.1; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. .; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;I4; INPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:; W.NID=ID OF WINDOW TO MAP.DB; W.NRID=ID OF REGION TO MAP TO OR 0 TO DEFAULT TO TASK REGION.+; W.NOFF=OFFSET WITHIN REGION TO MAP TO.(>; W.NLEN=LENGTH TO MAP OR 0 TO DEFAULT TO SMALLER OF WINDOW%; SIZE OR SIZE LEFT IN PARTITION.A ; W.NSTS=CONTROL INFORMATION.* ; WS.WRT=1 IF WRITE ACCESS IS DESIRED.!;D7"; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)R#;A/$; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.S(%; DIRECTIVE STATUS OF +1 IS RETURNED.!&; C=1 IF DIRECTIVE IS REJECTED. ;'; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE DESIREDO)(; REGION HAS INCURRED A PARITY ERROR.T<); DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE DESIRED%*; ACCESS TO THE REGION IS DENIED.E;+; DIRECTIVE STATUS OF 'D.RS84' IS RETURNED IF AN INVALID.2,; REGION OFFSET-SIZE COMBINATION IS SPECIFIED.;-; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF AN INVALIDA.; REGION ID IS SPECIFIED.S;/; DIRECTIVE STATUS OF 'D.RS87' IS RETURNED IF AN INVALID%0; ADDRESS WINDOW ID IS SPECIFIED. 1;C52; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE: #3; W.NLEN=LENGTH ACTUALLY MAPPED.T84; W.NSTS=INDICATION OF ANY CHANGES IN MAPPING STATUS.05; WS.UNM=1 IF THE WINDOW WAS UNMAPPED FIRST.6;CH7; THIS DIRECTIVE FIRST BUILDS AN IMAGE OF A MAPPED WINDOW BLOCK ON THEJ8; STACK. THEN IF NO ERRORS ARE ENCOUNTERED, THE CORRESPONDING WINDOW IS<9; UNMAPPED, IF NECESSARY, AND SET UP FROM THE STACK IMAGE.:;-;< =$DRMAP::>??; FOR EITHER USER D OR SUPER LIBRARY SYSTEMS, WE PUSH THE TWOC@; MAPPING MASKS (H.DMAP,H.SMAP) ONTO THE STACK FOR USE DURING APRGDA; UPDATE. H.DMAP MUST BE RE-WRITTEN TO THE HEADER AFTER THE UPDATEB; SINCE IT MAY HAVE CHANGED.CD .IF DF S$$LIB!U$$DASE=F ASSUME H.SMAP+1,H.DMAP ;H.SMAP,H.DMAP MUST BE IN SAME WORDC:G MOV H.SMAP(R4),-(SP) ;GET SUPER/USER D MASKS ONTO STACKHI .ENDC ; DF S$$LIB!U$$DASAJ0K CALL $SRWND ;SEARCH FOR AND VALIDATE ADDRESSL ;WINDOW ID/M ADD #W.NRID,R3 ;POINT TO SPECIFIED REGION IDY:N CALL $SRATT ;SEARCH FOR MATCHING ATTACHMENT DESCRIPTOR*O MOV A.PCB(R5),R2 ;POINT TO ATTACHED PCB<P CMP $TKTCB,$FXRPT ;IS THIS THE PARITY ERROR RECOVER TASK?Q BEQ 5$ ;IF EQ YES (R BIT #PS.PER,P.STAT(R2) ;PARITY ERROR?S BEQ 5$ ;IF EQ NO T JMP 90$ ;.:U5$: BIT #W00dccccccS.RES,W.NSTS-W.NRID(R3) ;MAP ONLY IF RESIDENT?V BEQ 10$ ;NO IF EQA:W BIT #PS.CKP!PS.CKR!PS.OUT,P.STAT(R2) ;REGION IN MEMORY?X BEQ 10$ ;IF EQ YESY JMP 100$ ;-Z10$: MOV R2,-(SP) ;SET PCB ADDRESS (W.BPCB) :[ MOV W.BLVR(R4),-(SP) ;COPY LOW VIRTUAL ADDRESS (W.BLVR)'\ TST (R3)+ ;POINT TO OFFSET (W.NRID) ]^ .IF NDF X$$HDRK_2` MOV (R3)+,R0 ;PICK UP SPECIFIED OFFSET (W.NOFF)ab .IFF ; NDF X$$HDRc?d MOVB P.HDLN(R2),R0 ;PICK UP LENGTH OF EXTERNAL HEADER (OR 0) 5e ADD (R3)+,R0 ;CALCULATE REAL OFFSET INTO PARTITIONSf ;(ADD IN W.NOFF)2g BCS 35$ ;IF CS THE OFFSET WRAPPED AROUND. THIS-h ;MAY CAUSE A MAP INTO THE EXTERNAL HDR,1+i ;SO IT IS TREATED ALWAYS AS AN ERROR,("j ;REGARDLESS OF FINAL OFFSET.kl .ENDC ; NDF X$$HDRBm'n CMP R0,P.SIZE(R2) ;WITHIN PARTITION? o BHIS 35$ ;IF HIS NO/p MOV (R3),R1 ;PICK UP LENGTH TO MAP (W.NLEN)N$q BNE 20$ ;IF NE ONE WAS SPECIFIED8r MOV P.SIZE(R2),R1 ;CALCULATE SIZE TO END OF PARTITIONs SUB R0,R1 ;+Dt CMP R1,W.BSIZ(R4) ;SIZE TO END GREATER THAN WINDOW SIZE? (W.BSIZ)u BLOS 20$ ;IF LOS NOE5v MOV W.BSIZ(R4),R1 ;DEFAULT TO WINDOW SIZE (W.BSIZ) 1w20$: MOV R1,(R3)+ ;PASS BACK SIZE USED (W.NLEN)N8x MOV R1,-(SP) ;CALCULATE HIGH VIRTUAL ADDRESS (W.BHVR)y SWAB (SP) ;MULTIPLY BY 64.z RORB (SP) ;P{ ROR (SP) ;| ROR (SP) ;,} DEC (SP) ;POINT TO LAST ADDRESSABLE BYTE~ ADD 2(SP),(SP) ; = MOV R5,-(SP) ;STORE ADDR OF ATTACHMENT DESCRIPTOR (W.BATT)T2 MOV W.BSIZ(R4),-(SP) ;COPY WINDOW SIZE (W.BSIZ)% CMP R1,(SP) ;LEGAL SIZE? (W.BSIZ)  BHI 35$ ;IF HI NO  .IF DF X$$HDR) MOV R0,-(SP) ;COPY THE OFFSET (W.NOFF)Z6 CLR R5 ;SUBTRACT THE HEADER LENGTH FROM THE OFFSET2 MOVB P.HDLN(R2),R5 ;FOR CORRECT ALIGNMENT CHECK: SUB R5,(SP) ;SUB THE HEADER LENGTH FOR ALIGNMENT CHECK# BIT #7,(SP)+ ;64-BYTE ALIGNMENT?P .IFF ; DF X$$HDRA! BIT #7,R0 ;64-BYTE ALIGNMENT?R .IFTF ; DF X$$HDR BEQ 30$ ;IF EQ NOT5 BIT #WS.64B,(R3) ;64-BYTE ALIGNMENT BEING ALLOWED? BEQ 35$ ;IF EQ NOZ .IFT ; DF X$$HDR 30$: MOV 2(SP),R5 ;RESTORE R51 MOV R0,-(SP) ;SET OFFSET IN PARTITION (W.BOFF)R .IFF ; DF X$$HDRE530$: MOV R0,-(SP) ;SET OFFSET IN PARTITION (W.BOFF)I .ENDC ; DF X$$HDR2 ADD R1,R0 ;POINT PAST LAST 32W BLOCK MAPPED TO' CMP R0,P.SIZE(R2) ;WITHIN PARTITION?  BLOS 37$ ;IF LOS YES35$: JMP 70$ ;N=37$: MOV W.BFPD(R4),-(SP) ; SAVE FIRST PDR ADDRESS (W.BFPD)7 BITB #AS.RED!AS.WRT,A.STAT(R5) ;READ ACCESS ALLOWED?B BEQ 38$ ;IF NE NO% .IF DF M$$PRO!C$$CBP ; BM378R ;**-1R9 MOV W.BLPD(R4),-(SP) ;GET PREVIOUS STATE OF CACHE BITSF8 BIC #^C,(SP) ;CLEAR ALL BUT THE NO BYPASS BIT9 BIS #77402,(SP) ;SET FOR READ ACCESS, 4K SIZE (W.BLPD)I' .IFF ; DF M$$PRO!C$$CBP ; BM378. ;**-1R: MOV #77402,-(SP) ;SET FOR READ ACCESS, 4K SIZE (W.BLPD)( .ENDC ; DF M$$PRO!C$$CBP ; BM378 ;**-1T3 BIT #WS.WRT,(R3) ;WRITE ACCESS DESIRED? (W.NSTS) BEQ 40$ ;IF EQ NO1 BITB #AS.WRT,A.STAT(R5) ;WRITE ACCESS ALLOWED?  BNE 39$ ;IF NE YES38$: JMP 80$ ;P39$: ;REFERENCE LABEL% .IF DF M$$PRO!C$$CBP ; BM378E ;**-1B, BIS #4,(SP) ;CHANGE ACCESS TO READ/WRITE( .IFF ; DF M$$PRO!C$$CBP ; BM378 ;**-1 9 MOV #77406,(SP) ;SET FOR 4K READ/WRITE ACCESS (W.BLPD) ( .ENDC ; DF M$$PRO!C$$CBP ; BM378 ;**-1 40$: ;REF SYMBOLT% .IF DF M$$PRO!C$$CBP ; BM3784 ;**-1B= BIT #WS.BPS,(R3) ;SHOULD ACCESSES ALWAYS BYPASS THE CACHE?  BEQ 401$ ;IF EQ NO9 BIS #WB.BPS!100000,(SP) ;SET UP TO ALWAYS BYPASS CACHE  ; BM378  .IF DF M$$PRO ; BM378A ; BM378I  BR 43$ ; ; BM378 " .IFTF ; DF M$$PRO ; BM378 ; BM378 401$: ; BM378 ; BM378C! .IFT ; DF M$$PRO ; BM378 ; BM3780> BIT #WB.NBP,(SP) ;NOT B00dcb`TADATADATADATADATADATAYPASSING CACHE THIS WINDOW? ; BM3781 BNE 43$ ;IF NE YES, SKIP BYPASS TESTS ;**-1 41$: MOV R1,-(SP) ;SAVE R1$ MOV A.PCB(R5),R1 ;GET PCB ADDRESS1 CALL $GTMCT ;DETERMINE NUMBER OF MAPPED TASKS  TST R2 ;IS BYPASS NECESSARY? BEQ 42$ ;NO IF EQ+ BIS #100000,2(SP) ;SET BYPASS BIT IN PDR &42$: MOV R1,R2 ;RESTORE PCB ADDRESS MOV (SP)+,R1 ;RESTORE R1 ;JWB1958" .ENDC ; DF M$$PRO ;JWB195( .ENDC ; DF M$$PRO!C$$CBP ; BM378 ;**-1 .43$: CALL $UNMAP ;UNMAP WINDOW IF NECESSARY( BCC 45$ ;IF CC WINDOW WAS NOT MAPPED< BIS #WS.UNM,(R3) ;INDICATE A WINDOW WAS UNMAPPED (W.NSTS)I; SINCE THE UNMAP MAY HAVE CAUSED THE USER-D MAPPING TO CHANGE, WE MUSTSH; UPDATE THE COPY OF H.SMAP ON THE STACK FROM THE CHANGED VALUE IN THE ; HEADER.2 .IF DF S$$LIB!U$$DASB .IF DF X$$HDR, MOV $SAHPT,R0 ;GET POINTER TO TASK HEADER .IFF ; DF X$$HDR, MOV $HEADR,R0 ;GET POINTER TO TASK HEADER .ENDC ; DF X$$HDRB MOV H.SMAP(R0),W.BLGH(SP) ; UPDATE THE STORED MAPPING FLAG WORD .ENDC ; DF S$$LIB!U$$DASI-45$: MOVB W.BFPD(R4),R0 ;POINT TO FIRST PDRC .IF DF S$$LIB BMI 46$ ;IF MI USER WINDOW0 ADD #SISDR0,R0 ;POINT TO FIRST SUPERVISOR PDR2 TSTB $SUPFL ;IS THIS FIRST SUPER MODE WINDOW ? BNE 455$ ;IF NE YES. MOV R0,-(SP) ;SAVE REGISTERS0 MOV R1,-(SP) ;S' CALL $LSUP1 ;MAP SUPERVISOR D SPACE" MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R0 ;C8455$: INCB $SUPFL ;INDICATE ADDITIONAL SUPER I WINDOW .IFTF746$: MOV P.REL(R2),R2 ;CALCULATE OFFSET FOR FIRST PDRV ADD 4(SP),R2 ;(W.BOFF)I-  CLRB 3(SP) ;INIT NUMBER OF PDR'S (W.BNPD)40 50$: INCB 3(SP) ;INC NUMBER OF PDR'S (W.BNPD),  MOV R2,UISAR0-UISDR0(R0) ;SET UP USER APR'  MOV (SP),(R0)+ ;SET UP NEXT USER PDR   .IFTJ; FIRST CHECK FOR A SUPERVISOR WINDOW. IF IT IS SUPERVISOR, THEN WE MUSTF; CHECK THE SUPERVISOR MAPPING MASK, AND POSSIBLY UPDATE THE SUPER D ; PAR/PDR.1 CMP R0,#UINDR0+2 ;USER SPACE (I OR D) WINDOW ?0 BHIS 52$ ;IF HIS YES, GO DO USER SPACE TESTS@ BITB $BTMSK-2-SISDR0-2(R0),W.BLGH(SP) ;SUPER I/D OVERMAPPED ? BEQ 55$ ;IF EQ NO01 MOV R2,SDSAR0-SISDR0-2(R0) ;UPDATE SUPER D PARV3 MOV (SP),SDSDR0-SISDR0-2(R0) ;UPDATE SUPER D PDRR BR 55$ ;GO DO NEXT PAR/PDR52$: ;REFERENCE LABEL .IFTF ; DF S$$LIBG ; CHECK FOR USER I OR USER D WINDOW. IF A USER I WINDOW, CHECK TO SEE,H!; IF BOTH SPACES MUST BE UPDATED. IF NOT, UPDATE IS DONE. IF SO, CHECKF"; TO SEE IF THIS APR IS USED FOR AN EXPLICIT D WINDOW. IF SO, UPDATE)#; IS DONE. IF NOT UPDATE USER D PAR/PDRH$% .IF DF U$$DAS&-' CMP R0,#UDSDR0+2 ;USER DATA SPACE WINDOW ?S+( BHIS 53$ ;IF HIS YES, GO UPDATE D SPACED;) BITB $BTMSK-UINDR0-2(R0),W.BLGH+1(SP) ;D SPACE MAPPED BYT* ;OTHER WINDOW ?&+ BNE 55$ ;IF NE YES, UPDATE IS DONE0, MOV R2,UDSAR0-UINDR0-2(R0) ;UPDATE USER D PAR2- MOV (SP),UDSDR0-UINDR0-2(R0) ;UPDATE USER D PDR./ .ENDC ; DF U$$DAS0>1; WE HAVE JUST UPDATED A USER D PAR/PDR. CHECK TO SEE IF THEF2; CORRESPONDING SUPER D SPACE PAR/PDR IS CURRENTLY MAPPED INTO USERD83; OR SUPER I SPACE. IF USER D, UPDATE SUPER D PAR/PDR.45 .IFT ; DF S$$LIB 6;7 BITB $BTMSK-2-UINDR0-2(R0),W.BLGH(SP) ;SUPER D MAPPED TOL8 ;USER D THIS APR ?%9 BNE 55$ ;IF NE NO, UPDATE IS DONEI1: MOV R2,SDSAR0-UINDR0-2(R0) ;UPDATE SUPER D PAR(3; MOV (SP),SDSDR0-UINDR0-2(R0) ;UPDATE SUPER D PDR0<= .ENDC ; DF S$$LIB>? .IF DF U$$DAS@&A BR 55$ ;BRANCH AROUND D SPACE CODEBC .IFTF ; DF U$$DASDE53$: ;REFERENCE LABELFG .IFT ; DF U$$DAS HBI; SET BIT IN H.DMAP PROTOTYPE INDICATING THAT THIS APR IS IN USE#J; FOR AN EXPLICIT D SPACE WINDOW.BK@L BISB $BTMSK-UDSDR0-2(R0),W.BLGH+1(SP) ;INDICATE USER D WINDOWM ;USES THIS APRINCO; CHECK TO SEE IF USER D AND SUPER D ARE OVERMAPPED FOR THIS APR.A-P; IF THEY ARE, THEN UPDATE SUPER D PAR/PDR.EQR .IF DF S$$LIBS>T B00 dccccccITB $BTMSK-2-UDSDR0-2(R0),W.BLGH(SP) ;SUPER D/USER D OVER-U ;MAPPED FOR THIS APR ?D%V BNE 55$ ;IF NE NO, UPDATE IS DONE1W MOV R2,SDSAR0-UDSDR0-2(R0) ;UPDATE SUPER D PART3X MOV (SP),SDSDR0-UDSDR0-2(R0) ;UPDATE SUPER D PDREYZ .ENDC ; DF S$$LIB[\ .ENDC ; DF U$$DAS]^ .IF DF S$$LIB_` .IFTFa'b55$: ADD #200,R2 ;ADVANCE APR OFFSETCc SUB #200,R1 ;DONE YET?d BGT 50$ ;IF GT NOHef%f .IF DF M$$PRO!C$$CBP ; BM378Ph ;**-1F,i ADD #177,R1 ;CALCULATE VALUE OF LAST APR&j SWAB R1 ;PLACE IT IN THE HIGH BYTE#k BIC #77400,(SP) ;INITIALIZE SIZE$%l BIS R1,(SP) ;SET SIZE OF LAST PDR,m MOV (SP),-(R0) ;SET LAST PDR n(n .IFF ; DF M$$PRO!C$$CBP ; BM378p ;**-1+q SWAB R1 ;SHIFT UNUSED SIZE TO HIGH BYTESr CLRB R1 ;CLEAR LOW BYTE+s ADD R1,(SP) ;CALCULATE SIZE IN LAST PDROt ADD R1,-(R0) ;SET LAST PDREu(u .ENDC ; DF M$$PRO!C$$CBP ; BM378w ;**-1 xyz .IFT {|J}; FIRST CHECK FOR A SUPERVISOR WINDOW. IF IT IS SUPERVISOR, THEN WE MUSTF~; CHECK THE SUPERVISOR MAPPING MASK, AND POSSIBLY UPDATE THE SUPER D ; PAR/PDR./ CMP R0,#UINDR0 ;USER SPACE (I OR D) WINDOW ?;0 BHIS 56$ ;IF HIS YES, GO DO USER SPACE TESTS> BITB $BTMSK-2-SISDR0(R0),W.BLGH(SP) ;SUPER I/D OVERMAPPED ? BEQ 59$ ;IF EQ NO,% .IF DF M$$PRO!C$$CBP ; BM378R ;**-1D1 MOV (SP),SDSDR0-SISDR0(R0) ;UPDATE SUPER D PDR( .IFF ; DF M$$PRO!C$$CBP ; BM378 ;**-1 / ADD R1,SDSDR0-SISDR0(R0) ;UPDATE SUPER D PDRU( .ENDC ; DF M$$PRO!C$$CBP ; BM378 ;**-1E BR 59$ ;UPDATE IS DONE56$: ;REFERENCE LABEL .IFTF ; DF S$$LIBG; CHECK FOR USER I OR USER D WINDOW. IF A USER I WINDOW, CHECK TO SEELH; IF BOTH SPACES MUST BE UPDATED. IF NOT, UPDATE IS DONE. IF SO, CHECKF; TO SEE IF THIS APR IS USED FOR AN EXPLICIT D WINDOW. IF SO, UPDATE); IS DONE. IF NOT UPDATE USER D PAR/PDR  .IF DF U$$DAS+ CMP R0,#UDSDR0 ;USER DATA SPACE WINDOW ?(+ BHIS 57$ ;IF HIS YES, GO UPDATE D SPACE$( TST W.BLGH+2(SP) ;UPDATE ALL SPACES ? BNE 59$ ;IF NE NOI9 BITB $BTMSK-UINDR0(R0),W.BLGH+1(SP) ;D SPACE MAPPED BYB ;OTHER WINDOW ?& BNE 59$ ;IF NE YES, UPDATE IS DONE% .IF DF M$$PRO!C$$CBP ; BM378D ;**-1E0 MOV (SP),UDSDR0-UINDR0(R0) ;UPDATE USER D PDR( .IFF ; DF M$$PRO!C$$CBP ; BM378 ;**-1 . ADD R1,UDSDR0-UINDR0(R0) ;UPDATE USER D PDR( .ENDC ; DF M$$PRO!C$$CBP ; BM378 ;**-1H .ENDC ; DF U$$DAS>; WE HAVE JUST UPDATED A USER D PAR/PDR. CHECK TO SEE IF THEF; CORRESPONDING SUPER D SPACE PAR/PDR IS CURRENTLY MAPPED INTO USERD8; OR SUPER I SPACE. IF USER D, UPDATE SUPER D PAR/PDR. .IFT ; DF S$$LIBB9 BITB $BTMSK-2-UINDR0(R0),W.BLGH(SP) ;SUPER D MAPPED TO( ;USER D THIS APR ?% BNE 59$ ;IF NE NO, UPDATE IS DONE% .IF DF M$$PRO!C$$CBP ; BM378( ;**-1P1 MOV (SP),SDSDR0-UINDR0(R0) ;UPDATE SUPER D PDR( .IFF ; DF M$$PRO!C$$CBP ; BM378 ;**-1T/ ADD R1,SDSDR0-UINDR0(R0) ;UPDATE SUPER D PDRR( .ENDC ; DF M$$PRO!C$$CBP ; BM378 ;**-1 .ENDC ; DF S$$LIB .IF DF U$$DAS& BR 59$ ;BRANCH AROUND D SPACE CODE .IFTF ; DF U$$DAS57$: ;REFERENCE LABEL .IFT ; DF U$$DAS C; CHECK TO SEE IF USER D AND SUPER D ARE OVERMAPPED FOR THIS APR. -; IF THEY ARE, THEN UPDATE SUPER D PAR/PDR.D .IF DF S$$LIB< BITB $BTMSK-2-UDSDR0(R0),W.BLGH(SP) ;SUPER D/USER D OVER- ;MAPPED FOR THIS APR ?U% BNE 59$ ;IF NE NO, UPDATE IS DONE.% .IF DF M$$PRO!C$$CBP ; BM378  ;**-1N1 MOV (SP),SDSDR0-UDSDR0(R0) ;UPDATE SUPER D PDR ( .IFF ; DF M$$PRO!C$$CBP ; BM378 ;**-1:/ ADD R1,SDSDR0-UDSDR0(R0) ;UPDATE SUPER D PDR( .ENDC ; DF M$$PRO!C$$CBP ; BM378 ;**-1A .ENDC ; DF S$$LIB .ENDC ; DF U$$DAS00(dcb`TADATADATADATADATADATA/59$: MOV R4,R3 ;COPY POINTER TO WINDOW BLOCK.1 ADD #W.BLGH,R3 ;POINT PAST END OF WINDOW BLOCKRB60$: MOV (SP)+,-(R3) ;COPY IMAGE OF WINDOW BLOCK INTO REAL BLOCK CMP R3,R4 ;DONE YET? BHI 60$ ;IF HI NOI; IF THIS IS A USER D OR SUPER LIB SYSTEM, THEN THERE IS A FLAG WORD ON$J; THE STACK. IF SUPER LIB SYSTEM ONLY, WE CAN DISCARD THIS WORD. IF USERJ; D, THEN THE HIGH BYTE OF THIS WORD MUST BE RE-WRITTEN TO H.DMAP IN THEI; TASK HEADER. IN ADDITION, USER D SYSTEMS HAVE AN OVERMAP DEFAULT FLAG,); WHICH MUST BE REMOVED FROM THE STACK.# .IF NDF U$$DASN .IF DF S$$LIB" TST (SP)+ ;CLEAN OFF FLAG WORD .ENDC ; DF S$$LIB .IFF ; NDF U$$DAS .IF DF X$$HDR, MOV $SAHPT,R0 ;GET ADDRESS OF TASK HEADER .IFFF, MOV $HEADR,R0 ;GET ADDRESS OF TASK HEADER .ENDC  ;  MOV (SP)+,H.SMAP(R0) ;UPDATE SUPER/USER D MASK IN HEADER    .ENDC ; DF U$$DAS2 MOV $TKTCB,R0 ;PICK UP CURRENT TASK TCB ADDRESS, MOV W.BPCB(R4),R1 ;PICK UP PCB OF MAPPING .IF DF M$$PRO: CALL $SETBP ;SET UP OTHER RUNNING MAPPED TASK (IF ANY) .ENDC: TSTB A.MPCT(R5) ;IS THIS FIRST MAP THROUGH ATTACHMENT ?( BNE 65$ ;IF NE NO, DON'T CALL $ACCRG1 MOV #$ACCRG,-(SP) ;FORCE RETURN THROUGH $ACCRGE:65$: INCB A.MPCT(R5) ;INCREMENT MAPPING THROUGH THIS ADB .IF DF X$$HDR&F$$MAP  ,! CALL $STFMC ;SETUP FAST MAP IF NECESSARY"# .ENDC ; DF X$$HDR&F$$MAPU$'% RETURN ;BACK TO CALLER (OR $ACCRG),7&70$: DRSTS D.RS84 ;INVALID OFFSET-LENGTH COMBINATION5'80$: DRSTS D.RS16 ;DESIRED ACCESS TO REGION DENIEDN<(90$: DRSTS D.RS6 ;REGION HAD LOAD FAILURE OR PARITY ERROR,)100$: DRSTS D.RS8 ;REGION IS NON RESIDENT* .PAGE+;+",; **-$DRUNM-UNMAP ADDRESS WINDOW-;RF.; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO UNMAP THE SPECIFIED ADDRESS /; WINDOW.D0;H1; DPB FORMAT:2; $3; WD. 00 -- DIC(123.),DPB SIZE(2.)04; WD. 01 -- ADDRESS OF WINDOW DEFINITION BLOCK5; 6; INPUTS: 7;G;8; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK..9; R3=ADDRESS OF THE WINDOW DEFINITION BLOCK.1:; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.E.;; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.<; 4=; INPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:!>; W.NID=ID OF WINDOW TO UNMAP.S?;S<@; OUTPUTS: (DIRECTIVE STATUS AND PS WORD RETURNED TO TASK)A; /B; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.I(C; DIRECTIVE STATUS OF +1 IS RETURNED.!D; C=1 IF DIRECTIVE IS REJECTED.=E; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THE SPECIFIEDK F; ADDRESS WINDOW NOT MAPPED.;G; DIRECTIVE STATUS OF 'D.RS87' IS RETURNED IF AN INVALID %H; ADDRESS WINDOW ID IS SPECIFIED.EI;E5J; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:O8K; W.NSTS=INDICATION OF ANY CHANGES IN MAPPING STATUS.7L; WS.UNM=1 IF THE WINDOW WAS SUCCESSFULLY UNMAPPED.)M;-N7O$DRUNM::CALL $SRWND ;SEARCH FOR AND VERIFY WINDOW IDC#P CALL $UNMAP ;UNMAP IF NECESSARY=(Q BCC 10$ ;IF CC WINDOW WAS NOT MAPPED?R BIS #WS.UNM,W.NSTS(R3) ;INDICATE ADDRESS WINDOW WAS UNMAPPED S RETURN ;E2T10$: DRSTS D.RS8 ;ADDRESS WINDOW WAS NOT MAPPEDUVWX;+Y; DRSRF HAS MOVED.Z;I'[; ITS FORWARDING ADDRESS IS DRSRF.MACN\;E<]; THIS IS DUE TO THE ADDITION OF A SEPARATE COMMON FOR THE^; PLAS DIRECTIVES._;U@`; YOU MAY BE WONDERING WHY DRRRF IS STILL HERE. ALL DIRECTIVESAa; WHICH USE A PLAS DEFINITION BLOCK WHICH IS RELOCATED BY DRDSPUAb; MUST BE IN THE SAME DIRECTIVE COMMON, SINCE THE RELOCATION OFSAc; THE RDB/WDB TRIGGERS MAPPING THE PLAS COMMON. DRSRF RELOCATESRCd; THE BLOCK ITSELF AND THEREFORE CAN'T BE INCLUDED IN THE COMMON.e;-f .PAGEg;+"h; **-$DRRRF-RECEIVE BY REFERENCEi;IFj; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DEQUEUE THE NEXT RECEIVE BYIk; REFERENCE PACKET IN THE RECEIVE QUEUE, OPTIONALLY EXITING IF THERE IS l; NOT ONE THERE.m;Sn; DPB FORMAT: o;D#p; WD. 00 -- DIC(81.),DPB SIZE(2.) 0q; WD. 01 -- ADDRESS OF WINDOW DEFINITI000dccccccON BLOCKr; s; INPUTS:Nt;;u; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.A.v; R3=ADDRESS OF THE WINDOW DEFINITION BLOCK.1w; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK..x; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.y;C4z; INPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE: {; W.NSTS=CONTROL INFORMATION.5|; WS.MAP=1 IF RECEIVED REFERENCE IS TO BE MAPPED.N7}; WS.RCX=1 IF TASK EXIT DESIRED IF NO PACKET FOUND.(C~; W.NSRB=OPTIONAL ADDRESS OF 10 WORD BUFFER FOR ADDITIONAL INFO.;7; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)D;H/; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.F(; DIRECTIVE STATUS OF +1 IS RETURNED.!; C=1 IF DIRECTIVE IS REJECTED.D3; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE 2; DIRECTIVE FAILS IN THE MAPPING STAGE BECAUSE0; THE SPECIFIED REGION HAS INCURRED A PARITY ; ERROR.;; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THERE IS NOA.; RECEIVE BY REFERENCE ENTRY IN THE QUEUE.<; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE ADDRESS(; CHECK OF THE RECEIVE BUFFER FAILS.; 5; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:C8; W.NRID=ASSIGNED REGION ID OF THE REFERENCED REGION.1; W.NOFF=OFFSET WORD SPECIFIED BY SENDER TASK.N1; W.NLEN=LENGTH WORD SPECIFIED BY SENDER TASK.A1; W.NSTS=STATUS WORD SPECIFIED BY SENDER TASK. ,; WS.RED=1 IF ATTACHED WITH READ ACCESS.-; WS.WRT=1 IF ATTACHED WITH WRITE ACCESS.E.; WS.EXT=1 IF ATTACHED WITH EXTEND ACCESS..; WS.DEL=1 IF ATTACHED WITH DELETE ACCESS.); WS.RRF=1 IF RECEIVE WAS SUCCESSFUL.L;-*$DRRRF::MOV KISAR6,-(SP) ;SAVE APR6 BIAS5 MOV R3,-(SP) ;SAVE WINDOW DEFINITION BLOCK POINTERE9 MOV T.RRFL(R5),R2 ;PICK UP FIRST RECEIVE BY REF PACKETA  BEQ 60$ ;IF EQ THERE IS NONE CLR -(SP) ;INIT EFN ADDRESST CLR -(SP) ;INIT EFN MASK6 TST (R2)+ ;POINT TO RECEIVER TCB ADDRESS IN PACKET$ MOV (R2)+,R0 ;PICK UP TCB ADDRESS! BEQ 20$ ;IF EQ NONE SPECIFIEDH8 DECB T.SRCT(R0) ;DECREMENT SENDER'S OUTSTANDING SREFS# MOV (R2),(SP) ;SET REAL EFN MASKV( MOV 2(R2),2(SP) ;SET REAL EFN ADDRESS%20$: MOV R0,-(SP) ;SAVE TCB ADDRESSR% CMP (R2)+,(R2)+ ;SKIP TO REGION IDO7 ADD #W.NRID,R3 ;POINT TO REGION ID WORD IN DEF BLOCKF# MOV (R2)+,(R3)+ ;STORE REGION ID  MOV (R2)+,(R3)+ ;STORE OFFSET  MOV (R2)+,(R3)+ ;STORE LENGTH  BIS (R2)+,(R3)+ ;STORE ACCESS= MOV (R3),R3 ;PICK UP VIRTUAL ADDR OF EXTENDED INFO BUFFER. BEQ 40$ ;IF EQ THERE ONE WAS NOT SPECIFIED+ MOV #10.*2,R1 ;SET SIZE TO ADDRESS CHECK MOV R2,-(SP) ;SAVE R2) CALL $ACHKP ;ADDRESS CHECK THE BUFFERA MOV (SP)+,R2 ;RESTORE R2S7 MOV -14(R2),(R3)+ ;STORE THE TASK NAME IN THE BUFFER MOV -12(R2),(R3)+ ;- MOV -16(R2),R0 ;PICK UP SENDER TCB ADDRESS(  BEQ 25$ ;IF EQ THERE IS NONE, MOV T.NAM+2(R0),-(R3) ;SET REAL TASK NAME MOV T.NAM(R0),-(R3) ;( CMP (R3)+,(R3)+ ;POINT PAST TASK NAME325$: MOV #8.,R0 ;SET LOOP COUNT FOR REST OF INFO /30$: MOV (R2)+,(R3)+ ;MOVE REST OF EXTRA INFO, DEC R0 ;DONE YET?  BGT 30$ ;IF GT NO 140$: MOV R5,R3 ;SAVE RECEIVER TASK TCB ADDRESSA1 MOV (SP)+,R5 ;RETRIEVE SENDER TASK TCB ADDRESS+) MOV (SP)+,R0 ;RETRIEVE EVENT FLAG MASKV1 MOV (SP)+,R1 ;RETRIEVE EVENT FLAG WORD ADDRESS ! BEQ 50$ ;IF EQ NO FLAG TO SETE3 CALL $SETMG ;SET EFN AND UNLOCK IF GROUP GLOBALA&50$: MOV R3,R5 ;RESTORE TCB ADDRESS5 MOV R5,R0 ;POINT TO RECEIVE BY REFERENCE LISTHEAD  ADD #T.RRFL,R0 ;F( CALL $QRMVF ;REMOVE PROCESSED PACKET% MOV R1,R0 ;COPY POINTER TO PACKET" CALL $DEPKT ;DEALLOCATE PACKET2 MOV (SP)+,R3 ;RESTORE WINDOW DEFINITION POINTER- MOV (SP)+,KISAR6 ;RESTORE KERNAL APR6 BIAS(C BIS #WS.RRF,W.NSTS(R3) ;INDICATE SUCCESSFUL RECEIVE BY REFERENCEL. BIT #WS.MAP,W.NSTS(R3) ;WINDOW MAP DESIRED? BEQ 80$ ;IF EQ NOS CALLR $DRMAP ;MAP WINDOW@60$: CMPB #213.,$DICSV ;IS THIS RECEIVE BY REFERENCE OR STOP? BNE 61$ ;IF NE NOE CMP (SP)+,(SP)+ ;CLEAN STACK JMP $STPCT ;GO STOP TASK661$: BIT #WS.RCX,W.NSTS(008dcb`TADATADATADATADATADATAR3) ;DOES TASK WISH TO EXIT? BEQ 70$ ;IF EQ NO  CMP (SP)+,(SP)+ ;CLEAN STACKW! JMP $DREXT ;PERFORM TASK EXITP+70$: DRSTS D.RS8 ;NO REFERENCES IN QUEUE#80$: RETURN ;I .PAGE;+/; **-$DRFMP-FAST REMAP OF TASK ADDRESS WINDOW3;N?; THIS DIRECTIVE IS INVOKED TO PERFORM A FAST REMAP OF A TASKI?; ADDRESS WINDOW. THIS IS NOT A DIRECTIVE PER SE (REQUIRES NOS@; DPB), BUT IS INVOKED BY LOADING USER REGISTERS AND EXECUTING; AN IOT INSTRUCTION.K;1<; TASKS BUILT TO MAKE USE OF THE FAST MAP FACILITY HAVE AN>; ADDITIONAL DATA AREA APPENDED TO THEIR HEADERS. THE FORMAT0; OF THIS BLOCK IS DOCUMENTED IN $STFMP BELOW.;I ; INPUTS:0;T; R0 = FAST MAP ID; R1 = NEW MAP OFFSETM; ; OUTPUTS:;3; R0 = COMPLETION STATUS; +1 = SUCCESSF; IE.ALG = INVALID OFFSET;I ; NOTES:; 6; R0 -> R3 ARE DESTROYED DURING FAST MAP PROCESSING.; =; FAST MAP TAKES PLACE AT PR7, KERNEL MODE, STACK DEPTH +1.;G; FAST MAP WITH WINDOW LENGTH CHANGE TAKES PLACE AT PR0, KERNEL MODE,N@; STACK DEPTH 0 (LOOKS LIKE INTERRUPT STATE FOR A PR0 DEVICE).;SK; ALTHOUGH SUPERVISOR MODE WINDOWS CAN'T YET BE FAST MAPPED, THE COMMENTSG; IN THIS MODULE INCLUDE INFORMATION RELATIVE TO THAT IMPLEMENTATION.T;H; BLKMUL IS SET TO 2 IF SYSTEM HAS BOTH USER D AND SUPER MODE SUPPORT,F; 1 OTHERWISE. THIS IS BECAUSE THE OFFSET INTO JUMP TABLE FIELD MUST/; BE BIGGER THAN 255. IF THE SYSTEM HAS BOTH.T;- .IF DF X$$HDR&F$$MAPD .IF DF U$$DAS&S$$LIBA  BLKMUL = 1N  BLKDIV = 2T   .IFF ; DF U$$DAS & S$$LIB   BLKMUL = 2  BLKDIV = 1H .ENDC ; DF U$$DAS & S$$LIBB;+$$DRFMP::NOP ;;;* * * DEBUG * * *4 MOV $SAHDB,KISAR6 ;;;MAP CURRENT USER TASK HEADER4 BIC #77607,R0 ;;;VALIDATE USER'S FAST MAP POINTER$ ;;;(FORCE POINTER TO BE VALID). ;;;(ALSO, TEST HIGH BIT TO SEE IF WINDOW$ ;;;LENGTH CHANGE WAS DESIRED.)* BMI 20$ ;;;IF MI LENGTH CHANGE DESIRED1 ADD $FMAPP,R0 ;;;GET POINTER TO FAST MAP AREAU' CMP R1,(R0)+ ;;;PAST MAXIMUM OFFSET?A BHIS 10$ ;;;IF HI YES (  MOV (R0)+,R2 ;;;GET ADDRESS OF W.BOFF7! MOV R1,(R2) ;;;STORE NEW OFFSET FIELD (LESS P.HDLN)G"1# ADD @(R0)+,R1 ;;;ADD IN P.REL OF PCB TO OFFSETE$7% MOVB (R0)+,R3 ;;;GET P.HDLN VALUE AND EXPAND TO WORD1& ADD R3,R1 ;;;FORM REAL ADDRESS OF MAPPED AREA 0' ADD R3,(R2)+ ;;;ADJUST OFFSET IN WINDOW BLOCK(#) MOVB (R2)+,R2 ;;;GET APR ADDRESSL7* ADD #UISAR0-UISDR0,R2 ;;;POINT TO PAR INSTEAD OF PAR +(, MOVB (R0),R0 ;;;GET JUMP TABLE VALUE-. .IF DF U$$DAS & S$$LIB;/"0 ASL R0 ;;;SHIFT INDEX TO WORDS12 .ENDC ; DF U$$DAS & S$$LIB;3*4 MOV #200,R3 ;;;SET OFFSET BETWEEN PARS)5 CALL FMPW1(R0) ;;;AND DISPATCH INTO ITE6#7 MOV #1,R0 ;;;SET SUCCESS STATUSL8 RTT ;;;AND RETURN9':10$: MOV #D.RS8,R0 ;;;INDICATE IE.ITSA; RTT ;;;RETURN TO USER TASKF<!=; ERROR EXITS FOR LENGTH CHANGE,>'?11$: MOV #D.RS8,R0 ;;;INDICATE IE.ITS,%@ JMP $INTX1 ;;;RETURN TO USER TASKA(B12$: MOV #D.RS84,R0 ;;;INDICATE IE.ALG%C JMP $INTX1 ;;;RETURN TO USER TASKRDE .PAGEF;+"G; FAST MAP WITH CHANGE IN LENGTHH;-IJ20$: ;;;REFERENCE LABELK3L; SAVE SOME REGISTERS AND DROP PROCESSOR PRIORITYEMN MOV R5,-(SP) ;;;SAVE R5O MOV R4,-(SP) ;;;AND R4 &P DEC $STKDP ;;;SHOW ENTRY TO SYSTEMQ MTPS #0 ;;;ALLOW INTERRUPTST&R NOP ;;; * * * D E B U G * * *S9T; CALCULATE ADDRESS OF FAST MAP HEADER BLOCK AND SET UPJU; REGISTERS.V1W ADD #100002,R0 ;REMOVE LENGTH CHANGE INDICATORT X ;AND SKIP MAX OFFSET FIELD2Y ADD $FMAPP,R0 ;SET UP POINTER TO FAST MAP BLOCK-Z MOV (R0)+,R4 ;R4 -> W.BOFF IN WINDOW BLOCKR/Z BEQ 11$ ;IF EQ, WINDOW NOT MAPPED ;JRK329P#[ MOV (R0)+,R5 ;R5 -> P.REL IN PCBP.\ MOVB (R0)+,R3 ;GET P.HDLN FOR PARTITION AND] ;SIGN EXTEND,^ ADD R3,R1 ;ADJUST OFFSET FIELD BY P.HDLN_D`; CALCULATE LENGTH TO MAP AND TEST IF LEGAL. IF NOT, RETURN IE.ITSa!b TST R2 ;L00@dccccccENGTH SPECIFIEDI,c BEQ 30$ ;IF EQ NO, CALCULATE LENGTHd MOV R2,R3 ;COPY LENGTH !e ADD R1,R3 ;ADD IN OFFSET;*f BCS 11$ ;IF CS ADD WRAPPED AROUND*g CMP R3,P.SIZE-P.REL(R5) ;LENGTH LEGAL?h BLOS 40$ ;IF LOS YES i BR 11$ ;IF HI NO j3k30$: MOV P.SIZE-P.REL(R5),R2 ;GET PARTITION SIZER3l SUB R1,R2 ;SUBTRACT OFFSET TO CALC. LENGTH /m BCS 11$ ;IF CS SUBTRACT WRAPPED AROUNDT*n CMP R2,W.BSIZ-W.BOFF(R4) ;LENGTH LEGAL?o BLOS 40$ ;IF LOS YES 3p MOV W.BSIZ-W.BOFF(R4),R2 ;SUBSTITUTE WINDOW SIZEGq%r; CALCULATE NEW END VIRTUAL ADDRESSDs4t40$: MOV R1,(R4) ;SET NEW W.BOFF FIELD VALUE8u ADD (R5),R1 ;CONVERT OFFSET TO PHYSICAL ADDRESS0v MOV R0,R5 ;SAVE POINTER TO OFFSET VALUE/w MOV R2,R3 ;COPY LENGTH IN 32 WD BLOCKSG$x ASH #6,R3 ;CONVERT TO BYTES.y DEC R3 ;BACK OFF TO LAST BYTE ADDRESS7z ADD W.BLVR-W.BOFF(R4),R3 ;ADD IN LOW VIRTUAL ADDRESSB{=|; SAVE VALUES NEEDED IN PAR UPDATE CODE OR RETURNED TO USERI}/~ MOV R2,-(SP) ;SAVE NEW LENGTH OF WINDOWC/ MOV R1,-(SP) ;SAVE PHYSICAL MAP ADDRESS,: CMP R3,W.BHVR-W.BOFF(R4) ;SIZE OF WINDOW CHANGE AT ALL? BEQ 100$ ;IF EQ NOA9 MOV R3,W.BHVR-W.BOFF(R4) ;TO FORM HIGH VIRTUAL ADDRESS ; CALCULATE NEW NUMBER OF PDRS' MOV R2,R3 ;COPY SIZE OF WINDOWS$ ADD #177,R3 ;ROUND UP BY 4K. ASH #-7,R3 ;CONVERT TO NUMBER OF PDRS/ MOV R3,-(SP) ;SAVE FOR LAST PDR ADDRESSI ;CALCULATION LATERO5 CMPB R3,W.BNPD-W.BOFF(R4) ;NUMBER OF PDRS CHANGE ?N- BEQ 80$ ;IF EQ NO, NO NEED TO UPDATED& ;OFFSET OR CLEAR/RESET PDRS4 MOVB W.BNPD-W.BOFF(R4),R2 ;GET OLD NUMBER OF PDRS5 MOVB R3,W.BNPD-W.BOFF(R4) ;SET NEW NUMBER OFR PDRSD8; CALCULATE NEW OFFSET FIELD FOR FAST MAP WINDOW BLOCK5 SUB R2,R3 ;FORM DIFFERENCE IN NUMBER OF PDRSP#; HANDLE SIMPLEST CASES (1,3,4,7)U .IF DF U$$DAS!S$$LIB 6 CMPB #</BLKDIV>,(R0) ;IS THIS A CASE 1 BHI 50$ ;IF HI YESF .IFTF ; DF U$$DAS ! S$$LIBB) ASL R3 ;MULTIPLY DIFFERENCE BY 2  .IF EQ BLKMUL-2 ASL R3 ;BY 4W .ENDC ; EQ BLKMUL-2 .IFT ; DF U$$DAS ! S$$LIB BR 70$ ;AND UPDATE50$:>; HANDLE CASE 2 (ALSO HANDLES CASE 6) IN I/D & SUPER SYSTEMS .IF DF U$$DAS&S$$LIBM6 CMPB #</BLKDIV>,(R0) ;IS THIS A CASE 2 BHI 60$ ;IF HI NO1 MUL #,R3 ;CALCULATE DIFFERENCEA BR 70$ ;AND UPDATE  .ENDC ; DF U$$DAS&S$$LIBS60$:<; HANDLE CASE 5 (ALSO CASE 2 IN SUPER, NO D-SPACE SYSTEMS)1 MUL #,R3 ;CALCULATE DIFFERENCE2 .ENDC ; DF U$$DAS ! S$$LIB70$:% MOV R3,-(SP) ;SAVE FOR UPDATEE!; CLEAR ALL PDRS FOR OLD WINDOWS' CLR R3 ;NO OFFSET BETWEEN PDRS* MOVB W.BFPD-W.BOFF(R4),R2 ;POINT TO PDR3 MOV (R2),-(SP) ;SAVE A PDR FOR ACCESS VALUEK' CLR R1 ;VALUE TO STORE IS ZERO' MOVB (R0),R0 ;GET OFFSET VALUE; .IF DF U$$DAS&S$$LIB:& ASL R0 ;CONVERT TO BYTE INDEX .ENDC ; DF U$$DAS&S$$LIBL" CALL FMPW1(R0) ;CLEAR PDRS; SET ALL PDRS FOR NEW WINDOWI .IF DF U$$DAS&S$$LIB,2 MOVB (R5),R0 ;RETRIEVE OFFSET FIELD AGAIN .IFTF ; DF U$$DAS & S$$LIBN# MOV (SP)+,R1 ;GET PDR VALUEB) SUB (SP)+,R0 ;ADJUST OFFSET FIELD & BIS #77400,R1 ;FORCE 4K ACCESS1 MOVB R0,(R5) ;STORE UPDATED OFFSET VALUER5 MOVB W.BFPD-W.BOFF(R4),R2 ;GET PDR ADDRESS (AGAIN): .IFT ; DF U$$DAS & S$$LIBY% ASL R0 ;ADJUST TO WORD VALUE .ENDC ; DF U$$DAS & S$$LIBD- CALL FMPW1(R0) ;SET PDRS TO NEW VALUEF#; SETUP LAST PDR TO CORRECT VALUE .80$: MOV 4(SP),R2 ;RETRIEVE WINDOW SIZE' DEC R2 ;BACK OFF TO LAST BLOCK ( BIC #177600,R2 ;ISOLATE PLF BITS* BNE 85$ ;IF NE NOT MULTIPLE OF 4K) TST (SP)+ ;REMOVE NUMBER OF P00Hdcb`TADATADATADATADATADATADRSE BR 95$ ;AND CONTINUE 485$: SWAB R2 ;PUT IN RIGHT PLACE IN REGISTER3 MOVB W.BFPD-W.BOFF(R4),R3 ;GET FIRST PDR ADDRESSJ* MOV (R3),R1 ;FETCH VALUE OF A PDR/ BIC #77400,R1 ;CLEAR PLF FROM SAVED PDRT% BIS R2,R1 ;AND MERGE NEW PLF & DEC (SP) ;BACK OFF BY ONE PDR/ ASL (SP) ;MULTIPLY NUMBER OF PDRS BY 2 + ADD (SP)+,R3 ;FORM LAST PDR ADDRESSS .IF DF S$$LIB!U$$DAS 6 CMPB #</BLKDIV>,(R5) ;IS THIS A CASE 1 BLOS 90$ ;IF HI YES'; UPDATE LAST PDR FOR A CASE 2 WINDOWR .IF DF U$$DAS6 CMPB #</BLKDIV>,(R0) ;IS THIS A CASE 2 BHI 84$ ;IF LO NO3 MOV R1,UDSAR0-UINAR0(R3) ;;;FILL IN LAST PDR (D)E BR 90$ ;AND CONTINUE %; UPDATE LAST PDR FOR CASE 6 WINDOW  84$:6  CMPB #</BLKDIV>,(R0) ;IS THIS A CASE 6  BLOS 86$ ;IF HI NO 3  MOV R1,SDSAR0-UDSAR0(R3) ;;;FILL IN LAST PDR (D)<  BR 100$ ;AND UPDATE86$: .ENDC ; DF U$$DAS%; UPDATE LAST PDR FOR CASE 5 WINDOW 9 MOV R1,SDSAR0-UINAR0(R3) ;;;FILL IN LAST PDR (SUPER D)P .IF DF U$$DAS8 MOV R1,UDSAR0-UINAR0(R3) ;;;FILL IN LAST PDR (USER D) .ENDC ; DF U$$DAS .ENDC ; DF U$$DAS ! S$$LIBU*90$: MOV R1,(R3) ;FILL IN LAST PDRG95$: MOV R1,W.BLPD-W.BOFF(R4) ;SAVE VALUE OF LAST PDR IN WINDOW BLOCKO' ; DISPATCH TO REGULAR PAR UPDATE CODER!8"100$: MOV #200,R3 ;SET OFFSET BETWEEN PARS TO 4K:# MOVB W.BFPD-W.BOFF(R4),R2 ;GET FIRST PDR ADDRESS AGAIN.8$ ADD #UINAR0-UINDR0,R2 ;POINT TO PAR INSTEAD OF PDR;% MOV (SP)+,R1 ;GET BACK VALUE OF START (THIS RIGHT?)0-& MOVB (R5),R0 ;GET OFFSET VALUE AGAIN'( .IF DF U$$DAS&S$$LIBN)%* ASL R0 ;ADJUST TO BYTE INDEX,+, .ENDC ; DF U$$DAS & S$$LIB:-&. CALL FMPW1(R0) ;GO ADJUST PARS2/ MOV (SP)+,R2 ;SET LENGTH TO RETURN TO USER)0 MOV #1,R0 ;SET IS.SUC FOR RETURN &1 JMP $INTX1 ;GO RETURN TO USER23 .ENDC ; DF X$$HDR & F$$MAP 4 .PAGE56;+57; **-$STFMP-SETUP FAST MAP BLOCK FOR ADDRESS WINDOWRE8; **-$STFMC-SETUP FAST MAP BLOCK FOR ADDRESS WINDOW (CONDITIONALLY) 9;RC:; THESE ROUTINES SETS OR RE-SETS THE FAST MAP BLOCK IN THE HEADERB;; EXTENSION CORRESPONDING TO A WINDOW IN THE NORMAL HEADER AREA.<;B=; $STFMC IS CALLED FROM DRMAP TO EXAMINE WHETHER OR NOT A WINDOWF>; REQUIRES FAST MAP UPDATE AND TO RE-FILL THE POINTERS IF NECESSARY.?;P @; INPUTS: A;E*B; R4=ADDRESS OF WINDOW TO BE FAST MAPPEDC; D; OUTPUTS:E;F; R2,R3 ARE MODIFIED ($STFMC)K!G; R0,R2,R3 ARE MODIFIE ($STFMP)-H; BI; THE FORMAT OF A FAST MAP HEADER EXTENSION BLOCK IS AS FOLLOWS:J;N5K; +-----------------------------------------------+%L; | MAXIMUM 32WD BLOCK OFFSET | 0N5M; +-----------------------------------------------+O,N; | POINTER TO W.BOFF IN WINDOW BLOCK | 25O; +-----------------------------------------------+I#P; | POINTER TO P.REL IN PCB | 4E5Q; +-----------------------+-----------------------+ :R; 7 | DISPATCH OFFSET INTO | COPY OF P.HDLN FOR | 60S; | FMPW1 UPDATE VECTOR | TARGET PARTITION |5T; +-----------------------------------------------+U;-VW .IF DF X$$HDR&F$$MAP-X Y .ENABL LSBZ2[$STFMC::TST $FMAPP ;TASK HAVE FAST MAP ENABLED? \ BEQ 10$ ;IF EQ NO, NO UPDATE-] TSTB W.BFPD(R4) ;IS IT A USER MODE WINDOW?| ^ BPL 10$ ;IF PL NO, NO UPDATE _ MOV R0,-(SP) ;SAVE A REGISTER/` MOVB W.BFPD(R4),R0 ;GET ADDRESS OF FIRST PDR- a ASL R0 ;CONVERT TO QUAD WORDb ASL R0 ;INDEXT+c BIC #177607,R0 ;GET RID OF ALL BUT INDEX .d ADD $FMAPP,R0 ;GET ADDRESS OF FAST MAP AREA+e CALL 20$ ;GO ADJUST FAST MAP PARAMETERS-$f5$: MOV (SP)+,R0 ;RESTORE REGISTER g10$: RETURNNhi$STFMP:: ;j(k; CALCULATE ADDRESS OF FAST MAP WINDOWl/m MOVB W.BFPD(R4),R0 ;GET ADDRESS OF FIRST PDR; n ASL R0 ;CONVERT TO QUAD WORDo ASL R0 ;INDEX +p BIC #177607,R0 ;GET RID OF ALL BUT INDEXM.q ADD $FMAPP,R0 ;GET ADDRESS OF FAST MAP AREA00Pdccccccr(s; CALCULATE MAXIMUM OFFSET INTO REGIONt7u ASSUME W.BPCB,0 ;W.BPCB MUST BE FIRST WORD OF WINDOWM$v20$: MOV (R4),R2 ;GET PCB ADDRESS.w MOV P.SIZE(R2),(R0) ;SAVE SIZE OF PARTITION6x SUB W.BSIZ(R4),(R0) ;MAX OFFSET IS LESS WINDOW SIZE4y MOVB P.HDLN(R2),R3 ;CONVERT HEADER LENGTH TO WORD3z SUB R3,(R0) ;MAX OFFSET IS ALSO WITHOUT HDR LENS3{ INC (R0)+ ;THE MAX OFF FIELD IS KEPT +1 SO THAT;)| ;A VAL. OF ZERO CAN MEAN "UNMAPPED"U},~; SET UP POINTER TO W.BOFF IN WINDOW BLOCK' MOV R4,(R0) ;INIT POINTER TO W.BOFF 8 ADD #W.BOFF,(R0)+ ;AND POINT TO CORRECT WORD IN BLOCK"; SET UP POINTER TO P.REL IN PCB. MOV R2,(R0) ;SET ADDRESS OF PCB INTO BLOCK' ADD #P.REL,(R0)+ ;AND POINT TO P.RELI(; COPY PARTITIONS EXTERNAL HEADER SIZE; MOVB P.HDLN(R2),(R0)+ ;SET SIZE OF PARTITION'S EXT. HDR.I .PAGE;+/; NOW CALCULATE OFFSET INTO APR UPDATE TABLE.A+; THERE ARE SEVEN CASES TO BE CONSIDERED.U;-; SUPER MODE MAPPED SUPER MODE NOT MAPPED;M<; I-SPACE WINDOW (1) UPDATE I ONLY (4) UPDATE SUPER I ONLY; (WITH OVERLAPPING ; D-SPACE WINDOW(S))P;R:; I-SPACE WINDOW (2) UPDATE I+D (5) UPDATE I,D, SUPER D; (NO OVERLAP);,:; D-SPACE WINDOW (3) UPDATE D-ONLY (6) UPDATE D, SUPER D;E-; SUPER I WINDOW N/A (7) SUPER I ONLYO;T;; SYSTEMS WITH USER I/D AND NO SUPERVISOR MODE HAVE CASESI; (1), (2), AND (3) ONLY.H;R?; SYSTEMS WITH NO USER I/D BUT SUPER MODE HAVE CASE (1) AND AU; SUBSET OF CASE 5.;-6; IN MULTI-CASE SYSTEMS, ASSUME IT'S THE SIMPLE CASE .IF DF U$$DAS!S$$LIBD1 CLR -(SP) ;ASSUME NO EXTRA OFFSET INTO VECTOR 1 MOV #BLK1SZ*BLKMUL,-(SP) ;ASSUME CASE 1 LENGTH, .ENDC ; DF U$$DAS!S$$LIB-'; CHECK FOR SUPERVISOR I-SPACE WINDOW  .IF DF S$$LIB2; TSTB W.BFPD(R4) ;IS IT A SUPER I-SPACE WINDOW?; BEQ 50$ ;IF EQ YES .ENDC ; DF S$$LIB!; CHECK FOR USER D-SPACE WINDOWB .IF DF U$$DAS3 BITB #20,W.BFPD(R4) ;IS IT A USER D-SPACE WINDOWL BEQ 30$ ;IF EQ NO =; IF USER D-SPACE WINDOW, CHECK FOR SUPERVISOR MODE WINDOWS) .IF DF S$$LIB, TSTB $SUPFL ;ANY SUPERVISOR MODE WINDOWS BEQ 50$ ;IF EQ NO? MOV #</BLKDIV>,2(SP) ;SET PARAMETERS FOR CASE 6E! MOV #BLK6SZ*BLKMUL,(SP) ; .ENDC ; DF S$$LIB BR 50$ ;TO COMMON CODE .ENDC ; DF U$$DAS7; CHECK USER I WINDOW FOR OVERLAPPING D-SPACE WINDOWS 30$: ;S .IF DF U$$DAS& MOVB W.BFPD(R4),R3 ;GET PDR ADDRESS( SUB #UINAR0,R3 ;ADJUST TO OFFSET ZERO! ASR R3 ;CONVERT TO BYTE INDEXI) MOVB W.BNPD(R4),R2 ;GET NUMBER OF PDRSS( ADD R3,R2 ;FORM ENDING PDR NUMBER +10 MOVB $BCMSK-1(R2),R2 ;GET MASK UP TO LAST APR1 BICB $BCMSK-1(R3),R2 ;GET MASK UP TO FIRST APRK! MOV $SAHPT,R3 ;POINT TO HEADER # BITB R2,H.DMAP(R3) ;ANY OVERLAP?E% BNE 50$ ;IF NE YES, UPDATE I ONLYC .ENDC ; DF U$$DAS*; USER I-SPACE WITH NO OVERLAP D WINDOWS .IF DF S$$LIB$ TSTB $SUPFL ;SUPER MODE WINDOWS? BEQ 40$ ;IF EQ NOO? MOV #</BLKDIV>,2(SP) ;SET PARAMETERS FOR CASE 5R! MOV #BLK5SZ*BLKMUL,(SP) ;2 BR 50$ ;TO COMMON CODE .ENDC ; DF S$$LIB40$: ;JRK324 .IF DF U$$DAS ;**-1SG MOV #</BLKDIV>,2(SP) ;SET PARAMETERS FOR CASE 6 ;JRK324 + MOV #BLK2SZ*BLKMUL,(SP) ; ;**-1E .ENDC ; DF U$$DAS/50$: MOVB W.BNPD(R4),R3 ;FETCH NUMBER OF PDRSO .IF DF U$$DAS!S$$LIB( MUL (SP)+,R3 ;CONVERT TO N WORD INDEX- ADD (SP)+,R3 ;ADD IN ANY ADDITIONAL OFFSETI .IFF ; DF U$$DAS!S$$LIB" ASL R3 ;CONVERT TO WORD INDEX& ASL R3 ;CONVERT TO TWO WORD INDEX .ENDC ; DF U$$DAS!S$$LIBJ NEG R3 ;MAKE IT NEGATIVE  MOVB R3,(R0)+ ;SET JUMP INDEX RETURN ;DONEA  .DSABL LSB  .ENDC ; DF X$$HDR&F$$MAPS  .PAGE  ;+E ; FAST MAP APR UPDATE TABLES. THERE ARE FOUR SETS OF UPDATE CODE TOP ; COVER THE SEVEN CASES.00Xd^db`TADATADATADATADATADATA;- .IF DF F$$MAP&X$$HDRT;+H; CASE 5 - UPDATE SUPER AND USER DATA SPACE AND PAR POINTED TO BY FAST:; MAP WINDOW BLOCK (THIS WILL ALWAYS BE USER I-SPACE);- .IF DF S$$LIB  .REPT 76 MOV R1,SDSAR0-UINAR0(R2) ;;;FILL IN SUPER D PAR/PDR .IF DF U$$DAS5 MOV R1,UDSAR0-UINAR0(R2) ;;;FILL IN USER D PAR/PDRN ! .ENDC ; DF U$$DAS".# MOV R1,(R2)+ ;;;FILL IN USER I PAR/PDR($ ADD R3,R1 ;;;AND ADVANCE BY 4KW%& .ENDR'( .IF DF U$$DAS) * BLK5SZ = 6X+, .IFF ; DF U$$DASE- . BLK5SZ = 4N/0 .ENDC ; DF U$$DAS1 2 $$$ = .3 . = . + < BLK5SZ * 2 > *4FMPW5: ;;;POINT TO END OF BLOCKS 5 . = $$$6;7 MOV R1,SDSAR0-UINAR0(R2) ;;;FILL IN LAST SUPER D PAR/PDRN89 .IF DF U$$DAS::; MOV R1,UDSAR0-UINAR0(R2) ;;;FILL IN LAST USER D PAR/PDR<= .ENDC ; DF U$$DAS>3? MOV R1,(R2) ;;;FILL IN LAST USER I PAR/PDRP @ RETURN ;;;AND GO BACKAB .ENDC ; DF S$$LIBCDE;+JF; CASE 6 - UPDATE SUPER DATA SPACE AND PAR POINTED TO BY FAST MAP WINDOW/G; BLOCK (THIS WILL ALWAYS BE USER D-SPACE)=H;-IJ .IF DF U$$DAS&S$$LIB K L .REPT 7M6N MOV R1,SDSAR0-UDSAR0(R2) ;;;FILL IN SUPER D PAR/PDR.O MOV R1,(R2)+ ;;;FILL IN USER D PAR/PDR(P ADD R3,R1 ;;;AND ADVANCE BY 4KWQR .ENDRS T BLK6SZ = 4U V $$$ = .W . = . + < BLK6SZ * 2 > *XFMPW6: ;;;POINT TO END OF BLOCKS Y . = $$$Z;[ MOV R1,SDSAR0-UDSAR0(R2) ;;;FILL IN LAST SUPER D PAR/PDRU3\ MOV R1,(R2) ;;;FILL IN LAST USER U PAR/PDR ] RETURN ;;;AND GO BACKL^_ .ENDC ; DF U$$DAS & S$$LIB`a;+Ib; CASE 2 - UPDATE USER DATA SPACE AND PAR POINTED TO BY FAST MAP WINDOWP/c; BLOCK (THIS WILL ALWAYS BE USER I SPACE)Rd;-ef .IF DF U$$DASg h .REPT 7i5j MOV R1,UDSAR0-UINAR0(R2) ;;;FILL IN USER D PAR/PDR.k MOV R1,(R2)+ ;;;FILL IN USER I PAR/PDR(l ADD R3,R1 ;;;AND ADVANCE BY 4KWmn .ENDRo p BLK2SZ = 4 q r $$$ = .s . = . + < BLK2SZ * 2 > *tFMPW2: ;;;POINT TO END OF BLOCKS u . = $$$v:w MOV R1,UDSAR0-UINAR0(R2) ;;;FILL IN LAST USER D PAR/PDR3x MOV R1,(R2) ;;;FILL IN LAST USER I PAR/PDR y RETURN ;;;AND GO BACKz{ .IFF ; DF U$$DASS|2}FMPW2: ;;;MAKE SURE THIS LABEL IS ALWAYS(~ ;;;DEFINED SO THAT THE OFFSET1 ;;;ADJUST CODE CAN COMPARE AGAINST IT.I .ENDC ; DF U$$DAS;+;; CASES 1, 3, 4, AND 7. UPDATE JUST THE APR POINTED TO BY=; THE FAST MAP WINDOW.;-  .REPT 7' MOV R1,(R2)+ ;;;FILL IN PAR/PDR( ADD R3,R1 ;;;AND ADVANCE BY 4KW .ENDR  BLK1SZ = 2   $$$ = . . = . + < BLK1SZ * 2 >R*FMPW1: ;;;POINT TO END OF BLOCKS  . = $$$, MOV R1,(R2) ;;;FILL IN LAST PAR/PDR  RETURN ;;;AND GO BACK .ENDC ; DF F$$MAP & X$$HDR  .ENDC .ENDNDC ; DF U$$DAS;+;; CASES 1, 3, 4, AND 7. UPDATE JUST THE APR POINTED TO B .TITLE SYSCMS .IDENT /16.06/);O7; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION ; ALL RIGHTS RESERVED.;A>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;  ; D. N. CUTLER 11-AUG-73 ;E- ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:; ;N; P. J. BEZEREDI; J. R. KAUFFMAN; J. M. LAWLER; T. LEKAS ; T. M. MARTIN;C; MODIFIED BY:;R"; J. R. KAUFFMAN 3-SEP-86 16.01; 5; JRK332 - ADD SUPPORT FOR DATA CACHE WRITE DEFERS7;I; K. L. NOEL 17-NOV-86 16.02 ;I"; KLN011 -- ADD SUPPORT FOR CPR;S; B. S. MCCARTHY 16.03D; 2; BM387 -- ADD $WCFLG FOR COMPLETING WINDOW I/O; COUNT SUPPORT;#; L. B. MCCULLEY 29-DEC-86 16.04 ;I&; LBM050 -- MAKE $SWR UNCONDITIONAL;; K. L. NOEL 10-APR-87 16.05M;7; KLN041 -- ADD FAKE WINDOW BLOCK FOR REMOTE DEVICES;O#; B. S. MCCARTHY 12-JUN-87 16.06 ;-.00`dcccccc; BM399 -- ADDITION OF SET /VTLOGON COMMAND;C;I;F; SYSTEM COMMON DATA AREA-;6; MACRO LIBRARY CALLS1;A .MCALL HDRDF$,HWDDF$,TCBDF$1 .MCALL EPKDF$ ;ERRLOG PACKET/MASK DEFINITIONSF' HDRDF$ ;DEFINE TASK HEADER OFFSETSP& HWDDF$ ;DEFINE HARDWARE REGISTERS. TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS& EPKDF$ ;DEFINE FEATURE MASK FLAGS .IF DF A$$CNT .MCALL ACNDF$1 ACNDF$ ;DEFINE OFFSETS FOR ACCOUNTING BLOCKS- .ENDC;9 ; MAKE CLOCK PARAMETERS GLOBAL;"S$$RTZ==H$$RTZ ;LINE FREQUENCY'S$$IEN==K$$IEN ;ENABLE BITS PATTERNA1S$$LDC==K$$LDC ;LOAD VALUE FOR COUNT REGISTERD/S$$TPS==K$$TPS ;TICKS PER SECOND ON P CLOCK ;A; LOCAL SYMBOL DEFINITIONS;F; FUNCTION MASK LITERALT; DFMASK= FE.EXV!FE.DRV!FE.CAL!FE.EXP!FE.FDT ;INITIALIZE FEATURE MASKFMASK= FMASK!FE.DYM$ .IF DF M$$EXT&M$$MGEN4FMASK= FMASK!FE.EXT ;INCLUDE EXTENDED MEMORY MASK .ENDC .IF DF M$$MUP:FMASK= FMASK!FE.MUP ;INCLUDE MULTI-USER PROTECTION MASK .ENDC .IF DF P$$LAS$FMASK= FMASK!FE.PLA ;PLAS SUPPORT .ENDC .IF DF Q$$OPT0FMASK= FMASK!FE.PKT ;QIO PACKET PREALLOCATION .ENDC .IF DF P$$OFF8FMASK= FMASK!FE.OFF ;PARENT OFFSPRING TASKING SUPPORT .ENDC2F2MASK=0 ;INITIALIZE SECOND MASK WORD CONTENTS .IF DF K$$DAS2F2MASK=F2MASK!F2.DAS ;KERNEL DATA SPACE SUPPORT  .ENDC    .IF DF S$$LIB 8F2MASK=F2MASK!F2.LIB ;SUPERVISOR MODE LIBRARY SUPPORT .ENDC .IF DF M$$PRO.F2MASK=F2MASK!F2.MP ;MULTIPROCESSOR SUPPORT .ENDC .IF DF E$$VNT5F2MASK=F2MASK!F2.EVT ;EVENT TRACE FACILITY SUPPORTF .ENDC ! .IF DF A$$CNT"/#F2MASK=F2MASK!F2.ACN ;CPU ACCOUNTING SUPPORTK$% .ENDC&'( .IF DF S$$HDW)1*F2MASK=F2MASK!F2.SDW ;SHADOW RECORDING SUPPORTS+, .ENDC-./ .IF DF P$$OOL0/1F2MASK=F2MASK!F2.POL ;SECONDARY POOL SUPPORTL23 .ENDC456 .IF DF D$$PAR7>8F2MASK=F2MASK!F2.DPR ;SYSTEM SUPPORTS A DIRECTIVE PARTITION9: .ENDC;<= .IF DF P$$WND>??F2MASK=F2MASK!F2.WND ;SYSTEM SUPPORTS SECONDARY POOL WINDOWST@A .ENDCB'C; DEFINE CONSTANT FEATURE MASK 2 BITS2D:E F2MASK=F2MASK!F2.IRR!F2.GGF!F2.RAS!F2.RBN!F2.SWP!F2.STPFG; FEATURE MASK 3 BITS2H'I; DEFINE CONSTANT FEATURE MASK 3 BITSSJKL F3MASK=F3.AST!F3.EIS!F3.RLKMNOP F3MASK=F3MASK!F3.SHFAQRST .IF DF A$$CLIUV F3MASK=F3MASK!F3.CLIWX .ENDCYZ[ .IF DF X$$HDR\0] F3MASK=F3MASK!F3.XHR ;EXTERNAL HEADER SUPPORT^_ .ENDC`ab .IF DF U$$DASc0d F3MASK=F3MASK!F3.UDS ;USER DATA SPACE SUPPORTef .ENDCgh .IF DF P$$OOLi3j F3MASK=F3MASK!F3.PRO ;SEC POOL PROTO TCB SUPPORTRkl .ENDCmn .IF DF T$$COMo7p F3MASK=F3MASK!F3.TCM ;TTDRV HAS SEPARATE BUFFER POOLqr .ENDCst .IF DF P$$CTLu0v F3MASK=F3MASK!F3.PMN ;POOL MONITORING SUPPORTwx .ENDCyz{|}; FEATURE MASK 4 BITSC~"; DEFINE MASK (NO CONSTANT BITS)  F4MASK=0E .IF DF R$$PRO+ F4MASK=F4MASK!F4.XT ;THIS IS A CT SYSTEMF .ENDC ;R$$PRO .IF DF E$$LOG. F4MASK=F4MASK!F4.ERL ;ERROR LOGGING SUPPORT .ENDC .IF DF P$$RTY. F4MASK=F4MASK!F4.PTY ;PARITY MEMORY SUPPORT .ENDC .IF DF, F$$DVNR0 F4MASK=F4MASK!F4.DVN ;DECIMAL VERSION NUMBERS .ENDC ; DF F$$DVN .IF DF C$$CDA .IF EQ, C$$CDA4 F4MASK=F4MASK!F4.LCD ;LOADABLE CRASH DUMP SUPPORT .ENDC ; EQ C$$CDA .ENDC .IF DF F$$NIM2 F4MASK=F4MASK!F4.NIM ;DELETED FIXED TASK IMAGES .ENDC .IF DF D$$CHE* F4MASK=F4MASK!F4.CHE ;DISK DATA CACHING .ENDC .IF DF L$$GCL- F4MASK=F4MASK!F4.LOG ;LOGICAL NAME SUPPORTT .ENDC .IF DF N$$DIR0 F4M00hd^db`TADATADATADATADATADATAASK=F4MASK!F4.NAM ;NAMED DIRECTORY SUPPORT .ENDC ;DF N$$DIRD .IF DF P$$LAS&X$$HDR&F$$MAP) F4MASK=F4MASK!F4.FMP ;FAST MAP SUPPORT " .ENDC ; DF P$$LAS&X$$HDR&F$$MAP .IF DF D$$DCL+ F4MASK=F4MASK!F4.DCL ;DCL IS DEFAULT CLIT .ENDC ;DF D$$DCL .IF DF D$$DDS4 F4MASK=F4MASK!F4.DDS ;DDS IS DEFAULT (NAMED MODE) .ENDC ;DF D$$DDS$ .IF DF T$$ACD. F4MASK=F4MASK!F4.ACD ;SYSTEM SUPPORTS ACD'S .ENDC ;DF T$$ACD .IF DF T$$TSA/ F4MASK=F4MASK!F4.NCT ;SYSTEM HAS NCT SUPPORT .ENDC ;DF T$$TSA$&; DEFINE MASK (NO CONSTANT FEATURES)6 F5MASK=F5.VTL ;INIT TO VTLOGONS DISABLED ; BM399 ; KLN011/; Remote services feature mask ; KLN011S; If HF.RMT is set as SAV brings the system up, the mask in $FMSKR will ; KLN011E4; replace the bits defined by $FMSKM ; KLN011T; This scheme allows the system to be SAVed on a processor that does not ; KLN011X; require host services and then run on a processor like the KXJ11 which does ; KLN011 ; KLN011 FMASKR=0 ; KLN011A ;**-1 .IF DF P$$3XX9 F5MASK=F5MASK!F5.PRO ;SYSTEM SUPPORTS PROFESSIONAL 3XXe  ;SERIES PERSONAL COMPUTERS .ENDC ; DF P$$3XX  .IF DF C$$DFB ; KLN011 ; KLN011D F5MASK=F5MASK!F5.DFB ; SYSTEM SUPPORTS DEFERRED BINDING ; KLN011 ; KLN011# .ENDC ; DF C$$DFB ; KLN011t ; KLN011  .IF DF C$$ODB ; KLN011 ; KLN011B F5MASK=F5MASK!F5.ODB ; CAN OVERRIDE DEFERRED BINDING ; KLN011 ; KLN011# .ENDC ; DF C$$ODB ; KLN011 ; KLN011  .IF DF C$$RTB ; KLN011 ; KLN011D F5MASK=F5MASK!F5.RTB ; SYSTEM SUPPORTS RUN TIME BINDING ; KLN011 ; KLN011# .ENDC ; DF C$$RTB ; KLN011T ; KLN011  .IF DF C$$RTK ; KLN011 ; KLN011H FMASKR=FMASKR!F5.RTK ; SYSTEM SUPPORTS REMOTE TASK INSTALLS ; KLN011 ; KLN011# .ENDC ; DF C$$RTK ; KLN011R ; KLN011  .IF DF C$$NSY ; KLN011 ; KLN011H FMASKR=FMASKR!F5.NSY ; SYSTEM SUPPORTS NO LOCAL SYSTEM DISK ; KLN011 ; KLN011# .ENDC ; DF C$$NSY ; KLN011T ; KLN011  .IF DF C$$NCO ; KLN011 ; KLN011? FMASKR=FMASKR!F5.NCO ; SYSTEM SUPPORTS NO CONSOLE ; KLN0111 ; KLN011# .ENDC ; DF C$$NCO ; KLN011P ; KLN011  .IF DF C$$XDJ ; KLN011 ; KLN011< FMASKR=FMASKR!F5.XDJ ; SYSTEM SUPPORTS KXJ XDT ; KLN011 ; KLN011# .ENDC ; DF C$$XDJ ; KLN011  ; KLN011  .IF DF C$$RDR ; KLN011 ; KLN011L FMASKR=FMASKR!F5.RDR ; SYSTEM SUPPORTS REMOTE DIRECTORY DEFAULTS ; KLN011 ; KLN011# .ENDC ; DF C$$RDR ; KLN011Y ; KLN011  .IF DF C$$RLG ; KLN011 ; KLN011C FMASKR=FMASKR!F5.RLG ; SYSTEM SUPPORTS REMOTE LOGICALS ; KLN011L ; KLN011# .ENDC ; DF C$$RLG ; KLN011M ; KLN011  .IF DF C$$LDR ; KLN011 ; KLN011I FMASKR=FMASKR!F5.LDR ; SYSTEM SUPPORTS REMOTE LOADER/OVERLAYS ; KLN011  ; KLN011# .ENDC ; DF C$$LDR ; KLN011O ; KLN0119 .IF NDF C$$RMT ; IF NO REMOTE HOST SUPPORT ; KLN011; ; KLN011; F5MASK=F5MASK!FMASKR ; SET $FMASK5 TO BE BOTH ; KLN0110 ; KLN011! .ENDC ; C$$RMT ; KLN011C ; KLN011;1; NULL TASK CONTROL BLOCK;;1G; THIS TCB TERMINATES THE SYSTEM AND ACTIVE TASK LISTS. IT MUST HAVE E; A PRIORITY OF ZERO AND ALWAYS BE BLOCKED. REQUIRED POSITIONS ARES#; ENFORCED BY THE "ASSUME" MACRO..;;-$CMBEG:: ;BEGINNING OF SYSCM AREA FOR CDA;NH; $ACCLK MUST REFERENCE THE SAME TWO WORDS AS $ABTIM FOR ACCOUNTING TOH; WORK, UNLESS ACCOUTING HAS ITS OWN CLOCK. IN THIS CASE, $ACCLK WILLF; BE THE ADDRE00pdccccccSS OF WHERE ACCOUNTING CAN ACCESS IT. ACCOUNTING WILL=; USE A TWO WORD $ABTIM IF A PRIVATE CLOCK IS NOT AVAILABLEI; /$ACCLK:: ;ABSOLUTE TIME CLOCK FOR ACCOUTING.$ABTM2::.WORD 0 ;ADDITIONAL WORD FOR $ABTIM)$ABTIM::.WORD 0 ;ABSOLUTE TIME COUNTER 3$ACTHD::.WORD . ;T.LNK-ACTIVE TASK LIST LISTHEADF, ASSUME .-$ACTHD,T.PRI ;T.PRI MUST BE ZERO- .BYTE 0 ;T.PRI-NULL TASK PRIORITY IS ZEROT .IF DF M$$PRO?$NCPU:: .BYTE M$$PRO ;T.IOC - NUMBER OF PROCESSORS IN SYSTEMD .IFF  5 $NCPU:: .BYTE 0 ;T.IOC - NOT MULTIPROCESSOR SYSTEMO   .ENDC 2$COMEF::.WORD 0 ;T.DPCB-COMMON EVENT FLAGS 1-16+ .WORD 0 ;T.NAM-COMMON EVENT FLAGS 17-32 1$HRCPT::.WORD 0 ;T.NAM+2-POINTER TO HRC... TCB;A$DEVHD::.WORD $DEVTB ;T.RCVL-PTR TO FIRST DEVICE CONTROL BLOCKL0$TKNPT::.WORD 0 ;T.RCVL+2-POINTER TO TKTN TCB2$SHFPT::.WORD 0 ;T.ASTL-POINTER TO SHUFFLER TCB<$CKCNT::.WORD K$$CNT ;T.ASTL+2-ADDRESS OF CLOCK COUNT REG>$CKCSR::.WORD K$$CSR ;T.EFLG-ADDR OF CLOCK CNTRL STATUS REG .IF EQ K$$CSR-177546S-$CKLDC::.WORD 0 ;T.EFLG+2-CLOCK LOAD COUNT  .IFFO2$CKLDC::.WORD K$$LDC ;T.EFLG+2-CLOCK LOAD COUNT ! .ENDC"#6$$SYUIC::.BYTE 54,1 ;T.UCB-DEFAULT MAPPED SYSTEM UIC.% ASSUME .-$ACTHD,T.TCBL ;T.TCBL MUST BE ZERO$& .WORD 0 ;T.TCBL-LINK TO NEXT TCB1' ASSUME .-$ACTHD,T.STAT ;T.STAT MUST BE NONZEROT9($EXSIZ::.WORD $SYTOP ;T.STAT-ADDR OF LAST BYTE IN EXECF9)$PWRFL::.WORD 0 ;T.ST2-POWERFAIL RECOVERY REQUEST FLAGL4*$SIGFL::.WORD 0 ;T.ST3-TASK WAITING FOR SIG EVENT-+ .WORD 0 ;T.DPRI MUST BE 0, T.LBN - UNUSEDO8,$FXRPT::.WORD 0 ;T.LBN+1-POINTER TO PARITY ERROR TASK:-$LSTLK::.WORD 0 ;T.LDV-LOCK WORD (TCB ADDRESS OF OWNER)3. .WORD 3 ;T.PCB-CONSTANT FOR ALLOCATION ROUTINESD/01 .IF NDF K$$DASO263$ICAVL:: ;ICB POOL SAME AS CORE POOL IF NO D SPACE45 .ENDC6798$CRAVL::.WORD $SYBEG ;T.MXSZ-ACTIVE TASK LIST LISTHEAD .9 ASSUME .-$ACTHD,T.ACTL ;T.ACTL MUST BE ZERO:;< .IF NDF M$$PROG=,>$K6TAB:: ;REFERENCE LABEL FOR MAPPING IN ? ;NON-MULTIPROCESSOR SYSTEM@A .ENDCBC3D .WORD 0 ;T.ACTL-NEXT ACTIVE TASK-DUMMY BLK SIZETEF; 9G; END OF SUPERIMPOSED AREA-REMAINING SYSTEM COMMON AREAPH;NI J$ACPTK::KL .IF DF R$$AMDM+N .WORD 0 ;TCB POINTER FOR DEFAULT F11ACPSOP .ENDC ; DF R$$AMDQ5R$VERTK::.WORD 0 ;TCB POINTER FOR VERIFICATION TASK-S6T$LOGHD::.WORD 0 ;LOGICAL DEVICE ASSIGNMENT LISTHEAD8U$CFLPT::.WORD 0 ;POINTER TO FIRST CHECKPOINT FILE PCBV$MOULS::.WORD 0 ;MOUNT LIST"W$LBUIC::.BYTE 54,3 ;LIBRARY UIC"X$NTUIC::.BYTE 54,1 ;NETWORK UICYZ9[$SPMAX::.WORD 0 ;POINTER TO AUXILARY MONITOR POOL NODER3\$SPMVC::.BLKW 1 ;POINTER TO SPM NODE IN ICB POOL+]$HKSTS::.BLKW 1 ;SPM MONITOR STATUS WORDD^I_; SPM ENTRY VECTORS - EXTERNAL TASKS (LOADER,F11ACP) CALL THROUGH THESEW7`; HOOKS. THEY POINT TO THE RETURN IN $GTPKT IF:=a; SPM IS TURNED OFF, AND SPM INTERCEPTS THEM WHEN IT b; IS ENABLED.c; de .IF DF K$$DASf6g$SPV01::.WORD 0 ;SPM VECTOR FOR ACP HOOKPOINT ENTRY8h$SPV02::.WORD 0 ;SPM VECTOR FOR LOADR HOOKPOINT ENTRY8i$SPV03::.WORD 0 ;SPM VECTOR FOR LOADR HOOKPOINT ENTRYjk .IFF ; DF K$$DASNl;m$SPV01::.WORD $SPVEX ;SPM VECTOR FOR ACP HOOKPOINT ENTRY =n$SPV02::.WORD $SPVEX ;SPM VECTOR FOR LOADR HOOKPOINT ENTRY =o$SPV03::.WORD $SPVEX ;SPM VECTOR FOR LOADR HOOKPOINT ENTRY:pq .ENDC ; DF K$$DASrst; Au; $BTTIM HOLDS THE ABSOLUTE TIME OF WHEN THE SYSTEM WAS BOOTED.DEv; THE TWO WORDS MUST BE CONSECUTIVE, THE LABEL IS ON THE SECOND ONE!w; FOR COMPATABILITY WITH $ABTIMAx;O-y$BTTM2::.WORD 0 ;HIGH ORDER WORD OF $BTTIMR3z$BTTIM::.WORD 0 ;VALUE OF $ABTIM WHEN SYS BOOTED{|} .IF DF D$$MND~4$DICSR::.WORD D$$MND ;ADDRESS OF DIAMOND REGISTER9$DITCB::.WORD 0 ;ADDRESS OF TCB FOR TASK BEING WATCHEDS .ENDC .IF DF M$$PRO5$CKURM::.WORD 1 ;URM OF PROCESSOR THAT KEEPS CLOCKL .ENDC00xd^db`TADATADATADATADATADATA, .BLKW 1 ;CLOCK INTERRUPT FORK BLOCK LINK* .BLKW 1 ;CLOCK INTERRUPT FORK BLOCK PC0$INTCT::.WORD -1 ;CLOCK INTERRUPT TICKS COUNT'$FRKHD::.WORD 0 ;FORK QUEUE LISTHEAD 2 .WORD $FRKHD ;(LAST POINTS TO FIRST INITIALLY)+$FMASK::.WORD FMASK ;SYSTEM FEATURE MASK;$FMSK2:: .WORD F2MASK ;SECOND WORD OF SYSTEM FEATURE MASK::$FMSK3:: .WORD F3MASK ;THIRD WORD OF SYSTEM FEATURE MASK;$FMSK4:: .WORD F4MASK ;FOURTH WORD OF SYSTEM FEATURE MASKP:$FMSK5:: .WORD F5MASK ;FIFTH WORD OF SYSTEM FEATURE MASK3$FMEND:: ;REF. LABLE DELIMITING FEATURE MSK WDSK  .IF DF C$$RMT ; KLN011 ; KLN011$XXWIN:: ; KLN041:L$FMSKR::.WORD FMASKR ; THIS WORD BECOMES $FMSK5 IF HF.RMT IS SET ; KLN011> .WORD 0 ; W.IOC MUST BE ZERO, EVERYTHING ELSE IS ; KLN041 ; IRRELIVANT ; KLN041M ; KLN041  .IFF ; C$$RMT ; KLN041 ; KLN041$XXWIN:: ; KLN041 $FMSKR:: ; KLN011 ; KLN011! .ENDC ; C$$RMT ; KLN011K ; KLN011*$PRMOD::.WORD 0 ;PROCESSOR MODEL NUMBER$CLKHD::.WORD 0 ;CLOCK QUEUE 4$COPT:: .WORD .CO0 ;POINTER TO COMMAND OUTPUT UCB-$PARHD::.WORD 0 ;POINTER TO PARTITION LISTT)$LDRPT::.WORD 0 ;POINTER TO LOADER TCBB9$TSKHD::.WORD $ACTHD ;POINTER TO SYSTEM TASK DIRECTORY 3$CBDHD::.WORD 0 ;COMMON BLOCK DIRECTORY LISTHEAD  .IF DF G$$GEF,$GGEF:: .WORD 0 ;GROUP GLOBAL EVENT FLAGS5$GFTCB::.WORD $GEFPT+2 ;GRP GLOBAL USER TCB POINTER;;$GEFPT::.WORD $GEFPT+2 ;GROUP GLOBAL MASK ADDRESS POINTERR. .WORD 0 ;DUMMY WORD FOR NON-GRP GLOBAL USE .ENDC ; DF G$$GEF.$LDPCB::.WORD 0 ;CURRENT LOADER PCB POINTER0$VECTR::.WORD V$$CTR-4 ;HIGHEST VECTOR ADDRESS>$MXEXT::.WORD 177777 ;INITIALLY NO LIMIT FOR TASK EXTENSION9$AVRHD::.WORD 0 ;AUTOMATIC VOLUME RECOGNITION LISTHEADO/$PRIFR::.WORD 0 ;CURRENT AMOUNT OF FREE POOL5$ULDPT::.WORD 0 ;MICROCODE LOADER TASK TCB ADDRESS:4$GNLST::.WORD 0 ;GENERAL USE POOL PACKET LISTHEAD*$PTCBL::.WORD 0 ;PROTOTYPE TCB LISTHEAD0$PTCPT::.WORD 0 ;KISAR5 BIAS OF PROTOTYPE TCB.$PASTH::.WORD 0,.-2 ;PARTITION AST LISTHEAD; 8; P/OS $NXTSK LOCK AND BASE FROM WHICH TO START SEARCH;S)$NXTLK::.WORD 0 ;$NXTSK RECURSION LOCKI+$NXTBA::.WORD 0 ;$NXTSK BASE SEARCH BIASD; ); LOGICAL NAME TRANSLATION SUPPORT DATA;R .IF DF L$$GCL=$LOGTB::.WORD 0 ;APR BIAS PTR TO SYSTEM LOGICAL HASH TABLED5 .WORD 0 ;APR BIAS PTR TO GROUP LOGICAL HASH TABLET;$USRLG::.WORD 0 ;APR BIAS PTR TO USER LOGICAL HASH TABLEW4 .WORD 0 ;APR BIAS PTR TO TASK LOGICAL HASH TABLE5 .WORD 0 ;RESERVED WORD FOR P/OS LT.USR (ALWAYS 0)O .IFF ; DF L$$GCL $LOGTB:: $USRLG:: .ENDC ; DF L$$GCL;C); NAMED DIRECTORY CONTEXT BLOCK POINTERB; $CTXPT:: .IF DF N$$DIR  .WORD 0 .ENDC ;DF N$$DIRL;B@; THE FOLLOWING WORDS ARE USED FOR THE POOL MONITOR INTERFACE.E; THE ORDERING OF THESE WORDS CANNOT BE CHANGED BECAUSE PMT AND VMRI ; ARE WRITTEN TO DEPEND ON IT.;. .IF DF P$$CTL5$PTTCB::.WORD 0 ;TCB ADDRESS OF POOL RECOVERY TASKP+$PRISZ::.WORD 0 ;TOTAL SIZE OF FREE POOLC6$POLST::.WORD 0 ;EXEC/POOL TASK COMMUNICATIONS WORD<$PRIHL::.WORD P$$HIL ;HIGH WATER MARK FOR POOL MONITORING;$PRILL::.WORD P$$LOL ;LOW WATER MARK FOR POOL MONITORINGC9$PFRSZ::.WORD P$$FRS ;MINIMUM SIZE OF LARGEST FRAGMENTD;$POLBP::.WORD P$$BPR ;MINIMUM PRIORITY OF NONPRIVILEGEDO' ;TASKS TO EXECUTE DURING LOW POOLI6$POLFL::.WORD 0 ;EXECUTIVE POOL USAGE CONTROL FLAGS .IFF($PTTCB:: ;ALWAYS DEFINE THESE LABELS $PRISZ:: $POLST:: $PRIHL:: $PRILL:: $PFRSZ:: $POLBP:: $POLFL:: .ENDC;D%; SHADOW RECORDING IMPURE DATA AREAA;R%$SHUMB::.WORD 0 ;ROOT FOR UMB LISTL6$SHERR::.WORD 0 ;POINTS TO TCB OF SHADOW ERROR TASK($SHLIM::.WORD 10. ;ERROR PACKET LIMIT.$SHPCT::.WORD 0 ;CURRENT SHADOW ERROR COUNT:$SHLOS::.WORD 0 ;00dccccccNUMBER OF PACKETS LOST FROM SATURATION1$RCTPT::.WORD 0 ;POINTER TO CURRENT RCT... TCB+$EXCRC::.WORD 0 ;EXECUTIVE RO CODE CRC16; ; BM387H; WINDOW I/O COUNT FLAG. THE FOLLOWING WORD IS USED BY DREIF, ; BM387G; IOFIN, AND DEACC IN THE ACP TO DETERMINE WHETHER TO MANAGE ; BM387 F; THE WINDOW I/O COUNT. IF SET TO DV.F11 THE BEHAVIOR IS TO ; BM387H; MANAGE THE I/O COUNT (NEW). IF SET TO ZERO THE I/O COUNT IS ; BM387C; LEFT ALONE AND THE WINDOW MAY BE DEALLOCATED WITH I/O ; BM387O6; PENDING. THIS MAY CAUSE CRASHES LATER. ; BM387; ; BM387F$WCFLG::.WORD 0 ; DV.F11 ; WINDOW I/O COUNT MANAGEMENT FLAG ; BM387 ; BM387F, .IF DF D$$CHE ;DISK DATA CACHING SUPPORT; !; DATA CACHING IMPURE DATA AREAR ;W ; $DCPCB::.WORD 0 ;PCB ADDRESS OF SYSTEM DEFAULT CACHE PARV  ;B3; THESE CELLS ARE FILLED IN BY $MPVBN (MDSUB) FOR):; VIRTUAL TO LOGICAL I/O TRANSLATIONS. THIS INFORMATION7; IS USED BY THE CACHER WHEN PROCESSING THE RESULTING ; I/O PACKET. ; )$DCCEL::.WORD 0 ;CURRENT EXTENT LENGTH7-$DCCEB::.WORD 0,0 ;CURRENT EXTENT BASE LBN &$DCNEL::.WORD 0 ;NEXT EXTENT LENGTH*$DCNEB::.WORD 0,0 ;NEXT EXTENT BASE LBNA$DCSTS::.WORD 0 ;STATUS INFORMATION FROM WINDOW BLOCK ;JRK332 .ENDC ;D$$CHE;EE; POINTER TO FIRST IP11 UCB, USED BY IP11 POWERFAIL CODE (IN POWER) ;B. $IPUCB::.WORD 0 ; POINTER TO FIRST IP11 UCB!"#;N:$; PARAMETER AREA FOR STATUS CHANGE ROUTINES IN OLRSR.MAC%;/&0'$SCDEV::.BLKW 1 ;UCB OR KRB FOR STATUS CHANGE0($SCRET:: ;REFERENCE LABEL (ALIAS FOR $SCCTB).)$SCCTB::.BLKW 1 ;CTB IF $SCDEV CONTAINS KRB/*$SCOFL::.BLKB 1 ;ONLINE OR OFFLINE PARAMETERD,+$SCERR::.BLKB 1 ;ERROR RETURN FROM DRIVER,-;J$.; EVENT TRACE READ/WRITE DATA AREA/;E012 .IF DF E$$VNT34;E5; CURRENT BUFFER INFORMATION6;7+8$EVKS6::.WORD 0 ;KISAR6 OFFSET TO BUFFERP29$EVDIS::.WORD 0 ;BUFFER POSITION FOR NEXT EVENT4:$EVLEN::.WORD 0 ;PTR TO WORD BEYOND END OF BUFFER);$EVSEQ::.WORD 0 ;EVENT SEQUENCE NUMBERT<<$EVLOS::.WORD 0 ;NUMBER OF EVENTS LOST THROUGH SATURATION4=$EVTCB::.WORD 0 ;TCB ADDRESS OF EVENT LOGGER TASK>?;N@; EVENT SWITCH TABLEA; B; INDEXED BY EVENT NUMBER$C; IF BYTE NEGATIVE, EVENT DISABLED.D; IF BYTE POSITIVE, VALUE IS LENGTH OF EVENTE;AF; EVERY EVENT MUST CONTAIN AN ENTRY IN THIS TABLE, OF THE FORM:OG; *H; .BYTE -EV.XXX ;THIS IS A SAMPLE EVENTI;O+J; WHERE XXX IS THE NUMBER OF THE EVENT. K;DLM$EVTAB:: ;REFERENCE LABEL;NOP .REPT E$$VNT.Q .BYTE -1 ;SET ALL EVENTS TO NULL INITIALLYR .ENDR#S .BYTE 0 ;THERE IS NO EVENT ZEROETUV .EVENWX;Y; EVENT BUFFER MANAGEMENTZ;N[6\$EVBSQ::.WORD 1 ;BUFFER SEQUENCE NUMBER (NEVER = 0)]$EVLST:: ;REFERENCE LABELS^_` .REPT E$$BUF+1 a%b .WORD 0 ;KISAR6 POINTER TO BUFFERAcd .ENDRef .IFFgh$EVKS6:: ;REFERENCE LABELE i$EVDIS:: j$EVLEN:: k$EVSEQ:: l$EVTAB:: m$EVBSQ:: n$EVLST::op .ENDCqrst; WATCHPOINT DEBUG INFOuv .IF DF R$$WPTw4x$WPLST::.WORD 0 ;LAST SYSTEM STATE ROUTINE CALLED1y$WPVAL::.WORD 0 ;VALUE TO WATCH FOR OR AGAINSTN.z$WPADR::.WORD $WPVAL ;PLACE TO WATCH FOR IT{| .ENDC ; DF R$$WPT}~;=; ADDITIONAL ARGUMENT TO $POWER FOR MULTIPROCESSOR SYSTEMS.;O .IF DF M$$PRO$$PFURM::.WORD 0 ;URM TO POWERFAIL .ENDC ;LBM050G$SWR:: .WORD 0 ;SOFTWARE SWITCH REGISTER IF NONE IN HARDWARE ;LBM050 ;LBM050I ;**-5; EXECUTIVE COMMON APR TABLE; ; * * * N O T E * * *;DG; THIS TABLE IS ORDER DEPENDENT, SINCE THERE IS A TABLE IN VMR OF THEVG; STANDARD COMMON NAMES THAT OCCUR IN THE DIRECTIVE PARTITION. A SIDEDG; EFFECT OF THIS IS THAT THE ENTRIES BELOW MAY NOT BE CONDITIONALIZED;D .IF DF D$$PAR8$DRAPR::.WORD 0 ;APR VALUE TO MAP DIRECTIVE PARTITION3$D00d^db`TADATADATADATADATADATARAP2::.WORD 0 ;BIAS OF SECOND DIRECTIVE COMMONF2$DRAP3::.WORD 0 ;BIAS OF THIRD DIRECTIVE COMMON3$DRAP4::.WORD 0 ;BIAS OF FOURTH DIRECTIVE COMMON 4$DRAPV::.WORD 0 ;BIAS OF EXEC VECTORING DIRECTIVE5$DRCHE::.WORD 0 ;BIAS OF DATA CACHE MANAGER COMMONV/ .WORD -1 ;FLAG FOR END OF COMMON BIAS TABLEE .IFFO'$DRAPR:: ;ALWAYS DEFINE THIS SYMBOLT .ENDCA; $ENVEC - TABLE OF ENTRY POINTS FOR VECTORING CODE WHICH CAN'T:; USE $DRGIN ;P<; THIS TABLE CONTAINS A *SMALL* NUMBER OF ADDRESSES AND ISA; INTENDED TO PROVIDE THE MINIMUM AMOUNT OF INFO TO ACCESS THEN&; SYSTEM WITHOUT BEING LINKED TO IT.;M9$ENVEC::.WORD $DRAPV ;POINTER TO APR BIAS OF VECTORINGD  ;COMMON; .IF DF C$$CDA1$CRKRB::.WORD 0 ;CRASH DUMP DEVICE KRB ADDRESS 9$CRSFM::.WORD 0 ;CRASH FORMATTER NUMBER (RH TAPE ONLY)SE$CRSUN::.WORD C$$RUN ;CRASH PHSICAL UNIT NUMBER. NOTE: C$$RUN ISI0 ;...A LOGICAL UNIT NUMBER. INITL CONVERTS+ ;...$CRSUN TO A PHYSICAL UNIT NUMBER.R8$CRCSR::.WORD 0 ;CRASH DEVICE CSR ADDRESS WHEN NO KRB3$CRLCK::.BYTE 1 ;ONLY ONE CPU SHOULD DUMP MEMORYE$ .BYTE 0 ;PRESERVE WORD ALIGNMENT .ENDC ; DF C$$CDA .IF DF R$$NDC>$RNDCT::.WORD R$$NDC ;CLOCK TICKS TO NEXT SCHEDULE INTERVAL<$RNDC:: .WORD R$$NDC ;CLOCK TICKS PER SCHEDULING INTERVAL:$RNDL:: .BYTE R$$NDL ;LOWEST PRIORITY CLASS TO CONSIDER/$RNDH:: .BYTE R$$NDH ;HIGHEST PRIORITY CLASSM .ENDC .IF DF S$$WPC&D$$ISKS>$SWPCT::.WORD S$$WPC ;CLOCK TICKS TO NEXT SWAPPING INTERVAL:$SWPC:: .WORD S$$WPC ;CLOCK TICKS PER SWAPPING INTERVAL*$SWPR:: .WORD S$$WPR ;SWAPPING PRIORITY .ENDC;<; DAYS PER MONTH TABLE (ENTRY CONTAINS DAYS PER MONTH + 1);T)$DYPMN::.BYTE 29.,32. ;FEBRUARY, MARCHC .BYTE 31.,32. ;APRIL, MAYN .BYTE 31.,32. ;JUNE, JULY $ .BYTE 32.,31. ;AUGUST, SEPTEMBER$ .BYTE 32.,31. ;OCTOBER, NOVEMBER$ .BYTE 32.,32. ;DECEMBER, JANUARY;C; BIT MASK TABLE;WH; NOTE: DUE TO THE ORGANIZATION OF THE SUPERVISOR MODE MAPPING CONTROLB; SUPPORT, NAMELY THE FACT THAT BIT 0 OF THE BYTE CORRESPONDS TO<; APR 1, NOT APR 0, THERE MUST BE A ZERO PRECEDING $BTMSK.;R# .WORD 0 ;DUMMY FOR APR0 BITMASK$BTMSK::.WORD 1 ;BIT 0. .WORD 2 ;BIT 1. .WORD 4 ;BIT 2.L .WORD 10 ;BIT 3. .WORD 20 ;BIT 4. .WORD 40 ;BIT 5. .WORD 100 ;BIT 6.. .WORD 200 ;BIT 7.R .WORD 400 ;BIT 8.C .WORD 1000 ;BIT 9. .WORD 2000 ;BIT 10.W .WORD 4000 ;BIT 11.E .WORD 10000 ;BIT 12. .WORD 20000 ;BIT 13. .WORD 40000 ;BIT 14. .WORD 100000 ;BIT 15. 9; BIT MASK TABLE FOR FORMING ADDRESS MASKS IN $ACHRO INE; USER I/D SYSTEMS .IF DF U$$DAS!S$$LIBM  .BYTE 0&$BCMSK::.BYTE 1,3,7,17,37,77,177,377 .ENDC ; DF U$$DAS!S$$LIB 6; TABLE OF APR ADDRESSES USED BY GIN SF.APR FUNCTION  .EVEN7 $APRTB::.WORD KINAR0,KINDR0 ;KERNEL I SPACE REGISTERSO   .IF DF K$$DAS 0 .WORD KDSAR0,KDSDR0 ;KERNEL D SPACE REGISTERS .ENDC ; DF K$$DAS. .WORD UINAR0,UINDR0 ;USER I SPACE REGISTERS .IF DF U$$DAS. .WORD UDSAR0,UDSDR0 ;USER D SPACE REGISTERS .ENDC ; DF U$$DAS .IF DF S$$LIB/ .WORD SISAR0,SISDR0 ;SUPER I SPACE REGISTERS,/ .WORD SDSAR0,SDSDR0 ;SUPER D SPACE REGISTERS  .ENDC ; DF S$$LIB ! .WORD 0 ;END OF TABLEI"#$;VB%; SHUFFLER TASK REQUEST LIMIT FLAGS. $SHFTM CONTAINS THE NUMBER@&; OF CLOCK TICKS THAT MUST EXPIRE BEFORE THE SHUFFLER TASK CANB'; BE REQUESTED BY THE EXECUTIVE. IT IS INITIALIZED TO THE VALUE8(; CONTAINED IN $SHFCT EACH TIME THE SHUFFLER EXECUTES.);;*@+$SHFTM:: .WORD 0 ;TIME REMAINING BEFORE NEXT POSSIBLE REQUEST,A-$SHFCT:: .WORD S$$HFC ;MINIMUM TICKS BETWEEN SHUFFLER REQUESTS,./0; "1; ONLINE ERROR LOGGING DATA BASE2;L345 .IF DF E$$LOG67;"8; ERROR LOG FEATURE MASK SUPPORT9;I :EFEAT = 0S&; .IIF DF,E$$ICM EFEAT = EFEAT!00dccccccEL.ICM&< .IIF DF,E$$MOU EFEAT = EFEAT!EL.MOU&= .IIF DF,E$$SEF EFEAT = EFEAT!EL.SEF3>$EFMSK::.WORD EFEAT ;SELECTED FEATURE MASK WORDS ?/@$ERHEA::.WORD 0, .-2 ;MESSAGE QUEUE LISTHEAD)A$ENTSQ::.WORD 0 ;ENTRY SEQUENCE NUMBERN*B$ERFLA::.WORD 0 ;ERROR LOGGER FLAG WORD9C$ERRX:: .WORD 0 ;POINTER TO SECONDARY POOL ERRLOG DATADE .IFFEFG$ERFLA:: ;REFERENCE LABELHI .ENDC ; DF E$$LOGJK/L$ERRPT::.WORD 0 ;POINTER TO ERROR LOGGER TCB )M$ERRSQ::.WORD 0 ;ERROR SEQUENCE NUMBERNO P$NCTPT::Q .IF DF T$$TSAR .WORD 0 ;APR BIAS OF NT.NCTL*S .WORD 0 ;APR5 ADDRESS OF QUEUE ROUTINET .WORD 0 ;NCT... TCB ADDRESSRU .ENDC ; T$$TSAQVWX .IF DF R$$PROYZ;;C[; $NVRTM CONTAINS THE NUMBER OF TICKS THAT MUST ELAPSE BEFORE THEF\; O/S UPTIME CELL IN THE PROFESSIONAL 3XX NVR IS UPDATED. IN GENERALF]; IT IS SET TO THE NUMBER OF TICKS PER SECOND TIMES 60. THIS RESULTSF^; IN UPTIME IN MINUTES BEING RECORDED. IT IS INITIALIZED WITH $NVRCT"_; EACH TIME THAT NVR IS UPDATED.`;a.b$NVRTM::.WORD 0 ;TICKS TILL NEXT NVR UPDATE3c$NVRCT::.WORD N$$VRC ;TICKS PER NVR UPDATE CYCLE0def; %g; TASK NAME OF THE P/OS DISPATCHER.*h; USED TO SEND MESSAGES AND AST'S TO IT.i; j6k$CTBNM::.RAD50 /C$CTEX/ ;NAME OF THE P/OS DISPATCHERlmn .ENDC ; DF R$$PROo&p$DVSAV::.BLKW 1 ;SAVED CSR CONTENTSqr;E2s; SYSTEM BOOTSTRAP AND SAVE CONFIGURATION VECTORt;Muvw .IF NDF K$$DAS.xy$SYALT:: ;REFERENCE LABEL z{ .ENDC|}5~$SYSIZ::.WORD S$$YSZ ;SIZE OF MEMORY IN 32W BLOCKS / .BLKB 1 ;LOGICAL UNIT NUMBER OF LOAD DEVICER+ .BLKB 3 ;LBN OF LOAD/SAVE IMAGE ON DISKF) .BLKW 1 ;NAME OF LOAD DEVICE IN ASCIIS. .BLKW 1 ;SIZE OF LOAD IMAGE IN 256W BLOCKS;X; TIME LIMIT PARAMETERSH;  .WORD -1 ;YEARS PER UNIVERSE .WORD 13. ;MONTHS PER YEAR* .WORD 32. ;DAYS PER MONTH (CALCULATED) .WORD 24. ;HOURS PER DAY .WORD 60. ;MINUTES PER HOURA! .WORD 60. ;SECONDS PER MINUTEN;G; ACCOUNTING USES $ACTPS TO GET THE NUMBER OF CLOCK TICKS PER SECOND. F; ON SYSTEMS WHERE ACCOUNTING IS USING THE SYSTEM CLOCK, $ACTPS MUSTG; REFERENCE THE SAME WORD AS $TKPS. IF ACCOUNTING HAS ITS OWN CLOCK, 0; IT WILL CONTAIN THE TICK RATE OF THAT CLOCK.;P'$ACTPS:: ;CLOCK RATE FOR ACCOUNTING  .IF EQ K$$CSR-177546H)$TKPS:: .WORD H$$RTZ ;TICKS PER SECONDU .IFFO)$TKPS:: .WORD K$$TPS ;TICKS PER SECONDP .ENDC;C; CURRENT TIME VECTOR;O, .WORD 82. ;YEAR OF UNIVERSE - HAPPY 30TH) .WORD 3. ;MONTH OF YEAR - BIRTHDAYT, .WORD 30. ;DAY OF MONTH - MS. LAWLER .WORD 0 ;HOUR OF DAY .WORD 0 ;MINUTE OF HOURI .WORD 0 ;SECOND OF MINUTET"$TTNS:: .WORD 0 ;TICK OF SECOND .IF DF P$$3XX9$CKCSA::.WORD $CKCSA ;THIS WORD IS SET EITHER TO POINT% ;TO ITSELF (PDP-11 HARDWARE) ORU( ;TO THE CLOCK CSR (SAME AS $CKCSR)) ;(PRO HARDWARE) TO MAKE TDSCH CLOCK$ ;TICKLING RUN TIME CONDITIONAL .ENDC ; DF P$$3XX;A?; LIFO SEND AND I/O PREALLOCATION LIST POINTER AND PARAMETERS.;Y .IF DF Q$$OPT3$PKAVL::.WORD 0 ;POINTER TO FIRST PACKET IN LIST7$PKNUM::.BYTE 0 ;NUMBER OF PACKETS CURRENTLY IN LISTO7$PKMAX::.BYTE Q$$OPT ;MAXIMUM NUMBER ALLOWED IN LISTA .IFFI$PKNUM:: ;REF LABEL FOR MCRE$PKMAX:: ;REF LABEL FOR MCRT .ENDC;K3; SAVE AREA FOR CALCULATED MULTI-USER TASK NAMES. ;C .IF DF R$$DSP:$TNAME::.BLKW 2 ;(2ND WORD IS ALSO FLAG FOR RQST & RUN) .ENDC;A6; TEMPORARY STORAGE VARIABLES FOR DIRECTIVE SERVICES;:$TEMP0::.BLKW 1 ;$TEMP1::.BLKW 1 ;6$TEMP2::.BLKW 1 ;COMPLETION ROUTINE ADDR FOR $GSPKT5$TEMP3::.WORD 0 ;SCRATCH SPACE FOR SPWN$ AND RPOI$5$TEMP4::.WORD 0 ;SCRATCH SPACE FOR SPWN$ AND RPOI$P9$TONYL::.WORD 0 ;SCRATCH STORAGE FOR SEEK OPTIMIZATION4$IOTMP::.WORD 0 ;SCRATCH WD FOR ADDR CHECKING AND00d^db`TADATADATADATADATADATA ;ACP QIO TEMPORARY WORK7$ATTPT::.WORD 0 ;POINTER TO I.AADA IN CURRENT PACKETU-$CTLST::.WORD $CTB0 ;START OF THE CTB LISTG; KERNEL AST DISPATCH TABLEC; THIS TABLE IS FILLED IN BY INITL AT BOOT TIME. ANY CHANGES MADEI-; HERE MUST BE REFLECTED IN INITL AT DBTBL.;;CH; IF THE SYSTEM DOES NOT SUPPORT KERNEL I/D SPACE, THEN THE REFERENCES; ARE RESOLVED DIRECTLY.;C9$KATBL::.WORD $FINBF ;$FINBF-BUFF I/O FINISH (AK.BUF)C2 .WORD $FINXT ;$FINXT-OFF. TASK EXIT (AK.OCB)2 .WORD $GENBF ;$GENBF-GEN. BUFF. I/O (AK.GBI)2 .WORD $DBTRP ;$DBTRP-FORCE T-BIT TRAP (AK.TBT)2 .WORD $FINDI ;$FINBF-DELAYED I/O FIN (AK.DIO) .IF DF G$$GEF2 .WORD $GGFRN ;$GGFRN-GROUP GBL RUNDWN (AK.GGF) .IFF ; DF G$$GEFF/; .WORD 0 ;IF OTHER KASTS ARE INVENTED, MAKEO' ;THIS A PLACEHOLDER IN THE TABLE.  .ENDC ; DF G$$GEF .IF DF M$$PRO0$URMST::.WORD 0 ;UNIBUS RUN MASK STATUS TABLE .IF DF X$$DBT , $XDTFL::.WORD 1 ;XDT INITIALIZATION TABLE+ $XDTPR::.WORD 0 ;FLAG FOR PROMPTS OF XDTR   .IFFR@$XDTFL::.WORD 177777 ;ALWAYS LOOKS INITIALIZED WHEN NOT THERE6$XDTPR:: ;REFERENCE LABEL -- UNUSED IF XDT ALREADY ;INITIALIZED .ENDC OFF=177777 .REPT M$$PROF OFF=OFF+OFFE .ENDR.$CPMSK::.WORD OFF ;PROCESSOR BIT CLEAR MASK,$IIMSK::.WORD 0 ;IIST INTERRUPT MASK WORD=$IIPND::.WORD 0 ;PENDING URM WORK WORD. LOCKED WITH $FORKL;$IICPU::.WORD 0 ;MASK OF URMS THAT HAVE BEEN INTERRUPTEDB4$IINXT::.WORD $BTMSK ;ROUND ROBIN WORD FOR $IISVC9 $STENB::.WORD 0 ;SANITY TIMER ENABLED ON VARIOUS CPU'SI/!$STFLG::.WORD 0 ;SECONDARY SANITY TIMER FLAG 7"$STALR::.WORD 0 ;SANITY TIMER ALARM ENABLED ON CPU'SC8#$PWRMK::.WORD 0 ;MASK OF CPUS IN THEIR POWERFAIL CODE:$$CPPAR::.WORD 0 ;POINTER TO PARTITION FOR CPU LOCAL MEM%E&; NOTE THAT THE NEXT TWO TABLES FOLLOW AN INDEX STRUCTURE LIKE THAT H'; OF $PARTB+2 INS LOWCR, AND THE TWO SHOULD BE UPDATED IN HARMONY WITH(; HRC (MODULE HRBOX))*+ .IF DF M$$K11,0-$MKCS1::.WORD 1 ;CONTENTS FOR CSR 1 OF MK11'S'. .WORD 8. ;NUMBER OF MK11'S POSSIBLEG6/$MKCSR::.BLKW 8. ;CSR ADDRESS TABLE FOR MK11 PARITY,0$MKCS2::.BLKW 8. ;CSR CONTENTS FOR MK11'S12 .ENDC ; DF M$$K11345; 6; MULTIPROCESSOR LOCKS7; 18; BYTE 0 -- LOCK VALUE (0 IF LOCKED, 1 IF FREE) 9; BYTE 1 -- IF BYTE 0 EQUALS:L1:; 0, THEN BYTE 1 EQUALS PROCESSOR ID OF OWNERN/;; 1, THEN BYTE 1 EQUALS COMPLEMENT OF ID OF <; PREVIOUS OWNERO=; >; IF LOCK TYPE IS "WAIT" THEN:?;W@@; BYTE 2,3 = SECONDARY LOCK WORD (ABOVE FORMAT) FOR WAIT MASK.*A; BYTE 4,5 = MASK OF WAITING PROCESSORS.B;B-C; NOTE: BYTES 4+5 ARE REFERENCED AS A WORD.ND; E:F$EXECL::LCKDF$ WAIT ;SERIALIZE ACCESS TO EXECUTIVE DATA5G$FORKL::LCKDF$ SPIN ;SERIALIZE ACCESS TO FORK LISTE2H$IIFNL::LCKDF$ SPIN ;SERIALIZE ACCESS TO $MPTAB2I$PWRLK::LCKDF$ SPIN ;SERIALIZE ACCESS TO $PWRMKJK;EL; MULTIPROCESSOR TABLEM;DN$O$TKTAB:: ;CURRENT TASK TCB TABLEP .REPT M$$PROW-Q .WORD $ACTHD ;INITIALIZE TO NULL TASK TCB R .ENDRST .IFTFU5V$RQTAB::.WORD $ACTHD ;RESCHEDULE POINTER TCB TABLEBWX .IFTYYZ .REPT M$$PRO-1A-[ .WORD $ACTHD ;INITIALIZE TO NULL TASK TCBE\ .ENDR]^ .IFTF_9`$PRTAB::.WORD 0 ;PROCESSOR CURRENT TASK PRIORITY TABLEEab .IFTCcd .REPT M$$PRO-1C(e .WORD 0 ;INITIALIZE TO PRIORITY ZEROf .ENDRg$h$MPTAB:: ;PROCESSOR STATUS TABLEi .REPT M$$PRO#j .WORD MP.STP ;INITIALLY STOPPEDEk .ENDRl$mOFF=0 ;START K6 OFFSETS AT ZERO/n$K6TAB:: ;PROCESSOR IMPURE AREA APR OFFSETSTo .REPT M$$PRO p .WORD OFF%qOFF=OFF+40 ;INCREASE OFFSET BY 1K.r .ENDRs%tOFF=1 ;START PROCESSOR URMS AT 1T.u$URMTB:: ;PROCESSOR URM CONNECTIVITY TABLEv .REPT M$$PROO w .WORD OFF&xOFF=OFF+OFF ;POOR MAN'S LEFT SHIFTy .ENDRz%{OFF=1 ;START PROCESSOR URMS AT 1E4|$CRMTB:: ;COMPLEMENT OF CPU URM CONNECTIVITY TBL}00dcccccc .REPT M$$PRO~ .WORD ^C&OFF=OFF+OFF ;POOR MAN'S LEFT SHIFT .ENDR .IFTF=$CRFLG::.WORD 0 ;FLAG INDICATING REGISTERS HAVE BEEN SAVEDT .IFT. .REPT M$$PRO-1  .WORD 0 .ENDR8$CRFPR::.WORD 377 ;$PROCN OF FIRST PROCESSOR TO CRASH .IFTC) .WORD 1 ;URM IN FORK BLOCK FOR ERRLOG .IFTF% .BLKW 2 ;ERROR LOGGING FORK BLOCK.$PBEZ:: ;REFERENCE LABELC .IFT URM=2: .REPT M$$PRO-1P  .WORD URM ;URM IN FORK BLOCK URM=URM*2O .BLKW 3 ;3 WORD FORK BLOCK .ENDR .ENDC .IF DF F$$LPP .IF DF M$$PRO .WORD 1 ;URM IN FORK BLOCK .IFTF .BLKW 2 ;2 WORD FORK BLOCK$FLFTB:: ;REFERENCE LABELR .IFTNURM=2C .REPT M$$PRO-1  .WORD URM URM=URM*2U  .BLKW 2 .ENDR .ENDC .ENDC;R+; DEFINITIONS FOR NON MK11 MEMORY SYSTEMSC;E .IF NDF M$$K11 $MKCS1::2 .WORD 0 ;# OF MK11 REGISTERS (FOR BOO,SAV,HRC) $MKCSR:: $MKCS2:: .ENDC ; DF M$$K11 .IF NDF M$$PRO;D.; DEFINITIONS FOR NON-MULTIPROCESSOR SYSTEMS;I$CKURM:: ;REFERENCE LABELS $CPBIT::#$CPCRM:: ;COMPLEMENTED RUN MASKE $CPMSK:: $CPURM::%$CPUSC:: ;CPU STATUS CHANGE ENTRY)$CRMTB:: ;COMPLEMENTED RUN MASK TABLEN $EXECL::)$IBXMT:: ;IIST INTERCPU BOOT TRANSMITI $IIMSK::)$IISTM:: ;IIST SUBROUTINE ENTRY POINT$&$IIXMT:: ;IIST TRANSMIT SUBROUTINE $MPTAB:: $PROCN:: $PROC2:: $PFURM::!$STENB:: ;SANITY TIMER ENABLE $STFLG:: $STALR::$TKTAB:: ;**-1 $URMST:: $URMTB:: $XDTFL:: $XDTPR:: $XDTIN:: .ENDCH; HERE WE DEFINE A SINGLE "FAKE WORD" WHICH RECEIVES ALL THE ADDRESSESF; FOR THINGS WHICH ARE NOT GENNED INTO THE SYSTEM, BUT WHICH REQUIRED; THAT THE ADDRESSES ALWAYS BE RESOLVED FOR TASKBUILDING MCR, ETC.D; THIS ONE (IN SYSCM) IS TO BE USED FOR D SPACE LOCATIONS, AND THEE; ONE IN LOWCR IS USED FOR I SPACE REFERENCES AND CPU SPECIFIC INFO C; (ALSO THINGS WHICH MUST BE ACCESSED WHEN D SPACE IS TURNED OFF)* .IF NDF R$$WPTB $WPVAL:: $WPADD:: $WPLST::  FAKE = 0 .ENDC ; NDF R$$WPTN .IF NDF E$$LOGV $ERHEA:: $ENTSQ::  FAKE = 0E .ENDC ; NDF E$$LOG, .IF DF FAKE/ .WORD -1 ;FAKE DATA LOCATION FOR ALL OF THEL  ;ABOVE   .ENDC ; DF FAKE   .IF DF P$$OOL1$PLPAR::.WORD 0 ;POINTER TO SECONDARY POOL PCBA:$POLHD::.WORD 0 ;LIST HEAD FOR SECONDARY POOL FREE LIST;$SECFR::.WORD 0 ;NUMBER OF FREE BLOCKS IN SECONDARY POOLF .IFF $PLPAR:: $POLHD:: $SECFR:: .ENDC .IF DF A$$CNT3$SYLHD::.WORD 0 ;LISTHEAD FOR SYSLOG INPUT QUEUE%  .WORD $SYLHD ;END OF LIST POINTER$3!$SABPT::.WORD 0 ;POINTER TO SYSTEM ACCOUNT BLOCK "#$ .IF DF X$$ACC%2&$ACNFE::.WORD BF.TRN!BF.XAC ;EXTENDED ACCOUNTING'( .IFF ;X$$ACC:)4*$ACNFE::.WORD BF.TRN ;NORMAL SUPPORTED ACCOUNTING+, .ENDC ;X$$ACC-.9/$APLIM::.WORD 0 ;FREE SEC POOL SPACE ACNT MUST RESERVES30$SYUAB::.WORD 0 ;ADDRESS OF UAB FOR SYSTEM TASKSD51$CKUAB::.WORD 0 ;UAB FOR TASK RUN FROM CLOCK QUEUE23 .IFF:4 5$SABPT:: 6$SYLHD:: 7$ACNFE:: 8$APLIM:: 9$SYUAB:::; .IFTF<1=$LOGPT::.WORD 0 ;POINTER TO TCB OF SYSLOG TASKC>?@ .ENDCABC;D; CLI DATABASE AREANE;A*F$CLICQ::.WORD 0 ;COMMAND QUEUE LISTHEADG .WORD $CLICQW6H$CNTLN::.WORD 0 ;CONTINUATION LINE SEGMENT LISTHEADI .WORD $CNTLNJ/K$CPTBL::.WORD $MCRPT ;POINTER TO CPB FOR MCRVLM .IF DF A$$CLINO .REPT A$$CLI-1SP$Q .WORD 0 ;TABLE FOR CPB ADDRESSESRS .ENDRT2U$NMCLI==A$$CLI ;NUMBER OF CLIS SYSTEM SUPPORTSVW .IFTF ;A$$CLIXY;:Z; CPB FOR MCR[;L<\$MCRPT::.WORD 0 ;POINTER TO MCR'S TCB, START OF MCR'S CPB] .RAD50 /MCR / ;CLI NAME^ .WORD CP.LGO ;STATUS WORDR/_ .BYTE MDPL ;LENGTH OF DEFAULT PROMPT STRING1` .BYTE M00ddb`TADATADATADATADATADATACPL ;LENGTH OF CONTROL/C PROMPT STRINGDa$$$=.Dbc .IF DF R$$MICd,e .ASCIZ <15><12>/$ / ;MICRO DEFAULT PROMPTfg .IFF ; DF R$$MICTh,i .ASCIZ <15><12>/>/ ;DEFAULT PROMPT STRINGjk .ENDC ; DF R$$MICl mMDPL=.-$$$no$$$=.Spq .IF DF R$$MICr*s .ASCIZ <15><12>/DCL>/ ;CONTROL/C PROMPTtu .IFF ; DF R$$MICNv1w .ASCIZ <15><12>/MCR>/ ;CONTROL/C PROMPT STRING/xy .ENDC ; DF R$$MICz {MCPL=.-$$$|} .EVEN~ .IFF ;A$$CLIR*$NMCLI==0 ;ALTERNATE CLI NOT SUPPORTED .ENDC ;A$$CLI($CMFIN:: ; END OF SYSCM AREA FOR CDA;RC; PARAMETER WORD TO CONTROL TERMINAL DRIVER SYSTEM-WIDE BEHAVIOR: ;UH; BIT 0 = 0 FOR REMOTE LINES, DON'T HANGUP IMMEDIATELY ON CARRIER LOSS<; 1 FOR REMOTE LINES, HANGUP IMMEDIATELY ON CARRIER LOSSC; BIT 1 = 0 FOR REMOTE LINES, DON'T ENABLE DTR UNTIL RING IS SEENT8; 1 FOR REMOTE LINES, ENABLE DTR BEFORE RING IS SEEN;$4$TTPRM::.WORD 2 ;DEFAULT TERMINAL DRIVER BEHAVIOR;T3; TERMINAL DRIVER DATA BUFFER - NOT DUMPED BY CDA; .IF DF K$$DAS&T$$COMR($DALED::.BLKW 1 ;TERMINAL DRIVER DATA .ENDC ;DF K$$DAS&T$$COM .IF DF T$$ACD<$ACDHD::.WORD 0 ;ANCILLARY CONTROLL DRIVER BLOCK LISTHEAD .ENDC ; DF T$$ACD .ENDELY ON CARRIER LOSSC; BIT 1 = 0 FOR REMOTE LINES, DON'T ENABLE DTR UNTIL RING IS SEENT8; 1 FOR REMOTE LINES, ENABLE DTR BEFORE RING IS SEEN;$4$TTPRM::.WORD 2 ;DEFAULT TERMINAL DRIVER BEHAVIOR;T .TITLE LOWCRA .IDENT /2.02/; J; COPYRIGHT (c) 1984, 1985, 1986, 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;0>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;F ; D. N. CUTLER 11-AUG-73 ;P+ ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:; ; ; P. J. BEZEREDI; J. M. LAWLER; B. S. MCCARTHY; R. T. PERRON;N-; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:N;; B. S. MCCARTHY A ; T. LEKAS 0; T. M. MARTIN; J. R. KAUFFMAN ; P. J. BEZEREDI; J. M. LAWLER T;-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:R;F; J. W. BERZLE; B. S. MCCARTHY; C. A. SILVER; L. B. MCCULLEY;H; MODIFIED BY:;.; K. L. NOEL 15-AUG-86 V2.003;P); KLN018 -- ADD KXJ SPECIFIC LOCATIONSY;; K. L. NOEL 08-MAY-87 V2.01;L+; KLN053 -- ADD SUPPORT TICK INCREMENTERN; ; K. L. NOEL 15-JUNE-87 V2.02 ;Y3; KLN054 -- ADD SUPPORT FOR REMOTE TASK KILL I/O.;AK;:L; LOW CORE POINTERS, TRAP VECTORS, AND INTERRUPT VECTORSM;BN; THIS FILE MUST BE FIRST IN THE TASK BUILDER COMMAND FILE SINCE0O; IT OCCUPIES LOCATIONS STARTING AT REAL ZERO.P;CQ; MACRO LIBRARY CALLSDR;ST .MCALL HDRDF$,HWDDF$,PCBDF$"U HDRDF$ ;DEFINE HEADER OFFSETS&V HWDDF$ ;DEFINE HARDWARE REGISTERS/W PCBDF$ ,,SYSDEF ;DEFINE PCB OFFSETS AND SIZETX Y .PSECTNZ[;\; LOCAL MACROS]; ^; GENVT-GENERATE VECTOR ENTRYS_;T`a .MACRO GENVT ARG.b .IF DF E$$NSIc .WORD $NS'ARGd .IFFTe .WORD $NONSITf .ENDC!g .WORD PR7!<<<$$$-START>/4>&17>Nh .ENDMij k .MACRO NSINl .IF DF E$$LOG&E$$NSIIm CALL $NSIERn .IFF.o IOTp .ENDC q .ENDM NSIrsSTART:tu .REPT V$$CTR/4Cv$$$=.Hw GENVT \<<$$$-START>/<4*20>>x .ENDRy z.=START+4E2{ .WORD $TRP04 ;TRAPS TO 4 (ODD,STACK,NONEX MEM)| .WORD PR7 ;.6} .WORD $ILINS ;ILLEGAL (RESERVED) INSTRUCTION TRAPS~ .WORD PR7 ;S+ .WORD $TRACE ;BREAK POINT (TRACE) TRAPS$ .WORD PR7 ;S .WORD $IOTRP ; .WORD PR7 ;.$ .WORD $NONSI ;NONSENSE INTERRUPT .WORD PR7 ;' .WORD $EMTRP ;EMT INSTRUCTION TRAPSS .WORD PR7 ;R( .WORD $TRTRP ;TRAP INSTRUCTION TRAPS .WORD PR7 ; .IF DF C$$CDA* JMP $CRASH ;JUMP TO CRASH DUMP ROUTINE .IFF ; DF C$$CDAD' HALT ;HALT - NO CRASH DUMP SUPPORT( BR .-2 ;DON'T ALLOW CONTINUE, EITHER .ENDC ; DF C$$CDA000dcccccc.DSW:: .WORD .+2 ;ADDRESS OF DIRECTIVE STATUS" .BLKW 1 ;DIRECTIVE STATUS WORD$ .BLKW 1 ;FCS IMPURE AREA POINTER( .BLKW 1 ;FORTRAN IMPURE AREA POINTER8 .BLKW 1 ;OVERLAY RUN TIME SYSTEM IMPURE AREA POINTER# .BLKW 1 ;RESERVED FOR EXPANSIONC .BLKW 12. ;O0 .WORD 0 ;CONSTANTLY CHANGING WORD FOR M9312.. .WORD $ENVEC ;112 - FIXED POINTER TO TABLE& ; OF NECESSARY ENTRY POINTS .BLKB V$$CTR-114 ;B;O; EXECUTIVE STACK AREA;: .ASCII /COPR. (C) DIGITAL 1983/ ;ASCII COPYRIGHT NOTICE .BLKW 49. ;SYSTEM STACKD .IF DF P$$MON5 .BLKW 16. ;DEFINE EXTRA STACK SPACE FOR P-MONITORR .ENDC .IF DF I$$C11 .BLKW 30. ;R .ENDC .IF DF P$$LAS6 .BLKW P.LGTH/2 ;DEFINE EXTRA STACK FOR PLAS SYSTEMS .ENDC .IF DF M$$NET/ .BLKW 10. ;ADD 10. WORDS TO STACK SPACE FOR & ;DECNET TO SUPPORT FDX CHARACTER ;INTERRUPT DEVICES. .ENDC ; DF M$$NET#$UMR4:: .BLKW 1 ;USER'S SAVED R4O#$UMR5:: .BLKW 1 ;USER'S SAVED R5#$UMPC:: .BLKW 1 ;USER'S SAVED PC1#$UMPS:: .BLKW 1 ;USER'S SAVED PSO$STACK:: ;REF LABEL.;C; PROCESSOR IMPURE DATA AREA;C .IF DF M$$PRO($PROC2::.BYTE 0 ;PROCESSOR NUMBER * 2$$PROCN::.BYTE 0 ;PROCESSOR NUMBER .ENDC)$STKDP::.WORD 0 ;STACK DEPTH INDICATORP/$TKTCB::.WORD 0 ;POINTER TO CURRENT TASK TCB9$CURPR::.WORD $PRTAB ;POINTER TO CURRENT TASK PRIORITYR2$SGFFR:: .WORD 0 ;POINTER INTO STACK FOR $SGFIN+$HFMSK::.WORD HF.EIS ;HARDWARE MASK WORD + .WORD H2.BRG ;SECOND HARDWARE MASK WORD:, ;H2.BRG IS SET BECAUSE THE VIRGIN BOOT+ ;OF A PROFESSIONAL 300 SERIES MACHINE+ ;IS CURRENTLY ALWAYS DONE ON A BRIDGE- ;SYSTEM AND INITL DOES NOT SET THIS BITC4$HFEND:: ;REF. LABLE TO DELIMIT HARDWARE FEATURE ;MASK WORDS.>; $RBTAD IS THE ADDRESS OF THE RE-BOOT ENTRY TO THE BOOT ROM .IF DF B$$OOT4$RBTAD::.WORD B$$OOT ;ADDRESS OF REBOOT ROM ENTRY .ENDC ; DF B$$OOT; C; THE FOLLOWING BYTE IS A FLAG SET WHENEVER SUPERVISOR I SPACE ISRJ; MAPPED READ/WRITE, MEANING THE PDR'S MUST BE CLEARED ON CONTEXT SWITCH;*$SIRWF::.BYTE 0 ;SUPER I SPACE R/W FLAG/$CXDBL::.BYTE 0 ;CONTEXT SWITCH DISABLE FLAGE)$SAHDB:: ;BIAS OF CURRENT TASK HEADERU .IF DF X$$HDR  .WORD 08$SAVSP::.WORD $UMR4 ;SAVED SP - ALWAYS POINTS TO UMR4  .IFTF 4 $SAHPT:: ;VIRTUAL ADDRESS OF CURRENT TASK HEADER   .IFT  .WORD 0 .ENDC2$HEADR::.WORD 0 ;POINTER TO CURRENT TASK HEADER .IF DF F$$MAP6$FMAPP::.WORD 0 ;POINTER TO FAST MAP AREA OF HEADER .ENDC ; DF F$$MAP>$RQSCH::.WORD $RQTAB ;POINTER TO CURRENT RESCHEDULE POINTER;SJ; THE FOLLOWING CELLS CONDITIONALLY DESCRIBE THE EXECUTIVE CONFIGURATION&; IF KERNEL DATA SPACE IS SUPPORTED. ;;!"# .IF DF K$$DAS$G%$ROEND::.WORD <<<$EXEND+77>&177700>/100>&1777 ;LENGTH IN 32 WD BLOCKSR$& ;OF R/O SECTION OF EXECUTIVE;'$SCMOF::.WORD 0 ;OFFSET TO DATA SPACE OR 0 IF NOT LOADEDR!( .WORD 3 ;ALLOCATION SIZE MASKP8)$ICAVL::.WORD $ICBEG ;BEGINNING OF ALLOCATED ICB POOL'* .WORD 0 ;DUMMY SIZE FOR FIRST BLOCKB+, .IFF -0.$SCMOF:: ;MAKE SURE SYMBOL IS ALWAYS DEFINED/0 .ENDC123;ID4; UMR ALLOCATION LISTHEAD AND WAIT QUEUE LISTHEAD. THE ALLOCATIONH5; LISTHEAD DOUBLES AS A DESCRIPTOR OF THE UMRS STATICALLY ALLOCATED TO6; THE EXEC AND ANYONE ELSE.O7;89: .IF DF M$$EXT&U$$UMRI;5<$UMRHD::.WORD 0 ;MAPPING ASSIGNMENT BLOCK LISTHEADA.= .WORD UBMPR ;ADDRESS OF FIRST ASSIGNED UMR7> .WORD N$$UMR ;NUMBER OF UMR'S STATICLY ASSIGNED * 4O/?$UMRWT::.WORD 0,.-2 ;UMR WAIT QUEUE LISTHEAD@A .ENDC ; DF M$$EXT&U$$UMRLBCD;F+E; DATA STRUCTURES FOR EXECUTIVE IDLE CODEOF;NG+H$IDLCT::.BYTE 0 ;IDLE PATTERN COUNT BYTEN*I$IDLFL::.BYTE 0 ;IDLE PATTERN FLAG BYTE(J00ddb`TADATADATADATADATADATA$IDLPT::.WORD 7760 ;IDLE PATTERN WORD-K .WORD 0 ;WORKING STORAGE FOR IDLE PATTERN$LM;MN; SYSTEM POWER FAIL STACKAO; PQR .IF DF P$$RFLSTU .IF DF M$$PROV;W$PWKA0::.BLKW M$$PRO ;;;STORAGE FOR KINAR0 IN CPA'S AREAY-X$PWCSR::.WORD FKCSR ;;;POINTER TO IIST CSRT3YFKCSR: .WORD 0 ;;;CPA CSR (WHEN NO IIST PRESENT)Z[ .ENDC\]%^$PWBTM::.BLKW 7 ;R0 THRU R5 AND SPN_`a .IF DF M$$EXTb)c .BLKW 31.*2 ;UNIBUS MAPPING REGISTERSDde .ENDCfg/h .BLKW 25. ;MEMORY MANAGEMENT REGS & USER SPDijk .IF DF F$$LPPl'm .BLKW 27. ;FLOATING POINT REGISTERS no .ENDCpqr .IF DF K$$DASs"t .BLKW 8. ;KERNEL D SPACE APR'Suv .ENDCwxy .IF DF S$$LIBz*{ .BLKW 16. ;SUPER I SPACE PARS AND PDRS*| .BLKW 16. ;SUPER D SPACE PARS AND PDRS} .BLKW 1 ;SUPER SP~ .ENDC .IF DF U$$DAS% .BLKW 16. ;USER D SPACE REGISTERST .ENDC ; DF U$$DAS$PWSTK==.-2 ;REF LABEL1$POWSP:: .BLKW 1 ;SAVED SP FOR POWERFAIL STACK .ENDC;$; FLOATING POINT SUPPORT WORK AREA; .IF DF F$$LPP)$FLSTS::.BLKW 2 ;FLOATING POINT STATUSS>$FLFRK::.WORD $FLFTB ;POINTER FOR FLOATING POINT FORK BLOCK9$FLTCB::.BLKW 1 ;ADDRESS OF TCB CAUSING EXCEPTION TRAP  .ENDC;R;; SAVE AREA FOR ERROR LOGGING NONSENSE INTERRUPT HANDLING.;E .IF DF E$$LOG&E$$NSI.$$VID:: .BLKB 1 ;VECTOR ID STORAGE%$NSI:: .BYTE -1 ;RECURSION COUNTERV!$OPS:: .BLKW 1 ;OLD PS STORAGE!$OPC:: .BLKW 1 ;OLD PC STORAGEG;$ERLFK::.WORD $PBEZ ;POINTER TO ERROR LOGGING FORK BLOCK .ENDC ; DF E$$LOG&E$$NSIA;F&; DATA STRUCTURES FOR PARITY SUPPORT;N; EXEC PARITY ERROR MESSAGE ;R .IF DF P$$RTY  .NLIST BEXNE$EXMSG::.ASCIZ <15><12>/***EXEC PARITY ERROR STOP***/<15><12><12> ;N  .LIST BEX .EVEN;G%; INTERRUPT RECURSION LEVEL COUNTERC;D$PARLV::.WORD -1 ; ;O0; PARITY CONTROL STATUS REGISTER ADDRESS TABLE;:; ******* NOTE WELL ! *******:; F; THE FOLLOWING TABLES ARE REFERENCED IN INITL AND PARTY, AS WELL ASG; BY SAVE AND HRC. THE ADJACENCY OF THE ITEMS STARTING AT $PARTB ANDXC; INCLUDING $MEMR1, $MPCSR, AND $CPUER IS NOT ONLY ASSUMED, IT ISSD; CRUCIAL AND MUST BE PRESERVED. NOTE ALSO THAT ANY CHANGE IN THEJ; STRUCTURE OF $PARTB SHOULD PROBABLY BE REFLECTED IN $MKCSR AND $MKCS2,; BOTH FOUND IN SYSCM.$CSRTB:: ;REFERENCE LABELYG$MEMRG::.BYTE 16.,<172100&177400>/400,172100&377 ;MEMORY PARITY CSR'S @ .BYTE 6. ,<177740&177400>/400,177740&377 ;CACHE CONTROL CSR'S? .BYTE 1. ,<177766&177400>/400,177766&377 ;CPU ERROR REGISTERI .BYTE 0 ;END OF TABLEX4 .BLKW 1 ;DUMMY STORAGE FOR MEMORY ERROR REGISTER .IFTF ; DF P$$RTY7$PARTB::.WORD 1 ;DUMMY CSR FOR NONEXISTANT REGISTERS  .IFT ; DF P$$RTYD; G; TABLE OF CSR ADDRESSES. IF THE CSR DOES NOT EXIST, THE ENTRY POINTSBG; TO $PARTB ABOVE. THIS MUST BE THE CASE SO THAT CODE REFERENCING THE7G; CSRS PRIOR TO THE CSR SCAN (SUCH AS THE LOCK$ $EXECL IN INITL) WILLE,; ACCESS A DUMMY LOCATION, NOT LOCATION 0.;7%$MEMR1:: ;MEMORY PARITY CSR TABLEE  .REPT 16.$ .WORD $PARTB ;POINT TO DUMMY CSR .ENDR+$MPCSR:: ;VECTOR OF CACHE CSR ADDRESSESR  .REPT 6.;$ .WORD $PARTB ;POINT TO DUMMY CSR .ENDR .IFTF ; DF P$$RTY $CPUER:: ;CPU ERROR REGISTER$ .WORD $PARTB ;POINT TO DUMMY CSR .IFT ; DF P$$RTYU; '; PDP-11/70 CACHE PARITY STATUS TABLER;H .IF DF P$$D70*$MSTAT::.BLKW 2 ;FIRST TWO PARITY CSR'S*$STAT:: .BLKW 1 ;MEMORY STATUS REGISTER$ .BLKW 3 ;LAST THREE PARITY CSR'S-$ERTRK::.BYTE 44,120 ;ADDRESS/DATA GROUP 0 .WORD 0 ;TIME OF LAST ERRORA& .BYTE 30,240 ;ADDRESS/DATA GROUP 1 .WORD 0 ;TIME OF LAST ERROR .WORD 0 ;END OF TABLE$;! ; NEW CACHE PARITY CSR CONTENTS ;D  $MPCTL::.WOR00dccccccD 1 ;  .ENDC .IFF ; DF P$$RTY$CSRTB:: ;REFERENCE LABELU .ENDC ; DF P$$RTY1; DATA AREA FOR DYNAMIC EXEC DEBUGGER INTERFACER .IF DF D$$DXD($DXDK5::.WORD 0 ;SAVED KINAR5 FOR DXD+$DXDRL::.WORD 0 ;RELOCATION BIAS FOR DXDS&$DXDEP::.WORD 0 ;ENTRY POINT TO DXD !" .ENDC ; D$$DXD;#$;A"%; DATA AREA FOR BUGCHECK SUPPORT&;O'!($BCFAC::.WORD 0 ;FACILITY CODE)$BCERR::.WORD 0 ;ERROR CODE*+;D%,; DATA AREA FOR SYSTEM CRASH MODULEC-;./0 .IF DF C$$CDA142$CRBAE::.WORD 0 ;DEFINE EXISTENCE OF BAE REGISTER374 .IIF EQ C$$CDA-12 CDA$MS=0 ;MS RESIDENT CRASH DRIVERR45 .IIF EQ C$$CDA CDA$MS=0 ;LOADABLE CRASH DRIVERS687 .IF DF CDA$MS ;MS RESIDENT OR LOADABLE CRASH DRIVER89.:$MSCR1:: ;COMMAND BUFFER FOR MS CRASH DUMP4; .BLKW 5 ;NEED FOUR WORDS ON DOUBLE WORD BOUNDARY"<$MSCR2:: ;CHARACTERISTICS DATA.= .WORD $MSCR3 ;LOW ORDER 16 BITS OF MESSAGE> ;BUFFER ADDRESSE? .WORD 0 ;HIGH ORDER 2 BITS)@ .WORD 14. ;SIZE OF THE MESSAGE BUFFERWA .WORD 0 ;FLAG WORDB"C$MSCR3::.BLKW 7 ;MESSAGE BUFFERDE .ENDC ;DF CDA$MSCFGH .IIF EQ C$$CDA-16 CDA$DU=0SI .IIF EQ C$$CDA-17 CDA$MU=0JK .IF DF CDA$DU!CDA$MU!H$$GENLM;R"N; CRASH DATA BASE FOR DU DEVICESO; P; *** NOTE WELL ***P?Q; ANY CHANGES TO THIS DATABASE MUST ALSO BE MADE IN CRASH.MAC:R S; COMMAND AND RESPONSE PACKETSTU .WORD 60 ;PACKET LENGTHE3V .WORD 1 ;VIRTUAL CIRCUIT AND CREDIT/DEBIT FIELDI'WCMDPKT: .WORD 1 ;COMMAND PACKET AREAFX .BLKW 23. ; Y .BLKW 2 ;ENVELOPE3*ZRSPPKT: .BLKW 24. ;RESPONSE PACKET AREA [ .BLKW 2 ;\]; COMMAND RINGSC^_RINGS:*`RSP: .WORD RSPPKT ;RESPONSE PACKET RING/a .WORD 100000 ; PACKET "OWNED" BY CONTROLLER )bCMD: .WORD CMDPKT ;COMMAND PACKET RINGP/c .WORD 100000 ; PACKET "OWNED" BY CONTROLLERAde; INITIALIZATION TABLEf g$MUCSH::4h$DUCSH::.WORD CMDPKT, RSPPKT ;ADDRESSES OF PACKETS%i .WORD 100000, RINGS ;STEPS 1 AND 2Lj .WORD 0, 1 ;STEPS 3 AND 4 'k .WORD RSP ;ADDRESS OF RESPONSE RING2lm .ENDCnop .IFF ; DF C$$CDAEq/r$BCPC:: .WORD 0 ;BUGCHECK PC FOR TYPE DIRECTst .IFT ; DF C$$CDADu*v$BCPC:: ;ALTERNATE LABEL FOR CRASH PCw*x$CRUPC::.WORD 0 ;USER PC IS STORED HERE*y$CRUST::.WORD 0 ;USER PS IS STORED HEREz { .NLIST BEX C|$CRMS0::.ASCII <15><12><12>/CRASH -- CONT WITH SCRATCH MEDIA ON /H}~$CRDEV:: ;REFERENCE SYMBOLF.IIF EQ C$$CDA-1, .ASCII /DT/P.IIF EQ C$$CDA-2, .ASCII /DK/ .IIF EQ C$$CDA-3, .ASCII /MT/O.IIF EQ C$$CDA-4, .ASCII /MM/.IIF EQ C$$CDA-5, .ASCII /DB/.IIF EQ C$$CDA-6, .ASCII /DM/ .IIF EQ C$$CDA-7, .ASCII /DL/$ .IIF EQ C$$CDA-10, .ASCII /DD/ .IIF EQ C$$CDA-11, .ASCII /DR/ .IIF EQ C$$CDA-12, .ASCII /MS//.IIF EQ C$$CDA-13, .ASCII /DX/ ;NOT SUPPORTED/.IIF EQ C$$CDA-14, .ASCII /DY/ ;NOT SUPPORTED /.IIF EQ C$$CDA-15, .ASCII /MF/ ;NOT SUPPORTED .IIF EQ C$$CDA-16, .ASCII /DU/.IIF EQ C$$CDA-17 .ASCII /MU/ @.IIF EQ <.-$CRDEV> .ASCII /XX/ ;ALWAYS ALLOW FOR A DEVICE NAME$CRUNT::.BYTE <60+C$$RUN>$ .ASCIZ <15><12><12> .IF DF M$$PROE$CRMS1::.ASCIZ <15><12>/CRASH -- WAITING FOR PROCESSORS TO QUIESCE/G$CRMS2::.ASCIZ <15><12>/CRASH -- PROCESSOR REGISTERS HAVE BEEN SAVED/EH$CRMS4::.ASCIZ <15><12>/CRASH -- SANITY TIMER EXPIRED ON PROCESSOR CP/C$CRMS5::.ASCIZ <15><12>/CRASH -- CRASH REQUESTED BY PROCESSOR CP/$CRCPU::.ASCIZ /?/ .ENDCB$CRMS3::.ASCIZ <15><12>\CRASH -- I/O ERROR ON CRASH DUMP DEVICE\8$CRMS6::.ASCIZ <15><12>/CRASH -- ILLEGAL CRASH DEVICE/;$CRMS7::.ASCIZ <15><12>/CRASH -- CRASH DRIVER NOT LOADED/1?; ALL THE SECTIONS OF THE BUGCHECK MESSAGE MUST BE CONTIGUOUSM7$BCMSG::.ASCIZ <15><12>/SYSTEM FAULT DETECTED AT PC=/V .ASCIZ / FACILITY=/5 .ASCIZ / ERROR CODE=/ .ASCIZ <15><12><12>( .BLKB 6 ;BUFFER FOR OCTAL CONVERSION&$BCBUF::.BYTE 0 ;OF VALUES IN CRASH  .LIST BEX00ddb`TADATADATADATADATADATA .ENDC ; DF C$$CDA .IF DF A$$CNT,$BILNG::.BYTE 1 ;BILLING IS INITIALLY OFF .IFFG $BILNG:: .ENDC .IF DF S$$LIB*$SUPFL::.BYTE 0 ;SUPERVISOR WINDOW FLAG .ENDC ; DF S$$LIB .EVEN* ; *** THE FOLLOWING MUST BE ADJACENT .IF DF C$$CDA, .BLKW 6 ;STACK AREA FOR SUBROUTINE CALLS4$CRSBF::.BLKW 177. ;CRASH STACK IS THIS SIZE (NOT$ ;169.+4 AS PREVIOUSLY THOUGHT)! ;(SEE CRASH.MAC FOR FORMAT)#$CRSST==.-2 ;TOP OF CRASH STACK" ; *** ABOVE MUST BE ADJACENT1 .IF EQ, C$$CDA ;LOADABLE CRASH DRIVER SUPPORTB% PBNH = 0 ;STARTING DEVICE ADDRESS  PBNL = 0 ;UNKNOWNB .IFTF2$CRSBN::.WORD PBNH,PBNL ;STARTING DEVICE ADDRESS5$CRSCS::.WORD PBNH+PBNL ;CHECKSUM OF DEVICE ADDRESS8$CRDMP::.BYTE 0 ;FLAG INDICATING REGS HAVE BEEN SAVED$ .BYTE 0 ;PRESERVE WORD ALIGNMENT $CRPAR:: .IFT ; EQ, C$$CDA) .WORD 0 ;P.REL OF LOADED CRASH DRIVERO .ENDC ; EQ, C$$CDAP .ENDC ; DF C$$CDA .IF DF A$$CNT;$STRTM::.BLKW 2 ;ABSOLUTE TIME OF CONTEXT SWITCH TO TASKT .IFF  $STRTM:: .ENDCH; HERE WE DEFINE A SINGLE "FAKE WORD" WHICH RECEIVES ALL THE ADDRESSESF; FOR THINGS WHICH ARE NOT GENNED INTO THE SYSTEM, BUT WHICH REQUIRED; THAT THE ADDRESSES ALWAYS BE RESOLVED FOR TASKBUILDING MCR, ETC.D; THIS ONE (IN LOWCR) IS TO BE USED FOR I SPACE REFERENCES AND CPUE; SPECIFIC INFO (ALSO THINGS WHICH MUST BE ACCESSED WHEN D SPACE ISC; TURNED OFF), AND THE ONE IN SYSCM IS USED FOR D SPACE LOCATIONSM .IF NDF R$$WPTT $WPBR::F  FAKE = 0: .ENDC ; NDF R$$WPT .IF NDF P$$RTY   $PARLV::   FAKE = 0E  .ENDC ; NDF P$$RTYW .IF NDF D$$DXDE $DXDEP:: $DXDK5:: $DXDRL::  FAKE = 0  .ENDC ; NDF D$$DXDG .IF DF FAKE/ .WORD -1 ;FAKE DATA LOCATION FOR ALL OF THEA  ;ABOVE  .ENDC ; DF FAKE!"#;+/$; **-$NS0,$NS1,$NS2,$NS3,$NS4,$NS5,$NS6,$NS7-T*%; NONSENSE INTERRUPT IDENTIFIER ROUTINES&;A'; EACH OF THESE ROUTINES IS VECTORED TO BY ONE OF A GROUP OF 16CI(; UNUSED VECTORS. THE VECTORS ARE SUB-CODED IN THE PS CONDITION CODES.E);-*+, .IF DF M$$PRO-.;.C/; IN A MULTIPROCESSING SYSTEM, SOME STACK SPACE IS NECESSARY WHEN A0; THE CPU IS INTERRUPTED. THE M9312MP BOOTSTRAP SETS R6 TO THE :1; VALUE POINTED TO BY PHYSICAL ZERO. THIS IS THAT AREA.2;;3#4 .BLKW 20. ;STACK SPACE FOR IIST$56 .ENDC78%9$NS0:: NSI ;;;CALL COMMON ROUTINEF: .WORD 0 ;;;GROUP 0-17H;$NS1:: NSI ;;;< .WORD 20 ;;;GROUP 20-37U=$NS2:: NSI ;;;> .WORD 40 ;;;GROUP 40-57B?$NS3:: NSI ;;;@ .WORD 60 ;;;GROUP 60-77A$NS4:: NSI ;;;B .WORD 100 ;;;GROUP 100-117C$NS5:: NSI ;;;D .WORD 120 ;;;GROUP 120-137E$NS6:: NSI ;;;F .WORD 140 ;;;GROUP 140-157G$NS7:: NSI ;;;H .WORD 160 ;;;GROUP 160-177IJ;T0K; INDIRECT POINTERS INTO MULTIPROCESSOR TABLESL;MNO .IF DF M$$PROP8Q$TKPTR::.WORD $TKTAB ;POINTER INTO CURRECT TASK TABLE6R$MPSWT::.WORD $MPTAB ;POINTER INTO CPU STATUS TABLE3S$CPURM::.WORD $URMTB ;POINTER INTO CPU URM TABLE:?T$CPCRM::.WORD $CRMTB ;POINTER INTO COMPLEMENTED RUN MASK TBL.4U$TTUQP::.WORD $TTUQ ;TTDRV MULTIPROCESSOR POINTERVW;;&X; MULTIPROCESSOR LOCAL MEMORY WORDS.Y;1Z2[$CPBIT::.WORD 1 ;PROCESSOR BIT FOR USE IN MASKS2\$FRKCT::.WORD 0 ;NUMBER OF FORK BLOCKS DEQUEUED]^ .ENDC^; ; KLN018+^; KXJ11 SPECIFIC LOCATIONS ; KLN018B^; ; KLN018 .^ .IF DF C$$KXJ ; KXJ SUPPORTED? ; KLN018^ ; KLN018C^$KXVC1::.BLKW 1 ; KXJ VECTOR 1 - DRIVER COMMUNICATION ; KLN018CD^$CSFSV::.BLKW 1 ; SAVED KXJ CSR F - FULLY SHARED MEMORY ; KLN018A^$CSHSV::.BLKW 1 ; SAVED KXJ CSR H - " " " ; KLN018M=^$KXPTR::.BLKW 1 ; POINTER TO KXJ DRIVER'S DCB ; KLN018S6^$KXBAS::.BLKW 1 ; BASE ADDRESS OF KXDRV 00ddccccc; KLN018^ ; KLN018^ .IFF ; KLN018 ^ ; KLN018^$KXVC1:: ; KLN018 ^$CSFSV:: ; KLN018J^$CSHSV:: ; KLN0188^$KXPTR:: ; KLN018V^$KXBAS:: ; KLN018 ^ ; KLN018"^ .ENDC ; C$$KXJ ; KLN018^; ; KLN018A2^; REMOTE SYSTEM SPECIFIC LOCATIONS ; KLN018^; ; KLN018 ,^ .IF DF C$$RMT ; REMOTE HOST ; KLN018^ ; KLN0189^$XXLOW::.BLKW 1 ; FIRST GENERIC DCB ADDRESS ; KLN018L8^$XXHGH::.BLKW 1 ; LAST GENERIC DCB ADDRESS ; KLN0184^ ; USED TO IDENTIFY A GENERIC DEVICE ; KLN018^ ; KLN018^ .IFF ; KLN018^ ; KLN018^$XXLOW:: ; KLN018 ^$XXHGH:: ; KLN018 ^ ; KLN018 ^ .ENDC ; C$$RMT ; KLN018^ ; KLN018^; ; KLN053O9^; ADDRESS TO INCREMENT ON EVERY CLOCK TICK ; KLN053 @^; THIS IS EITHER 110 OR ON KXJ REMOTE SYSTEMS TPR5 ; KLN053^; ; KLN053A4^$CKINC::.WORD 110 ; INITIALIZE TO 110 ; KLN053^; ; KLN0540^; REMOTE TASK SPECIFIC LOCATIONS ; KLN054^; ; KLN05483^ .IF DF C$$RTK ; REMOTE TASK SUPPORT ; KLN054X^ ; KLN054C^$CPPKT:: .WORD 0 ; PRE-ALLOCATED CPRBUF PACKET ADDRESS ; KLN054$?^$CPLUN:: .WORD 0 ; LUN NUMBER FOR REMOTE I/O KILLS ; KLN054^ ; KLN054^ .IFF ; KLN054^ ; KLN054^$CPPKT:: ; KLN054 ^$CPLUN:: ; KLN054 ^ ; KLN054 ^ .ENDC ; C$$RTK ; KLN054_`a .END^; ; KLN0540^; REMOTE TASK SPECIFIC LOCATIONS ; KLN054^; ; KLN05483^ .IF DF C$$RTK ; REMOTE TASK SUPPORT ; KLN054X^ ; KLN054C^$CPPKT:: .WORD 0 ; PRE-ALLOCATED CPRBUF PACKET ADDRESS ; KLN054$?^$CPLUN:: .WORD 0 ; LUN NUMBER FOR REMOTE I/O KILLS ; KLN054^ ; KLN054^ .IFF ; KLN054^ ; KLN054^$CPPKT:: ; KLN054 ^$CPLUN:: ; KLN054 ^ ; KLN054 ^ .ENDC .TITLE INICRA .IDENT /1.08/;R; J. WEHNER 06-MAY-83;0&; LOADABLE CRASH INITIALIZATION MODULE;R; MODIFIED BY:;E; J. G. WEHNER 26-MAY-83 1.01 ; -; JGW024 - CLEAR $CRUNT AND $CRCSR ON UNLOAD$;O; J. W. BERZLE 08-JUN-83 1.02A;I8; JWB026 - ADD WORD TO JUMP INDIRECT THROUGH FROM CRASH; ; J. W. BERZLE 29-JUN-83 1.03 ;94; JWB032 - CLEAR $CRPAR WHEN UNLOADING CRASH DRIVER; ; J. W. BERZLE 05-JUL-83 1.04B;A ; JWB034 - CHANGE TRANSFER WORD;; G. N. LARSEN 22-OCT-84 1.05.;L; GL003 - ADD EXEC VECTORING;.; P. K. M. WEISS 19-DEC-84 1.06E;A; PKW082 - FIX EXEC VECTORING;I; J. W. BERZLE 03-JAN-85 1.07-;-0; JWB123 - MAKE CODE PIC, REMOVE $CRSFM, KISDR6;U; J. W. BERZLE 21-JUN-85 1.08U;3; JWB156 -- VECTOR $CRALT O;T;***********************;HF; THE FOLLOWING IS A TRANSFER WORD WHICH MUST BE THE FIRST LOCATION OFI; THIS MODULE. WHEN A CRASH OCCURS, A JUMP IS MADE INDIRECT THROUGH THIS 5; LOCATION TO BYPASS THE EXP INITIALIZATION ROUTINES..;L .WORD TRNSFR E;*********************** .MCALL DIR$,GIN$E;A; EXEC ENTRY VECTOR TABLEO;GEXEVEC:. .WORD 0BCBUF:: .WORD $BCBUFCRALT:: .WORD $CRALTCRBAE:: .WORD $CRBAECRCSR:: .WORD $CRCSRCRDEV:: .WORD $CRDEVCRDV1:: .WORD $CRDEVCRKRB:: .WORD $CRKRBCRMS0:: .WORD $CRMS0CRMS3:: .WORD $CRMS3CRMS6:: .WORD $CRMS6CRPAR:: .WORD $CRPARCRSBN:: .WORD $CRSBNCRSB2:: .WORD $CRSBNCRSCS:: .WORD $CRSCSCRSUN:: .WORD $CRSUNCRUNT:: .WORD $CRUNTHFMSK:: .WORD $HFMSKKISA5:: .WORD KISAR5KISA6:: .WORD KISAR6MSCR1:: .WORD $MSCR1MSCR2:: .WORD $MSCR2MSCR3:: .WORD $MSCR3UISA6:: .WORD UISAR6EXEVCL=<<.-EXEVEC>/2>B>TRNVEC: GIN$ GI.VEC,EXEVEC,EXEVCL ; TRANSLATE EXECUTIVE VECTOR;R; INITIALIZE CRASH DATA BASE R;C$XPLOA:: MOV PC,R0 ; MAKE CODE PIC* ADD #TRNVEC-.,R0 ; RELOCATED ADDR OF DPB MOV PC,R1  ADD #EXEVEC-.,R1:, MOV R1,4(R0) ; RELOCATE EXEVEC ADDR IN DPB' DIR$ R0 ; TRANSLATE EXECUTIVE VECTOR: BCC 5$C BPT5$: # ADD #2,CRSB2 00ddb`TADATADATADATADATADATA ; MAKE THIS $CRSBN+2I! INC CRDV1 ; MAKE THIS $CRDEV+1M& CALL $SWSTK,10$ ; GO TO SYSTEM STATE( MOV PC,R0 ;; CALCULATE RETURN ADDRESS ADD #10$-.,R0% MOV R0,16(SP) ;; SET RETURN ADDRESSR7 MOV @UISA6,@CRPAR ;; STORE THE PARTITION LOAD ADDRESSA+ MOV #PBNH,@CRSBN ;; STARTING BLOCK NUMBERE MOV #PBNL,@CRSB2.# MOV #PBNH,@CRSCS ;; SBN CHECK SUM, ADD #PBNL,@CRSCSC%10$: RETURN ;; BACK TO USER STATEA;N.; CLR DATA BASE BEFORE UNLOADING THE PARTITION;C$XPUNL::& CALL $SWSTK,10$ ; GO TO SYSTEM STATE( MOV PC,R0 ;; CALCULATE RETURN ADDRESS ADD #10$-.,R0% MOV R0,16(SP) ;; SET RETURN ADDRESS ' CLRB @CRDEV ;; CLEAR THE DEVICE NAME CLRB @CRDV1- CLR @CRSUN ;; CLEAR THE DEVICE UNIT NUMBER;/ CLRB @CRUNT ;; CLEAR THE ASCII DEVICE NUMBERR% CLR @CRCSR ;; CLEAR THE DEVICE CSRB$ CLR @CRSCS ;; CLEAR THE CHECK SUM( CLR @CRPAR ;; CLEAR PARTITION ADDRESS CLR @CRKRB ;; CLEAR THE KRB$10$: RETURN ;; BACK TO USER STATETRNSFR:I .END$XPUNL::& CALL $SWSTK,10$ ;  .TITLE DRGINM .IDENT /05.02/ .;77; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION,; ALL RIGHTS RESERVED.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; MODIFIED BY: ;; ; J. KAUFFMAN 5-FEB-86 04.01 ; < ; JRK322 -- INCLUDE SECONDARY ABORT CODE FOR ^C ABORT AST ;. ; J. KAUFFMAN 11-JUN-86 04.02D ;) ; JRK331 -- ADD T3.CLI CHECK TO $SFABOS ; - ; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:0 ;$ ; ERIC POSTPISCHIL 12-DEC-86 05.00< ; edp040 -- ADD SON OF GET DEVICE INFORMATION SUBFUNCTION ; TO GIN DIRECTIVE.R ;D# ; ERIC POSTPISCHIL 6-JAN-87 05.01 A ; edp046 -- USE PROPER REGISTER AFTER REDIRECTION IS FOLLOWED. ;O ; K. L. NOEL 13-JAN-87 05.02 > ; KLN033 -- ADD REMOTE SUPPORT FOR GET ASSIGNED DEVICE NAME ; 9;O:;T;<=;.>; LOCAL DATA?;4:@ GBLMSK = 7 ;SEARCH INHIBIT MASK TO ONLY SYSTEM LOGICALS9A USRMSK = 15 ;SEARCH INHIBIT MASK TO ONLY USER LOGICALS )B MAP6 = 140000 ;OFFSET TO START OF APR64CC .PAGE ; BM385C; ; BM3857C; DEFINE SUBFUNCTION DISPATCH TABLE ENTRY ; BM385JC; ; BM3854C; SFDIR FLAGS,DPBSIZ,BUFSIZ,ADDR,COND ; BM385C; ; BM385C; WHERE: ; BM385C; ; BM385KC; FLAGS= SF.IN SET IF THE SUBFUNCTION RETURNS SYSTEM INFORMATION. ; BM385A7C; SF.PRV IF THE SUBFUNCTION IS PRIVILEGED. ; BM385S;C; (BITS 15-13 IN THE FIRST WORD OF THE ENTRY). ; BM385S*C; DPBSIZ=DPB SIZE IN WORDS. ; BM385:C; (BITS 12-8 IN THE FIRST WORD OF THE ENTRY). ; BM385BC; BUFSIZ=SIZE OF THE MINIMUM BUFFER REQUIRED IN WORDS. ; BM3859C; (BITS 7-0 IN THE FIRST WORD OF THE ENTRY). ; BM385 >C; ADDR=ADDRESS OF ROUTINE TO PERFORM THE FUNCTION. ; BM385,C; (SECOND WORD OF THE ENTRY). ; BM385DC; COND=EXPRESSION ON WHICH DIRECTIVE IS CONDITIONALIZED. ; BM385>C; DEFAULT OF $SFTBL IS USED FOR CONVENIENCE (I.E. ; BM385"C; UNCONDITIONAL). ; BM385C; ; BM385C ; BM3855>C .MACRO SFDIR FLAGS,DPBSIZ,BUFSIZ,ADDR,COND=$SFTBL ; BM385C ; BM385MC ; BM385DC .IF DF COND ; BM385SC ; BM385D1C .WORD FLAGS!! ; BM385TC .WORD ADDR ; BM385C ; BM385DC .IFF ; BM385;C ; BM385EC .WORD 0 ; BM385 C .WORD 0 ; BM385C ; BM385LC .ENDC ; BM385C ; BM385UC ; BM385;C .ENDM ; BM385C ; BM3858C .PAGE ; BM385C ; BM385NC;+ ; BM385 NC; SUBFUNCTION DISPATCH TABLE FOR THE GET/SET INFORMATION DIRECTIVE. ; BM385C;- ; BM385FC ; BM385UC ; BM385PC$SFTBL::SFDIR SF.PRV!SF.IN, 8., 6.,$SFGAS ;000.-GET ASSIGNMENT INFO ; BM385HC SFDIR SF.IN, 4., 5.,$SFUIC ;001.-GET SYSUIC, LIBUIC, ; BM385@C SFDIR 0, 3., 0.,$SFDEF ;002.-SET DEFAULT UIC ; B00ddcccccM385KC SFDIR SF.IN, 4., 9.,$SFFMK ;003.-GET FEATURE MASK WORDS ; BM385AGC SFDIR 0, 4., 2.,$SFQMC ;004.-QUEUE MCR COMMAND LINE ; BM385F8C SFDIR 0, 6., ,$SFUAB,A$$CNT ; BM385-C ;005.-GET USER ACCOUNT BLK ; BM385 KC SFDIR SF.IN, 6., 1.,$SFDEV ;006.-GET DEVICE INFORMATION ; BM385 CC SFDIR 0, 3., 0.,$SFSPR ;007.-SET TASK PRIVILEGE ; BM385FAC SFDIR 0, 4., 0.,$SFREN ;008.-CHANGE TASK NAME ; BM385$CC SFDIR SF.IN, 4.,97.,$SFAPR ;009.-READ ALL APRS ; BM385$KC SFDIR SF.IN, 6., 2.,$SFFTK ;010.-FIND AND GET TASK INFO ; BM385MBC SFDIR 0, 10.,0,$SFPMN ;011.-SET PMON PARMS ; BM385@C SFDIR 0, 4., 1.,$SFCFG ;012.-GET CONFIG. TAB ; BM385@C SFDIR 0, 4., 3.,$SFSSN ;013.-GET SYS. SERIAL ; BM385@C SFDIR 0, 4., 2.,$SFABO ;014.-ABORT ALL TASKS ; BM385FC SFDIR SF.IN, 4., 2.,$SFVEC ;015.-TRANSLATE VECTOR ; BM385KC SFDIR 0, 0., 0., 0,NEVER ;016.-GET MASS STORAGE (P/OS); BM385 AC SFDIR SF.IN, 4., 5.,$SFUPD ;017.-UPDATE UICS ; BM385NFC SFDIR SF.IN, 6., 1.,$SFDEV ;018.-SON OF GET DEVICE ;edp040%C ; INFORMATION ;edp040 &C$SFHI==<.-$SFTBL/4-1> ; BM385C ; BM3850D;++E; **-$DRGIN-GENERAL INFORMATION DIRECTIVE3F;BG; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO PERFORM THE SUBFUNCTIONH; INDICATED IN THE DPB.S?I; THE FUNCTIONS CAN EITHER SET PARAMETERS OR GET INFORMATION. J;0DK;*****************************************************************L;$8M; CAUTION! THIS DIRECTIVE IS INTENDED FOR USE ONLY BY3N; DEC SOFTWARE. THERE IS NO GUARANTEE THAT THIS1O; DIRECTIVE WILL BE IN FUTURE RELEASES OR THATS%P; THE FORMAT WILL REMAIN THE SAME. Q;0DR;*****************************************************************S;IT; DPB FORMAT:SU; +V; WD. 00 -- DIC(169.),DPB SIZE(VARIABLE).T*W; WD. 01 -- SUBFUNCTION CODE (LOW BYTE).+X; WD. 02 -- PARAMETER 1 (BUFFER ADDRESS).*1Y; WD. 03 -- PARAMETER 2 (BUFFER SIZE IN WORDS).*6Z; WD. N -- PARAMETER N (MAX DPB SIZE IS 32. WORDS).[;U \; INPUTS:];C5^; R2=ADDRESS OF SECOND STATUS WORD OF CURRENT TASK.C#_; R3=POINTER TO WD. 1 IN THE DPB.A1`; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK..a; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.b;*7c; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) d;6/e; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.O(f; DIRECTIVE STATUS OF +1 IS RETURNED.!g; C=1 IF DIRECTIVE IS REJECTED.-9h; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF THE TASKE/i; HAS SPECIFIED AN INVALID SUBFUNCTION CODEU!j; OR THE DPB SIZE IS INVALID.D9k; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE USERT"l; BUFFER FAILS ADDRESS CHECKS.4m; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE7n; SUBFUNCTION REQUIRES PRIVILEGE AND THE REQUESTINGAo; TASK IS NOT PRIVILEGED.p;=?q; NOTE: IF A USER BUFFER IS SPECIFIED, THE SERVICE ROUTINE IS ;r; ENTERED WITH R3 POINTING TO THE BUFFER AND R4 POINTINGDs; TO WORD 4 OF THE DPB.t;T;u; IF NO USER BUFFER IS SPECIFIED, THE SERVICE ROUTINE ISN3v; ENTERED WITH R3 POINTING TO WORD 2 OF THE DPB.Cw;Sx;-yz{{ .IF DF D$$PAR ; BM385U{ ; BM385E{$DRGN1:: ; BM385{ ; BM385E!{ .IFF ; DF D$$PAR ; BM385S{ ; BM385Q{$DRGIN:: ; BM385{ ; BM385"{ .ENDC ; DF D$$PAR ; BM385{ ; BM385E0{ MOV (R3)+,R4 ;GET SUBFUNCTION CODE ; BM385-} CMP R4,#$SFHI ;CODE WITHIN RANGE? ;**-1~ BHI 90$ ;IF HI NOF0 ASH #2,R4 ;CONVERT CODE TO DOUBLE WORD INDEX. ADD #$SFTBL,R4 ;POINT TO PROPER TABLE ENTRY2 MOV (R4)+,R1 ;GET FLAGS AND MINIMUM BUFFER SIZE& BEQ 90$ ;IF EQ INVALID SUBFUNCTION .IF DF R$$PRO .IFF ;R$$PRO + BPL 10$ ;IF PL NO PRIVILEGE IS REQUIRED2 BIT #T3.PRV,T.ST3(R5) ;CURRENT TASK PRIVILEGED?* BEQ 80$ ;IF EQ NO, PRIVILEGE VIOLATION .IFTF ;R$$PRO 10$: MOV R1,R2 ;COPY DPB SIZE SWAB 00ddb`TADATADATADATADATADATAR2 ;MOVE IT TO LOW BYTE( BIC #^C<37>,R2 ;CLEAR IRRELEVANT BITS& CMPB R2,$DICSV+1 ;CORRECT DPB SIZE? BNE 90$ ;IF NE NOR. MOV (R4),-(SP) ;GET SERVICE ROUTINE ADDRESS# BIC #177400,R1 ;KEEP BUFFER SIZE& BEQ 30$ ;IF EQ NO BUFFER SPECIFIED( MOV (R3)+,R0 ;GET USER BUFFER ADDRESS- CMP (R3),R1 ;IS USER BUFFER LARGE ENOUGH? BLO 90$ ;IF LO NOR6 MOV (R3),-(SP) ;SAVE NUMBER OF WORDS IN USER BUFFER: SUB R1,(SP) ;CALCULATE # OF EXTRA WORDS IN USER BUFFER: MOV (R3)+,R1 ;GET SIZE OF USER BUFFER FOR ADDRESS CHECK! ASL R1 ;CONVERT SIZE TO BYTES MOV -(R4),R2 ;GET FLAGS MOV R3,R4 ;COPY DPB ADDRESS3 MOV R0,R3 ;COPY USER BUFFER ADDR FOR ADDR CHECKC/ BIT #SF.IN,R2 ;IS THIS A READ ONLY FUNCTION?Q BEQ 20$ ;IF EQ YES4 CALL $ACHKP ;ADDRESS CHECK BUFFER FOR R/W ACCESS BR 25$ ;720$: CALL $ACHRO ;ADDRESS CHECK BUFFER FOR RO ACCESS(+ BCS 70$ ;IF CS ADDRESS CHECK HAS FAILEDS( CALL $RELOC ;RELOCATE BUFFER ADDRESS( MOV R1,KISAR6 ;MAP TO THE USER BUFFER/ MOV R2,R3 ;REDEFINE PARAMETER BLOCK ADDRESSR=25$: MOV (SP)+,R2 ;GET NUMBER OF EXTRA WORDS IN USER BUFFERP930$: CALLR @(SP)+ ;DISPATCH TO THE APPROPRIATE ROUTINED*70$: DRSTS D.RS98 ;SET DIRECTIVE STATUS .IFF ;R$$PROQ)80$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONK .IFTF ;R$$PRO090$: ;REF. LABLE FOR ERROR RETURN OF IE.SDP .IFT ;R$$PRO3$SFGAS:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSC3$SFUIC:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OST3$SFDEF:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSC3$SFFMK:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSW3$SFQMC:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OST3$SFDEV:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OS 3$SFSPR:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSS3$SFREN:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSO3$SFAPR:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSP3$SFFTK:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OST3$SFABO:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OST .IFTF ;R$$PRO .IF NDF P$$MON. $SFPMN:: .ENDC ;P$$MON .IF NDF P$$3XXT5$SFCFG:: ;REF. LABEL TO NOP SUBFUNCTION ON M-PLUS 5$SFSSN:: ;REF. LABEL TO NOP SUBFUNCTION ON M-PLUSO .ENDC ; DF P$$3XX4 DRSTS D.RS99 ;INVALID SUBFUNCTION CODE OR BUFFER .IFF ;R$$PRO ;+%; **-SFGAS-GET ASSIGNED DEVICE NAME ;UI; THIS SUBFUNCTION SEARCHES THE ASSIGNMENT LIST FOR A SPECIFIED LOGICALM; NAME AND RETURNS THE NAME OF THE PHYSICAL DEVICE TO WHICH IT IS ASSIGNED.;N; DPB FORMAT:;N%; WD. 00 -- DIC(169.),DPB SIZE(8.).F/; WD. 01 -- SUB FUNCTION CODE (0) (LOW BYTE).T$; WD. 02 -- OUTPUT BUFFER ADDRESS.,; WD. 03 -- OUTPUT BUFFER SIZE (IN WORDS)."; WD. 04 -- LOGICAL DEVICE NAME.$; WD. 05 -- LOGICAL DEVICE NUMBER.F; WD. 06 -- TI NAME FOR WHICH THIS ASSIGNMENT HOLDS. (0 FOR GLOBAL).; WD. 07 -- TI DEVICE NUMBER.C<; (IF HIGH BIT OF UNIT NUMBER IS SET, GET LOGIN ASSIGN);R; BUFFER FORMAT:;A&; WD. 00 -- NAME OF ASSIGNED DEVICE.<; WD. 01 -- UNIT NUMBER OF ASSIGNED DEVICE AND FLAGS BYTE.0; WD. 02 -- FIRST DEVICE CHARACTERISTICS WORD.1; WD. 03 -- SECOND DEVICE CHARACTERISTICS WORD.30; WD. 04 -- THIRD DEVICE CHARACTERISTICS WORD.2; WD. 05. -- FOURTH DEVICE CHARACTERISTICS WORD.;. ; INPUTS:-;N,; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.1; R3=ADDRESS OF THE LOGICAL NAME IN THE BUFFER.F$; R4=ADDRESS OF WD. 04 IN THE DPB.1; R5=ADDRESS OF THE TCB OF THE REQUESTING TASK.D;-7; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)A;E,; C=0 IF DIRECTIVE SUCCESSFULLY COMPLETED.(; DIRECTIVE STATUS OF +1 IS RETURNED.!; C=1 IF DIRECTIVE IS REJECTED.D2; DIRECTIVE STATUS OF 'D.RS5' IS RETURNED IF NO7; ASSIGNMENT EXISTS FOR THE SPECIFIED LOGICAL NAME..:; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF SPECIFIED; DEVICE IS NOT A TERMINAL.I;; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF REQUESTING.; TASK IS NOT PRIVILEGED.T;Q;- $SFGAS::0 .IF DF L$$GCL 00ddccccc;EXTENDED LOGICAL NAME SUPPORT @  MOV #GBLMSK,$TONYL ;INITIALIZE SEARCH ONLY TO SYSTEM LOGICALS   .IFTF ;DF L$$GCL. ) MOV R3,-(SP) ;SAVE USER BUFFER ADDRESSC9 CLR R2 ;ASSUME NO TERMINAL SPECIFIED, UCB=0 ;KLN033E" MOV 4(R4),R0 ;GET TERMINAL NAME2 BEQ 10$ ;IF EQ DON'T LOOK FOR TI UCB ;KLN033. MOV 6(R4),R1 ;GET TI DEVICE NUMBER ;**-19 BIC #177400,R1 ;STRIP OFF HIGH BYTE (LOGIN/LOCAL FLAG)5 CALL $CVDVN ;CONVERT DEVICE NAME TO A UCB ADDRESSS# BCS 70$ ;IF CS DEVICE NOT FOUNDO+ BIT #DV.TTY,U.CW1(R2) ;IS IT A TERMINAL?  BEQ 70$ ;IF EQ NO 10$: ;KLN033F3 .IF DF C$$RTK ;REMOTE DEVICE SUPPORT ;KLN033  ;KLN033 : BIT #F5.RTK,$FMSK5 ;REMOTE DEVICE SUPPORT ON? ;KLN033! BEQ 17$ ;IF EQ NO ;KLN033 ; ;KLN033T; FOR REMOTE HOST SYSTEMS, WE DO NOT ALLOW GET ASSIGNED DEVICE FOR A LOCAL ;KLN033R; LOGICAL NAME WHERE THE TI IS NOT OUR OWN. THIS IS BECAUSE THE CPRAME ;KLN033Q; SERVICING THE REQUEST DOES NOT HAVE ACCESS TO ANOTHER AME'S LOGICALS ;KLN033 ; ;KLN0332 TST R2 ;WAS THERE A TI UCB SPECIFIED ;KLN033! BEQ 15$ ;IF EQ NO ;KLN033 / CMP R2,T.UCB(R5) ;IS THIS OUR TI? ;KLN033M! BNE 70$ ;IF NE NO ;KLN033L; ;KLN0335; GIN$ DIRECTIVE MUST BE DONE REMOTELY ;KLN033E; ;KLN033515$: MOV R4,R3 ;PUT ADDRESS OF DPB IN R3 ;KLN033O- SUB #4,R3 ;AND POINT TO WORD 2 ;KLN033S- CLR R2 ;INDICATE NO UCB ADDRESS ;KLN033  ;KLN033 3 JMP $RTINF ;JOIN COMMON CODE IN GLUN ;KLN033  ;KLN033  .ENDC ;C$$RTK ;KLN033; ;KLN033I017$: TST R2 ;WAS TI UCB SPECIFIED? ;KLN033: BEQ 20$ ;IF EQ NO, LOOK FOR GLOBAL ASSIGNMENT ;KLN033 ;KLN033 .IFF ;DF L$$GCL=20$: MOV #$LOGHD,R1 ;GET ADDRESS OF LOGICAL ASSIGNMENT HEADR.30$: MOV (R1),R1 ;GET NEXT ASSIGNMENT BLOCK BEQ 80$ ;IF EQ END OF LIST. TST R0 ;SEARCHING FOR A GLOBAL ASSIGNMENT? BNE 40$ ;IF NE NO & TSTB L.TYPE(R1) ;GLOBAL ASSIGNMENT?  BNE 30$ ;IF NE NO! BR 50$ ;SKIP UCB CHECK."40$: CMP L.UCB(R1),R2 ;TI UCB ADDRESS MATCH?# BNE 30$ ;IF NE NOI.$ TSTB 7(R4) ;LOOKING FOR LOGIN ASSIGNMENT ?% BPL 50$ ;IF PL NOG4& CMPB #-1,L.TYPE(R1) ;IS THIS A LOGIN ASSIGNMENT ?' BNE 30$ ;IF NE NOG-(50$: CMP L.NAM(R1),(R4) ;DEVICE NAME MATCH?) BNE 30$ ;IF NE NOT,* CMPB L.UNIT(R1),2(R4) ;UNIT NUMBER MATCH?+ BNE 30$ ;IF NE NOE(, MOVB 7(R4),R2 ;SAVE LOGIN ASSIGN FLAG/- MOV L.ASG(R1),R4 ;GET ASSIGNMENT UCB ADDRESSM'. TST R0 ;LOOKING FOR GLOBAL ASSIGN ?;&/ BEQ 65$ ;IF EQ YES - USE UCB AS IS.0 TST R2 ;WAS IT A LOGIN ASSIGNMENT LOOKUP ?,1 BPL 65$ ;IF PL NO, USE "RAW" UCB ADDRESS23 .IFT ;DF L$$GCL455 BIT #U2.LOG,U.CW2(R2) ;IS THIS TERMINAL LOGGED ON?B-6 BNE 80$ ;IF NE, NO, THERE ARE NO LOGICALSD&7 MOV R2,R1 ;GET COPY OF UCB ADDRESS38 CALL $GTUSR ;SET UP THE USER HASH TABLE ADDRESSB@9 MOV #USRMSK,$TONYL ;INITIALIZE TO INHIBIT ALL BUT USER TABLES9: MOVB #LB.LOG,R3 ;SET UP THE LOGIN MOD VALUE BY DEFAULTO-; TSTB 7(R4) ;SEE IF THIS IS A LOGIN LOOKUPY6< BMI 25$ ;IF MI, IT IS, KEEP THE INITIALIZED VALUES5=20$: CLR R3 ;ZERO MOD VALUE TO PICK UP ANY LOGICALS(>25$: MOV (R4),R2 ;GET DEVICE MNEMONIC ? MOV 2(R4),R0 ;GET UNIT NUMBER2@ MOV R4,-(SP) ;SAVE THE DPB ADDRESS ACROSS CALLS)A MOV #$LNTSL,-(SP) ;CALL LOOKUP ROUTINES*B CALL $MPDC3 ;IN THIRD DIRECTIVE COMMON.C BCC 30$ ;IF CC, SUCCESSFUL LOOKUP IN TABLE-D TST R3 ;SEE IF THERE REALLY WAS A LOGICAL33E BEQ 80$ ;IF EQ, NO LOGICAL ASSOCIATED WITH NAME4+F MOV (SP)+,R4 ;RESTORE THE BUFFER ADDRESS$6G BR 70$ ;TRANSLATION OCCURRED TO BAD DEVICE OR LOOP+H30$: MOV (SP)+,R4 ;RESTORE ADDRESS TO DPB:I MOV R2,(R4) ;PUT EQUIVALENCE NAME MNEMONIC BACK IN DPB)J MOV R0,2(R4) ;SAME FOR THE UNIT NUMBERP-K MOV $DEVHD,R2 ;GET ADDRESS OF DEVICE TABLEA/L35$: CMP (R4),D.NAM(R2) ;IS THIS THE DEVICE ?EM BEQ 45$ ;YES.N40$: MOV D.LNK(R2),R2 ;NO, POINT TO NEXT DCBO BNE 35$ ;GOT ONE!P BR 7000ddb`TADATADATADATADATADATA$ ;END OF DEVICES, ERRORI$Q45$: MOV 2(R4),R5 ;GET UNIT NUMBER+R CMPB R5,D.UNIT(R2) ;IS UNIT ON THIS DCB?$S BLO 40$ ;NONT CMPB R5,D.UNIT+1(R2) ;MAYBEU BHI 40$ ;NO!!V CLR R3 ;GET FIRST UNIT NUMBERW BISB D.UNIT(R2),R3 ;V*X MOV D.UCB(R2),R1 ;GET FIRST UCB ADDRESS+Y SUB R3,R5 ;COMPUTE RELATIVE UNIT NUMBERHZ BEQ 55$ ;FOUND ITV/[50$: ADD D.UCBL(R2),R1 ;NO, POINT TO NEXT UCBE\ DEC R5 ;FOUND IT YET?S] BNE 50$ ;NO, LOOPR,^55$: MOVB 7(R4),-(SP) ;SAVE THE LOGIN FLAG,_ MOV R1,R4 ;GET A COPY OF THE UCB ADDRESS9` TSTB (SP)+ ;SEE IF THIS WAS A LOGIN ASSIGNMENT LOOKUPT/a BPL 65$ ;IF PL, NO, LEAVE UCB ADDRESS AS ISIbc .ENDC ;DF L$$GCL$d.e60$: CMP U.RED(R4),R4 ;END OF REDIRECT CHAIN f BEQ 65$ ;IF EQ YES, FINISHED&g MOV U.RED(R4),R4 ;POINT TO NEXT UCBh BR 60$ ;AND GO AGAINi65$: ;REFERENCE LABEL0j MOV (SP)+,R3 ;RESTORE THE USER BUFFER ADDRESS6k CALLR $GLINF ;CONTINUE THROUGH GET LUN INFORMATION$l70$: DRSTS D.RS92 ;INVALID DEVICE*m80$: DRSTS D.RS5 ;NO DEVICE IS ASSIGNEDno;+Lp; **-$SFUIC-GET SYSUIC, LIBUIC, CURRENT UIC, PROTECTION UIC, AND LOGIN UICq; Ar; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO RETURN THE SYSTEM UIC,U@s; THE LIBRARY UIC, AND THE TASK'S CURRENT AND PROTECTION UICS,Gt; AND TI LOGIN UIC. IF SPACE IS AVAILABLE, TRANSFER OTHER UIC AND CLI5u; INFORMATION.v;w; DPB FORMAT:Rx;E%y; WD. 00 -- DIC(169.),DPB SIZE(4.).N.z; WD. 01 -- SUBFUNCTION CODE (1) (LOW BYTE).{; WD. 02 -- BUFFER ADDRESS.%|; WD. 03 -- BUFFER SIZE (IN WORDS).N};~; BUFFER FORMAT:; ; WD. 00 -- SYSTEM UIC.,; WD. 01 -- LIBRARY UIC.-; WD. 02 -- H.DUIC FOR THE REQUESTING TASK.E-; WD. 03 -- H.CUIC FOR THE REQUESTING TASK.I; WD. 04 -- LOGIN UIC.;R ; INPUTS:,; ,; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.(; R3=ADDRESS OF WD. 00. OF THE BUFFER.*; R5=TCB ADDRESS OF THE REQUESTING TASK.;6 ; OUTPUTS:;?; THE USER'S BUFFER IS FILLED WITH THE REQUESTED INFORMATION.F;D;-:$SFUIC::MOV $SYUIC,(R3)+ ;MOVE SYSTEM UIC TO USER BUFFER% MOV $LBUIC,(R3)+ ;MOVE LIBRARY UIC .IF DF X$$HDR% CLR -(SP) ;RESERVE SPACE ON STACK  CLR -(SP) ;30 MOV KISAR6,-(SP) ;SAVE MAPPING TO USER BUFFER2 MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER4 MOV $SAHPT,R4 ;GET HEADER ADDRESS OF CURRENT TASK) MOV H.DUIC(R4),2(SP) ;SAVE DEFAULT UIC ) MOV H.CUIC(R4),4(SP) ;SAVE CURRENT UIC$ MOV (SP)+,KISAR6 ;RESTORE MAPPING$ MOV (SP)+,(R3)+ ;COPY CURRENT UIC5 MOV (SP)+,(R3)+ ;AND PROTECTION UIC TO USER BUFFERO .IFF4 MOV $HEADR,R4 ;GET HEADER ADDRESS OF CURRENT TASK9 MOV H.DUIC(R4),(R3)+ ;MOVE CURRENT UIC TO USER BUFFER)< MOV H.CUIC(R4),(R3)+ ;MOVE PROTECTION UIC TO USER BUFFER .ENDC ;X$$HDR MOV T.UCB(R5),R1 ;GET TI UCB; .IF DF A$$CNT .IF DF D$$PAR- MOV KISAR6,-(SP) ;SAVE USER BUFFER MAPPING . MOV T.ACN(R5),R0 ;POINT TO ACCOUNTING BLOCK! BEQ 5$ ;IF EQ THERE ISN'T ONEC3$: MOV R0,KISAR6 ;MAP IT+- MOV @#B.PNT+140000,R0 ;POINT TO NEXT BLOCKF- CMPB #BT.UAB,@#B.TYP+140000 ;IS THIS A UAB  BNE 3$ ;IF NE NO1 MOV @#B.UUIC+140000,R0 ;GET LOGIN UIC FROM UAB  BR 6$ ;(&5$: MOV U.LUIC(R1),R0 ;GET LOGIN UIC36$: MOV (SP)+,KISAR6 ;RESTORE USER BUFFER MAPPING)0 MOV R0,(R3)+ ;RETURN LOGIN UIC TO USER BUFFER .IFF ;D$$PAR2 MOV T.ACN(R5),R0 ;LOCATE FIRST ACCOUNTING BLOCK# BEQ 10$ ;IF EQ, THERE ISN'T ONEO)7$: MOV R0,KISAR5 ;MAP ACCOUNTING BLOCK$- MOV @#B.PNT+120000,R0 ;POINT TO NEXT BLOCK,- CMPB #BT.UAB,@#B.TYP+120000 ;IS THIS A UABY BNE 7$ ;IF NE NO9 MOV @#B.UUIC+120000,(R3)+ ;GET LOGIN UIC FROM THE UABG BR 20$ ;GO MOVE MORE DATA310$: MOV U.LUIC(R1),(R3)+ ;GET LOGIN UIC FROM UCB) .ENDC ;D$$PAR .IFF ; DF A$$CNTT/ MOV U.LUIC(R1),(R3)+ ;GET LOGIN UIC FROM UCB .ENDC ; DF A$$CNT;BG; IN ORDER TO OBTAIN THE REMAINING DATA, THE USER MUST HAVE ALLOCATEDU; AT LEAST A 32. WORD BUFFER.000edccccc;;B20$: SUB #<32.-5.>,R2 ;IS THERE ROOM FOR THE NEXT BLOCK OF DATA? BMI 110$ ;IF MI NO0 MOV U.UIC(R1),(R3)+ ;PUT CURRENT TERMINAL UIC1 MOV U.MUP(R1),R1 ;PICK UP INDEX TO COB POINTERV) BIC #^C,R1 ;AND ONLY THE INDEX( MOV $CPTBL(R1),R1 ;GET POINTER TO CPB' MOV (R1),R2 ;GET TCB ADDRESS OF CLIR0 MOV @#KISAR6,-(SP) ;SAVE CURRENT APR6 MAPPING1 BIT #CP.POL,C.PSTS(R1) ;TCB IN SECONDARY POOL?T BEQ 40$ ;IF EQ NOU MOV R2,KISAR6 ;MAP TCB" MOV #140000,R2 ;AND POINT TO IT)40$: MOV T.NAM(R2),R1 ;GET CLI TASKNAMER MOV T.NAM+2(R2),R2 ;+ MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING+7 MOV R1,(R3)+ ;AND COPY CLI TASKNAME INTO USER BUFFERI MOV R2,(R3)+ ;V' MOV #$SYSNM,R1 ;POINT TO SYSTEM NAMEE8 MOV (R1)+,(R3)+ ;SHUFFLE THE 6-CHARACTER NAME TO USER MOV (R1)+,(R3)+ ;...L MOV (R1)+,(R3)+ ;... + MOV $NTUIC,(R3)+ ;SUPPLY THE NETWORK UICP6 MOV $SYSIZ,(R3)+ ;AND SYSTEM SIZE IN 32 WORD BLOCKS .IF DF A$$CNT# MOV #9.,-(SP) ;MAX LENGTH OF DDST- MOV KISAR6,-(SP) ;SAVE USER BUFFER MAPPING. MOV T.ACN(R5),R1 ;POINT TO ACCOUNTING BLOCK" BEQ 70$ ;IF EQ THERE ISN'T ONE50$: MOV R1,KISAR6 ;MAP IT- MOV @#B.PNT+140000,R1 ;POINT TO NEXT BLOCKM- CMPB #BT.UAB,@#B.TYP+140000 ;IS THIS A UAB; BNE 50$ ;IF NE NO 5 MOVB @#B.LDS+140000,R0 ;GET LENGTH OF DDS FROM UAB3 BEQ 70$ ;IF EQ, NO DDS' SUB R0,2(SP) ;SUBTRACT LENGTH OF DDS,. MOV #B.LDS+120000,R2 ;ADDRESS OF DDS IN UAB' MOV R3,R4 ;DISPLACEMENT INTO BUFFER ) MOV (SP),R3 ;USER BUFFER MAPPING BIASS INC R0 ;COPY SIZE BYTE ALSOR" MOV KISAR6,R1 ;RESTORE UAB BIAS9 CALL $BLXIO ;COPY DDS FROM ACCOUNTING BLOCK TO BUFFER $  MOV (SP)+,KISAR6 ;RESTORE MAPPING  BR 80$ ;( 70$: MOV (SP)+,KISAR6 ;RESTORE MAPPING,  CLRB (R3)+ ;RETURN LENGTH TO USER BUFFER(  MOV R3,R4 ;MOVE BUFFER POINTER TO R4,80$: TST (SP) ;IS THERE NEED TO ZERO FILL$ BEQ 100$ ;NO, DDS WAS MAX LENGTH390$: CLRB (R4)+ ;ZERO OUT REMAINING BUFFER SPACEC' DEC (SP) ;LENGTH REMAINING ON STACK  BNE 90$ ;LOOP UNTIL DONE100$: TST (SP)+ ;CLEAN STACKK .ENDC ;A$$CNTI110$: RETURN;+"; **-$SFDEF-SET TASK DEFAULT UIC;(F; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SET THE DEFAULT UIC FOR THEI; REQUESTING TASK. IF THE TASK IS NON-PRIVILEGED, ONLY THE DEFAULT UICMK; IS CHANGED. IF THE TASK IS PRIVILEGED, BOTH THE DEAFULT AND PROTECTIONQ; UICS ARE MODIFIED. ;H!; DPB FORMAT:)";E%#; WD. 00 -- DIC(169.),DPB SIZE(3.).(.$; WD. 01 -- SUBFUNCTION CODE (2) (LOW BYTE).%; WD. 02 -- DEFAULT UIC.&; '; INPUTS:K(;)); R3=ADDRESS OF DEFAULT UIC IN THE DPB.'*; R5=TCB ADDRESS OF THE CURRENT TASK.+; ,; OUTPUTS:-;I3.; THE DEAFULT UIC IS SET FOR THE REQUESTING TASK./;U0;-172$SFDEF::TSTB T.GGF(R5) ;IS THER A GGF CONTEXT ACTIVE?3 BEQ 5$ ;IF EQ, NO %4 DRSTS D.RS17 ;RETURN IE.RSU ERRORD%55$: MOV (R3),R1 ;GET SPECIFIED UIC"6 BEQ 100$ ;IF EQ UIC IS INVALID78 .IF DF X$$HDR9%: MOV $SAHDB,KISAR6 ;MAP TASK HEADER)); MOV $SAHPT,R2 ;GET TASK HEADER ADDRESS<= .IFF ; DF X$$HDR>)? MOV $HEADR,R2 ;GET TASK HEADER ADDRESS5@A .ENDC ; DF X$$HDRBC%D MOV R1,H.DUIC(R2) ;SET DEFAULT UICF*E BIT #T3.PRV,T.ST3(R5) ;TASK PRIVILEGED?F BEQ 10$ ;IF EQ NO:(G MOV R1,H.CUIC(R2) ;SET PROTECTION UICH10$: RETURN ;F"I100$: DRSTS D.RS91 ;INVALID UICJ;+ K; **-$SFSPR-SET TASK PRIVILEGEL;EEM; THIS DIRECTIVE REQUEST THE SET/CLEAR OF THE TASK PRIVILEGE BIT INEN; THE TCB. THE PRIVILEGE BIT MAY BE CLEARED IN ANY STATE BUT MAY BE *O; SET ONLY IF IT WAS PREVIOUSLY CLEARED.P;EQ; DPB FORMAT:HR; $S; WD. 00 -- DIC(169.),DPB SIZE(3.)"T; WD. 01 -- SUBFUNCTION CODE (7)(U; WD. 02 -- NEW PRIVILEGE FLAG (BIT 0)V;E W; INPUT:X; &Y; R3=ADDRESS OF PRIVILGE FLAG IN DPB"Z; R5=TCB ADDRESS OF CURRENT TASK[; \; OUTPUT: ];LE^; THE T3.PRV BIT IS SET OR CLEARED. THE PREVIOUS STATE OF T3.PRV ISE_; SAVED IN T4.PRV.O`;-a1b$SFSPR::MOV T.ST3(R5),R2 ;GET 00edb`TADATADATADATADATADATACURRENT PRIVILEGEM0c BIC #^C,R2 ;AND ISOLATE PRIVILEGE BIT+d BEQ 30$ ;IF EQ NOT CURRENTLY PRIVILEGEDP0e BIS #T4.PRV,T.ST4(R5) ;COPY PRIVILEGED STATE+f BEQ 30$ ;IF EQ NOT CURRENTLY PRIVILEGED %g TST (R3) ;SET OR CLEAR PRIVILEGE?)h BNE 40$ ;IF NE SETTING PRIVILEGED BITV$i BIC R2,T.ST3(R5) ;CLEAR PRIVILEGE j RETURN ;k)l30$: TST (R3) ;SET OR CLEAR PRIVILEGE? +m BEQ 50$ ;IF EQ CLEARING. THIS IS A NOPI1n40$: BIT #T4.PRV,T.ST4(R5) ;WAS IT PRIVILEGED? 1o BEQ 60$ ;IF EQ NO, CAN'T MAKE SELF PRIVILEGED.-p BIS #T3.PRV,T.ST3(R5) ;MAKE IT PRIVILEGED q50$: RETURN ;Y&r60$: DRSTS D.RS16 ; PRIVILEGE ERRORst;+u; **-$SFREN-RENAME TASKIv;NFw; THIS DIRECTIVE RENAMES THE ISSUING TASK TO THE SUPPLIED TASK NAME.x; y; DPB FORMAT:Iz;E${; WD. 00 -- DIC(169.),DPB SIZE(3.)"|; WD. 01 -- SUBFUNCTION CODE (7)}; WD. 02-03 -- NEW TASK NAME~; ; INPUT:;C&; R3=ADDRESS OF NEW TASK NAME IN DPB"; R5=TCB ADDRESS OF CURRENT TASK;B ; OUTPUT:Q;C@; THE NEW NAME IS CHECKED FOR UNIQUENESS AND IF NOT FOUND, THE,; ISSUING TASK IS RENAMED TO THE NEW NAME.;-C$SFREN::CMP #^R...,(R3) ;DON'T ALLOW RENAME TO A DOT-DOT-DOT FORMR BEQ 10$ ;IF EQ ILLEGAL NAMEO< CALL $SRPRO ;SEARCH PROTOTYPE TCB AND TCB LISTS FOR NAME$ BCC 10$ ;IF CC NAME FOUND, ERROR8 MOV (R3),T.NAM+0(R5);ESTABLISH NEW NAME FOR THIS TASK MOV 2(R3),T.NAM+2(R5) ;...  RETURNO710$: DRSTS D.RS17 ;NAME ALREADY IN USE(IE.RSU ERROR)K;+J; **-$SFFMK-GET FEATURE MASK WORDS, BASE LEVEL, VERSION, AND SYSTEM TYPE;H; THIS DIRECTIVE RETURNS THE FEATURE MASK WORDS TO THE REUESTING TASK.; ; DPB FORMAT:M;A%; WD. 00 -- DIC(169.),DPB SIZE(4.).I.; WD. 01 -- SUBFUNCTION CODE (3) (LOW BYTE).; WD. 02 -- BUFFER ADDRESS.B#; WD. 03 -- BUFFER SIZE IN WORDS.M;3; BUFFER FORMAT:;E&; WD. 00 -- FIRST FEATURE MASK WORD.'; WD. 01 -- SECOND FEATURE MASK WORD.R&; WD. 02 -- THIRD FEATURE MASK WORD.'; WD. 03 -- FOURTH FEATURE MASK WORD. ); WD. 04 -- HARDWARE FEATURE MASK WORD. %; WD. 05 - 06 -- SYSTEM BASE LEVEL.T"; WD. 07 - 10 -- SYSTEM VERSION.:; WD. 11 - 16 -- SYSTEM TYPE (RETURNED ONLY IF BUFFER IS#; AT LEAST 15. WORDS LONG)F;O ; INPUTS:O;E,; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.(; R3=ADDRESS OF WD. 00. OF THE BUFFER.'; R5=TCB ADDRESS OF THE CURRENT TASK.T;A ; OUTPUTS:;1.; THE INFORMATION IS RETURNED TO THE CALLER.;E;-5$SFFMK::MOV #$FMASK,R0 ;GET ADDRESS OF FEATURE MASKD0 MOV (R0)+,(R3)+ ;MOVE FIRST FEATURE MASK WORD1 MOV (R0)+,(R3)+ ;MOVE SECOND FEATURE MASK WORDE0 MOV (R0)+,(R3)+ ;MOVE THIRD FEATURE MASK WORD1 MOV (R0)+,(R3)+ ;MOVE FOURTH FEATURE MASK WORD 4 MOV $HFMSK,(R3)+ ;MOVE HARDWARE FEATURE MASK WORD3 MOV $SYSID,(R3)+ ;MOVE BASE LEVEL TO USER BUFFERF MOV $SYSID+2,(R3)+ ;A7 MOV $VERSN,(R3)+ ;MOVE SYSTEM VERSION TO USER BUFFER MOV $VERSN+2,(R3)+ ;R;OR; SYSTEM TYPE IS RETURNED ONLY IF THERE ARE AT LEAST 6 EXTRA WORDS IN THE BUFFER;M& SUB #6,R2 ;AT LEAST 6 EXTRA WORDS? BMI 10$ ;NO, RETURN NOWE) MOV #$SYTYP,R0 ;ADDRESS OF SYSTEM TYPE3 MOV #6,R1 ;WORD COUNT 65$: MOV (R0)+,(R3)+ ;MOVE SYSTEM TYPE TO USER BUFFER SOB R1,5$ ;ALL SIX BYTES10$: RETURN ; ;+$; **-$SFQMC-QUEUE MCR COMMAND LINE;FF; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A COMMAND LINE TO THE$; TASK'S COMMAND LINE INTERPRETER.;O; DPB FORMAT:;T%; WD. 00 -- DIC(169.),DPB SIZE(4.).A(; WD. 01 -- CODE FOR SFQMC (LOW BYTE).; WD. 02 -- BUFFER ADDRESS.I%; WD. 03 -- BUFFER SIZE (IN WORDS).R;D; BUFFER FORMAT:;M-; WD. 00 THRU N -- COMMAND LINE CHARACTERS.M;Y ; INPUTS:U;U,; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.%; R3=ADDRESS OF USER BUFFER WD. 00.U#; R5=TCB ADDRESS OF CURRENT TASK.D;I ; OUTPUTS:;S0; C=0 IF THE DIRECTIVE SUCCESSFULLY COMPLETED.(; DIRECTIVE STATUS OF +1 IS RETURNED.!; C=1 IF DIRECTIVE IS REJECTED.,500edccccc; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF THERE..; IS INSUFFICIENT DYNAMIC MEMORY AVAILABLE.;R;- $SFQMC:: .IF DF V$$TRM  MOV T.UCB(R5),R1 ;GET TI: UCB MOV U.DCB(R1),R0 ;GET DCB0 CMP D.NAM(R0),#"VT ;IS TI A VIRTUAL TERMINAL? BNE 5$ ;IF NE NO0 TST U.PTCB(R1) ;IS VT MARKED FOR ELIMINATION? BEQ 90$ ;IF EQ YES .ENDC95$: MOV #M$$CRB,R1 ;GET SIZE OF MCR COMMAND LINE BUFFERA" CALL $ALOCB ;ALLOCATE A BUFFER& BCS 100$ ;IF CS ALLOCATION FAILURE" MOV R0,R1 ;COPY BUFFER ADDRESS- TST (R0)+ ;POINT TO UCB ADDRESS IN BUFFERL* MOV T.UCB(R5),(R0)+ ;SET TI UCB ADDRESS# MOV #M$$CRB-4,R2 ;SET LOOP COUNT 310$: MOVB (R3)+,(R0) ;MOVE COMMAND TO POOL BUFFERN" CMPB (R0),#15 ;CARRIAGE RETURN? BEQ 50$ ;IF EQ YES CMPB (R0)+,#33 ;ESCAPE?  BEQ 50$ ;IF EQ YES3  SOB R2,10$ ;CONTINUE MOVING COMMAND TO THE POOLO2  MOVB #33,-(R0) ;TERMINATE BUFFER WITH AN ESCAPE7 50$: CALLR $QMCRL ;QUEUE THE COMMAND LINE TO THE CLIL= 90$: DRSTS D.RS92 ;VIRTUAL TERMINAL MARKED FOR ELIMINATION0(100$: DRSTS D.RS1 ;ALLOCATION FAILURE;+$; **-$SFUAB-GET USER ACCOUNT BLOCK;BA; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO MOVE THE CONTENTS OF AL(; USER ACCOUNT BLOCK TO A USER BUFFER.;; DPB FORMAT:Y;$; WD. 00 -- DIC(169.),DPB SIZE(6.).; WD. 01 -- SUBFUNCTION CODE (5) (LOW BYTE).; WD. 02 -- BUFFER ADDRESS.(%; WD. 03 -- BUFFER SIZE (IN WORDS).0; WD. 04 -- TERMINAL NAME (0 FOR CALLER'S TI).; WD. 05 -- TERMINAL NUMBER.;E ; INPUTS:  ;L,!; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.%"; R3=ADDRESS OF USER BUFFER WD. 00.R%#; R4=POINTER TO WORD 04 OF THE DPB.E'$; R5=TCB ADDRESS OF THE CURRENT TASK.S%;L &; OUTPUTS:';B0(; C=0 IF THE DIRECTIVE SUCCESSFULLY COMPLETED.(); DIRECTIVE STATUS OF +1 IS RETURNED.%*; C=1 IF THE DIRECTIVE IS REJECTED. 0+; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF0,; A NON-PRIVILEGED USER SPECIFIES A TERMINAL.0-; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF..; THE SPECIFIED DEVICE IS NOT A TERMINAL OR'/; IF THERE IS NO UAB FOR THE DEVICE.30;E1;-2345 .IF DF A$$CNT697$SFUAB::MOV T.UCB(R5),R2 ;ASSUME TERMINAL NOT SPECIFIEDN*8 MOV T.ST3(R5),R1 ;GET THIRD STATUS WORD'9 MOV R3,R5 ;COPY USER BUFFER ADDRESS/: MOV (R4)+,R0 ;GET TERMINAL NAME FROM THE DPB ; BEQ 10$ ;IF EQ NOT SPECIFIED$< BIT #T3.PRV,R1 ;TASK PRIVILEGED?= BEQ 80$ ;IF EQ NOI$> MOV (R4),R1 ;GET TERMINAL NUMBER ? CALL $CVDVN ;GET UCB ADDRESS#@ BCS 90$ ;IF CS DEVICE NOT FOUNDC/A BIT #DV.TTY,U.CW1(R2) ;IS DEVICE A TERMINAL?OB BEQ 90$ ;IF EQ NO$C CMP $COPT,R2 ;IS UCB EQUAL TO CO?D BNE 10$ ;IF NE NO,EF .IF DF D$$PARG,H MOV $SYUAB,R1 ;PICK UP BIAS TO SYSTEM UAB I BR 15$ ;,J10$: MOV U.UAB(R2),R1 ;PICK UP BIAS TO UAB&K15$: BEQ 90$ ;IF EQ THERE IS NO UAB-L MOV #B.ULEN,R0 ;SET COUNT OF WORDS TO MOVEV-M MOV #120000,R2 ;DISPLACEMENT (APR5) TO UAB)N MOV KISAR6,R3 ;GET USER BUFFER MAPPINGL5O MOV R5,R4 ;GET DISPLACEMENT TO USER BUFFER (APR6)O(P CALL $BLXIO ;MOVE UAB TO USER BUFFERQR .IFF ;D$$PARBS+T MOV $SYUAB,KISAR5 ;MAP TO THE SYSTEM UAB U BR 15$ ;6V10$: MOV U.UAB(R2),KISAR5 ;MAP THE UAB THROUGH APR 6&W15$: BEQ 90$ ;IF EQ THERE IS NO UAB/X MOV #B.ULEN/2,R0 ;SET COUNT OF WORDS TO MOVEU%Y MOV #120000,R1 ;SET SOURCE ADDRESSU/Z20$: MOV (R1)+,(R5)+ ;COPY UAB TO USER BUFFERV[ SOB R0,20$ ;LOOP UNTIL DONE \] .ENDC ;D$$PAR^ _ RETURN ;R)`80$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONC.a90$: DRSTS D.RS92 ;INVALID DEVICE SPECIFIEDbc .ENDC ;A$$CNTdef;+$g; **-$SFDEV-GET DEVICE INFORMATIONh;Ti;S-j; THE GET DEVICE INFORMATION GIN DIRECTIVE:Sk;M?l; THIS GIN SUBFUNCTION RETURNS INFORMATION ABOUT A PARTICULAR;m; DEVICE. THE DEVICE ON WHICH INFORMATION IS RETURNED, IS0Cn; DETERMINED BY FIRST PERFORMING A LOGICAL ASSIGNMENT IF REQUIREDB?o; AND THE FOLLOWING ANY REDIRECTS. DEVICE ASSIGNMENTS WILL BE?p; CHECKED IF THE HIGH BIT IN THE FLAGS BYTE IS C00edb`TADATADATADATADATADATALEAR, ELSE NO0q; CHECK IS MADE.r; ?s; ONLY THE FIRST WORD OF THE BUFFER IS REQUIRED TO BE PRESENTE<t; (IE: A BUFFER SIZE OF 1 WORD). ADDITIONAL INFORMATION IS9u; RETURNED ONLY IF THERE IS ROOM IN THE BUFFER AND THATRv; INFORMATION IS AVAILABLE.Aw; x; INPUTS: y;E-z; R2 = EXTRA WDS. AVAILABLE IN USER BUFFERE7{; R3 = POINTER TO USER BUFFER (MAPPED THROUGH APR 6)E$|; R4 = POINTER TO "G.IDNM" IN DPB$}; R5 = CURRENT TASK'S TCB ADDRESS~; ;E; ; DPB FORMAT:B;SC; +-----------------------------+-------------------------------+F; | DPBLEN=6. | DIC=169. |C; +-----------------------------+-------------------------------+#; | GIN SUBFUNCTION CODE (6) | C; +-------------------------------------------------------------+S; | BUFFER ADDRESS |.C; +-----------------------------+-------------------------------+T ; | BUFFER SIZE (WORDS!!) |C; +-----------------------------+-------------------------------+; | ASCII DEVICE NAME |C; +-----------------------------+-------------------------------+$; | FLAGS | DEVICE UNIT NUMBER |C; +-----------------------------+-------------------------------+ ;U;-;(%; DPB OFFSETS AND FLAG DEFINITIONS:-;-5G.INSF=2 ; LOCATION OF SUBFUNCTION CODE ;edp040.'G.IDNM=10 ;TWO BYTE ASCII DEVICE NAME-%G.IDUN=12 ;LOGICAL UNIT NUMBER BYTEUG.IDFG=13 ;FLAGS BYTES;GI.NAS=200 ;FLAG INDICATING NOT TO FOLLOW ANY ASSIGNMENTS;I;I; USER BUFFER FORMAT:-;-;-E; +-------------------------------+-------------------------------+IE; | U | A | A | C | U | U | W | U | O | U | U | U | U | A | A | W |-E; | N | T | L | O | S | S | A | N | F | S | S | S | S | T | L | A |E; | L | T | L | N | . | . | S | I | F | . | . | . | . | T | L | S |DE; | O | C | O | T | U | P | | T | L | M | F | M | L | A | O | |TE; | A | H | C | R | M | U | R | | I | N | O | D | A | C | C | A | E; | D | 2 | 2 | | D | B | E | O | N | T | R | M | B | H | A | S |E; | E | U | U | O | | | D | F | E | | | | | E | T | N |-E; | D | S | S | F | | | C | L | | | | | | D | E | D | E; | | | | L | | | T | | | | | | | | D | | E; +-------------------------------+-------------------------------+ ; | |; | U.CW1 |; | |E; +-------------------------------+-------------------------------+ ; | |; | U.PRM |; | |E; +---------------------------------------------------------------+ ; | |; | U.PRM+2 |; | |E; +---------------------------------------------------------------+ ; | |; | ASCII DEVICE NAME |-; | |E; +-------------------------------+-------------------------------+ ; | | | 4; | L.TYPE if "WAS ASND" | DEVICE LOGICAL UNIT |0; | L.NTBL - EXTENDED LOG | NUMBER |E; +---------------------------------------------------------------+-; | |5; |--- ATTACHEE'S RAD50 TASKNAME ---|R; | ( IF ATTACHED ) |E; +---------------------------------------------------------------+3; | ASCII TERMINAL DEVICE NAME OF ALLOCATOR | (; |--- ( IF ALLOCATED ) ---|.; | LOGICAL UNIT NUMBER OF ALLOCATOR |E; +---------------------------------------------------------------+; | |'; |--- RAD50 ACP NAME ---|-; | ( IF MOUNTED ) |-E; +---------------------------------------------------------------+ ; | | | #; |--- -+- ---| ; | | |-#; |--- -+- ---|-; | | |#; |--- -+- ---|L; | VOLUME LABEL |L#; |--- -+- ---|C; | | |L#; |--- -+- ---|-; | | |-E; +---------------------------------------------------------------+ ; ;-; '; OFFSET AND S00 edcccccTATUS WORD DEFINITIONS:-;-1G.IDEV=0 ;GENERAL DEVICE STATUS WORD (REQUIRED) 2 ;NOTE THAT REQUIRED WORDS ARE NOT REFLECTED IN6 ;THE "EXTRA WORD COUNT" PASSED TO THIS SUBFUNCTION ;BY DRGIN.%G.ICW1=2 ;U.CW1 FROM DEVICE'S UCB-%G.IPR1=4 ;U.PRM FROM DEVICE'S UCB %G.IPR2=6 ;U.PRM+2 FROM DEVICE'S UCB 'G.IDNM=10 ;RESOLVED ASCII DEVICE NAME (G.IUNM=12 ;RESOLVED DEVICE UNIT NUMBER0G.ILTP=13 ;TYPE OF LOGICAL ASSIGNMENT FOLLOWED;G.IATT=14 ;RAD50 TASK NAME OF ATTACHER IF DEVICE ATTACHEDFAG.IALL=20 ;ASCII TERMINAL NAME OF ALLOCATOR IF DEVICE ALLOCATEDR*G.IACP=24 ;NAME OF ACP IF DEVICE MOUNTED4G.IVOL=30 ;VOLUME NAME IF NOT MOUNTED AS ANSI TAPE+G.IVID=G.IVOL ;VOLUME SET ID IF ANSI TAPE.)G.ITLB=G.IVID+6 ;VOLUME ID IF ANSI TAPE %G.IEND=G.IVOL+14;END OF USER BUFFER+;V$; 'G.IDEV' STATUS WORD DEFINITION:;I<GI.ASN=000001 ;A LOGICAL ASSIGNMENT WAS FOLLOWED (1=YES)+GI.ALL=000002 ;DEVICE ALLOCATED (1=YES)1*GI.ATT=000004 ;DEVICE ATTACHED (1=YES)0GI.LAB=000010 ;UNIT HAS LABELED TAPE (1=YES)*GI.MDM=000020 ;(US.MDM) UNIT IS MARKED$ ; FOR DISMOUNT (1=YES)6GI.FOR=000040 ;(US.FOR) UNIT IS MOUNTED AS FOREIGN ; VOLUME (1=YES)3GI.MNT=000100 ;(US.MNT) UNIT IS MOUNTED (0=YES)G-GI.OFL=000200 ;UNIT OR CONTROLLER OFFLINEI0GI.UOF=000400 ;(US.OFL) UNIT OFFLINE (1=YES)GI.RED=001000L9GI.PUB=002000 ;(US.PUB) UNIT IS PUBLIC DEVICE (1=YES) -GI.UMD=004000 ;(US.UMD) UNIT ATTACHED FORT# ; DIAGNOSTICS (1=YES)I&GI.COF=010000 ;DEVICE'S CONTROLLER ; WAS OFFLINE (1=YES).GI.ALU=020000 ;DEVICE WAS ALLOCATED BY THE  ; ISSUER'S TI: (1=YES)8 GI.ATU=040000 ;DEVICE WAS ATTACHED BY ISSUER (1=YES)5 GI.UNL=100000 ;DEVICE'S DRIVER NOT LOADED (1=YES)0  ; .; DEFINE UCB AND MAGTAPE DEFINITIONS LOCALLY;N .MCALL MTADF$,UCBDF$R+ MTADF$ ;DEFINE MAGTAPE DATA STRUCTURESI& UCBDF$ ;DEFINE UCB DATA STRUCTURE;(:; SINCE MANY OF THE STATUS BITS ARE DIRECTLY COPIED FROM=; U.STS AND U.ST2 OF THE UCB, WE MUST ASSUME THE FOLLOWING:L;1 ASSUME GI.MDM,US.MDM  ASSUME GI.FOR,US.FORT ASSUME GI.MNT,US.MNT: ASSUME GI.UOF, ASSUME GI.PUB, ASSUME GI.UMD,;R=; THE FOLLOWING BITS IN THE STATUS WORD ARE NOT COPIED FROMN@; U.STS AND U.ST2 OF THE DEVICE'S UCB. THEREFORE THE FOLLOWING2 ; BIT MASK IS USED TO CLEAR OUT THE UNUSED BITS.!;S"G#CLRMSK=GI.UNL!GI.ATU!GI.ALU!GI.RED!GI.OFL!GI.ATT!GI.ALL!GI.ASN!GI.LAB$%&;.:'; THE FOLLOWING SECTION OF THIS GIN FUNCTION ATTEMPTS=(; TO LOCATE THE CORRECT UCB ADDRESS OF THE DEVICE SPECIFIEDU;); IN THE DPB. INITIALLY, A SEARCH IS MADE TO DETERMINE IFP;*; A LOGICAL ASSIGNMENT IS IN EFFECT FOR THE ISSUING TASK.WA+; THE LOGICAL ASSIGNMENT MAY BE SYSTEM WIDE (GLOBAL), LOGIN, ORTC,; LOCAL TO THE TI: OF THE TASK AS SPECIFIED BY THE "L.TYPE" FIELDT@-; IN THE LOGICAL ASSIGNMENT BLOCK. IF THE TASK HAS THE "SLAVE"@.; ATTRIBUTE OR IF THE "GI.NAS" FLAG HAS BEEN SET, THEN LOGICAL$/; ASSIGNMENTS WILL NOT BE CHECKED.0;OK0; THIS CODE TO FIND THE UCB OF THE SPECIFIED DEVICE IS SHARED BY ;edp040=0; THE SON OF GET DEVICE INFORMATION SUBFUNCTION. ;edp040 0; ;edp040 1$SFDEV::2&3 MOV R2,-(SP) ;SAVE EXTRA WORD COUNT/4 CLR -(SP) ;INITIALIZE SCRATCH WORD IN WHICH)5 ;THE 'GI.RED' AND 'GI.ASN' IS SAVED 06 CLR $TEMP0 ;INITIALIZE SCRATCH WORD IN WHICH7 ;WE WILL SAVE L.TYPE*8 MOV R3,R1 ;COPY POINTER TO USER BUFFER(910$: CLR (R1)+ ;CLEAR OUT USER BUFFER': DEC R2 ; NOTE THAT USER BUFFER SIZEH$; BPL 10$ ; IS EXTRA WD. COUNT + 13< MOV (R4)+,R1 ;GET DEVICE NAME (TWO ASCII CHARS.)D1= MOV (R4),R0 ;GET UNIT NUMBER (LOW ORDER BYTE) '> ;AND FLAGS BYTE (HIGH ORDER BYTE)(?<@ ASSUME GI.NAS, 200 ;ASSUME THAT THE "INHIBIT ASSIGNMENTS"A ;FLAG IS THE SIGN BITD,B ASSUME G.IDFG, G.IDUN+1 ;IN THE HIGH BYTEC'D BMI 57$ ;IF MI, INHIBIT ASSIGNMENTSS;E BIT #T3.SLV,T.ST3(R5) ;IS THE00(edb`TADATADATADATADATADATA ISSUING TASK A SLAVE TASK?:*F BNE 57$ ;IF NE, YES..AVOID ASSIGNMENTSGH .IF DF L$$GCLI:J MOV R3,-(SP) ;SAVE THE BUFFER ADDRESS ACROSS PROCESSING3K MOV R1,-(SP) ;SAVE THE DEVICE MNEMONIC FOR LATER06L MOV T.UCB(R5),R1 ;GET THE UCB ADDRESS FOR THIS TASK8M CALL $GTUSR ;GET THE USER LOGICAL HASH TABLE ADDRESS,N MOV (SP)+,R2 ;RESTORE THE DEVICE MNEMONIC/O CALL $LNTD1 ;DO RECURSIVE LOOKUP FOR DEVICEE%P BCC 45$ ;IF CC, SUCCESSFUL LOOKUPI&Q TST R3 ;SEE IF NO LOGICAL OR ERROR8R BNE 40$ ;IF NE, BAD LOGICAL OR RECURSION LIMIT ERRORS BR 50$ ;NO LOGICAL EXISTS7T45$: MOV KISAR6,-(SP) ;SAVE APR6 MAPPING FOR A MOMENTEU MOV R3,KISAR6 ;MAP THE LNB,GV MOVB MAP6+L.NTBL,$TEMP0 ;SAVE THE TABLE NUMBER FOR THE OUTPUT BUFFERU)W MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPINGG2X INC 2(SP) ;INDICATE AN ASSIGNMENT WAS FOLLOWED*Y BR 55$ ;GO FIND UCB IN PHYSICAL TABLESZ[ .IFF ;DF L$$GCL\7] MOV #$LOGHD,R2 ;GET LOGICAL ASSIGNMENT LIST LISTHEADT;^20$: MOV (R2),R2 ;POINT TO NEXT LOGICAL ASSIGNMENT BLOCKI_ BEQ 50$ ;IF EQ, END OF LISTB7` MOVB L.TYPE(R2),$TEMP0 ;IS THIS A GLOBAL ASSIGNMENT? )a ;SAVE TYPE TO RETURN TO USER LATER.6$b ;(NOTE, L.TYPE MUST BE USED IN+c ;CONJUNCTION WITH THE "GI.ATT" STATUSF*d ;BIT SINCE L.TYPE IS ZERO FOR GLOBALe ;ASSIGNMENTS.)*f BEQ 30$ ;IF EQ YES, DO NOT CHECK L.UCB<g CMP L.UCB(R2),T.UCB(R5) ;VALID ASSIGNMENT FOR TASK'S TI:?h BNE 20$ ;IF NE NOT+i30$: CMP R1,L.NAM(R2) ;DEVICE NAME MATCH?Vj BNE 20$ ;IF NE NOT)k CMPB R0,L.UNIT(R2) ;UNIT NUMBER MATCH? l BNE 20$ ;IF NE NOV/m MOV L.ASG(R2),R1 ;GET ASSIGNMENT UCB ADDRESS no ASSUME GI.ASN,1p1q INC (SP) ;INDICATE AN ASSIGNMENT WAS FOLLOWED +r BR 70$ ;GO FINISH RESOLVING DEVICE NAMEUst .IFTF ;DF L$$GCLPu1v40$: DRSTS D.RS92 ;RETURN INVALID DEVICE ERROR wx;SAy; AT THIS POINT, WE MUST CHECK THE SYSTEM DEVICE TABLES FOR THEFDz; A DEVICE WITH THE NAME SPECIFIED IN THE DPB SINCE FOR ONE REASONA{; OR ANOTHER THE SCAN OF THE LOGICAL ASSIGNMENTS CAME UP EMPTY. D|; A CALL TO $CVDVN WILL NOT FUNCTION CORRECTLY AT THIS POINT SINCE5}; PSEUDO DEVICES ARE IGNORED BY THE $SCDVT ROUTINE.(~;;850$: CLR $TEMP0 ;INIT WORD CONTAINING ASSIGNMENT TYPE+ ;SINCE WE EITHER COULDN'T FIND ONE ORP55$: .IFT ;DF L$$GCL8 MOV R2,R1 ;RESTORE DEVICE MNEMONIC FOR PHYSICAL SCAN2 MOV (SP)+,R3 ;RESTORE THE OUTPUT BUFFER ADDRESS .ENDC ;DF L$$GCLI'57$: MOV #$DEVHD,R2 ;GET DCB LISTHEADA% ;(PHYSICAL SYSTEM DEVICE TABLE)N!60$: MOV (R2),R2 ;GET NEXT DCBC+ BEQ 40$ ;IF EQ, DEVICE IS NOT IN SYSTEMT' CMP R1,D.NAM(R2) ;DEVICE NAME MATCH?  BNE 60$ ;IF NE NO> CMPB R0,D.UNIT(R2) ;IS THIS THE DCB FOR THE SPECIFIED UNIT? BLO 60$ ;IF LO NOR  CMPB R0,D.UNIT+1(R2) ;REALLY? BHI 60$ ;IF HI NO5 SUB D.UNIT(R2),R0 ;CONVERT TO RELATIVE UNIT NUMBER) BIC #177400,R0 ;CLEAR MUNGED HIGH BYTEA0 MOV D.UCBL(R2),R1 ;GET LENGTH OF UCB IN BYTES/ CALL $MUL ;CALCULATE OFFSET FOR DESIRED UCBS- ADD D.UCB(R2),R1 ;CALCUALTE ADDRESS OF UCBX;CG; AT THIS POINT, WE'VE FOUND A RAW UCB. THAT IS TO SAY, THE REDIRECTSCF; HAVE NOT BEEN FOLLOWED AND THE VIRTUAL TERMINAL CHECK HAS NOT BEENC; PERFORMED. ONLY THE PARENT OR OFFSPRING TASK OF A GIVEN VT UNITUD; MAY RETRIEVE INFO ON THE UNIT SINCE THEIR EXISTENCE IS ACCOUNTED; FOR IN THE VT USE COUNT.;C; CURRENTLY:; R1 = RAW UCB ADDRESSV ; R3 = POINTER TO USER BUFFER4; R5 = TCB ADDRESS OF ISSUING TASK (ALSO CURRENT); 2(SP) = EXTRA WORD COUNTU ; (SP) = SCRATCH STATUS WORD; 70$: .IF DF V$$TRM9 ASSUME U.DCB,0 ;ASSUME THAT THE FIRST WORD OF THE UCBV  ;IS THE POINTER TO THE DCB$ MOV (R1),R2 ;POINT TO UNIT'S DCB8 CMP D.NAM(R2),#"VT ;IS THE DEVICE A VIRTUAL TERMINAL? BNE 80$ ;IF NE NOX1 CMP U.PTCB(R1),R5 ;IS ISSUING TASK THE PARENT? BEQ 80$ ;IF EQ YES2 CMP R1,T.UCB(R5) ;IS ISSUING TASK AN OFFSPRING?# BNE 40$ ;IF NE NO, RETURN ERRORI .ENDC ;V$$TRM'000edccccc80$: MOV R1,R0 ;COPY RAW UCB ADDRESSH( CALL $MPLND ;MAP TO REAL UCB ADDRESS# CMP R1,R0 ;WAS UNIT REDIRECTED?S BEQ 90$ ;IF EQ, NO1 BIS #GI.RED,(SP) ;REMEMBER UNIT WAS REDIRECTEDM90$: ;edp040D; ;edp040U; THE GET DEVICE INFORMATION AND SON OF GET DEVICE INFORMATION SUBFUNCTIONS ;edp040S(; DIVERGE AT THIS POINT. ;edp040; ;edp040F CMPB G.INSF-G.IUNM(R4),#6 ; IS IT "GET DEVICE INFORMATION"? ;edp040' BEQ 91$ ; YES, CONTINUE. ;edp0406 JMP $SFDVJ ; NO, USE THE JUNIOR VERSION. ;edp04091$: ;edp040; ;edp040F; NOW THAT WE HAVE A "REAL" UCB ADDRESS, THE DEVICE STATUS ;edp040K; RETURNED IN "G.IDEV" IS DETERMINED. ALONG THE WAY, THE USER'S ;edp040HM; VARIABLE LENGTH BUFFER IS FILLED IN WHEN NEEDED AND IF POSSIBLE. ;edp040S; ;edp040> MOVB U.STS(R0),(R3)+ ; PLACE U.STS IN USER BUFFER ;edp040! MOVB U.ST2(R0),R1 ; ;**-6A, MOVB R1,(R3)+ ;PLACE U.ST2 IN USER BUFFER- BIC #CLRMSK,-(R3) ;CLEAR OUT UNNEEDED BITSR( SWAB R1 ;MOV US.OFL INTO HIGH BIT OF ROR R1 ;LOW ORDER BYTE* BIC #^C<200>,R1 ;CLEAR ALL BUT 'GI.OFL', BIS R1,(R3) ;'OR' IN UNIT OFFLINE STATUS7 BIS (SP)+,(R3) ;'OR' IN ASSIGNMENT AND REDIRECT INFO* MOV (SP)+,R4 ;RETRIEVE EXTRA WORD COUNT. MOV U.CW1(R0),R1 ;GET U.CW1 FOR USER BUFFER. MOV R1,-(SP) ;AND SAVE IT AS WELL FOR LATER* MOV R5,-(SP) ;SAVE ISSUER'S TCB ADDRESS. MOV R3,R5 ;COPY TOP OF USER BUFFER ADDRESS/ TST (R3)+ ;POINT TO START OF OPTIONAL WORDSN( CALL XMIT ;COPY U.CW1 TO USER BUFFER$ MOV U.PRM(R0),R1 ;DITTO FOR U.PRM CALL XMIT ;0( MOV U.PRM+2(R0),R1 ;DITTO FOR U.PRM+2 CALL XMIT ; * MOV R0,R1 ;RETURN 'TARGET' DEVICE NAME100$: CALL DNFILL ;2 BCS 110$ ;IF CS, NO USER BUFFER ROOM TO RETURN ;L.TYPE INFO- MOVB $TEMP0,-1(R3) ;RETURN ASSIGNMENT INFOS-110$: MOV U.ATT(R0),R1 ;IS DEVICE ATTACHED?  BEQ 120$ ;IF EQ NO  BIS #GI.ATT,(R5) ;TELL ISSUER2 CMP R1,(SP) ;IS IT THE ISSUER WHO IS ATTACHED? BEQ 120$ ;IF EQ NO/ BIS #GI.ATU,(R5) ;RETURN THIS STATUS AS WELLD2120$: CALL TNFILL ;RETURN TASK NAME OF ATTACHEE! MOV (SP)+,R2 ;GET ISSUER'S TCBT) MOV U.OWN(R0),R1 ;IS DEVICE ALLOCATED?  BEQ 130$ ;IF EQ NO" BIS #GI.ALL,(R5) ;RETURN STATUS3 CMP T.UCB(R2),R1 ;IS ALLOCATOR THE ISSUER'S TI:?M BNE 130$ ;IF NE NO/ BIS #GI.ALU,(R5) ;RETURN THIS STATUS AS WELLT5130$: CALL DNFILL ;RETURN DEVICE NAME OF ALLOCATORT" MOV U.SCB(R0),R1 ;VIA THE SCB..) MOV S.KRB(R1),R1 ;GET THE DEVICE'S KRBF0 BEQ 140$ ;IF EQ, CANN'T DETERMINE CONTROLLER ;STATUS.: BIT #KS.OFL!KS.PDF,K.STS(R1) ;IS THE CONTROLLER OFFLINE ;OR PDF? BEQ 140$ ;IF EQ NO% BIS #GI.OFL!GI.COF,(R5) ;TELL USERF1140$: MOV U.DCB(R0),R1 ;CHECK IF DRIVER LOADED?T TST D.DSP(R1) ;LOADED?H BNE 150$ ;IF NE YES1" BIS #GI.UNL,(R5) ;RETURN STATUS) BR 190$ ;NOTHING MORE TO RETURN..EXITD)150$: COM (SP) ;COMPLEMENT SAVED U.CW1> BIT #DV.MNT!DV.MSD,(SP) ;MASS STORAGE AND MOUNTABLE DEVICE? BNE 190$ ;IF NE NO* BITB #US.MNT,U.STS(R0) ;DEVICE MOUNTED? BNE 190$ ;IF NE NO# MOV U.VCB(R0),R2 ;GET DEVICE VCBR2 BEQ 190$ ;BAIL OUT..CAN'T TOUCH U.ACP TILL VCB  ;SET UP.+ MOV U.ACP(R0),R1 ;GET TCB ADDRESS OF ACP14 CALL TNFILL ;SO ACP NAME CAN BE RETURNED TO USER6 BIT #DV.SQD,(SP) ;IS DEVICE AN ANSI LABLED MAGTAPE?5 BNE 155$ ;IF NE NO (COPY OF U.CW1 IS COMPLEMENTED5 ;ON STACK)) BITB #US.LAB,U.STS(R0) ;IS IT "LABLED", BEQ 155$ ;IF EQ NO"  BIS #GI.LAB,(R5) ;RETURN STATUSD 155$: CMP R4,#/2 ;USER BUFFER BIG ENOUGH FOR LABLE?  BLT 190$ ;IF LT NO!  ADD #V.LABL,R2 ;POINT TO LABLEL1  MOV (R2)+,(R3)+ ;COPY FIRST SIX BYTES OF LABLE MOV (R2)+,(R3)+ ; MOV (R2)+,(R3)+ ;. BIT #GI.LAB,(R5) ;IS IT A LABLED ANSI TAPE? BEQ 180$ ;IF EQ NO; MOV V.MVL(R0),R1 ;POINT TO FIRST MOUNTED VOL. LIST ENTRY(5 BEQ 180$ ;IF EQ THERE ISN'T ONE,JUST RETURN LABELT;160$: CMP M.UCB(R1),R0 ;DEVICE UCB MATCH WITH TH008edb`TADATADATADATADATADATAIS ENTRY? BEQ 170$ ;IF EQ YESR( MOV M.NXT(R1),R1 ;GET NEXT LIST ENTRY BNE 160$ ;CONTINUE SCAN 3 BR 180$ ;ELSE AT END OF LIST..JUST RETURN LABLEI0170$: MOV R1,R2 ;COMPUTE ADDRESS OF VOLUME ID ADD #M.VIDP,R2 ;V6180$: MOV (R2)+,(R3)+ ;FINISH RETURNING VOLUME LABLE  MOV (R2)+,(R3)+ ;OR VOLUME ID MOV (R2)+,(R3)+ ;190$: TST (SP)+ ;CLEAN STACK  RETURN ;ALL DONE..RETURNQ ! .ENABLE LSB"#/$TNFILL: TST R1 ;WAS A TCB ADDRESS SPECIFIED?E)% BEQ 20$ ;IF EQ NO..GO ADJUST POINTERS01& MOV T.NAM+2(R1),-(SP) ;GET SECOND HALF OF NAMEE#' MOV T.NAM(R1),R1 ;AND FIRST HALF ( BR 10$ ; )DNFILL: (* TST R1 ;WAS A UCB ADDRESS SPECIFIED?(+ BEQ 20$ ;IF EQ NO.GO ADJUST POINTERS, MOV U.DCB(R1),R2 ;GET DCB- TST (R2)+ ;SKIP LINK WORDE6. SUB (R2)+,R1 ;CALCULATE OFFSET INTO CONTIGUOUS UCBS#/ MOV (R2)+,-(SP) ;GET DEVICE NAMEC/0 MOV (R2)+,-(SP) ;GET LOW LOGICAL UNIT NUMBERE1 MOV (R2)+,R2 ;GET UCB SIZE /25$: SUB R2,R1 ;DETERMINE LOGICAL UNIT NUMBERQ 3 BMI 6$ ;4 INC (SP) ; 5 BR 5$ ;)#66$: MOV 2(SP),R1 ;GET DEVICE NAMEM!7 MOV (SP)+,(SP) ;CLEAN UP STACK78 BIC #^C<377>,(SP) ;CLEAR OUT HIGH ORDER GARBAGE BYTEC0910$: CALL XMIT ;FILL IN A WORD IN USER BUFFER: MOV (SP)+,R1 ;GET NEXT WORD;XMIT: CLC ;ASSUME SUCCESS'< DEC R4 ;ENOUGH ROOM IN USER BUFFER?I= BMI 40$ ;IF MI NO++> MOV R1,(R3)+ ;RETURN WORD TO USER BUFFER;? BR 30$ ;EXIT GRACEFULLY$@20$: SUB #2,R4 ;ADJUST WORD COUNT-A BMI 40$ ;IF MI WE'RE AT THE END OF BUFFERBB ADD #4,R3 ;ADJUST POINTER !C30$: TST (PC)+ ;RETURN SUCCESSI!D40$: SEC ;RETURN ERROR STATUSU E RETURN ;CF G .DSABL LSBAHH ;edp040BH ;edp040TH ;edp040UH ;edp040PH;+ ;edp0407H; **-$SFDVJ-SON OF GET DEVICE INFORMATION ;edp040UH; ;edp040HH; THIS GIN SUBFUNCTION RETURNS INFORMATION ABOUT A PARTICULAR ;edp040HH; DEVICE. THE DPB AND METHOD OF DETERMINING THE DEVICE TO BE ;edp040BH; EXAMINED ARE IDENTICAL TO THE GET DEVICE INFORMATION ;edp040JH; SUBFUNCTION, EXCEPT THAT THE SUBFUNCTION IS 18 RATHER THAN 6. ;edp040H; ;edp040CH; THE CURRENT MINIMUM AND MAXIMUM BUFFER LENGTH IS ONE. ;edp0404H; ;edp040IH; INPUT AT THIS POINT (AFTER COMMON PROCESSING IN $SFDEV) IS: ;edp040 H; ;edp0401H; R1 -- UCB OF DEVICE TO BE CHECKED ;edp040I/H; R3 -- POINTER TO USER'S BUFFER ;edp040D3H; R5 -- POINTER TO ISSUING TASK'S TCB ;edp0400EH; STACK -- TWO UNNEEDED WORDS ARE ON THE STACK (ALONG WITH ;edp040=H; THE RETURN ADDRESS AND REMAINING INFORMATION). ;edp040 H; ;edp040/H; OUTPUT IN THE USER BUFFER IS: ;edp040FH; ;edp040H; FIRST WORD: ;edp040EH; NEGATIVE -- CODE INDICATING WHY DEVICE CANNOT CURRENTLY ;edp040 0H; BE ACCESSED AS A MOUNTED DEVICE. ;edp040FH; NON-NEGATIVE -- BITS DESCRIBING ACCESS TO MOUNTED DEVICE: ;edp0407H; BITS 0 TO 3: WHICH TYPES OF ACCESS ARE ;edp0405H; PROHIBITED (R, W, E, D, LOW TO HIGH), ;edp040 *H; BIT 4: DEVICE IS PUBLIC, ;edp0406H; BIT 5: DEVICE IS ALLOCATED TO ISSUER, ;edp040/H; BIT 6: DEVICE IS FOREIGN, AND ;edp040F6H; BIT 7: THE FOREIGN DEVICE HAS AN ACP. ;edp040;H; NOTE THAT BITS 4 AND 5 OFF TOGETHER INDICATE ;edp040 ;H; THE DEVICE IS MOUNTED BY THE ISSUER, BUT NOT ;edp040&H; ALLOCATED OR PUBLIC. ;edp040H;- ;edp040dH ;edp040 )H; DEFINE PROTECTION BITS. ;edp040!HR = 000001 ; READ ;edp040 "HW = 000002 ; WRITE ;edp040"HC = 000004 ; CREATE ;edp040"HD = 000010 ; DELETE ;edp040%H; DEFINE OTHER BITS. ;edp040G1HGJ.PUB = 000020 ; DEVICE IS PUBLIC. ;edp040E<HGJ.ALL = 000040 ; DEVICE IS PRIVATE (ALLOCATED). ;edp0402HGJ.FOR = 000100 ; DEVICE IS FOREIGN. ;edp0406HGJ.ACP = 000200 ; FOREIGN DEVICE HAS ACP. ;edp040&H; DEFINE OTHER CODES. ;edp040FHGJ.NMM = -1 ; DEVICE IS NOT BOTH MASS-STORAGE AND MOUNTABLE.;edp040;HGJ.NMO =00@edccccc -2 ; DEVICE IS NOT MOUNTED FOR ISSUER. ;edp040dH ;edp040 H$SFDVJ: ;edp0407H MOV R0,R1 ; PUT UCB IN PREFERRED REGISTER. ;edp046 ?H CMP (SP)+,(SP)+ ; POP UNNEEDED BITS AND WORD COUNT. ;edp040J>H MOV U.CW1(R1),R0 ; GET FIRST CHARACTERISTICS WORD. ;edp040-H COM R0 ; REVERSE SENSE OF BITS. ;edp040AH BIT #DV.MNT!DV.MSD,R0 ; IS IT NOT MASS STORAGE OR NOT ;edp040HH ; MOUNTABLE? ;edp040*H BNE 90$ ; YES, RETURN CODE. ;edp040;H BITB #US.MNT,U.STS(R1) ; IS DEVICE NOT MOUNTED? ;edp040F0H BNE 95$ ; YES, THERE IS NO ACCESS. ;edp040DH MOV #GJ.PUB,(R3) ; ASSUME PUBLIC UNTIL PROVEN OTHERWISE. ;edp0407H BITB #US.PUB,U.ST2(R1) ; IS DEVICE PUBLIC? ;edp040D6H BNE 20$ ; YES, SKIP REST OF MOUNT CHECKS. ;edp040DH MOV #GJ.ALL,(R3) ; ASSUME PRIVATE UNTIL PROVEN OTHERWISE.;edp040=H MOV T.UCB(R5),R0 ; GET ISSUER'S TI: UCB ADDRESS. ;edp040e=H CMP U.OWN(R1),R0 ; DOES ISSUER HAVE IT ALLOCATED? ;edp040U4H BEQ 20$ ; YES, IT IS MOUNTED FOR USER. ;edp0402H TST U.OWN(R1) ; IS DEVICE ALLOCATED? ;edp040;H BNE 95$ ; YES, DEVICE IS NOT MOUNTED FOR USER. ;edp040C1H CLR (R3) ; IT MUST BE SEMI-PRIVATE. ;edp040.:H BIT #T3.PRV,T.ST3(R5) ; IS ISSUER PRIVILEGED? ;edp0404H BNE 20$ ; YES, IT IS MOUNTED FOR USER. ;edp0406H MOV #$MOULS,R2 ; GET START OF MOUNT LIST. ;edp040H10$: ;edp040S,H MOV (R2),R2 ; GET NEXT ENTRY. ;edp0406H BEQ 95$ ; DEVICE IS NOT MOUNTED FOR USER. ;edp040<H CMPB #MT.MLS,M.TYPE(R2) ; CORRECT TYPE OF ENTRY? ;edp040+H BNE 10$ ; NO, GO ON TO NEXT. ;edp040ECH CMP M.DEV(R2),R1 ; IS IT THE DEVICE WE ARE LOOKING FOR? ;edp040 $H BNE 10$ ; NO, GO ON. ;edp040<H CMP M.TI(R2),R0 ; IS THIS ENTRY FOR OUR ISSUER? ;edp040$H BNE 10$ ; NO, GO ON. ;edp0401H; DEVICE IS MOUNTED FOR THIS USER. ;edp040NH20$: ;edp040 ?H BITB #US.FOR,U.STS(R1) ; IS DEVICE MOUNTED FOREIGN? ;edp0404H BEQ 100$ ; NO, HANDLE FILES-11 DEVICE. ;edp0409H BIS #GJ.FOR,(R3) ; YES, REPORT THAT TO USER. ;edp0400.H TST U.ACP(R1) ; IS THERE AN ACP? ;edp040$H BEQ 80$ ; NO, LEAVE. ;edp0402H BIS #GJ.ACP,(R3) ; YES, REPORT THAT. ;edp040H80$: ;edp040M H RETURN ; LEAVE. ;edp040H90$: ;edp040E@H MOV #GJ.NMM,(R3) ; INDICATE DEVICE IS NOT MOUNTABLE. ;edp040H RETURN ;edp040 H95$: ;edp040UAH MOV #GJ.NMO,(R3) ; INDICATE DEVICE IS NOT MOUNTED FOR ;edp040 H ; USER. ;edp040H RETURN ;edp040RH100$: ;edp040:H BIT #T3.PRV,T.ST3(R5) ; IS ISSUER PRIVILEGED? ;edp0409H BNE 190$ ; YES, THEY CAN DO ALMOST ANYTHING. ;edp040P+H MOV KISAR6,-(SP) ; SAVE APR. ;edp040 .H MOV $SAHDB,KISAR6 ; MAP HEADER. ;edp0403H MOV $SAHPT,R2 ; GET ADDRESS OF HEADER. ;edp040I2H MOV H.DUIC(R2),R0 ; GET DEFAULT UIC. ;edp040>H MOV H.CUIC(R2),R2 ; GET CURRENT (PROTECTION) UIC. ;edp040.H MOV (SP)+,KISAR6 ; RESTORE APR. ;edp0402H CLR -(SP) ; ASSUME NO SYSTEM ACCESS. ;edp040>H CMP R2,#10*400+377 ; IS ISSUER IN A SYSTEM GROUP? ;edp040;H BHI 120$ ; NO, DO NOT GIVE THEM SYSTEM ACCESS. ;edp040M-H INC (SP) ; FLAG SYSTEM ACCESS. ;edp040SH120$: ;edp040DH MOV U.VCB(R1),R4 ; GET LOCATION OF VOLUME CONTROL BLOCK. ;edp040@H BIT #FE.MUP,$FMASK ; IS THIS A MULTI-USER PROTECTION ;edp040H ; SYSTEM? ;edp0402/H BEQ 140$ ; NO, SKIP USER CHECKS. ;edp040BH CMP T.UCB(R5),U.OWN(R1) ; DOES ISSUER OWN THIS DEVICE? ;edp0406H BEQ 130$ ; YES, GIVE THEM SYSTEM ACCESS. ;edp040(H TST (SP) ; SYSTEM GROUP? ;edp0406H BNE 140$ ; YES, SKIP VOLUME OWNER CHECK. ;edp040>H CMP T.UCB(R5),V.VOWN(R4) ; DOES ISSUER OWN VOLUME? ;edp0407H BNE 140$ ; NO, DO NOT GRANT SYSTEM ACCESS. ;edp040 H130$: ;edp0406H INC (SP) ; THIS ISSUER HAS SYSTEM ACCESS. ;edp040+H MOV R0,R2 ; USE DEFAULT UIC. ;edp0401H140$: ;edp040'H SWAB R2 ; REFORMAT UIC. ;edp040)3H MOV V.VOWN(R4),R0 ; GET VOLUME OWNER. ;edp040 7H MOV V.VPRO(R4),R4 ; GET VOLUME PROTE00Hedb`TADATADATADATADATADATACTION. ;edp040 'H SWAB R0 ; REFORMAT UIC. ;edp040 -H COM R4 ; CHANGE SENSE OF BITS. ;edp040P9H TSTB (SP)+ ; DOES ISSUER HAVE SYSTEM ACCESS? ;edp0409H BNE 150$ ; YES, DO NOT REFUSE SYSTEM ACCESS. ;edp0403:H CMPB R2,#10 ; DOES ISSUER HAVE SYSTEM ACCESS? ;edp040:H BLOS 150$ ; YES, DO NOT REFUSE SYSTEM ACCESS. ;edp040=H BIC #R!W!C!D,R4 ; ELIMINATE SYSTEM ACCESS RIGHTS. ;edp040eH150$: ;edp040+H CMP R2,R0 ; IS ISSUER OWNER? ;edp040V8H BEQ 160$ ; YES, DO NOT REFUSE OWNER ACCESS. ;edp040@H BIC #*20,R4 ; ELIMINATE OWNER ACCESS RIGHTS. ;edp040H160$: ;edp0406H CMPB R0,R2 ; IS ISSUER IN OWNER'S GROUP? ;edp0408H BEQ 170$ ; YES, DO NOT REFUSE GROUP ACCESS. ;edp040AH BIC #*400,R4 ; ELIMINATE GROUP ACCESS RIGHTS. ;edp040 H170$: ;edp0401H MOV R4,-(SP) ; COPY REMAINING BITS. ;edp040 5H SWAB (SP) ; MOVE HIGH BYTE TO LOW BYTE. ;edp04005H BIS R4,(SP) ; MERGE HIGH AND LOW BYTES. ;edp0401*H MOV (SP),R4 ; COPY RESULT. ;edp0405H ASR R4 ; MOVE HIGH NYBBLE TO LOW NYBBLE. ;edp040RH ASR R4 ; ;edp040 H ASR R4 ; ;edp040 H ASR R4 ; ;edp040O7H BIS (SP)+,R4 ; MERGE HIGH AND LOW NYBBLES. ;edp040C.H COM R4 ; RESTORE ORIGINAL SENSE. ;edp040>H BIC #^C,R4 ; GET RID OF EXTRANEOUS BITS. ;edp040H BR 200$ ;edp040NH190$: ;edp040.H CLR R4 ; GIVE ISSUER EVERYTHING. ;edp040H200$: ;edp0409H BIT #DV.SWL,U.CW1(R1) ; DEVICE WRITE-LOCKED? ;edp040U/H BEQ 210$ ; NO, LEAVE BITS ALONE. ;edp040 9H BIS #W!C!D,R4 ; ONLY READ ACCESS IS ALLOWED. ;edp040 H210$: ;edp0409H BIS R4,(R3) ; PASS DENIED ACCESSES TO USER. ;edp040YH RETURN ;edp040 IJKL;+M; **-$SFAPR-GET TASK APRSCN;CEO; THIS SUBFUNCTION FILLS A 97. WORD BUFFER WITH THE CONTENTS OF THE4GP; PARS/PDRS FOR ALL THE SPACES. THE FIRST WORD INDICATES WHICH OF THE0#Q; SUBSEQUENT WORDS ARE FILLED IN.#R;LS; SPACE WORD 0. BIT(T; ----------------------- -----------U;I,V; KERNEL I SPACE PAR'S (UNCONDITIONAL),W; KERNEL I SPACE PDR'S (UNCONDITIONAL)%X; KERNEL D SPACE PAR'S (000001) %Y; KERNEL D SPACE PDR'S (000001)R,Z; USER I SPACE PAR'S (UNCONDITIONAL),[; USER I SPACE PDR'S (UNCONDITIONAL)%\; USER D SPACE PAR'S (000002) %]; USER D SPACE PDR'S (000002) %^; SUPER I SPACE PAR'S (000004)I%_; SUPER I SPACE PDR'S (000004)L%`; SUPER D SPACE PAR'S (000004)T%a; SUPER D SPACE PDR'S (000004)-b;c; DPB FORMAT: d;E$e; WD. 00 -- DIC(169.),DPB SIZE(4.)"f; WD. 01 -- SUBFUNCTION CODE (9)g; WD. 02 -- BUFFER ADDRESS"h; WD. 03 -- BUFFER SIZE IN WORDSi;0 j; INPUTS:Rk; +l; R3=ADDRESS OF FIRST WORD OF USER BUFFER "m; R5=TCB ADDRESS OF CURRENT TASKn; o; OUTPUTS:p;(&q; THE BUFFER IS FILLED WITH THE APRSr;-s t MASK = 0 u .IIF DF K$$DAS, MASK=MASK!1v .IIF DF U$$DAS, MASK=MASK!2w .IIF DF S$$LIB, MASK=MASK!4x:y$SFAPR::MOV #MASK,(R3)+ ;INSERT MASK OF WHAT WILL FOLLOW)z MOV #$APRTB,R0 ;GET TABLE OF ADDRESSES ){10$: MOV (R0)+,R1 ;GET NEXT APR ADDRESS)| BEQ 20$ ;IF EQ END OF LIST#} MOV (R1)+,(R3)+ ;MOVE A REGISTER#~ MOV (R1)+,(R3)+ ;MOVE A REGISTERS# MOV (R1)+,(R3)+ ;MOVE A REGISTER5# MOV (R1)+,(R3)+ ;MOVE A REGISTER# MOV (R1)+,(R3)+ ;MOVE A REGISTERI# MOV (R1)+,(R3)+ ;MOVE A REGISTER # MOV (R1)+,(R3)+ ;MOVE A REGISTER# MOV (R1)+,(R3)+ ;MOVE A REGISTERI BR 10$ ;GO AGAIN20$: RETURN ;O;++; **-SFFTK-FIND TASK AND RETURN TASK INFO#;B9; THIS GIN FUNCTION RETURNS INFORMATION ON A TASK WHICH D; MAY HAVE ITS TCB IN SECONDARY OR PRIMARY POOL. GIVEN A TASKNAME,D; THIS GIN FUNCTION WILL ATTEMPT TO FIND A TASK AS DESCRIBED BELOW; IN THE $SRTTK ROUTINE.;(F; THE INFORMATION IS RETURNED TO A USER BUFFER HAVING A MINIMUM SIZED; OF TWO WORDS AND A MAXIMUM SIZE OF SIX WORDS. THIS FUNCTION WILLI; RETURN AS MUCH OF THE FOLLOWING INFORMATION AS THE USER BUFFER'S S00PedcccccIZE; ALLOWS FOR.S;F;A; DPB FORMAT:K;#; +---------------+N; | 6. | 169. |T; +---------------+; |SUBFUNCTION=10.|E; +---------------+.; | BUFFER ADDRESS| ; +---------------+A; | BUFFER WDSIZE |S; +---------------+N; | |; +- TASKNAME -+H; | |; +---------------+E;F; USER BUFFER FORMAT:;F; +---------------+ |S ; | | |9; +- TASKNAME -+ | THE FIRST TWO WORDS ARE REQUIRED.N ; | | |; +---------------+ |Z; | T.STAT |; +---------------+ ; | T.ST2 |; +---------------+; | T.ST3 |T; +---------------+; | T.ST4 |N; +---------------+-; | |; +- P.NAM -+; | |; +---------------+R;-3$SFFTK::MOV R3,-(SP) ;SAVE ADDRESS OF USER BUFFER & MOV R2,-(SP) ;SAVE EXTRA WORD COUNT' MOV R4,R3 ;COPY POINTER TO TASKNAME  CALL $SRTTK ;SEARCH FOR TCB% BCS 30$ ;IF CS TASK NOT INSTALLEDO, MOV KISAR6,-(SP) ;SAVE OLD KISAR6 MAPPING( BIT #1,R0 ;IS TCB IN SECONDARY POOL? BEQ 5$ ;IF EQ NO DEC R0 ;RESET FLAG MOV (R0),KISAR6 ;MAP TO TCB MOV #140000,R0 ;POINT AT IT65$: MOV #$TNAME,R1 ;POINT TO TEMP LOCATIONS IN SYSCM$ ADD #T.NAM,R0 ;POINT TO TASK NAME: MOV (R0)+,(R1)+ ;COPY TASKNAME INTO TEMPORARY LOCATIONS MOV (R0)+,(R1)+ ;, ADD #T.STAT-,R0 ;POINT TO T.STAT MOV (R0)+,(R1)+ ;COPY T.STATK MOV (R0)+,(R1)+ ;COPY T.ST2 MOV (R0),(R1) ;COPY T.ST3% MOV T.ST4-T.ST3(R0),R2 ;COPY T.ST4I% MOV T.PCB-T.ST3(R0),R4 ;COPY T.PCBP9 MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPING ( USER BUFFER )() MOV (SP)+,R5 ;RESTORE EXTRA WORD COUNTP/ MOV (SP)+,R3 ;RESTORE POINTER TO USER BUFFERO& MOV #$TNAME,R1 ;POINT TO SAVED INFO  MOV (R1)+,(R3)+ ;RETURN T.NAM MOV (R1)+,(R3)+ DEC R5 ;ROOM FOR MORE? BMI 20$ ;IF MI NO#! MOV (R1)+,(R3)+ ;RETURN T.STATT DEC R5 ;ROOM FOR MORE? BMI 20$ ;IF MI NO1 MOV (R1)+,(R3)+ ;COPY T.ST2 DEC R5 ;ROOM FOR MORE? BMI 20$ ;IF MI NOI MOV (R1)+,(R3)+ ;COPY T.ST3 DEC R5 ;ROOM FOR MORE? BMI 20$ ;IF MI NO  MOV R2,(R3)+ ;COPY T.ST4+- CMP R5,#2 ;TWO MORE WORDS LEFT FOR P.NAM?  BLT 20$ ;IF LT NOR" MOV P.NAM(R4),(R3)+ ;COPY P.NAM MOV P.NAM+2(R4),(R3)+ 20$: RETURNT530$: DRSTS D.RS2 ;RETURN DIRECTIVE ERROR OF IE.INS;+J; **-$SRTTK-SEARCH FOR PROTOTYPE OR NON-PROTOTYPE OR MULTI-USER TASK TCB;II; THIS ROUTINE SEARCHES FOR A TCB WHICH IS ASSOCIATED WITH THE TASKNAME?; AS FOLLOWS: ;I@; IF THE TASKNAME IS OF THE FORM "...XXX" THEN A CHECK IS MADEB; FOR THE MULTI-USER TASKNAME "XXXTNN" WHERE NN IS DERIVED FROMB; THE UCB ADDRESS PASSED IN R0. IF NOT FOUND THEN THE PROTOTYPE; IS SEARCHED FOR.A; IF THE TASKNAME IS OF THE FORM "XXX$$$" THEN A SEARCH IS MADE =; ONLY FOR THE PROTOTYPE AS A DIFFERENT FORM OF MULTI-USERPA; TASKNAME EXISTS FOR DECNET PROTOTYPES SINCE THIS NAME IS NOTU"; DERIVED FROM THE UCB ADDRESS.A; IF THE TASKNAME IS OF NEITHER OF THE ABOVE FORMS, A SEARCH OFN=; PRIMARY POOL IS MADE FOR A NON-PROTOTYPE TCB BEARING THEM; TASKNAME SPECIFIED.B; IF THIS TASKNAME COULD NOT BE FOUND AND IT IS LIMITED TO THREEB; CHARACTERS THEN AN ADDITIONAL SEARCH IS MADE FOR A MULTI-USER; TASK OR PROTOTYPE.$;N ; INPUTS:M;*; R3=ADDRESS OF TASK NAME TO SEARCH FOR.;F ; OUTPUTS:;T;; C=1 IF TASK NAME OR THE PERMUTATIONS COULD NOT BE FOUND"; C=0 IF SPECIFIED TASK IS FOUND!; R3=ADDRESS OF TASKNAME FOUNDF(; (COULD BE DIFFERENT FROM INPUT)(; R0=ADDRESS OF TCB IN POOL (IF EVEN). ; R0=ADDRESS OF KISAR5 BIAS OF TCB (IF ODD) ; ASSUMPTIONS: ; B ; A MULTI-USER TASK NAME WILL BE DERIVED FROM THE UCB ADDRESS OFB ; THE TI: OF THE CURRENT TASK. IF THIS IS INAPPROPRIATE, USE THE>; ALTERNATE ENTRY POINT $SRTSK AND SUPPLY THE CORRECT TI UCB; ADDRESS IN R0.;- $SRTTK::$ MOV $TKTCB,R0 ;GET CURRENT TASK'S$ MOV T.UCB(R0),R0 ;TI: UCB ADDRESS $SRTSK::( CMP (R3)+,#^R... ;RSX PROTOTYPE NAME? B00Xedb`TADATADATADATADATADATANE 50$ ;IF NE NOU4 TST (R3) ;DOES 2ND HALF NAME HAVE NAME OF PROTO? BEQ 50$ ;IF EQ NOO' MOV (R3),R1 ;PICK UP PROTOTYPE NAME/10$: CALL $SRMUT ;SEARCH FOR MULTI-USER TASK 0 BCC 90$ ;IF CC FOUND IT AS "XXXTnn"..SUCCESS9 MOV (R3)+,(R3) ;TRY FOR PROTYPE..FORM NAME FROM $TNAME " MOV #^R...,-(R3) ;INTO "...XXX"620$: CALL $SRPRO ;SEARCH SECONDARY AND PRIMARY POOL)  BR 90$ ;ALL THAT CAN BE DONE HAS BEENR8!50$: CMP (R3),#^R$$$ ;2ND HALF OF NAME INDICATE DECNET" ;OR SPECIAL PROTOTYPE?# BNE 60$ ;IF NE NO;.$ MOV -(R3),R1 ;DOES DECNET PROTO HAVE A NAME+% ;ALSO POINT TO BEGINNING OF TASK NAMEO1& BEQ 70$ ;IF EQ NO NOT DECNET PROTOTYPE JUST AS' ;"$$$" TASK$( BR 20$ ;GO FIND IT;)60$: MOV -(R3),R1 ;POINT TO BEGINNING OF TASKNAME AND GET -* ;FIRST HALF OF NAME FOR LATER IF NEEDED"0+70$: MOV R0,R2 ;SAVE POSSIBLE TI: UCB POINTER6, CALL $SRSTD ;SEARCH PRIMARY POOL FOR NON-PROTOTYPE-- BCC 90$ ;IF CC FOUND IT .. RETURN SUCCESSE". MOV R2,R0 ;RESTORE UCB ADDRESS / TST 2(R3) ;3 CHAR NAME ONLY?00 BEQ 10$ ;IF EQ YES TREAT IT AS THE NAME OF A1 ;PROTOTYPE-280$: SEC ;COULDN'T FIND IT RETURN FAILURET390$: RETURN ;ALL DONE"456 .IFTF ; DF R$$PRO78 .IF DF P$$3XX9:;+,;; **-$SFCFG-GET SYSTEM CONFIGURATION TABLE<;L9=; THIS DIRECTIVE RETURNS THE SYSTEM CONFIGURATION TABLES<>; TO A USER BUFFER, TURNING IT UPSIDE DOWN IN THE PROCESS!A?; THE TABLE IS VARIABLE LENGTH LOCATED AT THE HIGHEST AVAILABLEME@; ADDRESS OF MEMORY DOWNWARDS. THE BYTE DESCRIBING THE SIZE OF THISQBA; TABLE IS AT THE HIGHEST ADDRESS. THIS DIRECTIVE WILL RETURN AS8B; MUCH OF THE TABLE THAT WILL FIT IN THE USER'S BUFFERC;DD; DPB FORMAT:.E;;#F; WD 00 -- DIC(169.),DPB SIZE(4.)#G; WD 01 -- SUBFUNCTION CODE (12.)UH; WD 02 -- BUFFER ADDRESSD!I; WD 03 -- BUFFER SIZE IN WORDSRJ; K; INPUTS:OL;E(M; R2 =NUMBER OF WORDS IN USER BUFFER-1 N; R3 =APR6 USER BUFFER ADDRESSO;H P; OUPUTS:HQ;H6R; THE USER'S BUFFER IS FILLED WITH THE REUESTED INFO4S; THE DSW CONTAINS THE NUMBER OF WORDS TRANSFERREDT;-U V$SFCFG::W INC R2 ;CORRECT WORD COUNT0X BIT #H2.BRG,$HFMSK+2 ;IS THIS A PROFESSIONAL?Y BNE NOTPRO ;IF NE NO2Z MOV #$PARHD,R0 ;PICK UP MAIN PARTITION LISTHEAD,[10$: MOV (R0),R0 ;GET NEXT MAIN PARTITION*\ BEQ NOTPRO ;IF EQ COULDN'T FIND CNFTBL(] CMP P.NAM(R0),#^RCNF ;IS THIS CNFTBL?^ BNE 10$ ;IF NE NOF _ CMP P.NAM+2(R0),#^RTBL ;MAYBE` BNE 10$ ;IF NE NO TRY NEXT*a MOV P.REL(R0),R1 ;GET BASE OF PARTITION'b MOV P.SIZE(R0),R0 ;GET SIZE OF TABLEE)c ASH #5,R0 ;CONVERT TO NUMBER OF WORDS:4d CMP R0,R2 ;USER EXPECT MORE THAN WE CAN DELIVER?e BHIS 20$ ;IF HIS NOA4f MOV R0,R2 ;SET WORD CNT TO CNFTBL PARTITION SIZE*g20$: ASL R0 ;CONVERT WD COUNT TO OFFSET"h ADD #120000,R0 ;ADD KISAR5 BIAS=i CMP R0,#140000-64. ;COULD WE BLOW AWAY BIAS TO USER BUFFERIj BLOS 30$ ;IF LOS NO$*k DRSTS D.RS99 ;RETURN ERROR OF 'IE.SDP'7l30$: MOV R2,2(SP) ;RETURN NUMBER OF WORDS TRANSFERREDG+m CALLR $FLIPM ;EXIT TO FLIP MOVE ROUTINEE1nNOTPRO: DRSTS D.RS92 ;RETURN ERROR OF 'IE.IDU'OopqIDROM=173600 r$SFSSN::/s BIT #H2.BRG,$HFMSK+2 ;IS THIS A PROFESSIONALNt BNE NOTPRO ;IF NE NO(u MOV #IDROM,R0 ;GET ADDRESS OF ID PROM4v MOV #6,R1 ;SET UP LOOP COUNT TO TRANSFER 6 BYTESw CLR R2 ;CLEAR VALIDITY FLAG-)x10$: MOVB (R0),(R3)+ ;GET A BYTE OF SSNI5y BIS (R0),R2 ;'OR' WITH FLAG TO DETECT A 0 IDVALUER(z ADD #2,R0 ;POINT TO NEXT BYTE OF SSN{ SOB R1,10$ ;LOOP TILL DONE| TST R2 ;SSN ALL ZEROS?6} BEQ NOTPRO ;IF EQ YES, IT COULDN'T HAVE BEEN A PRO~ RETURN ;RETURN SUCCESS= .ENDC ; DF P$$3XX .IFF ; DF R$$PROP;+H; **-$SFABO - ABORT ALL TASKS CURRENTLY ACTIVE ON A SPECIFIED TERMINAL;#M; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ABORT ALL TASKS THAT ARE CURRENTLY/; ACTIVE ON THE TERMINAL SPECIFIED IN THE DPBS;,; DPB FORMAT:A;D%; WD. 00 -- DIC(169.),DPB SIZE(4.).T.; WD. 01 -- SUBFUNCTION CODE (1) (LOW BYTE).; WD00`edccccc. 02 -- BUFFER ADDRESS.?%; WD. 03 -- BUFFER SIZE (IN WORDS).T; ; BUFFER FORMAT:;R+; WD. 00 -- TERMINAL DEVICE NAME IN ASCII&; WD. 01 -- OCTAL NUMBER OF TERMINAL;F ; INPUTS:L;K,; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.(; R3=ADDRESS OF WD. 00. OF THE BUFFER.*; R5=TCB ADDRESS OF THE REQUESTING TASK.;IJ; THIS ROUTINE WILL TRY TO ABORT ALL TASKS CURRENTLY RUNNING OR ABOUT TOJ; RUN ON A TERMINAL SPECIFIED BY THE ASCII NAME AND OCTAL UNIT NUMBER INJ; THE BUFFER POINTED TO BY R3 IF THAT TASK HAS T3.MCR SET (IE. INITIATEDO; BY MCR AT SOME POINT. ALL OFFSPRING TASKS WILL ALSO BE ABORTED IF THEY CANK; BE TRACED BACK TO THE EARLIEST PARENT TASK THAT HAS T3.MCR SET (IE. THEEM; OFFSPRING DOES NOT NEED TO HAVE IT SET TO BE ABORTED). A PROMPT PACKET IS K; ISSUED FOR THE TERMINAL BECAUSE T3.MCR WILL BE CLEARED IN DREIF FOR ALLOI; TASKS THAT ARE ABORTED HERE. SLAVED TASKS AND THOSE NOT MATCHING THE L; SPECIFIED TI: WILL NOT BE ABORTED EVEN THOUGH THEY MAY HAVE PARENTS THATM; WILL BE. PRIVILEGED TASKS WILL BE ABORTED IF THE TERMINAL IS PRIVILEGED.IP; IF IT IS NOT, A PRIVILEGED TASK WILL BE ABORTED ONLY IF IT HAS AN SREX STYLE>; ABORT AST. TKTN WILL NOT BE CALLED FOR THE TASKS ABORTED.;OK; AN INITIAL PASS IS MADE TO SET T4.CTC FOR ANY TASK THAT HAS T3.MCR SET, J; DOES NOT HAVE A PARENT, AND MATCHES THE SPECIFIED TI:. THAT TASK WILLM; ALSO TRY TO BE ABORTED. IF ANY TASKS ARE FOUND IN THIS INITIAL PASS THAT I; HAVE T4.CTC SET, ANOTHER PASS IS MADE THROUGH THE STD. THIS TIME THESM; PARENTS OFF ALL TASKS ARE CHECKED TO SEE IF THEY HAVE T4.CTC SET. IF SO,GH; THE ORIGINAL (OFFSPRING) TASK ALSO HAS T4.CTC SET AND IS TRIED TO BEM; ABORTED. IF ANY OF THESE TASKS ARE FOUND, ANOTHER PASS THROUGH THE STD ISOI; DONE. EVENTUALLY NO TASKS WILL BE FOUND AND PROCESSING IS COMPLETED. L; THIS SCHEME ONLY REQUIRES 1 PASS IF NO TASKS CAN BE ABORTED; IT REQUIRESL; A MINIMUM OF 2 PASSES IF ANY TASKS MUST BE ABORTED AND MAY REQUIRE UP TOJ; N PASSES WHERE N IS THE LONGEST LINKAGE OF ANY RELATIONSHIP CHAIN THAT"; DOESN'T WRAP AROUND ON ITSELF.; B; (IS A PASS TO CLEAR T4.CTC FOR ANY TASK NOT ABORTED REQUIRED?);- .MCALL ABODF$  ABODF$T $SFABO:: .IF DF A$$CLI&C$$CTCE; BIT #T3.PRV!T3.CLI,T.ST3(R5) ;IS TASK PRIVILEGED OR CLI?S BNE 10$ ;IF NE, YESH% DRSTS D.RS16 ;PRIVILEGE VIOLATIONS-10$: MOV (R3)+,R0 ;GET ASCII NAME OF DEVICEF& MOV (R3),R1 ;GET OCTAL UNIT NUMBER3 CALL $CVDVN ;CONVERT DEVICE NAME TO UCB ADDRESSG BCC 20$ ;IF CC, SUCCESSFUL$15$: DRSTS D.RS92 ;INVALID DEVICE620$: BIT #DV.TTY,U.CW1(R2);IS THIS DEVICE A TERMINAL BEQ 15$ ;IF EQ, NO4 MOV R2,-(SP) ;SAVE UCB ADDRESS ACROSS PROMPT CALL) MOV #CC.EXT,R1 ;ISSUE TASK EXIT PROMPTB025$: CALL $QCNTP ;ISSUE PROMPT REQUEST TO MCR$ MOV (SP)+,R3 ;RESTORE UCB ADDRESS;DN; FIRST PASS TO LOOK FOR TASKS WITH MATCHING TI:, T3.MCR SET, AND NOT SLAVED;(2 CLR $DICSV ;CLEAR FLAG WORD FOR PROCESSED TASK- MOV $TSKHD,R1 ;GET POINTER TO START OF STDI=30$: MOV T.TCBL(R1),-(SP);STORE POINTER TO NEXT TASK IN STDB% BEQ 40$ ;IF EQ, THIS IS NULL TASKE! TST T.STAT(R1) ;IS TASK ACTIVEM BMI 40$ ;IF MI, NO, IGNORE7 BIT #T3.CLI,T.ST3(R1);IS THIS A CLI TASK? ;JRK331P0 BNE 40$ ;IF NE, YES, SKIP THIS ONE ;JRK3318 CMP R3,T.UCB(R1) ;DOES THE TASK MATCH THE UCB ADDRESS BNE 40$ ;IF NE, NO, IGNORE- BIT #T3.SLV,T.ST3(R1);IS THIS TASK SLAVED?C BNE 40$ ;IF NE, YES, IGNORER9 BIT #T3.MCR,T.ST3(R1);IS TASK ACTIVATED FROM TERMINAL?I' BEQ 40$ ;IF EQ, NO, IGNORE THIS ONEE> INC $DICSV ;INDICATE THAT WE'VE FOUND A TASK TO BE ABORTED< BIS #T4.CTC,T.ST4(R1);INDICATE THAT ANY OFFSPRING MUST GO* CALL ABORT ;ABORT THE TASK IF POSSIBLE*40$: MOV (SP)+,R1 ;RESTORE STD LINK WORD5 BNE 30$ ;IF NE, THERE ARE MORE TASKS IN THIS PASS 1 TST $DICSV ;CHECK IF ANY TASKS WERE PROCESSED 0 BEQ 100$ ;IF EQ, NO, SKIP ANY FURTHER PASSES;K; NEXT SET OF PASSES WILL GET TH00hedb`TADATADATADATADATADATAE OFFSPRING OF THE TASKS RECOGNIZED ABOVEF;E350$: CLR $DICSV ;RESTORE THE TASK PROCESSED FLAG- MOV $TSKHD,R1 ;GET POINTER TO START OF STDT=55$: MOV T.TCBL(R1),-(SP);STORE POINTER TO NEXT TASK IN STDI% BEQ 80$ ;IF EQ, THIS IS NULL TASKA! TST T.STAT(R1) ;IS TASK ACTIVE  BMI 80$ ;IF MI, NO, IGNORE7 BIT #T3.CLI,T.ST3(R1);IS THIS A CLI TASK? ;JRK331I0 BNE 80$ ;IF NE, YES, SKIP THIS ONE ;JRK3312 BIT #T4.CTC,T.ST4(R1);IS TASK ALREADY PROCESSED BNE 80$ ;IF NE, YES, IGNOREF8 MOV T.OCBH(R1),R4 ;GET POINTER TO LISTHEAD OF PARENTS; BEQ 80$ ;IF EQ, ALREADY PROCESSED IN FIRST PASS, IGNOREEA60$: MOV O.PTCB(R4),R5 ;GET NEXT PARENT TCB ADDRESS IN OCB LISTE- BEQ 70$ ;IF EQ, PARENT HAS EXITED, IGNORES5 BIT #T4.CTC,T.ST4(R5) ;CHECK IF PARENT HAS BIT SETB) BEQ 70$ ;IF EQ, NO, GO ON TO NEXT OCBT2 INC $DICSV ;INDICATE A TASK HAS BEEN PROCESSED= BIS #T4.CTC,T.ST4(R1) ;INDICATE THIS TASK IS PART OF CHAIN)& BR 75$ ;GO TRY TO ABORT IT AS WELL)70$: MOV (R4),R4 ;GET NEXT OCB ADDRESS;" BNE 60$ ;IF NE, THERE ARE MORE7 BR 80$ ;NO PARENT HAS T4.CTC SET, GO ON TO NEXT TCBR?75$: CMP R3,T.UCB(R1) ;DOES THIS TASK MATCH THE SPECIFIED TI:L6 BNE 80$ ;IF NE, NO, DON'T ABORT, BUT MARK AS CHAIN( BIT #T3.SLV,T.ST3(R1);CHECK IF SLAVED8 BNE 80$ ;IF NE, IT IS, DON'T ABORT BUT MARK AS CHAIN% CALL ABORT ;TRY TO ABORT THE TASKP880$: MOV (SP)+,R1 ;RESTORE THE POINTER TO THE NEXT TCB+ BNE 55$ ;IF NE, NO MORE TO DO THIS PASST2 TST $DICSV ;CHECK IF ANOTHER PASS IS NECESSARY BNE 50$ ;IF NE, YESR100$:E .IFTF ;A$$CLI&C$$CTC4  RETURN    .IFT ;A$$CLI&C$$CTC  ; 4; SUBROUTINE TO ATTEMPT TO ABORT A PARTICULAR TASK ; INPUTS:O*; R1 - TCB ADDRESS OF TASK TO BE ABORTED; R3 - UCB OF TI:L;3ABORT: MOV R3,-(SP) ;SAVE THE TI: UCB ACROSS CALLA# TSTB T.ST2(R1) ;IS TASK EXITING?T BMI 20$ ;IF MI, NO, IGNOREB MOV #AB.CTC,R2 ;SET UP THE DEFAULT SECONDARY ABORT CODE ;JRK322A BIT #U2.PRV,U.CW2(R3) ;IS ISSUING TERMINAL PRIVILEGED ;JRK322E9 BNE 10$ ;IF NE, YES, ANY TASK MAY BE ABORTED ;JRK322H BIS #AB.NPV,R2 ;INDICATE TERM NONPRIV IN SECONDARY ABORT CODE ;JRK3229 BIT #T3.PRV,T.ST3(R1);IS TASK TO BE ABORTED PRIVILEGEDB0 BEQ 10$ ;IF EQ, NO, CAN BE ABORTED BY ANYONE5 MOV R1,-(SP) ;SAVE THE CURRENT TCB POINTER ;**-2S, MOV R1,R5 ;COPY THE TCB ADDRESS FOR CALL: MOV #AS.REA,R4 ;GET EXIT AST CODE TO SEARCH IN LIST FOR+ CALL $SRAST ;SEARCH FOR AST IN TCB LISTT( MOV (SP)+,R1 ;RESTORE THE TCB ADDRESS4 BCS 20$ ;IF CS, NO AST AND TASK CAN'T BE ABORTED*  TSTB A.NPR(R0) ;SEE IF THIS IS SREX AST.! BNE 10$ ;IF NE, IT IS, TASK MAY BE ABORTED9" BIT #T2.REX,T.ST2(R1);SEE IF ABORT AST BEING PROCESSEDI.# BEQ 20$ ;IF EQ, NO, TASK CANNOT BE ABORTED@$10$: MOV #S.CTKN,R0 ;TELL DREIF THAT TKTN SHOULD NOT BE CALLED+% CALL $ABTSK ;ABORT TASK SPECIFIED BY R14&20$: MOV (SP)+,R3 ;RESTORE THE TI: UCB ACROSS CALL ' RETURNL() .ENDC ;A$$CLI&C$$CTCT*+ .ENDC ;R$$PRO,-.;+0/; **-$SFPMN-SET PERFORMANCE MONITOR PARAMETERS0;'=1; THIS DIRECTIVE PASSES USER PARAMETERS P1 TO P8 IN THE DPBEA2; TO THE PERFORMANCE MONITOR USING THE SPM HOOKPOINT MECHANISM.S@3; SPM HOOKPOINTS ARE TURNED ON AND OFF ON THE FLY BY REPLACINGI4; TWO INSTRUCTION WORDS WITH AN INSTRUCTION TO TRANSFER CONTROL TO SPM.A5;6; DPB FORMAT:A7;T%8; WD. 00 -- DIC(169.),DPB SIZE(10.)R09; WD. 01 -- SUBFUNCTION CODE (11.) (LOW BYTE).:; WD. 02 -- PARAMETER #1;; WD. 03 -- PARAMETER #2<; WD. 04 -- PARAMETER #3=; WD. 05 -- PARAMETER #4>; WD. 06 -- PARAMETER #5?; WD. 07 -- PARAMETER #6@; WD. 08.-- PARAMETER #7A; WD. 09.-- PARAMETER #8B;H C; INPUTS:AD;S#E; R3=ADDRESS OF WD. 02 IN THE DPBD&F; R5=TCB ADDRESS OF THE CURRENT TASKG;T H; OUTPUTS:I;N@J; THE 8. DPB PARAMETERS ARE PASSED TO THE PERFORMANCE MONITOR.K;L;-MNO .IF DF P$$MON.PQ;+R; ** W A R N I N G **(S;(T; SPM HOOKPOINT NUMBER 34.U; +V; DO NOT CHANGE THE INSTRUCT00peuecccccION FOLLOWING W; LABEL WITHOUT CHECKING SPMX;-Y-Z$SPH34==. ;SPM CHANGES THE INSTRUCTION ATE![ ;THE LOCATION OF THIS LABEL\ ]$SFPMN::^ NOP_ NOP ` RETURN ;a .ENDCbc;+/d; **-$SFUPD-UPDATE UICS AND DEFAULT DIRECTORY #e; ALTERNATE ENTRY POINT TO $SFUICNf; Hg; THIS DIRECTIVE TAKES THE DEFAULT UIC AND THE PROTECTION UIC FROM THEMh; UCB OF THE TERMINAL (U.UIC AND U.LUIC) AND COPIES THEM INTO THE HEADER OFOMi; THE TASK (H.DUIC AND H.CUIC RESPECTIVELY). IT SETS THE DEFAULT DIRECTORYEKj; OF THE TASK TO BE THE SAME AS THE DEFAULT DIRECTORY OF THE TERMINAL, IFA(k; DIFFERENT. IT THEN JUMPS TO $SFUIC.l;Sm; DPB FORMAT:n;%o; WD. 00 -- DIC(169.),DPB SIZE(4.). 0p; WD. 01 -- SUBFUNCTION CODE (17.) (LOW BYTE).q; WD. 02 -- BUFFER ADDRESS.N%r; WD. 03 -- BUFFER SIZE (IN WORDS).Fs;Ut; BUFFER FORMAT:u; 'v; DESCRIBED (AND FILLED IN) IN $SFUICAw;L x; INPUTS:Ey;M1z; R2 - NUMBER OF EXTRA WORDS IN THE USER BUFFERI({; R3 - ADDRESS OF WD. 00 IN THE BUFFER/|; R5 - ADDRESS OF THE TCB OF THE CURRENT TASKA};I ~; OUTPUTS:;I>; THE UICS IN THE HEADER OF THE REQUESTING TASK ARE UPDATED.M; THE DEFAULT DIRECTORY STRING FOR THE TASK IS SET TO THAT OF THE TERMINAL.T;O;7;- .MCALL LNMDF$  LNMDF$R $SFUPD:: .IF DF X$$HDR( MOV KISAR6,-(SP) ;SAVE BUFFER MAPPING% MOV $SAHDB,KISAR6 ;MAP TASK HEADERF) MOV $SAHPT,R0 ;GET TASK HEADER ADDRESSM .IFF ;DF X$$HDR) MOV $HEADR,R0 ;GET TASK HEADER ADDRESSH .IFTF ; DF X$$HDR! MOV T.UCB(R5),R1 ;GET TI: UCB: MOV U.UIC(R1),H.DUIC(R0) ;MOVE DEFAULT UIC INTO HEADER= MOV U.LUIC(R1),H.CUIC(R0) ;MOVE PROTECTION UIC INTO HEADERE .IFT ;DF X$$HDR, MOV (SP)+,KISAR6 ;RESTORE BUFFER MAPPING .ENDC ;DF X$$HDRD"; RESET DEFAULT DIRECTORY STRING= CMP T.CTX(R5),U.CTX(R1) ;IS TERMINAL CONTEXT SAME AS TASK?$ BEQ 10$ ;IF EQ, INDICATE SUCCESS) MOV T.CTX(R5),R1 ;GET TERMINAL CONTEXTE- CALL $DLCTX ;DELETE TASKS CURRENT CONTEXT;& MOV T.UCB(R5),R1 ;GET TI: UCB AGAIN@ MOV U.CTX(R1),T.CTX(R5) ;SET TASK CONTEXT TO TERMINAL CONTEXT BEQ 10$ ;IF EQ, DONE! MOV KISAR6,-(SP) ;SAVE MAPPINGH* MOV U.CTX(R1),KISAR6 ;MAP CONTEXT BLOCK/ INCB C.REF+140000 ;INCREMENT REFERENCE COUNTC$ MOV (SP)+,KISAR6 ;RESTORE MAPPING,10$: JMP $SFUIC ;FILL IN BUFFER WITH INFO .END SAME AS TASK?$ BEQ 10$ ;IF EQ, INDICATE SUCCESS) MOV T.CTX(R5),R1 ;GET TERMINAL CONTEXTE- CALL $DLCTX ;DEL .TITLE DREIFC .IDENT /15.07/C; ; COPYRIGHT (C) 1987$; BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;D>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;T ; D. N. CUTLER 13-SEP-73 ;a ;- ; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:H ;  ; J. W. BERZLE ; J. R. KAUFFMAN ; J. M. LAWLER ; B. S. MCCARTHY ; L. B. MCCULLEY ;. ; MODIFIED BY: ; # ; B. S. MCCARTHY 20-OCT-86 15.00 ;D+ ; BM374 -- ADD LAT APPLICATIONS TERMINAL ; DISCONNECT CALL ;A# ; B. S. MCCARTHY 13-DEC-86 15.01 ;H" ; BM377 -- MOVE DREIF TO DIR11M ;A# ; B. S. MCCARTHY 6-MAR-87 15.02  ;D3 ; BM385 -- ADD $RLMCB TO DREIF SO THAT DRGCL CAN  ; BE MOVED TO VEC11M ;# ; B. S. MCCARTHY 7-MAR-87 15.03. ;H5 ; BM387 -- IF WINDOW I/O MANAGEMENT IS ENABLED AND - ; I/O IS OUTSTANDING ON A LUN WITH A FILE3 ; OPEN AT I/O RUNDOWN, DON'T DEACCESS THE FILE.O ; # ; B. S. MCCARTHY 8-MAY-87 15.04P ;T* ; BM397 -- FIX VARIOUS MAPPING PROBLEMS ; % ; L. M. ZIEGLER 12-JUNE-1987 15.05 ;B= ; LMZ048 -- ADD SUPPORT FOR REMOTE TASK TERM. NOTIFICATION7 ;0" ; K. L. NOEL 24-JUNE-1987 15.06 ;I= ; KLN054 -- ADD SPECIAL CASE CODE FOR REMOTE TASK KILL I/O  ;T$ ; B. S. MCCARTHY 14-AUG-87 15.07 ;F* ; BM397 -- FIX VARIOUS MAPPING PROBLEMS ;  ;T7; EXIT DIRECTIVESH8;L9; MACRO LIBRARY CALLSD:;D;3< .MCALL 00xedb`TADATADATADATADATADATAABODF$,HDRDF$,PCBDF$,PKTDF$,TCBDF$,BGCK$A- < .MCALL CPRDF$ ; LMZ048< ; LMZ048< CPRDF$ ; LMZ048=$> ABODF$ ;DEFINE TASK ABORT CODES'? HDRDF$ ;DEFINE TASK HEADER OFFSETSF3@ PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS&A PKTDF$ ;DEFINE I/O PACKET OFFSETS.B TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETSCDE .IF DF A$$CNTFG .MCALL ACNDF$,H ACNDF$ ;DEFINE ACCOUNTING BLOCK OFFSETSIJ .ENDCKL .IF DF L$$GCLMN .MCALL LNMDF$O P LNMDF$HQR .ENDCSTU;BV; LOCAL SYMBOL DEFINITION W;MX2YCLRMSK=T2.AST!T2.DST!T2.SEF!T2.HLT!T2.ABO!T2.REX?ZCLRMSK=CLRMSK!<*2>!T2.STP!T2.SPN!T2.WFRK$ZMAP6=140000 ;APR 6 ; LMZ048[\;+]; **-$DREIF-EXIT IF^;TI_; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF THEFC`; ISSUING TASK IF, AND ONLY IF, AN INDICATED EVENT FLAG IS CLEAR.Fa;Cb; DPB FORMAT:Fc;$d; WD. 00 -- DIC(53.),DPB SIZE(2.).Ae; WD. 01 -- EVENT FLAG NUMBER OF EVENT FLAG THAT MUST BE CLEAR. f; g; INPUTS:Th;i; R0=EVENT FLAG MASK WORD.j; R1=EVENT FLAG MASK ADDRESS.;k; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.K-l; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.+1m; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.I.n; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.o;F7p; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)Aq;C/r; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.->s; DIRECTIVE STATUS OF 'D.RS22' IS RETURNED IF THE SPECIFIEDt; EVENT FLAG IS SET.!u; C=1 IF DIRECTIVE IS REJECTED.0;v; DIRECTIVE STATUS OF 'D.RS97' IF NO OR AN INVALID EVENT w; FLAG NUMBER IS SPECIFIED.Dx;-y z .ENABL LSBz ; BM377A z .IF NDF D$$PAR ; BM377z ; BM377 ){$DREIF::BIT R0,(R1) ;EVENT FLAG CLEAR?C| BEQ $DREXT ;IF EQ YESF&} DRSTS D.RS22 ;SET DIRECTIVE STATUS~;+; **-$DREXT-EXIT;FI; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF THES; ISSUING TASK.E;D; DPB FORMAT:G;E$; WD. 00 -- DIC(51.),DPB SIZE(1.).; ; INPUTS:A;F;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.E-; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. 1; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. .; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R?; NOTE: THIS DIRECTIVE IS ALSO CALLED FROM THE DISPATCHER ANDT9; THEREFORE ONLY REQUIRES R5 TO BE LOADED ON ENTRANCE.E;R?; PRIVILEGED TASKS WHICH DESIRE TO CALL $DREXT DIRECTLYA>; SHOULD SWITCH TO SYSTEM STATE AND IMMEDIATELY CALL $DREXT0; WITHOUT CALLING ANY OTHER EXEC SUBROUTINES.0; THIS IS BECAUSE OF POSSIBLE SIDE EFFECTS OF*; OTHER EXEC ROUTINES (SUCH AS $TSKRP).; 2; BECAUSE MANY PRIVILEGED TASKS CALL $DREXT, WE5; WILL UNCONDITIONALLY MAP THE TASK HEADER SO THATO3; THIS CODE DOES NOT HAVE TO BE ADDED ELSEWHERE. ;;T7; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)R; B; NO STATUS IS RETURNED TO THE ISSUING TASK SINCE THIS DIRECTIVE; TERMINATES ITS EXECUTION.D;-$DREXT:: ;REFERENCE LABELL .IF DF X$$HDR- MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADERT .ENDC ; DF X$$HDR .IF DF P$$OFF) BIT #T3.ACP,T.ST3(R5) ;IS TASK AN ACP?E BNE $DREX1 ;IF NE YESO7 MOV #EX$SUC,T.EFLG+2(R5) ;SET SUCCESSFUL EXIT STATUSO@$DREX2::MOV #S.CEXT,T.EFLG(R5) ;SET SUCCESS CODE IN ABORT CODE .ENDC $DREX1:: ; BM377R" .IFF ; NDF D$$PAR ; BM377 ; BM377M7$DREX3:: ;REFERENCE LABEL FOR STUB ROUTINE ; BM377  ;IN DRSUB ; BM377H .IF DF K$$DAS ; BM397  ; BM397D MOV KINAR5,KDSAR5 ;REMAP IN D SPACE (IN CASE CALLED FROM ; BM397 ;SCHEDULER) ; BM397 ; BM397E" .ENDC ; DF K$$DAS ; BM397 ; BM377U# .ENDC ; NDF D$$PAR ; BM377; ; BM377B ;**-6N .IF DF, G$$GEF1, BIT #T2.AST,T.ST2(R5) ;TASK IN AST STATE? BEQ 500eueccccc6$ ;IF EQ NO 0 BIT #T2.WFR*2,T.ST2(R5) ;WAS TASK IN AST WFR? BEQ 56$ ;IF EQ NO 1 MOV H.EFSV(R4),R3 ;GET EVENT FLAG MASK ADDRESSM2 CALL $DEAGF ;DEACCESS GROUP GLOBAL EVENT FLAGS56$:, MOV $SAHPT,R4 ;GET ADDRESS OF TASK HEADER0 CALL $UNLCK ;UNLOCK GROUP GLOBAL EVENT FLAGS# BCS 57$ ;IF CS ALREADY UNLOCKED + CALL $ELIM ;ELIMINATE THEM IF NECESSARY )57$: MOV $TKTCB,R5 ;RESTORE TCB POINTER* .ENDC ; DF G$$GEF* CALL $DRCMT ;CANCEL MARK TIME REQUESTS .IF DF D$$MND4 CMP $TKTCB,$DITCB ;IS DIAMOND WATCHING THIS TASK? BNE 101$ ;IF NE NO) BIC #1,@$DICSR ;RESET DIAMOND REGISTERS! CLR $DITCB ;CLEAR TCB ADDRESS 101$: ;REFERENCE SYMBOL .ENDC .IF DF C$$INT& MOV T.PCB(R5),R4 ;POINT TO TASK PCB= BIT #PS.CHK,P.STAT(R4) ;DOES TASK POSSIBLY HAVE ANY ITB'S?; BEQ 2$ ;IF EQ NO11$: MOV P.DPCB(R4),R1 ;PICK UP NEXT ITB POINTER BEQ 2$ ;IF EQ NONE LEFT .IF DF D$$PAR5 MOV #$DISIN,-(SP) ;PUSH ADDRESS OF DISABLE ROUTINEC. CALL $MPDC2 ;CALL THROUGH INDIRECT ROUTINE .IFF ; DF D$$PAR, CALL $DISIN ;DISCONNECT INTERRUPT VECTOR .ENDC ; DF D$$PAR BR 1$ ;E2$: ;REF LABEL .ENDC .IF DF M$$PRO) CLR T.RRM(R5) ;REMOVE ALL CPU AFFINITYS .ENDC .IF DF D$$PAR1 MOV $DRAPR,KINAR5 ;MAP THE DIRECTIVE PARTITIONC .ENDC+  CALL $RLMCB ;RELEASE MCR COMMAND BUFFERP.  CMP R5,$LSTLK ;TASK OWN MCR DATA BASE LOCK?  BNE 3$ ;IF NE NO'  CLR $LSTLK ;CLEAR OWNER TCB ADDRESS- 3$: BIS #T2.HLT,T.ST2(R5) ;SET TO HALT TASKD+ CLRB $CXDBL ;CLEAR CONTEXT DISABLE FLAG 8 MOV T.SAST(R5),R0 ;GET ADDRESS OF SPECIFIED AST BLOCK BEQ 5$ ;IF EQ LIST IS EMPTY< MOV R0,@T.ASTL+2(R5) ;MOVE SPECIFIED AST LIST TO AST LIST54$: MOV R0,R1 ;COPY ADDRESS OF SPECIFIED AST BLOCK;* MOV (R0),R0 ;GET ADDRESS OF NEXT BLOCK, BNE 4$ ;IF NE THERE ARE MORE IN THE LIST% MOV R1,T.ASTL+2(R5) ;SET LIST TAILD+ CLR T.SAST(R5) ;ASTS NO LONGER SPECIFIED$#5$: JSR R5,MTQUE ;EMPTY AST QUEUE$. .WORD T.ASTL ;OFFSET TO AST QUEUE LISTHEAD1 .WORD $DEACB ;ADDRESS OF DEALLOCATION ROUTINES5 BIT #T3.NSD!T3.ACP,T.ST3(R5) ;FLUSH RECEIVE QUEUE?5 BNE 7$ ;IF NE NO .IF DF P$$OOL# CALL MTRCVL ;EMPTY RECEIVE LISTT ! .IFF0"$# JSR R5,MTQUE ;EMPTY RECEIVE QUEUE2$ .WORD T.RCVL ;OFFSET TO RECEIVE QUEUE LISTHEAD1% .WORD $DEPKT ;ADDRESS OF DEALLOCATION ROUTINE.&' .ENDC()*7$: ;REF LABEL5+, .IF DF X$$HDR-1. MOV $SAHPT,R4 ;GET CURRENT TASK HEADER ADDRESST/0 .IFFT112 MOV $HEADR,R4 ;GET CURRENT TASK HEADER ADDRESSA34 .ENDC567 .IF DF P$$LAS8*9 BIT #T3.REM,T.ST3(R5) ;REMOVE ON EXIT ?6: BNE 71$ ;IF NE, YES - $REMOV WILL HANDLE THIS CASE; MOV R5,R0 ;COPY TCB ADDRESS0< CALL $CLSRF ;REMOVE IT FROM ALL RREF PACKETS=71$: ;REFERENCE LABEL1> JSR R5,MTQUE ;EMPTY RECEIVE BY REFERENCE QUEUET3? .WORD T.RRFL ;OFFSET TO RECEIVE BY REF LISTHEADE1@ .WORD $DEPKT ;ADDRESS OF DEALLOCATION ROUTINE AB .ENDCCD>E8$: MOV #SCNLN,-(SP) ;SET ADDRESS OF LUT SCANNING CO-ROUTINE'F TSTB T.IOC(R5) ;ANY I/O OUTSTANDING?FG BNE 9$ ;IF NE YES#5H TSTB T.TIO(R5) ;TASK HAVE OUTSTANDING BUFFERED I/O I BEQ 30$ ;IF EQ NOEI9$: ; KLN054 .I .IF DF C$$RTK ;IF REMOTE TASK ; KLN054I ; KLN054=I BIT #F5.RTK,$FMSK5 ;ARE REMOTE TASKS BEING USED ; KLN054E"I BEQ 99$ ;IF EQ NO ; KLN054I; ; KLN054LNI; ALLOCATE A PACKET FOR THE GENERIC DRIVER TO USE TO KILL I/O WITH ; KLN054I; ; KLN054S,I CLR $CPPKT ;ASSUME NO PACKET ; KLN0548I CLR $CPLUN ;INDICATE ALL I/O TO BE KILLED ; KLN054I ; KLN054<I TSTB T.LBN(R5) ;TASK HAD ANY CONTACT WITH HOST? ; KLN054;I BEQ 99$ ;IF EQ NO, NO NEED TO ALLOCATE CPRBUF ; KLN054 I ; KLN054JI MOV #AL$SWS,R0 ;INDICATE THAT WE ARE CALLING FROM SYSTEM STATE ; KLN054-I MOV #1,R1 ;GET JUST ONE BLOCK ; KLN054 .I CALL 00edb`TADATADATADATADATADATA$CPALO ;ALLOCATE A PACKET ; KLN0544I BCC 92$ ;IF CC - ALLOCATION SUCCEEDED ; KLN054*I CLR R0 ;INDICATE NO PACKET ; KLN054FI92$: MOV R0,$CPPKT ;SAVE PACKET ADDRESS FOR GENERIC DRIVER ; KLN054I ; KLN054 I .ENDC ;C$$RTK ; KLN054I99$: ; KLN054AI BIT #T2.ABO,T.ST2(R5) ;TASK ALREADY MARKED FOR ABORT ; KLN054 K BNE 10$ ;IF NE YES ;**-1'L MOV #S.IOMG,R0 ;SET REASON FOR ABORTS#M CALL $ABCTK ;ABORT CURRENT TASKGCN10$: MOV (SP),-(SP) ;DUPLICATE ADDRESS OF LUT SCANNING CO-ROUTINE *O20$: CALL @(SP)+ ;GET NEXT ASSIGNED LUN,P BCS 30$ ;IF CS END OF LOGICAL UNIT TABLE2Q CALL $IOKIL ;KILL I/O ON UNIT FOR CURRENT TASKR BR 20$ ;GO AGAINR30$: ;KLN054 R .IF DF C$$RTK ;KLN054 R ;KLN054 =R BIT #F5.RTK,$FMSK5 ;ARE REMOTE TASKS BEING USED? ;KLN054O!R BEQ 35$ ;IF EQ NO ;KLN054 R ;KLN054M8R MOV $CPPKT,R0 ;GET ADDRESS OF CPRBUF PACKET ;KLN0549R BEQ 35$ ;IF NONE, IT WAS ALREADY DEALLOCATED ;KLN054O7R CALL $CPDEA ;OTHERWISE, DEALLOCATE IT NOW ;KLN054 R ;KLN0543R .ENDC ;C$$RTK ;KLN054BR35$: ;KLN054 1R CALL @(SP)+ ;GET NEXT ASSIGNED LUN ;KLN0544T BCS 100$ ;IF CS END OF LOGICAL UNIT TABLE ;**-1T ; BM374N%T .IF DF M$$NET&T$$LTH ; BM374 T ; BM374K7T CALL LTPRE ;TELL LAT PROCESS IF NECESSARY ; BM374KT ; BM374,(T .ENDC ; DF M$$NET&T$$LTH ; BM374T ; BM374E7U CMP $TKTCB,U.ATT(R5) ;UNIT ATTACHED TO CURRENT TASK?OV BNE 40$ ;IF NE NO *W MOV #IO.DET,R4 ;SET DETACH I/O FUNCTION X BR 50$ ;'Y40$: MOV (R1),R2 ;FILE OPEN ON UNIT?Z BEQ 30$ ;IF EQ NO '[ ASR R2 ;ACCESS OR DEACCESS PENDING?F\ BCS 30$ ;IF CS YES4\ BIT $WCFLG,U.CW1(R5) ;DEVICE FILES-11? ; BM3870\ BEQ 45$ ;IF EQ NO, ALWAYS DEACCESS ; BM387A\ TSTB W.IOC(R2) ;I/O IN PROGRESS THROUGH WINDOW BLOCK? ; BM387M0\ BNE 30$ ;IF NE YES, DON'T DEACCESS ; BM387;\45$: MOV #IO.CLN,R4 ;SET CLOSE LUN I/O FUNCTION ; BM387 -^50$: CMP (SP)+,(SP)+ ;CLEAN STACK ;**-1#0_ MOV R1,-(SP) ;SAVE ADDRESS OF SECOND LUN WORD-` MOV #I.LGTH,R1 ;SET LENGTH OF BLOCK NEEDEDQ$a CALL $ALOCB ;ALLOCATE I/O PACKET4b MOV (SP)+,R3 ;RETRIEVE ADDRESS OF SECOND LUN WORD&c BCS TKWSE ;IF CS NO CORE AVAILABLE)d MOV R0,R1 ;COPY ADDRESS OF I/O PACKETS#e TST (R0)+ ;POINT TO SECOND WORD 4f MOV $TKTCB,R2 ;GET ADDRESS OF TCB OF CURRENT TASK/g MOVB T.IOC(R2),-(SP) ;SAVE CURRENT I/O COUNT#2h INCB T.IOC(R2) ;INCREMENT OUTSTANDING I/O COUNT-i MOVB T.PRI(R2),(R0)+ ;SET REQUEST PRIORITY'j CLRB (R0)+ ;CLEAR EVENT FLAG NUMBER 0k MOV R2,(R0)+ ;INSERT CURRENT TASK TCB ADDRESS2l MOV R3,(R0)+ ;INSERT ADDRESS OF SECOND LUN WORD#m MOV R5,(R0)+ ;INSERT UCB ADDRESS )n MOV R4,(R0)+ ;INSERT I/O FUNCTION CODEE@o MOV #/2,-(SP) ; WORDS REMAINING IN I/O PACKET1p55$: CLR (R0)+ ; CLEAR REMAINDER OF I/O PACKETTq DEC (SP) ; DONE?r BNE 55$ ; IF NE NO,s MOV #$DRQRQ,(SP) ; ASSUME QUEUE TO DRIVER+t CMP #IO.CLN,R4 ; CLOSE LUN I/O FUNCTION?2u BNE 70$ ; IF NE NO$v MOV (R3),R4 ; GET WINDOW ADDRESSw INC (R3) ; INTERLOCK LUN2x MOV U.VCB(R5),R3 ; GET VCB ADDRESS, REALLY ONE?y BEQ 60$ ; IF EQ NO1z INC (R3) ; INCREMENT VOLUME TRANSACTION COUNTV+{ BIT #DV.F11,U.CW1(R5) ; FILES-11 DEVICE?#| BEQ 60$ ; IF EQ NO.} INCB W.IOC(R4) ; INCREMENT WINDOW I/O COUNT~;+; ** W A R N I N G **T;D; SPM HOOKPOINT NUMBER 21.;N+; DO NOT CHANGE THE INSTRUCTION FOLLOWINGR; LABEL WITHOUT CHECKING SPM;--$SPH21==. ;SPM CHANGES THE INSTRUCTION AT4! ;THE LOCATION OF THIS LABEL ! MOV U.ACP(R5),R0 ; SET ACP TCB + MOV #$EXRQP,(SP) ; QUEUE DIRECTLY TO ACPF160$: BISB #200,I.EFN(R1) ; SET VIRTUAL I/O FLAG 5 MOV T.ATT(R2),R3 ; GET FIRST ATTACHMENT DESCRIPTOR+ INCB A.IOC-A.TCBL(R3) ; LOCK DOWN HEADERR5 MOV A.PCB-A.TCBL(R3),R3 ; POINT TO TASK REGION PCB*4 INCB P.IOC(R3) ; LOCK REGION BY INC'ING I/O COUNT070$: CALL @(SP)+ ; QUEUE THE PACKET SOMEWHERE00eueccccc .IF DF X$$HDR& MOV $SAHDB,KISAR6 ; RESTORE MAPPING .ENDC4 MOV $TKTCB,R5 ;GET ADDRESS OF TCB OF CURRENT TASK2 CMPB T.IOC(R5),(SP)+ ;REQUEST ALREADY FINISHED?! BHI 80$ ;IF HI NO ; BM387) JMP 8$ ; ; BM387@80$: MOV T.ASTL(R5),R0 ;GET ADDRESS OF FIRST AST BLOCK ;**-1  BEQ 85$ ;IF EQ THERE IS NONE TSTB A.CBL(R0) ;KERNEL AST ?T4 BMI TKWSE ;IF MI YES, RUNDOWN BIT MIGHT DEADLOCK:85$: BIS #TS.RDN,T.STAT(R5) ;SET I/O RUNDOWN IN PROGRESS1TKWSE: CALLR $TKWSE ;WAITFOR SIGNIFICANT EVENT,2100$: TSTB T.IOC(R5) ;ANY I/O STILL OUTSTANDING? BNE 80$ ;IF NE YES5 TSTB T.TIO(R5) ;TASK HAVE OUTSTANDING BUFFERED I/OA BNE 80$ ;IF NE YES  .DSABL LSB -RNDWN: ;PARENT/OFFSPRING-RELATED RUNDOWN: .IF DF P$$OFF3 MOV $TSKHD,R0 ;POINT TO FIRST INSTALLED TASK TCBE820$: TST T.RDCT(R5) ;ANY RUNDOWN OPERATIONS REMAINING? BEQ 60$ ;IF EQ NO < MOV T.TCBL(R0),-(SP) ;SAVE POINTER TO NEXT INSTALLED TASK, BEQ 30$ ;IF EQ CURRENT TASK IS NULL TASK- ADD #T.OCBH,R0 ;POINT TO OCB QUEUE OF TASK 025$: MOV (R0),R0 ;POINT TO NEXT ENTRY IN LIST  BEQ 30$ ;IF EQ THERE IS NONE1 CMP O.PTCB(R0),R5 ;IS EXITING TASK THE PARENT?B BNE 25$ ;IF NE NOR* DEC T.RDCT(R5) ;DECREMENT RUNDOWN COUNT3 CLR O.PTCB(R0) ;INDICATE PARENT TASK HAS EXITTEDS .IF DF G$$GEF0 CMP O.EFN(R0),#64. ;GROUP GLOBAL EVENT FLAG ? BLOS 25$ ;IF LOS NO! MOV R0,-(SP) ;SAVE OCB POINTER * MOV O.EFN(R0),R0 ;GET EVENT FLAG NUMBER0 CALL $CEFI ;CONVERT TO MASK AND MASK ADDRESS+ MOV R1,R3 ;COPY EVENT FLAG MASK ADDRESSP2 CALL $DEAGF ;DEACCESS GROUP GLOBAL EVENT FLAGS$ MOV (SP)+,R0 ;RESTORE OCB POINTER .ENDC ; DF G$$GEF" BR 25$ ;TRY TO REMOVE ANY MORE(30$: MOV (SP)+,R0 ;RESTORE TCB ADDRESS BNE 20$ ;IF NE NO  .IF DF V$$TRM6 MOV $VTDCB,R1 ;POINT TO SECOND VIRTUAL TERMINAL UCB940$: TST T.RDCT(R5) ;ANY OUTSTANDING CREATED VT: UNITS?N BEQ 60$ ;IF EQ NOR4 CMP D.NAM(R1),#"VT ;STILL GOING THROUGH VT UNITS? BEQ 45$ ;IF EQ YES1 RETURN ;ELSE $ALOCB FAILURE IN $ELMVT - WAIT /45$: MOV (R1),-(SP) ;SAVE ADDRESS OF NEXT DCBV2 MOV D.UCB(R1),R0 ;POINT TO VIRTUAL TERMINAL UCB< CMP U.PTCB(R0),R5 ;WAS THIS UNIT CREATED BY EXITING TASK? BNE 50$ ;IF NE NOS+ CALL $ELMVT ;MARK UNIT FOR DEALLOCATION$&50$: MOV (SP)+,R1 ;POINT TO NEXT DCB  BR 40$ ; .ENDC .ENDC660$: ADD #T.ST2,R5 ;POINT TO SECOND TASK STATUS WORD+ BIT #T2.ABO,(R5) ;TASK MARKED FOR ABORT?  BEQ 110$ ;IF EQ NO: MOV $TKNPT,R0 ;GET TERMINATION NOTIFICATION TCB ADDRESS .IF DF R$$PROB .IIF NDF P$$OFF, .ERROR ;P/OS REQUIRES PARENT OFFSPRING SUPPORT* BNE 2000$ ;IF NE TKTN IS IN THE SYSTEM+ TST T.OCBH-T.ST2(R5);TASK HAVE A PARENT?N1 BNE 110$ ;IF NE YES - OK, GO ON WITH THE EXITC BGCK$A BF.XIT,BE.NPA,FATAL ;A SYSTEM TASK (ONE WITHOUT A PARENT)& ;ABORTED WITH NO TKTN - BUGCHECK .IFF ;R$$PROA- BEQ 110$ ;IF EQ TKTN IS NOT IN THE SYSTEMR .ENDC ;R$$PROG2000$: CMP $TKTCB,R0 ;TERMINATION NOTIFICATION TASK BEING TERMINATED? BEQ 103$ ;IF EQ YESIA CMPB #S.CTKN,T.EFLG-T.ST2(R5) ;PREVENT TKTN FROM BEING CALLED?E BNE 101$ ;IF NE, NO A BIC #T3.MCR,T.ST3-T.ST2(R5) ;PREVENT PROMPT FROM BEING ISSUED0  BR 110$ ;CONTINUE PROCESSING101$:3 BIS #TS.MSG,-(R5) ;SET ABORT MESSAGE IN PROGRESSU6 CALL $EXRQN ;REQUEST TERMINATION NOTIFICATION TASK+ CALLR $TKWSE ;WAITFOR SIGNIFICANT EVENTK/103$: MOV $ACTHD,R0 ;GET ADDRESS OF FIRST TCB9107$: BIC #TS.MSG,T.STAT(R0) ;CLEAR WAITING FOR MESSAGEN0 BIC #T2.ABO,T.ST2(R0) ;CLEAR MARKED FOR ABORT- MOV T.ACTL(R0),R0 ;GET ADDRESS OF NEXT TCBN TST T.ACTL(R0) ;NULL TASK?, BNE 107$ ;IF NE MORE TO GO*110$: BIS #TS.EXE,-(R5) ;DEACTIVATE TASK= BIC #TS.CKR!TS.CIP!TS.MSG!TS.RUN,(R5)+ ; CLEAR STATUS BITS; BIC #CLRMSK,(R5)+ ;?  MOVB T.DPRI-T.ST3(R5),T.PRI-T.ST3(R5) ;RESTORE TASK PRIORITY   .IF DF L$$GCL )  MOV R5,R0 ;GET POINTER00edb`TADATADATADATADATADATA TO CURRENT TCBT SUB #T.ST3,R0 ;IN R0; MOV #LT.TSK,R1 ;INDICATE THAT DELETING ALL TASK LOGICALSB9 MOV #$LDELX,-(SP) ;JMP TO DELETE ROUTINE IN 4TH DIRCOM(2 CALL $MPDC3 ;MAP THE COMMON AND JMP TO ROUTINE .ENDC, MOV T.PCB-T.ST3(R5),R0 ;POINT TO TASK PCB .IF DF M$$PROD CLR T.RRM-T.ST3(R5) ;ASSUME TASK WAS NOT INSTALLLED WITH AFFINITYA BIT #T2.AFF,T.ST2-T.ST3(R5) ;WAS TASK INSTALLED WITH AFFINITY?K BEQ 115$ ;NO IF EQ< MOV P.RRM(R0),T.RRM-T.ST3(R5) ;RESTORE INSTALLED AFFINITY .ENDC !5"115$: BIT #PS.FXD,P.STAT(R0) ;TASK FIXED IN MEMORY?C# BNE 130$ ;IF NE YES)E$120$: BIS #PS.COM,P.STAT(R0) ;CONVERT TASK REGION TO UNNAMED COMMON % CLR P.ST2(R0) ;& CLR P.NAM(R0) ;' CLR P.NAM+2(R0) ;.( MOV P.MAIN(R0),-(SP) ;SAVE MAIN PCB POINTER2) MOV R5,-(SP) ;SAVE ADDRESS OF THIRD STATUS WORD:*125$: MOV (SP),R5 ;PICK UP ADDRESS OF THIRD STATUS WORD>+ MOV T.ATT-T.ST3(R5),R5 ;POINT TO NEXT ATTACHMENT DESCRIPTOR!, BEQ 126$ ;IF EQ THERE IS NONET:- SUB #A.TCBL,R5 ;POINT TO START OF ATTACHMENT DESCRIPTOR*. MOV A.TCB(R5),R0 ;POINT TO ATTACHED TCB!/ MOV A.PCB(R5),R1 ;POINT TO PCB,#0 TSTB A.MPCT(R5) ;IS TASK MAPPED?N1 BEQ 1257$ ;NO IF EQ2-2 CLRB P.PRI(R1) ;INITIALIZE REGION PRIORITY;3 MOV R1,R2 ;COPY PCB ADDRESSA*4 ADD #P.ATT,R2 ;POINT TO ATTACHMENT LIST551251$: MOV (R2),R2 ;GET NEXT ATTACHMENT DESCRIPTORD 6 BEQ 1252$ ;IF EQ END OF LIST*7 TSTB A.MPCT-A.PCBL(R2) ;IS TASK MAPPED?8 BEQ 1251$ ;IF EQ NO +9 MOV A.TCB-A.PCBL(R2),R3 ;GET TCB ADDRESSI8: ADD #T.ST3,R3 ;CALCULATE ADDRESS OF THIRD STATUS WORD&; CMP R3,(SP) ;SAME AS CURRENT TASK?< BEQ 1251$ ;IF EQ YES3= CMPB T.PRI-T.ST3(R3),P.PRI(R1) ;HIGHER PRIORITY?E> BLO 1251$ ;IF LO NOI/? MOVB T.PRI-T.ST3(R3),P.PRI(R1) ;SET PRIORITY 7@ INCB P.PRI(R1) ;PRIO OF COMMON IS ONE MORE THAN TASK2A BR 1251$ ;GO AGAIN9B1252$: CLRB A.MPCT(R5) ;CLEAR MAPPING COUNT INTO REGIONTCDE .IF DF M$$PROF-G CALL $RESBP ;RESET BYPASS AS APPROPRRIATEVHI .ENDCJK L CALL $DEARG ;DEACCESS REGION(M1257$: CALL $DETRG ;DETACH THE REGION N BR 125$ ; :O126$: MOV (SP)+,R5 ;RESTORE ADDRESS OF THIRD STATUS WORD9P TST T.STAT-T.ST3(R5) ;TASK REACTIVATED DURING $DXXRG ?I%Q ;HAPPENS WHEN $NXTSK IS CALLED('R ;FROM $DXXRG WHEN TKTN EXITS ANDI'S ;A CHECKPOINT ALLOCATION FAILURE T ;CAUSES TKTN TO RUN AGAIN+U BPL 127$ ;IF PL YES, DON'T MODIFY T.PCB3V MOV (SP),T.PCB-T.ST3(R5) ;RESET TASK PCB ADDRESSP1W127$: TST (SP)+ ;REMOVE PCB ADDRESS FROM STACK %X BIT #T3.RST,(R5) ;RESTRICTED TASK? 1Y BNE 130$ ;IF NE YES, DO NOT DEALLOCATE HEADER Z[ .IF DF X$$HDR\0] TSTB T.HDLN-T.ST3(R5) ;RESIDENT TASK HEADER ?.^ BNE 130$ ;IF NE, NO. NOTHING TO DEALLOCATE_` .ENDCa)b MOV R4,R0 ;SET ADDRESS OF TASK HEADERT3c MOV H.HDLN(R0),R1 ;GET LENGTH OF HEADER IN BYTES "d CALL $DEACB ;DEALLOCATE HEADERe130$:Ff;+g; ** W A R N I N G **h;(i; SPM HOOKPOINT NUMBER 03.j; +k; DO NOT CHANGE THE INSTRUCTION FOLLOWINGEl; LABEL WITHOUT CHECKING SPMm;-n-o$SPH03==. ;SPM CHANGES THE INSTRUCTION ATE!p ;THE LOCATION OF THIS LABELHq.r MOV @#$TKTCB,R0 ;GET ADDRESS OF CURRENT TCBstuv .IF DF N$$DIRw&x MOV T.CTX(R0),R1 ;GET CONTEXT BLOCK%y BEQ 133$ ;IF EQ, NO CONTEXT BLOCKT)z CALL $DLCTX ;DEALLOCATE CONTEXT BLOCKR#{ CLR T.CTX(R0) ;CLEAR CTX POINTERT|133$: ;REFERENCE POINTER*}~ .ENDC ; DF N$$DIR .IF DF A$$CNT/ CLR T.EFLM(R0) ;ASSUME NO TIME LIMIT ON TASKW CLR T.EFLM+2(R0) ; . TST T.ACN(R0) ;IS THERE AN ACCOUNTING BLOCK BEQ 160$ ;IF EQ NO MOV R0,R4 ;SAVE TCB ADDRESSH3 TSTB $BILNG ;IS CPU TIME CURRENTLY BEING BILLED BNE 135$ ;IF NE NO8 CALL $CPUTM ;CALCULATE LAST SEGMENT OF CPU TIME USED9135$: MOV T.ACN(R4),R1 ;GET ADDRESS OF ACCOUNTING BLOCK ) MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING & MOV R1,KISAR6 ;MAP ACCOUNTING BLOCK- CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TABT BNE 140$ ;IF NE NO0 MOV @#B.PNT+1400000eueccccc0,-(SP) ;SAVE POINTER TO UAB= MOV @#B.CPUL+140000,T.EFLM(R4) ;PUT TIME LIMIT BACK IN TCB0' MOV @#B.CPUL+2+140000,T.EFLM+2(R4) ;R: BITB #BS.TML,@#B.STM+140000 ;IS TAB FOR TIME LIMIT ONLY BEQ 137$ ;IF EQ NO MOV R1,R0 ;GET TAB ADDRESS MOV #B.TBLK,R1 ;SIZE OF TAB CALL $DESEC ;DEALLOCATE TABF  BR 138$ ;C@137$: MOV T.EFLG+2(R4),@#B.EXST+140000 ;PUT EXIT STATUS IN TAB; MOVB T.EFLG(R4),R0 ;GET TKTN ABORT CODE WITH SIGN EXTEND 7 MOV R0,@#B.EXST+2+140000 ;PUT TKTN ABORT CODE IN TABP. BICB #BS.ACT,@#B.STM+140000 ;DEACTIVATE TAB% CALL $QACNT ;OUTPUT TAB TO SYSLOG"138$: MOV (SP)+,R1 ;POINT TO UAB MOV R1,KISAR6 ;MAP UABT7140$: DEC @#B.ACT+140000 ;DECREMENT ACTIVE TASK COUNT 2 DECB @#B.USE+140000 ;DECREMENT USE COUNT OF UAB% BGT 150$ ;IF GT, UAB STILL ACTIVEC. BICB #BS.ACT,@#B.STM+140000 ;DEACTIVATE UAB% CALL $QACNT ;OUTPUT UAB TO SYSLOGT2150$: MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPING" MOV R4,R0 ;RESTORE TCB ADDRESS/ CLR T.ACN(R0) ;ZERO ACCOUNTING BLOCK POINTERC160$:+ .ENDCA BIC #T4.CTC,T.ST4-T.ST3(R5) ;CLEAR THE ^C ABORT PROCESSING BITN. CALL $ACTRM ;REMOVE TCB FROM THE ATL QUEUE0 BIT #T3.MCR,(R5) ;MCR EXTERNAL FUNCTION TASK? BEQ 175$ ;IF EQ NO- MOV T.UCB-T.ST3(R5),R1 ;GET TI UCB ADDRESSU/170$: MOV U.RED(R1),R1 ;FOLLOW REDIRECT CHAIN;* CMP U.RED(R1),R1 ;IS DEVICE REDIRECTED? BNE 170$ ;IF NE YESS- BIT #DV.TTY,U.CW1(R1) ;IS IT A TTY DEVICE?, BEQ 175$ ;IF EQ NO* MOV T.UCB-T.ST3(R5),R2 ;GET UCB ADDRESS) MOV #CC.EXT,R1 ;ISSUE TASK EXIT PROMPTB2 BIT #T3.CMD,(R5) ;IS TASK EXECUTING CLI COMMAND BEQ 173$ ;IF EQ NO2 BIS #CC.TTD,R1 ;FORCE $SNCMD TO BE CALLED LATER1173$: CALL $QCNTP ;ISSUE PROMPT REQUEST TO MCRE  BR 177$ ;U7175$: BIT #T3.CMD,(R5) ;IS TASK EXECUTING CLI COMMAND1 BEQ 180$ ;IF EQ NO* MOV T.UCB-T.ST3(R5),R0 ;GET UCB ADDRESS: CALL $SNCMD ;TELL TTDRV TO SEND NEXT COMMAND TO MCR...2177$: BIC #T3.MCR!T3.CMD,(R5) ;CLEAR STATUS BITS180$: ;REFERENCE LABELD .IF DF P$$OFF0 MOV R5,R0 ;COPY POINTER TO THIRD STATUS WORD4 ADD #T.OCBH-T.ST3,R0 ;POINT TO OCB QUEUE LISTHEAD  CALL $QRMVF ;REMOVE NEXT OCB! BCS 190$ ;IF CS THERE IS NONEU7 MOV T.EFLG+2-T.ST3(R5),R0 ;PICK UP SAVED EXIT STATUS.0 MOVB T.EFLG-T.ST3(R5),R2 ;GET TKTN ABORT CODE, CALL $QUEXT ;QUEUE EXIT STATUS TO PARENT BR 180$ ;GO AGAINS190$: ;REFERENCE LABELT .IF DF V$$TRM8 CALL $TICLR ;CLEAR OUT POSSIBLE TI:=VTNN: ASSIGNMENT .ENDC .ENDC ; LMZ048. .IF DF C$$RTK ;IF REMOTE TASK ; LMZ048 ; LMZ048= BIT #F5.RTK,$FMSK5 ;ARE REMOTE TASKS BEING USED ; LMZ0480# BEQ 199$ ;IF EQ NO ; LMZ048L; ; LMZ048U>; SEND TASK TERMINATION REQUST TO REMOTE SYSTEM ; LMZ048; ; LMZ048 2 MOV $TKTCB,R5 ;GET CURRENT TASK TCB ; LMZ048C TSTB T.LBN(R5) ;HAS THIS TASK BEEN REMOTE STARTED YET? ; LMZ048 ? BEQ 198$ ;IF EQ, NO - DON'T NEED TO SEND TASK TERM ; LMZ0486 CMPB #-2,T.LBN(R5) ;IS IT NEGATIVE TWO? ; LMZ048> BEQ 198$ ;YES, WE'VE ALREADY REMOTELY TERMINATED ; LMZ0486 CMPB #-1,T.LBN(R5) ;PRV'D TASK W/O AME? ; LMZ048= BEQ 197$ ;YES, DONT SENT PKT BUT SET TASK INDEX ; LMZ048. MOV #AL$SWS,R0 ;SET FLAG AS SWS ; LMZ0481 MOV #1,R1 ;ONLY NEED ONE 32W BLOCK ; LMZ048,6 MOV R2,-(SP) ;SAVE A COUPLE OF REGISTERS ; LMZ048 MOV R3,-(SP) ; LMZ048. CALL $CPALO ;ALLOCATE A BLOCK ; LMZ048. BCC 196$ ;CC = OKAY KEEP GOING ; LMZ0488 ADD #4,SP ;CLR OFF STACK - DONT NEED REG'S ; LMZ048( JMP TKWSE ;RETRY LATER. ; LMZ048 ; LMZ048:196$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING ; LMZ0480 MOV R0,KISAR6 ;MAP REQUEST PACKET ; LMZ048@ MOVB #HT$TKN,H$TYPE+MAP6 ;TYPE IS TASK TERMINATION ; LMZ0480 MOV (SP)+,KISAR6 ;RESTORE MAPPING ; LMZ048 MOV R4,-(SP) ; LMZ048 MOV R5,-(SP) ; LMZ048C CPSEN$ #SN$PSR,R0,#H$SIZE ;SEND PKT AS PSUEDO REQUEST ; LMZ048C00edb`TADATADATADATADATADATA7 MOV (SP)+,R5 ;RESTORE ALL SAVED REGISTERS ; LMZ048A MOV (SP)+,R4 ; LMZ048 MOV (SP)+,R3 ; LMZ048 MOV (SP)+,R2 ; LMZ048C197$: MOVB #-2,T.LBN(R5) ;SIGNAL WE'VE SENT TASK TERM ; LMZ048,@198$: ADD #T.ST3,R5 ;RESTORE R5 BACK TO STATUS WORD ; LMZ048199$: ; LMZ048  .ENDC ;C$$RTK ; LMZ048 ; LMZ0489 BIT #T3.REM,(R5) ;REMOVE TASK AT EXIT? (T.ST3) ;**-1  BEQ 200$ ;IF EQ NO0 MOV R5,R0 ;COPY POINTER TO THIRD STATUS WORD' SUB #T.ST3,R0 ;POINT TO START OF TCBR( CALL $REMOV ;REMOVE TASK FROM SYSTEM200$: ;REFERENCE LABEL  .IF DF X$$HDR3 CLR $SAHPT ;DO NOT SAVE CONTEXT OF CURRENT TASKS .IFFE3 CLR $HEADR ;DO NOT SAVE CONTEXT OF CURRENT TASKR .ENDC$ CLR $TKTCB ;SHOW NO CURRENT TASK .IF DF M$$PRO+ CLR @$TKPTR ;SAME HERE FOR COMMON TABLEM .ENDC+ CALLR $DRDSE ;DECLARE SIGNIFICANT EVENTO;R; SUBROUTINE TO EMPTY QUEUEA;O .IF DF K$$DAS>MTQUE: BIC #PMODE,PS ;SET PREVIOUS MODE TO KERNEL FOR PARAMS, MFPI (R5)+ ;GET OFFSET TO QUEUE LISTHEAD MOV (SP)+,R4 ;N10$: ;REF LABEL .IFF3MTQUE: MOV (R5)+,R4 ;GET OFFSET TO QUEUE LISTHEADR,10$: TST (R5)+ ;ADVANCE TO RETURN ADDRESS  .IFTF ( 13$: MOV (SP),R0 ;PICK UP TCB ADDRESS&  ADD R4,R0 ;POINT TO QUEUE LISTHEAD+  CALL $QRMVF ;REMOVE AN ENTRY FROM QUEUE " BCS 40$ ;IF CS NO ENTRIES LEFT1 MOV R1,R0 ;SET ADDRESS OF BLOCK TO DEALLOCATE$ CMP R4,#T.ASTL ;AST?M BNE 20$ ;IF NE NOD6 MOVB 2(R0),R1 ;SET LENGTH OF BLOCK (FOR AST'S ONLY)0 BGT 20$ ;IF GT LENGTH SPECIFIED (AST'S ONLY)  BMI 30$ ;F/ TST 2(R0) ;IS IT UNSOLICITED CHARACTER AST?E* BNE 18$ ;IF NE NO IT'S A SPECIFIED AST MOV R4,-(SP) ;SAVE R4 MOV R5,-(SP) ;SAVE R5@ CMP -(R0),-(R0) ;POINT TO KISAR5 VALUE OF DEALL SUBR ; BM3977 MOV (R0)+,-(SP) ;GET MAPPING OF SUBROUTINE ; BM397 > MOV (R0)+,-(SP) ;GET ADDRESS OF DEALLOCATE ROUTINE ; BM3974 CALL $MPPRO ;CALL DEALLOCATION ROUTINE ; BM397&3 MOV (SP)+,R5 ;RESTORE R5 ;**-264 MOV (SP)+,R4 ;RESTORE R4$5 BR 13$ ;GO AGAIN3618$: MOV #C.LGTH,R1 ;SET SIZE OF BLOCK TO RELEASET:7 CMPB 3(R0),#AS.PEA ;IS THIS A PARITY AST CONTROL BLOCK?8 BNE 20$ ;IF NE NO,&9 MOV #A.PLGH,R1 ;GET LENGTH OF BLOCK-:20$: CMP R4,#T.RRFL ;PROCESSING RREF QUEUE?D; BNE 23$ ;IF NE NOM)< MOV 2(R0),R1 ;GET SENDER'S TCB ADDRESS 1= BEQ 23$ ;IF EQ NO EVENT FLAG RUNDOWN POSSIBLEC)> CMP $TKTCB,R1 ;CHECK IF SENDER IS SELF (? BEQ 23$ ;IF EQ YES, DEALLOCATE BLOCK=@ MOV #AK.GGF,A.CBL(R0) ;CONVERT TO KERNAL AST CONTROL BLOCKB.A ADD #T.ASTL,R1 ;POINT TO SENDER'S AST QUEUE6B MOV (R1),(R0) ;ESTABLISH PACKET'S POSITION IN QUEUE&C BNE 21$ ;IF NE QUEUE WAS NOT EMPTY'D MOV R0,2(R1) ;ESTABLISH END OF QUEUE 1E21$: MOV R0,(R1) ;ESTABLISH BEGINNING OF QUEUEE"F BR 13$ ;DEALLOCATE NEXT PACKETG23$:HI .IFT ;K$$DASDJ0K MFPI (R5) ;PUSH DEALLOCATION ROUTINE ADDRESSL CALL @(SP)+ ;CALL ROUTINEFMN .IFF ;K$$DASBO&P CALL @-(R5) ;DEALLOCATE CORE BLOCKQR .IFTF ;K$$DASST BR 10$ ;GO AGAINU30$: ;REFERENCE LABEL>V BGCK$A BF.XIT,BE.SGN,FATAL ;NO KERNEL ASTS SHOULD EXIST NOWW40$: ;REF LABELXY .IFTIZ1[ TST (R5)+ ;ADVANCE R5 TO EQUAL RETURN ADDRESSD/\ BIS #PMODE,PS ;RESTORE PREVIOUS MODE TO USERI]^ .ENDC_`a RTS R5 ;RETURN TO CALLERbc;d; EMPTY THE RECEIVE LIST. ;e; IN A SYSTEM SUPPORTING SECONDARY POOL, THE RECEIVE LISTL<f; CONTAINS DATA PACKETS ALLOCATED FROM THE SECONDARY POOL.g;Ohij .IF DF P$$OOLkDkMTRCVL: MOV KISAR6,-(SP) ;SAVE KERNEL MAPPING REGISTER 5 ; BM397(m MOV R5,R4 ;COPY TCB ADDRESS ;**-1(n ADD #T.RCVL,R4 ;POINT TO RECEIVE LIST(o10$: MOV R4,R0 ;GET LIST HEAD ADDRESS5p CALL $QSPRF ;REMOVE THE NEXT PACKET FROM THE LIST q BCS 100$ ;IF CS DONErs .IF DF V$$TRMt)u MOV R1,-(SP) ;SAVE PACKET ADDRESS BIASI(u MOV R1,KISAR6 ;MAP PACKET ; BM3974u MOV @#1400000eueccccc2,-(SP) ;GET SIZE OF PACKET ; BM3977x BIT #T3.SLV,T.ST3(R5) ;IS THIS A SLAVE TASK? ;**-2 (y BEQ 50$ ;IF EQ NO RUN DOWN NECESSARY0z MOV (SP),R1 ;CALCULATE ADDRESS OF UCB IN PKT#{ ASL R1 ;CONVERT OFFSET TO BYTESD7{ MOV 140004(R1),R0 ;GET UCB ADDRESS IN PKT ; BM397T(} MOV @R0,R1 ;GET DCB ADDRESS ;**-1$~ CMP D.NAM(R1),#"VT ;IS THIS A VT? BNE 50$ ;IF NE NO0 DECB U.OCNT(R0) ;DECREMENT VT OFFSPRING COUNT) BNE 50$ ;IF NE THERE'S MORE OFFSPRINGK, TST U.PTCB(R0) ;HAS THE PARENT GONE AWAY? BNE 50$ ;IF NE NO .IF DF D$$PAR .IF NDF K$$DAS = MOV 4(SP),KISAR6 ;REMAP APR6 TO ORIGINAL MAPPING ; BM397P& ;WHICH MUST SHARE KISAR5 ;**-1 .ENDC .ENDC. CALL $DEAVT ;DEALLOCATE VT DATA STRUCTURES(50$: MOV (SP)+,R1 ;RESTORE PACKET SIZE/ MOV (SP)+,R0 ;RESTORE ADDRESS BIAS OF PACKETS .IF DF D$$PAR .IF NDF K$$DAS.* MOV R0,KISAR6 ;REMAP PACKET ; BM397 ;**-1M .ENDC .ENDC .IFF 6 MOV R1,R0 ;COPY PACKET ADDRESS FOR DEALLOC ROUTINE: MOV R1,KISAR6 ;MAP TO THE PACKET THROUGH APR5 ; BM3974 MOV @#140002,R1 ;CALCULATE PACKET SIZE ; BM397 ;**-2  .ENDC ;V$$TRM .IF DF N$$DIR3 BIT #T3.SLV,T.ST3(R5) ;IS RECEIVER A SLAVE TASK?P- BEQ 80$ ;IF EQ, NO - NO CONTEXT BLOCK PTRS MOV R1,-(SP) ;SAVE SIZE ASL R1 ;CONVERT TO BYTES9 MOV 140014(R1),R1 ;GET CONTEXT BLOCK POINTER ; BM3977" BEQ 70$ ;IF EQ, NONE ;**-1% CALL $DLCTX ;DELETE CONTEXT BLOCKC!70$: MOV (SP)+,R1 ;RESTORE SIZEI-80$: ADD #<7.+37>,R1 ;INCLUDE CONTROL WORDS  .IFF7) ADD #<6.+37>,R1 ;INCLUDE CONTROL WORDS; .ENDC ;DF N$$DIR ) ASH #-5,R1 ;CONVERT TO 32. WORD UNITS& CALL $DESEC ;DEALLOCATE THE PACKET BR 10$ ;GO AGAIN>100$: MOV (SP)+,KISAR6 ;RESTORE MAPPING REGISTER 5 ; BM397 RETURN ; ;**-1 .ENDC; ); CO-ROUTINE TO SCAN LOGICAL UNIT TABLE$; *SCNLN: MOV (SP),R3 ;SAVE RETURN ADDRESS CLR (SP) ;START AT LUN ZEROR510$: MOV $TKTCB,R5 ;GET ADDRESS OF CURRENT TASK TCBO .IF DF X$$HDR) MOV $SAHPT,R4 ;GET CURRENT TASK HEADER MOV $SAHDB,KISAR6 ;MAP IT .IFF;) MOV $HEADR,R4 ;GET CURRENT TASK HEADERA .ENDC(20$: MOV (SP),R1 ;GET NEXT LUN NUMBER" INC (SP) ;INCREMENT LUN NUMBER# CMP H.NLUN(R4),(SP) ;END OF LUT? BLO 30$ ;IF LO YES. CALL $MPLNE ;MAP LUN NUMBER TO UCB ADDRESS, BCS 20$ ;IF CS NO DEVICE ASSIGNED TO LUN0 BIT #DV.ISP!DV.OSP,U.CW1(R2) ;SPOOLED DEVICE? BEQ 25$ ;IF EQ NOR' CMP U.ATT(R2),R5 ;SPOOLER TASK EXIT?$ BEQ 25$ ;IF EQ YES/ MOV R0,R2 ;ELSE USE INTERMEDIATE DEVICE UCB6% CLC ;INSURE C - CLEAR FOR RETURND-25$: MOV R2,R5 ;SET UCB ADDRESS FOR RETURN# CALL (R3) ;CALL THE CALLER BACKU( MOV (SP)+,R3 ;RETRIEVE RETURN ADDRESS BR 10$ ;GO AGAIN'30$: MOV R3,(SP) ;SET RETURN ADDRESS  RETURN ;M;+ ; BM374SB; ** - LTPRE - CALL LAT PROCESS FOR EXIT NOTIFICATION ; BM374; ; BM374Q; THIS ROUTINE NOTIFIES THE LAT PROCESS WHEN AN EXITING TASK HAS A LUN ; BM374$Y; ASSIGNED TO A LAT APPLICATIONS TERMINAL SO THAT A DISCONNECT MAY BE PERFORMED ; BM374F; ; BM374; INPUTS: ; BM374R"; R5 = UCB ADDRESS ; BM374; ; BM374; OUTPUTS: ; BM3742; LAT PROCESS NOTIFIED IF NECESSARY. ; BM374;- ; BM374  ; BM374 % .IF DF M$$NET&T$$LTH ; BM374C ; BM374T5LTPRE: MOV U.DCB(R5),R0 ;GET DCB ADDRESS ; BM374N6 CMP #"TT,D.NAM(R0) ;IS IT A TT TERMINAL? ; BM374! BNE 10$ ;IF NE NO ; BM374L ; BM374T> BIT #S6.LAT,U.TST6(R5) ;LAT APPLICATION TERMINAL? ; BM374 ; BM374 ! BEQ 10$ ;IF EQ NO ; BM374 / MOV U.SCB(R5),R4 ;R4-SCB ADDRESS ; BM374  ; BM374R+ MOV S.KRB+2(R4),-(SP) ;BIAS ; BM374- ; BM3748 MOV $LTEEP,-(SP) ;VIRT ADDR = LAT PROC EXIT ; BM374 ;ENTRY POINT00eeb`TADATADATADATADATADATA ; BM3745 CALL $MPPRO ;MAPS AND CALLS LAT PROCESS ; BM374# ;RESTORES SP ; BM37410$: RETURN ; BM374  ; BM374( .ENDC ; DF M$$NET&T$$LTH ; BM374 ; BM374T ; BM385;+ ; BM385BB; **-$RLMCB-RELEASE COMMAND BUFFERS QUEUED FOR A TASK ; BM385; ; BM385; INPUTS: ; BM385R; ; BM385J; R5=ADDRESS OF TCB OF THE TASK WHOSE BUFFERS SHOULD BE DELETED ; BM385; ; BM385; OUTPUTS: ; BM385; ; BM385:; ALL COMMAND LINES FOR THE TASK ARE RELEASED ; BM385; ; BM385;- ; BM385M ; BM385$;$RLMCB::MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING ; BM385 ;10$: CALL $SCMDQ ;FIND A COMMAND FOR THIS TASK ; BM385 ' BCS 30$ ;IF CS, NO MORE ; BM385 ' MOV R0,R1 ;COPY ADDRESS ; BM385M/ MOV #$CLICQ,R0 ;POINT TO LISTHEAD ; BM385 & CALL $GTSPK ;UNLINK IT ; BM385' MOV R1,KISAR6 ;MAP BLOCK ; BM385UG BIT #CC.TTD,@#C.CSTS+140000 ;DID COMMAND ORIGINATE IN TTDRV ; BM385H! BEQ 20$ ;IF EQ NO ; BM385 5 MOV @#C.CUCB+140000,R0 ;GET UCB ADDRESS ; BM385 9 CALL $SNCMD ;TELL TTDRV TO SEND NEXT COMMAND ; BM385 -20$: MOV KISAR6,R0 ;GET ADDRESS ; BM385O0 MOVB C.CBLK+140000,R1 ;GET LENGTH ; BM385* CALL $DESEC ;DEALLOCATE IT ; BM385) BR 10$ ;CHECK FOR ANY MORE ; BM385I330$: MOV (SP)+,KISAR6 ;RESTORE MAPPING ; BM385BDUN: RETURN ; BM385C ; BM385T .END@#C.CSTS+140000 ;DID COMMAND ORIGINATE IN TTDRV ; BM385H! BEQ 20$ ;IF EQ NO ; BM385 5 MOV @#C.CUCB+140000,R0 ;GET UCB ADDRESS ; BM385 9 CALL $SNCMD ;TELL TTDRV TO SEND NEXT COMMAND ; BM385 -20$: MOV KISAR6,R0 ;GET ADDRESS ; BM385O0 MOVB C.CBLK+140000,R1 ;GET LENGTH ; BM385* CALL $DESEC ;DEALLOCATE IT ; BM385) BR 10$ ;CHECK FOR ANY MORE ; BM385I330$: MOV (SP)+,KISAR6 ;RESTORE MAPPING ; BM385BDUN: RETURN ; BM385C  .TITLE DRLOG  .IDENT /03.03/U;)8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;N ; J. R. KAUFFMAN ; J. W. BERZLE ; T. LEKAS ;; MODIFIED BY:;;); J. R. KAUFFMAN 12-FEB-86 03.01 JRK325A&; FIX LON$/LOG$ EQUIVALENCE PROBLEM;C%; K. L. NOEL 24-NOV-86 03.02 KLN027 -; ADD SUPPORT FOR REMOTE DIRECTORY STORAGE ;.'; D. P. RABAHY 11-DEC-86 03.03 DPR0399>; ADD SUPPORT FOR REMOTE LOGICAL TRANSLATE, CREATE & DELETE*;+,;+$-; ++$DRLOG-LOGICAL NAME DIRECTIVES.;Y=/; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE, DELETE, ORCB0; TRANSLATE A LOGICAL NAME, SETUP A DEFAULT DIRECTORY STRING, ORA1; GET A DEFAULT DIRECTORY STRING BY MEANS OF THE FOLLOWING FIVEJ2; SUBFUNCTIONS:N3;$4; CLOG$ ( SUBFUNCTION 0 ) 5; I6; THE CREATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TO Q7; CREATE A RELATIONSHIP BETWEEN A SPECIFIED LOGICAL NAME STRING AND A SPECIFIEDAO8; EQUIVALENCE NAME STRING. IF THE LOGICAL NAME STRING ALREADY EXISTS, THE NEWS*9; DEFINITION WILL SUPERCEDE THE OLD ONE.:;O+;; CREATE LOGICAL NAME (CLOG$) DPB FORMAT: <; %=; WD. 00 -- DIC(207.),DPB SIZE (7.)'>; WD. 01 -- SUBFUNCTION CODE (0),MODE !?; WD. 02 -- TABLE NUMBER,STATUST,@; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)A; WD. 04 -- SIZE OF LOGICAL NAME BUFFER 0B; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-C; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERSD; E; F; TLOG$ ( SUBFUNCTION 1 )EG;NIH; THE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM HI; TO SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICALJJ; NAME TABLES AND RETURN THE EQUIVALENCE NAME STRING TO A USER SPECIFIED K; BUFFER.L;DNM; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLESLN; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAM00euecccccE BUFFER BE TOO SMALL,NO; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNEDPP; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER>Q; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER.R;INS; ******************************** NOTE ************************************GT; THIS VERSION OF THE TLOG$ DPB IS FOR P/OS COMPATIBILITY ONLY.BAU; THE CURRENT DPB FORMAT IS UNDER THE SUBFUNCTION CODE 9. NV; **************************************************************************W;E.X; TRANSLATE LOGICAL NAME (TLOG$) DPB FORMAT:Y;%Z; WD. 00 -- DIC(207.),DPB SIZE (9.)U'[; WD. 01 -- SUBFUNCTION CODE (1),MODE4\; WD. 02 -- TBMASK,RESERVED BYTE (RECURSION COUNT),]; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)^; WD. 04 -- SIZE OF LOGICAL NAME BUFFER*0_; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-`; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERREa; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME*>b; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODEc;Rd;Te; DLOG$ ( SUBFUNCTION 2 )Af;Og; THE DELETE LOGICAL NAME DIRECTIVE SUBFUNCTION REMOVES THE SPECIFIED LOGICALDJh; NAME FROM THE LOGICAL NAME TABLE SPECIFIED. IF THE LOGICAL NAME IS NOTDi; SPECIFIED, ALL LOGICAL NAMES IN THE SPECIFIED TABLE ARE REMOVED.j; +k; DELETE LOGICAL NAME (DLOG$) DPB FORMAT:l;D%m; WD. 00 -- DIC(207.),DPB SIZE (5.)R'n; WD. 01 -- SUBFUNCTION CODE (2),MODEE"o; WD. 02 -- TABLE NUMBER, STATUS,p; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)q; WD. 04 -- SIZE OF LOGICAL NAME BUFFERFr;Os; SDIR$ ( SUBFUNCTION 3 )Gt;NQu; THE SETUP DEFAULT DIRECTORY STRING DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM Jv; TO CREATE A DEFAULT DIRECTORY STRING ON A USER BASIS. THIS STRING IS APw; SPECIAL CASE SINCE THERE IS NO LOGICAL STRING PER SE AND ONLY AN EQUIVALENCEx; NAME STRING EXISTS.Dy;-(z; SET DEFAULT DIRECTORY STRING (SDIR$){;N%|; WD. 00 -- DIC(207.),DPB SIZE (5.)L'}; WD. 01 -- SUBFUNCTION CODE (3),MODEF.~; WD. 02 -- RESERVED FOR FUTURE EXPANSIONISM0; WD. 03 -- ADDRESS OF EQUIVALENCE NAME BUFFER-; WD. 04 -- SIZE OF EQUIVALENCE NAME BUFFERI;R; GDIR$ ( SUBFUNCTION 4 )E;EO; THE GET DEFAULT DIRECTORY STRING DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEMP; TO RETRIEVE THE DEFAULT DIRECTORY STRING FOR THE CURRENT USER. THE STRING ISN; RETURNED TO THE SPECIFIED USER BUFFER ALONG WITH THE LENGTH OF THE STRING.; 4; GET DEFAULT DIRECTORY STRING (GDIR$) DPB FORMAT:;O%; WD. 00 -- DIC(207.),DPB SIZE (6.)R'; WD. 01 -- SUBFUNCTION CODE (4),MODES+; WD. 02 -- RESERVED FOR FUTURE EXPANSIONI%; WD. 03 -- EQUIVALENCE NAME BUFFER-; WD. 04 -- SIZE OF EQUIVALENCE NAME BUFFER E; WD. 05 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME;R;VG; THE FOLLOWING SUBFUNCTIONS ARE DISPATCHED FROM HERE BUT THE CODE ISE; IN THE MODULE DRPFN.MAC.; ; FSS$ ( SUBFUNCTION 5 );.1; FILE SPECIFICATION SCANNER (FSS$) DPB FORMAT:B;A%; WD. 00 -- DIC(207.),DPB SIZE (7.)I,; WD. 01 -- SUBFUNCTION CODE (5), RESERVED; WD. 02 -- RESERVED7; WD. 03 -- ADDRESS OF DIRECTORY SPECIFICATION BUFFERE4; WD. 04 -- SIZE OF DIRECTORY SPECIFICATION BUFFER$; WD. 05 -- ADDRESS OF PARSE BLOCK,; WD. 06 -- SIZE OF PARSE BLOCK (IN BYTES);>; THE PARSE BLOCK WILL ZEROED AND FILLED IN WITH DESCRIPTORS>; FOR EACH FIELD PRESENT OF NODE, ACCESS, DEVICE, DIRECTORY,=; FILENAME, TYPE, AND VERSION, PLUS THE TRAILING PORTION OFTA; THE STRING IF ANY. THE FLAGS WORD WILL BE HAVE A BIT SET FORF<; EACH OF THE COMPONENTS PRESENT IN THE FORMAT FOR THE RMS; NAM BLOCK.;O; IN MORE DETAIL.E;>; NODE: THE NODE INCLUDES ALL NODES IF POOR MAN'S ROUTING IS:; IS BEING USED. THE INITIAL NODE NAME IS TERMINATED9; BY THE ACCESS CONTROL STRING ADDRESS, EVEN IF THERED:; IS NONE. (IN THIS CASE THE ACCESS CONTROL LENGTH IS ; ZERO.);T; FS$NOD IS SET IF PRESENT.S;P@; ACCESS THE ACCESS CONTROL STRI00eeb`TADATADATADATADATADATANG IS THE ENTIRE QUOTED STRINGE; CONTROL: TERMINATED BY DOUBLE COLON. AS NOTED ABOVE, THE ADDRESSH1; OF THE ACCESS CONTROL SERVES A DUAL PURPOSE.M;EB; DEVICE: THE DEVICE IS THE STRING TERMINATED BY A SINGLE COLON.; ; FS$DEV IS SET IF PRESENT.I;NA; DIRECTORY:THE DIRECTORY IS THE STRING BOUNDED BY EITHER [] OR 4; <> AND INCLUDES A RATHER LOOSELY CHECKED SET OF<; CHARACTERS VALID IN A DIRECTORY SPECIFICATION INCLUDING>; WILDCARDS, HIERARCHIES, ETC. THE SYNTAX OF THE DIRECTORY7; MUST BE CHECKED FOR VALIDITY IN THE CONTEXT OF THEO,; OPERATION, FOR EXAMPLE, NETWORK ACCESS.;E8; FS$DIR IS SET IF PRESENT. IN ADDITION, IF WILDCARDS=; ARE FOUND, FS$WDI IS ALSO SET. (WILDCARDS ARE "%", "*", ; AND "...".P;TC; FILENAME: THE FILENAME IS THE STRING TERMINATED BY ".", ";", OR '; THE END OF THE FILE SPECIFICATION.S;H9; FS$NAM IS SET IF PRESENT. IN ADDITION, IF WILDCARDSA;; ARE FOUND, FS$WNA IS ALSO SET. (WILDCARDS ARE "%" AND ; "*".);0; IF FS$QUO IS SET, THE FILE SPECIFICATION IS:; A QUOTED STRING. THIS IS EITHER A "FOREIGN" FILESPEC7; IF BEING PASSED TO ANOTHER SYSTEM (EG. VIA DAP) OR6; AN ANSI FILESPEC. THE THE CASE OF THE ANSI FILE,:; A VERSION IS ALLOWED, BUT NO TYPE FIELD. IN THE CASE:; OF A NETWORK OPERATION, IT'S AMBIGUOUS, BUT A VERSION7; WILL BE ALLOWED BUT NOT DEFAULTED. (ACTUALLY THISN7; DOESN'T RELATE TO FSS BUT THIS SEEMS TO BE AS GOOD #; A PLACE TO MENTION IT AS ANY.);">; TYPE: THE TYPE IS THE STRING TERMINATED BY A "." OR ";" OR9; THE END OF THE FILE SPECIFICATION. A LEADING "." IS #; ALWAYS INCLUDED IN THE STRING.G; 9; FS$TYP IS SET IF PRESENT. IN ADDITION, IF WILDCARDSF;; ARE FOUND, FS$WTY IS ALSO SET. (WILDCARDS ARE "%" ANDA ; "*".);W8; IF THE FILENAME IS A QUOTED STRING, THEN THIS FIELD; MUST BE NULL.;D@; VERSION: THE VERSION IS THE FIELD INCLUDING A LEADING "." OR9; ";" TERMINATED BY THE END OF THE STRING. THE STRING 9; IS LIMITED TO AN OPTIONAL LEADING "-" AND THE DIGITS%; ZERO TO NINE, OR A "*" WILDCARD. ;A:; FS$VER IS SET IF PRESENT. IN ADDITION, IF A WILDCARD"; IS FOUND, FS$WVE IS ALSO SET.;,E; TRAILING: THE UNPARSED PORTION OF THE INITIAL STRING IS THAT PART 6; OF THE INPUT THAT WAS SUCCESSFULLY AND COMPLETELY6; PARSED. IF AN ERROR IS DETECTED IN THE DIRECTORY9; SPECIFICATION, FOR EXAMPLE, THE TRAILING STRING WILLR3; INCLUDE THE ERRONEOUS DIRECTORY SPECIFICATION.S; 7; THIS SHOULD ALLOW THE USED OF FSS$ IN COMMAND LINET=; PARSING. ANY CHARACTER NOT PART OF A FILE SPECIFICATIONS7; TERMINATES THE SCAN AND RESULTS IN ALL INFORMATIONN$; OBTAINED SO FAR TO BE RETURNED.; 7; THE FIELD TRAILING_ADDR SHOULD ALWAYS BE FILLED IN5; EVEN WHEN THE LENGTH IS ZERO. THIS IS DIFFERENT4; FROM THE NORM, BUT IS AN EXCEPTION FOR MUCH THE$; SAME REASON AS FOR ACCESS_ADDR.;LB; THE PARSE BLOCK CAN BE TRUNCATED BY THE USER IF NOT ALL FIELDSE; ARE DESIRED, ALTHOUGH THE ORGANIZATION ISN'T WELL SETUP FOR THAT. C; THE DIRECTIVE CAN ALSO BE ENHANCED BY ADDING FIELDS ON THE END.I; ; ACHN$ ( SUBFUNCTION 6 )O;O&; ASSIGN CHANNEL (ACHN$) DPB FORMAT:; %; WD. 00 -- DIC(207.),DPB SIZE (5.)L+; WD. 01 -- SUBFUNCTION CODE (6),RESERVED ; WD. 02 -- LUN, TABLE MASK+; WD. 03 -- ADDRESS OF FILE SPECIFICATIONH(; WD. 04 -- SIZE OF FILE SPECIFICATION;L9; ASSIGN CHANNEL DOES ALL OF THE PROCESSING OF THE FILEL<; SPECIFICATION THAT IS REQUIRED TO FIND THE ACTUAL DEVICE1 ; NAME AND THEN ASSIGNS THE LUN TO THAT DEVICE.N ;D ;D ; PRMS$ ( SUBFUNCTION 7 ) ;C%; PARSE FOR RMS (PRMS$) DPB FORMAT:I;A&; WD. 00 -- DIC(207.),DPB SIZE (12.)'; WD. 01 -- SUBFUNCTION CODE (7), LUN1"; WD. 02 -- TABLE MASK, RESERVED'; WD. 03 -- ADDRESS OF PRIMARY STRING3$; WD. 04 -- SIZE OF PRIMARY STRING0; WD. 05 -- ADDRESS OF RESULTANT STRING BUFFER-; WD. 06 -- SIZE OF RESULTANT STRING BUFFERE>; WD. 0700eueccccc -- ADDRESS OF WORD TO RECEIVE RESULTANT STRING SIZE$; WD. 08 -- ADDRESS OF PARSE BLOCK!; WD. 09 -- SIZE OF PARSE BLOCK '; WD. 10 -- ADDRESS OF DEFAULT STRINGS$; WD. 11 -- SIZE OF DEFAULT STRING;D;######## ADD DESCRIPTION;;  ; PFCS$ ( SUBFUNCTION 8 )1!; %"; PARSE FOR FCS (PFCS$) DPB FORMAT: #; &$; WD. 00 -- DIC(207.),DPB SIZE (12.)'%; WD. 01 -- SUBFUNCTION CODE (8), LUND"&; WD. 02 -- TABLE MASK, RESERVED''; WD. 03 -- ADDRESS OF PRIMARY STRINGE$(; WD. 04 -- SIZE OF PRIMARY STRING0); WD. 05 -- ADDRESS OF RESULTANT STRING BUFFER-*; WD. 06 -- SIZE OF RESULTANT STRING BUFFERL>+; WD. 07 -- ADDRESS OF WORD TO RECEIVE RESULTANT STRING SIZE$,; WD. 08 -- ADDRESS OF PARSE BLOCK!-; WD. 09 -- SIZE OF PARSE BLOCK +.; WD. 10 -- ADDRESS OF DEFAULT NAME BLOCKO(/; WD. 11 -- SIZE OF DEFAULT NAME BLOCK0; 1;######## ADD DESCRIPTION2;1 3; INPUTS:O4;E:5; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK,6; R3=ADDRESS OF THE SECOND WORD IN THE DPB07; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK-8; R5=ADDRESS OF THE TCB OF THE CURRENT TASKU9; :;G;; TLOG$ ( SUBFUNCTION 9 ) <;RL=; THE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TOJ>; SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICAL NAMEM?; TABLES AND RETURN THE EQUIVALENCE NAME STRING TO A USER SPECIFIED BUFFER.N@; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLESLA; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL,NB; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNEDPC; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER>D; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER.E;G.F; TRANSLATE LOGICAL NAME (TLOG$) DPB FORMAT:G;S&H; WD. 00 -- DIC(207.),DPB SIZE (10.)'I; WD. 01 -- SUBFUNCTION CODE (1),MODEAJ; WD. 02 -- TBMASK, STATUS,K; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)L; WD. 04 -- SIZE OF LOGICAL NAME BUFFERN0M; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-N; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFEREEO; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAMEA>P; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODEBQ; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCKR;S;T; RLOG$ ( SUBFUNCTION 10. )0U;LV; THE RECURSIVE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THEOW; SYSTEM TO SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICALLX; NAME TABLES AND RETRANSLATE THE EQUIVALENCE NAME STRING FURTHER UNTIL NOLY; MORE EQUIVALENCE NAMES MAY BE FOUND. AT THAT TIME THE FINAL EQUIVALENCE0Z; NAME IS RETURNED TO A USER SPECIFIED BUFFER.N[; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLESL\; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL,N]; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNEDP^; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER>_; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER.`; 8a; RECURSIVE TRANSLATE LOGICAL NAME (RLOG$) DPB FORMAT:b;U&c; WD. 00 -- DIC(207.),DPB SIZE (10.)'d; WD. 01 -- SUBFUNCTION CODE (9),MODEIe; WD. 02 -- TBMASK, STATUS,f; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)g; WD. 04 -- SIZE OF LOGICAL NAME BUFFERR0h; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-i; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFEREj; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME >k; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODEBl; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCKm;n;o; CLON$ ( SUBFUNCTION 11. )0p;Iq; THE CREATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TODQr; CREATE A RELATIONSHIP BETWEEN A SPECIFIED LOGICAL NAME STRING AND A SPECIFIEDOs; EQUIVALENCE NAME STRING. IF THE LOGICAL NAME STRING ALREADY EXISTS, THE NEWC*t; DEFINITION WILL SUPERSEDE THE OLD ONE.u;R+v; CREATE LOGIC00eeb`TADATADATADATADATADATAAL NAME (CLON$) DPB FORMAT: w; %x; WD. 00 -- DIC(207.),DPB SIZE (7.) )y; WD. 01 -- SUBFUNCTION CODE (11.),MODER!z; WD. 02 -- TABLE NUMBER,STATUS,{; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)|; WD. 04 -- SIZE OF LOGICAL NAME BUFFERU0}; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-~; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERR;N;P; DLON$ ( SUBFUNCTION 12. )R;IO; THE DELETE LOGICAL NAME DIRECTIVE SUBFUNCTION REMOVES THE SPECIFIED LOGICAL J; NAME FROM THE LOGICAL NAME TABLE SPECIFIED. IF THE LOGICAL NAME IS NOTD; SPECIFIED, ALL LOGICAL NAMES IN THE SPECIFIED TABLE ARE REMOVED.;D+; DELETE LOGICAL NAME (DLON$) DPB FORMAT:D;-%; WD. 00 -- DIC(207.),DPB SIZE (5.)D); WD. 01 -- SUBFUNCTION CODE (12.),MODED"; WD. 02 -- TABLE NUMBER, STATUS,; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER); WD. 04 -- SIZE OF LOGICAL NAME BUFFERT;2;; TLON$ ( SUBFUNCTION 13. ) ;TL; THE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TOJ; SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICAL NAMEM; TABLES AND RETURN THE EQUIVALENCE NAME STRING TO A USER SPECIFIED BUFFER.PN; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLESL; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL,N; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNEDP; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER>; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER.;G.; TRANSLATE LOGICAL NAME (TLON$) DPB FORMAT:;S&; WD. 00 -- DIC(207.),DPB SIZE (10.)); WD. 01 -- SUBFUNCTION CODE (13.),MODEK; WD. 02 -- TBMASK, STATUS,; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER); WD. 04 -- SIZE OF LOGICAL NAME BUFFERM0; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERUE; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAMEE>; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODEB; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCK;S; ; RLON$ ( SUBFUNCTION 14. )); L; THE RECURSIVE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THEO; SYSTEM TO SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICALL; NAME TABLES AND RETRANSLATE THE EQUIVALENCE NAME STRING FURTHER UNTIL NOL; MORE EQUIVALENCE NAMES MAY BE FOUND. AT THAT TIME THE FINAL EQUIVALENCE0; NAME IS RETURNED TO A USER SPECIFIED BUFFER.N; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLESL; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL,N; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNEDP; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER>; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER.; 8; RECURSIVE TRANSLATE LOGICAL NAME (RLON$) DPB FORMAT:;U&; WD. 00 -- DIC(207.),DPB SIZE (10.)); WD. 01 -- SUBFUNCTION CODE (14.),MODEH; WD. 02 -- TBMASK, STATUS,; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER); WD. 04 -- SIZE OF LOGICAL NAME BUFFERB0; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFER E; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAMEA>; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODEB; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCK;U .IF DF L$$GCL!N$$DIRE .MCALL LNMDF$,LNMOD$T  LNMDF$M3 LNMOD$ ;DEFINE ADDITIONAL LOGICAL NAME OFFSETSR MAP5=120000 MAP6=140000A LN$SIZ = 255. ;MAXIMUM SIZE OF LOGICAL AND EQUIVALENCE BUFFERSM8 H$$HNM = 32. ;NUMBER OF HASH CELLS IN EACH HASH TABLE8 T$BLNM == 4 ;HIGHEST VALID LOGICAL NAME TABLE NUMBER= M$XLOG = 10. ;MAXIMUM RECURSION NUMBER FOR LOGICAL LOOKUPSM; P$SSIZ = 9. ;DPB SIZE OF P/OS COMPATIBLE TLOG$ DIRECTIVE ; D$COM4 = 4 ;INDICATOR VALUE FOR THE 4TH DIRECTIVE COMMON3 R$LOG = 10. ;SUBFUNCTION CODE F00euecccccOR RLOG OPERATION 3 R$LON = 14. ;SUBFUNCTION CODE FOR RLON OPERATIONP2 R$XBAS = 11. ;SUBFUNCTIONS BELOW THIS ARE XLOG$+ GD$SIZ = 14 ;SIZE OF GDIR DPB ;KLN027RA GD$BUF = 4 ;SIZE OF EXTRA CPRBUF STORAGE AREA FOR GDIR ;KLN027B+ SD$SIZ = 12 ;SIZE OF SDIR DPB ;KLN027U+ CL$SIZ = 16 ;SIZE OF CLOG DPB ;DPR039E+ DL$SIZ = 10 ;SIZE OF DLOG DPB ;DPR039I+ TL$SIZ = 24 ;SIZE OF TLOG DPB ;DPR039C/ .SBTTL ENTRY POINT FOR ALL ROUTINES IN DRLOG;R;=Q; REVERIFY DPB ADDRESS GIVEN THAT THE POINTER GOING INTO THE ROUTINES NO LONGERO'; POINTS PAST THE FUNCTION CODE WORD.N;O;S $DRLG1::0 MOVB (R3),R0 ;GET THE FUNCTION CODE FROM DPB# CMPB R0,#$LNFHI ;IS IT TOO HIGH?G BHI 10$ ;IF HI, YES5 ASL R0 ;GET OFFSET INTO TABLE BY MULTIPLYING BY 4  ASL R0 ;, ADD #$LNSFT,R0 ;POINT INTO FUNCTION TABLEA MOV (R0)+,-(SP) ;GET THE COMPLETION ROUTINE ADDRESS FROM TABLE0 CMPB (R0)+,$DICSV+1 ;DOES THE DPB SIZE MATCH? BNE 10$ ;IF NE, NO .IF DF L$$GCL- MOV $TKTCB,R1 ;GET THE CURRENT TCB ADDRESSO4 MOV T.UCB(R1),R1 ;GET THE CURRENT TI: OF THE TASK; CALL $GTUSR ;SET UP THE USER LOGICAL HASH TABLE ADDRESSB .ENDC ;DF L$$GCLI@ CMPB #D$COM4,(R0)+ ;DOES THIS FUNCTION LIVE IN ANOTHER DIRCOM% BEQ 20$ ;IF EQ, YES, SWITCH TO IT+ CALLR @(SP)+ ;PROCESS THE FUNCTION TYPEA10$: DRSTS D.RS99 ;RETURN DIRECTIVE STATUS -- DPB SIZE INVALIDC20$: CALL $MPDC4 ;CALL THE ROUTINE IN THE OTHER DIRECTIVE COMMON2 RETURN ;RETURN BACK TO DISPATCHER SUCCESFULLY .PAGE; .SBTTL ACROB - ROUTINE TO VALIDATE USER BUFFER ADDRESSES  .ENABL LSB ;+;RO; THESE ROUTINES ADDRESS CHECK AND CALCULATE THE BIAS AND DISPLACEMENT (APR6) ; OF A SPECIFIED USER BUFFER.E;C ; INPUTS:$1; R3 = THE ADDRESS OF THE TWO WORDS IN THE DPBC5; CONTAINING THE USER VIRTUAL ADDRESS AND THER(; BYTE COUNT SIZE OF THAT BUFFER ;C ;M ; OUTPUTS: ;T* ; R0 = THE BYTECOUNT OF THE USER BUFFER%; R1 = THE BIAS OF THE USER BUFFERL2; R2 = THE APR6 DISPLACEMENT OF THE USER BUFFER; R3 = R3+4; R4 = UNCHANGED ;J; AN ERROR CONDITION IN THIS ROUTINE CAUSES AN IMMEDIATE DIRECTIVE ERROR6; TRAP PREVENTING ANY RETURN TO THE CALLING ROUTINE.;-3ACROB: MOV #$ACHKB,-(SP) ;ADDRESS CHECK BUFFER RWH# BR 10$ ;GO TO COMMON PROCESSING 3ACRIB: MOV #$ACHRO,-(SP) ;ADDRESS CHECK BUFFER ROF710$: MOV (R3)+,R0 ;GET THE ADDRESS OF THE USER BUFFERH! BEQ 20$ ;IF EQ, THERE IS NONE # MOV (R3)+,R1 ;GET SIZE OF BUFFER% BEQ 30$ ;IF EQ, IT IS NONEXISTENTE" CMP R1,#LN$SIZ ;IS IT TOO LARGE BHI 30$ ;IF HI, YESE*  CALL @(SP)+ ;CALL THE CHECKING ROUTINE%! BCS 20$ ;IF CS, BUFFER IS INVALIDT:" CALL $RELOC ;SET UP THE APR BIAS AND OFFSET FOR BUFFER+# MOV -2(R3),R0 ;SET UP THE SIZE OF BUFFER $ RETURNO%)&20$: DRSTS D.RS98 ;ADDRESS CHECK ERRORS)'30$: DRSTS D.RS89 ;INVALID BUFFER SIZE3( ) .DSABL LSBE*+ .ENDC ; DF L$$GCL!N$$DIR$,- .PAGE2. .SBTTL $LNFCL - LOGICAL NAME CREATION DIRECTIVE/0 .IF DF L$$GCL 1 .ENABL LSB234;+25; $LNFCL - ENTRY POINT FOR LOGICAL NAME CREATION6;(L7; THIS ROUTINE IS ENTERED FROM THE DRLOG DISPATCH AREA WITH R3 POINTING TO8; THE FOLLOWING DPB VALUES:S9;O':; WD. 01 -- SUBFUNCTION CODE (0),MODEP!;; WD. 02 -- TABLE NUMBER,STATUS,<; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)=; WD. 04 -- SIZE OF LOGICAL NAME BUFFER0>; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-?; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERM@;AA B$LNFCL::4B .IF DF C$$RLG ; REMOTE LOGICAL SUPPORT ;DPR039B ;DPR039TB .MCALL CPRDF$ ;DPR039B CPRDF$ ;DPR039 B ;DPR039C=B BIT #F5.RLG,$FMSK5 ;ARE WE USING REMOTE LOGICAL? ;DPR039O B BEQ 9$ ;IF EQ NO ;DPR039B; ;DPR0391B; GET A REQUEST PACKET FROM CPRBUF ;DPR039GB; ;DPR0392B MOV 6(R3),R1 ;GET SIZE OF USER BUFFER ;DPR039'B BEQ 1$ ;NULL NOT ALLOWED ;DPR039 B ;D00eeb`TADATADATADATADATADATAPR039I.B CMP R1,#LN$SIZ ;IS SIZE TOO BIG? ;DPR039"B BLOS 2$ ;IF LOS NO ;DPR039;B1$: DRSTS D.RS89 ;RETURN ILLEGAL BUFFER LENGTH ;DPR039DB2$: ;DPR039?B CMP 12(R3),#LN$SIZ ;IS EQUIVALENCE STRING TOO BIG? ;DPR039S!B BHI 1$ ;IF HI YES ;DPR039BAB ADD 12(R3),R1 ;INCLUDE ENOUGH SPACE FOR EQUIV. STRING ;DPR039SB ;DPR039 >B ADD #,R1 ;ADD SIZE OF HEADER & DPB ;DPR039B ;DPR0399>B MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ ;DPR039;B ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ;DPR039 B ASH #-6,R1 ; ;DPR039R*B MOV R3,R5 ;SAVE DPB POINTER ;DPR039DB MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START ;DPR0392B CALL $CPALO ;GET BUFFER FROM CPRBUF ;DPR039B; ;DPR039(B; FILL IN REQUEST PACKET ;DPR039B; ;DPR0390B MOV R4,-(SP) ;SAVE SIZE OF REQUEST ;DPR039,B MOV R0,-(SP) ;SAVE PACKET BIAS ;DPR039B ;DPR039 (B MOV R0,KISAR6 ;MAP PACKET ;DPR0391B MOV #MAP6,R1 ;GET ADDRESS OF HEADER ;DPR039DB; ;DPR039#B; LOAD HEADER AREA ;DPR039,B; ;DPR0398B MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST ;DPR039(B CLRB H$ICNT(R1) ;NO ITEMS ;DPR039B; ;DPR039&B; LOAD PARAMETER AREA ;DPR039B; ;DPR039.B ADD #P$DPB,R1 ;POINT TO DPB AREA ;DPR0391B MOV -2(R5),(R1)+ ;COPY DIC AND SIZE ;DPR039P>B MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER ;DPR0394B MOV 2(R5),(R1)+ ;TABLE NUMBER & STATUS ;DPR039B ;DPR039DFB MOV #,(R1)+ ;ADDRESS OF LOGICAL NAME BUFFER ;DPR0393B MOV 6(R5),(R1)+ ;SIZE OF LOGICAL NAME ;DPR039VB ;DPR039NB MOV #,(R1) ;CALCULATE ADDRESS OF EQUIV STRING BUFFER ;DPR039;B ADD 6(R5),(R1)+ ;SKIP OVER LOGICAL NAME BUFFER ;DPR03919B MOV 12(R5),(R1)+ ;SIZE OF EQUIVALENCE STRING ;DPR039IB; ;DPR039/B; COPY LOGICAL NAME INTO PACKET ;DPR039DB; ;DPR0392B MOV 4(R5),R0 ;USER ADDRESS OF BUFFER ;DPR039:B MOV 6(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK ;DPR039*B CALL $ACHKB ;CHECK ADDRESS ;DPR039#B BCS 8$ ;IS CS ERROR ;DPR039VB ;DPR039:B CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT ;DPR039B; ;DPR039B; R1 := BIAS ;DPR039)B; R2 -> APR6 DISPLACEMENT ;DPR039,B; ;DPR039KB SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT ;DPR039E*B MOV (SP),R3 ;GET DEST BIAS ;DPR039@B MOV #,R4 ;GET DEST DISPLACEMENT ;DPR0390B MOV 6(R5),R0 ;GET SIZE OF TRANSFER ;DPR039;B CALL $BLXIO ;TRANSFER LOGICAL NAME INTO BUFFER ;DPR039 B; ;DPR0394B; COPY EQUIVALENCE STRING INTO PACKET ;DPR039B; ;DPR0393B MOV 10(R5),R0 ;USER ADDRESS OF BUFFER ;DPR039 ;B MOV 12(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK ;DPR039*B CALL $ACHKB ;CHECK ADDRESS ;DPR039#B BCS 8$ ;IS CS ERROR ;DPR039MB ;DPR039 :B CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT ;DPR039B ;DPR0399KB SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT ;DPR039 *B MOV (SP),R3 ;GET DEST BIAS ;DPR039EB MOV #,R4 ;CALCULATE DEST DISPLACEMENT ;DPR039 8B ADD 6(R5),R4 ;SKIP OVER LOGICAL NAME BUFFER ;DPR0391B MOV 12(R5),R0 ;GET SIZE OF TRANSFER ;DPR039A@B CALL $BLXIO ;TRANSFER EQUIVALENCE STRING INTO BUFFER ;DPR039B ;DPR039R0B MOV (SP)+,R0 ;GET PACKET BIAS BACK ;DPR0392B MOV (SP)+,R4 ;GET PACKET LENGTH BACK ;DPR039B ;DPR039:B CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME ;DPR039B ;DPR039V4B CALLR $CPDEA ;RELEASE THE CPRBUF SPACE ;DPR039B; ;DPR039!B; HANDLE ERRORS ;DPR039B; ;DPR039.B8$: MOV (SP)+,R0 ;GET PACKET BIAS ;DPR039)B TST (SP)+ ;CLEAN OFF STACK ;DPR039L-B CALL $CPDEA ;DEALLOCATE BUFFER ;DPR039F+B DRSTS D.RS98 ;ADDRESS ERROR ;DPR039+B9$: ;DPR039B .ENDC ; C$$RLG ;DPR0300eueccccc9T7C MOV #$LGBUF,R4 ;GET POINTER TO START OF STORAGE AREAC7D MOV (R3)+,-(SP) ;STORE THE SUBFUNCTION CODE AND MODE8E MOVB (R3),(SP) ;MOVE THE TABLE NUMBER TO STORAGE AREA/F CMPB #T$BLNM,(SP) ;IS THE TABLE NUMBER VALIDEG BLO 50$ ;IF LO, NO, EXITH; II; VERIFY THE DPB ARGUMENTS AND SET UP A DESCRIPTOR BLOCK TO PASS TO THEE<J; ACTION ROUTINE THAT ACTUALLY CREATES AND PLACES THE LNB.K;R6L MOV (SP)+,(R4)+ ;MOVE IN THE TABLE AND BLOCK NUMBER*M MOV $TKTCB,R2 ;GET THE CURRENT TASK TCB0N MOV T.UCB(R2),R5 ;GET THE CURRENT TI: ADDRESS7O TSTB (R3) ;SEE IF THIS IS A SYSTEM LOGICAL CREATIONOP BNE 10$ ;IF NE, NO1Q BIT #T3.PRV,T.ST3(R2); IS THE TASK PRIVILEGED?,R BEQ 60$ ;IF EQ, NO, DON'T ALLOW CREATION1S10$: CMPB #LT.TSK,(R3) ;IS THIS A TASK CREATIONT*T BEQ 20$ ;IF EQ, YES, LEAVE TCB ADDRESS-U MOV R5,R2 ;GET UCB ADDRESS INSTEAD OF TCBU9V20$: CMPB #LT.GRP,(R3) ;IS THIS A GROUP TABLE CREATION?;/W BNE 30$ ;IF NE, NO, LEAVE GROUP ENTRY BLANK,?X CALL GTUIC ;GET THE CURRENT TASKS PROTECTION UIC GROUP CODET<Y MOVB R1,(R3) ;FILL IN THE GROUP CODE FROM PROTECTION UIC3Z30$: SWAB (R3) ;SWITCH THE STATUS AND GROUP BYTE3;[ MOV (R3)+,(R4)+ ;MOVE THE STATUS AND GROUP TO DESCRIPTOR 5\ MOV R2,(R4)+ ;MOVE TCB/UCB ADDRESS INTO DESCRIPTORK2] CALL ACRIB ;VALIDATE IT IN THE USER TASK IMAGE2^ CALL PSCNV ;CONVERT TO P/OS STYLE IF NECESSARY5_ MOV R0,(R4)+ ;MOVE IN THE SIZE OF THE LOGICAL NAMEN3` MOV R1,(R4)+ ;MOVE IN THE APR BIAS OF THE BUFFER;a MOV R2,(R4)+ ;MOVE IN THE KISAR6 BIASED OFFSET OF BUFFERD8b CALL ACRIB ;VALIDATE EQUIVALENCE NAME BUFFER ADDRESS9c MOV R0,(R4)+ ;MOVE IN THE SIZE OF THE EQUIVALENCE NAME33d MOV R1,(R4)+ ;MOVE IN THE APR BIAS OF THE BUFFERS;e MOV R2,(R4)+ ;MOVE IN THE KISAR6 BIASED OFFSET OF BUFFERO;f MOV #$LGBUF,R5 ;POINT TO START OF DESCRIPTOR BLOCK AGAINLgh;;Ki; AT THIS POINT A DESCRIPTOR BLOCK WITH ALL VALIDATED PARAMETERS HAS BEENL@j; CREATED AND POINTED TO BY R5. THIS BLOCK HAS THE STRUCTURE:k;M3l; -----------------------------------------------E3m; | BLOCK NUMBER | TABLE NUMBER |A3n; -----------------------------------------------V3o; | GROUP NUMBER | STATUS BYTE |F3p; -----------------------------------------------S3q; | TCB / UCB ADDRESS |R3r; -----------------------------------------------O3s; | SIZE OF LOGICAL NAME IN BUFFER |H3t; -----------------------------------------------C3u; | 32 WD APR ADDRESS OF START OF LOGICAL |-3v; ----------------------------------------------- 3w; | APR6 BIASED OFFSET TO START OF LOGICAL |-3x; ----------------------------------------------- 3y; | SIZE OF EQUIVALENCE NAME IN BUFFER |-3z; -----------------------------------------------C3{; | 32 WD APR ADDRESS OF START OF EQUIVALENCE |-3|; -----------------------------------------------N3}; | APR6 BIASED OFFSET TO START OF EQUIVALENCE|-3~; -----------------------------------------------S;T7 CALL $CRLOG ;CREATE AND INSERT A LOGICAL NAME BLOCK-9 BCS 70$ ;IF C BIT SET, AN ALLOCATION FAILURE OCCURREDO4 TST R1 ;CHECK FOR SUPERCESSION OF PREVIOUS ENTRY3 BEQ 150$ ;IF EQ, NO SUPERCESSION, SIMPLY RETURNR; ;40$: DRSTS D.RSP3 ;RETURN A STATUS OF LOGICAL SUPERCEDED*50$: DRSTS D.RS20 ;INVALID TABLE NUMBER)60$: DRSTS D.RS16 ;PRIVILEGE VIOLATION-670$: DRSTS D.RS1 ;SECONDARY POOL ALLOCATION FAILURE .PAGE2 .SBTTL $LNDEL - LOGICAL NAME DELETION DIRECTIVE;+2; $LNDEL - ENTRY POINT FOR LOGICAL NAME DELETION;O; THE ROUTINE IS ENTERED FROM THE DRLOG DISPATCH AREA WITH R3 POINTING TO THE ; FOLLOWING DPB ENTRIES:;'; WD. 01 -- SUBFUNCTION CODE (2),MODEY"; WD. 02 -- TABLE NUMBER, STATUS,; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER); WD. 04 -- SIZE OF LOGICAL NAME BUFFER0;S;- $LNDEL::4 .IF DF C$$RLG ; REMOTE LOGICAL SUPPORT ;DPR039 ;DPR039.= BIT #F5.RLG,$FMSK5 ;ARE WE USING REMOTE LOGICAL? ;DPR039# BNE 100$ ;IF00eeb`TADATADATADATADATADATA NE YES ;DPR039C1 JMP 109$ ;PERFORM NORMAL PROCESSING ;DPR039F100$: ;DPR039; ;DPR0391; GET A REQUEST PACKET FROM CPRBUF ;DPR039-; ;DPR0392 MOV 6(R3),R1 ;GET SIZE OF USER BUFFER ;DPR039. CMP R1,#LN$SIZ ;IS IT TOO LARGE? ;DPR039* BLOS 105$ ;IF LO OR SAME NO ;DPR0390 DRSTS D.RS89 ;INVALID BUFFER SIZE ;DPR039105$: ;DPR039> ADD #,R1 ;ADD SIZE OF HEADER & DPB ;DPR039> MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ ;DPR039; ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ;DPR039; ASH #-6,R1 ; ;DPR039D MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START ;DPR039* MOV R3,R5 ;SAVE DPB POINTER ;DPR0392 CALL $CPALO ;GET BUFFER FROM CPRBUF ;DPR039; ;DPR0399; FILL IN REQUEST PACKET AND SEND TO CPRAME ;DPR039R; ;DPR0390 MOV R4,-(SP) ;SAVE SIZE OF REQUEST ;DPR039, MOV R0,-(SP) ;SAVE PACKET BIAS ;DPR039 ;DPR039U( MOV R0,KISAR6 ;MAP PACKET ;DPR0391 MOV #MAP6,R1 ;GET ADDRESS OF HEADER ;DPR039 ;DPR039 8 MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST ;DPR039( CLRB H$ICNT(R1) ;NO ITEMS ;DPR039 ;DPR0399. ADD #P$DPB,R1 ;POINT TO DPB AREA ;DPR0391 MOV -2(R5),(R1)+ ;COPY DIC AND SIZE ;DPR039K> MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER ;DPR039 ;DPR039O. TST 4(R5) ;DELETE ALL LOGICALS? ;DPR039 BNE 106$ ;NO ;DPR039 9 CLR (R1)+ ;NO ADDRESS OF LOGICAL NAME BUFFER ;DPR039# CLR (R1)+ ;DPR039R. BR 108$ ;DON'T COPY LOGICAL NAME ;DPR039106$: ;DPR039F MOV #,(R1)+ ;ADDRESS OF LOGICAL NAME BUFFER ;DPR0399 MOV 6(R5),(R1)+ ;SIZE OF LOGICAL NAME BUFFER ;DPR039; ;DPR039/; COPY LOGICAL NAME INTO PACKET ;DPR039C; ;DPR0392 MOV 4(R5),R0 ;USER ADDRESS OF BUFFER ;DPR039: MOV 6(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK ;DPR039* CALL $ACHKB ;CHECK ADDRESS ;DPR039# BCS 8$ ;IS CS ERROR ;DPR0391 ;DPR039: CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT ;DPR039; ;DPR039; R1 := BIAS ;DPR039); R2 -> APR6 DISPLACEMENT ;DPR039(; ;DPR039K SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT ;DPR039E* MOV (SP),R3 ;GET DEST BIAS ;DPR039@ MOV #,R4 ;GET DEST DISPLACEMENT ;DPR0390 MOV 6(R5),R0 ;GET SIZE OF TRANSFER ;DPR039; CALL $BLXIO ;TRANSFER LOGICAL NAME INTO BUFFER ;DPR039 108$: ;DPR0390 MOV (SP)+,R0 ;GET PACKET BIAS BACK ;DPR0392 MOV (SP)+,R4 ;GET PACKET LENGTH BACK ;DPR039 ;DPR039: CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME ;DPR039 ;DPR039,. CALLR $CPDEA ;DEALLOCATE BUFFER ;DPR039109$: ;DPR039 .ENDC ; C$$RLG ;DPR039M;MN; CREATE A DESCRIPTOR BLOCK TO SEARCH THE APPROPRIATE TABLE FOR ALL LOGICALSL; OR FOR A SPECIFIC ONE. THE DESCRIPTOR IS A FOUR WORD BLOCK BEGINNING ATM; LOCATION $TEMP0 IN SYSCM AND CONTAINS THE APR BIAS AND OFFSET AND SIZE OFPL; A SPECIFIC LOGICAL (OR ZEROES IF ALL) AND THE UCB ADDRESS TO MATCH (TCB,; IF TASK LOGICAL DELETE).;U? MOV #$TONYL,R5 ;GET ADDRESS OF DESCRIPTOR BLOCK TO BE FILLED;6 MOV (R3)+,-(SP) ;STORE THE MODE VALUE FOR LATER USE;N5; GET THE APPROPRIATE UCB (OR TCB, IF TASK LOGICAL)O;C MOV $TKTCB,R2 ;GET TASK TCB8 MOV T.UCB(R2),R4 ;GET THE ASSOCIATED TI: FOR THE TASK/ CMPB #T$BLNM,(R3) ;IS THE TABLE NUMBER VALIDI BLO 50$ ;IF LO, NO, EXIT, TSTB (R3) ;IS THIS A SYSTEM TABLE DELETE BNE 110$ ;IF NE, NOEE BIT #T3.PRV,T.ST3(R2); IS THE TASK PRIVILEGED TO DELETE SYSTEM LOGE5 BEQ 60$ ;IF EQ, NO, EXIT WITH PRIVILEGE VIOLATIONB6110$: CMPB #LT.TSK,(R3) ;IS THIS A TASK TABLE DELETE0 BEQ 120$ ;IF EQ, YES, KEEP TCB IN DESCRIPTOR MOV R4,R2 ;GET UCB ADDRESS:120$: MOV R2,-(R5) ;MOVE TCB/UCB ADDRESS INTO DESCRIPTOR;EJ; PICK UP THE AP00fuecccccPROPRIATE TABLE NUMBER AND BLOCK IDENTIFIER FROM THE DPB;@ MOVB (R3)+,(SP) ;MOVE THE TABLE NUMBER INTO STORAGE WITH MODE? MOV (SP)+,-(R5) ;GET THE TABLE AND BLOCK NUMBER FROM STORAGEE2 INC R3 ;POINT TO THE BUFFER ADDRESS IN THE DPB;QJ; CHECK FOR A SPECIFIC LOGICAL DELETION OR AN ENTIRE TABLE BY LOOKING AT+; THE BUFFER ADDRESS FOR THE LOGICAL NAMEE;B* TST (R3) ;CHECK FOR A SPECIFIC LOGICAL! BNE 130$ ;IF NE, THERE IS ONEU;DF; ALL LOGICALS ARE TO BE DELETED. LEAVE THE BUFFER DESCRIPTORS ZERO;K% CLR -(R5) ;CLEAR THE LOGICAL SIZE / CLR -(R5) ;CLEAR THE APR BIAS TO THE BUFFERT- CLR -(R5) ;CLEAR THE OFFSET TO THE STRINGL BR 140$ ;JOIN COMMON CODEC;;M; A SPECIFIC LOGICAL IS GIVEN. VALIDATE THE USER BUFFER AND SIZE AND PLACED!; THEM IN THE DESCRIPTOR BLOCK.N;:130$: CALL ACRIB ;ADDRESS CHECK THE USER LOGICAL BUFFER2 CALL PSCNV ;CONVERT TO P/OS STYLE IF NECESSARY8 MOV R2,-(R5) ;FILL IN APR6 OFFSET TO START OF LOGICAL+ MOV R1,-(R5) ;FILL IN APR BIAS OF BUFFER1 MOV R0,-(R5) ;FILL IN BYTE COUNT IN DESCRIPTOR);EK; CHECK THE DESCRIPTOR FOR COMPLETE OR SPECIFIC DELETE. IF SPECIFIC, THELH; LOGICAL MUST BE HASHED, SEARCHED FOR IN THE TABLE, AND THEN DELETED.L; IF THIS IS A COMPLETE DELETE, CALL $LNDAL TO ELIMINATE EVERYTHING IN THE; HASH TABLE. ;A<140$: MOV R5,R0 ;SET UP DESCRIPTOR ADDRESS FOR PROCESSING8 CALL $DELOG ;DELETE THE APPROPRIATE LOGICAL OR TABLE* BCC 150$ ;IF CC, SUCCESSFUL COMPLETION: TST R3 ;CHECK WHETHER NOT FOUND OR PRIVILEGE VIOLATION4 BNE 60$ ;IF NE, PRIVILEGE VIOLATION ON FOUND LNB% BR 160$ ;IF EQ, LOGICAL NOT FOUND 150$: RETURN-160$: DRSTS D.RS21 ;LOGICAL NAME NOT FOUND   .DSABL LSBE .PAGE5 .SBTTL $LNFTL - LOGICAL NAME TRANSLATION DIRECTIVEE;+D; $LNFTL - ENTRY POINT FOR LOGICAL NAME DIRECTIVE TRANSLATION CODE;-M; THIS DIRECTIVE SEARCHES EACH OF THE HIERARCHICAL TABLES FOR THE SPECIFIEDBN; LOGICAL UNLESS AN INHIBIT MASK BIT IS SET TO PREVENT THAT TABLE FROM BEING; LOOKED AT.;O; THE ROUTINE IS ENTERED FROM THE DRLOG DISPATCH AREA WITH R3 POINTING TO THEO; FOLLOWING DPB ENTRIES:;6'; WD. 01 -- SUBFUNCTION CODE (1),MODE ; WD. 02 -- TBMASK, STATUS,; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER); WD. 04 -- SIZE OF LOGICAL NAME BUFFERI0; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERRE; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAMEB>; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODE; L; THE FOLLOWING WORD IS NOT PRESENT IF THIS ROUTINE IS ENTERED VIA A TLOG$!; DIRECTIVE FROM A P/OS SYSTEM.; B; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCK;3 $LNFTL::4 .IF DF C$$RLG ; REMOTE LOGICAL SUPPORT ;DPR039 ;DPR039-= BIT #F5.RLG,$FMSK5 ;ARE WE USING REMOTE LOGICAL? ;DPR039I! BNE 1$ ;IF NE YES ;DPR039 0 JMP 11$ ;PERFORM NORMAL PROCESSING ;DPR0391$: ;DPR039; ;DPR0391; GET A REQUEST PACKET FROM CPRBUF ;DPR039O; ;DPR0393 MOV 6(R3),R1 ;GET SIZE OF LOGICAL NAME ;DPR039M% BEQ 2$ ;IF ZERO ERROR ;DPR039D ;DPR039I. CMP R1,#LN$SIZ ;IS IT TOO LARGE? ;DPR039( BLOS 3$ ;IF LO OR SAME NO ;DPR03932$: DRSTS D.RS89 ;INVALID BUFFER SIZE ;DPR039$3$: ;DPR039? CMP 12(R3),#LN$SIZ ;IS EQUIVALENCE STRING TOO BIG? ;DPR039P! BHI 2$ ;IF HI YES ;DPR039;A ADD 12(R3),R1 ;INCLUDE ENOUGH SPACE FOR EQUIV. STRING ;DPR039U; ;DPR039>; INCREASE ALLOCATION TO ALLOW FOR THE FOLLOWING; ;DPR039 ; H$SIZE HEADER ;DPR039; TL$SIZ DPB ;DPR039D.; 10 TASK DESTINATION ADDRESSES; ;DPR039%; EQUIV STRING BUFFER ;DPR039 ; RETURNED SIZE ;DPR039!; TABLE # & MODE ;DPR039 %; LOGICAL STATUS BITS ;DPR039P&; 6 RETURNED PARAMETERS ;DPR039 ; RETURNED SIZE ;DPR039!; TABLE # & MODE ;DPR0300feb`TADATADATADATADATADATA9,%; LOGICAL STATUS BITS ;DPR039I; ;DPR039(TMP = H$SIZE+TL$SIZ+10+6 ;DPR039 ADD #TMP,R1 ;DPR0390 ;DPR039 > MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ ;DPR039; ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ;DPR039  ASH #-6,R1 ; ;DPR039 D MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START ;DPR039* MOV R3,R5 ;SAVE DPB POINTER ;DPR0392 CALL $CPALO ;GET BUFFER FROM CPRBUF ;DPR039; ;DPR0399; FILL IN REQUEST PACKET AND SEND TO CPRAME ;DPR039 ; ;DPR0390 MOV R4,-(SP) ;SAVE SIZE OF REQUEST ;DPR039, MOV R0,-(SP) ;SAVE PACKET BIAS ;DPR039 ;DPR039U( MOV R0,KISAR6 ;MAP PACKET ;DPR0391 MOV #MAP6,R1 ;GET ADDRESS OF HEADER ;DPR039 ;DPR039 8 MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST ;DPR039( CLRB H$ICNT(R1) ;NO ITEMS ;DPR039; ;DPR039; FILL IN DPB ;DPR039M; ;DPR039. ADD #P$DPB,R1 ;POINT TO DPB AREA ;DPR0391 MOV -2(R5),(R1)+ ;COPY DIC AND SIZE ;DPR0399> MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER ;DPR0396 MOV 2(R5),(R1)+ ;COPY TABLE MASK & STATUS ;DPR039 ;DPR039 ; MOV #TMP,(R1)+ ;ADDRESS OF LOGICAL NAME BUFFER ;DPR039 9 MOV 6(R5),(R1)+ ;SIZE OF LOGICAL NAME BUFFER ;DPR039; ;DPR039;@ MOV #TMP,(R1) ;CALCULATE ADDRESS OF EQUIV STRING BUF ;DPR039; ADD 6(R5),(R1)+ ;SKIP OVER LOGICAL NAME BUFFER ;DPR0399 MOV 12(R5),(R1)+ ;SIZE OF EQUIVALENCE STRING ;DPR0395 ;DPR039 = MOV #TMP-6,(R1)+ ;ADDRESS OF RETURNED SIZE BUFFER ;DPR039M> MOV #TMP-4,(R1)+ ;ADDRESS OF TABLE # & MODE BUFFER ;DPR039C MOV #TMP-2,(R1)+ ;ADDRESS OF LOGICAL STATUS BITS BUFFER ;DPR039 ; ;DPR039P; FILL IN TASK ADDRESSES (TO BE USED AFTER CPRAME COMPLETES FUNCTION) ;DPR039; ;DPR039D MOV 10(R5),(R1)+ ;STORE TASK ADDRESS OF EQUIV STRING BUF ;DPR039D MOV 14(R5),(R1)+ ;STORE TASK ADDRESS OF RETURNED SIZE BUF ;DPR039B MOV 16(R5),(R1)+ ;STORE TASK ADDRESS OF TABLE # & MODE ;DPR039E MOV 20(R5),(R1) ;STORE TASK ADDRESS OF LOGICAL STATUS BITS ;DPR039E; ;DPR039/; COPY LOGICAL NAME INTO PACKET ;DPR039O; ;DPR0392 MOV 4(R5),R0 ;USER ADDRESS OF BUFFER ;DPR039: MOV 6(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK ;DPR039* CALL $ACHKB ;CHECK ADDRESS ;DPR039$ BCS 10$ ;IS CS ERROR ;DPR039 ;DPR039V: CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT ;DPR039; ;DPR039; R1 := BIAS ;DPR039); R2 -> APR6 DISPLACEMENT ;DPR039 ; ;DPR039K SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT ;DPR039E* MOV (SP),R3 ;GET DEST BIAS ;DPR0395 MOV #MAP6+TMP,R4 ;GET DEST DISPLACEMENT ;DPR03960 MOV 6(R5),R0 ;GET SIZE OF TRANSFER ;DPR039; CALL $BLXIO ;TRANSFER LOGICAL NAME INTO BUFFER ;DPR039  ;DPR0390 MOV (SP)+,R0 ;GET PACKET BIAS BACK ;DPR0392 MOV (SP)+,R4 ;GET PACKET LENGTH BACK ;DPR039 ;DPR039 : CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME ;DPR039; ;DPR039&; GET RESPONSE PACKET ;DPR039; ;DPR039, MOV R0,-(SP) ;SAVE PACKET BIAS ;DPR039( MOV R0,KISAR6 ;MAP PACKET ;DPR039 ;DPR0396; CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURNED? ;DPR039B! BEQ 4$ ;IF EQ YES ;DPR039U@ CMP #IE.RBS,MAP6+H$STAT ;WAS IT JUST A SIZE PROBLEM? ;DPR039( BNE 5$ ;IF NE FATAL ERROR ;DPR0394$: ;DPR039!DPB = MAP6+P$DPB ;DPR039S"TASK = DPB+TL$SIZ ;DPR039TEMP = TASK+10 ;DPR039P; ;DPR0390; TRANSFER EQUIV STRING INTO TASK ;DPR039; ;DPR0397 MOV TASK,R0 ;TASK ADDRESS OF EQUIV STRING ;DPR03903 MOV DPB+14,R1 ;SIZE OF BUFFER FROM DPB ;DPR039;, CALL $ACHKB ;DO ADDRESS CHECK ;DPR039# BCS 9$ ;IF CS ERROR ;DPR039S ;DPR039J8 CALL $RELOC ;GET BIAS AND OFFSET OF BUFFER ;DPR039; 00fueccccc ;DPR039; R1 := BIAS ;DPR039); R2 -> APR6 DISPLACEMENT ;DPR039 ; ;DPR0393 MOV R1,R3 ;SET UP DEST BIAS FOR BLXIO ;DPR039N1 MOV R2,R4 ;SET UP DEST DISPLACEMENT ;DPR039 6 MOV (SP),R1 ;SET UP SOURCE BIAS FOR APR5 ;DPR0399 MOV #MAP5+TMP,R2 ;SET UP SOURCE DISPLACEMENT ;DPR039D6 ADD DPB+10,R2 ;SKIP OVER LOGICAL NAME BUF ;DPR039- MOV TEMP,R0 ;GET RETURNED SIZE ;DPR039 9 CALL $BLXIO ;RETURN EQUIVALENCE NAME STRING ;DPR039;; ;DPR0391; TRANSFER OTHER BUFFERS INTO TASK ;DPR039P; ;DPR0395 MOV #TASK+2,R3 ;ADDRESS OF OTHER BUFFERS ;DPR039E ;DPR039D0 MOV TEMP,R4 ;SIZE OF EQUIV STRING ;DPR039% CALL 6$ ;MOVE TO TASK ;DPR039E ;DPR0390, MOV TEMP+2,R4 ;TABLE # & MODE ;DPR039% CALL 6$ ;MOVE TO TASK ;DPR039P ;DPR039F0 MOV TEMP+4,R4 ;LOGICAL STATUS BITS ;DPR039% CALL 6$ ;MOVE TO TASK ;DPR039A ;DPR039D35$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK ;DPR039E. CALLR $CPDEA ;DEALLOCATE BUFFER ;DPR039; ;DPR039T; ROUTINE TO VERIFY THE EXISTENCE OF AN OPTIONAL WORD, ADDRESS CHECK IT IF ;DPR039S; IT IS THERE, AND PLACE THE VALUE IN R4 IN THE LOCATION SPECIFIED IN THE ;DPR039,; NEXT WORD IN THE DPB (R3). ;DPR039; ;DPR039:6$: MOV (R3)+,R0 ;SEE IF NEXT ENTRY IS DEFINED ;DPR039& BEQ 8$ ;IF EQ, NO, EXIT ;DPR039 ;DPR039R9 MOV #7$,-(SP) ;SPECIFY $SGFIN RETURN ADDRESS ;DPR039B* CALL $SGFIN ;INHIBIT TRAPS ;DPR0399 MOV R4,-(SP) ;GET VALUE TO PLACE IN LOCATION ;DPR039 2 MTPD (R0) ;PLACE VALUE INTO LOCATION ;DPR039* RETURN ;RETURN FROM $SGFIN ;DPR0397$: ;DPR0390 ;CARRY-BIT INDICATES STATUS [TBS] ;DPR0398$: RETURN ;DPR039; ;DPR039!; HANDLE ERRORS ;DPR039X; ;DPR03939$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK ;DPR039 - CALL $CPDEA ;DEALLOCATE BUFFER ;DPR039N0 DRSTS D.RS98 ;ADDRESS CHECK ERROR ;DPR039 ;DPR039/10$: MOV (SP)+,R0 ;GET PACKET BIAS ;DPR039 ) TST (SP)+ ;CLEAN OFF STACK ;DPR039O- CALL $CPDEA ;DEALLOCATE BUFFER ;DPR039I+ DRSTS D.RS98 ;ADDRESS ERROR ;DPR039C11$: ;DPR039  .ENDC ; C$$RLG ;DPR039 ;9L; A DESCRIPTOR BLOCK IS SET UP TO PASS TO THE TABLE LOOKUP ROUTINES. THISO; BLOCK GETS THE MODIFIER VALUE FROM THE DPB DIRECTLY. THE USER LOGICAL NAMECP; BUFFER IS ADDRESS CHECKED (FOR READ-ONLY ACCESS) AND THE APR BIAS AND OFFSETP; TO THE START OF THE LOGICAL STRING IS PLACED IN THE DESCRIPTOR. THE SIZE OFL; THE INDICATED STRING IS ALSO PLACED IN THE BLOCK. R0 WILL POINT TO THIS-; BLOCK ACROSS ALL CALLS IN THIS DIRECTIVE.:; 2 MOV #$TONYL,R5 ;GET POINTER TO DESCRIPTOR BLOCK9 MOV $TKTCB,-(R5) ;GET THE CURRENT TCB FOR FIRST LOOKUP % MOV (R5),R0 ;SAVE THE TCB ADDRESST;  MOV (R3)+,-(R5) ;MOVE THE MODIFIER INTO DESCRIPTOR BLOCKM?  MOV (R3)+,$TONYL ;STORE THE TABLE INHIBIT MASK FOR LATER USEA0  BIT #1,$TONYL ;SEE IF TASK TABLE IS INHIBITED;  BEQ 12$ ;IF EQ, NO, KEEP TCB ADDRESS IN PACKET ;DPR039NC  MOV T.UCB(R0),2(R5) ;MOVE THE UCB ADDRESS INTO THE PACKET ;**-1;C.; ADDRESS CHECK THE USER LOGICAL NAME BUFFER;#F12$: CALL ACRIB ;ADDRESS CHECK THE USER LOGICAL NAME BUFFER ;DPR0399 CALL PSCNV ;CONVERT TO P/OS STYLE IF NECESSARY ;**-1C8 MOV R3,-(SP) ;STORE THE CURRENT DPB POINTER FOR LATER7 MOV R2,-(R5) ;GET THE APR6 OFFSET TO START OF STRINGB3 MOV R1,-(R5) ;GET THE APR BIAS TO LOGICAL STRING ? MOV R0,-(R5) ;GET THE SIZE OF THE LOGICAL NAME IN DESCRIPTORA+ MOV R5,R0 ;POINT R0 TO DESCRIPTOR STARTT;B?; CALL THE ROUTINE TO DO THE LOOKUP IN THE APPROPRIATE TABLESR;C: CMPB #R$LOG,$DICSV+2 ;IS THIS REALLY AN RLOG$ DIRECTIVE3 BEQ 20$ ;IF EQ, YES, SEARCH RECURSIVELY FOR LNBV: CMPB #R$LON,$DICSV+2 ;IS THIS REALLY AN RLOG$ DIRECTIVE3 BEQ 20$ ;IF EQ, YES, SEARCH RECURSIVELY FOR LNB ;TJ ; FOR A TLOG$ DIRECTIVE,00feb`TADATADATADATADATADATA ONLY LOOK FOR THE SPECIFIED LOGICAL NAME IN THE)!; TOP LEVELS OF THE LOGICAL NAME TABLES ";E;# CALL $TBSRC ;SEARCH ALL HIERARCHICAL TABLES FOR LOGICALR*$ BCS 100$ ;IF CS, NO LOGICAL NAME FOUND"% BR 40$ ;JOIN COMMON CODE BELOW&;L'; FOR AN RLOG$ DIRECTIVE, LOOK THROUGH THE LOGICAL NAME TABLES RECURSIVELYG(; FOR THE FINAL EQUIVALENCE NAME. ANY SPECIFIED INHIBIT MASK WILL BES-); PROPAGATED THROUGH ALL RECURSIVE LOOKUPS. *;S:+20$: CLR R3 ;CALL ITERATIVE ROUTINE IN EXACT MATCH MODE2, CALL $LGRCS ;RECURSIVELY LOOK FOR LOGICAL NAME,- BCS 100$ ;IF CS, RECURSIVE LIMIT WAS HIT$. MOV $LSTLG,R3 ;GET POINTER TO LNB%/ BEQ 100$ ;IF EQ, THERE WASN'T ONE;0;,O1; NOW THAT THE LOGICAL NAME HAS BEEN FOUND, THE APR BIAS TO THE LNB IS STORED$M2; FOR LATER USE AND THE USER EQUIVALENCE NAME BUFFER IS ADDRESSED CHECK FOR M3; READ/WRITE ACCESS. IF IS VALID, THE SOURCE AND DESTINATION REGISTERS AREAN4; SET UP FOR A $BLXIO CALL TO PLACE THE EQUIVALENCE NAME IN THE USER BUFFER.5;O:640$: MOV R3,$TONYL ;STORE THE LNB APR BIAS FOR LATER USE17 MOV (SP)+,R3 ;RESTORE THE POINTER INTO THE DPBS<8 CALL ACROB ;ADDRESS CHECK RW THE USER EQUIVALENCE BUFFER39 MOV R3,-(SP) ;STORE THE POINTER TO THE DPB AGAINU5: MOV R1,R3 ;SET UP DESTINATION APR BIAS FOR $BLXIOS7; MOV R2,R4 ;SET UP APR6 OFFSET VALUE FOR DESTINATION '< MOV $TONYL,KISAR6 ;MAP THE FOUND LNB,=;SO>; THE NUMBER OF BYTES TO PASS THROUGH $BLXIO IS DETERMINED BY THE SIZE OF THEQK?; USER BUFFER. IF IT IS LARGE ENOUGH TO HOLD THE ENTIRE STRING, THE SIZE Q@; GIVEN IN THE LOGICAL BLOCK WILL BE PASSED. IF THE BUFFER ISN'T LARGE ENOUGH, QA; ONLY AS MUCH AS IT CAN HOLD WILL BE PASSED. IN EITHER CASE, THE VALUE PASSEDILB; IN THE USER SIZE WORD (RSIZE) WILL BE THE ACTUAL SIZE OF THE EQUIVALENCE C; STRINGD;SDE CMPB MAP6+L.NENS,R0 ;SEE IF THE EQUIVALENCE SIZE IS > BUFFER SIZE7F BHIS 50$ ;IT IS, ONLY RETURN USER BUFFER SIZE WORTHGG CLR R0 ;REMOVE OLD VALUE>H BISB MAP6+L.NENS,R0 ;IT ISN'T, ONLY RETURN EQUIVALENCE SIZE9I50$: CLR R2 ;INITIALIZE THE POINTER TO THE EQUIVALENCEW)J BISB MAP6+L.NLNS,R2 ;STRING FOR $BLXIONK ADD #MAP5+L.NNAM,R2 ;<L MOV KISAR6,R1 ;GET THE APR BIAS TO START OF SOURCE STRINGM;1N; INITIATE THE DATA MOVEMENT TO THE USER BUFFERSO;F;P CALL $BLXIO ;MOVE THE EQUIVALENCE STRING TO USER BUFFEREQ;TMR; THE REMAINDER OF THE WORK TO DO IS FILLING IN THE USER OPTIONAL WORDS FORFMS; THE SIZE OF THE FOUND EQUIVALENCE STRING, THE TABLE NUMBER AND MOD OF THE CT; FOUND LNB, AND THE STATUS BITS TAKEN FROM IT. IF A WORD IS NOTTKU; DEFINED, THAT PARTICULAR DATA WILL NOT BE PASSED BACK TO THE USER TASK.LV;,(W MOV (SP)+,R3 ;RESTORE THE DPB POINTERX;R.Y; PASS BACK THE EQUIVALENCE NAME STRING SIZEZ;E8[ CLR R4 ;GET VALUE FOR THE EQUIVALENCE NAME SIZE WORD\ BISB MAP6+L.NENS,R4 ;'] CALL 90$ ;PLACE IT IN THE USER WORDR^;D<_; PASS BACK THE TABLE NUMBER AND MOD OF FOUND LOGICAL NAME`;OBa MOV MAP6+L.NTBL,R4 ;GET VALUE FOR USER WORD FOR TABLE # AND MOD'b CALL 90$ ;PLACE IT IN THE USER WORDIc;OKd; PASS BACK THE STATUS BITS FOUND FOR THE LOGICAL NAME. THIS OPERATION ISU>e; ELIMINATED IF THE DIRECTIVE WAS ISSUED FROM A P/OS SYSTEM.f; 6g CMPB #P$SSIZ,$DICSV+1;IS THE DPB FROM A P/OS SYSTEM3h BEQ 95$ ;IF EQ, YES, SKIP THE STATUS WORD CHECKi)j CLR R4 ;GET VALUE FOR THE STATUS WORDIk BISB MAP6+L.NSTS,R4 ;lmn;+Lo; ROUTINE TO VERIFY THE EXISTENCE OF AN OPTIONAL WORD, ADDRESS CHECK IT IFKp; IT IS THERE, AND PLACE THE VALUE IN R4 IN THE LOCATION SPECIFIED IN THEWq; NEXT WORD IN THE DPB (R3).r;-1s90$: MOV (R3)+,R0 ;SEE IF NEXT ENTRY IS DEFINEDt BEQ 95$ ;IF EQ, NO, EXIT.u MOV #2,R1 ;SET UP SIZE OF BUFFER TO VERIFY<v CALL $ACHCK ;ADDRESS CHECK THE BUFFER RW (WORD BOUNDARY)1w BCS 110$ ;IF CS, ADDRESS CHECK ERROR OCCURREDR/x MOV R4,-(SP) ;GET VALUE TO PLACE IN LOCATIONL)y MTPD$ (R0) ;PLACE VALUE INTO LOCATIONR z95$: RETURNC{-|100$: DRSTS D.RS21 ;LOGICAL NAME NOT FOUNDI4}110$: DRSTS D.RS98 ;ADDRESS CHE00 fuecccccCK ERROR ON BUFFER~ .PAGE;+N; $CRLOG - ROUTINE TO TAKE A PREVIOUSLY VERIFIED LOGICAL NAME CREATION BLOCKQ; AND CREATE AND INSERT AN LNB INTO THE APPROPRIATE TABLE FOR THAT LOGICAL.O; ANY PREVIOUS LOGICAL WITH THE SAME NAME WILL BE DELETED AND SUPERCEDED.,M; SUPERCESSION WILL BE INDICATED BY SETTING THE V BIT COMING OUT OF THEL; ROUTINE.; ; INPUTS:CK; R5 - POINTER TO THE DESCRIPTOR BLOCK CONTAINING DATA FOR LOGICAL CREATE; WITH THE FORMAT:D;C4; -----------------------------------------------4; | BLOCK NUMBER | TABLE NUMBER |4; -----------------------------------------------4; | GROUP NUMBER | STATUS BYTE |4; -----------------------------------------------4; | TCB / UCB ADDRESS |4; -----------------------------------------------4; | SIZE OF LOGICAL NAME IN BUFFER |4; -----------------------------------------------4; | 32 WD APR ADDRESS OF START OF LOGICAL |4; -----------------------------------------------4; | APR6 BIASED OFFSET TO START OF LOGICAL |4; -----------------------------------------------4; | SIZE OF EQUIVALENCE NAME IN BUFFER |4; -----------------------------------------------4; | 32 WD APR ADDRESS OF START OF EQUIVALENCE |4; -----------------------------------------------4; | APR6 BIASED OFFSET TO START OF EQUIVALENCE|4; -----------------------------------------------;S ; OUTPUTS:%; CC - LNB WAS SUCCESSFULLY CREATED-5; R1 = 0 IF NO SUPERCESSION OF PREVIOUS ASSIGNMENTT7; R1 <> 0 IF SUPERCESSION OF PREVIOUS ENTRY OCCURRED-5; CS - A SECONDARY POOL ALLOCATION FAILURE OCCURREDF; I; R5 IS PRESERVED ACROSS THE CALL; HOWEVER THE DATA IN THE BLOCK IS NOTD'; KISAR6 IS DESTROYED BY THIS ROUTINE;-I; CALLER MUST HAVE VALIDATED ALL ENTRIES IN THE DESCRIPTOR BLOCK BEFOREOJ; CALLING THIS ROUTINE. CALLER MUST ALSO HAVE VERIFIED THAT THE TASK IS8; PRIVILEGED IF THIS IS TO BE A SYSTEM TABLE CREATION.;I; A ZERO VALUE IN THE BLOCK NUMBER VARIABLE HAS NO MEANING. THE LOWESTCH; VALID NUMBER IS 1 (LB.LOC). IT WILL BE PLACED IN THE LNB BY DEFAULTI; IF A ZERO VALUE IS SEEN. THIS HELPS THE COMPATIBILITY ISSUE WITH POST;- $CRLOG::; I; CHECK FOR A ZERO VALUE IN THE BLOCK PARAMETER. IF THERE IS ONE, TURNA.; IT INTO A DEFAULT CREATION VALUE (LB.LOC).;N, TSTB 1(R5) ;CHECK FOR A ZERO BLOCK VALUE+ BNE 5$ ;IF NE, SOMETHING ELSE WAS GIVEN = MOVB #LB.LOC,1(R5) ;MOVE IN THE DEFAULT VALUE FOR CREATIONL;UF; CREATE THE LOGICAL NAME BLOCK AND FILL IN THE APPROPRIATE ENTRIES.;I.5$: MOVB (R5),R3 ;GET TABLE NUMBER FROM LNB# CALL $TBTRL ;MAP THE HASH TABLEC+ BCS 70$ ;IF CS, THERE WAS NO HASH TABLEL5 MOV #L.NHSZ+77,R1 ;GET SIZE OF STATIC PIECE OF LNBA: ADD 6(R5),R1 ;ADD THE SIZE OF THE PROPOSED LOGICAL NAME? ADD 14(R5),R1 ;ADD THE SIZE OF THE PROPOSED EQUIVALENCE NAMEV, ASH #-6,R1 ;TURN BYTES INTO 32 WD BLOCKS; CALL $ALSEC ;ALLOCATE A PIECE OF SECONDARY POOL FOR LNBE% BCS 70$ ;IF CS, ALLOCATION FAILEDM# MOV R0,KISAR6 ;MAP THE NEW BLOCKN@ MOV #MAP6+L.NTBL,R4 ;SET UP OFFSET VALUE FOR THE TABLE NUMBER8 MOV R5,-(SP) ;SAVE THE BUFFER POINTER ACROSS THE CALL8 MOV (R5)+,(R4)+ ;MOVE BLOCK AND TABLE NUMBER INTO LNB9 MOV (R5)+,(R4)+ ;MOVE STATUS AND GROUP NUMBER INTO LNBO4 MOV (R5)+,(R4)+ ;MOVE TCB OR UCB ADDRESS INTO LNB) MOV (R5)+,R0 ;GET SIZE OF LOGICAL NAMER;UD; TRANSFER THE LOGICAL NAME STRING FROM THE USER BUFFER TO THE LNB;P% MOV R0,(R4)+ ;MOVE IT INTO THE LNBA4 MOV (R5)+,R1 ;GET APR BIAS OF LOGICAL NAME BUFFER4 MOV (R5)+,R2 ;GET OFFSET TO START OF LOGICAL NAME8 SUB #MAP6-MAP5,R2 ;TURN IT INTO AN APR5-BIASED OFFSET. MOV KISAR6,R3 ;GET THE DESTINATION APR BIAS5 CALL $BLXIO ;TRANSFER THE LOGICAL NAME TO THE LNB ; H; TRANSFER THE EQUIVALENCE NAME STRING FROM THE USER BUFFER TO THE LNB;(7 MOV (R5)+,R0 ;GET THE SIZE OF THE EQU00(feb`TADATADATADATADATADATAIVALENCE STRINGE@ MOVB R0,MAP6+L.NENS ;MOVE IN THE SIZE OF THE EQUIVALENCE NAME9 MOV (R5)+,R1 ;GET APR BIAS FOR EQUIVALENCE NAME BUFFERB MOV (R5)+,R2 ;GET APR OFFSETV8 SUB #MAP6-MAP5,R2 ;TURN IT INTO AN APR5 BIASED OFFSET/ CALL $BLXIO ;MOVE EQUIVALENCE NAME INTO LNB;KM; SET UP A MINIATURE DESCRIPTOR BLOCK TO PASS TO THE LOOKUP ROUTINES TO SEEAL; IF THIS LOGICAL IS A SUPERCESSION OF A CURRENTLY EXISTING LOGICAL. THISN; MINI DESCRIPTOR BLOCK IS POINTED TO BY R0 AND CONTAINS, IN ORDER - EACH TOM; A WORD, THE SIZE OF THE LOGICAL, THE MEMORY APR BIAS TO THE STRING BLOCK,+O; THE APR6-BIASED OFFSET TO THE START OF THE LOGICAL, THE TABLE/BLOCK NUMBER, ; AND THE APPROPRIATE TCB/UCB.;P- MOV R5,R0 ;GET POINTER TO MINI DESCRIPTORE SUB #14,R0 ;7 MOV -6(R0),6(R0) ;MOVE TABLE NUMBER AND BLOCK NUMBERO* MOV -2(R0),10(R0) ;MOVE TCB/UCB ADDRESS; @; NOW UPPER CASE ALL ALPHABETIC CHARACTERS IN THE LOGICAL NAME;R> MOV #MAP6+L.NNAM,R3 ;GET POINTER TO THE START OF THE STRING3 CLR R2 ;GET THE NUMBER OF CHARACTERS TO PROCESS  BISB MAP6+L.NLNS,R2 ;:10$: CALL $CVBUC ;UPPER CASE THE CHARACTER IF NECESSARY3 MOVB R5,-1(R3) ;MOVE THE VALUE BACK INTO THE LNBC* SOB R2,10$ ;GO BACK IF MORE TO PROCESS;RQ; SEARCH THE APPROPRIATE TABLE FOR A CURRENTLY EXISTING LNB WITH THE SAME NAME.M; IF FOUND, DELETE THAT ENTRY, ENTER THE NEW ONE, AND EXIT WITH A STATUS OFE; LOGICAL SUPERCEDED.I;A CALL $LNHSH ;HASH THE ENTRY;0 CLR -(SP) ;INITIALIZE SUPERCESSION INDICATOR= MOV KISAR6,-(SP) ;STORE THE LNB ADDRESS ACROSS THE LOOKUPS;7 CALL $LNTBS ;SEARCH THE TABLES FOR THE LOGICAL NAMEA2 BCS 20$ ;IF CS, A PREVIOUS ENTRY WAS NOT FOUND;I; A LOGICAL WAS FOUND IN THE TABLE. FLAG THE SUPERCESSION BY MAKING R1E$; NONZERO AND REMOVE THE OLD ENTRY;E. MOV R3,2(SP) ;MOVE IN THE OLD ENTRY ADDRESS# CALL $LNELM ;REMOVE THE OLD LNBT;E(; INSERT THE NEW ENTRY INTO THE TABLES;H020$: MOV (SP)+,R0 ;RESTORE THE NEW LNB ADDRESS;C ; AT THIS POINT:> ; R0 - 32 WD ADDRESS OF NEW LNB TO BE INSERTED INTO POSITION ; R1 - HASH TABLE WORD OFFSETFA ; R3 - 32 WD ADDRESS OF LNB TO BE BEHIND THE LNB TO BE INSERTEDFI ; R4 - 32 WD ADDRESS OF LNB TO BE AHEAD OF NEW LNB IN LIST (=0 IF NONE) ;G ; OUTPUTS:D; CC = 0 -> LNB IS INSERTED INTO LIST AND ALL LINKAGES ARE UPDATED>; CC = 1 -> INSERTION FAILED FROM INVALID HASH TABLE ADDRESS;T! MOV R0,KISAR6 ;MAP THE NEW LNBB MOV R3,MAP6+L.NLNK ;SET THE LINKAGES FOR THE LNB BEHIND THE NEW; MOVB MAP6+L.NTBL,R3 ;GET THE TABLE NUMBER FOR THIS ENTRY & MOV R4,KISAR6 ;MAP THE PREVIOUS LNB  BNE 30$ ;IF NE, THERE IS ONE# CALL $TBTRL ;MAP THE HASH TABLE$ BCS 50$ ;IF CS, THERE WASN'T ONE) ADD #MAP6,R1 ;SET POINTER TO HASH CELL# MOV R0,(R1) ;PUT IN FIRST ENTRYS  BR 40$ ;430$: MOV R0,MAP6+L.NLNK ;INSERT POINTER TO NEW LNB40$: CLC ;INDICATE SUCCESS250$: MOV (SP)+,R1 ;RESTORE THE SUPERCESSION FLAG5  MOV (SP)+,R5 ;RESTORE THE DESCRIPTOR BLOCK ADDRESSI !70$: RETURNM"# .PAGE$;+K%; $DELOG - ROUTINE TO DELETE AN EXPLICIT LOGICAL NAME OR A COMPLETE TABLE&;E '; INPUTS: G(; R0 - POINTER TO A DESCRIPTOR BLOCK DESCRIBING LOGICAL TO BE DELETEDH); WITH THE FORMAT:#'*; WD 1 - BYTE COUNT OF LOGICAL NAMEV0+; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME7,; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAMEC.-; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)*.; BLOCK TYPE NUMBER (HIGH BYTE);/; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLE0;EL1; IF AN ENTIRE TABLE IS TO BE DELETED, THE FIRST 3 WORDS OF THE DESCRIPTOR2; BLOCK ARE ZERO.U3; 4; OUTPUTS:5; '6; CC - SUCCESSFUL DELETION OF LOGICALBB7; CS : R3 = 0 -> LOGICAL NOT FOUND IF SPECIFIC LOGICAL REQUESTEDA8; R3 <> 0 -> PRIVILEGE VIOLATION IF SPECIFIC LOGICAL REQUESTEDD9;-: ;$DELOG::-< TSTB 7(R0) ;CHECK FOR ZERO BLOCK MODIFIER##= BNE 10$ ;IF NE, THERE ISN'T ONE A> MOVB #LB.LOC,7(R0) ;A ZERO MODIFIER IMPLIES L000fuecccccOCAL MODE DEFAULTD2?10$: TST (R0) ;SEE IF THIS IS A SPECIFIC DELETE:@ BNE 20$ ;IF EQ, IT ISN'T, DELETE ALL MATCHING LOGICALSA;LB; TOTAL LOGICAL DELETEC;T1D CALLR $LNDAL ;ELIMINATE ALL LOGICALS AND EXITE;SF; SPECIFIC LOGICAL DELETEDG;P.H20$: CALL $LNHSH ;IT IS SPECIFIC, HASH NAME5I CALL $LNTBS ;FIND THE NAME IN THE SPECIFIED TABLE.J BCC 40$ ;IF CC, FOUND LNB, CHECK PRIVILEGE%K CLR R3 ;INDICATE NO LOGICAL FOUNDSL SEC ;INDICATE FAILURE M30$: RETURNI2N40$: MOV R3,KISAR6 ;MAP THE LNB FOUND WITH MATCH1O CALL PRVTST ;CHECK TASK PRIVILEGE AGAINST LNBQ1P BCS 30$ ;IF CS, TASK CANNOT ELIMINATE LOGICAL QR .PAGEST;+5U; $LNELM - ROUTINE TO ELMINATE AN ALREADY FOUND LNBV; W; INPUTS:L1X; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCKEY; BLOCK CONTAINS:'Z; WD 1 - BYTE COUNT OF LOGICAL NAMEE0[; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME7\; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAME;.]; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)*^; BLOCK TYPE NUMBER (HIGH BYTE);_; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLE B`; R1 - WORD OFFSET FROM START OF HASH TABLE TO CORRECT HASH CELL3a; R3 - 32 WD BLOCK ADDRESS OF LNB TO BE ELMINATED?b; R4 - PREVIOUS LNB 32 WD ADDRESS IN LIST (=0 IF NONE BEFORE)c;B d; OUTPUT::e; f; CC = 0 Gg; R3 - 32 WD BLOCK ADDRESS OF LNB AFTER THE ONE ELMINATED (0 IF NONE)?h; R4 - PREVIOUS LNB 32 WD ADDRESS IN LIST (=0 IF NONE BEFORE)Di;T j; CC = 1S#k; R3 AND R4 ARE THE SAME AS INPUTKl;+m n$LNELM::4o MOV R4,-(SP) ;SAVE THE PREVIOUS ENTRY ACROSS CALL1p MOV R1,-(SP) ;SAVE THE HASH OFFSET ACROSS CALL 6q MOV R3,-(SP) ;SAVE THE LNB ADDRESS TO BE ELIMINATEDr MOV R3,KISAR6 ;MAP THE LNB4>s MOV MAP6+L.NLNK,R3 ;GET THE FORWARD LINK IN THE CURRENT LNB&t MOV R4,KISAR6 ;MAP THE PREVIOUS LNB u BNE 20$ ;IF NE, THERE IS ONE#v CALL $MPHSH ;MAP THE HASH TABLEw BCC 10$ ;CC -> SUCCESSx MOV (SP)+,R3 ;RESTORE R3O6y BR 40$ ;RESTORE THE REST OF THE REGISTERS AND EXIT(z10$: ADD #MAP6,R1 ;GET ADDRESS OF CELL+{ MOV R3,(R1) ;RESET THE FORWARD LINKAGESM | BR 30$ ;H}20$: MOV R3,MAP6+L.NLNK ;RESET THE LINKAGES IF THERE IS A PREVIOUS LNB<~30$: MOV (SP)+,R0 ;RESTORE POINTER TO LNB TO BE ELIMINATED( MOV R0,KISAR6 ;MAP IT IN KERNEL APR 6D MOV MAP6+L.NLNS,R1 ;GET THE LENGTH OF THE LOGICAL NAME IN THE LNB5 MOVB R1,R2 ;SCREEN OUT THE VARIOUS VALUES AND ADDC( BIC #177400,R2 ;GET LOGICAL NAME SIZE3 SWAB R1 ;PUT EQUIVALENCE NAME IN LOW BYTE OF R1R( BIC #177400,R1 ;GET LOGICAL NAME SIZE, ADD R2,R1 ;GET FULL SIZE OF BOTH BUFFERS3 ADD #L.NHSZ+77,R1 ;GET FULL SIZE OF LNB IN BYTESR& ASH #-6,R1 ;TURN BYTES INTO BLOCKS, CALL $DESEC ;DEALLOCATE THE PREVIOUS LNB CLC ;INDICATE SUCCESS140$: MOV (SP)+,R1 ;RESTORE THE HASH CELL OFFSETL+ MOV (SP)+,R4 ;RESTORE THE PREVIOUS ENTRYT  RETURNM .PAGE;+6; -- $LNTDR -- TRANSLATE RSX DEVICE FORM RECURSIVELYL; -- $LNTSL -- TRANSLATE RSX DEVICE FORM RECURSIVELY WITH SPECIFIC INHIBIT; MASK AND MODIFIER VALUE;DQ; THIS ROUTINE WILL RECURSIVELY SEARCH THE LOGICAL NAME TABLES FOR DEVICE NAME.IM; THE DEVICE MNEMONIC AND UNIT NUMBER ARE MERGED INTO AN INTERNAL STRING TOHL; USE AS THE BASE LOGICAL FOR THE LOOKUPS. AS A LOGICAL IS FOUND FOR EACHI; LEVEL, IT IS CHECKED TO SEE IF IT IS TERMINAL. IF SO, LOOKUPS CEASE,N; OTHERWISE A NEW SET OF LOOKUPS ARE PERFORMED FOR THE LATEST LOGICAL. ONCEN; THE BOTTOM LEVEL LOGICAL IS FOUND, THE DEVICE MNEMONIC AND UNIT NUMBER (IN3; BINARY) ARE RESTORED TO R2 AND R0 RESPECTIVELY.W;EK; $LNTSL IS IDENTICAL TO $LNTDR WITH THE ADDITION OF AN EXPLICIT MODIFIEREK; VALUE THAT MUST MATCH THE VALUE IN THE LNB AND AN INHIBIT MASKWORD THATBK; INDICATES THE LOGICAL TABLES THAT CANNOT BE SEARCHED. THIS MASKWORD ISS.; IN EFFECT IN ALL LOOKUP LEVELS AND TABLES.;A ; INPUTS:E; 3; R0 = THE BINARY UNIT NUMBER OF THE DEVICE SPECI/; R2 = THE ASCII MNEMONIC OF THE DEVICE SPEC,#; $LNTSL S008feb`TADATADATADATADATADATAPECIFIC PARAMETERS:(1; R3 = SPECIFIC MODIFIER VALUE TO MATCH IN LNBE?; $TONYL = SPECIFIC INHIBIT MASKWORD USED ACROSS ALL LOOKUPSF;X ; OUTPUTS: ; C=0,U;T=; R0 = THE BINARY UNIT NUMBER OF THE RESULTANT DEVICE SPEC?; R2 = THE ASCII DEVICE MNEMONIC OF THE RESULTANT DEV. SPEC.A7; R3 = APR BIAS OF MATCHING LNB SECONDARY POOL BLOCK.;A1; C=1 INVALID TRANSLATION ON EXISTING LOGICALB; 1; R3 = 0 IF NO MATCH WAS FOUND FOR DEVICE NAMEH@; = N IF A MATCH WAS FOUND BUT DID NOT TRANSLATE TO DEVICE!; OR RECURSION LIMIT WAS HITN;N; IF AN ERROR CONDITION OCCURS (VS, CS) R0 AND R2 ARE PRESERVED ACROSS THEN; CALL. R1,R3 ARE DESTROYED BY THIS ROUTINE. R4,R5,KISAR6 ARE PRESERVED.;;- $LNTDR::) CLR R3 ;INITIALIZE THE MODIFIER VALUE0 CLR $TONYL ;INITIALIZE THE INHIBIT MASK WORD!$LNTSL::SAVNR ;SAVE R4 AND R5N2 MOV KISAR6,-(SP) ;SAVE THE OLD DATA MAPPING APR% MOV R0,-(SP) ;SAVE THE UNIT NUMBER ) MOV R2,-(SP) ;SAVE THE DEVICE MNEMONICA3 MOV R3,-(SP) ;SAVE THE MODIFIER VALUE TO BE USED;P; MOVE THE DEVICE NAME MNEMONIC AND ASCIIZED UNIT NUMBER INTO A SCRATCH BUFFER); FOR THE INITIAL LOOKUP IN THE TABLES.I;RA MOV #$LTBUF,R3 ;POINT TO SCRATCH BUFFER TO BUILD DEVICE STRING;2 MOV R2,(R3)+ ;MOVE IN THE ASCII DEVICE MNEMONIC> CALL $DCBTA ;TURN THE OCTAL UNIT NUMBER TO ASCII IN BUFFER;MM; INITIALIZE THE INTERNAL LOGICAL NAME DESCRIPTOR BLOCK TO BE PASSED AROUNDN; DURING THE VARIOUS LOOKUPS. ;E. SUB #$LTBUF,R3 ;GET THE STRING LENGTH IN R3; MOV #$TONYL,R0 ;CREATE THE LOGICAL NAME DESCRIPTOR BLOCK - MOV $TKTCB,R2 ;GET THE CURRENT TCB ADDRESS , BIT #1,(R0) ;IS THE TASK TABLE INHIBITED' BEQ 5$ ;IF EQ, NO, KEEP TCB ADDRESSR0 MOV T.UCB(R2),R2 ;GET THE UCB ADDRESS INSTEAD35$: MOV R2,-(R0) ;MOVE IN THE APPROPRIATE ADDRESS / CLR -(R0) ;CLEAR THE TABLE AND BLOCK NUMBERN= BISB (SP)+,1(R0) ;GET AN EXPLICIT MODIFIER VALUE IF IS ONED? MOV #$LTBUF+20000,-(R0) ;MOVE APR6 BIASED ADDRESS INTO BLOCKR> MOV KISAR5,-(R0) ;TURN THE ADDRESS INTO APR BIAS AND OFFSET> MOV R3,-(R0) ;MOVE THE LENGTH OF THE STRING INTO DESCRIPTOR;DF; ENTER A LOOP OF LOOKUPS FOR EACH NEWLY FOUND LOGICAL IN THE CHAIN.K; A POINTER TO THE LATEST FOUND LNB IS KEPT FOR USE AFTER ALL LOOKUPS ARE$I; COMPLETED. LOOKUPS TERMINATE AS SOON AS A LOGICAL ISN'T FOUND, OR IFTI; THE LATEST HAS THE TERMINAL ATTRIBUTE OR BEGINS WITH AN _. THIS LOOP K; WILL BE EXECUTED A MAXIMUM OF M$XLOG TIMES BEFORE AN ERROR IS RETURNED.K; THIS IS TO PREVENT AN INFINITE LOOP IN ASSIGNMENTS AND ALSO TO PUT SOME0=; KIND OF RESTRICTION ON USAGE OF SYSTEM STATE LOOKUP TIME.E;OI; A NONZERO VALUE IN R3 INDICATES THAT THE LOGICAL LOOKUP IS TO BE DONETI; IN FILES-11 MODE - THIS MEANS THAT THE SUBSEQUENT EQUIVALENCE NAME IS G; SEARCHED UP TO, BUT NOT INCLUDING, THE COLON. IF ONE IS NOT FOUND,TH; THE ENTIRE STRING IS USED FOR THE NEXT ROUND. OTHERWISE, EVERYTHING; BEFORE THE COLON IS USED.M;F7 CALL $LGRCS ;LOOK UP THE DEVICE LOGICAL RECURSIVELYI4 BCS 10$ ;IF CS, RECURSION LIMIT FAILURE OCCURRED; L; NOW THAT THE CHAIN HAS BEEN WALKED DOWN COMPLETELY, RESTORE THE LAST LNBL; FOUND AND PARTIALLY VERIFY THAT THE EQUIVALENCE NAME IS A VALID PHYSICALJ; DEVICE NAME. IF IT IS, R0 AND R2 ARE RESTORED WITH THE DEVICE MNEMONIC; AND BINARY UNIT NUMBER.I; : CALL DVVFY ;VALIDATE THE RESULTING LOGICAL AS A DEVICE+ BCS 10$ ;IF CS, THE LOGICAL WAS INVALIDC: CMP (SP)+,(SP)+ ;ELIMINATE THE OLD VALUES FOR R0 AND R2 BR 20$ ;EXIT SUCCESSFULLY 410$: MOV (SP)+,R2 ;RESTORE THE OLD DEVICE MNEMONIC, MOV (SP)+,R0 ;RESTORE THE OLD UNIT NUMBER SEC120$: MOV (SP)+,KISAR6 ;RESTORE ANY OLD MAPPINGSA< MOV $LSTLG,R3 ;SET INDICATION OF WHETHER A MATCH OCCURRED  RETURN ;+.; -- $RTRL1 -- TRANSLATE LOGICAL RECURSIVELY;N; THIS ROUTINE WILL RECURSIVELY SEARCH THE LOGICAL NAME TABLES FOR A LOGICALP; AS A LOGICAL IS FOUND AT EACH LEVEL, IT IS00@fueccccc CHECKED TO SEE IF IT IS TERMINAL.N; IF SO, LOOKUPS CEASE, OTHERWISE A NEW SET OF LOOKUPS ARE PERFORMED FOR THEP; LATEST LOGICAL. ONCE THE BOTTOM LEVEL LOGICAL IS FOUND, THE DEVICE MNEMONICG; AND UNIT NUMBER (IN BINARY) ARE RESTORED TO R2 AND R0 RESPECTIVELY.O;T ; INPUTS:C ;D= ; R0 = POINTER TO A USER BUFFER ADDRESS CONTAINING LOGICALL# ; R2 = SIZE OF LOGICAL IN BUFFERU ;W ; OUTPUTS: ; C=0,E;C=; R0 = THE BINARY UNIT NUMBER OF THE RESULTANT DEVICE SPEC ?; R2 = THE ASCII DEVICE MNEMONIC OF THE RESULTANT DEV. SPEC.S7; R3 = APR BIAS OF MATCHING LNB SECONDARY POOL BLOCKT;1; C=1 INVALID TRANSLATION ON EXISTING LOGICAL ;,1; R3 = 0 IF NO MATCH WAS FOUND FOR DEVICE NAMEY@; = N IF A MATCH WAS FOUND BUT DID NOT TRANSLATE TO DEVICE!; OR RECURSION LIMIT WAS HITF;DN; IF AN ERROR CONDITION OCCURS (VS, CS) R0 AND R2 ARE PRESERVED ACROSS THEN; CALL. R1,R3 ARE DESTROYED BY THIS ROUTINE. R4,R5,KISAR6 ARE PRESERVED.;;- $RTRL1::! SAVNR ;SAVE R4 AND R5=" MOV KISAR6,-(SP) ;STORE THE PREVIOUS KERNEL DATA 6 MAPPINGO0# MOV R2,-(SP) ;SAVE LOGICAL SIZE FOR LATER USE$;NJ%; CREATE THE LOGICAL DESCRIPTOR BLOCK FOR USE ACROSS THE RECURSIVE CALLS&; 4' MOV #$TONYL,R3 ;POINT TO BOTTOM OF THE DESCRIPTOR<( MOV $TKTCB,-(R3) ;PUT IN THE TCB ADDRESS FOR CURRENT TASK/) CLR -(R3) ;CLEAR THE TABLE AND MODE NUMBERSC9* CLR $TONYL ;INDICATE ROUTINE SHOULD SEARCH ALL TABLES =+ CALL $RELOC ;TURN USER BUFFER ADDRESS INTO OFFSET AND APRV4, MOV R2,-(R3) ;MOVE THE OFFSET INTO THE DESCRIPTOR9- MOV R1,-(R3) ;MOVE THE APR6 OFFSET INTO THE DESCRIPTORA(. MOV (SP)+,-(R3) ;GET THE LOGICAL SIZE)/ MOV R3,R0 ;POINT R0 AT THE DESCRIPTORE.0 ; AND INDICATES FILES-11 MODE OF $LGRCS1;OF2; ENTER A LOOP OF LOOKUPS FOR EACH NEWLY FOUND LOGICAL IN THE CHAIN.K3; A POINTER TO THE LATEST FOUND LNB IS KEPT FOR USE AFTER ALL LOOKUPS ARE I4; COMPLETED. LOOKUPS TERMINATE AS SOON AS A LOGICAL ISN'T FOUND, OR IFFI5; THE LATEST HAS THE TERMINAL ATTRIBUTE OR BEGINS WITH AN _. THIS LOOP K6; WILL BE EXECUTED A MAXIMUM OF M$XLOG TIMES BEFORE AN ERROR IS RETURNED.VK7; THIS IS TO PREVENT AN INFINITE LOOP IN ASSIGNMENTS AND ALSO TO PUT SOMEE=8; KIND OF RESTRICTION ON USAGE OF SYSTEM STATE LOOKUP TIME.E9;O7: CALL $LGRCS ;LOOK UP THE DEVICE LOGICAL RECURSIVELY4; BCS 10$ ;IF CS, RECURSION LIMIT FAILURE OCCURRED<; L=; NOW THAT THE CHAIN HAS BEEN WALKED DOWN COMPLETELY, RESTORE THE LAST LNBL>; FOUND AND PARTIALLY VERIFY THAT THE EQUIVALENCE NAME IS A VALID PHYSICALJ?; DEVICE NAME. IF IT IS, R0 AND R2 ARE RESTORED WITH THE DEVICE MNEMONIC@; AND BINARY UNIT NUMBER.OA;E:B CALL DVVFY ;VALIDATE THE RESULTING LOGICAL AS A DEVICE@C10$: MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING AND KEEP CARRY D RETURNLEFGHI;+;J; $LGRCS - ROUTINE TO SCAN THE LOGICAL TABLES RECURSIVELY K;R L; INPUTS:>M; R0 - POINTER TO DESCRIPTOR BLOCK OF FIRST LOGICAL IN CHAIN$N; $TONYL - TABLE INHIBIT MASK WORD2O; R3 - FILES-11 MODE PROCESSING FLAG (>0 -> YES)P; Q; OUTPUTS:<R; CC - SEARCH MAY OR MAY NOT HAVE RESULTED IN AN LNB MATCHBS; $LSTLG - SECONDARY POOL ADDRESS OF FINAL LNB (=0 IF NO MATCH)4T; CS - RECURSION LIMIT WAS HIT (DEFINED BY M$XLOG)U;EFV; ENTER A LOOP OF LOOKUPS FOR EACH NEWLY FOUND LOGICAL IN THE CHAIN.W;SX; NOT PRESERVED: KISAR6, R3KY; A POINTER TO THE LATEST FOUND LNB IS KEPT FOR USE AFTER ALL LOOKUPS AREOIZ; COMPLETED. LOOKUPS TERMINATE AS SOON AS A LOGICAL ISN'T FOUND, OR IFLI[; THE LATEST HAS THE TERMINAL ATTRIBUTE OR BEGINS WITH AN _. THIS LOOP K\; WILL BE EXECUTED A MAXIMUM OF M$XLOG TIMES BEFORE AN ERROR IS RETURNED.DK]; THIS IS TO PREVENT AN INFINITE LOOP IN ASSIGNMENTS AND ALSO TO PUT SOME =^; KIND OF RESTRICTION ON USAGE OF SYSTEM STATE LOOKUP TIME.U_;GH`; IN FILES-11 PROCESSING MODE, THIS ROUTINE WILL SEARCH FOR A COLON INHa; THE LOGICAL AND ONLY USE THE BEFORE IT. THIS HAPPENS IN ALL PASSES.Ab; IF NO COLON IS FOUND, THE ENTIRE STRING IS USE00Hfeb`TADATADATADATADATADATAD IN EACH CASE. c;-d e$LGRCS::.f MOV R3,-(SP) ;SAVE THE MODE PROCESSING FLAG.g CLR $LSTLG ;CLEAR THE ULTIMATE LNB POINTERBh MOV #M$XLOG,-(SP) ;PUT THE MAXIMUM RECURSION LIMIT ON THE STACK1i10$: DEC (SP) ;SEE IF ANOTHER ROUND IS ALLOWEDO4j BGE 13$ ;IF LT, NO, RECURSION ERROR HAS OCCURRED/k SEC ;INDICATE FAILURE FROM RECURSION LIMITN?l MOV (SP)+,(SP)+ ;MAXIMUM RECURSION LIMIT, MAINTAIN CARRY SETF'm BR 40$ ;RETURN WITH RECURSION ERROR 3n13$: TST 2(SP) ;IS THIS FILES-11 PROCESSING MODEC.o BEQ 15$ ;IF EQ, NO, USE EXACT MATCH ALWAYS:p CALL LGTSET ;YES, DO COLON SEARCH AND RESET DESCRIPTOR?q15$: CALL $TBSRC ;LOOK FOR LOGICAL IN ALL APPROPRIATE TABLESO%r BCS 30$ ;IF CS, LOGICAL NOT FOUND;5s MOV R3,$LSTLG ;SAVE THE CURRENT LINK FOR LATER USEO;t MOV R3,KISAR6 ;MAP THE LNB TO RESET THE DESCRIPTOR BLOCKO1u BIT #LS.TRM,MAP6+L.NSTS ;IS THIS LNB TERMINAL?U%v BNE 30$ ;IF NE, YES, STOP LOOKUPS :w CLR R2 ;INITIALIZE POINTER TO START OF EQUIVALENCE STR:x BISB MAP6+L.NLNS,R2 ;GET THE LENGTH OF THE LOGICAL NAME5y ADD #MAP6+L.NNAM,R2 ;POINT TO THE START OF THE ENS 2z CMPB #'_,(R2) ;IS THIS TERMINAL IN THE OLD WAY?%{ BEQ 30$ ;IF EQ, YES, STOP LOOKUPSB=|20$: CLR (R0) ;INITIALIZE THE NEW LENGTH IN THE DESCRIPTORC+} BISB MAP6+L.NENS,(R0);GET THE NEW LENGTH;4~ MOV R2,4(R0) ;MOVE THE NEW OFFSET INTO DESCRIPTOR1 MOV R3,2(R0) ;MOVE IN THE NEW APR BIAS AS WELL$4 BIT #1,$TONYL ;SEE IF THE TASK TABLE IS INHIBITED, BNE 10$ ;IF NE, IT IS, SKIP TCB RECOVERYA MOV $TKTCB,10(R0) ;RESTORE THE TCB POINTER FOR NEXT LOOKUP SETA$ BR 10$ ;GO BACK FOR ANOTHER LOOP@30$: CLR (SP)+ ;CLEAR THE RECURSION LIMIT VALUE OFF THE STACK! CLR (SP)+ ; AND CLEAR CARRYR 40$: RETURNI  .ENABL LSBS;+M; DVVFY - ROUTINE TO VERIFY THAT THE LOGICAL DESCRIBED BY $LSTLG IS A VALIDSF; FORM OF AN RSX PHYSICAL DEVICE. ONLY THE FORMAT OF THE LOGICAL IS;; VERIFIED - ACTUAL EXISTENCE OF THE DEVICE IS IRRELEVANT1;I ; INPUTS:S=; $LSTLG - CONTAINS SECONDARY POOL ADDRESS OF LNB TO VERIFY ; OUTPUTS:D; CC - LOGICAL IN $LSTLG SUCCESSFUL PASSED FORM TEST OF RSX DEVICE9; CS - NO LOGICAL IN $LSTLG OR LOGICAL FAILED FORM TEST ;L0; R0,R1,R2,R3,R5 ARE DESTROYED BY THIS ROUTINE;P; THIS CODE WILL IGNORE ANY LEADING TERMINAL CHARACTERS (_) IN THE EQUIVALENCE-; STRING BEFORE BEGINNING THE VERIFICATION.L;-DVVFY:* MOV $LSTLG,KISAR6 ;MAP THE ULTIMATE LNB7 BEQ 50$ ;IF EQ, ONE WAS NOT FOUND, INDICATE FAILURE , CLR R5 ;INITIALIZE A STRING LENGTH VALUE0 BISB MAP6+L.NENS,R5 ;GET THE LENGTH TO VERIFY; MOVB MAP6+L.NLNS,R1 ;POINT R1 TO THE START OF THE STRINGO< ADD #MAP6+L.NNAM,R1 ;POINT TO START OF EQUIVALENCE STRING85$: CMPB #'_,(R1)+ ;CHECK FOR LEADING FINAL INDICATORS! BNE 10$ ;IF NE, NO MORE THEREC3 DEC R5 ;DECREMENT THE REMAINING NUMBER TO CHECKE" BEQ 50$ ;IF EQ, INVALID DEVICE' BR 5$ ;GO BACK FOR ANOTHER TO CHECKI,10$: DEC R1 ;BACK UP TO INCLUDE DELIMITER DEVCHK:L& CLR R0 ;INITIALIZE THE UNIT NUMBER1 MOVB (R1)+,R2 ;GET FIRST CHARACTER IN MNEMONICT- DEC R5 ;SEE IF THIS IS THE LAST CHARACTERH' BEQ 50$ ;IF EQ, YES, INVALID DEVICEA/ CALL CHRCHK ;IS THIS CHARACTER ALPHANUMERIC % BCS 50$ ;IF CS, ERROR IN THE NAME , SWAB R2 ;GET SECOND HALF OF THE TASKNAME  CLRB R2 ;E BISB (R1)+,R2 ; CALL CHRCHK ;IS IT VALID BCS 50$ ;IF CS, IT WAS BAD9 SWAB R2 ;REVERSE THE LETTERS BACK TO CORRECT POSITION  DEC R5 ;IS IS A ZERO VALUE8 BNE 30$ ;IF NE, THERE IS MORE ON THE STRING TO CHECK20$: CLC ;INDICATE SUCCESS BR 60$ ;EXIT; N; VALIDATE THAT THE REST OF THE STRING IS A VALID OCTAL NUMBER OR A TRAILING ; COLON.;S<30$: MOVB (R1)+,R3 ;GET THE FIRST CHARACTER OF UNIT NUMBER2 CMPB R3,#'0 ;IS THIS A VALID NUMERIC CHARACTER BLO 40$ ;IF LO, NO4 CMPB R3,#'7 ;IS IT STILL VALID ON THE HIGH SIDE? BHI 40$ ;IF HI, NO3 SUB #60,R3 ;TURN THE NUMBER INTO A BINARY VALUE1 ASH #3,R0 ;MULTIPLY EVERYTHING UP TO NOW BY 8 $00Pfueccccc ADD R3,R0 ;ADD IN THE NEW NUMBER+ DEC R5 ;ANY MORE CHARACTERS TO PROCESS?X BNE 30$ ;IF NE, YESA' CMP #377,R0 ;IS THIS A VALID NUMBER " BHI 20$ ;IF LO, DEFINITELY NOT BR 50$ ;INDICATE ERROR+40$: CMPB R3,#': ;SEE IF THIS IS A COLON - BEQ 20$ ;IF EQ, IT IS, VALID STRING FOUNDB 50$: SEC 60$: RETURN   .DSABL LSBL;+G; CHRCHK - ROUTINE TO VALIDATE THE ALPHA STATE OF THE DEVICE MNEMONICA;R ; INPUTS:A!; R2 - CHARACTER TO BE VERIFIEDO;-6CHRCHK: BICB #40,R2 ;CONVERT CHARACTER TO UPPERCASE& CMPB #'A,R2 ;IS THIS BELOW THE SET BHI 10$ ;IF HI, YESP& CMPB #'Z,R2 ;IS THIS ABOVE THE SET BLO 10$ ;IF LO, YESY CLC ;INDICATE SUCCESS BR 20$ ;EXIT10$: SEC ;INDICATE FAILURE20$: RETURN ;Q;+I; PSCNV - ROUTINE TO TRANSLATE THE LOGICAL NAME SPECIFIED IN ONE OF THEE; P/OS COMPATIBLE DIRECTIVES INTO A FORM RECOGNIZED BY RSX EXTENDEDE; LOGICAL SUPPORT.; ; INPUTS:A1; R0 - SIZE OF THE LOGICAL NAME TO BE PROCESSED;.; R1 - 32 WD APR BIAS TO GET TO LOGICAL NAME8; R2 - KISAR6 VIRTUAL ADDRESS OF START OF LOGICAL NAME;2 ; OUTPUTS:1; R0 - SIZE OF THE LOGICAL NAME TO BE PROCESSEDI.; R1 - 32 WD APR BIAS TO GET TO LOGICAL NAMEB; R2 - KISAR6 VIRTUAL ADDRESS OF START OF PROCESSED LOGICAL NAME;SJ; THIS ROUTINE RECOGNIZES THAT IT WAS CALLED BY A TLOG$, RLOG$, CLOG$ ORG; DLOG$ DIRECTIVE AND PROCESSES THE LOGICAL NAME IN TWO WAYS. IF THEI; LOGICAL ENDS IN ONE OR TWO COLONS, THEY ARE STRIPPED OFF OF THE NAME. H; FOLLOWING THAT, THE STRING IS CHECKED TO SEE IF IT IS OF THE FORM OFG; AN RSX PHYSICAL DEVICE NAME (IE. DDNNN). IF SO, THE STRING IS ZERO M; COMPRESSED. IF IT ISN'T, THE ORIGINAL STRING IS USED, MINUS THE STRIPPEDR ; COLONS.R;-PSCNV:E CMPB #R$XBAS,$DICSV+2;IS THIS ONE OF THE XLOG$ DIRECTIVES ;JRK325A3 BLOS 50$ ;IF LOS, NO, SKIP PROCESSING ;JRK325 5 TST R0 ;SEE IF THIS IS A FULL TABLE DELETE ;**-2, BEQ 50$ ;IF EQ, IT IS, SKIP THIS ROUTINE  SAVNR ;SAVE REGISTERS R4,R51 MOV KISAR6,-(SP) ;SAVE THE DATA REGISTER VALUE ) MOV R3,-(SP) ;SAVE THE OTHER REGISTERSN MOV R2,-(SP) ;F MOV R1,-(SP) ;Z+ ADD R2,R0 ;POINT TO END OF LOGICAL NAMEN& MOV R1,KISAR6 ;MAP THE LOGICAL NAME+ CMPB #':,-(R0) ;IS THIS A DEVICE OR NODE, BNE 10$ ;IF NE, NO!  CMPB #':,-(R0) ;IS THIS A NODEB  BEQ 20$ ;IF EQ, YESP( 10$: INC R0 ;POINT BACK TO TERMINATOR' 20$: SUB R2,R0 ;GET LENGTH OF STRINGB-  MOV R0,-(SP) ;GET THE NEW LENGTH OF STRINGV" BEQ 30$ ;IF EQ, INVALID STRING MOV R0,R5 ;GET SIZE IN R5S- MOV R2,R1 ;GET POINTER TO START OF STRINGI8 CALL DEVCHK ;SEE IF STRING MATCHES RSX PHYSICAL FORM1 BCS 30$ ;IF CS, NO, USE STRING WITHOUT COLONS6* TST R5 ;ANY LEFTOVER JUNK AFTER DEVICE( BNE 30$ ;IF NE,YES, SKIP COMPRESSION/ MOV #$LTBUF,R3 ;POINT TO NEW PHYSICAL STRINGQ( MOV R2,(R3)+ ;MOVE IN DEVICE MNEMONIC- CALL $DCBTA ;TURN OCTAL NUMBER INTO ASCIIT' MOV R3,R0 ;INITIALIZE SIZE REGISTERW2 SUB #$LTBUF,R0 ;GET ACTUAL SIZE OF LOGICAL NAME? MOV #$LTBUF+20000,R2;GET VIRTUAL ADDRESS OF NEW LOGICAL NAME ) MOV KISAR5,R1 ;GET 32WD APR BIAS VALUET( ADD #6,SP ;CLEAR STACK OF OLD VALUES  BR 40$ ;,30$: MOV (SP)+,R0 ;RESTORE SIZE OF LOGICAL1 MOV (SP)+,R1 ;RESTORE 32WD APR BIAS TO LOGICALK3  MOV (SP)+,R2 ;RESTORE VIRTUAL ADDRESS OF LOGICALC!40$: MOV (SP)+,R3 ;RESTORE R3 -" MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPING #50$: RETURNI$%;+E&;LGTSET - ROUTINE TO SCAN A LOGICAL NAME DEFINED BY A DESCRIPTOR TOO@'; DETERMINE IF IT HAS A COLON IN IT. IF SO, THE LENGTH OF THE;(; LOGICAL IS REDUCED TO INCLUDE THE STRING UP TO, BUT NOT); INCLUDING, THE COLON. *;A +; INPUTS:0&,; R0 - POINTER TO LOGICAL DESCRIPTOR -; OUTPUTS:0.; R0 - UPDATED LENGTH OF LOGICAL IN DESCRIPTOR/;- 0LGTSET:R1 SAVNR ;SAVE R4,R552 MOV 2(R0),KISAR6 ;MAP THE LOGICAL NAME WITH KISAR6P=3 MOV 4(R0),R4 ;GET THE VIRTUAL ADDRESS OF THE LOGICAL START64 MOV (R0),R5 ;GET THE CURRENT L00Xfeb`TADATADATADATADATADATAENGTH OF THE LOGICAL4510$: CMPB #':,(R4)+ ;IS THE NEXT CHARACTER A COLON6 BEQ 20$ ;IF EQ, YESE37 DEC R5 ;DECREMENT THE COUNT OF CHARS TO PROCESS #8 BNE 10$ ;IF NE, MORE TO PROCESS6920$: SUB R5,(R0) ;RESET LENGTH OF LOGICAL TO LOOKUP : RETURNP;<=>;+K?; $MPHSH - ROUTINE TO MAP THE APPROPRIATE HASH TABLE THROUGH KISAR6 FOR A5"@; SPECIFIED LOGICAL TABLE NUMBERA;M B; INPUTS:P6C; 6(R0) - CONTAINS A BYTE VALUE FOR THE TABLE NUMBER D; OUTPUT:M<E; CC -> SUCCESSFUL MAPPING OF HASH TABLE ADDRESS IN KISAR6<F; CS -> NO HASH TABLE WAS AVAILABLE FOR GIVEN TABLE NUMBERG;- H$MPHSH::(I MOV R3,-(SP) ;SAVE R3 ACROSS THE CALL&J MOVB 6(R0),R3 ;GET THE TABLE NUMBER4K CALL $TBTRL ;TRANSLATE TABNUM AND MAP HASH TABLE2L MOV (SP)+,R3 ;RESTORE R3 AND MAINTAIN CARRY BIT M RETURN NO;+MP; $TBTRL - ROUTINE TO TRANSLATE THE LOGICAL TABLE NUMBER INTO AN HASH TABLE5Q; OFFSET AND THEN MAP THE HASH TABLE THROUGH KISAR6AR;U S; INPUTS:PT; R3 - TABLE NUMBERF U; OUTPUTS:V; CC - SUCCESS:I5W; KISAR6 - CONTAINS MAPPING TO START OF HASH TABLEE&X; CS - NO HASH TABLE VALUE AVAILABLEY;($Z; R3, KISAR6 ARE DESTROYED BY CALL[;,F\; THIS ROUTINE TAKES THE SPECIFIED LOGICAL TABLE NUMBER AND TURNS ITH]; INTO A WORD OFFSET INTO THE HIERARCHY TABLE IN SYSCM. THE HIERARCHYI^; TABLE CONTAINS THE SECONDARY POOL POINTERS TO EACH OF THE HASH TABLESHH_; IN AN ORDERED, PRECEDENCE-DERIVED SEQUENCE. SINCE THE TABLE NUMBERSG`; NO LONGER HAVE ANY PRETENSE OF PRECEDENCE ORDERING, IT IS NECESSARYGa; TO HASH THE VALUES INTO THE CORRECT WORD OFFSET. FROM THIS OFFSET,BDb; THE APR BIAS OF THE HASH TABLE IS PLACED INTO KISAR6 SO THAT ANYDc; 140000-140100 KERNEL DATA REFERENCES WILL ACCESS THE HASH TABLE.d;- e$TBTRL::6f CMP #T$BLNM,R3 ;SEE IF THIS IS A VALID TABLE NUMBER$g BLO 10$ ;IF LO, NO, RETURN ERROR:h MOVB $TRANL(R3),R3 ;HASH TABLE NUMBER TO CORRECT OFFSET-i ASL R3 ;TURN INTO WORD OFFSET AND KEEP CCM;j MOV $LOGTB(R3),KISAR6 ;MAP THE HASH TABLE THROUGH KISAR6 !k BNE 20$ ;IF NE, THERE WAS ONEAl10$: SEC ;FAILURE INDICATOR. m20$: RETURNSno .PAGEp;+Kq; $LDELX - ROUTINE TO DELETE EVERY LOGICAL IN A GIVEN TABLE REGARDLESS OFN:r; THE BLOCK MODIFIER SPECIFIED. THIS ROUTINE IS USED BY;s; DREIF TO ELIMINATE A TASK AND BY BYE TO LOGOFF A USER.t;O u; INPUTS: 5v; R0 - POINTER TO TCB OR UCB TO DELETE LOGICALS FORB4w; R1 - TABLE CODE INDICATING WHICH TABLE TO DELETEx; y;-z {$LDELX::|A} MOV R0,$TEMP0+10 ;PUT THE TCB/UCB ADDRESS INTO A PARTIAL DESC.H;~ MOV #$TEMP0,R0 ;SET UP THE DESCRIPTOR ADDRESS FOR $LNDALS7 MOV R1,6(R0) ;PUT THE TABLE NUMBER IN THE DESCRIPTORY5 ; THIS STATEMENT ALSO FORCES A ZERO IN 7(R0).K2 ; THIS CAUSES $LNDAL TO SKIP BOTH THE MODE/ ; AND THE PRIVILEGE CHECKS. THIS IS TOS, ; PREVENT LOSS OF BLOCKS IN RUNDOWN.;+K; $LNDAL - ROUTINE TO DELETE ALL LOGICALS IN A GIVEN TABLE THAT MATCH THEE-; BLOCK TYPE MODIFIER SPECIFIED IN THE DPBM; ; INPUTS:UE; R0 - POINTER TO A LOGICAL NAME DESCRIPTOR BLOCK WITH NO SPECIFIEDT; LOGICAL NAMEA ; OUTPUTS: ; CC - ALWAYS INDICATE SUCCESS;RJ; A ZERO VALUE IN THE BLOCK BYTE - 7(R0) - FORCES A SKIP AROUND BOTH THE&; MODE AND THE LNB PRIVILEGE CHECKS.;- $LNDAL:: SAVNR ;SAVE R4 AND R52 CLR -(SP) ;SET UP INITIAL VALUE FOR HASH TABLE# CALL $MPHSH ;MAP THE HASH TABLEL' BCS 50$ ;IF CS, NO HASH TABLE ENTRYE/ MOV KISAR6,(SP) ;SAVE THE HASH TABLE MAPPING6 CLR R1 ;INITIALIZE TO THE FIRST HASH CELL IN TABLE710$: CLR R4 ;INITIALIZE PREVIOUS LNB ADDRESS IN LIST& MOV (SP),KISAR6 ;MAP THE HASH TABLE4 MOV MAP6(R1),R3 ;GET FIRST ENTRY IN THE CELL LIST3 BEQ 40$ ;IF EQ, THERE ARE NONE, GO TO NEXT CELLB&20$: MOV R3,KISAR6 ;MAP THE NEXT LNB8 CALL $LNTST ;CHECK TO SEE IF ENTRY MATCHES CRITERION BCC 30$ ;IF CC, IT DOESL>23$: MOV R3,R4 ;IT DOESN'T, SET POINTERS AND GET NEXT ENTRY125$: MOV MAP6+L.NLNK,R3 ;GET NEXT ENTRY ADDRESSA6 BEQ 40$ ;IF EQ00`fueccccc, THERE ARE NO MORE, GO TO NEXT CELL( BR 20$ ;GO BACK AND CHECK THIS ENTRY430$: TSTB 7(R0) ;SEE IF THIS IS A GENERIC COMPARE: BEQ 35$ ;IF EQ, IT IS, IGNORE BLOCK NUMBER COMPARISONS6 CMPB MAP6+L.NBLK,7(R0);SEE IF THE BLOCK TYPES MATCH$ BNE 23$ ;IF NE, NO, DON'T DELETE3 CALL PRVTST ;CHECK FOR TASK PRIVILEGE TO DELETEI/ BCS 23$ ;IF CS, TASK DOESN'T, SKIP THIS ONER235$: MOV R4,-(SP) ;SAVE THE PREVIOUS LNB POINTER6 MOV R0,-(SP) ;SAVE THE STORAGE AREA ACROSS THE CALL$ CALL $LNELM ;ELMINATE THIS ENTRY1 MOV (SP)+,R0 ;RESTORE THE STORAGE AREA ADDRESST- MOV (SP)+,R4 ;RESTORE THE PREVIOUS POINTERC= MOV R4,KISAR6 ;MAP THE PREVIOUS TO GET THE FORWARD POINTERI- BNE 25$ ;GO BACK AND CHECK THE NEXT ENTRYK/ BR 10$ ;START AT THE HASH CELL IF NECESSARYE140$: ADD #2,R1 ;BUMP THE HASH CELL OFFSET WORDT- CMP R1,#<*2>;SEE IF END OF CELLS ! BLOS 10$ ;IF LOS, NO, DO MORE 950$: CLR (SP)+ ;POP THE HASH TABLE LOCATION AND SET CCA  RETURN  .PAGE;+J; $TBSRC - ROUTINE TO DO HIERARCHICAL LOOKUPS IN THE APPROPRIATE LOGICALC; NAME TABLES. THIS ROUTINE MUST BE PASSED A LOGICAL DESCRIPTOR C; BLOCK AND AN INHIBIT MASK WORD IN $TONYL. SEARCH WILL BEGIN ATE@; THE TASK TABLE LEVEL, AND PROCEED SEQUENTIALLY TO THE SYSTEMD; LEVEL. IT IS UP TO THE CALLER TO MAKE SURE THAT THE INITIAL TCBH; OR UCB IS SET UP CORRECTLY IF ONE OF THE TABLES ARE TO BE INHIBITED.;R ; INPUTS:T;S<; R0 - POINTER TO CURRENT DESCRIPTOR BLOCK WHICH CONTAINS:'; WD 1 - BYTE COUNT OF LOGICAL NAMEO0; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME7; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAME .; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)*; BLOCK TYPE NUMBER (HIGH BYTE);; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLETJ; $TONYL - CONTAINS THE INHIBIT MASK WORD WHERE A SET BIT INDICATES THAT3; THAT THE TABLE IS TO BE SKIPPED IN THE LOOKUP.;U ; OUTPUTS:;- ; CC = 03; R3 - APR BIAS ADDRESS OF START OF MATCHING LNB-; ; CC = 1; R3,R4 INDETERMINATE;- $TBSRC::;AL; THE LOGICAL NAME IS NOW HASHED TO GET THE CELL OFFSET THAT WILL BE VALIDM; ACROSS ALL TABLE LOOKUPS. THEN A LOOP IS ENTERED TO CHECK EACH TABLE FORK; LOOKUP VALIDITY. IF IT IS VALID, THE TCB (IF A TASK TABLE LOOKUP) OR ANL; UCB ADDRESS IS PLACED IN THE DESCRIPTOR BLOCK, AND THE APPROPRIATE TABLE%; IS SEARCHED FOR THE LOGICAL NAME.U; 9 CALL $LNHSH ;HASH THE LOGICAL NAME TO GET CELL OFFSETT+ CLR R2 ;INITIALIZE THE TABLE OFFSET BITR;IK; INITIALLY CHECK FOR A TASK LOGICAL TABLE LOOKUP. IT IS ASSUMED AT THISTL; POINT THAT THE DESCRIPTOR CONTAINS THE CORRECT TCB. IF THE LOOKUP FAILSK; FOR THE TASK TABLE, THE TCB IS USED TO GET THE APPROPRIATE UCB ADDRESS.LL; THE UCB IS THEN PRESUMED TO BE IN THE DESCRIPTOR FOR ALL OTHER SEARCHES.;P* CALL 50$ ;CHECK THE TASK LOGICAL TABLE) BCC 40$ ;IF CC, THE LOGICAL WAS FOUNDC4 BVS 30$ ;IF VS, TABLE INHIBITED, DON'T TOUCH TCB9 MOV 10(R0),R5 ;GET THE TCB ADDRESS FROM THE DESCRIPTORN4 MOV T.UCB(R5),10(R0);AND PUT THE UCB ADDRESS BACK/ BR 30$ ;GO ON FOR THE OTHER TYPES OF LOOKUPO;SK; THE FOLLOWING LOOKUPS ARE ONLY FOR THE USER, GROUP, AND SYSTEM LOOKUPS.EQ; FOR THE USER AND GROUP LOOKUPS, IT IS ASSUMED THAT THE CORRECT UCB IS ALREADYE; IN THE DESCRIPTOR BLOCKE;A20$: CALL 50$ ;VERIFY ONE OF THE USER, GROUP, OR SYSTEM TABLES ) BCC 40$ ;IF CC, THE LOGICAL WAS FOUND "30$: INC R2 ;BUMP TO NEXT TABLE% CMP #T$BLNM,R2 ;ALL TABLES CHECKEDM" BHIS 20$ ;IF HIS, NO, CONTINUE.35$: SEC ;INDICATE FAILURE TO FIND A MATCH 40$: RETURNT;YL; ROUTINE TO DETERMINE IF THIS TABLE IS VALID AND IF THE LOGICAL IS WITHIN ; THE TABLEU;G50$: BITB $MSKBT(R2),$TONYL ;SEE IF SEARCH OF THIS TABLE IS INHIBITED ' SEV ;INITIALIZE TO TABLE INHIBITED3 BNE 35$ ;IF EQ, IT IS, CONTINUE WITH NEXT TABLEO= CLRB 6(R0) ;SET TABLE NUMBER TO BE SEARCHED IN DESCRIPTOR BISB $LTMSK(R2),6(R0);T00hfeb`TADATADATADATADATADATA .PAGE;+F; $LNTBS - ROUTINE TO FIND A LOGICAL NAME STRING IN A SPECIFIC TABLE;F ; INPUTS:D1 ; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCKR ; BLOCK CONTAINS:' ; WD 1 - BYTE COUNT OF LOGICAL NAMEH0 ; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME7; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAMEI.; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)*; BLOCK TYPE NUMBER (HIGH BYTE);; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLEM1; R1 - WORD OFFSET TO BE USED TO FIND HASH CELLT;R ; OUTPUTS:.; CC = 0 -> SUCCESSFUL MATCH OF LOGICAL NAME,; R3 = MATCHING LNB (32 WD BLOCK ADDRESS)4; R4 = PREVIOUS LNB IN LIST (32 WD BLOCK ADDRESS) ; CC = 1 -> UNSUCCESSFUL MATCH;; R3 = LOGICAL FITS BELOW THIS LNB (32 WD BLOCK ADDRESS)A;; R4 = LOGICAL FITS ABOVE THIS LNB (32 WD BLOCK ADDRESS)E; &; R0,R1 IS PRESERVED ACROSS THE CALL;+ $LNTBS::*  MOV R1,-(SP) ;SAVE THE HASH CELL OFFSET=! MOV KISAR6,-(SP) ;SAVE THE CURRENT VALUE OF KERNEL D APR 6 #" CALL $MPHSH ;MAP THE HASH TABLEC+# BCS 30$ ;IF CS, NO HASH TABLE AVAILABLE '$ CLR R4 ;INITIALIZE PREVIOUS POINTER<% ADD #MAP6,R1 ;ADD A KISAR6 OFFSET TO THE HASH TABLE ENTRY*& SEC ;ASSUME THAT THERE ARE NO ENTRIES4' MOV (R1),R3 ;GET THE APR BIAS OF THE FIRST ENTRY( BEQ 30$ ;IF NO ENTRY EXIT ()10$: MOV R3,KISAR6 ;MAP THE NEXT ENTRYA* CMPB (R0),MAP6+L.NLNS;ARE THE LENGTHS OF THE ENTRIES THE SAME? -+ BLO 30$ ;IF LO, NO - LOGICAL BELONGS HERE *, BEQ 20$ ;IF EQ, MAYBE, CONTINUE CHECKS.-15$: MOV R3,R4 ;UPDATE THE PREVIOUS POINTER . SEC ;ASSUME NO MORE ENTRIES./ MOV MAP6+L.NLNK,R3 ;GET THE NEXT ENTRY BIAS/0 BEQ 30$ ;IF EQ, NO MORE, ENTRY BELONGS HEREY,1 BR 10$ ;GO BACK AND CHECK THE NEXT ENTRY;220$: CALL $LNTST ;CHECK THE TABLE PARAMETERS FOR A MATCH323 BCS 15$ ;IF CS, THEY DIDN'T MATCH, GET ANOTHER94 CALL $CMPST ;CONDITIONS MATCH, SEE IF LOGICAL IS SAMEH:5 BCS 30$ ;IF CS, THEY DON'T - ENTRY BELONGS HERE THOUGH%6 TST R1 ;IF R1 = 0 THIS IS A MATCHN&7 BNE 15$ ;IF NE, TRY THE NEXT ENTRY08 TSTB 7(R0) ;SEE IF THIS IS A GENERIC COMPARE69 BEQ 30$ ;IF EQ, IT IS, DON'T COMPARE BLOCK NUMBERSF: CMPB 7(R0),MAP6+L.NBLK ;LOGICAL IS CORRECT, IS BLOCK TYPE THE SAME?.; BHI 15$ ;IF HI, NO, GO BACK FOR NEXT ENTRY,< ;IF LO, CS IS SET - ENTRY BELONGS HERE%= ;IF EQ, CC IS CLEAR AND SUCCESSR/>30$: MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPINGA-? MOV (SP)+,R1 ;RESTORE THE HASH CELL OFFSETT @ RETURNHABC .PAGED;+JE; $LNHSH - ROUTINE TO TURN A LOGICAL NAME STRING INTO A WORD OFFSET INTO*F; A TO-BE-DETERMINED LOGICAL HASH TABLEG;3 H; INPUTS:T1I; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCK6J; BLOCK CONTAINS:'K; WD 1 - BYTE COUNT OF LOGICAL NAME$0L; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME7M; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAMEA N; OUTPUTS:O; R0 - SAME AS INPUTBP; R1 - WORD OFFSET FROM START OF HASH TABLE TO CORRECT HASH CELLQ;TKR; ALL CHARACTERS IN THE ASCII RANGE WITHIN THE LOGICAL ARE UPCASED BEFORENS; PROCESSING. T;OJU; *************************** TAKE NOTE ********************************V;0-W; THIS ROUTINE MUST NOT BE CHANGED WITHOUT1X; THE CORRESPONDING CHANGE TO THE SAME ROUTINEC3Y; IN [70,10]ASNOV.MAC FOR VMR. ANY CHANGES MADE 2Z; HERE AND NOT THERE WILL CAUSE AN INABILITY TO-[; FIND AND DELETE LOGICALS CREATED BY VMR.T\; J]; **********************************************************************^;+_ `$LNHSH::'a CLR R1 ;INITIALIZE THE OFFSET VALUEB0b MOV KISAR6,-(SP) ;SAVE CURRENT KISAR6 MAPPING.c MOV R0,-(SP) ;SAVE DESCRIPTOR BLOCK ADDRESS%d MOV R2,-(SP) ;SAVE THE INCOMING R2N%e MOV R3,-(SP) ;SAVE THE INCOMING R3P7f MOV (R0)+,R2 ;GET THE NUMBER OF BYTES IN THE LOGICALM!g BEQ 20$ ;NONE TO BE PROCESSED /h MOV (R0)+,KISAR6 ;MAP THE BLOCK TO BE HASHED6i MOV (R0)+,R3 ;GET THE OFFSET TO THE FIRST CHARACTER9j10$: CALL $CVBUC ;GET THE NEXT CHARACTER IN UPPER CASE*:k ADD R5,R1 ;SUM THE UPCASED CHARACTER00pfueccccc VALUES OF LOGICAL-l SOB R2,10$ ;ALL THE VALUES OF THE LOGICALNm MOV R1,R0 ;SQUARE THE VALUE n CALL $MUL ;B=o ASH #-5.,R1 ;SHIFT VALUE TO GET WORD OFFSET RANGE OF 0-31,7p BIC #177701,R1 ;BY TAKING THE MIDDLE 6 BITS OF VALUEMq20$: MOV (SP)+,R3 ;RESTORE R3Br MOV (SP)+,R2 ;RESTORE R2 5s MOV (SP)+,R0 ;RESTORE THE DESCRIPTOR BLOCK ADDRESSM+t MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPINGA u RETURN:vwx .PAGEy;+Pz; $LNTST - ROUTINE TO MATCH THE TABLE PARAMETERS OF A DESCRIPTOR BLOCK AGAINST{; AN LNB IN THE LISTL|; }; INPUTS: 1~; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCK ; BLOCK CONTAINS:'; WD 1 - BYTE COUNT OF LOGICAL NAME 0; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME7; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAMEV.; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)*; BLOCK TYPE NUMBER (HIGH BYTE);; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLEE8; R3 - APR BIAS TO THE START OF AN LNB IN A TABLE LIST; H; KISAR6 MUST MAP THE LNB CURRENTLY IN R3 WHEN THIS ROUTINE IS INVOKED;- ; OUTPUTS:9; CC = 0 -> TABLE TYPES AND UCB/TCB/GROUP NUMBERS MATCHD1; CC = 1 -> ENTRIES DO NOT MATCH IN SOME REGARDD;K;- $LNTST::$ MOV R1,-(SP) ;SAVE THE CURRENT R1+ MOV 6(R0),R1 ;GET THE TABLE NUMBER IN R1TA CMPB #LT.TSK,R1 ;IS THE DESCRIPTOR ENTRY IN THE THE TASK TABLE)' BNE 20$ ;IF NE, NO, CONTINUE CHECKSI910$: CMP MAP6+L.NTCB,10(R0);DO THE TCB/UCB VALUES MATCHL* BEQ 40$ ;IF EQ, YES, EXIT SUCCESSFULLY* BR 30$ ;IF NE, NO, EXIT UNSUCCESSFULLY520$: CMPB #LT.SES,R1 ;IS THIS A SESSION TABLE CHECKE BEQ 10$ ;IF EQ, YESR/ CMPB #LT.GRP,R1 ;IS THIS A GROUP TABLE CHECKO2 BNE 40$ ;IF NE, NO, IT IS A SYSTEM TABLE CHECK= CALL GTUIC ;GET THE PROTECTION UIC GROUP CODE FROM $TKTCB B CMPB MAP6+L.NGRP,R1 ;CHECK THE GROUP AGAINST THE PROTECTION UIC% BEQ 40$ ;IF EQ, THEY ARE THE SAMEE 30$: SEC40$: MOV (SP)+,R1 ;RESTORE R1E  RETURNL .PAGE;+E; $DCBTA - ROUTINE TO TURN A BINARY VALUE INTO AN ASCII TEXT STRINGL; ; INPUTS:.+; R0 - NUMBER TO BE TRANSLATED INTO ASCIIQ5; R3 - POINTER TO BUFFER TO STORE TRANSLATED NUMBER ; ; OUTPUTS:&; R3 - POINTS PAST THE NUMBER STRING;J; THIS ROUTINE WILL NOT TRANSLATE A ZERO UNIT NUMBER INTO AN ASCII DIGIT;R;-5$DCBTA::BIC #177400,R0 ;PREVENT SIGN PROPAG. IN ASH # ;(0; THIS SUBFUNCTION GETS A SPECIFIC DEFAULT DIRECTORY STRING.B; IF GD.LOG IS SPECIFIED, THE DDS WILL BE TAKEN FROM THE CONTEXTC; BLOCK POINTED TO BY THE USER TI: UCB. IF THE MODIFIER IS ZERO,;?; THE DDS WILL TAKEN FROM THE CONTEXT BLOCK POINTED TO BY THER; ISSUING TASK'S TCB. ;E;B ; INPUTS:N;; R3 = ADDRESS OF DPB+2E/; R5 = ADDRESS OF THE TCB OF THE CURRENT TASK;; AFTER CALL TO ACROB:'; R0 = SIZE OF USER BUFFER (IN BYTES) ; R1 = BIAS OF USER BUFFER); R2 = APR6 DISPLACEMENT TO USER BUFFERD;T ; OUTPUTS:9 ; THE DEFAULT DIRECTORY STRING (OR AS MUCH AS WILL FIT)M-!; IS RETURNED IN THE SPECIFIED USER BUFFER.T;"; IN ADDITION, IF THE ADDRESS OF A WORD IN WHICH THE SIZEO+#; OF THE STRING IS RETURNED IS SPECIFIED.S$; %;- &$LNFGD::6& .IF DF C$$RDR ; REMOTE DIRECTORY SUPPORT ;KLN027& ;KLN027HF& BIT #F5.RDR,$FMSK5 ;ARE WE USING REMOTE DIRECTORY STORAGE? ;KLN027"& BNE 100$ ;IF EQ NO ;KLN0275& JMP 1$ ;GET DIRECTORY FROM CONTEXT BLOCK ;KLN027S&; ;KLN0271&; GET A REQUEST PACKET FROM CPRBUF ;KLN027U&; ;KLN0277&100$: MOV 6(R3),R1 ;GET SIZE OF USER BUFFER ;KLN027O'& BEQ 103$ ;IF ZERO ERROR ;KLN027S.& CMP R1,#LN$SIZ ;IS IT TOO LARGE? ;KLN027*& BLOS 105$ ;IF LO OR SAME NO ;KLN0275&103$: DRSTS D.RS89 ;INVALID BUFFER SIZE ;KLN027NQ&105$: ADD #,R1 ;ADD SIZE OF HEADER,DPB,BUFFERED ;KLN027E#& ;STORAGE AREA ;KLN0271*& ; AND RETURNED SIZE BUFFER ;KLN027>& MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ ;KLN027;& ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ;KLN027 & ASH #-6,R1 ; ;KLN027D& MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START ;KLN027*& MOV R3,R5 ;SAVE DPB POINTER ;KLN0272& CALL $CPALO ;GET BUFFER FROM CPRBUF ;KLN027&; ;KLN0279&; FILL IN REQUEST PACKET AND SEND TO CPRAME ;KLN027D&; ;KLN027(& MOV R0,KISAR6 ;MAP PACKET ;KLN0271& MOV #MAP6,R1 ;GET ADDRESS OF HEADER ;KLN027R8& MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST ;KLN027(& CLRB H$ICNT(R1) ;NO ITEMS ;KLN027.& ADD #P$DPB,R1 ;POINT TO DPB AREA ;KLN0271& MOV -2(R5),(R1)+ ;COPY DIC AND SIZE ;KLN027I>& MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER ;KLN027(& CLR (R1)+ ;RESERVED WORD ;KLN027L& MOV #,(R1)+ ;ADDRESS OF DEFAULT DIRECTORY ;KLN027& ;BUFFER ;KLN027=& MOV 6(R5),(R1)+ ;SIZE OF DEFAULT DIRECTORY BUFFER ;KLN027R7& CLR (R1)+ ;ASSUME NO RETURN SIZE REQUESTED ;KLN027Y1& TST 10(R5) ;SIZE BUFFER SPECIFIED? ;KLN027T"& BEQ 110$ ;IF EQ NO ;KLN027I& MOV #,-(R1) ;ADDRESS OF USER SIZE BUFFER ;KLN027I,& TST (R1)+ ;POINT TO NEXT WORD ;KLN027C&110$: MOV 4(R5),(R1)+ ;STORE ADDRESS OF DIRECTORY BUFFER ;KLN027LD& MOV 10(R5),(R1) ;STORE ADDRESS OF USER SIZE BUFFER (OR 0) ;KLN027& ;KLN027 :& CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME 00fueccccc ;KLN027&; ;KLN027)&; GET RESPONSE PACKET AND ;KLN027E0&; TRANSFER BUFFERS INTO USER AREA ;KLN027&; ;KLN027/& MOV R0,-(SP) ;SAVE PACKET ADDRESS ;KLN027D(& MOV R0,KISAR6 ;MAP PACKET ;KLN027;& CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURNED? ;KLN027#& BEQ 125$ ;IF EQ YES ;KLN027S@& CMP #IE.RBS,MAP6+H$STAT ;WAS IS JUST A SIZE PROBLEM? ;KLN027*& BNE 200$ ;IF NE FATAL ERROR ;KLN027C&125$: MOV MAP6+H$SIZE+GD$SIZ,R0 ;ADDRESS OF USER BUFFER ;KLN0270;& MOV MAP6+H$SIZE+10,R1 ;SIZE OF BUFFER FROM DPB ;KLN027K,& CALL $ACHKB ;DO ADDRESS CHECK ;KLN027%& BCS 240$ ;IF CS ERROR ;KLN027V8& CALL $RELOC ;GET BIAS AND OFFSET OF BUFFER ;KLN0273& MOV R1,R3 ;SET UP DEST BIAS FOR BLXIO ;KLN027T1& MOV R2,R4 ;SET UP DEST DISPLACEMENT ;KLN027F6& MOV (SP),R1 ;SET UP SOURCE BIAS FOR APR5 ;KLN027L& MOV #,R2 ;SET UP SOURCE DISPLACEMENT ;KLN0276& MOV MAP6+H$SIZE+10,R0 ;GET SIZE FROM DPB ;KLN0273& TST MAP6+H$SIZE+12 ;WAS SIZE RETURNED ;KLN027F"& BEQ 130$ ;IF EQ NO ;KLN027,& MOV R0,-(SP) ;SAVE BUFFER SIZE ;KLN027@& MOV MAP6+H$SIZE+GD$SIZ+GD$BUF,R5 ;GET RETURNED SIZE ;KLN0270& SUB R5,(SP)+ ;WILL THE STRING FIT? ;KLN027"& BMI 130$ ;IF MI NO ;KLN027+& MOV R5,R0 ;USE RETURNED SIZE ;KLN027P>&130$: CALL $BLXIO ;RETURN EQUIVALENCE NAME STRING ;KLN0274& TST MAP6+H$SIZE+12 ;WAS SIZE RETURNED? ;KLN027"& BEQ 200$ ;IF EQ NO ;KLN027;& MOV #200$,-(SP) ;SPECIFY $SGFIN RETURN ADDRESS ;KLN027U*& CALL $SGFIN ;INHIBIT TRAPS ;KLN027B& MOV MAP6+H$SIZE+GD$SIZ+GD$BUF,-(SP) ;GET RETURNED SIZE ;KLN027C& MOV MAP6+H$SIZE+GD$SIZ+2,R3 ;GET ADDRESS OF USER BUFFER ;KLN027 +& MTPD (R3) ;RETURN IT TO USER ;KLN027 *& RETURN ;RETURN FROM $SGFIN ;KLN0275&200$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK ;KLN027E.& CALLR $CPDEA ;DEALLOCATE BUFFER ;KLN0275&240$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK ;KLN027F-& CALL $CPDEA ;DEALLOCATE BUFFER ;KLN027 0& DRSTS D.RS98 ;ADDRESS CHECK ERROR ;KLN027&1$: ;KLN027& .ENDC ; C$$RDR ;KLN027B,' CMPB #GD.LOG,1(R3) ;CHECK MODIFIER IN DPB( BNE 5$ ;USE CTX FROM TCB() MOV T.UCB(R5),R5 ;GET TI: UCB ADDRESS(* BIT #DV.PSE,U.CW1(R5) ;PSEUDO DEVICE?+ BNE 3$ ;IF NE, YES2, MOV U.CTX(R5),R5 ;GET USER CONTEXT BLOCK (BIAS)'- BNE 10$ ;IF NE, FOUND CONTEXT BLOCKO,.3$: DRSTS D.RS21 ;RETURN - NAME NOT FOUND!/5$: TSTB 1(R3) ;MODIFIER ZERO?0 BNE 50$ ;IF NE, NO - ERROR41 MOV T.CTX(R5),R5 ;GET CTX ADDRESS FROM TCB (BIAS)'2 BNE 10$ ;IF NE, FOUND CONTEXT BLOCKC;3 DRSTS D.RS21 ;RETURN DIRECTIVE STATUS--'NAME NOT FOUND'E+410$: ADD #4,R3 ;POINT TO WD 3 OF THE DPBV/5 CALL ACROB ;CALCULATE BIAS AND DISPLACEMENTE"6 MOV R3,$TEMP0 ;SAVE DPB POINTER(7 MOV R0,-(SP) ;SAVE SIZE OF DDS BUFFER+8 MOV R1,R3 ;SET UP BUFFER BIAS FOR BLXIO "9 MOV R2,R4 ;SET UP DISPLACEMENT+: MOV R5,R1 ;SET UP BIAS OF CONTEXT BLOCKR; MOV R5,KISAR6 ;MAP CTX BLOCK < CLR R5 ;+= BISB C.DDSL+MAP6,R5 ;GET THE DDS LENGTHO*> SUB R5,(SP) ;WILL THE NAME STRING FIT?.? BMI 20$ ;IF HI NO (USE ENTIRE USER BUFFER)-@ MOVB C.DDSL+MAP6,R0 ;ADJUST AMOUNT TO COPYI4A MOV #C.DDS+MAP5,R2 ;SET UP DISPLACEMENT OF STRING2B20$: CALL $BLXIO ;RETURN EQUIVALENCE NAME STING'C MOV $TEMP0,R3 ;GET SAVED DPB POINTERF0D TST (R3) ;WAS AN ADDRESS SPECIFIED TO RETURN1E ;THE LENGTH (BYTE COUNT) OF THE EQUIVALENCESF ;NAME STRING INTO?G BEQ 30$ ;IF EQ NOA0H MOV #30$,-(SP) ;SPECIFY $SGFIN RETURN ADDRESSI CALL $SGFIN ;INHIBIT TRAPS&J CLR -(SP) ;CLEAR LOCATION ON STACK)K BISB C.DDSL+MAP6,(SP) ;GET SIZE OF ENS!L MTPD @(R3) ;RETURN IT TO USERN M RETURN;N30$: MOV (SP)+,R0 ;GET SIZE DIFERENCE BETWEEN USER BUFFERCO ;AND STRING -P BPL 40$ ;IF PL ENTIRE STRING WAS RETURNEDA=Q DRSTS D.RS15 ;RETURN DIRECTIVE STATUS--'BUFFER TOO SMALL'U R40$: RETURNLS&T50$: DRSTS D.RS99 ;INVALID MODIFIERU .PAGEV;+W;9X; $LNFSD -- SET UP DEFAULT DIRECTORY STRING SUBFUNCTIONE00feb`TADATADATADATADATADATAY;AAZ; THIS SUBFUNCTION SETS UP A SPECIFIC DEFAULT DIRECTORY STRING.OC[; IF SD.LOG IS SPECIFIED, THE DDS IN THE CONTEXT BLOCK POINTED TO C\; BY THE USER TI: UCB WILL BE MODIFIED. IF THE MODIFIER IS ZERO,EE]; THE DDS IN THE CONTEXT BLOCK POINTED TO BY THE ISSUING TASK'S TCB F^; WILL BE MODIFIED. IF SD.BYE IS SPECIFIED, THE USERS CONTEXT BLOCK_; WILL BE DELETED.`;L a; INPUTS:Db; R3 = ADDRESS OF DPB+2I3c; R5 = THE ADDRESS OF THE TCB OF THE CURRENT TASKTd;Ce; AFTER CALL TO ACROB:'f; R0 = SIZE OF USER BUFFER (IN BYTES)Ig; R1 = BIAS OF USER BUFFER)h; R2 = APR6 DISPLACEMENT TO USER BUFFEREi;Ej;O k; OUTPUTS:8l; THE DEFAULT DIRECTORY STRING IS CREATED OR SUPERSEDS7m; THE EXISTING STRING. IF A NULL STRING IS SPECIFIED, 7n; (I.E. NO BUFFER ADDRESS SPECIFIED IN THE DIRECTIVE)B>o; THEN THE DEFAULT DIRECTORY STRING FOR THE ISSUING TERMINALp; IS DELETED.Dq; r;As;- t$LNFSD::6t .IF DF C$$RDR ; REMOTE DIRECTORY SUPPORT ;KLN027t ;KLN027 Ft BIT #F5.RDR,$FMSK5 ;ARE WE USING REMOTE DIRECTORY STORAGE? ;KLN027 t BEQ 1$ ;IF EQ NO ;KLN027t; ;KLN0271t; GET A REQUEST PACKET FROM CPRBUF ;KLN027It; ;KLN027*t CMPB #SD.BYE,1(R3) ;SD.BYE? ;KLN027#t BEQ 205$ ;IF EQ YES ;KLN027Et ;KLN027N)t CMPB #SD.TI,1(R3) ;SD.TI? ;KLN027C#t BEQ 205$ ;IF EQ YES ;KLN027t ;KLN027 2t MOV 6(R3),R1 ;GET SIZE OF USER BUFFER ;KLN0272t BEQ 200$ ;IF EQ ILLEGAL SIZE FOR DDS ;KLN027t ;KLN027 .t CMP R1,#LN$SIZ ;IS SIZE TOO BIG? ;KLN027$t BLOS 210$ ;IF LOS NO ;KLN027=t200$: DRSTS D.RS89 ;RETURN ILLEGAL BUFFER LENGTH ;KLN027Kt ;KLN027;+t205$: CLR R1 ;NO BUFFER SIZE ;KLN027LAt210$: ADD #,R1 ;ADD SIZE OF HEADER,DPB ;KLN027>t MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ ;KLN027;t ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ;KLN027Zt ASH #-6,R1 ; ;KLN027B*t MOV R3,R5 ;SAVE DPB POINTER ;KLN027Dt MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START ;KLN0272t CALL $CPALO ;GET BUFFER FROM CPRBUF ;KLN027t; ;KLN027(t; FILL IN REQUEST PACKET ;KLN027t; ;KLN0270t MOV R4,-(SP) ;SAVE SIZE OF REQUEST ;KLN027,t MOV R0,-(SP) ;SAVE PACKET BIAS ;KLN027(t MOV R0,KISAR6 ;MAP PACKET ;KLN0271t MOV #MAP6,R1 ;GET ADDRESS OF HEADER ;KLN027 8t MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST ;KLN027(t CLRB H$ICNT(R1) ;NO ITEMS ;KLN027.t ADD #P$DPB,R1 ;POINT TO DPB AREA ;KLN0271t MOV -2(R5),(R1)+ ;COPY DIC AND SIZE ;KLN027O?t MOV (R5)+,(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER ;KLN027I-t MOV (R5)+,(R1)+ ;RESERVED WORD ;KLN027 *t CMPB #SD.BYE,1(R3) ;SD.BYE? ;KLN027#t BEQ 220$ ;IF EQ YES ;KLN027 )t CMPB #SD.TI,1(R3) ;SD.TI? ;KLN027A#t BEQ 220$ ;IF EQ YES ;KLN027 Jt MOV #,(R1)+ ;ADDRESS OF DEFAULT DIRECTORY BUFFER ;KLN0272t MOV (R5)+,R0 ;USER ADDRESS OF BUFFER ;KLN027;t MOV (R5),(R1) ;SIZE OF DEFAULT DIRECTORY BUFFER ;KLN027V:t MOV (R1),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK ;KLN027*t CALL $ACHKB ;CHECK ADDRESS ;KLN027%t BCS 300$ ;IS CS ERROR ;KLN027R:t CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT ;KLN027Kt SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT ;KLN0272*t MOV (SP),R3 ;GET DEST BIAS ;KLN027@t MOV #,R4 ;GET DEST DISPLACEMENT ;KLN0278t MOV MAP6+P$DPB+10,R0 ;GET SIZE OF TRANSFER ;KLN027=t CALL $BLXIO ;TRANSFER DIRECTORY SPEC INTO BUFFER ;KLN027t220$: ;KLN0270t MOV (SP)+,R0 ;GET PACKET BIAS BACK ;KLN0272t MOV (SP)+,R4 ;GET PACKET LENGTH BACK ;KLN027t ;KLN027L:t CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME ;KLN027t ;KLN027S7t CALLR $CPDEA ;NO RETURN PROCESSING NEEDED ;KLN027(t ;KLN027S0t300$: MOV (SP)+,R0 ;GET PACKET BIAS ;KLN027)t TST (SP)+ ;CLEAN OFF STACK ;KLN027$-t CALL $CPDEA ;DEALLOCATE BUFFER ;KLN027C+t DRSTS D.RS98 ;00fuecccccADDRESS ERROR ;KLN027Ft1$: ;KLN027t .ENDC ; C$$RDR ;KLN027G%u TSTB 1(R3) ;CHECK MODIFIER IN DPB(v BEQ 30$ ;USE CTX FROM TCB *w CMPB #SD.TI,1(R3) ;WAS SD.TI SPECIFIED?x BNE 10$ ;IF NE, NO8y MOV T.CTX(R5),-(SP) ;GET TASK'S CONTEXT BLOCK POINTER z MOV T.UCB(R5),R1 ;GET TI: UCB:{ CMP U.CTX(R1),(SP)+ ;IS TERMINAL CONTEXT SAME AS TASK?$| BEQ 90$ ;IF EQ, INDICATE SUCCESS)} MOV T.CTX(R5),R1 ;GET TERMINAL CONTEXTD-~ CALL $DLCTX ;DELETE TASKS CURRENT CONTEXTR& MOV T.UCB(R5),R1 ;GET TI: UCB AGAIN@ MOV U.CTX(R1),T.CTX(R5) ;SET TASK CONTEXT TO TERMINAL CONTEXT BEQ 65$ ;IF EQ, DONE! MOV KISAR6,-(SP) ;SAVE MAPPINGC* MOV U.CTX(R1),KISAR6 ;MAP CONTEXT BLOCK/ INCB C.REF+140000 ;INCREMENT REFERENCE COUNTA$ MOV (SP)+,KISAR6 ;RESTORE MAPPING$ BR 65$ ;INDICATE NAME SUPERCEDED,10$: MOV T.UCB(R5),R5 ;GET TI: UCB ADDRESS( BIT #DV.PSE,U.CW1(R5) ;PSEUDO DEVICE? BNE 80$ ;IF NE, YESI;O5; IF SD.BYE, DELETE CONTEXT BLOCK AND RETURN STATUS;V( CMPB #SD.BYE,1(R3) ;SD.BYE SPECIFIED? BNE 20$ ;IF NE, NO2 MOV U.CTX(R5),R1 ;GET USER CONTEXT BLOCK (BIAS)% CALL $DLCTX ;DEALLOCATE CTX BLOCKN, CLR U.CTX(R5) ;ZERO CONTEXT BLOCK POINTER4 DRSTS D.RSP3 ;RETURN STATUS OF 'NAME SUPERSEDED'+20$: CMPB #SD.LOG,1(R3) ;SD.LOG SPECIFIEDN BNE 100$ ;IF NE, ERROR&30$: MOV R3,$TEMP0 ;SAVE DPB POINTER' ADD #4,R3 ;POINT TO WD 3 OF THE DPB?/ CALL ACROB ;CALCULATE BIAS AND DISPLACEMENTD0 CMP #11.,R0 ;MAX LENGTH OF DDS BUFFER IS 11. BLT 110$ ;IF LE, ERROR5 SUB #MAP6-MAP5,R2 ;MAKE BIAS APR5 RATHER THAN APR6G! CALL $CRCTX ;CREATE CTX BLOCKL( BCS 70$ ;BR IF CTX ALLOCATION FAILED& MOV $TEMP0,R2 ;GET DPB ADDRESS BACK, CMPB #SD.LOG,1(R2) ;WAS SD.LOG SPECIFIED? BNE 40$ ;IF NE, NO7 MOV U.CTX(R5),R1 ;GET CONTEXT BLOCK POINTER FROM UCBR" BEQ 60$ ;IF EQ, NO CURRENT CTX# CALL $DLCTX ;DELETE OLD CONTEXT % BR 60$ ;UPDATE CTX POINTER IN UCBS;40$: MOV T.CTX(R5),R1 ;GET CONTEXT BLOCK POINTER FROM TCB " BEQ 50$ ;IF EQ, NO CURRENT CTX# CALL $DLCTX ;DELETE OLD CONTEXTR350$: MOV R3,T.CTX(R5) ;PUT NEW CTX POINTER IN TCB. DRSTS D.RSP3 ;STATUS OF 'NAMED SUPERCEDED'360$: MOV R3,U.CTX(R5) ;PUT NEW CTX POINTER IN UCBW! MOV KISAR6,-(SP) ;SAVE MAPPINGI# MOV R3,KISAR6 ;MAP CONTEXT BLOCKN3 MOV #C.DDS+140001,R0 ;POINT TO FIRST CHAR OF DDSC! MOV R5,-(SP) ;SAVE UCB ADDRESS 7 CALL CNTB ;CONVERT DDS TO BINARY EQUIV, IF POSSIBLE0$ MOV (SP)+,R5 ;RESTORE UCB ADDRESS$ MOV (SP)+,KISAR6 ;RESTORE MAPPING# BCC 62$ ;IF CC, CONVERSION DONEL= MOV U.LUIC(R5),U.UIC(R5) ;SET DEFAULT UIC = PROTECTION UICI  BR 65$ ;>62$: MOV R1,U.UIC(R5) ;SET DEFAULT UIC = BINARY EQUIV OF DDS165$: DRSTS D.RSP3 ;STATUS OF 'NAME SUPERCEDED'(%70$: DRSTS D.RS1 ;INDICATE NO POOLO-80$: DRSTS D.RS21 ;RETURN - NAME NOT FOUNDS 90$: DRSTS +1 ;RETURN SUCCESS'100$: DRSTS D.RS99 ;INVALID MODIFIERI,110$: DRSTS D.RS89 ;INVALID BUFFER LENGTH;A8; CNTB - CONVERT A NAMED DIRECTORY TO A BINARY WORD IF%; IN THE FORM OF [G,M] OR [GGGMMM](;. ; INPUTS: R0 = BUFFER POINTER;I%; OUTPUTS: IF CC, R1 = BINARY WORD55; IF CS, INDICATES NAMED DIRECTORY NOT CONVERTEDD; CNTB:N' CLR -(SP) ; USE STACK FOR FLAG WORD * MOV #3,R4 ; NUMBER OF CHARS TO CONVERT$ CLR R1 ; CLEAR ACCUMULATED VALUE! MOVB #',,R2 ; STOP ON A COMMA0 CALL 100$ ; CONVERTD BCS 20$ ; BR IF INVALID  MOV R1,R3 ; STORE RESULT BEQ 20$ ; IF EQ, INVALID* MOV #3,R4 ; NUMBER OF CHARS TO CONVERT$ CLR R1 ; CLEAR ACCUMULATED VALUE' CMPB #',,(R0) ; POINTING TO A COMMA? BNE 10$ ; IF NE, NOI TSTB (R0)+ ; SKIP THE COMMAE" INC (SP) ; INDICATE COMMA SEEN'10$: MOVB #'],R2 ; STOP ON A BRACKETC CALL 100$ ; CONVERT# BCS 20$ ; BR IF INVALIDN) SWAB R3 ; PUT GROUP CODE IN HIGH BYTE BIS R3,R1 ; PUT INTO RESULT0 BEQ 20$ ; IF EQ, INVALID# CMPB #'],(R0)+ ; ENDING BRACKET?, BNE 20$ ; IF NE, ERROR" TST (SP) ; D00ffb`TADATADATADATADATADATAID WE SEE A COMMA? BNE 15$ ; IF NE, YES% TST R4 ; VERIFY WE PARSED 3 CHARSE BNE 20$ ; IF NE, - ERROR115$: TST (SP)+ ; CLEAN STACK, INDICATE SUCCESS)% BR 30$ ; RETURN TO CALLER WITH CCD20$: TST (SP)+ ; CLEAN STACK,+ SEC ; INDICATE DIRECTORY NOT CONVERTEDV&30$: RETURN ; AND RETURN TO CALLER%100$: MOVB (R0)+,R5 ; GET NEXT CHARR* CMPB R2,R5 ; IS THIS ENDING CHARACTER? BEQ 115$ ; BR IF YES( SUB #'0,R5 ; SUBTRACT CHARACTER BIAS" BMI 120$ ; IF MI, ILLEGAL CHAR$ CMPB R5,#8. ; CHECK AGAINST BASE$ BHIS 120$ ; IF HIS, ILLEGAL CHAR$ MUL #8.,R1 ; MULT RESULT BY BASE! ADD R5,R1 ; ACCUMULATE RESULTU SOB R4,100$ ; GO AGAIN/110$: CMP #377,R1 ; NUMBER GREATER THAN 377?C RETURN ; RETURN TO ABOVER115$: TSTB -(R0) ; BACK UP & CMP #3,R4 ; DID WE PARSE ANYTHING? BNE 110$ ; IF NE, YES - OK,120$: SEC ; INVALID CHARACTER TO CONVERT RETURN ; RETURN TO ABOVEB  .ENDC ;DF N$$DIR   .END120$ ; IF MI, IL .TITLE DCCHE - $CACHE ENTRY .IF DF D$$CHE .IDENT /01.01/e;6; Copyright (c) 1985 by DIGITAL EQUIPMENT CORPORATION.; All rights reserved.;; Original author:; John Gemignani;.; Modified by:;M; D. P. Rabahy 06-Mar-85 01.01%; General clean up and documentatione;eI; This module contains the various entry points into the cache code. TheeO; executive transfers control to the cache via entry point $CACHE, from routineBL; $DRQRQ in module DRSUB. (Note that other entry paths are possible when the;; cache uses the fork list and the internal I/O mechanism.)y;hO; Entry point $XPLOA is called by the LOAD utility to load the cache code as annL; EXP. Likewise, entry point $XPUNL is called by UNLOAD to remove the cacheP; code. This requires special handling, since you must guarantee that the cacheP; is not being used. A recommended way to do this is to check the cache contextP; fields of the UCBX for all disks on the system. If the appropriate cache bitsM; are NOT on, then the code has no partitions in the system which are active.t;aG; Note that the EXP hookpoints ($XPLOA and $XPUNL) are called in APR6. yL; Therefore, position-independent code is required, with absolute referencesN; corrected by subtracting 20000 from the target addresses. The cache code isP; built for APR5 (120000->137777), and the subtraction of the 020000 will change;; the 140000-157777 references to the proper address range.l;s .MCALL PCBDF$* PCBDF$ ;Define partition control block - .SBTTL $CACHE - Main entry point from $DRQRQh; 4; The presence of the packet is guaranteed (driver5; kick-starts will bypass the dispatching routine).t0; The UCB and SCB are accessible via R5 and R46; respectively. The caller's mapping has been saved4; on the stack above the return address to $DRQRQ.;0$CACHE::( CALLR $DCDSP ;Invoke cache dispatcher e- .SBTTL Executive external partition routinesa, .SBTTL + $XPLOA - "LOAD /EXP=" entry point.;e;; This routine (module, and whole EXP for that matter) is <; mapped in APR6 (140000->157777). The stack contains the=; return address to LOAD, and the address above that is thet>; PCB address of the partition which LOAD created and copied>; us into. LUN 1 is assigned to the issuer's console (TI:).;; We are NOT in system state. Status is returned via the$(; C-bit: CC is success, CS is failure.; $XPLOA:: TST @#$DRCHE ;Already loaded?B BNE 10$ ;Yes if NEX( MOV 2(SP),R0 ;Else get our PCB address3 MOV P.REL(R0),@#$DRCHE ;And tell the exec about iti TST (PC)+ ;Return success!10$: SEC ;Else error if loadede RETURN ;Back to LOAD b. .SBTTL + $XPUNL - "UNLOAD /EXP=" entry point.;w;; This routine (module, and whole EXP for that matter) is <; mapped in APR6 (140000->157777). The stack contains the7; return address to UNLOAD. LUN 1 is assigned to the 8; issuer's console (TI:). We are NOT in system state.:; Status is returned via the C-bit: CC is success, CS is ; failure.;PA; NOTE: Th00fffccccis existing code does not check for the presence of anyn:; existing active cache partitions. Therefore, removal of7; the cache code during normal operation can (and will)o;; crash the system (as soon as something takes up the spacet&; the cache code previously occupied).;7$XPUNL::+ CLR @#$DRCHE ;Wipe out APR bias to unloadD RETURN ;And return with CC .ENDC ; .IF DF D$$CHE .END NOT in system state.:; Status is returned via the C-bit: CC is success, CS is ; failure.;PA; NOTE: Th .TITLE DCDSP - CACHE DISPATCHER .IF DF D$$CHE .IDENT /01.01/N; 6; Copyright (c) 1985 by DIGITAL EQUIPMENT CORPORATION.; All rights reserved.;D; Original author:; John Gemignani;; Modified by:;P; D. P. Rabahy 06-Mar-85 01.01%; General clean up and documentation ;bI; This module contains the code which dispatches incoming I/O operations.R;R .PSECT DC$DSP, RO, I  n1 .SBTTL + DCDSP - DATA CACHE OPERATION DISPATCHER;;v ; Passed:e; R1 -> I/O packet ; R5 -> UCBL;C ; Returned: ; R0 contents lost;R>;;; N/A - control is passed to the appropriate phase-I routine;I ; Action:N4; This routine is used to dispatch the I/O packet to6; the appropriate action routines. The UCBX is mapped3; before beginning processing, in order to make theo8; context handy, and to verify that the UCBX is present.7; (Disk UCBs without UCBXs are either offline, or don'tO7; have one due to a lack of secondary pool, and as suchE; cannot support data caching.)a;t7; Function codes are checked in the order in which they6; occur most. The low three bits of the function code6; (lowest three bits of the modifier byte) are assumed8; to not be useable, as far as dispatching is concerned.; 9; All I/O functions except IO.STC require the cache to bem:; activated in order for dispatching (since IO.STC is used; to activate the cache).t;B$DCDSP::0 MOV U.UCBX(R5), KISAR6 ; Map the UCBX into APR60 BEQ 10$ ; None present if EQ, no caching here+ MOV I.FCN(R1), R0 ; Get the function coded5 BIC #BYPASS, R0 ; Remove any modifier (bypass) bitsr% CMP #IO.STC, R0 ; Control function?h BEQ 60$ ; Yes if EQ= BITB #XC.ACT, APR6.BASE+X.CSTS ; Cache active for this unit? * BEQ 10$ ; No if EQ, pass to the driver+ CMP #IO.RVB, R0 ; Read virtual operation?o BNE 30$ ; If NE, sanity check BPT30$:) CMP #IO.LOV, R0 ; Load I-space overlay?V BEQ 50$ ; Yes if EQ+ CMP #IO.RLB, R0 ; Read logical operation?  BEQ 20$ ; Yes if EQ, CMP #IO.WVB, R0 ; Write virtual operation? BNE 45$ ; If NE, sanity check BPT45$:, CMP #IO.WLB, R0 ; Write logical operation? BEQ 40$ ; Yes if EQ) CMP #IO.LDO, R0 ; Load D-space overlay?h BEQ 50$ ; Yes if EQ+10$: RETURN ; Pass request to the driver620$: BIT #BYPASS, I.FCN(R1) ; Should read be bypassed? BNE 10$ ; If NE, yesT$ CALLR $DCR1 ; Invoke read phase I)40$: CALLR $DCW1 ; Invoke write phase I#150$: CALLR $DCOV1 ; Invoke load overlay phase IY,60$: CALLR $DCSTC ; Invoke control routine .ENDC ; .IF DF D$$CHE .ENDity check BPT45$:, CMP #IO.WLB, R0 ; Write logical operation? BEQ 40$ ; Yes if EQ) CMP #IO.LDO, R0 ; Load D-space overlay?h BEQ 50$ ; Yes if EQ+10$: RETURN ; Pass request to the driver620$: BIT #BYPASS, I.FCN(R1) ; Should read be bypassed? BNE 10$ ; If NE, yesT$ CALLR $DCR1 ; Invoke read phase I)40$: CALLR $DCW1 ; Invoke write phase I#150$: CALLR $DCOV1 ; Invoke load overlay phase IY,60$: CALLR $DCSTC ; Invoke control routi .TITLE DCSUB - Subroutines  .IF DF D$$CHE .IDENT /01.05/B; 8; Copyright (c) 1986 by DIGITAL EQUIPMENT CORPORATION.;; All rights reserved.; ; Original author: ; John Gemignani ;e ; Modified by: ; ; D. P. Rabahy 06-Mar-85 01.01!; Eliminate the routine .MPPHYb;l;&; Modified for RSX-11M-PLUS V4.0 by:;$; Eric Postpischil 26-Jun-86 01.02-; EDP033 -- Add support for large extents.e;l ; J. Kauffman 26-Aug-86 01.038; JRK330 00ffb`TADATADATADATADATADATA-- Add support for write deferred operations;E#; B. S. McCarthy 19-Mar-87 01.04i6; BM387 -- Convert part of of $BCKUP to call $DCWIO; #; J. R. Kauffman 29-May-87 01.05a1; JRK336 -- Force cache flush if going NODEFER;G; This module contains various routines to support disk data caching.l; .MCALL HDRDF$ ;JRK3304 ;JRK330c1 HDRDF$ ; Define the Header offsets ;JRK330p ;JRK330s .PSECT DC$SUB,RO,Ia -: .SBTTL SEARCH - Search for the first overlapping extent;t ; Passed:; R1 -> User's I/O packet1;; UCBX mappedv;a ; Returned: E; R2 := LSB (Least Significant Part) of the highest requested block %; R3 := MSP (Most Significant Part)*; R4 := Length of the transfer in blocks;o& ; CC: R0 -> First overlapping extent(!; CS: Indicates no overlapping extentsD"; H.TMP1 -> CED prior to request (zero denotes beginning of list);#; H.TMP2 -> CED after request (zero denotes end of list)-$;c%; Cache partition mapped&;t 'SEARCH::2( MOV APR6.BASE+X.CCED, R0 ; Get the first extent)** CALL MAPPAR ; Map the cache partition+3, MOVB I.PRM+P4(R1), R3 ; Get MSP of requested LBN!- MOV I.PRM+P5(R1), R2 ; and LSPt.+/ MOV R2, -(SP) ; Put a copy on the stack0 MOV R3, -(SP)162 MOV I.PRM+P2(R1), R4 ; Get the request size (bytes)3 ADD #777, R4 ; Round upi23 ROR R4 ; Bring carry in as high bit. ;EDP03373 SWAB R4 ; Finish right shift of nine bits. ;EDP03333 BIC #177400,R4 ; Clear unwanted bits. ;EDP0335 ;**-1E*6 DEC R4 ; Backup one block temporarily738 ADD R4, 2(SP) ; Calculate highest LBN requested)"9 ADC (SP) ; Carry if necessary:,; INC R4 ; Restore to full size requested<;= CLR APRD.BASE+H.TMP1 ; Assume prior is beginning of listP>/? TST R0 ; Is the LBN list completely empty?#@ BEQ 51$ ; If EQ, yesRA@B10$: BITB #, E.STAT(R0) ; Is this extent valid?$B BEQ 15$ ; If EQ, yes ;JRK330B; ;JRK330SB; A deferred CED that is marked for delete can not be ignored as a normal ;JRK330aSB; one could. It must be checked to see if the user PC must be backed up. ;JRK330 B; ;JRK3309B BITB #ES.WDF,E.STAT(R0) ; Is CED a deferred? ;JRK330A2B BEQ 20$ ; If EQ, no, ignore this CED ;JRK330D; ;**-17E; Don't forget that the extent high LBN is stored +1.F;F15$: ;JRK330>5G CMPB R3, E.LBNH+2(R0) ; Might this extent overlap? +H BHI 20$ ; If HI, no, check next extent I BLO 30$ ; If LO, yese/J CMP R2, E.LBNH(R0) ; Double word comparison3K BLO 30$ ; If LO, yes L3M20$: MOV R0, APRD.BASE+H.TMP1 ; Set prior pointer3(N MOV E.LNXT(R0), R0 ; Get next extent O BNE 10$ P BR 50$eQ@R30$: CMPB (SP), E.LBNL-1(R0) ; Does this extent truly overlap?S BHI 40$ ; If HI, yesoT BLO 50$ ; If LO, no1U CMP 2(SP), E.LBNL(R0) ; Double word comparisonKV BLO 50$ ; If LO, noW&X40$: CLC ; Indicate overlap found Y BR 60$IZ[50$:4\51$: MOV R0, APRD.BASE+H.TMP2 ; Set after pointer]^ SEC ; Indicate no overlap_`60$: MOV (SP)+, R3a MOV (SP)+, R2b c RETURNTd e .SBTTL Attachment RoutinesX!f .SBTTL + ATTCED - Attach a CEDEg; h; Passed:i; R0 -> CED to attachLj; R1 -> I/O packet to attachk;a l; Returned: m; All registers preserved;n;O7o; This routine will attach a CED to an I/O packet forp; I/O completion. q; rATTCED::s MOV R0, -(SP)t MOV R2, -(SP)u.v MOV R0, R2 ; CREATT returns R0 -> new PADw2x CALL CREATT ; Create an attachment descriptor,y BCS 10$ ;No pool if CS; return an errorz+{ MOV R1,A.IOPA(R0) ; Point to I/O packete4| MOV E.ATTL(R2),(R0) ; Link to start of ATTL list$} MOV R0,E.ATTL(R2) ; Now attached+~ INCB I.PRM+P3(R1) ; Indicate attachment - INCB E.PCNT(R2) ; Lock CED down once morer10$: MOV (SP)+,R2t MOV (SP)+,R0o RETURNp n8 .SBTTL + DETCED - Detach extents involved with an00fffcccc I/O; ; Passed: ; R1 -> I/O packet ; P6 -> First extent involved; ; Returned:e; All registers preservedo;C ; Action:e?; A "lock" is simply an increment of an extent pending count.A;2B; This routine removes the lock placed by phase-I on all extentsG; involved in the I/O request by, naturally, decrementing the pending ; count.;nB; The highest LBN involved is calculated by adding the requestedD; size to the starting LBN. It is then compared to low LBN of the/; next extent to determine if it is involved.F;eC; If any extent pending count reaches zero a check is made and if@; the extent was marked for deletion by DCIOC (I/O completion)@; because a driver error was detected then it will be deleted.;s ; Note:e1; A request size of zero could crash this code.l;cH; If phase-I determines to cache a request through the cache partitionH; it must guarantee that if multiple extents are involved they will be; contiguous to one another.;e DETCED::& MOV R0, -(SP) ; Get work registers MOV R2, -(SP) MOV R3, -(SP);o&; Calculate the highest LBN involved;m7 MOV I.PRM+P2(R1),R3 ; Get the request size in bytes " BPL 10$ ; If PL, sanity check BPT10$: ADD #777, R3 ; Round upu0 ASH #-9., R3 ; Convert it into a block count3 DEC R3 ; It's easier then decrementing the LBNc7 ADD I.PRM+P5(R1), R3 ; Add in LSP of request to sizea1 MOV I.PRM+P4(R1), R2 ; Get MSP of user requestt ADC R2 ; Carry into MSP/ MOV I.PRM+P6(R1), R0 ; Get first CED address120$: DECB E.PCNT(R0) ; Decrement pending counto3 BGT 30$ ; If GT, more pending - leave it alone " BEQ 25$ ; If EQ, sanity check BPT25$:5 BITB #ES.DEL, E.STAT(R0) ; Should this be deleted?91 BEQ 30$ ; If EQ, no - advance to next extentR$ CALL FRECED ; Delete the extent( ; If CS, extent busy - no problem>30$: MOV E.LNXT(R0), R0 ; Get address of next extent by LBN4 BEQ 40$ ; If EQ, end of LBN list - must be done3 CMPB R2, E.LBNL-1(R0) ; Is this extent involved?C BHI 20$ ; If HI, yes / BLO 40$ ; If LO, no - end of attached liste/ CMP R3, E.LBNL(R0) ; Double word comparison BHIS 20$ ; If HIS, yes,.40$: MOV (SP)+, R3 ; Restore work registers MOV (SP)+, R2 MOV (SP)+, R0 RETURN  D .SBTTL Mapping Routines1 .SBTTL + MAP - Map I[/D] space unconditionallyV;XC; MAPPAR- Establish cache partition mapping, based upon executive @; features. This will map the non-I/D exec to the partition?; via APR6, and for I/D systems, both APR5 and APR6 will be;;; used. Mapping context is not saved, and this routineD@; should only be used for code executing from the FORK list.;P MAPPAR::) .IFDF K$$DAS ; Kernel I/D executive?M .IFTF ; K$$DAS" MOV R0,-(SP) ; Save a register9 MOV U.UCBX(R5),KISAR6 ; Map UCB extension through APR6X5 MOV APR6.BASE+X.CPCB,R0 ; Get address of cache PCBu/ MOV P.REL(R0),KISAR6 ; Map partition in APR6e .IFT ; K$$DAS- MOV KISAR6,KISAR5 ; I/D systems allow 8KW , ADD #200,KISAR6 ; Always map accordingly .IFTF ; K$$DASd! MOV (SP)+,R0 ; Restore statuse RETURN ; Back to callerO .ENDC ; K$$DASR 2 .SBTTL + MAPUCB - Map the UCB extension in APR6;A"; MAPUCB - Map the UCB extension;r ; Passed:B; R5 -> UCB of requestor ; Returned:R*; CS: If no UCBX is present for this UCB(; CC: Mapping is established and valid;a:; NOTE: If there is no UCBX then APR6 references will be2; able to touch the vectors (and any part of the/; executive living within the same zip code).; MAPUCB::1 MOV U.UCBX(R5),KISAR6 ;Map UCB's UCBX in APR 6O( BEQ 10$ ;None if EQ; must return CS( TST (PC)+ ;Clear C-bit and skip SEC(10$: SEC ;Else BR to 10$ will set C  RETURN ;And back to caller q, .SBTTL Buffer address conversion routines?  .SBTTL + ADJBUF -00ffb`TADATADATADATADATADATA Convert NPR buffer addresses to doubleword ;" ; ADJBUF - Adjust buffer address ;e ; Passed:e; R1 -> I/O packet to adjust ; R5 -> UCBf; ; Returned:i; Nil.; ;; This routine will replace the 22-bit buffer address for;8; UC.NPR devices with an address doubleword for use by$; the $BLXIO (block move) routine.;k ADJBUF::) BITB #UC.NPR,U.CTL(R5) ;Is device NPR?T- BEQ 10$ ;No if EQ; leave address "as is"f( MOV R2,-(SP) ;Get two work registers MOV R3,-(SP) ;4 MOV I.PRM+P1.1(R1),R2 ;Get the MSB of the address4  MOV I.PRM+P1.2(R1),R3 ;Get the LSB of the address!!" .IFNDF M$$EXT ;18-bit system *# ASH #4,R2 ;Shift <21:20> into <17:16>$ .IFF ;M$$EXT(% SWAB R2 ;Shift <31:24> into <23:16>& .ENDC ; M$$EXTd'8( BIC #^C<77>,I.PRM+P1.2(R1) ;Remove all but low 6 bits:) BIS #APR6.BASE,I.PRM+P1.2(R1) ;Create APR6 displacement$* ROL R3 ;Shift out <15> from LSB+ ROL R2 ;And pick up in MSBe$, ROL R3 ;Shift out <14> from LSB- ROL R2 ;And pick up in MSB;*. SWAB R3 ;Shift <13:6> into low 8 bits&/ SWAB R2 ;Shift <21:14> into place)0 BISB R3,R2 ;Set <13:6> into APR biasH)1 MOV R2,I.PRM+P1.1(R1) ;Create APR biasF2)3 MOV (SP)+,R3 ;Restore saved registers<4 MOV (SP)+,R2 ;5610$: RETURN ; All set7 (8 .SBTTL INTERNAL I/O SUPPORT)9 .SBTTL + CHEDUP - Duplicate I/O packetR:;p<;; CHEDUP - Allocate new packet and duplicate passed packet<;c4=; This routine is used to duplicate the I/O packet8>; passed in R1. All fields are copied, and the result:?; is returned in R0. If the packet cannot be allocated,@; CS will be returned.A;A BCHEDUP::C MOV R1,-(SP)1D MOV R2,-(SP)bEAE MOV #I.LGTH,R1 ; Allocate an I/O packet from primary ;JRK330;+E CALL $ALOCB ; pool space ;JRK330B#G BCS 20$ ; Error if CS ;**-1 H0I MOV 2(SP),R1 ; Get original packet's address3J MOV #,R2 ; Packet size in words in R2,K MOV R0,-(SP) ; Save new packet's address2L10$: MOV (R1)+,(R0)+ ; Copy the packet's fields6M SOB R2, 10$ ; into the new packet, until all done$N MOV (SP)+,R0 ; Restore registersO20$:P MOV (SP)+,R2MQ MOV (SP)+,R1M R RETURNbS &T .SBTTL + CHEDEP - Delete I/O packetU;rV; CHEDEP - Delete packetW;O?X; This routine deletes the I/O packet whose address is in R3.*=Y; No status is returned, and if the packet is bogus, BUGCHKM(Z; will give an unfortunate indication.[; \CHEDEP::!] MOV R0,-(SP) ; Save registers^ MOV R1,-(SP)(_ MOV R2,-(SP)p`1a MOV R3,R0 ; Load packet's address for $DEPKT b CALL $DEPKT ; Dispose of itc'd MOV (SP)+,R2 ; And reload registerse MOV (SP)+,R1f MOV (SP)+,R0 g RETURN h Pi .SBTTL BUFFER MANAGEMENT1j .SBTTL + GETBUF - Allocate a buffer from cachelk;t l; Passed: m; R1 -> User's I/O packet 7m; R4 := length required in 512-byte blocks ;EDP033M*o; R5 -> UCB of request device ;**-1p; q; Returned:Mr; CC: R0 -> Available CEDs; CS: No CED availablet;(>u; Attempts to allocate space can be provided through variousv; algorithms.Dw;e.x; The first algorithm attempts to reuse free>y; space as quickly as possible, by searching the extent list<z; for "holes" of unused bufferspace. (Note that all holes>{; will be block increments.) If a search of the extent list=|; fails to find any free space, then the oldest item in the <}; extent age list will be deallocated. Another attempt to?~; allocate space will be tried. A failure at this point will %; cause the request to be bypassed.d;r GETBUF::0 CALL GETFRE ;Attempt to allocate free space! BCC 10$ ;Space found, use its. MOV APRD.BASE+H.CEDH,R0 ;Get oldest in list! BEQ 20$ ; If EQ, end-of-listc' CALL FRECED ;Deallocate the extentn. BCS 20$ ; If CS, extent is currently busy; ; Update H.TMP1 & H.TMP2;o7 CMP R0, APRD.BASE+H.TMP1 ; Freed CED before by LBN?e& BNE 4$ ; If NE, no; don't up00fffccccdate# MOV E.LPRV(R0), APRD.BASE+H.TMP1p% BR 5$ ; No need to check H.TMP2 4$:d6 CMP R0, APRD.BASE+H.TMP2 ; Freed CED after by LBN?& BNE 5$ ; If NE, no; don't update# MOV E.LNXT(R0), APRD.BASE+H.TMP2D5$:e3 CALL GETFRE ;Another attempt to get free space" BCS 20$ ;Still no space if CS10$:0 TST (PC)+ ;Return CC to indicate free space20$:. SEC ;Return CS to indicate no free space  RETURN  e4 .SBTTL + GETFRE - Allocate free space in CED list;a ; Passed:L; R1 -> User's I/O packet*; R4 := Number of 256-word blocks needed; R5 -> UCB of request deviceF;C ; Returned:?2; CS indicates either no buffer space available,2; or that a CED to describe that space cannot; be allocatedg; CC:p0; R0 -> New CED to be completed, with space; allocated.;C;R2,R3 insignificant;R4,R5 preserved;r$; To obtain the address and length:; of any free space (between allocations), the following; algorithm is used:; C; size = ADDRESSOF(ced[n+1]) - ADDRESSOF(ced[n]) - SIZEOF(ced[n]);5-; base = ADDRESSOF(ced[n]) + SIZEOF(ced[n])?; ?; Special handling is required for the first and last CEDs inC=; the list. The first one is treated as the [n+1] element,p=; with the base of the data buffer portion of the partitiona=; being the address of the [n] element (SIZEOF(n) is zero).;o<; The last element is treated as the [n] element, with the<; address of the end being the base of the data portion of-; the partition plus the size of same area.-;O7; This routine will scan the CED list for free space.e5; Free space is the unallocated portion between thef7; allocated extents. The entire list must be checkedr; in order to find it.; GETFRE:b- MOV R1,-(SP) ;Save the I/O packet addressa0 MOV APRD.BASE+H.CMDH,R0 ;Address of first CED10$: ; Assume E.BNXT = 0 for source1 MOV (R0), R1 ;Address of next physical extentf& BEQ 30$ ;End of extent list if EQ, CLR R2 ; Prepare to get byte. ;EDP033F BISB E.SIZE(R0),R2 ; Get size of extent in 512-byte blocks.;EDP033/ ASH #3,R2 ; Convert to APR bias. ;EDP033hB ADD E.PHYA(R0),R2 ;Add base for possible free space addr ;**-14 MOV E.PHYA(R1),R3 ;Get the address of the "next"0 SUB R2,R3 ;Subtract free address for length- BNE 20$ ;Free space available - check it 015$: MOV R1,R0 ;Else advance in the CED list BR 10$ ;And look for spaceQ20$: ;EDP033 ? ASH #-3,R3 ; Convert to 512-byte blocks to compare.;EDP033I7 CMP R3,R4 ; Is this free space big enough? ;EDP03333 BLO 15$ ;Too small if LO; keep searching ;**-1;E ; Context:;b; R0 -> Low CED of free space; ; R1 -> High CED of free space(; R2 := Physical address of free space; R3 := Length of free space(; R4 := Length of requested free space; R5 -> UCB of disk device;e; The following must be done:0;A); 1. A CED allocated for the new extentP3; 2. The new CED linked into the physical address 5; list, positioned between the R0-> and R1-> CEDi@; 3. The new CED placed at the end of the age list (BY CALLER)4; 4. The new CED inserted at the appropriate point"; in the LBN list (BY CALLER);s" MOV R0,R3 ;Free up R0 for use" CALL CRECED ;Create a CED now8 BCS 40$ ; If CS, none are available for use ;JRK330 ;**-1e, MOV R2,E.PHYA(R0) ;Establish our address* MOVB R4,E.SIZE(R0) ;Establish our size%; Assume E.BNXT = 0 for destinationy& MOV R0, (R3) ;Point previous to us+ MOV R3,E.BPRV(R0) ;Point us to previousw' MOV R0,E.BPRV(R1) ;Point next to usY%; Assume E.BNXT = 0 for destinationt" MOV R1, (R0) ;Point us to nextA MOV R5,E.UCB(R0) ;Plug in owning device's UCB address ;JRK330L ;**-1a% TST (PC)+ ;Return CC for successe30$:& SEC ;Indicate no space available40$: ;JRK330t" MOV (SP)+,R1 ;Restore saved R1  RETUR00ffb`TADATADATADATADATADATANa 9 .SBTTL + FRECED - Unlink and deallocate a cache extent,; ; Alternate entry: ; FREBUF - Deallocate a buffer;e ; Passed:V; R0 -> CED to be deallocatedY,; R5 -> UCB Address of device ;JRK330 ;, ; Returned:s ; CC: CED is deleted( ; CS: CED is marked for deletion later ; ; All registers preserved;T8; Prior to deallocation, the CED must be removed from:;o; 1. The age list; 2. The LBN list; 3. The address list; H; NOTE: If the extent is "busy" or "locked down" it will be marked for#; deletion during I/O completion.;B FRECED::2 BITB #EXBUSY, E.STAT(R0) ;Extent in transition?7 BNE 100$ ; If NE, yes, don't deallocate it ;JRK3303 ;**-1n .IFDF CHEDFR ;JRK330 ;JRK330oA BITB #ES.WDF,E.STAT(R0) ; Is deferred write supported ;JRK330o# BEQ 50$ ; If EQ, no ;JRK330m ;JRK330 D BITB #ES.ERR,E.STAT(R0) ; Is there an error with this CED ;JRK330# BEQ 20$ ; If EQ, no ;JRK330r+ BPT ; Yes, can't allow this ;JRK330e ;JRK330e=20$: CALL $ELDFR ; Write out this deferred extent ;JRK330n; BCS 110$ ; If space failure, don't mark delete ;JRK330 . BR 100$ ; Mark for delete later ;JRK330 ;JRK330  .ENDC ;CHEDFR ;JRK330T ;JRK330w?50$: TSTB E.PCNT(R0) ; Pending requests for extent? ;JRK330% BNE 100$ ; If NE, yes ;JRK330T ;JRK330e: MESAG$ CEDKIL,33.,,<> ;JRK330 ;JRK330, ;**-2 ,  CALL QRMAGE ; Remove from the age queue,! CALL QRMLBN ; Remove from the LBN queue)" BR FREBUF ; Proceed to deallocate it "100$: ;JRK330:" MESAG$ CEDDFR,34.,,<> ;JRK330" ;JRK330R<$ BISB #ES.DEL, E.STAT(R0) ; Mark for deletion later ;**-1$% SEC ; Indicates extent is busy%110$: ;JRK336 & RETURNJ';TQ(; This alternate entry should only be called if the CED was never inserted into); the age and LBN lists.*; +FREBUF::, MOV R1, -(SP)--. MOV E.BPRV(R0), R1 ;Point to previous CEDr5/; Assume E.BNXT = 0 for both source and destinatione50 MOV (R0), (R1) ;Point previous around to our next. 1; Assume E.BNXT = 0 for source#2 MOV (R0), R1 ;Point to next CEDE?3 MOV E.BPRV(R0),E.BPRV(R1) ;Point next around to our previousa!4 CALL DELCED ; Delete the CED 56 MOV (SP)+, R17 CLC ; Indicates successs 8 RETURNb8 .PAGE ;JRK33038 .SBTTL WRITE DEFERRED I/O OPERATIONS ;JRK330@8 .SBTTL + $ELDFR - Write data in deferred CED to disk ;JRK3308; ;JRK330L8; $ELDFR - Routine to write out specified deferred extent to disk ;JRK3308; ;JRK3308; Inputs: ;JRK330o78; R0 - CED with data to be written to disk ;JRK330B+8; R5 - UCB address of device ;JRK330p8; Outputs: ;JRK330E8; CC - I/O packet queued to driver to write data in extent ;JRK330=8; CS - No primary pool for I/O packet allocation ;JRK330O8; ;JRK3308 .IFDF CHEDFR ;JRK3308 ;JRK330o8$ELDFR:: ;JRK33028 MOV R0,-(SP) ; Save R0 across routine ;JRK33028 MOV R1,-(SP) ; Save R1 across routine ;JRK33028 MOV R2,-(SP) ; Save R2 across routine ;JRK33028 MOV R3,-(SP) ; Save R3 across routine ;JRK33028 MOV R4,-(SP) ; Save R4 across routine ;JRK33028 MOV R5,-(SP) ; Save R5 across routine ;JRK3308 ;JRK330t<8 MOV E.UCB(R0),R5 ; Get new UCB address from CED ;JRK3308 ;JRK330 :8 CALL $CRDFR ; Allocate and fill in I/O packet ;JRK33018 BCS 50$ ; If CS, allocation failure ;JRK330 8 ;JRK330tJ8 MOV KINAR5,I.IOSB+2(R1) ; Set up internal I/O completion address;JRK330+8 MOV #DFRIOC!1,I.IOSB+4(R1) ; ;JRK330M8 ;JRK3303B8 BISB #ES.WIP,E.STAT(R0) ; Indicate a write-in-progress ;JRK330C8 INCB E.PCNT(R0) ; Tie down extent to prevent going away ;JRK330 8 ;JRK330EM8 MESAG$ DFRMSG,35.,,<,> ;JRK330C8 ;JRK336t8 .IF DF CHESAN ;JRK3368 ;JRK336 98 CALL .CKSAN ; See if sanity block is correct ;JRK336K8 ;JRK336S8 .ENDC ;CHESAN ;JRK336r8 ;JRK330F98 MOV R5,-(SP) ; Save R5 across call for DUDRV ;JRK330:8 CALL $DRQRQ ; Initiate the I/O for the extent ;JRK330(8 MOV (SP)+,R5 ; Restore R5 ;JRK33038 CALL MAPPAR ; Map the cache partition ;JRK330E&8 CLC ; Indicate success ;JRK3308 ;JRK330G7850$: MOV (SP)+,R5 ; Restore the UCB address ;JRK330N08 MOV (SP)+,R4 ; Restore original R4 ;JRK33008 MOV (SP)+,R3 ; Restore original R3 ;JRK33008 MOV (SP)+,R2 ; Restore original R2 ;JRK33008 MOV (SP)+,R1 ; Restore original R1 ;JRK33008 MOV (SP)+,R0 ; Restore CED address ;JRK3308 RETURN ;JRK330 8 ;JRK3308 ;JRK330oH8 .SBTTL + $CRDFR - Create internal I/O packet for deferred CED ;JRK3308; ;JRK330Q8; $CRKPT - Routine to allocate/fill deferred write internal I/O packet ;JRK330s8; ;JRK3308; Inputs: ;JRK330 58; R0 - CED with data to written to disk ;JRK3303,8; R5 - UCB address of device ;JRK3308; Outputs: ;JRK3308; CC: ;JRK3300?8; R1 - I/O packet allocated and partially filled ;JRK330 8; CS: ;JRK330 48; Allocation failure for I/O packet ;JRK3308; ;JRK3308$CRDFR:: ;JRK33028 MOV R0,-(SP) ; Save the CED address ;JRK3308 ;JRK330i38 MOV #I.LGTH,R1 ; Get size to allocate ;JRK330008 CALL $ALOCB ; Allocate I/O packet ;JRK33018 BCS 50$ ; If CS, allocation failure ;JRK330a8; ;JRK330U8; First clear the packet and then fill in necessary data for call to driver ;JRK330t8; ;JRK33038 MOV R0,-(SP) ; Save I/O packet address ;JRK330 4810$: CLRB (R0)+ ; Clear out the packet ;JRK3308 SOB R1,10$ ; ;JRK330 98 MOV (SP)+,R1 ; Restore packet address into R1 ;JRK33038 ;JRK3303>8 MOV $LDRPT,R0 ; Take priority of ...LDR for packet ;JRK330)8 BISB T.PRI(R0),T.PRI(R1) ; ;JRK3308 ;JRK330 <8 MOV R5,I.UCB(R1) ; Put in UCB address of device ;JRK330F8 MOV #IO.WLB,I.FCN(R1) ; Make this a logical write operation ;JRK3308 ;JRK330R38 MOV (SP),R0 ; Restore the CED address ;JRK330K>8 MOV R0,I.AADA(R1) ; Keep pointer to CED in packet ;JRK3308 ;JRK330KD8 MOV E.LBNL(R0),I.PRM+P5(R1) ; Get LSP of LBN to write to ;JRK330<8 BISB E.LBNL-1(R0),I.PRM+P4(R1) ; Get MSP of LBN ;JRK3308 ;JRK330?8 MOVB E.SIZE(R0),R2 ; Get size of transfer in blocks ;JRK33008 ASH #9.,R2 ; Turn that into bytes ;JRK330@8 MOV R2,I.PRM+P2(R1) ; Put byte value into I/O packet ;JRK3308 ;JRK330 48 MOV R1,R4 ; Save address of I/O packet ;JRK33078 MOV #APR6.BASE,R2 ; Get APR6 displacement ;JRK330E?8 MOV E.PHYA(R0),R1 ; Get APR bias of start of buffer ;JRK330R@8 CALL $MPPHY ; Map to physical address if NPR device ;JRK330:8 MOV R1,I.PRM+P1.1(R4) ; Move MSP to I/O packet ;JRK330:8 MOV R2,I.PRM+P1.2(R4) ; Move LSP to I/O packet ;JRK33078 MOV R4,R1 ; Restore pointer to I/O packet ;JRK33038 ;JRK3302&8 CLC ; Indicate success ;JRK3308 ;JRK330J4850$: MOV (SP)+,R0 ; Restore CED address ;JRK3308 RETURN ;JRK33028 ;JRK330m8 ;JRK330VG8 .SBTTL + DFRIOC - I/O completion routine for deferred extent ;JRK330Y8; ;JRK330U8; DFRIOC - Routine to complete processing after a deferred extent has been ;JRK3300"8; written to disk ;JRK3308; ;JRK3308; Inputs: ;JRK330p)8; R3 - I/O packet address ;JRK330 8; ;JRK3308DFRIOC: ;JRK33098 MOV I.UCB(R3),R5 ; Get UCB address of device ;JRK330d78 MOV I.AADA(R3),R0 ; Point to affected CED ;JRK330JE8 MOVB I.PRM+P3(R3),-(SP) ; Get the error status from driver ;JRK330n48 TSTB (SP)+ ; See if t00ffb`TADATADATADATADATADATAhere was an error ;JRK330(8 BPL 10$ ; If PL, no error ;JRK330A8 BISB #ES.ERR,E.STAT(R0) ; Set the error status in CED ;JRK330 8 ;JRK330 Q810$: MESAG$ DFRCOM,29.,,<,> ;JRK33038 ;JRK330328 CALL CHEDEP ; Delete the I/O packet ;JRK3308 ;JRK330 68 CALL MAPPAR ; Map to the cache partition ;JRK330D8 BICB #ES.WIP,E.STAT(R0) ; Clear the write-in-progress bit ;JRK330G8 BICB #ES.WDF,E.STAT(R0) ; Indicate extent no longer deferred ;JRK3300>8 DECB E.PCNT(R0) ; Untie the extent for elimination ;JRK3308 ;JRK330r@8 CALL FRECED ; Delete the CED if not tied down still ;JRK3308 ;JRK330+8 RETURN ;JRK330R8 ;JRK330 8 ;JRK330L78 .SBTTL + BACKUP I/O PC FOR DEFERRED WRITES ;JRK330 8; ;JRK330S8; $BCKUP - Routine to undo the system operations involved in the creation ;JRK330iL8; of an I/O packet on the way to the driver and backup the user PC ;JRK3308; ;JRK3308; Inputs: ;JRK330 =8; R1 - I/O packet to be backed up and eliminated ;JRK330L8; ;JRK3308; Outputs: ;JRK330+8; R5 - UCB address of device ;JRK330 8; ;JRK3308$BCKUP:: ;JRK330:8 MESAG$ IOBCKP,36.,,<> ;JRK3308 ;JRK3303=8 MOV I.UCB(R1),R5 ; Get the associated UCB address ;JRK330 8 ;JRK33038 .IF DF S$$HDW ;JRK330a8 ;JRK330a38 MOV R1,R3 ; Get pointer to I/O packet ;JRK330n>8 CALL $SHFND ; Find the ML node for packet, if any ;JRK33048 BCS 10$ ; If CS, none to be eliminated ;JRK330<8 CALL $DLNK ; Get rid of ML node for this packet ;JRK3308 ;JRK330R8 .ENDC ;JRK3308 ;JRK330C8810$: MOV R1,R3 ; Restore I/O packet address ;JRK330>8 MOV I.TCB(R1),R0 ; Get TCB address of issuing task ;JRK33058 DECB T.IOC(R0) ; Decrement the I/O count ;JRK330 C8 BIC #T2.WFR,T.ST2(R0) ; Clear WFR state if EFN specified ;JRK330a98 CMP R0,$TKTCB ; Is issuing task still mapped ;JRK330k08 BNE 20$ ; If NE, no, go out to HDR ;JRK330>8 SUB #2,$UMPC ; Back up the user PC on Kernel stack ;JRK330<8 MFPI SP ; Must also back up user SP to get back ;JRK330=8 SUB #2,(SP) ; the pointer to the DPB or first ;JRK330p+8 MTPI SP ; value if $S form ;JRK330;?8 CALL $TKWSE ; Make current task wait for sig event ;JRK330c!8 BR 40$ ; Continue ;JRK330B8 ;JRK330;?820$: MOV T.PCB(R0),R2 ; Get task region pcb address ;JRK330s8 ;JRK330a8 .IF DF X$$HDR ;JRK330 8 ;JRK330 @8 MOV P.HDR(R2),-(SP) ; Get virtual address of header ;JRK330.8 BNE 30$ ; If NE, resident header ;JRK3308 ;JRK330:8 MOV P.REL(R2),KISAR6 ; Map to external header ;JRK330=8 MOV #140000,(SP) ; Set virtual address of header ;JRK330E=830$: MOV (SP)+,R2 ; Get virtual address of header ;JRK330 8 ;JRK330B!8 .IFF ; DF X$$HDR ;JRK330T8 ;JRK330s68 MOV P.HDR(R2),R2 ; Get address of header ;JRK3308 ;JRK330 "8 .ENDC ; DF X$$HDR ;JRK3308 ;JRK330 ;8 SUB #2,(R2) ; Point back to DPB or first value ;JRK330 <8 MOV H.GARD(R2),R2 ; Point to the HDR Guard word ;JRK33028 SUB #2,-16(R2) ; Back up the user PC ;JRK33088 CALL $SETCR ; Reschedule task to try again ;JRK3308 ;JRK330;8840$: TSTB I.EFN(R3) ; Virtual I/O function? ;JRK330"8 BPL 60$ ; If PL no ;JRK33068 BICB #200,I.EFN(R3) ; Clear virtual flag ;JRK330;8 BIT #1,I.LN2(R3) ; Header locked down for acp? ;JRK330D#8 BNE 50$ ; If NE, no ;JRK330JA8 MOV I.TCB(R3),R0 ; I/O packet is connected to the TCB ;JRK330 >8 MOV T.ATT(R0),R0 ; The TCB is connected to the ADB ;JRK330-8 SUB #A.TCBL,R0 ; Find the foot ;JRK3303.8 CALL $DECIO ; Unlock the header ;JRK330&850$: ; Reference label ;JRK33088 CALL $DCWIO ; Decrement window I/O if any, ;JRK330&8 ; unlock block locks. ;JRK330D00fffcccc860$: MOVB I.EFN(R3),R0 ; Get EFN number specified, if any ;JRK330A8 MOV I.TCB(R3),R5 ; Get TCB address for EFN conversion ;JRK330 =8 CALL $CEFI ; Set the bit and clear group globals ;JRK330 A8; CALL $ELGBL ; Unlock the group globals if necessary ;JRK330B8 ;JRK330C58 CALL $DECAL ; Deallocate all I/O counts ;JRK330U58 CALL CHEDEP ; Deallocate the I/O packet ;JRK330l8 RETURN ;JRK330 8 ;JRK330/8 .ENDC ;CHEDFR ;JRK330c9 c+: .SBTTL STRUCTURE ALLOCATION/DEALLOCATION %; .SBTTL + CRECED - Create CED block3<; =; Passed:) >; NothingB?;e @; Returned:eA; R0 -> Newly allocated CED B; CCRECED: MOV R1,-(SP)D)E MOV #E.LGTH,R1 ; Set size to allocatee3F CALL .ALOCB ; Call internal allocation routineKGH MOV (SP)+,R1 I RETURNtJ%K .SBTTL + DELCED - Delete CED block L;a M; Passed:/#N; R0 -> The CED to be deallocated O;3 P; Returned: Q; All registers preserved R;JSDELCED: MOV R1,-(SP)T+U MOV #E.LGTH,R1 ; Set size to deallocateR5V CALL .DEACB ; Call internal deallocation routinenWX MOV (SP)+,R1d Y RETURN-Z l@[ .SBTTL + CREATT - Create a packet attachment descriptor (PAD)\;; ]; Passed:a ^; NothingC_;A `; Returns:a; R0 -> Newly allocated PADb;M$bCREATT::MOV R1,-(SP) ;JRK330d ;**-1 *e MOV #A.LGTH,R1 ;Set length to allocate#f CALL .ALOCB ;Request the spaceegh MOV (SP)+,R1i i RETURNrj5k .SBTTL + .DEPAD - Deallocate attachment descriptor;l;s m; Passed::n; R3 -> PAD to deallocate (must already be disconnected)o;p; Returned:q; All registers preserved r;A s.DEPAD::t MOV R0, -(SP)u MOV R1, -(SP)v w MOV R3, R0a4x MOV #A.LGTH, R1 ;Length of attachment descriptor#y CALL .DEACB ;Release the block-z{ MOV (SP)+, R1| MOV (SP)+, R0 } RETURNG~ $ .SBTTL MEMORY ALLOCATION ROUTINES, .SBTTL + .ALOCB - Internal hook to $ALOCB;R ; Passed:; R1 := Requested size;t ; Returned:p6; R1 := Size rounded up according to blocking factor+; If CC then successfully allocated blockr ; R0 -> Newly allocated block"; If CS then no memory available;M>; This routine will allocate memory from the cache partition?; using the system memory allocation routine $ALOCB in CORAL.B; Entry point $ALOC1 is called with the internal header address.;L.ALOCB: MOV R2,-(SP)= MOV #APRD.BASE+H.PAVL,R0 ; R0 -> Internal pool list header:1 CALL $ALOC1 ; Attempt to allocate the memoryi MOV (SP)+,R2n  RETURNn, .SBTTL + .DEACB - Internal hook to $DEACB; ; Passed:w!; R0 -> Block to be deallocatedn; R1 := Length of block;s ; Returned:l; All registers preservedp;i?; This routine will deallocate memory in the cache partition,LA; or into system pool depending upon the address. This enabless>; the cacher to allocate space from primary pool in cases of+; extreme emergency (not currently used). ;1.DEACB: MOV R0,-(SP) MOV R2,-(SP) MOV R3,-(SP)2 CMP R0,#APR5.BASE ; System pool or cache pool?  BLO 10$ ; System pool if LO= MOV #APRD.BASE+H.PAVL,R3 ; R3 -> Internal pool list headere3 CALL $DEAC1 ; Attempt to deallocate the memorys BR 20$ ; Go to common exitn10$:/ CALL $DEACB ; Deallocate it to system pool 20$: MOV (SP)+,R3n MOV (SP)+,R2a MOV (SP)+,R0s  RETURNr/ .SBTTL EBLXIO -- BLXIO Extension ;EDP033r; ;EDP033J; This routine performs the same operation as $BLXIO, except it ;EDP033M; extends the amount that may be transferred from under 4K bytes to ;EDP033G; 65535 bytes. Forks are performed between calls to $BLXIO. ;EDP033A; ;EDP033; ;EDP033; Input: ;EDP033; ;EDP0333; R0 number of bytes to be transferred ;EDP033V/; R1 starting APR bias for source ;EDP033G; R2 starting offset for source (must be less than 100 octal) ;EDP033 3; R3 startin00ffb`TADATADATADATADATADATAg APR bias for destination ;EDP033iL; R4 starting offset for destination (must be less than 100 octal) ;EDP033E; On a multiprocessor system, we have the executive lock. ;EDP033e; ;EDP033; ;EDP033; Output: ;EDP033;; ;EDP033 ; R0-R4 altered ;EDP033; R5 preserved ;EDP033; ;EDP033? .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033n8FRKSIZ = 14 ; Yes, fork block is six words. ;EDP033 .IFF ;EDP033s8FRKSIZ = 12 ; No, fork block is five words. ;EDP033 .ENDC ;EDP0335 .IFDF K$$DAS ; Are we using data space? ;EDP033 >REGSIZ = 4 ; The cache region APRs take two words. ;EDP033 .IFF ;EDP033u=REGSIZ = 2 ; The cache region APR takes one word. ;EDP033  .ENDC ;EDP033EBLXIO:: ;EDP033? .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033uA ULOCK$ $EXECL,WAIT ; Yes, release the executive lock. ;EDP033D .ENDC ;EDP033+ MOV R5,-(SP) ; Save register. ;EDP033e/ CLR R5 ; Flag no block allocated. ;EDP033F ;EDP033u8 MOV R0,-(SP) ; Save count of bytes to move. ;EDP033@ MOV #MAXTR,R0 ; Get maximum size of single transfer. ;EDP033< SUB R0,(SP) ; Subtract bytes to be transferred. ;EDP0336 BCC 210$ ; There are enough; do transfer. ;EDP033@ ADD (SP),R0 ; The maximum is too much, adjust size. ;EDP0331 CLR (SP) ; Zero bytes will be left. ;EDP033 210$: ;EDP033+ CALL $BLXIO ; Transfer data. ;EDP033 ' TST (SP) ; Are we done? ;EDP033o& BEQ 255$ ; Yes, leave. ;EDP033 ;EDP033v: MOV KISAR6,-(SP) ; Save APR for cache region. ;EDP0335 .IFDF K$$DAS ; Are we using data space? ;EDP033)@ MOV KISAR5,-(SP) ; Save second APR for cache region. ;EDP033 .ENDC ;EDP033+ MOV R4,-(SP) ; Save register. ;EDP033 + MOV R3,-(SP) ; Save register. ;EDP033 + MOV R2,-(SP) ; Save register. ;EDP033 + MOV R1,-(SP) ; Save register. ;EDP033 F MOV #$STACK-22+FRKSIZ,R1 ; Get location where we want SP to ;EDP033/ ; be, plus space for fork block. ;EDP0338 SUB SP,R1 ; Figure size of block needed for ;EDP0332 ; for fork block plus everything on ;EDP0332 ; the stack below the task context. ;EDP033? .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033S? LOCK$ $EXECL,WAIT ; Yes, obtain the executive lock. ;EDP033P .ENDC ;EDP0335 CALL $ALOCB ; Get space for fork block. ;EDP033t0 BCC 215$ ; There is space; use it. ;EDP033? .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033 A ULOCK$ $EXECL,WAIT ; Yes, release the executive lock. ;EDP033f .ENDC ;EDP033. MOV (SP)+,R1 ; Restore register. ;EDP033. MOV (SP)+,R2 ; Restore register. ;EDP033. MOV (SP)+,R3 ; Restore register. ;EDP033. MOV (SP)+,R4 ; Restore register. ;EDP0335 .IFDF K$$DAS ; Are we using data space? ;EDP033< CMP (SP)+,(SP)+ ; We don't need the saved APRs. ;EDP033 .IFF ;EDP033 6 TST (SP)+ ; We don't need the saved APR. ;EDP033 .ENDC ;EDP0330 BR 240$ ; Go do the next transfer. ;EDP033215$: ;EDP033) MOV R0,R4 ; Copy pointer. ;EDP033o3217$: ; Copy stack to fork block and ;EDP033g/ ; adjust R4 for input to $QFORK. ;EDP033s< MOV (SP)+,(R4)+ ; Copy stack word to fork block. ;EDP0336 CMP SP,#$STACK-22 ; Is stack copied yet? ;EDP033) BNE 217$ ; No, keep going. ;EDP033a? .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033 6 CLR (R4)+ ; We can run on any processor. ;EDP033 .ENDC ;EDP033A MOV #237$,2(R4) ; Record PC to be restored by system. ;EDP0334> MOV R4,4(R4) ; Record R5 to be restored by system. ;EDP033> MOV R0,6(R4) ; Record R4 to be restored by system. ;EDP033D MOV KINAR5,10(R4) ; Record APR to be restored by system. ;EDP033% BR 230$ ; Go do fork. ;EDP033  ;EDP033E7220$: ; Come back after 00fffccccanother transfer. ;EDP033 / TST R5 ; Do we have a fork block? ;EDP033C5 BEQ 240$ ; No, go do the next transfer. ;EDP033.8 MOV 6(R5),R0 ; Point to beginning of block. ;EDP033- MOV R1,(R0)+ ; Record register. ;EDP033 - MOV R2,(R0)+ ; Record register. ;EDP033- MOV R3,(R0)+ ; Record register. ;EDP033s- MOV R4,(R0)+ ; Record register. ;EDP033AB MOV (SP)+,REGSIZ(R0) ; Record remaining length (it goes ;EDP033/ ; above the saved APR or APRs). ;EDP033e4 MOV R5,R4 ; Pass fork block to $QFORK. ;EDP033? .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033 ? LOCK$ $EXECL,WAIT ; Yes, obtain the executive lock. ;EDP033f .ENDC ;EDP033230$: ;EDP0334 CLR (R4) ; We'll be last in the queue. ;EDP033# JMP $QFORK ; Fork. ;EDP033i9237$: ; This label is where the system will ;EDP033P ; return to. ;EDP033? .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033dA ULOCK$ $EXECL,WAIT ; Yes, release the executive lock. ;EDP033K .ENDC ;EDP0335 MOV R4,R0 ; Switch to another register. ;EDP033L. MOV (R0)+,R1 ; Restore register. ;EDP033. MOV (R0)+,R2 ; Restore register. ;EDP033. MOV (R0)+,R3 ; Restore register. ;EDP033. MOV (R0)+,R4 ; Restore register. ;EDP0335 .IFDF K$$DAS ; Are we using data space? ;EDP033t9 MOV (R0)+,KISAR5 ; Restore cache region APR. ;EDP033M .ENDC ;EDP0339 MOV (R0)+,KISAR6 ; Restore cache region APR. ;EDP033 8 MOV (R0)+,-(SP) ; Restore length remaining. ;EDP033 ;EDP033;,240$: ; Do another transfer. ;EDP033@ MOV #MAXTR,R0 ; Get maximum size of single transfer. ;EDP033: SUB R0,R4 ; Decrease pointer by maximum size. ;EDP033; ADD #MAXTRB,R3 ; Increase APR by maximum size. ;EDP033: SUB R0,R2 ; Decrease pointer by maximum size. ;EDP033; ADD #MAXTRB,R1 ; Increase APR by maximum size. ;EDP033C< SUB R0,(SP) ; Subtract bytes to be transferred. ;EDP0336 BCC 250$ ; There are enough; do transfer. ;EDP033@ ADD (SP),R0 ; The maximum is too much, adjust size. ;EDP0331 CLR (SP) ; Zero bytes will be left. ;EDP033 250$: ;EDP033+ CALL $BLXIO ; Transfer data. ;EDP033m' TST (SP) ; Are we done? ;EDP033;9 BNE 220$ ; No, do another fork and transfer. ;EDP033D ;EDP033x255$: ;EDP033< TST (SP)+ ; Get count (now zero) off the stack. ;EDP033? .IFDF M$$PRO ; Is multiprocessor support required? ;EDP0330? LOCK$ $EXECL,WAIT ; Yes, obtain the executive lock. ;EDP033T .ENDC ;EDP0334 TST R5 ; Did we allocate a fork block? ;EDP033/ BEQ 290$ ; No, skip deallocation. ;EDP033L= MOV 6(R5),R0 ; Get beginning of block for $DEACB. ;EDP033d) MOV R5,R4 ; Copy pointer. ;EDP033o4 ADD #12,R5 ; Point after end of block. ;EDP033< SUB R0,R5 ; Compute length of block for $DEACB. ;EDP033( MOV R5,R1 ; Copy length. ;EDP033E SUB #12+REGSIZ+FRKSIZ,R5 ; Subtract size of fork block and ;EDP033T- ; values not needed on stack. ;EDP033) ASR R5 ; Convert to words. ;EDP033e? .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033c4 TST -(R4) ; Move past Unibus run mask. ;EDP033 .ENDC ;EDP033260$: ;EDP033= MOV -(R4),-(SP) ; Copy saved value back to stack. ;EDP033 1 SOB R5,260$ ; Continue until done. ;EDP033f ;EDP033+ CALL $DEACB ; Release space. ;EDP033B ;EDP033 290$: ;EDP033. MOV (SP)+,R5 ; Restore register. ;EDP033 ;EDP033A RETURN ;EDP033  ;EDP033M .PAGE ;JRK330 .IFDF CHEDBG ;JRK3307 .SBTTL *** DEBUG *** Module contains data ;JRK330N ;JRK330GDFRMSG: .ASCIZ <15><12>" - Deferred extent written to disk" ;JRK330aPIOBCKP: .ASCIZ <15><12>" - I/O Operation reissued via user PC backup" ;JRK330HCEDKIL: .ASCIZ <15><12>" - CED eliminated from Cache Region" ;JRK330@CEDDFR: .ASCIZ <15><00fffffffDATA12>" - CED marked for deletion" ;JRK330IDFRCOM: .ASCIZ <15><12>"Deferred extent I/O write completion" ;JRK3303 ;JRK330;! .ENDC ;DF CHEDBG ;JRK3303 .ENDC ; D$$CHEE .ENDodule contains data ;JRK330N ;JRK330GDFRMSG: .ASCIZ <15><12>" - Deferred extent written to disk" ;JRK330aPIOBCKP: .ASCIZ <15><12>" - I/O Operation reissued via user PC backup" ;JRK330HCEDKIL: .ASCIZ <15><12>" - CED eliminated from Cache Region" ;JRK330@CEDDFR: .ASCIZ <15><&KADD2,LI:[45,34]KADD2/-SP=[45,10]KADD2&KRATE,LI:[45,34]KRATE/-SP=[45,10]KRATE:[1,54]KCOM/-HD/PI/MM,[1,54]KCOM/-SP,[1,54]KCOM=[45,24]KCOM[1,54]RSX11M.STB/SSC[1,1]EXELIB/LB/MSTACK=0#PAR=KCOM:0:20000/.ENDC .LIST;AD11-K A/D CONVERTER SUPPORTCA$$M11=0 ;AM11-K SUPPORT N$DR11=1 ;DR11-K SUPPORTR N$AA11=1 ;AA11-K D/A CONVERTERS)N$$SWB=5 ;NUMBER OF SWEEP CONTROL BLOCKS ; C; MACRO TO DEFINE JUMP TO SUBROUTINE WITH RETURN TO CALLER'S CALLERS;B .MACRO CALLR ARGK JMP ARG .ENDM;P3; MACROS TO REFERENCE PSW FOR NON-LSI-11 PROCESSORS$;F .IF NDF L$$SI1E .MA .ENABLE QUIET .IF EQ "MCR" SET /DCL=TI: .DISABLE QUIETE2 .IF NE "[USER]" SET DEFAULT [USER]/NAMED .ENABLE QUIET TYPE HELLO.TXT$JOB HIYA [200/1] $MACRO HIYA $LINK HIYA $RUN HIYA$DATA WILLIE NELSON$EOD,$! COMMENT: HIYA ASSEMBLED, LINKED, AND RUN $RUN HIYABASIL WOLVERTON/$! COMMENT: HIYA RUN AGAIN WITH DIFFERENT DATA$EOJ DELETE DOCTOR.FEL;* DELETE NEW.FIL;* DELETE *.OBJ;* DELETE *.TSK;* DELETE NEWHI.MAC;* .ENABLE SUBSTITUTION .IFNDF .GOTO MCRSYS .SETS STCLI .IF EQ "DCL" SET TERM MCR.MCRSYS: .TESTFILE CLOCK.MAC .IF EQ 1 .GOTO OKAY ;F ; You must have the file "CLOCK.MAC" in your directory before you canG ; use this procedure. There should be a copy of the file available in? ; the directory containing this file. See your system manager ; /.OKAY: .OPEN CLKPRE.MAC .DATA .ENABL LC ;D ; This procedure allows you to assemble and build a version of the G ; VT-52/VT100 clock display program "CLOCK" that suits your taste and < ; your system.  ; MG ; Before you continue with this procedure, be sure that your VT100 (if;H ; you have one) is set to VT52 compatability mode. If you have a VT52, ; you''re all set.h ;A ; "CLOCK" displays the time in large block numbers 10 charactersnH ; high. The character normally used to make up the numerals is a solidK ; block (the graphic-mode equivalent of "a"). On some terminals, however,iF ; this char00gggccccacter may not display as a solid block; or, you may prefer ; something else. ; .SETS TEMP "FORCHR = ''"B .SETS REGCHR "a"w; .ASK A Do you want to change the default display character  .IFF A .GOTO DEFCHR ;A ; Here is your selection. You can choose any character, but theLB ; lowercase characters translate to their graphic equivalents, as? ; shown below (the default is "a"; enter to preserve it).d ;# ;; abcdefghijklmnopqrstuvwxyz{|}`~f' ;F; abcdefghijklmnopqrstuvwxyz{|}`~Gt ;;GrB .ASKS[0:1] CHAR What symbol do you want as the display character? .IF EQ 0 .GOTO DEFCHRH .DATA 'TEMP''CHAR'H .GOTO POSTON .DEFCHR: .DATA 'TEMP''REGCHR' .POSTON: .DATA .DSABL LCG ;M ; The display is normally centered horizontally on the screen, near (but not. ; at) the top. You can change this position. ;E .ASK A Do you want to change the position of the clock on the screenr .IFF A .GOTO DEFPOS ;D .ASKS VPOS How many lines down from the top (Range 1-8, Default 3)?# .IF EQ 0 .DATA INITY = 3. ( .IF GT 0 .DATA INITY = 'VPOS'. ;E .ASKS HPOS How many lines in from the left (Range 1-35, Default 11)?$ .IF EQ 0 .DATA INITX = 11.( .IF GT 0 .DATA INITX = 'HPOS'. .GOTO SYSTEMo.DEFPOS: .DATA INITX = 11. .DATA INITY = 3.t.SYSTEM: ;M ; The following section includes or excludes some system-dependent functions  ; of the clock. ;@ .ASK OLDM Is your system an RSX-11M V3.2 (or older), or VAX/VMS .IFF OLDM .GOTO NEWSYS3.NOS .TITLE DUDRV - MSCP DRIVERb;r;o;n>; COPYRIGHT (c) 1985, 1987 BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;n>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;a ;eL ; THIS DEFINES THE SYMBOL NEEDED TO DO CONDITIOANL ASSEMBLY OF DISK CLASS D ; DRIVERS. IF THE SYMBOL IS DEFINED, THEN DISK CLASS IS SELECTED. ;t ;  ;0 ; MODIFIED BY: ; G. MARIGOWDA= ; GMG101 ADD SYMBOLS NEEDED FOR FORMATTING SUPPORT V1.1 ; ;'D$$DSK=0 ;ASSEMBLE DISK CLASS ITEMSC;0; FUNCTION LENGTHS FOR DISK SPECIFIC FUNCTIONS;I.RD.L = 20 ;# WORDS TO ALLOCATE FOR RD CMD.WR.L = 20 ;# WORDS TO ALLOCATE FOR WR CMD0RPL.L = 20 ;# WORDS TO ALLOCATE FOR RPL CMD/FMT.L = 20 ;#WORDS TO ALLOCATE FOR FMT CMDR;F'M.SWL = 100 ;SOFTWARE WRITE LOCKEDS SELECTED. ;t ;  ;0 ; MODIFIED BY: ; G. MARIGOWDA= ; GMG101 ADD SYM .TITLE MUDRV - TMSCP DRIVER/ .SBTTL TAPEPRE - TMSCP PREFIX FILE DEFINITIONSE;N;F;P6; COPYRIGHT (c) 1985 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;5<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;I"; LENGTHS OF TMSCP COMMAND PACKETS;E/RD.L = 14. ;# WORDS TO ALLOCATE FOR RD CMDN/WR.L = 14. ;# WORDS TO ALLOCATE FOR WR CMDE.WTM.L = 6. ;# WORDS TO ALLOCATE FOR WTM CMD.ERS.L = 6. ;# WORDS TO ALLOCATE FOR ERS CMD.ERG.L = 6. ;# WORDS TO ALLOCATE FOR ERG CMD/REP.L = 10. ;# WORDS TO ALLOCATE FOR REP CMDQ/SUC.L = 18. ;# WORDS TO ALLOCATE FOR SUC CMD.AVL.L = 6. ;# WORDS TO ALLOCATE FOR AVL CMD/ONL.L = 22. ;# WORDS TO ALLOCATE FOR ONL CMD T$$APE = 1 ;ASSEMBLE FOR TAPE; 4; BIT DEFINITIONS FOR UCB CHARACTERISTICS WORD U.CW2;A'M.PEOV=100000 ;TAPE PAST LOGICAL EOVO$M.AEOV=40000 ;TAPE AT LOGICAL EOVM.BOT=20000 ;TAPE IS AT BOT.M.1600=4000 ;UNIT IS 1600 BPI PHASE ENCODED$M.HWL=2000 ;HARDWARE WRITE-LOCKED M.RWD=1000 ;UNIT IS REWINDING&M.SER=400 ;SELECT ERROR HAS OCCURED#M.IWR=200 ;INHIBIT WRITE RETRIES #M.SWL=100 ;SOFTWARE WRITE-LOCKEDA2M.TMK=40 ;ENCOUNTERED TAPE MARK - FWD DIRECTION1M.EOT=20 ;LAST COMMAND ENCOUNTERED END OF TAPEM.6250=10 ;UNIT IS 6250 BPICM.DEFM = M.PEOV!M.EOT!M.HWL!M.SWL!M.1600!M.6250!M.SER ;DEFAULT MASK6USRBTS = M.IWR!M.SWL ;STATUS BITS CONTROLLED BY USER IS AT BOT.M.1600=4000 ;UNIT I00IgffffffDATA .TITLE DCRUN - Run the cache) .IF DF D$$CHE .IDENT /01.01/C;R8; Copyright (c) 1985 by DIGITAL EQUIPMENT CORPORATION.; All rights reserved.;V; Original author: ; John Gemignani ;T ; Modified by: ;V ; D. P. Rabahy 06-Mar-85 01.01:; Change CALLRs into straight CALLs followed by RETURNs;Q; This module contains the code which dequeues a cache packet and dispatches itO(; to the appropriate phase II routine.;, .PSECT DC$RUN,RO,IR . .SBTTL DCRUN - Start Phase II Cache Process;D ; Passed:."; Cache partition mapped in APR6;9-; R5 -> UCB of device to run the cache for.i;r ; Returned:;r>; This routine is used to start up a Phase II cache process.'; RETURNing to our caller will do theC< ; proper thing. Our caller is of no concern to us; we are@!; "the system" (or hope that we are) when we reach this point.";t<#; Module DCRUN is responsible for obtaining a unit of work=$; from the packet queue and, depending upon the dispositione:%; bits, either start the I/O, dispatch it to the driver,&; or terminate it in error.v';o=(; If an internal I/O has resulted in an error, then routinei<); DCIOC will have set CD.ERR in P3. These packets must be<*; handled differently for reads and writes. They are also,+; forwarded to the driver upon completion.,;h>-; All function codes must be dispatched, similar to the code .; which can be found in DCDSP./;o*0; This code will execute a fork prior to91; entering the Phase II selection and dispatching code. 92; This is performed to allow any outstanding fork-level53; processes to execute prior to or between Phase IIt94; runs. If the fork list is empty, then control passespH5; immediately to the dispatching code. Also, if there is insufficient66; system pool for a fork block to be allocated, then57; it will execute immediately as well. It is hopedh28; that should system pool be exhausted, that the69; completion of a cache-retained I/O packet (and its6:; subsuquent deallocation) may aid in relieving this;; situtation.w<;o =DCRUN::f8> BITB #CS.RUN, APRD.BASE+H.CSTS ; Is phase II running?? BNE FORK ; If NE, yeso@>A BITB #CS.REQ, APRD.BASE+H.CSTS ; Requested to run phase II?B BNE 3$ ; If NE, yese C RETURNcD3$:@E BISB #CS.RUN, APRD.BASE+H.CSTS ; Indicate phase II is runningF9GFORK: MOV #<6.*2>,R1 ;Attempt to allocate a fork blockt"H CALL $ALOCB ;From system pool0I BCS 10$ ;If CS, MAJOR PROBLEM: resume cacheJ; K; Context:$L; R0 -> Newly allocated pool blockM;i-N CLR (R0) ;URM=0; any processor can do itA*O ADD #14,R0 ;Advance past 6-word block3P MOV KINAR5,-(R0) ;Establish the mapping contextA6Q CLR -(R0) ;R4 is trash as far as we are concerned(R MOV R0,R4 ;Setup for call to $FORK14S CALL $FORK1 ;Queue the fork block and hibernateT; U; Context:V; R3 -> Fork block W; R5 -> UCB X;t,Y MOV R3,R0 ;Obtain base address of block(Z SUB #4,R0 ;(currently at PC offset)[)\ MOV #<6.*2>,R1 ;Setup fork block sizeo(] CALL $DEACB ;Free up the fork block^10$:_; `; Start Phase II Cache Processa;-+bNOFORK: CALL MAPPAR ; Map the partitionhc5d MOV #APRD.BASE+H.PKTQ,R0 ; Address of packet queueee6f10$: MOV (R0),R1 ; Get a packet - Assume I.LNK = 0"g BEQ 70$ ; If EQ, end of queueh-i TSTB I.PRM+P3(R1) ; Is this packet ready?bj BEQ 20$ ; Yes if EQk,l MOV R1,R0 ; Else try to get another onem BR 10$ ; from the queuen2o20$: MOV (R1),(R0) ; Remove this from the queue$p BNE 30$ ; Not last packet if NE9q MOV R0,APRD.BASE+H.PKTQ+2 ; Else update "last" pointerr30$:s;L t; Note: Bu; Packets with a driver error indicated are not terminated here.8v; Instead, they are passed to the appropriate phase II$w; routines for further processing.x;q/y MOV I.FCN(R1),R0 ;Get the I/O function coder*z BIC #BYPASS,R0 ;Remove the bypass bits{'| CMP R0,#IO.RVB ;Read virtual block? -} B00IgJgKgccccEQ 80$ ;Yes if EQ; RVB and RLB are same)~! CMP R0,#IO.LOV ;Load overlay?3! BEQ 80$ ;Yes if EQ; dispatchV( CMP R0,#IO.WVB ;Write virtual block?. BEQ 100$ ;Yes if EQ; WVB and WLB are same) CMP R0,#IO.LDO ;Load d-space overlay?h! BEQ 80$ ;Yes if EQ; dispatcht' CMP R0,#IO.RLB ;Read logical block?f! BEQ 80$ ;Yes if EQ; dispatchF( CMP R0,#IO.WLB ;Write logical block?" BEQ 100$ ;Yes if EQ; dispatch MESAG$ FCNERR,0 BPT ; Sanity checkF70$: BICB #CS.RUN, APRD.BASE+H.CSTS ; Indicate that we have quiesced* RETURN ; And return for exec to run*80$: CALL $DCRII ;Invoke read Phase II RETURN ,100$: CALL $DCWII ;Invoke write Phase II RETURNo s .IF DF CHEDBG, .SBTTL *** DEBUG *** Module contains data .ENABL LCHFCNERR: .ASCIZ <15><12>"DCM (CRASH) -- Phase II Dispatching Error"<15> .EVEN .ENDC ; .IF DF CHEDEF .ENDC ; .IF DF D$$CHE .ENDG$ FCNERR,0 BPT ; Sanity check .TITLE DCSTAT .IF DF D$$CHE .IDENT /01.00/A;Z6; Copyright (c) 1985 by DIGITAL EQUIPMENT CORPORATION.; All rights reserved.;H; Original author:; D. P. Rabahy 06-Mar-85 01.00;C .PSECT CODE, I, ROt . .SBTTL $USTAT - Update cache statistics block;, ; Passed:H"; SP+2 -> Offset to be incremented9; SP+4 -> Operation context (i.e. address in stat. block)D ; R5 -> UCBe;a ; Returned:R; All registers preserved ;I ; Action: ;s$USTAT::' MOV KISAR6, -(SP) ; Save APR6 mappingU/ MOV U.UCBX(R5), KISAR6 ; Map the UCB extension3 BEQ 10$ ; If EQ, there isn't one, skip incrementT9 MOV APR6.BASE+X.CSBA, KISAR6 ; Map the statistics buffer $ BEQ 10$ ; If EQ, there isn't one7 MOV R0, -(SP) ; Save a register while working with ito;L; Calculate the offset to be incremented. Don't forget about the stuff just; pushed onto the stack.;k MOV 6(SP), R0 ; Get the offset% ADD 10(SP), R0 ; Add in the contexti. ADD #1, (R0)+ ; Update the appropriate field ADC (R0) ; Double words MOV (SP)+, R010$: MOV (SP)+, KISAR6 RETURN  .ENDC ; IF DF D$$CHE  .ENDntT9 MOV APR6.BASE+X.CSBA, KISAR6 ; Map the statistics buffer $ BEQ 10$ ; If EQ, there isn't one7 MOV R0, -(SP) ; Save a register while working with ito;L; Calculate the offset to be incremented. Don't forget about the stuff just; pushed onto the stack.;k MOV 6(SP), R0 ; Get the offset% ADD 10(SP), R0 ; Add in the contexti. ADD #1, (R0)+ ; Update the appropriate field ADC (R0 .TITLE MMDRV .IDENT /09.01/  .ENABLE LCD;R7; Copyright (C) 1986 by Digital Equipment CorporationP; All Rights Reserved.;I> ; This Software is Furnished Under a License And May Be Used@ ; or Copied Only in Accordance With the Terms of Such License. ;I ;D ; RSX11M-PLUS RH11/RH70 TM02/TM03 Magnetic Tape Controller Driver;R; Version 09.01;;; Modified By:;@; CS005 -- Handle CALL for Controller Power Fail (C bit set).;N;I;C !.PAGEM"; Macro Library Calls#;N$G%.MCALL ABODF$, HWDDF$, PKTDF$, UCBDF$, UMDIO$, KRBDF$, SCBDF$, QIOSY$&' ABODF$ ;Define Abort Codesh&( HWDDF$ ;Define Hardware Registers&) PKTDF$ ;Define I/O Packet Offsets* UCBDF$ ;Define UCB Offsets 4+ UMDIO$ ;Define User Mode Diagnostic Definitions(, KRBDF$ ;Define KRB and KRB1 Offsets- SCBDF$ ;Define SCB Offsets,. QIOSY$ ;Define QIO Functions and Errors/0;o1; Equated SymbolsC2;s34US.ABO=1 ;Abort Request,%5US.SUP=2 ;Supress Error Recovery,06US.PWF=10 ;Power Fail Indication - in U.STS.07RETRY=12 ;Retry Count - 10. retries/request.48MINREC=14. ;Write Request - Minimum Record Size.+9REV=2 ;Reverse Bit - Space Operations.F5:NOISE=MINREC ;Anything Smaller than this is Noise ;.PAGEc#<; Register Definition and Offsets =;R>.?RHCS1 = +0 ;RH Control and Status Register@GO= 1 ;Go BitiAIE= 100 ;Interrupt Enablea#BRDY= 200 ;RH Controller Ready;00KgffffffDATACPSL= 2000 ;Port select; DDVA= 4000 ;Device AvailableETRE= 40000 ;Transfer Error+FCPE= 20000 ;RH Control Bus Parity Errorr$GSC= 100000 ;Special ConditionHI;I/O CommandsdJ'KFC.RWU= 103 ;Rewind Unload/Off-LinetLFC.RWD= 107 ;Rewind;MFC.RLS= 113 ;Release DriveNFC.ERS= 125 ;Erase 3" Gapf&OFC.WEF= 127 ;Write EOF (tape mark)PFC.SPF= 131 ;Space ForwardQFC.SPR= 133 ;Space ReverseRFC.WRT= 161 ;WriteSFC.RED= 171 ;Read TFC.REV= 177 ;Read Reverse UFC.CLR= 11 ;Drive ClearV%WRHWC = +2 ;RH Word Count Registerr&XRHBA = +4 ;RH Bus Address Register-YMTFC = +6 ;TM02/TM03 Frame Count RegisterCZ1[RHCS2 = +10 ;RH Control and Status Register 2w%\SCLR= 40 ;RH Controller ClearR*]DPE= 400 ;MASSBUS Data Parity Error ^MXF= 1000 ;Missed Transfer_PGE= 2000 ;Program Error$`NEM= 4000 ;Non-existent Memory#aNED= 10000 ;Non-existent Drive $bUPE= 20000 ;Unibus Parity Error"cWCE= 40000 ;Write Check ErrordDLT= 100000 ;Data Latee@fCS2ERR= DLT! WCE! UPE! NED! NEM! PGE! MXF! DPE ;RH TRE Errorsgh/iMTDS = +12 ;TM02/TM03 Drive Status Register jSLA= 1 ;Slave Attention"kBOT= 2 ;Beginning of Tape"lTM= 4 ;Tape Mark Detected%mPES= 40 ;Phase Encoded Status $nSSC= 100 ;Slave Status ChangeoDRY= 200 ;Drive ReadypEOT= 2000 ;End of TapeqWRL= 4000 ;Write LockrrMOL= 10000 ;Medium On Linei(sPIP= 20000 ;Positioning in Progress"tERR= 40000 ;Error - Compositeu(vMTER = +14 ;TM02/TM03 Error Register!wILF= 1 ;Illegal FunctionT!xILR= 2 ;Illegal RegisterR.yRMR= 4 ;Register Modification Refused)zCPR= 10 ;Control Bus Parity Error4{FMT= 20 ;Format Error "|DPR= 40 ;Data Parity Error-}INC= 100 ;Incorrectable Data - PE Mode /~VPE=INC ;Vertical Parity Error - NRZI ModeR'PEF= 200 ;Format Error - PE Mode $LRC=PEF ;LRCC Error - NRZI Mode!NSG= 400 ;Non-standard Gap "FCE= 1000 ;Frame Count Error*CS= 2000 ;Correctable Skew - PE Mode*ITM=CS ;Illegal Tape Mark - NRZI Mode(NEF= 4000 ;Non-executable Function#DTE= 10000 ;Drive Timing Error %OPI= 20000 ;Operation Incomplete2UNS= 40000 ;Drive Unsafe4.COR= 100000 ;Correctable Data - PE Mode#CRC=COR ;CRC Error - NRZI Mode;+DAT= CS! PEF! INC ;Data Detection errors -RHAS = +16 ;RH Attention Summary RegisterN4MTCK = +20 ;TM02/TM03 CRC or Dead Track Register%MTDB = +22 ;TM02/TM03 Data Buffer0.MTMR = +24 ;TM02/TM03 Maintenance Register-MTDT = +26 ;TM02/TM03 Drive Type Registern'MTSN = +30 ;TM02/TM03 Serial Numberi/MTTC = +32 ;TM02/TM03 Tape Control RegistertTC.1600= 2000 ;1600 BPITC.800= 1000 ;800 BPIrATC.FMT= 300 ;Formatting Mode - PDP-11 normal assy/dissassyTC.EVN= 10 ;Even Parityn.PAGEF; The following define bits in the Tape Characteristic Word (U.CW2).3M.PEOV= 100000 ;Tape past Logical End of Volume21M.AEOV= 40000 ;Tape at Logical End of VolumeeM.BOT= 20000 ;Tape at BOTBM.1600= 4000 ;Tape Density Control; '1'=1600 BPI, '0'=800BPI&M.HWL= 2000 ;Hardware Write Lock$M.RWD= 1000 ;Unit is Rewinding;M.SER= 400 ;Select Error - Tape Drive not accessible;>M.IXG= 200 ;Inhibit Write with Extended Interrecord Gap&M.SWL= 100 ;Software Write Lock;M.EOF= 40 ;Tape Mark detected (FWD direction only).M.EOT= 20 ;Tape at EOTM.EVN= 10 ;Even Parity/USRBTS=4310 ; Bits Controlled by the User - $ ; M.1600! M.IXG! M.SWL! M.EVN>NEWBTS=M.BOT!M.EOF!M.EOT ;Bits to be set before Call $IODON.; Local Data;WC; Controller Impure Data Tables (Indexed by Subcontroller Number)e;eO; Diagnostic Functions use bit 15 of RTTBL as a Flag for Interrupt Servicing.)RTTBL: .BLKW T$$M03 ;Error Retry Count=2SPTBL: .BLKW T$$M03 ;Current Space Count 00K ggKgcccc- 2's.,SPTOTL: .BLKW T$$M03 ;Total Blocks Spaced5SPRMNG: .BLKW T$$M03 ;Remaining Space Count - 2's.e-FMTBL: .BLKW T$$M03 ;Format Code Save Area!/FCCDE: .BLKW T$$M03 ;Function Code Save Areae0CMDCNT: .BLKW T$$M03 ;Command Count Save Area(BUFADR: .BLKW T$$M03 ;U.BUF Save Area1DONADR: .BLKW T$$M03 ;DONTBL Address Save Areat(IOFCN: .BLKW T$$M03 ; > I/O Function..PAGEr;+; VALID I/O FUNCTION TABLE;-. .MACRO DFENT FUNC,INDX,RQSTCD,RTRADR,RTRYCD! .WORD FUNC ;I/O Function Code + .BYTE INDX ;I/O Handling (Tables) Index ) .BYTE RQSTCD ;Device I/O Request CodeM* .WORD RTRADR ;Tape Repositioned Return4 .WORD RTRYCD ;Device Error Recovery Request Code .ENDM ;DFENT3?LGFCN: DFENT IO.RLB,FREAD,FC.RED,RTYCMD,FC.SPR ;Read ForwardO2 DFENT IO.WLB,FWRTE,FC.WRT,RTYCMD,FC.ERS ;Write9 DFENT IO.RLV,FRREV,FC.REV,RTYCMD,FC.SPF ;Read ReverseA< DFENT IO.EOF,FWEOF,FC.WEF,RTYCMD,FC.ERS ;Write Tape Mark9 DFENT IO.ERS,FERSE,FC.ERS, 0, 0 ;Erase 3" Gap3 DFENT IO.RWD,FRWND,FC.RWD, 0, 0 ;RewindEC DFENT IO.RWU,FRWDU,FC.RWU, 0, 0 ;Rewind Unload/Off-Linee9 DFENT IO.SPB,FSPCR,FC.SPF,SPCONT,FC.SPR ;Space Blockso8 DFENT IO.SPF,FSPCF,FC.SPF,SPCONT,FC.SPR ;Space Files2 DFENT IO.STC,FSETC, 0, 0, 0 ;Set Char5 DFENT IO.SEC,FSENC, 0, 0, 0 ;Sense CharR=SMOU: DFENT IO.SMO,FSMOU, 0, 0, 0 ;Mount/Set Char, ENDFCN=.LNGHT=.-SMOU.PAGE; Function Code Index Table,; !FREAD = 0 ;Read Logical BlockN"FWRTE = 2 ;Write Logical Block)FRREV = 4 ;Read Logical Block ReverseRFWEOF = 6 ;Write Tape MarkFERSE = 10 ;Erase 3" GapCFRWND = 12 ;Rewind%FRWDU = 14 ;Rewind Unload/Off-lineRFSPCR = 16 ;Space BlocksTFSPCF = 20 ;Space Files'FSETC = 22 ;Set Tape Characteristics,)FSENC = 24 ;Sense Tape CharacteristicsO,FSMOU = 26 ;Set and Mount Characteristics FRTRY = 30 ;Retry in Progress"FSPRR = 22 ;Space Block Reverse!FSPFR = 24 ;Space File Reversei&; Pre-initiation Processing Routines;EPRETBL: .WORD PRERED ;ReadR .WORD PREWRT ;Writep .WORD PREREV ;Read Reverse! .WORD PREEOF ;Write Tape MarkD .WORD PREERS ;Erase 3" Gap .WORD PRECOM ;Rewind( .WORD PRECOM ;Rewind Unload/Off-line .WORD PRESPC ;Space Blocks .WORD PRESPC ;Space Filesr% .WORD PRESTC ;Set Characteristicsu' .WORD PRESEC ;Sense Characteristicsi/ .WORD PRESMO ;Mount and Set Characteristics; Succesful Completion Table; %DONTBL: .WORD REDDON ;Read Forward  .WORD WRTDON ;Write Forward  .WORD REVDON ;Read Reverse!  .WORD EOFDON ;Write Tape MarkP  .WORD EXTNST ;Erase 3" Gap  .WORD RWDDON ;Rewind( .WORD RWDDON ;Rewind Unload/Off-line% .WORD SPFEXT ;Space Block ForwardP$ .WORD SPFEXT ;Space File Forward% .WORD SPFEXT ;Space Block Reversec$ .WORD SPFEXT ;Space File Reverse9 .WORD SMODON ;IO.SMO Rewind Completion (TM03 problem)t* .WORD FATAL ;Error Recovery Completion.PAGE!; Mask Table - Retriable Errorsw; DAT= CS! PEF! INCCERRMSK: .WORD COR! DTE! DAT! FCE! FMT! CPR ;Read Forwarda; .WORD COR! DTE! DAT! FCE! FMT! CPR! NSG! DPR ;WriteeB .WORD COR! DTE! DAT! FCE! FMT! CPR! OPI ;Read Reverse2 .WORD COR! DAT! CPR! NSG ;Write TMK  .WORD 0 ;Erase 3" Gap' .WORD FMT! NEF ;RewindR3 .WORD FMT! NEF ;Rewind Unl/OfflineM;  .WORD FCE! OPI ;Space FWD BlocksP:! .WORD FCE! OPI ;Space FWD Files:" .WORD FCE! OPI ;Space REV Blocks:# .WORD FCE! OPI ;Space REV Files$ .WORD 0 ;No FunctionR% .WORD 0 ;Retry &'4(; Retry Table; > Error Recovery RETRY Entry Points); %*RTYTBL: .WORD REDRTY ;Read Forward"+ .WORD WRTRTY ;Write , .WORD REVRTY ;Read Reverse!- .WORD WRTRTY ;Write Tape Markf&. .WORD FATAL00K(gffffffDATA ;Erase - Not Retriable/ .WORD RWDRTY ;Rewind(0 .WORD RWDRTY ;Rewind Unload/Off-line"1 .WORD SPRRTY ;Space FWD Blocks!2 .WORD SPFRTY ;Space FWD FilesE"3 .WORD SPRRTY ;Space REV Blocks!4 .WORD SPFRTY ;Space REV Files;5 .WORD FATAL ;IO.SMO Rewind not retriable (TM03 problem)=6 .WORD FATAL ;Error during Error Recovery - Not Retriable. 78D9; Error Check Table; > Specific Function, ERROR CHECK Entry Points:; ;%<CHKTBL: .WORD REDERR ;Read Forwarde= .WORD COMRTY ;WriteE> .WORD REVERR ;Read Reverse!? .WORD COMRTY ;Write Tape Marke%@ .WORD FATAL ;Erase 3" Gap - Fatal;A .WORD RWDRTY ;Rewind(B .WORD RWDRTY ;Rewind Unload/Off-line"C .WORD SPFEXT ;Space FWD Blocks!D .WORD SPFEXT ;Space FWD FilesL"E .WORD SPRERR ;Space REV Blocks!F .WORD SPRERR ;Space REV Filesd5G .WORD FATAL ;IO.SMO Rewind - Fatal (TM03 problem)o*H .WORD RTYCON ;Retry Frame Count ErrorsI.PAGE J; Driver Dispatch Table K; L4M DDT$ MM,T$$M03 ;Create the Driver Dispatch Table.NO;+CP; **-MMINI-RH11/RH70 TM02/TM03 Magnetic Tape Controller InitiatoraQ; DR; This Routine is entered from the Queue I/O directive when an I/OHS; Request is queued and at the end of a previous I/O operation to pro-GT; pagate the execution of the driver. If the specified Controller is FU; not busy, then an attempt is made to dequeue the next I/O request.HV; Else a return to the caller is executed. If the dequeue attempt isJW; successful, then the next I/O operation is initiated. A return to the?X; caller is then executed. If this unit is currently doing aa?Y; rewind any requests for it are rejected by the 'Acceptance'w<Z; routine. These requests will be done when the rewind is [; complete\;r]; ^; Inputs:e_;i<`; R5=Address of the UCB of the Controller to be Initiated.a;h b; Outputs:c;dAd; If the specified controller is not busy and an I/O request isrEe; waiting to be processed, then the request is dequeued and the I/O f; operation is initiated.Ag;-h7iMMINI: GTPKT$ MM,T$$M03 ;Get an I/O packet to processnjkl;(m; The Following Arguments Are Returnedn;to; R1 > I/O request packet.2p; R2 = Physical Unit Number of requested TM02/3.q; R3 = RH Controller Index.ur; R4 > Status Control Block.s; R5 > Tape Drive UCB.t;nFu; RH11/RH70 TM02/TM03 Magnetic Tape Function Independent I/O Requestv; Packet Format:w;t$x; WD. 00 -- I/O queue thread word.2y; WD. 01 -- Request priority, event flag number.7z; WD. 02 -- Address of the TCB of the requestor task.t?{; WD. 03 -- Pointer to second LUN word in requestor task headeE|; WD. 04 -- Contents of the first LUN word in requestor task header D}; WD. 05 -- I/O function code (IO.RLB/IO.RWD/IO.SPB/IO.SPF/IO.EOF)2~; WD. 06 -- Virtual address of I/O status block.2; WD. 07 -- Relocation bias of I/O status block.>; WD. 10 -- I/O status block address (Displacement + 140000)5; WD. 11 -- Virtual address of AST service routine.i;v010$: CALL $RQSUB ;Request the Subcontroller.! MOV U.KRB1(R5),R2 ;R2 > KRB1. 3 MOVB K1.CON(R2),R3 ;R3 - Formatter Unit Number,% ASL R3 ; Convert to Word Index.o& MOV S.PKT(R4),R1 ;R1 > I/O Packet.1 MOV #LGFCN,R2 ;R2 > Valid I/O Function Table.I- MOV I.FCN(R1),R0 ;R0 - QIO Function Code.a2 BICB #US.SUP,U.STS(R5) ;Error Recovery allowed., CLRB RTTBL+1(R3) ;Clear Diagnostic Flag.) BITB #IQ.UMD,R0 ;Diagnostic Function?  BEQ 20$ ;IF EQ, No.0 MOV #100000,RTTBL(R3) ;Indicate Diagnostics,/ BISB #US.SUP,U.STS(R5) ; no Error Recovery.R.20$: BITB #IQ.X,R0 ;Error Recovery allowed? BEQ 25$ ;IF EQ, No.. BISB #US.SUP,U.STS(R5) ;No Error Recovery.F25$: BICB #IQ.X!IQ.UMD!IQ.Q,R0 ;R0 - Function Code for Validation.*30$: CMP R0,(R2) ;Function Code match? BEQ 50$ ;IF EQ, Yes.T% ADD #LNGHT,R2 ;Next I/O Function. ! CMP R2,#ENDFCN ;End of table?.* BLO 30$ ;IF LO, No. Check next entry.340$: MOV #IE.IFC&377,R0 ;Yes - Illegal Function. , CALL 00K0ggKgcccc$RLSUB ;Release the Subcontroller.& CALL $IOALT ;End this Request and3 BR MMINI ; service other outstanding Requests.E.50$: MOV R2,IOFCN(R3) ;Remember I/O Request TST (R2)+ ; and$ MOV (R2),U.FCDE(R5) ; QIO index./ CLR SPTBL(R3) ;Clear out Spacing Indicator. ' TST RTTBL(R3) ;Diagnostic Function?D+ BMI 60$ ;IF MI, Yes - Inhibit Retries.E+ MOV #RETRY,RTTBL(R3) ;Set Retry Count.N; Request the Controller;I860$: CMPB U.FCDE(R5),#FRREV ;Data Transfer Function? BLOS 70$ ;IF LOS, Yes.C6 CALL $RQCNC ;Request Controller for Control Fnct. BR 80$ ;Perform request.E<70$: CALL $RQCND ;Request Controller for Dt Trnsfr Fnct.%80$: MOV U.KRB1(R5),R3 ;R3 > KRB1.I/ CALL SELECT ;Update Device Tape Char Info.d: MOVB U.FCDE(R5),R0 ;R0 - QIO Index, I/O Function Code.& MOV S.PKT(R4),R1 ;R1 > I/O Packet.3 MOVB K1.CON(R3),R3 ;R3 - Formatter Unit Number,e$ ASL R3 ; Convert to Word Index.3 MOV #FATAL,DONTBL+FRTRY ;Preset Error Address.O, JMP @PRETBL(R0) ;Preprocess I/O Request..PAGEo;+1; **-PRESPC - Preprocess Space Function Request;0.; This routine Pre-Process's Space Requests.;c1; Spacing Function Dependent I/O Packet Format: ;TB; WD. 12 -- Spacing Count (positive=forward, Negative=backward).; WD. 13 -- Not Used..; WD. 14 -- Not Used.1; WD. 15 -- Not Used.1; WD. 16 -- Not Used.t?; WD. 17 -- Relocation Bias Of Diagnostic Reg. Buffer AddressA9; WD. 20 -- Diag. Reg. Buffer Address (Displ. + 140000)R;-7PRESPC: MOV #IS.SUC&377,R0 ;Assume 0 Space Count ando3 CLR SPTOTL(R3) ; indicate No Blocks Spaced yet.P- MOV U.BUF(R5),-(SP) ;Current Space Count.  BEQ 40$ ;IF EQ, Done. BMI 10$ ;IF MI, Space REV.p ;Space FWD% MOV #IE.EOV&377,R0 ;May be at EOVD# BIT #M.AEOV,U.CW2(R5) ;At EOV? 4 BNE 40$ ;IF NE, Yes - can't Space FWD from here0 NEG (SP) ;I/O Space Count - 2's complement. BR 20$ ;Continue ;Space REV>10$: BIC #M.AEOV,U.CW2(R5) ;Clear at End of Volume status.5 MOVB #FC.SPR,U.FCDE+1(R5) ;Space REV Function andT1 ADD #4,U.FCDE(R5) ; Space REV Function Index.B-20$: CLR U.BUF(R5) ;Init for Function Code$( CMP #IO.SPF,@IOFCN(R3) ;Space Files? BNE 30$ ;IF NE, No.7 MOV (SP),SPRMNG(R3) ;Remaining Spacing Count - 2's.U5 MOV (SP),I.PRM+4(R1) ;Save for later calculations.S* MOV #1,(SP) ;Set for MAX Space Count.430$: MOV (SP),U.CNT(R5) ;Current I/O Space Count.4 MOV (SP)+,SPTBL(R3) ;Save for Timeout situation.1 BR PWFTST ;Start I/O if no PWFLD Indication.).40$: TST (SP)+ ;Clean up Stack for Return. JMP EXTNST ;End Request.0.PAGEB;+J; **-PRESMO - IF Tape at BOT, Set Tape Characteristics per User Request.;-,PRESMO: BIT #M.BOT,U.CW2(R5) ;Tape at BOT?7 BNE SMORWD ;IF NE, Yes - Set Tape Characteristics.o) MOV #IE.FHE&377,R0 ;No, Fatal Error -e BR PREXIT ;End Request.;+I; **-SMORWD - Issue REWIND to clear possibly hung EOT status in TM03's.eG; Caused by manually rewinding an Online Tape Unit previously at EOT.;-=SMORWD: BIC #M.AEOV,U.CW2(R5) ;Not at End of Volume Status.q' BIC #USRBTS!7,U.CW2(R5) ;Prepare forF4 BIC #^C,U.BUF(R5) ; User Controlled Bits.@ BIS U.BUF(R5),U.CW2(R5) ;Set User Controlled Characteristics.! MOV #FC.RWD,U.BUF(R5) ;Set andt% JMP PRCOM ; request I/O REWIND. 5SMODON: BICB #US.PWF,U.STS(R5) ;Clear PWFLD Status. ' CALL SELECT ;Update Tape Char Wordy( BR PRESEC ; and end IO.SMO Request.;++; **-PRESTC - Set Characteristics CommandE<; Sets User Controlled Bits in Tape Characteristics Word.;-0PRESTC: BIC #USRBTS!7,U.CW2(R5) ;Prepare for4 BIC #^C,U.BUF(R5) ; User Controlled Bits.B BIS U.BUF(R5),U.CW2(R5) ;Set User controlled Characteristics.;+0; **-PRESEC - Return Tape Characteristics Word;-?PRESEC: BIC #M.PEOV,U.CW2(R5) ;No M.PEOV for IO.SMO request. 2  MOV U.CW2(R5),R1 ;Return Tape Charac00K8gffffffDATAteristic's/  MOV #IS.SUC&377,R0 ; and indicate Success.*" PREXIT: JMP EXIT ;End Request. .PAGES ;+,; **-PREWRT - WRITE Request Preprocessing:>; Verify At least Minimum Record Size .and. Write Enabled.;-8PREWRT: MOV #IE.SPC&377,R0 ;Assume Parameter Problems2 CMP #MINREC,I.PRM+4(R1) ;Minimum Record Size?) BHI PREEXT ;IF HI, Record too small.r;+.; **-PREEOF - Write Tape Mark Preprocessing:-; **-PREERS - 3" Gap Erasure Preprocessing:); Verify Write Enabled.t;- PREEOF:S2PREERS: MOV #IE.WLK&377,R0 ;Assume Write Locked, BIT #M.SWL!M.HWL,U.CW2(R5) ;Write Locked? BNE PREEXT ;IF NE, Yes.* CMPB #FRREV,U.FCDE(R5) ;Data Transfer? BLT PWFTST ;IF LT, No. !;+ "; **-PRERED - Read Forward and+#; PREREV - Read Reverse Preprocessing: $;- %PRERED:S2&PREREV: MOV S.KRB(R4),R1 ;Retrieve KRB Address.2' BIT #FE.EXT,$FMASK ;22-bit Addressing enabled?( BEQ 5$ ;IF EQ, No.p)) BIT #KS.MBC,K.STS(R1) ;MASSBUS Device?e* BNE 5$ ;IF NE, Yes.#+ CALL $STMAP ;Setup Unibus Map.s#, ASL U.BUF(R5) ;Shift bits <4:5>,%- ASL U.BUF(R5) ; into bits <8:9>. . ASL U.BUF(R5) ; ...F/ ASL U.BUF(R5) ; ...a*0 CALL $MPUBM ;Setup UMR's for transfer.1 MOV @S.KRB(R4),R2 ; and restore R2 (=CSR).25$: MOV R5,R1 ;R1 >c3 ADD #U.BUF,R1 ; U.BUF.*4 BIT #FE.EXT,$FMASK ;22-bit Addressing?5 BNE 10$ ;IF NE, Yes. 6 ROL (R1) ; Setupb7 ROL (R1) ; A17, A16p8 ROL (R1) ; into;9 ROL (R1) ; Hi Byte. ):10$: CMPB #4,U.FCDE(R5) ;Read Reverse?p; BNE PWFTST ;IF NE, No.b$< SUB #2,U.CNT(R5) ;Read reverse -/= ADD U.CNT(R5),2(R1) ; Adjust Buffer PointerB> BCC 15$ ; to end ofU ? ADCB 1(R1) ; Buffer Area.1@15$: ADD #2,U.CNT(R5) ;Restore Transfer Count. >APWFTST: MOV #IE.ABO&377,R0 ;Request Aborted IF PWFLD Status-B BITB #US.PWF,U.STS(R5) ;Power Fail occur?N%C BEQ PRECOM ;IF EQ, No - ContinueL+DPREEXT: JMP EXTNST ;Else - End Request.iEF;+*G; **-PRECOM - Common Preprocessing EntryH;D5I; All requests have been preprocessed successfully.%J; Setup Formatter Mode Control andA1K; Subsequently perform I/O Function Execution.CL;-M9NPRECOM: MOVB U.FCDE+1(R5),U.BUF(R5) ;Retrieve Function.,*OPRCOM: MOVB U.SNUM(R5),R0 ;Tape Unit #.%P BIS #TC.1600,R0 ;Assume 1600 BPI.d.Q BIT #M.1600,U.CW2(R5) ;Assumption correct?R BNE 10$ ;IF NE, Yes.ES BIC #TC.1600,R0 ;Setup for T BIS #TC.800,R0 ; 800 BPI.*U BIT #M.EVN,U.CW2(R5) ;Even Parity Mode?V BEQ 10$ ;IF EQ, No.%W BIS #TC.EVN,R0 ;Even Parity Mode. 5X10$: BIS #TC.FMT,R0 ;Normal Assys/Disassy of Data..Y MOV R0,FMTBL(R3) ;Tape Drive Control Mode.Z[\];+!^; **-FNCEX - Function ExecutionR_;vE`; Issue I/O Function. RH Controller, Tape Formatter and Tape Drive0<a; ownership need be synchronized before I/O may proceed.b;r c; Inputs:1d; R2 = CSR Address R4 > SCB."e; R3 = Formatter Index R5 > UCB.f;-,gFNCEX: BIT #M.SER,U.CW2(R5) ;Select Error?+h BNE SELERR ;IF NE, Yes - Select Error.C#i BIT #PIP,MTDS(R2) ;Tape moving?Bj BEQ 10$ ;IF EQ, No.&k JMP WTRWD ;Wait until Tape Stops.l9m10$: MOV DONTBL+FRTRY,DONADR(R3) ; > Retry Completion.F$n MTPS #PR5 ;Inhibit Interrupts.$o CALL SELDRV ;;Select Formatter.@p MOV FMTBL(R3),MTTC(R2) ;;Select Tape Drive/Formatting mode.*q MOV #TRE!FC.CLR,(R2) ;;Clear Formatter.0r MOV U.CNT(R5),MTFC(R2) ;;Setup Command Count.9s BIC #M.AEOV!M.SER!M.RWD,U.CW2(R5) ;;Clear status bits.o5t CMPB U.FCDE(R5),#FRREV ;;Data Transfer Function?Tu BLOS 20$ ;;IF LOS, Yes.6v BISB #S3.SIP,S.ST3(R4) ;;Positioning in Progress.!w BR 25$ ;;Issue I/O Function.Rx;y20$: NEG MTFC(R2) ;;Formatter Frame Count - 2's cmplmnt.I*z MOV MTFC(R2),RHWC(R2) ;;RH Controller { ROR RHWC(R2) ;; Word Count.9| MOV U.BUF+2(R5),RHBA(R2) ;;Low order 16 bit address.2} MOV S.KRB(R4),R1 ;; > KRB.7~ BIS #KS.DIP,K.STS(R1) ;;Data Transfer in Progress.S+ BIT #FE.EXT,$FMASK ;;22-bit Addr00K@ggKgccccessing?C BEQ 30$ ;;IF EQ, No.a+ BIT #KS.MBC,K.STS(R1) ;;MASSBUS Device?S BEQ 30$ ;;IF EQ, No.T* ADD K.OFF(R1),R1 ;; > to UCB table and. MOV KE.RHB(R1),R1 ;; obtain RHBAE Offset.' ADD R2,R1 ;;Form I/O page address.t> MOVB U.BUF+1(R5),(R1) ;;HI Order address bits to RHBAE reg.(25$: MOVB U.BUF(R5),(R2) ;;Start I/O. BR 40$ ;;.. Cont.'30$: MOV U.BUF(R5),(R2) ;;Start I/O..&40$: MOV U.KRB1(R5),R2 ;; R2 > KRB1! INC K1.STS(R2) ;; K1.STS .NE.$) BIS #S2.ACT,S.ST2(R4) ;; I/O active.;7 BICB #S3.SPU,S.ST3(R4) ;;Clear Spin-Up indication.S4 MOVB S.ITM(R4),S.CTM(R4) ;;Start Timeout Count.+ CLR S.FRK+2(R4) ;;Reset Fork Interlock. " MTPS #PR0 ;;Allow Interrupts.  RETURN ;+(; **-SELERR-Issue Select Error Message;HB; IF Not Diagnostic or ACP - Issue a Select Error Message to the,; System Console Terminal every 15 seconds5; (the unit is subsequently checked once a second)T4; until Tape Drive comes ready or Request Aborted.;-7SELERR: MOV #IE.DNR&377,R0 ;Assume Not Ready Status.n; BITB #US.SUP,U.STS(R5) ;User Mode Diagnostics or IQ.X?C& BNE 5$ ;IF NE, Yes - End Request.1 TST U.ACP(R5) ;End Request if associated ACP? BEQ 10$ ;IF EQ, No.25$: JMP EXTNST ;End Request - Device Not Ready)10$: CALL RLSDRV ;Release Tape Drive,g$ CALL $RLSUB ; TM Subcontroller% CALL $RLCN ; and RH Controller.s6 DECB S.STS(R4) ;Time for a 'Select Error' message? BNE TIMER ;IF NE, No.- MOV #T.NDSE,R0 ;Set up Error Message Codes4 MOVB #15.,S.STS(R4) ; and set up 15 sec Timeout.6 CALL $DVMSG ;Send the Error Message to Sys Consl..TIMER: MOVB #1,S.CTM(R4) ;Set up a Timeout.1TIMER1: CLR S.FRK+2(R4) ;Reset Fork Interlock.  RETURN ;Wait for Timeout.e.PAGEy;+); **-MMOUT - Device Timeout Entry Point;LP; I/O Timeouts may be caused by Powerfailure or other Hardware considerations.;4; TIMEOUT CONSIDERATIONS: ;gK; 1. An RH Controller supports Parallel Operation and requires ConcurrentsH; Operation synchronization. An RH supports one current Drive DataL; Transfer Operation overlapped with other Drive(s) Non Data Transfers.P; There may be further restrictions on each Drive - i.e. Spacing OperationsK; on a given Drive may not overlap Data Transfers on the same Drive.;/M; 2. The RH Controller is operated with Interrupt ENABLED - this may result4J; in an Interrupt occuring simultaneously with Driver being called atK; Timeout Entry point. The Interrupt may be from some external event, ?; such as a RWD completing, or a Tape Drive coming Online.r;dN; The Driver must be prepared for such an occurence - this is done by theN; interlock S.FRK+2; IF S.FRK+2 is Zero, Interrupt processing is allowed.; I; 3. Another problem exists when a Driver has QUD a Fork while the ExectN; was sequencing to the same Driver's Timeout Entry Point. Timeout EntryD; code sequences with a Fork Block currently in the Fork Queue.;I ; Inputs:b; R4 > SCB. R5 > UCB.t;-  .ENABL LSBR5MMOUT: TST S.FRK+2(R4) ;;;Interrupt handling I/O ?- BEQ 10$ ;;;IF EQ, No - Device timed out.c) RETURN ;;;Interrupt will handle it.o210$: INC S.FRK+2(R4) ;;;Timeout will handle it.# MTPS #PR0 ;;;Allow interrupts.o( CALL $RQSUB ;Request Subcontroller.) CMPB #FRREV,U.FCDE(R5) ;Data Transfer?e BLT 20$ ;IF LT, No.8 CALL $RQCND ;Request Controller for DT XFR Function BR 30$ ; .. Continuer;20$: CALL $RQCNC ;Request Controller for Cntrl Function30$: MOV U.KRB1(R5),R3 ;R3 -R& MOVB K1.CON(R3),R3 ; Subcontroller ASL R3 ; as Word Index.m' CALL SELDRV ;Select Subcontroller.h0 MOV #IE.DNR&377,R0 ;Assume Not Ready Status.7 BIT #M.RWD,U.CW2(R5) ;Tape Drive in previous Rewind?L BEQ 40$ ;IF EQ, No.; Tape Drive in previous RWD.D) BITB #US.ABO,U.STS(R5) ;Abort Request?/ BNE 53$ ;IF NE, Yes - End current00KHgffffffDATA Request.c3 CALL SELECT ;Tape Drive available for Request? :35$: BCS SELERR ;IF CS, No - Issue 'Select Error' Msg.5 BIT #M.RWD,U.CW2(R5) ;Tape Drive - still RWD mode?l0 BEQ 60$ ;IF EQ, No - Start current Request.4WTRWD: CALL RLSDRV ;ELSE Release the Tape Drive,' CALL $RLSUB ; Subcontroller andW# CALL $RLCN ; RH Controller.L# BR TIMER ;Wait for one second.a*; Tape Drive had I/O previously started./40$: MOV SPTBL(R3),R1 ;Spacing via BLKS/TMK?- BEQ 52$ ;IF EQ, No.  CMP R1,MTFC(R2) ;Blank tape?4 BEQ 50$ ;IF EQ, Yes. End Rqst(Can't Stop Tp Sp): MOV MTFC(R2),SPTBL(R3) ;Remember Blocks/TMK's spaced." MOVB S.ITM(R4),S.CTM(R4) ;Wait BR TIMER1 ; some more.F; Device I/O Timeout - Current I/O Not Completed in reasonable time.)50$: CALL $DVTMO ;Log Device Timeout. ) BCS 80$ ;IF CS, Diagnostic Function.n3 JMP FATAL ;End Request - Space Timeouts Fatal.r/52$: BITB #US.ABO,U.STS(R5) ;Abort Request?- BEQ 55$ ;IF EQ, No.-53$: MOV #IE.ABO&377,R0 ;Indicate Aborting  BR 90$ ; and end Request.B; Timeouts are not retried because the tape position is unknown.;.*55$: BIT #M.SER,U.CW2(R5) ;Select Error?  BEQ 50$ ;IF EQ, No - Error. CALL SELECT ;Ready yet? BCS 35$ ;IF CS, No.#60$: JMP PRECOM ;Retry Request.t A ; The following handles a timeout during a diagnostic function.u ; 6 80$: CALL SELDRV ;Select Subcontroller/Tape Drive.(  CALL MMDINT ;Pass Device Registers.G; NOTE: The following may cause all I/O on other Drive(s) attached to I; the same RH Controller to abort. Other I/O requests will be handledn1; by their respective Driver Timeout handling.o.; *** Exception - Tape Spacing operations.; - MOV #SCLR,RHCS2(R2) ;RH Subsystem Clear -J- ; Stop all I/O on that RH Controller.w1 CALL SELECT ;Select Subcontroller/Tape Driveu"90$: JMP EXTNST ; and Request.  .DSABL LSBT.PAGE.;+!; **-MMCAN - Cancel I/O Request.;-@MMCAN: CMP I.TCB(R0),R1 ;Cancel I/O Request for issuing Task? BNE 10$ ;IF NE, No.= BISB #US.ABO,U.STS(R5) ;Indicate I/O Request be Aborted.b 10$: RETURNi!"#;+"$; **-MMPWF - Power Fail Recovery%;eJ&; Powerfail is handled via the Device Timeout Facility - to avoid a race@'; condition that could exist in restarting the I/O Operation.(;-8(MMPWF: BCS 10$ ;IF CS, Controller Power Fail. ;CS0059( BISB #US.PWF,U.STS(R5) ; ELSE, Unit Power Fail ;CS005 1(10$: RETURN ; Disallow normal QIO'S. ;CS005c+ ;**-2,-;+=.; **-MMINT RH11/RH70 TM02/TM03 Interrupt service routine.d/; 70; R3 > KRB R5 > UCB (owner) - data transfer interrupt.1; R5 > UCB (1st slave) - other interrupts2;-34$MMINT::NOP ;;;#5 MOV U.KRB1(R5),R4 ;;;R4 > KRB1."6 MOV K1.OWN(R4),R5 ;;;R5 > UCB.%7 BNE 10$ ;;;IF NE - Owner exists.W78 MOV (R4),R5 ;;;Use Subcontroller's Tape Drive UCB.S%910$: MOV U.SCB(R5),R4 ;;;R4 > SCB.F): TST S.FRK+2(R4) ;;;Fork Block in use?n0; BNE 18$ ;;;IF NE, Yes. Disregard Interrupt.(<; If data transfer - service interrupt.= BIT #KS.DIP,K.STS(R3) ;;;Data trfr in prog?,> BNE 13$ ;;;IF NE, Yes - service intrpt.6?; If interrupt not during non-data I/O - discard it."@ MOV U.KRB1(R5),R2 ;;;R2 > KRB1"A TST K1.STS(R2) ;;;Started I/O?B BEQ 14$ ;;;IF EQ, No. @C; Interrupt from SSC and non-data I/O complete asynchronously.D MOV (R3),R2 ;;;R2 - CSR.U1E; If non-data I/O complete - service interrupt.F/F BIT #PIP,MTDS(R2) ;;;Non-data I/O complete?iG BEQ 13$ ;;;IF EQ, Yes.t!H MOV (R2),-(SP) ;;;Isolate I/OB&I BIC #^C<77>,(SP) ;;; Command Code.'J CMP #6,(SP)+ ;;;Just completed RWD?i+K BEQ 13$ ;;;IF EQ, yes - RWD initiated.I"L; If SSC interrupt - discard it.'M BIT #SSC,MTDS(R2) ;;;SSC condition?tN BNE 14$ ;;;IF NE, Yes.I/O13$: CALL $FORK ;;;Create a system process./!P MOV U.KRB1(R5),R1 ;R1 > KRB1.()Q CLR K1.STS(R1) ;K1.STS .EQ. I/O over. R TST K1.OWN(R100KPggKgcccc) ;Owned?/S BNE 20$ ;IF NE, Yes - Solicited Interrupt.e6T; Presently Unsolicited Interrupts are disregarded.0U14$: CALL $RQSUB ;Request the Subcontroller,#V CALL $RQCNC ; Controller andd/W CALL SELDRV ; Formatter/Tape Drive.dEX BIT #M.RWD!M.SER,U.CW2(R5) ;Previously Rewinding or Select Error?nY BEQ 15$ ;IF EQ, No.7Z INCB S.CTM(R4) ;Timeout Count - per original value.e)[15$: CALL RLSDRV ;Release Tape Drive,"\ CALL $RLSUB ; Subcontroller%] CALL $RLCN ; and RH Controller.E-^ CLR S.FRK+2(R4) ;Reset Fork interlock and 0_18$: RETURN ; discard Unsolicited Interupt.`3a20$: BICB #S3.SIP,S.ST3(R4) ;I/O not in progress.L+b BITB #US.ABO,U.STS(R5) ;Abort Request?Vc BEQ 25$ ;IF EQ, No. d MOV #IE.ABO&377,R0 ;Abortinge BR ENDRQS ; Request.f*g25$: MOV #IS.SUC&377,R0 ;Assume Success1h MOVB K1.CON(R1),R3 ;Retrieve Formatter Numbere"i ASL R3 ; and make Word Index.8j MOV DONADR(R3),DONTBL+FRTRY ;Set Retry done Address.0k MOVB U.FCDE(R5),R1 ;Retrieve Function Index.9l BIT #M.EOF!M.BOT,U.CW2(R5) ;Tape Mark seen last time?lm BEQ 40$ ;IF EQ, No..n BIS #M.PEOV,U.CW2(R5) ;Set for EOV check.Bo40$: BIC #NEWBTS,U.CW2(R5) ;Status bits that may have changed.1p CALL SELECT ;Select subcontroller/tape unit.S%q BIT #TRE,(R2) ;RH Transfer Error?3r BNE 50$ ;IF NE, Yes.M,s45$: BIT #ERR,MTDS(R2) ;Tape Drive Error?t BNE 60$ ;IF NE, Yes.r0u JMP @DONTBL(R1) ;No I/O Error - End Request.v"w; RH Controller Transfer Error -5x50$: BIT #CPE,(R2) ;Parr Err, MASSBUS Control Bus?5+y BNE FATAL ;IF NE, Yes - Unrecoverable.;#z MOV RHCS2(R2),R0 ;R0 - Possible -{ BIC #^C,R0 ; RH Error Indication.R| BEQ 60$ ;IF EQ, No.-} BIT #DLT!UPE!DPE,R0 ;Repositioning Error?t~ BNE 67$ ;IF NE, Yes.#! BIT #PGE!NED,R0 ;Retry Error?B BNE 57$ ;IF NE, Yes.5" BIT #MXF,R0 ;Missed Transfer? BEQ 53$ ;IF EQ, No.% CMPB #4,U.FCDE(R5) ;Read Reverse?o BNE 57$ ;IF NE, No.1 BIT #M.BOT,U.CW2(R5) ;BOT during Read Reverse?) BEQ 57$ ;IF EQ, No., BR 45$ ; .. Check for Tape Drive Error.(53$: BIT #WCE,R0 ;Write Check Error?+ BNE FATAL ;IF NE, Yes. (Else, C2.NEM)n*55$: MOV U.CNT(R5),R0 ;R0 - Frame Count NEG R0 ; Request.. ADD MTFC(R2),R0 ;Frame Count as Requested? BNE 67$ ;IF NE, Moved.B57$: CALL LOGERR ;Log ErrorX  JMP FNCEX ;Reissue Request.5; Drive Error Indication - Determine IF Recoverable,60$: MOV MTER(R2),R0 ;R0 - Error Register* BIT ERRMSK(R1),R0 ;Recoverable Error? BEQ FATAL ;IF EQ, No.+ BIT #FMT!CPR!DTE,R0 ;Positioning Known?# BNE 55$ ;IF NE, No.'65$: BIT #MOL,MTDS(R2) ;Drive Ready?2" BEQ FATAL ;IF EQ, No - Fatal.-67$: MOV MTER(R2),R0 ;R0 - Error Register.M6 JMP @CHKTBL(R1) ;Recover per Specific I/O Request.'; Unrecoverable Request - End RequestX"FATAL: CALL LOGERR ;Log Error., MOV #IE.FHE&377,R0 ;Unrecoverable Error.$ENDRQS: JMP EXTNST ;End Request..PAGEo;+3; **-REVERR - Read Reverse Special Error CheckingB;T$; Test for Read Reverse into BOT..; IF BOT THEN IS.SUC and Zero Byte Count.;-  .ENABL LSBT.REVERR: BIT #OPI,R0 ;Operation Incomplete?0 BEQ REDERR ;IF EQ, No - Not a BOT Condition# BIT #BOT,MTDS(R2) ;Tape at BOT?r- BEQ FATAL ;IF EQ, No - Errors are Fatal.l- BIS #M.BOT,U.CW2(R5) ;Indicate BOT Status. & CLR MTFC(R2) ;No Data Transferred. BR 50$ ;End Request.S;+#; **-REDERR - Read Error Checking;-4REDERR: BIT #INC!PEF!DTE!FMT!CPR,R0 ;Retry Error? BNE 20$ ;IF NE, Yes.t$ BIT #FCE,R0 ;Frame Count Error? BNE 30$ ;IF NE, Yes..#10$: BIT #PES,MTDS(R2) ;PE Tape?O* BNE 40$ ;IF NE, Yes - Corrected Data.#20$: JMP COMRTY ;Retry Request.O$30$: BIT #TM,MTDS(R2) ;Tape Mark? BEQ 50$ ;IF EQ, No.* MOV #IE.EOF&377,R0 ;EOF Ending Status.> BIS #M.EOF,U.CW2(R5) ;Indicate EOF in Characteristics Word. BR 60$ ;End Request. 40$: CALL LOGERR 00KXgffffffDATA ;Log Error.+50$: MOV #IS.SUC&377,R0 ;Indicate Sucesse*60$: JMP @DONTBL(R1) ; and End Request.  .DSABL LSBr;+=; **-RWDERR/RWDRTY - Rewind .OR. Unload/Offline Error RetryP;- RWDERR:44RWDRTY: BIC #M.1600,U.CW2(R5) ;Setup for 800BPI.4 BIT #TC.1600,FMTBL(R3) ;Last Request at 1600BPI?) BNE 10$ ;IF NE, Yes - Try 800BPI.E4 BIS #M.1600,U.CW2(R5) ;Setup to try at 1600BPI.610$: CMP #RETRY,RTTBL(R3) ;Retried at least once? BNE FATAL ;IF NE, Yes. DECB RTTBL(R3) ;Retry JMP PRCOM ; only once..PAGE0;+.; **-SPRERR - Space Reverse - Error Handling;-  .ENABL LSBD.SPRERR: BIT #BOT,MTDS(R2) ;BOT Encountered? BEQ SPFEXT ;IF EQ, No.R- BIS #M.BOT,U.CW2(R5) ;Indicate BOT Status.( MOV #IS.SUC&377,R0 ;Indicate Success BR 30$ ; and End Request.;+.; **-SPFEXT - Space Forward - Error Handling*; Space Functions - Completion Routines;-.SPFEXT: BIT #OPI,R0 ;Operation Incomplete?) BNE FATAL ;IF NE, Yes - Fatal Error.J( MOV #IS.SUC&377,R0 ;Indicate Success,10$: BIT #TM,MTDS(R2) ;Detected Tapemark? BEQ 30$ ;IF EQ, No.1 MOV #IE.EOF&377,R0 ;Indicate Tapemark Status.B* CALL CHKEOV ;Check for End of Volume. BCC 15$ ;IF CC, Not EOV./ MOVB #FRTRY,U.FCDE(R5) ;Set for Backspace. $ JMP BACK ;Backspace One Record.(15$: JMP @RTYTBL(R1) ;Any more files?8SPCONT: CLR U.CNT(R5) ;Clear Requested Count for Calc* MOV #IE.EOV&377,R0 ;Assume EOV ending.0 BIS #M.AEOV,U.CW2(R5) ;Indicate EOV status.130$: MOV S.PKT(R4),R1 ;Get I/O Packet Address.e) CMPB #IO.SPF,I.FCN(R1) ;Space Files?. BEQ SPFDON ;Yes - Endup Files Completion.G; This works because we only get to SPRRTY: for successful completionD; of the backup (Also MTFC=0), and IO.SPB cannot detect EOV after8; spacing over any blocks. (IO.SPF Doesn't Use U.CNT);?;Space Blocks - FWD/REV5;l.SPRRTY: TST MTFC(R2) ;Enough Blocks Spaced?  BEQ 35$ ;Yes - End Request.+ BIT #TM!BOT,MTDS(R2) ;TMK or BOT seen?0  BNE 35$ ;Yes - End Request./ MOV U.CNT(R5),R0 ;Retrieve Requested Count.F4 SUB MTFC(R2),R0 ;Calculate actual number spaced.. ADD R0,SPTOTL(R3) ;Add it to total spaced.1 MOV MTFC(R2),U.CNT(R5) ;Update Current Count(6 MOV MTFC(R2),SPTBL(R3) ; and save it for timeout.$ BR 70$ ;Try to Space some more.335$: MOV U.CNT(R5),R1 ;Retrieve Requested Count.P4 SUB MTFC(R2),R1 ;Calculate actual number spaced.2  ADD SPTOTL(R3),R1 ;Additional Space Operations  ; done IF after EOT.  BR 60$ ;Exit.  ;+#; **-SPFRTY - Space Files FWD/REV;- SPFRTY: INC SPRMNG(R3) ;Done?# BNE 70$ ;IF NE, No - Continue.i) MOV #IS.SUC&377,R0 ;Indicate Success,5* BR 50$ ; Setup count and End Request.-SPFDON: BIT #BOT!TM,MTDS(R2) ;BOT or TMK?y# BEQ 70$ ;IF EQ, No - Continue.U. BIT #BOT,MTDS(R2) ;Stopped for BOT or EOV?' BNE 50$ ;Don't increment the counta, BIT #M.AEOV,U.CW2(R5) ; because we didn't BNE 50$ ; pass a file.( INC SPRMNG(R3) ;Increment TMK Count.150$: MOV S.PKT(R4),R1 ;Get I/O Packet Address.1  MOV I.PRM+4(R1),R1 ;Retreive Count Requested.N1! SUB SPRMNG(R3),R1 ;Subtract Number remaining.e/"60$: NEG R1 ;Set for positive Return Value.u# JMP EXIT ;End Request.B$%70$: JMP FNCEX & .DSABL LSBQ'()*;+$+; **-COMRTY - Common Retry Routine,;d(-; IF Retries Suppressed - End Request/.; ELSE Call Function Specific Retry Routineu/;-0&1COMRTY: CALL LOGERR ;Log the Error+2 MOVB U.FCDE(R5),R1 ;R1 - Function IndexV-3 BITB #US.SUP,U.STS(R5) ;Retries allowed?V&4 BNE 10$ ;IF NE, No - End Request.*5 DECB RTTBL(R3) ;Any more Retries left?&6 BLE 10$ ;IF LE, No - End Request.27 MOV U.FCDE(R5),FCCDE(R3) ;Save Function Index18 MOV U.CNT(R5),CMDCNT(R3) ;Save Command Count29 MOV U.BUF(R5),BUFADR(R3) ;Save Buffer Address.: MOVB #FRTRY,U.FCDE(R5) ;Set Retry Command9; JMP @RTYTBL(R1) ;G00K`ggKgccccOTO Function Specific Retry routineY<+=10$: BIT #PEF!OPI,R0 ;Tape Format Error?)> BEQ RTYCN1 ;IF EQ, No.$? MOV #IE.BBE&377,R0 ;Other Error.(@RTYCON: JMP @DONTBL(R1) ;End Request.A3BRTYCN1: MOV #IE.VER&377,R0 ;Request Return Code.1C BR RTYCON ;End Request.D.PAGEUE;+F; -- Write/WTMK Retry --G;- H .ENABL LSBT*IWRTRTY: MOV #FRTRY,R1 ;R1- Retry Index.5J MOV #RTNWRT,DONTBL(R1) ;I/O Cont after Reposition. 1K MOV #FC.SPR,U.BUF(R5) ;Setup I/O Request Code.TL BR 15$ ;Reposition Tape. M0NRTNWRT: BIT #M.IXG,U.CW2(R5) ;No Extended IRG?O BNE RTYCMD ;IF NE, Yes.'P BR BACK ;Recover from Write Error. QR;+S; -- Read FWD/REV Retry --T;- UREDRTY:T4VREVRTY: CMP MTFC(R2),#NOISE ;800BPI - Min Record?'W BLO RTYCMD ;IF LO, No - Ignore it.XY)ZBACK: MOV #FRTRY,R1 ;R1 - Retry Index.[ MOV IOFCN(R3),R0 ;R0 >$\ ADD #4,R0 ; Reposition Return.3] MOV (R0)+,DONTBL(R1) ;I/O Cont after Reposition.R/^ MOV (R0),U.BUF(R5) ;Setup I/O Request Code.t3_15$: MOV #-1,U.CNT(R5) ;Reposition by one Block.t ` BR 20$abc;+ d; Reissue Original I/O Requeste;-;fRTYCMD: MOV FCCDE(R3),U.FCDE(R5) ;Restore Function Index,--g MOV CMDCNT(R3),U.CNT(R5) ; Command Count,0/h MOV BUFADR(R3),U.BUF(R5) ; Buffer Address -I.i20$: JMP FNCEX ; and Execute the Function.j k .DSABL LSBMl.PAGERm;+/n; **-REDDON - Read Forward Completion RoutineMo;-pGqREVDON: BIC #M.EOF!M.AEOV,U.CW2(R5) ;Setup Status for REV completion. :rREDDON: MOV MTFC(R2),R1 ;Set Frame Count for Requestor.1s; TM03 Formatter - Auto Density setup on Reads.g7t; IF TM03, Update Density Status for that Tape Unit.)"uTM03DN: BIT #40,MTDT(R2) ;TM03?v BEQ 5$ ;IF EQ, No.m1w BIT #M.BOT!M.RWD,U.CW2(R5) ;BOT or Rewinding? x BNE 5$ ;IF NE, Yes.*y BIC #M.1600,U.CW2(R5) ;Assume 800BPI.z BIT #PES,MTDS(R2) ;800 BPI?R{ BEQ 5$ ;IF EQ, Yes.)| BIS #M.1600,U.CW2(R5) ;Else 1600BPI.E!}5$: TSTB R0 ;Returning Error?o+~ BMI EXIT ;IF MI, Yes - More important. ) BIT #BOT,MTDS(R2) ;Read REV into BOT?F BNE EXIT ;IF NE, Yes.2 CMP MTFC(R2),#NOISE ;Record at least Min Size? BHIS 10$ ;IF HIS, Yes. ( BIT #M.1600,U.CW2(R5) ;1600 BPI Tape?5 BNE EXIT ;IF NE, Yes -LT Min allowed for 1600BPIi/ JMP COMRTY ;LT Min not allowed for 800BPI.C:10$: CMP R1,U.CNT(R5) ;Tape Data - More than Requested?% BLOS EXIT ;IF LOS, No - Success.C( MOV #IE.DAO&377,R0 ;Inform the User. BR EXIT ;End Request.;+2; **-EOFDON - Write Tape Mark Completion Routine6; **-WRTDON - Write Logical Block Completion Routine;-+EOFDON: BIS #M.EOF,U.CW2(R5) ;TMK status.B6WRTDON: MOV U.CNT(R5),R1 ;Retrieve Requested Count.- ADD MTFC(R2),R1 ;Calculate Actual Length.l BIT #EOT,MTDS(R2) ;EOT?M BEQ EXIT ;IF EQ, No.o1 MOV #IE.EOT&377,R0 ;EOT - Request End Status. : BIS #M.EOT,U.CW2(R5) ;EOT in Tape Characteristics Word. BR EXIT ;End Request.1RWDDON: BIT #PIP,MTDS(R2) ;Rewind in progress?  BEQ 10$ ;IF EQ, Done.5 BIS #M.RWD,U.CW2(R5) ;Indicate Rewind in Progress. <10$: BIC #M.AEOV,U.CW2(R5) ;No End of Volume indication./ BICB #US.PWF,U.STS(R5) ;Clear PWRFLD Status.e8EXTNST: CLR R1 ;No additional Status being Returned.%EXIT: MOV @S.KRB(R4),R2 ;R2 = CSR.E2 CALL MMDINT ;Pass Dev Regs IF User Mode Diag.$ CALL RLSDRV ;Release the Drive.- MOV U.KRB1(R5),R3 ;Retrieve KRB1 Address. - MOVB K1.CON(R3),R3 ;Get Formatter Number.D ASL R3 ;Make a Word Index.B' MOVB RTTBL(R3),R2 ;Set Retry Count.W+ BIS #RETRY*256.,R2 ;Set Original Count.B- BIC #M.PEOV!7,U.CW2(R5) ;No PEOV Status.t0 BICB #US.ABO,U.STS(R5) ;Clear Abort Status.. BICB #S3.SIP,S.ST3(R4) ;Clear Status Bit., CALL $RLSUB ;Release the Subcontroller.$ CALL $RLCN ;Release Controller.> BIC #S2.ACT,S.ST2(R4) ;Clear Intrpts active - If Timeout.. CLR S.FRK+2(R4) ;Clear the Fork Interlock." CALL $IODON ;End the Request.1 JMP MMINI ;Service outstanding 00KhgffffffDATAI/O Requests.M;+/; **-CHKEOV - Check For Logical End Of Volumee;g ; Outputs:; C=1 If EOV; C=0 If Not EOV;-!CHKEOV: CLC ;Assume Not EOV.r& BIT #REV,U.BUF(R5) ;REV Operation?( BNE 20$ ;IF NE, Yes - can't be EOV.- MOV MTFC(R2),-(SP) ;Retrieve frame Count.l6 SUB U.CNT(R5),(SP) ;Obtain number actually Spaced. CMP (SP)+,#1 ;Exactly One? CLC ;Assume Not EOV." BNE 10$ ;IF NE, No - not EOV.* BITB #US.LAB,U.STS(R5) ;Labelled Tape?" BNE 10$ ;IF NE, Yes - No EOV.6 BIT #M.PEOV,U.CW2(R5) ;TMK or BOT seen last time? BEQ 10$ ;IF EQ, No - CC. SEC ;EOV.+10$: BIS #M.EOF,U.CW2(R5) ;Set EOF status 20$: RETURNU.PAGEE;+ ; **-SELDRV - Select Tape Unit.; **-SELECT - Select And Set Hardware Status;e,; This routine attempts to select a drive.K; It sets up BOT, EOT, HWL, SER bits in the Tape Characteristics Word..;B ; Outputs:; C=0 If Good Select; C=1 If Bad Selecta;-'SELDRV: MOV @S.KRB(R4),R2 ;R2 - CSR.5 MOVB U.UNIT(R5),RHCS2(R2) ;Select the formatter. BIT #GO,(R2) ;Go Bit Set?- BNE 10$ ;IF NE, Yes - don't touch MTTC !t3 MOV MTTC(R2),-(SP) ;Save Slave Select Register.S  MOVB U.SNUM(R5),(SP) ;Select$ MOV (SP)+,MTTC(R2) ; Slave Unit. 10$: RETURNs4SELECT: CALL SELDRV ;Select Formatter and Slave.@ BIC #M.BOT!M.EOT!M.HWL!M.SER,U.CW2(R5) ;Status to be updated.* SEC ;Assume can't select Tape Drive.( BIT #MOL,MTDS(R2) ;Tape Drive Ready? BNE 10$ ;IF NE, Yes.V4 BIS #M.SER,U.CW2(R5) ;Select Error - indicate it.  RETURN 310$: BIT #PIP,MTDS(R2) ;Positioning in Progress?T BNE 20$ ;IF NE, Yes. # BIT #BOT,MTDS(R2) ;Tape at BOT?V BEQ 15$ ;IF EQ, No.$ BIS #M.BOT,U.CW2(R5) ;BOT status,( BIC #M.RWD,U.CW2(R5) ; not Rewinding.'15$: BIT #EOT,MTDS(R2) ;Tape at EOT?B BEQ 20$ ;IF EQ, No.$ BIS #M.EOT,U.CW2(R5) ;EOT status.320$: BIT #WRL,MTDS(R2) ;Tape Drive Write-Locked?, BEQ 30$ ;IF EQ, No.$ BIS #M.HWL,U.CW2(R5) ;HWL status.$30$: CLC ;Tape Drive available.RTRN: RETURN;+0; **-LOGERR - Subroutine To Log Device Errors;--LOGERR: TST RTTBL(R3) ;User Mode Function?t0 BMI RTRN ;IF MI, Yes - They will handle it.0 JMP $DVERR ;Log the Error - They will RTRN..PAGEn;+#; **-$RQSUB-Request SubcontrollerB;B$; Obtain Access To Subcontroller -C; IF Allowed to perform an I/O Operation, Set Subcontroller Busy.k; ; Inputs:;4; R5 > UCB, Requestor Unit. 0(SP)= > Driver Return; 2(SP)= > Drivers Caller ; Outputs: ; R4 > SCB, ; R5 > UCB, Requestor Unit.L ;v ; NOTE:; S.FRK+2 is Always Non-Zero. 1; Driver has Exclusive Access to Subcontroller. ;-&$RQSUB: MOV U.SCB(R5),R1 ;R1 > SCB.! MOV U.KRB1(R5),R0 ;R0 > KRB1.+; CMP R5,K1.OWN(R0) ;Requestor already own Subcontroller?s BEQ 10$ ;IF EQ, Yes.F' TST K1.OWN(R0) ;Subcontroller Busy?  BNE 20$ ;IF NE, Yes.7 MOV R5,K1.OWN(R0) ;Requestor - Subcontroller Owner.e"; Requestor Subcontroller Owner.)10$: MOV R1,R4 ;Subcontroller Owner -52 MOV #42,S.FRK+2(R4) ; IF S.FRK+2 .NE. - owned.  RETURNy?; Requestor not Subcontroller Owner .and. Subcontroller Busy.-620$: MOV R1,S.FRK+6(R1) ; Save SCB in R4 Save Area.-  ADD #S.FRK+6,R1 ; R1 > to R5 Save Area+2; ! MOV R5,-(R1) ; Save R5,o." MOV (SP)+,-(R1) ; Save Drivers Return @,(# CLR -(R1) ; and Clear Link Word.'$ ADD #K1.CRQ,R0 ; R0 > to Wait Queueq*% JMP $QINSF ; and Queue this Request.&'(;+#); **-$RLSUB-Release Subcontrollerr*; 1+; IF Requestor not Subcontroller Owner, Return. ,;e@-; ELSE Release Subcontroller, place Fork Block for subsequent;.; Requests (if any) from the Controller Wait Queue to theRA/; Fork Queue and make Requestor the Owner of the Subcontroller.V0;( 1; Inputs: 2; R4 > SCB,P3; R5 > UCB of Requestor.4; 5; Outputs:%6; IF Owned - Subcontroller Released#7; R3 Alter00Kpguggcccced8;-9(:$RLSUB: MOV U.KRB1(R5),R3 ;R3 > KRB1.3; CMP R5,K1.OWN(R3) ;Requestor own Subcontroller?r< BNE 30$ ;IF NE, No.!=; Requestor owns Subcontroller.n4> CLR K1.OWN(R3) ;Release Subcontroller ownership.#?; Handle other Requestors Queued.f5@ ADD #K1.CRQ,R3 ;R3 > Subcontroller Request Queue.Q.A MOV (R3),R4 ;Any other Requestors Queued?0B BEQ 20$ ;IF EQ, No other Requestors Queued.,C MOV (R4),(R3) ;Update Beginning of List."D BNE 10$ ;IF NE, List updated.E MOV R3,2(R3) ;Empty list.RDF10$: MOV 4(R4),K1.OWN-K1.CRQ(R3) ;Prev Reqstr - R5 from Fork List.$G CLR (R4) ;Clear Fork Link Word.+H CALL $QFORK ;Fork Block to Fork Queue.#I20$: MOV U.SCB(R5),R4 ;R4 > SCB.l J30$: RETURNKLM;+!N; **-RLSDRV - Release the DriveCO; NP; IF A Multi Access (Dual Ported) Unit, Issue Drive Release and note in SCB.Q; R; Inputs:; S; R2 > CSR. T; R4 > SCB.eU;-VGWRLSDRV: MOVB #TRE/256.,1(R2) ;Clear RH errors - CS1 14,13; CS2 15-8..%X BIT #PIP,MTDS(R2) ;Tape movement?:3Y BNE 5$ ;IF NE, Yes - Can't init RH, tape subsyo3Z MOV #TRE!10,(R2) ;Clear RH errors, selected TM.L$[5$: BIT #S2.MAD,S.ST2(R4) ;RH01?\ BEQ 10$ ;IF EQ, No.4] MOVB #FC.RLS,(R2) ;Release Drive (Subcontroler).A^ BISB #S3.DRL,S.ST3(R4) ; and Show Dual Access Unit released. ,_10$: MOVB #IE,(R2) ;Re-enable Interrupts. ` RETURNua.PAGE b;+ c; **-MMDINTSd;#e; IF Diagnostic Control Function,R-f; pass Device Registers via $CRPAS routine.g;# h; Inputs: i; R2 > CSR R4 > SCBEj;-k lMMDINT: MOV R1,-(SP) ;Save R1,m MOV S.PKT(R4),R1 ;Get I/O Packet Address5n BITB #IQ.UMD,I.FCN(R1) ;Diagnostic Function Call?Qo BEQ 20$ ;IF EQ, No.=p CMPB #IO.EOF/256.,I.FCN+1(R1) ;Write EOF Control Function?,q BEQ 10$ ;IF EQ, Yes. <r CMPB #IO.RWD/256.,I.FCN+1(R1) ;Control other than IO.EOF?s BEQ 10$ ;IF EQ, Yes. 6t CALL $CRPAS ;Pass Device Registers to Diagnosticsu BR 20$ ; .. Cont.v7w10$: MOV I.PRM+14(R1),I.PRM+16(R1) ;Move WD20 to WD2123x MOV I.PRM+12(R1),I.PRM+14(R1) ;Move WD17 to WD20S)y MOV R1,-(SP) ;Save I/O Packet Addresst6z CALL $CRPAS ;Pass Device Registers to Diagnostics,{ MOV (SP)+,R1 ;Restore I/O Packet Address8| MOV I.PRM+14(R1),I.PRM+12(R1) ;Move WD20 back to WD178} MOV I.PRM+16(R1),I.PRM+14(R1) ;Move WD21 back to WD20 ~20$: MOV (SP)+,R1 ;Restore R1  RETURNE .ENDCALL $CRPAS ;Pass Device Registers to Diagnosticsu BR 20$ ; .. Cont.v7w10$: MOV I.PRM+14(R1),I.PRM+16(R1) ;PN:< .DATA POT = 0 .DATA RMDSPT = 0F .DATA DCLSPT = 0A .GOTO FINISH..NEWSYS: ;L ; Since you answered no to last question, I assume you have an RSX-11M V4.0 ; system or RSX-11M-PLUS. ;G .ASK SPAWN Does your system support parent/offspring tasking (most do)= .IFF SPAWN .GOTO NOSPN .DATA POT = 1 ;M ; Many RSX-11M/M-PLUS systems have DIGITAL Command Language (DCL), but no M $ ; 3.2 or earlier M systems have it. ;# .ASK DCL Does your system have DCLS .IFF DCL .DATA DCLSPT = 0 .IFT DCL .DATA DCLSPT = 1 ;H ; Your system may have a user version of the RMDEMO system display taskE ; available. If so, the MCR RMD command or the DCL SHOW MEMORY and s2 ; SHOW TASKS/DYNAMIC commands produce the display ;) .ASK RMD Is this the case on your system= .IFF RMD .DATA RMDSPT = 0 .IFT RMD .DATA RMDSPT = 1.FINISH: .CLOSE CLKPRE.MAC ; ; Now we'll build your clocko ; MAC CLOCK=CLKPRE,CLOCKt TKB CLOCK=CLOCK PIP CLKPRE.MAC;0,CLOCK.OBJ;*/DE ;@ .ASK A Do you want to purge previous versions of the clock task .IFT A PIP CLOCK.TSK/PU .IFNDF .GOTO DONE .IF STCLI EQ "DCL" SET /DCL=TI:.DONE: ; RUN CLOCK ;A ; To use this clock in the future, issue the command "RUN CLOCK"e display ;) .ASK RMD Is this the case on your system= .IFF RMD .DATA RMDSPT = 0 .IFT RMD .DATA RMDSPT = 1.FINISH: .CLOSE CLKPRE.MAC ; ; Now we'll build your clocko ; MAC CLOCK=CLKPRE,CLOCKt TKB CLOCK=CLOCK PIP CLKPRE.MAC;0,CLOCK.OBJ;*/DE ;@ .ASK A Do you want to purge00xgygzgM{gfffDATA .ENABLE SUBSTITUTION.BEGIN: .ASKS FILE Which file? TYPE 'FILE' .ASK DEL Delete the file  .IFT DEL DELETE 'FILE';*B .GOTO BEGIN .ENABLE QUIET .IF EQ "MCR" SET /DCL=TI: .DISABLE QUIETE2 .IF NE "[USER]" SET DEFAULT [USER]/NAMED .ENABLE QUIET TYPE HELLO.TXTI.; This Indirect command file prepares a new diskette for use on your RSXaM.; system. This is an example only. You may want to customize this file for.; your own use.  ;? ; Place the new diskette in one of the drives before answeringn ; the question.-.; Comments with only ; in front are printed.-.; Comments with .; in front are not printed.  .ENABLE SUBSTITUTION4K.; When SUBSTITUTION is enabled, Indirect can substitute a variable's value.; into a command. ; .ASKS DISK $ .TITLE DCCTL - Control Operations .IF DF D$$CHE .IDENT /02.02/ ;C7; Copyright (c) 1986 by DIGITAL EQUIPMENT CORPORATIOND; All rights reserved.;; Original author: ; John Gemignani ;" ; Modified by: ;A ; J. Kauffman 10-Jun-86 02.01t: ; JRK328 Add deferred write support for temporary files ;: ; J. Kauffman 29-May-87 02.0230 ; JRK336 Force cache flush when going NODEFER ;f;lN; This module contains the code to perform the cache operations required for$; QIOs with IO.STC function codes.;$ .MCALL PCBDF$  PCBDF$C .PSECT DC$CTL, RO, II! (" .SBTTL $DCSTC - Operations dispatcher#;. $; Passed:r%; UCBX mapped in APR6G=&; X.CSTS := Unit's cache status (i.e. selected operations)8';0(; R1 -> I/O packet); I.PRM+2 := Operation code *; R5 -> UCB%+; SP -> Address of return in $DRQRQJ,; -; Returned:s.; All registers preserved/;10;;; Otherwise N/A - control is passed to $DRQRQe1;a 2; Action:d3; 4; Notes:<5; QIOs which are NOT transfer functions do not have I.PRMs96; adjusted for the address doublewords. Therefore, alla=7; parameters will be in the same cells within I.PRM as theyF8; are issued (hence the Px definitions in DCPRE should not be used).9;- :$DCSTC:: : MESAG$ STCMSG,1 ;JRK330< ;**-1 1= TST I.PRM+2(R1) ; Is this a "size" operation?n> BPL 10$ ; If PL, no?$@ RETURN ; Give it to the driverA10$:9B MOV #$QOPDN, (SP) ; Change return address, see $DRQRQ C9D CMP #VV$CHE, I.PRM+2(R1) ; A cache directed operation?dE BEQ LOCAL ; If EQ, yeswF;G BITB #XC.ACT, APR6.BASE+X.CSTS ; Is this device caching?wH BEQ 20$ ; If EQ, norI;uGJ; Performance might be enhanced at this point by making an additionalC#K; verification. The choices are:L; <M; 1) checking US.VV inline and attempting to track changesIN; 2) duplicating the I/O packet and checking the status during internal0O; I/O completion)=P; 3) creating and calling a new entry point in MDSUB/$VOLVDRQ;1?R; I recommend choice 3 as the easy to implement and maintain.S;B2T CALL CHEPUR ; Purge the cache for this deviceT ;JRK330 T .IFDF CHEDFR ;JRK330T ;JRK330t3T BCC 15$ ; If CC, all extents are gone ;JRK330n9T CALL ELMCED ; Go eliminate the deferred CED ;JRK330d7T BCS BACKUP ; CS -> failure causing backup ;JRK336p;T BVS 15$ ; VS -> no deferreds found. Deactivate ;JRK336m:T RETURN ; L00Mguggccccet I/O completion deactivate cache ;JRK336T15$: ;JRK336 T .ENDC ;CHEDFR ;JRK336 T ;JRK336n'U CALL CHEDAC ; Deactivate the cachecV20$:;W; BIT #VV$SET, I.PRM+2(R1) ; Is this a "clear" operation?3X; BEQ 30$ ; If EQ, yesY;1KZ; "Set" operations will activate the cache if auto-activation is selected [;e:\; BITB #XC.ENA, APR6.BASE+X.CSTS ; Automatic activation?*]; BEQ 30$ ; If EQ, no, pass to driver^;r(_; CALL CHEDUP ; Duplicate the packet3`; BCS 30$ ; If CS, lacking pool, don't activate5a; b; Context:c; R0 -> Duplicated I/O packet d; He; Prepare packet for queueing to driver, with internal I/O completion.f;$:g; MOV KINAR5, I.IOSB+2(R1) ; Setup internal I/O mappingAh; MOV #, I.IOSB+4(R1) ; Mark the internal I/O addresse-i; MOV R0, I.IOSB(R1) ; Point at duplicateBj;30$: +k CALLR $DRQRQ ; Queue it to the driver k ;JRK330ok .IFDF CHEDFR ;JRK336k ;JRK336 4kCLRUP: TST (SP)+ ; Pop return to IOFIN ;JRK336EkBACKUP: CALLR $BCKUP ; Back up the user PC to reissue I/O ;JRK330k ;JRK330rk .ENDC ;CHEDFR ;JRK330ll c7m .SBTTL + STCIIO - Internal I/O completion for VV$SETnn;l o; Passed:p; R3 -> I/O packet completing *q; I.IOSB -> Corresponding cache packet-r; I.PRM+P3, P4 := Driver completion status s; Returned: 't;;; N/A - control is passed in $IOFIN u;3 v; Action:CGw; If the VV$SET request is used to auto-activate the disk caching fortDx; the device then in order to validate that the medium is present,By; we must know the results of the VV$SET operation. To do this,@z; the above code duplicates the user's packet, and adjusts the?{; return status to cause us to be notified. The field I.IOSB>|; in the internal packet points us back to the original user<}; request. When we obtain the status of the operation, weA~; will attempt to activate the cache if the result was success.s=; The internal packet is deallocated, and the original usere;; packet is completed ($IOFIN) with the internal packet'se ; status.e;l ;STCIIO:;; MOV I.PRM+P3(R3), R0 ; Get the driver completion statush; MOV I.PRM+P4(R3), R1;e>; MOV I.IOSB(R3),-(SP) ;Save the original I/O packet address-; CALL CHEDEP ;Delete the internal packeto5; MOV (SP)+,R3 ;Reload the original packet addressa;f); TSTB R0 ;Was the VV$SET successful?i0; BMI 10$ ;No if MI; leave cache deactivated;e5; CALL CHEACT ;Else activate the cache for device ;10$: 6; CALLR $IOFIN ;Complete original request and exit % .SBTTL + LOCAL - VV$CHE processing ;G ; Passed: ; R1 -> I/O packet!; I.TCB -> TCB of issuing taskO/; T.ST3 := T3.PRV indicates privileged taska;s ; Returned:E';;; N/A - control is passed to $IOFIN ;, ; Action:h;g&LOCAL: MESAG$ CHEMSG,2 ;JRK330 ;**-1u. MOV I.TCB(R1), R0 ; Get the TCB of issuer BNE 5$ ; If EQ, got it BPT ; Sanity checkc5$:r4 BIT #T3.PRV, T.ST3(R0) ; Is the task privileged?" BNE 10$ ; If NE, yes, accept5 MOV #, I.PRM(R1) ; Setup return status- BR 20$ ; Return status10$:. CALL SUBFUN ; Go process the subfunction;d<; Common local I/O completion occurs here. Offset I.PRM+0=; will contain the primary status, and I.PRM+2 will contain ); the secondary status (or byte count).B; 320$: MOV R1, R3 ; Establish context for $IOFINoIOFIN: ;JRK330h+ MOV I.PRM(R3), R0 ; Set primary status / MOV I.PRM+2(R3), R1 ; Set secondary status - CALL $IOFIN ; And complete this request RETURNu . .SBTTL SUBFUN - Cache-specific Subfunctions; ; Passed:t; R1 -> I/O packet ; I.PRM+4 := Subfunction code;h ; Returned:P; ; Action:a7; This routine will process the various subfunctions: ;d'; 1. DC$ENA - Enable cache processing:(; 2. DC$DIS - Disable cache processing); 3. DC$AC00MgygzgM{gfffDATAT - Activate cache processingP+; 4. DC$DAC - Deactivate cache processingP%; 5. DC$RCS - Read cache parameters$; 6. DC$SCS - Set cache parameters'; 7. DC$CSB - Clear statistics buffer &; 8. DC$RSB - Read statistics buffer; ; Notes:;; The first two words of the parameter list are trash for7; the VV$CHE subfunction of IO.STC. They are used to ?; return the status to the calling routine (which will handlec?; the call to $IOFIN for us). I.PRM+0 is the primary status,.>; and I.PRM+2 is the secondary status. The dispatching codeA; will initialize the words as and zero, respectively.D; CSUBFUN: MOV #, I.PRM(R1) ; Set the default I/O status ' CLR I.PRM+2(R1) ; Clear count word7 MOV I.PRM+4(R1), R0 ; Get the subfunction code (P3) # CMP R0, #DC$ENA ; Enable cache? BLO FUNBAD ; Bad parm if LO BEQ FUNENA ; Yes if EQg% CMP R0, #DC$ACT ; Activate cache?t BLO FUNDIS ; Disable if LO BEQ FUNACT ; Activate if EQ' CMP R0, #DC$RCS ; Read cache parms?e" BLO FUNDAC ; Deactivate if LO" BEQ FUNRCS ; Read parms if EQ) CMP R0, #DC$CSB ; Clear stats buffer?t BLO FUNSET ; Set if LOC; BEQ FUNCSB ; Clear if EQ( CMP R0, #DC$RSB ; Read stats buffer? BEQ FUNRSB ; Read if EQ=FUNBAD: MOV #, I.PRM(R1) ; Set "bad parameters". BR FUNEXT ; Proceed to common exit pointBFUNPRI: MOV #, I.PRM(R1) ; Set "privilege violation"FUNEXT: RETURN ! .SBTTL + DC$ENA - Enable Caches;:; This function is simple, since it does not require any:; form of validation. It is merely used to set a status; bit.; FFUNENA: BISB #XC.ENA, APR6.BASE+X.CSTS ; Set autoactivation on MOUnt BR FUNEXT& .SBTTL + DC$DIS - Disable the cache;O:; This function is simple, since it does not require any<; form of validation. It is merely used to clear a status; bit.;MHFUNDIS: BICB #XC.ENA, APR6.BASE+X.CSTS ; Clear autoactivation on MOUnt  BR FUNEXT h% .SBTTL + DC$DAC - Deactivate caches;i:; This function requires the cache to be flushed and all:; operations to be released to the driver. The "active"<; bit is cleared to indicate that the cache will no longer ; perform I/O for the user.s ;tE FUNDAC: BITB #XC.ACT, APR6.BASE+X.CSTS ; Is cache currently active?a1  BEQ FUNEXT ; If EQ, no, just return ;JRK336l  ;JRK336.  .IFDF CHEDFR ;JRK336  ;JRK336eH  BITB #X2.DEA,APR6.BASE+X.CST2; Is the Cache being deactivated ;JRK336>  BNE BACKUP ; Go back up this I/O until purge done ;JRK336  ;JRK336p  .IFTF ;CHEDFR ;JRK336i  ;JRK3367  CALL CHEPUR ; Purge cache of nodefer CEDs ;JRK336r  ;JRK336   .IFT ;CHEDFR ;JRK336  ;JRK336.6  BCS 20$ ; If CS, a deferred extent exists ;JRK336  ;JRK336   .IFTF ;CHEDFR ;JRK336  ;JRK336;? 10$: CALLR CHEDAC ; Deallocate the cache and return ;JRK336s  ;JRK336t  .IFT ;CHEDFR ;JRK336  ;JRK336 = 20$: CALL ELMCED ; Go eliminate the deferred CED ;JRK336R:  BCS CLRUP ; Pop return to IOFIN and backup PC ;JRK336<  BVS 10$ ; If VS, no deferreds at all, go $IOFIN ;JRK336>  MOV (SP),(SP)+ ; Remove return to IOFIN from stack ;JRK336  RETURN ;JRK336   ;JRK336   .ENDC ;CHEDFR ;JRK336  ;**-6 # .SBTTL + DC$ACT - Activate cache ;e ; Passed:c; UCBX mapped in APR6; ; R5 -> UCB;F ; Action: =; This function will activate cache for a device which doesm;; not have caching currently activated for it. Note that >; this operation can be used to "bypass" the "autoactivation;; on mount" bit (XC.ENA=1). In other words, if the cacheu<; is disabled for a device, DC$ACT can turn caching on for; ; the device regardless of the setting of XC.ENA. DC$ACT =!; will not change the setting of XC.ENA ei00Mguggccccther. Therefore,s<"; a disk with autoactivation disabled will remain that way#; independent of DC$ACT.$;lD%; NOTE: This code checks the cache status initially, and no matter@&; how it is set, will set the "cache active" bit. (Therefore,?'; the first 2 lines are nonsense, but are included should one 8(; decide to do something spectacular after I've gone.));TB*FUNACT: BITB #XC.ACT, APR6.BASE+X.CSTS ; Cache already activate?)+ BNE 10$ ; If NE, yes - don't bother ,4- CALL CHEACT ;Activate the cache for this device/. BCS FUNPRI ;Privilege violation if failuren/*010$: BR FUNEXT ;Proceed to common exit1 s*2 .SBTTL + DC$RCS - Read cache parameters3;o>4; This function will return the current setting of the cache65; in the second status word of the I/O status block.6;B7FUNRCS: MOVB APR6.BASE+X.CSTS, I.PRM+2(R1) ; Set the status bits 8 BR FUNEXT9): .SBTTL + DC$SET - Set cache parameters?;;B <; Passed:f=; UCBX mapped in APR6D>; X.CSTS := XC.ACT indicates unit is active (in terms of caching)4?; X.CPCB -> PCB of region unit is caching through@; A; R1 -> I/O packetB; I.PRM+6 := Set parametersa$C; I.PRM+10 -> Cache partition PCBD; I.PRM+12 -> Extent limitsE; F; Returned:G; R1 -> I/O packet#H; I.PRM, +2 := Completion statusI;R J; Action:.JK; This function will set the lower cache status bits of the X.CSTS byte.L;SFM; The high bit of the word indicates that the partition PCB has beenBN; passed in parameter 5 and which should be plugged into X.CPCB.O; P; Note:>EQ; To enable/disable and activate/deactivate cache use corresponding R; subfunction codes.S;'SFUNSET: MESAG$ SETMSG,3 ;JRK336 U ;**-1 -V MOV I.PRM+6(R1), R0 ; Get the status bitskWXWVALID= ;JRK328 YINVALID=^C ;**-1Z,[ BIT #INVALID, R0 ; Invalid bits in here?/\ BNE FUNBAD ; Return "bad parameters" errori]] .IFDF CHEDFR ;JRK336] ;JRK336A] BITB #XC.DFR,R0 ; Is deferred writes on in new values ;JRK336 .] BEQ 15$ ; If EQ, no, don't worry ;JRK336;] BITB #XC.DAT,R0 ; Is virtual turned on as well ;JRK336 /] BEQ FUNBAD ; If EQ, no, disallow ;JRK336]15$: ;JRK336$] .IFTF ;CHEDFR ;JRK336X] ;JRK336FD^ MOV I.PRM+10(R1), R0 ; Get address of requested cache PCB ;DPR015_ ;DPR015rA` BITB #XC.ACT, APR6.BASE+X.CSTS ; Is current PCB address bound?C$a BNE 19$ ; If NE, yes ;DPR015b ;DPR015,0c MOV R0, APR6.BASE+X.CPCB ; Load into the UCBXd BR 20$ ;DPR015e19$: ;DPR0154f BIT #DC$PAR, R0 ; User specify a partition name?,g BEQ 20$ ; If EQ, no, don't look for oneh@i CMP R0, APR6.BASE+X.CPCB ; Do they match each other? ;DPR015&j BNE FUNPRI ; If NE, no ;DPR015k20$:k .IFT ;CHEDFR ;JRK336k ;JRK336 Gk MOVB APR6.BASE+X.CSTS,-(SP) ; Save the old parameter values ;JRK336uk ;JRK336 k .IFTF ;CHEDFR ;JRK336 k ;JRK336A8l MOV R1, -(SP) ; Save the I/O packet address ;DPR020Fm MOV I.PRM+12(R1), R0 ; Get virtual address of extent limits ;DPR0207n MOV #5, R1 ; Length of extent limit table ;DPR020e+o CALL $ACHKB ; Address check ;DPR020a%p BCC 21$ ; If CC, okay ;DPR020 q ;DPR02007r MOV (SP)+, R1 ; Restore I/O packet address ;DPR020J<s BR FUNBAD ; Otherwise part not in virtual space ;DPR020t21$: ;DPR020 :u CALL $RELOC ; Calculate parameters for $BLXIO ;DPR020v; ;DPR020w; Context: ;DPR020>x; R1 := Physical addess of table in 32-word blocks ;DPR0200y; R2 := Offset of table, bias APR6 ;DPR020z; ;DPR0207{ MOV #5, R0 ; Length of extent limit table ;DPR0205| SUB #20000, R2 ; Change into APR5 offset ;DPR020R6} MOV KISAR6, R3 ; Physical address of UCBX ;DPR020I~ MOV #APR6.BASE+X.XDAT, R4 ; Offset of table in UCBX, bais APR6 ;DPR020:00MgygzgM{gfffDATA CALL $BLXIO ;DPR020L7 MOV (SP)+, R1 ; Restore I/O packet address ;DPR020 ;P ; Note:o8; DC$PAR bit is ignored by following byte instruction.;2= BICB #VALID, APR6.BASE+X.CSTS ; Clear original status bits ; BISB I.PRM+6(R1), APR6.BASE+X.CSTS ; Set new status bitsx ;JRK336R .IFT ;CHEDFR ;JRK336 ;JRK336DC BITB #XC.DFR,(SP)+ ; See if defers were on in old setup ;JRK336V1 BEQ FUNEXT ; If EQ, no, continue on ;JRK336aJ BITB #XC.DFR,APR6.BASE+X.CSTS; Are they turned off in new setup ;JRK3361 BNE FUNEXT ; If NE, no, continue on ;JRK336H BITB #X2.DEA,APR6.BASE+X.CST2; Are deferred CEDs being purged ;JRK336? BNE FUNEXT ; If NE, yes, don't need to start again ;JRK336+0 CALL ELMCED ; Purge deferred CEDs ;JRK336* BCC 30$ ; If CC, successful ;JRK3367 BVC 40$ ; If VS, allocation failure, crash ;JRK336e6 BPT ; Failure here will cause corruption ;JRK336;30$: BVS 40$ ; If VS, no deferreds at all, exit ;JRK336S= TST (SP)+ ; Return to $QOPDN. DFRIOC will handle ;JRK336X ;JRK336i .ENDC ;CHEDFR ;JRK336, ;JRK336 40$: RETURN ;JRK3363 + .SBTTL + DC$RSB - Read statistics bufferr;i ; Passed:; UCBX mapped in APR6f; ; R1 -> I/O packet.; I.PRM+6 -> User buffer (virtual address)$; I.PRM+10 -> Size of user buffer;3 ; Returned: ;r ; Action:a7; This function will return the contents of the cacher:; statistics buffer for a particular device. The caller5; must pass the address and length of his buffer in:; parameters 5 and 6 (respectively). The user's context9; is currently loaded, and $ACHCK is called to validatet8; the buffer. The buffer could be any size smaller or8; equal to the stats buffer. It should NOT be allowed3; to be larger, since this will allow him to read 8; either the rest of secondary pool, or off the end of8; secondary pool (into a task, common, or non-existent:; memory). Nonexistent memory (odd addresses) in kernel; mode spells instant doom. ;u9; $BLXIO will be used to teleport the stats buffer froms(; secondary pool to the user's buffer.;s@; NOTE: $ACHCK is used instead of $CKBFx because the operation9; will be completed immediately (while the user remains 8; loaded). $RELOC is called to create the context for ; $BLXIO (address doubleword).;y<FUNRSB: TST APR6.BASE+X.CSBA ;Statistics buffer available?. BEQ FUNPRI ;No buffer if EQ; return error+ MOV R1,-(SP) ;Save the packet's address 7 MOV I.PRM+6(R1),R0 ;Load the user's virtual address 6 MOV I.PRM+10(R1),R1 ;Load the user's buffer length1 CALL $ACHCK ;Address check loaded user spaceB/ BCC 5$ ;Address check failed, return errorm& MOV (SP)+,R1 ;Get packet's address1 JMP FUNBAD ;Return "bad parameters" ;JRK3305$: ;**-13 CALL $RELOC ;Now create the address doublewords. MOV R1, R3 ;Prepare parameters for $BLXIO  MOV R2, R4n+ MOV (SP),R1 ;Get back packet's addressd7 MOV I.PRM+10(R1),R0 ;Get the count of bytes to movea2 CMP R0,#S.SIZE ;User want more than available?% BLOS 10$ ; If LOS, no, accept ith& MOV #S.SIZE,R0 ;Else enforce limit10$:- MOV R0,I.PRM+2(R1) ;Return the byte count;: MOV APR6.BASE+X.CSBA,R1 ;Get statistics buffer APR bias+ MOV #APR5.BASE,R2 ;Set the displacementR0 CALL $BLXIO ;Transfer the statistics buffer( MOV (SP)+,R1 ;Packet's address to R11 JMP FUNEXT ;Proceed to common exit ;JRK330  ;**-1P, .SBTTL + DC$CSB - Clear statistics buffer;,; This function maps the statistics buffer%; (if any) and fills it with nulls.t;8; The statistics buffer is allocated in secondary pool4; and is a single 32-word block of 16 doublewords.;B5; NOTE: Access to the UCBX is lost by this routine!,6; There is currently no reason to save (reload) this/; address since the UCBX is no longer needed.t;d FU00MguggccccNCSB:>; MOV APR6.BASE+X.CSBA,KISAR6 ;Map statistics buffer in APR60; BEQ 20$ ;Ooops, statistics buffer not here;&; MOV #APR6.BASE,R0 ;Point R0 to it.; MOV #S.SIZE/4,R3 ;Count of cells to clear);10$: CLR (R0)+ ;Clear out first wordt&; CLR (R0)+ ;Clear out second word%; SOB R3, 10$ ;More to clear out?B; +;20$: BR FUNEXT ;Proceed to common exiti  .SBTTL Partition routines= .SBTTL + VALPCB - Validate a partition given a PCB addresse;d ; Passed:; R0 -> PCB to validate+;A ; Returned:a; CC: PCB is valid; CS: PCB is not valid;i2VALPCB: MOV R1,-(SP) ; Work register (main PCB)* MOV R2,-(SP) ; Work register (sub PCB)% MOV #$PARHD,R1 ; Get PCB listheadr+10$: MOV (R1),R1 ; Get a main partitions  BEQ 40$ ; End of list if EQ4 MOV R1,R2 ; Use R2 to run through subpartitions/20$: MOV P.SUB(R2),R2 ; Get the next sub PCB BEQ 10$ ; Isn't one if EQ! CMP R0,R2 ; Does this match? ' BNE 20$ ; If NE, no - try next oneA8 BIT #PS.COM, P.STAT(R2) ; Is this a common partition? BEQ 40$ ; If EQ, no4 BIT #P2.CHE,P.ST2(R2) ;Is this a cache partition?3 BEQ 40$ ;No if EQ; don't activate caching thenB0 TST (PC)+ ; Match in PCB address, return CC#40$: SEC ; No match, return CS MOV (SP)+,R2U MOV (SP)+,R1u  RETURNs 0  .SBTTL Cache control routines2  .SBTTL + CHEDAC - Deactivate cache for a device ;, ; Passed:h ; UCBX mapped in APR6; ;E ; Action:x:; This routine will deactivate caching for a device with<; caching activated. Deactivation involves the marking of9; the UCBX accordingly, and the "detaching" of the UCBX'>; from the cache partition (The resident mapped count in the:; PCB [P.RMCT] is used by the cacher as the mechanism to&; lock down cache data partitions.).;R8CHEDAC: BICB #XC.ACT, APR6.BASE+X.CSTS ; Deactivate it ;JRK330h: MESAG$ DEAMSG,25.,20,<<14,#140000+X.DNAM,4>> ;JRK330> MOV APR6.BASE+X.CPCB, R0 ; Get the PCB address of cache par/ DECB P.RMCT(R0) ; Detach from the partitionv0 BNE 5$ ; If NE, other devices still caching: BIC #P2.LMA, P.ST2(R0) ; Otherwise this is the last one5$:e' MOV R1, -(SP) ; Save packet addressC9 MOV APR6.BASE+X.CSBA, R1 ; Get cache statistics buffer   BEQ 10$ ; None if EQ!3" ADD #P.CSBA, R0 ; Calculate address of listhead # CALL $GTSPK!$ BCC 6$ ; If CC, sanity check<% BPT&6$:A)' TST (R0)+ ; Is list empty? ;DPR015C"( BNE 7$ ; If NE, no ;DPR0157) CLR (R0) ; P.DPCB must be null when REMing ;DPR015v*7$: ;DPR015-+ MOV R1, R0 ; Prepare parameter to $DESECT,:-SECSIZE= /100 ; Size of CSB in secpol blocks0. MOV #SECSIZE, R1 ; Set size for deallocation3/ CALL $DESEC ; Deallocate secondary pool buffern041 CLR APR6.BASE+X.CSBA ; Initialize the CSB pointer2.310$: MOV (SP)+, R1 ; Pop I/O packet address 4 RETURN5 06 .SBTTL + CHEACT - Activate cache for a device7;B 8; Passed:N9; UCBX mapped in APR6(:; ;; Returned:e<; R0 := Contents lostv=;$ >; Action:P;?; This routine will attempt to activate the cache for theE>@; device. If the UCBX specifies a PCB, it will be validated%A; if it is valid then the map countn@B; of the partition (P.RMCT) will be incremented, and the cacheC; activated for the device.tD;B;ECHEACT: BITB #XC.ACT,APR6.BASE+X.CSTS ;Already activated?,F BNE 30$ ;Yes if NE; don't do this againG/H MOV APR6.BASE+X.CPCB,R0 ;Get the PCB addressp/I BEQ 30$ ;None present if EQ; can't startuptJ(K CALL VALPCB ;Validate the partition,L BCS 30$ ;Failed if CS; skip the startupM:M MESAG$ ACTMSG,26.,20,<<14,#140000+X.DNAM,4>> ;JRK330M ;JRK330t0N INCB P.RMCT(R0) ;Attach us to this partition:O BIS #P2.LMA, P.ST2(R0) ; Don't let partition be removedP2Q MOV R0, R3 ;Save PCB address in safe registerR%S MOV R1,-(SP) ;Save packet address;#T M00MgygzgM{gfffDATAOV #SECSIZE,R1 ;Set size in R1.)U CALL $ALSEC ;Allocate secondary poolQV BCS 25$ ;Couldn't if CSW;t X; Context:Y; R0 -> Newly allocated blockiZ;C[ MOV R0,APR6.BASE+X.CSBA ;Set the cache statistics buffer address.<\ MOV #</2>,R1 ;Size for initialization to zeroes'] MOV KISAR6,-(SP) ;Save UCBX mappingr%^ MOV R0,KISAR6 ;Map the new buffer')_ MOV #APR6.BASE,R0 ;Set up its addressR)`23$: CLR (R0)+ ;Initialize the buffera SOB R1, 23$ ;loopb,c MOV R3, R0 ;Prepare parameter to $QSPIF6d ADD #P.CSBA, R0 ;Calculate the stat block listhead-e MOV KISAR6, R1 ;Point at new block to add0/f CALL $QSPIF ;Add it to the end of the listBg-h MOV R5, APR6.BASE+S.UCB ;Point back to UCB.)i MOV (SP)+,KISAR6 ;Reload UCBX mappingaj25$:/k MOV (SP)+,R1 ;Get back saved packet addressnk .IFDF CHEDFR ;JRK330k ;JRK330PJk BICB #X2.DEA,APR6.BASE+X.CST2; Indicate no cache purge going on ;JRK330k ;JRK330ok .ENDC ;CHEDFR ;JRK330pk ;JRK330Fl BISB #XC.ACT,APR6.BASE+X.CSTS ;Cache is now activated and PCB boundm(n30$: RETURN ;All done in validationo -p .SBTTL + CHEPUR - Purge cache for a device.q;S r; Passed:a s; R5 -> UCBMt;P u; Returned:ov; All registers preservedM6v; CC: All extents successfully eliminated ;JRK330@v; CS: At least one deferred extent was found in list ;JRK330w;.Cx; This routine will delete the cache partition of all extents fory; the specified device.Kz;O{; NOTE: Extents with I/O in progress will be deleted when during internal I/Od|; completion.};RC~; NOTE: This routine is always entered with mapping into the UCBXc9; in APR6. It requires access to both the UCBX and the=; partition's pool area. The UCBX should be restored priort ; to exit.;i>CHEPUR: CLR -(SP) ; Clear the deferred extent flag ;JRK330 ;JRK330: MESAG$ PURMSG,27.,20,<<14,#140000+X.DNAM,4>> ;JRK330 ;JRK330 J MOV APR6.BASE+X.CCED, R0 ; Get the first extent in the LBN list ;JRK3302 BEQ 60$ ; If EQ, there are none at all ;**-1* CALL MAPPAR ; Map the cache partition30$: ;JRK330  .IFDF CHEDFR ;JRK330 ;JRK3307 SEC ; Assume this will be deferred extent ;JRK330 ? BITB #ES.WDF,E.STAT(R0) ; Is this a deferred extent ;JRK330e# BEQ 40$ ; If EQ, no ;JRK330 9 ROL (SP) ; Indicate a deferred extent exists ;JRK330 2 BR 50$ ; Skip the delete of this one ;JRK330 ;JRK330s .ENDC ;CHEDFR ;JRK330 ;JRK330 240$: CALL FRECED ; Eliminate the CED ;JRK330 ;**-1i@50$: MOV E.LNXT(R0),R0 ; Get next extent in LBN list ;JRK3309 BNE 30$ ; If NE, got another - keep on looping ;**-1e! CALL MAPUCB ; Remap the UCBX.>60$: ROR (SP)+ ; Pop the deferred extent indicator ;JRK330 RETURN ;JRK330P ;JRK330r .PAGE ;JRK3303 .SBTTL WRITE DEFERRED I/O OPERATIONS ;JRK330@ .SBTTL + ELMCED - Write data in deferred CED to disk ;JRK330; ;JRK336W; ELMCED - Routine to initiate first deferred extent to disk for deactivation ;JRK336 ; ;JRK336; Inputs: ;JRK336;); R1 - I/O packet address ;JRK336e+; R5 - UCB address of device ;JRK336; Outputs: ;JRK336E; CC - I/O packet queued to driver to write data in extent ;JRK336 D; VC - Deferred extent found and original I/O bound over ;JRK336H; VS - No deferreds found, original I/O can be sent to $IOFIN ;JRK336J; CS - Original I/O should be backed up due to no primary pool ;JRK336A; for duplicate I/O packet allocation, because purge ;JRK3363@; already in effect, or deferred CEDs exist but are ;JRK336<; being written out as part of age list dropoff ;JRK3368; VC - Error due to deferred still existing ;JRK3364; VS - Allocation error for I/O packet ;JRK336; ;JRK336; ;JRK336S; This routi00Mguggccccne assumes that it is being called to eliminate all deferred ;JRK336S; CEDs for this device. A single internal I/O packet is created and the ;JRK336 U; first deferred CED is written to disk with an I/O completion routine that ;JRK336eR; finds the next in line and issues a write for that CED. This process ;JRK336T; continues to look for other deferred CEDs that are not in the process of ;JRK336O; being written out until no more are found. During this time, the ;JRK3366Y; "defers being purged" bit X2.DEA is set to indicate the process is in effect. ;JRK336 U; During this time, no write operations are allowed if any CED overlaps the ;JRK336iX; region and reads are allowed for virtual operations even if that support was ;JRK336U; turned off. Setting X2.DEA may be from a "SET characteristics" operation ;JRK336eV; or from a total deactivation request. In either case, this routine should ;JRK336T; only be activated once. Any further requests should simply return since ;JRK336T; the first invocation will cause the final desired action and a parallel ;JRK336R; operation with a new I/O packet will set up a race condition to clear ;JRK336U; X2.DEA in the final I/O completion routine. This could leave a deferred ;JRK336uQ; CED in the process of being written out with the bit cleared. If a ;JRK336T; read request came through in that case, it could go to the disk instead ;JRK336U; the correct extent. If a deferred extent is found and a duplicate packet ;JRK336V; allocated, the original I/O packet address is bound over to the completion ;JRK336U; routine for the final deallocation of the cache and the completion of the ;JRK336DT; original I/O. If this routine returns with a CS or a CC/VS combination, ;JRK336H; the original I/O should be handled in the appropriate way. ;JRK336; ;JRK336m .IFDF CHEDFR ;JRK336 ;JRK336aELMCED: ;JRK336= MOV KISAR6,-(SP) ; Save mapping register to UCBX ;JRK336J6 MOV R5,-(SP) ; Save original UCB address ;JRK3362 MOV R1,-(SP) ; Save R1 across routine ;JRK336 ;JRK336aN BITB #X2.DEA,APR6.BASE+X.CST2; See if deferred purge already active ;JRK3368 BEQ 30$ ; If EQ, no, go look for a deferred ;JRK336 ;JRK336O510$: SEC ; Assume I/O must be backed up ;JRK336420$: MOV (SP)+,R1 ; Restore original R1 ;JRK336; MOV (SP)+,R5 ; Restore the original UCB address ;JRK336R7 MOV (SP)+,KISAR6 ; Restore mapping to UCBX ;JRK336V RETURN ;JRK336U ;JRK336N30$: MOV APR6.BASE+X.CCED, R0 ; Get the first extent in the LBN list ;JRK3364 BEQ 55$ ; If EQ, no extents to process ;JRK3369 CLR -(SP) ; Save flag for unusable deferreds ;JRK336 3 CALL MAPPAR ; Map the cache partition ;JRK336 E40$: BITB #ES.WDF,E.STAT(R0) ; See if this one is deferred ;JRK336e# BEQ 50$ ; If EQ, no ;JRK336RF BITB #ES.WIP,E.STAT(R0) ; Is the extent already in progress ;JRK336* BEQ 60$ ; If EQ, no, use it ;JRK3367 MOV R0,(SP) ; Store CED for flag purposes ;JRK336A;50$: MOV E.LNXT(R0),R0 ; Point to the next one ;JRK3360 BNE 40$ ; Go back and check it out ;JRK3369 TST (SP)+ ; See if any transition deferreds ;JRK33634 BNE 10$ ; If NE, there, cause a backup ;JRK336 ;JRK336D455$: MOV (SP)+,R1 ; Restore original R1 ;JRK336; MOV (SP)+,R5 ; Restore the original UCB address ;JRK336R7 MOV (SP)+,KISAR6 ; Restore mapping to UCBX ;JRK336$+ CLC ; Indicate no deferreds ;JRK336S SEV ; ;JRK336 RETURN ;JRK336M ;JRK336o ;JRK336 <60$: TST (SP)+ ; Get rid of excess stack context ;JRK336A MOV E.UCB(R0),R5 ; Get UCB address from CED for write ;JRK336$: CALL $CRDFR ; Allocate and fill in I/O packet ;JRK3361 BCS 70$ ; If CS, allocation failure ;JRK336;J MOV KINAR5,I.IOSB+2(R1) ; Set up internal I/O completion address;JRK336+ MOV #DFRIOC!1,I.IOSB+4(R1) ; ;JRK336KB BISB #ES.00MgygzgM{gfffDATAWIP,E.STAT(R0) ; Indicate a write-in-progress ;JRK336C INCB E.PCNT(R0) ; Tie down extent to prevent going away ;JRK336 B MOV (SP),I.AADA+2(R1) ; Put original I/O packet in fake ;JRK336 ;JRK336)M MESAG$ DFRMSG,28.,,<,> ;JRK336  ;JRK336t .IF DF CHESAN ;JRK336l ;JRK336K7 CALL .CKSAN ; See if sanity buffers match ;JRK336m ;JRK3366 .ENDC ;JRK336 ;JRK336: CALL $DRQRQ ; Initiate the I/O for the extent ;JRK336 ;JRK336T0 MOV (SP)+,R1 ; Restore original R1 ;JRK336; MOV (SP)+,R5 ; Restore the original UCB address ;JRK336a7 MOV (SP)+,KISAR6 ; Restore mapping to UCBX ;JRK336.N BISB #X2.DEA,APR6.BASE+X.CST2; Indicate starting to purge deferreds ;JRK336+ CLC ; Indicate no deferreds ;JRK336J RETURN ;JRK336S ;JRK336m470$: MOV (SP)+,R1 ; Restore original R1 ;JRK336; MOV (SP)+,R5 ; Restore the original UCB address ;JRK336h7 MOV (SP)+,KISAR6 ; Restore mapping to UCBX ;JRK336V0 SEV ; Indicate allocation failure ;JRK336 RETURN ;JRK336i ;JRK330KG .SBTTL + DFRIOC - I/O completion routine for deferred extent ;JRK330X; ;JRK330U; DFRIOC - Routine to complete processing after a deferred extent has been ;JRK330K"; written to disk ;JRK330; ;JRK330; Inputs: ;JRK330o); R3 - I/O packet address ;JRK330s; ;JRK330DFRIOC: ;JRK3309 MOV I.UCB(R3),R5 ; Get UCB address of device ;JRK330 7 MOV I.AADA(R3),R0 ; Point to affected CED ;JRK330J ;JRK330J6 CALL MAPPAR ; Map to the cache partition ;JRK330 ;JRK3303M MESAG$ DFRCOM,29.,,<,> ;JRK330e ;JRK330nD BICB #ES.WIP,E.STAT(R0) ; Clear the write-in-progress bit ;JRK330G BICB #ES.WDF,E.STAT(R0) ; Indicate extent no longer deferred ;JRK330> DECB E.PCNT(R0) ; Untie the extent for elimination ;JRK330; MOV E.LNXT(R0),-(SP) ; Save pointer to next CED ;JRK3303 ;JRK330c@ CALL FRECED ; Delete the CED if not tied down still ;JRK330 ;JRK330 3 MOV (SP)+,R0 ; Get address of next CED ;JRK330<,10$: BEQ 30$ ; If EQ, all done ;JRK330H BITB #ES.WDF,E.STAT(R0) ; Is it deferred or waiting for other ;JRK330 BNE 20$ ;JRK3300<15$: MOV E.LNXT(R0),R0 ; Get address of next CED ;JRK330. BR 10$ ; Go back to check it out ;JRK330 ;JRK330;20$: ;JRK330,C BITB #ES.WIP,E.STAT(R0) ; Is this already being written ;JRK336C, BNE 15$ ; If NE, yes, skip it ;JRK336 ;JRK336 M MESAG$ DFRMSG,28.,,<,> ;JRK330Q ;JRK330o> MOV R0,I.AADA(R3) ; Keep pointer to CED in packet ;JRK330 ;JRK3300< INCB E.PCNT(R0) ; Tie down the CED for writeout ;JRK330D MOV E.LBNL(R0),I.PRM+P5(R3) ; Get LSP of LBN to write to ;JRK330< BISB E.LBNL-1(R0),I.PRM+P4(R3) ; Get MSP of LBN ;JRK330 ;JRK330;? MOVB E.SIZE(R0),R2 ; Get size of transfer in blocks ;JRK330e0 ASH #9.,R2 ; Turn that into bytes ;JRK330@ MOV R2,I.PRM+P2(R3) ; Put byte value into I/O packet ;JRK330 ;JRK330J4 MOV R3,R4 ; Save address of I/O packet ;JRK3307 MOV #APR6.BASE,R2 ; Get APR6 displacement ;JRK330)? MOV E.PHYA(R0),R1 ; Get APR bias of start of buffer ;JRK330R@ CALL $MPPHY ; Map to physical address if NPR device ;JRK330: MOV R1,I.PRM+P1.1(R4) ; Move MSP to I/O packet ;JRK330: MOV R2,I.PRM+P1.2(R4) ; Move LSP to I/O packet ;JRK3307 MOV R4,R1 ; Restore pointer to I/O packet ;JRK3303 ;JRK3302 .IF DF CHESAN ;JRK336a ;JRK336  CALL .CKSAN ;JRK336S ;JRK336c .ENDC ;JRK336 ;JRK336d; CALLR $DRQRQ ; Initiate the I/O for the extent ;JRK330o ;JRK330KH30$: MOV I.AADA+2(R3),-(SP) ; Sa00MgNggccccve original I/O packet address ;JRK330= CALL CHEDEP ; Deallocate the internal I/O packet ;JRK330V* CALL MAPUCB ; Map the UCBX ;JRK330F BICB #X2.DEA,APR6.BASE+X.CST2; Indicate done purging cache ;JRK336? MOV (SP),R3 ; Get back original I/O packet address ;JRK336JA MOV I.PRM+4(R3),R3 ; Get function code for this purge ;JRK336N: CMP #DC$SET,R3 ; Was it due to a SET function ;JRK336< BEQ 40$ ; If EQ, yes, skip deactivation of cache;JRK3361 CALL CHEDAC ; Deallocate the cache ;JRK330/740$: MOV (SP)+,R3 ; Get original I/O packet ;JRK330h@ CALLR IOFIN ; Go get status codes and return packet ;JRK330 ;JRK330. .ENDC ;CHEDFR ;JRK330n g! .IF DF CHEDBG ;Debugging aids 4 .SBTTL *** DEBUG *** Module contains data strings!STCMSG: .ASCIZ <15><12>"IO.STC"oCHEMSG: .ASCIZ " - VV$CHE"SETMSG: .ASCIZ " - DC$SET"JATTMSG: .ASCIZ <15><12>"DCM -- [DCCTL] PURGE FAILURE - CED ATTACHED"<15> ;JRK330 JDFRMSG: .ASCIZ <15><12>" - Deferred extent written to disk" ;JRK330IDFRCOM: .ASCIZ <15><12>"Deferred extent I/O write completion" ;JRK330 =DEAMSG: .ASCIZ <15><12>"Cache being deactivated" ;JRK330J<ACTMSG: .ASCIZ <15><12>"Cache being activated" ;JRK3309PURMSG: .ASCIZ <15><12>"Cache being purged" ;JRK330< .EVEN .ENDC ; .IF DF CHEDBG .ENDC ; .IF DF D$$CHE .END"JATTMSG: .ASCIZ <15><12>"DCM -- [DCCTL] PURGE FAILURE - CED ATTACHED"<15> ;JRK330 JDFRMSG: .ASCIZ <15><12>" .TITLE DRMKT> .IDENT /08.00/;N; COPYRIGHT (C) 1987 BY.!; DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;D>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; D. N. CUTLER 5-SEP-73C ; ; PREVIOUSLY MODIFIED BY:U ;H; B. S. MCCARTHY; J. W. BERZLE; C. B. PETROVIC; J. R. KAUFFMAN;C; MODIFIED BY:; ; J. W. BERZLE 6-NOV-86 08.002;!-; JWB186 -- SAVE UIC AROUND CALL TO $CRCTX ;0 ; MARK TIME AND RUN DIRECTIVES ;!; MACRO LIBRARY CALLSR";#$ .MCALL CLKDF$%& .IF DF N$$DIRF'( .MCALL LNMDF$))* LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETSY+, .ENDC ;DF N$$DIRE-5. CLKDF$ ;DEFINE CLOCK QUEUE CONTROL BLOCK OFFSETS/0;+1; **-$DRMKT-MARK TIMEH2; K3; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DECLARE A SIGNIFICANT EVENT AT AC&4; SPECIFIED INTERVAL FROM INSSUANCE.5;N6; DPB FORMAT:!7; $8; WD. 00 -- DIC(23.),DPB SIZE(5.).89; WD. 01 -- EVENT FLAG NUMBER OF EVENT FLAG TO BE SET.&:; WD. 02 -- TIME INTERVAL MAGNITUDE.";; WD. 03 -- TIME INTERVAL UNITS.&<; WD. 04 -- AST ENTRY POINT ADDRESS.=;TE>; IF AN EVENT FLAG IS SPECIFIED, THEN IT IS CLEARED AT ISSUANCE ANDL-?; SET AT THE TIME OF THE SIGNIFICANT EVENT. @;RAA; IF AN AST ENTRY POINT IS SPECIFIED, THEN AN ASYNCHRONOUS TRAPC@B; WILL OCCUR AT THE TIME OF THE SIGNIFICANT EVENT. PS, PC, THE>C; DIRECTIVE STATUS WORD, AND THE SPECIFIED EVENT FLAG NUMBER<D; ARE PUSHED ONTO THE TASK STACK WHEN THE AST IS EFFECTED.E; F; INPUTS: G;IH; R0=EVENT FLAG MASK WORD.I; R1=EVENT FLAG MASK ADDRESS. ;J; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ,K; R3=ADDRESS OF THE THIRD WORD IN THE DPB.1L; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK..M; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.N;S<O; OUTPUTS: (DIRECTIVE STATUS AND PS WORD RETURNED TO TASK)P;N/Q; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E(R; DIRECTIVE STATUS OF +1 IS RETURNED.!S; C=1 IF DIRECTIVE IS REJECTED. <T; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF INSUFFICIENT6U; CORE IS AVAILABLE TO ALLOCATE CLOCK QUEUE ENTRY.V;-W X .ENABL LSBO2Y$DRMKT::MOV -2(R3),-(SP) ;SAVE EVENT FLAG NUMBER-Z MOV R1,-(SP) ;SAVE EVENT FLAG MASK ADDRESS 4[ BIC #1,R1 ;CLR GRP GLOBAL EFN 2ND WORD INDICATOR!\ BIC R0,(R1) ;CLEAR EVENT FLAGI#] MOV R0,R4 ;SAVE EVENT FLAG MASKO,^ CALL $CVRTM ;CONVERT TIME TO CLOCK TICKS-_ MOV R0,-(SP) ;SAVE HI00NgygzgM{gfffDATAGH ORDER PART OF TIMES,` MOV R1,-(SP) ;SAVE LOW ORDER PART OF TIME%a MOV R4,-(SP) ;SAVE EVENT FLAG MASKE)b CLR R4 ;SET TYPE OF CLOCK QUEUE ENTRYAcde .IF DF S$$LIBf,g MOV (R3),R2 ;GET AST ENTRY POINT ADDRESS2h CALL $CALTA ;CALCULATE PROPER ADDRESS TO STORE-i MOV R2,-(SP) ;SAVE AST ENTRY POINT ADDRESS jk .IFFAl/m MOV (R3),-(SP) ;SAVE AST ENTRY POINT ADDRESSTno .ENDCpqrs .IF DF A$$CNTt5u CALL $ALCLK ;ALLOCATE A CLOCK QUEUE CONTROL BLOCK( v BR 25$ ;wx .IFFFy z BR 20$ ;{| .ENDC}~;+; **-$DRRUN-RUN TASK;NG; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO GENERATE A CLOCK QUEUE ENTRYDB; TO CAUSE A TASK TO BE REQUESTED AT A SPECIFIED DELTA TIME FROM?; ISSUANCE AND TO OPTIONALLY REPEAT THE REQUEST PERIODICALLY. ;N; DPB FORMAT: ;&; WD. 00 -- DIC(17.),DPB SIZE (11.).&; WD. 01 -- FIRST HALF OF TASK NAME.'; WD. 02 -- SECOND HALF OF TASK NAME.A?; WD. 03 -- PARTITION NAME-NOT SUPPORTED BUT MUST BE PRESENT.?; WD. 04 -- PARTITION NAME-NOT SUPPORTED BUT MUST BE PRESENT.$A; WD. 05 -- REQUEST PRIORITY-NOT SUPPORTED BUT MUST BE PRESENT.N; WD. 06 -- REQUEST UIC.#; WD. 07 -- DELTA TIME MAGNITUDE.T; WD. 10 -- DELTA TIME UNITS. ,; WD. 11 -- RESCHEDULE INTERVAL MAGNITUDE.(; WD. 12 -- RESCHEDULE INTERVAL UNITS.; ; INPUTS:I;)7; R0=ADDRESS OF THE TCB OF THE OF THE TASK TO BE RUN.=; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO BE RUN.O;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.T0; R3=ADDRESS OF THE PARTITION NAME IN THE DPB.1; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. .; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;-7; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; /; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. (; DIRECTIVE STATUS OF +1 IS RETURNED.!; C=1 IF DIRECTIVE IS REJECTED. <; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF INSUFFICIENT6; CORE IS AVAILABLE TO ALLOCATE CLOCK QUEUE ENTRY.=; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF AN ATTEMPT ISO4; MADE TO ACTIVATE A TASK WHOSE NAME BEGINS WITH-; "..." (IF EXECUTIVE-LEVEL DISPATCHING).O:; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF A NONPRI-3; VILEGED TASK SPECIFIES ANOTHER UIC (IF MULTI-D; USER PROTECTION).C;T;- MAP6=140000$DRRUN:: ; .IF DF R$$DSP8 CMP T.NAM(R0),#^R... ;MULTI-USER TASK NAME SPECIFIED? BEQ 40$ ;IF EQ YES, ILLEGALL .ENDC. MOV R0,R5 ;SAVE TCB ADDRESS OF TASK TO RUN* ADD #6,R3 ;POINT TO REQUEST UIC IN DPB# CLR -(SP) ;SET DUMMY EFN NUMBER .IF DF M$$MUP& MOV (R3)+,R1 ;PICK UP SPECIFIED UIC MOV R3,-(SP) ;SAVE R34 CALL $UISET ;ESTABLISH DEFAULT AND CURRENT UIC'S MOV (SP)+,R3 ;RESTORE R3T1 BCS 30$ ;IF CS NONPRV TASK SPECIFIED DIFF UICN! MOV R1,-(SP) ;SAVE CURRENT UIC .IFFM& MOV (R3)+,-(SP) ;SAVE SPECIFIED UIC .ENDC2 CALL $CVRTM ;CONVERT DELTA TIME TO CLOCK TICKS- MOV R0,-(SP) ;SAVE HIGH ORDER PART OF TIMEP, MOV R1,-(SP) ;SAVE LOW ORDER PART OF TIME- MOV #C.SSHT,R4 ;ASSUME SINGLE SHOT REQUEST3 MOV (R3)+,R0 ;ANY RESCHEDULE INTERNAL SPECIFIED?( BEQ 10$ ;IF EQ NOU5 CMP -(R3),-(R4) ;ADJUST DPB ADDRESS AND ENTRY TYPE+; CALL $CVRTM ;CONVERT RESCHEDULE INTERNAL TO CLOCK TICKSF110$: MOV R0,-(SP) ;SAVE HIGH ORDER PART OF TIME., MOV R1,-(SP) ;SAVE LOW ORDER PART OF TIME920$: CALL $ALCLK ;ALLOCATE A CLOCK QUEUE CONTROL BLOCKM .IF DF A$$CNT) MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGR+ MOV $TKTCB,R1 ;LOCATE CURRENT TASK'S TCB#- MOV T.ACN(R1),KISAR6 ;MAP ACCOUNTING BLOCK(' BEQ 24$ ;IF EQ, NO ACCOUNTING BLOCKD/22$: CMPB #BT.UAB,@#B.TYP+140000 ;IS IT A UABD BEQ 23$ ;IF EQ YES7 MOV @#B.PNT+140000,KISAR6 ;MAP NEXT ACCOUNTING BLOCK BR 22$ ;/23$: INCB @#B.USE+140000 ;INCREMENT USE COUNT.924$: MOV KISAR6,C.UAB(R0) ;PUT UAB ADDRESS IN CLQ BLOCK - MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPING25$: ;MERGE POI00NgOggccccNT .ENDC: MOV (SP)+,C.RSI(R0) ;INSERT AST ADDRESS/LOW PART OF RSI: MOV (SP)+,C.RSI+2(R0) ;INSERT EFN MASK/HIGH PART OF RSI0 MOV (SP)+,R2 ;RETRIEVE DELTA TIME TICKS COUNT MOV (SP)+,R1 ;Y .IF NDF N$$DIR" MOV (SP)+,C.UIC(R0) ;INSERT UIC .IFF ;NDF N$$DIRC& TST R4 ;IS THIS MARKTIME DIRECTIVE BNE 26$ ;IF NE, NO/ MOV (SP)+,C.UIC(R0) ;INSERT EFN MASK ADDRESSA BR 29$ ;BR AROUND&26$: MOV (SP)+,R3 ;GET UIC OFF STACK MOV R1,-(SP) ;SAVE R1 MOV $TKTCB,R1 ;GET TI: UCBV& MOV T.CTX(R1),R1 ;GET CONTEXT BLOCK  BNE 28$ ;IF NE, THERE IS ONE, MOV R0,-(SP) ;SAVE POINTER TO CLOCK BLOCK. CLR R0 ;INDICATE NO DDS FOR CREATE CONTEXT% MOV R3,-(SP) ;SAVE UIC ;JWB186* MOV R2,-(SP) ;SAVE LOW ORDER TIME VALUE% CALL $CRCTX ;CREATE CONTEXT BLOCKS& BCS 50$ ;IF CS, ALLOCATION FAILURE- MOV (SP)+,R2 ;RESTORE LOW ORDER TIME VALUES  MOV R3,R1 ;PUT CTX INTO R1(  MOV (SP)+,R3 ;RESTORE UIC ;JWB186,  MOV (SP)+,R0 ;RESTORE CLOCK BLOCK POINTER< 28$: MOV R1,C.CTX(R0) ;PUT CONTEXT BLOCK INTO CLOCK BLOCK)  MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGS#  MOV R1,KISAR6 ;MAP CONTEXT BLOCK - INCB C.REF+MAP6 ;INCREMENT REFERENCE COUNT,1 MOV R3,C.CUIC+MAP6 ;PUT UIC INTO CONTEXT BLOCK $ MOV (SP)+,KISAR6 ;RESTORE MAPPING MOV (SP)+,R1 ;RESTORE R1S5 BIS #100000,R4 ;INDICATE SCHEDULE REQUEST WITH DDSO29$: .ENDC ;DF N$$DIRR- MOVB (SP)+,C.EFN(R0) ;INSERT EFN/ZERO BYTEC' CALLR $CLINS ;INSERT IN CLOCK QUEUEB .IF DF M$$MUP)30$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONK  .ENDC!"# .IF DF R$$DSP$3%40$: DRSTS D.RS7 ;MULTI-USER TASK NAME SPECIFIED+&' .ENDC()* .IF DF N$$DIR+',50$: DRSTS D.RS1 ;ALLOCATION FAILURE-. .ENDC ;DF N$$DIRO/0 1 .DSABL LSB+23 .ENDR1S5 BIS #100000,R4 ;INDICATE SCHEDULE REQUEST WITH DDSO29$: .ENDC ;DF N$$DIRR- MOVB (SP)+,C.EFN(R0) ;INSERT EFN/ZERO BYTEC' CALLR $CLINS ;INSERT IN CLOC .TITLE DRRAS  .IDENT /10.00/ ;E7; COPYRIGHT (C) 1987 BY DIGITAL EQUIPMENT CORPORATIONZ; ALL RIGHTS RESERVEDT1; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.M;,C ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDR; ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.R ;T ;G ; D. N. CUTLER 4-SEP-73F;T; PREVIOUSLY MODIFIED BY:F;B; T. M. MARTIN; B. S. MCCARTHY ; M. S. FOXT; J. M. LAWLER; -; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:A;; J. W. BERZLE; J. R. KAUFFMAN; B. S. MCCARTHY;M; MODIFIED BY:;L!; B. S. MCCARTHY 5-JAN-86 10.00I; 5; BM378 -- CORRECT MAPPING ON NON-I/D SYSTEMS WHENS,; RECEIVE DIRECTIVES RETURN WITH SUCCESS.; (ALSO, MOVE ERROR CONDITIONS UP TO FRONT-; [THE ONLY PLACE THEY'RE REFERENCED] SO40; THEY CAN BE REACHED WITH BRANCHES INSTEAD"; OF BRANCHING AROUND JUMPS.);); RECEIVE AND SEND DIRECTIVES*;+; MACRO LIBRARY CALLSP,;E-. .MCALL HDRDF$,TCBDF$W/0 .IF DF N$$DIR12 .MCALL LNMDF$3)4 LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETSC56 .ENDC ;DF N$$DIR7'8 HDRDF$ ;DEFINE TASK HEADER OFFSETSS.9 TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS:;;+E<; **-$DRREC-(VARIABLE LENGTH) RECEIVE DATA AND RECEIVE DATA OR EXITE4=; **-$DRRCS-(VARIABLE LENGTH) RECEIVE DATA OR STOP>;RI?; THESE DIRECTIVES INSTRUCT THE SYSTEM TO DEQUEUE A DATA BLOCK FROM THEEK@; ISSUING TASK'S RECEIVE QUEUE. IF THE DIRECTIVE IS RECEIVE DATA OR EXIT,BJA; THEN A TASK EXIT WILL BE EFFECTED IF NO DATA IS QUEUED. IF THE DIREC-JB; TIVE IS RECEIVE OR STOP, THEN THE ISSUING TASK WILL BE SUSPENDED IF NOC; DATA IS QUEUED.TD; E; DPB FORMAT:NF;B8G; WD. 00 -- DIC(75., 77., OR 139.),DPB SIZE(4. OR 6.).?H; WD. 01 -- FIRST HALF OF SENDER TASK NAME OR 0 FOR ANY TASK.G.I; WD. 02 -- SECOND HALF OF SENDER TASK NAME.(J; WD. 03 -- ADDRESS OF RECEIVE BUFFER.AK; WD. 04 -- NUMBER OF WORDS TO RECEIVE (VARIABLE RECEIVE ONLY)00OgygzgM{gfffDATA.EL;E M; INPUTS: N;B;O; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. -P; R3=ADDRESS OF THE SECOND WORD IN THE DPB.E1Q; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.A.R; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.S;07T; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)1U;I/V; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.<W; DIRECTIVE STATUS OF +1 IS RETURNED IF DATA IS RECEIVED.;X; DIRECTIVE STATUS OF 'D.RS22' IS RETURNED IF NO DATA ISR"Y; RECEIVED ON RECEIVE OR STOP.!Z; C=1 IF DIRECTIVE IS REJECTED.E7[; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF NO DATAA2\; IS QUEUED IN TASK'S RECEIVE QUEUE ON RECEIVE ]; DATA.D<^; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE ISSUING4_; TASK IS AT AST STATE AND ISSUED THE RECEIVE OR`; STOP DIRECTIVE.4a; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF THE-b; ISSUING TASK IS A SLAVE TASK AND HAS AN ,c; ACTIVE GROUP GLOBAL EVENT FLAG CONTEXT-d; AND THE NEXT RECEIVE PACKET WILL CHANGE e; THE TASK'S GROUP NUMBER.f;E;g; THE FORMAT OF A FIXED LENGTH SEND PACKET IS AS FOLLOWS:Ih;D'i; WD. 00 -- RECEIVE QUEUE LINK WORD.U.j; WD. 01 -- FIRST WORD OF SENDER TASK NAME./k; WD. 02 -- SECOND WORD OF SENDER TASK NAME. 4l; WD. 03 THRU 15. -- CONTENTS OF THE SEND BUFFER..m; WD. 16. -- TI UCB ADDRESS OF SENDER TASK.n; WD. 17. -- CURRENT UIC 2o; WD. 18. -- FIRST WORD OF TARGET MU TASK NAME.3p; WD. 19. -- SECOND WORD OF TARGET MU TASK NAME.TAq; WD. 20. -- CONTEXT BLOCK POINTER (IF NAME DIRECTORY SUPPORT)r;H>s; THE FORMAT OF A VARIABLE LENGTH SEND PACKET IS AS FOLLOWS:t;.4u; WD. 00 -- RECEIVE BY REFERENCE QUEUE LINK WORD.<v; WD. 01 -- NUMBER DATA WORDS + 2 (FOR SENDER TASK NAME)..w; WD. 02 -- FIRST WORD OF SENDER TASK NAME./x; WD. 03 -- SECOND WORD OF SENDER TASK NAME.E,y; WD. 04 THRU N -- DATA WORDS TO BE SENT..z; WD. N+1 -- TI UCB ADDRESS OF SENDER TASK.{; WD. N+2 -- CURRENT UICD2|; WD. N+3 -- FIRST WORD OF TARGET MU TASK NAME.3}; WD. N+4 -- SECOND WORD OF TARGET MU TASK NAME.A~; WD. N+5 -- CONTEXT BLOCK POINTER (IF NAME DIRECTORY SUPPORT).; >; NOTE: FOR SYSTEMS WITH SECONDARY POOL SUPPORT, ALL PACKETS); FOR SENDS AND RECEIVES ARE ALLOCATEDE6; FROM THE SECONDARY POOL AND THE FIXED LENGTH SEND1; BECOMES A VARIABLE LENGTH SEND OF LENGTH 13.W; ;-; ; BM3788; * * * * * N O T E W E L L * * * * * ; BM378; ; BM378G; THESE ROUTINES CURRENTLY WORK ONLY BECAUSE THEY ARE IN THE ; BM378EE; ROOT OF THE EXEC AND APPEAR TO BE IN THE FIRST DIRECTIVE ; BM378EG; COMMON. IF THEY ARE EVER MOVED, IN ADDITION TO THE CHANGES ; BM378YE; TO MAPPING NECESSARY, IT WILL BE NECESSARY TO CHANGE THE ; BM378E; CODE WHICH STUFFS THE NEW DSW ON THE STACK TO ACCOMODATE ; BM378VC; THE DIFFERING STACK FORMATS ON SYSTEMS WITH DIRECTIVE ; BM378; COMMONS. ; BM378 ; ; BM378 .ENABL LSB3 ; BM378S;60$: DRSTS D.RS89 ;INVALID RECEIVE BUFFER SIZE ; BM378O170$: DRSTS D.RS99 ;INVALID DPB SIZE ; BM378I ; BM378M/$DRRCS::TST (R2) ;ISSUING TASK AT AST STATE?A BPL $DRREC ;IF PL NO. DRSTS D.RS80 ;ISSUING TASK IS AT AST STATE%$DRREC::CLR -(SP) ;INIT ERROR CODE 6 MOV #15.,R1 ;ASSUME THIS IS A FIXED LENGTH RECEIVE* MOV R1,-(SP) ;SAVE NUMBER OF DATA WORDS ASL R1 ;CONVERT TO BYTES .IF DF X$$HDR; MOVB H.CUIC+1(R4),-(SP) ;SAVE GRP CODE - HEADER UNMAPPED0 .IFF8$ MOV R4,-(SP) ;SAVE HEADER ADDRESS .ENDC7 MOV (R3)+,-(SP) ;SAVE FIRST HALF OF SENDER TASK NAME8 MOV (R3)+,-(SP) ;SAVE SECOND HALF OF SENDER TASK NAME+ CMPB $DICSV+1,#4. ;FIXED LENGTH RECEIVE?A BEQ 102$ ;IF EQ YESR. CMPB $DICSV+1,#6. ;VARIABLE LENGTH RECEIVE?! BNE 70$ ;IF NE NO ; BM378C/ MOV 2(R3),R1 ;GET SIZE TO RECEIVE ; BM3781 BEQ 60$ ;IF EQ ERROR - ILLEGAL SIZE ; BM378) CMP R1,#P$$MAX ;VALID SIZE ; BM378D BHI 60$ ;IF HI NO ;**-683 ADD #2,R1 ;TWO EXTRA WOR00OgggccccDS FOR SENDER TASK NAMEN- MOV R1,6(SP) ;SAVE THE SIZE TO RECEIVE + 2S! ASL R1 ;CONVERT SIZE TO BYTES)3102$: MOV (R3),R3 ;GET ADDRESS OF RECEIVE BUFFERV- CALL $ACHKP ;ADDRESS CHECK RECEIVE BUFFERF- MOV R3,R4 ;SAVE ADDRESS OF RECEIVE BUFFER 6 MOV (SP)+,R3 ;RETRIEVE 2ND HALF OF SENDER TASK NAME8 MOV (SP)+,R2 ;RETRIEVE FIRST HALF OF SENDER TASK NAME MOV R5,R0 ;COPY TCB ADDRESS( ADD #T.RCVL,R0 ;POINT TO RECEIVE LIST6 CALL $GTRPK ;GET RECEIVE DATA PACKET AND MAP TO IT BCS 20$ ;IF CS THERE IS NONE4 MOV (SP)+,R2 ;GET SAVED GROUP CODE/HEADER ADDRESS5 BIT #T3.SLV,T.ST3(R5) ;ISSUING TASK A SLAVE TASK ?  BEQ 105$ ;IF EQ NO: TSTB T.GGF(R5) ;TASK HAVE ACTIVE GROUP GLOBAL CONTEXT ? BEQ 105$ ;IF EQ NO1 MOV @#120002,R3 ;GET LENGTH OF DATA +2 (WORDS)O ASL R3 ;CONVERT TO BYTES .IF DF X$$HDR. CMPB R2,120007(R3) ;WILL UIC GROUP CHANGE ? .IFFD8 CMPB H.CUIC+1(R2),120007(R3) ;WILL UIC GROUP CHANGE ? .ENDC BEQ 105$ ;IF EQ NO: DRSTS D.RS17 ;SLAVE TASK HAS GRP GLOBAL CONTEXT ACTIVE.105$: CALL $GTSPK ;DEQUEUE SPECIFIED PACKET4 MOV #120002,R1 ;POINT TO THE NUMBER OF WORDS SENT0 CMP (SP),(R1) ;BUFFER SMALLER THAN DATA SENT? BEQ 2$ ;IF EQ NO BLO 201$ ;IF LO YES;/ MOV (R1),(SP) ;KEEP THE NUMBER OF WORDS SENTR BR 2$ ;4201$: INC 2(SP) ;INDICATE DATA HAS BEEN TRUNCATED2$: ;REFERENCE SYMBOL3 BIT #T3.SLV,T.ST3(R5) ;IS RECEIVER A SLAVE TASK?U BEQ 5$ ;IF EQ NO .IF DF V$$TRM; D; IF TI OF THE RECEIVER IS A VT, DECREMENT THE VT OFFSPRING COUNT,D; DEALLOCATE THE VT IF REQUIRED, AND CLEAR ANY LUNS WHICH MAY HAVE.; BEEN ASSIGNED TO THE SLAVE TASK'S TI (VT).C; NOTE -- COUNT IS DECREMENTED WHEN CHANGING THE TI AWAY FROM THE @; CURRENT VT. FOR THIS REASON, THE VT OFFSPRING COUNT IS NOTC; DECREMENTED IF A RECEIVE DATA IS ISSUED AND THE QUEUE IS EMPTY.E;C$ MOV R1,-(SP) ;SAVE PACKET ADDRESS1 CALL $TICLR ;DECREMENT VT OFFSPRING COUNT AND ;CLEAR OUT LUNS' MOV (SP)+,R1 ;RESTORE PACKET ADDRESSE .ENDC" MOV R1,R0 ;COPY PACKET ADDRESS1 MOV (R1),R3 ;GET NUMBER OF DATA WORDS SENT +2N ASL R3 ;CONVERT TO BYTES6 ADD R3,R0 ;POINT TO SENDER'S TI UCB ADDRESS IN PKT TST (R0)+ ; 2 MOV (R0)+,T.UCB(R5) ;SET TI ADDRESS OF RECEIVER .IF DF X$$HDR- MOV #KISAR6,R3 ;GET ADDRESS OF KERNEL APR6 5 MOV (R3),-(SP) ;SAVE CURRENT MAPPING (USER BUFFER)* MOV $SAHDB,(R3) ;MAP NONRESIDENT HEADER$ MOV $SAHPT,R2 ;GET HEADER ADDRESS3 MOV (R0),H.CUIC(R2) ;SET CURRENT UIC OF RECEIVER1 MOV (R0),H.DUIC(R2) ;SET DEFAULT UIC OF SENDER 1 MOV (SP)+,(R3) ;RESTORE MAPPING TO USER BUFFERV .IFF) MOV $HEADR,R2 ;GET TASK HEADER ADDRESS 3 MOV (R0),H.CUIC(R2) ;SET CURRENT UIC OF RECEIVER;3 MOV (R0),H.DUIC(R2) ;SET DEFAULT UIC OF RECEIVER .ENDC .IF DF N$$DIR MOV R1,-(SP) ;SAVE R1. MOV T.CTX(R5),R1 ;GET CURRENT CONTEXT BLOCK BEQ 3$ ;IF EQ, NONED- CALL $DLCTX ;DELETE CURRENT CONTEXT BLOCKV83$: MOV 6(R0),T.CTX(R5) ;GET CONTEXT BLOCK FROM PACKET MOV (SP)+,R1 ;RESTORE R1  .ENDC ;DF N$$DIR( 5$: ;REFERENCE SYMBOL(  TST (R1)+ ;POINT TO SENDER TASK NAME,  MOV (SP)+,R2 ;GET NUMBER OF WORDS TO MOVE-  CMPB $DICSV+1,#6 ;VARIABLE LENGTH RECEIVE?.  BNE 10$ ;IF NE NOI7 MOV R2,4(SP) ;RETURN IN DSW NUMBER OF WORDS RECEIVED610$: MOV (R1)+,(R4)+ ;MOVE DATA BLOCK TO TASK BUFFER# DEC R2 ;ANY MORE WORDS TO MOVE?, BNE 10$ ;IF NE YES' MOV KISAR5,R0 ;GET ADDRESS OF PACKET , MOV @#120002,R1 ;GET NUMBER OF WORDS SENT .IF DF N$$DIR8 ADD #<7.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE .IFF(8 ADD #<6.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE .ENDC ;DF N$$DIR ) ASH #-5,R1 ;CONVERT TO 32. WORD UNITS16  CALL $DESEC ;DEALLOCATE RECEIVE PACKET TO SEC POOL1! TST (SP)+ ;CLEAN THE STACK AND TEST FOR ERROR *" BNE 45$ ;IF NE DATA HAS BEEN TRUNCATED" ; BM378E" .IF DF D$$PAR 00OgygzgM{gfffDATA ; BM3780" ; BM378E " .IF NDF K$$DAS ; BM378" ; BM378;" MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I SPACE ; BM378 " ; BM378"" .ENDC ;NDF K$$DAS ; BM378" ; BM378P!" .ENDC ;DF D$$PAR ; BM378 " ; BM378; # RETURN ;W$20$: ;REFERENCE LABEL% .IF DF X$$HDR&' TST (SP)+ ;CLEAN STACK'( MOV $SAHPT,R4 ;GET ADDRESS OF HEADER$) MOV $SAHDB,KISAR6 ;AND MAP HEADER*+ .IFF ,(- MOV (SP)+,R4 ;RETRIEVE HEADER ADDRESS. .ENDC/0 CMP (SP)+,(SP)+ ;CLEAN STACK 41 CMPB $DICSV,#77. ;RECEIVE DATA OR EXIT DIRECTIVE?2 BNE 30$ ;IF NE NOP3 JMP $DREXT ;EXIT TASK 4430$: CMPB $DICSV,#139. ;RECEIVE OR STOP DIRECTIVE?5 BNE 40$ ;IF NE NO;"6 CALL $STPCT ;STOP CURRENT TASK7 DRSTS D.RS22 ;RETURN IS.SET:)840$: DRSTS D.RS8 ;NO PACKET TO RECEIVE=945$: DRSTS D.RS15 ;RECEIVE BUFFER TOO SMALL DATA TRUNCATEDA< ;**-2,=>;+?; **-$DRSND-SEND DATA @;KA; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A THIRTEEN WORD DATA BLOCKL(B; IN A SPECIFIED TASK'S RECEIVE QUEUE.C;RD; DPB FORMAT:E;E*F; WD. 00 -- DIC(71.),DPB SIZE(5. OR 8.)./G; WD. 01 -- FIRST HALF OF RECEIVER TASK NAME.T0H; WD. 02 -- SECOND HALF OF RECEIVER TASK NAME.2I; WD. 03 -- ADDRESS OF THIRTEEN WORD DATA BLOCK.+J; WD. 04 -- EVENT FLAG NUMBER (OPTIONAL).5BK; WD. 05 -- NUMBER OF WORDS TO SEND (VARIABLE LENGTH SEND ONLY).L;* M; INPUTS:+N; /O; R0=ADDRESS OF THE TCB OF THE RECEIVER TASK.S<P; R1=ADDRESS OF THE TASK STATUS WORD OF THE RECEIVER TASK.;Q; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.4R; R3=ADDRESS OF THE DATA BLOCK ADDRESS IN THE DPB.1S; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. .T; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.U;-7V; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)NW;G/X; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.D(Y; DIRECTIVE STATUS OF +1 IS RETURNED.!Z; C=1 IF DIRECTIVE IS REJECTED.E<[; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF INSUFFICIENT0\; CORE IS AVAILABLE TO QUEUE THE DATA BLOCK.8]; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF RECEIVER-^; TASK IS AN ANCILLARY CONTROL PROCESSOR._;A@`; NOTE: FOR SYSTEMS WITH SECONDARY POOL SUPPORT, ALL SENDS AND<a; RECEIVES USE PACKETS ALLOCATED FROM THE SECONDARY POOL.b;P4c; ON SYSTEMS SUPPORTING NON RESIDENT TASK HEADERS5d; AND PROTOTYPE TCBS, KISAR6 MAY MAP THE PROTOTYPER6e; TCB IN POOL UPON ENTRY. THEREFORE, DO NOT ASSUME$f; THAT THE TASK HEADER IS MAPPED.g;Fh;-h ; BM378A5h270$: DRSTS D.RS2 ;SET DIRECTIVE STATUS ; BM378'<h360$: DRSTS D.RS89 ;INVALID RECEIVE BUFFER SIZE ; BM3782h370$: DRSTS D.RS99 ;INVALID DPB SIZE ; BM378ij$DRSND:: ;;k BIT #T3.ACP!T3.NSD,T.ST3(R0) ;SENDS ALLOWED TO RECEIVER?E#k BNE 270$ ;IF NE, NO ; BM378M;k MOV R0,-(SP) ;SAVE TCB ADDRESS OF RECEIVER TASK ; BM378B:o MOV #13.,R1 ;ASSUME THIS IS A FIXED LENGTH SEND ;**-3-p MOV R1,-(SP) ;SAVE NUMBER OF WORDS TO SENDKq ASL R1 ;CONVERT TO BYTES+r MOVB 2(R3),-(SP) ;SAVE EVENT FLAG NUMBER;2s CMPB $DICSV+1,#5. ;FIXED LENGTH SEND DIRECTIVE?t BEQ 210$ ;IF EQ YESE/u CMPB $DICSV+1,#7. ;SEND REQUEST AND CONNECT?Dv BEQ 210$ ;IF EQ YES&v BLO 370$ ;IF LO, ERROR ; BM378=x CMPB $DICSV+1,#9. ;IS IT SOME FORM OF VARIABLE SEND ;**-1 (x BHI 370$ ;IF HI NO, ERROR ; BM378-z BNE 205$ ;IF NE, IT MUST BE VALID ;**-1A${ CMPB $DICSV,#71. ;IS THIS A VSDA$3{ BEQ 370$ ;IF EQ YES, ILLEGAL DPB SIZE ; BM378$}205$: ;REFERENCE LABEL ;**-1,~ MOV 4(R3),R1 ;GET NUMBER OF WORDS TO SEND+~ BEQ 360$ ;IF EQ ILLEGAL SIZE ; BM378B( CMP R1,#P$$MAX ;VALID SIZE? ;**-1" BHI 360$ ;IF HI NO ; BM378; MOV R1,2(SP) ;SAVE THE NUMBER OF WORDS TO BE SENT ;**-1 ASL R1 ;CONVERT TO BYTES0210$: MOV (R3),R3 ;GET ADDRESS OF DATA BUFFER BIT #1,R3 ;ODD ADDRESS?E  BNE 275$ ;IF NE, YES - ERROR' MOV R3,R0 ;MOV BUFFER ADDR FOR CALLD* CALL $ACHRO ;ADDRESS CHECK DATA BUFFER BCS 275$ ;IF00Ogggcccc CS, ERROR% CALL $RELOC ;RELOCATE USER BUFFER $ MOV R1,KISAR6 ;MAP TO USER BUFFER- MOV R2,R3 ;SUBSTITUTE NEW VITRUAL ADDRESS,5 MOVB (SP)+,R0 ;RETRIEVE OPTIONAL EVENT FLAG NUMBER " CALL $SETF ;SET THE EVENT FLAG, MOV (SP),R1 ;GET NUMBER OF WORDS TO SEND .IF DF N$$DIR8 ADD #<9.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE .IFFS8 ADD #<8.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE .ENDC ;DF N$$DIR ) ASH #-5,R1 ;CONVERT TO 32. WORD UNITS " CALL $ALSEC ;ALLOCATE A PACKET& BCS 265$ ;IF CS ALLOCATION FAILURE* CLR -(SP) ;RESERVE A WORD ON THE STACK" MOV 2(SP),(SP) ;COPY WORD COUNT& MOV KISAR5,2(SP) ;SAVE KERNEL APR 5. MOV R0,KISAR5 ;MAP THE PACKET THROUGH APR 55 MOV #120002,R0 ;POINT TO SECOND WORD OF THE PACKETR5 MOV (SP),(R0) ;SAVE NUMBER OF DATA WORDS IN PACKETE5 ADD #2,(R0) ;TWO EXTRA WORDS FOR SENDER TASK NAMEO+ TST (R0)+ ;POINT TO TASK NAME IN PACKETN> MOV T.NAM(R5),(R0)+ ;INSERT SENDER TASK NAME IN SEND PACKET MOV T.NAM+2(R5),(R0)+ ; MOV (SP)+,R2 ;SET LOOP COUNTI1240$: MOV (R3)+,(R0)+ ;MOVE DATA TO SEND PACKET# DEC R2 ;ANY MORE WORDS TO MOVE?M BNE 240$ ;IF NE YESN .IF DF V$$TRM4 MOV T.UCB(R5),R1 ;GET ADDRESS OF TI UCB OF SENDER% MOV @R1,R2 ;DETERMINE DCB ADDRESSV0 CMP D.NAM(R2),#"VT ;IS IT A VIRTUAL TERMINAL? BNE 245$ ;IF NE NO1 MOV 2(SP),R2 ;GET TCB ADDRESS OF RECEIVER TASKT4 BIT #T3.SLV,T.ST3(R2) ;IS RCVR TASK A SLAVE TASK? BEQ 245$ ;IF EQ NO0 INCB U.OCNT(R1) ;INCREMENT VT OFFSPRING COUNT/245$: MOV R1,(R0)+ ;SET UCB ADDRESS IN PACKETM .IFFE1 MOV T.UCB(R5),(R0)+ ;SET UCB ADDRESS IN PACKETE .ENDC .IF DF X$$HDR2 MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER4 MOV $SAHPT,R4 ;GET ADDRESS OF CURRENT TASK HEADER .ENDC5 MOV H.CUIC(R4),(R0)+ ;SET CURRENT (PROTECTION) UICG .IF DF R$$DSP< MOV $TNAME,(R0)+ ;STORE FIRST WORD OF TARGET MU TASK NAME( MOV $TNAME+2,(R0)+ ;STORE SECOND WORD .ENDC .IF DF N$$DIR* MOV 2(SP),R2 ;GET RCVR TASK TCB ADDRESS4 BIT #T3.SLV,T.ST3(R2) ;IS RCVR TASK A SLAVE TASK? BEQ 250$ ;IF EQ, NO4 MOV T.CTX(R5),(R0) ;PUT CONTEXT BLOCK INTO PACKET BEQ 250$ ;IF EQ, NONE) MOV KISAR5,-(SP) ;SAVE CURRENT MAPPING % MOV (R0),KISAR5 ;MAP CONTEXT BLOCKV/ INCB C.REF+120000 ;INCREMENT REFERENCE COUNT$ MOV (SP)+,KISAR5 ;RESTORE MAPPING250$: ;REFERENCE LABEL  .ENDC ;DF N$$DIR3 MOV 2(SP),R0 ;GET ADDRESS OF RECEIVER TASK'S TCB( ADD #T.RCVL,R0 ;POINT TO RECEIVE LIST' MOV KISAR5,R1 ;GET ADDRESS OF PACKETS4 MOV $PTCPT,KISAR6 ;REMAP TCB IF IN SECONDARY POOL2 CALL $QSPIF ;INSERT PACKET IN THE RECEIVE LIST) MOV (SP)+,KISAR5 ;RESTORE KERNEL APR 5V0 MOV #AS.RCA,R4 ;GET CODE FOR RECEIVE DATA AST3 MOV (SP)+,R5 ;RETRIEVE RECEIVER TASK TCB ADDRESSR$ CALL $DASTT ;DECLARE RECEIVE AST- CALLR $DRDSE ;DECLARE A SIGNIFICANT EVENTA(265$: DRSTS D.RS1 ;ALLOCATION FAILURE4275$: DRSTS D.RS98 ;SET DIRECTIVE STATUS ;**-1 ; BM378  .DSABL LSB ; BM378;+&; **-$GTRPK-GET RECEIVE DATA PACKET.;CF; THIS ROUTINE IS CALLED TO DEQUEUE A SPECIFIED PACKET FROM A QUEUE.; ; INPUTS:S;R; R2=FIRST WORD OF TASK NAME.R ; R3=SECOND WORD OF TASK NAME.; R0=LIST HEAD ADDRESS.V;E ; OUTPUTS:;S3; C=0 IF AN ENTRY HAS BEEN REMOVED FROM THE LIST.R; KISAR5 MAPS THE ENTRY.V"; C=1 IF THE ENTRY IS NOT FOUND.;I;-4$GTRPK::MOV R0,R1 ;COPY LISTHEAD ADDRESS ;**-2%10$: SEC ;ASSUME PACKET NOT FOUND;* MOV (R1),R1 ;GET ADDRESS OF NEXT ENTRY BEQ 100$ ;IF EQ END OF LISTI,  MOV R1,KISAR5 ;MAP THE ENTRY THROUGH APR5  TST R2 ;TASK NAME SPECIFIED?+  BEQ 20$ ;IF EQ NO, DEQUEUE FIRST PACKETS,  MOV #120000,R1 ;POINT TO PACKET LINK WORD5  CMP @#120004,R2 ;MATCH ON FIRST WORD OF TASK NAME?A BNE 10$ ;IF NE NO 6 CMP @#120006,R3 ;MATCH ON SECOND WORD OF TASK NAME? BNE 10$ ;IF NE NO$ MOV00OgPgzgM{gfffDATA KISAR5,R1 ;GET PACKET ADDRESS20$: ;REFERENCE LABEL100$: RETURN ; .ENDND;* MOV (R1),R1 ;GET ADDRESS OF NEXT ENTRY BEQ 100$ ;IF EQ END OF LISTI,  MOV R1,KISAR5 ;MAP THE ENTRY THROUGH APR5  TST R2 ;TASK NAME SPECIFIED?+  BEQ 20$ ;IF EQ NO, DEQUEUE FIRST PACKETS,  MOV #120000,R1 ;POINT TO PACKET LINK WORD5  CMP @#120004,R2 ;MATCH ON FIRST WORD OF TASK NAME?A BNE 10$ ;IF NE NO 6 CMP @#120006,R3 ;MATCH ON SECOND WORD OF TASK NAME? BNE 10$ ;IF NE NO$ MOV .TITLE DRGCL .IDENT /06.04/C 8; COPYRIGHT (C) 1985 BY DIGITAL EQUIPMENT CORPORATION,'; MAYNARD, MASS. ALL RIGHTS RESERVED.1;N-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:O;S; J. W. BERZLE; J. R. KAUFFMAN;1-; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:N;B"; B. S. MCCARTHY 5-MAR-87 06.04;.; BM385 -- ADD $DRGC1 LABEL FOR MOVEMENT TO%; VECTOR COMMON. ALSO MOVE $RLMCB8; to DREIF;V;+; **-$DRGCL-GET COMMAND LINE;R ; INPUTS:C;.;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.51; R3=ADDRESS OF THE 80. BYTE BUFFER IN THE DPB.S1; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.X.; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ;!;-"#$ .MCALL PKTDF$,TCBDF$R%& .IF DF N$$DIR'( .MCALL LNMDF$))* LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETS-+, .ENDC ;DF N$$DIRV-*. PKTDF$ ;DEFINE COMMAND BUFFER OFFSETS/ TCBDF$ ;TCB OFFSETS0182 .IIF GE </100>-200 .ERROR ;LENGTH TOO LONG33 ; BM385A3 .IF DF D$$PAR ; BM3853 ; BM38503$DRGC1:: ; BM3853 ; BM385 !3 .IFF ; DF D$$PAR ; BM38553 ; BM385F3$DRGCL:: ; BM3853 ; BM385 "3 .ENDC ; DF D$$PAR ; BM3853 ; BM385$*3 MOVB -(R3),R0 ;GET DPB SIZE ; BM385)5 CMPB (R3)+,#41. ;IS IT GMCR$ ;**-1F6 BEQ GMCR ;IF EQ YESR7 CMPB R0,#3 ;IS IT SNXC$F8 BEQ SNXC ;IF EQ YES<9:; .IF DF A$$CLI<= CMPB R0,#7 ;IS IT GCCI$ > BEQ GCCI ;IF EQ YESP?@ .ENDC ;A$$CLIAB"C DRSTS D.RS99 ;ILLEGAL DPB SIZEDE;+F; **-GMCR$ DIRECTIVEG;D>H; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TRANSFER A 1 TO 80.@I; BYTE COMMAND LINE TO THE LAST MCR FUNCTION TASK REQUESTED BYJ; THE MCR DISPATCHER.MK;(L; DPB FORMAT:IM; &N; WD. 00 -- DIC(127.),DPB SIZE(41.).,O; WD. 01 -- FIRST WORD OF 80. BYTE BUFFER. P; .S Q; . R; . +S; WD. 50 -- LAST WORD OF 80. BYTE BUFFER.T; 7U; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)NV;$/W; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.=X; DIRECTIVE STATUS EQUAL TO THE LENGTH OF THE COMMAND LINERY; IN BYTES IS RETURNED. !Z; C=1 IF DIRECTIVE IS REJECTED.T<[; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE ISSUING2\; TASK IS NOT THE LAST TASK THAT WAS REQUESTED]; BY THE MCR DISPATCHER.^; _;-`a7bGMCR: CALL $SCMDQ ;SEARCH COMMAND QUEUE FOR A PACKET c BCC 30$ ;IF CC, FOUND ONE (d20$: DRSTS D.RS80 ;NO COMMAND PRESENT/e30$: MOV R3,R4 ;SET DESTINATION DISPLACEMENTD*f MOV KISAR6,R3 ;SET DESTINATION APR BIASg MOV R0,KISAR6 ;MAP COMMANDN9h BIT #CC.CLI,C.CSTS+140000 ;IS COMMAND INTENDED FOR CLI i BNE 20$ ;IF NE YES'j MOV R0,-(SP) ;SAVE ADDRESS OF BUFFER "k MOV R0,R1 ;SET SOURCE APR BIAS+l MOVB C.CBLK+140000,R5 ;GET SIZE OF BLOCKm SWAB R5 ;PUT IN HIGH BYTE =n BISB C.CTR+140000,R5 ;GET TERMINATOR CHARACTER IN LOW BYTEA=o MOV C.CSO+140000,-(SP) ;GET OFFSET TO START RETURNING FROM;:p MOV C.CCT+140000,R0 ;GET NUMBER OF CHARACTERS IN BUFFER.q CMP #79.,R0 ;CAN ENTIRE BUFFER BE RETURNEDr BHIS 50$ ;IF HIS YES5s CLR 2(SP) ;DO NOT DEALLOCATE BUFFER AFTER COPYINGT3t MOV #78.,R0 ;SET NUMBER OF CHARACTERS TO RETURNP<u ADD R0,C.CSO+140000 ;SET TO STARTING OFFSET FOR NEXT TIMEBv SUB R0,C.CCT+140000 ;REMOVE THESE FROM CHARACTERS PRESENT COUNTBw50$: MOV #C.CTXT+120000,R2 ;DISPLACEMENT OF START OF SOURCE TEXT3x ADD (SP)+,R2 ;POINT TO FIRST CHARACTER TO RETUR00PhggccccNTx ; BM385M x .IF NDF D$$PAR ; BM385x ; BM3858x ADD R0,4(SP) ;SET CHARACTER COUNT +1 IN DSW ; BM385x ; BM385R#x .IFF ; NDF D$$PAR ; BM385Ex ; BM38589x ADD R0,10(SP) ;SET CHARACTER COUNT +1 IN DSW ; BM385+x ; BM385N#x .IFTF ; NDF D$$PAR ; BM385Cx ; BM385E&z TST R0 ;IS THERE ANY TEXT ;**-1{ BEQ 55$ ;IF EQ NOI.| CALL $BLXIO ;COPY CHARACTERS INTO USER DPB+}55$: MOV R3,KISAR6 ;MAP DESTINATION AGAIN 6~ MOVB #15,R3 ;ASSUME CONTINUATION MUST BE INDICATED2 MOVB #'-,(R4)+ ;HYPHEN FOR ASSUMED CONTINUATION, MOV (SP)+,R1 ;GET ADDRESS OF SOURCE BLOCK) BEQ 60$ ;IF EQ, THERE IS CONTINUATION  ; BM385D" .IFT ; NDF D$$PAR ; BM385 ; BM385 > DEC 2(SP) ;ADJUST DSW TO ELIM INITIAL VALUE OF +1 ; BM385 ; BM385R" .IFF ; NDF D$$PAR ; BM385 ; BM385> DEC 6(SP) ;ADJUST DSW TO ELIM INITIAL VALUE OF +1 ; BM385 ; BM385G# .ENDC ; NDF D$$PAR ; BM385A9 DEC R4 ;SET TO OVERWRITE HYPHEN WITH TERMINATOR ;**-1E* MOV #$CLICQ,R0 ;POINT TO QUEUE LISTHEAD CALL $GTSPK ;DEQUEUE PACKET " MOV R1,R0 ;COPY PACKET ADDRESS# MOVB R5,R3 ;GET REAL TERMINATOR * SWAB R5 ;GET SIZE OF BLOCK IN LOW BYTE! MOVB R5,R1 ;GET SIZE OF BLOCKU CALL $DESEC ;DEALLOCATE IT.60$: MOVB R3,(R4) ;PUT TERMINATOR IN BUFFER RETURN ;ALL DONEC;+; **-SNXC$ DIRECTIVE;UC; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CALL THE TERMINAL DRIVER @; TO HAVE IT SEND THE NEXT COMMAND FROM THE SPECIFIED TERMINALF; TO THE CLI DISPATCHER FOR EXECUTION. THE NEED FOR THIS ARISES WHENC; THE TERMINAL IS IN SERIAL COMMAND EXECUTION MODE. NORMALLY, THETL; NEXT COMMAND WILL BE CALLED FOR BY DREIF FOR WHEN A TASK WITH T3.CMD SETI; EXITS. IF THE TASK PROCESSING THE COMMAND WILL NOT EXIT HOWEVER, THISMH; DIRECTIVE PROVIDES A WAY FOR IT TO SIGNAL TO THE SYSTEM THAT COMMANDD; EXECUTION IS COMPLETE, AND THE NEXT COMMAND CAN BE SENT FROM THE'; TYPEAHEAD BUFFER INSIDE THE DRIVER.A>; IF THE TASK ISSUING THE DIRECTIVE IS SET TO PROMPT ON EXITD; HOWEVER, A TASK EXIT PROMPT WILL BE QUEUED UP INSTEAD OF CALLINGA; THE DRIVER. THE DRIVER WILL GET CALLED BY MCR... AFTER IT HASL>; PROCESSED THE TASK EXIT PROMPT, OR BY A RE-ISSUANCE OF THE@; SNXC$ DIRECTIVE BY THE CLI IF THE CLI IS RECEIVING TASK EXITB; PROMPT REQUESTS. THIS SCHEME CORRECTLY SYNCHRONIZES THE PROMPT6; REQUESTS AND COMMAND LINES ON THE USER'S TERMINAL.; ; DPB FORMAT:E; $; WD. 00 -- DIC(127.),DPB SIZE(3.)<; WD. 01 -- ASCII NAME OF TERMINAL TO REQUEST COMMAND FROM+; WD. 02 -- OCTAL UNIT NUMBER OF TERMINALT;F7; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)C;A/; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. (; DIRECTIVE STATUS OF +1 IS RETURNED.!; C=1 IF DIRECTIVE IS REJECTED.I4; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF THE; LENGTH IS ILLEGAL.4; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE/; SPECIFIED TERMINAL IS NOT THE TASK'S TI:, .; AND THE TASK IS NOT PRIVILEGED OR A CLI.4; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF THE7; SPECIFIED DEVICE DOES NOT EXIST, OR IS NOT A TTY.V;T;-5SNXC: MOV (R3)+,R0 ;GET NAME OF DEVICE IF SPECIFIEDS( BEQ 10$ ;IF EQ, DEVICE NOT SPECIFIED MOV (R3),R1 ;GET UNIT NUMBER3 CALL $CVDVN ;CONVERT DEVICE NAME TO UCB ADDRESS9) BCS 40$ ;IF CS, DEVICE DOES NOT EXISTA MOV R2,R0 ;COPY UCB ADDRESSS% CALL $MPLND ;FOLLOW ANY REDIRECTS . BIT #DV.TTY,U.CW1(R0) ;IS DEVICE A TERMINAL BEQ 40$ ;IF EQ NOOB BIT #T3.PRV!T3.CLI,T.ST3(R5) ;IS ISSUING TASK PRIVILEGED OR CLI BNE 20$ ;IF NE YES1 CMP T.UCB(R5),R0 ;DID TASK SPECIFY ITS OWN TI:C BEQ 20$ ;IF EQ YES% DRSTS D.RS16 ;PRIVILEGE VIOLATIONI210$: MOV T.UCB(R5),R0 ;DEFAULT UCB TO TASK'S TI:$20$: ADD #T.ST3,R5 ;POINT TO T.ST3- BIT #T3.MCR,(R5) ;WILL TASK PROMPT ON EXITE BEQ 50$ ;IF EQ NO' MOV #CC.EXT,R1 ;SET TASK EXIT PROMP00PhgzgM{gfffDATATM6 BIT #T3.CMD,(R5) ;IS TASK PART OF CMD FROM TERMINAL BEQ 30$ ;IF EQ NO5 BIS #CC.TTD,R1 ;FORCE CALL OF $SNCMD AT SOME POINTI#30$: MOV R0,R2 ;COPY UCB ADDRESSB/ CALL $QCNTP ;QUEUE TASK EXIT PROMPT REQUEST BR 60$ ;.40$: DRSTS D.RS92 ;ILLEGAL DEVICE SPECIFIED950$: BIT #T3.CMD,(R5) ;IS TASK PART OF CLI CMD FROM TTYK BEQ 70$ ;IF EQ NOT) CALL $SNCMD ;HAVE TTDRV SEND NEXT CMDW360$: BIC #T3.MCR!T3.CMD,(R5) ;DON'T DO THIS AGAINM70$: RETURN ;THE END;+; **-GCCI$ DIRECTIVE;KI; THIS DIRECTIVE IS USED BY A CLI TASK TO GET A COMMAND LINE. IT CANNOTEI; BE ISSUED BY A NON-CLI TASK. IT OFFERS SUCH CAPABILITIES AS RETURNINGLH; A SPECIFIC COMMAND, IDENTIFYING THE COMMAND'S PARENT TASK, LEAVING AM; COMMAND QUEUED AFTER RETREIVAL FOR RETREIVAL AGAIN BY A FUTURE DIRECTIVE,FM; AND RETURNING INFORMATION ABOUT THE TERMINAL THE COMMAND ORIGINATED FROM.X;WE; THE FORMAT OF THE COMMAND BUFFER SET UP IN THE CLI TASK SPACE IS: ;E-; +---------------------------------------+ %; ! ASCII DEV NAME OF ISSUING TTY ! -; !---------------------------------------!Y-; ! NUM OF CHAR RETURNED ! OCTAL UNIT NUM.! -; !---------------------------------------! ; ! COMMAND SIZE !-; !---------------------------------------!L; ! STATUS ! TERMINATOR !-; !---------------------------------------!U ; ! !L; ! COMMAND TEXT IN ASCII ! ; ! ! -; +---------------------------------------+T;P;SB; THE FORMAT OF THE INFORMATION BUFFER IN THE CLI TASK SPACE IS:; -; +---------------------------------------+-!; ! U.CW2 OF ISSUING TERMINAL !F-; !---------------------------------------!-$; ! NAME OF PARENT TASK (IF ANY) !; ! (2 WORDS) !-; !---------------------------------------!"; ! ADDRESS OF OCB FROM PARENT !-; !---------------------------------------! %; ! LOGIN UIC OF ISSUING TERMINAL !!-; !---------------------------------------!-'; ! CURRENT UIC OF ISSUING TERMINAL !T-; !---------------------------------------!E$; ! ADDR OF CMD. IF NOT DEQUEUED !-; +---------------------------------------+R; M; EXTRA FIELDS CAN BE ADDED TO THE END OFF THIS BUFFER IF REQUIRED, BECAUSEIG; THE TASK SUPPLIES BOTH THE ADDR AND LENGTH OF ITS TASK BUFFER. ONLY-H; THAT MUCH DATA IS COPIED BACK TO THE TASK. THE TASK BUFFER IS FILLEDD; FROM THE FRONT WITH THE FIELDS IN THE ABOVE ORDER. IF THE BUFFERE; IS NOT LONG ENOUGH TO HOLD ALL OF THE DATA, THE FIELDS THAT WOULD G ; NOT FIT ARE NOT SUPPLIED, BUT NO INDICATION OF THIS DATA TRUNCATION L ; IS GIVEN TO THE TASK. THUS IF MORE FIELDS ARE ADDED IN A FUTURE RELEASE,H ; OLD TASKS WOULD STILL WORK SINCE THEY WILL GET EXACTLY WHAT THEY GOT1 ; BEFORE, THEY JUST WOULD NOT GET THE NEW DATA.  ;B#; DPB FORMAT FOR GCCI$ DIRECITVE:O;B%; WD. 00 -- DIC(127.),DPB SIZE(7.).L<; WD. 01 -- NO COMMAND PRESENT ACTION, HIGH BYTE RESERVED.0; WD. 02 -- ADDRESS OF COMMAND TO BE RETURNED.4; WD. 03 -- ADDRESS OF COMMAND BUFFER INSIDE TASK..; WD. 04 -- LENGTH OF TASK'S COMMAND BUFFER.=; WD. 05 -- ADDRESS OF OPTIONAL INFORMATION BUFFER IN TASK.N2; WD. 06 -- LENGTH OF TASK'S INFORMATION BUFFER.;T7; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; /; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.G8; DIRECTIVE STATUS OF +1 IS RETURNED IF A COMMAND HAS+; BEEN SUCCESSFULLY RETURNED TO THE CLI,;; DIRECTIVE STATUS OF 'D.RS00' IS RETURNED IF NO COMMANDR2; IS QUEUED FOR THE CLI, AND THE CLI INDICATED4; THAT IT WANTED TO BE STOPPED. THE CLI WILL GET( ; THIS STATUS AFTER IT IS UNSTOPPED.!!; C=1 IF DIRECTIVE IS REJECTED. ;"; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF AN ILLEGAL:#; DPB SIZE IS SPECIFIED.7$; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF EITHERY0%; BUFFER OR THE DPB ARE NOT ENTIRELY WITHING&; THE TASK'S ADDRESS SPACE.S0'; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF7(; A GCCI$ WITH STOP ON NO COMMAND OPTION WAS ISSUEDE); FROM AST STATE<*; D00PhggccccIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE ISSUING+; TASK IS NOT A CLIU9,; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED FROM A GCCI$ 5-; DIRECTIVE IF THERE IS NO COMMAND QUEUED FOR THEL3.; CLI, AND THE TASK WANTED AN ERROR RETURNED INS/; THIS CASE.40; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF THE-1; ISSUING CLI TASK ATTEMPTED TO RECEIVE AA.2; COMMAND FROM A TERMINAL WITH A DIFFERENT13; PROTECTION UIC FROM THE CLI'S CURRENT GROUPN44; AND THE CLI HAD AN ACTIVE GROUP GLOBAL CONTEXT5; FOR THE FORMER GROUP.F6;I7;G8;-9: ASSUME CC.EXT,4; ASSUME CC.PRM,2<= .IF DF A$$CLI>,?GCCI: BIT #T3.CLI,T.ST3(R5) ;IS TASK A CLI@ BNE 100$ ;IF NE NO&A DRSTS D.RS16 ;SET DIRECTIVE STATUS+B100$: MOV (R3)+,-(SP) ;SAVE NO CMD ACTIONS%C TST T.ST2(R5) ;TASK AT AST STATE??D BPL 103$ ;IF PL NO7E BIT #2,(SP) ;IS STOP ON NO COMMAND OPTION SPECIFIEDAF BEQ 103$ ;IF EQ NO&G DRSTS D.RS80 ;SET DIRECTIVE STATUS+H103$: MOV (R3)+,R4 ;SAVE DESIRED CMD ADDRC'I MOV (R3)+,R0 ;GET CMD BUFFER ADDRESSI&J BNE 110$ ;IF NE, THERE IS A BUFFER+K105$: DRSTS D.RS98 ;SET DIRECTIVE STATUS L110$: MOV (R3)+,R1 ;GET LENGTH+M CMP #11,R1 ;IS IT ABOVE MINIMUM LENGTHRN BHI 105$ ;IF HI NO0O MOV R1,$TEMP0 ;SAVE LENGTH OF TASK CMD BUFFER0P MOV R0,-(SP) ;SAVE ADDRESS OF TASK CMD BUFFER-Q CALL $ACHKW ;ADDRESS CHECK COMMAND BUFFERM(R MOV (R3)+,R0 ;GET INFO BUFFER ADDRESSS BEQ 120$ ;IF EQ, NO BUFFER'T MOV (R3),R1 ;GET INFO BUFFER LENGTHD#U BMI 105$ ;IF MI, ILLEGAL LENGTHT*V CALL $ACHKW ;ADDRESS CHECK INFO BUFFER;W120$: MOV $CLICQ,R0 ;GET ADDRESS OF FIRST PACKET IT QUEUE#X BEQ 131$ ;IF EQ, QUEUE IS EMPTY1Y130$: CALL $SRCQ1 ;FIND A COMMAND FOR THIS CLI1Z BCC 140$ ;IF CC, FOUND ONE[;E"\; NO COMMAND EXISTS FOR THIS CLI];P^131$: TST (SP)+ ;CLEAN STACKR(_ MOV (SP)+,R0 ;GET DESIRED ACTION CODE!` BEQ 135$ ;IF EQ, RETURN ERRORU a ASR R0 ;FORCE TASK TO EXIT??b BCS 133$ ;IF CS YES1 c ASR R0 ;FORCE TASK TO STOP??$d BCC 135$ ;IF CC NO, RETURN ERRORe CALL $STPCT ;STOP THE TASKf DRSTS D.RS00 ;SET IS.CLR+g133$: JMP $DREXT ;FORCE THE TASK TO EXIT1)h135$: DRSTS D.RS8 ;SET ERROR CONDITION$i; j; CAN THIS PACKET BE USED1k;B!l140$: MOV R0,KISAR6 ;MAP PACKET%m CMP R4,R0 ;IS IT THE DESIRED ONE?n BEQ 150$ ;IF EQ YES o TST R4 ;TAKE ANY ONE?Tp BEQ 150$ ;IF EQ YESB.q145$: MOV @#140000,R0 ;POINT TO NEXT IN LISTr BR 130$ ;RESTART SEARCH >s150$: BIT #CC.CLI,@#C.CSTS+140000 ;IS THIS COMMAND FOR A CLIt BEQ 145$ ;IF EQ NO*u MOV @#C.CUCB+140000,R4 ;GET UCB ADDRESS$v MOV R0,-(SP) ;SAVE PACKET ADDRESS8w BIT #CC.MSG,@#C.CSTS+140000 ;IS THIS A SYSTEM MESSAGEx BNE 190$ ;IF NE YESHyz{ .IF DF X$$HDR| } MOV $SAHDB,KISAR6 ;MAP HEADER'~ MOV $SAHPT,R0 ;GET ADDRESS OF HEADERB .IFF ;X$$HDR' MOV $HEADR,R0 ;GET ADDRESS OF HEADERE .ENDC ;X$$XDR, ADD #H.CUIC,R0 ;POINT TO PROTECTION GROUP9 TSTB T.GGF(R5) ;TASK HAVE ACTIVE GOUPT GLOBAL CONTEXT?A BEQ 152$ ;IF EQ NO% CMPB U.LUIC(R4),1(R0) ;SAME GROUP?  BEQ 152$ ;IF EQ YESR% DRSTS D.RS17 ;RETURN IE.RSU ERRORC152$:C* .IF DF N$$DIR ;NAMED DIRECTORY SUPPORT. MOV T.CTX(R5),R1 ;GET CURRENT CONTEXT BLOCK BEQ 153$ ;NONE% CALL $DLCTX ;DELETE CONTEXT BLOCKS .ENDC ;DF N$$DIR ,153$: MOV T.OCBH(R5),R1 ;POINT TO OCB LIST  BR 155$ ;N'154$: MOV (R1),R1 ;POINT TO NEXT OCBI)155$: BEQ 156$ ;IF EQ, END OF OCB LISTT4 CMP O.MCRL(R1),(SP) ;IS THIS OCB FOR THIS COMMAND BNE 154$ ;IF NE NO .IF DF N$$DIRC MOV O.STAT+10(R1),T.CTX(R5) ;PUT CONTEXT BLOCK FROM OCB INTO TCB5 .ENDC ;DF N$$DIRN0 MOV O.STAT+4(R1),(R0) ;SET NEW PROTECTION UIC) MOV (R0)+,-(SP) ;SAVE PROTECTION UIC- MOV O.STAT+6(R1),(R0) ;SET NEW DEFAULT UICN, BIS (R0)+,(SP)+ ;EITHER UIC SPECIFIED ?% BNE 158$ ;IF NE YES, LEAVE THEM5) CMP -(R0),-(R0) ;BACK UP UIC POINTER$ BR 157$ ;Q156$: .IF DF N$$DIRO@ MOV U.CTX(R4),T00PhgzgM{gfffDATA.CTX(R5) ;PUT CONTEXT BLOCK FROM TERM INTO TCB .ENDC ;DF N$$DIR4157$: MOV U.LUIC(R4),(R0)+ ;SET NEW PROTECTION UIC+ MOV U.UIC(R4),(R0)+ ;SET NEW DEFAULT UICM158$:R .IF DF N$$DIR) MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING * MOV T.CTX(R5),KISAR6 ;MAP CONTEXT BLOCK BEQ 1585$ ;IF EQ, NONE/ INCB C.REF+140000 ;INCREMENT REFERENCE COUNT *1585$: MOV (SP)+,KISAR6 ;RESTORE MAPPING .ENDC ;DF N$$DIR59159$: MOV -2(R3),R0 ;GET ADDR OF INFO BUFFER IF PRESENTX# BEQ 190$ ;IF EQ, NO INFO BUFFERO! CALL $RELOC ;RELOCATE ADDRESS4 MOV R1,KISAR6 ;MAP INFO BUFFER IN USER TASK SPACE% MOV (R3),R3 ;GET LENGTH OF BUFFER ;*; FILL INFORMATION BUFFER IN TASK SPACE;;S! ASR R3 ;CONVERT TO WORD COUNT' BCS 105$ ;IF CS, LENGTH IS NOT EVEN+ BEQ 190$ ;IF EQ, BUFFER HAS LENGTH ZERO0! MOV U.CW2(R4),(R2)+ ;GET U.CW254 SUB #3,R3 ;ARE THERE 3 WORDS LEFT IN INFO BUFFER BLT 190$ ;IF LT NO' MOV T.OCBH(R5),R1 ;POINT TO OCB LIST  BR 164$ ;Q'160$: MOV (R1),R1 ;POINT TO NEXT OCBR)164$: BEQ 170$ ;IF EQ, END OF OCB LIST;4 CMP O.MCRL(R1),(SP) ;IS THIS OCB FOR THIS COMMAND BNE 160$ ;IF NE NO7 MOV O.STAT(R1),(R2)+ ;COPY FIRST HALF OF PARENT NAMEA: MOV O.STAT+2(R1),(R2)+ ;COPY SECOND HALF OF PARENT NAME" DEC R3 ;ANOTHER WORD IN BUFFER BLT 190$ ;IF LT NO! MOV R1,(R2)+ ;SAVE OCB ADDRESS  DEC R3 ;ROOM LEFT IN BUFFER? BLT 190$ ;IF LT, NOT- MOV O.STAT+4(R1),(R2) ;COPY PROTECTION UICO$ MOV (R2)+,R0 ;SAVE PROTECTION UIC  DEC R3 ;ROOM LEFT IN BUFFER? BLT 190$ ;IF LT, NON* MOV O.STAT+6(R1),(R2) ;COPY DEFAULT UIC& BIS (R2)+,R0 ;EITHER UIC SPECIFIED?# BNE 185$ ;IF NE YES, LEAVE THEMP ADD #2,R3 ;RESTORE LENGTH/ CMP -(R2),-(R2) ;BACK UP INFO BUFFER POINTERN  BR 180$ ;R+170$: CLR (R2)+ ;CLEAR PARENT NAME FIELDL CLR (R2)+ ;R" DEC R3 ;ANOTHER WORD IN BUFFER BLT 190$ ;IF LT NO& CLR (R2)+ ;CLEAR OCB ADDRESS FIELD'180$: DEC R3 ;ANOTHER WORD IN BUFFER2 BLT 190$ ;IF LT NO' MOV U.LUIC(R4),(R2)+ ;COPY LOGIN UICB DEC R3 ;ROOM LEFT IN BUFFERA BLT 190$ ;IF LT NO- MOV U.UIC(R4),(R2)+ ;COPY CURRENT UIC CODE$185$: DEC R3 ;ROOM LEFT IN BUFFER BLT 190$ ;IF LT NO2 CLR (R2) ;ASSUME DO NOT SUPPLY COMMAND ADDRESS) TSTB 4(SP) ;IS COMMAND TO BE DEQUEUEDL BPL 190$ ;IF PL YES2 MOV (SP),(R2) ;SUPPLY ADDRESS OF COMMAND BUFFER;T1; COPY COMMAND FROM POOL INTO THE TASK'S BUFFERF;H190$: BIC #T3.MCR!T3.CMD,T.ST3(R5) ;ASSUME NO PROMPT OR SERIAL CMD EXE/ MOV (SP)+,R5 ;COPY POINTER TO BUFFER IN POOLM) MOV R5,KISAR6 ;MAP COMMAND IN SEC POOL. MOV (SP),R0 ;GET ADDRESS OF BUFFER IN TASK ASSUME C.CSO,C.CMCD< MOV @#C.CSO+140000,(SP) ;SAVE START OFFSET OR MSG NUMBER5 MOVB @#C.CTR+140000,-(SP) ;SAVE COMMAND TERMINATORE. MOV @#C.CSTS+140000,-(SP) ;SAVE STATUS WORD2 MOV @#C.CCT+140000,-(SP) ;SAVE CHARACTER COUNT( CALL $RELOC ;RELOCATE BUFFER ADDRESS+ MOV R1,KISAR6 ;MAP USER'S COMMAND BUFFERS MOV R1,R3 ;SAVE APR BIAS. BIT #CC.MSG,2(SP) ;IS THIS A MESSAGE PACKET BNE 200$ ;IF NE YESA  MOV R4,R1 ;COPY UCB ADDRESSP  MOV (R4),R0 ;POINT TO DCB ,  TST (R0)+ ;POINT TO ADDRESS OF FIRST UCB-  SUB (R0)+,R1 ;CALC RELATIVE ADDRESS OF UCBU$  MOV (R0)+,(R2)+ ;COPY DEVICE NAME. MOV (R0)+,(R2) ;GET LOW UNIT NUMBER FOR DCB MOV R2,-(SP) ;SAVE R2" MOV (R0),R2 ;GET LENGTH OF UCB CLR R0 ;SET UP R0,R1 PAIRR( DIV R2,R0 ;CALC RELATIVE UNIT NUMBER MOV (SP)+,R2 ;RESTORE R25 ADD R0,(R2)+ ;CALC LOGICAL UNIT NUMBER IN LOW BYTEI/ INC (SP) ;INCREASE CHAR COUNT TO INCLUDE CRM/ MOV #1,-(SP) ;REMEMBER TO DECREMENT IT LATERI  BR 210$ ;T,200$: CLR (R2)+ ;ZERO TO INDICATE MESSAGE. MOV 6(SP),(R2)+ ;PUT MESSAGE CODE IN BUFFER2 CLR 6(SP) ;ZERO FOR LATER CODE THAT USES C.CSO3 CLR 10(SP) ;FORCE MESSAGE BUFFER TO BE DEQUEUED20 CLR -(SP) ;DO NOT HAVE TO CORRECT CHAR COUNT0210$: MOV 2(SP),R1 ;GET NUMBER OF CHARS IN CMD- MOV $TEMP0,R0 ;GET LENGTH OF TA00P h%hgccccSK'S BUFFERD0 SUB #10,R0 ;CALC SPACE AVAILABLE FOR COMMAND-  CLR -(SP) ;ASSUME LENGTHS WILL BE CORRECTM4! CMP R0,R1 ;COMPARE SIZE OF TASK AND POOL BUFFERS)" BLO 220$ ;IF LO, USE TASK BUFFER SIZEN## MOV R1,R0 ;USE POOL BUFFER SIZEU'$ BIT #CC.MSG,6(SP) ;IS THIS A MESSAGEZ4% BNE 220$ ;IF NE YES, DO NOT DECREMENT ANY COUNTS7& MOV #400,(SP) ;HAVE TO DECREMENT COUNT IN UPPER BYTE 7'220$: MOVB R0,-1(R2) ;PUT ACTUAL COUNT IN TASK BUFFERB.( SUB (SP)+,-2(R2) ;CORRECT ACTUAL CHAR COUNT/) MOV R1,(R2) ;PUT BUFFER SIZE IN TASK BUFFERA4* SUB (SP)+,(R2)+ ;CORRECT SIZE OF ORIGINAL COMMAND"+ TST (SP)+ ;POP C.CCT OFF STACK , MOV (SP)+,R1 ;GET STATUS BITSE- BIC #^C,R1 ;ISOLATE STATUS BITS TO BE PASSEDR". ASH #7,R1 ;SHIFT INTO POSITION6/ BISB (SP)+,R1 ;PUT TERMINATOR CHARACTER IN POSITION;0 MOV R1,(R2)+ ;PUT TERMINATOR AND STATUS BITS IN USER BUFR"1 TST R0 ;ANY CHARACTERS TO COPY2 BEQ 240$ ;IF EQ NO"3 MOV R5,R1 ;SET SOURCE APR BIAS4 MOV R2,R4 ;DESTINATION DISP 15 MOV #C.CTXT+120000,R2 ;SET SOURCE DISPLACEMENT+-6 ADD (SP),R2 ;POINT TO START OF VALID TEXT+07 CALL $BLXIO ;COPY COMMAND INTO TASK'S BUFFER(8240$: MOV R5,KISAR6 ;MAP COMMAND AGAIN%9 TST (SP)+ ;CLEAN C.CSO FROM STACK8: BIT #CC.MSG,@#C.CSTS+140000 ;IS THIS A SYSTEM MESSAGE; BNE 260$ ;IF NE YESI*< MOV $TKTCB,R3 ;CURRENT TASK TCB ADDRESS'= TST @#C.CCT+140000 ;ANY TEXT PRESENTH> BEQ 250$ ;IF EQ NO1? CMPB #33,@#C.CTR+140000 ;TERMINATED BY ESCAPE?S@ BEQ 250$ ;IF EQ YESI.A BIS #T3.MCR,T.ST3(R3) ;FORCE PROMPT ON EXIT?B250$: BIT #CC.TTD,@#C.CSTS+140000 ;DID CMD ORIGINATE IN TTDRVCC BEQ 260$ ;IF EQ NO@D BIS #T3.CMD,T.ST3(R3) ;PROPOGATE SERIAL CMD EXECUTION ON EXIT0E260$: TSTB (SP)+ ;LEAVE COMMAND PACKET QUEUE?F BMI DUN ;IF MI YES'G MOV R5,R1 ;GET CMD ADDR IN SEC POOL $H MOV #$CLICQ,R0 ;POINT TO LISTHEADI CALL $GTSPK ;DEQUEUE PACKET "J MOV R1,R0 ;COPY PACKET ADDRESS0K MOVB @#C.CBLK+140000,R1 ;GET LENGTH OF PACKET0L CALLR $DESEC ;DEALLOCATE AND RETURN TO DRDSPLDUN: RETURN ; BM385TMN .ENDC ;A$$CLIOp .END ;**-32GINATE IN TTDRVCC BEQ 260$ ;IF EQ NO@D BIS #T3.CMD,T.ST3(R3) ;PROPOGATE SERIAL CMD EXECUTION ON EXIT0E260$: TSTB (SP)+ ;LEAVE COMMAND PACKET QUEUE?F BMI DUN ;IF MI YES'G MOV R5,R1 ;GET CMD ADDR IN SEC POOL $H MOV #$CLICQ,R0 ;POINT TO LISTHEADI CALL $GTSPK ;DEQUEUE PACKET "J MOV R1,R0 ;COPY PACKET ADDRESS0K MOVB @#C.CBLK+140000,R1 ;GET LENGTH OF PACKET0L CALLR $DESEC ;DEALLOCATE# .TITLE DCDBG - Debug SubroutinesI .IF DF D$$CHE!CHEDBGR .IDENT /01.00/ .MCALL HWDDF$& HWDDF$ ;DEFINE HARDWARE REGISTERS;R8; Copyright (c) 1986 by DIGITAL EQUIPMENT CORPORATION. ; All rights reserved. ;$ ; K ; This module contains various routines to support information dumping inS ; disk data caching.;  .PSECT DC$SUB,RO,I;+G; $SAVE - Routine to save the general registers around the debugging C; operations;- $SAVE::  MOV R1,-(SP) MOV 2(SP),R1  MOV R0,2(SP)e MOV R2,-(SP)C MOV R3,-(SP)D MOV R4,-(SP) MOV R5,-(SP) MOV R1,-(SP)N  RETURNR;+K ; $RSTOR - Routine to restore the general registers around the debugging s!; operations";- #$RSTOR::$ MOV (SP)+,R0r% MOV (SP)+,R5s& MOV (SP)+,R4n' MOV (SP)+,R3 ( MOV (SP)+,R2.) MOV (SP)+,R1 * MOV R0,-(SP)++ MOV 2(SP),R0t, MOV (SP)+,(SP)e - RETURNr./;+P0; $PTMSG - Routine to put out a message to the debugging logger. This routineF1; saves all registers. The default size of 20. words of pool will be2; allocated.3; 4; Inputs:PL5; R1 - Size of pool to be allocated, does not include additional 20. words6; R2 - Opcode values7;- 8$PTMSG::=9 ADD #<10.*2>,R1 ; Set up default size of allocation bufferP4: CALL $ALOC ; Allocate and pass the block of data ; RETURNM<=;+K>; $ALOC - Routine to allocate a chunk of primary pool for data dumping toRD?; a processing/display task, insert chunk in t00(hQ*hzgM{gfffDATAhe listhead, and put(@; an eight word timestamp in the data.A;wEB; The following locations temporarily hold the following data until 0C; locations in the Executive can be allocated:AD; $SHERR - TCB address of processing task to deallocate blocks.!E; and print messages to fileo>F; $SHLIM - Listhead pointer for secondary pool blocks to be6G; processed. If zero, nothing to do. The location7H; just beyond $SHLIM is also used as the listhead.r3I; $SHLOS - Storage value for output line pointeraJ;tGK; If these locations are used as is, Shadow recording cannot be used.iEL; SHE... MUST be removed or the system will lose pool very rapidly.eM;e N; Inputs:aIO; R1 - Size of primary pool block to be allocated. This number must be?P; at least 10. words to accomodate the forward pointer, sizef@Q; word and eight words of time stamp but must be smaller than R; 256. DS; R2 - Byte Operation code to be placed in upper byte of size word T; Outputs: U; CC:o>V; R0SEND REQUEST AND CONNECT / VARIABLE SEND REQUEST AND CONNECT /!P; SEND REQUEST AND PASS OCB Q;R R; SRDC$S;GT; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A SEND DATA PACKET FORGU; THE SPECIFIED TASK, CONNECT TO THE TASK AND REQUEST IT IF IT IS NOTV; ALREADY ACTIVE.W;DX; DPB FORMAT: (FOR SDRC$)LY;K%Z; WD. 00 -- DIC(141.),DPB SIZE(7.).T/[; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50.L0\; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50.%]; WD. 03 -- ADDRESS OF SEND BUFFER.E=^; WD. 04 -- EFN, LENGTH OF ESB (0 = 1 WORD, >0 = 8. WORDS).A_; WD. 05 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS RETURN.D+`; WD. 06 -- ADDRESS OF EXIT STATUS BLOCK. a;P b; VSRC$c;HBd; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A VARIABLE LENGTHDe; SEND DATA PACKET FOR THE SPECIFIED TASK, CONNECT TO THE TASK AND+f; REQUEST IT IF IT IS NOT ALREADY ACTIVE.-g;Sh; DPB FORMAT: (FOR VSRC$)Li; &j; WD. 00 -- DIC (141.),DPB SIZE(8.)./k; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50. 0l; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50.%m; WD. 03 -- ADDRESS OF SEND BUFFER.R=n; WD. 04 -- EFN, LENGTH OF ESB (0 = 1 WORD, >0 = 8. WORDS).E$o; WD. 05 -- LENGTH OF SEND BUFFER.Ap; WD. 06 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS RETURN.E+q; WD. 07 -- ADDRESS OF EXIT STATUS BLOCK.Tr;C s; SDRP$Ht;KGu; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A SEND DATA PACKET FOR Ev; THE SPECIFIED TASK, UNLINK ALL OR A SELECTED OCB FROM THE CURRENT-Fw; TASK, LINK THE OCB(S) OFF THE SPECIFIED TASK, AND REQUEST IT IF ITx; IS NOT ALREADY ACTIVE.y;Rz; DPB FORMAT: (FOR SDRP$) {; $|; WD. 00 -- DIC(141.),DPB SIZE(9.).}; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50/~; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50P$; WD. 03 -- ADDRESS OF SEND BUFFER; WD. 04 -- EFN, FLAGS BYTEC3; WD. 05 -- LENGTH OF SEND BUFFER (DEFAULT = 13.)SE; WD. 06 -- FIRST HALF OF NAME OF PARENT WHOSE OCB SHOULD BE PASSEDA/; WD. 07 -- SECOND HALF OF PARENT'S TASK NAME 5; WD. 08 -- ADDRESS OF OCB TO PASS (CLI TASKS ONLY)I;;S ; INPUTS:A;.-; R0=ADDRESS OF THE TCB OF THE TARGET TASK. :; R1=ADDRESS OF THE TASK STATUS WORD OF THE TARGET TASK.B; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.5; R3=ADDRESS OF THE SEND BUFFER ADDRESS IN THE DPB. 1; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.E.; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;O;E=; NOTE: ON SYSTEMS SUPPORTING NON RESIDENT TASK HEADERS ANDR5; PROTOTYPE TCBS, KISAR6 MAY MAP THE PROTOTYPE TCB(6; AT ENTRY AND THEREFORE WE CAN NOT ASSUME THAT THE; TASK HEADER IS MAPPED.R;A7; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)T;.; ; FOR SDRC$ AND VSRC$T;T/; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. (; DIRECTIVE STATUS OF +1 IS RETURNED.!; C=1 IF DIRECTIVE IS REJECTED.R6; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF A SEND,; PACKET, OFFSPRING CONTROL BLOCK , TASK4; CONTROL BLOCK OR PARTITION CONTROL BLOCK COULD; NO00Q0h%hgccccT BE ALLOCATED.T=; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF IT IS ILLEGALE!; TO SEND TO THE TARGET TASK.A;; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN INVALID%; EVENT FLAG NUMBER IS SPECIFIED.T9; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE EXITR4; STATUS BLOCK IS NOT ENTIRELY WITHIN THE USER'S ; SPACE.; D; THE SDRP$ DIRECTIVE CON RETURN ALL OF THE ABOVE ERRORS, PLUS THE; FOLLOWING THREE:;;; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF A PARAMETERO7; RESERVED FOR A LCI ONLY IS USED BY A NON-CLI TASKU5; OR AN ATTEMPT IS MADE TO PASS ALL OCBS TO A CLIK9; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF THERE ISA&; NO OCB FROM THE SPECIFIED PARENT;; DIRECTIVE STATUS OR 'D.RS84' IS RETURNED IF A CLI TASKI3; SPECIFIED BOTH A PARENT NAME AND OCB ADDRESS,R/; AND THE TWO DO NOT IDENTIFY THE SAME OCB,O2; OR EITHER FIELD IS SUPPLIED WITH THE FLAG TO; PASS ALL OCBS;-.$DRSRC::MOV R3,R1 ;COPY DPB ADDRESS TO SAVE7 MOV SP,$TEMP3 ;SAVE SP TO FACILITATE POSSIBLE UNWINDU9 CMPB $DICSV+1,#5 ;IS THIS ILLEGAL DPB LENGTH SPECIFIED5 BEQ ILLDPB ;IF EQ YES, NOTE THAT $DRSND VALIDATESA" ;DPB LENGTH FOR OTHER VALUES6 CALL ERRSV ;PUSH CONTEXT TO REVERSE SEND OPERATION& .WORD NULL ;NO ROUTINE TO CALL NOW* .WORD 10$ ;ADDRESS OF RECOVERY ROUTINE .IF DF X$$HDR- MOV $SAHPT,R4 ;RESTORE TASK HEADER ADDRESSE .IFF - MOV $HEADR,R4 ;RESTORE TASK HEADER ADDRESSO .ENDC' CALL $DRSND ;PERFORM SEND OPERATIONT$ MOV 4(SP),R3 ;RESTORE DPB ADDRESS' TST (R3)+ ;POINT TO EVENT FLAG WORD. CMPB $DICSV+1,#9. ;IS IT AN SDRP$ DIRECTIVE BEQ 20$ ;IF EQ YES& BR CNRQT ;CONNECT AND REQUEST TASK;N<; CODE TO REMOVE SEND PACKET FROM RECEIVERS QUEUE ON ERROR;N910$: ADD #T.RCVL,R0 ;POINT TO TARGET TASK RECEIVE QUEUED2 MOV 2(R0),R1 ;GET ADDRESS OF PACKET JUST QUEUED) CALL $GTSPK ;REMOVE IT FROM THE QUEUE4% MOV R1,R0 ;COPY POINTER TO PACKET.! MOV R0,KISAR6 ;MAP SEND PACKETS, MOV @#140002,R1 ;GET NUMBER OF WORDS SENT1 ADD #<6.+37>,R1 ;ALLOW FOR EXTRA CONTROL WORDS) ASH #-5,R1 ;CONVERT TO 32 WORD BLOCKSE' CALLR $DESEC ;DEALLOCATE THE PACKETO; .; LOCATE EXISTING OCB(S) FOR SDRP$ DIRECTIVE;T:20$: MOVB 1(R3),R2 ;GET FLAGS BYTE, DOES IT FORCE EXIT?? BMI 30$ ;IF MI YES6 MOV #1,$TEMP3 ;DON'T FORCE EXIT, BUT IT IS AN SDRP$330$: CMP (R3)+,(R3)+ ;POINT TO PARENT NAME FIELDS& CALL LOCOCB ;LOCATE OCB(S) TO PASS! MOV $TKTCB,R5 ;SET TCB ADDRESS JMP STRTSK ;REQUEST TASK;+; **-$DRCNC-CONNECT TO TASK ;XF; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CONNECT THE ISSUING TASK TO'; THE SPECIFIED (ACTIVE) TARGET TASK.;A; DPB FORMAT:);S%; WD. 00 -- DIC(143.),DPB SIZE(6.).,/; WD. 01 -- FIRST WORD OF TASK NAME IN RAD50.30; WD. 02 -- SECOND WORD OF TASK NAME IN RAD50.-; WD. 03 -- EFN, LENGTH OF ESB (DEFAULT=2).O:; WD. 04 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS./; WD. 05 -- ADDRESS OF THE EXIT STATUS BLOCK.P;S ; INPUTS:A;-; R0=ADDRESS OF THE TCB OF THE TARGET TASK.:; R1=ADDRESS OF THE TASK STATUS WORD OF THE TARGET TASK.B; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.3; R3=ADDRESS OF THE EVENT FLAG NUMBER IN THE DPB.1; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK..; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;D7; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)D; /; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.-(; DIRECTIVE STATUS OF +1 IS RETURNED.!; C=1 IF DIRECTIVE IS REJECTED.S<; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF AN OFFSPRING+; CONTROL BLOCK COULD NOT BE ALLOCATED.S=; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF AN ATTEMPT ISD* ; BEING MADE TO CONNECT TO A CLI TASK.: ; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF THE TARGET ; TASK IS NOT ACTIVE.R; ; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN INVALIDN% ; EVENT FLAG NUMBER IS SPECIFIED.E9; DIRECTIVE STATUS OF 'D.00Q8h*hzgM{gfffDATARS98' IS RETURNED IF THE EXITS0; STATUS BLOCK IS NOT ENTIRELY IN THE USER'S ; SPACE.;->$DRCNC::MOV #ERRSV,-(SP) ;PUSH ADDRESS OF ERROR SAVE ROUTINE$ TST (R1) ;IS TARGET TASK ACTIVE? BMI 10$ ;IF MI NOD, BIT #T3.CLI,T.ST3(R0) ;TARGET TASK A CLI? BEQ CNRQT ;IF EQ NOR' DRSTS D.RS2 ;CONNECTING TO CLI TASKH.10$: DRSTS D.RS7 ;SPECIFIED TASK NOT ACTIVE;+0; **-$DRREQ-REQUEST, SPAWN, OR CHAIN TO A TASK;LH; THIS ROUTINE INSTRUCTS THE SYSTEM TO REQUEST, SPAWN, OR CHAIN TO THEI; SPECIFIED TASK, DEPENDING ON THE DPB SIZE. IF THE DIRECTIVE IS RPOI$,= ; THE TASK IS CHAINED TO BY UNLINKING ALL OR A SELECTED OCBEB!; FROM THE CURRENT TASK, AND LINKING IT TO THE TARGET TASK. THIS5"; DIFFERS FROM SPWN$ IN THAT NO NEW OCB IS CREATED.Q#;T&$; DPB FORMAT: (FOR SPAWN OR REQUEST)%;C1&; WD. 00 -- DIC(11.),DPB SIZE(7., 13., OR 14.).C/'; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50.C0(; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50.;); WD. 03 -- FIRST WORD OF PARTITION NAME - NOT SUPPORTED.A<*; WD. 04 -- SECOND WORD OF PARTITION NAME - NOT SUPPORTED./+; WD. 05 -- REQUEST PRIORITY - NOT SUPPORTED.L,; WD. 06 -- REQUEST UIC.=-; WD. 07 -- EFN, LENGTH OF ESB (0 = 1 WORD, >0 = 8. WORDS). :.; WD. 08 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS.(/; WD. 09 -- EXIT STATUS BLOCK ADDRESS.?0; WD. 10 -- ADDRESS OF COMMAND LINE TO QUEUE FOR TARGET TASK. %1; WD. 11 -- LENGTH OF COMMAND LINE.232; WD. 12 -- VIRTUAL TERMINAL UNIT NUMBER FOR TI:. 03; WD. 13 -- ASCII DEVICE NAME (OPTIONAL FIELD)4; 5; DPB FORMAT: (FOR RPOI$)N6; %7; WD. 00 -- DIC (11.),DPB SIZE(16.) /8; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50. 09; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50.;:; WD. 03 -- FIRST WORD OF PARTITION NAME - NOT SUPPORTED.N<;; WD. 04 -- SECOND WORD OF PARTITION NAME - NOT SUPPORTED./<; WD. 05 -- REQUEST PRIORITY - NOT SUPPORTED.T=; WD. 06 -- REQUEST UIC.F>; WD. 07 -- FIRST HALF OF NAME OF PARENT,WHOSE OCB SHOULD BE PASSED.,?; WD. 08 -- SECOND HALF OF NAME OF PARENT.5@; WD. 09 -- ADDRESS OF OCB TO PASS (CLI TASK ONLY).(A; WD. 10 -- ADDRESS OF COMMAND BUFFER.'B; WD. 11 -- LENGTH OF COMMAND BUFFER.02C; WD. 12 -- UNIT NUMBER OF TASK TI:, FLAGS BYTE.(D; WD. 13 -- ASCII DEVICE NAME FOR TI:.BE; WD. 14 -- FIRST HALF OF NAME TO BE USED FOR NEW TASK IN RAD50.CF; WD. 15 -- SECOND HALF OF NAME TO BE USED FOR NEW TASK IN RAD50. G;6 H; INPUTS:II;-J; R0=ADDRESS OF THE TCB OF THE TARGET TASK.O:K; R1=ADDRESS OF THE TASK STATUS WORD OF THE TARGET TASK.BL; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.5M; R3=ADDRESS OF THE PARTITION NAME WORD IN THE DPB.G1N; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.F.O; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.P;M7Q; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)OR; /S; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. (T; DIRECTIVE STATUS OF +1 IS RETURNED.!U; C=1 IF DIRECTIVE IS REJECTED.O=V; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF AN ALLOCATIONU2W; FAILURE OCCURS ON A PARTITION CONTROL BLOCK,3X; OFFSPRING CONTROL BLOCK, COMMAND LINE BUFFER,DY; OR A TASK CONTROL BLOCK.=Z; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF AN ATTEMPT ISF4[; MADE TO ISSUE A SPAWN TO A COMMAND LINE INTER-/\; PRETER WITHOUT SPECIFYING A COMMAND LINE.T=]; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF THE SPECIFIED 1^; TASK IS ALREADY ACTIVE (WITH EXCEPTION OF A +_; SPAWN TO A COMMAND LINE INTERPRETER).A;`; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF AN INVALIDC)a; VIRTUAL TERMINAL UNIT IS SPECIFIED.F;b; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN INVALID %c; EVENT FLAG NUMBER IS SPECIFIED.F9d; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE EXIT 6e; STATUS BLOCK OR THE COMMAND LINE IS NOT ENTIRELY%f; IN THE TASK'S ADDRESSING SPACE.I;g; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF AN ILLEGALK,h; DPB SIZE IS SPECIFIED (NOT 7. OR 13.).i;WKj; THE ABOVE ERRORS ALSO APPLY TO THE RPOI$ DIRECTIVE, EXCEPT FOR 'D.RS97'R00Q@h%hgccccCk; WHICH IT CANNOT RETURN. THE RPOI$ DIRECTIVE CAN ALSO RETURN THEDl; FOLLOWING ERRORS.Sm;S;n; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF A PARAMETERD7o; RESERVED FOR A CLI ONLY IS USED BY A NON-CLI TASKE6p; OR AN ATTEMPT IS MADE TO PASS ALL OCBS TO A CLI.9q; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF THERE ISE'r; NO OCB FROM THE SPECIFIED PARENT.E;s; DIRECTIVE STATUS OF 'D.RS84' IS RETURNED IF A CLI TASK 3t; SPECIFIED BOTH A PARENT NAME AND OCB ADDRESS,X2u; AND THE TWO DO NOT IDENTIFY THE SAME OCB, OR,v; EITHER FIELD IS SUPPLIED WITH THE FLAG'w; REQUESTING ALL OCBS TO BE PASSED.Ux;-y z .ENABL LSBI:{$DRREQ::MOV SP,$TEMP3 ;SAVE CURRENT STACK TO EASE UNWIND)| CALL ERRSV ;INITIALIZE ERROR RECOVERYO#} .WORD NULL ;NO IMMEDIATE ACTIONI"~ .WORD NULL ;NO RECOVERY ACTION' ADD #6,R3 ;POINT TO UIC WORD IN DPBE2 MOV (R3)+,R4 ;PICK UP SPECIFIED UIC FOR REQUEST/ CMPB $DICSV+1,#7. ;IS THIS A SIMPLE REQUEST?N BNE 5$ ;IF NE NO( MOV T.UCB(R5),R5 ;GET TARGET UCB ADDR CLR $TEMP3 ;NOT AN RPOI$$ JMP RQST2 ;DO REQUEST PROCESSING65$: CMPB $DICSV+1,#13. ;IS IT A VALID SPAWN REQUEST? BEQ CNRQT ;IF EQ YES> CMPB $DICSV+1,#14. ;IS IT A SPAWN REQUEST WITH TI SPECIFIED BEQ CNRQT ;IF EQ YES% CMPB $DICSV+1,#16. ;IS IT AN RPOI$N BNE 10$ ;IF NE NON9 MOVB 13(R3),R2 ;GET FLAGS BYTE, SHOULD EXIT BE FORCED?  BMI 7$ ;IF MI YESF< MOV #1,$TEMP3 ;NO FORCED EXIT, BUT REMEMBER THIS IS RPOI$)7$: CALL LOCOCB ;LOCATE OCB(S) TO PASSG2 ADD #6,R3 ;POINT TO COMMAND BUFFER ADDR IN DPB BR 35$ ;JOIN COMMON CODE,10$: MOV (PC)+,R5 ;ASSUME ILLEGAL DPB SIZEILLDPB: DRSTS D.RS99 ;I JMP ERROR ;ILLEGAL DPB SIZEI;A0; CONNECT PROCESSING (CNCT, SDRC, SPWN, VSRC).;H; COMMON CONNECT AND REQUEST PROCESSING BEGINS HERE FOR REQUEST/SPAWN,N; CONNECT, AND (VARIABLE) SEND REQUEST AND CONNECT DIRECTIVES. THE FOLLOWINGH; SECTION PERFORMS THE CONNECT PROCESSING. AN OFFSPRING CONTROL BLOCKJ; IS ALLOCATED TO BE QUEUED TO THE OFFSPRING TASK'S OCB QUEUE. THEN THEG; EVENT FLAG AND EXIT STATUS BLOCK PARAMETERS ARE CHECKED AS THE OFF-PC; SPRING CONTROL BLOCK IS INITIALIZED. IF AN OCB IS SUCCESSFULLYH; ALLOCATED, ITS ADDRESS IS STORED IN $TEMP1 AS A FLAG THAT IT MUST BE1; QUEUED TO THE TARGET TASK ON SUCCESSFUL EXIT.E;/;,>; NOTE: ON SYSTEMS SUPPORTING NON RESIDENT TASK HEADERS AND5; PROTOTYPE TCBS, KISAR6 MAY MAP THE PROTOTYPE TCBE6; AT ENTRY AND THEREFORE WE CAN NOT ASSUME THAT THE; TASK HEADER IS MAPPED.S;C$; REGISTER CONTENTS AT THIS POINT:; /; R3=PTR TO THE EVENT FLAG NUMBER IN THE DPB.;P5CNRQT: CLR $TEMP3 ;NOT AN RPOI$ OR SDRP$ DIRECTIVEL# MOV #O.LGTH,R1 ;PICK UP OCB SIZER6 CALL @(SP)+ ;ALLOCATE OCB WITH TRAIL TO DEALLOCATE, .WORD $ALOCB ;ALLOCATION ROUTINE ADDRESS- .WORD DEOCB ;DEALLOCATION ROUTINE ADDRESS ( BCC 20$ ;IF CC ALLOCATION SUCCESSFUL- JMP ALLER ;ELSE REPORT ALLOCATION FAILUREN320$: MOV R0,$TEMP1 ;STORE OCB ADDRESS FOR CONNECTD1 MOV (PC)+,R5 ;ASSUME INVALID EVENT FLAG NUMBER  DRSTS D.RS97 ; MOV R0,R4 ;COPY OCB POINTERT. MOVB (R3)+,R0 ;PICK UP SPECIFIED EVENT FLAG) CMP R0,#96. ;VALID EVENT FLAG NUMBER?R BHI 10$ ;IF HI NO1 CMP R0,#64. ;IS IT A GROUP GLOBAL EVENT FLAG?E .IF DF G$$GEF BLOS 25$ ;IF LOS NO. MOV R4,-(SP) ;SAVE R4 .IF DF X$$HDR- MOV KISAR6,-(SP) ;SAVE KERNEL APR6 MAPPING 2 MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER, MOV $SAHPT,R4 ;GET ADDRESS OF TASK HEADER .IFF 6 MOV $HEADR,R4 ;GET ADDRESS OF CURRENT TASK'S HEADER .IFTF9 MOVB H.CUIC+1(R4),R4 ;GET CUURRENT TASK'S GROUP NUMBERR .IFTD+ MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPINGC .ENDC MOV R0,-(SP) ;SAVE R04 CALL $SRGEF ;SEARCH FOR GROUP GLOBAL EVENT FLAGS MOV (SP)+,R0 ;RESTORE R0 MOV (SP)+,R4 ;RESTORE R4V0 BCS 10$ ;IF CS, INVALID EVENT FLAG SPECIFIED .IFF ; DF G$$GEFI) BHI 10$ ;INVALID EVENT00QHh*hzgM{gfffDATA FLAG SPECIFIED  .ENDC ; DF G$$GEF625$: MOV $TKTCB,R5 ;PICK UP CURRENT TASK TCB ADDRESS' MOV R0,-(SP) ;SAVE EVENT FLAG NUMBER17 CALL $CEFIG ;CONVERT EVENT FLAG TO MASK AND ADDRESS0 BIC #1,R1 ;CLR GRP GLOBAL 2ND WORD INDICATOR! BIC R0,(R1) ;CLEAR EVENT FLAGS. TST (R4)+ ;SKIP OVER OCB LINK WORD (O.LNK)2 CLR (R4)+ ;INITIALLY CLR MCR LINE PTR (O.MCRL)0 MOV R5,(R4)+ ;SET PARENT TCB ADDRESS (O.PTCB). MOV #2,R1 ;ASSUME 1 WORD EXIT STATUS BLOCK CLR R0 ;DITTOV3 TSTB (R3)+ ;WAS IT A 1 WORD EXIT STATUS BLOCK ? BEQ 27$ ;IF EQ YES( MOV #8.*2,R1 ;DEFAULT SIZE TO 8 WORDS INC R0 ;SET FULL ESB FLAG327$: CMPB $DICSV+1,#8. ;IS THIS A VSRC$ DIRECTIVES BNE 28$ ;IF NE NOG, 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 ADDRESSD/ MOV R2,(R4)+ ;SET PROPER AST ADDRESS (O.AST)  .IFF+ MOV (R3)+,(R4)+ ;SET AST ADDRESS (O.AST)R .ENDC1 MOV (SP)+,(R4)+ ;SET EVENT FLAG NUMBER (O.EFN)S( MOV R0,(R4) ;INDICATE 1/8 WORDS LONG2 MOV (R3)+,R0 ;PICK UP EXIT STATUS BLOCK ADDRESS. BIS R0,(R4)+ ;SET EXIT STATUS BLOCK ADDRESS7 MOV T.NAM(R5),(R4)+ ;STORE PARENT TASK NAME (O.STAT)" MOV T.NAM+2(R5),(R4)+ ;O.STAT+2(  CLR (R4)+ ;INITIALIZE PROTECTION UIC%  CLR (R4)+ ;INITIALIZE DEFAULT UICD.  CLR (R4) ;INITIALIZE CONTEXT BLOCK POINTER(  TST R0 ;EXIT STATUS BLOCK SPECIFIED?+  BEQ 30$ ;IF EQ NO, BYPASS ADDRESS CHECK0 CALL $ACHCK ;ADDRESS CHECK EXIT STATUS BLOCK# BCC 30$ ;IF CS ADDRESS CHECK OK/(29$: JMP ADCER ;ADDRESS CHECK FAILUREG30$: CMPB $DICSV,#141. ;IS DIRECTIVE A (VAR) SEND, REQUEST & CONNECT?1 BEQ STRTSK ;IF EQ YES, BRANCH TO REQUEST TASKT' BLO 35$ ;IF LO IT IS SPAWN OR RPOI$4 JMP SUCCESS ;IF HI IT IS CONNECT, RETURN SUCCESS/STRTSK: CLR R4 ;PROPAGATE ISSUING TASK'S UICE( MOV T.UCB(R5),R5 ;SET TI: UCB ADDRESS( JMP RQST1 ;GO TO COMMON REQUEST CODE35$: ;REFERENCE SYMBOL;H9; TI: DETERMINATION AND COMMAND LINE PROCESSING (SPWN).D;CG; HERE THE TARGET TASK'S TI: IS DETERMINED FOR THE SUBSEQUENT REQUEST4A; AND COMMAND LINE PROCESSING IS INITIATED. IF A TERMINAL UNIT;A; HAS BEEN SPECIFIED, THEN IT IS VERIFIED AND ITS UCB IS FOUND.O3 ; OTHERWISE THE ISSUING TASK'S UCB IS PROPAGATED.N!;E$"; REGISTER CONTENTS AT THIS POINT:#;S5$; R3=PTR TO COMMAND LINE BUFFER ADDRESS IN THE DPB.J"%; R5=TCB ADDRESS OF CURRENT TASK&;5',(40$: MOV T.UCB(R5),R2 ;GET TI: UCB ADDRESS9) CMPB $DICSV+1,#14. ;CAN TI BE SOMETHING OTHER THAN VT?E* BLT 45$ ;IF LT NOI&+ TST 6(R3) ;WAS A DEVICE SPECIFIED?, BEQ 45$ ;IF EQ NOP$- CMP 6(R3),#"VT ;IS "VT" SPECIFIED. BNE 64$ ;IF NE NOE/45$: ;REFERENCE SYMBOLN01 .IF DF V$$TRM283 MOVB 4(R3),R1 ;WAS A VIRTUAL TERMINAL UNIT SPECIFIED?14 BEQ 80$ ;IF EQ NO, DO COMMAND LINE PROCESSINGR05 MOV $VTDCB,R2 ;POINT TO FIRST CREATED VT: DCB6650$: CMPB D.UNIT(R2),R1 ;IS THIS THE UNIT SPECIFIED?7 BEQ 60$ ;IF EQ YES'8 MOV (R2),R2 ;ELSE POINT TO NEXT DCBS49 CMP D.NAM(R2),#"VT ;IS IT A VIRTUAL TERMINAL DCB?: BEQ 50$ ;IF EQ YES!; BR ILUER ;RETURN ERROR STATUS)<60$: MOV D.UCB(R2),R2 ;POINT TO VT: UCBE>< BIT #T3.CLI,T.ST3(R5) ;IS THE ISSUING TASK A CLI? ;PKW111+< BNE 80$ ;YES, LET IT THROUGH ;PKW111MK< CMP R2,T.UCB(R5) ;IS THE ISSUING TASK ALREADY RUNNING ON THE VT? ;PKW111M&< BEQ 80$ ;THAT'S OK TOO ;PKW1112= CMP U.PTCB(R2),R5 ;UNIT CREATED BY THIS PARENT?> BNE ILUER ;IF NE NO ?@ .ENDC ;V$$TRMAB+C BR 80$ ;PERFORM COMMAND LINE PROCESSING D:E64$: MOV R3,R4 ;SAVE POINTER TO COMMAND LINE BUF IN DPB F MOV 6(R3),R0 ;GET DEVICE NAME-G BEQ 45$ ;IF EQ, DEVICE NAME NOT SPECIFIEDI'H MOV 4(R3),R1 ;GET DEVICE UNIT NUMBER;5I CALL $CVDVN ;CONVERT DEVICE NAME TO A UCB ADDRESS%J BCS ILUER ;IF CS DEVICE NOT FOUNDA*K BITB #US.OFL,U.ST2(R2) ;DEVICE OFFLINE?L BNE PRVER ;IF NE YES9M BIT #DV.TTY,U.CW1(R2)00QPh%hgcccc ;IS SPECIFIED DEVICE A TERMINAL?N BEQ ILUER ;IF EQ NO4O CMP R2,T.UCB(R5) ;IS CURRENT TASK'S TI: SPECIFIEDP BEQ 70$ ;IF EQ YES6Q BIT #T3.PRV!T3.CLI,T.ST3(R5) ;IS TASK PRIV OR A CLIR BEQ PRVER ;IF EQ NOD2S70$: MOV R4,R3 ;GET ADDRESS OF COMMAND LINE BUF#T80$: MOV R2,R5 ;COPY UCB ADDRESSN(U BR CMLPR ;DO COMMAND LINE PROCESSING V .DSABL LSB WX; Y; LOCAL ERROR RETURN ROUTINES.Z;G[; THE FOLLOWING ROUTINES INTERFACE TO $DRTHR AND $ERREC FOR DIRECTIVEBE\; ERROR STATUS RETURNS AND ERROR RECOVERY. R5 IS USED TO STORE THEI"]; ERROR STATUS TRAP INSTRUCTION.^; _9`ADCER: MOV (PC)+,R5 ;PICK UP ADDRESS CHECK ERROR STATUS.a DRSTS D.RS98 ;3bERROR: JMP $ERREC ;THREAD THROUGH ERROR RECOVERYV8cILUER: MOV (PC)+,R5 ;PICK UP ILLEGAL DEVICE UNIT ERRORd DRSTS D.RS92 ;!e BR ERROR ;RETURN ERROR STATUSC5fPRVER: MOV (PC)+,R5 ;PICK PRIVILEGE VIOLATION ERRORNg DRSTS D.RS16 ;!h BR ERROR ;RETURN ERROR STATUSTBiILPARM: MOV (PC)+,R5 ;GET PARAMETER ILLEGAL FOR THIS TASK STATUSj DRSTS D.RS8 ; k BR ERROR ;4lNOTINS: MOV (PC)+,R5 ;GET TASK NOT INSTALLED ERRORm DRSTS D.RS2 n BR ERRORDop;K=q; DEOCB - DEALLOCATES THE CONTEXT BLOCK IN THE OCB (IF ANY)D"r; BEFORE DEALLOCATING THE OCBs;CtDEOCB:u .IF DF N$$DIR v!w MOV R1,-(SP) ;SAVE SIZE OF OCBR*x MOV O.STAT+10(R0),R1 ;GET CONTEXT BLOCKy BEQ 10$ ;IF EQ, NONE$z CALL $DLCTX ;DEALL CONTEXT BLOCK!{10$: MOV (SP)+,R1 ;RESTORE SIZEL|} .ENDC ;DF N$$DIRA~  JMP $DEACB ; /; COMMAND LINE PROCESSING FOR SPWN$ AND RPOI$I;O; REGISTERS AT THIS POINTA;E/; R3=POINTER TO COMMAND BUFFER ADDRESS IN DPB ; R5=TARGET TASK UCB ADDRESS-CMLPR: MOV (R3),R0 ;COMMAND LINE SPECIFIEDI BEQ 80$ ;IF EQ NOC& MOV 2(R3),R1 ;GET LENGTH OF COMMAND& BEQ 80$ ;IF EQ, EMPTY COMMAND LINE! CMP #M$$XLN,R1 ;IS IT TOO LONG1 BLOS ADCER ;IF LOS YES+ CALL $ACHRO ;ADDRESS CHECK COMMAND LINER+ BCS ADCER ;IF CS, ADDRESS CHECK FAILURE' MOV R3,$TEMP4 ;SAVE POINTER INTO DPBI, MOV 2(R3),R1 ;GET LENGTH OF COMMAND AGAIN@ ADD #C.CTXT+1+77,R1 ;ALLOW FOR HEADER, FINAL CR, AND ROUNDOFF) ASH #-6,R1 ;CONVERT TO 32 WORD BLOCKSE6 CALL @(SP)+ ;ALLOCATE A BUFFER FROM SECONDARY POOL$ .WORD $ALSEC ;ALLOCATION ROUTINE& .WORD $DESEC ;DEALLOCATION ROUTINE BCC 10$ ;IF CC OKE! JMP ALLER ;ALLOCATION FAILURE157$: MOV (PC)+,R5 ;PICK UP COMMAND LINE ERROR STATUSK DRSTS D.RS2 ;B! BR ERROR ;RETURN ERROR STATUSL310$: MOV KISAR6,-(SP) ;SAVE POTENTIAL TCB MAPPINGR# MOV $TEMP0,R2 ;GET OFFSPRING TCB MOV T.ST3(R2),R2 ;SAVE T.ST3E3 MOV R0,KISAR6 ;MAP SEC POOL BLOCK JUST ALLOCATED 4 MOV #140004,R4 ;SET VIRT. ADDR TO REFERENCE BLOCK) MOV R5,(R4)+ ;PUT UCB ADDRESS IN BLOCKO' MOV 2(R3),(R4)+ ;SET CHARACTER COUNTA CLR -(SP) ;INIT STATUS WORDO* BIT #T3.CLI,R2 ;IS OFFSPRING TASK A CLI BEQ 30$ ;IF EQ NOK .IF DF A$$CLI+ BIS #CC.CLI,(SP) ;SET CLI ONLY RETREIVALR .IFTF ;A$$CLI/ MOV $TEMP1,R2 ;POINT TO OCB (IF ANY) TO PASSV BEQ 20$ ;IF EQ, NO OCB0 MOV R0,O.MCRL(R2) ;PUT COMMAND ADDRESS IN OCB20$:* TST $TEMP3 ;IS THIS AN RPOI$ DIRECTIVE BEQ 25$ ;IF EQ NO 1 MOV $TKTCB,R2 ;GET TCB ADDRESS OF CURRENT TASKS= BIT #T3.CMD,T.ST3(R2) ;IS CURRENT TASK PART OF CLI COMMANDS BEQ 25$ ;IF EQ NO8 BIS #CC.TTD,(SP) ;HAVE SYSTEM HANDLE AS IF FROM TTDRV25$: ;REFERENCE LABEL .IFT ;A$$CLIC4 CMP $TEMP0,$MCRPT ;IS COMMAND GOING TO DISPATCHER BNE 30$ ;IF NE NOO2 CMP #^RMCR,-22(R3) ;WAS MCR... TARGET TASK NAME% BNE 30$ ;IF NE NO (IT WAS CLI...) ) BIS #CC.MCR,(SP) ;SET FORCE TO MCR BITT .ENDC ;A$$CLI'30$: MOV (SP)+,(R4)+ ;SET STATUS WORDC4 CLR (R4)+ ;INIT STARTING RETURN OFFSET FOR GMCR$$ MOVB #33,(R4)+ ;ASSUME TERMINATOR* MOVB R1,(R4)+ ;SET BLOCK ALLOCATE COUNT) MOV (R3),R0 ;GET COMMAND TEXT ADDRESS:& CALL $RELOC ;RELOCATE USER ADDRESS* SUB #20000,R2 ;CONVERT TO APR 5 MAPPING MOV 2(R3),R0 ;GET L00QXh*hzgM{gfffDATAENGTH  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 LENGTH0040$: 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 TERMINATORSC*50$: BEQ 60$ ;IF EQ, AN ESC IS EMBEDDED# CMPB #15,(R4) ;IS A CR EMBEDDED?A BNE 45$ ;IF NE NO260$: DEC R1 ;ADJUST COUNTER+ SUB R1,(SP) ;CALC DIFFERENCE IN LENGTHSV= SUB (SP)+,@#C.CCT+140000 ;CALC NUMBER OF CHARS NOW PRESENT 3 BISB #200,(R4) ;FLAG TERMINATOR AS USER SUPPLIEDT/ MOVB (R4),@#C.CTR+140000 ;SET NEW TERMINATOR:+ MOVB #15,(R4) ;FORCE TRAILING CHAR TO CR070$: MOV R3,R1 ;GET ADDRESS OF SEC POOL BLOCK9 MOV (SP)+,KISAR6 ;RESTORE POTENTIAL TARGET TCB MAPPINGT5 MOV #$CLICQ,R0 ;POINT TO LISTHEAD OF COMMAND QUEUEP7 CALL @(SP)+ ;PUSH ROUTINE TO REMOVE LINE FROM QUEUE! .WORD NULL ;NOTHING TO DO NOWB! .WORD $GTSPK ;DEQUEUE ROUTINEH5 MOV $TEMP4,R3 ;GET BACK POINTER TO CMD ADDR IN DPBO8 MOV R1,$TEMP4 ;SAVE ADDRESS OF SEC POOL COMMAND BLOCK.80$: TST $TEMP4 ;IS A COMMAND LINE SUPPLIED BNE RQST ;IF NE YES)  MOV $TEMP0,R0 ;GET TARGET TCB' BIT #T3.CLI,T.ST3(R0) ;IS TASK A CLIO- BNE 7$ ;IF NE YES, LI MUST HAVE A COMMANDE;P; COMMON REQUEST PROCESSING;;TD; HERE IS THE COMMON REQUEST PROCESSING FOR ALL DIRECTIVES IN THISC; MODULE. THE DEFAULT AND PROTECTION UICS ARE DETERMINED, AND THEUG; NAME OF THE TASK CALCULATED IF NECESSARY. FOR ALL DIRECTIVES EXCEPTM>; THE RPOI$, THIS IS BASED ON THE TARGET TASK NAME AT OFFSET<; 2 IN THE DPB. THE RPOI$ DIRECTIVE ALLOWS A SPECIFIC NAMEC; FOR THE OFFSPRING TO BE SPECIFIED. THIS CAN ONLY BE DONE IF THE B; ORIGINAL TARGET HAD A NAME OF THE FORM ...XXX. IF THE NEW NAMEE; IS NOT OF THE ...XXX FORM, IT IS USED AS IS. IF THE NEW SPECIFIEDE@; NAME IS OF THE ...XXX FORM, THE APPROPRIATE FORM OF THE NAME1; FOR THE TASK'S TI:UCB IS CALCULATED AND USED.HB; THE TASK IS THEN REQUESTED VIA $TSKRP, UNLESS IT IS A CLI WITHC; A NAME NOT IN THE ...XXX FORM. THESE CLI TASKS ARE REQUESTED BYD;; $EXRQN WHICH IS CALLED BY THE COMMAND QUEUEING ROUTINE.F;N; REGISTERS AT THIS POINTN; ); R3=POINTER TO CMD TEXT ADDRESS IN DPBE; R5=TI:UCB ADDRESS ;E'RQST: MOV -10(R3),R4 ;GET REQUEST UICU. RQST1: MOV $TEMP0,R0 ;GET TARGET TCB ADDRESS9 RQST2: TST $TEMP3 ;IS THIS AN RPOI$ OR SDRP$ DIRECTIVE   BEQ 30$ ;IF EQ NOL&  CMPB $DICSV,#141. ;IS THIS AN SDRP$  BEQ 30$ ;IF EQ YES- ADD #10,R3 ;POINT TO SPECIFIED NAME FIELD." TST (R3) ;WAS A NAME SPECIFIED BEQ 30$ ;IF NE NOI; #; HANDLE SPECIFIED NAME FOR RPOI$E; .IF DF A$$CLI) BIT #T3.CLI,T.ST3(R0) ;IS TARGET A CLID+ BNE 10$ ;IF NE YES, CANNOT RENAME A CLI .ENDC ;A$$CLI1 CMP #^R...,T.NAM(R0) ;DOES TARGET HAVE MU NAMEB BEQ 15$ ;IF EQ YES+10$: JMP ILPARM ;ILLEGAL PARAMETER ERROR 15$: ;I'! CMP #^R...,(R3) ;IS NEW NAME MU TYPEN" BNE 20$ ;IF NE NO )# MOV R5,R0 ;SET ADDRESS OF DESIRED UCBN$ MOV 2(R3),R1 ;GET NEW NAME % CALL $SRMUT ;CALC NEW NAME%& BCC 25$ ;IF CC, IT ALREADY EXISTS ' BR 40$ ;CREATE IT.(20$: CALL $SRSTD ;DOES SPECIFIED TASK EXIST) BCS 40$ ;IF CS NO18*25$: CMP $TKTCB,R0 ;DID WE FIND TASK ISSUING DIRECTIVE#+ BNE 60$ ;IF NE NO, USE THIS TCBE<, CMP #1,$TEMP3 ;IS CURRENT TASK GOING TO EXIT IN DIRECTIVE- BNE 40$ ;IF NE YES!. JMP TSKACT ;TASK ACTIVE ERROR,/;;L0; CALCULATE TASK NAME FOR ALL CASES OTHER THAN RPOI$ WITH A SPECIFIED NAME1; :230$: CMP #^R...,T.NAM(R0) ;DOES TARGET HAVE MU TYPE NAME3 BEQ 35$ ;IF EQ, YES #4 CMP #140000,R0 ;TCB IN SEC POOL?R5 BHI 70$ ;IF HIGH, NO 6 JMP NOTINS ;OTHERWISE, ERROR/735$: MOV T.NAM+2(R0),R1 ;GET HALF OF NEW NAMEE"8 MOV R5,R0 ;GET DESIRED TI: UCB9 CALL $SRMUT ;CALC NEW NAME%: BCC 60$ ;IF CC, IT ALREADY EXISTS ;;I9<; THE DESIRED TCB DOES NOT EXIST, SO IT MUST BE CR00Q`h%hgccccEATEDK=;V(>40$: MOV #T.LGTH,R1 ;GET LENGTH OF TCB? CALL $ALOCB ;ALLOCATE ONET@ BCC 45$ ;IF CC, OKA JMP ALER1 ;IF CS, NO POOLD/B45$: MOV $TEMP0,R1 ;GET PROTOTYPE TCB ADDRESS /C CMP #120000,R1 ;IS PROTOTYPE IN PRIMARY POOLID BHI 50$ ;IF HI YES&E MOV #$PTCPT+1,R1 ;POINT TO APR BIAS0F50$: MOV R4,$TEMP0 ;PRESERVE REQUEST UIC AGAIN5G CALL @(SP)+ ;INSTALL NEW TCB WITH TRAIL TO REMOVEE"H .WORD $TCBCP ;COPY AND INSTALL'I .WORD $REMOV ;REMOVE AND DEALLOCATEE&J MOV $TEMP0,R4 ;GET REQUEST UIC BACK-K60$: MOV R0,$TEMP0 ;USE NEW TCB FROM NOW ONALMN .IF DF A$$CLIO3P INC R5 ;REMEMBER THAT ORIGINAL HAD MU TYPE NAME:QR .IFTF ;A$$CLIST;C5U; PUT TCB ADDRESS IN COMMAND BUFFER, AND START TASKPV;9W70$: MOV $TEMP4,KISAR6 ;MAP COMMAND BUFFER IF IT EXISTSIX BEQ 72$ ;IF EQ, NO COMMAND5Y MOV R0,@#C.CTCB+140000 ;PUT TCB ADDRESS IN COMMANDWZ72$: ;REFERENCE LABEL[$\ .IF DF N$$DIR ;NAMED DIRECTORIES]^ MOV R5,R1 ;COPY UCB ADDRESS$!_ BIC #1,R1 ;INSURE UCB IS EVEN0%` CMPB $DICSV+1,#16. ;IS IT AN RPOI$Oa BEQ 80$ ;IF EQ YES*b BIT #T3.CLI,T.ST3(R0) ;OFFSPRING A CLI?c BEQ 80$ ;IF EQ, NO!d MOV $TEMP1,R2 ;GET OCB, IF ANY e BEQ 80$ ;IF EQ, NO OCB!f MOV $TKTCB,R3 ;GET CURRENT TCBV<g CMP R1,T.UCB(R3) ;SPAWNED TASK TI: SAME AS SPAWNING TASK?h BEQ 73$ ;IF EQ, YESV2i BIT #DV.PSE,U.CW1(R1) ;IS THIS A PSEUDO DEVICE?j BNE 73$ ;IF NE, YES0k MOV U.CTX(R1),R1 ;USE CONTEXT FROM TARGET UCB l BR 75$C5m73$: MOV T.CTX(R3),R1 ;USE CONTEXT FROM CURRENT TCB9n75$: MOV R1,O.STAT+10(R2) ;PUT CONTEXT POINTER INTO OCBS$o BEQ 80$ ;IF EQ, NO CONTEXT BLOCK)p MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGP(q MOV R1,KISAR6 ;MAP THE CONTEXT BLOCK/r INCB C.REF+140000 ;INCREMENT REFERENCE COUNTC$s MOV (SP)+,KISAR6 ;RESTORE MAPPINGtuv .IFF ;DF N$$DIRw%x CMPB $DICSV+1,#16. ;IS IT AN RPOI$;y BEQ 80$ ;IF EQ YES!z MOV $TEMP1,R2 ;GET OCB, IF ANYU{ BEQ 80$ ;IF EQ, NO OCB1| CLR O.STAT+10(R2) ;CLEAR CONTEXT BLOCK POINTERU}~ .ENDC ; DF N$$DIR"80$: MOV R4,R1 ;SET REQUEST UIC! MOV R4,-(SP) ;SAVE REQUEST UIC " CALL UISET ;CALC PROT/DEF UICS$ MOV (SP)+,R4 ;RESTORE REQUEST UIC) BIT #T3.CLI,T.ST3(R0) ;OFFSPRING A CLIC BEQ 90$ ;IF EQ NON .IFT ;A$$CLI BIT #1,R5 ;MU NAME TYPE CLI BNE 90$ ;IF NE YES .IFTF ;A$$CLI. TST R4 ;WAS UIC SPECIFIED IN ORIGINAL DPB? BEQ 85$ ;IF EQ NOI% MOV $TEMP1,R2 ;GET OCB ADDR IF ANYC BEQ 85$ ;IF EQ, NO OCB* MOV R1,O.STAT+4(R2) ;SET PROTECTION UIC' MOV R3,O.STAT+6(R2) ;SET DEFAULT UIC&85$: MOV $TEMP4,R1 ;POINT TO COMMAND3 BEQ 90$ ;IF EQ, NO COMMAND FROM RQST$ DIRECTIVEO. CALL $QCPKT ;QUEUE COMMAND AND REQUEST CLI% BCC SUCCES ;IF CC, CLI STARTED OK./ BEQ SUCCES ;IF CC, CLI ALLOWED TO BE ACTIVE% BR ALER1 ;POOL ALLOCATION FAILURE;;I;90$: .IFT ;A$$CLIF& BIC #1,R5 ;INSURE EVEN UCB ADDRESS .ENDC ;A$$CLI* MOV $TKTCB,R2 ;GET ISSUER'S TCB ADDRESS* .IF DF N$$DIR ;NAMED DIRECTORY SUPPORT< CMP R5,T.UCB(R2) ;SPAWNED TASK TI: SAME AS SPAWNING TASK? BEQ 93$ ;IF EQ, YESQ2 BIT #DV.PSE,U.CW1(R5) ;IS THIS A PSEUDO DEVICE? BNE 93$ ;IF NE, YESQ4 MOV U.CTX(R5),$CTXPT ;USE CONTEXT FROM TARGET UCB  BR 95$;993$: MOV T.CTX(R2),$CTXPT ;PROPAGATE ISSUING TASK'S DDST .ENDC ;DF N$$DIR795$: CMP $TEMP3,#1 ;WILL THE CURRENT TASK BE EXITING?A BLOS 97$ ;IF LOS NOC7 BIS #T2.HLT,T.ST2(R2) ;PREVENT A POSSIBLE CHECKPOINT&97$: MOV #100$,-(SP) ;ASSUME SUCCESS" MOV R5,R2 ;GET TARGET UCB ADDR MOV R0,R5 ;SAVE TCB ADDRESS?! CALL $TSKRP ;REQUEST THE TASK# BCC 99$ ;IF CC, OK( BEQ 98$ ;IF EQ, ALLOCATION SUCCEEDED& MOV #ALER1,(SP) ;ELSE PROCESS ERROR BR 99$ ;AFTER CLEANUP;,98$: BIT #T3.CLI,T.ST3(R5) ;IS TASK A CLI?( BNE 99$ ;IF NE YES, IT CAN BE ACTIVE% CMPB $DICSV,#141. ;SDRC$ OR SDRP$?E" BEQ 99$ ;IF EQ, TASK ACTIVE OK+ MOV #TSKACT,(SP) ;ELSE TASK ACTIVE ERROR .99$: MOV $TKTCB,R1 ;GET IS00Qhh*hzgM{gfffDATASUER'S TCB ADDRESS1 BIC #T2.HLT,T.ST2(R1) ;RESET EXITING CONDITION  RETURN5*100$: CMP 6(SP),#$REMOV ;WAS TCB CREATED BNE 110$ ;IF NE NO0 BIS #T3.REM,T.ST3(R5) ;SET REMOVE ON EXIT BIT.110$: MOV $TEMP4,R1 ;POINT TO COMMAND BUFFER! BEQ SUCCES ;IF EQ, NO COMMANDT& CALL $QCLNR ;QUEUE COMMAND TO TASK# BR SUCCES ;FINISH UP PROCESSING  .ENABL LSBD5ALLER: ADD #6,SP ;POP THREAD TO DEALLOCATE ROUTINEM8ALER1: MOV (PC)+,R5 ;PICK UP ALLOCATION FAILURE STATUS DRSTS D.RS1 ;T  BR 10$8TSKACT: MOV (PC)+,R5 ;PICK UP TASK ACTIVE ERROR STATUS DRSTS D.RS7 ;(&10$: JMP ERROR ;RETURN ERROR STATUS  .DSABL LSB;TF; THE TARGET TASK HAS BEEN SUCCESSFULLY STARTED. FROM THIS POINT ON,B; NOTHING CAN GO WRONG. IRREVERSIBLE ACTIONS SUCH AS PROPOGATINGA; PROMPT REQUEST BITS AND CHANGING OCB LINKAGES CAN NOW BE DONE.H; SINCE THEY CANNOT GENERATE AN ERROR, AND THE DIRECTIVE MUST SUCCEED.;V/SUCCES: MOV $TEMP0,R4 ;GET TARGET TCB ADDRESSD( ADD #T.OCBH,R4 ;POINT TO ITS OCB LIST% MOV $TEMP1,R1 ;POINT TO ANY OCB(S)T+ MOV $TEMP3,R5 ;RPOI$ OR SDRP$ DIRECTIVE?T BEQ 30$ ;IF EQ NOS& MOV $TKTCB,R0 ;GET CURRENT TASK TCB( ADD #T.OCBH,R0 ;POINT TO ITS OCB LIST CMP #1,R1 ;PASS ALL OCBS BEQ 10$ ;IF EQ YES8 MOV T.ST3-T.OCBH(R0),-(SP) ;GET T.ST3 OF CURRENT TASK> BIS T.ST3-T.OCBH(R4),(SP) ;PUT T.ST3 OF TARGET ON TOP OF IT* BIT #T3.CLI,(SP)+ ;IS EITHER TASK A CLI BEQ 20$ ;IF EQ NO -10$: CALL PSPRMT ;PASS PROMPT CONTROL INFOC120$: CMP #1,R1 ;DETERMINE HOW TO HANDLE OCB(S)N BHI 70$ ;IF HI, NO OCB# BEQ 50$ ;IF EQ, PASS ALL OCB(S)E CALL $QRMVA ;REMOVE OCB FROM CURRENT TASK (MUST BE THERE) ;JWB167. BR 40$ ; ;**-1 30$: TST R1 ;ANY OCB  BEQ 80$ ;IF EQ NOI1 MOV O.PTCB(R1),R2 ;GET PARENT TASK TCB ADDRESSO* INC T.RDCT(R2) ;INCREMENT RUNDOWN COUNT,40$: MOV R4,R0 ;POINT TO TARGET OCB QUEUE$ CALL $QINSF ;INSERT OCB IN QUEUE BR 70$ ;ALL DONE>50$: MOV (R0),R1 ;GET ADDRESS OF FIRST OCB OFF CURRENT TASK! BEQ 70$ ;IF EQ, NO OCBS EXIST" CLR (R0) ;FORICIBLY EMPTY LIST, MOV R0,2(R0) ;SET SECOND HALF OF LISTHEAD: MOV R1,@2(R4) ;LINK AFTER PREVIOUS LAST OCB FROM TARGET260$: MOV R1,2(R4) ;SET POINTER TO NEW LAST ENTRY+ MOV (R1),R1 ;POINT TO NEXT OCB IN QUEUEA6 BNE 60$ ;IF NE, THERE IS ANOTHER SO UPDATE POINTER770$: MOV $TEMP4,KISAR6 ;MAP COMMAND LINE IF IT EXISTS" BEQ 75$ ;IF EQ NO COMMAND LINE; BICB #200,@#C.CTR+140000 ;ELIM USER TERMINATOR INDICATORI.75$: CMP #1,R5 ;FORCE CURRENT TASK TO EXIT? BHIS 80$ ;IF HIS NO 7 MOV R5,SP ;POINT STACK BACK TO RETURN ADDR TO DRDSPO. MOV $TKTCB,R5 ;GET CURRENT TASK TCB ADDRESS,  CALLR $DREXT ;FORCE CURRENT TASK TO EXIT 80$: DRSTS +1 ;THE ENDY   ;+; **-$DREXS-EXIT WITH STATUS;BD; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO PASS A STATUS WORD TO ALL; PARENT TASKS AND EXIT.;I; DPB FORMAT: ;Q#; WD. 00 -- DIC(29.),DPB SIZE(2.)R; WD. 01 -- STATUS WORD.;I ; INPUTS::;#=; R2=ADDRESS OF THE SECOND STATUS WORD OF THE CURRENT TASK.-; R3=ADDRESS OF THE STATUS WORD IN THE DPB. 1; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.E.; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;07; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)W ;TB!; NO STATUS IS RETURNED TO THE ISSUING TASK SINCE THIS DIRECTIVE"; TERMINATES ITS EXECUTION.A#;-$0%$DREXS::BIT #T3.ACP,T.ST3(R5) ;IS THIS AN ACP?& BNE 5$ ;IF NE YESD0' MOV (R3),T.EFLG+2(R5) ;SET EXIT STATUS IN TCB'(5$: CALLR $DREX2 ;INITIATE TASK EXIT )*;++; **-$DREMS-EMIT STATUS ,;TD-; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EMIT A STATUS WORD TO ALL0.; OR A SPECIFIED PARENT TASK WITHOUT EXITTING./;0; DPB FORMAT:(1;T%2; WD. 00 -- DIC(147.),DPB SIZE(4.).:3; WD. 01 -- FIRST WORD OF PARENT TASK NAME OR 0 FOR ALL..4; WD. 02 -- SECOND WORD OF PARENT TASK NAME.5; WD. 03 -- STATUS WORD.6;( 7; INPUTS:A8;?B9; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF T00Qph%hgccccHE CURRENT TASK.2:; R3=ADDRESS OF THE PARENT TASK NAME IN THE DPB.1;; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.D.<; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.=;O7>; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)?;/@; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. (A; DIRECTIVE STATUS OF +1 IS RETURNED.!B; C=1 IF DIRECTIVE IS REJECTED.D=C; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THE SPECIFIEDW/D; TASK IS NOT A PARENT OF THE ISSUING TASK. E;-F5G$DREMS::MOV 4(R3),-(SP) ;SAVE SPECIFIED STATUS WORDO1H CMP (R3),#^R... ;IS SPECIFIED TASK MULTI-USER?OI BNE 10$ ;IF NE NOR3J MOV T.UCB(R5),R0 ;PICK UP UCB ADDRESS FOR $SRMUTT6K MOV 2(R3),R1 ;PICK UP SECOND WORD OF SPECIFIED NAME5L CALL $SRMUT ;CALCULATE TASK NAME (IGNORING C-BIT)Y)M10$: MOV R3,R4 ;COPY TASK NAME POINTERS0N20$: MOV R5,R0 ;COPY ISSUING TASK TCB POINTER%O ADD #T.OCBH,R0 ;POINT TO OCB QUEUEN$P MOV R0,R1 ;COPY LISTHEAD POINTER+Q30$: MOV (R1),R1 ;POINT TO NEXT IN QUEUE R BEQ 60$ ;IF EQ THERE IS NONE"S TST (R4) ;TASK NAME SPECIFIED?.T BEQ 40$ ;IF EQ YES (PASSING STATUS TO ALL)9U CMP (R4),O.STAT(R1) ;MATCH ON FIRST WORD OF TASK NAME?RV BNE 30$ ;IF NE NOP=W CMP 2(R4),O.STAT+2(R1) ;MATCH ON SECOND WORD OF TASK NAME?EX BNE 30$ ;IF NE NOB0X40$: CALL $QRMVA ;REMOVE THE ENTRY ;JWB1676Z MOV (SP),R0 ;PICK UP SPECIFIED STATUS WORD ;**-18[ MOV #S.CACT,R2 ;SET ABORT CODE OF "TASK STILL ACTIVE"-\ CALL $QUEXT ;QUEUE THE OCB TO PARENT TASKT,] TST (R4) ;PASSING STATUS TO ALL PARENTS?^ BEQ 20$ ;IF EQ YES_50$: TST (SP)+ ;CLEAN STACK ` RETURN ;T,a60$: TST (R4) ;WAS A TASK NAME SPECIFIED?b BEQ 50$ ;IF EQ NOR5c DRSTS D.RS8 ;INCONSISTENT WITH CURRENT TASK STATETde;Of; LOCAL ROUTINES.Eg;Bhi;ICj; ROUTINE TO INITIALIZE ERROR RECOVERY FOR CONNECT, REQUEST, SENDP#k; REQUEST AND CONNECT, AND SPAWN. l;1m/nERRSV: MOV R0,$TEMP0 ;SAVE TARGET TCB ADDRESST&o CLR $TEMP1 ;INITIALIZE OCB POINTER/p CLR $TEMP4 ;INITIALIZE POINTER TO CMD BLOCK 3q JMP $DRTHR ;INITIALIZE ERROR RECOVERY THREADINGCrst;?u; THIS ROUTINE CALCULATES THE DEFAULT AND PROTECTION UICS FORQv; THE CURRENT TASKw;D x; INPUTS:Iy; R1=REQUEST UICz;T {; OUTPUTS:|; R1=PROTECTION UIC}; R3=DEFAULT UIC'~; R4=ADDRESS OF CURRENT TASK'S HEADERC;T; R0 IS PRESERVED ;S4UISET: MOV $TKTCB,R2 ;GET CURRENT TASK TCB ADDRESS+ ADD #T.ST2,R2 ;POINT TO TASK STATUS WORDP .IF DF X$$HDR) MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING 2 MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER, MOV $SAHPT,R4 ;GET ADDRESS OF TASK HEADER .IFFA. MOV $HEADR,R4 ;POINT TO CURRENT TASK HEADER) CALLR $UISET ;CALCULATE DEF/PROT UICST .IFT:( CALL $UISET ;CALCULATE DEF/PROT UICS- MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING  RETURN ;R .ENDC;KG; THIS ROUTINE PASSES THE PROMPTING CONTROL BIT (T3.MCR) AND THE CLI;TE; COMMAND EXECUTION INDICATOR BIT (T3.CMD) FROM THE CURRENT TASK TOAD; THE TARGET. IT IS CALLED ONLY IF THE CURRENT TASK HAS PASSED ALLH; ITS OCBS TO THE TARGET, OR IF EITHER THE CURRENT OR TARGET IS A CLI.A; THE TERMINATOR CHARACTER IN THE COMMAND BUFFER (IF IT EXISTS)CE; IS SET TO A CARRIAGE RETURN IF THE T3.MCR BIT IS TURNED ON IN THE(; TARGET TCB;P ; INPUTS:N;C; R0=ADDRESS OF OCB QUEUE LISTHEAD (T.OCBH) IN CURRENT TASK'S TCB B; R4=ADDRESS OF OCB QUEUE LISTHEAD (T.OCBH) IN TARGET TASK'S TCB;A ; OUTPUTS:;O9; THE STATUS BITS ARE PROPOGATED TO THE TARGET TASK TCBF;C; ALL REGISTERS PRESERVED; APSPRMT: MOV T.ST3-T.OCBH(R0),-(SP) ;GET T.ST3 FROM CURRENT TASKH> BIC #^C,(SP) ;CLEAR ALL BUT BITS OF INTEREST: BIC (SP),T.ST3-T.OCBH(R0) ;CLEAR BITS IN CURRENT TASK .IF DF A$$CLI5 BIT #T3.CLI,T.ST3-T.OCBH(R4) ;IS TARGET TASK A CLIE BNE 5$ ;IF NE YEST .ENDC ;A$$CLI< BIC #T3.MCR!T3.CMD,T.ST3-T.OCBH(R4) ;CLEAR BITS IN TARGET@ BIS (SP),T.ST3-T.OCBH(R4) ;SET 00QxhRhzgM{gfffDATATARGET'S BITS LIKE CURRENT WAS:5$: BIT #T3.MCR,(SP)+ ;WILL CURRENT ISSUE PROMPT ON EXIT BEQ NULL ;IF EQ NO) MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGC5 MOV $TEMP4,KISAR6 ;MAP COMMAND BUFFER IF IT EXISTST BEQ 10$ ;IF EQ, NO COMMAND4 BITB #200,@#C.CTR+140000 ;WAS TERM USER SUPPLIED?' BNE 10$ ;IF NE YES, DON'T CHANGE IT 3 MOVB #15,@#C.CTR+140000 ;SET TERMINATOR TO BE CRN(10$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGNULL: RETURN;IG; THIS ROUTINE LOCATES THE OCB(S) TO BE PASSED BY THE RPOI$ AND SDRP$T; DIRECTIVES.T;, ; INPUTS:U; ; R2=FLAGS BYTET3; R3=ADDRESS OF THE PARENT'S TASK NAME IN THE DPBU; ;N ; OUTPUTS:;I?; $TEMP1 IS SET WITH THE ADDRESS OF THE OCB TO PASS, CLEAR IFM4; NO OCB IS TO BE PASSED, OR ONE TO PASS ALL OCBS;ALOCOCB: MOV (SP)+,R4 ;RETURN ADDR TO ALLOW ERROR THREAD TO WORKE ASR R2 ;PASS ALL OCBS0 BCS 5$ ;IF CS YESS# ASR R2 ;PASS NEXT OCB IN QUEUE?I BCS 80$ ;IF CS YES- BR 10$ ;CHECK IF SPECIFIC PARENT IS NAMEDP 5$: ;& MOV $TEMP0,R2 ;POINT TO OBJECT TASK' BIT #T3.CLI,T.ST3(R2) ;IS TASK A CLIE  BNE 100$ ;IF NE YES, ILLEGAL+ MOV (R3),-(SP) ;WAS PARENT NAME SUPPLIEDI% BIS 4(R3),(SP)+ ;OR AN OCB ADDRESSR BNE 120$ ;IF NE YESE! INC $TEMP1 ;INDICATE PASS ALL BR 70$ ;ALL DONE110$: MOV $TKTCB,R2 ;POINT TO CURRENT TASK'S TCBE# ADD #T.OCBH,R2 ;ITS OCB LISTHEAD5 .IF DF A$$CLI6 BIT #T3.CLI,T.ST3-T.OCBH(R2) ;IS ISSUING TASK A CLI BEQ 30$ ;IF EQ NOA- TST (R3) ;WAS A SPECIFIC PARENT REQUESTEDO BNE 40$ ;IF NE YES+ TST 4(R3) ;WAS AN OCB ADDRESS SPECIFIED1 BEQ 70$ ;IF EQ NOL*20$: MOV (R2),R2 ;POINT TO THE NEXT OCB& BEQ 110$ ;IF EQ, THERE ARE NO MORE* CMP 4(R3),R2 ;IS THIS THE SPECIFIED OCB BNE 20$ ;IF NE NO  BR 60$ ; .ENDC ;A$$CLI/30$: TST 4(R3) ;WAS AN OCB ADDRESS SPECIFIEDS BNE 100$ ;IF NE YES- TST (R3) ;WAS A SPECIFIC PARENT REQUESTED( BEQ 70$ ;IF EQ NOC.40$: MOV (R2),R2 ;POINT TO NEXT OCB IN LIST& BEQ 110$ ;IF EQ, THERE ARE NO MORE> CMP O.STAT(R2),(R3) ;IS THIS THE OCB FOR THE CORRECT PARENT BNE 40$ ;IF NE NO:" CMP O.STAT+2(R2),2(R3) ;MAYBE?? BNE 40$ ;IF NE NOT* TST 4(R3) ;HAS OCB ADDR BEEN SPECIFIED BEQ 60$ ;IF EQ NOE+ CMP 4(R3),R2 ;DID THEY FIND THE SAME OCB;  BNE 120$ ;IF NE NO. 60$: MOV R2,$TEMP1 ;SAVE ADDR OF OCB TO PASS 70$: JMP (R4) ;RETURN 3 80$: MOV (R3),-(SP) ;GET PARENT NAME IF SPECIFIED - BIS 4(R3),(SP)+ ;WAS OCB ADDRESS SPECIFIEDI/ BNE 120$ ;IF NE YES, CANNOT SPECIFIY EITHER- MOV $TKTCB,R2 ;TCB ADDRESS OF CURRENT TASKO9 MOV T.OCBH(R2),$TEMP1 ;GET ADDRESS OF NEXT OCB, IF ANY( JMP (R4) ;RETURN;I; ERROR HANDLING;H8100$: JMP ILPARM ;THIS TASK CANNOT USE THIS PARAMETER=110$: MOV (PC)+,R5 ;PICK UP SPECIFIED OCB DOESN'T EXIST STA DRSTS D.RS86 ;  BR 150$ ;RETURN ERROR STATUS=120$: MOV (PC)+,R5 ;PICK UP NAME AND OCB ADDR DON'T MATCH SI DRSTS D.RS84 ;150$: JMP ERROR ;ISSUE ERRORC .END0$ ;IF NE YES, CANNOT SPECIFIY EITHER- MOV $TKTCB,R2 ;TCB ADDRESS OF CURRENT TASKO9 MOV T.OCBH(R2),$TEMP1 ;GET ADDRESS OF NEXT OCB, IF ANY( JMP (R4) ;RETURN;I; ERROR HANDLING;H8100$: JMP ILPARM ;THIS TASK CANNOT USE THIS PARAMETER=110$: MOV (PC)+,R5 ;PICK UP SPECIFIED OCB DOESN'T EXIST STA DRSTS D.RS86 ;  BR 150$ ;RETURN ERROR STATUS=120$: MOV (PC)+,R5 ;PICK UP NAME AND OCB ADDR DON'T MATCH SI DRSTS D.RS84 ;150$: JMP  .TITLE REQSBO .IDENT /14.03/0;FK; COPYRIGHT (c) 1982, 1983, 1984, 1985 BY DIGITAL EQUIPMENT CORPORATION.S; ALL RIGHTS RESERVED.;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;R ; D. N. CUTLER 10-AUG-73 ;K# ; MODIFIED FOR RSX-11M-PLUS V2.1: ;S; H. HUANGB; J. R. KAUFFMAN; B. KRISHNAMURTHY); J. M. LAWLER; T. LEKAS'; T. M. MARTIN; B. S. MCCARTHY 00Rh%hgcccc;-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ;I; J. M. LAWLER; J. R. KAUFFMAN; J. W. BERZLE; B. S. MCCARTHY; L. B. MCCULLEY;; MODIFIED BY:;I ; J. W. BERZLE 17-OCT-85 14.00;*; JWB167 - USE $QRMVA INSTEAD OF $QRMVT;S ; J. W. BERZLE 04-APR-86 14.01;-6; JWB169 - CORRECT CONDITIONALIZATION AROUND $CTXPT; ; K. L. NOEL 04-DEC-86 14.02; 9; KLN029 - CLEAR TASK INDEX TO SHOW THAT TASK HAS NOT ; STARTED YET;.; K. L. NOEL 13-MAY-87 14.03;X<; KLN047 - CLEAR LUN TABLE FOR LUNS THAT POINT TO GENERIC ; DCBs ; =;E$>; TASK REQUEST RELATED SUBROUTINES?;@; MACRO LIBRARY CALLSIA; B,C .MCALL HDRDF$,ITBDF$,PCBDF$,TCBDF$,BGCK$ADEFG .IF DF N$$DIRHI .MCALL LNMDF$J)K LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETSOLM .ENDC ;DF N$$DIRCN'O HDRDF$ ;DEFINE TASK HEADER OFFSETS4P ITBDF$ ;DEFINE INTERRUPT TRANSFER BLOCK OFFSETS3Q PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS-;R TCBDF$ ,,SYSDEF ;DEFINE TASK CONTOL BLOCK OFFSETS & LGTHASTU .IF DF A$$CNTVW .MCALL ACNDF$X ACNDF$ ;ACCOUNTING OFFSETSSYZ .ENDC[\ MAP6=140000]^;+ _; **-$ABCTK-ABORT CURRENT TASK`; **-$ABTSK-ABORT TASKa;DMb; THIS ROUTINE IS CALLED TO MARK A TASK FOR ABORT AND TO FORCE A TASK EXIT.Ic; THE REASON FOR ABORT AND THE CURRENT OUTSTANDING I/O COUNT ARE STOREDI&d; IN THE FIRST TASK EVENT FLAG WORD.e;E f; INPUTS: g;Fh; R0=REASON FOR ABORT.Gi; R2=EXTENDED ABORTER INFORMATION (VALID ONLY IF R0=S.CABO OR S.CPMD)j; k; OUTPUTS:l;Fm; THE TASK IS MARKED FOR ABORT AND A CONDITIONAL SCHEDULE REQUEST ISn; SET.o;-p8q$ABCTK::MOV $TKTCB,R1 ;SET TCB ADDRESS TO CURRENT TASK?r$ABTSK::BIC #TS.STP,T.STAT(R1) ;REMOVE POSSIBLE MCR BLOCK BITR,s CMP R0,#S.CABO ;ABORT BY DIRECTIVE OR MCRtu BEQ 4$ ;IF EQ YEST$v CMP R0,#S.CTKN ;QUIET TASK ABORT?.w BEQ 4$ ;IF EQ YES, ISSUE ABORT ASTS IF ANY"x CMP R0,#S.CPMD ;ABORT WITH PMD?y BNE 7$ ;IF NE NOz4$: SAVNR ;SAVE R4 AND R5R2{ MOV #AS.REA,R4 ;GET CODE FOR REQUESTED EXIT AST!| MOV R1,-(SP) ;SAVE TCB ADDRESSC } MOV R0,-(SP) ;SAVE ABORT CODE)~ MOV R2,-(SP) ;SAVE ABORTER INFORMATIONS MOV R1,R5 ;COPY TCB ADDRESS CALL $DASTT ;DECLARE AST, MOV (SP)+,R2 ;RESTORE ABORTER INFORMATION# MOV (SP)+,R0 ;RESTORE ABORT CODE BCC 5$ ;IF CC AST SET UP$ MOV (SP)+,R1 ;RESTORE TCB ADDRESS- BIT #T3.PRV,T.ST3(R1) ;IS TASK PRIVILEGED?P BEQ 7$ ;IF EQ NO9 BIT #T2.REX,T.ST2(R1) ;HAS ABORT AST ALREADY OCCURRED?R BEQ 7$ ;IF EQ NO MOV R1,R0 ;COPY TCB ADDRESS BR 10$ ;RESCHEDULE TASKS5$: TST (SP)+ ;CLEAN STACKE8 MOV #4,A.PRM(R1) ;STORE NUMBER OF AST PARAMETER BYTES0 MOV R2,A.PRM+2(R1) ;STORE ABORTER INFORMATION1 RETURN ;$NXTSK ALREADY CALLED, SIMPLY RETURNM*7$: BIT #T3.ACP,T.ST3(R1) ;ACP ABORTING? BEQ 8$ ;IF EQ NO+ BIT #T3.PMD,T.ST3(R1) ;IS PMD REQUESTED?V2 BNE 8$ ;IF NE NO (NOTE: T3.PMD=1 MEANS NO PMD)9 BGCK$A BF.XIT,BE.ACP,FATAL ;CRASH SYSTEM ON ACP ABORTSD08$: MOV R0,T.EFLG(R1) ;INSERT REASON FOR ABORT: MOVB T.IOC(R1),T.EFLG+1(R1) ;SAVE OUTSTANDING I/O COUNT .IF DF M$$PRO6 CLR T.RRM(R1) ;TASK CAN BE ABORTED ON ANY PROCESSOR .ENDC .IF DF P$$OFF) BIT #T3.ACP,T.ST3(R1) ;IS THIS AN ACP? BNE 9$ ;IF NE YES19 MOV #EX$SEV,T.EFLG+2(R1) ;SET SEVERE ERROR EXIT STATUS39$: ;REFERENCE SYMBOL .ENDC MOV R1,R0 ;COPY TCB ADDRESSC2 ADD #T.STAT,R1 ;POINT TO FIRST TASK STATUS WORD' BIC #TS.CKR,(R1)+ ;CLEAR STATUS BITSF5 BIC #T2.SEF!T2.STP!T2.SPN,(R1) ;MAKE TASK RUNNABLEI? BIS #T2.AST!T2.DST!T2.HLT!T2.ABO,(R1) ;DSBL AST'S & FRC EXITK .IF DF M$$PRO: BIT #^C,-(R1) ;OUT FOR INITIAL LOAD OR BLOCKED? .IFFS6 TST -(R1) ;OUT FOR INITIAL LOAD OR OTHERWISE BLKD? .ENDC BNE 10$ ;IF NE YES3 CALL $SETCR ;SET A CONDITIONAL SCHEDULE REQUEST*10$: MOV T.PCB(R0),R0 ;POINT TO 00RhhzgM{gfffDATATASK PCB8 CALLR $NXTSK ;REALLOCATE TASK PARTITION IF NECESSARY;+/; **-$BILDS-BUILD STACK AND INITIALIZE HEADER ; I; THIS ROUTINE SETS UP THE TASK STACK AND INITIALIZES THE HEADER. IT ISEI; CALLED PRIOR TO PLACING A TASK INTO CONTENTION FOR THE PROCESSOR WHENAF; AN EXECUTION REQUEST IS MADE FOR A TASK THAT IS FIXED IN MEMORY OR3; WHEN A DISK RESIDENT TASK HAS FINISHED LOADING.$; ; INPUTS:L;T4; R0=ADDRESS OF THE TCB OF THE TASK TO INITIALIZE.;R ; OUTPUTS:;K0; 1-TASK LOCAL EVENT FLAGS 1.-32. ARE CLEARED.); 2-CURRENT UIC IS SETUP IN THE HEADER. L; 3-TASK CONTEXT IS SETUP TO CAUSE THE TASK TO START EXECUTION AT ITS ENTR@; 4-REDISPATCHING OF THE PROCESSOR IS CONDITIONALLY REQUESTED.;T ; R3 IS PRESERVED ACROSS CALL.;-3$BILDS::MOV T.PCB(R0),R1 ;GET ADDRESS OF TASK PCBN .IF DF X$$HDR7 MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING FOR XTRNL HDRL+ MOV P.HDR(R1),-(SP) ;SAVE HEADER POINTER ! BNE 5$ ;IF NE INTERNAL HEADER/ MOV P.REL(R1),KISAR6 ;MAP TO EXTERNAL HEADERA4 MOV #140000,(SP) ;RESET VIRTUAL ADDRESS OF HEADER15$: MOV (SP)+,R1 ;GET VIRTUAL ADDRESS OF HEADERE .IFF ; DF X$$HDR / MOV P.HDR(R1),R1 ;GET ADDRESS OF TASK HEADERU .ENDC ; DF X$$HDR/ MOV T.EFLG(R0),H.CUIC(R1) ;SET SPECIFIED UIC0$ BNE 10$ ;IF NE UIC WAS SPECIFIED- MOV H.DUIC(R1),H.CUIC(R1) ;SET DEFAULT UICU .IF DF M$$MUP BR 15$ ; .IFTF10$: ;REF LABEL .IFTE- MOV T.ACTL(R0),H.DUIC(R1) ;SET DEFAULT UICN .ENDC 15$: ;S .IF DF A$$CNT! MOV KISAR5,-(SP) ;SAVE MAPPING 3 MOV T.ACN(R0),KISAR5 ;MAP FIRST ACCOUNTING BLOCKM) BEQ 16$ ;IF EQ, NO ACCOUNTING ON TASKU- CMPB #BT.TAB,@#B.TYP+120000 ;IS THIS A TAB0 BNE 16$ ;IF NE NOF6 MOV H.CUIC(R1),@#B.PUIC+120000 ;COPY PROTECTION UIC3  MOV H.DUIC(R1),@#B.CUIC+120000 ;COPY CURRENT UICF-  MOV T.ST3(R0),@#B.TST3+120000 ;COPY T.ST3( 16$: MOV (SP)+,KISAR5 ;RESTORE MAPPING   .ENDC ;A$$CNT/ BIT #T2.ABO,T.ST2(R0) ;TASK MARKED FOR ABORTS BNE 20$ ;IF NE YES .IF DF M$$PRO0 MOV T.PCB(R0),R2 ;GET TASK REGION PCB ADDRESS> MOV T.RRM(R0),P.RRM(R2) ;SAVE THE TASK'S INSTALLED AFFINITY3 CALL $SETAT ;SET UP THE TASK'S RUNNING AFFINITY  .ENDC/ CLR T.EFLG(R0) ;CLEAR TASK LOCAL EVENT FLAGSM# BIT #T3.ACP,T.ST3(R0) ;TASK ACP?U BNE 17$ ;IF NE YES  CLR T.EFLG+2(R0) ;C!17$: ;REFERENCE SYMBOLK"#$ .IF DF M$$PRO%3& CALL $TSTAT ;ARE THE REQUIRED BUS RUNS PRESENT?K' BCC 20$ ;IF CC YES( MOV R0,-(SP) ;SAVE REGISTERSF) MOV R1,-(SP) ;M* MOV R3,-(SP) ;T+ MOV R0,R1 ;COPY TCB ADDRESST&, MOV #S.CAFF,R0 ;GET TKTN ABORT CODE- CALL $ABTSK ;ABORT THE TASKS". MOV (SP)+,R3 ;RESTORE REGISTERS/ MOV (SP)+,R1 ;0 MOV (SP)+,R0 ; 12 .ENDC344520$: MOV H.ISP(R1),(R1) ;SET INITIAL STACK POINTER06 MOV H.GARD(R1),R2 ;POINT TO CONTEXT SAVE AREA!7 SUB #16,R2 ;POINT TO SAVED PCF*8 MOV H.IPC(R1),(R2) ;SET INITIAL PC WORD+9 MOV H.IPS(R1),-(R2) ;SET INITIAL PS WORDY:+: .IF DF C$$RTK ;REMOTE TASK ;KLN029(: ;KLN029P<: BIT #F5.RTK,$FMSK5 ;ARE REMOTE TASKS BEING USED ;KLN029!: BEQ 30$ ;IF EQ NO ;KLN029A: ;KLN029VB: TSTB T.LBN(R0) ;HAS THIS TASK HAD CONTACT WITH CPRAME? ;KLN029>: BEQ 30$ ;IF EQ, NO - DON'T NEED TO CLEAR LUN TABLE ;KLN029: ;KLN029HH: CLRB T.LBN(R0) ;INDICATE THAT NO TASK START REQUEST HAS BEEN ;KLN029(: ; MADE FOR THIS TASK YET ;KLN029: ;KLN029).: .IF DF C$$RTB ;RUN TIME BINDING ;KLN047: ;KLN047 <: BIT #F5.RTB,$FMSK5 ;RUN TIME BINDING TURNED ON? ;KLN047!: BEQ 30$ ;IF EQ NO ;KLN047B: ;KLN047 /: MOV T.PCB(R0),R3 ;GET PCB ADDRESS ;KLN047 5: BIT #PS.FXD,P.STAT(R3) ;IS TASK FIXED? ;KLN047Q;: BEQ 30$ ;IF EQ NO, NO NEED TO CLEAR LUN TABLE ;KLN047 : ;KLN047C$: MOV R0,-(SP) ;SAVE R0 ;KLN047$: MOV R5,-(SP) ; AND R5 ;KLN047$:00Rh%hgcccc MOV R3,-(SP) ; AND R3 ;KLN047: ;KLN047=: MOV R0,R5 ;PUT TCB ADDRESS WHERE $MPLND WANTS IT ;KLN04740: ADD #H.NLUN,R1 ;POINT TO LUN TABLE ;KLN047.: MOV (R1)+,R3 ;GET NUMBER OF LUNS ;KLN047: ;KLN04742:25$: MOV (R1),R0 ;GET LUN ASSIGNMENT ;KLN047+: BEQ 27$ ;IF EQ, NOT ASSIGNED ;KLN047 : ;KLN0470,: CALL $MPLND ;FOLLOW REDIRECTS ;KLN047: ;KLN047N;: CMP (R0),$XXLOW ;MIGHT IT BE A GENERIC DEVICE? ;KLN047 ": BLO 27$ ;IF LO, NO ;KLN0475: CMP (R0),$XXHGH ;IS IT A GENERIC DEVICE? ;KLN0475": BHI 27$ ;IF HI, NO ;KLN047: ;KLN047D-:26$: CLR (R1)+ ;CLEAR LUN ENTRY ;KLN047M: CLR (R1)+ ; ;KLN047*: SOB R3,25$ ;LOOP UNTIL DONE ;KLN047: ;KLN047A: BR 28$ ;DONE ;KLN047$: ;KLN047D5:27$: CMP (R1)+,(R1)+ ;SKIP OVER THIS ONE ;KLN047L*: SOB R3,25$ ;LOOP UNTIL DONE ;KLN047: ;KLN047W+:28$: MOV (SP)+,R3 ;RESTORE R3 ;KLN047$: MOV (SP)+,R5 ; AND R5 ;KLN047$: MOV (SP)+,R0 ; AND R0 ;KLN047: ;KLN0472: .ENDC ;C$$RTB ;KLN047 :30$: ;KLN047R: .ENDC ;C$$RTK ;KLN0474: ;KLN047 ; .IF DF X$$HDR<-= MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGK>? .ENDC ; DF X$$HDR@AB;+*C; **-$ACTTK-PUT TASK IN ACTIVE TASK LISTD;PIE; THIS ROUTINE IS CALLED TO PUT AN ACTIVE TASK IN THE ACTIVE TASK LIST. F; G; INPUTS:H;M@I; R0=ADDRESS OF THE TCB OF THE TASK TO PUT IN THE ACTIVE LIST.J;0 K; OUTPUTS:L=M; THE SPECIFIED TASK IS MERGED INTO THE ACTIVE TASK LIST BY N; PRIORITY.O;: P; R3 IS PRESERVED ACROSS CALL.Q;-R<S$ACTTK::MOV #$ACTHD-T.ACTL,R1 ;SET ADDRESS OF PREVIOUS TCB/T10$: MOV R1,R2 ;SAVE ADDRESS OF PREVIOUS TCBN-U MOV T.ACTL(R2),R1 ;GET ADDRESS OF NEXT TCB :V CMPB T.PRI(R1),T.PRI(R0) ;TASK HIGHER OR SAME PRIORITY?W BHIS 10$ ;IF HIS YES/X MOV R0,T.ACTL(R2) ;LINK NEW TASK TO PREVIOUS2Y MOV R1,T.ACTL(R0) ;SET LINK TO NEXT IN NEW TASKZ[;+.\; **-$SETCR-SET CONDITIONAL SCHEDULE REQUEST"]; **-$SETRQ-SET SCHEDULE REQUEST3^; **-$SETRT-SET SCHEDULE REQUEST FOR CURRENT TASKS_;.B`; THIS ROUTINE IS CALLED TO FORCE REDISPATCHING OF THE PROCESSOREa; FROM A SPECIFIED POSITION IN THE TASK LIST. IF A PREVIOUS REQUEST2Ab; HAS BEEN SET, THEN REDISPATCHING STARTS AT WHICH EVER REQUESTIc; HAS THE HIGHEST PRIORITY. d;; e; INPUTS:f;Rg; IF ENTRY AT $SETRT, THEN/h; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.T&i; IF ENTRY AT $SETRQ OR $SETCR, THEN3j; R0=ADDRESS OF THE TCB TO START DISPATCHING AT.Ek;R l; OUTPUTS:m;R<n; A SCHEDULE REQUEST IS SET WHICH WILL FORCE A REDISPATCH-8o; ING OF THE PROCESSOR WHEN A SYSTEM EXIT IS EXECUTED.p;A(q; R2 AND R3 ARE PRESERVED ACROSS CALL.:r; R0 IS PRESERVED ACROSS CALL IF ENTRY IS NOT AT $SETRT.s;-tuvw .IF NDF M$$PROHx y .ENABL LSB 8z$SETCR::CMP R0,$TKTCB ;REQUESTED TASK SAME AS CURRENT?{ BEQ $SETRQ ;IF EQ YESO:| CMPB @$CURPR,T.PRI(R0) ;CURRENT TASK OF HIGHER PRIORITY} BHI 30$ ;IF HI YES~ BLO $SETRQ ;IF LO NO=10$: CALLR $DRDSE ;SAME PRIORITY-DECLARE SIGNIFICANT EVENTH1$SETRT::MOV R5,R0 ;SET ADDRESS OF DISPATCH TCBS7$SETRQ::MOV @$RQSCH,R1 ;GET PREVIOUS SCHEDULE REQUESTR& BEQ 20$ ;IF EQ NO PREVIOUS REQUEST( CMP R0,R1 ;TASK ALREADY RESCHEDULED? BEQ 30$ ;IF EQ YES/ CMPB T.PRI(R1),T.PRI(R0) ;COMPARE PRIORITIESM. BHI 30$ ;IF HI PREVIOUS IS HIGHER PRIORITY  BEQ 10$ ;IF EQ SAME PRIORITY+20$: MOV R0,@$RQSCH ;SET SCHEDULE REQUESTO30$: RETURN ;I  .DSABL LSBO .IFFL  .ENABL LSB$; G; SEARCH FOR LOWEST PRIORITY RESCHEDULED OR CURRENTLY EXECUTING TASK.RC; IF IT IS LOWER THAN RESCHEDULE REQUEST, THEN FORCE A RESCHEDULE ; REQUEST FOR THAT PROCESSOR.R;S$SETCR::MOV R2,-(SP) ;SAVE R2 7 BIT #TS.RUN,T.STAT(R0) ;IS TASK RUNNING ON OTHER CPU. BNE 40$ ;IF NE YES, MOV #$RQTAB,R2 ;POINT TO RESCHEDULE TABLE7 MOV #377,-(SP) ;INITIALIZE LOWEST PRIORITY CELL WITH$&00RhhzgM{gfffDATA ;MAXIMUM POSSIBLE PRIORITY VALUE410$: MOV (R2)+,-(SP) ;PUSH NEXT RESCHEDULE POINTER0 BNE 15$ ;IF NE THERE IS A RESCHEDULE POINTER. MOV R2,(SP) ;COPY POINTER INTO RQSCH TABLE= ADD #$PRTAB-$RQTAB-T.PRI-2,(SP) ;CONVERT INTO POINTER INTOE ;PRIORITY TABLER515$: BIT $BTMSK-$RQTAB-2(R2),$URMST ;IS CPU ONLINE?# BNE 20$ ;IF NE YES TST (SP)+ ;CLEAN STACK BR 30$ ;TRY FOR NEXT CPU120$: CMP R0,-2(R2) ;TASK ALREADY RESCHEDULED???( BNE 25$ ;IF NE NOP( CMP (SP)+,(SP)+ ;CLEAN STACK PRIOR TO BR 80$ ;EXIT.25$: ADD #T.PRI,(SP) ;POINT TO TASK PRIORITY+ MOVB @(SP)+,1(SP) ;PICK UP TASK PRIORITYE0 CMPB (SP),1(SP) ;CURRENT PRIORITY LOW OR SAME BLO 30$ ;IF LO YES- BHI 27$ ;IF HI NO -- DON'T CHANGE LOW PRI;I?; PRIORITY IS THE SAME AS THE CURRENT LOWEST. IF THIS IS OUREF; CPU, THEN WE WILL BE NEW LOWEST PRI PROCESSOR. IF NOT, NO CHANGE.;E" CMP $RQSCH,R2 ;IS THIS OUR CPU?" BNE 30$ ;IF NE NO -- NO CHANGE/27$: SWAB (SP) ;ELSE SET NEW LOWEST PRIORITY, MOV R2,R1 ;SAVE RESCHEDULE TABLE POINTER130$: CMP R2,#$RQTAB+ ;AT END OF TABLEA BLO 10$ ;IF LO NOS3 CMPB (SP)+,T.PRI(R0) ;SCHEDULE REQUEST REQUIRED?O BHI 80$ ;IF HI NOI BLO 60$ ;IF LO YES635$: MOV (SP)+,R2 ;ELSE EFFECT SIG. EVENT BECAUSE WE' ;DON'T KNOW WHICH TCB COMES FIRSTE  ;IN ATLW" CALLR $DRDSE ;EXIT THRU $DRDSE;<; TASK IS IN EXECUTION -- FIND THE PROCESSOR AND PERFORM A:; $SETRQ FOR THAT PROCESSOR. THIS GENERALIZES THE SINGLE; PROCESSOR $SETCR. ;E)40$: MOV #$TKTAB,R1 ;GET START OF TABLER045$: CMP (R1)+,R0 ;IS TASK ACTIVE ON THIS CPU?% BNE 45$ ;IF NE NO -- TRY NEXT CPUU7 ADD #$RQTAB-$TKTAB-2,R1 ;POINT INTO $RQTAB FOR SETRQO- BR 50$ ;ENTER $SETRQ, ALREADY IN PROGRESSN3$SETRT::MOV R5,R0 ;SET ADDRESS OF DISPATCH TABLE9$SETRQ::MOV $RQSCH,R1 ;PICK UP RESCHEDULE TABLE POINTER MOV R2,-(SP) ;SAVE R2750$: MOV (R1)+,R2 ;PICK UP CURRENT RESCHEDULE POINTERR  BEQ 60$ ;IF EQ THERE IS NONE( CMP R0,R2 ;TASK ALREADY RESCHEDULED? BEQ 80$ ;IF EQ YES/ CMPB T.PRI(R2),T.PRI(R0) ;IS PREVIOUS HIGHERV$ BHI 80$ ;IF HI YES -- DO NOTHING0 BNE 60$ ;IF NE YES -- SET RESCHEDULE REQUEST0 MOV $ACTHD,-(R1) ;SET SIG. EVENT FOR THIS CPU' BR 70$ ;EXIT THRU NOTIFICATION CODE +60$: MOV R0,-(R1) ;SET RESCHEDULE REQUESTT;RB; AT THIS POINT IN A MULTIPROCESSOR SYSTEM, WE HAVE JUST CHANGEDD; THE RESCHEDULE POINTER FOR SOME PROCESSOR. WE WANT TO INTERRUPT#; HIM TO INFORM HIM OF THAT FACT. ; 70$: CMP $RQSCH,R1 ;IS IT US?  BEQ 80$ ;IF EQ YES MTPS #PR7 ;INHIBIT DEADLOCK LOCK$ $FORKL,SPIN; BIS $BTMSK-$RQTAB(R1),$IIPND ;SHOW SOMEONE NEEDS SERVICEE ULOCK$ $FORKL,SPIN  MTPS #080$: MOV (SP)+,R2 ;RESTORE R2T  RETURNI  .DSABL LSB .ENDC;+>; **-$SETMG/$SETFG-SET EVENT FLAG AND UNLOCK IF GROUP GLOBAL;MB; THESE ROUTINES SET AN EVENT FLAG AND TAKE CARE OF THE REQUIREDA; SCHEDULING. IF THE EVENT FLAG WAS GROUP GLOBAL, THE USE COUNT A; FOR THAT FLAG'S GROUP GLOBAL CONTROL BLOCK IS DECREMENTED. IFM@; THE CONTROL BLOCK IS MARKED FOR DELETE AND THE COUNT GOES TO!; ZERO, IT WILL BE DEALLOCATED.D;V ; INPUTS:K;R>; R0=EVENT FLAG NUMBER ($SETFG) OR EVENT FLAG MASK ($SETMG).-; R1=EVENT FLAG WORD ADDRESS ($SETMG ONLY)./; R5=TCB ADDRESS FOR WHICH FLAG IS BEING SET. ; ; OUTPUTS:;H-; R0=TCB ADDRESS OF TASK WHOSE FLAG WAS SET ; R3 IS PRESERVED.;G;-  .ENABL LSBR)$SETMG::CALL $SETM ;SET THE EVENT FLAG   BR 5$ ;JOIN COMMON CODE ) $SETFG::CALL $SETF ;SET THE EVENT FLAGM 5$: ;REFERENCE LABELU   .IF DF G$$GEF, BNE 15$ ;IF NE FLAG WAS COMMON OR GLOBAL5 DECB T.GGF(R5) ;DECR GRP GLOBAL USE COUNT FOR TASKT: ADD #,R1 ;POINT TO GROUP GLOBAL USE COUNT2 ASR R1 ;SHIFT OFF POSSIBLE SECOND GRP GBL FLAG4 SBC R1 ;IF IT WAS SET SUBTRACT ONE WHICH BECOMES. ASL R1 ;THREE WHEN JOINED WITH THE ASR/ASL00Rh%hgcccc. DEC (R1) ;DECREMENT GROUP GLOBAL USE COUNT1 BNE 15$ ;IF NE THESE EVENT FLAGS STILL IN USES8 BITB #GS.DEL,-(R1) ;FLAGS MARKED FOR DELETE? (G.STAT) BEQ 15$ ;IF EQ NO ! MOV R0,-(SP) ;SAVE TCB ADDRESS  MOV R3,-(SP) ;SAVE R3 MOV R4,-(SP) ;SAVE R4* MOVB -(R1),R4 ;GET GROUP NUMBER (G.GRP)6 CALL $SRGEF ;FIND THESE FLAGS IN GROUP GLOBAL LIST8 CALL $ELGEF ;ELIMINATE THIS GROUP GLOBAL CONTROL BLK  MOV (SP)+,R4 ;RESTORE R4B! MOV (SP)+,R3 ;RESTORE R3N$" MOV (SP)+,R0 ;RESTORE TCB ADDRESS#$ .ENDC ; DF G$$GEF% &15$: RETURN$' ( .DSABL LSBT)*+;+!,; **-$SETF/$SETM-SET EVENT FLAGS-;EB.; THESE ROUTINES SET AN EVENT FLAG AND TAKE CARE OF THE REQUIRED/; RESCHEDULING.M0;, 1; INPUTS:32;M<3; R0=EVENT FLAG NUMBER ($SETF) OR EVENT FLAG MASK ($SETM).,4; R1=EVENT FLAG WORD ADDRESS ($SETM ONLY)./5; R5=TCB ADDRESS FOR WHICH FLAG IS BEING SET.U6;B 7; OUTPUTS:8;M-9; R0=TCB ADDRESS OF TASK WHOSE FLAG WAS SETO:; R1=EVENT FLAG WORD ADDRESS;; R3 IS PRESERVED.<;;.=; IF GROUP GLOBAL EVENT FLAGS ARE SUPPORTED:*>; Z=0 IF LOCAL OR COMMON EVENT FLAG SET'?; Z=1 IF GROUP GLOBAL EVENT FLAG SET @; A;-B=C$SETF:: CALL $CEFI ;CONVERT EVENT FLAG TO MASK AND ADDRESS30D$SETM:: CLR -(SP) ;CLR GROUP GLOBAL INDICATOR-E MOV R1,-(SP) ;SAVE EVENT FLAG WORD ADDRESSE2F BIC #1,R1 ;CLEAR GROUP GLOBAL SECOND WORD FLAGCG BIT #T2.ABO!T2.HLT,T.ST2(R5) ;TASK EXITING OR MARKED FOR ABORT ?W4H BNE 10$ ;IF NE YES, DO NOT TOUCH EVENT FLAG WORD#I BIS R0,(R1) ;SET THE EVENT FLAGP.J10$: MOV R5,R0 ;COPY TCB ADDRESS FOR $SETCR'K TST R1 ;WAS AN EVENT FLAG SPECIFIEDI%L BEQ 19$ ;IF EQ NO, DON'T SCHEDULE.M CMP R1,#$COMEF+2 ;IS IT A COMMON EVENT FLAGN BLOS 20$ ;IF LOS YES"O SUB R5,R1 ;IS IT GROUP GLOBAL?P BLO 15$ ;IF LO YES!Q SUB #T.EFLG+2,R1 ;IS IT LOCAL?R BLE 18$ ;IF LE YES5S15$: DEC 2(SP) ;INDICATE SETTING GROUP GLOBAL FLAG(T BR 20$ ;JOIN COMMON CODEU18$: ;REF LABEL0V BIT #T2.SEF,T.ST2(R0) ;TASK IN STOPFOR STATE?W BNE 185$ ;IF NE YESF,X TSTB T.TIO(R0) ;OUTSTANDING BUFFERED I/O?&Y BEQ 30$ ;IF EQ NO, DON'T UNSTOP IT1Z BIT #T2.WFR!,T.ST2(R0) ;TASK IN WFR?&[ BEQ 30$ ;IF EQ NO, DON'T UNSTOP ITB\185$: BIT T.EFLM(R0),@T.EFLM+2(R0) ;STOPFOR CONDITION SATISFIED?&] BEQ 30$ ;IF EQ NO, DON'T UNSTOP IT^ MOV R3,-(SP) ;SAVE R3_ MOV R0,-(SP) ;SAVE TCBC/` CALL $EXRQN ;UNSTOP AND REQUEST TASK TO RUNBa MOV (SP)+,R0 ;RESTORE TCBb MOV (SP)+,R3 ;RESTORE R3S7c19$: TST $SIGFL ;TASK WAITING FOR SIGNIFICANT EVENT? d BEQ 30$ ;IF EQ NO .e20$: CALL $DRDSE ;DECLARE SIGNIFICANT EVENTf BR 40$ ;JOIN COMMON CODE1g30$: CALL $SETCR ;FORCE CONDITIONAL REDISPATCH$4h40$: MOV (SP)+,R1 ;RESTORE EVENT FLAG WORD ADDRESS3i INC (SP)+ ;CLEAN STACK AND SET Z-BIT FOR RETURN$ j RETURN ;Nkl;+7m; **-$DCAST-DECLARE COMMAND ARRIVAL AST TRAP FOR CLISn;LAo; THIS ROUTINE IS CALLED BY THE COMMAND QUEUEING ROUTINE $QCPKTE;p; WHEN IT IS QUEUEING A COMMAND TO A CLI TASK. IF THE CLIW@q; HAS SPECIFIED THE COMMAND ARRIVAL AST, AN ATTEMPT IS MADE TOAr; ALLOCATE A NEW AST BLOCK FROM THE POOL. THIS IS DONE IN ORDER@s; TO ELIMINATE THE WINDOW THAT OCCURS WHEN THE AST BLOCK WOULD<t; NORMALLY BE UNLINKED FROM T.SAST AND LINKED INTO T.ASTL.Du; IT WOULD BE UNACCEPTABLE FOR A CLI TO LOSE A COMMAND DURING THISAv; WINDOW. IF THE ALLOCATION FAILS HOWEVER, THE CURRENT EXISTINGECw; AST BLOCK IS USED. THE WORD AT A.PRM+2 IN THE AST BLOCK IS USEDEDx; AS A FLAG TO THE SYSXT CODE TO INFORM IT IF IT SHOULD DEALLOCATEy; OR RELINK THE AST BLOCK.z; {; INPUTS:A|;N}; R0=TCB ADDRESS OF CLI ~; R1=ADDRESS OF COMMAND BUFFER;E ; OUTPUTS:;C6; C=1 IF THE TASK IS NOT SETUP FOR THE SPECIFIED AST8; C=0 IF THE TASK IS SETUP FOR THE AST AND THE AST HAS; BEEN DECLARED(; R1=ADDRESS OF THE AST CONTROL BLOCK;A;- .IF DF A$$CLI!$DCAST::SAVNR ;SAVE R4 AND R5T MOV #AS.CAA,R4 ;SET AST TYPEC% MOV R0,R5 ;COPY CLI'S TCB ADDRESSC# M00RhhzgM{gfffDATAOV R1,R3 ;COPY COMMAND ADDRESSA .IFF ;A$$CLI  $DCAST==-1 .ENDC ;A$$CLI;+; **-$DASTT-DECLARE AST TRAP; E; THIS ROUTINE IS CALLED TO DECLARE A NON-I/O RELATED AST TRAP. THETG; TCB OF THE SPECIFIED TASK IS EXAMINED TO DETERMINE IF THE SPECIFIEDS>; AST IS ENABLED (SETUP). IF IT IS THEN THE AST IS DECLARED.; ; INPUTS:;F+; R3=COMMAND ADDRESS IF AST TYPE = AS.CAAD4; R4=CODE INDICATING WHICH AST SHOULD BE DECLARED.=; R5=ADDRESS OF THE TCB OF THE TASK TO DECLARE THE AST FOR.; ; OUTPUTS:;7; C=1 IF THE TASK IS NOT SETUP FOR THE SPECIFIED AST.$G; C=0 IF THE TASK IS SETUP FOR THE AST AND THE AST HAS BEEN DECLARED.-); R1=ADDRESS OF THE AST CONTROL BLOCK.S;I); NOTE: R4 IS DESTROYED BY THIS ROUTINEC;-  .ENABL LSBD6$DASTT::CALL $SRAST ;SEARCH FOR SPECIFIED AST BLOCK! BCS 10$ ;IF CS, THERE IS NONEE .IF DF A$$CLI: CMP A.CBL(R0),# ;DECLARING CMD ARRIVAL AST BNE 1$ ;IF NE NO2 MOV R1,-(SP) ;SAVE POINTER TO AST BLOCK ADDRESS- MOV #C.LGTH,R1 ;GET LENGTH OF AN AST BLOCKS+ CALL $ALOCB ;ALLOCATE ONE FROM THE POOLF5 MOV (SP)+,R4 ;RESTORE POINTER TO AST BLOCK ADDRESSR2 MOV (R4),R1 ;GET ADDRESS OF EXISTING AST BLOCK* BCC 105$ ;IF CC, SUCCESSFUL ALLOCATION8 MOV SP,A.PRM+2(R1) ;NON-ZERO TO FORCE SYSXT TO RELINK, MOV (R1),(R4) ;REMOVE AST BLOCK FROM LIST  BR 107$ ;D-105$: MOV R1,R4 ;COPY POINTER TO OLD BLOCKD& MOV R0,R1 ;COPY NEW AST BLOCK ADDR# CMP (R4)+,(R0)+ ;SKIP LINK WORDS  MOV (R4)+,(R0)+ ;COPY A.CBL MOV (R4)+,(R0)+ ;COPY A.BYT MOV (R4)+,(R0)+ ;COPY A.AST MOV (R4)+,(R0)+ ;COPY A.NPR5 CLR A.PRM+2(R1) ;ZERO TO FORCE SYSXT TO DEALLOCATE,:107$: MOV R3,A.PRM(R1) ;SET COMMAND ADDRESS IN AST BLOCK% MOV R5,R0 ;SET TCB ADDRESS OF CLI+ BR $QASTT ;QUEUE AST1$:  .ENDC ;A$$CLI: CMPB A.CBL+1(R0),#AS.REA ;IS THIS A REQUESTED EXIT AST? BNE 2$ ;IF NE NO8 BIS #T2.REX,T.ST2(R5) ;INDICATE AST HAS BEEN DECLARED;2$: MOV (R0),(R1) ;REMOVE THE CONTROL BLOCK FROM THE LISTM4 MOV R0,R1 ;SAVE ADDRESS OF THE AST CONTROL BLOCK MOV R5,R0 ;COPY TCB ADDRESSN .IF DF C$$INT BR $QASTT ;GO QUEUE THE AST0;+0; **-$DQAC-DEQUEUE AST BLOCK QUEUED BY $QASTC.#; (TO BE CALLED FROM SYSXT ONLY).;Q ; INPUT:; R0 POINTER TO AST BLOCK$; ; OUTPUT:P-; A.CBL SET TO 1 TO INDICATE AST BLOCK FREE ; (NOT IN AST QUEUE).O;B; REGISTERS ALTERED: NONEE;-,$DQAC:: INC A.CBL(R0) ; SET AST BLOCK FREE  RETURNR;+ ; **-$QASTC-QUEUE AST TO TASK.;CA; THIS IS A VARIANT OF $QASTT TO BE USED BY A TASK ISR, ENTERED$6; VIA A VECTOR CONNECTED TO VIA THE CINT$ DIRECTIVE.;$ ; INPUT:#; R5 POINTER TO FORK BLOCK IN ITB ;L ; OUTPUT:T?; CC-C 0 IF OK, 1 IF AST ADDRESS NOT SPECIFIED IN CINT$ CALL.;P;; NOTE - IF THE AST BLOCK IS ALREADY QUEUED FOR THE TASK,T(; NO ACTION IS TAKEN. RETURN CC-C = 0.;N"; REGISTERS ALTERED: R0,R1,R2,R3;-$QASTC::MOV R5,R1T& ADD #X.AST-X.FORK,R1 ;GET AST BLOCK1 TST A.CBL(R1) ;AST BLOCK ALREADY IN AST QUEUE? # BEQ 10$ ;Y - EXIT WITH CC-C = 0( TST A.AST(R1) ;AST ADDRESS SPECIFIED? SEC ;ASSUME NO # BEQ 10$ ;N - EXIT WITH CC-C = 1I+  CLR A.CBL(R1) ;INDICATE AST BLOCK IN USE +  MOV X.TCB-X.FORK(R5),R0 ;GET TCB ADDRESS  ;FALL THRU TO $QASTT   .ENDC;+; **-$QASTT-QUEUE AST TO TASKK;EF; THIS ROUTINE IS USED TO QUEUE AN AST TO A TASK AND INSURE THE TASKH; WILL BE SCHEDULED AND RECONSIDERED FOR ELIGIBILITY IN THE PARTITION.;; ; INPUTS:E;N); R0=TCB ADDRESS OF TASK TO RECEIVE AST-.; R1=ADDRESS OF AST CONTROL BLOCK TO BE USED;S ; OUTPUTS:;; C=0 ; R1 IS PRESERVED ;- 4!$QASTT::ADD #T.ASTL,R0 ;POINT TO TASK AST LISTHEAD2" MOV R1,-(SP) ;SAVE ADDRESS OF AST CONTROL BLOCK2# CALL $QINSF ;INSERT CONTROL BLOCK IN AST QUEUE,$ SUB #T.ASTL,R0 ;POINT BACK TO TCB ADDRESS%;+&00Rh%hgcccc; ** W A R N I N G **D';R(; SPM HOOKPOINT NUMBER 08.);N+*; DO NOT CHANGE THE INSTRUCTION FOLLOWINGO+; LABEL WITHOUT CHECKING SPM,;---.$SPH08==. ;SPM CHANGES THE INSTRUCTION ATO!/ ;THE LOCATION OF THIS LABELS20 CALL @#$SETCR ;SET CONDITIONAL SCHEDULE REQUEST*1 BIT #T2.STP,T.ST2(R0) ;IS TASK STOPPED?2 BEQ 5$ ;IF EQ NO3&4 MOV T.PCB(R0),R0 ;POINT TO TASK PCB*5 CALL $NXTSK ;REALLOCATE TASK PARTITION565$: MOV (SP)+,R1 ;RESTORE AST CONTROL BLOCK ADDRESSD7 CLC ;RETURN CARRY CLEAR810$: RETURN ;P 9 .DSABL LSBB:;;+.<; **-$SRAST-SEARCH FOR A SPECIFIED AST BLOCK=; J>; THIS ROUTINE IS CALLED TO SEARCH FOR A SPCIFIC TYPE OF AST CONTROL BLK?;A @; INPUTS:EA;T7B; R4=CODE INDICATING TYPE OF BLOCK TO BE SEARCHED FORE<C; R5=TCB ADDRESS OF TASK WHOSE SAST LIST IS TO BE SEARCHEDD; E; OUTPUTS:F;M/G; C=1 IF SPECIFED TYPE OF AST BLOCK NOT FOUNDK/H; C=0 IF SPECIFIED TYPE OF AST BLOCK IS FOUND;I; R0=ADDRESS OF THE BLOCK-J; R1=ADDRESS OF WORD POINTING TO THE BLOCKRK;-%L$SRAST::MOV R5,R0 ;GET TCB ADDRESSS7M ADD #T.SAST,R0 ;POINT TO SPECIFIED AST BLOCK ADDRESSEN10$: SEC ;ASSUME FAILURE(O MOV R0,R1 ;GET POINTER TO NEXT BLOCKP MOV (R0),R0 ;GET LINK WORDQ BEQ 20$ ;IF EQ, END OF LIST ?R CMPB R4,A.CBL+1(R0) ;IS THIS THE BLOCK OF THE SPECIFIED TYPEDS BNE 10$ ;NO IF NE T20$: RETURNSUV;+'W; **-$SRPRO-SEARCH PROTOTYPE TCB LISTEX;DDY; THIS ROUTINE IS CALLED TO SCAN THE SECONDARY POOL TCB LIST FOR AEZ; SPECIFIC TASK NAME. IF THE SEARCH SUCCEEDS, THEN THE ADDRESS OF ACE[; KISAR5 BIAS, WITH THE LOW BIT OF THE ADDRESS SET TO DIFFERENTIATEF\; IT FROM A POOL TCB ADDRESS, IS RETURNED. IF THE SEARCH FAILS, THENA]; THE ROUTINE DROPS INTO $SRSTD TO SEARCH THE PRIMARY TCB LIST.C^;4 _; INPUTS:;`;I-a; R3=ADDRESS OF THE TASK NAME TO SEARCH FOR b;F c; OUTPUTS:d;S.e; C=1 IF THE TASK IS NOT IN EITHER TASK LISTf; C=0 IF TASK WAS FOUNDE(g; R0=ADDRESS OF TCB IN POOL (IF EVEN)2h; R0=ADDRESS OF KISAR5 BIAS OF TCB ! 1 (IF ODD)i;-jk$SRPRO:: ;REFERENCE LABEL5lm .IF DF P$$OOLn.o CALL CLIDSP ;CHECK IF TASK NAME WAS CLI...(p MOV KISAR6,-(SP) ;SAVE APR 6 FOR SCAN.q MOV $PTCBL,KISAR6 ;MAP TO FIRST TCB IN LIST r BEQ 30$ ;IF EQ THERE IS NONE@s10$: CMP (R3),140000+T.NAM ;MATCH ON FIRST HALF OF TASK NAME ?t BNE 20$ ;IF NE NOU6u CMP 2(R3),140002+T.NAM ;LUCKY SO FAR, SECOND HALF ?"v BEQ 40$ ;IF EQ YES, THIS IS IT8w20$: MOV 140000+T.TCBL,KISAR6 ;MAP TO NEXT TCB IN LIST"x BNE 10$ ;IF NE NOT END OF LIST6y30$: MOV (SP)+,KISAR6 ;PUT APR 6 BACK AS WE FOUND ITz BR SCNSTD ;AND TRY THE STD5{40$: MOV #$PTCPT,R0 ;POINT TO THE PROTO TCB POINTER %| MOV KISAR6,(R0) ;STORE KISAR6 BIASO4} INC R0 ;INDICATE KISAR5 POINTER, NOT TCB ADDRESS-~ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGL& RETURN ;C IS CLR DUE TO CMP ABOVE .ENDC ;DF P$$OOLA;+*; **-$SRSTD-SEARCH SYSTEM TASK DIRECTORY;SI; THIS ROUTINE IS CALLED TO SEARCH THE TASK DIRECTORY FOR A TASK OF THE$; SPECIFIED NAME.I; ; INPUTS:+;R.; R3=ADDRESS OF THE TASK NAME TO SEARCH FOR.;T ; OUTPUTS:;M'; C=1 IF SPECIFIED TASK IS NOT FOUND.N#; C=0 IF SPECIFIED TASK IS FOUND.6; R0=ADDRESS OF THE TCB.K; ,; R1,R2, AND R3 ARE PRESERVED ACROSS CALL.;-  .ENABL LSBL($SRSTD::CALL CLIDSP ;CHECK FOR CLI...3SCNSTD: MOV $TSKHD,R0 ;POINT TO FIRST TCB IN LISTR410$: CMP T.NAM(R0),(R3) ;FIRST HALF OF NAME MATCH? BNE 20$ ;IF NE NO 4 CMP T.NAM+2(R0),2(R3) ;SECOND HALF OF NAME MATCH? BEQ 30$ ;IF EQ YES.20$: MOV T.TCBL(R0),R0 ;GET LINK TO NEXT TCB TST T.TCBL(R0) ;NULL TASK?= BNE 10$ ;IF NE NON25$: SEC ;INDICATE FAILURE30$: RETURN ;;RF; **-CLIDSP-LOCAL ROUTINE TO CHECK IF SUPPLIED TASK NAME IS "CLI...";E; THIS ROUTINE IS CALLED BY EITHER $SRPRO OR $SRSTD TO CHECK IF THEO@; TASK THEY ARE TRYING TO FIND IS THE CLI DISPATCHER "CLI...".A; IF IT IS, THE ADDRESS OF MCR... IS PUT IN R0, AND A RETURN00RhhzgM{gfffDATA TO2?; THE CALLER'S CALLER IS EXECUTED. OTHERWISE, A RETURN TO THE@; APPROPRIATE SCAN ROUTINE IS EXECUTED TO SEARCH THE LIST. ALLJ; THIS IS BEING DONE SINCE THERE IS NO ACTUAL CLI... TASK IN THE SYSTEM.G; CLI... IS INTENDED TO BE USED FROM SPWN$ OR RPOI$ TO PASS A COMMANDSE; LINE TO THE TERMINAL'S CLI, WHEREAS MCR... WILL FORCE THE COMMANDR); TO MCR, REGARDLESS OF CLI ASSIGNMENT. ;G ; INPUTS:H; ; R3=ADDRESS OF TASK NAMEI; ; OUTPUTS:;.=; IF THE NAME WAS CLI..., THE TCB ADDRESS IS RETURNED IN R0E%; WITH C=0 TO THE CALLER'S CALLER. C; IF THE NAME WAS NOT CLI..., A RETURN TO THE CALLER IS EXECUTED.S;E;-/CLIDSP: CMP #^RCLI,(R3) ;SEARCHING FOR CLI.... BNE 35$ ;IF NE NOD  CMP #^R...,2(R3) ;MAY HAVE IT BNE 35$ ;IF NE NOI# MOV $MCRPT,R0 ;USE TCB OF MCR....3 TST (SP)+ ;POP FIRST RETURN ADDRESS AND SET C=0 35$: RETURN ;+3; **-$ACTRM-REMOVE TASK FROM THE ACTIVE TASK LIST;UE; THIS ROUTINE IS CALLED TO REMOVE A TCB FROM THE ACTIVE TASK LIST.N; ; INPUTS: ;E$; R0=ADDRESS OF THE TCB TO REMOVE.; ; OUTPUTS:; D; C=1 IF THERE IS NO ENTRY IN THE LIST THAT MATCHES THE TCB ADDRES5; C=0 IF A MATCHING ENTRY IS REMOVED FROM THE LIST.R;($; R0 IS PRESERVED ACROSS THE CALL.;;-5$ACTRM::MOV #$ACTHD-T.ACTL,R1 ;GET ADDR OF LISTHEADR)40$: MOV R1,R2 ;SAVE PREVIOUS TCB ADDR' MOV T.ACTL(R2),R1 ;GET NEXT TCB ADDRA$ BEQ 25$ ;IF EQ END OF LIST FOUND* CMP R0,R1 ;DOES NEXT TCB ADDR EQ OURS?% BNE 40$ ;IF NE NO -- KEEP LOOKING* MOV T.ACTL(R0),T.ACTL(R2) ;REMOVE ENTRY RETURN ;EXIT  .DSABL LSBE;+(; **-$SRMUT-SEARCH FOR MULTI-USER TASK; F; THIS ROUTINE CALCULATES THE NAME OF A MULTI-USER TASK ACCORDING TOC; THE NAME OF THE PROTOTYPE TCB AND THE TI: OF THE COPY. IT THENRB; SEARCHES FOR THE COPY OF THE MULTI-USER TASK IN THE TASK LIST.;M ; INPUTS:,;E@; R0=ADDRESS OF THE TI: UCB OF THE COPY OF THE MULTI-USER TASK:; R1=FIRST WORD OF THE TASK NAME OF THE COPY OF THE TASK;O ; OUTPUTS:;T<; R3=PTR TO CALCULATED TASK NAME (IN $TNAME AND $TNAME+2).;.; C=0 IF THE COPY WAS FOUND IN THE TASK LIST; R0=ITS TCB ADDRESSE;U2; C=1 IF THE COPY WAS NOT FOUND IN THE TASK LIST;- .IF DF R$$DSP4$SRMUT::MOV R1,$TNAME ;SET FIRST WORD OF TASK NAME% CLR -(SP) ;ALLOCATE SCRATCH SPACEL! MOV (R0),R2 ;POINT TO TI: DCB * TST (R2)+ ;SKIP OVER LINK WORD (D.LNK)5 SUB (R2)+,R0 ;CALC RELATIVE ADDRESS OF UCB (D.UCB) 3 MOV (R2)+,-(SP) ;PUSH DEVICE NAME OF TI: (D.NAM)39 MOV (R2)+,-(SP) ;SAVE LOW UNIT NUMBER FOR DCB (D.UNIT)- MOV (R2),R1 ;PICK UP SIZE OF UCB (D.UCBL)T4 CALL $DIV ;CALCULATE RELATIVE UNIT NUMBER OF UCB6 ADD (SP)+,R0 ;CALCULATE LOGICAL UNIT NUMBER OF UNIT" BIC #177400,R0 ;CLEAR HIGH BYTE( CMP R0,#77 ;IS UNIT GREATER THAN 77? BLOS 9$ ;IF LOS NO MOV R0,R1 ;COPY UNIT NUMBER . ASH #-3,R1 ;CALCULATE HIGH ORDER CHARACTER" ADD #'A-10,R1 ;CONVERT TO ASCII0  BIC #177770,R0 ;CALCULATE LOW ORDER CHARACTER  ADD #'0,R0 ;CONVERT TO ASCII  BR 15$ ;" 9$: MOV R0,R1 ;COPY UNIT NUMBER)  BIC #70,R0 ;MASK OFF HIGH-ORDER DIGITC& ADD #'0,R0 ;CONVERT TO ASCII DIGIT' ASRB R1 ;CALCULATE HIGH-ORDER DIGITU  ASRB R1 ;I  ASRB R1 ;T. BNE 10$ ;IF NE THERE IS A HIGH-ORDER DIGIT, MOV R0,R1 ;ELSE SUPPRESS HIGH-ORDER ZERO  BR 20$ ;*10$: ADD #'0,R1 ;CONVERT TO ASCII DIGIT%15$: MOVB R0,2(SP) ;STORE LOW DIGITD,20$: MOVB R1,1(SP) ;STORE IN SCRATCH SPACE' MOV SP,R0 ;POINT TO ASCII TASK NAME#% CALL $CAT5 ;CONVERT TO RAD50 WORD CMP (SP)+,(SP)+ ;CLEAN STACKR3 MOV #$TNAME,R3 ;POINT TO TASK NAME AREA IN SYSCM#- MOV R1,2(R3) ;SET SECOND WORD OF TASK NAMEL1 CALLR $SRSTD ;SEARCH FOR TASK NAME AND RETURN1;+ ; **-$TCBCP-TCB COPY ROUTINE!;DE"; THIS ROUTINE IS CALLED TO COPY AN INSTALLED TCB INTO AN ALLOCATED:E#; TCB AND LINK IT INTO TO THE SYSTEM TASK DIRECTORY. SPECIFICALLY,I$$; THIS ROUTINE DOES 00Rh%hgccccTHE FOLLOWING:%;HH&; 1. COPY THE CONTENTS OF THE INSTALLED TCB INTO THE ALLOCATED TCB.8'; 2. INITIALIZE ALL LISTHEADS IN THE ALLOCATED TCB.C(; 3. TRANSFER ANY SEND PACKETS DESTINED FOR THE ALLOCATED TCB.C.); 4. SET UP THE TASK NAME IN THE NEW TCB.E*; 5. LINK THE NEW TCB INTO THE SYSTEM TASK DIRECTORY IMMEDIATELY7+; AFTER THE TCB INPUT AS THE PROTOTYPE INSTALLED TCB.N,; -; INPUTS:.; #/; R0=ADDRESS OF THE ALLOCATED TCBI#0; R1=ADDRESS OF THE INSTALLED TCBU@1; IF R1 IS ODD, THEN R1-1 IS THE ADDRESS OF THE KISAR6 BIAS,2; OF A PROTOTYPE TCB IN SECONDARY POOL.A3; R3=ADDRESS OF THE TASK NAME DOUBLE-WORD FOR THE ALLOCATED TCBF4;Y 5; OUTPUTS:6;N7; R0 AND R1 ARE PRESERVED.8;-9!:$TCBCP::SAVNR ;SAVE R4 AND R5;< .IF DF P$$OOL=0> MOV KISAR6,-(SP) ;SAVE CURRENT KERNEL MAPPING)? BIT #1,R1 ;IS TCB IN SECONDARY POOL ?L@ BEQ 3$ ;IF EQ NOA DEC R1 ;POINT BACK TO BIAS*B MOV (R1),KISAR6 ;REMAP TO SEC. POOL TCB1C MOV (R1),(R0)+ ;STORE KISAR6 BIAS IN T.LNK FOR (D ;POSSIBLE ERROR RECOVERY BY $REMOV/E MOV #140000,R1 ;POINT TO TCB VIRTUAL ADDRESS F BR 4$ ;ENTER COMMON CODEGH .ENDC ;DF P$$OOLI2J3$: CLR (R0)+ ;CLEAR AND SKIP LINK WORD (T.LNK):K4$: MOVB T.DPRI(R1),(R0)+ ;INIT RUNNING PRIORITY (T.PRI)L&M CLRB (R0)+ ;INIT I/O COUNT (T.IOC)<N MOV T.PCBV(R1),(R0)+ ;COPY POINTER TO PCB VECTOR (T.PCBV)O BEQ 5$ ;IF EQ THERE IS NONE 9P ADD #400,@T.PCBV(R1) ;INCREMENT ACCESS COUNT IN VECTOR.Q5$: MOV (R3)+,(R0)+ ;STORE TASK NAME (T.NAM)R MOV (R3),(R0)+ ;O3S ADD #T.RCVL,R1 ;POINT TO INSTALLED TCB RCVD LIST !T CALL 40$ ;SETUP RECEIVE QUEUECU10$: ;MARK T.RCVL CALLP V CALL @(SP)+ ;SETUP AST QUEUE'W CLR (R0)+ ;CLEAR EFN WORDS (T.EFLG)TX CLR (R0)+ ;I9Y CMP (R0)+,(R0)+ ;POINT TO STATUS WORDS (T.UCB)(T.TCBL)C5Z MOV #TS.EXE,(R0)+ ;INIT FIRST STATUS WORD (T.STAT)P=[ ADD #T.ST2-T.EFLG,R1 ;POINT TO INSTALLED TCB 2ND STAT WORD02\ MOV (R1)+,(R0) ;COPY SECOND STATUS WORD (T.ST2)?] BIC #^CT2.CHK,(R0)+ ;CLEAR ALL BUT CHECKPOINTABILITY (T.ST2)O1^ MOV (R1)+,(R0) ;COPY THIRD STATUS WORD (T.ST3)S>_ BIC #T3.REM!T3.MCR!T3.CAL,(R0)+ ;CLR NECESSARY BITS (T.ST3)$` MOV (R1)+,(R0)+ ;(T.DPRI & T.LBN)a MOV (R1)+,(R0)+ ;(T.LBN+1)Sb MOV (R1)+,(R0)+ ;(T.LDV),c MOV (R1)+,R2 ;PICK UP PCB ADDRESS (T.PCB)0d MOV P.MAIN(R2),(R0)+ ;SET PCB POINTER (T.PCB)e MOV (R1)+,(R0)+ ;(T.MXSZ)f CMP (R1)+,(R0)+ ;(T.ACTL)+g CALL @(SP)+ ;SET UP ATTACHMENT LISTHEADP-h MOV (R1)+,(R0) ;FOURTH STATUS WORD (T.ST4)(/i BIC #T4.PRO,(R0)+ ;CLEAR NON-PROPAGATED BITS3j MOV (R1)+,(R0)+ ;HDR LENGTH/UNUSED BYTE (T.HDLN)B5k CLR (R0)+ ;GRP GBL USE/BUFFERED I/O (T.GGF,T.TIO)Tl TST (R1)+ ;POINT TO T.EFLM:m MOV (R1)+,(R0)+ ;COPY POSSIBLE CPU TIME LIMIT IN T.EFLMn MOV (R1)+,(R0)+ ;SECOND HALF op .IF DF A$$CNTq9r BIT #TS.EXE,T.STAT-T.TKSZ(R1) ;IS SOURCE TASK ACTIVE ?+s BNE 15$ ;IF NE, NO0t CLR -2(R0) ;YES, THEN DON'T COPY (T.EFLM+2).u CLR -4(R0) ;EVENT FLAG MASKS (T.EFLM)v15$: ;REFERENCE LABELwx .ENDC ; DF A$$CNTy3z MOV (R1)+,(R0)+ ;TASK INITIAL LOAD SIZE (T.TKSZ)E{$$$=T.TKSZ+2|}~ .IF DF P$$LAS, MOV (R1)+,(R0)+ ;COPY OFFSET WORD (T.OFF)1 CLR (R0)+ ;CLR SREF WITH EFN COUNT (T.SRCT-1)L, TST (R1)+ ;ADVANCE INSTALLED TCB POINTER5 CALL @(SP)+ ;SET UP RECEIVE BY REFERENCE LISTHEADK20$: ;MARK T.RRFL CALL .$$$=T.RRFL+4 ;MARK CURRENT POSITION IN TCB .ENDC .IF DF N$$DIR4 CLR (R0) ;POINTER TO CONTEXT BLOCK (DDS) (T.CTX)* CMP (R0)+,(R1)+ ;INCREMENT TCB POINTERS $$$=T.CTX+2A .ENDC ; DF N$$DIR .IF DF P$$OFF# CALL @(SP)+ ;SETUP OCB LISTHEAD0! CLR (R0) ;CLEAR RUNDOWN COUNTR( CMP (R0)+,(R1)+ ;ADVANCE TCB POINTERS .ENDC CLR (R0) ;CLEAR T.SAST,$$$=T.SAST ;MARK CURRENT POSITION IN TCB .IF DF M$$PRO1 CMP (R0)+,(R1)+ ;ADVANCE TCB POINTERS TO T.RRMO* MOV (R1)+,(R0)+ ;COPY REQUIRED RUN MASK1 MOV (R1)+,(R0)+ ;COPY INITIAL AFFINITY (T.IRM)D00RhhzgM{gfffDATA* CLR (R0) ;CLEAR CPU ID AND UNUSED BYTE $$$=T.CPU .ENDC .IF DF A$$CNT1 CMP (R0)+,(R1)+ ;ADVANCE TCB POINTERS TO T.ACNB/ CLR (R0) ;CLEAR POINTER TO ACCOUNTING BLOCK+$$$=T.ACN ;MARK CURRENT POSITION IN TCBN .ENDC .IF DF U$$DAS1 CMP (R0)+,(R1)+ ;ADJUST TCB POINTERS TO T.ISIZ# MOV (R1),(R0) ;COPY I SPACE SIZE+ $$$=T.ISIZ .ENDC ; DF U$$DAS$ SUB #$$$,R0 ;POINT BACK TO START SUB #$$$,R1 ;I .IF DF P$$OOL) CMP #140000,R1 ;TCB IN PRIMARY POOL ? BHI 30$ ;IF HI YES6 MOV #$TSKHD-T.TCBL,R2 ;POINT TO FIRST TCB IN SYSTEM+25$: MOV R2,R1 ;SAVE POINTER TO OLD TCB 0 MOV T.TCBL(R2),R2 ;POINT TO NEXT TCB IN LIST! BEQ 30$ ;IF EQ THERE IS NONEN< CMPB T.DPRI(R2),T.DPRI(R0) ;TASK BELONG BEFORE THIS TCB ?# BHIS 25$ ;IF HIS NO,KEEP GOINGR30$: ;REFERENCE LABEL= .ENDC ; DF P$$OOL9 MOV T.TCBL(R1),T.TCBL(R0) ;LINK ALLOCATED TCB INTO STD$ MOV R0,T.TCBL(R1) ;$ TST (SP)+ ;POP COROUTINE ADDRESS .IF DF P$$OOL4 MOV (SP)+,KISAR6 ;RESTORE PREVIOUS KERNEL MAPPING .ENDC ; DF P$$OOL  RETURN ;P040$: CLR (R0) ;INIT LISTHEAD IN ALLOCATED TCB MOV R0,2(R0) ; .IF DF P$$LAS& CMP (SP),#20$ ;IS IT THE RRFL LIST? BEQ 50$ ;IF EQ YES .ENDC) CMP (SP),#10$ ;IS IT THE RECEIVE LIST?A BNE 80$ ;IF NE NO 6 BIT #T3.NSD!T3.ACP,T.ST3-T.RCVL(R1) ;DOES TASK HAVE ;STANDARD RECEIVE QUEUE ?R* BNE 80$ ;IF NE, NO - DON'T TRY TO COPY .IF DF P$$OOL4 MOV R0,-(SP) ;SAVE LISTHEAD ADDRESS FOR ALLOC TCB2 MOV R1,-(SP) ;SAVE LISTHEAD ADDRESS FOR INS TCB  MOV KISAR5,-(SP) ;SAVE KISAR5) MOV R1,R0 ;COPY INSTALLED TCB POINTER  MOV R0,R4 ;COPY POINTER;$46$: MOV (R4),R4 ;GET NEXT PACKET BEQ 47$ ;IF EQ END OF LIST. MOV R4,KISAR5 ;MAP THE PACKET THROUGH APR 50 MOV @#120002,R1 ;GET NUMBER OF DATA WORDS + 2 ASL R1 ;CONVERT TO BYTES/ ADD #120010,R1 ;POINT TO TASK NAME IN PACKETO, MOV #120000,R4 ;POINT TO PACKET LINK WORD5 CMP (R1),-2(R3) ;MATCH ON FIRST WORD OF TASK NAME?T BNE 46$ ;IF NE NOV5 CMP 2(R1),(R3) ;MATCH ON SECOND WORD OF TASK NAME?V BNE 46$ ;IF NE NO $ MOV KISAR5,R1 ;GET PACKET ADDRESS/ MOV 2(SP),R0 ;GET LISTHEAD FOR ALLOCATED TCBX5 CALL $GTSPK ;UNLINK THE PACKET FROM INSTALLED TCBA% MOV R0,R4 ;SET UP TO RESTART SCANV3 MOV 4(SP),R0 ;GET INSTALLED TCB LISTHEAD ADDRESS - CALL $QSPIF ;AND LINK IT TO ALLOCATED TCB  BR 46$ ;CONTINUE SCANV'47$: MOV (SP)+,KISAR5 ;RESTORE KISAR54 MOV (SP)+,R1 ;RESTORE LISTHEAD ADDRESS OF INS TCB6 MOV (SP)+,R0 ;RESTORE LISTHEAD ADDRESS OF ALLOC TCB  BR 80$ ;  .ENDC  0 50$: MOV R1,R5 ;INIT POINTER TO START OF LIST+ 60$: MOV R5,R4 ;SAVE POINTER TO PREVIOUSC& MOV (R5),R5 ;POINT TO NEXT IN LIST  BEQ 80$ ;IF EQ THERE IS NONE7 CMP 44(R5),-2(R3) ;MATCH ON FIRST WORD OF TASK NAME?T BNE 60$ ;IF NE NO6 CMP 46(R5),(R3) ;MATCH ON SECOND WORD OF TASK NAME? BNE 60$ ;IF NE NO:) MOV (R5),(R4) ;UNLINK PACKET FROM LIST(2 BNE 70$ ;IF NE IT WAS NOT THE LAST IN THE LIST, MOV R4,2(R1) ;UPDATE LAST IN LIST POINTER!70$: CLR (R5) ;CLEAR LINK WORD3 MOV R5,@2(R0) ;LINK TO END OF ALLOCATED TCB LIST, MOV R5,2(R0) ;UPDATE LAST IN LIST POINTER0 MOV R1,-(SP) ;SAVE T.RRFL PTR FOR PROTO TCB0 MOV R0,-(SP) ;SAVE T.RRFL PTR FOR CREATED TCB- MOV 10(R5),R0 ;GET REGION ID TO SEARCH FOR + ADD #A.TCBL,R0 ;ADJUST TO LINK WORD ADDRO7 ADD #T.ATT-T.RRFL,R1 ;POINT TO PROTO ATT DESC LIST). MOV R1,R2 ;MAKE A COPY OF LISTHEAD ADDRESS' 72$: MOV R2,R4 ;SAVE POINTER TO LAST,! MOV (R2),R2 ;GET NEXT ADBT " BEQ 74$ ;IF EQ THERE IS NONE# CMP R2,R0 ;THIS THE ONE ? $ BNE 72$ ;IF NE NOS"% MOV (R2),(R4) ;UNLINK FROM LIST#& BNE 73$ ;IF NE NOT LAST IN LIST.,' MOV R4,2(R1) ;UPDATE LAST IN LIST POINTER6(73$: MOV (SP),R0 ;RESTORE POINTER TO CREATED T.RRFL7) ADD #T.ATT-T.RRFL,R0 ;POINT TO CREATED ATT DESC LISTO,* MOV R2,@2(R0)00Rh%hgcccc ;INSERT IN SPAWNED ATT LIST$+ MOV R2,2(R0) ;UPDATE LAST IN LIST3, MOV R0,A.TCB-A.TCBL(R2) ;CREATE POINTER IN A.TCBV.- SUB #T.ATT,A.TCB-A.TCBL(R2) ;TO CORRECT TCB9. BICB #AS.PRO,A.STAT-A.TCBL(R2) ;INDICATE PRI. POOL TCBH&/74$: MOV (SP)+,R0 ;RESTORE REGISTERS0 MOV (SP)+,R1 ;F1 BR 50$ ;RESTART SCAN*280$: CMP (R0)+,(R0)+ ;BUMP BOTH POINTERS3 CMP (R1)+,(R1)+ ;%4 CALL @(SP)+ ;CALL THE CALLER BACKT 5 BR 40$ ;6"6 .ENDC ; DF R$$DSP ;JWB2138 ;**-1O9:;+;; **-$REMOV-REMOVE TASK .<; **-$REMO1-REMOVE TASK DURING ERROR CLEANUP=;VF>; THIS ROUTINE IS STRICTLY DESIGNED TO REMOVE A TASK, WHICH HAS BEENE?; DYNAMICALLY INSTALLED BY THE EXECUTIVE-LEVEL DISPATCHING CODE, AS.B@; PART OF ERROR RECOVERY BEFORE THE TASK IS EVER ACTIVATED, OR AGA; TASK BEING REMOVED ON TASK EXIT. IT WILL NOT, IN GENERAL, PROPERLY B; REMOVE ANY OTHER GIVEN TASK.C;CDD; $REMO1 IS AN ALTERNATE ENTRY TO BE USED WHEN CLEANING UP AFTER ACE; FALSE START, SUCH AS WHEN THE SPAWN DIRECTIVE PASSES $TCBCP BUT*DF; FAILS TO START THE TASK. $REMO1 CHECKS THE UTILTITY LINK WORD TOGG; SEE IF IT CONATINS THE KISAR6 BIAS OF THE PROTOTYPE TCB, AND SHOULDE@H; NOT BE CALLED IF THE TCB HAS BEEN CHANGED (E.G. FROM $DREIF)I;E J; INPUTS: K;I)L; R0=TCB ADDRESS OF TASK TO BE REMOVED.VM; N; OUTPUTS:O; P; NONE.EQ;-RS T .ENABL LSBYUV$REMO1:: ;REFERENCE LABEL1WX .IF DF P$$OOLY#Z SAVNR ;SAVE NON-VOL. REGISTERS ([ MOV KISAR6,-(SP) ;SAVE KERNEL MAPPING0\ MOV (R0),KISAR6 ;MAP TO POSSIBLE SEC POOL TCB%] BEQ 5$ ;IF EQ TCB IN PRIMARY POOL )^ MOV #140000,R1 ;POINT TO PROTOTYPE TCBO_ CALL 15$ ;JOIN $REMOV BELOW-` MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGE a RETURN ;)b0c5$: MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGde .ENDC ; DF P$$OOLf!g$REMOV::SAVNR ;SAVE R4 AND R5-h CALL $DRCSR ;CANCEL ANY SCHEDULE REQUESTS "i MOV R5,R0 ;RESTORE TCB ADDRESSjkl .IF DF P$$LASm6n CALL $CLSRF ;CLEAR ANY REC BY REF PKT PTRS TO TASKop .ENDCqr>s MOV #$TSKHD-T.TCBL,R1 ;POINT TO START OF TASK LIST - T.TCBL)t CMP $TSKHD,R0 ;REMOVING FIRST IN LIST?Cu BEQ 40$ ;IF EQ YES/v10$: MOV T.TCBL(R1),R1 ;POINT TO NEXT IN LISTN,w CMP T.TCBL(R1),R0 ;REMOVING NEXT IN LIST?x BNE 10$ ;IF NE NOIyz15$: ;REFERENCE LABEL{| .IF DF P$$OOL}6~ MOV T.RCVL(R0),R2 ;ANY ENTRIES IN THE RECEIVE LIST? BEQ 30$ ;IF EQ NOO& MOV KISAR5,-(SP) ;SAVE KERNEL APR 50 MOV #120000,R4 ;POINT TO FIRST WORD OF PACKET= MOV T.RCVL+2(R1),KISAR5 ;MAP THE LAST PACKET THROUGH APR 5N0 TST T.RCVL(R1) ;PROTO TCB RECEIVE LIST EMPTY? BNE 20$ ;IF NE NOT% MOV R1,R4 ;COPY PROTO TCB ADDRESST( ADD #T.RCVL,R4 ;POINT TO RECEIVE LIST720$: MOV R2,(R4) ;LINK RECEIVE ENTRIES TO PROTO LIST 9 MOV T.RCVL+2(R0),T.RCVL+2(R1) ;FIX UP LAST IN LIST PTRL) MOV (SP)+,KISAR5 ;RESTORE KERNEL APR 5T .IFFS: MOV T.RCVL(R0),@T.RCVL+2(R1) ;LINK ENTRIES TO PROTO TCB! BEQ 30$ ;IF EQ THERE ARE NONEO9 MOV T.RCVL+2(R0),T.RCVL+2(R1) ;FIX UP LAST IN LIST PTRE .ENDC30$: ;REF LABEL .IF DF P$$LAS: MOV T.RRFL(R0),@T.RRFL+2(R1) ;LINK ENTRIES TO PROTO TCB! BEQ 40$ ;IF EQ THERE ARE NONEI9 MOV T.RRFL+2(R0),T.RRFL+2(R1) ;FIX UP LAST IN LIST PTR  .ENDC940$: MOV T.ATT(R0),@T.ATT+2(R1) ;MOVE ADBS (FROM SREFS)S" BEQ 41$ ;IF EQ THERE WERE NONE9 MOV T.ATT(R0),T.ATT+2(R1) ;UPDATE LAST IN LIST POINTER 5 MOV T.ATT(R0),R4 ;GET ADDRESS OF FIRST ADB IN LISTV5412$: CMP #120000,R1 ;PROTOTYPE IN SECONDARY POOL ? BLOS 413$ ;IF LOS YES + MOV R1,A.TCB-A.TCBL(R4) ;SET TCB ADDRESS" BR 414$ ;FINISH LOOP IN COMMON=413$: BISB #AS.PRO,A.STAT-A.TCBL(R4) ;INDICATE SEC POOL TCBV0 MOV KISAR6,A.TCB-A.TCBL(R4) ;AND FILL IN BIAS'414$: MOV (R4),R4 ;POINT TO NEXT ADB)  BNE 412$ ;IF NE THERE IS ONE<41$: MOV T.TCBL(R0),T.TCBL(R1) ;UNLINK TASK FROM TASK LIST MOV R0,R4 ;SAVE PCB ADDRESSN) MOV T.PCBV(R0),R0 ;POINT TO PCB VECTORI  BEQ 50$ 00RhhzgM{gfffDATA;IF EQ THERE IS NONE- MOV 2(R0),R1 ;POINT TO FIRST PCB IN VECTOR  TST P.NAM(R1) ;NAMED PCB? BNE 45$ ;IF NE YES/ CMP P.OWN(R1),R4 ;IS THIS TCB USED FOR NAME? BNE 45$ ;IF NE NOA/ MOV $TSKHD,R2 ;POINT TO FIRST INSTALLED TASKR=43$: CMP T.PCBV(R2),R0 ;DOES THIS TASK USE THE PCBV VECTOR?N BEQ 44$ ;IF EQ YES2 MOV T.TCBL(R2),R2 ;POINT TO NEXT INSTALLED TASK) TST T.TCBL(R2) ;POINTING TO NULL TASK?R BNE 43$ ;IF NE NON$ CLR R2 ;POINT P.OWN TO 0 FOR NOW$44$: MOV R2,P.OWN(R1) ;RESET P.OWN145$: DECB 1(R0) ;REDUCE ACCESS COUNT IN VECTOR3 BNE 50$ ;IF NE THERE ARE STILL OTHERS INSTALLED1 MOV (R0),R1 ;ELSE PICK UP NUMBER OF PCB WORDS* MOV 2(R0),R5 ;SAVE ADDRESS OF FIRST PCB$ INC R1 ;INCREMENT FOR FIRST WORD* ASL R1 ;CONVERT TO BYTES TO DEALLOCATE& CALL $DEACB ;DEALLOCATE PCB VECTOR+ MOV R5,R0 ;RESTORE ADDRESS OF FIRST PCB( TST P.NAM(R0) ;RO SECTION OF MU TASK? BNE 50$ ;IF NE NON( CALL $DELRG ;DELETE READ ONLY REGION&50$: MOV R4,R0 ;RESTORE TCB ADDRESS) MOV #T.LGTH,R1 ;SET SIZE TO DEALLOCATEO  CALLR $DEACB ;DEALLOCATE TCB  .DSABL LSB;+C; **-$CLSRF-CLEAR TASK TCB ADDRESS IN ALL RECEIVE BY REF PACKETS.S;F?; THIS ROUTINE WILL SEARCH THE ACTIVE TASK LIST FOR TCBS WITHRD; RECEIVE BY REFERENCE PACKETS WHICH CONTAIN A POINTER TO THE TASK=; BEING REMOVED. IF SUCH A POINTER IS FOUND IT IS CLEARED.S;N ; INPUTS:;E); R0=TCB ADDRESS OF TASK TO BE REMOVED.E;L ; OUTPUTS:;V ; NONE.S;T;-$CLSRF:: ;REFERENCE SYMBOL .IF DF P$$LAS& MOV $TSKHD,R1 ;GET FIRST TCB IN ATL.10$: TSTB T.SRCT(R0) ;ANY OUTSTANDING SREFS? BEQ 40$ ;IF EQ NOP% MOV T.TCBL(R1),-(SP) ;END OF LIST?E BEQ 30$ ;IF EQ YES5 ADD #T.RRFL,R1 ;POINT TO RECEIVE BY REFERENCE LISTH/20$: MOV (R1),R1 ;GET NEXT REC BY REF PACKET. BEQ 30$ ;IF EQ END OF LIST5 CMP 2(R1),R0 ;DOES IT POINT TO TASK BEING REMOVED?E BNE 20$ ;IF NE NOD4 DECB T.SRCT(R0) ;DECREMENT OUTSTANDING SREF COUNT- CLR 2(R1) ;CLEAR POINTER TO EXITTING TASK. .IF DF G$$GEF) MOV R0,-(SP) ;SAVE TCB OF EXITING TASK $ MOV R1,-(SP) ;SAVE PACKET ADDRESS, MOV 6(R1),R3 ;GET EVENT FLAG MASK ADDRESS) CALL $DEAGF ;DEACCESS IF GROUP GLOBALA' MOV (SP)+,R1 ;RESTORE PACKET ADDRESSN, MOV (SP)+,R0 ;RESTORE TCB OF EXITING TASK .ENDC ; DF G$$GEF5 MOV T.NAM(R0),4(R1) ;STORE FIRST HALF OF TASK NAMEB) MOV T.NAM+2(R0),6(R1) ;AND SECOND HALFD BR 20$ ;GO AGAIN430$: MOV (SP)+,R1 ;GET ADDRESS OF NEXT TCB IN LIST BNE 10$ ;IF NE GO AGAIN. .IFTF40$: RETURN ;V .ENDC   ;+I ; **-$DRTHR/$ERTHR-DIRECTIVE ERROR AND GENERAL ERROR THREADING ROUTINES ;LC; THESE ROUTINES ARE USED IN CONJUNCTION WITH THE FOLLOWING ERROR E; RECOVERY ROUTINE TO DYNAMICALLY THREAD ERROR RECOVERY INFORMATIONDA; ONTO THE STACK. AFTER INITIALIZATION, THE INTERFACE IS VIA ABC; COROUTINE CALL (CALL @(SP)+) FOLLOWED BY TWO ROUTINE ADDRESSES.F; THE FIRST ROUTINE IS CALLED AND THEN THE SECOND ROUTINE ADDRESS ISF; PUSHED ONTO THE STACK ALONG WITH THE CONTENTS OF R0 AND R1. IT ISF; INTENDED THAT THE SECOND ROUTINE, ALONG WITH THE SAVED CONTENTS OFC; R0 AND R1, CAN UNDO THE ACTION OF THE FIRST ROUTINE IF AN ERROR J; CONDITION IS ENCOUNTERED LATER. ANOTHER POSSIBILITY IS THAT THE FIRSTJ; ROUTINE IS NULL, AND THE SECOND ROUTINE CAN UNDO SOME PREVIOUS ACTION.G; $DRTHR MAY BE CALLED WHEN THE FINAL DESIRED ACTION ON ERROR WILL BEJ; TO RETURN A DIRECTIVE STATUS PASSED IN R5 (IN THE FORM 'DRSTS D.RSX').J; $ERTHR IS A GENERAL ERROR RECOVERY THREADING ROUTINE. EXAMPLE USES OF4; THESE ROUTINES MAY BE FOUND IN THE MODULE DRSPW.;T ; INPUTS:A;,*; AS REQUIRED FOR CALL TO FIRST ROUTINE. ;R !; OUTPUTS:"; ?#; C-BIT AND R0-R3 ARE PRESERVED FROM RETURN OF FIRST ROUTINE. $; R4 IS DESTROYED.%;-&'( .IF DF P$$OFF) * .ENABL LSB)+$DRTHR::MOV (SP),R4 ;PICK UP RETURN PCE9, MOV #10$,(SP) ;SET AD00Rh%hgccccDRESS OF ROUTINE TO RETURN STATUSS0- CMP -(SP),-(SP) ;ALLOCATE WORDS FOR R0 AND R1*. MOV R4,-(SP) ;RESTORE RETURN PC ADDRESS/01 .IF DF K$$DAS2*3$ERTHR::MOV PS,R2 ;SAVE CURRENT PS WORD-4 BIC #PMODE,PS ;SET PREVIOUS MODE TO KERNEL 5 MOV (SP)+,R4 ;POP CALLING PC*6 MFPI (R4)+ ;PUSH FIRST ROUTINE ADDRESS-7 MFPI (R4)+ ;PUSH RECOVERY ROUTINE ADDRESS48 MOV R2,PS ;RESTORE PS WORD#9 CALL @2(SP) ;CALL FIRST ROUTINE;: MOV (SP)+,(SP) ;MOVE RECOVERY ROUTINE ADDRESS INTO PLACEE;< .IFFR=)>$ERTHR::MOV (SP),R4 ;PICK UP RETURN PCL/? CALL @(R4)+ ;CALL THE FIRST ROUTINE ADDRESSO4@ MOV (R4)+,(SP) ;SAVE THE RECOVERY ROUTINE ADDRESSAB .ENDCCD,E MOV R1,-(SP) ;SAVE CURRENT CONTENTS OF R1,F MOV R0,-(SP) ;SAVE CURRENT CONTENTS OF R0#G CALL (R4) ;CALL THE CALLER BACKRH BR $ERTHR ;DO IT AGAIN;I10$: MOV R5,-(SP) ;PUSH DIRECTIVE STATUS TRAP INSTRUCTION J JMP (SP) ;EXECUTE TRAP K .DSABL LSBLM;+$N; **-$ERREC-ERROR RECOVERY ROUTINEO; BP; THIS ROUTINE IS USED IN CONJUNCTION WITH THE ABOVE ROUTINES TOEQ; EFFECT A SERIES OF SUBROUTINE CALLS STORED ON THE STACK FOR ERRORSER; RECOVERY. THE NORMAL CALLING SEQUENCE IS VIA A JUMP. SUCCESSIVE BS; R0 AND R1 CONTENTS ARE POPPED FROM THE STACK WITH CALLS TO THEFT; SAVED ROUTINE ADDRESSES. THE LAST ROUTINE ON THE STACK MUST FORCEU; THE PROCESS TO STOP.V;E W; INPUTS:TX;N3Y; R5=DIRECTIVE STATUS (IF INITIALIZED BY $DRTHR).Z; [; OUTPUTS:\;- ]; NONE.E^;-_+`$ERREC::TST (SP)+ ;POP COROUTINE ADDRESSO%a10$: MOV (SP)+,R0 ;PICK UP SAVED R0T!b MOV (SP)+,R1 ;PICK UP SAVED R1D*c CALL @(SP)+ ;CALL THE RECOVERY ROUTINE d BR 10$ ;ef;+$g; **-$QUEXT-QUEUE EXIT "AST" BLOCKh; Ci; THIS ROUTINE FILLS IN THE STATUS IN AN OFFSPRING CONTROL BLOCK,N@j; AND QUEUES IT AS A SPECIAL AST BLOCK TO THE PARENT TASK TCB.k; l; INPUTS:Em; n; R0=EXIT STATUS WORD.o; R1=OCB ADDRESS.Tp; R2=TKTN ABORT CODE (BYTE) q;T r; OUTPUTS:s;Et; R3 IS PRESERVED.u;-vw .IFTFx,y$QUEXT:: ;UNCONDITIONALLY DEFINE FOR MCRz{ .IFT(| } MOV R2,-(SP) ;SAVE ABORT CODE~. .IF DF N$$DIR ;IF NAMED DIRECTORY SUPPORT! MOV R1,-(SP) ;SAVE OCB ADDRESSO2 MOV O.STAT+10(R1),R1 ;GET CONTEXT BLOCK POINTER BEQ 5$ ;IF EQ, NONEN% CALL $DLCTX ;DELETE CONTEXT BLOCKO'5$: MOV (SP)+,R1 ;RESTORE OCB POINTERU .ENDC ;DF N$$DIRT0 MOV O.PTCB(R1),R2 ;PICK UP PARENT TCB ADDRESS% BEQ 30$ ;IF EQ PARENT HAS EXITTED* DEC T.RDCT(R2) ;DECREMENT RUNDOWN COUNT5 MOV T.ASTL(R2),(R1) ;LINK OCB TO FRONT OF AST LISTF  BNE 10$ ;R MOV R1,T.ASTL+2(R2) ;10$: MOV R1,T.ASTL(R2) ;3 MOV #AK.OCB,A.CBL(R1) ;SET EXIT "AST" BLOCK FLAG % MOV R0,O.STAT(R1) ;SET EXIT STATUSC0 MOV (SP)+,O.STAT+2(R1) ;PUT ABORT CODE IN OCB& MOV R2,R0 ;COPY PARENT TCB POINTER;+; ** W A R N I N G **E;; SPM HOOKPOINT NUMBER 09.;O+; DO NOT CHANGE THE INSTRUCTION FOLLOWINGB; LABEL WITHOUT CHECKING SPM;--$SPH09==. ;SPM CHANGES THE INSTRUCTION ATA! ;THE LOCATION OF THIS LABELA2 CALL @#$SETCR ;SET CONDITIONAL SCHEDULE REQUEST( MOV T.PCB(R0),R0 ;POINT TO PARENT PCB3 CALLR $NXTSK ;REALLOCATE (AST ENTRY CAN UNSTOP) 130$: MOV R1,R0 ;COPY OCB POINTER TO DEALLOCATEC' TST (SP)+ ;CLEAN STACK (ABORT CODE)B+ MOV #O.LGTH,R1 ;SET LENGTH TO DEALLOCATE  CALLR $DEACB ;DEALLOCATE OCB .ENDC;+; **-$STPCT-STOP CURRENT TASKE; **-$STPTK-STOP TASK;F; THESE ROUTINES ARE CALLED TO STOP A TASK AND REALLOCATE THE TASK'S; PARTITION.; ; INPUTS:#;R7; R0=TCB ADDRESS OF TASK TO STOP (IF ENTRY AT $STPTK)P;T ; OUTPUTS:;L; NONE;-<$STPCT::MOV $TKTCB,R0 ;PICK UP ADDRESS OF CURRENT TASK TCB;$STPTK::BIS #T2.STP,T.ST2(R0) ;SET STOP BIT IN TASK'S TCB .IF DF M$$PRO: BIT #TS.RUN,T.STAT(R0) ;TASK RUNNING ON SOME PROCESSOR? BEQ 10$ ;IF EQ NO$ .IFFR CMP R0,$TKTCB ;TASK RUNNING? BNE 10$ ;IF 00RhhzgM{gfffDATANE NOS .ENDC+ CALL $SETCR ;INSURE THAT TASK WILL STOP.*10$: MOV T.PCB(R0),R0 ;POINT TO TASK PCB( BR $NXTSK ;REALLOCATE TASK PARTITION;+&; **-$RLCPS-RELEASE CHECKPOINT SPACE;:G; THIS ROUTINE RELEASES SPACE IN A CHECKPOINT FILE. IF THE SPECIFIED,A; REGION IS TO BE DELETED, IT ALSO DELETES ANY DISK PCB AND THE; REGION PCB ITSELF.;T ; INPUTS:N; 3; R0=REGION PCB FOR WHICH SPACE IS TO BE DELETED.;P ; OUTPUTS:;N ; NONE.B;-!$RLCPS::SAVNR ;SAVE R4 AND R5C MOV R0,R4 ;COPY PCB POINTERL. MOV P.DPCB(R4),R1 ;POINT TO REGION DISK PCB  BEQ 25$ ;IF EQ THERE IS NONE/ CMP R1,P.MAIN(R1) ;IS THIS A CHECKPOINT PCB?P BEQ 25$ ;IF EQ NOH- CALL $RLPR1 ;RELEASE THE CHECKPOINT SPACE ! MOV R4,-(SP) ;SAVE PCB ADDRESSO8 MOV P.DPCB(R4),R4 ;POINT TO CHECKPOINT ALLOCATION PCB2 MOV P.MAIN(R4),R4 ;POINT TO CHECKPOINT FILE PCB/ TST P.REL(R4) ;CHECKPOINT FILE STILL IN USE?P BEQ 10$ ;IF EQ YES( TST P.SUB(R4) ;CHECKPOINT FILE EMPTY? BNE 10$ ;IF NE NO, MOV #20,R0 ;SET TKTN CODEP% MOV P.UCB(R4),R5 ;PASS UCB ADDRESS& CALL $DVMSG ;QUEUE MESSAGE TO TKTN/10$: MOV (SP)+,R4 ;RESTORE REGION PCB ADDRESSQ' MOV P.DPCB(R4),R0 ;POINT TO DISK PCBE120$: CLR P.DPCB(R4) ;CLEAR OUT DISK PCB POINTERD+ MOV #P.DLGH,R1 ;SET LENGTH TO DEALLOCATEO$ CALL $DEACB ;DEALLOCATE DISK PCB;25$: BIT #PS.DEL,P.STAT(R4) ;IS REGION MARKED FOR DELETE?T BEQ 30$ ;IF EQ NO( TST P.ATT(R4) ;ANYONE STILL ATTACHED? BNE 30$ ;IF NE YES' MOV P.DPCB(R4),R0 ;POINT TO DISK PCB  BNE 20$ ;IF NE THERE IS ONEP2 MOV R4,R0 ;COPY MAIN PCB POINTER TO DEALLOCATE+ MOV #P.LGTH,R1 ;SET LENGTH TO DEALLOCATE  CALL $DEACB ;DEALLOCATE PCBO30$: RETURN ;;+$; **-$RLPAR-RELEASE TASK PARTITION; **-$RLPR1-RELEASE PARTITIONO;LJ; THIS ROUTINE IS CALLED TO RELEASE SPACE IN A PARTITION OWNED BY A TASKD ; AND TO ATTEMPT TO REALLOCATE THE PARTITION IF THE WAIT QUEUE FOR ; THE PARTITION IS NONEMPTY. ;$ ; INPUTS: ;V@; R0=ADDRESS OF THE TCB OF THE OWNER TASK (IF ENTRY AT $RLPAR)?; R1=ADDR OF SUBPARTITION PCB TO RELEASE (IF ENTRY AT $RLPR1).;R ; OUTPUTS:;AB; THE SPACE IS RELEASED AND AN ATTEMPT IS MADE TO REASSIGN SPACE?; IN THE PARTITION TO THE NEXT HIGHEST PRIORITY CONTENDER(S). ;-8$RLPAR::MOV T.PCB(R0),R1 ;GET ADDRESS OF PARTITION PCB1$RLPR1::MOV P.MAIN(R1),R0 ;GET MAIN PCB ADDRESSL' MOV R0,R3 ;SAVE POINTER TO MAIN PCBR/10$: MOV R0,R2 ;SAVE ADDRESS OF PREVIOUS PCBS, MOV P.SUB(R2),R0 ;GET ADDRESS OF NEXT PCB CMP R0,R1 ;TASK PCB? BNE 10$ ;IF NE NOA0 MOV P.SUB(R0),P.SUB(R2) ;REMOVE PCB FROM LIST. TST P.MAIN(R3) ;RELEASING CHECKPOINT SPACE? ! BNE 20$ ;IF NE NOE " RETURNE#20$:$;+%; ** W A R N I N G **E&;I'; SPM HOOKPOINT NUMBER 15.(;R+); DO NOT CHANGE THE INSTRUCTION FOLLOWINGI*; LABEL WITHOUT CHECKING SPM+;-,--$SPH15==. ;SPM CHANGES THE INSTRUCTION ATO!. ;THE LOCATION OF THIS LABEL /0"1 NOP ;DROP THROUGH TO $NXTSK TO'2 NOP ; REALLOCATE RELEASED PARTITION 3456;++7; **-$NXTSK-ASSIGN NEXT TASK TO PARTITION;8;EH9; THIS ROUTINE IS CALLED TO ASSIGN SPACE IN A PARTITION TO THE HIGHEST8:; PRIORITY CONTENDERS WAITING TO OCCUPY THE PARTITION.;;G <; INPUTS:=; B>; R0=ADDRESS OF THE PCB OF THE MAIN PARTITION, OR A SUBPARTITION<?; PCB WITHIN THE MAIN PARTITION IN WHICH TO ASSIGN SPACE.@;C A; OUTPUTS:B;IBC; THIS ROUTINE ATTEMPTS TO ASSIGN SPACE IN THE MAIN PARTITION IN%D; AS MANY AS FOUR STEPS AS FOLLOWS:EE;ACF; 1. IT FIRST DETERMINES IF THERE ARE ANY ELIGIBLE CONTENDERSA<G; IN THE PARTITION WAIT QUEUE. THE ONLY CONTENDERS WHICH=H; CAN BE IN THE WAIT QUEUE WHICH ARE NOT ELIGIBLE ARE TASKO<I; PARTITIONS WHICH ARE NOT MAPPED BY OTHER RESIDENT TASKS<J; AND FOR WHICH THE CORRESPONDING TASK IS STOPPED WITH NOK; PENDING AST QUEUE ENTRIES.CL;A<M; 2. IF THERE IS AN ELIGIBLE CONTENDER FOR MEMORY, THE;N; ROUTINE A00Rh%hgccccTTEMPTS TO ASSIGN SPACE TO THE CONTENDER FROMF#O; SPACE WHICH IS CURRENTLY FREE. P; AQ; 3. IF THERE IS CURRENTLY INSUFFICIENT FREE SPACE TO BRING 5R; IN THE CONTENDER, AN ATTEMPT IS MADE TO CREATE AC8S; CONTIGUOUS FREE SPACE LARGE ENOUGH BY CHECKPOINTING;T; ONE OR MORE OF THE CURRENT RESIDENTS OF THE PARTITION.<U; (NOTE THAT DURING THIS STEP THE DECISION MAY BE MADE TO<V; CHECKPOINT A REGION FOR WHICH CHECKPOINTING HAS ALREADY<W; BEEN INITIATED. THIS IS ACCEPTABLE SINCE AN ATTEMPT TO:X; INITIATE CHECKPOINTING A SECOND TIME IS EFFECTIVELY A Y; NOP.)Z;B[; 4. IF SUFFICIENT SPACE CANNOT BE CREATED BY CHECKPOINTING,\; THE SHUFFLER IS ACTIVATED.T];-^ _$NXTSK::`a .IF DF R$$PROb;c TST $NXTLK ;NXTSK LOCK SET? (NEEDED TO MAINTAIN CONTEXT d ;DURING CHECKPOINTS)!e BEQ 5$ ;IF EQ NO, OK TO ENTERIf RETURN ;LEAVE NOWg5$: hi .ENDC ;R$$PROjk SAVNR ;SAVE R4 AND R54l MOV P.MAIN(R0),R5 ;GET MAIN PARTITION PCB ADDRESS4m10$: MOV P.WAIT(R5),R4 ;GET FIRST PCB IN WAIT LIST#n20$: BEQ 100$ ;IF EQ END OF LIST8o TSTB P.RMCT(R4) ;ARE THERE ANY RESIDENT MAPPED TASKS?+p BNE 40$ ;IF NE YES, ATTEMPT TO BRING IND:q MOV P.TCB(R4),R0 ;GET TCB ADDR (TASK PART. IF P.RMCT=0)8r BIT #TS.STP,T.STAT(R0) ;TASK BLOCKED BY BLOCK COMMANDs BNE 30$ ;IF NE YES, SKIP IT 't BIT #T2.STP,T.ST2(R0) ;TASK STOPPED?Au BEQ 40$ ;IF EQ NO..v TST T.ASTL(R0) ;BUT ARE THERE PENDING ASTS?w BNE 40$ ;IF NE YES3x30$: MOV (R4),R4 ;POINT TO NEXT PCB IN WAIT LIST;y BR 20$ ;GO AGAIN:z40$: BIT #PS.CSA,P.STAT(R4) ;CHECKPOINT SPACE ALLOCATED?&{ BNE 100$ ;IF NE, YES - JUST RETURN8| CALL $FNDSP ;ATTEMPT TO ALLOCATE SPACE IN MAIN PART./} BCS 50$ ;IF CS NO SPACE CURRENTLY AVAILABLE$~ MOV R5,R0 ;COPY MAIN PCB ADDRESS/ ADD #P.WAIT,R0 ;POINT TO WAIT QUEUE LISTHEADI, MOV R4,R1 ;COPY ADDRESS OF PCB TO REMOVE .IF DF R$$PRO* MOV P.REL(R4),$NXTBA ;SET BASE TO BIAS> ADD P.SIZE(R4),$NXTBA ;FOLLOWING LAST SUCCESSFUL ALLOCATION .ENDC5 CALL $QRMVA ;REMOVE PCB FROM WAIT QUEUE ;JWB167K1 CALL $LOADT ;PLACE IT IN LOADER QUEUE ;**-1J, TALLY$ B.RLOD,XA$$TL ;COUNT A REGION LOAD BR 10$ ;TRY TO LOAD ANOTHERS;PK; ATTEMPT TO CREATE A CONTIGUOUS FREE SPACE LARGE ENOUGH BY CHECKPOINTINGTI; ONE OR MORE TASKS/COMMONS. ON P/OS, START LOOKING FOR THIS CONTIGUOUSEL; FREE SPACE FOLLOWING THE LAST SUCCESSFUL LOAD. THIS AVOIDS THE THRASHINGH; STATE WHEREBY A TASK IS MAPPING AND UNMAPPING FROM VARIOUS CLUSTEREDL; LIBRARIES WHICH CHECKPOINT EACH OTHER AS A CONSEQUENCE OF HAVING NO FREE=; SPACE DUE TO A RESIDENT UNMAPPED COMMON(S) HIGHER IN GEN. ;T50$: .IF DF R$$PRO& TST $NXTLK ;JUST STARTING TO LOOK?7 BNE 53$ ;IF NE NO, WRAP BACK TO BOTTOM OF PARTITIONT6 INC $NXTLK ;LOCK $NXTSK TO PREVENT LOSS OF CONTEXT' ;VIA RECURSIVE CALL OUT OF $ICHKPO+ MOV P.SUB(R5),R1 ;GET FIRST SUBPARTITIONE MOV R1,R5 ;SET UP PREVIOUS852$: CMP P.REL(R1),$NXTBA ;ABOVE LAST SUCCESSFUL LOAD? BHIS 65$ ;IF HIS YES MOV R1,R5 ;UPDATE PREVIOUS/ MOV P.SUB(R1),R1 ;POINT TO NEXT SUBPARTITIONP BNE 52$ ;TRY AGIAN453$: INC $NXTLK ;INDICATE FULL BOTTOM TO TOP PASS0 MOV P.MAIN(R4),R5 ;SET UP POINTER TO MAIN PCB .ENDC ;R$$PRO& CLR R3 ;INIT BASE OF HOLE REGISTER4 MOV R5,R1 ;COPY MAIN PCB PTR LEAVING PTR TO PREV/55$: ADD P.REL(R5),R3 ;CALCULATE BASE OF HOLER760$: MOV P.SUB(R1),R1 ;POINT TO NEXT SUBPARTITION PCBC. BEQ 110$ ;IF EQ NONE, FAILED TO CHECKPOINT065$: CALL $TSTCP ;CAN WAITING PCB CHECKPOINT? BCC 70$ ;IF CC YES- MOV R1,R5 ;UPDATE POINTER TO PREVIOUS PCB 0 MOV P.SIZE(R5),R3 ;INIT BASE OF HOLE REGISTER BR 55$ ;TRY AGAINP'70$: CLR R0 ;INITIALIZE SIZE OF HOLE1 MOV P.SUB(R1),R2 ;POINT TO NEXT PCB AFTER HOLEH BNE 80$ ;IF NE THERE IS ONE , MOV P.MAIN(R1),R2 ;ELSE POINT TO MAIN PCB0 ADD P.SIZE(R2),R0 ;CALCULATE END OF PARTITION980$: ADD P.REL(R2),R0 ;CALCULATE ADDRESS OF TOP OF HOLE;% SUB00RhhzgM{gfffDATA R3,R0 ;CALCULATE SIZE OF HOLE:- CMP R0,P.SIZE(R4) ;IS THE HOLE BIG ENOUGH?B BLO 60$ ;IF LO NOM> BIS #PS.CSA,P.STAT(R4) ;INDICATE CHECKPOINT SPACE ALLOCATED' MOV R4,-(SP) ;SAVE PCB IN WAIT QUEUE;* MOV R1,R4 ;MARK LAST PCB TO CHECKPOINT890$: MOV P.SUB(R5),R5 ;POINT TO NEXT PCB TO CHECKPOINT MOV R5,R1 ;COPY ITS ADDRESSN$ CALL $ICHKP ;INITIATE CHECKPOINT" CMP R5,R4 ;MORE TO CHECKPOINT? BNE 90$ ;IF NE YES, MOV (SP)+,R4 ;RESTORE PCB OF WAITING TASK6 BIC #PS.CSA,P.STAT(R4) ;INDICATE CHECKPOINT IS DONE100$:, .IF DF R$$PRO! CLR $NXTLK ;CLEAR $NXTSK LOCK .ENDC ;R$$PRO  RETURN ;P110$:L .IF DF R$$PRO6 CMP $NXTLK,#1 ;WRAP BACK TO BEGINNING OF PARTITION? BNE 100$ ;IF NE NO  BR 53$ ; .ENDC1 MOV $SHFPT,R0 ;PICK UP ADDRESS OF SHUFFLER TCBC* BEQ 100$ ;IF EQ SHUFFLER NOT INSTALLED, TST $SHFTM ;CAN WE REQUEST THE SHUFFER ?- BNE 100$ ;NO, WAIT FOR NEXT TIME INTERVALK9 BIT #TS.EXE,T.STAT(R0) ;YES, SHUFFLER ALREADY ACTIVE ? BEQ 100$ ;IF EQ, YES, EXIT .IF DF A$$CNT) MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING  MOV $SABPT,KISAR6 ;MAP SABD* BEQ 130$ ;IF EQ, ACCOUNTING NOT ACTIVE4 BIT #BF.LSS,$ACNFE ;SYSTEM ACCOUNTING TURNED ON ? BEQ 130$ ;NO, IF EQ.0 ADD #1,@#B.SHF+140002 ;COUNT SHUFFLER STARTUP ADC @#B.SHF+140000 ;H)130$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGE .ENDC1 CALLR $EXRQN ;REQUEST THE SHUFFLER AND RETURN;+:;**-$TSPAR-TEST IF PARTITION IS IN MEMORY FOR KERNEL AST;YB; THIS ROUTINE IS CALLED TO CHECK A REGION FOR MEMEORY RESIDENCEA; TO DETERMINE IF IT IS SAFE TO SERVICE A KERNEL AST (E.G. COPY,?; A BUFFER) INTO THE REGION. IF THE REGION IS CHECKPOINTED ORTB; CURRENTLY BEING CHECKPOINTED, THEN A REGION LOAD AST IS QUEUED3; AND THE REGION IS ACCESSED ON THE TASKS BEHALF. ;S ; INPUTS:E(; R0=ADDRESS OF PACKET PEING PROCESSED; R1=PCB ADDRESS OF REGION%; R5=TCB ADDRESS OF ASSOCIATED TASKT;T ; OUTPUTS:$; C=0 IF REGION IS MEMORY RESIDENT>; C=1 IF REGION IS NON-RESIDENT. IN THIS CASE THE REGION AST; HAS BEEN QUEUED, ETC.A;- + $TSPAR::CLC ;ASSUME REGION IS IN MEMORYN4  BIT #PS.CKP!PS.OUT,P.STAT(R1) ;REGION IN MEMORY ?  BNE 10$ ;IF NE NOI  RETURN ;G310$: BIT #PS.AST,P.STAT(R1) ;ALREADY A LOAD AST ?D BNE 20$ ;IF NE YES3 BIS #PS.AST,P.STAT(R1) ;INDICATE LOAD AST QUEUEDO, CLR P.SWSZ(R1) ;USE P.SWSZ FOR A LISTHEAD720$: MOV P.SWSZ(R1),(R0) ;LINK NEXT BLOCK TO THIS ONE=4 MOV R0,P.SWSZ(R1) ;AND SET THIS ONE FIRST IN LIST! MOV R0,-(SP) ;SAVE TCB ADDRESSN MOV R5,R0 ;COPY TCB ADDRESSC" CALL $ACCRG ;ACCESS THE REGION' MOV (SP)+,R0 ;RESTORE PACKET ADDRESS. SEC ;INDICATE AST QUEUEDY  RETURN ; ;+; **-$ACCRG-ACCESS REGION##; **-$ALTRG-ALTER REGION PRIORITY ;C; EFFECT THE ACCESS OF A NEW RESIDENT MAPPED TASK TO A REGION ANDE0 ; OPTIONALLY ALTER THE PRIORITY OF THE REGION.!;0 "; INPUTS:(#;R+$; R0=TCB ADDRESS OF RESIDENT MAPPED TASK..%; R1=PCB ADDRESS OF REGION.T&;I '; OUTPUTS:(; ); NONE.D*;-+ , .ENABL LSBP7-$ACCRG::MOV T.PCB(R0),R2 ;PICK UP TASK REGION PCB PTRV%. CMP R1,R2 ;ACCESSING TASK REGION?S-/ BEQ 4$ ;IF EQ YES, DON'T INCREMENT P.RMCT012 .IF DF M$$PRO3?4 BIS P.RRM(R1),T.RRM(R0) ;INCLUDE REGION AFFINITY IN TASK AFFA56 .ENDC78/9 BIT #PS.OUT,P.STAT(R2) ;TASK OUT OF MEMORY ?T': BNE 3$ ;IF NE YES, OK TO INC P.RMCT /; BIT #PS.CKP,P.STAT(R2) ;BEING CHECKPOINTED ?P*< BNE 43$ ;IF NE YES, DON'T TOUCH P.RMCT5=3$: INCB P.RMCT(R1) ;INC RESIDENT MAPPED TASK COUNTB?>4$: BIT #PS.CKP,P.STAT(R2) ;IS THIS A CHECKPOINT READ ACCESS?/? BNE $ALTRG ;IF NE YES, SKIP BLOCKING CHECKS @43$: ;REFERENCE LABEL6A BIT #PS.OUT!PS.CKP,P.STAT(R1) ;IS REGION IN MEMORY?B BEQ 5$ ;IF EQ YESI%C INC T.STAT(R0) ;BLOCK MAPPING TASK D BR 6$ ;T<E5$: BIT #PS.CKR,P.STAT(R1) ;IS THERE A CHECKPOINT REQUEST?F BEQ 6$ ;IF EQ NO-G BIS #TS00Ri%hgcccc.CIP,T.STAT(R0) ;BLOCK MAPPING TASK "H6$: MOV R1,R2 ;SAVE PCB ADDRESSIJK .IF DF M$$PROL<M BIT #TS.RUN,T.STAT(R0) ;IS THE TASK RUNNING ON SOME PROC?N BEQ 7$ ;NO IF EQOP .IFFEQ+R CMP R0,$TKTCB ;IS THIS THE CURRENT TASK?ES BNE 7$ ;NO IF NETU .ENDCVW2X CALL $SETCR ;SET SCHEDULE REQUEST TO STOP TASK%Y7$: MOV R2,R1 ;RESTORE PCB ADDRESSO2Z$ALTRG::MOVB T.PRI(R0),R2 ;PICK UP TASK PRIORITY/[ CMP R1,T.PCB(R0) ;ALTERING TASKS OWN REGION?6\ BNE 10$ ;IF NE NOS6] TSTB P.RMCT(R1) ;OTHER TASKS MAPPED TO TASK REGION?^ BEQ 15$ ;IF EQ NO_;.<`; THIS SECTION INSURES THAT THE PRIORITY OF A NON-RESIDENT9a; NON-MAPPED REGION STAYS AT ZERO WHEN ALTERED. THIS IS=b; NECESSARY TO INSURE THAT ZERO MAP COUNT COMMONS DON'T GETE=c; PUT IN THE PAR. WAIT QUEUE, AND TO INSURE THAT THE REGIONO>d; WILL GET LOADED WHEN IT IS MAPPED BY SOME TASKS. NOTE THAT<e; IF THE PRIORITY IS NOT ALTERED UPWARD, THE REGION IS NOT>f; LOADED. ALSO NOTE THAT THE NEXT TEST WILL NEVER BRANCH FOR5g; TASK REGIONS, SINCE WE JUST CHECKED P.RMCT ABOVE. h;Q8i10$: TSTB P.RMCT(R1) ;ANY TASK MAPPED TO THIS REGION ?,j BEQ 30$ ;IF EQ NO - DON'T TOUCH PRIORITY*k INCB R2 ;INCREMENT FOR COMMON PRIORITY-l CMPB R2,P.PRI(R1) ;IS NEW PRIORITY HIGHER?Em BLOS 30$ ;IF LOS NOT3n15$: MOVB R2,P.PRI(R1) ;STORE NEW REGION PRIORITYL:o$LDREG::BIT #PS.OUT,P.STAT(R1) ;IS THE REGION IN MEMORY?p BEQ 30$ ;IF EQ YES1q CMP R1,$LDPCB ;IS LOADER CURRENTLY LOADING IT?Hr BEQ 30$ ;IF EQ YES%s MOV $LDRPT,R0 ;POINT TO LOADER TCB 2t ADD #T.RCVL,R0 ;POINT TO LOADER'S RECEIVE QUEUE8t CALL $QRMVA ;SEE IF PCB IS IN LOADER QUEUE ;JWB167v BCS 20$ ;IF CS NO ;**-1!w CALL $QINSP ;ELSE PUT IT BACKO x BR 30$ ;y20$:z;+{; ** W A R N I N G **|;O}; SPM HOOKPOINT NUMBER 06.~;P+; DO NOT CHANGE THE INSTRUCTION FOLLOWINGG; LABEL WITHOUT CHECKING SPM;--$SPH06==. ;SPM CHANGES THE INSTRUCTION ATP! ;THE LOCATION OF THIS LABELH' MOV P.MAIN(R1),R0 ;POINT TO MAIN PCB / ADD #P.WAIT,R0 ;POINT TO WAIT QUEUE LISTHEADR@ CALL $QRMVA ;REMOVE FROM CURRENT POSITION (IF THERE) ;JWB1677 CALL $QINSP ;INSERT IN PARTITION WAIT QUEUE ;**-1E-25$: MOV R1,R0 ;SET PCB ADDRESS FOR $NXTSK* CALL $NXTSK ;REALLOCATE MAIN PARTITION30$: RETURN ;P;+; **-$DEARG-DEACCESS REGIONW;G; THIS ROUTINE DEACCESSES A MAPPED TASK FROM A REGION AND REALLOCATESI>; ITS MAIN PARTITION IF THE REGION HAS NO MORE MAPPED TASKS.;M ; INPUTS:O;O&; R0=TCB ADDRESS OF DEACCESSING TASK; R1=PCB OF REGION TO DEACESS ;A ; OUTPUTS:;E ; NONE. ;-9$DEARG::TSTB T.IOC(R0) ;DOES TASK HAVE OUTSTANDING I/O?  BEQ 35$ ;IF EQ NO00 BIS #T3.MPC,T.ST3(R0) ;SET MAPPING CHANGE BIT>35$: BIT #PS.CKR,P.STAT(R1) ;CHECKPOINT REQUEST THIS REGION? BEQ 40$ ;IF EQ NO7 BIC #PS.CKR,P.STAT(R1) ;CLEAR CHECKPOINT REQUEST BITG MOV R1,-(SP) ;SAVE REGISTERSN MOV R0,-(SP) ;E/ CALL $ICHKP ;ATTEMPT TO INITIATE CHECKPOINTO" MOV (SP)+,R0 ;RESTORE REGISTERS MOV (SP)+,R1 ;P%40$: CMP R1,T.PCB(R0) ;TASK REGION?P BNE 45$ ;NO IF NE3 TST @P.ATT(R1) ;OTHER ATTACHES TO TASK'S REGION?T% BEQ 30$ ;IF EQ NO, SAVE SOME TIME4 INCB P.RMCT(R1) ;INSURE NO MODIFICATION OF P.RMCT:45$: DECB P.RMCT(R1) ;DEC COUNT OF RESIDENT MAPPED TASKS) BNE 30$ ;IF NE THERE ARE STILL OTHERSA( CLRB P.PRI(R1) ;ASSUME IT IS A COMMON* BIT #PS.COM,P.STAT(R1) ;IS IT A COMMON? BEQ 47$ ;IF EQ NOA2 BIT #PS.OUT,P.STAT(R1) ;REGION OUT OF MEMEORY ?- BEQ 50$ ; IF EQ NO - REALLOCATE PARTITIONR) MOV R0,-(SP) ;SAVE TCB ADDRESS OF TASK + MOV R1,-(SP) ;SAVE PCB ADDRESS OF REGIONT4 MOV P.MAIN(R1),R0 ;POINT TO REGION MAIN PARTITION/ ADD #P.WAIT,R0 ;POINT TO WAIT QUEUE LISTHEAD.5 CALL $QRMVA ;REMOVE FROM QUEUE IF THERE ;JWB167P- MOV (SP)+,R1 ;RESTORE PCB ADDRESS ;**-1H  MOV (SP)+,R0 ;AND TCB ADDRESS' BCS 46$ ;IF CS WASN'T IN WAIT QUEUEI3 BIC #PS.CKR,P.STAT(R1) ;CLEAR CHECKPOINT REQUESTT00RiRqmzgM{gfffDATA46$: RETURN ; *47$: MOV P.TCB(R1),R0 ;POINT TO TASK TCB7 MOVB T.PRI(R0),P.PRI(R1) ;THEN SET TO TASK PRIORITYF#50$: MOV R1,R0 ;COPY PCB ADDRESSR6 CALLR $NXTSK ;REALLOCATE MAIN PARTITION AND RETURN  .DSABL LSB;+$; **-$FNDSP-FIND SPACE IN PCB LIST;LG; THIS ROUTINE IS CALLED TO FIND SPACE WITHIN A DYNAMICALLY ALLOCATEDEE; PCB LIST REPRESENTING THE ALLOCATION STATE OF A SYSTEM CONTROLLEDI); PARTITION OR DYNAMIC CHECKPOINT FILE.P;( ; INPUTS:E;N'; R4=ADDRESS OF PCB TO FIND SPACE FORV9; R5=ADDRESS OF MAIN PCB FOR SPACE IN WHICH TO ALLOCATE1;E ; OUTPUTS:;R$; C=0 IF ALLOCATION WAS SUCCESSFUL+; SUB PCB IS LINKED INTO ALLOCATION LISTT; C=1 IF ALLOCATION FAILURE;; R0,R1,R2 ARE MODIFIED.;-.$FNDSP::MOV R5,R0 ;COPY ADDRESS OF MAIN PCB: MOV P.REL(R5),R2 ;SET HIGHEST ADDRESS IN LAST PARTITION010$: MOV P.SUB(R0),R1 ;GET ADDRESS OF NEXT PCB BEQ 20$ ;IF EQ END OF LIST. MOV P.REL(R1),-(SP) ;CALCULATE SIZE OF HOLE SUB R2,(SP) ;P) CMP (SP)+,P.SIZE(R4) ;HOLE BIG ENOUGH?A BHIS 30$ ;IF HIS YES+ MOV R1,R0 ;SAVE ADDRESS OF PREVIOUS PCBO8 MOV P.REL(R1),R2 ;CALCULATE BASE ADDRESS OF NEXT HOLE ADD P.SIZE(R1),R2 ;  BR 10$ ;720$: MOV P.REL(R5),-(SP) ;CALCULATE SIZE OF LAST HOLE  ADD P.SIZE(R5),(SP) ; SUB R2,(SP) ;L) CMP (SP)+,P.SIZE(R4) ;HOLE BIG ENOUGH?I BLO 40$ ;IF LO NO)630$: MOV R2,P.REL(R4) ;SET ADDRESS OF TASK PARTITION9 MOV R4,P.SUB(R0) ;LINK ALLOCATED PARTITION TO PREVIOUSB* MOV R1,P.SUB(R4) ;LINK NEXT TO TASK PCB40$: RETURN ;I;+4; **-$TSTCP-TEST IF CHECKPOINT SHOULD BE INITIATED;M ; INPUTS:R;L; R1=ADDRESS OF RESIDENT PCB ; R4=ADDRESS OF CONTENDING PCB; ; OUTPUTS:;)*; C=0 IF CHECKPOINT SHOULD BE INITIATED..; C=1 IF CHECKPOINT SHOULD NOT BE INITIATED.;P"; R1,R3,R4 AND R5 ARE PRESERVED. ;- ? $TSTCP::BIT #PS.CHK!PS.FXD,P.STAT(R1) ;IS PCB CHECKPOINTABLE? BNE 30$ ;IF NE NO 8 TSTB P.RMCT(R1) ;BUT ARE THERE RESIDENT MAPPED TASKS?) BNE 30$ ;IF NE YES, CANNOT CHECKPOINT; BIT #PS.COM,P.STAT(R1) ;IS IT AN UNMAPPED COMMON REGION?! BNE 40$ ;IF NE YES, IT CAN GOE: MOV P.TCB(R1),R2 ;AT THIS POINT MUST BE A TASK, GET TCB* BIT #T2.HLT,T.ST2(R2) ;IS TASK EXITING?) BNE 30$ ;IF NE YES, CANNOT CHECKPOINTH. BIT #T2.STP,T.ST2(R2) ;IS THE TASK STOPPED? BEQ 10$ ;IF EQ NO0 TST T.ASTL(R2) ;BUT DOES IT HAVE PENDING AST?  BEQ 40$ ;IF EQ NO, IT CAN GO9 10$: BIT #TS.STP,T.STAT(R2) ;BLOCKED BY MCR BLOCK CMD ? ! BNE 40$ ;IF NE YES, IT CAN GON   .IF DF S$$WPC * MOV $SWPR,R0 ;ASSUME TASK NOT IN MEMORY8 BIT #PS.CKP!PS.CKR!PS.OUT,P.STAT(R1) ;TASK IN MEMORY? BNE 15$ ;IF NE NOE  .IF DF X$$HDR 7 MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING FOR XTRNL HDRS( MOV P.HDR(R1),R0 ;SAVE HEADER POINTER" BNE 12$ ;IF NE INTERNAL HEADER/ MOV P.REL(R1),KISAR6 ;MAP TO EXTERNAL HEADERV2 MOV #140000,R0 ;RESET VIRTUAL ADDRESS OF HEADER 12$: ;REFERENCE LABEL! " .IFF ; DF X$$HDR # /$ MOV P.HDR(R1),R0 ;GET ADDRESS OF TASK HEADERF% & .ENDC ; DF X$$HDR' 8( MOVB H.SPRI(R0),R0 ;PICK UP CURRENT SWAPPING PRIORITY) * .IF DF X$$HDR+ 2, MOV (SP)+,KISAR6 ;RESTORE PREVIOUS EXEC MAPPING- . .ENDC ; DF X$$HDR/ 00 15$: CLR -(SP) ;EXTRACT TASK PRIORITY AS WORD1 BISB T.PRI(R2),(SP) ;72 ADD (SP)+,R0 ;ADD TASK PRIORITY TO SWAPPING PRIORITYM03 BMI 40$ ;IF MI WAITING TASK IS ALWAYS HIGHER+4 ;EFFECTIVE PRIORITY AND CAN THEREFOREE5 ;CHECKPOINT 76 BIT #PS.COM,P.STAT(R4) ;IS WAITING PCB FOR A COMMON?K7 BEQ 20$ ;IF EQ NO;-8 INC R0 ;PRIORITY OF WAITING COMMON IS + 1C19 20$: CLR R2 ;INIT REGISTER TO EXTRACT PRIORITY8: BISB P.PRI(R4),R2 ;EXTRACT PRIORITY OF CONTENDING PCB*; CMP R2,R0 ;CAN WAITING PCB CHECKPOINT?< CLC ;ASSUME YES= BGT 40$ ;IF GT YES> ? .IFFA@ 4A MOVB T.PRI(R2),R0 ;PICK UP RESIDENT TASK PRIORITY7B BIT #PS.COM,P.STAT(R4) ;IS WAITING PCB FOR A COMMON?CC BEQ 20$ ;IF EQ NOH-D INC R0 ;00Rrm%hgccccPRIORITY OF WAITING COMMON IS + 1S5E 20$: CMPB P.PRI(R4),R0 ;CAN WAITING PCB CHECKPOINT? F BHI 40$ ;IF HI YESG H .ENDCI J "K 30$: SEC ;SET CARRY FOR RETURNL 40$: RETURN ;RM N ;+!O ; **-$ICHKP-INITIATE CHECKPOINTOP ;TJQ ; THIS ROUTINE INITIATES THE CHECKPOINT OF THE SPECIFIED REGION. IT MAYER ; BE CALLED ANY TIME REGARDLESS OF THE STATE OF ANY MAPPED TASKS ORUS ; OUTSTANDING I/O.T ; U ; INPUTS:PV ;(BW ; R1=ADDR OF PCB OF REGION FOR WHICH TO INITIATE THE CHECKPOINT.X ;R Y ; OUTPUTS:Z ;OC[ ; THIS ROUTINE TAKES ONE OF THE FOLLOWING THREE ACTIONS DEPENDING'\ ; ON THE CURRENT STATE OF THE REGION.] ; ?^ ; 1. IF THE REGION IS ALREADY BEING CHECKPOINTED, THEN NO _ ; ACTION IS TAKEN.E` ;NCa ; 2. IF THE REGION IS CURRENTLY BEING LOADED, OR THERE IS I/OR;b ; GOING INTO THE REGION, OR A TASK MAPPING THE REGION ISE<c ; RUNNING ON ANOTHER PROCESSOR, THEN A CHECKPOINT REQUEST;d ; IS POSTED FOR THE REGION TO BE HONORED WHEN THE CONDI-Ee ; TION IS REMOVED.f ;UCg ; 3. IF NONE OF THE ABOVE CONDITIONS ARE TRUE THEN AN ATTEMPTN2h ; IS MADE TO CHECKPOINT THE REGION IMMEDIATELY.i ; >j ; IF AN ATTEMPT IS TO BE MADE TO CHECKPOINT THE REGION, THISk ; OCCURS AS FOLLOWS:l ;Bm ; 1. IF THE REGION IS A READ-ONLY INSTALLED REGION, THEN ITS<n ; SPACE IS SIMPLY DEALLOCATED BY THE LOADER. (HAVING THE=o ; LOADER DO THE DEALLOCATION SOLVES A PROBLEM OF UNLIMITEDQp ; RECURSION BACK TO $NXTSK.)Oq ;BBr ; 2. IF THE REGION IS A READ-WRITE INSTALLED REGION, THEN IT+s ; IS CHECKPOINTED BACK TO ITS OWN IMAGE.Nt ;T@u ; 3. FOR ALL OTHER REGIONS, AN ATTEMPT IS MADE TO ALLOCATE7v ; SPACE IN A CHECKPOINT FILE. IF THIS FAILS AND THE ;w ; REGION CONTAINS A TASK WITH CHECKPOINT SPACE ALLOCATEDI<x ; IN ITS CHECKPOINT FILE, THEN THIS SPACE IS USED. OTHER-0y ; WISE TKTN IS REQUESTED TO REPORT THE ERROR.z ;OC{ ; IN ANY CASE, IF THE CHECKPOINT CAN OCCUR, THE FIRST STATUS WORD B| ; OF ALL TASKS MAPPED TO THE REGION IS INCREMENTED TO BLOCK THEM>} ; FROM FURTHER EXECUTION UNTIL THE REGION RETURNS TO MEMORY.~ ;- @ $ICHKP::BIT #PS.OUT,P.STAT(R1) ;REGION CURRENTLY BEING LOADED? BEQ 5$ ;IF EQ NO4 BIS #PS.CKR,P.STAT(R1) ;POST A CHECKPOINT REQUEST BR 70$ ;RETURNB 5$: BIT #PS.CKP,P.STAT(R1) ;IS THE REGION ALREADY CHECKPOINTING?* BNE 70$ ;IF NE YES, NO ACTION REQUIRED MOV R1,R3 ;COPY PCB ADDRESSN2 TSTB P.IOC(R3) ;ANY I/O IN PROGRESS TO REGION ? BEQ 7$ ;IF EQ NO9 BIS #PS.CKR,P.STAT(R3) ;YES, CAN ONLY POST REQUEST NOW < 7$: MOV P.ATT(R3),R2 ;POINT TO FIRST ATTACHMENT DESCRIPTOR BEQ 36$ ;IF EQ THERE IS NONE5 20$: TSTB A.MPCT(R2) ;IS THIS ATTACHED TASK MAPPED?F BEQ 35$ ;IF EQ NOP/ MOV A.TCB(R2),R0 ;PICK UP TCB OF MAPPED TASK;+ CMP R0,$TKTCB ;IS THIS THE CURRENT TASK?R   .IF DF M$$PRO  BEQ 25$ ;IF EQ YES< BIT #TS.RUN,T.STAT(R0) ;IS THE TASK RUNNING ON SOME PROC? BEQ 30$ ;IF EQ NOR6 BIS #TS.CKR,T.STAT(R0) ;NOTE THE CHECKPOINT REQUEST4 BIS #PS.CKR,P.STAT(R3) ;POST A CHECKPOINT REQUEST  .IFF2  BNE 30$ ;IF NE NO   .ENDC  ' 25$: CALL $SETCR ;FORCE RESCHEDULINGT@ 30$: BIS #TS.CIP,T.STAT(R0) ;BLOCK TASK FOR CHECKPOINT IN PROG8 35$: MOV (R2),R2 ;POINT TO NEXT ATTACHMENT DESCRIPTOR BNE 20$ ;IF NE THERE IS ONE; BIT #PS.CKR,P.STAT(R3) ;WAS THERE ONLY A REQUEST POSTED?#% BNE 70$ ;IF NE YES, JUST EXIT NOWO< 36$: TST P.DPCB(R3) ;IS THIS AN INSTALLED RW OR RO REGION? BNE 90$ ;IF NE YES SAVNR ;SAVE R4 AND R5> BIC #PS.CAF,P.STAT(R3) ;CLEAR CHECKPOINT ALLOCATION FAILURE/ MOV #P.DLGH,R1 ;SET LENGTH OF CHECKPOINT PCBT* CALL $ALOCB ;ALLOCATE A CHECKPOINT PCB% BCS 50$ ;IF CS ALLOCATION FAILUREI- MOV R0,R4 ;SAVE POINTER TO CHECKPOINT PCBC- ADD R1,R0 ;POINT TO END OF CHECKPOINT PCBN5 MOV P.SIZE(R3),-(R0) ;STORE SIZE OF CHECKPOINT PCB ) ADD #7,(R0) ;ROUND TO NEXT DISK BLOCK $ ROR (R0) ;CONVERT TO DISK BLOCKS ASR (R0) ; ASR (R0) ;8 MOV #$CFLPT,R5 ;POINT TO CHECKPOINT FILE PCB LISTHEAD6 00RzmqmzgM{gfffDATA40$: MOV (R5),R5 ;POINT TO NEXT CHECKPOINT FILE PCB BNE 80$ ;IF NE THERE IS ONEC. MOV R4,R0 ;RETRIEVE CHECKPOINT PCB POINTER+ MOV #P.DLGH,R1 ;SET LENGTH TO DEALLOCATEL MOV R3,R5 ;SAVE PCB ADDRESS * CALL $DEACB ;DEALLOCATE CHECKPOINT PCB# MOV R5,R3 ;RETRIEVE PCB ADDRESS(' 50$: MOV R3,R1 ;RETRIEVE PCB ADDRESS1 BIT #PS.COM,P.STAT(R1) ;IS THIS A TASK REGION?( BNE 60$ ;IF NE NOL( MOV P.TCB(R1),R0 ;PICK UP TCB ADDRESS= BIT #T3.CAL,T.ST3(R0) ;SPACE ALLOCATED IN TASK IMAGE FILE?V BNE 90$ ;IF NE YES, USE IT' BIC #TS.CIP,T.STAT(R0) ;UNBLOCK TASK @ 60$: BIS #PS.CAF,P.STAT(R1) ;SET CHECKPOINT FILE ALLOC FAILURE* MOV $TKNPT,R0 ;PICK UP TKTN TCB ADDRESS  .IF DF R$$PRO $ BNE 65$ ;IF NE TKTN IS INSTALLED, MOV #5,R0 ;GET THE CHECKPOINT ALLOCATION+ ;FAILURE CODE FOR THE P/OS DISPATCHER#1 CALLR $CTMSG ;GO SEND THE MESSAGE IF POSSIBLE6  .IFF ;R$$PROV ( BEQ 70$ ;IF EQ TKTN IS NOT INSTALLED  .ENDC ;R$$PRO + 65$: TST T.STAT(R0) ;TKTN ALREADY ACTIVE?E# BPL 70$ ;IF PL YES, JUST RETURN0 JMP $EXRQN ;NO, REQUEST TKTN 70$: RETURN ;C9 80$: TST P.REL(R5) ;IS THIS CHECKPOINT FILE TURNED OFF?N BNE 40$ ;IF NE YES5 CALL $FNDSP ;ATTEMPT TO ALLOCATE CHECKPOINT SPACE % BCS 40$ ;IF CS ALLOCATION FAILUREI. CLR P.UCB(R4) ;P.UCB=0 FOR CHECKPOINT PCB'S8 MOV R5,P.MAIN(R4) ;STORE ADDRESS OF MAIN CKP FILE PCB7 MOV R4,P.DPCB(R3) ;STORE CHECKPOINT FILE PCB ADDRESSA' 90$: MOV R3,R1 ;RETRIEVE PCB ADDRESST9 MOV P.ATT(R1),R3 ;POINT TO FIRST ATTACHMENT DESCRIPTOR ! BEQ 120$ ;IF EQ THERE IS NONEEA 100$: MOVB A.MPCT(R3),R0 ;PICK UP MAPPING COUNT THRU DESCRIPTORP BEQ 110$ ;IF EQ NO1 MOV A.TCB(R3),R2 ;PICK UP MAPPED TCB'S ADDRESS . INC T.STAT(R2) ;ADVANCE TASK BLOCKING COUNT; BIC #TS.CIP,T.STAT(R2) ;CLEAR CHECKPOINT IN PROGRESS BITP9 110$: MOV (R3),R3 ;POINT TO NEXT ATTACHMENT DESCRIPTORP BNE 100$ ;IF NE THERE IS ONE2 120$: BIS #PS.CKP,P.STAT(R1) ;SET CHECKPOINT BIT; BIT #PS.COM,P.STAT(R1) ;IS TARGET REGION A TASK REGION ?E BNE 125$ ;IF NE, NO0+ MOV P.TCB(R1),R3 ;GET OWNING TCB ADDRESS(2 TSTB T.IOC(R3) ;TASK HAVE ANY OUTSTANDING I/O ?0 BEQ 125$ ;IF EQ, NO NEED TO WORRY ABOUT IOSB9 BIS #T3.MPC,T.ST3(R3) ;SET MAPPING CHANGE TO FORCE ANYI% ;OUTSTANDING I/O TO RE-MAP IOSBE 125$: ;REFERENCE LABELP   .IF DF A$$CNT 6 BIT #BF.XTK,$ACNFE ;DOES CHECKPOINT BECAUE OF EXTK$ BNE 140$ ;IF NE YES.) MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING# MOV $SABPT,KISAR6 ;MAP SABG* BEQ 130$ ;IF EQ, ACCOUNTING NOT ACTIVE4 BIT #BF.LSS,$ACNFE ;SYSTEM ACCOUNTING TURNED ON ? BEQ 130$ ;NO, IF EQ.* ADD #1,@#B.CKP+140002 ;COUNT CHECKPOINT ADC @#B.CKP+140000 ;B) 130$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGN& 140$: BIC #BF.XTK,$ACNFE ;CLEAR FLAG  .ENDC    ;+( ; **-$LOADT-PUT REGION IN LOADER QUEUE ; F ; THIS ROUTINE PUTS A REGION IN THE LOADER QUEUE FOR AN INITIAL LOADA ; OR CHECKPOINT OPERATION. IF THE REGION IS A TASK REGION, ALLIG ; OTHER REGIONS MAPPED BY THE TASK ARE EITHER ACCESSED OR DEACCESSED,S? ; DEPENDING ON WHETHER THE TASK IS COMING IN OR OUT OF MEMORYE ; RESPECTIVELY. NOTE THAT IF THE TASK'S ATTACHMENT QUEUE IS EMPTY, D ; THEN THIS MUST BE THE INITIAL LOAD AND ALL REGIONS LINKED TO THE ; TASK ARE MAPPED. ;  ; INPUTS:+ ;  ; R1=ADDRESS OF PCB OF REGIONE ;  ; OUTPUTS: ;E ; NONE ;- 5 $LOADT::BIT #PS.COM,P.STAT(R1) ;IS IT A COMMON PCB?P BNE 50$ ;IF NE YES. TST P.ATT(R1) ;ATTACHED TO TASK REGION YET? BNE 5$ ;IF NE YES  3 TALLY$ B.TLOD,XA$$TL ;COUNT AN INITIAL TASK LOADS &! BR 50$ ;LOADER DOES FIRST ACCESSES" 5$: ;REFERENCE LABELA!# MOV R1,-(SP) ;SAVE PCB ADDRESS $ MOV R4,-(SP) ;SAVE R4(% MOV P.TCB(R1),R4 ;PICK UP TCB ADDRESS<& MOV #$ACCRG,-(SP) ;ASSUME ATTACHED REGIONS TO BE ACCESSED7' BIT #PS.OUT,P.STAT(R1) ;IS TASK REGION BEING LOADED? ( BNE 10$ ;IF NE YES5) MOV #$DEARG,(SP) ;SET TO DEACCESS ATTACHED REGIONS >* 10$: MOV @T.ATT(R400Rm%hgcccc),R4 ;PICK UP SECOND ATTACHMENT DESCRIPTOR%+ 20$: BEQ 30$ ;IF EQ AT END OF LIST$0, TSTB A.MPCT-A.TCBL(R4) ;IS THE REGION MAPPED?- BEQ 25$ ;IF EQ NOS/. MOV A.TCB-A.TCBL(R4),R0 ;PICK UP TCB ADDRESSS// MOV A.PCB-A.TCBL(R4),R1 ;PICK UP PCB ADDRESSV00 CMP T.PCB(R0),R1 ;ATTACHMENT TO TASK REGION ?1 BNE 23$ ;IF NE NO ,2 CMP (SP),#$ACCRG ;ACCESSING TASK REGION ?,3 BEQ 25$ ;IF EQ YES, SKIP THIS ATTACHMENT04 23$: CALL @(SP) ;CALL ACCESS/DEACCESS ROUTINE75 25$: MOV (R4),R4 ;PICK UP NEXT ATTACHMENT DESCRIPTORO6 BNE 20$ ;IF NE THERE IS ONEB7 30$: TST (SP)+ ;CLEAN STACK8 MOV (SP)+,R4 ;RESTORE R4 %9 MOV (SP)+,R1 ;RETRIEVE PCB POINTERN3: 50$: MOV $LDRPT,R0 ;PICK UP TCB ADDRESS OF LOADER; ;+< ; ** W A R N I N G **K= ;C> ; SPM HOOKPOINT NUMBER 12.? ;T+@ ; DO NOT CHANGE THE INSTRUCTION FOLLOWINGNA ; LABEL WITHOUT CHECKING SPMB ;-C -D $SPH12==. ;SPM CHANGES THE INSTRUCTION ATH!E ;THE LOCATION OF THIS LABELSF G 3H TSTB P.PRI(R1) ;CHECKPOINTING UNMAPPED COMMON OREI ;MULTI-USER SECTION ?IJ BNE 60$ ;IF NE, NO5K MOVB #251.,P.PRI(R1) ;INSERT PCB AT FRONT OF QUEUE L 60$: ;REFERENCE LABELM N ;+=O ; **-$EXRQP-EXECUTIVE REQUEST WITH QUEUE INSERT BY PRIORITY6P ; **-$EXRQF-EXECUTIVE REQUEST WITH QUEUE INSERT FIFO7Q ; **-$EXRQN-EXECUTIVE REQUEST WITH NO QUEUE INSERTIONBR ; **-$EXRQU-EXECUTIVE UNSTOP AND REQUEST WITH NO QUEUE INSERTION8S ; **-$EXRQS-EXECUTIVE REQUEST WITH NO SCHEDULE REQUESTT ; IU ; THESE ROUTINES PROVIDE A STANDARD INTERFACE TO ALL TASKS REQUESTED BYEV ; THE EXECUTIVE.W ; X ; INPUTS:VY ;1%Z ; R0=TCB ADDRESS OF TASK TO REQUESTUB[ ; R1=ADDR OF PACKET TO QUEUE TO TASK (IF ENTRY AT $EXRQP/$EXRQF)\ ; ] ; OUTPUTS:^ ;Y2_ ; C=0 IF THE REQUEST WAS SUCCESSFULLY COMPLETED.3` ; C=1 IF THE TASK WAS NOT SUCCESSFULLY REQUESTED.N#a ; Z=0 IF PCB ALLOCATION FAILURE.C7b ; Z=1 IF TASK ACTIVE, BEING REMOVED, OR BEING FIXED.$c ;-d e .ENABL LSBIBf $EXRQP::MOV #$QINSP,-(SP) ;PUSH ADDR OF QUEUE INSERT BY PRIORITYg BR 1$ ;JOIN COMMON CODET;h $EXRQF::MOV #$QINSF,-(SP) ;PUSH ADDR OF QUEUE INSERT FIFOT0i 1$: ADD #T.RCVL,R0 ;POINT TO TASK RECEIVE LIST/j CALL @(SP)+ ;INSERT PACKET IN RECEIVE QUEUE-k SUB #T.RCVL,R0 ;POINT BACK TO START OF TCBT7l $EXRQN::BIT #T2.STP*2!T2.STP,T.ST2(R0) ;TASK STOPPED? m BEQ 2$ ;IF EQ NO=n $EXRQU::BIC #T2.STP*2!T2.STP,T.ST2(R0) ;CLEAR TASK STOP BITVo p ;+q ; ** W A R N I N G **r ;s ; SPM HOOKPOINT NUMBER 07.t ;$+u ; DO NOT CHANGE THE INSTRUCTION FOLLOWINGOv ; LABEL WITHOUT CHECKING SPMw ;-x -y $SPH07==. ;SPM CHANGES THE INSTRUCTION ATT!z ;THE LOCATION OF THIS LABEL { | 3} CALL @#$SETCR ; SET CONDITIONAL SCHEDULE REQUESTV~ $EXRQS:: ;REF LABELR 2$: CLR R1 ;USE DEFAULT UIC .DSABL LSBT  ;+( ; **-$TSKRT-TASK REQUEST (DEFAULT UCB)( ; **-$TSKRQ-TASK REQUEST (SPECIFY UCB)0 ; **-$TSKRP-TASK REQUEST (SPECIFY DEFAULT UIC) ;R> ; THIS ROUTINE IS CALLED TO REQUEST THE EXECUTION OF A TASK. ;A ; INPUTS:U ; 6 ; R0=ADDRESS OF THE TCB OF THE TASK TO BE REQUESTED. ; R1=REQUEST UIC.G& ; R2=UCB ADDRESS IF ENTRY AT $TSKRQ.& ; R3=DEFAULT UIC IF ENTRY AT $TSKRP. ;; ; OUTPUTS: ;H> ; C=1 IF TASK IS ALREADY ACTIVE OR IS BEING FIXED IN MEMORY.' ; Z=1 IF TASK ACTIVE OR BEING FIXED.*# ; Z=0 IF PCB ALLOCATION FAILURE. 1 ; C=0 IF THE REQUEST IS SUCCESSFULLY COMPLETED.R ;- 9 $TSKRT::MOV $COPT,R2 ;GET ADDRESS OF COMMAND OUTPUT UCBD2 $TSKRQ::MOV R1,R3 ;MAKE CURRENT UIC DEFAULT UICA $TSKRP::MOV #TS.EXE,-(SP) ;ASSUME TASK IS ACTIVE OR BEING FIXED, BIT (SP),T.STAT(R0) ;TASK ALREADY ACTIVE? BEQ 10$ ;IF EQ YES& MOV R1,T.EFLG(R0) ;SAVE REQUEST UIC< MOV T.PCB(R0),R1 ;PICK UP PCB POINTER (COULD BE MAIN PCB)/ BIT #PS.FXD,P.STAT(R1) ;IS TASK BEING FIXED?I BEQ 1$ ;IF EQ NO7 BIT #PS.OUT!PS.CKP,P.STAT(R1) ;TASK OUT OF MEMORY ORC ;BEING SHUFFLED ? BNE 10$ ;IF NE YES, 1$: BIT #T3.REM,T.ST3(R0) ;REMOVE ON EXIT? BNE 10$ ;IF NE YES% MOV R3,T.ACTL(R0) ;SET DEFAULT UIC.' BIC (SP),00RmqmzgM{gfffDATAT.STAT(R0) ;SET TASK ACTIVE % CLR (SP) ;CLEAR FAILURE INDICATORR ;+ ; ** W A R N I N G **Q ; ; SPM HOOKPOINT NUMBER 02. ;U+ ; DO NOT CHANGE THE INSTRUCTION FOLLOWING( ; LABEL WITHOUT CHECKING SPM ;- - $SPH02==. ;SPM CHANGES THE INSTRUCTION ATO! ;THE LOCATION OF THIS LABEL; , MOV R2,T.UCB(R0) ;SET ADDRESS OF 'TI' UCB 0 BIT #PS.FXD,P.STAT(R1) ;TASK FIXED IN MEMORY? BNE 20$ ;IF NE YES& MOV R0,-(SP) ;SAVE TASK TCB ADDRESS- MOV #P.LGTH,R1 ;SET LENGTH OF BLOCK NEEDEDA CALL $ALOCB ;ALLOCATE PCB  MOV R0,R3 ;SAVE PCB ADDRESSW* MOV (SP)+,R0 ;RETRIEVE TASK TCB ADDRESS ROR (SP) ;CAPTURE CARRY BIT + BEQ 3$ ;IF EQ ALLOCATION WAS SUCCESSFUL ) BIS (SP),T.STAT(R0) ;SET TASK INACTIVEC$ INC (SP) ;SET ALLOCATION FAILURE) CMP R0,$TKNPT ;TRYING TO REQUEST TKTN?C BEQ 40$ ;IF EQ YES BR 10$ ; 3$:S   .IF DF N$$DIR & CALL SETDDS ;SET UP POINTER TO DDS  .ENDC ; DF N$$DIR  .IF DF A$$CNT 2 CALL ACNTSK ;SET UP ACCOUNTING DATA STRUCTURES  .ENDC  3 MOV T.PCB(R0),R1 ;GET MAIN PARTITION PCB ADDRESST) MOV R3,R2 ;COPY ALLOCATED PCB ADDRESS 1 MOV R2,T.PCB(R0) ;SET ADDRESS OF ALLOCATED PCBB" TST (R2)+ ;SKIP OVER LINK WORD2 CLR (R2)+ ;INIT PRIORITY AND RES. MAPPED COUNT- MOV P.NAM(R1),(R2)+ ;INSERT PARTITION NAMEI MOV P.NAM+2(R1),(R2)+ ;1 CLR (R2)+ ;CLEAR POINTER TO NEXT SUBPARTITIONS7 MOV R1,(R2)+ ;SET BACK POINTER TO MAIN PARTITION PCBF$ CLR (R2)+ ;CLEAR RELOCATION BASE9 MOV T.MXSZ(R0),(R2)+ ;SET PARTITION SIZE IN 32W BLOCKST' CLR (R2)+ ;CLEAR WAIT QUEUE POINTERS; MOV P.SIZE-P.SWSZ(R2),(R2)+ ;SET SWAP SIZE FROM PAR SIZEC$ CLR (R2)+ ;ZERO DISK PCB ADDRESS& MOV R0,(R2)+ ;SET OWNER TCB ADDRESS= MOV #PS.DEL!PS.OUT,(R2)+ ;MARKED FOR DELETE, OUT OF MEMORY)1 BIT #T2.CHK,T.ST2(R0) ;IS TASK CHECKPOINTABLE?( BEQ 4$ ;IF EQ YESC1 BIS #PS.CHK,-2(R2) ;MAKE PCB NONCHECKPOINTABLE 0 4$: CLR (R2)+ ;INITIALLY CLEAR HEADER POINTER$ CLR (R2)+ ;CLEAR PROTECTION WORD2 MOV R2,R1 ;SAVE POINTER TO ATTACHMENT LISTHEAD) CLR (R2)+ ;SET UP ATTACHMENT LISTHEAD  MOV R1,(R2)+ ;R  .IF DF X$$HDR 9 MOVB T.HDLN(R0),(R2)+ ;INIT XTRNL HEADER SIZE (P.HDLN)R  .IFF ; DF X$$HDRD ( TSTB (R2)+ ;SKIP XTRNL HEADER LENGTH  .ENDC ; DF X$$HDR ! MOV R0,-(SP) ;SAVE TCB ADDRESSI ;+ ; ** W A R N I N G **C ;B ; SPM HOOKPOINT NUMBER 11. ;K+ ; DO NOT CHANGE THE INSTRUCTION FOLLOWING  ; LABEL WITHOUT CHECKING SPM ;- - $SPH11==. ;SPM CHANGES THE INSTRUCTION ATC! ;THE LOCATION OF THIS LABELU1 CLRB (R2)+ ;ZERO PARTITION I/O COUNT (P.IOC).# MOV R3,R1 ;RETRIEVE PCB ADDRESS( # CALL $ACCRG ;ACCESS TASK REGION  BR 30$ ;% 10$: MOV R0,-(SP) ;SAVE TCB ADDRESSL6 MOV T.PCB(R0),R0 ;GET ADDRESS OF TASK PARTITION PCB! CALL $NXTSK ;SELECT NEXT TASK BR 30$ ;% 20$: MOV R0,-(SP) ;SAVE TCB ADDRESS1   .IF DF N$$DIR & CALL SETDDS ;SET UP POINTER TO DDS  .ENDC ; DF N$$DIR   .IF DF A$$CNT 2 CALL ACNTSK ;SET UP ACCOUNTING DATA STRUCTURES  .ENDC  + CALL $BILDS ;BUILD A STACK FOR THE TASK1( 30$: MOV (SP)+,R0 ;RESTORE TCB ADDRESS ! " .IF DF V$$TRM# $$ TST (SP) ;SUCCESSFUL ACTIVATION?% BMI 40$ ;IF MI NOB,& MOV T.UCB(R0),R1 ;PICK UP TI: UCB ADDRESS' MOV (R1),R2 ;POINT TO DCB :( CMP D.NAM(R2),#"VT ;IS THE TI: A VIRTUAL TERMINAL UNIT?) BNE 40$ ;IF NE NO 4* INCB U.OCNT(R1) ;INCREMENT ACTIVE OFFSPRING COUNT+ , .ENDC- . . 40$: ;JWB169C. .IF DF N$$DIR ;JWB169T. ;JWB169.7. CLR $CTXPT ;CLEAR OUT FOR FUTURE REQUESTS ;JWB1691. ;JWB169 !. .ENDC ;DF N$$DIR ;JWB169F. ;JWB169T50 ASL (SP)+ ;SET SUCCESS/FAILURE INDICATION ;**-11 2 RETURN ; 3 4 ;TG5 ; LOCAL ROUTINE TO PROPAGATE THE DEFAULT DIRECTORY STRING TO THE TASK 6 ; WHICH IS STARTING UP7 ;?8 9 .IF DF N$$DIR: 2; SETDDS: MOV $CTXPT,R1 ;GET SPECIAL DDS SPECIFI00Rm%hgccccED< BEQ 20$ ;IF EQ, NONE!= MOV R1,T.CTX(R0) ;PUT INTO TCB$$> CLR $CTXPT ;RESET $CTXPT TO ZERO? BR 40$ ;BRANCH AROUND $@ 20$: MOV T.UCB(R0),R1 ;GET TI: UCB'A BIT #DV.PSE,U.CW1(R1);PSEUDO DEVICE? (B BNE 60$ ;IF NE, YES - NO CONTEXT PTR.C MOV U.CTX(R1),R1 ;GET CONTEXT BLOCK POINTER$D BEQ 60$ ;IF EQ, NO CONTEXT BLOCK1E MOV R1,T.CTX(R0) ;PUT POINTER TO DDS INTO TCBNF -G 40$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING#H MOV R1,KISAR6 ;MAP CONTEXT BLOCKC.I INCB C.REF+MAP6 ;INCREMENT REFERNCE COUNTER$J MOV (SP)+,KISAR6 ;RESTORE MAPPING K 60$: RETURNCL M .ENDC ;DF N$$DIRTN O P ; IQ ; LOCAL ROUTINE TO SET UP ACCOUNTING DATA STRUCTURES FOR THE TASK BEINGU R ; ACTIVATED S ;ET U V .IF DF A$$CNTW X ACNTSK:PY MOV R4,-(SP) ;SAVE R4Z MOV R0,R4 ;SAVE TCB ADDRESS6)[ MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGT"\ MOV T.UCB(R0),R0 ;LOCATE TI UCB] CMP $COPT,R0 ;IS TI: = CO:S^ BEQ 10$ ;IF EQ YES-_ MOV U.UAB(R0),R0 ;TRY TO LOCATE TASK'S UABE"` BNE 30$ ;IF NE, THERE IS A UABa b c .IF DF V$$TRMd *e MOV T.UCB(R4),R1 ;LOCATE TASK'S TI: UCBf MOV (R1),R0 ;POINT TO DCBO0g CMP D.NAM(R0),#"VT ;IS IT A VIRTUAL TERMINAL?h BNE 20$ ;IF NE NOA,i MOV U.PTCB(R1),R1 ;LOCATE PARENT TASK TCB6j BEQ 20$ ;IF EQ, USE $SYUAB SINCE CAN'T FIND PARENT'k MOV T.ACN(R1),R0 ;TRY TO USE ITS UABR)l BEQ 20$ ;IF EQ, USE $SYUAB AS DEFAULTI)m 5$: MOV R0,KISAR6 ;MAP ACCOUNTING BLOCKQ+n CMPB #BT.UAB,@#B.TYP+140000 ;IS IT A UAB o BEQ 30$ ;IF EQ YES3p MOV @#B.PNT+140000,R0 ;GET ADDRESS OF NEXT BLOCKTq BR 5$ ;CHECK ITRr s .IFF ;V$$TRMTt %u BR 20$ ;USE $SYUAB AS DEFAULT UABCv w .ENDC ;V$$TRMx y 4z 10$: MOV $CKUAB,R0 ;GET UAB ADDRESS FROM CLQ BLOCK { BNE 30$ ;IF NE, THERE IS ONE3| 20$: MOV $SYUAB,R0 ;USE SYSTEM UAB AS LAST RESORT)} BEQ 90$ ;IF EQ, ACCOUNTING NOT ACTIVE ~ 30$: MOV R0,KISAR6 ;MAP UAB + INCB @#B.USE+140000 ;INCREMENT USE COUNT 4 INC @#B.ACT+140000 ;INCREMENT ACTIVE TASK COUNTER0 MOV #B.TAS,R1 ;GET OFFSET TO TASK COUNT FIELD' CALL $ADAT1 ;INCREMENT TASK COUNTERE MOV #BS.ACT,R1 ;ACTIVATE TAB1 BIT #BF.TSK,$ACNFE ;TASK ACCOUNTING TURNED ON?C BNE 50$ ;IF NE YES9 MOV T.EFLM(R4),-(SP) ;CHECK FOR ANY TIME LIMIT ON TASK  BIS T.EFLM+2(R4),(SP)+ ;M! BEQ 80$ ;IF EQ, NO TIME LIMITT2 BIS #BS.TML,R1 ;SET TIME LIMIT ONLY BIT FOR TAB ;0 ; CREATE TAB FOR TASK  ;I5 ; TKTN CANNOT HAVE A TAB, BECAUSE IT GETS REQUESTEDT2 ; IN THE PROCESSING OF A TAB ALLOCATION FAILURE. ;;- 50$: CMP $TKNPT,R4 ;IS TKTN BEING REQUESTED  BEQ 80$ ;IF EQ YES MOV KISAR5,-(SP) ;SAVE KISAR5! MOV R0,-(SP) ;SAVE UAB ADDRESSN% MOV R1,-(SP) ;SAVE VALUE FOR B.STMS MOV #B.TBLK,R1 ;LENGTH OF TAB MOV R3,-(SP) ;SAVE R3 CALL $ALTAB ;ALLOCATE A TAB  MOV (SP)+,R3 ;RESTORE& BCS 75$ ;IF CS, ALLOCATION FAILURE3 MOV R0,2(SP) ;REPLACE UAB ADDR WITH THE TAB ADDR % MOV R0,KISAR5 ;MAP TAB WITH KISAR5 = MOV #!BT.TAB,@#B.TYP+120000 ;TAB IDENTIFACTIONA5 MOV #B.HID+120000,R1 ;POINT TO USER ID AREA OF TABS 55$: MOV R1,R2 ;COPY ADDRESSM1 MOV 20000(R2),(R1)+ ;COPY WORD FROM UAB TO TAB - CMP #B.HEND+120000,R1 ;ENTIRE AREA COPIED?. BHI 55$ ;IF HI NO : MOV #/2,R2 ;GET NUMBER OF WORDS TO CLEAR2 60$: CLR (R1)+ ;CLEAR ACCUMULATION FIELD IN TAB SOB R2,60$ ;LOOP4 MOV #B.CPUL+2+120000,R1 ;POINT TO CPU LIMIT FIELD. MOV T.EFLM+2(R4),(R1) ;COPY LIMIT INTO TAB MOV T.EFLM(R4),-(R1)A- MOV (R1)+,-(SP) ;CHECK IF THERE IS A LIMIT. BIS (R1),(SP)+ ;T BEQ 70$ ;IF EQ, NO LIMIT9 MOV -2(R1),@#B.CPU+120000 ;COPY LIMIT INTO B.CPU FIELDR MOV (R1),@#B.CPU+2+120000 ;2 COM @#B.CPU+120000 ;CONVERT TO 1'S COMPLIMEMENT5 COM @#B.CPU+2+120000 ;TO ENABLE DETECTION WITH BCSD! 70$: TST (R1)+ ;POINT TO B.PNTR* MOV KISAR6,(R1)+ ;INSERT POINTER TO UAB) CMP T.UCB(R4),$COPT ;IS CO: TASK'S TI:C BNE 73$ ;IF NE NOT% BIS #BS.CO,(SP) ;SET INDICATOR BIT$ 73$: MOVB (SP),(R1)+ ;INSERT B.STM5 MOVB T.PRI(R4),(R1)+ ;INSERT INITIAL TASK P00RmqmzgM{gfffDATARIORITYT( MOV T.NAM(R4),(R1)+ ;INSERT TASK NAME MOV T.NAM+2(R4),(R1)+ ;# MOV R4,(R1)+ ;INSERT TCB ADDRESS." MOV R0,R1 ;COPY ADDRESS OF TAB, MOV #B.BEG,R0 ;TASK ACTIVATION TIME FIELD CALL $TMSTP ;TIME STAMP TABT( 75$: TST (SP)+ ;CLEAN B.STM OFF STACK- MOV (SP)+,R0 ;GET ADDR OF ACCOUNTING BLOCK # MOV (SP)+,KISAR5 ;RESTORE KISAR5I6 80$: MOV R0,T.ACN(R4) ;LINK ACCOUNTING BLOCK OFF TCB' 90$: MOV (SP)+,KISAR6 ;RESTORE KISAR6T" MOV R4,R0 ;RESTORE TCB ADDRESS MOV (SP)+,R4 ;RESTORE R4 RETURNR  .ENDC    ;+3 ; **-$UISET-ESTABLISH DEFAULT UIC AND CURRENT UICD ;.D ; THIS ROUTINE ESTABLISHES DEFAULT AND CURRENT FOR REQUESTED TASKS ; IN MULTI-USER SYSTEMS. ;M ; INPUTS: ;: ; R1=REQUEST UIC4 ; R2=ADDRESS OF SECOND STATUS WORD OF CURRENT TASK( ; R4=ADDRESS OF HEADER OF CURRENT TASK ; ; OUTPUTS: ;( ; R1=CURRENT UIC ; R3=DEFAULT UIC6 ; C=1 IF NONPRIVILEGED TASK IS TRYING TO CHANGE UIC ; C=0 OTHERWISE ;-  .IF DF M$$MUP 2 $UISET::MOV H.DUIC(R4),R3 ;PROPAGATE DEFAULT UIC TST R1 ;UIC SPECIFIED? BEQ 10$ ;IF EQ NO MOV R1,R3 ;USE SPECIFIED UIC. BIT #T3.PRV,2(R2) ;CURRENT TASK PRIVILEGED? BNE 20$ ;IF NE YES6 CMP R1,H.CUIC(R4) ;NONPRIVILEGED TASK CHANGING UIC? BEQ 10$ ;IF EQ NON SEC ;ELSE RETURN C-BIT SETO: 10$: MOV H.CUIC(R4),R1 ;FORCE PROPAGATION OF CURRENT UIC 20$: RETURN ;C  .ENDC   ;+% ; **-$MAPTK-MAP TASK ADDRESS WINDOWO ;ID ; THIS ROUTINE IS CALLED TO MAP THE FIRST WINDOW BLOCK IN A TASK'S3 ; HEADER IN A MAPPED SYSTEM FROM ITS PCB AND TCB.1 ;I ; INPUTS:M ;,= ; R1=POINTER TO NUMBER OF WINDOW BLOCKS IN THE TASK HEADER.I6 ; R5=ADDRESS OF THE TASK CONTROL BLOCK FOR THE TASK. ;I ; OUTPUTS: ; 0 ; R1=ADDRESS OF LAST PDR IMAGE IN TASK HEADER. ; R2 IS MODIFIED.M ;- 0 $MAPTK::TST (R1)+ ;POINT TO TASK WINDOW BLOCK- MOV T.PCB(R5),R2 ;PICK UP TASK PCB ADDRESS$. MOV R2,(R1)+ ;SET TASK PCB ADDRESS (W.BPCB)   .IF DF U$$DAS > BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D SPACE ? BEQ 2$ ;IF EQ NO0 ADD #W.BLGH-2,R1 ;POINT TO WINDOW 1 (D-SPACE)) MOV R2,(R1)+ ;SET UP TASK PCB (W.BPCB)5 2$: ;REFERENCE LABELL  .ENDC ; DF U$$DAS   .IF DF P$$LAS 6 BIT #T3.ROV,T.ST3(R5) ;TASK HAVE RESIDENT OVERLAYS?1 BNE 20$ ;IF NE AS, DON'T CHANGE WINDOW BLOCKS  .IFTF 7 MOV (R1)+,(R1) ;INIT HIGH VIRT ADDR (W.BLVR)(W.BHVR)R, MOV P.SIZE(R2),R2 ;PICK UP PARTITION SIZE  .IFTS 7 SUB T.OFF(R5),R2 ;REDUCE BY TASK OFFSET IN PARTITIONS  .IFTF * MOV R2,-(SP) ;PUSH REQUIRED WINDOW SIZE SWAB (SP) ;CONVERT TO BYTES ! RORB (SP) ;(" ROR (SP) ;# ROR (SP) ;9$ ADD (SP)+,(R1) ;COMPLETE HIGH VIRTUAL ADDRESS (W.BHVR) % DEC (R1)+ ;T& ' .IFTK( ,) TST (R1)+ ;POINT TO WINDOW SIZE (W.BATT))* MOV R2,(R1)+ ;SET WINDOW SIZE (W.BSIZ) 8+ MOV T.OFF(R5),(R1)+ ;SET OFFSET IN PARTITION (W.BOFF)$, INC R1 ;POINT TO NUMBER OF PDR'S- . .IFF/ 70 ADD #W.BNPD-W.BATT,R1 ;POINT TO NUMBER OF PDR'S BYTEA1 2 .IFTF3 &4 ASL R2 ;SHIFT # PDR'S TO HIGH BYTE45 SWAB R2 ;# PDR'S TO LO BYTE, LAST PDR SIZE TO HI06 SUB #377,R2 ;INC # PDR'S & DEC LAST PDR SIZE07 SBC R2 ;IF CS, EVEN BOUNDARY, REDUCE # PDR'S.8 MOVB R2,(R1)+ ;SET NUMBER OF PDR'S (W.BNPD)9 ROR R2 ;ADJUST CORRECT SIZET/: MOV R2,(R1) ;SET SIZE FOR LAST PDR (W.BLPD) 4; MOVB #6,(R1) ;SET FOR READ/WRITE ACCESS (W.BLPD)< 10$: RETURN ; = > .IFTP? @@ 20$: ADD #W.BLPD-W.BLVR,R1 ;POINT TO LAST WORD OF WINDOW BLOCK A RETURN ;B C .ENDCD E F ;+$G ; **-$CALTA-CALCULATE TRAP ADDRESSH ;RHI ; THIS ROUTINE IS CALLED TO CALCULATE WHETHER A TRAP ADDRESS SHOULD BEDJ ; STORED ODD (SERVICE IN SUPERVISOR MODE) OR EVEN (SERVICE IN USEREK ; MODE), ACCORDING TO THE PREVIOUS MODE FROM THE DIRECTIVE CALL ANDTHL ; THE VALUE OF THE LOW ORDER BIT OF THE ADDRESS SPECIFIED (1 = SERVICEM ; IN "OTHER" MODE).WN ;) O ; INPUTS:RP ; Q ; R2=SPECIFIED00RmSmgcccc ADDRESS.AR ;. S ; OUTPUTS:T ;N!U ; R2=TRAP ADDRESS TO BE STORED.R"V ; ALL OTHER REGISTERS PRESERVED.W ;-X Y Z .IF DF S$$LIB[ *\ $CALTA::TST R2 ;TRAP ADDRESS SPECIFIED?%] BEQ 20$ ;IF EQ NO, RETURN AS ZEROE4^ BIT #^CPSMODE&PMODE,PS ;PREVIOUS MODE SUPERVISOR?(_ BNE 20$ ;IF NE NO, USE ADDRESS AS IS%` BIT #1,R2 ;ODD ADDRESS SPECIFIED?La BEQ 10$ ;IF EQ NOF+b DEC R2 ;MAKE ADDRESS EVEN FOR USER MODE1 c BR 20$ ;4d 10$: INC R2 ;MAKE ADDRESS ODD FOR SUPERVISOR MODEe 20$: RETURN ;Af g .ENDCh i j .END R2=TRAP ADDRESS TO BE STORED.R"V ; ALL OTHER REGISTERS PRESERVED.W ;-X Y Z .IF DF S$$LIB[ *\ $CALTA::TST R2 ;TRAP ADDRESS SPECIFIED?%] BEQ 20$ ;IF EQ NO, RETURN AS ZEROE4^ BIT #^CPSMODE&PMODE,PS ;PREVIOUS MODE SUPERVISOR?(_ BNE 20$ ;IF NE NO, USE ADDRESS AS IS%` BIT #1,R2 ;ODD ADDRESS SPECIFIED?La BEQ 10$ ;IF EQ NOF+b DEC R2 ;MAKE ADDRESS EVEN FOR USER MODE1 c BR 20$ ;4d 10$: INC R2 ;MAKE ADDRESS ODD FOR SUPERVISOR MODEe 20$: R .TITLE TDSCHR .IDENT /13.03/A;RK; COPYRIGHT (c) 1982, 1983, 1984, 1985 BY DIGITAL EQUIPMENT CORPORATION. ; ALL RIGHTS RESERVED.;;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;E ; D. N. CUTLER 11-AUG-73 ;- ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY: ;; J. R. KAUFFMAN; T. M. MARTIN; B. S. MCCARTHY;R-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:I;R; B. S. MCCARTHY; J. W. BERZLE; L. B. MCCULLEY; C. A. SILVER; J. R. KAUFFMAN;5; MODIFIED BY:;C ; J. W. BERZLE 04-APR-86 13.00;>; JWB170 -- CORRECT UIC FOR TASK RUNNING OUT OF CLOCK QUEUE;"; B. S. MCCARTHY 15-DEC-86 13.01; 9; BM379 -- DON'T DECLARE S.E. IN ROUND ROBIN SCHEDULER$; UNLESS THE CURRENT TASK MOVES.;.; K. L. NOEL 15-DEC-86 13.02; 9; KLN030 -- SET INTERRUPT ENABLE BIT ON WATCHDOG TIMERX;P; K. L. NOEL 08-JUN-87 13.03; -; KLN053 -- ADD SUPPORT FOR TICK INCREMENT;.11; TIME DEPENDENT SCHEDULING AND DEVICE TIME OUTB2;3; MACRO LIBRARY CALLSP4;15,6 .MCALL CLKDF$,HDRDF$,HWDDF$,TCBDF$,PCBDF$47 CLKDF$ ;DEFINE CLOCK QUEUE CONTROL BLOCK OFFSET'8 HDRDF$ ;DEFINE TASK HEADER OFFSETSE&9 HWDDF$ ;DEFINE HARDWARE REGISTERS:; .IF DF R$$PRO< = .MCALL UPTUP$ ;UPTIME UPDATE>? .ENDC ; DF R$$PRO@A .IF DF N$$DIREBC .MCALL LNMDF$D)E LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETSFG .ENDC ;DF N$$DIRPHI.J TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS3K PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSALM;+N; **-$CKINT-CLOCK INTERRUPTWO;TFP; THIS ROUTINE IS ENTERED AS THE RESULT OF A CLOCK INTERRUPT. $INTSVEQ; IS CALLED TO SAVE REGISTERS R4 AND R5 AND $INTCT IS INCREMENT. IFSBR; THE RESULT IS NONZERO, THEN A JUMP TO $INTXT IS EXECUTED. ELSECS; A FORK IS EXECUTED SO THAT PENDING CLOCK INTERRUPTS CAN BE PRO- T; CESSED. U;-VW$CKINT:: ;;;REFERENCE LABELNXY .IF NDF K$$DASZ/[ JSR R5,$INTSE ;;;CALL INTERRUPT SAVE ROUTINEB+\ .WORD ^C&PR7 ;;;NEW PRIORITY IS PR5A]^ .IFF ; NDF K$$DAS_3` MOV R5,-(SP) ;MIMIC ACTIONS OF $DIRSV TO PREVENTE*a MOV R4,-(SP) ;WASTE TIME ON I/D SYSTEMS!b DEC $STKDP ;;;SWITCH STACKS ? 6c5$: BIC #^C&PR7,@#PS ;;;DROP TO DEVICE PRIORITY-d CACHE$ SAVE ;;;SAVE BYPASS STATE OF CACHE 9e MOV #$INTSF,-(SP) ;;;PUSH ADDRESS OF EXEC EXIT ROUTINEOfg .ENDC ; DF K$$DAShijkl .IF DF K$$W11m6m MOV #103,K$$W11 ;;;ENABLE AND START TIMER ;KLN030o ;**-1p .ENDCqrs .IF DF P$$3XXt-u TST @$CKCSA ;;;ENSURE CLOCK ISN'T LONESOM( v ;;;(IF WE'RE ON A PRO-3XX)wx .ENDC ; DF P$$3XXyz{ .IF DF M$$PRO|$} CALL $STTIC ;UPDATE SANITY TIMER,~ BIT $CKURM,@$CPURM ;DO WE MAINTAIN CLOCK? BEQ 7$ ;IF EQ NO -- EXIT .IFTF- MOV #$INTCT,R4 ;;;POINT TO INTERRUPT COUNTC) INC (R4) ;;;INCREMENT INTERRUPT COUNT BEQ 10$ ;;;IF EQ F00SmqmzgM{gfffDATAORKW .IFTV7$: ;;;REFERENCE LABELT .ENDC" RETURN ;;;EXIT FROM INTERRUPT#10$: CALL $FORK0 ;;;EXECUTE FORKE;C1; UPDATE ABSOLUTE AND REAL TIME OF DAY AND DATE;;+; ** W A R N I N G **D;P; SPM HOOKPOINT NUMBER 67.;I+; DO NOT CHANGE THE INSTRUCTION FOLLOWINGI; LABEL WITHOUT CHECKING SPM;--$SPH67==. ;SPM CHANGES THE INSTRUCTION ATN! ;THE LOCATION OF THIS LABELR6UPTIM: MOV #$TKPS+2,R4 ;POINT PAST CONVERSION VECTOR2 MOV #$TTNS+2,R5 ;POINT PAST CURRENT TIME VECTOR%10$: MOV #$TTNS-10,R2 ;POINT TO DAYR INC -(R5) ;UPDATE A COUNTERU" CMP -(R4),(R5) ;EXCEEDED LIMIT? BHI 20$ ;IF HI NOY CLR (R5) ;RESET COUNTER* CMP R5,R2 ;CHECK FOR LAST DAY OR MONTH BHI 10$ ;IF HI NO( INC (R5) ;DAY AND MONTH ARE 1 ORIGIN BCS 10$ ;IF CS NOT DAY" MOV -(R2),R1 ;GET CURRENT MONTH7 MOVB $DYPMN-1(R1),R0 ;GET DAYS FOR NEXT MONTH PLUS 1A- MOV R0,(R4) ;MOVE TO DAYS PER MONTH LIMITC, DEC R1 ;IS CURRENT MONTH ENDING JANUARY? BNE 10$ ;IF NE NO% BIT #3,-(R2) ;IS THIS A LEAP YEAR? BNE 10$ ;IF NE NO ) INC (R4) ;INCREMENT DAYS FOR FEBRUARY? BR 10$ ;20$: ;REFERENCE LABEL .IF DF R$$PRO+ DEC $NVRTM ;TIME TO UPDATE O/S UPTIME ?I BNE 25$ ;IF NE NO; UPTUP$ ;UPDATE UPTIME25$: ;REFERENCE LABEL .ENDC ; DF R$$PRO+ TST $SHFTM ;SHF TIMER ALREADY EXPIRED ?E BEQ 30$ ;IF EQ, YESR5 DEC $SHFTM ;DECREMENT TIMER BLOCKING SHF REQUESTSC030$: INC $ABTIM ;UPDATE ABSOLUTE TIME COUNTER BNE TDS ;IF NE NO OVERFLOW8 INC $ABTIM-2 ;COUNT OVERFLOW IN SECOND WORD OF $ABTIM0 MOV #$CLKHD,R0 ;POINT TO CLOCK QUEUE LISTHEAD.40$: MOV (R0),R0 ;GET ADDRESS OF NEXT ENTRY" BEQ TDS ;IF EQ NO MORE IN LIST* DEC C.TIM+2(R0) ;ADJUST HIGH ORDER TIME BR 40$ ;;F; TIME DEPENDENT SCHEDULING ;OTDS: ;REFERENCE LABEL .IF DF M$$PRO) MOV KISAR6,-(SP) ;SAVE MAPPING POINTERI" CLR KISAR6 ;POINT TO REAL ZERO+ INC @#140110 ;BUMP ABSOLUTE LOCATION 110B, MOV (SP)+,KISAR6 ;RESTORE MAPPING POINTER .IFF ( INC @$CKINC ;BUMP TICKER ;KLN053= ;ABSOLUTE LOCATION 110 OR TPR5 IF CPR ON KXJ-11 ;KLN053O .ENDC ;**-2. MOV $CLKHD,R4 ;GET ADDRESS OF NEXT IN QUEUE BEQ 11$ ;IF EQ, NONE IN LIST, TST C.TIM+2(R4) ;HIGH ORDER PART NONZERO? BNE 11$ ;IF NE, YESL$ CMP $ABTIM,C.TIM(R4) ;TIME TO GO? BLO 11$ ;IF LO, NO1 MOV (R4),$CLKHD ;REMOVE ENTRY FROM CLOCK QUEUE, MOVB C.RQT(R4),R5 ;GET ENTRY REQUEST TYPE- ADD R5,PC ;DISPATCH TO PROCESSING ROUTINE!10$: BR 20$ ;MARK TIME REQUEST 1 BR 30$ ;TASK REQUEST WITH PERIODIC RESCHEDULE $ BR 30$ ;SINGLE SHOT TASK REQUEST4 BR 12$ ;SINGLE SHOT INTERNAL SUBROUTINE (C.SYST)+ BR 15$ ;SINGLE SHOT INTERNAL SUBROUTINEI;+; CLEAR STOP BIT AND REALLOCATE PARTITION;1( MOV C.TCB(R4),R0 ;PICK UP TCB ADDRESS8 CALL $EXRQN ;CLEAR STOP BIT AND REALLOCATE PARTITION BR TDS ;(11$: JMP DVOUT ;JUMP TO DEVICE TIMOUT;Y,; SINGLE SHOT INTERNAL SUBROUTINE (TYPE 6);2; THIS SECTION HANDLES URM SPECIFIC CLOCK BLOCKS12$: ;REFERENCE LABEL .IF DF M$$PRO9 MOV #TDS,-(SP) ;PUSH RETURN ADDRESS FROM EITHER DRIVERS. ;(IF WE'RE NOW ON CORRECT CPU) OR $FORK0 ;(IF WE'RE NOT) = BIT C.URM(R4),@$CPURM ;ARE WE ALREADY ON CORRECT PROCESSORR. BNE 17$ ;IF NE YES, GO CALL THE DRIVER AND  ;CONTINUE CLQ SCAN#  TST (R4)+ ;POINT PAST LINK WORDD6  MOV C.URM-C.RQT(R4),(R4)+ ;PUT URM IN CORRECT PLACE8  CMP (R4)+,(R4)+ ;POINT PAST LINK AND PC IN FORK BLOCK'  CALL $FORK0 ;GET TO RIGHT PROCESSOR2& MOV R3,R4 ;COPY FORK BLOCK POINTER8 SUB #C.TIM,R4 ;POINT BACK TO BEGINNING OF CLOCK BLOCK" BR 17$ ;GO MAP DRIVER AND CALL;PI; SINGLE SHOT INTERNAL SUBROUTINE (TYPE 8, ALSO TYPE 6 ON UNIPROCESSOR)A;  .IFTF ;DF M$$PROE15$: ;REFERENCE LABEL .IFT ;DF M$$PRO8 MOV00Smmgcccc #TDS,-(SP) ;PUSH RETURN ADDRESS TO SCAN CLQ AGAIN .IFTF ;DF M$$PRO 5 17$: MOV KINAR5,-(SP) ;SAVE KERNEL INSTR ADDR REG 5C!"#$ .IF DF K$$DAS%0& MOV KDSAR5,-(SP) ;SAVE KERNEL DATA ADDR REG 51' MOV C.AR5(R4),KDSAR5 ;MAP DRIVER IN DATA SPACEN() .IFTF*2+ MOV C.AR5(R4),KINAR5 ;MAP DRIVER IN INSTR SPACE,;+-; ** W A R N I N G ** .; /; SPM HOOKPOINT NUMBER 66.0;+1; DO NOT CHANGE THE INSTRUCTION FOLLOWINGR2; LABEL WITHOUT CHECKING SPM3;-4-5$SPH66==. ;SPM CHANGES THE INSTRUCTION ATN!6 ;THE LOCATION OF THIS LABEL 78*9 CALL @C.SUB(R4) ;CALL SYSTEM SUBROUTINE:; .IFT<3= MOV (SP)+,KDSAR5 ;RESTORE KERNEL DATA ADDR REG 5E>? .ENDC@A4B MOV (SP)+,KINAR5 ;RESTORE KERNEL INSTR ADDR REG 5CD .IFT ;DF M$$PROE F RETURN ;PGH .IFF ;DF M$$PROI J BR TDS ;KL .ENDC ;DF M$$PROPMNO;UP; MARK TIME REQUESTNQ;AR5S20$: MOV C.SRC(R4),R0 ;PICK UP EVENT FLAG MASK WORDS4T MOV C.DST(R4),R1 ;PICK UP EVENT FLAG MASK ADDRESS(U MOV C.TCB(R4),R5 ;PICK UP TCB ADDRESS3V CALL $SETMG ;SET EFN AND UNLOCK IF GROUP GLOBAL"W CLR R5 ;RESET CLOCK BLOCK TYPE)X MOV C.AST(R4),R3 ;GET AST TRAP ADDRESS.#Y BEQ 40$ ;IF EQ NO AST SPECIFIEDS$Z MOVB C.EFN(R4),R2 ;GET EFN NUMBER0[ MOV R4,R1 ;COPY ADDRESS OF CLOCK QUEUE ENTRY,\ TST (R4)+ ;POINT TO CONTROL BLOCK LENGTH5] MOV #C.LGTH,(R4)+ ;SET LENGTH OF AST CONTROL BLOCK7^ MOV #8.*2,(R4)+ ;SET BYTES TO ALLOCATE ON TASK STACK(_ MOV R3,(R4)+ ;INSERT AST TRAP ADDRESS-` MOV #1,(R4)+ ;SET NUMBER OF AST PARAMETERSE,a MOV R2,(R4) ;INSERT EFN AS AST PARAMETER"b CALL $QASTT ;QUEUE AST TO TASK c BR TDS ;de;Tf; SCHEDULE REQUESTg;Sh-i30$: MOV C.TCB(R4),R0 ;GET TASK TCB ADDRESS.jk .IF NDF N$$DIRBk ;JWB170P$l MOV C.UIC(R4),R1 ;GET REQUEST UICmn .IFFTo(p TSTB C.NAM(R4) ;IS THERE A UIC OR CTX.q BNE 35$ ;IF NE, GET UIC FROM CONTEXT BLOCK$r MOV C.UIC(R4),R1 ;GET REQUEST UIC s BR 37$ ;2t35$: MOV C.CTX(R4),R1 ;GET CONTEXT BLOCK POINTER)u MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGR#v MOV R1,KISAR6 ;MAP CONTEXT BLOCKC&w TSTB C.DDSL+140000 ;IS THERE A DDS?#x BEQ 36$ ;IF EQ, DON'T PROPAGATE*y MOV R1,$CTXPT ;PROPAGATE CONTEXT BLOCK+z36$: MOV C.CUIC+140000,R1;GET REQUEST UIC ${ MOV (SP)+,KISAR6 ;RESTORE MAPPING|37$: ;REFERENCE LABEL}~ .ENDC ;NDF N$$DIR .IF DF A$$CNT0 MOV C.UAB(R4),$CKUAB ;GET UAB TO BILL TASK TO .IFTF' CALL $TSKRT ;REQUEST TASK EXECUTION) .IFTE/ CLR $CKUAB ;DO NOT NEED UAB ADDRESS ANYMOREA .ENDC240$: MOV R4,R0 ;SET ADDRESS OF BLOCK TO RELEASE% CMPB #C.SCHD,R5 ;PERIODIC REQUEST?R BEQ 50$ ;IF EQ YES5 CALL $DCLKA ;DEALLOCATE CLQ BLOCK WITH ACCOUNTINGR  JMP TDS ;I650$: MOV C.RSI+2(R0),R1 ;SET HIGH ORDER PART OF TIME/ MOV C.RSI(R0),R2 ;SET LOW ORDER PART OF TIME MOV R5,R4 ;SET REQUEST TYPER ;JWB170  .IF DF N$$DIR ;JWB170 ;JWB170T3 TSTB C.NAM(R0) ;IS THERE A UIC OR CTX ;JWB170O5 BEQ 55$ ;IF EQ, NO CONTEXT BLOCK POINTER ;JWB170< BIS #100000,R4 ;SET HIGH BIT TO INDICATE CTX PTR ;JWB170%55$: ;REFERENCE LABEL ;JWB170 ! .ENDC ;DF N$$DIR ;JWB170C ;JWB170C4 MOV C.TCB(R0),R5 ;SET ADDRESS OF REQUEST TASK TCB. CALL $CLINS ;REINSERT ENTRY IN CLOCK QUEUE  JMP TDS ;P;M; DEVICE TIME OUTT;E(DVOUT: TST $TTNS ;ONE SECOND ELAPSED? BNE ROBIN ;IF NE NO E MOV #$SCDVT,-(SP) ;SET ADDRESS OF DEVICE TABLE SCANNING CO-ROUTINE)10$: CALL @(SP)+ ;GET NEXT UCB ADDRESS ! BCS ROBIN ;IF CS END OF TABLEG$ MOV S.KRB(R4),R2 ;GET KRB ADDRESS BEQ 11$ ;IF EQ NO KRB , MTPS K.PRI(R2) ;;;SET THE DEVICE PRIORITY#11$: TSTB U.STS(R5) ;;;UNIT BUSY?) BPL 20$ ;;;IF PL NOS$ TSTB S.CTM(R4) ;;;TIMEOUT ACTIVE? BEQ 20$ ;IF EQ NO .IF DF M$$PRO9 CMPB #377,S.CTM(R4) ;WAITING FOR INTERPROCESSOR FORK ?N- BEQ 20$ ;IF EQ YES, DON'T TOUCH INTERLOCKS00SmqmzgM{gfffDATA .ENDC ; DF M$$PRO, DECB S.CTM(R4) ;;;DECREMENT TIMEOUT COUNT' BNE 20$ ;;;IF NE -- MORE TIME TO GON;E8; DRIVER HAS TIMED OUT. CALL HIM AT HIS TIMEOUT ENTRY.;  .IF DF M$$PRO1 DECB S.CTM(R4) ;;;SET TIMED OUT FLAG FOR LATER5$ MOV #12$,R3 ;;;SET UP FOR $EXDOP. CALL $EXDOP ;;;CALL ROUTINE TO CALL DRIVER;IC; AT THIS POINT, IF DOESNT HAVE A KRB ADDRESS, THEN HE WAS CALLEDO$; BECAUSE OF THE WAY $EXDOP WORKS.;Q!20$: MTPS #0 ;;;LOWER PRIORITYN BR 10$ ;GO BACK FOR MORE;C<; INTERNAL SUBROUTINE TO CALL DRIVER AT HIS TIMEOUT ENTRY.>; THIS SUBROUTINE IS EXECUTED ON THE CPU TO WHICH THE DRIVER; IS ATTACHED.;.(12$: MOV (R5),R3 ;RESTORE DCB ADDRESS$ MOV S.KRB(R4),R2 ;GET KRB ADDRESS BEQ 13$ ;IF EQ NO KRBC& MTPS K.PRI(R2) ;SET DEVICE PRIORITY)13$: TSTB U.STS(R5) ;;;UNIT STILL BUSY?H) BPL 30$ ;;;IF PL NO -- DON'T CALL HIM 4 TSTB S.CTM(R4) ;;;DO WE STILL SHOW HIM TIMED OUT?) BPL 30$ ;;;IF PL NO -- DON'T CALL HIMC' CLRB S.CTM(R4) ;;;SHOW HIM TIMED OUTB .ENDC= MOV #IE.DNR&377,R0 ;;;SET DEVICE NOT READY STATUS FOR DRVRC; MOV D.DSP(R3),R1 ;;;GET ADDRESS OF DRIVER DISPATCH TABLEV3 MOV KINAR5,-(SP) ;;;SAVE KERNEL INSTR ADDR REG 5G .IF DF K$$DAS2 MOV KDSAR5,-(SP) ;;;SAVE KERNEL DATA ADDR REG 5 .IFTF- MOV D.PCB(R3),R3 ;;;GET DRIVER PCB ADDRESSL+ BEQ 15$ ;;;IF EQ DRIVER IS PART OF EXECD8 MOV P.REL(R3),KINAR5 ;;;MAP THE DRIVER IN INSTR SPACE .IFTI7 MOV P.REL(R3),KDSAR5 ;;;MAP THE DRIVER IN DATA SPACE .IFTF(15$: TST R2 ;;;IS THERE A KRB ADDRESS BEQ 17$ ;;;IF EQ NO), MOVB K.CON(R2),R3 ;;;GET CONTROLLER INDEX" MOV (R2),R2 ;;;GET CSR ADDRESS; :; CALL DRIVER AT TIMEOUT ENTRY POINT WITH THE ARGUMENTS:; &; R0=DEVICE TIMEOUT STATUS 'IE.DNR'.; R2=ADDRESS OF DEVICE CSR.I; R3=CONTROLLER INDEX.+; R4=ADDRESS OF THE STATUS CONTROL BLOCK.P); R5=ADDRESS OF THE UNIT CONTROL BLOCK.S;(; IF S.KRB=0 THEN R2, R3 ARE UNDEFINED;P;+; ** W A R N I N G **.;; SPM HOOKPOINT NUMBER 64.;B+ ; DO NOT CHANGE THE INSTRUCTION FOLLOWING. ; LABEL WITHOUT CHECKING SPM ;- - $SPH64==. ;SPM CHANGES THE INSTRUCTION ATL! ;THE LOCATION OF THIS LABEL '17$: CALL @D.VOUT(R1) ;;;ENTER DRIVERS .IFT5 MOV (SP)+,KDSAR5 ;;;RESTORE KERNEL DATA ADDR REG 5  .ENDC6 MOV (SP)+,KINAR5 ;;;RESTORE KERNEL INSTR ADDR REG 5 .IF DF M$$PRO#30$: MTPS #0 ;;;ALLOW INTERRUPTS  RETURNW!" .IFF*##$20$: MTPS #0 ;;;ALLOW INTERRUPTS% BR 10$ ;GO FOR SOME MORE&' .ENDC()*;E*+; EXECUTIVE LEVEL ROUND ROBIN SCHEDULING,;S-.ROBIN: ;REF LABEL/01 .IF DF R$$NDC2!3 DEC $RNDCT ;TIME TO SCHEDULE?U4 BNE SWAP ;IF NE NO75 MOV $RNDC,$RNDCT ;RESET CLOCK TICKS TO NEXT INTERVALA<5 MOV #SWAP,-(SP) ;ASSUME DIRECT EXIT TO DISK SWAP ; BM3795 ; BM379D5 .IF DF M$$PRO ; BM379O5 ; BM379 <5 MOV #60$,-(SP) ;THIS WILL PREVENT MULTIPLE CALLS ; BM37935 ;TO $DRDSE IF MULTIPLE RUNNING TASKS ; BM379O5 ;ARE MOVED. ; BM3795 ; BM379O"5 .ENDC ; DF M$$PRO ; BM3795 ; BM379>7 MOV #$ACTHD-T.ACTL,R1 ;SET ADDRESS OF PREVIOUS ENTRY ;**-11810$: MOV R1,R0 ;SAVE ADDRESS OF PREVIOUS ENTRYC/9 MOV T.ACTL(R0),R1 ;GET ADDRESS OF NEXT ENTRY;)9 BEQ 60$ ;IF EQ END OF LIST ; BM3794; CMPB $RNDH,T.PRI(R1) ;PRIORITY IN RANGE? ;**-1< BLO 10$ ;IF LO NO/=20$: CMPB $RNDL,T.PRI(R1) ;PRIORITY IN RANGE? != BHI 60$ ;IF HI NO ; BM379P? ;**-1 @A .IF NDF M$$PRODB C TST T.STAT(R1) ;TASK BLOCKED?DE .IFF F*G BIT #^CTS.RUN,T.STAT(R1) ;TASK BLOCKED?HI .ENDCJKL BNE 30$ ;IF NE YES(M BIT #T2.SPN!T2.STP!T2.WFR,T.ST2(R1) ;N BEQ 40$ ;IF EQ NO-O30$: MOV R1,R0 ;SAVE ADDRESS OF LAST ENTRY;/P MOV T.ACTL(R0),R1 ;GET ADDRESS OF NEXT ENTRYC Q BR 20$ ;!R00SmTmgcccc40$: TST T.ACTL(R1) ;NULL TASK?"R BEQ 60$ ;IF EQ YES ; BM379R ; BM379R R .IF NDF M$$PRO ; BM379R ; BM379 7R CMP R1,$TKTCB ;ABOUT TO MOVE CURRENT TASK? ; BM379(!R BNE 45$ ;IF NE NO ; BM379>R MOV #$DRDSE,-(SP) ;FORCE SIGNIFICANT EVENT AT END ; BM379R ; BM379E"R .IFF ; NDF M$$PRO ; BM379R ; BM379$BR BIT #TS.RUN,T.STAT(R1) ;TASK RUNNING ON SOME PROCESSOR ; BM379!R BEQ 45$ ;IF EQ NO ; BM379 =R MOV #$DRDSE,(SP) ;FORCE SIGNIFICANT EVENT AT END ; BM379QR ; BM379;"R .ENDC ; DF M$$PRO ; BM379R ; BM379BDR45$: MOV T.ACTL(R1),T.ACTL(R0) ;REMOVE TCB FROM TASK LIST ; BM379+U MOV R1,R2 ;SAVE ADDRESS OF TCB ;**-2M(V MOV R0,R1 ;SET ADDRESS OF LAST ENTRY-W50$: MOV R1,R0 ;SAVE ADDRESS OF LAST ENTRYE/X MOV T.ACTL(R0),R1 ;GET ADDRESS OF NEXT ENTRY 4Y CMPB T.PRI(R1),T.PRI(R2) ;IN SAME PRIORITY CLASS?Z BEQ 50$ ;IF EQ YES1[ MOV R2,T.ACTL(R0) ;SET ADDRESS OF NEXT IN LAST(:\ MOV R1,T.ACTL(R2) ;SET ADDRESS OF NEXT IN REMOVED ENTRY(] MOV R2,R0 ;SET ADDRESS OF LAST ENTRY ^ BR 20$ ;_=_60$: RETURN ;TO SWAP, WITH POSSIBLE INTERMEDIATE ; BM379L!_ ;STOP AT $DRDSE ; BM379D` .ENDCabc;Hd; DISK SWAPPING ALGORITHM - REDUCE SWAPPING PRIORITY OF RESIDENT TASKSe;SfgSWAP: ;REF LABEL,hij .IF DF S$$WPCk3l DEC $SWPCT ;TIME TO MODIFY SWAPPING PRIORITIES??m BNE 70$ ;IF NE NOS<n MOV $SWPC,$SWPCT ;RESET CLOCK TICKS TO NEXT SWAP INTERVAL2o MOV $PARHD,R5 ;POINT TO PARTITION LIST LISTHEAD-p10$: TST P.SUB(R5) ;ANY MORE SUBPARTITIONS? q BEQ 20$ ;IF EQ NOR3r MOV P.SUB(R5),R5 ;POINT TO NEXT SUBPARTITION PCB>s BIT #PS.FXD!PS.CHK!PS.CKP!PS.CKR!PS.OUT!PS.COM,P.STAT(R5) ;3t BNE 10$ ;IF NE NOT CHECKPOINTABLE RESIDENT TASKE)u MOV P.HDR(R5),R4 ;POINT TO TASK HEADEREvw .IF DF X$$HDRx"y BNE 15$ ;IF NE RESIDENT HEADER/z MOV P.REL(R5),KISAR6 ;MAP TO EXTERNAL HEADER"{ MOV #140000,R4 ;AND POINT TO IT|} .IFTF ; DF X$$HDR~715$: CLR R0 ;CALCULATE THE MINIMUM SWAPPING PRIORITYT SUB $SWPR,R0 ;E .ENDC ; DF X$$HDR4 CMPB H.SPRI(R4),R0 ;SWAPPING PRIORITY AT MINIMUM? BLE 10$ ;IF LE YES, DECB H.SPRI(R4) ;REDUCE SWAPPING PRIORITY  BR 10$ ;020$: MOV P.MAIN(R5),R5 ;POINT BACK TO MAIN PCB$ MOV R5,R0 ;COPY MAIN PCB POINTER0 CALL $NXTSK ;ATTEMPT TO REALLOCATE PARTITION' MOV (R5),R5 ;POINT TO NEXT MAIN PCBE BNE 10$ ;IF NE THERE IS ONEA70$: ;REF LABEL .ENDC;5R; EXIT TIME DEPENDENT SCHEDULE IF THERE ARE NOT REMAINING UNPROCESSED CLOCK TICK;C0TIMXT: DEC $INTCT ;ANY MORE TICKS TO PROCESS? BGE 10$ ;IF GE YES  RETURN ;E10$: JMP UPTIM ;R;+"; **-$NLTMO-NULL TIMEOUT ROUTINE;MF; THIS ROUTINE MAY BE SPECIFIED AS THE TIMEOUT ROUTINE IN A DRIVER'SI; DISPATCH TABLE. IT SIMPLY BYPASSES ALL UNITS ON THE CURRENT DCB WHENP ; CALLED.M;C ; INPUTS:$; ); AS FOR NORMAL DRIVER TIMEOUT ROUTINE.;N ; OUTPUTS:;A; CURRENT DCB IS NO LONGER CONSIDERED FOR CURRENT TIMEOUT SCAN.E;-$NLTMO:: ;REFERENCE LABELC .IF DF K$$DAS0 CLR S$$SPC+4(SP) ;FORCE $SCDVT ON TO NEXT DCB .IFF ; DF K$$DAS+0 CLR S$$SPC+2(SP) ;FORCE $SCDVT ON TO NEXT DCB .ENDC ; DF K$$DAS4 INCB S.CTM(R4) ;RESET TIMEOUT COUNT FOR NEXT TIME  RETURN ;E .ENDRRENT DCB WHENP ; CALLED.M;C ; INPUTS:$; ); AS FOR NORMAL DRIVER TIMEOUT ROUTINE.;N .TITLE SYSDF .IDENT /10.02/;C; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; D. N. CUTLER 23-AUG-73;/; PREVIOUSLY MODIFIED FOR RSX-11M-PLUS V2.1 BY:;; D. R. DONCHIN ; T. LEKAS; T. M. MARTIN; B. S. MCCARTHY;$; MODIFIED FOR RSX-11M-PLUS V2.2 BY:;; H. HUANG 10-MAY-83 10.00;2; HH174 -- C00TmqmzgM{gfffDATALEAN UP ERROR CODES FOR LOGICAL NAME; DIRECTIVES;9; J.R. KAUFFMAN 23-FEB-84 10.01E;C9; JRK298 -- CHANGE CONDITIONALS FOR LOGICAL NAME SUPPORTS;R ; J. C. FRANZINI 22-AUG-84 10.02;DA; JCF173 -- EXPLAIN SYSDEF AND RESOLUTION OF CONDITIONAL OFFSETS; 4; SYSTEM GLOBAL AND CONTROL BLOCK OFFSET DEFINITIONS;-,; GLOBALLY DEFINE THE HIGHEST VECTOR ADDRESS;  .GLOBL R$$MPL,V$$CTR ; D; DEFINE SYSTEM DEPENDENT CONTROL BLOCK OFFSETS AND LENGTHS GLOBALLY;-;1N; The static data structure offsets are defined by invoking the macros without$; the SYSDEF argument. For example:;; .MCALL UCBDF$G; UCBDF$;S0; The static offsets are also defined in EXELIB.;UN; The variable offsets depend on RSXMC conditionals. They are defined here byM; invoking the macros with the SYSDEF argument, and the definitions end up inFI; RSX11M.STB. References in privileged tasks to the variable offsets areE/; resolved when the task is linked to the Exec.H;LO; Tasks should never invoke the data structure macros with the SYSDEF argument,aH; but rather should let the variable offset definitions be resolved from ; RSX11M.STB. ; * .MCALL HWDDF$,PCBDF$,PKTDF$,SCBDF$,TCBDF$ .MCALL UCBDF$,F11DF$s .MCALL ITBDF$ i .MCALL DCBDF$ d .MCALL WDBDF$ .IF DF L$$GCL .MCALL LNBDF$ .ENDC ;DF L$$GCLi5 HWDDF$ ,<=>,SYSDEF ;DEFINE CONDITIONAL MAPPING REGS.a% ;AND FEATURE MASK BITS (VMR LOOKSo& ;FOR F4.CXD TO DISTINGUISH BL9 AND ;BEYOND SYSTEMS.)n7 PCBDF$ <:>,<=>,SYSDEF ;DEFINE PCB OFFSETS AND LENGTH u/ PKTDF$ ,<=>,SYSDEF ;DEFINE I/O PACKET LENGTH e7 ITBDF$ <:>,<=>,SYSDEF ;DEFINE ITB OFFSETS AND LENGTH C* DCBDF$ ,<=>,SYSDEF ;DEFINE DDT OFFSETS ( SCBDF$ <:>,,SYSDEF ;DEFINE SCB OFFSETS, TCBDF$ <:>,<=>,SYSDEF ;DEFINE TCB LENGTH 7 UCBDF$ <:>,<=>,,SYSDEF ;DEFINE CONDITIONAL UCB OFFSETSH5 F11DF$ <:>,<=>,SYSDEF ;DEFINE FILES-11 BLOCK OFFSETS & WDBDF$ ;DEFINE WDB OFFSETS AND BITS .IF DF L$$GCL7 LNBDF$ <:>,<=>,SYSDEF ;DEFINE LNB OFFSETS AND LENGTHS, .ENDC ;DF L$$GCLF1 WS.UDS==WS.UDS ;MAKE USER D SPACE OFFSET GLOBALP e;I9; CAUSE OFFSET DEFINITIONS FROM PREFIX FILES TO BE LISTEDB; S$$YDF=0;I"; SYSTEM GLOBAL SYMBOL DEFINITIONS;;; DIRECTIVE STATUS CODES;:;,8; INSUFFICIENT DYNAMIC CORE AVAILABLE TO SATISFY REQUEST; D.RS1==-1. ;;H,; SPECIFIED TASK NOT INSTALLED IN THE SYSTEM;FD.RS2==-2. ;;N; UNASSIGNED LUN;SD.RS5==-5. ;;L; DRIVER NOT LOADED ;FD.RS6==-6. ;;E; TASK NOT ACTIVEF;$D.RS7==-7. ;; F; TASK NOT SUSPENDED/NO DATA QUEUED/TASK CHECKPOINTING ALREADY ENABLEDK; OR DISABLED/AST RECOGNITION ALREADY ENABLED OR DISABLED/AST ENTRY ALREADYA ; UNSPECIFIEDT;SD.RS8==-8. ;;S!; ISSUING TASK NOT CHECKPOINTABLEN;CD.RS10==-10. ;;Y; RECEIVE BUFFER IS TOO SMALL;H D.RS15==-15. T;S; PRIVILEGE VIOLATIONF;D.RS16==-16. ; ; %; VECTOR ALREADY IN USE (CINT$) V ; D.RS17==-17. ;; NO SWAP SPACE AVAILABLE;A N D.RS18==-18. A ; ; ILLEGAL VECTOR (CINT$) ; D.RS19==-19. ;S; ILLEGAL TABLE NUMBER C;ED.RS20==-20. ;;; LOGICAL NAME NOT FOUND;KD.RS21==-21. ; S;1.; DIRECTIVE ISSUED/NOT ISSUED FROM AST ROUTINE; D.RS80==-80. ; ; 8; CANNOT MAP ISR OR DISABLE-INTERRUPT ROUTINE (CINT$) ; D.RS81==-81. ;S; WINDOW HAS IO IN PROGRESS; O D.RS83==-83. A;; ALIGNMENT ERROR1;D.RS84==-84. ;; ; ADDRESS WINDOW OVERFLOW ; D.RS85==-85. ;;.; INVALID REGION ID;D.RS86==-86. ;;; INVALID WINDOW ID;;D.RS87==-87. ;;U.; INVALID SEND BUFFER SIZE (GREATER THAN 255.);U N D.RS89==-89. T;U!; SPECIFIED LUN IS LOCKED IN USE. ; D.RS90==-90. ;;I ; INVALID UIC ;T D.RS91==-91. ; '; INVALID DEVICE AND/OR UNIT SPECIFIED. ; D.RS92==-92. ;00TmUmgcccc; ; INVALID TIME PARAMETER;.D.RS93==-93. ;;O ; PARTITION/REGION NOT IN SYSTEM;DD.RS94==-94. ;; ; INVALID PRIORITY;D.RS95==-95. ;; ; INVALID LUN8; D.RS96==-96. ;;W+; INVALID EFN OR REQUIRED EFN NOT SPECIFIED ;DD.RS97==-97. ;;N8; PART OF DPB IS OUTSIDE OF ISSUING TASK'S ADDRESS SPACE;ED.RS98==-98. ;;=; INVALID DIC OR DPB SIZEI;D.RS99==-99. ;;; LOGICAL NAME SUPERSEDED ;TD.RSP3==3. ;;S ; EFN WAS SET;D.RS22==2. ;;R; EFN WAS CLEAR9; D.RS00==0. ;;E9; IF DYNAMIC ALLOCATION IS PRESENT DEFINE D$$YNM GLOBALLY ;OD$$YNM==0 ;ALWAYS PRESENT U;<; IF 11/70 EXTENDED MEMORY IS PRESENT DEFINE M$$EXT GLOBALLY;P .IIF DF M$$EXT , M$$EXT==0 ; N; 1; IF MULTIPROCESSOR SYSTEM DEFINE M$$PRO GLOBALLYA; .IIF DF M$$PRO , M$$PRO==M$$PRO; 8; IF MEMORY MANAGEMENT IS PRESENT DEFINE M$$MGE GLOBALLY;PM$$MGE==0 ;ALWAYS PRESENT S ;@; IF SEND / RECEIVE BY REFERENCE PRESENT, DEFINE P$$SRF GLOBALLY; E .IIF DF P$$SRF , P$$SRF==P$$SRF D;N+; IF DSPACE PRESENT, DEFINE K$$DAS GLOBALLY ;S .IIF DF K$$DAS , K$$DAS==K$$DAS N; '; IF P$$D70 DEFINED, DEFINE IT GLOBALLY; . .IIF DF P$$D70 , P$$D70==P$$D70 .IF DF B$$LIN% $BASLN==1 ;INDICATE BASELINE SYSTEM .IFF ; DF B$$LIN % $BASLN==0 ;INDICATE BASELINE SYSTEME .ENDC ; DF B$$LIN; ?; DEFINE MASK OF FEATURES SELECTED AT SYSGEN TIME FOR INCLUSION; IN RSX11M.STB FILE.R;R SFMSK=0 ; .IF DF S$$EXC' SFMSK=SFMSK!SF.STD ;STANDARD EXECUTIVEF .ENDC .IF DF P$$GEN< SFMSK=SFMSK!SF.PGN ;PREGENERATED SYSTEM (EX. RL02/RC25 KIT) .ENDC; DEFINE GLOBAL SYMBOL$ $SGNMK==SFMSK ;SYSGEN FEATURE MASK  .END0==P$$D70 .IF DF B$$LIN% $BASLN==1 ;INDICATE BASELINE SYSTEM .IFF ; DF B$$LIN % $BASLN==0 ;INDICATE BASELINE SYSTEME .ENDC ; DF B$$LIN; ?; DEFINE MASK OF FEATURES SELECTED AT SYSGEN TIME FOR INCLUS .TITLE DLTBLV .IDENT /01.05/;N7; COPYRIGHT (c) 1984 BY DIGITAL EQUIPMENT CORPORATION.R; ALL RIGHTS RESERVED.;R<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; B. S. MCCARTHY 5-MAY-84 ; ;P; MODIFIED BY:; ; J. R. KAUFFMAN 1-MAY-84 01.01;N5; JRK298 -- ADD ENHANCED DEFINITIONS TO DRLOG TABLES;.; T. LEKAS 11-JULY-84 01.02; %; TL301 -- ADD PARSE/MERGE FUNCTIONS ;K ; J. R. KAUFFMAN 1-MAY-85 01.04;B<; JRK303 -- ADD TABLE NUMBER HASHING FOR P/OS COMPATIBILITY;P!; J. R. KAUFFMAN 24-MAY-85 01.05S;E7; JRK307 -- ADD ADDITIONAL LOGICAL DIRECTIVES FOR P/OSM;B); LOGICAL NAME DIRECTIVES DISPATCH TABLES ; A; THIS MODULE WAS SEPARATED FORM QITBL TO FACILITATE PLACEMENT INO); THE FOURTH DIRECTIVE COMMON WITH DRLOG.0;1 .PAGE A .IF DF L$$GCL: .MCALL LNMDF$ ;DEFINE LOGICAL NAME SUBFUNCTION FLAG BITS LNMDF$  .ENDC ;DF L$$GCLI% .MACRO LNSFN ADDR,DPBSIZ,DIRCOM,COND .IF NB COND .IF DF COND .WORD ADDR .BYTE DPBSIZI .BYTE DIRCOM  .IFFN .BLKW 2 .ENDC ;DF CONDJ .IFFA .BLKW 2 .ENDC ;NB CONDS .ENDM .PAGE;+<; SUBFUNCTION DISPATCH TABLE FOR THE LOGICAL NAME DIRECTIVES;- .IF DF L$$GCL;$LSTLG::.WORD 0 ;STORAGE WORD FOR LAST LNB IN LOOKUP CHAINL@$LTBUF::.BLKB 8. ;STORAGE BUFFER FOR DEVICE MNEMONIC AND BINARY) ; UNIT CONVERSION TO AND FROM ASCII<$LGBUF::.BLKW 12. ;STORAGE AREA FOR CREATE DESCRIPTOR BLOCK;+4; LOGICAL NAME OFFSET TABLE FOR TRANSLATION ATTEMPTS;-!$LTMSK::.BYTE LT.TSK ;TASK TABLE.3 .BYTE LT.USR ;USER TABLE (FOR P/OS COMPATIBILITY)N .BYTE LT.SES ;SESSION TABLE .BYTE LT.GRP ;GROUP TABLEB .BYTE LT.SYS ;SYSTEM TABLE$MSKBT::.BYTE 1  .BYTE 2 .BYTE 20R .BYTE 4 .BYTE 10R .BYTE 40N .BYTE 100 .BYTE 200$TRANL::.BYTE LT.SYS .BYTE LT.GRPE+ .BYTE 4 ;LT.USR (FOR P/OS) COMPATIBILITYA .BYTE LT.TSK* .BYTE 2 ;LT.SES - RSX LOCAL/LOGIN TABLE .EVEN .ENDC00UmmmmmffDATA ;DF L$$GCLO;+E; SUBFUNCTION TABLE FOR ALL DIRECTIVE ROUTINES ACCESSED THROUGH DRLOG ;- .IF DF L$$GCL!N$$DIR;$LNSFT::1 LNSFN $LNFCL,7,3,L$$GCL ;CLOG$ - P/OS COMPATIBLEA6 LNSFN $LNFTL,9.,3,L$$GCL ;TLOG$ - OLD P/OS COMPATIBLE1 LNSFN $LNDEL,5,3,L$$GCL ;DLOG$ - P/OS COMPATIBLE LNSFN $LNFSD,5,3,N$$DIR ;SDIR$ LNSFN $LNFGD,6.,3,N$$DIR ;GDIR$ LNSFN $LNFSS,7.,4,L$$GCL ;FSS$Y LNSFN $LNCHN,5.,4,L$$GCL ;ACHN$! LNSFN $LNRMS,13.,4,L$$GCL ;PRMS$;! LNSFN $LNFCS,13.,4,L$$GCL ;PFCS$V7 LNSFN $LNFTL,10.,3,L$$GCL ;TLOG$ - NEW P/OS COMPATIBLEL3 LNSFN $LNFTL,10.,3,L$$GCL ;RLOG$ - P/OS COMPATIBLE. LNSFN $LNFCL,7,3,L$$GCL ;CLON$ LNSFN $LNDEL,5,3,L$$GCL ;DLON$ ! LNSFN $LNFTL,10.,3,L$$GCL ;TLON$3! LNSFN $LNFTL,10.,3,L$$GCL ;RLON$EC$LNFHI==<<.-$LNSFT>/4.>-1. ;DEFINE HIGHEST LOGICAL NAME SUBFUNCTION, .ENDC ;DF N$$DIR!L$$GCL I .END$ LNSFN $LNFSS,7.,4,L$$GCL ;FSS$Y LNSFN $LNCHN,5.,4,L$$GCL ;ACHN$! LNSFN $LNRMS,13.,4,L$$GCL ;PRMS$;! LNSFN $LNFCS,13.,4,L$$GCL ;PFCS$V7 LNSFN $LNWhich diskette driveL.; .ASKS is one of the ways Indirect prompts you. In this case you name theM.; drive with the new disk in it. Once you've answered, the name of the driveN.; is substituted wherever 'DISK' appears in a command. Although Indirect hasL.; features that allow you to check for correct syntax, this example commandB.; file does not check to make sure you entered a valid disk name. ;0 ; Labels can have up to 12 letters and numbers. ;# .ASKS LABEL What label do you wantSM.; The volume label is a combination identifier and password to the diskette. ;.; No one can mount the diskette without knowing the label.  ;! MOUNT/FOREIGN/NOSHAREABLE 'DISK'v$.; All disk volumes must be mounted. ANALYZE/MEDIA 'DISK'o.; Looking for bad blocks. INITIALIZE 'DISK' 'LABEL'(.; Putting the RSX format on the volume. DISMOUNT 'DISK' e'.; Dismounting from the /FOREIGN mount.! MOUNT/NOSHAREABLE 'DISK' 'LABEL'n#.; Mounting again as an RSX volume.  CREATE/DIRECTORY 'DISK'K.; Creating a new directory on the volume. It will have the same directorya .; name as your login directory. ;' ; Diskette in 'DISK' is ready for use.E ;'v$.; All disk volumes must be mounted. ANALYZE/MEDIA 'DISK'o.; Looking for bad blocks. INITIALIZE 'DISK' 'LABEL'(.; Putting the RSX format on the volume. DISMOUNT 'DISK' e'.; Dismounting from the /FOREIGN mount.! MOUNT/NOSHAREABLE 'DISK' 'LABEL'n#.; Mounting again as an RSX volume.  CREATE/DIRECTORTI:DON'T LOSE YOUR HEADTI:TO GAIN A MINUTETI:YOU NEED YOUR HEADTI:YOUR BRAINS ARE IN IT SHOW DEVICES SHOW USERS SHOW TIMECNC THIS TASK (TMCLI) ILLUSTRATES THE USE OF THE CLI CONTROL DIRECTIVES PRESENT )C IN RSX-11M V4.0 AND RSX-11M-PLUS V2.0. CFC WHEN SET UP AS A TERMINAL'S CLI, IT PROVIDES THE FOLLOWING COMMANDS:CC T -> TYPE FILEC M -> SET TERMINAL TO MCRC>C IF THE FIRST TWO LETTERS OF THE COMMAND ARE NOT "T" FOLLOWED3C BY A SPACE, OR "M" FOLLOWED BY A CARRIAGE RETURN,8C THE COMMAND IS PASSED TO MCR FOR EXECUTION. THEREFORE,HC USERS AT TERMINALS SET TO THIS CLI WILL SEE THE ENTIRE MCR COMMAND SETFC 00mmgccccAS BEING PRESENT, PLUS THE "T" AND "M" COMMANDS. IF THE "DPR" SWITCHFC IS INCLUDED ON THE CLI /INIT COMMAND, USERS WILL KNOW IMMEDIATELY IFGC THEIR TERMINAL IS SET TO THIS CLI BY THE PRESENCE OF THE DOUBLE RIGHT C ANGLE BRACKET AS THE PROMPT.COFC IF IT IS INITIALIZED WITH THE SYSTEM MESSAGE OPTION ENABLED, IT WILLDC GREET USERS WHEN THEIR TERMINAL IS SET TO THE CLI, AND SAY GOODBYE C TO THEM WHEN THEY SWITCH AWAY.CFBC IN ORDER TO BRING THIS CLI UP ON THE SYSTEM, ISSUE THE FOLLOWINGC COMMAND SEQUENCE:GCEC >FOR TMCLI,TMCLI/-SP=TMCLI.C >TKB TMCLI/FP,TMCLI/-SP=TMCLI,[1,1]FOROTS/LB C >INS TMCLI/CLI=YES/TASK=...TMC9C >CLI /INIT=TMCLI/MESSAGE/DPR="<15><12>/>>/"/TASK=...TMCECE?C IF USING FORTRAN IV-PLUS INSTEAD OF FORTRAN IV, THE FIRST TWO C COMMANDS ABOVE WOULD BE:CY C >F4P TMCLI,TMCLI/-SP=TMCLI.FTN.C >TKB TMCLI/FP,TMCLI/-SP=TMCLI,[1,1]F4POTS/LBC ;C TO SET TERMINALS TO THIS CLI, ISSUE THE FOLLOWING COMMAND 6C WHERE TTN: IS REPLACED BY THE TERMINAL NUMBER OR TI:COC >SET /CLI=TTN:TMCLIECHC NOTE THAT THE PROMPT ISSUED IN RESPONSE TO A CONTROL/C DEFAULTS TO THE%C NAME OF THE CLI WHICH IS "TMCLI>". CC JC IT CAN BE ELIMINATED FROM THE SYSTEM BY THE FOLLOWING COMMANDS, ASSUMINGC NO TERMINALS ARE SET TO IT: C C >CLI /ELIM=TMCLI C >REM ...TMCUCBHC EXPERIMENT WITH THE OTHER OPTIONS ON THE CLI /INIT COMMAND, THE ENABLELC AND DISABLE CLI COMMANDS, AND LEAVING OFF THE /MESSAGE SWITCH ON THE /INITGC COMMAND TO OBSERVE THE EFFECT THEY HAVE. ALSO TRY CHANGING THE /TASK=LEC SWITCH ON THE INS AND CLI /INIT COMMAND TO "/TASK=TMCLI" AND NOTICELJC THAT ONLY ONE COPY OF THE TASK WILL EXIST FOR ALL TERMINALS, RATHER THANEC ONE PER COMMAND. IF THIS IS DONE, YOU SHOULD ALSO CHANGE THE OPTIONRLC ON THE GTCMCI DIRECTIVE FROM GC.CEX TO GC.CST SO THE TASK WILL STAY ACTIVE6C BUT STOPPED WHEN NO COMMANDS ARE OUTSTANDING FOR IT.CBCC BUFFER AREASCOKC COMMAND BUFFER - THIS BUFFER IS USED IN THE GTCMCI DIRECTIVE. IT CON-ECC TAINS INFORMATION ON THE COMMAND RECEIVED (8 BYTES) %C AND THE COMMAND TEXT.L BYTE CMDBUF(264)H7 INTEGER*2 CBLEN ! NOTE THAT ON M+ THE MAXIMUM COMMAND," DATA CBLEN/263/ ! LENGTH IS 255.< INTEGER*2 GCCDV, GCCCL ! ASCII DEV NAM, # CHARS IN CMD LINEA BYTE GCCCT, GCCUN, GCCBF(255) ! # OF CHARS, TERMINAL UNIT #, CMD B EQUIVALENCE (GCCDV,CMDBUF), (GCCCL,CMDBUF(5)), (GCCCT,CMDBUF(4)),+ 1 (GCCBF,CMDBUF(9)), (GCCUN,CMDBUF(3))ECS@C INFORMATION BUFFER - ALSO RETURNED IN THE GTCMCI DIRECTIVE.CM BYTE IBUF(14) INTEGER*2 GCCPU; DATA IBLEN/14/,GCCPU/9/ ! LENGTH OF IBUF, LOGIN UIC OFFSET2? INTEGER*4 GCCOA ! ADDR OF OFFSPRING CONTROL BLOCK FROM PARENTD EQUIVALENCE (GCCOA,IBUF(7))C)C BUFFER IN WHICH TO GENERATE COMMANDSCCS5 BYTE BUF(72) ! BUFFER IN WHICH TO GENERATE COMMANDSR; REAL*8 TCMD(2) ! FOR CONVENIENCE IN ASSIGNMENT STATEMENTS, EQUIVALENCE (BUF,TCMD)(C,C MCR TASK NAME IN RAD50GCN) INTEGER*4 IMCR ! MCR TASK NAME IN RAD50  DATA IMCR/6RMCR.../CC&C DIRECTIVE SYMBOLIC VALUE DEFINITIONSC2% INTEGER*2 GCCCS, GCCEX, GCCST, GCCNDTH DATA GCCCS, GCCEX, GCCST, GCCND /0, 1, 2, 128/ ! INCP VALUES IN GTCMCI% DATA ISCLR /0/ ! IS.CLR RETURN CODEOG INTEGER*2 CMELM, CMEXT, CMLKT, CMRMT ! TERMINAL CODES FOR SYSTEM MSGS(- DATA CMELM, CMEXT, CMLKT, CMRMT /5, 6, 7, 8/RC* C CLI CODECRLC TO FORCE THE CLI TO EXIT INSTEAD OF RETURNING, THE GC.CEX OPTION IS SPECI-KC FIED IN THE GTCMCI DIRECTIVE BELOW. IF THE CLI IS INSTALLED SO THAT ONLYMHC ONE COPY OF THE TASK WILL EXIST FOR ALL TERMINALS, CHANGE THE VARIABLEJC GCCEX BELOW TO GCCST. THIS SPECIFIES THE GC.CST OPTION SO THAT THE TASKGC WILL STAY ACTIVE BUT STOPPED WHEN NO COMMANDS ARE OUTSTANDING FOR IT.RCCG 1 CALL GTCMCI(CMDBUF,CBLEN,IBUF,IBLEN,0,GCCEX,IDS) ! GET CMD FOR CLI, IF (IDS .LT. 0) GO TO 100C8FC IF THE GTCMCI DIRECTIVE HAD THE GC.CST OPTION SPECIFIED, WE MAY HAVE5C JUST BEEN UNSTOPPED, SO WE HAVE TO GET THE COMMAND.CCE6 IF (IDS .EQ. ISCLR) GO TO 1 ! WERE WE JUST UNSTOPPED? O8 IF (GCCDV .EQ. 0) GO TO 200 ! IS THIS A SYS00mmmmmffDATATEM MESSAGE? 4 IGCCUN = GCCUN ! CONVERT BYTE TO INTEGER (UNIT #); CALL ASNLUN(5,GCCDV,IGCCUN,IDS) ! ASSIGN TERMINAL TO LUN 5C) IGCCCT=GCCCT ! CONVERT BYTE TO INTEGERC IF (IGCCCT .GE. 0) GO TO 5I6 IGCCCT = 256 + IGCCCT ! CONVERT NEGATIVE TO UNSIGNEDH 5 IF (IGCCCT .LT. GCCCL) GOTO 150 ! DID ENTIRE COMMAND FIT IN BUFFER?CAEC AT THIS POINT, THE CLI HAS A COMMAND TO BE PROCESSED. THE CODE FROM =C THE LABEL 1 TO HERE SHOULD BE FAIRLY COMMON AMONG ALL CLIS.CJC FROM THIS POINT ON, THE CODE WILL BE SPECIFIC TO THE PARTICULAR LANGUAGEDC THIS CLI IS IMPLEMENTING. COMMANDS CAN BE ADDED OR DELETED AT WILLDC BY MODIFYING CODE IN THIS SECTION. AS STATED ABOVE, THIS EXTREMELYEC SIMPLE CLI PROVIDES TWO COMMANDS, AND GIVES EVERYTHING ELSE TO MCR.TIC THIS CREATES AN OPEN ENDED ENVIRONMENT. REJECTING UNRECOGNIZED COMMANDSNGC INSTEAD OF PASSING THEM TO MCR WOULD LIMIT THE TERMINAL USER'S USE OF AC THE SYSTEM TO ONLY THOSE OPERATIONS ALLOWED BY THE CLI. THIS IS HC A SECURE WAY OF CONTROLLING SYSTEM USE, IN CASES WHEN IT IS NECESSARY.AC IN THIS EXAMPLE, CHANGING THE "GO TO 50" BELOW, TO A "GO TO 60"TCC WOULD CREATE AN ENVIRONMENT WHERE THE ONLY OPERATION A USER COULDSHC PERFORM WOULD BE TO TYPE FILES ON THE TERMINAL, OR SWITCH BACK TO MCR.JC ALL OF THE REST OF RSX IS TOTALLY INACCESSABLE. IF NO MEANS OF SWITCHINGDC BACK TO MCR IS PROVIDED, IT WOULD BE IMPOSSIBLE FOR THE USER TO DO2C ANYTHING THE CLI DOES NOT EXPLICITLY LET HIM DO.COC IS IT A "T" COMMAND?C < IF ((GCCBF(1) .EQ. 'T') .AND. (GCCBF(2) .EQ. ' ')) GO TO 10CSIC CHANGE THE NEXT IF STATEMENT TO "GO TO 60" TO ELIMINATE PASSING UNKNOWN C COMMANDS TO MCR.CM C IS IT ALSO NOT AN "M" COMMAND?COB IF ((GCCBF(1) .NE. 'M') .OR. (GCCBF(2) .NE. 13)) GO TO 50 ! MCTBC THE USER HAS ENTERED AN "M" COMMAND, SO SET THE TERMINAL TO MCR.CF TCMD(1) = 'SET /MCR'C$ TCMD(2) = '=TI: ' ! SET /MCR=TI:7 IGRP = IBUF(GCCPU+1) ! (CONVERT BYTE TO INTEGER) GROUPY( IMEM = IBUF(GCCPU) ! MEMBER PART OF UICC*C ISSUE RPOI$ DIRECTIVE TO EXECUTE COMMANDC < CALL RPOI(IMCR,IGRP,IMEM,,TCMD,12,,GCCDV,IGCCUN,,GCCOA,IDS)# IF (IDS .LE. 0) GO TO 110 ! ERROR?M GO TO 1 ! BACK TO STARTCNCC THE USER HAS ENTERED A "T" COMMAND SO CONSTRUCT THE NECESSARY PIP1C COMMAND AND SEND IT TO MCRCS> 10 TCMD(1) = 'PIP TI:=' ! PUT BEGINNING OF PIP CMD IN BUFFER& I2 = 8 ! POINTER INTO TARGET BUFFER= DO 20, I1 = 10, CBLEN ! BEGIN AT SPACE AFTER THE T IN CMDBUFI< IF (CMDBUF(I1) .EQ. 13) GO TO 30 ! END OF COMMAND? ()6 IF (CMDBUF(I1) .EQ. ' ') GO TO 20 ! SKIP ANY SPACES! I2 = I2 + 1 ! COUNT CHARACTERG1 BUF(I2) = CMDBUF(I1) ! COPY INTO OUTPUT BUFFERR 20 CONTINUE!; 30 IGRP = IBUF(GCCPU+1) ! (CONVERT BYTE TO INTEGER) GROUPO( IMEM = IBUF(GCCPU) ! MEMBER PART OF UICCD*C ISSUE RPOI$ DIRECTIVE TO EXECUTE COMMANDC < CALL RPOI(IMCR,IGRP,IMEM,,TCMD,I2,,GCCDV,IGCCUN,,GCCOA,IDS)# IF (IDS .LE. 0) GO TO 110 ! ERROR?G GO TO 1 ! BACK TO STARTCUCC IN THE ABOVE SECTION OF CODE, THE RPOI DIRECTIVE WAS USED TO PASSI9C THE PIP COMMAND TO THE MAIN COMMAND DISPATCHER (MCR...) BC WHICH WILL START A COPY OF PIP AND GIVE IT THE COMMAND. THE RPOIDC DIRECTIVE COULD BE USED TO GIVE THE COMMAND DIRECTLY TO ...PIP AND<C GIVE THE RESULTING TASK A DIFFERENT NAME. IN THIS EXAMPLE,>C WE COULD CALL THE RESULTING PIP TASK "TYPTNN" WHERE THE LASTDC THREE CHARACTERS (TNN) ARE REPLACED BY A DEVICE NAME CHARACTER ANDAC UNIT NUMBER. FOR EXAMPLE, IF THE "T" COMMAND WAS TYPED ON TT10:CDC THE RESULTING TASK NAME COULD BE MADE TO BE "TYPT10". THIS HAS THEGC ADVANTAGE OF ALLOWING THE TASK TO BE ABORTED BY AN "ABO TYP" COMMAND,PEC INSTEAD OF "ABO PIP", THUS THE USER WOULD NOT HAVE TO KNOW THAT THEHEC "T" COMMAND HE ISSUED IS ACTUALLY BE SERVICED BY THE PIP TASK. THIS @C IS EXACTLY WHAT THE DCL CLI DOES. IT IS NOT DONE HERE IN ORDER@C TO SIMPLIFY THE EXAMPLE. PICKING UP THE TERMINAL NAME AND UNITHC NUMBER, CONVERTING IT TO RAD50, AND SUPPLYING IT IN THE RPOI DIRECTIVEHC ALONG WITH A DIRECT REQUEST OF PIP IS LEFT AS AN EXERCISE TO THE USER.>C (BE CAREFUL ON M-P00mmgccccLUS SYSTEMS WITH MORE THAN 64. TERMINALS).IC NOTE THAT REQUESTING PIP DIRECTLY AVOIDS A SUBSTANTIAL AMOUNT OF SYSTEMA C OVERHEAD.ACHCCT5C COMMAND IS NOT "T" OR "M", SO GIVE IT TO MCR AS IS.TC.; 50 IGRP = IBUF(GCCPU+1) ! (CONVERT BYTE TO INTEGER) GROUPR( IMEM = IBUF(GCCPU) ! MEMBER PART OF UIC( IGCCCT = GCCCT ! # OF CHARS IN COMMANDC *C ISSUE RPOI$ DIRECTIVE TO EXECUTE COMMANDC A CALL RPOI(IMCR,IGRP,IMEM,,GCCBF,IGCCCT,,GCCDV,IGCCUN,,GCCOA,IDS)E# IF (IDS .LE. 0) GO TO 110 ! ERROR?N GO TO 1 ! BACK TO STARTC6CC CONTROL IS TRANSFERED HERE IF UNKNOWN COMMANDS ARE TO BE REJECTEDI!C INSTEAD OF BEING PASSED TO MCR.C 60 WRITE (5,62)S 62 FORMAT('0ILLEGAL COMMAND')R GO TO 1 ! BACK TO STARTCGC ERROR HANDLING CODE CI( 100 WRITE (5,102) IDS ! ERROR IN GTCMCI9 102 FORMAT('0FATAL ERROR IN GTCMCI DIRECTIVE. DSW=',I6)  GO TO 250 ! EXITCV& 110 WRITE (5,112) IDS ! ERROR IN RPOI7 112 FORMAT('0FATAL ERROR IN RPOI DIRECTIVE. DSW=',I6)  GO TO 250 ! EXITC!: 150 WRITE (5,152) ! ENTIRE COMMAND DID NOT FIT IN BUFFER4 152 FORMAT('0SORRY, PART OF YOUR COMMAND WAS LOST') GO TO 1 ! BACK TO STARTC4C A SYSTEM MESSAGE WAS RECEIVED INSTEAD OF A COMMANDCR 200 CONTINUEBE IF (GCCUN .EQ. CMLKT) GO TO 210 ! IS IT A NEW TERMINAL LINKED TO US?EB IF (GCCUN .EQ. CMRMT) GO TO 220 ! IS IT A TERMINAL BEING REMOVED?A IF (GCCUN .EQ. CMEXT) GO TO 250 ! IS IT AN ELIMINATE ALL PACKET?PC IF (GCCUN .EQ. CMELM) GO TO 250 ! IS IT A CLI ELIMINATION MESSAGE?2& GO TO 1 ! IGNORE ALL OTHER MESSAGESCEC ISSUE WELCOME MESSAGEUCRB 210 IGCCUN = CMDBUF(11) ! CONVERT BYTE TERMINAL UNIT # TO INTEGERC CALL ASNLUN(5,GCCBF,IGCCUN,IDS) ! ASSIGN LUN 5 TO SPECIFIED DEVICEA WRITE (5,212)* 212 FORMAT('0WELCOME TO THE EXAMPLE CLI') GO TO 1 ! BACK TO STARTCSC ISSUE GOOD BYE MESSAGEC B 220 IGCCUN = CMDBUF(11) ! CONVERT BYTE TERMINAL UNIT # TO INTEGERC CALL ASNLUN(5,GCCBF,IGCCUN,IDS) ! ASSIGN LUN 5 TO SPECIFIED DEVICEO WRITE (5,222)- 222 FORMAT('0GOOD BYE FROM THE EXAMPLE CLI')L GO TO 1 ! BACK TO STARTCE=C WHEN AN ELIMINATE ALL MESSAGE IS RECEIVED, EXIT IMMEDIATELYMCL 250 CONTINUEG CALL EXIT END F,IGCCUN,IDS) ! ASSIGN LUN 5 TO SPECIFIED DEVICEA WRITE (5,212)* 212 FORMAT('0WELCOME TO THE EXAMPLE CLI') GO TO 1 ! BACK TO STARTCSC ISSUE GOOD BYE MESSAGEC B 220 IGCCUN = CMDBUF(11) ! CONVERT BYTE TERMINAL UNIT # TO INTEGERC CALL ASNLUN(5,GCCBF,IGCCUN,IDS) ! ASSIGN LUN 5 TO SPECIFIED DEVICEO WRITE (5,222)- 222 FORMAT('0GOOD BYE FROM THE EXAMPLE CLI')L! .TITLE BMDRV - BLOCK MOVE DRIVER .IDENT /01/;+;; COPYRIGHT (c) 1981,1982 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; VERSION: 01.00; DATE: 1-APR-82; AUTHOR: MARIO DENOBILI;<; THIS IS A SAMPLE DRIVER WHICH DEMONSTRATES HOW TO USE SOME;; OF THE MORE SOPHISTICATED EXECUTIVE SERVICES AVAILABLE TO(; I/O DRIVERS. THIS DRIVER DEMONSTRATES:;L>; 1) THE CHECKING OF ADDITIONAL USER BUFFERS PRIOR TO QUEUEING; AN I/O PACKET.L;U*; 2) USE OF THE CLOCK QUEUE FROM A DRIVER.;&; 3) USE OF THE BUFFERED I/O MECHANISM;N9; 4) USE OF THE GENERAL BUFFERED I/O KERNEL AST MECHANISM ;M#; 5) USE OF REGION LOAD KERNEL ASTS1;; 6) USE OF BLXIO8;;A6; THIS DRIVER UNDERSTANDS PRECISELY ONE QIO, WHICH IS:; 7; ... IO.WLB,....., ; OR ; IO.WVBA;B;; THE DRIVER QUEUES A CLOCK BLOCK FOR TIME TICKS AND AT THEE;; END OF THAT TIME INTERVAL COPIES THE SOURCE BUFFER TO THEA:; DESTINATION BUFFER. IF POSSIBLE, THE REQUEST IS BUFFERED/; INTERNALLY WHILE THE CLOCK REQUEST IS POSTED.N;- .MCALL CLKDF$, PKTDF$% CLKDF$ ;DEFINE CLOCK BLOCK OFFSETSU$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;E7; DEFINE MAXIMUM TRANSFER LENGTH WHICH WILL BE BUFFEREDN;I BUFLIM = 100. DDT$ BM,,NONE,,,NEW .PAGE;+); ** - BMINI - I/O INITIATION ENTRY POINTB; ; ; INPUTS:E; <; DRQIO (BECAUSE 00m[mmmmffDATATHE UC.QUE BIT IS SET IN THE UCB) SETS THE; REGISTERS TO THE FOLLOWING:T;H; R1 = ADDRESS OF I/O PACKET; R4 = ADDRESS OF SCB ; R5 = ADDRESS OF UCBW;E ; OUTPUTS:;EE; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT- E; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-X; ATION IS INITIATED.I;W; I/O REQUEST PACKET FORMAT: ;0'; I.LNK -- I/O QUEUE THREAD WORD.5; I.PRI/I.EFN -- REQUEST PRIORITY, EVENT FLAG NUMBER.N:; I.TCB -- ADDRESS OF THE TCB OF THE REQUESTER TASK.E; I.LN2 -- POINTER TO SECOND LUN WORD IN REQUESTER TASK HEADER. &; I.UCB -- UCB ADDRESS OF DEVICE,; I.FCN -- I/O FUNCTION CODE (IO.WLB).5; I.IOSB -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.A5; I.IOSB+2 -- RELOCATION BIAS OF I/O STATUS BLOCK.EB; I.IOSB+4 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000).8; I.IOSB+6 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.2; I.PRM -- RELOCATION BIAS OF SOURCE BUFFER.0; I.PRM+2 -- BUFFER ADDRESS ;0; >; COPYRIGHT (c) 1985, 1987 BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;.>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;T; VERSION 2.06;; MODIFIED BY:; ; P. K. M. WEISS 8-OCT-85 2.00/; PKW107 - ADD DEFINABLE CONTROLLER TIMEOUTSO;.; G. MARIGOWDA 17-JUN-86 2.010; 1; GM103 - DEFINE C.VCID AS A BYTE AND DEFINE; ; C.FLAG AND CONTROL BITS;; G. MARIGOWDA 3-NOV-86 2.02 ; ,; GM105 - INCREASE THE RETRY COUNT TO 3 ;S; J. MELVIN 10-NOV-86 2.03!; JJM304 - DELETE EXCESS LINESM; ; J. MELVIN 10-NOV-86 2.04,; JJM308 - RESTRUCTURE QST TO REDUCE SIZE; ; J. MELVIN 29-NOV-86 2.05=; JJM321 - CREATE $IDENT MACRO FOR RUN TIME IDENTIFICATIOND;I; J. MELVIN 25-JAN-87 2.06; JJM325 - VECTOR PUCOM;0 ;1 .IIF NDF,R$$UDA R$$UDA=0 ;INSURE IT IS DEFINEDF1 .IIF NDF,R$$MYA R$$MYA=0 ;INSURE IT IS DEFINED. S ;======================================================================== ;PKW107 R ; THE FOLLOWING DEFINITIONS MAY BE CHANGED TO CUSTOMIZE THE MSCP DRIVERS ;PKW107S ;======================================================================== ;PKW107V ;PKW107 > MAXWBT = 8. ;MAXIMUM UMR WAIT BLOCK TABLE ENTRIES ;PKW107< ;THIS IS THE MAXIMUM NUMBER OF I/O'S THAT EACH ;PKW107: ;CONTROLLER CAN HAVE OUTSTANDING AT ONE TIME ;PKW107' ; (ON A UNIBUS SYSTEM) ;PKW107EB DUUMR = 4 ;PREALLOCATED UMR WAIT BLOCKS FOR DU DEVICES ;PKW107B MUUMR = 2 ;PREALLOCATED UMR WAIT BLOCKS FOR MU DEVICES ;PKW107 ;PKW107SK ;DUTMO = ;DSA CONTROLLERS SEND THE HOST A TIMEOUT VALUE WHEN THEY;PKW107=C ;ARE BROUGHT ONLINE. FOR DISK CONTROLLERS, THIS VALUE ;PKW107I= ;IS TYPICALLY BETWEEN 30 SEC AND 2 MIN. IF THE ;PKW107AC ;CONTROLLER BECOMES UNAVAILABLE, IT WILL TAKE THE HOST ;PKW107UB ;2*(TIMEOUT VALUE)+3 SEC TO RESYNCHRONIZE. THIS TIME ;PKW107D ;PERIOD IS LONGER THAN NECESSARY BECAUSE THE RSX DRIVER ;PKW107B ;DOES NOT IMPLEMENT SOME OF THE LONGER MSCP COMMANDS, ;PKW107D ;SUCH AS 'ERASE'. FOR SOME APPLICATIONS THE TIME DELAY ;PKW107> ;SPECIFIED BY THE CONTROLLER MAY BE UNACCEPTABLE. ;PKW107D ;DEFINING DUTMO WILL CAUSE THIS VALUE TO BE USED FOR THE;PKW107! ;TIMEOUT PERIOD. ;PKW107= ; *****DO NOT***** USE THIS OPTION UNLESS YOUR ;PKW1070B ;APPLICATION ABSOLUTELY REQUIRES IT. IF YOU USE THIS ;PKW107= ;OPTION, AND YOU EXPERIENCE INEXPLICABLY FAILED ;PKW107RA ;COMMANDS OR EXCESSIVE RESYNCHRONIZATION, RAISE THIS ;PKW107,C ;VALUE **BEFORE** SUBMITTING A PROBLEM REPORT. DO NOT ;PKW107YD ;UNDER ANY CIRCUMSTANCES ATTEMPT TO USE A TIMEOUT VALUE ;PKW107' ;OF LESS THAN 5 SEC. ;PKW107V ;PKW107HA ;A COMPARABLE VALUE IS NOT INCLUDED FOR TAPE DRIVERS ;PKW107*A ;BECAUSE THE REWIND COMMAND, WHICH WE USE, IS ONE OF ;PKW107E, ;THE LONGEST TMSCP COMMANDS. 00[nmgcccc ;PKW107 ;PKW107E ;PKW107AQ ;===================================================================== ;PKW107. ; END OF ALTERABLE DEFINITIONS ;PKW107Q ;===================================================================== ;PKW107;O;===================================================================== ;**-1O; DEFINE CST OFFSETS FOR DSAH;=====================================================================& .ASECT ;DEFINE CST OFFSETS FOR DSA.=0M3C.STAT: .BLKW 1 ;STATUS BITS FOR CONNECTION STATEP ;POSSIBLE STATES ARE:" C1.RDY = 1 ;CONNECTION IS READY0 C1.ONL = 2 ;CONNECTION IS IN TRANSITION FOR A ;CON ONL REQUEST.=, C1.SCC = 4 ;CONNECTION IS WAITING FOR ITS/ ;'SET CONTROLLER CHARACTERISTICS' COMMAND= ;TO COMPLETE.=: C1.GUS = 10 ;A 'GET UNIT STATUS' COMMAND MUST BE ISSUED> C1.AVN = 20 ;AN ADDITIONAL AVAILABLE COMMAND MUST BE ISSUED6 C1.SYN = 40 ;CONTROLLER SYNCHRONIZATION IN PROGRESS7 C1.REC = 100 ;PHASE ONE OF SYNCHRONIZATION RECOVERYE6 C1.CON = 200 ;PHASE TWO OF SYNCHRONIZATION RECOVERY1! C1.UMR = 400 ;ALLOCATE UMRS IF A UNIBUS SYSTEM 5" C1.DQU = 1000 ;CALL $DQUMR WHEN EXITING THE DRIVER.&# C1.FAT = 2000 ;FATAL ERROR OCCURRED/$ C1.ABO = 4000 ;ABORT COMMANDS MUST BE ISSUED@% C1.GCS = 10000 ;A 'GET COMMAND STATUS' COMMAND MUST BE ISSUED)& C1.TMO = 20000 ;A TIMEOUT HAS OCCURREDA8' C1.R1 = 40000 ;RECOVERY - ON-LINES NEED TO BE STARTED7( C1.R2 = 100000 ;RECOVERY - UNITS STILL SPINNING UP ):*C.EXTN: .BLKW 1 ;RESERVED. DO NOT MOVE/REMOVE THIS CELL+7,C.CMST: .BLKW 2 ;STATUS OF OLDEST OUTSTANDING COMMAND -7.C.OLHD: .BLKW 2 ;LIST HEAD OF OUTSTANDING I/O PACKETSE/0C.CMDS: .BLKW 1 ;CREDIT COUNTO101C.VCID: .BLKB 1 ;VIRTUAL CIRCUIT ID ;GM10381C.FLAG: .BLKB 1 ;CLASS DRIVER CONTROL FLAG ;GM103=1 C2.SHD = 1 ;TO TEST RECURSION DURING DISK SHADOWING ;GM103C61 ;THIS BIT IS MEANING LESS FOR NON I/D AND ;GM1031 ;MICRO/RSX ;GM103 3 ;**-1G;4C.REDO: .BLKW 1 ;OLDEST COMMAND TO BE REISSUED AT RESYNCHI5;6C.REQU: .BLKW 2 ;QUEUE OF CMDS TO RESTART AFTER A RESYNCHN78 .IF DF E$$LOG99:C.MLNG: .BLKW 1 ;LENGTH OF CONTROLLER ERROR LOG PACKET ';C.CRED: .BLKB 1 ;CREDIT/DEBIT COUNTSV&<C.VCIX: .BLKB 1 ;VIRTUAL CIRCUIT ID#=C.IP: .BLKW 1 ;SAVED IP REGISTER #>C.SA: .BLKW 1 ;SAVED SA REGISTERR? .ENDC@A .IF DF M$$EXT%BC.UMCT: .BLKW 1 ;UMR COUNTER FIELD -CC.UMRW: .BLKW MAXWBT ;UMR WAIT BLOCK TABLE D .ENDCE-FCSTLEN = <.-C.STAT>/2 ;CST LENGTH IN WORDS IG;====================================================================== H; DEFINE QST OFFSETS FOR DSAII;====================================================================== J .ASECTRK.=0B LQ.CST: .BLKW 1 ;POINTER TO CST1M ;IN ORDER TO SUPPORT MULTI-CLASS CONTROLLERSE3N ;THERE WOULD BE A TABLE OF CST ADDRESSES HERE.$O ;ONE ENTRY FOR EACH CLASS TYPE.FQQ.STAT: .BLKW 1 ;STATUS BITS FOR HOST PORT TO CONTROLLER LINK ;**-1&R Q1.RDY= 1 ;CONTROLLER STATE = READY3S Q1.OFF= 2 ;CONTROLLER STATE = OFF-LINE, UNUSABLE=3T Q1.SYN= 100000 ;CONTROLLER STATE = SYNCHRONIZINGQ%U ;... TO ACCOMMODATE THE ENVELOPE=VQ.SAD: .BLKW 10VQ.ID: .BLKB 1 ;CONTROLLER MODEL ID ;JJM3084VQ.INF: .BLKB 1 ;CONTROLLER INFORMATION ;JJM308AaQ.RSPN: .BLKB 1 ;NUMBER OF RESPONSE RING DESCRIPTORS ;**-10E=cQ.CMDN: .BLKB 1 ;NUMBER OF COMMAND RING DESCRIPTORS ;**-12mQ.CTM: .BLKB 1 ;CURRENT TIME-OUT COUNT ;**-90oQ.RTY: .BLKB 1 ;CURRENT RE-TRY COUNT ;**-1JoQ.RING: ;POINTER TO RESPONSE RING AREA. MUST BE SAME AS Q.FRSP ;JJM308<oQ.FRSP: .BLKW 1 ;POINTER TO FIRST RESPONSE RING ;JJM308<oQ.LRSP: .BLKW 1 ;POINTER TO LAST RESPONSE RING ;JJM308<oQ.FCMD: .BLKW 1 ;POINTER TO FIRST COMMAND RING ;JJM308<oQ.LCMD: .BLKW 1 ;POINTER TO LAST COMMAND RING ;JJM308K~Q.RPAT: .BLKW 1 ;POINTER TO ORDERED TABLE OF ADDRESSES OF RSP PKTS ;**-14 JQ.CPAT: .BLKW 1 ;POINTER TO ORDERED TABLE OF ADDRESSES OF CMD PKTS ;**-1GQ.STEP: ;SYN00[ nmmmmffDATACHRONIZATION STEP BIT. THIS OVERLAPS THE USE OF ;JJM308 / ;Q.CRSP AND >MUST< REMAIN HERE. ;JJM308B?Q.CRSP: .BLKW 1 ;POINTER TO CURRENT RESPONSE PACKET ;JJM308 IQ.INDX: ;SYNCHRONIZATION STEP INDEX. THIS OVERLAPS THE USE OF ;JJM308 / ;Q.CCMD AND >MUST< REMAIN HERE. ;JJM308 <Q.CCMD: .BLKW 1 ;POINTER TO FIRST COMMAND PACKET ;JJM308QQ.WRIT: .BLKW 4 ;VALUES TO WRITE TO SA REGISTER DURING SYNCHRONIZATION ;JJM308TBQ.TEMP: .BLKW 1 ;CONTROLLER SPECIFIC SCRATCH/WORK AREA ;JJM3085QSTLEN = <.-Q.CST>/2 ;QST LENGTH IN WORDS ;**-1 .PSECTRP;=============================================================================!; DRIVER WIDE MACRO DEFINITIONSOP;============================================================================= .MACRO CALLV TYPE, RTNB .IF IDN , JSR PC,@120000+RTN. .ENDC ;IDN CLASS .IF IDN ,  JSR PC,@140000+RTN .ENDC ;IDN PORTN .ENDM ;CALLVTN;=========================================================================== .MACRO JMPV TYPE, RTN .IF IDN , JMP @120000+RTN .ENDC ;IDN CLASS .IF IDN ,= JMP @140000+RTN .ENDC ;IDN PORT= .ENDM ;JMPVM;==========================================================================J! .MACRO PUSH LIST ;MACRO PUSHS .IRP XX,T .IF IDN <#0> CLR -(SP) .IFFE MOV XX,-(SP) .ENDC .ENDM .ENDM PUSH=M;==========================================================================R .MACRO POP LIST ;MACRO POP< .IRP XX,2 MOV (SP)+,XXD .ENDM .ENDM POPM;==========================================================================V! .MACRO COPY LIST ;MACRO COPY= .IRP XX,= MOV (SP),XX .ENDM .ENDM COPYUY;============================================================================== ;JJM321V ;JJM321R; $IDENT MACRO TO CREATE TITLE AND RUN TIME IDENT OF PUCOM, MUDRV, DUDRV ;JJM321; ;JJM321 ;JJM321 2 .MACRO $IDENT NAME,IDMAJ,IDMIN,TEXT ;JJM321 ;JJM321N1 .TITLE NAME V'IDMAJ'.'IDMIN 'TEXT ;JJM321= .RADIX 10. ;JJM321 MAJOR = 'IDMAJ ;JJM321 MINOR = 'IDMIN ;JJM321 .RADIX 8. ;JJM321 ;JJM321= .ENDM ;$IDENT ;JJM321=M;========================================================================== ;C.; MACRO THAT DEFINES TABLE FOR I/O TRANSFERS;,' .MACRO FUNCT FCN, OPCOD, PKTSIZ, PRO  .WORD IO.'FCN ;QIO REQUEST .BYTE OP.'OPCOD ;OPCODE3 .BYTE PKTSIZ ;SIZE OF MSCP/TMSCP PACKET (BYTES)I( .WORD PRO ;OPCODE PROCESSING ROUTINE .ENDM FUNCTL;=========================================================================;2E; MACRO TO DEFINE TABLE OFFSETS IN THE OTHER (PORT OR CLASS) DRIVER=;= .MACRO JMPTBL TYPE= .IF IDN ,6 CLASID = 0 ; CLASS DRIVER VERSION NUMBER ;JJM321 CLADAT = 2 ;**-1 CLAEND = 4C CLAERR = 6 CLACMD = 10 SCUCB = 12 CLASYN = 14 ;JJM321. .ENDC ;IDN CLASS .IF IDN ,.5 PORTID = 0 ; PORT DRIVER VERSION NUMBER ;JJM321 PORSUP = 2 ;**-1 PORINT = 4= PORSEN = 6= PORUMR = 10 PKTAC = 12D PKTDR = 14T PKTCHK = 16 STOMP = 20E CONCNT = 22 PKTCH1 = 24 PORSYN = 26 ;JJM321A; MPPROX = 30 ;PLACE HOLDER. MPPRO DEFINED BELOW ;JJM325  .ENDC ;IDN PORTC .ENDM ;JMPTBLL;=========================================================================M; NULL MACROS THAT ARE REPLACED BY LOGPU.MAC IF TERMINAL LOGGING IS DESIREDRL;========================================================================= .MACRO LOGDAT .ENDM .MACRO LOGCMD .ENDM .MACRO LOGRSP .ENDM .MACRO LOGSYN .ENDM .MACRO LOGRTN .ENDML;===========================00[n\n]ncccc=============================================="; DRIVER WIDE SYMBOL DEFINITIONSL;=========================================================================.RPLEN = 60. ;RESPONSE PACKET LENGTH (BYTES).CPLEN = 60. ;COMMAND PACKET LENGTH (BYTES))IOPLEN= 18. ;I/O PACKET LENGTH (WORDS)=.ENVLEN = 4. ;ENVELOPE LENGTH (BYTES)8MPPRO = 30 ;OFFSET FOR $MPPRO VECTORED ADDR ;JJM325;9; SYMBOLS NEEDED FOR A ZERO ENTRY IN THE DISPATCH TABLE;=7 IO.0 = 0 ;FOR A ZERO ENTRY FOR THE I/O FUNCTION CODE=; OP.0 = 0 ;FOR A ZERO ENTRY FOR THE (T)MSCP FUNCTION CODE= ;= ; OFFSETS FOR DISPATCH MACRO ;='FO.OP = 2 ;OFFSET FOR (T)MSCP OPCODE 'FO.SZ = 3 ;OFFSET FOR SIZE OF PACKET 3FO.CMD = 4 ;OFFSET FOR OPCODE PROCESSING ROUTINE -FOSIZ = 6 ;SIZE OF ENTRY IN DISPATCH TABLEN;E/; LENGTHS OF ALL COMMON TMSCP COMMAND PACKETSR;R/GUS.L = 6 ;# WORDS TO ALLOCATE FOR GUS CMDE0ONL.L = 22 ;# WORDS TO ALLOCATE FOR ONL CMD0ABO.L = 10 ;# WORDS TO ALLOCATE FOR ABO CMD/AVL.L = 6 ;# WORDS TO ALLOCATE FOR AVL CMDT0GCS.L = 10 ;# WORDS TO ALLOCATE FOR GCS CMD0SCC.L = 20 ;# WORDS TO ALLOCATE FOR SCC CMD<CMDINT = -4 ;COMMAND INTERRUPT OFFSET (FROM BASE OF RING)=RSPINT = -2 ;RESPONSE INTERRUPT OFFSET (FROM BASE OF RING)N !OWN = 100000 ;OWN"FLAG = 40000 ;FLAGC#$; %; MESSAGE ENVELOPE&; '3(MSGLNG = -4 ;OFFSET TO MESSAGE LENGTH (IN BYTES)W5)VCID = -1 ;OFFSET TO VIRTUAL CIRCUIT ID (IN BYTES)T9*CREDIT = -2 ;OFFSET TO MESSAGE/CREDIT FIELD (IN BYTES) "+MSGTYP = 360 ;MESSAGE TYPE MASK!,CRDDBT = 17 ;CREDIT/DEBIT MASK -.;#/; VIRTUAL CIRCUIT IDENTIFIERS0;1%2VCDSK = 0 ;DISK VIRTUAL CIRCUIT IDR%3VCTAP = 1 ;TAPE VIRTUAL CIRCUIT IDN.4VCDIA = 255. ;DIAGNOSTIC VIRTUAL CIRCUIT ID56; 7; MESSAGE TYPE IDENTIFIERS8;C9(:MSGMUL = 20 ;MESSAGE FIELD MULTIPLIER!;MSGSEQ = 0 ;SEQUENTIAL MESSAGEG<MSGDAT = 1 ;DATAGRAM MESSAGES=MSGCRD = 2 ;CREDIT MESSAGET$>MSGMNT = 15. ;MAINTENANCE MESSAGE?@;F%A; ERROR RETRY COUNT, TIME-OUT COUNTAB;PC4CRETRY = 3. ;CONTROLLER ERROR RETRY COUNT ;GM1053ESTMOC = 10. ;USE A TIME-OUT COUNT OF 10. ;**-1;FG3HRNGSIZ = 4 ;LENGTH OF RING DESCRIPTOR (IN BYTES)I7ICMDSIZ = 4 ;LENGTH OF CMD RNG DESCRIPTOR (IN BYTES)EJRSPLNG = RPLEN + ENVLEN ;TOTAL LENGTH OF RESPONSE PACKET (IN BYTES)LDKCMDLNG = CPLEN + ENVLEN ;TOTAL LENGTH OF COMMAND PACKET (IN BYTES)L7MMSW = 2 ;MOST SIGNIFICANT WORD (OWNER BIT IN RING) M ;PKW107%M; UMR WAIT BLOCK SIZE ;PKW107U2MUMRWTB = 20. ; SIZE OF UMR WAIT BLOCK ;PKW107DM.IIF DF M$$PRO UMRWTB=UMRWTB+2 ;ADD WORD FOR UNIBUS MASK ;PKW107*-1;FG3HRNGSIZ = 4 ;LENGTH OF RING DESCRIPTOR (IN BYTES)I7ICMDSIZ = 4 ;LENGTH OF CMD RNG DESCRIPTOR (IN BYTES)EJRSPLNG = RPLEN + ENVLEN ;TOTAL LENGTH OF RESPONSE PACKET (IN BYTES)LDKCMDLNG = CPLEN + ENVLEN ;TOTAL LENGTH OF COMMAND PACKET (IN BYTES)L7MMSW = 2 ;MOST SIGNIFICANT WORD (OWN;?; DUPRE.MAC - PREFIX FILE FOR BUILDING DU LOADABLE CRASH DRIVERO;p; Created 13-MAY-83O;3L$$CDA=0 ; LOADABLE CRASH DRIVERS TO BE ASSEMBLEDBDU$$CD=0 ; CRASH DRIVER IS DU3-MAY-83;3L$$CDA=0 ; LOADABLE CRASH DRIVERS TO BE ASSEMBLEDDL$$CD=0 ; CRASH DRIVER IS DU;O?; MUPRE.MAC - PREFIX FILE FOR BUILDING MU LOADABLE CRASH DRIVER;O; Created 13-MAY-83A;3L$$CDA=0 ; LOADABLE CRASH DRIVERS TO BE ASSEMBLEDSMU$$CD=0 ; CRASH DRIVER IS MUER IS MSS.LIST00^nmmmmffDATA& $IDENT PUCOM,02,13, .PSECT ;USE BLANK PSECT  .LIST MEBP;S;,"; COPYRIGHT (c) 1985, 1987 BY+; DIGITAL EQUIPMENT CORPORATION, MAYNARDD* ; MASSACHUSSETTS. ALL RIGHTS RESERVED. ;C7 ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY7 ; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE7 ; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THER7; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHERS7; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISED7; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TOP7; AND OWNERSHIP OF THE SOFTWARE IS HEREBY 5; TRANSFERRED.;L7; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TOL7; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED 7; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.N;O8; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR 7; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IST; NOT SUPPLIED BY DIGITAL.;R;A;TG; JASON GALLANT, JOE MELVIN, BOB SCHMEICHEL, SUSAN THOMAS, PAUL WEISS  ;T ; MODIFIED BY: ;S" ; P. K. M. WEISS 8-OCT-85 2.00* ; PKW106 - ADD MULTIPROCESSOR SUPPORT ;N% ; P. K. M. WEISS 14-MAR-1986 2.017 ; PKW109 - ADD QUEUE OPTIMIZATION SUPPORT, CLEAN UP ; % ; J. J. MELVIN 28-MAR-86 2.01AO, ; JJM303 - CLEAN UP UNNEEDED CODE/CELLS ;L$ ; J. J. MELVIN 28-MAR-86 2.02& ; JJM304 - CLEAN UP COMMENT LINES ; $ ; J. J. MELVIN 28-MAR-86 2.03* ; JJM305 - MOVE IPWAIT ROUTINE INLINE ;E$ ; J. J. MELVIN 28-MAR-86 2.04- ; JJM306 - USE ASSUME MACRO WHERE USEFULT ;.$ ; J. J. MELVIN 14-JUN-86 2.056 ; JJM309 - WARN ABOUT VIRTUAL CIRCUIT LIMITATIONS ; & ; G. MARIGOWDA 17-JUN-86 2.069 ; GM103 - DEFINE C.VCID AS A BYTE AND DEFINE C.FLAG ;J! ; J. J. MELVIN 05-NOV-86 2.07S4 ; JJM307 - PERFORM SIMPLE/OBVIOUS OPTIMIZATIONS ; ! ; J. J. MELVIN 05-NOV-86 2.08 1 ; JJM308 - REDUCE QST DATA STRUCTURES IN SIZEO ;W! ; J. J. MELVIN 05-NOV-86 2.09.8 ; JJM310 - KEEP CONTROLLER CONTEXT AVAILABLE FOR USE ;E! ; J. J. MELVIN 29-NOV-86 2.10V2 ; JJM321 - USE $IDENT MACRO TO IDENTIFY MODULE ;R! ; J. J. MELVIN 29-NOV-86 2.11 ' ; JJM322 - DEFINE DEBUG CODE/CELLS  ;I# ; J. J. MELVIN 26-JAN-87 2.12 ; JJM325 - VECTOR PUCOM- ;6% ; G. MARIGOWDA 23-FEB-87 2.13O ; GMG112 - VECTOR $MPUB1 E!; THIS MODULE CONTAINS THE ROUTINES AND DATA STRUCTURES REQUIRED TOEB"; SUPPORT THE UQSSP PORT PROTOCAL FOR TMSCP/MSCP DEVICES. THESED#; ROUTINES AND DATA STRUCTURES ARE USED WITH VARIOUS CLASS DRIVERS6$; IN THE SYSTEM TO PROVIDE SUPPORT FOR SUCH DEVICES.%;OW%;============================================================================ ;JJM309N%; PLEASE NOTE THE FOLLOWING RESTRICTIONS WHEN MODIFYING THIS MODULE ;JJM309%; ;JJM309K%; 1) THE JUMP TABLE DEFINED AT LABEL UQBEGN --MUST-- APPEAR AT ;JJM309EO%; RELATIVE OFFSET 0 IN THIS MODULE. CLASS DRIVERS REQUIRE THIS. ;JJM309O%; ;JJM309S%; 2) PUCOM IS CURRENTLY SET UP TO HANDLE A VIRTUAL CIRCUIT ID OF 0 OR 1. ;JJM309TR%; IF AN ID GREATER THAN 1 IS USED, CHANGES MAY BE REQUIRED TO PUCOM. ;JJM309%; ;JJM309W%;============================================================================ ;JJM309I&; 7& .MCALL HWDDF$,UCBDF$,SCBDF$,UDADF$,KRBDF$ ;PKW109U() HWDDF$ ;HARDWARE REGISTERS ;**-2'* UCBDF$ ;UNIT CONTROL BLOCK OFFSETSF4+ UDADF$ ;DISK CLASS MSCP SYMBOLS AND DEFINITIONS, SCBDF$ ,,1 ;SCB OFFSETS*, KRBDF$ ;DEFINE KRB OFFSETS ;PKW1098- JMPTBL CLASS ;DEFINE CLASS DRIVER JUMP TABLE OFFSETS/; ;**-10; LOCAL MACROS1;U)2 .MACRO GENLAB PRE,VAL ;GENERATE LABEL9 3PRE'VAL::=4 .ENDM ;GENLABO5;============================================================================$=6 .MACRO GENADD PRE,VAL ;GENERATE LABEL, THEN ADDRESS OF IT 7 .WORD PRE'VAL8 .ENDM ;GENADDN9;=====================================================00^"nn]ncccc======================@: .MACRO GETINF TYP,CON ;GENERATE SYMBOL, SAVE NUMBER OF RINGS;RNUM=TYP'$R'CONL<CNUM=TYP'$C'COND= .ENDM ;GETINFN>;==========================================================================='? .MACRO GENTAB BASE,CON,LEN,NUM,PTYPEE@ADDR=BASE'CON= A .REPT NUM-B .WORD ADDR + ENVLEN ;ADDRESS OF PTYPE PKT=CADDR=ADDR + LEN + ENVLEND .ENDRE .ENDM ;GENTABOF;=============================================================================G .MACRO RECORD DDD,CONH .WORD DDD'QST'CONI .ENDM ;RECORDOJ;============================================================================$@K .MACRO INDEX PRE,VAL ;GENERATE SUBTITLE ASSEMBLER DIRECTIVECK .SBTTL . PRE: DATA STRUCTURES FOR CONTROLLER VAL ;JJM304,M .ENDM ;INDEX ;**-1ON;============================================================================ O;NP; EQUATED SYMBOLS;Q;B%RIOPLEN = 18.*2 ;IOP SIZE IN BYTES=S;='T; DEVICE REGISTER AND BIT DEFINITIONS.U; .VIP = 0 ;INITIALIZATION AND POLLING REGISTER&WSA = 2 ;STATUS AND ADDRESS REGISTERX;=Y; STEP BIT DEFINITIONSZ;=[ERROR = 100000 ;ERROR\STEP4 = 40000 ;STEP 4 BIT]STEP3 = 20000 ;STEP 3 BIT^STEP2 = 10000 ;STEP 2 BIT_STEP1 = 4000 ;STEP 1 BIT,`;.a; STEP ONE READ BITSb;=5cNOVEC = 2000 ;INABILITY TO ACCEPT INTERRUPT VECTOR=1d ;(I.E. CONTROLLER IS USING A HARD-WIRED ...!e ;... INTERRUPT VECTOR PLUG) "fQB = 1000 ;22 BIT BUS SUPPORTEDg; h; STEP ONE WRITE BITS=i;IjINTE = 200 ;INTERRUPT ENABLERk;Al; STEP FOUR WRITE BITSm;TnLF = 2 ;LAST FAILURE FLAGoGO = 1 ;GO BIT p .PAGE6q .SBTTL JMPTAB - JUMP TABLE OF VARIOUS PORT ROUTINESNr;===========================================================================Gs; THE FOLLOWING JUMP TABLE --- MUST --- BE DEFINED AS THE FIRST THINGTGt; WITHIN THIS MODULE. VARIOUS CLASS DRIVERS EXPECT TO SEE THIS TABLEIGu; AT 140000, WHERE THIS COMMON AREA IS MAPPED INTO THE CLASS DRIVERS.Pv;WHw; THIS TABLE ALSO MAKES USE OF SYMBOLS DEFINED IN THE PREFIX FILE. BE%x; CAREFUL WHEN ADDING NEW ROUTINES. Ny;===========================================================================OyUQBEGN::.WORD MAJOR*256.+MINOR;COMPONENT ID (SET UP IN $IDENT MACRO) ;JJM321=/{ .WORD PORSUP ;PORT SETUP FUNCTIONS ;**-1-.| .WORD PORINT ;CONTROLLER INTERRUPT HANDLER3} .WORD PORSEN ;SEND COMMAND PACKET TO CONTROLLERA*~ .WORD PORUMR ;ALLOCATE/DEALLOCATE UMRS( .WORD PKTAC ;ALLOCATE COMMAND PACKET+ .WORD PKTDR ;DEALLOCATE RESPONSE PACKETN. .WORD PKTCHK ;CHECK FOR REQUIRED RESOURCES' .WORD STOMP ;CLOBBER THE CONTROLLER=6CONCNT: .WORD 0 ;# OF CONTROLLERS CONNECTED TO PORT4 .WORD PKTCH1 ;CHECK FOR RESOURCES-IMMEDIATE CMDS1 .WORD PORSYN ;PORT SYNCHRONIZATION ;JJM321T; .WORD 0 ;EXEC VECTORING FROM APR6 CODE ROUTINE ;JJM325R* ;FILLED IN BY CLASS DRIVER ;JJM325. .WORD -1 ;NO MORE INDICATOR - MUST BE LAST3TABTAB:: ;TABLE OF QST TABLE ADDRESSES ;**-13  .IRP CON,R .WORD CON'QTBL .ENDM ;CON.' .WORD -1 ;ANOTHER TABLE TERMINATORS;.; LOCAL DATA;TATEMP: .BLKW 1 ;NUMBER OF RESPONSE DESCRIPTORS CHECKED ;JJM304OACOUNT: .BLKW 1 ;NUMBER OF COMMAND DESCRIPTORS CHECKED ;JJM304P>UQRELC: .BLKW 2 ;RELOCATION CONSTANT USED TO CONVERT ;**-4$ ;VIRTUAL TO PHYSICAL ADDRESSES3UMRMAP: .BLKW 1 ;ADDRESS OF MAPPING BLOCK OF UMRD<EXEVEC: .WORD 0 ;FLAG FOR VECTOR NOT YET FILLED ;JJM325; ;JJM325$ALOCB: .WORD $ALOCB ;JJM325$ASUMR: .WORD $ASUMR ;JJM325$DEACB: .WORD $DEACB ;JJM325$DEUMR: .WORD $DEUMR ;JJM325$HFMSK: .WORD $HFMSK ;JJM325$KISR6: .WORD KISAR6 ;JJM325$MPUB1: .WORD $MPUB1 ;JJM325AEXEVCL=<<<.-EXEVEC>/2>-1> ;TABLE LENGTH FOR VECTORING ;JJM325* ;JJM322  .IF DF,DSADEB ;JJM322CUNKPKT: .BLKW 1 ;COUNT OF UNKNOWN RESPONSE PACKET TYPES ;JJM322R, ; ACROSS ALL DSA CONTROLLERS ;JJM322IUNKRNG: .BLKW 1 ;COUNT OF TIMES00^*nmmmmffDATA CREDIT OK, RING NOT HOST OWNED ;JJM322 , ; ACROSS ALL DSA CONTROLLERS ;JJM322 .ENDC ;DSADEB ;JJM322J ;JJM322$ .PAGE; .SBTTL TABLES - DATA STRUCTURES FOR DISK/TAPE CLASS MSCPOR;===============================================================================.; SET UP DATA STRUCTURES FOR ALL THE CLASSESR;===============================================================================5.IRP DEV, ;ASSUME TABLE STRUCTURE THE SAMEG&CONT=0 ;INITIAL CONTROLLER NUMBER .IF IDN 2 .IIF NDF R$$UDA R$$UDA=0L0 LOOP=R$$UDA ;USE NUMBER OF MSCP CONTROLLERS .ENDC .IF IDN B .IIF NDF R$$MYA R$$MYA=0D1 LOOP=R$$MYA ;USE NUMBER OF TMSCP CONTROLLERS= .ENDC) .REPT LOOP ;FOR EACH MSCP CONTROLLER & INDEX DEV,\CONT ;GENERATE SUBTITLE; GETINF DEV,\CONT ;GET NUMBER OF CMD/RSP RINGS FOR CONT.= .PAGE$; -------------------------------$; SET UP THE CST FOR A CONTROLLER$; -------------------------------0 GENLAB DEV'CST,\CONT ;REFERENCE LABEL TO CST- .WORD 0 ;C.STAT - CONNECTION STATE STATUE4 .WORD 0 ;C.EXTN - RESERVED. DO NOT MOVE/DELETE/ .WORD 0,0 ;C.CMST - OLDEST OUTSTANDING CMDR1 .WORD 0,.-2 ;C.OLHD - OUTSTANDING I/O LIST H - .WORD 0 ;C.CMDS - CREDIT COUNT FOR CONTRT1 .BYTE 0 ;C.VCID - VIRTUAL CIRCUIT ID ;GM103B7 .BYTE 0 ;C.FLAG - CLASS DRIVER CONTROL FLAG ;GM103-3 .WORD 0 ;C.REDO - COMMAND TO BE REISSUED ;**-1O/ .WORD 0 ;C.REQU - QUEUE OF CMDS TO RESTART .WORD .-2 ;AFTER A RESYNCH  .IF DF E$$LOG- .WORD 0 ;C.MLNG - LENGTH OF CONTROLLER E.* .BYTE 0 ;C.CRED - CREDIT/DEBIT COUNTS) .BYTE 0 ;C.VCIX - VIRTUAL CIRCUIT IDA& .WORD 0 ;C.IP - SAVED IP REGISTER& .WORD 0 ;C.SA - SAVED SA REGISTER .ENDC& .IF DF M$$EXT ;IF EXTENDED MEMORY: .WORD MAXWBT ;C.UMCT - # OF UMR WAIT BLOCKS AVAILABLE2 .REPT MAXWBT ;C.UMRW - TABLE OF UMR WAIT BLOC .WORD 0 ; ADDRESSES .ENDR .ENDC ;M$$EXTT&; ---------------------------------&; SET UP THE QST FOR THE CONTROLLER&; ---------------------------------0 GENLAB DEV'QST,\CONT ;REFERENCE LABEL TO QST8 GENADD DEV'CST,\CONT ;Q.CST - PNTR TO ASSOCIATE CST4 .WORD 0 ;Q.STAT - STATUS BITS (PORT-CONTROLLER) .WORD 0 ;Q.SAD -3 .BYTE 0 ;Q.ID - CONTROLLER MODEL ID ;JJM308 5 .BYTE 0 ;Q.INF - CONTROLLER INFORMATION ;JJM308 8 .BYTE RNUM ;Q.RSPN - NUMBER OF RESPONSE RINGS ;**-11 .BYTE CNUM ;Q.CMDN - NUMBER OF COMMAND RINGS-3 .BYTE 0 ;Q.CTM - CURRENT TIME OUT COUNT ;**-4O* .BYTE 0 ;Q.RTY - CURRENT RETRY COUNT2 ;Q.RING - START OF RING AREA. MUST ;JJM308+ ;BE SAME ADDRESS AS Q.FRSP! ;JJM308OD GENADD DEV'FRR,\CONT ;Q.FRSP - PNTR TO FIRST RESPONSE RING ;**-4= GENADD DEV'LRR,\CONT ;Q.LRSP - PNTR TO LAST RESPONSE RING > GENADD DEV'FCR,\CONT ;Q.FCMD - FIRST COMMAND RING ;JJM308> GENADD DEV'LCR,\CONT ;Q.LCMD - LAST COMMAND RING ;JJM308? GENADD DEV'RPT,\CONT ;Q.RPAT - PNTR TO RSP PACKET ADDRESSES0? GENADD DEV'CPT,\CONT ;Q.CPAT - PNTR TO CMD PACKET ADDRESSES-9 .WORD 0 ;Q.CRSP - CURRENT RESPONSE RING WHEN ;JJM308 2 ; CONTROLLER ONLINE (MSCP). ;JJM3086 ;Q.STEP - SYNC STEP BIT WHEN CONTROLLER ;JJM3085 ; IS SYNCRONIZING. THIS FIELD ;JJM308-6 ; DELIBERATELY OVERLAPS Q.CRSP. ;JJM3088 .WORD 0 ;Q.CCMD - CURRENT COMMAND RING WHEN ;JJM3085 ; CONTROLLER IS ONLINE (MSCP). ;JJM308D/ ;Q.INDX - SYNC STEP INDEX WHEN ;JJM308E4 ; CONTROLLER IS SYNCRONIZING. ;JJM3080 ; THIS FIELD DELIBERATELY ;JJM308* ; OVERLAPS Q.CCMD. ;JJM308A .WORD 0,0,0,0 ;Q.WRIT - WORDS TO WRITE TO SA IN SYNC ;JJM308E7 .WORD 0 ;Q.TEMP - CONTR SPECIFIC WORK AREA ;JJM308T2; ---------------------------------------------2; ALLOCATE SPACE FOR CMD/RSP TABLE OF ADDRESSES2; ---------------------------------------------7 GENLAB DEV'RPT,\CONT ;TA00^2nn]nccccBLE OF RSP PACKET ADDRESSEST? GENTAB DEV'DRP,\CONT,RPLEN,RNUM,RSP ;GEN TABLE OF ADDRESSESZ7 GENLAB DEV'CPT,\CONT ;TABLE OF CMD PACKET ADDRESSESJ? GENTAB DEV'DCP,\CONT,CPLEN,CNUM,CMD ;GEN TABLE OF ADDRESSES06; -------------------------------------------------6; ALLOCATE THE SPACE FOR THE RESPONSE/COMMAND RINGS6; -------------------------------------------------/ .WORD 0 ;CONTROLLER COMMAND INTERRUPT ADDR 0 .WORD 0 ;CONTROLLER RESPONSE INTERRUPT ADDR9 GENLAB DEV'FRR,\CONT ;FIRST RESPONSE RING BEGINS HERE - .REPT *2 ;2 WORDS EACH; N-1 RINGSO .WORD 0 .ENDR8 GENLAB DEV'LRR,\CONT ;LAST RESPONSE RING BEGINS HERE" .WORD 0,0 ;LAST RESPONSE RING8 GENLAB DEV'FCR,\CONT ;FIRST COMMAND RING BEGINS HERE .REPT *2  .WORD 0 .ENDR7 GENLAB DEV'LCR,\CONT ;LAST COMMAND RING BEGINS HERE-! .WORD 0,0 ;LAST COMMAND RINGW&; ---------------------------------& ; ALLOCATE COMMAND/RESPONSE PACKETS& ; ---------------------------------A  GENLAB DEV'DRP,\CONT ;REFERENCE LABEL TO RESPONSE PACKET AREAH  .REPT RNUM8  .WORD RPLEN ;INSURE MAX PACKET SIZE ON INITIAL CALL" .WORD 0 ;SECOND ENVELOPE WORD1 .BLKB RPLEN ;ALLOCATE ACTUAL RESPONSE PACKET . .ENDR ;DO FOR EACH RESPONSE RING DESIRED@ GENLAB DEV'DCP,\CONT ;REFERENCE LABEL TO COMMAND PACKET AREA  .REPT CNUM8 .WORD CPLEN ;INSURE MAX PACKET SIZE ON INITIAL CALL" .WORD 0 ;SECOND ENVELOPE WORD0 .BLKB CPLEN ;ALLOCATE ACTUAL COMMAND PACKET- .ENDR ;DO FOR EACH COMMAND RING DESIREDA#CONT=CONT + 1 ;NEXT CONTROLLERT) .ENDR ;LOOP ;ALL THE MSCP CONTROLLERS ;OB; GENERATE A TABLE WITH THE ADDRESSES OF THE QSTS FOR THIS CLASS6 .WORD LOOP ;RECORD NUMBER OF CONTROLLERS ;JJM310DEV'QTBL:: ;**-1  CONT=0D  .REPT LOOPE RECORD DEV,\CONTA  CONT=CONT + 1! .ENDR ;LOOP ".ENDM ;IRP$ ;**-1 %CODBEG = .r .PAGE ;**-76ODs .SBTTL PKTAC - ALLOCATE COMMAND PACKET GIVEN CMD RING DESCRIPTORt;+>u; **-PKTAC-ALLOCATE COMMAND PACKET GIVEN CMD RING DESCRIPTORv;RHw; THIS ROUTINE CALCULATES THE ADDRESS OF THE AVAILABLE COMMAND PACKET,Ix; GIVEN THE COMMAND DESCRIPTOR ADDRESS. SINCE THE ONLY WAY TO GET HERE Gy; IS IF THE PKTCHK ROUTINE HAS ALREADY BEEN CALLED, THIS ROUTINE WILL<z; ALWAYS RETURN WITH CARRY CLEAR, I.E. INDICATING SUCCESS.{;P |; INPUTS:P}; A~; R0=NUMBER OF WORDS TO ALLOCATE FOR THE TEXT PORTION OF PACKETK5; NOTE: THIS VALUE MUST NOT INCLUDE THE ENVELOPER; R2=QST ADDRESS; R3=I/O PACKET ADDRESSV; R4=SCB ADDRESS; R5=UCB ADDRESS3; Q.CCMD=ADDRESS OF AVAILABLE CMD RING DESCRIPTORD;E ; OUTPUTS:;O; R0=DESTROYED.D=; R1=VIRTUAL ADDRESS OF COMMAND PACKET TO USE. THIS POINTSU?; TO THE PACKET ITSELF AND > NOT < TO THE PACKET ENVELOPE.R; R2,R3,R4,R5 PRESERVEDDG; CARRY CLEAR=COMMAND PACKET ALLOCATED. CARRY ALWAYS RETURNED CLEAR.O;-PKTAC:: ;JJM307A MOV Q.CCMD(R2),R1 ;ADDR OF CMD RING DESCR TO ALLOCATE ;JJM307QB SUB Q.FCMD(R2),R1 ;THE BEGINNING OF THE CMD RING DESCR ;JJM307% ASR R1 ;DIVIDE BY TWO ;JJM307A7 ADD Q.CPAT(R2),R1 ;BASE ADDR TO THE OFFSET ;JJM30701 MOV (R1),R1 ;ACTUAL PACKET ADDRESS ;JJM307K2 MOV R0,MSGLNG(R1) ;STORE IN ENVELOPE ;JJM3072 ASL MSGLNG(R1) ;MAKE IT A BYTE VALUE ;JJM3070 PUSH ;SAVE THE PACKET ADDRESS ;JJM307610$: CLR (R1)+ ;ZERO OUT A WORD OF PACKET ;JJM3074 SOB R0,10$ ;CLEAR OUT THE WHOLE PACKET ;JJM307+ POP ;GET PACKET ADDRESS ;JJM307(, RETURN ;AND RETURN TO CALLER ;JJM307 .PAGE ;**-26DC .SBTTL PKTCHK - CHECK FOR REQUIRED RESOURCES: NON-IMMEDIATE CMDS ? .SBTTL PKTCH1 - CHECK FOR REQUIRED RESOURCES: IMMEDIATE CMDSM;+I; **-PKTCHK-CHECK FOR RESOURCES BEFORE ISSUING I/O - NON-IMMEDIATE CMDSEE; **-PKTCH1-CHECK FOR RESOURCES BEFORE ISSUING I/O - IMMEDIATE CMDS0;RU; THIS ROUTINE CHECKS FOR SUFFICIENT RESOURCES TO ISSUE A COMMAND. SUCCESS ;JJM307E+; IS RETURN IF AND ONLY IF: 00^:nmmmmffDATA ;JJM307 ; ;JJM307>; 1. THERE IS AT LEAST 1 HOST OWNED COMMAND RING. ;JJM307=; 2. THERE ARE SUFFICIENT CREDITS TO ISSUE IT. ;JJM307D; ;JJM307; INPUTS: ;JJM307:; ;JJM307!; R2=QST ADDRESS ;JJM307 $; VARIOUS QST FIELDS ;JJM307; ;JJM307; OUTPUTS: ;JJM307; ;JJM307; R0=PRESERVED ;JJM307O; R1=DESTROYED ;JJM307 "; R2-R5=PRESERVED ;JJM307D; CARRY SET= NO RESOURCES AVAILABLE. Q.CCMD NOT MODIFIED ;JJM307F; CARRY CLR= RESOURCES AVAILABLE. Q.CCMD(R2) HAS ADDRESS OF ;JJM3071; AVAILABLE COMMAND RING TO USE. ;JJM307 ; ;JJM307; ;JJM307 .ENABL LSB ;JJM307PKTCHK:: ;JJM307  ASSUME Q.CST,0 ;JJM307+ MOV (R2),R1 ;GET CST ADDRESS ;JJM307 4 CMP C.CMDS(R1),#1 ;AT LEAST 2 CREDITS? ;JJM3074 BLE 100$ ;NO. RETURN FAILURE TO CALLER ;JJM307< MOV Q.CCMD(R2),R1 ;CHECK CURRENT CMD DESCRIPTOR ;JJM307( TST MSW(R1) ;HOST OWNED? ;JJM3073 BLT 90$ ;NO. RETURN FAILURE TO CALLER ;JJM307S% CLC ;INDICATE SUCCESS ;JJM307 0 RETURN ;AND GO BACK TO THE CALLER ;JJM307PKTCH1:: ;JJM307  ASSUME Q.CST,0 ;JJM307+ MOV (R2),R1 ;GET CST ADDRESS ;JJM30732 TST C.CMDS(R1) ;AT LEAST ONE CREDIT? ;JJM3075 BLE 100$ ;NO. RETURN FAILURE TO CALLER ;JJM307B< MOV Q.CCMD(R2),R1 ;CHECK CURRENT CMD DESCRIPTOR ;JJM307( TST MSW(R1) ;HOST OWNED? ;JJM3073 BLT 90$ ;NO. RETURN FAILURE TO CALLER ;JJM307B% CLC ;INDICATE SUCCESS ;JJM307 0 RETURN ;AND GO BACK TO THE CALLER ;JJM30790$: ;JJM307  .IF DF,DSADEB ;JJM3079 INC UNKRNG ;COUNT IT (CREDIT OK, RING ISN'T) ;JJM307V .ENDC ;DSADEB ;JJM307M ;JJM3071*100$: SEC ;INDICATE FAILURE ;JJM307 RETURN ;JJM307T .DSABL LSB ;JJM307=40$: RETURN ;RETURN TO CALLER USING CARRY AS FLAG ;**-50R  .DSABL LSBD .PAGE, .SBTTL PKTDR - DEALLOCATE RECEIVE PACKET;+&; **-PKTDR-DEALLOCATE RECEIVE PACKET;G; THIS ROUTINE DEALLOCATES THE RECEIVE PACKET POINTED TO BY R1. THIS C; ENTAILS LOCATING THE CORRESPONDING RESPONSE RING DESCRIPTOR ANDK#; MARKING IT AS CONTROLLER OWNED.D; ; INPUTS:; 3; R1=ADDRESS OF RESPONSE PACKET TO BE DEALLOCATEDJ; R2=QST ADDRESS; R4=SCB ADDRESS; R5=UCB ADDRESS=; Q.CRSP(R2)=ADDRESS OF ASSOCIATED RESPONSE RING DESCRIPTOR5; ; OUTPUTS:;A; R1,R2,R3,R4,R5 PRESERVEDE; ASSOCIATED RESPONSE RING DESCRIPTOR IS MARKED AS CONTROLLER OWNED;H;- PKTDR::S= MOV #RPLEN,MSGLNG(R1) ;RESTORE MAXIMUM REPONSE PACKET SIZEI6 MOV Q.CRSP(R2),R0 ;GET CURRENT RSP RING DESCR ADDR1 BIS #OWN,MSW(R0) ;MARK IT AS CONTROLLER OWNED& RETURN ;AND RETURN TO THE CALLER .PAGE/ .SBTTL PORINT - CONTROLLER INTERRUPT HANDLERS;++; **-PORINT- CONTROLLER INTERRUPT HANDLERO;DF; INTERRUPTS ARE RECEIVED FROM A CONTROLLER UNDER FOUR CIRCUMSTANCES; THEY ARE AS FOLLOWS:;OF; 1. DURING THE INITIALIZATION PROCESS (OPEN THE "VIRTUAL CIRCUIT")> ; 2. WHEN THE "COMMAND RING BUFFER" TRANSITIONS FROM "FULL" ; TO "NOT FULL"2A ; 3. WHEN THE "RESPONSE RING BUFFER" TRANSITIONS FROM "EMPTY"I ; TO "NOT EMPTY"F ; 4. WHEN A FATAL CONTROLLER ERROR IS DETECTED AND AN INTERRUPT CAN3; BE GENERATED. FATAL CONTROLLER ERRORS ARE:R; 9; A. FAILURE TO BECOME UNIBUS MASTER FOR DATA TRANSFERA5; B. FAILURE TO BECOME UNIBUS MASTER FOR INTERRUPTO/; C. FAILURE TO ACCESS I/O PAGE REGISTERS ORR6; COMMUNICATIONS AREA (I.E. NON-EXISTENT MEMORY)$; D. UNIBUS PARITY ERROR DETECTED; ; INPUT"; R5 POINTS TO A UCB;-PORINT:: ;JJM3074 MOV S.QST(R4),R2 ;R2 POINTS TO THE QST ;JJM307  ASSUME Q.CST,0 ;JJM3079 MOV (R2),R3 ;/*Q.CST*/ ;R3 POINTS TO THE CST ;JJM307C4 MOV S.CSR(R4),R1 ;R1 POINTS TO THE CSR ;JJM307  ASSUME C.STAT,0 ;JJM307D BIT #C1.F00^Bnn]nccccAT,(R3) ;WAITING FOR TIMEOUT TO START RECOVERY? ;JJM3076 ;CAN SOMETIMES GET INTERRUPT IN MIDDLE ;JJM3074 ;OF POWERFAIL BEFORE CONTROLLER GETS ;JJM307" ;RE-INITIALIZED. ;JJM307* BNE 55$ ;IF NE, YES, RETURN ;JJM3076 TST Q.STAT(R2) ;IN SYNCHRONIZATION STATE? ;JJM3078 BMI 70$ ;GO HANDLE SYNCH RELATED INTERRUPTS ;JJM307; ;JJM307=; THIS SECTION DEALS WITH RESPONSES AND COMMANDS ;JJM307O; ;JJM307A10$: TST SA(R1) ;DID CONTROLLER SUFFER A FATAL ERROR? ;JJM307I9 BMI 60$ ;HANDLE IT AS CONTROLLER FATAL ERROR ;JJM307 ;15$: MOV Q.RING(R2),R1 ;R1 POINTS TO THE RINGS ;JJM307T= CLR CMDINT(R1) ;CLEAR COMMAND INTERRUPT INDICATOR ;JJM307E/ CLR RSPINT(R1) ;AND RESPONSE TOO. ;JJM307A; ;JJM307(; PROCESS ALL RESPONSES ;JJM307; ;JJM307;20$: MOV Q.CRSP(R2),R1 ;STARTING RESPONSE RING ;JJM307W723$: TST MSW(R1) ;DOES HOST OWN THIS RING? ;JJM30737 BMI 50$ ;NO. WE MUST BE DONE WITH THE SCAN ;JJM307R< SUB Q.FRSP(R2),R1 ;GET OFFSET TO RING FROM BASE ;JJM307% ASR R1 ;DIVIDE BY TWO ;JJM307R< ADD Q.RPAT(R2),R1 ;GET TABLE ADDRESS OF ADDRESS ;JJM3072 MOV (R1),R1 ;GET REAL PACKET ADDRESS ;JJM307; MOVB CREDIT(R1),R0 ;ELSE, PROCESS THE RESPONSE ;JJM307R? BIC #^C,R0 ;R0 CONTAINS CREDIT/DEBIT FIELD ;JJM307M9 ADD R0,C.CMDS(R3) ;ADD TO CLASS CREDIT COUNT ;JJM307:" MOV CREDIT(R1),R0 ;JJM307? BIC #^C,R0 ;R0 CONTAINS MESSAGE TYPE FIELD ;JJM307J5 BNE 27$ ;MUST NOT BE A SEQUENTIAL PACKET ;JJM307B: ASSUME MSGSEQ,0 ;MAKE THAT ASSUMPTION, THOUGH ;JJM307: CALLV CLASS,CLAEND ;PROCESS SEQUENTIAL PACKET ;JJM3076 ASSUME Q.CST,0 ;ASSUME AT START OF TABLE ;JJM307( MOV (R2),R3 ;RESTORE CST ;JJM307' BR 45$ ;JOIN COMMON CODE ;JJM307NG27$: CMPB #,R0 ;IS THIS A REAL LIVE DATAGRAM? ;JJM307R5 BNE 40$ ;NO. JUST DEALLOCATE THE PACKET ;JJM30776 CALLV CLASS,CLADAT ;PROCESS THE DATAGRAM ;JJM307' BR 45$ ;JOIN COMMON CODE ;JJM307E40$: ;JJM307 .IF DF,DSADEB ;JJM307 INC UNKPKT ;JJM307L .ENDC ;DSADEB ;JJM307I ;JJM3070 CALL PKTDR ;THROW THE PACKET AWAY ;JJM307C45$: MOV Q.CRSP(R2),R1 ;GET CURRENT RING DESCRIPTOR ADDR ;JJM307N5 ADD #CMDSIZ,R1 ;POINT TO NEXT DESCRIPTOR ;JJM307H: CMP R1,Q.LRSP(R2) ;DO WE NEED TO WRAP AROUND? ;JJM307 BLOS 47$ ;NO. ;JJM3079 MOV Q.FRSP(R2),R1 ;YES. SO WRAP TO BEGINNING ;JJM307B@47$: MOV R1,Q.CRSP(R2) ;REMEMBER THE NEXT ONE TO USE ;JJM307- BR 23$ ;AND GO LOOK FOR ANOTHER ;JJM307 ; ;JJM307G; ALL RESPONSES HAVE BEEN PROCESSED. TRY TO START MORE I/O ;JJM307T; ;JJM307F50$: JMPV CLASS,CLACMD ;CALL CLASS DRIVER TO START MORE I/O ;JJM30755$: RETURN ;JJM307N; ;JJM307N; HANDLE CONTROLLER ERROR. ALL ASSOCIATED CLASS DRIVERS WOULD HAVE ;JJM307+; TO BE TOLD AT THIS POINT. ;JJM307O; ;JJM307660$: SEC ;INDICATE ERROR SHOULD BE LOGGED ;JJM307: JMPV CLASS,CLAERR ;INFORM THE CLASS DRIVER(S) ;JJM307; ;JJM3079; HANDLE SYNCHRONIZATION RELATED INTERRUPTS ;JJM307M; ;JJM307670$: TST SA(R1) ;WAS THERE A FATAL ERROR? ;JJM307' BPL 75$ ;NO. SO CONTINUE ;JJM307:) JMP OPN ;YES. TRY TO RETRY ;JJM3073475$: TST Q.SAD(R2) ;SPURIOUS INTERRUPT? ;JJM307, BEQ 55$ ;YES. IGNORE IT THEN ;JJM307; JMP @Q.SAD(R2) ;NO. SO PROCESS NECESSARY STEP ;JJM307Cw .PAGE ;**-94D4x .SBTTL PORSEN - SEND COMMAND PACKET TO CONTROLLERy;+/z; **-PORSEN-SEND COMMAND PACKET TO CONTROLLERD{;NG|; THIS ROUTINE SENDS THE CURRENT COMMAND PACKET TO THE CONTROLLER FOR:G}; PROCESSING. ONCE THE PACKET HAS BEEN SENT, THIS ROUTINE DETERMINESNB~; THE NEXT AVAILABLE COMMAND RING THAT CAN BE USED. WRAP AROUND4; PROCESSING FOR THIS TAKES PLACE IN THIS ROUTINE.; ;**-1 ; INPUTS:J;(; R1=ADDRESS OF COMMAND PACKET TO SEND; R2=Q00^JnmmmmffDATAST ADDRESS; R3=I/O PACKET ADDRESS; R4=SCB ADDRESS; R5=UCR ADDRESS+; VARIOUS QST AND CST FIELDS ;JJM304P; ;**-4 ; OUTPUTS:;U; R1,R2,R3,R4,R5 PRESERVED<; Q.CCMD(R2)=ADDRESS OF NEXT AVAILABLE CMD RING DESCRIPTOR; COMMAND PACKET DISPATCHEDD8; C.CMDS(R3)=NEW CREDIT COUNT (ONE LESS THAN ON ENTRY);D;-PORSEN:: ;JJM307  ASSUME Q.CST,0 ;JJM3079 MOV (R2),R0 ;/*Q.CST*/ ;GET THE CST ADDRESS ;JJM307 = MOVB C.VCID(R0),VCID(R1) ;SET VIRTUAL CIRCUIT ID ;JJM307D4 DEC C.CMDS(R0) ;DECREMENT CREDIT COUNT ;JJM3078 MOV Q.CCMD(R2),R0 ;GET CURRENT COMMAND RING ;JJM307E BIS #OWN!FLAG,MSW(R0) ;MARK AS CONTR OWNED/REQUEST INTRPTS ;JJM307E/ MOV S.KRB(R4),R0 ;GET KRB ADDRESS ;JJM307M/ MOV K.CSR(R0),R0 ;GET CSR ADDRESS ;JJM307  ASSUME IP,0 ;JJM3070 TST (R0) ;START CONTROLLER LOOKING ;JJM307:5$: ADD #CMDSIZ,Q.CCMD(R2) ;POINT TO NEXT RING ;JJM3076 CMP Q.CCMD(R2),Q.LCMD(R2) ;OUT OF RINGS? ;JJM307 BLOS 10$ ;NO. ;JJM307@ MOV Q.FCMD(R2),Q.CCMD(R2) ;YES. PERFORM WRAP AROUND ;JJM307(10$: RETURN ;AND GO BACK ;JJM307 .PAGE ;**-28R9 .SBTTL PORSUP - SETUP DATA STRUCTURES ETC FOR THE PORTK;+ ; **-PORSUP-PORT SETUP ROUTINE;V9; THE FOLLOWING THREE ROUTINES WILL BE CALLED BY PORSUP ; TO DO THE FOLLOWING:;SG; SETUP - PERFORM DRIVER SPECIFIC SET UP FUNCTIONS SUCH AS SETTING UPN1; THE CST, QST, AND RINGS FOR THE CONTROLLER.U;RC; VACSET - SET UP INFORMATION NEEDED TO CONVERT VIRTUAL ADDRESSES.>; TO PHYSICAL ADDRESSES. IF A UMR IS NEEDED TO MAP UQCOM,.; THEN IT SHOULD BE ALLOCATED AND MAPPED.;. ; INPUTS:-;P; R1=VIRTUAL CIRCUIT IDE; R4=SCB ADDRESS; R5=UCB ADDRESS;E ; OUTPUTS:;L ; R2=QST ; R4=SCB ; R5=UCB; STORE QST IN SCB"; CALCAULATE UQRELC AND UQRELC+2); SEE VACSET ROUTINE FOR DESCRIPTION OF ; UQRELC AND UQRELC+2.;- PORSUP::* TST EXEVEC ;IF DONE ALREADY ;JJM325" BNE 10$ ;SKIP THIS ;JJM325; MOV @#112,R0 ;GET POINTER TO VECTOR OF POINTERS ;JJM325 > MOV @(R0),-(SP) ;MAP ROUTINE WITH CORRECT APR BIAS ;JJM325> MOV #120000,-(SP) ;GET ADDR. OF TRANSLATE ROUTINE ;JJM3255 MOV #EXEVCL,R2 ;SPECIFY LENGTH OF VECTOR ;JJM325- MOV #EXEVEC,R3 ;POINT TO VECTOR ;JJM325TE CALL @<140000+MPPRO> ;CALL ROUTINE IN EXEC WHICH MAPS AND ;JJM325I( ;CALLS TRANSLATE ROUTINE ;JJM32510$: ;JJM325) MOV S.CON(R4),R0 ;GET CONTROLLER INDEX* ASL R1 ;CONVERT VC ID INTO BYTE OFFSET2 ADD TABTAB(R1),R0 ;R0 POINTS TO THE QST ADDRESS, MOV (R0),R2 ;R2 CONTAINS THE QST ADDRESS* ASR R1 ;RESTORE THE VIRTUAL CIRCUIT ID- MOV R2,S.QST(R4) ;STORE QST ADDRESS IN SCB#  ASSUME Q.CST,0 ;JJM3063 MOV (R2),R3 ;/*Q.CST*/ ;R3 CONTAINS CST ADDRESSJ1 MOVB R1,C.VCID(R3) ;STORE THE VC ID IN THE CSTE  RETURNS .PAGEI .SBTTL PORUMR - ALLOCATE/DEALLOCATE STATIC UMR AND DYNAMIC WAIT BLOCKS;+D; **-PORUMR-ALLOCATE/DEALLOCATE STATIC UMR AND DYNAMIC WAIT BLOCKS;SQ; CALLED WHENEVER A CONTROLLER IS BROUGHT ONLINE OR OFFLINE. THE STATIC UMR ISSO; ALLOCATED ONLY ONCE, AND A COUNT IS KEPT OF HOW MANY CONTROLLERS ARE ONLINE L; TO THE PORT. WHEN THE COUNT GOES TO ZERO, THE UMR IS DEALLOCATED. WAITO; BLOCKS ARE ALLOCATED ON A PER-CONTROLLER BASIS TO AVOID HAVING TO DEAL WITHH; FAIRNESS PROBLEMS.; ; INPUTS:U;AA; C = 1 TRANSITION TO OFFLINE - DEALLOCATE UMR AND WAIT BLOCKS*; R2 = KRB ADDRESS; >; C = 0 TRANSITION TO ONLINE - ALLOCATE UMR AND WAIT BLOCKS4; R0 = HIGH 6 BITS OF RELOCATION BIAS FOR PORT UMR4; R1 = LOW 16 BITS OF RELOCATION BIAS FOR PORT UMR; R2 = KRB ADDRESS; R3 = CST ADDRESS;R ; OUTPUTS:;G0; UMR AND WAIT BLOCKS ALLOCATED OR DEALLOCATEDK; FOR THE ONLINE TRANSITION, R0 AND R1 CONTAIN THE RELOCATION BIAS OF THE; ALLOCATED UMR.;- PORUMR:* BCC 30$ ;IF CC ONLINE REQUEST ;**-5= TST CONCNT ;IS THIS THE LAST CONTROLLER 00^Rnn]nccccMAPPING THE PORT?0* BNE 10$ ;NO, JUST DUMP THE WAIT BLOCKS: MOV UMRMAP,R2 ;GET THE ADDRESS OF THE UMR MAPPING BLOCK7 CLR UMRMAP ;MAKE SURE UMRMAP IS ZERO SO WE ALLOCATE% ;..A STATIC UMR AGAIN NEXT TIMEE PUSH ;SAVE THE CST1 CALL @DEUMR ;DEALLOCATE STATIC UMR ;JJM325= MOV R2,R0 ;MOVE THE ADDRESS OF THE CORE BLOCK TO R0 ;**-1I$ MOV #M.LGTH,R1 ;CORE BLOCK LENGTH4 CALL @DEACB ;DEALLOCATE THE CORE BLOCK ;JJM325&  POP ;RESTORE THE CST ;**-1> 10$: ADD #C.UMRW,R3 ;POINT TO THE START OF THE UMR WAIT BLOC? 15$: MOV #UMRWTB,R1 ;SET THE LENGTH OF A WAIT BLOCK ;PKW106G(  MOV (R3),R0 ;GET A BLOCK ;PKW106(  BEQ 20$ ;IF EQ WE'RE DONE ;PKW106B  .IIF DF M$$PRO TST -(R0) ;BACK UP OVER UNIBUS RUN MASK ;PKW106- CLR (R3)+ ;CLEAR OUT THE ADDRESS ;**-30 PUSH ;SAVE IT4 CALL @DEACB ;DEALLOCATE THE CORE BLOCK ;JJM325& POP ;AND RESTORE IT ;**-1 BR 15$ ;GO DO ANOTHER20$: RETURN ;ALL DONE 30$: ;**-3.8 TST UMRMAP ;IS THIS THE FIRST CONTROLLER TO CONNECT?% BNE 40$ ;NO, JUST GET WAIT BLOCKS < PUSH ;SAVE RELOCATION BIAS HIGH AND LOW ;PKW106< MOV #M.LGTH,R1 ;LENGTH OF CORE BLOCK TO ALLOCATE ;PKW1061 CALL @ALOCB ;ALLOCATE A CORE BLOCK ;PKW106R$ BCS 80$ ;ERROR, EXIT ;PKW106; MOV R0,UMRMAP ;SAVE THE ADDRESS OF THE CORE BLOCK ;**-3O/ POP M.BFVL(R0) ;SET UP LO 16-BITS OF ADDRESS J  MOVB (SP),M.BFVH(R0) ;SET UP HI 6-BITS OF ADDRESS (WE ONLY NEED A BYTE)5! TST (SP)+ ;POP OFF THE WORD TO MAINTAIN THE STACKL," MOV #4,M.UMRN(R0) ;SET UP COUNT FOR 1 UMR*" CALL @ASUMR ;GO ASSIGN UMR ;PKW106)" BCS 90$ ;IF CS, ERROR EXIT ;PKW106R%; ;**-2F&; WE'LL DO THE ACTUAL MAPPING LATER SO THAT A RESYNCH CAN REMAP ALSO';?(; NOW WE ALLOCATE A SET OF UMR WAIT BLOCKS FOR THE CONTROLLERA);S*40$:,+ TST C.UMRW(R3) ;ARE WAIT BLOCKS ASSIGNED?, BNE 70$ ;IF NE, YES, DONE 4, MOV #DUUMR,R2 ;ASSUME THAT IT IS A DISK ;PKW106 , ASSUME U.DCB,0 ;JJM306(, MOV (R5),R1 ;GET THE DCB ;JJM306:, CMP #"DU,D.NAM(R1) ;SEE IF IT IS DISK OR TAPE ;PKW106(, BEQ 50$ ;IF EQ IT IS DISK ;PKW106), MOV #MUUMR,R2 ;IT'S A TAPE ;PKW10627,50$: PUSH ;SAVE WORKING REGISTERS ;PKW106 4, ADD #C.UMRW,R3 ;POINT TO UMR WAIT QUEUE ;PKW1066,60$: MOV #UMRWTB,R1 ;LENGTH OF WORK BLOCK ;PKW106,, PUSH R2 ;SAVE THE BLOCK INDEX ;PKW106A, CALL @ALOCB ;ALLOCATE A CORE BLOCK FOR UMR ASSIGNMENT ;PKW106 -, POP R2 ;RESTORE THE BLOCK INDEX ;PKW106M;, BCS 65$ ;WE WILL ALLOCATE THE REST DYNAMICALLY ;PKW106S, ;PKW106A3, .IF DF M$$PRO ;MULTIPROCESSOR SYSTEM ;PKW1066,, MOV U.SCB(R5),R4 ;SCB ADDRESS ;PKW1062, MOV S.URM(R4),(R0)+ ;UNIBUS RUN MASK ;PKW106, .ENDC ;M$$PRO ;PKW106 , ;PKW10617, MOV R0,(R3)+ ;PUT THE ADDRESS IN THE TABLE ;PKW10661, SOB R2,60$ ;LOOP THROUGH ALLOCATION ;PKW106C1,65$: POP ;RESTORE REGISTERS ;PKW106N<C70$: MOV UMRMAP,R0 ;GET THE STATIC UMR WAIT BLOCK ;**-22*C CALL @MPUB1 ;MAP THE UNIBUS ;GM1121E MOV UMRMAP,R2 ;GET BACK THE STATIC UMR ;**-1P5F MOVB M.UMVH(R2),R0 ;HIGH 2 BITS OF RELOCATION BIAS)%G ASH #-4,R0 ;SHIFT BITS 4:5 TO 0:1U4H MOV M.UMVL(R2),R1 ;LOW 16 BITS OF RELOCATION BIAS!H CLC ;GOOD RETURN ;PKW106PH RETURN ;PKW106T1H80$: POP ;RESTORE REGISTERS ;PKW106 &H90$: SEC ;ERROR RETURN ;PKW106L RETURN ;**-3EM .PAGE/N .SBTTL PORSYN - PORT SYNCHRONIZATION ROUTINECO;++P; **-PORSYN-STANDARD PORT SYNCHRONIZATIONUQ; ER; TRANSFERED TO BY CLASS DRIVER TO START CONTROLLER SYNCHRONIZATION S;H T; INPUTS: U;SV; R5=UCB ADDRESSW; R4=SCB ADDRESSX; R3=CST ADDRESSY; R2=QST ADDRESSZ; S.CSR=CSR ADDRESSC&[; S.VCT=(INTERRUPT VECTOR ADDRESS)/4\;P ]; OUTPUTS:^; <_; IF INITIAL PART OF HARDWARE SYNCHRONIZATION BEGINS THEN:`;:6a; THE CONTROLLER HAS BEGUN STEP 1 OF SYNCHRONIZATIONb; R2-R5 PRESERVEDTc; R0,R1 DESTROYEDRHd; Q.RTY=RETRY-1 00^ZnmmmmffDATA(A TOTAL OF (RETRY) RE-TRIES WILL BE MADE BY THE PORT)Be; Q.SAD=OPN2 (AN INTERRUPT IS EXPECTED AND WILL CAUSE A TRANSFERf; TO THE ADDRESS IN Q.SAD)S2g; Q.STAT=Q1.SYN (CONTROLLER STATE=SYNCHRONIZING)Gg; Q.INDX=2 (ROUTINE WSW WILL USE THE SECOND ENTRY IN Q.WRIT) ;JJM308T<i; Q.CTM=STMOC (STOMC SECOND TIME OUT ON EACH STEP) ;**-1Aj; Q.STEP=STEP2 (WE ARE WAITING FOR COMPLETION OF STEP 1 AND THELk; BEGINNING OF STEP 2.H7l; Q.WRIT=4 STEP VALUES HOST MUST WRITE TO SA REGISTERn; ;**-1o; IF ALL RE-TRIES FAIL:Lp;Mq; CONTROL TRANSFERS TO CLASYN(r; C=1 TO INDICATE FAILUREWs; R5=UCB ADDRESSt; R4=SCB ADDRESSu; R3=CST ADDRESSv; R2=QST ADDRESS7w; Q.STAT=Q1.OFF (CONTROLLER STATE=OFF-LINE, UNUSABLE)Ux;-y zPORSYN::2{ MOVB #RETRY,Q.RTY(R2) ;SET UP FOR RETRY RE-TRYS4| CLR Q.SAD(R2) ;PROTECT AGAINST SPURIOUS INTERRUPT} ;UQINT WILL JUST DROP IT(~ ;IF Q.SAD(R2)=0 AND Q1.SYN IS SET.9 MOV #Q1.SYN,Q.STAT(R2) ;CONTROLLER STATE=SYNCHRONIZING ' ;CONTROL NOW FALLS THROUGH TO THEL ;OPN MODULE.! BIS #C1.SYN,(R3) ;SET SYNC BITT6 MOV #1,C.CMDS(R3) ;SET INTITIAL CREDIT COUNT TO ONE* ;MUST BE 1 BECAUSE IT IS DECREMENTED ;WHEN THE OP.SCC IS SENT .PAGE$ .SBTTL . OPN ;JJM304; ;**-1<; CONTROL TRANSFERS HERE IF AN ERROR IN SYNCHRONIZATION IS:; DETECTED. CONTROL ALSO FALLS THROUGH TO HERE FROM THE; PORSYN ENTRY POINT.E; ; INPUTS:Q;(; R0,R1 MAY BE DESTROYED; R5=UCB ADDRESS; R4=SCB ADDRESS; R3=CST ADDRESS; R2=QST ADDRESS!; Q.RTY=NUMBER OF RE-TRIES LEFTM;,  .ENABL LSB OPN::C+ DECB Q.RTY(R2) ;TRY OR RE-TRY? ;**-2I BGE 5$ ;IF GE, YES4 MOV #Q1.OFF,Q.STAT(R2) ;CONTROLLER STATE=OFF-LINE; E; LET CLASS DRIVER HANDLE FAILURE OF SYNCHRONIZATION BY TRANSFERINGR ; TO CLASYN WITH THE CARRY SET;C9BADSYN: SEC ;INDICATE FAILURE TO SYNCHRONIZE ;PKW106Y> JMPV CLASS,CLASYN ;TRANSFER TO CLASS DRIVER (CLASYN) ;**-1;5%; COMMENCE HARDWARE SYNCHRONIZATION3;A5$: ;JJM308; ;**-8-; SET UP 4 STEP VALUES THAT HOST MUST WRITE:;$ PUSH ;SAVE R3 MON THE STACK MOV R2,R3 ;R3=QST ADDRESS; ADD #Q.WRIT,R3 ;R3 POINTS TO THE Q.WRIT TABLE IN THE QST ;; SET UP FIRST WORD TO PASS TO THE CONTROLLER ;JJM304R= MOVB S.VCT(R4),(R3) ;(INTERRUPT VECTOR ADDR) / 4 ;**-10I& BISB #INTE,(R3)+ ;ENABLE INTERRUPTS;J1; CALCULATE COMMAND RING LENGTH AS A POWER OF 2 ;13 MOVB Q.CMDN(R2),R0 ;R0=NUMBER OF CMD DESCRIPTORS. MOV #-1,R1 ;R1 IS FOR COUNTING POWERS OF 2%15$: INC R1 ;COUNT THIS POWER OF 2T ASR R0 ;SHIFT RIGHTS, BNE 15$ ;IF NE, COUNT ANOTHER POWER OF 2/ ASL R1 ;ELSE, SHIFT C RNG LNG INTO POSITIONT  ASL R1H  ASL R1 ( MOVB R1,(R3) ;AND ADD IT TO THE WORD3 MOVB Q.RSPN(R2),R0 ;R0=NUMBER OF RSP DESCRIPTORSE. MOV #-1,R1 ;R1 IS FOR COUNTING POWERS OF 2%25$: INC R1 ;COUNT THIS POWER OF 2O ASR R0 ;SHIFT RIGHTW, BNE 25$ ;IF NE, COUNT ANOTHER POWER OF 2' BISB R1,(R3) ;ADD R RNG LNG TO WORD1 BISB #200,(R3) ;SET BIT 15- POP ;RESTORE R3 TO ORIGINAL CONTENTS ;F:; CONTINUE WITH INITIALIZATION AND START SYNCHRONIZATION; : MOV #STEP1,Q.STEP(R2) ;Q.STEP=FIRST STEP VALUE EXPECTED8 CLR Q.INDX(R2) ;INITIALIZE OFFSET INTO TABLES TO ZERO) MOV S.CSR(R4),R0 ;R0 POINTS TO THE CSR ASSUME IP,0 ;JJM305G0 CLR (R0) ;HARD INIT THE CONTROLLER ;JJM305- PUSH <#50.> ;COUNTER FOR DELAY ;JJM305E(30$: DEC (SP) ;COUNT DOWN ;JJM305+ BGT 30$ ; FOR ENTIRE DELAY ;JJM305 ) TST (SP)+ ;CLEAN OFF STACK ;JJM305R; CALL WSW ;PROCESS START OF STEP 1 (TABLE DRIVEN) ;**-4S. BCS OPN ;IN CASE OF ERROR GO TRY TO RE-TRY;;9; IN CASE AN ERROR IS DETECTED CONTROL TRANSFERS TO OPNL; ;**-1K; SET UP KS.EXT BIT IN K.STS FOR THE CONTROLLER, BASED ON QB BIT IN VALUE '; READ FROM SA AT THE START OF STEP 1T;R1 MOV S.KRB(R4),R4 ;GET THE KRB ADDRESS ;**-6J> BIC #KS.EXT00^bnn]ncccc,K.STS(R4) ;ASSUME EXTENDED MEMORY NOT SUPPORTEDC BIT #QB,Q.TEMP(R2) ;CONTROLLER SUPPORT 22 BIT HOST BUS? ;JJM308M  BEQ 35$ ;IF EQ, NO ;**-1;E; * * * N O T E * * *B;N?; THE FOLLOWING BRANCH MAY BE NOP'D IN ORDER TO ALLOW THE USEI<; OF 22-BIT MSCP CONTROLLERS ON BUS ADAPTERS WHICH REQUIRE$; THE USE OF UNIBUS MAP REGISTERS.;E1$$$BR1::BR 34$ ;NORMALLY SKIP THE SYSTEM CHECKH> BIT #HF.UBM,@HFMSK ;ARE THERE UMR'S ON THE SYSTEM ;JJM3253 BNE 35$ ;YES, THEN USE CONVERTER OPTION ;**-1E34$:> BIS #KS.EXT,K.STS(R4) ;INDICATE CONTROLLER IS ON 22 BIT BUS035$: MOV U.SCB(R5),R4 ;RESTORE THE SCB ADDRESSE PUSH <120000+SCUCB> ;GET THE ADDRESS OF THE SCAN UCB ROUTINE ;**-3N'37$: CALL @(SP)+ ;CALL THE COROUTINEI BCS 45$ ;IF CS, ALL DONE> BIC #DV.EXT,U.CW1(R5) ;ASSUME EXTENDED MEMORY NOT SUPPORTEDC BIT #QB,Q.TEMP(R2) ;CONTROLLER SUPPORT 22 BIT HOST BUS? ;JJM308B BEQ 37$ ;IF EQ NO ;**-1S ;Y ; * * * N O T E * * *S ;N? ; THE FOLLOWING BRANCH MAY BE NOP'D IN ORDER TO ALLOW THE USE;< ; OF 22-BIT MSCP CONTROLLERS ON BUS ADAPTERS WHICH REQUIRE$; THE USE OF UNIBUS MAP REGISTERS.;C)$$$BR2::BR 38$ ;SKIP THE SYSTEM CHECKSN> BIT #HF.UBM,@HFMSK ;ARE THERE UMR'S ON THE SYSTEM ;JJM3253 BNE 37$ ;YES, THEN USE CONVERTER OPTION ;**-1T38$:: BIS #DV.EXT,U.CW1(R5) ;INDICATE DEVICE IS ON 22 BIT BUS BR 37$ ;GO DO ANOTHERB45$: ;CONTINUEN; ;**-2-; SET UP THE RELOCATION REGISTERS AT UQRELQH;L CALL VACSET& BCS BADSYN ;ERROR EXIT ;PKW106;2D; SET UP THE NEXT THREE WORDS TO SEND TO THE CONTROLLER ;JJM3042; ;**-203 PUSH ;SAVE R3"4 MOV R2,R3 ;GET THE QST ADDRESS>5 ADD #Q.WRIT+2,R3 ;GET TO THE ADDRESS OF THE NEXT START WORD:6 MOV Q.RING(R2),R0 ;R0 POINTS TO THE RING BASE (LOW ADDR.7 CALL VACPA ;CONVERT R0 TO PHYSICAL ADDRESS4: MOV R0,(R3)+ ;Q.WRIT+2=RING BASE LOW BITS ;**-2-; MOV R1,(R3)+ ;Q.WRIT+4=RING BASE HIGH BITSE,< MOV #LF!GO,(R3)+ ;Q.WRIT+6=LAST FAIL ! GO= POP ;RESTORE R3>;1C?; SET TIME-OUT, AND RETURN, AN INTERRUPT WILL TRANSFER TO OPN2 TO :@; PROCESS THE COMPLETION OF STEP 1 (BEGINNING OF STEP 2)3A MOVB #STMOC,S.ITM(R4) ;SET INITIAL TIMEOUT COUNTG3B MOVB #STMOC,S.CTM(R4) ;AND CURRENT TIMEOUT COUNTN&C MOV R5,S.BSYU(R4) ;SET THE BUSY UCB0D BISB #US.BSY,U.STS(R5) ;MARK THE UNIT AS BUSY?E MOV #OPN2,Q.SAD(R2) ;THE NEXT INTERRUPT WILL TAKE US TO OPN2VF RETURN ;RETURNI G .DSABL LSBTH .PAGE%H .SBTTL . OPN2 ;JJM304J;+ ;**-1 K; AT THE START OF STEP 2;L; OPN2 IS JUMPED TO FROM UQINT (THE INTERRUPT PROCESSOR);SN; ;**-1 O; INPUTS:NP;FQ; R5=UCB ADDRESSR; R4=SCB ADDRESSS; R3=CST ADDRESST; R2=QST ADDRESSU;R V; OUTPUTS:W;EX; R2-R5 PRESERVED,Y; R0,R1 DESTROYEDUZ; S.ITM(R4)=STMOCS[; Q.SAD=OPN3\;-]^OPN2::+_ CALL WSW ;PROCESS STEP 2 (TABLE DRIVEN)L` BCC 5$ ;ALL IS OKRa JMP OPN ;WE FAILED, RESTART;b5$: MOVB S.ITM(R4),S.CTM(R4) ;RESET CURRENT TIMEOUT COUNT ?c MOV #OPN3,Q.SAD(R2) ;THE NEXT INTERRUPT WILL TAKE US TO OPN3Ud RETURN ;RETURNRe .PAGE%e .SBTTL . OPN3 ;JJM304Fg;+ ;**-1h; AT THE START OF STEP 3 i; OPN3 IS JUMPED TO FROM UQINTk; ;**-1 l; INPUTS: m;Rn; R5=UCB ADDRESSo; R4=SCB ADDRESSp; R3=CST ADDRESSq; R2=QST ADDRESSr; s; OUTPUTS:t;Su; R2-R5 PRESERVEDNv; R0,R1 DESTROYEDSw; Q.CTM=STMOC x; Q.SAD=OPN4y;-z{OPN3::+| CALL WSW ;PROCESS STEP 3 (TABLE DRIVEN) $} BCC 5$ ;IF CC, SUCCESS, CONTINUE.~ JMP OPN ;ELSE JUMP TO OPN AND MAYBE RE-TRY;5$: MOVB S.ITM(R4),S.CTM(R4) ;RESET CURRENT TIMEOUT COUNT ? MOV #OPN4,Q.SAD(R2) ;THE NEXT INTERRUPT WILL TAKE US TO OPN4R RETURN ;RETURN  .PAGE% .SBTTL . OPN4 ;JJM304;+ ;**-1 ; AT THE START OF STEP 4 ; OPN4 IS JUMPED TO FROM UQINT; ;**-1 ; INPUTS:E;E; R5=UCB ADDRESS; R4=SCB ADDRESS; R3=CST A00^jnmmmmffDATADDRESS; R2=QST ADDRESS;3 ; OUTPUTS:;#; CONTROL IS TRANSFERED TO CLASYN.; C=0 (INDICATES SUCCESSFUL SYNCHRONIZATION); R2-R5 PRESERVEDC; R0,R1 DESTROYED ; Q.CTM=? ; Q.SAD=?4*; Q.STAT=Q1.RDY (CONTROLLER STATE=READY); RING DESCRIPTORS ARE SET UP;E;-OPN4::+ CALL WSW ;PROCESS STEP 4 (TABLE DRIVEN)$ BCC 5$ ;IF CC, SUCCESS, CONTINUE. JMP OPN ;ELSE JUMP TO OPN AND MAYBE RE-TRY+5$: CALL RNGSET ;SET UP RING DESCRIPTORSA1 MOV #Q1.RDY,Q.STAT(R2) ;CONTROLLER STATE=READY3J MOV Q.FRSP(R2),Q.CRSP(R2) ;SET UP INITIAL RESPONSE RING POINTER ;JJM308J MOV Q.FCMD(R2),Q.CCMD(R2) ;SET UP INITIAL COMMAND RING POINTER ;JJM308# CLC ;INDICATE SUCCESS ;**-1T8 JMPV CLASS,CLASYN ;TRANSFER TO CLASS DRIVER TO HANDLE .PAGE4 .SBTTL RNGSET - INITIAL SETUP OF RING DESCRIPTORS;+0; **-RNGSET-INITIAL SET UP OF RING DESCRIPTORS;PF; THIS ROUTINE IMPLEMENTS THE DESIGN DECISION TO STATICALLY ALLOCATEG; A PACKET TO EACH RING DESCRIPTOR. IT FILLS IN EACH DESCRIPTOR WITHVF; THE PHYSICAL ADDRESS OF THE PACKET ASSOCIATED WITH THE DESCRIPTOR.;Q ; INPUTS:C;); R2=QST ADDRESS; R4=SCB ADDRESS$; VARIOUS QST FIELDS ;JJM304; ;**-8 ; OUTPUTS:;T; IT DESTROYS R0, R1>; A PACKET IS ASSOCIATED PERMANENTLY WITH EACH DESCRIPTOR BY=; FILLING THE DESCRIPTOR WITH THE PACKETS PHYSICAL ADDRESS.,; ALL CMD DESCRIPTORS ARE MADE HOST OWNED.D; ALL RSP DESCRIPTORS ARE MADE CONTROLLER OWNED WITH (FLAG BIT)=1.;N;- RNGSET::3 PUSH ;SAVE R4,R3,R2, R2 MUST BE LAST!I0 MOV Q.RING(R2),R3 ;R3 POINTS TO THE RING BASE. MOVB Q.RSPN(R2),R4 ;R4=NUMBER OF RSP DESCR.D MOV Q.RPAT(R2),R2 ;R2 POINTS TO THE TABLE OF RSP PACKET ADDRESSES05$: MOV (R2)+,R0 ;R0=VA OF RSP PACKET (TEXT+0), MOV #RPLEN,MSGLNG(R0) ;SET MESSAGE LENGTH( CLR CREDIT(R0) ;CLEAR CREDIT AND VCID1 CALL VACPA ;CONVERT VIRTUAL ADDR. TO PHYSICALE ;R0=LOW BITS ;R1=HIGH BITSR7 MOV R0,(R3)+ ;FILL IN DESCR. WITH PHYSICAL PKT ADDR.: MOV R1,(R3)@ BIS #OWN!FLAG,(R3)+ ;MAKE DESCR. CONTROLLER OWNED AND REQUEST$ ;INTERRUPT ON RING TRANSITIONS7 SOB R4,5$ ;LOOP AND SET UP ALL RSP RING DESCRIPTORS2% MOV (SP),R2 ;R2 POINTS TO THE QSTE7 MOVB Q.CMDN(R2),R4 ;R4=NUMBER OF COMMAND DESCRIPTORSD MOV Q.CPAT(R2),R2 ;R2 POINTS TO THE TABLE OF CMD PACKET ADDRESSES- ;R3 POINTS TO FIRST COMMAND DESCR SINCE # ;CMD DESCR. FOLLOW RSP DESCR.S110$: MOV (R2)+,R0 ;R0=VA OF CMD PACKET (TEXT+0)S, MOV #CPLEN,MSGLNG(R0) ;SET MESSAGE LENGTH( CLR CREDIT(R0) ;CLEAR CREDIT AND VCID1 CALL VACPA ;CONVERT VIRTUAL ADDR. TO PHYSICALA ;R0=LOW BITS ;R1=HIGH BITSA7 MOV R0,(R3)+ ;FILL IN DESCR. WITH PHYSICAL PKT ADDR.H( MOV R1,(R3)+ ;CMD PKTS ARE HOST OWNED8 SOB R4,10$ ;LOOP AND SET UP ALL CMD RING DESCRIPTORS# POP ;RESTORE R2,R3,R4  RETURN ;RETURNO .PAGEC .SBTTL STOMP - BRING A CONTROLLER TO THE OFFLINE STATE ;JJM304R;+ ;**-1E#; **-STOMP-CLOBBER THE CONTROLLER ;GN; CALLED TO ENSURE THAT THE CONTROLLER IS IN AN OFFLINE STATE WHEN THE CLASS2; DRIVER DETERMINES THAT A RESYNCH IS NECESSARY.;H ; INPUTS:V;R; R2 QST ADDRESS; R4 SCB ADDRESS; ; OUTPUTS:;D; R2,R4 PRESERVED; R0 DESTROYED;-STOMP:  MOV S.CSR(R4),R0 ;GET THE CSR ASSUME IP,0 ;JJM306- CLR (R0) ;STOMP THE CONTROLLER ;JJM306 E MOV #Q1.OFF,Q.STAT(R2) ;SET THE CONTROLLER STATE TO OFFLINE ;**-1-  RETURNS .PAGEC .SBTTL VACPA - VIRTUAL TO PHYSICAL ADDRESS CONVERSION ;JJM304 ;+ ;**-1H;; **-VACPA-VIRTUAL ADDRESS TO PHYSICAL ADDRESS CONVERSIONR;D; CALLED TO CONVERT A VIRTUAL PACKET ADDRESS TO A PHYSICAL ADDRESS;; (OR UMR ADDRESS FOR AN EXTENDED MEMORY UNIBUS MACHINE).?; BECAUSE ALL PACKETS AND RINGS ARE IN A SHARED COMMON MAPPED 9; THROUGH APR 6 THE VIRTUAL ADDRESS MAY BE COMPUTED AS: ;M>; (PHYSICAL ADDRESS)=(VIRTUAL ADDRESS)+(RELOCATION CONSTAN00^rnn]nccccT) ;G ; SEE ROUTINE VACSET FOR A DESCRIPTION OF HOW THE RELOCATION CONSTANTS ; IS COMPUTED. ; ; INPUTS:;*; R0=VIRTUAL ADDRESS*; UQRELC=LOW BITS OF RELOCATION CONSTANT-; UQRELC+2=HIGH BITS OF RELOCATION CONSTANTH;L ; OUTPUTS:;M#; R0=LOW BITS OF PHYSICAL ADDRESSU$; R1=HIGH BITS OF PHYSICAL ADDRESS;I;- VACPA::O  CLR R1 1 ADD UQRELC,R0 ;R0=LOW BITS OF PHYSICAL ADDRESSU  ADC R14 ADD UQRELC+2,R1 ;R1=HIGH BITS OF PHYSICAL ADDRESS  RETURN)  .PAGE0! .SBTTL VACSET - CALCULATE RELOCATION CONSTANT";+#; **-VACSET -$;CA%; THIS ROUTINE WILL CALCULATE THE RELOCATION CONSTANT NEEDED TOE<&; PERFORM VIRTUAL ADDRESS TO PHYSICAL ADDRESS CONVERSIONS.'; PA=VA+UQRELC>(; IF A UMR IS NEEDED TO MAP UQCOM THIS ROUTINE WILL ALLOCATE); AND MAP IT.I*; +; INPUTS:E,; -; R2=QST .; R3=CST /; R4=SCB0; R0,R1 DESTROYED0 1; KISAR6 2; $FMASK 3; $HFMSK4; 5; OUTPUTS:6;17; R2,R3,R4,R5 PRESERVEDA"8; UQRELC AND UQRELC+2 ARE SET UP'9; UQRELC HAS THE TWO HIGH BITS SET UPT':; UQRELC+2 HAS THE 16 LOW BITS SET UPR ;; UMRS ARE MAPPED IF NECESSARY<;- =VACSET::4= MOV @KISR6,R1 ;GET START OF PORT COMMON ;JJM325? CLR R0 ;ZERO R0 ;**-1+@ ASHC #6.,R0 ;CALCULATE PHYSICAL ADDRESSI1F MOV S.KRB(R4),R2 ;GET THE KRB ADDRESS ;**-5S4G BIT #KS.EXT,K.STS(R2) ;EXTENDED MEMORY SUPPORTED?*O BNE 50$ ;YES, DON'T GET UMR'S ;**-79P CLC ;CARRY CLEAR TELLS PORUMR IT'S ONLINE TRANSITION@Q CALL PORUMR ;GO ALLOCATE AND MAP A UMR (GET WAIT BLOCKS TOO).Q BCS 60$ ;BAD, NO SPACE ALLOCATED ;PKW106S50$: ;**-1E$T MOV S.QST(R4),R2 ;RESTORE THE QST T ASSUME Q.CST,0 ;JJM306+U MOV (R2),R3 ;/*Q.CST*/ ;RESTORE THE CST>Y SUB #140000,R1 ;SUBTRACT PORT COMMON VIRTUAL ADDRESS ;**-3Z ;MAPPED THRU APR6 "[ SBC R0 ;SUBTRACT CARRY FROM R0\ MOV R1,UQRELC ;LO ADDRESS] MOV R0,UQRELC+2 ;HI!] CLC ;GOOD RETURN ;PKW106L]60$: RETURN ;PKW106A_ .PAGE ;**-1C_ .SBTTL WSW - WAIT/RESPOND TO A SYNCHRONIZATION STEP ;JJM304 a;+ ;**-1;Qb; **-WSW-WAIT FOR AND RESPOND TO A STEP IN THE HARDWARE SYNCHRONIZATION PROCESSSc; Nd; WAIT UP TO 100 MICRO-SECONDS FOR A STEP VALUE, READ AND SAVE SA, WRITE SA.e;C f; INPUTS: g;Ah; R2=QST ADDRESSi; R4=SCB ADDRESSj; S.CSR=CSR ADDRESST$j; VARIOUS QST FIELDS ;JJM304r; ;**-7 s; OUTPUTS:t; u; C=1 IF AN ERROR IS DETECTED:v; R0,R1 DESTROYED0w;x; C=0 ON SUCCESSy; R0,R1 DESTROYEDW<{; Q.STEP=NEXT STEP BIT PATTERN EXPECTED IN THE SA ;**-1={; Q.INDX=Q.INDX+2 (INDEXES NEXT ENTRY IN Q.WRIT) ;JJM308W}; ;**-1~;-WSW:: ;**-1) MOV S.CSR(R4),R1 ;R1 POINTS TO THE CSRN CLR R0 ;R0=LOOP CONTROL!5$: TST SA(R1) ;ERROR OCCURED?S0 BMI 15$ ;IF MI, YES, GO SET CARRY AND RETURN' BIT Q.STEP(R2),SA(R1) ;STEP BIT SET?  BNE 10$ ;IF NE, YES, SUCCESS5 SOB R0,5$ ;WAIT UP TO 100 MICRO-SEC. FOR STEP BIT/ BR 15$ ;TIME IS UP, GO SET CARRY AND RETURN ;P4; A STEP HAS COMPLETED AND THE NEXT STEP HAS BEGUN;N;10$: MOV Q.INDX(R2),R0 ;INDEX INTO Q.WRIT TABLE ;JJM308 ' ADD R2,R0 ;R0=QST + INDEX ;**-11C MOV SA(R1),Q.TEMP(R2);READ/SAVE SA REGISTER TEMPORARILY ;JJM308T> MOV Q.WRIT(R0),SA(R1) ;WRITE TO SA FROM Q.WRIT TABLE ;**-1$ ASL Q.STEP(R2) ;UPDATE Q.STEP AND ADD #2,Q.INDX(R2) ;Q.INDX CLC ;INDICATE SUCCESS BR 20$ ;GO TO RETURN%15$: SEC ;INDICATE ERROR DETECTED20$: RETURN ;RETURNSACODLEN = <.-CODBEG>/2 ;LENGTH OF CODE SECTION IN WORDS ;**-24T  LOGRTNN .END: MOV Q.INDX(R2),R0 ;INDEX INTO Q.WRIT TABLE ;JJM308 ' ADD R2,R0 ;R0=QST + INDEX ;**-11C MOV SA(R1),Q.TEMP(R2);READ/SAVE SA REGISTER TEMPORARILY ;JJM308T> MOV Q.WRIT(R0),SA(R1) ;WRITE TO SA FROM Q.WRIT TABLE ;**-1$ ASL Q.STEP(R2) ;UPDATE Q.STEP AND ADD #2,Q.INDX(R2) ;Q.INDX CLC ;INDICATE SUCCESS BR 20$ ;GO TO RETURN%15$: SEC ;INDICATE ERROR DETECTED20$: RETURN 00_znmmmmffDATA" .TITLE DCWOP - Write operations .IF DF D$$CHE .IDENT /01.07/;S>; Copyright (c) 1985, 1986 by Digital Equipment Corporation.; All rights reserved.; ; Original author: ; John Gemignani- ; Modified for RSX-11M-Plus Version 4.0 by:: ;# ; D. P. Rabahy 08-NOV-85 01.043 ; DPR030 Flush partial blocks to support RTEM-114 ; SPR #177XR ; " ; E. Postpischil 20-Jun-86 01.05* ; EDP033 Add support for large extents. ;? ; D. P. Rabahy 17-Oct-86 01.06@ ; DPR038 Save/restore R5 around $DRQRQ, response to SPR #228P ;N" ; J. R. Kauffman 29-May-87 01.07. ; JRK336 Force cache flush if going NODEFER ; ;sL; This module contains the code to process cache write operations. An I/O); proceeds through the following steps:P;a; 1) Phase-ID; A) The cache partition is searched for all overlapping extents.@; B) These involved extents are "locked down" (i.e. E.PCNT is= ; incremented) so that they will not be deleted until the6!; operation is completed.rA"; C) The I/O packet is duplicated with one being queued to the-(#; driver and the other to the cache.C$; D) If either primary pool and cache private secondary pool aree;%; lacking then all involved extents are deleted and thef&; I/O queued to the driver.aE'; 2) Depending on a number of factors either phase-II or driver I/Ot(; completion will run next.); 2.1) Phase-II"B*; A) DCRUN dequeues the cache packet passing it to this module.D+; B) If an error is already indicated for the driver I/O then the,; cache update is skipped.6-; C) The cache partition is updated from user task..; 2.2) Driver I/O completion)/; A) Output debugging info to console.a0; 3) Finish I/Ol>1; A) If an error is indicated then all involved extents are2; deleted.(3; B) The extra packet is deallocated.14; C) $IOFIN is called using the driver packet.5;-5 .MCALL F11DF$ ;JRK330s5 ;JRK330s35 F11DF$ ; Define window block offsets ;JRK330y5 ;JRK330i5 ;JRK330 6 .PSECT DC$WOP, RO, I.7 8 .SBTTL WRITE PHASE-Is$9 .SBTTL + $DCW1 - Write operations:;/ ;; Passed:<; UCBX mappedb=;g>; R1 -> I/O packet7>; I.EFN := Indicates if I/O is virtual ;DPR030l2>; I.TCB -> TCB of requesting task ;DPR030;>; T.ST3 := T3.ACP indicates I/O is from an ACP ;DPR030t4>; I.PRM+P2 := Size of request in bytes ;DPR030 ?; R5 -> UCB @;K A; Returned: 4B;;; N/A - Control passed to either DCRUN or $DRQRQC;K D; Action: ;E; If a search of the cache results in failure to identify 6F; the first matching extent, then the request can goG; directly to the driver.H;DI; Otherwise all extents involved will be acted upon no matter what;J; behaviour attributes have been selected for the device.K; IL; If exactly one extent maps the request then it will be "locked down",zFM; the driver invoked and phase-II requested. Otherwise all involved3N; extents will be deleted and the driver invoked.O;P; Possible enhancements:EQ; Serialize asynchronous I/O by checking if the extent is currentlyeJR; being loaded (i.e. ES.RIP set in E.STAT) and attaching it to cause the7S; write request to stall pending the load completion.hT;9U; It may be possible to improve performance by handling2V; the case where multiple extents map a request.W;wDX; Eventually a write-deferred ability for temporary files could beY; considered.nZ;dD[; Allocate duplicate I/O packet from cache private secondary pool.\;e ]; Notes:;^; I/O operations which specify the bypass bits must still 9_; update the cache, for the benefit of other non-bypassd=`; readers. Keep in mind that IQ.UMD (user-mode diagnostic)t=a; requests use parameter 6 to specify the diagnostic buffere;b; address. Therefore, the cache can only use parameter 3ac; if it really has to.d;l e$DCW1::df;eNg; Determine the operation and initialize the statistics context accordingly.h;e,i00_nn]ncccc TSTB I.EFN(R1) ; Is this really virtual?j BMI 20$ ; If MI, yes k/l MOV I.TCB(R1), R2 ; Get the requestor's TCBm; BNE 5$ ; If NE, got itn; BPT ; Sanity checkdo;5$:(p BIT #T3.ACP, T.ST3(R2) ; From an ACP?q BEQ 10$ ; If EQ, nor=s MOV #APR6.BASE+S.DIR, -(SP) ; Count as directory operation t BR COMMONu?v10$: MOV #APR6.BASE+S.LOG, -(SP) ; Count as logical operationD w BR COMMONx20$:;y MOV #APR6.BASE+S.DAT, -(SP) ; Count as virtual operationo z; BR COMMON {COMMON:F{ MESAG$ WMSG,5 ;DPR0302} USTAT$ S.WTOT ; Increment write total ;**-1~;eP; The return address is now adjusted so as to prevent an in-line "return" fromM; continuing to the driver. See the routine $DRQRQ in the executive module; [11,10]DRSUB..;-< MOV #$QOPDN, 2(SP) ; Don't forget about context on stack2 CALL SEARCH ; Locate first overlapping extent BCC 10$ ; If CC, found one# MESAG$ MMSG,6 ;JRK330t; ;**-1H; Could cache it with a little work if desirable, but for now just ...;I5 TST (SP)+ ; Remove statistics context from stacke ;JRK336  .IF DF CHESAN ;JRK336  ;JRK336t CALL .CKUCB ;JRK336$ ;JRK336e .ENDC ;CHESAN ;JRK336- ;JRK336P5 CALLR $DRQRQ ; Give the I/O packet to the driverE10$: ;JRK330p .IFDF CHEDFR ;JRK330 ;JRK330M@ CALL MAPUCB ; See if the cache is being deactivated ;JRK330. BITB #X2.DEA,APR6.BASE+X.CST2; ;JRK330. BEQ 12$ ; If EQ, no, continue on ;JRK330 ;JRK330e< MESAG$ DEAMSG,37. ; Indicate deactivation error ;JRK330: JMP CLRUP ; Force I/O to come back when clear ;JRK330 ;JRK330;<12$: CALL MAPPAR ; Map the cache partition back ;JRK330 ;JRK330e .ENDC ;CHEDFR ;JRK330  ;JRK330FJ MESAG$ HMSG,7,,<,> ;JRK330; ;**-1 ; Context:; Cache partition mapped;2"; R0 -> First overlapping extentE; R2 := Least Significant Part (LSP) of the highest requested block %; R3 := Most Significant Part (MSP)%; R4 := Length of request in blocks ;cB BIT #777, I.PRM+P2(R1) ; Is a partial block indicated? ;DPR030# BEQ 15$ ; If EQ, no ;DPR030  ;JRK330C9 TST (SP)+ ; Remove excess context from stack ;JRK330M7 CALL DELETE ; Delete all involved extents ;JRK330R ;JRK330* .IFDF CHEDFR ;JRK330 ;JRK330: BCS BACKUP ; If CS, at least one CED deferred ;JRK330 ;JRK330i .ENDC ;CHEDFR ;JRK330  ;JRK330 = CALLR $DRQRQ ; Give the I/O packet to the driver ;JRK3307 ;JRK330a15$: ;**-4d;P ; Notes:7; Don't forget that the extent high LBN is stored +1.T;P? CMPB R3, E.LBNH+2(R0) ; Might this extent fully map request?  BLO 20$ ; If LO, yesn BHI REJECT ; If HI, noK/ CMP R2, E.LBNH(R0) ; Double word comparison  BHIS REJECT ; If HIS, noC20$:= CMPB I.PRM+P4(R1), E.LBNL-1(R0) ; Does this truely map it?H BHI 30$ ; If HI, yes BLO REJECT ; If LO, no8 CMP I.PRM+P5(R1), E.LBNL(R0) ; Double word comparison BLO REJECT ; If LO, no30$: .IFDF CHEDFR ;JRK330 ;JRK330gE BITB #ES.WIP,E.STAT(R0) ; Is this extent being written out ;JRK330t5 BNE CLRUP ; If NE, yes, back up user PC ;JRK330I ;JRK330K .ENDC ;CHEDFR ;JRK330  ;JRK330B4 MOV R0, R4 ; Put CED address in a save register0 CALL CHEDUP ; Create a duplicate I/O packet' BCS POOL2 ; If CS, not enough pool;;O ; Context:; R0 -> Duplicated I/O packetw;o,; Prepare I/O packet for queueing to cache;.E MOV #CD.WIP, I.PRM+P3(R0) ; Initialize attachment count and statusT;;=; Serialize I/O to protect against asynchronous cache loads ;e;; BITB #ES.RIP, E.STAT(R4) ; Is this extent being loaded?;00_nmmmmffDATA; BEQ 35$ ; If EQ, no ; O; If an extent is being loaded then DCIOC will request phase-II. It would be ; a waste to request it now.;B;; BICB #CS.REQ, APRD.BASE+H.CSTS ; Don't request phase-II ; ; MOV R0, -(SP)e; MOV R1, -(SP)r); MOV R0, R1 ; Load ATTCED parameters; MOV R4, R0:; CALL ATTCED ; Attach to the extent - outstanding I/O; MOV (SP)+, R1o; MOV (SP)+, R0y(; BCS POOL1 ; If CS, not enough pool ; BR 40$;;;35$:e2 INCB E.PCNT(R4) ; Otherwise just lock it down4 BISB #CS.REQ, APRD.BASE+H.CSTS ; Request phase-II;40$:a;.O; Save the address of the first CED so phase-II doesn't have to search again.+;S MOV R4, I.PRM+P6.1(R0)2 MOV R1, I.PRM+P6.2(R0) ; Point to driver packet; K; All adjustments to the driver I/O packet must be restore before calling ; $IOFIN.o;n= MOV R0, I.AADA(R1) ; Point driver packet to corresponding  ; cache packetoC MOV KINAR5, I.IOSB+2(R1) ; Load APR bias and address of internal @ MOV #IOC!1, I.IOSB+4(R1) ; I/O completion routine, note bit-04 MOV R0, -(SP) ; Preserve address of cache packet= MOV KISAR6, -(SP) ; Save mapping to cache region ;DPR026M; ;JRK330W; If this request is recognized as coming from a temporary file, the write to ;JRK330kW; the disk is deferred and the cache packet is set up to indicate to phase II ;JRK330iK; to ignore the setup from the supposedly completed disk I/O. ;JRK330(; ;JRK330 .IFDF CHEDFR ;JRK330 ;JRK330 ? TSTB I.EFN(R1) ; See if this is a virtual operation ;JRK330r3 BPL 45$ ; If PL, no, skip defer check ;JRK330a ;JRK330e7 CALL MAPUCB ; Map the UCBX for the device ;JRK330 K BITB #XC.DFR,APR6.BASE+X.CSTS; Is deferred write support allowed ;JRK330 . BEQ 45$ ; If EQ, no, skip checks ;JRK330 ;JRK330IC BIT #WS.MDL,$DCSTS ; Is this request from a "temp" file ;JRK330k0 BEQ 45$ ; If EQ, no, write to disk ;JRK330 ;JRK3300G MOV #APR6.BASE,-(SP) ; Get base context for statistics block ;JRK330r5 USTAT$ S.WDFR ; Update statistics block ;JRK330e7 TST (SP)+ ; Release excess statistics info ;JRK330p ;JRK330iL MESAG$ IODFR,38.,,<,> ;JRK330 ;JRK3304I BIC #CD.WIP,I.PRM+P3(R0) ; Force DONE to not wait for disk I/O ;JRK330LI BIS #CD.DFR,I.PRM+P3(R0) ; Indicate to Phase II to ignore disk ;JRK330Q ;JRK330;8 MOV (SP),KISAR6 ; Remap the Cache partition ;JRK330C BISB #ES.WDF,E.STAT(R4) ; Indicate this CED now deferred ;JRK330d ;JRK330  .IF DF CHESAN ;JRK330e ;JRK330f= CALL .CRSAN ; Create a sanity block if necessary ;JRK330. ;JRK3301 .ENDC ;CHESAN ;JRK330  ;JRK336#* BR 50$ ; Skip write to disk ;JRK33645$: ;JRK336 .IF DF CHESAN ;JRK336a ;JRK336o CALL .CKIOP ;JRK336J ;JRK336I .ENDC ;CHESAN ;JRK336  .ENDC ;CHEDFR ;JRK336R ;JRK336D@ MOV R5, -(SP) ; Save address of UCB, driver clobbers ;DPR038+ CALL $DRQRQ ; Issue disk I/O ;JRK330C* MOV (SP)+, R5 ; Restore UCB ;DPR03850$: ;JRK330K! MOV (SP)+,KISAR6 ;JRK3303< MOV (SP)+, R1 ; Note restore to different register ;**-2( USTAT$ S.WHIT ; Increment write hit5 TST (SP)+ ; Remove statistics context from stackI8 MOV #APRD.BASE+H.PKTQ, R0 ; Get cache packet listhead% CALL $QINSP ; Insert by priorityJ CALLR DCRUN; ;JRK330V; Backup the User PC to handle conditions where the I/O cannot be issued due ;JRK330D; to deferred extents being written to disk ahead of it ;JRK330; ;JRK330 .IFDF CHEDFR ;JRK330CLRUP: ;JRK330o5 TST (SP)+ ; Pop extra context off stack ;JRK330;BACKUP: ;JRK330: CALLR $BCKUP ; Back up the user PC and return ;JRK330 00_nn]ncccc ;JRK3300 .ENDC ;CHEDFR ;JRK330C;Q-; Handle low pool and rejection conditions.; .ENABL LSB'REJECT: MESAG$ RMSG,10. ;JRK330 : USTAT$ S.WLAP ; Increment partial overlap count ;**-1 BR 20$n;POOL1: MESAG$ PMSG1D; MOV #APR6.BASE, (SP) ; Errors are not counted in context ;DPR0248; USTAT$ S.PSP ; Increment lacking private sec. pool;f; MOV R3, -(SP) ; Save MSP (; MOV R0, R3 ; Load CHEDEP parameter; CALL CHEDEPe ; MOV (SP)+, R3 ; Restore MSP;. ; BR 10$&POOL2: MESAG$ PMSG2,9. ;JRK330A MOV #APR6.BASE, (SP) ; Errors are not counted in context ;**-1R: USTAT$ S.POL ; Increment lacking primary pool ;DPR024)10$: MOV R4, R0 ; Restore CED address120$: ;JRK330.9 TST (SP)+ ; Remove excess context from stack ;JRK330 7 CALL DELETE ; Delete all involved extents ;JRK330f ;JRK330; .IFDF CHEDFR ;JRK330 ;JRK330: BCS BACKUP ; If CS, at least one CED deferred ;JRK330 ;JRK330: .ENDC ;CHEDFR ;JRK330 ;JRK330  .IF DF CHESAN ;JRK330x ;JRK330. CALL .CKUCB ;JRK330r ;JRK330 .ENDC ;CHESAN ;JRK330d ;JRK330 = CALLR $DRQRQ ; Give the I/O packet to the driver ;JRK330c ;JRK330E .DSABL LSB ;**-4  n1  .SBTTL + DELETE - Deletes all involved extents  ; ; Passed:  ; Cache partition mapped; (; R0 -> CED of first overlaping extent/; R2 := High LBN Least significant part (LSP)J.; R3 := High LBN Most significant part (MSP)#; R5 := UCB address ;JRK330;L ; Returned: ; All registers preserved:; CC - All extents were able to be eliminated ;JRK330E; CS - At least one of the extents could not be eliminated ;JRK330 ;KDELETE: ;JRK3302 CLR -(SP) ; Initialize status return ;JRK330310$: CALL FRECED ; Delete this extent ;JRK330a ;JRK330  .IFDF CHEDFR ;JRK330 ;JRK330a4 BCC 20$ ; IF CC, extent was eliminated ;JRK330 ;JRK330E BITB #ES.WDF,E.STAT(R0) ; See if failure due to deferrment ;JRK330i< BEQ 20$ ; If EQ, no, don't worry about this case;JRK3304 ROL (SP) ; Roll CS into (SP) for later ;JRK33020$: ;JRK330J .ENDC ;CHEDFR ;JRK330; ;JRK330 < MOV E.LNXT(R0), R0 ; Get the next extent by LBN ;JRK330+ BEQ 30$ ; If EQ, end of list ;JRK330K ;JRK330 H CMPB R3, E.LBNL-1(R0) ; Does this extent overlap the request? ;JRK330$ BHI 10$ ; If HI, yes ;JRK330# BLO 30$ ; If LO, no ;JRK330 8 CMP R2, E.LBNL(R0) ; Double word comparison ;JRK330& BHIS 10$ ; If HIS, yes ;JRK330 ;JRK330C530$: ROR (SP)+ ; Get stored carry status ;JRK330J RETURN ;JRK330J# ;$ .SBTTL WRITE PHASE-II.% .SBTTL + $DCWII - Phase-II Write Processing&;R '; Passed:3(; Cache partition mapped);3*; R1 -> Cache packet(+; I.PRM+P1 := Source buffer address,; I.PRM+P2 := Byte count0:-; I.PRM+P3 -> Internal cache status and pending count=.; I.PRM+P5 := Requested LBN least significant part (LSP)o//; I.PRM+P6.1 -> CED of first extent involved0 0; I.PRM+P6.2 -> Driver packet 1; R5 -> UCBs2; 3; Returned:J%4;;; N/A - control is passed to DONE;5;. 6; Action:HC7; If a driver error is indicated then call DONE to finish the I/Os)8; otherwise update the cache partition. 9; :; Future enhancement:P;; Handle multiple extents<;I =$DCWII::!= MESAG$ W2MSG,11. ;JRK330t? ;**-1a9@ BIT #CD.ERR, I.PRM+P3(R1) ; Is driver error indicated?gA BEQ 5$ ; If EQ, no A MESAG$ EMSG,13. ;JRK330C BR 10$ ;**-1D5$:DE; 'F; Prepare input parameters to $BLXIO:dG; R0 := Byte count (I.PRM+P2) H; R1 := Source APR5 bias"I; R2 := Source APR5 displacementJ; R3 := Destination APR6 biass0K; R4 := Destination APR6 displacement (140000)L00_nmmmmffDATA; -M MOV R1, -(SP) ; Save cache packet addresstNO MOV I.PRM+P2(R1), R0GP7Q CALL ADJBUF ; Converts to doubleword if device NPRR;R MOV I.PRM+P1.2(R1), R2 ; Load R1 later to avoid conflictfS SUB #20000, R2 T@U MOV I.PRM+P6.1(R1), R4 ; Get address of first extent involvedV;nNW; The destination APR bias is the extent bias offset by the number of blocks<X; between the requested LBN and the low LBN of the extent.Y; 2Z MOV I.PRM+P5(R1), R3 ; Get LSP of requested LBN7[ SUB E.LBNL(R4), R3 ; Safe to assume carry availabler+\ ASH #3, R3 ; Convert to 32-word blocksL] ADD E.PHYA(R4), R3o^_ MOV I.PRM+P1.1(R1), R1M`a MOV #APR6.BASE, R4d/a CALL EBLXIO ; Transfer the data. ;edp033a ;edp033(8p MOV (SP)+, R1 ; Restore cache packet address ;**-14q10$:@r MOV I.PRM+P6.1(R1), R0 ; Get address of first involved extent%s DECB E.PCNT(R0) ; "Unlock" extent t#u MOV R1, R3 ; Parameter to DONEM v CALL DONE w RETURNrx ty .SBTTL WRITE I/O COMPLETION1z .SBTTL + IOC - Internal I/O completion routine {;r |; Passed:b}; R3 -> Driver packet,#~; I.UCB -> UCB ;DPR026"; I.PRM+P3, P4 := Driver status ; I.AADA -> Cache packet; ; Returned:e%;;; N/A - control is passed to DONEh;k ; Action:*8; Output console messages for debugging purposes only.;iIOC: ;JRK330. ;**-1". TSTB I.PRM+P3(R3) ; Is an error indicated? BPL 10$ ; If PL, no  MESAG$ EMSG,13. ;JRK33010$: ;**-1n5 MOV I.UCB(R3), R5 ; Get the UCB address ;DPR026 4 MOV I.AADA(R3), R3 ; Get address of cache packet ;JRK330P8 MESAG$ IMSG,12.,,<> ;JRK330 ;JRK330;  CALL DONE  RETURN  N) .SBTTL + DONE - Common completion codem;e ; Passed:n; R3 -> Cache packet; I.PRM+P2 := Byte count (; I.PRM+P3 := Internal cache status<; I.PRM+P4 := Requested LBN most significant part (MSP)=; I.PRM+P5 := Requested LBN least significant part (LSP) /; I.PRM+P6.1 -> CED of first involved extentD ; I.PRM+P6.2 -> Driver packet.; I.PRM+P3, P4 := Driver completion status ; R5 -> UCB.;R ; Return:38;;; N/A - If both are done control is passed to $IOFIN-;;; otherwise completed fork level routinee; ; Action: F; If both the driver and the cache are completed then deallocate the6; cache packet from primary pool and finish the I/O.;iC; If an error is indicated then all involved extents are deleted.a;r; Future enhancement: ; Handle multiple extentsn;>DONE: BIT #CD.WIP, I.PRM+P3(R3) ; Are both updates complete? BNE 10$ ; If NE, no8 MOV I.PRM+P6.2(R3), R4 ; Get address of driver packet .IFDF CHEDFR ;JRK330 ;JRK330e? BIT #CD.DFR,I.PRM+P3(R3) ; Is this a deferred write ;JRK330c" BEQ 3$ ; If EQ, no ;JRK330; ;JRK330U; This is a deferred write which has just completed. Since no disk I/O has ;JRK330dU; occurred, no status has been returned and must be faked back to the user. ;JRK330; ;JRK330E MOV #IS.SUC&377,R0 ; Fake success status back to user I/O ;JRK330D MOV I.PRM+P2(R3),R1 ; Put in number of transferred bytes ;JRK330. BR 7$ ; Skip disk I/O processing ;JRK3303$: ;JRK330 .ENDC ;CHEDFR ;JRK330  ;JRK330 4 TSTB I.PRM+P3(R4) ; Is a driver error indicated? BPL 5$ ; If PL, noh;j(; Prepare input parameters for DELETE:; Map cache partitiona;a&; R0 -> CED of first extent involved3; R2 := Highest LBN, least significant part (LSP)S3; R3 := " " , most " " (MSP)J; CALL MAPPAR@ MOV I.PRM+P6.1(R3), R0 ; Get address of first involved extent;i; Calculate highest LBN; 7 MOV R3, R1 ; Put cache packet address in save reg. 6 MOV I.PRM+P2(R3), R2 ; Get the request size (bytes) ADD #777, R2 ; Round up,. ASH #-9., R2 ; Convert to numb00_n`nnccccer of blocks  DEC R2a9 ADD I.PRM+P5(R3), R2 ; Calculate highest LBN requestedd3 MOVB I.PRM+P4(R3), R3 ; Get MSP of requested LBNS  ADC R3 ; Carry if necessary CALL DELETE. MOV R1, R3 ; Restore cache packet address5$: 6 MOV I.PRM+P3(R4), R0 ; Get driver completion status MOV I.PRM+P4(R4), R1M;,; Restore driver packetd;i7$: ;JRK330! MOV I.IOSB+2(R3), I.IOSB+2(R4) ! MOV I.IOSB+4(R3), I.IOSB+4(R4)u MOV I.AADA(R3), I.AADA(R4)t6 CALL CHEDEP ; Deallocate packet from primary pool1 MOV R4, R3 ; Use driver packet to finish I/O) CALL $IOFIN  RETURN 10$:7 BIC #CD.WIP, I.PRM+P3(R3) ; Indicate one is completeV  RETURNt a! .IFDF CHEDBG ; Debugging aidI, .SBTTL *** DEBUG *** Module contains data!WMSG: .ASCIZ <15><12>"WRITE - "MMSG: .ASCIZ "MISS"dHMSG: .ASCIZ "HIT"@PMSG1: .ASCIZ " - REJECTED: NOT ENOUGH PRIVATE SECONDARY POOL"6PMSG2: .ASCIZ " - REJECTED: NOT ENOUGH PRIMARY POOL"7RMSG: .ASCIZ " - REJECTED: OVERLAPS MULTIPLE EXTENTS"JDEAMSG: .ASCIZ <15><12>" - Rejected: cache being deactivated" ;JRK330QIODFR: .ASCIZ <15><12>" - I/O disk operation deferred; cache updated" ;JRK330R*W2MSG: .ASCIZ <15><12>"PHASE II - WRITE"$IMSG: .ASCIZ <15><12>"WRITE - IOC"EMSG: .ASCIZ " - ERROR"  .EVEN .ENDC ; .IFDF CHEDBGG .ENDC ; .IFDF D$$CHEI .ENDECTED: NOT ENOUGH PRIVATE SECONDARY POOL"6PMSG2: .ASCIZ " - REJECTED: NOT ENOUGH PRIMARY POOL"! .TITLE DCROP - Read operationsI .IF DF D$$CHE .IDENT /01.12/K;D>; Copyright (c) 1986, 1987 by DIGITAL EQUIPMENT CORPORATION.; All rights reserved.;V; Original author: ; John Gemignani ;S& ; Modified for RSX-11M-Plus V2.1 by: ;  ; D. P. Rabahy ;O ; Modified by:& ; Modified for RSX-11M-PLUS V4.0 by: ;V! ; D. P. Rabahy 08-NOV-85 01.07.) ; DPR032 Save/restore R5 around $DRQRQ ;S$ ; Eric Postpischil 20-Jun-86 01.08* ; EDP033 Add support for large extents. ; ; J. Kauffman 26-Aug-86 01.098 ; JRK330 Add support for multi-block extent transfers ;I! ; D. P. Rabahy 17-Oct-86 01.10 @ ; DPR038 Save/restore R5 around $DRQRQ, response to SPR #228P ;$ ; Eric Postpischil 12-Jan-87 01.11, ; EDP047 Set up R5 before calling $DRQRQ. ; ; J. Kauffman 29-May-87 01.12. ; JRK336 Force cache flush if going NODEFER ;R!;aO"; This module contains the code which preforms cache read operations. An I/OP)#; proceeds through the following steps:$;KD%; 1) Phase I - if the cache partition can fulfill the request then+&; proceed to step 1.1 otherwise step 1.28!'; 1.1) Reserve involved extentsR&(; A) Increment the pending count(s)$); B) Attach to those being loaded<*; B.1) If NONE are being loaded call DCRUN which invokes+; phase II (i.e. step 3)<,; B.2) Otherwise IOC (i.e. step 2) will call DCRUN after-; the driver completes K.; 1.2) If a cache load is NOT appropriate, pass the request to the driveroD/; A) If it IS, allocate the necessary data structures (i.e. cache60; extent, duplicate I/O packet and attachment), if71; lacking any pool resource pass the request to ther 2; driverD3; B) Prepare the driver packet (everything must be ready for IOC,+4; it may run before phase I completes!)&5; C) Pass the request to the driver 6; D) Prepare the cache packet7; E) Queue it to the cachei8; 2) Driver I/O completionB9; A) If a driver error is indicated then mark all cache packets:; pending with CD.ERRn7;; B) Call DCRUN to request the cache (i.e. phase II)c<; 3) Phase IId*=; A) If a driver error is NOT indicated,>; A.1) Then transfer the data via $BLXIO4?; A.2) Otherwise delete all the extents involved8@; B) Passing the driver completion status call $IOFINA;-B .PSECT DC$ROP, RO, I C rD .SBTTL READ PHASE I#E .SBTTL + $DCR1 - Read operationsh!F .SBTTL + $DCOV1 - Load overlayiG; H; Passed:iI; UCBX mapped in APR6e=J; 00`nmmmmffDATA X.CSTS := Unit's cache status (i.e. selected operations)aK;R9L; $CXDBL := Zero indicates context switching is enabledM;AN; R1 -> I/O packet7O; I.EFN := Sign bit indicates virtual operationX&P; I.TCB -> TCB of issuing task/Q; T.ST3 := T3.ACP indicates task is an ACPl+R; I.PRM+P4, P5 := Requested starting LBNR S; R5 -> UCBrT;. U; Returned:EV; R0 := contents losteW;eGX;;; Otherwise N/A - control is passed to either DCRUN, LOAD or $DRQRQXY;e Z; Action:K[; Determine if the cache partition can fulfill the request. If so, queueLJ\; the packet to the cache and call phase II otherwise proceed with LOAD.]; ^; Future enhancements:F_; Handle the case where multiple extents contain the requested data.`;SEa; Overlay I/O can be detected by function code. The code IO.LDO ors:b; IO.LOV (Load I or D-space overlay) is passed in I.FCN.c;tCd; Handle the case where an extent partially overlaps the request.Ce;LHf; There are a number of strategies for handling partial overlaps. The,g; following one comes from John Gemignani.h;kJi; If one extent does not fully map the request, then three possibilitiesIj; must be considered. The extent overlaps the user's request in one ofrk; three ways:?l; 1) The extent fulfills the high end of the user's request.O5m; Therefore, if possible, load the low end of thesn; user's request. Ao; 2) The extent fulfills the middle of the user's request, and7p; two I/O operations would be necessary to load thet6q; cache. In this situation, the request should be7r; rejected, since this operation is self defeating.r>s; 3) The extent fulfills the low end of the user's request.=t; Therefore, if possible, load the high end of the user'su; request.v;l w; Notes:Dx; ACP requests which are issued in order to handle the file systemJy; (F11) are issued with context switching enabled (i.e. $CXDBL is zero).Hz; Requests on behalf of a task for disk extent crossings (i.e. mappingH{; failures) are issued with context switching disabled (i.e. $CXDBL is|; non-zero).}; ;~QUICK: RETURN ; See exec routine $DRQRQ in module DRSUBl $DCR1::f;uO; Determine the operation, check if caching allowed and initialize statistics; context accordingly.;, TSTB I.EFN(R1) ; Is this a virtual read? BMI 20$ ; If MI, yes / MOV I.TCB(R1), R0 ; Get the requestor's TCB  BNE 5$ ; If NE, got its BPT ; Sanity check5$:e( BIT #T3.ACP, T.ST3(R0) ; From an ACP? BEQ 10$ ; If EQ, no;nQ; The following code determines if context switching is disabled since I/O fromiK; the F11 ACP when it is is I/O issued on behalf of a user task due to an,+; extent crossing (i.e. mapping failure).i;. TSTB $CXDBL ; Context switching disabled?/ BNE 20$ ; If NE, yes, treat as virtual I/O < BITB #XC.DIR, APR6.BASE+X.CSTS ; Cache ACP/RLB this unit? BEQ QUICK ; If EQ, no> MOV #APR6.BASE+S.DIR, -(SP) ; Otherwise init stats context BR COMMON?10$: BITB #XC.LOG, APR6.BASE+X.CSTS ; Cache IO.RLB this unit?e BEQ QUICK ; If EQ, noe> MOV #APR6.BASE+S.LOG, -(SP) ; Otherwise init stats context BR COMMON20$: ;JRK336n .IFDF CHEDFR ;JRK336 ;JRK336CH BITB #X2.DEA,APR6.BASE+X.CST2 ; Are defers in process of flush;JRK3361 BNE 30$ ; If NE, yes, must continue ;JRK336C ;JRK336B .ENDC ;CHEDFR ;JRK336# ;JRK336)B BITB #XC.DAT,APR6.BASE+X.CSTS ; Cache IO.RVB this unit? ;JRK336# BEQ QUICK ; If EQ, no ;**-1t30$: ;JRK336 > MOV #APR6.BASE+S.DAT, -(SP) ; Otherwise init stats context BR COMMON $DCOV1::? BITB #XC.OVR, APR6.BASE+X.CSTS ; Cache IO.LOV/LDO this unit? BEQ QUICK ; If EQ, no > MOV #APR6.BASE+S.OVR, -(SP) ; Otherwise init stats context ; BR COMMON COMMON:s MESAG$ RMSG,14. ;JRK3301 USTAT$ S.RTOT ; Increment read total ;**-1 : MOV #$QOPDN, 2(SP) ; Chang00`nnncccce return address, see $DRQRQ4 CALL SEARCH ; Find the first overlapping extent( BCC 5$ ; If CC, found one ;JRK3308 JMP LOAD ; CS, None found - attempt to load ;JRK3305$: ;JRK330; ;**-1 ; Context:"; Cache partition mapped in APR6; ); R0 -> CED of first overlapping extent)<; R2 := Highest LBN requested Least significant part (LSP)<; R3 := " " " Most " " (MSP)"; R4 := Number of LBNs requested;N2; Check if overlapping extent fully maps request; ; Note:F:; Don't forget that the extent highest LBN is stored +1.; @ CALL $TSEND ; See if possible request is all in CED ;JRK3303 BCS OVRLAP ; If CS, it is overlapping ;JRK330t ;JRK330t? CMPB I.PRM+P4(R1), E.LBNL-1(R0) ; Does it completely? ;**-6n BHI 30$ ; If HI, yes BLO OVRLAP ; If LO, no8 CMP I.PRM+P5(R1), E.LBNL(R0) ; Double word comparison BLO OVRLAP ; If LO, no30$:K MESAG$ HMSG,16.,,<,> ;JRK330  ;**-1o4 CLR I.PRM+P3(R1) ; Init status and pending count: BITB #ES.RIP, E.STAT(R0) ; Is this extent being loaded?2 BEQ 40$ ; If EQ, no, packet can be used as is4 CALL ATTCED ; Attach, IOC will request phase II6 BCS POOL ; If CS, lacking cache private sec. pool: BICB #CS.REQ, APRD.BASE+H.CSTS ; Don't request phase II BR 50$e/40$: INCB E.PCNT(R0) ; Lock the extent down:B BISB #CS.REQ, APRD.BASE+H.CSTS ; Packet ready, request phase II;50$: USTAT$ S.RHIT ; Now we're sure, increment read hits5 TST (SP)+ ; Remove statistics context from stacks; MOV R0, I.PRM+P6(R1) ; Plug target CED address in packetbA MOV #APRD.BASE+H.PKTQ, R0 ; Packet wait queue listhead address 0 CALL $QINSP ; Insert packet into wait queue5 CALLR DCRUN ; Invoke phase II if packet is readyu;h*; Handle rejections and error conditions;; ;**-4w&POOL: MESAG$ KMSG1,18. ;JRK330A MOV #APR6.BASE, (SP) ; Errors are not counted in context ;**-1'@ USTAT$ S.PSP ; Lacking cache private secondary pool ;DPR024; TST (SP)+ ; Remove statistics context from stack ;**-2 . CALLR $DRQRQ ; Pass request to the driver ;JRK330eOVRLAP: ;JRK330 .IFDF CHEDFR ;JRK330 ;JRK330L0 CALL MAPUCB ; Map the device UCBX ;JRK330; ;JRK330W; See if this device supports write defers. If not, immediately send request ;JRK3303G; to the device driver since there are no deferred extents. ;JRK330; ;JRK330W; If defers were just turned off, the cache may be in the process of flushing ;JRK336 V; them. Since the XC.DFR bit will have been turned off, but there may still ;JRK336R; be deferred extents in the cache, we can't just turn off the deferred ;JRK336U; lookup code. So, as long as X2.DEA is turned on, the XC.DFR bit does not ;JRK336eR; indicate the state of deferred lookup support. No more defers will be ;JRK336T; allowed, but until the CEDs are eliminated, they will be used for reads. ;JRK336; ;JRK336F BITB #X2.DEA,X.CST2+140000 ; Are defers in process of flush ;JRK3363 BNE 3$ ; If NE, yes, must continue on ;JRK336t ;JRK3366G BITB #XC.DFR,X.CSTS+140000 ; Does this device support defers ;JRK330e9 BEQ 100$ ; If EQ, no, send request to driver ;JRK330e3$: ;JRK3303 CALL MAPPAR ; Map the cache partition ;JRK330o= CLR -(SP) ; Set up default duplicate I/O address ;JRK330uB MOV I.PRM+P5(R1),-(SP) ; Set up LBN of range to search ;JRK330; ;JRK330Y; Start by seeing if the first overlapping extent is deferred. If it is, create;JRK330,W; a duplicate I/O packet and create the first of a possible set of attachment ;JRK330oU; blocks that will point to any of the CEDs in the range of the current I/O ;JRK330eW; that will need to be copied to the user buffer after the completion of the ;JRK330(; I/O from dis00`nmmmmffDATAk to user. ;JRK330; ;JRK330B5$: BITB #ES.WDF,E.STAT(R0) ; Is this a deferred extent ;JRK3306 BNE 20$ ; If NE, yes, process this extent ;JRK330 ;JRK330d;10$: CALL $TSEND ; See if this CED is the last ;JRK330t& BCC 15$ ; If CC, it is ;JRK330; ;JRK330S; The last CED processed did not completedly fill the I/O request range. ;JRK3303T; Starting with the top of that CED, the search for another CED will begin ;JRK330.; using a modified size value. ;JRK330; ;JRK330? MOV (SP),R2 ; Restore start LBN of range to search ;JRK3303B MOV E.LBNL(R0),R3 ; Get offset from range to CED start ;JRK330 SUB R2,R3 ; ;JRK330D> SUB R3,R4 ; Decrement that count from total blocks;JRK330< MOVB E.SIZE(R0),R3 ; Set up new size for search ;JRK330 SUB R3,R4 ; ;JRK330A MOV E.LBNH(R0),R2 ; Reset the start LBN for next CED ;JRK330a9 MOV R2,(SP) ; Save start LBN for next round ;JRK330s CLR R3 ; ;JRK330 ' BISB E.LBNH+2(R0),R3 ; ;JRK330V; CALL $FDCED ; Search for the next deferred CED ;JRK3303 BCC 5$ ; Go back and process this one ;JRK330a; ;JRK330R; No more CEDs are to be processed. The only way we know if one of them ;JRK330R; was deferred is by the duplicate I/O packet address on the stack. If ;JRK330W; is zero, bump the partial overlap count and let the driver fill the request ;JRK330SR; back to the user. If there is a duplicate, the MBXIOC will handle the ;JRK330U; transfer of the deferred extents to the user buffer before completing the ;JRK330J; user I/O. ;JRK330n; ;JRK330;15$: TST (SP)+ ; Eliminate the LBN range value ;JRK330e; TST (SP)+ ; Check duplicate I/O packet address ;JRK330e8 BEQ 100$ ; If EQ, partial overlap condition ;JRK3306 BR 110$ ; Multi-Block transfer will occur ;JRK330; ;JRK330X; At this point, it is known that there is at least one deferred CED that must ;JRK330W; be transferred at the completion of the I/O from the disk. A duplicate I/O ;JRK330lW; packet is created to hold the information from the original I/O packet that ;JRK330+Y; gets changed when it is changed into an internal I/O with a completion return ;JRK330dU; within the data caching code. This extra packet is also used to hold the ;JRK330;U; listhead for all CEDs that are tied down waiting for the I/O to complete. ;JRK330s; ;JRK33020$: ;JRK330t@ MOV R4,-(SP) ; Save the range size across processing ;JRK3301 MOV R0,R4 ; Save the extent address ;JRK330t ;JRK330h9 TST 4(SP) ; Skip duplication if already done ;JRK330 BNE 40$ ; ;JRK330 ;JRK330l4 CALL CHEDUP ; Duplicate the I/O packet ;JRK3301 BCC 30$ ; If CS, unable to allocate ;JRK330 ; ;JRK330Y; It isn't possible to allocate the space for the extra I/O packet. The current;JRK330 X; scheme is to get out of the situation by backing up the user's PC to reissue ;JRK3303; the I/O after a significant event. ;JRK330a; ;JRK3304 SUB #10,SP ; Back up the stack pointer ;JRK330> CALLR $BCKUP ; Back up the user PC to reissue the ;JRK3301 ; I/O after a significant event ;JRK330e; ;JRK330U; The duplicate I/O packet has been successfully allocated. The address if ;JRK330oX; it will be stored in (SP) to indicate on successive passes that the previous ;JRK330W; code path won't have to be duplicated. The original I/O packet address wil ;JRK330iB; also be stored in the duplicate for easy reference. ;JRK330; ;JRK330;30$: MOV R0,4(SP) ; Store the duplicate address ;JRK330rG MOV R1,I.PRM+P6.2(R0) ; Store address of original I/O in dup ;JRK330C CLR I.PRM+P6.1(R0) ; Initialize listhead to attachments ;JRK330y@ MOV R0,I.AADA(R1) ; Point to dup. packet in original ;JRK330J MOV KINAR5,I.IOSB+2(R1) ; Turn original packet into internal I/O;JRK330M MOV #MBXIOC00`nnncccc!1,I.IOSB+4(R1) ; and return to MBXIOC for completion;JRK330 5 ; The OR'd 1 indicates internal I/O ;JRK330;; ;JRK330X; Now create an attachment block for the discovered CED. This attachment will ;JRK330W; contain a forward pointer to the next attachment, a pointer to the CED that ;JRK330 Y; is tied down to prevent its elimination before the contents can be transferred;JRK330;6; to the user buffer, and a status word. ;JRK330; ;JRK330@40$: CALL CREATT ; Allocate a block of data for this ;JRK330* BCC 50$ ; If CC, successful ;JRK3307 BPT ; For the moment, failure to allocate ;JRK330  ;JRK330e; ;JRK330R; A deferred extent has been found within the range of the current read ;JRK330T; request. It will be tied down to prevent its elimination while the read ;JRK330V; is posted to the device for the old data. The CED will also be pointed to ;JRK330K; by the allocated attachment block which will be filled in here ;JRK330 ; ;JRK33050$: ;JRK330IM MESAG$ DFRATT,30.,,<,> ;JRK330K ;JRK330KC INCB E.PCNT(R4) ; Tie down extent to prevent elimination;JRK330iC MOV R4,A.IOPA(R0) ; Put CED address in attachment block ;JRK330e1 MOV R4,-(SP) ; Save the CED address ;JRK330R@ MOV 6(SP),R4 ; Restore the duplicate I/O packet addr ;JRK330F MOV I.PRM+P6.1(R4),(R0) ; Place the current packet in front ;JRK330D MOV R0,I.PRM+P6.1(R4) ; of listhead in duplicate packet ;JRK330; ;JRK330V; Processing for this CED is complete. Now check to see if this is the last ;JRK330W; deferred extent in the range of the I/O request. If so, queue the original ;JRK330AY; I/O packet to the driver to copy the old data to the user buffer and wait for ;JRK330sA; its completion before transferring the extent data ;JRK330d; ;JRK3303 MOV (SP)+,R0 ; Restore the CED address ;JRK330;2 MOV (SP)+,R4 ; Restore the range size ;JRK3304 BR 10$ ; Go back and look for more CEDs ;JRK330 ;JRK330 ; ;JRK330V; At this point the I/O packet is either the untouched original that will be ;JRK330R; completed by the driver back to the user or will be a packet with the ;JRK330S; forward pointers to the duplicate I/O packet and the attachments to the ;JRK330gX; deferred extents. If the driver is completing the I/O for good, the partial ;JRK3305; overlap system value is incremented. ;JRK330z; ;JRK330 .ENDC ;CHEDFR ;JRK330s ;JRK330 %100$: MESAG$ MMSG,15. ;JRK330tA USTAT$ S.RLAP ; Cache missed because partial overlap ;JRK330 B110$: TST (SP)+ ; Eliminate the excess statistics data ;JRK3307 CALLR $DRQRQ ; Pass request to the driver ;JRK330u ;JRK330d ;JRK330h ;JRK330r;+ ;JRK330vV; $TSEND - routine to determine if the end of the selected CED is beyond the ;JRK3301; range of a requested I/O packet. ;JRK330N; ;JRK330; Inputs: ;JRK3306; R0 - CED known to overlap range of I/O ;JRK330F; R2,R3 - MSP,LSP of the highest block of I/O request range ;JRK330; Outputs: ;JRK330>; CC - CED extends beyond the end of the I/O range ;JRK330<; CS - CED end is enclosed within the I/O range ;JRK330;- ;JRK330 $TSEND:: ;JRK330D CMPB R3,E.LBNH+2(R0) ; Might the extent map the request? ;JRK330$ BLO 10$ ; If LO, yes ;JRK336# BHI 20$ ; If HI, no ;JRK33607 CMP R2,E.LBNH(R0) ; Double word comparison ;JRK330r% BHIS 20$ ; If HIS, no ;JRK336 @10$: TST (PC)+ ; Indicate extent is beyond I/O range ;JRK336=20$: SEC ; Indicate end of extent is within range;JRK336f RETURN ;JRK336 ;JRK336l ;JRK336a;+ ;JRK336 R; $FDCED - routine to determine if any other existing extents after the ;JRK336L; currently selected one are00`nmmmmffDATA within the range of the requested I/O ;JRK336; ;JRK336; Inputs: ;JRK336 8; R0 - CED address of last processed extent ;JRK336=; R2,R3 - LBN starting address of range to check ;JRK336IA; R4 - size of region left to check (in 32 wd blocks) ;JRK336r; ;JRK336; Outputs: ;JRK336D; CC: R0 - CED address of extent in range of I/O request ;JRK336H; R2,R3 - LBN address of top of CED discovered to overlap ;JRK3360; CS - No further involved extents ;JRK336;- ;JRK3366 .IFDF CHEDFR ;JRK336$FDCED:: ;JRK3362 SEC ; Assume no more CEDs to process ;JRK336B MOV E.LNXT(R0),R0 ; Get address of next extent in line ;JRK3362 BEQ 100$ ; If EQ, no more to process ;JRK336@ MOV R2,-(SP) ; Save starting address of LBN to check ;JRK336 MOV R3,-(SP) ; ;JRK3361 DEC R4 ; Temporarily normalize size ;JRK336 > ADD R4,2(SP) ; Get address of top block of request ;JRK3362 ADC (SP) ; Double word computation ;JRK336- INC R4 ; Restore size variable ;JRK336 ;JRK336RD CMPB R3,E.LBNH+2(R0) ; Might the extent map the request? ;JRK336& BHI $FDCED ; If HI, no ;JRK336$ BLO 20$ ; If LO, yes ;JRK3367 CMP R2,E.LBNH(R0) ; Double word comparison ;JRK336r( BHIS $FDCED ; If HIS, no ;JRK336G20$: CMPB (SP),E.LBNL-1(R0) ; Does this extent truly overlap? ;JRK336K$ BHI 30$ ; If HI, yes ;JRK336# BLO 50$ ; If LO, no ;JRK336C: CMP 2(SP), E.LBNL(R0) ; Double word comparison ;JRK336# BLO 50$ ; If LO, no ;JRK336  ;JRK336C@30$: TST (PC)+ ; Indicate another CED found in range ;JRK336450$: SEC ; Indicate no more CEDs found ;JRK330=60$: MOV (SP)+,R3 ; Restore high LBN of found CED ;JRK330p MOV (SP)+,R2 ; ;JRK330100$: RETURN ;JRK330 ;JRK330( .ENDC ;CHEDFR ;JRK330l J1 .SBTTL + LOAD - Prepare to load a cache extentO; ; Passed: "; Cache partition mapped in APR6; H.TMP2 -> Next CED by LBN/; E.LBNL, -1 := Starting LBN of this extent ;J; (SP) := Statistics context; ; R1 -> I/O packet3; I.EFN := Sign bit indicates virtual operationo; I.FNC := Function(+; I.PRM+P4, P5 := Requested starting LBNK; I.TCB -> Requestor's TCB.; T.ST3 := T3.ACP indicates task is an ACP$; R4 := Number of blocks requested; R5 -> UCB address -; U.UCBX -> Secondary pool address of UCBX8; X.CSTS := Unit's cache status, selected operations$; X.XDAT := Virtual extent limit'; X.XRDA := Read ahead extent limit$ ; X.XOVR := Overlay extent limit$ ; X.XLOG := Logical extent limit& ; X.XDIR := Directory extent limit ;F5 ; $CXDBL := Indicates context switching disabledn:; $DCCEL := Length of extent used to map this request3; $DCCEB, +2 := LBN of first block of this extents;e ; Returned: 7;;; N/A - control is passed to either CLOAD or $DRQRQB; ; Action: G; The appropriate extent limit is checked. If the request is too bigl; it is passed to the driver.e; @; Virtual requests are then increased to the read ahead limit.;x; Future enhancements:K; If a virtual request is made to a block which is the last one within andH; extent, we have the option of loading data from the next extent with:; the hope that the user will happen to request it soon.;n4; $DCNEL - Length of extent following current one/ ; $DCNEB - LBN of first block of this extent !;t=!LOAD: MESAG$ LMSG,17.,,<> ;JRK330d# ;**-18$ MOV KISAR6, -(SP) ; Save the cache partition mapping7% MOV U.UCBX(R5), KISAR6 ; Map to the UCBX temporarilyu&& .IFDF CHEDFR ;JRK330& ;JRK330nH& BITB #X2.DEA,APR6.BASE+X.CST2; Is the cache being deactivated ;JRK330<& BNE DEACT ; If NE, yes, don't allow cache loads ;JRK330& ;JRK330 & .ENDC ;CHEDFR ;JRK330e& ;JRK330 &' TSTB I.EFN(R1) ; Virtu00`nnnccccal function?.( BPL 40$ ; If PL, no, logical of some form)H* CMPB R4, APR6.BASE+X.XDAT ; Is the requested size acceptable? ;DPR0268+ BLOS 10$ ; If LOS, yes, attempt to increase ;DPR0261, JMP TOOBIG ; Else fail the request ;DPR0260-10$: ;DPR026.; O/; If the requested size is within the virtual I/O limit an attempt is made to;M0; increase it through to the end of the disk extent described by $DCCEB andH 1; $DCCEL.J2;eC3 BITB #XC.RDA, APR6.BASE+X.CSTS ; Is read ahead selected? ;DPR026L%4 BEQ CLOAD ; If EQ, no ;DPR026m5;P6; Calculate the number of disk blocks, starting from the requested one, to theC7; end of the extent. An implied carry is allowable in this case.l8;i.9 MOV I.PRM+P5(R1), R2 ; Get user's LBN (LSP)6: SUB $DCCEB+2, R2 ; Subtract base mapping of extent.; SUB R2, $DCCEL ; Subtract from extent size<:= CMP $DCCEL, R4 ; Is the end of the disk extent higher?7> BEQ CLOAD ; If EQ, no, can't increase size ;DPR026 $? BHI 15$ ; If HI, yes ;DPR026#@ BPT ; Sanity check ;DPR026A15$: ;DPR026u*B MOV $DCCEL, R4 ; Use the extent's sizeC-C CLR R3 ; Prepare to load byte. ;EDP033d3C BISB APR6.BASE+X.XRDA,R3 ; Load byte. ;EDP033M4E CMP R4, R3 ; Is the new size acceptable? ;**-1F BLOS 20$ ; If LOS, yes ;F MOV R3,R4 ; Otherwise impose read-ahead limit. ;EDP033H20$: ;**-1hI; OJ; If necessary the increased request size is reduced to avoid overlapping the2K; next cache extent.L; :M MOV (SP), KISAR6 ; Restore the cache partition mapping;N MOV APRD.BASE+H.TMP2, R0 ; Get CED of next extent by LBN6O BEQ CLOAD ; If EQ, isn't one, don't check overlapP4Q MOVB I.PRM+P4(R1), R3 ; Get fresh copy of LBN MSP3R MOV I.PRM+P5(R1), R2 ; Get fresh copy of LBN LSP08S ADD R4, R2 ; Recalculate high LBN based on new size T ADC R3tU-V CMPB R3, E.LBNL-1(R0) ; Overlap on buffer?cW BLO CLOAD ; If LO, noX BHI 30$ ; If HI, yesv/Y CMP R2, E.LBNL(R0) ; Double word comparisonMZ BLO CLOAD ; If LO, no[;cM\; There is overlap here. We must shrink the size of the request down. TheBQ]; best thing to do here is to subtract the extent's base LBN from the request's)N^; high LBN. The resulting number indicates how much the buffer size must beG_; adjusted to prevent overlap. Again, an implied carry is allowable.R`;.a30$: SUB E.LBNL(R0), R2 ; Subtract from LSP-b SUB R2, R4 ; Backup the necessary blocks c BR CLOAD ; Load the cached;uOe; Determine exactly what type of logical I/O and enforce corresponding limit..f;m9g40$: MOVB APR6.BASE+X.XOVR, R3 ; Assume it's an overlayi2h CMP I.FCN(R1), #IO.RLB ; Is assumption correct?i BNE 50$ ; If NE, yeshj8k MOVB APR6.BASE+X.XLOG, R3 ; Assume it's a logical I/O/l MOV I.TCB(R1), R2 ; Get the requestor's TCB,m; BNE 45$ ; If NE, got itRn; BPT ; Sanity check0o;45$:S(p BIT #T3.ACP, T.ST3(R2) ; From an ACP?q BEQ 50$ ; If EQ, nor3s MOVB APR6.BASE+X.XDIR, R3 ; Assume it's Files-11 )t TSTB $CXDBL ; Is assumption correct?pu BEQ 50$ ; If EQ, yes:v9w MOVB APR6.BASE+X.XDAT, R3 ; Turns out it's ACP virtualFxx50$: ;EDP033o8x CMPB R4,R3 ; Is requested size acceptable? ;EDP033&z BLOS CLOAD ; If LOS, yes ;**-1z ;JRK330 z .IFDF CHEDFR ;JRK330z ;JRK330,5z BR TOOBIG ; Increment the failure tally ;JRK330#z ;JRK330rz .ENABL LSB ;JRK330z ;JRK330P(zDEACT: MESAG$ DEAMSG,31. ;JRK330Bz MOV (SP)+,KISAR6 ; Restore the cache partition mapping ;JRK330z BR 10$ ;JRK330z ;JRK330oz .ENDC ;CHEDFR ;JRK330 z ;JRK330C(zTOOBIG: MESAG$ KMSG2,19. ;JRK330A} MOV (SP)+, KISAR6 ; Restore the cache partition mapping ;**-2K'~ USTAT$ S.RBIG ; Request is too big ; BR 10$10$:5 TST (SP)+ ; Remove statistics context from stack. CALLR $DRQRQ ; Pass request to the driver .DSABL LSB ;JRK330 S00`nmmmmffDATA .SBTTL + CLOAD - Cache load;( ; Passed:;,; (SP) := Cache partition physical address; 2(SP) := Statistics context ;J; R1 -> I/O packet+; I.PRM+P4, P5 := Requested starting LBNO"; R4 := Number of blocks to load;M ; Returned:6';;; N/A - control is passed to $DRQRQ*; ; Action:BG; Allocate the necessary data structures. If any resource is lackingt#; pass the request to the driver.R;RI; Prepare the packet going to the driver being sure everything is readyB6; for IOC since it may run before phase I completes.;hACLOAD: MOV (SP)+, KISAR6 ; Restore the cache partition mappingJ- CALL GETBUF ; Get a cache buffer ;**-1t1 BCS FAIL ; If CS, lacking cache private poold;M ; Context:'; R0 -> CED of newly allocated extentR; R1 -> I/O packet; 8 MOV R0, R3 ; Put the CED address in a safe register+ CALL CHEDUP ; Duplicate the I/O packetr2 BCS POOL1 ; If CS, lacking primary pool space;g ; Context:6; R0 -> Duplicated I/O packet to be queued to driver3; R1 -> Original I/O packet to be queued to cachet; R3 -> New CEDt;a  XOR R0, R3 ; Swap R0 and R3+ XOR R3, R0 ; Ready parameter to ATTCEDC XOR R0, R3 ; Complete swap3 CLR E.ATTL(R0) ; Initialize the attachment listt2 CLRB E.PCNT(R0) ; Initialize the pending count .IF DF CHESAN ;JRK336r ;JRK336D9 CLR E.MBXC(R0) ; Initialize the sanity block ;JRK336r ;JRK336g .ENDC ;CHESAN ;JRK336t ;JRK336u= CLR I.PRM+P3(R1) ; Initialize attachment count and statusa- CALL ATTCED ; Attach the I/O and the CED # BCC 10$ ; If CC, OK ;JRK330e8 JMP POOL2 ; Lacking Cache private Sec. Pool ;JRK33010$: ;JRK330i ;**-1e8 USTAT$ S.RLOD ; Now we're sure, increment read load5 TST (SP)+ ; Remove statistics context from stackJ;D; Prepare the driver packet.; ( MOV R0, -(SP) ; Save the CED address( MOV R1, -(SP) ; cache packet address& MOV R4, -(SP) ; and requested size; MOV KINAR5, I.IOSB+2(R3) ; Setup internal I/O completioncD MOV #, I.IOSB+4(R3) ; Address must be in APR5!, note bit-02 MOV E.PHYA(R0), R1 ; Buffer address doubleword MOV #140000, R2 ; In APR6 8 CALL $MPPHY ; Map to physical address if NPR device? MOV R1, I.PRM+P1.1(R3) ; Set the most significant part (MSP)? MOV R2, I.PRM+P1.2(R3) ; Set the least " " (LSP)e+ MOV R3, R1 ; Ready parameter to $DRQRQt; ;EDP033K; R4 currently contains the length expressed in 512-byte blocks. ;EDP033I; ;EDP0331 ASH #11,R4 ; Convert to byte count. ;EDP033 : MOV R4, I.PRM+P2(R1) ; Setup the buffer's length ;**-42 MOV R0, I.AADA(R1) ; Point to CED being loaded0 CLRB I.EFN(R1) ; Make into a logical I/O ???;P ; Note: %; Everything must be ready for IOC!;V6 MOVB #ES.RIP, E.STAT(R0) ; Flag as read-in-progress? MOV KISAR6, -(SP) ; Save APR6 because DUDRV uses it ;DPR022D@ MOV R5, -(SP) ; Save address of UCB, driver clobbers ;DPR032! CALL $DRQRQ ; Send to driver0* MOV (SP)+, R5 ; Restore UCB ;DPR032? MOV (SP)+, KISAR6 ; Restore mapping to cache region ;DPR022;. MOV (SP)+, R4 ; Restore the requested size( MOV (SP)+, R1 ; cache packet address# MOV (SP)+, R0 ; and CED address ; ; Context:$; R0 -> CED of extent being loaded; R1 -> Cache packet7; R4 := size of request in 512-byte blocks ;EDP033R; ;**-1%; Complete the setup of the new CEDa;s7 MOVB I.PRM+P4(R1), R3 ; Get MSP of the requested LBN 6 MOVB R3, E.LBNL-1(R0) ; Setup the extent LBN (MSP)' MOV I.PRM+P5(R1), E.LBNL(R0) ; (LSP)c< MOV I.PRM+P5(R1), E.LBNH(R0) ; Setup the high LBN as wellB ADD R4, E.LBNH(R0) ; Add the length to obtain high block ;**-1  ADC R33 MOVB R3, E.LBNH+2(R0) ; Setup the high LBN (MSP)d3 CALL QADAGE ; Insert the CED into the age list2- CALL QINLBN ; and int00`nnncccco the unit LBN list;p5; Prepare the cache packet for queueing to phase IIR;33 MOV R0, I.PRM+P6(R1) ; Point cache packet to CEDB6 MOV #APRD.BASE+H.PKTQ, R0 ; Get address of listhead/ CALL $QINSP ; Queue the packet by priorityL( RETURN ; IOC will request phase II;, ; Handle rejections and errors;  .ENABL LSB1&FAIL: MESAG$ KMSG3,20. ;JRK330A MOV #APR6.BASE, (SP) ; Errors are not counted in context ;**-1n7 USTAT$ S.PSP ; Lacking cache extent space ;DPR024N  BR 10$pPOOL1:;hQ; Should the situation occur where buffer space exists within the cache, BUT nohK; pool exists for an I/O packet, the allocated space within the partitionB; should be deallocated and the request forwarded to the driver.;w! MESAG$ KMSG4,21. ;JRK330dA  MOV #APR6.BASE, (SP) ; Errors are not counted in context ;**-132  USTAT$ S.POL ; Lacking primary pool ;DPR024 -  MOV R3, R0 ; Prepare parameter to FREBUF " CALL FREBUF ; Free up the CED  BR 10$ POOL2:;J; There is not enough pool available for an attachment. Back out of the>; current predicament and forward the request to the driver.;w! MESAG$ KMSG1,18. ;JRK330 A MOV #APR6.BASE, (SP) ; Errors are not counted in context ;**-1G7 USTAT$ S.PSP ; Lacking cache private pool ;DPR024o" CALL FREBUF ; Free up the CED  XOR R1, R3 ; Swap R1 and R3- XOR R3, R1 ; Prepare parameter to $DRQRQe- XOR R1, R3 ; Prepare parameter to CHEDEPC6 CALL CHEDEP ; Deallocate the duplicate I/O packet ; BR 10$ 10$:5! TST (SP)+ ; Remove statistics context from stack ." CALLR $DRQRQ ; Pass request to the driver # .DSABL LSB8# .PAGE ;JRK3309# .SBTTL MULTI-EXTENT TRANSFER I/O COMPLETION ;JRK330=# .SBTTL + MBXIOC - Internal I/O completion routine ;JRK330#; ;JRK330#; Passed: ;JRK330 %#; R3 -> Driver packet ;JRK330r##; I.UCB -> UCB ;JRK330,.#; I.PRM+P3, P4 := Driver status ;JRK330,#; I.AADA -> Cache packet ;JRK330#; ;JRK330# .IFDF CHEDFR ;JRK330# ;JRK330#MBXIOC: ;JRK330:# MESAG$ MBXMSG,39.,,<> ;JRK330# ;JRK330E4# MOV I.UCB(R3),R5 ; Get the UCB address ;JRK3304# MOV R3,R1 ; Copy address of I/O packet ;JRK330># CALL ADJBUF ; Adjust user buffer to $BLXIO format ;JRK330<# MOV I.AADA(R3),R3 ; Get address of cache packet ;JRK330#; ;JRK330#; Passed: ;JRK330 $#; R3 -> Cache packet ;JRK330E#; I.PRM+P4 := Requested LBN most significant part (MSP) ;JRK330JE#; I.PRM+P5 := Requested LBN least significant part (LSP) ;JRK330.9#; I.PRM+P6.1 -> CED of first involved extent ;JRK330R7#; I.PRM+P3, P4 := Driver completion status ;JRK330C#; ;JRK330U#; Get back the pointer to the duplicate I/O packet with the saved arguments ;JRK330AT#; from the original. Copy these values back to the original packet to be ;JRK330R#; sent to the user and deallocate the pool for the duplicated I/O packet ;JRK330#; ;JRK330# ;JRK330A# MOV I.IOSB+2(R3),I.IOSB+2(R1) ; Restore original IOSB ;JRK3303,# MOV I.IOSB+4(R3),I.IOSB+4(R1) ;JRK330B# MOV I.AADA(R3), I.AADA(R1) ; Restore original I.AADA ;JRK330I# MOV I.PRM+P4(R3),I.PRM+P4(R1) ; Restore the MSP and LSP of the ;JRK330 C# MOV I.PRM+P5(R3),I.PRM+P5(R1) ; starting LBN address ;JRK330pI# MOV I.PRM+P6.1(R3), R0 ; Get address of first involved extent;JRK330s# ;JRK330 @# CALL CHEDEP ; Deallocate packet from primary pool ;JRK330#; ;JRK330U#; Go into a loop getting the addresses of the involved extents to be copied ;JRK330,X#; into the user buffer now that the disk copy of the data is completed. These ;JRK330T#; addresses are taken from the attachment blocks hanging off the duplicate ;JRK330Y#; I/O packet. The CEDs are individual processed to restore the blocking counts ;JRK330 Y#; and copy t00`nmmmmffDATAhe data to the user task. Then the attachment block is deallocated.;JRK330D#; ;JRK330<# MOV R0,R3 ; Copy the first CED address involved ;JRK3305# BNE 5$ ; If NEQ, there is one to process ;JRK330p4# BPT ; There had better be at least one ;JRK330# ;JRK330s6#5$: CALL MAPPAR ; Map the Cache partition ;JRK3309# MOV R1,R5 ; Duplicate the I/O packet address ;JRK330# ;JRK330DG#10$: MOV A.IOPA(R3),R0 ; Get the CED address for this attach ;JRK330n:# MOV (R3),-(SP) ; Save the next packet address ;JRK330:# CALL .DEPAD ; Deallocate the attachment block ;JRK330C# BISB #ES.XIP,E.STAT(R0) ; Indicate transfer in progress ;JRK330Q#; ;JRK330Y#; First determine the address of the LBN immediately following the I/O request. ;JRK330R#; This will be used in the determination of the size and buffer offsets ;JRK330#; ;JRK330'# MOV I.PRM+P5(R5),-(SP) ; ;JRK330AH# MOVB I.PRM+P4(R5),R4 ; Get address of first LBN after request;JRK330# MOV R4,-(SP) ; ;JRK330?# MOV I.PRM+P2(R5),R4 ; Get the request size (bytes) ;JRK330k&# ADD #777,R4 ; Round up ;JRK3302# ROR R4 ; Bring carry in as high bit. ;JRK3307# SWAB R4 ; Finish right shift of nine bits. ;JRK330d3# BIC #177400,R4 ; Clear unwanted bits. ;JRK330w:# ADD R4,2(SP) ; Calculate highest LBN requested ;JRK330,# ADC (SP) ; Carry if necessary ;JRK330#; ;JRK330S#; Now the range of the I/O packet is determined by the I.PRM+P4/P5 start ;JRK330T#; address and the (SP)/2(SP) pair while the CED range is determined by the ;JRK330/#; E.LBNL/-1 and E.LBNH/+1 pair. ;JRK330#; ;JRK3305# CLR R1 ; Initialize the CED offset value ;JRK330h# ;JRK330 C# MOV I.PRM+P2(R5),R2 ; Get the total size of the request ;JRK330D# ;JRK330e.# CLR R3 ; Initialize front offset ;JRK330N# CMPB E.LBNL-1(R0),I.PRM+P4(R5) ; See if there is an offset in front ;JRK3305# BHI 20$ ; If HI, there is, determine it ;JRK330+# BLO 30$ ; If LO, there isn't ;JRK330hA# CMP E.LBNL(R0),I.PRM+P5(R5) ; Double precision check ;JRK330+;# BHI 20$ ; If HI, there is an offset to compute ;JRK330n*# BEQ 30$ ; If EQ, no offset ;JRK330# ;JRK330MG# MOV I.PRM+P5(R5),R1 ; Compute the offset into the CED buffer;JRK330 ## SUB E.LBNL(R0),R1 ; ;JRK330e0# BR 30$ ; Go on to compute the size ;JRK330# ;JRK330eA#20$: MOV E.LBNL(R0),R3 ; Determine front sided offset ;JRK330e%# SUB I.PRM+P5(R5),R3 ; ;JRK330O7# ASH #9.,R3 ; Turn block number into bytes ;JRK330;# ;JRK330cB#30$: SUB R3,R2 ; R2 now contains modified size request ;JRK330# ;JRK330;2# CLR R3 ; Initialize back side offset ;JRK330# ;JRK3301A# CMPB (SP),E.LBNH+2(R0) ; Is there a back sided offset ;JRK3300## BLO 50$ ; If LO, no ;JRK330o$# BHI 40$ ; If HI, yes ;JRK330># CMP 2(SP),E.LBNH(R0) ; Check with double precision ;JRK3305# BLOS 50$ ; If LOS, no offset to compute ;JRK330K# ;JRK330 >#40$: MOV 2(SP),R3 ; Get high address of I/O request ;JRK330B# SUB E.LBNH(R0),R3 ; Turn it into the back sided offset ;JRK3307# ASH #9.,R3 ; Turn block number into bytes ;JRK330o# ;JRK330 @#50$: SUB R3,R2 ; R2 contains transfer size in blocks ;JRK330# ;JRK330B4# CLR R3 ; Get default user buffer offset ;JRK330# ;JRK330CI# CMPB E.LBNL-1(R0),I.PRM+P4(R5) ; Is there a user buffer offset ;JRK330 ## BLO 70$ ; If LO, no ;JRK330K$# BHI 60$ ; If HI, yes ;JRK330E# CMP E.LBNL(R0),I.PRM+P5(R5) ; Check with double precision ;JRK330 6# BLOS 70$ ; If LOS, no user buffer offset ;JRK330# ;JRK330m@#60$: MOV E.LBNL(R0),R3 ; Get high LBN address of CED ;JRK330A# SUB I.PRM+P5(R5),R3 ; Turn R3 into user buffer offset ;JRK330B#; ;JRK330X#; The result of the previous code was to determine the relative offsets of the ;JRK330X#; starting addresses of the APR biases of the 00`nnnccccuser buffer determined by ADJBUF ;JRK330X#; and the CED LBN (E.LBNL). These values will be passed to EBLXIO to copy the ;JRK330:#; data into the user buffer from the extent. ;JRK330#; ;JRK330@#70$: MOV (SP)+,(SP)+ ; Pop the excess data off stack ;JRK3309# ASH #3,R1 ; Turn user offset into 32 wd bias ;JRK330f8# ASH #3,R3 ; Turn CED offset into 32 wd bias ;JRK330B# ADD I.PRM(R5),R3 ; Get bias into user buffer for start ;JRK330<# ADD E.PHYA(R0),R1 ; Get bias into CED for start ;JRK3301# MOV R0,-(SP) ; Save the CED address ;JRK330L7# MOV R2,R0 ; Get size to transfer in bytes ;JRK330;D# MOV #APR5.BASE,R2 ; Get source displacement in APR5 form ;JRK330F# MOV I.PRM+2(R5),R4 ; Get destination displacement from I/O ;JRK330#; ;JRK3308#; Transfer data from extent to user buffer ;JRK330#; ;JRK3308# CALL EBLXIO ; Transfer data to user buffer ;JRK330# ;JRK330f0# MOV (SP)+,R0 ; Restore CED address ;JRK3307# CALL QUPAGE ; Move CED to end of age list ;JRK330 E# BICB #ES.XIP,E.STAT(R0) ; Indicate no transfer in progress ;JRK330 ># DECB E.PCNT(R0) ; Unlock extent for this operation ;JRK3309# BNE 80$ ; If NE, that's all that can be done ;JRK330s#; ;JRK330@#; See if this extent has been waiting to be deleted ;JRK330#; ;JRK330H# BITB #ES.DEL,E.STAT(R0) ; Been declared available for delete? ;JRK330,# BEQ 80$ ; If EQ, no, finished ;JRK330# ;JRK330;8# MESAG$ MBX1,32.,,<> ;JRK330# ;JRK330I:# MOV R5,-(SP) ; FRECED requires that R5 contain ;JRK330D# MOV I.UCB(R5),R5 ; the address of the UCB for request ;JRK330;# CALL FRECED ; Try to write the CED out to disk ;JRK330 9# MOV (SP)+,R5 ; Restore the I/O packet address ;JRK330e#; ;JRK330H#; See if there are any more CEDs to be processed in the list ;JRK330#; ;JRK330A#80$: MOV (SP)+,R3 ; See if any more packets to process ;JRK330M-# BEQ 100$ ; If EQ, there aren't ;JRK330R)# JMP 10$ ; If NE, there are ;JRK330 #; ;JRK330V#; All transfers are complete. Finish up the I/O passing the packet back to ;JRK330#; the user. ;JRK330r#; ;JRK330M#100$: BICB #CS.REQ,APRD.BASE+H.CSTS; Indicate no need for Phase II ;JRK330 8# MOV R5,R3 ; Use driver packet to finish I/O ;JRK330=# MOV I.UCB(R3),R5 ; Set up UCB address for device ;JRK330(?# MOV I.PRM+P3(R3),R0 ; Get driver completion status ;JRK3300@# MOV I.PRM+P2(R3),R1 ; along with the size of read ;JRK3304# CALL $IOFIN ; Complete the I/O process ;JRK330# CALLR DCRUN ;JRK330I# ;JRK330 # .ENDC ;CHEDFR ;JRK330 $ &% .SBTTL READ INTERNAL I/O COMPLETION4& .SBTTL + IOC - Cache load internal I/O completion';I (; Passed:); R3 -> I/O packet completingt*; I.UCB -> UCB ;DPR026B"+; I.PRM+P3, P4 := Driver status0,; I.AADA -> CED of extent loaded by this I/O(-; E.STAT := Extent status (ES.RIP).; See also routine DECIO/; 0; Returned:0&1;;; N/A - control is passed to DCRUN2; 3; Actions:=4; This routine saves the I/O status, signals I/O completionD=5; to all I/O packets waiting via the attachments list, setsN>6; error disposition (and passes error code) if the operation77; did not complete successfully, and propagates cache 78; execution if necessary (any I/O packets are ready).9;I9IOC: ;JRK330o; ;**-15< MOV I.UCB(R3), R5 ; Get the UCB address ;DPR026o&= CALL MAPPAR ; Map cache partition>,? MOV I.AADA(R3), R2 ; Get the CED addressA@ BITB #ES.RIP, E.STAT(R2) ; Is extent mark as read-in-progress?o!A BNE 5$ ; If NE, sanity checkvB BPTC5$:nMC MESAG$ IOCMSG,22.,,<,> ;JRK330C ;JRK330s8D BICB #ES.RIP, E.STAT(R2) ; No longer read-in-progressE;F MOVB I.PRM+P3(R3), R0 ; Get the driver completion statuso%G TSTB R0 ; Is an error indicated? H BPL00`nmmmmffDATA 10$ ; If PL, noI I MESAG$ EMSG,23. ;JRK330BK MOV #APR6.BASE, -(SP) ; Errors are not counted in context ;**-1@L USTAT$ S.RLE ; Read error attempting to load region ;DPR024=M TST (SP)+ ; Remove statistics context from stack ;DPR024MNDO BISB #ES.DEL, E.STAT(R2) ; Mark extent for delete during phase IIP9Q10$: CALL DECIO ; Decrement I/O counts and set CS.REQrR,S CALL CHEDEP ; Deallocate the I/O packetT CALLR DCRUNU o3V .SBTTL + DECIO - Cache completion and scheduling W; X; Passed:"Y; Cache partition mapped in APR6Z;P[; R0 := I/O status"\; R2 -> CED of the extent loaded]; E.ATTL -> First attachmentt ^; A.ANXT -> Next attachment6_; A.IOPA -> Cache I/O packet stalled for this CED"`; I.PRM+P3 := Pending counta;a b; Returned:ec; All registers preserved0d;L e; Actions:9f; Decrement pending I/O counts in attached packets, andD5g; modify disposition if an error has been returned.Th;E/i; All attachment descriptors are deallocated. j;dBk; If any pending I/O count reaches zero, then CS.REQ will be setl; in the cache status.m;dnDECIO: MOV R1, -(SP)o MOV R3, -(SP)p>q BICB #CS.REQ, APRD.BASE+H.CSTS ; Assume NO request phase IIr.s10$: MOV E.ATTL(R2), R3 ; Get an attachment t BEQ 40$ ; End of list if EQu4v MOV A.IOPA(R3), R1 ; Get the I/O packet address4w DECB I.PRM+P3(R1) ; Decrement the pending count$x BNE 20$ ; If NE, still stalled8y BISB #CS.REQ, APRD.BASE+H.CSTS ; Assumption was wrongz20$:%{ TSTB R0 ; Is an error indicated?z2| BPL 30$ ; If PL, no, don't change dispositionA} BIS #CD.ERR, I.PRM+P3(R1) ; Else signal that it goes to $IOFIN.~30$:9 MOV (R3), E.ATTL(R2) ; Unlink the entry before it goesE/ CALL .DEPAD ; And deallocate the PAD block;/ BR 10$ ; Then try to signal another packet 40$: MOV (SP)+, R3 MOV (SP)+, R1  RETURNc t .SBTTL READ PHASE IIE/ .SBTTL + $DCRII - Data caching read phase IIA;A ; Passed:s"; Cache partition mapped in APR6;;; R1 -> Cache packet$; I.PRM+P3 := Status (set by IOC)-; I.PRM+P6 -> CED of first extent involvedE ; R5 -> UCB ;e ; Returned:G;;; N/A - control is passed to either XFER or DCRUN (for next packet) ;D ; Action:l9; Should an internal I/O result in an error, the extenth9; will be marked as in error. All I/O packets attachedR8; to that extent at the time of I/O completion will be7; marked with a disposition of CD.ERR. These packetsa8; are passed to the phase II routines by DCRUN without8; further processing. Therefore, they must be handled ; here. ;t9; Basically, this involves detaching this I/O operation 7; from any extents it owns, and allowing them to passk:; to FRECED for deallocation, if possible. In addition,7; the failed request is passed directly to the driver ; for final processing.;o $DCRII::6 BIT #CD.ERR, I.PRM+P3(R1) ; Driver error indicated?3 BEQ XFER ; If EQ, no, proceed to transfer datas- CALL DETCED ; Detach any outstanding I/Ou6 MOV I.UCB(R1),R5 ; Get UCB for this I/O. ;edp047? MOV KISAR6, -(SP) ; Save APR6 because DUDRV uses it ;DPR022r@ MOV R5, -(SP) ; Save address of UCB, driver clobbers ;DPR0380 CALL $DRQRQ ; Pass the packet to the driver* MOV (SP)+, R5 ; Restore UCB ;DPR038? MOV (SP)+, KISAR6 ; Restore mapping to cache region ;DPR022I0 CALLR DCRUN ; Then check for another packet  .SBTTL + XFER - Transfer data;r ; Passed:"; Cache partition mapped in APR6;d; R1 -> Cache packet-; I.PRM+P6 -> CED of first extent involvedV;R ; Returned:e8;;; N/A - control is passed to DCRUN (for next packet);a ; Action:,:; Phase II is used to perform the actual read transfers.;h; Future enhancements:<; Handle the case of multiple extents mapping the request.K; If this transfer routine is found to place too much of a load on kernel @; mode, then code to $FORK can be insert00`onncccced between data moves.; ; Note:t@; Disk devices enforce word alignment, and since cache extents8; are also word aligned, data transfers are fast using7; the executive's $BLXIO routine. (A single 256 worda9; disk block takes approximately 600us on a PDP-11/70.)r;r;; Parameter 3 of the user's I/O packet is used as the sum ; of bytes moved.a; !; The stack is used as follows:r;; 2(SP) - "Current" - Size of the "blocks" * 512 (bytes)o:; 0(SP) - "blocks" - Size in LBNs of blocks to be moved; ; The algorithm is as follows:;r7; 1. Adjust the user's buffer. NPR devices will havel4; real 22-bit addresses in I.PRM+0 and I.PRM+2.3; $BLXIO expects to see an address doubleword.o;k3; 2. Initialize the count of bytes moved to zero.a; ("moved"); 4; 3. Determine the amount of data available in the6; initial extent by subtracting the high LBN from8; the user's request LBN. This gives the number of4; blocks to move ("blocks"). In bytes, this is5; multipled by 512 ("current"). If "current" is 2; larger than the request (I.PRM+P2), then P2; will replace "current".;.6; 4. The buffer's starting APR address is the user's1; block number less the LBNL (starting LBN).v5; This number multiplied by 8 is used as the APRt6; bias of the starting address (since all buffers7; in cache are APR aligned, the virtual address isu; only 120000 or 140000).;2; 5. Setup and call $BLXIO to transfer the data.; 8; 6. Add the blocks transferred "blocks" to the user's6; starting LBN (P4/P5). Add the number of blocks5; "blocks" times 8 to the user's buffer APR biasA3; to advance it to the next receiving address.e8; Add the bytes moved "transfer" to the total bytes; moved "moved".;b9; 7. Replace the original CED pointer in the I/O packeta8; to reflect the next CED that may possibly need to;; be processed. Unlock the current CED by decrementingn); the pending packet count (E.PCNT). ;f8; 8. Subtract the amount moved "moved" from the user's8; byte count (P2). If this number reaches zero (or7; less), then the cache operation is complete. Ift&; not, then we go back to step 3.;vXFER:f( MOV I.PRM+P6(R1),R0 ;Get CED address< BISB #ES.XIP,E.STAT(R0) ;Indicate transfer is in progress. CALL ADJBUF ;Adjust user's buffer address/ MOV R1,R5 ;Reference I/O packet through R5u5 CLR I.PRM+P3(R5) ;Initialize count of bytes movedo3 MOV E.LBNH(R0),R2 ;Get LSP of extent high LBN+1o5 SUB I.PRM+P5(R5),R2 ;Subtract LSP of user requestn; ; Note:o6; We ignore the highest bits here, since this CED is6; definitely connected with this request, and we are5; allowed to borrow from the most significant bits.S4 ; Our result is a single precision count of blocks) ; which are transferrable. ;EDP033d; ;**-5+ MOV R2, R3 ; Duplicate the block countR* ASH #9., R3 ; Convert to a byte bount3 CMP I.PRM+P2(R5),R3 ;User ask to transfer less?B BHIS 20$ ;No if HIS@ MOV I.PRM+P2(R5),R3 ;Else replace extent by user buffer size20$:( MOV I.PRM+P6(R5),R0 ;Get CED address0 MOV R3,-(SP) ;Save the size of bytes to move6 MOV R2,-(SP) ;Save the count of blocks being moved. MOV I.PRM+P5(R5),R1 ;Get user's base block6 SUB E.LBNL(R0),R1 ;Subtract extent base for offset+ ASH #3, R1 ;Make it an APR bias offsetR9  ADD E.PHYA(R0),R1 ;Now R1 is APR bias of cache bufferP!&" MOV R0,-(SP) ;Save the CED address#$$ MOV 4(SP),R0 ;Get the byte count0% MOV #APR5.BASE,R2 ;Setup source displacement.& MOV I.PRM(R5),R3 ;Get destination APR bias4' MOV I.PRM+2(R5),R4 ;Get destination displacement/' CALL EBLXIO ; Transfer the data. ;EDP033gL ;**-36*M MOV (SP)+,R0 ;Get back the CED address'N MOV (SP)+,R1 ;Get the blocks copiedoO0P ADD R1,I.PRM+P5(R5) ;Adjust the starting LBN(Q00` oaommmffDATA ADC I.PRM+P4(R5) ;(double precision)R.S ASH #3, R1 ;Blocks becomes 32-word blocks,T ADD R1,I.PRM(R5) ;Relocate user's buffer8U MOV E.LNXT(R0),I.PRM+P6(R5) ;Point packet to next CED-V CALL QUPAGE ;Move CED to end of age listiW:X BICB #ES.XIP,E.STAT(R0) ;Transfer operation is complete4Y DECB E.PCNT(R0) ;Unlock this CED for this packet1Z BNE 25$ ; If NE, more pending - don't deletes[A\ BITB #ES.DEL, E.STAT(R0) ; Is this extent marked for deletion? *] BEQ 25$ ; If EQ, no - don't delete it^_ CALL FRECEDb25$: ;**-2 7c ADD (SP),I.PRM+P3(R5) ;Add bytes teleported to totalo;d SUB (SP)+,I.PRM+P2(R5) ;Subtract moved from request sizek*e BHI 20$ ;Go do another extent if moref; Fg; Request is now complete. P3 is the total of the bytes transferredIh; for this request. It must be placed in R1 (R0 will indicate success)I*i; and the packet is forwarded to $IOFIN.j;E$k MOV R5,R3 ;Setup $IOFIN context3l MOV I.UCB(R3),R5 ;R5 -> Disk UCB for completiond5m MOV I.PRM+P3(R3),R1 ;Set the count of bytes moved)n MOV #,R0 ;Indicate successd"o CALL $IOFIN ;Complete the I/Op-q CALLR DCRUN ; R5 already pointing to UCB;r "s .IF DF CHEDBG ;Debugging text,t .SBTTL *** DEBUG *** Module contains data uRMSG: .ASCIZ <15><12>"READ - "(vMMSG: .ASCIZ "MISSED: PARTIAL OVERLAP"wHMSG: .ASCIZ "HIT"xLMSG: .ASCIZ "LOAD"w.yKMSG1: .ASCIZ " - REJECTED: NO POOL FOR PAD"&zKMSG2: .ASCIZ " - REJECTED: TOO BIG"/{KMSG3: .ASCIZ " - REJECTED: NOT ENOUGH CACHE"1?|KMSG4: .ASCIZ " - REJECTED: NO POOL FOR DUPLICATE I/O PACKET"t}%~IOCMSG: .ASCIZ <15><12>"IOC - READ"IEMSG: .ASCIZ " - ERROR"R<MBXMSG: .ASCIZ <15><12>"Multi-extent transfer" ;JRK330KMBX1: .ASCIZ <15><12>" - Deferred extent moved to user buffer" ;JRK330"CDEAMSG: .ASCIZ " - Rejected: Cache being deactivated" ;JRK330ITDFRATT: .ASCIZ <15><12>"Deferred extent attached for Multi-block transfer" ;JRK330 .EVEN .ENDC ; .IF DF CHEDBG .ENDC ; .IF DF D$$CHE .ENDE"1?|KMSG4: .ASCIZ " - REJECTED: NO POOL FOR DUPLICATE I/O PACKET"t}%~IOCMSG: .ASCIZ <15><12>"IOC - READ"IEMSG: .ASCIZ " - ERROR"R<MBXMSG: .ASCIZ <15><12>"Multi-extent transfer" ;JRK330KMBX1: .ASCIZ <15><12>" - Deferred extent moved to user buffer" ;JRK330"CDEAMSG: .ASCIZ " - Rejected: Cache being deactivated" ;JRK330ITDFRATT: .ASCIZ <15><12>"Deferred extent attached for Multi-block transfer" ;JRK330 .EVEN .ENDC ; .IF DF CHEDBG . .IF DF L$$GCL .NLIST .ENABL LC .NLIST BIN,LOC .LIST X; Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 1C; 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (1),; 0001 0 %TITLE 'Logical Name Directives'); 0002 0 MODULE DRPFN (IDENT = 'X1.10'; 0003 0 ) =; 0004 1 BEGIN,; 0005 1 ! COPYRIGHT (c) 1985,1986 BYA; 0006 1 ! DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; 0007 1 !T; 0008 1 ! THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIEDT; 0009 1 ! ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THET; 0010 1 ! INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHERT; 0011 1 ! COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANYT; 0012 1 ! OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY; 0013 1 ! TRANSFERRED. ; 0014 1 !RT; 0015 1 ! THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICET; 0016 1 ! AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT; 0017 1 ! CORPORATION. ; 0018 1 ! T; 0019 1 ! DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITSE; 0020 1 ! SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.L ; 0021 1 ; 0022 1 !++E; 0023 1 ! FACILITY:N&; 0024 1 ! RSX-11M-PLUS executive ; 0025 1 !N; 0026 1 ! ABSTRACT:M; 0027 1 ! Provide the directives that support 00aonnccccthe use of logical names,O<; 0028 1 ! particularly in relation to file operations. ; 0029 1 !T; 0030 1 ! ENVIRONMENT:Q; 0031 1 ! Kernel Mode, priority 0, called by directive dispatcher, residentH>; 0032 1 ! in directive common, overmapped I and D spaces ; 0033 1 !T; 0034 1 ! AUTHORs:; 0035 1 ! Tony Lekas"; 0036 1 ! Michael Pettengill ; 0037 1 !1); 0038 1 ! CREATION DATE: 16-JUN-1984 ; 0039 1 !+; 0040 1 ! MODIFIED FOR M-PLUS V 3.0 BY:u ; 0041 1 !f ; 0042 1 ! Paul K. M. Weiss ; 0043 1 ! ; 0044 1 ! Modified by: ; 0045 1 !T.; 0046 1 ! Paul K. M. Weiss 8-Apr-1986 1.09 ; 0047 1 !r3; 0048 1 ! PKW111 - Don't crash on a parse of _ L; 0049 1 ! PKW112 - Don't remove all zeros from version # in FCS defaultG; 0050 1 ! Don't return version # of -1 in FCS default as 177777  t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 2 H;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (1) ; 0051 1 !3.; 0052 1 ! Paul K. M. Weiss 8-Aug-1986 1.10 ; 0053 1 ! H; 0054 1 ! PKW117 - Don't clear FS$QUO when a node is separated for #; 0055 1 ! logical expansion0; 0056 1 !-- ; 0057 1 ; 0058 1 !e; 0059 1 ! INCLUDE FILES: ; 0060 1 !'!; 0061 1 LIBRARY 'BLI:RSX11M';a ; 0062 1 LIBRARY 'BLI:FCS11'; a];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 3AH;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (2) ; 0063 1 !l; 0064 1 ! MACROS: ; 0065 1 ! ; 0066 1 MACRO ; 0067 1 !a/; 0068 1 ! Set directive status and exit ; 0069 1 !a); M 0070 1 ERROR_EXIT (error_code) = ; M 0071 1 BEGIN; M 0072 1 LINKAGE#; M 0073 1 error_trap = TRAP;B0; M 0074 1 error_trap (error_code AND %o'377'); 0075 1 END %;e ; 0076 1 ; 0077 1 MACRO1; 0078 1 !4A; 0079 1 ! Move a character string. Advance the pointers.E; 0080 1 !0'; M 0081 1 ch$move (len, ip, op) =A; M 0082 1 BEGIN ; M 0083 1 ; M 0084 1 MAP&; M 0085 1 ip : REF VECTOR [,BYTE],&; M 0086 1 op : REF VECTOR [,BYTE]; ; M 0087 1 ; M 0088 1 IF len NEQU 0; M 0089 1 THEN (; M 0090 1 DECR i FROM len TO 1 DO; M 0091 1 BEGIN4; M 0092 1 op [0] = .ip [0];o; M 0093 1 op = op [1];; M 0094 1 ip = ip [1];; M 0095 1 END; ; M 0096 1 ; 0097 1 END; %; ; 0098 1 ; 0099 1 LITERAL 4; 0100 1 debug_version = 1; ! Variant type ; 0101 1 ; 0102 1 MACRO ; 0103 1 ! E; 0104 1 ! No /VARIANT switch produces the production version.RH; 0105 1 ! /VARIANT produces the debug version with global stuff.; 0106 1 ! "; M 0107 1 global_for_debug =@; 0108 1 %IF %VARIANT EQLU debug_version %THEN GLOBAL %FI %,0; M 0109 1 global_for_debug_own_otherwise =I; 0110 1 %IF %VARIANT EQLU debug_version %THEN GLOBAL %ELSE OWN %FI%, -; M 0111 1 external_debug_forward_else = O; 0112 1 %IF %VARIANT EQLU debug_version %THEN EXTERNAL %ELSE FORWARD %FI%, ; M 0113 1 find_something =,; M 0114 1 %IF %VARIANT EQLU debug_version; M 0115 1 %THEN; M 0116 1 find_test f];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 4gH;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (2); M 0117 1 %ELSE!; M 0118 1 find_equivalenceG; 0119 1 %FI%; ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 5HH;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (3) ; 0120 1 !N; 0121 1 ! LINKAGES ; 0122 1 !N; 0123 1 LINKAGEnj; 0124 1 $LNxxx_l = JSR (REGISTER = 3, REGISTER = 4, REGISTER = 5) : NOPRESERVE (0, 1, 2, 3, 4, 5),^; 0125 1 common_parse_l = JSR (REGISTER = 3, REGISTER = 4, REGISTER = 5, REGISTER = 0),T; 0126 1 sec_spec_conve00aoommmffDATArt_l = JSR (REGISTER = 3, REGISTER = 4; REGISTER = 3),D; 0127 1 return_ie_xxx_l = JSR : PRESERVE (0, 1, 2, 3, 4, 5),i; 0128 1 lun_assign_l = JSR (REGISTER = 3, REGISTER = 4, REGISTER = 5, REGISTER = 0, REGISTER = 1,II; 0129 1 REGISTER = 2; REGISTER = 1) : NOPRESERVE (0, 1, 2, 3, 4, 5),Rb; 0130 1 find_equivalence_l = JSR (REGISTER = 1, REGISTER = 2; REGISTER = 1, REGISTER = 2),U; 0131 1 fss_l = JSR (REGISTER = 4, REGISTER = 5; REGISTER = 4, REGISTER = 5), 7; 0132 1 expand_filespec_l = JSR (REGISTER = 3),EF; 0133 1 separate_logical_l = JSR (REGISTER = 3, REGISTER = 4),3; 0134 1 ch$classify_l = JSR (REGISTER = 1),To; 0135 1 ch$copy_l = JSR (REGISTER = 1, REGISTER = 2, REGISTER = 3; REGISTER = 3) : NOPRESERVE (0, 1, 2)E; 0136 1 PRESERVE (4, 5), I; 0137 1 save_parse_l = JSR (REGISTER = 1) : NOPRESERVE (0, 1, 2),=`; 0138 1 RAD50_to_ASCII_l = JSR (REGISTER = 1, REGISTER = 2, REGISTER = 3; REGISTER = 2); ; 0139 1 ; 0140 1 !a ; 0141 1 ! TABLE OF CONTENTS: ; 0142 1 ! ; 0143 1 FORWARD ROUTINE(Y; 0144 1 $LNFSS : $LNxxx_l NOVALUE, ! File Specification Scan, called from DRLOG5P; 0145 1 $LNCHN : $LNxxx_l NOVALUE, ! Assign channel, called from DRLOGR; 0146 1 $LNRMS : $LNxxx_l NOVALUE, ! RMS format parse, called from DRLOGR; 0147 1 $LNFCS : $LNxxx_l NOVALUE, ! FCS format parse, called from DRLOG_; 0148 1 common_parse : common_parse_l NOVALUE, ! Parse code common to RMS and FCS parse1V; 0149 1 fss : fss_l NOVALUE, ! Utility routine to parse a file specification`; 0150 1 expand_filespec : expand_filespec_l, ! Expand a file specification with logicalsF; 0151 1 ch$classify : ch$classify_l, ! Classify the characterS; 0152 1 ch$copy : ch$copy_l NOVALUE, ! Copy, upcase, and compress a string ]; 0153 1 convert_parse : NOVALUE, ! Convert addresses in parse block to user virtualpL; 0154 1 merge, ! Merge primary and secondary file specificationsO; 0155 1 save_parse : save_parse_l NOVALUE, ! Save and zero parse blocknS; 0156 1 RAD50_to_ASCII : RAD50_to_ASCII_l NOVALUE; ! Convert RAD50 to ASCIIw ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 6 H;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (4)/; 0157 1 EXTERNAL_DEBUG_FORWARD_ELSE ROUTINEaZ; 0158 1 find_equivalence : find_equivalence_l; ! Find equivalence for logical name ; 0159 1 ; 0160 1 ! ; 0161 1 ! EQUATED SYMBOLS: ; 0162 1 !,; 0163 1 LITERALs; 0164 1 true = 1,A; 0165 1 false = 0,; 0166 1 valid = 1,; 0167 1 success = 1,; 0168 1 terminal = 3,6; 0169 1 error = 0,-; 0170 1 bad_node = -1176, ! ER$NOD .; 0171 1 bad_device = -448, ! ER$DEVD; 0172 1 bad_directory = -464, ! ER$DIRD; 0173 1 bad_filename = -752, ! ER$FNMD; 0174 1 bad_char = -1824, ! ER$XTRD; 0175 1 bad_logical = -184, ! ER$BEQD; 0176 1 bad_recursive = -1688, ! ER$TRND; 0177 1 bad_size = -780; ! ER$FTB ; 0178 1 ; 0179 1 LITERAL!>; 0180 1 apr5_v = %o'120000', ! APR 5 virtual address>; 0181 1 apr6_v = %o'140000'; ! APR 6 virtual address ; 0182 1 *; 0183 1 LITERAL ! Character types7; 0184 1 ch_other = 0, ! All other characters ,; 0185 1 ch_lower = 1, ! Lowercase); 0186 1 ch_space = 2, ! SpacesB.; 0187 1 ch_oct = 3, ! Octal Number.; 0188 1 ch_alpha = 4, ! Alphabetic (; 0189 1 ch_comma = 5, ! Comma(; 0190 1 ch_colon = 6, ! Colon1; 0191 1 ch_quote = 7, ! "Double" quoteu<; 0192 1 ch_dir = 8, ! Matching directory bracket=; 0193 1 ch_wild = 9, ! Wildcards, star and percentr'; 0194 1 ch_das00a"onncccch = 10, ! Dash!%; 0195 1 ch_dot = 11, ! Dot 0; 0196 1 ch_dollar = 12, ! Dollar sign.; 0197 1 ch_under = 13, ! Underscore4; 0198 1 ch_8and9 = 14, ! Non octal digitsA; 0199 1 ch_misc = 15, ! Miscellaneous valid characters0?; 0200 1 ch_valid = 2, ! Minimum valid character type 8; 0201 1 ch_max = 15; ! Maximum character type ; 0202 1 ; 0203 1 !1D; 0204 1 ! These are from FSS$BT in RMSMAC.MLB. They are defined!; 0205 1 ! here for convience.1 ; 0206 1 !t; 0207 1 LITERAL ; 0208 1 FS$VER = %o'1',D; 0209 1 FS$TYP = %o'2',d; 0210 1 FS$NAM = %o'4',8 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 7dH;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (4) ; 0211 1 FS$WVE = %o'10', ; 0212 1 FS$WTY = %o'20', ; 0213 1 FS$WNA = %o'40',!; 0214 1 FS$DIR = %o'100',.!; 0215 1 FS$DEV = %o'200', !; 0216 1 FS$NOD = %o'400', "; 0217 1 FS$WDI = %o'1000',"; 0218 1 FS$QUO = %o'2000',"; 0219 1 FS$WCH = %o'4000',#; 0220 1 FS$NDF = %o'10000';a ; 0221 1 ; 0222 1 LITERAL:C; 0223 1 logical_type_none = 0, ! Values for parse_block_f8A; 0224 1 logical_type_filename = 1, ! field logical_type (; 0225 1 logical_type_device = 2,&; 0226 1 logical_type_node = 3; ; 0227 1 ; 0228 1 FIELD0; 0229 1 parse_block_f ='; 0230 1 SET?; 0231 1 fss_status = [0, 0, 16, 0], ! Status of operation 1; 0232 1 flags = [1, 0, 16, 0], ! Flag wordWF; 0233 1 node_len = [2, 0, 16, 0], ! Length of node specificationH; 0234 1 node_addr = [3, 0, 16, 0], ! Address of node specificationJ; 0235 1 device_len = [4, 0, 16, 0], ! Length of device specificationL; 0236 1 device_addr = [5, 0, 16, 0], ! Address of device specificationO; 0237 1 directory_len = [6, 0, 16, 0], ! Length of filename specification Q; 0238 1 directory_addr = [7, 0, 16, 0], ! Address of filename specification N; 0239 1 filename_len = [8, 0, 16, 0], ! Length of filename specificationP; 0240 1 filename_addr = [9, 0, 16, 0], ! Address of filename specificationG; 0241 1 type_len = [10, 0, 16, 0], ! Length of type specification I; 0242 1 type_addr = [11, 0, 16, 0], ! Address of type specification M; 0243 1 version_len = [12, 0, 16, 0], ! Length of version specification O; 0244 1 version_addr = [13, 0, 16, 0], ! Address of version specification,H; 0245 1 trailing_len = [14, 0, 16, 0], ! Length of trailing stringJ; 0246 1 trailing_addr = [15, 0, 16, 0], ! Address of trailing stringK; 0247 1 access_len = [16, 0, 16, 0], ! Length of access specification1M; 0248 1 access_addr = [17, 0, 16, 0], ! Address of access specification,J; 0249 1 logical_type = [18, 0, 8, 0], ! First element which could be; 0250 1 ! a logical ; 0251 1 ! 0 - None ; 0252 1 ! 1 - Filename; 0253 1 ! 2 - Device; 0254 1 ! 3 - Node7; 0255 1 reserved_field = [18, 8, 8, 0] ! Reserved ; 0256 1 ; 0257 1 TES; ; 0258 1 ; 0259 1 FIELD &; 0260 1 logical_descriptor_f =; 0261 1 SETE; 0262 1 length = [0, 0, 16, 0], ! Logical name length in bytesfJ; 0263 1 address_base = [1, 0, 16, 0], ! 32 word block offset of baseV; 0264 1 address_disp_apr6 = [2, 0, 16, 0], ! APR6 displacment of the logical name 2];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 82H;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (4)H; 0265 1 table_number = [3, 0, 8, 0], ! Table number to be searched<; 0266 1 block_type = [3, 8, 8, 0], ! Block type number[; 0267 1 matching_tcb_ucb = [4, 0, 16, 0] ! Matching UCB or TCB depending on table typel; 0268 1 TES; ; 0269 1 ; 0270 1 LITERAL,J; 0271 1 file_spec_size = 255, ! Maximum file speci00a*oommmffDATAfication size E; 0272 1 logical_size = 255, ! Maximum size of one logical H; 0273 1 parse_block_size = 19, ! Parse work area size in words[; 0274 1 logical_descriptor_size = 5, ! Logical name descriptor block size in wordsb<; 0275 1 iteration_max = 10; ! Max iteration count ; 0276 1 ; 0277 1 !0-; 0278 1 ! OWN STORAGE (GLOBAL for DEBUG):l ; 0279 1 !T*; 0280 1 GLOBAL_FOR_DEBUG_OWN_OTHERWISE5; 0281 1 must_have_device, ! Flag for ACHN$eE; 0282 1 cannot_have_node, ! Node is illegal except for RMS <; 0283 1 terminal_logical_flag, ! Flag for terminalF; 0284 1 do_directory_defaulting, ! Directory defaulting flag#; 0285 1 saved_inhibit_mask,iI; 0286 1 init_logical_descriptor : BLOCK [logical_descriptor_size]L; 0287 1 FIELD (logical_descriptor_f), ! Logical name descriptor blockJ; 0288 1 scr_pb : BLOCK[parse_block_size] ! Scratch buffer for fss(; 0289 1 FIELD (parse_block_f), !O; 0290 1 pri_pb : BLOCK [parse_block_size] ! Primary file specification 5; 0291 1 FIELD (parse_block_f), ! parse block2M; 0292 1 merged : REF VECTOR [, BYTE], ! Merged specification buffer O; 0293 1 primary : REF VECTOR [, BYTE], ! Primary specification bufferdd; 0294 1 secondary : VECTOR [file_spec_size, BYTE], ! Work area for secondary input to mergeD; 0295 1 work_1 : VECTOR [file_spec_size, BYTE], ! Work areaC; 0296 1 work_2 : VECTOR [file_spec_size, BYTE]; ! Work areaO ; 0297 1 ; 0298 1 !a"; 0299 1 ! EXTERNAL REFERENCES: ; 0300 1 !l; 0301 1 EXTERNAL2; 0302 1 $SAHDB, ! Saved header mappingM; 0303 1 KISAR5, ! Kernel APR 5 actual data space mapping register,M; 0304 1 KISAR6, ! Kernel APR 6 actual data space mapping registere>; 0305 1 $TONYL, ! Temporary storage for directives:; 0306 1 H_DUIC, ! Default UIC offset in header:; 0307 1 T_UCB, ! TI: UCB address offset in TCB;; 0308 1 T_CTX, ! Task dds context block addressEB; 0309 1 D_UCB, ! Address of the first UCB for this DCB9; 0310 1 D_UCBL, ! Length of UCBs for this DCBA5; 0311 1 D_UNIT, ! Lowest unit on this DCBe5; 0312 1 D_NAM, ! Device name for this DCBa?; 0313 1 U_CTX, ! Terminal dds context block addressr<; 0314 1 U_DCB, ! Address of the DCB for this UCB;; 0315 1 U_CW1, ! UCB first characteristics worda<; 0316 1 DV_REC, ! Record oriented device (U.CW1)=; 0317 1 DV_SDI, ! Single directory device (U.CW1)h7; 0318 1 DV_SQD, ! Sequential device (U.CW1)e h];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 9 H;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (4)3; 0319 1 DV_PSE, ! Pseudo device (U.CW1) ;; 0320 1 $FMSK4, ! 4th feature mask word address 9; 0321 1 F4_DVN; ! Decimal version number flagC ; 0322 1 ; 0323 1 LINKAGEWv; 0324 1 $ACHxx_l = JSR (REGISTER = 0, REGISTER = 1; REGISTER = 2) : CLEARSTACK VALUECBIT PRESERVE (0, 3, 4, 5); 0325 1 NOPRESERVE (1, 2),rt; 0326 1 $BLXIO_l = JSR (REGISTER = 0, REGISTER = 1, REGISTER = 2, REGISTER = 3, REGISTER = 4) : PRESERVE (5)(; 0327 1 NOPRESERVE (0, 1, 2, 3, 4),Y; 0328 1 $MPLUN_l = JSR (REGISTER = 3, REGISTER = 4, REGISTER = 5; REGISTER = 2) :rJ; 0329 1 CLEARSTACK VALUECBIT NOPRESERVE (0, 1, 2, 3) PRESERVE (4, 5),Y; 0330 1 $MPLND_l = JSR (REGISTER = 0, REGISTER = 5; REGISTER = 0, REGISTER = 2) : J; 0331 1 CLEARSTACK VALUECBIT NOPRESERVE (0, 2) PRESERVE (1, 3, 4, 5),a; 0332 1 $RELOC_l = JSR (REGISTER = 0; REGISTER = 1, REGISTER = 2) : PRESERVE (0, 3, 4, 5)R; 0333 1 NOPRESERVE (1, 2),)X; 0334 1 $RELOM_l = JSR (REGISTER = 0) : PRESERVE (3, 4, 5) NOPRESERVE (0, 1, 2),S; 0335 1 $TBSRC_l = JSR (REGISTER = 0; REGISTER = 3) : CLEARSTACK VALUECBIT,St; 00a2onncccc 0336 1 $DCBTA_l = JSR (REGISTER = 0, REGISTER = 3; REGISTER = 3) : PRESERVE (2, 4, 5) NOPRESERVE (0, 1, 3)"; 0337 1 CLEARSTACK VALUECBIT; ; 0338 1 ; 0339 1 EXTERNAL ROUTINEM; 0340 1 $ACHKB : $ACHxx_l, ! Address check byte aligned read/write L; 0341 1 $ACHRO : $ACHxx_l, ! Address check byte aligned read only6; 0342 1 $BLXIO : $BLXIO_l, ! Block transferI; 0343 1 $MPLUN : $MPLUN_l, ! Map logical unit number to device ?; 0344 1 $MPLND : $MPLND_l, ! Follow unit redirectionRD; 0345 1 $RELOC : $RELOC_l, ! Relocate user buffer addressD; 0346 1 $RELOM : $RELOM_l, ! Relocate and map user bufferE; 0347 1 TBSRC_BLI : $TBSRC_l, ! Search logical name tables Q; 0348 1 DCBTA_BLI : $DCBTA_l, ! Binary to octal ASCII routine in DRLOGeH; 0349 1 lun_assign : lun_assign_l; ! Routine to assign the LUN ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 10De;X1.10 File Specification Scan Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (5)r6; 0350 1 %SBTTL 'File Specification Scan Directive' ; 0351 1 W; 0352 1 GLOBAL ROUTINE $LNFSS (dpb_ptr, header_addr, tcb_addr) : $LNxxx_l NOVALUE = ; 0353 1 ; 0354 1 !++! ; 0355 1 !l%; 0356 1 ! FUNCTIONAL DESCRIPTION: ; 0357 1 !lH; 0358 1 ! This routine is called by DRLOG if the FSS subfunction was; 0359 1 ! specified. ; 0360 1 !s ; 0361 1 ! FORMAL PARAMETERS: ; 0362 1 !a; 0363 1 ! dpb_ptr-4; 0364 1 ! Address of the second word of the dpb ; 0365 1 ! ; 0366 1 ! IMPLICIT INPUTS: ; 0367 1 ! ; 0368 1 ! the dpb B; 0369 1 ! The Directive Parameter Block provides all the user*; 0370 1 ! supplied calling parameters ; 0371 1 ! ; 0372 1 ! IMPLICIT OUTPUTS:N ; 0373 1 ! J; 0374 1 ! The directive is performed or an error indicating the reason; 0375 1 ! is returned. ; 0376 1 !; 0377 1 !--M ; 0378 1 ; 0379 2 BEGIN3; 0380 2 ! N; 0381 2 ! The File Specification Scanner DPB has the following format:; 0382 2 ! word contents ; 0383 2 ! ---- --------9/; 0384 2 ! 0 Directive code, DPB length *; 0385 2 ! 1 Subfunction, reserved; 0386 2 ! 2 Reserved39; 0387 2 ! 3 Address of file specification bufferh6; 0388 2 ! 4 Size of file specification buffer+; 0389 2 ! 5 Address of parse block3; 0390 2 ! 6 Size of parse block (in bytes)I; 0391 2 ! L; 0392 2 ! The parse block will zeroed and filled in with descriptorsL; 0393 2 ! for each field present of node, access, device, directory,K; 0394 2 ! filename, type, and version, plus the trailing portion ofnO; 0395 2 ! the string if any. The flags word will be have a bit set forsJ; 0396 2 ! each of the components present in the format for the RMS; 0397 2 ! NAM block.; 0398 2 ! !; 0399 2 ! In more detail.o; 0400 2 ! L; 0401 2 ! NODE: The node includes all nodes if poor man's routing isH; 0402 2 ! is being used. The initial node name is terminatedF; 0403 2 ! by the access control string address, even if there ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 11ee;X1.10 File Specification Scan Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (5)AG; 0404 2 ! is none. (In this case the access control length is ; 0405 2 ! zero.) ; 0406 2 !u,; 0407 2 ! FS$NOD is set if present.; 0408 2 !iN; 0409 2 ! ACCESS The access control string is the entire quoted stringS; 0410 2 ! CONTROL: terminated by double colon. As noted above, the address-?; 0411 2 ! of the access control serves a dual purpose.e; 0412 2 ! P; 0413 2 ! DEVICE: The device is the string terminated by a single colon.; 0414 2 ! ,; 0415 2 ! 00a:oommmffDATA FS$DEV is set if present.; 0416 2 !zO; 0417 2 ! DIRECTORY:The directory is the string bounded by either [] or8B; 0418 2 ! <> and includes a rather loosely checked set ofJ; 0419 2 ! characters valid in a directory specification includingL; 0420 2 ! wildcards, hierarchies, etc. The syntax of the directoryE; 0421 2 ! must be checked for validity in the context of the :; 0422 2 ! operation, for example, network access.; 0423 2 !5F; 0424 2 ! FS$DIR is set if present. In addition, if wildcardsK; 0425 2 ! are found, FS$WDI is also set. (Wildcards are "%", "*", ; 0426 2 ! and "...".e; 0427 2 !eQ; 0428 2 ! FILENAME: The filename is the string terminated by ".", ";", or 5; 0429 2 ! the end of the file specification.a; 0430 2 !G; 0431 2 ! FS$NAM is set if present. In addition, if wildcards I; 0432 2 ! are found, FS$WNA is also set. (Wildcards are "%" and5; 0433 2 ! "*".); 0434 2 !.>; 0435 2 ! If FS$QUO is set, the file specification isH; 0436 2 ! a quoted string. This is either a "foreign" filespecE; 0437 2 ! if being passed to another system (eg. via DAP) oriD; 0438 2 ! an ANSI filespec. The the case of the ANSI file,H; 0439 2 ! a version is allowed, but no type field. In the caseH; 0440 2 ! of a network operation, it's ambiguous, but a versionE; 0441 2 ! will be allowed but not defaulted. (Actually this4E; 0442 2 ! doesn't relate to FSS but this seems to be as goodo1; 0443 2 ! a place to mention it as any.)e; 0444 2 !iL; 0445 2 ! TYPE: The type is the string terminated by a "." or ";" orG; 0446 2 ! the end of the file specification. A leading "." is 1; 0447 2 ! always included in the string.f; 0448 2 !G; 0449 2 ! FS$TYP is set if present. In addition, if wildcardsI; 0450 2 ! are found, FS$WTY is also set. (Wildcards are "%" and ; 0451 2 ! "*".); 0452 2 ! F; 0453 2 ! If the filename is a quoted string, then this field ; 0454 2 ! must be null.; 0455 2 !eN; 0456 2 ! VERSION: The version is the field including a leading "." orG; 0457 2 ! ";" terminated by the end of the string. The stringd ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 12 e;X1.10 File Specification Scan Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (5) G; 0458 2 ! is limited to an optional leading "-" and the digitsd3; 0459 2 ! zero to nine, or a "*" wildcard.n; 0460 2 ! H; 0461 2 ! FS$VER is set if present. In addition, if a wildcard0; 0462 2 ! is found, FS$WVE is also set.; 0463 2 !gS; 0464 2 ! TRAILING: The unparsed portion of the initial string is that partiD; 0465 2 ! of the input that was successfully and completelyD; 0466 2 ! parsed. If an error is detected in the directoryG; 0467 2 ! specification, for example, the trailing string will A; 0468 2 ! include the erroneous directory specification. ; 0469 2 ! E; 0470 2 ! This should allow the used of FSS$ in command line K; 0471 2 ! parsing. Any character not part of a file specificationIE; 0472 2 ! terminates the scan and results in all information 2; 0473 2 ! obtained so far to be returned.; 0474 2 ! E; 0475 2 ! The field trailing_addr should always be filled in C; 0476 2 ! even when the length is zero. This is different B; 0477 2 ! from the norm, but is an exception for much the2; 0478 2 ! same reason as for access_addr.; 0479 2 !aP; 0480 2 ! The parse block can be truncated by the user if not all fieldsS; 0481 2 ! are desired, although the organization isn't well setup for that.3Q; 0482 2 ! The directive can also be enhanced by addi00aBonnccccng fields on the end.T@; 0483 2 ! Does this code return an error...it shouldn't.; 0484 2 !lQ; 0485 2 ! As coded, the parse block is zeroed and then filled in with theeO; 0486 2 ! data from the specified string. This block is then relocated B; 0487 2 ! to the user string virtual address and returned.; 0488 2 !l ; 0489 2 ; 0490 2 MAPa@; 0491 2 dpb_ptr : REF VECTOR; ! Treat the DPB as a vector ; 0492 2 ; 0493 2 LOCALc; 0494 2 status,'; 0495 2 b_len, ! Buffer lengtho); 0496 2 b_addr, ! Buffer address4+; 0497 2 b_mapping, ! Buffer mappinga3; 0498 2 p : REF VECTOR; ! Temporary pointer ; 0499 2 =; 0500 2 b_addr = .dpb_ptr [2]; ! Get buffer address;; 0501 2 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP);r;; 0502 2 b_len = .dpb_ptr [3]; ! Get buffer lengthU; 0503 2 IF .b_len EQLU 0 OR .b_len GTRU 1024*8 - 64 THEN ERROR_EXIT (IE_IBS);3 ; 0504 2 ; 0505 2 !uQ; 0506 2 ! Address check, relocate, and map the user buffer. No operationrO; 0507 2 ! will unmap the user buffer for the duration. The user string H; 0508 2 ! is then parsed and the output parse block is returned.; 0509 2 !d]; 0510 2 IF $ACHRO (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read accessd ; 0511 2  e];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 13Ie;X1.10 File Specification Scan Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (5) 9; 0512 2 p = $RELOM (.b_addr); ! Map user buffer ?; 0513 2 fss (.p, .b_len); ! Parse file specificationtb; 0514 2 convert_parse (scr_pb, .p, .b_addr); ! Convert parse block addresses to user mode ; 0515 2 =; 0516 2 b_addr = .dpb_ptr [4]; ! Get buffer address ;; 0517 2 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP);1;; 0518 2 b_len = .dpb_ptr [5]; ! Get buffer lengthi:; 0519 2 IF .b_len EQLU 0 THEN ERROR_EXIT (IE_IBS); ; 0520 2 ; 0521 2 !2L; 0522 2 ! Address check and relocate the user buffer. Then copy the$; 0523 2 ! parse block to it.; 0524 2 !oc; 0525 2 IF $ACHKB (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read/write access5 ; 0526 2 J; 0527 2 $RELOC (.b_addr; b_mapping, b_addr); ! Relocte user bufferk; 0528 2 $BLXIO (MINU (parse_block_size*2, .b_len), .kisar5, scr_pb, .b_mapping, .b_addr); ! Move itF; 0529 2 RETURN; 0530 1 END; .NLIST .LIST BIN,LOC .LIST .IFTF ;L$$GCL% .TITLE DRPFN Logical Name Directivese .IDENT /X1.10/5 .IFT ;L$$GCL  .PSECT $OWN$, D MUST.HAVE.DEVICE:  .BLKW 1CANNOT.HAVE.NODE:  .BLKW 1TERMINAL.LOGICAL.FLAG: .BLKW 1DO.DIRECTORY.DEFAULTING: .BLKW 1SAVED.INHIBIT.MASK:d .BLKW 1INIT.LOGICAL.DESCRIPTOR: .BLKW 5SCR.PB: .BLKW 23PRI.PB: .BLKW 23MERGED: .BLKW 1lPRIMARY:.BLKW 1_ SECONDARY: .BLKB 377 .EVENWORK.1: .BLKB 377  .EVENWORK.2: .BLKB 377N& .GLOBL $SAHDB, KISAR5, KISAR6, $TONYL+ .GLOBL H.DUIC, T.UCB, T.CTX, D.UCB, D.UCBLr i];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 14We;X1.10 File Specification Scan Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (5)* .GLOBL D.UNIT, D.NAM, U.CTX, U.DCB, U.CW1& .GLOBL DV.REC, DV.SDI, DV.SQD, DV.PSE& .GLOBL $FMSK4, F4.DVN, $ACHKB, $ACHRO& .GLOBL $BLXIO, $MPLUN, $MPLND, $RELOC0 .GLOBL $RELOM, TBSRC.BLI, DCBTA.BLI, LUN.ASSIGN0 .SBTTL $LNFSS File Specification Scan Directive .PSECT $CODE$, RO  .NLISTU .ENABL LSBP .LIST$LNFSS::TST -(SP) ; 03526- MOV 4(R3),-(SP) ; *(DPB.PTR),B.ADDR 0500W BNE 1$ ; 0501a TRAP 236i/1$: MOV 6(R3),2(SP) ; *(DPB.PTR),B.LEN 0502D BEQ 2$ ; 0503. CMP 2(SP),#17700 ; B.LEN,*C BLOS 3$ 2$: TRAP 247%3$: MOV (SP),R0 ; B.ADDR,* 05104 MOV 2(SP),R1 ; B.LEN,*. JSR PC,$ACHRO BHIS 4$ TRAP 00aJoommmffDATA236%4$: MOV (SP),R0 ; B.ADDR,* 0512U JSR PC,$RELOM MOV R0,R1 ; *,Pc MOV R1,R4 ; P,* 0513 MOV 2(SP),R5 ; B.LEN,*U JSR PC,FSSP MOV #SCR.PB,-(SP) ; 0514  MOV R1,-(SP) ; P,*S MOV 4(SP),-(SP) ; B.ADDR,*W JSR PC,CONVERT.PARSEa. MOV 10(R3),6(SP) ; *(DPB.PTR),B.ADDR 0516 BNE 5$ ; 0517 TRAP 236015$: MOV 12(R3),10(SP) ; *(DPB.PTR),B.LEN 0518R BNE 6$ ; 0519 TRAP 247,%6$: MOV 6(SP),R0 ; B.ADDR,* 0525 MOV 10(SP),R1 ; B.LEN,* JSR PC,$ACHKB BHIS 7$ TRAP 236,%7$: MOV 6(SP),R0 ; B.ADDR,* 0527  JSR PC,$RELOC MOV R1,R3 MOV R2,6(SP)V" MOV 10(SP),R0 ; B.LEN,* 0528 CMP R0,#46B S];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 15ae;X1.10 File Specification Scan Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (5)( BLOS 8$ MOV #46,R0 8$: MOV KISAR5,R1; MOV #SCR.PB,R2  MOV 6(SP),R4 ; B.ADDR,* JSR PC,$BLXIO ADD #12,SP ; 0352* RTS PC,7; Routine Size: 80 words, Routine Base: $CODE$ + 0000 .; Maximum stack depth per invocation: 7 words .NLISTV .DSABL LSB; .NLIST BIN,LOC .LIST S];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 16a];X1.10 Assign Channel Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (6)5-; 0531 1 %SBTTL 'Assign Channel Directive'5 ; 0532 1 W; 0533 1 GLOBAL ROUTINE $LNCHN (dpb_ptr, header_addr, tcb_addr) : $LNxxx_l NOVALUE =, ; 0534 1 ; 0535 1 !++R ; 0536 1 !C%; 0537 1 ! FUNCTIONAL DESCRIPTION: ; 0538 1 !wH; 0539 1 ! This routine is called by DRLOG if the CHN subfunction was; 0540 1 ! specified. ; 0541 1 !8C; 0542 1 ! Assign channel does all of the processing of the filerF; 0543 1 ! specification that is required to find the actual device;; 0544 1 ! name and then assigns the LUN to that device. ; 0545 1 !B ; 0546 1 ! FORMAL PARAMETERS: ; 0547 1 !); 0548 1 ! dpb_ptr4; 0549 1 ! Address of the second word of the dpb ; 0550 1 !N; 0551 1 ! IMPLICIT INPUTS: ; 0552 1 ! ; 0553 1 ! the dpbbB; 0554 1 ! The Directive Parameter Block provides all the user*; 0555 1 ! supplied calling parameters ; 0556 1 !e0; 0557 1 ! Assign Channel (ACHN$) DPB Format: ; 0558 1 !t/; 0559 1 ! WD. 00 -- DIC(207.),DPB Size (5.)t5; 0560 1 ! WD. 01 -- Subfunction code (6),Reserved '; 0561 1 ! WD. 02 -- LUN, Table mask 5; 0562 1 ! WD. 03 -- Address of file specification 2; 0563 1 ! WD. 04 -- Size of file specification ; 0564 1 !I; 0565 1 ! IMPLICIT OUTPUTS: ; 0566 1 ! J; 0567 1 ! The directive is performed or an error indicating the reason; 0568 1 ! is returned. ; 0569 1 ! ; 0570 1 !-- ; 0571 1 ; 0572 2 BEGIN; 0573 2 ! B; 0574 2 ! This directive uses the same code as the RMS and@; 0575 2 ! FCS format parse routines. It only passes the!; 0576 2 ! primary string.d; 0577 2 !f ; 0578 2 ; 0579 2 MAPi@; 0580 2 dpb_ptr : REF VECTOR; ! Treat the DPB as a vector ; 0581 2 ; 0582 2 OWN B; 0583 2 temp_dpb : VECTOR [12]; ! Temp dpb for common parse ; 0584 2  t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 17 ];X1.10 Assign Channel Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (6)o; 0585 2 LOCALo'; 0586 2 temp_dpb_ptr : REF VECTOR; ; 0587 2 ; 0588 2 ! P; 0589 2 ! Define the routine to convert the users default string and putT; 0590 2 ! it into the secondary string. For ACHN there isn't one so we just!; 0591 2 ! put a blank in. ; 0592 2 !PN; 0593 2 ROUTINE achn_convert (b_addr, b_len; p) : sec_spec_convert_l =; 0594 3 BEGINi3; 0595 3 secondary [0] = %C' '; ! No filespecC); 0596 3 RETURN valid; ! Return ok ; 0597 2 END; .NLISTp .LIST BIN,LOC .00aRonnccccLIST .PSECT $OWN$, D  .EVEN TEMP.DPB: .BLKW 14t- .SBTTL ACHN.CONVERT Assign Channel Directivep .PSECT $CODE$, RO  .NLIST .ENABL LSBi .LIST ACHN.CONVERT:' MOVB #40,SECONDARY ; 0595 MOV #1,R0 ; 0594 RTS PC ; 0593 6; Routine Size: 6 words, Routine Base: $CODE$ + 0240.; Maximum stack depth per invocation: 0 words .NLISTy .DSABL LSB  .NLIST BIN,LOC .LIST ; 0598 2 ; 0599 2 ! ); 0600 2 ! Initialize the fake dpbC; 0601 2 !C@; 0602 2 temp_dpb_ptr = temp_dpb [0]; ! Init the pointer ; 0603 2 M; 0604 2 temp_dpb_ptr [0] = .dpb_ptr [0]; ! Modifier for common parseNH; 0605 2 temp_dpb_ptr = temp_dpb_ptr [1]; ! Advance the pointers.; 0606 2 dpb_ptr = dpb_ptr [1]; ! ... ; 0607 2 Q; 0608 2 temp_dpb_ptr [0] = .dpb_ptr [0]; ! LUN and mask for common parse  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 18t];X1.10 Assign Channel Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (6)tH; 0609 2 temp_dpb_ptr = temp_dpb_ptr [1]; ! Advance the pointers.; 0610 2 dpb_ptr = dpb_ptr [1]; ! ... ; 0611 2 V; 0612 2 temp_dpb_ptr [0] = .dpb_ptr [0]; ! File spec address for common parseH; 0613 2 temp_dpb_ptr = temp_dpb_ptr [1]; ! Advance the pointers.; 0614 2 dpb_ptr = dpb_ptr [1]; ! ... ; 0615 2 U; 0616 2 temp_dpb_ptr [0] = .dpb_ptr [0]; ! File spec length for common parseeH; 0617 2 temp_dpb_ptr = temp_dpb_ptr [1]; ! Advance the pointers.; 0618 2 dpb_ptr = dpb_ptr [1]; ! ... ; 0619 2 ; 0620 2 ! ); 0621 2 ! Zero the unused fields. ; 0622 2 !e%; 0623 2 DECR i FROM 8 TO 1 DOs; 0624 3 BEGIN5; 0625 3 temp_dpb_ptr [0] = 0; ! Zero the field1C; 0626 3 temp_dpb_ptr = temp_dpb_ptr [1]; ! Advance the pointer!; 0627 2 END; ; 0628 2 ; 0629 2 !=; 0630 2 ! Do the parse; 0631 2 !eS; 0632 2 do_directory_defaulting = false; ! No directory defaulting for ACHN H; 0633 2 must_have_device = true; ! Must have a device for ACHN$I; 0634 2 cannot_have_node = true; ! Node specification is illegal O; 0635 2 common_parse (temp_dpb, .header_addr, .tcb_addr, achn_convert); ; 0636 2 RETURN;6; 0637 1 END; .NLISTp .LIST BIN,LOC .LIST' .SBTTL $LNCHN Assign Channel Directive  .NLIST .ENABL LSB6 .LIST2$LNCHN::MOV #TEMP.DPB,R0 ; *,TEMP.DPB.PTR 06020 MOV (R3)+,(R0)+ ; DPB.PTR,TEMP.DPB.PTR 06040 MOV (R3)+,(R0)+ ; DPB.PTR,TEMP.DPB.PTR 06080 MOV (R3)+,(R0)+ ; DPB.PTR,TEMP.DPB.PTR 06120 MOV (R3)+,(R0)+ ; DPB.PTR,TEMP.DPB.PTR 0616 MOV #10,R1 ; *,I 0623 '1$: CLR (R0)+ ; TEMP.DPB.PTR 0625r SOB R1,1$ ; I,* 0623( CLR DO.DIRECTORY.DEFAULTING ; 0632$ MOV #1,MUST.HAVE.DEVICE ; 0633$ MOV #1,CANNOT.HAVE.NODE ; 0634 MOV #TEMP.DPB,R3 ; 0635 MOV #ACHN.CONVERT,R0M JSR PC,COMMON.PARSE RTS PC ; 0533+7; Routine Size: 25 words, Routine Base: $CODE$ + 0254; B];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 19;];X1.10 Assign Channel Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (6) -; Maximum stack depth per invocation: 1 wordE .NLISTA .DSABL LSB  .NLIST BIN,LOCT .LIST ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 20E_;X1.10 RMS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (7) /; 0638 1 %SBTTL 'RMS Format Parse Directive' ; 0639 1 W; 0640 1 GLOBAL ROUTINE $LNRMS (dpb_ptr, header_addr, tcb_addr) : $LNxxx_l NOVALUE =u ; 0641 1 ; 0642 1 !++P ; 0643 1 !2%; 0644 1 ! FUNCTIONAL DESCRIPTION:o ; 0645 1 !EH; 0646 1 ! This routine is called by DRLOG if the RMS subfunction was; 0647 1 ! specified. ; 0648 1 ! ; 0649 1 ! FORMAL PARAMETERS: ; 065000aZoommmffDATA 1 !M; 0651 1 ! dpb_ptre4; 0652 1 ! Address of the second word of the dpb ; 0653 1 ! ; 0654 1 ! IMPLICIT INPUTS: ; 0655 1 ! ; 0656 1 ! the dpb B; 0657 1 ! The Directive Parameter Block provides all the user*; 0658 1 ! supplied calling parameters ; 0659 1 ! ; 0660 1 ! IMPLICIT OUTPUTS:N ; 0661 1 ! J; 0662 1 ! The directive is performed or an error indicating the reason; 0663 1 ! is returned. ; 0664 1 !; 0665 1 !--M ; 0666 1 ; 0667 2 BEGIN6; 0668 2 ! D; 0669 2 ! The RMS format parse DPB has the following format:; 0670 2 ! word contents ; 0671 2 ! ---- -------- /; 0672 2 ! 0 Directive code, DPB lengtho*; 0673 2 ! 1 Subfunction, Modifier$; 0674 2 ! 2 LUN, Table maskE; 0675 2 ! 3 Address of the primary file specification buffertK; 0676 2 ! 4 Size of the primary file specification buffer in bytes.G; 0677 2 ! 5 Address of the resultant file specification bufferM; 0678 2 ! 6 Size of the resultant file specification buffer in bytesgK; 0679 2 ! 7 Address of a word to receive the resultant string size/; 0680 2 ! 8 Address of the parse block5; 0681 2 ! 9 Size of the parse block in bytes E; 0682 2 ! 10 Address of the default file specification bufferiK; 0683 2 ! 11 Size of the default file specification buffer in bytesf; 0684 2 !yS; 0685 2 ! The basic operation of the FCS and RMS format parse6S; 0686 2 ! subfunctions is the same. The only difference consists of S; 0687 2 ! differences in the formats of the input and output parameters.8S; 0688 2 ! Both formats exists in order to minimize the amount of code thatG; 0689 2 ! must be added to the RMS and FCS access methods code. ; 0690 2 !S3; 0691 2 ! The follow operations occur:f ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 21 _;X1.10 RMS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (7) ; 0692 2 !n6; 0693 2 ! 1. First process the input strings:; 0694 2 ! S; 0695 2 ! 1. The primary string is copied, compressed, and upcased A; 0696 2 ! from the users buffer to a work buffer. ; 0697 2 ! @; 0698 2 ! 2. The resulting string is parsed. (FSS); 0699 2 !-;; 0700 2 ! 3. The resulting string is Expanded..; 0701 2 !eS; 0702 2 ! 4. The resulting value for logical type, (none, filename, 2; 0703 2 ! device, node), is saved.; 0704 2 !6S; 0705 2 ! 5. The secondary string is copied, compressed, and upcasedaS; 0706 2 ! from the users buffer to a work buffer. This is somewhat L; 0707 2 ! more involved for the FCS format of the directive.; 0708 2 ! @; 0709 2 ! 6. The resulting string is parsed. (FSS); 0710 2 !Q; 0711 2 ! 7. The processed primary and secondary strings are merged. ; 0712 2 ! V; 0713 2 ! 8. If the resulting value for logical type is greater than theS; 0714 2 ! saved value for the processed primary string then expande,; 0715 2 ! the merged string.; 0716 2 ! S; 0717 2 ! 9. If a node specification is present then we are all done. 3; 0718 2 ! Return the output values.d; 0719 2 ! ; 0720 2 ! 3; 0721 2 ! 2. Now do the device defaulting:t; 0722 2 !K; 0723 2 ! 3. The previous merged string is now the primary string.c; 0724 2 !tS; 0725 2 ! 4. Save the flags word from the parse block. The flags returnednS; 0726 2 ! indicate what was supplied from the input strings, not what 9; 0727 2 ! is supplied by the system defaults.a; 0728 2 ! -; 0729 2 ! 5. If the00abonncccc LUN is assigned:d; 0730 2 ! S; 0731 2 ! 1. Build a secondary string containing the device 5; 0732 2 ! specification from the LUN.i; 0733 2 !rS; 0734 2 ! 2. Also indicate that the LUN must not be assigned at therS; 0735 2 ! end of the directive. Reassigning the LUN will result ino1; 0736 2 ! an IO.KIL being issued. ; 0737 2 !eS; 0738 2 ! 3. Merge the primary and the secondary strings. Do notdS; 0739 2 ! expand the merged string. We know that we have a reali&; 0740 2 ! device name.; 0741 2 !o; 0742 2 ! 1; 0743 2 ! 6. If the LUN is not assigned:d; 0744 2 !m;; 0745 2 ! 1. Put SY: in the secondary string.  t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 22s_;X1.10 RMS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (7)n; 0746 2 !7B; 0747 2 ! 2. Merge the primary and secondary strings.; 0748 2 !03; 0749 2 ! 3. Expand the merged string. ; 0750 2 ! ; 0751 2 ! S; 0752 2 ! 7. If a node specification is present then we are all done.i/; 0753 2 ! Return the output values.e; 0754 2 !uK; 0755 2 ! 8. The previous merged string is now the primary string.r; 0756 2 !uS; 0757 2 ! 9. If there is a non null, ([], <>), directory specification in7S; 0758 2 ! the primary string then go on to assign the LUN if7"; 0759 2 ! appropriate.; 0760 2 !0,; 0761 2 ! 10. Directory defaulting:; 0762 2 !pT; 0763 2 ! 1. If there is a non null default directory string then putP; 0764 2 ! the default directory string in the secondary string.; 0765 2 !rT; 0766 2 ! 2. Otherwise build a directory specification in theA; 0767 2 ! secondary string from the default UIC. ; 0768 2 !oT; 0769 2 ! 3. Merge the primary and secondary strings and make the5; 0770 2 ! result the primary string. ; 0771 2 ! ; 0772 2 ! T; 0773 2 ! 11. If there is a LUN assigment and if that LUN assigment wasT; 0774 2 ! used as the default device then do not assign the LUN.T; 0775 2 ! Otherwise use the device portion of the primary string to&; 0776 2 ! assign the LUN.; 0777 2 !7T; 0778 2 ! 12. Return the primary string to the expanded string buffer.T; 0779 2 ! Return the parse block for the primary string with the saved9; 0780 2 ! flags to the users parse block.a; 0781 2 !i ; 0782 2 ! 13. All done.; 0783 2 !u ; 0784 2 ; 0785 2 !eP; 0786 2 ! Define the routine to convert the users default string and putS; 0787 2 ! it into the secondary string. For RMS we just copy, compress and ; 0788 2 ! upcase it.; 0789 2 !tT; 0790 2 ROUTINE rms_convert (b_addr, b_len; p) : sec_spec_convert_l NOVALUE=; 0791 3 BEGINnD; 0792 3 IF .b_len GTRU file_spec_size THEN ERROR_EXIT (IE_IBS);9; 0793 3 ch$copy (.b_len, .b_addr, secondary [0]; p);.; 0794 2 END; .NLIST  .LIST BIN,LOC .LIST. .SBTTL RMS.CONVERT RMS Format Parse Directive s];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 23p_;X1.10 RMS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (7)o .NLISTd .ENABL LSB: .LIST RMS.CONVERT: JSR R1,$SAVE2 ; 0790n MOV R3,R2 ; *,B.ADDR! CMP R4,#377 ; B.LEN,* 0792( BLOS 1$ TRAP 247 "1$: MOV R4,R1 ; B.LEN,* 0793 MOV #SECONDARY,R3 JSR PC,CH$COPYL RTS PC ; 0790.7; Routine Size: 13 words, Routine Base: $CODE$ + 0336.; Maximum stack depth per invo00ajoommmffDATAcation: 5 words .NLISTA .DSABL LSB  .NLIST BIN,LOC  .LIST ; 0795 2 ; 0796 2 !-; 0797 2 ! Do the parse; 0798 2 ! Q; 0799 2 do_directory_defaulting = true; ! Do directory defaulting for RMSQ; 0800 2 must_have_device = false; ! Don't need explicit device for $PRMSF; 0801 2 cannot_have_node = false; ! RMS likes nodes just fineN; 0802 2 common_parse (.dpb_ptr, .header_addr, .tcb_addr, rms_convert);; 0803 1 END; .NLIST  .LIST BIN,LOC .LIST) .SBTTL $LNRMS RMS Format Parse Directive. .NLIST .ENABL LSB .LIST1$LNRMS::MOV #1,DO.DIRECTORY.DEFAULTING ; 07998! CLR MUST.HAVE.DEVICE ; 0800c! CLR CANNOT.HAVE.NODE ; 0801o! MOV #RMS.CONVERT,R0 ; 0802  JSR PC,COMMON.PARSE RTS PC ; 0640x7; Routine Size: 12 words, Routine Base: $CODE$ + 0370=-; Maximum stack depth per invocation: 1 word  .NLISTm .DSABL LSBb .NLIST BIN,LOCr .LIST s];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 24s_;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (8)/; 0804 1 %SBTTL 'FCS Format Parse Directive'E ; 0805 1 W; 0806 1 GLOBAL ROUTINE $LNFCS (dpb_ptr, header_addr, tcb_addr) : $LNxxx_l NOVALUE = ; 0807 1 ; 0808 1 !++i ; 0809 1 !$%; 0810 1 ! FUNCTIONAL DESCRIPTION:o ; 0811 1 ! H; 0812 1 ! This routine is called by DRLOG if the FCS subfunction was; 0813 1 ! specified. ; 0814 1 ! ; 0815 1 ! FORMAL PARAMETERS: ; 0816 1 !C; 0817 1 ! dpb_ptre4; 0818 1 ! Address of the second word of the dpb ; 0819 1 ! ; 0820 1 ! IMPLICIT INPUTS: ; 0821 1 ! ; 0822 1 ! the dpb B; 0823 1 ! The Directive Parameter Block provides all the user*; 0824 1 ! supplied calling parameters ; 0825 1 ! ; 0826 1 ! IMPLICIT OUTPUTS:N ; 0827 1 ! J; 0828 1 ! The directive is performed or an error indicating the reason; 0829 1 ! is returned. ; 0830 1 !; 0831 1 !--M ; 0832 1 ; 0833 2 BEGIN8; 0834 2 ! D; 0835 2 ! The FCS format parse DPB has the following format:; 0836 2 ! word contents ; 0837 2 ! ---- -------- /; 0838 2 ! 0 Directive code, DPB lengtho*; 0839 2 ! 1 Subfunction, Modifier$; 0840 2 ! 2 LUN, Table maskE; 0841 2 ! 3 Address of the primary file specification buffertK; 0842 2 ! 4 Size of the primary file specification buffer in bytes.G; 0843 2 ! 5 Address of the resultant file specification bufferM; 0844 2 ! 6 Size of the resultant file specification buffer in bytesgK; 0845 2 ! 7 Address of a word to receive the resultant string size/; 0846 2 ! 8 Address of the parse block5; 0847 2 ! 9 Size of the parse block in bytes 6; 0848 2 ! 10 Address of the default name block3; 0849 2 ! 11 Size of the default name block ; 0850 2 !eS; 0851 2 ! The basic operation of the FCS and RMS format parseuS; 0852 2 ! subfunctions is the same. The only difference consists ofcS; 0853 2 ! differences in the formats of the input and output parameters.uS; 0854 2 ! Both formats exists in order to minimize the amount of code that G; 0855 2 ! must be added to the RMS and FCS access methods code.h; 0856 2 !k/; 0857 2 ! See $LNRMS for a discription.l ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 25m_;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (8); 0858 2 !f n];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 26s_;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (9)F; 0859 2 !eP; 0860 2 ! Define the routine to convert the users default string and put/; 0861 2 ! it into the secondary string.1; 086200aronncccc 2 !4U; 0863 2 ROUTINE fcs_convert (b_addr, b_len; p) : sec_spec_convert_l NOVALUE =U; 0864 3 BEGIN2; 0865 3 MACRO ; 0866 3 ; 0867 3 !L; 0868 3 ! Insert a character into a string. Increment the pointer.; 0869 3 !$; M 0870 3 ch$insert (value) =; M 0871 3 BEGINN; M 0872 3 p [0] = value;; M 0873 3 p = p [1];; M 0874 3 ENDt; 0875 3 %; ; 0876 3 ; 0877 3 MAP); 0878 3 p : REF VECTOR [ ,BYTE]; ; 0879 3 ; 0880 3 BIND-; 0881 3 name_block = .b_addr : NAM$;e ; 0882 3 ; 0883 3 !/; 0884 3 ! It should be the full name block ; 0885 3 !@; 0886 3 IF .b_len NEQU nam$size*2 THEN ERROR_EXIT (IE_IBS);3; 0887 3 p = secondary [0]; ! Init the pointer ; 0888 3 ; 0889 3 !D; 0890 3 ! Move the device name and unit number into the string.; 0891 3 !+; 0892 3 IF .name_block [N_DVNM] NEQU 0 ; 0893 3 THEN ; 0894 4 BEGIN ; 0895 4 ; 0896 4 !; 0897 4 ! Do the name; 0898 4 !N; 0899 4 ch$insert (.(name_block [N_DVNM])<0,8>); ! Get the first charO; 0900 4 ch$insert (.(name_block [N_DVNM])<8,8>); ! Get the second charI ; 0901 4 ; 0902 4 !6; 0903 4 ! Do the unit number zero suppressed.; 0904 4 !O; 0905 4 DCBTA_BLI (.name_block [N_UNIT], .p; p); ! Get the unit number ; 0906 4 ; 0907 4 !(; 0908 4 ! Insert the trailing :; 0909 4 !#; 0910 4 ch$insert (%C':'); ; 0911 3 END; ; 0912 3  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 27(_;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (9) ; 0913 3 !.; 0914 3 ! Fill in the file name and type.; 0915 3 !); 0916 3 ! Check for ANSII format FNB ; 0917 3 !%; 0918 3 IF .name_block [NB__ANS]; 0919 3 THENI; 0920 4 BEGIN; 0921 4 LOCALG; 0922 4 file_p : REF VECTOR [,BYTE]; ! Pointer to ANSII file specP ; 0923 4 ; 0924 4 !+; 0925 4 ! Process ANSII format FNB ; 0926 4 !); 0927 4 ! Move the file name in.:; 0928 4 !9; 0929 4 ch$insert (%C'"'); ! The opening quoteF ; 0930 4 ; 0931 4 !/; 0932 4 ! Get the first 12 characters.a; 0933 4 !B; 0934 4 file_p = .name_block [N_ANM1]; ! Init the pointer'; 0935 4 DECR i FROM 0 TO 11 DOL$; 0936 4 IF .file_p [.i] NEQU 0; 0937 4 THEN?; 0938 5 ch$insert (.file_p [.i]) ! Move the character ; 0939 4 ELSE; 0940 4 EXITLOOP;!; 0941 4 !-; 0942 4 ! Get the next 6 characters. ; 0943 4 !B; 0944 4 file_p = .name_block [N_ANM2]; ! Init the pointer&; 0945 4 DECR i FROM 0 TO 5 DO$; 0946 4 IF .file_p [.i] NEQU 0; 0947 4 THEN?; 0948 5 ch$insert (.file_p [.i]) ! Move the character ; 0949 4 ELSE; 0950 4 EXITLOOP; :; 0951 4 ch$insert (%C'"'); ! The trailing quote; 0952 4 END; 0953 3 ELSE9; 0954 4 BEGIN; 0955 4 !/; 0956 4 ! Process non ANSII format FNB ; 0957 4 !O; 0958 4 ! Convert the filename from RAD50 and move it into the string.r; 0959 4 !Y; 0960 5 IF (.name_block [N_FNAM] NEQU 0) AND (.(name_block [N_FNAM] + 2) NEQU 0) ; 0961 4 THENp=; 0962 4 RAD50_to_ASCII (9, .p, name_block [N_FNAM]; p); ; 0963 4 /; 0964 4 IF .name_block [N_FTYP] NEQU 0i; 0965 4 THEN ; 0966 5 BEGIN  S];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 28 _;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (9)iE; 0967 5 ch$insert (%C'.'); ! Insert the . between name and type0; 0968 5 !cL; 0969 5 ! Convert the filename from RAD50 and move it into the strin00azoommmffDATAg.; 0970 5 !c=; 0971 5 RAD50_to_ASCII (3, .p, name_block [N_FTYP]; p); ; 0972 4 END;; 0973 3 END; ; 0974 3 ; 0975 3 !*; 0976 3 ! Fill in the version number.; 0977 3 !+; 0978 3 IF .name_block [N_FVER] NEQU 0m; 0979 3 THEN ; 0980 4 BEGIN; 0981 4 LOCAL5; 0982 4 t : VECTOR [2], ! Temporary for divider-; 0983 4 temp_digits : VECTOR [6, BYTE],c1; 0984 4 temp_string_p : REF VECTOR [,BYTE],n; 0985 4 base,r; 0986 4 char;c ; 0987 4 <; 0988 4 ch$insert (%C';'); ! Insert the ; to start; 0989 4 !J; 0990 4 ! Convert the number. Put it backwards into temp_string.; 0991 4 !; 0992 4 t [1] = 0;_.; 0993 4 t [0] = .name_block [N_FVER];1; 0994 4 temp_string_p = temp_digits [0];2H; 0995 4 base = (IF (.$FMSK4 AND F4_DVN) NEQU 0 THEN 10 ELSE 8); ; 0996 4 8; 0997 4 IF (.t [0] GTRU 32767) THEN !PKW112!; 0998 5 BEGIN !PKW112 >; 0999 5 ch$insert (%C'-'); !Put in a - sign !PKW112/; 1000 5 t [0] = 0 -.t [0] !PKW1120 ; 1001 4 END; !PKW112; 1002 4 &; 1003 4 DECR i FROM 6 TO 1 DO; 1004 5 BEGIN=; 1005 5 BUILTINt; 1006 5 EDIV;R ; 1007 5 1; 1008 5 EDIV (base, t, t [0], char); !-2 0; 1009 5 temp_string_p [0] = .char + %C'0';0; 1010 5 temp_string_p = temp_string_p [1];; 1011 4 END; !-1 ; 1012 4 T; 1013 4 temp_string_p = temp_string_p [0] - 1; !Back up to last char PKW112!; 1014 4 ! !PKW112.M; 1015 4 ! Remove any leading zeros. (They're trailing zeros !PKW112 /; 1016 4 ! in temp_string) !PKW112=!; 1017 4 ! !PKW112 ; 1018 4 !PKW112A; 1019 4 WHILE .temp_string_p [0] EQLU %C'0' DO !PKW112e>; 1020 4 temp_string_p = temp_string_p [0] - 1; !PKW112 p];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 29m_;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (9) ; 1021 4 ; 1022 4 !I; 1023 4 ! Move the string from temp_string where it is backwardsW@; 1024 4 ! to the secondary string in the correct order.; 1025 4 !D; 1026 4 DECR i FROM temp_string_p [0] TO temp_digits [0] DO; 1027 5 BEGINr$; 1028 5 ch$insert(.(.i)<0,8>);; 1029 4 END;; 1030 3 END;8; 1031 2 END; .NLIST  .LIST BIN,LOC .LIST. .SBTTL FCS.CONVERT FCS Format Parse Directive .NLISTD .ENABL LSBI .LIST FCS.CONVERT: MOV R1,-(SP) ; 0863 MOV R2,-(SP)! MOV R4,-(SP)g MOV R5,-(SP)n SUB #14,SP  MOV R3,R5 ; *,B.ADDR CMP R4,#36 ; B.LEN,* 0886 BEQ 1$ TRAP 247 &1$: MOV #SECONDARY,R4 ; *,P 0887 MOV #32,R0 ; 0892e ADD R5,R0 ; B.ADDR,* TST (R0)r BEQ 2$8! MOVB (R0),(R4)+ ; *,P 08990" MOVB 1(R0),(R4)+ ; *,P 0900& MOV 34(R5),R0 ; *(B.ADDR),* 0905 MOV R4,R3 ; P,*. JSR PC,DCBTA.BLIC MOV R3,R4 MOVB #72,(R4)+ ; *,P 0910,2$: BIT #2000,20(R5) ; *,*(B.ADDR) 0918 BEQ 3$M MOVB #42,(R4)+ ; *,P 0929* MOV 24(R5),R0 ; *(B.ADDR),FILE.P 0944 MOVB #42,(R4)+ ; *,P 0951 BR 5$ ; 09183$: MOV #6,R3 ; 0960  ADD R5,R3 ; B.ADDR,* TST (R3)  BEQ 4$A TST 10(R5) ; *(B.ADDR) BEQ 4$B MOV #11,R1 ; 0962; P];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 30,_;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (9)R MOV R4,R2 ; P,*9 JSR PC,RAD50.TO.ASCII MOV R2,R44$: MOV #14,R3 ; 0964 ADD R5,R3 ; B.ADDR,* TST (R3)R BEQ 5$, MOVB #56,(R4)+ ; *,P 0967 MOV #3,R1 ; 0971 MOV R4,R2 ; P,*. JSR PC,RAD50.TO.ASCII MOV R2,R4)5$: MOV 16(R5),R0 ; *(B.ADDR),* 0978  BEQ 13$ MOVB #73,(R4)+ ; *,P 0988 CLR 12(SP) ; T+2 0992  MOV00aonncccc R0,10(SP) ; *,T 0993 & MOV #2,R2 ; *,TEMP.STRING.P 0994) ADD SP,R2 ; TEMP.DIGITS,TEMP.STRING.PD BIT $FMSK4,#F4.DVN ; 0995 BEQ 6$ MOV #12,(SP) ; *,BASE BR 7$6$: MOV #10,(SP) ; *,BASE4&7$: CMP 10(SP),#77777 ; T,* 0997 BLOS 8$ MOVB #55,(R4)+ ; *,P 0999 NEG 10(SP) ; T 1000V8$: MOV #6,R3 ; *,I 1003O"9$: MOV 10(SP),R1 ; T,* 1008 MOV 12(SP),R0 ; T,* DIV (SP),R0 ; BASE,* MOV R0,10(SP) ; *,T MOV R1,R5 ; *,CHAR MOV R5,R0 ; CHAR,* 1009 ADD #60,R0#" MOVB R0,(R2)+ ; *,TEMP.STRING.P SOB R3,9$ ; I,* 1003.10$: CMPB -(R2),#60 ; TEMP.STRING.P,* 1019 BEQ 10$ ; 1020 MOV #2,R0 ; 1026 ADD SP,R0 ; TEMP.DIGITS,*0 BR 12$7%11$: MOVB (R2),(R4)+ ; I,P 1028, DEC R2 ; I 1026N12$: CMP R2,R0 ; I,*V BGE 11$ 13$: MOV R4,R3 ; P,* 0863 ADD #14,SP MOV (SP)+,R5M MOV (SP)+,R4; MOV (SP)+,R2, MOV (SP)+,R1 RTS PC0 )];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 31 _;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (9)8; Routine Size: 130 words, Routine Base: $CODE$ + 0420/; Maximum stack depth per invocation: 14 words+ .NLIST .DSABL LSBC .NLIST BIN,LOC2 .LIST ,];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 32P_;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (10)9; 1032 2 !i; 1033 2 ! Do the parse; 1034 2 !rO; 1035 2 ! FCS handles directory defaulting. This directive should not. ; 1036 2 !w0; 1037 2 do_directory_defaulting = false;Q; 1038 2 must_have_device = false; ! Don't need explicit device for $PFCSTE; 1039 2 cannot_have_node = true; ! FCS don't like them nodes1N; 1040 2 common_parse (.dpb_ptr, .header_addr, .tcb_addr, fcs_convert);; 1041 1 END; .NLISTD .LIST BIN,LOC .LIST) .SBTTL $LNFCS FCS Format Parse Directiver .NLIST0 .ENABL LSB .LIST/$LNFCS::CLR DO.DIRECTORY.DEFAULTING ; 1037 ! CLR MUST.HAVE.DEVICE ; 1038 $ MOV #1,CANNOT.HAVE.NODE ; 1039! MOV #FCS.CONVERT,R0 ; 1040  JSR PC,COMMON.PARSE RTS PC ; 0806c7; Routine Size: 12 words, Routine Base: $CODE$ + 1024u-; Maximum stack depth per invocation: 1 word  .NLISTp .DSABL LSBr .NLIST BIN,LOCt .LIST n];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 33sW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (11)1&; 1042 1 %SBTTL 'Common Parse Code' ; 1043 1 U; 1044 1 ROUTINE common_parse (dpb_ptr, header_addr, tcb_addr, sec_spec_convert) :P(; 1045 1 common_parse_l NOVALUE = ; 1046 1 ; 1047 1 !++2 ; 1048 1 !t%; 1049 1 ! FUNCTIONAL DESCRIPTION:L ; 1050 1 !SL; 1051 1 ! This routine is called by $LNRMS, $LNFCS, and $LNCHN to do theO; 1052 1 ! parse operation. See those routines for information on the parse ; 1053 1 ! operation. ; 1054 1 !N; 1055 1 !--1; 1056 2 BEGINS; 1057 2 MAPd@; 1058 2 dpb_ptr : REF VECTOR; ! Treat the DPB as a vector ; 1059 2 ; 1060 2 BIND\; 1061 2 dpb_ptr_b = dpb_ptr : REF VECTOR [, BYTE]; ! Treat the DPB as a vector of bytes ; 1062 2 ; 1063 2 LOCALL; 1064 2 status,'; 1065 2 b_len, ! Buffer lengthS); 1066 2 b_addr, ! Buffer address +; 1067 2 b_mapping, ! Buffer mappingf=; 1068 2 pri_logical_type, ! Saved primary logical typeN;; 1069 2 flags_for_user, ! Flags word to be returned,; 1070 2 do_assign_lun, ! Assign flag5; 1071 2 res_length, ! Resultant string lengthE; 1072 2 assign_lun_error, ! Deferred error from LUN assignment 2; 1073 2 ucb, ! Address of the UCB for LUND; 1074 2 merge_directory_flag, ! Merge hierarchial directories3; 1075 2 p : REF VECTOR; ! Temp00aoommmffDATAorary pointer7 ; 1076 2 ; 1077 2 LABEL ; 1078 2 process_file_specs,; 1079 2 assign_lun,; 1080 2 merge_directories; ; 1081 2 ; 1082 2 process_file_specs :; 1083 3 BEGIN ; 1084 3 !rP; 1085 3 ! Initialize the logical descriptor block for later logical nameW; 1086 3 ! translations. The length and offset address will be filled in later.0; 1087 3 !o9; 1088 3 init_logical_descriptor [block_type] = 0;:R; 1089 3 init_logical_descriptor [table_number] = .dpb_ptr_b [1]; ! aka modq; 1090 3 init_logical_descriptor [address_base] = .KISAR5; ! Logical names will be in the directive commonca; 1091 3 init_logical_descriptor [matching_tcb_ucb] = .tcb_addr; ! For user table searchescN; 1092 3 saved_inhibit_mask = .dpb_ptr_b [3]; ! Settup the inhibit mask ; 1093 3 G; 1094 3 do_assign_lun = true; ! Init to enable LUN assignment ;; 1095 3 assign_lun_error = 0; ! LUN assignment ok  t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 34sW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (11)0:; 1096 3 merged = work_1 [0]; ! Initialize merged>; 1097 3 primary = work_2 [0]; ! Initialize secondaryE; 1098 3 save_parse (scr_pb); ! Init the scratch parse block E; 1099 3 save_parse (pri_pb); ! Init the primary parse block5 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 35-W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (12)-; 1100 3 !U2; 1101 3 ! Settup the users primary string.; 1102 3 ! E; 1103 3 b_addr = .dpb_ptr [2]; ! Get primary string addressi;; 1104 3 b_len = .dpb_ptr [3]; ! Get string lengthh ; 1105 3 ; 1106 3 IF .b_len NEQU 0; 1107 3 THEN; 1108 4 BEGIN ; 1109 4 ; 1110 4 LOCAL>; 1111 4 trailing_length; ! Returned length from fss ; 1112 4 8; 1113 4 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP); ; 1114 4 D; 1115 4 IF .b_len GTRU file_spec_size THEN ERROR_EXIT (IE_IBS); ; 1116 4 ; 1117 4 !J; 1118 4 ! Address check, relocate, map, copy, compress, upcase, parse-; 1119 4 ! and expand the primary string. ; 1120 4 !Z; 1121 4 IF $ACHRO (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read access ; 1122 4 :; 1123 4 b_addr = $RELOM (.b_addr); ! Map user buffer ; 1124 4 D; 1125 4 primary [0] = %C' '; ! Init it in case string is null<; 1126 4 ch$copy (.b_len, .b_addr, primary [0]; b_addr);H; 1127 4 fss (primary [0], .b_addr - primary [0];, trailing_length);'; 1128 4 IF .trailing_length NEQU 0m; 1129 4 THENe; 1130 5 BEGINM; 1131 5 save_parse (pri_pb); ! Move scr_pb to primaryeL; 1132 5 pri_pb [fss_status] = bad_char; ! Settup the error codeD; 1133 5 LEAVE process_file_specs; ! And return it; 1134 4 END;' ; 1135 4 ; 1136 4 END; 1137 3 ELSE; 1138 4 BEGIN1; 1139 4 primary [0] = %C' '; ! No filespecr?; 1140 4 fss (primary [0], 1); ! Parse file specification ; 1141 3 END;Q ; 1142 3 ?; 1143 3 save_parse (pri_pb); ! Move scr_pb to primaryp ; 1144 3 \; 1145 3 pri_logical_type = .pri_pb [logical_type]; ! Save the logical type for merge ; 1146 3 o; 1147 3 IF expand_filespec (.dpb_ptr) NEQU success THEN LEAVE process_file_specs; ! Expand any logicals ; 1148 3 A; 1149 3 IF .pri_pb [logical_type] GTRU .pri_logical_type [a; 1150 3 THEN pri_logical_type = .pri_pb [logical_type]; ! Save the logical type for merge ; 1151 3  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 36 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (13); 1152 3 !74; 1153 3 ! Sett00aonnccccup the users secondary string.; 1154 3 !eU; 1155 3 ! First validate the users buffer. Then call the appropriate routine ,; 1156 3 ! to perform the conversion.; 1157 3 ! G; 1158 3 b_addr = .dpb_ptr [9]; ! Get secondary string address<; 1159 3 b_len = .dpb_ptr [10]; ! Get string length ; 1160 3 ; 1161 3 IF .b_len NEQU 0; 1162 3 THEN; 1163 4 BEGIN ; 1164 4 ; 1165 4 LOCAL>; 1166 4 trailing_length; ! Returned length from fss ; 1167 4 8; 1168 4 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP); ; 1169 4 ; 1170 4 !N; 1171 4 ! Address check, relocate, map, copy, compress, upcase, and parse$; 1172 4 ! the secondary string.; 1173 4 ! ; 1174 4 Z; 1175 4 IF $ACHRO (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read access ; 1176 4 ;; 1177 4 b_addr = $RELOM (.b_addr); ! Map user buffer ; 1178 4 M; 1179 4 sec_spec_convert_l (.sec_spec_convert, .b_addr, .b_len; b_addr);sL; 1180 4 fss (secondary [0], .b_addr - secondary [0];, trailing_length);'; 1181 4 IF .trailing_length NEQU 0A; 1182 4 THENa; 1183 5 BEGIN ; 1184 5 ; 1185 5 !4; 1186 5 ! Settup the bad string for return.; 1187 5 !U; 1188 5 primary = secondary [0]; ! The primary string is returned M; 1189 5 save_parse (pri_pb); ! Move scr_pb to primary1L; 1190 5 pri_pb [fss_status] = bad_char; ! Settup the error codeD; 1191 5 LEAVE process_file_specs; ! And return it; 1192 4 END;a ; 1193 4 ; 1194 4 END; 1195 3 ELSE; 1196 4 BEGIN3; 1197 4 secondary [0] = %C' '; ! No filespechA; 1198 4 fss (secondary [0], 1); ! Parse file specificationa; 1199 3 END;  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 37!W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (14)h; 1200 3 !1R; 1201 3 ! If the primary string either before or after expansion containedQ; 1202 3 ! a node or device then don't merge in a node or device from the 7#; 1203 3 ! secondary string.l; 1204 3 ! ?; 1205 3 IF .pri_logical_type GTRU logical_type_filename ; 1206 3 THEN; 1207 4 BEGIN#; 1208 4 scr_pb [node_len] = 0;i$; 1209 4 scr_pb [node_addr] = 0;%; 1210 4 scr_pb [device_len] = 0;0&; 1211 4 scr_pb [device_addr] = 0;; 1212 3 END; ; 1213 3 ; 1214 3 !aS; 1215 3 ! Merge the users primary and secondary strings. Expand the resultiN; 1216 3 ! if a new logical could be present from the secondary string.; 1217 3 ! G; 1218 3 IF merge () NEQU success THEN LEAVE process_file_specs; ; 1219 3 @; 1220 3 IF .pri_pb [logical_type] GTRU .pri_logical_type; 1221 3 THEN ; 1222 3 V; 1223 3 IF expand_filespec (.dpb_ptr) NEQU success THEN LEAVE process_file_specs; ; 1224 3 N; 1225 3 flags_for_user = .pri_pb [flags]; ! Save flags to be returned ; 1226 3 ; 1227 3 !rQ; 1228 3 ! If there is a node spec we are all done here. Return the parsen/; 1229 3 ! block and string to the user.(; 1230 3 ! L; 1231 3 IF .pri_pb [node_addr] NEQU 0 THEN LEAVE process_file_specs; e];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 38.W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (15)_; 1232 3 !lL; 1233 3 ! If the user did not provide a device apply the appropriate; 1234 3 ! defaults.s; 1235 3 ! /; 1236 3 IF .pri_pb [device_addr] EQLU 0 ; 1237 3 THEN; 1238 4 BEGIN; 1239 4 !.D; 1240 4 ! The assign channel directive will not allow deviceE; 1241 4 ! defaulting. The device must be explicitly present.2; 1242 4 !.>; 1243 4 IF .must_hav00aoommmffDATAe_device THEN ERROR_EXIT (IE_IDU);\; 1244 4 IF (.dpb_ptr [11] AND (FS$NDF OR FS$DEV)) EQLU 0 !Do we want to do defaults?; 1245 4 THEN; 1246 5 BEGIN ; 1247 5 A; 1248 5 KISAR6 = .$SAHDB; ! Make sure task header is mapped H; 1249 5 IF NOT $MPLUN (dpb_ptr_b [2], .header_addr, .tcb_addr; ucb); 1250 5 THENs; 1251 6 BEGIN; 1252 6 !;; 1253 6 ! The device name will be merged in later.y; 1254 6 !A; 1255 6 do_assign_lun = false; ! Don't reassign the LUNE; 1256 6 END; 1257 5 ELSE ; 1258 6 BEGIN; 1259 6 !O; 1260 6 ! The LUN is not assigned, use the string SY: for the default. N; 1261 6 ! Put the default string in the secondary string and parse itN; 1262 6 ! in order to settup the scratch parse block. Next merge theK; 1263 6 ! default string with the primary string. Next expand anye?; 1264 6 ! logical names that may have been introduced.n; 1265 6 !; 1266 6 MACRO ; 1267 6 ; 1268 6 ! I; 1269 6 ! Insert a character into a string. Increment the pointer.L; 1270 6 !d!; M 1271 6 ch$insert (value) =t; M 1272 6 BEGINt&; M 1273 6 dev_ptr [0] = value;(; M 1274 6 dev_ptr = dev_ptr [1];; M 1275 6 ENDc; 1276 6 %; ; 1277 6 ; 1278 6 REGISTERnJ; 1279 6 dev_ptr : REF VECTOR [, BYTE]; ! Pointer into the dev string ; 1280 6 =; 1281 6 dev_ptr = secondary [0]; ! Init the pointerO#; 1282 6 ch$insert (%C'S'); #; 1283 6 ch$insert (%C'Y'); #; 1284 6 ch$insert (%C':'); (; 1285 6 fss (secondary [0], 3); ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 39 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (15) H; 1286 6 IF merge () NEQU success THEN LEAVE process_file_specs;Z; 1287 6 IF expand_filespec (.dpb_ptr) NEQU success THEN LEAVE process_file_specs;; 1288 6 !R; 1289 6 ! If there is a node spec we are all done here. Return the parse0; 1290 6 ! block and string to the user.; 1291 6 !M; 1292 6 IF .pri_pb [node_addr] NEQU 0 THEN LEAVE process_file_specs; ; 1293 5 END;C; 1294 4 END;1; 1295 3 END;S P];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 40cW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (16)p; 1296 3 ! Q; 1297 3 ! Assign the LUN if appropriate. The LUN will not be assigned ifrQ; 1298 3 ! the current LUN assignment is being used as the device default. ; 1299 3 !n; 1300 3 assign_lun :; 1301 4 BEGIN ; 1302 4 U; 1303 5 IF .do_assign_lun AND ((.dpb_ptr [11] AND (FS$NDF OR FS$DEV)) EQLU 0)-; 1304 4 THEN; 1305 5 BEGIN; 1306 5 MACRO ; 1307 5 ; 1308 5 !P; 1309 5 ! NEXT_CHAR sets the next character and returns true if success; 1310 5 !; M 1311 5 next_char =; M 1312 5 BEGINi(; M 1313 5 char = .(.unit_ptr)<0, 8>;'; M 1314 5 unit_ptr = .unit_ptr + 1;t; M 1315 5 .char NEQU %C':'; 1316 5 END %; ; 1317 5 ; 1318 5 ROUTINEf; 1319 5 ie_idu_return : return_ie_xxx_l = ERROR_EXIT (IE_IDU), ! Routine for assign_lun_error .NLIST  .LIST BIN,LOC .LIST' .SBTTL IE.IDU.RETURN Common Parse Code  .NLIST3 .ENABL LSBN .LISTIE.IDU.RETURN: MOV R0,-(SP) ; 1319 TRAP 244 MOV (SP)+,R0! RTS PC16; Routine Size: 4 words, Routine Base: $CODE$ + 1054.; Maximum stack depth per invocation: 3 words .NLISTt .DSABL LSB  .NLIST BIN,LOC  .LISTf; 1320 5 ie_ilu_return : return_ie_xxx_l = ERROR_EXIT (IE_ILU); ! Routine for assign_lun_error .NLISTR .LIST BIN,LOC .LIST' .SBTTL IE.ILU.RETURN Common Parse CodeN .NLISTI .ENABL LSB  I];DRPFN Logical Name Directives 8-Aug-1986 100aonncccc4:08:19 VAX-11 Bliss-16 V4.1-582 Page 41 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (16)  .LISTIE.ILU.RETURN: MOV R0,-(SP) ; 1320 TRAP 240. MOV (SP)+,R0  RTS PCL6; Routine Size: 4 words, Routine Base: $CODE$ + 1064.; Maximum stack depth per invocation: 3 words .NLISTi .DSABL LSB .NLIST BIN,LOCB .LIST ; 1321 5 ; 1322 5 LOCALI; 1323 5 unit_number, ! Unit number for device to be assigned to B; 1324 5 unit_ptr, ! Pointer into the unit number string;; 1325 5 char; ! Current character in unit numberN ; 1326 5 ; 1327 5 !8; 1328 5 ! Check the length. It must be at least 3.; 1329 5 !/; 1330 5 IF .pri_pb [device_len] LSSU 3e; 1331 5 THENi; 1332 6 BEGINnL; 1333 6 assign_lun_error = ie_idu_return; ! The error will be reported.; 1334 6 LEAVE assign_lun; ! at the end; 1335 5 END;; 1336 5 !(; 1337 5 ! Calculate the unit number; 1338 5 !5; 1339 5 unit_number = 0; ! Init the unit number E; 1340 5 unit_ptr = .pri_pb [device_addr] + 2; ! Init the pointer ; 1341 5 ; 1342 5 !$; 1343 5 ! Loop thru the digits.; 1344 5 !; 1345 5 WHILE next_char DOe; 1346 6 BEGIN ; 1347 6 ; 1348 6 !C; 1349 6 ! Check the character. It must be an octal digit. ; 1350 6 !<; 1351 7 IF (.char LSSU %C'0') OR (.char GTRU %C'7'); 1352 6 THENe; 1353 7 BEGIN L; 1354 7 assign_lun_error = ie_idu_return; ! The error will be reported.; 1355 7 LEAVE assign_lun; ! at the end; 1356 6 END; ; 1357 6 Q; 1358 6 unit_number = .unit_number * 8 + (.char - %C'0'); ! Add this onen; 1359 5 END;  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 42 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (16)R ; 1360 5 ; 1361 5 !R; 1362 5 ! Give the LUN assignment routine the LUN number, the header address,C; 1363 5 ! the TCB address, the two letters of the device name, >; 1364 5 ! the unit number, and the terminal logical flag.; 1365 5 !S; 1366 5 ! The routine will assign the LUN if possible and return the directiverR; 1367 5 ! error code if any. Any error will be signaled later, after as muchE; 1368 5 ! information as possible has been returned to the user.(; 1369 5 !K; 1370 5 ! If the terminal logical flag was set by the last expand thennM; 1371 5 ! lun_assign will just look for the device in the system tables.tO; 1372 5 ! If the logical was not terminal then the device translation thatJ; 1373 5 ! is normally done for the assign LUN directive will be done.; 1374 5 !A; 1375 5 KISAR6 = .$SAHDB; ! Make sure task header is mappeda; 1376 5 assign_lun_error =8D; 1377 6 (IF .dpb_ptr_b [2] NEQU 0 ! Defer error for LUN of zero; 1378 6 THEN ,; 1379 6 lun_assign ( dpb_ptr_b [2],; 1380 6 .header_addr, ; 1381 6 .tcb_addr,'; 1382 6 ..pri_pb [device_addr],; 1383 6 .unit_number,a'; 1384 6 .terminal_logical_flag;n; 1385 6 ucb); 1386 6 ELSEo ; 1387 5 ie_ilu_return);; 1388 4 END; "; 1389 3 END; ! assign_lun a];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 432W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (17) ; 1390 3 !3U; 1391 3 ! At this point the LUN is assigned. Either we are using the currentaQ; 1392 3 ! assignment as the device default or the LUN was assigned above. ; 1393 3 !A; 1394 3 ! The only exception is if the assign LUN failed.E; 1395 3 ! O; 1396 3 ! Here we will generate a device name and unit number and merge Q; 1397 3 ! it into the primary string. First we will call $MPLND to track:W; 1398 3 ! down an 00aoommmffDATAredirections. No point in doing any of this for ACHN becauset,; 1399 3 ! we do not return a string.; 1400 3 !C; 1401 3 IF .must_have_device THEN LEAVE process_file_specs;iZ; 1402 5 IF (.assign_lun_error EQLU 0) AND ((.dpb_ptr [11] AND (FS$NDF OR FS$DEV)) ; 1403 3 EQLU 0) THEN; 1404 4 BEGIN; 1405 4 LOCAL4; 1406 4 dcb, ! Address of the DCB for LUNC; 1407 4 unit_number, ! Unit number for device on this LUN:K; 1408 4 redirected_ucb; ! We need the real UCB and the redirectedA*; 1409 4 ! UCB for spooled devices ; 1410 4 ; 1411 4 REGISTER M; 1412 4 dev_ptr : REF VECTOR [, BYTE]; ! Pointer into the dev string ; 1413 4 ; 1414 4 MACRO ; 1415 4 ; 1416 4 !L; 1417 4 ! Insert a character into a string. Increment the pointer.; 1418 4 !$; M 1419 4 ch$insert (value) =; M 1420 4 BEGIN_"; M 1421 4 dev_ptr [0] = value;$; M 1422 4 dev_ptr = dev_ptr [1];; M 1423 4 ENDh; 1424 4 %; ; 1425 4 9; 1426 4 dev_ptr = secondary [0]; ! Init the pointer ; 1427 4 ; 1428 4 !I; 1429 4 ! Now get the correct UCB address. Follow any redirections, 5; 1430 4 ! and get both UCBs for spooled devices. ; 1431 4 !;; 1432 4 $MPLND (.ucb, .tcb_addr; redirected_ucb, ucb);o ; 1433 4 ; 1434 4 !J; 1435 4 ! While we have the ucb address a check will be made. If theI; 1436 4 ! device is unit record, sequential or single directory thenH; 1437 4 ! directory defaulting will not be done because a directory; 1438 4 ! is not required. ; 1439 4 !T; 1440 4 IF (.(.redirected_ucb + U_CW1) AND (DV_REC OR DV_SDI OR DV_SQD)) NEQU 0; 1441 4 THENs1; 1442 4 do_directory_defaulting = false; ; 1443 4  c];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 44uW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (17)l:; 1444 4 dcb = .(.ucb + U_DCB); ! Get the DCB address ; 1445 4 ; 1446 4 !0; 1447 4 ! Calculate the logical unit number; 1448 4 !i; 1449 5 unit_number = ((.ucb - .(.dcb + D_UCB)) / .(.dcb + D_UCBL)) ! Relative UCB addr / UCB length2I; 1450 4 + .(.dcb + D_UNIT) <0,8>; ! Plus lowest unit on this DCBa ; 1451 4 @; 1452 4 ch$insert (%C'_'); ! Terminal logical from the LUNC; 1453 4 ch$insert (.(.dcb + D_NAM)); ! Fill in the device nameN-; 1454 4 ch$insert (.(.dcb + D_NAM + 1));c ; 1455 4 ; 1456 4 !D; 1457 4 ! Generate the ASCII device number from the unit number; 1458 4 ! zero suppressed. ; 1459 4 !9; 1460 4 DCBTA_BLI (.unit_number, .dev_ptr; dev_ptr);l ; 1461 4 ; 1462 4 !$; 1463 4 ! Insert the trailing :; 1464 4 !; 1465 4 ch$insert (%C':'); ; 1466 4 ; 1467 4 !:; 1468 4 ! Parse the device spec and merge it into the; 1469 4 ! primary string.; 1470 4 !;; 1471 4 fss (secondary [0], .dev_ptr - secondary [0]); ; 1472 4 ; 1473 4 !I; 1474 4 ! Kill the primary device info so that the new device string !; 1475 4 ! will be merged in.4; 1476 4 !%; 1477 4 pri_pb [device_len] = 0; &; 1478 4 pri_pb [device_addr] = 0;D; 1479 4 IF merge () NEQU success THEN LEAVE process_file_specs;; 1480 3 END; ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 45sW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (18) ; 1481 3 ! M; 1482 3 ! If the user did not provide a directory or if the directoryN; 1483 3 ! was null apply the appropriate defaults unless the directoryN; 1484 3 ! defaulting flag is set off for the FCS format parse. If theK; 1485 3 ! user provided a directory with a leading . or - then thisi?; 1486 3 ! directory will be merged in with the default.5; 1487 3 !XL; 1488 4 merge_directory_flag =00aonncccc ((.pri_pb [directory_len] GEQU 3) ANDD; 1489 5 ((.(.pri_pb [directory_addr] + 1)<0,8> EQLU %C'.') ORC; 1490 3 (.(.pri_pb [directory_addr] + 1)<0,8> EQLU %C'-')));a ; 1491 3 0; 1492 3 IF .do_directory_defaulting AND A; 1493 3 ((.dpb_ptr [11] AND (FS$NDF OR FS$DIR)) EQLU 0) AND:; 1494 4 ((.pri_pb [directory_addr] EQLU 0) OR4; 1495 4 (.pri_pb [directory_len] EQLU 2) OR'; 1496 4 .merge_directory_flag) ; 1497 3 THEN; 1498 4 BEGIN ; 1499 4 ; 1500 4 !H; 1501 4 ! Try to get the default directory string. Put it intoH; 1502 4 ! the secondary string. It will be returned terminated.; 1503 4 ! by a blank. Then parse it.; 1504 4 !; 1505 4 FIELD ; 1506 4 dds_context_f =; 1507 4 SET4>; 1508 4 reference_count= [0, 0, 8, 0], ! Reference countG; 1509 4 dds_length = [0, 8, 8, 0], ! Length of the default stringrH; 1510 4 dds_uic = [1, 0, 16, 0], ! UIC for clock block propagationF; 1511 4 default_string = [2, 0, 16, 0] ! Start of default string; 1512 4 TES; ; 1513 4 ; 1514 4 LITERALG; 1515 4 dds_context_size = 2; ! Size of the fixed part of thee.; 1516 4 ! DDS context block in words ; 1517 4 ; 1518 4 BIND =; 1519 4 dds_context = apr6_v : BLOCK [dds_context_size]!R; 1520 4 FIELD (dds_context_f); ! Default directory context block address ; 1521 4 ; 1522 4 LOCAL>; 1523 4 trailing_length, ! Returned length from fss ; 1524 4 default_length,I; 1525 4 p : REF VECTOR [,BYTE]; ! Pointer into secondary stringL ; 1526 4 ; 1527 4 !R; 1528 4 ! Map the default directory string context block. If there is a taskO; 1529 4 ! context block use that one. If not, use the one hung off of theBP; 1530 4 ! terminal if it is present. If there is neither then return a DDS; 1531 4 ! of blank.; 1532 4 !<; 1533 7 IF (KISAR6 = ( IF (.(.tcb_addr + T_CTX) NEQU 0); 1534 6 THEN ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 46yW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (18)o'; 1535 7 .(.tcb_addr + T_CTX) ; 1536 6 ELSEeJ; 1537 7 (IF (.(.(.tcb_addr + T_UCB) + U_CW1) AND DV_PSE) EQLU 0; 1538 7 THEN /; 1539 8 .(.(.tcb_addr + T_UCB) + U_CTX)l; 1540 7 ELSE ; 1541 7 0); 1542 6 ); 1543 4 ) NEQU 0 ; 1544 4 ; 1545 4 THENa; 1546 5 BEGIN ; 1547 5 ; 1548 5 !a; 1549 5 ! Here we have the context block mapped. Copy, compress, and upcase the default5L; 1550 5 ! directory string. Checking of the string is done by fss.; 1551 5 !<; 1552 5 default_length = .dds_context [dds_length];[; 1553 5 ch$copy (.default_length, dds_context [default_string], secondary [0]; p);; 1554 5 END; 1555 4 ELSE$; 1556 4 default_length = 0; ; 1557 4 ; 1558 4 !(; 1559 4 ! Parse the default string.; 1560 4 !D; 1561 4 fss (secondary [0], .default_length;, trailing_length);'; 1562 4 IF .trailing_length NEQU 0d; 1563 4 THENh; 1564 5 BEGIN ; 1565 5 ; 1566 5 !4; 1567 5 ! Settup the bad string for return.; 1568 5 !J; 1569 5 primary = secondary [0]; ! The primary string is returned>; 1570 5 save_parse (pri_pb); ! Move scr_pb to primaryI; 1571 5 pri_pb [fss_status] = bad_char; ! Settup the error codee:; 1572 5 LEAVE process_file_specs; ! And return it; 1573 4 END;, a];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 47BW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (19)r; 1574 4 !8; 1575 4 ! Is there a valid non null default string?; 1576 4 !4; 1577 4 IF (.scr_pb [directory_addr] EQ00aoommmffDATALU 0) OR1; 1578 4 (.scr_pb [directory_len] EQLU 2) ORuI; 1579 5 ((.scr_pb [flags] AND (FS$NAM OR FS$TYP OR FS$VER)) NEQU 0)l; 1580 4 THENr; 1581 5 BEGIN ; 1582 5 ; 1583 5 !1; 1584 5 ! Generate the UIC format string1; 1585 5 !; 1586 5 MACRO ; 1587 5 ; 1588 5 !SI; 1589 5 ! Insert a character into a string. Increment the pointer. ; 1590 5 !d!; M 1591 5 ch$insert (value) = ; M 1592 5 BEGINe&; M 1593 5 dir_ptr [0] = value;(; M 1594 5 dir_ptr = dir_ptr [1];; M 1595 5 ENDs; 1596 5 %; ; 1597 5 ; 1598 5 LOCALJ; 1599 5 dir_ptr : REF VECTOR [, BYTE]; ! Pointer into the dir string ; 1600 5 ; 1601 5 BIND1I; 1602 5 uic_group = .header_addr + H_DUIC + 1 : BYTE, ! Default UICS7; 1603 5 uic_owner = .header_addr + H_DUIC : BYTE;e ; 1604 5 F; 1605 5 KISAR6 = .$SAHDB; ! Make sure task header is mapped4; 1606 5 dir_ptr = secondary [0]; ! Init it<; 1607 5 ch$insert (%C'['); ! Put in the opening [ ; 1608 5 ; 1609 5 !M; 1610 5 ! Fill in the group zero suppressed. Include the zero if iti); 1611 5 ! is the only character. ; 1612 5 !+; 1613 5 IF .uic_group <6,2> NEQU 0I; 1614 5 THEN ; 1615 6 BEGINi3; 1616 6 ch$insert (.uic_group <6,2> + %C'0'); 3; 1617 6 ch$insert (.uic_group <3,3> + %C'0');s; 1618 6 END; 1619 5 ELSErS; 1620 5 IF .uic_group <3,3> NEQU 0 THEN ch$insert (.uic_group <3,3> + %C'0');i6; 1621 5 ch$insert (.uic_group <0,3> + %C'0'); ; 1622 5 8; 1623 5 ch$insert (%C','); ! Insert the comma. ; 1624 5 ; 1625 5 !?; 1626 5 ! Fill in the group and owner zero suppressed.I; 1627 5 ! ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 48iW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (19) +; 1628 5 IF .uic_owner <6,2> NEQU 0.; 1629 5 THEN); 1630 6 BEGINc3; 1631 6 ch$insert (.uic_owner <6,2> + %C'0'); 3; 1632 6 ch$insert (.uic_owner <3,3> + %C'0');.; 1633 6 END ; 1634 5 ELSE6S; 1635 5 IF .uic_owner <3,3> NEQU 0 THEN ch$insert (.uic_owner <3,3> + %C'0');P6; 1636 5 ch$insert (.uic_owner <0,3> + %C'0'); ; 1637 5 ; 1638 5 !?; 1639 5 ! Finish up the directory string and parse it.D; 1640 5 !;; 1641 5 ch$insert (%C']'); ! Put in the trailing ]9 ; 1642 5 ; 1643 5 !A; 1644 5 ! Parse the default UIC format directory string. ; 1645 5 !?; 1646 5 fss (secondary [0], .dir_ptr - secondary [0]);6<; 1647 4 END; ! Create UIC format directory string w];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 49 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (20)0; 1648 4 !K; 1649 4 ! If the user supplied directory string contains a leading E; 1650 4 ! . or - merge it with the default directory string.g; 1651 4 !); 1652 4 IF .merge_directory_flagi; 1653 4 THEN6; 1654 5 BEGIND3; 1655 5 status = ! Set the status from merge !; 1656 5 merge_directories :9; 1657 6 BEGINi ; 1658 6 ; 1659 6 LOCAL0*; 1660 6 bracket : UNSIGNED BYTE,4; 1661 6 default_dir : REF VECTOR [, BYTE],1; 1662 6 user_dir : REF VECTOR [, BYTE];e ; 1663 6 ; 1664 6 ! B; 1665 6 ! The user directory pointer is initialized to pointA; 1666 6 ! to the beginning of the directory string providedi>; 1667 6 ! by the user. The default directory pointer is>; 1668 6 ! initialized to point to the end of the default!; 1669 6 ! directory string. ; 1670 6 !96; 1671 6 user_dir = .pri_pb [directory_addr] + 1;8; 1672 6 default_dir = .scr_pb [t00aonnccccrailing_addr] - 2; ; 1673 6 ; 1674 6 !VB; 1675 6 ! Save the trailing bracket from the default string.?; 1676 6 ! This will be used to close the merged directory ; 1677 6 ! string.i; 1678 6 !o<; 1679 6 bracket = .(.scr_pb [trailing_addr] - 1)<0,8>; ; 1680 6 ; 1681 6 !a<; 1682 6 ! Loop thru any '-' requests and backup in the"; 1683 6 ! default directory.; 1684 6 !d/; 1685 6 WHILE .user_dir [0] EQLU %C'-' DO ; 1686 7 BEGINa*; 1687 7 user_dir = user_dir [1]; ; 1688 7 ; 1689 7 !l#; 1690 7 ! '.' is bad here; 1691 7 !w0; 1692 7 IF .default_dir [0] EQLU %C'.'; 1693 7 THENV; 1694 7 LEAVE merge_directories WITH pri_pb [fss_status] = bad_directory;; 1695 7 ! =; 1696 7 ! Backup one level in the default string if !; 1697 7 ! there is one. ; 1698 7 !5; 1699 7 WHILE 1 DO; 1700 8 BEGIN ; 1701 8  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 50 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (20)'; 1702 8 !5; 1703 8 ! Check for no more default directory. ; 1704 8 !?; 1705 8 IF default_dir [0] EQLA .scr_pb [directory_addr]k; 1706 8 THENe; 1707 8 EXITLOOP; ; 1708 8 -; 1709 8 IF .default_dir [0] EQLU %C'.' ; 1710 8 THEN0; 1711 9 BEGINF; 1712 9 default_dir = default_dir [-1]; ! Back over the '.'*; 1713 9 EXITLOOP; ! And exit; 1714 9 END; 1715 8 ELSECG; 1716 8 default_dir = default_dir [-1]; ! Backup a characterf ; 1717 8 ; 1718 7 END; ,; 1719 6 END; ! End of hyphen loop ; 1720 6 ; 1721 6 !k#; 1722 6 ! '.' is bad here too ; 1723 6 ! ,; 1724 6 IF .default_dir [0] EQLU %C'.'; 1725 6 THENR; 1726 6 LEAVE merge_directories WITH pri_pb [fss_status] = bad_directory; ; 1727 6 ; 1728 6 ! =; 1729 6 ! Check for remaining default directory string.D; 1730 6 !E>; 1731 6 IF default_dir [0] EQLA .scr_pb [directory_addr]; 1732 6 THEN; 1733 7 BEGINE ; 1734 7 ; 1735 7 ! @; 1736 7 ! Here we are out of default directory string.@; 1737 7 ! Eat a leading '.' in the users string unlessE; 1738 7 ! it is part of '...'. '..' will also be accepted.cC; 1739 7 ! That case will be caught in the access methods.7; 1740 7 ! -; 1741 7 IF .user_dir [0] EQLU %C'.'i; 1742 7 THEN; 1743 8 BEGIN ; 1744 8 ; 1745 8 !%; 1746 8 ! Skip the leading '.' ; 1747 8 !'; 1748 8 user_dir = user_dir [1];6 ; 1749 8 ; 1750 8 !@; 1751 8 ! If the next character is a '.' also then backup2; 1752 8 ! to include the previous dot also.; 1753 8 !*; 1754 8 IF .user_dir [0] EQLU %C'.'; 1755 8 THEN  g];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 51iW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (20) ,; 1756 8 user_dir = user_dir [-1]; ; 1757 8 ;; 1758 7 END; ! End of leading '.' in user directory ; 1759 7 ; 1760 7 !rJ; 1761 7 ! If the users directory spec is gone too, we must setup2; 1762 7 ! the MFD as the directory spec.; 1763 7 !5_; 1764 8 IF user_dir [0] EQLA (.pri_pb [directory_addr] + .pri_pb [directory_len] - 1)2; 1765 7 THEN; 1766 8 BEGIN:; 1767 8 DECR i FROM 5 TO 0 DO ! Move the MFD name; 1768 9 BEGING; 1769 9 default_dir = default_dir [1]; ! Advance the pointer C; 1770 9 default_dir [0] = %C'0'; ! Insert the character ; 1771 8 END;r; 1772 7 END;o9; 1773 7 END ! End of out of default directoryo; 00aoommmffDATA 1774 6 ELSE; 1775 7 BEGIN ; 1776 7 ; 1777 7 !dD; 1778 7 ! Here we have some default directory string left.A; 1779 7 ! Make sure that the users directory spec has avB; 1780 7 ! leading '.' unless it is null. If it does notG; 1781 7 ! then append a '.' at the end of the default string.t; 1782 7 !I_; 1783 8 IF user_dir [0] NEQA (.pri_pb [directory_addr] + .pri_pb [directory_len] - 1)n; 1784 7 THEN*; 1785 7 IF .user_dir [0] NEQU %C'.'; 1786 7 THEN ; 1787 8 BEGINC; 1788 8 default_dir = default_dir [1]; ! Advance pointer ;; 1789 8 default_dir [0] = %C'.'; ! Append the . ; 1790 7 END;e ; 1791 7 =; 1792 6 END; ! End of default directory remaining ; 1793 6 ; 1794 6 ! F; 1795 6 ! Now merge the remaining user string with the remaining); 1796 6 ! default directory string.r; 1797 6 ! a; 1798 6 WHILE user_dir [0] NEQA (.pri_pb [directory_addr] + .pri_pb [directory_len] - 1) DO ; 1799 7 BEGIN 0; 1800 7 default_dir = default_dir [1];2; 1801 7 default_dir [0] = .user_dir [0];*; 1802 7 user_dir = user_dir [1];; 1803 6 END; ; 1804 6 ; 1805 6 !i1; 1806 6 ! Include the closing character and-; 1807 6 ! parse the new default string.r; 1808 6 !i,; 1809 6 default_dir = default_dir [1]; ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 52rW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (20)i); 1810 6 default_dir [0] = .bracket;ud; 1811 6 fss (secondary [0], default_dir [0] - .scr_pb [directory_addr] + 1; ,trailing_length); ; 1812 6 ; 1813 6 !lA; 1814 6 ! Check the merged directory and return the status.l; 1815 6 !8+; 1816 6 LEAVE merge_directories WITH l,; 1817 6 IF .trailing_length NEQU 0; 1818 6 THEN@; 1819 6 pri_pb [fss_status] = bad_directory ! Error code; 1820 6 ELSE4; 1821 6 success; ! Return the status ; 1822 6 (; 1823 5 END; ! merge_directories ; 1824 5 ; 1825 5 !sC; 1826 5 ! Check the status and return any errors to the user.3; 1827 5 !4%; 1828 5 IF .status NEQU successr; 1829 5 THEN; 1830 6 BEGIN6 ; 1831 6 ; 1832 6 !l5; 1833 6 ! Settup the bad string for return.8; 1834 6 !8L; 1835 6 primary = secondary [0]; ! The primary string is returned@; 1836 6 save_parse (pri_pb); ! Move scr_pb to primaryH; 1837 6 pri_pb [fss_status] = .status; ! Settup the error code<; 1838 6 LEAVE process_file_specs; ! And return it; 1839 5 END;/; 1840 4 END; ! IF .merge_directory_flag ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 53 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (21)e; 1841 4 !G; 1842 4 ! Merge the default directory into the primary string.sI; 1843 4 ! First zero the length and address for the directory in :; 1844 4 ! the primary string in case it was null.; 1845 4 !,; 1846 4 pri_pb [directory_len] = 0;-; 1847 4 pri_pb [directory_addr] = 0;a; 1848 4 merge();6,; 1849 3 END; ! Add default directory ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 54 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (22); 1850 3 !rK; 1851 3 ! Remove any portions of the resultant string that the userpM; 1852 3 ! doesn't want. This functionality is used by RMS-11 if some H; 1853 3 ! portion of the file spec is provided in the NAM Block.; 1854 3 !); 1855 4 BEGIN ; 1856 4 ; 1857 4 LOCAL ; 1858 4 do_merge; 00aonncccc; 1859 4 G; 1860 4 secondary [0] = %C' '; ! Set up secondary with a blankd!; 1861 4 do_merge = false;C4; 1862 4 IF (.dpb_ptr [11] AND FS$NOD) NEQU 0; 1863 4 THEN; 1864 5 BEGIN$; 1865 5 pri_pb [node_addr] = 0;#; 1866 5 pri_pb [node_len] = 0;c; 1867 5 do_merge = true;s; 1868 4 END; 4; 1869 4 IF (.dpb_ptr [11] AND FS$DEV) NEQU 0; 1870 4 THEN; 1871 5 BEGIN&; 1872 5 pri_pb [device_addr] = 0;%; 1873 5 pri_pb [device_len] = 0; ; 1874 5 do_merge = true;0; 1875 4 END;p ; 1876 4 R; 1877 4 ! Neither FCS nor RMS likes the underscore returned on the device..; 1878 4 ! If it's there, strip it off.; 1879 4 !5;; 1880 4 IF .(.pri_pb [device_addr])<0,8> EQLU %C'_'=; 1881 4 THEN; 1882 5 BEGIN>; 1883 5 pri_pb [device_addr] = .pri_pb [device_addr] + 1;<; 1884 5 pri_pb [device_len] = .pri_pb [device_len] - 1;; 1885 5 do_merge = true;8; 1886 4 END;c ; 1887 4 4; 1888 4 IF (.dpb_ptr [11] AND FS$DIR) NEQU 0; 1889 4 THEN; 1890 5 BEGIN); 1891 5 pri_pb [directory_addr] = 0;e(; 1892 5 pri_pb [directory_len] = 0;; 1893 5 do_merge = true; ; 1894 4 END; 4; 1895 4 IF (.dpb_ptr [11] AND FS$NAM) NEQU 0; 1896 4 THEN; 1897 5 BEGIN(; 1898 5 pri_pb [filename_addr] = 0;'; 1899 5 pri_pb [filename_len] = 0;_; 1900 5 do_merge = true;;; 1901 4 END;e; 1902 4 !8J; 1903 4 ! Include a . in the primary string if the primary string  0];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 552W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (22) H; 1904 4 ! does not have a type in it, we are doing defaults, and2; 1905 4 ! directory defaulting is enabled.; 1906 4 !p4; 1907 4 IF (.dpb_ptr [11] AND FS$TYP) NEQU 0; 1908 4 THEN; 1909 5 BEGIN$; 1910 5 pri_pb [type_addr] = 0;#; 1911 5 pri_pb [type_len] = 0;n; 1912 5 do_merge = true;r; 1913 5 END; 1914 4 ELSEN; 1915 4 IF .do_directory_defaulting AND (.dpb_ptr [11] AND FS$NDF) EQLU 0; 1916 4 THEN ; 1917 5 BEGINB; 1918 5 secondary [0] = %C'.'; ! Include the "." for RMS!; 1919 5 do_merge = true;e; 1920 4 END; ; 1921 4 4; 1922 4 IF (.dpb_ptr [11] AND FS$VER) NEQU 0; 1923 4 THEN; 1924 5 BEGIN'; 1925 5 pri_pb [version_addr] = 0;&; 1926 5 pri_pb [version_len] = 0;; 1927 5 do_merge = true; ; 1928 4 END; !; 1929 4 IF .do_merge THENd; 1930 5 BEGIN@; 1931 5 fss (secondary [0], 1); ! Parse file specification,; 1932 5 merge (); ! And do the merge; 1933 4 END;c; 1934 3 END;,; 1935 2 END; ! process_file_specs ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 56HW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (23)r; 1936 2 !9H; 1937 2 ! Return the expanded string and the primary parse block3; 1938 2 ! with the saved flags to the user.r; 1939 2 ! ; 1940 2 !L; 1941 2 ! First return the strings length if the buffer is provided.R; 1942 2 ! Don't do any of this for ACHN, because we don't return a string. ; 1943 2 (; 1944 2 IF NOT .must_have_device; 1945 2 THEN; 1946 3 BEGIND; 1947 3 b_addr = .dpb_ptr [6]; ! Get resultant length address@; 1948 3 IF .pri_pb [trailing_addr] NEQU 0 ! Get the length; 1949 3 THENo\; 1950 3 res_length = .pri_pb [trailing_addr] - primary [0] + .pri_pb [trailing_len]; 1951 3 ELSE ; 1952 3 res_length = 0; ; 1953 3 ; 1954 3 IF .b_addr NEQU 0; 1955 3 THENs; 1956 4 BEGIN_; 1957 4 IF $ACHKB (.b_addr, 2) THEN ERROR_EXIT (IE_ADP); ! Check for read/write accessN:; 1958 4 p = $RELOM (.00aoommmffDATAb_addr); ! Map user buffer9; 1959 4 .p = .res_length; ! Fill in the lengtha; 1960 3 END; ; 1961 3 ; 1962 3 !N; 1963 3 ! RMS requires that the version number delimiter be a ; and not aO; 1964 3 ! . in the resultant string. It uses this for some later parsing.9; 1965 3 !X; 1966 3 IF .pri_pb [version_len] NEQU 0 THEN (.pri_pb [version_addr])<0,8> = %C';'; ; 1967 3 ; 1968 3 !=; 1969 3 ! Then return as much of the string as possible,p; 1970 3 !=; 1971 3 b_addr = .dpb_ptr [4]; ! Get resultant address!;; 1972 3 b_len = .dpb_ptr [5]; ! Get resultant length9C; 1973 3 $RELOC (.b_addr; b_mapping, p); ! Relocte user buffereh; 1974 3 convert_parse (pri_pb, primary [0], .b_addr); ! Convert parse block addresses to user mode ; 1975 3 ; 1976 3 IF .b_len NEQU 0l; 1977 3 THENr; 1978 4 BEGIN ; 1979 4 <; 1980 4 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP); ; 1981 4 ; 1982 4 !<; 1983 4 ! Address check the user buffer. Then copy the(; 1984 4 ! resultant string into it.; 1985 4 !d; 1986 4 IF $ACHKB (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read/write access ; 1987 4 v; 1988 4 IF .res_length NEQU 0 THEN $BLXIO (MINU (.res_length, .b_len), .kisar5, primary [0], .b_mapping, .p); ; 1989 4  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 57XW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (23) ; 1990 4 ! Move itr; 1991 3 END;o .];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 58kW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)(; 1992 3 !_D; 1993 3 ! Now return as much of the parse block as possible,; 1994 3 !cK; 1995 3 pri_pb [flags] = .flags_for_user; ! Save flags to be returned t; 1996 4 IF .cannot_have_node AND (.pri_pb [node_addr] NEQU 0) ! If a node is illegal, put status in parse block8; 1997 3 THEN pri_pb [fss_status] = bad_logical;?; 1998 3 b_addr = .dpb_ptr [7]; ! Get parse block address =; 1999 3 b_len = .dpb_ptr [8]; ! Get parse block lengthP ; 2000 3 ; 2001 3 IF .b_len NEQU 09; 2002 3 THENu; 2003 4 BEGIN ; 2004 4 <; 2005 4 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP); ; 2006 4 ; 2007 4 !I; 2008 4 ! Address check and relocate the user buffer. Then copy the #; 2009 4 ! parse block into it. ; 2010 4 !d; 2011 4 IF $ACHKB (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read/write access ; 2012 4 K; 2013 4 $RELOC (.b_addr; b_mapping, b_addr); ! Relocte user buffer0l; 2014 4 $BLXIO (MINU (parse_block_size*2, .b_len), .kisar5, pri_pb, .b_mapping, .b_addr); ! Move it; 2015 3 END;T; 2016 2 END;A; 2017 2 !Y; 2018 2 ! The LUN assignment may have returned an error. If it did the signalingU; 2019 2 ! of that error was deferred so that more information about the errord0; 2020 2 ! could be returned to the user.; 2021 2 ! 6; 2022 2 ! If there was an error signal it now.; 2023 2 ! U; 2024 2 IF .assign_lun_error NEQU 0 THEN return_ie_xxx_l (.assign_lun_error);pN; 2025 2 IF .pri_pb [fss_status] NEQU success THEN ERROR_EXIT (IE_LNF); ; 2026 2 ; 2027 2 RETURN;h; 2028 1 END; .NLISTn .LIST BIN,LOC .LISTDDS.CONTEXT= -40000 & .SBTTL COMMON.PARSE Common Parse Code .NLISTt .ENABL LSB  .LIST COMMON.PARSE:  JSR R1,$SAVE5 ; 1044e SUB #24,SP  MOV R0,20(SP) MOV R5,12(SP) MOV R4,10(SP) i];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 59xW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)_ MOV R3,14(SP)* CLRB INIT.LOGICAL.DESCRIPTOR+7 ; 1088 MOV R3,R0 ; 1089% MOVB 1(00aonnccccR0),INIT.LOGICAL.DESCRIPTOR+6 / MOV KISAR5,INIT.LOGICAL.DESCRIPTOR+2; 1090 - MOV R5,INIT.LOGICAL.DESCRIPTOR+10 ; 1091R) MOVB 3(R0),SAVED.INHIBIT.MASK ; 10924 CLRB SAVED.INHIBIT.MASK+1) MOV #1,16(SP) ; *,DO.ASSIGN.LUN 1094a& CLR 6(SP) ; ASSIGN.LUN.ERRO 1095 MOV #WORK.1,MERGED ; 1096! MOV #WORK.2,PRIMARY ; 1097  MOV #SCR.PB,R1 ; 1098 JSR PC,SAVE.PARSE MOV #PRI.PB,R1 ; 1099 JSR PC,SAVE.PARSE MOV 14(SP),R0 ; 1103R MOV 4(R0),4(SP) ; *,B.ADDR,$ MOV 6(R0),2(SP) ; *,B.LEN 1104 BEQ 4$ ; 1106O TST 4(SP) ; B.ADDR 1113 BNE 1$R TRAP 236 &1$: CMP 2(SP),#377 ; B.LEN,* 1115 BLOS 2$ TRAP 247A%2$: MOV 4(SP),R0 ; B.ADDR,* 1121* MOV 2(SP),R1 ; B.LEN,*R JSR PC,$ACHRO BHIS 3$ TRAP 236M%3$: MOV 4(SP),R0 ; B.ADDR,* 1123O JSR PC,$RELOM MOV R0,4(SP) ; *,B.ADDR MOVB #40,@PRIMARY ; 1125! MOV 2(SP),R1 ; B.LEN,* 1126P MOV R0,R2 ; B.ADDR,* MOV PRIMARY,R3 JSR PC,CH$COPY MOV R3,4(SP)M MOV R3,R0 ; B.ADDR,* 1127 SUB PRIMARY,R0  MOV PRIMARY,R4) MOV R0,R5 JSR PC,FSSE# TST R5 ; TRAILING.LENGTH 1128  BEQ 5$* JMP 38$ ; 1131"4$: MOVB #40,@PRIMARY ; 1139 MOV PRIMARY,R4 ; 1140 MOV #1,R5 JSR PC,FSS5$: MOV #PRI.PB,R1 ; 1143P JSR PC,SAVE.PARSE 2];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 60 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)R' CLR 22(SP) ; PRI.LOGICAL.TYP 1145+ MOVB PRI.PB+44,22(SP) ; *,PRI.LOGICAL.TYP5 MOV 14(SP),R3 ; 1147T JSR PC,EXPAND.FILESPECB CMP R0,#1 BNE 13$ CLR R0 ; 1149@ BISB PRI.PB+44,R0$ CMP R0,22(SP) ; *,PRI.LOGICAL.TYP BLOS 6$' CLR 22(SP) ; PRI.LOGICAL.TYP 1150P+ MOVB PRI.PB+44,22(SP) ; *,PRI.LOGICAL.TYPe6$: MOV 14(SP),R0 ; 1158 MOV 22(R0),4(SP) ; *,B.ADDR% MOV 24(R0),2(SP) ; *,B.LEN 1159  BEQ 9$ ; 1161R TST 4(SP) ; B.ADDR 1168 BNE 7$C TRAP 236 %7$: MOV 4(SP),R0 ; B.ADDR,* 1175B MOV 2(SP),R1 ; B.LEN,*. JSR PC,$ACHRO BHIS 8$ TRAP 236J%8$: MOV 4(SP),R0 ; B.ADDR,* 1177E JSR PC,$RELOM MOV R0,4(SP) ; *,B.ADDR MOV R0,R3 ; B.ADDR,* 1179 MOV 2(SP),R4 ; B.LEN,*( JSR PC,@20(SP)C MOV R3,4(SP) MOV R3,R0 ; B.ADDR,* 1180 SUB #SECONDARY,R0 MOV #SECONDARY,R4 MOV R0,R5 JSR PC,FSS # TST R5 ; TRAILING.LENGTH 1181E BEQ 10$ JMP 37$ ; 1188#9$: MOVB #40,SECONDARY ; 1197E MOV #SECONDARY,R4 ; 11980 MOV #1,R5 JSR PC,FSSM/10$: CMP 22(SP),#1 ; PRI.LOGICAL.TYP,* 1205$ BLOS 11$J CLR SCR.PB+4 ; 1208 CLR SCR.PB+6 ; 1209 CLR SCR.PB+10 ; 1210 CLR SCR.PB+12 ; 1211111$: JSR PC,MERGE ; 1218 CMP R0,#1 BNE 16$ CLR R0 ; 1220  BISB PRI.PB+44,R0 S];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 611W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)D$ CMP R0,22(SP) ; *,PRI.LOGICAL.TYP BLOS 12$: MOV 14(SP),R3 ; 1223L JSR PC,EXPAND.FILESPECJ CMP R0,#1 BNE 16$412$: MOV PRI.PB+2,22(SP) ; *,FLAGS.FOR.USER 1225 TST PRI.PB+6 ; 1231 13$: BNE 16$ TST PRI.PB+12 ; 12368 BNE 17$$ BIT #1,MUST.HAVE.DEVICE ; 1243 BEQ 14$ TRAP 244S14$: MOV 14(SP),R0 ; 1244  BIT #10200,26(R0) BNE 17$ MOV $SAHDB,KISAR6 ; 1248 MOV R0,R3 ; 1249 ADD #2,R3 MOV 10(SP),R4 MOV 12(SP),R5 JSR PC,$MPLUN ROL (SP)R MOV R2,20(SP) ROR (SP)T BCS 15$& CLR 16(SP) ; DO.ASSIGN.LUN 1255 BR 17$ ; 1249C,15$: MOV #SECONDARY,R0 ; *,DEV.PTR 1281& MOVB #123,(R0)+ ; *,DEV.PTR 1282& MOVB #131,(R0)+ ; *,DEV.PTR 1283% MOVB #72,(R0)+ ; *,DEV.PTR 1284U MOV #SECONDARY,R4 ; 12851 MOV #3,R5 JSR PC,FSS1 JSR PC,MERGE ; 1286 CMP R0,#1 BNE 16$ MOV 14(SP),R3 ; 1287  JSR PC,EXPAND.FILESPEC CMP R0,#1 BNE 16$ TST PRI.PB+6 ; 1292 00aoommmffDATA16$: BEQ 17$ JMP 73$-17$: BIT #1,16(SP) ; *,DO.ASSIGN.LUN 1303R BEQ 23$ MOV 14(SP),R0 BIT #10200,26(R0) BNE 23$ CMP PRI.PB+10,#3 ; 1330 BLO 19$ ; 1333 CLR R1 ; UNIT.NUMBER 1339 V];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 62 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)( MOV PRI.PB+12,R2 ; *,UNIT.PTR 1340 ADD #2,R2 ; *,UNIT.PTR18$: CLR R3 ; CHAR 1345 BISB (R2)+,R3 ; UNIT.PTR,CHAR CMP R3,#72 ; CHAR,*N BEQ 21$ CMP R3,#60 ; CHAR,* 1351T BLO 19$ CMP R3,#67 ; CHAR,*P BLOS 20$ 919$: MOV #IE.IDU.RETURN,6(SP) ; *,ASSIGN.LUN.ERRO 1354  BR 23$ ; 1353i)20$: MOV R1,R0 ; UNIT.NUMBER,* 1358 ASH #3,R0 ADD R3,R0 ; CHAR,* MOV R0,R1 ; *,UNIT.NUMBER  SUB #60,R1 ; *,UNIT.NUMBER BR 18$ ; 1345(#21$: MOV $SAHDB,KISAR6 ; 1375P MOV #2,R0 ; 1377 ADD 14(SP),R0 MOV R0,R3 TSTB (R3) BEQ 22$ MOV 10(SP),R4 ; 1379 MOV 12(SP),R5 MOV @PRI.PB+12,R0 MOV TERMINAL.LOGICAL.FLAG,R2T JSR PC,LUN.ASSIGN# MOV R0,6(SP) ; *,ASSIGN.LUN.ERROV MOV R1,20(SP) BR 23$ ; 1377R222$: MOV #IE.ILU.RETURN,6(SP) ; *,ASSIGN.LUN.ERRO(23$: BIT #1,MUST.HAVE.DEVICE ; 1401 BEQ 24$ JMP 89$*24$: TST 6(SP) ; ASSIGN.LUN.ERRO 1402 BNE 26$ MOV 14(SP),R0 BIT #10200,26(R0) BNE 26$( MOV #SECONDARY,R3 ; *,DEV.PTR 1426! MOV 20(SP),R0 ; UCB,* 1432, MOV 12(SP),R5 JSR PC,$MPLND MOV R2,20(SP) MOV #DV.REC,R1 ; 1440 BIS #DV.SDI,R1V BIS #DV.SQD,R1.) BIT U.CW1(R0),R1 ; *(REDIRECTED.UCB),*  BEQ 25$( CLR DO.DIRECTORY.DEFAULTING ; 1442%25$: MOV 20(SP),R0 ; UCB,* 1444P MOV U.DCB(R0),R2 ; *(UCB),DCB U];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 63EW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)4& SUB D.UCB(R2),R0 ; *(DCB),* 1449 MOV R0,R1 SXT R0, DIV D.UCBL(R2),R0 ; *(DCB),*R CLR R1 ; 1450S BISB D.UNIT(R2),R1 ; *(DCB),* ADD R1,R0& MOVB #137,(R3)+ ; *,DEV.PTR 1452/ MOVB D.NAM(R2),(R3)+ ; *(DCB),DEV.PTR 1453V0 MOVB D.NAM+1(R2),(R3)+ ; *(DCB),DEV.PTR 1454 JSR PC,DCBTA.BLI ; 1460% MOVB #72,(R3)+ ; *,DEV.PTR 14658 SUB #SECONDARY,R3 ; 1471P MOV #SECONDARY,R4 MOV R3,R5 JSR PC,FSS- CLR PRI.PB+10 ; 1477P CLR PRI.PB+12 ; 1478B JSR PC,MERGE ; 1479 CMP R0,#1 BNE 39$26$: CLR R3 ; 1488  CMP PRI.PB+14,#3R BLO 27$ INC R3B"27$: MOV PRI.PB+16,R0 ; 1489 CLR R2M CMPB 1(R0),#56; BNE 28$ INC R228$: CLR R1 ; 1490( CMPB 1(R0),#555 BNE 29$ INC R1229$: BIS R2,R1 ; 1489+ MOV R1,16(SP) ; *,MERGE.DIRECTORY 1488, MOV R3,R0 COM R0 $ BIC R0,16(SP) ; *,MERGE.DIRECTORY* BIT #1,DO.DIRECTORY.DEFAULTING ; 1492 BEQ 30$ MOV 14(SP),R0 ; 1493R BIT #10100,26(R0) BEQ 31$ 30$: JMP 63$31$: TST PRI.PB+16 ; 14946 BEQ 32$ CMP PRI.PB+14,#2 ; 1495 BEQ 32$+ BIT #1,16(SP) ; *,MERGE.DIRECTORY 14964 BEQ 30$32$: MOV 12(SP),R1 ; 1533I MOV T.CTX(R1),R0  BNE 34$ (];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 64EW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)O MOV T.UCB(R1),R0 ; 1537 BIT U.CW1(R0),#DV.PSE BNE 33$ MOV U.CTX(R0),R06 BR 34$Q 33$: CLR R0P34$: MOV R0,KISAR6 ; 15331 BEQ 35$ ; 1543" CLR R5 ; DEFAULT.LENGTH 1552& BISB @#140001,R5 ; *,DEFAULT.LENGTH' MOV R5,R1 ; DEFAULT.LENGTH,* 15531 MOV #-37774,R2R MOV #SECONDARY,R3 JSR PC,CH$COPY  BR 36$ ; 1533u&35$: CLR R5 ; DEFAULT.LENGTH 1556#36$: MOV #SECONDARY,R4 ; 1561C JSR PC,FSS- MOV R5,20(SP) BEQ 40$ ; 1562'37$: MOV #SECONDARY,PRIMARY ; 1569 38$: MOV #PRI.PB,R1 ; 1570 JSR PC,SAVE.PARSE MOV #-3440,PRI.PB ; 1571:39$: JMP 73$ ; 156400aonncccc40$: TST SCR.PB+16 ; 1577  BEQ 41$ CMP SCR.PB+14,#2 ; 1578 BEQ 41$ BIT #7,SCR.PB+2 ; 1579  BEQ 48$"41$: MOV #H.DUIC+1,R1 ; 1602 ADD 10(SP),R1 MOV R1,R0 MOV #H.DUIC,R2 ; 1603 ADD 10(SP),R2 MOV R2,R1 MOV $SAHDB,KISAR6 ; 1605,( MOV #SECONDARY,R5 ; *,DIR.PTR 1606& MOVB #133,(R5)+ ; *,DIR.PTR 1607 BITB #300,(R0) ; 1613 BEQ 42$ MOVB (R0),R2 ; 1616R ASH #-6,R2E BIC #177774,R2. ADD #60,R27 MOVB R2,(R5)+ ; *,DIR.PTR BR 43$ ; 1617;42$: BITB #70,(R0) ; 1620+ BEQ 44$43$: MOVB (R0),R2 ASH #-3,R2B BIC #177770,R2 ADD #60,R2: V];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 65PW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)6 MOVB R2,(R5)+ ; *,DIR.PTR44$: MOVB (R0),R2 ; 1621  BIC #177770,R2 ADD #60,R2  MOVB R2,(R5)+ ; *,DIR.PTR% MOVB #54,(R5)+ ; *,DIR.PTR 16232 BITB #300,(R1) ; 1628 BEQ 45$ MOVB (R1),R0 ; 1631 ASH #-6,R0Q BIC #177774,R0R ADD #60,R0# MOVB R0,(R5)+ ; *,DIR.PTR BR 46$ ; 1632o45$: BITB #70,(R1) ; 16359 BEQ 47$46$: MOVB (R1),R04 ASH #-3,R0g BIC #177770,R0o ADD #60,R0d MOVB R0,(R5)+ ; *,DIR.PTR47$: MOVB (R1),R0 ; 16366 BIC #177770,R0+ ADD #60,R0R MOVB R0,(R5)+ ; *,DIR.PTR& MOVB #135,(R5)+ ; *,DIR.PTR 1641 SUB #SECONDARY,R5 ; 1646  MOV #SECONDARY,R4 JSR PC,FSS/48$: BIT #1,16(SP) ; *,MERGE.DIRECTORY 1652) BEQ 62$( MOV PRI.PB+16,R2 ; *,USER.DIR 1671 INC R2 ; USER.DIR(+ MOV SCR.PB+36,R5 ; *,DEFAULT.DIR 16725 SUB #2,R5 ; *,DEFAULT.DIR MOV SCR.PB+36,R1 ; 1679 MOVB -1(R1),R0 ; *,BRACKETA MOV SCR.PB+16,R4 ; 1705)49$: CMPB (R2),#55 ; USER.DIR,* 1685 BNE 52$ INC R2 ; USER.DIR 1687(( CMPB (R5),#56 ; DEFAULT.DIR,* 1692 BEQ 59$ ; 1694)50$: CMP R5,R4 ; DEFAULT.DIR,* 1705, BEQ 49$ ; 1707( CMPB (R5),#56 ; DEFAULT.DIR,* 1709 BNE 51$ DEC R5 ; DEFAULT.DIR 1712 BR 49$ ; 1711U$51$: DEC R5 ; DEFAULT.DIR 1716 BR 50$ ; 1699#,52$: CMPB (R5),#56 ; DEFAULT.DIR,* 1724 BEQ 59$ ; 1726 MOV PRI.PB+16,R1 ; 1764 R];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 661W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)  ADD PRI.PB+14,R10 DEC R14% CMP R5,R4 ; DEFAULT.DIR,* 1731F BNE 55$% CMPB (R2),#56 ; USER.DIR,* 1741T BNE 53$ INC R2 ; USER.DIR 1748:% CMPB (R2),#56 ; USER.DIR,* 17540 BNE 53$ DEC R2 ; USER.DIR 1756D&53$: CMP R2,R1 ; USER.DIR,* 1764 BNE 57$ MOV #6,R3 ; *,I 1767$54$: INC R5 ; DEFAULT.DIR 1769( MOVB #60,(R5) ; *,DEFAULT.DIR 1770 SOB R3,54$ ; I,* 1767n BR 56$ ; 17319&55$: CMP R2,R1 ; USER.DIR,* 1783 BEQ 58$% CMPB (R2),#56 ; USER.DIR,* 1785R BEQ 56$ INC R5 ; DEFAULT.DIR 1788( MOVB #56,(R5) ; *,DEFAULT.DIR 1789&56$: CMP R2,R1 ; USER.DIR,* 1798 BEQ 58$$57$: INC R5 ; DEFAULT.DIR 18000 MOVB (R2)+,(R5) ; USER.DIR,DEFAULT.DIR 1801 BR 56$ ; 1798$58$: INC R5 ; DEFAULT.DIR 1809- MOVB R0,(R5) ; BRACKET,DEFAULT.DIR 18106 SUB R4,R5 ; 1811 INC R5S MOV #SECONDARY,R4 JSR PC,FSS  MOV R5,20(SP) BEQ 60$ ; 181759$: MOV #-720,R3 ; 1819 MOV R3,PRI.PB BR 61$ ; 1817B60$: MOV #1,R3$61$: CMP R3,#1 ; STATUS,* 1828 BEQ 62$# MOV #SECONDARY,PRIMARY ; 1835  MOV #PRI.PB,R1 ; 1836 JSR PC,SAVE.PARSE# MOV R3,PRI.PB ; STATUS,* 1837  BR 73$ ; 1830 62$: CLR PRI.PB+14 ; 18468 CLR PRI.PB+16 ; 1847  JSR PC,MERGE ; 1848$63$: MOVB #40,SECONDARY ; 1860 CLR R0 ; DO.MERGE 1861E MOV 14(SP),R2 ; 1862V MOV 26(R2),R1 $];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 67VW;X00aoommmffDATA1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)3 BIT #400,R1 BEQ 64$ CLR PRI.PB+6 ; 1865 CLR PRI.PB+4 ; 1866" MOV #1,R0 ; *,DO.MERGE 186764$: TSTB R1 ; 1869 BPL 65$ CLR PRI.PB+12 ; 1872P CLR PRI.PB+10 ; 1873V" MOV #1,R0 ; *,DO.MERGE 1874&65$: CMPB @PRI.PB+12,#137 ; 1880 BNE 66$ INC PRI.PB+12 ; 1883P DEC PRI.PB+10 ; 1884 " MOV #1,R0 ; *,DO.MERGE 188566$: BIT #100,R1 ; 1888 BEQ 67$ CLR PRI.PB+16 ; 18918 CLR PRI.PB+14 ; 1892B" MOV #1,R0 ; *,DO.MERGE 189367$: BIT #4,R1 ; 1895 BEQ 68$ CLR PRI.PB+22 ; 18980 CLR PRI.PB+20 ; 1899:" MOV #1,R0 ; *,DO.MERGE 190068$: BIT #2,R1 ; 1907 BEQ 69$ CLR PRI.PB+26 ; 1910  CLR PRI.PB+24 ; 1911C BR 70$ ; 1912 .69$: BIT #1,DO.DIRECTORY.DEFAULTING ; 1915 BEQ 71$ BIT #10000,R1 BNE 71$ MOVB #56,SECONDARY ; 1918&70$: MOV #1,R0 ; *,DO.MERGE 191971$: ROR R1 ; 19228 BCC 72$ CLR PRI.PB+32 ; 1925, CLR PRI.PB+30 ; 19267" MOV #1,R0 ; *,DO.MERGE 1927!72$: ROR R0 ; DO.MERGE 1929R BCC 73$ MOV #SECONDARY,R4 ; 1931, MOV #1,R5 JSR PC,FSST JSR PC,MERGE ; 1932(73$: BIT #1,MUST.HAVE.DEVICE ; 1944 BEQ 74$ JMP 89$74$: MOV 14(SP),R0 ; 1947T MOV 14(R0),4(SP) ; *,B.ADDR MOV PRI.PB+36,R0 ; 1948 BEQ 75$ M];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 682W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)  SUB PRIMARY,R0 ; 1950 ADD PRI.PB+34,R02 MOV R0,R3 ; *,RES.LENGTH BR 76$ ; 1948##75$: CLR R3 ; RES.LENGTH 1952 "76$: TST 4(SP) ; B.ADDR 1954 BEQ 78$" MOV 4(SP),R0 ; B.ADDR,* 1957 MOV #2,R1 JSR PC,$ACHKB BHIS 77$P TRAP 236D&77$: MOV 4(SP),R0 ; B.ADDR,* 1958 JSR PC,$RELOM MOV R0,R4 ; *,Pi& MOV R3,(R4) ; RES.LENGTH,P 195978$: TST PRI.PB+30 ; 19660 BEQ 79$ MOVB #73,@PRI.PB+3279$: MOV 14(SP),R0 ; 1971P MOV 10(R0),4(SP) ; *,B.ADDR% MOV 12(R0),2(SP) ; *,B.LEN 1972M" MOV 4(SP),R0 ; B.ADDR,* 1973 JSR PC,$RELOC MOV R1,R5 MOV R2,R4 MOV #PRI.PB,-(SP) ; 1974  MOV PRIMARY,-(SP) MOV 10(SP),-(SP) ; B.ADDR,* JSR PC,CONVERT.PARSEJ TST 10(SP) ; B.LEN 19763 BEQ 83$ TST 12(SP) ; B.ADDR 1980 BNE 80$ TRAP 236R'80$: MOV 12(SP),R0 ; B.ADDR,* 1986G MOV 10(SP),R1 ; B.LEN,* JSR PC,$ACHKB BHIS 81$$ TRAP 236,#81$: TST R3 ; RES.LENGTH 1988  BEQ 83$ MOV R3,R0 ; RES.LENGTH,* CMP R0,10(SP) ; *,B.LEN BLOS 82$ MOV 10(SP),R0 ; B.LEN,*82$: MOV KISAR5,R1 MOV PRIMARY,R2M MOV R5,R3 ; B.MAPPING,*  JSR PC,$BLXIO483$: MOV 30(SP),PRI.PB+2 ; FLAGS.FOR.USER,* 1995$ BIT #1,CANNOT.HAVE.NODE ; 1996 BEQ 84$ TST PRI.PB+6 T];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 69MW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)N BEQ 84$ MOV #-270,PRI.PB ; 199784$: MOV 22(SP),R0 ; 1998L MOV 16(R0),12(SP) ; *,B.ADDR;& MOV 20(R0),10(SP) ; *,B.LEN 1999 BEQ 88$ ; 2001 TST 12(SP) ; B.ADDR 2005: BNE 85$ TRAP 236 '85$: MOV 12(SP),R0 ; B.ADDR,* 2011T MOV 10(SP),R1 ; B.LEN,* JSR PC,$ACHKB BHIS 86$D TRAP 236a'86$: MOV 12(SP),R0 ; B.ADDR,* 2013  JSR PC,$RELOC MOV R1,R5 MOV R2,12(SP)" MOV 10(SP),R0 ; B.LEN,* 2014 CMP R0,#46X BLOS 87$P MOV #46,R0587$: MOV KISAR5,R1 MOV #PRI.PB,R2P MOV R5,R3 ; B.MAPPING,*P MOV 12(SP),R4 ; B.ADDR,*0 JSR PC,$BLXIO88$: ADD #6,SP ; 1946*89$: TST 6(SP) ; ASSIGN.LUN.ERRO 2024 BEQ 90$$ JSR PC,@6(SP) ; *,ASSIGN.LUN.ERRO90$: CMP PRI.PB,#1 ; 2025D BEQ 91$ TRAP 353(91$: ADD #24,SP ; 1044H RTS PC 9; Routine Size: 1005 words, Routine Base: $CODE$ + 1074J/; Maximum stack depth pe00apnnccccr invocation: 21 words( .NLIST; .DSABL LSB0 .NLIST BIN,LOC .LIST V];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 70;^;X1.10 Expand file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (25).; 2029 1 %SBTTL 'Expand file specification'; 2030 1 GLOBAL_FOR_DEBUGC; 2031 1 ROUTINE expand_filespec (dpb_ptr) : expand_filespec_l = ; 2032 1 ; 2033 1 !++, ; 2034 1 ! %; 2035 1 ! FUNCTIONAL DESCRIPTION:e ; 2036 1 !2I; 2037 1 ! This routine expands a file specification by merging in the H; 2038 1 ! translations of any logicals present in the initial input.J; 2039 1 ! The string must be in the primary buffer. It must be parsedN; 2040 1 ! already. The output is in the primary buffer and in the primary; 2041 1 ! parse block. ; 2042 1 ! .; 2043 1 ! The following algorithm is used:; 2044 1 ! O; 2045 1 ! 1) Separate a potential logical from the string, and put it in a eK; 2046 1 ! buffer. If there is no potential logical, return success.mU; 2047 1 ! The primary buffer and parse block will always contain file elements.5; 2048 1 ! that we know are not to be expanded.r ; 2049 1 !a7; 2050 1 ! 2) Repeat until we run out of iterations:y ; 2051 1 !t'; 2052 1 ! 2.1) Expand the logical U; 2053 1 ! 2.2) If a logical was found, copy the expand buffer to the secondary M; 2054 1 ! buffer. If not, copy the unexpanded logical to the secondary.6D; 2055 1 ! Set the terminal logical flag if status was terminal.); 2056 1 ! 2.3) Parse the secondary.sS; 2057 1 ! 2.4) If the status of the expand was success, separate the logicalb<; 2058 1 ! from the rest of the string in the secondary.T; 2059 1 ! 2.5) If there is anything in the secondary buffer, merge it with the; 2060 1 ! primary.oS; 2061 1 ! 2.6) If the status of both the expand and the separate was success,f2; 2062 1 ! go again; otherwise return success. ; 2063 1 ! M; 2064 1 ! 3.0) If we got here, too many iterations, return bad recursive.r; 2065 1 ! ; 2066 1 ! ; 2067 1 ! IMPLICIT INPUTS: ; 2068 1 !,R; 2069 1 ! The file specification parsed in the primary buffer and parse block. ; 2070 1 ! +; 2071 1 ! The translation inhibit mask.b ; 2072 1 ! ; 2073 1 !--0 ; 2074 1 ; 2075 2 BEGIN ; 2076 2 ; 2077 2 MAPeB; 2078 2 dpb_ptr : REF VECTOR; ! Treat the DPB as a vector ; 2079 2 ; 2080 2 LOCAL .; 2081 2 eqv_ptr : REF VECTOR [, BYTE],; 2082 2 eqv_len, i];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 719^;X1.10 Expand file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (25); 2083 2 status,n; 2084 2 mstatus; ; 2085 2 ; 2086 2 OWN 8; 2087 2 log_hold : VECTOR [ logical_size, BYTE],; 2088 2 log_len; ; 2089 2 T; 2090 2 ROUTINE separate_logical ( dpb_ptr, parse_block ) : separate_logical_l = ; 2091 2 ; 2092 2 !++ ; 2093 2 !%; 2094 2 ! FUNCTIONAL DESCRIPTION: ; 2095 2 !8P; 2096 2 ! This routine strips off the element of the string that could be a M; 2097 2 ! logical and puts it in a special buffer to be used for logical tS; 2098 2 ! expansion. It takes the parse block of the string to be processed asoQ; 2099 2 ! input. It returns success if an element has been removed from the 0F; 2100 2 ! string, and failure if the string has not been modified. ; 2101 2 ! ; 2102 2 !--+ ; 2103 2 ; 2104 3 BEGINC ; 2105 3 ; 2106 3 MAP8;; 2107 3 parse_block : REF BLOCK FIELD (parse_block_f),rC; 2108 3 dpb_ptr : REF VECTOR; ! Treat the DPB as a vectorb ; 2109 3 W; 2110 3 ! Strip off the logical and put it in log_hold, with the length in log_len.p ; 2111 3 _; 2112 3 CASE .parse_block [logical_type] from logical_type_none TO logical_type_node OF ; 2100a papmmmffDATA13 3 SET ; 2114 3 "; 2115 3 [logical_type_node] :5; 2116 3 IF (.dpb_ptr [11] AND FS$NOD) EQLU 0E; 2117 3 THEN ; 2118 4 BEGIN ; 2119 4 !oE; 2120 4 ! A node specification is present - it may be a logicalV; 2121 4 !ha; 2122 4 ch$copy (.parse_block [node_len], .parse_block [node_addr], log_hold [0]; log_len);t*; 2123 4 parse_block [node_addr] = 0;); 2124 4 parse_block [node_len] = 0;f,; 2125 4 parse_block [access_addr] = 0;+; 2126 4 parse_block [access_len] = 0; P; 2127 4 parse_block [flags] = .parse_block [flags] AND NOT FS$NOD; !PKW117; 2128 4 END ; 2129 3 ELSE; 2130 3 RETURN error; ; 2131 3 $; 2132 3 [logical_type_device] :5; 2133 3 IF (.dpb_ptr [11] AND FS$DEV) EQLU 0_; 2134 3 THENe; 2135 4 BEGINo; 2136 4 !e t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 721^;X1.10 Expand file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (25)G; 2137 4 ! A device specification is present - it may be a logical ; 2138 4 ! e; 2139 4 ch$copy (.parse_block [device_len], .parse_block [device_addr], log_hold [0]; log_len);,; 2140 4 parse_block [device_addr] = 0;+; 2141 4 parse_block [device_len] = 0; H; 2142 4 parse_block [flags] = .parse_block [flags] AND NOT FS$DEV;; 2143 4 END1; 2144 3 ELSEP; 2145 3 RETURN error; ; 2146 3 &; 2147 3 [logical_type_filename] :5; 2148 3 IF (.dpb_ptr [11] AND FS$NAM) EQLU 0i; 2149 3 THENm; 2150 4 BEGIN ; 2151 4 ! T; 2152 4 ! A standalone filename specification is present - it may be a logical; 2153 4 ! i; 2154 4 ch$copy (.parse_block [filename_len], .parse_block [filename_addr], log_hold [0]; log_len);_.; 2155 4 parse_block [filename_addr] = 0;-; 2156 4 parse_block [filename_len] = 0;PT; 2157 4 parse_block [flags] = .parse_block [flags] AND NOT (FS$NAM OR FS$WNA);; 2158 4 END ; 2159 3 ELSEA; 2160 3 RETURN error;T ; 2161 3 "; 2162 3 [logical_type_none] :; 2163 3 RETURN error;; 2164 3 TES;p ; 2165 3 /; 2166 3 log_len = .log_len - log_hold [0];h; 2167 3 RETURN success; ; 2168 3 0; 2169 2 END; ! Routine separate_logical .NLIST  .LIST BIN,LOC .LIST .PSECT $OWN$, D LOG.HOLD: .BLKB 377 .EVENLOG.LEN:.BLKW 1a2 .SBTTL SEPARATE.LOGICAL Expand file specification .PSECT $CODE$, RO  .NLIST .ENABL LSB  .LISTSEPARATE.LOGICAL:U JSR R1,$SAVE3 ; 2090  CLR R0 ; 2112n ]];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 73o^;X1.10 Expand file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (25)$ BISB 44(R4),R0 ; *(PARSE.BLOCK),* ASL R0.# ADD P.AAA(R0),PC ; Case dispatchO,2$: BIT #400,26(R3) ; *,*(DPB.PTR) 2116 BNE 6$ ) MOV 4(R4),R1 ; *(PARSE.BLOCK),* 2122" MOV 6(R4),R2 ; *(PARSE.BLOCK),* MOV #LOG.HOLD,R3 JSR PC,CH$COPYU MOV R3,LOG.LEN % CLR 6(R4) ; *(PARSE.BLOCK) 2123]% CLR 4(R4) ; *(PARSE.BLOCK) 2124-& CLR 42(R4) ; *(PARSE.BLOCK) 2125& CLR 40(R4) ; *(PARSE.BLOCK) 2126+ BIC #400,2(R4) ; *,*(PARSE.BLOCK) 2127E BR 5$ ; 2116'3$: TSTB 26(R3) ; *(DPB.PTR) 2133) BMI 6$R* MOV 10(R4),R1 ; *(PARSE.BLOCK),* 2139# MOV 12(R4),R2 ; *(PARSE.BLOCK),*  MOV #LOG.HOLD,R3V JSR PC,CH$COPYA MOV R3,LOG.LEN2& CLR 12(R4) ; *(PARSE.BLOCK) 2140& CLR 10(R4) ; *(PARSE.BLOCK) 2141+ BIC #200,2(R4) ; *,*(PARSE.BLOCK) 2142) BR 5$ ; 2133*4$: BIT #4,26(R3) ; *,*(DPB.PTR) 2148 BNE 6$B* MOV 20(R4),R1 ; *(PARSE.BLOCK),* 2154# MOV 22(R4),R2 ; *(PARSE.BLOCK),*S MOV #LOG.HOLD,R3B JSR PC,CH$COPY6 MOV R3,LOG.LEN & CLR 22(R4) ; *(PARSE.BLOCK) 2155& CLR 20(R4) ; *(PARSE.BLOCK) 2156* BIC #44,2(R4) ; *,*(PARSE.BLOCK) 2157%5$: SUB #LOG.HOLD,LOG.LEN 00apnncccc ; 2166, MOV #1,R0 ; 2104 RTS PCB6$: CLR R0 ; 2090 RTS PCR7; Routine Size: 84 words, Routine Base: $CODE$ + 50264.; Maximum stack depth per invocation: 5 words .PSECT $PLIT$, RO , D 6P.AAA: ; CASE Table for SEPARATE.LOGICA+0014 21121$: .WORD 224 ; [6$]M .WORD 136 ; [4$] .WORD 64 ; [3$], .WORD 0 ; [2$] ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 74B^;X1.10 Expand file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (25) .NLIST .DSABL LSBR .NLIST BIN,LOCe .LIST ; 2170 2 K; 2171 2 terminal_logical_flag = false; ! Init the flag to not terminal h; 2172 2 status = separate_logical ( .dpb_ptr, pri_pb ); ! Strip off the logical in the initial input(; 2173 2 IF .status EQLU success THEN ; 2174 2 !2Q; 2175 2 ! For no more than the maximum interation count, translate and merge,1; 2176 2 ! if possible ; 2177 2 !c; 2178 3 BEGIN11; 2179 3 DECR i FROM iteration_max TO 1 DO; 2180 4 BEGINSI; 2181 4 ! I assume that the status returned will be success, error,l4; 2182 4 ! or the successful status of terminal; 2183 4 !sS; 2184 4 status = find_equivalence (log_hold [0], .log_len; eqv_ptr, eqv_len); (; 2185 4 IF .status EQLU error THENJ; 2186 4 ch$copy (.log_len, log_hold [0], secondary [0]; eqv_ptr); 2187 4 ELSE; 2188 5 BEGINlG; 2189 5 ch$copy (.eqv_len, .eqv_ptr, secondary [0]; eqv_ptr);t/; 2190 5 IF .status EQLU terminal THEN1,; 2191 5 terminal_logical_flag = true;; 2192 4 END;N; 2193 4 fss (secondary [0], .eqv_ptr - secondary [0]; eqv_ptr, eqv_len); ; 2194 4 IF .eqv_len NEQU 0; 2195 4 THEN; 2196 5 BEGIN ; 2197 5 ; 2198 5 !N5; 2199 5 ! Settup the bad string for return.c; 2200 5 !; 2201 5 merge();Q; 2202 5 RETURN pri_pb [fss_status] = bad_char; ! Settup the error code_; 2203 5 ; 2204 4 END;*; 2205 4 IF .status EQLU success THENA; 2206 4 status = separate_logical ( .dpb_ptr, scr_pb );yu; 2207 4 IF (.scr_pb [node_len] NEQU 0) OR (.scr_pb [device_len] NEQU 0) OR (.scr_pb [directory_len] NEQU 0) OR u; 2208 4 (.scr_pb [filename_len] NEQU 0) OR (.scr_pb [type_len] NEQU 0) OR (.scr_pb [version_len] NEQU 0) OR V; 2209 4 (.scr_pb [trailing_len] NEQU 0) OR (.scr_pb [access_len] NEQU 0) THEN; 2210 5 BEGINd!; 2211 5 mstatus = merge(); S; 2212 5 IF .mstatus NEQU success THEN RETURN pri_pb [fss_status] = .mstatus;p; 2213 4 END;:; 2214 4 IF .status NEQU success THEN RETURN success;; 2215 3 END; ; 2216 3 !  r];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 75n^;X1.10 Expand file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (25)V; 2217 3 ! If we got here, then the number of iterations exceeded iteration_max; 2218 3 !2O; 2219 3 RETURN pri_pb [fss_status] = bad_recursive; ! Return error code ; 2220 3 END; 2221 2 ELSE; 2222 2 RETURN success;u; 2223 1 END; .NLISTD .LIST BIN,LOC .LIST1 .SBTTL EXPAND.FILESPEC Expand file specification: .PSECT $CODE$, RO  .NLIST .ENABL LSBX .LISTEXPAND.FILESPEC: JSR R1,$SAVE5 ; 2031[ SUB #14,SPR MOV R3,12(SP)& CLR TERMINAL.LOGICAL.FLAG ; 2171 MOV #PRI.PB,R4 ; 2172 JSR PC,SEPARATE.LOGICAL MOV R0,10(SP) ; *,STATUS9 CMP R0,#1 ; STATUS,* 2173 BNE 9$c MOV #12,6(SP) ; *,I 2179 !1$: MOV #LOG.HOLD,R1 ; 2184 MOV LOG.LEN,R2E JSR PC,FIND.EQUIVALENCE MOV R0,10(SP) ; *,STATUSL MOV R1,2(SP). MOV R2,(SP) TST R0 ; STATUS 2185t BNE 2$S MOV LOG.LEN,R1 ; 2186 MOV #LOG.HOLD,R2T MOV #SECONDARY,R3 JSR PC,CH$COPY; MOV R3,2(SP)B BR 3$ ; 2185&2$: MOV (SP),R1 ; EQV.LEN,* 218900appmmmffDATA MOV 2(SP),R2 ; EQV.PTR,*1 MOV #SECONDARY,R3 JSR PC,CH$COPY, MOV R3,2(SP)A# CMP 10(SP),#3 ; STATUS,* 21903 BNE 3$c( MOV #1,TERMINAL.LOGICAL.FLAG ; 2191&3$: MOV 2(SP),R1 ; EQV.PTR,* 2193 SUB #SECONDARY,R1 MOV #SECONDARY,R4 MOV R1,R5 S];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 76 ^;X1.10 Expand file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (25) JSR PC,FSS MOV R4,2(SP); MOV R5,(SP) BEQ 4$ ; 2194  JSR PC,MERGE ; 2201 MOV #-3440,R0 ; 2202, BR 8$&4$: CMP 10(SP),#1 ; STATUS,* 2205 BNE 5$M MOV 12(SP),R3 ; 2206  MOV #SCR.PB,R4  JSR PC,SEPARATE.LOGICAL MOV R0,10(SP) ; *,STATUSV5$: TST SCR.PB+4 ; 2207 BNE 6$o TST SCR.PB+10 BNE 6$  TST SCR.PB+14 BNE 6$1 TST SCR.PB+20 ; 22087 BNE 6$0 TST SCR.PB+24 BNE 6$o TST SCR.PB+30 BNE 6$[ TST SCR.PB+34 ; 22090 BNE 6$ TST SCR.PB+40 BEQ 7$P6$: JSR PC,MERGE ; 2211  MOV R0,4(SP) ; *,MSTATUS ! CMP R0,#1 ; MSTATUS,* 2212, BNE 8$&7$: CMP 10(SP),#1 ; STATUS,* 2214 BNE 9$ DEC 6(SP) ; I 2179 BNE 1$C MOV #-3230,R0 ; 2219G8$: MOV R0,PRI.PB) BR 10$ ; 2222 9$: MOV #1,R0 10$: ADD #14,SP ; 20310 RTS PC 8; Routine Size: 138 words, Routine Base: $CODE$ + 5276/; Maximum stack depth per invocation: 13 words .NLIST .DSABL LSB4 .NLIST BIN,LOCB .LIST ; 2224 1 Q P];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 771^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26).; 2225 1 %SBTTL 'Merge file specifications'; 2226 1 GLOBAL_FOR_DEBUG; 2227 1 ROUTINE merge =S ; 2228 1 ; 2229 1 !++ ; 2230 1 !1%; 2231 1 ! FUNCTIONAL DESCRIPTION: ; 2232 1 ! L; 2233 1 ! Merge the primary and secondary file specifications. For eachN; 2234 1 ! component of the file specification, copy the piece found in theL; 2235 1 ! primary if present, or copy the piece from the secondary. TheL; 2236 1 ! result is put in merged. At the end the primary string is theE; 2237 1 ! merged result and the primary parse block is filled in.2 ; 2238 1 !eM; 2239 1 ! The handling of a file specification containing a quoted stringLP; 2240 1 ! is slightly different. A quoted string name in the primary stringS; 2241 1 ! inhibits the inclusion of both the filename and type, and the versionh(; 2242 1 ! if a node name is present. ; 2243 1 !r; 2244 1 ! IMPLICIT INPUTS: ; 2245 1 !2'; 2246 1 ! Buffers and parse blocks.e ; 2247 1 !s; 2248 1 ! IMPLICIT OUTPUTS:d ; 2249 1 ! 1; 2250 1 ! The primary parse block is updated. ; 2251 1 !h; 2252 1 !--i ; 2253 1 ; 2254 2 BEGINt ; 2255 2 ; 2256 2 !sR; 2257 2 ! A node spec followed by a quoted string with nothing else should notT; 2258 2 ! have anything merged into it other than a node name on the local node. ; 2259 2 !so; 2260 3 IF ((.pri_pb [flags] AND (FS$VER OR FS$TYP OR FS$NAM OR FS$DIR OR FS$DEV OR FS$NOD OR FS$QUO)) EQLU 7; 2261 3 (FS$NOD OR FS$QUO OR FS$NAM OR FS$TYP)) ; 2262 3 ; 2263 2 OR ; 2264 2 ; 2265 2 !2N; 2266 2 ! If the primary string has has anything other than a node and theN; 2267 2 ! secondary string is a node name followed by a quoted string thenN; 2268 2 ! everything in the secondary string except for the node should be; 2269 2 ! gotten rid of. ; 2270 2 !0 ; 2271 2 c; 2272 2 ((.pri_pb [flags] AND (FS$DIR OR FS$NAM OR FS$TYP OR FS$VER OR FS$QUO)) NEQU 0) AND m; 2273 3 ((.scr_pb [flags] AND (FS$VER OR FS$TYP OR FS$NAM OR FS$DIR OR FS$DEV OR FS$NOD OR FS$QUO)) EQLU8; 2274 3 (FS$NOD OR FS$QUO OR FS$NAM OR FS$TYP)); 2275 2 THEN; 2276 3 BEGINd); 2277 3 scr_pb [device_addr] = 0;t(; 2278 3 scr_pb [device_len] = 0; h];DRPFN Logical Name Directives 00a"pnncccc 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 78^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26),; 2279 3 scr_pb [directory_addr] = 0;+; 2280 3 scr_pb [directory_len] = 0;O+; 2281 3 scr_pb [filename_addr] = 0;4*; 2282 3 scr_pb [filename_len] = 0;'; 2283 3 scr_pb [type_addr] = 0;E&; 2284 3 scr_pb [type_len] = 0;*; 2285 3 scr_pb [version_addr] = 0;); 2286 3 scr_pb [version_len] = 0; @; 2287 3 IF .scr_pb [logical_type] NEQU logical_type_node; 2288 3 THEN7; 2289 3 scr_pb [logical_type] = logical_type_none;.; 2290 2 END; ; 2291 2 ; 2292 2 !dP; 2293 2 ! Copy the lengths and pointers into the primary parse block for allS; 2294 2 ! parts of the file specification to be used. In the process, form thebP; 2295 2 ! updated status mask. We are only going to set bits in the status. ; 2296 2 ! (; 2297 2 IF .pri_pb [node_len] EQLU 0; 2298 2 THEN ; 2299 2 B; 2300 2 IF (pri_pb [node_len] = .scr_pb [node_len]) NEQU 0; 2301 2 THEN; 2302 3 BEGIN8; 2303 3 pri_pb [flags] = .pri_pb [flags] OR FS$NOD;6; 2304 3 pri_pb [node_addr] = .scr_pb [node_addr];8; 2305 3 pri_pb [access_len] = .scr_pb [access_len];:; 2306 3 pri_pb [access_addr] = .scr_pb [access_addr];; 2307 2 END;e ; 2308 2 *; 2309 2 IF .pri_pb [device_len] EQLU 0; 2310 2 THEN ; 2311 2 F; 2312 2 IF (pri_pb [device_len] = .scr_pb [device_len]) NEQU 0; 2313 2 THEN; 2314 3 BEGIN8; 2315 3 pri_pb [flags] = .pri_pb [flags] OR FS$DEV;:; 2316 3 pri_pb [device_addr] = .scr_pb [device_addr];; 2317 2 END;n ; 2318 2 -; 2319 2 IF .pri_pb [directory_len] EQLU 0_; 2320 2 THEN ; 2321 2 L; 2322 2 IF (pri_pb [directory_len] = .scr_pb [directory_len]) NEQU 0; 2323 2 THEN; 2324 3 BEGINZ; 2325 3 pri_pb [flags] = .pri_pb [flags] OR (.scr_pb [flags] AND (FS$DIR OR FS$WDI));@; 2326 3 pri_pb [directory_addr] = .scr_pb [directory_addr];; 2327 2 END;i ; 2328 2 G; 2329 2 IF ((.pri_pb [flags] OR .scr_pb [flags]) AND FS$QUO) EQLU 0d; 2330 2 THEN; 2331 3 BEGIN8 ; 2332 3  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 79[^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26); 2333 3 !s?; 2334 3 ! Here because neither string contains a quotedC; 2335 3 ! filespec. Handle the filename, type, and version #; 2336 3 ! in the usual way.9; 2337 3 !l0; 2338 3 IF .pri_pb [filename_len] EQLU 0; 2339 3 THEN ; 2340 3 G; 2341 3 IF (pri_pb [filename_len] = .scr_pb [filename_len]) NEQU 01; 2342 3 THEN4; 2343 4 BEGIN^; 2344 4 pri_pb [flags] = .pri_pb [flags] OR (.scr_pb [flags] AND (FS$NAM OR FS$WNA));B; 2345 4 pri_pb [filename_addr] = .scr_pb [filename_addr];; 2346 3 END;3 ; 2347 3 ,; 2348 3 IF .pri_pb [type_len] EQLU 0; 2349 3 THEN ; 2350 3 ?; 2351 3 IF (pri_pb [type_len] = .scr_pb [type_len]) NEQU 0n; 2352 3 THEN ; 2353 4 BEGIN^; 2354 4 pri_pb [flags] = .pri_pb [flags] OR (.scr_pb [flags] AND (FS$TYP OR FS$WTY));:; 2355 4 pri_pb [type_addr] = .scr_pb [type_addr];; 2356 3 END;p ; 2357 3 /; 2358 3 IF .pri_pb [version_len] EQLU 0l; 2359 3 THEN ; 2360 3 E; 2361 3 IF (pri_pb [version_len] = .scr_pb [version_len]) NEQU 0y; 2362 3 THEN ; 2363 4 BEGIN^; 2364 4 pri_pb [flags] = .pri_pb [flags] OR (.scr_pb [flags] AND (FS$VER OR FS$WVE));@; 2365 4 pri_pb [version_addr] = .scr_pb [version_addr];; 2366 3 END;s ; 2367 3 ; 2368 3 END5; 2369 2 ELSE; 2370 3 BEGINp ; 2371 3 ; 2372 3 !S; 2373 3 ! We are here because one or the other (or both) of the primary andP; 2374 3 00a*ppmmmffDATA ! secondary strings contain a quoted file specification. If theS; 2375 3 ! primary string contains either a filename or type then don't copyiA; 2376 3 ! either the filename or type from the secondary. R; 2377 3 ! If addition, if the primary includes a node name and the primaryX; 2378 3 ! has a filename, then don't copy the version number from the secondary.; 2379 3 ! N; 2380 3 IF .pri_pb [filename_len] EQLU 0 AND .pri_pb [type_len] EQLU 0; 2381 3 THEN; 2382 4 BEGIN ; 2383 4 ; 2384 4 !E; 2385 4 ! We are here because the primary string has no filenamemF; 2386 4 ! or type and the secondary string has a quoted filename. r];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 80p^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26)E; 2387 4 ! In this case the merged string will contain the quotedD+; 2388 4 ! filespec from the secondary.H; 2389 4 !L; 2390 4 pri_pb [flags] = .pri_pb [flags] OR FS$NAM OR FS$QUO OR FS$TYP;<; 2391 4 pri_pb [filename_len] = .scr_pb [filename_len];>; 2392 4 pri_pb [filename_addr] = .scr_pb [filename_addr];; 2393 3 END;- ; 2394 3 ; 2395 3 ! K; 2396 3 ! If the primary string has no version the version from the:E; 2397 3 ! secondary string will be merged in if there is one. ; 2398 3 !iM; 2399 3 IF .pri_pb [node_len] EQLU 0 AND .pri_pb [version_len] EQLU 0 ; 2400 3 THENE; 2401 3 IF (pri_pb [version_len] = .scr_pb [version_len]) NEQU 0 ; 2402 3 THEN_; 2403 4 BEGIN^; 2404 4 pri_pb [flags] = .pri_pb [flags] OR (.scr_pb [flags] AND (FS$VER OR FS$WVE));@; 2405 4 pri_pb [version_addr] = .scr_pb [version_addr];; 2406 3 END;v ; 2407 3 ; 2408 2 END; ; 2409 2 ; 2410 3 BEGINn ; 2411 3 ; 2412 3 ! @; 2413 3 ! Copy each of the substrings into the output bufferA; 2414 3 ! and update the pointers to point to the new buffer.p ; 2415 3 ! ; 2416 3 LOCALlI; 2417 3 pri_pb_p : REF VECTOR, ! Pointer to primary parse blockp*; 2418 3 status, ! Merge status; 2419 3 current_len,; 2420 3 total_len,; 2421 3 temp;b ; 2422 3 ; 2423 3 REGISTER; 2424 3 o_ptr; ; 2425 3 ; 2426 3 total_len = 0;; 2427 3 status = 1; &; 2428 3 pri_pb [trailing_len] = 0;'; 2429 3 pri_pb [trailing_addr] = 0; +; 2430 3 pri_pb_p = pri_pb [fss_status];t; 2431 3 o_ptr = merged [0]; ; 2432 3 ); 2433 3 INCRU i FROM 0 TO 5*2 BY 2 DOO; 2434 4 BEGINrB; 2435 4 current_len = .pri_pb_p [.i + 2]; ! Get the length6; 2436 4 total_len = .total_len + .current_len; ; 2437 4 1; 2438 4 IF .total_len GTRU file_spec_size ; 2439 4 THEN; 2440 5 BEGIN e];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 81r^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26) ; 2441 5 ; 2442 5 !G; 2443 5 ! Copy as much as will fit, then update the parse block torH; 2444 5 ! reflect the actual amount returned. I'm not sure if thisB; 2445 5 ! exactly the best way of dealing with the problem...;; 2446 5 ! How do you determine the real length needed? C; 2447 5 ! Here's how.... We will initialize the length of theAG; 2448 5 ! trailing string to 0 and on completion store the address B; 2449 5 ! of the next character following. This will make itC; 2450 5 ! easy to determine the length of the expanded string; G; 2451 5 ! just subtract the buffer beginning from [trailing_addr].rE; 2452 5 ! For the cases where the buffer overflows, we'll updateiB; 2453 5 ! the length to include the amount that wouldn't fit.; 2454 5 !c; 2455 5 pri_pb [trailing_addr] = merged [0] + file_spec_size; ! Get address of one past bufferg_; 2456 5 pri_pb [tra00a2pnncccciling_len] = .total_len - file_spec_size; ! Set to the amount attempted ; 2457 5 a; 2458 5 IF (current_len = .current_len - .pri_pb [trailing_len]) LSS 0 THEN current_len = 0;t ; 2459 5 (; 2460 5 ! Can't be less than 07; 2461 5 status = bad_size; ! Set eventual statusi; 2462 4 END;e ; 2463 4 ; 2464 5 BEGINu ; 2465 5 ; 2466 5 LOCAL ; 2467 5 i_ptr;d ; 2468 5 B; 2469 5 i_ptr = .pri_pb_p [.i + 2 + 1]; ! Get the addressZ; 2470 5 IF .i_ptr NEQA 0 THEN pri_pb_p [.i + 2 + 1] = .o_ptr; ! Update the addressG; 2471 5 ch$move (.current_len, i_ptr, o_ptr); ! Move the stringe; 2472 4 END; ; 2473 4 ; 2474 3 END; ! INCR ; 2475 3 ; 2476 3 !1Q; 2477 3 ! If the trailing length is non zero leave the trailing address aloneT; 2478 3 ! because it has been settup by an overflow condition. Otherwise settup#; 2479 3 ! the trailing address.p ; 2480 3 ! c; 2481 3 IF .pri_pb [trailing_len] EQLU 0 THEN pri_pb [trailing_addr] = merged [0] + .total_len;a ; 2482 3 ; 2483 3 ! ;; 2484 3 ! Settup the access control string information. ; 2485 3 !N*; 2486 3 IF .pri_pb [access_len] NEQU 0; 2487 3 THENk; 2488 3 pri_pb [access_addr] = .pri_pb [node_addr] + .pri_pb [node_len] - .pri_pb [access_len] - 2;8 ; 2489 3 ; 2490 3 !tC; 2491 3 ! Update the logical type. Make it the max of the two.i ; 2492 3 !Z; 2493 3 pri_pb [logical_type] = maxu (.pri_pb [logical_type], .scr_pb [logical_type]);*; 2494 3 pri_pb [fss_status] = .status; 3];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 82 ^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26)E; 2495 3 temp = merged [0]; ! Switch primary and merged buffers9!; 2496 3 merged = primary [0]; ; 2497 3 primary = .temp;; 2498 3 RETURN .status; ; 2499 2 END;; 2500 1 END; .NLIST  .LIST BIN,LOC .LIST' .SBTTL MERGE Merge file specifications  .NLIST[ .ENABL LSB  .LIST!MERGE: JSR R1,$SAVE5 ; 2227e CMP -(SP),-(SP) MOV PRI.PB+2,R0 ; 22602 BIC #175070,R0X CMP R0,#2406e BEQ 1$a BIT #2107,PRI.PB+2 ; 2272 BEQ 2$R MOV SCR.PB+2,R0 ; 22734 BIC #175070,R0e CMP R0,#2406t BNE 2$y1$: CLR SCR.PB+12 ; 2277 CLR SCR.PB+10 ; 2278  CLR SCR.PB+16 ; 2279  CLR SCR.PB+14 ; 2280  CLR SCR.PB+22 ; 2281; CLR SCR.PB+20 ; 2282. CLR SCR.PB+26 ; 2283i CLR SCR.PB+24 ; 2284 CLR SCR.PB+32 ; 2285J CLR SCR.PB+30 ; 2286C CMPB SCR.PB+44,#3 ; 2287  BEQ 2$6 CLRB SCR.PB+44 ; 22892$: TST PRI.PB+4 ; 2297I BNE 3$ " MOV SCR.PB+4,PRI.PB+4 ; 2300 BEQ 3$2 BIS #400,PRI.PB+2 ; 23032" MOV SCR.PB+6,PRI.PB+6 ; 2304$ MOV SCR.PB+40,PRI.PB+40 ; 2305$ MOV SCR.PB+42,PRI.PB+42 ; 23063$: TST PRI.PB+10 ; 2309 BNE 4$ $ MOV SCR.PB+10,PRI.PB+10 ; 2312 BEQ 4$R BIS #200,PRI.PB+2 ; 2315R$ MOV SCR.PB+12,PRI.PB+12 ; 23164$: TST PRI.PB+14 ; 2319 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 83B^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26) BNE 5$$ MOV SCR.PB+14,PRI.PB+14 ; 2322 BEQ 5$+ MOV SCR.PB+2,R0 ; 2325S BIC #176677,R02 BIS R0,PRI.PB+2$ MOV SCR.PB+16,PRI.PB+16 ; 2326!5$: MOV PRI.PB+20,R0 ; 23382 MOV PRI.PB+2,R1 ; 2329  BIS SCR.PB+2,R1 BIT #2000,R1P BNE 7$  TST R0 ; 23381 BNE 6$ $ MOV SCR.PB+20,PRI.PB+20 ; 2341 BEQ 6$- MOV SCR.PB+2,R0 ; 23441 BIC #177733,R0g BIS R0,PRI.PB+2$ MOV SCR.PB+22,PRI.PB+22 ; 23456$: TST PRI.PB+24 ; 2348 BNE 9$ $ MOV SCR.PB+24,PRI.PB+24 ; 2351 BEQ 9$  MOV SCR.PB+2,R0 ; 2354, BIC #177755,R0 BIS R0,PRI.PB+2$ MOV SCR.PB+26,PRI.PB+26 ; 2355 BR 9$ ; 23587$: TST R0 ; 238000a:ppmmmffDATA BNE 8$V TST PRI.PB+24 BNE 8$ BIS #2006,PRI.PB+2 ; 2390$ MOV SCR.PB+20,PRI.PB+20 ; 2391$ MOV SCR.PB+22,PRI.PB+22 ; 23928$: TST PRI.PB+4 ; 2399, BNE 10$9$: TST PRI.PB+303 BNE 10$$ MOV SCR.PB+30,PRI.PB+30 ; 2401 BEQ 10$ MOV SCR.PB+2,R0 ; 24043 BIC #177766,R0V BIS R0,PRI.PB+2$ MOV SCR.PB+32,PRI.PB+32 ; 2405"10$: CLR R4 ; TOTAL.LEN 2426" MOV #1,(SP) ; *,STATUS 2427 CLR PRI.PB+34 ; 2428  CLR PRI.PB+36 ; 2429 ) MOV #PRI.PB,2(SP) ; *,PRI.PB.P 2430 " MOV MERGED,R0 ; *,O.PTR 2431 CLR R5 ; I 2433 11$: MOV R5,R1 ; I,* 2435 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 84+^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26) ASL R1V ADD 2(SP),R1 ; PRI.PB.P,* MOV 4(R1),R3 ; *,CURRENT.LEN , ADD R3,R4 ; CURRENT.LEN,TOTAL.LEN 2436% CMP R4,#377 ; TOTAL.LEN,* 24386 BLOS 13$2! MOV MERGED,PRI.PB+36 ; 2455. ADD #377,PRI.PB+36E) MOV R4,PRI.PB+34 ; TOTAL.LEN,* 2456  SUB #377,PRI.PB+341+ SUB PRI.PB+34,R3 ; *,CURRENT.LEN 2458D BPL 12$ CLR R3 ; CURRENT.LEN)12$: MOV #-1414,(SP) ; *,STATUS 24610 13$: MOV R5,R1 ; I,* 2469 ASL R14 ADD 2(SP),R1 ; PRI.PB.P,* MOV 6(R1),R2 ; *,I.PTR BEQ 14$ ; 2470 MOV R0,6(R1) ; O.PTR,*U$14$: TST R3 ; CURRENT.LEN 2471 BEQ 16$ MOV R3,R1 ; CURRENT.LEN,IA BLE 16$%15$: MOVB (R2)+,(R0)+ ; I.PTR,O.PTR3 SOB R1,15$ ; I,* 16$: ADD #2,R5 ; *,I 2433 CMP R5,#12 ; I,* BLOS 11$7 TST PRI.PB+34 ; 2481R BNE 17$! MOV R4,PRI.PB+36 ; TOTAL.LEN,*R ADD MERGED,PRI.PB+36:"17$: MOV PRI.PB+40,R1 ; 2486 BEQ 18$ MOV PRI.PB+6,R2 ; 2488L ADD PRI.PB+4,R2 SUB R1,R2 MOV R2,PRI.PB+42  SUB #2,PRI.PB+42118$: CLR R1 ; 2493( BISB PRI.PB+44,R1 CLR R0  BISB SCR.PB+44,R0 CMP R1,R0 BHIS 19$, CLR R1U BISB SCR.PB+44,R119$: MOVB R1,PRI.PB+44% MOV (SP),PRI.PB ; STATUS,* 2494*! MOV MERGED,R1 ; *,TEMP 2495 MOV PRIMARY,MERGED ; 2496" MOV R1,PRIMARY ; TEMP,* 2497" MOV (SP)+,R0 ; STATUS,* 2254 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 852^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26) TST (SP)+ ; 2227 RTS PC8; Routine Size: 275 words, Routine Base: $CODE$ + 5722.; Maximum stack depth per invocation: 9 words .NLIST; .DSABL LSB2 .NLIST BIN,LOC, .LIST ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 86 ];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (27)4-; 2501 1 %SBTTL 'Parse file specification'a; 2502 1 GLOBAL_FOR_DEBUGA; 2503 1 ROUTINE fss (ptr_p, len_p; ptr, len) : fss_l NOVALUE=R ; 2504 1 ; 2505 1 !++w ; 2506 1 !a%; 2507 1 ! FUNCTIONAL DESCRIPTION:t ; 2508 1 !nM; 2509 1 ! Scan the input string for a valid file specification. On exit,oN; 2510 1 ! either it has scanned the entire string, the scan was terminatedJ; 2511 1 ! by something that may or may not be a valid terminator, or a*; 2512 1 ! syntax error was discovered. ; 2513 1 !sO; 2514 1 ! Spaces are not allowed in the file specification for two reasons;_P; 2515 1 ! any reasonable external use for this routine will be in a DCL likeO; 2516 1 ! command language or similar where spaces are parameter delimiterstO; 2517 1 ! or it is being used to perform a parse merge. In this case, somecO; 2518 1 ! preprocessing has almost certainly been done; in the case of this 5; 2519 1 ! module, the string has been compressed. ; 2520 1 !w ; 2521 1 ! FORMAL PARAMETERS: ; 2522 1 !c; 2523 1 ! ptr_p *; 2524 1 ! address of the input string ; 2525 1 ! ; 2526 1 ! len_ps#; 2527 1 ! length of the stringi ; 2528 1 ! ; 2529 1 ! IMPLICIT OUTPUTS:r ; 253000aBpnncccc 1 !r3; 2531 1 ! The scratch parse block is filled in. ; 2532 1 !r; 2533 1 !--s ; 2534 1 ; 2535 2 BEGINo ; 2536 2 ; 2537 2 MACRO ; 2538 2 ; 2539 2 !5O; 2540 2 ! NEXT_CHAR sets the next character and returns true if successO; 2541 2 ! ; M 2542 2 next_char =t; M 2543 2 BEGIN); M 2544 2 char = .(.ptr)<0, 8, 1>; ; M 2545 2 ptr = .ptr + 1;#; M 2546 2 .ptr LEQA .end_ptr ; 2547 2 END %;O ; 2548 2 ; 2549 2 REGISTER4; 2550 2 char; ! Character being examined ; 2551 2 ; 2552 2 LOCAL ,; 2553 2 status, ! Routine statusQ; 2554 2 backup_ptr, ! Restart point if current state fails to transitn ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 875];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (27)3; 2555 2 end_ptr; ! End of input pointerE ; 2556 2 ; 2557 2 LABEL ; 2558 2 main_scan,; 2559 2 filename_scan,; 2560 2 node_scan; ; 2561 2 B; 2562 2 save_parse (scr_pb); ! Init the scratch parse block; 2563 2 ptr = .ptr_p;r$; 2564 2 end_ptr = .ptr + .len_p; ; 2565 2 ; 2566 2 main_scan :9; 2567 3 BEGINB s];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 88S];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (28) ; 2568 3 node_scan :55; 2569 4 BEGIN ! Process a node specification ; 2570 4 ; 2571 4 ! -; 2572 4 ! Process all node specifications ; 2573 4 !hR; 2574 4 ! No errors are returned by this section. We don't really have enoughM; 2575 4 ! information, with the possible exception of unterminated accesseJ; 2576 4 ! control string. We'll pick that up later as a bad filename. ; 2577 4 !iP; 2578 4 ! While the node specification will include all node specifications,Q; 2579 4 ! the access control string will only include the first quoted string O; 2580 4 ! plus colons, or if no access control, just the colons. This will5Q; 2581 4 ! be used to merge any node logical name translation, which of coursev;; 2582 4 ! is only performed on the first specification.i ; 2583 4 !t; 2584 4 LOCAL6; 2585 4 node_count;p ; 2586 4 ; 2587 4 node_count = 0;5; 2588 4 backup_ptr = .ptr; ; 2589 4 ; 2590 4 WHILE 1 DO; 2591 5 BEGIN ; 2592 5 ; 2593 5 LOCAL ; 2594 5 access_ptr; ; 2595 5 ; 2596 5 !lM; 2597 5 ! If there are no more characters backup to the start of this M; 2598 5 ! substring and exit this loop; its not a node specification. ; 2599 5 !e"; 2600 5 access_ptr = .ptr; ; 2601 5 ; 2602 6 IF NOT next_char; 2603 5 THEN; 2604 6 BEGIN; 2605 6 ptr = .backup_ptr;p; 2606 6 EXITLOOP;; 2607 5 END;L ; 2608 5 <; 2609 5 CASE ch$classify (.char) FROM 0 TO ch_max OF; 2610 5 SET ; 2611 5 J; 2612 5 [ch_alpha, ch_dollar, ch_under, ch_lower, ch_oct, ch_8and9] : ; 2613 5 ; 2614 5 !O; 2615 5 ! The character is valid in a node name, do the next character ; 2616 5 !; 2617 5 ; ; 2618 5 ; 2619 5 [ch_colon] :F ; 2620 5 ; 2621 5 ! ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 89L];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (28)G; 2622 5 ! A node specification is terminated by double colons;,7; 2623 5 ! is the next character also a colon ? ; 2624 5 !; 2625 6 BEGIN ; 2626 6 !; 2627 7 IF NOT next_char ; 2628 6 THEN ; 2629 7 BEGINc ; 2630 7 ptr = .backup_ptr;; 2631 7 EXITLOOP;i; 2632 6 END; ; 2633 6 $; 2634 6 IF .char NEQU %C':'; 2635 6 THENs; 2636 7 BE00aJppmmmffDATAGIN ; 2637 7 ptr = .backup_ptr;; 2638 7 EXITLOOP;; 2639 6 END; ; 2640 6 ; 2641 6 !K; 2642 6 ! We have parsed a node specification; save this knowledge P; 2643 6 ! but let's not get carried away and lose the knowledge we haveT; 2644 6 ! about the first one we found if poor man's routing is being used.; 2645 6 !&; 2646 6 IF .node_count EQLU 0; 2647 6 THEN ; 2648 7 BEGIN'/; 2649 7 scr_pb [node_addr] = .backup_ptr; 5; 2650 7 scr_pb [node_len] = .ptr - .backup_ptr;1; 2651 7 scr_pb [access_addr] = .access_ptr; ;; 2652 7 scr_pb [access_len] = .ptr - .access_ptr - 2;a9; 2653 7 scr_pb [flags] = .scr_pb [flags] OR FS$NOD;r8; 2654 7 scr_pb [logical_type] = logical_type_node;; 2655 7 ENDo; 2656 6 ELSE'=; 2657 6 scr_pb [node_len] = .ptr - .scr_pb [node_addr];I ; 2658 6 #; 2659 6 backup_ptr = .ptr;6.; 2660 6 node_count = .node_count + 1;; 2661 5 END;6 ; 2662 5 ; 2663 5 [ch_quote] :p ; 2664 5 ; 2665 5 !A; 2666 5 ! Must be the start of an access control string.-; 2667 5 !; 2668 6 BEGIN ; 2669 6 ; 2670 6 LOCAL; 2671 6 state; ; 2672 6 <; 2673 6 ptr = .ptr - 1; ! backup pointer to quoteM; 2674 6 access_ptr = .ptr; ! Save address of access control string ; 2675 6  b];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 90 ];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (28) ; 2676 6 !?; 2677 6 ! Can't be a node specification if null string; 2678 6 !8; 2679 6 IF .ptr EQLU .backup_ptr THEN EXITLOOP; ; 2680 6 :; 2681 6 state = 0; ! Initial state is unquoted ; 2682 6 ; 2683 6 WHILE 1 DOe; 2684 7 BEGIN ; 2685 7 ; 2686 7 ! C; 2687 7 ! Get the next character. If none then exit this loopP*; 2688 7 ! and determine quote level.; 2689 7 !8; 2690 8 IF NOT next_char; 2691 7 THEN; 2692 8 BEGIN ; 2693 8 ; 2694 8 !nM; 2695 8 ! If we ran out of input, then its not a node specification ; 2696 8 !6$; 2697 8 ptr = .backup_ptr;"; 2698 8 LEAVE node_scan;; 2699 7 END; ; 2700 7 !; 2701 7 IF .char EQLU %C'"'; 2702 7 THEN$; 2703 7 state = NOT .state; 2704 7 ELSE ; 2705 7 1; 2706 7 IF .state EQLU 0 THEN EXITLOOP; ; 2707 7 ; 2708 6 END; ; 2709 6 ; 2710 6 !P; 2711 6 ! The access control string must be terminated by double colons; 2712 6 !$; 2713 6 IF .char NEQU %C':'; 2714 6 THEN ; 2715 7 BEGIN_ ; 2716 7 ptr = .backup_ptr;; 2717 7 EXITLOOP; ; 2718 6 END; ; 2719 6 !; 2720 7 IF NOT next_char ; 2721 6 THEN ; 2722 7 BEGIN ; 2723 7 ptr = .backup_ptr;; 2724 7 EXITLOOP; ; 2725 6 END; ; 2726 6 $; 2727 6 IF .char NEQU %C':'; 2728 6 THEN ; 2729 7 BEGINc ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 91a];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (28) ; 2730 7 ptr = .backup_ptr;; 2731 7 EXITLOOP; ; 2732 6 END; ; 2733 6 ; 2734 6 !K; 2735 6 ! We have parsed a node specification; save this knowledgeOP; 2736 6 ! but let's not get carried away and lose the knowledge we haveT; 2737 6 ! about the first one we found if poor man's routing is being used.; 2738 6 !&; 2739 6 IF .node_count EQLU 0; 2740 6 THENa; 2741 7 BEGIN:/; 2742 7 scr_pb [node_addr] = .backup_ptr; 5; 2743 7 scr_pb [node_len] = .ptr - .backup_ptr; 1; 2744 7 scr_pb [access_addr] = .access_ptr; ;; 2745 7 scr_pb [access_len00aRpnncccc] = .ptr - .access_ptr - 2;a9; 2746 7 scr_pb [flags] = .scr_pb [flags] OR FS$NOD;r8; 2747 7 scr_pb [logical_type] = logical_type_node;; 2748 7 ENDo; 2749 6 ELSE'=; 2750 6 scr_pb [node_len] = .ptr - .scr_pb [node_addr];I ; 2751 6 #; 2752 6 backup_ptr = .ptr;7.; 2753 6 node_count = .node_count + 1;8; 2754 5 END; ! Process access control string ; 2755 5 ; 2756 5 [INRANGE] : ; 2757 5 ; 2758 5 !I; 2759 5 ! Either an invalid character has been encountered or webI; 2760 5 ! aren't processing a node specification. Backup to the >; 2761 5 ! beginning of the string and exit this loop.; 2762 5 !; 2763 6 BEGIN#; 2764 6 ptr = .backup_ptr; ; 2765 6 EXITLOOP;; 2766 5 END; ; 2767 5 TES;_ ; 2768 5 ; 2769 4 END; ; 2770 4 4; 2771 3 END; ! Process a node specification7; 2772 4 BEGIN ! Process a device specification! t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 92d];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (29). ; 2773 4 ! Y; 2774 4 ! Attempt to process a device specification. The next character has not been;<; 2775 4 ! fetched at the beginning nor end of the block. ; 2776 4 !NW; 2777 4 ! No errors are detected in this scan. If we don't find what we're looking W; 2778 4 ! for, its most likely because we're not looking at a device specification.6T; 2779 4 ! If we don't like what we see, we just backup to the start and go on to; 2780 4 ! the next section.D ; 2781 4 !5; 2782 4 backup_ptr = .ptr; ; 2783 4 ; 2784 4 WHILE 1 DO; 2785 5 BEGINt ; 2786 5 ; 2787 5 !5M; 2788 5 ! If there are no more characters backup to the start of this /; 2789 5 ! substring and exit this loop.o; 2790 5 ! ; 2791 6 IF NOT next_char; 2792 5 THEN; 2793 6 BEGIN; 2794 6 ptr = .backup_ptr; ; 2795 6 EXITLOOP;; 2796 5 END;a ; 2797 5 <; 2798 5 CASE ch$classify (.char) FROM 0 TO ch_max OF; 2799 5 SET ; 2800 5 J; 2801 5 [ch_alpha, ch_dollar, ch_under, ch_lower, ch_oct, ch_8and9] : ; 2802 5 ; 2803 5 !Q; 2804 5 ! The character is valid in a device name, do the next character ; 2805 5 !; 2806 5 ; ; 2807 5 ; 2808 5 [ch_colon] :N ; 2809 5 ; 2810 5 !E; 2811 5 ! This is the terminating character of a device nameI; 2812 5 !; 2813 6 BEGIN ; 2814 6 -; 2815 6 IF .ptr - .backup_ptr GTRU 1 ; 2816 6 THEN0; 2817 7 BEGINh ; 2818 7 ; 2819 7 !_K; 2820 7 ! We've got a valid device specification, save this knowledge ; 2821 7 !i1; 2822 7 scr_pb [device_addr] = .backup_ptr; 7; 2823 7 scr_pb [device_len] = .ptr - .backup_ptr; 9; 2824 7 scr_pb [flags] = .scr_pb [flags] OR FS$DEV;1 ; 2825 7 >; 2826 7 IF .scr_pb [logical_type] eqlu logical_type_none !];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 936];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (29) ; 2827 7 then>; 2828 7 scr_pb [logical_type] = logical_type_device; ; 2829 7 ; 2830 7 END ; 2831 6 ELSE[ ; 2832 6 ; 2833 6 !r=; 2834 6 ! Not long enough, backup and let it fail later; 2835 6 ! ; 2836 6 ptr = .backup_ptr; ; 2837 6 ; 2838 6 EXITLOOP;; 2839 5 END; ; 2840 5 ; 2841 5 [INRANGE] : ; 2842 5 ; 2843 5 !I; 2844 5 ! Either an invalid character has been encountered or we(K; 2845 5 ! aren't processing a device specification. Backup to the_>; 2846 5 ! beginning of the string and exit this loop.; 2847 5 !; 2848 6 BEGIN#; 2849 6 ptr = .backup_ptr;n; 00aZppmmmffDATA 2850 6 EXITLOOP;; 2851 5 END; ; 2852 5 TES;; ; 2853 5 ; 2854 4 END; ; 2855 4 6; 2856 3 END; ! Process a device specification5; 2857 4 BEGIN ! Process a file specificationE e];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 94c];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (30). ; 2858 4 ! 0; 2859 4 ! Process a directory specification. ; 2860 4 !W; 2861 4 ! We are immediately able to determine if we have a directory specification O; 2862 4 ! at this point; the current character must be either a '<' or '['.aM; 2863 4 ! If we don't find the matching bracket, we will report an error.aG; 2864 4 ! Likewise if we don't like some of the characters scanned.g ; 2865 4 ! :; 2866 5 BEGIN ! Process a directory specification ; 2867 5 ; 2868 5 !:; 2869 5 ! Attempt to process a directory specification ; 2870 5 ! ; 2871 5 ; 2872 5 LOCALa; 2873 5 bracket; ; 2874 5 V; 2875 5 backup_ptr = .ptr; ! Save start of this part of string for error return ; 2876 5 2; 2877 5 IF NOT next_char THEN LEAVE main_scan; ; 2878 5 ; 2879 5 bracket = 0; ; 2880 5 ; 2881 5 SELECT .char OFh; 2882 5 SET ; 2883 5 ; 2884 5 [%C'['] :o ; 2885 5 ; 2886 5 !D; 2887 5 ! Standard directory brackets, set terminating bracket.; 2888 5 !; 2889 5 bracket = %C']'; ; 2890 5 ; 2891 5 [%C'<'] :r ; 2892 5 ; 2893 5 !;; 2894 5 ! Alternate brackets, set terminating bracket. ; 2895 5 !; 2896 5 bracket = %C'>';N; 2897 5 TES; ; 2898 5 ; 2899 5 IF .bracket NEQU 0; 2900 5 THEN;; 2901 6 BEGIN ! Process directory specification8 ; 2902 6 ; 2903 6 LOCAL ; 2904 6 state; ; 2905 6 ; 2906 6 state = 0; ; 2907 6 "; 2908 7 IF NOT (WHILE 1 DO8; 2909 8 BEGIN ! Scan directory specification ; 2910 8 ; 2911 8 ! 3];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 95 ];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (30)9E; 2912 8 ! Get the next character, if none then right bracketD; 2913 8 ! missing, terminate scan with an error indication.; 2914 8 !7; 2915 8 IF NOT next_char THEN LEAVE main_scan; ; 2916 8 =; 2917 8 CASE ch$classify (.char) FROM 0 TO ch_max OF ; 2918 8 SET3 ; 2919 8 T; 2920 8 [ch_alpha, ch_dollar, ch_under, ch_lower, ch_oct, ch_8and9, ch_dash] : ; 2921 8 ; 2922 8 !-A; 2923 8 ! These characters are valid in the new format.2; 2924 8 !x; 2925 8 ;o ; 2926 8 ; 2927 8 [ch_dot] : ; 2928 8 ; 2929 8 !e0; 2930 8 ! Check for ... which is wild.; 2931 8 ! ; 2932 8 =; 2933 9 IF next_char ! Is there another character?r; 2934 8 THEN/; 2935 8 IF .char EQLU %C'.' ! Is it a .?c; 2936 8 THENh3; 2937 9 IF next_char ! Is there a third?9; 2938 8 THEN 1; 2939 8 IF .char EQLU %C'.' ! Is it a .?i; 2940 8 THEN>; 2941 8 scr_pb [flags] = .scr_pb [flags] OR FS$WDI; 2942 8 ELSE?; 2943 8 LEAVE main_scan ! .. invalid, no directoryc; 2944 8 ELSE 9; 2945 8 LEAVE main_scan ! We are looking at junkt; 2946 8 ELSEr@; 2947 8 ptr = .ptr - 1 ! . followed by something else; 2948 8 ELSE9; 2949 8 LEAVE main_scan; ! We are looking at junkd ; 2950 8 ; 2951 8 [ch_wild] : ; 2952 8 ; 2953 8 !.+; 2954 8 ! Indicate wild directory ; 2955 8 !_=; 2956 8 scr_pb [flags] = .scr_pb [flags] OR FS$WDI; ; 2957 8 ; 2958 8 [ch_dir] : ; 2959 8 ; 2960 8 ! Q; 2961 8 ! End of directory specifica00abpnncccction, exit loop if matching bracket9; 2962 8 !tQ; 2963 8 IF .char EQLU .bracket THEN EXITLOOP valid ELSE EXITLOOP error;m ; 2964 8 ; 2965 8 [INRANGE] :  0];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 96a];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (30) ; 2966 8 ; 2967 8 ! F; 2968 8 ! Invalid character encountered, terminate scan withE; 2969 8 ! an error indication. We will rescan to determine <; 2970 8 ! if the specification is in the UIC form.; 2971 8 !P!; 2972 8 EXITLOOP error; ; 2973 8 TES; ; 2974 8 7; 2975 8 END ! Scan directory specification ; 2976 7 ); 2977 6 THEN; 2978 7 BEGIN#; 2979 7 ptr = .backup_ptr + 1;P ; 2980 7 C; 2981 7 WHILE 1 DO ! Process group,member format directoryn; 2982 8 BEGIN ; 2983 8 7; 2984 8 IF NOT next_char THEN LEAVE main_scan;w ; 2985 8 =; 2986 8 CASE ch$classify (.char) FROM 0 TO ch_max OFU; 2987 8 SET ; 2988 8 "; 2989 8 [ch_oct, ch_8and9] : ; 2990 8 ; 2991 8 ! $; 2992 8 ! Digits are valid; 2993 8 !9; 2994 8 ;7 ; 2995 8 ; 2996 8 [ch_wild] :9 ; 2997 8 ; 2998 8 !9+; 2999 8 ! Indicate wild directory ; 3000 8 !i=; 3001 8 scr_pb [flags] = .scr_pb [flags] OR FS$WDI; ; 3002 8 ; 3003 8 [ch_comma] : ; 3004 8 ; 3005 8 ! K; 3006 8 ! Group-member separator encountered. Only one is legal. E; 3007 8 ! Set flag indicating that a comma was encountered. ; 3008 8 !iF; 3009 8 IF (state = NOT .state) EQLU 0 THEN LEAVE main_scan; ; 3010 8 ; 3011 8 [ch_dir] : ; 3012 8 ; 3013 8 ! >; 3014 8 ! End of directory specification, exit loop.; 3015 8 !=; 3016 9 BEGINI ; 3017 9 O; 3018 9 IF .char NEQU .bracket OR .state EQLU 0 THEN LEAVE main_scan; ; 3019 9  r];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 97m];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (30)E; 3020 9 EXITLOOP; ; 3021 8 END; ; 3022 8 ; 3023 8 [INRANGE] : ; 3024 8 ; 3025 8 !sN; 3026 8 ! Invalid character encountered, exit the loop with an error; 3027 8 ! "; 3028 8 LEAVE main_scan;; 3029 8 TES; ; 3030 8 G; 3031 8 END ! Process group,member directory specificationA; 3032 6 END;5 ; 3033 6 ; 3034 6 !iP; 3035 6 ! We have located a directory specification, save this knowledge; 3036 6 !X6; 3037 6 scr_pb [directory_addr] = .backup_ptr;<; 3038 6 scr_pb [directory_len] = .ptr - .backup_ptr;;; 3039 6 scr_pb [flags] = .scr_pb [flags] OR FS$DIR;tW; 3040 6 backup_ptr = .ptr; ! Save start of remaining string for error return:; 3041 5 END; ! Process directory specification ; 3042 5 0; 3043 4 END; ! Process a directory spec 0];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 98];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (31)_; 3044 4 filename_scan :c); 3045 5 BEGIN ! Process filename. ; 3046 5 !O:; 3047 5 ! Attempt to process a filename specification. ; 3048 5 ! ?; 3049 5 ! We will first attempt to process a quoted string.c ; 3050 5 !iO; 3051 5 ! If we don't find a quoted string, then we will attempt to processo*; 3052 5 ! a normal file specification. ; 3053 5 !1; 3054 5 LOCAL ; 3055 5 state; ; 3056 5 ; 3057 5 state = 0; ; 3058 5 ; 3059 5 !59; 3060 5 ! Attempt to process a funny filename (ANSI). ; 3061 5 !fG; 3062 5 ptr = .backup_ptr; ! Backup to star00ajppmmmffDATAt of remaining stringc ; 3063 5 ; 3064 5 WHILE 1 DO; 3065 6 BEGINp ; 3066 6 ; 3067 6 ! L; 3068 6 ! Get the next character. If none then the command is valid.; 3069 6 ! /; 3070 6 IF NOT next_char THEN EXITLOOP;3 ; 3071 6 #; 3072 6 IF .char EQLU %C'"'; 3073 6 THEN; 3074 6 state = NOT .state ; 3075 6 ELSE,; 3076 6 IF .state EQLU 0 THEN EXITLOOP;; 3077 5 END; ; 3078 5 4; 3079 5 state = -1; ! Initialize state again:; 3080 5 ptr = .ptr - 1; ! Backup to next character ; 3081 5 $; 3082 5 IF .ptr NEQU .backup_ptr; 3083 5 THEN; 3084 6 BEGINn ; 3085 6 ; 3086 6 ! S; 3087 6 ! We actually have a quoted file specification, save this knowledge ; 3088 6 !C5; 3089 6 scr_pb [filename_addr] = .backup_ptr;t;; 3090 6 scr_pb [filename_len] = .ptr - .backup_ptr;NO; 3091 6 scr_pb [flags] = .scr_pb [flags] OR FS$QUO OR FS$NAM OR FS$TYP;t; 3092 6 END ; 3093 5 ELSE5; 3094 6 BEGIN ! Process a normal filename ; 3095 6 ; 3096 6 WHILE 1 DO4; 3097 7 BEGIN ! Scan filename specification 6];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 99 ];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (31)c ; 3098 7 ,; 3099 7 IF NOT next_char THEN EXITLOOP; ; 3100 7 9; 3101 7 CASE ch$classify (.char) FROM 0 TO ch_max OF ; 3102 7 SET ; 3103 7 N; 3104 7 [ch_alpha, ch_dollar, ch_under, ch_lower, ch_oct, ch_8and9] : ; 3105 7 ; 3106 7 ! C; 3107 7 ! Valid character encountered, process next character ; 3108 7 !:; 3109 7 ; ; 3110 7 ; 3111 7 !09; 3112 7 ! Note that a wildcard has been encounteredC; 3113 7 !I; 3114 7 [ch_wild] : ; 3115 7 ; 3116 7 !N9; 3117 7 ! Note that a wildcard has been encounteredh; 3118 7 !m1; 3119 7 scr_pb [flags] = .scr_pb [flags] OR4; 3120 8 BEGINh5; 3121 8 IF .state LSS 0 THEN FS$WNA ELSE FS$WTY1; 3122 7 END; ; 3123 7 ; 3124 7 [ch_dot] :n ; 3125 7 ; 3126 7 !:; 3127 7 ! The first dot is the type field delimiter,8; 3128 7 ! the second is the new version delimiter..; 3129 7 ! Exit if the version delimiter.; 3130 7 !1,; 3131 7 IF (state = .state + 1) EQLU 0; 3132 7 THEN; 3133 8 BEGIN1L; 3134 8 IF (scr_pb [filename_len] = .ptr - 1 - .backup_ptr) NEQU 0; 3135 8 THEN; 3136 9 BEGIN4; 3137 9 scr_pb [filename_addr] = .backup_ptr;:; 3138 9 scr_pb [flags] = .scr_pb [flags] OR FS$NAM;; 3139 8 END;i(; 3140 8 backup_ptr = .ptr - 1;; 3141 8 ENDi; 3142 7 ELSE; 3143 7 EXITLOOP;t ; 3144 7 ; 3145 7 [INRANGE] : ; 3146 7 ; 3147 7 !a<; 3148 7 ! Any other character is not valid in the file>; 3149 7 ! name or type fields. Exit loop to the version ; 3150 7 ! processing scan.; 3151 7 !  G];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 100p];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (31) ; 3152 7 EXITLOOP; ; 3153 7 TES; ; 3154 7 3; 3155 6 END; ! Scan filename specification ; 3156 6 =; 3157 6 ptr = .ptr - 1; ! Backup to next characteri ; 3158 6 ; 3159 6 IF .state LSS 0l; 3160 6 THEN; 3161 7 BEGIN ; 3162 7 C; 3163 7 IF (scr_pb [filename_len] = .ptr - .backup_ptr) NEQU 0:; 3164 7 THEN1; 3165 8 BEGIN6; 3166 8 scr_pb [filename_addr] = .backup_ptr;<; 3167 8 scr_pb [flags] = .scr_pb [flags] OR FS$NAM;; 3168 7 END; ; 3169 7 ; 3170 7 END; 3171 6 ELSE; 3172 7 BEGIN.; 3173 7 scr_pb [type_addr] = .backup_ptr;4; 3174 7 scr_pb [type_len]00arpnncccc = .ptr - .backup_ptr;8; 3175 7 scr_pb [flags] = .scr_pb [flags] OR FS$TYP;; 3176 6 END; ; 3177 6 4; 3178 5 END; ! Process a normal filename ; 3179 5 %; 3180 4 END; ! filename_scan ; 3181 4 backup_ptr = .ptr; ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 101E];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (32)r2; 3182 4 IF NOT next_char THEN LEAVE main_scan; ; 3183 4 ; 3184 4 SELECTONEU .char OFr; 3185 4 SET ; 3186 4 ; 3187 4 [%C'.', %C';'] : ; 3188 4 ; 3189 4 !%; 3190 4 ! Process version number ; 3191 4 !; 3192 5 BEGIN ; 3193 5 ; 3194 5 LOCAL; 3195 5 state; ; 3196 5 P; 3197 5 state = 0; ! State is the character count or wildcard flag if -1 ; 3198 5 ; 3199 5 WHILE 1 DO ; 3200 6 BEGIN ; 3201 6 ; 3202 6 !C; 3203 6 ! Get next character. If none command line valid.N; 3204 6 !0; 3205 6 IF NOT next_char THEN EXITLOOP; ; 3206 6 $; 3207 6 SELECTONEU .char OF; 3208 6 SETi ; 3209 6 ; 3210 6 [%C'0' TO %C'9'] : ; 3211 6 ; 3212 6 ! H; 3213 6 ! If number then continue skipping over version number; 3214 6 ! F; 3215 6 IF (state = .state + 1) EQLU 0 THEN LEAVE main_scan; ; 3216 6 ; 3217 6 [%C'-'] : ; 3218 6 ; 3219 6 !xO; 3220 6 ! Minus sign only valid if first character of version number.I; 3221 6 !E; 3222 7 BEGIN ; 3223 7 8; 3224 7 IF .state NEQU 0 THEN LEAVE main_scan; ; 3225 7 %; 3226 7 state = .state + 1;2; 3227 6 END; ; 3228 6 ; 3229 6 [%C'*'] :i ; 3230 6 ; 3231 6 ! W; 3232 6 ! Wildcard version number. Must be only character in version number.6; 3233 6 !%; 3234 7 BEGIN ; 3235 7  x];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 102 ];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (32) 8; 3236 7 IF .state NEQU 0 THEN LEAVE main_scan; ; 3237 7 %; 3238 7 state = NOT .state; ; 3239 6 END; ; 3240 6 ; 3241 6 [OTHERWISE] : ; 3242 6 ; 3243 6 !b=; 3244 6 ! Non-digit encountered, exit version scan. ; 3245 6 !; 3246 6 EXITLOOP;i; 3247 6 TES; ; 3248 6 ; 3249 5 END;1 ; 3250 5 :; 3251 5 ptr = .ptr - 1; ! Backup to next character ; 3252 5 ; 3253 5 !F; 3254 5 ! We just processed a version number, save this knowledge; 3255 5 ! ; 3256 5 M; 3257 5 IF .state LSS 0 THEN scr_pb [flags] = .scr_pb [flags] OR FS$WVE; ; 3258 5 8; 3259 5 scr_pb [flags] = .scr_pb [flags] OR FS$VER;1; 3260 5 scr_pb [version_addr] = .backup_ptr;27; 3261 5 scr_pb [version_len] = .ptr - .backup_ptr; >; 3262 5 backup_ptr = .ptr; ! Include the version number; 3263 4 END; ; 3264 4 ; 3265 4 [OTHERWISE] : ; 3266 4 ; 3267 4 !(; 3268 4 ! Return the last character; 3269 4 !; 3270 5 BEGIN:; 3271 5 ptr = .ptr - 1; ! Backup to next character; 3272 4 END;]; 3273 4 TES8 ; 3274 4 6; 3275 3 END; ! Process filename specification!; 3276 2 END; ! main_scank p];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 103 ];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (33) T; 3277 2 scr_pb [trailing_addr] = ptr = .backup_ptr; ! Always fill in the address_; 3278 2 scr_pb [trailing_len] = len = .end_ptr - .ptr; ! of the traling string even if nullD ; 3279 2 q; 3280 2 IF (.scr_pb [flags] NEQU 0) AND (.scr_pb [flags] AND NOT FS$NAM) EQLU 0 ! If a standalone filename isk6; 3281 2 THEN ! present it could be a log00azppmmmffDATAical>; 3282 2 scr_pb [logical_type] = logical_type_filename; ; 3283 2 (; 3284 2 scr_pb [fss_status] = valid;; 3285 1 END; .NLIST  .LIST BIN,LOC .LIST$ .SBTTL FSS Parse file specification .NLISTa .ENABL LSB2 .LISTFSS: JSR R1,$SAVE3 ; 2503p TST -(SP) MOV #SCR.PB,R1 ; 2562 JSR PC,SAVE.PARSE% MOV R5,R3 ; LEN.P,END.PTR 25640 ADD R4,R3 ; PTR,END.PTRT! CLR (SP) ; NODE.COUNT 2587i% MOV R4,R2 ; PTR,BACKUP.PTR 2588e(1$: MOV R4,R5 ; PTR,ACCESS.PTR 2600# MOVB (R4)+,R1 ; PTR,CHAR 2602e CMP R4,R3 ; PTR,END.PTR  BHI 9$ ; 2605t JSR PC,CH$CLASSIFY ; 2609 ASL R0.# ADD P.AAB(R0),PC ; Case dispatcha3$: DEC R4 ; PTR 2673% MOV R4,R5 ; PTR,ACCESS.PTR 2674S% CMP R4,R2 ; PTR,BACKUP.PTR 2679C BEQ 10$ CLR R0 ; STATE 2681E&4$: MOVB (R4)+,R1 ; PTR,CHAR 2690 CMP R4,R3 ; PTR,END.PTRT BHI 9$ ; 2697O CMP R1,#42 ; CHAR,* 2701, BNE 5$R COM R0 ; STATE 2703P BR 4$ ; 27015$: TST R0 ; STATE 2706 BNE 4$P CMP R1,#72 ; CHAR,* 2713  BNE 9$ ; 2716,&6$: MOVB (R4)+,R1 ; PTR,CHAR 2720 CMP R4,R3 ; PTR,END.PTRc BHI 9$ ; 2723  CMP R1,#72 ; CHAR,* 2727E BNE 9$ ; 2730,! TST (SP) ; NODE.COUNT 2739Q $];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 104.];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (33)  BNE 7$ ) MOV R2,SCR.PB+6 ; BACKUP.PTR,* 2742 # MOV R4,SCR.PB+4 ; PTR,* 2743,! SUB R2,SCR.PB+4 ; BACKUP.PTR,** MOV R5,SCR.PB+42 ; ACCESS.PTR,* 2744 MOV R4,R0 ; PTR,* 2745 SUB R5,R0 ; ACCESS.PTR,* MOV R0,SCR.PB+40E SUB #2,SCR.PB+402 BIS #400,SCR.PB+2 ; 2746  MOVB #3,SCR.PB+44 ; 2747D BR 8$ ; 2739&7$: MOV R4,SCR.PB+4 ; PTR,* 2750 SUB SCR.PB+6,SCR.PB+4(8$: MOV R4,R2 ; PTR,BACKUP.PTR 2752! INC (SP) ; NODE.COUNT 2753( BR 1$ ; 2609(9$: MOV R2,R4 ; BACKUP.PTR,PTR 2764)10$: MOV R4,R2 ; PTR,BACKUP.PTR 2782,'11$: MOVB (R4)+,R1 ; PTR,CHAR 2791B CMP R4,R3 ; PTR,END.PTR BHI 14$ ; 2794 JSR PC,CH$CLASSIFY ; 2798 ASL R0R# ADD P.AAC(R0),PC ; Case dispatchS"13$: MOV R4,R0 ; PTR,* 2815 SUB R2,R0 ; BACKUP.PTR,* CMP R0,#1 BLOS 14$ * MOV R2,SCR.PB+12 ; BACKUP.PTR,* 2822 MOV R0,SCR.PB+10 ; 2823 BIS #200,SCR.PB+2 ; 2824P TSTB SCR.PB+44 ; 2826 BNE 15$ MOVB #2,SCR.PB+44 ; 2828U BR 15$ ; 2815M)14$: MOV R2,R4 ; BACKUP.PTR,PTR 2849M)15$: MOV R4,R2 ; PTR,BACKUP.PTR 2875,# MOVB (R4)+,R1 ; PTR,CHAR 2877  CMP R4,R3 ; PTR,END.PTR  BHI 30$ CLR R5 ; BRACKET 2879 CMP R1,#133 ; CHAR,* 2884 BNE 16$# MOV #135,R5 ; *,BRACKET 2889R#16$: CMP R1,#74 ; CHAR,* 2891C BNE 17$" MOV #76,R5 ; *,BRACKET 2896 17$: TST R5 ; BRACKET 2899 BEQ 32$ CLR (SP) ; STATE 2906 '18$: MOVB (R4)+,R1 ; PTR,CHAR 2915  CMP R4,R3 ; PTR,END.PTR1 BHI 30$ R];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 105;];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (33)R JSR PC,CH$CLASSIFY ; 2917 ASL R03# ADD P.AAD(R0),PC ; Case dispatchP'20$: MOVB (R4)+,R1 ; PTR,CHAR 2933M CMP R4,R3 ; PTR,END.PTR8 BHI 30$ CMP R1,#56 ; CHAR,* 29353 BNE 21$# MOVB (R4)+,R1 ; PTR,CHAR 2937R CMP R4,R3 ; PTR,END.PTR BHI 30$ CMP R1,#56 ; CHAR,* 2939 BNE 30$ BR 22$ ; 2941 21$: DEC R4 ; PTR 2947i BR 18$ ; 2933 $22$: BIS #1000,SCR.PB+2 ; 2956 BR 18$ ; 2917 (23$: CMP R1,R5 ; CHAR,BRACKET 2963 BEQ 31$)24$: MOV R2,R4 ; BACKUP.PTR,PTR 2979D INC R4 ; PTR'25$: MOVB (R4)+,R1 ; PTR,CHAR 2984  CMP R4,R3 ; PTR,END.PTR, BHI 46$ JSR PC,CH$CLASSIFY ; 2986 ASL R0# ADD P.AAE(R0),PC ; Case dispatch $27$:00apnncccc BIS #1000,SCR.PB+2 ; 3001 BR 25$ ; 2986 !28$: COM (SP) ; STATE 3009  BNE 25$ BR 49$(29$: CMP R1,R5 ; CHAR,BRACKET 3018 30$: BNE 51$ TST (SP) ; STATE BEQ 49$.31$: MOV R2,SCR.PB+16 ; BACKUP.PTR,* 3037$ MOV R4,SCR.PB+14 ; PTR,* 3038" SUB R2,SCR.PB+14 ; BACKUP.PTR,* BIS #100,SCR.PB+2 ; 3039R% MOV R4,R2 ; PTR,BACKUP.PTR 3040332$: CLR R5 ; STATE 3057R% MOV R2,R4 ; BACKUP.PTR,PTR 3062'33$: MOVB (R4)+,R1 ; PTR,CHAR 3070: CMP R4,R3 ; PTR,END.PTR0 BHI 35$ CMP R1,#42 ; CHAR,* 3072  BNE 34$ COM R5 ; STATE 3074 BR 33$ ; 3072R34$: TST R5 ; STATE 3076T BNE 33$$35$: MOV #-1,R5 ; *,STATE 3079 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 106R];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (33)S DEC R4 ; PTR 3080 % CMP R4,R2 ; PTR,BACKUP.PTR 3082) BEQ 36$* MOV R2,SCR.PB+22 ; BACKUP.PTR,* 3089$ MOV R4,SCR.PB+20 ; PTR,* 3090" SUB R2,SCR.PB+20 ; BACKUP.PTR,* BIS #2006,SCR.PB+2 ; 3091 BR 45$ ; 3082A'36$: MOVB (R4)+,R1 ; PTR,CHAR 3099  CMP R4,R3 ; PTR,END.PTRN BHI 43$ JSR PC,CH$CLASSIFY ; 3101 ASL R0-# ADD P.AAF(R0),PC ; Case dispatchX38$: TST R5 ; STATE 3121  BGE 39$ MOV #40,R0 ; 3120N BR 40$I39$: MOV #20,R0C!40$: BIS R0,SCR.PB+2 ; 3119  BR 36$ ; 3101841$: INC R5 ; STATE 3131  BNE 43$ MOV R4,R0 ; PTR,* 3134 SUB R2,R0 ; BACKUP.PTR,* MOV R0,SCR.PB+20P DEC SCR.PB+20 BEQ 42$* MOV R2,SCR.PB+22 ; BACKUP.PTR,* 3137 BIS #4,SCR.PB+2 ; 31389)42$: MOV R4,R2 ; PTR,BACKUP.PTR 3140 DEC R2 ; BACKUP.PTR  BR 36$ ; 3131P43$: DEC R4 ; PTR 3157 MOV R4,R0 ; PTR,* 3163 SUB R2,R0 ; BACKUP.PTR,* TST R5 ; STATE 3159# BGE 44$ MOV R0,SCR.PB+20 ; 3163 BEQ 45$* MOV R2,SCR.PB+22 ; BACKUP.PTR,* 3166 BIS #4,SCR.PB+2 ; 3167  BR 45$ ; 3159,.44$: MOV R2,SCR.PB+26 ; BACKUP.PTR,* 3173 MOV R0,SCR.PB+24 ; 3174 BIS #2,SCR.PB+2 ; 3175)45$: MOV R4,R2 ; PTR,BACKUP.PTR 3181,# MOVB (R4)+,R1 ; PTR,CHAR 3182R CMP R4,R3 ; PTR,END.PTR  BHI 55$ CMP R1,#56 ; CHAR,* 3187 BEQ 47$ CMP R1,#73 ; CHAR,*S 46$: BNE 55$ K];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 107V];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (33)47$: CLR R0 ; STATE 3197R'48$: MOVB (R4)+,R1 ; PTR,CHAR 32054 CMP R4,R3 ; PTR,END.PTR7 BHI 53$ CMP R1,#60 ; CHAR,* 32108 BLO 50$ CMP R1,#71 ; CHAR,*3 BHI 50$ INC R0 ; STATE 3215I BNE 48$ 49$: BR 55$C#50$: CMP R1,#55 ; CHAR,* 3217  BNE 52$ TST R0 ; STATE 3224 51$: BNE 55$ INC R0 ; STATE 32268 BR 48$ ; 32071#52$: CMP R1,#52 ; CHAR,* 3229e BNE 53$ TST R0 ; STATE 3236R BNE 55$ COM R0 ; STATE 3238 BR 48$ ; 3207 53$: DEC R4 ; PTR 3251; TST R0 ; STATE 32573 BGE 54$ BIS #10,SCR.PB+2!54$: BIS #1,SCR.PB+2 ; 3259B* MOV R2,SCR.PB+32 ; BACKUP.PTR,* 3260$ MOV R4,SCR.PB+30 ; PTR,* 3261" SUB R2,SCR.PB+30 ; BACKUP.PTR,*% MOV R4,R2 ; PTR,BACKUP.PTR 3262;)55$: MOV R2,R4 ; BACKUP.PTR,PTR 3277;" MOV R2,SCR.PB+36 ; BACKUP.PTR,*# MOV R3,R5 ; END.PTR,LEN 32783 SUB R4,R5 ; PTR,LEN  MOV R5,SCR.PB+34 ; LEN,* MOV SCR.PB+2,R0 ; 3280B BEQ 56$ BIT #-5,R03 BNE 56$ MOVB #1,SCR.PB+44 ; 3282S56$: MOV #1,SCR.PB ; 32840 TST (SP)+ ; 2503 RTS PC;8; Routine Size: 341 words, Routine Base: $CODE$ + 6770.; Maximum stack depth per invocation: 6 words .PSECT $PLIT$, RO , D +P.AAB: ; CASE Table for FSS+0044 2609 2$: .WORD 160 ; [9$] V];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 P00appmmmffDATAage 108];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (33) .WORD -22 ; [1$] .WORD 160 ; [9$] .WORD -22 ; [1$] .WORD -22 ; [1$] .WORD 160 ; [9$] .WORD 44 ; [6$]  .WORD 0 ; [3$] .WORD 160 ; [9$] .WORD 160 ; [9$] .WORD 160 ; [9$] .WORD 160 ; [9$] .WORD -22 ; [1$] .WORD -22 ; [1$] .WORD -22 ; [1$] .WORD 160 ; [9$]+P.AAC: ; CASE Table for FSS+0250 2798 12$: .WORD 46 ; [14$] .WORD -20 ; [11$]a .WORD 46 ; [14$] .WORD -20 ; [11$]  .WORD -20 ; [11$]N .WORD 46 ; [14$] .WORD 0 ; [13$]O .WORD 46 ; [14$] .WORD 46 ; [14$] .WORD 46 ; [14$] .WORD 46 ; [14$] .WORD 46 ; [14$] .WORD -20 ; [11$]1 .WORD -20 ; [11$]0 .WORD -20 ; [11$]  .WORD 46 ; [14$]+P.AAD: ; CASE Table for FSS+0404 2917 19$: .WORD 52 ; [24$] .WORD -20 ; [18$] .WORD 52 ; [24$] .WORD -20 ; [18$]  .WORD -20 ; [18$]4 .WORD 52 ; [24$] .WORD 52 ; [24$] .WORD 52 ; [24$] .WORD 46 ; [23$] .WORD 36 ; [22$] .WORD -20 ; [18$]  .WORD 0 ; [20$]; .WORD -20 ; [18$][ .WORD -20 ; [18$]4 .WORD -20 ; [18$]] .WORD 52 ; [24$]+P.AAE: ; CASE Table for FSS+0502 2986026$: .WORD 472 ; [55$]. D];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 109D];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (33)5 .WORD 472 ; [55$]  .WORD 472 ; [55$]; .WORD -20 ; [25$][ .WORD 472 ; [55$]2 .WORD 10 ; [28$] .WORD 472 ; [55$]$ .WORD 472 ; [55$]$ .WORD 16 ; [29$] .WORD 0 ; [27$]  .WORD 472 ; [55$][ .WORD 472 ; [55$]A .WORD 472 ; [55$]2 .WORD 472 ; [55$]  .WORD -20 ; [25$]o .WORD 472 ; [55$] +P.AAF: ; CASE Table for FSS+0662 3101 37$: .WORD 66 ; [43$] .WORD -20 ; [36$]  .WORD 66 ; [43$] .WORD -20 ; [36$]B .WORD -20 ; [36$]4 .WORD 66 ; [43$] .WORD 66 ; [43$] .WORD 66 ; [43$] .WORD 66 ; [43$] .WORD 0 ; [38$] .WORD 66 ; [43$] .WORD 24 ; [41$] .WORD -20 ; [36$]] .WORD -20 ; [36$] .WORD -20 ; [36$] .WORD 66 ; [43$] .NLIST2 .DSABL LSB .NLIST BIN,LOC5 .LIST 0];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 110DX;X1.10 Classify character 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (34)'; 3286 1 %SBTTL 'Classify character'.; 3287 1 GLOBAL_FOR_DEBUG8; 3288 1 ROUTINE ch$classify (char) : ch$classify_l = ; 3289 1 ; 3290 1 !++ ; 3291 1 !D%; 3292 1 ! FUNCTIONAL DESCRIPTION: ; 3293 1 ! I; 3294 1 ! Classify the character into one of the types of interest to$; 3295 1 ! the parseing routines. ; 3296 1 !- ; 3297 1 ! FORMAL PARAMETERS: ; 3298 1 !g0; 3299 1 ! char - Character to be classified. ; 3300 1 !O; 3301 1 ! ROUTINE VALUE:; 3302 1 ! COMPLETION CODES:c ; 3303 1 ! 7; 3304 1 ! The character classification is returned. ; 3305 1 !s; 3306 1 !--9 ; 3307 1 ; 3308 2 BEGIN ; 3309 2 ; 3310 2 LITERALR; 3311 2 ctb = %C'"', ; 3312 2 cte = %C'z' + 1; ; 3313 2 ; 3314 2 OWNtF; 3315 2 char_types : VECTOR [cte - ctb, BYTE, SIGNED] PRESET (; 3316 2 ! "alpha"s $; 3317 2 [%C'A'-ctb] = ch_alpha,$; 3318 2 [%C'B'-ctb] = ch_alpha,$; 3319 2 [%C'C'-ctb] = ch_alpha,$; 3320 2 [%C'D'-ctb] = ch_alpha,$; 3321 2 [%C'E'-ctb] = ch_alpha,$; 3322 2 [%C'F'-ctb] = ch_alpha,$; 3323 2 [%C'G'-ctb] = ch_alpha,$; 3324 2 [%C'H'-ctb] = ch_alpha,$; 3325 2 [%C'I'-ctb] = ch_alpha,$; 3326 2 [%C'J'-ctb] = ch_alpha,$; 3327 2 [%C'K'-ctb] = ch_alpha,$; 3328 2 [%C'L'-ctb] = ch_alpha,$; 3329 2 [%C'M'-ctb] = ch_alpha,$; 3330 2 [%C'N'-ctb] = ch_alpha,$; 3331 2 [%C'O'-ctb] = ch_alpha,$; 3332 2 [%C'P'-ctb] = ch_alpha,$; 3333 00apnncccc2 [%C'Q'-ctb] = ch_alpha,$; 3334 2 [%C'R'-ctb] = ch_alpha,$; 3335 2 [%C'S'-ctb] = ch_alpha,$; 3336 2 [%C'T'-ctb] = ch_alpha,$; 3337 2 [%C'U'-ctb] = ch_alpha,$; 3338 2 [%C'V'-ctb] = ch_alpha,$; 3339 2 [%C'W'-ctb] = ch_alpha, t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 111 X;X1.10 Classify character 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (34)$; 3340 2 [%C'X'-ctb] = ch_alpha,$; 3341 2 [%C'Y'-ctb] = ch_alpha,$; 3342 2 [%C'Z'-ctb] = ch_alpha, ; 3343 2 $; 3344 2 [%C'a'-ctb] = ch_lower,$; 3345 2 [%C'b'-ctb] = ch_lower,$; 3346 2 [%C'c'-ctb] = ch_lower,$; 3347 2 [%C'd'-ctb] = ch_lower,$; 3348 2 [%C'e'-ctb] = ch_lower,$; 3349 2 [%C'f'-ctb] = ch_lower,$; 3350 2 [%C'g'-ctb] = ch_lower,$; 3351 2 [%C'h'-ctb] = ch_lower,$; 3352 2 [%C'i'-ctb] = ch_lower,$; 3353 2 [%C'j'-ctb] = ch_lower,$; 3354 2 [%C'k'-ctb] = ch_lower,$; 3355 2 [%C'l'-ctb] = ch_lower,$; 3356 2 [%C'm'-ctb] = ch_lower,$; 3357 2 [%C'n'-ctb] = ch_lower,$; 3358 2 [%C'o'-ctb] = ch_lower,$; 3359 2 [%C'p'-ctb] = ch_lower,$; 3360 2 [%C'q'-ctb] = ch_lower,$; 3361 2 [%C'r'-ctb] = ch_lower,$; 3362 2 [%C's'-ctb] = ch_lower,$; 3363 2 [%C't'-ctb] = ch_lower,$; 3364 2 [%C'u'-ctb] = ch_lower,$; 3365 2 [%C'v'-ctb] = ch_lower,$; 3366 2 [%C'w'-ctb] = ch_lower,$; 3367 2 [%C'x'-ctb] = ch_lower,$; 3368 2 [%C'y'-ctb] = ch_lower,$; 3369 2 [%C'z'-ctb] = ch_lower,; 3370 2 ! numbers"; 3371 2 [%C'0'-ctb] = ch_oct,"; 3372 2 [%C'1'-ctb] = ch_oct,"; 3373 2 [%C'2'-ctb] = ch_oct,"; 3374 2 [%C'3'-ctb] = ch_oct,"; 3375 2 [%C'4'-ctb] = ch_oct,"; 3376 2 [%C'5'-ctb] = ch_oct,"; 3377 2 [%C'6'-ctb] = ch_oct,"; 3378 2 [%C'7'-ctb] = ch_oct,$; 3379 2 [%C'8'-ctb] = ch_8and9,$; 3380 2 [%C'9'-ctb] = ch_8and9,!; 3381 2 ! special characters]%; 3382 2 [%C'$'-ctb] = ch_dollar,=$; 3383 2 [%C'_'-ctb] = ch_under,"; 3384 2 [%C'.'-ctb] = ch_dot,$; 3385 2 [%C','-ctb] = ch_comma,$; 3386 2 [%C':'-ctb] = ch_colon,#; 3387 2 [%C'-'-ctb] = ch_dash,3$; 3388 2 [%C'"'-ctb] = ch_quote,#; 3389 2 [%C'*'-ctb] = ch_wild, #; 3390 2 [%C'%'-ctb] = ch_wild, #; 3391 2 [%C';'-ctb] = ch_misc,[#; 3392 2 [%C'['-ctb] = ch_misc,C"; 3393 2 [%C']'-ctb] = ch_dir, 9];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 112X;X1.10 Classify character 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (34)#; 3394 2 [%C'<'-ctb] = ch_misc,:$; 3395 2 [%C'>'-ctb] = ch_dir ); ; 3396 2 ; 3397 2 BUILTINC; 3398 2 R0; ; 3399 2 ; 3400 2 R0 = .char - ctb;0 ; 3401 2 !; 3402 2 IF .R0 GEQU cte - ctb-; 3403 2 THEN; 3404 3 BEGIN] ; 3405 3 "; 3406 3 SELECTONE .char OF; 3407 3 SET ; 3408 3 ; 3409 3 [0, 9, %C' '] :!; 3410 3 RETURN ch_space; ; 3411 3 ; 3412 3 [OTHERWISE] :!; 3413 3 RETURN ch_other;.; 3414 3 TES; ; 3415 3 ; 3416 2 END; ; 3417 2 %; 3418 2 RETURN .char_types [.R0]; ; 3419 1 END; .NLIST  .LIST BIN,LOC .LIST .PSECT $OWN$, D - CHAR.TYPES:4 .BYTE 7 .BYTE 0 .BYTE 14 .BYTE 11 .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 11  .BYTE 0 .BYTE 5 .BYTE 12c .BYTE 13  .BYTE 0 .BYTE 3 .BYTE 3 .BYTE 3 .BYTE 3 .BYTE 3 .BYTE 3 .BYTE 3 h];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 1134X;X1.10 Classify character 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (34) .BYTE 3 .BYTE 16 .BYTE 16S .BYTE 6 .BYTE 17. .BYTE 17. .BYTE 0 .BYTE 10H .BYTE 0 .BYTE 0 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 400appmmmffDATA .BYTE 4 .BYTE 4 .BYTE 17  .BYTE 0 .BYTE 105 .BYTE 0 .BYTE 15. .BYTE 0 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 114.X;X1.10 Classify character 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (34) .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1& .SBTTL CH$CLASSIFY Classify character .PSECT $CODE$, RO  .NLISTE .ENABL LSB .LIST CH$CLASSIFY: MOV R1,-(SP) ; 3288 MOV R1,R0 ; CHAR,R0 3400Y SUB #42,R0 ; *,R0a CMP R0,#131 ; R0,* 34021 BLO 4$A TST R1 ; CHAR 3409 BEQ 1$ CMP R1,#11 ; CHAR,*r BEQ 1$g CMP R1,#40 ; CHAR,*E BNE 2$R1$: MOV #2,R1 ; 3406 BR 3$ 2$: CLR R13$: MOV R1,R0 ; 3404 BR 5$-4$: MOVB CHAR.TYPES(R0),R0 ; *(R0),* 3418E5$: MOV (SP)+,R1 ; 3288B RTS PCA8; Routine Size: 25 words, Routine Base: $CODE$ + 10242.; Maximum stack depth per invocation: 2 words .NLIST .DSABL LSB, .NLIST BIN,LOC  .LIST 2];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 115r;X1.10 Copy, upcase, and compress a string and return 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (35)L; 3420 1 %SBTTL 'Copy, upcase, and compress a string and return a status'; 3421 1 GLOBAL_FOR_DEBUGR; 3422 1 ROUTINE ch$copy (len, in_ptr, out_ptr_p; out_ptr) : ch$copy_l NOVALUE= ; 3423 1 ; 3424 1 !++o ; 3425 1 !s%; 3426 1 ! FUNCTIONAL DESCRIPTION:O ; 3427 1 !J; 3428 1 ! The input string is copyed to the output string. During the:; 3429 1 ! copy operation it is upcased and compressed. ; 3430 1 !u ; 3431 1 ! FORMAL PARAMETERS: ; 3432 1 !./; 3433 1 ! len - Length of the input string ,; 3434 1 ! in_ptr - Input buffer pointer/; 3435 1 ! out_ptr_p - Output buffer pointerh ; 3436 1 !pE; 3437 1 ! out_ptr - Points to end of string in the output buffer ; 3438 1 ! ; 3439 1 !-- ; 3440 1 ; 3441 2 BEGIN4 ; 3442 2 ; 3443 2 MAPu5; 3444 2 in_ptr : REF VECTOR [, BYTE, SIGNED], 6; 3445 2 out_ptr : REF VECTOR [, BYTE, SIGNED]; ; 3446 2 ; 3447 2 LOCALO:; 3448 2 state, ! Quote state, zero is unquoted; 3449 2 char; ; 3450 2 F; 3451 2 out_ptr = .out_ptr_p; ! Discard the input parameter now4; 3452 2 state = 0; ! Quote state to unquoted ; 3453 2 ); 3454 2 INCRU i FROM 0 TO .len - 1 DO ; 3455 3 BEGIN $; 3456 3 char = .in_ptr [.i]; ; 3457 3 ; 3458 3 IF .state EQLU 0; 3459 3 THEN; 3460 4 BEGIN ; 3461 4 9; 3462 4 CASE ch$classify (.char) FROM 0 TO ch_max OFO; 3463 4 SET ; 3464 4 ; 3465 4 [ch_other] : ; 3466 4 ; 3467 4 ! ?; 3468 4 ! Characters other than the valid set that aren'tm(; 3469 4 ! quoted won't be upcased.; 3470 4 !t; 3471 5 BEGIN "; 3472 5 out_ptr [0] = .char;$; 3473 5 out_ptr = out_ptr [1]; ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 116 r;X1.10 Copy, upcase, and compress a string and return 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (35); 3474 4 END; ; 3475 4 ; 3476 4 [ch_quote] : ; 3477 5 BEGIN ; 3478 5 ; 3479 5 !i?; 3480 5 ! If quote, change the state and output character ; 3481 5 ! !; 3482 5 state = NOT .state;_"; 3483 5 out_ptr [0] = .char;$; 3484 5 out_ptr = out_ptr [1];; 3485 4 END; ; 3486 4 ; 3487 4 [ch_lower] :2 ; 3488 4 ; 3489 4 !p(; 3490 4 ! Upcase lowercase letters; 3491 4 !2; 3492 5 BEGINR*; 3493 5 char = .char AND NOT %O'40';"; 3494 5 out_ptr [0] = .char;$; 3495 5 out_ptr = out_ptr [1];; 349600apnncccc 4 END; ; 3497 4 ; 3498 4 [ch_space] :a ; 3499 4 ; 3500 4 ! ; 3501 4 ! Remove spacesO; 3502 4 !4; 3503 4 ; ; 3504 4 ; 3505 4 [INRANGE] : ; 3506 4 ; 3507 4 !6'; 3508 4 ! Output valid characters ; 3509 4 !9; 3510 5 BEGIN "; 3511 5 out_ptr [0] = .char;$; 3512 5 out_ptr = out_ptr [1];; 3513 4 END;; 3514 4 TES; ; 3515 4 ; 3516 4 END; 3517 3 ELSE; 3518 4 BEGIN ; 3519 4 ; 3520 4 !2; 3521 4 ! If quoted, output it no matter what; 3522 4 !9; 3523 4 IF .char EQLU %C'"' THEN state = NOT .state; ; 3524 4 !; 3525 4 out_ptr [0] = .char;#; 3526 4 out_ptr = out_ptr [1];5; 3527 3 END;l c];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 1172r;X1.10 Copy, upcase, and compress a string and return 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (35) ; 3528 3 ; 3529 2 END; ; 3530 2 ; 3531 2 !5?; 3532 2 ! Allow unbalanced quoted strings if there is room. ; 3533 2 !a; 3534 2 IF .state NEQU 0; 3535 2 THEN1; 3536 2 IF (.len + 1) LEQU file_spec_size ; 3537 2 THEN; 3538 3 BEGIN!; 3539 3 out_ptr [0] = %C'"';c#; 3540 3 out_ptr = out_ptr [1];B; 3541 2 END; ; 3542 1 END; .NLISTp .LIST BIN,LOC .LIST? .SBTTL CH$COPY Copy, upcase, and compress a string and return 0 .NLIST .ENABL LSB .LIST!CH$COPY:MOV R4,-(SP) ; 34221 MOV R5,-(SP)2 TST -(SP) MOV R2,-(SP)e MOV R1,2(SP)e CLR R5 ; STATE 3452 MOV R1,-(SP) ; 3454 DEC (SP)  CLR R4 ; I BR 8$1$: MOV R4,R2 ; I,* 3456 ADD 2(SP),R2  MOVB (R2),R1 ; *,CHAR TST R5 ; STATE 3458' BNE 4$ JSR PC,CH$CLASSIFY ; 3462 ASL R0 # ADD P.AAG(R0),PC ; Case dispatch"3$: BIC #40,R1 ; *,CHAR 3493 BR 6$ ; 3494"4$: CMP R1,#42 ; CHAR,* 3523 BNE 6$.5$: COM R5 ; STATEC*6$: MOVB R1,(R3)+ ; CHAR,OUT.PTR 35257$: INC R4 ; I 34548$: CMP R4,(SP) ; I,* BLOS 1$ TST R5 ; STATE 3534  BEQ 9$4 MOV 4(SP),R1 ; 3536 INC R1 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 118 r;X1.10 Copy, upcase, and compress a string and return 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (35) CMP R1,#377 BHI 9$$% MOVB #42,(R3)+ ; *,OUT.PTR 3539R9$: ADD #6,SP ; 3422 MOV (SP)+,R5 MOV (SP)+,R4) RTS PCR8; Routine Size: 48 words, Routine Base: $CODE$ + 10324.; Maximum stack depth per invocation: 7 words .PSECT $PLIT$, RO , D /P.AAG: ; CASE Table for CH$COPY+0050 3462i2$: .WORD 16 ; [6$] .WORD 0 ; [3$] .WORD 20 ; [7$]  .WORD 16 ; [6$]e .WORD 16 ; [6$]n .WORD 16 ; [6$]1 .WORD 16 ; [6$]R .WORD 14 ; [5$]0 .WORD 16 ; [6$]7 .WORD 16 ; [6$], .WORD 16 ; [6$]  .WORD 16 ; [6$]  .WORD 16 ; [6$]( .WORD 16 ; [6$]R .WORD 16 ; [6$]t .WORD 16 ; [6$]R .NLIST: .DSABL LSB3 .NLIST BIN,LOCc .LIST o];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 1193r;X1.10 Convert parse block from kernel virtual to user 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (36)L; 3543 1 %SBTTL 'Convert parse block from kernel virtual to user virtual'; 3544 1 GLOBAL_FOR_DEBUGQ; 3545 1 ROUTINE convert_parse (parse_block, k_virtual, u_virtual) : NOVALUE =$ ; 3546 1 ; 3547 1 !++D ; 3548 1 !%; 3549 1 ! FUNCTIONAL DESCRIPTION:O ; 3550 1 !D; 3551 1 ! Convert parse block address fields from kernel virtual; 3552 1 ! to user virtual. ; 3553 1 !a ; 3554 1 ! FORMAL PARAMETERS: ; 3555 1 ! 6; 3556 1 ! parse_block - Address of the parse block?; 3557 1 ! k_virtual - Address of string in executive buffertH; 3558 1 ! u_virtual - Address of corresponding string in user buffer ; 3559 1 !t; 3560 1 !-00appmmmffDATA- ; 3561 1 ; 3562 2 BEGIN7 ; 3563 2 ; 3564 2 MAP5>; 3565 2 parse_block : REF BLOCK FIELD (parse_block_f); ; 3566 2 ; 3567 2 LOCALs; 3568 2 p : REF VECTOR; ; 3569 2 (; 3570 2 p = parse_block [node_addr]; ; 3571 2 6; 3572 2 WHILE .p LEQA parse_block [access_addr] DO; 3573 3 BEGIN7 ; 3574 3 O; 3575 3 IF .p [0] NEQU 0 THEN p [0] = .p [0] - .k_virtual + .u_virtual;c ; 3576 3 ; 3577 3 p = p [2];; 3578 2 END; ; 3579 2 ; 3580 1 END; .NLIST  .LIST BIN,LOC .LISTE .SBTTL CONVERT.PARSE Convert parse block from kernel virtual to user  .PSECT $CODE$, RO  .NLIST .ENABL LSB  .LISTCONVERT.PARSE: JSR R1,$SAVE2 ; 3545l( MOV 14(SP),R1 ; PARSE.BLOCK,P 3570 ADD #6,R1 ; *,P_( MOV 14(SP),R2 ; PARSE.BLOCK,* 3572 ADD #42,R24 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 120 r;X1.10 Convert parse block from kernel virtual to user 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (36)1$: CMP R1,R2 ; P,* BHI 3$a TST (R1) ; P 3575a BEQ 2$  MOV (R1),R0 ; P,* SUB 12(SP),R0 ; K.VIRTUAL,* ADD 10(SP),R0 ; U.VIRTUAL,* MOV R0,(R1) ; *,P(2$: ADD #4,R1 ; *,P 3577 BR 1$ ; 35723$: RTS PC ; 35458; Routine Size: 24 words, Routine Base: $CODE$ + 10464.; Maximum stack depth per invocation: 4 words .NLIST .DSABL LSBX .NLIST BIN,LOCs .LIST r];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 121 a;X1.10 Save parse block and zero it 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (37);1; 3581 1 %SBTTL 'Save parse block and zero it',; 3582 1 GLOBAL_FOR_DEBUGA; 3583 1 ROUTINE save_parse (out_ptr) : save_parse_l NOVALUE = ; 3584 1 ; 3585 1 !++u ; 3586 1 !D%; 3587 1 ! FUNCTIONAL DESCRIPTION:n ; 3588 1 !rM; 3589 1 ! Copy the parse block to a specified save area and then zero it.aM; 3590 1 ! The operation is done in such a manner that it can be zeroed byX2; 3591 1 ! specifying the output as the scr_pb. ; 3592 1 !C ; 3593 1 ! FORMAL PARAMETERS: ; 3594 1 !L:; 3595 1 ! out_ptr - Address of the output parse block ; 3596 1 ! ; 3597 1 ! IMPLICIT OUTPUTS:v ; 3598 1 !U"; 3599 1 ! Scratch parse block. ; 3600 1 !D; 3601 1 !--U ; 3602 1 ; 3603 2 BEGIN ; 3604 2 ; 3605 2 LOCALe$; 3606 2 in_ptr : REF VECTOR; ; 3607 2 ; 3608 2 MAP %; 3609 2 out_ptr : REF VECTOR; ; 3610 2 ; 3611 2 in_ptr = scr_pb; ; 3612 2 0; 3613 2 DECR i FROM parse_block_size TO 1 DO; 3614 3 BEGIN4*; 3615 3 out_ptr [0] = .in_ptr [0];&; 3616 3 out_ptr = out_ptr [1];; 3617 3 in_ptr [0] = 0;$; 3618 3 in_ptr = in_ptr [1];; 3619 2 END; ; 3620 2 ; 3621 1 END; .NLIST  .LIST BIN,LOC .LIST/ .SBTTL SAVE.PARSE Save parse block and zero it: .NLISTO .ENABL LSB  .LIST SAVE.PARSE:$ MOV #SCR.PB,R2 ; *,IN.PTR 3611 MOV #23,R0 ; *,I 3613p,1$: MOV (R2),(R1)+ ; IN.PTR,OUT.PTR 3615 CLR (R2)+ ; IN.PTR 3617 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 122ta;X1.10 Save parse block and zero it 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (37); SOB R0,1$ ; I,* 3613 RTS PC ; 3583L7; Routine Size: 8 words, Routine Base: $CODE$ + 10544i.; Maximum stack depth per invocation: 0 words .NLISTC .DSABL LSB, .NLIST BIN,LOCM .LIST *];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 123];X1.10 Find Equivalence String 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (38),; 3622 1 %SBTTL 'Find Equivalence String'q; 3623 1 ROUTINE find_something (logical_addr, logical_len ; equiv_addr, equiv_len) : find_equivalence_l =t ; 3624 1 ; 3625 1 !++e ; 3626 1 !4%; 3627 1 ! FUNCTI00apnnccccONAL DESCRIPTION:n ; 3628 1 !LM; 3629 1 ! Find the equivalence string for the input logical name. ReturncS; 3630 1 ! status. If the input logical name starts with an '_' then return theu=; 3631 1 ! string less the '_' and the status of terminal.N ; 3632 1 ! ; 3633 1 ! FORMAL PARAMETERS: ; 3634 1 ! 9; 3635 1 ! logical_addr - Address of the logical name_?; 3636 1 ! logical_len - Length of the logical name in bytes ; 3637 1 !+<; 3638 1 ! equiv_addr - Address of the equivalence string:; 3639 1 ! equiv_len - Length of the equivalence string ; 3640 1 !a; 3641 1 ! ROUTINE VALUE: ; 3642 1 !h); 3643 1 ! success, terminal, or errorn ; 3644 1 ! ; 3645 1 !--g ; 3646 1 ; 3647 2 BEGIN ; 3648 2 ; 3649 2 !:; 3650 2 ! Define the LNB fields used in this routine.; 3651 2 !; 3652 2 FIELD; 3653 2 lnb_f =; 3654 2 SEToB; 3655 2 logical_link = [0, 0, 16, 0], ! Link to the next lnbB; 3656 2 logical_table = [1, 0, 8, 0], ! Logical table numberD; 3657 2 logical_type = [1, 8, 8, 0], ! Logical name block typeB; 3658 2 logical_status = [2, 0, 8, 0], ! Logical name statusH; 3659 2 terminal_logical = [2, 0, 1, 0],! Set for terminal logicalI; 3660 2 creator_group_number = [2, 8, 8, 0], ! Creator group numbero?; 3661 2 creator_ucb = [3, 0, 16, 0], ! Creator UCB (user)f?; 3662 2 creator_tcb = [3, 0, 16, 0], ! Creator TCB (task)]K; 3663 2 logical_length = [4, 0, 8, 0], ! Logical name length in bytesaO; 3664 2 equivalence_length = [4, 8, 8, 0], ! 32 word block offset of baseyH; 3665 2 logical_name_start = [5, 0, 16, 0] ! Start of logical name; 3666 2 TES; ; 3667 2 ; 3668 2 LITERAL@; 3669 2 lnb_size = 5; ! Size of the fixed part of the ; 3670 2 ! LNB in words ; 3671 2 ; 3672 2 LOCALE; 3673 2 logical_descriptor : BLOCK [logical_descriptor_size]eL; 3674 2 FIELD (logical_descriptor_f), ! Logical name descriptor block<; 3675 2 lnb_base, ! Base physical address of LNB ,];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 124o];X1.10 Find Equivalence String 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (38) F; 3676 2 lookup_len; ! The length that we actually look up ; 3677 2 ; 3678 2 OWN8; 3679 2 log_buf : VECTOR [ logical_size, BYTE]; ; 3680 2 ; 3681 2 BIND g; 3682 2 lnb = apr6_v : BLOCK [lnb_size] FIELD (lnb_f); ! Logical name descriptor block addressd ; 3683 2 ; 3684 2 LABEL; 3685 2 zero_compress;:; 3686 2 !K; 3687 2 ! Check for an underscore. If there is one return the logical1L; 3688 2 ! name less the underscore as the equivalence string along with&; 3689 2 ! the status of terminal.; 3690 2 !#; 3691 2 IF .logical_len GEQU 1l; 3692 2 THENo; 3693 3 BEGIN4; 3694 3 IF .(.logical_addr)<0,8> EQLU %C'_'8; 3695 3 THEN IF .logical_len EQLU 1 !PKW111+; 3696 3 THEN RETURN error !PKW1114 ; 3697 3 ELSE !PKW111; 3698 4 BEGIN0; 3699 4 equiv_addr = .logical_addr + 1;.; 3700 4 equiv_len = .logical_len - 1;!; 3701 4 RETURN terminal;v; 3702 3 END;h ; 3703 3 D; 3704 3 ! Unfortunately it is possible to call this routineE; 3705 3 ! specifying that a lun is not to be assigned. That F; 3706 3 ! means that the zero compression method of assigningC; 3707 3 ! the lun and then doing a GLUN won't always work.H; 3708 3 ! So we have to do the zero compression by hand. GACK.H; 3709 3 ! We also need to strip off any colons before we do theL; 3710 3 ! lookup. Note that zero compression is only done if thereB; 3711 3 ! is exactly one colon on the end of the logical. ; 3712 3 P; 3713 3 ch$copy (.logical_len, .logical_addr, log_buf [0]; lookup_len);8; 3714 3 looku00appmmmffDATAp_len = .lookup_len - log_buf [0];9; 3715 3 IF .log_buf [.lookup_len - 1] EQLU %C':'o; 3716 3 THEN!; 3717 4 BEGIN +; 3718 4 lookup_len = .lookup_len - 1; T; 3719 4 IF .log_buf [.lookup_len - 1] EQLU %C':' ! If two colons it's a node/; 3720 4 THEN lookup_len = .lookup_len - 1e; 3721 4 ELSE ; 3722 4 zero_compress:; 3723 5 BEGIN2; 3724 5 MACRO$; 3725 5 !N; 3726 5 ! NEXT_CHAR gets the next character and returns true if success; 3727 5 !; M 3728 5 next_char =; M 3729 5 BEGIN L];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 125-];X1.10 Find Equivalence String 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (38) '; M 3730 5 char = .(.ptr)<0, 8, 1>;e; M 3731 5 ptr = .ptr + 1;!; M 3732 5 .ptr LEQA .end_ptr ; 3733 5 END %; ; 3734 5 ; 3735 5 REGISTER; 3736 5 char; ; 3737 5 ; 3738 5 LOCALf; 3739 5 ptr, ; 3740 5 end_ptr,_; 3741 5 zero_count,; 3742 5 status,; 3743 5 i;- ; 3744 5 7; 3745 5 ptr = log_buf [0]; ! Start of scanE/; 3746 5 end_ptr = .ptr + .lookup_len;U ; 3747 5 g; 3748 5 IF NOT next_char THEN LEAVE zero_compress; ! The first two characters must be letters /; 3749 5 status = ch$classify (.char); H; 3750 6 IF (.status NEQU ch_alpha) AND (.status NEQU ch_lower)+; 3751 5 THEN LEAVE zero_compress;rg; 3752 5 IF NOT next_char THEN LEAVE zero_compress; ! The first two characters must be letters /; 3753 5 status = ch$classify (.char); H; 3754 6 IF (.status NEQU ch_alpha) AND (.status NEQU ch_lower)+; 3755 5 THEN LEAVE zero_compress;E!; 3756 5 zero_count = 0;t<; 3757 5 WHILE next_char DO ! Now look for zeros#; 3758 5 IF .char EQLU %C'0' .; 3759 5 THEN zero_count = .zero_count+1; 3760 5 ELSE EXITLOOP;LX; 3761 5 IF .zero_count EQLU 0 THEN LEAVE zero_compress; ! If none, then leave.P; 3762 5 IF .ptr GTRU .end_ptr THEN ! If no following characters,:; 3763 6 BEGIN ! Then just lop off the zeros6; 3764 6 lookup_len = .lookup_len - .zero_count;#; 3765 6 LEAVE zero_compress;t; 3766 5 END; 5; 3767 5 DO ! Now look for octal digits82; 3768 5 IF ch$classify (.char) NEQU ch_oct ?; 3769 5 THEN LEAVE zero_compress ! Anything else, exit1"; 3770 5 WHILE next_char;A; 3771 5 ptr = log_buf [2]; ! Now chop out the zeros.6; 3772 5 end_ptr = log_buf [2] + .zero_count;9; 3773 5 lookup_len = .lookup_len - .zero_count;r7; 3774 5 DECR i FROM (.lookup_len - 2) TO 0 DO;; 3775 6 BEGIN6; 3776 6 (.ptr)<0, 8, 1> = .(.end_ptr)<0, 8, 1>;; 3777 6 ptr = .ptr + 1;&; 3778 6 end_ptr = .end_ptr + 1;; 3779 5 END; ; 3780 4 END;; 3781 3 END; ; 3782 3 ; 3783 3 ! ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 126 ];X1.10 Find Equivalence String 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (38)oC; 3784 3 ! Settup the input logical name length and address D; 3785 3 ! in the logical descriptor block. Then attempt toE; 3786 3 ! do the translation. The block_type, table_number, H; 3787 3 ! address_base, matching_tcb_ucb fields and $TONYL were0; 3788 3 ! settup during initialization.; 3789 3 ! ; 3790 3 ;; 3791 3 logical_descriptor [length] = .lookup_len;uZ; 3792 3 logical_descriptor [address_disp_apr6] = log_buf [0] + (apr6_v - apr5_v);I; 3793 3 $TONYL = .saved_inhibit_mask; ! Settup the inhibit mask Y; 3794 3 logical_descriptor [block_type] = .init_logical_descriptor [block_type];.]; 3795 3 logical_descriptor [table_number] = .init_logical_descriptor [table_number];$]; 00apnncccc3796 3 logical_descriptor [address_base] = .init_logical_descriptor [address_base];e; 3797 3 logical_descriptor [matching_tcb_ucb] = .init_logical_descriptor [matching_tcb_ucb];e ; 3798 3 O; 3799 3 IF TBSRC_BLI (logical_descriptor; lnb_base) THEN RETURN error;; ; 3800 3 C; 3801 3 KISAR6 = .lnb_base; ! Map the logical name blocknK; 3802 3 equiv_len = .lnb [equivalence_length]; ! Return the lengthb ; 3803 3 ; 3804 3 !T; 3805 3 ! The equivalence string follows the logical name string in the lnb; 3806 3 !O; 3807 3 equiv_addr = lnb [logical_name_start] + .lnb [logical_length];l ; 3808 3 ; 3809 3 !,; 3810 3 ! Return terminal if it is.; 3811 3 !N; 3812 3 RETURN IF .lnb [terminal_logical] THEN terminal ELSE success; ; 3813 3 ; 3814 3 END; 3815 2 ELSEv8; 3816 2 RETURN error; ! No logical comming in7; 3817 1 END; ! End of routine find_equivalenceu .NLISTs .LIST BIN,LOC .LIST .PSECT $OWN$, D  .EVENLOG.BUF:.BLKB 3777LNB= -400000 .SBTTL FIND.EQUIVALENCE Find Equivalence String .PSECT $CODE$, RO  .NLIST .ENABL LSB  .LISTFIND.EQUIVALENCE:. ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 127;];X1.10 Find Equivalence String 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (38)  MOV R3,-(SP) ; 3623 MOV R4,-(SP)n MOV R5,-(SP)n SUB #16,SPu MOV R2,R4 ; *,LOGICAL.LENI MOV R1,R0 ; *,LOGICAL.ADDR TST R4 ; LOGICAL.LEN 3691 BNE 1$0 JMP 15$,1$: CMPB (R0),#137 ; LOGICAL.ADDR,* 3694 BNE 4$ % CMP R4,#1 ; LOGICAL.LEN,* 3695 BNE 2$I CLR R1 ; 3698D BR 3$)2$: MOV #1,(SP) ; *,EQUIV.ADDR 36991) ADD R0,(SP) ; LOGICAL.ADDR,EQUIV.ADDRX. MOV R4,2(SP) ; LOGICAL.LEN,EQUIV.LEN 3700 DEC 2(SP) ; EQUIV.LENP MOV #3,R1 ; 36983$: MOV R1,R0 ; 3695, BR 14$M(4$: MOV R4,R1 ; LOGICAL.LEN,* 3713 MOV R0,R2 ; LOGICAL.ADDR,* MOV #LOG.BUF,R3 JSR PC,CH$COPYC) SUB #LOG.BUF,R3 ; *,LOOKUP.LEN 3714B1 CMPB LOG.BUF-1(R3),#72 ; *(LOOKUP.LEN),* 3715P BNE 12$ DEC R3 ; LOOKUP.LEN 3718I1 CMPB LOG.BUF-1(R3),#72 ; *(LOOKUP.LEN),* 3719  BNE 5$V DEC R3 ; LOOKUP.LEN 3720  BR 12$ ; 3719X&5$: MOV #LOG.BUF,R2 ; *,PTR 3745) MOV R3,R5 ; LOOKUP.LEN,END.PTR 3746# ADD R2,R5 ; PTR,END.PTR1# MOVB (R2)+,R1 ; PTR,CHAR 3748  CMP R2,R5 ; PTR,END.PTR7 BHI 12$ JSR PC,CH$CLASSIFY ; 3749 CMP R0,#4 ; STATUS,* 3750 BEQ 6$3 CMP R0,#1 ; STATUS,* BNE 12$ ; 3751&6$: MOVB (R2)+,R1 ; PTR,CHAR 3752 CMP R2,R5 ; PTR,END.PTR1 BHI 12$ JSR PC,CH$CLASSIFY ; 3753 CMP R0,#4 ; STATUS,* 3754 BEQ 7$E CMP R0,#1 ; STATUS,* BNE 12$ ; 3755"7$: CLR R4 ; ZERO.COUNT 3756 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 128 ];X1.10 Find Equivalence String 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (38)T&8$: MOVB (R2)+,R1 ; PTR,CHAR 3757 CMP R2,R5 ; PTR,END.PTR1 BHI 9$B CMP R1,#60 ; CHAR,* 3758C BNE 9$  INC R4 ; ZERO.COUNT 3759P BR 8$ ; 3758"9$: TST R4 ; ZERO.COUNT 3761 BEQ 12$# CMP R2,R5 ; PTR,END.PTR 3762$ BLOS 10$7, SUB R4,R3 ; ZERO.COUNT,LOOKUP.LEN 3764 BR 12$ ; 3763c$10$: JSR PC,CH$CLASSIFY ; 3768 CMP R0,#3 BNE 12$ ; 3769# MOVB (R2)+,R1 ; PTR,CHAR 3770- CMP R2,R5 ; PTR,END.PTRP BLOS 10$I% MOV #LOG.BUF+2,R2 ; *,PTR 3771,) MOV R4,R5 ; ZERO.COUNT,END.PTR 3772! ADD R2,R5 ; LOG.BUF+2,END.PTR , SUB R4,R3 ; ZERO.COUNT,LOOKUP.LEN 3773$ MOV R3,R0 ; LOOKUP.LEN,I 3774 SUB #2,R0 ; *,I7 BLT 12$-11$: MOVB (R5)+,(R2)+ ; END.PTR,PTR 3776  DEC R0 ; I 3774O BGE 11$612$: MOV R3,4(SP) ; LOOKUP.LEN,LOGICAL.DESCRIP 37918 MOV #LOG.BUF+20000,10(SP) ; *,LOGICAL.DESCRIP+4 3792) MOV00appmmmffDATA SAVED.INHIBIT.MASK,$TONYL ; 3793RB MOVB INIT.LOGICAL.DESCRIPTOR+7,13(SP); *,LOGICAL.DESCRIP+6 3794B MOVB INIT.LOGICAL.DESCRIPTOR+6,12(SP); *,LOGICAL.DESCRIP+6 3795A MOV INIT.LOGICAL.DESCRIPTOR+2,6(SP) ; *,LOGICAL.DESCRIP+2 3796M) MOV INIT.LOGICAL.DESCRIPTOR+10,14(SP) ; ,# ; *,LOGICAL.DESCRIP+10 3797) MOV #4,R0 ; 3799! ADD SP,R0 ; LOGICAL.DESCRIP,*B JSR PC,TBSRC.BLI, BLO 15$% MOV R3,KISAR6 ; LNB.BASE,* 3801#! CLR 2(SP) ; EQUIV.LEN 3802E$ MOVB @#140011,2(SP) ; *,EQUIV.LEN! CLR (SP) ; EQUIV.ADDR 3807G$ MOVB @#140010,(SP) ; *,EQUIV.ADDR! SUB #37766,(SP) ; *,EQUIV.ADDRD BIT #1,@#140004 ; 3812E BEQ 13$ MOV #3,R0 BR 16$A13$: MOV #1,R014$: BR 16$ ; 3816 15$: CLR R0 ; 3623E I];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 129 ];X1.10 Find Equivalence String 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (38)C!16$: MOV 2(SP),R2 ; EQUIV.LEN,*V MOV (SP)+,R1 ; EQUIV.ADDR,* ADD #14,SP MOV (SP)+,R5 MOV (SP)+,R4# MOV (SP)+,R3  RTS PCD9; Routine Size: 168 words, Routine Base: $CODE$ + 10564 /; Maximum stack depth per invocation: 13 wordsV .NLIST4 .DSABL LSB; .NLIST BIN,LOCC .LIST 3];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 130P\;X1.10 Convert RAD50 to ASCII 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (39)+; 3818 1 %SBTTL 'Convert RAD50 to ASCII'Vz; 3819 1 ROUTINE RAD50_to_ASCII (ascii_len, ascii_addr, rad50_addr; return_ascii_addr) : RAD50_to_ASCII_l NOVALUE = ; 3820 1 ; 3821 1 !++E ; 3822 1 !a%; 3823 1 ! FUNCTIONAL DESCRIPTION:o ; 3824 1 !K; 3825 1 ! Convert a RAD50 string to ASCII. Trailing blanks suppressed.e ; 3826 1 !6; 3827 1 !--B; 3828 2 BEGINg; 3829 2 MAPr-; 3830 2 ascii_addr : REF VECTOR [,BYTE],O4; 3831 2 return_ascii_addr : REF VECTOR [,BYTE],%; 3832 2 rad50_addr : REF VECTOR; ; 3833 2 ; 3834 2 LOCALa4; 3835 2 t : VECTOR [2], ! Temporary for divide; 3836 2 char,; 3837 2 control; ; 3838 2 3; 3839 2 return_ascii_addr = ascii_addr [0];8 ; 3840 2 ; 3841 2 ! 3; 3842 2 ! Move the string to output buffer.; 3843 2 ! 2; 3844 2 control = 0; ! Initialize control ; 3845 2 .; 3846 2 DECR i FROM .ascii_len TO 1 DO; 3847 3 BEGIN; 3848 3 BUILTIN; 3849 3 EDIV; ; 3850 3 ; 3851 3 IF .control EQL 0; 3852 3 THEN8; 3853 4 BEGIN; 3854 4 t [1] = 0;8); 3855 4 t [0] = .rad50_addr [0];8-; 3856 4 rad50_addr = rad50_addr [1];i!; 3857 4 control = 40*40;1; 3858 3 END; ; 3859 3 0; 3860 3 IF .t [0] GTRU (39*40 + 39)*40 + 39; 3861 3 THENo; 3862 3 char = '?'; 3863 3 ELSE8; 3864 4 BEGIN0; 3865 4 EDIV (control, t, char, t [0]); ; 3866 4 $; 3867 4 SELECTONEU .char OF; 3868 4 SETl ; 3869 4 ; 3870 4 [0] :3; 3871 4 EXITLOOP;  t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 131r\;X1.10 Convert RAD50 to ASCII 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (39) ; 3872 4 ; 3873 4 [1 TO 26] :8+; 3874 4 char = .char + %C'A' - 1; ; 3875 4 ; 3876 4 [27] :,; 3877 4 char = .char + %C'$' - 27; ; 3878 4 ; 3879 4 [28] :,; 3880 4 char = .char + %C'.' - 28; ; 3881 4 ; 3882 4 [29] :,; 3883 4 char = .char + %C'?' - 29; ; 3884 4 ; 3885 4 [OTHERWISE] : ,; 3886 4 char = .char + %C'0' - 30;; 3887 4 TES;; 3888 3 END;0 ; 3889 3 +; 3890 3 return_ascii_addr [0] = .char;7; 3891 3 return_ascii_addr = return_ascii_addr [1];r#; 3892 3 control = .control/40;6; 3893 2 END; ! DECR ; 3894 2 ); 3895 1 END; ! RAD50_to_ASCII  .NLIST  .LIST BIN,LOC00apnncccc .LIST- .SBTTL RAD50.TO.ASCII Convert RAD50 to ASCII2 .NLIST .ENABL LSB  .LISTRAD50.TO.ASCII:; MOV R1,-(SP) ; 3819 MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP)r CMP -(SP),-(SP) CLR R5 ; CONTROL 3844% MOV R1,-(SP) ; ASCII.LEN,I 3846r BLE 8$i1$: TST R5 ; CONTROL 3851  BNE 2$s CLR 4(SP) ; T+2 3854) MOV (R3)+,2(SP) ; RAD50.ADDR,T 3855# MOV #3100,R5 ; *,CONTROL 38574&2$: CMP 2(SP),#174777 ; T,* 3860 BLOS 3$ MOV #77,R4 ; *,CHAR 3862 BR 7$ ; 3860!3$: MOV 2(SP),R1 ; T,* 3865  MOV 4(SP),R0 ; T,* DIV R5,R0 ; CONTROL,*( MOV R0,R4 ; *,CHAR (];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 132(\;X1.10 Convert RAD50 to ASCII 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (39) MOV R1,2(SP) ; *,T( TST R4 ; CHAR 3870 BEQ 8$ ; 3871  CMP R4,#32 ; CHAR,* 3873( BHI 4$7 ADD #100,R4 ; *,CHAR 3874 BR 7$ ; 3867"4$: CMP R4,#33 ; CHAR,* 3876 BNE 5$1 ADD #11,R4 ; *,CHAR 3877  BR 7$ ; 3867"5$: CMP R4,#34 ; CHAR,* 3879 BEQ 6$ ; 3880  CMP R4,#35 ; CHAR,* 3882: BNE 6$- ADD #42,R4 ; *,CHAR 3883( BR 7$ ; 3867"6$: ADD #22,R4 ; *,CHAR 388617$: MOVB R4,(R2)+ ; CHAR,RETURN.ASCII.AD 3890P! MOV R5,R1 ; CONTROL,* 38928 SXT R08 DIV #50,R07 MOV R0,R5 ; *,CONTROL  DEC (SP) ; I 38460 BNE 1$ 8$: ADD #6,SP ; 3819 MOV (SP)+,R5 MOV (SP)+,R4R MOV (SP)+,R3E MOV (SP)+,R1R RTS PCC8; Routine Size: 71 words, Routine Base: $CODE$ + 11304/; Maximum stack depth per invocation: 11 words  .NLIST .DSABL LSBE .NLIST BIN,LOC  .LIST ; 3896 1 (; 3897 1 END ! End of module ; 3898 1 ; 3899 0 ELUDOM .NLISTR .LIST BIN,LOC .LIST; OTS external references .GLOBL $SAVE5, $SAVE3, $SAVE2 .PSECT $OWN$, D ( ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 133(\;X1.10 Convert RAD50 to ASCII 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (39) .EVEN; PSECT SUMMARYo;i!; Psect Name Words ; AttributesS1; $OWN$ 747 ; RW , D , LCL, REL, CON 2; $CODE$ 2473 ; RO , I , LCL, REL, CON2; $PLIT$ 100 ; RO , D , LCL, REL, CON; Library Statistics;L9; -------- Symbols -------- Pages ProcessingD9; File Total Loaded Percent Mapped Time1;i\; SYS$COMMON:[SYSLIB]RSX11M.L16;1 1500 5 0 96 00:00.2[; SYS$COMMON:[SYSLIB]FCS11.L16;1 396 32 8 42 00:00.2i; COMMAND QUALIFIERS7; BLISS/PDP/MACH=(ASS,NOBIN)/NOOBJ/LIST=DRPFN.MAC DRPFN #; Size: 2473 code + 848 data words ; Run Time: 01:39.8; Elapsed Time: 02:38.6; Lines/CPU Min: 2345; Lexemes/CPU-Min: 19712; Memory Used: 567 pages; Compilation Complete e .SBTTL Assign the LUN; B; This routine is called to assign the LUN. This is a duplication;; of the code in DRASG. DRASG should be moved into the 4th 3; directive common so that this code may be common.i;;#; R3=ADDRESS OF THE LUN IN THE DPB. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.R,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; R0=Device name; R1=Unit number; R2=Terminal logical flag;:?; Outputs: The address of a routine to call to return status iso; returned in R0;e&; Directive status of +1 is returned.;e5; Directive status of 'D.RS90' is returned if a file 2; is open or unit attached on the specified LUN.5; Directive status of 'D.RS92' is returned if devicem; and/or unit is invalid. ;- .PSECTEDNAME: .BLKW 1UNITN: .BLKW 1TFLAG: .BLKW 1 TUCB: .BLKW 1D LUN.ASSIGN:  MOV R0,DNAME ; Save inputsc MOV R1,UNITNi MOV R2,TFLAGT% CALL $MPLUN ; Map LUN to device UCBa" TST (R1) ; File accessed on LUN? BNE 40$ ; If ne yese# MOV R0,-(SP) ; Save addre00appmmmffDATAss of UCB+- MOV R1,R4 ; Save address of second LUN wordS" MOV DNAME,R2 ; Get name of device MOVB UNITN,R0 ; Get unit number .IF DF M$$MUP$ BIT #T3.SLV,T.ST3(R5) ; Slave task?2 BNE 17$ ; If ne yes, bypass logical device table .ENDC TST TFLAG ;L1 BNE 17$ ; Terminal logical name. don't do more  ; translations. MOV T.UCB(R5),R1 ; Get the current task's ti: CALL $GTUSR: MOV #$LNTDR,-(SP) ; Resolve any logical name translations5 CALL $MPDC3 ; Use routine in third directive common / BCC 17$ ; If CC, successfully matched logicalr3 TST R3 ; See if error occurred or no match at all0) BNE 50$ ; If ne, invalid match occurredT2 MOV #$LOGHD,R3 ; Point to logical assignment list-13$: MOV (R3),R3 ; Get address of next entryT BEQ 17$ ; If eq end of listl* TSTB L.TYPE(R3) ; System wide assignment? BEQ 15$ ; If eq yes)1 CMP L.UCB(R3),T.UCB(R5) ; TI: UCB address match?V BNE 13$ ; If ne no*15$: CMP R2,L.NAM(R3) ; Device name match? BNE 13$ ; If ne no( CMPB R0,L.UNIT(R3) ; Unit number match? BNE 13$ ; If ne no. MOV L.ASG(R3),R1 ; Get assignment UCB address BR 25$ ; Finish in common code517$: MOV #$DEVHD,R3 ; Point to physical device tablesg+20$: MOV (R3),R3 ; Get address of next DCB  BEQ 50$ ; If eq end of tables & CMP R2,D.NAM(R3) ; Device name match? BNE 20$ ; If ne noA CMPB R0,D.UNIT(R3) ; Unit greater than or equal to low boundary?e BLO 20$ ; If lo noA CMPB R0,D.UNIT+1(R3) ; Unit less than or equal to high boundary?  BHI 20$ ; If hi no3 SUB D.UNIT(R3),R0 ; Calculate relative unit numberM# BIC #177400,R0 ; Clear excess bitsa/ MOV D.UCBL(R3),R1 ; Get length of UCB in bytesM' CALL $MUL ; Calculate number of bytest, ADD D.UCB(R3),R1 ; Calculate address of UCB25$: ; Ref labelf .IF DF V$$TRM# MOV (R1),R3 ; Point to device DCB7 CMP D.NAM(R3),#"VT ; Is the device a virtual terminal?t BNE 26$ ; If ne no0 CMP U.PTCB(R1),R5 ; Is issuing task the parent? BEQ 26$ ; If eq no1 CMP R1,T.UCB(R5) ; Is issuing task an offspring?S BNE 50$ ; If ne no .ENDC026$: MOV (SP)+,R3 ; Was LUN previously assigned? BEQ 30$ ; If EQ no2 CMP R5,U.ATT(R3) ; Unit attached to current task? BNE 27$ ; If NE no/ MOV R1,-(SP) ; Save new assignment UCB address: MOV R1,R0 ; Copy UCB address' CALL $MPLND ; Map to real UCB addressC3 MOV (SP)+,R1 ; Retrieve new assignment UCB addressm/ CMP R0,R3 ; New assignment to same final UCB?; BNE 35$ ; If NE no127$: MOV R3,R5 ; Copy old assignment UCB addresss& MOV R1,-(R4) ; Assign LUN to new unit. MOV R1,TUCB ; Save the UCB address to return CALL $IOKIL" CLR R0 ; No bad status to return& MOV TUCB,R1 ; Return the UCB address31$: RETURN ;f*30$: MOV R1,-(R4) ; Assign LUN to new unit BR 31$s(35$: MOV R1,-(SP) ; Save new UCB pointer .IF DF X$$HDR( MOV $SAHPT,R1 ; Get task header address .IFFn( MOV $HEADR,R1 ; Get task header address .ENDC- ADD #H.NLUN,R1 ; Point to the number of LUNs  MOV (R1),-(SP) ; Pick up counts637$: CMP (R1)+,(R1)+ ; Advance to next UCB pointer + 2+ CMP R1,R4 ; Same LUN as being reassigned?I BEQ 39$ ; If eq yesa( MOV -2(R1),R0 ; Get this LUN assignment# BEQ 39$ ; If eq, LUN not assigned/ CALL $MPLND ; Follow any redirect; handle ti:s4 CMP R0,R3 ; LUN assigned to same dev as reass LUN? BNE 39$ ; No, branch TST (SP)+ ; Remove count& MOV (SP)+,R1 ; Get new LUN assignment+ BR 27$ ; If eq yes, attach can be ignored "39$: DEC (SP) ; Point to next LUN BGT 37$ ; Try againn CMP (SP)+,(SP)+ ; Clean stack)40$: MOV #RS90,R0 ; Status return routinee RETURNe50$: TST (SP)+ ; Clean stacke% MOV #RS92,R0 ; Status return routines RETURN*RS90: DRSTS D.RS90 ; Set directive status*RS92: DRSTS D.RS92 ; Set directive status P8 .SBTTL Registers save and restore routines for BLISS-16; B; Register save and restore routines used by BLISS generated code.;i .PSECT BL$COD,RO,I,LCL,CON  $SAVE2:g MOV R2,-(SP)C MOV R1,-(SP)t MOV 4(SP),R1T JSR PC,@(SP)+ BR RE2($SAVE3:; MOV R00apbpncccc2,-(SP) MOV R3,-(SP)R MOV R1,-(SP)r MOV 6(SP),R1T JSR PC,@(SP)+ BR RE3 $SAVE4:e MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP)R MOV R1,-(SP)T MOV 8.(SP),R1 JSR PC,@(SP)+ BR RE4R$SAVE5: MOV R2,-(SP) MOV R3,-(SP)B MOV R4,-(SP)a MOV R5,-(SP)r MOV R1,-(SP)S MOV 10.(SP),R1t JSR PC,@(SP)+ MOV (SP)+,R5eRE4: MOV (SP)+,R4dRE3: MOV (SP)+,R3 RE2: MOV (SP)+,R2 MOV (SP)+,R1g RTS PC, A .SBTTL Stub routines to call routines in other directive commons; .PSECT(;+C; $DCBTA - Routine to turn a binary value into an ASCII text stringE; ; Inputs:); R0 - Number to be translated into ASCIIP3; R3 - Pointer to buffer to store translated numberB;E ; Outputs:$; R3 - Points past the number string;RH; This routine will not translate a zero unit number into an ASCII digit;M;- DCBTA.BLI:, BIC #177400,R0 ;PREVENT SIGN PROPAG. IN ASH! ;(0 ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; B. S. MCCARTHY 28-NOV-83 ; & ; MODIFIED FOR RSX-11M-PLUS V4.0 BY: ;T ; R. D. HANEY 25-APR-86.0 ; RDH047 ADD SYMBOLS FOR BYE AND HELLO 01.01 ;% ; B. S. MCCARTHY 10-MAY-86 01.02L0 ; BM370 -- ADD SYMBOLS NEEDED BY SPM-11M-PLUS ;" ; G. N. LARSEN 5-JUN-86 01.03 ; GNL040 ADD SYMBOL FOR PMT  ;R$ ; T. SCHOELLER 18-JULY-86 01.04' ; TMS038 ADD SYMBOLS FOR DMO AND MOUL ;E# ; G. N. LARSEN 28-JUL-86 01.05I, ; GNL048-- ADD VECTORED SYMBOLS FOR MSDRV ;$ ; T. SCHOELLER 30-JULY-86 01.06" ; TMS038 ADD SYMBOLS FOR F11ACP ;T" ; R. KRISHNA 31-JULY-86 01.07 ; RK050 ADD SYMBOLS FOR MCR ;0# ; G. N. LARSEN 15-AUG-86 01.08-7 ; GNL048-- ADD VECTORED SYMBOLS FOR DLDRV, ERROR LOG- ;# ; G. N. LARSEN 20-SEP-86 01.09.. ; GNL048-- ADD VECTORED SYMBOLS FOR INSTALL ;H# ; G. N. LARSEN 17-OCT-86 01.103, ; GNL061 -- ADD ADDITIONAL DECNET SYMBOLS ;S% ; B. S. MCCARTHY 20-OCT-86 01.11D+ ; BM374 -- ADD ADDITIONAL DECNET SYMBOLSH ;R# ; J. W. BERZLE 29-OCT-86 01.12 / ; JWB185 -- CONDITIONALIZE $RTF01/2 ON MPNET8 ;0# ; J. W. BERZLE 28-JAN-87 01.13( ; JWB190 -- ADD SYMBOL $TNAME FOR MCR ; " ; G. N. LARSEN 4-FEB-87 01.145 ; GNL065 -- ADD ADDITIONAL TASK AND DRIVER SYMBOLS1 ;$ ; B. S. MCCARTHY 9-FEB-87 01.153 ; BM383 -- ADD THE SYMBOLS THAT ARE MISSING FROM ; THE ABOVED ;T# ; J. W. BERZLE 20-FEB-87 01.16 . ; JWB193 -- CONDITIONALIZE $TRINT ON C$$CDA ;I$ ; B. S. MCCARTHY 5-MAR-87 01.170 ; BM385 -- ADD SFVEC ENTRY POINT FOR BEING IN ; VEC11M ; $ ; B. S. MCCARTHY 7-MAR-87 01.18" ; BM386 -- ADD $TTPRM TO VECTOR ;T$ 00bppmmmffDATA; B. S. MCCARTHY 7-MAR-87 01.19" ; BM387 -- ADD $WCFLG TO VECTOR ;T% ; B. S. MCCARTHY 20-APR-87 01.20& ; BM396 -- ADD $CPSEN,$CPALO,$CPDEA ;3$ ; B. S. MCCARTHY 7-JUL-87 01.21% ; BM403 -- ADD XDT AND CPR SYMBOLS  ;E; EXEC VECTORING ROUTINE; C; AS YOU MAY HAVE NOTICED IN THE .TITLE DIRECTIVE, THIS MODULE IS G; ASSEMBLED CONDITIONALLY UPON R$$MPL. THE MODULE IS ASSEMBLED TWICE.I; THE FIRS TIME (ASSEMBLED WITH RSXMC), PRODUCES THE VECTOR CODE ITSELFTL; FOR THE EXEC (MODULE SFVC2). THE SECOND ASSEMBLY, WITHOUT RSXMC, CREATESJ; AN OBJECT MODULE (MODULE EXESTB) WHICH CAN BE TASKBUILT INTO THE DUMMY; STB FILE FOR THE EXECUTIVE.C;+0; **-$SFVCD-TRANSLATE EXEC VECTOR (FOR DRIVER)6; **-$SFVCP-TRANSLATE EXEC VECTOR (FOR COMM PROCESS);HH; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TRANSLATE A VECTOR OF OFFSETSH; INTO THE SYSTEM VECTOR (DEFINED BELOW) INTO OFFSETS. SEE COMMENTS ON; BUFFER FORMAT BELOW.;T&; * * * N O T E W E L L * * * ;UK!; THESE ROUTINES ARE AT VIRTUAL ZERO IN THE DIRECTIVE COMMON. THE ROUTINE(J"; COULD BE MOVED, BUT LABEL $SFVCP HAD BETTER STAY AT ZERO FOR ALL TIME,#; AND $SFVCD AT VIRTUAL 4$$;- %; INPUTS:C&;O='; R2=NUMBER OF ENTRIES IN VECTOR (NUMBER OF WORDS, LESS ONER(; FOR FLAGS WORD)(); R3=ADDRESS OF WD. 00. OF THE BUFFER.*;F9+; CALLING SEQUENCE ($SFVCD): (REGISTER USAGE ARBITRARY)F,;.3-; MOV @#112,R0 ;GET POINTER TO VECTOR OF POINTERS 7.; MOV @(R0),KINAR6 ;MAP ROUTINE WITH CORRECT APR BIASN)/; CALL @#140004 ;CALL TRANSLATE ROUTINEM0;H91; CALLING SEQUENCE ($SFVCP): (REGISTER USAGE ARBITRARY) 2;A33; MOV @#112,R0 ;GET POINTER TO VECTOR OF POINTERS64; MOV @(R0),-(SP) ;MAP ROUTINE WITH CORRECT APR BIAS55; MOV #120000,-(SP) ;GET ADDR. OF TRANSLATE ROUTINEW56; CALL $MPPRO ;CALL ROUTINE IN EXEC WHICH MAPS AND7; ;CALLS TRANSLATE ROUTINEI8;U 9; OUTPUTS::;8;; THE VECTOR IS FILLED WITH THE REQUESTED INFORMATION.<;O=;-> .PAGE?@ .IF DF R$$MPLA=B$SFVCP::JMP SFVCC ;ENTRY POINT TO TRANSLATE PROCESS VECTOR C4D$SFVCD:: ;ENTRY POINT TO TRANSLATE DRIVER VECTOREF .IF DF K$$DASG1H MOV @#KDSAR6,-(SP) ;SAVE MAPPING OF DATA SPACE 7I MOV @#KINAR6,@#KDSAR6;OVERMAP I/D (CALLER CAN'T TELL %J ;THIS MUST BE DONE, BECAUSE THEA)K ;FEATURE MASK ISN'T AVAILABLE YET). LM .ENDC ; DF K$$DASN#O TST (R3) ;FIRST WORD NON-ZERO ?*P ;(IMPLIES VECTOR ALREADY TRANSLATED)"Q BNE 40$ ;IF NE YES, RETURN NOWR5S INC (R3)+ ;SET FLAG FOR VECTOR ALREADY TRANSLATEDO$T10$: MOV (R3),R0 ;GET NEXT OFFSET'U CMP R0,#MAXOFF ;PAST END OF VECTOR ?EV BHIS 20$ ;IF HIS YESW BIT #1,R0 ;ODD ?X BNE 20$ ;IF NE YES2Y MOV EXEVEC+20000(R0),(R3)+ ;INSERT REAL ADDRESSZ BR 30$ ;FINISH LOOPT[C\20$: MOV #160001,(R3)+ ;THIS ADDRESS SHOULD ALWAYS RESULT IN TRAP -] ;(IT'S ODD AND GUARANTEED NON-EXISTENT)I^_30$: SOB R2,10$ ;FINISH LOOP `40$:a .IF DF K$$DASb+c MOV (SP)+,@#KDSAR6 ;RESTORE APR6 MAPPING(de .ENDC ; DF K$$DASf g RETURN ;Oh'i .BLKW 50. ; ***** PATCH SPACE *****Pjk .ENDC ; DF R$$MPLl .PAGEm;+#n; **-$SFVC2-TRANSLATE EXEC VECTORDo;Hp; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TRANSLATE A VECTOR OF OFFSETSHq; INTO THE SYSTEM VECTOR (DEFINED BELOW) INTO OFFSETS. SEE COMMENTS ONr; BUFFER FORMAT BELOW.s; t; DPB FORMAT:Au;E%v; WD. 00 -- DIC(169.),DPB SIZE(4.). 0w; WD. 01 -- SUBFUNCTION CODE (15.) (LOW BYTE).x; WD. 02 -- BUFFER ADDRESS. %y; WD. 03 -- BUFFER SIZE (IN WORDS).z;T{; BUFFER FORMAT:|;.9}; WD. 00 -- RETURNED AS ADDRESS OF ROUTINE/DATA CELL.*~; WD. 01 -- OFFSET INTO SYSTEM VECTOR; WD. 02/03 -- SECOND PAIR; .; .; .;A ; INPUTS:F;,; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.(; R3=ADDRESS OF WD. 00. OF THE BUFFER.*; R5=TCB ADDRESS OF THE REQUESTING TASK.; ; OUTPUTS:; ?; THE USER'S BUFFER IS FILLED WITH THE REQUESTED INFORMATION. ;2;- .PA00bppnccccGE .IF DF R$$MPL .ENABL LSB)B$SFVEC::INC R2 ;ALLOW FOR MANDATORY PARAMETER IN COUNT ; BM385, MOV R2,R0 ;COPY NUMBER OF WORDS ;**-1 INC R0 ;ALLOW FOR FLAGS WORD& ASL R0 ;CONVERT TO NUMBER OF BYTES' ADD R3,R0 ;POINT PAST END OF BUFFERN BCS 50$ ;IF CS WRAPS AROUNDE5 CMP R0,#160000 ;IS IT PAST MAPPING RANGE OF APR6 ?B% BHI 50$ ;IF HI YES - RETURN ERROR)SFVCC: TST (R3) ;FIRST WORD NON-ZERO ?L* ;(IMPLIES VECTOR ALREADY TRANSLATED)" BNE 40$ ;IF NE YES, RETURN NOW5 INC (R3)+ ;SET FLAG FOR VECTOR ALREADY TRANSLATEDA$10$: MOV (R3),R0 ;GET NEXT OFFSET' CMP R0,#MAXOFF ;PAST END OF VECTOR ? BHIS 20$ ;IF HIS YES BIT #1,R0 ;ODD ? BNE 20$ ;IF NE YES, MOV EXEVEC(R0),(R3)+ ;INSERT REAL ADDRESS BR 30$ ;FINISH LOOPOC20$: MOV #160001,(R3)+ ;THIS ADDRESS SHOULD ALWAYS RESULT IN TRAP - ;(IT'S ODD AND GUARANTEED NON-EXISTENT)330$: SOB R2,10$ ;FINISH LOOPM40$: RETURN ;Y550$: DRSTS D.RS98 ;INVALID VECTOR BUFFER SPECIFIEDC .DSABL LSBO' .BLKW 50. ; ***** PATCH SPACE *****, .ENDC ; DF R$$MPL .PAGE"; MACRO TO DEFINE VECTOR ENTRIES .MACRO VECTOR ENTRY,COND? .IF NDF R$$MPLS'ENTRY'==OFFSET)OFFSET=OFFSET+2E .IFF ; NDF R$$MPL .IF NB COND0 .IF DF COND .WORD ENTRY .IFF ; DF COND  .WORD 160001 .ENDC ; DF COND .IFF ;NB CONDD .WORD ENTRY .ENDC ; NB COND .ENDC ; NDF R$$MPL5 .ENDM VECTORC;; MACRO FOR ENTRIES WHOSE NAMES DON'T APPEAR IN DUMMY STBF .MACRO NOSTB ENTRY,COND .IF NDF R$$MPLOFFSET=OFFSET+2 .IFF ; NDF R$$MPL .IF NB COND. .IF DF COND .WORD ENTRY. .IFF ; DF CONDW .WORD 160001 .ENDC ; DF COND .IFF ;NB COND. .WORD ENTRY .ENDC ; NB COND  .ENDC ; NDF R$$MPLD .ENDM NOSTB-; MACRO TO DEFINE SYNONYMS FOR ENTRY POINTS  .MACRO SYNONM ENTRY .IF NDF R$$MPL 'ENTRY'==OFFSET-2  .ENDC ; NDF R$$MPLR .ENDM SYNONMO2; DEFINE LOCAL SYMBOLS FOR MULTIPLE CONDITIONALS  .IF DF M$$EXT&U$$UMR   EXTUMR = 0R   .ENDC ;DF M$$EXT&U$$UMR .IF DF S$$WPC&D$$ISK0  SWAP=0  .ENDC ;DF S$$WPC&D$$ISK .IF DF C$$CDA .IIF EQ C$$CDA-12 CDA$MS=0 .IIF EQ C$$CDA CDA$MS=0 .ENDC ;DF C$$CDA .IF DF M$$NET&M$$PROR  MPNET=0!" .ENDC ; DF M$$NET&M$$PRO#$ .IF DF L$$XDT&M$$PROY% & MPLXDT=0'( .ENDC ; DF L$$XDT&M$$PRON)* .PAGE+,; THE VECTOR TABLE ITSELFL-?.; AS OF FIELD TEST, THE VECTOR FOR THE VERSION 3.0 RELEASE IS5/; FROZEN. ADD NEW SYMBOLS AT THE END OF THE VECTOR.C0;S12 .IF NDF R$$MPL3 4 OFFSET = 0&56 .IFF7 8EXEVEC:C9: .ENDC ; NDF R$$MPL2;< VECTOR D.VINT= VECTOR KISAR0> VECTOR KISAR5? VECTOR KISAR6@ VECTOR KISAR7A VECTOR P.LGTHB VECTOR S.CTM;C VECTOR S.FRKD VECTOR S.EMB$E VECTOR S.ITMF VECTOR S.KRBG VECTOR S.KS5,L$$DRVH VECTOR S.KTBEI VECTOR S.LHDTJ VECTOR S.PKTK VECTOR S.RCNTL VECTOR S.ROFFM VECTOR S.STS3N VECTOR S.ST2O VECTOR S.ST3 P VECTOR S.URMDQ VECTOR T.ACNR VECTOR T.CPUNS VECTOR T.EXTT VECTOR T.IRMU VECTOR T.ISIZV VECTOR T.LGTHW VECTOR T.OCBHX VECTOR T.RDCTY VECTOR T.RRMAZ VECTOR UISAR0[ VECTOR UISAR1\ VECTOR UISAR6] VECTOR UISAR7^ VECTOR UISDR6_ VECTOR UISDR7` VECTOR U.UABMa VECTOR V$$CTRb VECTOR W.MAPRc VECTOR W.RTRVd VECTOR W.USE,P$$WNDe VECTOR W.VBNHf VECTOR W.WISZg VECTOR .LB0h VECTOR .CO0i VECTOR .TT0j VECTOR $ABTIMk VECTOR $ABTM2l VECTOR $ABTSKm VECTOR $ACCRGn VECTOR $ACHCKo VECTOR $ACHKBp VECTOR $ACHROq VECTOR $ACNFEr VECTOR $ACTHDs VECTOR $ACTPSt VECTOR $A00bppmmmffDATALACCu VECTOR $ALOCBv VECTOR $ALOC1w VECTOR $ALSECx VECTOR $ALTABy VECTOR $ALVBKz VECTOR $APLIM{ VECTOR $ASUMR,EXTUMR7| VECTOR $BCBUF,C$$CDAC} VECTOR $BILNG~ VECTOR $BLXIO VECTOR $BTTIM VECTOR $BTTM2 VECTOR $CBDHD VECTOR $CEFI VECTOR $CEFN VECTOR $CEX VECTOR $CFLPT VECTOR $CKBFB VECTOR $CKBFR VECTOR $CKCSR VECTOR $CKMAP VECTOR $CKURM VECTOR $CLICQ VECTOR $CLINS VECTOR $CLKHD VECTOR $CLRMV VECTOR $CLSRF VECTOR $CNTLN VECTOR $COMEF VECTOR $COPTV VECTOR $CPBIT VECTOR $CPCRM VECTOR $CPMSK VECTOR $CPTBL VECTOR $CPUSC VECTOR $CPURM VECTOR $CPUTM VECTOR $CPUT1 VECTOR $CRALT,C$$CDAT VECTOR $CRATT VECTOR $CRAVL VECTOR $CRBAE,C$$CDAV VECTOR $CRCSR,C$$CDAC VECTOR $CRDEV,C$$CDAV VECTOR $CRKRB,C$$CDAC VECTOR $CRMS0,C$$CDA VECTOR $CRMS3,C$$CDA  VECTOR $CRMS6,C$$CDA VECTOR $CRMTB VECTOR $CRPAR,C$$CDAO VECTOR $CRPKT VECTOR $CRSBN,C$$CDAN VECTOR $CRSCS,C$$CDAC VECTOR $CRSUN,C$$CDAB VECTOR $CRUNT,C$$CDAV VECTOR $CTLST VECTOR $CTXPT VECTOR $CVDVN VECTOR $CXDBL VECTOR $DEACB VECTOR $DEAC1 VECTOR $DEARG VECTOR $DEATR VECTOR $DECLK VECTOR $DELRG VECTOR $DEPKT VECTOR $DESEC VECTOR $DESPK VECTOR $DETRG VECTOR $DEUMR,EXTUMRO VECTOR $DEVHD VECTOR $DICSV  NOSTB $DIVO SYNONM $$DIV VECTOR $DRATP VECTOR $DRDSE VECTOR $DREXT VECTOR $DRQRQ VECTOR $DTOER VECTOR $DVCER VECTOR $DVERR VECTOR $DVMSG VECTOR $DYPMN VECTOR $ENTSQ VECTOR $ERFLA VECTOR $ERRPT VECTOR $ERRSQ VECTOR $ERRX,E$$LOG VECTOR $EXRQF VECTOR $EXRQN VECTOR $EXRQP VECTOR $EXSIZ VECTOR $FINDI VECTOR $FMASK VECTOR $FMSK2 VECTOR $FMSK3 VECTOR $FMSK4 VECTOR $FNCLI VECTOR $FORKD VECTOR $FXRPT VECTOR $GGEF,G$$GEF VECTOR $GSPKT VECTOR $GTBYT VECTOR $GTPKT VECTOR $GTSPK VECTOR $GTWRD VECTOR $HEADR VECTOR $HFMSK VECTOR $HRCPT VECTOR $IBXMT VECTOR $ICAVL VECTOR $ICHKP VECTOR $IIMSK VECTOR $IISTM VECTOR $IIXMT VECTOR $INIBF VECTOR $INTCT VECTOR $INTSE VECTOR $INTSI VECTOR $INTSV VECTOR $INTXT VECTOR $IOALT VECTOR $IODON VECTOR $IOFIN VECTOR $KRBSC VECTOR $K6TAB VECTOR $LBUIC VECTOR $LDPWF VECTOR $LDREG VECTOR $LDRPT VECTOR $LOGHD VECTOR $LOGPT VECTOR $LSTLK VECTOR $MCRPT VECTOR $MKCSR VECTOR $MKCS2 VECTOR $MOULS VECTOR $MPDC1 VECTOR $MPLND VECTOR $MPLNE VECTOR $MPLUN VECTOR $MPPKT VECTOR $MPPRO VECTOR $MPVBN  NOSTB $MULC SYNONM $$MULC VECTOR $MSCR1,CDA$MST VECTOR $MSCR2,CDA$MSV  VECTOR $MSCR3,CDA$MSI  VECTOR $MXEXT  VECTOR $M100Q,M$$NET  VECTOR $NCPU  VECTOR $NCTPT,T$$TSA  VECTOR $NMCLI VECTOR $NONSI VECTOR $NS0 VECTOR $NS1 VECTOR $NS2 VECTOR $NS3 VECTOR $NS4 VECTOR $NS5 VECTOR $NS6 VECTOR $NS7 VECTOR $NTEND VECTOR $NTUIC VECTOR $NXTSK VECTOR $PARHD VECTOR $PARTB VECTOR $PFRSZ VECTOR $PKMAX VECTOR $PKNUM  VECTOR $PLPAR! VECTOR $POLBP" VECTOR $POLFL# VECTOR $POLST$ VECTOR $POOLV% VECTOR $PRIHL& VECTOR $PRILL' VECTOR $PROC2( VECTOR $PRTAB) VECTOR $PTBYT* VECTOR $PTCBL+ VECTOR $PTCPT, VECTOR $PTTCB- VECTOR $PTWRD. VECTOR $QACNT/ VECTOR $QASTT0 VECTOR $QCLNR1 VECTOR $QCNTP2 VECTOR $QCPKT3 VECTOR $QERMV4 VECTOR $QFORK5 VECTOR $QINSF6 VECTOR $QINSP7 VECTOR $QMCRO8 VECTOR $QMCRL9 VECTOR $QRMVF: VECTOR $QRMVT; VECTOR $QSPIB< VECTOR $QSPIF= VECTOR $QSPIP> VECTOR $QSPRF? VECTOR $QTRAN@ VECTOR $QTRN1A VECTOR $QTRN2B VECTOR $QUEBFC VECTOR $QUEXTD VECTOR $QUPKTE VECTOR $RCTPTF VECTOR $RELOCG VECTOR $REMOVH VECTOR $REMO1I VECTOR $REQU1J VECTOR $RNDC,R$$NDCK VECTOR $RNDH,R$$NDCL VECTOR $RNDL,R$$NDCM VECTOR $RQSCHN VECTO00bqpnccccR $RQTABO VECTOR $SABPTP VECTOR $SAHDBQ VECTOR $SAHPTR VECTOR $SAVNRS VECTOR $SCCTBT VECTOR $SCDEVU VECTOR $SCDVTV VECTOR $SCDV1W VECTOR $SCERRX VECTOR $SCMDQY VECTOR $SCMOFZ VECTOR $SCOFL[ VECTOR $SCRET\ VECTOR $SECFR] VECTOR $SETCR^ VECTOR $SETFO_ VECTOR $SGFIN` VECTOR $SGNMKa VECTOR $SHERRb VECTOR $SHFCTc VECTOR $SHFTMd VECTOR $SHFPTe VECTOR $SHLOSf VECTOR $SHPCTg VECTOR $SHUMBh VECTOR $SIGFLi VECTOR $SNCMDj VECTOR $SRASTk VECTOR $SRCCQl VECTOR $SRGEF,G$$GEFBm VECTOR $SRPROn VECTOR $SRSTDo VECTOR $SRUCBp VECTOR $SRUC1q VECTOR $STACKr VECTOR $STALRs VECTOR $STCLIt VECTOR $STENBu VECTOR $STFLGv VECTOR $STKDPw VECTOR $STPCTx VECTOR $STPTKy VECTOR $STRTMz VECTOR $SWPC,SWAP{ VECTOR $SWPR,SWAP| VECTOR $SWR} VECTOR $SYLHD~ VECTOR $SYSID VECTOR $SYSIZ VECTOR $SYSNM VECTOR $SYTYP VECTOR $SYUAB VECTOR $SYUIC VECTOR $TCBCP VECTOR $TICLR VECTOR $TKNPT VECTOR $TKPSV VECTOR $TKTAB VECTOR $TKTCB VECTOR $TKWSE VECTOR $TMSTP VECTOR $TRACE VECTOR $TSKHD VECTOR $TSKRP VECTOR $TSKRT VECTOR $TSPAR VECTOR $TSTBF VECTOR $TSTCP VECTOR $TTNSP VECTOR $UCBSC VECTOR $UMPCR VECTOR $UMPSP VECTOR $UMRHD,EXTUMRW VECTOR $UMRPT,M$$NETC VECTOR $URMST VECTOR $URMTB VECTOR $VECTR VECTOR $VERSN VECTOR $VERTK VECTOR $VTDCB; COMM EXEC VECTORSP VECTOR $1SCTB,MPNET VECTOR $ACTLN,MPNET VECTOR $ASCMP,M$$NETV VECTOR $CALLX,M$$NETT VECTOR $CCBAF,M$$NET VECTOR $CCBAL,M$$NET  VECTOR $CCBCT,M$$NET VECTOR $CCBGT,M$$NETO VECTOR $CCBRT,M$$NETF VECTOR $CCBLH,M$$NETC VECTOR $CCBNM,M$$NETB VECTOR $CCBSZ,M$$NETV VECTOR $CEACC,M$$NETU VECTOR $CECAC,M$$NETU VECTOR $CEDIV,M$$NETU VECTOR $CELFN,M$$NET VECTOR $CELOG,M$$NET  VECTOR $CEMUL,M$$NET VECTOR $CEPWR,M$$NET  VECTOR $CMFRK,M$$NET VECTOR $CMPDV,M$$NETV VECTOR $CMQIN,M$$NETC VECTOR $CMQRM,M$$NETC VECTOR $CNV22,M$$NETC VECTOR $CNV18,M$$NETC VECTOR $CSBGT,M$$NETC VECTOR $CSBRT,M$$NETC VECTOR $CTCMP,M$$NETC VECTOR $CXOPT,M$$NETC VECTOR $DDAST,M$$NETC VECTOR $DDCCP,M$$NETC VECTOR $DDCRA,M$$NETC VECTOR $DDDIS,M$$NETC VECTOR $DDENB,M$$NETC VECTOR $DDFNC,M$$NETC VECTOR $DDGET,M$$NETC VECTOR $DDKCP,M$$NETC VECTOR $DDKIL,M$$NETC VECTOR $DDMAN,M$$NETC VECTOR $DDMSN,M$$NETC VECTOR $DDRCE,M$$NETC VECTOR $DDRCP,M$$NETC VECTOR $DDRNG,M$$NETC VECTOR $DDSET,M$$NETC VECTOR $DDSPC,M$$NETC VECTOR $DDSTP,M$$NETC VECTOR $DDSTR,M$$NETC VECTOR $DDXKL,M$$NETC VECTOR $DDXME,M$$NETC VECTOR $DDXMP,M$$NETC VECTOR $DDXOF,M$$NETC VECTOR $DDXON,M$$NETC VECTOR $DECPT,M$$NETC VECTOR $DLCRS,M$$NETC VECTOR $DSPTM,M$$NETC VECTOR $EVDSC,M$$NETC VECTOR $FILHD,M$$NETC VECTOR $INTSX,M$$NETC VECTOR $INTX7,M$$NETC VECTOR $KLCMP,M$$NETC VECTOR $LDBAF,M$$NETC VECTOR $LDBGT,M$$NETC VECTOR $LDBRT,M$$NETC VECTOR $LGCON,M$$NETC VECTOR $LGDDB,M$$NETC VECTOR $LGFNB,M$$NETC VECTOR $LGMON,M$$NETC VECTOR $LGPDV,M$$NETC VECTOR $LGSTT,M$$NETC VECTOR $LGUIC,M$$NETC VECTOR $LLCAL,M$$NETC VECTOR $LLCLC,M$$NETC VECTOR $LLCRQ,M$$NETC VECTOR $LLCRS,M$$NETC VECTOR $LLCSP,M$$NETC VECTOR $LLCTA,M$$NETC VECTOR $LTMFC,M$$NETC VECTOR $MAXOV,M$$NETC VECTOR $MPLCK,MPNET VECTOR $MPSAV,MPNET VECTOR $MVFBF,M$$NET VECTOR $MVTBF,M$$NET VECTOR $NBIAS,M$$NET VECTOR $NETPF,M$$NET VECTOR $NMCLH,M$$NET VECTOR $NMCL2,M$$NET VECTOR $NMCRS,M$$NET VECTOR $NMLST,M$$NET VECTOR $NTLPT,M$$NET VECTOR $OBJHD,M$$NET VECTOR $PADB,M$$NET VECTOR $PDDSP,M$$NET VECTOR $PDQUE,M$$NET VECTOR $PDQU1,M$$NET VECTOR $PDSPL,M$$NET VECTOR $PDVID,M$$NET VECTOR $PDVNM,M$$NET VECTOR $PDVTA,M$$NET VECTOR $PSIPT,M$$NET VECTOR $PUMR,M$$N00b qpmmmffDATAET VECTOR $PWRF1,M$$NET VECTOR $QBIAS,M$$NET VECTOR $QSTRT,M$$NET  VECTOR $RCCMP,M$$NET  VECTOR $RDBAF,M$$NET  VECTOR $RDBCT,M$$NET  VECTOR $RDBGT,M$$NET  VECTOR $RDBLH,M$$NET VECTOR $RDBNM,M$$NET VECTOR $RDBRT,M$$NET VECTOR $RDBSZ,M$$NETV VECTOR $RDBTH,M$$NETV VECTOR $RDBWT,M$$NETV VECTOR $RDBQP,M$$NETV VECTOR $RDQCT,M$$NETV VECTOR $RDQSL,M$$NETV VECTOR $SDBAF,M$$NETV VECTOR $SDBCT,M$$NETV VECTOR $SDBLH,M$$NETV VECTOR $SDBNM,M$$NETC VECTOR $SDBSZ,M$$NETC VECTOR $SLTMA,M$$NETC VECTOR $SLTNM,M$$NETC VECTOR $SNAPT,M$$NETC VECTOR $SPMTB,DUMMY VECTOR $SQRCM,M$$NETV  VECTOR $STDDM,M$$NETV! VECTOR $STDD1,M$$NETV" VECTOR $STDLC,M$$NETV# VECTOR $STDL1,M$$NETV$ VECTOR $STMFC,M$$NETV% VECTOR $SYNB,M$$NET& VECTOR $SYNC,M$$NET' VECTOR $TK100,M$$NET( VECTOR $TSTIM,M$$NET) VECTOR $T1SCL,M$$NET* VECTOR $T100C,M$$NET+ VECTOR $T100Q,M$$NET, VECTOR $XAVL,M$$NET- VECTOR $XBIAS,M$$NETC. VECTOR $XMCMP,M$$NETC/ VECTOR $ZTIME,M$$NETC0 VECTOR $ZTIM2,M$$NETC12 VECTOR $STMTB,MPNET384; THE FOLLOWING SYMBOLS ARE FOR SPM-11M-PLUS HOOKPOINT56 VECTOR $SPH017 VECTOR $SPH028 VECTOR $SPH039 VECTOR $SPH04: VECTOR $SPH05; VECTOR $SPH06< VECTOR $SPH07= VECTOR $SPH08> VECTOR $SPH09? VECTOR $SPH10,E$$XPR@ VECTOR $SPH11A VECTOR $SPH12B VECTOR $SPH13,DUMMYC VECTOR $SPH14,DUMMYD VECTOR $SPH15E VECTOR $SPH16F VECTOR $SPH17G VECTOR $SPH18H VECTOR $SPH19,P$$MONI VECTOR $SPH20J VECTOR $SPH21K VECTOR $SPH22L VECTOR $SPH23,V$$TRMM VECTOR $SPH24,V$$TRMLN VECTOR $SPH25O VECTOR $SPH26P VECTOR $SPH27Q VECTOR $SPH28,C$$INTCR VECTOR $SPH29S VECTOR $SPH30T VECTOR $SPH31U VECTOR $SPH32V VECTOR $SPH33W VECTOR $SPH34,P$$MONHX VECTOR $SPH35,P$$MONPY VECTOR $SPH36,M$$NETVZ VECTOR $SPH37,DUMMY[ VECTOR $SPH38,DUMMY\ VECTOR $SPH39,DUMMY] VECTOR $SPH40,DUMMY^=_; SYMBOLS ADDED AFTER START OF RSX-11M-PLUS V3.0 FIELD TESTV`a VECTOR $BCERRb VECTOR $BCFACc VECTOR $BCPCOd VECTOR $CRUPC,C$$CDAOe VECTOR $CRUST,C$$CDAOf VECTOR $DQLM1g VECTOR $DQLM2h VECTOR $DRAP2i VECTOR $DRLM1j VECTOR $DRLM2k VECTOR $EMTRPl VECTOR $ILINSm VECTOR $IOTRPn VECTOR $SGFLTo VECTOR $SRNAMp VECTOR $TRP04q VECTOR $TRTRPr VECTOR $XDTND,MPLXDTs&t; ADDITIONAL SPM-11M-PLUS HOOKPOINTSuv VECTOR $SPH64w VECTOR $SPH66x VECTOR $SPH67y VECTOR $SPH70z VECTOR $SPH71{ VECTOR $SPH72| VECTOR $SPH74,P$$CTLR} VECTOR $SPH75,Q$$OPTC~ VECTOR $SPH76,P$$CTLU VECTOR $SPH77,Q$$OPTU-; ADDITIONS LATE IN VERSION 3.0 DEVELOPMENTV VECTOR $FMSK5; ; BM370E; ADDED FOR RSX-11M-PLUS V3.0 UPDATE C AND MICRO/RSX V3.1 ; BM370T; ; BM370 VECTOR $DRAPR ; BM370 VECTOR $HKSTS ; BM370  VECTOR $IDLFL ; BM370S VECTOR $POLHD ; BM370  VECTOR $SETM ; BM370O VECTOR $SPMVC ; BM370C VECTOR $SPV01 ; BM370T VECTOR $SPV02 ; BM370V VECTOR $SPV03 ; BM370S VECTOR $SRATT ; BM370A ; BM370E ;RDH047O*; ADDITIONS FOR VERSION 4.0 ;RDH047 ;RDH047. VECTOR U.CTX ;RDH047 VECTOR U.FPRO ;RDH047 VECTOR U.LOG ;RDH047 VECTOR $LDEL1 ;RDH047 VECTOR $USRLG ;RDH047  VECTOR $PRISZ ; GNL040 VECTOR $FNDSP ;TMS038 VECTOR $GTUSR ;TMS038 VECTOR $LNTD1 ;TMS038 VECTOR $RLRLN ;TMS038  VECTOR $CRPAS ; GNL048  VECTOR $DVTMO ; GNL048  VECTOR $MPUBM ; GNL0487 NOSTB $STMAP,DUMMY ; THIS WAS A DUPLICATE ; BM403  VECTOR $CRCTX ;RK050 VECTOR $CRLO1 ;RK050 VECTOR $DELO1 ;RK050 VECTOR $DLCTX ;RK050 VECTOR $LOGTB ;RK050 VECTOR $QRMVA ;RK050 VECTOR $TBTRN ;RK050  VECTOR $BLKC2 00bqpncccc; GNL048  VECTOR $BMSET ; GNL048  VECTOR $CVLBN ; GNL048 VECTOR $RLCN ; GNL048C  VECTOR $RQCND ; GNL048  VECTOR $STMAP ; GNL048  VECTOR $VOLVD ; GNL048  VECTOR $BLKCK ; GNL048  VECTOR $MPPHY ; GNL048  VECTOR $FRKHD ; GNL048& VECTOR $EFMSK,E$$LOG ; GNL048  VECTOR $ULDPT ; GNL048$ VECTOR $RTF01,MPNET ;JWB185$ VECTOR $RTF02,MPNET ;JWB185& VECTOR $RTF03,M$$NET ; GNL061& VECTOR $RTF04,M$$NET ; GNL061% VECTOR $LTEEP,M$$NET ; BM374N% VECTOR $WPLST,R$$WPT ; BM374% VECTOR $WPADR,R$$WPT ; BM374C% VECTOR $WPIN0,R$$WPT ; BM374V% VECTOR $WPIN1,R$$WPT ; BM374 % VECTOR $WPIN2,R$$WPT ; BM374 % VECTOR $WPIN3,R$$WPT ; BM3740$ VECTOR $WPBR,R$$WPT ; BM374 VECTOR $TNAME ;JWB190N  VECTOR $MPUB1 ; GNL065  VECTOR $PRMOD ; GNL065  VECTOR $ULDRQ ; GNL065  VECTOR $FNERL ; GNL065  VECTOR $IODSA ; GNL065  VECTOR $QINSB ; GNL065  VECTOR KISDR0 ; GNL065  VECTOR KISDR6 ; GNL065  VECTOR $CKCNT ; GNL065  VECTOR $CKLDC ; GNL065  VECTOR $DRVPF ; GNL065% VECTOR $TRINT,C$$CDA ;JWB193W VECTOR $UMRWT ; BM383C% VECTOR $ACDHD,T$$ACD ; BM383O VECTOR $DQUMR ; BM383O VECTOR $LOGER ; BM383O VECTOR $STMP1 ; BM383O VECTOR $TTPRM ; BM386O VECTOR $WCFLG ; BM387O% VECTOR $CPSEN,C$$RMT ; BM396N% VECTOR $CPALO,C$$RMT ; BM396 % VECTOR $CPDEA,C$$RMT ; BM396  ; BM403C; ; BM403B; SYMBOLS ADDED AT THE END OF VERSION 4.0 FOR XDT, CPR ; BM403%; AND GENERAL CLEANUP ; BM403; ; BM403 VECTOR T.CTX ; BM403 VECTOR T.SAST ; BM403R VECTOR $ABCTK ; BM403R VECTOR $ACCLK ; BM4031 VECTOR $ACHKP ; BM403M VECTOR $ACHKW ; BM403G% VECTOR $ACHUI,U$$DAS ; BM403M VECTOR $ACTRM ; BM403O VECTOR $ACTTK ; BM403  VECTOR $ALCLK ; BM403  VECTOR $ALPKT ; BM403B% VECTOR $ALSC1,P$$OOL ; BM403E% VECTOR $ALSPK,P$$OOL ; BM403N VECTOR $ALTRG ; BM403 VECTOR $ATTPT ; BM403. VECTOR $BILDS ; BM403A VECTOR $BLKC1 ; BM403C% VECTOR $CALTA,S$$LIB ; BM403  VECTOR $CEFIG ; BM403  VECTOR $CEFNG ; BM403 % VECTOR $CFORK,M$$PRO ; BM403 % VECTOR $CKACC,P$$LAS ; BM403 % VECTOR $CKBFI,U$$DAS ; BM403  VECTOR $CKBFW ; BM403 % VECTOR $CKLBN,S$$HDW ; BM403V% VECTOR $CKUAB,A$$CNT ; BM403V VECTOR $CLRSM ; BM403N% VECTOR $CPCON,C$$RTB ; BM403V% VECTOR $CSFSV,C$$KXJ ; BM403 % VECTOR $CSHSV,C$$KXJ ; BM4031 VECTOR $CURPR ; BM403A VECTOR $DASTT ; BM403  VECTOR $DBTRP ; BM403  VECTOR $DCAST ; BM403 % VECTOR $DCCEB,D$$CHE ; BM403 % VECTOR $DCCEL,D$$CHE ; BM403  VECTOR $DCLKA ; BM403V% VECTOR $DCNEB,D$$CHE ; BM403 % VECTOR $DCNEL,D$$CHE ; BM403 % VECTOR $DCPCB,D$$CHE ; BM403 % VECTOR $DCSTS,D$$CHE ; BM403N VECTOR $DCWIO ; BM403  VECTOR $DECAL ; BM403V VECTOR $DECBF ; BM4031 VECTOR $DECIO ; BM403A VECTOR $DECIP ; BM403  VECTOR $DESC1 ; BM403  VECTOR $DIRSV ; BM403  VECTOR $DIRXT ; BM403 $ VECTOR $DLNK,S$$HDW ; BM403$ VECTOR $DQAC,C$$INT ; BM403! VECTOR $DRAP3 ; BM403  VECTOR $DRAP4 ; BM403  VECTOR $DRAPV ; BM403D VECTOR $DRCHE ; BM403D VECTOR $DRCL2 ; BM403C VECTOR $DRCL3 ; BM403C% VECTOR $DRTHR,P$$OFF ; BM403D VECTOR $DRWSE ; BM403D VECTOR $DSPKA ; BM403D VECTOR $DVMG1 ; BM403D% VECTOR $ECCOR,S$$ECC ; BM403  VECTOR 00bqpmmmffDATA$EMSST ; BM403 % VECTOR $ERREC,P$$OFF ; BM403 % VECTOR $ERTHR,P$$OFF ; BM403 % VECTOR $ERHEA,E$$LOG ; BM403 % VECTOR $EXDOP,M$$PRO ; BM403 % VECTOR $EXROP,M$$PRO ; BM403V% VECTOR $EXRP1,M$$PRO ; BM403  VECTOR $EXRQS ; BM403  VECTOR $EXRQU ; BM403  VECTOR $FINBF ; BM403V VECTOR $FINDR ; BM403V VECTOR $FINXT ; BM403V% VECTOR $FMAPP,F$$MAP ; BM403 % VECTOR $FMSKR,C$$RMT ; BM403  VECTOR $FORK0 ; BM403  VECTOR $FORK1 ; BM403V% VECTOR $FORK2,C$$INT ; BM403V% VECTOR $FPPRQ,F$$LPP ; BM403V% VECTOR $FPPR7,F$$LPP ; BM403V% VECTOR $FPPR8,F$$LPP ; BM403V% VECTOR $FORKL,M$$PRO ; BM403V VECTOR $GENBF ; BM403V% VECTOR $GGFRN,G$$GEF ; BM403  VECTOR $GNLST ; BM403 % VECTOR $IFORK,M$$PRO ; BM403T% VECTOR $IMASG,C$$RTB ; BM403A% VECTOR $INTSC,C$$INT ; BM403M VECTOR $INTSF ; BM4030 VECTOR $INTX1 ; BM4031 VECTOR $IOKIL ; BM4032 VECTOR $IOKL1 ; BM403  VECTOR $IOKL2 ; BM403V VECTOR $KATBL ; BM403V% VECTOR $KXBAS,C$$KXJ ; BM403V% VECTOR $KXPTR,C$$KXJ ; BM403V% VECTOR $KXVC1,C$$KXJ ; BM403V% VECTOR $LCKPR,R$$LKL ; BM403V VECTOR $LDPCB ; BM403V VECTOR $LOADT ; BM403T% VECTOR $LSUPD,S$$LIB ; BM403A% VECTOR $LSUP1,S$$LIB ; BM403M VECTOR $MAPTK ; BM4030 VECTOR $MPDC2 ; BM4031 VECTOR $MPDC3 ; BM4032 VECTOR $MPDC4 ; BM403  VECTOR $MPDCV ; BM403V VECTOR $PASTH ; BM403V% VECTOR $PKAVL,Q$$OPT ; BM403V% VECTOR $PLTRQ,P$$CTL ; BM403V VECTOR $PRIFR ; BM403 % VECTOR $PROCN,M$$PRO ; BM403  VECTOR $PWRFL ; BM403 % VECTOR $QASTC,C$$INT ; BM403T VECTOR $QCLIL ; BM403  VECTOR $QPKRQ ; BM403  VECTOR $QPKR1 ; BM403  VECTOR $RELCD ; BM403  VECTOR $RELOM ; BM403  VECTOR $RELOP ; BM403 % VECTOR $RELUI,U$$DAS ; BM403  VECTOR $REQUE ; BM403  VECTOR $RLCPS ; BM403  VECTOR $RLPAR ; BM403$ VECTOR $RLPR1 ; BM403I% VECTOR $RNDCT,R$$NDC ; BM403$% VECTOR $RQCNC,O$$LAP ; BM403  VECTOR $SETFG ; BM403$ VECTOR $SETMG ; BM403L VECTOR $SETRT ; BM403K VECTOR $SETRQ ; BM403K% VECTOR $SHFND,S$$HDW ; BM403 % VECTOR $SHFN1,S$$HDW ; BM403 % VECTOR $SHLIM,S$$HDW ; BM403 % VECTOR $SHSAV,S$$HDW ; BM403  VECTOR $SGFFR ; BM403 % VECTOR $SIRWF,S$$LIB ; BM403V VECTOR $SPMAX ; BM403V VECTOR $SRCQ1 ; BM403V% VECTOR $SRMUT,P$$OFF ; BM403V% VECTOR $SRWND,P$$LAS ; BM403V% VECTOR $SUPFL,S$$LIB ; BM403 % VECTOR $SWACD,T$$ACD ; BM403T% VECTOR $SWAC1,T$$ACD ; BM403 # VECTOR $SWPCT,SWAP ; BM403  VECTOR $SWSTK ; BM403$ VECTOR $TSKRQ ; BM403L% VECTOR $UISET,M$$MUP ; BM403S VECTOR $UMR4 ; BM403 VECTOR $UMR5 ; BM403% VECTOR $UNMAP,P$$LAS ; BM403V% VECTOR $WPVAL,R$$WPT ; BM403  VECTOR $WTUMR ; BM403 % VECTOR $XXLOW,C$$KXJ ; BM403 % VECTOR $XXHGH,C$$KXJ ; BM403  ; BM403 %; FOR PEACE OF MIND, PAD THE VECTOR  .IF DF R$$MPL  .REPT 25. .WORD 160001P .ENDRMAXOFF=.-EXEVECS .ENDC ; DF R$$MPL .PAGE,; DEFINE GLOBALS OFFSETS GIVEN IN STB FILE;=; ********************************************************* ; * *P-; * > > > W A R N I N G < < < * ; * *;; * THE FOLLOWING ARE OFFSET DEFINITIONS WHICH ARE * ;; * SUPPLIED EITHER BY DEFINITION IN THE EXEC (IOSUB) * ;; * OR THE DUMMY STB FILE (FROM SFVC2). ANY CHANGE TO *D;; * THESE DEFINITIONS MUST BE MADE IN BOTH MOD00b"qc#qnccccULES. *R ; * *.=; *********************************************************E .IF NDF R$$MPLI G$$SPA == 34* S$$SPA == 10* S$$SPC == 6* .ENDC ; NDF R$$MPL .END> > > W A R N I N G < < < * ; * *;; * THE FOLLOWING ARE OFFSET DEFINITIONS WHICH ARE * ;; * SUPPLIED EITHER BY DEFINITION IN THE EXEC (IOSUB) * ;; * OR THE DUMMY STB FILE (FROM SFVC2). ANY CHANGE TO *D;; * THESE DEFINITIONS MUST BE MADE IN BOTH MOD .TITLE CEXBF - COMM EXECe .IDENT /01.16/s x;o; COPYRIGHT (C) 1985 BYl/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.";WA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;s; J. PROVINO 3-AUG-78y;l; MODIFIED BY:; ; JF005 - J. FORECAST 28-MAR-79]:; ALLOCATE BUFFER SPACE DEPENDING ON CONDITIONAL ASSEMBLY; PARAMETERS.;u; JF006 - J. FORECAST 14-MAY-79a.; CHANGE ALLOCATIONS FOR NEW MAPPED COMM/EXEC;; JF007 - J. FORECAST 8-AUG-80; CHANGE ALLOCATIONS AGAINI; ; JF008 - J. FORECAST 9-JAN-817; CHANGE ALLOCATIONS FOR NEW BUFFER MANAGEMENT SUPPORTR;H"; BM244 - B. S. MCCARTHY 11-MAR-821; FINAL BUFFER SIZE ADJUSTMENTS FOR RSX-11M-PLUSU8; VERSION 2.0 (BASE LEVEL 10) AND ADD DESCRIPTIVE TEXT.;; JJ001 - J. Jackson 4-Jan-82R'; Adjust sizing for DECnet 3.0 releaseO;O; JJ002 - J. Jackson 28-Feb-83(; Increase size for multiprocessor case(; to include DLC support (for Ethernet);C; WD001 - W. Daley 2-Jul-84-9; Combine Comm/Exec modules (CESCH, CELLC, CEDLC, CEDDM,C; CEBUF, CELOG, CETIM).3; Remove L$$SI1 and remaining M$$MGE conditionals.M8; Change conditionals for N$$EVL, N$$OPT, and X$$MDC to&; generate code if R$$MPL is defined.;; Remove INHIB$, ENABL$, SAVMAP, RESMAP, and MAP - replaceJ; with in-line code.j*; Change SAVRG and RESRG to local macros..; Change all I/O page references to absolute.4; Append CESUB module with similar changes to 4.02..; Remove SCBDF$ and CLKDF$ macros (not used).(; Add DLC$OV and CRC$OV global symbols.B; Add $CEX global entry and M$$NET (network support) conditional.;M'; LA001 - Remove saving of SP in $INTSXa;f=; WD002 - Add performance monitor hooks (CHANGED BY LBM004) ;i(; LAA002 - Remove conditionals in .TITLE;P#; LAA003 - Add $CXFLG global symbol ;e4; WD002 - Modify $CNV22 for Q-bus I/D space support; D; LBM004 - CHANGE SPM HOOKPOINT IMPLEMENTATION FOR RSX-11M-PLUS V3.0; ; GS001 - G Strevell 4-Mar-85?; Change $CNV22 to use APR bias only when entered with R3 = 0 ;b"; 1.14 WMD001 - W. Duane 30-Apr-85%; Add $CEXND symbol to end of CEXBF.M; '; 1.15 BM369 - B. S. McCarthy 27-Aug-85f; Reformat SPM hookpoint ;i$; 1.16 WJD001 - W. Daley 06-Oct-869; Add Global labels and space for NTINIT run time fix ofd<; SLT offsets and buffer wait code for DECnet-11M-PLUS V4.0;D2$CEX:: ; THIS SYMBOL MUST ALWAYS BE DEFINED FOR( ; MCRS "SET /NOCEX" COMMAND TO BUILD ; CORRECTLYl .IF DF M$$NET n $ .SBTTL Macro Definitionsw; ; Macro Library Callsb; # .MCALL CCBDF$,OPTDF$,PDVDF$,SLTDF$A" CCBDF$ ; Define the CCB offsets+ OPTDF$ <=>,<:> ; Define COMM/EXEC options" PDVDF$ ; Define the PDV offsets" SLTDF$ ; Define the SLT offsets;o; Local Macro DefinitionsI;  .IF DF K$$DAS .MACRO DDFDF,FNC,ARG1 MOV R3,-(SP) ; Save R3M! MOV #FNC,R3 ; Get function codeS .IF B Y; BR DDCM1 ; Common processing for non-CCB control function  .IFF ; B  .IF IDN ,.: BR DDCM2 ; Common processing for modem control functions .IFF ; IDN , .IF IDN ,e BR DDCM4B .IFF ; IDN ,= BR DDCM3 ; Common processing for control functions with CCBs .ENDC ; IDN ,T .ENDC ; IDN ,a .ENDC ; B .ENDM DDFDF .IFF ; DF K$$DAS, .MACRO DDFDF,FNC,ARG1 .IF B V> JSR R3,DDCM1 ; Common processing for non-CCB control function .IFF ; B  .IF IDN ,o= JSR R3,DDCM2 ; Common00c*qpmmmffDATA processing for modem control functionso .IFF ; IDN , .IF IDN , JSR R3,DDCM4> .IFF ; IDN ,@ JSR R3,DDCM3 ; Common processing for control functions with CCB .ENDC ; IDN ,t .ENDC ; IDN ,, .ENDC ; B N10$: .WORD FNC .ENDM < .ENDC ; DF K$$DAS . .MACRO SAVRG LIST .IRP R, MOV R,-(SP) .ENDM .ENDM .MACRO RESRG LIST .IRP R, MOV (SP)+,R .ENDM .ENDM > .SBTTL Symbol Definitions;,7; These symbols are global for use by DECnet processes..; 1DLC$OV == 8. ; Data link layer overhead (bytes),%CRC$OV == 4. ; CRC overhead (bytes)RA$CXFLG == CF.MDM!CF.DDM!CF.DYN!CF.EIS!CF.LOG ; Comm exec options;;;K.CSR == 0 ; ???;CF; Define offsets to saved PSW from $INHIB. This offset is used by theK; FAIL entry (refer to BUFGT) to set the C-Bit so that failures to allocateM7; an RDB, LDB, or SDB will set the C-Bit on the ENABL$.+; .IF NDF M$$PRO>%PRIOFF=0 ; Offset to Saved Priorityh .IFF ; NDF M$$PRO5PRIOFF=2 ; Extra word on Stack for Multi-ProcessorsD .ENDC ; NDF M$$PROa t8 .SBTTL $INTSX - Comm Exec Device Interrupt Save Routine;+3; **-$INTSX-COMM EXEC DEVICE INTERRUPT SAVE ROUTINE;;S; Called by: JSR R4,$INTSX;f ; Inputs:e=; R5 = Pointer to priority specification in device line tablee; ; Outputs:=; The System Stack Depth is decremented, and if zero a switch "; to the System Stack is effected.;0; R5 = Pointer to word following device priority;-$INTSX::;+; ** W a r n i n g **E;a; SPM hookpoint number 36.;s); Do not change the instruction followingI; label without checking SPM;-+$SPH36==. ;SPM changes the instruction atI ;the location of this labell1 DEC @#$STKDP ;;; Decrement Stack Depth Indicatort0 BIC (R5)+,PS ;; Lower priority to device level .IF DF M$$PRO+ CACHE$ SAVE ;; Save bypass state of cacheo .ENDC ; DF M$$PRO CALL @R4 ;; Call caller back .IF DF M$$PRO0 CACHE$ UNSAVE ;; Restore bypass state of cache .ENDC ; DF M$$PRO! MTPS #PR7 ;; Inhibit Interrupts 1 .IF DF K$$DAS ;; Slightly different for RSX-11M+ ( ;; with Kernel Data Space enabled< MOV 4(SP),@#KINAR5 ;; Restore previous I-Space APR Contents< MOV 6(SP),@#KISAR5 ;; Restore previous D-Space APR Contents" ;; Current contents of stack:* ;; R4 (Saved by JSR R4,$INTSX in DDM)0 ;; R5 (Saved by JSR R5,'ISR' in Line Table)$ ;; KINAR5 (Saved in Line Table)$ ;; KISAR5 (Saved in Line Table) ;; PS (Saved by Interrupt)C ;; PC (Saved by Interrupt)h/ MOV (SP)+,2(SP) ;; Move saved R4 down on stackd/ MOV (SP)+,2(SP) ;; Move saved R5 down on stacka0 ;; Contents of stack (necessary for $INTXX)* ;; R4 (Saved by JSR R4,$INTSX in DDM)0 ;; R5 (Saved by JSR R5,'ISR' in Line Table) ;; PS (Saved by Interrupt)  ;; PC (Saved by Interrupt)i .IFF ;; DF K$$DAS4 MOV 4(SP),@#KISAR5 ;; Restore previous APR contents" ;; Current contents of stack:* ;; R4 (Saved by JSR R4,$INTSX in DDM)0 ;; R5 (Saved by JSR R5,'ISR' in Line Table)$ ;; KISAR5 (Saved in Line Table) ;; PS (Saved by Interrupt)s ;; PC (Saved by Interrupt)o/ MOV 2(SP),4(SP) ;; Move saved R5 down on stack4. MOV (SP)+,(SP) ;; Move saved R4 down on stack0 ;; Contents of stack (necessary for $INTXX)* ;; R4 (Saved by JSR R4,$INTSX in DDM)0 ;; R5 (Saved by JSR R5,'ISR' in Line Table) ;; PS (Saved by Interrupt)s ;; PC (Saved by Interrupt)c .ENDC ;; DF K$$DAS : JMP $INTX1 ;; Return through RSX Interrupt exit ;sjp0005 n' .SBTTL $INTX7 - Level 7 Interrupt Exita;+%; **- $INTX7 - LEVEL 7 INTERRUPT EXIT ; @; This routine is used by Driver ISRs that run at priority level?; 7 during some portion of Interrupt Service. Drivers ISRs may :; only push one item on the stack during level 7 interrupt?; service, and must call $INTSX (to drop priority and switch ton,; the system stack) to post any completions.;;0; Inputs: (stack must be formatted as follows:); R5 (Saved in lin00c2q#qncccce table)2; * KINAR5 (Saved in line table for RSX-11M+ only); KISAR5 (Saved in line table); PS (Saved by interrupt)R; PC (Saved by interrupt)i;-$INTX7:: MOV (SP)+,R5 ;;; Restore R5) .IF DF K$$DAS ;;; Different for RSX-11M+S( ;;; with Kernel Data Space enabled3 MOV (SP)+,@#KINAR5 ;;; Restore Kernel I-Space APR5c .ENDC ; DF K$$DAS9 MOV (SP)+,@#KISAR5 ;;; Restore Kernel mapping register 5p RTI ;;; Return from Interrupt (: .SBTTL $PDSPL - Set Up a Process Level and Dispatch to it;+5; **-$PDSPL-SET UP A PROCESS LEVEL AND DISPATCH TO IT ;A<; This subroutine is called to set up the level of a processG; and dispatch to it. This routine assumes that the stack is formattedDG; properly for a pass through the scheduler when the dispatched processa; exits.;P ; Inputs: ; R2 = PDV Index (word index)c; R3 = Address of function code+"; R4 = Address of a CCB (optional)); R5 = Address of a Line Table (optional)u; ; Outputs:@; The new process execution priority is established and dispatch'; is performed by the routine '$PDDSP'.I;;-)$PDSPL::MTPS #PR7 ;;; Disable Interruptse MOV R2,R1 ;;; Copy PDV Index- ADD $PDVTA,R1 ;;; Point into PDV Index Tableo- MOV (R1),R1 ;;; Get address of process' PDVe. BICB Z.SCH(R1),PS ;; Set priority of process & .SBTTL $PDDSP - Dispatch to a Process;+!; **-$PDDSP-DISPATCH TO A PROCESS4;A ; Inputs: ; R2 = PDV Index (word index)o; R3 = Address of function code "; R4 = Address of a CCB (optional)1; R5 = Address of a process line table (optional)m;b; Outputs to the Process:=; Based on the PDV Index in R2, the process is entered at the =; entry point specified by the function code pointed to by R3l; with:($; R3 = Subfunction code (word index)"; R4 = Address of a CCB (optional)/; R5 = Address of process line table (optional)a;o;; R2 through R5 need not be preserved by the called process;-$PDDSP:: ; ref label2 MOV $CMPDV,-(SP) ; Save Current Process PDV Index+ MOV R2,$CMPDV ; Load new Process PDV Indexs+ ADD $PDVTA,R2 ; Point into PDV Index Tablee MOV (R2),R2 ; Get PDV Addressd/ MOV @#KISAR6,-(SP) ; Save current Kernel APR 6 2 MOV @#KISAR5,-(SP) ; Save current process mapping  .IF DF K$$DASS, MOV @#KINAR6,-(SP) ; Save instruction APR'S MOV @#KINAR5,-(SP) 6 MOV (R2),@#KINAR5 ; Map process in both I and D space .ENDC ; DF K$$DAS$ MOV (R2)+,@#KISAR5 ; Map to process0 MOV (R2),-(SP) ; Save address of dispatch table3 MOVB (R3)+,R2 ; Get function code (no sign extend)e7 ADD (SP)+,R2 ; Form address of entry in dispatch tablee5 BIT #1,(R2) ; Is this a dispatch to an odd address?R' BNE 10$ ; If NE, yes! - bad dispatch.V( MOVB (R3)+,R3 ; Set up subfunction code CALL @(R2)+ ; Call process .IF DF K$$DAS. MOV (SP)+,@#KINAR5 ; Restore instruction APRs MOV (SP)+,@#KINAR6M .ENDC ; DF K$$DAS6 MOV (SP)+,@#KISAR5 ; Restore previous process mapping5 MOV (SP)+,@#KISAR6 ; Restore previous APR 6 contentst6 MOV (SP)+,$CMPDV ; Restore previous process PDV index RETURN ; And return to caller;o ; at crash:s1; R2 -> computed address of dispatch table entry. ; R3-1 -> byte of function code.!; R3 -> byte of subfunction code.); R4 = optional CCB address.#; R5 = optional line table address.F; 10$: IOT ; Crash on odd dispatch.n uC .SBTTL $PDQUE - Queue a CCB (Chain) to a List and Schedule ProcessK;+<; **-$PDQUE-QUEUE A CCB CHAIN TO A LIST AND SCHEDULE PROCESS;r ; Inputs:AH; R3 = PDV Index (high byte) and channel number (low byte) ($PDQUE ONLY)A; R4 = Address of first CCB in a chain. The last CCB of the chaina#; has a zero next CCB pointer.3;- ; Outputs:C; The PDV Index and channel number parameters are stored in the CCB A; and the CCB (or chain) is linked to the operation queue for theCB; process defined by the PDV index and a schedule request for that; process is set. ;c; Registers modified:U ; R3 and R4I;-=$PDQUE::MOV R3,C.LIN(R4) ; Store PDV index and channel numberi&$PDQU1::MOV R5,-(SP) ; Save callers R5' MOV R4,R5 ; Copy a00c:qpmmmffDATAddress of first CCBn10$:. BIC #CS.LST,C.STS(R4) ; Clear last CCB marker& MOV R4,R3 ; Copy current CCB address$ MOV (R3),R4 ; Get next CCB address BNE 10$ ; If NE keep going/ BIS #CS.LST,C.STS(R3) ; Mark last CCB of chaino1 MOV #$CMFRK+4,R4 ; Set address of queue listheadx( MOV @#PS,-(SP) ; Save current priority& MOVB #PR7,@#PS ;;; Disable interrupts .IF DF M$$PRO/ CALL $MPLCK ;;; Lock access to process queuec .ENDC ; DF M$$PRO 1% MOV R5,@2(R4) ;;; Link first to lastR& MOV R3,2(R4) ;;; Set new last pointer0 CMP -(R4),-(R4) ;;; Fork block already in use ?$ BNE 20$ ;;; If NE, yes - just exit+ TST $CXOPT ;;; Are we in fork processing?1$ BMI 20$ ;;; If MI, yes - just exit& CLR (R4) ;;; Clear next link pointer C .IF DF R$$MPL .IF DF M$$PROl5 MOV -(R5),-2(R4) ;;; Set up required Unibus Run MaskV .ENDC ; DF M$$PRO & CALL $QFORK ;;; Queue the fork block  .IFF ; DF R$$MPL . MOV R4,@$FRKHD+2 ;;; Link to end of fork list) MOV R4,$FRKHD+2 ;;; Set new last pointer4 .ENDC ; DF R$$MPL t20$: .IF DF M$$PRO; CALL @(SP)+ ;;; Co-routine return to unlock process queues .ENDC ; DF M$$PRO ;% MOV (SP)+,@#PS ;;; Enable interrupts  MOV (SP)+,R5 ; Recover R5 RETURN ; Return to caller i+ .SBTTL $CEPWR - Powerfail Recovery RoutineM;+&; **-$CEPWR-POWERFAIL RECOVERY ROUTINE;MB; This routine is dispatched from the executive powerfail recovery<; code. It will dispatch to the AUX process with a powerfail; recovery function code.2;-$CEPWR:: .IF DF R$$MPL. MOV $DDFNC,-(SP) ; Save current function code4 MOV #FC.PWR,$DDFNC ; Set up powerfail function code .ENDC ; DF R$$MPL; MOV #$DDFNC,R3 ; Point to powerfail recovery function codee0 CLR R2 ; Set up PDV index (AUX is always zero)- CALL $PDSPL ; and dispatch to the process* .IF DF R$$MPL1 MOV (SP)+,$DDFNC ; Restore current function codef .ENDC ; DF R$$MPL RETURNo y6 .SBTTL $LLCRQ - LLC to DLC Request Queuing Subroutine;+4; **- $LLCRQ - LLC TO DLC REQUEST QUEUING SUBROUTINE;$>; This routine is called by a LLC process to queue requests to>; a DLC process. Note that the callers context is saved as if; an interrupt had occurred.;r ; Inputs:r(; R4= Address of CCB (or first in chain); The CCB must contain a valid:P(; C.FNC & C.MOD - Request function code3; C.LIN - LLC channel number (logical line number)u;i ; Outputs:5; The request is dispatched to the proper DLC processt;L; Registers modified:u; None;-$LLCRQ:: .IF DF M$$PRO# SAVRG ; Save registersu* MOV $CMPDV,R1 ; Get current LLC PDV index+ ADD $PDVTA,R1 ; Point into PDV index tablel+ MOVB C.LIN(R4),R3 ; Get LLC channel numberd ASL R3 ; Make it a word index 8 ADD (R1),R3 ; Point to LLC channel mapping table entryA MOV Z.MAP(R3),C.LIN(R4) ; Store SLN and station address into CCBC* ; Note - bit15 will always be clear to) ; flag destination process as a DLCt+ MOVB C.LIN(R4),R1 ; Get system line numberi ASL R1 ; Form word offset3 ADD $SLTMA,R1 ; Point into system line index table6 MOV (R1),R1 ; Get address of system line table entry;+; ** W a r n i n g **a;l2; DECnet-11M-PLUS V4.0 NTINIT hookpoint number 01.; G; Do not change the instruction following label without checking NTINITb;-.$RTF01:: ; NTINIT changes the instruction at ; the location of this label' MOV L.KRBA(R1),R1 ; Get pointer to KRB 1 MOV K.URM(R1),C.URM(R4) ; Set up unibus run mask16 CALL $PDQU1 ; Queue request CCB and schedule process8 MTPS #0 ; Drop priority to 0 and clear condition codes% RESRG ; Restore registerse RETURNt  .IFF ; DF M$$PROn0 SAVRG ; Save all registers* MOV $CMPDV,R1 ; Get current LLC PDV index+ ADD $PDVTA,R1 ; Point into PDV index tablebB MOVB C.LIN(R4),R3 ; Get LLC channel number without sign extension ASL R3 ; Make it a word index18 ADD (R1),R3 ; Point to LLC channel mapping table entryA MOV Z.MAP(R3),C.LIN(R4) ; Store SLN and station address into CCBu* ; Note - bit15 will always be clear to( 00cBq#qncccc ; flag destination process as a DLC; CALL $STDLC ; Set up DLC PDV index and line table addressA CALL $PDSPL ; Dispatch to DLCl8 MTPS #0 ; Drop priority to 0 and clear condition codes. RESRG ; Restore registers! RETURN ; Return to calling LLCn e .ENDC ; DF M$$PRO n6 .SBTTL $LLCRS - LLC to LLC Request Queuing Subroutine;+4; **- $LLCRS - LLC TO LLC REQUEST QUEUING SUBROUTINE<; **- $DLCRS - DLC TO LLC REQUEST QUEUING SUBROUTINE FOR X25K; **- $NMCRS - LLC TO DLC REQUEST QUEUING SUBROUTINE FOR NETWORK MANAGEMENT ;D?; This routine is called by a LLC process to queue requests to A; another LLC process. Note that the callers context is saved asi; if an interrupt had occurred.R;;J; The $DLCRS entry point is supplied for use by the X25 data link mapping.;J; The $NMCRS entry point is supplied for use by Network Management so thatG; it can fill in the Unibus Run Mask Before issueing a request to a DLCS ; for line/circuit counters etc.;N ; Inputs:T(; R4= Address of CCB (or first in chain); The CCB must contain a valid:e(; C.FNC & C.MOD - Request function code'; C.STA - Destination LLC's PDV indexa$; C.LIN - Option calling parameter;a ; Outputs:>; The request is queued and the appropriate level is scheduled; ; Note:aA; A LLC process can determine if a completion has come from a DLCb@; process or another LLC by examining the MSB of the C.LIN/C.STA; cell in the CCB.;e6; MSB=0 The request came from a DLC and the byte C.LIN4; contains the LLC's channel number for the logical ; line that had the completion.6; MSB=1 The request came from a LLC and the byte C.LIN2; contains an optional calling parameter from the; requesting LLC.;:; Registers modified:e; None;- p$DLCRS::$LLCRS:: .IF DF M$$PRO6 CLR C.URM(R4) ; Allow process to run on any processor .ENDC ; DF M$$PRO s'$NMCRS::SAVRG ; Save R3 and R4t8 BIS #100000,C.LIN(R4) ; Flag destination process is LLC: BISB #200,C.BID(R4) ; Mark CCB as coming from another LLC n6 CALL $PDQU1 ; Queue request CCB and schedule process# RESRG ; Restore registers % RETURN ; And return to calling LLCo o? .SBTTL $LLCLC - Process to Process Direct Call Interface (CCB)rB .SBTTL $LLCAL - Process to Process Direct Call Interface (No CCB);+?; **-$LLCLC-PROCESS TO PROCESS DIRECT CALL INTERFACE (WITH CCB)P4; **-$LLCAL-PROCESS TO PROCESS DIRECT CALL INTERFACE;0G; This routine is called by a process (typically an LLC) to dispatch toMB; another process (typically another LLC) via it's dispatch table.;C ; Inputs:u8; R0 = Optional calling parameter to destination process5; R1 = " " " " " "o&; R2 = Process PDV index ($LLCAL only)-; R3 = Address of function code ($LLCAL only)t#; R4 = Address of CCB ($LLCLC only)L; C.FNC - Function code; C.MOD - Function modifier ; C.STA - Destination PDV index;C'; Outputs: (to the destination process)a; R3 = Subfunction codel ; R4 = Address of CCB (optional); C.STA - Source PDV indexr-; R5 = Address of process database descriptor;0; Registers modified:a; R0, R1, R2, R3, R4;e; Note:=A; If the $LLCAL call is being performed from a task in an I and DV@; space system, the word pointed to by R3 will not be accessableB; by $PDDSP because it will be mapped via Kernel Instruction APR5.@; To work around this mapping problem, the word pointed to by R3*; should be in DSR or on the Kernel Stack.;-5$LLCLC::MOV R4,R3 ; Compute address of function code  ADD #C.FNC,R3 ; .... MOVB C.STA(R4),R2 ; Get destination PDV index- MOVB $CMPDV,C.STA(R4); Save source PDV index36$LLCAL::SAVRG ; Save current database descriptor MOV R2,R5 ; Copy PDV index+ ADD $PDVTA,R5 ; Point into PDV index tablel MOV (R5),R5 ; Get PDV addresse6 MOV Z.DAT(R5),R5 ; Get address of database descriptor' CALL $PDDSP ; Dispatch to the processr* RESRG ; Recover database descriptor RETURN  c6 .SBTTL $STDLC - Set up DLC Parameters for a Given SLN;+<; **-$STDLC-COMP00cJqpmmmffDATAUTE DLC PARAMETERS FROM A SYSTEM LINE NUMBER; **-$STDL1-(ALTERNATE ENTRY;A ; Inputs:s0; R2 = System line number (alternate entry only)1; R4 = Address of a CCB with a valid SLN in C.LINd; (Main entry only);t ; Outputs:; R2 = PDV index (word offset)+; R3 = Address of function code cell in CCBd ; R5 = Address of DLC line table; ; Registers modified:r; None;- $STDLC:: .IF NDF N$$1LNt+ MOVB C.LIN(R4),R2 ; Get system line number  .ENDC ; NDF N$$1LNn N$STDL1:: .IF DF N$$1LN8 MOV @$SLTMA,R2 ; Get address of system line table entry .IFF ; DF N$$1LNn ASL R2 ; Form word index3 ADD $SLTMA,R2 ; Point into system line index table 6 MOV (R2),R2 ; Get address of system line table entry .ENDC ; DF N$$1LN* MOV L.DLS(R2),R5 ; Get line table address/ MOVB L.DLC(R2),R2 ; Get PDV index (word index)i4 MOV R4,R3 ; Compute a pointer to the function code ADD #C.FNC,R3 ; ... RETURN ; Return to caller s 5 .SBTTL $ASCMP - Asynchronous Completion to LLC LevelD;+E; **- $ASCMP -ASYNCHRONOUS COMPLETION TO LOGICAL LINK CONTROL MODULES ;F?; This routine is called by Data Link Control processes to pass A; asyncronous status/error information to higher level processes.e;b ; Inputs:.,; R2 = Station number and system line number ; R3 = Asynchronous status/error;; ; Outputs:=; A CCB is allocated on behalf of the caller and based on theo:; system line number, is queued to the appropriate Logical; Link Control process.A;c; Registers modified:L ; R3 and R4;- .ENABL LSBN%$ASCMP::CALL $CCBGT ; Allocate a CCBO BCS 30$ ; If CS erroru@ MOV #FC.CCP+FS.AST,C.FNC(R4) ; Set error complete function code= MOV R2,C.LIN(R4) ; Set up station address/system line number BR 10$ ; Finish in common code y m/ .SBTTL $XMCMP - Transmit Complete to LLC Level;. .SBTTL $CTCMP - Control Complete to LLC Level. .SBTTL $RCCMP - Receive Complete to LLC Level+ .SBTTL $KLCMP - Kill Complete to LLC Leveli;+?; **-$XMCMP-TRANSMIT COMPLETE TO LOGICAL LINK CONTROL PROCESSES.; **-$CTCMP-CONTROL COMPLETE; **-$RCCMP-RECEIVE COMPLETE; **-$KLCMP-KILL COMPLETEC;P ; Inputs:N"; R3 = Operation completion status/; R4 = Address of CCB (or first ccb in a chain)s+; the CCB contains a valid line numbero;o ; Outputs:9; The appropriate function code is inserted into the CCB,C<; the line number is used to find the PDV specification, and(; the CCB is added to the process queue.; ; Registers modified:; R3;- MD$XMCMP::MOVB #FC.XCP,C.FNC(R4) ; Set transmit complete function code BR 10$ ; Join common codeE VC$CTCMP::MOVB #FC.CCP,C.FNC(R4) ; Set control complete function codei BR 10$ ; Join common codeA e@$KLCMP::MOVB #FC.KCP,C.FNC(R4) ; Set kill complete function code BR 10$ ; Join common codet C$RCCMP::MOVB #FC.RCP,C.FNC(R4) ; Set receive complete function codee#10$: MOV R2,-(SP) ; Save callers R2c+ MOVB C.LIN(R4),R2 ; Get system line number 520$: MOV R3,C.STS(R4) ; Store operation status in CCBP6 BICB #200,C.BID(R4) ; Mark message from a DLC process ASL R2 ; Multiply SLN by 2/ ADD $LLCTA,R2 ; Point to reverse mapping tablec< MOV (R2),R3 ; Get SLN & station to PDV & channel map entry5 BPL 25$ ; If PL, got PDV & channel (point to point)f( ; Else, pointer to station table map< MOVB C.STA(R4),R2 ; Get station number (never sign extends)6 ADD R3,R2 ; Compute half mapping table entry address& ASL R2 ; Make a word aligned address2 MOV (R2),R3 ; Get PDV & channel for this stationA25$: BIS #100000,R3 ; Indicate that cell contains a PDV & channelL  .IF DF M$$PRO6 CLR C.URM(R4) ; Allow process to run on any processor .ENDC ; DF M$$PRO . CALL $PDQUE ; Queue CCB and schedule process MOV (SP)+,R2 ; Restore R2 CLC ; Clear C-bit 30$: RETURN ; Return to caller .DSABL LSB4 2 .IF NDF X$$NDMm$ .SBTTL $DD??? - DLC to DDM Requests;+; General Requests with CCBy;d; Format of call:k ; CALL $DD???d;d ; Inputs:($; R4 = Address of first CCB in chain&; (All CCBs must contain a valid SLN); ; 00cRq#qnccccOutputs to DDM: $; R4 = Address of first CCB in chain ; R5 = Address of DDM line table,; R2 & R3 - Available for use without saving;Q; Registers across call:*; R0,R1 - Must be preserved by DDM if used#; R2,R3,R5 - Preserved by Comm Execu; R4 - May be modified;S; On return to DLC:D3; C-bit clear - Request has completed synchronouslya; R4 = Address of CCB; 2; C-bit set - Request will complete asynchronously ; R4 = 0s;-;+; Special requests without CCB;t; ; Format of call: ; CALL $DD??? ; ; Inputs:s; R3 = System line number5(; R4 = Optional calling parameter to DDM;i; Outputs to DDM:u*; R4 = Optional calling parameter from DLC ; R5 = Address of DDM line table,; R2 & R3 - Available for use without saving;-; Registers across call:+; R0,R1 - Must be preserved by DDM if used #; R2,R3,R5 - Preserved by Comm Execr; R4 - May be modified; ; On return to DLC:t; C-bit always clear-; R4 = Optional returning parameter from DDMB;- +$DDXME::DDFDF FC.XME,SUB ; Transmit enablen*$DDRCE::DDFDF FC.RCE,SUB ; Receive enable.$DDMAN::DDFDF FC.MAN,SUB ; Network management/$DDXKL::DDFDF FC.KIL+FS.XKL,CCB ; Transmit kill.$DDCRA::DDFDF FC.KIL+FS.CRA,CCB ; Receive kill;$DDKIL::DDFDF FC.KIL+FS.KIL,CCB ; Receive and transmit kill'$DDSTR::DDFDF FC.CTL+FS.STR,CCB ; Starte&$DDSTP::DDFDF FC.CTL+FS.STP,CCB ; Stop5$DDGET::DDFDF FC.CTL+FS.GET,CCB ; Get characteristics-5$DDSET::DDFDF FC.CTL+FS.SET,CCB ; Set characteristicsf/$DDRNG::DDFDF FC.CTL+FS.RNG,MDC ; Look for ringm-$DDENB::DDFDF FC.CTL+FS.ENB,MDC ; Enable line .$DDDIS::DDFDF FC.CTL+FS.DIS,MDC ; Disable line"$DDXON::DDFDF FC.CTL+FS.XON ; Xon#$DDXOF::DDFDF FC.CTL+FS.XOF ; Xoff 1$DDMSN::DDFDF FC.CTL+FS.MSN ; Sense modem statusK .< .SBTTL DDCM1 - Common Process for Special Non-CCB Functions;+9; **-DDCM1 - COMMON PROCESS FOR SPECIAL NON-CCB FUNCTIONST;D ; Inputs:F; R3 = Address of function code+; R4 = Unspecified calling parameter to DDMe; Stack contains::*; 00(SP) = Line number (originally in R3)); 02(SP) = Return address to calling DLC ;D; Outputs to DDM:F$; R3 = Subfunction code (word index); R4 = Same as on entry; R5 = Line table address ;X; Outputs on return to caller:; Function has been performed3; R4 = Unspecified return parameter to DLC from DDMn;o; Registers across call:; R2,R3,R5 preserved; R4 may be modified by DDM;- .ENABL LSBeDDCM1: .IF DF K$$DAS1 MOV R3,$DDFNC ; Store function code in data areao+ MOV #$DDFNC,R3 ; Point R3 at function code  .ENDC ; DF K$$DAS u MOV R2,-(SP) ; Save R2  MOV 2(SP),R2 ; Get line numberS. BR 22$ ; Join common code to dispatch to DDM : .SBTTL DDCM2 - Common Process for Modem Control Functions;+7; **-DDCM2 - COMMON PROCESS FOR MODEM CONTROL FUNCTIONS ;a5; If the specified line has modem control enabled the 7; function request is derailed to the modem controller.N4; On return from the modem controller the request is4; routed to the proper DDM as usual. If the line is6; hardwired the request is routed directly to the DDM.;( ; Inputs:R; R3 = Address of function codee; R4 = Address of CCBm; Stack contains: ; 00(SP) = Caller's R3D); 02(SP) = Return address to calling DLCt;s; Outputs to modem controller:; R3 = Subfunction codeI; R5 = Line table addressd;n; Outputs to DDM: ; R3 = Subfunction coder; R4 = Same as on entry ; R5 = Line table addresst; ; Outputs on return to caller:0; C-bit clear - Function performed synchronouslyA; C-bit set - Wait for asynchronous report of function completion.;(; Registers across call:; R2,R3,R5 - Preserved; R4 - Modified ;-DDCM2: .IF DF X$$MDC!R$$MPLs D .IF DF K$$DAS5 MOV R3,$DDFNC ; Store the function code in data arean+ MOV #$DDFNC,R3 ; Point R3 at function coden .ENDC ; DF K$$DAS . MOV (R3),C.FNC(R4) ; Put function code in CCB MOV R2,-(SP) ; Save R2 .IF DF N$$1LN3 MOV $SLTMA,R2 ; Point into system line index tablea .IFF ; DF N$$1LNd+ MOVB C.LIN(R4),R2 ; Get system li00cZqpmmmffDATAne numberr ASL R2 ; Form word index3 ADD $SLTMA,R2 ; Point into system line index tableP .ENDC ; DF N$$1LN3 BIT #LF.MDC,@(R2)+ ; Does line need modem control?4 BEQ 20$ ; No - join common code to dispatch to ddm MOV R5,-(SP) ; Save registerR- MOV R3,-(SP) ; Save address of function codeD4 CLR R2 ; Get auxilary process PDX index (always 0)6 MOV @$PDVTA,R5 ; Get address of auxilary process' PDV) ; that works since it's PDV index = 0= MOV Z.DAT(R5),R5 ; Get address of data base descriptor blocke, CALL $PDDSP ; Dispatch to modem controller MOV (SP)+,R3 ; Restore R3; MOVB C.LIN(R4),R2 ; Obtain line number (no sign extension)n7 BIS #100000,C.LIN(R4) ; Indicate modem control request 3 CALL DDMDSP ; Dispatch to the device driver (DDM)M0 BCS 25$ ; Request will complete asynchronously, CALL $CCBRT ; Otherwise return CCB to pool? CLR R4 ; Modem controller will return asynchronous completion , SEC ; Set C-bit, line is modem controlled BR 25$ ; Join common codet .ENDC ; DF X$$MDC!R$$MPLC 5 .SBTTL DDCM3 - Common Process for Functions with CCB 6 .SBTTL DDCM4 - Common Process for Functions with CCB;+2; **-DDCM3 - COMMON PROCESS FOR FUNCTIONS WITH CCB2; **-DDCM4 - COMMON PROCESS FOR FUNCTIONS WITH CCB;e ; Inputs: 7; R3 = Address of function and subfunction code (DDCM3),; R3 = Address of function code only (DDCM4); R4 = Address of CCBl; Stack contains:n; 00(SP) = Callers R3); 02(SP) = Return address to calling DLC; ; Outputs to DDM:c$; R3 = Subfunction code (word index); R4 = Address of CCBP; R5 = Address of line table;.; Registers across call:; R2,R3,R5 - Preserved; R4 - May be modified;-DDCM3: .IF DF K$$DAS1 MOV R3,$DDFNC ; Store function code in data areaH+ MOV #$DDFNC,R3 ; Point R3 at function codei a .IFTF ; DF K$$DAS9 MOV (R3),C.FNC(R4) ; Put function and subfunction in CCB4 BR 10$ ; Join common codeoDDCM4: .IFT ; DF K$$DASr2 MOV R3,$DDFNC ; Store function code in data area+ MOV #$DDFNC,R3 ; Point R3 at function code  .ENDC ; DF K$$DASA e/ MOVB (R3),C.FNC(R4) ; Put function code in CCBe10$: MOV R2,-(SP) ; Save R25 20$: MOVB C.LIN(R4),R2 ; Get SLN22$: MOV R5,-(SP) ; Save R53 CALL DDMDSP ; Dispatch to the device driver (DDM)M25$: MOV (SP)+,R5 ; Restore R5 MOV (SP)+,R2 ; Restore R2 MOV (SP)+,R3 ; Restore R3! RETURN ; Return to calling DLCC .DSABL LSB & .SBTTL DDMDSP - Dispatch to DDM Level;+!; **-DDMDSP-DISPATCH TO DDM LEVEL ;dF; This subroutine is called to dispatch down to the ddm level. ProcessH; dispatch will occur at the current priority or at the process priority; dependent on a PDV flag.;. ; Inputs:;; R2 = System line numberS;;; Registers modified: ; R5;-@DDMDSP: CALL $STDD1 ; Set up DDM PDV index & line table address CLC ; Save current priority! MFPS -(SP) ; with C-bit clearn" SAVRG ; Get a free register MOV R2,R0 ; Copy DDM PDV index+ ADD $PDVTA,R0 ; Point into PDV index table " MOV (R0),R0 ; Get pointer to PDV BIT #ZF.DVP,Z.FLG(R0). BEQ 10$ ; If EQ, run DDM at current priority& MTPS #PR7 ; Raise processor priority/ BICB Z.SCH(R0),PS ;;; Drop to process priority210$: RESRG ; Restore register # CALL $PDDSP ; Dispatch to the DDM$% ADC (SP) ; Update C-bit in saved PSe) MTPS (SP)+ ; Restore processor priorityM RETURN  5 .SBTTL $DDAST - Asynchronous Completion to DLC Level;+8; **-$DDAST-ASYNCHRONOUS COMPLETION TO DATA LINK CONTROL; B; This subroutine is called by device drivers when an asynchronousE; condition must be returned to a data link control module and no CCBa$; is available at the device driver.;S ; Inputs:o8; R3 = Asynchronous completion status (moved into C.STS); R4 = System line numbert;h ; Outputs:3; A CCB is allocated on behalf of the device driverR.; and the asynchronous status is queued to the ; Data Link Control module with:; C.FNC= FC.CCP; C.MOD= FS.AST;O; Registers modified: ; XXXN;- .ENABL LSBs'$DDAST::MOV R4,-(SP) ; Save line numbera CALL $C00cbq#qnccccCBGT ; Allocate a CCB BCS 5$ ; If CS error- MOV (SP)+,C.LIN(R4) ; Set line number in CCBa@ MOV #FC.CCP+FS.AST,C.FNC(R4) ; Set error complete function code BR 20$ ; Finish in common code"5$: MOV (SP)+,R4 ; Clean the stack RETURN ; Return to caller / .SBTTL $DDXMP - Transmit Complete to DLC Level . .SBTTL $DDRCP - Receive Complete to DLC Level. .SBTTL $DDCCP - Control Complete to DLC Level+ .SBTTL $DDKCP - Kill Complete to DLC Level;+2; **-$DDXMP-TRANSMIT COMPLETE TO DATA LINK CONTROL; **-$DDRCP-RECEIVE COMPLETE; **-$DDCCP-CONTROL COMPLETE; **-$DDKCP-KILL COMPLETEC'; **-$LLCSP-SPECIAL ENTRY POINT FOR X25r; 6; This subroutine is called by Device Drivers to queue8; completion notifications to Data Link Control modules.; J; The $LLCSP entry point is provided for use by the X25 Data Link Mapping.;- ; Inputs:m"; R3 = Operation completion status; R4 = Address of CCB to queue+; The CCB contains a valid line number;;* ; Outputs:'; The CCB is queued to a DLC list based$7; on the system line number parameter in the CCB with a*-; transmit or receive complete function code.R;O; Registers modified:s; XXXt;-D$DDXMP::MOVB #FC.XCP,C.FNC(R4) ; Set transmit complete function code BR 20$ ; Join common code C$DDRCP::MOVB #FC.RCP,C.FNC(R4) ; Set receive complete function code. BR 20$ ; Join common codea@$DDKCP::MOVB #FC.KCP,C.FNC(R4) ; Set kill complete function code BR 20$ ; Join common codee9$DDCCP::TST C.LIN(R4) ; Special modem control completion?e BPL 10$ ; If PL no) CALLR $CCBRT ; Yes - return CCB to poolr+ ; Modem controller will post completionO@10$: MOVB #FC.CCP,C.FNC(R4) ; Set control complete function code$LLCSP::$DDSPC::-20$: MOV R3,C.STS(R4) ; Set completion statusd .IF DF M$$PRO& MOVB C.LIN(R4),R3 ; Get system line # ASL R3 ; Form word offsetJ3 ADD $SLTMA,R3 ; Point into system line index tableS0 MOV (R3),R3 ; Get address of system line table;+; ** W a r n i n g **.;(2; DECnet-11M-PLUS V4.0 NTINIT hookpoint number 02.;fG; Do not change the instruction following label without checking NTINITr;-.$RTF02:: ; NTINIT changes the instruction at ; the location of this label' MOV L.KRBA(R3),R3 ; Get pointer to KRB( MOV K.URM(R3),C.URM(R4) .ENDC ; DF M$$PRO/ CALLR $PDQU1 ; Queue CCB and schedule processF .DSABL LSBJ .ENDC ; NDF X$$DDMt t9 .SBTTL $STDDM - Set DDM PDV Index and Line Table Addresss;+4; **-$STDDM-SET DDM PDV INDEX AND LINE TABLE ADDRESS; **-$STDD1-(ALTERNATE ENTRY) ;bC; This subroutine is called to set up a Device Driver PDV index andh3; line table address based on a system line number. ;t ; Inputs:0; R2 = System line number (alternate entry only)5; R4 = CCB address with a valid system line number in.; C.LIN (Main entry only);; ; Outputs:; R2 = PDV index#; R5 = Address of device line table$;t; Registers modified:S; R5;-$STDDM:: .IF NDF N$$1LNs/ MOVB C.LIN(R4),R2 ; Extract system line numberE .ENDC ; NDF N$$1LN-$STDD1:: .IF DF N$$1LN2 MOV @$SLTMA,R2 ; Get address of system line entry .IFF ; DF N$$1LNt ASL R2 ; Form word index3 ADD $SLTMA,R2 ; Point into system line index tablen0 MOV (R2),R2 ; Get address of system line entry .ENDC ; DF N$$1LN 1 MOV L.DDS(R2),R5 ; Get device line table addressu= MOVB L.DDM(R2),R2 ; Get device driver PDV index (word index) RETURN ; Return d( .SBTTL $CCBGT - Allocate a Standard CCB;+$; **-$CCBGT- Allocate a Standard CCB;mG; This subroutine is called to allocate a CCB from the CCB pool. If the A; assembly option is chosen, the CCB may be allocated from SystemF*; Dynamic Memory if the CCB pool is empty.;t ; Inputs:e; None.;V ; Outputs:.; R4 contains the address of the allocated CCB6; C-Bit is CLEAR if the CCB was successfully allocated0; C-Bit is SET and R4=0 if the allocation failed;-$CCBGT::CLC ; Assume Success' MOV @#PS,-(SP) ; Save current priorityd& MOVB #PR7,@#PS ;;; Disable interrupts .IF DF M$$PRO3 CALL $MPLCK ;;; Lock00cjqpmmmffDATA Access to CommExec Resourcesp .ENDC ; DF M$$PRO CALL CCBGT ;;; Allocate a CCBb .IF DF M$$PRO7 CALL @(SP)+ ;;; Co-Routine return to unlock resources  .ENDC ; DF M$$PRO< MOV (SP)+,@#PS ;;; Enable interrupts (and load final C-bit) RETURNs E( .SBTTL $LDBGT - Get a Large Data Buffer;+$; **-$LDBGT- Get a Large Data Buffer;lA; This subroutine is called to allocate a fixed length Large DatarA; Buffer. Large Data Buffers come out of the same pool as Receive$B; Data Buffers. The difference is that Large Data Buffers are for@; use by non-DDM processes and there must be a minimum number ofA; buffers remaining in the pool or the allocation will fail. TheDA; minimum number reserved for DDM processes is the RDB threshold.-;) ; Inputs:; None.T;L ; Outputs:2; R4 contains the address of buffers allocated CCB:; C-Bit is CLEAR if the CCB/LDB was successfully allocated0; C-Bit is SET and R4=0 if the allocation failed;m; Note:t2; The caller's APR6 is preserved across this call.;-?$LDBGT::CMP $RDBCT,$RDBTH ; Is pool minimum threshold exceeded?d1 BHIS $RDBGT ; If HIS, No ... go allocate buffern5 INC $LDBAF ; Increment count of allocation failuresi! RETURN ; Return with C-Bit SETs * .SBTTL $RDBGT - Get a Receive Data Buffer;+&; **-$RDBGT- Get a Receive Data Buffer; >; This subroutine is called to allocate a fixed length Receive; Data Buffer.;d ; Inputs:s; None.R; ; Outputs:3; R4 contains the address of allocated buffer's CCBe:; C-Bit is CLEAR if the CCB/RDB was successfully allocated0; C-Bit is SET and R4=0 if the allocation failed; ; Note:o2; The caller's APR6 is preserved across this call.;-6$RDBGT::MOV @#KISAR6,-(SP) ; Save current APR6 mapping' SAVRG ; Save some registerst CLC ; Assume successful' MOV @#PS,-(SP) ; Save current priorityo& MOVB #PR7,@#PS ;;; Disable interrupts .IF DF M$$PRO3 CALL $MPLCK ;;; Lock access to CommExec resources  .ENDC ; DF M$$PRO CALL CCBGT ;;; Allocate a CCB-# BCS 10$ ;;; If CS, None availables7 MOV #CF.LB,C.FLG(R4) ;;; Set-up last buffer indicator 8 MOVB #CB.RDB,C.BID(R4) ;;; and buffer ID fields in CCB/ MOV $RDBSZ,C.CNT(R4) ;;; Load size of RDB/LDB; MOV $RDBSZ,C.CNT2(R4)> MOV #$RDBLH,R5 ;;; Point to listhead in allocation crtl block- CALL BUFGT ;;; Allocate a Large Data Buffert BCC 10$ ;;; If CC, Successfuln& CALL CCBRT ;;; Else, release the CCB CLR R4 ;;; No CCB availableo10$: .IF DF M$$PRO8 CALL @(SP)+ ;;; Co-Routine return to unlock resources  .ENDC ; DF M$$PRO< MOV (SP)+,@#PS ;;; Enable interrupts (and load final C-bit)% RESRG ; Restore registersD3 MOV (SP)+,@#KISAR6 ; Restore previous APR6 mappingo RETURN ; Return to caller )- .SBTTL $RDBRT - Return a Receive Data Bufferc+ .SBTTL $LDBRT - Return a Large Data Buffer ;+); **-$RDBRT- Return a Receive Data Buffers'; **-$LDBRT- Return a Large Data Buffere;BD; This routine is called to return a data buffer to the large bufferE; pool. If the waiters count is zero or a buffer is already queued to(F; the system process to satisfy a wait request, the buffer is returnedA; to the pool. Otherwise, the system return process is scheduled. ;p ; Inputs:R); R4 contains the address of buffer's CCB-7; Note that C.BUF2+2 must contain the original Virtual <; Address of the buffer, and C.BUF must contain the original; Bias of the buffer.r; ; Outputs:; None.B;-$LDBRT::.$RDBRT::SAVRG ; Save some registers' MOV @#PS,-(SP) ; Save current prioritye& MOVB #PR7,@#PS ;;; Disable interrupts MOV C.BUF2+2(R4),C.BUF+2(R4) ) ;;; Copy the buffer's Virtual Addresst> MOV #$RDBCT,R5 ;;; Point to count in allocation control block6 TST $RDQCT ;;; Are any processes waiting for an RDB?; BLE RELBUF ;;; If LE, no waiters or buffer already queued > MOV #100000,R3 ;;; Else, send to buffer return system process3 BIS R3,$RDQCT ;;; Mark a buffer return in progressL MOV #FC.RCE!FS.RTN,C.FNC(R4)> .IF DF M$$PRO8 CLR C.URM(R4) ;;; Allow process to run on any pro00crq#qncccccessor .ENDC ; DF M$$PRO5 CLR (R4) ;;; Clear link word (only return 1 buffer)e0 CALL $PDQUE ;;; Queue buffer to system process! BR CMNRTN ;;; Enter common codeb k .SBTTL $CCBRT - Return a CCBe;+; **-$CCBRT- Return a CCBR;U6; This routine is called to deallocate a standard CCB.;0 ; Inputs: $; R4 contains the address of the CCB;s ; Outputs:; None.M;-.$CCBRT::MOV @#PS,-(SP) ; Save current priority& MOVB #PR7,@#PS ;;; Disable interrupts .IF DF M$$PRO3 CALL $MPLCK ;;; Lock access to CommExec resourcesC .ENDC ; DF M$$PRO CALL CCBRT ;;; Return the CCBC .IF DF M$$PRO7 CALL @(SP)+ ;;; Co-Routine return to unlock resourcesn .ENDC ; DF M$$PRO% MOV (SP)+,@#PS ;;; Enable interruptsR RETURNC 2 .SBTTL $CSBGT - Get a CCB and a Small Data Buffer;+.; **-$CSBGT- Get a CCB and a Small Data Buffer;eC; This routine is called to allocate a CCB and a Small Data Buffer.uD; The routine also sets up the buffer descriptor in the CCB to point1; to the buffer as well as the proper byte count.r;C ; Inputs:D; None.;C ; Outputs:-; R4 contains the address of the buffer's CCBP:; C-Bit is CLEAR if the CCB/SDB was successfully allocated'; C-Bit is SET if the allocation failedr;t; Note:R1; APR6 is mapped to the allocated buffer on exit. ;- .ENABL LSB$.$CSBGT::SAVRG ; Save some registers CLC ; Assume successl' MOV @#PS,-(SP) ; Save current priority & MOVB #PR7,@#PS ;;; Disable interrupts .IF DF M$$PRO3 CALL $MPLCK ;;; Lock access to CommExec resourcesc .ENDC ; DF M$$PRO CALL CCBGT ;;; Allocate a CCBc* BCS 20$ ;;; If CS, CCB allocation failed# MOV #CF.LB!CF.SOM!CF.EOM,C.FLG(R4)s- ;;; Set last buffer and single message ini= MOVB #CB.SDB,C.BID(R4) ;;; in flags and load ID of CCB/SDBf+ MOV $SDBSZ,C.CNT(R4) ;;; Load buffer sizeR MOV $SDBSZ,C.CNT2(R4)> MOV #$SDBLH,R5 ;;; Point to listhead in allocation ctrl block$ CALL BUFGT ;;; Allocate the buffer6 BCS 10$ ;;; If CS, SDB allocation failed, return CCB$ BR 20$ ;;; Else, enter common code ;5 .SBTTL $CSBRT - Return a CCB and a Small Data Buffer$;+1; **-$CSBRT- Return a CCB and a Small Data BufferM;.D; This routine is called to deallocate a CCB and a Small Data Buffer@; which is pointed to by the first buffer descriptor in the CCB.;, ; Inputs:;$; R4 contains the address of the CCB6; Note that C.BUF+2 must contain the original Virtual<; Address of the buffer, and C.BUF must contain the original; Bias of the buffer.t; a ; Outputs:; None. ;-.$CSBRT::SAVRG ; Save some registers' MOV @#PS,-(SP) ; Save current priority+& MOVB #PR7,@#PS ;;; Disable interrupts> MOV #$SDBCT,R5 ;;; Point to count in allocation control blockRELBUF:D .IF DF M$$PRO3 CALL $MPLCK ;;; Lock access to CommExec resourcesh .ENDC ; DF M$$PRO2 MOV C.BUF(R4),R3 ;;; Set up address of the buffer3 MOV C.BUF+2(R4),R2 ;;; as an address double word # CALL BUFRT ;;; Release the buffer 10$: CALL CCBRT ;;; Release the CCB20$: .IF DF M$$PRO7 CALL @(SP)+ ;;; Co-Routine return to unlock resources .ENDC ; DF M$$PROCCMNRTN: MOV (SP)+,@#PS ;;; Enable interrupts (and load final C-bit)B% RESRG ; Restore registersc RETURNo .DSABL LSB F: .SBTTL $RDBWT - Queue a Request for a Receive Data Buffer;+6; **-$RDBWT- Queue a request for a Receive Data Buffer;s@; This routine is called by DDM processes after a failure of the>; DDM to allocate an Receive Data Buffer ($RDBGT) has occured.@; The system line table flags word is updated to mark the buffer5; wait request and the global request is incremented.M;N ; Inputs:,$; R4 contains the System Line Number;l ; Outputs:; None.R;-%$RDBWT::SAVRG ; Save a registerB .IF DF M$$PRO CALL $MPSAV ; Bypass the cache .ENDC ; DF M$$PRO% ASL R4 ; Convert SLN to word offsetc3 ADD $SLTMA,R4 ; Point into System Line Index Table ;+; ** W a r n i n g **f;e2; DECnet-11M-PLUS V4.0 NTINIT hookpoint number 03.; *; Do not change the instructions following; labe00czqpmmmffDATAl without checking NTINIT ;-/$RTF03:: ; NTINIT changes the instructions atN ; the location of this label: INCB @(R4)+ ; Increment wait request count for this line& NOP ; Space for NTINIT runtime code NOP:; MOV (R4),R4 ; Code replacement for DECnet-11M-PLUS V4.0; INCB L.BFWT(R4) ; ...o% INC $RDQCT ; Increment global county .IF DF M$$PRO* CALL @(SP)+ ; Restore state of the cache .ENDC ; DF M$$PRO# RESRG ; Restore the registert RETURNh n( .SBTTL $RDBQP - Purge Buffer Wait Queue;+$; **-$RDBQP- Purge Buffer Wait Queue;eC; This routine is called to cancel all requests in the Receive Data+8; Buffer Wait Queue for a particular system line number.;e ; Inputs: $; R4 contains the system line number; ; Outputs:; None.t;-,$RDBQP::SAVRG ; Save some registers .IF DF M$$PRO CALL $MPSAV ; Bypass the cache .ENDC ; DF M$$PRO' ASL R4 ; Convert SLN into word offsetR3 ADD $SLTMA,R4 ; Point into System Line Index TableB;+; ** W a r n i n g **a;Q2; DECnet-11M-PLUS V4.0 NTINIT hookpoint number 04.;h*; Do not change the instructions following; label without checking NTINITi;-/$RTF04:: ; NTINIT changes the instructions atu ; the location of this label1 MOV @(R4)+,R3 ; Get System Line Table flags wordA0 BIC #^C,R3 ; Isolate wait request count0 BIC R3,@-(R4) ; Clear wait request count in SLT NOP NOP:; MOV (R4),R4 ; Code replacement for DECnet-11M-PLUS V4.0; CLR R3 ; ...n; BISB L.BFWT(R4),R3 ; ...; CLRB L.BFWT(R4) ; ...n7 SUB R3,$RDQCT ; Reduce global wait count by same valuec .IF DF M$$PRO* CALL @(SP)+ ; Restore state of the cache .ENDC ; DF M$$PRO# RESRG ; Restore registersu RETURNh o& .SBTTL CCBGT - CCB Allocation Routine;+"; **-CCBGT- CCB allocation routine;L@; This subroutine is called within this module to allocate a CCBB; from the CCB pool or from System Dynamic Memory. This routine isA; always executed with interrupts inhibited (and multi-processors; ; locks set).B;( ; Inputs:; None.,;Q ; Outputs:*; R4 contains the address of allocated CCB6; C-Bit is CLEAR if the CCB was successfully allocated'; C-Bit is SET if the allocation failedr;e; Notes:E; Before this routine is called, the calling routine must have issuedCD; a CLC instruction followed by an INHIB$. No other values must be E; stored on the stack because if the allocation fails, the FAIL: code.D; will reach back on the stack and set the C-Bit in the saved PSW soD; that when the calling routine executes an ENABL$ the C-Bit will be); set to indicate the allocation failure.C;-CCBGT: .IF DF N$$OPT!R$$MPL 9 TSTB PRIOFF+2(SP) ;;; Can we dynamically allocate a CCB?i BMI 10$ ;;; If MI, Noo; CMP $CCBCT,$RDBTH ;;; Else, are we below the RDB thresholdC. BHI 10$ ;;; If HI, No ... allocate from pool= CMP $CCBAL,$RDBNM ;;; Have we allocated enough dynamic CCBs?c BHIS 30$ ;;; If HIS, Yes) SAVRG ;;; Save some registersC0 MOV $CCBSZ,R1 ;;; Get size of block to allocate .IF DF M$$PRO1 ADD #2,R1 ;;; 2 more bytes on a Multi-Processorl .ENDC ; DF M$$PRO/ CALL $ALOCB ;;; Try to allocate a dynamic CCBS. MOV R0,R4 ;;; Copy adress of allocated block' RESRG ;;; Restore registersH* BCS 10$ ;;; If CS, DSR allocation failed .IF DF M$$PRO) TST (R4)+ ;;; Skip over Unibus Run Mask, .ENDC ; DF M$$PRO0 INC $CCBAL ;;; Count dynamically allocated CCB BR 20$ ;;; Enter common code .ENDC ; DF N$$OPT!R$$MPLC10$:3 MOV $CCBLH,R4 ;;; Get address of first CCB in listA" BEQ 30$ ;;; If EQ, list is empty) MOV (R4),$CCBLH ;;; Unlink CCB from listA/ DEC $CCBCT ;;; Reduce count of available CCBs,20$:1 MOVB #CB.CCB,C.BID(R4) ;;; Set up buffer ID byte  .IF DF M$$PRO8 CLR C.URM(R4) ;;; Allow process to run on any processor .ENDC ; M$$PRO4. CLR (R4) ;;; Zero next pointer (clear C-Bit) RETURN ;;; Return to caller30$:* INC $CCBAF ;;; Count allocation failures2 BR FAIL ;;; Enter common failure processing code L( .SBTTL CCBRT - CC00cq#qnccccB Deallocation Routine;+$; **-CCBRT- CCB Deallocation Routine;4B; This subroutine is called within this module to deallocate a CCBE; to the CCB pool or to System Dynamic Memory. This routine is alwaystE; executed with interrupts inhibited (and Multi-Processor locks set).o;s ; Inputs:;/; R4 contains the address of the CCB to releasea;- ; Outputs:; None.e;-CCBRT: .IF DF N$$OPT!R$$MPL; .IF NDF R$$MPLa2 CMP R4,#$CEAVL ;;; Is CCB from the internal pool? BHIS 10$ ;;; If HIS, Yes .ENDC ; NDF R$$MPLiA TSTB PRIOFF+2(SP) ;;; Were we called from Device Priority Level?s3 BMI 10$ ;;; If MI, Yes ... can't interlock $DEACBt3 CMP $CCBCT,$RDBTH ;;; Can we satisfy RDB requests?s, BLOS 10$ ;;; If LOS, No ... return to list, TST $CCBAL ;;; Any dynamic CCBS allocated?* BEQ 10$ ;;; If EQ, No ... return to list, SAVRG ;;; Save some registers# MOV R4,R0 ;;; Copy address of CCBF2 MOV $CCBSZ,R1 ;;; Get size of block to deallocate .IF DF M$$PRO0 ADD #2,R1 ;;; 2 more bytes on Multi-Processors+ TST -(R0) ;;; Backup over Unibus Run Maskr .ENDC ; DF M$$PRO$ CALL $DEACB ;;; Deallocate the CCB. RESRG ;;; Restore the registers1 DEC $CCBAL ;;; Decrement count of dynamic CCB'su RETURNt .ENDC ; DF N$$OPT!R$$MPLc10$:6 MOV $CCBLH,(R4) ;;; Set first pointer in returned CCB( MOV R4,$CCBLH ;;; Set new first pointer1 INC $CCBCT ;;; Increment count of CCB's in poolS RETURNG s. .SBTTL Allocation Control Block Documentation;+>; Allocation Control Blocks are used to control the allocation8; of fixed length blocks from double link lists (address=; doublewords). The control blocks have the following format:e;g!; .WORD <# of buffers available>c$; .WORD 0,0 ; Allocation listhead#; .WORD <# of allocation failures>V;- ,1 .SBTTL BUFGT - General Buffer Allocation Routine,;+-; **-BUFGT- General Buffer Allocation RoutineI;e<; This subroutine is called within this module to allocate aD; buffer from a doubley linked list. This routine is always executed<; with interrupts inhibited (and Multi-Processor locks set).;l ; Inputs:aA; R5 contains the pointer to listhead in Allocation Control Blockt; ; Outputs:+; R2 contains the Virtual Address of bufferA$; R3 contains the APR Bias of buffer9; C-Bit is CLEAR if the buffer was successfully allocatedA'; C-Bit is SET if the allocation faileda;u; Registers Modified:I; R5$; APR6 will be mapped to the buffer.;o; Notes:E; Before this routine is called, the calling routine must have issuedxD; a CLC instruction followed by an INHIB$. No other values must be E; stored on the stack because if the allocation fails, the FAIL: codetD; will reach back on the stack and set the C-Bit in the saved PSW soD; that when the calling routine executes an ENABL$ the C-Bit will be); set to indicate the allocation failure.S;- BUFGT: CLC ;;; Assume success, MOV (R5)+,R3 ;;; Get next buffer's APR Bias3 MOV (R5)+,R2 ;;; Get next buffer's Virtual Addresss. BEQ 10$ ;;; If EQ, No more buffers available/ MOV R3,@#KISAR6 ;;; Map APR6 to the new bufferh' MOV 2(R2),-(R5) ;;; Unlink buffer from # MOV (R2),-(R5) ;;; the free listF* MOV R3,C.BUF(R4) ;;; Load the Buffer Bias MOV R3,C.BUF2(R4)7 MOV R2,C.BUF+2(R4) ;;; Load the Buffer Virtual Addressa MOV R2,C.BUF2+2(R4)4 DEC -(R5) ;;; Decrement count of available buffers RETURNL10$:6 INC (R5)+ ;;; Increment count of allocation failures=FAIL: INC PRIOFF+2(SP) ;;; Set C-Bit in saved PSW for ENABL$.Q- SEC ;;; Indicate buffer allocation failureV RETURNA ;3 .SBTTL BUFRT - General Buffer Deallocation RoutineU;+/; **-BUFRT- General Buffer Deallocation Routines;B; This routine is called within this module to deallocate a buffer>; to a doubley linked list. This routine is always called with7; interrupts inhibited (and Multi-Processor locks set).b;b ; Inputs:T+; R2 contains the Virtual Address of bufferf$; R3 contains the APR Bias of buffer;; R5 points to the buffer count in allocation control blockI;c 00cqpmmmffDATA; Outputs:; None. ;-:BUFRT: INC (R5)+ ;;; Increment count of available buffers1 MOV @#KISAR6,-(SP) ;;; Save current APR6 mappingt: MOV R3,@#KISAR6 ;;; Map APR6 to the buffer being returned( MOV (R5)+,(R2) ;;; Link buffer to start' MOV (R5)+,2(R2) ;;; of the free list 5 MOV (SP)+,@#KISAR6 ;;; Restore previous APR6 mapping & MOV R2,-(R5) ;;; Set new first buffer MOV R3,-(R5) ;;; pointer RETURNa " .SBTTL $CELOG - Log Network Event;+; **-$CELOG-LOG NETWORK EVENTo;o ; Inputs:c; R0 - Event class and type; R1 - Event control word: ; Low byte:(; Bit 0 1 => R4 is address of a CCB$; 0 => R4 is a data area pointer;A*; 1 1 => Line-ID is SLN & Station#; 0 => Line-ID is PDV & Channels;t1; 2 1 => Event is associated with a lineP.; 0 => Event is not associated with a line;V8; 3 1 => Event is associated with a remote node5; 0 => Event is not associated with a remote nodet;+4; 4 1 => Event is associated with a circuit1; 0 => Event is not associated with a circuit:; 3; 5 1 => Event is associated with a module0; 0 => Event is not associated with a module; &; 6 1 => Use line-id from CCB2; 0 => Use line-id from event descriptor block;n ; High byte: ; # of bytes of data to copy;o); R3 - Pointer to event descriptor block:1; 3; Word 1 Line-ID (SLN & station or PDV & channel)e ; 2-4 Event dependent data; 5 Node address1"; 6 Module ID (Coded value); 7 Port #t; 8 Logical channel #;:*; R4 - Pointer to CCB or data area pointer;h; Registers modified:E; R0, R1, R2, R3, R5;-; $CELOG:: .IF DF N$$EVL!R$$MPL 1 MOV $LGPDV,R2 ; Get PDV index of logging process  BEQ 10$ ; If EQ, no loggingy2 MOV $CMPDV,-(SP) ; Save calling process PDV index6 MOV R3,-(SP) ; Save address of event descriptor block( MOV R1,-(SP) ; and event control word- MOV SP,R1 ; Set up pointer to control blocks# SAVRG ; Preserve CCB address)0 MOV $LGDDB,R5 ; Set address of logging database* MOV #$CELFN,R3 ; Set up dispatch function1 CALL $PDDSP ; and dispatch to logging process " RESRG ; Restore CCB address% CMP (SP)+,(SP)+ ; Clean up the stackx TST (SP)+ ; ... .ENDC ; DF N$$EVL!R$$MPLn10$: RETURN ; And return i" .SBTTL $TSTIM - Timeout Processor;+; **-$TSTIM-TIMEOUT PROCESSORb;kD; This subroutine is called to test and decrement a timeout count inE; the first byte of a process line table. If the count is decremented,@; to zero, the process is dispatched at it's timeout entry point#; with a 'FS.LTM' subfunction code. ;p ; Inputs:g; R2 - PDV index of processR$; R5 - Pointer to process line table;e ; Outputs:; Only R4 will be peserved;-#$TSTIM::MOV R2,R3 ; Copy PDV index + ADD $PDVTA,R3 ; Point into PDV index tableP* MOV @#KISAR5,-(SP) ; Save current mapping> MOV @(R3)+,@#KISAR5 ; Map to process (for mapped line tables)# MTPS #PR7 ;;; Disable interruptsc$ TSTB (R5) ;;; Is the timer active? BEQ 10$ ;;; No ... just exit, DECB (R5) ;;; Yes ... decrement time to go( BNE 10$ ;;; If NE, timer still running% CALL $DSPTM ;;; Dispatch to process 10$: MTPS #0 ;;; Restore priority' MOV (SP)+,@#KISAR5 ;;; Restore mapping RETURNT;: + .SBTTL $DSPTM - Dispatch a Process Timeouti;+&; **-$DSPTM-DISPATCH A PROCESS TIMEOUT; ?; Dispatch a process timeout at it's timeout entry point with am; subfunction code of 'FS.LTM';; ; Inputs:t; R2 - PDV index of processt$; R5 - Pointer to process line table;s ; Outputs:; Only R4 will be preserved ;-)$DSPTM::MOV R4,-(SP) ;;; Save caller's R4i0 MOV #$LTMFC,R3 ;;; Get address of function code% CALL $PDSPL ;;; Dispatch to processP% MOV (SP)+,R4 ;;; Restore caller's R4R MTPS #0 ;;; Enable interruptsa RETURNc 0 .SBTTL $CMQIN - Queue a Chain of CCBs to a List;+-; **-$CMQIN - QUEUE A CHAIN OF CCBS TO A LISTt;t?; This subroutine is called to add a CCB or a chain of CCBs to "; the end of a single linked lis00cq#qncccct.;i ; Inputs:c#; R3 = Address of two word listheady$; R4 = Address of first CCB in chain; ; Outputs:*; The CCB is queued to the end of the list;r; Registers modified:C; None;- '$CMQIN::SAVRG ; Save registerse"10$: MOV R4,R5 ; Copy CCB address4 BIC #CS.LST,C.STS(R5) ; Clear last CCB in chain bit0 MOV (R5),R4 ; Get address of next CCB in chain" BNE 10$ ; Loop till end of chain3 BIS #CS.LST,C.STS(R5) ; Set last CCB in chain bitC- MOV (SP),@2(R3) ; Link chain to end of queuei< MOV R5,2(R3) ; Update listhead pointer to last CCB in queue# RESRG ; Restore registersp RETURN ; Return e3 .SBTTL $CMQRM - Remove a Chain of CCBs from a List;+0; **-$CMQRM - REMOVE A CHAIN OF CCBS FROM A LIST;5; This subroutine is called to remove the first entryR; from a singly linked list.; ; Inputs:4#; R3 = Address of two word listhead;E ; Outputs:; C-bit clear:6; R4 = Address of first in chain or only CCB dequeued ; C-bit set:; Queue is emptyo;d; Registers modified:3; R4;- s5$CMQRM::SEC ; Set C-bit just in case queue is emptye1 MOV (R3),R4 ; Get address of first CCB in queueC$ BEQ 40$ ; Return if queue is empty! SAVRG ; Save a registerA110$: MOV R4,R5 ; Copy first CCB in chain addressl; BIT #CS.LST,C.STS(R5) ; Is this the last CCB in the chain?% BNE 20$ ; Yes - update the listheado5 MOV (R5),R4 ; No - get next CCB - is this the last?d' BNE 10$ ; No - loop till end of chainu:20$: MOV (R5),(R3) ; Set address of new first CCB in queue( BNE 30$ ; Branch if queue is not empty' MOV R3,2(R3) ; Otherwise close up list,=30$: CLR (R5) ; Clear link pointer in the last CCB of chain " RESRG ; Restore register40$: RETURN ; Return ,1 .SBTTL $CNV18 - Convert to 18-Bit Unibus AddressT0 .SBTTL $CNV22 - Convert to 22-Bit Q-bus Address;+,; **-$CNV18-CONVERT TO 18-BIT UNIBUS ADDRESS-; **-$CNV22-CONVERT TO 22-BIT QBUS-22 ADDRESSB;1<; This subroutine is called to convert an address doubleword=; to an 18-bit Unibus virtual addres or a 22-bit Qbus virtual ; addressy;M ; Inputs: ; R2 - Virtual address-; R3 - Relocation bias (physical address/100)l; ; Outputs:*; R2 - Low order 16 bits of Unibus address3; R3 - Bits 16 & 17 of Unibus address in bits 0 & 18;t;- .ENABL LSB.$CNV22:: ; Reference label .IF DF,K$$DAS$ MOV R2,-(SP) ; Save virtual address, TST R3 ; Buffer from exec, or common pool?6 BNE 5$ ; If NE, from common pool - use bias supplied. MOV R2,R3 ; Get virtual in required register CLR R2 ; Set up for left shift3 ASHC #3,R2 ; Shift active page field from virtuald ASL R2 ; Make it a word indexs/ ADD #KDSAR0,R2 ; Calculate D-space APR addressd# MOV (R2),R3 ; Get contents of APRB BR 5$ ; Join common code .ENDC ; DF,K$$DAS$CNV18:: ; Reference label* TST R3 ; Buffer from exec, or comm pool?! BEQ 10$ ; If EQ, it's from execT ; (in the low 16 or 20 K)m2 ; Exec phys addr = virtual addr = unibus addr)6 ADD $PUMR,R3 ; Add starting UMR bias to block address MOV R2,-(SP) ; Save virtual5$:i; BIC #160000,(SP) ; Clear APR selector from virtual addressL" CLR R2 ; Initialize 18 bit value .IF DF R$$EIS* ASHC #6,R2 ; Align as an 18 bit quantity .IFF ; DF R$$EIS .REPT 6 ASL R3 ; Shift low order bitsD4 ROL R2 ; into high order 2 bits for 18-bit value .ENDR .ENDC ; DF R$$EIS8 ADD R3,(SP) ; Add low 16 bits to saved offset in block' ADC R2 ; Add overflow to bits 16 & 17 ) MOV R2,R3 ; Get high order bits into R3U+ MOV (SP)+,R2 ; and low order bits into R2e10$: RETURN ; Return .DSABL LSBl ; .SBTTL $MVTBF - Move from Mapped Buffer to Unmapped Bufferb;+9; **- $MVTBF - MOVE FROM MAPPED BUFFER TO UNMAPPED BUFFERn;y=; This routine is called to move a block of memory (less thant;; 4k words) from a buffer that is currently mapped( (eitherN;; in system dynamic space or in the Comm Buffer Pool) to ansE; unmapped buffer. Note the mapped buffer can not be in the process's,A; space mapped via APR5 since it uses APR5 to map to00cqpmmmffDATA the unmappedb ; buffer.e;0; Calling format:n; JSR R1,$MVTBF ;. ; Inputs:F.; R2 = Virtual address of mapped "from" buffer,; R3 = Number of bytes to move on the stack: ; ----------n1; ! R1 ! Original contents of R1 before calle ; !--------!t<; ! VA ! 16-bit virtual address of unmapped "to" buffer ; !--------!y5; ! BIAS ! Relocation bias of unmapped "to" bufferp ; ---------- ; ; Outputs:D; R2 = Updated address of "from" buffer points to last byte moved +1 ; R3 = Zeroo;e*; Still mapped to "from" buffer via KISAR6;; Registers modified: ; R2 & R3 ;- .ENABL LSBs7$MVTBF::MOV KISAR5,-(SP) ; Save current process mappingo& MOV 6(SP),KISAR5 ; Map to "to" buffer# MOV R1,6(SP) ; Save return addressl/ MOV 4(SP),R1 ; Get "to" buffer virtual addressa6 CMP #140000,R1 ; Is the "to" buffer in the exec pool?< BHI 10$ ; If HI, yes then don't alter the virtual adddress+ SUB #20000,R1 ; Set VA for bias via KISAR5f10$:0 MOVB (R2)+,(R1)+ ; Move buffer a byte at a time SOB R3,10$ ; Loop till donef BR 20$ ; Join common exit code i= .SBTTL $MVFBF - Move from Unmapped Buffer to a Mapped Buffer;;+;; **- $MVFBF - MOVE FROM UNMAPPED BUFFER TO A MAPPED BUFFERu;r=; This routine is called to move a block of memory (less than"A; 4K words) from an unmapped buffer to a buffer that is currentlyhE; mapped (either in system dynamic space or in the Comm Buffer Pool).e@; The routine unmaps the requesting process and uses ARP5 to map ; to the unmapped "from" buffer.;e; Calling format:o; JSR R1,$MVFBF ; ; Inputs:m,; R2 = Virtual address of mapped "to" buffer(; R3 = Number of bytes to move on stack: ; ----------V1; ! R1 ! Original contents of R1 before callh ; !--------!a>; ! VA ! 16-bit virtual address of unmapped "from" buffer ; !--------! 7; ! BIAS ! Relocation bias of unmapped "from" bufferm ; ----------o;n ; Outputs:B; R2 = Updated address of "to" buffer points to last byte moved +1 ; R3 = Zero ;t(; Still mapped to "to" buffer via KISAR6;m; Registers modified: ; R2 & R3s;-7$MVFBF::MOV KISAR5,-(SP) ; Save current process mapping ( MOV 6(SP),KISAR5 ; Map to "from" buffer# MOV R1,6(SP) ; Save return addressR1 MOV 4(SP),R1 ; Get "from" buffer virtual addresst8 CMP #140000,R1 ; Is the "from" buffer in the exec pool?; BHI 15$ ; If hi, yes then don't alter the virtual address + SUB #20000,R1 ; Set VA for bias via KISAR5a15$:0 MOVB (R1)+,(R2)+ ; Move buffer a byte at a time SOB R3,15$ ; Loop till done 20$:+ MOV (SP)+,KISAR5 ; Restore process mapping MOV (SP)+,R1 ; Restore register TST (SP)+ ; Clean up stack RETURN ; Return .DSABL LSB  "' .SBTTL $CALLX - Mapped Subroutine Call ;+5; **-$CALLX-MAPPED SUBROUTINE CALL TO ANOTHER PROCESSt;C; Calling sequence:e; JSR R5,$CALLX (; .WORD