IMD 1.16: 2/09/2008 12:24:49 84-93896-01 a000 f89601 4/10t back to back pico test source files    @0{)vvЀЀsQpk)p " }fA __M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIICARTOSMA282102215294840821022152948 821022152948#4 *F89601 VOL4/10T BACK-TO-BACK PICO TEST   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_M@qGyy GGG`HX@ b G`^Y e GQ @@p@987 85P@ G:پN 8)0. * C'xC# b# }B* @0DAJL w+™ЀЀΖQA1"   i  ž} š} @EEFF)DEۄF8 џ} ԟ} ̟} * `jUBBI,v BI, # @ G7H@pܾrCHC C GTq` Lg gEXC P+s=胾P+c fQN p $Rxnj  ޔniZ ތ⊞ } }HGž Ÿ@ALS)"$ C k20j.h( +$`%ꂜ\1 !M' y %'+os慾)sY ed|{ @8 o O m J K i gN )V% t%sLn`"E F. F„ D>) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYSG @ @G6BDāCGDĀ# BC @E OB TITL NM4 4/10T DISTRIBUTED I/O SYSTEM TEST 93896-10A0 TITL TITLE PAGE * * * * NM4 4/10T DISTRIBUTED I/O SYSTEM TEST * * * * 84-93896-10-A0 * * * * COPYRIGHT 1982 COMPUTER AUTOMATION INC. * TITL EXTERNAL LINKS * * EXTERNAL LINKER "LINKS" * EXTR DEBUG4 EXTR SIOEND NAM SIOGP NAM SLINSP NAM SLCTRL NAM SIOSP NAM GPTS1 NAM GPTS2 NAM GPTS3 NAM GPTS4 NAM GPTS5 NAM GPTS6 NAM CTLTST NAM MOVE * TITL GENERAL PROGRAM EQUATES * * INTERRUPT LOCATION BLOCK EQUATES * * AIOCMD EQU 0 AIOCNT EQU 1 AIOADR EQU 2 AIOCHN EQU 3 EOBJST EQU 4 EOBADR EQU 5 * * * MISCELLANEOUS EQUATES * TAG EQU :400 TAG MODE BIT BR EQU :200 BRANCH MODE BIT INDATA EQU :C INPUT DATA VALUE INCMD EQU 8 INPUT COMMAND VALUE OUTDTA EQU 4 OUTPUT DATA VALUE OUTCMD EQU 0 OUTPUT COMMAND VALUE STRTGP EQU :50 START PICO ADDRESS BEGN EQU :60 SSTART EQU :800 START OF SERIAL PICO TESTING PARMIN EQU :408 PARRELL MODE IN SET BIT PARMOUT EQU :400 PARRELL MODE OUT SET BIT SERIN EQU :400 SERIAL MODE IN SET BIT SEROUT EQU :402 SERIAL MODE OUT SET BIT * * 410T SIO EQUATES * CH4DA EQU :F8 CHANNEL 4 DEVICE ADDRESS(410T) CH5DA EQU :FA CHANNEL 5 DEVICE ADDRESS(410T) CH6DA EQ U :FC CHANNEL 6 DEVICE ADDRESS(410T) CH7DA EQU :FE CHANNEL 7 DEVICE ADDRESS(410T) CH4IL EQU :E0 CHANNEL 4 INTERRUPT ADDRESS(410T) CH5IL EQU :E8 CHANNEL 5 INTERRUPT ADDRESS(410T) CH6IL EQU :F0 CHANNEL 6 INTERRUPT ADDRESS(410T) CH7IL EQU :F8 CHANNEL 7 INTERRUPT ADDRESS(410T) * VBYTCT EQU :FF00 PARONI EQU :1668 SOUT EQU :612 SERIAL OUTPUT START WORD SINN EQU :210 SERIAL INPUT START WORD PINN EQU :260 PARRELL INPUT START WORD POUT EQU :250 PARRELL OUTPUT START WORD DELAY1 EQU -16 DELAY2 EQU -16 SPCHS7 EQU :80AA VBYTC1 EQU :FE00 COUNT2 EQU :FFF0 COUNT3 EQU :FFFB D99 EQU :99 D80 EQU :80 BYTCNT EQU :100 * TITL DATA AND TEMP LOCATIONS * * DATA AND TEMP LOCATIONS USED BY DIAGNOSTIC * ABS :00 * * CDRHLD RES 1,0 HOLDS VALUE TO BE OUTPUT TO CDR BY HOST STATSV WORD :0150 4/10T STATUS GPINCM WORD PINN GPOUCM WORD POUT STHOST WORD :1150 HOST STATUS DEVICEA RES 1,:000F 4/10T DEFAULT DEVICE ADDRESS ENDSIO WORD SIOEND END OF SIO * SCIR WORD :8100 SCDR WORD :8101 SCMAR WORD :8102 * * SLAVE CONTROL INSTRUCTION SKELETONS * OSDRI OSCDR A OUTPUT FROM SLAVE REG. TO SLAVE CONTROL DATA REG ISDRI ISCDR A INPUT TO SLAVE REG. FROM SLAVE CONTROL DATA REG. OMSDRI OMSCDR . OUTPUT FROM MEMORY TO SLAVE CONTROL DATA REG. IMSDRI IMSCDR . INPUT TO MEMORY FROM SLAVE CONTROL DATA REG. STOPI STOP . STOP INSTRUCTION SSTPI SSTEP . SINGLE STEP STARTI START . START ISDRPI ISCDR P 'INPUT FROM SLAVE DATA REGISTER TO P' INSTR. OSDRPI OSCDR P  'OUTPUT P TO SLAVE DATA REG.' INST. * JST WORD :BF80 'JST *$+1' AOB AOB 0*8+0 AIB AIB 0*8+0 OTX OUT X,0*8+0 INA IN 0*8+0,A RESET WORD :100 RESET CODE FOR SERIAL AND PARRELL PICOS GPDAT1 WORD 0 GP 1 CHANNEL/DEV ADR/INT GPDAT2 WORD 0 GP 2 CHAN/DEV ADR/INT GPSAVE WORD 0 INMOD WORD PARMIN DEFAULT PARR INPUT MODE BIT OUTMOD WORD PARMOUT DEFUALT PARR OUTPUT MODE BIT * * THESE VALUES LISTED BELOW ARE DEFAULTED * GP1ADR WORD CH4DA CHANNEL 4 DA=:F8 GP2ADR WORD CH7DA CHANNEL 7 DA=:FE GP1IL WORD CH4IL CHANNEL 4 INT.ADDR=:E0 GP2IL WORD CH7IL CHANNEL 7 INT. ADDR=:F8 GPPASS WORD 0 GPWAIT WORD 0 OUTEOB WORD 0 OUTPUT EOB FLAG INEOB WORD 0 INPUT EOB FLAG INFLG WORD  0 = 1 FOR GP1, =2 FOR GP2 OUTFLG WORD 0 = 1 FOR GP1, =2 FOR GP2 GPSTS1 WORD 0 GP1 STATUS GPSTS2 WORD 0 GP2 STATUS * OPDASH WORD :80 BOARD OPTION DMA OR NOT(DEFAULT=NOT) OTA OUT A,0*8+0 OUTPUT COMMAND IN AREG TO PICO * SYSFLAG WORD 0 SLAVE/HOST FLAG TITL SERVICE ROUTINES * * HOST CONSOLE INTERRUPT SERVICE ROUTINE (STOP THE SLAVE) * SLVHLT ENT SIN 7 DISABLE INTERRUPTS OUT Q,1 RESET CONSOLE INTERRUPT COPY STOPI,Q STOP INSTRUCTION COPY Q,*SCIR STORE IN SLAVE INSTRUCTION REGISTER COPY DEVICEA,X GET DEVICE ADDRESS COPY =1,Q DATA FOR SELP SLVHLT1 XNX X INDEX NEXT SELP Q,2 STOP SLAVE JMP *SLVHLT AND EXIT * * UNEXPECTED TRAP SERVICE ROUTINES * UMT1 ENT JST LIGHTS HLT UNEXPECTED UNINSTALLED MEMORY TRAP *  UIT1 ENT JST LIGHTS HLT UNEXPECTED UNIMPLEMENTED INSTRUCTION TRAP * AET1 ENT JST LIGHTS HLT UNEXPECTED DIVIDE / FLOATING POINT TRAP * AET2 ENT JST LIGHTS HLT UNEXPECTED CHARACTER / NUMERIC TRAP * SET1 ENT JST LIGHTS HLT UNEXPECTED STACK EXCEPTION TRAP * UST1 ENT JST LIGHTS UNEXPECTED USER TRAP HLT * SYT1 ENT JST LIGHTS UNEXPECTED SYSTEM TRAP HLT * PUV1 ENT JST LIGHTS POWER UP TRAP HLT * CNSL ENT JST SLVHLT DISABLE SLAVE HLT * * ROUTINE TO DISPLAY UNEXPECTED TRAP CODE * LIGHTS ENT SIN 2 NO INTS. COPY =0,A -- SET STATUS COPY A,S -- REG. TO ZERO COPY SYSFLAG,X GET SYSTEM FLAG COPY =:A,A DISPLAY CODE FOR UNEXPECTED TRAP JEQ X,$+3 IF HOST, JUMP COPP A,CDRHLD OTHER STORE IN CDRHLD JMP *LIGHTS AND EXIT SELP A,4 SEND TO CDR JST SLVHLT STOP SLAVE JMP *LIGHTS AND EXIT JMP *LIGHTS AND EXIT JMP *LIGHTS RETURN TITL INTERRUPT AND TRAP VECTORS * *  INTERRUPT AND TRAP VECTORS * INTERRUPT AND TRAP VECTORS * * * POWER-UP VECTOR * ABS :80 JST *$+1 WORD PUV1 * * UNIMPLEMENTED INSTRUCTION TRAP VECTOR * ABS :84 UNTNTP RES 2,0 JST  *$+1 UNIMPT WORD UIT1 * * UNINSTALLED MEMORY TRAP VECTOR * UNMEMT RES 2,0 JST *$+1 WORD UMT1 * * POWER-DOWN TRAP VECTOR * ABS :8C RES 2,0 HLT WAIT HERE * * HOST CONSOLE INTERRUPT VECTOR * ABS :94 JST *$+1 WORD CNSL * * CHARACTER / NUMERIC TRAP VECTOR * ABS :98 RES 2,0  JST *$+1 CNJMP WORD AET2 * * STACK EXCEPTION TRAP VECTOR * RES 2,0 JST *$+1 SEJMP WORD SET1 * * USER TRAP VECTOR * RES 2,0 JST *$+1 WORD UST1 * * SYSTEM TRAP * RES 2,0 JST *$+1 WORD SYT1 HLT * * ARITHMETIC EXCEPTION TRAP VECTOR * RES 2,0 JST *$+1 WORD AET1 * * HOST INTERRUPT FROM SLAVE * HSTINT JMP *$+1 WORD CONT1 TITL SIO VECTOR INTERRUPTS ABS :C0 SIOVEC EQU $ WORD 0,0,0,0 * * SIO CHAN #0 * JST *$+1 WORD ILLHLT WORD 0,0,0,0,0,0 * * SIO CHAN #1 * JST *$+1 WORD ILLHLT WORD 0,0,0,0,0,0 * * SIO CHAN #2 * JST *$+1 WORD ILLHLT WORD 0,0,0,0,0,0 * * SIO CHAN #3 * JST *$+1 WORD ILLHLT WORD 0,0,0,0,0,0 * * SIO CHAN #4 * JST *$+1 WORD ILLHLT WORD 0,0,0,0,0,0 * * SIO CHAN #5 * JST *$+1 WORD ILLHLT WORD 0,0,0,0,0,0 * * SIO CHAN #6 *  JST *$+1 WORD ILLHLT WORD 0,0,0,0,0,0 * * SIO CHAN #7 * JST *$+1 WORD ILLHLT WORD 0,0 TITL ILLEGAL VECTOR INTERRUPTS ABS :100 INTHLT WORD 0 HLT :F7 INTERRUPT VECTOR HALT HLT HLT * ILLHLT WORD 0 HLT :F8 ILLEGAL SIO INTERRUPT (EOB) HLT HLT * * TITL MORE SIO VECTOR INTERRUPTS ABS :1C0 WORD 0,0,0,0 * *  SIO CHAN #0 * JST *$+1 WORD ILLHLT WORD 0,0,0,0,0,0 * * SIO CHAN #1 * JST *$+1 WORD ILLHLT  WORD 0,0,0,0,0,0 * * SIO CHAN #2 * JST *$+1 WORD ILLHLT WORD 0,0,0,0,0,0 * * SIO CHAN #3 * JS T *$+1 WORD ILLHLT WORD 0,0,0,0,0,0 * * SIO CHAN #4 * JST *$+1 WORD ILLHLT WORD 0,0,0,0,0,0 * * SIO CHAN #5 * JST *$+1 WORD ILLHLT WORD 0,0,0,0,0,0 * * SIO CHAN #6 * JST *$+1 WORD ILLHLT  WORD 0,0,0,0,0,0 * * SIO CHAN #7 * JST *$+1 WORD ILLHLT WORD 0,0 * TITL INITIAL STARTUP ROUTINE * *  INITIAL STARTUP ROUTINE * * ENTER IN LEAST SIGNIFICATE NIBBLE OF A REG * THE DEVICE ADDRESS OF THE 410T.......... * IF DEVICE IS A F,THEN ENTER :000F IN AREG * THEN JUMP TO THE LINKED ADDRESS OF SIOGP. * SIOGP EQU $ COPY A,DEVICEA  COPY =0,A COPY A,SRFLG COPY A,LPINDC JMP INIT1 * LPOOL TITL INIT1 COPY DEVICEA,X GET SLAVE DEVICE ADDRESS AND =:F,X MASKIT SHIFT X,LO,4 SHIFT X FOR DEVICE ADDRESS COPY STHOST,Q GET HOST STATUS COPY Q,S SET S REG. COPY =0,A -- COPY A,CDRHLD CLEAR CONSOLE DATA REG. OUTPUT VALUE UIS DISABLE INTERRUPTS FROM SLAVE IMS SYSFLAG SET FLAG FOR SLAVE * * RESET 4/10T AND LOAD SIO INTO SLAVE * INIT2 COPY =1,Q SET BIT ON XNX X INDEX NEXT SELP Q,0 SET PROGRAMMED RESET ON SLAVE IJNE Q,$ DO DELAY COPY =1,Q SET BIT ON AGAIN XNX X INDEX NEXT SELP Q,3 CLEAR SLAVE CONTROL REGISTER * COPY ENDSIO,A GET ENDING ADDRESS NEG A NEGATE IT COPY A,CNT STORE NEGATIVE WORD COUNT COPY =0,A SET FIRST ADDRESS LOCATION COPY A,ADDR STORE IT COPY IMSDRI,A 'INPUT TO MEMORY FROM SLAVE CDR' COPY A,*SCIR STORE IT INIT3 COPY ADDR,A GET CURRENT MEM. ADDRESS COPY A,*SCMAR STORE IT IN CONTROL REG. COPY *ADDR,A GET CURRENT MEM. CONTENTS COPY A,*SCDR STORE IT IN CONTROL REG. JST DOIT MAKE SLAVE DO IT * HLT TIMED OUT RE AUTOLOAD DIAG AGAIN.... * IMS ADDR INC. DMA ADDRESS IMS CNT INC. DMA WORD COUNT JMP INIT3 LOOP FOR MORE COPY =0,A -- SET SYSTEM FLAG COPY A,SYSFLAG -- FOR HOST AGAIN * COPY =SIOSTRT,A GET STARTING ADDR. COPY A,*SCDR STORE IT IN CONTROL REG. COPY ISDRPI,A 'INPUT FROM SLAVE CONTROL DATA REGISTER-P REG.' COPY A,*SCIR STORE IT IN CONTROL REG. JST DOIT MAKE SLAVE DO IT HLT TIMED OUT * COPY =0,A -- RESET COPY A,CDRHLD -- CDR HOLDING CELL SELP A,4 SEND TO CDR COPY STARTI,A 'START' COPY A,*SCIR STORE IT IN CONTROL REG. JST DOIT MAKE SLAVE DO IT HLT TIMED OUT * COPY =0,Q SET LOOP COUNT INIT4 COPY CDRHLD,A GET CDR CONTENTS JNE A,$+3 SOMETHING WAS RETURNED IJNE Q,INIT4 LOOP BACK HLT DIDN'T RETURN A VALUE IN TIME SELP A,4 SEND TO HOST CDR JST DOIT MAKE SLAVE CONTINUE HLT TIMED OUT * CONT1 EQU $ RBIT 12,S -- ENABLE INTERRUPTS UIS  - -- FROM SLAVE SBIT 12,S DISABLE INTERRUPTS FROM SLAVE AFTER INTERRUPT COPY CDRHLD,A GET VALUE FOR CONSOLE DATA REG SELP A,4 OUTPUT TO CONSOLE DATA REG JMP $-2 WAIT FOR INTERRUPT * CNT RES 1,0 COUNT ADDR RES 1,0 ADDRESS * LPOOL TITL SLAVE DMA CONTROL * * * SLAVE DMA CONTROL ROUTINE * * INPUT: * *  X REG = SLAVE DEVICE ADDRESS * * * OUTPUT: * * RETURN ADDRESS - DMA TIMED OUT * * RETURN ADDRESS+1 - EVERYTHING IS OK * * DOIT ENT COPY =0,A SET TIME DELAY COPY =1,Q SET BIT ON XNX X INDEX NEXT SELP Q,2 MAKE SLAVE DO IT XNX X INDEX NEXT SST 2 DID HE GET IT? JMP $+2 NO, DEC. COUNT JMP $+3 YES, CONTINUE IJNE A,$-4 DEC. DELAY COUNT JMP *DOIT ERR OR EXIT XNX X INDEX NEXT SST 2 DID HE ACT ON IT? JMP $+3 YES, CONTINUE IJNE A,$-3 NO, DEC. COUNT JMP *DOIT ERROR EXIT IMS DOIT SET GOOD RETURN JMP *DOIT DO GOOD RETURN TITL SLAVE MEMORY/REGISTER INSPECT ROUTINE * * SLAVE MEMORY/REGISTER INSPECT ROUTINE * * INPUT: * * A REG BIT 0 0 = MEMORY INSPECT * 1 = REGISTER INSPECT * * BIT 1 0 = NO AUTO INCREMENT * 1 = AUTO INCREMENT * *  BIT 2 0 = SINGLE ACCESS * 1 = CONTINUOUS ACCESS (NO AUTO INC.) * *  BIT 3 0 = NO READ/WRITE ALTERNATION * 1 = READ/WRITE ALTERNATION *  (FORCED CONTINUOUS ACCESS) * * BIT 4-11 SLAVE DEVICE ADDRESS * *  X REG MEMORY ADDRESS OR REGISTER CODE. * REGISTER CODES AS FOLLOWS: * *  A = 0 * Q = 1 * X = 2 * Y = 3 * P = 4 * S = 5 * K = 6 * L = 7 * * DATA REG DATA FOR WRITE OPERATION * * SENSE SW 0 = READ * 1 = WRITE * * OUTPUT: * * DATA REG DATA FROM READ OPERATION * * * SLINSP EQU $ COPY =0,Q OUT Q,0 RESET SENSE SWITCH SLINS1 TBIT 0,A  MEMORY OR REGISTER OPERATION ? JT OV,SLVREG REGISTER INSPECT * * MEMORY INSPECT * SLVMEM JF SS,SLVMRD CHECK FOR READ OR WRITE. JUMP FOR READ IN 4,Q GET DATA FROM CONSOLE DATA REGISTER COPY Q,*SCDR PUT IN SLAVE DATA REGISTER COPY IMSDRI,Q 'INPUT FROM SLAVE DATA REGISTER' INSTRUCTION JMP $+2 SLVMRD EQU $  READ MEMORY COPY OMSDRI,Q 'OUTPUT TO SLAVE DATA REGISTER' INSTR. COPY Q,*SCIR STORE IN SLAVE INSTRUCTION REGISTER COPY X,*SCMAR STORE MEMORY ADDRESS IN SLAVE MEM. ADDR. REG. COPY A,Y OPERATOR CHOICES SHIFT Y,RO,4 GET DEVICE ADDRESS AND =:FF,Y MASK IT COPY =1,Q DATA FOR SELP SLVM1 XNX Y INDEX DEVICE ADDRESS  SELP Q,2 DO MEMORY OPERATION SLVM2 XNX Y INDEX DEVICE ADDRESS SST 2 SENSE FOR MEMORY OPERATION DONE -- SKIP IF NOT JMP SLVM3 OPERATION DONE IJNE Q,SLVM2 INCREMENT TIME-OUT COUNT -- JUMP IF NOT EXP. JST ERRLIT GO TO ERROR LIGHT ROUTINE TBIT 2,A CHECK FOR SINGLE OR CONTINUOUS ACCESS JF OV,$-2 SINGLE ACCESS -- CONTINUE ERROR LIGHT ROUTINE JMP SLVM1 CONTINUOUS ACCESS -- REPEAT MEMORY OPERATION TITL SLVM3 EQU $ MEMORY OPERATION DONE JT SS,$+3 CHECK FOR READ OR WRITE -- JUMP FOR WRITE  COPY *SCDR,Q GET CONTENTS OF SLAVE DATA REGISTER SELP Q,4 OUTPUT DATA TO CONSOLE DATA REGISTER TBIT 3,A CHECK FOR READ/WRITE ALTERNATION JF OV,SLVM4 JUMP FOR NO ALTERNATION COPY =0,Q --  JT SS,$+2 -- COMPLEMENT COPY =1,Q -- SENSE SWITCH OUT Q,0 -- JMP SLVMEM DO C OMPLEMENT OPERATION SLVM4 TBIT 2,A CHECK FOR SINGLE OR CONTINUOUS ACCESS JT OV,SLVM1 JUMP FOR CONTINUOUS ACCESS -- REPEAT OPERATION TBIT 1,A SINGLE ACCESS -- CHECK FOR AUTO-INCREMENT JF OV,$+2 JUMP IF NO AUTO-INCREMENT ADD =1,X INCREMENT MEMORY ADDRESS HLT WAIT FOR OPERATOR ACTION JMP SLINS1 DO ANOTHER MEMORY OR REGISTER OPERATION TITL * * REGISTER INSPECT * SLVREG JF SS,SLVRRD TEST FOR READ OR WRITE. JUMP FOR READ IN 4,Q GET DATA FROM CONSOLE DATA REGISTER COPY Q,*SCDR PUT IN SLAVE DATA REGISTER COPY ISDRI,Q 'INPUT FROM SLAVE DATA REGISTER' INSTR. JMP $+2 SLVRRD EQU $ READ REGISTER  COPY OSDRI,Q 'OUTPUT TO SLAVE DATA REGISTER' INSTR. COPY =8,Y REGISTER COMPARISON VALUE CSM X,Y  CHECK RANGE OF REGISTER SELECTION JMP $+3 OK JST ERRLIT -- ERROR-WRONG JMP $-1  -- REGISTER SELECTION XNX X USE REGISTER SELECTION AS INDEX COPY REGS3,Y GET S3 FIELD FOR INSTRUCTION OR Y,Q ADD TO INSTRUCTION SKELETON COPY Q,*SCIR STORE INSTRUCTION IN SLAVE INSTR. REG. COPY A,Y OPERATOR CHOICES SHIFT Y,RO,4 GET DEVICE ADDRESS AND =:FF,Y MASK IT COPY =1,Q DATA FOR SELP SLVR1 XNX Y INDEX DEVICE ADDRESS SELP Q,2 DO REGISTER OPERATION SLVR2 XNX Y INDEX DEVICE ADDRESS SST 2 SENSE FOR REGISTER OPERATION DONE - SKIP IF NOT JMP SLVR3 OPERATION DONE IJNE Q,SLVR2 INCREMENT TIME-OUT COUNT -- JUMP IF NOT EXP. JST ERRLIT TIME-OUT EXPIRED -- GO TO ERROR LIGHT ROUTINE TBIT 2,A CHECK FOR SINGLE OR CONTINUOUS ACCESS JF OV,$-2 JUMP FOR SINGLE ACCESS -- CONTINUE LIGHTS JMP SLVR1 CONTINUOUS ACCESS -- REPEAT OPERATION TITL SLVR3 EQU $ REGISTER OPERATION DONE JT  SS,$+3 CHECK FOR READ OR WRITE -- JUMP FOR WRITE COPY *SCDR,Q GET CONTENTS OF SLAVE DATA REGISTER SELP Q,4 OUTPUT DATA TO CONSOLE DATA REGISTER TBIT 3,A CHECK FOR READ/WRITE ALTERNATION JF OV,SLVR4 JUMP FOR NO ALTERNATION COPY =0,Q -- JT SS,$+2 -- COMPLEMENT COPY =1,Q -- SENSE SWITCH  OUT Q,0 -- JMP SLVREG DO COMPLEMENT OPERATION SLVR4 TBIT 2,A CHECK FOR SINGLE OR CONTINUOUS ACCESS JT OV,SLVR1 JUMP FOR CONTINUOUS ACCESS -- REPEAT OPERATION TBIT 1,A CHECK FOR AUTO-INCREMENT JF OV,$+3 JUMP IF NO AUTO-INCREMENT ADD =1,X INCREMENT REGISTER # AND =7,X WRAP AROUND TO 0 AFTER 7 HLT WAIT FOR OPERATOR ACTION JMP SLINS1 DO ANOTHER MEMORY OR REGISTER OPERATION * * TABLE OF INSTRUCTION S3 FIELDS * REGS3 EQU $ WORD :0000 A REGISTER WORD :0040 Q REGISTER WORD :0020 X REGISTER WORD :0060 Y REGISTER WORD :0010 P REGISTER WORD :0030  S REGISTER WORD :0070 K REGISTER WORD :0050 L REGISTER TITL ERROR LIGHT ROUTINE * * ERROR LIG HT ROUTINE * * BLINK OV FOR APPROX. .25 SEC. * ERRLIT ENT RBIT 2,S RESET OV IMS ERRTMP -- INCREMENT ERRTMP TO 0. OV GETS SET JMP $-1 -- WHEN ERRTMP GOES NEGATIVE JMP *ERRLIT RETURN ERRTMP RES 1,0 TITL SLAVE CONTROL ROUTINE * * SLAVE CONTROL ROUTINE * * INPUT: * * A REG BIT0 0 = START *  1 = SINGLE STEP * * BIT 2 0 = SINGLE ACCESS *  1 = CONTINUOUS ACCESS * * BIT 4-11 SLAVE DEVICE ADDRESS * * BIT 12-15 NOT USED * * OUTPUT: * * DATA REG SLAVE P REG CONTENTS FOLLOWING SINGLE STEP * SLCTRL EQU $ TBIT 0,A 'START' OR 'SINGLE STEP' ? JT OV,SLSSTP JUMP IF SINGLE STEP COPY STARTI,Q 'START' INSTRUCTION  JMP $+2 SLSSTP COPY SSTPI,Q 'SINGLE STEP' INSTRUCTION COPY Q,*SCIR STORE INSTRUCTION IN SLAVE INSTR. REG.  COPY A,Y OPERATOR CHOICES SHIFT Y,RO,4 GET DEVICE ADDRESS AND =:FF,Y MASK IT COPY =1,Q DATA FOR SELP SLVST1 XNX Y INDEX DEVICE ADDRESS SELP Q,2 START SLAVE SLVST2 XNX Y INDEX DEVICE ADDRESS  SST 2 SENSE FOR OPERATION DONE - SKIP IF NOT JMP SLVST3 OPERATION DONE IJNE Q,SLVST2 INCREMENT TIME-OUT COUNT -- JUMP IF NOT EXP. JST ERRLIT TIME-OUT EXPIRED -- GO TO ERROR LIGHT ROUTINE TBIT 2,A CHECK FOR SINGLE OR CONTINUOUS ACCESS JF OV,$-2 JUMP FOR SINGLE ACCESS -- CONTINUE LIGHTS JMP SLVST1 CONTINUOUS ACCESS -- REPEAT OPERATION * SLVST3 EQU $ OPERATION DONE TBIT 0,A START OR SINGLE STEP ? JF OV,SLVST4 SKIP CONSOLE DISPLAY OUTPUT FOR START COPY OSDRPI,Q 'OUTPUT P TO SLAVE DATA REG.' INST.  COPY Q,*SCIR STORE IN SLAVE INSTRUCTION REG. COPY =1,Q DATA FOR SELP XNX Y INDEX DEVICE ADDRESS SELP Q,2 INSPECT SLAVE P REG. COPY *SCDR,Q LOAD Q WITH SLAVE P REG CONTENTS SELP Q,4  OUTPUT TO CONSOLE DATA REG. SLVST4 HLT WAIT FOR OPERATOR ACTION JMP SLCTRL DO ANOTHER CONTROL OPERATION TITL GENERAL PURPOSE PICO TEST (SIOGP) ****** * THE LSI GENERAL PURPOSE PICOPROCESSOR TEST * IS DESIGNED TO VERIFY THE OPERATION OF * THE GENERAL PURPOSE PICOPROCESSOR'S * FIRMWARE AND ASSOCIATED HARDWARE LOGIC. * THE TEST ASSUMES THAT THE I/O TEST CARD(S) * AND CABLE(S) ARE CHECKED AND OPERATIONAL. * IN ORDER FOR THIS TEST TO CHECK THE 410T * PROCESSOR, A MINIMUM OF TWO (2) PICOS MUST * BE USED AND CONNECTED AS ILLUSTRATED IN * THE SIOGP TEST DOCUMENTATION (INCLUDED * IN DOCUMENT NUMBER '90-93920-00' - DISTRIBUTED * I/O SYSTEM TEST DOCUMENTATION). * SIOSTRT  EQU $ COPY STATSV,A GET SLAVE STATUS COPY A,S PUT INTO 4/10T S-REG. COPY DEVICEA,A GET SLAVE LOAD FLAG COPP A,CDRHLD AND PASS IT TO HOST HLT AND WAIT HERE * SIOSTRT1 COPY GP1IL,X FETCH GP1 INT. ADDRESS COPY JST,A COPY A,EOBJST(X) STORE JST AT INT. VECTOR COPY OTX,A FETCH OTX COMMAND OR GP1ADR,A FORM DEV. ADDR OR =1,A   SET CONTROL BIT COPY A,OTXCM1 STORE OTX COMMAND COPY INA,A OR GP1ADR,A FORM INA COMMAND FOR DATA COPY A,INDTA1 STORE INA COMMAND (GP1) OR =1,A FORM INA COMMAND FOR STATUS COPY A,INSTA1 STORE STATUS INA (GP1) COPY GP2IL,X FETCH GP2 INT. ADDRESS COPY JST,A COPY A,EOBJST(X) COPY  OTX,A OR GP2ADR,A FORM OTX W/DEV ADDR. OR =1,A SET CONTROL BIT COPY A,OTXCM2 COPY  INA,A OR GP2ADR,A COPY A,INDTA2 OR =1,A COPY A,INSTA2 COPY OTA,A FETCH OTA COMMAND OR GP1ADR,A COPY A,OTADA1 COPY OTA,A OR GP2ADR,A COPY A,OTADA2  COPY SRFLG,A JNE A,SERL JMP GPTS1 GP BACK TO BACK TEST SERL JMP GPSRTT SERIAL BACK TO BACK TEST JST ERROR ...... SHOULD NEVER GO HERE LPOOL TITL SIOGP SUBROUTINES * * SUBROUTINE TO ISSUE CONTROL COMMANDS * TO GP 1 PICOPROGESSOR * * CALLING SEQUENCE * * LDX PICO CONTROL WORD * JST G1OTXC * NORMAL RETURN * G1OTXC ENT OTXCM1 OUT X,0*8+0 OUTPUT CONTROL WORD JMP *G1OTXC EXIT * * * SUBROUTINE TO INPUT STATUS FROM GP1 * * CALLING SEQUENCE * * JST INAST1 * NORMAL RETURN (A=INPUT STATUS) * INAST1 ENT INSTA1 IN 0*8+0,A INPUT GP1 STATUS AND =:0037,A JMP *INAST1 EXIT * * * SUBROUTINE TO INPUT DATA FROM GP1 * * CALLING SEQUENCE * * JST INADT1 * NORMAL RETURN (A=INPUT DATA) * INADT1 ENT INDTA1 IN 0*8+0,A INPUT DATA FROM GP1 JMP *INADT1 EXIT * * * SUBROUTINE TO OUTPUT DATA TO GP1 * * CALLING SEQUENCE * * LDA  DATA WORD * JST OTADT1 * NORMAL RETURN * OTADT1 ENT OTADA1 OUT A,0*8+0 OUTPUT DATA JMP *OTADT1 EXIT * * * SUBROUTINE TO ISSUE CONTROL COMMANDS * TO GP2 PICOPROCESSOR * * CALLING SEQUENCE * * LDX PICO COMMAND WORD * JST G2OTXC * NORMAL RETURN * G2OTXC ENT OTXCM2 OUT X,0*8+0 OUTPUT CONTROL WORD JMP *G2OTXC  EXIT * * * SUBROUTINE TO INPUT STATUS FROM GP2 * * CALLING SEQUENCE * * JST INAST2 * NORMAL RETURN (A=INPUT STATUS) * INAST2 ENT INSTA2 IN 0*8+0,A INPUT GP2 STATUS AND =:0037,A JMP *INAST2 EXIT * * *  SUBROUTINE TO INPUT DATA FROM GP2 * * CALLING SEQUENCE * * JST INADT2 * NORMAL RETURN (A=INPUT DATA) * INADT2 ENT INDTA2 IN 0*8+0,A INPUT DATA FROM GP2 JMP *INADT2 EXIT * * * SUBROUTINE TO OUTPUT DATA TO GP2 * *  CALLING SEQUENCE * * LDA OUTPUT DATA * JST OTADT2 * NORMAL RETURN * OTADT2 ENT OTADA2 OUT A,0*8+0 OUTPUT DATA JMP *OTADT2 EXIT * * * SUBROUTINE TO HANDLE INPUT EOB INTERRUPTS * ININT ENT RBIT 8,S TURN FURTHER INT. OFF COPY A,SAVA SAVE A COPY X,SAVX SAVE X COPY S,A FETCH PSW COPY A,SAVS SAVE PSW COPY INFLG,A FETCH INPUT FLAG VALUE SUB =1,A JNE A,ININT1 COPY =BR;:10,X FETCH BRANCH CODE JST G1OTXC ISSUE COMMAND TO GP1 JST INAST1 READ GP1 STATUS COPY A,GPSTS1 SAV E GP1 STATUS JMP ININT2 ININT1 EQU $ COPY =BR;:10,X FETCH BRANCH CODE JST G2OTXC ISSUE COMMAND TO GP2 JST INAST2 FETCH GP2 STATUS COPY A,GPSTS2 SAVE GP2 STATUS ININT2 EQU $ IMS INEOB  SET INPUT EOB FLAG COPY SAVX,X RESTORE X COPY SAVS,A FETCH PSW VALUE COPY A,S RESTORE PSW COPY SAVA,A RESTORE A SBIT 8,S ENABLE INTERRUPTS JMP *ININT EXIT * * SUBROUTINE TO HANDLE OUTPUT EOB INTERRUPTS * OUTINT ENT RBIT 8,S TURN OFF FURTHER INTS.... COPY A,SAVA SAVE A COPY X,SAVX SAVE X COPY S,A FETCH PSW COPY A,SAVS SAVE PSW COPY OUTFLG,A FETCH OUTPUT FLAG VALUE SUB =1,A JNE A,OINT1 JST INAST1 READ GP1 STATUS COPY A,GPSTS1 SAVE GP1 STATUS  JMP OINT2 OINT1 JST INAST2 READ GP2 STATUS COPY A,GPSTS2 SAVE GP2 STATUS OINT2 IMS OUTEOB SET OUTPUT EOB FLAG COPY SAVX,X RESTORE X COPY SAVS,A FETCH PSW VALUE COPY A,S RESTORE PSW  COPY SAVA,A RESTORE A SBIT 8,S ENABLE INTERRUPTS JMP *OUTINT EXIT * SAVA WORD 0 A REG SAVE SAVX WORD 0 X REG SAVE SAVS WORD 0 PSW SAVE * LPOOL TITL SIOGP TEST SEGMENT 1 (GPTS1) ****** TEST 1 - GPTS1 * * FROM HERE TO LABEL 'GPTS1D' THE GP CONNECTED * TO CHANNEL 4 (GP1) WILL BE SET FOR COMMAND * OUTPUT WITH A BYTE COUNT OF -2. THE GP * CONNECTED TO CHANNEL 7 (GP2) WILL BE SET * FOR COMMAND INPUT WITH A BYTE COUNT OF -2. * THE DATA WORD OUTPUT AND EXPECTED AS INPUT * IS :7F50. IF ERRORS ARE DETECTED A AND X * REGISTER HOLD THE DATA * * PURPOSE OF HALT * * BAD DATA - A=ACTUAL DATA *  X=EXPECTED DATA * ****** * * ENTRY POINT FOR USING PREVIOUSLY ENTERED * CHANNEL ASSIGNMENTS. * GPTS1 EQU $ RBIT 8,S DISABLE INTERRUPTS COPY GP1IL,X FETCH GP 1 INT. ADDR. COPY AOB,A FETCH AOB COMMAND OR GP1ADR,A FORM DEVICE ADDRESS COPY A,AIOCMD(X) COPY =-2,A -2 --> AR COPY A,AIOCNT(X) AUTO I/O COUNT = 2 BYTES COPY =OUTINT,A ADDR OF EOB ROUTINE (OUT) COPY A,EOBADR(X) COPY =GPOUT,A FETCH ADDR. OF OUTPUT BUFF SHIFT A,LO,1 CONVERT TO SUB =1,A BYTE ADDRESS -1  COPY A,AIOADR(X) COPY =1,A COPY A,OUTFLG SET OUTPUT FLAG FOR GP1 COPY GP2IL,X FETCH GP 2 INT. ADDR COPY AIB,A FETCH AIB COMMAND OR GP2ADR,A FORM AIB W/DEV ADDR COPY A,AIOCMD(X)  COPY =-2,A -2 --> AR COPY A,GPPASS SET PASS COUNT =-2 COPY A,AIOCNT(X) AUTO I/O COUNT = 2 BYTES  COPY =ININT,A ADDR OF EOB ROUTINE (IN) COPY A,EOBADR(X) COPY =GPIN,A FETCH ADDR OF INPUT BUFF SHIFT A,LO,1 CONVERT TO SUB =1,A BYTE ADDRESS -1 COPY A,AIOADR(X) COPY =2,A COPY A,INFLG SET INPUT FLAG FOR GP2 COPY =0,A COPY A,GPWAIT COPY A,OUTEOB COPY A,INEOB * * AT  THIS POINT GP1 INT VECTOR SET FOR * OUTPUT (2 BYTES), GP2 INT VECTOR SET * FOR INPUT (2 BYTES). * COPY RESET,X RESET CODE JST G1OTXC ISSUE COMMAND TO GP1 JST G2OTXC ISSUE COMMAND TO GP2 COPY =TAG;OUTCMD,X FETCH OUTPUT/COMMAND CODE JST G1OTXC ISSUE COMMAND TO GP1 COPY =TAG;INCMD,X FETCH INPUT/COMMAND CODE  JST G2OTXC ISSUE COMMAND TO GP2 * * AT THIS POINT GP1 SET FOR INPUT COMMAND MODE * AND GP2 SET FOR OUTPUT COMMAND MODE * COPY =:7F50,A FETCH DATA GPTS1A COPY A,GPOUT PUT IN OUTPUT BUFFER COPY =0,A COPY  A,GPWAIT COPY A,GPIN CLEAR INPUT BUFFER * * HERE WE START GP1 * COPY =BR;STRTGP,X FETCH START CODE  JST G1OTXC ISSUE COMMAND TO GP1 * * HERE WE START GP2 * COPY =BR;BEGN,X FETCH START INPUT CODE JST G2OTXC ISSUE COMMAND TO GP2 GPT1A1 EQU $ SBIT 8,S ENABLE INTERRUPTS GPTS1B EQU $ COPY INEOB,A FETCH INPUT EOB FLAG JEQ A,GPTS1E JUMP IF CLEAR COPY OUTEOB,A FETCH OUTPUT EOB FLAG JEQ A,GPTS1E JUMP IF CLEAR JMP GPTS1F GPTS1E IMS GPWAIT JMP GPTS1B COPY INEOB,A FETCH INPUT EOB FLAG JNE A,$+2 JST ERROR COPY OUTEOB,A FETCH OUTPUT EOB FLAG JNE A,$+2 JST ERROR GPTS1F EQU $ COPY =0,A COPY A,OUTEOB CLEAR EOB FLAGS COPY A,INEOB * * HERE WE CHECK INPUT DATA *  COPY GPIN,A XOR GPOUT,A JEQ A,GPTS1C JUMP IF DATA OK COPY GPOUT,X FETCH EXPECTED DATA  COPY GPIN,A FETCH ACTUAL DATA JST ERROR GPTS1C EQU $ IMS GPPASS BUMP PASS COUNT JMP GPTS1D JUMP IF NOT FINISHED * * HERE WE EXIT TO NEXT TEST * JMP GPTS1 PATCHABLE LOOP ORG $-1  NOP JMP GPTS2 JUMP TO TEST SEGMENT 2 * LPOOL TITL ****** * FROM HERE TO THE LABEL 'GPTS2' THE GP * CONNECTED TO CHANNEL 6 (GP1) WILL BE * SET FOR COMMAND INPUT AND THE GP CONNECTED * TO CHANNEL 7 (GP2) WILL BE SET FOR COMMAND * OUTPUT, BOTH GP'S WILL HAVE A BYTE COUNT * OF -2. THE DATA WORD OUTPUT AND EXPECTED * AS INPUT IS :6A0F. IF ERRORS ARE DETECTED * THE X AND A REGISTER WILL LOOK AS * FOLLOWS: * * PURPOSE OF HALT * * BAD DATA - A=ACTUAL DATA * X=EXPECTED DATA ****** * * HERE WE INITIALIZE GP1 FOR INPUT AND * GP2 FOR OUTPUT * GPTS1D EQU $ RBIT 8,S DISABLE INTERRUPTS COPY  GP1IL,X FETCH GP1 INT. ADDR COPY AIB,A OR GP1ADR,A COPY A,AIOCMD(X) COPY =GPIN,A INPUT BUFFER ADDRESS SHIFT A,LO,1 CONVERT TO SUB =1,A BYTE ADDRESS -1 COPY A,AIOADR(X) COPY =-2,A COPY A,AIOCNT(X) COPY =ININT,A INPUT EOB ROUTINE ADDR COPY A,EOBADR(X) COPY =1,A  COPY A,INFLG SET INPUT FLAG FOR GP1 COPY =TAG;INCMD,X COMMAND/INPUT CODE JST G1OTXC ISSUE COMMAND TO GP1 COPY GP2IL,X FETCH GP2 INT. ADDR COPY AOB,A OR GP2ADR,A COPY A,AIOCMD(X)   COPY =GPOUT,A OUTPUT BUFFER ADDRESS SHIFT A,LO,1 CONVERT TO SUB =1,A BYTE ADDRESS -1 COPY  A,AIOADR(X) COPY =-2,A COPY A,AIOCNT(X) COPY =OUTINT,A OUTPUT EOB ROUTINE ADDR COPY A,EOBADR(X) COPY =0,A COPY A,GPWAIT COPY A,OUTEOB COPY A,INEOB COPY =2,A COPY A,OUTFLG SET OUTPUT FLAG FOR GP2 COPY =TAG;OUTCMD,X COMMAND OUTPUT CODE JST G2OTXC ISSUE COMMAND TO GP2  COPY =BR;STRTGP,X FETCH START OUTPUT CODE JST G2OTXC ISSUE COMMAND TO GP2 COPY =BR;BEGN,X FETCH INPUT START CODE JST G1OTXC ISSUE COMMAND TO GP1 COPY =:6A0F,A FETCH DATA COPY A,GPOUT STORE DATA IN OUTPUT BUFF COPY =0,A COPY =0,A COPY A,GPWAIT COPY A,GPIN SBIT 8,S ENABLE INTERRUPTS GPTS1G EQU $ COPY INEOB,A FETCH INPUT EOB FLAG JEQ A,GPTS1H JUMP IF CLEAR COPY OUTEOB,A FETCH OUTPUT EOB FLAG JEQ A,GPTS1H JUMP IF CLEAR JMP GPTS1I GPTS1H IMS GPWAIT JMP GPTS1G COPY INEOB,A FETCH INPUT EOB FLAG JNE A,$+2 JUMP IF FLAG SET JST ERROR COPY OUTEOB,A FETCH OUTPUT EOB FLAG JNE A,$+2 JUMP IF FLAG SET JST ERROR GPTS1I EQU $ COPY =0,A COPY  A,INEOB CLEAR INPUT EOB FLAG COPY A,OUTEOB CLEAR OUTPUT EOB FLAG COPY GPIN,A FETCH INPUT DATA XOR GPOUT,A * JMP GPTS1D PATCHABLE LOOP ORG $-1 NOP GPTS1J EQU $ JMP GPTS1C *  LPOOL TITL SIOGP TEST SEGMENT 2 (GPTS2) ****** * TEST 2 - GPTS2 * THIS TEST IS DESIGNED TO CHECK THE TWO BYTE * FEATURE OF THE GP'S. THE GP CONNECTED TO * CHANNEL 4 (GP1) IS SET FOR DATA OUTPUT AND A * BYTE COUNT OF -1. THE GP CONNECTED TO * CHANNEL 7 (GP2) IS SET FOR DATA INPUT AND * A BYTE COUNT OF -2. A DATA WORD OF :3377 * IS OUTPUT, AND :3333 IS EXPECTED AS INPUT. * ERRORS WILL BE INDICATED BY HALTS * WHICH ARE DESCRIBED AS FOLLOWS: * * PURPOSE OF HALT * * BAD DATA - A=ACTUAL DATA *  X=EXPECTED DATA ****** GPTS2 EQU $ RBIT 8,S DISABLE INTERRUPTS COPY GP1IL,X FETCH GP1 INT ADDR  COPY AOB,A OR GP1ADR,A COPY A,AIOCMD(X) COPY =-1,A COPY A,AIOCNT(X) OUTPUT BYTE COUNT =1 COPY =OUTINT,A OUTPUT EOB ROUTINE COPY A,EOBADR(X) COPY =GPOUT,A OUTPUT BUFFER ADDR SHIFT A,LO,1 CONVERT TO SUB =1,A BYTE ADDRESS -1 COPY A,AIOADR(X) COPY =1,A COPY A,OUTFLG COPY GP2IL,X FETCH GP2 INT ADDR COPY AIB,A OR GP2ADR,A COPY A,AIOCMD(X) COPY =-2,A COPY A,GPPASS SET PASS COUNT = 2 COPY A,AIOCNT(X) COPY =ININT,A INPUT EOB ROUTINE COPY A,EOBADR(X) COPY =GPIN,A INPUT BUFFER ADDR SHIFT A,LO,1 CONVERT TO SUB =1,A BYTE ADDRESS -1 COPY A,AIOADR(X) COPY =2,A COPY A,INFLG COPY =0,A COPY A,GPWAIT COPY   A,OUTEOB COPY A,INEOB * * AT THIS POINT GP1 INT. VECTOR SET FOR * OUTPUT (1 BYTE), GP2 INT. VECTOR SET *  FOR INPUT (2 BYTES) * COPY RESET,X RESET CODE JST G1OTXC ISSUE COMMAND TO GP1 JST G2OTXC  ISSUE COMMAND TO GP2 COPY =TAG;OUTDTA,X FETCH OUTPUT COMMAND CODE JST G1OTXC ISSUE COMMAND TO GP1 COPY =TAG;INDATA,X FETCH INPUT COMMAND CODE JST G2OTXC ISSUE COMMAND TO GP2 * * AT THIS POINT GR1 SET FOR INPUT DATA MODE, * GP2 SET FOR OUTPUT DATA MODE * COPY =:3377,A FETCH DATA WORD GPTS2A COPY A,GPOUT PUT IN OUTPUT BUFFER COPY =0,A COPY A,GPIN CLEAR INPUT BUFFER COPY A,GPWAIT CLEAR WAIT CELL * * HERE WE START GP1 * COPY =BR;STRTGP,X FETCH START CODE JST G1OTXC ISSUE COMMAND TO GP1 * * HERE WE START GP2 * COPY =BR;BEGN,X JST G2OTXC ISSUE COMMAND TO GP2 GPT2A1 EQU $ SBIT 8,S ENABLE INTERRUPTS GPT2A2 EQU $ COPY INEOB,A FETCH INPUT EOB FLAG JEQ A,GPTS2D JUMP IF CLEAR COPY OUTEOB,A FETCH OUTPUT EOB FLAG JEQ A,GPTS2D JUMP IF CLEAR JMP GPTS2E GPTS2D IMS GPWAIT JMP GPT2A2 COPY INEOB,A FETCH INPUT EOB FLAG JNE A,$+2 JUMP IF SET JST ERROR COPY OUTEOB,A FETCH OUTPUT EOB FLAG JNE A,$+2 JUMP IF JET JST ERROR GPTS2E EQU $ COPY =0,A COPY A,OUTEOB CLEAR EOB COPY A,INEOB FLAGS * * HERE WE CHECK INPUT DATA * COPY GPOUT,A FETCH OUTPUT DATA SHIFT A,RO,8 RIGHT JUSTIFY LEFT BYTE COPY A,GPSAVE SAVE FOR FUTURE USE COPY GPOUT,A FETCH OUTPUT DATA AND  =:FF00,A ISOLATE LEFT BYTE OR GPSAVE,A FORM EXPECTED DATA COPY A,GPSAVE SAVE COPY GPIN,A FETCH INPUT DATA XOR GPSAVE,A TEST DATA JEQ A,GPTS2B COPY GPSAVE,X FETCH EXPECTED DATA COPY GPIN,A FETCH ACTUAL DATA JST ERROR GPTS2B EQU $ IMS GPPASS BUMP PASS COUNT JMP GPTS2C JUMP IF NOT FINISHED * * HERE WE EXIT TO NEXT TEST * JMP GPTS2 PATCHABLE LOOP ORG $-1 NOP  JMP GPTS3 WORD 0,0,0,0,0,0,0,0,0,0 LPOOL TITL ****** * FROM THIS POINT TO THE LABEL 'GPTS3' THE *  GP CONNECTED TO CHANNEL 6 (GP1) WILL BE SET * FOR DATA INPUT WITH A BYTE COUNT OF -2. * THE GP CONNECTED TO CHANNEL 7 (GP2) WILL BE * SET FOR DATA OUTPUT WITH A BYTE COUNT OF -1 * THE DATA WORD OUTPUT IS :5522, THE EXPECTED * INPUT WORD IS :5555. ERRORS WILL BE DISPLAYED * AS FOLLOWS: * * PURPOSE OF HALT * * BAD DATA - A=ACTUAL DATA * X=EXPECTED DATA ****** * * HERE WE INITIALIZE GP1 FOR INPUT AND *  GP2 FOR OUTPUT * GPTS2C EQU $ RBIT 8,S DISABLE INTERRUPTS COPY RESET,X FETCH RESET CODE JST G1OTXC ISSUE COMMAND TO GP1 JST G2OTXC ISSUE COMMAND TO GP2 COPY GP1IL,X FETCH GP1 INT. ADDR  COPY AIB,A OR GP1ADR,A COPY A,AIOCMD(X) COPY =GPIN,A INPUT BUFFER ADDRESS SHIFT A,  LO,1 CONVERT TO SUB =1,A BYTE ADDRESS -1 COPY A,AIOADR(X) COPY =-2,A COPY A,AIOCNT(X) COPY =ININT,A COPY A,EOBADR(X) COPY =1,A COPY A,INFLG COPY =TAG;INDATA,X JST G1OTXC ISSUE COMMAND TO GP1 COPY GP2IL,X FETCH GP2 INT. ADDRESS COPY AOB,A OR GP2ADR,A  COPY A,AIOCMD(X) COPY =GPOUT,A OUTPUT BUFFER ADDRESS SHIFT A,LO,1 CONVERT TO SUB =1,A  BYTE ADDRESS -1 COPY A,AIOADR(X) COPY =-1,A COPY A,AIOCNT(X) COPY =OUTINT,A EOB INT. ADDRESS COPY A,EOBADR(X) COPY =2,A COPY A,OUTFLG COPY =TAG;OUTDTA,X JST G2OTXC ISSUE COMMAND TO GP2 COPY =0,A COPY A,GPWAIT COPY A,OUTEOB COPY A,INEOB COPY =:5522,A  COPY A,GPOUT COPY =0,A COPY A,GPWAIT COPY A,GPIN COPY =BR;STRTGP,X JST G2OTXC COPY =BR;BEGN,X JST G1OTXC SBIT 8,S ENABLE INTERRUPTS GPTS2F EQU $ COPY INEOB,A FETCH INPUT EOB FLAG JEQ A,GPTS2G JUMP IF CLEAR COPY OUTEOB,A FETCH OUTPUT EOB FLAG JEQ A,GPTS2G JUMP IF CLEAR JMP GPTS2H GPTS2G EQU $ IMS GPWAIT JMP GPTS2F COPY INEOB,A FETCH INPUT EOB FLAG JNE A,$+2 JST ERROR COPY OUTEOB,A FETCH OUTPUT EOB FLAG JNE A,$+2 JST ERROR GPTS2H COPY =0,A COPY A,OUTEOB COPY A,INEOB COPY GPOUT,A FETCH OUTPUT DATA SHIFT A,RO,8 RIGHT JUSTIFY LEFT BYTE COPY A,GPSAVE COPY GPOUT,A FETCH OUTPUT DATA AND =:FF00,A ISOLATE LEGT BYTE OR GPSAVE,A COPY A,GPSAVE COPY GPIN,A XOR GPSAVE,A JEQ A,GPTS2I  COPY GPSAVE,X COPY GPIN,A JST ERROR GPTS2I EQU $ JMP GPTS2B * LPOOL TITL SIOGP TEST SEGMENT 3 (GPTS3) ****** * TEST 3 - GPTS3 * THIS TEST IS DESIGNED TO TEST THE INPUT GP * WILL NOT END OF BLOCK WHEN ITS BYTE COUNT * IS GREATER THAN THE OUTPUT BYTE COUNT.THE * GP CONNECTED TO CHANNEL 4 (GP1) IS SET FOR * COMMAND INPUT WITH A BYTE COUNT OF -4. THE * GP CONNECTED TO CHANNEL 7 (GP2) IS SET FOR * COMMAND OUTPUT WITH A BYTE COUNT OF -2. ****** GPTS3 EQU $ RBIT 8,S DISABLE INTERRUPTS COPY =1,A COPY A,INFLG SET INPUT FLAG FOR GP1 COPY GP1IL,X FETCH GP1 INT. ADDR. COPY AIB,A OR GP1ADR,A COPY  A,AIOCMD(X) COPY =-4,A COPY A,AIOCNT(X) COPY =ININT,A COPY A,EOBADR(X) COPY =GPIN,A SHIFT A,LO,1 CONVERT TO SUB =1,A BYTE ADDRESS -1 COPY A,AIOADR(X) COPY =2,A  COPY A,OUTFLG SET OUTPUT FLAG FOR GP2 COPY GP2IL,X FETCH GP2 INT. ADDR COPY GP2IL,X FETCH GP2 INT. ADDR COPY AOB,A OR GP2ADR,A COPY A,AIOCMD(X) COPY =-2,A COPY A,GPPASS SET PASS COUNT =2 COPY A,AIOCNT(X) COPY =OUTINT,A COPY A,EOBADR(X) COPY =GPOUT,A OUTPUT BUFFER ADDRESS   SHIFT A,LO,1 CONVERT TO SUB =1,A BYTE ADDRESS -1 COPY A,AIOADR(X) COPY =0,A COPY A,GPWAIT COPY A,OUTEOB COPY A,INEOB * * AT THIS POINT GP1 INT. VECTOR SET FOR * INPUT (4 BYTES) AND GP2 INT. VECTOR SET * FOR OUTPUT (2 BYTES) * COPY RESET,X RESET CODE JST G1OTXC ISSUE COMMAND TO GP1 JST G2OTXC ISSUE COMMAND TO GP2 COPY =TAG;INCMD,X FETCH COMMAND INPUT CODE JST G1OTXC ISSUE COMMAND TO GP1 COPY =TAG;OUTCMD,X FETCH COMMAND OUTPUT CODE JST G2OTXC ISSUE COMMAND TO GP2 * *  AT THIS POINT GP1 SET FOR COMMAND INPUT * AND GP2 SET FOR COMMAND OUTPUT * COPY =:1111,A FETCH DATA COPY  =GPOUT,X FETCH OUTPUT BUFFER ADDR. COPY A,0(X) ADD =1,X ADD =:1111,A COPY A,0(X)  ADD =1,X ADD =:1111,A COPY A,0(X) ADD =1,X ADD =:1111,A COPY A,0(X) * *  AT THIS POINT OUTPUT BUFFER SET WITH * :1111,:2222,:3333,:4444. * * HERE WE START GP1 * GPTS3A EQU $ COPY  =BR;BEGN,X FETCH START CODE JST G1OTXC ISSUE COMMAND TO GP1 * * HERE WE START GP2 * COPY =BR;STRTGP,X JST G2OTXC ISSUE COMMAND TO GP2 SBIT 8,S ENABLE INTERRUPTS GPTS3B COPY OUTEOB,A FETCH OUTPUT EOB FLAG JNE A,GPTS3C JUMP IF OUTPUT EOB IMS GPWAIT JMP GPTS3B JST ERROR * JMP GPTS3 PATCHABLE LOOP ORG $-1 NOP * GPTS3C COPY GPOUT,A XOR GPIN,A JEQ A,GPTS3D JST ERROR * * HERE WE EXIT TO NEXT TEST * GPT3C1 EQU $ JMP GPTS3 PATCHABLE LOOP ORG $-1 NOP JMP GPTS4 RES 10,0 10 N0P'S RES 10,0 10 N0P'S * LPOOL TITL ****** * HERE THE GP CONNECTED TO CHANNEL 6 (GP1) * IS SET FOR COMMAND OUTPUT WITH A BYTE COUNT * OF -2. THE GP CONNECTED TO CHANNEL 7 (GP2) * IS SET FOR COMMAND INPUT WITH A BYTE COUNT * OF -4. THE FOLLOWING S WILL * INDICATE AN ERROR: * * PURPOSE OF HALT * * :XXB4 OUTPUT GP DID NOT ISSUE * END OF BLOCK INTERRUPT * :XXBF INPUT GP BLOCK COUNT NOT * -2 AFTER OUTPUT EOB ****** * GPTS3D COPY =2,A COPY A,INFLG SET INPUT FLAG FOR GP2 RBIT 8,S DISABLE INTERRUPTS COPY RESET,X FETCH RESET CODE JST G1OTXC ISSUE COMMAND TO GP1 JST G2OTXC ISSUE COMMAND TO GP2 COPY GP1IL,X FETCH GP1 INT. ADDR. COPY AOB,A OR GP1ADR,A COPY A,AIOCMD(X) COPY =-2,A COPY A,AIOCNT(X) COPY =OUTINT,A COPY A,EOBADR(X) COPY =GPOUT,A SHIFT A,LO,1 CONVERT TO SUB =1,A BYTE ADDRESS -1 COPY A,AIOADR(X) COPY =1,A COPY A,OUTFLG SET OUTPUT FLAG FOR GP2 COPY  =TAG;OUTCMD,X COMMAND OUTPUT CODE JST G1OTXC ISSUE COMMAND TO GP1 COPY GP2IL,X COPY AIB,A  OR GP2ADR,A COPY A,AIOCMD(X) COPY =-4,A COPY A,AIOCNT(X) COPY =ININT,A COPY A, EOBADR(X) COPY =GPIN,A SHIFT A,LO,1 CONVERT TO SUB =1,A BYTE ADDRESS -1 COPY A,AIOADR(X) COPY =TAG;INCMD,X COMMAND/INPUT CODE JST G2OTXC ISSUE COMMAND TO GP2 COPY =0,A COPY  A,GPWAIT COPY A,OUTEOB COPY A,INEOB COPY A,GPIN CLEAR INPUT COPY A,GPIN+1 BUFFER  COPY =BR;STRTGP,X FETCH OUTPUT START CODE JST G1OTXC ISSUE COMMAND TO GP1 COPY =BR;BEGN,X FETCH INPUT START CODE JST G2OTXC ISSUE COMMAND TO GP2 SBIT 8,S ENABLE INTERRUPTS GPTS3E EQU $ COPY OUTEOB,A FETCH OUTPUT EOB FLAG JNE A,GPTS3F IMS GPWAIT JMP GPTS3E JST ERROR * JMP  GPTS3D PATCHABLE LOOP ORG $-1 NOP * GPTS3F EQU $ COPY GPOUT,A COMPARE BUFFERS EQUAL XOR GPIN,A JEQ A,GPTS4 YES JST ERROR JMP $-1 * LPOOL TITL SIOGP TEST SEGMENT 4 (GPTS4) ****** TEST 4 - GPTS4 * * THIS TEST PUTS BOTH GP'S IN THE * OUTPUT COMMAND MODE. THE BYTE *  COUNT FOR BOTH IS -2. WHEN THE * GP'S ARE STARTED, AN END-OF-BLOCK * INTERRUPT IS EXPECTED IMMEDIATELY. * A PROBABLE CAUSE FOR THIS ERROR: * INABILITY OF THE FIRM WARE TO DETECT * THAT THE POWER STATUS BIT WAS OFF * INDICATING NO POWER. ****** GPTS4 EQU $ RBIT 8,S DISABLE INTERRUPTS  COPY =1,A COPY A,OUTFLG SET OUTPUT FLAG FOR GP1 COPY GP1IL,X COPY AOB,A OR GP1ADR,A COPY A,AIOCMD(X) COPY =-2,A COPY A,AIOCNT(X) COPY =GPOUT,A SHIFT A,LO,1 CONVERT TO SUB =1,A BYTE ADDRESS -1 COPY A,AIOADR(X) COPY =OUTINT,A COPY A,EOBADR(X) COPY GP2IL,X COPY AOB,A OR GP2ADR,A COPY A,AIOCMD(X) COPY =-2,A COPY A,GPPASS  COPY A,AIOCNT(X) COPY =GPOUT,A SHIFT A,LO,1 CONVERT TO SUB =1,A BYTE ADDRESS -1 COPY A,AIOADR(X) COPY =OUTINT,A COPY A,EOBADR(X) COPY =0,A COPY A,GPWAIT COPY A,OUTEOB COPY A,INEOB * * AT THIS POINT BOTH GP1 AND GP2 INT. VECT. * SET FOR OUTPUT * COPY RESET,X RESET CODE JST G1OTXC ISSUE COMMAND TO GP1 JST G2OTXC ISSUE COMMAND TO GP2 COPY =TAG;OUTCMD,X COMMAND OUTPUT CODE JST G1OTXC ISSUE COMMAND TO GP1 JST G2OTXC ISSUE COMMAND TO GP2 * * HERE WE START GP1 * SBIT 8,S ENABLE INTERRUPTS COPY =BR;STRTGP,X FETCH START CODE JST G1OTXC ISSUE COMMAND TO GP1 GPTS4A COPY OUTEOB,A FETCH OUTPUT EOB FLAG JNE A,GPTS4B IMS GPWAIT JMP GPTS4A  JST ERROR * * HERE WE START GP2 FOR OUTPUT * GPTS4B JMP GPTS4D GPTS4C COPY =2,A COPY A,OUTFLG SET OUTPUT FLAG FOR GP2 RBIT 8,S DISABLE INTERRUPTS COPY =0,A COPY A,OUTEOB COPY =BR;STRTGP,X FETCH START CODE JST G2OTXC ISSUE COMMAND TO GP2 SBIT 8,S ENABLE INTERRUPTS JMP GPTS4A GPTS4 D IMS GPPASS JMP GPTS4C * * HERE WE EXIT TO NEXT TEST * JMP GPTS4 PATCHABLE LOOP ORG $-1 NOP JMP GPTS5 RES 10,0 10 NOP'S LPOOL TITL SIOGP TEST SEGMENT 5 (GPTS5) ****** TEST 5 - GPTS5 * * THIS TEST USE THE PROGRAMMED I/O * FEATURE TO DETERMINE IF THE BUSY *  STATUS BIT CAN BE SET. THE GP * CONNECTED TO CHANNEL 4 (GP1) IS * SET TO OUTPUT COMMAND. THE GP * CONNECTED TO CHANNEL 7 (GP2) IS * SET TO INPUT COMMAND. THE FOLLOWING * VALUE IN THE A AND X REGISTER PLUS * THE LOCATION OF THE HALT INDICATE * WHAT ERROR WAS ENCOUNTERED. * *  PURPOSE OF HALT * * BAD DATA - A=ACTUAL DATA * X=EXPECTED DATA * STATUS ERROR - A=ACTUAL DATA * X=EXPECTED DATA ****** GPTS5 EQU $ RBIT 8,S DISABLE INTERRUPTS COPY =1,A COPY A,OUTFLG SET OUTPUT FLAG = GP1 COPY =-2,A COPY A,GPPASS COPY =2,A COPY A,INFLG SET INPUT FLAG = GP2 * * HERE WE SET GP1 FOR COMMAND OUTPUT * AND GP2 FOR COMMAND INPUT. * COPY =TAG;OUTCMD,X FETCH OUTPUT CMD CODE JST G1OTXC ISSUE COMMAND TO GP1 COPY =TAG;INCMD,X FETCH COMMAND IN CODE JST G2OTXC ISSUE COMMAND TO GP2 * * HERE WE OUTPUT DATA VIA GP1 * COPY =:FFFF,A FETCH DATA JST OTADT1 OUTPUT DATA TO GP1 * * HERE WE INPUT DATA VIA GP2 * JST INADT2 GPTS5A EQU $ CLSN =:FF,A TEST FOR INPUT DATA JMP GPTS5B COPY =:FF,X FETCH EXPECTED DATA JST ERROR * * HERE WE JUMP TO FIRMWARE TO TEST FOR * BUSY CONDITIONED IN GP1 * GPTS5B EQU $ JST INAST1 FETCH GP1 STATUS XOR =:00FF,A FORM COMPLEMENT OF STATUS COPY A,GPSTS1 SAVE STATUS AND =4,A ISOLATE BUSY BIT JNE A,GPTS5E JUMP IF BUSY BIT ON COPY GPSTS1,A AND =1,A JNE A,GPTS5E JUMP IF POWER BIT ON COPY GPSTS1,A FETCH GP1 STATUS COPY =4,X FETCH EXPECTED STATUS JST ERROR * JMP GPTS5 PATCHABLE LOOP ORG $-1 NOP * * * * HERE WE JUMP TO FIRMWARE TO TEST FOR * BUSY CONDITION IN GP2 * RES 10,0 GPTS5E EQU $ JST INAST2 FETCH GP2 STATUS XOR =:00FF,A FORM COMPLEMENT OS STATUS COPY A,GPSTS2 SAVE GP2 STATUS AND =4,A ISOLATE BUSY BIT JNE A,GPTS5C JUMP IF NOT BUSY COPY GPSTS2,A FETCH GP2 STATUS AND =1,A * JNE A,GPTS5C JUMP IF POWER BIT ON ORG $-1 PATCHABLE CHANGE HERE JEQ A,GPTS5C JMP IF POWER BIT ON * COPY GPSTS2,A FETCH GP2 STATUS COPY =4,X FETCH EXPECTED STATUS JST ERROR JMP GPTS5 PATCHABLE LOOP ORG $-1 NOP GPTS5C IMS  GPPASS JMP GPTS5D * * HERE WE EXIT TO NEXT TEST * JMP GPTS5 PATCHABLE LOOP ORG $-1  NOP JMP GPTS6 RES 10,0 * * HERE WE SET GP1 FOR INPUT AND GP2 FOR OUTPUT * GPTS5D COPY =TAG;INCMD, X FETCH COMMAND IN CODE JST G1OTXC ISSUE COMMAND TO GP1 COPY =TAG;OUTCMD,X FETCH COMMAND OUT CODE JST G2OTXC ISSUE COMMAND TO GP2 COPY =:FFFF,A JST OTADT2 OUTPUT DATA VIA GP2 JST INADT1 INPUT DATA VIA GP1 JMP GPTS5A JST ERROR SHOULD NEVER GET HERE..... * LPOOL TITL SIOGP TEST 6 (SUBROUTINES) * * GPSETV IS A SUBR WHICH SETUP INT. LOCATIONS * GPSETV ENT RBIT 8,S COPY GP1IL,X COPY AOB,A OR GP1ADR,A COPY A,AIOCMD(X) COPY =VBYTC1,A COPY A,AIOCNT(X) COPY =T2EOBE,A COPY A,EOBADR(X) COPY =GPOUT,A SHIFT A,LO,1 SUB =1,A COPY A,AIOADR(X) COPY GP2IL,X COPY AIB,A OR GP2ADR,A COPY A,AIOCMD(X) COPY =VBYTC1,A COPY A,AIOCNT(X) COPY =T2EOBE,A COPY A,EOBADR(X) COPY =GPIN,A SHIFT A,LO,1 SUB =1,A COPY A,AIOADR(X) COPY =-2,A COPY A,T2CNTR JMP *GPSETV LPOOL * * BIFDIE IS A ROUTINE WHICH INITIALIZES BUFFERS * BUFDIE ENT COPY =VBYTCT,X INITIALIZE FOR INPUT BUFFER COPY X,T1CNTR COPY =GPIN,X  COPY =:5050,A PUT :5050 IN DXTVAL COPY A,0(X) INPUT BUFFER ADD =1,X BUMP INDEX IMS T1CNTR FINISHED? JMP DXTVAL NO COPY =VBYTCT,X YES COPY X,T1CNTR INITIALIZE STUFF COPY =GPOUT,X FOR OUT BUFFER COPY =:A0A0,A PUT :A0A0 IN DXTVL1 COPY  A,0(X) OUTPUT BUFFER ADD =1,X BUMP INDEX IMS T1CNTR FINISCHER? JMP  DXTVL1 NO JMP *BUFDIE YES -RETURN LPOOL * * BUFINT IS A ROUTINE WHICH INITIALIZES BUFFERS * BUFINT ENT COPY =VBYTCT,X COPY X,T1CNTR COPY =GPIN,X COPY =:0A0A,A NXTVAL COPY A,0(X)  ADD =1,X IMS T1CNTR JMP NXTVAL COPY =VBYTCT,X COPY X,T1CNTR COPY =GPOUT,X  COPY =:0505,A NXTVL1 COPY A,0(X) ADD =1,X IMS T1CNTR JMP NXTVL1 JMP *BUFINT  LPOOL * * BUFCHK IS A ROUTINE WHICH CHECKS INPUT AND OUTPUTS BUFFERS * BUFCHK ENT * NOW COMPARE ACTUAL DATA TRANSFER FOR RIGHT VALUE * COPY =GPIN,X COPY X,GPINN COPY =GPOUT,X COPY X,GPOUT1 COPY =VBYTCT,X  COPY X,T1CNTR NXTVL2 COPY GPINN,X COPY 0(X),A COPY A,Y PRESENT INPUT BUFF VALUE COPY A,INVAL COPY GPOUT1,X COPY 0(X),A COPY A,Q PRESENT OUTPUT BUFF VALUE XOR INVAL,A JEQ A,AGAIN COPY T1CNTR,X WHERE IN BUFFER U AT NEG X MAKE VALUE POSITIVE JST ERROR DATA DIDNT TRANSFER CORRECTLY AGAIN IMS GPINN INCR. INPUT BUFF ADDRESS NOP IMS GPOUT1 INCR. OUTPUT BUFF ADDRESSS NOP IMS T1CNTR INCR. BYTE COUNT VALUE JMP NXTVL2 LOOP TILL BUFFERS EMPTY JMP *BUFCHK FINISHED RETURN TO CALLER HLT SOFTWARE BUG IF HERE * * TIMER ROUTINE * TIMOUT ENT COPY =DELAY1,A COPY A,WAIT1  COPY =DELAY2,A COPY A,WAIT2 STS202 SBIT 8,S SIS203 IMS WAIT2 JMP STS202 RBIT 1,S IMS  WAIT1 JMP STS202 JMP *TIMOUT * * END OF BLOCK ROUTINE FOR AIB/AOB * T2EOBE ENT IMS T2CNTR JMP *T2EOBE JMP *TS205 TS205 WORD $-$ * * ERROR ROUTINES * ERROR ENT COPY A,ASAVE COPY ERROR,A GET THE -P- REGISTER SUB =1,A COPP A,CDRHLD SET FOR CDR DISPLAY HLT COPY ASAVE,A RESTORE -A- REGISTER JMP *ERROR * T2CNTR RES 1,0 GPINN RES 1,0 GPOUT1 RES 1,0 INVAL RES 1,0 T1CNTR RES 1,0 ASAVE RES 1,0 WAIT1 RES 1,0 WAIT2 RES 1,0 C8MIC WORD C8MICD C7MIC WORD C7MICD PARS RES 1,0 GPSRI RES 1,0 GPOUI RES 1,0 MEMVAL RES 1,0 ILMEMT RES 1,0 ILMM RES 1,0 LENGTH RES 1,0 SRFLG RES 1,0 LPINDC RES 1,0 LPOOL * TITL SIOGP TEST SEGMENT 6 * ****** TEST 6 - GPTS6 * * THIS SEGMENT CONSISTS OF STANDARD * I/O 410T SUBTESTS FOR PICOS. * * DURING THE DATA EXERCISER TEST 256 WORDS OF DATA *  ARE WRAPPED AROUND UNDER INTERRUPT CONTROL. DATA * TRANSFERS (AUTO I/O) FOR A 410T ARE INITIATED *  FROM ONE CHANNEL TO THE OTHER CHANNEL. UPON THE * RECEIPT OF AN END-OF-BLOCK INTERRUPT, EACH BUFFER *  BYTE OF THE OUTPUT CHANNEL IS COMPARED WITH THE * CORRESPONDING BYTE OF THE BUFFER INPUT CHANNEL. * *  DURING THE PARITY STANDARDIZATION TEST AN EIGHT- * BIT CHARACTER WITH 0 IN MSB IS OUTPUT WITH PARITY *  STANDARIZATION TRUE. THE MSB OF THE CHARACTER * SHOULD BE 1 AFTER DATA TRANSFER. * ****** * GPTS6 EQU $ COPY =PARONI,X IF PARITY TEST. RETN PA STAND COMM WORD COPY X,PARS COPY GPINCM,X RETURN PICO INPUT WORD COMMAND COPY X,GPSRI COPY GPOUCM,X RETURN PICO OUTPUT WORD COMMAND COPY X,GPOUI * * DATA TRANSFER BETWEEN CHANNEL PAIR * GPSRTT EQU $ COMES HERE FOR BOTH SER. + PARR. TESTING JST GPSETV COPY =TS206,A SET EOB SERVICE ADDRESS COPY A,TS205 JST BUFINT COPY RESET,X CODE :100 TO BOTH PICOS NOW RESETTED JST G1OTXC OUTPUT PICO 4 PAR 5 SER JST G2OTXC INPUT PICO 7 PAR 6 SER COPY OUTMOD,X MODE SET (:400 PAR :402 SER) JST G1OTXC SEND IT TO OUTPUT PICO COPY INMOD,X MODE SET (:408 PAR :400 SER) JST G2OTXC SEND IT TO INPUT PICO COPY =20,A JST WAIT SET INTS ON AGAIN RBIT 8,S COPY GPSRI,X (:260 PAR :210 SER) JST G2OTXC START INPUT PICO COPY GPOUI,X (:250 PAR :612 SER) JST G1OTXC START OUTPUT PICO JST TIMOUT SET INTS ON AGAIN * * JMP GPSRTT LOOP ON TRANSMIT FOR SCOPING ORG $-1 PATCH NEXT CODE WITH LAST TO LOOP * * TS206 JST BUFCHK NOW DO BUFFER MEDIA CHECKING * * THIS CODE IS FOR 7 BIT TRANSFER ONLY * COPY OPDASH,A DIEBOLD (7BIT)? CLSN A,=D99 JMP $+2 JMP PARTY NO JST GPSETV COPY =TS208,A SET EOB SERVICE ADDR COPY A,TS205 JST BUFDIE FILL BUFFERS A0A0,5050 COPY RESET,X RESET BOTH PICOS   JST G1OTXC JST G2OTXC COPY =:400,X REQUEST TO SEND JST G1OTXC COPY =20,A JST WAIT RBIT 8,S COPY GPSRI,X JST G2OTXC START INPUT COPY GPOUI,X JST G1OTXC START OUTPUT JST TIMOUT TS208 EQU $  COPY =VBYTCT,X CHECK RESULTS COPY X,T1CNTR COPY =GPIN,X DBACK COPY 0(X),A COPY A,INVAL  COPY =:2020,A ONLY 7 BIT TRANSFER XOR INVAL,A JEQ A,$+2 YES JST ERROR  NO-ERROR ADD =1,X IMS T1CNTR FINISHED? JMP DBACK NO * * IN THE FOLLOWING PORTION OF THE PROGRAM * PARITY STANDARDIZATION IS CHECKED * PARTY COPY RESET,X =:100 RESET COMMAND JST G1OTXC RESET CHANNEL 4 OR 5 JST G2OTXC RESET CHANNEL 7 OR 6 JST GPSETV COPY =TS207,A GET ADDRESS OF THE EOB ROUTINE COPY A,TS205 JST BUFINT INITIALIZE THE BUFFERS COPY OUTMOD,X OUT MODE SET (:400 PAR :402 SER) JST G1OTXC OUTPUT PICO 4 PAR 5 SER COPY INMOD,X SET INPUT MODE (:408 PAR :400 SER) JST G2OTXC INPUT PICO 7 PAR 6 SER COPY =20,A JST WAIT TIME A WAIT AND ALSO ENABLE INTERRUPTS RBIT 8,S TURN OF INTERRUPTS COPY PARS,X (:1260 PAR :1210 SER) JST G2OTXC START THE INPUTING (7 PAR 6 SER) COPY GPOUI,X GET THE OUTPUT COMMAND WORD (:250 PAR :612 SER) JST G1OTXC START THE OUTPUT (4 PAR 5 SER) JST TIMOUT TS207 EQU $ COPY =VBYTCT,X COPY X,T1CNTR COPY =GPIN,X PBACK COPY 0(X),A COPY A,INVAL COPY =:0505,A XOR INVAL,A JEQ A,PBACK1 JST ERROR ERROR.. PBACK1 ADD =1,X IMS T1CNTR JMP PBACK JMP SPCHDT NO LPOOL * TITL SPECIAL CHARACTER DETECT * SPCHDT EQU $ COPY SRFLG,A SERIAL TEST? JEQ A,$+4 NO JGT A,$+2 YES JST ERROR SHOULD NEVER GET HERE JMP TEST1X COPY OPDASH,A NEW IOD? SHIFT A,RO,5 JT OV,SPCHD1 YES JMP C8MICD+1 NO SPCHD1 JST GPSETV COPY =TS209,A COPY A,TS205  COPY GP1IL,X COPY =:FFF9,A COPY A,AIOCNT(X) COPY GP2IL,X COPY A,AIOCNT(X) JST  BUFINT COPY GPOUT,X COPY =:AA07,A COPY A,3(X) COPY =SPCHS7,X JST G2OTXC COPY =:2E68,X JST G2OTXC COPY GPOUI,X JST G1OTXC JST TIMOUT JMP TS209 * LPOOL * TS209 EQU $ COPY GP1IL,X COPY AIOCNT(X),A CLSN =0,A JMP $+2 JST ERROR  COPY GP2IL,X CLSN =0,A JMP MICROD JST ERROR * MICROD EQU $ COPY JST,A COPY  GP1IL,X COPY A,4(X) COPY C7MIC,A COPY A,EOBADR(X) COPY =:4000,X JST G1OTXC  SBIT 8,S NOP NOP NOP JMP MICROD ORG $-1 JST ERROR * C7MICD EQU $ COPY JST,A COPY GP2IL,X COPY A,4(X) COPY C8MIC,A COPY A,EOBADR(X) COPY =:4000,X   JST G2OTXC SBIT 8,S NOP NOP JMP C7MICD ORG $-1 JST ERROR JMP $-1 * C8MICD ENT JMP TEST2X * TITRY RES 1,0 TITRYA RES 1,0 TITL MODEM CONTROL SIGNALS * * THIS FIRST TEST (TEST1X) TESTS THE MODEM * CONTROL SIGNALS GENERATED AND RECEIVED * BY THE PICO'S * TEST1X COPY RESET,X RESET CODE JST G1OTXC JST G2OTXC COPY =-3,A COPY A,TITRY RETRY COUNTER TEST17 COPY RESET,X JST G1OTXC JST G2OTXC JST INAST2 COPY A,GPSTS2 SAVE STATUS CLSN =:13,A DSR AND BUFFER EMPTY JMP TEST10 OKAY....CONTINUE IMS TITRY HAS IT BEEN 3 TIMES JMP TEST17 NO JST ERROR TEST10 EQU $ COPY =-3,A COPY A,TITRY RETRY COUNTER TEST13 COPY RESET,X CODE JST G1OTXC  COPY =:401,X DATA TERN NOT READY JST G1OTXC JST INAST2 COPY A,GPSTS2 SAVE STATUS CLSN =:17,A ONLY BUFR EMPTY SET JMP TEST12 YES- IT WAS IMS TITRY NO- 3 TIMES JMP TEST13 NO JST ERROR TEST12 EQU $ COPY =-3,A COPY A,TITRYA COPY A,TITRY RETRY COUNTER TEST14 COPY RESET,X RESET CODE JST G1OTXC COPY =:402,X REQUEST AND DATA READY JST G1OTXC COPY =10,A JST WAIT SHORT DELDAY JST INAST1 COPY A,GPSTS1 SAVE STATUS CLSN =:11,A IS IT OK? JMP TEST15 YES IMS TITRYA 3 TIMES JMP TEST14 NO-TRY AGAIN JST ERROR TEST15 EQU $ JST INAST2 COPY A,GPSTS2 CLSN =:12,A IS IT OK? JMP TEST2X YES-GO AWAY  IMS TITRY 3 TIMES HERE JMP TEST16 NO JST ERROR TEST16 EQU $ COPY =-3,A RESET PICO 1 COPY A,TITRYA RETRY COUNTER JMP TEST14 LPOOL * TEST2X COPY LPINDC,A GET LOOP INDICATOR ADD =1,A COPY A,LPINDC BUMP BY 1 COPP A,CDRHLD SEND TO HOST JMP SIOSTRT1 * WAIT ENT NEG A,A  COPY A,WAIT1 WLOOP SBIT 8,S IMS WAIT1 JMP WLOOP JMP *WAIT * LPOOL * * ADDED 410 I/O CONTROL TEST LOOP * USED WITH MICRO TESTER AND SCOPE * CTLTST EQU $ COPY DAT700,Q CTL1 COPY =:06,X CTL2 XNX X IN :F9,A (STAT) 1A7 MIC CODE OF 410 XNX X IN :F8,A (DAIN) 1A5 MIC CODE OF 410 XNX X OUT Q,:F8 (OTPT) 19D MIC CODE OF 410 XNX X OUT Q,:F9 (RST,CMD,SECT) 133 MIC CODE OF 410 SUB =2,X JLT X,CTL1 JMP CTL2 DAT700 WORD :700 * * MOVE UTILITY TO LOAD PUBLIC MEM TO 410T * A REGISTER = STARTING ADDRESS OF PUBLIC MEM. * Q REGISTER = ENDING ADDRESS OF PUBLIC MEM. * MOVE EQU $ COPY A,A1 GET FIRST ADDRESS TO MOVE COPY Q,Q1 SAVE THE Q REG. COPY A,STADR SAVE STARTING ADDRESS SUB A,Q GET THE NUMBER OF WORDS TO MOVE NEG Q,Q COPY Q,C1 # OF WORDS TO TRANSFER * NOW RESET SLAVE * COPY DEVICEA,X SHIFT X,LO,4 COPY STHOST,Q COPY Q,S COPY =0,A COPY A,CDRHLD UIS IMS SYSFLAG COPY =1,Q XNX X SELP Q,0 SET PROGRAMMED RESET ON SLAVE IJNE Q,$ COPY =1,Q XNX X SELP Q,3 * NOW DO TRANSFER * COPY IMSDRI,A 'INPUT TO MEMORY FROM CONTROL REGISTER COPY A,*SCIR STORE IT A T MAILBOX LOCATION MOV1 COPY A1,A GET CURRENT MEMORY ADDRESS COPY A,*SCMAR STORE IT IN CONTROL REGISTER COPY A1,Y COPY 0(Y),A GET CURRENT MEM CONTENTS COPY A,*SCDR STORE IT IN CONTROL REG. JST DOIT MAKE SLAVE DO TRANSFER HLT STOPS HERE IF ERROR  AUTOLOAD AGAIN & RETRY IMS A1 INC. DMA ADDRESS IMS C1 INC. DMA WORD COUNT JMP MOV1 LOOP TILL ALL DONE * NOW START THE SLAVE DOING IT * COPY =0,A SET SYSTEM FLAG COPY A,SYSFLAG FOR HOST AGAIN COPY STADR,A FIND STARTING ADDRESS COPY A,*SCDR STORE IT IN CONTROL REG COPY ISDRPI,A 'INPUT FOR SLAVE C D R TO P REG COPY A,*SCIR STORE IT CONTROL REG JST DOIT MAKE SLAVE DOIT HLT SLAVE TIMED OUT * COPY STARTI,A 'START COMMAND' COPY A,*SCIR STORE IT IN CONTROL REG JST DOIT MAKE SLAVE START HLT SLAVE TIME OUT * JMP DEBUG4 RETURN TO DEBUG STADR WORD 0 C1 WORD 0 A1 WORD 0 Q1 WORD 0 TEMP CELL FOR THE Q REG. * * TITL SERIAL BACK TO BACK PICO TEST (SIOSP) * * FOR SERIAL 410T PICO TEST. JUMP TO SIOSP * WITH A REGISTER = 410T DEVICE ADDRESS :000X * THEN IT IS EXECUTED AS A PART OF G P PROCESSOR * TEST AREA OF PROGRAM. CHANNELS 5 AND 6 ARE USED. * ABS SSTART SIOSP EQU $ SERIAL TESTING PARAMETERS SETUP HERE. COPY A,DEVICEA FIND NEW DEVICE ADDRESS COPY  =0,A COPY A,LPINDC CLEAR LOOP COUNTERS COPY =1,A COPY A,SRFLG MARK IT SERIAL PICOS COPY =SINN,A PICO COMMAND WORD COPY A,GPSRI :210 TO INPUT PICO COPY A,GPINCM COPY =SOUT,A PICO COMMAND WORD COPY A,GPOUI :612 TO OUTPUT PICO COPY A,GPOUCM COPY =SERIN,A :400 TO INPUT MODE PICO COPY A,INMOD PICO MODE IN BIT COPY =SEROUT,A :402 TO OUTPUT MODE PICO COPY A,OUTMOD PICO MODE OUT BIT COPY =:1210,A IF PARITY TESTING USE THIS COPY A,PARS COPY =0,A SETUP CHANNELS 5,6 FOR SERIAL TEST COPY =CH6DA,A CHANNEL 6 NOW IS GP2 PICO NAME COPY =GP2ADR,X COPY A,0(X) COPY =CH6IL,A COPY  =GP2IL,X COPY A,0(X) COPY =CH5DA,A CHANNEL 5 NOW IS GP1 PICO NAME COPY =GP1ADR,X COPY A,0(X) COPY =CH5IL,A COPY =GP1IL,X COPY A,0(X) JMP INIT1 JST ERROR SHOULD NEVER GET HERE LPOOL * * BUFFERS FOR GENERAL PICO TESTING * GPOUT RES :100,0 GPIN RES :100,0 RES $;:FF-$&:FF+1,0 OVER EQU $ END OF MODULE ADDRESS END  TITL NM4 4/10T SIO END 84-93896-11A0 * * * * NM4 4/10T SIO END * * * * 84-93896-11-A0 * * * *  COPYRIGHT 1982 COMPUTER AUTOMATION INC. * TITL EXTERNAL "LINKS" NAM SIOEND REL 0 TITL HERE IS THE END!! * * END OF DIAGNOSTIC LABEL * SIOEND RES 1,0 END IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII TITL SERIAL PICO TECH TEST ************************************** * * HERE IS A SMALL TEST FOR THE SERIAL * PICO WHICH WILL SEND 2 BYTES OF DATA * FOR CH 5 TO CH6 OF THE DIO. THIS TEST * CAN BE ALTERED TO TRANSMIT MORE THAN * 2 BYTES BY CHANGING " BYTECNT" TO THE NUMBER * OF BYTE YOU WANT SENT. THE MAX. IS :100, * AND ALSO NOTE THAT THE TIME OUT SHOULD * BE INCREASED TO GIVE ENOUGH TIME TO COMPLETE * THE OPERATION. THIS CAN BE DONE BY CHANGING * "TIME" TO REFELECT THE CHANGE IN THE DATA * TRANSFER TIMING. * * TO USE THIS TEST IT MUST BE MOVED INTO THE * SLAVES MEMORY BY USING THE "MOVE" ROUTINE. * THE MOVE ROUTINE WILL ALSO START THE EXECUTION * OF WHAT EVER IS MOVED INTO THE SLAVES MEMORY. * TO GET THE BEGINING AND ENDING ADDRESS OF THIS * TEST REFER TO THE LINK MAP. * ************************************* * NAM SERSTART NAM SEREND REL 0 * SERSTART EQU $ COPY =:00,A COPY BYTECNT,Q NEG Q COPY =INBUFF,X COPY A,0(X) CLEAR THE INPUT BUFFER ADD =1,X IJNE Q,$-2 COPY AOB,A AOB INSTRUCTION COPY A,:E8 SET CH 5 TO OUTPUT COPY AIB,A AIB INSTRUCTION COPY A,:F0 SET CH 6 TO INPUT COPY JSTINST,A LOAD THE JST *$+1 INSTRUCTION COPY A,:E8+4 SET CH 5 EOB INSTRUCTION TO A JST *$+1 COPY A,:F0+4 SET CH 6 EOB INSTRUCTION TO A JST *$+1 COPY =INTERR,A ADDRESS OF THE EOB SERVICE ROUTINE COPY A,:E8+5 SET CH 5 EOB SERVICE ROUTINE ADDRESS COPY A,:F0+5 SET CH 6 EOB SERVICE ROUTINE ADDRESS COPY =:00,A COPY =:100,A RESET COMMAND WORD OUT A,:FB RESET CH 5 (OUT) OUT A,:FD RESET CH 6 (IN) COPY O:BUFADD,A OUTPUT BUFFER ADDRESS COPY A,:E8+2 CHANNEL 5 BYTE BUFFER POINTER COPY I:BUFADD,A INPUT BUFFER ADDRESS COPY A,:F0+2 CHANNEL 6 BYTE BUFFER POINTER COPY BYTECNT,A LOAD THE BYTE COUNT NEG A CONVERT TO NEGITIVE BYTE COUNT COPY A,:E8+1 CH 5 AOB BYTE COUNT COPY A,:F0+1 CH 6 AIB BYTE COUNT COPY =-2,A EOB COUNT COPY A,EOBCNT SET THE EOB COUNT TO MINUS 2 RBIT 8,S TURN OFF INTERRUPTS COPY =:402,A SER. OUT MODE COMMAND WORD OUT A,:FB SET CH 5 FOR OUTPUT COPY =:400,A SER. INPUT MODE COMMAND WORD OUT A,:FD SET CH 6 FOR INPUT COPY =:FFD0,A IJNE A,$ WAIT FOR WHILE COPY =:210,A SER. IN MODE & BRANCH COMMAND WORD OUT A,:FD START CH 6 INPUTTING COPY =:612,A SER. START OUT COMMAND WORD OUT A,:FB START CH 5 OUTPUTTING COPY TIME,A SBIT 8,S ENABLE INTERRUPTS IJNE A,$-1 WAIT HERE FOR A WHILE JMP SERSTART DO IT AGAIN INTERR ENT IMS EOBCNT INCREMENT THE EOB COUNT JMP *INTERR RETURN TO MAIN IF NOT THE SECOUND EOB COPY INBUFF,A GET THE FIRST WORD OF RECEIVED DATA COPP A,CDRHLD OUTPUT IT TO THE CONSOLE JMP SERSTART AOK RETURN TO BEGINING * LPOOL * * * CDRHLD EQU :00 AIB AIB :FC AUTO INPUT INSTRUCTION AOB AOB :FA AUTO OUTPUT INSTRUCTION JSTINST JST *$+1 O:BUFADD WORD OUTBUFF%1-1 BYTE ADDRES -1 OF THE OUTPUT BUFFER I:BUFADD WORD INBUFF%1-1 BYTE ADDRESS -1 OF THE INPUT BUFFER BYTECNT WORD 2 NUMBER OF BYTES TO BE SENT EOBCNT WORD 0 EOB COUNT TIME WORD :FF00 TIME DELAY OUTBUFF RES :100,:0A0A OUTPUT BUFFER INBUFF RES :100,:00 INPUT BUFFER SEREND RES 1,0 END IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  TITL PARALLEL TECH TEST ************************************** * * HERE IS A SMALL TEST FOR THE PARALLEL * PICO WHICH WILL SEND 2 BYTES OF DATA * FOR CH 4 TO CH7 OF THE DIO. THIS TEST * CAN BE ALTERED TO TRANSMIT MORE THAN * 2 BYTES BY CHANGING "BYTECNT" TO THE NUMBER * OF BYTE YOU WANT SENT. THE MAX. IS :100, * AND ALSO NOTE THAT THE TIME OUT SHOULD * BE INCREASED TO GIVE ENOUGH TIME TO COMPLETE * THE OPERATION. THIS CAN BE DONE BY CHANGING * "TIME" TO REFELECT THE CHANGE IN THE DATA * TRANSFER TIMING. * ************************************* * NAM PARSTART NAM PAREND REL 0 PARSTART EQU $ COPY =:00,A  COPP A,CDRHLD CLEAR THE CDR DISPLAY COPY AOB,A AOB INSTRUCTION COPY A,:E0 SET CH 4 TO OUTPUT COPY AIB,A AIB INSTRUCTION COPY A,:F8 SET CH 7 TO INPUT COPY JSTINST,A LOAD THE JST *$+1 INSTRUCTION COPY A,:E0+4 SET CH 4 EOB INSTRUCTION TO A JST *$+1 COPY A,:F8+4 SET CH 7 EOB INSTRUCTION TO A JST *$+1 COPY =INTERR,A ADDRESS OF THE EOB SERVICE ROUTINE  COPY A,:E0+5 SET CH 4 EOB SERVICE ROUTINE ADDRESS COPY A,:F8+5 SET CH 7 EOB SERVICE ROUTINE ADDRESS COPY =:00,A COPY =:100,A RESET COMMAND WORD OUT A,:F9 RESET CH 4 (OUT) OUT A,:FF RESET CH 7 (IN) COPY O:BUFADD,A OUTPUT BUFFER ADDRESS COPY A,:E2 CHANNEL 4 BYTE BUFFER POINTER COPY I:BUFADD,A INPUT BUFFER ADDRESS COPY A,:FA CHANNEL 7 BYTE BUFFER POINTER COPY BYTECNT,A LOAD THE BYTE COUNT NEG A CONVERT TO NEGITIVE BYTE COUNT COPY A,:E1 CH 4 AOB BYTE COUNT COPY A,:F9 CH 7 AIB BYTE COUNT COPY =-2,A EOB COUNT COPY A,EOBCNT SET THE EOB COUNT TO MINUS 2 COPY =:400,A PAR. OUT MODE COMMAND WORD OUT A,:F9 SET CH 4 FOR OUTPUT COPY =:408,A PAR. IN MODE COMMAND WORD OUT A,:FF SET CH 7 FOR INPUT COPY =:260,A PAR. START IN COMMAND WORD OUT A,:FF START CH 7 INPUTTING COPY =:250,A PAR. START OUT COMMAND WORD OUT A,:F9 START CH 4 OUTPUTTING COPY TIME,A SBIT 8,S ENABLE INTERRUPTS IJNE A,$-1 WAIT HERE FOR A WHILE JMP PARSTART DO IT AGAIN INTERR ENT IMS EOBCNT INCREMENT THE EOB COUNT JMP *INTERR RETURN TO MAIN IF NOT THE SECOUND EOB COPY INBUFF,A GET WHAT WAS SENT COPP A,CDRHLD SEND IT TO THE CONSOLE JMP PARSTART AOK RETURN TO BEGINING * LPOOL * * * CDRHLD EQU :00 AIB AIB :FE AOB AOB :F8 JSTINST JST *$+1 O:BUFADD WORD OUTBUFF%1-1 I:BUFADD WORD INBUFF%1-1 BYTECNT  WORD 2 EOBCNT WORD 0 TIME WORD :FF00 OUTBUFF RES :100,:0A0A INBUFF RES :100,:00 PAREND RES 1,0 END B B B B B B B BDAS LO DEL CNC.LST CREATE CNC.LST AS LO=UF/CNC.LST CNC SBACK4T.ASM DAS LO MACRO SBACK4T(D=M410T,L=) MACRO SIOEND(ERR) MACRO TECHTEST=TSTPARALLEL(D=M410T,L=)+TSTSERIAL(D=M410T) DE SBACK4T.MAP CRE SBACK4T.MAP 1 1 AS LO=SBACK4T.MAP LINK SBACK4T+/SYS/LIBRARIES/DEBUGS(UL,AB=1000,EX=1000)+SIOEND+ TECHTEST(UL) type cont to get a listing and cnc pause DAS LO CO LP=SBACK4T.LST(FL)+TECHTEST.LST(FL)+SBACK4T.MAP(FL) send 0 sback4t jcl all done                                   JMOVE CTLTST GPTS6 JGPTS5 GPTS4 GPTS3 JGPTS2 GPTS1 SIOSP JSLCTRL SLINSP SIOGP O0SEGMENTBLANK oKSIOEND DEBUG4 im MACRO (F360) @iP`PPt  eE"    oBI# D-                    -   0,  1Bw-tsrL:7 O@CFI =?                g   8.1 0@  ,I# DTI# D     ޠޞw ,   IT    ŀ}  I# D# u# pong  IB6gA   `n9xIc Dc T/ 6vBD?6IAIB` /6*6+ WA  i f~# @g`n9 xIc Dc T/6v BD?6IAIBY/6* 6+8 (@ `0pP 'ނ~{g  6B`n9xIc D c Ti/6v6 Ic DD a0   ! ++ڟ x  "} 7| } }  "} 7| }  } 0& Ţ[ ](ce)%0 g 0' þF (P)$0kg  ń  '!"  & #$%   # %C$A#y% $ $%C"4 I-0 -P`xP  q  j &i!_  X #$%  'TTSJ # H%C$A#y%B $? %$63=,#jg  %$  '!"  & #$%Y YVU #M L%C$A#y% $ $%y C"-T   P`x- -3w  s  &c!a   'R  #$%P #OIH %C$A#y%=$ : $%7y44 2C.*0I#U"g  & q  '!!" b  #$% YWVS+ ++FC$#|?`:   -`Px - &   j  'c! ^ T #$ %TPM$#|HKX CFFC~#0 .g  ' 1  !"$ #$%[Y XVT$#|  ' $Fq"uE Ig  '" &Ŀ,ÿ) )(р(΀()b )ǀ)D))L"I  Dx  *&#-    !   c- -s (ޢx +ٞ|(֢o+ў| nPP (ɢc+ |(Z+޼|n   QN(` @C !ޡޠޠ nf  ޙ} ޕzt ދ} }  xF:g ަut sԂ؆[ Р͠ cǢb;l * †C ML%(@ <:A-+7w #  --(! A+w#8h # - CA Ȁ*I6Ag  !b\ZW x%w-.hg p! l  ΄Ϳ:t9 `!Ą/uDU~  ##y)  qwAm)  dv4a_  ( Ut$)  MJi@&   ߄}yg Œ)# # # B# B*3ug Ư@@AƩ.10@   ,I# DTI# D  ▀@ ޑޏv ,   g     ) )! ) ) It xIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJSIOEND O0SEGMENTBLANK oim MACRO (F360) @gIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJPAREND PARSTARTO0SEGMENTBLANK oNim MACRO (F360) @g Ç   Z ޣ}T& `PM Ee  gJSEREND SERSTARTO0SEGMENTBLANK oVim MACRO (F360) @g @A+TƇÇ    R ޣ}LU.  Ee  gIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII TITL NM4 4/10T MACROS FILE 84-93898-10A0 TITL TITL PAGE * * * * NM4 4/10T MACROS FILE * * * * 84-93898-10-A0 * * * * COPYRIGHT 1982 COMPUTER AUTOMATION INC. * TITL "COPY" MACRO ****************************** * * COPY - LOAD/STORE REGISTERS * * CALLING SEQUENCE: * * STANDARD NM4 "COPY' INSTRUCTIONS * COPY 4REG,[*]ABS(K) * COPY [*]ABS(K),4REG * ****************************** * COPY MACRO IFF #(?)=2 NOTE E,' WRONG NUMBER OF ARGUMENTS' ENDC IFT #(?)=2 TEMP: SYMATT #(2) TEMP: SET TEMP:**:2000 IFT TEMP: KPARM: SET #(1,'(K)') IFF KPARM: @COPY #(1),#(2) ENDC IFT KPARM: LOAD:K #(1),#(2) ENDC ENDC IFF TEMP: KPARM: SET #(2,'(K)') IFF KPARM: @COPY #(1),#(2) ENDC IFT KPARM:  STOR:K #(2),#(1) ENDC ENDC ENDC ENDM TITL LOAD:K MACRO :1E00 STOR:K MACENT :1E80 SKEL: SET #(0) BPARM: SET #(1,'*') IFT BPARM:=1 SKEL: SET SKEL:++:0040 ENDC IFF BPARM:=1 BPARM: SET 0 ENDC BPARM: SET BPARM:+1 KPARM: SET KPARM:-1 D6: SET #(1,BPARM:,KPARM:) ERR: SET D6:<0 ERR: SET D6:>63++ERR: IFT ERR: D6: SET 0 NOTE E,' ##(1,BPARM:,KPARM:) OUT OF RANGE' ENDC SKEL: SET SKEL:++D6: ERR: SYMATT #(2) ERR: SET ERR:**:2000--:2000 D6: SYMVAL #(2) ERR: SET D6:**:0001++ERR: IFT ERR: D6: SET 0 NOTE E,' ##(2) MUST BE A,Q,X OR Y' ENDC IFF ERR: WORD D6://12++SKEL: ENDC ENDM TITL "COPP" MACRO ****************************** * *  COPP - LOAD/STORE REGISTERS FROM/TO EXTERNAL MEMORY * * CALLING SEQUENCE: * * COPP ABS(X,Y),4REG * COPP 4REG,ABS(X,Y) * ****************************** * COPP MACRO IFF #(?)=2 NOTE E,' WRONG NUMBER OF ARGUMENTS' ENDC IFT #(?)=2 TEMP: SYMATT #(2) TEMP: SET TEMP:**:2000 IFT TEMP: LOAD:R #(1),#(2) ENDC IFF TEMP: STOR:R #(2),#(1) ENDC ENDC ENDM TITL LOAD:R MACRO :3C00 STOR:R MACENT :1C00 ERR: SYMATT #(1) SKEL: SET ERR:&:300%-2;#(0) ERR: SET ERR:&:800 IFT ERR: NOTE E,'INDIRECT IS NOT ALLOWED *E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*' ENDC IFF ERR: D4: SYMVAL #(1) ERR: SET D4:<0 ERR: SET D4:>15;ERR: IFT ERR: NOTE E,'OUT OF RANGE *E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*' ENDC SKEL: SET SKEL:++D4: D4: SYMATT #(2) D4: SET D4:&:2000--:2000 R2: SYMVAL #(2) D4: SET R2:**:0001++D4: IFT D4: NOTE E,' ##(2) MUST BE A,Q,X OR Y *E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*' ERR: SET ERR:;D4: ENDC IFF ERR: WORD R2://3++SKEL: ENDC ENDC ENDM TITL TITL "RESTS" MACRO ****************************** * * RESTS - RESTORE CONTEXT FROM STACK * * CALLING SEQUENCE: * * RESTS (STACK OFFSET) * ****************************** * RESTS MACRO IFF #(?)=1 NOTE E,' WRONG NUMBER OF ARGUMENTS' ENDC IFT #(?)=1 WORD :5C05 WORD #(1) ENDC ENDM TITL "SAVES" MACRO ****************************** * * SAVES - SAVE CONTEXT ON STACK * * CALLING SEQUENCE: * * SAVES (STACK OFFSET) * ****************************** * SAVES MACRO :0F0E IFF #(?)=2 NOTE E,' WRONG NUMBER OF ARGUMENTS' ENDC IFT #(?)=2 ERR: SYMATT #(1) ERR: SET ERR:**:8000--:8000 D6: SYMVAL #(1) ERR: SET D6:>15++ERR: ERR: SET D6:<0++ERR: IFT ERR: NOTE E,' ##(1) OUT OF RANGE' ENDC IFF ERR: WORD D6://4++#(0) WORD #(2) ENDC ENDC ENDM TITL "OSCDR" AND "ISCDR" MACROS ****************************** * * OSCDR - OUTPUT TO SLAVE CONTROL DATA REGISTER * * ISCDR - INPUT FROM SLAVE CONTROL DATA REGISTER * * CALLING SEQUENCE: * * OSCDR 8REG * * ISCDR 8REG * ****************************** * OSCDR MACRO :0300 ISCDR MACENT :0301 IFF #(?)=1 NOTE E,' WRONG NUMBER OF ARGUMENTS' ENDC IFT #(?)=1 ERR: SYMATT #(1) ERR: SET ERR:**:2000--:2000 IFT ERR: NOTE E,' ##(1) MUST BE A REGISTER' ENDC IFF ERR: REG: SYMVAL #(1) WORD REG://4++#(0) ENDC ENDC ENDM TITL ASSORTED MACROS ****************************** * * OMSCDR - OUTPUT FROM MEMORY TO SLAVE CONTROL DATA REGISTER * * IMSCDR - INPUT FROM MEMORY TO SLAVE CONTROL DATA REGISTER * * STOP - STOP * * SSTEP - SINGLE STEP * * START  - START * * XLB - BYTE TRANSLATE BLOCK * * MVB - BYTE BLOCK MOVE * * XLBS - BYTE TRANSLATE BLOCK AND SKIP * * SCM   - BYTE SCAN MEMORY * * PNX - PUBLIC NEXT * * CALLING SEQUENCE: * * OMSCDR * * IMSCDR * *  STOP * * SSTEP * * START * * XLB * * MVB * * XLBS * *  SCM * * PNX * ****************************** * OMSCDR MACRO :0302 IMSCDR MACENT :0303 STOP MACENT :0304 SSTEP MACENT :0305 START MACENT :0306 XLB MACENT :5C06 MVB MACENT :5C46 XLBS MACENT :5C86 SCM MACENT :5CC6 PNX MACENT :5C26 WORD #(0) ENDM TITL "EXTERNAL MEMORY BIT MANIPULATION" MACROS ****************************** * * EMSB - SET EXTERNAL MEMORY BIT * * EMSKS - SET EXTERNAL MEMORY BIT AND SKIP * * EMRB - RESET EXTERNAL MEMORY BIT * * EMSKR - RESET EXTERNAL MEMORY BIT AND SKIP * *  EMCB - COMPLEMENT EXTERNAL MEMORY BIT * * EMSKC - COMPLEMENT EXTERNAL MEMORY BIT AND SKIP * * EMSKO - TEST EXTERNAL MEMORY BIT AND SKIP IF ONE * * EMSKZ - TEST EXTERNAL MEMORY BIT AND SKIP IF ZERO * * CALLING SEQUENCE: * * INSTR. BIT,[*]MEM(X,Y) * ****************************** * EMSB MACRO :5C18 EMSKS MACENT :5C09 EMRB MACENT :5C1A EMSKR MACENT :5C0B EMCB MACENT :5C1C EMSKC MACENT :5C0D EMSKO MACENT :5C0E EMSKZ MACENT :5C0F IFF #(?)=2 NOTE E,'WRONG NUMBER OF ARGUMENTS *E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*' ENDC IFT #(?)=2 MBITS:E #(0),#(1),#(2) ENDC ENDM TITL "INTERNAL MEMORY BIT MANIPULATION" MACROS ****************************** * * IMSB - SET INTERNAL MEMORY BIT * * IMSKS - SET INTERNAL MEMORY BIT AND SKIP * * IMRB - RESET INTERNAL MEMORY BIT * * IMSKR - RESET INTERNAL MEMORY BIT AND SKIP * * IMCB - COMPLIMENT INTERNAL MEMORY BIT * * IMSKC - COMPLIMENT INTERNAL MEMORY BIT AND SKIP * * IMSKO - TEST INTERNAL MEMORY BIT AND SKIP IF ONE * * IMSKZ - TEST INTERNAL MEMORY BIT AND SKIP IF ZERO * * CALLING SEQUENCE: * * INSTR. BIT,[*]MEM(X,Y) * ****************************** * IMSB MACRO :5C18 IMSKS MACENT :5C09 IMRB MACENT :5C1A IMSKR MACENT :5C0B IMCB MACENT :5C1C IMSKC MACENT :5C0D IMSKO MACENT :5C0E IMSKZ MACENT :5C0F IFF #(?)=2 NOTE E,'WRONG NUMBER OF ARGUMENTS *E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*' ENDC IFT #(?)=2 MBITS:I #(0),#(1),#(2) ENDC ENDM TITL MBITS:I MACRO 0 MBITS:E MACENT :0800 ERR: SYMATT #(2) ERR: SET ERR:&:8000--:8000 D6: SYMVAL #(2) ERR: SET D6:>15;ERR: ERR: SET D6:<0;ERR: IFT ERR: NOTE E,' ##(2) OUT OF RANGE *E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*' ENDC D11: SYMVAL #(3) M4: SET 0 M4:: SYMATT #(3) D11:: SET D11: IFF ERR: IFT D11:<2048 M4D11: #(0),#(1) ENDC IFF D11:<2048 IFT D11:>$ IFT D11:-$>2049 M4D11:: #(0),#(1) ENDC IFF D11:-$>2049 D11:: SET D11:-$-2 M4: SET M4:;:8000 M4D11: #(0),#(1) ENDC ENDC IFT $>D11: IFT $-D11:>2046 M4D11:: #(0),#(1) ENDC IFF $-D11:>2046 D11:: SET $-D11:+1 M4: SET M4:;:8000 M4D11: #(0),#(1) ENDC ENDC ENDC ENDC ENDM TITL M4D11: MACRO IFT M4::&:0800 M4: SET M4:;:4000 ENDC M4: SET M4::%4&:3000;M4:;#(1) D6: SET D6:%4 WORD #(2)&:FF0F;D6: OPCODE WORD M4:;D11:: M4, P AND D11 FIELDS ENDM TITL M4D11:: MACRO M4: SET M4:;:C000 M4: SET M4::%4&:3000;M4:;#(1) IFT M4::&:0800 NOTE E,'MULTILEVEL INDIRECT *E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*' ENDC IFT M4::&:0100 NOTE E,'A *E*E* E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*E*' ENDC IFF M4::&:0900 D6: SET D6:%4 WORD #(2)&:FF0F;D6: OPCODE IFT #(2)&:F0 WORD M4:;1 M4, P AND RELATIVE DISPLACEMENT FIELDS JMP $+2 JUMP OVER INDIRECT MEMORY LOCATION WORD D11:: INDIRECT MEMORY LOCATION NOTE W,'INDIRECT POINTER AND "JMP" CREATED *W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*'  ENDC IFF #(2)&:F0 WORD M4:;2 M4, P AND RELATIVE DISPLACEMENT FIELDS JMP $+3 SKIP ONE LOCATION JMP $+3 SKIP TWO LOCATIONS WORD D11:: INDIRECT MEMORY LOCATION NOTE W,'INDIRECT POINTER AND "JMPS" CREATED *W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*' ENDC ENDC ENDM TITL "POP" MACRO ****************************** * * POP - RESTORE REGISTER(S) FROM STACK * * CALLING SEQUENCE: * * POP * * POP 4REG * ****************************** * POP MACRO :0F07 IFT #(?)=0 @POP ENDC IFT #(?)>1 NOTE E,' WRONG NUMBER OF ARGUMENTS' ENDC IFT #(?)=1 ERR: SYMATT #(1) ERR: SET ERR:**:2000--:2000 REG: SYMVAL #(1) ERR: SET REG:**:0001++ERR: IFT ERR: NOTE E,' ##(1) MUST BE A,Q,X OR Y' ENDC IFF ERR: WORD REG://12++#(0) ENDC ENDC ENDM TITL "PUSH" MACRO ******************************** * * PUSH - SAVE REGISTER(S) ON STACK * * CALLING SEQUENCE: * * PUSH * * PUSH 4REG * ******************************** * PUSH MACRO :0F05 IFF #(?)=1 NOTE E,' WRONG NUMBER OF ARGUMENTS' ENDC IFT #(?)=1 ERR: SYMATT #(1) ERR: SET ERR:**:2000--:2000 IFT ERR: @PUSH #(1) ENDC IFF ERR: REG: SYMVAL #(1) ERR: SET REG:**:0001++ERR: IFT ERR: NOTE E,' ##(1) MUST BE A,Q,X OR Y' ENDC IFF ERR: WORD REG://12++#(0) ENDC ENDC ENDC ENDM TITL TITL "ALLOC" MACRO ****************************** * * ALLOC - ALLOCATE/DEALLOCATE STACK SPACE * *  CALLING SEQUENCE: * * ALLOC +-SPACE * ****************************** * ALLOC MACRO :0F04 IFF #(?)=1 NOTE E,' WRONG NUMBER OF ARGUMENTS' ENDC IFT #(?)=1 TEMP: SET 0 ERR: SYMATT #(1) ERR: SET ERR:**:8000--:8000 D6: SYMVAL #(1) ERR: SET D6:>16++ERR: ERR: SET D6:<-16++ERR: ERR: SET D6:=0++ERR: IFT ERR: NOTE E,' ##(1) OUT OF RANGE' ENDC IFF ERR: IFT D6:<0 TEMP: SET 2 D6: SET 0-D6: ENDC D6: SET D6:-1//4 WORD D6:++TEMP:++#(0) ENDC ENDC ENDM SAVE END D D D D D D D D D D D D D D D D D D OVicEdDanoyM Ç Z ޣ}T`P"Ee0C2C #U @A+TƇÇÇ R ޣ}LxQEe46 P`PPZԁeE" oBI# D-                 -   0, 1Bw-tsrL:7 O@CFI =?@        8.10@  ,I# DTI# D   ޠޞw ,  IT   ŀ}{ I# D# u# ponIB6gA  `n9xIc Dc T/6vBD?6IAIB`/6*6+ WA i f~# @g`n9xIc Dc T/6vBD?6IAIBY/6*6+8 (@ `0pP 'ނ~{6B`n9xIc Dc Ti/6v6Ic DD a0 !++ڟx "} 7| } } "} 7| } } 0& Ţ[](ce)%0g 0' þF(P)$0k ń '!" & #$%  #%C$A#y%$ $%C"4QI-0 -P`xP q j &i!_ X #$% 'TTSJ #H%C$A#y%B$? %$63=X,#j %$ '!" & #$%YYVU #ML%C$A#y%$ $%yC"-T P`x- -3w s  &c!a  'R #$%P #OIH%C$A#y%=$: $%7y442C.*0I#U" & q '!!"b  #$%YWVS+++FC$#|?`:>-`Px - &  j 'c!^ T #$%TPM$#|HKXECFFC~#0 . ' 1 !"$  #$%[YXVT$#| ' $Fq"uE  I '" &Ŀ,ÿ) )(р(΀()b )ǀ)D))L"I Dx *&#-   ! c- -s (ޢx+ٞ|(֢o+ў|nPP (ɢc+Ğ|(Z+޼|n  QN(`@C !ޡޠޠnf  ޙ}ޕzt ދ} }  xF: ަutsԂ؆[пР͠ cǢbľ;l* †C ML%(@<:A-+7w# --(!A+w#8h# - CAȀ*I6Ag !b\ZWx%w-.hg p! l ΄Ϳ:t9 `!Ą/uDU~ ##y) qwAm) dv4a_ ( Ut$) MJi@&  ߄}yŒ)# # # B# B*3uƯ@@AƩ.10@  ,I# DTI# D  ▀@ ޑޏv ,  -   ) )! ) ) Ix ~֞8O]&Ea3x_|l*| }~gҡ# A `Q T ( :ӂ< - :ӂ" )   pP0  @0B բ` h } c= ¢‚pP0/o X)C $ `)C ")PC ")C " `m D E B U G 4 E 8 0 0 ӟe } ӂzӾ P AC Q@ X= Y:ԽѾ K3 L0 S- D* C'ԟK =ӟ{ } ӟ| @)C ")PC ")C " `r" *ٽ҆ Y Q A Gҽ؆ R Ƥ D V Wƚ›LBLCLFLLLSLJLILGLRLZߝ Ǟ< !}҆{҆u łt P Lłj T P BŁ P ӂY T H TŅ Ğ|QEF , , `솂՟ _ٞ0 6} ` J B YK QJf䞁ւ cޡ @ޟޝ `@E ;߽RA@EN@Aޏǎ Qފ ,^:FB& o*| x` D `랞oY*Qd Ѐ_Ѐ āZ@AĄ܃T B `ǁ D임*L_U3 `Ģ1*/) 'r "Bƽу۽ֽˁC凑ā  / XŃ ѽ۞i Ğ]с䆫@ڃ۽ցBǢ ,ž[ + - * X /KJƎ^[{ xނZ ,ş| ֽL ΁ P ޽с۽۽޺{ ӽўq kɆȂGާ}ަyޠ}y E ~  .Ӄ E ~  .ޣރfN ,Žֆs@FC kqLL (w{u ^|JQBZy L S TўNM  Isľˆ_]]| IƎ> ,ŽƇ ,ƂpIưk , ,Htr Hm -ņց -ņ('\\ÂF -tтڃԞ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 @0ƵQ¾ˢ̂C C 96C C " z a ࢜0 `a ´C /6 C C 6 C C 6C h Q¾{”C "C C I6 ,ŽƇ , ƂpIưk , ,Htr H m -ņց - ('\\ÂF - tтڃԞx ’ @"Fz@ Ό F ō l# .bƝޙޖJ Q!’ފދ JQĽ %ӂԞu  U B * ӂGo h f e "cIaM K Y &V&RR `QK L$kK N =ӂDD G ӂA   :Ӟ ӟL  ӟ{ y9 u     :ӂw  @0ƵQ¾ˢ̂ C C 96C C " z a ࢜0 `a ´C  /6 C C 6 C  C 6C h  Q¾{”C "C C  I6 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIICARTOSMA282102215294840821022152948 821022152948#4 *F89601 VOL4/10T BACK-TO-BACK PICO TEST