IMD 1.16: 1/09/2008 10:51:12 84-93083-01 a100 f08301 transport control unit diag/form source disk 17feb84    @0|)wwЀЀtQql)  " }gA `_l M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF282090921361200840217163152 840217163152 TTCU VOLTRANSPORT CONTROL UNIT DIAG/FORM SOURCE DISK (84-93083-01 A100) F08301   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_l M@iGyy GGG`HZ@ b G`^Y e IQ BBp@;:9 :7P@ G:پN 8!0. * C'xC# b# }B!9 @0DAJL w+™ЀЀΖQA1"   i ž} š} @EEFF)DEۄF8 џ} ԟ} ̟} * `jUBBI,v BI, # @ G9H@pܾrCHC C GTq` Lg"gEXC P+s=胾P+c fQN p $Rxnj  ޔniZ ތ⊞ } }HGž Ÿ@ALS)"$ C k20j.h( +$`%ꂜ\1 !M' y %'+os慾)sY ed|{ @8 o O m J K i gN )V% t%sLn`"E F. F„ D>) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYS"iwvc Bc A@6<# Ic B# gIjHc r TITL NM-4 TRANSPORT CONTROL UNIT DIAGNOSTIC/FORMATTER 84-93083-10-A100 * * * * * TRANSPORT CONTROL UNIT (TCU) * * DIAGNOSTIC/FORMATTER * * 84-93083-10 * * * * * THE CONTENTS HEREOF ARE PROPRIETARY * TO COMPUTER AUTOMATION, INC. ("CA") * AND SHALL NOT BE REPRODUCED OR USED * WITHOUT CA'S PRIOR WRITTEN CONSENT. * * (C) COMPUTER AUTOMATION, INC. 1983. * * * * TITL REVISION HISTORY *********************************** * * REVISION HISTORY * *********************************** * * * REVISION ISSUE DATE COMMENTS * -------- ---------- -------- * * A0 MAY,1983 ORIGINAL RELEASE * BY KARMAN TAM * * SEP., 83 ADD TECH TEST & IMPLEMENTATION * BY ANDY TONG * *  A000 OCT,1983 ADD RODIME RO-204 DRIVE * AND MICROPOLIS 1340 DRIVE *  INTO THE 'DRIVE SELECT' TABLE. * BY KARMAN TAM * * A100  19,JAN,1984 ADD INTERLEVE AND VERIFY FORMAT * OPTION. *   BY ANDY TONG * * A100 24,JAN,1984 ADD SUBROUTINES: ADRSAV & ADRFLP * TO FIX ERROR REPORTING ERROR. BY A.T. * * A100 27,JAN,1984 ADD DISABLE ECC & RETRY OPTION * REV: EQU 'A100' LATEST REVISION TITL LINKER INFORMATION * * EXTR DEBUG4 LINK TO DEBUG NAM G:0 LINK ADDRESS * * OPTIONS +:000A OPTIONS -:1000  OBJNOTE 'TCU DIAGNOSTIC/FORMATTER - REV:%-8,REV:&:FF TITL EQUATES *********************************** * * EQUATES * *********************************** * * CIOB EQUATES * OP EQU 0 OP CODE, CIOB US EQU 1 UNIT SELECT CS EQU 2 CYLINDER SELECT HS EQU 3 HEAD SELECT SSS EQU 4 SECTOR SELECT WC EQU 5 TRANSFER WORD COUNT MA EQU 6 MEMORY(BUFFER) ADDRESS (BIT 15 MUST BE 0) IN EQU 7 INTERRUPT LOCATION (BIT 15 MUST BE 0) NB EQU 8 NEXT IOB ADDRESS WP EQU 9 WORD PROCESSED CST EQU 10 CONTROLLER STATUS DST EQU 11 DRIVE STATUS * * DATA CHAIN IOB EQUATES * DCWC EQU 0 TRANSFER WORD COUNT DCMA EQU 1 MEMORY ADDRESS( BIT 15 MUST BE 0) DCRS EQU 2 RESERVED DCAD EQU 3 DATA CHAIN IOB ADDRESS * * OP CODE EQUATES * TIO EQU :0 TEST I/O FRMT EQU :1 FORMAT WRTDAT EQU :2 WRITE DATA RDDAT EQU :4 READ DATA RDVER EQU :8 READ VERIFY SEEK EQU :9 SEEK ONLY INIT EQU :A INITIALIZE DIRRD EQU :B DIRECT READ DIAG EQU :C DIAGNOSTIC SCPY EQU :D SECTOR COPY * * FORMAT SUB-OPCODE EQUATES * FMAB EQU :04 FORMAT ALL BLOCKS WITH ID AND DATA FIELDS FMCK EQU :05 CHECK FORMAT ON SPECIFICED TRACK FOR CORRECT ID AND INTERLEVE FMCF EQU :06 FORMAT SPECIFICED TRACK WITH ALL FLAGS CLEARED FMBT EQU :07 FORMAT BAD TRACK * * DISK DIAGNOSTIC OPCODE EQUATES * DRWV EQU :000C DESTRUCTIVE WRITE AND READ VERIFY NDRWV EQU :010C NON-DESTRUCTIVE WRITE AND READ VERIFY DRV EQU :020C DIAGNOSTIC READ VERIFY DWO EQU :030C DESTRUCTIVE WRITE ONLY NDW EQU :040C NON-DESTRUCTIVE WRITE DSKO EQU :050C DIAGNOSTIC SEEK ONLY STR EQU :070C STATUS REPORT * * GENERAL EQUATES * BADBUFSZ EQU 50 BAD BUFFER SIZE BCKAR: EQU :5F ASCII BACK ARROW CR: EQU 13 ASCII CARRIAGE RETURN CRLF: EQU :0D0A ASCII CARRIAGE ETURN AND LINE FEED DLPDA EQU :7F LP DEVICE ADDRESS (DIO) DTTYDA EQU :7C CRT/TTY DEVICE ADDRESS (SHIFTED RIGHT) LF: EQU 10 ASCII LINE FEED SMDA EQU :14 STD DEVICE ADDRESS SPACE: EQU :20 ASCII SPACE UPARR: EQU :5E ASCII UP ARROW TITL STANDARD NM-4 TRAP/EXCEPTION LOCATIONS *********************************** * * * STANDARD NM-4 TRAP/EXCEPTION LOCATIONS * * * CONSOLE INTERRUPT AND * REAL-TIME-CLOCK INTERRUPT LOCATIONS * * *********************************** * ABS 0 DEBUG JUMP DEBUG JST *$+1 JUMP TO DEBUG WORD DEBUG4 DEBUG ADDRESS * ABS :80 POWER UP TRAP PWRUP JST *$+1 JUMP TO POWER UP ROUTINE WORD PWRUP: ADDRESS OF ROUTINE * ABS :84 UNIMPLEMENTED INSTRUCTION TRAP UNINT RES 2,0 ADDRESS AND INSTRUCTION JST *$+1 JUMP TO SERVICE ROUTINE WORD UNINT: ADDRESS OF ROUTINE * UNMET RES 2,0 UNINSTALLED MENORY TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD UNMET: ADDRESS OF ROUTINE * PWRFL RES 2,0 POWER FAIL JST *$+1 JUMP TO SERVICE ROUTINE WORD PWRFL: ADDRESS OF ROUTINE * ABS :91 REAL-TIME-CLOCK RTCCNT RES 1,0 RTC TICKS JST *$+1 JUMP TO SERVICE ROUTINE RTCRTN RES 1,0 ADDRESS OF SERVICE ROUTINE * CNINT JST *$+1 CONSOLE INTERRUPT LOCATION WORD CNINT: ADDRESS OF SERVICE ROUTINE * ABS :98 CHAR./NUM. EXCEPTION CHNUE RES 2,0 ADDRESS AND INSTRUCTION JST  *$+1 JUMP TO SERVICE ROUTINE WORD CHNUE: ADDRESS OF ROUTINE * STKOV RES 2,0 STACK OVERFLOW JST *$+1 JUMP TO SERVICE ROUTINE WORD STKOV: ADDRESS OF ROUTINE * USETR RES 2,0 USER TRAP JST *$+1 JUMP TO ROUTINE WORD USETR: ADDRESS OF ROUTINE * STSTR RES 2,0 SYSTEM TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD SYSTR: ADDRESS OF ROUTINE * ARIER RES 2,0 ARITHMETIC ERROR JST *$+1 JUMP TO SERVICE ROUTINE WORD ARIER: ADDRESS OF ROUTINE TITL MACRO QURY ********************************** * * * MACRO QURY - THIS MACRO REPLACE THE * REDUNDANT CODES DURING * QUARIES. * * *********************************** * MACRO QURY QURY#1 EQU $ JST CHRIN CHECK TERMINATOR JMP QURY#2 CARRIAGE RETURN JMP QURY#3 '#' SIGN JMP QURY#4 BACK ARROW JMP QURY#5 UPARROW JMP QURY#6 COMMA IFT 6<#7 ANYTHING ELSE ENDC ENDM TITL ABOVE :8000 MEMORY CHECK *************************************************** * * THIS 2 IOB LOCATED ON :8180 AND :180 * ARE USED TO CHECK MEMORY ABOVE :8000 AND * JUMPER E1-E2 ON THE TCU BOARD * *************************************************** * ABS :8180 MEMGOOD RES 12,0 * ABS :180 MEMBAD RES 12,0 * TITL PROGRAM START UP *********************************** * * * PROGRAM START UP * * ************************************* * ABS :200 PSU EQU $ PROGRAM START UP G:0 EQU $ DEBUG LINK * COPY =0,A ZERO A-REG COPY A,EROTOL RESET ACCUMULATED ERRORS COUNT COPY A,LPFLAG RESET LP FLAG COPY A,S RESET STATUS REGISTER OUT A,0 RESET SENSE SWITCH OUT A,1 RESET CONSOLE INT  SELP A,4 RESET CDR DISPLAY COPY A,UNIT CLEAR UNIT # COPY A,PASS CLEAR PASS # COPY =:180,A INITIALIZE STACK COPY A,K COPY =:120,A COPY A,L JST MSGA PRINT TITLE WORD TITLE JST CRLF PRINT A BLANK LINE JST CRLF ONE MORE SBIT 4,S ENABLE CONSOLE INT  SBIT 8,S ENABLE INTS JMP QURYD10 GO TO QUERIES * LPOOL TITL QUERIES - DRIVE SELECTION ********************************** * * * DRIVE SELECTION * * QUERY: * CM-5412 : 0 * ET-5540 : 1 * XT-1065 : 2 * XT-1140 : 3 * RO-204 : 4 * MP-1304 : 5 * AT3046 : 6 * USER DEFINE : 7 *  SELECT DRIVE (0)? * * SELECTION: * 0 - COMPUTER MEMORIES INC., CM-5412 * 1 - EVOTEK ET-5540 *  2 - MAXTOR XT-1065 * 3 - MAXTOR XT-1140 * 4 - RODIME RO-204 * 5 - MICROPOLIS MP-1304 * 6 - ATASI AT-3046 * 7 - USER DEFINE * DEFAULT IS '0' * * * CALLS: * CHRIN * IDEC *  MOVE * MSGA * * *********************************** * QURYD10 EQU $ COPY =0,A SET A TO ZERO COPY A,TEMP2 RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD QRYD1 JST IDEC GET INPUT JEQ X,$+2 IF ZERO CHECK TERMINATOR IMS TEMP2 SET INPUT FLAG QURY DI,D12,D11,D10,D10,D10 JMP QURYD10 ANYTHING ELSE IS BAD QURYD11 COPY TEMP2,A GET INPUT FLAG JNE A,QURYD10 ILLEGAL THERE IS AN INPUT JMP PMBLR DEFAULT QURYD12 COPY A,TEMP3 COPY X,TEMP4 COPY =-PRMSIZ,A JST MOVE WORD PRAMSX WORD PRAMS COPY TEMP3,A  COPY TEMP4,X SUB =7,X IS IT USER DEFINE? JEQ X,QURYK YES, GOTO QURYK COPY TEMP4,X RESTORE X-REG CSK X,=DRTBLZ CHECK SELECTION JMP $+2 IF LESS THAN, A OK JMP QURYD10 IF MORE THAN, ERROR ADD =DRTBL,X ADD IN TABLE OFFSET COPY 0(X),X GET ADDRESS OF PA RAMETER TABLE COPY X,QURYD13 STORE FOR MOVE COPY X,DISK SET DRIVE PARAMETER TABLE ADDRESS COPY =HCP-EHCP,A PARAMETER TABLE SIZE -(EHCP-HCP) JST MOVE SET NEW DISK PARAMETER QURYD13 WORD 0 WORD HCP COPY MAXHEAD,A GET MAXIMUM HEAD NO. COPY A,HPD SAVE IT HERE IMS HPD ADJUSTED TO HEADS PER DRIVE COPY MAXSCTOR,A GET MAXIMUM SECTOR NO. COPY A,SPT SAVE IT HERE IMS SPT ADJUSTED TO SECTOR PER TRACK NOP JMP QURYM10 NEXT QUERY * LPOOL TITL QUERIES - USER DEFINE PARAMETER QUERY *********************************** * * * QURYK - USER DEFINE PARAMETER QUERY * THIS QUERY ENABLE THE USER TO DEFINE * DRIVE PARAMETER. NO RANGE CHECK IS * PREFORMED. * * QUERY - CYLINDERS,SECTORS,HEADS,INITIALIZATION PARAMETER (5)? *  ALL ENTRIES IN HEX AND IN ABOVE ORDER. * ********************************** * QURYK EQU $ JST MSGA PRINT MESSAGE WORD QRYK  COPY =-8,A GET INPUT COUNT COPY A,TEMP3 SAVE IT COPY =HCP,Y INDEX WORKING PARAMETER TABLE QURYK5 JST IHEX GET RESPONSE COPY X,0(Y) SAVE RESPONSE ADD =1,Y BUMP TABLE IMS TEMP3 BUMP INPUT COUNT JMP $+2 STILL GOOD JMP QURYK30 END OF INPUT, NEXT QUERY  QURY K10,K30,K,K,D10,K20 JMP QURYK ANYTHING ESLE IS BAD QURYK20 COPY IDCTM3,A GET INPUT COUNT JEQ A,QURYK IF NO INPUT JMP QURYK5 ELSE * QURYK30 COPY TEMP3,Q GET INPUT COUNT JNE Q,QURYK NOT ENOUGH INPUT, RESTART COPY IDCTM2,A GET TERMINATOR CLSN =CR:,A CARRIAGE RET ? JMP $+2 YES, GO ON JMP QURYK NO, TRY AGAIN COPY MAXHEAD,A GET MAXIMUM HEAD # COPY A,HPD SAVE IT HERE IMS HPD ADJUSTED TO HEADS PER DRIVE COPY MAXSCTOR,A GET MAXIMUM SECTOR # COPY A,SPT SAVE IT HERE IMS SPT ADJUSTED TO SECTORS PER TRACK NOP JMP QURYM10 GO NEXT QUERY * LPOOL TITL QUERIES - MANUFACTURER'S BAD TRACKS *********************************** * * * MANUFACTURER'S BAD TRACKS * * * WINCHESTER DRIVES ARE AN IMPERFECT MEDIA. WHEN THE * DRIVE IS RECEIVED FROM THE MANUFACTURER, A LIST OF * BAD TRACKS IS INCLUDED IN THE FORM OF CYLINDER/HEAD * PAIRS. * * THEY ARE STORED IN TWO TABLES.  'BADBUF' IS USED DURING * FORMATTER AND 'BADBUF2' IS USED DURING THE DIAGNOSTIC. * * TRACKS THAT ARE FOUND TO BE IN 'BADBUF' WILL BE FORMATTED * AS BAD (ALL 18 SECTORS). * * DURING THE DIAGNOSTIC, ERRORS AGAINST THE BAD TRACKS IN * 'BADBUF2' WILL NOT BE DISPLAY. * * * QUERY: ANY BAD TRACK FROM MANUFACTURER (Y/[N])? * * * DEFAULT IS NO. * * * CALLS: *  MSGA * IDEC * CHRIN * * *********************************** * QURYM10 EQU $ COPY =0,A RESET MFR'S BAD TRACK FLAG COPY A,MFRFLG DO IT JST MSGA OUTPUT QUERY WORD QRYM1 JST IDEC GET RESPONSE JNE X,QURYM10 NUMERIC RESPONSE IS NO GOOD QURY M11,M14,M15,M10,D10,M10 CLSN A,='Y' BAD TRACKS - YES? JMP QURYM12 GO ASK FOR BAD ONES CLSN A,='N' BAD TRACKS - NO? JMP QURYM13 NO BAD ONES JMP QURYM10 ANYTHING ELSE IN NO NO QURYM12 JST IDEC GET TERMINATOR JNE X,QURYM10 NUMERIC RESPONSE IS NO GOOD SUB =:0D,A CR? JNE A,QURYM10 NO, TRY AGAIN COPY =-BADBUFSZ,A JST MOVE CLEAR OUT FMTTR BUFFER WORD BUFCLR WORD BADBUF COPY =-BADBUFSZ,A JST MOVE CLEAR OUT DIAG BUFFER WORD BUFCLR WORD BADBUF2 COPY =-1,A COPY A,BADBUF TERMINATOR FOR FMTTR BUFFER COPY A,BADBUF2 TERMINATOR FOR DIAG BUFFER COPY =1,A SET MFR FLAG COPY A,MFRFLG JMP QURYM20 'Y'+CR, NOW GET CYL #'S Q URYM13 JST IDEC GET TERMINATOR JNE X,QURYM10 NUMERIC REPONSE IS NO GOOD SUB =:0D,A CR? JNE A,QURYM10 NO, TRY AGAIN QURYM14 COPY =-1,A NO BAD TRACKS FORM MANUFACTURER COPY A,BADBUF TERMINATOR FOR FMTTR BUFFER COPY A,BADBUF2 TERMINATOR FOR DIAG BUFFER JMP QURY1 NO BAD TRACKS FROM MFR QURYM15 COPY =-1,A NO BAD TRACKS FROM MFR COPY A,BADBUF TERMINATOR FOR FMTTR BUFFER COPY A,BADBUF2 TERMINATOR FOR DIAG BUFFER JMP PMBLR * LPOOL TITL QURIES - MFR'S BAD CYLINDER NUMBERS *********************************** * * * MANUFACTURER'S BAD CYLINDER NUMBERS * * * QUERY: ENTER CYLINDER NUMBER (DECIMAL) * * DEFAULT: CR, WHICH INDICATES NO MORE DAB ONES. * * * CALLS: * MOVE * MSGA * IDEC * CHRIN * * *********************************** * QURYM20 EQU $ COPY =BADBUF,A GET BUFFER ADDR COPY A,BUFPTR INIT BUFFER POINTER QURYM21 COPY =0,A SET A TO ZERO COPY A,TEMP2 RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD QRYM2 JST IDEC GET RESPONSE JLT X,QURYM21 NEG NO. IS NO GOOD JEQ X,QURYM24 IF ZERO, SEE WHY QURYM22 IMS TEMP2 SET INPUT FLAG COPY MAXCYL,A GET MAX NO OF CYL ALLOWED CSK X,A CHECK RANGE JMP $+2 OK JMP QURYM21 TOO LARGE COPY X,BADCYL SAVE BAD CYL # QURY M23,M25,M26,M21,M10,M21 JMP QURYM21 ANYTHING ESLE IS BAD QURYM24 COPY IDCTM3,A SEE WHY IDEC VALUE IS ZERO JEQ A,QURYM23 ITS A TERMINATOR JMP QURYM22 MUST BE CYL #0 QURYM25 COPY TEMP2,A ITS A CR JEQ A,$+2 JUST CR, ALL DONE JMP QURYM30 CYL# + CR, GO GET BAD HEAD COPY =-1,A END OF BAD TRACK BUFFER COPY A,*BUFPTR SAVE IT COPY =-BADBUFSZ,A JST MOVE COPY BADBUF O BADBUF2 WORD BADBUF WORD BADBUF2 JMP QURY1 ALL BAD TRACKS ENTERED, EXIT QURYM26 COPY TEMP2,A # TERMINATOR JEQ A,$+2 DEFAULT JMP QURYM21 CYL# + # IS NO NO COPY =BADBUF,A GET ADDR OF BAD BUF COPY BUFPTR,X SET POINTER CSK X,A SEE IF ANY BAD TRACKS ENTERED YET NOP JMP QURYM21 CAN'T DEFAULT AFTER ENTERING SOME BAD TRACKS JMP PMBLR OK * LPOOL TITL QUERIES - MFR'S BAD HEAD NUMBERS *********************************** * * * MANUFACTURER'S BAD HEAD NUMBERS * * * QUERY: ENTER BAD HEADS (DECIMAL) * * * CALLS: * MSGA * IDEC * CHRIN * * *********************************** * QURYM30 EQU $ COPY =0,A SET A TO ZERO COPY A,TEMP2 RESET INPUT FLAG JST MSGA PRINT 'BAD HEADS?' WORD QRYM3 JST IDEC GET RESPONSE JLT A,QURYM30 -VE # IS NO GOOD JEQ X,QURYM33 IF ZERO, SEE WHY QURYM31 IMS TEMP2 SET INPUT FLAG COPY MAXHEAD,A GET MAX # OF HEADS CSK X,A CHECK RANGE JMP $+2 OK JMP QURYM30 OUT OF RANGE COPY X,BADHEAD SAVE BAD HEAD QURY M32,M34,M30,M30,M21,M30 JMP QURYM30 ANYTHING ELSE IS BAD QURYM33 COPY IDCTM3,A SEE WHY IT'S ZERO JEQ A,QURYM32 JUST A TERMINATOR JMP QURYM31 MUT BE HEAD ZERO QURYM34 COPY TEMP2,A JUST A CR JEQ A,QURYM30 NOT GOOD ENOUGH QURYM35 COPY BADCYL,A GET BAD CYL SHIFT A,LO,4 PUT IN UPPER 3 NIBBLES OR BADHEAD,A PUT HEAD IN LOWER NIBBLE COPY A,*BUFPTR PUT CYL/HD IN TABLE COPY LIMIT,A GET POINTER TO END OF TABLE SUB BUFPTR,A BUFFER FULL YET? JEQ A,QURYM36 YES, PRINT ERROR MESSAGE IMS BUFPTR NO, SO BUMP POINTER JMP QURYM21 GET NEXT BAD CYLINDER # QURYM36 JST MSGA EXCESSAVE BAD TRACKS WORD QRYM4 COPY =BADBUFSZ,Q TRY AGAIN... SHIFT Q,LO,1 COMP Q ADD =1,Q COPY =-1,A COPY =BADBUF,X COPY A,0(X) ADD =1,X IJNE Q,$-2 DO TILL COUNT EXPIRE JMP QURYM20  * LPOOL TITL QUERIES ************************************ * * * QUERIES - QUERY SECTION * * DEVICE ADDRESS QUERY - THIS QUREY WILL CAUSE * THE MODIFICATION OF THE * DEVICE ADDRESS IF NON- *  STANDARH DEVICE ADDRESS * KEYED IN. * * STANDARD DEVICE ADDRESS - :14 * * QUREY: DEVICE ADDRESS (01-1F[14])? * * SELECTION-:01 TO :1F * DEFAULT IS :14 * * ************************************ * QURY1 EQU $ COPY =0,A COPY A,IPFLAG RESET INPUT FLAG COPY =:14,A GET DEFAULT DEVICE ADDRESS COPY A,DEVAD SAVE IT JST MSGA OUTPUT QUREY WORD DEVMSG JST IHEX GET RESPONSE JEQ X,QURY3 IF ZERO, SEE WHY IMS IPFLAG SET INPUT FALG CSK X,=0 DO RANGE CHECK JMP QURY1 BAD INPUT (LESS THAN 0) CSK X,=:1F JMP $+2 WITHIN RANGE JMP QURY1 BAD INPUT (LARGER THAN :1F) COPY X,DEVAD STORE INPUT QURY 2,FS,4,1,D10,1,1 JMP QURY1 ANYTHING ELSE IS BAD QURY3 COPY IDCTM3,A GET INPUT COUNT JEQ A,QURY2 IF ZERO, DEFAULT JMP QURY1 ELSE, INPUT=0 (ERROR) QURY4 COPY IPFLAG,A GET INPUT FLAG JNE A,QURY1 IF INPUT, THEN IT IS ILLEGAL JMP QURYND * LPOOL * TITL QUERIES-FUNCTION SELETION ******************************************** * * SELECT FUNCTIONS *  D-DIAGOSTIC * F-FORMATTER * T-TECH TEST * * QUERY: FUNCTION SELECT ([D],F,T)? * DEFAULT IS D-DIAGNOSTIC * ******************************************** * QURYFS EQU $ COPY =0,A ZERO A-REG COPY A,IPFLAG RESET INPUT FLAG COPY ='D',A SET FUCTION TO DEFAULT COPY A,MODE SAVE IT JST MSGA OUTPUT QUERY WORD FSMSG JST IDEC GET RESPONSE JNE X,QURYFS NUMERIC RESPONSE IN NO GOOD COPY IDCTM3,A GET INPUT COUNTS JNE A,QURYFS A=0 IS CORRECT QURY 5,20,10,FS,1,FS CLSN ='F',A FORMATTER? JMP QURY7 YES, SAVE IT CLSN ='D',A DIAGNOSTIC? JMP QURY7 YES, SAVE IT CLSN ='T',A TECH? JMP QURY7 YES, SAVE IT JMP QURYFS ANYTHING ELSE IS BAD QURY7 COPY A,MODE SET FUNCTION IMS IPFLAG SET INPUT FLAG JST IKB GET TERMINATOR COPY A,IDCTM2 STORE TERMINATOR JMP QURY5 CHECK TERMINATOR QURY10 COPY IPFLAG,A GET INPUT FLAG JNE A,QURYFS CAN'T DO JMP QURY60 CAN DO QURY15 COPY IPFLAG,A GET INPUT FLAG JNE A,QURYFS CAN'T DO JMP PSU CAN DO * LPOOL TITL QUERIES-UNIT SELECTION ************************************ * * * UNIT SELECTION * * QUERY: UNIT SELECT ([0]-3)? * DEFAULT IS 0 * * ************************************* * QURY20 EQU $ COPY MODE,A GET FUNCTION CLSN A,='T' JMP QURY30 GO QURY30 IF TECH TEST COPY =0,A ZERO A-REG COPY A,IPFLAG RESET INPUT FLAG COPY =UCUR,Y INDEX UNIT SELECTION TABLE COPY A,0(Y) GET DEFAULT UNIT COPY =-1,A GET DELIMITER COPY A,1(Y) SAVE IT COPY =-4,A SET INPUT COUNT COPY A,IPCOUNT AND INPUT COUNT JST MSGA PRINT QUERY WORD USEMSG QURY21 JST IDEC GET RESPONSE COPY IDCTM3,A GET INPUT COUNT JEQ A,QURY22 IF 0, CHECK TERMINATOR COPY X,A DO RANGE CHECK CSK A,=3 MUST BE < 3 JMP $+2 OK JMP QURY20 OUT OF RANGE COPY A,0(Y) SAVE UNIT SELECTED COPY =-1,A GET TERMINATOR COPY A,1(Y) SAVE IT IMS IPCOUNT BUMP COUNTER JMP $+2 STILL GOOD JMP QURY23 MAX. UNIT SELECTED, NEXT QUERY ADD =1,Y BUMP UNIT TABLE POINTER QURY 22,30,60,20,FS,21 CHECK IT JMP QURY20 ANYTHING ELSE IS BAD QURY23 COPY IDCTM2,A CLSN =CR:,A IS TERMINATOR CR ? JMP QURY30 YES  JMP QURY20 NO * LPOOL TITL QUERIES-RUN OPTION ****************************************************** * * RUN OPTION QUERY -THIS QUERY DETERMINATES * HOW THE DIAGNOSTIC PROGRAM * IS BEING RAN. * * QUERY: RUN OPTIONS [:000]? * * SELECTION- :00 TO :?? * DEFAULT IS ':00' * * BIT HEX OPTION *  --- --- ------ * 0 :01 ACCUMULATED ERRORS OF ALL PASSES * 1 :02 SUPPRESS ERROR REPORTS * 2 :04 OUTPUT ERROR TALLIES @ END OF EA. TEST * 3 :08 RUN CONTINUOUSLY * 4 :10 HALT ON ERROR * 5 :20 LINE PRINTER ON * (6 - RESERVED FOR NON-DESTRUCTIVE MODE) *  7 :80 DISABLE ECC * 8 :100 DISABLE AUTO RETRY * 9 :200 ENABLE VERIFY FORMAT OPTION QURY * ***************************************************** * QURY30 EQU $ COPY =0,A COPY A,CAR SET RUN OPTION TO DEFAULT COPY A,IPFLAG CLEAR INPUT FLAG JST MSGA OUTPUT QURY WORD ROMSG JST IHEX GET RESPONSE JEQ X,QURY33 IF ZERO, SEE WHY QURY31 IMS IPFLAG SET INPUT FLAG COPY X,A DO RANGE CHECK SHIFT A,RO,10 :000 - 3FF?? JNE A,QURY30 IF NOT, TRY AGAIN COPY X,CAR ELSE, STORE VALUE  QURY 32,30A,34,30,35,30 JMP QURY30 ANYTHING ELSE QURY33 COPY IDCTM3,A GET ACTUAL INPUT COUNT JEQ A,QURY32 IF ZERO, CHECK TERMINATOR JMP QURY31 ELSE, INPUT=0 QURY34 COPY IPFLAG,A GET INPUT FLAG JNE A,QURY30 CAN'T DO JMP QURYND CAN DO QURY35 COPY IPFLAG,A GET INPUT FLAG JNE A,QURY30 CAN'T DO JMP QURY20 CAN DO * LPOOL TITL QUERIES-NONDESTRUCTIVE MODE-DESTRUCTIVE MODE ***************************************************** * * NON-DESTRUCTIVE MODE OPTION * * QUERY: NON-DESTRUCTIVE MODE (Y/[N])? * Y -NON-DESTRUCTIVE, SAVE DATA ON THE DISK * N - DO NOT SAVE DATA ON THE DISK * DEFAULT IS 'N' * ***************************************************** * QURY30A EQU $ COPY MODE,A GET FUNCTION CLSN A,='F' IF FORMATTER JMP QURY70 GO ASK INTERLEVE FACTOR CLSN A,='T' IF TECH TEST JMP QURYND GO QURYND COPY =0,A COPY A,IPFLAG RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD NDMSG JST IKB GET RESPONSE COPY A,IDCTM2 SAVE QURY 30B,30D,30E,30A,30,30A CLSN A,='Y' YES? JMP $+4 CLSN A,='N' JMP $+2 JMP QURY30A ANYTHING ELSE IS BAD IMS IPFLAG COPY A,TEMP1 SAVE Y/N OPTION JST IKB GET TERMINATOR COPY A,IDCTM2 SAVE JMP QURY30B QURY30D EQU $ COPY IPFLAG,A GET INPUT FLAG JEQ A,QURY40 IF NO INPUT GO AHEAD COPY TEMP1,A GET Y/N OPTION CLSN A,='N' JMP QURY40 IF 'N', ALSO GO AHEAD COPY CAR,A ELSE SET NON-DES BIT SBIT 6,A COPY A,CAR AND SAVE JMP QURY40 THEN GO ON QURY30E COPY IPFLAG,A GET INPUT FLAG JEQ A,$+2 CAN DO JMP QURY30A CANNOT DO JMP QURYND * LPOOL TITL QUERIES-USER DATA PATTERN ***************************************************** * * USER DATA PATTERN QUERY * * QUERY - PATTERN [:6DB6]? * * DEFAULT - :6DB6 * * RESPONSE - 4 HEX DIGITS DECEPT ALL ZEROS * ****************************************************** * QURY40 EQU $ COPY PATN,A GET DEFAULT PATTERN (:6DB6) COPY A,WBUF PUT INTO WRITE BUF COPY =-776,A GET 3 BUFFS' -VE BYTE COUNT JST MOVE PUT INTO BUFFER WORD WBUF WORD WBUF+1 * JST MSGA OUTPUT MESSAGE WORD UPMSG JST IHEX JNE X,$+3  HEX INPUT, GOOD CLSN A,=:0D JMP QURY60 YES, NEXT COPY X,A SAVE USER DEFINED PATTERN COPY A,WBUF COPY =-776,A JST MOVE WORD WBUF WORD WBUF+1 QURY 41,42,60,40,30,40 JMP QURY40 ANYTHING ELSE IS BAD QURY42 JMP QURY60 * LPOOL TITL QUERIES-TEST SELECTION ************************************************* * * TEST SELECTION * * QUERY: TESTS ([A,B,C,D,E],F)? * DEFAULT IS ALL TESTS * ************************************************ * QURY60 EQU $ COPY =0,A COPY A,IPFLAG CLEAR INPUT FLAG COPY =-6,A GET DATA LENGTH JST MOVE MOVE IN TEST PARAMETERS WORD TSTBUF2 FROM HERE WORD TSTBUF1 TO HERE COPY =TSTBUF1,Y INDEX TEST TABLE JST MSGA PRINT QUERY WORD TSTMSG COPY =-6,A GET INPUT COUNT COPY A,TEMP1 SAVE IT QURY61 EQU $ JST IDEC GET INPUT JNE X,QURY60 NUMERIC IS NO GOOD QURY 63,65,ND,60,40,61,60 CSK A,='F' DO RANGE CHECK CSK A,='A' 'A' TO 'F' JMP QURY60 BAD ENTRY NOP COPY A,0(Y) SAVE IT COPY =1,A COPY A,IPFLAG THERE IS INPUT, SET FLAG ADD =1,Y BUMP TABLE ADDRESS IMS TEMP1 AND INPUT COUNT JMP QURY61 COUNT NOT EXPIRED JST IKB GET TERMINATOR CLSN =CR:,A IS IT CR ? JMP QURY65 YES JMP QURY60 NO QURY65 EQU $ COPY IPFLAG,Q GET INPUT FLAG JEQ Q,$+3 NOT SET=DEFAULT COPY =-1,A GET TEST TABLE TERMINATOR COPY A,0(Y) STORE TABLE TERMINATOR JMP PMBLR * JMP QURY70 NEXT QUERY * LPOOL TITL QUERIES-FORMAT INTERLEVE FACTOR ********************************************************* * * INTERLEAVE FACTOR SELECTION * * QUERY: FORMAT INTERLEAVING FACTOR (0 - 9 [0])? * DEFAULT IS 0 WITH NO INTERLEAVING * ********************************************************* * QURY70 EQU $ COPY =0,A COPY A,INLEV SAVE DEFAULT INTERLEAVING FACTOR COPY A,TEMP2 RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD INLEVMSG JST IDEC GET RESPONSE JLT X,QURY70 NEG NO. IS NO GOOD JEQ X,QURY73 IF ZERO SEE WHY QURY71 IMS TEMP2 SET INPUT FLAG COPY =9,A GET MAX FACTOR CSK X,A GHECK RANGE JMP $+2 OK JMP QURY70 TOO LARGE COPY X,INLEV SAVE IT QURY 72,74,74,70,30,70 JMP QURY70 ANYTING ELSE IS BAD QURY73 COPY IDCTM3,A SEE WHY IDEC VALUE IS ZERO JEQ A,QURY72 IT'S A TERMINATOR JMP QURY71 MUST BE FACTOR 0 QURY74 JMP PMBLR LPOOL  TITL PMBLR - ECHO MFR'S BAD TRACKS LIST? ************************************ * * * PMBLR: PRINT MANUFACTURER'S BAD TRACKS LIST * * * CALLS: * MSGA * ODEC * * *********************************** * PMBLR EQU $ COPY CAR,A GET OPTION TBIT 5,A LP OPTION BIT ON? JF OV,$+3 NO SKIP NXT 2 INST COPY =1,A SET LP FLAG COPY A,LPFLAG COPY MFRFLG,A PRINT? JEQ A,FIN NO JST MSGA YES, DO HEADING WORD PMFRL COPY =-20,Q LINE COUNT COPY =BADBUF2,A SET UP BUFFER POINTER COPY A,BUFPTR REPEAT COPY *BUFPTR,A GET CYL/HD PAIR ADD =1,A IS IT END IF BUFFER? JNE A,$+2 NO, SKIP NEXT INSTRUCTION JMP EDLT YES, PRINT END LIST JST MSGA PRINT BAD TRACKS WORD BADTRK COPY *BUFPTR,A GET CYL NUMBER AND =:FFF0,A ISOLATE CYL NO SHIFT A,RO,4 LINE IT UP JST ODEC PRINT IT JST MSGA PRINT BAD HEAD WORD BADTK1 COPY *BUFPTR,A GET HEAD NO AND =:000F,A ISOLATE HEAD NUMBER JST ODEC PRINT IT IJNE Q,$+5 COPY =-20,Q JST MSGA WAIT IF 20 LINES PRINTED WORD PMBMSG JST IKB WAIT FOR ANY INPUT IMS BUFPTR BUMP BUFFER POINTER NOP JMP REPEAT LOOP FOR MORE EDLT JST MSGA PRINT END MESSAGE WORD ENDMFR FIN COPY ERLPFL,A GET LP FLAG EXCH A, LPFLAG CHANGE WITH ERROR FLAG COPY A,ERLPFL RESTORE ERROR AND LP FLAGS JMP QURYND FINISHED * LPOOL TITL QUERIES-DEVICE ADDR MODIFICATION ************************************************ * * DEVICE ADDRESS MODIFICATION * ************************************************ * QURYND EQU $ COPY CAR,A GET RUN OPT TBIT 5,A LP OPTION ON? JF OV,$+3 NO, BY PASS NXT 2 INST COPY =1,A YES, SET LPFLAG COPY A,LPFLAG * COPY DEVAD,Q GET DIVICE ADDRESS SHIFT Q,LO,3 SHIFT TO CORRECT POSITION COPY =-5,A NUMBER OF I/O ADDRESS COPY A,QTMP SAVE IT AS COUNT COPY =IOTAB,Y GET TABLE ADDRESS DAADO COPY 0(Y),X GET I/O INSTRUCTION ADDRESS COPY =-:F9,A AND 0(X),A 'AND' OUT THE OLD ADDRESS OR Q,A 'OR' IN THE NEW ADDRESS COPY A,0(X) REPLACE THE OLD INSTRUCTION ADD =1,Y BUMP TABLE POINTER IMS QTMP AND THE TABLE COUNTER JMP DAADO GO FOR MORE JMP EXEC * DEVAD WORD :14 DEVICE ADDRESS CELL (00-1F) QTMP WORD 0 TEMPERY CELL * LPOOL TITL EXEC-TEST EXECUTIVE *********************************** * * EXEC - TEST EXECUTIVE * THIS IS THE TEST CONTROL SECTION * * * CALLS: CALLED BY: * FORMAT TESTC  NONE * TESTA TESTD * TESTB TESE * * *********************************** * EXEC EQU $ COPY MODE,A GET FUNCTION MODE CLSN A,='T' TECH? JMP TECH YES, GO TO TECH TEST JST ECCRTY CALL SUB TO OUTPUT OPTION(S) COPY MODE,A GET FUNTION AGAIN CLSN A,='D' DIAGNOSTIC? JMP EXECD YES CLSN A,='F' FORMATTER? JMP EXECF YES JMP PSU NONE OF THE ABOVE, RESTART EXECD EQU $ COPY =:180,A INITIALIZE STACKS COPY A,K COPY =:120,A COPY A,L JST CRLF NEXT LINE JST MSGA PRINT 'PASS' WORD PASSMSG COPY PASS,A GET PASS # JST ODEC PRINT IT JST MSGA PRINT 'UNIT' WORD UNITMSG COPY =UCUR,X INDEX UNIT TABLE COPY 0(X),A SUB =:FFFF,A END OF TABLE? JEQ A,EXECD0 YES COPY 0(X),A NO, RESTORE UNIT # ADD =1,X BUMP POINTER JST ODEC OUTPUT # COPY =' ',A PRINT SPACE JST OTTY JMP $-8 GO BACK FOR MORE EXECD0 JST CRLF PRINT A BLANK LINE COPY =TSTBUF1,X INDEX TEST SELECTION BUF EXECD1 EQU $ COPY X,TEMP0 SAVE TEST POINTER COPY 0(X),A GET TABLE CONTENT SUB =-1,A IS IT END OF TABLE? JEQ A,EXEAE YES, GO EXEAE COPY 0(X),A RESTORE A-REG CLSN A,='A' IS IT TEST A? JMP $+2 YES, JMP $+3 JST TESTA DO TEST A JST ECCRTY AND OUTPUT OPTIONS COPY TEMP0,X RESTORE TABLE PTR COPY 0(X),A CLSN A,='B' JST TESTB TEST B COPY TEMP0,X COPY 0(X),A CLSN A,='C' JST TESTC TEST C COPY TEMP0,X COPY 0(X),A CLSN A,='D' JMP $+2 IF TESTD, CHECK OPTION JMP $+8 IF NOT, GO ON COPY CAR,A GET OPTION TBIT 6,A IS SAVE DATA OPT ON? JF OV,$+4 NO, GO AHEAD JST MSGA MESSAGE 'CANNOT RUN NON-DES...' WORD SMGA4 JMP EXECD3 GO NEXT TEST JST TESTD TEST D COPY TEMP0,X COPY 0(X),A CLSN A,='E' JST TESTE TEST E COPY TEMP0,X COPY 0(X),A CLSN A,='F' JST TESTF TEST F EXECD3 COPY TEMP0,X ADD =1,X BUMP TABLE POINTER JMP EXECD1 LOOP BACK EXEAE EQU $ COPY CAR,A GET RUN OPTION TBIT 0,A IS ACCUM. ERR. BIT ON? JF OV,EXECD2 NEXT, IF 'N' OPTION COPY =TSTBUF1,Y INDEX TSET TABLE COPY 0(Y),A GET CONTENT EXEAE1 EQU $ COPY =:0F,Q GET MASK WORD AND Q,A MASK OUT UNWANTED BITS SUB =1,A LESS 1 COPY =EROTAB,X GET ERR TAB ADD A,X OFFSET INTO ERR TAB COPY 0(X),A GET # OF ERRORS COPY EROTOL,Q GET TOTAL # OF ERR ADD Q,A UPDATE COPY A,EROTOL UPDATE ADD   =1,Y BUMP INDEX TEST TABLE COPY 0(Y),A GET NEXT CONTENT CSK A,=-1 END OF TABLE? NOP JMP EXEAE1 NO, GO BACK. ELSE, GO ON JST MSGA WORD EROACC 'ACCUMULATED ERRORS: ' COPY EROTOL,A GET TOTAL # OF ERR OF PASS JST ODEC AND OUTPUT JST CRLF EXECD2 EQU $ COPY CAR,A GET RUN OPTION TBIT 3,A IS RUN CONT. BIT ON? JT OV,$+2 YES, CONTINUE JMP PSU ELSE, RESTART IMS PASS BUMP PASS JMP $+2 PASS STILL GOOD JMP PSU MAX. PASS REACHED, RESTART JMP EXECD GO ON EXECF EQU $ JST FORMAT GO FORMAT JST MFRBTFT GO FORMAT MFR'S BAD TRACKS JMP PSU RESTART * TEMP0 WORD 0 TEMP CELL * LPOOL TITL TESTA-TEST A SUBROUTINE *********************************** * * TESTA - TEST A SUBROUTINE * * THIS ROUTINE PERFORM THE FOLLOWING DIAGNOSTICS: * (1) SENSE CONTROLLER PRESENCE AND READY, * (2) INITIALIZE THE DISK. * (3) TEST JUMPER E7 AND E8 * (4) TEST JUMPER E1 AND E2 * * * CALLING SEQUENCE: NONE * * CALLS: CALLED BY: * CIOB  EXEC * ERROR * MSGA * OTA * OTX * SENHIM * SENRDY *  TIME * * *********************************** * TESTA EQU $ ENT COPY =TSTA,A GET 'TEST A' MES ADDR COPY A,ERTST AND STORE  COPY =1,A SET ADDR FLAG COPY A,ERADFL NOT TO PRINT CYL/HEAD WHEN ERR COPY MODE,A GET FUNCTION CLSN A,='F' SEE IF CAME FROM FORMATTER JMP $+7 YES, SKIP HEADING COPY =0,A ZERO UNIT # COPY A,UNIT DO IT COPY A,ERORA CLEAR ERROR CNT CELL COPY A,EROTT SAVE OFFSET=0 FOR TALL USE JST MSGA OUTPUT TEST HEADING WORD TSTA TSTAA1 EQU $ COPY =:A001,A GET CDR CONTENT SELP A,4 DISPLAY IT JST OTX DO A SOFTWARE RESET COPY =0,A SET UP TIMER COPY A,TC1 DO IT COPY =-36,A SET UP TIMER - 18 SECS FOR 4/95 & 36 SECS FOR 4/30 COPY A,TC2 DO IT JST TIME TIME IT FOR 20 SECONDS JMP $+3 TIME NOT EXPIRE YET NOP JMP TSTA1 TIME EXPIRE, PROCEED FORWARD JST SENRDY CONTROLLER READY? JMP $-5 NO! NOP YES TSTA1 EQU $ COPY =:A002,A GET CDR CONTENT SELP A,4 DISPLAY CDR JST SENHIM DEVICE PRESENCE? JMP TSTA1A NO, SAY NO JST SENRDY DEVICE REDY? JMP TSTA1B NO, SAY SO JMP TSTA2 OK, GO TO NEXT TEST TSTA1A EQU $ JST MSGA PRINT 'DEVICE NOT PRESENT' WORD TSTA1M JMP TSTA2 GO TO NEXT TEST TSTA1B EQU $ JST MSGA PRINT 'DEVICE NOT READY' WORD TSTA1M1 JMP TSTA2 GO NEXT TEST * LPOOL TSTA2 EQU $ * SET UP IOB COPY =UCUR,Y INDEX UNIT # TABLE JST CIOB CLEAR IOB COPY =DIOB,X INDEX IOB COPY 0(Y),A GET CURENT UNIT # SUB =:FFFF,A IS IT END OF TABLE? JNE A,$+2 NO, DO NOT EXIT  JMP TSTA3 COPY 0(Y),A NO, RESTORE UNIT # COPY A,UNIT SAVE IT COPY HPD,Q GET HEAD/CYL SHIFT Q,LO,8 LINE IT UP OR Q,A OR IN HEAD/CYL WITH UNIT # COPY A,US(X) SAVE IT ADD =1,Y BUMP TABLE POINTER * COPY =INIT,A GET INITIALIZATION COMMAND COPY A,OP(X) SAVE IT COPY =:200,A GET BYTE/SECTOR COPY A,CS(X) SAVE IT COPY =TSTA2CK,A GET INT ADDR COPY A,HS(X) SAVE IT COPY INITBK,A PARAMETERS COPY A,SSS(X) SAVE IT COPY INITBK+1,A COPY A,WC(X) COPY INITBK+2,A COPY A,MA(X) COPY INITBK+3,A COPY A,IN(X) COPY INITBK+4,A COPY A,NB(X) * INITIALIZATION TSTA2L EQU $ COPY =:A002,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR COPY =:110,A ENABLE ALL INTERRUPTS COPY A,S COPY =-12,A JST MOVE  WORD DIOB SAVE DIOB WORD SIOB COPY =DIOB,A GET IOB ADDRESS JST OTA SEND IT COPY =0,A COPY A,TC1 COPY =-3,A SET TIME=3 SEC COPY A,TC2 JST TIME TIME IT JMP $-1 TIME NOT EXPIRE YET JST MSGA WORD NOEOB 'NO EOB FROM TCU @ INITIALIZATION.' JMP DEBUG4 GO TO DEBUG * LPOOL TSTA2CK EQU $ JST $+1 INTRRUPT ENTRY POINT MUST BE A JST OR JSK NOP COPY =DIOB,X INDEX IOB COPY CST(X),A GET CONTROLLER STATUS COPY A,Q SUB =:400,Q IS IT :400? JNE Q,TST2A NO, ERROR JMP TSTA2+2 NEXT TEST TST2A EQU $ COPY =2,A SET ERROR NUMBER COPY A,ERNO JST ERROR CALL ERROR JMP TSTA2+2 NEXT TEST * TSTA3 COPY MODE,A CLSN A,='F' CAME FORM FORMATTER? JMP TSTAND+1 YES, EXIT COPY =:A003,A SELP A,4 COPY =-12,A JST MOVE WORD SIOB GET SAVED IOB WORD DIOB COPY =TSTA3IN,A GET INT ADDR COPY A,DIOB+3 SAVE IT COPY =:1110,A DISABLE EOB COPY A,S UIS UPDATE INTERRUPT STATUS COPY =DIOB,A GET IOB ADDR JST OTA SEND IT COPY =0,A COPY A,TC1 COPY =-4,A SET TIME=4 SEC COPY A,TC2 COPY A,TEMP1 PUT SOMETHING IN FLAG JST TIME TIME IT JMP $-1 NOT YET EXPIRED JMP TSTA4 GOOD, GO NEXT TEST TSTA3IN JST $+1 NOP COPY TEMP1,A GET FLAG JEQ A,TSTA4+2 GOOD FLAG JST MSGA MESSAGE WORD JMPCK78 'CHECK JUMPER E7-E8, AND RESTART' JMP DEBUG4 GO TO DEBUG TSTA4 EQU $ COPY =0,A GOOD FLAG COPY A,TEMP1 COPY =:110,A ENABLE EOB COPY A,S UIS UPDATE INT STATUS COPY =:A004,A SELP A,4 SBIT 6,S TURN ON XA BIT COPY =-12,A JST MOVE WORD SIOB GET SAVED IOB WORD :8180 TO LOCATION :8180 COPY =-12,A JST MOVE WORD SIOB WORD :180 TO LOCATION :180 COPY =TAGOOD,A COPY A,MEMGOOD+3 GOOD INT ADDR COPY =TABAD,A COPY A,MEMBAD+3 BAD INT ADDR COPY =MEMGOOD,A GET IOB ADDR RBIT 6,S OFF XA BIT JST OTA SEND IT JMP $ WAIT HERE TABAD EQU $ JST $+1 NOP JST MSGA MESSAGE WORD JMPCK12 'CHECK JUMPER E1-E2, AND RESTART' JMP DEBUG4 GO TO DEBUG TAGOOD EQU $ JST $+1 NOP TSTAND EQU $ JST EROTAL COPY =0,A RESET ERR ADDR FLAG COPY A,ERADFL TO PRINT CYL/HEAD JMP *TESTA EXIT LPOOL TITL TESTB-TEST B SUBROUTINE *********************************** * * TESTB - TEST B SUBROUTINE * * THIS TEST PERFORM THE FOLLOWING: * (1) TEST I/O, * (2) SEEK ONLY. * * * CALLS: CALLED BY: * CIOB EXEC * ERROR * MSGA * OTA * * *********************************** * TESTB EQU $ TEST B ENTRY POINT ENT COPY =TSTB,A GET 'TET B' MES ADDR COPY A,ERTST AND STORE COPY =1,A COPY A,ERADFL NOT PRINT HEAD/CYL ERR ADDR JST MSGA PRINT TEST HEADING WORD TSTB COPY =0,A COPY A,ERORB CLEAR ERR CNT CELL COPY =1,A COPY A,EROTT SAVE OFFSET=1 COPY =UCUR,Y INDEX UNIT # TABLE COPY =0,A ZERO UNIT # COPY A,UNIT DO IT TSTB1 EQU $ * SET UP IOB JST CIOB CLEAR IOB COPY =DIOB,X INDEX IOB COPY 0(Y),A GET CURRENT UNIT #  SUB =:FFFF,A IS IT END OF TABLE? JEQ A,TBEXLNK YES EXIT COPY 0(Y),A NO, RESTORE UNIT # COPY A,UNIT SAVE IT COPY A,US(X) SAVE IT ADD =1,Y BUMP TABLE POINTER COPY =TIO,A GET TEST I/O COMMAND COPY A,OP(X) SAVE IT COPY =TB1INT,A GET INT ADDR COPY A,IN(X) SAVE IT * TEST I/O COPY =:B001,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR SBIT 8,S ENABLE INTS COPY =DIOB,A INDEX IOB JST OTA SEND IT JMP $ WAIT FOR INT * TBEXLNK JMP TSTB3 LI  NK TO EXIT INSTRUCTION * TB1INT EQU $ JST $+1 INT ENTRY MUST BE JST/JSK NOP COPY =DIOB,X INDEX IOB COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT :400? JNE A,TST1B NO, ERROR JMP TSTB2 YES, NEXT TEST TST1B EQU $ COPY =3,A GET ERROR NUMBER COPY A,ERNO SAVE IT JST ERROR CALL ERROR JMP TSTB2 EXIT * LPOOL * TSTB2 EQU $ COPY =0,A COPY A,ERADFL PRINT HEAD/CYL ADDR WHEN ERR * SET UP IOB COPY =DIOB,X INDEX IOB COPY =SEEK,A GET SEEK ONLY COMMAND COPY A,OP(X) SAVE IT COPY =TB2INT,A GET INT ADDR COPY A,IN(X) SAVE IT * SEEK ONLY COPY =TSTB2B,A GET INT RETURN ADDR COPY A,TB2INTED SAVE IT TSTB2A EQU $ COPY =:B002,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR SBIT 8,S ENABLE INT COPY =DIOB,A GET IOB ADDR JST OTA SEND IT JMP $ WAIT FOR INT * TB2INT EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =DIOB,X INDEX IOB COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT :400? JNE A,TST2B NO, ERROR CONDITION JMP *$+1 YES, EXIT TB2INTED WORD 0 EXIT ADDRESS CELL * SET UP FOR LAST CYLINDER TSTB2B EQU $ COPY =TSTB1+1,A GET INT RETURN ADDR COPY A,TB2INTED SAVE IT COPY =DIOB,X INDEX IOB COPY CS(X),A GET LAST CYL #. IS IT=0? JNE A,TB1LNK NO, NEXT COPY MAXCYL,A YES, SET FOR LAST CYL COPY A,CS(X) SAVE IT JMP TSTB2A SEEK LAST CYL * TB1LNK JMP TSTB1+1 EXIT LINK * TST2B EQU $ COPY =4,A GET ERROR NUMBER COPY A,ERNO SAVE IT JST ERROR CALL ERROR JMP TSTB1+1 EXIT * TSTB3 JST EROTAL GO TALLY SUB JMP *TESTB EXIT LPOOL TITL TESTC-TEST C SUBROUTINE *********************************** * * TESTC - TEST C SUBROUTINE * * THIS ROUTINE PERFORM THE FOLLOWING: * (1) WRITE 512 WORDS OF DATA (AT RANDOMLY * GENERATED CYL, SECTOR & HEAD) * (2) READ VERIFY THE ABOVE DATA, * (3) WRITE 513 WORDS OF DATA (AT THE SAME * CYL, SECTOR & HEAD IN PART (1)), AND * (4) READ VERIFY THE ABOVE DATA. * * * CALLING SEQUENCE: JST TESTC * * * CALLS: CALLED BY: * CIOB EXEC * ERROR * MSG * OHEX * OTA *  PREP * SAVER * SAVEW * * *********************************** * TESTC EQU $ ENT COPY =TSTC,A GET 'TEST C' MES ADDR COPY A,ERTST AND STORE COPY CAR,A GET RUN OPTION TBIT 6,A IS NON-DEST ON? JF OV,$+2 NO RBIT 4,S YES, DISABLE CONSOLE INT JST MSGA PRINT TEST HEADING WORD TSTC COPY =0,A COPY A,ERORC CLEAR ERR CNT CELL COPY =2,A COPY A,EROTT SAVE OFFSET=2 COPY SEED,A GET SEED COPY A,SEEDSAVE SAVE SEED FOR TEST D COPY =-100,A GET NUMBER OF OPERATIONS COPY A,CTL SAVE IT TSTC0 COPY CTL,A GET NUMBER OF OPERATION JEQ A,TCGEXLNK DONE, EXIT JST PREP PERPARE DISK PHYSICAL ADDRESS COPY =UCUR,Y INDEX UNIT # TABLE COPY =0,A ZERO UNIT # COPY A,UNIT DO IT TSTC1 EQU $ * SET UP IOB JST CIOB CLEAR IOB COPY =DIOB,X INDEX IOB COPY 0(Y),A GET CURENT UNIT # SUB =:FFFF,A IS IT END OF TABLE? JEQ A,TCEXLNK YES EXIT COPY 0(Y),A NO, RESTORE UNIT # COPY A,UNIT SAVE IT COPY A,US(X) SAVE IT ADD =1,Y BUMP TABLE POINTER COPY =WRTDAT,A GET WRITE DATA (WITHOUT FILE LINK) COMMAND COPY A,OP(X) SAVE IT COPY CYL,A GET CYL NO. COPY A,CS(X) SAVE IT COPY HEAD,A GET HEAD # COPY A,HS(X) SAVE IT COPY SECTOR,A GET SEC  TOR # COPY A,SSS(X) DO IT COPY =WBUF,A GET WRITE BUFFER ADDRESS COPY A,MA(X) SAVE IT COPY =TC1INT,A GET INT ADDR COPY A,IN(X) SAVE IT COPY =:300,A SAVE 3 SECTORS COPY A,WC(X) JST SAVER CHECK IF NON-DESTRUCTIVE MODE REQUIRED COPY =512,A GET TRANSFER WORD COUNT COPY A,WC(X) SAVE IT * WRITE 512 WORDS COPY =0,A CLEAR INT LINK COPY A,INTLNK SAVE IT TSTC1A EQU $ COPY =:C001,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR SBIT 8,S ENABLE INT COPY =DIOB,A GET IOB ADDR JST OTA SEND IT JMP $ WAIT FOR INT * TCEXLNK JMP TSTC6 LINK TO EXIT TCGEXLNK JMP TSTC7 LINK TO GRAND EXIT * LPOOL TC1INT EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =DIOB,X INDEX IOB COPY CST(X),A GET CONTROLLER STATUS  SUB =:400,A IS IT :400? JNE A,TST1C NO, ERROR OCCURED JMP TST1CK+1 YES, ... TST1C EQU $ COPY =5,A SET ERROR NUMBER COPY A,ERNO SAVE IT COPY INTLNK,A GET INT LINK, IS IT =0? JEQ A,TST1CK YES, ... SUB =1,A IS IT=1? JNE A,$+3 NO... IMS ERNO YES, ERROR #6 JMP TST1CK SUB =1,A IS IT=2? JNE A,$+3 NO... IMS ERNO YES, ERROR #7 JMP TST1CK SUB =1,A IS IT=3? JNE A,$+4 NO... IMS ERNO YES, ERROR #8 JST ADRFLP GO FLIP ADDR, JST ERROR & FLOP ADDR JMP TST1CK+1 COPY =:FFFF,A NONE OF THE ABOVE COPY A,ERNO UNIMPLEMENTED ERROR * TST1CK EQU $ JST ERROR CALL ORROR COPY INTLNK,A GET INT LINK JEQ A,INTEX EXIT TO TSTC2 IF INT LINK=0  SUB =1,A IS IT=1? JEQ A,INTEX1 YES, EXIT TO TSTC3 SUB =1,A IS IT=2? JEQ A,INTEX2 YES, EXIT TO TSTC4 SUB =1,A IS IT=3? JEQ A,INTEX3 YES, EXIT TO TSTC5 COPY =:FFFF,A NONE OF THE ABOVE COPY A,ERNO UNIMPLEMENTED ERROR JST ERROR CALL ERROR COPY =:300,A WRITE 3 SECTORS BACK COPY A,WC(X) JST SAVEW CHECK IF NON-DESTRUCTIVE MODE REQUIRED JMP TSTC1+1 EXIT INTEX JMP TSTC2 INTEX1 JMP TSTC3 INTEX2 JMP TSTC4 INTEX3 JMP TSTC5 * LPOOL TSTC2 EQU $ COPY =:C002,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR * SET UP IOB COPY =DIOB,X INDEX IOB COPY =RDVER,A GET READ VERIFY (NO FILE LINK) COMMAND COPY A,OP(X) SAVE IT * READ VERIFY (512 WORDS) COPY =1,A SELECT INT LINK COPY A,INTLNK SAVE IT TSTC2A EQU $ SBIT 8,S ENABLE INT COPY =DIOB,A GET IOB ADDR JST OTA SEND IT JMP $ WAIT FOR INT * TSTC3 EQU $ * SET UP IOB COPY =DIOB,X INDEX IOB COPY =WRTDAT,A GET WRITE DATA COMMAND COPY A,OP(X) SAVE IT COPY =513,A GET TRANSFER WORD COUNT COPY A,WC(X) SAVE IT * WRITE 513 WORDS COPY =:C003,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR COPY =2,A SELECT INT LINK COPY A,INTLNK SBIT 8,S ENABLE INT COPY =DIOB,A GET IOB ADDR JST OTA SEND IT JMP $ WAIT FOR INT * LPOOL TSTC4 EQU $ * SET UP IOB COPY =DIOB,X INDEX IOB COPY =RDVER,A GET READ VERIFY COMMAND OR =:0080,A TOGETHER WITH FILE LINK COPY A,OP(X) SAVE IT * READ VERIFY (513 WORDS) COPY =:C004,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR COPY =3,A SELECT INT LINK COPY A,INTLNK SAVE IT SBIT 8,S ENABLE INT JST ADRSAV SAVE CY,HD & SECT BEFORE F-LINK COPY =DIOB,A GET IOB ADDR JST OTA SEND IT JMP $ WAIT FOR INT * LPOOL TSTC5 EQU $ COPY =DIOB,X INDEX IOB COPY =:300,A GET 3 SECTORS IN WD CNT COPY A,WC(X) COPY CS(X),A GET CYL #   SUB CYL,A IS IT ZERO? JNE A,TST5C NO, ERROR OCCURED COPY HS(X),A GET HEAD NUMBER SUB HEAD,A IS IT ZERO? JNE A,TST5C IF IT IS NOT 0 IMPLIES ERROR COPY SSS(X),A GET SECTOR # SUB SECTOR,A GET RID OF OFFSET SUB =3,A IS IT=3? JNE A,TST5C NO, ERROR RESULTED JST SAVEW CHECK IF NON-DESTRUCTIVE MODE REQUIRED JMP TSTC1+1 YES, EXIT TST5C EQU $ COPY =9,A SET ERROR NUMBER COPY A,ERNO SAVE IT JST ADRFLP GO FLIP ADDR, JST ERROR & FLOP ADDR JST SAVEW CHECK IF NON-DESTRUCTIVE MODE REQUIRED JMP TSTC1+1 EXIT * INTLNK WORD 0 INTERRUPT LINK CELL * TSTC6 IMS CTL BUMP CTL NOP JMP TSTC0 LOOP FOR MORE TSTC7 JST EROTAL GO ERR TALLY SUB SBIT 4,S ENABLE CONSOLE INT JMP *TESTC EXIT LPOOL TITL TESTD-TEST D SUBROUTINE *********************************** * * TESTD - TEST D SUBROUTINE * * THIS TEST PERFORM THE FOLLOWING: * (1) READ DIRECT FROM THE SAME RANDOMLY *  GENERATED CLY, SEC & HEAD AS IN TEST C * PLUS 1 SEC (A TOTAL OF 2 SECTORS) * (2) READ THE 2 SECTORS IN PART 1 * * PART 1 & 2 WILL BE REPEATED 100 TIMES * * * CALLS: CALLED BY: * CIOB EXEC * CKREAD * ERROR * MSGA * OTA *  PCONVL * PREP * * *********************************** * TESTD EQU $ ENT COPY =TSTDMSG,A GET 'TEST D' MES ADDR COPY A,ERTST AND STORE JST MSGA PRINT TEST HEADING WORD TSTDMSG COPY =0,A COPY A,ERORD CLEAR ERR CELL COPY =3,A COPY A,EROTT OFFSET=3 COPY SEEDSAVE,A GET ORIGINAL SEED COPY A,SEED SAVE IT COPY =-100,A GET OPERATION COUNT COPY A,CTL SAVE IT TSTD0 COPY CTL,A GET OPERATION COUNT JEQ A,TDGEXLNK DONE, EXIT JST PREP PERPARE DISK PHYSICAL ADDRESS COPY =UCUR,Y INDEX UNIT # TABLE COPY =0,A ZERO UNIT # COPY A,UNIT DO IT * SET UP IOB TSTD EQU $ JST CIOB CLEAR IOB COPY =DIOB,X INDEX IOB COPY 0(Y),A GET CURENT UNIT # SUB =:FFFF,A IS IT END OF TABLE? JEQ A,TDEXLNK YES EXIT COPY 0(Y),A NO, RESTORE UNIT # COPY A,UNIT SAVE IT COPY A,US(X) SAVE IT ADD =1,Y BUMP TABLE POINTER COPY =0,A CLEAR A-REG COPY A,CS(X) ME TOO COPY =DIRRD,A GET DIRECT READ COMMAND COPY A,OP(X) SAVE IT COPY X,TEMP1 SAVE IOB ADDR COPY Y,TEMP2 SAVE UNIT TABLE POINTER COPY CYL,Q GET CYL # COPY SECTOR,X GET SECTOR # COPY HEAD,Y GET HEAD # JST PCONVL CONVERT PHYSICAL ADDR TO LOGICAL ADDR COPY TEMP1,X RESTORE X-REG COPY TEMP2,Y RESTORE UNIT TABLE POINTER COPY A,CS(X) SAVE LOGICAL ADDR COPY Q,HS(X) COPY =2,A GET NUMBER OF SECTOR TO READ COPY A,SSS(X) SAVE IT COPY =256,A GET NUMBER OF WORDS PER SECTOR COPY A,WC(X) SAVE IT COPY =RBUF,A GET READ BUFFER ADDR COPY A,MA(X) SAVE IT COPY =TSTD1INT,A GET INT ADDR COPY A,IN(X) SAVE IT COPY =-5,A SET UP RETRY COUNT COPY A,COUNT SAVE IT * READ DIRECT (512 WORDS) TSTD1 EQU $ COPY =:D001,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR SBIT 8,S ENABLE INT COPY =DIOB,A GET IOB ADDR JST OTA SEND IT JMP $ WAIT FOR INT * TDEXLNK JMP TSTD3 LINK TO EXIT TDGEXLNK JMP TSTD4 LINK TO GRAND EXIT * TSTD1INT EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =DIOB,X INDEX IOB COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT :400? JEQ A,TSTD1A YES, GO CHECK DATA TRANSFERED COPY COUNT,A NO, GET RET RY COUNT JEQ A,TSTD1B COUNT EXPIRED, FLAG ERROR IMS COUNT COUNT STILL GOOD, BUMP IT NOP COPY =:100,A RESTORE WORD TRANSFER COPY A,WC(X) DO IT JMP TSTD1 LOOP BACK FOR MORE * TSTD1A EQU $ COPY =:1FF,A GET LENGHT OF READ BUFFER LESS ONE COPY A,BUFLNG SAVE IT JST CKREAD CALL DATA CHECK ROUTINE JMP TSTD2 DATA OK, GO NEXT TEST COPY =12,A DATA NOT OK, ERROR FLAGGED COPY A,ERNO SAVE NUMBER JST ERROR CALL ERROR JMP TSTD2 EXIT * TSTD1B EQU $ COPY =13,A SAVE ERROR NUMBER COPY A,ERNO JST ERROR JMP TSTD2 EXIT * LPOOL TSTD2 EQU $ * SET UP IOB COPY =DIOB,X INDEX IOB COPY =RDDAT,A GET READ COMMAND COPY A,OP(X) SAVE IT COPY CYL,A GET CYL # COPY A,CS(X) SAVE IT COPY HEAD,A GET HEAD # COPY A,HS(X) SAVE IT COPY SECTOR,A GET SECTOR # COPY A,SSS(X) SAVE IT COPY =:200,A GET WORDS PER SECTOR COPY A,WC(X) SAVE IT COPY =RBUF,A GET READ BUFFER ADDR COPY A,MA(X) SAVE IT COPY =TSTD2INT,A GET INT ADDR COPY A,IN(X) SAVE IT COPY =-5,A SET UP RETRY COUNT COPY A,COUNT SAVE IT * READ 512 WORDS TSTDII EQU $ COPY =:D002,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR SBIT 8,S ENABLE INT COPY =DIOB,A GET IOB ADDR JST OTA SEND IT JMP $ WAIT FOR INT * TSTD2INT EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =DIOB,X INDEX IOB COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT :400? JEQ A,TSTD2A YES, GO CHECK DATA TRANSFERED COPY COUNT,A NO, GET RETRY COUNT JEQ A,TSTD2B COUNT EXPIRED, FLAG ERROR IMS COUNT COUNT STILL GOOD, BUMP IT NOP COPY =:200,A RESTORE WORD TRANSFER COPY A,WC(X) DO IT JMP TSTDII LOOP BACK FOR MORE * TSTD2A EQU $ COPY =:1FF,A GET READ BUFFER LENGHT LESS ONE COPY A,BUFLNG SAVE IT JST CKREAD CALL DATA CHECK ROUTINE JMP TSTD+1 DATA OK, GO NEXT TEST COPY =14,A DATA NOT OK, ERROR FLAGGED COPY A,ERNO SAVE NUMBER JST ERROR CALL ERROR JST MSGA PRINT 'EXPECTED WORD' WORD EXWD COPY TDQ,A GET EXPECTED WORD JST OHEX PRINT IT JST MSGA PRINT ACTUAL WORD WORD ACTWD COPY TDA,A GET ACTUAL WORD JST OHEX PRINT IT JST CRLF JMP TSTD+1 EXIT * TSTD2B EQU $ COPY =15,A SAVE ERROR NUMBER COPY A,ERNO JST ERROR JMP TSTD+1 EXIT * TSTD3 IMS CTL BUMP CTL NOP JMP TSTD0 LOOP FOR MORE TSTD4 JST EROTAL GO ERR TALLY JMP *TESTD EXIT * TDA WORD 0 ACTUAL WORD CELL TDQ WORD 0 EXPECTED WORD CELL * LPOOL TITL TESTE-TEST E SUBROUTINE ************************************ * * TESTE - TEST E * THIS TEST CHECKS THE DATA CHAIN * CAPABILITY OF: * (1) WRITE 3 SECTORS WITH FILE LINK, AND * (2) READ 3 SECTORS WITH FILE LINK. * * * CALLING SEQUENCE: JST TESTE * * * CALLS: CALLED BY: * CIOB EXEC * CKREAD * ERROR * MSGA * OTA * * *********************************** * TESTE EQU $ ENT COPY =TSTEMSG,A GET 'TEST E' MES ADDR COPY A,ERTST AND STORE COPY CAR,A GET RUN OPTION TBIT 6,A IS NON-DEST ON? JF OV,$+2 RBIT 4,S YES, DISABLE CONSOLE INT JST MSGA PRINT TEST HEADING WORD TSTEMSG COPY =0,A COPY A,ERORE COPY =4,A COPY A,EROTT OFFSET=4 COPY =UCUR,Y INDEX UNIT # TABLE COPY =0,A ZERO UNIT # COPY A,UNIT DO IT * SET UP IOB TSTE EQU $ JST CIOB CLEAR IOB COPY =DIOB,X INDEX IOB COPY 0(Y),A GET CURENT UNIT # SUB =:FFFF,A IS IT END OF TABLE? JEQ  A,TEEXLNK YES EXIT COPY 0(Y),A NO, RESTORE UNIT # COPY A,UNIT SAVE IT COPY A,US(X) SAVE IT ADD =1,Y BUMP TABLE POINTER COPY =0,A CLEAR SECTOR # COPY A,SSS(X) SAVE IT COPY =WRTDAT,A GET WRITE DATA COMMAND OR =:0080,A TOGETHER WITH FILE LINK COPY A,OP(X) SAVE IT COPY =:120,A GET CYL # COPY A,CS(X) SAVE IT COPY =WBUF,A GET WRITE BUFFER ADDR COPY A,MA(X) SAVE IT COPY =TSTE1INT,A GET INT ADDR COPY A,IN(X) SAVE IT COPY =DCIOB,A GET DATA CHAIN IOB ADDR COPY A,NB(X) SAVE IT * SET UP DATA CHAIN IOB COPY =DCIOB,X INDEX DCIOB COPY =256,A GET TRANSFER WORD COUNT COPY A,DCWC(X) SAVE IT COPY =WBUF1,A GET 2ND WRITE BUFFER ADDR COPY A,DCMA(X) SAVE IT COPY =0,A CLEAR A-REG COPY A,DCRS(X) PUT IT IN HERE COPY =DCIOB1,A GET 2ND DCIOB ADDR COPY A,DCAD(X) SAVE IT * SET UP ANOTHER DCIOB COPY =DCIOB1,X INDEX 2ND DCIOB COPY =256,A GET TRANSFER WORD COUNT COPY A,DCWC(X) SAVE IT COPY =WBUF2,A GET 3RD WRITER BUFFER ADDR COPY A,DCMA(X) SAVE IT COPY =0,A CLEAR OUT RESERVED WORD COPY A,DCRS(X) SAVE IT COPY A,DCAD(X) TERMINATE DATA CHAIN COPY =:300,A GET 3 SECTOR WD CNT COPY A,WC+DIOB SAVE JST SAVER SAVE DATA IF NECESSARY COPY =256,A GET TRANSFER WORD COUNT COPY A,WC+DIOB SAVE IT * TSTE1 EQU $ * WRITE 256 WORDS 3 TIMES BY MEANS OF DATA CHAIN COPY =:E001,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR JST ADRSAV GO SAVE CY,HD & SECT BEFORE F-LINK COPY =DIOB,A GET IOB ADDR SBIT 8,S ENABLE INT JST OTA SEND IT JMP $ WAIT FOR INT * TEEXLNK JMP TSTE3 LINK TO EXIT * TSTE1INT EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =DIOB,X INDEX IOB COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT OK? JEQ A,TSTE1A YES, GO CHECK FILE LINK COPY =16,A NO, FLAG ERROR COPY A,ERNO SAVE IT JST ADRFLP FLIP ADDR, JST ERROR & FLOP ADDR TSTE1A EQU $ COPY =DIOB,X INDEX IOB COPY CS(X),A GET CYL # SUB =:120,A IS IT :120? JNE A,TSTE1B NO, ERROR COPY HS(X),A GET HEAD NUMBER JNE A,TSTE1B NOT ZERO===ERROR COPY SSS(X),A GET SECTOR NUMBER SUB =3,A IS IT = 3? JNE A,TSTE1B NO, ERROR. JMP TSTE2 YES, EXIT TO NEXT TEST TSTE1B EQU $ COPY =9,A SET FILE LINK ERROR COPY A,ERNO SAVE IT JST ADRFLP FLIP ADDR, JST ERROR & FLOP ADDR JMP TSTE2 EXIT TO NEXT TEST * LPOOL TSTE2 EQU $ * SET UP IOB COPY =DIOB,X INDEX IOB COPY =RDDAT,A GET READ DATA COMMAND OR =:0080,A TOGETHER WITH FILE LINK COPY A,OP(X) SAVE IT COPY =0,A CLEAR A-REG COPY A,SSS(X) CLEAR SECTOR NUMBER COPY =RBUF,A GET READ BUFFER ADDR COPY A,MA(X) SAVE IT COPY =TSTE2INT,A GET INT ADDR COPY A,IN(X) COPY =DCIOB,A GET DCIOB ADDR COPY A,NB(X) SAVE IT * SET UP DATA CHAIN IOB COPY =DCIOB,X INDEX DCIOB COPY =RBUF1,A GET 2ND READ BUFFER ADDR COPY A,DCMA(X) SAVE IT COPY =DCIOB1,X INDEX 2ND DCIOB COPY =RBUF2,A GET 3RD READ BUFFER ADDR COPY A,DCMA(X) SAVE IT * READ 3 SECTORS BY MEANS OF DATA CHAINNING COPY =:E002,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR JST ADRSAV GO SAVE CY,HD & SECT BEFORE F-LINK COPY =DIOB,A GET IOB ADDR SBIT 8,S ENABLE INT JST OTA SEND IT JMP $ WAIT FOR INT * TSTE2INT EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =DIOB,X INDEX IOB COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT OK? JEQ A,TSTE2A YES, GO CHECK FILE LINK COPY =17,A NO, FLA G ERROR COPY A,ERNO SAVE IT JST ADRFLP FLIP ADDR, JST ERROR & FLOP ADDR TSTE2A EQU $ COPY =DIOB,X INDEX IOB COPY CS(X),A GET CYL # SUB =:120,A IS IT CYL #:120? JNE A,TSTE2B NO, ERROR COPY HS(X),A GET HEAD NUMBER JNE A,TSTE2B NOT ZERO=ERROR COPY SSS(X),A GET SECTOR NUMBER SUB =3,A IS IT = 3? JNE A,TSTE2B NO, ERROR JMP TSTECON YES, EXIT * TSTE2B EQU $ COPY =9,A SET FILE LINK ERROR COPY A,ERNO SAVE IT JST ADRFLP FLIP ADDR, JST ERROR & FLOP ADDR COPY =:2FF,A GET LENGHT OF READ BUFFER LESS ONE COPY A,BUFLNG SAVE IT JST CKREAD CHECK READ BUFFER JMP TSTECON NO DATA MIS-MATCH, EXIT COPY A,TE1 SAVE ACTUAL WORD COPY Q,TE2 SAVE EXPECTED WORD JST MSGA PRINT 'EXPECTED WORD' WORD EXWD COPY TE2,A GET EXPECTED WORD JST OHEX PRINT IT JST MSGA PRINT 'ACTUAL WORD' WORD ACTWD COPY TE1,A GET ACTUAL WORD JST OHEX PRINT IT TSTECON EQU $ COPY =:300,A GET 3 SECTORS WD CNT COPY A,DIOB+WC SAVE WRITE IF JST SAVEW SAVE DATA BIT ON JMP TSTE+1 EXIT * TSTE3 JST EROTAL GO ERR TALLY SBIT 4,S ENABLE CONSOLE INT JMP *TESTE EXIT * TE1 WORD 0 ACTUAL WORD CELL TE2 WORD 0 EXPECTED WORD CELL * LPOOL TITL TESTF-TESTF SUBROUTINE *********************************** * * * TESTF - TEST F SUBROUTINE. * THIS SUBROUTINE IS AN EXPENDED * VERSION OF TEST E. THIS TEST * CHECK THE ENTIRE DISK BY: * (1) WRITE 2 SECTORS OF DATA, * (2) READ VERIFY THE ABOUT WRITE, AND * (3) READ DATA IF (2) FAILED. * * * CALLING SEQUENCE: JST TESTF * * * CALLS:  CALLED BY: * CIOB * CKREAD * ERROR EXEC * MOVE *  MSGA * OHEX * OTA * SAVER * SAVEW * * *********************************** * TESTF EQU $ ENT COPY =TSTF,A GET 'TEST F' MES ADDR COPY A,ERTST AND STORE COPY CAR,A GET RUN OPTION TBIT 6,A IS NON-DEST ON? JF OV,$+2 RBIT 4,S YES, DISABLE CONSOLE INT JST MSGA PRINT TEST HEADING WORD TSTF COPY =0,A COPY A,ERORF CLEAR ERR CELL COPY =5,A  COPY A,EROTT OFFSET=5 COPY =UCUR,Y INDEX UNIT SELECTION TABLE COPY =0,A ZEAR UNIT # COPY A,UNIT DO IT TSTF1 EQU $ * SET UP IOB JST CIOB CLEAR IOB COPY =DIOB,X INDEX IOB COPY 0(Y),A GET CURRENT UNIT # SUB =:FFFF,A IS IT END OF TABLE? JEQ A,TFEXLNK YES, EXIT COPY 0(Y),A NO, RESTORE UNIT# COPY A,UNIT SAVE IT COPY A,US(X) SAVE IT COPY =WRTDAT,A GET WRITE COMMAND COPY A,OP(X) SAVE IT COPY =512,A GET TRANSFER WORD COUNT COPY A,WC(X) SAVE IT COPY =WBUF,A GET WRITE BUFFER ADDRESS COPY A,MA(X) SAVE IT COPY =TSTF1INT,A GET INT ADDRESS COPY A,IN(X) SAVE IT * WRITE 512 WORDS OF DATA TSTF1C EQU $ COPY =-12,A IOB WORD LENGTH JST MOVE SAVE ORIGINAL IOB WORD DIOB BEFORE OPERATION WORD SIOB JST SAVER SEE IF NON-DESTRUCTIVE NEEDED COPY =:F001,A GET CDR CONTENT COPY UNIT,Q GET UNIT NUMBER SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR SBIT 8,S ENABLE INTS COPY =DIOB,A GET IOB ADDRESS JST OTA SEND IT JMP $ WAIT FOR INT * TFEXLNK JMP TSTF4 EXIT LINK * TSTF1INT EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =DIOB,X INDEX IOB COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT :400? JNE A,TSTF1E NO, ERROR ENCOUNTERED JMP TSTF2 YES, GO NEXT TEST TSTF1E COPY =19,A GET ERROR NUMBER COPY A,ERNO SAVE IT JST ERROR CALL ERROR  JMP TSTF2 NEXT TEST * LPOOL TSTF2 EQU $ * SET UP IOB COPY =DIOB,X INDEX IOB COPY =RDVER,A GET READ VERIFY COMMAND OR =:0080,A OR IN FILE LINK COPY A,OP(X) SAVE IT COPY =512,A GET TRANSFER WORD COUNT COPY A,WC(X) SAVE IT COPY =0,A RESET WORD PROCESSED COPY A,WP(X) SAVE IT COPY =TSTF2INT,A GET INT ADDRESS COPY A,IN(X) SAVE IT * READ VERIFY THE ABOVE DATA COPY =:F002,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP SELP A,4 DISPLAY CDR SBIT 8,S ENABLE INTS JST ADRSAV SAVE CY,HD & SECT BEFORE F-LINK COPY =DIOB,A GET IOB ADDRESS JST OTA SEND IT JMP $ WAIT FOR INT * TSTF2INT EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =DIOB,X INDEX IOB COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT :400? JNE A,TSTF2E NO, ERROR ENCOUNTERED JMP TSTF2END YES, GET READY FOR NEXT WRITE TSTF2E COPY =20,A GET ERROR NUMBER COPY A,ERNO SAVE IT JST ADRFLP FLIP ADDR, JST ERROR & FLOP ADDR JMP TSTF3 GO READ DATA TSTF2END EQU $ COPY =DIOB,X INDEX IOB COPY CS(X),A GET UPDATED CYLINDER # SUB MAXCYL,A LAST CYLINDER? JGT A,TFNXUT EXCEED, OUT! JEQ A,$+2 YES, CHECK HEAD JMP RSTIOB NO, RESTORE IOB FOR NEXT OPERATION COPY HS(X),A GET HAED # SUB MAXHEAD,A IS IT LAST HEAD? JGT A,TFNXUT EXCEED, OUT! JEQ A,$+2 YES, CHECK SECTOR JMP RSTIOB NO, RESTORE IOB FOR NEXT OPERATION COPY SSS(X),A GET SECTOR # ADD =1,A ADD 1 TO IT SUB MAXSCTOR,A IS IT LAST SECTOR? JGE A,TFNXUT YES, BAIL OUT! JMP RSTIOB NO, RESTORE IOB FOR NEXT OPERATION RSTIOB COPY =WRTDAT,A GET WRITE DATA COMMAND COPY A,OP(X) SAVE IT COPY =TSTF1INT,A RESTORE INT ADDRESS COPY A,IN(X) DO IT COPY =WBUF,A RESTORE WRITE BUFFER ADDRESS COPY A,MA(X) SAVE IT  COPY =512,A GET WORD COUNT COPY A,WC(X) RESTORE WORD COUNT COPY =0,A RESET WORD PROCESSED COPY A,WP(X) DO IT JST SAVEW RESTORE ORIGINAL DATA IF NEEDED JMP TSTF1C LOOP FOR MORE TFNXUT JST SAVEW RESTORE ORIGINAL DATA IF NEEDED ADD =1,Y BUMP UNIT TABLE JMP TSTF1 LOOP FOR NEXT UNIT * LPOOL TSTF3 EQU $ * SET UP IOB COPY =-12,A GET IOB WORD LENGTH JST MOVE COPY ORIGINAL IOB WORD SIOB FROM HERE WORD FIOB TO HERE COPY =FIOB,X INDEX IOB COPY =RDDAT,A GET READ DATA COMMAND OR =:0080,A OR IN FILE LINK COPY A,OP(X) SAVE IT COPY =RBUF,A GET READ BUFFER ADDRESS COPY A,MA(X) SAVE IT COPY =TSTF3INT,A GET INT ADDRESS COPY A,IN(X) SAVE IT COPY =512,A GET TRANSFER WORD COUNT COPY A,WC(X) SAVE IT COPY =0,A RESET WORD PROCESSED COPY A,WP(X) SAVE IT *  READ IN 2 SECTORS OF DATA COPY =:F003,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP SELP A,4 DISPLAY CDR SBIT 8,S ENABLE INTS COPY =FIOB,A GET IOB ADDRESS JST OTA SEND IT JMP $ WAIT FOR INT * TSTF3INT EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =FIOB,X INDEX IOB COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT :400? JNE A,TSTF3E NO, READ FAILED COPY =511,A GET LENGTH OF READ/WRITE BUFFER COPY A,BUFLNG SAVE IT JST CKREAD COMPARE READ WRITE BUFFERS JMP TSTF3EX GOOD DATA, GO RESTORE IOB COPY =22,A DATA MISCOMPARE, SET ERROR # COPY A,ERNO SAVE IT JST ERROR CALL ERROR JST MSGA PRINT EXPECTED WORD WORD EXWD COPY TDQ,A GET EXPECTED WORD JST OHEX PRINT IT JST MSGA PRINT ACTUAL WORD WORD ACTWD COPY TDA,A GET ACTUAL WORD JST OHEX PRINT IT JMP TSTF3EX TSTF3E COPY =21,A GET ERROR # COPY A,ERNO SAVE IT JST ADRFLP FLIP ADDR, JST ERROR & FLOP  ADDR TSTF3EX EQU $ * RESTROE IOB BEFORE NEXT OPERATION COPY =-12,A GET IOB WORD LENGTH JST MOVE GO MOVE IOBS WORD FIOB FROM HERE WORD DIOB TO HERE COPY =DIOB,X INDEX IOB COPY CS(X),A GET UPDATED CYLINDER # SUB MAXCYL,A LAST CYLINDER? JGT A,TF3NXUT EXCEED, OUT! JEQ A,$+2 YES, CHECK HEAD JMP RSTIOB1 NO, RESTORE IOB FOR NEXT OPERATION COPY HS(X),A GET HAED # SUB MAXHEAD,A IS IT LAST HEAD? JGT A,TF3NXUT EXCEED, OUT! JEQ A,$+2 YES, CHECK SECTOR JMP RSTIOB1 NO, RESTORE IOB FOR NEXT OPERATION COPY SSS(X),A GET SECTOR # ADD =1,A ADD 1 TO IT SUB MAXSCTOR,A IS IT LAST SECTOR? JGE A,TF3NXUT YES, BAIL OUT! JMP RSTIOB1 NO, RESTORE IOB FOR NEXT OPERATION RSTIOB1 COPY =WRTDAT,A GET WRITE DATA COMMAND COPY A,OP(X) SAVE IT COPY =WBUF,A GET WRITE BUFFER ADDRESS COPY A,MA(X) SAVE IT COPY =TSTF1INT,A GET INT ADDRESS COPY A,IN(X) SAVE IT COPY =512,A GET WORD COUNT COPY A,WC(X) SAVE IT COPY =0,A RESET WORD PROCESSED COPY A,WP(X) SAVE IT JST SAVEW RESTORE ORIGINAL DATA IF NEEDED JMP TSTF1C LOOP FOR MORE TF3NXUT JST SAVEW RESTORE ORIGINAL DATA IF NEEDED ADD =1,Y BUMP UNIT TABLE JMP TSTF1 LOOP FOR NEXT UNIT * TSTF4 EQU $ JST EROTAL GO ERR TALLY SUB SBIT 4,S ENABLE CONSOLE INT JMP *TESTF EXIT * FIOB RES 12,0 IOB FOR TEST F * LPOOL TITL FORMAT-FORMAT PROGRAM *********************************** * * FORMAT - FORMAT ROUTINE * * THIS ROUTINE WILL *  (1) FORMAT THE DISK, * (2) CHECK FORMAT, * (3) FORMAT BAD TRACK. * * * CALLING SEQUENCE: JST FORMAT * * * CALLS: CALLED BY: * CIOB EXEC * ERROR * FMTBT * LCONVP * MSGA * ODEC * OTA * PCONVL * * *********************************** * FORMAT ENT COPY CAR,A GET RUN OPTION TBIT 6,A SAVE DATA (NON-DESTRU) ON? JF OV,$+4 NO, GO AHEAD JST MSGA ELSE, TELL THEM & BACK PSU WORD FORMDES 'CANNOT SAVE DATA IN FORMATTING' JMP PSU BACK TO BEGINNING AND =:3A0,A MASK OUT UNWANTED OPTIONS COPY A,CAR PUT IT BACK JST MSGA PRINT 'UNIT' WORD UNITMSG COPY =0,A COPY A,ERFORM CLEAR ERROR CELL COPY =6,A OFFSET=6 COPY A,EROTT COPY =UCUR,Y INDEX UNIT # TABLE COPY =0,A CLEAR UNIT # COPY A,UNIT DO IT FORMNU EQU $ FORMAT NEW UNIT COPY 0(Y),A GET CURENT UNIT # SUB =:FFFF,A IS IT END OF TABLE? JEQ A,FMTLNK YES EXIT SUB =1,A RESTORE UNIT # JST ODEC PRINT IT JST MSGA PRINT FORMAT HEADING WORD FMTM COPY Y,TEMP2 SAVE Y JST TESTA GO INITIALIZE DISK COPY =TSTFF,A GET ' ' MES ADDR (DUMMY) COPY A,ERTST AND STORE COPY TEMP2,Y RESTORE Y * SET UP IOB JST CIOB CLEAR IOB COPY =DIOB,X INDEX IOB COPY 0(Y),A GET UNIT # COPY A,UNIT SAVE IT COPY A,US(X) SAVE IT ADD =1,Y BUMP TABLE POINTER COPY =FRMT,A GET FORMAT COMMAND COPY A,OP(X) SAVE IT COPY =FMAB,A GET FORMAT SUB-OPCODE COPY A,WC(X) SAVE COPY =FORMAT1,A GET INT ADDR COPY A,IN(X) SAVE IT COPY INLEV,A GET INTERLEAVE FACTOR COPY A,SSS(X) SAVE IT COPY =-5,A SET UP RETRY COUNTS COPY A,COUNT SAVE IT * FORMAT ALL BLOCKS FORMATL EQU $ COPY =:FF01,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR SBIT 8,S ENABLE INTS COPY =DIOB,A GET IOB ADDR JST OTA SEND IT JMP $ WAIT FOR INT * FMTLNK JMP FMTEND LINK TO EXIT * FORMAT1 EQU $   JST $+1 INT ENTRY MUST BE A JST/JSK NOP COPY =DIOB,X INDEX IOB COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT :400?  JEQ A,CKFORMAT YES, GO NEXT TEST COPY COUNT,A NO, GET RETRY COUNT JEQ A,$+4 RETRY EXPIRE, GO ERROR IMS COUNT BUPM COUNT NOP JMP FORMATL RETRY COPY =10,A SET ERROR NUMBER COPY A,ERNO SAVE IT JST ERROR CALL ERROR JMP PSU DISK CANNOT FORMAT * CKFORMAT EQU $ VFYOP EQU $ COPY CAR,A GET OPTION WORD TBIT 9,A IS VERIFY FORM OPT QUERY BIT ON? JF OV,VFYGO NO, GO VERIFY; ELSE, ASK '..VERIFY..?' JST MSGA WORD VFYMSG JST IKB GET RESPONSE IN A-REG CLSN A,=CR: IS IT CR? JMP FMTEND YES, GO TO FORMAT END CLSN A,='Y' JMP VFYOP1 IT IS A 'Y' CLSN A,='N' JST IKB IT IS A 'N', GET TERMINATOR CLSN A,=CR: IS IT CR? JMP FMTEND YES, GO FORMAT END JMP VFYOP NO?! DO NOT GIVE ME BS! VFYOP1 JST IKB GET TERMINATOR CLSN A,=CR: IS IT CR? JMP $+2 YES, GO VERIFY JMP VFYOP NO?! BOASO! VFYGO JST MSGA PRINT CHECK MESSAGE WORD FMTM1 * SET UP IOB COPY =DIOB,X INDEX IOB COPY =FMCK,A GET FORMAT SUB-OPCODE COPY A,WC(X) SAVE IT COPY =CKFM1,A GET INT ADDR COPY A,IN(X) SAVE IT COPY INLEV,A GET INTERLEAVE AGAIN COPY A,SSS(X) SAVE IT IN CASE COPY =-10,A GET RETRY COUNTS COPY A,COUNT SAVE IT * FORMAT CHECK CKFML EQU $ COPY =:FF02,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR SBIT 8,S ENABLE INT COPY =DIOB,A GET IOB ADDR JST OTA SEND IT JMP $ WAIT FOR INT * COUNT WORD 0 COUNTER CELL LPOOL * CKFM1 EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =DIOB,X INDEX IOB COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT :400 JNE A,CKFMRT NO, GO CHECK FORMAT RETRY CKNTS EQU $ COPY CS(X),A NO, GET MSB OF LOGICAL ADDR COPY HS(X),Q GET LSW OF LOGICAL ADDR RBIT 0,S CLEAR CARRY BIT ADDC =:12,Q BUMP TRACK NUMBER ADDC =0,A COPY A,CS(X) SAVE IT COPY Q,HS(X) COPY X,TEMP1 SAVE X-REG COPY Y,TEMP2 AND Y-REG COPY MAXCYL,Q GET CYL # COPY MAXSCTOR,X GET SECTOR # COPY MAXHEAD,Y GET HEAD # JST PCONVL CALCULATE LOGICAL ADDR COPY TEMP1,X RESTOR IOB ADDR COPY TEMP2,Y AND UNIT TABLE POINTER COPY LOGADDR+1,Q SHIFT Q,LO,1 COPY LOGADDR,A ROTATE A,LO,1 SHIFT Q,RO,1 COPY Q,LOGADDR+1 COPY A,LOGADDR MSB IS MOVED INTO REG-A COPY CS(X),A GET CURRENT LOGICAL ADDR COPY HS(X),Q SHIFT Q,LO,1  ROTATE A,LO,1 SHIFT Q,RO,1 CSK Q,LOGADDR+1 LOWER MEM COMPED? JMP CKNTS1 QMEM CSK A,LOGADDR Q=MEM JMP CKNTS1 A<MEM (HIGHER MEM) JMP FORLNK TAKE A HIKE JMP FORLNK SAME CKNTS1 JMP CKFML CHECK NEXT TRACK * FORLNK JMP FORMNU LINK TO NEXT UNIT * CKFMRT EQU $ COPY COUNT,A GET COUNT JEQ A,CKFRMT1 COUNT EXPIRED IMS COUNT BUMP COUNT NOP JMP CKFML CHECK AGAIN * CKFRMT1 EQU $ JST ERRCK SEE IF MATCHED MANU. BAD TRACK JMP CKNTS YES, SKIP. ELSE,... JST FMTBT FORMAT AS BAD TRACK JMP CKNTS CAN'T FORMAT AS BAD JST MSGA OUTPUT BAD TRACK WORD BDTK JST LCONVP CONVERT DISK LOGICAL ADDR TO PHYSICAL ADDR COPY CYL,A SET TO CONVERT TO DECIMAL NO. JST ODEC CONVERT & PRINT IT JST MSGA PRINT 'HEAD' WORD HD COPY HEAD,A GET READY TO PRINT JST ODEC PRINT IT JMP CKNTS OK, CHECK NEXT SECTOR FMTEND JST EROTAL GO ERR TALLY SUB JMP *FORMAT * LPOOL TITL FMTBT-FORMATTER SUBROUTINE(FORMAT ONE BAD TRACK) *********************************** * * FMTBT - SUBROUTINE TO FORMAT BAD TRACK * * * CALLING SEQUE NCE - WITH APPROPERIATE IOB * JST FMTBT * * * CALLS: CALLED BY: * ERROR  EXEC * OTA * * ********************************** * FMTBT EQU $ ENT COPY =DIOB,X INDEX IOB COPY =FMBT,A GET FORMAT BAD TRACK SUB-OPCODE COPY A,WC(X) SAVE IT COPY =FMTBTINT,A GET INT ADDR COPY A,IN(X) SAVE IT COPY INLEV,A GET INTERLEAVE COPY A,SSS(X) SAVE IT COPY =:FF03,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR SBIT 8,S ENABLE INT COPY =DIOB,A GET IOB ADDR JST OTA SEND IT JMP $ WAIT FOR INT * FMTBTINT EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =DIOB,X INDEX IOB COPY =FMCK,A RESTORE CHECK FORMAT SUB-OPCODE COPY A,WC(X) SAVE IT COPY =CKFM1,A RESTORE CHECK FORMAT INT ADDR COPY A,IN(X) SAVE IT COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT OK? JEQ A,$+5 YES, GET OUT OF HERE COPY =11,A NO, GET YOU COPY A,ERNO SAVE IT JST ERROR CALL ERROR JMP *FMTBT EXIT IMS FMTBT BUMP RETURN ADDR NOP COPY =DIOB,X RESTORE FORMAT VERIFY CIOB. INDEX IOB COPY =FMCK,A GET CHECK FORMAT SUB-OPCODE COPY A,WC(X) SAVE IT COPY =CKFM1,A RESTORE INT ADDR COPY A,IN(X) SAVE IT JMP *FMTBT EXIT * LPOOL TITL MFRBTFT - FORMAT MFR'S BAD TRACKS *********************************** * * * MFRBTFT - SUBROUTINE TO FORMAT MANUFACTURER'S * BAD TRACKS. * * * CALLING SEQUENCE: SET UP CYLINDER/HEAD PAIR TABLE (DECIMAL ENTRIES) * JST MFRBTFT * * * CALLS: CALLED BY: * CIOB EXEC * DECHEX * ERROR *  LCONVP * MSGA * ODEC * OTA * PCONVL * * *********************************** * MFRBTFT EQU $ ENT COPY =1,A SET FLAG FOR ERR COPY A,ERADFL COPY MFRFLG,A GET MFR FLAG JNE A,$+2 SET, DO THIS SUBROUTINE JMP MBTEND NOT SET, EXIT SUBROUTINE COPY =BADBUF,A GET BAD BUFFER ADDR COPY A,BUFPTR SAVE IT MBT1 EQU $ * SET UP IOB JST CIOB CLEAR IOB COPY =UCUR,Y GET UNIT # COPY 0(Y),A GET UNIT # COPY A,UNIT SAVE IT COPY =DIOB,X INDEX IOB COPY =FRMT,A GET FORMAT COMMAND COPY A,OP(X) SAVE IT COPY UNIT,A GET UNIT # COPY A,US(X) SAVE IT COPY *BUFPTR,A GET CYL/HD PAIR CSK A,=-1 END OF TABLE? JMP $+3 NO JMP $+2 NO JMP MBTEND YES, EXIT COPY A,Y AND =:F,Y ISOLATE HD # COPY *BUFPTR,Q GET CYL/HD PAIR AND =:FFF0,Q ISOLATE CYL # ROTATE Q,RO,4 PUT IT IN LOWER 3 NIBBLES COPY =0,X ZERO OUT X-REG JST PCONVL CONVERT PHYSICAL ADDR TO LOGICAL ADDR  COPY =DIOB,X RESTORE IOB ADDR COPY A,CS(X) SAVE MSB OF LOGICAL ADDR COPY Q,HS(X) SAVE LSW OF LOGICAL ADDR COPY =FMBT,A GET FORMAT BAD TRACK SUB-OPCODE COPY A,WC(X) SAVE IT COPY =MBTINT,A GET INT ADDR COPY A,IN(X) SAVE IT COPY INLEV,A GET INTERLEAVE COPY A,SSS(X) SAVE IT * DO A BAD TRACK FORMAT COPY =:FF04,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR SBIT 8,S ENABLE INT COPY =DIOB,A GET IOB ADDR JST OTA SEND IT JMP $ WAIT FOR INT MBTINT EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =DIOB,X INDEX IOB COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT OK? JEQ A,MBTLP YES, GET OUT OF HERE COPY =11,A NO, GET YOU COPY A,ERNO SAVE IT JST ERROR CALL ERROR JST LCONVP CONVERT LOG ICAL ADDR TO PHYSICAL ADDR JST MSGA OUTPUT BAD TRACK WORD BDTK COPY CYL,A GET CYL # JST ODEC PRINT IT JST MSGA PRINT 'HEAD' WORD HD COPY HEAD,A GET HD # JST ODEC PRINT IT * MBTLP IMS BUFPTR BUMP POINTER NOP JMP MBT1 LOOP FOR NEXT TRACK MBTEND EQU $ COPY =0,A RESET ADDR FLAG FOR ERR COPY A,ERADFL JMP *MFRBTFT EXIT * LPOOL TITL TECH TEST ***************************************************** * * TECH - TECH TEST * * THE TECH TEST WILL REQUEST INPUTS FOR PARAMETERS * FOR WHICH AN IOB WILL BE BUILT. THEN THE TECH * TEST WILL REPEATEDLY PERFORM THE REQUESTED * FUNCTION, WITH NO STATUS CHECKING OF TIMEOUT * LOOPS. AS SOON AS AN OPERATION COMPLETES, IT * IS THEN REPEATED. * * ESCAPE IS VIA THE CONSOLE INTERRUPT WHICH * RETURNS TO THE QUERIES. * * CALLS: CALLED BY: * DUMP *  FILINC * GNF TEST CONTROL * IHEX * IKB * MOVE * MSGA *  OTA * PCONVL * SEL * SENRDY * ****************************************************** * TECH EQU $ COPY CAR,A GET RUN OPTION AND =:20,A MASK OUT OPTIONS EXCEPT LP COPY A,CAR PUT IT BACK TECH1 EQU $ RBIT 8,S JST SEL KILL ANY DISK INTS SBIT 8,S NEED INTERRUPTS SBIT 4,S ALSO FOR CONSOLE TOO COPY =0,A COPY A,TTFC CLEAR PARAMETER TABLE COPY =-15,A JST MOVE WORD TTFC WORD TTFC+1 COPY =:200,A MAX WORD LENGTH COPY A,TTLT JST MSGA REQUEST PARAMETERS WORD TTMSG JST GNF GET NEXT FIELD COPY A,TTFC SAVE FC CSK A,=6 CSK A,=0 JMP TECH1 NOP COPY X,TTMP COPY A,X COPY TTFC,A AND =:FFF0,A ADD =OPCODE,X ADD 0(X),A COPY A,TTFC COPY TTMP,X CLSN =CR:,X DONE? JMP TECH2 YES, SKIP NEXT QURIES JST GNF GET UNIT NO COPY A,TTU SAVE IT JLT A,TECH1 MUST 0-MAX, SUB =3,A JGT A,TECH1 CLSN =CR:,X DONE? JMP TECH2 YES COPY MAXCYL,A COPY A,TEMP1 HIGHEST CYL # JST GNF NO, GET CYL # COPY A,TTC SAVE IT COPY =:FFF,A MUST BE W/ IN RANGE AND TTC,A CSK A,TEMP1 JMP $+2 OKAY TOTT1 JMP TECH1 BAD, START OVER CLSN =CR:,X DONE? JMP TECH2 YES COPY MAXHEAD,A COPY A,TEMP1 HIGHEST HEAD # JST GNF NO, GET HEAD # COPY A,TTH SAVE IT JLT A,TECH1 MUST BE W/ IN RANGE AND =:FF1F,A SUB TEMP1,A JGT A,TECH1 ERROR, START OVER CLSN =CR:,X DONE? JMP TECH2 YES COPY MAXSCTOR,A COPY A,TEMP1 HIGHEST SECTOR # JST GNF NO, GET SECTOR # COPY A,TTS AND SAVE IT JLT A,TOTT1 MUST BE W/ IN RANGE SUB TEMP1,A JGT A,TOTT1 NO, START OVER CLSN =CR:,X JMP TECH2 IF DONE JST IKB GET INTERRUPT REQUEST CLSN ='Y',A Y OF N JMP TECH1A CLSN ='N',A JMP TECH1A TECH1B CLSN =',',A COMMA IS OK JMP TECH1C CLSN =CR:,A CARRIAGE RET IS OK TOO JMP TECH2 JMP TECH1 ELSE, ILLEGAL * LPOOL TECH1A SUB ='Y',A SET FLAG COPY A,TTIN JST IKB GET TERMINATOR JMP TECH1B TECH1C JST GNF GET LENGTH JNE A,$+2 ZERO=1 COPY =1,A COPY A,TTLN CSK A,TTLT MUST BE TWO SECTORS OF LESS JMP $+2 JMP TECH1 BAD COPY =:F,A AND IF FORMAT, AND TTFC,A CLSN =1,A JMP $+2 JMP TECH1D COPY TTLN,A THEN IT MUST BE .LE. MAX SECT CSK A,MAXSCTOR JMP TECH1D OK TECH1X JMP TECH1 TRY AGAIN TECH1D CLSN =CR:,X DONE? JMP TECH2 YES JST IHEX NO, GET WORD PATTERN EXCH A,X COPY A,TTDP COPY A,TTDP1 COPY =0,A COPY A,PATFLG CLSN =CR:,X DONE? JMP TECH2 YES CLSN =',',X JMP TECH2A CLSN ='+' ,X JMP BUFPAT CLSN ='-',X JMP BUFPAT CLSN ='.',X JMP BUFSET JMP TECH1 ELSE, IT IS BAD BUFPAT COPY X,PATFLG JST GNF COPY A,INCCNT JMP TECH2A BUFSET COPY X,PATFLG JST GNF COPY A,TTDP1 TECH2A CLSN =CR:,X DONE? JMP TECH2 YES JST GNF INPUT OPTION  COPY A,TOPT AND STORE IT CLSN =CR:,X DONE? JMP TECH2 YES JST GNF GET CHAINED LENGTH IF ANY COPY A,TTCL AND SAVE IT ADD TTLN,A THIS LENGTH JLT A,TECH1X PLUS OTHER LENGTH CSK A,TTLT MUST BE 1-512 OR 1-256 JMP $+2 JMP TECH1 BAD CLSN =CR:,X DONE? JMP TECH2 YES JST GNF GET CHAINED WORD PATTERN COPY A,TTCP CLSN =',',X COMMA IS ILLEGAL HERE JMP TECH1 JMP TECH2 * LPOOL TECH2 COPY TTLN,A LENGTH MUST BE AT LEASE 1 JNE A,$+2 IMS TTLN COPY =-6,A FILL IOB W/ ADDRESS JST MOVE WORD TTFC WORD TTIOB1 COPY TTBUF,A STORE BUF ADDR COPY A,TTIOB1+MA COPY =TTINTL,A STORE INT ADDR COPY TTIN,X UNLESS NOT WANTED JEQ X,$+2 COPY =0,A COPY A,TTIOB1+IN COPY =TTIOB2,A INDEX CHAINED IOB COPY TTCL,X ANY CHAINING? JNE X,$+2 YES COPY =0,A NO, NO CHAIN ADDR COPY A,TTIOB1+NB STORE CHAIN ADDR COPY X,TTIOB2 STORE LENGTH IN CHAINED IOB COPY =TMPBUF,A AND CHAINED BUF ADDR COPY A,TTIOB2+1 COPY =:F,A CERTAIN FUNCTIONS AND TTFC,A CAN'T BE CHAINED COPY TTIOB1+NB,X CLSN =FRMT,A FORMAT = NO CHAIN COPY =0,X CLSN =SEEK,A SEEK = NO CHAIN COPY =0,X CLSN =TIO,A TIO = NO CHAIN COPY =0,X CLSN =INIT,X INIT = NO CHAIN COPY =0,X COPY X,TTIOB1+NB CLSN =FRMT,A FORMAT ? JMP TECH3 YES, BUILD FORMAT BUFFER CLSN =WRTDAT,A WRITE DATA ? JMP TECH4 YES, PUT WORD IN BUFFER CLSN =INIT,A INITIALIZE ? JMP TECHI YES, BUILD INITILIZE BUFFER COPY TTBUF,A COPY A,CLEAR1 ADD =1,A COPY A,CLEAR1+1 COPY =0,A COPY A,*TTBUF COPY =-511,A JST MOVE CLEAR1 WORD WBUF WORD WBUF+1 JMP TECH5A * LPOOL * * BUILD FORMAT BUFFER  * * TECH3 EQU $ COPY =0,A COPY A,TTIOB1+SSS COPY TTC,Q CONVERT TO LOGICAL ADDR COPY TTS,X COPY TTH,Y JST PCONVL COPY A,TTIOB1+CS SAVE MSB OF LOGIC ADDR COPY Q,TTIOB1+HS SAVE LSW OF LOGIC ADDR COPY =FMCF,A GET FORMAT 1 TRACK SUB OPCODE COPY A,TTIOB1+5 SAVE IT JMP TECH5A * * BUILD INITIALIZE BUFFER * * TECHI EQU $ COPY TTU,A GET UNIT COPY HPD,Q GET HD/CYL SHIFT Q,LO,8 LINE IT UP OR Q,A OR IN W/ UNIT # COPY A,TTIOB1+1 AND SAVE IT COPY =:200,A GET BYTE/SECTOR COPY A,TTIOB1+2 AND SAVE COPY TTIOB1+IN,A GET INT LOCATION COPY A,TTIOB1+3 SAVE IN RIGHT PLACE COPY =-5,A JST MOVE SAVE INIT PARAMETER WORD INITBK WORD TTIOB1+4 JMP TECH5A * * PUT WORD IN BUFFER FOR WRITE OPER * * TECH4 EQU $ COPY PATFLG,A CLSN ='+',A JMP TTBFI CLSN ='-',A JMP TTBFD CLSN ='.',A JMP TTBFC JNE A,TOTTT TTBFC COPY TTDP,A COPY TTBUF,X COPY A,0(X) COPY TTDP1,A COPY A,1(X) COPY =-510,A JST MOVE TTBUF WORD WBUF WORD WBUF+2 JMP TECH5A TTBFI COPY TTDP,A COPY INCCNT,X JST FILINC JMP TECH5A TTBFD COPY TTDP,A COPY INCCNT,X NEG X,X JST FILINC COPY TTCP,A PUT CHAINED WORD COPY A,TMPBUF COPY =-511,A JST MOVE WORD TMPBUF WORD TMPBUF+1 JMP TECH5A * TOTTT JMP TOTT * * OUTPUTTING ROUTINE * * TECH5A COPY =-12,A SAVE TTIOB JST MOVE FOR RETRIVEAL WORD TTIOB1 WORD TTIOBSAV TECH5 JST SEL RESET DISK SBIT 8,S SBIT 4,S ENABLE CONSOLE INT COPY =-12,A RESTORE IOB INFROMATION JST MOVE WORD TTIOBSAV WORD TTIOB1 JST TIMER RESET TIME COPY =TTIOB1,A GET IOB ADDR COPY TTIOB1+IN,Q IN TERRUPTS? JST OTA DO I/O JEQ Q,TECH6 NO JST TIME TIME THE I/O JMP $-1 JT SS,TOTT IF SENSE SWITCH IN ON JMP TECH5 NO INTERRUPT TTINTL EQU $ INTERRUPT POINT JST $+1 NOP TECH51 COPY TTIOB1+CST,A SELP A,4 OUTPUT CONTORLLER STATUS TO CDR COPY TOPT,A GET OPTION SHIFT A,RO,1 JT OV,TTDMP1 JT SS,TOTT JMP TECH5 DO IT AGAIN TECH6 JST SENRDY WAIT UNITL DONE JMP $+2 NOT DONE YET  JMP TECH51 DONE JST TIME TIME THE I/O JT SS,TOTT JMP TECH6 FINISHED JMP TECH5 TIME OUT, NOT READY TOTT COPY =0,A ADD =1,A  JNE A,$-1 OUT A,0 RESET SENSE SWITCH JMP TECH1 * LPOOL * * GNF - INPUT PAR TO BUILD IOB * * GNF ENT JST IHEX INPUT VALUE EXCH A,X CLSN =',',X COMMA ? JMP *GNF YES, OK CLSN =CR:,X CARRIAGE RET ? JMP *GNF YES, OK JMP TECH1 ELSE, START OVER * * TTDMP1 COPY TOPT,A SHIFT A,RO,2 JF OV,TTDMP2 COPY TTLN,A NEG A,A COPY TTBUF,X JST DUMP TTDMP2 COPY TOPT,A SHIFT A,RO,3 JF OV,TTDMP3 COPY TTLN,A NEG A,A COPY =TMPBUF,X JST DUMP TTDMP3 JMP TECH1 * TTFC WORD 0 FC TTU WORD 0 UNIT TTC WORD 0 CYLINDER TTH WORD 0 HEAD TTS WORD 0 SECTOR TTLN WORD 0 LENGTH TTIN WORD 0 INTERRUPTS FLAG TTDP WORD 0 WORD PATTERN TTCL WORD 0 CHAINED IOB LENGTH TTCP WORD 0 CHAINED IOB WORD PATTERN TTLT WORD 0 MAX WD CNT/2 SECTORS TOPT WORD 0 OPTION TTDP1 WORD 0 SECOND DATA PATTERN WD TTMP WORD 0 TEMP CELL INCCNT WORD 0 INCREMENT COUNT PATFLG WORD 0 PATTERN FLAG TTIOB1 RES 12,0 MAIN IOB TTIOB2 RES 4,0 CAHINED IOB TTIOBSAV RES 12,0 IOB SAVER OPCODE WORD 0,:A,1,2,4,8,9 I/O, INIT, FORM, WRITE, READ, RDVER, SEEK * TITL ADRSAV SUBROUTINE ********************************************************** * * ADRSAV - SAVE CURRENT CYLINDER, HEAD & SECTOR SUB * * THIS ROUTINE WILL SAVE THE CYLINDER, HEAD AND * SECTOR OF A DIOB INTO SYSTEM BUFFERS. * THIS ROUTINE IS USEFUL FOR WRITE, READ OF READ VERIFY * OPERATIONS WITH FILE LINK OPTION ON, SINCE IT SAVES * THE ADDRESS BEFORE THE FILE LINK UPDATE THE DIOB. * ********************************************************** * ADRSAV ENT COPY CS+DIOB,A COPY A,ERTCY1 COPY HS+DIOB,A COPY A,ERTHD1 COPY SSS+DIOB,A COPY A,ERTSC1 JMP *ADRSAV LPOOL TITL ADRFLP SUBROUTINE ********************************************************** * * ADRFLP - FLIP FLOP ADDRESS SUBROUTINE * * THIS ROUTINE WILL DO: * 1) SAVE CYLINDER, HEAD AND SECTOR OF A DIOB * 2) REPLACE THEM WITH PREVIOUS SAVED ADDRESS * 3) CALL ERROR ROUTINE * 4) RESTORE CYLINDER, HEAD AND SECTOR OF THE DIOB * ********************************************************** * ADRFLP ENT COPY CS+DIOB,A COPY A,ERTCY2 COPY HS+DIOB,A COPY A,ERTHD2 COPY SSS+DIOB,A COPY A,ERTSC2 * COPY ERTCY1,A COPY A,CS+DIOB COPY ERTHD1,A COPY A,HS+DIOB COPY ERTSC1,A COPY A,SSS+DIOB * JST ERROR * COPY ERTCY2,A COPY A,CS+DIOB COPY ERTHD2,A COPY A,HS+DIOB COPY ERTSC2,A COPY A,SSS+DIOB JMP *ADRFLP LPOOL TITL 'CHRIN' SUBROUTINE ****************************** * * CHRIN - CHECK TERMINATOR * * THIS SUBROUTINE WILL CHECK THE * TERMINATOR CHARACTER FOR INPUT THROUGH * THE 'IHEX' OR 'IDEC' SUBROUTINE IS ONE * OF THE FOLLOWING: * * CARRIAGE RETURN  - RETURN TO STANDARD RETURN ADDRESS * POUND SIGN (#) - RETURN TO RETURN ADDRESS + 1 * BACK ARROW   - RETURN TO RETURN ADDRESS + 2 * UP ARROW - RETURN TO RETURN ADDRESS + 3 * COMMA (,) - RETURN TO RETURN ADDRESS + 4 * ANYTHING ELSE - RETURN TO RETURN ADDRESS + 5 * * CALLING SEQUENCE: * JST CHRIN * JMP ? CARRIAGE RETURN R * JMP ? POUND SIGN R+1 *  JMP ? BACK ARROW R+2 * JMP ? UP ARROW R+3 * JMP ? COMMA R+4 * JMP ? ANYTHING ELSE R+5 * * CALLS: CALLED BY: * NONE QUERIES * ****************************** * CHRIN ENT TERMINATOR CHECK ROUTINE COPY IDCTM2,A GET TTY INPUT CHAR CLSN =CR:,A IS IT C/R JMP *CHRIN YES IMS CHRIN CLSN ='#',A IS IT '#' JMP *CHRIN YES IMS CHRIN CLSN =BCKAR:,A IS IT BACK ARROW JMP *CHRIN YES IMS CHRIN CLSN =UPARR:,A IS IT UP ARROW JMP *CHRIN YES IMS CHRIN CLSN  =',',A IS IT COMMA JMP *CHRIN YES IMS CHRIN ITS SOMETHING ELSE JMP *CHRIN * LPOOL TITL CIOB-CLEAR I/O BLACK *********************************** * * CIOB - CLEAR I/O BLOCK * * THIS ROUTINE CLEAR ALL 14 WORDS OF THE I/O BLOCK * CONTENTS OF A AND X REGISTERS ARE NOT DISTORYED * * * CALLING SEQUENCE: JST CIOB * * * CALLS:  CALLED BY: * NONE TESTA * * ********************************** * CIOB ENT CLEAR I/O BLOCK ENTRY POINT COPY A,CIOB1 SAVE A-REG COPY Q,CIOB2 SAVE Q-REG COPY X,CIOB3 SAVE X-REG COPY =13,Q GET COUNTER COPY =DIOB,X INDEX IOB COPY =0,A CLEAR A REG XNX Q COPY A,0(X) CLEAR IOB JNED Q,$-2 LOOP BACK UNTIL ALL DONE COPY CIOB1,A RESTORE A-REG COPY CIOB2,Q RESTORE Q-REG COPY CIOB3,X RESTORE X-REG JMP *CIOB EXIT CIOB1 WORD 0 A-REG CELL CIOB2 WORD 0 Q-REG CELL CIOB3 WORD 0 X-REG CELL * LPOOL TITL CKREAD- CHECK READ DATA SUBROUTINE *********************************** * * CKREAD - CHECK READ DATA INTEGRITY * * * CALLING SEQUENCE: COPY LENGHT OF BUFFER LESS ONE,A * COPY A,BUFLNG *  JST CKREAD * JMP ? GOOD RETURN * JMP ? ERROR RETURN * * *  CALLS: CALLED BY: * NONE TESTD * * *********************************** * CKREAD EQU $ ENT COPY A,CKA SAVE ALL REGISTERS COPY Q,CKQ COPY X,CKX COPY Y,CKY COPY =0,A ZERO OUT A-REG COPY A,TDA AND TDA COPY A,TDQ AND TDQ COPY =RBUF,X INDEX READ BUFFER COPY =WBUF,Y INDEX WRITE BUFFER COPY BUFLNG,A GET BUFFER LENGHT CKREADL EQU $ COPY A,BUFLNG UP DATE BUFFER LENGHT COPY 0(X),A GET A READ BUFFER WORD COPY 0(Y),Q GET A WRITE BUFFER WORD CSK A,Q MATCH?? JMP CKRD1 NO, FLAG ERROR JMP CKRD1 NO, FLAG ERROR ADD =1,X YES, BUMP READ BUFFER POINTER ADD =1,Y AND WRITE BUFFER POINTER COPY BUFLNG,A END OF BUFFER? JNED A,CKREADL NO, LOOP BACK FOR MORE COPY CKA,A RESTORE ALL REGISTERS COPY CKQ,Q COPY CKX,X COPY CKY,Y JMP *CKREAD GOOD EXIT CKRD1 EQU $ COPY A,TDA SAVE ACTUAL WORD COPY Q,TDQ SAVE EXPECTED WORD COPY CKA,A RESTORE ALL REGISTERS COPY CKQ,Q COPY CKX,X COPY CKY,Y IMS CKREAD BUMP RETURN JMP *CKREAD ERROR RETURN * BUFLNG WORD 0 BUFF ER LENGHT LESS ONE CELL * LPOOL TITL 'CRLF' SUBROUTINE ****************************** * * CRLF - OUTPUT CR/LF * * THIS SUBROUTINE WILL OUTPUT * AN ASCII CARRIAGE RETURN FOLLOWED * BY AN ASCII LINE FEED TO THE * CRT/TTY. * * CALLING SEQUENCE: * JST CRLF * * CALLS: CALLED BY: * OTTY DUMP *  TSTITL * ****************************** * CRLF ENT COPY =CR:,A OUTPUT CR JST OTTY COPY =LF:,A OUTPUT LF JST OTTY JMP *CRLF * LPOOL TITL DECHEX - SUBROUTINE CONVERT DECIMAL TO HEX ************************************ * * * DECHEX - THIS SUBROUTINE CONVERT DECIMAL * TO HEXADECIMAL * * * CALLING SEQUENCE: COPY DECIMAL,A * JST DECHEX * * NOTE: UPON RETURN, A-REG CONTENT THE DESIRE *  HEXADECIMAL NUMBER. THE ORIGINAL DECIMAL * NUMBER IS DESTROYED. * * * CALLS:  CALLED BY: * NONE MFRBTFT * * ************************************ * DECHEX EQU $ ENT COPY Y,CKY STORE Y-REG COPY Q,CKQ STORE Q-REG COPY A,VALDEC SAVE ORIGINAL DECIMAL NUMBER COPY =-3,A COPY A,CNT INITIALIZATE COUNT COPY VALDEC,A GET DEC VALUE AND =:F,A MASK DON'T CARE BITS COPY A,VALHEX SAVE IN HEX COPY VALTAB,Y GET TABLE DHLOOP EQU $ COPY VALDEC,A GET DEC NUMBER ROTATE A,RO,4 TOSS IT COPY A,VALDEC AND SAVE AND =:F,A MASK OUT DON'T CARE BITS JEQ A,DHLOOP1 IF ZERO, GET NEXT DIGIT COPY VALHEX,Q GET HEX VALUE ADD 0(Y),Q ADD TO IT COPY Q,VALHEX AND SAVE SUB =1,A DECREMENT VALUE JEQ A,DHLOOP1 IF ZERO GET NEXT DIGIT JMP $-5 ELSE, CONTINUE TO ADD DHLOOP1 EQU $ IMS CNT BUMP COUNT JMP $+2 IF NOT EXPIRE GO ON JMP $+3 ELSE, EXIT ADD =1,Y BUMP TABLE POINTER JMP DHLOOP AND GO BACK COPY VALHEX,A GET HEX IN A-REG JMP *DECHEX AND EXIT * CNT WORD 0 COUNTER VALDEC WORD 0 DECMIAL CELL VALHEX WORD 0 HEX CELL VALTAB WORD $+1,10,100,1000 * LPOOL TITL DUMP SUBROUTINE ***************************************** * * DUMP-THIS SUBROUTINE WILL DUMP * MEMORY TO CRT/TTY WITH 8 *  WORDS PER LINE. * * CALLING SEQUENCE: * COPY =-WORD COUNT,A * COPY =BUFF ADR, X * JST DUMP * * CALLS: MSGA CALLED BY: ERROR * OHEX * CRLF * OTTY * SPACE * ***************************************** * DUMP ENT COPY A,DUMPLN SAVE LENGTH COPY X,DUMPAD AND ADDRESS DUMP1 JST CRLF JST SPACE PRINT 3 SPACES COPY =-8,A 8 WORDS PER LINE COPY A,DUMPCT DUMP2 COPY *DUMPAD,A GET A WORD JST OHEX PRINT IT IMS DUMPAD BUMP POINTER COPY =' ',A PRINT SPACE JST OTTY IMS DUMPLN BUMP COUNT JMP $+2 JMP *DUMP EXIT IF DONE IMS DUMPCT BUMP WDS PER LINE COUNT JMP DUMP2 PRINT NEXT WORD JMP DUMP1 PRINT NEXT LINE * DUMPAD WORD 0 BUFFER PTR DUMPLN WORD 0 TOTAL COUNT DUMPCT WORD 0 WDS PER LINE COUNT * LPOOL TITL ECCRTY SUBROUTINE ******************************************************** * * ECCRTY SUBROUTINE * THIS SUBTOUTINE WILL OUTPUT ECC & RETRY DISABLE IF * OPTION(S) WERE SELECTED. * THIS SUB WILL BE CALLED BY EXEC EVERY TIME A NEW PASS * IS INVOLKED OR TEST A HAS BEEN CALLED. * ******************************************************** * ECCRTY EN T JST CIOB CLEAR IOB COPY =DIOB,X INDEX DIOB COPY =3,A GET OPCODE COPY A,0(X) AND SAVE COPY =:8000,A GET TCU LED DISPLAY COPY A,4(X) COPY CAR,A GET RUN OPTION SHIFT A,LO,7 SHIFT TO RIGHT POSITION AND =:C000,A MASK OUT UNWANTED BITS COPY A,2(X) AND SAVE IN IOB COPY =DIOB,A JST OTA AND OUTPUT JMP *ECCRTY LPOOL TITL ERROR-ERROR SUBROUTINE *********************************** * * ERROR - ERROR SUBROUTINE * * THIS SUBROUTINE OUTPUT ERROR MESSAGES * TO CRT/TTY. * * * CALLS: CALLED BY: * MSGA ALL TESTS * * *********************************** * ERROR ENT PUSH 10 SAVE REGS COPY =TESTC,A GET TEST C ADDR CSK A,ERROR IS RET ADDR > TEST C ADDR? JMP $+2 YES, GO ERRCK JMP EROR NO, FORGET ERRCK JST ERRCK MACTH W/ BAD TK/CYL TABLE? JMP ERRND+6 YES, EXIT EROR COPY =EROTAB,X INDEX ERROR TABLE COPY EROTT,A GET OFSET ADD A,X COPY 0(X),A GET ERROR COUNT ADD =1,A UPDATE COPY A,0(X) AND SAVE COPY CAR,A GET RUN OPTION TBIT 1,A SUSPRESS ERROR ? JT OV,ERRND YES, EXIT JT SS,ERRND ALSO EXIT IF SS TRUE COPY ERNO,A GET ERNO SUB =:FFFF,A IS IT :FFFF? JNE A,VALID NO, VALID ERROR JST MSGA YES, NOT VALID AND SAY SO WORD NOGOOD VALID EQU $ COPY =DIOB,X INDEX IOB JST MSGA PRINT 'ERROR:' WORD ERR COPY ERNO,A GET ERROR NUMBER JST ODEC PRINT IT COPY MODE,A GET FUNCTION MODE CLSN A,='F' FORMATTER ?  JMP $+2 YES, SAY SO JMP $+3 ELSE, KEEP QUIET JST MSGA PRINT '(FORMATTER)' WORD ERFOMG JST MSGA PRINT 'ERAD: ' WORD ERRADD  COPY ERROR,A GET ERR ADDRESS SUB =1,A JST OHEX AND OUTPUT JST MSGA PRINT 'PASS' WORD PASSMSG COPY PASS,A GET PASS # JST ODEC PRINT IT JST MSGA PRINT 'UNIT' WORD UNITMSG COPY UNIT,A GET UNIT # JST ODEC PRINT IT JST SPACE PRINT 3 SPACES COPY ERTST,A GET 'TEST A(B,..)' MES ADDR COPY A,$+2 AND STORE FOR DISPLAY JST MSGA GO TO OUTPUT WORD 0 JST MSGA PRINT 'CONTROLLER STATUS:' WORD CRST COPY CST(X),A GET CONTROLLER STATUS JST OHEX PRINT IT JST MSGA PRINT 'DRIVE STATUS:' WORD DRST COPY DST(X),A GET DRIVE STATUS JST OHEX PRINT IT COPY ERADFL,A CLSN =1,A IF DONT WANT ADDRESS JMP ERRND-1 THEN SKIP JST MSGA WORD ADRCYL COPY ERTCY,A JST ODEC JST MSGA WORD ADRHD COPY ERTHD,A JST ODEC JST MSGA WORD ADRSEC COPY ERTSC,A JST ODEC JST CRLF PRINT A BLANK LINE ERRND EQU $ COPY CAR,A GET RUN OPTION TBIT 4,A HALT ON ERR? JF OV,$+4 JST MSGA PRINT 'HALT ON ERROR, PRESS RUN SW TWICE TO CONT.' WORD HLTERR HLT HALT HERE POP JMP *ERROR * ERTST WORD TSTFF 'TEST ?' MES ADDR CELL (INITIAL DUMMY) ERNO WORD 0 ERROR NUMBER CELL ESIOB WORD :70C OP STATUS REPORT ON DISC DIAG RES 11,:FFFF ERROR STATUS IOB LOCATION+1 * LPOOL TITL ERRCK -CHECK MANUF BAD TK TO SUSPRESS ERR ROUTINE ****************************************************** * * ERRCK -THIS ROUTINE WILL CHECK MANUFACTURER BAD TRACK * TABLE WHEN ERROR OCCURS. IF THE BAD TRACK COMPARED * WITH THE TABLE, ERROR REPORT WILL BE SUSPRESSED * * CALLING SEQUENCE: JST ERRCK * R+1 MACTHED RETURN (NO ERR REPORT) * R+2 UNMACHED RETURN (ERR REPORT) * * CALLS: CALLED BY: * LCONVP  ERROR * FORMAT * ****************************************************** * ERRCK ENT COPY =0,A RES ET INHABIT ERR MSG FOR SAVER/W ROUTS COPY A,SMSGFL COPY DIOB,A GET OPCODE AND =:F,A CLSN A,=:1 FORMATTER? JMP $+4 CLSN A,=:B DIRECT READ? JMP $+2 JMP ERRCK1 JST LCONVP CONVERT TO PHYSICAL ADDR COPY SECTOR,A COPY A,ERTSC COPY CYL,A GET CYLINDER # COPY HEAD,Q GET HEAD # JMP ERRCK2 ERRCK1 EQU $ COPY DIOB+SSS,A COPY A,ERTSC COPY DIOB+CS,A GET CYLINDER # COPY DIOB+HS,Q GET HEAD # ERRCK2 EQU $ COPY A,ERTCY COPY Q,ERTHD SHIFT A,LO,4 PUT IN UPPER 3 NIBBLES OR A,Q FORM CYL/HD PAIR COPY =BADBUF2,Y INDEX BAD TRACK BUFFER ERRCKLP EQU $ COPY 0(Y),A GET MFR'S BAD TRACK SUB =-1,A IS IT END OF TABLE JEQ A,ERRCKEND YES, EXIT COPY 0(Y),A NO, RESTORE BAD TRACK SUB Q,A SAME AS ERROR TRACK? JEQ A,ERRCKEX YES, GO TO ERRCKEX ADD =1,Y NO, BUMP BAD TRACK TABLE JMP ERRCKLP LOOP BACK FOR MORE ERRCKEX EQU $ COPY =1,A SET INH ERR MSG FLG FOR SAVER/W ROUTS COPY A,SMSGFL JMP *ERRCK EXIT ERRCKEND IMS ERRCK BUMP RETURN ADDR JMP *ERRCK EXIT LPOOL * TITL EROTAL -ERROR TALLIES SUBROUTINE ***************************************************** * * EROTAL -ERROR TALLY SUBROUTINE * THIS SUBROUTINE WILL PRINT ERROR TALLY *  AT THE END OF EACH TEST IF OPTION IS ON. * * TALLY -ERRORS IN THIS TEST: NNNN * * CALLS: NONE CALLED BY: ALL TESTS EXCEPT TECH TEST * ******************************************************* * EROTAL ENT COPY CAR,A GET RUN OPTION TBIT 2,A IS ERR TALLY BIT ON? JF OV,EROTND NO, EXIT JST MSGA WORD EROTMSG COPY =EROTAB,X INDEX BEGIN OF TABLE COPY EROTT,A GET OFFSET ADD A,X TO RIGHT CELL COPY 0(X),A GET # OF ERRORS JST ODEC PRINT IT JST CRLF PIINT A LINE EROTND JMP *EROTAL EXIT * EROTT WORD 0 OFFSET CELL EROTAB EQU $ COUNT TABLE ERORA WORD 0 ERR CNT TEST A ERORB WORD 0 ... ERORC WORD 0 ERORD WORD 0 ERORE WORD 0 ERORF WORD 0 ERFORM WORD 0 EROTOL WORD 0 TOTAL ERR CNT FOR ALL TESTS * LPOOL TITL 'FILINC' SUBROUTINE ***************************************************** * * FILINC - FILL I/O BUFFER * * THIS SUBROUTINE WILL SPREAD AN INCREMENTING * PATTERN INTO THE 520 WORD BUFFER. * * ENTER WITH THE STARTING VALUE IN THE A-REG * * CALLING SEQUENCE: * COPY =STARTING VALUE,A * COPY =INCREASE VALUE,X * JST FILINC * * CALLS: CALLED BY: * NONE TECH TEST * * **************************************************** * FILINC ENT COPY X,FILNCX SAVE X-REG COPY TTBUF,X PTR TO BUFFER COPY A,0(X) STORE FIRST VALUE COPY =-519,A SET COUNT COPY A,FILNCT FILNC1 COPY 0(X),A SPREAD TO NEXT WORD ADD FILNCX,A BUMP IT COPY A,1(X) ADD =1,X BUMP POINTER IMS FILNCT AND COUNT JMP FILNC1 CONTINUE COPY FILNCX,X RESTROE X-REG JMP *FILINC RETURN * FILNCT WORD 0 COUNT FILNCX WORD 0 X-REG SAVER TITL 'IDEC' SUBROUTINE ****************************** * * IDEC - INPUT DECIMAL NUMBER * * THIS SUBROUTINE WILL INPUT, FROM * THE CRT/TTY, AN ASCII-DECIMAL VALUE * WHICH IT WILL CONVERT TO BINARY AND * RETURN IT IN THE X REGISTER. * * THIS SUBROUTINE IS EXITED UPON INPUT OF * THE FIRST NON ASCII-DECIMAL CHARACTER, WHICH * IT WILL RETURN IN THE A REGISTER. * * DURING THIS SUBROUTINE, A QUESTION MARK IS * OUTPUT IF THE INPUT VALUE BECOMES GREATER * THAN 327 68 AND RESTARTS THE INPUT. * * CALLING SEQUENCE: * JST IDEC * * CALLS: CALLED BY: * IKB  QUERIES * OTTY * ****************************** * IDEC ENT INPUT A DECIMAL VALUE IDEC4 COPY =0,A CLEAR VALUE CELL COPY A,IDCTM1 COPY A,IDCTM3 AND COUNT IDEC3 JST IKB GET A CHAR COPY A,IDCTM2 SAVE IT  SUB ='0',A SEE IF ASCII 0-9 JLT A,IDEC1 TERMINATOR SUB =10,A JGE A,IDEC1 TERMINATOR IMS IDCTM3 BUMP COUNT COPY IDCTM1,A ADD TO VALUE SHIFT A,LO,2 TIMES 4 ADD IDCTM1,A TIMES 5 SHIFT A,LO,1 TIMES 10 ADD IDCTM2,A ADD NEW VALUE SUB ='0',A LESS ASCII PART JLT A,IDEC2 MINUS IS BAD COPY A,IDCTM1 STORE NEW VALUE JMP IDEC3 GET NEXT INPUT IDEC1 COPY IDCTM2,A GET TERMINATOR IN A COPY IDCTM1,X GET VALUE IN X JMP *IDEC EXIT IDEC2 COPY ='?',A ERROR JST OTTY OUTPUT "?" JMP IDEC4 START AGAIN * IDCTM1 WORD 0 VALUE CELL IDCTM2 WORD 0 ASCII CHAR CELL IDCTM3 WORD 0 COUNT * LPOOL TITL 'IHEX' SUBROUTINE ****************************** * * IHEX - INPUT HEXADECIMAL NUMBER * * THIS SUBROUTINE WILL INPUT, THROUGH * THE CRT/TTY, AN ASCII-HEX VALUE WHICH * IT WILL CONVERT TO BINARY AND RETURN IT * IN THE X REGISTER. * * THIS SUBROUTINE IS EXITED UPON INPUT OF THE * FIRST NON ASCII-HEX CHARACTER WHICH IT * RETURNS IN THE A REGISTER * * CALLING SEQUENCE: * JST IHEX * * CALLS:  CALLED BY: * IKB QUERIES * ****************************** * IHEX ENT INPUT HEX VALUE (4-DIGIT) COPY =0,A CLEAR VALUE AREA COPY A,IDCTM1 COPY A,IDCTM3 AND COUNT IHEX3 JST IKB GET A CHAR COPY A,IDCTM2 SAVE IT SUB ='0',A CHECK FOR HEX JLT A,IHEX4 TERMINATOR SUB =9,A ITS 0-9 JLE A,IHEX1 ITS 0-9 SUB =9,A ADD =1,A JLT A,IHEX4 TERMINATOR SUB =5,A JGT A,IHEX4 TERMINATOR ADD =:F,A ITS A-F IHEX2 COPY A,IDCTM2 SAVE HEX CHAR COPY IDCTM1,A INCLUDE IT IN VALUE SHIFT A,LO,4 OR IDCTM2,A 6 COPY A,IDCTM1 IMS IDCTM3 BUMP COUNT JMP IHEX3 GET NEXT CHAR IHEX1 ADD =9,A HEX 0-9 JMP IHEX2 IHEX4 COPY IDCTM2,A LOAD TERMINATOR IN 4 COPY IDCTM1,X LOAD VALUE IN X JMP *IHEX RETURN TITL 'IKB' SUBROUTINE ****************************** * * IKB - INPUT CHARACTER FROM CRT/TTY * * THIS SUBROUTINE WILL INPUT AN * ASCII CHARACTER FROM THE CRT/TTY *  AND RETURN IT IN THE A REGISTER. * * CALLING SEQUENCE: * JST IKB * * CALLS: CALLED BY: * NONE  TECH TEST * QUERIES * IDEC *  IHEX * ****************************** * IKB ENT INPUT TTY CHAR ROUTINE COPY X,IKBTMP SAVE XR ROTATE X,LO,16 SAVE OV COPY X,IKBTM2 RBIT 8,S COPY =:8618,A START ECHO,NO INTERRUPT OUT A,DTTYDA%1;1 OUTPUT START & MODES COPY =:100,X RESET CODE IN DTTYDA%1;1,A INPUT STATUS SHIFT A,RO,4 WORD READY TO OV JF OV,$-2 IF WORD NOT READY IN DTTYDA%1,A GET WORD OUT X,DTTYDA%1;1 RESET TTY AND =:7F,A INPUT CHAR AS 7-BIT ASCI I COPY IKBTM2,X RESTORE XR ROTATE X,LO,1 COPY IKBTMP,X RESTORE XR JMP *IKB * IKBTMP WORD 0 XR SAVE CELL IKBTM2 WORD 0 OV SAVE CELL * LPOOL TITL I/O SUBROUTINES *********************************** * * OTA * OTX * SEL * SENHIM * SENRDY - I/O SUBROUTINES * * THESE SUBROUTINES PERFORM THE ACTUAL I/O TO * THE CONTROLLER. * * OTA - OUTPUT A REGISTER FC.=0 * OTX - OUTPUT X REGISTER FC.=0 * SEL - SELECT AND PRESENT A FC.=4 * SENHIM - SENSE PRESENCE FC.=4 * SENRDY - SENSE READY  FC.=0 * * CALLING SEQUENCE: * OTA - COPY =IOB ADDRESS,A * JST OTA * * OTX - COPY =IOB ADDRESS,X * JST OTX * * SEL - JST SEL * * SENHIM - JST SENHIM *  JMP ? CONTROLLER NOT PRESENT R * JMP ? CONTROLLER PRESENT R+1 * * SENRDT - JST SENRDY * JMP ? CONTROLLER NOT READY R * JMP ? CONTROLLER READY R+1 * * CALLS: CALLED BY: * NONE * * *********************************** * OTA ENT DA1 EQU $ OUT A,SMDA*8+0  OUTPUT A REGISTER JMP *OTA * OTX ENT DA2 EQU $ OUT X,SMDA*8+3 OUTPUT X REGISTER JMP *OTX * SEL ENT COPY A,SEL1 COPY =0,A DA3 SELP A,SMDA*8+4 COPY SEL1,A JMP *SEL SEL1 WORD 0 * SENHIM ENT DA4 EQU $ SST SMDA*8+4 SENSE PRESENCE JMP *SENHIM IMS SENHIM JMP *SENHIM * SENRDY ENT DA5 EQU $ SST SMDA*8+0 SENSE IDLE JMP *SENRDY IMS SENRDY JMP *SENRDY * TITL LCONVP - LOGICAL TO PHYSICAL DISK ADDRESS CONVERSION SUBROUTINE *********************************** * * * LCONVP - CONVERT DISK LOGICAL ADDRESS TO * DISK PHYSICAL ADDRESS * * * CALLING SEQUENCE - JST LCONVP * * * CALLS: CALLED BY: * NONE FORMAT * * *********************************** * LCONVP EQU $ ENT COPY A,CKA SAVE A-REG COPY Q,CKQ SAVE Q-REG COPY X,CKX SAVE X-REG COPY =DIOB,X INDEX IOB COPY CS(X),A GET UPPER WORD OF LOGICAL ADDRESS  COPY HS(X),Q GET LOWER WORD OF LOGICAL ADDRESS DIV SPT,AQ LOGICAL ADDRESS/SECTOR PER TRACK COPY A,SECTOR STORE SECTOR NUMBER  COPY =0,A CLEAR UPPER WORD DIV HPD,AQ TRACKS/TRACKS PER CYLINDER COPY Q,CYL STORE CYLINDER NUMBER COPY A,HEAD STORE HEAD NUMBER COPY CKA,A RESTORE A-REG COPY CKQ,Q RESTORE Q-REG COPY CKX,X RESTORE X-REG JMP *LCONVP EXIT * LPOOL TITL 'MOVE' SUBROUTINE ****************************** * * MOVE - MOVE A BLOCK OF DATA * * THIS SUBROUTINE IS USED * TO MOVE A BLOCK OF DATA FROM * ONE AREA OF MEMORY TO ANOTHER. * * ENTER WITH NEGATIVE DATA LENGTH IN * A REGISTER * * CALLING SEQUENCE: * COPY =-DATA LENGTH,A * JST MOVE * WORD AREA1 ADDRESS OF 'FROM AREA' *  WORD AREA2 ADDRESS OF 'TO AREA' * * CALLS: CALLED BY: * NONE QUERIES *  TESTB * TESTC * TECH TEST *  FILCON * ****************************** * MOVE ENT MOVE WORD ROUTINE COPY A,MOVECT SAVE LENG TH COPY *MOVE,A GET "FROM" ADRESS COPY A,MOVEFM IMS MOVE COPY *MOVE,A GET "TO" ADRESS COPY A,MOVETO IMS MOVE BUMP FOR RTN MOVE1 COPY *MOVEFM,A GET A WORD COPY A,*MOVETO MOVE IT IMS MOVEFM BUMP FROM IMS MOVETO BUMP TO IMS MOVECT BUMP COUNT JMP MOVE1 MOVE NEXT WORD JMP *MOVE EXIT * MOVECT WORD 0 COUNT MOVEFM WORD 0 FROM AD MOVETO WORD 0 TO AD TITL MSGA SUBROUTINE *********************************** * * MSGA - PRINT ASCII MESSAGE * * THIS SUBROUTINE WILL PRINT AN * ASCII MESSAGE TO THE CRT/TTY. * THE LAST CHARACTER OF THE MESSAGE * MUST BE :FF. * * * CALLING SEQUENCE: JST MSGA * WORD MESSAGE ADDRESS * * * CALLS:  CALLED BY: * OTTY * * *********************************** * MSGA ENT COPY X,MSGA3 SAVE X-REG COPY *MSGA,X GET MSG ADDR SHIFT X,LO,1 IMS MSGA BUMP FOR RETURN MSGA1 SBIT 2,S COPYB 0(X),A GET A CHAR RBIT 2,S CLSN =:FF,A IS IT END OF MSG JMP MSGA2 YES EXIT JST OTTY PRINT A CHAR ADD =1,X BUMP PTR JMP MSGA1 GET NEXT CHAR MSGA2 COPY MSGA3,X RESTORE X-REG JMP *MSGA EXIT * MSGA3 WORD 0 SAVE X-REG CELL * LPOOL TITL 'OBIN' SUBROUTINE ****************************** * * OBIN - PRINT BINARY NUMBER * * THIS SUBROUTINE WILL PRINT A * BINARY NUMBER TO THE CRT/TTY. * * ENTER WITH THE NUMBER IN THE A * REGISTER * * CALLING SEQUENCE: * COPY =BINARY NUMBER,A * JST OBIN * * CALLS:  CALLED BY: * SPACE ERROR * OTTY * ****************************** * OBIN ENT COPY  A,OBINA SAVE VALUE JST SPACE COPY ='(',A JST OTTY PRINT OPEN PAREN COPY =' ',A JST OTTY COPY =-4,A COPY A,OBINB SET NIBBLE COUNT OBIN1 COPY =-4,A COPY A,OBINC SET 4-BIT COUNT OBIN2 COPY OBINA,A SHIFT A,LO,1 PICK OFF NEXT BIT COPY A,OBINA COPY ='0',A ITS EITHER A ZERO JF OV,$+2 ADD =1,A OR A '1'  JST OTTY PRINT IT IMS OBINC BUMP 4-BIT COUNTER JMP OBIN2 PRINT NEXT BIT COPY =' ',A PRINT SPACE EACH 4 BITS  JST OTTY IMS OBINB BUMP NIBBLE COUNT JMP OBIN1 GET NEXT NIBBLE COPY =')',A ALL DONE JST OTTY PRINT CLOSE PAREN JMP *OBIN EXIT * OBINA WORD 0 VALUE OBINB WORD 0 NIBBLE COUNT OBINC WORD 0 4-BIT COUNT * LPOOL  TITL ODEC-OUTPUT DECIMAL NUMBER SUBROUTINE *********************************** * * ODEC - PRINT DECIMAL NUMBER * *  THIS SUBROUTINE WILL CONVERT THE * A-REG TO AN EQUIVALENT DECIMAL * NUMBER AND PRINT IT TO THE CRT/TTY *  IF IT IS LESS THAN 10000. IF IT IS * GREATER THAN 10000 IT WILL PRINT * '****'. * * ENTER WITH NUMBER IN THE A-REG * * * CALLING SEQUENCE: COPY =NUMBER,A * JST ODEC * * * CALLS:  CALLED BY: * MSGA FORMAT * OTTY * * ************************************ * ODEC ENT COPY X,ODECX SAVE X-REG COPY Y,ODECY SAVE Y-REG COPY A,IDCTM1 SAVE BINARY VALUE CSK A,ODECTBL+1 IS IT GREATER THAN 10,000? JMP ODECO NO, CONTINUE NOP JST MSGA YES, PRINT '****' WORD STARS JMP ODEC2 EXIT ODECO COPY ODECTBL,A GET TAB LE COPY A,IDCTM2 COPY =-5,A COUNT 5 DIGITS COPY A,IDCTM3 ODEC1 COPY IDCTM1,A GET REMINDER COPY IDCTM2,Y COPY ='0'-1,X SUB 0(Y),A DIVIDE IN DECIMAL ADD =1,X ADD TO OUTPUT VALUE JGE A,$-2 ADD 0(Y),A ADD BACK IN IF GONE NEGATIVE COPY A,IDCTM1 STORE REMINDER COPY X,A JST OTTY PRINT CALCULATED DIGIT IMS IDCTM2 BUMP TABLE POINTER IMS IDCTM3 AND COUNT JMP ODEC1 DO NEXT DIGIT ODEC2 COPY ODECX,X RESTORE X-REG COPY ODECY,Y RESTORE Y-REG JMP *ODEC EXIT AFTER 5 * ODECTBL WORD $+1,10000,1000,100,10,1 ODECX WORD 0 X-REG CELL ODECY WORD 0 Y-REG CELL * LPOOL TITL OHEX SUBROUTINE *********************************** * * OHEX - PRINT HEX NUMBER * * THIS SUBROUTINE WILL CONVERT THE * A REGISTER TO AN EQUIVALENT ASCII * HEX NUMBER AND PRINT IT TO THE * CRT/TTY. * * * CALLING SEQUENCE: COPY =NUMBER,A * JST OHEX * * *  CALLS: CALLED BY: * OTTY TESTA * * *********************************** * OHEX ENT COPY X,ODECX SAVE X-REG COPY A,X SAVE FOR OUTPUT COPY =-4,A COPY A,OHEXC1 OUTPUT 4 HEX DIGITS OHEX1 COPY =-4,A COPY A,OHEXC SHIFT COUNT=4 COPY =0,A CLEAR OUT A-REG OHEX2 ROTATE X,LO,1 MS. BIT OF X ROTATE A,LO,1 BECOMES LS. BIT OF A IMS OHEXC BUMP SHIFT COUNT JMP OHEX2 AND CONTINUE SUB =10,A FIX TO ASCII JLT A,$+2 NUMERIC? ADD =7,A ADD ='9'+1,A NO, ITS A-F JST OTTY OUTPUT THE DIGIT IMS OHEXC1 4 DIGITS YET? JMP OHEX1 NO, DO ANOTHER COPY ODECX,X YES, RESTORE X JMP *OHEX EXIT * OHEXC1 WORD 0 4-DIGIT COUNTER OHEXC WORD 0 4-BIT SHIFT COUNT * LPOOL TITL OTTY SUBROUTINE *********************************** * * OTTY - PRINT ASCII CHARACTER * * THIS SUBROUTINE WILL PRINT AN ASCII CHARACTER * IN THE LS BYTE OF THE A REGISTER TO CRT/TTY * * * ENTER WITH CHARACTER IN LS BYTE OF THE A REGSITER * * * CALLING SEQUENCE: COPY =CHARACTER,A * JST OTTY * * * CALLS: CALLED BY: * * ************************************ * OTTY ENT COPY A,OTTMP1 SAVE AR COPY X,OTTMP2 SAVE XR RBIT 8,S COPY =:8612,X START, REQUEST TO SEND, DON'T INTERRUPT OUT X,DTTYDA%1;1 START PICO OUT A,DTTYDA%1 SEND WORD COPY =:100,X RESET CODE IN DTTYDA%1;1,A INPUT STATUS SHIFT A,RO,5 TREMPTY TO OV JT OV,$-2 IF STILL SET IN DTTYDA%1;1,A INPUT STATUS SHIFT A,RO,5 TREMPTY TO OV JF OV,$-2 IF STILL FULL OUT X,DTTYDA%1;1 RESET PICO COPY LPFLAG,A GET LP FLAG JEQ A,OTTY6 IF ZERO, EXIT OTTY1 JST TIMER SET TIME COPY OTTMP1,A RESTORE AR OUT A,DLPDA%1 START IT COPY =:8610,A LP START UP COMMAND OUT A,DLPDA%1;1 START IT OUT A,DLPDA%1;1 DITTO OTTY2 IN DLPDA%1;1,A INPUT STATUS SHIFT A,RO,1 SHIFT 'BUSY BIT' TO OV JF OV,OTTY5 IF NOT BUSY, EXIT JST TIME DO DELAY JMP OTTY2 LOOP BACK IF NOT DONE COPY OTTMP1,A GET ORIGINAL AR CONTENTS COPY A,OTTMP3 SAVE IT COPY LPFLAG,A GET LP FLAG COPY A,OTTMP4 SAVE IT COPY OTTMP2,A GET ORIGINAL XR CONTENTS COPY A,OTTMP5 SAVE IT COPY OTTY,A GET RETURN ADDRESS COPY A,OTTMP6 SAVE IT COPY =0,A SET NEW LP FLAG COPY A,LPFLAG STORE NEW LP FLAG COPY =LPMSG*2,X GET ERROR MESSAGE ADDRESS-'LP TIMEOUT' OTTY3 SBIT 2,S SET BYTE MODE COPYB 0(X),A GET CHAR RBIT 2,S SET WORD MODE CLSN A,=:FF IF END OF MESSAGE, EXIT JMP OTTY4 JST OTTY DISPLAY ON CRT/TTY ADD =1,X INC  . MESSAGE ADDRESS JMP OTTY3 LOOP FOR MORE OTTY4 JST IKB INPUT CHAR FROM KEYBOARD COPY OTTMP6,A GET RETURN ADDR COPY A,OTTY SET IT COPY OTTMP4,A GET ORIGINAL LP FLAG COPY A,LPFLAG SET IT COPY OTTMP5,A GET ORIGINAL XR COPY A,OTTMP2 SET IT COPY OTTMP3,A GET ORIGINAL AR COPY A,OTTMP1 SET IT JMP OTTY1 OTTY5 COPY =:100,X GET LP RESET COMMAND OUT X,DLPDA%1;1 RESET LP SHIFT X,RO,1 WAST SOME TIME JNE X,$-1 DITTO OTTY6 COPY OTTMP1,A RESTORE AR COPY OTTMP2,X RESTORE XR JMP *OTTY RETURN TO CALLER * OTTMP1 WORD 0 AR SAVE CELL OTTMP2 WORD 0 XR SAVE CELL OTTMP3 WORD 0 SAVE AR OTTMP4 WORD 0 SAVE LP FLAG OTTMP5 WORD 0 SAVE XR OTTMP6 WORD 0 SAVE RETURN ADDRESS LPFLAG WORD 0 LP FLAG * LPOOL TITL PCONVL - PHYSICAL TO LOGICAL ADDRESS CONVERSION SUBROUTINE *********************************** * * * PCONVL - CONVERT DISK PHYSICAL ADDRESS TO * DISK LOGICAL ADDRESS * * * CALLING SEQUENCE: COPY 'CURRENT CYL',Q * COPY 'CURRENT SECTOR',X * COPY 'CURRENT HEAD',Y * JST PCONVL * * NOTE: ALL NUMBERS MUST BE IN HEX. A & Q REGISTERS DISTROYED. * * * CALLS:  CALLED BY: * NONE MFRBTFT * FORMAT * TESTD * * *********************************** * PCONVL EQU $ ENT COPY X,TEMP4 SAVE X-REG COPY Y,TEMP6 SAVE Y-REG COPY =0,A ZERO OUT P-REG MUL HPD,AQ HEADS/DRIVE * CYL # RBIT 0,S CLEAR CARRY BIT ADDC TEMP6,Q HDS/DR * CYL + CURRENT HD ADDC =0,A ADJUST UPPER WORD COPY A,K K=A MUL SPT,AQ (HDS/DR*CYL+CUR HD)*SECTOR SUB K,A ADJUST RESULT RBIT 0,S CLEAR CARRY ADDC TEMP4,Q (HDS/DR*CYL+CUR HD)*SCT+CUR SCT ADDC =0,A ADJUST UPPER WORD COPY A,LOGADDR SAVE UPPER WORD COPY Q,LOGADDR+1 AND LOWER WORD COPY TEMP4,X RESTORE REGISTERS COPY TEMP6,Y JMP *PCONVL EXIT * LPOOL TITL PREP - PERPARE DISK PHYSICAL ADDRESS SUBROUTINE *********************************** * * * PERP - PERPARE DISK PHYSICAL ADDRESS SUBROUTINE * * THIS SUBROUTINE WILL GENERATE CYLINDER NUMBER, * HEAD NUMBER, AND SECTOR NUMBER BY MEANS OF *  THE RANDOM NUMBER GENERATOR. * * * CALL SEQUENCE: JST PREP * * * CALLS: CALLED BY: *  RANDOM TESTC * TESTD * * ************************************* * PREP EQU $ ENT COPY A,CKA SAVE A-REG COPY X,CKX AND X-REG JST RANDOM GET A RANDOM NUMBER COPY A,TEMP5 SAVE IT COPY A,X A -> X COPY =0,A 0 -> A DIV MAXCYL,AX GENERATE CYLINDER # COPY A,CYL SAVE IT COPY TEMP5,X RESTORE RANDOM NUMBER COPY =0,A 0 -> A DIV MAXHEAD,AX CALCULATE HEAD # COPY A,HEAD SAVE IT COPY MAXSCTOR,A GET READY TO CALCULATE SECTOR # SUB =4,A  COPY A,TEMP6 COPY TEMP5,X RESTORE RANDOM NUMBER COPY =0,A 0 -> A DIV TEMP6,AX CALCULATE SECTOR # COPY A,SECTOR SAVE IT COPY CKA,A RESTORE A-REG COPY CKX,X AND X-REG JMP *PREP EXIT * LPOOL TITL RANDOM SUBROUTINE ********************************** * * * RANDOM - RANDOM NUMBER SUBROUTINE * * * THIS SUBROUTINE WILL GENERATE A PSEDUO * RANDOM NUMBER USING THE FOLLING EQUATION: * * C(I+1) = C(C(I)*Y+U)MOD(P)) * * WHERE * * C(I) = SEE! D VALUE * C(I+1) = PSEUDO RANDOM NUMBER * U = 0 * Y = 5**(2K+1) K = 2 *  P = 983 * * THE PERIOD FOR THE ABOVE RANDOM SEQUENCE IS 983. * * EXIT WITH THE RANDOM NUMBER IN THE A REGISTER. * * CALLING SEQUENCE: JST RANDOM * * * CALLS: CALLED BY: * NONE TESTC * * *********************************** * RANDOM ENT COPY X,RMD:X SAVE X-REG COPY =0,A CLEAR A-REG COPY SEED,X SET C(I) --> X-REG * * NOW CALC C(I)*YYYYYY * MUL YYYYYY,AX * * NOW CALC (C(I)*YYYYYY)MOD(PPPPPP) * DIV PPPPPP,AX COPY A,SEED SET NEXT SEED COPY RMD:X,X RESTORE X-REG JMP *RANDOM EXIT * SEED RES 1,1 C(I) VALUE YYYYYY WORD 3125 5**(2K+1) FOR K=2 PPPPPP WORD 983 CAREFULLY CHOOSEN MODULUS RMD:X RES 1,0 X-REG KEEPER FOR THIS ROUTINE * LPOOL TITL SAVER SUBROUTINE *********************************** * * * SAVER - THIS SUBROUTINE READS THE WINCHESTER * DISK ON WHICH THE TRACK(S) WILL BE * PERFORM A WRITE OPERATION. * * * COMMAND IOB FOR THE WRITE OPERATION MUST BE * SET UP BEFORE THIS SUBROUTINE IS INVOKED. * THIS SPECIFICED THE ADDRESS TO BE READ. * * * NOTE: TRANSFER DATA LENGTH CANNOT BE GREATER * THAN 1024. * * * CALLING SEQUENCE: JST SAVER * * * CALLS: CALLED BY: * ERROR TESTC * MOVE * MSGA * * *********************************** * SAVER ENT ENTRY POINT FOR NON-DESTRUCTIVE TEST SUBROUTINE COPY A,ASAVE SAVE A-REG COPY X,XSAVE SAVE X-REG COPY CAR,A GET RUN OPTION TBIT 6,A IS NON DESTRUCTIVE SET? JF OV,SREND NO, EXIT COPY =-12,A GET NEGATIVE WORD COUNT JST MOVE COPY ORIGINAL IOB WORD DIOB FRe820909213612820909213612840217163331e@820909213612820909213612820909213805" e820909213612820909213612820909213612e820909213612820909213612820909213612820909213612820909213612820909213612e%840213145050840213145149840213145149eC/5840213145203840213145210840217163059e[R840213145240831102131110840213145242# $ % & ' ( ) * + . TCU ASMTCU OBJTCU JCL, OM DIOB WORD SIOB TO SIOB COPY =0,A COPY A,NB+SIOB NO NEXT BLOCK * SET UP IOB TO SAVE ORIGINAL DATA COPY =SIOB,X INDEX SAVE IOB COPY =RDDAT,A GET READ DATA COMMAND COPY A,OP(X) SAVE IT COPY =TMPBUF,A GET TEMP BUFFER ADDRESS COPY A,MA(X) SAVE IT  COPY =SRINT,A GET INT ADDRESS COPY A,IN(X) SAVE IT * READ AND SAVE DATA SBIT 8,S ENABLE INT COPY =SIOB,A GET SAVE IOB ADDRESS JST OTA SEND IT JMP $ WAIT FOR INT * SRINT EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =SIOB,X INDEX SAVE IOB COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT :400? JNE A,$+2 NO,ERROR JMP SAVERA YES, EVERYTHING IS AOK ADD =:400,A PUT CONTROLLER AND DRIVE COPY A,DIOB+CST STATUS IN DIOB COPY SIOB+DST,A BEFORE CALLING ERROR COPY A,DIOB+DST COPY =18,A SET ERROR NUMBER COPY A,ERNO SAVE IT JST ERROR CALL ERROR COPY SMSGFL,A GET INH ERR MSG FLAG JNE A,SAVERA SKIP MSG IF SET JST MSGA PRINT ADDITIONAL MESSAGE WORD SMSGA1 SAVERA COPY =-12,A GET NEGATIVE WORD COUNT JST MOVE RESTORE ORIGINAL IOB WORD DIOB FROM DIOB WORD SIOB TO SIOB COPY =0,A COPY A,NB+SIOB NO NEXT BLOCK SREND COPY ASAVE,A RESTORE A-REG COPY XSAVE,X RESTORE X-REG JMP *SAVER EXIT * ASAVE WORD 0 A SAVE CELL XSAVE WORD 0 X SAVE CELL SIOB RES 12,0 SAVE IOB BUFFER * LPOOL TITL SAVEW SUBROUTINE ************************************ * * * SAVEW - THIS SUBROUTINE WRITES BACK THE * ORIGINAL DATA EXTRACT FORM THE * DISK. * * * CONSTRAINS: SAME AS SAVER * * * CALLING SEQUENCE: JST SAVEW * * * CALLS:  CALLED BY: * ERROR TESTC * MSGA * * *********************************** * SAVEW ENT ENTRY POINT COPY A,ASAVE SAVE A-REG COPY X,XSAVE SAVE X-REG COPY CAR,A GET RUN OPTION TBIT 6,A IS NON DESTRUCTIVE ON? JF OV,SWEND NO, EXIT * SET UP IOB TO RESTORE DATA COPY =SIOB,X INDEX IOB COPY =WRTDAT,A GET WRITE DATA COMMAND COPY A,OP(X) SAVE IT COPY =TMPBUF,A GET TEMP BUFFER ADDRESS COPY A,MA(X) SAVE IT COPY =SWINT1,A GET INT ADDRESS COPY A,IN(X) SAVE IT *  WRITE BACK ORIGINAL DATA SBIT 8,S ENABLE INT COPY =SIOB,A GET SAVE IOB ADDRESS JST OTA SEND IT JMP $ WAIT FOR INT * SWINT1 EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =SIOB,X INDEX SAVE IOB COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT :400? JNE A,$+2 NO, ERROR JMP SAVERV YES, GO VERIFY DATA ADD =:400,A PUT CONT. & DRIVE ST. IN DIOB COPY A,DIOB+CST COPY SIOB+DST,A COPY A,DIOB+DST COPY =18,A GET ERROR NUMBER COPY A,ERNO SAVE IT JST ERROR CALL ERROR COPY SMSGFL,A GET INH ERR MSG FLAG JNE A,SWEND SKIP MSG IF SET JST MSGA PRINT ADDITIONAL MSSAGE WORD SMSGA2 JMP SWEND EXIT * LPOOL SAVERV EQU $ * SET UP READ VERIFY IOB COPY =SIOB,A INDEX SAVE IOB COPY =RDVER,A GET READ VERIFY COMMAND COPY A,OP(X) SAVE IT COPY =SWINT2,A GET INT ADDRESS COPY A,IN(X) SAVE IT * READ VERIFT ORIGINAL DATA SBIT 8,S ENABLE INT COPY =SIOB,A GET SAVE IOB ADDRESS JST OTA SEND IT JMP $ WAIT FOR INT * SWINT2 EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =SIOB,X INDEX SAVE IOB COPY CST(X),A GET CONTROLLER STATUS SUB =:400,A IS IT :400? JNE A,$+2 NO, ERROR JMP SWEND EXIT ADD =:400,A PUT STATUS BACK INTO DIOB COPY A,DIOB+CST COPY SIOB+DST,A COPY A,DIOB+DST COPY =18,A GET ERROR NUMBER COPY A,ERNO SAVE IT JST ERROR CALL ERROR JST MSGA PRINT ADD- ITIONAL MESSAGE WORD SMSGA3 SWEND COPY ASAVE,A RESTORE A-REGISTER COPY XSAVE,X RESTORE X-REGISTER JMP *SAVEW EXIT * LPOOL TITL SPACE SUBROUTINE *********************************** * * * SPACE - PRINT SPACES * * THIS SUBROUTINE WIL PRINT THREE * ASCII SPACES TO THE CRT/TTY. * * * CALLING SEQUENCE: JST SPACE * * * CALLS: CALLED BY: * OTTY OBIN * * *********************************** * SPACE ENT COPY A,SPTEMP SAVE A-REG COPY =' ',A PRINT 3 SPACES JST OTTY DO IT JST OTTY AGAIN JST OTTY ONE MORE TIME COPY SPTEMP,A RESTORE A-REG JMP *SPACE EXIT * SPTEMP WORD 0 A-REG CELL * LPOOL TITL TIME SUBROUTINE *********************************** * * * TIME - TIME DELAY ROUTINE, TAKES * APPROXIMATELY 7 SECONDS IF * TIMING CELLS ARE INITIALIZED BY * 'TIMER'. * * * CALLING SEQUENCE: JST TIME * JMP ? TIME NOT FULLY EXPIRED R * JMP ? TIME FULLY EXPIRED R+1 * * * CALLS: CALLED BY: * NONE OTTY * * *********************************** * TIME ENT IMS TC1 BUMP LSP TIMING CONSTANT JMP *TIME EXIT IMS TC2 BUMP MSP TIMING CONSTANT JMP *TIME EXIT TO CALL + 1 IMS TIME SPECIAL RETURN..EXPIRED JMP *TIME EXIT * TC1 RES 1,0 TC2 RES 1,0 * LPOOL TITL TIMER SUBROUTINE *********************************** * * * TIMER - INITIALIZES TIMING CELLS * FOR 'TIME'. * * * CALLING SEQUENCE: JST TIMER * * * CALLS: CALLED BY: * NONE OTTY * * *********************************** * TIMER ENT COPY =0,A SET LOW WORD COPY A,TC1 COPY =-7,A SET HIGH WORD COPY A,TC2 JMP *TIMER EXIT * LPOOL TITL TRAP/EXCEPTION SERVICE ROUTINES ************************************ * * TRAP/EXCEPTION SERVICE ROUTINES * * CONSOLE INTERRUPT SERVICE ROUTINE * * CALLS: * SEL * MSGA * * *********************************** * * POEWR UP * PWRUP: ENT POWER UP SERVICE ROUTINE SIN 3 STATUS INHIBIT COPY =PFMSG,X GET MESSAGE ADDRESS SERVR EQU $ COPY =0,A CLEAR A-REG COPY A,S SET PSW TO ZERO JST SEL RESET/INITIALIZE CONTROLLER COPY X,$+2 STORE MESSAGE ADDRESS JST MSGA PRINT MESSAGE WORD 0 HLT WAIT HERE JMP EXEC * * UNIMPLEMENTED INSTRUCTION TRAP * UNINT: ENT UNI. INSTR. SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =INMSG,X GET ARRESS JMP SERVR PRINT IT * * UNINSTALLED MEMORY TRAP * UNMET: ENT UNI. MEM. TRAP ROUTINE SIN 4 STATUS INHIBIT COPY =MEMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * POWER FAIL * PWRFL: ENT POWER FAIL ROUTINE HLT WAIT FOR POWER * * CHAR./NUM. EXCEPTIONS * CHNUE: ENT SIN 4 STATUS INHIBIT COPY =CHMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * STACK OVERFLOW * STKOV: ENT SIN 4 STATUS INHIBIT COPY =STMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * USER TRAP * USETR: ENT SIN 4 STATUS INHIBIT COPY =USMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * SYSTEM TRAP * SYSTR: ENT SIN 4 STATUS INHIBIT COPY =SYMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * ARITHMETIC ERROR * ARIER: ENT SIN 4 STATUS INHIBIT COPY =ARMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * CONSOLE INTERRUPT * CNINT: ENT SIN 2 STATUS INHIBIT COPY =0,A . SET A TO ZERO COPY A,S SET PSW TO ZERO OUT A,1 RESET CONSOLE INT LIGHT JST SEL RESET/INITIALIZE CONTROLLER JST OTX SOFTWARE RESET COPY =0,A SET UP TIMER COPY A,TC1 DO IT COPY =-28,A ALLOW TIME COPY A,TC2 DO IT JST TIME CALL TIMER JMP $+3 TIME NOT EXPIRED NOP EXPIRED JMP PSU JST SENRDY IS CONTROLLER READY? JMP $-5 NO, NOT READY JMP $-3 YES, READY NOP TIME EXPIRED JMP PSU GO TO QUERRIES * LPOOL TITL SYSTEM BUFFERS AND CELLS *********************************** * * * SYSTEM BUFFERS, IOB, DATA CELLS * * *********************************** * OPTIONS +:0020 BADBUF RES BADBUFSZ,-1 MFR'S BAD TRACKS BUFFER FOR FMTTR * BADBUF2 RES BADBUFSZ,-1 MFR'S BAD TRACKS BUFFER FOR DIAG * BADCYL RES 1,0 BAD CYLINDER CELL * BADHEAD RES 1,0 BAD HEAD CELL * BUFCLR RES BADBUFSZ,-1 CLEAN BAD BUFFER BUFFER * BUFPTR RES 1,0 BUFFER POINTER * CKA WORD 0 A-REG CELL * CKQ WORD 0 Q-REG CELL * CKX WORD 0 X-REG CELL * CKY WORD 0 Y-REG CELL * CTL WORD :100 OPERATION COUNT CONTROL * CYL WORD 0 SAVE CYLINDER CELL * DIOB RES 14,0 IOB LOCATION * DCIOB RES 4,0 DATA CHAIN IOB LOCATION * DCIOB1 RES 4,0 ANOTHER DATA CHAIN IOB LOCATION * ECHO RES 1,0 ANOTHER FLAG * ECHOFL WORD 0 ECHO FLAG CELL * ERADFL WORD 0 ERR ADDR FLAG (FOR ERR ADDR PRINT) * ERLPFL WORD 0 ERROR LP FLAG * ERTCY WORD 0 PAHYSICAL CYLINDER ERTCY1 WORD 0 ERTCY2 WORD 0 ERTHD WORD 0 HEAD AND ERTHD1 WORD 0 ERTHD2 WORD 0 ERTSC WORD 0 SECTOR ERTSC1 WORD 0 ERTSC2 WORD 0 * HEAD WORD 0 SAVE HEAD CELL * HPD WORD 0 HEADS PER DRIVE CELL * INLEV WORD 0 FORMAT INTERLEAVING FACTOR * LIMI EQU BADBUF+BADBUFSZ-1 ADDRESS OF LAST WORD IN BADFUF LIMIT WORD LIMI * LOGADDR RES 2,0 DISK LOGICAL ADDRESS CELLS * PAMTR RES 5,0 INITIALIZATION PARAMETER TABLE * MFRFLG WORD 0 MFR FLAG * PASS WORD 0 PASS COUNTER CELL * PATN WORD :6DB6 WORD PATTERN CELL * SEEDSAVE WORD 0 CELL FOR RANDOM NUMBER GENERATOR SEED * SECTOR WORD 0 SAVE SECTOR CELL * SPT WORD 0 SECTORS PER TRACK CELL * UCUR RES 5,:FFFF UNIT NUMBER TABLE * UNIT WORD 0 UNIT NUMBER CELL * WBUF RES 260,:6DB6 WRITE BUFFER INITIALIZED TO 6DB6 * WBUF1 RES 260,:6DB6 2ND WRITE BUFFER * WBUF2 RES 260,:6DB6 3RD WRITE BUFFER * RBUF RES 260,:0 READ BUFFER INITIALIZED TO 0 * RBUF1 RES 260,:0 2ND READ BUFFER * RBUF2 RES 260,:0 3RD READ BUFFER * SMSGFL WORD 0 ERR MSG FLAG FOR SAVER/W ROUTS * TMPBUF RES 1030,:0 TEMP BUFFER * TEMP1 WORD 0 USED BY TEST SEL, EXEC * TEMP2 WORD 0 TEMP CELL USED AS INPUT FLAG * TEMP3 WORD 0 TEMP CELL * TEMP4 WORD 0 TEMP CELL * TEMP5 WORD 0 TEMP CELL * TEMP6 WORD 0 TEMP CELL * TSTBUF1 WORD :41,:42,:43,:44,:45,-1,-1 TEST SELECTION TABLE * TSTBUF2 WORD :41,:42,:43,:44,:45,-1,-1 DEFAULT TEST TABLE * CAR WORD 0 RUN OPTION CELL IPCOUNT WORD 0 INPUT COUNT CELL IPFLAG WORD 0 INPUT FLAG CELL MODE WORD 0 RUN MODE CELL * TITL I/O INSTRUCTION ADDRESS TABLE ******************************************** * * I/O INSTRUCTION ADDRESS TABLE * ******************************************** * IOTAB EQU $ WORD DA1 OUT A-REG INSTRUCTION WORD DA2 OUT X-REG INSTRUCTION WORD DA3 OUT SELP INSTRUCTION WORD DA4 SENSE PRESENCE WORD DA5 SENSE IDLE * TITL TABLES - DRIVE PARAMETER ADDRESSES) ************************************ * * TABLE OF DRIVE PARAMETER ADDRESSES * * TABLE MUST BE KEPT CONTIGUOUS * * *********************************** * DRTBL EQU $ START OF DRIVE PARAMETER ADDRESSES * WORD CM5412 CMI/  5412 * WORD ET5540 EVOTCK 5540 * WORD XT1065 MAXTOR 1065 * WORD XT1140 MAXTOR 1140 * WORD RO204 RODIME 204 * WORD MP1304 MICROPOLIS 1304 * WORD AT3046 ATASI 3046 * * ADD NEW DRIVE PARAMETER TABLE ADDRESSES HERE * DRTBLZ EQU $-DRTBL-1 NUMBER OF DRIVE-1 * TITL TABLES - DRIVE PARAMETER TABLE *********************************** * * * DEFALT DRIVE PARAMETER TABLE * * MSUT BE KEPT CONTIGUOUS * * ********************************** * PRAMSX EQU $ * DISKX WORD CM5412 DEFAULT DRIVE PARAMETER TABLE ADDRESS * HCPX EQU $ CM5412 PARAMETERS CYLX WORD :131 MAXIMUM NUBER OF CYLINDERS SCTORX WORD :11 MAXIMUM NUMBER OF SECTORS HEADX WORD :3 MAXIMUN NUMBER OF HEADS INITBKX WORD :101,:3,:131,:40,0 INITIALIZATION PARAMETER BLOCK EHCPX EQU $ END OF TABLE TITL TABLES - WORKING PARAMETER TABLE **************************************** * * * WORKING PARAMETER TABLE * * MUST BE KEPT IN ORDER * * *************************************** * PRAMS EQU $ WORKING PARAMETER TABLE * DISK WORD CM5412 DRIVE PARAMETER TABLE ADDRESS * HCP EQU $ MAXCYL WORD :131 MAXSCTOR WORD :11 MAXHEAD WORD :3 INITBK WORD :101,:3,:131,:40,0 EHCP EQU $ END OF TABLE * PRMSIZ EQU $-PRAMS SIZE OF TABLE TITL TABLE - CM5412 ************************************* * * * COMPUTER MEMORIES, INC. CM5412 * * DEFAULT DRIVE SELECTION * * TABLE MUST BE KEPT IN ORDER * * ************************************ * CM5412 EQU $ START OF TABLE * WORD :131 NUMBER OF CYLINDERS * WORD :11 NUMBER OF SECTORS * WORD :3 NUMBER OF HEADS * WORD :101 INITIALIZATION PARAMETERS BKOCK * WORD :3 * WORD :131 * WORD :40 * WORD 0 * TITL TABLES - EVOTCK ET5540 PARAMETER TABLE ************************************* * * * EVOTCK ET5540 PARAMETER TABLE * * TABLE MUST BE KEPT IN ORDER * * ************************************ * ET5540 EQU $ START OF TABLE * WORD :176 NUMBER OF CYLINDERS * WORD :11 NUMBER OF SECTORS * WORD :7 NUMBER OF HEADS * WORD :101,:7,:176,:40,0 INITIALIZATION BLOCK TITL TABLES - MAXTOR XT1065 TABLE ************************************ * * * MAXTOR XT1065 PARAMETER TABLE * * TABLE MUST BE KEPT IN ORDER * * *********************************** * XT1065 EQU $ * WORD :395 NUMBER OF CYLINDERS * WORD :11 NUMBER OF SECTORS * WORD :6 NUMBER OF HEADS * WORD :101,:6,:395,:40,0 INITIALIZATION TABLE * TITL TABLE - MAXTOR XT1140 TABLE ************************************ * * * MAXTOR XT1140 DRIVE PARAMETER TABLE * *  MUST BE KEPT IN ORDER * * *********************************** * XT1140 EQU $ START OF TABLE * WORD :395 NUMBER OF CYLINDERS * WORD :11 NUMBER OF SECTORS * WORD :E NUMBER OF HEADS * WORD :101,:E,:395,:40,0 INITIALIZATION TABLE * TITL TABLE - RODIME RO204 TABLE *********************************** * * * RODIME RO204 DRIVE PARAMETER TABLE * * MUST BE KEPT IN ORDER * * *********************************** * RO204 EQU $ START OF TABLE * WORD :13F NUMBER OF CYLINDERS * WORD :11 NUMBER OF SECTORS * WORD :7 NUMBER OF HEADS * WORD :101,:7,:13F,:8300,:0 INITIALIZATION TABLE * TITL TABLE - MICROPOLIS MP1304 TABLE *********************************** * * * MICROPOLIS MP1304 DRIVE PARAMETER TABLE * * MUST BE KEPT IN ORDER * * *********************************** * MP1304 EQU $ TABLE STARTS HERE * WORD :33D NUMBER OF CYLINDERS * WORD :11 NUMBER OF SECTORS * WORD :5 NUMBER O0 F HEADS * WORD :101,:5,:33D,:0,:0 INITIALIZATION PARAMETER TITL ATASI AT-3046 TABLE ***************************************** * * * ATASI AT-3046 DRIVE PARAMETER TABLE * * MUST BE KEPT IN ORDER * * ***************************************** * AT3046 EQU $ START OF TABLE * WORD :284 NUMBER OF CYLINDERS * WORD :11 NUMBER OF SECTORS * WORD :6 NUMBER OF HEADS * WORD :101,:6,:284,0,0 INITIALIZATION PARAMETERS * * * * ADD NEW DRIVE PARAMETER TABLE HERE * * TITL QUERIES MESSAGES ***************************************** * * QURY'S MESSAGES * ***************************************** * BADTK1 BYTE ' HEAD ',:FF * BADTRK BYTE CR:,LF:,'BAD TRACKS: CYLINDER ',:FF * DEVMSG BYTE CR:,LF:,'DEVICE ADDRESS (01-1F[14])?',:FF * ENDMFR BYTE CR:,LF:,LF:,'END OF BAD TRACKS LIST FROM MANUFACTURER.' BYTE CR:,LF:,:FF * FSMSG BYTE CR:,LF:,'FUNCTION SELECT ([D],F,T)?',CR:,LF:,:FF * INLEVMSG BYTE CR:,LF:,'FORMAT INTERLEAVING FACTOR (0-9[0])?',CR:,LF:,:FF * NDMSG BYTE CR:,LF:,'NON-DESTRUCTIVE MODE (Y/[N])?',:FF * PAMTRMSG BYTE CR:,LF:,'ENTER INITIALIZATION PARAMETERS IN HEX',CR: BYTE LF:,:FF * PMFRL BYTE CR:,LF:,LF:,'BAD TRACK LIST FROM MANUFACTURER:',:FF * QRYD1 BYTE CR:,LF:,' CM5412 - 0' COMPUTER MEMORIES 5412 DRIVE BYTE CR:,LF:,' ET5540 - 1' EVOCK 5540 DRIVE BYTE CR:,LF:,' XT1065 - 2' MAXTOR 1065 DRIVE BYTE CR:,LF:,' XT1140 - 3' MAXTOR 1140 DRIVE BYTE CR:,LF:,' RO204 - 4' RODIME 204 DRIVE BYTE CR:,LF:,' MP1304 - 5' MICROPOLIS 1304 DRIVE BYTE CR:,LF:,' AT3046 - 6' ATASI 3046 DRIVE * * ADD NEW DRIVE MESSAGES HERE * BYTE CR:,LF:,'USER DEFINE - 7' USER DEFINE BYTE CR:,LF:,'SELECT DRIVE (0)?',:FF * QRYK BYTE CR:,LF:,'CYLINDERS,SECTORS,HEADS,AND 5 INITIALIZATION ' BYTE 'PARAMETERS ?' BYTE CR:,LF:,'ALL ENTRIES IN HEX AND IN ABOVE ORDER.',CR:,LF:,:FF * QRYM1 BYTE CR:,LF:,'ANY BAD TRACKS FROM MANUFACTURER (Y/[N])?',:FF * QRYM2 BYTE CR:,LF:,'ENTER CYLINDER NUMBER (DECIMAL)',:FF * QRYM3 BYTE CR:,LF:,'ENTER HEAD NUMBER (DECIMAL)',:FF * QRYM4 BYTE CR:,LF:,'*** EXCESSIVE BAD TRACKS (MAX=50); TRY AGAIN',:FF * ROMSG BYTE CR:,LF:,'RUN OPTIONS [:000]?',CR:,LF:,:FF * UPMSG BYTE CR:,LF:,'PATTERN [:6DB6]?',CR:,LF:,:FF * USEMSG BYTE CR:,LF:,'UNIT SELECT ([0]-3)?',CR:,LF:,:FF * VFYMSG BYTE CR:,LF:,'VERIFY DISK (Y/[N])? ',:FF * TSTMSG BYTE CR:,LF:,'TEST ([A,B,C,D,E],F)?',:FF * TTMSG BYTE CR:,LF:,'ENTER: ' TECH TEST QURY BYTE 'FC,U,C,H,S,IN,LN,DP,OP,CL,CP',CR:,LF:,:FF *  TITL TEST MESSAGES ********************************** * * TEST MESSAGES * ********************************** * ACTWD BYTE '  ACTUAL WORD: ',:FF * ADRCYL BYTE CR:,LF:,'CYL: ',:FF ADRHD BYTE ' HEAD: ',:FF ADRSEC BYTE ' SECT: ',:FF * BDTK BYTE CR:,LF:,'BAD TRACK CYL ',:FF * CRST BYTE 'CONTROLLER STATUS: ',:FF * DRST BYTE CR:,LF:,'DRIVE STATUS: ',:FF * EROACC BYTE CR:,LF:,'ACCUMULATED ERRORS: ',:FF * EROTMSG BYTE 'ERRORS IN THIS TEST: ',:FF * ERR BYTE CR:,LF:,'ERROR: ',:FF * ERRADD BYTE CR:,LF:,'ER AD: ',:FF * ERFOMG BYTE ' (FORMATTER)',:FF * EXWD BYTE CR:,LF:,'EXPECTED WORD: ',:FF * FORMDES BYTE CR:,LF:,'CANNOT SAVE DATA IN FORMATTING!',:FF * FMTM BYTE CR:,LF:,'FORMATTING...',:FF * FMTM1 BYTE CR:,LF:,LF:,'DISK VERIFY IN PROGRESS...',:FF * HD BYTE ' HEAD ',:FF * HLTERR BYTE CR:,LF:,'HALT ON ERROR, PRESS RUN SW TWICE TO CONT.',:FF * JMPCK12 BYTE CR:,LF:,'CHECK JUM1 PER E1-E2, AND RESTART',:FF * JMPCK78 BYTE CR:,LF:,'CHECK JUMPER E7-E8, AND RESTART',:FF * LPMSG BYTE CR:,LF:,'LINE PRINTER TIMED OUT!!!' BYTE CR:,LF:,'GET PRINTER READY...' PMBMSG BYTE CR:,LF:,'KEY IN ANY CHAR TO RESUME...',:FF * NOEOB BYTE CR:,LF:,'NO EOB FROM TCU AT INITIALIZATION. ',:FF * NOGOOD BYTE CR:,LF:,'ERROR: FFFF UNIMPLEMENTED ERROR CODE',CR:,LF:,:FF * PASSMSG BYTE ' PASS: ',:FF * STARS BYTE '****',:FF * TITLE BYTE CR:,LF:,'TCU DIAGNOSTIC/FORMATTER 84-93083-A100',LF:,LF:,CR: BYTE 'THE CONTENTS HEREOF ARE PROPRIETARY',CR:,LF: BYTE 'TO COMPUTER AUTOMATION, INC. ("CA")',CR:,LF: BYTE 'AND SHALL NOT BE REPRODUCED OR USED',CR:,LF: BYTE 'WITHOUT CA"S PRIOR WRITTEN CONSENT.',CR:,LF:,LF: BYTE '(C) COMPUTER AUTOMATION, INC. 1983.',CR:,LF:,:FF * TSTA BYTE 'TEST A',CR:,LF:,:FF * TSTB BYTE 'TEST B',CR:,LF:,:FF * TSTC BYTE 'TEST C',CR:,LF:,:FF * TSTDMSG BYTE 'TEST D',CR:,LF:,:FF * TSTEMSG BYTE 'TEST E',CR:,LF:,:FF * TSTF BYTE 'TEST F',CR:,LF:,:FF * TSTFF BYTE CR:,LF:,:FF EMPTY TEST MES FOR FORMATTER * TSTA1M BYTE CR:,LF:,'ERROR 0 DEVICE NOT PRESENT',CR:,LF:,:FF * TSTA1M1 BYTE CR:,LF:,'ERROR 1 DEVICE NOT READY, CHECK JMP E5-E6',CR:,LF:,:FF * TSTA2M BYTE CR:,LF:,'INITIALIZATION COMPLETED',CR:,LF:,:FF * SMSGA1 BYTE CR:,LF:,'NON-DESTRUCTIVE MODE NOT POSSIBLE,' BYTE ' READ ORIGINAL DATA FAILED.',CR:,LF:,:FF * SMSGA2 BYTE CR:,LF:,'NON-DESTRUCTIVE MODE NOT POSSIBLE,' BYTE ' WRITE ORIGINAL DATA FAILED.',CR:,LF:,:FF * SMSGA3 BYTE CR:,LF:,'NON-DESTRUCTIVE MODE NOT POSSIBLE,' BYTE ' READ VERIFY ORIGINAL DATA FAILED.',CR:,LF:,:FF * SMGA4 BYTE 'CANNOT RUN NON-DESTRUCTIVE ON ' BYTE 'TEST D (SKIPPED)',CR:,LF:,:FF * TITL CRT/TTY TRAP MESSAGES *********************************** * * TRAPS MESSAGES * *********************************** * INMSG BYTE CR:,LF:,LF:,'UNIMPLEMENTED INSTRUTION TRAP',CR:,LF:,:FF * MEMSG BYTE CR:,LF:,LF:,'UNINSTALLED MEMORY TRAP',CR:,LF:,:FF * PFMSG BYTE CR:,LF:,LF:,'POWER FAIL',CR:,LF:,:FF * CHMSG BYTE CR:,LF:,LF:,'CHAR./NUM. EXCEPTION',CR:,LF:,:FF * STMSG BYTE CR:,LF:,LF:,'STACK OVERFLOW',CR:,LF:,:FF * USMSG BYTE CR:,LF:,LF:,'USER TRAP',CR:,LF:,:FF * SYMSG BYTE CR:,LF:,LF:,'SYSTEM TRAP',CR:,LF:,:FF * ARMSG BYTE CR:,LF:,LF:,'ARITHMETIC TRAP',CR:,LF:,:FF * UNITMSG BYTE ' UNIT: ',:FF END JG:0 O0SEGMENTBLANK oKDEBUG4 im MACRO (F510) @mTCU DIAGNOSTIC/FORMATTERm - REV:%-8,REV:&:FFit &"  g 0p PE  ? zE1Aߨ utsr cl*1e-a mߒ ߑ@ <KAB\- lo n< o@kjerq 0n,p]Q e __^^^]m ˿D1Cvt Y No71 ο8 Gο4y % 1  Gy!{ 3 1M = to8 ml37pAο GyƃA\U W ?-@K yu 1Ms t po;ml7pc'`1 `XBV+UI2N@I K+To <  ?1Nߓ-u -rmmkjg 7gU~  x 2 DQ1SP rOp F D Tia n]ZV y T M⠄@A 0"%K l@ Aߏka8l ^Z ZT? % {$1L  pnm7q :S </ F T  W ((qqPo Y NjߒpP N [lYAYU? ~ !+%1  !=j hg - Z yLE⟿ IR1" oNx F Aj@ B kAn _:QB@ EK w31M ߑ snl k7p @? <Ń _6 ^t2H삡 k9e TH^U?ߌiX Syߑo u_6 rN! @GkރxW T D F pP"S!B F+J ٞwԢצˀ e AݿŢ B CǢ D&o6 ͞ E F +W6⪀@ID  êBk@r ?6Aߎ  V D   EbH?o S  a F mh   z Q -N > 4   6@ Ȁ@kìNqG k ! ^TN1G 0 LKK ~e O pqrst-?t o@Q7 ſŞ3 Fi悽 0 Wa ~ EU+T M0  eGC g;87 5 V ?  y   @ Q@k ØN1G C @@ 4 @y n N1Gllg ˟}_Ãg0  ,FNm  Do6G  < j5 45 @ `@-k   N1G S?H O   L89<  O ߣ ߟ ߛ M L K J R 5 ÝN1G n  he  ÊN1G X P  vN1G Cn >ɀƀ ¿8 113ߊ E zs b ևֿ  ӃӇ ono 3͢@  e@,k U VT㻄ă  N1G GM ߠh  4?H  O?@, W  a5 ߢu  f cöN1G^ YZGSVQj RRR QQ7˂3 j DDߑ   \ UH ܇o 6G !  g  @ q@`k  „  9N1G 3C Ā  !S  U $(L  5 y  „ dbbú N1Gaa[ [C YYTDƀĀ  LLƐ ˂j33 E,04  a?  o6Gq &  d@ Y@]   MN1GH3    &4  O -L  5 ߢs p  N1c^ d bUX ASA M FC@  k < mon 0 Ƣ ۄڄ " N1Ϳў ȀЂʇʿʞ  ˃ſſjÿ  I 梼DXA @SA ;M  /-kE  ,  a? 5-   o6ÿm՟th!B   [@ b ݿZ ۿۂۇ׿ڢX@Kk  фЄ=N1 GC8ľ= ICޭk 14 6п'= Y N  q m  N1G So@ +4 O !   l {u怂G   ăaò㲿[ðN N ǫNN  7>C<1 SQ73 G?mno  S ?  ' ÞN1G   D a`  Y 5  l  ‡¿€@nq  j`xôֵN; )'`ă  RN1GQL GL EE ߈D 9G O  o   E  ׂ ƿUŇ  m  _,   , R,  ,  ,, ￞ Y N , 3S -  ?  m? o  n  z_j d ] i ,  ,  ,,,+,-,.F B, >, : 4, 1,,  G ߃u s 凫j1A  n1  ) ) ), )   Ć    ! f 9  - y  ឰNqG އ׃^hp Ꞣ + - .قɿV  "Þ ! ?GG9:A  E: 濬濫QM ~Qp 6sHg vBz`        G ,,{, y w6ĂĂ)6Ă h      x 9  xxxsqsqs qjjjk   |{ #yx _vu ^sr ,pon ƌI  C Uƒr  ǡ ⠂ @K+kÍ fnjÆ_^ ,  z  ro ;FŽ@ƌ Azކ kpd d  Rވ P ކqބvq   a rS C ߺ{ ʢ܃  m6{z ¿xп̓ F ÿZ E !B; 40 t x}/O 6ÿ c + +   bV?o   q  qÛl Ùgg1@╀@ H@CB kx \[Z8  y /6ȿ@< x  G GD p GsGB dž gBD   'm 'o k 'DfC  n 'I'Ju 5  o6     ¿ e N  S-c95 8? ``lo6l  jdf_ a^[T\ ]]] \ ނI  CE>@ =:3; <<=  ; x  ޅ}ބ{zy  {zz / 0   ?t ? p   ?j ?f  ?b ?^ ?Z   0 FE< z|! !!!&!.!7222 xmmmm ABCDE ABCDE  u} u11@u1 1@11 @vv@ @ @??= = HEAD BAD TRAC KS: CYLINDER  DEVI CE ADDRESS (01-1F[14])? END OF BAD TRACKS LIS T FROM MANUFACTURER.  FUNCTION SELECT ([D],F ,T)? FORMAT INTERLE AVING FACTOR (0-9[0])?  NON-DESTRUCTIVE MODE (Y/[N])? ENTER INITIA LIZATION PARAMETERS IN H EX  BAD TRACK LIST  FROM MANUFACTURER:  CM5412 - 0 ET554 0 - 1 XT1065 -  2 XT1140 - 3  RO204 - 4 MP130 4 - 5 AT3046 -  6 USER DEFINE - 7 SE LECT DRIVE (0)? CYLIND ERS,SECTORS,HEADS,AND 5  INITIALIZATION PARAMETE RS ? ALL ENTRIES IN HEX AND IN ABOVE ORDER.  ANY BAD TRACKS FROM MA NUFACTURER (Y/[N])? EN TER CYLINDER NUMBER (DEC IMAL) ENTER HEAD NUMBE R (DECIMAL) *** EXCESS IVE BAD TRACKS (MAX=50); TRY AGAIN RUN OPTION S [:000]? PATTERN [: 6DB6]? UNIT SELECT  ([0]-3)? VERIFY DIS K (Y/[N])? TEST ([A,B ,C,D,E],F)? ENTER: FC ,U,C,H,S,IN,LN,DP,OP,CL, CP ACTUAL WORD:  CYL: HEAD: S ECT: BAD TRACK CYL CONTROLLER STATUS:  DRIVE STATUS: AC CUMULATED ERRORS: ERRO RS IN THIS TEST: ERRO R: ER AD: (FORM ATTER) EXPECTED WORD: CANNOT SAVE DATA I N FORMATTING! FORMATTI NG... DISK VERIFY IN  PROGRESS... HEAD  HALT ON ERROR, PRESS R UN SW TWICE TO CONT.  CHECK JUMPER E1-E2, AND  RESTART CHECK JUMPER E 7-E8, AND RESTART LINE PRINTER TIMED OUT!!!  GET PRINTER READY... KE Y IN ANY CHAR TO RESUME. .. NO EOB FRO5 M TCU AT INITIALIZATION. ERRO R: FFFF UNIMPLEMENT ED ERROR CODE PASS : **** TCU DIAGNOST IC/FORMATTER 84-93083-A1 00 THE CONTENTS HEREO F ARE PROPRIETARY TO C OMPUTER AUTOMATION, INC. ("CA") AND SHALL NOT  BE REPRODUCED OR USED  WITHOUT CA"S PRIOR WRITT EN CONSENT. (C) COMPUT ER AUTOMATION, INC. 1983 . TEST A TEST B   TEST C TEST D TEST E TEST F ER ROR 0 DEVICE NOT PRESE NT ERROR 1 DEVICE NOT READY, CHECK JMP E5 -E6 INITIALIZATION C OMPLETED NON-DESTRU CTIVE MODE NOT POSSIBLE, READ ORIGINAL DATA FAIL ED. NON-DESTRUCTIVE  MODE NOT POSSIBLE, WRITE ORIGINAL DATA FAILED.  NON-DESTRUCTIVE MODE NOT POSSIBLE, READ VERI FY ORIGINAL DATA FAILED. CANNOT RUN NON-DESTR UCTIVE ON TEST D (SKIPPE D) UNIMPLEMENTED I NSTRUTION TRAP UNI NSTALLED MEMORY TRAP  POWER FAIL CHAR. /NUM. EXCEPTION STA CK OVERFLOW USER TR AP SYSTEM TRAP  ARITHMETIC TRAP  UNIT: IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII//AS UF=DF0 MACRO TCU(E) LINK DF1/OS::.SYS=UF/TCU.OBJ(AB=0)+SF/DEBUGS(UL,AB=2500) IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII6 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII7 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII8 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII9 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII: IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII< IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF282090921361200840217163152 840217163152 TTCU VOLTRANSPORT CONTROL UNIT DIAG/FORM SOURCE DISK (84-93083-01 A100) F08301