IMD 1.16: 2/09/2008 13:49:46 84-93720-01 f72001 ufdc ht program files 17aug81 hft:ufdc:1.obj hft:ufdc:2.asm hft:ufdc:2.obj hft:fdc:lnk.jcl hft:ufdc:3.obj hft:ufdc.mac hft:fdc:asm.jcl hft:ufdc:3.asm hft4.bin hft:ufdc:1.asm hft:fdc:prn.jcl  ž ªªž @0‚|†ø)®wÂwЀЀÎtQº®qŠl) ˆ " ž}‚gÿA ¢`œžúžŒžöšè@Mˆ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IOS4 €MÁúE681081713311600810817133116 810817133116#F72001 VOLUFDC HT PROGRAM FILES   ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IžúžŒžöšè@Mˆ@†jæjg€ÿígÿèÂg@ †o G€ÿò`úkžŽŸôžŸ¢_„C# b# ž}€BŸ€ žuÒ[Ÿæ žþž]e‡ †JÂRŸ­æðiŸòÀˆÆCÆCp@€„†<€…†;€††:€ƒ †FÂ8P@ G€ÿÁÆ;à‰Ÿ•NÆêPŸéâ×èCHùC €ˆC ˜GÈTºà€qEžç‚â¢'ŸÉžŠ *ŠÃ CŠŠÏŸxÆžì @0DAJ÷LÆ )®ê‘ЀЀΎQBžxªâ" І iŸŠ€„œªª+⟠fžEŸùžB)3žß `jmBˆBŸ I,Ÿv Ÿ °Ÿ€BŸ I,ŸmžÊ ž @¬E°EšF€F)€DŸ^ÄE‚‚„Fž% †ÊæjHÿÆÄÆÄ@pÆOŸÄŸv g€ÿ7gÿ4ò]XŸ] P¢hâV+ì„s=è„胟cžÆ_†N‚£ ž‡žôŠGŠFŸÖž†›ŸÁžØŸø Š•Â“@AúLèSÃ)"$ C ž‰žkžøª1žïŠ/žjŠ-ž žhÿöÿÿ ‚p ž…âvŸR†Ÿw ÞpÞpžwâ‚pŸ Þkâižº† ’ŸÂ¢œ€15 !Š^æ\žd ²X‚ žˆò %€À'+ò²NŸs感Qâ‚)žs ‡EÞDŸ|Ÿ{ @ž$ ož¶ Ož¯ mž­ Jž« Kž© ižž gž¶†. žV tž²žì„sFè„n`" FàEžD)ž ŸE`ŸCnrgŸy Ÿw"ŸNÞž{žRŸq1ŸHÞ ž}žLŸ2`Ÿ0tŸžGŸ- ²BŸc Ÿ(Þ>Þ=Þ<žyŠ:ž;Ÿ!ž9ŸüŸ/ž5OS:: SYSžŠž"ªªiüþŒþ‹Âwþ‹þŠÂvc Bc A@6<# þIc B# ÞgIþjHÀc r‡Ÿc ·œ‡›Þš# @0‚X†ß)P ®VÂVЀЀÎSQº®PŠ‹pI þN@6ž‚IÄ> p „‚c P`à@# 8 INCH DRIVE BANK ([Y] OR N)=  @iiL C @¢K0( 0( o) Rp& ÿBP Hü)A„€+Tœ ‡Ž‡Ž P P`€@ ‚ˆ„Bƒ‡„A‚-°@ž„ONÛø ÿ2 P P`€@ ‚‚°@ž‚CI ÿ«y ,žp žº‡h /ž© ^ž§ _ž¥ #ž£ 0ž 3žžŒ ÑÃY Mž‚ž†)A B„€KÇPžSP  P`€@ ‚V„A °@ž„t ÿŒž'P P`€@ ‚E„A °@ž‚t ÿ}ƒ. #žƒ žžŒü‡(¢®IA €€@(„€@(+Kßžx pƒ„‚c  P`à@# DRIVE NUMBERS TO TEST - SEPARATED BY COM MAS ([0,1],2,3)=:(iiú C @¢¡0( 0( o) Rp& ÿ˜P IǑǑ)EĀāP P `€@ ‚Š„Bƒ‰„A‚ˆ°@ž‡NO1Ptœ± COÿ‹ P P`€@ ‚‚°@žƒCIt ÿµy žÆ‡g /žµ ^ž³ _ž± #ž¯ -ž— ,ž• 0ž˜ 9žž” Ð)EÃQC À€ @N!@"@"@)EƒH  ĀžMƒDà ‡AžHP P`€@ ‚K„A °@ž„t ÿŒžP P`€@ ‚:„A °@ž‚t ÿ}ƒ! #žŽ žŒ)EƒAž‚€€ „€€ÀFžŸ§ž‰¢ŠIE€€@(„€ @(€@(„ pƒ„‚c P`à@#  RANGE OF TRACKS TO TEST  OVER ([73-76])= * ,iiŽ C @¢¡0( 0( o) Rp& ÿ˜P IǑǑ)GĀāP P `€@ ‚Š„Bƒ‰„A‚ˆ°@ž‡NO1PtVk COÿ‹ P P`€@ ‚‚°@žƒCIt ÿµy žÆ‡g /žµ ^ž³ _ž± #ž¯ ,ž— -ž•  0ž˜ 9žž” Ð)GÃQC À€ @N!@"@"@)GƒH  ĀžMƒDà ‡AžHP P`€@ ‚K„A °@ž„t ÿŒžP P`€@ ‚:„A °@ž‚t ÿ}ƒ! #žŽ žŒ)GƒAž‚€€ „€€ÀFžŸ§ž‰¢ŠIG€€@(„€ @(€@(„ pƒ„‚c P`à@#  RANGE OF SECTORS TO TEST OVER ([1-26])= *Ã.iin C @¢™0( 0( o) Rp& ÿP P P`€@ ‚‰„B‚Æ„A‚„°@ž…1PtCOº ÿˆP P`€@ °@ž‚t ÿ² /ž— ^ž• _ž“ #ž‘ ž 0ž… 1ž† 2ž‡žQIÇ ž…Iǝ ž‚Iǚ p„‚c P`à@# HEAD S TO TEST ([0], 1, OR 2=BOTH)=$ IiiÏ C @¢80( 0( o) Rp& ÿ/P P P`€@ ‚†„B‚®„A‚#°@ž‚ ÿ*P P`€@ °@žÿž Yž…S£QÅIǙž‚Iǖ p„‚c  P`à@# DOUBLE DENSITY ([Y] OR N)= @Jii C @¢™0( 0( o) Rp& ÿP P P`€@ ‚‰„B‚µ„A‚„°@ž…1PtCOQ ÿˆP P`€@ °@ž‚t ÿ¡S¡ #žƒ žÇœ p„‚c P` à@# DATA PATTERN TO US E - IN HEX ([C6])=: ( sLiih C @¢I0( 0( o) Rp& ÿ@P P P`€@ ‚†„B‚µ„A‚4°@ž‚ ÿ;P P`€@ °@žÿU S¥ #žƒ žÇŸ p„‚c P`à@#  DEVICE ADDR OF BOARD T O TEST - IN HEX ([30])=:0Mii· C @¢™0( 0( o) Rp& ÿP P P`€@ ‚‰„B‚ž„A‚„°@ž…1PtCOó ÿˆP P`€@ °@ž‚t ÿ€ Yž…SŸQÅIÄ=ž‚IÄ= p „‚c P`à@# TEST INTERRU PTS FROM UFDC ([Y] OR N)= ( @ii  C @¢G0( 0( o) Rp& ÿ>P P P`€@ ‚†„B‚¶„A‚2°@ž‚ A ÿ9P P`€@ °@žÿV Yž…S£QÅIÄ?ž‚IÄ? p„‚c  P`à@# INVERT STEP DIRE CTION POLARITY ([Y] OR N)=,ii X C @¢™0( 0( o) Rp& ÿP P P`€@ ‚‰„B‚Á„A‚„°@ž…1PtCO ” ÿˆP P`€@ °@ž‚t ÿ­S¡M žž^ #žƒ žÇ¥ p „‚c P`à@# TRACK TO TRA CK STEP RATE TIME - IN M ILLISECONDS (:[6])=:: s@ii Ž C @¢=0( 0( o) Rp& ÿ4P P P`€@ ‚†„B‚Å„A‚(°@ž‚ ü ÿ/P P`€@ °@žþ· /ž— ^ž• _ž“ #ž‘ ž 8ž… 6ž† 2ž‡žUIÇ¢ž…Iǟž‚I ǜ p„‚c P`à@# SECTOR S IZE - IN BYTES (128,[256],512)= *Kii  C @¢—0( 0( o) Rp& ÿŽP I P P`€@ ‚„°@ž„1Pt CIÿŒy ž‚@žl@ p„‚c P`à@# tii @ C @¢k0( 0( o) Rp& ÿbP P P`€@ °@ž þ; /ž ^žŽ _žŒ #žŠ žˆ Y ž† Nž‚HÿžƒIžI p„‚ăc P`à@# ii s C @¢80( 0( o) Rp& ÿ/P INJ P P`€@  ‚$°@ž‚Oÿ.y žŒ‡y /žª ^žš _žŠ #ž€ 0ž 9žž‚ О‡ Ažˆ Fžž„ ÉN1@žU P P`€@ ‚„„A °@ž„CI ÿHÿžP P`€@ ‚r„A  °@žƒt ÿ|ƒ= p„‚ăc P`à@# ÿÿ[256],512)= *Kii  C @¢—0( 0( o) Rp& ÿŽP I P P`€@ ‚„°@JBUFCON BUFALT FDC:K: JFDC:J: BUFINCR FDC:I: JBUFCOMP INPUT OUTPUT JFDC:H: FORMAT FDC:F: JSCAN SEEK BUFUSER JFDC:E: FDC:D: FDC:C: JFDC:B: RECAL FDC:A: JFMT FDC:1: FDC:K JFDC:J FDC:I FDC:H JFDC:F FDC:E FDC:D JFDC:C FDC:B FDC:A JFDC:1 FDC:0 FDC:0: JDUMP FAULT O0SEGMENTBLANK ROM OTESTENTRo Š0KPRTHEX O:MSG UFDC KSYSERR im MACRO (F100) ig% C @ÝQAžÃÁžÄÀ!K@üÄ!€  Ÿ6Âߑ6ð`pP P`€@ €ƒ„B€„„A‚ƒ°@ž…WCO ÿ“€ ß6Áþ­Ï6ÖP P` €@ ‚‡„B‚Œ„A‚j°@ž„t@ ÿ{žƒ€ ¯6Á ƒY Ic # c p܀# c p܀# g$ C @P P`€@ ‚†„B‚„A‚=°@ž‚k ÿPž† ST0= £€‹„W P P`€@ €—„A‚%°@ž‚Y ÿP P`€@ ‚‡„ B‚„A‚°@žƒt” ÿ'ž… ST1=£e€Œ„WP P`€@ €—„A‚‚°@ž‚CO ÿeP P`€@ ‚†„B‚Œ„A‚r°@ž‚» ÿž… ST2=£>€„WP P`€@ €—„A‚[°@žÿ? P P`€@ ‚†„B‚„A‚L°@ž‚âÿž†t ERR=£€–„WP P` €@ €—„A‚4°@žÿP P `€@ ‚†„B‚„A‚%°@ž‚ ÿZž† UNIT= £€‹ „WP P`€@ €—„A‚ °@ ž‚YÿP P`€@ ‚ˆ„B‚„A‚ƒ°@ž„tCO4 ÿ.ž† HEAD= £c€‹ „WP P`€@ €—„A‚f °@žÿaP P`€@ ‚†„B‚Š„A‚W°@ž‚^ ÿžƒ £<€–ÿÁŸÿ ðž²P P`€@ ‚ˆ„B‚§„A‚;°@ž…÷Œ~ÿžt PROPER RESPONSE NOT D ETECTED FROM BOARD - TIM EOUT 4Ÿ ñž­P P`€@ ‚‡„B‚¢„A‚°@ž„¥° ÿNž™ NO INTERRUPT  FROM BOARD WITHIN ALLOTE D TIME .Ÿ`P P`€@ ‚‡„B‚£„A‚‚°@žƒCOÜ ÿ"ž› UNKNOWN ERROR C ODE RETURNED FROM ACCESS MANAGER 2Ÿ2£”€‹Àv € žþ @žÚP P`€@ ‚‡„B‚Š„A‚L°@ž…Yÿžœt ABNORMAL TERMINATION  - READY LINE CHANGED STA TE 2ÿŽžôP P`€@ ‚ˆ„B‚œ„A‚°@ž„Œ¥E ÿPž“ MISCELLANEOUS O R UNKNOWN ERROR "ÿžÌ P P`€@ ‚ˆ„B‚—„A‚‚°@ž„CO•m ÿ(žŽ ABNORMAL TERMIN ATION žªP P`€@ ‚†„B‚Ÿ„A‚`°@ž‚ ÿž˜ IC - INVALID CO MMAND WAS SENT TO FDC CH IP ,ÿ£‘€‹_6Až¹P P `€@ ‚‡„B‚“„A‚1°@ž„Y¿ÿžŠt SE - SEEK ENDP P `€@ ‚†„B‚‘„A‚°@ž‚Ù ÿfžŠ (FATAL ERROR)  ÿ’£S€‹O6AžœP P`€@ ‚ˆ„B‚—„A‚ƒ°@ž…ŒCOý ÿBž EC - EQUIPMEN T CHECK P P`€@ ‚†„B‚‘„A‚b°@ž‚ ÿ$žŠ (FATAL ERROR)  ÿP£€‹?6AžŒP P`€@ ‚†„B‚•„A‚A°@žƒ= ÿž NR - DRIVE NO T READY P P`€@ ‚†„B‚’„A‚"°@ž‚\ÿž‹t (FATAL ERROR) ÿ£‘ €Œ6AžœP P`€@ ‚ˆ„B‚—„A‚ƒ°@ž…YCO€ ÿ\ž EN - END-OF-C YLINDER P P`€@ ‚†„B‚‘„A‚b°@ž‚ž ÿ>žŠ (FATAL ERROR)  ÿ’£O€Œo6AžÅP P`€@ ‚‡„B‚ž„A‚A°@ž„ŒÁ ÿž• BIT 6 IS HIGH - SHOULD ALWAYS BE LOW  &P P`€@ ‚†„B‚’„A‚°@ž‚èÿž‹t (FATAL ERROR) ÿH£ €Œ_6AžÃP P`€@ ‚‡„B‚„A‚‚°@ž„CO  ÿ]ž” DE - CRC ERRO R (ERROR IN DISK READ)$ P P`€@ ‚†„B‚‘„A‚[°@ž‚0 ÿ8žŠ (SOFT ERROR)  ÿ“£‘€ŒO6AžÌP P`€@ ‚ˆ„B‚¥„A‚:°@ž…Y•T ÿž› OR - OVER-RUN ERROR OR DMA INTO UN-IN STALLED RAM 2P P`€@ ‚†„B‚’„A‚ °@ž‚ÿž‹t (FATAL ERROR) ÿ’£@ €Œ?6AžÅP P`€@ ‚ˆ„B‚Ÿ„A‚ƒ°@ž…ŒCO¥ ÿ\ž• BIT 3 IS HIGH - SHOULD ALWAYS BE LOW  &P P`€@ ‚†„B‚‘„A‚Z°@ž‚Ë ÿ6žŠ (FATAL ERROR)  ÿH£‘€Œ/6AžÂP P`€@ ‚‡„B‚›„A‚9°@ž„Yî ÿž’ ND - CANNOT F IND DESIRED SECTOR P  P`€@ ‚†„B‚’„A‚°@ž‚ÿž‹t (SOFT ERROR) ÿ’£J €Œ6AžÁP P`€@ ‚ˆ„B‚›„A‚ƒ°@ž…•CO6 ÿ\ž‘ NW - DRIVE IS WRITE PROTECTEDP P `€@ ‚†„B‚‘„A‚^°@ž‚X ÿ:žŠ (FATAL ERROR)  ÿ’£€Œ6Až¿P P`€@ ‚‡„B‚˜„A‚=°@ž„Œ{ ÿž MA - MISSING  ADDRESS MARKP P`€@ ‚†„B‚’„A‚°@ž‚œÿž‹t (SOFT ERROR) ÿ£‘ €6AžÅP P`€@ ‚ˆ„B‚Ÿ„A‚ƒ°@ž…YCOÀ ÿ\ž• BIT 7 IS HIGH - SHOULD ALWAYS BE LOW  &P P`€@ ‚†„B‚‘„A‚Z°@ž‚æ ÿ6žŠ (FATAL ERROR)  ÿ£G€o6AžÄP P`€@  ‚†„B‚„A‚9°@žƒ ÿž• CM - DELETED  DATA ADDRESS MARK FOUND  &P P`€@ ‚†„B‚’„A‚°@ž‚/ÿž‹t  (SOFT ERROR) ÿ’£’ €_6AžÄP P`€@ ‚‰„B‚ž„A‚„°@ž†•YCOT ÿ[ž“ DD - CRC ERRO R WAS IN DATA FIELD "P P`€@ ‚†„B‚‘„A‚\°@ž‚x ÿ7žŠ (SOFT ERROR)  ÿI£I€O6AžÄP P`€@ ‚†„B‚„A‚;°@žƒš ÿž• WC - WRONG CY LINDER NUMBER WAS FOUND  &P P`€@ ‚†„B‚’„A‚°@ž‚Áÿž‹t (SOFT ERROR) ÿ£‘ €?6AžÈP P`€@ ‚ˆ„B‚¢„A‚ƒ°@ž…YCOå ÿ\ž˜ SH - SCAN EQU AL COMMAND FOUND DATA MA TCH OK,P P`€@ ‚†„B‚‘„A‚W°@ž‚ ÿ3žŠ (SOFT ERROR)  ÿ’£D€/6AžÇP P`€@ ‚‡„B‚ „A‚6°@ž„•1 ÿž— SN - SCAN COM MAND DATA PATTERN NOT FO UND *P P`€@ ‚†„B‚’„A‚ °@ž‚Zÿž‹t (SOFT ERROR) ÿF£‘ €6AžÂP P`€@ ‚ˆ„B‚œ„A‚ƒ°@ž…YCO~ ÿ\ž’ BC - BAD CYLI NDER FLAG WAS READ P  P`€@ ‚†„B‚‘„A‚]°@ž‚¡ ÿ9žŠ (FATAL ERROR)  ÿ’£J€6AžÁP P`€@ ‚‡„B‚š„A‚<°@ž„ŒÄ ÿž‘ MD - CANNOT F IND ADDRESS MARKP P `€@ ‚†„B‚’„A‚°@ž‚çÿž‹t (SOFT ERROR) ÿ“£ €• òÁŸP P`€@ ‚‰„B‚”„A‚‚°@ž…CO•   ÿ\žŠ COMMAND CYL = ƒŒ„WP P`€@ €—„A‚d °@ž‚OÿP P`€@ ‚‡„B‚’„A‚T°@žƒt7 ÿ0žŠ RESULT CYL =  £€Ž„WP P`€@ €—„A ‚7°@ž‚Yÿ`P P`€@ ‚†„B‚‘„A‚'°@ž‚c ÿžŠ COMMAND HEAD= £a€„WP P`€@ €—„A ‚ °@žÿ5P P`€@ ‚‡„B‚“„A‚‚°@žƒCOÿž‹t RESULT HEAD= £4€ „WP P`€@ €—„A‚d°@ž ÿP P`€@ ‚†„B‚‘„A‚U°@ž‚» ÿUžŠ COMMAND SEC = £ €‚„WP P`€@ €—„A ‚9°@žÿP P`€@ ‚‡„B‚’„A‚*°@žƒtç ÿ)žŠ RESULT SEC =  £€„WP P`€@ €—„A ‚ °@ž‚Yÿ`žÙP P`€@ ‚‡„B‚”„A‚‚°@ž„CO ÿž‹t DESIRED CYL =ƒŒ„W P P`€@ €—„A‚d°@ž‚O ÿ1P P`€@ ‚†„B‚‘„A‚T°@ž‚ B ÿUžŠ PRESENT CYL = £2€“„WP P`€@ €—„A ‚8°@žÿP P`€@ ‚†„B‚Š„A‚)°@ž‚ m ÿ*žƒ €#ý„#c # ig#ÿ‚`Pž}d tÿÿii tg" C @¢—0( 0( o) Rp& ÿŽP „"„#P P`€@ °@žƒ1Pt ÿžAŸš)2Hõ€€ÁŸ– Ÿ Š Ž À Ì Ø ä ä ð ü  P P`€@ °@ž„ $ * ÿ‰žìP P`€@ °@ž‚  ÿ‰žàP P`€@ °@ž‚  ÿ‰žÔP P`€@ °@ž‚ Å ÿ‰žÈP P`€@ °@ž‚ ÿ‰žŒP P`€@ °@ž‚ƒ ÿ‰ž°P P`€@ °@ž‚³ ÿ‰ž€P P`€@ °@ž‚µ ÿ‰ž˜P P`€@ °@ž‚ ÿ‰žŒP P`€@ °@ž‚a ÿ‰ž€+TÁžŸ…c P`à@# × –igÿ‚`Pž}d *ÿÿii *g! C @¢Š0( 0( o) Rp& ÿP  ‡˜‡ â‘ç” Ԃ”L €L‚‘‡‘P P`€@ °@žŠ[1Pt WYKPÿ‡f†)6ÿ‚Ÿ„ž¡ó i  TEST INIT - INVALI D SECTOR SIZE/DENSITY CO MBINATION ‡°NyǯâJƒ®„T  „U À=QF ?…ÅÕ À>QB LÀ?QA,„[ÚQGJÿ6ÅN  6ÃKQÁIXWÄ` „a „bÿŠ €V‰)*ÿ0ž žQRM@t œ TEST INIT - TIMER  SPECIFY COMMAND FAILEDI ü‡¢)A€€E ÿ1 @ +ߘ žvõ‡•)2€€G žƒ žž‚@  @+߉žt@”XE†)0ÿƒŸ„žžN ý = TEST INIT - ALL RE QUESTED UNITS ARE NOT READY p„‚c P`à@# igÿ‚`Pž}d ÿÿii g  C @¢¯0( 0( o) Rp& ÿŠP ‡K)AƒI €€AžŸœ ÿ‡• ‡”ƒ“×Lžƒ@ žŸ“‚“  ‡ŠP P`€@ °@žŠ SVW1Pt I ÿÿ…Â…)&ÿ žiž—4 ^ TEST A - RECALIBRA TE COMMAND FAILED )E€€‡– ‚˜ ‡S╠„UƒN„AƒK„\ ƒ‰„Jÿˆçˆ€VŠ)ÿ…žpž˜OtY[ “ TEST A - SEEK COMM AND FAILED‚ ‡& „Uÿb çb€KÀqŽV…)0ÿ\žtžœ · TEST A - SENSE INT ERRUPT STATUS COMMAND FA ILED6e€S›8„)6ÿ8ž#žž Ú TEST A - CYLINDER  NUMBER MISMATCH ON S.I.S . COMMAND ƒ)Ežž‚žƒß Ÿ“ƒ žƒßŸƒ žƒ ߊŸ‰c P`à@# V t 7N ,i gÿ‚`Pž}d ÿÿii g C @¢¥0( 0( o) Rp& ÿœP ‡jƒi×Lžƒ@ žŸ“ ‚“ ‡Š ‡‰P P`€@ °@žˆWS1PtI ·ÿ…†).ÿƒžižœ4 N TEST B - RECALIBRA TE COMMAND FAILED - UNIT 0 ‡UP P`€@ °@žÿX„).ÿVž<žš y TEST B - RECALIBRA TE COMMAND FAILED - UNIT 1)E€€‡–‚™ ‡#①„U ƒ„A „\ƒ‰„JÿŠçŠ€VŠ)(ÿ#žpžO[VtY ² TEST B - SEEK COMM AND FAILED - UNIT 0 ‚› ‡•€[┄[ƒ•„T „UƒY„A  „\ƒS„JÿTçT€V‰)(ÿ„žlžœW›M ç TEST B - SEEK COMM AND FAILED - UNIT 1 ‚‘ ‡`â* „Uÿ)ç)€KÀqŽV…)2ÿVžsž  TEST B - SENSE INT ERRUPT STATUS FAILED - U NIT 0 6h€S›…Â…):ÿ1žNž¡O 6 TEST B - CYL NUMBE R MISMATCH ON S.I.S. COM MAND - UNIT 0 ‚’ ‡â „UÿŒçŒ€KÀqŽVˆ)2ÿ‚žsž tY l TEST B - SENSE INT ERRUPT STATUS FAILED - U NIT 1 6g€S›*„):ÿZžKž   TEST B - CYL NUMBE R MISMATCH ON S.I.S. COM MAND - UNIT 1 ƒ)Ežž‚ žƒßŸƒŠ žƒß‡Ÿ‡c P`à@# OV “ &igÿ‚`Pž}d Åÿÿii Åg C @¢®0( 0( o) Rp& ÿ¥P ‡¢)Aƒ  €€AžŸœ ÿ‡• ‡aƒ`×Lžƒ@ žŸ“‚“  ‡‰P P`€@ °@žŠSW1PtNIûÿ†Â†)ÿ‚žiž“4  TEST C - RECALIBRA TE ERROR)E€€‡'‚– ‡V ⓠ„Uƒ„AƒO„\ƒ„Jÿ‡ç‡€Vˆ)ÿVžpž–tY[7 TEST C - SEEK COMM AND FAILED‚ ‡+ „Uÿc çc€KÀqŽV…)0ÿ/žtžœ[ TEST C - SENSE INT ERRUPT STATUS COMMAND FA ILED6f€S›…Â…)6ÿ žPžŸO  TEST C - CYLINDER  NUMBER MISMATCH ON S.I.S . COMMAND ‚𠇓 „Uƒ• „^ƒ„AƒŽ„\ÿ ç €KÀqŽVŠ)"ÿ…žnžšWVSJº TEST C - READ ID C OMMAND FAILED 6e€N›-„)6ÿcžLžžÖ TEST C - CYLINDER  NUMBER MISMATCH ON READ  ID COMMANDƒ )Ežž‚žƒß Ÿ’ƒ6 žƒß3ŸŒƒŒ žƒ߉Ÿˆc P`à@#  áN Öigÿ‚`Pž}dÿÿiig C @¢£0( 0( o) Rp& ÿšP ‡ƒÕLžƒ@ žŸ‘ ‚‘ ‡ ‡P P`€@ °@ž†1PtIuÿ…†).ÿƒžkžœ4G TEST D - RECALIBRA TE COMMAND FAILED - UNIT 0 ‡ˆP P`€@ °@ž‚SÿW„).ÿUž=žšs TEST D - RECALIBRA TE COMMAND FAILED - UNIT 1)E€€‡–‚š ‡’â’ „U ƒ„A „\ƒ‰„Jÿ‹ç‹€V‹)(ÿ"žpžžOW[VtY­ TEST D - SEEK COMM AND FAILED - UNIT 0 ‚š ‡_€[Ⓞ[ƒ”„T „UƒY„A  „\ƒR„JÿTçT€Vˆ)(ÿƒžlž››Má TEST D - SEEK COMM AND FAILED - UNIT 1 ‚‘ ‡+â+ „Uÿ*ç*€KÀqŽV…):ÿVžsž¡  TEST D - SENSE INT ERRUPT STATUS COMMAND FA ILED - UNIT 0 6h€S›…Â…):ÿ-žJž¡O4 TEST D - CYL NUMBE R MISMATCH ON S.I.S. COM MAND - UNIT 0 ‚• ‡Žâ „Uÿ‹ç‹€KÀqŽV‰):ÿ…žsž¥WtYk TEST D - SENSE INT ERRUPT STATUS COMMAND FA ILED -  UNIT 1 6g€S›%„):ÿXžFž “ TEST D - CYL NUMBE R MISMATCH ON S.I.S. COM MAND - UNIT 1 ‚™ ‡/â– „Uƒ„^ƒ„A „\ÿ&ç&€KÀ qŽVˆ)*ÿ žmžœJV[Ï TEST D - READ ID C OMMAND FAILED - UNIT 06i€N›…†):ÿƒžIž¢Oñ  TEST D - CYL NUMBE R MISMATCH ON READ ID CO MMAND - UNIT 0‚— ‡•â• „Uƒ2„^ƒ1„A „\ÿç€KÀ qŽV‰)*ÿIžmžW›tY. TEST D - READ ID C OMMAND FAILED - UNIT 16g€N›&„):ÿ$žHž N TEST D - CYL NUMBE R MISMATCH ON READ ID CO MMAND - UNIT 1ƒ)Ežž‚ žƒßŸƒŠ žƒß‡Ÿ‡c P`à@# OV!igÿ‚`Pž}dƒÿÿiiƒg C @¢”0( 0( o) Rp& ÿ‹P P P`€@ °@žƒ1Pt ÿ¢ ‡¡)AƒŸ €€AžŸ› ÿ ‡š ‡UƒTÑLžƒ@ žŸ’‚’ ‡‰P P`€@ °@ž‰IW›N£Sÿ†Â†)&ÿ‚žjž˜4Ò TEST E - RECALIBRA TE COMMAND FAILED )E€€‡ ‚‹ ‡RP P`€@ °@ ž‚ÿ…Â…)ÿRžqž“_ TEST E - SEEK COMM AND FAILED)G€€‡‘ƒ) žµ ‚ ‡$P P`€@ °@ ž„Tÿ…Â…)2ÿ!žnž2 TEST D - SINGLE SE CTOR SCAN EQUAL COMMAND  FAILEDžŒƒ“Až¹ƒT»ž¶‚Ž  ‡ŒP P`€@ °@ž† VQWÿG…)0ÿ‚žlžœp TEST E - TWO SECTO R SCAN EQUAL COMMAND FAI LED ƒ)Gžž‚žƒßž ƒ›)Ežž‚žƒß•Ÿ”ƒB žƒß?ŸŽƒŠ žƒß‡Ÿ‰c P`à@# NOè« ig ÿ‚`Pž}d³ÿÿii³g C @¢•0( 0( o) Rp& ÿŒP P P`€@ °@žƒ1Ptÿ‡d†)2ÿŸžž¬óÚ TEST F - INVALID D ENSITY/SECTOR SIZE COMBI NATIONŸa„AXÿÄB ‡5)Aƒ3  €€AžŸ˜ ÿ‡— ‡–ƒ•ÕLžƒ @ žŸ‘‚‘ ‡ˆP P`€@ °@žˆWŠSVI ÿ†Â†)&ÿ‚žkž˜4* TEST F - RECALIBRA TE COMMAND FAILED )E€€‡ ‚Œ ‡RP P`€@ °@ žƒOÿ…Â…)ÿQžpž“_Z TEST F - SEEK COMM AND FAILED‚ ‡*P P `€@ €‚„B€„A °@ž‚ÿ…Â…) ÿ%žlž”͆ TEST F - FORMAT CO MMAND FAILEDƒ6)Ežž‚žƒ ß0ž!ƒ žƒßŸƒ‹  žƒßˆŸˆc P`à@# VNùi g ÿ‚`Pž}dµÿÿiiµg C @¢”0( 0( o) Rp& ÿ‹P P P`€@ °@žƒ1Pt ÿ¡ ‡`)Aƒ^ €€AžŸ™ ÿ ‡˜ ‡TƒSÕLžƒ@ žŸ‘‚‘ ‡ˆP P`€@ °@žˆW›õSIïÿ†Â†)&ÿ‚žkž˜4 TEST H - RECALIBRA TE COMMAND FAILED )E€€‡ ‚Œ ‡RP P`€@ °@ žƒOÿ…Â…)ÿQžpž“_3 TEST H - SEEK COMM AND FAILED)G€€‡Ž‚  ‡&P P`€@ €°@žƒTÿ…Â…)&ÿ$žož—` TEST H - WRITE SEC TOR COMMAND FAILEDƒ_)Gž ž‚žƒßYžI)G€€‡S‚‹  ‡‰P P`€@ °@žƒWÿ†Â†)&ÿ‚žpž˜T› TEST H - READ SECT OR COMMAND FAILED 6lP  P`€@ °@žÿ…Â…)0ÿYžGžœ7à TEST H - DATA BUFF ER DOES NOT MATCH DISK D ATA ƒ§)Gžž‚žƒß¡ž ƒš)Ežž‚žƒß”Ÿ–ƒ‘  žƒßŽŸƒŒ žƒß‰Ÿ‹c P`à@# OVNTÝÒi$gÿ‚`Pž}dÿÿiig C @¢•0( 0( o) Rp& ÿŒP P P`€@ B°@žƒ1Pt ÿ¡ ‡])Aƒ[ €€AžŸ™ ÿ ‡˜ ‡QƒPÕLžƒ@ žŸ‘‚‘ ‡ˆP P`€@ °@žˆWÙOSII ÿ†Â†)&ÿ‚žkž˜4V TEST I - RECALIBRA TE COMMAND FAILED )E€€‡ ‚‹ ‡RP P`€@ °@ ž‚ ÿ…Â…)ÿRžqž“_… TEST I - SEEK COMM AND FAILED)G€€‡Ž‚  ‡'P P`€@ B°@žƒT ÿ…Â…).ÿ%žož›² TEST I - PARTIAL S ECTOR WRITE COMMAND FAIL EDƒ[)Gžž‚ žƒßUžE)G €€‡O‚‹ ‡‰P P`€@ °@žƒ Wÿ†Â†).ÿ‚žpžœTñ TEST I - PARTIAL S ECTOR READ COMMAND FAILE D 6lP P`€@ °@žÿ…Â…)0ÿUžCžœ7 TEST I - DATA BUFF ER DOES NOT MATCH DISK D ATA ƒ§)Gžž‚žƒß¡ž ƒš)Ežž‚žƒß”Ÿ–ƒ‘  žƒßŽŸƒŒ žƒß‰Ÿ‹c P`à@# OVNTl0%i(gÿ‚`Pž}daÿÿiiag C @¢•0( 0( o) Rp& ÿŒP P P`€@ ް@žƒ1Pt ÿ¡ ‡])Aƒ[ €€AžŸ™ ÿ ‡˜ ‡QƒPÕLžƒ@ žŸ‘‚‘ ‡ˆP P`€@ °@žˆWÙÅSI¿ ÿ†Â†)&ÿ‚žkž˜4° TEST J - RECALIBRA TE COMMAND FAILED )E€€‡ ‚‹ ‡RP P`€@ °@ ž‚ ÿ…Â…)ÿRžqž“_ß TEST J - SEEK COMM AND FAILED)G€€‡• ‡”ß’ ƒ6ñ‚Ž ‡ P P` €@ ް@ž„TU ÿ…Â…),ÿžnžš TEST J - WRITE MUL TI SECTOR COMMAND FAILED ƒ[)Gžž‚žƒßUž@)G€€ ‡O ‡NßL‚‹ ‡‰P  P`€@ °@žƒ Wÿ†Â†),ÿ‚žpž›TV TEST J - MULTI SEC TOR READ COMMAND FAILED  6Ážœƒ6ÍP P`€@  °@ž‚ÿŠžP P`€@  °@žƒ7ÿ|„)0ÿCž1ž›“ TEST J - DATA BUFF ER DOES NOT MATCH DISK D ATA ƒ§)Gžž‚žƒß¡ž ƒš)Ežž‚žƒß”Ÿ–ƒ‘  žƒßŽŸƒŒ žƒß‰Ÿ‹c P`à@# OVNTÆŠi,gÿ‚`Pž}d×ÿÿii×g C @¢­0( 0( o) Rp& ÿ€P ‡j)Aƒh €€AžŸš ÿ‡™ ‡^ƒ]ÖLžƒ@ žŸ’‚’  ‡ˆP P`€@ °@ž‰W1PtŠSI„ ÿ†Â†)&ÿ‚žjž˜4 TEST K - RECALIBRA TE COMMAND FAILED )E€€‡  ‡‚Œ ‡OP P`€@ °@žƒW ÿ…Â…)ÿOžpž“_L TEST K - SEEK COMM AND FAILEDP P`€@ °@ žÿ’)G€€‡Ž‚Ž ‡P P`€@ €°@ž„T  ÿ…Â…)&ÿžnž—„ TEST K - WRITE SEC TOR COMMAND FAILEDƒ^)Gž ž‚žƒßXžHƒ•)Ežž‚ žƒßž‚ ‡‰P P `€@ °@ž„OWÿ†Â†)&ÿ‚žož˜4Æ TEST K - RECALIBRA TE COMMAND FAILED )E€€‡[ ‡‚Œ ‡UP P`€@ °@žƒWÿ…Â…)ÿOžpž“_ø TEST K - SEEK COMM AND FAILEDP P`€@ °@ žÿ‘)G€€‡‚ ‡P P`€@ °@ž„T  ÿ…Â…)&ÿžož—T/ TEST K - READ SECT OR COMMAND FAILED 6mP  P`€@ °@žÿ……)0ÿ„žGž7X TEST K - DATA BUFF ER DOES NOT MATCH DISK D ATA ƒ0)Gžž‚žƒß*ž ƒš)Ežž‚žƒß”Ÿ“ƒ’  žƒßŸŽƒŽ žƒß‹ŸŠc P`à@# OÞVóNèii›g C @¢š0( 0( o) Rp& ÿ‘P ƒq·ŽÃŒN @A)W„€+Tœc P`à@# 1PtPLiiŒg C @¢y0( 0( o) Rp& ÿpP @qGÃkN @A)W„€+Tœc P`à@# iiÙg C @¢\0( 0( o) Rp& ÿSP ÃP@A)W„€+Tœ pÀ‚ ƒ• N  N @A)W„€ ÿ ž‚Љž +Tžc P`à@# Kii g C @¢,0( 0( o) Rp& ÿ#P ƒŠMP P`€@  °@ž‚WþžŒP P`€@  ÿ°@ž‚þ c P`à@# ii7g C @¢°0( 0( o) Rp& ÿ§P Ã¥N )WA Bâ¡@A€€˜@ Ê+kTº p„‚c P`à@# C  @P P`€@ ‚‹„B‚„A‚‚°@ž‡CO1PtPWtÿž‘t *** DATA WRITTEN TO  DISK (c C @ ž‚€€ž‚€€ yÿ„WP P`€@ €—„A ‚Q°@žÿP P`€@ ‚‡„B‚˜„A‚B°@žƒt¯ ÿEž) DOES NOT MATCH DATA READ (c ž‚€@ž‚ €@yÿ„WP P`€@ €— „A‚°@žÿTP P`€@ ‚†„B‚„A‚ °@ž‚ç ÿ ž†) DURING  p„‚c P`à@# iióg C @¢ž0( 0( o) Rp& ÿ¯P ƒ­¢¬ž¢«ƒ« €>  €€À p„‚Ä ƒc P`à@#  **::ÿÿ ÿÿÿÿÿÿ66T T1PtJ"Kii4g C @¢w0( 0( o) Rp& ÿnP ◠„U „Aƒ“„\ÿ’€V Ç „Uÿ€KÀqŽV p„‚ç‡c P`à@# [StYii_g  C @¢L0( 0( o) Rp& ÿCP âl „Uƒ™„Aƒh„\ƒ–„J ÿe€VÊ „Uÿ`€KÀqŽV€S ›ˆ p„‚çWc P`à@# VOiig  C @¢0( 0( o) Rp& ÿP â> „U W„Y p€‚„]ç A@BÄZƒ„^ „_ƒ^„Aƒ-„\ƒ[ „@ƒ•„Bƒ”„Cƒ“„Dƒ’„E „Iÿ  €KÀqŽV p„‚çc P`à@# TKQRPiiÍg  C @¢Ÿ0( 0( o) Rp& ÿµP I)WKƒ,q·)„€@q ·c„+øAžt `⣠„U W„Y €„Zƒ„Aƒš„\ƒP„C€„G€‚ „Eƒ–„Hƒ‘„^ÿ€KÀqŽV p„‚çŠc P`à@# 1Pt[SJtYLiig C @¢u0( 0( o) Rp& ÿlP @âi „U W„Y@ÃÄC QDLL„Zƒ]„^ „]ƒ™„A ƒV„\ƒ–„@ƒ „Bƒ „Dƒ„E €„F ÿL€KÀqŽV p„‚çFc P`à@# VOiiTg C @¢70( 0( o) Rp& ÿ.P â, „U‚¹„Yƒž„Zƒ'„^ ƒµ„C „] „_ƒ_„Aƒ„\ƒ\„@ ƒª„Bƒ©„Dƒš„E €„Fÿ€KÀq ŽV p„‚ç c P`à@# C @€"  Á ÿ„"c # C @€#Å Á ÿ ü„#c # WPKTQRÿÿ o) Rp& ÿµP I)WKƒ,q·)„€@q ·c„+øAžt `⣠„U W„Y €„Zƒ„Aƒš„\ƒP„C€„G€‚ „Eƒ–„Hƒ‘„^ÿ€KÀqŽV p„‚çŠc P`à@# 1Pt[SJtYLiig C @¢u0( 0( o) Rp& ÿlP @âi „U W„Y@ÃÄC QDLL„Zƒ]„^ „]ƒ™„A ƒV„\ƒ–„@ƒ „Bƒ „Dƒ„E €„F ÿL€KÀqŽV p„‚çFc P`à@# VOiiTg C @¢70( 0( o) Rp& ÿ.P â, „U‚¹„Yƒž„Zƒ'„^ ƒµ„C „] „_ƒ_„Aƒ„\ƒ\„@ ƒª„Bƒ©„Dƒš„E €„Fÿ€KÀq ŽV p„‚ç c P`à@# C @€"  Á ÿ„"c # C @€#Å Á ÿ ü„#c # WPKTJUFDC O0SEGMENTBLANK ROM o  im MACRO (F100) ig C @ „K„L„M„R„N„O„P„Q€U Ÿ€ 'hƒ˜šŸÓé0;IWi ÀTC AÄXIÄVc # ÀT C  ¿ „X€[6â±C $C  ýÿšQä(ü‚©ÿ¥Qàÿ§QÞ €ž‹„V ÿ¢QـV1ÀX @ ÄX4®‚™ÿ“ Q΀`1 a8'ÿŒQƀbÿ‡QÁIÄVc # ›ûê»Ø ÿ“ÿ“¶—ÿvQÌÿÿtQÉÿŽQǀF ÿoQÊÿjQÁÿˆÄVc # ÐÄœ†ýš‘ ÿxÿx¶‘ÿ[QÌÿuÿYQÉÿsQǀF ÿTQĂoÿOQÁÿmÄVc #  ÿd@ ¶ŒÿFQÇÿ`ÿDQĂ_ÿ?QÁÿ]ÄVc  #  ÿSÿS`¶‘ÿ5QÌÿOÿ3QÉÿM QǀFÿ.QÄ‚Iÿ)QÁÿGÄVc #  ÿ=ÿ=ÀÿQÌÿ9ÿQÉÿ7QǀF ÿQĂ3ÿQÁÿ1ÄVc # ÿ(ÿ(À  ÿ QÌÿ$ÿQÉÿ"QǀFÿQĂÿ…QÁÿÄVc # › ÿÿ¶“ÿQÌÿÿŽQÉÿ QǀIÿ‰QĂ ÿpQÁÿÄVc # ûê ÿ“ÿ“¶—ÿyQÌÿÿwQÉþýQǀI ÿrQÊÿYQÁÿˆÄVc # ÐÄœ†ýš‘ ÿxÿx¶‘ÿ^QÌÿuÿ\QÉþâQǀI ÿWQĂoþñQÁþåÄVc # ‚‰ÿK QÄÿbÿIQÁIÄVc # ‚Œÿ@QÇ þþÿ>QĀJÿ;QÁIÄVc # ‚Œ ÿ2QÆþðÿ0QÃÿ…QÁ„RÄVc # Ø ‚þÂQʂÿ!QÇþúQńKþ÷Q „SIÄVc # ú$þæþÙ@ ÿ QÓþÍþùQЀCþöQ̀GþóQʀEþð QǀHþíQĂþ›QÁþÄVc #  )# €@þàQÄ+,žžx# ) þÅQÆ# „K+,žžx# À[@6K ÀTC A@I6ÄHLT¿·Iñ#  Ç HLT¿œIñÅ # Å IpBI# ÿ€Ž €AÀ\XG# €]aÀ^X NQGÀ_XNAG# ÀT€YC €Z C # H8ÄWÀTC AXÐLО„ÜW žxIðž…ÀTC ÿI# H8ÄWÀT C AXÐLž„ÜWžxIðž„ÀTC  I# H8ÄWÀTC AXÐL€ž„ÜWžxIðž„ÀTC I# ÿÿc # ‚‰ÿK QÄÿbÿIQÁIÄVc # ‚Œÿ@QÇ þþÿ>QĀJÿ;QÁIÄVc # ‚Œ ÿ2QÆþðÿ0QÃÿ…QÁ„RÄVc # Ø ‚þÂQʂÿ!QÇþúQńKþ÷Q „SIÄVc # ú$þæþÙ@ ÿ QÓþÍþùQЀCþöQ̀GþóQʀEþð QǀHþíQĂþ›QÁþÄVc #  )# €@þàQÄ+,žžx# )MACRO HFT:UFDC.MAC(L=,NOO) MACRO HFT:UFDC:1(D=HFT:UFDC+HFT,L=), HFT:UFDC:2(D=HFT:UFDC+HFT,L=), HFT:UFDC:3(D=HFT:UFDC+HFT,L=) LINK THE SYSTEM? PAUSE DO HFT:FDC:LNK PRINT THE LISTING? PAUSE DO HFT:FDC:PRN  810817133116810817133116810817133116ìß“ðXïß"ÿ €‚ Ž  ž„ÿžÀCQEŸ˜¢™€‚„Džy „CŒÜŒ„ P P`€@ ‚‹„BƒŠ„A‚X°@žˆîvÁˆïÞïÛÁÔí§í¿ÿwP P`€@ °@žÿ“ÁŸ’ žV ŸhP P`€@ ‚ˆ„Bƒ‡„A‚2°@ž…ìãÁaíeíŒ3ÿT)IP P`€@ ‚‚°@ž‚CIÿ£ ž‚Iž€y /Ÿf žŸ ÐÍ ž‚ž‰@ @X '€ž] P P`€@ ‚^„A °@žƒîêÿ’ž7LI@ŒP P`€@ ‚ˆ„Bƒ‡„A‚‚°@ž…COì†íÀíÍÿP P`€@ °@žÿ$ÁŸ# ž_ @¬P P`€@ ‚†„Bƒ…„A‚_°@žƒíÎíÛ ÿˆP P`€@ °@ž‚îvÿÁžê ž` @œP P`€@ ‚†„Bƒ…„A‚=°@žƒíÜíìÿfP P`€@ °@žÿ“ žÉ ža @ÌP P`€@ ‚‡„Bƒ†„A‚°@ž…ìãííî ÿCP P`€@ °@žÿpg ž` @ÜP P`€@ ‚‡„Bƒ†„A‚‚°@ž„COîî/ÿ"P P`€@ °@žÿOF ža @ŒÄ ž§P P`€@ ‚‚°@žƒCIÿy@ žP P`€@ ‚q„A °@žƒîêÿ•LQŸ”LSIÄCŸ D1ÁŸŽP P`€@ „A‚7°@ž…ì†À>ÀÀ6*ÿa _ǑHüӏU… WT6<‡P P`€@ °@ž‚‘ü€À @¿6AžQP P`€@ ‚†„Bƒ…„A‚ °@žƒíšíŠ ÿŠ? HþEŸTœ Ÿ‚œîvÀÁÔ!C @¢0( 0( o) Rp&ÿ”P „E„DP P`€@ ‚‰„Bƒˆ„A‚‚°@ž†CO1PìÇí/íd6ÿX«IÄAÄBP P`€@ ‚‚°@ž‚CIÿ€ žƒIÄAž¥y -žÆ ž  0žƒ 9žž‰ I G*Ð@"ÄAž[P P`€@ ‚]„A °@ž„îêÿž2HÿÄBž×P P`€@ ‚I„A °@žƒì†ÂŽÿ|P P`€@ ‚†„Bƒ…„A‚"°@žƒíí™ÿŒÐIÄBP P`€@ ‚&°@ž‚îvEÿH ž’IÄBž£P P`€@ ‚„A °@ž‚ÿIž=y -ž[ ž 0žƒ 9žžf I G*Ð@"ÄBžLI¢™C €€PŒAÌ „EC € ÿž‚ŒBÄC €‚„Dž†Kžm€EAž Ÿƒc # ïÛÁæïßGURATION APPLICABLE FOR THE FOLLOWING BOARDS: ð5! #54124-00 - SCOUT UNIVERSAL FLOPPY DISK CONTROLLER (C2-D1) ïÛÿÿ«ðYŸ€»«C @¢“0( 0( o) Rp&ÿŠP ž…„ þm`Pž}Ÿ‚1PìÇÃU£ ILÆ0ÿÿ "'Æ0ÿÿ ILž²P P`€@ ‚‡„B‚Þ„A‚‚°@ž„COÑÿP P`€@ ‚‡„Bƒ†„A‚p°@ž„îvîî4Nÿ{P P`€@ ‚„„A °@ž‚CIÿ¿€ 6AžÕž°UNIVERSAL FLOPPY DISK CONTROLLER - PROGRAM REV (A0) FOLLOW TEST SPECIFICATION #58-54124-00^P P`€@ °@žƒÃåì†:ÿ¹ /žr ^žp _žn ž Rž” PžŠ Nž“ Sžˆ Qžˆ Mžˆ EŸ€¢€žŒ¢£žŠ¢¢žˆ¢¡ž†€2ÁŸ—¢žI2€€Æ@(„€@(+Kžx6ÁŸˆP P`€@ °@ž‰ÅGƱÅSÂáÂþÃ8ÃÂÄÇ©ÿ‘ /ŸŽ ^ž^ _žo #Ÿ5P P`€@ °@žƒÃÁËŽÿ /Ÿz ^ž] _žn #Ÿ!P P`€@ °@ž‚Ìÿ /Ÿg ^ž] _žo #ŸP P`€@ °@ž‚Ç÷ÿ‘ /ŸT ^ž^ _žo #ŸˆP P`€@ °@žƒÅGÈ¥ÿ /Ÿ@ ^ž] _žn #ŸtP P`€@ °@ž‚É_ÿ /Ÿ- ^ž] _žo #ŸaP P`€@ °@ž‚Êÿ /Ÿ ^ž^ _žo #ŸNP P`€@ °@ž‚Êzÿ /Ÿ ^ž^ _žo #žðP P`€@ °@ž‚Ì_ÿ‘ /ŸŽ ^ž^ _žo #žÝP   P`€@ °@žƒÃÁÊÃÿ™ /Ÿz ^ž] _žn #žÉžÈC @P P`€@ ‚ˆ„B‚ª„A‚‚°@ž„COËÅÿž¡îv: RECALIBRATE COMMAND FAILED AT THE END OF THE TEST - UNIT= <ƒŒ„WP P`€@ €—„A‚N°@ž‚SÿŠc žŠP P`€@ °@žƒì5ÿ•C @Hü ‡ƒŽ)A €€T ÿ‡cP P`€@ °@žƒNÖ÷"ÿ Ažƒy ‡wT§c ‡çs◠àTc ht¿ãk€"vP P`€@ ‚ˆ„B‚š„A‚°@ž„è·[Œ8ÿžŸ *** FATAL ERRORS OCCURED. REJECT BOARD OR DRIVES ***:c P`à@# €# ÿžžªP P`€@ ‚‡„B‚„A‚‚°@ž„COÅÍÿž‡îv# *** €#„WP P`€@ €—„A‚h°@žÿŽžP P`€@ ‚‡„B‚“„A‚X°@ž„ì5ÅöÿWžŠ *** OVER :FFP P`€@ ‚†„B‚•„A‚;°@ž‚Æ)ÿ<žŽ SOFT ERRORS OCCURED ***)E€Œ€  ž ž#žªP P`€@ ‚†„B‚›„A‚°@žƒÆ<)ÿž“ *** BOARD CAN BE ACCEPTED ***"c P`à@# P P`€@ ‚‡„B‚¥„A‚‚°@žƒCOÆfÿžîv) *** TOO MANY SOFT ERRORS OCCURED. REJECT BOARD,4P P`€@ ‚†„B‚¢„A‚S°@ž‚Ɠ"ÿSž› CHECK DISKETTES, OR ALIGN DISK DRIVES ***2c P`à@# ƱC @¢™0( 0( o) Rp&ÿP P P`€@ ‚ˆ„B‚»„A‚°@ž„1PìÇÆñ5ÿP P`€@ °@žÿ© Ež Rž‹ Sž‰ Qž‡ Mž… Pžƒ NžžU p„‚c P`à@# DEFAULT TEST GROUP (P,M,S,Q,R,N,E)= &ÌëÇ'C @¢D0( 0( o) Rp&ÿ;P Hõ)2„€+Tœ ‡Ž‡ŽP P`€@ ‚ˆ„Bƒ‡„A‚†°@ž…ONǖǧ COÿ‹ P P`€@ ‚‚°@žƒCIîv,ÿªy ,žo ž¹‡f /žš ^žŠ _ž€ #ž¢ Až Kžž‹ ÀÃWM ž‚ž…C „2KÇOžSP P`€@ ‚V„A °@ž„îêÿŒž&P P`€@ ‚E„A °@ž‚ì†-ÿ}ƒ- #žƒ žžŒõ‡'¢¢I2€€@(„€@(+Kßžx pƒ„‚c P`à@# TESTS ([A,F,C,E,H,I,J,K],B,D,G)=IÄ>ž‚IÄ> p„‚c P`à@# 8 INCH DRIVE BANK ([Y] OR N)= ÌëÇ÷'C @¢K0( 0( o) Rp&ÿBP Hü)A„€+Tœ ‡Ž‡ŽP P`€@ ‚ˆ„Bƒ‡„A‚-°@ž„ONȆȣ9ÿ2 P P`€@ ‚‚°@ž‚CIÿ«y ,žp žº‡h /ž© ^ž§ _ž¥ #ž£ 0ž 3žžŒ ÑÃYMž‚ž†)A B„€KÇPžSP P`€@ ‚V„A °@ž„îêÿŒž'P P`€@ ‚E„A °@ž‚ì†9ÿ}ƒ. #žƒ žžŒü‡(¢®IA€€@(„€@(+Kßžx pƒ„‚c P`à@# DRIVE NUMBEO1PìÇÉGÉ\ COÿ‹ P P`€@ ‚‚°@žƒCIîv7ÿµy žÆ‡g /žµ ^ž³ _ž± #ž¯ -ž— ,ž• 0ž˜ 9žž” Ð)EÃQC À€ @N!@"@"@)EƒH ĀžMƒDà ‡AžHP P`€@ ‚K„A °@ž„îêÿŒžP P`€@ ‚:„A °@ž‚ì†9ÿ}ƒ! #žŽ žŒ)EƒAž‚€€„€€ÀFžŸ§ž‰¢ŠIE€€@(„€@(€@(„ pƒ„‚c P`à@# RANGE OF TRACKS TO TEST OVER ([73-76])= *ÈŽÂ×É_%C @¢¡0( 0( o) Rp&ÿ˜P IǑǑ)GĀāP P`€@ ‚Š„Bƒ‰„A‚ˆ°@ž‡NO1PìÇÊÊ COÿ‹ P P`€@ ‚‚°@žƒCIîv7ÿµy žÆ‡g /žµ ^ž³ _ž± #ž¯ ,ž— -ž• 0ž˜ 9žž” Ð)GÃQC À€ @N!@"@"@)GƒH ĀžMƒDà ‡AžHP P`€@ ‚K„A °@ž„îêÿŒžP P`€@ ‚:„A °@ž‚ì†9ÿ}ƒ! #žŽ žŒ)GƒAž‚€€„€€ÀFžŸ§ž‰¢ŠIG€€@(„€@(€@(„ pƒ„‚c P`à@# RANGE OF SECTORS TO TEST OVER ([1-26])= *ÉnÂÙÊC @¢™0( 0( o) Rp&ÿP P P`€@ ‚‰„B‚Æ„A‚„°@ž…1PìÇCOÊe ÿˆP P`€@ °@ž‚îv4ÿ² /ž— ^ž• _ž“ #ž‘ ž 0ž… 1ž† 2ž‡žQIÇ ž…Iǝž‚I²*ÿ*P P`€@ °@žÿž Yž…S£QÅIǙž‚Iǖ p„‚c P`à@# DOUBLE DENSITY ([Y] OR N)=ÌëJÊÃC @¢™0( 0( o) Rp&  ÿP P P`€@ ‚‰„B‚µ„A‚„°@ž…1PìÇCOÊü ÿˆP P`€@ °@ž‚îv#ÿ¡S¡ #žƒ žÇœ p„‚c P`à@# DATA PATTERN TO USE - IN HEX ([C6])=: (ÍLËC @¢I0( 0( o) Rp&ÿ@P P P`€@ ‚†„B‚µ„A‚4°@ž‚ËH2ÿ;P P`€@ °@žÿUS¥ #žƒ žÇŸ p„‚c P`à@# DEVICE ADDR OF BOARD TO TEST - IN HEX ([30])=:0MËbC @¢™0( 0( o) Rp&ÿP P P`€@ ‚‰„B‚ž„A‚„°@ž…1PìÇCO˞ ÿˆP P`€@ °@ž‚îv&ÿ€ Yž…SŸQÅIÄ=ž‚IÄ= p„‚c P`à@# TEST INTERRUPTS FROM UFDC ([Y] OR N)= (ÌëËŽC @¢G0( 0( o) Rp&ÿ>P P P`€@ ‚†„B‚¶„A‚2°@ž‚Ëì2ÿ9P P`€@ °@žÿV Yž…S£QÅIÄ?ž‚IÄ? p„‚c P`à@# INVERT STEP DIRECTION POLARITY ([Y] OR N)=,ÌC @¢™0( 0( o) Rp&ÿP P P`€@ ‚‰„B‚Á„A‚„°@ž…1PìÇCOÌ? ÿˆP P`€@ °@ž‚îv/ÿ­S¡M žž^ #žƒ žÇ¥ p„‚c P`à@# TRACK TO TRACK STEP RATE TIME - IN MILLISECONDS (:[6])=::Í@Ì_C @¢=0( 0( o) Rp&ÿ4P P P`€@ ‚†„B‚Å„A‚(°@ž‚̧Cÿ/P P`€@ °@žþ· /ž— ^ž• _ž“ #ž‘ ž 8ž… 6ž† 2ž‡žUIÇ¢ž…Iǟž‚Iǜ p„‚c P`à@# SECTOR SIZE - IN BYTES (128,[256],512)= *KÌ¿C @¢—0( 0( o) Rp&ÿŽP I P P`€@ ‚„°@ž„1PìÇCIÿŒy ž‚@žl@ p„‚c P`à@# îêÌë3C @¢k0( 0( o) Rp&ÿbP P P`€@ °@žþ; /ž ^žŽ _žŒ #žŠ žˆ Yž† Nž‚HÿžƒIžI p„‚ăc P`à@# ÍYC @¢80( 0( o) Rp&ÿ/P INJ P P`€@ ‚$°@ž‚Oÿ.y žŒ‡y /žª ^žš _žŠ #ž€ 0ž 9žž‚ О‡ Ažˆ Fžž„ ÉN1@žUP P`€@ ‚„„A °@ž„CIÿHÿžP P`€@ ‚r„A °@žƒì† ÿ|ƒ= p„‚ăc P`à@# ̓9C @ÝQAžÃÁžÄÀ!K@üÄ!€ Ÿ6Âߑ6ð`pP P`€@ €ƒ„B€„„A‚ƒ°@ž…WCOÿ“€ ß6Áþ­Ï6ÖP P`€@ ‚‡„B‚Œ„A‚j°@ž„îvÍÃ+ÿ{žƒ€ ¯6Á ƒYIc # c p܀# c p܀# C @P P`€@ ‚†„B‚„A‚=°@ž‚Íî'ÿPž† ST0= £€‹„WP P`€@ €—„A‚%°@ž‚YÿP P`€@ ‚‡„B‚„A‚°@žƒì5Î&ÿ'ž… ST1=£e€Œ„WP P`€@ €—„A‚‚°@ž‚COÿeP P`€@ ‚†„B‚Œ„A‚r°@ž‚Î>%ÿž… ST2=£>€„WP P`€@ €—„A‚[°@žÿ?P P`€@ ‚†„B‚„A‚L°@ž‚Îeÿž†îv" ERR=£€–„WP P`€@ €—„A‚4°@žÿP P`€@ ‚†„B‚„A‚%°@ž‚΋)ÿZž† UNIT= £€‹„WP P`€@ €—„A‚ °@ž‚YÿP P`€@ ‚ˆ„B‚„A‚ƒ°@ž„ì5COη)ÿ.ž† HEAD= £c€‹„WP P`€@ €—„A‚f°@žÿaP P`€@ ‚†„B‚Š„A‚W°@ž‚Îáÿžƒ  ñž­P P`€@ ‚‡„B‚¢„A‚°@ž„Ð(Ï3,ÿNž™ NO INTERRUPT FROM BOARD WITHIN ALLOTED TIME .Ÿ`P P`€@ ‚‡„B‚£„A‚‚°@žƒCOÏ_5ÿ"ž› UNKNOWN ERROR CODE RETURNED FROM ACCESS MANAGER 2Ÿ2£”€‹Àv €žþ @žÚP P`€@ ‚‡„B‚Š„A‚L°@ž…YϘÿžœîv* ABNORMAL TERMINATION - READY LINE CHANGED STATE 2ÿŽžôP P`€@ ‚ˆ„B‚œ„A‚°@ž„êÐ(ÏÈ&ÿPž“ MISCELLANEOÐ/ÿž˜ IC - INVALID COMMAND WAS SENT TO FDC CHIP ,ÿ£‘€‹_6Až¹P P`€@ ‚‡„B‚“„A‚1°@ž„YÐBÿžŠîv SE - SEEK ENDP P`€@ ‚†„B‚‘„A‚°@ž‚Ð\ ÿfžŠ (FATAL ERROR) ÿ’£S€‹O6AžœP P`€@ ‚ˆ„B‚—„A‚ƒ°@ž…êCOЀÿBž EC - EQUIPMENT CHECK P P`€@ ‚†„B‚‘„A‚b°@ž‚О ÿ$žŠ (FATAL ERROR) ÿP£€‹?6AžŒP P`€@ ‚†„B‚•  „A‚A°@žƒÐÀÿž NR - DRIVE NOT READY P P`€@ ‚†„B‚’„A‚"°@ž‚Ðßÿž‹îv (FATAL ERROR) ÿ£‘€Œ6AžœP P`€@ ‚ˆ„B‚—„A‚ƒ°@ž…YCOÑÿ\ž EN - END-OF-CYLINDER P P`€@ ‚†„B‚‘„A‚b°@ž‚Ñ! ÿ>žŠ (FATAL ERROR) ÿ’£O€Œo6AžÅP P`€@ ‚‡„B‚ž„A‚A°@ž„êÑD&ÿž• BIT 6 IS HIGH - SHOULD ALWAYS BE LOW &P P`€@ ‚†„B‚’„A‚°@ž‚Ñkÿž‹îv (FATAL ERROR) ÿH£€Œ_6AžÃP P`€@ ‚‡„B‚„A‚‚°@ž„COю%ÿ]ž” DE - CRC ERROR (ERROR IN DISK READ)$P P`€@ ‚†„B‚‘„A‚[°@ž‚ѳ!ÿ8žŠ (SOFT ERROR) ÿ“£‘€ŒO6AžÌP P`€@ ‚ˆ„B‚¥„A‚:°@ž…YêÑ×,ÿž› OR - OVER-RUN ERROR OR DMA INTO UN-INSTALLED RAM 2P P`€@ ‚†„B‚’„A‚ °@ž‚Òÿž‹îv (FATAL ERROR) ÿ’£@€Œ?6AžÅP P`€@ ‚ˆ„B‚Ÿ„A‚ƒ°@ž…êCOÒ(&ÿ\ž• BIT 3 IS HIGH - SHOULD ALWAYS BE LOW &P P`€@ ‚†„B‚‘„A‚Z°@ž‚ÒN!ÿ6žŠ (FATAL ERROR) ÿH£‘€Œ/6AžÂP P`€@ ‚‡„B‚›„A‚9°@ž„YÒq#ÿž’ ND - CANNOT FIND DESIRED SECTOR P P`€@ ‚†„B‚’„A‚°@ž‚ҕÿž‹îv (SOFT ERROR) ÿ’£J€Œ6AžÁP P`€@ ‚ˆ„B‚›„A‚ƒ°@ž…êCOÒ¹"ÿ\ž‘ NW - DRIVE IS WRITE PROTECTEDP P`€@ ‚†„B‚‘„A‚^°@ž‚ÒÛ ÿ:žŠ (FATAL ERROR) ÿ’£€Œ6Až¿P P`€@ ‚‡„B‚˜„A‚=°@ž„êÒþ ÿž MA - MISSING ADDRESS MARKP P`€@ ‚†„B‚’„A‚°@ž‚Óÿž‹îv (SOFT ERROR) ÿ£‘€6AžÅP P`€@ ‚ˆ„B‚Ÿ„A‚ƒ°@ž…YCOÓC&ÿ\ž• BIT 7 IS HIGH - SHOULD ALWAYS BE LOW &P P`€@ ‚†„B‚‘„A‚Z°@ž‚Ói `€@ ‚†„B‚’„A‚°@ž‚Ó²ÿž‹îv (SOFT ERROR) ÿ’£’€_6AžÄP P`€@ ‚‰„B‚ž„A‚„°@ž†êYCOÓ×$ÿ[ž“ DD - CRC ERROR WAS IN DATA FIELD "P P`€@ ‚†„B‚‘„A‚\°@ž‚Óû ÿ7žŠ (SOFT ERROR) ÿI£I€O6AžÄP P`€@ ‚†„B‚„A‚;°@žƒÔ&ÿž• WC - WRONG CYLINDER NUMBER WAS FOUND &P P`€@ ‚†„B‚’„A‚°@ž‚ÔDÿž‹îv (SOFT ERROR‚‘„A‚W°@ž‚ԑ ÿ3žŠ (SOFT ERROR) ÿ’£D€/6AžÇP P`€@ ‚‡„B‚ „A‚6°@ž„êÔŽ(ÿž— SN - SCAN COMMAND DATA PATTERN NOT FOUND *P P`€@ ‚†„B‚’„A‚ °@ž‚ÔÝÿž‹îv (SOFT ERROR) ÿF£‘€6AžÂP P`€@ ‚ˆ„B‚œ„A‚ƒ°@ž…YCOÕ#ÿ\ž’ BC - BAD CYLINDER FLAG WAS READ P P`€@ ‚†„B‚‘„A‚]°@ž‚Õ$ ÿ9žŠ (FATAL ERROR) ÿ’£J€6AžÁP FT ERROR) ÿ“£€• òÁŸP P`€@ ‚‰„B‚”„A‚‚°@ž…COêօՎ*ÿ\žŠ COMMAND CYL =ƒŒ„WP P`€@ €—„A‚d°@ž‚OÿP P`€@ ‚‡„B‚’„A‚T°@žƒì5Õº+ÿ0žŠ RESULT CYL = £€Ž„WP P`€@ €—„A‚7°@ž‚Yÿ`P P`€@ ‚†„B‚‘„A‚'°@ž‚Õæ+ÿžŠ COMMAND HEAD=£a€„WP P`€@ €—„A‚ °@žÿ5P P`€@ ‚‡„B‚“„A‚‚°@žƒCOÖÿž‹îv' RESULT HEAD= £4`€@ ‚‡„B‚’„A‚*°@žƒì5Öj-ÿ)žŠ RESULT SEC = £€„WP P`€@ €—„A‚ °@ž‚Yÿ`žÙP P`€@ ‚‡„B‚”„A‚‚°@ž„CO֚  ÿž‹îv' DESIRED CYL =ƒŒ„WP P`€@ €—„A‚d°@ž‚Oÿ1P P`€@ ‚†„B‚‘„A‚T°@ž‚ÖÅ*ÿUžŠ PRESENT CYL =£2€“„WP P`€@ €—„A‚8°@žÿP P`€@ ‚†„B‚Š„A‚)°@ž‚Öð ÿ*žƒ €#ý„#c # ï«ÿ‚`Pž}Ö÷Ö÷C @¢—0( 0( o) Rp&ÿŽP „"„#P P`€@ °@žƒ1PìÇ ÿžAŸš)2Hõ€€ÁŸ– Ÿ ×)×7×C×O×[×g×g×s×׋חP P`€@ °@ž„×§×£×­ ÿ‰žìP P`€@ °@ž‚؞ ÿ‰žàP P`€@ °@ž‚٘ ÿ‰žÔP P`€@ °@ž‚ÛH ÿ‰žÈP P`€@ °@ž‚ܓ ÿ‰žŒP P`€@ °@ž‚ß ÿ‰ž°P P`€@ °@ž‚à6 ÿ‰ž€P P`€@ °@ž‚á8 ÿ‰ž˜P P`€@ °@ž‚⊠ÿ‰žŒP P`€@ °@ž‚ãä ÿ‰ž€+TÁžŸ…c P`à@# åZ×ï¯ÿ‚`Pž}×­×­*C @¢Š0( 0( o) Rp&ÿP  ‡˜‡ â‘ç”Ô‚”L €L‚‘‡‘P P`€@ °@žŠ[1PìÇWYKPÿ‡f†)6ÿ‚Ÿ„ž¡̓èv×ìØ˜R TEST INIT - INVALID SECTOR SIZE/DENSITY COMBINATION ‡°NyǯâJƒ®„T „U À=QF ?…ÅÕ À>QBLÀ?QA,„[ÚQGJÿ6ÅN 6ÃKQÁIXWÄ` „a „bÿŠ€V‰)*ÿ0ž žQRM@ê)Ø@= TEST INIT - TIMER SPECIFY COMMAND FAILEDIü‡¢)A€€E ÿ1 @ +ߘžvõ‡•)2€€G žƒ žž‚@ @+߉žt@”XE†)0ÿƒŸ„žžN̓؀×À TEST INIT - ALL REQUESTED UNITS ARE NOT READY p„‚c P`à@# ï³ÿ‚`Pž}؞؞3C @¢¯0( 0( o) Rp&ÿŠP ‡K)AƒI €€AžŸœ ÿ‡• ‡”ƒ“×Lžƒ@ žŸ“‚“ ‡ŠP P`€@ °@žŠSVW1PìÇوIقÿ…Â…)&ÿ žiž—è·Øá/ TEST A - RECALIBRATE COMMAND FAILED )E€€‡–‚˜ ‡S╠„UƒN„AƒK„\ƒ‰„Jÿˆçˆ€VŠ)ÿ…žpž˜Oê)Y̓[Ù# TEST A - SEEK COMMAND FAILED‚ ‡& „Uÿbçb€KÀqŽV…)0ÿ\žtžœÙ:" TEST A - SENSE INTERRUPT STATUS COMMAND FAILED6e€S›8„)6ÿ8ž#žžÙ]9 TEST A - CYLINDER NUMBER MISMATCH ON S.I.S. COMMAND ƒ)Ežž‚žƒßŸ“ƒ žƒßŸƒ žƒßŠŸ‰c P`à@# VØ÷غNدï·ÿƒžižœè·ÍƒÙÑ* TEST B - RECALIBRATE COMMAND FAILED - UNIT 0 ‡UP P`€@ °@žÿX„).ÿVž<žšÙü5 TEST B - RECALIBRATE COMMAND FAILED - UNIT 1)E€€‡–‚™ ‡#①„Uƒ„A „\ƒ‰„JÿŠçŠ€VŠ)(ÿ#žpžO[Vê)YÚ51 TEST B - SEEK COMMAND FAILED - UNIT 0 ‚› ‡•€[┄[ƒ•„T „UƒY„A „\ƒS„JÿTçT€V‰)(ÿ„žlžœW›̓MÚj) TEST B - SEEK COMMAND FAž¡OÚ¹1 TEST B - CYL NUMBER MISMATCH ON S.I.S. COMMAND - UNIT 0 ‚’ ‡â „UÿŒçŒ€KÀqŽVˆ)2ÿ‚žsž ̓ê)YÚï# TEST B - SENSE INTERRUPT STATUS FAILED - UNIT 1 6g€S›*„):ÿZžKž Û5 TEST B - CYL NUMBER MISMATCH ON S.I.S. COMMAND - UNIT 1 ƒ)Ežž‚žƒßŸƒŠ žƒß‡Ÿ‡c P`à@# OVÚÙ©ï»ÿ‚`Pž}ÛHÛH2C @¢®0( 0( o) Rp&ÿ¥P  TEST C - RECALIBRATE ERROR)E€€‡'‚– ‡Vⓠ„Uƒ„AƒO„\ƒ„Jÿ‡ç‡€Vˆ)ÿVžpž–ê)Y[Ûº# TEST C - SEEK COMMAND FAILED‚ ‡+ „Uÿcçc€KÀqŽV…)0ÿ/žtžœÛÞ# TEST C - SENSE INTERRUPT STATUS COMMAND FAILED6f€S›…Â…)6ÿ žPžŸOÜ7 TEST C - CYLINDER NUMBER MISMATCH ON S.I.S. COMMAND ‚𠇓 „Uƒ•„^ƒ„AƒŽ„\ÿ ç €KÀqŽVŠ)"ÿ…žnžšWVS̓JÜ=  TEST C - READ ID COMMAND FAILED 6e€N›-„)6ÿcžLžžÜY8 TEST C - CYLINDER NUMBER MISMATCH ON READ ID COMMANDƒ )Ežž‚žƒßŸ’ƒ6 žƒß3ŸŒƒŒ žƒß‰Ÿˆc P`à@# ۝ÛdNÛYï¿ÿ‚`Pž}ܓܓ'C @¢£0( 0( o) Rp&ÿšP ‡ƒÕLžƒ@ žŸ‘‚‘ ‡ ‡P P`€@ °@ž†1PìÇIÞøÿ…†).ÿƒžkžœè·ÍƒÜÊ+ TEST D - RECALIBRATE COMMAND FAILED - UNIT 0 ‡ˆP P`€@ °@ž‚SÿW„).ÿUž=žšÜö6 TEST D - RECALIBRATE COMMAND FAILED - UNIT 1)E€€‡–‚š ‡’â’ „Uƒ„A „\ƒ‰„Jÿ‹ç‹€V‹)(ÿ"žpžžOW[Vê)YÝ00 TEST D - SEEK COMMAND FAILED - UNIT 0 ‚š ‡_€[Ⓞ[ƒ”„T „UƒY„A „\ƒR„JÿTçT€Vˆ)(ÿƒžlž››̓MÝd) TEST D - SEEK COMMAND FAILED - UNIT 1 ‚‘ ‡+â+ „Uÿ*ç*€KÀqŽV…):ÿVžsž¡ݎ( TEST D - SENSE INTERRUPT STATUS COMMAND FAILED - UNIT 0 6h€S›…Â…):ÿ-žJž¡OÝ·2 TEST D - CYL NUMBER MISMATCH ON S.I.S. COMMAND - UNIT 0 ‚• ‡Žâ „Uÿ‹ç‹€KÀqŽV‰):ÿ…žsž¥Wê)Y̓Ýî' TEST D - SENSE INTERRUPT STATUS COMMAND FAILED - UNIT 1 6g€S›%„):ÿXžFž Þ; TEST D - CYL NUMBER MISMATCH ON S.I.S. COMMAND - UNIT 1 ‚™ ‡/■„Uƒ„^ƒ„A „\ÿ&ç&€KÀqŽVˆ)*ÿ žmžœJV[ÞR TEST D - READ ID COMMAND FAILED - UNIT 06i€N›…†):ÿƒžIž¢O̓Þt: TEST D - CYL NUMBER MISMATCH ON READ ID COMMAND - UNIT 0‚— ‡•â• „Uƒ2„^ƒ1„A „\ÿç€KÀqŽV‰)*ÿIžmžW›ê)YÞ± TEST D - READ ID COMMAND FAILED - UNIT 16g€N›&„):ÿ$žHž ÞÑ5 TEST D - CYL NUMBER MISMATCH ON READ ID COMMAND - UNIT 1$ÿ¢ ‡¡)AƒŸ €€AžŸ› ÿ‡š ‡UƒTÑLžƒ@ žŸ’‚’ ‡‰P P`€@ °@ž‰IWçNà&Sà ÿ†Â†)&ÿ‚žjž˜̓è·ßU- TEST E - RECALIBRATE COMMAND FAILED )E€€‡‚‹ ‡RP P`€@ °@ž‚ÿ…Â…)ÿRžqž“èâ߄/ TEST E - SEEK COMMAND FAILED)G€€‡‘ƒ) žµ‚ ‡$P P`€@ °@ž„Tÿ…Â…)2ÿ!žnžéßµ< TEST D - SINGLE SECTOR SCAN EQUAL COMMAND FALED ƒ)Gžž‚žƒßžƒ›)Ežž‚žƒß•Ÿ”ƒB žƒß?ŸŽƒŠ žƒß‡Ÿ‰c P`à@# NOßkß.ß#ïÇÿ‚`Pž}à6à6C @¢•0( 0( o) Rp&ÿŒP P P`€@ °@žƒ1PìÇÿ‡d†)2ÿŸžžá/èvà]@ TEST F - INVALID DENSITY/SECTOR SIZE COMBINATIONŸa„AXÿÄB ‡5)Aƒ3 €€AžŸ˜ ÿ‡— ‡–ƒ•ÕLžƒ@ žŸ‘‚‘ ‡ˆP P`€@ °@žˆWá)SVIá#ÿ†Â†)&ÿ‚žkž˜̓è·à­.ILED‚ ‡*P P`€@ €‚„B€„A °@ž‚ÿ…Â…) ÿ%žlž”éPá / TEST F - FORMAT COMMAND FAILEDƒ6)Ežž‚žƒß0ž!ƒ žƒßŸƒ‹ žƒßˆŸˆc P`à@# VNà‡à|ïËÿ‚`Pž}á8á8C @¢”0( 0( o) Rp&ÿ‹P P P`€@ °@žƒ1PìÇ#ÿ¡ ‡`)Aƒ^ €€AžŸ™ ÿ‡˜ ‡TƒSÕLžƒ@ žŸ‘‚‘ ‡ˆP P`€@ °@žˆWçâxSIârÿ†Â†)&ÿ‚žkž˜̓è·á†. TEST H - RECAL ‡&P P`€@ €°@žƒTÿ…Â…)&ÿ$žož—é™áã8 TEST H - WRITE SECTOR COMMAND FAILEDƒ_)Gžž‚žƒßYžI)G€€‡S‚‹ ‡‰ P P`€@ °@žƒWÿ†Â†)&ÿ‚žpž˜̓é×â& TEST H - READ SECTOR COMMAND FAILED 6lP P`€@ °@žÿ…Â…)0ÿYžGžœçºâFC TEST H - DATA BUFFER DOES NOT MATCH DISK DATA ƒ§)Gžž‚žƒß¡žƒš)Ežž‚žƒß”Ÿ–ƒ‘ žƒßŽŸƒŒ žƒß‰Ÿ‹c P`à@# OVNTáœá`áUïÏÿ‚`Pž}âŠâŠC @¢•0( 0( o) Rp&ÿŒP P P`€@ B°@žƒ1PìÇ#ÿ¡ ‡])Aƒ[ €€AžŸ™ ÿ‡˜ ‡QƒPÕLžƒ@ žŸ‘‚‘ ‡ˆP P`€@ °@žˆWç\ãÒSIãÌ ÿ†Â†)&ÿ‚žkž˜̓è·âÙ- TEST I - RECALIBRATE COMMAND FAILED )E€€‡‚‹ ‡RP P`€@ °@ž‚ ÿ…Â…)ÿRžqž“èâã+ TEST I - SEEK COMMAND FAILED)G€€‡Ž‚ ‡'P P`€@ B°@žƒT ÿ…Â…).ÿ%žož›é™ã5< TEST I - PARTIAL SECTOR WRITE COMMAND FAILEDƒ[)Gžž‚žƒßUžE)G€€‡O‚‹ ‡‰P P`€@ °@žƒ Wÿ†Â†).ÿ‚žpžœ̓é×ãt* TEST I - PARTIAL SECTOR READ COMMAND FAILED 6lP P`€@ °@žÿ…Â…)0ÿUžCžœçºã C TEST I - DATA BUFFER DOES NOT MATCH DISK DATA ƒ§)Gžž‚žƒß¡žƒš)Ežž‚žƒß”Ÿ–ƒ‘ žƒßŽŸƒŒ žƒß‰Ÿ‹c P`à@# OVNTâïâ³âšïÓÿ‚`Pž}ãäãäC @¢•0( 0( o) Rp&ÿŒP P P`€@ ް@žƒ1PìÇ#ÿ¡ ‡])Aƒ[ €€AžŸ™ ÿ‡˜ ‡QƒPÕLžƒ@ žŸ‘‚‘ ‡ˆP P`€@ °@žˆWç\åHSIåB ÿ†Â†)&ÿ‚žkž˜̓è·ä3- TEST J - RECALIBRATE COMMAND FAILED )E€€‡‚‹ ‡RP P`€@ °@ž‚ ÿ…Â…)ÿRžqž“èâäb3 TEST J - SEEK COMMAND FAILED)G€€‡• ‡”ß’ƒ6ñ‚Ž ‡ P P`€@ ް@ž„TU ÿ…Â…),ÿžnžšé™ä—? TEST J - WRITE MULTI SECTOR COMMAND FAILEDƒ[)Gžž‚žƒßUž@)G€€‡O ‡NßL‚‹ ‡‰P P`€@ °@žƒ Wÿ†Â†),ÿ‚žpž›̓é×äÙ3 TEST J - MULTI SECTOR READ COMMAND FAILED 6Ážœƒ6ÍP P`€@ °@ž‚ÿŠžP P`€@ °@žƒçºÿ|„)0ÿCž1ž›åC TEST J - DATA BUFFER DOES NOT MATCH DISK DATA ƒ§)Gžž‚žƒß¡P ‡j)Aƒh €€AžŸš ÿ‡™ ‡^ƒ]ÖLžƒ@ žŸ’‚’ ‡ˆP P`€@ °@ž‰W1PìÇç SIç ÿ†Â†)&ÿ‚žjž˜̓è·å0 TEST K - RECALIBRATE COMMAND FAILED )E€€‡ ‡‚Œ ‡OP P`€@ °@žƒW ÿ…Â…)ÿOžpž“èâåÏ- TEST K - SEEK COMMAND FAILEDP P`€@ °@žÿ’)G€€‡Ž‚Ž ‡P P`€@ €°@ž„TçŒ ÿ…Â…)&ÿžnž—陿? TEST K - WRITE SECTOR COMMANTE COMMAND FAILED )E€€‡[ ‡‚Œ ‡UP P`€@ °@žƒWÿ…Â…)ÿOžpž“èâæ{, TEST K - SEEK COMMAND FAILEDP P`€@ °@žÿ‘)G€€‡‚ ‡P P`€@ °@ž„TçŒ ÿ…Â…)&ÿžož—é׿²& TEST K - READ SECTOR COMMAND FAILED 6mP P`€@ °@žÿ…Â…)0ÿ„žGžçºæÛ̓@ TEST K - DATA BUFFER DOES NOT MATCH DISK DATA ƒ0)Gžž‚žƒß*žƒš)Ežž‚žƒß”Ÿ“‚ƒ• N  N @A)W„€ ÿž‚Љž +Tžc P`à@# KçŒ.C @¢,0( 0( o) Rp&ÿ#P ƒŠMP P`€@ °@ž‚WþžŒP P`€@ ÿ°@ž‚þ c P`à@# çº4C @¢°0( 0( o) Rp&ÿ§P Ã¥N )WA Bâ¡@A€€˜@Ê+kTº p„‚c P`à@# C @P P`€@ ‚‹„B‚„A‚‚°@ž‡CO1 PìÇPWç÷ÿž‘îv6 *** DATA WRITTEN TO DISK (c C @ ž‚€€ž‚€€yÿ„WP P`€@ €—„A‚Q°@žÿP P`€@ ‚‡„B‚˜„A‚B°@žƒì5è27ÿEž) DOES NOT MATCH DATA READ (c ž‚€@ž‚€@yÿ„WP P`€@ €—„A‚°@žÿTP P`€@ ‚†„B‚„A‚ °@ž‚èjÿ ž†) DURING  p„‚c P`à@# èv €€À p„‚ăc P`à@# **::ÿÿÿÿÿÿÿÿ66T T1PìÇJè™è¥Kè·)C @¢w0( 0( o) Rp&ÿnP ◠„U „Aƒ“„\ÿ’€VÇ „Uÿ€KÀqŽV p„‚ç‡c P`à@# [Sê)Yèâ.C @¢L0( 0( o) Rp&ÿCP âl „Uƒ™„Aƒh„\ƒ–„Jÿe€VÊ „Uÿ`€KÀqŽV€S›ˆ p„‚çWc P`à@# VOé@C @¢0( 0( o) Rp&ÿP â> „U W„Y p€‚„]çA@BÄZƒ„^ „_ƒ^„Aƒ-„\ƒ[„@ƒ•„Bƒ”„Cƒ“„Dƒ’„E „Iÿ €KÀqŽV p„‚çc P`à@# TKQRPéPBC @¢Ÿ0( 0( o) Rp&ÿµP I)WKƒ,q·)„€@q·c„+øAžt `⣠„U W„Y€„Zƒ„Aƒš„\ƒP„C€„G€‚„Eƒ–„Hƒ‘„^ÿ€KÀqŽV p„‚çŠc P`à@# 1PìÇ[SJê)YLé™>C @¢u0( 0( o) Rp&ÿlP @âi „U W„Y@ÃÄCQDLL„Zƒ]„^ „]ƒ™„AƒV„\ƒ–„@ƒ „Bƒ „Dƒ„E €„FÿL€KÀqŽV p„‚çFc P`à@# VOé×RC @¢70( 0( o) Rp&ÿ.P â, „U‚¹„Yƒž„Zƒ'„^ƒµ„C „] „_ƒ_„Aƒ„\ƒ\„@ƒª„Bƒ©„Dƒš„E €„Fÿ€KÀqŽV p„‚ç c P`à@# C @€" Á ÿ„"c # C @€#Å Á ÿü„#c # WPKTQRê)C @ „K„L„M„R„N„O„P„Q€U Ÿ€êHêPê‘ê¬êÁêÑêçêüëë)ëDëYëdërë€ë’BÀTC AÄXIÄVc # ÀT C ¿ „X€[6â±C $C ýÿšQä(ü‚©ÿ¥Qàÿ§QÞ €ž‹„Vÿ¢QـV1ÀX @ ÄX4®‚™ÿ“Q΀`1 a8'ÿŒQƀbÿ‡QÁIÄVc # ëÄì$ìëäìÿ“ÿ“¶—ÿvQÌÿÿtQÉÿŽQǀFÿoQÊÿjQÁÿˆÄVc # ëùëíëæë¯ýšëºfÿxÿx¶‘ÿ[QÌÿuÿYQÉÿsQǀFÿTQĂoÿOQÁÿmÄVc #  ÿd@¶ŒÿFQÇÿ`ÿDQĂ_ÿ?QÁÿ]ÄVc #  ÿSÿS`¶‘ÿ5QÌÿOÿ3QÉÿMQǀFÿ.QĂIÿ)QÁÿGÄVc # ÿ=ÿ=ÀÿQÌÿ9ÿQÉÿ7QǀFÿQĂ3ÿQÁÿ1ÄVc # ÿ(ÿ(À ÿ QÌÿ$ÿQÉÿ"QǀFÿQĂÿ…QÁÿÄVc # ëÄÿÿ¶“ÿQÌÿÿŽQÉÿ QǀIÿ‰QĂ ÿpQÁÿÄVc # ì$ìÿ“ÿ“¶—ÿyQÌÿÿwQÉþýQǀIÿrQÊÿYQÁÿˆÄVc # ëùëíëæë¯ýšëº;ÿxÿx¶‘ÿ^QÌÿuÿ\QÉþâQǀIÿWQĂoþñQÁþåÄVc # ‚‰ÿKQÄÿbÿIQÁIÄVc # ‚Œÿ@QÇþþÿ>QĀJÿ;QÁIÄVc # ‚Œÿ2QÆþðÿ0QÃÿ…QÁ„RÄVc # ìf‚þÂQʂÿ!QÇþúQńKþ÷Q„SIÄVc # ú$þæþÙ@ ÿQÓþÍþùQЀCþöQ̀GþóQʀEþðQǀHþíQĂþ›QÁþÄVc # )# €@þàQÄ+,žžx# )þÅQÆ# „K+,žžx# À[@6KÀTC A@I6ÄHLT¿·Iñ# Ç HLT¿œIñÅ # Å IpBI# ÿ€ëÝO€AÀ\XG# €]aÀ^XNQGÀ_XNAG# ÀT€YC €ZC # H8ÄWÀTC AXÐLО„ÜWžxIðž…ÀTC ÿI# H8ÄWÀTC AXÐLž„ÜWžxIðž„ÀTC I# H8ÄWÀTC AXÐL€ž„ÜWžxIðž„ÀTC I# ì5C @¢˜0( 0( o) Rp&ÿP „BP P`€@ :„A€‚°@žƒ1PìÇ ÿŠ€AP P`€@ €°@ž‚îêÿr„CP P`€@ €ƒ„A€‚°@ž‚î¹ÿm C.r€CP P`€@ €ƒ„A€‚°@žÿ]c P` à@# ì†C @¢—0( 0( o) Rp&ÿŽP @NqP P`€@ €°@žƒ1PìÇ ÿŠ žž‚C®c P` à@# îêì¯( FATAL PROGRAM ERROR - STACK OVERFLOW - ABORT X*ð XP P`€@ ‚†„B 0„A‚ƒ°@žƒì¯COÿ‚ ŸîvÀìß_‡W# ìãC @¢–0( 0( o) Rp&ÿP P P`€@ ‚‚°@ž„CI1PìÇ&ÿ€I žžŽy /ž‚Ižž Yž‚IžŠ Nž‚Iž… ž‚IžP P`€@ ‚[„A °@žƒîê ÿ†ÄAc P`€Aà@# ì†í/G SELECT BOARD-UNDER-TEST ("BUT") FROM THE ABOVE LIST: (RESPOND WITH THE BOARD ASSEMBLY NUMBER.) >>>541j - SPECIFY # OF "BUT"S (ENTER RETURN TO SIGNIFY 1, OR ENTER ACTUAL #) >>>N BOARD DASH NUMBER >>>  *** END OF TEST ***  NON-STANDARD DIAGNOSTIC AIDS (Y N,OR ) ?0 - HALT ON ERROR (Y N) ? - LOOP ON ERROR (Y N) ? - RING BELL ON ERROR (Y N)  ? - PRINT EXTENDED DIAGNOSTIC MESSAGES (Y N) ?0 - RESTART TEST FOLLOWING COMPLETION (Y N) ?. TYPE A CARRIAGE RETURN TO START TEST >>>, BOARD-UNDER-TEST ("BUT") NO. NOW UNDER TEST *********************************************** B *** ENTER TECH TEST *** ïÞðV ðXîv!C @¢0( 0( o) Rp&ÿ”P „CÀAUjBr„DP P`€@ €„„A€ƒ°@žƒ1PìÇþÐ žž•UTB„DP P`€@ €„„A€ƒ°@žƒîê þ»ÜB žUÿ„Ec P`€Eà@# î¹0C @¢Z0( 0( o) Rp&ÿQP ² 8ªÀ€2Nr 8ª—ô€ÄAc P`€Aà@# 0123456789ABCDEFîÙîêNC @¢)0( 0( o) Rp&ÿ P žžƒºž£ 01ÐP P`€@ ‚…„A °@ž„CIþ§`â›%àÀ'h+ )€0q„Bc P`€Bà@# „CP P`€@ €„A€ƒ°@žƒþ×c P` à@# ïŠï90C @¢¬0( 0( o) Rp&ÿ£P )Aù@O6œ‚ùœBùù?6œAøXÄB‚”ùMž•1-*ÿP P`€@ €‚„A °@ž†1PìÇ þ›žYP P`€@ €‚„A °@žþ%ÅÁ'-P+M žCc P`à@# ïŠC @¢[0( 0( o) Rp&ÿRP €AøAù@O6=Aù@O6œÂHBùc P`à@# mEEEBE5E3--E2E1Ào) Rp&ÿQP ² 8ªÀ€2Nr 8ª—ô€ÄAc P`€Aà@# 0123456789ABCDEFîÙîêNC @¢)0( 0( o) Rp&ÿ P žžƒºž£ 01ÐP P`€@ ‚…„A °@ž„CIþ§`â›%àÀ'h+ )€0q„Bc P`€Bà@# „CP P`€@ €„A€ƒ°@žƒþ×c P` à@# ïŠï90C @¢¬0( 0( o) Rp&ÿ£P )Aù@PRINT HFT:UFDC PRINT HFT:UFDC:1 PRINT HFT:UFDC:2 PRINT HFT:UFDC:3 810817133116810817133116810817133116 TITL UFDC TEST SCHEDULER (84-93720-21) (A000) TITL DEFINITIONS * REFER TO DEFINITION FILES MDIAG:UFDC AND MD:DEF * THE TEST CONTROL BLOCK IN LOW RAM OBTAINED FROM THE TEST MONITOR * IS USED TO SCHEDULE TESTS OF THE FLOPPY DISK CONTROLLER USING THE * FLOPPY DISK INTERFACE UFDC. SPACE 2 ROM REL EXTR SYSERR,UFDC EXTR O:MSG EXTR PRTHEX SPACE 2 HEADLP MACRO * LOOP OVER HEADS COPY =0,A COPY A,HEAD CURRENT HEAD=0 #(1) COPY HEAD,A GET CURRENT HEAD COPY HEADS,Q AND REQUIRED HEADS CLSN Q,=2 BOTH HEADS? JMP $+4 YES, DO THE CODE! CSN A,Q NO , BUT IS HEAD=HEADS? JMP $+2 YES, DO THE CODE! JMP #(2) NO MATCH, SKIP THE CODE ENDM SPACE 2 LPHEAD MACRO * FINISH LOOP OVER HEADS #(1) COPY HEAD,A GET CURRENT HEAD CLSN A,=1 IF 1 THEN DONE! JMP $+4 YES, EXIT IMS HEAD NO, BUMP HEAD NOP JMP #(2) TRY ANOTHER HEAD ENDM SPACE 2 GETERR MACRO * GET ST0 AND UFDC ERROR IN A REG COPY UF:ST0(Y),A GET ST0 BYTE AND =:C0,A BITS 7 AND 6 OF SHIFT A,LO,8 ST0 IN LEFT BYTE OR UF:ERR(Y),A ERR IN RIGHT BYTE ENDM SPACE 2 ERRCODE MACRO COPY =#(1),A SELP A,4 DISPLAY ERROR CODE COPY =0,A COPY A,TECHTEST NOT TECH TEST MODE ENDM TITL ERROR MACRO COPY =!MSG,Q MESSAGE ADDRESS COPY =!LEN,X MESSAGE LENGTH JSK FAULT IF A<>0 PROCESS AS AN ERROR JMP #(3) SKIPPED IF NOT LOOP ON ERROR MODE JMP !XIT SKIP OVER THE MESSAGE LPOOL JUST FOR GOOD MEASURE !MSG BYTE CR,LF BYTE 'TEST ##(1) - ',#(2) !LEN EQU $-!MSG*2 !XIT EQU $ ENDM SPACE 3 CHECK MACRO COPY #(2),A FETCH WORD TO TEST TBIT #(1),A CHECK FOR BIT SET JT OV,!XIT3  SET, SO PRINT ERROR JMP !XIT5 ELSE EXIT !XIT3 TEXT #(3) IFT #(4,?) TEXT ' (FATAL ERROR)',CR,LF JSK FATAL ENDC IFF #(4,?)  TEXT ' (SOFT ERROR) ',CR,LF JSK NONFATAL ENDC !XIT5 EQU $ ENDM SPACE 3 TITL ERROR HANDLING SUBROUTINES NAM FAULT FAULT EQU $ PUSH :40 SAVE REGISTERS COPY TECHTEST,Q TECH TEST MODE? JEQ Q,$+2 NO JMP FLTLOOP YES, DO TEST AGAIN JNE A,DOFAULT JMP FLTLESS * DOFAULT EQU $ COPY BSTAT:1,Q GET STATUS REG ADD =1,Q BUMP ERROR COUNT SBIT 15,Q TURN ON MSB COPY Q,BSTAT:1 NEW STATUS REG COPY MODEREG,A ERROR, GET MODE REG TBIT ACTNFLG1,A TECH TEST ON ERROR? JF OV,NOTECH NO IMS TECHTEST YES, ENTER TECH TEST MODE NOP NOTECH TBIT MODEFLAG,A USE CRT? JF OV,FLT2 NO COPY K,Y YES, DO MSG CALL O:MSG,=CO,XREG,QREG FLT1 COPY MODEREG,A RESTORE MODE REG TBIT MSGFLAG,A EXTENDED MSG? JF OV,$+2 NO JSK DUMP YES, PRINT EXTENDED ERROR MESSAGES TBIT ALRMFLAG,A RING BELL? JF OV,FLT2 NO TEXT BEL,BEL * FLT2 COPY MODEREG,A HALT ON ERROR? TBIT ACTNFLG2,A JF OV,FLT3 NOPE HLT * FLT3 COPY TECHTEST,A TECH TEST MODE? JEQ A,FLTEXIT NO, DO NEXT TEST FLTLOOP POP YES, DO THE TEST AGAIN SBIT 1,S SET OVERFLOW FOR ERROR FOUND FLAG RSK ERROR RETURN (P+1) FLTLESS POP DO NEXT TEST COPY K,X BUMP IMS 0(X) RETURN ADR NOP RBIT 1,S CLEAR OVERFLOW - NO ERROR FOUND RSK NORMAL RETURN (P+2) * FLTEXIT POP RESTORE REGS COPY K,X BUMP RETURN ADDRESS IMS 0(X) NOP SBIT 1,S FLAG ERROR FOUND RSK TITL NAM DUMP DUMP EQU $ PUSH :40 TEXT CR,LF,' ST0=' PRINT STATUS REG ZERO COPY YSAVE,X HEX UF:ST0(X) * TEXT ' ST1=' COPY YSAVE,X HEX UF:ST1(X) * TEXT ' ST2=' COPY YSAVE,X HEX UF:ST2(X) * TEXT ' ERR=' COPY YSAVE,X HEX UF:ERR(X) * TEXT ' UNIT=' COPY YSAVE,X COPY UF:ST0(X),A AND =:3,A HEX A * TEXT ' HEAD=' COPY YSAVE,X COPY UF:ST0(X),A SHIFT A,RO,2 AND =:1,A HEX A TEXT CR,LF * COPY YSAVE,X CHECK ERROR CODE COPY UF:ERR(X),A AND SEE IF ERROR IS REPORTED THERE AND =:FF,A MASK MANAGER ERROR CODE JNE A,MANGERR MANAGER ERROR JMP CHIPOK OTHERWISE A REGULAR CHIP ERROR * MANGERR EQU $ JSK FATAL ANY MANAGER ERROR IS FATAL * CLSN =UFDC:REP,A TOO MANY REPEATS JMP CHEKNIA TEXT ' PROPER RESPONSE NOT DETECTED FROM BOARD - TIMEOUT',CR,LF JMP DOBITS * CHEKNIA CLSN =UFDC:NIA,A NO INTERRUPT IN TIME  JMP UNKNOWN TEXT ' NO INTERRUPT FROM BOARD WITHIN ALLOTED TIME',CR,LF JMP DOBITS * UNKNOWN TEXT ' UNKNOWN ERROR CODE RETURNED FROM ACCESS MANAGER',CR,LF JMP DOBITS * CHIPOK COPY YSAVE,X COPY UF:ST0(X),A GET ST0 AND =:C0,A MASK ERROR BITS JEQ A,NORMSTS CLSN =:80,A JMP INVCMD INVALID COMMAND CLSN =:40,A JMP ABNORMAL ABNORMAL TERMINATION * TEXT ' ABNORMAL TERMINATION - READY LINE CHANGED STATE',CR,LF JSK FATAL THIS IS A FATAL TYPE ERROR JMP DOBITS * NORMSTS TEXT ' MISCELLANEOUS OR UNKNOWN ERROR ',CR,LF JSK NONFATAL FATAL ERRORS WILL BE CAUGHT ELSEWHERE JMP DOBITS * ABNORMAL TEXT ' ABNORMAL TERMINATION ',CR,LF JMP DOBITS * INVCMD TEXT ' IC - INVALID COMMAND WAS SENT TO FDC CHIP',CR,LF JSK FATAL THIS IS REALLY BAD NEWS * DOBITS EQU $ TELL WHAT EACH OF THE OTHER BITS MEANS COPY YSAVE,X CHECK 5,UF:ST0(X),' SE - SEEK END',FATAL COPY YSAVE,X CHECK 4,UF:ST0(X),' EC - EQUIPMENT CHECK',FATAL COPY YSAVE,X CHECK 3,UF:ST0(X),' NR - DRIVE NOT READY',FATAL SPACE 5 *** * * EXPLAIN WHAT ST1 IS  ALL ABOUT * *** COPY YSAVE,X CHECK 7,UF:ST1(X),' EN - END-OF-CYLINDER',FATAL COPY YSAVE,X CHECK 6,UF:ST1(X),' BIT 6 IS HIGH - SHOULD ALWAYS BE LOW',FATAL COPY YSAVE,X CHECK 5,UF:ST1(X),' DE - CRC ERROR (ERROR IN DISK READ)' COPY YSAVE,X CHECK 4,UF:ST1(X),' OR - OVER-RUN ERROR OR DMA INTO UN-INSTALLED RAM',FATAL COPY YSAVE,X CHECK 3,UF:ST1(X),' BIT 3 IS HIGH - SHOULD ALWAYS BE LOW',FATAL COPY YSAVE,X CHECK 2,UF:ST1(X),' ND - CANNOT FIND DESIRED SECTOR' COPY YSAVE,X CHECK 1,UF:ST1(X),' NW - DRIVE IS WRITE PROTECTED',FATAL COPY YSAVE,X CHECK 0,UF:ST1(X),' MA - MISSING ADDRESS MARK' SPACE 5 *** * * EXPLAIN WHAT ST2 IS ALL ABOUT * *** COPY YSAVE,X CHECK 7,UF:ST2(X),' BIT 7 IS HIGH - SHOULD ALWAYS BE LOW',FATAL COPY YSAVE,X CHECK 6,UF:ST2(X),' CM - DELETED DATA ADDRESS MARK FOUND' COPY YSAVE,X CHECK 5,UF:ST2(X),' DD - CRC ERROR WAS IN DATA FIELD' COPY YSAVE,X CHECK 4,UF:ST2(X),' WC - WRONG CYLINDER NUMBER WAS FOUND' COPY YSAVE,X CHECK 3,UF:ST2(X),' SH - SCAN EQUAL COMMAND FOUND DATA MATCH OK' COPY YSAVE,X CHECK 2,UF:ST2(X),' SN - SCAN COMMAND DATA PATTERN NOT FOUND' COPY YSAVE,X CHECK 1,UF:ST2(X),' BC - BAD CYLINDER FLAG WAS READ',FATAL COPY YSAVE,X CHECK 0,UF:ST2(X),' MD - CANNOT FIND ADDRESS MARK' SPACE 5 *** * * TELL ABOUT SECTOR ID INFO * *** COPY YSAVE,X WAS LAST COMMAND A S.I.S. COPY UF:FC(X),A SUB =UF:SIS,A JNE A,NOTSIS JMP PRTCYL * NOTSIS TEXT CR,LF,' COMMAND CYL =' HEX TRM TEXT ' RESULT CYL =' COPY YSAVE,X HEX UF:C2(X) * TEXT CR,LF,' COMMAND HEAD=' COPY YSAVE,X HEX UF:H(X) TEXT ' RESULT HEAD=' COPY YSAVE,X HEX UF:H2(X) * TEXT CR,LF,' COMMAND SEC =' COPY YSAVE,X HEX UF:R(X) TEXT ' RESULT SEC =' COPY YSAVE,X HEX UF:R2(X) JMP DUMPXIT LEAVE * PRTCYL TEXT CR,LF,' DESIRED CYL =' HEX TRM TEXT ' PRESENT CYL =' COPY YSAVE,X HEX UF:PCN(X) * DUMPXIT TEXT CR,LF COPY BSTAT:3,A CLEAR SOFT ERROR FLAG BIT RBIT 15,A COPY A,BSTAT:3 SO THAT NEXT SOFT FAILURE CAN BUMP COUNTER POP RSK RETURN TO CALLER TITL MAIN LINE DEFINE FDC:0 ENDEF SPACE 3 NAM FDC:0 FDC:0 ENTRY COPY =0,A CLEAR FATAL/SOFT ERROR COUNTERS COPY A,BSTAT:2 FATAL ERROR COUNTER COPY A,BSTAT:3 SOFT ERROR COUNTER * INITIALIZE THE UFDC CALL FDC:1 JEQ A,$+2 NO ERROR JMP ALLDONE INIT ERROR * DO EACH TEST IN THE TEST TABLE (NTESTS WORDS) COPY =TESTS,X ADR OF TESTS COPY =-NTESTS,Q -COUNT OF TESTS TESTLP COPY 0(X),A GET A TEST JNE A,$+2 NOT ZERO, DO TEST JMP TESTED IF ZERO, NO TEST XNX A JMP *$ SPLATTER TO CORRECT TEST WORD TEST:A WORD TEST:B WORD TEST:C WORD TEST:D WORD TEST:E WORD TEST:F WORD TEST:G WORD TEST:H WORD TEST:I WORD TEST:J WORD TEST:K * TEST:A CALL FDC:A JMP TESTED TEST:B CALL FDC:B JMP TESTED TEST:C CALL FDC:C JMP TESTED TEST:D CALL FDC:D JMP TESTED TEST:E CALL FDC:E JMP TESTED TEST:F EQU $ TEST F AND TEST G ARE CURRENTLY THE SAME TEST!! TEST:G CALL FDC:F JMP TESTED TEST:H CALL FDC:H JMP TESTED TEST:I CALL FDC:I JMP TESTED TEST:J CALL FDC:J JMP TESTED TEST:K CALL FDC:K JMP TESTED * TESTED ADD =1,X POINT TO NEXT TEST IJNE Q,$+2 JMP ALLDONE JMP TESTLP ALLDONE EXIT TITL INITIALIZE UFDC DEFINE FDC:1 ENDEF SPACE 3 NAM FDC:1 FDC:1 ENTRY ERRCODE :FF00 ONE1 SIN 2 RBIT 8,S NO INTERRUPTS! UIS COPY =Y1,Y COPY Y,YSAVE * COMPUTE NUMBER OF BYTES/SECTOR = 128, 256, 512 COPY N,Q N= 0, 1, 2 COPY =512,A  N=2 OR OTHER CLSN Q,=0 COPY =128,A N=0 CLSN Q,=1 COPY =256,A N=1 COPY A,NBYTES BYTES/SECTOR * COMPUTE SECTORS/TRACK AND GAP LENGTH (READ/WRITE) CALL FMT,=0 GET FORMAT PARAMETERS FOR CORRECT DENSITY, ETC JGE A,VALFMT IF OK ERROR INIT,'INVALID SECTOR SIZE/DENSITY COMBINATION',INITXIT VALFMT COPY A,SC SECTORS/TRACK SHIFT Q,RO,8 UPPER BYTE IS GPL (1) COPY Q,GPL GAP LENGTH (READ/WRITE) COPY =Y1,Y SCRATCHPAD #1 COPY DEVADR,A UFDC DEVICE ADR COPY A,UF:DA(Y) STORE DEVICE ADR COPY =UF:INIT,A INITIALIZE UFDC (RESET,SPECIFY) COPY A,UF:FC(Y) FUNCTION CODE * COMPUTE MODE REGISTER COPY =8,A MODE=RESET COPY INTDIS,Q INTERRUPTS? JEQ Q,INITDRV NO SBIT 0,A YES, INTDIS=1 SIN 4 NEXT 4 INDIVISIBLE SBIT 8,S ALLOW INTERRUPTS SBIT 12,S NO EOB INTS SBIT 13,S NO DATA INTS UIS INITDRV COPY DRIVE,Q MINIFLOPPY? JEQ Q,$+3 NO SBIT 1,A YES, 5"=1 SBIT 4,A YES, MOTOR=1 COPY STEPINV,Q STEP INVERT? JEQ Q,$+2 NO SBIT 2,A YES, STEPINV=1 COPY A,UF:MODE(Y) MODE REGISTER * * DRIVE TIMING CONSTANTS * COPY SRT,Q SRT USER SPECIFIED JEQ Q,SRTMAX IF ZERO USE MAX VALUE SUB =1,Q GET INTO RANGE OF 0 -> :(1)F TBIT 1,A MINIFLOPPY??? JF OV,SRT8INCH NOPE, OK AS IS ROTATE Q,RO,1 DIVIDE BY 2 JF OV,SRT8INCH IF EVEN NUMBER THEN OK ADD =1,Q ROUND UP JNE Q,SRT8INCH OVERFLOW ON ROUND-UP DID NOT OCCUR SRTMAX COPY =:F,Q FORCE MAX IF OVERFLOW SRT8INCH AND =:F,Q MASK LOWER NIBBLE XOR =:F,Q AND FLIP THE BITS COPY Q,UF:SRT(Y) STEP RATE TIME COPY =15,A 15*16 = 240 MILLISEC COPY A,UF:HUT(Y) HEAD UNLD TIME COPY =25,A 25*2 = 50 MILLISEC COPY A,UF:HLT(Y) HEAD LOAD TIME JSK UFDC * CHECK FOR ERRORS! RETURN ERROR CODE IN A REG COPY UF:ERR(Y),A GET ERROR CODE ERROR INIT,'TIMER SPECIFY COMMAND FAILED',ONE1 * WHICH UNITS NEEDED? COPY =0,Q NONE SO FAR COPY =-4,A COPY A,PTR UNITS COUNT 4 COPY =UNITS,X ADR OF UNITS INITLP COPY 0(X),A GET UNIT JEQ A,INITSK NOT A UNIT SUB =1,A ACTUAL UNIT AND =3,A 0 TO 3 SHIFT A,LO,4 LEFT 1 NYBLE XNX A UNIT NUMBER SBIT 0,Q BIT SET INITSK ADD =1,X BUMP ADR IMS PTR BUMP COUNT JMP INITLP REPEAT * DO TESTS INCLUDE B OR D (UNITS 0,1)? COPY =-NTESTS,A COPY A,PTR TESTS COUNT COPY =TESTS,X ADR OF TESTS INITEST COPY 0(X),A GET TEST JEQ A,INITESK NOT A TEST CLSN A,=2 TEST B? JMP INITSET YES CLSN A,=4 TEST D? JMP INITSET YES JMP INITESK NO INITSET SBIT 0,Q UNIT 0 SBIT 1,Q UNIT 1 INITESK ADD =1,X BUMP ADR IMS PTR BUMP COUNT JMP INITEST REPEAT * ARE ALL REQUIRED UNITS ON LINE? COPY Q,A REQD UNITS AND UF:STAT(Y),A AND WITH ON LINE XOR Q,A EQUAL TO REQD UNITS? ERROR INIT,'ALL REQUESTED UNITS ARE NOT READY',ONE1 INITXIT COPY K,X COPY A,AREG(X) SAVE A REG EXIT TITL TEST A SEEK DEFINE FDC:A ENDEF SPACE 3 NAM FDC:A FDC:A ENTRY * LOOP OVER UNITS COPY =0,A COPY A,PTR UNITS PTR ABEGIN COPY =UNITS,X ADR OF UNITS COPY PTR,A GET UNITS PTR XNX A COPY 0(X),A GET UNIT ENTRY JEQ A,$+2 JMP $+2 JMP AEND IF UNIT=0 , NO TEST SUB =1,A COPY A,UNIT STORE CURRENT UNIT * LOOP OVER HEADS HEADLP AHEAD,HEADA ERRCODE :0100 A0 CALL RECAL ERROR A,'RECALIBRATE COMMAND FAILED',A0 * LOOP OVER TRACKS ATBEGIN COPY =TRACKS,X ADR OF TRACKS COPY 0(X),A L TRACK COPY A,TRM CURRENT TRACK ATLOOP NOP ERRCODE :0101 * SEEK A1 COPY =Y1,Y SCRATCHPAD #1 COPY =UF:SEEK,A SEEK COPY A,UF:FC(Y) FUNCTION CODE COPY HEAD,A 0 OR 1 COPY A,UF:HD(Y) HEAD ADR COPY UNIT,A CO PY A,UF:US(Y) UNIT SELECT COPY TRM,A COPY A,UF:NCN(Y) NEW CYL NUMBER JSK UFDC COPY Y,YSAVE COPY UF:ERR(Y),A ERROR A,'SEEK COMMAND FAILED',A1 ERRCODE :0102 * S.I.S. A2 COPY =UF:SIS,A S.I.S COPY A,UF:FC(Y) FUNCTION CODE JSK UFDC COPY Y,YSAVE * CHECK FOR ERRORS! GETERR ERROR A,'SENSE INTERRUPT STATUS COMMAND FAILED',A2 JT OV,A3 DONT CHECK CYLS IF SIS FAILED COPY UF:PCN(Y),A PRESENT CYL NUMBER XOR TRM,A =TRACK? ERROR A,'CYLINDER NUMBER MISMATCH ON S.I.S. COMMAND',A1 A3 COPY TRM,A GET TRACK COPY =TRACKS,X ADR OF TRACKS CSK A,1(X) EQUAL TO H TRACK? JMP $+3 NO, TRY AGAIN NOP JMP ATEND YES, DONE IMS TRM BUMP TRACK NOP JMP ATLOOP REPEAT ATEND NOP LPHEAD HEADA,AHEAD AEND COPY PTR,A UNIT PTR CLSN A,=3 EQUAL TO MAX VALUE 3? JMP AOUT YES, EXIT  IMS PTR NO, BUMP COUNT NOP JMP ABEGIN REPEAT AOUT NOP ALL DONE EXIT TITL TEST B SEEK OVERLAPPED ON UNITS 0 AND 1 DEFINE FDC:B ENDEF SPACE 3 NAM FDC:B FDC:B ENTRY * LOOP OVER HEADS HEADLP BHEAD,HEADB ERRCODE :0200 B0 COPY =0,A COPY A,UNIT CALL RECAL ERROR B,'RECALIBRATE COMMAND FAILED - UNIT 0',B0 COPY =1,A COPY A,UNIT CALL RECAL ERROR B,'RECALIBRATE COMMAND FAILED - UNIT 1',B0 * LOOP OVER TRACKS BTBEGIN COPY =TRACKS,X ADR OF TRACKS COPY 0(X),A L TRACK COPY A,TRM CURRENT TRACK BTLOOP NOP  ERRCODE :0201 * SEEK TO UNIT 0 B1 COPY =Y1,Y SCRATCHPAD #1 COPY =UF:SEEK,A SEEK COPY A,UF:FC(Y) FUNCTION CODE COPY HEAD,A 0 OR 1 COPY A,UF:HD(Y) HEAD ADR COPY =0,A COPY A,UF:US(Y) UNIT SELECT 0 COPY TRM,A COPY A,UF:NCN(Y) NEW CYL NUMBER JSK UFDC  COPY Y,YSAVE COPY UF:ERR(Y),A ERROR B,'SEEK COMMAND FAILED - UNIT 0',B1 ERRCODE :0202 * SEEK TO UNIT 1 B2 COPY UF:MODE(Y),A GET MODE REGISTER COPY =Y2,Y SCRATCHPAD #2 COPY A,UF:MODE(Y) STORE MODE REGISTER COPY DEVADR,A COPY A,UF:DA(Y) STORE DEVICE ADR COPY =UF:SEEK,A SEEK COPY A,UF:FC(Y) FUNCTION CODE COPY HEAD,A 0 OR 1 COPY A,UF:HD(Y) HEAD ADR COPY =1,A COPY A,UF:US(Y) UNIT SELECT 1 COPY TRM,A COPY A,UF:NCN(Y) NEW CYL NUMBER JSK UFDC COPY Y,YSAVE COPY UF:ERR(Y),A ERROR B,'SEEK COMMAND FAILED - UNIT 1',B2 ERRCODE :0203 * S.I.S. UNIT 0 B3 COPY =Y1,Y COPY =UF:SIS,A S.I.S. COPY A,UF:FC(Y) FUNCTION CODE JSK UFDC  COPY Y,YSAVE * CHECK FOR ERRORS! GETERR ERROR B,'SENSE INTERRUPT STATUS FAILED - UNIT 0',B3 JT OV,B35 IF SIS FAILED COPY UF:PCN(Y),A PRESENT CYL NUMBER XOR TRM,A =TRACK? ERROR B,'CYL NUMBER MISMATCH ON S.I.S. COMMAND - UNIT 0',B3 B35 ERRCODE :0204 * S.I.S. UNIT 1 B4 COPY =Y2,Y COPY =UF:SIS,A S.I.S. COPY A,UF:FC(Y) FUNCTION CODE JSK UFDC COPY Y,YSAVE * CHECK FOR ERRORS! GETERR ERROR B,'SENSE INTERRUPT STATUS FAILED - UNIT 1',B4 JT OV,B5 IS SIS FAILED COPY UF:PCN(Y),A PRESENT CYL NUMBER XOR TRM,A =TRACK? ERROR B,'CYL NUMBER MISMATCH ON S.I.S. COMMAND - UNIT 1',B4 B5 COPY TRM,A GET TRACK COPY =TRACKS,X ADR OF TRACKS CSK A,1(X) EQUAL TO H TRACK? JMP $+3 NO, TRY AGAIN NOP JMP BTEND YES, DONE IMS TRM BUMP TRACK NOP JMP BTLOOP REPEAT BTEND NOP LPHEAD HEADB,BHEAD EXIT TITL TEST C SEEK AND READ ID DEFINE FDC:C ENDEF SPACE 3 NAM FDC:C FDC:C ENTRY * LOOP OVER UNITS COPY =0,A COPY A,PTR UNITS PTR CBEGIN COPY =UNITS,X ADR OF UNITS COPY PTR,A GET UNITS PTR XNX A COPY 0(X),A GET UNIT ENTRY JEQ A,$+2 JMP $+2 JMP CEND IF UNIT=0, NO TEST SUB =1,A COPY A,UNIT STORE CURRENT UNIT * LOOP OVER HEADS HEADLP CHEAD,HE ADC ERRCODE :0300 C0 CALL RECAL ERROR C,'RECALIBRATE ERROR',C0 * LOOP OVER TRACKS CTBEGIN COPY =TRACKS,X ADR OF TRACKS COPY 0(X),A L TRACK COPY A,TRM CURRENT TRACK CTLOOP NOP ERRCODE :0301 * SEEK C1 COPY =Y1,Y SCRATCHPAD #1 COPY =UF:SEEK,A SEEK COPY A,UF:FC(Y) FUNCTION CODE COPY HEAD,A 0 OR 1 COPY A,UF:HD(Y) HEAD ADR COPY UNIT,A COPY A,UF:US(Y) UNIT SELECT COPY TRM,A COPY A,UF:NCN(Y) NEW CYL NUMBER JSK UFDC COPY Y,YSAVE COPY UF:ERR(Y),A ERROR C,'SEEK COMMAND FAILED',C1 ERRCODE :0302 * S.I.S. C2 COPY =UF:SIS,A S.I.S. COPY A,UF:FC(Y) FUNCTION CODE JSK UFDC COPY Y,YSAVE * CHECK FOR ERRORS! GETERR ERROR C,'SENSE INTERRUPT STATUS COMMAND FAILED',C2 JT OV,C25 IF SIS FAILED COPY UF:PCN(Y),A PRESENT CYL NUMBER XOR TRM,A =TRACK? ERROR C,'CYLINDER NUMBER MISMATCH ON S.I.S. COMMAND',C2 C25 ERRCODE :0303 * READ ID C3 COPY =UF:RDID,A READ ID COPY A,UF:FC(Y) FUNCTION CODE COPY DENSITY,A COPY A,UF:MF(Y) DENSITY COPY HEAD,A COPY A,UF:HD(Y) HEAD ADR COPY UNIT,A COPY A,UF:US(Y) UNIT SELECT JSK UFDC COPY Y,YSAVE * CHECK FOR ERRORS! GETERR ERROR C,'READ ID COMMAND FAILED',C3 JT OV,C35 IF READ ID FAILED COPY UF:C2(Y),A CYL NUMBER XOR TRM,A =TRACK? ERROR C,'CYLINDER NUMBER MISMATCH ON READ ID COMMAND',C3 C35 COPY TRM,A GET TRACK COPY =TRACKS,X ADR OF TRACKS CSK A,1(X) EQUAL TO H TRACK? JMP $+3 NO, TRY AGAIN NOP JMP CTEND YES, DONE IMS TRM BUMP TRACK NOP JMP CTLOOP REPEAT CTEND NOP LPHEAD HEADC,CHEAD CEND COPY PTR,A UNIT PTR CLSN A,=3 EQUAL TO MAX VALUE 3? JMP COUT YES, EXIT IMS PTR NO, BUMP COUNT NOP JMP CBEGIN REPEAT COUT NOP ALL DONE EXIT TITL TEST D SEEK AND READ ID OVERLAPPED ON UNITS 0 AND 1 DEFINE FDC:D ENDEF SPACE 3 NAM FDC:D FDC:D ENTRY * LOOP OVER HEADS HEADLP DHEAD,HEADD ERRCODE :0400 D0 COPY =0,A COPY A,UNIT  CALL RECAL ERROR D,'RECALIBRATE COMMAND FAILED - UNIT 0',D0 COPY =1,A COPY A,UNIT CALL RECAL ERROR D,'RECALIBRATE COMMAND FAILED - UNIT 1',D0 * LOOP OVER TRACKS DTBEGIN COPY =TRACKS,X ADR OF TRACKS COPY 0(X),A L TRACK COPY A,TRM CURRENT TRACK DTLOOP NOP ERRCODE :0401 * SEEK TO UNIT 0 D1 COPY =Y1,Y SCRATCHPAD #1 COPY =UF:SEEK,A SEEK COPY A,UF:FC(Y) FUNCTION CODE COPY HEAD,A 0 OR 1 COPY A,UF:HD(Y) HEAD ADR COPY =0,A COPY A,UF:US(Y) UNIT SELECT 0 COPY TRM,A COPY A,UF:NCN(Y) NEW CYL NUMBER JSK UFDC COPY Y,YSAVE COPY UF:ERR(Y),A ERROR D,'SEEK COMMAND FAILED - UNIT 0',D1 ERRCODE :0402 * SEEK TO UNIT 1 D2 COPY UF:MODE(Y),A GET MODE REGISTER COPY =Y2,Y SCRATCHPAD #2 COPY A,UF:MODE(Y) STORE MODE REGISTER COPY DEVADR,A COPY A,UF:DA(Y) STORE DEVICE ADR COPY =UF:SEEK,A SEEK COPY A,UF:FC(Y) FUNCTION CODE COPY HEAD,A 0 OR 1 COPY A,UF:HD(Y) HEAD ADR COPY =1,A COPY A,UF:US(Y) UNIT SELECT 1 COPY TRM,A COPY A,UF:NCN(Y) NEW CYL NUMBER JSK UFDC COPY Y,YSAVE COPY UF:ERR(Y),A ERROR D,'SEEK COMMAND FAILED - UNIT 1',D2 ERRCODE :0403 * S.I.S. UNIT 0 D3 COPY =Y1,Y COPY =UF:SIS,A S.I.S. COPY A,UF:FC(Y) FUNCTION CODE JSK UFDC COPY Y,YSAVE * CHECK FOR ERRORS! GETERR ERROR D,'SENSE INTERRUPT STATUS COMMAND FAILED - UNIT 0',D3 JT OV,D35 IF SIS FAILED COPY UF:PCN(Y),A PRESENT CYL NUMBER XOR TRM,A =TRACK? ERROR D,'CYL NUMBER MISMATCH ON S.I.S. COMMAND - UNIT 0',D3 D35 ERRCODE :0404 * S.I.S. UNIT 1 D4 COPY =Y2,Y COPY =UF:SIS,A S.I.S. COPY A,UF:FC(Y) FUNCTION CODE JSK UFDC COPY Y,YSAVE * CHECK  FOR ERRORS! GETERR ERROR D,'SENSE INTERRUPT STATUS COMMAND FAILED - UNIT 1',D4 JT OV,D45 IF SIS FAILED COPY UF:PCN(Y),A PRESENT CYL NUMBER XOR TRM,A =TRACK? ERROR D,'CYL NUMBER MISMATCH ON S.I.S. COMMAND - UNIT 1',D4 D45 ERRCODE :0405 * READ ID UNIT 0 D5 COPY =Y1,Y COPY =UF:RDID,A READ ID COPY A,UF:FC(Y) FUNCTION CODE COPY DENSITY,A COPY A,UF:MF(Y) DENSITY COPY HEAD,A COPY A,UF:HD(Y) HEAD ADR COPY =0,A COPY A,UF:US(Y) UNIT SELECT 0 JSK UFDC COPY Y,YSAVE * CHECK FOR ERRORS! GETERR ERROR D,'READ ID COMMAND FAILED - UNIT 0',D5 JT OV,D55 IF SIS FAILED COPY UF:C2(Y),A CYL NUMBER XOR TRM,A =TRACK? ERROR D,'CYL NUMBER MISMATCH ON READ ID COMMAND - UNIT 0',D5 D55 ERRCODE :0406 * READ ID UNIT 1 D6 COPY =Y2,Y COPY =UF:RDID,A READ ID COPY A,UF:FC(Y) FUNCTION CODE COPY DENSITY,A COPY A,UF:MF(Y) DENSITY COPY HEAD,A COPY A,UF:HD(Y) HEAD ADR COPY =1,A COPY A,UF:US(Y) UNIT SELECT 1 JSK UFDC COPY Y,YSAVE * CHECK FOR ERRORS! GETERR ERROR D,'READ ID COMMAND FAILED - UNIT 1',D6 JT OV,D8 COPY UF:C2(Y),A CYL NUMBER XOR TRM,A =TRACK? ERROR D,'CYL NUMBER MISMATCH ON READ ID COMMAND - UNIT 1',D6 D8 COPY TRM,A GET TRACK COPY =TRACKS,X ADR OF TRACKS CSK A,1(X) EQUAL TO H TRACK? JMP $+3 NO, TRY AGAIN NOP JMP DTEND YES, DONE IMS TRM BUMP TRACK  NOP JMP DTLOOP REPEAT DTEND NOP LPHEAD HEADD,DHEAD EXIT TITL TEST E SCAN EQUAL DEFINE FDC:E ENDEF SPACE 3 NAM FDC:E FDC:E ENTRY * INITIALIZE BUFFER TO USER PATTERN (1 SECTOR) CALL BUFUSER * LOOP OVER UNITS COPY =0,A COPY A,PTR UNITS PTR EBEGIN COPY =UNITS,X ADR OF UNITS COPY PTR,A GET UNITS PTR XNX A COPY 0(X),A GET UNIT ENTRY JEQ A,$+2 JMP $+2 JMP EEND IF UNIT=0 , NO TEST SUB =1,A COPY A,UNIT STORE CURRENT UNIT * LOOP OVER HEADS HEADLP EHEAD,HEADE ERRCODE :0500 E0 CALL RECAL ERROR E,'RECALIBRATE COMMAND FAILED',E0 * LOOP OVER TRACKS ETBEGIN COPY =TRACKS,X ADR OF TRACKS COPY 0(X),A L TRACK COPY A,TRM CURRENT TRACK ETLOOP NOP ERRCODE :0503 E3 CALL SEEK ERROR E,'SEEK COMMAND FAILED',E3 * LOOP OVER SECTORS COPY =SECTORS,X ADR OF SECTORS COPY 0(X),A L SECTOR COPY A,SECTOR CURRENT SECTOR ESLP NOP COPY HEADS,A REQUIRED HEADS CLSN A,=2 BOTH HEADS? JMP SCMT YES, SCAN BOTH SIDES, MT=1 * MT=0 ON ALL SECTORS, EITHER HEAD ERRCODE :0501 E1 CALL SCAN,=0 SCAN EQUAL 1 SECTOR * CHECK FOR ERRORS! ERROR D,'SINGLE SECTOR SCAN EQUAL COMMAND FAILED',E1 JMP SCEND SCMT COPY HEAD,A CURRENT HEAD JEQ A,$+2 JMP SCEND IF NOT ZERO, SKIP COPY SECTOR,A CURRENT SECTOR CSK A,SC EQUAL TO SECTORS/TRACK? JMP SCEND NO, SKIP NOP DO SCAN WITH MT=1 * MT=1 ON LAST SECTOR HEAD 0, FIRST SECTOR HEAD 1 ERRCODE :0502 E2 CALL SCAN,=1 SCAN EQUAL 2 SECTORS * CHECK FOR ERRORS! ERROR E,'TWO SECTOR SCAN EQUAL COMMAND FAILED',E2 SCEND NOP COPY SECTOR,A CURRENT SECTOR COPY =SECTORS,X ADR OF SECTORS CSK A,1(X) EQUAL TO H SECTOR? JMP $+3 NO, TRY AGAIN NOP JMP ESDONE YES, DONE IMS SECTOR BUMP SECTOR NOP JMP ESLP REPEAT ESDONE NOP END OF SECTORS LOOP COPY TRM,A GET TRACK COPY =TRACKS,X ADR OF TRACKS CSK A,1(X) EQUAL TO H TRACK? JMP $+3 NO, TRY AGAIN NOP JMP ETEND YES, DONE IMS TRM BUMP TRACK NOP JMP ETLOOP REPEAT ETEND NOP LPHEAD HEADE,EHEAD EEND COPY PTR,A UNIT PTR CLSN A,=3 EQUAL TO MAX VALUE 3? JMP EOUT YES, EXIT IMS PTR NO, BUMP COUNT NOP JMP EBEGIN REPEAT EOUT NOP ALL DONE EXIT TITL TEST F FORMAT  SINGLE DENSITY DEFINE FDC:F RES 2 ENDEF SPACE 3 NAM FDC:F FDC:F ENTRY CALL FMT,=0 LOOK UP SC AND GPL (FORMAT) JGE A,DOFMT ERROR F,'INVALID DENSITY/SECTOR SIZE COMBINATION',FOUT JMP FOUT INVALID DOFMT COPY A,1(Y) SC AND =:FF,Q LOWER BYTE IS GPL (2) COPY Q,2(Y) GPL (FORMAT) * LOOP OVER UNITS COPY =0,A COPY A,PTR UNITS PTR FBEGIN COPY =UNITS,X ADR OF UNITS COPY PTR,A GET UNITS PTR XNX A COPY 0(X),A GET UNIT ENTRY JEQ A,$+2 JMP $+2 JMP FEND IF UNIT=0 , NO TEST SUB =1,A COPY A,UNIT STORE CURRENT UNIT * LOOP OVER HEADS HEADLP FHEAD,HEADF ERRCODE :0600 F0 CALL RECAL ERROR F,'RECALIBRATE COMMAND FAILED',F0 * LOOP OVER TRACKS FTBEGIN COPY =TRACKS,X ADR OF TRACKS COPY 0(X),A L TRACK COPY A,TRM CURRENT TRACK FTLOOP NOP ERRCODE :0602 F2 CALL SEEK ERROR F,'SEEK COMMAND FAILED',F2 ERRCODE :0601 F1 CALL FORMAT,=0,1,2 FORMAT A TRACK, CORRECT DENSITY * CHECK FOR ERRORS!  ERROR F,'FORMAT COMMAND FAILED',F1 COPY TRM,A GET TRACK COPY =TRACKS,X ADR OF TRACKS CSK A,1(X) EQUAL TO H TRACK? JMP $+3 NO, TRY AGAIN NOP JMP FTEND YES, DONE IMS TRM BUMP TRACK NOP JMP FTLOOP REPEAT FTEND NOP LPHEAD HEADF,FHEAD FEND COPY PTR,A UNIT PTR CLSN A,=3 EQUAL TO MAX VALUE 3? JMP FOUT YES, EXIT IMS PTR NO, BUMP COUNT NOP JMP FBEGIN REPEAT FOUT NOP ALL DONE EXIT TITL TEST H WRITE DATA AND READ DATA : USER DATA PATTERN DEFINE FDC:H ENDEF SPACE 3 NAM FDC:H FDC:H ENTRY * INITIALIZE BUFFER TO USER PATTERN (1 SECTOR) CALL BUFUSER * LOOP OVER UNITS COPY =0,A COPY A,PTR UNITS PTR HBEGIN COPY =UNITS,X ADR OF UNITS COPY PTR,A GET UNITS PTR XNX A COPY 0(X),A GET UNIT ENTRY JEQ A,$+2 JMP $+2 JMP HEND IF UNIT=0, NO TEST SUB =1,A  COPY A,UNIT STORE CURRENT UNIT * LOOP OVER HEADS HEADLP HHEAD,HEADH ERRCODE :0800 H0 CALL RECAL ERROR H,'RECALIBRATE COMMAND FAILED',H0 * LOOP OVER TRACKS HTBEGIN COPY =TRACKS,X ADR OF TRACKS COPY 0(X),A L TRACK COPY A,TRM CURRENT TRACK HTLOOP NOP ERRCODE :0803 H3 CALL SEEK ERROR H,'SEEK COMMAND FAILED',H3 * LOOP OVER SECTORS - WRITE DATA COPY =SECTORS,X ADR OF SECTORS COPY 0(X),A L SECTOR COPY A,SECTOR CURRENT SECTOR HSWLP NOP SECTORS WRITE LOOP ERRCODE :0801 H1 CALL OUTPUT,=128 WRITE SECTOR * CHECK FOR ERRORS! ERROR H,'WRITE SECTOR COMMAND FAILED',H1 COPY SECTOR,A CURRENT SECTOR COPY =SECTORS,X ADR OF SECTORS CSK A,1(X) EQUAL TO H SECTOR? JMP $+3 NO, TRY AGAIN NOP JMP HSWDONE YES, DONE IMS SECTOR BUMP SECTOR NOP JMP HSWLP REPEAT HSWDONE NOP END OF SECTORS WRITE LOOP * LOOP OVER SECTORS - READ DATA COPY =SECTORS,X ADR OF SECTORS COPY 0(X),A L SECTOR COPY A,SECTOR CURRENT SECTOR HSRLP NOP SECTORS READ LOOP ERRCODE :0802 H2 CALL INPUT READ SECTOR * CHECK FOR ERRORS! ERROR H,'READ SECTOR COMMAND FAILED',H2 JT OV,H4 CALL BUFCOMP,=0 COMPARE TO OUTPUT BUFR ERROR H,'DATA BUFFER DOES NOT MATCH DISK DATA',H2 H4 COPY SECTOR,A CURRENT SECTOR COPY =SECTORS,X ADR OF SECTORS CSK A,1(X) EQUAL TO H SECTOR? JMP $+3 NO, TRY AGAIN NOP JMP HSRDONE YES, DONE IMS SECTOR BUMP SECTOR NOP JMP HSRLP REPEAT HSRDONE NOP END OF SECTORS READ LOOP COPY TRM,A GET TRACK COPY =TRACKS,X ADR OF TRACKS CSK A,1(X) EQUAL TO H TRACK? JMP $+3 NO, TRY AGAIN NOP JMP HTEND YES, DONE IMS TRM BUMP TRACK NOP JMP HTLOOP REPEAT HTEND NOP LPHEAD HEADH,HHEAD HEND COPY PTR,A UNIT PTR CLSN A,=3 EQUAL TO MAX VALUE 3? JMP HOUT YES, EXIT IM S PTR NO, BUMP COUNT NOP JMP HBEGIN REPEAT HOUT NOP ALL DONE EXIT TITL TEST I WRITE DATA AND READ DATA : PARTIAL SECTOR I/O  DEFINE FDC:I ENDEF SPACE 3 NAM FDC:I FDC:I ENTRY * INITIALIZE BUFFER TO INCREMENTING DATA PATTERN (2 SECTORS) CALL BUFINCR,=66 * LOOP OVER UNITS COPY =0,A COPY A,PTR UNITS PTR IBEGIN COPY =UNITS,X ADR OF UNITS COPY PTR,A GET UNITS PTR XNX A COPY 0(X),A GET UNIT ENTRY JEQ A,$+2 JMP $+2 JMP IEND IF UNIT=0, NO TEST SUB =1,A COPY A,UNIT STORE CURRENT UNIT * LOOP OVER HEADS HEADLP IHEAD,HEADI ERRCODE :0900 I0 CALL RECAL ERROR I,'RECALIBRATE COMMAND FAILED',I0 * LOOP OVER TRACKS ITBEGIN COPY =TRACKS,X ADR OF TRACKS COPY 0(X),A L TRACK COPY A,TRM CURRENT TRACK ITLOOP NOP ERRCODE :0903 I3 CALL SEEK ERROR I,'SEEK COMMAND FAILED',I3 * LOOP OVER SECTORS - WRITE DATA COPY =SECTORS,X ADR OF SECTORS COPY 0(X),A L SECTOR COPY A,SECTOR CURRENT SECTOR ISWLP NOP SECTORS WRITE LOOP ERRCODE :0901 I1 CALL OUTPUT,=66 WRITE SECTOR * CHECK FOR ERRORS! ERROR I,'PARTIAL SECTOR WRITE COMMAND FAILED',I1 * ISWCHK EQU $ COPY SECTOR,A CURRENT SECTOR COPY =SECTORS,X ADR OF SECTORS CSK A,1(X) EQUAL TO H SECTOR?  JMP $+3 NO, TRY AGAIN NOP JMP ISWDONE YES, DONE IMS SECTOR BUMP SECTOR NOP JMP ISWLP REPEAT ISWDONE NOP END OF SECTORS WRITE LOOP * LOOP OVER SECTORS - READ DATA COPY =SECTORS,X ADR OF SECTORS COPY 0(X),A L SECTOR COPY A,SECTOR CURRENT SECTOR ISRLP NOP SECTORS READ LOOP ERRCODE :0902 I2 CALL INPUT READ SECTOR * CHECK FOR ERRORS! ERROR I,'PARTIAL SECTOR READ COMMAND FAILED',I2 JT OV,I4 CALL BUFCOMP,=0 COMPARE TO OUTPUT BUFR ERROR I,'DATA BUFFER DOES NOT MATCH DISK DATA',I2 I4 COPY SECTOR,A CURRENT SECTOR COPY =SECTORS,X ADR OF SECTORS CSK A,1(X) EQUAL TO H SECTOR? JMP $+3 NO, TRY AGAIN NOP JMP ISRDONE YES, DONE IMS SECTOR BUMP SECTOR NOP JMP ISRLP REPEAT ISRDONE NOP END OF SECTORS READ LOOP COPY TRM,A GET TRACK COPY =TRACKS,X ADR OF TRACKS CSK A,1(X) EQUAL TO H TRACK? JMP $+3 NO, TRY AGAIN NOP JMP ITEND YES, DONE IMS TRM BUMP TRACK NOP JMP ITLOOP REPEAT ITEND NOP LPHEAD HEADI,IHEAD IEND COPY PTR,A UNIT PTR CLSN A,=3 EQUAL TO MAX VALUE 3? JMP IOUT YES, EXIT IMS PTR NO, BUMP COUNT NOP JMP IBEGIN REPEAT IOUT NOP ALL DONE EXIT TITL TEST J WRITE DATA AND READ DATA : MULTIPLE SECTOR I/O DEFINE FDC:J ENDEF SPACE 3 NAM FDC:J FDC:J ENTRY * INITIALIZE BUFFER TO INCREMENTING DATA PATTERN (2 SECTORS) CALL BUFINCR,=180 * LOOP OVER UNITS COPY =0,A COPY A,PTR UNITS PTR JBEGIN COPY =UNITS,X ADR OF UNITS COPY PTR,A GET UNITS PTR XNX A COPY 0(X),A GET UNIT ENTRY JEQ A,$+2 JMP $+2 JMP JEND IF UNIT=0, NO TEST SUB =1,A COPY A,UNIT STORE CURRENT UNIT * LOOP OVER HEADS HEADLP JHEAD,HEADJ ERRCODE :0A00 J0 CALL RECAL ERROR J,'RECALIBRATE COMMAND FAILED',J0 * LOOP OVER TRACKS JTBEGIN COPY =TRACKS,X ADR OF TRACKS COPY 0(X),A L TRACK COPY A,TRM CURRENT TRACK JTLOOP NOP ERRCODE :0A03 J3 CALL SEEK ERROR J,'SEEK COMMAND FAILED',J3 * LOOP OVER SECTORS - WRITE DATA (ALTERNATE SECTORS) COPY =SECTORS,X ADR OF SECTORS COPY 0(X),A L SECTOR COPY A,SECTOR CURRENT SECTOR COPY =0,A COPY A,SECOUNT SECTOR COUNT=0 JSWLP NOP SECTORS WRITE LOOP - FIRST SECTOR WRITTEN IMS SECOUNT BUMP COUNT NOP COPY SECOUNT,A SECTOR COUNT TBIT 0,A ODD/EVEN BIT JF OV,JSWSKIP SKIP EVEN COUNTS ERRCODE :0A01 J1 CALL OUTPUT,=180 WRITE A LTERNATE SECTORS * CHECK FOR ERRORS! ERROR J,'WRITE MULTI SECTOR COMMAND FAILED',J1 JSWSKIP COPY SECTOR,A CURRENT SECTOR COPY =SECTORS,X ADR OF SECTORS CSK A,1(X) EQUAL TO H SECTOR? JMP $+3 NO, TRY AGAIN NOP JMP JSWDONE YES, DONE IMS SECTOR BUMP SECTOR NOP JMP JSWLP REPEAT JSWDONE NOP END OF SECTORS WRITE LOOP * LOOP OVER SECTORS - READ DATA (EVERY SECTOR) COPY =SECTORS,X ADR OF SECTORS COPY 0(X),A L SECTOR COPY A,SECTOR CURRENT SECTOR COPY =0,A COPY A,SECOUNT SECTOR COUNT=0 JSRLP NOP SECTORS READ LOOP IMS SECOUNT BUMP COUNT NOP ERRCODE :0A02 J2 CALL INPUT READ SECTOR * CHECK FOR ERRORS! ERROR J,'MULTI SECTOR READ COMMAND FAILED',J2 JF OV,J7 NO ERROR IN READ JMP J4 IF ERROR OCCURED IN READ DONT CHECK BUFFER * J7 EQU $ COPY SECOUNT,A SECTOR COUNT TBIT 0,A ODD/EVEN BIT JF OV,JSRCH1 ALTERNATE SECTOR - EVEN COUNT CALL BUFCOMP,=0 COMPARE TO FIRST OUTPUT BUFFER JMP JSRCHK JSRCH1 CALL BUFCOMP,=1 COMPARE TO SECND OUTPUT BUFFER JSRCHK ERROR J,'DATA BUFFER DOES NOT MATCH DISK DATA',J2 J4 COPY SECTOR,A CURRENT SECTOR COPY =SECTORS,X ADR OF SECTORS CSK A,1(X) EQUAL TO H SECTOR? JMP $+3 NO, TRY AGAIN NOP JMP JSRDONE YES, DONE IMS SECTOR BUMP SECTOR NOP JMP JSRLP REPEAT JSRDONE NOP END OF SECTORS READ LOOP COPY TRM,A GET TRACK COPY =TRACKS,X ADR OF TRACKS CSK A,1(X) EQUAL TO H TRACK? JMP $+3 NO, TRY AGAIN NOP JMP JTEND YES, DONE IMS TRM BUMP TRACK NOP JMP JTLOOP REPEAT JTEND NOP LPHEAD HEADJ,JHEAD JEND COPY PTR,A UNIT PTR CLSN A,=3 EQUAL TO MAX VALUE 3? JMP JOUT YES, EXIT IMS PTR NO, BUMP COUNT NOP JMP JBEGIN REPEAT JOUT NOP ALL DONE EXIT TITL TEST K WRITE DATA AND READ DATA : CROSS CYL INTERFERENCE  DEFINE FDC:K ENDEF SPACE 3 NAM FDC:K FDC:K ENTRY * LOOP OVER UNITS COPY =0,A COPY A,PTR UNITS PTR KBEGIN COPY =UNITS,X ADR OF UNITS COPY PTR,A GET UNITS PTR XNX A COPY 0(X),A GET UNIT ENTRY JEQ A,$+2 JMP $+2 JMP KEND IF UNIT=0, NO TEST SUB =1,A COPY A,UNIT STORE CURRENT UNIT * LOOP OVER HEADS HEADLP KHEAD,HEADK ERRCODE :0B00 K0 CALL RECAL ERROR K,'RECALIBRATE COMMAND FAILED',K0 * LOOP OVER TRACKS - WRITE KTWBEGIN COPY =TRACKS,X ADR OF TRACKS COPY 0(X),A L TRACK COPY A,TRM CURRENT TRACK COPY =1,A NOT ZERO COPY A,BUFR FIRST WORD OF BUFFER KTWLOOP NOP ERRCODE :0B03 K3 CALL SEEK ERROR K,'SEEK COMMAND FAILED',K3 * CHANGE STATE OF BUFFER. FIRST BUFFER IS ZEROS CALL BUFALT * LOOP OVER SECTORS - WRITE DATA COPY =SECTORS,X ADR OF SECTORS COPY 0(X),A L SECTOR COPY A,SECTOR CURRENT SECTOR KSWLP NOP SECTORS WRITE LOOP ERRCODE :0B01 K1 CALL OUTPUT,=128 WRITE SECTOR * CHECK FOR ERRORS! ERROR K,'WRITE SECTOR COMMAND FAILED',K1 COPY SECTOR,A CURRENT SECTOR COPY =SECTORS,X ADR OF SECTORS CSK A,1(X) EQUAL TO H SECTOR? JMP $+3 NO, TRY AGAIN NOP JMP KSWDONE YES, DONE IMS SECTOR BUMP SECTOR NOP JMP KSWLP REPEAT KSWDONE NOP END OF SECTORS WRITE LOOP COPY TRM,A GET TRACK COPY =TRACKS,X ADR OF TRACKS CSK A,1(X) EQUAL TO H TRACK? JMP $+3 NO, TRY AGAIN NOP JMP KWEND YES, DONE IMS TRM BUMP TRACK NOP JMP KTWLOOP REPEAT KWEND NOP END OF TRACKS WRITE ERRCODE :1B00 K00 CALL RECAL ERROR K,'RECALIBRATE COMMAND FAILED',K00 * LOOP OVER TRACKS - READ KTRBEGIN COPY =TRACKS,X ADR OF TRACKS COPY 0(X),A L TRACK COPY A,TRM CURRENT TRACK COPY =1,A NOT ZERO COPY A,BUFR FIRST WORD OF BUFFER KTRLOOP NOP ERRCODE :1B03 K30 CALL S EEK ERROR K,'SEEK COMMAND FAILED',K30 * CHANGE STATE OF BUFFER. FIRST BUFFER IS ZEROS CALL BUFALT * LOOP OVER SECTORS - READ DATA COPY =SECTORS,X ADR OF SECTORS COPY 0(X),A L SECTOR COPY A,SECTOR CURRENT SECTOR KSRLP NOP SECTORS READ LOOP ERRCODE :0B02 K2 CALL INPUT READ SECTOR ERROR K,'READ SECTOR COMMAND FAILED',K2 JT OV,K4 * CHECK FOR ERRORS! CALL BUFCOMP,=0 COMPARE TO OUTPUT BUFFER ERROR K,'DATA BUFFER DOES NOT MATCH DISK DATA',K2 K4 COPY SECTOR,A CURRENT SECTOR COPY =SECTORS,X ADR OF SECTORS CSK A,1(X) EQUAL TO H SECTOR? JMP $+3 NO, TRY AGAIN NOP JMP KSRDONE YES, DONE IMS SECTOR BUMP SECTOR NOP JMP KSRLP REPEAT KSRDONE NOP END OF SECTORS READ LOOP COPY TRM,A GET TRACK COPY =TRACKS,X ADR OF TRACKS CSK A,1(X) EQUAL TO H TRACK? JMP $+3 NO, TRY AGAIN NOP JMP KREND YES, DONE IMS TRM BUMP TRACK NOP JMP KTRLOOP REPEAT KREND NOP END OF TRACKS READ LPHEAD HEADK,KHEAD KEND COPY PTR,A UNIT PTR CLSN A,=3 EQUAL TO MAX VALUE 3? JMP KOUT YES, EXIT IMS PTR NO, BUMP COUNT NOP JMP KBEGIN REPEAT KOUT NOP ALL DONE EXIT TITL BUFFER INITIALIZATION ROUTINES SYSDEF BUFUSER ENDEF NAM BUFUSER BUFUSER ENTRY * INITIALIZE BUFFER TO USER PATTERN (1 SECTOR) COPY PATTERN,A ONE BYTE SHIFT A,LO,8 IN LEFT BYTE OR PATTERN,A BOTH BYTES COPY NBYTES,Q BYTES/SECTOR SHIFT Q,RO,1 DIVIDE BY 2 NEG Q,Q -WORDS/SECTOR COPY =BUFR,X ADR OF BUFR COPY A,0(X) WRITE PATTERN WORD ADD =1,X BUMP X IJNE Q,$-2 REPEAT EXIT SPACE 2 SYSDEF BUFCON ENDEF NAM BUFCON BUFCON ENTRY * INITIALIZE BUFFER TO A CONSTANT (1 SECTOR) * CONSTANT BYTE PASSED IN A REG COPY A,Q CONSTANT IN Q REG SHIFT A,LO,8 CONSTANT IN LEFT BYTE OR Q,A BOTH BYTES OF A REG = CONSTANT COPY NBYTES,Q SHIFT Q,RO,1 DIVIDE BY 2 NEG Q,Q -WORDS/SECTOR COPY =BUFR,X ADR OF BUFR COPY A,0(X) WRITE CONSTANT WORD ADD =1,X BUMP X IJNE Q,$-2 REPEAT EXIT SPACE 2 SYSDEF BUFINCR ENDEF NAM BUFINCR BUFINCR ENTRY * INITIALIZE BUFFER TO INCREMENTING DATA PATTERN * THE ENTIRE BUFFER IS ZEROED (2 SECTORS) * A REG = NUMBER OF BYTES TO FILL * * ZERO THE BUFFER COPY =0,A COPY NBYTES,Q NEG Q,Q -2 * WORDS/SECTOR COPY =BUFR,X ADR OF BUFFER COPY A,0(X) ZERO THE BUFFER ADD =1,X BUMP X IJNE Q,$-2 REPEAT * * FILL IN WITH PATTERN (:0-:FF) COPY K,X COPY AREG(X),Q GET RECORD LENGTH COPY N,A BYTES/SECTOR CODE CLSN A,=0 SHIFT Q,RO,1 N=0, DIVIDE BY 2 CLSN A,=1 NOP N=1, OK CLSN A,=2 SHIFT Q,LO,1 N=2, MULTIPLY BY 2 COPY =1,A START WITH :0001 NEG Q,Q -COUNT OF WORDS COPY =BUFR,X ADR OF BUFFER INCRWR COPY A,0(X) WRITE PATTERN CLSN A,=:FF END OF PATTERN? JMP INCRST YES, RESTART ADD =:0202,A NO, INCREMENT EACH BYTE BY 2 JMP $+2 INCRST COPY =1,A START WITH :0001 ADD =1,X BUMP X IJNE Q,INCRWR REPEAT EXIT SPACE 2 SYSDEF BUFALT ENDEF NAM BUFALT BUFALT ENTRY * ALTERNATE BUFFER ZEROS, ONES, ETC. (1 SECTOR) COPY BUFR,A FIRST WORD OF BUFFER JEQ A,BUFONE ZERO? CALL BUFCON,=:00 NO , MAKE BUFFER ZEROS JMP BUFOUT BUFONE CALL BUFCON,=:FF YES, MAKE BUFFER ONES BUFOUT EXIT SPACE 2 SYSDEF BUFCOMP ENDEF NAM BUFCOMP BUFCOMP ENTRY * COMPARE OUTPUT BUFFER TO INPUT BUFFER (1 SECTOR) * A REG = NUMBER OF OUTPUT BUFFER (0 OR 1) - ON RETURN IS * 0 = EQUAL, 1 = NOT EQUAL. COPY NBYTES,Q BYTES/SECTOR SHIFT Q,RO,1 WORDS/SECTOR COPY =BUFR,X ADR OF OUTPUT BUFFER JEQ A,$+2 BUFFER 0 ADD Q,X BUFFER 1, ADD RECORD OFFSET COPY =I NBUFR,Y ADR OF INPUT BUFFER NEG Q,Q -COUNT OF WORDS * COMPARE THE BUFFERS COPY 0(X),A BUFR WORD XOR 0(Y),A COMPARE TO INBUFR WORD JNE A,BUFDIF DIFFERENT? ADD =1,X BUMP X ADD =1,Y BUMP Y IJNE Q,$-5 REPEAT * COPY =0,A FLAG DATA BUFFER MATCHED WITHOUT ERROR COPY K,X COPY A,AREG(X) SAVE A REG EXIT * * TELL WHAT DIDN'T MATCH * BUFDIF PUSH :40 SAVE ALL REGS TEXT CR,LF,'*** DATA WRITTEN TO DISK (' POP GET REGS PUSH :40 AND SAVE THEM AGAIN CLSN =0,A WHAT BYTE WAS WRONG JMP DOUPPER UPPER BYTE IN ERROR COPY 0(X),A JMP PRTWRTN PRINT LOWER BYTE * DOUPPER COPY 0(X),A SHIFT A,RO,8 PRINT UPPER BYTE PRTWRTN AND =:FF,A ISOLATE BYTE HEX A PRINT IT TEXT ') DOES NOT MATCH DATA READ (' POP RESTORE REGS * CLSN =0,A WHAT BYTE WAS IN ERROR JMP DOUPPER2 UPPER BYTE COPY 0(Y),A GET DATA READS FROM DISK JMP PRTREAD DOUPPER2 COPY 0(Y),A PRINT UPPER BYTE SHIFT A,RO,8 * PRTREAD AND =:FF,A GET LOWER BYTE ONLY HEX A TEXT ') DURING' * COPY =1,A FLAG BAD NEWS COPY K,X COPY A,AREG(X) EXIT TITL FMT - LOOK UP SC AND GPL FORMAT SYSDEF FMT ENDEF NAM FMT FMT ENTRY * COMPUTE SECTORS/TRACK AND GAP LENGTHS * ON RETURN A REG = SC Q REG = GPL COPY DENSITY,A GET DENSITY FLAG JNE A,FMTDD DOUBLE COPY =SDTABLE,X POINT TO SINGLE DENSITY TABLE JMP FMT2 * FMTDD COPY =DDTABLE,X POINT TO DOUBLE DENSITY TABLE FMT2 EQU $ COPY N,A BYTES/SECTOR CODE 0,1,2 SHIFT A,LO,2 *4 ADD A,X CORRECT BYTES/SECTOR COPY DRIVE,A 0=FLOPPY 1=MINIFLOPPY SHIFT A,LO,1 *2 ADD A,X CORRECT DRIVE COPY 0(X),A GET SECTORS/TRACK COPY 1(X),Q GAP LENGTHS COPY K,X COPY A,AREG(X) SAVE A REG COPY Q,QREG(X) SAVE Q REG EXIT * SDTABLE WORD 26 8" 128 SINGLE DENSITY WORD :071B WORD 16 5" 128 WORD :071B WORD 15 8" 256 WORD :0E2A WORD 8 5" 256 WORD :0E2A WORD 8 8" 512 WORD :1B3A WORD 4 5" 512 WORD :1B3A * DDTABLE EQU $ WORD -1 INVALID DOUBLE DENSITY WORD -1 WORD -1 WORD -1 WORD 26 8" 256  WORD :0E36 WORD 16 5" 256 WORD :0E36 WORD 15 8" 512 WORD :1B54 WORD 9 5" 512 WORD :1B54 TITL RECALIBRATE CURRENT UNIT SYSDEF RECAL ENDEF NAM RECAL RECAL ENTRY COPY =Y1,Y SCRATCHPAD #1 COPY =UF:RECAL,A RECALIBRATE COPY A,UF:FC(Y) FUNCTION CODE COPY =0,A ZERO COPY A,UF:HD(Y) HEAD ADR COPY UNIT,A CURRENT COPY A,UF:US(Y) UNIT SELECT JSK UFDC COPY UF:ERR(Y),A JNE A,RECALOUT * S.I.S. COPY =UF:SIS,A S.I.S. COPY A,UF:FC(Y) FUNCTION CODE JSK UFDC * CHECK FOR ERRORS! RETURN ERROR CODE IN A REG GETERR RECALOUT COPY K,X COPY A,AREG(X) SAVE A REG COPY Y,YSAVE EXIT TITL SEEK CURRENT TRACK SYSDEF SEEK ENDEF NAM SEEK SEEK ENTRY COPY =Y1,Y SCRATCHPAD #1 COPY =UF:SEEK,A SEEK COPY A,UF:FC(Y) FUNCTION CODE COPY HEAD,A 0 OR 1 COPY A,UF:HD(Y) HEAD ADR COPY UNIT,A CURRENT COPY A,UF:US(Y) UNIT SELECT COPY TRM,A COPY A,UF:NCN(Y) NEW CYL NUMBER JSK UFDC COPY UF:ERR(Y),A JNE A,SEEKOUT * S.I.S. COPY =UF:SIS,A S.I.S. COPY A,UF:FC(Y) FUNCTION CODE JSK UFDC * CHECK FOR ERRORS! RETURN ERROR CODE IN A REG GETERR JNE A,SEEKOUT COPY UF:PCN(Y),A PRESENT CYL NUMBER XOR TRM,A =TRACK? SEEKOUT COPY K,X COPY A,AREG(X) SAVE A REG COPY Y,YSAVE EXIT TITL SCAN EQUAL 1 OR 2 SECTORS (MT=1) SYSDEF SCAN ENDEF NAM SCAN SCAN ENTRY * SCAN EQUAL. 1 SECTOR IF MT=0 AND 2 SECTORS IF MT=1 * A REG = MT = 0 OR 1 * ON RETURN IS ERROR CODE COPY =Y1,Y SCRATCHPAD #1 COPY =UF:SCEQ,A SCAN E QUAL COPY A,UF:FC(Y) FUNCTION CODE COPY =BUFR,A BUFFER IN RAM COPY A,UF:DMA(Y) DMA ADR COPY K,X COPY AREG(X),A RESTORE A REG COPY A,UF:MT(Y) MT= 0 OR 1 (ONE SIDE OR BOTH) COPY NBYTES,Q BYTES/SECTOR JEQ A,$+2 MT=0 ? ADD Q,Q NO, DOUBLE BYTE COUNT, 2 SECTORS COPY Q,UF:BCT(Y) DMA BYTE COUNT COPY DENSITY,A COPY A,UF:MF(Y) DENSITY COPY =1,A COPY A,UF:SK(Y) SCAN ALL SECTORS  COPY HEAD,A COPY A,UF:HD(Y) HEAD ADR 0 OR 1 COPY UNIT,A COPY A,UF:US(Y) UNIT SELECT COPY TRM,A COPY A,UF:C(Y) CYL NUMBER COPY SECTOR,A COPY A,UF:R(Y) START SECTOR COPY N,A COPY A,UF:N(Y) BYTES/SECTOR CODE COPY SC,A COPY A,UF:EOT(Y) SECTORS/TRACK COPY GPL,A COPY A,UF:GPL(Y) GAP LENGTH COPY =1,A COPY A,UF:STP(Y) SCAN EACH SECTOR JSK UFDC * CHECK FOR ERRORS! RETURN ERROR CODE IN A REG GETERR COPY K,X COPY A,AREG(X) SAVE A REG COPY Y,YSAVE EXIT TITL FORMAT A TRACK SYSDEF FORMAT,DENFMT,SCFMT,GPLFMT ENDEF NAM FORMAT FORMAT ENTRY * FORMAT A TRACK. SECTORS TABLE IS IN BUFR * A REG = 0 (SINGLE DENSITY) OR 1 (DOUBLE DENSITY) * ON RETURN IS ERROR CODE * * BUILD FORMAT TABLE COPY =0,Q SECTOR COUNTER COPY =BUFR,X ADR OF TABLE FBUILD ADD =1,Q BUMP COUNT COPY TRM,A CYL NUMBER SHIFT A,LO,8 IN LEFT BYTE OR HEAD,A CYL/HEAD COPY A,0(X) FIRST WORD COPY Q,A SECTOR NUMBER  SHIFT A,LO,8 IN LEFT BYTE OR N,A BYTES/SECTOR IN RIGHT BYTE COPY A,1(X) SECOND WORD ADD =2,X POINT TO NEXT ENTRY CSK Q,SCFMT(Y) DONE ALL SECTORS FOR TRACK? JMP FBUILD NO, DO ANOTHER NOP YES, TABLE COMPLETE * FORMAT COPY Y,X X REG = STACK FRAME COPY =Y1,Y SCRATCHPAD #1 COPY =UF:FMT,A FORMAT COPY A,UF:FC(Y) FUNCTION CODE COPY =BUFR,A BUFFER IN RAM COPY A,UF:DMA(Y) DMA ADR COPY SCFMT(X),A SECTORS/TRACK SHIFT A,LO,2 *4 COPY A,UF:BCT(Y) DMA BYTE COUNT COPY HEAD,A 0 OR 1 COPY A,UF:HD(Y) HEAD ADR COPY UNIT,A COPY A,UF:US(Y) UNIT SELECT COPY N,A COPY A,UF:N(Y) BYTES/SECTOR CODE COPY SCFMT(X),A COPY A,UF:SC(Y) SECTORS/TRACK COPY GPLFMT(X),A COPY A,UF:GPL(Y) GAP LENGTH COPY PATTERN,A COPY A,UF:D(Y) DATA PATTERN COPY DENSITY,A DENSITY = 0  (SINGLE) OR 1 (DOUBLE) COPY A,UF:MF(Y) DENSITY = 0 OR 1 JSK UFDC * CHECK FOR ERRORS! RETURN ERROR CODE IN A REG GETERR COPY K,X COPY A,AREG(X) SAVE A REG COPY Y,YSAVE EXIT TITL BUFFER OUTPUT ROUTINE - WRITE A SECTOR SYSDEF OUTPUT ENDEF NAM OUTPUT OUTPUT ENTRY * WRITE SECTOR FROM BUFR * A REG = RECORD LENGTH - ON RETURN IS ERROR CODE COPY A,Q RECORD LENGTH COPY =Y1,Y SCRATCHPAD #1 COPY =UF:WD,A WRITE DATA COPY A,UF:FC(Y) FUNCTION CODE COPY =BUFR,A BUFFER IN RAM COPY A,UF:DMA(Y) DMA ADR COPY Q,A GET RECORD LENGTH COPY N,Q 0,1,2 COPY Q,UF:N(Y) BYTES/SECTOR CODE JEQ Q,$+5 RECORD LENGTH OK, N=0 CLSN Q,=1 SHIFT A,LO,1 N=1, RECD LENGTH *2 CLSN Q,=2 SHIFT A,LO,2 N=2, RECD LENGTH *4 COPY A,UF:BCT(Y) DMA BYTE COUNT COPY DENSITY,A 0 OR 1 COPY A,UF:MF(Y) DENSITY COPY =0,A COPY A,UF:MT(Y) SINGLE SIDE COPY HEAD,A COPY A,UF:HD(Y) HEAD ADR 0 OR 1 COPY UNIT,A COPY A,UF:US(Y) UNIT SELECT COPY TRM,A COPY A,UF:C(Y) CYL NUMBER COPY SECTOR,A COPY A,UF:R(Y) SECTOR NUMBER COPY SC,A COPY A,UF:EOT(Y) SECTORS/TRACK COPY GPL,A COPY A,UF:GPL(Y) GAP LENGTH COPY =128,A COPY A,UF:DTL(Y) 128 BYTES/SECTOR (IF N=0) JSK UFDC * CHECK FOR ERRORS! RETURN ERROR CODE IN A REG GETERR COPY K,X COPY A,AREG(X) SAVE A REG COPY Y,YSAVE EXIT TITL BUFFER I NPUT ROUTINE - READ A SECTOR SYSDEF INPUT ENDEF NAM INPUT INPUT ENTRY * READ SECTOR INTO INBUFR * THE RECORD LENGTH IS 128,256,512 FOR N=0,1,2 * A REG = RETURNED ERROR CODE COPY =Y1,Y SCRATCHPAD #1 COPY =UF:RD,A READ DATA COPY A,UF:FC(Y) FUNCTION CODE COPY =INBUFR,A INPUT BUFFER IN RAM COPY A,UF:DMA(Y) DMA ADR COPY NBYTES,A RECORD LENGTH COPY A,UF:BCT(Y) DMA BYTE COUNT COPY DENSITY,A 0 OR 1 COPY A,UF:MF(Y) DENSITY COPY N,A 0,1,2 COPY A,UF:N(Y) BYTES/SECTOR CODE COPY =0,A COPY A,UF:MT(Y) SINGLE SIDE COPY =0,A COPY A,UF:SK(Y) DO NOT SKIP THIS SECTOR! COPY HEAD,A COPY A,UF:HD(Y) HEAD ADR 0 OR 1 COPY UNIT,A COPY A,UF:US(Y) UNIT SELECT COPY TRM,A COPY A,UF:C(Y) CYL NUMBER COPY SECTOR,A COPY A,UF:R(Y) SECTOR NUMBER COPY SC,A COPY A,UF:EOT(Y) SECTORS/TRACK COPY GPL,A COPY A,UF:GPL(Y) GAP LENGTH COPY =128,A COPY A,UF:DTL(Y) 128 BYTES/SECTOR (IF N=0) JSK UFDC * CHECK FOR ERRORS! RETURN ERROR CODE IN A REG GETERR COPY K,X COPY A,AREG(X) SAVE A REG COPY Y,YSAVE EXIT TITL MISC SUBROUTINES FATAL PUSH :40 SAVE REGS COPY BSTAT:2,A BUMP FATAL ERROR COUNTER ADD =1,A JNE A,NEWFATL SUB =1,A DO NOT WRAP AROUND NEWFATL COPY A,BSTAT:2 POP RSK SPACE 5 NONFATAL PUSH :40 SAVE REGS COPY BSTAT:3,A BUMP SOFT ERROR COUNTER IF FIRST SOFT ERROR IN OPERATION JLT A,SAMESOFT IF ERROR FLAG IS SET THEN DONT BUMP ADD =1,A JNE A,NOWRAP SUB =1,A DO NOT WRAP AROUND NOWRAP SBIT 15,A FLAG THAT A SOFT ERROR OCCURED IN OPERATION COPY A,BSTAT:3 SAMESOFT POP RSK END COPY Y,YSAVE EXIT TITL MISC SUBRO’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I  ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I! ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I" ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I# ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I$ ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I% ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I& ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’Ixe810817133116810817133116810817133116eú*810817133116810817133116810817013916e' 810817133116810817133116810817133116e810817133116810817133116810817133116810817133116810817133116810817133116e£8108140149482581081401495875810814014958 e%H8108140150105081081401503325810814015033 e78108140150365081081401504225810814015042  e:Ï8108140150532581081401505775810814015057 (  e;6jÛ8108140151010081081401513125810814015131  eqB8108140151347581081401513875810814015138  erT§Û8108140151422581081401522575810814015225  eQ8108140152292581081401523350810814015233 e ›8108140152370081081401524550810814015245 e<58108140152490081081401530675810814015306 e:2) b78108140153097581081401533550810814015335 ÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð. HFT:UFDC:1 OBJHFT:UFDC:2 OBJHFT:UFDC:3 OBJ HFT:FDC:ASMJCL HFT4 BIN HFT:FDC:PRNJCL HFT:UFDC:2 ASM HFT:FDC:LNKJCLHFT:UFDC MACHFT:UFDC:3 ASMHFT:UFDC:1 ASM* LINK HFT4.BIN=HFT:EXEC(R=C000)+ HFT:UFDC:1(U)+ HFT:UFDC:2(U)+ HFT:UFDC:3(U)+ HFT 810817133116810817133116810817133116 TITL MDIAG:UFDC DEFINITION FILE FOR TEST MONITOR AND TEST SHEDULER (84-93720-60) (A000) TITL MACRO DEFINITIONS TEXT MACRO CALL O:MSG,=CO,!LEN2,=!MSG2 JMP !XIT2 EXIT LPOOL !MSG2 EQU $ IFT #(3,?) BYTE #(1),#(2),#(3) ENDC IFF #(3,?) IFT #(2,?) BYTE #(1),#(2) ENDC IFF #(2,?) BYTE #(1) ENDC ENDC !LEN2 WORD $-!MSG2*2 !XIT2 EQU $ ENDM SPACE 5 HEX MACRO COPY #(1),A GET ARG TO PRINT COPY A,UF:TMP(Y) SAVE IN SCRATCH RAM CALL PRTHEX,=CO,UF:TMP ENDM TITL USEFUL EQUATES SLASH EQU '/' UP EQU '^' UP ARROW FOR CRT BACK EQU '_' BACK ARROW FOR CRT POUND EQU '#' NL EQU :00 NULL BEL EQU :07 BELL (ALARM) FOR CRT MIN1 EQU -1 NTESTS EQU 11 NUMBER OF DEFINED TESTS SPACE 1 ABS :32 AVAILABLE RAM :32-:3FF SPACE 1 * TEST CONTROL BLOCK SPACE 1 TESTS RES NTESTS NTESTS DIFFERENT TESTS TO RUN (1-NTESTS) INTDIS RES 1 0=NO INTERRUPTS, 1=INTERRUPTS ON DRIVE RES 1 0=FLOPPY 1=MINIFLOPPY STEPINV RES 1 0=NO INVERT, 1=INVERT SRT RES 1 :0-:F STEP RATE TIME UNITS RES 4 4 UNITS TO TEST (1-4) TRACKS RES 2 LOW TRACK, HIGH TRACK SECTORS RES 2 LOW SECTOR, HIGH SECTOR HEADS RES 1 0=HEAD 0, 1=HEAD 1, 2=BOTH HEADS DENSITY RES 1 0=SINGLE, 1=DOUBLE N RES 1 0=128, 1=256, 2=512 BYTES/SECTOR PATTERN RES 1 ONE BYTE DATA PATTERN DEVADR RES 1 DEVICE ADR OF UFDC SPACE 1 PTR RES 1 TEST POINTER/ UNIT POINTER TRM RES 1 TERMINAL CHAR/ CURRENT TRACK NBYTES RES 1 128, 256, 512 BYTES/SECTOR SC RES 1 SECTORS/TRACK GPL RES 1 GAP LENGTH (READ/WRITE) UNIT RES 1 CURRENT UNIT (0-3) SECTOR RES 1 CURRENT SECTOR SECOUNT RES 1 SECTOR COUNT - USED TO ALTERNATE SECTORS HEAD RES 1 CURRENT HEAD 0 OR 1 BUFR RES 512 TWO 256 WORD BUFFERS (OUTPUT) INBUFR RES 256 ONE 256 WORD BUFFER (INPUT) TECHTEST RES 1 0=NOT TECH TEST MODE, 1=YES MISSED RES 1 0=NOT A MISMATCH, 1=MISMATCH YSAVE RES 1 LAST Y SCRATCHPAD SCRTCH RES 1 SCRATC LOC FOR HEX PRINT MACRO Y1 RES 64 Y SCRATCHPAD #1 FOR UFDC Y2 RES 64 Y SCRATCHPAD #2 FOR UFDC SPACE 1 END TITL UFDC EQUATES AND MACROS 9/12/80 * UFDC CONTROL BLOCK EQUATES (OFF Y REG) * NUMBERS CANNOT BE REASSIGNED * SECTOR ID INFORMATION BEFORE COMMAND EXECUTION * UF:C EQU 0 CYLINDER NUMBER 0 TO 76 UF:H EQU 1 HEAD ADDRESS 0 OR 1 UF:R EQU 2 RECORD (SECTOR) NUMBER UF:N EQU 3 NUMBER OF BYTES IN A SECTOR * * OTHER INPUTS BEFORE COMMAND EXECUTION * UF:EOT EQU 4 END OF TRACK - FINAL SECTOR NUMBER UF:GPL EQU 5 GAP LENGTH BETWEEN SECTORS UF:DTL EQU 6 DATA LENGTH WHEN N=0 UF:SC EQU 7 SECTORS PER CYLINDER UF:D EQU 8 DATA BYTE TO WRITE INTO SECTOR UF:STP EQU 9 IF STP=1, SCAN EACH SECTOR. IF 2, SCAN ALTERNATE SECTORS UF:NCN EQU 10 NEW CYLINDER NUMBER * * STATUS INFORMATION AFTER COMMAND EXECUTION * UF:ST0 EQU 11 STATUS BYTE 0 UF:ST1 EQU 12 STATUS BYTE 1 UF:ST2 EQU 13 STATUS BYTE 2 UF:ST3 EQU 18 STATUS BYTE 3 UF:PCN EQU 19 PRESENT CYLINDER NUMBER * * SECTOR ID INFORMATION AFTER COMMAND EXECUTION * UF:C2 EQU 14 C+ YLINDER NUMBER 0 TO 76 UF:H2 EQU 15 HEAD ADDRESS 0 OR 1 UF:R2 EQU 16 RECORD (SECTOR) NUMBER UF:N2 EQU 17 NUMBER OF BYTES IN A SECTOR * * OTHER CONTROL PARAMETERS * UF:DA EQU 20 UFDC DEVICE ADDRESS UF:FC EQU 21 FUNCTION CODE UF:ERR EQU 22 ERROR CODE UF:TMP EQU 23 TEMPORARY UF:STAT EQU 24 MAIN STATUS REGISTER UF:DMA EQU 25 DMA ADDRESS UF:BCT EQU 26 DMA BYTE COUNT UF:MODE EQU 27 MODE REGISTER UF:HD EQU UF:H SAME AS HEAD ADDRESS 0 OR 1 UF:US EQU 28 UNIT SELECT 0 TO 3 UF:MT EQU 29 IF 0, SINGLE TRACK. IF 1, MULTIPLE TRACK. UF:MF EQU 30 IF 0, SINGLE DENSITY. IF 1, DOUBLE DENSITY. UF:SK EQU 31 IF 0, NO SKIP. IF 1, SKIP DELETED DATA. UF:SRT EQU 32 STEP RATE TIME 0 TO 15 = 1 TO 16 MILLISEC UF:HUT EQU 33 HEAD UNLD TIME 0 TO 15 = 0 TO 240 MILLISEC UF:HLT EQU 34 HEAD LOAD TIME 0 TO 127= 2 TO 256 MILLISEC * * FUNCTION CODES * UF:SEN EQU 0 READ MAIN STATUS REGISTER UF:INIT EQU 1 INITIALIZE UFDC (RESET, SPECIFY) * UF:RD EQU 2 READ DATA UF:RDEL EQU 3 READ DELETED DATA UF:RDID EQU 4 READ ID UF:RDTR EQU 5 READ A TRACK * UF:WD EQU 6 WRITE DATA UF:WDEL EQU 7 WRITE DELETED DATA * UF:SCEQ EQU 8 SCAN EQUAL UF:SCLE EQU 9 SCAN LOW OR EQUAL UF:SCHE EQU 10 SCAN HIGH OR EQUAL * UF:RECAL EQU 11 RECALIBRATE UF:SEEK EQU 12 SEEK * UF:SDS EQU 13 SENSE DRIVE STATUS UF:SIS EQU 14 SENSE INTERRUPT STATUS * UF:FMT EQU 15 FORMAT A TRACK * * ERROR CODES * UFDC:REP EQU :F0 TOO MANY REPEATS, BAD STATUS UFDC:NIA EQU :F1 NO INTERRUPT AVAILABLE (TIME OUT) NORML: EQU 0 NO ERROR * * WAIT CONSTANTS FOR UFDC INTERRUPTS * DLYSHRT EQU -3 0003 MILLISEC DELAY COUNT (READY INTERRUPT) DLYMEDM EQU -600 0600 MILLISEC DELAY COUNT (SINGLE CYLINDER I/O) DLYLONG EQU -1500 1500 MILLISEC DELAY COUNT (SEEK, RECALIBRATE) END QU 11 RECALIBRATE UF:SEEK EQU 12 SEEK * UF:SDS EQU 13 SENSE DRIVE STATUS UF:SIS EQU 14 SENSE INTERRUP TITL UFDC INTERFACE (84-93720-22) (A000) TITL ACCESS MANAGER * REFER TO UFDC DEFINITION FILE * OVERLAPPED SEEKS ARE POSSIBLE - THE SENSE INTERRUPT STATUS COMMAND MUST BE * USED TO TERMINATE EACH SEEK OR RECALIBRATE OPERATION * * ALL REGISTERS PRESERVED * Y = UFDC CONTROL BLOCK (64 WORDS) * ROM REL NAM UFDC * UFDC EQU $ PUSH :40 SAVE REGISTERS COPY =0,A CLEAR RESULT STATUS WORDS COPY A,UF:ST0(Y) COPY A,UF:ST1(Y) COPY A,UF:ST2(Y) COPY A,UF:ST3(Y) COPY A,UF:C2(Y) COPY A,UF:H2(Y) COPY A,UF:R2(Y) COPY A,UF:N2(Y) * COPY UF:FC(Y),A GET FUNCTION CODE AND =:F,A ENSURE RANGE 0 TO 15 XNX A JMP *$+1 SPLATTER TO CORRECT OPERATION WORD SEN READ MAIN STATUS REGISTER WORD INIT INITIALIZE UFDC (RESET, SPECIFY) WORD RD READ DATA WORD RDEL READ DELETED DATA WORD RDID READ ID WORD RDTR READ A TRACK WORD WD WRITE DATA WORD WDEL WRITE DELETED DATA WORD SCEQ SCAN EQUAL WORD SCLE SCAN LOW OR EQUAL WORD SCHE SCAN HIGH OR EQUAL WORD RECAL RECALIBRATE WORD SEEK SEEK WORD SDS SENSE DRIVE STATUS WORD SIS SENSE INTERRUPT STATUS WORD FMT FORMAT A TRACK TITL INITIAL UFDC OPERATIONS * READ MAIN STATUS REGISTER SEN EQU $ COPY UF:DA(Y),Q GET DEVICE ADR XNX Q IN 1,Q GET STATUS OF UFDC COPY Q,UF:STAT(Y) STORE STATUS COPY =NORML:,Q NO ERROR COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL SPACE 1 * INITIALIZE UFDC (RESET, SPECIFY, READY INTERRUPTS) INIT EQU $ * RESET UFDC COPY UF:DA(Y),Q GET DEVICE ADR COPY =0,A RESET UFDC MODE WORD XNX Q SELP A,3 SEND RESET TO UFDC COPY =-255,A IJNE A,$ WAIT FOR UFDC TO,  RESET 30 MICROSEC COPY =0,A ZERO COPY A,UF:STAT(Y) STATUS WORD COPY UF:MODE(Y),A GET MODE REGISTER TBIT 0,A INTERRUPTS? JF OV,$+4 NO COPY =VECTOR,X YES, GET VECTOR ADR XNX Q SELP X,1 SEND VECTOR TO UFDC XNX Q SELP A,3 SEND MODE WORD TO UFDC * WAIT FOR A READY INTERRUPT COPY =DLYSHRT,A SHORT JSK WAIT WAIT FOR INTERRUPT JNE Q,INITER NONE * ACKNOWLEDGE READY INTERRUPT WITH UP TO 4 SENSE INTERRUPT STATUS COMMANDS * ONE FOR EACH READY DRIVE IN THE CURRENT BANK (5 OR 8 INCH) * * IF UNIT 0 READY, BIT 0 OF UF:STAT ON * IF UNIT 1 READY, BIT 1 OF UF:STAT ON * IF UNIT 2 READY, BIT 2 OF UF:STAT ON * IF UNIT 3 READY, BIT 3 OF UF:STAT ON * COPY =-4,X UP TO 4 DRIVES READY INITACK COPY =:108,A SIS OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,INITER ON ERROR *  JSK UF:GET READ ST0 JNE Q,INITER ON ERROR CLSN A,=:80 INVALID CMD? JMP INITSP YES, NO MORE READY DRIVES COPY A,UF:ERR(Y) SAVE ST0 JSK UF:GET READ PCN JNE Q,INITER ON ERROR COPY UF:ERR(Y),A RESTORE ST0 AND =:3,A OBTAIN UNIT NUMBER 0 TO 3 SHIFT A,LO,4 SHIFT LEFT 1 NYBLE COPY UF:STAT(Y),Q GET STATUS WORD XNX A UNIT NUMBER 0 TO 3 IN BIT FIELD SBIT 0,Q SET THE BIT FOR THIS UNIT COPY Q,UF:STAT(Y) NEW STATUS WORD IJNE X,INITACK TRY FOR ANOTHER DRIVE * SPECIFY COMMAND INITSP COPY =:103,A SPECIFY OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,INITER ON ERROR COPY UF:SRT(Y),A STEP RATE TIME AND =:F,A 0 TO 15 SHIFT A,LO,4 SHIFT LEFT 1 NYBLE COPY UF:HUT(Y),X HEAD UNLD TIME AND =:F,X 0 TO 15 OR X,A SRT, HUT IN A REG JSK UF:PUT SEND TO UFDC JNE Q,INITER ON ERROR COPY UF:HLT(Y),A HEAD LOAD TIME AND =:7F,A 0 TO 127 SHIFT A,LO,1 HLT WITH ND=0 (ALWAYS USING DMA) JSK UF:PUT SEND TO UFDC JNE Q,INITER ON ERROR * COPY =NORML:,Q NO ERROR INITER COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL TITL READ REQUESTS * READ DATA RD EQU $ JSK DMA SEND DMA ADR AND BYTE COUNT TO UFDC JSK MTMFSK MTMFSK IN A REG OR =:106,A READ DATA OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,RDER ON ERROR JSK HDUS HD, US IN A REG JSK UF:PUT SEND TO UFDC JNE Q,RDER ON ERROR JSK UF:SETUP SEND C,H,R,N,EOT,GPL JNE Q,RDER ON ERROR COPY UF:DTL(Y),A DATA LENGTH JSK UF:PUT SEND TO UFDC JNE Q,RDER ON ERROR * COPY =DLYMEDM,A MEDIUM JSK WAIT WAIT FOR INTERRUPT JNE Q,RDER NONE * JSK UF:RSULT READ ST0,ST1,ST2,C2,H2,R2,N2 RDER COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL * READ DELETED DATA RDEL EQU $ JSK DMA SEND DMA ADR AND BYTE COUNT TO UFDC JSK MTMFSK MTMFSK IN A REG OR =:10C,A READ DELETED DATA OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,RDELER ON ERROR JSK HDUS HD, US IN A REG JSK UF:PUT SEND TO UFDC JNE Q,RDELER ON ERROR JSK UF:SETUP SEND C,H,R,N,EOT,GPL JNE Q,RDELER ON ERROR COPY UF:DTL(Y),A DATA LENGTH JSK UF:PUT SEND TO UFDC JNE Q,RDELER ON ERROR * COPY =DLYMEDM,A MEDIUM JSK WAIT WAIT FOR INTERRUPT JNE Q,RDELER NONE * JSK UF:RSULT READ ST0,ST1,ST2,C2,H2,R2,N2 RDELER COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL TITL * READ ID RDID EQU $ JSK MTMFSK MTMFSK IN A REG AND =:40,A MF IN A REG OR =:10A,A READ ID OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,RDIDER ON ERROR JSK HDUS HD, US IN A REG JSK UF:PUT SEND TO UFDC JNE Q,RDIDER ON ERROR * COPY =DLYMEDM,A MEDIUM JSK WAIT WAIT FOR INTERRUPT JNE Q,RDIDER NONE * JSK UF:RSULT READ ST0,ST1,ST2,C2,H2,R2,N2 RDIDER COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL * RE- AD A TRACK RDTR EQU $ JSK DMA SEND DMA ADR AND BYTE COUNT TO UFDC JSK MTMFSK MTMFSK IN A REG AND =:60,A MFSK IN A REG OR =:102,A READ TRACK OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,RDTRER ON ERROR JSK HDUS HD, US IN A REG JSK UF:PUT SEND TO UFDC JNE Q,RDTRER ON ERROR JSK UF:SETUP SEND C,H,R,N,EOT,GPL JNE Q,RDTRER ON ERROR COPY UF:DTL(Y),A DATA LENGTH JSK UF:PUT SEND TO UFDC JNE Q,RDTRER ON ERROR * COPY =DLYMEDM,A MEDIUM JSK WAIT WAIT FOR INTERRUPT JNE Q,RDTRER NONE * JSK UF:RSULT READ ST0,ST1,ST2,C2,H2,R2,N2 RDTRER COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL TITL WRITE REQUESTS * WRITE DATA WD EQU $ JSK DMA SEND DMA ADR AND BYTE COUNT TO UFDC JSK MTMFSK MTMFSK IN A REG AND =:C0,A MTMF IN A REG OR =:05,A WRITE DATA OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,WDER ON ERROR JSK HDUS HD, US IN A REG JSK UF:PUT SEND TO UFDC JNE Q,WDER ON ERROR JSK UF:SETUP SEND C,H,R,N,EOT,GPL JNE Q,WDER ON ERROR COPY UF:DTL(Y),A DATA LENGTH JSK UF:PUT SEND TO UFDC JNE Q,WDER ON ERROR * COPY =DLYMEDM,A MEDIUM JSK WAIT WAIT FOR INTERRUPT JNE Q,WDER NONE * JSK UF:RSULT READ ST0,ST1,ST2,C2,H2,R2,N2 WDER COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL SPACE 1 * WRITE DELETED DATA WDEL EQU $ JSK DMA SEND DMA ADR AND BYTE COUNT TO UFDC JSK MTMFSK MTMFSK IN A REG AND =:C0,A MTMF IN A REG OR =:09,A WRITE DELETED DATA OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,WDELER ON ERROR JSK HDUS HD, US IN A REG JSK UF:PUT SEND TO UFDC JNE Q,WDELER ON ERROR JSK UF:SETUP SEND C,H,R,N,EOT,GPL JNE Q,WDELER ON ERROR COPY UF:DTL(Y),A DATA LENGTH JSK UF:PUT SEND TO UFDC JNE Q,WDELER ON ERROR * COPY =DLYMEDM,A MEDIUM JSK WAIT WAIT FOR INTERRUPT JNE Q,WDELER NONE * JSK UF:RSULT READ ST0,ST1,ST2,C2,H2,R2,N2 WDELER COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL  TITL SCAN REQUESTS * SCAN EQUAL SCEQ EQU $ JSK DMA SEND DMA ADR AND BYTE COUNT TO UFDC JSK MTMFSK MTMFSK IN A REG OR =:111,A SCAN EQUAL OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,SCEQER ON ERROR JSK HDUS HD, US IN A REG JSK UF:PUT SEND TO UFDC JNE Q,SCEQER ON ERROR JSK UF:SETUP SEND C,H,R,N,EOT,GPL JNE Q,SCEQER ON ERROR COPY UF:STP(Y),A SCAN EACH SECTOR OR ALTERNATE JSK UF:PUT SEND TO UFDC JNE Q,SCEQER ON ERROR * COPY =DLYMEDM,A MEDIUM JSK WAIT WAIT FOR INTERRUPT JNE Q,SCEQER NONE * JSK UF:RSULT READ ST0,ST1,ST2,C2,H2,R2,N2 SCEQER COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL * SCAN LOW OR EQUAL SCLE EQU $ JSK DMA SEND DMA ADR AND BYTE COUNT TO UFDC JSK MTMFSK MTMFSK IN A REG OR =:119,A SCAN LOW OR EQUAL OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,SCLEER ON ERROR JSK HDUS HD, US IN A REG JSK UF:PUT SEND TO UFDC JNE Q,SCLEER ON ERROR JSK UF:SETUP SEND C,H,R,N,EOT,GPL JNE Q,SCLEER ON ERROR COPY UF:STP(Y),A SCAN EACH SECTOR OR ALTERNATE JSK UF:PUT SEND TO UFDC JNE Q,SCLEER ON ERROR *  COPY =DLYMEDM,A MEDIUM JSK WAIT WAIT FOR INTERRUPT JNE Q,SCLEER NONE * JSK UF:RSULT READ ST0,ST1,ST2,C2,H2,R2,N2 SCLEER COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL * SCAN HIGH OR EQUAL SCHE EQU $ JSK DMA SEND DMA ADR AND BYTE COUNT TO UFDC JSK MTMFSK MTMFSK IN A REG OR =:11D,A SCAN HIGH OR EQUAL OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,SCHEER ON ERROR JSK HDUS HD, US IN A REG JSK UF:PUT SEND TO UFDC JNE Q,SCHEER ON ERROR JSK UF:SETUP SEND C,H,R,N,EOT,GPL JNE Q,SCHEER ON ERROR COPY UF:STP(Y. ),A SCAN EACH SECTOR OR ALTERNATE JSK UF:PUT SEND TO UFDC JNE Q,SCHEER ON ERROR * COPY =DLYMEDM,A MEDIUM JSK WAIT WAIT FOR INTERRUPT JNE Q,SCHEER NONE * JSK UF:RSULT READ ST0,ST1,ST2,C2,H2,R2,N2 SCHEER COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL TITL SEEK REQUESTS * RECALIBRATE RECAL EQU $ COPY =:107,A RECALIBRATE OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,RECALER ON ERROR JSK HDUS HD, US IN A REG JSK UF:PUT SEND TO UFDC JNE Q,RECALER ON ERROR * COPY =NORML:,Q NO ERROR RECALER COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL * SEEK SEEK EQU $ COPY =:10F,A SEEK OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,SEEKER ON ERROR  JSK HDUS HD, US IN A REG JSK UF:PUT SEND TO UFDC JNE Q,SEEKER ON ERROR COPY UF:NCN(Y),A NEW CYLINDER NUMBER JSK UF:PUT SEND TO UFDC JNE Q,SEEKER ON ERROR * COPY =NORML:,Q NO ERROR SEEKER COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL TITL STATUS REQUESTS * SENSE DRIVE STATUS SDS EQU $ COPY =:104,A SENSE DRIVE STATUS OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,SDSER ON ERROR JSK HDUS HD, US IN A REG JSK UF:PUT SEND TO UFDC JNE Q,SDSER ON ERROR * JSK UF:GET READ ST3 JNE Q,SDSER ON ERROR COPY A,UF:ST3(Y) STORE ST3 SDSER COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL * SENSE INTERRUPT STATUS SIS EQU $ COPY =DLYLONG,A LONG  JSK WAIT WAIT FOR INTERRUPT JNE Q,SISER NONE * COPY =:108,A SIS OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,SISER ON ERROR *  JSK UF:GET READ ST0 JNE Q,SISER ON ERROR COPY A,UF:ST0(Y) STORE ST0 JSK UF:GET READ PCN JNE Q,SISER ON ERROR COPY A,UF:PCN(Y) STORE PCN COPY =NORML:,Q NO ERROR SISER COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL TITL FORMAT REQUEST * FORMAT A TRACK FMT EQU $ JSK DMA SEND DMA ADR AND BYTE COUNT TO UFDC JSK MTMFSK MTMFSK IN A REG AND =:40,A MF IN A REG OR =:0D,A FORMAT OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,FMTER ON ERROR JSK HDUS HD, US IN A REG JSK UF:PUT SEND TO UFDC JNE Q,FMTER ON ERROR COPY UF:N(Y),A NUMBER OF BYTES IN A SECTOR JSK UF:PUT SEND TO UFDC JNE Q,FMTER ON ERROR COPY UF:SC(Y),A SECTORS PER CYLINDER JSK UF:PUT SEND TO UFDC JNE Q,FMTER ON ERROR COPY UF:GPL(Y),A GAP LENGTH BETWEEN SECTORS JSK UF:PUT SEND TO UFDC JNE Q,FMTER ON ERROR COPY UF:D(Y),A DATA BYTE TO WRITE INTO SECTOR JSK UF:PUT SEND TO UFDC JNE Q,FMTER ON ERROR * COPY =DLYMEDM,A MEDIUM JSK WAIT WAIT FOR INTERRUPT JNE Q,FMTER NONE * JSK UF:RSULT READ ST0,ST1,ST2,C2,H2,R2,N2 FMTER COPY Q,UF:ERR(Y) STORE ERROR POP RSK LPOOL TITL SETUP AND RESULT SUBROUTINES * A = TEMPORARY * Q = RETURN CODE * X = TEMPORARY * Y = UFDC CONTROL BLOCK SPACE 1 * SUBROUTINE UF:SETUP - WRITE TO UFDC : C, H, R, N, EOT, GPL SPACE 1 UF:SETUP EQU $ COPY =0,X SET UP FOR LOOP UF:SETLP XNX X INDEX INTO UFDC BLOCK COPY UF:C(Y),A GET SETUP PARAMETER JSK UF:PUT SEND TO UFDC JNE Q,UF:SETDN BAD TRANSMISSION  ADD =1,X BUMP COUNT/PTR CLSN X,=6 COMPARE TO LIMIT JMP UF:SETDN FINISHED JMP UF:SETLP MORE UF:SETDN RSK LPOOL SPACE 3 * SUBROUTINE UF:RSULT - READ UFDC : ST0, ST1, ST2, C2, H2, R2, N2 SPACE 1 UF:RSULT EQU $ COPY =0,X SET UP FOR LOOP UF:RSULP JSK UF:GET GET RESULT FROM UFDC JNE Q,UF:RSUDN BAD RECEPTION XNX X INDEX INTO UFDC BLOCK COPY A,UF:ST0(Y) STORE RESULT ADD =1,X BUMP COUNT/PTR CLSN X,=7 COMPARE TO LIMIT JMP UF:RSUDN FINISHED JMP UF:RSULP MORE UF:RSUDN RSK LPOOL TITL WAIT FOR INTERRUP/ T OR INTERRUPT BIT IN STATUS REGISTER * SUBROUTINE WAIT - WAIT FOR INTERRUPT THE COUNT IN A REG. * Q = RETURN CODE SPACE 1 WAIT EQU $ COPY UF:MODE(Y),Q MODE REGISTER TBIT 0,Q INTERRUPTS? JT OV,WAITINT YES SPACE 3 * WAIT FOR INTERRUPT BIT WAITBIT COPY UF:DA(Y),Q GET DEVICE ADR XNX Q IN 1,Q GET STATUS OF UFDC TBIT 8,Q GET INTERRUPT BIT COPY =NORML:,Q NO ERROR AT THIS POINT JF OV,WAITRN INTERRUPT HAS OCCURRED, NO ERROR COPY =-180,Q IJNE Q,$ WAIT HERE FOR 1 MILLISEC IJNE A,WAITBIT NO INTERRUPT YET, TRY AGAIN COPY =UFDC:NIA,Q TIME OUT, NO INTERRUPT AVAILABLE WAITRN RSK SPACE 3 * WAIT FOR INTERRUPT WAITINT SIN 2 RBIT 12,S ARM EOB INT UIS * LOOP HERE UNTIL INTERRUPT OR TIME OUT COPY =-180,Q IJNE Q,$ WAIT HERE FOR 1 MILLISEC IJNE A,$-2 REPEAT COUNT IN A REG COPY =UFDC:NIA,Q ERROR, NO INTERRUPT SIN 2 SBIT 12,S DISARM EOB INT UIS RSK ERROR RETURN SPACE 5 * HERE IS THE INTERRUPT SERVICE ROUTINE WAITLOC SIN 2 SBIT 12,S DISARM EOB INT UIS COPY =1,Q ADD Q,K USE PREVIOUS RETURN ADR COPY =0,Q NO ERROR, INTERRUPT OCCURRED RSK NORMAL RETURN SPACE 5 * HERE IS THE INTERRUPT VECTOR VECTOR JSK *$+1 WORD WAITLOC TO INTERRUPT SERVICE ROUTINE TITL SUBROUTINES HDUS AND MTMFSK TO PACK A REG - DMA TO SEND DMA STUFF * A = RESULT WORD * Q = TEMPORARY * X = NOT USED * Y = UFDC CONTROL BLOCK SPACE 1 HDUS EQU $ COPY UF:HD(Y),A HEAD ADR AND =:1,A 0 OR 1 SHIFT A,LO,2 SHIFT LEFT 2 BITS COPY UF:US(Y),Q UNIT SELECT AND =:3,Q 0 TO 3 OR Q,A HD, US IN A REG RSK SPACE 5 MTMFSK EQU $ COPY UF:MT(Y),A MULTIPLE TRACK AND =:1,A 0 OR 1 SHIFT A,LO,7 SHIFT LEFT TO BIT 7 COPY UF:MF(Y),Q DOUBLE DENSITY AND =:1,Q 0 OR 1 SHIFT Q,LO,6 SHIFT LEFT TO BIT 6 OR Q,A MT, MF IN A REG COPY UF:SK(Y),Q SKIP AND =:1,Q 0 OR 1 SHIFT Q,LO,5 SHIFT LEFT TO BIT 5 OR Q,A MT, MF, SK IN A REG RSK SPACE 5 DMA EQU $ COPY UF:DA(Y),Q GET DEVICE ADR COPY UF:DMA(Y),A DMA ADR XNX Q SELP A,0 SEND DMA ADR TO UFDC COPY UF:BCT(Y),A DMA BYTE COUNT XNX Q SELP A,2 SEND DMA BYTE COUNT TO UFDC RSK TITL UFDC I/O ROUTINES * NOTE THAT UF:GET WILL CLEAR THE UPPER BYTE OF A REG SPACE 1 * A = BYTE TO READ OR WRITE TO UFDC (9 BIT WORD IN UF:COM) * Q = RETURN CODE * X = NOT USED * Y = UFDC CONTROL BLOCK SPACE 1 UF:GET EQU $ GET BYTE FROM UFDC COPY =-200,Q 200 ATTEMPTS POSSIBLE COPY Q,UF:TMP(Y) INITIALIZE MAXIMUM REPEATS UF:GETLP COPY UF:DA(Y),Q GET DEVICE ADR XNX Q IN 1,Q GET STATUS OF UFDC AND =:D0,Q RDY,DIR,BSY CLSN Q,=:D0 RDY=1,DIR=1,BSY=1? JMP UF:GETIT YES, READ RESULT IMS UF:TMP(Y) NO, READ STATUS AGAIN JMP UF:GETLP UNLESS TOO MANY REPEATS COPY =UFDC:REP,Q TOO MANY REPEATS JMP UF:GETRN ERROR RETURN UF:GETIT COPY UF:DA(Y),Q GET DEVICE ADR XNX Q IN 0,A INPUT BYTE FROM UFDC AND =:FF,A CLEAR UPPER BYTE OF A REG COPY =NORML:,Q NO ERROR UF:GETRN RSK SPACE 1 UF:PUT EQU $ PUT BYTE TO UFDC COPY =-200,Q 200 ATTEMPTS POSSIBLE COPY Q,UF:TMP(Y) INITIALIZE MAXIMUM REPEATS UF:PUTLP COPY UF:DA(Y),Q GET DEVICE ADR XNX Q IN 1,Q GET STATUS OF UFDC AND =:D0,Q RDY,DIR,BSY CLSN Q,=:90 RDY=1,DIR=0,BSY=1? JMP UF:PUTIT YES, PUT BYTE TO UFDC IMS UF:TMP(Y) NO, READ STATUS AGAIN JMP UF:PUTLP UNLESS TOO MANY REPEATS COPY =UFDC:REP,Q TOO MANY REPEATS JMP UF:PUTRN ERROR RETURN UF:PUTIT COPY UF:DA(Y),Q GET DEVICE ADR XNX Q OUT A,0 PUT BYTE TO UFDC COPY =NORML:,Q NO ERROR UF:PUTRN RSK SPACE 3 T0 ITL UF:COM EQU $ PUT COMMAND WORD TO UFDC COPY =-200,Q 200 ATTEMPTS POSSIBLE COPY Q,UF:TMP(Y) INITIALIZE MAXIMUM REPEATS UF:COMLP COPY UF:DA(Y),Q GET DEVICE ADR XNX Q IN 1,Q GET STATUS OF UFDC AND =:D0,Q RDY,DIR,BSY CLSN Q,=:80 RDY=1,DIR=0,BSY=0? JMP UF:COMIT YES, PUT COMMAND WORD TO UFDC IMS UF:TMP(Y) NO, READ STATUS AGAIN JMP UF:COMLP UNLESS TOO MANY REPEATS COPY =UFDC:REP,Q TOO MANY REPEATS JMP UF:COMRN ERROR RETURN UF:COMIT COPY UF:DA(Y),Q GET DEVICE ADR XNX Q OUT A,1 PUT COMMAND WORD TO UFDC COPY =NORML:,Q NO ERROR UF:COMRN RSK LPOOL END ,Q 200 ATTEMPTS POSSIBLE COPY Q,UF:TMP(Y) INITIALIZE MAXIMUM REPEATS UF:COMLP COPY UF:DA(Y),Q GET DEVICE ADR XNX Q IN 1,Q GET STATUS OF UFDC AND =:D0,Q RDY,DIR,BSY CLSN Q,=:80 RDY=1,DIR=0,BSY=0? JMP UF:COMIT YES, PUT COMMAND WORD TO UFDC IMS UF:TMP(Y) NO, READ STATUS AGAIN JMP UF:COMLP UNLESS TOO MANY REPEATS COPY =UFDC:REP,Q TOO MANY REPEATS JMP UF:COMRN ERROR RETURN UF:COMIT COPY UF:DA(Y),Q GET DEVICE ADR XNX Q OUT A,1 PUT COMMAND WORD TO UF TITL SCOUT HARDWARE FUNCTION TEST PROGRAM (84-93720-20) (A000) TITL UNIVERSAL FLOPPY DISK CONTROLLER BAR * * TEST MONITOR FOR SCOUT UNIVERSAL FLOPPY DISK CONTROLLER (73-54124-XX) * BAR NAM HFT:FDC EXTR TSTCNFG,LTSTCNFG EXTR VERIFY,LVERIFY EXTR SYSERR,PRTHEX,FDC:0,FLUSH,O:MSG,O:IO EXTR RECAL,DEBUG4,FAULT * MESSAGE REL BYTE CR,LF,' #54124-00 - SCOUT UNIVERSAL FLOPPY DISK CONTROLLER' BYTE '(C2-D1)' * JUMPTABL REL WORD 24 WORD -1 WORD HFT:FDC * ROM REL BRD:DEF HFT:FDC ENDEF TITL DEFAULTS FOR INTERACTIVE DIALOG QUESTIONS SOFTHRES EQU 16 MAX NUMBER OF SOFT ERRS BEFORE REJECTING BOARD HFT:FDC ENTRY JMP FDCCODE LPOOL * * DIALOG DEFAULT CONSTANTS * DIALOG WORD 1 DO TEST A WORD 6 THEN TEST F (FORMAT) WORD 3 TEST C WORD 5 TEST E WORD 8 TEST H WORD 9 TEST I WORD 10 TEST J WORD 11 TEST K WORD 0 NO TESTS B,D,G WORD 0 WORD 0 WORD 1 USE INTERRUPTS WORD 0 8" DRIVE WORD 1 STEP INVERTED WORD :6 SRT FOR STD FLOPPY DIAUNIT WORD 1 UNIT 0 WORD 2 AND UNIT 1 WORD 0 WORD 0 DIATRK WORD 73 L TRACK WORD 76 H TRACK DIASEC WORD 1 L SECTOR WORD 26 H SECTOR WORD 0 HEAD 0 WORD 1 DOUBLE DENSITY WORD 1 SECTOR SIZE N=1 256 BYTES/SECTOR WORD :C6 PATTERN WORD :30 DEVICE ADR WORD -1 END OF DIALOG TITL DEFAULTS FOR SINGLE SIDED 5 INCH TEST GROUP SS5INTBL WORD 1 TEST A WORD 2 TEST B  WORD 6 TEST FORMAT DOUBLE DENSITY WORD 3 TEST C WORD 4 TEST D WORD 5 TEST E WORD 8 TEST H WORD 9 TEST I WORD 10 TEST J WORD 11 TEST K WORD 0 NO TEST G WORD 1 USE INTERRUPTS WORD 1 5" FLOPPY WORD 0 NO STEP INVERT WORD :F MAX TRACK-TRACK TIME WORD 1 UNITS 0 AND 1 WORD 2 WORD 0 WORD 0 WORD 34 TRACKS 34-39 WORD 39 WORD 1 SECTORS 1-16  WORD 16 WORD 0 HEAD 0 WORD 1 DOUBLE DENSITY WORD 1 256 BYTE SECTORS WORD :C6 PATTERN WORD :30 DEVICE ADDR WORD -1 END-OF-TABLE TITL DEFAULTS FOR SINGLE SIDED 8 INCH CONSOLE GROUP * * DEFAULT TEST CONSTANTS FOR 8" SINGLE SIDED CONSOLE GROUP * SS8INTBL WORD 1 TEST A WORD 2 TEST B WORD 6 TEST F (F1 ORMAT) WORD 3 TEST C WORD 4 TEST D WORD 5 TEST E WORD 8 TEST H WORD 9 TEST I WORD 10 TEST J WORD 11 TEST K WORD 0 NO TEST G WORD 1 INTERRUPTS ON WORD 0 8" FLOPPY DRIVE WORD 1 STEP INVERTED WORD :6 SRT FOR STD FLOPPY WORD 1 UNIT 0 WORD 2 UNIT 1 WORD 0 WORD 0 WORD 73 L TRACK WORD 76 H TRACK WORD 1 L SECTOR WORD 26 H SECTOR WORD 0 HEAD 0 WORD 1 DOUBLE DENSITY WORD 1 SECTOR SIZE N=1 256 BYTES/SECTOR WORD :C6 PATTERN WORD :30 DEVICE ADR WORD -1 END OF DEFAULT TEST TITL DEFAULTS FOR DOUBLE SIDED 5 INCH DRIVE GROUP * * DOUBLE SIDED 5 INCH TABLE * DS5INTBL WORD 1 TEST A WORD 2 TEST B WORD 6 TEST F WORD 3 TEST C WORD 4 TEST D WORD 5 TEST E  WORD 8 TEST H WORD 9 TEST I WORD 10 TEST J WORD 11 TEST K WORD 0 NO TEST G WORD 1 USE INTERRUPTS WORD 1 5" FLOPPY WORD 0 NO STEP INVERT WORD 6 6 MS TRACK TO TRACK WORD 1 UNITS 0 AND 1 WORD 2 WORD 0 WORD 0 WORD 37 TRACKS 37-39 WORD 39 WORD 1 SECTORS 1-16 WORD 16 SECTORS PER TRACK WORD 2 BOTH HEADS WORD 1 DOUBLE DENSITY WORD 1 256 BYTE SECTORS WORD :C6 PATTERN WORD :30 DEVICE ADDR WORD -1 END-OF-TABLE TITL DEFAULTS FOR QUAD DENSITY 8" TEST GROUP * * DOUBLE SIDED 8 INCH DRIVE DEFAULTS * DS8INTBL WORD 1 TEST A WORD 2 TEST B WORD 6 TEST F WORD 3 TEST C WORD 4 TEST D WORD 5 TEST E WORD 8 TEST H WORD 9 TEST I  WORD 10 TEST J WORD 11 TEST K WORD 0 NO TEST F WORD 1 USE INTERRUPTS WORD 0 8" DRIVES WORD 0 DONT INVERT STEP WORD 3 3 MS TRACK TO TRACK WORD 1 UNITS 0 AND 1 WORD 2  WORD 0 WORD 0 WORD 75 TRACKS 75-76 WORD 76 WORD 1 SECTORS 1-26 WORD 26 WORD 2 BOTH HEADS WORD 1 DOUBLE DENSITY WORD 1 256 BYTE SECTORS WORD :C6 PATTERN WORD :30 DEVICE ADDR WORD -1 END-OF-TABLE TITL START TEST FDCCODE EQU $ * * BURN-IN SYSTEM??? * COPY MODEREG,A TBIT REPTFLAG,A BURN-IN BIT JT OV,FDC0 JMP FDC1 IF BURN-IN, JUMP AROUND MSG ROUTINES * * VERIFY TEST CONFIGURATION WITH OPERATOR * FDC0 CALL O:MSG,=CO,LFDCCNFG,=FDCCNFG CALL O:MSG,=CO,LVERIFY,=VERIFY CALL FLUSH,=CR,=CI WAIT FOR CARRAIAGE RETURN * * INTERRUPT TEST (MODIFIED ISOLITE) GOES HERE * * PROGRAM WILL COPY THE INTERRUPT TEST INTO HIGH RAM AND EXECUTE THEN * MUST RETURN TO INTERACTIVE I/O TEST MONITOR * * ALL INTERRUPT VECTORS ARE IN RAM BELOW THE INTERRUPT TEST PROGRAM * * FDC1 NOP INTERRUPT TEST SPACE 5 * * INTERACTIVE TEST? * COPY MODEREG,A TBIT MODEFLAG,A INTERACTIVE BIT JT OV,$+2 JMP SS8INCH NO DIALOG - USE SINGLE SIDE 8 INCH DEFAULT TEST JMP IQ1 * FDCCNFG BYTE 'UNIVERSAL FLOPPY DISK CONTROLLER - PROGRAM REV ' FDCREV BYTE '(A0)' BYTE CR,LF,' FOLLOW TEST SPECIFICATION #58-54124-00' LFDCCNFG WORD $-FDCCNFG*2 TITL INTERACTIVE DIALOG FOR I/O TEST IQ1 CALL Q1 CLSN A,=SLASH JMP IQ1 CLSN A,=UP JMP IQ1 CLSN A,=BACK JMP IQ1 CLSN A,=NL DEFAULTS TO SINGLE SIDED 8 INCH JMP SS8INCH CLSN 2 A,='R' REPEAT LAST TEST GROUP JMP REPEAT CLSN A,='P' SINGLE SIDED 5 INCH (PICO FLOPPY) JMP SS5INCH CLSN A,='N' NO DEFAULT TEST GROUP (DO DIALOG) JMP SETDIA SETUP THE DIALOG DEFAULTS CLSN A,='S' SINGLE SIDED 8 INCH JMP SS8INCH CLSN A,='Q' DOUBLE SIDED 8 INCH JMP DS8INCH CLSN A,='M' DOUBLE SIDED 5 INCH JMP DS5INCH CLSN A,='E' EXIT DIAGNOSTIC JMP FDC:EXIT * SS5INCH COPY =SS5INTBL,X JMP SETTEST * SS8INCH COPY =SS8INTBL,X JMP SETTEST * DS8INCH COPY =DS8INTBL,X JMP SETTEST * DS5INCH COPY =DS5INTBL,X JMP SETTEST * REPEAT COPY TESTS,A FIRST TEST NULL?? JLE A,SETDIA YES, FORCE A DIALOG JMP TEST ELSE, GO REPEAT THE LAST TEST GROUP SPECIFIED * SETDIA COPY =DIALOG,X RBIT 1,S CLEAR OV FOR DIALOG MODE JMP SETTST2 * SETTEST SBIT 1,S SET OV TO FLAG DEFAULT TEST SETTST2 COPY =TESTS,Q POINT TO TEST TABLE TO FILL IN GETDEF COPY 0(X),A GET VALUE JLT A,DEFSET IF END OF TABLE EXCH X,Q PUT INTO TEST TABLE  COPY A,0(X) EXCH X,Q ADD =1,X ADD =1,Q JMP GETDEF REPEAT TILL DONE * DEFSET EQU $  JF OV,IQ2 IF OV SET THEN ASK THE QUESTIONS JMP TEST GROUP ELSE GO DO THE STANDARD TEST SPACE 5 IQ2 CALL Q2 CLSN A,=SLASH JMP IQ1 CLSN A,=UP JMP IQ1 CLSN A,=BACK JMP IQ2 CLSN A,=POUND JMP TEST SPACE 5 IQ11 CALL Q11 CLSN A,=SLASH JMP IQ1 CLSN A,=UP JMP IQ2 CLSN A,=BACK JMP IQ11 CLSN A,=POUND JMP TEST SPACE 5 IQ3 CALL Q3 CLSN A,=SLASH JMP IQ1 CLSN A,=UP JMP IQ11 CLSN A,=BACK JMP IQ3 CLSN A,=POUND JMP TEST SPACE 5 IQ12 CALL Q12 CLSN A,=SLASH JMP IQ1 CLSN A,=UP JMP IQ3 CLSN A,=BACK JMP IQ12 CLSN A,=POUND JMP TEST SPACE 5 IQ13 CALL Q13 CLSN A,=SLASH JMP IQ1 CLSN A,=UP JMP IQ12 CLSN A,=BACK JMP IQ13 CLSN A,=POUND JMP TEST SPACE 5 IQ4 CALL Q4 CLSN A,=SLASH JMP IQ1 CLSN A,=UP JMP IQ13 CLSN A,=BACK JMP IQ4 CLSN A,=POUND JMP TEST SPACE 5 IQ5 CALL Q5 CLSN A,=SLASH JMP IQ1 CLSN A,=UP JMP IQ4 CLSN A,=BACK JMP IQ5 CLSN A,=POUND JMP TEST SPACE 5 IQ6 CALL Q6 CLSN A,=SLASH JMP IQ1 CLSN A,=UP JMP IQ5 CLSN A,=BACK JMP IQ6 CLSN A,=POUND JMP TEST SPACE 5 IQ7 CALL Q7 CLSN A,=SLASH JMP IQ1 CLSN A,=UP JMP IQ6 CLSN A,=BACK JMP IQ7 CLSN A,=POUND JMP TEST SPACE 5 IQ8 CALL Q8 CLSN A,=SLASH JMP IQ1 CLSN A,=UP JMP IQ7 CLSN A,=BACK JMP IQ8 CLSN A,=POUND JMP TEST SPACE 5 IQ14 CALL Q14 CLSN A,=SLASH JMP IQ1 CLSN A,=UP JMP IQ8 CLSN A,=BACK JMP IQ14 CLSN A,=POUND JMP TEST SPACE 5 IQ9 CALL Q9 CLSN A,=SLASH JMP IQ1 CLSN A,=UP JMP IQ14 CLSN A,=BACK JMP IQ9 CLSN A,=POUND JMP TEST SPACE 5 IQ10 CALL Q10 CLSN A,=SLASH JMP IQ1 CLSN A,=UP JMP IQ9 CLSN A,=BACK JMP IQ10 CLSN A,=POUND JMP TEST JMP TEST LAST QUESTION, NOW DO THE TESTS GOMSG EQU $ PUSH :40 SAVE REGS TEXT CR,LF,'RECALIBRATE COMMAND FAILED AT THE END OF THE TEST - UNIT=' HEX UNIT POP JMP BAK * * END OF USER DIALOG * TEST CALL FDC:0 DO THE TESTS FDC:EXIT EQU $ PUSH :40 SAVE COPY =-4,Q WE HAVE 4 UNITS TO GO  COPY =0,A COPY A,PTR RECALIBR EQU $ COPY PTR,A COPY =UNITS,X ADR OF UNITS XNX A COPY 0(X),A GET ONE JEQ A,GOEXIT NO MORE TO GO SUB =1,A THE RIGHT UNIT ADDR COPY A,UNIT CALL RECAL JEQ A,BAK JMP GOMSG BAK EQU $ COPY PTR,A ADD =1,A COPY A,PTR 3 IJNE Q,RECALIBR DO IT FOR EACH UNIT UNDER TEST GOEXIT EQU $ POP RBIT 8,S TURN OFF INTERRUPTS! COPY Y,PTR COPY =Y1,Y COPY =0,A COPY UF:DA(Y),Y XNX Y SELP A,3 RESET UFDC COPY =-255,Y IJNE Y,$ COPY PTR,Y COPY BSTAT:2,A ANY FATAL ERRORS??? JEQ A,CHKSOFT NOPE, SEE ABOUT SOFT ERRORS TEXT CR,LF,' *** FATAL ERRORS OCCURED. REJECT BOARD OR DRIVES ***' EXIT * CHKSOFT COPY BSTAT:3,A ANY SOFT ERRORS? CSK A,=:FF JMP SOFTERRS JMP OVER255 SOFTERRS TEXT CR,LF,' *** ' HEX BSTAT:3 JMP TOOMANY * OVER255 TEXT CR,LF,' *** OVER :FF' TOOMANY TEXT ' SOFT ERRORS OCCURED ***' COPY =TRACKS,X COPY 1(X),A SUB 0(X),A ADD =1,A ADD A,A AREG = 2*(NUMBER OF TRACKS TESTED) CSK A,=SOFTHRES JMP CHEKCNT COPY =SOFTHRES,A CHEKCNT CSK A,BSTAT:3 ALLOW A MAX OF 2 ERRORS PER TRACK OR 16 AT MOST JMP REJECT TOO MANY NOP BOARD IS ACCEPTABLE TEXT CR,LF,' *** BOARD CAN BE ACCEPTED ***' EXIT * REJECT TEXT CR,LF,' *** TOO MANY SOFT ERRORS OCCURED. REJECT BOARD,' TEXT CR,LF,' CHECK DISKETTES, OR ALIGN DISK DRIVES ***' EXIT TITL DEFAULT TEST GROUP SYSDEF Q1 ENDEF Q1 ENTRY * * DETERMINE WHICH TEST GROUP TO RUN * PQ1 CALL O:MSG,=CO,LP1,=P1 CALL QYESNO CLSN A,='E' JMP XQ1 CLSN A,='R' JMP XQ1 CLSN A,='S' JMP XQ1 CLSN A,='Q' JMP XQ1 CLSN A,='M' JMP XQ1 CLSN A,='P' JMP XQ1 CLSN A,='N' JMP XQ1 JMP PQ1 INVALID CHAR, REPROMPT * XQ1 COPY K,X COPY A,AREG(X) EXIT P1 BYTE CR,LF,'DEFAULT TEST GROUP (P,M,S,Q,R,N,E)=' LP1 WORD $-P1*2 TITL TESTS SYSDEF Q2 ENDEF Q2 ENTRY * *  DETERMINE WHAT TESTS THE USER WANTS TO RUN. * * INITIALIZE TESTS TO ZERO. THERE ARE NTESTS OF THEM * PQ2 COPY =0,A CLEAR A COPY =-NTESTS,Q -COUNT OF TESTS COPY =TESTS,X ADR OF TESTS COPY A,0(X) ZERO THE TEST ADD =1,X BUMP X IJNE Q,$-2 REPEAT * * TERMINATOR, PTR=0 * COPY =0,A COPY A,TRM TERMINATOR CHAR=0 COPY A,PTR TEST POINTER=0 * * PROMPT USER * CALL O:MSG,=CO,LP2,=P2 * * GET CHAR. IGNORE COMMAS * Q2IN COPY =0,A CLEAR A CALL O:IO,=CI GET CHAR SHIFT A,RO,8 CLSN A,=',' A COMMA? JMP Q2IN YES, IGNORE * * A RETURN? * CLSN A,=CR JMP Q2RET COPY A,TRM NO, SAVE TERMINATOR * * AN EDIT CHAR? * CLSN A,=SLASH JMP Q2ED CLSN A,=UP JMP Q2ED CLSN A,=BACK JMP Q2ED CLSN A,=POUND JMP Q2ED * * A LETTER A-K? * CSK A,='A' JMP Q2BAD TOO LOW NOP CSK A,='K' JMP $+2 JMP Q2BAD TOO BIG SUB =:40,A TEST NUMBER 1-11 COPY PTR,Q GET TEST POINTER CSK Q,=NTESTS TOO BIG? JMP Q2GOOD NO, ACCEPT THIS TEST NOP JMP Q2BAD TOO BIG Q2GOOD XNX Q USE POINTER AS OFFSET INTO TESTS COPY A,TESTS STORE THE TEST NUMBER ADD =1,Q BUMP PTR COPY Q,PTR SAVE PTR JMP Q2IN GET NEXT CHAR Q2BAD CALL FLUSH,=CR,=CI JMP PQ2 BUFFER FLUSHED, START OVER WITH NEW PROMPT Q2ED CALL FLUSH,=CR,=CI Q2RET COPY TRM,A GET TERMINATOR * IF POUND OR RETURN THEN NEED DEFAULT INSTEAD CLSN A,=POUND  JMP Q2DEF CLSN A,=NL JMP Q2DEF JMP XQ2 DEFAULT NOT NEEDED, TESTS OK * RESTORE DIALOG TESTS Q2DEF COPY =-NTESTS,A NUMBER OF TESTS COPY A,PTR -COUNT OF TESTS COPY =DIALOG,X ADR OF DIALOG COPY =TESTS,Q ADR OF TESTS Q2LOOP COPY 0(X),A GET DIALOG WORD EXCH X,Q POINT TO TESTS COPY A,0(X) SAVE DIALOG WORD IN TEST EXCH X,Q POINT TO DIALOG ADD =1,X BUMP X ADD =1,Q BUMP Q IMS PTR BUMP COUNT JMP Q2LOOP REPEAT XQ2 COPY K,X COPY TRM,A GET TERMINATOR COPY A,AREG(X) EXIT P2 BYTE CR,LF,'TESTS ([A,F,C,E,H,I4 ,J,K],B,D,G)=' LP2 WORD $-P2*2 TITL DRIVE TYPE SYSDEF Q3 ENDEF Q3 ENTRY * * WHAT DRIVE BANK SHALL WE USE? * PQ3 CALL O:MSG,=CO,LP3,=P3 CALL QYESNO JLT Q,PQ3 INVALID CHAR, REPROMPT CLSN ='Y',A YES? JMP Q3YES JNE Q,XQ3 DEFAULT, ETC. * NQ3 COPY =1,Q MINIFLOPPY COPY Q,DRIVE DRIVE JMP XQ3 * Q3YES COPY =0,Q 8" DRIVES COPY Q,DRIVE * XQ3 COPY K,X COPY A,AREG(X) EXIT P3 BYTE CR,LF,'8 INCH DRIVE BANK ([Y] OR N)=' LP3 WORD $-P3*2 TITL UNIT NUMBERS SYSDEF Q4 ENDEF Q4 ENTRY * * WHAT UNIT NUMBERS SHALL WE TEST? * * UP TO 4 UNITS TO BE TESTED IN ANY ORDER * * INITIALIZE UNITS TO ZERO. THERE ARE 4 OF THEM * PQ4 COPY =0,A CLEAR A COPY =-4,Q -COUNT OF UNITS COPY =UNITS,X ADR OF UNITS COPY A,0(X) ZERO THE UNIT ADD =1,X BUMP X IJNE Q,$-2 REPEAT * * TERMINATOR, PTR=0 * COPY =0,A COPY A,TRM TERMINATOR CHAR=0 COPY A,PTR TEST POINTER=0 * PROMPT USER CALL O:MSG,=CO,LP4,=P4 * GET CHAR. IGNORE COMMAS Q4IN COPY =0,A CLEAR A CALL O:IO,=CI GET CHAR SHIFT A,RO,8 CLSN A,=',' A COMMA? JMP Q4IN YES, IGNORE * A RETURN? CLSN A,=CR JMP Q4RET COPY A,TRM NO, SAVE TERMINATOR * AN EDIT CHAR? CLSN A,=SLASH JMP Q4ED CLSN A,=UP JMP Q4ED CLSN A,=BACK JMP Q4ED CLSN A,=POUND JMP Q4ED * A NUMBER 0-3? CSK A,='0' JMP Q4BAD TOO LOW NOP CSK A,='3' JMP $+2 JMP Q4BAD TOO BIG SUB =:2F,A UNIT NUMBER 1-4 COPY PTR,Q GET UNIT POINTER CSK Q,=4 TOO BIG? JMP Q4GOOD NO, ACCEPT THIS UNIT NOP JMP Q4BAD TOO BIG Q4GOOD COPY =UNITS,X ADR OF UNITS (TOO BIG FOR ABS ADDRESSING) ADD Q,X PLUS OFFSET INTO UNITS COPY A,0(X) STORE THE UNIT NUMBER ADD =1,Q BUMP PTR COPY Q,PTR SAVE PTR JMP Q4IN GET NEXT CHAR Q4BAD CALL FLUSH,=CR,=CI JMP PQ4 BUFFER FLUSHED, START OVER WITH NEW PROMPT Q4ED CALL FLUSH,=CR,=CI Q4RET COPY TRM,A GET TERMINATOR * IF POUND OR RETURN THEN NEED DEFAULT INSTEAD CLSN A,=POUND JMP Q4DEF CLSN A,=NL JMP Q4DEF JMP XQ4 DEFAULT NOT NEEDED, UNITS OK * RESTORE DIALOG UNITS Q4DEF COPY =-4,A NUMBER OF UNITS COPY A,PTR -COUNT OF UNITS COPY =DIAUNIT,X ADR OF DIALOG UNITS COPY =UNITS,Q ADR OF UNITS Q4LOOP COPY 0(X),A GET DIALOG WORD EXCH X,Q POINT TO UNITS COPY A,0(X) SAVE DIALOG WORD IN UNITS EXCH X,Q POINT TO DIALOG ADD =1,X BUMP X ADD =1,Q BUMP Q IMS PTR BUMP COUNT JMP Q4LOOP REPEAT XQ4 COPY K,X COPY TRM,A GET TERMINATOR COPY A,AREG(X) EXIT P4 BYTE CR,LF,'DRIVE NUMBERS TO TEST - SEPARATED BY COMMAS ([0,1],2,3)=' LP4 WORD $-P4*2 TITL TRACK NUMBER RANGE SYSDEF Q5 ENDEF Q5 ENTRY * * WHAT TRACKS SHALL WE TEST OVER? * * INITIALIZE PTR TO FIRST OR SECOND NUMBER, TERMINATOR CHAR, AND RESULTS PQ5 COPY =0,Q COPY Q,PTR PTR=0 FIRST NUMBER COPY Q,TRM TERMINATOR CHAR=0 COPY =TRACKS,X ADR OF TRACKS  COPY Q,0(X) L TRACK=0 COPY Q,1(X) H TRACK=0 * PROMPT USER CALL O:MSG,=CO,LP5,=P5 Q5IN COPY =0,A CLEAR A CALL O:IO,=CI GET CHAR SHIFT A,RO,8 * A RETURN? CLSN A,=CR JMP Q5RET COPY A,TRM NO, SAVE TERMINATOR * AN EDIT CHAR? CLSN A,=SLASH JMP Q5ED CLSN A,=UP JMP Q5ED CLSN A,=BACK JMP Q5ED CLSN A,=POUND JMP Q5ED * A DASH? CLSN A,='-' JMP Q5DASH CLSN A,=',' A COMMA IS ALSO OK JMP Q5DASH * A DIGIT 0-9? CSK A,='0' JMP Q5BAD TOO LOW NOP CSK A,='9' JMP $+2 JMP Q5BAD TOO BIG SUB =:30,A OK, CONVERT TO 0-9 * GET CURRENT RESULT COPY =TRACKS,X ADR OF TRACKS COPY PTR,Q POINT TO TRACK XNX Q COPY 0(X),Q GET RESULT * MULT5 IPLY BY 10 AND ADD CURRENT DIGIT COPY Q,X RESULT IN REG Q,X SHIFT Q,LO,3 MULTIPLY BY 8 ADD X,Q BY 9 ADD X,Q BY 10 ADD A,Q ADD DIGIT TO RESULT * SAVE AS CURRENT RESULT COPY =TRACKS,X ADR OF TRACKS COPY PTR,A POINT TO TRACK XNX A COPY Q,0(X) SAVE RESULT JMP Q5IN GET NEXT DIGIT Q5DASH COPY PTR,A GET PTR JNE A,Q5BAD IF NOT ZERO, TOO MANY COMMAS ADD =1,A INCREASE COPY A,PTR PTR JMP Q5IN GET NEXT CHAR Q5BAD CALL FLUSH,=CR,=CI JMP PQ5 BUFFER FLUSHED, START OVER WITH NEW PROMPT Q5ED CALL FLUSH,=CR,=CI Q5RET COPY TRM,A GET TERMINATOR * IF POUND OR RETURN THEN NEED DEFAULT INSTEAD CLSN A,=POUND JMP Q5DEF CLSN A,=NL JMP Q5DEF * DEFAULT NOT NEEDED, VALIDATE RESULTS COPY =TRACKS,X ADR OF TRACKS COPY PTR,A GET PTR JEQ A,$+2 IF ZERO, HIGH=LOW JMP Q5SEQ CHECK SEQUENCE COPY 0(X),A LOW TRACK COPY A,1(X) HIGH TRACK=LOW TRACK Q5SEQ COPY 0(X),A L TRACK COPY 1(X),Q H TRACK CSM A,Q IN ORDER? JMP $+2 JMP PQ5 BACKWARD! * COULD CHECK RANGE HERE JMP XQ5 TRACKS OK, ALL DONE Q5DEF COPY =DIATRK,X ADR OF DIALOG TRACKS COPY =TRACKS,Q ADR OF TRACKS COPY 0(X),A GET DIALOG L TRACK EXCH X,Q POINT TO TRACKS COPY A,0(X) SAVE L TRACK EXCH X,Q POINT TO DIALOG COPY 1(X),A GET DIALOG H TRACK EXCH X,Q POINT TO TRACKS COPY A,1(X) SAVE H TRACK XQ5 COPY K,X COPY TRM,A GET TERMINATOR COPY A,AREG(X) EXIT P5 BYTE CR,LF,'RANGE OF TRACKS TO TEST OVER ([73-76])=' LP5 WORD $-P5*2 TITL SECTOR NUMBER RANGE SYSDEF Q6 ENDEF Q6 ENTRY * * WHAT SECTORS OF EACH TRACK SHALL WE TEST? * * INITIALIZE PTR TO FIRST OR SECOND NUMBER, TERMINATOR CHAR, AND RESULTS PQ6 COPY =0,Q COPY Q,PTR PTR=0 FIRST NUMBER COPY Q,TRM TERMINATOR CHAR=0 COPY =SECTORS,X ADR OF SECTORS COPY Q,0(X) L SECTOR=0 COPY Q,1(X) H SECTOR=0 * PROMPT USER CALL O:MSG,=CO,LP6,=P6 Q6IN COPY =0,A CLEAR A CALL O:IO,=CI GET CHAR SHIFT A,RO,8 * A RETURN? CLSN A,=CR JMP Q6RET COPY A,TRM NO, SAVE TERMINATOR * AN EDIT CHAR? CLSN A,=SLASH JMP Q6ED CLSN A,=UP JMP Q6ED CLSN A,=BACK JMP Q6ED CLSN A,=POUND JMP Q6ED * A COMMA? CLSN A,=',' JMP Q6COM CLSN A,='-' A DASH IS ALSO GOOD JMP Q6COM * A DIGIT 0-9? CSK A,='0' JMP Q6BAD TOO LOW NOP CSK A,='9' JMP $+2 JMP Q6BAD TOO BIG SUB =:30,A OK, CONVERT TO 0-9 * GET CURRENT RESULT COPY =SECTORS,X ADR OF SECTORS COPY PTR,Q POINT TO SECTOR XNX Q COPY 0(X),Q GET RESULT * MULTIPLY BY 10 AND ADD CURRENT DIGIT COPY Q,X RESULT IN REG Q,X SHIFT Q,LO,3 MULTIPLY BY 8 ADD X,Q BY 9 ADD X,Q BY 10 ADD A,Q ADD DIGIT TO RESULT * SAVE AS CURRENT RESULT COPY =SECTORS,X ADR OF SECTORS COPY PTR,A POINT TO SECTOR XNX A COPY Q,0(X) SAVE RESULT JMP Q6IN GET NEXT DIGIT Q6COM COPY PTR,A GET PTR JNE A,Q6BAD IF NOT ZERO, TOO MANY COMMAS ADD =1,A INCREASE COPY A,PTR PTR JMP Q6IN GET NEXT CHAR Q6BAD CALL FLUSH,=CR,=CI JMP PQ6 BUFFER FLUSHED, START OVER WITH NEW PROMPT Q6ED CALL FLUSH,=CR,=CI Q6RET COPY TRM,A GET TERMINATOR * IF POUND OR RETURN THEN NEED DEFAULT INSTEAD CLSN A,=POUND JMP Q6DEF CLSN A,=NL JMP Q6DEF * DEFAULT NOT NEEDED, VALIDATE RESULTS COPY =SECTORS,X ADR OF SECTORS COPY PTR,A GET PTR JEQ A,$+2 IF ZERO, HIGH=LOW JMP Q6SEQ CHECK SEQUENCE COPY 0(X),A LOW SECTOR COPY A,1(X) HIGH SECTOR=LOW SECTOR Q6SEQ COPY 0(X),A L SECTOR COPY 1(X),Q H SECTOR CSM A,Q IN ORDER? JMP $+2 JMP PQ6 BACKWARD! * COULD CHECK RANGE HERE JMP XQ6 SECTORS OK, ALL DONE Q6DEF CO6 PY =DIASEC,X ADR OF DIALOG SECTORS COPY =SECTORS,Q ADR OF SECTORS COPY 0(X),A GET DIALOG L SECTOR EXCH X,Q POINT TO SECTORS COPY A,0(X) SAVE L SECTOR EXCH X,Q POINT TO DIALOG COPY 1(X),A GET DIALOG H SECTOR EXCH X,Q POINT TO SECTORS COPY A,1(X) SAVE H SECTOR XQ6 COPY K,X COPY TRM,A GET TERMINATOR COPY A,AREG(X) EXIT P6 BYTE CR,LF,'RANGE OF SECTORS TO TEST OVER ([1-26])=' LP6 WORD $-P6*2 TITL HEADS TO TEST SYSDEF Q7 ENDEF Q7 ENTRY * * WHAT HEADS SHALL WE TEST? * PQ7 CALL O:MSG,=CO,LP7,=P7 CALL TERM CLSN A,=SLASH JMP XQ7 CLSN A,=UP JMP XQ7 CLSN A,=BACK JMP XQ7 CLSN A,=POUND JMP XQ7 CLSN A,=NL JMP XQ7 CLSN A,='0' JMP Q7ZRO CLSN A,='1' JMP Q7ONE CLSN A,='2' JMP Q7TWO JMP PQ7 INVALID CHAR, REPROMPT * Q7ZRO COPY =0,Q COPY Q,HEADS JMP XQ7 * Q7ONE COPY =1,Q HEAD COPY Q,HEADS 1 JMP XQ7 * Q7TWO COPY =2,Q BOTH COPY Q,HEADS HEADS * XQ7 COPY K,X COPY A,AREG(X) EXIT P7 BYTE CR,LF,'HEADS TO TEST ([0], 1, OR 2=BOTH)=' LP7 WORD $-P7*2 TITL SINGLE OR DOUBLE DENSITY SYSDEF Q8 ENDEF Q8 ENTRY * * SINGLE OR DOUBLE DENSITY? * PQ8 CALL O:MSG,=CO,LP8,=P8 CALL QYESNO CLSN ='Y',A YES? JMP Q8YES * JLT Q,PQ8 INVALID CHAR, REPROMPT JNE Q,XQ8 DEFAULTS, ETC. * NQ8 COPY =0,Q SINGLE COPY Q,DENSITY DENSITY JMP XQ8 * Q8YES COPY =1,Q COPY Q,DENSITY * XQ8 COPY K,X COPY A,AREG(X) EXIT P8 BYTE CR,LF,'DOUBLE DENSITY ([Y] OR N)=' LP8 WORD $-P8*2 TITL DATA PATTERN SYSDEF Q9 ENDEF Q9 ENTRY * * WHAT DATA PATTERN SHALL WE TEST WITH? * PQ9 CALL O:MSG,=CO,LP9,=P9 CALL QHEX JLT Q,PQ9 BAD HEX, REPROMPT * IF POUND OR RETURN USE DEFAULT CLSN A,=POUND JMP XQ9 CLSN A,=NL JMP XQ9 * LOAD RESULT COPY Q,PATTERN XQ9 COPY K,X COPY A,AREG(X) EXIT P9 BYTE CR,LF,'DATA PATTERN TO USE - IN HEX ([C6])=:' LP9 WORD $-P9*2 TITL DEVICE ADDRESS SYSDEF Q10 ENDEF Q10 ENTRY * * WHAT IS THE DEVICE ADDRESS OF THE BOARD UNDER TEST? * PQ10 CALL O:MSG,=CO,LP10,=P10 CALL QHEX JLT Q,PQ10 BAD HEX, REPROMPT * IF POUND OR RETURN USE DEFAULT CLSN A,=POUND JMP XQ10 CLSN A,=NL JMP XQ10 * LOAD RESULT COPY Q,DEVADR XQ10 COPY K,X COPY A,AREG(X) EXIT P10 BYTE CR,LF,'DEVICE ADDR OF BOARD TO TEST - IN HEX ([30])=:' LP10 WORD $-P10*2 TITL INTERRUPT MODE SYSDEF Q11 ENDEF Q11 ENTRY * * SHALL WE USE INTERRUPTS IN OUR TESTING? * PQ11 CALL O:MSG,=CO,LP11,=P11 CALL QYESNO CLSN ='Y',A YES? JMP Q11YES JLT Q,PQ11 INVALID CHAR, REPROMPT JNE Q,XQ11 YES, ETC. * NQ11 COPY =0,Q NO COPY Q,INTDIS INTERRUPTS JMP XQ11 * Q11YES COPY =1,Q COPY Q,INTDIS * XQ11 COPY K,X COPY A,AREG(X) EXIT P11 BYTE CR,LF,'TEST INTERRUPTS FROM UFDC ([Y] OR N)=' LP11 WORD $-P11*2 TITL INVERT STEP DIRECTION SYSDEF Q12 ENDEF Q12 ENTRY * * SHALL WE USE THE INVERTED STEP DIRECTION? * (I.E. SINGLE SIDED 8" C.A. DRIVE CONSOLES * PQ12 CALL O:MSG,=CO,LP12,=P12 CALL QYESNO CLSN ='Y',A YES? JMP Q12YES * JLT Q,PQ12 INVALID CHAR, REPROMPT JNE Q,XQ12 YES, ETC. * NQ12 COPY =0,Q NO COPY Q,STEPINV STEP INVERSION JMP XQ12 * Q12YES COPY =1,Q COPY Q,STEPINV * XQ12 COPY K,X COPY A,AREG(X) EXIT P12 BYTE CR,LF,'INVERT STEP DIRECTION POLARITY ([Y] OR N)=' LP12 WORD $-P12*2 TITL STEP RATE TIMER SYSDEF Q13 ENDEF Q13 ENTRY * * TRACK TO TRACK STEP RATE * PQ13 CALL O:MSG,=CO,LP13,=P13 CALL QHEX JLT Q,PQ13 BAD HEX, REPROMPT * IF MORE THAN :20 THEN BAD CSK Q,=:20 7  JMP $+2 JMP PQ13 TOO BIG * IF POUND OR RETURN USE DEFAULT CLSN A,=POUND JMP XQ13 CLSN A,=NL JMP XQ13 * LOAD RESULT COPY Q,SRT XQ13 COPY K,X COPY A,AREG(X) EXIT P13 BYTE CR,LF,'TRACK TO TRACK STEP RATE TIME - IN MILLISECONDS (:[6])=:' LP13 WORD $-P13*2 TITL SECTOR SIZE SYSDEF Q14 ENDEF Q14 ENTRY * * SECTOR SIZE TO TEST WITH * PQ14 CALL O:MSG,=CO,LP14,=P14 CALL TERM CLSN A,=SLASH JMP XQ14 CLSN A,=UP JMP XQ14 CLSN A,=BACK JMP XQ14 CLSN A,=POUND JMP XQ14 CLSN A,=NL JMP XQ14 CLSN A,='8' JMP Q14ZRO CLSN A,='6' JMP Q14ONE CLSN A,='2' JMP Q14TWO JMP PQ14 INVALID CHAR, REPROMPT * Q14ZRO COPY =0,Q COPY Q,N JMP XQ14 * Q14ONE COPY =1,Q 256 COPY Q,N BYTES/SECTOR JMP XQ14 * Q14TWO COPY =2,Q 512 COPY Q,N BYTES/SECTOR * XQ14 COPY K,X COPY A,AREG(X) EXIT P14 BYTE CR,LF,'SECTOR SIZE - IN BYTES (128,[256],512)=' LP14 WORD $-P14*2 TITL SUBROUTINES *** * * SUBROUTINE TERM TO FLUSH THE BUFFER AND DETERMINE THE TERMINATOR CHAR * WHICH PRECEDES THE CARRIAGE RETURN * AND IS STORED IN A REG * *** SYSDEF TERM ENDEF TERM ENTRY COPY =0,Q NULL IS INITIAL TERMINATOR TERMIN COPY =0,A CLEAR A REG CALL O:IO,=CI SHIFT A,RO,8 CLSN A,=CR JMP TERMOUT COPY A,Q NOT A RETURN - STORE NEW TERMINATOR JMP TERMIN TERMOUT COPY Q,A RETURN THE TERMINATOR IN A REG - BUFFER FLUSHED COPY K,X COPY A,AREG(X) SAVE A REG EXIT SPACE 5 SYSDEF QYESNO ENDEF QYESNO ENTRY *** * * RETURN TERMINATOR IN A REG * Q REG = -1 (UNKNOWN) =0 (N) =1 (Y OR SPECIAL CHAR) * *** CALL TERM CLSN A,=SLASH JMP QY CLSN A,=UP JMP QY CLSN A,=BACK JMP QY CLSN A,=POUND JMP QY CLSN A,=NL JMP QY CLSN A,='Y' JMP QY CLSN A,='N' JMP QN * COPY =-1,Q INVALID CHAR JMP QOUT QN COPY =0,Q JMP QOUT QY COPY =1,Q QOUT COPY K,X COPY A,AREG(X) SAVE A COPY Q,QREG(X) SAVE Q EXIT SPACE 5 SYSDEF QHEX ENDEF QHEX ENTRY *** * * RETURN TERMINATOR IN A REG * Q REG = HEX NUMBER OR -1 IF BAD * INITIALIZE TERMINATOR AND RESULT * *** COPY =0,Q CLEAR RESULT COPY Q,TRM AND TERMINATOR CHAR QHEXIN COPY =0,A CLEAR A CALL O:IO,=CI GET CHAR SHIFT A,RO,8 * A RETURN? CLSN A,=CR JMP QHEXRET COPY A,TRM NO, SAVE TERMINATOR * AN EDIT CHAR? CLSN A,=SLASH JMP QHEXED CLSN A,=UP JMP QHEXED CLSN A,=BACK JMP QHEXED CLSN A,=POUND JMP QHEXED * A HEX DIGIT? CSK A,='0' JMP QHEXBAD TOO LOW NOP CSK A,='9' JMP $+2 JMP QHEXTEST TRY A-F SUB =:30,A OK, CONVERT TO 0-9 JMP QHEXADD ADD TO RESULT QHEXTEST CSK A,='A' JMP QHEXBAD TOO LOW NOP CSK A,='F' JMP $+2 JMP QHEXBAD TOO BIG SUB =:37,A OK, CONVERT TO 10-15 QHEXADD SHIFT Q,LO,4 MULTIPLY RESULT BY 16 ADD A,Q ADD DIGIT TO RESULT JMP QHEXIN GET NEXT DIGIT QHEXBAD CALL FLUSH,=CR,=CI FLUSH BUFFER COPY =-1,Q BAD HEX NUMBER JMP QHEXOUT QHEXED CALL FLUSH,=CR,=CI FLUSH BUFFER QHEXRET COPY TRM,A GET TERMINATOR QHEXOUT COPY K,X COPY A,AREG(X) SAVE A COPY Q,QREG(X) SAVE Q EXIT END SUB =:30,A OK, CONVERT TO 0-9 JMP QHEXADD ADD TO RESULT QHEXTEST CSK A,='A' JMP QHEXBAD TOO LOW NOP CSK A,='F' JMP $+2 JMP QHEXBAD TOO BIG SUB =:37,A OK, CONVERT TO 10-15 QHEXADD SHIFT Q,LO,4 MULTIPLY RESULT BY 16 ADD A,Q ADD DIGIT TO RESULT JMP QHEXIN GET NEXT DIGIT QHEXBAD CALL FLUSH,=CR,=CI FLUSH BUFFER COPY =-1,Q BAD HEX NUMBER JMP QHEXOUT QHEXED CALL FLUSH,=CR,=CI FLUSH BUFFER QHEXRET COPY TRM,A GET TERMINATOR QHEXOUT COPY K,X COPY A,AR8 ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I9 ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I: ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I; ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I< ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I= ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I> ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I? ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I@ ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IA ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IB ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IC ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’ID ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IE ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IF ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IG ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IH ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’II ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IJ ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IK ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’IL ’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I’I