IMD 1.16: 30/08/2008 22:46:21 84-96116-01 a400 f11601 union carbide accept. test binary diskette os:dbg binary xdbg16 rndmfo os:cpy rndmf1 jcltv init jcllp 10-mar-81  *(('($nIP  ! ( (.(&(%%IK@L@OYIWHMIIyIHMII( HL@L @L@JIK@OYIHMII (*&$(##@iH IYWH Iy( ]1@ @ OS4 ME480070714431800800707144318 800707144318UTILITY DLD  # ?7D@@     nIPnI1f! %&&&$(('*9'C# LAC0HU U1G1JPS ?(K٠8p<0=q>>?1 1 ;A  % U ؠԠ!К    ƍzZYHצ S"OPPP)H-D >W<;:7-.02/K.P'- ƠP( *+F ƽ~o HPP ] \&H׊EI<:H׊5:מ7Wj*'m%-&'`du]SQP I  ď1ȏ ͯį٬ 4+!@G+'&#% W K(; @Bt @B=, ɰW wA&hX!Pflh7ڶv4%]L߲:F U!   T2`aƪt_!   J ){}1!!d! !R1F,Brqp<   ]7 aY4 dX1 gW. jUW& [ o @!R! O M K  sN.t \H(!W  !   / A4.+1-+h)&%$#%!P1ĺį(0Ž  -/ *" &#SU\[__c] UŞh 1ln *-(()$!S!L,ÞR 1  hXP +!8E% -AL !1 #Ӟ M t  - T ! ,AŞnh '1$!!(1(!( ݚޚ۞-Śƚijd1}H!K򏊩Ҩoj(esdW КSP[fZc҃ڀJ;v@t"d"u@'qo8/8.!h fP7(&/]0[01̛-ɲ!Dś(KPI!  ; J w ̶! ! "!&$P:GWJ s  0!(ЗN$_^'&01,Zh::X98543?NQc["lh#crqX€/1МW0W ע @]([F h  S !FF1BM; 6&K)1,s--v+z%"[1ahg1J0!m0PqrvwyA,>Yt %ZjǺֺĺtͺκ ;ź wϺ JԺ Ժ "!&$ `P:GWJ $$)) `  0!( ĠԠɠӠ t$mh::X9ɯϠҠĠ ĠҺ xPнؽӽ h>Z=: <8 <88Ah !М1(' (@1,/ЛP6990h=n@t  !  @hX@D@B@@@ 5lht ҭ<@=<(4 HR2у(@ 0!0!2Pu %he Ax 1T  !   NP1 @ %T"B=w1'! @#Л. *Pnh  X (sH lMt P0+&Q2 Q2L0%Q2"0#VQ2/0Q2(2 ;  < 1   f)"wPPqP255R" Q" 0"BҶF[K22lPP更P2[[T"ZD`N IJŲY Π ԠĠŠҠҠҠԠŠҠ Ԡ̠ΠԠ ŠŠŠſ:+@ [@<T" 6% A /2_R@?hZ ꄚ 1Aڂ szךk U|22 MwAc⹲val1],DI9QPJX ✲YJC;~---*= @<&1%1 @=@> @8@= @:@=lh ǀP }  +d8޴⣶^Դ(Ơ( 41ĊV2;Ġ/¾ ć/F34ⰴPܚ@ 2= X92H1*()&!%溜vqX9Wl 1!b 2  GGJFLAzО#~#'P*H/4!Ċ@ 1  # P(*,  ݴ М ;S0.!_ c㠴@lh: P 4@] $ 1%DϷ3hS M-Ѵ"P  2bf<P ǀ1c1  kP "P0 .1  #爴1%$OS \P T"P ! 1c0!`SP М 1?(P8C 84))(P!u'(!8⁜ %!oi k jiifĄ7b2A1l&fWWƴ U T]ߛR- .P@ 2  \!P  1s< ]㕴 i  ㇴ @ 2(u!"#$  !  Ok1 @b āzV!Ux N"IhhfКc2c3^1yut0ooml#!PZZ0( !.4 !eIH;<8#  2 М ; 8,eƄ '*1|?4A2ES ¶H0NƂj ´!D2A1 L硴77稴Q" P" PP` @v 2О{ t<ɶa b c l JsضoP@ޜ v2P Xy P(P8B!I! 1 @HP1C *x11U 20! FvJ1O CZPʛ P- G1j$$gVB0 ƀ17775PКP⩲+.%('' l%&&']² ␤⊜ ≲ XVU[tEPz]i$2na2P.T @R 22Tu ^0HƀO1M  P`%dPfp=ڶo l{lxXyv!TcIxцr!]Xy!1}P |1Dވ!P37jl!PОpޯ2޴Mz{P"|滜օPgX֍%'Ȥ̶ pp1QjӲ`"] QURPmxIxST!4 K"-ƀ@?>=:oxIx=T!4oxIx6T!30 D B C  ( @|H|(8C1EW!|!:Xx$I! 1 @HP1C *"#"C11U 20! "L#"J1O CZPʛ P- G1j$$#m#\B0ƀ17775PКP⩲+%('' l%#!!!!",",!"-]² ␤⊜ ≲ #^\#[#"#a#z"#K#V ]i$2na2P.T @R 22Tu)-).%2  ()})1))c)G)b  P1B(lh%8Y  )%& &ó8K8M !8T8V(0Wyxî8_!CCCC0!01==(095 16)V!%h]N)Q%S%Y)'( ((%%%%%%ğ PŸp#%)1-K;2Ʊ(&i'((Z((XS+ כ    S''''((&l&m&j&k?& "P1B((?='P1%}]a , -e]$n?(<:6 $Ξ[X(!`1Dc $11%SК P КК %}7β%&oβK|'o'((^%İıIJijĴĵĶķͰͱͲͳðñòóưƱƲƳh @@@DPiH!DX!HD;S   HD<!D  0D(H&H!  ( 5(J 0 D < W! ( P~  8TTdd(Td@ӱӲӳӴ PIIGI?FC>D1!:@>7;19!25W322/2€0$+ ''oxIxXxT1[y( P@|HD!HPBPDOV IBA*p(FPF <D1!:@>7;19!25W322/2€0$+ ''oxIxXxT1[y( P@|HD!HPBPDxOV IBA*pFPF <D1!:@>7;19!25W322/2€0$+ ''oxIxXxT1[y( P@|HD!HPBPDxOV IBA*pFPF <D1!:@>7;19!25W322/2€0$+ ''oxIxXxT1[y( P@|HD!HPBPDxOV IBA*pFPF <JKSB|FsD{ ӆvtrLDLELILRLWƖd ,ka'%#ņyĆxÆwpQAlýkL=\L>L:|öbL<L=L^]\Q HǞ wqqno = < > :bady~1ӺǠQ2#-)#$)$И#zƓ,&Ɠ$Q߇ƽ? T ܝ C I M Nܞ S Aޞ ›PQI`@" -LlQłބMb  C “KQGԓ؆a@" qQłЇށj Iސސސސޚޚ ,Ӟɝ,N̾w p“KQGb@"ӞƟ qQł˜Ǖށj MZY~^xYYhlTP<hFXFD  N: “KQG:JKd@"GH qQłB?A>ށj J S  “KQG 45e@"12 qQł,)+(ށj 0 A } @ydK@_Fs? V;8HgKeI 3Q IIZ@ZI A=; 7 6 31w BK . IJQs %Ԃ" ՟x M L CM yIPvwrJpER76hifQFfIP6A`~<"h@D@B@@ @@ (#! /|4y|КzB1N "ОFvuPޞ0 @)B ?Hep@)~idAMx@uiijI)=i ] _bcU Bl~~~~Q 6UK5 ;!:)?;/ p@ ~AQ+XQ"i@C 6g B6 Q I )5 6= iE~pU)i%+u'6 ~C  0P1GІ  i(60 Ě%U3--E2E0800707144318800707144318800707144318~К5PPP:n1ⱴ>g!⪲ t!HB!j  Ȁ5   AN ޻ºC  ecȞ?<r@TA r``&槞4:L Lr@ti@C 6gre ep@)|idA@cQAv @u   wv| e p@# qusy p.62XV-(7   piPU@L@|  ~-[0Z0 0Ď ƊQ u 1ƮО%GC H1%/ YV # R   GGE@UBBU( )+ޅ|   800707144318800707144318800707144318~c< >ISKLH ߶S_V @Z00TH[dL8 }PV[k^I$"AN ވ‡C tOC =Hep@)|idA@cQAv@ur`h`&er@TA_ p.6g]Vb(4+LLr@t@U*UFDi@?C 6gE= p@j r vv qhfy pih@L@| MBj LuJRBC Q" /.- M^BB6J?6;TM6D?665?64""1Q1(~"cu!8au0 !  R800707144318800707144318800707144318{(.!S+  i%1^ҠvH8Ơ ~ p t x|G AAvuPޞ0 @)B ?Hep@)~idAMx@uiijI)=i ] _bcU Bl~~~~Q 6UK5 ;!: ?;/ p@ ~AQ+XQ"i@C 6g B6 Q I )5 6= iE~pU)i%+u'6 ~)>\O.#W1w 1 nk1TR! 13--E2E0800707144318800707144318800707144318~>~$ 9( #B  JK"DQ ' ֦]  AN ވ‡C tOC= ep@)|idA@cQAv @u r`h`&er@TA_ p.6g]Vb(4+L Lr@t@U*U FDi@?C 6g _= p@  r vv  qh~iB0 !|) JK|T$' G̮f 1  4""1Q1( 6# "(YV.R #GG )+ޅ|     1 JF OV,$+2 OR =:80,A TURN ON BIT 7 XOR CKSUM,A EXCH CKSUM,A RESTORE CHARACTER IMS RECORD JMP *PINPB TITL CKSM EQU $ CHECKSUM VERIFICATION ~5c!)g6ތ 8pq$Z"C  AN ޻ºC ecȞ?<r@TAr``&槞4:LLr@ti@C 6gr e#ep@)|idA@cQAv@u  wv|ve p@# qusy p.62XV-(7  piPU@L@| M˾_ LuJRBC S V 1DBB6J?6;TM6D?665?6G""DQ*~ 1B'#%(P _ MNU&,W^ 800707144318800707144318800707144318~( d !r  w  H0!0!ö* USER DOCUMENTATION 00-93016-01A1 * SOURCE FILE 92-21000-22A1 * OBJECT FILE 92-21000-32A1 * WORD I/O BINARY  92-21000-42A1 * MAINTENANCE DOC 92-21000-51A1 * REL 0 RES 256,0 REL 0 * * START EQU $  JT SS,MEMSRC IF UNATTENDED IN 4,A GET CONSOLE WORD REGISTER CONTENTS JGE A,ME 8 Ƕ1g EQU $ COPY 0(X),A READ A CELL COPY A,0(X) WRITE IT BACK JNED X,TEST1 PURGE FROM AUTOLOAD BASE DOWN SBIT 8,S ENABLE INTERRUPTS UIS RE-ENABLE PARITY CHECKING RBIT 8,S DISABLE AGAIN  COPY BASE,X JMP FIRST GO AUTOLOAD SOMETHING TITL FLOPPY LOADER * * FLOPPY LOADER * FLOPDA EQU :11 0I0i0@0c00?0:@h 4;A>iA3 50w#0xF13lKX!"2 l}lV zn P 8R`qn0'fD!ƪƠEƊ  1G0.'R"Ƈ!ƠƠc_[ W S1w3+0;0<0=0>0?d(1 ț1 R  00 0- @w050 P10 1"0(ƠH(P(P(P(P8QQQQQ 2,ƮBB$( 6S֞+%(q0 Hg57 CFH$ ƮOV 070(6ư02106109hXXXH  0$0*0)0'0&20+hX X X H  0=0>0?3(ƽ4wƠ0#; <9XV)RRRћQQQQ0P!OLNNIMJGG>;8N97;7:593633(%8P,Ơƨ'Ʃƽ³!ƠƠƨʳƩƽг 66v12<0.0000-10 0 8i012f 0 23%-(#0'"P $2ۚDh2  Rhl@30(6?0?0>0=0;KW0 Ÿ\U(f^hd0 u Ơp1`2`207wƌ-0200#P0 ߝ 00"B0 6:32Ɗ,6jjƮ mcƮ_^ ЛZ4 S·GVIL6I4֟6G AַA0?_=<!G5!H1L...,,, $!%$/b 2 02H0 20!#0w0ߠ00-PPPPPP 1 $Ơ1ʜƠƿϷ ѷ"Ʈ 0-0 1 J@0JD1! P X 3%6v2<02611`2`_,PH   0/5 +**)@ 0@5@^  @ԛ 01045050=208i0:3;013P H  50+5 tw(20_ 8DH1084E Ʈ  032NMML KƿIF"AGR8G63543210V+'&#"! 3o0w0#00"w01003I344444,4a095<5B5A5C5>5?5@lussssr @@M 6P XXUT1P8KOQ2H( PEQ"0'H),k,.87698 ʞ9;=P!Ϟ=?0!HXHGHX! 1?X"""6Z13%070(24U4W0iĚ3Ơ,Ơ)X((XHӂ%%0""0"ƠXޓJp1Hig00HcXH_#2`21P6:Nvuus sƮmkĢhŢgɢfҢeעd cc!$q@sl[v,'J(CBAA<= l!P7l"l/0008-',,, J^dj  y0>66666662|6666ƱƽpƲƽwƳƽ~ƽ::9Ac95ƽ.!2!4;!D7==  cyOI1BGlށWK1JQtމ_S1B0W1EHޒh`d4W?128i000000000000000000000000 PICK UP WORD COPY A,0(X,Y) MOVE IT TO HIGH MEMORY JNED Y,MOVNXT IF DONE MOVING #ıЛCB A @j>=;84! 64413 10(C(B'A" ֚7)s% 1 2!670 !Кڳ  W x6f {!u1Dq!Pk1D gfdcA7_1]E\Z(D(R WƠ7 =:O!>!f:!CkE,142Q0P/-w `>/!jlm1B!D!H%!(|) 0NӱӲ? b P0 %!H,1!*4 PЎ)5:,+0-! &.Q+"`/*12Ќ*"Jf!HC( G!H X$ЎG}p*e*`irmPyt} "  (S0"ó-"1OY W!Yܞ" Q {3j"X6{m41PЎK̶Ҷ1PϚPКD 9X)?;P ('&laK"R2x  a:87|~S0R0T0"#,$* P( !.)ӲӱۍیK@!Bۇۊư՚՞Ԛ{ zP<W7W(C"IJcPЋ_>ZEY !m1Z1PPGH~10IGFZQa]^HPЎgY5`0Ўc-'+11"((! '2  pDq"/3B;:H !l! !Gٴ 1.H(0)(%$!Ơ Pư ,1  (ӱ    <r 1z w  t#2C'+Ɓ2kgcc[%.N* ȢP*O+W)UTQPM IHGF *PЊ7=PЌ-+0+.!+,()\,/b " %%%%%%% Sh8 nV )$G:Q;"ʁ6!0R 01٪! ӚسЪ1k˚  ˴ βŞLL PP1bP⧴ (ڠڜښ ⠲uwڌڃڂ"⋲ދw-t!y~|x!~t{hrКajkqigahHgPeRXW(MM11JIHIMFL i??!!?!C[B9G>V=:A.5M-!2)7'.%2 !&%(&$#PHЌ*   z)@   P"$ ךꁴ  Q  vqrqo1²nHf8Bd 2PfceGT]`1^X]QY1ORRRPPO0MH/LeKf0FE0DC>1Բ@>=!>g16}* &Ӳ.К-/v&*! (P恜5(gp ((ā歶 0 F(ăDDDIH Q < 4<41/1²., )/%- "H'-$ .RW 1m6d0О"1 #%."1%)1 -0100!aH378!f9NPPPASПU0PPH1 eWg `M&8@+%M9ĠĠ Ӻ٠ Ӻ٠ıɯϠҠ̠Π Ԡ٠ԠŠƖK!Ԡ٠ ĠƠԠԠĠĠnnnnnnnnnnnnnnnnnnnnnnnnnnDӱ͠d Bӱ͠ %&(%%''h(%''S%'ŠĠĠҠϮ;G٠ҮƠӠŠӠŬΠŠ٠î٠ ӱӲ_'8d6h5HK(G )E(PӠϽ֠õԠȰԠ̠ŠԠĵ ˠΠõPӠӱưĠƠˠҠΠðԠΠPؠ٠cDWٴAQ'u(p(p' °(/'" P(p(`(饁ѣ  #ᯜ("Dӱ͠d Bӱ͠ %H&n%H%m'(%m'%mŠĠĠҠϮ%G٠ҮƠӠŠӠŬΠŠ٠îPӠɽ֠õԠȰԠ̠ŠԠĵ ˠΠõPؠӺ٠ĠƠˠҠΠðԠΠPŬưͬˬưŠcDWٴAQ'u(p(p' °(/'" P(p(`(饁ѣ#ᯜ("Dӱ͠d Bӱ͠ %H&n%H%m'(%m'%mŠĠĠҠϮ%G٠ҮƠӠŠӠŬΠŠ٠îPӠɽ֠õԠȰԠ̠ŠԠĵ ˠΠõPؠӺ٠ĠƠˠҠΠðԠΠPŬƱͬˬƱŠcDWٴAQ'u(p(p' °(/'" P(p(`(饁ѣ#ᯜ("Dӱ͠d Bӱ͠ %H&n%H%m'(%m'%mŠĠĠҠϮ%G٠ҮƠӠŠӠŬΠŠ٠î PӠӱưõԠȰԠ̠ŠԠĵ ˠΠõPӠɽ֠ĠƠˠҠΠðԠΠ$1 WPK 5ln F$lnClnߙ;    Gllllllؙٙי֙ՙԙӱҙљЙϱΙͱ̙˱ʙșǙƱl. l3l8 XDę XDÙ X™"$ڂ c1 m1 w0( ٸ ( !5 Ʊ!,<  !" DZנB!/0  ! ȱ!B $ $K$boϠ٠ϠӠ9B" ӠŠԠҠddddd De8w<_@G ~$5+ԠҠƠϠӠϠŠĮ-ՠԠԠŠΠӠ٩#ĠƠˠҠΠ`P0pllll P(_ _鸙*PL MHIC$#6$:<  -+( &&$$1٠ҮнάĬͽ̠IIнͽн @UU鯱Й2%U%Rٵ %GYG%@Rٲ#%8%5( ,%'(s%%(ٲ %cDWٴAQ'(p(p(' °(/( " P(p(`(饁ѣ#ᯜ("Dӱ͠d Bӱ͠% %&%%( (%'%ŠĠĠҠϮ;G٠ҮƠӠŠӠŬΠŠ٠î٠Ԡ ӱӲ_(28Bd 8j7JM): I )G)O*(): (홟* D"  )T%)D):R)/ҠԠ٠ҠϯҠŠή)sΠŠ͠Ԡ٠ԠԠĠ٠ԠԠĠ ΠŠӠĠԠԠĠŠҠԠĠ*oyӠΠԠĠŭĭӯΠӠϮ$$%\))6%p$%[%%%$%-)%%!%H)%%2%=%@)  J w ;**[%_*(+((((#(( (-'(0&()(.(/(((%(1(&($s""$,$z$y$w$u"*$v")$t$~$$" ${$|$}*$* $)$(2$'1) $+$$-"5""""""98"($$$-7 65)$/$.$0$2.+*РԠPƴƶëΠРP̠ŠԠРҠӠĠŠԠàԠŠԠPŠĠĠҠϮΠΠεΠԠԠҠΠΠΠΰΠҠ αΠҠεΠҠΠàԠŠӠðԠҠdz ǠҠΠDz ǠҠΠDZ ǠҠΠȰưԠ̠ϠԠРԠİˠҠ ΠðñԠȰƲԠԠΠΠԠıˠҠ ΠñõԠȰԠ̠ŠԠĵ ˠΠõĠƠˠҠΠðԠΠ}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}cDWٴAQ'u(p(p' °(/'" P(p(`(饁ѣ #ᯜ("Dӱ͠d Bӱ͠ %H&n%H%m'(%m'%mŠĠĠҠϮ%G٠ҮƠӠŠӠŬΠŠ٠îPӠϽ֠õԠȰԠ̠ŠԠĵ ˠΠõPӠӱưĠƠˠҠΠðԠΠPؠ٠cDWٴAQ'u(p(p' °(/'" P(p(`(饁ѣ#ᯜ("Dӱ͠d Bӱ͠ %H&n%H%m'(%m'%mŠĠĠҠϮ%G٠ҮƠӠŠӠŬΠŠ٠îPӠɽ֠õԠȰԠ̠ŠԠĵ ˠΠõPؠӺ٠ĠƠˠҠΠðԠΠPŬưͬˬưŠcDWٴAQ'u(p(p' °(/'" P(p(`(饁ѣ#ᯜ("Dӱ͠d Bӱ͠ %H&n%H%m'(%m'%mŠĠĠҠϮ%G٠ҮƠӠŠӠŬΠŠ٠î PӠɽ֠õԠȰԠ̠ŠԠĵ ˠΠõPؠӺ٠ĠƠˠҠΠðԠΠPŬƱͬˬƱŠcDWٴAQ'u(p(p' °(/'" P(p(`(饁ѣ#ᯜ("Dӱ͠d Bӱ͠ %H&n%H%m'(%m'%mŠĠĠҠϮ%G٠ҮƠӠŠӠŬΠŠ٠îPӠӱưõԠȰԠ̠ŠԠĵ ˠΠõPӠɽ֠ĠƠˠҠΠðԠΠPӠӱưcDWٴAQ'u(p(p' °(/'" P(p(`(饁ѣ#ᯜ("Dӱ͠d Bӱ͠ %H&n%H%m'(%m'%mŠĠĠҠϮ%G٠ҮƠӠŠӠŬΠŠ٠îST SUDA*8+0 TEST FOR COMPLETION JMP $-1 WAIT FOR COMPLETION STAT COPY STMCST,A GET THE ST ATUS JGE A,BOOT IF NO ERROR GO EXECUTE BOOT SHIFT A,RO,1 DISC READY BIT TO -OV- JF OV,ERROR IF ERROR AND READY JNED Q,STM1 IF ONLY TRIED ONCE ADD =1,Q MAKE SURE LŠĠĠҠϮPӠϽР((R(/ҠԠ٠ҠϯҠŠήΠŠ͠Ԡ٠ԠԠĠ٠ԠԠĠΠŠӠĠPӠӱưŠҠԠĠӠΠԠĠŭĭӯΠӠϮ $((Pؠ٠_ J w ;*S*T$*K'(h(i(j'(l'y''k'&H'''''''(k$Q"$ $X$W$U$S" $T" $R$\$]$^"$Y$Z$[*$ $$2$1) $ $c$ "5!!!!!!!(g$a$`$b- )_$ $ $$*UIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPӠɽ֠IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII P̠ŠIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPŠĠĠҠϮ(l@d 8j7JM( I )G(*(( (홣*O D"  (((R(/ҠԠ٠ҠϯҠŠήΠŠ͠Ԡ٠ԠԠĠ٠ԠԠĠΠŠӠĠ)v⠠ԠԠĠŠҠԠĠӠԠĠŭĭΠӠϮ $((R$$$t$$$(u$w$$($$$$({_ J w ;*V*W$*N'(k(l(m'(o'|''n'&K'''''''(n$T"$ $[$Z$X$V" $W" $U$_$`$a"$\$]$^*$  $ $ 2$1) $ $f$"5!!!!!!!(j$d$c$e- )b$$$$*XIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIP̠ŠIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPŠĠĠҠϮàŠӠΠŠҠӠРĠǠŠҿРԠϠΠҠӠԠҠҠԠΠРà ҠӠ²ԠΠŠԠڠ˰ϠĠŲ̠ҠϠԠǠ˰Π²°ԠΠӠDZϠŠǠŠԠڠ˱Ű̠ϠΠϠԠǠϠҠ˱ԠҠҠҠƲΠ°³Ԡ ΠŠԠڠ˳ϠĠų̠ĠϠԠǠϠҠ˳Π³±ԠΠӠDzϠΠǠŠԠڠ˴ϠŠű̠ĠϠԠǠϠҠ˴ԠҠҳΠ±¶ԠΠŠԠڠ˵ϠĠŶ̠ĠϠԠǠϠҠ˵Π¶µԠΠӠdzϠΠǠŠԠڠ˶ϠĠŵ̠ĠϠԠǠϠҠ˶ԠҠҶ ΠµҠŠDZՠԠǺǠǠҠƠӠϠŠĠР ϠԠҠ ҠŠǠԠԠǺĠƠˠҠΠǠΠгдƲ٠ŠҠǠŠ͠ԠŠ°ð°ñ°õȶŠԠȶŠԠƲӠΠҠҳӠΠҠҶӠΠҠȰ°ȱ±Ȳ²ȳ³ȵµȶ¶ ӰвȰԠӠȰԠӠРȠΠƠƠϠԠԠҠΠҠҠЭԠӠϠ°°ԠΠҧРՠƲӠàӠӠ°°Ӡ¹¹ӠԠàƲΰàƲαàҳεàҶԠҠƠӠҠϠĠҠƠӠҠϠԠҠƠӠԠҠƠӠ°°ȠϠŠΠŠϠӠĠ ҠƠϠӠϠŠĩΠӠŠӠĠŠԠϠ ϠĭԠԠҠƠϠӠϠŠĮĠՠǠĭԠՠԠԠŠΠӠ٩ĠՠҠŠҠĭԠĠƠˠҠΠ̠ϠĠՠ ̠ĠŰ°ű±Ų²ų³Ŵ´ŵµŶ¶DZDzdzȶȵȳȷؠԠȸΠŠ٠Ԡ ԠԠ͠гĠҠǠӠв͠РҠ٠ϠĠŠIJ͠ӠРŠȠ٠ԠӠӱӱԠϠ٠ԠϠΫīؠ̰Ġ͠ҠӠؠ̠Ʋ٠ŠǠƲŠӠΠǠҠĠƠǠϠϠԠŠԠԠκΠҠΠΠŠ̠ˠРҠԠźԠŠؠӯŠΠРҠٯҠӠг٠ŠӠϠԿРӠРĭϠӲŠԠŠΫРԠϠԠӱԠ٠ҠӯӠΫĠԠκΠҠŠĠŠ̠ˠРҠԠɠ͠ҠҠĠҠҠϮˠؠīĠҠԠ֠ԠϠɠϠԠϺŠӠԠРҠ ԠɠҠҠӠРŠԠĠРˠ͠ԠРԠРԠźŠŠŠĠРҠԠκΠ͠ҠĠĠРҠī̠ԠŠ ӱԠԠij±Ġ°ĠΠ°ϠŠΠ٠ԠҠԠǮȰРԠРŠ̠ˠԠκΠҠŠРРҠǠЫŠ٠ԠǠΠР ԠϺԠŠŠϠŠРРРҠҲЫ̠ŠƠĠӠĠIJϠˠϠǠ̠ؠΠӠƠàϠīԠϺĠĠΠԠ͠ŠРҠԠϺŠĠΠŠŠҠР РҠҠԠҠӠРϠԠӠРΠIJРԠźŠ͠ŠĠРҠРīԠĠҠӲ٠ԠŠΫīؠ̰ŠƠĠϠҠ٠Šؠ̠ӠвԠϠϠ٠ϠĠŠРĠӱīԠ٠ҠԠŠ͠вIJРРԠϠϠԠ͠ԠͺĠ͠ҠԠǺ̠ŠРҭɠĠՠ֠ԠҠؠĠıĠŠĠԠؠРҠĠΠӠΠǬӠΠحǠɠ°ԠϠɠɠ°ؠԠ ӠΠǠĠӠΠحǠؠ̠ȠӠΠǠؠРΠ֠͠͠ӠàɠԠԠֺ ؠ«ӠΠ٠Ϡ͠ԠӠԠĠıؠРҠĠРРԠԠ٠ҠƠӠ̠ԠĠԠĠΠ͠ԠؠԠ͠ԠҠؠؠԠҠĠȷƠӠ̠РȠРǠРȠǠȠŠРҠȠīŠΠ ؠ̠ŠƠ͠ŠӠŠΠ͠ҠŠҠؠ̠ ΠɠΠΠӱӠԠ͠ӠؠӠҠŠҠҠӠĠӱӠԠ͠ӠĠŠϠԠšҠҠӠԠĬҬΠĬƲРЬƲǠ͠ҲƲƲӠƠҠԠŠĠĠҠϮϠ°°ԠӠǠĭԠ٠ҮƠӠŠӠŬԠΠŠ٠îĠՠ͠ĸԠ٠ԧϠ°ԠĠՠРϧӠӠ Ӡ ԠŠΠ٠РвԠϠΠנԠӠ̠ΠӱӱӲӲϠҠҠ̠ĠϠؠҠƠӠƠƠˠԠӠՠȰ Р̠̰Ӡࠠ°°IJӠӠРȷƠƠԠ͠ҠԠıгҠƠӠϠŠĠΠŠԠΠԠԱՠ ӠԠ͠ՠϠƠӠҠŠ͠ՠͯԠ͠ԠӠдРӠư ΠΠԠŠΠŠ̠ˠĠԠƠҠȠŠЫŠΠ  ԠκΠŠŠԠԠҠ٠ҠҠΠ  ԠЫŠҠҠɠ͠ҠƠӠҠŠЫנҠԠϺԠϠР ҠԠҠٯҠӠдРԠϠˠԠӠҠԠҠ ԠźŠŠԠҠٯҠǠӠՠؠϠӠҠɠؠϠĠӠҠɠƠӠԠҠΠРԠԠ֠ԠϠɠ͠ŠΠӠŠؠĠ°ӠͭҠӠԠǺǠĠΠ Ԡ͠ԠҠƠӠРϠˠϠԠ͠ԠˠϠˠϠԠԠՠҠϠԠӠҠРӠԠԠԠٯҠ! ͠ҠԠ֠ԫӠƠ͠ϠԱӠ٠٠ՠӠǠǠԠҠҠƠӠĠɠϠӠРǠĠŠҠĠŠɠԠ٠ӠРǠՠҠǠԠǠԠǺǠΠǠдРҠҠ̠ӠԠՠŠ̠ˠϧӠĠĠӠӠӠԠĠĠ٭͠Рՠ ԠРŠɠԠ٭͠" ǠՠĭԠҠԠ٠ҠϯҠŠήĠՠư ̠Ġ٠ՠĸԠԠΠŠԠ͠ԠĸԠ٠ԠԠħԠĸԠ٠ԠԠĠԠĸԠ͠ԠΠŠӠĠԠĸԠԠԠĠԠĸԠŠҠԠԠĸԠԠӠΠĠĸԠԠŧĬĬĬĬĬĬĠԠħĬĬĬĬĬĬĠĬĬĬĬĬĬĬĠĸ# ԠӯΧĬĬĬĬĬĬĬĬĠԠϠҠƠӠǠĭԠӠϮ°͠°ĠՠĠ ĬĬĬĬĬĬĬĠĸԠӯΧĬĬĬĬĬĬĬĬĠPӠϽР((R(/ҠԠ٠ҠϯҠŠήΠŠ͠Ԡ٠ԠԠĠ٠ԠԠĠΠŠӠĠPӠӱưŠҠԠĠӠΠԠĠŭĭӯΠӠϮ $((Pؠ٠_ J w ;*S*T$*K'(h(i(j'(l'y''k'&H'''''''(k$Q"$ $X$W$U$S" $T" $R$\$]$^"$Y$Z$[*$ $$2$1) $ $c$ "5!!!!!!!(g$a$`$b- )_$ $ $$*UIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPӠɽ֠IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII$ $ WPI 3ln D"lnAln9 ڽ Ellllllݙܙۙڙؙٙױ֙ՙԙӱҙѱЙϱΙ̙˙ʱl& l+l0 XDș XDǙ Xƙ"YřıÙ±1 cı±1 mı±1 ټ ( !Ù5 ʱ!ř,  !" ˱!/  !# ̱!B  $,$C9BӠŠԠҠddddd D'8932K TOO LARGE COPY X,BACMEM BYTE OFFSET TO MEMORY RBIT 0,S RESET CARRY BIT ADDC 8 BACMEM,A ADD IN BAC PLUS OFFSET JT CY,ERROR BAC PLUS OFFSET TOO LARGE COPY =-1,X SET COUNT TO -1 JMP AWORD EXIT * TITL ** * LUPDAT EQU $ IJEQ X,UPDAT BUMP COUNT, IF DONE UPDATE HPC  CLSN Q,=8-9&:FF CHECK FOR RES AND FILL TC = 8 JMP AWORD IF RES AND FILL KEEP OLD VALUE WORD EQU $ JST PINPW GET NEW VALUE CLSN Q,=7-9&:FF CHECK FOR REL WORD TC = 7 RWORD ADD K,A REL WORD, ADD BIAS AWORD EQU $ COPY A,0(Y) STORE VALUE AT PC IJNE Y,LUPDAT BUMP PC AND REPEAT * SKIPIT EQU $  JST PINPB COPY A,Q JEQD Q,JTYPE IF LENGTH IS 0, DO NEXT TC JST PINPB JNED Q,$-1 JMP TYPE * TITL EXECUTION PREPARATION * * ZERO RECORD LENGTH IS AND END OF FILE * EOT EQU $  COPY HPC,Q PUT FIRST AVAILABLE MEMORY LOCATION IN QQ COPY EXEC,X PUT EXECUTION ADDRESS IN X MAGS EQU $ COPY =:40,Y SET UP FOR LSI 3/05 OPERATION OUT A,2 TURN OFF AUTOLOAD LIGHT COPY PANEL,A CONSOLE ATTACHED JNE A,GOOO NO-AUTOLOAD ANYWAY JT SS,GOOO IF UNATTENDED ALWAYS EXECUTE IN 4,A INPUT CONSOLE REGISTER SHIFT A,RO,1 GET EXECUTION BIT TO OV JF OV,ERROR STOP IF NO EXECUTION GOOO EQU $ RBIT  6,S TURN OFF XA BIT JMP 0(X) GO EXECUTE * TITL UNINSTALLED MEMORY TRAP SET-UP * REL :88  ORG AT MEMORY TRAP TEMP1 EQU $ LOCATION IS ALSO USED AS A TEMP QCDCHK WORD :095F QCD ROM CHECKSUM VALUE CKSUM RES 1,0 TRAP EQU $ JMP FINDMN IF UNINSTALLED MEMORY TRAP, KEEP SIZING MEMORY * ERROR EQU $ OUT A,2 TURN OFF AUTOLOAD LIGHT HLT HALT FOR ERROR OR NO EXECUTION COPY  Q,K SAVE RTELOCATION BIAS JFIRST EQU $ JMP FIRST GO LOAD ANOTHER TAPE * H100 WORD :100 RECORD RES 1,0 SQ RES 1,0 TITL FIND FILEMARK - INPUT RECORD LENGTH PTP1 EQU $ ENT LOOK FOR A FILEMARK AND INPUT RECORD LENGTH JST PINPB GET A FRAME IN A REG SUB =:FF,A CHECK FOR FILEMARK JNE A,PTP1+1 IF NOT FOUND LOOK AGAIN COPY A,CKSUM ZERO CHECKSUM JST PINPW  GET RECORD LENGTH ( 2 FRAMES ) COMP A,A COPY A,RECORD IJEQ A,EOT ZERO RECORD LENGTH IS AND END OF FILE JMP *PTP1 TITL PAPER TAPE INPUT WORD * * GETS A WORD (2 FRAMES) AND RETURNS IT IN A * PINPW EQU $ ENT JST PINPB PICK UP FIRST BYTE SHIFT A,LO,8 MOVE IT TO THE UPPER BYTE COPY A,TEMP1 STORE IT JST PINPB PICK UP NEXT BYTE OR TEMP1,A COMBINE THE TWO BYTES JMP *PINPW RETURN H8614 WORD :8614 JNEXT JMP NEXT TITL TYPE CODE DECODING * APTP COPY =0,A ABSOLUTE PAPER TAPE COPY A,K ZERO RELOCATION BIAS RPTP EQU $ RELATIVE PAPER TATPE COPY =0,Y ZERO PLACE COUNT (Y IS PC) COPY Y,HPC AND HIGH PC JST PTP1 GO LOOK FOR RECORD * TYPE CODE DECODING TYPE EQU $ JST PINPB GET 9 TYPE CODE (1 FRAME) COPY A,Q SAVE TC IN Q CLSN =:40,Q CHECK NULL JMP TYPE AND =:DD,A CHECK FOR :4D,:4F,:6D,:6F CLSN =:4D,A JMP SKIPIT JST PINPW GET LENGTH (2 FRAMES) NEG  A,X MAKE X A COUNTER CLSN =:18,Q CHECK FOR BEGIN JMP TYPE SUB =:9,Q JGT Q,CKERR TC OUT OF RANGE TITL XNX Q INDEX JUMP INSTRUCTION JMPTBL EQU $ JMP JMPTBL+:9 CKERR JMP ERROR 1= LSI-2 START JMP AEND 2= ABS END JMP REND 3= REL END JMP AORG 4= ABS ORG JMP RORG 5= REL ORG JMP WORD 6= ABS WORD JMP WORD 7= REL WORD JMP  WORD 8= RES AND FILL JMP BAC 9= BYTE ADDRESS CONSTANT TITL PAPER TAPE INPUT BYTE * * GETS A FRAME FROM THE DIO HSPTR OR DIO TTY PTR * WHICHEVER IS READY * IF NEITHER IS READY, IT RETURNS TO * CHECK THE NEXT DEVICE IN THE POLLING SEQUENCE * * PINPB ENT COPY Q,SQ SAVE Q REGISTER COPY H8614,Q  SET UP DEAD MAN TIMER OUT Q,:FB START DIO HSPTR OUT Q,:F9 START DIO TTY PTR HSR1 EQU $  IN :FB,A GET DIO HSPTR STATUS TBIT 1,A JT OV,TRYTTY . IF SYSTEM NOT READY, TRY TTY PTR TBIT 3,A JT OV,HSR1 . IF STILL THERE TRY AGAIN TRYHSR EQU $ IJEQ Q,GOTIT  INCREMENT DEAD MAN TIMER, IF EXPIRED JUMP IN :FB,A GET DIO HSPTR STATUS TBIT 1,A  JT OV,TRYTTY . IF NOT READY, TRY TTY PTR TBIT 3,A JF OV,TRYTTY . IF NO WORD READY,TRY TTY * IN :FA,A GET A BYTE FROM HSPTR JMP GOTIT GOT A BYTE TRYTTY EQU $ IN :F9,A GET TTY STATUS TBIT 1,A JT OV,TRYHSR . IF NOT THERE, BACK TO HSPTR TBIT  3,A JF OV,TRYHSR . IF NO WORD TRY HSPTR IN :F8,A GET A BYTE FROM TTY PTR TITL GOTIT EQU $ EXCH H100,X GET RESET COMMNAD OUT X,:FB RESET DIO HSPTR OUT X,:F9 RESET DIO TTY EXCH H100,X RESTORE X JEQ Q,JNEXT COPY SQ,Q  RESTORE Q * NOW DO CHECKSUM CALCULATION CK EQU $ EXCH A,CKSUM COPY A,LASTCK SAVE LAST CHECKSUM  SHIFT A,RO,1 JF OV,$+2 OR =:80,A TURN ON BIT 7 XOR CKSUM,A EXCH CKSUM,A RESTORE CHARACTER IMS RECORD JMP *PINPB TITL CKSM EQU $ CHECKSUM VERIFICATION  COPY LASTCK,A GET LAST CHECKSUM COPY A,CKSAVE SAVE IT COPY PINPB,A GET RETURN POINTER COPY A,SPINPB SAVE IT COPY PINPW,A E COPY A,SPINPW SAVE ANOTHER JST PINPB GET CHECKSUM BYTE SUB  CKSAVE,A SHOULD BE ZERO JNE A,CKERR COPY TEMP1,A GET UPPER BYTE OF INPUT WORD ROUTINE COPY A,CKSAVE STORE IT TEMPORARILY IN CHECKSUM SAVE JST PTP1 GOOD CHECKSUM-GET NEW RECORD COPY CKSAVE,A GET : BACK UPPER BYTE COPY A,TEMP1 STORE IT BACK FOR INPUT WORD ROUTINE COPY SPINPW,A COPY A,PINPW RESTORE POINTER COPY SPINPB,A COPY A,PINPB RESTORE ANOTHER JMP PINPB+1 PICK UP A BYTE AND RETURN TO PREVIOUS TC TITL RESERVED CELLS AND LITERAL POOL LASTCK RES 1,0 CHECKSUM SAVE CKSAVE RES 1,0 CHECKSUM SAVE SPINPW RES 1,0 SAVE PINPW RETURN ADDRESS SPINPB RES 1,0 SAVE PINPB RETURN ADDRESS TITL QCD AUTOLOAD TEST VERIFY * * THIS ROUTINE COMPUTES THE XUM * OF THE AUTOLOAD ROM AS IT IS * DONE IN THE QCD TEST. * REL :100 COPY HXFF00,A SET UP COUNT COPY A,TEMP2 COPY =0,X COPY 0(X),A  FIRST WORD JMP AUT5 AUT4 EQU $ ADD 0(X),A ADD NEXT AUT5 EQU $ ADD =1,X  BUMP INDEX IMS TEMP2 JMP AUT4 CSK A,AUTTOT COMPARE TO QCD VALUE HLT LESS HLT GREATER HLT EQUAL TEMP2 RES 1,0 AUTTOT WORD :FFFF HXFF00 WORD :FF00 END . IF SYSTEM NOT READY, TRY TTY PTR TBIT 3,A JT OV,HSR1 . IF STILL THERE TRY AGAIN TRYHSR EQU $ IJEQ Q,GOTIT  INCREMENT DEAD MAN TIMER, IF EXPIRED JUMP IN :FB,A GET DIO HSPTR STATUS TBIT 1,A  JT OV,TRYTTY . IF NOT READY, TRY TTY PTR TBIT 3,A JF OV,TRYTTY . IF NO WORD READY,TRY  TO ENABLE PARITY LOGIC, ENABLE INTERRUPTS * THEN ISSUE A UIS, NO PARITY ERRORS SHOULD *  OCCUR AFTER THE PURGE SBIT 8,S ENABLE INTERRUPTS UIS RE-ENABLE PARITY CHECKING RBIT 8,S DISABLE INTERRUPTS COPY XSAVE,X COPY RETURN,Y PICK UP RETURN ADDRESS ADD  X,Y ADD AUTOLOAD OFFSET COPY Y,RETURN STORE COMPUTED RETURN ADDRESS JMP *RETURN RETURN THROUGH INDIRECT POINTER * * RETURN FOR AUTOLOAD THROUGH THIS LOCATION * RETURN WORD SETUP * XSAVE RES 1,0 RES 6,0 TITL QCD AUT TEST VERIFY * * THIS ROUTINE COMPUTES THE XUM * OF THE AUTOLOAD ROM AS IT IS * DONE IN THE QCD TEST. * REL :100 COPY HXFF00,A SET UP COUNT COPY A,TEMP2 COPY =0,X  COPY 0(X),A FIRST WORD JMP AUT5 AUT4 EQU $ ADD 0(X),A ADD NEXT AUT5  EQU $ ADD =1,X BUMP INDEX IMS TEMP2 JMP AUT4 CSK A,AUTTOT COMPARE TO QCD VALUE HLT LESS HLT GREATER HLT EQUAL TEMP2 RES 1,0 AUTTOT WORD :FFFF HXFF00 WORD :FF00 END :0009 OPCODE COMAND WORD :200 * TITL MINI-DIAGNOSTIC * * MINI-DIAGNOSTIC CHECKS PROCESSOR OPERATION *  AND DOES A PARITY PURGE THROUGHOUT MEMORY * TEST EQU $ COPY X,XSAVE SBIT 1,S SET OV JF OVicEdDano?~|   B~~4 6Oc󦣞䆨 AN ޓ’C vuPޞ0 @)B ?Hep@)~idAMx@uiijI)=i ] ; _bcU Bl~~~~Q 6UK5 ;!?;/ p@ ~AQ+XQ"i@C 6g B6 Q I )5 6= iE~pU)i%+u'6  66G  @EB 5 `"恟 )+ޅ|   mE7E4E5E3--E2E0IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII TITL NM-4 AUTOLOAD TYPE 2 #92-21000-11A1 TITL START * COPYRIGHT 1978,1976 COMPUTER AUTOMATION INC. * * USER DOCUMENTATION 00-93016-01A1 * SOURCE FILE 92-21000-21A1 * OBJECT FILE 92-21000-31A1 * WORD I/O BINARY 92-21000-41A1 * MAINTENANCE DOC 92-21000-51A1 * REL 0 RES 256,0 REL 0 * * START EQU $ JT  SS,MEMSRC IF UNATTENED IN 4,A GET CONSOLE WORD REGISTER CONTENTS JGE A,MEMSRC CHECK FOR TEST JMP JERROR IF TEST-HALT TITL FLOPPY LOADER * * FLOPPY LOADER * FLPYAD EQU :11 FLOPPY DEVICE ADDRESS FLOPPY EQU $ SST FLPYAD*8+4 CHECK FOR CONTROLLER PRESENT JMP NEXT IF NOT PRESENT COPY =7,A READ ALL OPCODE COPY A,OPCODE TO IOB COPY A,SEEK SEEK COUNT FLOP1 EQU $ COPY =1,A SET UP TO READ SECTOR 1 COPY A,SECTOR PUT IT IN IOB  COPY BASE,A GET CODES BASE ADDRESS ADD =IOB-START,A COMPUTE NEW IOB ADDRESS SST FLPYAD*8+0 TEST FOR CONTROLLER IDLE JMP $-1 WAIT FOR CONTROLLER IDLE OUT A,FLPYAD*8+0 ISSUE I/O SST FLPYAD*8+0 TEST FOR COMPLETION JMP $-1 WAIT FOR DONE COPY =-80,A INSURE CYLINDER 0 EXCH A,SEEK GET SEEK COUNT JGE A,FLOP1 IF FIRST SEEK COPY FLPSTT,A  GET STATUS SHIFT A,RO,1 SYSTEM READY BIT TO -OV- JT OV,NEXT IF NOT READY FLOP2 EQU  $ AND =:7F,A CLEAR TO 7 BITS JEQ A,BOOT IF NO ERRORS JERROR EQU $ JMP ERROR  IF ERROR TITL DEVICE SELECTION DECODE * * DEVICE SELECTION DECODE * INIT EQU $ COPY X,BASE SAVE THE BASE ADDRESS OF AUTOLOAD NOW JMP JTEST DO MINI-DIAGNOSTIC SETUP EQU $ THEN RETURN HERE COPY H100,A SET UP MAGNETIC DEVICE WORD COUNT COPY A,WORDS STUFF IT IN THE IOB FIRST EQU $ COPY =0,A INITIALIZE IOB VALUES COPY A,BUFFER BUFFER ADDRESS IS ALWAYS 0 COPY A,INTER NO INTERRUPTS COPY A,FLPSTT CLEAR FLOPPY STATUS COPY A,CYLIN CYLINDER 0  COPY A,UNIT UNIT 0 COPY =5,A SET MINI-FLOPPY AS FIRST DEVICE COPY A,DEV <  SET UP FOR UNATTENDED OPERATION NEXT EQU $ IN 4,Q GET CONSOLE WORD REGISTER SHIFT Q,RO,1 RIGHT JSTIFY DEVICE SELECTION CODE COPY PANEL,A GET PANEL FLAG JNE A,NOPANL IF NO PANEL SKIP SENSE SWITCH TEST JF SS,SAME IF ATTENDED OPERATION NOPANL EQU $ IMS DEV BUMP TO NEXT DEVICE COPY DEV,Q LOAD DEVICE INDEX TITL SAME EQU $ XNX Q  INDEX THE JUMP INSTRUCTION JMP $+1 AND EXECUTE IT JMP NEXT . 0=PTP REL, NOT SUPPORTED JMP NEXT . 1=PTP ABS, NOT SUPPORTED JMP STM14 . 2=STORAGE MODULE, POLLED 4TH JMP FLOPPY . 3=FLOPPY, POLLED 2ND JMP MTIC . 4=MTIC, POLLED 3RD JMP STMU14 . 5=DISC UPPER PLATTER, NOT POLLED JMP MINFL0 . 6= MINI-FLOPPY UNIT 0 POLLED FIRST JMP MINFL1 . 7= MINI-FLOPPY UNIT 1 NOT POLLED TITL MTIC EOB INTERRUPT SERVICE * * RETURN HERE ON MTIC EOB INTERRUPT * MTEOB EQU $ MTSTRT WORD :230  MTIC START COMMAND IN MTICDA+1,A GET STATUS BYTE ONE AND THROW IT AWAY IN MTICDA+1,A  GET STATUS BYTE TWO SUB =:C0,A CHECK HDW & RATE ERRORS JLT A,JERROR IF ERROR - HALT BOOT EQU $  COPY =0,X SET EXECUTION ADDRESS TO 0 JMP MAGS GO CHECK EXECUTION BIT TITL FLOPPY/DISC IOB * * THE FOLLOWING LOCATIONS ARE USED AS TEMP CELLS * BASE RES 1,0 AUTOLOAD RELOCATION ADDRESS DEV RES 1,0  DEVICE TO CHECK IF READY PANEL RES 1,0 PANEL FLAG = 0 IF CONSOLE PRESENT * * THE FOLLOWING LOCATION ARE USED AS THE IOB * FOR THE FLOPPY AND DISCS * IOB EQU $ ORG IOB OPCODE RES 1,0 UNIT RES 1,0 CYLIN RES 1,0 SEEK EQU $ HEAD RES 1,0 SECTOR RES 1,0 WORDS RES 1,0 BUFFER RES 1,0 INTER RES 1,0 FLPWCT EQU $ NXTIOB RES 1,0 FLPSTT EQU $ STMWCT RES 1,0 STMCST RES 1,0 STMDST RES 1,0 TITL MEMORY SEARCH TO RELOCATE AUTOLOAD ************************************************** * NOTE: THIS SECTION IS OVERLAYED WITH * * THE DISK I/O BLOCK. SEE ABOVE * * * **************************************************  ORG IOB-3 * FIND END OF MEMORY MEMSRC EQU $ SBIT 6,S TURN ON XA BIT COPY Q,K SAVE RELOCATION BIAS COPY =0,X START FROM TOP OF MEMORY AND WORK DOWN COPY X,PANEL CLEAR PANEL FLAG COPY =:FF,Y Y USED FOR CONSOLE CHECK AND TRANSFER COUNTER SELP Y,4 PUT Y INTO WORD REG IN  4,Q GET IT BACK CSK Q,=:FF CHECK IF CONSOLE PRESENT NOP COPY Y,PANEL NOT PRESENT SO SET PANEL FLAG NON-ZERO SELP A,4 RESTORE WORD REG IN CASE SS=FALSE FINDMN EQU $ SUB H100,X  DECREMENT MEMORY POINTER COPY =-1,A SET TO ALL ONES EXCH A,0(X) ACCESS MEMORY THROUGH POINTER EXCH A,0(X) ACCESS MEMORY THROUGH POINTER IJNE A,FINDMN BUMP RESULTS OF MEMORY ACCESS,=  IF NOT RAM, AGAIN EXCH A,0(X) NOW TRY TO GET BACK ZEROS EXCH A,0(X) JNE A,FINDMN IF FAILURE MUST BE ROM COPY A,TRAP NOP TRAP IN CASE OF PARITY ERROR * TRAP WILL FALL THROUGH TO PARITY ERROR HALT  TITL * * RELOCATE AUTOLOAD TO HIGHEST WRITABLE MEMORY * GOTMN EQU $ MOVNXT EQU $ COPY 0(Y),A  PICK UP WORD COPY A,0(X,Y) MOVE IT TO HIGH MEMORY JNED Y,MOVNXT IF DONE MOVING  JMP INIT-START(X) GO TO RELOCATED AUTOLOAD CODE * * TITL DISC STORAGE MODULE LOADER * SMDA EQU :14 DISC STORAGE MODULE DEVICE ADDRESS SUDA EQU :15 * * :14= MEDIUM CAPACITY DISC * :15= HIGH CAPACITY DISC * STMU14 EQU $ COPY =2,Y SET HEAD FOR UPPER PLATTER JMP STMX JUMP AROUND LOWER PLATTER HEAD SET STM14 EQU $ DISC LOWER PLATTER COPY =0,Y SET HEAD FOR LOWER PLATTER STMX COPY Y,HEAD COPY =1,Q COPY =1,X SET Q AND X FOR LOOPING STM0 EQU $ SST SMDA*8+4 SENSE IF CONTROLLER PRESENT JMP TRYUPR IF NOT TRY AT :15 JMP STM1 PRESENT AT :14 TRYUPR SST SUDA*8+4 SENSE IF PRESENT AT :15 JMP FIRST NOT PRESENT SO CHECK FIRST DEVICE COPY =1,Y SET Y FOR :15 PATH TITL STM1 EQU $ COPY =4,A SET UP OPCODE COPY A,OPCODE COPY =0,A INITIALIZE IOB VALUES COPY A,SECTOR SECTOR ADDRESS OF 0 COPY A,NXTIOB NO IOB CHAINING COPY A,STMCST CLEAR CONTROLLER STATUS COPY BASE,A COMPUTE NEW IOB ADDRESS ADD =IOB-START,A CLSN Y,=1 FIND WHICH PATH TO TAKE JMP PATH15 Y WAS SET TO ONE SO TAKE :15 PATH PATH14 SELP A,SMDA*8+4 INITIALIZE THE CONTROLLER SST SMDA*8+0 TEST FOR IDLE JMP $-1  WAIT FOR IDLE OUT A,SMDA*8+0 ISSUE I/O SST SMDA*8+0 TEST FOR COMPLETION JMP $-1  WAIT FOR COMPLETION JMP STAT JUMP AROUND :15 PATH PATH15 SELP A,SUDA*8+0 INITIALIZE THE CONTROLLER  SST SUDA*8+0 TEST FOR IDLE JMP $-1 WAIT FOR IDLE OUT A,SUDA*8+0 ISSUE I/O SST SUDA*8+0 TEST FOR COMPLETION JMP $-1 WAIT FOR COMPLETION STAT COPY STMCST,A GET THE STATUS JGE A,BOOT IF NO ERROR GO EXECUTE BOOT SHIFT A,RO,1 DISC READY BIT TO -OV- JF OV,ERROR IF ERROR AND READY JNED Q,STM1 IF ONLY TRIED ONCE ADD =1,Q MAKE SURE LAST INSTRUCTION IS PASSED AGAIN JNED X,TRYUPR TRY :15 TWICE JMP FIRST IF STILL NOT READY TITL ERROR/EXECUTION HALT * H100 WORD :100 * JFIRST EQU $ JUMP INTO POLLING SEQUENCE COPY =1,A  SET UP FOR DISC STORAGE MODULE NEXT XNEXT COPY A,DEV JMP NEXT * JTEST JMP TEST INDIRECT JUMP TO TEST  TITL UNINSTALLED MEMORY TRAP SET-UP REL :88 ORIGIN AT MEMORY TRAP LOCATION TEMP1 EQU $ LOCATION>  IS ALSO USED AS A TEMP QCDCHK WORD :A256 QCD ROM CHECKSUM VALUE CKSUM RES 1,0 TRAP EQU $ JMP FINDMN UNINSTALLED MEMORY TRAP IERROR EQU $ USED FOR INDIRECT JUMP AND ALSO JMP ERROR PARITY ERROR SQ RES  1,0 JBOOT JMP BOOT * ERROR EQU $ OUT A,2 TURN OFF AUTOLOAD LIGHT HLT HALT FOR ERROR OR NO EXECUTION COPY Q,K SAVE RELOCATION BIAS JMP FIRST * TITL MTIC LOADER * MTIC LOADER MTICDA EQU :F2 MTIC DEVICE ADDRESS MTRDY EQU :4 READY BIT MTLDP EQU :10  LOAD POINT STATUS POINT MTONL EQU :10 ON-LINE STATUS BIT MTDBY EQU :2 WORD BUSY STATUS BIT MTRAT EQU :40 MTHER EQU :80 MTINT EQU :C8 MTWDCT EQU MTINT+1 MTMODE WORD :4FF * MTIC EQU $ COPY MTMODE,A GET MODE SELECT WORD OUT A,MTICDA+1 ISSUE MODE SELECT IN MTICDA+1,Q GET STATUS BYTE ONE IN MTICDA+1,A GET STATUS BYTE TWO * CHECK STATUS JEQ Q,JFIRST NO DIO INSTALLED, CONTINUE POLLING AND =MTDBY;MTLDP,Q MUST BE AT LOAD POINT AND NOT BUSY JNE Q,JFIRST IF MTIC IS NOT READY, GO TO NEXT DEVICE AND =MTRDY;MTONL,A CHECK FOR READY JNE A,JFIRST IF NOT READY * GOOD STATUS, TRY TO LOAD * ASSUME I/O LOCATIONS ARE LOADED FROM ROM MTIC1 EQU $ COPY BASE,X GET AUTOLOAD BASE  COPY MTSTRT,A GET START I/O COMMAND SBIT 8,S ENABLE INTERRUPTS OUT A,MTICDA+1 ISSUE START TO PICO JMP $ WAIT FOR COMPLETION TITL READY,SET,GO! * MAGS EQU $ FROM MAGNETIC DEVICE LOADING COPY =:40,Y SET UP Y FOR LSI-3/05 OUT A,2 TURN OFF AUTOLOAD LIGHT COPY  PANEL,A CONSOLE ATTACHED JNE A,GOOO NO-AUTOLOAD ANYWAY JT SS,GOOO IF UNATTENDED ALWAYS EXECUTE  IN 4,A INPUT WORD REGISTER SHIFT A,RO,1 GET EXECTUION/NO EXECUTION BIT JF OV,ERROR  IF NO EXECUTION GOOO EQU $ RBIT 6,S TURN OFF XA BIT JMP 0 * TITL MINI-FLOPPY LOADER * PICODA EQU :FC PICO DEVICE ADDRESS, CHANNEL 6 * MINFL1 EQU $ MINI-FLOPPY UNIT 1 COPY =1,A COPY A,MFUNIT MINFL0 EQU $ MINI-FLOPPY UNIT 0 IN PICODA+1,A GET PICO STATUS TO A JEQ A,JMPOUT DIO NOT ENSTALLED TBIT 1,A GET PRESENT/NOT BUSY BIT TO OV JF OV,READY JMPOUT COPY =2,A NOT READY SO SET FLOPPY AS NEXT DEVICE JMP XNEXT JUMP TO NEXT DEVICE READY EQU $  COPY BASE,Y ADD OUTAD,Y CREATE CONTROL BLOCK ADDRESS COPY =1,Q SET Q FOR LOOP TWICE  COPY =9,A SET OPCODE FOR SEEK COPY A,OPC TITL TWICE COPY =5,X SET X AS COUNTER AND POINTER OUTLUP COPY 0(X,Y),A OUTPUT CONTROL INFORMATION OUT A,PICODA IN OUTPUT LOOP JNED X,OUTLUP SEND SIX BYTES COPY COMAND,A OUTPUT OF COMMAND WORD OUT A,PICODA+1 COPY =7,A SET OPCODE FOR R? EAD COPY A,OPC STATUS IN PICODA+1,A INPUT STATUS TBIT 1,A CHECK BUSY BIT JT OV,STATUS LOOP UNTIL NOT BUSY ERRCHK EQU $ ERROR CHECKING AND =:7F,A IGNORE WRITE PROTECT CSK  A,=5 CHECK ERROR CODE JMP HERE A<5, NO ERRORS JF SS,IERROR A>5, IF NOT POLLING - ERROR HALT  JMP JMPOUT A=5, NOT READY SO TRY NEXT DEVICE TITL MTIC I/O INTERRUPT LOCATION SET UP * REL :C8 ORIGIN AT MTIC INTERRUPT LOCATION AIB MTICDA+0 WORD :7E70 READ :C8 WORDS EXEC EQU $ WORD -1 HPC EQU $ WORD 0 JST MTEOB-START(X) AT END OF MTIC READ GOT TO END OF BLOCK TITL MINI-FLOPPY CONTINUED HERE JNED Q,TWICE OUTPUT SEEK0, THEN READ1 AND GO ON INPUT EQU $ INPUT FROM PICO FIFO TO MEMORY  COPY =0,X SET POINTER COPY =:7F,Y SET COUNTER SBIT 2,S SET BYTE MODE INLOOP EQU $ INPUT LOOP IN PICODA,A INPUT A BYTE COPYB A,0(X) STORE BYTE INDEXED BY X ADD =1,X INCREMENT POINTER JNED Y,INLOOP DECREMENT COUNTER RBIT 2,S RESET BYTE MODE JMP JBOOT JUMP TO BOOT * * OUTAD WORD OUTBL ADRESS OF CONTROL BLOCK OUTBL EQU $ MFDED WORD :0001 DRIVE ENABLE DELAY MFSEC WORD :0001 SECTOR MFHEAD WORD :0000 HEAD MFTRAK WORD :0000 TRACK MFUNIT WORD :0000 UNIT # OPC WORD  :0009 OPCODE COMAND WORD :200 * TITL MINI-DIAGNOSTIC * * MINI-DIAGNOSTIC CHECKS PROCESSOR OPERATION *  AND DOES A PARITY PURGE THROUGHOUT MEMORY * TEST EQU $ COPY X,XSAVE SBIT 1,S SET OV JF  OV,STOPIT ENSURE OV WAS SET RBIT 1,S RESET OV JT OV,STOPIT ENSURE OV RESET COPY =0,A ZERO A REGISTER JNE A,STOPIT SUB =1,A IJNE A,STOPIT TEST1 EQU $ COPY A,Q XOR Q,A JEQ A,PURGE STOPIT EQU $ STOP IN TEST OUT A,2 TURN OFF AUTOLOAD LATCH HLT PURGE EQU $ READ/WRITE TO PURGE MEMORY COPY 0(X),A COPY A,0(X) JNED X,TEST1 *  TO ENABLE PARITY LOGIC, ENABLE INTERRUPTS * THEN ISSUE A UIS, NO PARITY ERRORS SHOULD *  OCCUR AFTER THE PURGE SBIT 8,S ENABLE INTERRUPTS UIS RE-ENABLE PARITY CHECKING RBIT 8,S DISABLE INTERRUPTS COPY XSAVE,X COPY RETURN,Y PICK UP RETURN ADDRESS ADD  X,Y ADD AUTOLOAD OFFSET COPY Y,RETURN STORE COMPUTED RETURN ADDRESS JMP *RETURN RETURN THROUGH INDIRECT POINTER * * RETURN FOR AUTOLOAD THROUGH THIS LOCATION * RETURN WORD SETUP * XSAVE RES 1,0 RES 6,0 TITL QCD AUT TEST VERIFY * * THIS ROUTINE COMPUTES THE XUM * OF THE AUTOLOAD ROM AS IT IS * DONE IN THE QCD TEST. * REL :100 COPY HXFF00,A SET UP COUNT COPY A,TEMP2 COPY =0,X  COPY 0(X),A FIRST WORD JMP AUT5 AUT4 EQU $ ADD 0(X),A ADD NEXT AUT5 @ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII