IMD 1.16: 2/09/2008 12:15:17 84-93895-01 a000 f89501 pat 4/12 source diskette part 2 of 2    @0|)wwЀЀtQql)  " }gA `_l M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF283022014125900830220141259 830220141259"7F89501 VOLPAT 4/12 SOURCE DISKETTE - PART II (OF 2)   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_l M@iGyy GGG`HZ@ b G`^Y e IQ BBp@;:9 :7P@ G:پN 8!0. * C'xC# b# }B!9 @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 PAT4/12 PART2 84-93895-10-A000 MACHINE :08 * * THIS WILL SAVE THE STARING ADDRESS OF THE NEXT MODULE * PART3ST SET PART3ST SAVE EXTR PATEND NAM PART2 ORG PART2ST TITL UNIMPLEMENTED INSTRUCTION TEST *********************************************************** * * ---------- UNIMPLEMENTED INSTRUCTION TEST ---------- * *  THIS TEST EXECUTES EACH UNIMPLEMENTED INSTRUCTION * TO MAKE SURE THAT EACH WILL INVOKE AN UNIMPLEMENTED * INSTRUCTION TRAP. THE INSTRUCTION SKELETONS ARE * PROVICED IN A DATA TABLE (UITAB) * * THIS TEST USES THE FETCH MACHINE TYPE *  INSTRUCTION (FMT) TO DETERMINE WHETHER * OR NOT THE OPTIONAL INSTRUCTION SET IS * INSTALLED FOR A PARTICULAR MACHINE. IT * THEN DYNAMICALLY SELECTS WHICH INSTRUCTIONS * TO TEST AS UNIMPLEMENTED. * *********************************************************** TITL * * INITIALIZATION * PART2 EQU $ P13000 EQU $ COPY DEMAND,A DEMAND MODE SELECTION; =0 FOR DEFAULT MODE JEQ A,$+4 IF DEFALUT THE DO THIS TEST TBIT 1,A DO WE WANT THIS TEST JT OV,$+2 JUMP IF TRUE JMP P13025 ABORT TEST COPY =:84,Y UNIMP. INSTRUCTION TRAP LOCATION COPY =2,A   UIT TEST CODE SELP A,4 OUTPUT TO CONSOLE DATA REGISTER COPY =P13019,A TRAP SERVICE ROUTINE LOCATION  COPY A,3(Y) STORE IN 4TH WORD OF TRAP * * SELECT WHICH CODES TO TEST AS UNIMPLEMENTED INSTRUCTIONS * COPY TABSIZ,Q TABLE SIZE WITH NO OPTIONAL INSTRUCTION SET FMT A GET MACHINE TYPE TBIT 3,A COPY BIT 3 (COBOL INDICATOR) TO OV RBIT 3,A RESET BIT 3 CSK A,=2 JMP $+3 NO OPTIONAL INSTRUCTION SET INSTALLED NOP COPY OPTSIZ,Q GET TABLE SIZE FOR OPTIONAL INSTRUCTION SET COPY Q,TSTSIZ SET TABLE SIZE FOR TEST COPY =0,A IFT LSI490 COPY =:FFF0,Q VALUE FOR COBOL MASK COPY Q,COBMSK INITIALIZE COBOL MASK JF OV,$+2 IS COBOL OPTION INSTALLED ? JUMP IF NOT. COPY A,COBMSK CLEAR MASK FOR COBOL CLASS ENDC COPY A,INSTRU INITIALIZE INSTRUCTION HOLDER COPY STATSV,A COPY A,S INITIALIZE STATUS TITL * * ROUTINE WHICH INCREMENTS A COUNTER (INSTRU) * AND PICKS BIT PATTERNS WHICH ARE UNIMPLEMENTED * INSTRUCTIONS AS DEFINED BY A TABLE (UITAB). * P13010 EQU $ IMS INSTRU INCREMENT CURRENT INSTRUCTION CELL JMP $+2 CONTINUE TEST JMP P13025 END OF UIT, EXIT JT OV,P13025 IF BIT 15 IS SET, THEN END OF TEST COPY =0,X CLEAR UITAB INDEX P13011 COPY INSTRU,A GET CURRENT INSTRUCTION XNX X AND  MSKTAB,A MASK OFF ''DON'T CARE'' BITS XNX X CSK A,UITAB COMPARE TO SKELETON FROM TABLE NOP  JMP $+2 NO MATCH JMP P13015 UNIMP. INSTR. FOUND ADD =1,X INCREMENT UITAB INDEX COPY X,Q CSK Q,TSTSIZ REACHED END OF UITAB ? JMP P13011 NO, LOOP TO CONTINUE NOP JMP P13010 END OF UITAB, GET NEXT INSTR. FOR TESTING TITL * * ROUTINE TO TEST AN UNIMPLEMENTED INSTRUCTION * WHICH HAS BEEN FOUND BY THE PRECEEDING ROUTINE * P13015 EQU $ COPY INSTRU,A GET UNIMPLEMENTED INSTRUCTION COPY A,P13016 STORE FOR EXECUTION AND =:FF00,A ISOLATE UPPER 8 BITS FOR DISPLAY ADD =2,A UIT CODE SELP A,4 OUTPUT TO CONSOLE COPY =0,A COPY A,0(Y) CLEAR 1ST WORD OF TRAP * * P13016 HLT EXECUTE UNIMPLEMENTED INSTRUCTION HERE P13017 NOP FILLER FOR MULTI-WD. MEM. REF. INSTRUCTIONS * * P13018 EQU $  ERROR: INSTRUCTION,AT,P13016,DID,NOT,CAUSE,TRAP JMP P13010 FIND NEXT UNIMP. INSTR. * P13019 COPY 0(Y),A GET 1ST WORD OF TRAP (:84) COPY INSTRU,Q GET INSTRUCTION AND =:9F00,Q MASK OFF ''DON'T CARE'' BITS CSK Q,=:0700 MULTI-WD. MEM. REF. CLASS ? NOP JMP P13020 NO CSK A,=P13018 LOC :84 SHOULD BE P+2  NOP ERROR: LOC,:84,SHOULD,BE,P13018,ADDRESS JMP P13022 * P13020 CSK A,=P13017 LOC :84 SHOULD BE P+1  NOP ERROR: LOC.,:84,SHOULD,BE,P13017,ADDR. P13022 COPY 1(Y),A GET 2ND WORD FROM TRAP CSK A,P13016  NOP ERROR: LOC.,:85,SHOULD,BE,INSTR.,AT,P13016 JMP P13010 FIND NEXT UNIMP. INSTR. P13025 COPY =UIT1,A  UNEXPECTED UIT SERVICE ROUTINE COPY A,3(Y) STORE IN 4TH WORD OF TRAP * * JMP P13000 PATCH FOR LOOPING ORG $-1 NOP JMP P13900 LPOOL TITL * * TABLE OF UNIMPLEMENTED INSTRUCTIONS * UITAB WORD :1E00 WORD :030B WORD :030E WORD :7600 WORD :1C00 WORD :0E0E WORD  :0F04 WORD :0F0D WORD :0F0E WORD :7C07 WORD :5C05 WORD :5C06 WORD :5C08  WORD :2600 WORD :4600 WORD :7C00 COBOL CLASS IFT LSI430;LSI490 OPTLAB EQU $ ENDC WORD :1D00 LISTS CLASS IFT LSI410 OPTLAB EQU $ ENDC WORD :5C00 FLOATING POINT CLASS WORD :030C FLOATING POINT CLASS IFT LSI430 WORD :0708 MULTI-WD MEM REF INSTRUCTIONS MISSING ON 4/30 ENDC IFT LSI410 WORD :0708 MULTI-WD MEM REF INSTRUCTIONS MISSING ON 4/10 WORD :0704 MULTI-WD MEM REF INSTRUCTIONS MISSING ON 4/10 WORD :0703 MULTI-WD MEM REF INSTRUCTIONS MISSING ON 4/10 WORD :2702 MULTI-WD MEM REF INSTRUCTIONS MISSING ON 4/10 WORD :0E00 SINGLE REG. SHIFTS MISSING ON 4/10 WORD :0E08 SINGLE REG. SHIFTS MISSING ON 4/10 WORD :0F00 DOUBLE REG. SHIFTS MISSING ON 4/10 ENDC * TABSIZ WORD $-UITAB OPTSIZ WORD OPTLAB-UITAB TABLE SIZE WITH FLOATING POINT (LISTS) OPTION TSTSIZ RES 1,0 HOLDS TABLE SIZE FOR THIS PASS OF UIT INSTRU RES 1,0 TITL * * TABLE OF UNIMP. INSTR. MASKS * MSKTAB WORD :9E00  WORD :9F0F WORD :9F0E WORD :FF00 WORD :DF00 WORD :9F0F WORD :9F0C WORD :9F0F WORD :9F0E WORD :FF0F WORD :FF0F WORD :FF0E WORD :FF08 WORD :FF00 WORD :FF00 COBMSK WORD :FFF0 COBOL CLASS WORD :9F00 LISTS CLASS WORD :FF00 FLOATING POINT CLASS WORD :9F0E FLOATING POINT CLASS IFT LSI430 WORD :9F08 MULTI-WD MEM REF INSTRUCTIONS MISSING ON 4/30 ENDC IFT LSI410 WORD :9F48 MULTI WD MEM REF 4/10 WORD :9F4C  MULTI WD MEM REF 4/10 WORD :FF4F MULTI WD MEM REF 4/10 WORD :BF4F MULTI WD MEM REF 4/10 WORD :9F0F SINGLE REG. SHIFTS MISSING ON 4/10 WORD :9F0D SINGLE REG. SHIFTS MISSING ON 4/10 WORD :9F00 DOUBLE REG. SHIFTS MISSING ON 4/10 ENDC * P13900 EQU $ TITL MEMORY TEST -- INITIALIZATION ******************************************************* * * ---------- MEMORY TEST ---------- * * THIS TEST PERFORMS SEVERAL READ/WRITE OPERATIONS * ON UNUSED MEMORY. IF UNUSED MEMORY IS LARGE ENOUGH, * AND IF THE OPERATOR DESIRES, THE MEMORY TEST WILL * THEN RELOCATE ITSELF TO HIGH MEMORY AND TEST LOW * MEMORY. IT WILL RELOCATE ITSELF TO EITHER 4K OR 8K * DEPENDING ON HOW LARGE PAT4 IS, AND TEST FROM 0 UP TO * THE RELOCATED PAT4, EXCLUDING WORDS :80 - :8F, * WHICH ARE TRAP VECTOR LOCATIONS THAT REMAIN INTACT * THROUGHOUT THE ENTIRE MEMORY TEST. PAT THEN * RESTORES ITSELF TO LOW M EMORY AND EXITS TO THE * NEXT TEST. * THE MEMORY TEST CONSISTS OF 6 MAJOR PARTS: * 1. INITIALIZATION *  2. HIGH MEMORY ADDRESSABILITY TEST * 3. ADDRESS TEST (TEST 1) * 4. SPIRAL TEST (TEST 2) *  5. BYTE TEST (TEST 3) * 6. RELOCATION ROUTINES * MORE DETAILED DESCRIPTIONS OF THE MAJOR PARTS *  ARE GIVEN AT THE BEGINNING OF EACH PART. TO ABORT * FROM THE MEMORY TEST, PRESS THE SENSE SWITCH. WHEN THE * SENSE SWITCH CHANGES STATE, THE MEMORY TEST WILL * MAKE AN IMMEDIATE AND ORDERLY ABORT TO THE NEXT TEST. * ****************************************************** TITL * * INITIALIZATION * MEM4 EQU $ R01000 EQU $ COPY DEMAND,A DEMAND MODE SELECTION; =0 FOR DEFAULT MODE JEQ A,$+4 DO THIS TEST IF DEFALUT MODE TBIT 2,A DO WE WANT TO DO TEST 3 JT OV,$+2 JUMP IF WE DO JMP R0900A ABORT TEST * COPY =3,A LOAD A WITH TEST NUMBER SELP A,4 PUT OUT ON CONSOLE DISPLAY COPY =0,A CLEAR A JF SS,$+2 TEST SENSE SWITCH COPY =1,A  COPY A,MEMSEN SAVE SENSE SWITCH * COPY STATSV,A COPY A,S COPY =:0E0D,A HALT INSTRUCTION  COPY A,1 STORE IN WORD 1 TITL * COPY =:FFFF,A ALWAYS 64K COPY A,MEMLST SAVE LAST MEMORY ADDR. COPY =:4000,A COPY A,MEMSIZ MEM. SIZE IN 1K INCREMENTS IN BITS 8-14 * COPY =PATEND,A COMPUTE NEXT 1K BOUNDRY AFTER END OF PAT SUB =1,A OR =:3FF,A ADD =1,A COPY A,X SAVE IT IN X * COPY =1,A SET THE A REG FOR THE SELP COPY A,ROMONFLG SET THE ROM ON FLAG SELP A,0;1 ENABLE THE ROM R01004 EQU $ COPY =:AAAA,Q COPY Q,0(X) WRITE TO SEE IF IT IS RAM OR ROM COPY 0(X),A READ IT XOR Q,A  JNE A,R01005 THIS IS IT COPY =:5555,Q COPY Q,0(X) COPY 0(X),A DO ANOTHER PATTERN TO MAKE SURE XOR Q,A JNE A,R01005 THIS IS IT ADD =:400,X BUMP TO NEXT 1K BOUNDARY JEQ X,R01006  JMP R01004 NEXT R01005 EQU $ COPY X,ROMADD SET ROM ADDRESS SHIFT X,R,10 1K BOUNDARY ADDRESS OF ROM  COPY =64,A SUB X,A GET THE SIZE OF THE ROM CLSN A,=4 IS IT 4K ROM JMP R01005A OK CLSN A,=8 IS IT 8K ROM JMP R01005A OK CLSN A,=16 IS IT 16K ROM JMP R01005A OK JST MEMER2 CALCUALTED ROM SIZE IS A ILLEGAL VALUE WORD :0800 R01005A EQU $ SHIFT A,L,8 PUT ROM SIZE IN UPPER BYTE COPY A,ROMSIZ SAVE IT JMP R01007 R01006 EQU $ COPY DMAND2,Q DEMAND MODE SELECTION WORD 2 AND =:FF00,Q GET THE ROM SIZE JEQ Q,R01006A JUMP IF THERE BOTH ZERO COPY X,A PUT CALCULATED VALUE IN THE A REG.  JST MEMER2 CALCU. ROM SIZE = 0 AND DIDN'T MATCH ENTERED VALUE WORD :4000 COMMENT A REG = 0 (CALCULATED ROM SIZE) COMMENT Q REG = INPUTED ROM SIZE R01006A EQU $ COPY =-1,A SET THE ROM ADDRESS TO THE OUTER MOST REACH'S COPY A,ROMADD NO ROM COPY =0,A COPY A,ROMSIZ NO ROM * * R01007 EQU $ COPY =:00,A   COPY A,ROMONFLG SET THE ROM ON FLAG SELP A,0;1 TURN OFF THE ROM'S COPY DMAND2,Q DEMAND MODE SELECTION WORD 2 AND =:FF00,Q GET ENTERED MEM SIZE JEQ Q,R01009 SHIFT Q,R,8 GET ROM SIZE IN LOWER BYTE  CLSN Q,=4 DO WE HAVE 4K OF ROM JMP ROMOK CLSN Q,=8 DO WE HAVE 8K OF ROM JMP ROMOK CLSN  Q,=16 DO WE HAVE 16K OF ROM JMP ROMOK JST MEMER2 INPUT ROM SIZE IS ILLEAGAL VALUE TRY AGAIN WORD :0400 COMMENT PUSH RUN TO USE CALCULATED VALUE JMP R01009 ROMOK EQU $ COPY ROMSIZ,A SHIFT A,R,8 PUT ROM SIZE IN LOWER BYTE FOR COMPARE CSK A,Q SHOULD BE THE SAME IF NOT THEN ERROR NOP JMP $+2  JMP R01009 JST MEMER2 INPUTED VALUE OF ROM DOES NOT MATCH CALCULATED VALUE WORD :4000 * R01009 COPY ROMSIZ,A GET MEMORY SIZE FOR DISPLAY ADD =3,A MEMORY TEST CODE SELP A,4 OUTPUT TO CONSOLE RBIT  0,S INDICATES THAT PAT IS NOT RELOCATED JMP R01100 LPOOL TITL MEMORY TEST -- ROM OVERLAY TEST ******************************************************* * * ---------- ROM OVERLAY TEST ----------- * * THIS TEST WILL VERIFY THAT THE ROM THAT IS PRESENT * DO'S NOT HAVE ANY HOLE IN IT. THIS IS DONE BY READING * IN EACH ROM ADDRESS, COMPLEMENTING THE DATA AND THEN * WRITING IT BACK OUT. THEN THE ORIGINAL DATA IS XOR * WITH WHAT IS IN THE CURRENT ADDRESS AND CHECKED * TO MAKE SURE THAT THE RESULT IS ZERO. * ******************************************************* * R01100 EQU $ COPY ROMSIZ,A GET THE SIZE OF THE ROM JNE A,$+2 IF THERE IS ROM TEST IT JMP R01010 NO ROM SO GO ON TO NEXT TEST SHIFT A,L,2 CONVERT 1K INCREMENT SIZE INTO WORD SIZE NEG A COPY A,ROMCNT SAVE ROM WORD COUNT COPY =1,A ROM ENABLE WORD COPY A,ROMONFLG SET THE ROM ON FLAG SELP A,0;1 TURN THE ROM ON COPY ROMADD,X GET THE STARTING ADDRESS OF ROM R01110 EQU $ COPY 0(X),A GET THE ROM DATA COPY A,Q SAVE IN Q REG. COMP A REVERSE THE DATA COPY A,0(X) WRITE IT BACK OUT XOR 0(X),Q CHECK TO SEE IF ANY BITS HAVE CHANGED JEQ Q,R01120 JUMP IF OK JST MEMER2 ROM DATA WAS ALTERED BY WRITING TO IT WORD :200 COMMENT X REG = ADDRESS OF ERROR COMMENT A REG = ERROR DATA COMMENT Q REG = ORIGINAL DATA R01120 EQU $ ADD =1,X BUMP THE ADDRESS IMS ROMCNT BUMP THE COUNT JMP R01110 JMP R01010 GO ON TO NEXT TEST * ROMCNT RES 1,0 ROM WORD COUNT * LPOOL TITL MEMORY TEST -- HIGH MEMORY ADDRESSABILITY TEST ******************************************************* * * ---------- HIGH MEMORY ADDRESSABILITY TEST ---------- * * A TEST IS MADE TO SEE IF WORD :8001 CAN BE ACCESSED * CORRECTLY. ABSOLUTE DIRECT POST INDEXING, AND * RELATIVE INDIRECT ADDRESSING (WITH XA ON) ARE USED. * ******************************************************* R01010 EQU $ COPY =0,A COPY A,ROMONFLG SET THE ROM ON FLAG SELP A,0;1 TURN OFF THE ROM COPY PT7FFF,A CSM A,P DETERMINE LOCATION IN MEMORY NOP JMP $+2 JMP R0900A IF IN UPPER 32K, ABORT 64K TEST TITL * * 64K TEST  * R01020 EQU $ COPY =:8001,X COPY PT6666,A DATA COPY A,0(X) TRY TO STORE IN LOC. :8001 (INDEXED MODE) * SBIT 6,S TURN ON XA BIT COPY *N8001,A TRY TO LOAD FROM LOC. :8001 (INDIRECT MODE) * COPY PT6666,Q COPY EXPECTED DATA TO Q CSK A,Q NOP JMP $+2 ERROR JMP R01040 NORMAL EXIT JST MEMER2 WRONG DATA STORED IN OR LOADED FROM LOC :8001 WORD :2000 JMP R01040 ERROR EXIT TITL * * END ROUTINE * R01040 EQU $ COPY 1,A GET CONTENTS OF LOCATION 1 COPY =:0E0D,Q  COPY EXPECTED DATA TO Q CSK A,Q NOP JMP $+2 ERROR JMP $+4 OK JST MEMER2 ERROR -- LOCATION 1 WAS ALTERED WORD :1000 COPY Q,1 RESTORE LOCATION 1 COPY STATSV,A  COPY A,S RESTORE STATUS COPY =UMT1,A UNEXPECTED UMT SERVICE ROUTINE ADDRESS COPY A,3(Y) RESTORE UMT * JMP R01010 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP JMP R02000 TITL * * DATA * N8001 WORD :8001 MEMSEN RES 1,0 SENSE SWITCH VALUE ON ENTRY TO MEM TEST MEMSIZ RES  1,0 MEMORY SIZE IN 1K INCREMENTS IN BITS 8-14 MEMLST RES 1,0 ADDRESS OF LAST INSTALLED MEMORY LOCATION ROMADD  RES 1,0 STARTING ADDRESS OF ROM ROMSIZ RES 1,0 SIZE OF THE ROM * * * R0900A JMP R0900B LINKING JUMP TO END OF MEMORY TEST * LPOOL TITL MEMORY TEST -- ADDRESS TEST (TEST1) ****** * * ADDRESS TEST * * THIS TEST WILL INITIALIZE ALL UNUSED MEMORY * LOCATIONS WITH :0000. EACH LOCATION WILL HAVE * ITS ADDRESS WRITTEN INTO ITSELF, READ, AND * VERIFIED. * ****** R02000 EQU $ COPY =PATEND,A ADDRESS OF END OF PAT COPY A,K SET BEGINNING LIMIT OF TESTABLE MEMORY COPY MEMLST,A LAST INSTALLED MEMORY LOCATION COPY A,L SET END LIMIT OF TESTABLE MEMORY CSM K,L COMPARE BEGINNING AND END LIMIT JMP $+2 BEGINNING < END -- OK JMP R0900B END < BEGINNING - NO UNUSED MEMORY - EXIT TITL * * INITIALIZE ALL UNUSED MEMORY WITH :0000 * R02005 COPY K,X INITIALIZE CURRENT LOCATION POINTER COPY =0,A R02010 COPY A,0(X) WRITE :0000 INTO MEMORY CSM X,L END OF UNUSED MEMORY ? JMP $+3 END NOT REACHED NOP JMP R02020 END OF MEMORY - EXIT ADD =1,X INCREMENT CURRENT LOCATION POINTER CSK X,=:80 REACHED TRAP LOCATIONS ? NOP  JMP R02010 NO, LOOP TO CONTINUE ADD =:30,X MOVE PAST ALL TRAPS JMP R02010 LOOP TO CONTINUE * * TEST ALL UNUSED MEMORY TO MAKE SURE THAT * IT CONTAINS :0000 * R02020 COPY K,X COPY =0,Q R02021 COPY 0(X),A CSK A,=0 TEST CONTENTS OF MEMORY NOP JMP $+2 ERROR JMP $+3 OK JST MEMER2 ERROR ROUTINE WORD :0080 CSM X,L END OF UNUSED MEMORY ? JMP $+3  END NOT REACHED NOP JMP R02029 END OF MEMORY - EXIT ADD =1,X INCREMENT CURRENT LOCATION PO INTER CSK X,=:80 REACHED TRAP LOCATIONS ? NOP JMP R02021 NO, LOOP TO CONTINUE ADD =:30,X MOVE PAST ALL TRAPS JMP R02021 LOOP TO CONTINUE R02029 EQU $ JST MEMCHK CHECK SENSE SWITCH AND BLINK LIGHTS TITL * * WRITE THE ADDRESS OF EACH LOCATION INTO ITSELF * R02030 COPY K,X INITIALIZE CURRENT LOCATION POINTER R02031 COPY X,0(X) WRITE ADDRESS INTO MEMORY LOCATION CSM X,L END OF UNUSED MEMORY ? JMP $+3 NO, CONTINUE NOP JMP R02040 END OF MEMORY - EXIT ADD =1,X INCREMENT CURRENT LOCATION POINTER CSK X,=:80 REACHED TRAP LOCATIONS ? NOP JMP R02031 NO, LOOP TO CONTINUE ADD =:30,X MOVE PAST ALL TRAPS JMP R02031 LOOP TO CONTINUE * * VERIFY THAT EACH LOCATION CONTAINS ITS ADDRESS * R02040 COPY K,X INITIALIZE CURRENT LOCATION POINTER R02041 COPY 0(X),A READ MEMORY LOCATION COPY X,Q CSK A,X DOES MEMORY CONTAIN CORRECT VALUE ? NOP JMP $+2 ERROR JMP $+3 OK JST MEMER2 ERROR ROUTINE WORD :0040 CSM X,L END OF UNUSED MEMORY ?  JMP $+3 NO, CONTINUE NOP JMP R02050 END OF MEMORY, EXIT ADD =1,X INCREMENT CURRENT LOCATION POINTER CSK X,=:80 REACHED TRAP LOCATIONS ? NOP JMP R02041 NO, LOOP TO CONTINUE  ADD =:30,X MOVE PAST ALL TRAPS JMP R02041 LOOP TO CONTINUE R02050 EQU $ JST MEMCHK CHECK SENSE SWITCH AND BLINK LIGHTS * JMP R02005 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP * * COPY DATA FOR USE IN TESTS 2 AND 3 * COPY MEMSEN,A COPY A,MSEN1 COPY MEMSIZ,A  COPY A,MSIZ1 JMP R03000 TITL MEMORY TEST ****** * * SUBROUTINES * ****** * * ERROR SUBROUTINE * MEMER2 ENT COPY A,ASAVE SAVE A REGISTER IN 4,A INPUT CONSOLE DATA REGISTER COPY A,CONSAV  STORE IN TEMP LOCATION AND =:8003,A PRESERVE STATE OF BITS 0,1 AND 15 ADD *MEMER2,A ADD DATA FROM SUBROUTINE CALL SELP A,4 OUTPUT TO CONSOLE COPY ASAVE,A RESTORE A REGISTER HLT ERROR HALT  JST MEMCHK CHECK FOR CHANGE OF STATE OF SENSE SWITCH COPY CONSAV,A GET STORED CONSOLE SELP A,4  RESTORE CONSOLE COPY ASAVE,A RESTORE A REGISTER IMS MEMER2 GET RETURN LOCATION JMP *MEMER2 * * CHECK SENSE SWITCH FOR CHANGE IN STATE. * IF CHANGED, THEN EXIT MEMORY TEST * TITL MEMCHK ENT COPY =0,A JF SS,$+2 COPY =1,A XOR MEMSEN,A COMPARE MEMSEN TO SENSE SWITCH JNE A,R0800B IF MISCOMPARE, EXIT MEMORY TEST * * BLINK BITS 8-15 OF CONSOLE DISPLAY * IN 4,A INPUT CONSOLE DISPLAY  CSK A,=3 IS LEFT HALF OF DISPLAY CLEAR ? NOP JMP BLINK2 NO COPY CONSV2,A FETCH SAVED DISPLAY SELP A,4 OUTPUT TO CONSOLE DATA REGISTER JMP *MEMCHK * BLINK2 COPY A,CONSV2 SAVE CONSOLE DATA  REGISTER COPY =3,A CLEAR LEFT HALF OF DISPLAY SELP A,4 OUTPUT TO CONSOLE DATA REGISTER JMP  *MEMCHK SELP A,4 OUTPUT TO CONSOLE JMP *MEMCHK * ASAVE RES 1,0 TEMP. STORAGE FOR A REGISTER CONSAV RES 1,0 TEMP. STORAGE FOR CONSOLE DATA REGISTER CONSV2 RES 1,0 TEMP. STORAGE FOR CONSOLE DATA REGISTER R0800B JMP R0800C LINKING JUMP TO END OF PAT R0900B JMP R0900C LINKING JUMP TO END OF PAT * LPOOL 2  TITL MEMORY TEST -- SPIRAL TEST (TEST2) ****** * * ---------- SPIRAL TEST ---------- * * THIS TEST WILL WRITE A SPIRAL PATTERN IN * UNUSED MEMORY. THE FIRST UNUSED WORD WILL * HAVE BIT 0 ON IN A FIELD OF ZEROS. EACH * SUCCESSIVE WORD WILL HAVE THE BIT ROTATED * LEFT ONE POSITION. THE CONTENTS OF MEMORY * WILL THEN BE VERIFIED. THIS PROCEDURE WILL THEN * REPEAT WITH THE PATTERN FOR EACH WORD ROTATED * LEFT ONE POSITION. THE TEST WILL CONTINUE * UNTIL EACH WORD HAS HAD A BIT ON IN ALL 16 * POSITIONS. * ****** R03000 EQU $ COPY =1,Y DATA PATTERN FOR FIRST WORD * OF TESTABLE MEMORY TITL * * WRITE SPIRAL PATTERN INTO UNUSED MEMORY * R03010 EQU $  COPY Y,Q GET PATTERN FOR FIRST LOCATION COPY K,X INITIALIZE CURRENT LOCATION POINTER R03011 COPY  Q,0(X) WRITE PATTERN IN MEMORY CSM X,L END OF UNUSED MEMORY ? JMP $+3 NO, CONTINUE NOP JMP R03020 END ROTATE Q,L,1 DATA PATTERN FOR NEXT WORD ADD =1,X INCREMENT LOCATION POINTER CSK X,=:80 REACHED TRAP LOCATIONS ? NOP JMP R03011 NO, LOOP TO CONTINUE ADD =:30,X MOVE PAST ALL TRAPS JMP R03011 LOOP TO CONTINUE TITL * * VERIFY THAT MEMORY CONTAINS THE PATTERN JUST WRITTEN * R03020 EQU $ COPY K,X INITIALIZE CURRENT LOCATION POINTER COPY Y,Q GET PATTERN WRITTEN INTO FIRST WORD R03021 COPY 0(X),A READ MEMORY CSK A,Q COMPARE WITH EXPECTED DATA NOP  JMP $+2 ERROR JMP $+3 OK JST MEMER2 ERROR SUBROUTINE WORD :0020 * CSM X,L END OF UNUSED MEMORY ? JMP $+3 NOP NO,CONTINUE JMP R03030 END OF MEMORY - EXIT  ROTATE Q,L,1 GET DATA PATTERN FOR NEXT WORD ADD =1,X INCREMENT LOCATION POINTER CSK X,=:80 REACHED TRAP LOCATIONS ? NOP JMP R03021 NO, LOOP TO CONTINUE ADD =:30,X MOVE PAST ALL TRAPS JMP R03021 LOOP TO CONTINUE * R03030 EQU $ JST MEMCHK CHECK SENSE SWITCH AND BLINK LIGHTS * * *  TBIT 15,Y COPY BIT 15 TO OV JT OV,$+3 IF BIT 15 SET, END OF SPIRAL TEST ROTATE Y,L,1 GET NEXT PATTERN FOR FIRST LOCATION JMP R03010 LOOP FOR ANOTHER PASS * JMP R03000 PATCH FOR LOOPING  ORG $-1 NOP OVERLAY WITH NOP TITL MEMORY TEST -- BYTE TEST (TEST3) ****** * * ---------- BYTE TEST ---------- * * THIS TEST WILL WRITE DATA IN UNUSED MEMORY * IN BYTE MODE. A BYTE OF :55 WILL BE WRITTEN *   IN THE HIGH ORDER BYTE, AND A BYTE OF :AA * WILL BE WRITTEN INTO THE HIGH ORDER BYTE. * THE DATA WILL THEN BE CHECKED. * ****** R04000 EQU $ TITL * * * COPY K,X INITIALIZE CURRENT LOCATION POINTER COPY =:55AA,Q R04001 EQU $ COPY X,Y SET INDEX COPY =:55,A DATA FOR UPPER BYTE SBIT 2,S SET S REG FOR BYTE MODE COPY A,0(Y) STORE DATA IN UPPER BYTE COPY =:AA,A DATA FOR LOWER BYTE COPY A,1(Y) STORE DATA IN LOWER BYTE CBIT 2,S SET S REG FOR WORD MODE COPY 0(X),A READ WORD CSK  A,=:55AA COMPARE WITH EXPECTED DATA NOP JMP $+2 ERROR JMP $+3 OK JST MEMER2 ERROR ROUTINE WORD :0010 CSM X,L END OF UNUSED MEMORY ? JMP $+3 NO, CONTINUE  NOP JMP R04010 END OF MEMORY - EXIT ADD =1,X INCREMENT CURRENT LOCATION POINTER CSK X,=:80 REACHED TRAP LOCATIONS ? NOP JMP R04001 NO, LOOP TO CONTINUE ADD =:30,X MOVE PAST ALL TRAPS JMP R04001 LOOP TO CONTINUE R04010 EQU $ JST MEMCHK CHECK SENSE SWITCH AND BLINK LIGHTS  JMP R04000 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP JMP R05000 * * WORD * MSEN1 RES 1,0 SENSE SWITCH VALUE ON ENTRY TO MEMORY TEST MSIZ1 RES 1,0 MEMORY SIZE IN 1K INCREMENTS IN BITS 8-14 * R0800C JMP R08000 LINKING JUMP TO END OF MEMORY TEST R0900C JMP R09000 LINKING JUMP TO END OF MEMORY TEST * LPOOL TITL MEMORY TEST -- PAT RELOCATION ROUTINES ****** * * PAT RELOCATION ROUTINES * ****** * *  DETERMINE WHETHER TO MOVE PAT TO UPPER MEMORY * R05000 EQU $ FIRST DETERMINE IF PAT IS RELOCATED JF CY,$+2 PAT IS NOT RELOCATED JMP R05040 PAT RELOCATED - MOVE BACK TO LOW MEMORY * * CHECK DEMAND MODE SELECTION ON WHETHER OR NOT * TO RELOCATE PAT * COPY DMAND2,A DEMAND MODE WORD 2 SELECTION TBIT 0,A JF OV,$+2 IF BIT 0 NOT SET, RELOCATE PAT JMP R09000 IF BIT 0 SET, DO NOT RELOCATE PAT TITL * * CHECK TO SEE IF THERE IS ENOUGH MEMORY INSTALLED * TO RELOCATE PAT * COPY MSIZ1,A MEMORY SIZE IN 1K INCREMENTS IN BITS 8-15 SHIFT A,LO,1 MEMORY SIZE / 2 COPY =PATEND,Q ADDRESS OF END OF PAT OR =:1FFF,Q ROUND TO NEXT HIGHER ADD =1,Q 8K BOUNDRY CSM A,Q COMPARE TO 1/2 OF MEMORY SIZE JMP R09000 NOT ENOUGH MEMORY TO RELOCATE PAT -- EXIT NOP OK SUB =1,Q COPY Q,L RESET UPPER LIMIT OF TESTABLE MEMORY TITL * * ROUTINE TO MOVE PAT TO HIGH MEMORY * R05010 COPY L,Y ADD =1,Y START ADDRESS OF DESTINATION AREA COPY =0,X R05011 COPY 0(X),A READ PAT FROM LOW MEMORY COPY A,0(Y) WRITE PAT TO HIGH MEMORY CSK X,L DONE COPYING PAT ? JMP $+3 NO, CONTINUE NOP JMP R05015 DONE COPYING PAT * ADD =1,X INCREMENT READ INDEX ADD =1,Y INCREMENT WRITE INDEX JMP R05011   LOOP TO CONTINUE * * PREPARE FOR JUMP TO RELOCATED PAT * R05015 EQU $ COPY L,Q ADD =1,Q DISPLACEMENT OF PAT * SIN 6 COPY =PUPRTN,A ADDRESS OF POWER UP ROUTINE ADD Q,A ADD DISPLACEMENT OF PAT COPY A,*PTR1 COPY TO POWER UP VECTOR COPY =PDWN,A ADDRESS OF POWER DOWN ROUTINE ADD Q,A  ADD DISPLACEMENT OF PAT COPY A,*PTR2 COPY TO POWER DOWN VECTOR COPY =R08050,A ADDRESS OF UNIMP. INSTR. TRAP ROUTINE ADD Q,A ADD DISPLACEMENT OF PAT COPY A,*PTR3 COPY TO UNIMP. INSTR. TRAP VECTOR COPY  =R08060,A ADDRESS OF UMT ROUTINE ADD Q,A ADD DISPLACEMENT OF PAT COPY A,*PTR4 COPY TO UMT VECTOR *  COPY =0,A COPY A,K SET LOWER LIMIT OF TESTABLE MEMORY COPY ROMSIZ,A GET ROM SIZE IN 1K INCREMENTS ADD =3,A MEMORY TEST CODE SBIT 15,A TO INDICATE THAT PAT IS RELOCATED SELP A,4 OUTPUT TO CONSOLE DATA REGISTER SBIT 0,S TO INDICATE THAT PAT IS RELOCATED RBIT 8,S DISABLE INTERRUPTS WHILE PAT IS RELOCATED COPY =R02005,A ADDRESS OF ADDRESS TEST ADD L,A ADD OFFSET OF ADD =1,A RELOCATED PAT COPY A,$+8 STORE JUMP ADDRESS COPY L,A ADD =1,A CSK A,=:8000 CHECK IF PAT RELOCATED ABOVE 32K JMP $+3 NOP SBIT 6,S TURN ON XA BIT FOR 32K UP JMP *$+1 JUMP INTO RELOCATED PAT WORD 0 TITL * * NORMAL EXIT FROM MEMORY TEST * R05040 EQU $ JST R05050 MOVE PAT BACK TO LOW MEMORY JMP *$+1  JUMP INTO PAT IN LOW MEMORY WORD R09000 * * ROUTINE TO MOVE PAT BACK TO LOW MEMORY * R05050 ENT COPY L,X END OF DESTINATION AREA COPY L,Y -- END OF SHIFT Y,LO,1 -- RELOCATED SBIT 0,Y  -- PAT R05051 COPY 0(Y),A READ RELOCATED PAT COPY A,0(X) STORE IN LOW MEMORY CSK X,=0 FINISHED COPYING PAT ? NOP JMP $+2 NO, CONTINUE JMP R05055 YES SUB =1,X DECREMENT WRITE INDEX SUB =1,Y DECREMENT READ INDEX JMP R05051 LOOP TO CONTINUE * R05055 SIN 2 SBIT 8,S ENABLE INTERRUPTS JMP *R05050 TITL * ROUTINE TO PROVIDE AN ORDERLY EXIT FROM THE MIDDLE * OF THE MEMORY TEST. * R08000 EQU $ COPY K,A GET BEGINNING LIMIT OF TESTABLE MEMORY CSK A,=0 IS PAT RELOCATED ? NOP JMP R09000 NO, EXIT MEMORY TEST JMP R05040 YES, MOVE PAT BACK TO LOW MEMORY FIRST * * UNEXPECTED UNIMPLEMENTED INSTRUCTION TRAP ROUTINE * R08050 ENT JST LIGHT2 HLT JST R05050 COPY PAT BACK TO LOW MEMORY JMP *$+1 START PAT OVER FROM BEGINNING WORD START * * UNEXPECTED UNINSTALLED MEMORY TRAP ROUTINE * R08060 ENT JST LIGHT2 HLT JST R05050 COPY PAT BACK TO LOW MEMORY  JMP *$+1 START PAT OVER FROM BEGINNING WORD START * * ROUTINE TO DISPLAY :AAXX FOR UNEXPECTED TRAPS * LIGHT2 ENT IN 4,A INPUT CONSOLE DATA REGISTER AND =:00FF,A TURN OFF BITS 8-15 OR =:AA0  0,A INSERT :AA IN BITS 8-15 SELP A,4 OUTPUT TO CONSOLE DATA REGISTER JMP *LIGHT2 TITL * * * R09000 EQU $ JMP *MEMBEG PATCH FOR LOOPING THROUGH ENTIRE MEMORY TEST ORG $-1 NOP OVERLAY WITH NOP JMP R09001 MEMBEG WORD R01000 * PTR1 WORD PUPPTR POINTER TO POWER UP VECTOR PTR2 WORD PDNPTR POINTER TO POWER DOWN VECTOR PTR3 WORD UNIMPT POINTER TO UNIMPLEMENTED INSTR. TRAP VECTOR PTR4 WORD UNMEM3 POINTER TO UNINSTALLED MEMORY TRAP VECTOR LPOOL R09001 EQU $ TITL REAL TIME CLOCK TEST ******************************************************* * * ---------- REAL TIME CLOCK TEST ---------- * * THIS TEST VERIFIES CORRECT OPERATION OF THE REAL TIME * CLOCK INCREMENT AND INTERRUPT. THE INCREMENT CELL IS * SET TO A 3 SECOND COUNT, AND IS ALLOWED TO INCREMENT * TO ZERO, WITH THE TEST CHECKING THE INCREMENTING * PROCESS. AS THE INCREMENT COUNT GOES TO ZERO, AN *  INTERRUPT SHOULD OCCUR. * ******************************************************* RTC EQU $ N31000 EQU $ COPY DEMAND,A TEST SELECTION JEQ A,$+4 DEFAULT MODE ==> A=0 TBIT 3,A DO WE WANT TO DO THIS TEST JT OV,$+2 JUMP IF WE DO JMP N31040 ABORT TEST * COPY =4,A RTC TEST CODE SELP A,4 OUTPUT TO CONSOLE COPY =:91,X RTC INCREMENT CELL LOCATION * COPY =N31025,A RTC INTERRUPT SERVICE ROUTINE COPY A,2(X) PUT IN :93 COPY STATSV,A COPY A,S TITL N31010 EQU $ COPY =:FF10,A DEC. -240 COUNT FOR INCREMENT CELL COPY A,0(X) THIS SHOULD GIVE A 2 SECOND WAIT  COPY =:FF11,A VALUE FOR IMAGE COUNTER COPY A,COUNT SBIT 8,S ENABLE INTERRUPTS SBIT 5,S ENABLE RTC N31011 COPY =0,Q CLEAR DELAY COUNTER IMS COUNT COMPARISON VALUE FOR INCREMENT CELL NOP N31012 EQU  $ IJEQ Q,N31013 INCREMENT DELAY COUNTER, JUMP IN EXPIRED COPY 0(X),A GET INCREMENT CELL CSK A,COUNT HAS INCREMENT OCCURED YET ? NOP JMP N31012 NO, COUTINUE DELAY LOOP CSK A,=0 HAS INCREMENT CELL GONE TO ZERO ? NOP JMP $+2 NO, OK JMP N31014 YES, ERROR * TBIT 4,A  COPY BIT 4 TO OV FOR DISPLAY JMP N31011 WAIT FOR NEXT INCREMENT * N31013 RBIT 5,S DISABLE RTC ERROR: TIMER,EXPIRED,BEFORE,INCREMENT,OCCURED JMP N31028 N31014 RBIT 5,S DISABLE RTC ERROR: INCREMENT,CELL,WENT,TO,ZERO,WITH,NO,INTERRUPT JMP N31028 TITL N31025 ENT INTERRUPT SERVICE ROUTINE COPY 0(X),A GET INCREMENT CELL CSK A,=0 NOP ERROR: INCREMENT,CELL,SHOULD,BE,0,ON,INTERRUPT COPY COUNT,A JEQ A,$+2 ERROR: INCREMENT,CELL,SHOULD,HAVE,VALUE,IN,'COUNT' N31028 EQU $ RBIT 5,S DISABLE RTC SBIT 8,S ENABLE INTERRUPTS JMP N31000 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP N31029 JMP N31030 EXIT COUNTA RES 1,0 CHECK COUNT OVERFLOW CELL COUNT RES 1,0 CHECK COUNT FOR INCREMENT CELL LPOOL TITL *********************************************************************** * * RTC CONSISTANCY TEST * *   THE RTC IS RUN FOR ABOUT 1/8 SECOND (16 TICS) AND * AN AVERAGE 2 TIC SOFTWARE COUNT IS TAKEN. A + AND - * 6% WINDOW IS CALCULATED ON THIS SOFTWARE COUNT, AND * USED TO DETERMINE THE CONSISTENCY OF THE RTC OVER A * 4 SECOND SPAN * ************************************************************************ * N31030 EQU $ RBIT 4,S DISABLE CONSOLE INTERRUPT RBIT 8,S INHIBIT INTERRUPTS COPY =:FFF7,A SET LOOP TO 9 TIMES COPY A,N3LOOP COPY =0,A CLEAR SOFTWARE COUNT COPY A,COUNT COPY A,COUNTA N31031 COPY =:FFFE,A MINUS TWO TICS COPY A,0(X) STORE AT :91 COPY =N31032,A INTERRUPT RETURN COPY A,2(X) STORE AT :93 SBIT 5,S ENABLE RTC SBIT 8,S START RTC RES $;:F-$&:F,0 IMS INSTR. MUST BE AT LOC. :XXXF N310311 IMS COUNT JMP $-1 IMS COUNTA JMP N310311 ERROR: NO,INTERRUPT,OR,COUNT,OVERFLOW * N31032 ENT RBIT 8,S  STOP RTC COPY 0(X),A CHECK TIC COUNT = 0 CSK A,=0 NOP ERROR: RTC,COUNT,CELL,NOT,=,0,AT,INTERRUPT COPY N3LOOP,A CSK A,=:FFF7 THROW AWAY FIRST NOP JMP $+4 COPY =0,A FIRST COPY A,COUNT COPY A,COUNTA IMS N3LOOP FINISHED? JMP N31031 NO COPY COUNTA,A YES,AVERAGE COPY COUNT,Q IFT LSI410=1 XSHIFT 3 ENDC IFF LSI410=1 SHIFT AQ,RO,3 DIVIDE BY 8 ENDC COPY A,LOW THIS IS A TWO TIC SOFTWARE AVERAGE COPY Q,LOW+1 IFT LSI410=1 XSHIFT 4 ENDC IFF LSI410=1 SHIFT AQ,RO,4  12 % WINDOW ENDC COPY A,RTCSAVE COPY Q,RTCSAVE+1 RBIT CY,S ADDC LOW+1,Q ADDC LOW,A COPY A,HIGH COPY Q,HIGH+1 COPY LOW,A COPY LOW+1,Q SBIT CY,S IFT LSI410=1 XSUBC RTCSAVE+1,Q ENDC IFF LSI410=1 SUBC RTCSAVE+1,Q ENDC TBIT CY,S JT OV,$+2 SUB =1,A SUB RTCSAVE,A COPY A,LOW COPY Q,LOW+1 TITL * * SECOND PART OF TEST BEGINS HERE * COPY =:FF10,A SET UP FOR 4 SECOND RUN COPY A,N3LOOP N31033 COPY =0,A COPY A,COUNT COPY =:FFFE,A USE MINUS TWO AGAIN COPY A,0(X) STORE IN :91 COPY =N31034,A RTC INTERRUPT SERVICE ROUTINE LOCATION COPY A,2(X) STORE IN :93 SBIT 5,S ENABLE RTC SBIT 8,S START RTC RES $;:F-$&:F,0 IMS INSTR. MUST BE AT LOC. :XXXF N310341 IMS COUNT JMP $-1 IMS COUNTA JMP N310341 ERROR: NO,INTERRUPT,OR,COUNT,OVERFLOW * N31034 ENT RBIT 8,S STOP RTC COPY 0(X),A CHECK TIC COUNT = 0 CSK A,=0 NOP ERROR: RTC,COUNT,CELL,NOT,=,0,ON,INTERRUPT COPY N3LOOP,A CSK A,=:FF10 THROW AWAY FIRST NOP JMP $+2 JMP N31035 FIRST * AND =:F0,A -- SHIFT A,LO,8 -- CONSOLE ADD =4,A -- DISPLAY SELP A,4 -- * COPY COUNT,A CSK A,HIGH+1 DOES COUNT FIT IN WINDOW JMP $+3 NOP ERROR: COUNT,IS,ABOVE,LIMIT,-,RTC,PERIOD,TOO,HIGH CSK A,LOW+1 ERROR: COUNT,IS,BELOW,LIMIT,-,RTC,PERIOD,TOO,LOW NOP N31035 EQU $ IMS N3LOOP ARE WE FINISHED? JMP N31033 NO * JMP N31030 PATCH FOR LOOPING ORG $-1 JMP  *LOOP PATCH FOR LOOPING THROUGH ENTIRE RTC TEST ORG $-1 NOP OVERLAY WITH NOP JMP  N31040 * LOOP WORD N31000 POINTER TO BEGINNING OF RTC TEST HIGH RES 2,0 HIGH LIMIT LOW RES 2,0 LOW LIMIT N3LOOP RES 1,0 LOOP CONTROL RTCSAVE RES 2,0 LPOOL N31040 EQU $ ******************************************************* * * ---------- I/O TEST ---------- * * THE I/O TEST (IOT) TESTS ALL INPUT / OUTPUT * FUNCTIONS OF THE PROCESSOR. IN ADDITION, IT * VERIFIES ALL SIGNALS ON THE MOTHERBOARD, * AND TESTS ALL PROCESSOR FUNCTIONS ASSOCIATED * WITH INTERRUPTS (IE INSTRUCTION EXECUTION * UNDER INTERRUPTS, AND INSTRUCTION NON- * INTERRUPTABILITY). * FOLLOWING ARE THE INDIVIDUAL TESTS IN IOT: * * 1. DEVICE ADDRESS FUNCTION CODE EXERCISE * 2. PROGRAMMED I/O INSTRUCTION TESTING * 3. I/O CLOCKS TESTING * 4. INTERRUPT INSTRUCTION TESTING * 5. AUTO I/O INSTRUCTION TESTING * 6. NON-INTERRUPTABILITY TESTING * 7. DMA TESTING * 8. POWER-FAIL TESTING * * NOTE - THIS TEST REQUIRES THAT THE I/O TEST * MODULE BE INSTALLED IN THE SYSTEM. * ******************************************************* TITL * * DEVICE ADDRESS AND FUNCTION CODE EQUATES * DA0A EQU :50 DA0B EQU :58 DA0C EQU :60 DA15 EQU :A8 FC0 EQU 0 FC1 EQU 1 FC2 EQU 2 FC3 EQU 3 FC4 EQU 4 FC5 EQU 5 FC6 EQU 6 FC7 EQU 7 TITL INPUT OUTPUT TEST * * INITIALIZATION * IOT4 EQU $ G00000 EQU $ COPY DEMAND,A TEST SELECTION JEQ A,$+4 DO THIS TEST IF IN DEFAULT MODE TBIT 4,A DO WE WANT TO DO THIS TEST JT OV,$+2 JUMP IF WE DO JMP G00002 ABORT TEST COPY =0,A IN :50,A CLSN =:AF,A TEST FOR TEST BOARD RESPONSE JMP G00009 EXECUTE I/O TEST G00002 JMP *$+1 WORD  G90000 * * G00009 EQU $ COPY =:0F05,A IOT RUN INDICATOR SELP A,4 OUTPUT TO CONSOLE DATA REGISTER  COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY STATSV,A COPY A,S INITIALIZE STATUS JMP G01010 TITL I/O TEST -- DAFC TESTING ************************************************** * * DEVICE ADDRESS / FUNCTION CODE TESTING * * THE FOLLOWING DEVICE ADDRESS /FUNCTION CODE * COMBINATIONS ARE TESTED * *  DA0A FC0 * DA0A FC1 * DA0A FC2 * DA0B FC3 * DA0B FC4 * DA0B FC5 * DA0B FC6 * DA0B FC7 * DA15 FC2 * * EACH OF THESE PAIRS IS DEFINED TO * CAUSE THE I/O TEST CARD TO RETURN THE * 1'S COMPLIMENT OF THE DAFC COMBINATION. * ************************************************** TITL ****** * * DEVICE ADDRESS / FUNCTION CODE EXERCISE * ****** * * FIRST TEST DEVICE ADDRESS 0B, FUNCTION CODES 0-7 USING A REG * G01010 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY =0,X INDEX FOR IN INSTRUCTION COPY =:AF,Y INDEX FOR CLSN INSTRUCTION G01012 EQU $ COPY =0,A XNX X  FUNCTION CODE IS DETERMINED BY X REG IN DA0A;FC0,A 'A' SHOULD BE 1'S COMPLIMENT OF DA&FC XNX Y   CLSN =0,A VALUE FOR COMPARISON IS IN Y REG. JMP $+2 OK ERROR: DEVICE ADDR / FUNCTION CODE FAILURE * FC IS IN X REGISTER * COMPLIMENTED VALUE IS IN Y REGISTER * CLSN =7,X REACHED LAST FUNCTION CODE ? JMP G01015 YES, END REACHED - NEXT TEST ADD =1,X SUB  =1,Y JMP G01012 LOOP TO CONTINUE TITL * * NEXT TEST DEVICE ADDRESS 15, FUNCTION CODE 2 USING Q REG * G01015 EQU $ COPY =0,A IN DA15;FC2,Q 'Q' SHOULD BE 1'S COMPLIMENT OF DA&FC CLSN =:55,Q JMP $+2 ERROR: DEVICE ADDR / FUNCTION CODE FAILURE. * JMP G01010 PATCH FOR LOOPING ORG $-1  NOP OVERLAY WITH NOP JMP G02000 LPOOL TITL I/O TEST -- PROGRAMMED I/O TESTING ************************************************** * * OUT 4REG,DAFC G02000 * IN DAFC,4REG G02000 * SELP 4REG,DAFC G03000 * SST DAFC G04000 * * IN AND OUT ARE TESTED WITH 4 REGISTERS AND * WITH 4 DATA PATTERNS (:FFFF, :AAAA, :SSSS, * :0000). DATA IS OUTPUT TO THE I/O TEST CARD * USING OUT, AND THEN READ BACK IN USING IN. * * SELP IS TESTED WITH ONLY THE A REGISTER * * SST IS TESTED FOR BOTH A TRUE AND A FALSE * SENSE RESPONSE. * ************************************************** TITL ****** * * OUT 4REG,DAFC *  IN DAFC,4REG * ****** G02000 EQU $ COPY PT0000,Q INITIALIZE Q COPY PTFFFF,A INITIALIZE A OUT Q,DA15;FC0 WRITE DATA TO HOLDING REG IN DA15;FC0,A READ IT BACK CSK A,PT0000 NOP ERROR: DATA,BUS,FAILURE,--,A,SHOULD,=,0 * COPY PTAAAA,X INITIALIZE X OUT X,DA15;FC0 WRITE DATA TO HOLDING REG.  IN DA15;FC0,Q READ IT BACK CSK Q,PTAAAA NOP ERROR: DATA,BUS,FAILURE,--,Q,SHOULD,=,:AAAA TITL COPY PT5555,Y INITIALIZE Y OUT Y,DA15;FC0 WRITE DATA TO HOLDING REG IN DA15;FC0,X READ IT BACK COPY X,Q CSK Q,PT5555 NOP ERROR: DATA,BUS,FAILURE,--,X,SHOULD,=,:5555 * COPY PTFFFF,A OUT A,DA15;FC0 WRITE DATA TO HOLDING REG. IN DA15;FC0,Y READ IT BACK COPY Y,Q CSK Q,PTFFFF NOP ERROR: DATA,BUS,FAILURE,--,Y,SHOULD,=,:FFFF * JMP G02000 PATCH FOR LOOPING ORG $-1  NOP OVERLAY WITH NOP TITL ****** * * SELP 4REG,DAFC * ****** G03000 EQU $ COPY =0,Q SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY PT6666,A SELP A,DA15;FC7 WRITE DATA TO HOLDING REGISTER  IN DA15;FC0,Q READ IT BACK CSK Q,PT6666 NOP ERROR: DATA,BUS,FAILURE,--,Q,SHOULD,=,:6666 ****** * * SST DAFC * ****** G04000 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE SST DA15;FC1 TEST FOR I/O BOARD INSTALLED ERROR: SST,FAILED,--,SHOULD,SKIP SST 4 UNDEFINED DEVICE ADDRESS  JMP $+2 ERROR: SST,FAILED,--,SHOULD,NOT,SKIP * JMP G03000 PATCH FOR LOOPING ORG $-1   NOP OVERLAY WITH NOP TITL I/O TEST -- I/O CLOCKS TESTING ************************************************** * * VERIFY I/O CLOCKS (IOCL AND CLK) AND CLOCK * SIGNAL ROUTING ON MOTHERBOARD. * ************************************************** G05000 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE SELP A,DA15;FC4 ENABLE I/O CLOCKS SST DA0A;FC0 TEST I/O CLOCK (IOCL) ERROR: I/O,CLOCK,(IOCL),NOT,RUNNING SST DA0A;FC1 TEST CLOCK (CLK) ERROR: CLOCK,(CLK),NOT,RUNNING SELP A,DA15;FC5 DISABLE I/O CLOCKS SST DA0A;FC0 TEST I/O CLOCK (IOCL) JMP $+2 OK ERROR: I/O,CLOCK,(IOCL),IS,STILL,RUNNING SST DA0A;FC1 TEST CLOCK (CLK) JMP $+2 ERROR: CLOCK,(CLK),IS,STILL,RUNNING * JMP G05000 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP TITL I/O TEST -- INTERRUPT INSTRUCTION TESTING ******************************************************* * * JST MEN AS INTERRUPT INSTRUCTION * IMS MEM AS INTERRUPT INSTRUCTION * JSK MEM AS INTERRUPT INSTRUCTION * NOP AS INTERRUPT INSTRUCTION * * INSTRUCTIONS ARE TESTED FOR DEFINED ASPECTS * OF OPERATION AS INTERRUPT INSTRUCTIONS. * IMS IS TESTED ON A NORMAL AND AN EOB INTERRUPT. *  JSK IS TESTED IN BOTH NORMAL OPERATION AND IN * TRAP OPERATION. THIS ALLOWS TESTING OF PARTICULAR * CHARACTERISTICS OF TRAP OPERATION WHEN CAUSED BY * AN INTERRUPT INSTRUCTION. * SIN IS TESTED FOR ABILITY TO INHIBIT INTERRUPTS. * ******************************************************* TITL ****** * * TEST SIN FOR INTERRUPT INHIBIT * TEST JST AS INTERRUPT INSTRUCTION * AND VERIFY INTERRUPT TO OCCUR * ****** G06000 EQU $ COPY JST1,A JST INSTRUCTION  COPY A,:20 STORE IN INTERRUPT LOCATION COPY =G06003,A INTERRUPT SERVICE ROUTINE LOCATION COPY A,:21 COPY =:40,Y EOB INTERRUPT LOCATION COPY =G06006,A EOB INTERRUPT SERVICE ROUTINE LOCATION COPY A,1(Y) STORE IN EOB INTERRUPT LOCATION RBIT 8,S DISABLE INTERRUPTS COPY =0,A COPY A,G06003 CLEAR SUBROUTINE RETURN POINTER SELP A,DA0B;FC6 INITIALIZE I/O MODULE SELP A,DA15;FC3 SET IUR (INTERNAL) STIMULUS NOP NOP SST DA0A;FC2 IS IUR PENDING YET ? JMP $-1 NO, LOOP UNTIL READY SIN 2 SBIT 8,S ENABLE INTERRUPTS NOP ADD =1,A THIS INSTRUCTION SHOULD EXECUTE BEFORE INTERRUPT G06002 ADD =1,A THIS INSTRUCTION SHOULD NOT EXECUTE RBIT 8,S DISABLE INTERRUPTS ERROR: INTERRUPT,DID,NOT,TAKE,PLACE JMP G06010 ERROR EXIT G06003 ENT CSK A,=1 NOP ERROR: SIN,ALLOWED,WRONG,NUMBER,OF,INSTRUCTIONS,TO,EXECUTE COPY S,A AND =:0100,A TEST BIT 8 JEQ A,$+2 ERROR: JST,FAILED,--,INT,BIT,OF,S,REG,WAS,NOT,RESET COPY G06003,A FETCH SUBROUTINE RETURN POINTER CSK A,=G06002 COMPARE WITH EXPECTED VALUE NOP ERROR: JST,FAILED,--,STORED,WRONG,RETURN,POINTER JMP G06010 G06006 ENT ERROR:  JST,FAILED,--,SHOULD,NOT,GET,EOB,INTERRUPT TITL ****** * * IMS AS INTERRUPT INSTRUCTION * ****** G06010 EQU $  COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY A,S INITIALIZE STATUS SBIT 8,S  ENABLE INTERRUPTS COPY IMS1,A IMS $+1 INSTRUCTION COPY A,:20 STORE IN INTERRUPT LOCATION COPY PT7FFF,A :7FFF - INITIAL COUNT FOR IMS COPY A,:21 COPY =G06014,A EOB INTERRUPT SERVICE ROUTINE LOCATION  COPY A,1(Y) STORE AT EOB INTERRUPT LOCATION COPY =0,A SELP A,DA15;FC3 SET IUR (INTERNAL) STIMULUS  NOP ERROR: INTERRUPT,DID,NOT,TAKE,PLACE JMP G06020 ERROR EXIT * G06014 ENT COPY :21,A FETCH IMS COUNT CELL JEQ A,$+2 ERROR: COUNT,CELL,SHOULD,=,0,ON,ECHO,INTERRUPT COPY =0,A EXCH A,S INITIALIZE STATUS AND SAVE PREVIOUS STATUS CSK A,S NOP ERROR: IMS,ALTERED,STATUS * * JMP  G06000 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP COPY =:FF10,A IOT RUN INDICATOR SELP A,4 OUTPUT TO CONSOLE DATA REGISTER JMP G06020 * * * IMS1 IMS $+1 JSK1 JSK *$+1 * * * LPOOL TITL ****** * * JSK AS INTERRUPT INSTRUCTION * ****** G06020 EQU $ COPY =0,A SELP  A,DA0B;FC6 INITIALIZE I/O MODULE COPY STATSV,A COPY A,S INITIALIZE STATUS COPY JSK1,A JSK *$+1 INSTRUCTION COPY A,:20 STORE IN INTERUPT LOCATION (:20) COPY =G06025,A INTERRUPT SERVICE ROUTINE LOCATION COPY A,:21 STORE AT :21 COPY =G06027,A EOB INTERRUPT SERVICE ROUTINE LOCATION COPY A,1(Y)  STORE AT EOB INTERRUPT LOCATION (:41) COPY =:9C,X STACK EXCEPTION TRAP LOCATION COPY JST1,A JST *$+1 INSTRUCTION COPY A,2(X) STORE IN 3RD WORD OF TRAP COPY =G06028,A STACK EXCEPTION TRAP SERVICE ROUTINE LOC.  COPY A,3(X) STORE IN 4TH WORD OF TRAP (:9F) COPY =STACKL,A STACK LIMIT COPY A,L LOAD L REGISTER COPY =STACKK,A STACK POINTER COPY A,K LOAD K REGISTER COPY =0,A COPY A,STACK1 CLEAR STACK COPY A,0(X) CLEAR TRAP LOCATIONS COPY A,1(X) SIN 1 SELP A,DA15;FC3 SET IUR STIMULUS NOP G06023 EQU $ ERROR: INTERRUPT,DID,NOT,OCCUR JMP G06029 ERROR EXIT TITL * INTERRUPT SERVICE ROUTINE * G06025 EQU $ SIN 3 COPY STATSV,A FETCH VALUE FOR S REG. RBIT 8,A TURN OFF INT BIT EXCH A,S INITIALIZE STATUS AND SAVE PREVIOUS STATUS CSK A,STATSV COMPARE STATUS WITH EXPECTED VALUE NOP ERROR: JSK,FAILED,--,S,REG,WAS,ALTERED COPY K,A GET STACK POINTER CSK A,=STACK1 COMPARE WITH EXPECTED VALUE NOP ERROR: JSK,FAILED,--,K,CONTAINS,WRONG,VALUE COPY STACK1,A GET STORED,P,COUNTER CSK A,=G06023 COMPARE WITH EXPECTED VALUE NOP ERROR: JSK,FAILED,--,WRONG,VALUE,OF,P,SAVED,IN,STACK JMP G06029 EXIT * G06027 ENT EOB INTERRUPT SERVICE ROUTINE ERROR: SHOULD,NOT,RECIEVE ,EOB,INTERRUPT JMP G06029 * G06028 ENT STACK EXCEPTION TRAP ROUTINE ERROR: UNEXPECTED,STACK,EXCEPTION,TRAP * G06029 JMP G06020 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP JMP G06030 TITL * * DATA * STACK RES 8,0 STACKL EQU STACK STACK2 EQU STACK+6 STACK1 EQU STACK+7 STACKK EQU  STACK+8 * * * LPOOL TITL ****** * * JSK AS INTERRUPT INSTRUCTION * WITH FORCED STACK OVERFLOW TRAP * ****** G06030 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE SBIT 8,S ENABLE INTERRUPTS COPY =G06035,A INTERRUPT SERVICE ROUTINE LOCATION COPY A,:21 COPY =G06037,A EOB INTERRUPT SERVICE ROUTINE LOCATION COPY A,1(Y) STORE AT EOB INTERRUPT LOCATION COPY =G06038,A STACK TRAP SERVICE ROUTINE LOCATION COPY A,3(X) STORE IN 4TH WORD OF TRAP (:8F) COPY =STACKL,A STACK LIMIT COPY A,L LOAD L REGISTER COPY =STACK1,A STACK POINTER COPY A,K LOAD K REGISTER COPY =0,A COPY A,STACK2 CLEAR STACK COPY A,0(X) CLEAR TRAP LOCATIONS COPY A,1(X) SIN 1 SELP A,DA15;FC3 SET IUR (INTERNAL) STIMULUS NOP G06033 EQU $ ERROR: INTERRUPT,DID,NOT,OCCUR JMP G0603A ERROR EXIT TITL * * TRAP SERVICE ROUTINE * * * FIRST CHECK THAT TRAP EXECUTION AUTOMATICALLY DOES A SIN 15 * G06038 ENT COPY JST1,A JST *$+1 COPY A,:20 STORE AT INTERRUPT LOCATION COPY =G06039,A TRAP SERVICE ROUTINE ADDRESS  COPY A,:21 STORE AT INTERRUPT LOCATION COPY STATSV,Q FETCH INITIAL VALUE FOR S REG EXCH Q,S  RESTORE S AND SAVE PREVIOUS STATUS COPY =0,A IJNE A,$ WAIT FOR 2ND INTERRUPT ERROR: 2ND,INTERRUPT,DID,NOT,OCCUR JMP G06034 ERROR EXIT G06039 ENT CSK A,=8 NOP ERROR: TRAP,EXECUTION,DID,NOT,AUTOMATICALLY,DO,SIN,15 * * CHECK POST-TRAP STATUS * G06034 TBIT 8,Q COPY INT BIT TO OV JF OV,$+2 TEST INT BIT ERROR: JST,AT,TRAP,LOCATION,SHOULD,RESET,INT,BIT SBIT 8,Q SET INT BIT CSK Q,STATSV  NOP ERROR: JSK,AT,INTERRUPT,LOCATION,OR,JST,AT,TRAP,LOCATION * ALTERED STATUS (OTHER THAN INT BIT) * * CHECK POST TRAP POINTERS * COPY K,A GET STACK POINTER CSK A,=STACK2 COMPARE WITH EXPECTED VALUE NOP ERROR: JSK,FAILED,--,K,CONTAINS,WRONG,VALUE COPY STACK2,A GET STORED P COUNTER CSK A,=G06033 COMPARE WITH EXPECTED VALUE NOP ERROR: JSK,FAILED,--,WRONG,VALUE,OF,P,SAVED,IN,STACK COPY  0(X),A FETCH 1ST WORD OF TRAP (:9C) CSK A,=G06035 SHOULD BE EFFECTIVE ADDRESS OF JSK INST NOP ERROR: LOC.,POINTER,AT,TRAP,LOADED,WITH,WRONG,VALUE COPY 1(X),A FETCH 2ND WORD OF TRAP (:9D) CSK A,JSK1 SHOULD BE JSK INSTRUCTION NOP ERROR: WRONG,INSTRUCTION,STORED,AT,TRAP,LOC. COPY G06038,A GET TRAP SERVICE ROUTINE RETURN POINTER CSK A,=G06035 SHOULD BE EFFECTIVE ADDRESS OF JSK INST. NOP ERROR: WRONG,RETURN,POINT ER,WAS,STORED,AT,G06038 JMP G0603A TITL * G06035 EQU $ INTERRUPT SERVICE ROUTINE RBIT 8,S  DISABLE INTERRUPTS ERROR: JSK,FAILED,--,SHOULD,TAKE,TRAP JMP G0603A ERROR EXIT * G06037 ENT  EOB INTERRUPT SERVICE ROUTINE ERROR: SHOULD,NOT,GET,EOB,INTERRUPT * G0603A EQU $ JMP G06030 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP * COPY JMP1,A JMP *$+1 INSTRUCTION COPY A,2(X) STORE AT 3RD WORD OF TRAP COPY =SET1,A UNEXPECTED STACK TRAP SERVICE ROUTINE COPY A,3(X) STORE AT 4TH WORD OF TRAP JMP G06050 LPOOL 8 TITL ****** * * TEST THAT XA IS FORCED ON TEMPORARILY *  BY EXECUTION OF AN INTERRUPT INSTRUCTION * ****** G06050 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE SBIT 8,S ENABLE INTERRUPTS COPY IMS2,A IMS *$+1 COPY A,:20 STORE AT INTERRUPT LOCATION COPY L8001,A ADDRESS OF IMS COUNT CELL (:8001) COPY A,:21 * SBIT 6,S SET XA BIT COPY =-1,A COPY A,*L8001 INITIALIZE IMS COUNT CELL (:8001) COPY =G06054,A EOB INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(Y) STORE AT EOB INTERRUPT LOCATION * RBIT 6,S RESET XA BIT COPY =0,A SELP A,DA15;FC3 SET IUR STIMULUS NOP RBIT 8,S DISABLE INTERRUPTS ERROR: INTERRUPT,DID,NOT,OCCUR  JMP G06059 ERROR EXIT TITL * * EOB INTERRUPT SERVICE ROUTINE * G06054 ENT COPY =:0E0D,A EXPECTED CONTENTS OF LOCATION 1 EXCH A,1 TEST LOCATION 1 CSK A,=:0E0D NOP JMP $+2 ERROR  JMP $+3 * ERROR: LOCATION,1,ALTERED,--,XA,WAS,NOT,FORCED,ON JMP G06059 * SBIT 6,S TURN ON XA BIT COPY *L8001,A FETCH IMS COUNT CELL (:8001) JEQ A,G06059 ERROR: IMS,COUNT,CELL,NOT,ZERO,AT,EOB,INTERRUPT JMP $+2 G06059 EQU $ COPY =UMT1,A COPY A,3(X) JMP G06050 ORG $-1 NOP JMP G07000  TITL IMS2 IMS *$+1 L8001 WORD :8001 LPOOL TITL I/O TEST -- AUTO I/O TESTING ******************************************************* * * AIN DAFC * AIB DAFC * AOT DAFC * AOB DAFC * * EACH INSTRUCTION IS USED TO TRANSFER A 6 WORD * BLOCK OF DATA. THE DATA TRANSFERED IS CHECKED * AFTER THE EOB INTERRUPT. ALSO CORRECT TERMINAL * STATE OF THE WORD/BYTE COUNTER AND ADDRESS POINTER * ARE CHECKED AFTER THE EOB INTERRUPT. * * SINCE THE I/O TEST BOARD HAS ONLY A 1 WORD * HOLDING REGISTER, AOT AND AOB CAN BE USED * TO TRANSFER ONLY ONE WORD/BYTE BEFORE THE * EOB INTERRUPT. A SERIES OF THESE TRANSFERS * IS PERFORMED, UNTIL A TOTAL OF 6 WORDS HAS * BEEN TRANSFERED. AFTER THE LAST EOB INTERRUPT, * THE COUNTER AND ADDRESS POINTER ARE CHECKED * (AOT AND AOB ONLY) * * AIN IS TESTED WITH DEVICE ADDRESS 0B AND * FUNCTION CODE 2. THE I/O TEST MODULE WILL * RESPOND TO THIS COMBINATION BY ROTATING * ITS HOLDING REGISTER DATA RIGHT ONE PLACE * AFTER EACH WORD HAS BEEN TRANSFERED. ALSO, * EVERY OTHER WORD  TRANSFERED WILL BE ZEROS, * STARTING WITH THE FIRST WORD. * *******************************************************  TITL ****** * * AIN AS INTERRUPT INSTRUCTION * ****** AIN1 AIN DA0B;FC2 AIB1 AIB DA15;FC0 G07000 EQU $  COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY STATSV,A COPY A,S INITIALIZE STATUS  COPY AIN1,A AIN DA0B;FC2 COPY A,:20 STORE AT INTERRUPT LOCATION COPY WLEN,A NEGATIVE WORD COUNT COPY A,:21 COPY WPOINT,A WORD ADDRESS POINTER FOR AIN COPY A,:22 COPY =G07005,A EOB INTERRUP SERVICE ROUTINE LOCATION COPY A,1(Y) STORE AT EOB INTERRUPT LOCATION COPY =5,X -- COPY =0,A -- CLEAR G07002 XNX X -- AIN COPY A,PNT1 -- BUFFER JNED X,G07002 -- COPY =:F0AA,A DATA VALUE OUT A,DA15;FC0 OUTPUT TO HOLDING REGISTER COPY =0,A SELP A,DA15;FC3 SET IUR (INTERNAL) STIMULUS NOP RBIT 8,S DISABLE INTERRUPTS ERROR: NO,EOB,INTERRUPT JMP G07009 ERROR EXIT TITL * * EOB INTERRUPT SERVICE ROUTINE * G07005 ENT COPY :21,A FETCH AIN WORD COUNT TBIT 15,A COPY APX BIT TO OV JT OV,$+2 TEST APX BIT ERROR: APX,BIT,SHOULD,REMAIN,ON RBIT 15,A  RESET APX BIT JEQ A,$+2 COUNT SHOULD BE 0 ERROR: WORD,COUNT,NOT,ZERO,ON,EOB,INTERRUPT COPY :22,A  FETCH AIN WORD POINTER CSK A,=PNT1+5 SHOULD POINT TO END OF BLOCK NOP ERROR: TERMINAL,AIN,POINTER,HAS,WRONG,VALUE COPY =0,X INITIALIZE INDEX COPY =:7855,Q COMPARISON DATA VALUE G07007 XNX X COPY PNT1,A READ A WORD FROM BUFFER INDEXED BY X JEQ A,$+2 ERROR: WRONG,DATA,TRANSFERED,--,INDEX,IS,IN,X,REG  ADD =1,X INCREMENT INDEX XNX X COPY PNT1,A READ A WORD FROM BUFFER INDEXED BY X CSK  A,Q COMPARE WITH EXPECTED DATA NOP ERROR: WRONG,DATA,TRANSFERED,--,A=ACTUAL;,Q=EXPECTED ROTATE Q,L,14 SHIFT DATA FOR NEXT COMPARE (=ROTATE R,Q,2) ADD =1,X INCREMENT INDEX CSK X,=6 END OF DATA ?  NOP JMP G07007 NO, LOOP TO CONTINUE G07009 JMP G07000 PATCH FOR LOOPING ORG $-1 NOP  OVERLAY WITH NOP JMP G07010 LPOOL 5 TITL ****** * * AIB AS INTERRUPT INSTRUCTION * ****** G07010 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE SBIT 8,S ENABLE INTERRUPTS  COPY AIB1,A AIB DA15;FC0 COPY A,:20 STORE AT INTERRUPT LOCATION COPY BLEN,A NEGATIVE BYTE LENGTH COPY A,:21 COPY =PNT1,A -- FORM SHIFT A,LO,1 -- INITIAL SUB =1,A -- AIB POINTER COPY A,:22 COPY =G07015,A EOB INTERRUPT SERVICE ROUTINE LOCATION COPY A,1(Y) STORE AT EOB INTERRUPT LOCATION COPY =5,X -- COPY =0,A -- CLEAR G07012 XNX X -- AIN COPY A,PNT1  -- BUFFER JNED X,G07012 -- COPY PTAA55,A DATA VALUE OUT A,DA15;FC0 OUTPUT TO HOLDING REGISTER   COPY =0,A SELP A,DA15;FC3 SET IUR (INTERNAL) STIMULUS NOP RBIT 8,S DISABLE INTERRUPTS  ERROR: NO,EOB,INTERRUPT JMP G07019 ERROR EXIT TITL * * EOB INTERRUPT SERVICE ROUTINE * G07015 ENT  COPY :21,A FETCH AIB BYTE COUNT TBIT 15,A COPY APX BIT TO OV JT OV,$+2 TEST APX BIT  ERROR: APX,BIT,SHOULD,REMAIN,ON RBIT 15,A RESET APX BIT JEQ A,$+2 COUNT,SHOULD,BE,ZERO ERROR: BYTE,COUNT,NOT,ZERO,ON,EOB,INTERRUPT COPY :22,A FETCH AIB BYTE POINTER COPY =PNT2,Q -- FORM SHIFT Q,LO,1 -- TERMINAL SUB =1,Q -- AIB POINTER CSK A,Q COMPARE WITH AIB POINTER NOP  ERROR: TERMINAL,AIB,POINTER,SHOULD,=,Q COPY =0,X INITIALIZE INDEX COPY PT5555,Q COMPARISON DATA VALUE G07017 XNX X COPY PNT1,A READ A WORD FROM BUFFER INDEXED BY Y CSK A,Q COMPARE WITH EXPECTED DATA NOP ERROR: WRONG,DATA,TRANSFERED,--,A=ACTUAL;,Q=EXPECTED ADD =1,X CSK X,=6 END OF BUFFER ? NOP JMP G07017 NO, LOOP TO CONTINUE TITL G07019 JMP G07010 PATCH FOR LOOPING ORG  $-1 NOP OVERLAY WITH NOP JMP G07020 SPACE 5 * * DATA * AOT1 AOT DA15;FC0 AOB1  AOB DA15;FC0 * PNT1 WORD 0 WORD 0 WORD 0 WORD 0 WORD 0 WORD 0 PNT2 EQU  $ WPOINT WORD PNT1-1 WLEN WORD PNT1-PNT2 BLEN WORD PNT1-PNT2%1 * LPOOL TITL ****** * * AOT AS INTERRUPT INSTRUCTION * ****** G07020 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE SBIT 8,S  ENABLE INTERRUPTS COPY AOT1,A AOT DA15;FC0 COPY A,:20 STORE AT INTERRUPT LOCATION COPY WPOINT,A WORD POINTER FOR AOT COPY A,:22 COPY =0,X INITIALIZE INDEX COPY =:1111,A DATA FOR BUFFER G07022 XNX X COPY A,PNT1 FILL BUFFER SHIFT A,LO,1 CHANGE DATA ADD =1,X INCREMENT INDEX CSK X,=6 END OF BUFFER ? NOP JMP G07022 NO, LOOP TO CONTINUE COPY =G07025,A EOB INTERRUPT SERVICE ROUTINE LOCATION COPY A,1(Y) STORE AT EOB INTERRUPT LOCATION COPY =0,X INITIALIZE BUFFER INDEX TITL G07023 EQU $ COPY =-1,A NEGATIVE WORD COUNT COPY A,:21 STORE AT INTERRUPT LOCATION COPY =0,A SELP A,DA15;FC3 SET IUR (INTERNAL) STIMULUS NOP RBIT 8,S DISABLE INTERRUPTS ERROR: NO,EOB,INTERRUPT JMP G07029 ERROR EXIT * * EOB INTERRUPT SERVICE ROUTINE * G07025 ENT  IN DA15;FC0,A INPUT DATA FROM HOLDING REGISTER XNX X COPY PNT1,Q GET COMPARISON DATA FROM BUFFER  CSK A,Q NOP ERROR: WRONG,DATA,TRANSFERED,--,A=ACTUAL;,Q=EXPECTED COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE SBIT 8,S ENABLE INTERRUPTS ADD =1,X INCREMENT BUFFER INDEX CSK X,=6 END OF AOT SEQUENCE ? NOP JMP G07023 NO, LOOP TO CONTINUE TITL COPY :21,A FETCH  AOT WORD COUNT TBIT 15,A COPY APX BIT TO OV JT OV,$+2 TEST APX BIT ERROR: APX,BIT,SHOULD,REMAIN,ON RBIT 15,A RESET APX BIT JEQ A,$+2 COUNT SHOULD BE ZERO ERROR: WORD,COUNT,NOT,ZERO,ON,EOB,INTERRUPT COPY :22,A FETCH AOT POINTER CSK A,=PNT1+5 SHOULD POINT TO END OF BLOCK NOP ERROR: TERMINAL,AOT,POINTER,HAS,WRONG,VALUE * G07029 JMP G07020 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP JMP G07030 LPOOL TITL ****** * * AOB AS INTERRUPT INSTRUCTION * ****** G07030 EQU $  COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE SBIT 8,S ENABLE INTERRUPTS COPY AOB1,A AOB DA15;FC0 COPY A,:20 STORE AT INTERRUPT LOCATION COPY =PNT1,A -- FORM SHIFT A,LO,1 -- INITIAL SUB =1,A -- AOB POINTER COPY A,:22 COPY =0,X INITIALIZE BUFFER INDEX COPY PT5555,A DATA FOR BUFFER G07032 XNX X COPY A,PNT1 FILL BUFFER SHIFT A,LO,1 CHANGE DATA ADD =1,X INCREMENT BUFFER INDEX CSK X,=6 END OF BUFFER ? NOP JMP G07032 NO, LOOP TO CONTINUE  COPY =G07035,A EOB INTERRUPT SERVICE ROUTINE LOCATION COPY A,1(Y) STORE AT EOB INTERRUPT LOCATION COPY =0,X INITIALIZE BUFFER INDEX RBIT 0,S INITIALIZE UPPER/LOWER BYTE INDICATOR TITL G07033 COPY =-1,A NEGATIVE BYTE COUNT COPY A,:21 STORE AT INTERRUPT LOCATION COPY =0,A SELP A,DA15;FC3 SET IUR (INTERNAL) STIMULUS NOP RBIT 8,S DISABLE INTERRUPTS ERROR: NO,EOB,INTERRUPT JMP G0703A  ERROR EXIT * * EOB INTERRUPT SERVICE ROUTINE * G07035 ENT IN DA15;FC0,A INPUT DATA FROM HOLDING REGISTER  JT CY,G07037 JMP IF ON LOWER BYTE SHIFT A,LO,8 MOVE DATA TO UPPER BYTE COPY A,K STORE TEMPORARILY SBIT 0,S SET BYTE INDICATOR (LOWER BYTE) JMP G07038 G07037 OR K,A COMBINE THE TWO BYTES FOR FULL WORD XNX X COPY PNT1,Q GET EXPECTED DATA FROM BUFFER CSK A,Q NOP ERROR: WRONG,DATA,TRANSFERED,--,A=ACTUAL;,Q=EXPECTED RBIT 0,S RESET BYTE INDICATOR (UPPER BYTE) ADD =1,X  INCREMENT BUFFER INDEX CSK X,=6 END OF BUFFER ? NOP JMP $+2 NO, CONTINUE JMP G07039 YES, EXIT LOOP G07038 COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE SBIT 8,S ENABLE INTERRUPTS JMP G07033 LOOP TO CONTINUE TITL G07039 EQU $ COPY :21,A FETCH AOB BYTE COUNT TBIT 15,A COPY APX BIT TO OV JT OV,$+2 TEST APX BIT ERROR: APX,BIT,SHOULD,REMAIN,ON RBIT 15,A RESET APX BIT JEQ A,$+2 COUNT SHOULD BE ZERO ERROR: BYTE,COUNT,NOT,ZERO,ON,EOB,INTERRUPT COPY  :22,A FETCH AOB BYTE POINTER COPY =PNT2,Q -- FORM SHIFT Q,LO,1 -- TERMINAL SUB =1,Q -- AOB POINTER CSK A,Q NOP ERROR: WRONG,TERMINAL,AOB,POINTER,--,A=ACTUAL;,Q=EXPECTED * G0703A JMP G070 30 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP TITL ****** * * AIB OPERATION OF APX BIT * ****** G07040 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE SBIT 8,S ENABLE INTERRUPTS COPY AIB2,A AIB DA15;FC0 COPY A,:20 STORE AT INTERRUPT LOCATION COPY  =-1,A BYTE COUNT COPY A,:21 COPY PTFFFF,A BYTE ADDRESS POINTER COPY A,:22 COPY =G07046,A EOB INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(Y) STORE AT EOB INTERRUPT LOCATION (:41) COPY =0,A  SELP A,DA15;FC3 SET IUR STIMULUS NOP RBIT 8,S DISABLE INTERRUPTS ERROR: INTERRUPT,DID,NOT,OCCUR JMP G07049 ERROR EXIT TITL * * INTERRUPT SERVICE ROUTINE * G07046 ENT COPY :21,A TBIT  15,A COPY APX BIT TO OV JF OV,$+2 TEST APX BIT ERROR: APX,BIT,SHOULD,BE,OFF RBIT 15,A TURN OFF APX BIT JEQ A,$+2 TEST BYTE COUNT ERROR: BYTE,COUNT,SHOULD,BE,ZERO,AT,EOB,INT. COPY :22,A JEQ A,$+2 TEST ADDRESS POINTER ERROR: ADDRESS,POINTER,SHOULD,BE,ZERO * G07049 JMP G07040 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP TITL ****** * * AOB OPERATION OF APX BIT * ****** G07050 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE SBIT 8,S ENABLE INTERRUPTS COPY AOB2,A AOB DA15;FC0 COPY A,:20 STORE AT INTERRUPT LOCATION COPY =-1,A BYTE COUNT COPY A,:21 COPY PTFFFF,A BYTE ADDRESS POINTER COPY A,:22 COPY =G07056,A EOB INTERRUPT SERVICE ROUTINE LOCATION COPY A,1(Y) STORE AT EOB INTERRUPT LOCATION COPY =0,A SELP A,DA15;FC3 SET IUR STIMULUS NOP RBIT 8,S DISABLE INTERRUPTS ERROR: INTERRUPT,DID,NOT,OCCUR JMP G07059  ERROR EXIT TITL * * INTERRUPT SERVICE ROUTINE * G07056 ENT COPY :21,A TBIT 15,A COPY APX BIT TO OV JF OV,$+2 TEST APX BIT ERROR: APX,BIT,SHOULD,BE,OFF RBIT 15,A TURN OFF APX BIT  JEQ A,$+2 TEST BYTE COUNT ERROR: BYTE,COUNT,SHOULD,BE,ZERO COPY :22,A JEQ A,$+2 ERROR: ADDRESS,POINTER,SHOULD,BE,ZERO * G07059 JMP G07050 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP JMP G08000 * AIB2 AIB DA15;FC0 AOB2 AOB DA15;FC0 * LPOOL 4 TITL I/O TEST -- NON-INTERRUPTABILITY TESTING ******************************************************* * * NON-INTERRUPTABILITY TESTING * * JST  MEM IFF LSI410;LSI430=1 * JSTE MEM ENDC * JSK MEM IFF LSI410=1 * JSKE MEM  ENDC * PUSH VAL * POP * SBIT 8,S * CBIT 8,S * COPY 8REG,S * XNX 4REG * UIS * * ALL INSTRUCTIONS ARE TESTED FOR BEING * NON-INTERRUPTABLE. THE NON-INTERRUPTABILITY * OF STATUS REGISTER BIT CHANGE INSTRUCTIONS * IS TESTED ONLY WHEN THE INT BIT IS CHANGED. * THE NON-INTERRUPTABILITY TESTING OF XNX * REFER ES TO TESTING THAT XNX DOES NOT ALTER * THE NON-INTERRUPTABILITY OF A NON-INTERRUPTABLE * INSTRUCTION WHICH IT INDEXES. * ******************************************************* TITL ****** * * JST MEM AS NON-INTRUPTABLE INSTRUCTION * ****** G08000 COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY STATSV,A RESTORE STATUS  COPY A,S COPY JST1,A JST *$+1 COPY A,:20 STORE AT INTERRUPT LOCATION COPY =G08007,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,:21 COPY =0,A SIN 2 SELP A,DA15;FC3 SET IUR (INTERNAL) STIMULUS NOP JST G08004 RBIT 8,S ERROR: JST,FAILED,--,DID,NOT,JUMP JMP G08009 ERROR EXIT G08004 ENT COPY =1,A NOP NOP TO ALLOW INTERRUPT RBIT 8,S ERROR: INTERRUPT,DID,NOT,OCCUR JMP G08009 ERROR EXIT G08007 ENT INTERRUPT SERVICE ROUTINE JNE A,$+2 ERROR: JST,IS,INTERRUPTABLE G08009 JMP G08000 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP  IFT LSI410;LSI430=2 FMT A AND =2,A TEST FOR OPTION CARD INSTALLED JEQ A,G08020 JUMP IF NOT INSTALLED ENDC IFF LSI410;LSI430=1 TITL ****** * * JSTE MEM AS NON-INTERRUPTABLE INSTRUCTION * ****** G08010 COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY STATSV,A COPY A,S  INITIALIZE STATUS COPY =G08016,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,:21 STORE AT INTERRUPT LOCATION COPY =0,A SIN 2 SELP A,DA15;FC3 SET IUR STIMULUS NOP JSTE G08014 SHOULD BE NON-INTERRUPTABLE RBIT 8,S ERROR: JSTE,FAILED,--,DID,NOT,JUMP JMP G08019 ERROR EXIT G08014 ENT COPY =1,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP TO ALLOW INTERRUPT RBIT 8,S ERROR: NO,INTERRUPT,RECIEVED JMP G08019 ERROR EXIT G08016 ENT INTERRUPT SERVICE ROUTINE JNE A,$+2 ERROR: JSTE,IS,INTERRUPTABLE G08019 JMP G08010 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP ENDC JMP G08020 * * LPOOL TITL ****** * * JSK MEM AS NON-INTERRUPTABLE INSTRUCTION * ****** G08020 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY STATSV,A  COPY A,S INITIALIZE STATUS COPY =G08026,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,:21 STORE AT INTERRUPT LOCATION COPY =:9C,X STACK TRAP LOCATION COPY =G08028,A TRAP SERVICE ROUTINE ADDRESS COPY A,3(X) STORE IN 4TH WORD OF TRAP COPY =STAKL,A STACK LIMIT COPY A,L LOAD L REGISTER COPY  =STAKK,A STACK POINTER COPY A,K LOAD K REGISTER COPY =0,A SIN 2 SELP A,DA15;FC3 SET IUR STIMULUS NOP JSK G08024 SHOULD BE NON-INTERRUPTABLE RBIT 8,S ERROR: NO,JSK JMP  G08029 ERROR EXIT G08024 EQU $ COPY =1,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP  TO ALLOW INTERRUPT RBIT 8,S ERROR: INTERRUPT,DID,NOT,OCCUR JMP G08029 ERROR EXIT TITL G08026 ENT INTERRUPT SERVICE ROUTINE JNE A,$+2 ERROR: JSK,IS,INTERRUPTABLE JMP G08029 EXIT G08028 EQU $ STACK TRAP SERVICE ROUTINE SIN 1 RBIT 8,S DISABLE INTERRUPTS ERROR: UNEXPECTED,STACK,OVERFLOW,TRAP G08029 JMP G08020 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP IFT LSI410=2 FMT A AND =2,A TEST FOR OPTION CARD INSTALLED JEQ A,G08040 ENDC IFF LSI410=1 TITL ****** * * JSKE MEM AS NON-INTERRUPTABLE INSTRUCTION * ****** G08030 EQU $  COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY STATSV,A COPY A,S INITIALIZE STATUS COPY =G08036,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,:21 STORE AT INTERRUPT LOCATION COPY =G08038,A STACK TRAP SERVICE ROUTINE ADDRESS COPY A,3(X) STORE IN 4TH WORD OF TRAP (:9F) COPY =STAKL,A STACK LIMIT COPY A,L INITIALIZE L REGISTER COPY =STAKK,A STACK POINTER COPY A,K INITIALIZE K REGISTER COPY =0,A SIN 2 SELP A,DA15;FC3 SET IUR STIMULUS NOP JSKE G08034 SHOULD BE NON-INTERRUPTABLE RBIT 8,S DISABLE INTERRUPTS ERROR: JSKE,FAILED,--,DID,NOT,JUMP JMP G08039  ERROR EXIT G08034 EQU $ COPY =1,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP TO ALLOW INTERRUPT RBIT 8,S ERROR: INTERRUPT,DID,NOT,OCCUR JMP G08039 ERROR EXIT TITL G08036 ENT  INTERRUPT SERVICE ROUTINE JNE A,$+2 ERROR: JSKE,IS,INTERRUPTABLE JMP G08039 EXIT G08038 EQU $ STACK TRAP SERVICE ROUTINE SIN 1 RBIT 8,S DISABLE INTERRUPTS ERROR: UNEXPECTED,STACK,OVERFLOW TRAP G08039 JMP G08030 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP ENDC JMP G08040 SPACE 4 * * DATA * STAK RES 13,0 STAKL EQU STAK STAK1 EQU STAK+7 STAKK EQU  STAK+8 STAKX EQU STAK+13 * LPOOL TITL ****** * * PUSH VAL AS NON-INTERRUPTABLE INSTRUCTION * ****** G08040 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY STATSV,A COPY A,S  INITIALIZE STATUS COPY =G08046,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,:21 STORE AT INTERRUPT LOCATION COPY =G08048,A STACK TRAP SERVICE ROUTINE ADDRESS COPY A,3(X) STORE IN 4TH WORD OF TRAP (:9F) COPY =STAKL,A STACK LIMIT COPY A,L INITIALIZE L REGISTER COPY =STAKX,A STACK POINTER COPY A,K INITIALIZE K REGISTER COPY =0,A SIN 2 SELP A,DA15;FC3 SET IUR STIMULUS NOP PUSH 0 SHOULD BE NON-INTERRUPTABLE COPY =1,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP TO ALLOW INTERRUPT RBIT 8,S DISABLE INTERRUPTS ERROR: INTERRUPT,DID,NOT,OCCUR JMP G08049 E RROR EXIT G08046 ENT INTERRUPT SERVICE ROUTINE JNE A,$+2 ERROR: PUSH,IS,INTERRUPTABLE JMP  G08049 TITL G08048 EQU $ STACK OVERFLOW TRAP ROUTINE SIN 1 RBIT 8,S ERROR: UNEXPECTED,STACK,OVERFLOW,TRAP * G08049 JMP G08040 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP * COPY =SET1,A UNEXPECTED STACK TRAP ROUTINE ADDR. COPY A,3(X) STORE IN 4TH WORD OF TRAP TITL ****** * *  POP AS NON-INTERRUPT INSTRUCTION * ****** G08050 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY STATSV,A COPY A,S INITIALIZE STATUS COPY =G08056,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,:21 STORE AT INTERRUPT LOCATION COPY =STAKL,A STACK LIMIT COPY A,L INITIALIZE L REGISTER COPY =STAK1,A STACK POINTER COPY A,K INITIALIZE K REGISTER COPY STATSV,A INITIALIZE STACK COPY A,STAK1+1 COPY =0,A COPY A,STAK1+2 * SIN 2 SELP A,DA15;FC3 SET IUR STIMULUS NOP POP SHOULD BE NON-INTERRUPTABLE COPY =1,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP TO ALLOW INTERRUPT RBIT 8,S DISABLE INTERRUPTS ERROR: INTERRUPT,DID,NOT,OCCUR JMP G08059 ERROR EXIT TITL G08056 ENT INTERRUPT SERVICE ROUTINE JNE A,$+2 ERROR: POP,WAS,INTERRUPTED * G08059 JMP G08050 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP JMP G08060 * LPOOL 6 TITL ****** * * SBIT 8,S AS NON-INTERRUPTABLE INSTRUCTION * ****** G08060 EQU  $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY A,S INITIALIZE STATUS COPY =G08066,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,:21 STORE AT INTERRUPT LOCATION COPY =0,A SELP A,DA15;FC3 SET IUR STIMULUS NOP SBIT 8,S SHOULD BE NON-INTERRUPTABLE COPY =1,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP TO ALLOW INTERRUPT RBIT 8,S DISABLE INTERRUPTS ERROR: INTERRUPT,DID,NOT,OCCUR JMP G08069 ERROR EXIT G08066 ENT INTERRUPT SERVICE ROUTINE JNE A,$+2  ERROR: SBIT,IN,S,IS,INTERRUPTABLE G08069 JMP G08060 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP TITL ****** * * CBIT 8,S AS NON-INTERRUPTABLE INSTRUCTION * ****** G08070 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY A,S INITIALIZE STATUS COPY =G08076,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,:21 STORE AT INTERRUPT LOCATION COPY =0,A SELP A,DA15;FC3 SET IUR STIMULUS NOP CBIT 8,S SHOULD BE NON-INTERRUPTABLE COPY =1,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP TO ALLOW INTERRUPT RBIT 8,S ERROR: INTERRUPT DID,NOT,OCCUR JMP G08079 G08076 ENT INTERRUPT SERVICE ROUTINE JNE A,$+2 ERROR: CBIT,IN,S,IS,INTERRUPTABLE G08079 JMP   G08070 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP TITL ****** * * COPY A,S  AS NON-INTERRUPTABLE INSTRUCTION * ****** G08080 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY A,S INITIALIZE STATUS COPY =G08086,A INTERRUPT SERVICE ROUTINE COPY A,:21 STORE AT INTERRUPT LOCATION COPY =0,A SELP A,DA15;FC3 SET IUR STIMULUS NOP COPY STATSV,A COPY A,S SHOULD BE NON-INTERRUPTABLE COPY =0,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP TO ALLOW INTERRUPT RBIT 8,S DISABLE INTERRUPTS ERROR: INTERRUPT,DID,NOT,OCCUR JMP G08089 ERROR EXIT G08086 ENT INTERRUPT SERVICE ROUTINE JEQ A,$+2 ERROR: COPY,TO,S,IS,INTERRUPTABLE G08089 JMP  G08080 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP TITL ****** * * XNX 4REG  AS NON-INTERRUPTABLE INSTRUCTION * ****** G08090 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY A,S INITIALIZE STATUS COPY =G08096,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,:21 COPY =0,A SELP A,DA15;FC3 SET IUR STIMULUS SBIT 8,S ENABLE INTERRUPTS XNX A JST G08094 SHOULD BE NON-INTERRUPTABLE RBIT 8,S ERROR: JST,FAILED,--,DID,NOT,JUMP JMP G08099 ERROR EXIT G08094 ENT COPY =1,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP TO ALLOW INTERRUPT RBIT 8,S ERROR: INTERRUPT,DID,NOT,OCCUR JMP G08099 ERROR EXIT G08096 ENT INTERRUPT SERVICE ROUTINE  JNE A,$+2 ERROR: JST,AFTER,XNX,IS,INTERRUPTABLE G08099 JMP G08090 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP TITL ****** * * UIS AS NON-INTERRUPTABLE INSTRUCTION * ****** G080A0 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY A,S INITIALIZE STATUS COPY =G080A6,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,:21 COPY =0,A SELP A,DA15;FC3 SET IUR STIMULUS  SBIT 8,S ENABLE INTERRUPTS UIS SHOULD BE NON-INTERRUPTABLE COPY =1,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP TO ALLOW INTERRUPT RBIT 8,S ERROR: INTERRUPT,DID,NOT,OCCUR JMP G080A9 ERROR EXIT G080A6 ENT INTERRUPT SERVICE ROUTINE JNE A,$+2 ERROR: UIS,IS,INTERRUPTABLE G080A9 JMP G080A0 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP JMP  G09000 LPOOL TITL I/O TEST -- DMA TESTING ************************************************************ * *  DMA TEST * * IN THIS TEST, THE I/O TEST MODULE SIMULATES * A DMA CONTROLLER. FOUR INDIVIDUAL TESTS ARE * PERFORMED: * (1) A READ TEST WITH A 1 WORD TRANSFER * (2) A WRITE TEST WITH A 1 WORD TRANSFER * (3) A WRITE TEST WITH A 10 WORD TRANSFER * (3) A WRITE TEST WITH A 10 WORD TRANSFER * AND SIMULTANEOUS  INTERRUPT SERVICING * AFTER EACH INDIVIDUAL TEST, THREE ERROR INDICATORS * ARE CHECKED. AN ERROR HALT WILL OCCUR IF : * (1) THE I/O MODULE DID NOT RECIEVE A * STOP ACKNOWLEDGE SIGNAL (SACK) * FROM THE PROCESSOR WITHIN 10 MICRO- * SECONDS OF ISSUING A STOP SIGNAL (STOP). * (2) THE I/O MODULE DID NOT RECIEVE A * MEMORY ACKNOWLEDGE SIGNAL (MACK) FROM * MEMORY WITHIN 10 MICROSECONDS OF ISSUING *  A MEMORY START (MST). * (3) THE DMA PRIORITY IN LINE (PRIN) TO THE * TO THE I/O MODULE IS IN THE LOW STATE * * IN ADDITION, ALL DATA TRANSFERED IS CHECKED * ************************************************************ TITL ****** * * DMA WORD READ MODE * ****** G09000 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY STATSV,A COPY A,S INITIALIZE STATUS COPY =:62,X COPY =G09005,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(X) STORE AT DMA INTERRUPT LOCATION COPY =0,A OUT A,DA15;FC0 CLEAR HOLDING REGISTER COPY =5,A OUT A,DA0C;FC2 SET WORD-READ MODE COPY =PT55AA,Y OUT  Y,DA0C;FC1 SET DMA MEMORY ADDRESS COPY =0,A SELP A,DA0C;FC2 START DMA TRANSFER NOP ERROR: DMA,FAILURE,--,DID,NOT,GET,END-OF-DMA,INT. JMP G09009 ERROR EXIT TITL * * INTERRUPT SERVICE ROUTINE * G09005 ENT IN DA0C;FC2,A GET DMA STATUS WORD AND =7,A JEQ A,$+2 ERROR: DMA,FAILED,--,A,=,DMA,ERROR,STATUS,AS,FOLLOWS * BIT 0 = NO SACK 10 USEC AFTER STOP * BIT 1 = NO MACK 10 USEC AFTER MST * BIT 2 = NO DMA PRIORITY IN * IN DA15;FC0,A INPUT DATA TRANSFERED CSK A,PT55AA COMPARE WITH :AA55 NOP ERROR: DMA,FAILED,--,WRONG,DATA,TRANSFERED *  A=ACTUAL DATA; Y=MEMORY,ADDR. * G09009 JMP G09000 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP TITL ****** * * DMA WORD WRITE MODE * * THIS TEST WRITES ONE WORD FROM * THE I/O TEST MODULE TO MEMORY * ****** G09010 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE SBIT 8,S ENABLE INTERRUPTS COPY =G09015,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(X) STORE AT DMA INTERRUPT LOCATION (:63) COPY PTAA55,A DATA FOR DMA TRANSFER OUT A,DA15;FC0 STORE IN I/O MODULE HOLDING REGISTER COPY =1,A OUT A,DA0C;FC2 SET DMA WORD-WRITE MODE COPY =DMABUF,Y ADDRESS OF DMA BUFFER OUT Y,DA0C;FC1 SET DMA MEMORY ADDRESS COPY =0,A COPY A,DMABUF CLEAR DMA BUFFER SELP A,DA0C;FC2 START DMA TRANSFER  NOP ERROR: DMA,FAILURE,--,DID,NOT,GET,END-OF-DMA,INT. JMP G09019 ERROR EXIT TITL * * INTERRUPT SERVICE ROUTINE * G09015 ENT IN DA0C;FC2,A GET DMA STATUS WORD AND =7,A MASK OFF UNWANTED BITS  JEQ A,$+2 ERROR: DMA,FAILED,--,A,=,DMA,ERROR,STATUS,AS,FOLLOWS * BIT 0 = NO SACK 1 0 USEC AFTER STOP * BIT 1 = NO MACK 10 USEC AFTER MST * BIT 2 = NO DMA PRIORITY IN * COPY 0(Y),A GET DATA TRANSFERED CSK A,PTAA55 COMPARE WITH :AA55 NOP ERROR: DMA,FAILED,--,WRONG,DATA,TRANSFERED * A=ACTUAL DATA; Y=MEMORY ADDRESS * G09019 JMP G09010  PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP JMP G09020 TITL DMABUF WORD 0 DMA BUFFER WORD 0 WORD 0 WORD 0 WORD 0 WORD 0 WORD 0 WORD  0 WORD 0 WORD 0 * LPOOL TITL ****** * * DMA RIPPLE MODE WRITE * * THIS TEST WRITES 10 WORDS IN A CIRCULATING PATTERN * INTO MEMORY, ONE WORD BETWEEN EACH MICROCYCLE. * ****** G09020 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY =G09025,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(X) STORE AT DMA INTERRUPT LOCATION (:63) SBIT 8,S ENABLE INTERRUPTS COPY =:AA66,A DATA FOR DMA TRANSFER OUT A,DA15;FC0 STORE IN I/O MODULE HOLDING REGISTER COPY =2,A OUT A,DA0C;FC2 SET DMA RIPPLE-WRITE MODE COPY =DMABUF,A ADDRESS OF DMA BUFFER OUT A,DA0C;FC1 SET DMA MEMORY ADDRESS COPY =0,A --  COPY =9,Q -- CLEAR G09023 XNX Q -- DMA COPY A,DMABUF -- BUFFER JNED Q,G09023 --  SELP A,DA0C;FC2 START DMA TRANSFER IJNE A,$ TIME-OUT LOOP ERROR: DMA,FAILURE,--,DID,NOT,GET,END-OF-DMA,INT. JMP G09029 ERROR EXIT TITL * * INTERRUPT SERVICE ROUTINE * G09025 ENT IN DA0C;FC2,A GET DMA STATUS WORD AND =7,A MASK OFF UNWANTED BITS JEQ A,$+2 ERROR: DMA,FAILED,--,DMA,ERROR,STATUS,AS,FOLLOWS * BIT 0 = NO SACK 10 USEC AFTER STOP * BIT 1 = NO MACK 10 USEC AFTER MST * BIT 2 = NO DMA PRIORITY IN * COPY =:AA66,A COMPARISON DATA COPY =DMABUF,Y INITIALIZE INDEX G09027 EQU $ CSK A,0(Y) CHECK A WORD OF THE BUFFER NOP ERROR: DMA,FAILED,--,WRONG,DATA,TRANSFERED * A = EXPECTED DATA * Y = MEMORY LOCATION ROTATE A,L,15 SIMULATE ROTATE A,R,1 ADD =1,Y INCREMENT INDEX COPY Y,Q CSK  Q,=DMABUF+9 END OF BUFFER ? JMP G09027 NO, LOOP JMP $+2 YES, EXIT JMP G09027 NO, LOOP * G09029 JMP G09020 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP TITL ****** * *  DMA RIPPLE MOD WRITE WITH INTERRUPT * * THIS TEST WRITES 10 WORDS IN A CIRCULATING PATTERN * INTO MEMORY, ONE WORD BETWEEN EACH MICROCYCLE, * WHILE AN INTERRUPT IS BEING SERVICED * ****** G09030 EQU $ COPY =0,A SELP  A,DA0B;FC6 INITIALIZE I/O MODULE SBIT 8,S ENABLE INTERRUPTS COPY =G09034,A INTERRUPT SERVICE ROUTINE LOCATION COPY A,:21 STORE AT INTERRUPT LOCATION COPY =G09036,A DMA INTERRUPT SERVICE ROUTINE LOCATION   COPY A,1(X) STORE AT DMA INTERRUPT LOCATION (:63) COPY =:00FF,A DATA FOR DMA DATA TRANSFER OUT A,DA15;FC0 STORE IN HOLDING REGISTER COPY =2,A OUT A,DA0C;FC2 SET DMA RIPPLE-WRITE MODE COPY =DMABUF,A ADDRESS OF DMA BUFFER OUT A,DA0C;FC1 SET DMA MEMORY ADDRESS COPY =0,A -- COPY =9,Q -- CLEAR G09033 XNX Q -- DMA COPY A,DMABUF -- BUFFER JNED Q,G09033 -- SIN 2 SELP A,DA15;FC3 SET IUR STIMULUS SELP A,DA0C;FC2 START DMA TRANSFER COPY A,DMABUF CLEAR FIRST WORD OF DMA BUFFER (AFTER DMA START) RBIT 8,S ERROR: INTERRUPT,AND/OR,DMA,TRANSFER,DID,NOT,OCCUR JMP G09039 ERROR EXIT TITL * * INTERRUPT SERVICE ROUTINE * G09034 ENT SELP A,DA15;FC0 RESET IUR STIMULUS SBIT 8,S ENABLE INTERRUPTS IJNE A,$ INCREMENT A AND WAIT FOR END-OF-DMA INTERRUPT ERROR: DMA,TRANSFER,DID,NOT,OCCUR JMP G09039 ERROR EXIT * * DMA INTERRUPT SERVICE ROUTINE * G09036 ENT JNE A,$+2 ERROR: DMA,FAILURE,--,INTERRUPT,WAS,NOT,ALLOWED IN DA0C;FC2,A GET DMA STATUS WORD AND =7,A MASK OFF UNWANTED BITS JEQ A,$+2 ERROR: DMA,FAILURE,--,DMA,ERROR,STATUS,AS,FOLLOWS * BIT 0 = NO SACK 10 USEC AFTER STOP * BIT 1 = NO MACK 10 USEC AFTER MST * BIT 2= NO DMA PRIORITY IN * COPY =DMABUF,Y INITIALIZE INDEX COPY =0,A CSK A,0(Y) CHECK 1ST WORD OF BUFFER  NOP ERROR: DMA,STARTED,AFTER,INTERRUPT COPY =:00FF,A COMPARISON DATA G09037 EQU $ ROTATE A,L,15  SIMULATE ROTATE A,R,1 ADD =1,Y INCREMENT BUFFER INDEX CSK A,0(Y) CHECK A WORD OF THE BUFFER NOP ERROR: DMA,FAILED,--,WRONG,DATA,TRANSFERED * A = EXPECTED DATA *  Y = MEMORY LOCATION * COPY Y,Q CSK Q,=DMABUF+9 END OF BUFFER ? JMP G09037 NO, LOOP NOP YES, EXIT * G09039 JMP G09030 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP  JMP G0A000 LPOOL 6 TITL I/O TEST -- POWER-FAIL TESTING ******************************************************* * * POWER FAIL TESTING * * THE PURPOSE OF THIS TEST IS TO VERIFY THAT THE * POWER FAIL RESTART CAPABILITY WORKS PROPERLY, * I.E. THAT THE POWER UP AND POWER DOWN TRAPS * ARE EXECUTED, AND THAT PROGRAM EXECUTION RESUMES *  PROPERLY. ALSO, SIN IS TESTED FOR THE ABILITY TO * INHIBIT THE POWER DOWN TRAP * ******************************************************* TITL ****** * * POWER FAIL TESTING * ****** G0A000 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY A,S INITIALIZE STATUS SIN 7 PROTECT AGAINST POWER-FAIL  COPY =:80,X COPY SIN1,A SIN 1 INSTRUCTION COPY A,:E(X) STORE AT POWER-DOWN VECTOR (:8E) COPY  IMS3,A IMS TEMP01 INSTRUCTION COPY A,:F(X) STORE AT :8F COPY HLT1,A HLT INSTRUCTION COPY  A,:10(X) STORE AT :90 COPY =G0A003,A POWER-UP SERVICE LOCATION COPY A,1(X) STORE AT POWER-UP VECTOR (:81)  COPY =0,A COPY A,TEMP01 SELP A,DA0A;FC0 EXECUTE A POWER FAIL JMP $ WAIT FOR POWER FAIL * G0A003 ENT COPY TEMP01,A JNE A,$+2 ERROR: POWER-DOWN,ROUTINE,DID,NOT,EXECUTE TITL COPY =:80,X COPY =G0A005,A POWER-UP SERVICE LOCATION COPY A,1(X) STORE AT :81 COPY =0,A  COPY A,TEMP01 SIN 4 SELP A,DA0A;FC0 EXECUTE A POWER FAIL NOP IMS TEMP01 SHOULD EXECUTE BEFORE POWER FAIL JMP $ WAIT FOR POWER FAIL * G0A005 ENT COPY TEMP01,A CSK A,=2 NOP ERROR: SIN,DID,NOT,INHIBIT,POWER,FAIL COPY =:80,X SIN 5 COPY =PUPRTN,A ADDRESS OF POWER-UP ROUTINE COPY A,1(X) STORE AT POWER-UP VECTOR (:81) COPY JST1,A JST *$+1 INSTRUCTION COPY A,:E(X) STORE AT POWER-DOWN VECTOR (:8E) COPY =PDWN,A ADDRESS OF POWER-DOWN ROUTINE COPY A,:F(X) STORE AT :8F * JMP G0A000 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP * IMS DELAY2 INITIATE DELAY JMP $-1 JMP G90000 TITL * * * SIN1 SIN 1 IMS3 IMS TEMP01 DELAY2 RES 1,0 DELAY CELL LPOOL IFT LSI490=1 RES $;:1F-$&:1F+1,0 ENDC IFF LSI490=1 RES $;:FF-$&:FF+1,0 ENDC G90000 EQU $ PART3ST SET $ END VECTOR (:8E) COPY =PDWN,A ADDRESS OF POWER-DOWN ROUTINE COPY A,:F(X) STORE AT :8F * JMP G0A000 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP * IMS DELAY2 INITIATEIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII! IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIe830220141259830220141259830220141923e@830220141259830220141259830220141922" e830220141259830220141259830220141259e830220141259830220141259830220141259830220141259830220141259830220141259ew830104084247 830104084322 830220141839e(O830104084405 830104084414 830220141851eFJ830104084415 830104084416 830220141854 eG# 830104084417 830104084418 830220141858 eI *830104084420 830104084423 830220141903$ % & ' ( ) * + . PAT412P2 ASMPAT4 MACPAT412 JCL PAT412 MAP DEBUGS OBJ,  TITL PAT4 FLT. POINT , LISTS INST. SET (93802-15A1) TITL MACRO TABLE OF CONTENTS * **** ENDMOD: --END OF TEST OR SECTION * **** ERROR: --ERROR INDICATION TO USER * **** GLPOL: --GENERATE LPOOL * **** INIT: --INITIALIZE CELLS USED BY TESTS * **** LDREG: --LOAD REGISTERS * **** PATCH: --LOOPING PATCH MACRO * **** TRLD: --LOAD AND TEST REGISTERS * **** START --INITIALIZATION FOR FLT. PT. TERST * **** START2 --INITIALIZATION FOR LISTS INST. TEST * **** START3 __INITIALIZATION FOR CHAR. NUMERIC TEST * **** PATCHX --LOOPING PATCH * **** ENDMD3 --END OF CHAR. NUMERIC TEST * **** TM2M: --4 MEMORY LOCATION TEST * **** TMEM: --4MEMORY SPECIFIED VALUE TEST * **** INSTR: --PASS PARAMETER AS AN INSTRUCTION CODE * **** XSHIFT -- SHIFT AQ,RO,X INMSTRUCTION EMULATION * **** XSUBC -- SUBC INSTRUCTION EMULATION * **** FLTEST -- FLOATING POINT TEST MACRO * BREAK EQU 1 TITL MACRO DEFINITIONS ****** * E R R O R M A C R O * * THIS MACRO IS USED TO INDICATE AN ERROR ****** XMACRO ERROR: HLT #1 #2 #3 #4 #5 #6 #7 #8 #9 #10 #11 #12 SPACE  BREAK ENDM * ****** * I N I T I A L I Z E M A C R O * * THIS MACRO SETS THE PROGRAM TEST COUNTER * (PCOUNT) TO ZERO SO THAT AT THE END OF * THE TEST OR SECTION 'PCOUNT' CAN BE * COMPARED WITH AN EXPECTED VALUE TO * DETERMINE IF ALL PARTS OF THE TEST WERE * EXERCISED. ****** XMACRO INIT: C:: SET 0 SETCNT SET 0 COPY  =0,A CLEAR COPY A,PCOUNT PCOUNT ENDM ****** * * S T A R T 2 M A C R O * * THIS MACRO PERFORMS THE INITIALIZATION FOR * THE LISTS SECTIONS * * #1 = LABEL TO APPEAR ON LINK MAP * ****** XMACRO START2  IFT LSI430 TITL PAT430 LISTS INSTR. SET 84-93802-13B000 ENDC IFT LSI490 TITL PAT490 FLT. POINT & LISTS INST. SET (84-93802-15B000) ENDC #1 EQU $ COPY DEMAND,A FETCH TEST SELECTION JEQ A,$+4 CSK A,=7 IS TEST #7 SELECTED? NOP JMP LISTX EXIT TEST COPY =-32,A COPY A,IDPCNT SET UP LOOP COUNTER INIT: COPY =7,A LISTS RUN INDICATOR SELP A,4 OUTPUT TO CONSOLE DATA REGISTER ENDM * * * ****** * L O O P P A T C H M A C R O * * THIS MACRO IS USED TO GENERATE A PATCH * INSTRUCTION ON THE PROGRAM LISTING TO * SHOW A USER THE BINARY VALUE TO PLACE AT * THE LOCATION INDICATED ON THE LISTING. THE * PATCH VALUE IS DISPLAYED ON THE LISTING * BUT IS OVERLAYED WITH A NOP INSTRUCTION * SO THAT DURING EXECUTION A NOP WILL BE * EXECUTED (NOT THE JUMP INSTRUCTION THAT * IS DISPLAYED ON THE LISTING). THIS MACRO * WILL INCREMENT THE PROGRAM TEST COUNTER * CELL ONCE EACH TIME IT IS USED. A SET * DIRECTIVE WILL BE USED TO INCREMENT * A VALUE WHICH WILL BE USED TO ESTABLISH * A COMPARISON VALUE. * * A SAMPLE CALL FOLLOWS: * * PATCH: LABEL NAME OF LOOP POINT ****** XMACRO PATCH: JMP #1 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH 'NOP'  SPACE BREAK C:: SET 1%SETCNT;C:: COPY PCOUNT,A CHECK FOR ALL SECTIONS CBIT SETCNT,A IFF -  SETCNT=15 COPY A,PCOUNT ENDC CSK A,=C:: DONE SO FAR NOP ERROR: SOME,OF,TEST,NOT,EXECUTED BRANCH TO ERROR0 SPACE BREAK SETCNT SET SETCNT+1 IFT SETCNT=16 INIT: ELSE, REINITIALIZE SECTION FLAGS ENDC AND COUNTERS. SPACE BREAK GLPOL: ENDM ****** * * P A T C H X M A C R O * ****** XMACRO PATCHX JMP #1 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP IMS PCOUNT ENDM * ****** * E N D O F T E S T M A C R O ****** XMACRO ENDMOD * * END OF TEST MODULE * IMS IDPCNT INCREMENT LOOP COUNTER JMP #1+7 LOOP TO CONTINUE JMP LISTX  LPOOL RES $;:FF-$&:FF+1,0 LISTX EQU $ EXIT TEST ENDM * * * ****** * T E S T L O A D R E G M A C R O * * THIS MACRO COPIES THE REGISTER SPECIFIED * BY PARAMETER #1 TO THE REGISTER SPECIFIED * BY PARAMETER #3. IT THEN CHECKS THAT * THE VALUE MOVED TO THE REGISTER SPECIFIED * BY PARAMETER #3 CONTAINS THE EXPECTED * VALUE BY MOVING THAT VALUE TO EITHER A OR Q * THEN COMPARING IT TO THE VALUE SPECIFIED * BY PARAMETER #4 (MUST BE LABEL-CANNOT BE * A VALUE). * * A SAMPLE CALL FORMAT FOLLOWS: * * TRLD: REG,A OR Q,REG,LABEL NAME OF VALUE * * PARAMETER #2 MUST BE EITHER A OR Q * PARAMETERS #1 AND #3 CAN BE ANY * REGISTER. VALUE MUST BE A BINARY * NUMBER (0-:FFFF) ****** XMACRO  TRLD: SPACE BREAK * TRLD: #1,#2,#3,#4 COPY #1,#3 COPY #3,#2 CSK #2,#4 TEST THAT #3 = EXPECTED VALUE NOP ERROR: COPY,-#1-,TO,-#3-,FAILED COPY =0,#2 CLEAR -#2- ENDM ****** * G E N E R A T E L P O O L M A C R O * * THIS MACRO EXECUTES A JUMP AROUND AN LPOOL. * * SAMPLE CALL: * * GLPOL: ****** XMACRO GLPOL: LP::L SET $ SET UP LABEL TO REPLACE NOP WITH JMP INST. NOP RESERVE SPACE FOR JMP INSTRUCTION LPOOL LP::L1 SET $ SET UP LABEL AT END OF LPOOL ORG LP::L GO BACK TO OVERLAY NOP WITH JMP INST. JMP LP::L1 JUMP TO LABEL AT END OF LPOOL ORG LP::L1 CONTINUE AT END OF LPOOL  ENDM * * * THESE MACROS WILL EMULTAE MACHINE DOPERATIONS THAT ARE * OPTIONAL ON THE 410 BASIC. ON 430 AND 490 MODELS * THEY ARE STANDARD. * * 1ST INSTRUCTION EMULATED * * SHIFT AQ,RO,X WHERE 0=2 COPY A,ATEMP SAVE THE ORIGINAL CONTENTS OF THE A REGISTER COPY #1,A CSK A,#2 CHECK #1 = #2 NOP ERROR: -#1,SHOULD,=,#2 IFT #?>=4 COPY #3,A CSK A,#4 CHECK #3 = #4 NOP ERROR: -#3-,SHOULD,=,#4 ENDC IFT #?>=6 COPY #5,A  CSK A,#6 CHECK #5 = #6 NOP ERROR: -#5-,SHOULD,=,#6 ENDC IFT #?>=8 COPY #7,A CSK A,#8 CHECK #7 = #8 NOP ERROR: -#7-,SHOULD,=,#8 ENDC COPY ATEMP,A RESTORE A TO ORIGINAL CONTENTS. ENDC ENDM ************************************************************************ * * * TMEM: MACRO  * * THIS MACRO WILL TEST FOUR MEMORY LOCATIONS FOR THEIR * * SPECIFIED VALUES. IT HALTS WHEN AN INEQUALITY IS FOUND * * CALLING THE ERROR: MACRO. * *  * * EXAMPLE OF A CALL IS: TMEM: MEM1,VAL1,MEM2,VAL2,,,,  * * UP TO FOUR MEMORY LOCATIONS CAN BE SPECIFIED EACH WITH * * AN ASSOCIATED VALUE. THE A REG IS USED FOR THE COMPARE * * AND RESTORED TO ORIGINAL VALUE ON EXIT FROM ROUTINE. * *  * ************************************************************************ XMACR/ O TMEM: COPY A,ATEMP SAVE A REG IFT #?>=2 AT LEAST 2 PARAM. COPY #1,A CSK A,=#2 TEST MEM1 NOP ERROR: -#1-,SHOULD,BE,=#2 IFT #?>=4 AT LEAST 4 PARAM. COPY #3,A  CSK A,=#4 TEST MEM2 NOP ERROR: -#3-,SHOULD,BE,=#4 ENDC IFT #?>=6 AT LEAST 6 PARAM. COPY #5,A CSK A,=#6 TEST MEM3 NOP ERROR: -#5-,SHOULD,BE,=#6 ENDC IFT #?>=8 AT LEAST 8 PARAM. COPY #7,A CSK A,=#8 TEST MEM4 NOP ERROR: -#7-,SHOULD,BE,=#8 ENDC ENDC COPY ATEMP,A RESTORE A REG VALUE. ENDM ************************************************************************ * THIS MACRO ACCEPTS AS PARAMETERS AN INSTRUCTION CODE, AND UP TO * * 3 ADDRESSES. EITHER WITH OR W/OUT INDIRECTIN. IT BUILDS * * THE BINARY MULTI-WORD INSTRUCTION FOR THAT INSTRUCTION. THE * * BINARY IS LEFT AT THE END OF THE MACRO FOR EXECUTION. * *  * * EXAMPLE CALL: * * INSTR: HEX-CD,M41,ADDR1,M42,ADDR2,M43,ADDR3 * * WHERE:  * * HEX-CD = THE ACTUAL HEX-CODE FOR THEINSTRUCTION. * * M4N = THE M4 FIELD OF THE NTH ADDRESS  * * ADDRN = THE NTH ADDRESS NECESSARY FOR THIS INSTRUCTION. * * EXAMPLE ACTUAL CALL:  * * INSTR: :7C05,:7,PTRSDB,:0,SDBY * * ASSEMPLY: * * :7C05 * * :7;PTRSDB * * :0;SDBY  * * WHERE: * * :7C05 = CMPC  * * :7;PTRSDB = M4 FOR ABSOLUTE INDIRECT ORED WITH ADDRESS. * * :0;SDBY = M4 FOR ABSOLUTE DIRECT ORED WITH ADDRESS. * ************************************************************************ XMACRO INSTR: * INSTR: #1,#2,#3,#4,#5,#6,#7 IFT #?>7 TOO MANY PARAMETERS DON'T MAKE SENSE. NOTE W,'TOO MANY PARAMETERS EXTRAS SKIPPED.' ENDC IFT #?<=4 TOO FEW PARAMETERS DON'T MAKE SENSE. NOTE W,'TOO FEW PARAMETERS, NO ASSEMBLY TAKES PLACE.' ENDC IFT #?>=5 NUMBER OF PARAMETERS IS OK SO FAR.  IFT #?<=7 FINAL CHECK FOR CORRECT # OF PARAMETERS. !INS DATA #1 HEX CODE FOR INSTRUCTION. IFT #2<=:F CHECK FOR CORRECT VALUE OF MODE INSTRUCTION. !M41 DATA #2%12;#3;:100 M4 W/ADDRESS FOR #3 ENDC IFF #2<=:F M4 TOO LARGE. NOTE W,'#2 SHOULD BE <=:F' ENDC IFT #4<=:F !M42 DATA #4%12;#5;:100 M4 W/ADDRESS FOR #5 ENDC IFT #?>4 CHECK FOR ERROR IN THE NUMBER OF PARAMETERS. IFT :F<#4 NOTE 0 W,'#4 SHOULD BE LESS THAN OR = :F' ENDC IFT #?>5 SEE IF LAST ADDRESS IS THERE. IFT #6<=:F !M43  DATA #6%12;#7;:100 M4 W/ADDRESS FOR #7 ENDC IFT :F<#6 #6 IS TOO LARGE A NUMBER. NOTE W,'#6 SHOULD BE LESS THAN OR = :F' ENDC ENDC ENDC ENDC ENDC ENDM TITL * #(1),#(2) = AQ REGISTER PAIR * #(3) = OPERATION * #(4),#(5) = OPERAND * #(6) = STATUS * OK = NORMAL * OV = OVERFLOW * UF = UNDERFLOW * DP = DOUBLE PRECISION RESULT (FIX) * SP = SINGLE PRECISION RESULT (FIX) * LT = LESS THAN (CSKF) * GT = GREATER THAN (CSKF) * EQ = EQUAL (CSKF) * #(7),#(8) = EXPECTED RESULT * #(9) = CARRY FLAG * #(10) = OVERFLOW FLAG * #(11) = X REGISTER * #(12) = Y REGISTER * #(13) = BYTE MODE B=BYTE W=WORD OPTEST XMACRO * CY=#(9) OV=#(10) A=#(1) Q=#(2) #(3) #(4) #(5)=#(7) #(8) #(6) FLOAT1 SET $ JST INITRP INITIALIZE TRAP LOCATIONS COPY =#(1),A #(1) ==> 'A' COPY =#(2),Q #(2) ==> 'Q' COPY =#(11),X #(11) ==> 'X' COPY =#(12),Y #(12) ==> 'Y' #(9)BIT CY,S #(9) ==> CARRY FLAG #(10)BIT OV,S #(10) ==> OVERFLOW FLAG IFT #(13,'B') SBIT BY,S CHECK FOR BYTE MODE INDEPENDENCE ENDC IFT #(3,'ADDF');#(3,'SUBF');#(3,'MULF');#(3,'DIVF');#(3,'CSKF') JMP $+3 JUMP AROUND WORD FLOAT2 SET $ WORD  #(4) INSTRUCTION OPERAND WORD #(5) FLOAT3 SET $ IFT #(6,'OK');#(3,'CSKF') #(3) FLOAT2  DO THE OPERATION ENDC IFT #(6,'OV') IFF #(3,'FIX') #(3) FLOAT2 SHOULD OVERFLOW AND T R A P ENDC ENDC IFT #(6,'UF') #(3) FLOAT2 SHOULD UNDERFLOW ENDC ENDC  IFT #(3,'FIX');#(3,'FLOAT') FLOAT3 SET $ IFT #(3,'FLOAT') #(3) --DO THE OPERATION ENDC IFT #(6,'OV') #(3) -- SHOULD OVERFLOW ENDC IFT #(6,'DP') #(3) -- EXPECT DOUBLE PRECISION RESULT ENDC IFT #(6,'SP') #(3) -- EXPECT SINGLE PRECISION RESULT ENDC ENDC IFT #(3,'CSKF') IFT #(6,'LT') JMP $+3 OK-- AQ IS LESS THAN OPERAND NOP  ERROR: INCORRECT,COMPARE ENDC IFT #(6,'GT') ERROR: INCORRECT,COMPARE JMP $+2 OK-- AQ IS GREATER THAN OPERAND ERROR: INCORRECT,COMPARE ENDC IFT #(6,'EQ') NOP ERROR: INCORRECT,COMPARE NOP OK-- AQ IS EQUAL TO OPERAND ENDC ENDC IFT #(13,'B') RBIT BY,S  ENDC IFF #(3,'CSKF') CSK A,=#(7) CHECK -A- NOP ERROR: -A-,SHOULD,CONTAIN,#(7)  CSK Q,=#(8) CHECK -Q- NOP ERROR: -Q-,SHOULD,CONTAIN,#(8) ENDC IFT #(3,'CSKF') CSK A,=#(1) CHECK -A- NOP ERROR: #(3),MODIFIED,-A- CSK Q,=#(2) CHECK -Q- NOP ERROR: #(3),MODIFIED,-Q- ENDC COPY X,A FOR TESTING CSK A,=#(11) CHECK -X- NOP ERROR:1  #(3),MODIFIED,-X- COPY Y,A FOR TESTING CSK A,=#(12) CHECK -Y- NOP ERROR: #(3),MODIFIED,-Y- IFT #(3,'ADDF');#(3,'SUBF');#(3,'MULF');#(3,'DIVF');#(3,'CSKF') COPY FLOAT2,A CSK A,=#(4) CHECK OPERAND WORD 1 NOP ERROR: #(3),MODIFIED,OPERAND COPY FLOAT2+1,A CSK A,=#(5) CHECK OPERAND WORD 2 NOP ERROR: #(3),MODIFIED,OPERAND ENDC IFT #(6,'OK');#(3,'CSKF') IFT #(10,'R') JF OV,$+2 OVERFLOW STILL RESET? ERROR: NO--,#(3),CHANGED,OVERFLOW ENDC IFT #(10,'S')  JT OV,$+2 OVERFLOW STILL SET? ERROR: NO--,#(3),CHANGED,OVERFLOW ENDC IFT #(9,'R') JF  CY,$+2 CARRY STILL RESET? ERROR: NO--,#(3),CHANGED,CARRY ENDC IFT #(9,'S') JT CY,$+2 CARRY STILL SET? ERROR: NO--,#(3),CHANGED,CARRY ENDC ENDC IFT #(6,'OV') IFF #(3,'FIX')  IFT #(9,'R') JF CY,$+2 CARRY STILL RESET? ERROR: NO--,#(3),WITH,OVERFLOW,CHANGED,CARRY ENDC IFT #(9,'S') JT CY,$+2 CARRY STILL SET? ERROR: NO--,#(3),WITH,OVERFLOW,CHANGED,CARRY ENDC ENDC IFT #(3,'FIX') JT CY,$+2 CARRY SET? ERROR: NO--,EXPECTED,OVERFLOW,WITH,CY,SET  ENDC JT OV,$+2 OVERFLOW SET? ERROR: NO--,EXPECTED,OVERFLOW,WITH,OV,SET ENDC IFT #(6,'UF') JT CY,$+2 CARRY SET? ERROR: NO--,EXPECTED,UNDERFLOW,WITH,CY,SET JT OV,$+2 OVERFLOW SET?  ERROR: NO--,EXPECTED,UNDERFLOW,WITH,OV,SET ENDC IFT #(6,'DP') JT CY,$+2 CARRY SET? ERROR: NO--,SHOULD,BE,SET,WHEN,DOUBLE,PRECISION JF OV,$+2 OVERFLOW RESET? ERROR: NO--,SHOULD,BE,RESET,WHEN,DOUBLE,PRECISION ENDC IFT #(6,'SP') JF CY,$+2 CARRY RESET? ERROR: NO--,SHOULD,BE,RESET,WHEN,SINGLE,PRECISION JF OV,$+2 OVERFLOW RESET? ERROR: NO--,SHOULD,BE,RESET,WHEN,SINGLE,PRECISION ENDC  IFT #(6,'OK');#(6,'UF');#(3,'CSKF');#(3,'FIX');#(3,'FLOAT') IFT LSI410=0 COPY ATRAP,A 1ST WORD OF TRAP VECTOR JEQ A,$+2 STILL ZERO? ERROR: NO--,#(3),ALTERED,TRAP,VECTOR COPY ATRAP+1,A 2ND WORD OF TRAP VECTOR JEQ A,$+2 STILL ZERO? ERROR: NO--,#(3),ALTERED,TRAP,VECTOR ENDC COPY QTEMP,A CHECK TRAP FLAG TO SEE IF TRAP WAS TAKEN JEQ A,$+2 STILL ZERO? ERROR: NO--,#(3),EXECUTED,TRAP ENDC IFT #(6,'OV') IFF #(3,'FIX') COPY QTEMP,A CHECK TRAP FLAG TO SEE IF TRAP WAS TAKEN CSK A,=1  NOP ERROR: #(3),DID,NOT,EXECUTE,TRAP IFT LSI410=0 COPY ATRAP,A 1ST WORD OF TRAP VECTOR CSK A,=FLOAT3+2 CHECK 'P' NOP ERROR: #(3),TRAP,STORED,WRONG,'P' COPY ATRAP+1,A 2ND WORD OF TRAP VECTOR CSK A,FLOAT3 CHECK 'I' NOP ERROR: #(3),TRAP,STORED,WRONG,'I' ENDC ENDC ENDC JMP FLOAT1  PATCH FOR LOOPING ORG $-1 NOP GLPOL: ENDM TITL SPACE 5 ****** * * #(1),#(2) = AQ REGISTER PAIR * 2  #(3) = OPERATION * #(4),#(5) = OPERAND * #(6) = STATUS * #(7),#(8) = EXPECTED RESULT * #(9) = CY AND OV INITIAL VALUE * ****** FLTEST XMACRO IFF #(3,'CSKF') OPTEST #(1),#(2),#(3),#(4),#(5),#(6),#(7),#(8),#(9),#(9),:3333,:0F0F,W ENDC IFT #(3,'CSKF') OPTEST #(1),#(2),#(3),#(4),#(5),#(6),#(1),#(2),#(9),#(9),:FF00,:5555,W ENDC  ENDM SAVE END ORG $-1 NOP GLPOL: ENDM TITL SPACE 5 ****** * * #(1),#(2) = AQ REGISTER PAIR * DE PAT412.LST DE PAT412.OBJ AS LO=LP MACRO PAT412=PAT412CNT.ASM(P=57,S,D=PAT4.MAC(S),#1)+ PAT412NUC.ASM(S)+PAT412P1.ASM(S)+PAT412P2.ASM(S)+ PAT412P3.ASM(S)+PAT412P4.ASM DAS UL ENTER CONT TO CONTINUE PAUSE DE PAT412.BIN DE PAT412.MAP CRE PAT412.MAP 1 1 AS LO=PAT412.MAP LINK PAT412=PAT412(ABS=3000)+DEBUGS(UL)+PAT412END DAS LO 8302201412598302201412598302201412591PAGE 0001 MULTI-TASKING LINKER (F3) 1982/12/22 11:42:09 FILE USAGE SUMMARY DK20.PAT412.BIN=DK20.PAT412.OBJ(ABSOLUTE=3000)+ DK20.DEBUGS.OBJ(UNCONDITIONAL)+ NOTE: *** DEBUGS.OBJ - REV E800 *** DK20.PATEND.OBJ 1PAGE 0002 MULTI-TASKING LINKER (F3,EC,E5,E3,--,E3,E1) 1982/12/22 11:43:50 ALL SYMBOLS THE TRANSFER ADDRESS IS 3000(DEBUG:) ABSOLUTE SYMBOLS (0000 - FFFE) 002C-COUNT1 00ED-PDNCT 0113-A01000 1800-FLPT 23F0-ALTRTN 002D-COUNT2 00EE-PFERRS 0120-A02000 23C0-PARTX 2420-ALTBUF 00EC-PUPCT 00FF-ALLPAT 0F20-PART2 23E0-ALT MEMORY ABSOLUTE (3000 - 2FFF) 3000-R:LOW 37D7-R:HIGH SEGMENT DEBUG: (3000 - 37D3) ABSOLUTE - RAM, SHAREABLE (3000 - 37D3) 3000-DEBUG4 34D4-DBG4:CNT 34E6-DBG4:LP SEGMENT BLANK (37D4 - 37D7) ABSOLUTE - RAM (37D4 - 37D7) 37D4-PATEND MISSING: SRF:ER NO WARNINGS 01000 1800-FLPT 23F0-ALTJDBG4:CNTDBG4:LP DEBUG4 O0SEGMENTBLANK DEBUG: o MG:Z G:Y G:X MG:W G:V G:U MG:T G:S G:R MG:Q G:P G:O MG:N G:M G:L MG:K G:J G:I MG:H G:G G:F MG:E  G:D G:C MG:B G:A G:9 MG:8 G:7 G:6 MG:5 G:4 G:3 MG:2 G:1 G:0 im MACRO (F100) ig  ~֞8O] &Ea3x _|l* | } ~gҡ# A ` Q T ( :ӂ< - :ӂ" )  m*** DEBUGS.OBJ - REV E8m00 ***  pP0 @0B բ` h  } c= ¢‚ pP0/o  X)C $ `)C ")P C ")C " `m D E B U G 4 E 8 0 0 ӟe  }u#u"u!u uuuuuuuuuuuuuuuuuuu u u u u uuuuuuuuu  ӂzӾ P AC Q@ X= Y:ԽѾ K3 L0 S- D* C'ԟK =ӟ{  } ӟ| @)C " )PC ")C " `r"  *ٽ҆ Y Q  A Gҽ؆ R Ƥ D V W ƚ›LBLCLFLLLS LJLILGLRL3 Zߝ Ǟ< !} {҆u łt P L łj T P BŁ P ӂY T H TŅ Ğ| QEF , , ` ՟ _ٞ0 6} ` J B YK QJ f䞁ւ cޡ @ ޟޝ `@E ; RA@EN@Aޏǎ Qފ ,^:F & o*| x ` D `랞oY* Qd Ѐ_Ѐ āZ@AĄ܃T B ` ǁ D임*L_U3 ` Ģ1*/) 'r "Bƽу۽ֽ C凑ā / X Ń ѽ۞i Ğ] с䆫@ڃ۽ցBǢ ,ž[ + - * X /KJƎ^ [{ xނZ  ,ş| ֽL  P ޽с ۽۽޺{  ўq kɆȂ Gާ}ަyޠ }y E ~  .  E ~  .ޣ ރfN  ,Žֆs@FC  kqLL (w{u  ^|JQBZy L S TўNM   Isľˆ_]] | IƎ> ,ŽƇ , ƂpIưk , ,Htr H m -ņց - ('\\ÂF - tтڃԞx ’ @"Fz@ Ό F ō l# .bƝޙޖJ Q!’ފދ JQĽ %ӂԞu  U B * ӂGo h f e "cIaM K Y &V&RR `QK L$kK N =ӂDD G ӂA   :Ӟ ӟL  ӟ{ y9 u    :ӂw  @0ƵQ¾ˢ̂ C C 96C C " z a ࢜0 `a ´C  /6 C C 6 C  C 6C h  Q¾{”C "C C  I6 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII