IMD 1.16: 31/08/2008 22:19:02 84-93016-01 b000 f01601 nm-4 autoload types 2,3,&4    @0|)wwЀЀtQql)  " }gA ` MIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 ME480081109161300800811091613 800811091613-F01601 VOLNM-4 AUTOLOAD - TYPES 2, 3, & 4   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII M@jjggg@ o G`k_C# b# }B u[ ]e JRiCCp@<;: F8P@ G;NPCHC C GTqE'ɞ * Cϟx @0DAJL )‘ЀЀΎQBx"  i+ fEB)3 `jmBBI,v  BI,m  @EEFF)D^EF% jH@pOğv g7g4]X] PhV+s=胾c_N GF֞ؾ “@ALS)"$ C k1/j-h p vRw ppwp ki 15 !^\d X %'+Ns愾Q)s ED|{ @$ o O m J K i g. V tsFn`"FED) E`Cnrgy w"N{Rq1H }L2`0tG- Bc (>=gHHI; - 4# `pDc # C @`(I&`(! ( d<$C @ s`pBc # C @)rr)c # C @)c # 1CLQ# 1rs ms#  UNIT=VOLUME= DIRECTORY= NAME  EXTLENGTHCREATED MODIFIED EXTENTSAU'SF#NAMES  GRAND AU TOTAL=  o&  @0|)v1uo)  " }jA c .M@jjggg@ o G`k򞽢_C# b# }B u[ ]e JRiCp@=<; G9P@ G=y;<": 06OS:: SYS 5>%ixwc Bc A@6<# Ic B# hIjHc rc ޘT# @0X)P U1RpI P@6=< G:P@ G=NPCHC C GTqI/I iݞU۞ * C՟x @0DAJL )1"   i+ fFB)3 `j`NQRSTTIITSSJISRIN# B# A@6<@6Y # B|  vH@pɾv g/g,iXi Phb+s=胾c_Z SRמؾ ¡@AvLS)"$ C j<:j8h p y0Rw kkos rp  15 !YW\ f %'+\s愾I)s SR|{ @$ o O m J K i g< V tsFn`"FED) E`Cnrgy w"N!{RqI}M3`1tH. Cd )?>=y;<": 06OS:: SYS RC @`pB)1)1@ǀ@JAk`pBc # ) p ,܀# I )1    E  N1@o   0# I )1 C 0# BBN!@qC @) ,;9C @)c # / 5>kB  pĆ56 1)1 ZI C¥ D L WO h t3R/R ,XfJ tP |E  4-qHCECCٞsT i1A ,`@ , \)X1)IOIj1ðDD@NQHC@+kT£ӣ󢢢1ǜ眦)A0$ ☜8`pFyCI 9 & a # ) {, /9C @E1 @6܃C @ p `+IC @ p+ pK pc c I pB Hă /Q+YF!_C @sEr1 ooD`I @H@kTDUJC @FQCE c ku HAkT@ąKBE@C @H @@+kTc 1C @ Ck @ c K  @ i ABc)C @`pDqM `EBB`piIABc # /Q#C @ :`pB`pB.rc # `prErE# )g -)b )#  "R)C @ qS1G p `BC @E A@C @`pJ1) Dr)H)HJKN`pJEc c # @6A sXM m # + T) # /+Q PT TYPPTVw3C @.)8ˀ`pD81H 'B@ @D.1.1G '7+ D3O :BByB9B )c #  7)# I# **DE **PE  **SE   wC @` @UM p@rp1UF p@jk12`pDc # .2` xꘀ@.2r` x꒴@# 0123456789ABCDEF L,)C @@6 p GC @qB EC @F  `pBBB `pDc # & A@+T@ SASO.@qF 1A B1 # # # uXC @qB C @q; EEEE/+QACuu{gCI COSISOBI BOLOSCUIUODITV )!TX )!PR )!PP )!LP )!CR )DF Q6733ADX  Q6P33AMM   DU :{P(I )@6A HDT# %+C @@ pc # C @@c # M|C @@oC @@c # C @@dC @@c # qSC @@c # C @@p`HB`HAc # C @s@`(# 7 C @@p`HB`HAc # C @sP!XC  #;8e.e܃1F܃ DB܃CȞC @ăN U@C } yОqrǞ@܃UbsKj䃀@mC C _q @j@ -`*@ v@c @ĀAy  `6D肀@r肀@H6 ă)c  C } {} W _`p@`p@# _# r@ p D -DxC)+ /*%i܃A  - D D ϸDsr u_6 0m 1 is} ܃ DH D L DL  ܅ .@ UBD} Dt LpqD LhL fDDDl8*܃C | CrC8@ă@X EC★T@r@XCrCi@ i `+%ek`Jn 6Cr肘@@@ C @܃c  C @·# B# # AYL자# AYLޞu§# B¥# B QS# AYLz˜# B c # QP NxŐ-J-HF27c ) ` CC @ 1AA# # O6+ ʞx.ŸJNY ЂA 0 A #  2 %`@0@/* I} # c )C p p0  ӒѐΐːȐЂA# !81BW ؆Wr@+R@@+Lkޭp⬂@Ac =B1Ǟ-)BB CECEB. 6Ar& c ))E.9@9X C XC # @`6L . 6A.r8 `p@`@# 2 wy s 01 !`a@APQpq9IRZirz 12345678:#@'="&ABCDEFGH`.<(+|-JKLMNOPQ!$*);~0/STUVWXY,%_>?abcdefgh^jklmnopq stuvwxy\{}[] @6C  ą +!܆܃j HA. 6Ar6 @ ) @A )) %!C @`UD@k4c B# J SC+T# !+OM790111120000!2 C @„!<  c # Fӂ# !G ,Zh 1AI , MRA) ׀HE `AIĂD  ǀCUC  @`( # @6@@`@NXdz ¯@&`&I I  P@Kp@."0 9"#/"/ Q % "1"""&7"'"("+"*!"!!INSUFFICIENT MEMORY UTILITY WILL HALT, REBOOT C @ hr6tUCh4`pBc # !C @C @ păĂc # hH Nt# C @`p̄D`@@iāk+@``pDsDc # F wh rl# mrlr I)=Ć9Ą吀4Ă+# XQV # N QKI# LMKBc c }G?D QĞ )532# +TH+T# +# /HpxHl.HiqHnTkig69=+.+ +,/3-Mt ~"%!zo""@+Lkޭp⬂@Ac =B1Ǟ-)BB CECEB. 6Ar& c ))EO0SEGMENTBLANK oU ~̞ #1TV <?n'j_<BS{|}T>UXW T ( :ӂF - :ӂ" )  U ȦpP0 @0B ` h }cD «⫂pP0/o D E B U G 4 C 0 ӟi 7} ӂzӾ P AC Q@ X= Y:ԽѾ K3 L0 S- D** C'ԟK =ӟ{ } ӟ|" ǽ *ٽ҆ N A Gҽ؆WV9y R Ƥ D V Wƚ›LBLCLFLLLSLJLILGLRLZߝ Ǟ6 )}҆{҆u łt P Lłj T P Bم P ӂ\ W H TŅ Ğ|QEI , , `솂՟ _ٟ%7 ` J BKe䞁ւ iޠ @ޞޜ `@E ;RA@EN@Aޏǎ Qފ ,_? o| xa D `랤QYkV*S` Ѐ[Ѐ āV@AĄ܃ B `ǁ D임*F]O. `Ģ,**$ "r "Bƽу۽ֽˁC凑ā / XŃ ѽ۞i ]с䆫@ڃ۽ցBǢ ,ž[ + - * X /KJƎ^[{ xނZ ,ş| ֽL Ձ Pم ޽с䇏ȆŃ۽{ ўq!!9 kキGާ}ަyޠ}y E _  .Ӄ E _  .޾ރfN  ,Žֆs@FC kqLL (w{u _ޘJQB[y L S TўON  Jsˆzx\| IƎ> ,ŽƇ ,ƂpIưk , ,Htr Hm -ņց -ņCB\\ÂF -tт5ڃ3Ԟx ’@"Fz@ Ό F ō lR#䆠.bƝޙޖJQ!’ފދJQĽ %ӂԞu U B * ӂGo h fe "cIaM K Y&V&RR `QKL$kK N =DD GӂA   :Ӟ ӟL ǟ{ y9u    :w ® 0C C 96C C "0 `j •墒C "C tC I6 ,ƽƇ ,ƂpIưk , ,Htr Hm -Ɔׁ -ƆCB\\ÂF -t҂5ۃ3՞x ’@"Fz@ Ό F ƍ l >#.bƝޙޖJQ!ފދJQŽ %Ԃ՞u U B * ԂGo h fe "cIaM K Y&V&RR `QKL$kK N =ԂDD GԂA   :Ԟ ԟL ǟ{ y9u    :w ® 0C C 96C C "0 `j •C "C tC I6DÎA6OO6O6OKt0 A F I Dҽml Ԟx @9@@? R6A W DÊˊJR>JKSB|FsD{ ӆvtrLDLELILRLWƖd ,ka'%#ņyĆxÆwpQAlýkL=\L>L:|öbL<L=L^]\Q HǞ wqqno = < > :bady C 1 =Ԃ C 2 =Ԃ C 3 =Ԃ M =ԃTܽҞH&ƽ׆ =FFEFCCE=:7&Ɠ5-Ɠ,&Ɠ$Q߇ƽ? T ܝ C I M Nܞ S A  ޞ ›PQI`@" -LlQłބMb  C “KQGԓ؆a@" qQłЇށj Iސސސސޚޚ ,Ӟɝ,N̾w p“KQGb@"ӞƟ qQł˜Ǖށj MZYȝǿ 5555??w {| ,“KQGT`ac@"]^ qQłXUWTށj d N: “KQG:JKd@"GH qQłB?A>ށj J S  “KQG 45e@"12 qQł,)+(ށj 0 A } @ydK@_Fs? V;8HgKeI 3Q IIZ@ZI A=; 7 6 31w BK . IJQs %Ԃ" ՟x M L CM yIPvwrJpER76hifQFfIP6A` TITL NM-4 AUTOLOAD TYPE 2 #84-93016-11B0 TITL START * COPYRIGHT 1978,1976 COMPUTER AUTOMATION INC. * * USER DOCUMENTATION 00-93016-00B0 * SOURCE FILE 84-93016-21B0 * OBJECT FILE 84-93016-31B0 * WORD I/O BINARY 92-21000-41B0 * MAINTENANCE DOC 92-21000-51B0 * REL 0 RES 656,0 REL 0 * * START EQU $ JT  SS,MEMSRC IF UNATTENED IN 4,A GET CONSOLE WORD REGISTER CONTENTS JGE A,MEMSRC CHECK FOR TEST JMP JERROR IF TEST-HALT TITL FLOPPY LOADER * * FLOPPY LOADER * FLPYAD EQU :11 FLOPPY DEVICE ADDRESS FLOPPY EQU $ SST FLPYAD*8+4 CHECK FOR CONTROLLER PRESENT JMP NEXT IF NOT PRESENT COPY =7,A READ ALL OPCODE COPY A,OPCODE TO IOB COPY A,SEEK SEEK COUNT FLOP1 EQU $ COPY =1,A SET UP TO READ SECTOR 1 COPY A,SECTOR PUT IT IN IOB  COPY BASE,A GET CODES BASE ADDRESS ADD =IOB-START,A COMPUTE NEW IOB ADDRESS SST FLPYAD*8+0 TEST FOR CONTROLLER IDLE JMP $-1 WAIT FOR CONTROLLER IDLE OUT A,FLPYAD*8+0 ISSUE I/O SST FLPYAD*8+0 TEST FOR COMPLETION JMP $-1 WAIT FOR DONE COPY =-80,A INSURE CYLINDER 0 EXCH A,SEEK GET SEEK COUNT JGE A,FLOP1 IF FIRST SEEK COPY FLPSTT,A  GET STATUS SHIFT A,RO,1 SYSTEM READY BIT TO -OV- JT OV,NEXT IF NOT READY FLOP2 EQU  $ AND =:7F,A CLEAR TO 7 BITS JEQ A,BOOT IF NO ERRORS JERROR EQU $ JMP ERROR  IF ERROR TITL DEVICE SELECTION DECODE * * DEVICE SELECTION DECODE * INIT EQU $ COPY X,BASE SAVE THE BASE ADDRESS OF AUTOLOAD NOW JMP JTEST DO MINI-DIAGNOSTIC SETUP EQU $ THEN RETURN HERE COPY H100,A SET UP MAGNETIC DEVICE WORD COUNT COPY A,WORDS STUFF IT IN THE IOB FIRST EQU $ COPY =0,A INITIALIZE IOB VALUES COPY A,BUFFER BUFFER ADDRESS IS ALWAYS 0 COPY A,INTER NO INTERRUPTS COPY A,FLPSTT CLEAR FLOPPY STATUS COPY A,CYLIN CYLINDER 0  COPY A,UNIT UNIT 0 COPY =5,A SET MINI-FLOPPY AS FIRST DEVICE COPY A,DEV   SET UP FOR UNATTENDED OPERATION NEXT EQU $ IN 4,Q GET CONSOLE WORD REGISTER SHIFT Q,RO,1 RIGHT JSTIFY DEVICE SELECTION CODE COPY PANEL,A GET PANEL FLAG JNE A,NOPANL IF NO PANEL SKIP SENSE SWITCH TEST JF SS,SAME IF ATTENDED OPERATION NOPANL EQU $ IMS DEV BUMP TO NEXT DEVICE COPY DEV,Q LOAD DEVICE INDEX TITL SAME EQU $ XNX Q  INDEX THE JUMP INSTRUCTION JMP $+1 AND EXECUTE IT JMP NEXT . 0=PTP REL, NOT SUPPORTED JMP NEXT . 1=PTP ABS, NOT SUPPORTED JMP STM14 . 2=STORAGE MODULE, POLLED 4TH JMP FLOPPY . 3=FLOPPY, POLLED 2ND JMP MTIC . 4=MTIC, POLLED 3RD JMP STMU14 . 5=DISC UPPER PLATTER, NOT POLLED JMP MINFL0 . 6= MINI-FLOPPY UNIT 0 POLLED FIRST JMP MINFL1 . 7= MINI-FLOPPY UNIT 1 NOT POLLED TITL MTIC EOB INTERRUPT SERVICE * * RETURN HERE ON MTIC EOB INTERRUPT * MTEOB EQU $ MTSTRT WORD :230  MTIC START COMMAND IN MTICDA+1,A GET STATUS BYTE ONE AND THROW IT AWAY IN MTICDA+1,A  GET STATUS BYTE TWO SUB =:C0,A CHECK HDW & RATE ERRORS JLT A,JERROR IF ERROR - HALT BOOT EQU $  COPY =0,X SET EXECUTION ADDRESS TO 0 JMP MAGS GO CHECK EXECUTION BIT TITL FLOPPY/DISC IOB * * THE FOLLOWING LOCATIONS ARE USED AS TEMP CELLS * BASE RES 1,0 AUTOLOAD RELOCATION ADDRESS DEV RES 1,0  DEVICE TO CHECK IF READY PANEL RES 1,0 PANEL FLAG = 0 IF CONSOLE PRESENT * * THE FOLLOWING LOCATION ARE USED AS THE IOB * FOR THE FLOPPY AND DISCS * IOB EQU $ ORG IOB OPCODE RES 1,0 UNIT RES 1,0 CYLIN RES 1,0 SEEK EQU $ HEAD RES 1,0 SECTOR RES 1,0 WORDS RES 1,0 BUFFER RES 1,0 INTER RES 1,0 FLPWCT EQU $ NXTIOB RES 1,0 FLPSTT EQU $ STMWCT RES 1,0 STMCST RES 1,0 STMDST RES 1,0 TITL MEMORY SEARCH TO RELOCATE AUTOLOAD ************************************************** * NOTE: THIS SECTION IS OVERLAYED WITH * * THE DISK I/O BLOCK. SEE ABOVE * * * **************************************************  ORG IOB-3 * FIND END OF MEMORY MEMSRC EQU $ SBIT 6,S TURN ON XA BIT COPY Q,K SAVE RELOCATION BIAS COPY =0,X START FROM TOP OF MEMORY AND WORK DOWN COPY X,PANEL CLEAR PANEL FLAG COPY =:FF,Y Y USED FOR CONSOLE CHECK AND TRANSFER COUNTER SELP Y,4 PUT Y INTO WORD REG IN  4,Q GET IT BACK CSK Q,=:FF CHECK IF CONSOLE PRESENT NOP COPY Y,PANEL NOT PRESENT SO SET PANEL FLAG NON-ZERO SELP A,4 RESTORE WORD REG IN CASE SS=FALSE FINDMN EQU $ SUB H100,X  DECREMENT MEMORY POINTER COPY =-1,A SET TO ALL ONES EXCH A,0(X) ACCESS MEMORY THROUGH POINTER EXCH A,0(X) ACCESS MEMORY THROUGH POINTER IJNE A,FINDMN BUMP RESULTS OF MEMORY ACCESS,   IF NOT RAM, AGAIN EXCH A,0(X) NOW TRY TO GET BACK ZEROS EXCH A,0(X) JNE A,FINDMN IF FAILURE MUST BE ROM COPY A,TRAP NOP TRAP IN CASE OF PARITY ERROR * TRAP WILL FALL THROUGH TO PARITY ERROR HALT  TITL * * RELOCATE AUTOLOAD TO HIGHEST WRITABLE MEMORY * GOTMN EQU $ MOVNXT EQU $ COPY 0(Y),A  PICK UP WORD COPY A,0(X,Y) MOVE IT TO HIGH MEMORY JNED Y,MOVNXT IF DONE MOVING  JMP INIT-START(X) GO TO RELOCATED AUTOLOAD CODE * * TITL DISC STORAGE MODULE LOADER * SMDA EQU :14 DISC STORAGE MODULE DEVICE ADDRESS SUDA EQU :15 * * :14= MEDIUM CAPACITY DISC * :15= HIGH CAPACITY DISC * STMU14 EQU $ COPY =2,Y SET HEAD FOR UPPER PLATTER JMP STMX JUMP AROUND LOWER PLATTER HEAD SET STM14 EQU $ DISC LOWER PLATTER COPY =0,Y SET HEAD FOR LOWER PLATTER STMX COPY Y,HEAD COPY =1,Q COPY =1,X SET Q AND X FOR LOOPING STM0 EQU $ SST SMDA*8+4 SENSE IF CONTROLLER PRESENT JMP TRYUPR IF NOT TRY AT :15 JMP STM1 PRESENT AT :14 TRYUPR SST SUDA*8+4 SENSE IF PRESENT AT :15 JMP FIRST NOT PRESENT SO CHECK FIRST DEVICE COPY =1,Y SET Y FOR :15 PATH TITL STM1 EQU $ COPY =4,A SET UP OPCODE COPY A,OPCODE COPY =0,A INITIALIZE IOB VALUES COPY A,SECTOR SECTOR ADDRESS OF 0 COPY A,NXTIOB NO IOB CHAINING COPY A,STMCST CLEAR CONTROLLER STATUS COPY BASE,A COMPUTE NEW IOB ADDRESS ADD =IOB-START,A CLSN Y,=1 FIND WHICH PATH TO TAKE JMP PATH15 Y WAS SET TO ONE SO TAKE :15 PATH PATH14 SELP A,SMDA*8+4 INITIALIZE THE CONTROLLER SST SMDA*8+0 TEST FOR IDLE JMP $-1  WAIT FOR IDLE OUT A,SMDA*8+0 ISSUE I/O SST SMDA*8+0 TEST FOR COMPLETION JMP $-1  WAIT FOR COMPLETION JMP STAT JUMP AROUND :15 PATH PATH15 SELP A,SUDA*8+0 INITIALIZE THE CONTROLLER  SST SUDA*8+0 TEST FOR IDLE JMP $-1 WAIT FOR IDLE OUT A,SUDA*8+0 ISSUE I/O SST SUDA*8+0 TEST FOR COMPLETION JMP $-1 WAIT FOR COMPLETION STAT COPY STMCST,A GET THE STATUS JGE A,BOOT IF NO ERROR GO EXECUTE BOOT SHIFT A,RO,1 DISC READY BIT TO -OV- JF OV,ERROR IF ERROR AND READY JNED Q,STM1 IF ONLY TRIED ONCE ADD =1,Q MAKE SURE LAST INSTRUCTION IS PASSED AGAIN JNED X,TRYUPR TRY :15 TWICE JMP FIRST IF STILL NOT READY TITL ERROR/EXECUTION HALT * H100 WORD :100 * JFIRST EQU $ JUMP INTO POLLING SEQUENCE COPY =1,A  SET UP FOR DISC STORAGE MODULE NEXT XNEXT COPY A,DEV JMP NEXT * JTEST JMP TEST INDIRECT JUMP TO TEST  TITL UNINSTALLED MEMORY TRAP SET-UP REL :88 ORIGIN AT MEMORY TRAP LOCATION TEMP1 EQU $ LOCATION   IS ALSO USED AS A TEMP QCDCHK WORD :A656 QCD ROM CHECKSUM VALUE CKSUM RES 1,0 TRAP EQU $ JMP FINDMN UNINSTALLED MEMORY TRAP IERROR EQU $ USED FOR INDIRECT JUMP AND ALSO JMP ERROR PARITY ERROR SQ RES  1,0 JBOOT JMP BOOT * ERROR EQU $ OUT A,2 TURN OFF AUTOLOAD LIGHT HLT HALT FOR ERROR OR NO EXECUTION COPY Q,K SAVE RELOCATION BIAS JMP FIRST * TITL MTIC LOADER * MTIC LOADER MTICDA EQU :F2 MTIC DEVICE ADDRESS MTRDY EQU :4 READY BIT MTLDP EQU :10  LOAD POINT STATUS POINT MTONL EQU :10 ON-LINE STATUS BIT MTDBY EQU :2 WORD BUSY STATUS BIT MTRAT EQU :40 MTHER EQU :80 MTINT EQU :C8 MTWDCT EQU MTINT+1 MTMODE WORD :4FF * MTIC EQU $ COPY MTMODE,A GET MODE SELECT WORD OUT A,MTICDA+1 ISSUE MODE SELECT IN MTICDA+1,Q GET STATUS BYTE ONE IN MTICDA+1,A GET STATUS BYTE TWO * CHECK STATUS JEQ Q,JFIRST NO DIO INSTALLED, CONTINUE POLLING AND =MTDBY;MTLDP,Q MUST BE AT LOAD POINT AND NOT BUSY JNE Q,JFIRST IF MTIC IS NOT READY, GO TO NEXT DEVICE AND =MTRDY;MTONL,A CHECK FOR READY JNE A,JFIRST IF NOT READY * GOOD STATUS, TRY TO LOAD * ASSUME I/O LOCATIONS ARE LOADED FROM ROM MTIC1 EQU $ COPY BASE,X GET AUTOLOAD BASE  COPY MTSTRT,A GET START I/O COMMAND SBIT 8,S ENABLE INTERRUPTS OUT A,MTICDA+1 ISSUE START TO PICO JMP $ WAIT FOR COMPLETION TITL READY,SET,GO! * MAGS EQU $ FROM MAGNETIC DEVICE LOADING COPY =:40,Y SET UP Y FOR LSI-3/05 OUT A,2 TURN OFF AUTOLOAD LIGHT COPY  PANEL,A CONSOLE ATTACHED JNE A,GOOO NO-AUTOLOAD ANYWAY JT SS,GOOO IF UNATTENDED ALWAYS EXECUTE  IN 4,A INPUT WORD REGISTER SHIFT A,RO,1 GET EXECTUION/NO EXECUTION BIT JF OV,ERROR  IF NO EXECUTION GOOO EQU $ RBIT 6,S TURN OFF XA BIT JMP 0 * TITL MINI-FLOPPY LOADER * PICODA EQU :FC PICO DEVICE ADDRESS, CHANNEL 6 * MINFL1 EQU $ MINI-FLOPPY UNIT 1 COPY =1,A COPY A,MFUNIT MINFL0 EQU $ MINI-FLOPPY UNIT 0 IN PICODA+1,A GET PICO STATUS TO A JEQ A,JMPOUT DIO NOT ENSTALLED TBIT 1,A GET PRESENT/NOT BUSY BIT TO OV JF OV,READY JMPOUT COPY =2,A NOT READY SO SET FLOPPY AS NEXT DEVICE JMP XNEXT JUMP TO NEXT DEVICE READY EQU $  COPY BASE,Y ADD OUTAD,Y CREATE CONTROL BLOCK ADDRESS COPY =1,Q SET Q FOR LOOP TWICE  COPY =9,A SET OPCODE FOR SEEK COPY A,OPC TITL TWICE COPY =5,X SET X AS COUNTER AND POINTER OUTLUP COPY 0(X,Y),A OUTPUT CONTROL INFORMATION OUT A,PICODA IN OUTPUT LOOP JNED X,OUTLUP SEND SIX BYTES COPY COMAND,A OUTPUT OF COMMAND WORD OUT A,PICODA+1 COPY =7,A SET OPCODE FOR R  EAD COPY A,OPC STATUS IN PICODA+1,A INPUT STATUS TBIT 1,A CHECK BUSY BIT JT OV,STATUS LOOP UNTIL NOT BUSY ERRCHK EQU $ ERROR CHECKING AND =:7F,A IGNORE WRITE PROTECT CSK  A,=5 CHECK ERROR CODE JMP HERE A<5, NO ERRORS JF SS,IERROR A>5, IF NOT POLLING - ERROR HALT  JMP JMPOUT A=5, NOT READY SO TRY NEXT DEVICE TITL MTIC I/O INTERRUPT LOCATION SET UP * REL :C8 ORIGIN AT MTIC INTERRUPT LOCATION AIB MTICDA+0 WORD :7E70 READ :C8 WORDS EXEC EQU $ WORD -1 HPC EQU $ WORD 0 JST MTEOB-START(X) AT END OF MTIC READ GOT TO END OF BLOCK TITL MINI-FLOPPY CONTINUED HERE JNED Q,TWICE OUTPUT SEEK0, THEN READ1 AND GO ON INPUT EQU $ INPUT FROM PICO FIFO TO MEMORY  COPY =0,X SET POINTER COPY =:7F,Y SET COUNTER SBIT 2,S SET BYTE MODE INLOOP EQU $ INPUT LOOP IN PICODA,A INPUT A BYTE COPYB A,0(X) STORE BYTE INDEXED BY X ADD =1,X INCREMENT POINTER JNED Y,INLOOP DECREMENT COUNTER RBIT 2,S RESET BYTE MODE JMP JBOOT JUMP TO BOOT * * OUTAD WORD OUTBL ADRESS OF CONTROL BLOCK OUTBL EQU $ MFDED WORD :0001 DRIVE ENABLE DELAY MFSEC WORD :0001 SECTOR MFHEAD WORD :0000 HEAD MFTRAK WORD :0000 TRACK MFUNIT WORD :0000 UNIT # OPC WORD  :0009 OPCODE COMAND WORD :200 * TITL MINI-DIAGNOSTIC * * MINI-DIAGNOSTIC CHECKS PROCESSOR OPERATION *  AND DOES A PARITY PURGE THROUGHOUT MEMORY * TEST EQU $ COPY X,XSAVE SBIT 1,S SET OV JF  OV,STOPIT ENSURE OV WAS SET RBIT 1,S RESET OV JT OV,STOPIT ENSURE OV RESET COPY =0,A ZERO A REGISTER JNE A,STOPIT SUB =1,A IJNE A,STOPIT TEST1 EQU $ COPY A,Q XOR Q,A JEQ A,PURGE STOPIT EQU $ STOP IN TEST OUT A,2 TURN OFF AUTOLOAD LATCH HLT PURGE EQU $ READ/WRITE TO PURGE MEMORY COPY 0(X),A COPY A,0(X) JNED X,TEST1 *  TO ENABLE PARITY LOGIC, ENABLE INTERRUPTS * THEN ISSUE A UIS, NO PARITY ERRORS SHOULD *  OCCUR AFTER THE PURGE SBIT 8,S ENABLE INTERRUPTS UIS RE-ENABLE PARITY CHECKING RBIT 8,S DISABLE INTERRUPTS COPY XSAVE,X COPY RETURN,Y PICK UP RETURN ADDRESS ADD  X,Y ADD AUTOLOAD OFFSET COPY Y,RETURN STORE COMPUTED RETURN ADDRESS JMP *RETURN RETURN THROUGH INDIRECT POINTER * * RETURN FOR AUTOLOAD THROUGH THIS LOCATION * RETURN WORD SETUP * XSAVE RES 1,0 RES 6,0 TITL QCD AUT TEST VERIFY * * THIS ROUTINE COMPUTES THE XUM * OF THE AUTOLOAD ROM AS IT IS * DONE IN THE QCD TEST. * REL :100 COPY HXFF00,A SET UP COUNT COPY A,TEMP2 COPY =0,X  COPY 0(X),A FIRST WORD JMP AUT5 AUT4 EQU $ ADD 0(X),A ADD NEXT AUT5   EQU $ ADD =1,X BUMP INDEX IMS TEMP2 JMP AUT4 CSK A,AUTTOT COMPARE TO QCD VALUE HLT LESS HLT GREATER HLT EQUAL TEMP2 RES 1,0 AUTTOT WORD :FFFF HXFF00 WORD :FF00 END :0009 OPCODE COMAND WORD :200 * TITL MINI-DIAGNOSTIC * * MINI-DIAGNOSTIC CHECKS PROCESSOR OPERATION *  AND DOES A PARITY PURGE THROUGHOUT MEMORY * TEST EQU $ COPY X,XSAVE SBIT 1,S SET OV JF  TITL NM-4 AUTOLOAD TYPE 2 #84-93016-11B0 TITL START * COPYRIGHT 1978,1976 COMPUTER AUTOMATION INC. * * USER DOCUMENTATION 00-93016-00B0 * SOURCE FILE 84-93016-21B0 * OBJECT FILE 84-93016-31B0 * WORD I/O BINARY 92-21000-41B0 * MAINTENANCE DOC 92-21000-51B0 * REL 0 RES 256,0 REL 0 * * START EQU $ JT  SS,MEMSRC IF UNATTENED IN 4,A GET CONSOLE WORD REGISTER CONTENTS JGE A,MEMSRC CHECK FOR TEST JMP JERROR IF TEST-HALT TITL FLOPPY LOADER * * FLOPPY LOADER * FLPYAD EQU :11 FLOPPY DEVICE ADDRESS FLOPPY EQU $ SST FLPYAD*8+4 CHECK FOR CONTROLLER PRESENT JMP NEXT IF NOT PRESENT COPY =7,A READ ALL OPCODE COPY A,OPCODE TO IOB COPY A,SEEK SEEK COUNT FLOP1 EQU $ COPY =1,A SET UP TO READ SECTOR 1 COPY A,SECTOR PUT IT IN IOB  COPY BASE,A GET CODES BASE ADDRESS ADD =IOB-START,A COMPUTE NEW IOB ADDRESS SST FLPYAD*8+0 TEST FOR CONTROLLER IDLE JMP $-1 WAIT FOR CONTROLLER IDLE OUT A,FLPYAD*8+0 ISSUE I/O SST FLPYAD*8+0 TEST FOR COMPLETION JMP $-1 WAIT FOR DONE COPY =-80,A INSURE CYLINDER 0 EXCH A,SEEK GET SEEK COUNT JGE A,FLOP1 IF FIRST SEEK COPY FLPSTT,A  GET STATUS SHIFT A,RO,1 SYSTEM READY BIT TO -OV- JT OV,NEXT IF NOT READY FLOP2 EQU  $ AND =:7F,A CLEAR TO 7 BITS JEQ A,BOOT IF NO ERRORS JERROR EQU $ JMP ERROR  IF ERROR TITL DEVICE SELECTION DECODE * * DEVICE SELECTION DECODE * INIT EQU $ COPY X,BASE SAVE THE BASE ADDRESS OF AUTOLOAD NOW JMP JTEST DO MINI-DIAGNOSTIC SETUP EQU $ THEN RETURN HERE COPY H100,A SET UP MAGNETIC DEVICE WORD COUNT COPY A,WORDS STUFF IT IN THE IOB FIRST EQU $ COPY =0,A INITIALIZE IOB VALUES COPY A,BUFFER BUFFER ADDRESS IS ALWAYS 0 COPY A,INTER NO INTERRUPTS COPY A,FLPSTT CLEAR FLOPPY STATUS COPY A,CYLIN CYLINDER 0  COPY A,UNIT UNIT 0 COPY =5,A SET MINI-FLOPPY AS FIRST DEVICE COPY A,DEV  SET UP FOR UNATTENDED OPERATION NEXT EQU $ IN 4,Q GET CONSOLE WORD REGISTER SHIFT Q,RO,1 RIGHT JSTIFY DEVICE SELECTION CODE COPY PANEL,A GET PANEL FLAG JNE A,NOPANL IF NO PANEL SKIP  SENSE SWITCH TEST JF SS,SAME IF ATTENDED OPERATION NOPANL EQU $ IMS DEV BUMP TO NEXT DEVICE COPY DEV,Q LOAD DEVICE INDEX TITL SAME EQU $ XNX Q  INDEX THE JUMP INSTRUCTION JMP $+1 AND EXECUTE IT JMP NEXT . 0=PTP REL, NOT SUPPORTED JMP NEXT . 1=PTP ABS, NOT SUPPORTED JMP STM14 . 2=STORAGE MODULE, POLLED 4TH JMP FLOPPY . 3=FLOPPY, POLLED 2ND JMP MTIC . 4=MTIC, POLLED 3RD JMP STMU14 . 5=DISC UPPER PLATTER, NOT POLLED JMP MINFL0 . 6= MINI-FLOPPY UNIT 0 POLLED FIRST JMP MINFL1 . 7= MINI-FLOPPY UNIT 1 NOT POLLED TITL MTIC EOB INTERRUPT SERVICE * * RETURN HERE ON MTIC EOB INTERRUPT * MTEOB EQU $ MTSTRT WORD :230  MTIC START COMMAND IN MTICDA+1,A GET STATUS BYTE ONE AND THROW IT AWAY IN MTICDA+1,A  GET STATUS BYTE TWO SUB =:C0,A CHECK HDW & RATE ERRORS JLT A,JERROR IF ERROR - HALT BOOT EQU $  COPY =0,X SET EXECUTION ADDRESS TO 0 JMP MAGS GO CHECK EXECUTION BIT TITL FLOPPY/DISC IOB * * THE FOLLOWING LOCATIONS ARE USED AS TEMP CELLS * BASE RES 1,0 AUTOLOAD RELOCATION ADDRESS DEV RES 1,0  DEVICE TO CHECK IF READY PANEL RES 1,0 PANEL FLAG = 0 IF CONSOLE PRESENT * * THE FOLLOWING LOCATION ARE USED AS THE IOB * FOR THE FLOPPY AND DISCS * IOB EQU $ ORG IOB OPCODE RES 1,0 UNIT RES 1,0 CYLIN RES 1,0 SEEK EQU $ HEAD RES 1,0 SECTOR RES 1,0 WORDS RES 1,0 BUFFER RES 1,0 INTER RES 1,0 FLPWCT EQU $ NXTIOB RES 1,0 FLPSTT EQU $ STMWCT RES 1,0 STMCST RES 1,0 STMDST RES 1,0 TITL MEMORY SEARCH TO RELOCATE AUTOLOAD ************************************************** * NOTE: THIS SECTION IS OVERLAYED WITH * * THE DISK I/O BLOCK. SEE ABOVE * * * **************************************************  ORG IOB-3 * FIND END OF MEMORY MEMSRC EQU $ SBIT 6,S TURN ON XA BIT COPY Q,K SAVE RELOCATION BIAS COPY =0,X START FROM TOP OF MEMORY AND WORK DOWN COPY X,PANEL CLEAR PANEL FLAG COPY =:FF,Y Y USED FOR CONSOLE CHECK AND TRANSFER COUNTER SELP Y,4 PUT Y INTO WORD REG IN  4,Q GET IT BACK CSK Q,=:FF CHECK IF CONSOLE PRESENT NOP COPY Y,PANEL NOT PRESENT SO SET PANEL FLAG NON-ZERO SELP A,4 RESTORE WORD REG IN CASE SS=FALSE FINDMN EQU $ SUB H100,X  DECREMENT MEMORY POINTER COPY =-1,A SET TO ALL ONES EXCH A,0(X) ACCESS MEMORY THROUGH POINTER EXCH A,0(X) ACCESS MEMORY THROUGH POINTER IJNE A,FINDMN BUMP RESULTS OF MEMORY ACCESS, IF NOT RAM, AGAIN EXCH A,0(X) NOW TRY TO GET BACK ZEROS EXCH A,0(X) JNE A,FINDMN IF FAILURE MUST BE ROM COPY A,TRAP NOP TRAP IN CASE OF PARITY ERROR * TRAP WILL FALL THROUGH TO PARITY ERROR HALT   TITL * * RELOCATE AUTOLOAD TO HIGHEST WRITABLE MEMORY * GOTMN EQU $ MOVNXT EQU $ COPY 0(Y),A  PICK UP WORD COPY A,0(X,Y) MOVE IT TO HIGH MEMORY JNED Y,MOVNXT IF DONE MOVING  JMP INIT-START(X) GO TO RELOCATED AUTOLOAD CODE * * TITL DISC STORAGE MODULE LOADER * SMDA EQU :14 DISC STORAGE MODULE DEVICE ADDRESS SUDA EQU :15 * * :14= MEDIUM CAPACITY DISC * :15= HIGH CAPACITY DISC * STMU14 EQU $ COPY =2,Y SET HEAD FOR UPPER PLATTER JMP STMX JUMP AROUND LOWER PLATTER HEAD SET STM14 EQU $ DISC LOWER PLATTER COPY =0,Y SET HEAD FOR LOWER PLATTER STMX COPY Y,HEAD COPY =1,Q COPY =1,X SET Q AND X FOR LOOPING STM0 EQU $ SST SMDA*8+4 SENSE IF CONTROLLER PRESENT JMP TRYUPR IF NOT TRY AT :15 JMP STM1 PRESENT AT :14 TRYUPR SST SUDA*8+4 SENSE IF PRESENT AT :15 JMP FIRST NOT PRESENT SO CHECK FIRST DEVICE COPY =1,Y SET Y FOR :15 PATH TITL STM1 EQU $ COPY =4,A SET UP OPCODE COPY A,OPCODE COPY =0,A INITIALIZE IOB VALUES COPY A,SECTOR SECTOR ADDRESS OF 0 COPY A,NXTIOB NO IOB CHAINING COPY A,STMCST CLEAR CONTROLLER STATUS COPY BASE,A COMPUTE NEW IOB ADDRESS ADD =IOB-START,A CLSN Y,=1 FIND WHICH PATH TO TAKE JMP PATH15 Y WAS SET TO ONE SO TAKE :15 PATH PATH14 SELP A,SMDA*8+4 INITIALIZE THE CONTROLLER SST SMDA*8+0 TEST FOR IDLE JMP $-1  WAIT FOR IDLE OUT A,SMDA*8+0 ISSUE I/O SST SMDA*8+0 TEST FOR COMPLETION JMP $-1  WAIT FOR COMPLETION JMP STAT JUMP AROUND :15 PATH PATH15 SELP A,SUDA*8+0 INITIALIZE THE CONTROLLER  SST SUDA*8+0 TEST FOR IDLE JMP $-1 WAIT FOR IDLE OUT A,SUDA*8+0 ISSUE I/O SST SUDA*8+0 TEST FOR COMPLETION JMP $-1 WAIT FOR COMPLETION STAT COPY STMCST,A GET THE STATUS JGE A,BOOT IF NO ERROR GO EXECUTE BOOT SHIFT A,RO,1 DISC READY BIT TO -OV- JF OV,ERROR IF ERROR AND READY JNED Q,STM1 IF ONLY TRIED ONCE ADD =1,Q MAKE SURE LAST INSTRUCTION IS PASSED AGAIN JNED X,TRYUPR TRY :15 TWICE JMP FIRST IF STILL NOT READY TITL ERROR/EXECUTION HALT * H100 WORD :100 * JFIRST EQU $ JUMP INTO POLLING SEQUENCE COPY =1,A  SET UP FOR DISC STORAGE MODULE NEXT XNEXT COPY A,DEV JMP NEXT * JTEST JMP TEST INDIRECT JUMP TO TEST  TITL UNINSTALLED MEMORY TRAP SET-UP REL :88 ORIGIN AT MEMORY TRAP LOCATION TEMP1 EQU $ LOCATION IS ALSO USED AS A TEMP QCDCHK WORD :A656 QCD ROM CHECKSUM VALUE CKSUM RES 1,0 TRAP EQU $ JMP FINDMN UNINSTALLED MEMORY TRAP IERROR EQU $ USED FOR INDIRECT JUMP AND ALSO JMP ERROR PARITY ERROR SQ RES   1,0 JBOOT JMP BOOT * ERROR EQU $ OUT A,2 TURN OFF AUTOLOAD LIGHT HLT HALT FOR ERROR OR NO EXECUTION COPY Q,K SAVE RELOCATION BIAS JMP FIRST * TITL MTIC LOADER * MTIC LOADER MTICDA EQU :F2 MTIC DEVICE ADDRESS MTRDY EQU :4 READY BIT MTLDP EQU :10  LOAD POINT STATUS POINT MTONL EQU :10 ON-LINE STATUS BIT MTDBY EQU :2 WORD BUSY STATUS BIT MTRAT EQU :40 MTHER EQU :80 MTINT EQU :C8 MTWDCT EQU MTINT+1 MTMODE WORD :4FF * MTIC EQU $ COPY MTMODE,A GET MODE SELECT WORD OUT A,MTICDA+1 ISSUE MODE SELECT IN MTICDA+1,Q GET STATUS BYTE ONE IN MTICDA+1,A GET STATUS BYTE TWO * CHECK STATUS JEQ Q,JFIRST NO DIO INSTALLED, CONTINUE POLLING AND =MTDBY;MTLDP,Q MUST BE AT LOAD POINT AND NOT BUSY JNE Q,JFIRST IF MTIC IS NOT READY, GO TO NEXT DEVICE AND =MTRDY;MTONL,A CHECK FOR READY JNE A,JFIRST IF NOT READY * GOOD STATUS, TRY TO LOAD * ASSUME I/O LOCATIONS ARE LOADED FROM ROM MTIC1 EQU $ COPY BASE,X GET AUTOLOAD BASE  COPY MTSTRT,A GET START I/O COMMAND SBIT 8,S ENABLE INTERRUPTS OUT A,MTICDA+1 ISSUE START TO PICO JMP $ WAIT FOR COMPLETION TITL READY,SET,GO! * MAGS EQU $ FROM MAGNETIC DEVICE LOADING COPY =:40,Y SET UP Y FOR LSI-3/05 OUT A,2 TURN OFF AUTOLOAD LIGHT COPY  PANEL,A CONSOLE ATTACHED JNE A,GOOO NO-AUTOLOAD ANYWAY JT SS,GOOO IF UNATTENDED ALWAYS EXECUTE  IN 4,A INPUT WORD REGISTER SHIFT A,RO,1 GET EXECTUION/NO EXECUTION BIT JF OV,ERROR  IF NO EXECUTION GOOO EQU $ RBIT 6,S TURN OFF XA BIT JMP 0 * TITL MINI-FLOPPY LOADER * PICODA EQU :FC PICO DEVICE ADDRESS, CHANNEL 6 * MINFL1 EQU $ MINI-FLOPPY UNIT 1 COPY =1,A COPY A,MFUNIT MINFL0 EQU $ MINI-FLOPPY UNIT 0 IN PICODA+1,A GET PICO STATUS TO A JEQ A,JMPOUT DIO NOT ENSTALLED TBIT 1,A GET PRESENT/NOT BUSY BIT TO OV JF OV,READY JMPOUT COPY =2,A NOT READY SO SET FLOPPY AS NEXT DEVICE JMP XNEXT JUMP TO NEXT DEVICE READY EQU $  COPY BASE,Y ADD OUTAD,Y CREATE CONTROL BLOCK ADDRESS COPY =1,Q SET Q FOR LOOP TWICE  COPY =9,A SET OPCODE FOR SEEK COPY A,OPC TITL TWICE COPY =5,X SET X AS COUNTER AND POINTER OUTLUP COPY 0(X,Y),A OUTPUT CONTROL INFORMATION OUT A,PICODA IN OUTPUT LOOP JNED X,OUTLUP SEND SIX BYTES COPY COMAND,A OUTPUT OF COMMAND WORD OUT A,PICODA+1 COPY =7,A SET OPCODE FOR READ COPY A,OPC STATUS IN PICODA+1,A INPUT STATUS TBIT 1,A CHECK BUSY BIT JT OV,STATUS LOOP UNTIL NOT BUSY ERRCHK EQU $ ERROR CHECKING AND =:7F,A IGNORE WRITE PROTECT CSK   A,=5 CHECK ERROR CODE JMP HERE A<5, NO ERRORS JF SS,IERROR A>5, IF NOT POLLING - ERROR HALT  JMP JMPOUT A=5, NOT READY SO TRY NEXT DEVICE TITL MTIC I/O INTERRUPT LOCATION SET UP * REL :C8 ORIGIN AT MTIC INTERRUPT LOCATION AIB MTICDA+0 WORD :7E70 READ :C8 WORDS EXEC EQU $ WORD -1 HPC EQU $ WORD 0 JST MTEOB-START(X) AT END OF MTIC READ GOT TO END OF BLOCK TITL MINI-FLOPPY CONTINUED HERE JNED Q,TWICE OUTPUT SEEK0, THEN READ1 AND GO ON INPUT EQU $ INPUT FROM PICO FIFO TO MEMORY  COPY =0,X SET POINTER COPY =:7F,Y SET COUNTER SBIT 2,S SET BYTE MODE INLOOP EQU $ INPUT LOOP IN PICODA,A INPUT A BYTE COPYB A,0(X) STORE BYTE INDEXED BY X ADD =1,X INCREMENT POINTER JNED Y,INLOOP DECREMENT COUNTER RBIT 2,S RESET BYTE MODE JMP JBOOT JUMP TO BOOT * * OUTAD WORD OUTBL ADRESS OF CONTROL BLOCK OUTBL EQU $ MFDED WORD :0001 DRIVE ENABLE DELAY MFSEC WORD :0001 SECTOR MFHEAD WORD :0000 HEAD MFTRAK WORD :0000 TRACK MFUNIT WORD :0000 UNIT # OPC WORD  :0009 OPCODE COMAND WORD :200 * TITL MINI-DIAGNOSTIC * * MINI-DIAGNOSTIC CHECKS PROCESSOR OPERATION *  AND DOES A PARITY PURGE THROUGHOUT MEMORY * TEST EQU $ COPY X,XSAVE SBIT 1,S SET OV JF  OV,STOPIT ENSURE OV WAS SET RBIT 1,S RESET OV JT OV,STOPIT ENSURE OV RESET COPY =0,A ZERO A REGISTER JNE A,STOPIT SUB =1,A IJNE A,STOPIT TEST1 EQU $ COPY A,Q XOR Q,A JEQ A,PURGE STOPIT EQU $ STOP IN TEST OUT A,2 TURN OFF AUTOLOAD LATCH HLT PURGE EQU $ READ/WRITE TO PURGE MEMORY COPY 0(X),A COPY A,0(X) JNED X,TEST1 *  TO ENABLE PARITY LOGIC, ENABLE INTERRUPTS * THEN ISSUE A UIS, NO PARITY ERRORS SHOULD *  OCCUR AFTER THE PURGE SBIT 8,S ENABLE INTERRUPTS UIS RE-ENABLE PARITY CHECKING RBIT 8,S DISABLE INTERRUPTS COPY XSAVE,X COPY RETURN,Y PICK UP RETURN ADDRESS ADD  X,Y ADD AUTOLOAD OFFSET COPY Y,RETURN STORE COMPUTED RETURN ADDRESS JMP *RETURN RETURN THROUGH INDIRECT POINTER * * RETURN FOR AUTOLOAD THROUGH THIS LOCATION * RETURN WORD SETUP * XSAVE RES 1,0 RES 6,0 TITL QCD AUT TEST VERIFY * * THIS ROUTINE COMPUTES THE XUM * OF THE AUTOLOAD ROM AS IT IS * DONE IN THE QCD TEST. * REL :100 COPY HXFF00,A SET UP COUNT COPY A,TEMP2 COPY =0,X  COPY 0(X),A FIRST WORD JMP AUT5 AUT4 EQU $ ADD 0(X),A ADD NEXT AUT5  EQU $ ADD =1,X BUMP INDEX IMS TEMP2 JMP AUT4 CSK A,AUTTOT COMPARE TO QCD VALUE HLT LESS HLT GREATER HLT EQUAL TEMP2 RES 1,0 AUTTOT WORD :FFFF HXFF00 WORD :FF00 EN D :0009 OPCODE COMAND WORD :200 * TITL MINI-DIAGNOSTIC * * MINI-DIAGNOSTIC CHECKS PROCESSOR OPERATION *  AND DOES A PARITY PURGE THROUGHOUT MEMORY * TEST EQU $ COPY X,XSAVE SBIT 1,S SET OV JF :7F,A IGNORE WRITE PROTECT CSK A,=5 IJEQ X,HERE A<5, NO ERRORS AND MAKE X=0 JF SS,XERROR A>5, IF NOT POLLING - ERROR HALT JMP FIRST A=5, NOT READY ERROR - KEEP TRYINGV HERE EQU $ COPY =7,A  SET OPCODE FOR READ JNED Q,TWICE DO SEEK TO 0 THEN READ 1 SECTOR INPUT EQU $ INPUT FROM PICO FIFO TO MEMORY COPY =:7F,Y SET COUNTER SBIT 2,S SET BYTE MODE INLOOP EQU $ INPUT LOOP  IN PICODA,A COPYB A,0(X) STORE BYTE ADD =1,X INCREMENT POINTER JNED Y,INLOOP DECREMENT COUNTER RBIT 2,S RESET BYTE MODE COPY =0,X SET OFFSET TO ZERO JMP MAGS * * CONTROL BLOCK FOR MINI-FLOPPY * OUTBL EQU $ DED WORD :0001 DRIVE ENABLE DELAY MFSEC WORD :0001 SECTOR MFHEAD WORD  :0000 HEAD TRAK WORD :0000 TRACK MFUNIT WORD :0000 MINI FLOPPY UNIT OPC WORD :0009 OPCODE COMAND WORD :200 * TITL INITIALIZE, PURGE MEMORY, AND SELECT DEVICE * * DEVICE SELECTION DECODE * INIT EQU $ COPY X,BASE SAVE THE BASE ADDRESS OF AUTOLOAD NOW PURGE COPY 0(X),A COPY A,0(X) JNED X,PURGE PURGE PARITY  SBIT 8,S ENABLE INTERRUPTS UIS SET PARITY RBIT 8,S DISABLE INTERRUPTS FIRST EQU $ COPY =0,A INITIALIZE IOB VALUES XNEXT COPY A,DEV SET UP FOR UNATTENDED OPERATION NEXT EQU $  IN 4,Q GET CONSOLE WORD REGISTER CONTENTS SHIFT Q,RO,1 RIGHT JUSTIFY DEVICE SELECTIN CODE COPY  PANEL,A GET PANEL FLAG JNE A,NOPANL IF NO CONSOLE SKIP SENSE SWITCH TEST JF SS,SAME IF ATTENDED OPERATION NOPANL EQU $ IMS DEV BUMP TO NEXT DEVICE COPY DEV,Q LOAD DEVICE INDEX SAME EQU $ XNX  Q INDEX THE JUMP INSTRUCTION JMP $+1 JMP RPTP 0=PTP REL, NOT READY TO NEXT JMP APTP 1=PTP ABS, NOT READY TO NEXT BEGIN JT SS,MEMSRC IF UNATTENDED IN 4,A GET CONSOLE WORD REGISTER CONTENTS JGE A,MEMSRC CHECK FOR TEST XERROR JMP ERROR IF TEST-HALT JMP MINFL0 6=MINI-FLOPPY UNIT 0, NR TO NEXTT JMP MINFL1 7=MINI-FLOPPY UNIT 1, NR TO NEXT TITL PAPER TAPE SERVICE ROUTINES * * ABS/REL END TYPE CODE PROCESSING * * NOTE: END ADDRESS OF -1 IS NOT AN EXECUTION ADDRESS * REND EQU $ ADD K,A  ADD RELOCATION BIAS AEND EQU $ COPY A,Q MOVE EXECUTION ADDRESS TO Q IJEQ Q,JTYPE CHECK FOR VALID EXECUTION ADDRESS COPY A,EXEC JTYPE JMP TYPE PROCESS ANOTHER TYPE CODE ** RORG EQU $ ADD K,A ADD RELOCATION BIAS AORG EQU $ COPY A,Y UPDATE THE PC UPDAT EQU $ COPY HPC,X CSM Y,X  JMP $+2 COPY Y,HPC JMP TYPE TITL ** LUPDAT EQU $ IJEQ X,UPDAT BUMP COUNT,IF DONE UP DATE HPC CLSN Q,=8-9&:FF CHECK FOR RES AND FILL TC=8 JMP AWORD KEEP SAME VALUE IF RES AND FILL WORD EQU  $ JST PINPW CLSN Q,=7-9&:FF CHECK FOR REL WORD TC=7 RWORD ADD K,A REL WORD ADD BIAS AWORD EQU $ COPY A,0(Y) STORE VALUE AT PC IJNE Y,LUPDAT BUMP THE PC AND REPEAT * * END OF TAPE SERVICE * * NOTE: ZERO RECORD LENGTH IS AN END OF FILE * EOT EQU $ COPY HPC,Q PUT FIRST AVAILABLE LOCATION IN Q COPY EXEC,X PUT EXECUTION ADDRESS IN X MAGS EQU $ COPY =:40,Y SET UP Y FOR LSI-3/05 OUT A,2 TURN OFF AUTOLOAD LIGHT COPY PANEL,A CONSOLE ATTACHED JNE A,GOOO NO-AUTOLOAD ANYWAY JT SS,GOOO IF UNATTENDED ALWAYS EXECUTE IN 4,A INPUT CONSOLE WORD REGISTER SHIFT A,RO,1 GET EXECUTION BIT TO -OV- JF OV,ERROR IF NO EXECUTION GOOO EQU $ RBIT 6,S TURN OFF XA BIT JMP 0(X) GO EXECUTE PANEL RES 1,0  TITL TEMPORARY STORAGE CELLS * THE FOLLOWING LOCATIONS ARE USED AS TEMP CELLS REL :72 BACMEM RES 1,0 SQ RES 1,0 BASE RES 1,0 BASE ADDRESS OF RELOCATED AUTOLOAD DEV RES 1,0 DEVICE TO SELECT OR POLL EXEC RES  1,0 EXECUTION ADDRESS HPC RES 1,0 HIGH PROGRAM COUNTER LASTCK RES 1,0 CKSAVE RES 1,0 SPINPW RES 1,0 SPINPB RES 1,0 RECORD RES 1,0 TITL MEMORY SIZE TO RELOCATE AUTOLOAD *********************************************** * * * THIS SECTION IS OVERLAYED WITH THE * * TEMPORARY CELLS  * * * *********************************************** ORG EOT+:C * FIND END OF MEMORY MEMSRC EQU $ SBIT 6,S TURN ON XA BIT COPY Q,K SAVE RELOCATION BIAS COPY =0,X START FROM TOP OF MEMORY AND WORK DOWN COPY X,PANEL FIND IF CONSOLE PRESENT  COPY =:FF,Y Y IS USED FOR CONSOLE TEST AND TRANSFER COUNTER SELP Y,4 IN 4,Q SUB Y,Q  JEQ Q,$+2 COPY Q,PANEL NO CONSOLE SO SET PANEL FLAG NON-ZERO SELP A,4 RESTORE WORD REGISTER CONTENTS FINDMN EQU $ SUB H100,X DECREMENT MEMORY POINTER COPY =-1,A SET TO ALL ONES  EXCH A,0(X) ACCESS MEMORY THROUGH POINTER EXCH A,0(X) ACCESS MEMORY THROUGH POINTER IJNE A,FINDMN BUMP RESULTS OF MEMORY ACCESS, IF NOT RAM, AGAIN EXCH A,0(X) NOW TRY TO GET BACK ZEROS EXCH A,0(X) JNE A,FINDMN IF FAILURE MUST BE ROM COPY A,TRAP NOP TRAP IN CASE OF PARITY ERROR * TRAP WILL FALL THROUGH TO PARITY ERROR HALT TITL * * RELOCATE AUTOLOAD TO HIGHEST WRITABLE MEMORY * GOTMN EQU $ MOVNXT EQU $ COPY 0(Y),A PICK UP WORD COPY A,0(X,Y) MOVE IT TO HIGH MEMORY JNED Y,MOVNXT IF DONE MOVING JMP INIT-START(X) GO TO RELOCATED AUTOLOAD CODE PTP1 EQU  $ ENT * LOOK FOR FILEMARK AND INPUT RECORD LENGTH JST PINPB GET A FRAME IN A REGISTER SUB =:FF,A  CHECK FOR FILEMARK JNE A,PTP1+1 IF NOT FOUND LOOK AGAIN COPY A,CKSUM ZERO CHECKSUM JST PINPW  GET RECORD LENGTH (TWO FRAMES) COMP A,A COPY A,RECORD SET COUNT IJEQ A,EOT ZERO LENGTH IS END OF TAPE JMP *PTP1 H8614 WORD :8614 * * TITL UNINSTALLED MEMORY TRAP SET-UP * REL :88  ORG AT MEMORY TRAP TEMP1 EQU $ LOCATION IS ALSO USED AS A TEMP QCDCHK WORD :017C QCD ROM CHECKSUM VALUE CKSUM RES 1,0 TRAP EQU $ JMP FINDMN UNINSTALLED MEMORY TRAP * * * ERROR EQU $ OUT A,2  TURN OFF AUTOLOAD LIGHT HLT HALT FOR ERROR OR NO EXECUTION COPY Q,K SAVE RTELOCATION BIAS JFIRST EQU $ JMP FIRST GO LOAD ANOTHER TAPE * TITL PAPER TAPE SERVICE ROUTINES * * PAPER TAPE INPUT WORD * RETURNS TWO FRAMES IN A * PINPW EQU $ ENT JST PINPB GET FIRST BYTE SHIFT  A,LO,8 MOVE IT TO UPPER BYTE COPY A,TEMP1 STORE IT AWAY JST PINPB GET SECOND BYTE OR TEMP1,A COMBINE TWO BYTES JMP *PINPW * * * BYTE ADDRESS CONSTANT SERVICE * BAC EQU $ COPY K,X GET REL OFFSET TO X SHIFT X,LO,1 MAKE IT A BYTE OFFSET JT OV,ERROR TOO LARGE AN OFFSET COPY X,BACMEM RBIT 0,S CLEAR CARRY ADDC BACMEM,A JT CY,ERROR BAC PLUS OFFSET TOO LARGE COPY  =-1,X JMP AWORD * H100 WORD :100 * JNEXT COPY =6,A SET POLLING SEQUENCE JMP XNEXT TITL  PAPER TAPE TYPE CODE DECODING APTP COPY =0,A ABSOLUTE PAPER TAPE COPY A,K ZERO RELOCATION BIAS RPTP EQU $ RELATIVE PAPER TAPE PTP COPY =0,Y ZERO PC (Y IS PC) COPY Y,HPC AND HIGH PC JST PTP1 GO LOOK FOR RECORD * TYPE CODE DECODING TYPE EQU $ JST PINPB GET TYPE CODE ( 1 FRAME ) COPY A,Q SAVE TYPE CODE CLSN =:40,Q CHECK NULL JMP TYPE AND =:DD,A CLSN =:4D,A CHECK FOR :4D,:6D,:6F JMP SKIPIT JST PINPW GET LENGTH (TWO FRAMES)  NEG A,X MAKE X A COUNTER CLSN =:18,Q CHECK FOR BEGIN JMP TYPE SUB =:9,Q JGT Q,CKERR TITL XNX Q INDEX JUMP INSTRUCTION JMPTBL EQU $ JMP JMPTBL+:9 CKERR  JMP ERROR LSI-2 START JMP AEND 2= ABS END JMP REND 3= REL END JMP AORG 4= ABS ORG JMP RORG 5= REL ORG JMP WORD 6= ABS WORD JMP WORD 7= REL WORD JMP WORD 8= RES AND FILL JMP BAC 9= BYTE ADDRESS CONSTANT * TITL PAPER TAPE INPUT BYTE * * GETS A FRAME FROM THE DIO HSPTR OR DIO TTY PTR * WHICHEVER IS READY * IF NEITHER IS READY, IT RETURNS TO * CHECK THE NEXT DEVICE IN THE POLLING SEQUENCE * * PINPB ENT COPY Q,SQ SAVE Q REGISTER COPY H8614,Q  SET UP DEAD MAN TIMER OUT Q,:FB START DIO HSPTR OUT Q,:F9 START DIO TTY PTR HSR1 EQU $   IN :FB,A GET DIO HSPTR STATUS TBIT 1,A JT OV,TRYTTY . IF SYSTEM NOT READY, TRY TTY PTR TBIT 3,A JT OV,HSR1 . IF STILL THERE TRY AGAIN TRYHSR EQU $ IJEQ Q,GOTIT  INCREMENT DEAD MAN TIMER, IF EXPIRED JUMP IN :FB,A GET DIO HSPTR STATUS TBIT 1,A  JT OV,TRYTTY . IF NOT READY, TRY TTY PTR TBIT 3,A JF OV,TRYTTY . IF NO WORD READY,TRY TTY * IN :FA,A GET A BYTE FROM HSPTR JMP GOTIT GOT A BYTE TRYTTY EQU $ IN :F9,A GET TTY STATUS TBIT 1,A JT OV,TRYHSR . IF NOT THERE, BACK TO HSPTR TBIT 3,A JF OV,TRYHSR . IF NO WORD TRY HSPTR IN :F8,A GET A BYTE FROM TTY PTR TITL GOTIT EQU $ EXCH H100,X GET RESET COMMNAD OUT X,:FB RESET DIO HSPTR OUT  X,:F9 RESET DIO TTY EXCH H100,X RESTORE X JEQ Q,JNEXT COPY SQ,Q  RESTORE Q * NOW DO CHECKSUM CALCULATION CK EQU $ EXCH A,CKSUM COPY A,LASTCK SAVE LAST CHECKSUM  SHIFT A,RO,1 JF OV,$+2 OR =:80,A TURN ON BIT 7 XOR CKSUM,A EXCH CKSUM,A  RESTORE CHARACTER IMS RECORD JMP *PINPB TITL CKSM EQU $ CHECKSUM VERIFICATION COPY LASTCK,A GET LAST CHECKSUM COPY A,CKSAVE SAVE IT COPY PINPB,A GET RETURN POINTER COPY A,SPINPB SAVE IT COPY PINPW,A COPY A,SPINPW SAVE ANOTHER JST PINPB GET CHECKSUM BYTE SUB  CKSAVE,A SHOULD BE ZERO JNE A,CKERR ERROR JUMP COPY TEMP1,A SAVE UIPPER BYTE IF IN WORD FETCH  COPY A,CKSAVE JST PTP1 LOOK FOR FILEMARK INPUT RECORD COUNT COPY CKSAVE,A RESTORE UPPER BYTE  COPY A,TEMP1 COPY SPINPW,A COPY A,PINPW RESTORE POINTER COPY SPINPB,A COPY A,PINPB RESTORE POINTER JMP PINPB+1 PICK UP A BYTE AND RETURN IN PREVIOUS TC ** SKIPIT EQU $ JST PINPB GET LENGTHH COPY A,Q SAVE IT IN Q JEQD Q,XTYPE IF ZERO DO NEXT TYPE JST PINPB IF NOT GET NEXT BYTE JNED Q,$-1 INPUT BYTES TILL Q=0E XTYPE JMP TYPE TITL QCD AUT TEST VERIFY * * THIS ROUTINE COMPUTES THE XUM * OF THE AUTOLOAD ROM AS IT IS * DONE IN THE QCD TEST. * REL :100 COPY HXFF00,A  SET UP COUNT COPY A,TEMP2 COPY =0,X COPY 0(X),A FIRST WORD JMP AUT5 AUT4 EQU $ ADD 0(X),A ADD NEXT AUT5 EQU $ ADD =1,X BUMP INDEX  IMS TEMP2 JMP AUT4 CSK A,AUTTOT COMPARE TO QCD VALUE HLT LESS HLT GREATER HLT EQUAL TEMP2 RES 1,0 AUTTOT WORD :FFFF HXFF00 WORD :FF00 END COPY PINPB,A GET RETURN POINTER COPY A,SPINPB SAVE IT COPY PINPW,A COPY A,SPINPW SAVE ANOTHER JST PINPB GET CHECKSUM BYTE SUB   CKSAVE,A SHOULD BE ZERO JNE A,CKERR ERROR JUMP COPY TEMP1,A SAVE UIPPER BYTE IF IN WORD FETCH  COPY A,CKSAVE JST PTP1 LOOK FOR FILEMARK INPUT RECORD COUNT COPY CKSAVE,A RESTORE UPPER BYTE O0SEGMENTBLANK oi ~|   B~~4 6O c󦣞䆨  AN ޓ’C  vuPޞ0 @)B? ep@)~idAMx @u iijI)=i ] _bcU Bl ~~~~Q  6UK5 ;!V? / p@ ~AQ+X Q"i@ C 6g B6 Q I )5  6= i E~pU)i%+u'6  66G  @EB 5 `"恟 )+ޅ|   09 OPCODE COMAND WORD :200 * TITL MINI-DIAGNOSTIC * * MINI-DIAGNOSTIC CHECKS PROCESSOR OPERATION *  AND DOES A PARITY PURGE THROUGHOUT MEMORY * TEST EQU $ COPY X,XSAVE SBIT 1,S SET OV JF  TITL NM-4 AUTOLOAD TYPE 2 #84-93016-11B0 TITL START * COPYRIGHT 1978,1976 COMPUTER AUTOMATION INC. * * USER DOCUMENTATION 00-93016-00B0 * SOURCE FILE 84-93016-21B0 * OBJECT FILE 84-93016-31B0 * WORD I/O BINARY 92-21000-41B0 * MAINTENANCE DOC 92-21000-51B0 * REL 0 RES 256,0 REL 0 * * START EQU $ JT  SS,MEMSRC IF UNATTENED IN 4,A GET CONSOLE WORD REGISTER CONTENTS JGE A,MEMSRC CHECK FOR TEST JMP JERROR IF TEST-HALT TITL FLOPPY LOADER * * FLOPPY LOADER * FLPYAD EQU :11 FLOPPY DEVICE ADDRESS FLOPPY EQU $ SST FLPYAD*8+4 CHECK FOR CONTROLLER PRESENT JMP NEXT IF NOT PRESENT COPY =7,A READ ALL OPCODE COPY A,OPCODE TO IOB COPY A,SEEK SEEK COUNT FLOP1 EQU $ COPY =1,A SET UP TO READ SECTOR 1 COPY A,SECTOR PUT IT IN IOB  COPY BASE,A GET CODES BASE ADDRESS ADD =IOB-START,A COMPUTE NEW IOB ADDRESS SST FLPYAD*8+0 TEST FOR CONTROLLER IDLE JMP $-1 WAIT FOR CONTROLLER IDLE OUT A,FLPYAD*8+0 ISSUE I/O SST FLPYAD*8+0 TEST FOR COMPLETION JMP $-1 WAIT FOR DONE COPY =-80,A INSURE CYLINDER 0 EXCH A,SEEK GET SEEK COUNT JGE A,FLOP1 IF FIRST SEEK COPY FLPSTT,A  GET STATUS SHIFT A,RO,1 SYSTEM READY BIT TO -OV- JT OV,NEXT IF NOT READY FLOP2 EQU  $ AND =:7F,A CLEAR TO 7 BITS JEQ A,BOOT IF NO ERRORS JERROR EQU $ JMP ERROR  IF ERROR TITL DEVICE SELECTION DECODE * * DEVICE SELECTION DECODE * INIT EQU $ COPY X,BASE SAVE THE BASE ADDRESS OF AUTOLOAD NOW JMP JTEST DO MINI-DIAGNOSTIC SETUP EQU $ THEN  RETURN HERE COPY H100,A SET UP MAGNETIC DEVICE WORD COUNT COPY A,WORDS STUFF IT IN THE IOB FIRST EQU $ COPY =0,A INITIALIZE IOB VALUES COPY A,BUFFER BUFFER ADDRESS IS ALWAYS 0 COPY A,INTER NO INTERRUPTS COPY A,FLPSTT CLEAR FLOPPY STATUS COPY A,CYLIN CYLINDER 0  COPY A,UNIT UNIT 0 COPY =5,A SET MINI-FLOPPY AS FIRST DEVICE COPY A,DEV  SET UP FOR UNATTENDED OPERATION NEXT EQU $ IN 4,Q GET CONSOLE WORD REGISTER SHIFT Q,RO,1 RIGHT JSTIFY DEVICE SELECTION CODE COPY PANEL,A GET PANEL FLAG JNE A,NOPANL IF NO PANEL SKIP SENSE SWITCH TEST JF SS,SAME IF ATTENDED OPERATION NOPANL EQU $ IMS DEV BUMP TO NEXT DEVICE COPY DEV,Q LOAD DEVICE INDEX TITL SAME EQU $ XNX Q  INDEX THE JUMP INSTRUCTION JMP $+1 AND EXECUTE IT JMP NEXT . 0=PTP REL, NOT SUPPORTED JMP NEXT . 1=PTP ABS, NOT SUPPORTED JMP STM14 . 2=STORAGE MODULE, POLLED 4TH JMP FLOPPY . 3=FLOPPY, POLLED 2ND JMP MTIC . 4=MTIC, POLLED 3RD JMP STMU14 . 5=DISC UPPER PLATTER, NOT POLLED JMP MINFL0 . 6= MINI-FLOPPY UNIT 0 POLLED FIRST JMP MINFL1 . 7= MINI-FLOPPY UNIT 1 NOT POLLED TITL MTIC EOB INTERRUPT SERVICE * * RETURN HERE ON MTIC EOB INTERRUPT * MTEOB EQU $ MTSTRT WORD :230  MTIC START COMMAND IN MTICDA+1,A GET STATUS BYTE ONE AND THROW IT AWAY IN MTICDA+1,A  GET STATUS BYTE TWO SUB =:C0,A CHECK HDW & RATE ERRORS JLT A,JERROR IF ERROR - HALT BOOT EQU $  COPY =0,X SET EXECUTION ADDRESS TO 0 JMP MAGS GO CHECK EXECUTION BIT TITL FLOPPY/DISC IOB * * THE FOLLOWING LOCATIONS ARE USED AS TEMP CELLS * BASE RES 1,0 AUTOLOAD RELOCATION ADDRESS DEV RES 1,0  DEVICE TO CHECK IF READY PANEL RES 1,0 PANEL FLAG = 0 IF CONSOLE PRESENT * * THE FOLLOWING LOCATION ARE USED AS THE IOB * FOR THE FLOPPY AND DISCS * IOB EQU $ ORG IOB OPCODE RES 1,0 UNIT RES 1,0 CYLIN RES 1,0 SEEK EQU $ HEAD RES 1,0 SECTOR RES 1,0 WORDS RES 1,0 BUFFER RES 1,0 INTER RES 1,0 FLPWCT EQU $ NXTIOB RES 1,0 FLPSTT EQU $ STMWCT RES 1,0 STMCST RES 1,0 STMDST RES 1,0 TITL MEMORY SEARCH TO RELOCATE AUTOLOAD ************************************************** * NOTE: THIS SECTION IS OVERLAYED WITH * * THE DISK I/O BLOCK. SEE ABOVE * * * **************************************************  ORG IOB-3 * FIND END OF MEMORY MEMSRC EQU $ SBIT 6,S TURN ON XA BIT COPY Q,K SAVE RELOCATION BIAS COPY =0,X START FROM TOP OF MEMORY AND WORK DOWN COPY X,PANEL CLEAR PANEL FLAG COPY =:FF,Y Y USED FOR CONSOLE CHECK AND TRANSFER COUNTER SELP Y,4 PUT Y INTO WORD REG IN   4,Q GET IT BACK CSK Q,=:FF CHECK IF CONSOLE PRESENT NOP COPY Y,PANEL NOT PRESENT SO SET PANEL FLAG NON-ZERO SELP A,4 RESTORE WORD REG IN CASE SS=FALSE FINDMN EQU $ SUB H100,X  DECREMENT MEMORY POINTER COPY =-1,A SET TO ALL ONES EXCH A,0(X) ACCESS MEMORY THROUGH POINTER EXCH A,0(X) ACCESS MEMORY THROUGH POINTER IJNE A,FINDMN BUMP RESULTS OF MEMORY ACCESS, IF NOT RAM, AGAIN EXCH A,0(X) NOW TRY TO GET BACK ZEROS EXCH A,0(X) JNE A,FINDMN IF FAILURE MUST BE ROM COPY A,TRAP NOP TRAP IN CASE OF PARITY ERROR * TRAP WILL FALL THROUGH TO PARITY ERROR HALT  TITL * * RELOCATE AUTOLOAD TO HIGHEST WRITABLE MEMORY * GOTMN EQU $ MOVNXT EQU $ COPY 0(Y),A  PICK UP WORD COPY A,0(X,Y) MOVE IT TO HIGH MEMORY JNED Y,MOVNXT IF DONE MOVING  JMP INIT-START(X) GO TO RELOCATED AUTOLOAD CODE * * TITL DISC STORAGE MODULE LOADER * SMDA EQU :14 DISC STORAGE MODULE DEVICE ADDRESS SUDA EQU :15 * * :14= MEDIUM CAPACITY DISC * :15= HIGH CAPACITY DISC * STMU14 EQU $ COPY =2,Y SET HEAD FOR UPPER PLATTER JMP STMX JUMP AROUND LOWER PLATTER HEAD SET STM14 EQU $ DISC LOWER PLATTER COPY =0,Y SET HEAD FOR LOWER PLATTER STMX COPY Y,HEAD COPY =1,Q COPY =1,X SET Q AND X FOR LOOPING STM0 EQU $ SST SMDA*8+4 SENSE IF CONTROLLER PRESENT JMP TRYUPR IF NOT TRY AT :15 JMP STM1 PRESENT AT :14 TRYUPR SST SUDA*8+4 SENSE IF PRESENT AT :15 JMP FIRST NOT PRESENT SO CHECK FIRST DEVICE COPY =1,Y SET Y FOR :15 PATH TITL STM1 EQU $ COPY =4,A SET UP OPCODE COPY A,OPCODE COPY =0,A INITIALIZE IOB VALUES COPY A,SECTOR SECTOR ADDRESS OF 0 COPY A,NXTIOB NO IOB CHAINING COPY A,STMCST CLEAR CONTROLLER STATUS COPY BASE,A COMPUTE NEW IOB ADDRESS ADD =IOB-START,A CLSN Y,=1 FIND WHICH PATH TO TAKE JMP PATH15 Y WAS SET TO ONE SO TAKE :15 PATH PATH14 SELP A,SMDA*8+4 INITIALIZE THE CONTROLLER SST SMDA*8+0 TEST FOR IDLE JMP $-1  WAIT FOR IDLE OUT A,SMDA*8+0 ISSUE I/O SST SMDA*8+0 TEST FOR COMPLETION JMP $-1  WAIT FOR COMPLETION JMP STAT JUMP AROUND :15 PATH PATH15 SELP A,SUDA*8+0 INITIALIZE THE CONTROLLER  SST SUDA*8+0 TEST FOR IDLE JMP $-1 WAIT FOR IDLE OUT A,SUDA*8+0 ISSUE I/O SST SUDA*8+0 TEST FOR COMPLETION JMP $-1 WAIT FOR COMPLETION STAT COPY STMCST,A GET THE STATUS JGE A,BOOT IF NO ERROR GO EXECUTE BOOT SHIFT A,RO,1 DISC READY BIT TO -OV- JF OV,ERROR IF ERROR AND READY JNED Q,STM1 IF ONLY TRIED ONCE ADD =1,Q MAKE SURE L AST INSTRUCTION IS PASSED AGAIN JNED X,TRYUPR TRY :15 TWICE JMP FIRST IF STILL NOT READY TITL ERROR/EXECUTION HALT * H100 WORD :100 * JFIRST EQU $ JUMP INTO POLLING SEQUENCE COPY =1,A  SET UP FOR DISC STORAGE MODULE NEXT XNEXT COPY A,DEV JMP NEXT * JTEST JMP TEST INDIRECT JUMP TO TEST  TITL UNINSTALLED MEMORY TRAP SET-UP REL :88 ORIGIN AT MEMORY TRAP LOCATION TEMP1 EQU $ LOCATION IS ALSO USED AS A TEMP QCDCHK WORD :A256 QCD ROM CHECKSUM VALUE CKSUM RES 1,0 TRAP EQU $ JMP FINDMN UNINSTALLED MEMORY TRAP IERROR EQU $ USED FOR INDIRECT JUMP AND ALSO JMP ERROR PARITY ERROR SQ RES  1,0 JBOOT JMP BOOT * ERROR EQU $ OUT A,2 TURN OFF AUTOLOAD LIGHT HLT HALT FOR ERROR OR NO EXECUTION COPY Q,K SAVE RELOCATION BIAS JMP FIRST * TITL MTIC LOADER * MTIC LOADER MTICDA EQU :F2 MTIC DEVICE ADDRESS MTRDY EQU :4 READY BIT MTLDP EQU :10  LOAD POINT STATUS POINT MTONL EQU :10 ON-LINE STATUS BIT MTDBY EQU :2 WORD BUSY STATUS BIT MTRAT EQU :40 MTHER EQU :80 MTINT EQU :C8 MTWDCT EQU MTINT+1 MTMODE WORD :4FF * MTIC EQU $ COPY MTMODE,A GET MODE SELECT WORD OUT A,MTICDA+1 ISSUE MODE SELECT IN MTICDA+1,Q GET STATUS BYTE ONE IN MTICDA+1,A GET STATUS BYTE TWO * CHECK STATUS JEQ Q,JFIRST NO DIO INSTALLED, CONTINUE POLLING AND =MTDBY;MTLDP,Q MUST BE AT LOAD POINT AND NOT BUSY JNE Q,JFIRST IF MTIC IS NOT READY, GO TO NEXT DEVICE AND =MTRDY;MTONL,A CHECK FOR READY JNE A,JFIRST IF NOT READY * GOOD STATUS, TRY TO LOAD * ASSUME I/O LOCATIONS ARE LOADED FROM ROM MTIC1 EQU $ COPY BASE,X GET AUTOLOAD BASE  COPY MTSTRT,A GET START I/O COMMAND SBIT 8,S ENABLE INTERRUPTS OUT A,MTICDA+1 ISSUE START TO PICO JMP $ WAIT FOR COMPLETION TITL READY,SET,GO! * MAGS EQU $ FROM MAGNETIC DEVICE LOADING COPY =:40,Y SET UP Y FOR LSI-3/05 OUT A,2 TURN OFF AUTOLOAD LIGHT COPY  PANEL,A CONSOLE ATTACHED JNE A,GOOO NO-AUTOLOAD ANYWAY JT SS,GOOO IF UNATTENDED ALWAYS EXECUTE  IN 4,A INPUT WORD REGISTER SHIFT A,RO,1 GET EXECTUION/NO EXECUTION BIT JF OV,ERROR  IF NO EXECUTION GOOO EQU $ RBIT 6,S TURN OFF XA BIT JMP 0 * TITL MINI-FLOPPY LOADER * PICODA EQU :FC PICO DEVICE ADDRESS, CHANNEL 6 * MINFL1 EQU $ MINI-FLOPPY UNIT 1 COPY =1,A COPY A,MFUNIT MINFL0 EQU $ MINI-FLOPPY UNIT 0 IN PICODA+1,A GET PICO STATUS TO A JEQ A,JMPOUT DIO NOT ENSTALLED TBIT 1,A GET PRESENT/NOT BUSY BIT TO OV JF OV,READY JMPOUT COPY =2,A NOT READY SO SET FLOPPY AS NEXT DEVICE JMP XNEXT JUMP TO NEXT DEVICE READY EQU $   COPY BASE,Y ADD OUTAD,Y CREATE CONTROL BLOCK ADDRESS COPY =1,Q SET Q FOR LOOP TWICE  COPY =9,A SET OPCODE FOR SEEK COPY A,OPC TITL TWICE COPY =5,X SET X AS COUNTER AND POINTER OUTLUP COPY 0(X,Y),A OUTPUT CONTROL INFORMATION OUT A,PICODA IN OUTPUT LOOP JNED X,OUTLUP SEND SIX BYTES COPY COMAND,A OUTPUT OF COMMAND WORD OUT A,PICODA+1 COPY =7,A SET OPCODE FOR READ COPY A,OPC STATUS IN PICODA+1,A INPUT STATUS TBIT 1,A CHECK BUSY BIT JT OV,STATUS LOOP UNTIL NOT BUSY ERRCHK EQU $ ERROR CHECKING AND =:7F,A IGNORE WRITE PROTECT CSK  A,=5 CHECK ERROR CODE JMP HERE A<5, NO ERRORS JF SS,IERROR A>5, IF NOT POLLING - ERROR HALT  JMP JMPOUT A=5, NOT READY SO TRY NEXT DEVICE TITL MTIC I/O INTERRUPT LOCATION SET UP * REL :C8 ORIGIN AT MTIC INTERRUPT LOCATION AIB MTICDA+0 WORD :7E70 READ :C8 WORDS EXEC EQU $ WORD -1 HPC EQU $ WORD 0 JST MTEOB-START(X) AT END OF MTIC READ GOT TO END OF BLOCK TITL MINI-FLOPPY CONTINUED HERE JNED Q,TWICE OUTPUT SEEK0, THEN READ1 AND GO ON INPUT EQU $ INPUT FROM PICO FIFO TO MEMORY  COPY =0,X SET POINTER COPY =:7F,Y SET COUNTER SBIT 2,S SET BYTE MODE INLOOP EQU $ INPUT LOOP IN PICODA,A INPUT A BYTE COPYB A,0(X) STORE BYTE INDEXED BY X ADD =1,X INCREMENT POINTER JNED Y,INLOOP DECREMENT COUNTER RBIT 2,S RESET BYTE MODE JMP JBOOT JUMP TO BOOT * * OUTAD WORD OUTBL ADRESS OF CONTROL BLOCK OUTBL EQU $ MFDED WORD :0001 DRIVE ENABLE DELAY MFSEC WORD :0001 SECTOR MFHEAD WORD :0000 HEAD MFTRAK WORD :0000 TRACK MFUNIT WORD :0000 UNIT # OPC WORD  :0009 OPCODE COMAND WORD :200 * TITL MINI-DIAGNOSTIC * * MINI-DIAGNOSTIC CHECKS PROCESSOR OPERATION *  AND DOES A PARITY PURGE THROUGHOUT MEMORY * TEST EQU $ COPY X,XSAVE SBIT 1,S SET OV JF  OV,STOPIT ENSURE OV WAS SET RBIT 1,S RESET OV JT OV,STOPIT ENSURE OV RESET COPY =0,A ZERO A REGISTER JNE A,STOPIT SUB =1,A IJNE A,STOPIT TEST1 EQU $ COPY A,Q XOR Q,A JEQ A,PURGE STOPIT EQU $ STOP IN TEST OUT A,2 TURN OFF AUTOLOAD LATCH HLT PURGE EQU $ READ/WRITE TO PURGE MEMORY COPY 0(X),A COPY A,0(X) JNED X,TEST1 *  TO ENABLE PARITY LOGIC, ENABLE INTERRUPTS * THEN ISSUE A UIS, NO PARITY ERRORS SHOULD *  OCCUR AFTER THE PURGE SBIT 8,S ENABLE INTERRUPTS UIS RE-ENABLE PARITY CHECKING RBIT 8,S DISABLE INTERRUPTS COPY XSAVE,X COPY RETURN,Y PICK UP RETURN ADDRESS ADD  X,Y ADD AUTOLOAD OFFSET COPY Y,RETURN STORE COMPUTED RETURN ADDRESS JMP *RETURN RETURN THROUG H INDIRECT POINTER * * RETURN FOR AUTOLOAD THROUGH THIS LOCATION * RETURN WORD SETUP * XSAVE RES 1,0 RES 6,0 TITL QCD AUT TEST VERIFY * * THIS ROUTINE COMPUTES THE XUM * OF THE AUTOLOAD ROM AS IT IS * DONE IN THE QCD TEST. * REL :100 COPY HXFF00,A SET UP COUNT COPY A,TEMP2 COPY =0,X  COPY 0(X),A FIRST WORD JMP AUT5 AUT4 EQU $ ADD 0(X),A ADD NEXT AUT5  EQU $ ADD =1,X BUMP INDEX IMS TEMP2 JMP AUT4 CSK A,AUTTOT COMPARE TO QCD VALUE HLT LESS HLT GREATER HLT EQUAL TEMP2 RES 1,0 AUTTOT WORD :FFFF HXFF00 WORD :FF00 END :0009 OPCODE COMAND WORD :200 * TITL MINI-DIAGNOSTIC * * MINI-DIAGNOSTIC CHECKS PROCESSOR OPERATION *  AND DOES A PARITY PURGE THROUGHOUT MEMORY * TEST EQU $ COPY X,XSAVE SBIT 1,S SET OV JF  TITL NM-4 AUTOLOAD TYPE 3 #84-93016-12B0 TITL START TYPE 3 * COPYRIGHT 1978,1976 COMPUTER AUTOMATION INC. * * USER DOCUMENTATION 00-93016-00B0 * SOURCE FILE 84-93016-22B0 * OBJECT FILE 84-93016-32B0 * WORD I/O BINARY  92-21000-42B0 * MAINTENANCE DOC 92-21000-51B0 * REL 0 RES 256,0 REL 0 * * START EQU $  JT SS,MEMSRC IF UNATTENDED IN 4,A GET CONSOLE WORD REGISTER CONTENTS JGE A,MEMSRC CHECK FOR TEST JMP JERROR IF TEST-HALT TITL MINI-DIAGNOSTIC AND PARITY PURGE TEST EQU $ TEST1 EQU $ COPY 0(X),A READ A CELL COPY A,0(X) WRITE IT BACK JNED X,TEST1 PURGE FROM AUTOLOAD BASE DOWN SBIT 8,S ENABLE INTERRUPTS UIS RE-ENABLE PARITY CHECKING RBIT 8,S DISABLE AGAIN  COPY BASE,X JMP FIRST GO AUTOLOAD SOMETHING TITL FLOPPY LOADER * * FLOPPY LOADER * FLOPDA EQU :11  FLOPPY DEVICE ADDRESS FLOPPY EQU $ SST FLOPDA*8+4 CHECK FOR CONTROLLER PRESENT JMP FIRST  IF NOT PRESENT COPY =7,A READ ALL OPCODE COPY A,OPCODE TO IOB COPY A,SEEK  SEEK COUNT FLOP1 EQU $ COPY =1,A SET UP TO READ SECTOR 1 COPY A,SECTOR PUT IT IN IOB COPY BASE,A GET CODES BASE ADDRESS ADD =IOB-START,A COMPUTE NEW IOB ADDRESS SST FLOPDA*8+0 TEST FOR CONTROLLER IDLE JMP $-1 WAIT FOR CONTROLLER IDLE OUT A,FLOPDA*8+0 ISSUE I/O SST FLOPDA*8+0 TEST FOR COMPLETION JMP $-1 WAIT FOR DONE COPY =-80,A INSURE CYLINDER 0 EXCH A,SEEK GET SEEK COUNT JGE A,FLOP1 IF FIRST SEEK COPY FLPSTT,A GET STATUS SHIFT A,RO,1 SYSTEM READY BIT TO -OV- JT OV,FIRST IF NOT READY FLOP2 EQU $ AND =:7F,A CLEAR TO 7 BITS JEQ A,BOOT IF NO ERRORS JERROR EQU $  JMP ERROR IF ERROR BOOT COPY =0,X JMP MAGS TITL INITIALIZE AND SELECT DEVICE INIT EQU  $ COPY X,BASE JMP TEST FIRST EQU $ GET READY TO TRY DEVICES COPY =0,A INITIALIZE THE IOB COPY A,FLPSTT CLEAR FLOPPY STATUS COPY A,BUFFER CLEAR THE IOB COPY A,INTER COPY  A,CYLIN COPY A,UNIT UNIT 0 COPY A,DEV SET UP FOR POLLING DEVICES COPY H100,A COPY  A,WORDS SET UP WORD COUNT NEXT EQU $ SECONDARY DEVICE RETURN IN 4,Q INPUT CONSOLE WORD REGISTER SHIFT Q,RO,1 STRIP EXECUTION BIT COPY PANEL,A GET PANEL FLAG JNE A,NOPANL IF NO CONSOLE INSTALLED THEN POLL JF SS,SAME IF ATTENDED OPERATION NOPANL EQU $ IMS DEV BUMP DEVICE SELECTION COPY DEV,Q LOAD Q FOR DEVICE INDEX TITL SAME EQU $ LOAD FROM SAME DEVICE XNX Q INDEX THE JUMP INSTRUCTION JMP $+1 AND EXECUTE FROM SELECTED DEVICE JMP RPTP 0= PTP REL, NOT READY TO NEXT JMP APTP 1= PTP ABS, NOT READY TO NEXT JMP NEXT 2= DISC, NOT SUPPORTED JMP FLOPPY 3= FLOPPY, NOT READY TO NEXT TITL FLOPPY IOB AND TEMP CELLS * * THE FOLLOWING LOCATIONS ARE USED FOR THE FLOPPY IOB * AND TEMPORARY CELLS * * TEMP CELLS PANEL RES 1,0 DEV RES 1,0 EXEC RES 1,0 HPC RES 1,0 BASE RES 1,0 BACMEM RES 1,0 * IOB EQU $ ORG IOB OPCODE RES 1,0 UNIT RES 1,0 CYLIN RES 1,0 SEEK EQU $ HEAD RES 1,0 SECTOR RES 1,0 WORDS RES 1,0 BUFFER RES 1,0 INTER RES 1,0 FLPWCT EQU $ RES 1,0 FLPSTT EQU $ RES 1,0 STM  RES 2,0 TITL MEMORY SEARCH TO RELOCATE AUTOLOAD ************************************************** * NOTE: THIS SECTION IS OVERLAYED WITH * * THE FLOPPY I/O BLOCK - SEE ABOVE * *  * ************************************************** ORG IOB-6 * FIND END OF MEMORY MEMSRC EQU $  SBIT 6,S TURN ON XA BIT COPY Q,K SAVE RELOCATION BIAS COPY =0,X START FROM TOP OF MEMORY AND WORK DOWN COPY X,PANEL FIND IF CONSOLE PRESENT COPY =:FF,Y Y IS USED FOR CONSOLE TEST AND TRANSFER COUNTER SELP Y,4 IN 4,Q SUB Y,Q JEQ Q,$+2 COPY Q,PANEL NO CONSOLE SO SET PANEL FLAG NON-ZERO SELP A,4 RESTORE WORD REGISTER CONTENTS FINDMN EQU $ SUB H100,X  DECREMENT MEMORY POINTER COPY =-1,A SET TO ALL ONES EXCH A,0(X) ACCESS MEMORY THROUGH POINTER EXCH A,0(X) ACCESS MEMORY THROUGH POINTER IJNE A,FINDMN BUMP RESULTS OF MEMORY ACCESS, IF NOT RAM, AGAIN EXCH A,0(X) NOW TRY TO GET BACK ZEROS EXCH A,0(X) JNE A,FINDMN  IF FAILURE MUST BE ROM COPY A,TRAP NOP TRAP IN CASE PARITY ERROR * TRAP WILL FALL THROUGH TO PARITY ERROR HALT TITL * * RELOCATE AUTOLOAD TO HIGHEST WRITABLE MEMORY * GOTMN EQU $ MOVNXT EQU $ COPY 0(Y),A  PICK UP WORD COPY A,0(X,Y) MOVE IT TO HIGH MEMORY JNED Y,MOVNXT IF DONE MOVING   JMP INIT-START(X) GO TO RELOCATED AUTOLOAD CODE * TITL TYPE CODE PROCESSING ** RORG EQU $ ADD K,A ADD RELOCATION BIAS IF ANY AORG EQU $ COPY A,Y UPDATE THE PC UPDAT EQU  $ COPY HPC,X CSM Y,X JMP $+2 COPY Y,HPC JMP TYPE DO NEXT TYPE CODE * * ABS/REL END TYPE CODE PROCESSING * *NOTE: END ADDRESS OF :FFFF IS NOT AN EXECUTION ADDRESS * REND EQU $ ADD K,A ADD RELOCATION BIAS IF ANY AEND EQU $ COPY A,Q MOVE EXECUTION ADDRESS TO Q IJEQ Q,JTYPE  CHECK FOR VALID EXECUTION ADDRESS COPY A,EXEC STORE EXECUTION ADDRESS JTYPE JMP TYPE GO PROCESS NEXT TYPE CODE * BAC EQU $ COPY K,X COPY REL OFFSET TO X SHIFT X,LO,1 MAKE IT A BYTE OFFSET JT OV,ERROR REL OFFSET >32K TOO LARGE COPY X,BACMEM BYTE OFFSET TO MEMORY RBIT 0,S RESET CARRY BIT ADDC BACMEM,A ADD IN BAC PLUS OFFSET JT CY,ERROR BAC PLUS OFFSET TOO LARGE COPY =-1,X SET COUNT TO -1 JMP AWORD EXIT * TITL ** * LUPDAT EQU $ IJEQ X,UPDAT BUMP COUNT, IF DONE UPDATE HPC  CLSN Q,=8-9&:FF CHECK FOR RES AND FILL TC = 8 JMP AWORD IF RES AND FILL KEEP OLD VALUE WORD EQU $ JST PINPW GET NEW VALUE CLSN Q,=7-9&:FF CHECK FOR REL WORD TC = 7 RWORD ADD K,A REL WORD, ADD BIAS AWORD EQU $ COPY A,0(Y) STORE VALUE AT PC IJNE Y,LUPDAT BUMP PC AND REPEAT * SKIPIT EQU $  JST PINPB COPY A,Q JEQD Q,JTYPE IF LENGTH IS 0, DO NEXT TC JST PINPB JNED Q,$-1 JMP TYPE * TITL EXECUTION PREPARATION * * ZERO RECORD LENGTH IS AND END OF FILE * EOT EQU $  COPY HPC,Q PUT FIRST AVAILABLE MEMORY LOCATION IN QQ COPY EXEC,X PUT EXECUTION ADDRESS IN X MAGS EQU $ COPY =:40,Y SET UP FOR LSI 3/05 OPERATION OUT A,2 TURN OFF AUTOLOAD LIGHT COPY PANEL,A CONSOLE ATTACHED JNE A,GOOO NO-AUTOLOAD ANYWAY JT SS,GOOO IF UNATTENDED ALWAYS EXECUTE IN 4,A INPUT CONSOLE REGISTER SHIFT A,RO,1 GET EXECUTION BIT TO OV JF OV,ERROR STOP IF NO EXECUTION GOOO EQU $ RBIT  6,S TURN OFF XA BIT JMP 0(X) GO EXECUTE * TITL UNINSTALLED MEMORY TRAP SET-UP * REL :88  ORG AT MEMORY TRAP TEMP1 EQU $ LOCATION IS ALSO USED AS A TEMP QCDCHK WORD :095F QCD ROM CHECKSUM VALUE CKSUM RES 1,0 TRAP EQU $ JMP FINDMN IF UNINSTALLED MEMORY TRAP, KEEP SIZING MEMORY * ERROR EQU $ OUT A,2 TURN OFF AUTOLOAD LIGHT HLT HALT FOR ERROR OR NO EXECUTION COPY  Q,K SAVE RTELOCATION BIAS JFIRST EQU $ JMP FIRST GO LOAD ANOTHER TAPE * H100 WORD :100 RECORD RES 1,0 SQ RES 1,0 TITL FIND FILEMARK - INPUT RECORD LENGTH PTP1 EQU $ ENT LOOK FOR A FILEMARK AND INPUT RECORD LENGTH JST PINPB GET A FRAME IN A REG SUB =:FF,A CHE CK FOR FILEMARK JNE A,PTP1+1 IF NOT FOUND LOOK AGAIN COPY A,CKSUM ZERO CHECKSUM JST PINPW  GET RECORD LENGTH ( 2 FRAMES ) COMP A,A COPY A,RECORD IJEQ A,EOT ZERO RECORD LENGTH IS AND END OF FILE JMP *PTP1 TITL PAPER TAPE INPUT WORD * * GETS A WORD (2 FRAMES) AND RETURNS IT IN A * PINPW EQU $ ENT JST PINPB PICK UP FIRST BYTE SHIFT A,LO,8 MOVE IT TO THE UPPER BYTE COPY A,TEMP1 STORE IT JST PINPB PICK UP NEXT BYTE OR TEMP1,A COMBINE THE TWO BYTES JMP *PINPW RETURN H8614 WORD :8614 JNEXT JMP NEXT TITL TYPE CODE DECODING * APTP COPY =0,A ABSOLUTE PAPER TAPE COPY A,K ZERO RELOCATION BIAS RPTP EQU $ RELATIVE PAPER TATPE COPY =0,Y ZERO PLACE COUNT (Y IS PC) COPY Y,HPC AND HIGH PC JST PTP1 GO LOOK FOR RECORD * TYPE CODE DECODING TYPE EQU $ JST PINPB GET TYPE CODE (1 FRAME) COPY A,Q SAVE TC IN Q CLSN =:40,Q CHECK NULL JMP TYPE AND =:DD,A CHECK FOR :4D,:4F,:6D,:6F CLSN =:4D,A JMP SKIPIT JST PINPW GET LENGTH (2 FRAMES) NEG  A,X MAKE X A COUNTER CLSN =:18,Q CHECK FOR BEGIN JMP TYPE SUB =:9,Q JGT Q,CKERR TC OUT OF RANGE TITL XNX Q INDEX JUMP INSTRUCTION JMPTBL EQU $ JMP JMPTBL+:9 CKERR JMP ERROR 1= LSI-2 START JMP AEND 2= ABS END JMP REND 3= REL END JMP AORG 4= ABS ORG JMP RORG 5= REL ORG JMP WORD 6= ABS WORD JMP WORD 7= REL WORD JMP  WORD 8= RES AND FILL JMP BAC 9= BYTE ADDRESS CONSTANT TITL PAPER TAPE INPUT BYTE * * GETS A FRAME FROM THE DIO HSPTR OR DIO TTY PTR * WHICHEVER IS READY * IF NEITHER IS READY, IT RETURNS TO * CHECK THE NEXT DEVICE IN THE POLLING SEQUENCE * * PINPB ENT COPY Q,SQ SAVE Q REGISTER COPY H8614,Q  SET UP DEAD MAN TIMER OUT Q,:FB START DIO HSPTR OUT Q,:F9 START DIO TTY PTR HSR1 EQU $  IN :FB,A GET DIO HSPTR STATUS TBIT 1,A JT OV,TRYTTY . IF SYSTEM NOT READY, TRY TTY PTR TBIT 3,A JT OV,HSR1 . IF STILL THERE TRY AGAIN TRYHSR EQU $ IJEQ Q,GOTIT  INCREMENT DEAD MAN TIMER, IF EXPIRED JUMP IN :FB,A GET DIO HSPTR STATUS TBIT 1,A  JT OV,TRYTTY . IF NOT READY, TRY TTY PTR TBIT 3,A JF OV,TRYTTY . IF NO WORD READY,TRY TTY * IN :FA,A GET A BYTE FROM HSPTR JMP GOTIT GOT A BYTE TRYTTY EQU $ IN :F9,A GET TTY STATUS TBIT 1,A JT OV,TRYHSR . IF NOT THERE, BACK TO HSPTR TBIT  3,A JF OV,TRYHSR . IF NO WORD TRY HSPTR IN :F8,A GET A BYTE FROM TTY PTR TITL GOTIT EQU $ EXCH H100,X GET RESET COMMNAD OUT X,:FB RESET DIO HSPTR OU  T X,:F9 RESET DIO TTY EXCH H100,X RESTORE X JEQ Q,JNEXT COPY SQ,Q  RESTORE Q * NOW DO CHECKSUM CALCULATION CK EQU $ EXCH A,CKSUM COPY A,LASTCK SAVE LAST CHECKSUM  SHIFT A,RO,1 JF OV,$+2 OR =:80,A TURN ON BIT 7 XOR CKSUM,A EXCH CKSUM,A RESTORE CHARACTER IMS RECORD JMP *PINPB TITL CKSM EQU $ CHECKSUM VERIFICATION  COPY LASTCK,A GET LAST CHECKSUM COPY A,CKSAVE SAVE IT COPY PINPB,A GET RETURN POINTER COPY A,SPINPB SAVE IT COPY PINPW,A E COPY A,SPINPW SAVE ANOTHER JST PINPB GET CHECKSUM BYTE SUB  CKSAVE,A SHOULD BE ZERO JNE A,CKERR COPY TEMP1,A GET UPPER BYTE OF INPUT WORD ROUTINE COPY A,CKSAVE STORE IT TEMPORARILY IN CHECKSUM SAVE JST PTP1 GOOD CHECKSUM-GET NEW RECORD COPY CKSAVE,A GET BACK UPPER BYTE COPY A,TEMP1 STORE IT BACK FOR INPUT WORD ROUTINE COPY SPINPW,A COPY A,PINPW RESTORE POINTER COPY SPINPB,A COPY A,PINPB RESTORE ANOTHER JMP PINPB+1 PICK UP A BYTE AND RETURN TO PREVIOUS TC TITL RESERVED CELLS AND LITERAL POOL LASTCK RES 1,0 CHECKSUM SAVE CKSAVE RES 1,0 CHECKSUM SAVE SPINPW RES 1,0 SAVE PINPW RETURN ADDRESS SPINPB RES 1,0 SAVE PINPB RETURN ADDRESS TITL QCD AUTOLOAD TEST VERIFY * * THIS ROUTINE COMPUTES THE XUM * OF THE AUTOLOAD ROM AS IT IS * DONE IN THE QCD TEST. * REL :100 COPY HXFF00,A SET UP COUNT COPY A,TEMP2 COPY =0,X COPY 0(X),A  FIRST WORD JMP AUT5 AUT4 EQU $ ADD 0(X),A ADD NEXT AUT5 EQU $ ADD =1,X  BUMP INDEX IMS TEMP2 JMP AUT4 CSK A,AUTTOT COMPARE TO QCD VALUE HLT LESS HLT GREATER HLT EQUAL TEMP2 RES 1,0 AUTTOT WORD :FFFF HXFF00 WORD :FF00 END . IF SYSTEM NOT READY, TRY TTY PTR TBIT 3,A JT OV,HSR1 . IF STILL THERE TRY AGAIN TRYHSR EQU $ IJEQ Q,GOTIT  INCREMENT DEAD MAN TIMER, IF EXPIRED JUMP IN :FB,A GET DIO HSPTR STATUS TBIT 1,A  JT OV,TRYTTY . IF NOT READY, TRY TTY PTR TBIT 3,A JF OV,TRYTTY . IF NO WORD READY,TRY  TITL NM-4 AUTOLOAD TYPE 4 #84-9316-13B0 TITL START TYPE 4 AUTOLOAD * COPYRIGHT 1978, 1976 COMPUTER AUTOMATION INC. * * USER DOCUMENTATION 00-93016-00B0 * SOURCE FILE 84-93016-23B0 * OBJECT FILE 84-93016-33B0 * WORD I/O BINARY 92-21000-43B0 * MAINTENANCE DOC 92-21000-51B0 * REL 0 RES 256,0 REL 0 * * START EQU $ JMP BEGIN START AUTOLOAD TITL MINI-FLOPPY LOADER * PICODA EQU :FC PICO DEVICE ADDRESS, CHANNEL 6 * MINFL1 EQU $ MINI-FLOPPY UNIT 1 COPY =1,A SET UNIT ONE COPY A,MFUNIT MINFL0 EQU $ MINI-FLOPPY UNIT 0 IN PICODA+1,A GET PICO STATUS TO A JEQ A,FIRST !  DIO NOT INSTALLED TBIT 1,A GET PRESENT BIT TO OV JT OV,FIRST START POLLING AGAIN READY EQU $  COPY BASE,Y COPY =1,Q SET Q FOR LOOP TWICE COPY =9,A SET OPCODE FOR SEEK TWICE EQU  $ COPY A,OPC COPY =5,X SET X FOR COUNTING AND AS POINTER OUTLUP EQU $ OUTPUT LOOP COPY OUTBL-START(X,Y),A HOPE THIS WORKS OUT A,PICODA IN OUTPUT LOOP JNED X,OUTLUP SEND SIX BYTES  COPY COMAND,A OUTPUT OF COMMAND WORD OUT A,PICODA+1 TITL STATUS IN PICODA+1,A INPUT STATUS  TBIT 1,A BUSY BIT TO OV JT OV,STATUS WAIT FOR NOT BUSY ERRCHK EQU $ ERROR CHECK AND =:7F,A IGNORE WRITE PROTECT CSK A,=5 IJEQ X,HERE A<5, NO ERRORS AND MAKE X=0 JF SS,XERROR A>5, IF NOT POLLING - ERROR HALT JMP FIRST A=5, NOT READY ERROR - KEEP TRYINGV HERE EQU $ COPY =7,A SET OPCODE FOR READ JNED Q,TWICE DO SEEK TO 0 THEN READ 1 SECTOR INPUT EQU $ INPUT FROM PICO FIFO TO MEMORY COPY =:7F,Y SET COUNTER SBIT 2,S SET BYTE MODE INLOOP EQU $ INPUT LOOP  IN PICODA,A COPYB A,0(X) STORE BYTE ADD =1,X INCREMENT POINTER JNED Y,INLOOP DECREMENT COUNTER RBIT 2,S RESET BYTE MODE COPY =0,X SET OFFSET TO ZERO JMP MAGS * * CONTROL BLOCK FOR MINI-FLOPPY * OUTBL EQU $ DED WORD :0001 DRIVE ENABLE DELAY MFSEC WORD :0001 SECTOR MFHEAD WORD :0000 HEAD TRAK WORD :0000 TRACK MFUNIT WORD :0000 MINI FLOPPY UNIT OPC WORD :0009 OPCODE COMAND WORD :200 * TITL INITIALIZE, PURGE MEMORY, AND SELECT DEVICE * * DEVICE SELECTION DECODE * INIT EQU $ COPY  X,BASE SAVE THE BASE ADDRESS OF AUTOLOAD NOW PURGE COPY 0(X),A COPY A,0(X) JNED X,PURGE PURGE PARITY  SBIT 8,S ENABLE INTERRUPTS UIS SET PARITY RBIT 8,S DISABLE INTERRUPTS FIRST  EQU $ COPY =0,A INITIALIZE IOB VALUES XNEXT COPY A,DEV SET UP FOR UNATTENDED OPERATION NEXT EQU $  IN 4,Q GET CONSOLE WORD REGISTER CONTENTS SHIFT Q,RO,1 RIGHT JUSTIFY DEVICE SELECTIN CODE COPY PANEL,A GET PANEL FLAG JNE A,NOPANL IF NO CONSOLE SKIP SENSE SWITCH TEST JF SS,SAME IF ATTENDED OPERATION NOPANL EQU $ IMS DEV BUMP TO NEXT DEVICE COPY DEV,Q LOAD DEVICE INDEX SAME EQU $ XNX  Q INDEX THE JUMP INSTRUCTION JMP $+1 JMP RPTP 0=PTP REL, NOT READY TO NEXT JMP APTP  1=PTP ABS, NOT READY TO NEXT BEGIN JT SS,MEMSRC IF UNATTENDED IN 4,A GET CONSOLE WORD REGISTER CONTENTS JGE A,MEMSRC CHECK FOR TEST XERROR JMP ERROR IF TEST-HALT JMP MINFL0 6=MINI-FLOPPY UNIT 0, NR TO NEXTT JMP MINFL1 7=MINI-FLOPPY UNIT 1, NR TO NEXT TITL PAPER TAPE SERVICE ROUTINES * * ABS/REL END TYPE CODE PROCESSING * * NOTE: END ADDRESS OF -1 IS NOT AN EXECUTION ADDRESS * REND EQU $ ADD K,A " ADD RELOCATION BIAS AEND EQU $ COPY A,Q MOVE EXECUTION ADDRESS TO Q IJEQ Q,JTYPE CHECK FOR VALID EXECUTION ADDRESS COPY A,EXEC JTYPE JMP TYPE PROCESS ANOTHER TYPE CODE ** RORG EQU $ ADD K,A ADD RELOCATION BIAS AORG EQU $ COPY A,Y UPDATE THE PC UPDAT EQU $ COPY HPC,X CSM Y,X  JMP $+2 COPY Y,HPC JMP TYPE TITL ** LUPDAT EQU $ IJEQ X,UPDAT BUMP COUNT,IF DONE UPDATE HPC CLSN Q,=8-9&:FF CHECK FOR RES AND FILL TC=8 JMP AWORD KEEP SAME VALUE IF RES AND FILL WORD EQU  $ JST PINPW CLSN Q,=7-9&:FF CHECK FOR REL WORD TC=7 RWORD ADD K,A REL WORD ADD BIAS AWORD EQU $ COPY A,0(Y) STORE VALUE AT PC IJNE Y,LUPDAT BUMP THE PC AND REPEAT * * END OF TAPE SERVICE * * NOTE: ZERO RECORD LENGTH IS AN END OF FILE * EOT EQU $ COPY HPC,Q PUT FIRST AVAILABLE LOCATION IN Q COPY EXEC,X PUT EXECUTION ADDRESS IN X MAGS EQU $ COPY =:40,Y SET UP Y FOR LSI-3/05 OUT A,2 TURN OFF AUTOLOAD LIGHT COPY PANEL,A CONSOLE ATTACHED JNE A,GOOO NO-AUTOLOAD ANYWAY JT SS,GOOO IF UNATTENDED ALWAYS EXECUTE IN 4,A INPUT CONSOLE WORD REGISTER SHIFT A,RO,1 GET EXECUTION BIT TO -OV- JF OV,ERROR IF NO EXECUTION GOOO EQU $ RBIT 6,S TURN OFF XA BIT JMP 0(X) GO EXECUTE PANEL RES 1,0 TITL TEMPORARY STORAGE CELLS * THE FOLLOWING LOCATIONS ARE USED AS TEMP CELLS REL :72 BACMEM RES 1,0 SQ RES  1,0 BASE RES 1,0 BASE ADDRESS OF RELOCATED AUTOLOAD DEV RES 1,0 DEVICE TO SELECT OR POLL EXEC RES 1,0 EXECUTION ADDRESS HPC RES 1,0 HIGH PROGRAM COUNTER LASTCK RES 1,0 CKSAVE RES 1,0 SPINPW RES 1,0 SPINPB RES 1,0 RECORD RES 1,0 TITL MEMORY SIZE TO RELOCATE AUTOLOAD *********************************************** * * * THIS SECTION IS OVERLAYED WITH THE * * TEMPORARY CELLS  * * * *********************************************** ORG EOT+:C * FIND END OF MEMORY MEMSRC EQU $ SBIT 6,S TURN ON XA BIT COPY Q,K SAVE RELOCATION BIAS COPY =0,X START FROM TOP OF MEMORY AND WORK DOWN COPY X,PANEL FIND IF CONSOLE PRESENT  COPY =:FF,Y Y IS USED FOR CONSOLE TEST AND TRANSFER COUNTER SELP Y,4 IN 4,Q SUB Y,Q  JEQ Q,$+2 COPY Q,PANEL NO CONSOLE SO SET PANEL FLAG NON-ZERO SELP A,4 RESTORE WORD REGISTER CONTENTS FINDMN EQU $ SUB H100,X DECREMENT MEMORY POINTER COPY =-1,A SET TO ALL ONES  EXCH A,0(X) ACCESS MEMORY THROUGH POINTER EXCH A,0(X) ACCESS MEMORY THROUGH POINTER IJNE A,FINDMN BUMP RESULTS OF MEMORY ACCESS, IF NOT RAM, AGAIN EXCH A,0(X) NOW TRY TO GET BACK ZEROS EXCH A,0(X) JNE A,FINDMN IF FAILURE MUST BE ROM COPY A,TRAP NOP TRAP IN CASE OF PARITY # ERROR * TRAP WILL FALL THROUGH TO PARITY ERROR HALT TITL * * RELOCATE AUTOLOAD TO HIGHEST WRITABLE MEMORY * GOTMN EQU $ MOVNXT EQU $ COPY 0(Y),A PICK UP WORD COPY A,0(X,Y) MOVE IT TO HIGH MEMORY JNED Y,MOVNXT IF DONE MOVING JMP INIT-START(X) GO TO RELOCATED AUTOLOAD CODE PTP1 EQU $ ENT * LOOK FOR FILEMARK AND INPUT RECORD LENGTH JST PINPB GET A FRAME IN A REGISTER SUB =:FF,A  CHECK FOR FILEMARK JNE A,PTP1+1 IF NOT FOUND LOOK AGAIN COPY A,CKSUM ZERO CHECKSUM JST PINPW GET RECORD LENGTH (TWO FRAMES) COMP A,A COPY A,RECORD SET COUNT IJEQ A,EOT ZERO LENGTH IS END OF TAPE JMP *PTP1 H8614 WORD :8614 * * TITL UNINSTALLED MEMORY TRAP SET-UP * REL :88  ORG AT MEMORY TRAP TEMP1 EQU $ LOCATION IS ALSO USED AS A TEMP QCDCHK WORD :017C QCD ROM CHECKSUM VALUE CKSUM  RES 1,0 TRAP EQU $ JMP FINDMN UNINSTALLED MEMORY TRAP * * * ERROR EQU $ OUT A,2 TURN OFF AUTOLOAD LIGHT HLT HALT FOR ERROR OR NO EXECUTION COPY Q,K SAVE RTELOCATION BIAS JFIRST EQU $ JMP FIRST GO LOAD ANOTHER TAPE * TITL PAPER TAPE SERVICE ROUTINES * * PAPER TAPE INPUT WORD * RETURNS TWO FRAMES IN A * PINPW EQU $ ENT JST PINPB GET FIRST BYTE SHIFT A,LO,8 MOVE IT TO UPPER BYTE COPY A,TEMP1 STORE IT AWAY JST PINPB GET SECOND BYTE OR TEMP1,A COMBINE TWO BYTES JMP *PINPW * * * BYTE ADDRESS CONSTANT SERVICE * BAC EQU $ COPY K,X GET REL OFFSET TO X SHIFT X,LO,1 MAKE IT A BYTE OFFSET JT OV,ERROR TOO LARGE AN OFFSET COPY X,BACMEM RBIT 0,S CLEAR CARRY ADDC BACMEM,A JT CY,ERROR BAC PLUS OFFSET TOO LARGE COPY  =-1,X JMP AWORD * H100 WORD :100 * JNEXT COPY =6,A SET POLLING SEQUENCE JMP XNEXT TITL  PAPER TAPE TYPE CODE DECODING APTP COPY =0,A ABSOLUTE PAPER TAPE COPY A,K ZERO RELOCATION BIAS RPTP EQU $ RELATIVE PAPER TAPE PTP COPY =0,Y ZERO PC (Y IS PC) COPY Y,HPC AND HIGH PC JST PTP1 GO LOOK FOR RECORD * TYPE CODE DECODING TYPE EQU $ JST PINPB GET TYPE CODE ( 1 FRAME ) COPY A,Q SAVE TYPE CODE CLSN =:40,Q CHECK NULL JMP TYPE AND  =:DD,A CLSN =:4D,A CHECK FOR :4D,:6D,:6F JMP SKIPIT JST PINPW GET LENGTH (TWO FRAMES)  NEG A,X MAKE X A COUNTER CLSN =:18,Q CHECK FOR BEGIN JMP TYPE SUB =:9,Q JGT Q,CKERR TITL XNX Q INDEX JUMP INSTRUCTION JMPTBL EQU $ JMP JMPTBL+:9 CKERR JMP ERROR LSI-2 START JMP AEND 2= ABS END JMP REND 3= REL END JMP AORG 4= ABS ORG JMP RORG 5= REL ORG JMP WORD 6= ABS WORD JMP WORD 7= REL WORD JMP WO$ RD 8= RES AND FILL JMP BAC 9= BYTE ADDRESS CONSTANT * TITL PAPER TAPE INPUT BYTE * * GETS A FRAME FROM THE DIO HSPTR OR DIO TTY PTR * WHICHEVER IS READY * IF NEITHER IS READY, IT RETURNS TO * CHECK THE NEXT DEVICE IN THE POLLING SEQUENCE * * PINPB ENT COPY Q,SQ SAVE Q REGISTER COPY H8614,Q  SET UP DEAD MAN TIMER OUT Q,:FB START DIO HSPTR OUT Q,:F9 START DIO TTY PTR HSR1 EQU $  IN :FB,A GET DIO HSPTR STATUS TBIT 1,A JT OV,TRYTTY . IF SYSTEM NOT READY, TRY TTY PTR TBIT 3,A JT OV,HSR1 . IF STILL THERE TRY AGAIN TRYHSR EQU $ IJEQ Q,GOTIT  INCREMENT DEAD MAN TIMER, IF EXPIRED JUMP IN :FB,A GET DIO HSPTR STATUS TBIT 1,A  JT OV,TRYTTY . IF NOT READY, TRY TTY PTR TBIT 3,A JF OV,TRYTTY . IF NO WORD READY,TRY TTY * IN :FA,A GET A BYTE FROM HSPTR JMP GOTIT GOT A BYTE TRYTTY EQU $ IN :F9,A GET TTY STATUS TBIT 1,A JT OV,TRYHSR . IF NOT THERE, BACK TO HSPTR TBIT 3,A JF OV,TRYHSR . IF NO WORD TRY HSPTR IN :F8,A GET A BYTE FROM TTY PTR TITL GOTIT EQU $ EXCH H100,X GET RESET COMMNAD OUT X,:FB RESET DIO HSPTR OUT  X,:F9 RESET DIO TTY EXCH H100,X RESTORE X JEQ Q,JNEXT COPY SQ,Q  RESTORE Q * NOW DO CHECKSUM CALCULATION CK EQU $ EXCH A,CKSUM COPY A,LASTCK SAVE LAST CHECKSUM  SHIFT A,RO,1 JF OV,$+2 OR =:80,A TURN ON BIT 7 XOR CKSUM,A EXCH CKSUM,A RESTORE CHARACTER IMS RECORD JMP *PINPB TITL CKSM EQU $ CHECKSUM VERIFICATION COPY  LASTCK,A GET LAST CHECKSUM COPY A,CKSAVE SAVE IT COPY PINPB,A GET RETURN POINTER COPY A,SPINPB SAVE IT COPY PINPW,A COPY A,SPINPW SAVE ANOTHER JST PINPB GET CHECKSUM BYTE SUB  CKSAVE,A SHOULD BE ZERO JNE A,CKERR ERROR JUMP COPY TEMP1,A SAVE UIPPER BYTE IF IN WORD FETCH COPY A,CKSAVE JST PTP1 LOOK FOR FILEMARK INPUT RECORD COUNT COPY CKSAVE,A RESTORE UPPER BYTE COPY A,TEMP1 COPY SPINPW,A COPY A,PINPW RESTORE POINTER COPY SPINPB,A COPY A,PINPB RESTORE POINTER JMP PINPB+1 PICK UP A BYTE AND RETURN IN PREVIOUS TC ** SKIPIT EQU $ JST PINPB GET LENGTHH COPY A,Q SAVE IT IN Q JEQD Q,XTYPE IF ZERO DO NEXT TYPE JST PINPB IF NOT GET NEXT BYTE JNED Q,$-1 INPUT BYTES TILL Q=0E XTYPE JMP TYPE TITL QCD AUT TEST VERIFY * * THIS ROUTINE COMPUTES THE XUM * OF THE AUTOLOAD ROM AS IT IS * DONE IN THE QCD TEST. * REL :100 COPY HXFF00,A  SET UP COUNT COPY A,TEMP2 COPY =0,X COPY 0(X),A FIRST WORD JMP AUT5 A% UT4 EQU $ ADD 0(X),A ADD NEXT AUT5 EQU $ ADD =1,X BUMP INDEX IMS TEMP2 JMP AUT4 CSK A,AUTTOT COMPARE TO QCD VALUE HLT LESS HLT GREATER HLT EQUAL TEMP2 RES 1,0 AUTTOT WORD :FFFF HXFF00 WORD :FF00 END JT OV,TRYTTY . IF SYSTEM NOT READY, TRY TTY PTR TBIT 3,A JT OV,HSR1 . IF STILL THERE TRY AGAIN TRYHSR EQU $ IJEQ Q,GOTIT  INCREMENT DEAD MAN TIMER, IF EXPIRED JUMP IN :FB,A GET DIO HSPTR STATUS TBIT 1,A  JT OV,TRYTTY . IF NOT READY, TRY TTY PTR TBIT 3,A JF OV,TRYTTY . IF NO WORD READY,TRY TTIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII& IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"e;800811091613800811091613800815113208e@800811091613800811091613800811091613e:' 800811091613800811091613800811091613e800811091613800811091613800811091613800811091613800811091613800811091613e ?8008110918292580081109184000800811092124de$8008110918445080081109184950800811092130de,8008110918540080081109185850800811092136d e1 8008110919030080081109190925800811092143d(  e< ?8008191000575080081910010875800815113203 ex8008151133585080081511341125800815113411 e\ ?8008151131532580081511320400800815113332 ev8008110920077580081511333300800815113354den8008140431572580081404321500800819100345 e@8008110920222580081404375725800815094046dep) {8008140438400080081404385825800814043858 eD8008110920375080081509503850800815095107der~8008150951120080081509512650800815095126eH8008110920522580081109205500800811092250deJ{8008110920595080081109210225800811092254deL~8008110921067580081109210925800811092259deN ?7603010007205076030100073025800819100107d* e8d8008141055207580081410552975800814043756e8D8008141057265080081410573550800815095038+ , - . / 0 ?3 ?. OS:: SYSDEBUGS BINDEBUGM BIN DEBUGX BINTYPE2AUTO BAK TYPE2AUTO BIN TYPE2AUTO ASM TYPE2AUTO OBJTYPE2AUTO BINTYPE3AUTO OBJTYPE3AUTO BINTYPE4AUTO OBJTYPE4AUTO BINTYPE2AUTO LNKTYPE3AUTO LNKTYPE4AUTO LNKTYPE2AUTO BAKTYPE3AUTO ASMTYPE4AUTO ASMOVicEdDano?~|   B~~4 6Oc󦣞䆨 AN ޓ’C vuPޞ0 @)B ?Hep@)~idAMx@uiijI)=i ] 1 _bcU Bl~~~~Q 6UK5 ;!V?;/ p@ ~AQ+XQ"i@C 6g B6 Q I )5 6= iE~pU)i%+u'6  66G  @EB 5 `"恟 )+ޅ|   mE7E4E5E3--E2E0800811091613800811091613800811091613O0SEGMENTBLANK oi |z5     C~ ~4 6GA) ֦]  AN ވ‡C tOC= ep@)|idA@cQAv @u r`h`&er@TA_ p.6g]Vb(4+L Lr@t@U*U FDi@?C 6g _= p@  r vv  qhfy pih @L@| MBj LuJ RBC Q" /.-  M^BB6J?6;TM 6D?665?6 4""1Q1( 6# "(YV.R #GG )+ޅ|   1 JF OV,$+2 OR =:80,A TURN ON BIT 7 XOR CKSUM,A EXCH CKSUM,A RESTORE CHARACTER IMS RECORD JMP *PINPB TITL CKSM EQU $ CHECKSUM VERIFICATION OVicEdDano=|z5    C~~4 6GA)֦] AN ވ‡C tOC =Hep@)|idA@cQAv@ur`h`&er@TA_ p.6g]Vb(4+LLr@t@U*UFDi@?C 6g _= p@j r vv qhfy pih@L@| MBj LuJRBC Q" /.- M^BB6J?6;TM6D?665?64""1Q1( 6#"(YV.R#GG )+ޅ|   mE7E4E5E3--E2E0800811091613800811091613800811091613O0SEGMENTBLANK oi m6kI ) 56= 4B Ui%+u')  Ȁ5   AN ޻ºC  ecȞ?<r@TA r``&槞4:L Lr@ti@C 6gre ep@)|idA@cQAv @u   wv| e p@# qusy p.62XV-(7   piPU@L@| 2 M ˾_ LuJRBC S  V 1DBB 6J?6;TM6D?6 65?6G""DQ * 6%$YV # R   GGE@UBBU( )+ޅ|   VE LAST CHECKSUM  SHIFT A,RO,1 JF OV,$+2 OR =:80,A TURN ON BIT 7 XOR CKSUM,A EXCH CKSUM,A RESTORE CHARACTER IMS RECORD JMP *PINPB TITL CKSM EQU $ CHECKSUM VERIFICATION COPY OVicEdDanoe m6kI )56= 4Bꞙ Ui%+u') Ȁ5  AN ޻ºC ecȞ?<r@TAr``&槞4:LLr@ti@C 6gr e#ep@)|idA@cQAv@u  wv|ve p@# qusy p.62XV-(7  piPU@L@| M˾_ LuJRBC S V 1DBB6J?6;TM6D?665?6G""DQ* 6%$YV# R  GGE@UBBU( )+ޅ|   mE7E4E5E3--E2E0800811091613800811091613800811091613OVicEdDano?~|   B~~4 6Oc󦣞䆨 AN ޓ’C vuPޞ0 @)B ?Hep@)~idAMx@uiijI)=i ] _bcU Bl~~~~Q 6UK5 ;!:)?;/ p@ ~AQ+XQ"i@C 6g B6 Q I )5 6= iE~pU)i%+u'6  66G  @EB 5 `"恟 )+ޅ|   mE7E4E5E3--E2E0800811091613800811091613800811091613OVicEdDano=|z5    C~~4 6GA)֦] AN ވ‡C tOC =Hep@)|idA@cQAv@ur`h`&er@TA_ p.6g]Vb(4+LLr@t@U*UFDi@?C 6g>= p@j r vv qhfy pih@L@| MBj LuJRBC Q" /.- M^BB6J?6;TM6D?665?64""1Q1( 6#"(YV.R#GG )+ޅ|   mE7E4E5E3--E2E03 800811091613800811091613800811091613OVicEdDanoe m6kI )56= 4Bꞙ Ui%+u') Ȁ5  AN ޻ºC ecȞ?<r@TAr``&槞4:LLr@ti@C 6gr e#ep@)|idA@cQAv@u  wv6[ve p@# qusy p.62XV-(7  piPU@L@| M˾_ LuJRBC S V 1DBB6J?6;TM6D?665?6G""DQ* 6%$YV# R  GGE@UBBU( )+ޅ|   mE7E4E5E3--E2E0800811091613800811091613800811091613 TITL NM-4 AUTOLOAD TYPE 2 #84-93016-11B0 TITL START * COPYRIGHT 1978,1976 COMPUTER AUTOMATION INC. * * USER DOCUMENTATION 00-93016-00B0 * SOURCE FILE 84-93016-21B0 * OBJECT FILE 84-93016-31B0 * WORD I/O BINARY 92-21000-41B0 * MAINTENANCE DOC 92-21000-51B0 * REL 0 RES 256,0 REL 0 * * START EQU $ JT  SS,MEMSRC IF UNATTENED IN 4,A GET CONSOLE WORD REGISTER CONTENTS JGE A,MEMSRC CHECK FOR TEST JMP JERROR IF TEST-HALT TITL FLOPPY LOADER * * FLOPPY LOADER * FLPYAD EQU :11 FLOPPY DEVICE ADDRESS FLOPPY EQU $ SST FLPYAD*8+4 CHECK FOR CONTROLLER PRESENT JMP NEXT IF NOT PRESENT COPY =7,A READ ALL OPCODE COPY A,OPCODE TO IOB COPY A,SEEK SEEK COUNT FLOP1 EQU $ COPY =1,A SET UP TO READ SECTOR 1 COPY A,SECTOR PUT IT IN IOB  COPY BASE,A GET CODES BASE ADDRESS ADD =IOB-START,A COMPUTE NEW IOB ADDRESS SST FLPYAD*8+0 TEST FOR CONTROLLER IDLE JMP $-1 WAIT FOR CONTROLLER IDLE OUT A,FLPYAD*8+0 ISSUE I/O SST FLPYAD*8+0 TEST FOR COMPLETION JMP $-1 WAIT FOR DONE COPY =-80,A INSURE CYLINDER 0 EXCH A,SEEK GET SEEK COUNT JGE A,FLOP1 IF FIRST SEEK COPY FLPSTT,A  GET STATUS SHIFT A,RO,1 SYSTEM READY BIT TO -OV- JT OV,NEXT IF NOT READY FLOP2 EQU  $ AND =:7F,A CLEAR TO 7 BITS JEQ A,BOOT IF NO ERRORS JERROR EQU $ JMP ERROR  IF ERROR TITL DEVICE SELECTION DECODE * * DEVICE SELECTION DECODE * INIT EQU $ COPY X,BASE SAVE THE BASE ADDRESS OF AUTOLOAD NOW JMP JTEST DO MINI-DIAGNOSTIC SETUP EQU $ THEN 4 RETURN HERE COPY H100,A SET UP MAGNETIC DEVICE WORD COUNT COPY A,WORDS STUFF IT IN THE IOB FIRST EQU $ COPY =0,A INITIALIZE IOB VALUES COPY A,BUFFER BUFFER ADDRESS IS ALWAYS 0 COPY A,INTER NO INTERRUPTS COPY A,FLPSTT CLEAR FLOPPY STATUS COPY A,CYLIN CYLINDER 0  COPY A,UNIT UNIT 0 COPY =5,A SET MINI-FLOPPY AS FIRST DEVICE COPY A,DEV  SET UP FOR UNATTENDED OPERATION NEXT EQU $ IN 4,Q GET CONSOLE WORD REGISTER SHIFT Q,RO,1 RIGHT JSTIFY DEVICE SELECTION CODE COPY PANEL,A GET PANEL FLAG JNE A,NOPANL IF NO PANEL SKIP SENSE SWITCH TEST JF SS,SAME IF ATTENDED OPERATION NOPANL EQU $ IMS DEV BUMP TO NEXT DEVICE COPY DEV,Q LOAD DEVICE INDEX TITL SAME EQU $ XNX Q  INDEX THE JUMP INSTRUCTION JMP $+1 AND EXECUTE IT JMP NEXT . 0=PTP REL, NOT SUPPORTED JMP NEXT . 1=PTP ABS, NOT SUPPORTED JMP STM14 . 2=STORAGE MODULE, POLLED 4TH JMP FLOPPY . 3=FLOPPY, POLLED 2ND JMP MTIC . 4=MTIC, POLLED 3RD JMP STMU14 . 5=DISC UPPER PLATTER, NOT POLLED JMP MINFL0 . 6= MINI-FLOPPY UNIT 0 POLLED FIRST JMP MINFL1 . 7= MINI-FLOPPY UNIT 1 NOT POLLED TITL MTIC EOB INTERRUPT SERVICE * * RETURN HERE ON MTIC EOB INTERRUPT * MTEOB EQU $ MTSTRT WORD :230  MTIC START COMMAND IN MTICDA+1,A GET STATUS BYTE ONE AND THROW IT AWAY IN MTICDA+1,A  GET STATUS BYTE TWO SUB =:C0,A CHECK HDW & RATE ERRORS JLT A,JERROR IF ERROR - HALT BOOT EQU $  COPY =0,X SET EXECUTION ADDRESS TO 0 JMP MAGS GO CHECK EXECUTION BIT TITL FLOPPY/DISC IOB * * THE FOLLOWING LOCATIONS ARE USED AS TEMP CELLS * BASE RES 1,0 AUTOLOAD RELOCATION ADDRESS DEV RES 1,0  DEVICE TO CHECK IF READY PANEL RES 1,0 PANEL FLAG = 0 IF CONSOLE PRESENT * * THE FOLLOWING LOCATION ARE USED AS THE IOB * FOR THE FLOPPY AND DISCS * IOB EQU $ ORG IOB OPCODE RES 1,0 UNIT RES 1,0 CYLIN RES 1,0 SEEK EQU $ HEAD RES 1,0 SECTOR RES 1,0 WORDS RES 1,0 BUFFER RES 1,0 INTER RES 1,0 FLPWCT EQU $ NXTIOB RES 1,0 FLPSTT EQU $ STMWCT RES 1,0 STMCST RES 1,0 STMDST RES 1,0 TITL MEMORY SEARCH TO RELOCATE AUTOLOAD ************************************************** * NOTE: THIS SECTION IS OVERLAYED WITH * * THE DISK I/O BLOCK. SEE ABOVE * * * **************************************************  ORG IOB-3 * FIND END OF MEMORY MEMSRC EQU $ SBIT 6,S TURN ON XA BIT COPY Q,K SAVE RELOCATION BIAS COPY =0,X START FROM TOP OF MEMORY AND WORK DOWN COPY X,PANEL CLEAR PANEL FLAG COPY =:FF,Y Y USED FOR CONSOLE CHECK AND TRANSFER COUNTER SELP Y,4 PUT Y INTO WORD REG IN 5  4,Q GET IT BACK CSK Q,=:FF CHECK IF CONSOLE PRESENT NOP COPY Y,PANEL NOT PRESENT SO SET PANEL FLAG NON-ZERO SELP A,4 RESTORE WORD REG IN CASE SS=FALSE FINDMN EQU $ SUB H100,X  DECREMENT MEMORY POINTER COPY =-1,A SET TO ALL ONES EXCH A,0(X) ACCESS MEMORY THROUGH POINTER EXCH A,0(X) ACCESS MEMORY THROUGH POINTER IJNE A,FINDMN BUMP RESULTS OF MEMORY ACCESS, IF NOT RAM, AGAIN EXCH A,0(X) NOW TRY TO GET BACK ZEROS EXCH A,0(X) JNE A,FINDMN IF FAILURE MUST BE ROM COPY A,TRAP NOP TRAP IN CASE OF PARITY ERROR * TRAP WILL FALL THROUGH TO PARITY ERROR HALT  TITL * * RELOCATE AUTOLOAD TO HIGHEST WRITABLE MEMORY * GOTMN EQU $ MOVNXT EQU $ COPY 0(Y),A  PICK UP WORD COPY A,0(X,Y) MOVE IT TO HIGH MEMORY JNED Y,MOVNXT IF DONE MOVING  JMP INIT-START(X) GO TO RELOCATED AUTOLOAD CODE * * TITL DISC STORAGE MODULE LOADER * SMDA EQU :14 DISC STORAGE MODULE DEVICE ADDRESS SUDA EQU :15 * * :14= MEDIUM CAPACITY DISC * :15= HIGH CAPACITY DISC * STMU14 EQU $ COPY =2,Y SET HEAD FOR UPPER PLATTER JMP STMX JUMP AROUND LOWER PLATTER HEAD SET STM14 EQU $ DISC LOWER PLATTER COPY =0,Y SET HEAD FOR LOWER PLATTER STMX COPY Y,HEAD COPY =1,Q COPY =1,X SET Q AND X FOR LOOPING STM0 EQU $ SST SMDA*8+4 SENSE IF CONTROLLER PRESENT JMP TRYUPR IF NOT TRY AT :15 JMP STM1 PRESENT AT :14 TRYUPR SST SUDA*8+4 SENSE IF PRESENT AT :15 JMP FIRST NOT PRESENT SO CHECK FIRST DEVICE COPY =1,Y SET Y FOR :15 PATH TITL STM1 EQU $ COPY =4,A SET UP OPCODE COPY A,OPCODE COPY =0,A INITIALIZE IOB VALUES COPY A,SECTOR SECTOR ADDRESS OF 0 COPY A,NXTIOB NO IOB CHAINING COPY A,STMCST CLEAR CONTROLLER STATUS COPY BASE,A COMPUTE NEW IOB ADDRESS ADD =IOB-START,A CLSN Y,=1 FIND WHICH PATH TO TAKE JMP PATH15 Y WAS SET TO ONE SO TAKE :15 PATH PATH14 SELP A,SMDA*8+4 INITIALIZE THE CONTROLLER SST SMDA*8+0 TEST FOR IDLE JMP $-1  WAIT FOR IDLE OUT A,SMDA*8+0 ISSUE I/O SST SMDA*8+0 TEST FOR COMPLETION JMP $-1  WAIT FOR COMPLETION JMP STAT JUMP AROUND :15 PATH PATH15 SELP A,SUDA*8+0 INITIALIZE THE CONTROLLER  SST SUDA*8+0 TEST FOR IDLE JMP $-1 WAIT FOR IDLE OUT A,SUDA*8+0 ISSUE I/O SST SUDA*8+0 TEST FOR COMPLETION JMP $-1 WAIT FOR COMPLETION STAT COPY STMCST,A GET THE STATUS JGE A,BOOT IF NO ERROR GO EXECUTE BOOT SHIFT A,RO,1 DISC READY BIT TO -OV- JF OV,ERROR IF ERROR AND READY JNED Q,STM1 IF ONLY TRIED ONCE ADD =1,Q MAKE SURE L6 AST INSTRUCTION IS PASSED AGAIN JNED X,TRYUPR TRY :15 TWICE JMP FIRST IF STILL NOT READY TITL ERROR/EXECUTION HALT * H100 WORD :100 * JFIRST EQU $ JUMP INTO POLLING SEQUENCE COPY =1,A  SET UP FOR DISC STORAGE MODULE NEXT XNEXT COPY A,DEV JMP NEXT * JTEST JMP TEST INDIRECT JUMP TO TEST  TITL UNINSTALLED MEMORY TRAP SET-UP REL :88 ORIGIN AT MEMORY TRAP LOCATION TEMP1 EQU $ LOCATION IS ALSO USED AS A TEMP QCDCHK WORD :A656 QCD ROM CHECKSUM VALUE CKSUM RES 1,0 TRAP EQU $ JMP FINDMN UNINSTALLED MEMORY TRAP IERROR EQU $ USED FOR INDIRECT JUMP AND ALSO JMP ERROR PARITY ERROR SQ RES  1,0 JBOOT JMP BOOT * ERROR EQU $ OUT A,2 TURN OFF AUTOLOAD LIGHT HLT HALT FOR ERROR OR NO EXECUTION COPY Q,K SAVE RELOCATION BIAS JMP FIRST * TITL MTIC LOADER * MTIC LOADER MTICDA EQU :F2 MTIC DEVICE ADDRESS MTRDY EQU :4 READY BIT MTLDP EQU :10  LOAD POINT STATUS POINT MTONL EQU :10 ON-LINE STATUS BIT MTDBY EQU :2 WORD BUSY STATUS BIT MTRAT EQU :40 MTHER EQU :80 MTINT EQU :C8 MTWDCT EQU MTINT+1 MTMODE WORD :4FF * MTIC EQU $ COPY MTMODE,A GET MODE SELECT WORD OUT A,MTICDA+1 ISSUE MODE SELECT IN MTICDA+1,Q GET STATUS BYTE ONE IN MTICDA+1,A GET STATUS BYTE TWO * CHECK STATUS JEQ Q,JFIRST NO DIO INSTALLED, CONTINUE POLLING AND =MTDBY;MTLDP,Q MUST BE AT LOAD POINT AND NOT BUSY JNE Q,JFIRST IF MTIC IS NOT READY, GO TO NEXT DEVICE AND =MTRDY;MTONL,A CHECK FOR READY JNE A,JFIRST IF NOT READY * GOOD STATUS, TRY TO LOAD * ASSUME I/O LOCATIONS ARE LOADED FROM ROM MTIC1 EQU $ COPY BASE,X GET AUTOLOAD BASE  COPY MTSTRT,A GET START I/O COMMAND SBIT 8,S ENABLE INTERRUPTS OUT A,MTICDA+1 ISSUE START TO PICO JMP $ WAIT FOR COMPLETION TITL READY,SET,GO! * MAGS EQU $ FROM MAGNETIC DEVICE LOADING COPY =:40,Y SET UP Y FOR LSI-3/05 OUT A,2 TURN OFF AUTOLOAD LIGHT COPY  PANEL,A CONSOLE ATTACHED JNE A,GOOO NO-AUTOLOAD ANYWAY JT SS,GOOO IF UNATTENDED ALWAYS EXECUTE  IN 4,A INPUT WORD REGISTER SHIFT A,RO,1 GET EXECTUION/NO EXECUTION BIT JF OV,ERROR  IF NO EXECUTION GOOO EQU $ RBIT 6,S TURN OFF XA BIT JMP 0 * TITL MINI-FLOPPY LOADER * PICODA EQU :FC PICO DEVICE ADDRESS, CHANNEL 6 * MINFL1 EQU $ MINI-FLOPPY UNIT 1 COPY =1,A COPY A,MFUNIT MINFL0 EQU $ MINI-FLOPPY UNIT 0 IN PICODA+1,A GET PICO STATUS TO A JEQ A,JMPOUT DIO NOT ENSTALLED TBIT 1,A GET PRESENT/NOT BUSY BIT TO OV JF OV,READY JMPOUT COPY =2,A NOT READY SO SET FLOPPY AS NEXT DEVICE JMP XNEXT JUMP TO NEXT DEVICE READY EQU $ 7  COPY BASE,Y ADD OUTAD,Y CREATE CONTROL BLOCK ADDRESS COPY =1,Q SET Q FOR LOOP TWICE  COPY =9,A SET OPCODE FOR SEEK COPY A,OPC TITL TWICE COPY =5,X SET X AS COUNTER AND POINTER OUTLUP COPY 0(X,Y),A OUTPUT CONTROL INFORMATION OUT A,PICODA IN OUTPUT LOOP JNED X,OUTLUP SEND SIX BYTES COPY COMAND,A OUTPUT OF COMMAND WORD OUT A,PICODA+1 COPY =7,A SET OPCODE FOR READ COPY A,OPC STATUS IN PICODA+1,A INPUT STATUS TBIT 1,A CHECK BUSY BIT JT OV,STATUS LOOP UNTIL NOT BUSY ERRCHK EQU $ ERROR CHECKING AND =:7F,A IGNORE WRITE PROTECT CSK  A,=5 CHECK ERROR CODE JMP HERE A<5, NO ERRORS JF SS,IERROR A>5, IF NOT POLLING - ERROR HALT  JMP JMPOUT A=5, NOT READY SO TRY NEXT DEVICE TITL MTIC I/O INTERRUPT LOCATION SET UP * REL :C8 ORIGIN AT MTIC INTERRUPT LOCATION AIB MTICDA+0 WORD :7E70 READ :C8 WORDS EXEC EQU $ WORD -1 HPC EQU $ WORD 0 JST MTEOB-START(X) AT END OF MTIC READ GOT TO END OF BLOCK TITL MINI-FLOPPY CONTINUED HERE JNED Q,TWICE OUTPUT SEEK0, THEN READ1 AND GO ON INPUT EQU $ INPUT FROM PICO FIFO TO MEMORY  COPY =0,X SET POINTER COPY =:7F,Y SET COUNTER SBIT 2,S SET BYTE MODE INLOOP EQU $ INPUT LOOP IN PICODA,A INPUT A BYTE COPYB A,0(X) STORE BYTE INDEXED BY X ADD =1,X INCREMENT POINTER JNED Y,INLOOP DECREMENT COUNTER RBIT 2,S RESET BYTE MODE JMP JBOOT JUMP TO BOOT * * OUTAD WORD OUTBL ADRESS OF CONTROL BLOCK OUTBL EQU $ MFDED WORD :0001 DRIVE ENABLE DELAY MFSEC WORD :0001 SECTOR MFHEAD WORD :0000 HEAD MFTRAK WORD :0000 TRACK MFUNIT WORD :0000 UNIT # OPC WORD  :0009 OPCODE COMAND WORD :200 * TITL MINI-DIAGNOSTIC * * MINI-DIAGNOSTIC CHECKS PROCESSOR OPERATION *  AND DOES A PARITY PURGE THROUGHOUT MEMORY * TEST EQU $ COPY X,XSAVE SBIT 1,S SET OV JF  OV,STOPIT ENSURE OV WAS SET RBIT 1,S RESET OV JT OV,STOPIT ENSURE OV RESET COPY =0,A ZERO A REGISTER JNE A,STOPIT SUB =1,A IJNE A,STOPIT TEST1 EQU $ COPY A,Q XOR Q,A JEQ A,PURGE STOPIT EQU $ STOP IN TEST OUT A,2 TURN OFF AUTOLOAD LATCH HLT PURGE EQU $ READ/WRITE TO PURGE MEMORY COPY 0(X),A COPY A,0(X) JNED X,TEST1 *  TO ENABLE PARITY LOGIC, ENABLE INTERRUPTS * THEN ISSUE A UIS, NO PARITY ERRORS SHOULD *  OCCUR AFTER THE PURGE SBIT 8,S ENABLE INTERRUPTS UIS RE-ENABLE PARITY CHECKING RBIT 8,S DISABLE INTERRUPTS COPY XSAVE,X COPY RETURN,Y PICK UP RETURN ADDRESS ADD  X,Y ADD AUTOLOAD OFFSET COPY Y,RETURN STORE COMPUTED RETURN ADDRESS JMP *RETURN RETURN THROUG8 H INDIRECT POINTER * * RETURN FOR AUTOLOAD THROUGH THIS LOCATION * RETURN WORD SETUP * XSAVE RES 1,0 RES 6,0 TITL QCD AUT TEST VERIFY * * THIS ROUTINE COMPUTES THE XUM * OF THE AUTOLOAD ROM AS IT IS * DONE IN THE QCD TEST. * REL :100 COPY HXFF00,A SET UP COUNT COPY A,TEMP2 COPY =0,X  COPY 0(X),A FIRST WORD JMP AUT5 AUT4 EQU $ ADD 0(X),A ADD NEXT AUT5  EQU $ ADD =1,X BUMP INDEX IMS TEMP2 JMP AUT4 CSK A,AUTTOT COMPARE TO QCD VALUE HLT LESS HLT GREATER HLT EQUAL TEMP2 RES 1,0 AUTTOT WORD :FFFF HXFF00 WORD :FF00 END RBIT 8,S DISABLE INTERRUPTS COPY XSAVE,X COPY RETURN,Y PICK UP RETURN ADDRESS ADD  X,Y ADD AUTOLOAD OFFSET COPY Y,RETURN STORE COMPUTED RETURN ADDRESS JMP *RETURN RETURN THROUGOVicEdDano?~|   B~~4 6Oc󦣞䆨 AN ޓ’C vuPޞ0 @)B ?Hep@)~idAMx@uiijI)=i ] _bcU Bl~~~~Q 6UK5 ;!V?;/ p@ ~AQ+XQ"i@C 6g B6 Q I )5 6= iE~pU)i%+u'6  66G  @EB 5 `"恟 )+ޅ|   mE7E4E5E3--E2E0IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOVicEdDano=|z5    C~~4 6GA)֦] AN ވ‡C tOC =Hep@)|idA@cQAv@ur`h`&er@TA_ p.6g]Vb(4+LLr@t@U*UFDi@?C 6g _= p@j r vv qhfy pih@L@| MBj LuJRBC Q" /.- M^BB6J?6;TM6D?665?64""1Q1( 6#"(YV.R#GG )+ޅ|   mE7E4E5E3--E2E0IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOVicEdDanoe m6kI )56= 4Bꞙ Ui%+u') Ȁ5  AN ޻ºC ecȞ?<r@TAr``&槞4:LLr@ti@C 6gr e#ep9 @)|idA@cQAv@u  wv|ve p@# qusy p.62XV-(7  piPU@L@| M˾_ LuJRBC S V 1DBB6J?6;TM6D?665?6G""DQ* 6%$YV# R  GGE@UBBU( )+ޅ|   mE7E4E5E3--E2E0IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOVicEdDano?~|   B~~4 6Oc󦣞䆨 AN ޓ’C vuPޞ0 @)B ?Hep@)~idAMx@uiijI)=i ] _bcU Bl~~~~Q 6UK5 ;!V?;/ p@ ~AQ+XQ"i@C 6g B6 Q I )5 6= iE~pU)i%+u'6  66G  @EB 5 `"恟 )+ޅ|   mE7E4E5E3--E2E0IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIO0SEGMENTBLANK oi ~|   B~~4 6O c󦣞䆨  AN ޓ’C  vuPޞ0 @)B? ep@)~idAMx @u iijI)=i ] _bcU Bl ~~~~Q  6UK5 ;!V? / p@ ~AQ+X Q"i@ C 6g B6 Q I )5  6= i E~pU)i%+u'6  66G  @EB 5 `"恟 )+ޅ|   09 OPCODE COMAND WORD :200 * TITL MINI-DIAGNOSTIC * * MINI-DIAGNOSTIC CHECKS PROCESSOR OPERATION *  AND DOES A PARITY PURGE THROUGHOUT MEMORY * TEST EQU $ COPY X,XSAVE SBIT 1,S SET OV JF OVicEdDano?~|   B~~4 6Oc󦣞䆨 AN ޓ’C vuPޞ0 @)B ?Hep@)~idAMx@uiijI)=i ] _bcU Bl~~~~Q 6UK5 ;!V?;/ p@ ~AQ+XQ"i@C 6g B6 Q I )5 6= iE~pU)i%+u'6 :  66G  @EB 5 `"恟 )+ޅ|   mE7E4E5E3--E2E0IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII< IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII