IMD 1.16: 2/09/2008 12:38:59 84-93898-02 a000 f89802 qcd source part 1    @0|)wwЀЀtQql)  " }gA `_l M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF181111618114304811116181143 811116181143F89802 VOL410T QCD   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_l M@iGyy GGG`HZ@ b G`^Y e IQ BBp@;:9 :7P@ G:پN 8!0. * C'xC# b# }B @0DAJL w+™ЀЀΖQA1"   i ž} š} @EEFF)DEۄF8 џ} ԟ} ̟} * `jUBBI,v BI, # @ G9H@pܾrCHC C GTq` Lg"gEXC P+s=胾P+c fQN p $Rxnj  ޔniZ ތ⊞ } }HGž Ÿ@ALS)"$ C k20j.h( +$`%ꂜ\1 !M' y %'+os慾)sY ed|{ @8 o O m J K i gN )V% t%sLn`"E F. F„ D>) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYS"iwvc Bc A@6<# Ic B# gIjHc r TITL NM4 4/10T QCD PART 1 84-93898-13A0 * * * * NM4 4/10T QCD PART 1 * * * * 84-93898-13-A0 * * * COPYRIGHT 1982 COMPUTER AUTOMATION INC. * TITL EXTERNAL LINKS NAM A01000 NAM A02000 EXTR DEBUG4 * * * ABS A01PNT WORD A01000 * ABS A02PNT WORD A02000 * ABS :200 TITL INSTRUCTION DIAGNOSTIC -- SEC. A0-1 ************************************************** * * *------------ SECTION A0 ------------ * * OBJECTIVE: IN THIS SECTION SOME DEGREE OF * CONFIDENCE IS OBTAINED ON CERTAIN * BASIC INSTRUCTIONS. * * INSTRUCTIONS: THE FOLLOWING INSTRUCTIONS ARE * TESTED.(IN ORDER OF THE LIST). * NOTE:ONLY ABSOLUTE DIRECT ADDRESSING IS USED: * * COPY MEM,A LOAD 'A' FROM 'MEM' A01000 * SHIFT A,RO,X SHIFT 'A' RIGHT A01000 *  SUB MEM,A SUB 'MEM' FROM A A01000 * JST MEM JUMP AND STORE A01000 * COPY 8REG,MEM STORE '8REG' A01000 * XNX X INDEX WITH 'X' A01000 * PNX PUBLIC ACCESS A01000 *  OR A,Q OR 'A' INTO 'Q' A01000 * JMP *MEM JUMP INDIRECT A01000 * HLT HALT   A01000 * JMP MEM UNCONDITIONAL JMP A01000 * COPY LIT,2REG A02000 *  CSK 2REG,LIT A02000 * COPY MEM,2REG LOAD (DIRECT ADD.) A02000 * CSK 2REG,MEM ARITH COMP A&Q A02000 * COPY 2REG,MEM STORE (DIRECT ADD.) A02000 * CSM 8REG,8REG A02000 * COPY 8REG,8REG REG TO REG LOAD A03000 * IMS MEM INCR MEM AND SKIP A0D000 * * * MEMORY TEST * * *  JEQ 4REG,MEM A04000 * JNE 4REG,MEM A04000 * JLT 4REG,MEM  A04000 * JLE 4REG,MEM A04000 * JGT 4REG,MEM A04000 * JGE 4REG,MEM 00000000000000000000 A04000 * OR MEM,2REG INCLUSIVE OR A06000 * XOR MEM,2REG EXCLUSIVE OR A07000 * AND MEM,2REG A08000 * RBIT OV,S A0A000 * SBIT OV,S A0A000 * JT OV,MEM A0A000 * JF OV,MEM  A0A000 * SBIT 2,S BYTE MODE A0B000 * RBIT 2,S WORD MODE A0B000 * SIN STATUS INHIBIT A0C000 * SHIFT 4REG,LO,CNT A0E000 * FMT 4REG  A0F000 * XNX 4REG A10000 * * * *----- TEST STRUCTURE ----- * * FROM HERE ONWARD STEP BY STEP CONFIDENCE IS * GAINED IN VARIOUS INSTRUCTIONS BY EXECUTING * EACH INSTRUCTION TO PERFORM ITS SIMPLEST *  FUNCTION IN ABSOLUTE DIRECT ADDRESSING AND * WORD MODE. NORMALLY TWO INSTRUCTIONS ARE * TAKEN IN PAIR TO TEST EACH OTHER USING * KNOWN WORKING INSTRUCTIONS. * * BY THE END OF THIS TEST IT CAN BE SAFELY * ASSUMED THAT ALL THE INSTRUCTIONS LISTED * ABOVE ARE PERFORMING THEIR FUNCTION UNDER * ABSOLUTE DIRECT ADDRESSING AND WORD MODE. * * THIS SECTION (A0) PROVIDES BASIC CONFIDENCE * AND TOOLS FOR EXTENSIVE CHECKOUT OF * INSTRUCTIONS IN THE FOLLOWING SECTIONS * ************************************************** TITL ************************************************** * *----- SECTION A0 TEST 1 ----- * TEST: HLT, COPY P,A, SELP A,4 * JST,FMT, AND JUMP * ************************************************** * * * ---- IF PROGRAM COUNTER INCREMENTS PROPERLY, * ---- THEN COPY 8REG,P IS VERIFIED * A01000 EQU $ COPY DABASE,A GET SLAVE BASE ADDRESS SHIFT A,RO,4 SHIFT INTO PLACE SUB SLVNUM,A SLAVE DEVICE ADDRESS -->A JST SLVDSP JUMP TO SLAVE DISPLAY ROUTINE HLT VERIFY DEVICE ADDRESS AND OPERATION OF HALT JMP A01020  TEST JMP ERROR: ERROR,--,JMP,FAILED A01020 EQU $ PATCHT A01000 * * INITIALIZATION * A02000 EQU $ SIN 2 COPY STATSV,A COPY A,S INITIALIZE STATUS COPY JST1,A 'JST *$+1' INSTRUCTION COPY A,*AETPT1 INITIALIZE ARITHMETIC EXCEPTION TRAP COPY =AET1,A UNEXPECTED ARITHMETIC EXCEPTION TRAP ROUTINE COPY A,*AETPT2 INITIALIZE ARITHMETIC EXCEPTION TRAP A02002 EQU $ COPY =1,A COPY A,PCOUNT INITIALIZE TOP TE ST COUNTER JST SLVDSP DISPLAY IDP TEST CODE ******************************************************* * * ----- A02000 ----- * * ----- TEST COPY LIT,2REG AND CSK 2REG,LIT * *******************************************************  COPY =1,A CSK A,=:1 NOP ERROR: --ERROR,CSK,FAILED,A=1 CSK A,=0 ERROR: '--ERROR--CSK FAILED ' JMP $+2 ERROR: --ERROR-,CSK,FAILED CSK A,=2 JMP $+3 NOP ERROR: --ERROR--,CSK,FAILED COPY =:FF,Q LOAD Q WITH FF CSK Q,=:FF 'Q' SHOULD BE :FF NOP ERROR: IF,'Q'=:FF,CSK,FAILED,ELSE,COPY,FAILED. ************************************************** * * IN THE FOLLOSING TEST, COPY MEM,2REG, * CSK 2REG,MEM, AND COPY 2REG,MEM ARE TESTED * ************************************************** A02010 EQU $ COPY  =:FFFF,A LOAD'A'WITH FFFF CSK A,=:FFFF 'A' SHOULD BE FFFF NOP ERROR: IF,'A'=:FFFF,CSK,FAILED,ELSE,COPY,FAILED. COPY =:FFFF,Q LOAD 'Q' WITH FFFF CSK Q,=:FFFF NOP ERROR: IF,'Q'=:FFFF,CSK,FAILED,ELSE,COPY,FAILED CSK A,=0 'A' LT 0 JMP $+3 NOP ERROR: 'A',SHOULD,BE,:FFFF CSK A,=:FFFF NOP ERROR: 'A',SHOULD,=,:FFFF COPY A,TEMP03 CSK A,TEMP03 NOP ERROR: COPY,FAILED,'A'=,:FFFF ************************************************** * * IN THE FOLLOWING TEST, CSM 8REG,8REG IS TESTED * ************************************************** A02020 EQU $ COPY =:FFFF,X COPY =0,A COPY A,L CSM  X,L GREATER ERROR: CSM,FAILED,--,X>L JMP $+2 ERROR: CSM,FAILED,--,X>L COPY =:6666,Q CSM Q,X  LESS JMP $+3 NOP ERROR: CSM,FAILED,--,Q,0 JGT X,$+2 ERROR: JGT,FAILED,ON,X,>,0 PATCHX A04000 JMP A06000 *NOP ME FOR LOOP* JMP A04000 * LPOOL ************************************************** * * ----- A06000 ----- * *----- TEST FOR OR MEM,2REG (INCLUSIVE OR) * * ************************************************** A06000 EQU $ COPY PT00FF,A COPY PTF0F0,Q COPY Q,TEMP01 STORE '0' OR TEMP01,A CSK A,=:F0FF NOP ERROR: 'OR',FAILED,'A',SHOULD,BE,:F0FF * * ************************************************** * * ----- A07000 ----- * * TEST FOR XOR MEM,2REG (EXCLUSIVE OR) * * ************************************************** COPY PT00FF,Q COPY PTF0F0,A COPY A,TEMP01 XOR TEMP01,Q CSK Q,=:F00F NOP ERROR: 'XOR',FAILED,'Q',SHOULD,BE,:F00F ************************************************** * * ----- A08000 ----- * * TEST FOR AND MEM,2REG * * ************************************************** COPY PT00FF,A  COPY PTF0F0,Q COPY Q,TEMP01 STORE 'Q' AND TEMP01,A TEMP01=0, A=:FFFF CSK A,=:F0 NOP  ERROR: 'AND',FAILED,'A',SHOULD,BE,:F0 PATCHX A06000 ************************************************** * * ----- A0A000 ----- * * TESTS FOR RBIT OV,S SBIT OV,S JT OV,MEM JF OV,MEM * * ************************************************** * * DETAIL TEST ON STATUS WORD (OV AND BYTE MODE ) * * A0A000 EQU $ COPY STATSV,A COPY A,S RESET STATUS  COPY =2,A OR STATSV,A NORMAL STATUS W/ OV SET COPY A,TEMP01 SBIT 1,S SET OVERFLOW COPY S,Q LOAD Q FROM S CSK Q,TEMP01 NOP ERROR: ---ERROR-,SBIT,FAILED-- JF OV,$+4  JT OV,$+4 ERROR: ---ERROR-,JT,FAILED,OV=1 JMP $+2 ERROR: ---ERROR-,JF,FAILED,OV=1 COPY S,Q CSK Q,STATSV NOP ERROR: 'JT',DID,NOT,RESET,OV,BIT JT OV,$+4 JF OV,$+4 ERROR: ---ERROR-,JF,FAILED,OV=0 JMP $+2 ERROR: ---ERROR-,JT,FAILED,OV=0 SBIT 1,S SET OV RBIT 1,S COPY =:FF,Q COPY S,Q CSK Q,STATSV NOP ERROR: ---ERROR-,RBIT,FAILED PATCHX A0A000 ************************************************** * * ----- A0B000 ----- * *----- TEST FOR SET BYTE MODE AND SET WORD MODE. * CHECK TO SEE IF SBM TURNS ON BIT 2 IN PSW * AND SWM TURNS OFF BIT 2 IN PSW * * ************************************************** A0B000 EQU $ COPY =0,Q ZERO Q REG COPY STATSV,A CLEAR A REG COPY A,S ZERO PSW COPY =4,Q OR STATSV,Q NORMAL STATUS W/ BYTE MODE SET COPY Q,TEMP01 SBIT 2,S  BYTE MODE BIT ON COPY S,A RBIT 2,S BYTE MODE BIT OFF CSK A,TEMP01 NOP ERROR: 'SBM',DID,NOT,SET,BYTE,MODE,BIT. COPY S,A CSK A,STATSV NOP ERROR: 'SWM',DID,NOF,TURN,OFF,BYTE,MODE,BIT PATCHX A0B000 ************************************************** * * ----- A0C000 ----- * *----- SIMPLE TEST ON SIN . FORCED WORD MODE AND * EFFECT ON Q REG ARE CHECKED HERE.FORCED * INTERRUPT * * ************************************************** A0C000 EQU $ COPY =4,A OR STATSV,A COPY =:00FF,Q 00FF TO Q REG COPY Q,TEMP01  COPY A,S SET S TO BYTE MODE SIN :6 COPY TEMP01,A LOAD A WITH 00FF CSK A,=:00FF  NOP ERROR: 'SIN',FAILED,'A'=:00FF,=TEMP01 COPY STATSV,A COPY A,S RESTORE 'S' TO WORD MODE PATCHX A0C000 JMP A0E000 *NOP ME FOR LOOP* JMP A0C000 LPOOL ************************************************** * * ---- A0E000 ---- * * SHIFT 4REG,LO,CNT * ************************************************** * * SHIFT A,LO,CNT * A0E000 EQU $ COPY STATSV,A COPY A,S COPY PT5555,A SHIFT A,LO,1 CSK A,PTAAAA NOP ERROR: SHIFT,FAILED,--,A,SHOULD,=,:AAAA * * SHIFT Q,LO,4 * COPY PTAAAA,Q SHIFT Q,LO,4  CSK Q,=:AAA0 NOP ERROR: SHIFT,FAILED,--,Q,SHOULD,=,:AAA0 * * SHIFT X,LO,9 * COPY PT6666,X SHIFT X,LO,8 COPY X,A CSK A,=:6600 NOP ERROR: SHIFT,FAILED,--,X,SHOULD,=,:6600 JT OV,$+2 JMP $+2 ERROR: SHIFT,FAILED,--,OV,WAS,SET * * SHIFT Y,LO,13 * COPY PTAAAA,Y SHIFT Y,LO,13 COPY Y,A CSK A,=:4000 NOP ERROR: SHIFT,FAILED,--,Y,SHOULD,=,:4000 JT OV,$+2  ERROR: SHIFT,FAILED,--,OV,WAS,NOT,SET PATCHX A0E000 JMP A0F000 LPOOL ******************************************************* * *----- SECTION A0F000 ----- * * FMT 4REG * ******************************************************* * A0F000 EQU $ COPY STATSV,A COPY A,S COPY PTFFFF,Y FMT Y FETCH M/C TYPE IN 'Y' COPY Y,A CSK A,=:0010 COMPARE WITH EXPECTED MACHINE TYPE NOP ERROR: 'FMT',FAILED IMS PCOUNT ************************************************** * * ---- A10000 ---- * * XNX 4REG * ************************************************** A10000 EQU $ COPY =:10,A XNX A COPY =:20,Q CSK Q,=:30  NOP ERROR: XNX,FAILED,--,Q,SHOULD,=,:30 PATCHX A0F000 PATCHT *A11001 * COPY PCOUNT,A CSK A,=:000C NOP ERROR: SOME,OF,TESTS,NOT,EXECUTED JMP A12000 A11001 WORD A02000 LPOOL A12000 EQU $  TITL INSTRUCTION DIAGNOSTIC -- SEC. B0-1 ******************************************************* * * *------------ SECTION B0 ------------ * * OBJECTIVE: IN THIS SECTION EXTENSIVE TESTING OF * THE FOLLOWING INSTRUCTIONS IS DONE. * * *  COPY 4REG,MEM * * ******************************************************* * * *----- TEST STRUCTURE ----- * * GENERAL: EACH  INSTRUCTION TEST IS VERIFIED UNDER * THE FOLLOWING CONDITIONS: * * (1) ADDRESSING MODES: THERE ARE SIX MODES. *  ABSOLUTE DIRECT ADDRESSING (SPAD) * ABSOLUTE INDIREC ADDRESSING * RELATIVE DIRECT ADDRESSING *  RELATIVE INDIRECT ADDRESSING * INDEXED DIRECT ADDRESSING * INDEXED INDIRECT ADDRESSING * * (2) WORD MODE * * (3) BYTE MODE * * (4) MULTIPLE LEVEL INDIRECT ADDRESSING * ******************************************************* TITL ******************************************************* * * PROGRAM STRUCTURE: PROGRAM IS DIVIDED INTO THE *  FOLLOWING SECTIONS: * * B04000 -- IN THIS SECTION 'COPY 4REG,MEM' * INSTRUCTION IS TESTED UNDER ALL THE *  ADDRESSING MODE AND UNDER WORD MODE. * * B05000 -- SAME TEST AS IN SECTION B0400 EXCEPT IT IS * PERFORMED UNDER BYTE MODE. * * B06000 -- IN THIS SECTION * 'COPY 4REG,MEM' AND 'CSK 2REG,MEM' ARE * EXECUTED UNDER MULTIPLE LEVEL INDIRECT * ADDRESSING FOR WORD MODE. * ******************************************************* ************************************************** * *----- B04000 ----- * * ADDRESSIN MODES ON COPY 4REG,MEM * -- WORD MODE -- ************************************************** * * ****** * ABSOLUTE DIRECT ADDRESSING. USING 'A'. * -- WORD MODE -- ****** * B04000 EQU $ COPY STATSV,A COPY A,S SET PSW COPY =:0F,A COPY A,TEMP01 STORE'A' CSK A,TEMP01 NOP ERROR: 'A'=,TEMP01,=:0F,IF,NOT,COPY,FAILED,ELSE,CSK ****** * ABSOLUTE INDIRECT ADDRESSING USING 'A' * -- WORD MODE -- * COPY A,*MEM ****** * * COPY A,*MEM * B04010 EQU $ COPY STATSV,A  COPY A,S SET 'S' COPY =TEMP01,A COPY A,TEMP02 COPY =:0F,A COPY A,*TEMP02  CSK A,TEMP01 NOP ERROR: CSK,FAILED,IF,'A'=,TEMP01=,:0F,ELSE,COPY,FAILED. PATCHX B04000 ****** * RELETIVE DIRECT ADDRESSING. USING 'A' * -- WORD MODE -- * COPY A,MEM ****** * * COPY A,MEM * B04020 EQU $ COPY STATSV,A COPY A,S SET 'S' COPY =:0F,A COPY A,CEL442 STORE 'A' CSK A,CEL442  NOP ERROR: CSK,FAILED,IF,'A'=,CEL442,=:0F,ELSE,COPY,FAILED. * ****** * RELATIVE INDIRECT ADDRESSING. USING 'A' *  -- WORD MODE -- * COPY A,*MEM ****** * * COPY A,*MEM * B04030 EQU $ COPY STATSV,A COPY A,S  SET PSW COPY =CEL442,A COPY A,CEL441 CEL441 = CEL442 ADD. COPY =:FF,A FF TO 'A' COPY A,*CEL441 CSK A,CEL442 NOP ERROR: CSK,FAILED,IF,'A'=CEL442,=:FF,ELSE,COPY,FAILED PATCHX B04020  JMP B04040 LPOOL ****** * INDEXED ADDRESSING USING 'X', (DIRECT) * -- WORD MODE -- * COPY A,1(X) ****** CEL440 WORD 0 CEL441 WORD 1 CEL442 WORD 0 * * COPY A,1(X) * B04040 EQU $ COPY STATSV,A COPY A,S SET PSW COPY =CEL441,X CEL441 ADD IN X COPY =:F0,A COPY A,1(X) STORE 'A' AT CEL442  CSK A,CEL442 NOP ERROR: CSK,FAILED,IF,'A'=,CEL442,=:F0,ELSE,COPY,FAILED. ****** * INDEXED ADDRESSING  USING 'Y'. (DIRECT) * -- WORD MODE -- * COPY A,1(Y) ****** * * * COPY A,1(Y) * B04050 EQU $ COPY STATSV,A COPY A,S SET PSW COPY =CEL441,Y CEL441 ADD IN 'Y' COPY =:A5,A LOAD 'A' WITH :00A5 COPY A,1(Y) STORE 'A' AT CEL442 CSK A,CEL442 NOP ERROR: CSK,FAILED,IF,'A'=:A5,=CEL442,ELSE,COPY,FAILED ****** * INDEXED ADDRESSING USING 'X','Y'.(DIRECT) * -- WORD MODE -- * COPY A,1(X,Y) ****** * * COPY A,1(X,Y) * B04060 EQU $ COPY STATSV,A COPY A,S SET S REG COPY =CEL440,Y CEL440 ADD IN Y COPY =1,X LOAD 'X' BY 1 COPY =:5A,A COPY A,1(X,Y) STORE A AT CEL442 CSK A,CEL442 NOP  ERROR: CSK,FAILED,IF,'A'=:5A,=CEL442,ELSE,COPY,FAILED PATCHX B04040 JMP B04070 ****** * INDIRECT INDEXED ADDRESSING USING 'X'. * -- WORD MODE -- * COPY A,*1(X) ****** CEL470 WORD 0 CEL471 WORD 1 CEL472 WORD 0 * * COPY A,*1(X) * B04070 EQU $ COPY STATSV,A COPY A,S COPY =1,A COPY A,TEMP01 COPY  =CEL471,X COPY =:FF,A LOAD :00FF IN 'A' COPY A,*TEMP01(X) CEL472=:00FF CSK A,CEL472 NOP ERROR: CSK,FAILED,IF,'A'=:FF,=CEL472,ELSE,COPY,FAILED ****** * INDIRECT INDEXED ADDRESSING USING 'Y'. * -- WORD MODE -- * COPY A,*1(Y) ****** * * COPY A,*1(Y) * B04080 EQU $ COPY STATSV,A COPY A,S SET PSW COPY =CEL472,A COPY A,CEL471 CEL471=.CEL472 ADD. COPY =CEL470,Y COPY =:0F,A LOAD 'A' BY :000F COPY A,*1(Y) CEL472=:000F CSK A,CEL472 NOP ERROR: CSK,FAILED,IF,'A'=:0F,=CEL472,ELSE,COPY,FAILED ****** * INDIRECT INDEXED ADDRESSING USING X,Y. * -- WORD MODE -- * COPY A,*1(X,Y) ****** * * COPY A,*1(X,Y) * B04090 EQU $ COPY =1,A COPY A,CEL471 COPY STATSV,A COPY A,S SET S REG COPY =CEL471,X CEL471 ADD IN'X' COPY =CEL470,Y CEL470 ADD IN 'Y' COPY =:55,A COPY A,*1(X,Y) STORE 'A' AT CEL472 CSK A,CEL472 NOP ERROR: CSK,FAILED,IF,'A'=:55,=CEL472,ELSE,COPY,FAILED PATCHX B04070 JMP B04100 LPOOL ****** * ADDRESSING MODES ON 'Q','X', AND 'Y'. * EACH REGISTER IS TESTED UNDER ONE * ADDRESSING MODE ONLY. SELECTION OF A * REGISTER AND ADDRESSING MODE IS RANDOM. * -- WORD MODE -- ****** CEL410 WORD 0 CEL411 WORD 0 CEL412 WORD 0 * ****** * RELATIVE INDIRECT ADDRESSING USING 'Q'. * COPY Q,*MEM ****** * * COPY Q,*MEM * B04100 EQU $ COPY PT6666,Q COPY STATSV,A COPY A,S SET 'S' COPY =CEL412,A COPY A,CEL411 CEL411 =ADD.OF CEL412 COPY Q,*CEL411 STORE 'Q' AT CEL412 CSK Q,CEL412  NOP ERROR: CSK,FAILED,IF,'Q'=:6666,=CEL412,ELSE,COPY,FAILED ****** * INDEXED INDIRECT ADDRESSING USING INDEX *  REGISTER 'Y' ON ''X' * -- WORD MODE -- * COPY X,*1(Y) ****** * * COPY X,*1(Y) * B04110 EQU $ COPY PT00FF,X COPY STATSV,A COPY A,S SET 'S' COPY =CEL412,A COPY A,CEL411 CEL411=ADD.OF CEL41  2 COPY =CEL410,Y COPY X,*1(Y) STORE'X' AT CEL412 COPY X,A CSK A,CEL412 NOP ERROR: 'A'=,CEL412=,:00FF,CEL411=,CEL412 ADDRESS,'Y'=,CEL410,ADD ****** * INDEXED INDIRECT ADDRESSING USING INDEX * REGISTER 'X' ON 'Y' * -- WORD MODE -- * COPY Y,*1(X) ****** * * COPY Y,*1(X) * B04120 EQU $ COPY PTF0F0,Y  COPY STATSV,A COPY A,S SET 'S' COPY =1,A COPY A,TEMP01 COPY =CEL411,X COPY Y,*TEMP01(X) STORE 'Y' AT CEL412 COPY Y,A CSK A,CEL412 NOP ERROR: 'A'='Y'=,CEL412=,:F0F0,CEL411=,CEL412,ADD PATCHX B04100 COPY PCOUNT,A CSK A,=:0011 NOP ERROR: SOME,OF,TESTS,NOT,EXECUTED GLPOL: TITL INSTRUCTION DIAGNOSTIC -- SEC. B0-5 ************************************************** * *----- B05000 ----- * * ADDRESSING MODES ON COPY 4REG,MEM * -- BYTE MODE -- * ************************************************** * ****** * ABSOLUTE DIRECT ADDRESSING MODE. USING 'A' * -- BYTE MODE -- * COPYB A,SPAD ****** * * COPYB A,SPAD * B05000 EQU $ COPY STATSV,A COPY A,S SET 'S' COPY =0,A COPY A,TEMP01 COPY PTAA55,A COPY PT55AA,Q SBIT 2,S COPYB A,TEMP01 RBIT 2,S COPY =:5500,A CSK A,TEMP01 NOP ERROR: COPY,FAILED,--,A,=,TEMP01,=,:5500 SBIT 2,S COPYB Q,TEMP01+1 RBIT 2,S CSK Q,TEMP01 NOP ERROR: COPY,FAILED,--,Q,=,TEMP01,=,:55AA PATCHX B05000 ****** * ABSOLUTE INDIRECT ADDRESSING. USING 'A' * -- BYTE MODE -- * COPY A,*SPAD ****** * * COPY A,*SPAD * B05010 EQU $ COPY =TEMP01,A SHIFT A,LO,1 TEMP01 BYTE ADD. IN 'A' COPY A,TEMP02 TEMP02 = TEMP01 BYTE ADD. COPY =0,A COPY A,TEMP01 COPY STATSV,A COPY A,S SET 'S' COPY PTAA55,A  SBIT 2,S COPY A,*TEMP02 :55 TO TEMP01 BYTE 0 RBIT 2,S COPY =:5500,A CSK A,TEMP01  NOP ERROR: COPY,FAILED,--,A,=,TEMP01,=,:5500 PATCHX B05010 JMP B05020 LPOOL ****** * RELATIVE DIRECT ADDRESSING USING 'A' * -- BYTE MODE -- * COPYB A,MEM ****** * * COPYB A,MEM * B05020 EQU $ COPY  STATSV,A COPY A,S SET 'S' COPY =0,A COPY A,CEL542 COPY PTAA55,A COPY PT55AA,Q SBIT 2,S COPYB A,CEL542 RBIT 2,S COPY =:5500,A CSK A,CEL542 NOP ERROR: COPY,FAILED,--,A,=,CEL542,=,:5500 SBIT 2,S COPYB Q,CEL542+1 RBIT 2,S CSK Q,CEL542  NOP ERROR: COPY,FAILED,--,Q,=,CEL542,=,:55AA PATCHX B05020 ****** * RELATIVE INDIRECT ADDRESSING USING 'A' * -- BYTE MODE -- * COPY A,*MEM MEM = BYTE ADD. OF DESTINATION. ****** * * * COPY A,*MEM * B05030 EQU $  COPY =0,A COPY A,CEL540 COPY =CEL540,A SHIFT A,LO,1 COPY A,CEL542 IMS CEL542  CEL542 = CEL540 BYTE 1 ADD COPY STATSV,A COPY A,S COPY =:AA,A COPY PT55AA,Q SBIT 2  ,S COPY Q,*CEL542 RBIT 2,S CSK A,CEL540 NOP ERROR: COPY,FAILED,--,Q,=,CEL540,=,:AA  PATCHX B05030 JMP B05040 LPOOL 2 ****** * INDEXED DIRECT ADDRESSING. INDEX REG. IS 'X' * -- BYTE MODE -- * COPY A,(NTCX) 'X'= BYTE ADD. * EA= 'X'+CNT ****** * CEL540 WORD 0 CEL541 WORD 0 CEL542 WORD 0 LPOOL * * COPY A,1(X) * B05040 EQU $ COPY =CEL541,X SHIFT X,LO,1 CEL541 BYTE ADD IN 'X' COPY STATSV,A COPY A,S COPY =0,A COPY A,CEL542 COPY =:5566,A SBIT 2,S COPY A,2(X) :66 TO CEL542 BYTE 00 RBIT 2,S COPY =:6600,A CSK A,CEL542 NOP  ERROR: COPY,FAILED,--,A,=,CEL542,=,:6600 PATCHX B05040 ****** * INDEXED DIRECT ADDRESSING. INDEX REG. = 'Y' *  -- BYTE MODE -- * COPY A,CNT(Y) 'Y'= WORD ADD * EA = 2(Y) + CNT ****** * * COPY A,CNT(Y) * B05050 EQU $ COPY =CEL541,Y CEL541 WORD ADD IN 'Y' COPY STATSV,A COPY A,S COPY =0,A COPY A,CEL542 COPY =:5566,A SBIT 2,S COPY A,2(Y) CEL542 BYTE0 =:66 RBIT 2,S COPY =:6600,A CSK A,CEL542 NOP ERROR: COPY,FAILED,--,A,=,CEL542,=,:6600 PATCHX B05050 ****** *  INDEXED DIRECT ADDRESSING USING 'X' & 'Y' * -- BYTE MODE -- * COPY A,CNT(X,Y) 'X'=BYTE ADD. *  'Y'= WORD ADD. * EA = 2(Y) + CNT + (X) ****** * * COPY A,CNT(X,Y) * B05060 COPY =CEL540,Y CEL540 WORD ADDRESS IN 'Y' COPY =2,X COPY STATSV,A COPY A,S COPY =0,A COPY A,CEL542  COPY =:5566,A SBIT 2,S COPY A,2(X,Y) CEEL542 BYTE 0 = :66 RBIT 2,S COPY =:6600,A  CSK A,CEL542 NOP ERROR: COPY,FAILED,--,A,=,CEL542,=,:6600 PATCHX B05060 JMP B05070 LPOOL 4 ****** * INDEXED INDIRECT ADDRESSING USING 'X'. * -- BYTE MODE -- * COPY A,*CNT(X) AP =(CNT) (AP)=BYTE ADD * EA= (AP)+(X) * 'X'=BYTE ADD ****** * CEL570 WORD 0 CEL571 WORD 0 CEL572 WORD 0 * * COPY A,*CNT(X) * B05070 EQU $ COPY =2,A COPY A,TEMP01 COPY =CEL571,X SHIFT X,LO,1 CEL571 BYTE ADD IN 'X' COPY STATSV,A COPY A,S COPY =0,A COPY A,CEL572 COPY =:66FF,A SBIT 2,S COPY A,*TEMP01(X) CEL572 BYTE0 =:FF RBIT 2,S COPY =:FF00,A CSK A,CEL572 NOP ERROR: COPY,FAILED,--,A,=,CEL572,=,:FF00 PATCHX B05070 ****** * INDEXED INDIRECT ADDRESSING USING 'Y'. * -- BYTE MODE -- * COPY A,*CNT(Y) AP=(CNT)+(Y) (AP)=BYTE ADD. * EA=(AP) ****** * * COPY A,*CNT(Y) * B05080 EQU $ COPY =CEL572,A SHIFT A,LO,1 CEL572 BYTE ADD IN 'A' COPY A,CEL571 COPY =CEL570,Y COPY STATSV,A COPY A,S COPY =0,A COPY A,CEL572 COPY =:66FF,A SBIT 2,S COPY A,*1(Y) CEL572 BYTE0 =:FF RBIT 2,S COPY =:FF00,A CSK   A,CEL572 NOP ERROR: COPY,FAILED,--,A,=,CEL572,=,:FF00 PATCHX B05080 ***** * INDEXED INDIRECT ADDRESSING USING 'X'& 'Y'. * -- BYTE MODE -- * COPY A,*CNT(Y,Y) AP =(Y) +(CNT) * EA = (AP) + (X) ****** * * COPY A,*CNT(X,Y) * B05090 EQU $ COPY =CEL572,A SHIFT A,LO,1 CEL572 BYTE ADD IN 'A' COPY A,CEL571 COPY =CEL570,Y COPY =0,X COPY STATSV,A COPY A,S COPY =0,A COPY  A,CEL572 COPY =:FF66,A COPY =:66FF,Q SBIT 2,S COPY A,*1(X,Y) CEL572 BYTE0 =:66 RBIT  2,S COPY =:6600,A CSK A,CEL572 NOP ERROR: COPY,FAILED,--,A,=,CEL572,=,:6600 COPY =1,X SBIT 2,S COPY Q,*1(X,Y) CEL572 BYTE1 =:FF RBIT 2,S CSK Q,CEL572 NOP ERROR: COPY,FAILED,--,Q,=,CEL572,=,:66FF PATCHX B05090 JMP B050B0 LPOOL ****** * TEST ADDRESSING MODES ON 'X' & 'Y'. * -- BYTE MODE -- ****** * CEL5A0 WORD 0 CEL5A1 WORD 0 CEL5A2 WORD 0 ****** * INDEXED DIRECT ADDRESSING * --BYTE MODE -- * COPY X,CNT(Y) * COPY Y,CNT(X) ****** * * * COPY X,CNT(Y) * B050B0 EQU $ COPY  =CEL5A0,Y COPY PT5555,X COPY STATSV,A COPY A,S SBIT 2,S COPY X,2(Y) CEL5A1 BYTE0 =:55 COPY X,3(Y) CEL5A1 BYTE1 =:55 RBIT 2,S COPY PT5555,A CSK A,CEL5A1 NOP  ERROR: COPY,FAILED.,'X'=:5555,CEL5A1=,:5555 * * COPY Y,CNT(X) * B050B1 EQU $ COPY =CEL5A0,X SHIFT X,LO,1 CEL5A0 BYTE ADD IN 'X' COPY PTF0F0,Y COPY STATSV,A COPY A,S SBIT 2,S COPY Y,2(X) CEL5A1 BYTE0 =:F0 COPY Y,3(X) 1 =:F0 RBIT 2,S COPY PTF0F0,A CSK A,CEL5A1 NOP ERROR: COPY,FAILED,'Y'=,:F0F0,=CEL5A1 PATCHX B050B1 JMP B06000 TITL INSTRUCTION DIAGNOSTIC -- SEC. B0-6 ************************************************** * * ----- B06000 ----- * * TEST COPY 4REG,MEM USING MULTIPLE LEVEL * INDIRECT ADDRESSING FOR WORD MODE. * ************************************************** * * INDEXED INDIRECT ADDRESSING USING 'X'. * * COPY A,*TEMP01(X) TEMP01 = AP1 * (TEMP01) = TEMP02 = AP2 XA=0, BIT 15=1 * (TEMP02) + (X) = EA ************************************************* * * COPY A,*MEM(X) * B06000 EQU $ COPY =:0110,A COPY A,S RESET XA COPY =0,A COPY A,TEMP02 COPY =TEMP02,A OR =:8000,A COPY A,TEMP01 TEMP01 = TEMP02 ADD + BIT 15 SET COPY =TEMP,X  COPY PTFFFF,A COPY A,*TEMP01(X) :FFFF TO TEMP COPY STATSV,Q COPY Q,S CSK A,TEMP  NOP ERROR: CSK,FAILED,IF,'A'=,:FFFF,=TEMP,ELSE,COPY PATCHX B06000 ************************************************* * * INDEXED INDIRECT ADDRESSING USING 'Y'. * * COPY A,*TEMP01(Y) TEMP01 + (Y) = AP1 *  (AP1) = TEMP02 = AP2 XA=0, BIT 15=1 * (TEMP02) = EA * **********************************  *************** * * COPY A,*0(Y) * B06010 EQU $ COPY =:0110,A COPY A,S RESET XA COPY =0,A  COPY =TEMP,A COPY A,TEMP02 TEMP02 = TEMP ADD. COPY =TEMP02,A OR PT8000,A COPY A,TEMP01 TEMP01 = TEMP02 ADD + BIT15 SET COPY =TEMP01,Y Y = TEMP01 ADD. COPY PTAAAA,Q COPY Q,*0(Y) :AAAA TO TEMP COPY STATSV,A COPY A,S RESTORE XA CSK Q,TEMP NOP ERROR: CSK,FAILED,IF,'A'=,:FFFF,=TEMP,ELSE,COPY PATCHX B06010 COPY PCOUNT,A CSK A,=:001E NOP ERROR: SOME,OF,TESTS,NOT,EXECUTED GLPOL: TITL INSTRUCTION DIAGNOSTIC -- SEC. B1-1 ****************************************************** * * ----------- SECTION B1 ---------- * * TESTING OF THE FOLLOWING INSTRUCTIONS: * * COPY MEM,4REG B11000 * CSK 2REG,MEM B12000 * ADD MEM,4REG B13000 * SUB MEM,4REG B14000 * JST MEM B16000 * EXCH MEM,4REG B17000 * ****************************************************** * ****************************************************** * * ----------- TEST STRUCTURE ---------- * * B11000 -- COPY MEM,4REG IS TESTED IN BYTE MODE * (WORD MODE TESTED IN SEC. A0). BYTE * ADDRESSABILITY OF THREE SUCCESSIVE *  BYTES IS TESTED. ONE ADDRESSING MODE * IS TESTED * * B12000 -- SAME AS B11000, PLUS ONE SPECIAL CASE IS TESTED * * B13000 -- ADD MEM,4REG IS TESTED FOR POSITIVE * AND NEGATIVE OVERFLOW, IN ADDITION TO * NORMAL OPERATION, WITH ONE ADDRESSING * MODE. WORD MODE AND BYTE MODE ARE TESTED * * B14000 -- SUB MEM,4REG IS TESTED WITH ONE ADDRESSING * MODE. WORD MODE AND BYTE MODE ARE TESTED. * * B16000 -- JST MEM IS TESTED WITH ONE ADDRESSING MODE * * B17000 -- EXCH MEM,4REG IS TESTED WITH ALL ADDRESSING * MODES. WORD MODE AND BYTE MODE ARE TESTED. * ****************************************************** TITL ******************************************************* * * ---- SECTION B11000 ---- * * TEST COPY MEM,REG USING * POST INDEXED DIRECT ADDRESSING - BYTE MODE. * THREE ADJACENT BYTE ADDRESSES ARE CHECKED. * ******************************************************* B11000 COPY PT55AA,A COPY A,TEMP01  COPY A,TEMP02 COPY =TEMP01,X SHIFT X,LO,1 SBIT 2,S COPY 0(X),A COPY 1(X),Q  COPY 2(X),Y RBIT 2,S CSK A,=:55 NOP ERROR: COPY,FAILED,--,A,SHOULD,=,:55 CSK  Q,=:AA NOP ERROR: COPY,FAILED,--,Q,SHOULD,=,=AA CSK Y,=:55 NOP ERROR: COPY,FAILED,--,Y,SHOULD,=,:55 PATCHX B11000 TITL INSTRUCTION DIAGNOSTIC -- SEC. B1-2 ******************************************************* * * TEST CSK REG,MEM USING * PRE INDEXED DIRECT ADDRESSING - BYTE MODE. * ******************************************************* B12000 EQU $ COPY PT00FF,A COPY A,TEMP01 COPY PT55AA,A COPY A,TEMP02 COPY =TEMP01,Y COPY =:55,A SBIT 2,S CSK A,0(Y) COMPARE A TO 0 ERROR: CSK,FAILED  ,--,A,>,MEM JMP $+2 ERROR: CSK,FAILED,--,A,>,MEM SBIT 2,S CSK A,1(Y) COMPARE A TO :FF  JMP $+3 NOP ERROR: CSK,FAILED,--,A,<,MEM SBIT 2,S CSK A,2(Y) COMPARE A TO :55 NOP ERROR: CSK,FAILED,--,A,=,MEM RBIT 2,S ****** * * SPECIAL CASE CSK TEST -- WORD MODE * ****** COPY PT8000,Q COPY =1,A COPY A,TEMP01 CSK Q,TEMP01 JMP $+3 NOP ERROR: CSK,FAILED,--,Q,<,MEM PATCHX B12000 TITL INSTRUCTION DIAGNOSTIC -- SEC. B1-3 ******************************************************* * * ---- SECTION B1-3 * * TEST ADD MEM,REG USING * DIRECT RELATIVE ADDRESSING * ******************************************************* * * ADD MEM,A WORD MODE * B13000 EQU $ COPY STATSV,A COPY A,S  COPY PT5555,A COPY A,CEL300 COPY =:1FFF,A ADD CEL300,A CSK A,=:7554 NOP  ERROR: ADD,FAILED,--,A,SHOULD,=,:7554 * * ADD MEM,Q OVERFLOW * COPY =:5AAA,A COPY A,CEL300  COPY =:2FFF,Q ADD CEL300,Q JT OV,$+2 ERROR: ADD,FAILED,--,DID,NOT,SET,OVERFLOW CSK Q,=:8AA9 NOP ERROR: ADD,FAILED,--,Q,SHOULD,=,:8AA9 * * ADD MEM,X OVERFLOW * COPY STATSV,A  COPY A,S COPY PTAAAA,A COPY A,CEL300 COPY =:A000,X ADD CEL300,X JT OV,$+2  ERROR: ADD,FAILED,--,DID,NOT,SET,OVERFLOW COPY X,A CSK A,=:4AAA NOP ERROR: ADD,FAILED,--,X,SHOULD,=,4AAA * * ADDB MEM,Y BYTE MODE * COPY STATSV,A COPY A,S COPY =:0010,Y COPY =:FF10,Q COPY Q,CEL300 SBIT 2,S ADDB CEL300,Y RBIT 2,S COPY Y,A CSK A,=:010F NOP ERROR: ADDB,FAILED,--,Y,SHOULD,=,:010F PATCHX B13000 JMP B14000 LPOOL CEL300 RES 1,0 TITL INSTRUCTION DIAGNOSTIC -- SEC. B1-4 ******************************************************* * * ---- SECTION B14000 * * TEST SUB MEM,REG USING * ABSOLUTE DIRECT ADDRESSING * ******************************************************* * * SUB MEM,A * B14000 COPY STATSV,A COPY A,S COPY =:0100,A COPY A,TEMP01 COPY =:000A,A SUB TEMP01,A CSK A,=:FF0A NOP ERROR: SUB,FAILED,--,A,SHOULD,=,:FF0A * * SUBB MEM,Q * COPY =:50,Q COPY =:48,A COPY A,TEMP01 SBIT 2,S SUBB TEMP01+1,Q RBIT  2,S CSK Q,=:08 NOP ERROR: SUBB,FAILED,--,Q,SHOULD,=,:0008 PATCHX B14000 TITL INSTRUCTION DIAGNOSTIC -- SEC. B1-6 ******************************************************* * * TEST JST MEM USING * RELATIVE DIRECT ADDRESSING * ******************************************************* B16000 EQU $ COPY STATSV,A COPY  A,S JST B16002 B16001 EQU $ ERROR: JST,FAILED JMP B16003 B16002 ENT COPY =B16001,A  CSK A,B16002 NOP ERROR: JST,FAILED,--,WRONG,RETURN,ADDRESS B16003 EQU $ PATCHX B16000 TITL   INSTRUCTION DIAGNOSTIC -- SEC. B1-7 ******************************************************* * *------------ SECTION B1-7 ------------- * * OBJECTIVE: EXTENSIVE TESTING OF THE FOLLOWING * INSTRUCTIONS: * * EXCH MEM,4REG * * *----- TEST STRUCTURE ----- * * 'EXCH' IS VERIFIED UNDER ALL THE ADDRESSING * MODES, WORD MODE AND BYTE MODE * ******************************************************* TITL ******************************************************* * *----- SECTION B17000 ----- * **** * -- WORD MODE -- * ABSOLUTE DIRECT ADDRESSING ***** ******************************************************* B17000 EQU $ COPY =0,A COPY PTF0F0,Q COPY Q,TEMP01 EXCH TEMP01,A COPY =0,Q  CSK Q,TEMP01 NOP ERROR: 'EXCH',FAILED,TEMP01,SHULD,=0 CSK A,PTF0F0 NOP ERROR: EXCH,FAILED,A,SHOULD,=,:F0F0 ****** * * ABSOLUTE INDIRECT ADDRESSING * --WORD MODE-- * ****** B17010 EQU $ COPY  PTF0F0,Q COPY PTFFFF,X COPY =TEMP01,A COPY A,TEMP02 COPY Q,TEMP01 EXCH *TEMP02,X  COPY PTFFFF,A CSK A,TEMP01 NOP ERROR: 'EXCH',IN,INDIRECT,ADD,FAILED COPY X,A CSK A,PTF0F0 NOP ERROR: EXCH,FAILED,X,SHOULD,=,:F0F0 PATCHX B17000 JMP B17020 ****** * *----- B17020 ----- * * RELATIVE DIRECT AND INDIRECT ADDRESSING * --WORD MODE** E-- * ***** CEL171 RES 1,0 CEL172 RES 1,0 B17020 EQU $ COPY PTFFFF,A COPY PTF0F0,Q COPY Q,CEL175 EXCH CEL175,A COPY PTFFFF,Q CSK Q,CEL175 NOP ERROR: EXCH,FAILED,CEL175,SHOULD,=,:FFFF CSK A,PTF0F0 NOP  ERROR: EXCH,FAILED,A,SHOULD,=,:F0F0 * * INDIRECT RELATIVE * COPY =CEL174,A COPY A,CEL173 COPY PT00FF,X COPY =0,A COPY A,CEL174 EXCH *CEL173,X COPY PT00FF,A CSK A,CEL174 NOP ERROR: EXCH,FAILED,CEL174,SHOULD,=,:00FF CSK X,=0 NOP ERROR: EXCH,FAILED,X,SHOULD,=,0 PATCHX B17020 JMP B17030 LPOOL ****** * *----- B17030 ----- * * INDEX DIRECT AND INDIRECT ADDRESSING USING 'X' * -- WORD MODE-- ***** CEL173 WORD 0 CEL174 WORD 0 CEL175 WORD 0 B17030 EQU $ COPY PT00FF,Q COPY PTFFFF,Y COPY PTFFFF,A COPY =CEL174,X CEL174 ADD IN 'X' COPY Q,CEL175 EXCH 1(X),Y CEL175 SHULD = :FFFF CSK A,CEL175 NOP ERROR: 'EXCH',FAILED,CEL175,SHULD,=:FFFF COPY Y,A CSK A,PT00FF NOP ERROR: EXCH,FAILED,A,SHOULD,=,:00FF * * INDIRECT INDEX 'X' * COPY =1,A COPY A,TEMP01 COPY =CEL174,X COPY =0,A COPY A,CEL175 EXCH *TEMP01(X),Y CSK Q,CEL175 NOP ERROR: 'Q',SHULD,=,CEL175,=:00FF COPY Y,A CSK A,=0 NOP ERROR: EXCH,FAILED,Y,SHOULD,=,0 PATCHX B17030 ****** * *----- B17040 ----- * * INDEX DIRECT AND INDIRECT ADDRESSING USING 'Y' * --WORD MODE-- * ****** B17040 EQU $ COPY PTFFFF,A COPY PT00FF,Q COPY PTFFFF,X COPY   =CEL173,Y COPY Q,CEL174 EXCH 1(Y),X CSK A,CEL174 NOP ERROR: 'A',SHOULD,=,CEL174,=:FFFF COPY X,A CSK A,PT00FF NOP ERROR: EXCH,FAILED,X,SHOULD,=,:00FF * * INDIRECT INDEX 'Y' *  COPY =CEL175,A COPY A,CEL174 COPY =CEL173,Y COPY =0,A COPY A,CEL175 EXCH *1(Y),X CSK Q,CEL175 NOP ERROR: 'Q',SHULD,=,CEL175,=:00FF CSK X,=0 NOP ERROR: EXCH,FAILED,X,SHOULD,=,0 PATCHX B17040 ****** * *----- B17050 ----- * * INDEX DIRECT AND INDIRECT ADDRESSING USING HX' 'Y' * --WORD MODE-- * ****** B17050 EQU $ COPY PTFFFF,A COPY PTFFFF,Q COPY =CEL173,Y COPY =1,X COPY X,CEL175 EXCH 1(X,Y),A CSK Q,CEL175 NOP ERROR: 'Q',SHULD,=,CEL175,=:FFFF CSK A,=1 NOP ERROR: EXCH,FAILED,A,SHOULD,=,1 * * INDIRECT INDEX 'X' 'Y' * COPY =1,X  COPY X,CEL174 CEL174 = 1 COPY =CEL173,Y COPY =CEL174,X COPY A,CEL175 CEL 175 = 1  COPY PTFFFF,A EXCH *1(X,Y),Q CSK A,CEL175 NOP ERROR: 'A',SHULD,=,CEL175,=:FFFF CSK Q,=1 NOP ERROR: EXCH,FAILED,Q,SHOULD,=,1 PATCHX B17050 JMP B17060 LPOOL ****** * *----- B17060 ----- * * ABSOLUTE DIRECT AND INDIRECT ADDRESSING * -- BYTE MODE -- * ****** B17060 EQU $ COPY  PTF0F0,Q COPY PT6666,Y COPY Q,TEMP01 :F0F0 - TEMP01 SBIT 2,S EXCHB Y,TEMP01 RBIT 2,S COPY =:66F0,A CSK A,TEMP01 NOP ERROR: 'A',SHULD,=,TEMP01,=:66F0 COPY Y,A  CSK A,=:F0 NOP ERROR: EXCHB,FAILED,Y,SHOULD,=,:F0 * * ABSOLUTE INDIRECT * COPY PT00FF,X  COPY =TEMP01,A SHIFT A,LO,1 BYTE ADD COPY A,TEMP02 TEMP02 = TEMP01 BYTE ADD (BYTE 0) COPY A,TEMP IMS TEMP TEMP = TEMP01 BYTE ADD (BYTE 1) COPY PT55AA,A COPY A,TEMP01 SBIT 2,S EXCH Q,*TEMP02 TEMP01 BYTE0 =F0 EXCH X,*TEMP TEMP01 BYTE1 = FF RBIT 2,S COPY =:F0FF,A CSK A,TEMP01 NOP ERROR: EXCH,FAILED,A,SHOULD,=,:F0FF CSK Q,=:55 NOP  ERROR: EXCH,FAILED,Q,SHOULD,=,:55 COPY X,Q CSK Q,=:AA NOP ERROR: EXCH,FAILED,X,SHOULD,=,.:66 PATCHX B17060 JMP B17070 ****** * *----- B17070 ----- * * RELATIVE DIRECT AND INDIRECT ADDRESSING *  -- BYTE MODE -- * ****** CEL177 RES 1 CEL178 RES 1 B17070 EQU $ COPY =:F0AA,A COPY PTAAAA,Q COPY PTF0F0,X COPY Q,CEL177 :AAAA IN SBIT 2,S EXCHB X,CEL177 RBIT 2,S CSK A,CEL177 NOP ERROR: 'A',SHOULD,=,CEL177,=:F0AA COPY X,A CSK A,=:AA NOP ERROR: EXCH,FAILED,X,SHOULD,=,:AA * * INDIRECT RELATIVE * COPY =CEL178,A SHIFT A,LO,1 BYTE ADD COPY  A,CEL177 COPY Q,CEL178 COPY PTF0F0,X COPY =:F0AA,A SBIT 2,S EXCH X,*CEL177  RBIT 2,S CSK A,CEL178 NOP ERROR: 'A',SHOULD,=,CEL178,=:AAF0 COPY X,A CSK A,=:AA  NOP ERROR: EXCH,FAILED,X,SHOULD,=,:AA PATCHX B17070 JMP B17080 LPOOL ****** * *----- B17080 ----- * * INDEX DIRECT AND INDIRECT ADDRESSING 'X' AND 'Y' * --BYTE MODE -- * ***** CEL179 RES 1 CEL180 RES 1 CEL181 RES 1 B17080 EQU $ COPY PTFFFF,A COPY PTF0F0,Q COPY =CEL179,X SHIFT X,LO,1  CEL179 BYTE ADD IN 'X' COPY A,CEL179 CEL179 = :FFFF. COPY Q,CEL180 CEL180 = :F0F0 COPY  =CEL179,Y CEL179 WORD ADD IN 'Y' SBIT 2,S EXCH 1(X),Q , CEL179 = :FFF0, Q=:00FF EXCHB 2(Y),A CEL180 = :FFF0, A=:00F0 RBIT 2,S CSK A,=:F0 NOP ERROR: EXCH,FAILED,A,SHOULD,=,:F0 CSK Q,=:FF NOP ERROR: EXCH,FAILED,A,SHOULD,=,:FF COPY =:FFF0,A CSK A,CEL179 NOP ERROR: 'A',SHOULD,=,CEL179,=:FFF0 CSK A,CEL180 NOP ERROR: CEL180,SHOULD,=:FFF0 * * INDIRECT INDEX USING (X) * COPY =2,A COPY A,TEMP01 COPY =CEL179,X SHIFT X,LO,1 CEL179 BYTE ADD IN 'X' COPY PT5555,A COPY A,CEL180 COPY =0,Q SBIT 2,S EXCH *TEMP01(X),Q  RBIT 2,S COPY =:0055,A CSK A,CEL180 NOP ERROR: 'A',SHULD,=,CEL180,=:0055 CSK Q,=:55 NOP ERROR: EXCH,FAILED,Q,SHOULD,=,:55 * * INDIRECT INDEX USING (Y) * COPY =CEL179,Y COPY =CEL181,A SHIFT A,LO,1 COPY A,CEL180 COPY PTF0F0,A COPY A,CEL181 COPY PTFFFF,A  SBIT 2,S EXCH A,*1(Y) RBIT 2,S COPY =:FFF0,Q CSK Q,CEL181 NOP ERROR: EXCH,FAILED,CEL181,SHOULD,=,:FFF0 CSK A,=:F0 NOP ERROR: EXCH,FAILED,A,SHOULD,=,:F0 PATCHX B17080  GLPOL: ***** * *----- B17090 ----- * * INDEX DIRECT AND INDIRECT ADDRESSING USING (X,Y) * -- BYTE MODE -- * ****** B17090 EQU $ COPY =CEL180,Y COPY =1,X COPY PTFFFF,A COPY A,CEL181 COPY PTF0F0,A  SBIT 2,S EXCH 2(X,Y),A RBIT 2,S CSK A,=:FF NOP ERROR: EXCH,FAILED,A,SHOULD,=,:FF COPY =:FFF0,A CSK A,CEL181 NOP ERROR: EXCH,FAILED,CEL181,SHOULD,=,:FFF0 * * INDIRECT INDEX * COPY PTFFFF,Q COPY =CEL181,A SHIFT A,LO,1 CEL181 BYTE ADD IN HA' COPY A,CEL180 COPY =CEL179,Y 'Y' = CEL179 ADD COPY =0,X COPY PT6666,A COPY A,CEL181 CEL181 =:6666 COPY =:FF66,A SBIT 2,S EXCH *1(X,Y),Q RBIT 2,S CSK A,CEL181 NOP  ERROR: 'A',SHULD,=,CEL181,=:FF00 CSK Q,=:66 NOP ERROR: EXCH,FAILED,Q,SHOULD,=,:66 PATCHX B17090 ***** * *----- B170A0 ----- * * INDEX MULTILEVELINDIRECT ADDRESSING USING 'X' * ***** B170A0 EQU $ COPY =:0110,A COPY A,S COPY =0,A COPY A,TEMP02 COPY =TEMP02,A OR =:8000,A COPY A, TEMP01 COPY =TEMP,X COPY PTAAAA,A COPY A,TEMP COPY PTFFFF,A EXCH A,*TEMP01(X)  CSK A,PTAAAA NOP ERROR: EXCH,FAILED,A,SHOULD,=,:AAAA COPY TEMP,Q CSK Q,PTFFFF NOP  ERROR: EXCH,FAILED,TEMP,SHOULD,=,:FFFF * * INDEX MULTILEVEL INDIRECT ADDRESSING USING 'Y' * B170B0 EQU $ COPY =:0110,A COPY A,S COPY =TEMP,A COPY A,TEMP02 COPY =TEMP02,A OR PT8000,A  COPY A,TEMP01 COPY =TEMP01,Y COPY PTFFFF,A COPY A,TEMP COPY PTAAAA,Q EXCH Q,*0(Y) CSK Q,PTFFFF NOP ERROR: EXCH,FAILED,Q,SHOULD,=,:FFFF COPY TEMP,A CSK A,PTAAAA  NOP ERROR: EXCH,FAILED,TEMP,SHOULD,=,:AAAA COPY STATSV,A COPY A,S PATCHX B170A0 COPY  PCOUNT,A CSK A,=:2D NOP ERROR: SOME,OF,TESTS,NOT,EXECUTED GLPOL: TITL INSTRUCTION DIAGNOSTIC -- SEC. C ************************************************** * * ----------- SECTION C ---------- * * TESTING OF THE FOLLOWING INSTRUCTIONS: * * NEG 8REG,8REG C02000 * ADD 8REG,8REG C11000 * SUB 8REG,8REG C12000 * AND 8REG,8REG C13000 * XOR 8REG,8REG C14000 * OR 8REG,8REG C15000 * CSM 8REG,8REG C21000 * CSN 8REG,8REG C22000 * CSK 8REG,8REG C23000 * EXCH 8REG,8REG C24000 * COMP 8REG,8REG C25000 * ************************************************** * * ----------- TEST STRUCTURE ---------- * * EACH INSTRUCTION IS TESTED FOR CORRECT * OPERATION WITH A DIFFERENT REGISTER PAIR * FOR EACH INSTRUCTION, OR EACH CONDITION * OF AN INSTRUCTION. NEG & ADD ARE CHECKED * FOR CORRECT SETTING OF OV. CSM, CSN, & CSK * ARE CHECKED FOR ALL COMPARE OUTCOMES. * ************************************************** TITL INSTRUCTION DIAGNOSTIC -- SEC. C0-2 ***** * * ---- C02000 ----- * * NEG Q,A * ***** C02000 EQU $ COPY PT5555,Q COPY =0,A NEG Q,A CSK A,=:AAAB NOP ERROR: NEG,FAILED,--,A,SHOULD,=,:AAAB COPY =:8000,X NEG X,Q JT OV,$+2 ERROR: NEG,FAILED,--,DID,NOT,SET,OV CSK Q,PT8000 NOP ERROR: NEG,FAILED,--,Q,SHOULD,=,:8000 TITL INSTRUCTION DIAGNOSTIC -- SEC. C1-1 ***** * * ---- C11000 * * ADD Y,X * ***** C11000 EQU $ COPY PT6666,Y COPY =:0FFF,X  ADD Y,X COPY X,A CSK A,=:7665 NOP ERROR: ADD,FAILED,--,X,SHOULD,=,:7665 *** * ADD  L,Y POS. OVERFLOW *** COPY PT5555,Y COPY PT5555,A COPY A,L ADD L,Y JT OV,$+2 ERROR: ADD,FAILED,--,DID,NOT,SET,OV COPY Y,A CSK A,PTAAAA NOP ERROR: ADD,FAILED,--,Y,SHOULD,=,:AAAA *** * ADD K,L NEG. OVERFLOW *** COPY PTAAAA,A COPY A,K COPY A,L ADD K,L JT OV,$+2 ERROR: ADD,FAILED,--,DID,NOT,SET,OV COPY L,A CSK A,=:5554 NOP   ERROR: ADD,FAILED,--,L,SHOULD,=,:5554 TITL INSTRUCTION DIAGNOSTIC -- SEC. C1-2 ***** * * ---- C12000 ---- * *  SUB S,K * ***** C12000 EQU $ COPY =:FF,A COPY A,K COPY =:43,A COPY A,S SUB  S,K COPY STATSV,A COPY A,S COPY K,A CSK A,=:BC NOP ERROR: SUB,FAILED,--,K,SHOULD,=,:BC PATCHX C02000 TITL INSTRUCTION DIAGNOSTIC -- SEC. C1-3 ***** * * ---- C13000 ---- * * AND A,Q * ***** C13000 EQU $ COPY PTF0F0,A COPY PT00FF,Q AND A,Q CSK Q,=:F0 NOP ERROR: AND,FAILED,--,Q,SHOULD,=,:F0 * ***** * * ---- C14000 ---- * * XOR Q,X * ***** C14000 EQU $ COPY PTAAAA,Q COPY PT6666,X XOR Q,X COPY X,A CSK A,=:CCCC NOP ERROR: XOR,FAILED,--,X,SHOULD,=,:CCCC TITL INSTRUCTION DIAGNOSTIC -- SEC. C1-5 ***** * * ---- C15000 ---- * * OR X,Y * ***** C15000 EQU $ COPY PT6666,X COPY PT5555,Y OR X,Y COPY Y,A CSK A,=:7777 NOP  ERROR: OR,FAILED,--,Y,SHOULD,=,:7777 PATCHX C13000 JMP C21000 LPOOL TITL INSTRUCTION DIAGNOSTIC -- SEC. C2-1 ***** * * ---- C21000 ---- * * CSM Y,L * ***** C21000 EQU $ COPY PTFFFF,Y COPY =0,A COPY A,L CSM Y,L GREATER ERROR: CSM,FAILED,--,Y>L JMP $+2 ERROR: CSM,FAILED,--,Y>L *** *  CSM L,K *** COPY PT6666,A COPY A,K CSM L,K LESS JMP $+3 NOP ERROR: CSM,FAILED,--,LY JMP $+2 ERROR: CSK,FAILED,--,X>Y *** * CSK X,K *** COPY PT6666,A COPY A,K CSK X,K LESS JMP $+3 NOP ERROR: CSK,FAILED,--,X :3FEF COPY =:3FE0,A COPY A,L COPY X,K SET STACK POINTER COPY STATSV,A COPY A,S COPY =0,A COPY PT5555,Y * COPY Y,*1(K) DO IT * COPY 0(X),A CHECK CONTENTS OF :3FEE  CSK Y,A NOP ERROR: DID,NOT,STORE,CORRECTLY COPY =:3FEE,A CSK K,A NOP ERROR: INSTRUCTION,CHANGED,K,REGISTER COPY =:3FE0,A CSK A,L NOP ERROR: INSTRUCTION,CHANGED,L,REGISTER * * DIRECT ADDRESSING - LOAD * COPY =:3FE0,A COPY A,L COPY =:3FEF,Q COPY Q,K  COPY Q,X COPY STATSV,A COPY A,S COPY PTAAAA,Q COPY Q,0(X) * COPY 0(K),A *  CSK A,Q NOP ERROR: DID,NOT,LOAD,PROPERLY COPY K,Q CSK Q,=:3FEF NOP ERROR: INSTRUCTION,CHANGED,K,REGISTER COPY L,A CSK A,=:3FE0 NOP ERROR: INSTRUCTION,CHANGED,L,REGISTER * * INDIRECT ADDRESSING - LOAD * COPY =:3FE0,X POINTER VALUE COPY X,:1F(X) =:3FE0 --> :3FFF COPY  X,L INITIALIZE STACK LIMIT COPY X,K INITIALIZE STACK POINTER COPY STATSV,A COPY A,S  COPY PTAAAA,Q COPY Q,0(X) DATA TO :3FE0 * COPY *:1F(K),A DO IT * CSK A,Q NOP  ERROR: DID,NOT,LOAD,CORRECTLY COPY =:3FE0,A CSK A,L NOP ERROR: INSTRUCTION,CHANGED,L,REGISTER  COPY =:3FE0,Q CSK Q,K NOP ERROR: INSTRUCTION,CHANGED,K,REGISTER IMS PCOUNT * JMP PSHPOP LPOOL * * SINGLE REGISTER PUSH INSTRUCTION * PSHPOP EQU $ COPY =:3FE0,Q COPY Q,L  COPY DV3FF2,A COPY A,K COPY =0,A COPY A,SEFLG1 COPY A,SEFLG2 COPY PTFFFF,Q  COPY STATSV,A COPY A,S * PUSH Q * COPY DV3FF1,A CSK A,K NOP ERROR: K,REGISTER,NOT,CORRECT COPY 0(K),A CSK A,Q NOP ERROR: DID,NOT,PUSH,PROPERLY COPY SEFLG2. ,Q JEQ Q,$+2 ERROR: INSTRUCTION,TRAPPED COPY =:3FE0,Q CSK L,Q NOP ERROR: INSTRUCTION,MODIFIED,L,REGISTER COPY DV3FF0,Q COPY Q,L COPY DV3FF2,A COPY A,K COPY =0,A  COPY A,SEFLG2 COPY Q,SEFLG1 COPY PT6666,X COPY STATSV,A COPY A,S * PUSH X * COPY SEFLG2,Q JNE Q,$+2 ERROR: DID,NOT,TRAP COPY *DV3FF1,A CSK A,X NOP  ERROR: DID,NOT,PUSH,X,REGISTER COPY DV3FF0,A CSK A,L NOP ERROR: L,REGISTER,MODIFIED COPY DV3FF1,Q CSK Q,K NOP ERROR: K,REGISTER,NOT,CORRECT * * SINGLE REGISTER POP INSTRUCTION *  COPY =:3FE0,Q COPY Q,L COPY DV3FF1,A COPY A,K COPY =0,A COPY PT5555,Q  COPY STATSV,A COPY A,S COPY Q,*DV3FF1 * POP Y * CSK Q,Y NOP ERROR: POP,DID,NOT,WORK COPY DV3FF2,Q CSK K,Q NOP ERROR: K,REGISTER,INCORRECT COPY =:3FE0,A  CSK A,L NOP ERROR: L,REGISTER,CHANGED IMS PCOUNT JMP PNXTST LPOOL TITL INSTRUCTION DIAGNOSTIC -- PUBLIC NEXT * * PNX - PUBLIC NEXT INSTRUCTION TEST * PNXTST EQU $ COPY =PNXWRD,X GET TEST CELL ADDR. ADD SLVNUM,X GENERATE OFFSET COPY =0,A RESET A COPY A,0(X) RESET PRIVATE CELL COPY =-1,A SET TEST VALUE IN A PNX MAKE A PUBLIC ACCESS COPY A,0(X) STORE WORD PNX MAKE A PUBLIC ACCESS CSK A,0(X) COMPARE TO STORED VALUE NOP ERROR: PNX,FAILED,--,A=PUBLIC,CELL * PNX MAKE A PUBLIC ACCESS IMS 0(X) INC. PUBLIC CELL ERROR: PNX,FAILED,--,'IMS',PUBLIC,CELL,=0 * PNX MAKE A PUBLIC ACCESS EXCH A,0(X) EXCHANGE VALUES PNX MAKE A PUBLIC ACCESS XOR 0(X),A A SHOULD BE -1 AFTER THIS IJNE A,$+2 INC. AND JUMP IF NOT ZERO JMP $+2 IS GOOD ERROR: PNX,FAILED,--,'EXCH',OR,'XOR' * COPY 0(X),A GET PRIVATE CELL JEQ A,$+2 IF ZERO, IS GOOD ERROR: PNX,FAILED,--,SOMEWHERE * PATCHT PNXTST JMP COPPTST * PNXWRD RES 4,0 PNX TEST CELL * LPOOL TITL INSTRUCTION DIAGNOSTIC -- COPY PUBLIC * * COPP - COPY PUBLIC INSTRUCTION TEST * COPPTST EQU $ COPY SLVNUM,Y GENERATE OFFSET COPY =0,A RESET A XNX Y COPY A,TEMP RESET PRIVATE MEMORY CELL COPY =:55,A SET A TO TEST VALUE XNX Y COPP A,TEMP STORE VALUE XNX Y COPP TEMP,Q GET PUBLIC CELL CSM A,Q COMPARE THE TWO NOP ERROR: COPP,FAILED,--,A=Q COPY =TEMP%2,X GET BYTE ADDRESS ADD Y,X GENERATE OFFSET SHIFT A,LO,1 MAKE A=:AA SBIT 2,S SET BYTE MODE COPP A,0(X) STORE VALUE COPP 0(X),Q GET PUBLIC CELL RBIT 2,S SET WORD MODE CSM A,Q COMPARE THE RESULTS NOP ERROR: COPP,IN,BYTE,MODE,FAILED,--,A=Q XNX Y COPY TEMP,A GET PRIVATE MEMORY CELL JEQ A,$+2 IF ZERO, IS GOOD ERROR: COPP,FAILED PATCHT COPPTST JMP IMSBTST DO IMSB TEST  TITL INSTRUCTION DIAGNOSTIC -- PRIVATE MEMORY BIT MANIPULATION * * PRIVATE MEMORY BIT MANIPULATION * IMSBTST EQU $  COPY =ITSTWRD,X GET TEST CELL ADDR. ADD SLVNUM,X GENERATE OFFSET COPY =0,A CLEAR AREG COPY A,Q CLEAR QREG COPY A,0(X) CLEAR TESTED MEMORY WORD COPP A,0(X) CLEAR TESTED PUBLIC MEMORY WORD IRETEST XNX A /  IMSB 0,0(X) DO IT XNX A SBIT 0,Q CHECKING VALUE CSK Q,0(X) NOP ERROR: DID,NOT,SET,BIT ADD =:10,A CSK A,=:100 JMP IRETEST NOP JMP IMS2TST *NOP ME FOR LOOP* JMP IMSBTST DIAGNOSTIC LOOP IMS2TST EQU $ COPY =0,A COPY =-1,Q SET QREG TO ALL F'S COPY Q,0(X) AND THE TESTED MEMORY LOCATION IRETST2 XNX A IMSB 0,0(X) DO IT CSK Q,0(X)  NOP ERROR: IMSB,RESET,BIT ADD =:10,A CSK A,=:100 JMP IRETST2 NOP IMS PCOUNT * * IMRBTST EQU $ COPY =:3,A COPY A,0(X) IMRB 1,0(X) COPY =1,Q CSK Q,0(X) NOP ERROR: DID,NOT,RESET,BIT IMRB 2,0(X) CSK Q,0(X) NOP ERROR: SHOULD,NOT,HAVE,ALTERED,WORD IMS PCOUNT JMP IMCBTST *NOP ME FOR LOOP* JMP IMRBTST DIAGNOSTIC LOOP JMP IMRBTST * IMCBTST EQU $ COPY =3,A COPY A,0(X) IMCB 1,0(X) COPY =1,Q  CSK Q,0(X) NOP ERROR: DID,NOT,COMPLIMENT,CORRECTLY COPY =1,A COPY A,0(X) IMCB  2,0(X) COPY =5,Q CSK Q,0(X) NOP ERROR: DID,NOT,COMPLIMENT,CORRECTLY COPP 0(X),A GET CONTENTS JEQ A,$+2 IF ZERO, IS GOOD ERROR: PUBLIC,MEMORY,WAS,ALTERED IMS PCOUNT JMP ISKPTST *NOP ME FOR LOOP* JMP IMCBTST DIAGNOSTIC LOOP * ITSTWRD RES 4,0 * LPOOL * * FIRST, TEST THE IMSKS INSTRUCTION * ISKPTST EQU $ COPY =ISTWORD,X GET TEST CELL ADDR. ADD SLVNUM,X GENERATE OFFSET COPY =0,A RESET A COPP A,0(X) RESET IT COPY =1,Q SET TEST PATTERN COPY Q,0(X) SET TEST WORD * IMSKS 0,0(X) * JMP $+2 ERROR: SHOULD,NOT,SKIP CSK Q,0(X) NOP ERROR: SHOULD,NOT,ALTER,TEST,WORD COPY Q,0(X) REINITIALIZE TEST WORD * IMSKS 1,0(X) DO IT AGAIN * ERROR: SHOULD,HAVE,SKIPPED COPY =3,Q CSK Q,0(X)  NOP ERROR: DID,NOT,COMPARE IMS PCOUNT * * IMSKR INSTRUCTION * COPY =1,Q COPY Q,0(X) *  IMSKR 1,0(X) * JMP $+2 ERROR: SHOULD,NOT,SKIP CSK Q,0(X) NOP ERROR: DOES,NOT,COMPARE COPY Q,0(X) * IMSKR 0,0(X) * ERROR: DID,NOT,SKIP COPY =0,Q CSK Q,0(X) NOP  ERROR: DID,NOT,COMPARE IMS PCOUNT * * IMSKC INSTRUCTION * COPY =1,Q COPY Q,0(X) * IMSKC  0,0(X) * JMP $+2 ERROR: SHOULD,NOT,SKIP COPY =0,Q CSK Q,0(X) NOP ERROR: DOES,NOT,COMPARE COPY Q,0(X) * IMSKC 0,0(X) * ERROR: SHOULD,HAVE,SKIPPED COPY =1,Q CSK Q,0(X) NOP ERROR: DOES,NOT,COMPARE IMS PCOUNT * * IMSKO INSTRUCTION * COPY Q,0(X) * IMSKO 0,0(X) * ERROR: DID,NOT,SKIP CSK Q,0(X) NOP ERROR: DOES,NOT,COMPARE COPY Q,0(X) * IMSKO 1,0(X) * JMP $+2 ERROR: SHOULD,NOT,SKIP CSK Q,0(X) NOP ERROR: DID,NOT,C0 OMPARE IMS PCOUNT * * IMSKZ INSTRUCTION * COPY Q,0(X) * IMSKZ 0,0(X) * JMP $+2  ERROR: SHOULD,NOT,SKIP CSK Q,0(X) NOP ERROR: DOES,NO,COMPARE COPY Q,0(X) * IMSKZ 1,0(X) * ERROR: SHOULD,SKIP,THIS CSK Q,0(X) NOP ERROR: DOES,NOT,COMPARE COPP 0(X),A GET CONTENTS JEQ A,$+2 IF ZERO, IS GOOD ERROR: PUBLIC,MEMORY,WAS,ALTERED IMS PCOUNT COPY PCOUNT,A CSK A,=:6C  NOP ERROR: SOME,OF,TESTS,NOT,EXECUTED * JMP EMSBTST * ISTWORD RES 4,0 * LPOOL TITL INSTRUCTION DIAGNOSTIC -- PUBLIC MEMORY BIT MANIPULATION * * PUBLIC MEMORY BIT MANIPULATION * EMSBTST EQU $ COPY =ETSTWRD,X GET TEST CELL ADDR. ADD SLVNUM,X GENERATE OFFSET COPY =0,A CLEAR AREG COPY A,Q CLEAR QREG COPP  A,0(X) CLEAR TESTED MEMORY WORD COPY A,0(X) ALSO CLEAR PRIVATE TESTED MEMORY WORD ERETEST XNX A EMSB 0,0(X) DO IT XNX A SBIT 0,Q CHECKING VALUE PNX MAKE A PUBLIC ACECESS CSK Q,0(X) NOP  ERROR: DID,NOT,SET,BIT ADD =:10,A CSK A,=:100 JMP ERETEST NOP JMP EMS2TST  *NOP ME FOR LOOP* JMP EMSBTST DIAGNOSTIC LOOP EMS2TST EQU $ COPY =0,A COPY =-1,Q SET QREG TO ALL F'S COPP Q,0(X) AND THE TESTED MEMORY LOCATION ERETST2 XNX A EMSB 0,0(X) DO IT PNX  PUBLIC ACCESS CSK Q,0(X) NOP ERROR: IMSB,RESET,BIT ADD =:10,A CSK A,=:100  JMP ERETST2 NOP IMS PCOUNT * * EMRBTST EQU $ COPY =:3,A COPP A,0(X) EMRB 1,0(X) COPY =1,Q PNX MAKE A PUBLIC ACCESS CSK Q,0(X) NOP ERROR: DID,NOT,RESET,BIT  EMRB 2,0(X) PNX MAKE A PUBLIC ACCESS CSK Q,0(X) NOP ERROR: SHOULD,NOT,HAVE,ALTERED,WORD  IMS PCOUNT JMP EMCBTST *NOP ME FOR LOOP* JMP EMRBTST DIAGNOSTIC LOOP JMP  EMRBTST * EMCBTST EQU $ COPY =3,A COPP A,0(X) EMCB 1,0(X) COPY =1,Q PNX MAKE A PUBLIC ACCESS CSK Q,0(X) NOP ERROR: DID,NOT,COMPLIMENT,CORRECTLY COPY =1,A COPP A,0(X) EMCB 2,0(X) COPY =5,Q PNX MAKE A PUBLIC ACCESS CSK Q,0(X) NOP ERROR: DID,NOT,COMPLIMENT,CORRECTLY COPY 0(X),A GET PRIVATE CONTENTS JEQ A,$+2 IF ZERO, IS GOOD ERROR: PRIVATE,MEMORY,WAS,ALTERED  IMS PCOUNT JMP ESKPTST *NOP ME FOR LOOP* JMP EMCBTST DIAGNOSTIC LOOP * ETSTWRD RES 4,0 TEST CELL * LPOOL * * FIRST, TEST THE EMSKS INSTRUCTION * ESKPTST EQU $ COPY =ESTWORD,X GET TEST CELL ADDR. ADD SLVNUM,X GENERATE OFFSET COPY =0,A RESET A COPY A,ESTWORD RESET PRIVATE MEMORY CELL COPY =1,Q SET TEST PATTERN  COPP Q,0(X) SET TEST WORD * EMSKS 0,0(X) * JMP $+2 ERROR: SHOULD,NOT,SKIP PNX MAKE A PUBLIC ACCESS CSK Q,0(X) NOP ERROR: SHOULD,NOT,ALTER,TEST,WORD COPP Q,0(X) REINITIALIZE TEST1  WORD * EMSKS 1,0(X) DO IT AGAIN * ERROR: SHOULD,HAVE,SKIPPED COPY =3,Q PNX MAKE A PUBLIC ACCESS CSK Q,0(X) NOP ERROR: DID,NOT,COMPARE IMS PCOUNT * * EMSKR INSTRUCTION * COPY =1,Q COPP Q,0(X) * EMSKR 1,0(X) * JMP $+2 ERROR: SHOULD,NOT,SKIP PNX MAKE A PUBLIC ACCES CSK Q,0(X) NOP ERROR: DOES,NOT,COMPARE COPP Q,0(X) * EMSKR 0,0(X) * ERROR: DID,NOT,SKIP COPY =0,Q PNX MAKE A PUBLIC ACCESS CSK Q,0(X) NOP ERROR: DID,NOT,COMPARE IMS PCOUNT * * EMSKC INSTRUCTION * COPY =1,Q COPP Q,0(X) * EMSKC 0,0(X) * JMP $+2 ERROR: SHOULD,NOT,SKIP COPY =0,Q PNX MAKE A PUBLIC ACCESS CSK Q,0(X) NOP ERROR: DOES,NOT,COMPARE COPP Q,0(X) * EMSKC 0,0(X) * ERROR: SHOULD,HAVE,SKIPPED COPY =1,Q PNX MAKE A PUBLIC ACCESS CSK Q,0(X) NOP ERROR: DOES,NOT,COMPARE IMS PCOUNT * * EMSKO INSTRUCTION * COPY =1,Q COPP Q,0(X) * EMSKO 0,0(X) * ERROR: DID,NOT,SKIP PNX MAKE A PUBLIC ACCESS  CSK Q,0(X) NOP ERROR: DOES,NOT,COMPARE COPP Q,0(X) * EMSKO 1,0(X) * JMP $+2  ERROR: SHOULD,NOT,SKIP PNX MAKE A PUBLIC ACCESS CSK Q,0(X) NOP ERROR: DID,NOT,COMPARE  IMS PCOUNT * * EMSKZ INSTRUCTION * COPY =1,Q COPP Q,0(X) * EMSKZ 0,0(X) * JMP $+2 ERROR: SHOULD,NOT,SKIP PNX MAKE A PUBLIC ACCESS CSK Q,0(X) NOP ERROR: DOES,NO,COMPARE COPP Q,0(X) * EMSKZ 1,0(X) * ERROR: SHOULD,SKIP,THIS PNX MAKE A PUBLIC ACCESS CSK Q,0(X)  NOP ERROR: DOES,NOT,COMPARE COPY 0(X),A GET PRIVATE CONTENTS JEQ A,$+2 IF ZERO, IS GOOD ERROR: PRIVATE,MEMORY,WAS,ALTERED IMS PCOUNT COPY PCOUNT,A CSK A,=:74 NOP ERROR: SOME,OF,TESTS,NOT,EXECUTED * JMP DTMOVE * ESTWORD RES 4,0 * LPOOL TITL INSTRUCTION DIAGNOSTIC -- BLOCK MOVE ADRBL1 EQU $ ADDRESS BLOCK 1 - MVB TEST 1 WORD SRCBUF SOURCE BUFFER WORD ADDRESS WORD 0 SOURCE BYTE OFFSET WORD DSTBUF DESTINATION BUFFER WORD ADDRESS WORD 0 DESTINATION BYTE OFFSET ADRBL2 EQU $ ADDRESS BLOCK 2 - MVB TEST 2 WORD SRCBUF SOURCE BUFFER WORD ADDRESS WORD 1 SOURCE BYTE OFFSET WORD DSTBUF DESTINATION BUFFER WORD ADDRESS WORD 1 DESTINATION BYTE OFFSET ADRBL3 EQU $ ADDRESS BLOCK 3 - XLB TEST 1 WORD SRCBUF SOURCE BUFFER WORD ADDRESS WORD 0 SOURCE BYTE OFFSET WORD DSTBUF DESTINATION BUFFER WORD ADDRESS WORD 1 DESTINATION BYTE OFFSET WORD TRNTB1 TRANSLATION TABLE WORD ADDRESS CSKBF1 EQU $ MVB TEST 1 WORD :0000 WORD :0102 WORD :0304 WORD :0500 CSKBF2 EQU $ MVB TEST2 WORD :0002 WORD :0304 WORD :0506 WORD :0708 WORD :090A 2  WORD :0B0C WORD :0D0E WORD :0000 CSKBF3 EQU $ XLB TEST 1 WORD :00B1 WORD  :B2B3 WORD :B4B5 WORD :0000 DTMOVE EQU $ TITL * * BLOCK MOVE - TEST 1 * MVB00 EQU $  JST CLRBUF CLEAR DESTINATION BUFFER COPY =ADRBL1,Q ADDRESS OF ADDRESS BLOCK 1 COPY =5,A BUFFER LENGTH * MVB . TEST INSTRUCTION * CSK Q,=ADRBL1 NOP ERROR: MVB,FAILED,--,Q,WAS,CHANGED  COPY =0,X INITIALIZE INDEX MVB02 XNX X COPY CSKBF1,A GET DATA FROM COMPARISON BUFFER XNX X  CSK A,DSTBUF-1 COMPARE TO DATA IN DESTINATION BUFFER NOP ERROR: MVB,FAILED,--,WRONG,DATA,TRANSFERED;,INDEX IN X ADD =1,X INCREMENT BUFFER INDEX CSK X,=4 END OF BUFFER ? NOP NO JMP MVB02 NO, CONTINUE PATCHT MVB00 TITL * * BLOCK MOVE WITH SLAVE INTERRUPT - TEST2 * MVB04 EQU $  JST CLRBUF CLEAR DESTINATION BUFFER COPY =:50,A COPY A,S INITIALIZE STATUS -- SI SET COPY =:94,X SLAVE INTERRUPT VECTOR COPY JST1,A JST *$+1 INSTRUCTION COPY A,0(X) STORE AT :94 (SLAVE INTERRUPT) COPY =MVB06,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(X) STORE AT :95 COPY =1,A  SELP A,:F9 SET SLAVE INTERRUPT COPY =ADRBL2,Q ADDRESS OF ADDRESS BLOCK 2 COPY =:D,A BUFFER LENGTH  SBIT 8,S ENABLE INTERRUPTS * MVB . TEST INSTRUCTION * RBIT 8,S DISABLE INTERRUPTS COPY =0,Y SELP Y,:F9 RESET SLAVE INTERRUPT ERROR: NO,INTERRUPT OCCURED JMP MVB07 GO CHECK DATA * MVB06 ENT INTERRUPT SERVICE ROUTINE COPY =0,Y SELP Y,:F9 RESET SLAVE INTERRUPT  COPY DSTBUF+2,Y GET BYTE 8 FROM END OF DEST. BUFFER JEQ Y,$+3 SHOULD BE 0 ERROR: MVB,FAILED,--,INTERRUPT,NOT,HONORED,SOON,ENOUGH JMP MVB09 ERROR EXIT * MVB . RESUME AFTER INTERRUPT * COPY =0,X INITIALIZE BUFFER INDEX MVB07 XNX X COPY CSKBF2,A GET DATA FROM COMPARISON BUFFER XNX X  CSK A,DSTBUF COMPARE TO DATA IN DESTINATION BUFFER NOP ERROR: MVB,FAILED,--,WRONG,DATA,TRANSFERED;,INDEX IN X ADD =1,X INCREMENT BUFFER INDEX CSK X,=8 END OF BUFFER ? NOP JMP MVB07 NO, CONTINUE * MVB09 EQU $ PATCHT MVB04 TITL INSTRUCTION DIAGNOSTIC -- TRANSLATE BLOCK * * TRANSLATE BLOCK - TEST 1 * XLB00 EQU $ JST CLRBUF CLEAR DESTINATION BUFFER COPY =ADRBL3,Q ADDRESS OF ADDRESS BLOCK 3 COPY =5,A BUFFER LENGTH COPY =0,X INITIALIZE X * XLB . TEST INSTRUCTION * CSK Q,=ADRBL3 NOP ERROR: XLB,FAILED,--,Q,WAS,CHANGED COPY =0,X INITIALIZE BUFFER INDEX XLB02 XNX X  COPY CSKBF3,A GET DATA FROM COMPARISON BUFFER XNX X CSK A,DSTBUF COMPARE TO DATA IN DESTINATION BUFFER NOP ERROR: XLB,FAILED,--,WRONG,DATA,TRANSFERED;,INDEX,IN,X ADD =1,X INCREMENT BUFFER INDEX 3  CSK X,=4 END OF BUFFER ? NOP JMP XLB02 NO, CONTINUE * PATCHT XLB00 JMP XLB04 * * * CLRBUF ENT ROUTINE TO CLEAR DESINTATION BUFFER COPY =DSTBUF,X COPY =7,Y COPY =0,A COPY A,0(X,Y) JNED Y,$-1 JMP *CLRBUF * LPOOL RES $;:F-$&:F+1,0 TITL * * BUFFERS * SRCBUF EQU $ SOURCE BUFFER WORD :0102 WORD :0304 WORD :0506 WORD :0708 WORD :090A WORD :0B0C WORD :0D0E RES 1,0 DSTBUF EQU $ DESTINATION BUFFER RES 1,0 RES 1,0 RES 1,0 RES 1,0 RES 1,0 RES 1,0 RES 1,0 RES 1,0 TRNTB1 EQU $ TRANSLATE TABLE 1 WORD :B0B1 WORD :B2B3 WORD :B4B5 WORD :B6B7  WORD :B8B9 WORD :BABB WORD :BCBD WORD :BEBF TRNTB2 EQU $ TRANSLATE TABLE 2 WORD  :B0B1 WORD :B2B3 WORD :00B5 TITL * * TRANSLATE BLOCK WITH SLAVE INTERRUPT - TEST 2 * XLB04 EQU  $ JST CLRBUF CLEAR DESTINATION BUFFER COPY =:50,A COPY A,S INITIALIZE STATUS -- SI SET  COPY =:94,X SLAVE INTERRUPT VECTOR COPY JST1,A JST *$+1 INSTRUCTION COPY A,0(X) STORE AT :94  COPY =XLB06,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(X) STORE AT :95 COPY =1,A SELP A,:F9 SET SLAVE INTERRUPT COPY =ADRBL4,Q ADDRESS OF ADDRESS BLOCK 4 COPY =:D,A BUFFER LENGTH COPY =0,X INITIALIZE X SBIT 8,S ENABLE INTERRUPTS * XLB . TEST INSTRUCTION * RBIT  8,S DISABLE INTERRUPTS COPY =0,Y SELP Y,:F9 RESET SLAVE INTERRUPT ERROR: INTERRUPT,DID,NOT,OCCUR JMP XLB07 GO CHECK DATA * XLB06 ENT INTERRUPT SERVICE ROUTINE COPY =0,Y SELP Y,:F9 RESET SLAVE INTERRUPT EXCH A,Y SAVE A COPY DSTBUF+4,A GET BYTE 8 FROM BEGINNING OF DEST. BUFFER AND =:FF00,A MASK OFF LOWER BYTE JEQ A,$+3 SHOULD BE 0 ERROR: XLB,FAILED,--,INTERRUPT,NOT,HONORED,SOON,ENOUGH JMP XLB09 ERROR EXIT EXCH A,Y RESTORE A * XLB . RESUME AFTER INTERRUPT * XLB07 COPY =0,X INITIALIZE BUFFER INDEX XLB08 XNX X COPY CSKBF4,A GET DATA FROM COMPARISON BUFFER  XNX X CSK A,DSTBUF-1 COMPARE TO DATA IN DESTINATION BUFFER NOP ERROR: XLB,FAILED,--,WRONG,DATA,TRANSFERED;,INDEX,IN,X ADD =1,X INCREMENT BUFFER INDEX CSK X,=8 END OF BUFFER ? NOP  JMP XLB08 NO, CONTINUE * XLB09 EQU $ PATCHT XLB04 JMP XLBS00 * LPOOL TITL INSTRUCTION DIAGNOSTIC -- TRANSLATE BLOCK AND SKIP * * TRANSLATE BLOCK AND SKIP - TEST 1 * XLBS00 EQU $ JST CLRBUF CLEAR DESTINATION BUFFER COPY =ADRBL5,Q ADDRESS OF ADDRESS BLOCK 5 COPY =4,A BUFFER LENGTH COPY =0,X INITIALIZE X * XLBS . TEST INSTRUCTION * ERROR: XLBS,FAILED,--,SHOULD,SKIP CSK X,=3 CHECK POS4 T TRAP X NOP ERROR: XLBS,FAILED,--,X,SHOULD,=,3 CSK A,=4 CHECK POST TRAP A NOP ERROR: XLBS,FAILED,--,A,SHOULD,=,5 CSK Q,=ADRBL5 CHECK POST TRAP Q NOP ERROR: XLBS,FAILED,--,Q,SHOULD,=,ADRBL5,ADDRESS COPY =0,X INITIALIZE BUFFER INDEX XLBS06 XNX X COPY CSKBF5,A GET DATA FROM COMPARISON BUFFER XNX X CSK A,DSTBUF COMPARE TO DATA IN DESTINATION BUFFER NOP ERROR: XLBS,FAILED;,WRONG,DATA,TRANSFERED;,INDEX,IN,X ADD =1,X INCREMENT BUFFER INDEX CSK X,=3 END OF BUFFER ? NOP JMP XLBS06 NO, CONTINUE * COPY =3,X INITIALIZE X COPY =4,A INITIALIZE A * XLBS .  RESUME AFTER INTERRUPT * JMP $+2 OK ERROR: XLBS,FAILED,--,SHOULD,NOT,SKIP COPY =0,X INITIALIZE BUFFER INDEX XLBS08 XNX X COPY CSKBF6,A GET DATA FROM COMPARISON BUFFER XNX X CSK A,DSTBUF COMPARE TO DATA IN DESTINATION BUFFER NOP ERROR: XLBS,FAILED;,WRONG,DATA,TRANSFERED;,INDEX,IN,X ADD  =1,X INCREMENT BUFFER INDEX CSK X,=4 END OF BUFFER ? NOP JMP XLBS08 NO, CONTINUE PATCHT XLBS00 * JMP SCM00 LPOOL TITL ADRBL4 EQU $ ADDRESS BLOCK 4 - XLB TEST 2 WORD SRCBUF SOURCE BUFFER WORD ADDRESS WORD 1 SOURCE BYTE OFFSET WORD DSTBUF DESTINATION BUFFER WORD ADDRESS WORD 0 DESTINATION BYTE OFFSET WORD TRNTB1 TRANSLATION TABLE WORD ADDRESS ADRBL5 EQU $  ADDRESS BLOCK 5 - XLBS WORD SRCBUF SOURCE BUFFER WORD ADDRESS WORD 1 SOURCE BUFFER BYTE OFFSET  WORD DSTBUF DESTINATION BUFFER WORD ADDRESS WORD 1 DESTINATION BUFFER BYTE OFFSET WORD TRNTB2 TRANSLATION TABLE WORD ADDRESS CSKBF4 EQU $ XLB TEST 2 WORD :0000 WORD :B2B3 WORD :B4B5 WORD :B6B7 WORD :B8B9 WORD :BABB WORD :BCBD WORD :BE00 CSKBF5 EQU $ XLBS TEST 1 WORD :00B2 WORD :B300 WORD :0000 * CSKBF6 EQU $ XLBS TEST 2 WORD :00B2 WORD :B300 WORD :B500 WORD :0000 TITL INSTRUCTION DIAGNOSTIC -- SCAN MEMORY * * SCAN MEMORY - TEST 1 * SCM00 EQU $ COPY =ADRBL6,Q ADDRESS BLOCK 6 ADDRESS COPY =0,X INITIALIZE X COPY =5,A BUFFER LENGTH * SCM . TEST INSTRUCTION * JMP $+3 ERROR: SCM,FAILED,--,DID,NOT,FIND,MATCH JMP SCM02 ERROR EXIT * CSK X,=3 CHECK POST MATCH X NOP ERROR: SCM,FAILED,--,X,SHOULD,=,3 CSK A,=5 CHECK POST MATCH A NOP ERROR: SCM,FAILED,--,A,SHOULD,=,5 CSK Q,=ADRBL6 CHECK POST MATCH Q NOP ERROR: SCM,FAILED,--,Q,SHOULD,=,ADRBL6,ADDR. * PATCHT SCM00 TITL SCM02 EQU  $ COPY =ADRBL6,Q ADDRESS BLOCK 6 ADDRESS COPY =5,A BUFFER LENGTH COPY =3,X INITIALIZE X *  SCM . RESUME AFTER INTERRUPT * ERROR: SCM,FAILED,--,SHOULD,NOT,FIND,MATCH CSK Q,=ADRBL6 5  NOP ERROR: SCM,FAILED,--,Q,SHOULD,=,ADRBL6,ADDR. * PATCHT SCM02 TITL * * SCAN MEMORY WITH SLAVE INTERRUPT - TEST 2 * SCM04 COPY =:50,A COPY A,S INITIALIZE S -- SI SET COPY =:94,X SLAVE INTERRUPT VECTOR  COPY JST1,A JST *$+1 INSTRUCTION COPY A,0(X) STORE AT :94 COPY =SCM06,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(X) STORE AT :95 COPY =1,A SELP A,:F9 SET SLAVE INTERRUPT COPY =ADRBL7,Q ADDRESS BLOCK 7 ADDRESS COPY =:D,A BUFFER LENGTH COPY =0,X INITIALIZE X SBIT 8,S  ENABLE INTERRUPTS * SCM05A EQU $ SCM . TEST INSTRUCTION * NOP SCM05B EQU $ RBIT 8,S  DISABLE INTERRUPTS COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT ERROR: NO,INTERRUPT,OCCURED  JMP SCM08 ERROR EXIT TITL SCM06 ENT INTERRUPT SERVICE ROUTINE COPY =0,Y SELP Y,:F9 RESET SLAVE INTERRUPT CSK X,=9 CHECK POST INTERRUPT X JMP $+3 NOP ERROR: SCM,FAILED,--,X,SHOULD,BE,<,9 CSK A,=:D CHECK POST INTERRUPT A NOP ERROR: SCM,FAILED,--,A,SHOULD,=,:D CSK Q,=ADRBL7 CHECK POST INTERRUPT Q NOP ERROR: SCM,FAILED,--,Q,SHOULD,=,ADRBL7,ADDR. COPY SCM06,A GET POST INTERRUPT RETURN POINTER CSK A,=SCM05A SHOULD BE SCM05A ADDR. JMP SCM07 UNDEFINED JMP $+2 CHECK JMP SCM08 OK CSK A,SCM05B JMP $+2 JMP SCM07 ERROR: SCM,FAILED,--,DID,NOT,HONOR,INTERRUPT JMP SCM08 ERROR EXIT SCM07 EQU $ ERROR: SCM,FAILED,--,UNDEFINED,EFFECT,ON,P * SCM08 EQU $ PATCHT SCM04 JMP SAVS00 * ADRBL6 EQU $ ADDRESS BLOCK 6 - SCM TEST 1 WORD SRCBUF SOURCE BUFFER WORD ADDRESS WORD 0 SOURCE BUFFER BYTE OFFSET WORD :0003 SEARCH BYTE VALUE ADRBL7 EQU $ ADDRESS BLOCK 7 - SCM TEST 2 WORD SRCBUF SOURCE BUFFER WORD ADDRESS WORD 1 SOURCE BUFFER BYTE OFFSET WORD :0010 SEARCE BYTE VALUE * LPOOL TITL INSTRUCTION DIAGNOSTIC -- SAVE CONTEXT ON STACK * * SAVE CONTEXT ON STACK * * TESTED AS INLINE INSTRUCTION * TESTED IN SYSTEM MODE * SAVS00 EQU $ COPY =0,A COPY =STK1K2,X ---- COPY =6,Y -- CLEAR COPY A,0(X,Y) -- STACK  JNED Y,$-1 ---- COPY A,0 CLEAR LOCATION 0 COPY =:B0,X COPY A,0(X) INITIALIZE LOCATION :B0 FOR USER MODE COPY =STK1K1,A STACK POINTER FOR NO TRAP COPY A,K INITIALIZE K COPY =STK1L,A STACK LIMIT COPY A,L INITIALIZE L COPY =:5F9B,A COPY A,S INITIALIZE S COPY =:9C,X STACK EXCEPTION TRAP COPY JST1,A JST *$+1 INSTRUCTION COPY A,2(X) STORE AT :9E COPY =SAVS08,A TRAP SERVICE ROUTINE ADDRESS COPY A,3(X) STORE AT :9F COPY PT5555,X ---- COPY PTAAAA,Y -- INITIALIZE COPY =:3333,Q -- REGISTERS COPY =:CCCC,A ---- * SAVS01 EQU $ SAVES 3,SAVS03 TEST IN6 STRUCTION * ERROR: SAVES,FAILED,--,DID,NOT,GO,TO,NEXT,ADDR. SAVS03 EQU $ SIN 2 COPY STATSV,A  EXCH A,S RESTORE S CSK A,=:7F50 TEST S NOP ERROR: SAVES,FAILED,--,S,SHOULD,=,:7F50 COPY K,A GET STACK POINTER CSK A,=STK1K2 CHECK STACK POINTER NOP ERROR: SAVES,FAILED,--,K,SHOULD,=,STK1K2,ADDR. * COPY STK1K2,A GET 'P' FROM STACK CSK A,=SAVS01+1 NOP ERROR: SAVES,FAILED,--,P,FROM,STACK,S/B,SAVS01+1,ADD COPY STK1K2+1,A GET 'L' FROM STACK CSK A,=STK1L NOP ERROR: SAVES,FAILED,--,L,FROM,STACK,SHOULD,=,STK1L,ADDR COPY STK1K2+2,A GET 'S' FROM STACK CSK A,=:5F9B NOP ERROR: SAVES,FAILED,--,S,FROM,STACK,SHOULD,=,:5F9B COPY STK1K2+3,A GET 'A' FROM STACK CSK A,=:CCCC NOP  ERROR: SAVES,FAILED,--,A,FROM,STACK,SHOULD,=,:CCCC COPY STK1K2+4,A GET 'Q' FROM STACK CSK A,=:3333  NOP ERROR: SAVES,FAILED,--,Q,FROM,STACK,SHOULD,=,:3333 COPY STK1K2+5,A GET 'X' FROM STACK CSK A,PT5555 NOP ERROR: SAVES,FAILED,--,X,FROM,STACK,SHOULD,=,:5555 COPY STK1K2+6,A GET 'Y' FROM STACK CSK  A,PTAAAA NOP ERROR: SAVES,FAILED,--,Y,STACK,SHOULD,=,:AAAA COPY 0,A GET CONTENTS OF LOCATION 0  CSK A,=0 NOP ERROR: LOCATION,0,ALTERED,--,SAVES,OPERATED,IN,USER,MODE JMP $+3 * SAVS08 ENT  ERROR: SAVES,FAILED,--,SHOULD,NOT,TAKE,TRAP * PATCHT SAVS00 JMP SAVS10 TITL * * STACK (STK1) * STK1Z RES 14,0 STK1L EQU STK1Z STACK LIMIT 1 STK1K3 EQU STK1Z+6 STACK POINTER 3 STK1K2 EQU STK1Z+7 STACK POINTER 2 STK1L2 EQU STK1Z+8 STACK LIMIT 2 STK1K1 EQU STK1Z+14 STACK POINTER 1 * SAVES1 EQU $ SAVES 0,SAVS33 TEST INSTRUCTION SAVTMP RES 1,0 TEMP STORAGE * LPOOL TITL * * SAVE CONTEXT ON STACK * * TESTED AS INLINE INSTRUCTON * TESTED IN SYSTEM MODE * TESTED WITH STACK EXCEPTION TRAP * SAVS10 EQU $ COPY =0,A COPY =:B0,X COPY A,0(X) INITIALIZE LOCATION :B0 FOR SYSTEM MODE COPY =STK1K2,A STACK POINTER FOR TRAP COPY A,K INITIALIZE K COPY =STK1L,A STACK LIMIT COPY A,L INITIALIZE L  COPY =:40,A COPY A,S INITIALIZE S COPY =:9C,X STACK EXCEPTION TRAP COPY =SAVS14,A TRAP SERVICE ROUTINE ADDR. COPY A,3(X) STORE IN :9F COPY =0,A COPY A,0(X) CLEAR :9C COPY A,1(X) CLEAR :9D * SAVS11 EQU $ SAVES 0,SAVS13 TEST INSTRUCTION * ERROR: SAVES,FAILED,--,DID,NOT,TAKE,TRAP JMP $+2 SAVS13 EQU $ ERROR: SAVES,FAILED,--,DID,NOT,TAKE,TRAP SAVS14 ENT TRAP SERVICE ROUTINE  SIN 2 COPY STATSV,A EXCH A,S RESTORE S CSK A,=:40 NOP ERROR: SAVES,FAILED,--,S,SHOULD,=,:0040 COPY K,A GET STACK POINTER CSK A,=STK1L NOP ERROR: SAVES,FAILED,--,K,SHOULD,=,STACK,ADDR COPY =:9C,X STACK EXCEPTION TRAP LOCATION COPY 0(X),A GET 'P' FROM TRAP LOCATION7  CSK A,=SAVS13 NOP ERROR: SAVES,FAILED,--,:9C,SHOULD,BE,SAVS13,ADDR. COPY 1(X),A GET 'I' FROM TRAP LOCATION CSK A,SAVS11 NOP ERROR: SAVES,FAILED,--,:9D,SHOULD,BE,INSTR.,AT,SAVS11 * PATCHT SAVS10  TITL * * SAVE CONTEXT ON STACK * * TESTED AS INLINE INSTRUCTION * TESTED IN USER MODE *  TESTED AS NON-INTERRUPTABLE INSTRUCTION * SAVS20 EQU $ COPY =:B0,X COPY =SAVTMP,A ADDRESS OF STORAGE LOCATION USED BY SAVES COPY A,0(X) INITIALIZE LOCATION :B0 FOR USER MODE COPY =STK1K3,A NEW VALUE FOR K  COPY A,1(X) STORE IN :B1 COPY =STK1L,A NEW VALUE FOR L COPY A,2(X) STORE IN :B2 COPY =STK1K1,A STACK POINTER COPY A,K INITIALIZE K COPY =STK1L2,A STACK LIMIT COPY A,L INITIALIZE L COPY =:50,A COPY A,S INITIALIZE STATUS -- SI SET COPY =:9C,X STACK EXCEPTION TRAP  COPY =SAVS28,A TRAP SERVICE ROUTINE ADDRESS COPY A,3(X) STORE IN :9F COPY =:94,X SLAVE INTERRUPT VECTOR COPY JST1,A JST *$+1 INSTRUCTION COPY A,0(X) STORE AT :94 COPY =SAVS27,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(X) STORE AT :95 COPY =1,A SELP A,:F9 SET SLAVE INTERRUPT SBIT  8,S ENABLE INTERRUPTS * SAVES 0,SAVS25 TEST INSTRUCTION * RBIT 8,S DISABLE INTERRUPTS COPY =0,A SELP A,:F9 RESET RESET SLAVE INTERRUPT ERROR: SAVES,FAILED,--,DID,NOT,GO,TO,NEXT,ADDR. JMP  SAVS29 ERROR EXIT * SAVS25 EQU $ SAVES JUMP ADDRESS COPY =0,A SHOULD EXECUTE BEFORE INTERRUPT  RBIT 8,S DISABLE INTERRUPTS SELP A,:F9 RESET SLAVE INTERRUPT ERROR: INTERRUPT,DID,NOT,OCCUR  JMP SAVS29 ERROR EXIT * SAVS27 ENT INTERRUPT SERVICE ROUTINE COPY =0,Q SELP Q,:F9 RESET SLAVE INTERRUPT CSK A,=0 NOP ERROR: SAVES SHOULD,BE,NON-INTERRUPTABLE COPY SAVTMP,A GET STORED K CSK A,=STK1K2 NOP ERROR: STORED,INTERMEDIATE,K,SHOULD,BE,STK1K2,ADDR. COPY K,A GET STACK POINTER CSK A,=STK1K3 NOP ERROR: SAVES,FAILED,--,K,SHOULD,=,STK1K3,ADDR. COPY L,A GET STACK LIMIT CSK A,=STK1L NOP ERROR: SAVES,FAILED,--,L,SHOULD,BE,STK1L,ADDR. COPY =:B0,X  COPY 0(X),A GET CONTENTS OF :B0 CSK A,=0 NOP ERROR: SAVES,FAILED,--,LOCATION,:B0,SHOULD,=,0  JMP SAVS29 NORMAL EXIT * SAVS28 ENT TRAP SERVICE ROUTINE COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT ERROR: SAVES,FAILED,--,SHOULD,NOT,TAKE,TRAP * SAVS29 EQU $ EXIT PATCHT SAVS20 JMP SAVS30 * LPOOL TITL * * SAVE CONTEXT ON STACK * * TESTED AS INTERRUPT INSTRUCTION * TESTED IN SYSTEM MODE * TESTED WITH STACK EXCEPTION TRAP * SAVS30 EQU $ COPY =:B0,X COPY =0,A COPY A,0(X) INITIALIZE LOCATION :B0 FOR SYSTEM MODE COPY =STK2K2,A STACK POINTER FOR STACK EXCEPTION TRAP COPY A,K I8 NITIALIZE K COPY =STK2L,A STACK LIMIT COPY A,L INITIALIZE L COPY =:50,A COPY A,S  INITIALIZE S -- SI SET COPY =:9C,X STACK EXCEPTION TRAP COPY =SAVS34,A TRAP SERVICE ROUTINE ADDR. COPY A,3(X) STORE IN :9F COPY =0,A COPY A,0(X) CLEAR :9C COPY A,1(X) CLEAR :9D COPY =:94,X SLAVE INTERRUPT VECTOR COPY SAVES1,A SAVE CONTEXT INSTRUCTION COPY A,0(X) STORE IN :94  COPY SAVES1+1,A SAVE CONTEXT INSTRUCTION COPY A,1(X) STORE IN :95 COPY =1,A SELP A,:F9 SET SLAVE INTERRUPT SBIT 8,S ENABLE INTERRUPTS NOP ALLOW INTERRUPT SAVS31 RBIT 8,S DISABLE INTERRUPTS COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT ERROR: INTERRUPT,DID,NOT,OCCUR JMP  SAVS39 ERROR EXIT * SAVS33 EQU $ SAVES JUMP LOCATION RBIT 8,S DISABLE INTERRUPTS COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT ERROR: SAVES,FAILED,--,SHOULD,TAKE,TRAP JMP SAVS39 ERROR EXIT * SAVS34 ENT TRAP SERVICE ROUTINE COPY K,A GET STACK POINTER CSK A,=STK2L NOP  ERROR: SAVES,FAILED,--,K,SHOULD,=,STK1L,ADDR. COPY =:9C,X STACK EXCEPTION TRAP LOCATION COPY 0(X),A  GET 'P' FROM TRAP LOCATION CSK A,=SAVS33 NOP ERROR: SAVES,FAILED,--,:9C,SHOULD,CONTAIN,SAVS33,ADDR.  COPY 1(X),A GET 'I' FROM TRAP LOCATION CSK A,SAVES1 NOP ERROR: SAVES,FAILED,--,:9D,SHOULD,BE,INSTR.,AT,SAVES1 SAVS39 EQU $ COPY =:94,X SLAVE INTERRUPT VECTOR COPY JST1,A JST *$+1 INSTR. COPY A,0(X) RESTORE LOCATION :94 * PATCHT SAVS30 TITL * * SAVE CONTEXT ON STACK * * TESTED AS INTERRUPT INSTRUCTION * TESTED IN USER MODE * SAVS40 EQU $ COPY =:B0,X COPY =RSTTMP,A ADDRESS OF STORAGE LOCATION USED BY SAVES COPY A,0(X) INITIALIZE LOCATION :B0 FOR USER MODE COPY =STK2K1,A STACK POINTER  COPY A,K INITIALIZE K COPY =STK2L,A STACK LIMIT COPY A,L INITIALIZE L COPY =:50,A COPY A,S INITIALIZE STATUS -- SI SET COPY =:9C,X STACK EXCEPTION TRAP COPY =SAVS47,A TRAP SERVICE ROUTINE ADDRESS COPY A,3(X) STORE AT :9F COPY =:94,X SLAVE INTERRUPT VECTOR COPY SAVES2,A SAVE CONTEXT INSTRUCTION COPY A,0(X) STORE AT :94 COPY SAVES2+1,A SAVE CONTEXT INSTRUCTION COPY  A,1(X) STORE AT :95 COPY =1,A SELP A,:F9 SET SLAVE INTERRUPT SBIT 8,S ENABLE INTERRUPTS NOP SAVS42 RBIT 8,S DISABLE INTERRUPTS COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT ERROR: SAVES,FAILED,--,DID,NOT,GO,TO,NEXT,ADDR. JMP SAVS49 ERROR EXIT * SAVS43 EQU $ SAVES JUMP ADDR  SIN 4 COPY STATSV,A EXCH A,S RESTORE S COPY =0,Q SELP Q,:F9 RESET SLAVE INTERRUPT CSK A,=:0150 TEST S NOP ERROR: SAVES,FAILED,--,S,SHOULD,=,:0150 COPY RSTTMP,A GET STORE9 D K CSK A,=STK2K2 NOP ERROR: STORED,INTERMEDIATE,K,SHOULD,BE,STK1K2,ADDR. COPY =:B0,X COPY 0(X),A GET CONTENTS OF :B0 CSK A,=0 NOP ERROR: SAVES,FAILED,--,LOCATION,:B0,SHOULD,=,0 COPY STK2K2,A GET 'P' FROM STACK CSK A,=SAVS42 NOP ERROR: SAVES,FAILED,--,P,FROM,STACK,SHOULD,=,SAVS42,ADDR. JMP SAVS49 NORMAL EXIT * SAVS47 ENT TRAP SERVICE ROUTINE ERROR: SAVES,FAILED,--,SHOULD,NOT,TAKE,TRAP SAVS49 COPY =:9C,X STACK EXCEPTION TRAP LOCATION COPY JMP1,A JMP *$+1 INSTR. COPY A,2(X)  RESTORE :9E COPY =SET1,A TRAP SERVICE ROUTINE ADDRESS COPY A,3(X) RESTORE :9F * PATCHT SAVS30 JMP RESTS0 * LPOOL TITL * * STACK (STK2) * STK2Z RES 14,0 STK2L EQU STK2Z STACK LIMIT STK2K2 EQU STK2Z+7 STACK POINTER 2 STK2K1 EQU STK2Z+14 STACK POINTER 1 * SAVES2 SAVES 0,SAVS43 TEST INSTRUCTION RSTTMP RES 1,0 TEMP STORAGE RSTPNT WORD RESTS4 PT0122 WORD :0122 PT0100 WORD :0100 TITL INSTRUCTION DIAGNOSTIC -- RESTORE CONTEXT FROM STACK * * RESTORE CONTEXT FROM STACK * RESTS0 EQU $ COPY RSTPNT,A JUMP LOCATION COPY  A,STK2K2 STORE AS 'P' ON STACK COPY =STK2L,A STACK LIMIT COPY A,STK2K2+1 STORE AS 'L' ON STACK COPY  PT0122,A NEW VALUE FOR S COPY A,STK2K2+2 STORE AS 'S' ON STACK COPY PT5555,A COPY A,STK2K2+3 STORE AS 'A' ON STACK COPY PTAAAA,A COPY A,STK2K2+4 STORE AS 'Q' ON STACK COPY =:33,A COPY A,STK2K2+5 STORE AS 'X' ON STACK COPY =:CC,A COPY A,STK2K2+6 STORE AS 'Y' ON STACK * COPY =:40,A COPY A,S INITIALIZE S COPY =:B0,X COPY =0,A COPY A,0(X) INITIALIZE LOCATION :B0 COPY  =RSTTMP,Y ADDRESS OF TEMP. STORAGE LOCATION SUB PT0100,Y INITIALIZE Y COPY =STK2K2,A 1ST WORD OF CURRENT STACK BLOCK COPY A,RSTTMP INITIALIZE TEMP CELL WITH VALUE FOR K COPY =0,A COPY A,L COPY A,K  COPY A,Q * RESTS :100 TEST INSTRUCTION * ERROR: RESTS,FAILED,--,DID,NOT,GO,TO,NEXT,ADDR RESTS4 EQU  $ RESTS JUMP ADDR SIN 3 COPY A,TEMP SAVE A COPY STATSV,A EXCH A,S RESTORE S CSK A,=:0002 CHECK PREVIOUS STATUS NOP ERROR: RESTS,FAILED,--,DID,NOT,LOAD,CORRECT,S COPY  K,A GET STACK POINTER CSK A,=STK2K1 NOP ERROR: RESTS,FAILED,--,K,SHOULD,=,STK1K1,ADDR COPY L,A CSK A,=STK2L CHECK L NOP ERROR: RESTS,FAILED,--,L,SHOULD,=,STK2L,ADDR. COPY TEMP,A RESTORE A CSK A,PT5555 CHECK A NOP ERROR: RESTS,FAILED,--,A,SHOULD,=,:5555 CSK Q,PTAAAA CHECK Q NOP ERROR: RESTS,FAILED,--,Q,SHOULD,=,:AAAA CSK X,=:33 CHECK X NOP ERROR: RESTS,FAILED,--,X,SHOULD,=,:0033 CSK Y,=:CC CHECK Y NOP ERROR: RESTS,FAILED,--,Y,SHOULD,=,:00CC COPY =:B0,X COPY 0(X),A GET CONTENTS OF :B0 CSK A,=RSTTMP NOP ERROR: SAVES,FAILED,--,LOCATION :B0,: SHOULD,=,RSTTMP,ADDR. * PATCHT RESTS0 JMP PART1END LPOOL PART1END EQU $ SAVE END TAAAA CHECK Q NOP ERROR: RESTS,FAILED,--,Q,SHOULD,=,:AAAA CSK X,=:33 CHECK X NOP ERROR: RESTS,FAILED,--,X,SHOULD,=,:0033 CSK Y,=:CC CHECK Y NOP ERROR: RESTS,FAILED,--,Y,SHOULD,=,:00CC COPY =:B0,X COPY 0(X),A GET CONTENTS OF :B0 CSK A,=RSTTMP NOP ERROR: SAVES,FAILED,--,LOCATION :B0,IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII< IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII