IMD 1.16: 31/08/2008 22:29:40 f02501 84-93025-01 a000 timer495 2/jun/83    @0|)wwЀЀtQql)  " }gA ` MIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 ME180040811194800800408111948 800408111948*F02501 VOLTIMER495 (84-93025-01-A000)   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII M@jjggg@ o G`k_C# b# }B u[ ]e JRiCCp@<;: F8P@ G;NPCHC C GTqE'ɞ * Cϟx @0DAJL )‘ЀЀΎQBx"  i+ fEB)3 `jmBBI,v  BI,m  @EEFF)D^EF% jH@pOğv g7g4]X] PhV+s=胾c_N GF֞ؾ “@ALS)"$ C k1/j-h p vRw ppwp ki 15 !^\d X %'+Ns愾Q)s ED|{ @$ o O m J K i g. V tsFn`"FED) E`Cnrgy w"N{Rq1H }L2`0tG- Bc (>=1 EXR: #(2) JSK #(0) ENDC IFT #(?)>2 EXR: #(3) JSK #(0) ENDC IFT #(?)>3 EXR: #(4) JSK #(0) ENDC ENDM TITL TIMER MACROS -- INIT & TIME:ST INIT MACRO OPTIONS +:20 NAM TIME:ST EXTR TM:RTN EXTR CNT:LOW EXTR CNT:HIGH TM:END SET 0 TIME:2 SET $ TIME:ST WORD 0 OPTIONS -:20 ENDM SPACE 5 TIME:INC MACRO OPTIONS +:20 IFT TM:END IMS CNT:LOW JMP TIME:1 IMS CNT:HIGH JMP TIME:1 JST TM:RTN TIME:2 SET $ NOP LPOOL ENDC TM:END SET 0 OPTIONS -:20 ENDM TITL TIMER MACROS -- TIME & TIME:END TIME MACRO TIME:INC OPTIONS -2 TM:END SET 1 TIME:0 SET $ ORG TIME:2 WORD TIME:0 ORG TIME:0 NOP  NOP WORD #(1) WORD #(2) MSG #(3) IFT #(?)>3 OHEAD SET #(4,'OV')%14 ENDC IFF #(?)>3 OHEAD SET 0 ENDC TIME:1 SET $ ORG TIME:0 WORD TIME:1 WORD OHEAD ORG TIME:1 OPTIONS +2 ENDM SPACE 5 TIME:END MACRO WORD 0 ENDM * SAVE END RRRRR 44444 99 TITL ** TIMER495.NUC ** (84-93025-20-A000) TIMING TEST PROGRAM TITL I/O MACRO SUBROUTINES NAM TIMER495 NAM CNT:HIGH  NAM CNT:LOW NAM TM:RTN EXTR TIME:ST MACHINE :20 TIMER495 REL WRITE EQU $ ADD =1,X GET ADDRESS OF MESSAGE COPY X,WTIOB+IO:BUF STORE INTO IOB COPY PRFLG,A JEQ A,$+2 JUMP IF DEFAULT I/O COPY X,OUTIOB+IO:BUF SUB =1,X POINT TO THE BYTE COUNT COPY 0(X),X GET IT COPY X,WTIOB+IO:BCT STORE INTO IOB COPY PRFLG,A JEQ A,$+2 JUMP IF DEFAULT I/O COPY X,OUTIOB+IO:BCT COPY:M WRTCODE,A,WTIOB+IO:FC COPY A,OUTIOB+IO:FC I:IO WTIOB JMP IOERR COPY PRFLG,A JEQ A,$+4 I:IO OUTIOB JMP IOERR RSK WRTCODE WORD WR:%4+FA: TITL * * SET UP IOB TO WRITE ON 'OC' * IOB:A WTIOB,'OC',WR:,FA:,WTDBCT,0,WTDCFI,0 * IOB:A OUTIOB,'Z2',WR:,FA:,WTDBCT,0,WTDCFI,0 * WTDBCT EQU 80 WRITE BYTE COUNT WTDCFI RES 2,0 WRITE CFI PRFLG WORD 0 GFN:PL NAMPTR,ISMPL UNIT EQU NAMPTR+PUN: FNO EQU NAMPTR+FNO: LUN EQU NAMPTR+LUN: NAME EQU NAMPTR+NAME: SEXT EQU NAMPTR+SEXT: INXT EQU NAMPTR+INXT: RLN EQU NAMPTR+RLN: * OPEN EQU $ COPY PRFLG,A JEQ A,OPIF1 COPY:M OPENCODE,A,IO:FC(X) I:IO 0(X) JMP IOERR OPIF1 RSK OPENCODE WORD FU:%4+OP: * CLOSE EQU $ COPY PRFLG,A JEQ A,CLIF1 COPY:M CLOSCODE,A,IO:FC(X) I:IO 0(X) JMP IOERR CLIF1 RSK CLOSCODE WORD FU:%4+CL: * * IOERR COPY:M =0,A,PRFLG WRITE ERRMSG E:MONE PRMERR COPY:M =0,A,PRFLG WRITE PERMSG E:MONE NOFOUND COPY:M =0,A,PRFLG WRITE NOFMSG E:MONE LPOOL TITL TIMER EXECUTIVE * * * TIMER495 EQU $ E:GFN NAMPTR . GET COMMAND LINE PARAMETER JEQ A,TIMER1 . IF  VALID FILE NAME, JUMP TO 1 CLSN A,=1 JMP TIMER3 . NO PARAMETER GIVEN (CRT) JUMP TO 3 JMP PRMERR . ILLEGAL INPUT GIVEN--ABORT TIMER1 COPY:M =-1,A,PRFLG 1 ALLOW USE OF OUTIOB COPY UNIT,A JNE A,TIMER2 . UNIT GIVEN OR LP, JUMP TO 2 E:UF . . FILE IS ON UF COPY A,FNO . GET IT'S FNO & UNIT COPY X,UNIT TIMER2 COPY NAMPTR,A 2 NAME GIVEN? JEQ A,TIMER3 . NO (LP) - JUMP TO 3 COPY:M =20,A,INXT . YES, SPECIFY INXT, SEXT, & RLN COPY A,SEXT COPY:M =0,A,RLN F:CREA NAMPTR . CREATE THE FILE IF IT JGE A,TIMER3 . DOESN'T ALREADY EXIST JMP IOERR LPOOL TIMER3 COPY:M ='Z2',A,LUN 3 CONNECT FILE TO 'Z2' F:CONN NAMPTR JGT A,TIMER4 JMP NOFOUND LPOOL TIMER4 OPEN OUTIOB OPEN THE FILE WRITE HEADING,HEAD1,BLANK,BLANK COPY:M =-1,A,RESCNT RBIT 5,S COPY:M RTCINC,A,RTCSAVE COPY:M RTCINC+1,A,RTCSAVE1 COPY:M RTCINC+2,A,RTCSAVE2 COPY:M JST1,A,RTCINC+1 COPY:M =RTCRTN,A,RTCINC+2 TIMER5 COPY TIME:ST,X COPY X,TM:CUR TIMER10 EQU $ COPY:M =0,A,ABORT COPY:M SETCTR,A,COUNTER IMS COUNTER JMP $-1 * * INITIATE TEST AND TIMER * COPY:M TICK4,A,RTCINC COPY:M =-1,A,RTCCNT COPY:M LOW1,A,CNT:LOW COPY:M HIGH1,A,CNT:HIGH COPY TM:CUR,X COPY 0(X),Y COPY 2(X),A LOAD INITIAL VALUES COPY 3(X),X SBIT 5,S JMP 0(Y) * * HERE ON RETURN FROM TEST * TM:RTN ENT RBIT 5,S COPY RTCINC,A COPY A,SCORE COPY TM:CUR,X COPY 1(X),X COPY SCORE,A JNE X,TIMER40 SUB OHD,A EXCH ABORT,A JNE A,TIMER30 EXCH ABORT,A TIMER30 JST CONVERT JST RESULT COPY *TM:RTN,A JNE A,$+2 JMP TIMER60 COPY A,TM:CUR JMP TIMER10 TIMER40 EXCH ABORT,A JNE A,TIMER50 EXCH ABORT,A TIMER50 COPY A,OHD JMP TIMER30 TIMER60 WRITE ENDMSG,BLANK COPY:M RTCSAVE,A,RTCINC COPY:M RTCSAVE1,A,RTCINC+1 COPY:M RTCSAVE2,A,RTCINC+2 SBIT 5,S CLOSE OUTIOB E:MON RTCRTN ENT TBIT 2,S JF OV,RTCRTN0 RBIT 2,S COPY A,SAVEA COPY:M =0,A,COUNTER JMP RTCRTN1 RTCRTN0 COPY A,SAVEA COPY:M =-1,A,COUNTER RTCRTN1 IMS RTCCNT JMP RTCRTN2 COPY:M TICKS,A,RTCINC COPY:M HIGH1,A,CNT:HIGH COPY:M LOW1,A,CNT:LOW JMP RTCRTN3 RTCRTN2 COPY:M =-1,A,ABORT RTCRTN3 COPY SAVEA,A IMS COUNTER SBIT 2,S SBIT 8,S JMP *RTCRTN SAVEA RES 1 OHD WORD 0 TM:CUR WORD 0 SCORE WORD 0 ABORT WORD 0 STRT WORD 0 RTCCNT WORD 0 TICKS RES 1,0 TICK4 RES 1,-4 RTCINC EQU :91 RTCSAVE WORD 0 RTCSAVE1 WORD 0 RTCSAVE2 WORD 0 COUNTER WORD 0 HBUFADDR WORD HBUF*2+4 JST1 JST *$+1 SETCTR WORD :0000 LPOOL TITL SERVICE SUBROUTINE BIN-ASCII CONVERT ENT * * SET UP FOR CONVERT *  COPY A,BUF COPY:M =HRT,A,PTR COPY:M =-4,A,KNT COPY HBUFADDR,A BUFFER DATA ADDR(RESOLUTION) EXCH BUF,A COPY =' ',X JGE A,$+3 NEG A,A MAKE POSITIVE COPY ='-',X COPY A,VALUE  INITIAL VALUE TO CONVERT SBIT 2,S COPYB X,*BUF PUT 'SIGN' IN BUFFER RBIT 2,S IMS BUF COPY =0,A COPY A,STFLG START OF FIELD FLAG * * OUTER LOOP - CONVERT NEXT DIGIT TO CHAR * BAC04 EQU  $ COPY VALUE,A GET REMAINING VALUE COPY ='0'-1,X INITIAL RESULT BAC08 EQU $ * * INNER LOOP - SUBTRACT CONVERTER TILL DIGIT DONE * ADD *PTR,A SUBTRACT OFF DIGIT ADD =1,X BUMP RESULT JGE  A,BAC08 LOOP TILL NEGATIVE SUB *PTR,A RESTORE VALUE COPY A,VALUE SAVE INTERMEDIATE IMS   PTR * * BLANK OUT START OF FIELD AND STORE CHAR * COPY STFLG,A JNE A,BAC12 GO IF FIELD BEGUN COPY *PTR,A NEXT DIGIT CONTROL JEQ A,BAC12 SKIP IF DECIMAL POINT NEXT CLSN ='0',X SKIP IF RESULT NOT ZERO COPY =' ',X REPLACE ZERO WITH SPACE JMP BAC12 LPOOL BAC12 EQU $ SBIT 2,S COPYB X,*BUF  STORE RESULT IN OUTPUT BUFFER RBIT 2,S IMS BUF CLSN =' ',X JMP $+2 COPY X,STFLG SET FIELD START IF CHAR NOT SPACE * * PLACE DECIMAL POINT IF REQUESTED * COPY *PTR,A GET NEXT CONTROL WORD  JNE A,BAC16 CONTINUE IF DECIMAL POINT NEXT COPY ='.',X IMS PTR JMP BAC12 STORE DECIMAL POINT BAC16 EQU $ IMS KNT BUMP DIGIT COUNTER JMP BAC04 LOOP UNTIL DONE * * PAD BUFFER WITH TERMINATOR DIGIT(S) * COPY =HRT2,X TERMINATOR TABLE(RESOLUTION) ADD VALUE,X +REMAINDER SHIFT X,LO,1 MAKE BYTE PTR SBIT 2,S COPYB 0(X),A GET FIRST CHAR COPYB A,*BUF STORE IN STRING  IMS BUF COPYB 1(X),A SECOND CHAR COPYB A,*BUF STORE IN STRING RBIT 2,S JMP *CONVERT LPOOL TITL RESULT OUTPUT ROUTINE RESULT ENT COPY TM:CUR,X COPY 1(X),X JEQ X,$+2 JMP RESULT40 COPY =80,Q COPY =BLANK+1,Y COPY =WTBUF+1,X COPY 0(Y),A RESULT10 COPY A,0(X) ADD =1,X JNED Q,RESULT10 IMS RESCNT JMP $+3 COPY =WTBUF+5,Y JMP RESULT22 COPY =HBUF,X COPY 0(X),A GET RESULT BYTE CNT ADD =1,X GET RESULT BUFFER ADDRESS SHIFT A,R,1 CHANGE TO WORD CNT COPY =WTBUF,Y GET WRITE BUFFER ADDRESS RESULT21 COPY 0(X),Q MOVE A WORD COPY Q,2(Y) ADD =1,X ADD =1,Y JNED A,RESULT21 RESULT22 COPY TM:CUR,X ADD =4,X POINT TO MESSAGE BYTE COUNT COPY 0(X),A GET IT ADD =1,X GET MESSAGE BUFFER ADDRESS SHIFT A,R,1 CHANGE BYTE CNT TO WORD CNT RESULT30 COPY 0(X),Q COPY Q,1(Y) ADD =1,X ADD =1,Y JNED A,RESULT30 COPY =:2020,A COPY A,0(Y) REMOVE TRASH FROM OUTPUT WRITE WTBUF RESULT40 JMP *RESULT VALUE WORD 0 CURRENT REMAINDER BUF WORD 0 BUFFER ADDR PTR  WORD 0 CONVERT TABLE POINTER KNT WORD 0 DIGIT COUNTER STFLG WORD 0 START OF FIELD FLAG BFTMP  WORD 0 RESCNT WORD 0 CONTEXT RES 9,0 LPOOL TITL TABLE STORAGE * * TEST LOOP COUNTER * CNT:LOW WORD 0 CNT:HIGH WORD 0 * * PRECISION CONVERTER TABLES * HRT WORD -4000,-400,-40,0,-4 HIGH RES CONVERT TABLE HRT2 WORD '0 ','0 ','5 ','5 ' * USE :FFFA E9EC FOR 333,332 AT TTLF (50NS RES) * USE :FFFF 63C0 FOR 40,000 AT 1.0 MS (50NS RES) * LOW1 WORD :E9EC LOW ORDER (50 NSEC RES) HIGH1 WORD :FFFA HIGH ORDER (50 NSEC RES) HEADING MSG '0 LSI-4/95 TIMING TEST PROGRAM (A000)' HEAD1 MSG ' REAL-TIME-CLOCK SHOULD BE SET TO TTLF' BLANK MSG ' ' HBUF MSG ' 0000.000 MICROSEC -' RESULT - HIGH RESOLUTION ERRMSG MSG ' I/O ERROR' ENDMSG MSG '0 LSI-4/95 TIMING PROGRAM....END' PERMSG MSG ' PARAMETER ERROR' NOFMSG MSG ' DOCUMENTATION NOT FOUND' WTBUF RES 1,80 RES 80,:2020 LPOOL TIMEREND EQU $ SAVE  END TIMER495 RESS RESULT21 COPY 0(X),Q MOVE A WORD COPY Q,2(Y) ADD =1,X ADD =1,Y JNED A,RESULT21 RESULT22 COPY TM:CUR, JTM:RTN CNT:LOW CNT:HIGHJTIMER495O0SEGMENTBLANK TIMER495o KE:MON F:CONN F:CREA KE:UF E:GFN E:MONE KI:IO TIME:ST ii +A*A:˂C: # OC(PZ2(P _E # 0VE  # 1 L  G Bt#g C f-/- +(M )) (:+EO+tt:+ BOZ20 W ׂܞ~և уU@g  WԆ1ˎ ۿqYt U  $6'  ޕޏ%e  trSt  킦_ ) B)-%' ߂ )/+=׆Ղ΃L,0)  %', ).޺ t޹Z.%ޯ'<  1AIPⲢ@+U ޢ⬞+B+ k++A+k @W 150 gg `p0 0 5 5  .0 LSI-4/95 TI MING TEST PROGRAM (A000) 0 REAL-TIME-C LOCK SHOULD BE SET TO TT LF  0000.000 MICR OSEC - I/O ERROR(0  LSI-4/95 TIMING PR OGRAM....END PARAMETER ERROR DOCUMENTATION NOT FOUNDPP u0800408112139d TITL LSI 4 INSTRUCTION EXECUTION TIMES - 4/95 BASIC TITL ** TMBAS95.ASM ** (84-93025-21-A000) * * ********************************************** ********************************************** ** ** **  TTTTTTT IIIII MM MM EEEEEE RRRRR ** ** T I M M M M E R R ** ** T I M M M EEEEE RRRRR ** ** T I M M E R R ** ** T IIIII M M EEEEEE R R ** **  ** ********************************************** ********************************************** * * * * LSI-4 INSTRUCTION EXECUTION TIMES * 4/95 STANDARD INSTRUCTION SET * TITL ADDRESSING MODES - BYTE MODE MACHINE :20 * * ADDRESSING MODES - BYTE MODE * INIT TIME 0,0,' LSI 4/95 BASIC INSTRUCTION SET ' TIME:INC CELLE WORD  0 TIME 0,0,'OV',OV SBIT 2,S COPYB CELL3,A RBIT 2,S TIME 0,0,'BYTE MODE - RELATIVE BACKWARDS' SBIT 2,S COPYB CELLE,A RBIT 2,S TIME 0,0,'BYTE MODE - RELATIVE FORWARDS' SBIT 2,S COPYB CELLF1,A RBIT 2,S TIME:INC CELLF1 WORD 0 BNDB1 WORD CELLE TIME 0,0,'OV',OV RBIT 6,S SBIT 2,S COPYB CELL3,X RBIT 2,S SBIT 6,S TIME 0,0,'BYTE MODE - RELATIVE BACKWARDS - INDIRECT 1 LEVEL' RBIT 6,S SBIT 2,S COPYB *BNDB1,X RBIT 2,S SBIT 6,S TIME 0,0,'BYTE MODE - RELATIVE FORWARDS - INDIRECT 1 LEVEL' RBIT 6,S SBIT 2,S COPYB *BNDF1,X RBIT 2,S SBIT 6,S  TIME:INC BNDF1 WORD CELLF CELLF WORD 0 TIME 0,0,'OV',OV SBIT 2,S COPYB $,X   RBIT 2,S TIME 0,0,'BYTE MODE - POST INDEXED' SBIT 2,S COPYB CELL3(X),Q RBIT 2,S TIME 0,0,'OV',OV RBIT 6,S SBIT 2,S COPYB $,X RBIT 2,S SBIT 6,S TIME 0,0,'BYTE MODE - SCRATCH - INDIRECT 1 LEVEL' RBIT 6,S SBIT 2,S COPYB *SIND1,X RBIT 2,S SBIT 6,S TIME 0,0,'BYTE MODE - POST INDEXED INDIRECT' RBIT 6,S SBIT 2,S COPYB *SIND1(X),Q RBIT 2,S SBIT 6,S TIME CELL3,0,'OV',OV COPY A,Y SBIT 2,S COPYB $,Q RBIT 2,S TIME CELL3,0,'BYTE MODE - PRE INDEXED' COPY A,Y SBIT 2,S COPYB 1(Y),Q RBIT 2,S TIME CELL3,0,'BYTE MODE - PRE INDEXED & POST INDEXED' COPY A,Y SBIT 2,S COPYB 0(X,Y),Q RBIT 2,S TIME 0,0,'OV',OV COPY A,Y RBIT 6,S SBIT 2,S COPYB $,Q RBIT 2,S SBIT 6,S TIME 0,0,'BYTE MODE - PRE INDEXED INDIRECT' COPY A,Y RBIT 6,S SBIT 2,S COPYB *SIND1(Y),Q RBIT 2,S SBIT 6,S TIME 0,0,'BYTE MODE - PRE INDEXED INDIRECT POST INDEXED' COPY A,Y RBIT 6,S SBIT 2,S COPYB *SIND1(X,Y),Q RBIT 2,S SBIT 6,S TIME:INC TITL MEMORY REFERENCE SINGLE WORD - BYTE MODE * * MEMORY REFERENCE - SINGLE WORD * BYTE MODE * TIME 0,0,'OV',OV SBIT 2,S RBIT 2,S TIME 0,0,'BYTE MODE - COPYB MEMORY TO REG' SBIT 2,S COPYB CELL3,A RBIT 2,S TIME 0,0,'BYTE MODE - COPYB REG TO MEMORY' SBIT 2,S COPYB A,CELL3 RBIT 2,S TIME 0,0,'BYTE MODE - ADDB MEMORY TO REG'  SBIT 2,S ADDB CELL3,A RBIT 2,S TIME 0,0,'BYTE MODE - EXCHB MEMORY WITH REG' SBIT 2,S EXCHB CELL3,A RBIT 2,S TIME 0,0,'BYTE MODE - ANDB MEMORY TO REG' SBIT 2,S  ANDB CELL3,A RBIT 2,S TIME 0,0,'BYTE MODE - ORB MEMORY WITH REG' SBIT 2,S ORB CELL3,A RBIT 2,S TIME 0,0,'BYTE MODE - XORB MEMORY WITH REG' SBIT 2,S XORB CELL3,A  RBIT 2,S TIME 0,0,'BYTE MODE - CSKB - REG < MEMORY - NO SKIP' SBIT 2,S CSKB A,CELL1+1  RBIT 2,S TIME :0F0F,0,'BYTE MODE - CSKB - REG > MEMORY - SKIP + 1' SBIT 2,S CSKB A,CELL0 HLT RBIT 2,S TIME 0,0,'BYTE MODE - CSKB - REG = MEMORY - SKIP + 2' SBIT 2,S  CSKB A,CELL0 HLT HLT RBIT 2,S TIME:INC TITL ADDRESSING MODES - WORD MODE * * ADDRESSING MODES - WORD MODE * INDB2 WORD INDB1;:8000 INDB1 WORD CELLA CELLA WORD 0 TIME 0,0,'OV',OV COPY CELL3,X TIME 0,0,'RELATIVE BACKWARDS' COPY CELLA,X TIME 0,0,'OH',OV RBIT 6,S COPY CELL3,X SBIT 6,S TIME 0,0,'RELATIVE BACKWARDS - INDIRECT 1 LEVEL' RBIT 6,S COPY *INDB1,X SBIT 6,S  TIME 0,0,'RELATIVE BACKWARDS - INDIRECT 2 LEVELS' RBIT 6,S COPY *INDB2,X SBIT 6,S TIME 0,0,'OH',OV COPY CELL 3,X TIME 0,0,'RELATIVE FORWARDS' COPY CELLB,X TIME 0,0,'OH',OV RBIT 6,S COPY CELL3,X SBIT 6,S  TIME 0,0,'RELATIVE FORWARD - INDIRECT 1 LEVEL' RBIT 6,S COPY *INDF1,X SBIT 6,S TIME 0,0,'RELATIVE FORWARD - INDIRECT 2 LEVELS' RBIT 6,S COPY *INDF2,X SBIT 6,S TIME:INC INDF2 WORD INDF1;:8000 INDF1 WORD CELLB CELLB WORD 0 TIME 0,0,'OV',OV COPY CELL3,X TIME 0,0,'OH',OV RBIT 6,S COPY CELL3,X SBIT 6,S TIME 0,0,'SCRATCH - INDIRECT 1 LEVEL' RBIT 6,S COPY *SIND1,X SBIT 6,S TIME 0,0,'SCRATCH - INDIRECT 2 LEVELS' RBIT 6,S COPY *SIND2,X SBIT 6,S TIME 0,0,'OH',OV COPY CELL3,Q TIME 0,0,'POST INDEXED' COPY CELL3(X),Q TIME 0,0,'OV',OV COPY A,Y COPY CELL3,Q TIME 0,0,'PRE-INDEXED' COPY A,Y COPY CELL3(Y),Q TIME 0,0,'PRE-INDEXED & POST-INDEXED' COPY A,Y  COPY CELL3(X,Y),Q TIME 0,0,'OV',OV RBIT 6,S COPY CELL3,Q SBIT 6,S TIME 0,0,'INDIRECT POST-INDEXED' RBIT 6,S COPY *SIND1(X),Q SBIT 6,S TIME 0,0,'OV',OV COPY A,Y RBIT 6,S COPY CELL3,Q SBIT 6,S TIME 0,0,'PRE-INDEXED INDIRECT' COPY A,Y RBIT 6,S COPY *SIND1(Y),Q SBIT 6,S TIME 0,0,'PRE-INDEXED - INDIRECT - POST-INDEXED' COPY A,Y RBIT 6,S COPY *SIND1(X,Y),Q SBIT 6,S TIME:INC TITL MEMORY REFERENCE SINGLE WORD - WORD MODE * * MEMORY REFERENCE - SINGLE WORD * WORD MODE * TIME :A,:B,'OV',OV TIME :A,:B,'COPY MEMORY TO REG' COPY CELL1,A TIME :A,:B,'COPY REG TO MEMORY' COPY A,CELL3  TIME :A,:B,'ADD - ADD MEMORY TO REG' ADD CELL1,A TIME :A,:B,'SUB - SUBTRACT MEMORY FROM REG'  SUB CELL1,A TIME :A,:B,'EXCH - EXCHANGE MEMORY WITH REG' EXCH CELL3,A TIME 0,0,'AND - AND MEMORY TO REG' AND CELL1,A TIME 0,0,'OR - INCLUSIVE OR MEMORY TO REG' OR CELL1,A  TIME 0,0,'XOR - EXCLUSIVE OR MEMORY TO REG' XOR CELL1,A TIME 0,0,'CSK - REG < MEMORY - NO SKIP'  CSK A,CELL1 TIME 1,0,'CSK - REG > MEMORY - SKIP + 1' CSK A,CELL0 HLT TIME 0,0,'CSK - REG = MEMORY - SKIP + 2' CSK A,CELL0 HLT HLT TIME 0,0,'OV',OV NOP TIME 0,0,'JMP - UNCONDITIONAL JUMP' JMP MEMLC0 MEMLC0 NOP TIME 0,0,'OV',OV JMP *CONT0 CONT0 WORD CONT1 CONT1 JMP CONT3 CONT3 NOP TIME 0,0,'JST - JUMP & STORE PROGRAM COUNTER' JST SUB0 JMP  CONT2 SUB0 ENT JMP *SUB0 CONT2 NOP TIME 0,0,'OV',OV COPY A,CELL3 TIME :FFFF,0,'IMS - INCR MEMORY & SKIP IF ZERO - SKIP' COPY A,CELL3 IMS CELL3 HLT TIME 1,0,'IMS - INCR MEMORY & SKIP IF ZERO - NO SKIP' COPY A,CELL3 IMS CELL3 TIME:INC STKBOT EQU $  RES 6,:1111 STKTOP WORD 0 SAVEK WORD 0 SAVEL WORD 0 LPOOL TIME 0,0,'OV',OV JST STKSET NOP JST STKEN D TIME 0,0,'JSK - JUMP & STACK' JST STKSET JSK SUB1 SUB1 NOP JST STKEND TITL REGISTER - REGISTER * * REGISTER - REGISTER * TIME 0,0,'OV',OV TIME :A,:B,'COPY - COPY REG TO REG' COPY A,X TIME 0,0,'NEG - NEGATE REG TO REG' NEG A,X TIME :A,:B,'ADD - ADD REG TO REG' ADD  A,X TIME :A,:B,'SUB - SUBTRACT REG FROM REG' SUB A,X TIME 0,0,'AND - AND REG TO REG'  AND A,X TIME 0,0,'OR - INCLUSIVE OR REG TO REG' OR A,X TIME 0,0,'XOR - EXCLUSIVE OR REG TO REG' XOR A,X TIME 0,0,'CSN REG-REG - NO SKIP' CSN A,X TIME 0,1,'CSN REG-REG - SKIP + 1' CSN A,X HLT TIME 0,1,'CSK REG-REG - NO SKIP' CSK A,X TIME 2,1,'CSK REG-REG - SKIP + 1' CSK A,X HLT TIME 0,0,'CSK REG-REG - SKIP + 2' CSK A,X  HLT HLT TIME :A,:B,'EXCH - EXCHANGE REG WITH REG' EXCH A,X TIME 0,0,'COMP - 1''S COMPLEMENT REG TO REG' COMP A,X TIME 0,1,'CSM - REG-REG - NO SKIP' CSM A,X TIME 2,1,'CSM - REG-REG - SKIP + 1' CSM A,X HLT TIME 0,0,'CSM - REG-REG - SKIP + 2' CSM A,X HLT HLT TITL CONTROL INSTRUCTIONS * * CONTROL * TIME 0,0,'OV',OV TIME 0,0,'FMT - FETCH MACHINE TYPE' FMT A TIME 0,0,'UIS - UPDATE INTERRUPT STATUS' UIS TIME 0,0,'OV',OV NOP TIME 0,0,'XNX - INDEX NEXT INSTRUCTION' XNX A NOP TIME 0,0,'OH'O,OV JST STKSET COPY =RSKRTN1,A COPY K,Y COPY A,0(Y) RSKRTN1 JST STKEND TIME 0,0,'RSK - RETURN THROUGH STACK' JST STKSET COPY =RSKRTN2,A COPY K,Y COPY A,0(Y) RSK RSKRTN2 JST STKEND LOC0 EQU $ TITL I/O INSTRUCTIONS * * I/O INSTRUCTIONS * TIME 0,0,'OV',OV TIME 0,0,'OUT - OUTPUT REGISTER' OUT A,04 TIME 0,0,'IN - INPUT TO REGISTER' IN 04,A TIME 0,0,'SELP - SELECT AND PRESENT' SELP A,04  TIME 0,0,'SST - SENSE & SKIP IF TRUE' SST 04 TITL IMMEDIATE INSTRUCTIONS * * IMMEDIATE INSTRUCTIONS * IMMED TIME 0,0,'OV',OV TIME 0,0,'IMMEDIATE - COPY - LOAD BYTE NEGATIVE' COPY =-1,A TIME 0,0,'IMMEDIATE - COPY - LOAD BYTE POSITIVE' COPY =1,A TIME 0,0,'IMMEDIATE - SUB - SUBTRACT BYTE'  SUB =1,A TIME 0,0,'IMMEDIATE - ADD - ADD BYTE' ADD =1,A TIME 1,0,'IMMEDIATE - CLSN - COMPARE EQUAL - NO SKIP' CLSN =1,A TIME 0,0,'IMMEDIATE - CLSN - COMPARE EQUAL - SKIP OCCURS' CLSN =1,A NOP TIME 0,0,'IMMEDIATE - CSK - COMPARE 3 WAY - NO SKIP' CSK A,=1 TIME 1,0,'IMMEDIATE - CSK - COMPARE 3 WAY - SKIP + 1' CSK A,=0 HLT TIME 1,0,'IMMEDIATE - CSK - COMPARE 3 WAY - SKIP + 2' CSK A,=1 HLT HLT TIME 0,0,'IMMEDIATE - AND - AND TO REGISTER'   AND =1,A TIME 0,0,'IMMEDIATE - OR - INCLUSIVE OR TO REGISTER' OR =1,A TIME 0,0,'IMMEDIATE - XOR - EXCLUSIVE OR TO REGISTER' XOR =1,A TITL SINGLE REGISTER SHIFTS * * SINGLE REGISTER SHIFTS * * LEFT LOGICAL * TIME 0,0,'OV',OV TIME 0,0,'SHIFT LEFT 1 PLACE' SHIFT A,L,1 TIME  0,0,'OV',OV SHIFT A,L,1 TIME 0,0,'SHIFT 10 ADDITIONAL PLACES - SINGLE REGISTER' SHIFT A,L,11 * * LEFT LOGICAL THRU OV * TIME 0,0,'OV',OV TIME 0,0,'SHIFT LEFT W/OV 1 PLACE' SHIFT A,LO,1 * * LEFT ROTATE * TIME 0,0,'OV',OV TIME 0,0,'ROTATE LEFT 1 PLACE' ROTATE A,L,1 * * LEFT ROTATE THRU OV * TIME 0,0,'OV',OV TIME 0,0,'ROTATE LEFT W/OV 1 PLACE' ROTATE A,LO,1 * * RIGHT LOGICAL * TIME 0,0,'OV',OV TIME 0,0,'SHIFT RIGHT 1 PLACE' SHIFT A,R,1 * * RIGHT LOGICAL WITH OV * TIME 0,0,'OV',OV TIME 0,0,'SHIFT RIGHT W/OV 1 PLACE' SHIFT A,RO,1 * * RIGHT ROTATE *  TIME 0,0,'OV',OV TIME 0,0,'ROTATE RIGHT 1 PLACE' ROTATE A,R,1 * * ROTATE RIGHT THRU OV * TIME 0,0,'OV',OV TIME 0,0,'ROTATE RIGHT W/OV 1 PLACE' ROTATE A,RO,1 * * RIGHT ARITHMETIC * TIME  0,0,'OV',OV TIME 0,0,'ARITHMETIC SHIFT RIGHT 1 PLACE' SHIFT A,RA,1 TITL DOUBLE REGISTER SHIFTS * * DOUBLE REGISTER SHIFTS * TIME 0,0,'OV',OV TIME 0,0,'DOUBLE REG LEFT LOGICAL 1 PLACE' SHIFT AX,L,1 TIME 0,0,'OV',OV SHIFT AX,L,1 TIME 0,0,'SHIFT 10 ADDITIONAL PLACES - DOUBLE REGISTER'  SHIFT AX,L,11 * * DOUBLE REG - LEFT LOGICAL THRU OV * TIME 0,0,'OV',OV TIME 0,0,'DOUBLE REG LEFT LOGICAL THRU OV 1 PLACE' SHIFT AX,LO,1 * * DOUBLE REG - LEFT ROTATE * TIME 0,0,'OV',OV TIME 0,0,'DOUBLE REG LEFT ROTATE 1 PLACE' ROTATE AX,L,1 * * DOUBLE REG - LEFT ROTATE THRU OV * TIME 0,0,'OV',OV TIME 0,0,'DOUBLE REG LEFT ROTATE THRU OV 1 PLACE' ROTATE AX,LO,1 * * DOUBLE REG - RIGHT LOGICAL *  TIME 0,0,'OV',OV TIME 0,0,'DOUBLE REG RIGHT LOGICAL 1 PLACE' SHIFT AX,R,1 * * DOUBLE REG - RIGHT LOGICAL THRU OV * TIME 0,0,'OV',OV TIME 0,0,'DOUBLE REG RIGHT LOGICAL THRU OV 1 PLACE' SHIFT AX,RO,1 * * DOUBLE REG - RIGHT ROTATE * TIME 0,0,'OV',OV TIME 0,0,'DOUBLE REG RIGHT LOGICAL 1 PLACE'  SHIFT AX,R,1 * * DOUBLE REG - RIGHT ROTATE THRU OV * TIME 0,0,'OV',OV TIME 0,0,'DOUBLE REG RIGHT ROTATE THRU OV 1 PLACE' ROTATE AX,RO,1 * * DOUBLE REG - RIGHT ARITHMETIC * TIME 0,0,'OV',OV TIME 0,0,'DOUBLE REG RIGHT ARITHMETIC 1 PLACE' SHIFT AX,RA,1 TITL STACK OPERATIONS * * STACK OPERATIONS *  TIME 0,0,'OV',OV JST STKSET JST STKEND TIME 0,0,'PUSH - STORE REGISTERS ONTO STACK' JST STKSET PUSH 0 JST STKEND TIME 0,0,'OV',OV JST STKSET COPY =STKBOT,Q COPY Q,K COPY CELL0  ,Q COPY Q,L JST STKEND TIME 0,0,'POP - LOAD REGISTERS FROM STACK' JST STKSET COPY =STKBOT,Q  COPY Q,K COPY CELL0,Q COPY Q,L POP JST STKEND TITL CONDITIONAL JUMPS * * CONDITIONAL JUMPS * TIME 0,0,'OV',OV TIME 0,0,'JEQ - JUMP IF ZERO - JUMP OCCURS' JEQ A,MEMLC9 MEMLC9 TIME 1,0,'JEQ - JUMP IF ZERO - NO JUMP' JEQ A,MEMLCA MEMLCA TIME 1,0,'JNE - JUMP IF NON-ZERO - JUMP OCCURS' JNE A,MEMLCB MEMLCB TIME 0,0,'JNE - JUMP IF NON-ZERO - NO JUMP' JNE A,MEMLCC MEMLCC TIME 1,0,'JGT - JUMP IF > ZERO - JUMP OCCURS' JGT A,MEMLCD MEMLCD TIME 0,0,'JGT - JUMP IF > ZERO - NO JUMP'  JGT A,MEMLCE MEMLCE TIME 0,0,'JLE - JUMP IF < OR = ZERO - JUMP OCCURS' JLE A,MEMLCF MEMLCF TIME 1,0,'JLE - JUMP IF < OR = ZERO - NO JUMP' JLE A,MEMLCG MEMLCG TIME 0,0,'JGE - JUMP IF > OR = ZERO - JUMP OCCURS'  JGE A,MEMLCH MEMLCH TIME :FFFF,0,'JGE - JUMP IF > OR = ZERO - NO JUMP' JGE A,MEMLCI MEMLCI TIME  :FFFF,0,'JLT - JUMP IF < ZERO - JUMP OCCURS' JLT A,MEMLCJ MEMLCJ TIME 0,0,'JLT - JUMP IF < ZERO - NO JUMP'  JLT A,MEMLCK MEMLCK TIME :FFFF,0,'IJEQ - INCR & JUMP IF ZERO - INCR & JUMP' IJEQ A,MEMLCL MEMLCL TIME 1,0,'IJEQ - INCR & JUMP IF ZERO - INCR ONLY' IJEQ A,MEMLCM MEMLCM TIME 0,0,'IJNE - INCR & JUMP IF NON-ZERO - INCR & JUMP' IJNE A,MEMLCN MEMLCN TIME :FFFF,0,'IJNE - INCR & JUMP IF NON-ZERO - INCR ONLY' IJNE A,MEMLCO MEMLCO TIME 0,0,'JEQD - DECR & JUMP IF :FFFF - DECR & JUMP' JEQD A,MEMLCP MEMLCP TIME 2,0,'JEQD - DECR & JUMP IF :FFFF - DECR ONLY' JEQD A,MEMLCQ MEMLCQ TIME 1,0,'JNED - DECR & JUMP IF NOT :FFFF - DECR & JUMP' JNED A,MEMLCR MEMLCR TIME 0,0,'JNED - DECR & JUMP IF NOT :FFFF - DECR ONLY' JNED A,MEMLCS MEMLCS TIME 1,0,'OV',OV OUT A,0 DA=0, FL=0 TURN ON SENSE SWITCH TIME 1,0,'JT SS - JUMP OCCURS' OUT A,0 TURN ON SENSE SWITCH JT SS,MEMLCW MEMLCW TIME 0,0,'JT SS - NO JUMP' OUT A,0 TURN OFF SENSE SWITCH JT SS,MEMLCX MEMLCX TIME 0,0,'JF SS - JUMP OCCURS' OUT A,0 TURN OFF SENSE SWITCH JF SS,MEMLCY MEMLCY TIME 1,0,'JF SS - NO JUMP' OUT A,0 TURN ON SENSE SWITCH  JF SS,MEMLC4 MEMLC4 TIME :170,0,'OV',OV COPY A,S TIME :172,0,'JT OV - JUMP OCCURS' COPY A,S JT OV,MEMLC5 MEMLC5 TIME :170,0,'JT OV - NO JUMP' COPY A,S JT OV,MEMLC6 MEMLC6 TIME :170,0,'JF OV - JUMP OCCURS' COPY A,S JF OV,MEMLC7 MEMLC7 TIME :172,0,'JF OV - NO JUMP'  COPY A,S JF OV,MEMLC8 MEMLC8 TIME :171,0,'JT CY - JUMP OCCURS' COPY A,S JT CY,MEMLC1 MEMLC1 TIME :170,0,'JT CY - NO JUMP' COPY A,S JT CY,MEMLC2 MEMLC2 TIME :170,0,'JF CY - JUMP OCCURS' COPY A,S JF CY,MEMLC3 MEMLC3 TIME :171,0,'JF CY - NO JUMP' COPY A,S J  F CY,EXTEN EXTEN TIME:INC TITL EXTENDED ADDRESSING MODE INSTRUCTIONS * * EXTENDED INSTRUCTIONS * ENDB1  WORD CELLM CELLM WORD 0 TIME 0,0,'OV',OV ADDC CELL3,Q TIME 0,0,'EXTENDED - RELATIVE BACKWARDS' ADDC CELLM,Q TIME 0,0,'EXTENDED - RELATIVE BACKWARDS - INDIRECT 1 LEVEL' ADDC *ENDB1,Q  TIME 0,0,'EXTENDED - RELATIVE FORWARDS' ADDC CELLN,Q TIME 0,0,'EXTENDED - RELATIVE FORWARDS - INDIRECT 1 LEVEL' ADDC *ENDF1,Q TIME:INC ENDF1 WORD CELLN CELLN WORD 0 TIME 0,0,'EXTENDED - POST INDEXED' ADDC CELL3(X),Q TIME 0,0,'EXTENDED - POST INDEXED INDIRECT' ADDC *SIND1(X),Q  TIME 0,0,'OV',OV COPY CELL0,Y ADDC CELL3,Q TIME 0,0,'EXTENDED - PRE INDEXED'  COPY CELL0,Y ADDC CELL3(Y),Q TIME 0,0,'EXTENDED - PRE INDEXED INDIRECT' COPY CELL0,Y  ADDC *SIND1(Y),Q TIME 0,0,'EXTENDED - PRE AND POST INDEXED' COPY CELL0,Y ADDC CELL3(X,Y),Q  TIME 0,0,'EXTENDED - PRE AND POST INDEXED INDIRECT' COPY CELL0,Y ADDC *SIND1(X,Y),Q TIME  0,0,'OV',OV TIME 0,0,'EXTENDED - COPYE - LOAD ' COPYE CELL3,Q TIME 0,0,'EXTENDED - COPYE - STORE ' COPYE A,CELL3 TIME 0,0,'EXTENDED - ADD ' ADDE CELL0,A TIME 0,0,'EXTENDED - SUBTRACT ' SUBE CELL0,A TIME 0,0,'EXTENDED - EXCHANGE ' EXCHE A,CELL3 TIME 0,0,'CEA - COMPUTE EFFECTIVE ADDRESS' CEA CELL0,A TIME 0,0,'EXTENDED AND' ANDE CELL0,A TIME 0,0,'EXTENDED OR' ORE CELL0,A TIME 0,0,'EXTENDED XOR' XORE CELL0,A TIME 0,0,'ADDC - ADD WITH CARRY' ADDC CELL2,A TIME 0,0,'SUBC - SUB WITH CARRY' SUBC CELL0,A TIME 0,0,'CSME - REG < MEM CELL - NO SKIP' CSME A,CELL1 TIME 2,0,'CSME - REG > MEM CELL - SKIP + 1' CSME A,CELL0 HLT TIME 0,0,'CSME - REG = MEM CELL - SKIP + 2' CSME A,CELL0 HLT HLT  TIME 0,0,'CSKE - REG < MEM CELL - NO SKIP' CSKE A,CELL2 TIME 2,0,'CSKE - REG > MEM CELL - SKIP + 1' CSKE A,CELL0 HLT TIME 0,0,'CSKE - REG = MEM CELL - SKIP + 2' CSKE A,CELL0 HLT HLT TIME 0,0,'EXTENDED - JUMP' JMPE EX EX TIME 0,0,'OV',OV JMP *J1 J1  WORD J2 J2 JMP J3 J3 NOP TIME 0,0,'EXTENDED JUMP & STORE ' JSTE J4 JMP J5 J4 ENT JMP *J4 J5 NOP TIME 0,0,'OV',OV COPY A,CELL3 TIME :FFFF,0,'EXTENDED IMS - INCREMENT AND SKIP' COPY A,CELL3 IMSE CELL3 HLT TIME 1,0,'EXTENDED IMS - INCREMENT ONLY' COPY A,CELL3 IMSE CELL3 TIME 0,0,'OV',OV TIME 0,0,'MUL - MULTIPLY MEMORY BY REGS' MUL CELL1,AX TIME 0,0,'DIV - DIVIDE REGS BY MEMORY' DIV CELL1,AX TIME 0,0,  'OV',OV JST STKSET NOP JST STKEND TIME 0,0,'EXTENDED JUMP & STACK' JST STKSET JSKE SUB4 SUB4  NOP JST STKEND TIME 0,0,'OV',OV COPY A,CELL3 TIME 0,0,'EXTENDED DMS - DECREMENT AND SKIP'  COPY A,CELL3 DMSE CELL3 HLT TIME 5,0,'EXTENDED DMS - DECREMENT ONLY' COPY A,CELL3 DMSE CELL3 * * DOUBLE-LOAD AND DOUBLE STORE * TIME 0,0,'OV',OV TIME 0,0,'EXTENDED - DOUBLE LOAD ' COPYE STKBOT,AQ TIME 0,0,'EXTENDED - DOUBLE STORE' COPYE AQ,STKBOT TITL TRAP INSTRUCTIONS * * TRAP OVERHEAD * TIME 0,0,'OV',OV JST TRAPSET JMP *L1 FORCE AN INDIRECT JUMP L2 SIN 1 NOP JST TRAPSET TIME:INC L1 WORD L2 SET1 WORD :9F80 SET2 WORD CONTIN SET3 WORD :9F80 SET4 WORD T1 * * UTRAP - USER TRAP * TIME 0,0,'UTRAP - USER TRAP' JST TRAPSET UTRAP A,0 CONTIN SIN  1 NOP JST TRAPSET * * STRAP - SYSTEM TRAP * TIME 0,0,'STRAP - SYSTEM TRAP' JST TRAPSET STRAP A,0 T1 SIN 1 NOP JST TRAPSET TITL STATUS CHANGE INSTRUCTIONS * * STATUS CHANGE * TIME  0,0,'OV',OV TIME 0,0,'SBIT - SET GENERAL PURPOSE REGISTER BIT' SBIT 0,A TIME 0,0,'RBIT - RESET GENERAL PURPOSE REGISTER BIT' RBIT 0,A TIME 0,0,'CBIT - COMPLEMENT GENERAL PURPOSE REGISTER BIT'  CBIT 0,A TIME 0,0,'TBIT - TRANSFER GENERAL PURPOSE REG. BIT TO OV' TBIT 0,A TIME 0,0,'SBIT - STATUS REGISTER' SBIT 1,S TIME 0,0,'RBIT - STATUS REGISTER' RBIT 1,S TIME 0,0,'CBIT - STATUS REGISTER' CBIT 1,S TIME 0,0,'TBIT - STATUS REGISTER' TBIT 0,S TIME 0,0,'OV',OV NOP TIME 0,0,'SIN - STATUS INHIBIT' SIN  1 NOP TITL FLOATING POINT INSTRUCTIONS * * FLOATING POINT * TIME 0,0,'OH',OV COPY CELF5,A COPY CELF6,Q TIME 0,0,'FLOATING POINT - FIX' COPY CELF5,A COPY CELF6,Q  FIX TIME 0,0,'OH',OV COPY CELF7,A COPY CELF8,Q TIME 0,0,'FLOATING POINT - FLOAT' COPY CELF7,A COPY CELF8,Q FLOAT TIME 0,0,'OH',OV COPY CELF1,A COPY CELF2,Q TIME 0,0,'FLOATING POINT - ADD - NO ALIGN' COPY CELF1,A COPY CELF2,Q ADDF  FLOAT1 TIME 0,0,'FLOATING POINT - ADD - ALIGN ACC 1' COPY CELF1,A COPY CELF2,Q ADDF  FLOAT2 TIME 0,0,'FLOATING POINT - ADD - ALIGN ACC 11' COPY CELF1,A COPY CELF2,Q ADDF FLOAT3 TIME 0,0,'FLOATING POINT - ADD - NO ALIGN - DIFFERENT SIGNS' COPY CELFB,A COPY CELF2,Q ADDF FLOAT1 TIME 0,0,'FLOATING POINT - SUB - NO ALIGN' COPY CELF1,A COPY CELF2,Q  SUBF FLOAT1 TIME 0,0,'FLOATING POINT - SUB - ALIGN ACC 1' COPY CELF1,A COPY CELF2,Q  SUBF FLOAT2 TIME 0,0,'FLOATING POINT - SUB - ALIGN ACC 11' COPY CELF1,A COPY CELF2,Q   SUBF FLOAT3 TIME 0,0,'FLOATING POINT - SUB - NO ALIGN - DIFFERENT SIGNS' COPY CELFB,A COPY CELF2,Q SUBF FLOAT1 TIME 0,0,'OH',OV COPY CELF3,A COPY CELF4,Q TIME  0,0,'FLOATING POINT - MULTIPLY' COPY CELF3,A COPY CELF4,Q MULF FLOAT4 TIME 0,0,'FLOATING POINT - DIVIDE' COPY CELF3,A COPY CELF4,Q DIVF FLOAT5 TIME 0,0,'OH',OV  COPY CELF9,A COPY CELFA,Q TIME 0,0,'FLOATING POINT - COMPARE LESS THAN' COPY CELF9,A  COPY CELFA,Q CSKF FLOAT6 TIME 0,0,'FLOATING POINT - COMPARE GREATER THAN' COPY CELF9,A  COPY CELFA,Q CSKF FLOAT7 HLT TIME 0,0,'FLOATING POINT - COMPARE EQUAL' COPY CELF9,A COPY CELFA,Q CSKF FLOAT8 HLT HLT TIME:INC TIME:END TITL DATA * * DATA * STATUS WORD :170 STKSET ENT COPY K,Q COPY Q,SAVEK COPY L,Q COPY Q,SAVEL COPY =STKTOP,Q COPY Q,K COPY X,L JMP *STKSET STKEND ENT COPY STATUS,Q COPY Q,S COPY SAVEK,Q COPY Q,K COPY SAVEL,Q COPY Q,L JMP *STKEND TRAPSET ENT COPY SET1,A EXCH A,:A2 COPY A,SET1 COPY SET2,A EXCH A,:A3 COPY A,SET2 COPY SET3,A EXCH A,:A6 COPY A,SET3 COPY SET4,A EXCH A,:A7 COPY A,SET4 JMP *TRAPSET ABS :6 SIND2 WORD SIND1;:8000 SIND1 WORD CELL3 CELL0 WORD 0 CONTENTS DO NOT CHANGE CELL1 WORD 1 CONTENTS DO NOT CHANGE CELL2 WORD 2 CONTENTS DO NOT CHANGE CELL3 WORD 0  CONTENTS MAY BE CHANGED CELL4 WORD LOC0 TITL DATA - FLOATING POINT ABS :2200 TO FORCE THE SAME ADDRESSING MODES FOR TEST LOOPS CELF1 WORD :5144 CELF2 WORD :3D4E FLOAT1 WORD :511E WORD :FB4C FLOAT2 WORD :519E WORD :FB4C FLOAT3 WORD :569E WORD :FB4C CELF3 WORD :487E CELF4 WORD :DC00 FLOAT4 WORD :C85E WORD :AD00 FLOAT5 WORD :D05D WORD :AF03 CELF5 WORD :4FFF CELF6 WORD :FFFF CELF7 WORD :7FFF CELF8 WORD :FF80 CELF9 WORD :0000 CELFA WORD :0000 FLOAT6 WORD :0000 WORD :0001 FLOAT7  WORD :8000 WORD :0001 FLOAT8 WORD :0000 WORD :0000 CELFB WORD :D144 END AL' COPY CELF9,A COPY CELFA,Q CSKF FLOAT8 HLT HLT TIME:INC TIME:END TITL DATAJTIME:ST O0SEGMENTBLANK oKCNT:HIGHCNT:LOW TM:RTN ig , LS I 4/95 BASIC INSTRUCTION SET ߅~߄|ttt!&&OV&,@, %'r{qyp466 BYTE MODE - RELATIVE BACKWARDS6JJ %2'T{SyRRSS BYTE MODE - RELATIVE FORWARDS Sgg %'7{6y5%ossOVsy@y g%'e#y"w! 2BYTE MODE - RE LATIVE BACKWARDS - INDIRECT 1 LEVEL  g%L'e߅y߄wttt 0BYTE MODE - RE LATIVE FORWARDS - INDIRECT 1 LEVEL g%'eZyYwX  OV@ %~'H{GyF BYTE MODE - POST INDEXED %'.{-y,OV @  g%~'eyw &BYTE MODE - SC RATCH - INDIRECT 1 LEVEL.. g%'e߅y߄wttt8== "BYTE MODE - PO ST INDEXED INDIRECT =SS g%'e`y_w^]^^ OV^d@d `%~'PzOxNmnn BYTE MODE - PRE INDEXED n `%A'5z4x3 &BYTE MODE - PR E INDEXED & POST INDEXED `%'zxOV@ `g%~'ex߃vtt BYTE MODE - PR E INDEXED INDIRECT `g%G'e߅x`v_t .BYTE MODE - PR E INDEXED INDIRECT POST INDEXED  `g%'e\x7v6  OV @%'N|)z( BYTE MODE - CO PYB MEMORY TO REG ,, %'0{ y 466 BYTE MODE - CO PYB REG TO MEMORY 6KK %'{߃yttSWW BYTE MODE - ADDB MEMORY TO REGWkk %'߅{cybtsvv "BYTE MODE - EX CHB MEMORY WITH REG v %'d{ByA BYTE MODE - ANDB MEMORY TO REG %'F{$y# BYTE MODE - OR B MEMORY WITH REG  %''{y BYTE MODE - XO RB MEMORY WITH REG %'{߃ytt *BYTE MODE - CS KB - REG < MEMORY - NO SKIP  %'߅{]y\t *BYTE MODE - CS KB - REG > MEMORY - SKIP + 133 % '_z7x6<>> *BYTE MODE - CS KB - REG = MEMORY - SKIP + 2>XX %  '9ywefbggOVgm@m (}{ tsvv RELATIVE BACKWARDSva}߃{ktOH@ g e{sy[ &RELATIVE BACKW ARDS - INDIRECT 1 LEVEL  g0e߅{Ry:t &RELATIVE BACKW ARDS - INDIRECT 2 LEVELS g ec{0yOH@ V}#{  RELATIVE FORWARDS A}{tOH@ g e0{߄yp t $RELATIVE FORWA RD - INDIRECT 1 LEVEL ** ge{byN244 $RELATIVE FORWA RD - INDIRECT 2 LEVELS4KK ge߅{Ay-tWXSYYOVY_@_ s}/{effOHfl@l g ed{ y tuu SCRATCH - INDIRECT 1 LEVELu geI{yt SCRATCH - INDIRECT 2 LEVELS  ge+{߃yctOH @ }t{T  POST INDEXED }a{AOV@` ߅|Sz3t PRE-INDEXED `Kq|?z PRE-INDEXED & POST-INDEXED`W|%z   OV @ g eH{yt INDIRECT POST-INDEXED ,, ge.{߃ygt466OV6<@< `g ezrxV EGG PRE-INDEXED INDIRECTGVV `gGezXx<_`` &PRE-INDEXED -  INDIRECT - POST-INDEXED `xx `ge߅z6xt OV@x~)|  COPY MEMORY TO REG  b}{ t COPY REG TO MEMORY  J}߃{jt ADD - ADD MEMORY TO REG 1}j{Q SUB - SUBTRACT MEMORY FROM REG }O{6 EXCH - EXCHANG E MEMORY WITH REG  ߅}3{t  AND - AND MEMORY TO REG   k}{t&(( "OR - INCLUSI VE OR MEMORY TO REG (>> M}߄{c tDGG "XOR - EXCLUSI VE OR MEMORY TO REG G]] .}e{Dcdd CSK - REG < MEMORY - NO SKIP dxx }J{)~ CSK - REG > MEMORY - SKIP + 1  ߆|.z t CSK - REG = MEMORY - SKIP + 2   g{ytOV@Y}{s JMP - UNCONDITIONAL JUMP ?|߃zYtOV@.zrxH "JST - JUMP & S TORE PROGRAM COUNTER    ~ yQw'OV@ ߆}D{ t ## (IMS - INCR ME MORY & SKIP IF ZERO - SKIP#<<  b{ ytDFF ,IMS - INCR ME MORY & SKIP IF ZERO - NO SKIP Faa >|߃z]thssOVsy@y %{jyD JSK - JUMP & STACK om zPx*OV@߅~D|t COPY - COPY REG TO REG  l}+{ NEG - NEGATE REG TO REG T}{t ADD - ADD REG TO REG  <}߃{it SUB - SUBTRACT REG FROM REG !}h{N    AND - AND REG TO REG    }Q{7"## OR - INCLUSIVE OR REG TO REG#77 ߅}6{t=?? XOR - EXCLUSIVE OR REG TO REG?SS i}{YZZ CSN REG-REG - NO SKIP Zjj R}{tprr  CSN REG-REG - SKIP + 1r  9|߃zht CSK REG-REG - NO SKIP +!}k{P CSK REG-REG - SKIP + 1+ |Sz8 CSK REG-REG - SKIP + 2 +  ߅{:yt EXCH - EXCHANGE REG WITH REG j}{ "COMP - 1'S COM PLEMENT REG TO REG   N}{t    CSM - REG-REG - NO SKIP    &5}߃{ht " $ $ CSM - REG-REG - SKIP + 1 $ 5 5& |izN < = = CSM - REG-REG - SKIP + 2 = N N &  {Oy4 V W WOV W ]@ ]߅~C|(t b d d FMT - FETCH MACHINE TYPE  d v vk}){ | } } UIS - UPDATE INTERRUPT STATUS }   P}{t   OV  @ B}{s    XNX - INDEX NEXT INSTRUCTION     &|߃zWt   OH  @  `p@yqwE     RSK - RETURN THROUGH STACK     i`p@# e߅xOv#t    OV  @ w~A|    OUT - OUTPUT REGISTER   `}*{t    IN - INPUT TO REGISTER  - -G}{h 3 4 4 SELP - SELECT AND PRESENT  4 F F.}߃{Ot L N N SST - SENSE & SKIP IF TRUE  N a a}h{4 g h hOV h n@ n~\|( s t t &IMMEDIATE - CO PY - LOAD BYTE NEGATIVE  t  ߅}={ t    &IMMEDIATE - CO PY - LOAD BYTE POSITIVE     e}{t    IMMEDIATE - SU B - SUBTRACT BYTE    H}{d    IMMEDIATE - ADD - ADD BYTE     .}߃{Jt    *IMMEDIATE - CL SN - COMPARE EQUAL - NO SKIP     }a{(    .IMMEDIATE - CL SN - COMPARE EQUAL - SKIP OCCURS  ( ( ߅|=zt / 1 1 *IMMEDIATE - CS K - COMPARE 3 WAY - NO SKIP 1 K K c}{t Q S S ,IMMEDIATE - CS K - COMPARE 3 WAY - SKIP + 1  S n n  ?|߃z]t u w w ,IMMEDIATE - CS K - COMPARE 3 WAY - SKIP + 2  w     {^y8    "IMMEDIATE - AN D - AND TO REGISTER   ߅}A{t    ,IMMEDIATE - OR - INCLUSIVE OR TO REGISTER    b}{t    ,IMMEDIATE - XO R - EXCLUSIVE OR TO REGISTER    ?}߃{^t   OV  @ 2~v|Q    SHIFT LEFT 1 PLACE    }`{;  ! !OV ! '@ '}S{. - . . .SHIFT 10 ADDI TIONAL PLACES - SINGLE REGISTER  . J J߅} 0{ t P R ROV R X@ Xx~#|t ] _ _ SHIFT LEFT W/OV 1 PLACE _ p p_} {h v w wOV w }@ }S~߃|\t    ROTATE LEFT 1 PLACE    <}l{E   OV  @ 0~`|9    ROTATE LEFT W/OV 1 PLACE   }H{!   OV  @  ~<|    SHIFT RIGHT 1 PLACE   ߅}&{tt   OV  @ w~|t    SHIFT RIGHT W/OV 1 PLACE     ^}߃{[t   OV  @ Q~v|N    ROTATE RIGHT 1 PLACE  # # ;}`{8 ) * *OV * 0@ 0/~T|, 5 6 6 ROTATE RIGHT W/OV 1 PLACE  6 H H };{ N O OOV O U@ U ~/| Z [ [ ARITHMETIC SHIFT RIGHT 1 PLACE [ o o ߅}{tt u x xOV x ~@ ~w~|t    DOUBLE REG LEF T LOGICAL 1 PLACE    /[}߃{Xt   OV  @ /M}u{J    ,SHIFT 10 ADDIT IONAL PLACES - DOUBLE REGISTER   /+}S{(   OV  @ ~G|    (DOUBLE REG LEF T LOGICAL THRU OV 1 PLACE    /߅}'{tt   OV @w~|t    DOUBLE REG LEFT ROTATE 1 PLACE /\}߃{Yt$&&OV&,@,O~v|L122 &DOUBLE REG LEF T ROTATE THRU OV 1 PLACE2JJ/0}W{-PQQOVQW@W$~K|!\]] DOUBLE REG RIG HT LOGICAL 1 PLACE]rr/}/{xyyOVy@߅~#|tt (DOUBLE REG RIG HT LOGICAL THRU OV 1 PLACE/ c}{`OV@W~߃|Tt DOUBLE REG RIG HT LOGICAL 1 PLACE/:}f{7OV@.~Z|+ (DOUBLE REG RIG HT ROTATE THRU OV 1 PLACE / }:{ OV@~.|t   $DOUBLE REG RIG HT ARITHMETIC 1 PLACE    / ߅}{bt&((OV(.@.v|zS588 "PUSH - STORE R EGISTERS ONTO STACK 8NN gC eTz߃x1tWYYOVY_@_ VŠp@P@RAxpvjjmm POP - LOAD RE GISTERS FROM STACKm 3gp@P@c .wLutOV@~?|t "JEQ - JUMP IF ZERO - JUMP OCCURS @߅}"{Wt JEQ - JUMP IF ZERO - NO JUMP @i}{;  &JNE - JUMP IF NON-ZERO - JUMP OCCURS J}߃{t "JNE - JUMP IF NON-ZERO - NO JUMP   ,}e{t $JGT - JUMP IF > ZERO - JUMP OCCURS **@ }F{b011 JGT - JUMP IF > ZERO - NO JUMP 1FF@߅}*{FtLNN (JLE - JUMP IF < OR = ZERO - JUMP OCCURSNggd} {%mnn $JLE - JUMP IF < OR = ZERO - NO JUMPnF}߃{t (JGE - JUMP IF > OR = ZERO - JUMP OCCURS@%}b{t $JGE - JUMP IF > OR = ZERO - NO JUMP@}C{b $JLT - JUMP IF < ZERO - JUMP OCCURS ߅}%{Dt  JLT - JUMP IF < ZERO - NO JUMP h}{' (IJEQ - INCR &  JUMP IF ZERO - INCR & JUMP  @H}߃{t&(( &IJEQ - INCR &  JUMP IF ZERO - INCR ONLY(@@@(}c{tFHH ,IJNE - INCR &  JUMP IF NON-ZERO - INCR & JUMPHcc}@{^ijj *IJNE - INCR &  JUMP IF NON-ZERO - INCR ONLYj߅}{=t *JEQD - DECR &  JUMP IF :FFFF - DECR & JUMP @c}߃{t (JEQD - DECR &  JUMP IF :FFFF - DECR ONLY @B}b{t .JNED - DECR &  JUMP IF NOT :FFFF - DECR & JUMP }>{] ,JNED - DECR &  JUMP IF NOT :FFFF - DECR ONLY   ߅}{;tOV@w}{-!"" JT SS - JUMP OCCURS "11@`|߃zt8:: JT SS - NO JUMP :GG@J|mzNOO JF SS - JUMP OCCURS O^^3|Vztegg JF SS - NO JUMP gtt|@zk{||pOV|@0}3{^ rJT OV - JUMP OCCURS 06@߅|zGt pJT OV - NO JUMP 06@o|z1 pJF OV - JUMP OCCURS 06X|߃zt rJF OV - NO JUMP 06B|mz qJT CY - JUMP OCCURS 0V@+|Vzt pJT CY - NO JUMP 0V@|@zk pJF CY - JUMP OCCURS 0V߅|)zTt&(( qJF CY - NO JUMP (550Vo|z>><??OV?E@EG _|z.LMM EXTENDED - RELATIVE BACKWARDS MaaGC|߃zthjj 0EXTENDED - REL ATIVE BACKWARDS - INDIRECT 1 LEVELjG|]zt EXTENDED - RELATIVE FORWARDSG-|Aze 0EXTENDED - REL ATIVE FORWA RDS - INDIRECT 1 LEVEL G߅|z@t EXTENDED - POST INDEXED G" i|z$ EXTENDED - POS T INDEXED INDIRECTGbL|߃zt  OV @ G <{syt EXTENDED - PRE INDEXED++ G !{Xyg344 EXTENDED - PRE INDEXED INDIRECT 4II GR{:yIQRR EXTENDED - PRE AND POST INDEXED Rgg G2 ߅{y+toqq (EXTENDED - PRE AND POST INDEXED INDIRECTq Grb{߃ytOV@U~v|t EXTENDED - COPYE - LOAD G ;|\zg EXTENDED - COPYE - STORE  !|BzM EXTENDED - ADD   |-z8 EXTENDED - SUBTRACT  ߅|z!t EXTENDED - EXCHANGE  m|߃z t CEA - COMPUTE EFFECTIVE ADDRESS..O|ezt577 EXTENDED AND7BB;|QzmIJJ EXTENDED OR JUU'(|>zZ\]] EXTENDED XOR]hh|+zGopp ADDC - ADD WITH CARRY p ߅|z/t SUBC - SUB WITH CARRY 'l|߃zt CSME - REG < M EM CELL - NO SKIP  N|ezt  CSME - REG > M EM CELL - SKIP + 1  /{Fyb CSME - REG = M EM CELL - SKIP + 2   z'xC CSKE - REG < M EM CELL - NO SKIP ' ߅| z&t  CSKE - REG > M EM CELL - SKIP + 100 ' f{߃yt8::  CSKE - REG = M EM CELL - SKIP + 2:OO '  FzcxtXZZ EXTENDED - JUMP Zgg0|MzknooOVou@uw z=x[~ EXTENDED JUMP & STORE  ' ~x!v?OV@ ߆}{2 t "EXTENDED IMS - INCREMENT AND SKIP  G  dz߃xt EXTENDED IMS - INCREMENT ONLY  G F{eytOV@9~X|t MUL - MULTIPLY MEMORY BY REGS  ' |> EXTENDED JUMP & STACK >NN liiy߃wtXZZOVZ`@` [}u{ fhh "EXTENDED DMS - DECREMENT AND SKIP h~~ g  :zTxt  EXTENDED DMS - DECREMENT ONLY  g {6ycOV@~*|W EXTENDED - DOUBLE LOAD G߅|z>t EXTENDED - DOUBLE STORE Gk|߃z$tOV@ Yyqw) UTRAP - USER TRAP    jf9yQwt STRAP - SYSTEM TRAP '' OKy6wf122OV28@8~*|Z=>> (SBIT - SET GE NERAL PURPOSE REGISTER BIT>WW ߅} {:t]__ *RBIT - RESET  GENERAL PURPOSE REGISTER BIT_yy c}߃{t 0CBIT - COMPLE MENT GENERAL PURPOSE REGISTER BIT >}^{t 0TBIT - TRANSF ER GENERAL PURPOSE REG. BIT TO OV }9{\ SBIT - STATUS REGISTER}"{E RBIT - STATUS REGISTER߅} {.t CBIT - STATUS REGISTER  m}߃{t TBIT - STATUS REGISTER!!U}k{t'))OV)/@/G}]{s566 SIN - STATUS INHIBIT6FF/|Ez[MNNOHNT@T Ç!|7zM""[^^ FLOATING POINT - FIX^mm nn {y3uvvOHv|@| Ç߇|z%""t FLOATING POINT - FLOAT ll k{߃y tOH@ Ç\|tz""t FLOATING POINT - ADD - NO ALIGN  gg\":zRxa "FLOATING POINT - ADD - ALIGN ACC 1 GG\"z2xA $FLOATING POINT - ADD - ALIGN ACC 11  &&\"߅zx t 2FLOATING POINT - ADD - NO ALIGN - DIFFERENT SIGNS 11 È\"\z߄x"tt":?? FLOATING POINT - SUB - NO ALIGN ?TT e\"9zax`"]__ "FLOATING POINT - SUB - ALIGN ACC 1_uu hD\"z@x?~ $FLOATING POINT - SUB - ALIGN ACC 11  G#\"߅zxt 2FLOATING POINT - SUB - NO ALIGN - DIFFERENT SIGNS  Ë\"\z߃xtt""OH@ ÇJ|qzp""  FLOATING POINT - MULTIPLY  kk\" ,zSxR FLOATING POINT - DIVIDE    PP\" z8x7OH@ Ç|*z)""!$$ "FLOATING POINT - COMPARE LESS THAN$:: gg\"߅zxtCEE &FLOATING POINT - COMPARE GREATER THAN E]] DD\" ay߃wt tgjj FLOATING POINT - COMPARE EQUALj~~ ##\"  ?xav` p @pǜ@PǛ›p@P w  t0@Òp@ÑP@x  rqrpi d " QD=NQLQLVLH~^ ]OD GG\"z2xA $FLOATING POINT - ADD - ALIGN ACC 11  &&\"߅zx t 2FLOATING POINT - ADD - NO ALIGN - OVicEdDano7+A*A:˂C:# OCPZ2P!_E # 0VE # 1 L G BC f-/-+(M )) (:EO :qBOZ20W ׂܞ~ևуU@ WԆ1ˎۿ҃qYtU $6' ޕޏ%e ;VWv tiuj( ' 킦_) B)-%' ߂)/+=׆Ղ΃L,0) RSTQRUSk%', ).޺t޹Z.%ޯ'<p0 1AIPⲢ@+Uޢ⬞+B+k++A+k@W  }`p0 0 5 5 .0 LSI-4/95 TIMING TEST PROGRAM (A000)0 REAL-TIME-CLOCK SHOULD BE SET TO TTLF  0000.000 MICROSEC - I/O ERROR(0 LSI-4/95 TIMING PROGRAM....END PARAMETER ERROR DOCUMENTATION NOT FOUNDPP , LSI 4/95 BASIC INSTRUCTION SET ߅~߄|ij{!&&OV&,@, %'r{qyp466BYTE MODE - RELATIVE BACKWARDS6JJ %2'T{SyRRSSBYTE MODE - RELATIVE FORWARDS Sgg %'7{6y5%ossOVsy@y g%'e#y"w!2BYTE MODE - RELATIVE BACKWARDS - INDIRECT 1 LEVEL  g%L'e߅y߄wij{0BYTE MODE - RELATIVE FORWARDS - INDIRECT 1 LEVEL g%'eZyYwXOV@ %~'H{GyFBYTE MODE - POST INDEXED %'.{-y,OV @  g%~'eyw&BYTE MODE - SCRATCH - INDIRECT 1 LEVEL.. g%'e߅y߄wij{8=="BYTE MODE - POST INDEXED INDIRECT =SS g%'e`y_w^]^^ OV^d@d `%~'PzOxNmnn BYTE MODE - PRE INDEXED n `%A'5z4x3 &BYTE MODE - PRE INDEXED & POST INDEXED `%'zxOV@ `g%~'ex߃vj{ BYTE MODE - PRE INDEXED INDIRECT `g%G'e߅x`v_i.BYTE MODE - PRE INDEX ED INDIRECT POST INDEXED  `g%'e\x7v6  OV @%'N|)z( BYTE MODE - COPYB MEMORY TO REG ,, %'0{ y 466 BYTE MODE - COPYB REG TO MEMORY 6KK %'{߃yj{SWWBYTE MODE - ADDB MEMORY TO REGWkk %'߅{cybisvv"BYTE MODE - EXCHB MEMORY WITH REG v %'d{ByABYTE MODE - ANDB MEMORY TO REG %'F{$y# BYTE MODE - ORB MEMORY WITH REG  %''{y BYTE MODE - XORB MEMORY WITH REG %'{߃yj{*BYTE MODE - CSKB - REG < MEMORY - NO SKIP  %'߅{]y\i*BYTE MODE - CSKB - REG > MEMORY - SKIP + 133 % '_z7x6<>>*BYTE MODE - CSKB - REG = MEMORY - SKIP + 2>XX %  '9ywefbggOVgm@m (}{ {svvRELATIVE BACKWARDSva}߃{kjOH@ g e{sy[&RELATIVE BACKWARDS - INDIRECT 1 LEVEL  g0e߅{Ry:i&RELATIVE BACKWARDS - INDIRECT 2 LEVELS g ec{0yOH@ V}#{ RELATIVE FORWARDS A}{{OH@ g e0{߄yp j$RELATIVE FORWARD - INDIRECT 1 LEVEL ** ge{byN244$RELATIVE FORWARD - INDIRECT 2 LEVELS4KK ge߅{Ay-iWXSYYOVY_@_ s}/{effOHfl@l g ed{ y tuuSCRATCH - INDIRECT 1 LEVELu geI{y{SCRATCH - INDIRECT 2 LEVELS  ge+{߃ycjOH@ }t{T  POST INDEXED }a{AOV@` ߅|Sz3i PRE-INDEXED `Kq|?zPRE-INDEXED & POST-INDEXED`W|%z   OV @ g eH{y{INDIRECT POST-INDEXED ,, ge.{߃ygj466OV6<@< `g ezrxV EGGPRE-INDEXED INDIRECTGVV `gGezXx<_``&PRE-INDEXED - INDIRECT - POST-INDEXED `xx `ge߅z6xi OV@x~)|  COPY MEMORY TO REG  b}{ { COPY REG TO MEMORY  J}߃{jj  ADD - ADD MEMORY TO REG 1}j{Q SUB - SUBTRACT MEMORY FROM REG }O{6 EXCH - EXCHANGE MEMORY WITH REG  ߅}3{i AND - AND MEMORY TO REG   k}{{&(("OR - INCLUSIVE OR MEMORY TO REG (>> M}߄{c jDGG"XOR - EXCLUSIVE OR MEMORY TO REG G]] .}e{DcddCSK - REG < MEMORY - NO SKIP dxx }J{)~CSK - REG > MEMORY - SKIP + 1  ߆|.z iCSK - REG = MEMORY - SKIP + 2   g{y{OV@Y}{sJMP - UNCONDITIONAL JUMP ?|߃zYjOV@.zrxH"JST - JUMP & STORE PROGRAM COUNTER    ~ yQw'OV@ ߆}D{ i ##(IMS - INCR MEMORY & SKIP IF ZERO - SKIP#<<  b{ y{DFF,IMS - INCR MEMORY & SKIP IF ZERO - NO SKIP Faa >|߃z]jhssOVsy@y %{jyDJSK - JUMP & STACK om zPx*OV@߅~D|i COPY - COPY REG TO REG  l}+{NEG - NEGATE REG TO REG T}{{ ADD - ADD REG TO REG  <}߃{ij SUB - SUBTRACT REG FROM REG !}h{N   AND - AND REG TO REG    }Q{7"##OR - INCLUSIVE OR REG TO REG#77 ߅}6{i=??XOR - EXCLUSIVE OR REG TO REG?SS i}{YZZCSN REG-REG - NO SKIP Zjj R}{{prrCSN REG-REG - SKIP + 1r  9|߃zhjCSK REG-REG - NO SKIP +!}k{PCSK REG-REG - SKIP + 1+ |Sz8CSK REG-REG - SKIP + 2 +  ߅{:yi EXCH - EXCHANGE REG WITH REG j}{"COMP - 1'S COMPLEMENT REG TO REG   N}{{   CSM - REG-REG - NO SKIP    &5}߃{hj " $ $CSM - REG-REG - SKIP + 1 $ 5 5& |izN < = =CSM - REG-REG - SKIP + 2 = N N &  {Oy4 V W WOV W ]@ ]߅~C|(i b d dFMT - FETCH MACHINE TYPE  d v vk}){ | } }UIS - UPDATE INTERRUPT STATUS }   P}{{    OV  @ B}{s   XNX - INDEX NEXT INSTRUCTION     &|߃zWj   OH  @  `p@yqwE    RSK - RETURN THROUGH STACK     i`p@# e߅xOv#i    OV  @ w~A|   OUT - OUTPUT REGISTER   `}*{{   IN - INPUT TO REGISTER  - -G}{h 3 4 4SELP - SELECT AND PRESENT  4 F F.}߃{Oj L N NSST - SENSE & SKIP IF TRUE  N a a}h{4 g h hOV h n@ n~\|( s t t&IMMEDIATE - COPY - LOAD BYTE NEGATIVE  t  ߅}={ i   &IMMEDIATE - COPY - LOAD BYTE POSITIVE     e}{{    IMMEDIATE - SUB - SUBTRACT BYTE    H}{d   IMMEDIATE - ADD - ADD BYTE     .}߃{Jj   *IMMEDIATE - CLSN - COMPARE EQUAL - NO SKIP     }a{(   .IMMEDIATE - CLSN - COMPARE EQUAL - SKIP OCCURS  ( ( ߅|=zi / 1 1*IMMEDIATE - CSK - COMPARE 3 WAY - NO SKIP 1 K K c}{{ Q S S,IMMEDIATE - CSK - COMPARE 3 WAY - SKIP + 1  S n n  ?|߃z]j u w w,IMMEDIATE - CSK - COMPARE 3 WAY - SKIP + 2  w     {^y8   "IMMEDIATE - AND - AND TO REGISTER   ߅}A{i   ,IMMEDIATE - OR - INCLUSIVE OR TO REGISTER    b}{{   ,IMMEDIATE - XOR - EXCLUSIVE OR TO REGISTER    ?}߃{^j   OV  @ 2~v|Q   SHIFT LEFT 1 PLACE    }`{;  ! !OV ! '@ '}S{. - . ..SHIFT 10 ADDITIONAL PLACES - SINGLE REGISTER  . J J߅}0{ i P R ROV R X@ Xx~#|{ ] _ _SHIFT LEFT W/OV 1 PLACE _ p p_} {h v w wOV w }@ }S~߃|\j   ROTATE LEFT 1 PLACE    <}l{E   OV  @ 0~`|9   ROTATE LEFT W/OV 1 PLACE   }H{!   OV  @  ~<|   SHIFT RIGHT 1 PLACE   ߅}&{i{   OV  @ w~|t   SHIFT RIGHT W/OV 1 PLACE     ^}߃{[j   OV  @ Q~v|N   ROTATE RIGHT 1 PLACE  # # ;}`{8 ) * *OV * 0@ 0/~T|, 5 6 6ROTATE RIGHT W/OV 1 PLACE  6 H H };{ N O OOV O U@ U ~/| Z [ [ ARITHMETIC SHIFT RIGHT 1 PLACE [ o o ߅}{i{ u x xOV x ~@ ~w~|t    DOUBLE REG LEFT LOGICAL 1 PLACE    /[}߃{Xj   OV  @ /M}u{J   ,SHIFT 10 ADDITIONAL PLACES - DOUBLE REGISTER   /+}S{(   OV  @ ~G|   (DOUBLE REG LEFT LOGICAL THRU OV 1 PLACE    /߅}'{i{   OV @w~|t   DOUBLE REG LEFT ROTATE 1 PLACE /\}߃{Yj$&&OV&,@,O~v|L122&DOUBLE REG LEFT ROTATE THRU OV 1 PLACE2JJ/0}W{-PQQOVQW@W$~K|!\]] DOUBLE REG RIGHT LOGICAL 1 PLACE]rr/}/{xyyOVy@߅~#|i{(DOUBLE REG RIGHT LOGICAL THRU OV 1 PLACE/ c}{`OV@W~߃|Tj DOUBLE REG RIGHT LOGICAL 1 PLACE/:}f{7OV@.~Z|+(DOUBLE REG RIGHT ROTATE THRU OV 1 PLACE / }:{ OV@~.|{  $DOUBLE REG RIGHT ARITHMETIC 1 PLACE    / ߅}{bi&((OV(.@.v|zS588"PUSH - STORE REGISTERS ONTO STACK 8NN gC eTz߃x1jWYYOVY_@_ VŠp@P@RAxpvjjmm POP - LOAD REGISTERS FROM STACKm 3gp@P@c .wLu{OV@~?|t"JEQ - JUMP IF ZERO - JUMP OCCURS @߅}"{WiJEQ - JUMP IF ZERO - NO JUMP @i}{;&JNE - JUMP IF NON-ZERO - JUMP OCCURS J}߃{j"JNE - JUMP IF NON-ZERO - NO JUMP   ,}e{{$JGT - JUMP IF > ZERO - JUMP OCCURS **@ }F{b011 JGT - JUMP IF > ZERO - NO JUMP 1FF@߅}*{FiLNN(JLE - JUMP IF < OR = ZERO - JUMP OCCURSNggd} {%mnn$JLE - JUMP IF < OR = ZERO - NO JUMPnF}߃{j(JGE - JUMP IF > OR = ZERO - JUMP OCCURS@%}b{{$JGE - JUMP IF > OR = ZERO - NO JUMP@}C{b$JLT - JUMP IF < ZERO - JUMP OCCURS ߅}%{Di JLT - JUMP IF < ZERO - NO JUMP h}{'(IJEQ - INCR & JUMP IF ZERO - INCR & JUMP  @H}߃{j&((&IJEQ - INCR & JUMP  IF ZERO - INCR ONLY(@@@(}c{{FHH,IJNE - INCR & JUMP IF NON-ZERO - INCR & JUMPHcc}@{^ijj*IJNE - INCR & JUMP IF NON-ZERO - INCR ONLYj߅}{=i*JEQD - DECR & JUMP IF :FFFF - DECR & JUMP @c}߃{j(JEQD - DECR & JUMP IF :FFFF - DECR ONLY @B}b{{.JNED - DECR & JUMP IF NOT :FFFF - DECR & JUMP }>{],JNED - DECR & JUMP IF NOT :FFFF - DECR ONLY   ߅}{;iOV@w}{-!""JT SS - JUMP OCCURS "11@`|߃zj8:: JT SS - NO JUMP :GG@J|mzNOOJF SS - JUMP OCCURS O^^3|Vz{egg JF SS - NO JUMP gtt|@zk{||pOV|@0}3{^rJT OV - JUMP OCCURS 06@߅|zGi pJT OV - NO JUMP 06@o|z1pJF OV - JUMP OCCURS 06X|߃zj rJF OV - NO JUMP 06B|mzqJT CY - JUMP OCCURS 0V@+|Vz{ pJT CY - NO JUMP 0V@|@zkpJF CY - JUMP OCCURS 0V߅|)zTi&(( qJF CY - NO JUMP (550Vo|z>><??OV?E@EG _|z.LMMEXTENDED - RELATIVE BACKWARDS MaaGC|߃zjhjj0EXTENDED - RELATIVE BACKWARDS - INDIRECT 1 LEVELjG|]z{EXTENDED - RELATIVE FORWARDSG-|Aze0EXTENDED - RELATIVE FORWARDS - INDIRECT 1 LEVEL G߅|z@iEXTENDED - POST INDEXED G" i|z$ EXTENDED - POST INDEXED INDIRECTGbL|߃zj  OV @ G <{sy{EXTENDED - PRE INDEXED++ G !{Xyg344 EXTENDED - PRE INDEXED INDIRECT 4II GR{:yIQRR EXTENDED - PRE AND POST INDEXED Rgg G2 ߅{y+ioqq(EXTENDED - PRE AND POST INDEXED INDIRECTq Grb{߃yjOV@U~v|{EXTENDED - COPYE - LOAD G ;|\zgEXTENDED - COPYE - STORE  !|BzM EXTENDED - ADD   |-z8EXTENDED - SUBTRACT  ߅|z!iEXTENDED - EXCHANGE  m|߃z  j CEA - COMPUTE EFFECTIVE ADDRESS..O|ez{577 EXTENDED AND7BB;|QzmIJJ EXTENDED OR JUU'(|>zZ\]] EXTENDED XOR]hh|+zGoppADDC - ADD WITH CARRY p ߅|z/iSUBC - SUB WITH CARRY 'l|߃zj CSME - REG < MEM CELL - NO SKIP  N|ez{ CSME - REG > MEM CELL - SKIP + 1  /{Fyb CSME - REG = MEM CELL - SKIP + 2   z'xC CSKE - REG < MEM CELL - NO SKIP ' ߅| z&i CSKE - REG > MEM CELL - SKIP + 100 ' f{߃yj8:: CSKE - REG = MEM CELL - SKIP + 2:OO '  Fzcx{XZZ EXTENDED - JUMP Zgg0|MzknooOVou@uw z=x[~EXTENDED JUMP & STORE  ' ~x!v?OV@ ߆}{2 i"EXTENDED IMS - INCREMENT AND SKIP  G  dz߃xjEXTENDED IMS - INCREMENT ONLY  G F{ey{OV@9~X|tMUL - MULTIPLY MEMORY BY REGS  ' |>EXTENDED JUMP & STACK >NN liiy߃wjXZZOVZ`@` [}u{ fhh"EXTENDED DMS - DECREMENT AND SKIP h~~ g  :zTx{EXTENDED DMS - DECREMENT ONLY  g {6ycOV@~*|WEXTENDED - DOUBLE LOAD G߅|z>iEXTENDED - DOUBLE STORE Gk|߃z$jOV@ Yyqw)UTRAP - USER TRAP    jf9yQw{STRAP - SYSTEM TRAP '' OKy6wf122OV28@8~*|Z=>>(SBIT - SET GENERAL PURPOSE REGISTER BIT>WW ߅} {:i]__*RBIT - RESET GENERAL PURPOSE REGISTER BIT_yy c}߃{j0CBIT - COMPLEMENT GENERAL PURPOSE REGISTER BIT >}^{{0TBIT - TRANSFER GENERAL PURPOSE REG. BIT TO OV }9{\SBIT - STATUS REGISTER}"{ERBIT - STATUS REGISTER ߅} {.iCBIT - STATUS REGISTER  m}߃{jTBIT - STATUS REGISTER!!U}k{{'))OV)/@/G}]{s566SIN - STATUS INHIBIT6FF/|Ez[MNNOHNT@T Ç!|7zM""[^^FLOATING POINT - FIX^mm nn {y3uvvOHv|@| Ç߇|z%""iFLOATING POINT - FLOAT ll k{߃y jOH@ Ç\|tz""{ FLOATING POINT - ADD - NO ALIGN  gg\":zRxa"FLOATING POINT - ADD - ALIGN ACC 1 GG\"z2xA$FLOATING POINT - ADD - ALIGN ACC 11  &&\"߅zx i2FLOATING POINT - ADD - NO ALIGN - DIFFERENT SIGNS 11 È\"\z߄x"j{":?? FLOATING POINT - SUB - NO ALIGN ?TT e\"9zax`"]__"FLOATING POINT - SUB - ALIGN ACC 1_uu hD\"z@x?~$FLOATING POINT - SUB - ALIGN ACC 11  G#\"߅zxi2FLOATING POINT - SUB - NO ALIGN - DIFFERENT SIGNS  Ë\"\z߃xj{""OH@ ÇJ|qzp"" FLOATING POINT - MULTIPLY  kk\" ,zSxRFLOATING POINT - DIVIDE    PP\" z8x7OH@ Ç|*z)""!$$"FLOATING POINT - COMPARE LESS THAN$:: gg\"߅zxiCEE&FLOATING POINT - COMPARE GREATER THAN E]] DD\" ay߃wj{gjjFLOATING POINT - COMPARE EQUALj~~-##\"  ?xav`p @pǜ@PǛ›p@P w t0@Òp@ÑP@x rqrp  "QD=NQLQLVLH~^]ODmE7E3E5E3--E2E0+IGN ACC 1 GG\"z2xA$FLOATING POINT - ADD - ALIGN ACC 11  &&\"߅zx i2FLOATING POINT - ADD - NO ALIGN - DIFFERENT SIGNS 11 È\"\z߄x"j{":?? FLOATING POINT - SUB - NO ALIGN ?TT e\"9zax`"]__"FLOATING POINT - SIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII! IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII" IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII# IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII$ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII% IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII& IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIe;820909173247820909173247820909174326e@800408111948800408111948820909175346e:' 800408111948800408111948800408111948e800408111948800408111948800408111948800408111948800408111948800408111948e8004081121115080040811211500800421160750de8004081121187580040811212325800421160755de 8004081121270080040811213375800421160801d e8004081121370080040811214125800421160806d(  e6kk8004081121447580040811215950800421160820d eS0_?8004081122027580040811221625800421160833d e2b^8004081122195080040811223300800421160847d e>88004081122367580040811224600800421160856de[&8004081122492580040811225650800421160903deo)8004081123000080040811230775800421160911d) * + , - . / 0 . TIMER495 JCLTIMER495 MACTIMER495 NUC TIMER495 OBJ TMBAS95 ASM TMBAS95 OBJ TIMER95B SYS TMNEW95 ASMTMNEW95 OBJTIMER95N SYS TITL LSI 4 INSTRUCTION EXECUTION TIMES - 4/95 NEW INSTRUCTIONS TITL ** TMNEW95.ASM ** (84-93025-22-A000) MACHINE :20 * * ********************************************** ********************************************** ** 1  ** ** TTTTTTT IIIII MM MM EEEEEE RRRRR ** ** T I M M M M E R R ** ** T I M M M EEEEE RRRRR ** ** T I M M E R R ** ** T IIIII M M EEEEEE R R ** **  ** ********************************************** ********************************************** * * * * LSI-4 INSTRUCTION EXECUTION TIMES * 4/95 NEW INSTRUCTION SET * * TITL NEW INSTRUCTION MACROS * U S E R D E F I N E D O P---C O D E S * BITS MACRO S1 SYMATT #(1) IFT S1&:800 S1 SET S1++:400 ENDC S1 SET S1&:700%-4 R1 SET R1++S1 WORD R1 S1 SYMVAL #(1) WORD S1 ENDM TITL STRU MACRO :5C15 STORE AREG IN USER SPACE LODU MACENT :5C25 LOAD AREG FROM USER SPACE LCNTX MACENT :5C45 LOAD CONTEXT CVTDBL MACENT :260D CONVERT TO DOUBLE PRECISION WAIT MACENT :262D WAIT ON SEMAPHORE SIGNAL MACENT :261D SIGNAL SEMAPHORE DEQUEN MACENT :264D REMOVE QUEUE ELEMENT FOLLOWING REFERENCE ELEMENT ENQUEB MACENT :263D INSERT QUEUE ELEMENT BEFORE REFERENCE ELEMENT MOVE MACENT :267D BLOCK MOVE WORD RETURN MACENT :266D RETURN FROM PROCEDURE STRECC MACENT :26AD STORE ERROR CORRECTION CODE LODECC MACENT :26BD LOAD ERROR CORRECTION CODE GENECC MACENT :26CD GENERATE ERROR CORRECTION CODE ENQUEA MACENT :26DD INSERT QUEUE ELEMENT AFTER REFERENCE ELEMENT DELQUE MACENT :26ED DELETE QUEUE ELEMENT REFERENCED NEXTQUE MACENT :26FD POINT TO NEXT QUEUE ELEMENT WORD #(0) ENDM SPACE 1 PUSH: MACRO :0F05 PUSH SINGLE REGISTER ONTO STACK POP:  MACENT :0F07 POP SINGLE REGISTER FROM STACK R1 SYMVAL #(1) R1 SET R1&6%12++#(0) WORD R1 ENDM ENTER MACRO :265D ENTER PROCEDURE SCNTX MACENT :5C35 SAVE CONTEXT WORD #(0) S1 SYMVAL #(1) WORD #(1) ENDM TITL MULS MACRO :1F80 MULTIPLY -- STACK RELATIVE DIVS MACENT :1F81 DIVIDE -- STACK RELATIVE CEAS MACENT :1F84 COMPUTE EFFECTIVE ADDRESS -- STACK RELATIVE DLOADS MACENT :1F86 LOAD DOUBLE REGISTER -- STACK RELATIVE LOADS MACENT :1F88 LOAD SINGLE REGISTER -- STACK RELATIVE ADDS MACENT :1F8A ADD TO REGISTER -- STACK RELATIVE SUBS MACENT :1F8B SUBTRACT FROM REGISTER -- STACK RELATIVE EXCHS MACENT :1F8C EXCHANGE WITH REGISTER -- STACK RELATIVE R1 SYMVAL #(2) R1 SET R1&6%12++#(0) BITS #(1) ENDM SPACE 2 SPACE 2 CSMS MACRO :1F85 COMPARE MAG. & SKIP 3 WAY -- STACK RELATIVE DSTORS MACENT :1F87 STORE DOUBLE REGISTERS -- STACK RELATIVE STORS MACENT :1F89 STORE SINGLE REGISTER -- STACK RELATIVE R1 SYMVAL #(1) R1 SET R1&6%12++#(0) BITS #(2) ENDM SPACE 2 SPACE 2 ADDCS MACRO :1F82 ADD WITH CARRY -- STACK RELATIVE SUBCS MACENT :3F82 SUBTRACT WITH CARRY -- STACK RELATIVE ANDS MACENT :1F8E 'AND' TO REGISTER -- STACK RELATIVE ORS MACENT :3F8E 'OR' TO REGISTER -- STACK RELATIVE XORS MACENT :1F8F 'EXCLUSIVE OR' TO REGISTER -- STACK RELATIVE R1 SYMVAL #(2) R1 SET R1&4%12++#(0) BITS #(1)  ENDM TITL CSKS MACRO :3F8F COMPARE & SKIP 3 WAY -- STACK RELATIVE R1 SYMVAL #(1) R1 SET R1&2 4%12++#(0) BITS #(2) ENDM SPACE 2 JSKS MACRO :1F83 JUMP & STACK -- STACK RELATIVE JMPS MACENT :1F8D JUMP -- STACK RELATIVE JSTS MACENT :3F8D JUMP & STORE -- STACK RELATIVE IMSS MACENT :5F8D INCREMENT & SKIP IF ZERO -- STACK RELATIVE DMSS MACENT :7F8D DECREMENT & SKIP IF ZERO -- STACK RELATIVE DBLADDS MACENT :268B ADD TO DOUBLE REGISTER -- STAK RELATIVE DBLSUBS MACENT :268A SUBTRACT FROM DOUBLE REGISTERS -- STACK RELATIVE DBLADD MACENT :260B DBLSUB MACENT :260A R1  SET #(0) BITS #(1) ENDM SPACE 2 INSR MACRO :030B INSERT BIT FIELD TO MEMORY XTR MACENT :030E EXTRACT BIT FIELD FROM MEMORY XTRS MACENT :030F EXTRACT BIT FIELD AND EXTEND SIGN R1 SYMVAL #(1) R1 SET R1&6%12++#(0) S1 SYMVAL #(2) S1 SET S1-1&15%4++R1 WORD S1 ENDM TITL STORK MACRO :1E80 STORE REGISTER -- STACK RELATIVE R1 SYMVAL #(1) GET REGISTER R1 SET R1&6%12++#(0) OR IN SKELETON AFTER SHIFTING S1 SYMATT #(2) GET ATTRIBUTES IFT S1&:800 ONLY INDIRECT OR NONE ALLOWED R1 SET R1++:40 SET INDIRECT BIT ENDC S1 SYMVAL #(2) GET D6 FIELD R1 SET R1++S1 OR D6 FIELD IN WORD R1 ENDM SPACE 2 LOADK MACRO :1E00 LOAD REGISTER -- STACK RELATIVE R1 SYMVAL #(2) R1 SET R1&6%12++#(0) S1 SYMATT #(1) IFT S1&:800 R1 SET R1++:40 ENDC S1 SYMVAL #(1) R1 SET R1++S1 WORD R1 ENDM TITL STACK RELATIVE INSTRUCTIONS * * INIT TIME 0,0,' LSI 4/95 NEW INSTRUCTION SET' TIME:INC STKBOT RES 14,:CCCC STKTOP RES 14,:2222 SAVEK WORD 0 SAVEL WORD 0 TIME 0,0,'OH',OV JST STKSET JST STKEND TIME 0,0,' STACK RELATIVE - CSKE - REG < MEM - NO SKIP' JST STKSET CSKS A,0 JST STKEND TIME :3333,0,' STACK RELATIVE - CSKE - REG > MEM - SKIP+1' JST STKSET CSKS A,2 HLT JST STKEND TIME :2222,0,' STACK RELATIVE - CSKE - REG = MEM - SKIP+2' JST STKSET CSKS A,3 HLT HLT JST STKEND TIME 0,0,' STACK RELATIVE - CSME - REG < MEM - NO SKIP' JST STKSET CSMS A,0 JST STKEND TIME :3333,0,' STACK RELATIVE - CSME - REG > MEM - SKIP+1' JST STKSET CSMS A,2 HLT JST STKEND TIME :2222,0,' STACK RELATIVE - CSME - REG = MEM - SKIP+2' JST STKSET CSMS A,3 HLT HLT JST STKEND TIME 0,0,' STACK RELATIVE - COPYE - LOAD SINGLE REGISTER ' JST STKSET LOADS 0,A JST STKEND TIME 0,0,' STACK RELATIVE - COPYE - STORE SINGLE REGISTER ' JST STKSET STORS A,0 JST STKEND  TIME 0,0,' STACK RELATIVE - COPYE - STORE DOUBLE REGISTERS ' JST STKSET DSTORS AQ,0 JST STKEND TIME 0,0,' STACK RELATIVE - COPYE - LOAD DOUBLE REGISTERS ' JST STKSET DLOADS 0,AQ JST STKEND TIME 0,0,' STACK RELATIVE - ADDE - ADD TO REGISTER ' JST STKSET ADDS 0,A JST STKEND TIME 0,0,' STACK RELATIVE - SUBE - SUBTRACT FROM REGISTER ' JST STKSET SUBS 0,A JST STKEND TIME 0,0,' STACK RELATIVE - EXCHE - EXCHANGE REGISTER WITH MEM ' JST STKSET EXCH 0,A JST STKEND TIME 0,0,' STACK RELATIVE - ANDE - AND TO REGISTER ' JST STKSET ANDS 0,A JST STKEND TIME 0,0,' STACK RELATIVE - XORE - EXCLUSIVE OR TO REGISTER ' JST STKSET XORS 0,A JST STKEND TIME 0,0,' STACK RELATIVE - ORE - INCLUSIVE OR TO REGISTER ' JST STKSET ORS 0,A JST STKEND TIME 0,0,' STACK RELATIVE - ADDC - ADD WITH CARRY ' JST STKSET ADDCS 0,A JST STKEND TIME 0,0,' STACK RELATIVE - SUBC - SUB WITH CARRY ' JST STKSET SUBCS 0,A JST STKEND TIME 0,0,' PUSH - PUSH SINGLE REGISTER ONTO STACK' JST STKSET PUSH: A JST S3 TKEND TIME 0,0,' POP - POP SINGLE REGISTER FROM STACK' JST STKSET POP: A JST STKEND TIME 0,0,' STACK RELATIVE - MUL - MULTIPLY ' JST STKSET MULS 0,AQ JST STKEND TIME 0,0,' STACK RELATIVE - DIV - DIVIDE ' JST STKSET DIVS 4,AX JST STKEND TIME 0,0,' STACK RELATIVE - CEA - COMPUTE EFFECTIVE ADDRESS ' JST STKSET CEAS 0,A JST STKEND TIME 0,0,' STACK RELATIVE - OH',OV COPY A,STKTOP JST STKSET JST STKEND TIME :FFFF,0,' STACK RELATIVE - IMSE - INCREMENT & SKIP ' COPY A,STKTOP JST STKSET IMSS 0 HLT JST STKEND TIME 1,0,' STACK RELATIVE - IMSE - INCREMENT ONLY ' COPY A,STKTOP JST STKSET IMSS 0 JST STKEND  TIME 2,0,' STACK RELATIVE - DMSE - DECREMENT ONLY ' COPY A,STKTOP JST STKSET DMSS 0 JST STKEND TIME 0,0,' STACK RELATIVE - DMSE - DECREMENT & SKIP ' COPY A,STKTOP JST STKSET DMSS 0 HLT JST STKEND TIME TMJMP,:9F80,' STACK RELATIVE - OH',OV JST STKSET COPY X,STKTOP COPY A,STKTOP+1 JMP *$+1 WORD $+1 TMJMP JST STKEND TIME TMJMP1,:9F80,' STACK RELATIVE - JMPE - JUMP ' JST STKSET COPY X,STKTOP COPY A,STKTOP+1 JMPS 0 TMJMP1 JST STKEND TIME 0,0,' STACK RELATIVE - OH',OV JST STKSET DSTORS AX,2 JST STKEND TIME 0,0,' STACK RELATIVE - DBLADD - DOUBLE PRECISION ADD ' JST STKSET DSTORS AX,2 DBLADDS 2 JST STKEND TIME 0,0,' STACK RELATIVE - DBLSUB - DOUBLE PRECISION SUB ' JST STKSET DSTORS AX,2 DBLSUBS 2 JST STKEND TITL CONTEXT SWITCH INSTRUCTIONS TIME 0,0,'OH',OV JST STKSET COPY =LOADC1,A COPY A,STKTOP COPY =:170,A COPY A,STKTOP+1 SIN 1 COPY =0,X LOADC1 JST STKEND TIME 0,0,' LCNTX - LOAD CONTEXT - CP = 0 ' JST STKSET COPY =LOADC2,A COPY A,STKTOP COPY =:170,A COPY A,STKTOP+1 SIN 2 COPY =0,X LCNTX LOADC2 JST STKEND TIME 0,0,'OH',OV JST STKSET COPY =SAVEC10,A COPY A,STKTOP COPY =:170,A COPY A,STKTOP+1 SIN 2 COPY =0,X LCNTX SAVEC10 JST STKEND TIME 0,0,' SCNTX - SAVE CONTEXT - CP = 0' JST STKSET COPY =SAVEC11,A  COPY A,STKTOP COPY =:170,A COPY A,STKTOP+1 SIN 2 COPY =0,X LCNTX SAVEC11 SCNTX SAVEC12 SAVEC12 WORD :170 WORD STKTOP JST STKEND TIME 0,0,'OH',OV JST STKSET COPY =:170,A COPY A,CONTXT+2 COPY =LOADC3,A COPY =CONTXT,X SIN 1 COPY A,CONTXT LOADC3 JST STKEND TIME 0,0,' LCNTX - LOAD CONTEXT - CP NOT = 0' JST STKSET COPY =:170,A COPY A,CONTXT+2 COPY =CONTXT,X COPY =LOADC4,A SIN 2 COPY A,CONTXT LCNTX LOADC4 JST STKEND TIME 0,0,'OH',OV JST STKSET COPY =:170,A COPY A,CONTXT+2 COPY =SAVEC20,A COPY =CONTXT,X SIN 2 COPY A,CONTXT LCNTX SAVEC20 JST STKEND TIME 0,0,' SCNTX - SAVE CONTEXT - CP NOT = 0' JST STKSET COPY =:170,A COPY A,CONTXT+2 COPY =CONTXT,X COPY =SAVEC21,A SIN 2 COPY A,CONTXT LCNTX SAVEC21 SCNTX SAVEC22 SAVEC22 WORD :170 WORD STKTOP JST STKEND TIME 0,0,'OH',OV COPY A,Q TIME :8000,0,' CVTDBL - CONVERT TO DOUBLE PRECISION - NEG' COPY A,Q CVTDBL TIME 0,0,' CVTDBL - CONVERT TO DOUBLE PRECISION - POS' COPY A,Q CVTDBL TIME 0,5,' OH',OV COPY =STKTOP-3,Y TIME 0,5,' XTR - EXTRACT BIT FIELD - 1 BIT FROM CENTER' COPY =STKTOP-3,Y XTR A,1 TIME 0,5,' XTR - EXTRACT BIT FIELD - 4 BITS FROM CENTER' COPY =STKTOP-3,Y XTR A,4 TIME 0,10,' XTR - EXTRACT BIT FIELD - 16 BITS ACROSS BOUNDARY' COPY =STKTOP-3,Y XTR A,16 TIME 0,5,' XTRS - EXTRACT SIGNED BIT FIELD - 1 BIT FROM CENTER' COPY =STKTOP-3,Y XTRS A,1 TIME 0,5,' XTRS - EXTRACT SIGNED BIT4  FIELD - 4 BITS FROM CENTER' COPY =STKTOP-3,Y XTRS A,4 TIME 0,10,' XTRS - EXTRACT SIGNED BIT FIELD - 16 BITS ACROSS BOUNDARY' COPY =STKTOP-3,Y XTRS A,16 TIME :F,5,' INSR - INSERT BIT FIELD - 1 BIT' COPY =STKTOP-3,Y INSR A,1 TIME :F,5,' INSR - INSERT BIT FIELD - 4 BITS INTO CENTER' COPY =STKTOP-3,Y INSR A,4 TIME :FFFF,10,' INSR - INSERT BIT FIELD - 16 BITS ACROSS BOUNDARY' COPY =STKTOP-3,Y INSR A,16 TIME 0,STKTOP,' OH',OV COPY A,STKTOP TIME :00,STKTOP,' SIGNAL - SIGNAL SEMAPHORE' COPY A,STKTOP SIGNAL TIME :3F,STKTOP,' WAIT - WAIT ON SEMAPHORE' COPY A,STKTOP WAIT TIME 0,0,' OH',OV JST STKSET JST STKEND TIME 0,0,' ENTER - ENTER PROCEDURE' JST STKSET ENTER 5 JST STKEND TIME -1,0,' OH',OV COPY A,CNT:LOW COPY A,CNT:HIGH COPY =NEXT,A COPY A,CONTXT THIS OH MAKES SURE THAT THE CONTEXT COPY =CONTXT,X POINTER IS NOT =0, OTHERWISE AN INFINITE COPY K,A COPY A,7(X) COPY L,A COPY A,1(X) LCNTX . LOOP MAY RESULT & TIMER WOULD NOT FINISH. NEXT EQU $ TIME 0,0,' OH',OV JST STKSET COPY =RTN1,A COPY A,STKTOP RTN11 JST STKEND TIME 0,0,' RETURN - RETURN FROM PROCEDURE' JST STKSET COPY =RTN2,A COPY A,STKTOP  RETURN RTN22 JST STKEND TIME 0,0,' OH',OV COPY =STKTOP,X COPY =2,A COPY =STKBOT,Q SIN 1 TIME 0,0,' MOVE - MOVE 1 WORD'  COPY =STKTOP,X COPY =1,A COPY =STKBOT,Q SIN 1 MOVE TIME 0,0,' MOVE - MOVE 2 WORDS' COPY =STKTOP,X COPY =2,A COPY =STKBOT,Q SIN 1 MOVE TIME 0,0,' OH',OV COPY =QUEUE,X TIME 0,0,' DEQUEN - REMOVE NEXT QUEUE ELEMENT (HEAD NODE)' COPY =QUEUE,X  DEQUEN TIME QUEUE1,0,' OH',OV COPY =QUEUE,X COPY X,0(X) COPY X,1(X) COPY A,Q ENQUEA TIME QUEUE1,0,' DEQUEN - REMOVE NEXT QUEUE ELEMENT' COPY =QUEUE,X COPY X,0(X) COPY X,1(X) COPY A,Q ENQUEA DEQUEN TIME QUEUE1,0,' OH',OV COPY =QUEUE,X COPY X,0(X) COPY X,1(X) COPY A,Q TIME QUEUE1,0,' ENQUEB - INSERT BEFORE QUEUE ELEMENT' COPY =QUEUE,X COPY X,0(X) COPY X,1(X) COPY A,Q ENQUEB TIME QUEUE1,0,' ENQUEA - INSERT AFTER QUEUE ELEMENT' COPY =QUEUE,X COPY X,0(X) COPY X,1(X) COPY A,Q ENQUEA TIME QUEUE1,0,' OH',OV COPY =QUEUE,X COPY X,0(X) COPY X,1(X) COPY A,Q ENQUEA EXCH Q,X TIME QUEUE1,0,' DELQUE - DELETE THIS QUEUE ELEMENT' COPY =QUEUE,X COPY X,0(X) COPY X,1(X) COPY A,Q ENQUEA EXCH Q,X DELQUE TIME QUEUE,QUEUE,' OH',OV COPY A,X COPY A,0(X) COPY A,1(X) TIME QUEUE,QUEUE,' DELQUE - DELETE THIS QUEUE ELEMENT (HEAD NODE)' COPY A,X COPY A,0(X) COPY A,1(X) DELQUE TIME QUEUE,QUEUE,' NEXTQUE- POINT TO NEXT QUEUE ELEMENT' COPY A,X COPY A,0(X) COPY A,1(X) NEXTQUE * * * TIME 0,0,' OH',OV JST STKSET JST STKEND TIME 0,0,' STACK RELATIVE - COPY - STORE SINGLE REGISTER ' JST STKSET STORK A,0 JST STKEND TIME 0,0,' STACK RELATIVE - COPY - LOAD SINGLE REGISTER ' JST STKSET LOADK 0,A JST STKEND TIME 0,STKTOP,' OH',OV TIME 0,STKTOP,' GENECC - GENERATE ERROR CORRECTION CODE' GENECC TIME 0,STKTOP,' OH',OV COPY A,0(X) TIME 0,STKTOP,' STRECC -  STORE ERROR CORRECTION CODE' COPY A,0(X) STRECC TIME 0,STKTOP,' LODECC - LOAD ERROR CORRECTION CODE' COPY A,0(X) LODECC TIME -1,0,' OH',OV COPY A,CNT:LOW COPY A,CNT:HIGH SET UP FOR 1 PASS ONLY COPY =1,A OUT A,5 TURN ON TABLE ACCESS COPY =:FC00,X COPY =:FC40,Y TEST0 COPY =:3000,A TEST1 COPY A,0(X) ADD =1,A ADD =1,X CSK X,Y JMP TEST1 NOP COPY =:3000,A COPY =:F5 C80,Y TEST2 COPY A,0(X) ADD =1,A ADD =1,X CSK X,Y JMP TEST2 NOP OUT A,4 RESET MMU TIME 0,STKTOP,' OH',OV COPY =1,A OUT A,6 SET USER #1 COPY =2,A OUT A,5 TURN ON TRANSLATION OUT A,4 RESET MMU TIME 0,STKTOP,' STRU - STORE TO USER SPACE' COPY =1,A OUT A,6 COPY =2,A OUT A,5 STRU OUT A,4 TIME 0,STKTOP,' LODU - LOAD FROM USER SPACE' COPY =1,A OUT A,6 COPY =2,A OUT A,5 LODU OUT A,4 TIME:INC TIME:END STATUS WORD :170 RTN1 WORD RTN11 RTN2 WORD RTN22 STKSET ENT COPY K,Q COPY Q,SAVEK COPY L,Q COPY Q,SAVEL COPY =STKTOP,Q COPY Q,K COPY =STKBOT,Q COPY Q,L JMP *STKSET STKEND ENT COPY STATUS,Q COPY Q,S COPY SAVEK,Q COPY Q,K COPY SAVEL,Q COPY Q,L JMP *STKEND CONTXT RES 9,0 QUEUE WORD QUEUE WORD QUEUE RES 10 QUEUE1 WORD QUEUE1 WORD QUEUE1 RES 10 END JST STKEND TIME 0,0,' STACK RELATIVE - COPY - STORE SINGLE REGISTER ' JST STKSET STORK A,0 JST STKEND TIME 0,0,' STACK RELATIVE - COPY - LOAD SINGLE REGISTER ' JST STKSET LOADK 0,A JST STKEND TIME 0,STKTOP,' OH',OV TIME 0,STKTOP,' GENECC - GENERATE ERROR CORRECTION CODE' GENECC TIME 0,STKTOP,' OH',OV COPY A,0(X) TIME 0,STKTOP,' STRECC -  STORE ERROR CORRECTION CODE' COPY A,0(X) STRECC TIME 0,STKTOP,' LODECC - LOAD ERROR CORRECTION CODE' COPY A,0(X) LODECJTIME:ST O0SEGMENTBLANK o KCNT:HIGHCNT:LOW TM:RTN ig & LSI  4/95 NEW INSTRUCTION SET߅~߄|ttt""@@OH@F@FV|UzT MPP , STACK RELATIV E - CSKE - REG < MEM - NO SKIPPkk b?`/z.x-tuu 33, STACK RELATIV E - CSKE - REG > MEM - SKIP+1 u =? : yw "", STACK RELATIV E - CSKE - REG = MEM - SKIP+2  ?  ߅x߄vttt , STACK RELATIV E - CSME - REG < MEM - NO SKIP ]z\x[  33, STACK RELATIV E - CSME - REG > MEM - SKIP+1  b _5y4w3 "", STACK RELATIV E - CSME - REG = MEM - SKIP+2 -- <  8x v 899 0 STACK RELATIV E - COPYE - LOAD SINGLE REGISTER 9VV ߅z߄xttt_cc 0 STACK RELATIV E - COPYE - STORE SINGLE REGISTER c [zZxY  2 STACK RELATIV E - COPYE - STORE DOUBLE REGISTERS  __]1z0x/ 0 STACK RELATIV E - COPYE - LOAD DOUBLE REGISTERS  8_6 z x * STACK RELATIV E - ADDE - ADD TO REGISTER  ߅z߄xttt 2 STACK RELATIV E - SUBE - SUBTRACT FROM REGISTER    ZzYxX ),, 6 STACK RELATIV E - EXCHE - EXCHANGE REGISTER WITH MEM ,LL ]\/{.y-TUU * STACK RELATIV E - ANDE - AND TO REGISTER Uoo :8 z x xyy 4 STACK RELATIV E - XORE - EXCLUSIVE OR TO REGISTER y ߅z߄xt6 tt 4 STACK RELATIV E - ORE - INCLUSIVE OR TO REGISTER  ?YzXxW  * STACK RELATIV E - ADDC - ADD WITH CARRY  ca3z2x1 * STACK RELATIV E - SUBC - SUB WITH CARRY  ??=zx  ( PUSH - PUSH S INGLE REGISTER ONTO STACK 11 ߅{߄yttt9== & POP - POP SI NGLE REGISTER FROM STACK=UU a{`y_ ]`` $ STACK RELATIV E - MUL - MULTIPLY `ww f_d>z=x< " STACK RELATIV E - DIV - DIVIDE  F?Dzx 4 STACK RELATIV E - CEA - COMPUTE EFFECTIVE ADDRESS  ߅z߄xttt  STACK RELATIVE - OH@ j{iyh0  , STACK RELATIV E - IMSE - INCREMENT & SKIP  b_ ^Ax@v?   * STACK RELATIV E - IMSE - INCREMENT ONLY )) ;c_8yw344 * STACK RELATIV E - DMSE - DECREMENT ONLY 4NN >߅y߄wtttX\\ , STACK RELATIV E - DMSE - DECREMENT & SKIP \ww  [xZvY0   STACK RELATIVE - OH@mj>x=v< 1 STACK RELATIVE - JMPE - JUMP  hJgGxv  STACK RELATIVE - OH@ M?.zxt 0 STACK RELATIV E - DBLADD - DOUBLE PRECISION ADD  %?&߅x߄vWtt 0 STACK RELATIV E - DBLSUB - DOUBLE PRECISION SUB %% ?&ZxYv, 033OH39@9 w)qDvCt0p1@FKK LCNTX - LOAD  CONTEXT - CP = 0 K`` Pddd)\EIusthnqqOHqw@w 9MMM)\E2usj  SCNTX - SAVE CONTEXT - CP = 0 ))))\E\5p0 ߅q߄oBttOH@ nvmt+  " LCNTX - LOAD  CONTEXT - CP NOT = 0 deb_\E^DuCspOH@ LuMIG\EF,u+st   " SCNTX - SAVE  CONTEXT - CP NOT = 0    $M%"\E\5*p0q߃oUt(266OH6<@<@߅}s{EtBDD , CVTDBL - CONV ERT TO DOUBLE PRECISION - NEG D__@& a|Oz!fgg , CVTDBL - CONV ERT TO DOUBLE PRECISION - POS g@& >|,zt OH @/}{r- . XTR - EXTRAC T BIT FIELD - 1 BIT FROM CENTER 7 b |߃zMt . XTR - EXTRAC T BIT FIELD - 4 BITS FROM CENTER=>߅|^z(t 4 XTR - EXTRAC T BIT FIELD - 16 BITS ACROSS BOUNDARY ]|6z    4 XTRS - EXTRAC T SIGNED BIT FIELD - 1 BIT FROM CENTER **6|z-t144 6 XTRS - EXTRAC T SIGNED BIT FIELD - 4 BITS FROM CENTER 4TT]? |߃zXt[]] : XTRS - EXTRAC T SIGNED BIT FIELD - 16  BITS ACROSS BOUNDARY]2߅|Xz-t  INSR - INSERT BIT FIELD - 1 BIT g|:z . INSR - INSERT BIT FIELD - 4 BITS INTO CENTER ;C|z-t 2 INSR - INSERT BIT FIELD - 16 BITS ACROSS BOUNDARY_|߃zZt0 OH @ }t{K00  SIGNAL - SIGNAL SEMAPHOREl&߅|Yz0t?0  WAIT - WAIT ON SEMAPHORE //P&-i|=z677 OH 7>@>Z|.z EHH  ENTER - ENTER PROCEDURE HZZ k&]i?0"@  P{y     0 DELQUE - DELETE THIS  QUEUE ELEMENT (HEAD NODE)   & & &)z߃xtt / 2 2  & NEXTQUE- POINT TO NEXT QUEUE ELEMENT  2 J J &z_x^ S T T OH  T [@ [߇|PzO t b f f 0 STACK RELATIV E - COPY - STORE SINGLE REGISTER  f   _^^{'y&    0 STACK RELATIV E -OVicEdDanoj +A*A: ˂C: # OC PZ2 P!_E # 0VE # 1 L G B  C f-/-+(M )) (: EO  : qBOZ20W ׂܞ~ևуU@ WԆ1ˎۿ҃qYtU $6' ޕޏ%e    [ <' 킦_) B)-%' ߂)/+=׆Ղ΃L,0)  %', ).޺t޹Z.%ޯ'< 0 1AIPⲢ@+Uޢ⬞+B+k++A+k@W      }`p0 0 5 5 .0 LSI-4/95 TIMING TEST PROGRAM (A000)0 REAL-TIME-CLOCK SHOULD BE SET TO TTLF  0000.000 MICROSEC - I/O ERROR(0 LSI-4/95 TIMING PROGRAM....END PARAMETER ERROR DOCUMENTATION NOT FOUNDPP & LSI 4/95 NEW INSTRUCTION SET߅~߄| ""@@OH@F@FV|UzT MPP, STACK RELATIVE - CSKE - REG < MEM - NO SKIPPkk b?`/z.x-tuu33, STACK RELATIVE - CSKE - REG > MEM - SKIP+1 u =? : yw"", STACK RELATIVE - CSKE - REG = MEM - SKIP+2  ?  ߅x߄v , STACK RELATIVE - CSME - 9 REG < MEM - NO SKIP ]z\x[ 33, STACK RELATIVE - CSME - REG > MEM - SKIP+1  b _5y4w3"", STACK RELATIVE - CSME - REG = MEM - SKIP+2 -- <  8x v 8990 STACK RELATIVE - COPYE - LOAD SINGLE REGISTER 9VV ߅z߄x _cc0 STACK RELATIVE - COPYE - STORE SINGLE REGISTER c [zZxY 2 STACK RELATIVE - COPYE - STORE DOUBLE REGISTERS  __]1z0x/0 STACK RELATIVE - COPYE - LOAD DOUBLE REGISTERS  8_6 z x* STACK RELATIVE - ADDE - ADD TO REGISTER  ߅z߄x 2 STACK RELATIVE - SUBE - SUBTRACT FROM REGISTER    ZzYxX ),, 6 STACK RELATIVE - EXCHE - EXCHANGE REGISTER WITH MEM ,LL ]\/{.y-TUU* STACK RELATIVE - ANDE - AND TO REGISTER Uoo :8 z x xyy4 STACK RELATIVE - XORE - EXCLUSIVE OR TO REGISTER y ߅z߄x 4 STACK RELATIVE - ORE - INCLUSIVE OR TO REGISTER  ?YzXxW * STACK RELATIVE - ADDC - ADD WITH CARRY  ca3z2x1* STACK RELATIVE - SUBC - SUB WITH CARRY  ??=zx ( PUSH - PUSH SINGLE REGISTER ONTO STACK 11 ߅{߄y 9==& POP - POP SINGLE REGISTER FROM STACK=UU a{`y_ ]``$ STACK RELATIVE - MUL  - MULTIPLY `ww f_d>z=x<" STACK RELATIVE - DIV - DIVIDE  F?Dzx4 STACK RELATIVE - CEA - COMPUTE EFFECTIVE ADDRESS  ߅z߄x  STACK RELATIVE - OH@ j{iyh0 , STACK RELATIVE - IMSE - INCREMENT & SKIP  b_ ^Ax@v?  * STACK RELATIVE - IMSE - INCREMENT ONLY )) ;c_8yw344* STACK RELATIVE - DMSE - DECREMENT ONLY 4NN >߅y߄w X\\, STACK RELATIVE - DMSE - DECREMENT & SKIP \ww  [xZvY0   STACK RELATIVE - OH@mj>x=v< 1 STACK RELATIVE - JMPE - JUMP  hJgGxv STACK RELATIVE - OH@ M?.zx 0 STACK RELATIVE - DBLADD - DOUBLE PRECISION ADD  %?&߅x߄vW 0 STACK RELATIVE - DBLSUB - DOUBLE PRECISION SUB %% ?&ZxYv, 033OH39@9w: )qDvCt0p1@FKK LCNTX - LOAD CONTEXT - CP = 0 K``Pddd)\EIus hnqqOHqw@w9MMM)\E2usj SCNTX - SAVE CONTEXT - CP = 0 ))))\E\5p0 ߅q߄oB OH@nvmt+ " LCNTX - LOAD CONTEXT - CP NOT = 0deb_\E^DuCspOH@LuMIG\EF,u+s   " SCNTX - SAVE CONTEXT - CP NOT = 0    $M%"\E\5*p0q߃oU (266OH6<@<@߅}s{E BDD, CVTDBL - CONVERT TO DOUBLE PRECISION - NEG D__@& a|Oz!fgg, CVTDBL - CONVERT TO DOUBLE PRECISION - POS g@& >|,z  OH @/}{r-. XTR - EXTRACT BIT FIELD - 1 BIT FROM CENTER b |߃zM . XTR - EXTRACT BIT FIELD - 4 BITS FROM CENTER=>߅|^z(  4 XTR - EXTRACT BIT FIELD - 16 BITS ACROSS BOUNDARY ]|6z   4 XTRS - EXTRACT SIGNED BIT FIELD - 1 BIT FROM CENTER **6|z- 144 6 XTRS - EXTRACT SIGNED BIT FIELD - 4 BITS FROM CENTER 4TT]? |߃zX []]" : XTRS - EXTRACT SIGNED BIT FIELD - 16 BITS ACROSS BOUNDARY]2߅|Xz-  INSR - INSERT BIT FIELD - 1 BIT g|:z. INSR - INSERT BIT FIELD - 4 BITS INTO CENTER ;C|z-  2 INSR - INSERT BIT FIELD - 16 BITS ACROSS BOUNDARY_|߃zZ 0 OH @ }t{K00 SIGNAL - SIGNAL SEMAPHOREl&߅|Yz0 ?0 WAIT - WAIT ON SEMAPHORE //P&-i|=z677 OH 7>@>Z|.z EHH ENTER - ENTER PROCEDURE HZZ k&]i?0"mE7E3E5E3--E2E0 ^OH   @  P{y    0 DELQUE - DELETE THIS QUEUE ELEMENT (HEAD NODE)  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII< IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII