IMD 1.16: 2/09/2008 13:31:51 84-93720-05 c100 f72005 scout ufdc listing files part III    @0|)wwЀЀtQql)  " }gA `_l M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF282092110362200820921103622 820921103622 0F72005 VOLSCOUT UFDC LISTING FILE - PART III   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 r1PAGE 0228 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:21.50 PROGRAM UTILITIES (TESTCK) 5790 ****************************** 5791 * 5792 * TESTCK - CHECK FOR QUERY JUMP DIRECTION 5793 * 5794 * 1 = TEST GROUP 5795 * 2 = DIALOG 5796 * 3 = TECH TEST 5797 * 4 = DEFAULT  5798 * 5799 * CALLING SEQUENCE: 5800 * 5801 * JST TESTCK 5802 * JMP ? TEST GROUP R 5803 * JMP ? DIALOG R+1  5804 * JMP ? TECH TEST R+2 5805 * JMP ? DEFAULT R+3 5806 * 5807 ****************************** 5808 * 1099 0E0D 5809 TESTCK ENT  PROGRAM FUNCTION CHECK 109A 83D1 10EC 5810 COPY TESTFLG,A GET JUMP FLAG 109B 0C01 5811  CLSN A,=1 TEST GROUP? 109C 9F7C 1099 5812 JMP *TESTCK YES R 109D DE7B 1099 581 3 IMS TESTCK INC. RETURN ADD. 109E 0C02 5814 CLSN A,=2 DIALOG? 109F 9F79 1099 5815 JMP *TESTCK YES R+1 10A0 DE78 1099 5816 IMS TESTCK INC. RETURN ADD. 10A1 0C03 5817 CLSN A,=3 TECH TEST? 10A2 9F76 1099 5818 JMP *TESTCK YES  R+2 10A3 DE75 1099 5819 IMS TESTCK INC. RETURN ADD. 10A4 9F74 1099 5820 JMP *TESTCK  EXIT R+3 1PAGE 0229 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:22.50 PROGRAM UTILITIES (SPACE3) 5822 ****************************** 5823 *  5824 * SPACE3 - THIS SUBROUTINE WILL PRINT 5825 * 3 ASCII SPACES. 5826 *  5827 * CALLING SEQUENCE: 5828 * JSK SPACE3 5829 * 5830 ****************************** 5831 * 000010A5 5832 SPACE3 EQU $ PRINT 3 SPACES 10A5 4309 5833 PUSH :10 SAVE ALL 10A6 0010 10A7 0920 5834 COPY =' ',A  GET ASCII SPACE 10A8 FEFB 1124 5835 JSK OTTY PRINT IT 10A9 FEFA 1124 5836 JSK OTTY PRINT IT 10AA FEF9 1124 5837 JSK OTTY PRINT IT 10AB 6309 5838 POP  RESTORE ALL 10AC 2309 5839 RSK SPACE3 EXIT 1PAGE 0230 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:23.25 INPUT/OUTPUT UTILITIES (CLEANUP)  5841 ****************************** 5842 * 5843 * CLEANUP 5844 *  5845 * THIS SUBROUTINE DOES NECESSARY CHORES 5846 * TO CLEAN UP THE MULTI-CHANNEL ONLY. 5847 * 5848 ****************************** 5849 * 10AD 0E0D  5850 CLEANUP ENT 10AE 2900 5851 COPY =0,X CHANNEL 0, TRANS/RECIEVE DISABLE 10AF 4940 5852 COPY =MCSDA,Q GET MULTI-CHANNEL DEVICE ADDR 10B0 430A 5853 XNX Q 10B1 2201 5854 OUT X,1 SEND COMMAND TO MCS 10B2 2908 5855 COPY =MCNECHO,X DISABLE AUTO ECHO 10B3 430A 5856 XNX Q 10B4 2403 5857 SELP X,3 10B5 A3B2 10E8 5858 COPY  LPFLG,X GET LP FLAG 10B6 31C1 10B8 5859 JNE X,$+2 JUMP IF LP IS BEING USED 10B7 9F75 10AD 5860 JMP *CLEANUP EXIT 10B8 401C 5861 SBIT 1,Q MUST ADDRESS CHAN 1 (LP) 10B9 2900 5862 COPY =0,X AND CLEAR TRANSMITTER IN CHAN 1 10BA 430A 5863 XNX Q 10BB 2201 5864 OUT X,1 10BC 9F70 10AD 5865 JMP *CLEANUP EXIT 1PAGE 0231 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:24.00 INPUT/OUTPUT UTILITIES (MSGA)   5867 ****************************** 5868 * 5869 * MSGA - THIS SUBROUTINE WILL PRINT AN ASCII 5870 * MESSAGE, THE LAST CHAR. OF WHICH 5871 * MUST BE 0, TO CRT/TTY AND LP. 5872 * 5873 * THIS SUBROUTINE WILL BE BYPASSED IF THE 5874 * SENSE SWITCH IS SET. 5875 * 5876 * CALLING SEQUENCE: 5877 * JST MSGA 5878 * WORD (MESSAGE ADD.) 5879 * 5880 ****************************** 5881 * 10BD 0E0D 5882 MSGA ENT PRINT MESSAGE 10BE C692 10D1 5883 COPY Q,MSTMP2 SAVE THE Q-REG. 10BF A690 10D0 5884 COPY X,MSTMP SAVE THE X-REG. 10C0 A37C 10BD 5885 COPY *MSGA,X GET MESSAGE ADD. 10C1 DE7B 10BD 5886 IMS MSGA  INC. RETURN ADD. 10C2 C3A6 10E9 5887 COPY CONSOL,Q IS THERE A PROG CONSOLE 10C3 5141 10C5 5888  JEQ Q,$+2 NO CONSOLE, SO PRINT 10C4 1648 10CD 5889 JT SS,MSGA2 YES CONSOLE; IF SSW ON, EXIT 10C5 2E01 5890 SHIFT X,LO,1 CONVERT WORD ADD. TO A BYTE ADD. 10C6 0E25 5891 MSGA1 SBIT  BY:,S SET BYTE MODE 10C7 8080 0000 5892 COPYB 0(X),A GET CHAR. FROM MESSAGE 10C8 0E27 5893 RBIT BY:,S SET WORD MODE 10C9 1143 10CD 5894 JEQ A,MSGA2 IF END OF MESSAGE, EXIT LOOP 10CA FED9 1124 5895 JSK OTTY PRINT CHAR. 10CB 2B01 5896 ADD =1,X INC. MESSAGE ADD. 10CC 9E79 10C6 5897 JMP MSGA1 LOOP BACK FOR MORE 10CD A282 10D0 5898 MSGA2 COPY  MSTMP,X RESTORE THE X-REG. 10CE C282 10D1 5899 COPY MSTMP2,Q RESTORE Q-REG. 10CF 9F6D 10BD 5900 JMP *MSGA EXIT 5901 * 10D0 0000 5902 MSTMP RES 1,0 SAVED X-REG. 1PAGE 0232 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:25.75 INPUT/OUTPUT UTILITIES (MSGA) 10D1 0000 5903 MSTMP2 RES 1,0 SAVED Q-REG. 1PAGE 0233 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:25.75 INPUT/OUTPUT UTITLITIES (IKB) 5905 ****************************** 5906 * 5907 * IKB - THIS SUBROUTINE WILL INPUT, INTO  5908 * THE LEAST SIGNIFICANT BYTE OF THE 5909 * A-REG., AN ASCII CHAR. FROM  5910 * THE CRT KEYBOARD/TTY. 5911 * 'IKB' TALKS TO THE SPI BOARD WHEREAS  5912 * 'MCSIN' TALKS TO THE MULTI-CHANNEL BOARD. 5913 * 5914 * CALLING SEQUENCE: 5915 * JSK IKB 5916 * 5917 ******************************  5918 * 000010D2 5919 IKB EQU $ INPUT FROM CRT/TTY 10D2 4309 5920  PUSH :10 SAVE ALL 10D3 0010 10D4 0E87 5921 RBIT GI:,S DISABLE INTS. 10D5 C394 10EA  5922 COPY MCSFLG,Q ARE WE USING MULTI-CHANNEL? 10D6 5142 10D9 5923 JEQ Q,$+3 JUMP IF NOT 10D7 BE98 10F0 5924 JST MCSIN GET CHAR. VIA THE MCS BOARD 10D8 9E88 10E1 5925 JMP  SPIMCS COMMON CODE FOR THE SPI & MCS 10D9 8293 10ED 5926 COPY =:8618,A GET CRT/TTY INPUT STARTUP COM. 10DA 02F9 5927 OUT A,DTTYDA%1;1 SEND TO CRT/TTY 10DB 01F9 5928 IN DTTYDA%1;1,A GET STATUS FROM CRT/TTY 10DC 0E39 5929 SHIFT A,RO,4 SHIFT 'DATA READY' BIT (3) INTO OV 10DD 36BD 10DB 5930 JF OV,$-2 IF 'DATA READY' BIT IS RESET, LOOP BACK 10DE 01F8 5931 IN DTTYDA%1,A INPUT ASCII CHAR. FROM CRT/TTY 10DF C28B 10EB 5932 COPY =:100,Q GET CRT/TTY RESET COM. CODE 10E0 42F9 5933 OUT Q,DTTYDA%1;1 SEND TO CRT/TTY 10E1 187F 5934 SPIMCS AND =:7F,A MASK OFF POSSIBLE PARITY BIT 10E2 8683 10E6 5935 COPY A,IKBTMP SAVE CHAR. 10E3 6309 5936 POP  RESTORE REG'S. 10E4 8281 10E6 5937 COPY IKBTMP,A RESTORE CHAR. TO A-REG. 10E5 2309 5938 RSK EXIT 5939 * 1PAGE 0234 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:27.00 INPUT/OUTPUT UTITLITIES (IKB) 10E6 0000 5940 IKBTMP RES 1,0 SAVED INPUT CHAR. 5941 * 0009 5942 LPOOL 10E7 1124 OTTY 10E8 12FA LPFLG 10E9 1317 CONSOL 10EA 12FB MCSFLG 10EB 0100 10EC 1306 TESTFLG 10ED 8618 10EE 10EF 1PAGE 0235 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:27.25 INPUT/OUTPUT UTILITIES (MCSIN) 5944 ****************************** 5945 * 5946 * MCSIN MULTI-CHANNEL SERIAL INPUT  5947 * 5948 * THIS SUBROUTINE IS USED TO GET INPUT FROM 5949 * THE KEYBOARD VIA THE MULTI-CHANNEL SERIAL BOARD. 5950 * 5951 * THE INPUT CHAR. WILL BE IN THE A-REG. 5952 * 5953 * CALLING SEQUENCE: 5954 * 5955 * JST MCSIN 5956 * 5957 ****************************** 5958 * 10F0 0E0D 5959 MCSIN ENT NOW ENTERING THE WORLD OF MULTI-CHANNEL 000010F1 5960 ECHOWT EQU  $ 10F1 4940 5961 COPY =MCSDA,Q GET DEVICE ADDRESS OF THE MCS 10F2 430A 5962 XNX  Q 10F3 0101 5963 IN 1,A TRANSMITTED BEFORE ENABLING ECHO 10F4 002F 5964 TBIT 2,A IS TRANSMITTER EMPTY? 10F5 36BB 10F1 5965 JF OV,ECHOWT IF NOT, WAIT 'TILL IT IS 10F6 0918 5966 COPY =MCECHO,A NOW, SET ECHO TO RECIEVE 10F7 430A 5967 XNX Q 10F8 040 3 5968 SELP A,3 000010F9 5969 WAITST EQU $ 10F9 430A 5970 XNX Q 10FA 0101 5971 IN 1,A GET CHANNEL 0 STATUS 10FB 007F 5972 TBIT 7,A DEVICE READY? 10FC 36BC 10F9 5973 JF OV,WAITST IF NOT, KEEP WAITING... 10FD 0906 5974 COPY  =MC06,A DTR & RECIEVE ENABLE CONTROL WORD 10FE 430A 5975 XNX Q 10FF 0201 5976 OUT A,1 00001100 5977 WAITR EQU $ 1100 430A 5978 XNX Q 1101 0101 5979  IN 1,A WAIT FOR RECIEVE READY 1PAGE 0236 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:28.50 INPUT/OUTPUT UTILITIES (MCSIN) 1102 001F 5980 TBIT 1,A 1103 36BC 1100  5981 JF OV,WAITR 1104 430A 5982 XNX Q 1105 0100 5983 IN 0,A  GET ASCII CHARACTER 1106 BE26 10AD 5984 JST CLEANUP CLEAN UP SCOUT MCS, ETC. 1107 9F68 10F0 5985  JMP *MCSIN EXIT 5986 * 00000018 5987 MCECHO EQU :18 00000006 5988  MC06 EQU :06 1PAGE 0237 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:28.75 INPUT/OUTPUT UTILITIES (IDEC) 5990 ****************************** 5991 *  5992 * IDEC - THIS SUBROUTINE WILL INPUT, FROM 5993 * THE CRT/TTY, AN ASCII-DECIMAL NUMBER WHICH 5994 * IT WILL CONVERT TO BINARY AND RETURN IT IN 5995 * THE X-REG.  5996 * 5997 * DURING THIS SUBROUTINE, A QUESTION MARK '?' IS OUTPUT 5998 * IF THE INPUT VALUE BECOMES GREATER THAN 32767. 5999 * THE ROUTINE THEN RESTARTS THE INPUT. 6000 * 6001 * THIS SUBROUTINE IS EXITED UPON INPUT OF THE 6002 * FIRST NON ASCII-DECIMAL CHAR., WHICH IT WILL 6003 * RETURN IN THE A-REG. 6004 * 6005 * CALLING SEQUENCE: 6006 * JSK IDEC 6007 *  6008 ****************************** 6009 * 00001108 6010 IDEC EQU $ INPUT A DECIMAL NUMBER 1108 2900 6011 COPY =0,X SET X-REG. TO ZERO 1109 A697 1121 6012 COPY X,IDCTM1 CLEAR VALUE CELL 110A A698 1123 6013 COPY X,IDCTM3 AND CHAR. COUNT 110B FE46 10D2 6014 IDEC1 JSK IKB GET A CHAR. 110C 8695 1122 6015 COPY A,IDCTM2 SAVE THE CHAR. 110D 0AD0 6016 SUB ='0',A SEE IF IT IS ASCII '0'-'9' 110E 13CC 111B 6017 JLT A,IDEC2 IF NOT, TERMINATE ROUTINE 110F 0AF6 6018 SUB =10,A CHECK NUMBER 1110 134A 111B 6019 JGE A,IDEC2 IF GREATER, TERMINATE ROUTINE 1111 DE91 1123 6020 IMS IDCTM3 INC. CHAR. COUNT 1112  828E 1121 6021 COPY IDCTM1,A ADD TO VALUE 1113 0E11 6022 SHIFT A,LO,2 TIMES 4 1114 8A8C 1121 6023 ADD IDCTM1,A TIMES 5 1115 0E01 6024 SHIFT A,LO,1 TIMES 10 1116 8A8B 1122 6025 ADD IDCTM2,A ADD NEW VALUE 1PAGE 0238 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:30.00 INPUT/OUTPUT UTILITIES (IDEC) 1117 0AD0 6026 SUB ='0',A LESS ASCII OFFSET 1118 13C5 111E 6027 JLT A,IDEC3 MINUS IS BAD 1119 8687 1121 6028  COPY A,IDCTM1 STORE NEW VALUE 111A 9E70 110B 6029 JMP IDEC1 GET NEXT INPUT 111B 8286 1122 6030 IDEC2 COPY IDCTM2,A GET TERMINATOR IN THE A-REG. 111C A284 1121 6031 COPY IDCTM1,X GET VALUE IN THE X-REG. 111D 2309 6032 RSK IDEC EXIT 111E 093F 6033 IDEC3 COPY ='?',A ERROR 111F FE84 1124 6034 JSK OTTY OUTPUT '?' 1120 9E67 1108 6035 JMP IDEC  START AGAIN 6036 * 1121 0000 6037 IDCTM1 RES 1,0 VALUE CELL 1122 0000 6038 IDCTM2 RES 1,0 ASCII CHAR. 1123 0000 6039 IDCTM3 RES 1,0 CHAR. COUNT 1PAGE 0239 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:30.75 INPUT/OUTPUT UTILITIES (OTTY) 6041 ****************************** 6042 * 6043 * OTTY - OUTPUT THE LEAST SIGNIFICANT BYTE OF 6044 * THE A-REG. TO THE CRT/TTY AND LP IF 'LPFLG' 6045  * IS SET. IF THE LP TIMES OUT, AN 6046 * ERROR MESSAGE WILL BE DISPLAYED ON THE  6047 * CRT/TTY. TO RESTART PRESS ANY KEY ON THE 6048 * KEYBOARD, IF 'DEFAULT MODE' OR PRESS 6049 * RUN/STOP IF 'DEMAND MODE'. 6050 * 6051 * THIS SUBROUTINE WILL BE BYPASSED IF THERE 6052 * IS A PROG CONSOLE WITH THE SENSE SWITCH SET.  6053 * 6054 * 6055 * LPFLG: 6056 * 0 - CRT/TTY ONLY  6057 * 1 - CRT/TTY AND LP 6058 * -1 - LP ONLY 6059 *  6060 * CALLING SEQUENCE: 6061 * COPY =CHAR.,A 6062 * JSK OTTY  6063 * 6064 * ENTER WITH THE ASCII CHAR. IN THE A-REG. 6065 *  6066 ****************************** 6067 * 00001124 6068 OTTY EQU $ OUTPUT TO TTY/CRT 1124 4309 6069 PUSH :10 SAVE REGS. 1125 0010 1126 C342 10E9 6070 COPY CONSOL,Q IS THERE A PROG CONSOLE? 1127 5143 112B 6071 JEQ Q,PRINT NO CONSOLE, SO PRINT 1128 16C2 112B 6072 JF SS,PRINT YES CONSOLE; IF SSW OFF, PRINT 1129 6309 6073 POP 112A 2309 607 4 RSK EXIT 112B 0E87 6075 PRINT RBIT GI:,S ENSURE INTS. ARE DISABLED 1PAGE 0240 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:32.00 INPUT/OUTPUT UTILITIES (OTTY) 112C A33D 10EA 6076 COPY MCSFLG,X IS IT MULTI-CHANNEL? 112D 3142 1130 6077 JEQ  X,$+3 JUMP IF IT IS A SPI BOARD 112E BED2 1181 6078 JST MCSOUT OTHERWISE, GOTO MULTI-CHANNEL 112F 9EC1 1171 6079 JMP OTTY6 EXIT OTTY 1130 A3C4 1175 6080 COPY MDEFLG,X GET MODE FLAG 1131 31CD 113F 6081 JNE X,OTTY0 IF DEMAND MODE, JUMP 1132 A238 10EB 6082 COPY =:100,X GET CRT RESET COM. 1133 22F9 6083 OUT X,DTTYDA%1;1 RESET CRT/TTY PICO 1134 A2C2 1177 6084  COPY =:8612,X CRT/TTY STARTUP COM. 1135 22F9 6085 OUT X,DTTYDA%1;1 SEND COM. CODE TO CRT/TTY 1136 02F8 6086 OUT A,DTTYDA%1 SEND CHAR. TO CRT/TTY 1137 21F9 6087 IN DTTYDA%1;1,X INPUT STATUS FROM CRT/TTY 1138 2E49 6088 SHIFT X,RO,5 SHIFT 'TX EMPTY' BIT (4) INTO OV 1139 363D 1137 6089 JT OV,$-2 IF TRUE -TX EMPTY- LOOP BACK 113A 21F9 6090 IN DTTYDA%1;1,X INPUT STATUS FROM CRT/TTY 113B 2E49 6091 SHIFT X,RO,5 SHIFT 'TX EMPTY' BIT (4) INTO OV 113C 36BD 113A 6092 JF OV,$-2 IF FALSE -TX FULL- LOOP BACK 113D A22D 10EB 6093 COPY =:100,X GET CRT/TTY RESET COM. CODE 113E 22F9 6094 OUT X,DTTYDA%1;1 SEND TO CRT/TTY 113F A328 10E8 6095 OTTY0  COPY LPFLG,X GET LP FLAG 1140 3170 1171 6096 JEQ X,OTTY6 IF NO LP, EXIT SUBROUTINE  6097 * 1141 86B2 1174 6098 OTTY1 COPY A,OTTMP1 SAVE CHAR. 1142 48FB 6099 COPY =-5,Q  SET DELAY CONSTANT FOR Q-REG. 1143 6900 6100 COPY =0,Y SET DELAY CONSTANT FOR Y-REG. 1144 A226 10EB 6101 COPY =:100,X GET SPI RESET COM. 1145 22FF 6102 OUT X,DLPDA%1;1 SEND IT TO SPI BOARD 1146 21FF 6103 IN DLPDA%1;1,X GET SPI STATUS 1147 2E09 6104 SHIFT X,RO,1 SHIFT SPI READ BIT TO OV 1148 36C3 114C 6105 JF OV,$+4 IF READY, SEND CHAR. 1149 74BA 1144 6106 IJNE Y,OTTY1+3 INC. INNER LOOP 114A 54B9 1144 6107 IJNE Q,OTTY1+3 INC. OUTTER LOOP 114B 9E89 1155 6108 JMP OTTERR IF DONE, DISPLAY TIME OUT MESS. 114C A2AA 1177 6109 COPY  =:8612,X START, DON'T INTERRUPT 114D 22FF 6110 OUT X,DLPDA%1;1 TELL PICO 114E 02FE 6111  OUT A,DLPDA%1 SEND CHAR 1PAGE 0241 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:34.00 INPUT/OUTPUT UTILITIES (OTTY) 114F A21B 10EB 6112 COPY =:100,X RESET INSTRUCTION 1150 01FF 6113 OTTY2 IN DLPDA%1;1,A GET STATUS FROM LP 1151 0E09 6114 SHIFT A,RO,1   BUSY BIT TO OV 1152 36DB 116E 6115 JF OV,OTTY5 IF NOT SET, JUMP 1153 74BC 1150 6116 IJNE Y,OTTY2 INC. INNER LOOP 1154 54BB 1150 6117 IJNE Q,OTTY2 INC. OUTER LOOP 1155 C312 10E8 6118 OTTERR COPY LPFLG,Q GET LP FLAG 1156 0900 6119 COPY =0,A SET NEW LP FLAG 1157 8710 10E8 6120 COPY A,LPFLG STORE NEW LP FLAG 1158 0104 6121 IN CONSL;CDR,A GET 'CDR' CONTENTS 1159 18FF 6122 AND =:FF,A MASK FOR TEST NUMBER ONLY 115A B69D 1178 6123 OR  =ER4000,A 'OR' IN ERROR CODE 115B 0404 6124 SELP A,CONSL;CDR SEND TO 'CDR' 115C 8398 1175 6125  COPY MDEFLG,A GET MODE FLAG 115D 1142 1160 6126 JEQ A,$+3 IF DEFAULT MODE, JUMP 115E 0E0D 6127 HLT WAIT HERE 115F 9E89 1169 6128 JMP OTTY4+1 GO ON 1160 A298 1179 6129 COPY =LPMSG*2,X GET ERROR MESSAGE ADD. 'LP TIMEOUT' 1161 0E25 6130 OTTY3 SBIT BY:,S SET BYTE MODE 1162 8080 0000 6131 COPYB 0(X),A GET CHAR. 1163 0E27 6132 RBIT  BY:,S SET WORD MODE 1164 1143 1168 6133 JEQ A,OTTY4 IF END OF MESSAGE, EXIT LOOP 1165 FE3E 1124 6134 JSK OTTY DISPLAY ON CRT/TTY 1166 2B01 6135 ADD =1,X INC. MESSAGE ADD. 1167 9E79 1161 6136 JMP OTTY3 LOOP FOR MORE 1168 FF91 117A 6137 OTTY4 JSK IKB  INPUT CHAR. FROM KEYBOARD 1169 C78C 1176 6138 COPY Q,LPFLG SET FLAG 116A 8289 1174 6139 COPY  OTTMP1,A RESTORE CHAR. 116B A38F 117B 6140 COPY MCSFLG,X GET MCS FLAG 116C 3115 1142 6141  JEQ X,OTTY1+1 TRY TO OUTPUT TO LP AGAIN 116D 9EAB 1199 6142 JMP MCSLP TRY TO PRINT TO MCS LP AGAIN 116E 22FF 6143 OTTY5 OUT X,DLPDA%1;1 RESET LP PICO 116F 2E09 6144 SHIFT X,RO,1  WASTE SOME TIME 1170 31BE 116F 6145 JNE X,$-1 LOOP BACK 1171 6309 6146 OTTY6 POP  SAVE REGS. 1172 0E85 6147 SBIT GI:,S ENABLE INTS. 1PAGE 0242 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:35.75 INPUT/OUTPUT UTILITIES (OTTY) 1173 2309 6148 RSK OTTY EXIT 6149 * 1174 0000 6150 OTTMP1 RES 1,0 SAVED A-REG. 6151 * 000C 6152 LPOOL 1175 12F9 MDEFLG 1176 12FA LPFLG 1177 8612 1178 4000 ER4000 1179 2F12 117A 10D2 IKB 117B 12FB MCSFLG 117C 117D 117E 117F 1180 1PAGE 0243 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:36.25 INPUT/OUTPUT UTILITIES (MCSOUT) 6154 ****************************** 6155 * 6156 * MCSOUT MULTI-CHANNEL OUTPUT  6157 * 6158 * THIS SUBROUTINE WILL OUTPUT THE LEAST 6159 * SIGNIFICA NT BYTE OF THE A-REG. TO THE 6160 * TTY/CRT & LINEPRINTER (IF 'LPFLG' IS SET). 6161 * 6162 * IF THE LINEPRINTER TIMES OUT, AN ERROR 6163 * MESSAGE WILL BE DISPLAYED ON THE TTY/CRT. 6164 * TO RESTART, PRESS ANY KEY ON THE KEYBOARD. 6165 * 6166 * LPFLG: 0 - TTY/CRT ONLY 6167 * 1 - TTY/CRT & LP 6168 * -1 - LP ONLY 6169 * 6170 * CALLING SEQUENCE: 6171 *  6172 * COPY =CHAR,A 6173 * JST MCSOUT 6174 *  6175 ****************************** 6176 * 6177 * 1181 0E0D 6178 MCSOUT ENT  THIS IS WHERE WE TALK TO THE MCS 1182 86B9 11BC 6179 COPY A,MCTMP1 SAVE A-REG. 1183 A371 1175 6180 COPY MDEFLG,X GET MODE FLAG 1184 31D4 1199 6181 JNE X,MCSLP IF DEMAND MODE, NO TTY/CRT 1185 4940 6182 COPY =MCSDA,Q GET MCS DEVICE ADDRESS 1186 2908 6183 COPY  =MCNECHO,X SET FOR NO ECHO 1187 430A 6184 XNX Q 1188 2403 6185 SELP X,3  MCS-BOARD CONTROL WORD 1189 2922 6186 COPY =:22,X PSEUDO CONTROL WORD 118A 430A 6187  XNX Q 118B 2201 6188 OUT X,1 NOT ENABLING TRANSMITTER 0000118C 6189 WAIT1 EQU $ 1PAGE 0244 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:37.50 INPUT/OUTPUT UTILITIES (MCSOUT) 118C 430A 6190 XNX Q 118D 2101 6191 IN 1,X  GET CHANNEL 0 STATUS 118E 207F 6192 TBIT 7,X DEVICE READY 118F 36BC 118C 6193 JF  OV,WAIT1 JUMP IF NOT READY 1190 2923 6194 COPY =MC0023,X RTS, DTR, TRANSMIT ENABLE 1191 430A  6195 XNX Q 1192 2201 6196 OUT X,1 CHANNEL 0 CONTROL WORD 00001193 6197 WAITW EQU $ 1193 430A 6198 XNX Q 1194 2101 6199 IN 1,X WAIT FOR TRANSMIT READY 1195 200F 6200 TBIT 0,X 1196 36BC 1193 6201 JF OV,WAITW 1197 430A  6202 XNX Q 1198 0200 6203 OUT A,0 SEND DATA BYTE OUT 6204 *  6205 * THIS IS THE LINEPRINTER DRIVER 6206 * 00001199 6207 MCSLP EQU $ 1199 A35C 1176 6208 COPY LPFLG,X GET LP FLAG 119A 3160 11BB 6209 JEQ X,OUTEND EXIT IF LP NOT BEING USED 119B 4940 6210 COPY =MCSDA,Q GET MCS DEVICE ADDRESS 119C 401C 6211 SBIT 1,Q TALK TO CHANNEL 1 119D 2908 6212 COPY =MCNECHO,X SET FOR NO ECHO 119E 430A  6213 XNX Q 119F 2403 6214 SELP X,3 MCS-BOARD CONTROL WORD 11A0 2922 6215   COPY =:22,X PSEUDO CONTROL WORD 11A1 430A 6216 XNX Q 11A2 2201 6217 OUT X,1 NOT ENABLING TRANSMITTER 11A3 08FB 6218 COPY =-5,A SET DELAY CONSTANT FOR A-REG. 11A4 6900 6219 COPY =0,Y SET DELAY CONSTANT FOR Y-REG. 000011A5 6220 WAITLP2 EQU  $ 11A5 430A 6221 XNX Q 11A6 2101 6222 IN 1,X GET CHANNEL 1 STATUS 11A7 207F 6223 TBIT 7,X DEVICE READY? 11A8 3643 11AC 6224 JT OV,WAIT3 JUMP IF READY 11A9 74BB 11A5 6225 IJNE Y,WAITLP2 INCREMENT INNER LOOP 1PAGE 0245 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:38.75 INPUT/OUTPUT UTILITIES (MCSOUT) 11AA 14BA 11A5 6226  IJNE A,WAITLP2 INCREMENT OUTTER LOOP 11AB 9E29 1155 6227 JMP OTTERR LP TIMED OUT, GO SAY SO 000011AC 6228 WAIT3 EQU $ 11AC 2923 6229 COPY =MC0023,X RTS, DTR, TRANSMIT ENABLE 11AD 430A 6230 XNX Q 11AE 2201 6231 OUT X,1 CHANNEL 1 CONTROL WORD 11AF 08FB 6232 COPY =-5,A SET DELAY CONSTANT FOR A-REG. 11B0 6900 6233 COPY =0,Y  SET DELAY CONSTANT FOR Y-REG. 000011B1 6234 WAITX EQU $ 11B1 430A 6235 XNX Q 11B2 2101 6236 IN 1,X WAIT FOR TRANSMIT READY 11B3 200F 6237 TBIT 0,X 11B4 3643 11B8 6238 JT OV,WAIT4 IF TRANSMIT READY, GO PRINT IT 11B5 74BB 11B1 6239 IJNE Y,WAITX INCREMENT INNER LOOP 11B6 14BA 11B1 6240 IJNE A,WAITX INCREMENT OUTTER LOOP 11B7 9E1D 1155 6241  JMP OTTERR LP TIMED OUT, GO SAY SO 000011B8 6242 WAIT4 EQU $ 11B8 8283 11BC 6243 COPY MCTMP1,A RESTORE A-REG. 11B9 430A 6244 XNX Q 11BA 0200 6245 OUT A,0  SEND DATA BYTE OUT 000011BB 6246 OUTEND EQU $ 11BB 9F45 1181 6247 JMP *MCSOUT EXIT  00000008 6248 MCNECHO EQU :8 00000023 6249 MC0023 EQU :23 11BC 0000 6250 MCTMP1 RES 1,0 6251 * 1PAGE 0246 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:39.50 INPUT/OUTPUT UTILITIES (SETRDY) 6253 ****************************** 6254 * 6255 * SETRDY SET THE MULTI-CHANNEL TO READY 6256 * 6257 *  THIS ROUTINE RESETS THE MULTI-CHANNEL 6258 * INTO A READY STATE. 6259 *  6260 * CALLING SEQUENCE: 6261 * 6262 * JST SETRDY 6263 * 6264 ****************************** 6265 * 11BD 0E0D 6266 SETRDY ENT 11BE 6900 6267 COPY =0,Y 11BF 6443 6268 SELP Y,MCSDA;3 RESET MULTI-CHANNEL BOARD 11C0 74  BF 11C0 6269 IJNE Y,$ WAIT A LITTLE WHILE 11C1 6908 6270 COPY =:8,Y UN-RESET CODE 11C2 6443 6271 SELP Y,MCSDA;3 BOARD CONTROL WORD 11C3 6902 6272 COPY =2,Y  MEANINGLESS VALUE TO ... 11C4 6241 6273 OUT Y,MCSDA;1 JUST FORCE CH 0 TO TAKE 11C5 6243  6274 OUT Y,MCSDA+2;1 JUST FORCE CH 1 TO TAKE 11C6 6950 6275 COPY =:50,Y FOR INTERNAL RESET (CONTROL WORD) 11C7 6241 6276 OUT Y,MCSDA;1 IN ORDER TO SEND THE...(CH 0) 11C8 6243 6277 OUT Y,MCSDA+2;1 IN ORDER TO SEND THE...(CH 1) 11C9 69BA 6278 COPY =CRTMODE,Y CRT MODE WORD 11CA 6241 6279 OUT Y,MCSDA;1 SEND CRT MODE WORD TO CH 0 11CB 698E 6280 COPY  =LPMODE,Y LP MODE WORD 11CC 6243 6281 OUT Y,MCSDA+2;1 SEND LP MODE WORD TO CH 1 11CD 9F6F 11BD 6282 JMP *SETRDY EXIT 6283 * 000000BA 6284 CRTMODE EQU :BA 0000008E  6285 LPMODE EQU :8E 6286 * 0004 6287 LPOOL 11CE 1PAGE 0247 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:40.75 INPUT/OUTPUT UTILITIES (SETRDY) 11CF 11D0 11D1 1PAGE 0248 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:41.00 INPUT/OUTPUT UTILITIES (OHEXW & OHEXB) 6289 ****************************** 6290 *  6291 * OHEXB - DISPLAY HEX BYTE 6292 * OHEXW - DISPLAY HEX WORD 6293 * THIS SUBROUTINE WILL PRINT THE 6294 * ASCII-HEXADECIMAL EQUIVALENT OF A 6295 * HEX NUMBER CONTAINED IN THE A-REG. WITH 6296 * A COLON ':' PRECEDING THE NUMBER. 6297  * 6298 * THIS SUBROUTINE WILL BE BYPASSED IF THE 6299 * SENSE SWITCH IS SET. 6300 * 6301 * CALLING SEQUENCE: 6302 * COPY =NUMBER,A  6303 * JSK OHEXB OR OHEXW 6304 * 6305 * ENTER WITH NUMBER IN  6306 * THE A-REG. 6307 * 6308 ******************************  6309 * 000011D2 6310 OHEXB EQU $ DISPLAY HEX BYTE 11D2 4309 6311 PUSH :10 SAVE ALL 11D3 0010 11D4 0E71 6312 SHIFT A,LO,8 SHIFT INTO UPPER BYTE 11D5 48FE 6313 COPY =-2,Q SET DIGIT COUNT 11D6 9E83 11DA 6314 JMP OHEX0 DO IT  6315 * 000011D7 6316 OHEXW EQU $ DISPLAY HEX WORD 11D7 4309 6317 PUSH :10  SAVE ALL 11D8 0010 11D9 48FC 6318 COPY =-4,Q SET DIGIT COUNT 11DA A3BA 1215 6319 OHEX0 COPY CONSOL,X IS THERE A PROG CONSOLE? 11DB 3141 11DD 6320 JEQ X,$+2 NO CONSOLE, OUTPUT H  EX 11DC 164E 11EB 6321 JT SS,OHEX2 YES CONSOLE; IF SSW ON, EXIT. 11DD 2000 6322 COPY  A,X INITIALIZE THE X-REG. 1PAGE 0249 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:42.00 INPUT/OUTPUT UTILITIES (OHEXW & OHEXB) 11DE 093A 6323 COPY =':',A GET ASCII ':' 11DF FFB6 1216 6324 JSK OTTY OUTPUT ':' 11E0 9E81 11E2 6325 JMP $+2 DON'T SHIFT 11E1 2E31 6326 OHEX1 SHIFT X,LO,4 GET HEXT DIGIT INTO PLACE 11E2 0020 6327 COPY X,A PUT INTO THE A-REG. 11E3 0E79 6328 SHIFT A,RO,8 SHIFT TO L.S. NIBBLE 11E4 0E39  6329 SHIFT A,RO,4 CONT. TO SHIFT 11E5 0D09 6330 CSK A,=9 IS DIGIT 9 OR LESS 11E6 9E81 11E8 6331 JMP $+2 YES, CONVERT TO ASCII 11E7 0B07 6332 ADD =7,A  NO, ADD OFFSET FIRST 11E8 0B30 6333 ADD ='0',A CONVERT TO ASCII 11E9 FFAC 1216 6334  JSK OTTY OUTPUT DIGIT 11EA 54B6 11E1 6335 IJNE Q,OHEX1 LOOP FOR MORE 11EB 6309 6336 OHEX2 POP RESTORE ALL 11EC 2309 6337 RSK OHEX EXIT 1PAGE 0250 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:43.00 INPUT/OUTPUT UTILITIES (OBINB & OBINW) 6339 ****************************** 6340 * 6341 * OBINB - OUTPUT BINARY HEX BYTE 6342 * OBINW - OUTPUT BINARY HEX WORD 6343 * 6344 *  THIS SUBROUTINE WILL PRINT THE ASCII- 6345 * BINARY EQUIVALENT OF A HEX NUMBER  6346 * CONTAINED IN THE A-REG. WITHIN 6347 * PARENTHESES. 6348 *  6349 * THIS SUBROUTINE WILL BE BYPASSED IF THE 6350 * SENSE SWITCH IS SET.  6351 * 6352 * CALLING SEQUENCE: 6353 * 6354 * COPY =NUMBER,A 6355 * JSK OBINB OR JSK OBINW 6356 * 6357 * ENTER WITH NUMBER IN THE A-REG. 6358 * 6359 ****************************** 6360 * 000011ED 6361 OBINB EQU $ DISPLAY BINARY BYTE 11ED A3A7 1215 6362 COPY CONSOL,X IS THERE A PROG CONSOL? 11EE 3141 11F0 6363 JEQ X,$+2 NO CONSOLE, SO DO IT. 11EF 1653 1203 6364 JT SS,OBIN2 YES CONSOLE; IF SSW ON, EXIT. 11F0 8693 1204 6365 COPY A,OBTMP1 SAVE NUMBER 11F1 0928 6366 COPY ='(',A DISPLAY AN 11F2 FFA3 1216 6367 JSK OTTY ASCII '(' 11F3 9E88 11FC 6368 JMP OBIN1 JUMP 6369 * 000011F4 6370 OBINW EQU $ DISPLAY BINARY WORD 11F4 A3A0 1215 6371 COPY CONSOL,X IS THERE A PROG CONSOLE? 11F5  3141 11F7 6372 JEQ X,$+2 NO CONSOLE, SO DO IT. 11F6 164C 1203 6373 JT SS,OBIN2 YES CONSOLE; IF SSW ON, EXIT. 11F7 868C 1204 6374 COPY A,OBTMP1 SAVE NUMBER 1PAGE 0251 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:44.25 INPUT/OUTPUT UTILITIES (OBINB & OBINW) 11F8 0928 6375 COPY ='(',A DISPLAY AN 11F9 FF9C 1216 6376 JSK OTTY ASCII '(' 11FA 8289 1204 6377 COPY OBTMP1,A GET NUMBER 11FB FE89 1205 6378 JSK OBYTE DISPLAY UPPER BYTE 11FC 8287 1204 6379 OBIN1 COPY OBTMP1,A GET NUMBER 11FD 0E71 6380 SHIFT A,LO,8  PUT LOWER BYTE INTO UPPER 11FE FE86 1205 6381 JSK OBYTE DISPLAY LOWER BYTE 11FF 0920 6382  COPY =' ',A DISPLAY AN 1200 FF95 1216 6383 JSK OTTY ASCII SPACE 1201 0929 6384 COPY =')',A DISPLAY AN 1202 FF93 1216 6385 JSK OTTY ASCII ')' 1203 2309 6386 OBIN2 RSK EXIT 6387 * 1204 0000 6388 OBTMP1 RES 1,0 SAVED NUMBER 1PAGE 0252 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:44.75 INPUT/OUTPUT UTILITIES (OBYTE) 6390 ****************************** 6391 * 6392 * OBYTE - DISPLAY BINARY BYTE 6393 * 6394 * THIS SUBROUTINE WILL PRINT THE ASCII- 6395 * BINARY EQUIVALENT OF A HEX BYTE IN 6396 * THE A-REG.  6397 * 6398 * CALLING SEQUENCE: 6399 * COPY =BYTE,A 6400 * JSK OBYTE 6401 * 6402 ****************************** 6403 *  00001205 6404 OBYTE EQU $ DISPLAY BYTE 1205 4309 6405 PUSH :10 SAVE ALL  1206 0010 1207 6000 6406 COPY A,Y PUT NUMBER INTO Y-REG. 1208 48FE 6407 COPY  =-2,Q SET DIGIT COUNT 1209 28FC 6408 OBYTE1 COPY =-4,X SET BIT COUNT 120A 0920 6409 OBYTE2 COPY =' ',A DISPLAY AN 120B FF8A 1216 6410 JSK OTTY ASCII SPACE 120C 6E01 6411  OBYTE3 SHIFT Y,LO,1 SHIFT BIT INTO PLACE 120D 0930 6412 COPY ='0',A GET ASCII ZERO 120E 36C1 1210 6413 JF OV,$+2 IF NO OV, JUMP 120F 0B01 6414 ADD =1,A GET ASCII 1 1210 FF85 1216 6415 JSK OTTY DISPLAY IT 1211 34BA 120C 6416 IJNE X,OBYTE3 DO COUNT INC. 1212 54B6 1209 6417 IJNE Q,OBYTE1 DO COUNT INC. 1213 6309 6418 POP  RESTORE REGS. 1214 2309 6419 RSK EXIT 6420 * 0002 6421 LPOOL 1215 1317 CONSOL 1216 1124 OTTY 1PAGE 0253 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM   93720-10C1 1982/09/30 09:03:46.00 INPUT/OUTPUT UTILITIES (IHEX) 6423 ******************************  6424 * 6425 * IHEX - THIS SUBROUTINE WILL INPUT, FROM THE CRT/TTY, 6426 *  AN ASCII-HEXADECIMAL NUMBER WHICH IT WILL 6427 * CONVERT TO BINARY AND RETURN IT IN THE X-REG.  6428 * 6429 * DURING THIS SUBROUTINE, A QUESTION MARK '?' IS 6430 *  OUTPUT IF THE INPUT VALUE BECOMES GREATER THAN 6431 * :FFFF. THE ROUTINE THEN RESTARTS THE INPUT. 6432 * 6433 * THIS SUBROUTINE IS EXITED UPON INPUT OF THE FIRST  6434 * NON ASCII-HEXADECIMAL CHAR., WHICH IT WILL RETURN 6435 * IN THE A-REG.  6436 * 6437 * CALLING SEQUENCE: 6438 * JSK IHEX 6439 *  6440 ***************************** 6441 * 00001217 6442 IHEX EQU $ SUBROUTINE ENTRANCE 1217 2900 6443 COPY =0,X SET INITIAL VALUE FOR 0 1218 A69A 1233 6444  COPY X,HXTMP2 RESET INPUT COUNT 1219 FF9A 1234 6445 IHEX1 JSK IKB GET CHAR. 121A 8697 1232 6446 COPY A,HXTMP1 STORE POSSIBLE TERMINATING CHAR. 121B 0AD0 6447 SUB ='0',A SUBTRACT ASCII 0 121C 13C9 1226 6448 JLT A,IHEX2 IF LESS THAN 0 EXIT 121D 0D0A 6449 CSK A,=10 IS CHAR. 0-9? 121E 9E89 1228 6450 JMP IHEX3 YES, SET VALUE 121F 0000 6451  NOP 1220 0AF9 6452 SUB =7,A SUBTRACT FOR ASCII A-F 1221 0D0F 6453 CSK A,=15 IS CHAR. NON-HEX A-F? 1222 0D0A 6454 CSK A,=10 DITTO 1223 9E82 1226 6455 JMP IHEX2 YES, IT IS BAD 1224 9E83 1228 6456 JMP IHEX3 NO, IT IS GOOD 1225 9E82 1228 6457  JMP IHEX3 DITTO 1226 828B 1232 6458 IHEX2 COPY HXTMP1,A SET TERMINATING CHAR. IN A-REG. 1PAGE 0254 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:47.25 INPUT/OUTPUT UTILITIES (IHEX) 1227 2309 6459 RSK IHEX EXIT 1228 2E31 6460 IHEX3 SHIFT X,LO,4 SHIFT X FOR POSITION OF DIGIT 1229 2007 6461 OR A,X PUT DIGIT INTO PLACE 122A DE88 1233 6462 IMS HXTMP2 INC. INPUT COUNT 122B 8287 1233 6463 COPY HXTMP2,A GET INPUT COUNT 122C 0C05 6464 CLSN A,=5 5 INPUTS? 122D 9E81 122F 6465 JMP $+2 YES, OUTPUT '?' 122E 9E6A 1219 6466 JMP IHEX1 NO, CONT. 122F 093F 6467 COPY ='?',A  GET CHAR. 1230 FF65 1216 6468 JSK OTTY '?' 1231 9E65 1217 6469 JMP IHEX START OVER 6470 * 1232 0000 6471 HXTMP1 RES 1,0 TERMINATING CHAR. 1233 0000 6472  HXTMP2 RES 1,0 INPUT COUNT 6473 * 0001 6474 LPOOL 1234 10D2 IKB 1PAGE 0255 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:48.00 INPUT/OUTPUT UTILITIES (ODEC) 6476 ****************************** 6477 * 6478 * ODEC - THIS SUBROUTINE WILL PRINT THE 6479 * ASCII-DECIMAL EQUIVALENT OF A HEXADECIMAL 6480 * NUMBER CONTAINED IN THE A-REG. IF THE NUMBER 6481 * IS IN THE RANGE OF DECIMAL 0 TO 9999.  6482 * 6483 * IF THE NUMBER IS GREATER THAN OR EQUAL TO 6484 *  DECIMAL 10000, THEN '****' WILL BE PRINTED. 6485 * 6486 * LEADING ZEROS WILL NOT BE PRINTED. 6487 * 6488 * THIS SUBROUTINE WILL BE BYPASSED IF THE 6489 * SENSE SWITCH IS SET. 6490 * 6491 * CALLING SEQUENCE: 6492 * COPY =NUMBER,A 6493 * JSK ODEC 6494 * 6495 ****************************** 6496 * 00001235 6497 ODEC EQU $ PRINT A DECIMAL NUMBER 1235 C6B3 1269 6498 COPY Q,ODTMP6 SAVE Q-REG. 1236 C35E 1215 6499 COPY CONSOL,Q IS THERE A PROG CONSOLE? 1237 5141 1239 6500 JEQ Q,$+2 NO CONSOLE, SO DO IT. 1238 1663 125C 6501 JT SS,ODEC7 YES CONSOLE; IF SSW IS ON, EXIT. 1239 C2AF 1269 6502 COPY ODTMP6,Q RESTORE Q-REG. 123A A6A9 1264 6503 COPY X,ODTMP1 SAVE THE X-REG. 123B 86A9 1265 6504 COPY A,ODTMP2 SAVE THE NUMBER TO BE PRINTED 123C BAAE 126B 6505 CSK A,=10000 IS THE NUMBER >= 10000? 123D 9E84 1242 6506 JMP ODEC1 NO, PRINT NUMBER 123E 0000 6507 NOP 123F BFAA 126A 6508 JST MSGA  PRINT STARS MESSAGE 1240 177C 6509 WORD STRMSG '****' 1241 9E99 125B 6510 JMP ODEC6 RESTORE X-REG. AND EXIT 1242 1243 1246 6511 ODEC1 JGT A,ODEC2 IF NOT ZERO, PRINT NUMBER 1PAGE 0256 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:49.25 INPUT/OUTPUT UTILITIES (ODEC) 1243 0930 6512 COPY ='0',A OTHERWISE, PRINT A ZERO 1244 FF51 1216 6513 JSK OTTY PRINT IT 1245 9E95 125B 6514 JMP ODEC6 RESTORE X-REG. AND EXIT 1246 82A5 126C 6515 ODEC2 COPY =ODCTBL,A GET CONVERSION TABLE ADD. 1247 869E 1266 6516 COPY A,ODTMP3 SAVE ADD. 1248 0900 6517 COPY =0,A RESET LEADING ZEROES FLAG 1249 869D 1267 6518 COPY A,ODTMP4 STORE FLAG 124A 08FC 6519 COPY =-4,A SET DIGIT COUNT 124B 869C 1268 6520 COPY A,ODTMP5 SAVE COUNT 124C 8298 1265 6521 ODEC3 COPY ODTMP2,A GET NUMBER 124D 28FF 6522 COPY = -1,X SET X-REG. TO -1 124E 8F97 1266 6523 SUB *ODTMP3,A SUBTRACT POWER OF TEN FROM NUMBER 124F 2B01 6524 ADD =1,X INC. THE X-REG. 1250 133D 124E 6525 JGE A,$-2 IF NUMBER IS NOT NEGATIVE, CONT. SUBTRACTING 1251 8B94 1266 6526 ADD *ODTMP3,A ADD IN LAST POWER OF TEN 1252 8692 1265 6527 COPY A,ODTMP2 SAVE NUMBER 1253 3149 125D 6528 JEQ X,ODEC8 IF DIGIT IS ZERO, SEE IF IT IS A LEADING ZERO 1254 A692 1267 6529 COPY X,ODTMP4 SET LEADING ZEROES FLAG 1255 2B30 6530 ODEC4 ADD ='0',X ADD IN ASCII OFFSET 1256 0020 6531 COPY X,A PUT INTO THE A-REG. 1257 FF3E 1216 6532 JSK OTTY PRINT THE DIGIT 1258 DE8D 1266 6533 ODEC5 IMS ODTMP3 INC. CONVERSION TABLE ADD. 1259 DE8E 1268 6534 IMS ODTMP5 INC. DIGIT COUNT 125A 9E71 124C 6535 JMP ODEC3 GO FOR MORE 125B A288 1264 6536 ODEC6 COPY ODTMP1,X RESTORE THE X-REG. 125C 2309 6537 ODEC7 RSK ODEC EXIT 125D 8289 1267 6538 ODEC8 COPY ODTMP4,A GET LEADING ZEROES FLAG 125E 1139 1258 6539 JEQ A,ODEC5 IF RESET, DON'T PRINT A ZERO 125F 9E75 1255 6540 JMP ODEC4  OTHERWISE, DO PRINT A ZERO 6541 * 1260 03E8 6542 ODCTBL WORD 1000,100,10,1 HEX TO DECIMAL CONVERSION TABLE 1261 0064 1262 000A 1263 0001 6543 * 1264 0000 6544 ODTMP1 RES 1,0  SAVED X-REG. 1PAGE 0257 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:50.75 INPUT/OUTPUT UTILITIES (ODEC) 1265 0000 6545 ODTMP2 RES 1,0 NUMBER TO BE PRINTED 1266 0000  6546 ODTMP3 RES 1,0 HEX TO DECIMAL CONVERSION TABLE ADD. 1267 0000 6547 ODTMP4 RES 1,0  LEADING ZEROES FLAG 1268 0000 6548 ODTMP5 RES 1,0 DIGIT COUNT 1269 0000 6549 ODTMP6 RES  1,0 SAVED Q-REG. 6550 * 0003 6551 LPOOL 126A 10BD MSGA 126B 2710 126C 1260 ODCTBL 1PAGE 0258 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:51.25 PROGRAM UTILITIES (CHARCK) 6553 ****************************** 6554 * 6555 * CHARCK - WILL CHECK TERMINATING INPUT 6556 * CHAR. FOR SPECIAL CHARS. 6557 *  6558 * CALLING SEQUENCE: 6559 * JST CHARCK 6560 * JMP ? '/' R 6561 * JMP ? '^' R+1 6562 * JMP ? '_' R+2 6563 * JMP ? CARRIAGE RETURN R+3 6564 *  JMP ? '#' R+4 6565 * JMP ? ',' R+5 6566 * JMP ? ANYTHING ELSE R+6 6567 * 6568 * ENTER WITH TERMINATING CH AR. 6569 * IN THE A-REG. 6570 * 6571 ****************************** 6572 * 126D 0E0D 6573 CHARCK ENT CHECK FOR SPECIAL CHARS. 126E 0C2F 6574 CLSN A,='/' IS IT A SLASH? 126F 9F7D 126D 6575 JMP *CHARCK YES, RETURN TO STD ADD R 1270 DE7C 126D 6576 IMS CHARCK NO, INC. RETURN ADD. 1271 0C5E 6577 CLSN A,='^' IS IT A UP ARROW? 1272 9F7A 126D 6578 JMP *CHARCK YES, RETURN TO ADD. R+1 1273 DE79 126D 6579 IMS CHARCK NO, INC. RETURN ADD. 1274 0C5F 6580 CLSN A,='_' IS IT A BACK ARROW? 1275 9F77 126D 6581 JMP *CHARCK YES, RETURN TO ADD. R+2 1276 DE76 126D 6582 IMS CHARCK NO, INC. RETURN ADD. 1277 0C0D 6583 CLSN A,=CR IS IT A CARRIAGE RETURN? 1278 9F74 126D 6584 JMP *CHARCK YES, RETURN TO ADD. R+3 1279 DE73 126D 6585 IMS CHARCK NO, INC. RETURN ADD. 127A 0C23 6586 CLSN A,='#' IS IT A POUND SIGN? 127B 9F71 126D 6587  JMP *CHARCK YES, RETURN TO ADD. R+4 127C DE70 126D 6588 IMS CHARCK NO, INC. RETURN ADD. 1PAGE 0259 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:53.00 PROGRAM UTILITIES (CHARCK) 127D 0C2C 6589 CLSN A,=',' IS IT A COMMA? 127E 9F6E 126D 6590 JMP *CHARCK YES, RETURN TO ADD. R+5 127F DE6D 126D 6591 IMS CHARCK NO, INC. RETURN ADD. 1280 9F6C 126D 6592 JMP *CHARCK ANYTHING ELSE RETURN ADD. R+6 1PAGE 0260 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:53.25 PROGRAM UTILITIES (RLPCRT) 6594 ****************************** 6595 * 6596 * RLPCRT - RESET CRT/TTY & LP & UFDC  6597 * 6598 * CALLING SEQUENCE: 6599 * JSK RLPCRT 6600 *  6601 ****************************** 6602 * 00001281 6603 RLPCRT EQU $  SUBROUTINE ENTRANCE 1281 0900 6604 COPY =0,A RESET A-REG. 1282 3000 6605 COPY  A,S PUT INTO S-REG. 1283 FF88 128C 6606 JSK WRMDRG RESET UFDC 1284 14BF 1284 6607  IJNE A,$ WAIT FOR A WHILE 1285 0201 6608 OUT A,CONSL;INT RESET CONSOLE INT. 1286 0200 6609 OUT A,CONSL;SSW RESET CONSOLE SSW. 1287 8285 128D 6610 COPY =:100,A GET RESET COM. 1288 02FF 6611 OUT A,DLPDA%1;1 RESET LP 1289 02F9 6612 OUT A,DTTYDA%1;1 RESET CRT/TTY 128A FE84 128F 6613 JSK CRLF OUTPUT YOU KNOW WHAT 128B 2309 6614 RSK  RLPCRT EXIT 6615 * 0003 6616 LPOOL 128C 0E40 WRMDRG 128D 0100 128E 1PAG E 0261 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:54.00 PROGRAM UTILITIES (CRLF) 6618 ****************************** 6619 * 6620 * CRLF - OUTPUT CARRIAGE RETURN/LINE FEED 6621 * 6622 * CALLING SEQUENCE: 6623 *  JSK CRLF 6624 * 6625 ****************************** 6626 * 0000128F 6627 CRLF EQU $ OUTPUT YOU KNOW WHAT 128F 090D 6628 COPY =CR,A CARRIAGE RETURN 1290 FF05 1216 6629 JSK OTTY SEND IT AWAY 1291 090A 6630 COPY =LF,A LINE FEED 1292 FF03 1216 6631 JSK OTTY SEND IT AWAY TOO 1293 2309 6632 RSK  CRLF RETURN TO WHENCE CAME FROM 1PAGE 0262 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:54.50 PROGRAM UTILITIES (MOVE) 6634 ****************************** 6635 * 6636 * MOVE - MOVE A BLK. OF DATA. THIS SUBROUTINE 6637 * IS USED TO MOVE A BLK. OF DATA FROM 6638 * ONE AREA OF MEMORY TO ANOTHER. 6639 * 6640  * ENTER WITH NEGATIVE DATA LENGTH IN THE A-REG. 6641 * 6642 * CALLING SEQUENCE:  6643 * COPY =-DATA LENGTH,A 6644 * JST MOVE 6645 * WORD AREA1 ADD. OF 'FROM AREA' 6646 * WORD AREA2 ADD. OF 'TO AREA' 6647 * 6648 ******************************* 6649 * 1294 0E0D 6650 MOVE ENT  MOVE DATA SUBROUTINE 1295 868D 12A3 6651 COPY A,MOVECT SAVE DATA LENGTH 1296 837D 1294 6652  COPY *MOVE,A GET 'FROM' ADD. 1297 868C 12A4 6653 COPY A,MOVEFM SAVE ADD. 1298 DE7B 1294 6654 IMS MOVE INC. RETURN ADD. 1299 837A 1294 6655 COPY *MOVE,A GET 'TO' ADD. 129A 868A 12A5 6656 COPY A,MOVETO SAVE ADD. 129B DE78 1294 6657 IMS MOVE INC. RETURN ADD. 129C 8387 12A4 6658 MOVE1 COPY *MOVEFM,A GET A WORD OF DATA 129D 8787 12A5 6659 COPY A,*MOVETO  STORE IN NEW LOCATION 129E DE85 12A4 6660 IMS MOVEFM INC. 'FROM' ADD. 129F DE85 12A5 6661  IMS MOVETO INC. 'TO' ADD. 12A0 DE82 12A3 6662 IMS MOVECT INC. DATA LENGTH 12A1 9E7A 129C  6663 JMP MOVE1 LOOP FOR MORE 12A2 9F71 1294 6664 JMP *MOVE EXIT  6665 * 12A3 0000 6666 MOVECT RES 1,0 DATA LENGTH 12A4 0000 6667 MOVEFM RES 1,0  'FROM' ADD. 12A5 0000 6668 MOVETO RES 1,0 'TO' ADD. 1PAGE 0263 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:56.00 TRAPS' AND CONSOLE INT. SERVICE ROUTINES  6670 ****************************** 6671 * 6672 * TRAP SERVICE ROUTINES  6673 * 6674 ****************************** 6675 * 6676 * UNIMPLEMENTED INSTRUCTION TRAP 6677 * 12A6 0E0D 6678 UITRT ENT UNI. INSTR. TRAP SERVICE ROUTINE 12A7 0E3F 6679 SIN 4 STATUS INHIBIT 12A8 A2BD 12E6 6680 COPY =INSMSG,X GET TRAP MESSAGE ADD. 12A9 82BD 12E7 6681 COPY =ER3100,A GET TRAP CDR DISPLAY 12AA 4900 6682 SRT2 COPY =0,Q SET Q-REG. TO ZERO 12AB 3040 6683 COPY Q,S SET PSW TO ZERO 12AC A686 12B3 6684 COPY X,SR:MSG SAVE MESSAGE ADD. 12AD 4104 6685 IN CONSL;CDR,Q GET CDR DISPLAY 12AE 58FF 6686 AND =:FF,Q MASK FOR TESTS ONLY 12AF 4007 6687 OR A,Q  'OR' IN CDR ERROR DISPLAY 12B0 4404 6688 SELP Q,CONSL;CDR SEND TO CDR 12B1 FE4F 1281 6689 JSK RLPCRT RESET LP & CRT/TTY 12B2 BF37 126A 6690 JST MSGA OUTPUT ERROR MESSAGE 12B3 0000 6691 SR:MSG WORD 0 MESSAGE ADD. 12B4 0E0D 6692 HLT WAIT HERE 12B5 82C3 12F9 6693 COPY MDEFLG,A GET MODE FLAG 12B6 11BD 12B4 6694 JNE A,$-2 IF DEMAND MODE, LOOP BACK 12B7 9FB0 12E8 6695 JMP STRTUP ELSE, GO TO QUERIES 6696 *  6697 * UNINSTALLED MEMORY TRAP 6698 * 12B8 0E0D 6699 UMRT ENT UNI. MEM. TRAP SERVICE ROUTINE 12B9 0E4F 6700 SIN 5 STATUS INHIBIT 12BA A2AE 12E9 6701 COPY  =MEMMSG,X GET TRAP MESSAGE ADD. 12BB 82AE 12EA 6702 COPY =ER3200,A GET TRAP CDR DISPLAY 12BC 9E6D 12AA 6703 JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY 6704 * 6705 * POWER UP 1PAGE 0264 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:57.25 TRAPS' AND CONSOLE INT. SERVICE ROUTINES 6706 * 12BD 0E0D 6707 POWRUP ENT PWR. UP SERVICE ROUTINE 12BE 0E4F 6708 SIN 5 STATUS INHIBIT 12BF A2AB 12EB 6709 COPY =POWMSG,X GET TRAP MESSAGE ADD. 12C0 82AB 12EC 6710 COPY =ER3300,A GET TRAP CDR DISPLAY 12C1 9E68 12AA 6711  JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY 6712 * 6713 * POWER FAIL  6714 * 12C2 0E0D 6715 PFRT ENT PWR. FAIL SERVICE ROUTINE 12C3 0E0D 6716  HLT WAIT FOR POWER 6717 * 6718 * STACK OVERFLOW 6719  * 12C4 0E0D 6720 SORT ENT STK. OVR. TRAP SERVICE ROUTINE 12C5 0E4F 6721 SIN  5 STATUS INHIBIT 12C6 A2A6 12ED 6722 COPY =STKMSG,X GET TRAP MESSAGE ADD. 12C7 82A6 12EE 672 3 COPY =ER3400,A GET TRAP CDR DISPLAY 12C8 9E61 12AA 6724 JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY 6725 * 6726 * USER TRAP 6727 * 12C9 0E0D 6728 UTRT  ENT USER TRAP SERVICE ROUTINE 12CA 0E4F 6729 SIN 5 STATUS INHIBIT 12CB A2A3 12EF 6730 COPY =USEMSG,X GET TRAP MESSAGE ADD. 12CC 82A3 12F0 6731 COPY =ER3500,A GET TRAP CDR DISPLAY 12CD 9E5C 12AA 6732 JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY 6733 *  6734 * SYSTEM TRAP 6735 * 12CE 0E0D 6736 STRT ENT SYSTEM TRAP SERVICE ROUTINE 12CF 0E4F 6737 SIN 5 STATUS INHIBIT 12D0 A2A0 12F1 6738 COPY =SYSMSG,X GET TRAP MESSAGE ADD. 12D1 82A0 12F2 6739 COPY =ER3600,A GET TRAP CDR DISPLAY 12D2 9E57 12AA 6740 JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY 6741 * 1PAGE 0265 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:58.50 TRAPS' AND CONSOLE INT. SERVICE ROUTINES  6742 * ARITHMETIC TRAP 6743 * 12D3 0E0D 6744 AERT ENT ARIT. TRAP SERVICE ROUTINE 12D4 0E4F 6745 SIN 5 STATUS INHIBIT 12D5 A29D 12F3 6746 COPY =ARIMSG,X GET TRAP MESSAGE ADD. 12D6 829D 12F4 6747 COPY =ER3700,A GET TRAP CDR DISPLAY 12D7 9E52 12AA 6748 JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY 6749 * 1PAGE 0266 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:59.00 TRAPS' AND CONSOLE INT. SERVICE ROUTINES  6751 ****************************** 6752 * 6753 * CONSOLE INT. SERVICE ROUTINE  6754 * 6755 * 6756 ****************************** 6757 * 12D8 0E0D 6758 CIRT ENT CONSOLE INT. SERVICE ROUTINE 12D9 0E1F 6759 SIN 2  STATUS INHIBIT 12DA 0900 6760 COPY =0,A RESET A-REG. 12DB 3000 6761 COPY  A,S RESET STATUS REG. 12DC FE24 1281 6762 JSK RLPCRT RESET TTY/CRT & LP 12DD 0104 6763 IN CONSL;CDR,A INPUT CDR DISPLAY 12DE 18FF 6764 AND =:FF,A MASK FOR TESTS ONLY 12DF B695 12F5 6765 OR =ER3000,A 'OR' IN CDR DISPLAY 12E0 0404 6766 SELP A,CONSL;CDR OUTPUT TO CDR DISPLAY 12E1 8297 12F9 6767 COPY MDEFLG,A GET MODE FLAG 12E2 11C1 12E4 6768 JNE A,$+2 JUMP IF DEMAND MODE 12E3 9F92 12F6 6769 JMP QERY10 GO TO START UP 12E4 0E0D  6770 HLT HALT HERE IF DEMAND MODE 12E5 9E7E 12E4 6771 JMP $-1 LOOP BACK 6772 * 0012 6773 LPOOL 12E6 1727 INSMSG 12E7 3100 ER3100 12E8 0204 STRTUP 12E9 1739  MEMMSG 12EA 3200 ER3200 12EB 1747 POWMSG 12EC 3300 ER3300 12ED 174F STKMSG 12EE 3400 ER3400 12EF 1759 USEMSG 12F0 3500 ER3500 12F1 1760 SYSMSG 12F2 3600 ER3600 1PAGE 0267 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:03:59.75 TRAPS' AND CONSOLE INT. SERVICE ROUTINES 12F3 1768 ARIMSG 12F4 3700 ER3700 12F5 3000 ER3000 12F6 022A QERY10 12F7 1PAGE 0268 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:00.00 TABLES (GLOBAL VARIABLES) 6775 ****************************** 6776 *  6777 * GLOBAL VARIABLES 6778 * 6779 * THESE VARIABLES ARE USED THROUGH OUT THE PROGRAM. 6780 * 6781 ****************************** 6782 * 18C3 18E3 6783 OPTIONS +:20 6784 * 12F8 0000 6785 PASSN WORD 0 PASS NUMBER  6786 * 12F9 0000 6787 MDEFLG WORD 0 MODE FLAG (DEFAULT OR DEMAND) 6788 * 12FA 0000 6789 LPFLG WORD 0 LP FLAG 6790 * 12FB 0000 6791 MCSFLG WORD 0  MULTI-CHANNEL FLAG 6792 * 12FC 0000 6793 TEMP1 WORD 0 TEMP. CELL  6794 * 12FD 0000 6795 TEMP2 WORD 0 TEMP. CELL 6796 * 12FE 0000 6797 TEMP3 WORD 0 TEMP. CELL 6798 * 12FF 0000 6799 TEMP4 WORD 0 TEMP. CELL 6800 * 1300 0000 6801 HARDE RES 4,0 ERROR TALLY HARD 6802 * 1304 0003 6803 TSTCDR WORD 3 CDR TEST GROUP DISPLAY 6804 * 1305 0000 6805 TBLADD WORD 0 TEST GROUP TABLE ADD. 1PAGE 0269 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:01.25 TABLES (GLOBAL VARIABLES) 1306 0002 6807 TESTFLG WORD 2 QUERY JUMP FLAG 6808 1 = TEST GROUP 6809  2 = DIALOG 6810 3 = TECH TEST 6811  4 = DEFAULT 6812 * 1307 0001 6813 INTFLG WORD 1 INTERRUPT FLAG  6814 * 1308 0000 6815 TSTFUNC WORD 0 TECH TEST FUNCTION 6816 * 1309 A5A5 6817 WPAT WORD :A5A5 TECH TEST WORD PATTERN 6818 * 130A 1300 6819 ERRTADD  WORD HARDE ERROR TALLY TABLE ADD. 6820 * 130B 1340 6821 UNTADD WORD UNITS UNIT TABLE ADD. 6822 * 130C 1330 6823 TSTADD WORD TESTS TEST TABLE ADD. 6824 * 130D 0100 6825 NBYTES WORD 256 BYTES/SECTOR 6826 * 130E 0000 6827 SC  WORD 0 SECTORS/TRCK 6828 * 130F 0000 6829 GPL WORD 0 GAP LEN GTH 6830 * 1310 0000 6831 TRM WORD 0 CURRENT TRACK 6832 * 1311 0000 6833 HEAD WORD 0 CURRENT HEAD 6834 * 1312 0000 6835 SECTOR WORD  0 CURRENT SECTOR 6836 * 1313 0000 6837 UNIT WORD 0 CURRENT UNIT  6838 * 1314 0000 6839 UNITA WORD 0 FIRST UNIT 6840 * 1315 0000 6841 UNITB WORD 0 SECOND UNIT 6842 * 1PAGE 0270 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:02.25 TABLES (GLOBAL VARIABLES) 1316 0001 6843 FIRST WORD  1 1ST COMMAND TO READ ADD-MARK 6844 * 1317 0000 6845 CONSOL WORD 0 PROGRAMMER-CONSOLE FLAG 1PAGE 0271 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:02.25 TABLES (SECTORS/TRACK & GAP LENGTHS) 6847 ****************************** 6848 *  6849 * SECTORS/TRACK AND 6850 * GAP LENGTHS FOR SINGLE/DOUBLE DENSITY 6851 * 5 1/4" OR 8" DRIVES. 6852 * 6853 ****************************** 6854  * 00001318 6855 SDTABLE EQU $ SINGLE DENSITY TABLE 1318 001A 6856 WORD 26  8" - SECTORS/TRACK - 128 BYTES 1319 071B 6857 WORD :071B GPL(1) & GPL(2) 6858 * 131A 0010 6859 WORD 16 5" - SECTORS/TRACK - 128 BYTES 131B 071B 6860 WORD  :071B GPL(1) & GPL(2) 6861 * 131C 000F 6862 WORD 15 8" - SECTORS/TRACK - 256 BYTES 131D 0E2A 6863 WORD :0E2A GPL(1) & GPL(2) 6864 * 131E 0008  6865 WORD 8 5" - SECTORS/TRACK - 256 BYTES 131F 0E2A 6866 WORD :0E2A GPL(1) & GPL(2) 6867 * 1320 0008 6868 WORD 8 8" - SECTORS/TRACK - 512 BYTES 1321 1B3A 6869 WORD :1B3A GPL(1) & GPL(2) 6870 * 1322 0004 6871 WORD 4 5" - SECTORS/TRACK - 512 BYTES 1323 1B3A 6872 WORD :1B3A GPL(1) & GPL(2)  6873 * 6874 * 6875 * 00001324 6876 DDTABLE EQU $ DOUBLE DENSITY TABLE 1324 FFFF 6877 WORD -1 8" - 128 BYTES (INVALID) 1325 FFFF 6878  WORD -1 6879 * 1326 FFFF 6880 WORD -1 5" - 128 BYTES (INVALID) 1327 FFFF 6881 WORD -1 6882 * 1PAGE 0272 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:03.50 TABLES (SECTORS/TRACK & GAP LENGTHS) 1328 001A 6883 WORD 26 8" - SECTORS/TRACK - 256 BYTES 1329 0E36 6884 WORD :0E36 GPL(1) & GPL(2)   6885 * 132A 0010 6886 WORD 16 5" - SECTORS/TRACK - 256 BYTES 132B 0E36 6887  WORD :0E36 GPL(1) & GPL(2) 6888 * 132C 000F 6889 WORD 15 8" - SECTORS/TRACK - 512 BYTES 132D 1B54 6890 WORD :1B54 GPL(1) & GPL(2) 6891 * 132E 0009 6892 WORD 9 5" - SECTORS/TRACK - 512 BYTES 132F 1B54 6893 WORD :1B54  GPL(1) & GPL(2) 1PAGE 0273 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:03.75 TABLES (WORKING-PARAMETER TABLE) 6895 ******************************* 6896 *  6897 * WORKING PARAMETER TABLE 6898 * 6899 * TABLE MUST BE KEPT IN ORDER  6900 * 6901 ****************************** 6902 * 00001330 6903 PRAMS EQU $ START OF WORKING-PARAMETER TABLE 6904 * 1330 0655 6905 TESTS WORD TESTA 1331 0691 6906 WORD TESTB 1332 07AD 6907 WORD TESTF (FORMAT) 1333 06BF  6908 WORD TESTC 1334 06FF 6909 WORD TESTD 1335 0759 6910 WORD TESTE  1336 07DA 6911 WORD TESTG 1337 082F 6912 WORD TESTH 1338 087F 6913 WORD TESTI 1339 08DB 6914 WORD TESTJ 133A FFFF 6915 WORD -1,-1 TERMINATORS  0000000C 6916 TSTSZE EQU $-TESTS 6917 * 133C 0001 6918 INTDIS WORD 1 0=NO INTERRUPTS, 1=INTERRUPTS ON 6919 * 133D 0000 6920 DRIVE WORD 0 0=8" FLOPPY, 1=5 1/4" FLOPPY 6921 * 133E 0001 6922 STEPINV WORD 1 0=NO INVERT STEP, 1=INVERT STEP  6923 * 133F 0006 6924 SRT WORD 6 1-15 MS STEP RATE TIME 6925 * 1340 0001 6926 UNITS WORD 1,2,0,0,0 4 UNITS TO TEST (1-4) 6927 * 1345 0049 6928 TRACKS WORD 73,76 LOW TRACK, HIGH TRACK 6929 * 1347 0001 6930 SECTORS WORD 1,26  LOW SECTOR, HIGH SECTOR 1PAGE 0274 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:05.00 TABLES (WORKING-PARAMETER TABLE) 6931 * 1349 0000 6932 HEADS WORD 0 0=HEAD 0, 1=HEAD 1, 2=BOTH HEADS 6933 * 134A 0001 6934 DENSITY WORD 1 0=SINGLE, 1=DOUBLE 6935 * 134B 0001 6936 N WORD 1 0=128, 1=256, 2=512 BYTES/SECTOR  6937 * 134C 00C6 6938 PATTERN WORD :C6 ONE BYTE DATA PATTERN 6939 * 134D 0030  6940 DEVADR WORD UFDCDA DEVICE ADR. OF UFDC 6941 * 134E 0005 6942 BDID WORD :5 BOARD ID 6943 * 134F 0000 6944 CNTWD WORD 0 CONTROL WORD   6945 * 00000020 6946 PRMSZ EQU $-PRAMS PARAMETER TABLE SIZE 1PAGE 0275 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:05.50 TABLES (RESET-PARAMETER TABLE) 6948 ****************************** 6949 * 6950 * RESET-PARAMETER (DIALOG) TABLE  6951 * 6952 * TABLE MUST BE KEPT IN ORDER. 6953 * 6954 ****************************** 6955 * 00001350 6956 DIALOG EQU $ START OF RESET-PARAMETER TABLE 1350 0655 6957 WORD TESTA 1351 07AD 6958 WORD TESTF (FORMAT) 1352 06BF  6959 WORD TESTC 1353 0759 6960 WORD TESTE 1354 07DA 6961 WORD TESTG 1355 082F 6962 WORD TESTH 1356 087F 6963 WORD TESTI 1357 08DB 6964 WORD TESTJ 1358 FFFF 6965 WORD -1 NO TEST B 1359 FFFF 6966 WORD -1  NO TEST D 135A FFFF 6967 WORD -1,-1 TERMINATORS 6968 * 135C 0001 6969  WORD 1 INTERRUPTS ON 6970 * 135D 0000 6971 WORD 0 8" FLOPPY 6972 * 135E 0001 6973 WORD 1 INVERT STEP 6974 * 135F 0006 6975 WORD 6 6MS STEP RATE TIME 6976 * 1360 0001 6977  WORD 1,2,0,0,0 UNITS 0 AND 1 6978 * 1365 0049 6979 WORD 73,76 LOW TRACK, HIGH TRACK 6980 * 1367 0001 6981 WORD 1,26 LOW SECTOR, HIGH SECTOR  6982 * 1369 0000 6983 WORD 0 HEAD 0 1PAGE 0276 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:06.75 TABLES (RESET-PARAMETER TABLE) 6984 * 136A 0001 6985 WORD 1 DOUBLE DENSITY 6986 * 136B 0001 6987 WORD 1 256 BYTES/SECTOR 6988 * 136C 00C6 6989 WORD :C6 DATA PATTERN  6990 * 136D 0030 6991 WORD UFDCDA DEVICE ADD. 6992 * 136E 0005  6993 WORD :5 BOARD ID 6994 * 136F 0000 6995 WORD 0  CONTROL WORD 1PAGE 0277 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:07.00  TABLES (SINGLE SIDED 5 1/4" PARAMETERS) 6997 ****************************** 6998 *  6999 * SINGLE SIDED 5 1/4" PARAMETER TABLE 7000 * 7001 * DEFAULTS FOR SINGLE SIDED 5 1/4" TEST GROUP. 7002 * TABLE MUST BE KEPT IN ORDER 7003 * 7004 ***************************** 7005 * 00001370 7006 SS5INTBL EQU $ START OF SINGLE SIDE D 5 1/4" PRAMS. 1370 0655 7007 WORD TESTA 1371 0691 7008 WORD TESTB 1372 07AD 7009 WORD TESTF (FORMAT) 1373 06BF 7010 WORD TESTC 1374 06FF 7011 WORD TESTD 1375 0759 7012 WORD TESTE 1376 07DA 7013 WORD TESTG 1377 082F 7014  WORD TESTH 1378 087F 7015 WORD TESTI 1379 08DB 7016 WORD TESTJ 137A FFFF 7017 WORD -1,-1 TERMINATORS 7018 * 137C 0001 7019 WORD 1  INTERRUPTS ON 7020 * 137D 0001 7021 WORD 1 5 1/4" MINI-FLOPPY  7022 * 137E 0000 7023 WORD 0 NO INVERT STEP 7024 * 137F 000F  7025 WORD 15 15 MS STEP RATE TIME 7026 * 1380 0001 7027 WORD  1,2,0,0,0 UNITS 0 AND 1 7028 * 1385 0022 7029 WORD 34,39 LOW TRACK, HIGH TRACK 7030 * 1387 0001 7031 WORD 1,16 LOW SECTOR, HIGH SECTOR 7032 * 1PAGE 0278 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:08.00 TABLES (SINGLE SIDED 5 1/4" PARAMETERS) 1389 0000 7033 WORD 0 HEAD 0 7034 * 138A 0001 7035 WORD 1 DOUBLE DENSITY 7036 * 138B 0001 7037 WORD 1 256 BYTES/SECTOR 7038 * 138C 00C6 7039 WORD :C6 DATA PATTERN  7040 * 138D 0030 7041 WORD UFDCDA DEVICE ADD. 7042 * 138E 0005  7043 WORD :5 BOARD ID 7044 * 138F 0000 7045 WORD 0  CONTROL WORD 1PAGE 0279 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:08.50  TABLES (DOUBLE-SIDED 5 1/4" PARAMETERS) 7047 ****************************** 7048 *  7049 * DOUBLE SIDED 5 1/4" PARAMETER TABLE 7050 * 7051 * DEFAULTS FOR DOUBLE SIDED 5 1/4" TEST GROUP. 7052 * TABLE MUST BE KEPT IN ORDER. 7053 * 7054 ****************************** 7055 * 00001390 7056 DS5INTBL EQU $ START OF DOUBLE SIDED 5 1/4" PRAMS. 1390 0655 7057 WORD TESTA 1391 0691 7058 WORD TESTB 1392 07AD  7059 WORD TESTF (FORMAT) 1393 06BF 7060 WORD TESTC 1394 06FF 7061 WORD TESTD 1395 0759 7062 WORD TESTE 1396 07DA 7063 WORD TESTG 1397 082F 7064 WORD TESTH 1398 087F 7065 WORD TESTI 1399 08DB 7066 WORD TESTJ 139A FFFF 7067 WORD -1,-1 TERMINATORS 7068 * 139C 0001 7069 WORD 1   INTERRUPTS ON 7070 * 139D 0001 7071 WORD 1 5 1/4" MINI-FLOPPY  7072 * 139E 0000 7073 WORD 0 NO STEP INVERT 7074 * 139F 0006  7075 WORD 6 6MS STEP RATE TIME 7076 * 13A0 0001 7077 WORD  1,2,0,0,0 UNITS 0 AND 1 7078 * 13A5 0025 7079 WORD 37,39 LOW TRACK, HIGH TRACK 7080 * 13A7 0001 7081 WORD 1,16 LOW SECTOR, HIGH SECTOR 7082 * 1PAGE 0280 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:09.75 TABLES (DOUBLE-SIDED 5 1/4" PARAMETERS) 13A9 0002 7083 WORD 2 BOTH HEADS 7084 * 13AA 0001 7085 WORD 1 DOUBLE DENSITY 7086 * 13AB 0001 7087 WORD  1 256 BYTES/SECTOR 7088 * 13AC 00C6 7089 WORD :C6 DATA PATTERN  7090 * 13AD 0030 7091 WORD UFDCDA DEVICE ADD. 7092 * 13AE 0005  7093 WORD :5 BOARD ID 7094 * 13AF 0000 7095 WORD 0  CONTROL WORD 1PAGE 0281 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:10.25 TABLES (SINGLE SIDED 8" PARAMETERS) 7097 ****************************** 7098 *  7099 * SINGLE SIDED 8" PARAMETER TABLE 7100 * 7101 * DEFAULTS FOR SINGLE SIDED 8" TEST GROUP. 7102 * TABLE MUST BE KEPT IN ORDER. 7103 * 7104 ****************************** 7105 * 000013B0 7106 SS8INTBL EQU $ START OF SINGLE SIDED 8" PRAMS. 13B0 0655 7107 WORD TESTA 13B1 0691 7108 WORD TESTB 13B2 07AD 7109  WORD TESTF (FORMAT) 13B3 06BF 7110 WORD TESTC 13B4 06FF 7111 WORD TESTD 13B5 0759 7112 WORD TESTE 13B6 07DA 7113 WORD TESTG 13B7 082F 7114 WORD TESTH 13B8 087F 7115 WORD TESTI 13B9 08DB 7116 WORD TESTJ 13BA FFFF 7117 WORD -1,-1 TERMINATORS 7118 * 13BC 0001 7119 WORD 1 INTERRUPTS ON 7120 * 13BD 0000 7121 WORD 0 8" FLOPPY 7122 * 13BE 0001 7123 WORD 1 INVERT STEP 7124 * 13BF 0006 7125 WORD 6 6MS STEP RATE TIME 7126 * 13C0 0001 7127 WORD 1,2,0,0,0 UNITS 0 AND 1 7128 * 13C5 0049 7129 WORD 73,76 LOW TRACK, HIGH TRACK 7130 * 13C7 0001 7131 WORD 1,26 LOW SECTOR, HIGH SECTOR 7132 * 1PAGE 0282 MACRO ( F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:11.25 TABLES (SINGLE SIDED 8" PARAMETERS) 13C9 0000 7133 WORD 0 HEAD 0 7134 * 13CA 0000 7135 WORD 0 SINGLE DENSITY 7136 * 13CB 0000 7137 WORD 0 128 BYTES/SECTOR 7138 * 13CC 00C6 7139 WORD :C6 DATA PATTERN 7140 * 13CD 0030 7141 WORD UFDCDA DEVICE ADD. 7142 * 13CE 0005 7143 WORD :5 BOARD ID 7144 * 13CF 0000 7145 WORD 0 CONTROL WORD 1PAGE 0283 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:11.50 TABLES (DOUBLE SIDED 8" PARAMETERS) 7147 ****************************** 7148 * 7149 * DOUBLE SIDED 8" PARAMETER TABLE 7150 * 7151 * DEFAULTS FOR DOUBLE SIDED 8" TEST GROUP.  7152 * TABLE MUST BE KEPT IN ORDER. 7153 * 7154 ******************************  7155 * 000013D0 7156 DS8INTBL EQU $ START OF DOUBLE SIDED 8" PRAMS. 13D0 0655 7157  WORD TESTA 13D1 0691 7158 WORD TESTB 13D2 07AD 7159 WORD TESTF (FORMAT) 13D3 06BF 7160 WORD TESTC 13D4 06FF 7161 WORD TESTD 13D5 0759 7162  WORD TESTE 13D6 07DA 7163 WORD TESTG 13D7 082F 7164 WORD TESTH 13D8 087F 7165 WORD TESTI 13D9 08DB 7166 WORD TESTJ 13DA FFFF 7167 WORD -1,-1  TERMINATORS 7168 * 13DC 0001 7169 WORD 1 INTERRUPTS ON 7170 * 13DD 0000 7171 WORD 0 8" FLOPPY 7172 * 13DE 0000 7173  WORD 0 NO INVERT STEP 7174 * 13DF 0003 7175 WORD 3 3MS STEP RATE TIME 7176 * 13E0 0001 7177 WORD 1,2,0,0,0 UNITS 0 AND 1 7178 * 13E5 004B 7179 WORD 75,76 LOW TRACK, HIGH TRACK 7180 * 13E7 0001 7181  WORD 1,26 LOW SECTOR, HIGH SECTOR 7182 * 1PAGE 0284 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:12.50 TABLES (DOUBLE SIDED 8" PARAMETERS) 13E9 0002 7183  WORD 2 BOTH HEADS 7184 * 13EA 0001 7185 WORD 1 DOUBLE DENSITY 7186 * 13EB 0001 7187 WORD 1 256 BYTES/SECTOR 7188  * 13EC 00C6 7189 WORD :C6 DATA PATTERN 7190 * 13ED 0030 7191 WORD UFDCDA DEVICE ADD. 7192 * 13EE 0005 7193 WORD :5 BOARD ID   7194 * 13EF 0000 7195 WORD 0 CONTROL WORD 1PAGE 0285 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:13.00 TABLES (I/O INSTRUCTION ADDS.) 7197 ****************************** 7198 * 7199 * I/O INSTRUCTION ADDRESSES  7200 * 7201 ****************************** 7202 * 000013F0 7203 DAFRST EQU  $ 13F0 0E32 7204 WORD DA1 7205 * 13F1 0E34 7206 WORD DA2  7207 * 13F2 0E36 7208 WORD DA3 7209 * 13F3 0E38 7210 WORD DA4 7211 * 13F4 0E3A 7212 WORD DA5 7213 * 13F5 0E3C 7214  WORD DA6 7215 * 13F6 0E3E 7216 WORD DA7 7217 * 13F7 0E40 7218 WORD DA8 00000008 7219 DASIZ EQU $-DAFRST 1PAGE 0286 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:13.50 TABLES (TEST ADDS.) 7221 ****************************** 7222 * 7223 * TEST ADDRESSES TABLE 7224 * 7225 ****************************** 7226 * 000013F8 7227 TESTBL EQU $ 13F8 0655 7228  WORD TESTA 7229 * 13F9 0691 7230 WORD TESTB 7231 * 13FA 06BF 7232 WORD TESTC 7233 * 13FB 06FF 7234 WORD TESTD 7235 * 13FC 0759 7236 WORD TESTE 7237 * 13FD 07AD 7238 WORD TESTF  (FORMAT) 7239 * 13FE 07DA 7240 WORD TESTG 7241 * 13FF 082F 7242 WORD TESTH 7243 * 1400 087F 7244 WORD TESTI 7245 * 1401 08DB 7246 WORD TESTJ 7247 * 0000000A 7248 NTESTS EQU $-TESTBL 1PAGE 0287 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:14.25 TABLES (COMMAND OP CODE MESSAGE ADDS.) 7250 ****************************** 7251 * 7252 * COMMAND OP CODE MESSAGE ADDRESSES 7253 * 7254 ****************************** 7255 * 00001402 7256 OPCOTBL EQU $ TABLE START 1402 1618 7257 WORD EROP0  INVALID 7258 * 1403 161D 7259 WORD EROP1 SPECIFY 7260 * 1404 1622 7261 WORD EROP2 READ DATA 7262 * 1405 1625 7263 WORD EROP3 READ DELETED DATA 7264 * 1406 162A 7265 WORD EROP4 READ ID  7266 * 1407 162E 7267 WORD EROP6 WRITE DATA 7268 * 1408 1631 7269   WORD EROP7 WRITE DELETED DATA 7270 * 1409 1636 7271 WORD EROP8  SCAN EQUAL 7272 * 140A 163B 7273 WORD EROP9 SCAN LOW OR EQUAL  7274 * 140B 1640 7275 WORD EROP10 SCAN HIGH OR EQUAL 7276 * 140C 1645 7277 WORD EROP11 RECALIBRATE 7278 * 140D 1649 7279 WORD EROP12 SEEK 7280 * 140E 164D 7281 WORD EROP13 SENSE DRIVE STATUS 7282 * 140F 1650 7283 WORD EROP14 SENSE INTERRUPT STATUS 7284 * 1410 1653 7285  WORD EROP15 FORMAT 1PAGE 0288 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:15.00 TABLES (TECH TEST MESSAGES ADDRESSES) 7287 ******************************  7288 * 7289 * TECH TEST MESSAGES ADDRESSES 7290 * 7291 ****************************** 7292 * 1411 1658 7293 TTMAD WORD TCHM010 7294 * 1412 1666 7295 WORD TCHM020 7296 * 1413 166F 7297 WORD TCHM030  7298 * 1414 1675 7299 WORD TCHM040 7300 * 1415 167F 7301 WORD TCHM050 7302 * 1416 1684 7303 WORD TCHM070 7304 * 1417 168B 7305 WORD TCHM080 7306 * 1418 1696 7307 WORD TCHM090 7308 * 1419 169D 7309 WORD TCHM100 7310 * 141A 16A7 7311 WORD TCHM110  7312 * 141B 16B2 7313 WORD TCHM120 7314 * 141C 16B9 7315 WORD TCHM130 7316 * 141D 16BD 7317 WORD TCHM140 7318 * 141E 16C8  7319 WORD TCHM150 7320 * 141F 16D5 7321 WORD TCHM160 7322 * 1PAGE 0289 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:16.00 TABLES (TECH TEST MESSAGES ADDRESSES) 1420 16DA 7323 WORD TCHM170 7324 * 1421 16E3 7325  WORD TCHM180 7326 * 1422 16F1 7327 WORD TCHM190 7328 * 1423 1702 7329 WORD TCHM200 7330 * 1424 1712 7331 WORD TCHM210  7332 * 1425 171D 7333 WORD TCHM220 1PAGE 0290 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:16.25 CRT/TTY/LP MESSAGES (QUERY MESSAGES) 7335 ****************************** 7336 * 7337 * QUERY MESSAGES 7338 * 7339 ****************************** 7340 * 1426 0C20 7341 TITLE WORD :0C20 1427 554E 734 2 BYTE 'UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM',CR,LF 143F 3933 7343 BYTE '93720-' 1442 4331 7344 WORD REV:,CR%8;LF,0 7345 * 1445 0D0A 7346 QRYM10 BYTE CR,LF,'TEST GROUP (P,M,[S],Q,R,N,T,E)=',0 7347 * 1456 0D0A 7348 QRYM20 BYTE CR,LF,'TESTS ([A,F,C,E,G,H,I,J],B,D)=',0 7349 * 1467 0D0A 7350 QRYM30 BYTE CR,LF,'UNIT NUMBERS TO TEST ([0,1],2,3)=',0  7351 * 1479 0D0A 7352 QRYM40 BYTE CR,LF,'8 INCH DRIVE BANK ([Y] OR N)=',0 7353 * 1489 0D0A 7354 QRYM50 BYTE CR,LF,'INVERT STEP DIRECTION POLARITY ([Y] OR N)=',0 7355 * 14A0 0D0A  7356 QRYM60 BYTE CR,LF,'TRACK TO TRACK STEP RATE TIME (1-15,[6])=',0 7357 * 14B6 0D0A 7358  QRYM70 BYTE CR,LF,'TEST INTERRUPTS FROM UFDC ([Y] OR N)=',0 7359 * 14CA 0D0A 7360 QRYM80 BYTE CR,LF,'RANGE OF TRACKS (0-76,[73-76])=',0 7361 * 14DB 0D0A 7362 QRYM90 BYTE CR,LF,'RANGE OF SECTORS ([1-26])=',0 7363 * 14EA 0D0A 7364 QRYMA0 BYTE CR,LF,'HEADS ([0], 1, OR 2=BOTH)=',0  7365 * 14F9 0D0A 7366 QRYMB0 BYTE CR,LF,'DOUBLE DENSITY ([Y] OR N)=',0 7367 * 1508 0D0A 7368 QRYMC0 BYTE CR,LF,'SECTOR SIZE (128, [256], OR 512)=',0 7369 * 151A 0D0A 7370 QRYMD0 BYTE CR,LF,'DATA PATTERN (:00-:FF,[:C6])=:',0 1PAGE 0291 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:18.00 CRT/TTY/LP MESSAGES (QUERY MESSAGES) 7371 * 152B 0D0A  7372 QRYME0 BYTE CR,LF,'DEVICE ADDRESS (:04-:FC,[:30])=:',0 7373 * 153D 0D0A 7374 QRYMFF0 BYTE CR,LF,'BOARD ID (:1-:E,[:5])=:',0 7375 * 154A 0D0A 7376 QRYMF0 BYTE CR,LF,'CONTROL WORD (:00-:7F,[:00])=:',0 7377 * 155B 0D0A 7378 QRYMG0 BYTE CR,LF,'FUNCTION (0-20,[0])=',0  7379 * 1567 0D0A 7380 QRYMH0 BYTE CR,LF,'UNIT NUMBER ([0], 1, 2, 3)=',0 7381 * 1576 0D0A  7382 QRYMI0 BYTE CR,LF,'WORD PATTERN (:0000-:FFFF,[:A5A5])=:',0 7383 * 158A 0D0A 7384 QRYEMC0 BYTE CR,LF,'INVALID SECTOR SIZE/DENSITY COMBINATION',0 7385 * 1PAGE 0292 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:19.00 CRT/TTY/LP MESSAGES (ERROR REPORT MESSAGES)  7387 ****************************** 7388 * 7389 * ERROR REPORT MESSAGES  7390 * 7391 ****************************** 7392 * 159F 0D0A 7393 EMSG01  BYTE CR,LF,'ER ',0 7394 * 15A2 4552 7395 EMSG02 BYTE 'ER ADD ',0 7396 *  15A6 434F 7397 EMSG03 BYTE 'COM OP ',0 7398 * 15AA 4D4F 7399 EMSG04 BYTE 'MODE REG ',0 7400 * 15AF 0D0A 7401 EMSG05 BYTE CR,LF,'Y-CTRL BLK ADD ',0 7402 * 15B8  494E 7403 EMSG06 BYTE 'INT VEC ADD ',0 7404 * 15BF 0D0A 7405 EMSG07 BYTE CR,LF,'DMA ADD ',0 7406 * 15C5 444D 7407 EMSG08 BYTE 'DMA BYTE COUNT ',0 7408 * 15CD 4845 7409 EMSG09 BYTE 'HEAD ',0 7410 * 15D0 5452 7411 EMSG10 BYTE 'TRACK ',0  7412 * 15D4 5345 7413 EMSG11 BYTE 'SECTOR ',0 7414 * 15D8 4259 7415 EMSG12 BYTE 'BYTES/SECTOR ',0 7416 * 15DF 2A4D 7417 EMSG13 BYTE '*MAIN STATUS REG ',0  7418 * 15E8 0D0A 7419 EMSG14 BYTE CR,LF,'*ST 0 ',0 7420 * 15ED 0D0A 7421 EMSG15 BYTE CR,LF,'*ST 1 ',0 7422 * 1PAGE 0293 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:20.00 CRT/TTY/LP MESSAGES (ERROR REPORT MESSAGES) 15F2 0D0A 7423 EMSG16 BYTE CR,LF,'*ST 2 ',0 7424 * 15F7 0D0A 7425 EMSG17 BYTE CR,LF,'*ST 3 ',0 7426 * 15FC 0D0A 7427 EMSG18 BYTE CR,LF,'EXP ',0 7428 * 1600 4143 7429 EMSG19 BYTE 'ACT ',0  7430 * 1603 444D 7431 EMSG20 BYTE 'DMA ER ADD ',0 7432 * 1609 0D0A 7433 EMSG21 BYTE CR,LF,'INPUT BUFFER DUMP, AT ',0 7434 * 1616 203D 7435 EMSG22 BYTE ' =',0 1PAGE 0294 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:20.25 CRT/TTY/LP MESSAGES (COMMAND OP CODE MESSAGES) 7437 ****************************** 7438 * 7439 * COMMAND OP CODE MESSAGES 7440 * 7441 ****************************** 7442 * 1618 2849 7443 EROP0 BYTE '(INVALID)',0 7444 * 161D 2853 7445 EROP1 BYTE '(SPECIFY)',0 7446 * 1622 2852 7447 EROP2 BYTE '(RD)',0 7448 * 1625 2852  7449 EROP3 BYTE '(RD DEL)',0 7450 * 162A 2852 7451 EROP4 BYTE '(RD ID)',0  7452 * 162E 2857 7453 EROP6 BYTE '(WR)',0 7454 * 1631 2857 7455 EROP7 BYTE  '(WR DEL)',0 7456 * 1636 2853 7457 EROP8 BYTE '(SCN EQ)',0 7458 * 163B 2853 7459 EROP9 BYTE '(SCN LE)',0 7460 * 1640 2853 7461 EROP10 BYTE '(SCN HE)',0  7462 * 1645 2852 7463 EROP11 BYTE '(RECAL)',0 7464 * 1649 2853 7465 EROP12 BYTE '(SEEK)',0 7466 * 164D 2853 7467 EROP13 BYTE '(SDS)',0 7468 * 1650 2853 7469 EROP14 BYTE '(SIS)',0 7470 * 1653 2846 7471 EROP15 BYTE '(FORMAT)',0 1PAGE 0295 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:21.25 CRT/TTY/LP MESSAGES (TECH TEST MESSAGES) 7473 ****************************** 7474 * 747 5 * TECH TEST MESSAGES 7476 * 7477 ****************************** 7478 * 1658 0D0A 7479 TCHM010 BYTE CR,LF,'READ MAIN STATUS REGISTER',0 7480 * 1666 0D0A 7481 TCHM020 BYTE CR,LF,'INITIALIZE UFDC',0 7482 * 166F 0D0A 7483 TCHM030 BYTE CR,LF,'READ DATA',0  7484 * 1675 0D0A 7485 TCHM040 BYTE CR,LF,'READ DELETED DATA',0 7486 * 167F 0D0A 7487 TCHM050 BYTE CR,LF,'READ ID',0 7488 * 1684 0D0A 7489 TCHM070 BYTE CR,LF,'WRITE DATA',0 7490 * 168B 0D0A 7491 TCHM080 BYTE CR,LF,'WRITE DELETED DATA',0 7492 * 1696 0D0A 7493 TCHM090 BYTE CR,LF,'SCAN EQUAL',0 7494 * 169D 0D0A 7495 TCHM100 BYTE  CR,LF,'SCAN LOW OR EQUAL',0 7496 * 16A7 0D0A 7497 TCHM110 BYTE CR,LF,'SCAN HIGH OR EQUAL',0  7498 * 16B2 0D0A 7499 TCHM120 BYTE CR,LF,'RECALIBRATE',0 7500 * 16B9 0D0A 7501 TCHM130 BYTE CR,LF,'SEEK',0 7502 * 16BD 0D0A 7503 TCHM140 BYTE CR,LF,'SENSE DRIVE STATUSIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII! IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIe820921103622820921103622820930094455e@820921103622820921103622820930094453" e820921103622820921103622820921103622e820921103622820921103622820921103622820921103622820921103622820921103622e -8209121821452582093009422350820930094436# $ % & ' ( ) * + . UFDCDIAG:3 LST, ',0 7504 * 16C8 0D0A 7505 TCHM150 BYTE CR,LF,'SENSE INTERRUPT STATUS',0 7506 *  16D5 0D0A 7507 TCHM160 BYTE CR,LF,'FORMAT',0 7508 * 1PAGE 0296 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:22.50 CRT/TTY/LP MESSAGES (TECH TEST MESSAGES) 16DA 0D0A  7509 TCHM170 BYTE CR,LF,'INVALID COMMAND',0 7510 * 16E3 0D0A 7511 TCHM180 BYTE CR,LF,'WRITE DMA ADDRESS POINTER',0 7512 * 16F1 0D0A 7513 TCHM190 BYTE CR,LF,'WRITE INTERRUPT VECTOR ADDRESS',0 7514 * 1702 0D0A 7515 TCHM200 BYTE CR,LF,'WRITE DMA BYTE COUNT REGISTER',0 7516 * 1712 0D0A 7517 TCHM210 BYTE CR,LF,'WRITE MODE REGISTER',0 7518 * 171D 0D0A 7519 TCHM220 BYTE CR,LF,'''SAL'' INSTRUCTION',0 1PAGE 0297 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:23.00 CRT/TTY/LP MESSAGES (TRAP/EXCEPTION MESSAGES) 7521 ****************************** 7522 * 7523 * TRAP/EXCEPTION MESSAGES 7524 * 7525 ****************************** 7526 * 1727 0D0A 7527 INSMSG BYTE CR,LF,'UNIMPLEMENTED INSTRUCTION TRAP',CR,LF,0 7528 * 1739 0D0A 7529 MEMMSG BYTE CR,LF,'UNINSTALLED MEMORY TRAP',CR,LF,0  7530 * 1747 0D0A 7531 POWMSG BYTE CR,LF,'POWER FAIL',CR,LF,0 7532 * 174F 0D0A  7533 STKMSG BYTE CR,LF,'STACK OVERFLOW',CR,LF,0 7534 * 1759 0D0A 7535 USEMSG BYTE CR,LF,'USER TRAP',CR,LF,0 7536 * 1760 0D0A 7537 SYSMSG BYTE CR,LF,'SYSTEM TRAP',CR,LF,0  7538 * 1768 0D0A 7539 ARIMSG BYTE CR,LF,'ARITHMETIC TRAP',CR,LF,0 7540 * 1PAGE 0298 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:24.00 CRT/TTY/LP MESSAGES (MISCELLANEOUS MESSAGES) 7542 ****************************** 7543 * 7544 * MISCELLANEOUS MESSAGES 7545 * 7546 ****************************** 7547 * 1772 0D0A 7548 TSTNUM BYTE CR,LF,' TEST' 1776 2041 7549 TNUM: BYTE ' A',0 7550 * 1778 0D0A 7551 PASSMG BYTE CR,LF,'PASS ',0 7552 * 177C 2A2A 7553 STRMSG BYTE '****',0  7554 * 177F 0D0A 7555 ETALLM BYTE CR,LF,' UNIT HARD',0 7556 * 1789 0D0A  7557 LPMSG BYTE CR,LF,'LINE PRINTER TIMED OUT',CR,LF,0 7558 * 1797 0D0A 7559 UNTMG BYTE CR,LF,'UNIT ',0 7560 * 1PAGE 0299 MACRO (F400) SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 1982/09/30 09:04:24.50 BUFFERS 7562 ****************************** 7563 *  7564 * I/O BUFFERS & Y-CTRL. BLK. 7565 * 7566 * Y1 - Y-CTRL. BLK. -  7567 * 7568 * BUFR - MAIN BUFFER 7569 * 7570 * INBUFR - INPUT BUFFER 7571 * 7572 * STACK - START OF STACK SPACE 7573 *  7574 ****************************** 7575 * 0000179B 7576 Y1 EQU $ 179B 0000 7577 RES 38,0 CONTROL BLOCK 7578 * 000017C1 7579 BUFR EQU $ 17C1 0000 7580 RES 1024,0 MAIN BUFFER 7581 * 00001BC1 7582 INBUFR EQU $ 1BC1 0000 7583 RES 1024,0 INPUT BUFFER 7584 * 00001FC1 7585 STACK EQU  $ 1FC1 0000 7586 RES 128,0 STACK SPACE 7587 * 00002041 7588 ENDPROG EQU $ END OF PROGRAM 0200 7589 END DEFSTR THAT'S ALL FOLKS! 0000 ERRORS (0000/0000) 0000 WARNINGS (0000/0000) MAIN BUFFER 7581 * 00001BC1 7582 INBUFR EQU $ 1BC1 0000 7583 RES 1024,0 INPUT BUFFER 7584 * 00001FC1 7585 STACK EQU IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII. IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII/ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII0 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII1 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII2 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII3 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII4 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII5 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII6 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII7 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII8 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII9 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII: IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII< IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII