IMD 1.16: 2/09/2008 9:08:26 84-93919-01 b000 f91901 hcmc test program source disk (nm4)    @0|)wwЀЀtQql)  " }gA `_l M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF182060708572704820607085727 820607085727@F91901 VOLHCMC TEST PROGRAM SOURCE DISK (NM4) 84-93919-01-B0   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_l M@iGyy GGG`HZ@ b G`^Y e IQ BBp@;:9 :7P@ G:پN 8!0. * C'xC# b# }B @0DAJL w+™ЀЀΖQA1"   i ž} š} @EEFF)DEۄF8 џ} ԟ} ̟} * `jUBBI,v BI, # @ G9H@pܾrCHC C GTq` Lg"gEXC P+s=胾P+c fQN p $Rxnj  ޔniZ ތ⊞ } }HGž Ÿ@ALS)"$ C k20j.h( +$`%ꂜ\1 !M' y %'+os慾)sY ed|{ @8 o O m J K i gN )V% t%sLn`"E F. F„ D>) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYS"iwvc Bc A@6<# Ic B# gIjHc r TITL NM4 HCMC DISK DIAGNOSTIC/FORMATTER 93919-10B0 TITL TITLE PAGE * * * * NM-4 HIGH/MEDIMUM CAPACITY DISK * * * DIAGNOSTIC/FORMATTER * * * 84-93919-10-B0 * * * * COPYRIGHT 1982 COMPUTER AUTOMATION INC. * * TITL REVISION HISTORY ****************************** * * REVISION HISTORY * ****************************** * * REVISION ISSUE DATE COMMENTS * -------- ---------- -------- * * A0 ? ORIGINAL RELEASE * * A1 ? HISTORY UNKNOWN * * A2 JULY 1979 UPDATED * * B0  APRIL 1982 UPDATED BY * ROBERT ROBINSON * REV: EQU 'B0' LATEST REVISION TITL LINKER INFORMATION ****************************** * * LINKER INFORMATION * ****************************** * EXTR DEBUG4 LINK TO DEBUG NAM G:0 LINK ADDRESS * OBJNOTE ' HCMCDIAG.OBJ - REV. ',REV:%-8,REV:&:FF TITL DIAGNOSTIC/FORMATTER INFORMATION ****************************** * * DIAGNOSTIC/FORMATTER INFORMATION * ****************************** * * * CONSISTS OF: * * FORMATTERER (FORMATS IN STANDARD CAI FORMAT) ** * DIAGNOSTIC: * TEST A - BASIC STATUS, TIO, INTERRUPTS TEST * TEST B - SEEK/RD  REGARDLESS TEST * TEST C - FORMAT TEST * TEST D - SHORT WORD TRANSFER TEST * TEST E - RANDOM WRITE/VERIFY READ TEST * TEST F - INITIALIZE TEST * TEST G - FORCED ERRORS TEST * TEST H - TIO/SEEK/RD REG UPDATE TEST + *  - HIGH MEMORY TEST + * - INTERRUPT LEVELS TEST * TEST I - FULL WORD TRANSFER TEST ** * TECH TEST (SCOPING LOOPS) ** * OPTIONS: * * BIT HEX * * 0 :01 INCLUDE BUFFER DUMP IN ERROR REPORTS * WHERE APPLICABLE * * 1 :02 SUPPRESS ERROR REPORTS * * 2 :04 OUTPUT ERROR TALLIES AT END OF * EACH TEST * * 3 :08 RUN CONTINUOUSLY * * 4 :10 HALT ON HARD ERROR * * 5 :20 LINE PRINTER * ** * SENSE SWITCH: * * SET - SUPPRESS OUTPUT OF PASS NUMBER, * UNIT NUMBER AND TEST TITLES * ****************************** TITL EQUATES ******************************* * * EQUATES * ******************************* * * IOB EQUATES * OP EQU 0 0P CODE, CIOB. US EQU 1 UNIT SELECT, CIOB. CS EQU 2 CYLINDER SELECT. HS EQU 3 HEAD SELECT. SSS EQU 4 SECTOR SELECT WC EQU 5 WORD COUNT AND SKIP OP. MA EQU 6 MEMORY ADDRESS. IN EQU 7 INTERRUPT ADDRESS/ENABLE. NB EQU 8 NEXT IOB ADDRESS. XF EQU 9 WORDS TRANSFERRED CST EQU 10 PME STATUS DST EQU 11 DRIVE STATUS * * OP CODES EQUATES * TIO EQU :0000 TEST I/O FRMT EQU :0001 FORMAT WRTDAT EQU :0002 WRITE WORD. RDDAT EQU :0004 READ WORD. RDRG EQU :0006 READ REGARDLESS RDVER EQU :0008 READ VERIFY. SEEK EQU :0009 SEEK ONLY. UPDATE EQU :0080 UPDATE DISK ADDRESS * * GENERAL EQUATES * SMDA EQU :14 STD DEVICE ADDRESS DTTYDA EQU :7C DIO TTY DEVICE ADDRESS (SHIFTED RIGHT) DLPDA EQU :7F LP DEVICE ADDRESS (DIO) PAT EQU :6DB6 DEFAULT PATTERN MEMINC EQU :400 1K MEMORY INCREMENT LF: EQU 10 LINE FEED CR: EQU 13 CARRIAGE RETURN CRLF: EQU CR:%8;LF: CARRIAGE RETURN/LINE FEED BCKAR: EQU :5F BACK ARROW UPARR: EQU :5E UP ARROW UNITS EQU 4 MAXIMUM NUMBER OF UNITS UNDER TEST 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 JMP *$+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 MEMORY 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 SERVICE ROUTINE WORD USETR: ADDRESS OF ROUTINE * SYSTR 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 PROGRAM STARTUP ****************************** * * PROGRAM START UP * * :200 STANDARD ENTRY POINT * :201 RESTART ENTRY POINT * * RESET STATUS REG. * RESET SENSE SWITCH * RESET CONSOLE INT. * RESET CDR DISPLAY * INITIALIZE HCDC CONTROLLER * PRINT TITLE * ENABLE CONSOLE INTERRUPT * ****************************** * ABS :200 SMD EQU $ START OF DIAGNOSTIC G:0 EQU $ DEBUG LINK * * STANDARD ENTRY POINT * ENT1 JMP ENT1A STD ENTRY POINT * * RESTART ENTRY POINT * ENT2 JMP ENT2A RESTART ENTRY PT * * RESET DEFAULTS * ENT1A EQU $ COPY =-PRMSZ2,A PRESET JST MOVE ALL QUERY RESPONSES WORD PRAMSX WORD PRAMSY ENT2A COPY =0,A SET A TO ZERO COPY A,S RESET STATUS REG. OUT A,0 RESET SENSE SWITCH OUT A,1 RESET CONSOLE INT. SELP A,4 RESET CDR DISPLAY COPY A,LPFLAG RESET LP FLAG JST MSGA PRINT TITLE WORD TITLE ENT2B EQU $ COPY =-PRMSIZ,A JST MOVE RESET Y-PARAMETERS WORD PRAMS WORD PRAMSY SBIT 4,S ENABLE CONSOLE INT. SBIT 8,S ENABLE INTS. TITL QUERIES (DISK SELECTION) ****************************** * * DISK SELECTION * * QUERY: * * HIGH OR MEDIMUM? * * SELECTION: * H - HIGH, * M - MEDIMUM * INITIAL DEFAULT IS 'H' * ****************************** * QERY10 EQU $ COPY =0,A RESET LP FLAG COPY A,LPFLAG STORE FLAG COPY DISK,A GET PREVIOUS VALUE COPY A,DISKY STORE AS DEFAULT JST MSGA OUTPUT QUERY WORD QERM10 COPY =0,X RESET INUPT FLAG QERY11 JST IKB GET RESPONSE JST CHRIN DO SPECIAL CHAR. CHECK JMP QERY12 CR JMP QERY13 # JMP QERY10 _ JMP QERY10 ^ JMP QERY10 , JNE X,QERY10 IF PREVIOUS INPUT, ERROR CLSN A,='H' IS IT HIGH? COPY A,X YES, SET INPUT CLSN A,='M' IS IT MEDIUM? COPY A,X YES, SET INPUT JNE X,QERY11 IF INPUT, GET TERMINATOR COPY =1,X SET ERROR INPUT JMP QERY11 GET TERMINATOR QERY12 COPY =0,A RESET FLAG JEQ X,QERY20 YES, JUMP CLSN X,='H' HIGH? COPY =HCPX,A GET GET HIGH TABLE ADD. CLSN X,='M' MEDIUM? COPY =MCP,A YES, GET MEDIUM TABLE ADD. JEQ A,QERY10 IF INCORRECT INPUT, ERROR COPY X,DISKY STORE VALUE COPY A,$+3 SET TABLE ADD. COPY =-MCSIZ,A MOVE IN PARAMETERS JST MOVE DO IT WORD MCP WORD HCP JMP QERY20 CONTINUE QERY13 JNE X,QERY10 CAN'T JMP QUERND CAN * LPOOL TITL QUERIES (FUNCTION SELECTION) ****************************** * * FUNCTION SELECTION * * QUERY: * DIAG, FMATTER OR TECH TEST (D,F,T)? * * SELECTION: * D - DIAGNOSTIC, * F - FORMATTER, * T - TECH TEST * INITIAL DEFAULT IS 'D' * ****************************** * QERY20 EQU $ COPY MODE,A GET ORIGINAL VALUE COPY A,MODEY STORE AS DEFAULT JST MSGA OUTPUT QUERY WORD QERM20 COPY =0,X RESET INPUT FLAG QERY21 JST IKB GET RESPONSE JST CHRIN DO SPECIAL CHAR. CHECK JMP QERY22 CR JMP QERY23 # JMP QERY20 _ JMP QERY24 ^ JMP QERY20 , JNE X,QERY20 IF PREVIOUS INPUT, ERROR CLSN A,='F' FORMATTER? COPY A,X YES, SET INPUT CLSN A,='D' DIAGNOSTIC? COPY A,X YES, SET INPUT CLSN A,='T' TECH TEST? COPY A,X YES, SET INPUT JNE X,QERY21 GET TERMINATOR IF ONE OF THE ABOVE COPY =1,X ELSE SET ERROR INPUT JMP QERY21 GET TERMINATOR QERY22 JEQ X,$+4 JUMP IF DEFAULT CLSN X,=1 ERROR INPUT? JMP QERY20 YES, TRY AGAIN COPY X,MODEY ELSE SET INPUT JMP QERY30 GO ON QERY23 JNE X,QERY20 CAN'T   JMP QUERND CAN QERY24 JNE X,QERY20 CAN'T JMP QERY10 CAN * LPOOL TITL QUERIES (DEVICE ADDRESS SELECTION) ***************************** * * DEVICE ADDRESS SELECTION * * QUERY: * DEV AD (:14)?: * * SELECTION: * :01 - :1F * INITIAL DEFAULT IS ':14' * ***************************** * QERY30 EQU $ COPY DEVAD,A GET ORIGINAL VALUE COPY A,DEVADY STORE AS DEFAULT JST MSGA OUTPUT QUERY WORD QERM30 COPY =0,A RESET INPUT FLAG COPY A,TEMP1 STORE IT JST IHEX GET RESPONSE JNE X,$+4 IF NUMERIC, OK COPY IDCTM3,X GET INPUT COUNT JEQ X,QERY31 IF NONE, OK JMP QERY30 ELSE '0' IS BAD COPY X,DEVADY SAVE IT SHIFT X,RO,5 DO RANGE CHECK JNE X,QERY30 BAD IMS TEMP1 SET INPUT FLAG QERY31 JST CHRIN DO SPECIAL CHAR. CHECK JMP QERY32 CR JMP QERY33 # JMP QERY30 _ JMP QERY34 ^ JMP QERY30 , JMP QERY30 ANYTHING ELSE QERY32 JST TESTCK WHICH WAY? JMP QERY50 FORMAT JMP QERY50 TECH TEST JMP QERY40 DIAGNOSTIC QERY33 COPY TEMP1,A GET INPUT FLAG JNE A,QERY30 CAN'T JMP QUERND CAN QERY34 COPY TEMP1,A GET INPUT FLAG JNE A,QERY30 CAN'T JMP QERY20 CAN * LPOOL TITL QUERIES (TEST SELECTION) ****************************** * * TEST SELECTION * * QUERY: * TSTS (A-H)? * * SELECTION: * A - SELECTS TEST A, * B - SELECTS TEST B, *  C - SELECTS TEST C, * D - SELECTS TEST D, * E - SELECTS TEST E, * F - SELECTS TEST F, * G - SELECTS TEST G, * H - SELECTS TEST H, * I - SELECTS TEST I * INITIAL DEFAULT IS 'A' THROUGH 'H' * ****************************** * QERY40 EQU $ COPY =0,A RESET INPUT FLAG COPY A,TEMP2 STORE FLAG COPY =-TSTSIZ,A MOVE IN TEST PARAMETERS JST MOVE DO IT WORD TESTS WORD TESTSY JST MSGA OUTPUT QUERY WORD QERM40 COPY =-TSTSIZ+1,A RESET COUNT OF INPUTS -(TSTSIZ-1) COPY A,TEMP1 STORE COUNT QERY41 JST IDEC GET INPUT JNE X,QERY40 NUMERIC IS WRONG JST CHRIN DO SPECIAL CHAR. CHECK JMP QERY50 CR JMP QERY42 # JMP QERY40 _ JMP QERY43 ^ JMP QERY41 , CSK A,='I' DO RANGE CHECK CSK A,='A' 'A' - 'I' JMP QERY40 BAD NOP  SUB ='A',A SUBTRACT OFFSET IMS TEMP2 SET INPUT FLAG ADD =TSTABL,A ADD TEST TABLE OFFSET COPY A,X PUT INTO X-REG. COPY 0(X),X GET ACTUAL TEST ADD. COPY TEMP1,A GET NEGATIVE TABLE POSITION ADD =TESTSY+TSTSIZ-1,A ADD IN POSITIVE TABLE ADD. EXCH A,X A = TEST ADD., X = TABLE ADD. COPY A,0(X) STORE TEST ADD. COPY =-1,A SET 'END-OF'TABLE' CHAR. COPY A,1(X) STORE IT IMS TEMP1 INCREMENT INPUT COUNT JMP QERY41 STILL MORE JMP QERY40 TOO MANY QERY42 COPY TEMP2,A GET INPUT FLAG JNE A,QERY40 CAN'T JMP QUERND CAN QERY43 COPY TEMP2,A GET INPUT FLAG JNE A,QERY40 CAN'T JMP QERY30 CAN * LPOOL TITL QUERIES (NUMBER OF CYLINDERS) ****************************** * * NUMBER OF CYLINDERS * * QUERY: * CYLS? * * SELECTION: * TOTAL NUMBER OF CYLINDERS, * STARTING CYLINDER NUMBER, - MUST BE < TOTAL NO. OF CYLS. * ENDING CYLINDER NUMBER - MUST BE > START. CYL. NO. AND * MUST BE < TOTAL NO. OF CYLS. * INITIAL DEFAULT IS THE INITIAL DRIVE PARAMETERS * ****************************** * QERY50 EQU $ COPY =0,A RESET INPUT FLAG COPY A,TEMP2 STORE FLAG COPY =-3,A MOVE IN JST MOVE DEFAULT PARAMETERS WORD CYLS WORD CYLSY COPY SHORT,A GET PREVIOUS SHORT VALUE COPY A,SHORTY STORE AS DEFAULT JST M SGA OUTPUT QUERY WORD QERM50 JST IDEC GET INPUT JEQ X,QERY53 TERMINATOR OR ZERO INPUT IMS TEMP2 SET INPUT FLAG COPY X,CYLSY STORE INPUT COPY =0,A STORE 0 IN STARTING CYL. COPY A,SCYLY TENTATIVELY SUB =1,X SET TOTAL-1 IN ENDING CYL. COPY X,ECYLY TENTATIVELY COPY IDCTM2,A GET TERMINATOR CHAR. CLSN A,=',' WAS IT A COMMA? JMP QERY54 IF SO, GET STARTING CYL. NO. QERY52 COPY IDCTM2,A GET TERM. CHAR. JST CHRIN DO SPECIAL CHAR. CHECK JMP QERY60 CR JMP QERY57 # JMP QERY50 _ JMP QERY55 ^ JMP QERY50 COMMA JMP QERY50 ANYTHING ELSE IS BAD QERY53 COPY IDCTM3,A GET ACTUAL INPUT COUNT JEQ A,QERY52 IF ZERO, CHECK TERMINATOR JMP QERY50 OTHERWISE, ERROR QERY54 IMS SHORTY BUMP SHORT TEST FLAG JST IDEC GET STARTING CYL. NO COPY X,A SAVE IT CSK A,ECYLY DO RANGE CHECK JMP $+2 MUST BE 0 - (TOTAL CYLS.-1) JMP QERY50 OUT OF RANGE COPY A,SCYLY STORE STARTING CYLINDER NO. COPY A,ECYLY ASSUME IT'S ALSO ENDING CYL. NO. COPY IDCTM2,A GET TERMINATOR CLSN A,=',' IS IT A COMMA? JMP QERY56 YES, GET ENDING CYL. NO. JMP QERY52 NO, CHECK FOR TERMINATOR QERY55 COPY TEMP2,A GET INPUT FLAG JNE A,QERY50 ILLEGAL TO JUMP BACK IF INPUT JST TESTCK WHICH WAY? JMP QERY30 FORMAT JMP QERY30 TECH TEST JMP QERY40 DIAGNOSTIC QERY56 JST IDEC GET ENDING CYL. NO. COPY X,A SAVE IT CSK A,CYLSY MUST BE LESS THAN TOTAL CYLS. JMP $+3 IF SO, CONTINUE NOP NOP JMP QERY50 OTHERWISE, ERROR CSK A,SCYLY MUST BE GREATER THAN STARTING CYL. NO. JMP QERY50 IF NOT, ERROR NOP COPY X,ECYLY STORE ENDING CYL. NO. JMP QERY52 CHECK TERMINATOR QERY57 COPY TEMP2,A GET INPUT FLAG JEQ A,$+2 OK TO DO SO JMP QERY50 ILLEGAL TO DEFAULT IF INPUT JMP QUERND OK * LPOOL TITL QUERIES (SHORT TEST-CYLINDER) ****************************** * * SHORT TEST-CYLINDER * * QUERY: * SHORT TEST-CYLS? * * SELECTION: * NUMBER OF CYLINDERS (MUST BE < 1/2 OF TOTAL NO. OF CYLS.) * TO BE TESTED AT BEGINING AND END OF DISK FOR SHORT TESTING. * INITIAL DEFAULT IS 0. * ****************************** * QERY60 EQU $ JST TESTCK WHICH WAY? JMP QERY70 FORMAT JMP QERY70 TECH TEST COPY =0,A RESET INPUT FLAG COPY A,TEMP2 STORE IT COPY SHORTC,A GET DEFAULT VALUE COPY A,SHORTCY STORE IT JST MSGA OUTPUT QUERY WORD QERM60 JST IDEC GET RESPONSE JEQ X,QERY63 IF ZERO, SEE WHY SUB =1,X DEC. NUMBER COPY ECYLY,A GET ENDING CYL. NO. SUB SCYLY,A GET TOTAL NUMBER OF CYLS. SHIFT A,RO,1 DIVED TOTAL BY HALF CSK A,X COMPARE TO SHORT TEST CYLINDERS JMP QERY60 CAN'T DO NOP ADD =1,X RESTORE NUMBER QERY61 COPY X,SHORTCY STORE RESULT IMS TEMP2 SET INPUT FLAG QERY62 COPY IDCTM2,A GET TERM. CHAR. JST CHRIN DO SPECIAL CHAR. CHECK JMP QERY70 CR JMP QERY64 # JMP QERY60 _ JMP QERY65 ^ JMP QERY60 , JMP QERY60 ANYTHING ELSE QERY63 COPY IDCTM3,A GET INPUT COUNT JEQ A,QERY62 CHECK TERMINATOR JMP QERY61 ELSE INPUT = 0 QERY64 COPY TEMP2,A GET INPUT FLAG JNE A,QERY60 CAN'T JMP QUERND CAN QERY65 COPY TEMP2,A GET INPUT FLAG JNE A,QERY60 CAN'T JMP QERY50 CAN * LPOOL TITL QUERIES (NUMBER OF HEADS) ****************************** * * NUMBER OF HEADS * * QUERY: * HDS? * * SELECTION: * TOTAL NUMBER OF HEADS, * STARTING HEAD NUMBER, - MUST BE < TOTAL HEAD NO. * ENDING HEAD NUMBER - MUST BE > START. HEAD NO. AND * MUST BE < END. HEA D NO. * INITIAL DEFAULT IS THE SELECTED DRIVE PARAMETERS * ****************************** * QERY70 EQU $ COPY =0,A SET A TO ZERO COPY A,TEMP1 RESET INTERMEDIATE SHORT TEST FLAG COPY A,TEMP2 RESET INPUT FLAG COPY =-3,A CLEAR HEADS JST MOVE DO IT WORD HDS WORD HDSY JST MSGA OUTPUT QUERY WORD QERM70 JST IDEC GET INPUT JEQ X,QERY73 TERMINATOR OR ZERO INPUT IMS TEMP2 SET INPUT FLAG COPY X,HDSY STORE NUMBER OF HEADS COPY =0,A SET STARTING HEAD TO COPY A,SHDY ZERO, TENTATIVELY SUB =1,X SET ENDING HEAD TO (HDS-1) COPY X,EHDY TENTATIVELY COPY IDCTM2,A GET TERMINATOR CLSN A,=',' IS IT A COMMA? JMP QERY74 YES, GET STARTING HEAD NUMBER QERY72 COPY IDCTM2,A GET TERM. CHAR. JST CHRIN DO SPECIAL CHAR. CHECK JMP QERY78 CR JMP QERY75 # JMP QERY70 _ JMP QERY76 ^ JMP QERY70 COMMA JMP QERY70 ANYTHING ELSE QERY73 COPY IDCTM3,A GET ACTUAL INPUT COUNT JEQ A,QERY72 IF ZERO, CHECK TERMINATOR JMP QERY70 ELSE INPUT =0 (ERROR) QERY74 IMS TEMP1 BUMP SHORT TEST FLAG JST IDEC GET STARTING HEAD NUMBER COPY X,A DO RANGE CHECK CSK A,EHDY MUST BE BETWEEN 0 AND (HDS-1) JMP $+2 JMP QERY70 RANGE ERROR COPY A,SHDY SOTRE STARTING HEAD NUMBER COPY A,EHDY ASSUME ENDING HEAD ALSO COPY IDCTM2,A CHECK TERMINATOR CLSN A,=',' COMMA? JMP QERY77 YES, GET ENDING HEAD NUMBER JMP QERY72 NO, CHECK TERMINATOR QERY75 COPY TEMP2,A GET INPUT FLAG JNE A,QERY70 CAN'T JMP QUERND CAN QERY76 COPY TEMP2,A GET INPUT FLAG JNE A,QERY70 CAN'T JST TESTCK WHICH WAY? JMP QERY50 FORMAT JMP QERY50 TECH TEST JMP QERY60 DIAGNOSTIC QERY77 JST IDEC GET ENDING HEAD NUMBER COPY X,A DO RANGE CHECK CSK A,HDSY MUST BE LESS THAN TOTAL JMP $+3 NOP JMP QERY70 RANGE ERROR CSK A,SHDY MUST NOT BE LESS THAN JMP QERY70 STARTING HEAD NUMBER NOP COPY A,EHDY STORE ENDING HEAD NUMBER JMP QERY72 CHECK TERMINATOR QERY78 COPY TEMP1,A GET INTERMEDIATE SHORT TEST FLAG ADD SHORTY,A ADD SHORT TEST FLAG COPY A,SHORTY STORE NEW SHORT TEST FLAG JMP QERY80 NEXT QUERY * LPOOL TITL QUERIES (SECTORS PER TRACK) ****************************** * * SECTORS PER TRACK * * QUERY: * SECTORS/TRACKS? * * SELECTION * TOTAL NUMBER OF SECTORS PER TRACK * INITIAL DEFAULT IS THE SELECTED DRIVE PARAMETERS. * ****************************** * QERY80 EQU $ COPY =0,A RESET INPUT FLAG COPY A,TEMP1 STORE FLAG COPY =-3,A MOVE IN PARAMETERS JST MOVE DO IT WORD SECS WORD SECSY JST MSGA OUTPUT QUERY WORD QERM80 JST IDEC GET INPUT JEQ X,QERY83 TERMINATOR OR ZERO INPUT? IMS TEMP1 SET INPUT FLAG JST TESTCK WHICH ONE? JMP $+5 FORMTTER JMP $+4 TECH TEST COPY X,A SECTS/TRACK MUST BE SUB =56,A .LE. 56 JGT A,QERY80 COPY X,SECSY SAVE SECTORS/TRACKS COPY =0,A FIRST SECTOR = 0 COPY A,SSECY SET IT SUB =1,X COPY X,ESECY LAST SECTOR = (SECS-1) QERY82 COPY IDCTM2,A GET TERM. CHAR. JST CHRIN CHECK TERMINATOR JMP QERY90 CR JMP QERY84 # JMP QERY80 _ JMP QERY85 ^ JMP QERY80 , JMP QERY80 ANYTHING ELSE QERY83 COPY IDCTM3,A GET ACTUAL INPUT COUNT JEQ A,QERY82 IF ZERO, CHECK TERMINATOR JMP QERY80 ELSE, INPUT = 0 (ERROR) QERY84 COPY TEMP1,A GET INPUT FLAG JNE A,QERY80 CAN'T JMP QUERND CAN QERY85 COPY TEMP1,A GET INPUT FLAG JNE A,QERY80 CAN'T JMP QERY70 CAN * LPOOL TITL QUERIES (WORDS PER SECTOR) ****************************** * * WORD PER SECTOR * * QUERY: * WORDS/SECTOR (256)? * *  SELECTION: * TOTAL NUMBER OF WORDS PER SECTOR * INITIAL DEFAULT IS '256' * ****************************** * QERY90 EQU $ COPY =0,A SET A TO ZERO COPY A,TEMP1 RESET INPUT FLAG COPY WDS,A GET ORIGINAL DEFAULT COPY A,WDSY SET AS DEFAULT JST MSGA OUTPUT QUERY WORD QERM90 JST IDEC GET INPUT JEQ X,QERY92 TERMINATOR OR ZERO INPUT? IMS TEMP1 SET INPUT FLAG JST TESTCK WHICH ONE? JMP $+5 FORMATTER JMP $+4 TECH TEST COPY X,A WDS/SEC MUST BE SUB =256,A .LE. 256 JGT A,QERY90 BAD COPY X,WDSY STORE INPUT QERY91 COPY IDCTM2,A GET TERM. CHAR. JST CHRIN DO SPECIAL CHAR. CHECK JMP QERY95 CR JMP QERY93 # JMP QERY90 _ JMP QERY94 ^ JMP QERY90 , JMP QERY90 ANYTHING ELSE QERY92 COPY IDCTM3,A GET ACTUAL INPUT COUNT JEQ A,QERY91 IF ZERO, CHECK TERMINATOR JMP QERY90 ELSE, INPUT = 0 (ERROR) QERY93 COPY TEMP1,A GET INPUT FLAG JNE A,QERY90 CAN'T JMP QUERND CAN QERY94 COPY TEMP1,A GET INPUT FLAG JNE A,QERY90 CAN'T JMP QERY80 CAN QERY95 JST TESTCK WHICH WAY JMP $+2 FORMATTER JMP QUERND TECH TEST COPY DISKY,A WHICH DRIVE CLSN A,='H' HIGH? JMP QERYB0 YES, JUMP JMP QERYA0 NO, ASK BPI UNIT * LPOOL TITL QUERIES (BPI UNIT SELECTION) ****************************** * * BPI UNIT SELECTION * * QUERY: * BPI UNIT (2200)? * * SELECTION: *  RECORDING DENSITY, * 2200 OR 4400 * INITIAL DEFAULT IS 2200. * ****************************** * QERYA0 EQU $ COPY BPIF,A GET ORIGINAL VALUE COPY A,BPIFY STORE AS DEFAULT COPY =0,A RESET INPUT FLAG COPY A,TEMP1 STORE FLAG JST MSGA OUTPUT QUERY WORD QERMA0 JST IDEC GET INPUT JEQ X,QERYA3 CHECK FOR TERMINATOR COPY X,A SAVE IT SUB =2200,A 2200? JEQ A,QERYA1 YES, STORE FLAG SUB =2200,A 4400? JNE A,QERYA0 NO, BAD COPY =2,A BPI FLAG BIT 1 ON QERYA1 COPY A,BPIFY STORE BPI FLAG IMS TEMP1 SET INPUT FLAG QERYA2 COPY IDCTM2,A GET TERM. CHAR. JST CHRIN CHECK FOR SPECIAL CHAR. JMP QERYB0 CR JMP QERYA4 # JMP QERYA0 _ JMP QERYA5 ^ JMP QERYA0 , JMP QERYA0 ANYTHING ELSE QERYA3 COPY IDCTM3,A GET INPUT COUNT JEQ A,QERYA2 IF ZERO, CHECK TERMINATOR JMP QERYA0 ELSE IS BAD QERYA4 COPY TEMP1,A GET INPUT FLAG JNE A,QERYA0 CAN'T JMP QUERND CAN QERYA5 COPY TEMP1,A GET INPUT FLAG JNE A,QERYA0 CAN'T JMP QERY90 CAN * LPOOL TITL QUERIES (USER'S PATTERN) ****************************** * * USER'S PATTERN * * QUERY: * PATN (:6DB6)?: * * SELECTION: * :0000 TO :FFFF * INITIAL DEFAULT IS ':6DB6' * ****************************** * QERYB0 EQU $ JST TESTCK WHICH WAY? JMP QERYF0 FORMATTER JMP QUERND TECH TEST COPY =0,A RESET INPUT FLAG COPY A,TEMP1 STORE FLAG COPY WCPAT,A GET ORIGINAL VALUE COPY A,WCPATY STORE AS DEFAULT JST MSGA OUTPUT QUERY WORD QERMB0 JST IHEX GET INPUT JEQ X,QERYB3 IF ZERO, SEE WHY QERYB1 IMS TEMP1 SET INPUT FLAG COPY X,WCPATY STORE PATTERN QERYB2 JST CHRIN CHECK TERMINATOR JMP QERYC0 CR JMP QERYB4 # JMP QERYB0 _ JMP QERYB5 ^ JMP QERYB0 , JMP QERYB0 ANYTHING ELSE QERYB3 COPY IDCTM3,X LOOK AT ACTUAL INPUT COUNT JEQ X,QERYB2 IF ZERO, CHECK TERMINATOR JMP QERYB1 ELSE STORE INPUT QERYB4 COPY TEMP1,A GET INPUT FLAG JNE A,QERYB0 CAN'T JMP QUERND CAN QERYB5 COPY TEMP1,A GET INPUT FLAG JNE A,QERYB0 CAN'T COPY DISKY,A GET DRIVE CLSN A,='M' MEDIUM? JMP QERYA0 YES, GO BACK ONE JMP QERY90 NO, GO BACK TWO * LPOOL TITL QUERIES (UNIT NUMBERS) ********* ********************* * * UNIT NUMBERS * * QUERY: * UNITS? * * SELECTION: * 0 TO MAXIMUM NUMBER OF TESTABLE *  UNITS (SEE 'UNITS' EQUATE) * INITIAL DEFAULT IS 0 * ****************************** * QERYC0 EQU $ COPY =0,A RESET INPUT FLAG COPY A,TEMP1 STORE FLAG COPY =-UNITS-1,A GET MOVE COUNT -(UNITS+1) JST MOVE SET UNIT SELECTION TO DEFAULT VALUES WORD UN WORD UNY JST MSGA OUTPUT QUERY WORD QERMC0 QERYC1 JST IDEC GET INPUT JEQ X,QERYC4 IF ZERO, SEE WHY COPY X,A DO RANGE CHECK CSK A,=UNITS-1 MUST BE 0 - (UNITS-1) JMP $+2 OK JMP QERYC0 NOT OK QERYC2 COPY TEMP1,A CHECK COUNT CLSN A,=UNITS MAX. UNITS? JMP QERYC0 YES, ERROR ADD =UNY,A GENERATE TABLE ADD. EXCH A,X X = ADDRESS OF UNIT TABLE IN PARAMETER TABLE COPY A,0(X) STORE UNIT NUMBER IN TABLE COPY =-1,A STORE DELIMITER COPY A,1(X) AT NEXT LOCATION IN TABLE IMS TEMP1 BUMP COUNT QERYC3 COPY IDCTM2,A GET TERM. CHAR. JST CHRIN CHECK TERMINATOR JMP QERYD0 CR JMP QERYC5 # JMP QERYC0 _ JMP QERYC6 ^ JMP QERYC1 , JMP QERYC0 ANYTHING ELSE QERYC4 COPY IDCTM3,A GET INPUT COUNT JEQ A,QERYC3 IF ZERO, CHECK TERMINATOR JMP QERYC2 ESLE, STORE IT QERYC5 COPY TEMP1,A GET INPUT COUNT JNE A,QERYC0 CAN'T JMP QUERND CAN QERYC6 COPY TEMP1,A GET INPUT COUNT JNE A,QERYC0 CAN'T JMP QERYB0 CAN * LPOOL TITL QUERIES (DESTRUCTIVE MODE) ****************************** * * DESTRUCTIVE MODE * * QUERY: *  SAVE DATA (Y OR N)? * * SELECTION: * Y - YES, SAVE DATA ON THE DISK * N - NO, DON'T SAVE DATA ON THE DISK *  INITIAL DEFAULT IS 'N' * ****************************** * QERYD0 EQU $ COPY NONDES,A RESET COPY A,NONDEY SAVE FLAG JST MSGA OUTPUT QUERY WORD QERMD0 COPY =0,X RESET INPUT FLAG QERYD1 JST IKB GET RESPONSE JST CHRIN CHECK TERMINATOR JMP QERYD2 CR JMP QERYD3 # JMP QERYD0 _ JMP QERYD4 ^ JMP QERYD0 , JNE X,QERYD0 BEEN HERE BEFORE CLSN A,='Y' IS IT YES? COPY =3,X SET INPUT CLSN A,='N' IS IT NO? COPY =2,X SET INPUT JNE X,QERYD1 GET TERMINATOR COPY =1,X SET ERROR INPUT JMP QERYD1 GET TERMINATOR QERYD2 CLSN X,=1 ERROR JMP QERYD0 YES, ERROR SUB =2,X DEC. FLAG COPY X,NONDEY STORE IT JMP QERYE0 GO ON QERYD3 JNE X,QERYD0 CAN'T JMP QUERND CAN QERYD4 JNE X,QERYD0 CAN'T JMP QERYC0 CAN * LPOOL TITL QUERIES (RUN OPTIONS) ****************************** * * RUN OPTIONS * * QUERY: * RUN OPTIONS (:00)?: * * SELECTION: * :00 TO :3F * INITIAL DEFAULT IS ':00' * * BIT HEX OPTION * --- --- ------ * 0 :01 INCLUDE BUFFER DUMP IN ERROR REPORTS *  WHERE APPLICABLE * * 1 :02 SUPPRESS ERROR REPORTS * * 2 :04 OUTPUT ERROR TALLIES AT END OF EACH TEST * * 3 :08 RUN CONTINUOUSLY * * 4 :10 HALT ON HARD ERROR * * 5 :20 LINE PRINTER * ****************************** * QERYE0 EQU $ COPY CAR,A RESET CAR COPY A,CARY COPY =0,A RESET INPUT FLAG COPY A,TEMP1 STORE FLAG JST MSGA OUTPUT QUERY WORD QERME0 JST IHEX GET RESPONSE JEQ X,QERYE3 IF ZERO, SEE WHY QERYE1 IMS TEMP1 SET INPUT FLAG COPY X,CARY STORE IT SHIFT X,RO,6 :00 - :3F? JNE X,QERYE0 NO, BAD QERYE2 JST CHRIN CHECK TERMINATOR JMP QUERND CR JMP QERYE4 # JMP QERYE0 _ JMP QERYE5 ^ JMP QERYE0 , JMP QERYE0 ANYTHING ELSE QERYE3 COPY IDCTM3,X GET ACTUAL INPUT COUNT JEQ X,QERYE2 IF ZER O, CHECK TERMINATOR JMP QERYE1 ELSE , INPUT = 0 QERYE4 COPY TEMP1,A GET INPUT FLAG JNE A,QERYE0 CAN'T JMP QUERND CAN QERYE5 COPY TEMP1,A GET INPUT FLAG JNE A,QERYE0 CAN'T JMP QERYD0 CAN * LPOOL TITL QUERIES (UNIT TO FORMAT) ****************************** * * UNIT TO FORMAT * * QUERY: * UNIT TO FORMAT? * * SELECTION: * 0 TO MAXIMUM NUMBER OF UNITS * (SEE 'UNITS' EQUATE) * DEFAULT IS '0' * ****************************** * QERYF0 EQU $ COPY =0,A RESET INPUT FLAG COPY A,TEMP1 STORE FLAG COPY A,UCUR SET UNIT TO DEFAULT JST MSGA OUTPUT QUERY WORD QERMF0 JST IDEC GET RESPONSE JEQ X,QERYF3 IF ZERO, SEE WHY QERYF1 IMS TEMP1 SET INPUT FLAG COPY X,A PUT INTO A CSK A,=UNITS-1 DO RANGE CHECK JMP $+2 OK JMP QERYF0 BAD COPY X,UCUR SAVE UNIT NUMBER QERYF2 COPY IDCTM2,A GET TERM. CHAR. JST CHRIN CHECK TERMINATOR JMP QUERND CR JMP QERYF4 # JMP QERYF0 _ JMP QERYF5 ^ JMP QERYF0 , JMP QERYF0 ANYTHING ELSE QERYF3 COPY IDCTM3,A GET ACTUAL INPUT COUNT JEQ A,QERYF2 IF ZERO, CHECK TERMINATOR JMP QERYF1 ELSE, GOOD INPUT QERYF4 COPY TEMP1,A GET INPUT FLAG JNE A,QERYF0 CAN'T JMP QUERND CAN QERYF5 COPY TEMP1,A GET INPUT FLAG JNE A,QERYF0 CAN'T COPY DISKY,A GET DISK TYPE CLSN A,='H' HIGH CAP.? JMP QERY90 YES, GO BACK TWO JMP QERYA0 NO, GO BACK ONE * LPOOL TITL TEST CONTROL DEVICE ADDRESS MODIFICATION) ****************************** * * DEVICE ADDRESS MODIFICATION * FUNCTION EXECUTION * ****************************** * QUERND EQU $ COPY =-PRMSIZ,A MOVE NEW PARAMS IN JST MOVE DO IT WORD PRAMSY WORD PRAMS * * SET OR RESET MCDF * COPY CAR,A GET RUN OPTIONS COPY =0,X SET FOR NO LP TBIT 5,A LINE PRINTER? JF OV,$+2 IF NO, JUMP COPY =1,X SET FOR LP COPY X,ERLPFL STORE FLAG COPY =0,X COPY DISK,A CLSN ='M',A MED CAP? COPY =1,X YES--SET MCDF COPY X,MCDF HIGH CAP--RESET FLAG COPY DEVAD,A GET INPUT DEV AD SHIFT A,LO,3 SHIFT FOR INSERTION INTO  COPY A,TEMP1 I/O INSTRUCTIONS COPY =-DASIZ,A GET NO OF I/O'S COPY A,TEMP2 COPY =DAFRST,A GET TABLE ADDRESS COPY A,TEMP3 DAADO COPY TEMP3,X GET AN I/O INSTRUCTION ADDRESS COPY 0(X),X COPY =-:F9,A "AND" OUT OLD DEV AD AND 0(X),A OR TEMP1,A "OR" IN THE NEW DEV AD COPY A,0(X) REPLACE THE INSTRUCTION IMS TEMP3 BUMP PTR IMS TEMP2 AND COUNT JMP DAADO DO NEXT FIX JST TESTCK WHICH WAY? JMP FMATTR FORMATTER JMP TECH TEST JMP REPASS DIAGNOSTIC * LPOOL TITL TEST CONTROL (TEST EXECUTION) ****************************** * * INCREMENT AND PRINT PASS NUMBER * INCREMENT AND PRINT UNIT NUMBER * EXECUTE TESTS * ****************************** * REPASS EQU $ COPY PASCTR,A GET PASS NUMBER CSK A,=10000 GREATER THAN 10,000? IMS PASCTR BUMP PASS COUNT FOR NEXT PASS NOP JT SS,REUNIT SKIP OUTPUT IF SUPPRESSED JST MSGA WORD PASSMG PRINT PASSNO COPY PASCTR,A GET PASS NUMBER JST ODEC PRINT IT OR '****' REUNIT COPY =UN-1,A PRESET UNIT NO POINTER COPY A,UPTR * * TEST NEXT UNIT, RESET TEST NUMBERS * NUUNIT IMS UPTR BUMP TO NEXT REQUESTED UNIT COPY UPTR,X GET UNIT NO COPY 0(X),A GET UNIT NUMBER JGE A,PRTUNIT PRINT UNIT COPY CAR,A GET RUN OPTIONS SHIFT A,RO,4 CONTINUOUS TESTING? (BIT 3 SET) JF OV,$+2 NO, JUMP JMP REPASS YES, DON'T STOP AT PASS END JST MSGA PRINT 'END OF TEST' MESSAGE WORD EOT JMP ENT2A GO TO QUERIES PRTUNIT COPY A,UCUR NO, STORE INTO CURRENT UNIT ADD =' 0',A C  OPY A,PRUNIT SET TO ASCII FOR OUTPUT JT SS,RETEST SKIP OUTPUT IF SS SET JST MSGA PRINT 'UNIT' MESSAGE WORD UNITMG RETEST COPY =TESTS-1,A RESET TEST TABLE PTR COPY A,TPTR * * CALL NEXT TEST * NUTEST IMS TPTR BUMP TO NEXT TEST COPY TPTR,X GET TEST NO.  COPY 0(X),X JLT X,NUUNIT END OF TABLE IF FFFF SBIT 4,S ENABLE CONSOLE INT. SBIT 8,S DO INTS JMP 0(X) GO THERE * LPOOL TITL TEST CONTROL (END OF TESTING) ****************************** * * END OF TEST * OUTPUT ERROR TALLIES * FOR EACH UNIT * ****************************** * TSTEND EQU $ COPY CAR,A TALLIES WANTED? (BIT 2 SET) SHIFT A,RO,3 JF OV,NUTEST NO JST MSGA YES, PRINT TITLE WORD TALTTL COPY =0,A COPY A,TEMP1 START WITH UNIT 0 TALLY1 COPY =UN,X TALLY2 COPY 0(X),A ADD =1,X INC. TABLE POINTER JLT A,TALLY3 END OF TABLE YET XOR TEMP1,A NO, DOES TABLE ENTRY MATCH SCANNER? JNE A,TALLY2 NO, TRY AGAIN COPY =' 0',A  STORE UNIT NO INTO MSG ADD TEMP1,A COPY A,PRUNIT JST MSGA PRINT UNIT NO WORD UNITMG JST MSGA PRINT SOFT ERRORS WORD SOFTMS COPY TEMP1,A GET UNIT NUMBER ADD =ERR0,A ADD IN ERROR TABLE ADDRESS COPY A,X PUT INTO X COPY SOFT0-ERR0(X),A GET SOFT ERROR COUNT JST ODEC PRINT SOFT ERRORS JST MSGA PRINT FIRM ERRORS WORD FIRMS COPY FIRM0-ERR0(X),A GET FIRM ERROR COUNT JST ODEC PRINT FIRM ERRORS JST MSGA PRINT HARD ERRORS WORD HARDMS COPY HARD0-ERR0(X),A GET HARD ERROR COUNT JST ODEC PRINT HARD ERROR COUNT JST MSGA PRINT TOTAL OF ALL ERRS WORD ALLMS COPY ERR0-ERR0(X),A GET TOTAL ERROR COUNT JST ODEC PRINT IT TALLY3 IMS TEMP1 DO NEXT UNIT COPY TEMP1,A CLSN =UNITS,A DONE ALL UNITS YET JMP $+2 YES, EXIT JMP TALLY1 NO, DO NEXT ONE JST MSGA PRINT PASS COUNT WORD PASSMG WHILE WERE AT IT COPY PASCTR,A GET PASS NUMBER JST ODEC PRINT PASS NUMBER JMP NUTEST EXIT * LPOOL TITL TEST A - TEST BASIC STATUS ****************************** * * TEST A - TESTS BASIC STATUS * * TEST A TESTS BASIC STATUS USING THE * TIO OPCODE WITH AND WITHOUT * INTERRUPTS * ****************************** * TESTA EQU $ TEST A - BASIC STATUS TEST COPY ='A',A PRINT TEST A TITLE JST TSTITL JST PREP INITIALIZE COPY =TAIOB,X INDEX IOB COPY =TIO,A STORE OPCODE COPY A,OP(X) COPY =0,A NO INTERRUPTS COPY A,IN(X) JST RYINIT RESET RETRIES WORD TESTA1 WORD TESTA2 JST MKIOB SET UP IOB JST DOIO DO I/O TESTA1 JST MKIOB SET UP IOB AGAIN JST DOIO DO I/O AGAIN JST STATUS CHECK STATUS AFTER SECOND TIO JST RETRY RETRY IF ERROR TESTA2 COPY =INTLOC,A SET UP INT LOC TO IOB COPY A,IN(X) JST RYINIT RESET RETRIES WORD TESTA3 WORD TESTA4 TESTA3 JST MKIOB SET UP IOB JST DOIO DO I/O JST STATUS CHECK STATUS JST RETRY RETRY ON ERROR TESTA4 JMP TSTEND EXIT * TAIOB WORD TIO TEST A IOB RES 4,0 WORD 0,BUF RES 5,0 * LPOOL TITL TEST B - TESTS SEEK AND READ REGARDLESS ***************************** * * TEST B - TESTS SEEK AND READ REGARDLESS FUNCTIONS * * TEST B TESTS THE BASIC FUNCTION OF THE SEEK * AND READ REGARDLESS FUNCTIONS. ALSO TESTS * CASE SEEKS, 'SEEK ERROR' TESTING, OVERLAPPED * SEEKS * ***************************** * TMP:B1 RES 1,0 TEMPORARY CELL * TESTB EQU $ COPY ='B',A PRINT TEST B TITLE JST TSTITL JST PREP RESET DMA ADDRESS, DISK COPY =TBIOB1,X INDEX IOB COPY =RDRG,A SET RD REG FC COPY A,OP(X) COPY =0,A COPY A,CS(X) CLEA  R CYL COPY A,HS(X) AND HEAD COPY A,SSS(X) AND SECTOR COPY WDS,A ADD =7,A WORD+HEADER+CRCS COPY A,WC(X) RDRG WORD COUNT COPY =TBIOB2,X SET UP SEEK IOB COPY =SEEK,A SET SEEK FC COPY A,OP(X) JST MKIOB COPY =0,A TO CYL 0 JST TESTB1 DO I/O COPY CYLS,A SEEK TO LAST CYL SUB =1,A JST TESTB1 DO SEEK, READ REG COPY =-400,X PRESET FOR 400 RANDOM SEEKS COPY SHORTC,A GET SHORT TEST CYL. JEQ A,$+2 NO, SHORT TESTING NEG A,X NEGATE COPY X,TEMP1 STORE RANDOM SEEK NUMBER COPY =1,A INITIALIZE RANDOM RTNE COPY A,SEED TESTB3 COPY TEMP1,A SET RUN INDICATOR NEG A OR =:2000,A SELP A,4 COPY =-1,X GET A RANDOM NO JST RANDOM FOR CYL NO CSK A,CYLS WITHIN RANGE? JMP TESTB2 YES, USE IT NOP JMP TESTB3 NO, GETANOTHERONE TESTB2 JST TESTB1 DO SEEK, READ IMS TEMP1 BUMP 400 COUNTER JMP TESTB3 DO NEXT SEEK COPY =:3FF,A SEEK TO ILLEGAL CYL (3FF) COPY A,CCUR COPY =TBIOB2,X INDEX SEEK IOB COPY =SEEK,A SET SEEK FC COPY A,OP(X) JST RYINIT RESET RETRIES WORD TB2A WORD TB2B TB2A JST MKIOB SET UP SEEK IOB JST DOIO DO ILLEGAL SEEK COPY CST(X),A GET STATUS XOR =:8600,A SHOULD BE SEEK ERROR, * * OP COMPLETE, AND ERROR STATUS * JEQ A,TSTB5K EXPECTED STATUS? COPY =22,A NO, PRINT ERROR JST ERROR DIDNT GET SEEK ERROR TSTB5K JST RETRY RETRY ON ERROR TB2B COPY =0,A COPY A,TEMP1 SET UP WORST CASE SEEK COPY CYLS,A TEMP1=UP COUNT SUB =1,A COPY A,TEMP2 TEMP2=DOWN COUNT ADD =1,A RESTORE NUMBER COPY SHORTC,X GET SHORT TEST CYLS. JEQ X,$+2 IF NONE, JUMP COPY X,A PUT INTO X NEG A NEGATE COPY A,TMP:B1 STORE CYLINDER COUNT TESTB4 COPY TEMP1,A SET RUN IND OR =:2000,A SELP A,4 COPY TEMP1,A SEEK TO OUTSIDE JST TESTB1 COPY TEMP2,A SEEK TO INSIDE JST TESTB1 IMS TEMP1 BUMP UP COUNTER COPY TEMP2,A BUMP DOWN COUNTER SUB =1,A COPY A,TEMP2 IMS TMP:B1 INCREMENT CYLINDER COUNT JMP TESTB4 IF NOT DONE, GO BACK FOR MORE COPY =:2000,A SELP A,4 SET RUN INDICATOR TBD EQU $ COPY =0,A SEE WHAT UNITS ARE AVAILABLE COPY A,TBU0 COPY =-UNITS+1,A JST MOVE WORD TBU0 WORD TBU0+1 COPY =UN,Y COPY =1,A TSTB5A COPY 0(Y),X JLT X,TSTB5B ADD =TBU0,X COPY A,0(X) ADD =1,Y JMP TSTB5A TSTB5B COPY =0,A SEE IF MORE THAN ONE COPY =TBU0,X UNIT REQUESTED COPY =UNITS-1,Q TSTB5B1 ADD 0(X),A ADD =1,X JNED Q,TSTB5B1 SUB =1,A COPY UCUR,Y CURRENT UNIT IS UNIT A COPY Y,TBUNA JGT A,TSTB5E USE SAME UNIT COPY Y,TBUNB JMP TSTB5M TSTB5E ADD =TBU0,Y NEXT HIGHER NUMBERED UNIT TSTB5C ADD =1,Y IF NOT HIGHER NUMBERED UNIT, COPY 0(Y),A THEN LOWEST REQUESTED UNIT JEQ A,TSTB5C JGT A,TSTB5D COPY =TBU0-1,Y JMP TSTB5C * LPOOL TITL TSTB5D SUB =TBU0,Y COPY Y,TBUNB FOUND UNIT B TSTB5M EQU $ COPY =TBIOB2,X SET SEEK IOB COPY =SEEK,A SET SEEK FC COPY A,OP(X) COPY =-100,A DO THIS 100 TIMES COPY A,TEMP3 TB5H EQU $ JST RYINIT INIT FOR RETRIES WORD TB5F WORD TB5G TB5F EQU $ COPY TBUNA,A COPY A,US(X) COPY =0,A COPY A,CS(X) SEEK TO CYL 0 FIRST COPY =INTLOC,A WITH INTERRUPTS COPY A,IN(X) JST DOIO SEEK UNIT A TO CYL 0 COPY TBUNB,A SET UP UNIT B COPY A,US(X) JST DOIO SEEK UNIT B TO CYL 0 TOO COPY CYLS,A NOW SET UP FOR INSIDE CYL SUB =1,A COPY A,TBIOBB+CS SHIFT A,RO,1 COPY A,TBIOBA+CS COPY TBUNA,A XOR TBUNB,A SAME UNIT? JNE A,$+2 NO COPY A,TBIOBB+CS YES SEEK TO CYL 0 COPY =-20,A ALLOW 160 MSEC COPY A,RTCCNT COPY =TBINTR,A STORE RETURN ADDRESS COPY A,RTCRTN TO CLOCK INT LOC RBIT 5  ,S RESET CLOCK SBIT 8,S ENABLE INTS COPY =TBIOBA,A GET READY TO SELECT UNIT A COPY A,ADRIOB COPY =TBIOBB,X AND UNIT B SBIT 5,S STARTIT UP JST OTA SEEK UNIT A JST SENRDY WAIT FOR IDLE JMP $-1 JST OTX SEEK UNIT B JMP $ WAIT FOR SOMETHING TO HAPPEN TBINT1 EQU $ FIRST INTERRUPT POINT JST $+1 SERVICE INT NOP COPY TBUNA,A XOR TBUNB,A SAME UNIT JEQ A,TBINT2 YES, DONT DO TIO COPY =TBIOBC,A NOW DO A TIO FOR 2ND INT COPY A,ADRIOB SBIT 8,S JST OTA SELECT FOR SECOND INTERRUPT JMP $ WAIT FOR INTERRUPT TBINT2 EQU $ MADE IT!! JST $+1 SERVICE INTERRUPT NOP RBIT 5,S STOP THE CLOCK TB5J EQU $ COPY TBUNA,A SET UP MASKS SHIFT A,LO,2 ADD TBUNB,A SHIFT A,LO,2 ADD =SIMTAB,A TO GET EXPECTED STATUS COPY A,TEMP1 COPY =TBIOBA,X COPY =1,A JST TB5JA CHECK 1ST IOB STATUS COPY =TBIOBB,X COPY =2,A JST TB5JA CHECK 2ND IOB STATUS COPY TBUNA,A XOR TBUNB,A SAME UNIT JEQ A,TSTB5P YES COPY =TBIOBC,X COPY =3,A JST TB5JA CHECK TIO IOB STATUS TSTB5P EQU $ COPY =TBIOB2,X RESTORE ORIG IOB ADDRESS COPY X,ADRIOB JST RETRY RETRY ANY ERRORS TB5G IMS TEMP3 BUMP 100 COUNT JMP TB5H JMP TSTEND EXIT TBINTR ENT BAD NEWS.CLOCK RAN OUT. JST DINIT STOP THE DISK COPY =23,A PRINT ERROR JST ERROR JMP TB5J CHECK STATUSES * LPOOL TITL TEST B SUBROUTINES (TB5JA) ***************************** * * TB5JA - CHECK STATUS * * THIS SUBROUTINE IS USED BY TEST B TO * CHECK THE RETURNED STATUS AND RETURNED * DRIVE STATUS FOR ERRORS. * * CALLING SEQUENCE: * COPY =IOB ADDRESS,X * COPY =TABLE OFFSET,A * JST TB5JA * ***************************** * TB5JA ENT STATUS CHECK ROUTINE COPY A,TEMP2 SAVE OFFSET INTO TABLE COPY X,ADRIOB SAVE IOBADDR COPY CST(X),A LOOK AT CONTROLLER STATUX XOR =:400,A GOOD? JNE A,TB5JB NO, OUTPUT ERROR COPY DST(X),A GET DRIVE STATUS AND =:FF00,A MASK OFF LSB COPY A,TCTEMP ONLY CONCERNED WITH BITS 15-8 COPY TEMP1,Y AND OFF OTHER UNITS COPY 0(Y),A AND TCTEMP,A COPY A,TEMP4 FROM DRIVE STATUS COPY TEMP1,A GET COMPARISON STATUS ADD TEMP2,A FROM TABLE COPY A,X COPY 0(X),A COMPARE STATUS XOR TEMP4,A JNE A,TB5JB ERROR. BAD STATUS JMP *TB5JA OK DRIVE STATUS TB5JB COPY ADRIOB,X GET ADDR OF IOB COPY =23,A SET ERROR NO ADD TEMP2,A JST ERROR CALL ERROR ROUTINE JMP *TB5JA EXIT * LPOOL TITL TEST B SUBROUTINES (TESTB1) ***************************** * * TESTB1 - SEEK I/O * * THIS SUBROUTINE IS USED BY TEST B TO * DO THE SEEK TESTING. * * CALLING SEQUENCE: * COPY =SEEK CYLINDER,A * JST TESTB1 * ***************************** * TESTB1 ENT TEST B I/O CALLER COPY A,CCUR STORE REQUESTED SEEK CYL COPY =TBIOB2,X SET UP SEEK IOB COPY =SEEK,A SET SEEK FC COPY A,OP(X) JST RYINIT RESET RETRIES WORD TSTB11 WORD TSTB12 TSTB11 EQU $ JST MKIOB JST DOIO DO THE SEEK  JST STATUS JST RETRY RETRY TSTB12 EQU $ COPY =0,A FILL BUF WITH ZERO JST FILCON COPY =TBIOB1,X SET UP RD REGARD IOB COPY =RDRG,A SET READ REG FC COPY A,OP(X) COPY WDS,A ADD =7,A WORD+HEADER+CRCS COPY A,WC(X) RDRG WORD COUNT JST RYINIT RESET RETRIES WORD TSTB13 WORD TSTB1E TSTB13 EQU $ JST MKIOB JST DOIO DO REGARDLESS READ JST STATUS CHECK STATUS COPY BUF+1,A GET ACTUAL SECTOR READ FROM SHIFT A,RO,8 GET RID OF HEAD NO COPY A,SCUR SAVE IT FOR NXTHDR ROUTINE JST NXTHDR CALCULATE WHAT NEXT A  DDR COPY =CMPBUF,X SHOULD BE COPY CCUR,A BUILD COMPARE HEADER BUFFER COPY A,0(X) COPY SCUR,A STORE CYL, SECTOR SHIFT A,LO,8 OR HCUR,A AND HEAD COPY A,1(X) COPY CNEXT,A GET NEXT CYL NO COPY A,2(X) COPY SNEXT,A NEXT SECTOR SHIFT A,LO,8 OR HNEXT,A AND NEXT HEAD COPY A,3(X) TSTB1A COPY WDS,A STORE LENGTH COPY A,4(X) COPY =5,A CALCULATE ID CRC JST CRC COPY A,5(X) STORE IT COPY =-6,A NOW COMPARE THE HEADERS COPY A,TEMP3 6 WORDS COPY =BUF,A POINT TO ACTUAL BUF COPY A,TEMP4 COPY =CMPBUF,X INDEX COMPARATOR BUF TSTB1B COPY TEMP4,Y GET ACTUAL HEADER WORD COPY 0(Y),A XOR 0(X),A COMPARE IT TO EPXPECTED WD JNE A,TSTB1C ID CRC MISCOMPARE IMS TEMP4 ADD =1,X KEEP CHECKING IMS TEMP3 JMP TSTB1B COPY =BUF+6,A NOW CALCULATE WORD CRC COPY A,X ADD WDS,A COPY A,TCTEMP COPY WDS,A JST CRC COPY A,TSBCRC SAVE CRC COPY TCTEMP,Y COMPARE IT TO ACTUAL WORD CRC XOR 0(Y),A JNE A,TSTB1D WORD CRC MISCOMPARE TSTB14 JST RETRY RETRY ON ERROR TSTB1E EQU $ COPY =0,A COPY A,SCUR JMP *TESTB1 RETURN TSTB1C EQU $ COPY =20,A ID CRC MISCOMPARE JST ERROR PRINT ERROR MSG JST ERSET JMP TSTB14 COPY CAR,A SEE IF ERROR REPORTS WANTED SHIFT A,RO,2 JT OV,TSTB1E NO, FORGET IT JST MSGA YES, DISPLAY ACTUAL HEADER WORD ACTHDM COPY =BUF,A JST TSTB1F CALL HEADER PRINT RTNE JST MSGA NOW DISPLAY EXPECTED HDR WORD EXPHDM COPY =CMPBUF,A JST TSTB1F CALL HEADER DISPLAY RTNE JMP TSTB14 * LPOOL  TITL TEST B SUBROUTINES (TSTB1F) ***************************** * * TSTB1F - HEADER DISPLAY * * THIS SUBROUTINE IS USED BY TEST B TO * DISPLAY ACTUAL AND EXPECTED HEADER * INFORMATION. * * CALLING SEQUENCE: * COPY =HEADER ADDRESS,A * JST TSTB1F * ***************************** * TSTB1F ENT HDR DISPLAY ROUTINE COPY A,TEMP3 SAVE HEADER ADDRESS COPY =-6,A 6 CHARS COPY A,TEMP4 TSTB1G COPY TEMP3,Y GET A CHAR COPY 0(Y),A JST OHEX DUMP WORD IN HEX COPY =:A0,A JST OTTY IMS TEMP3 BUMP PTR IMS TEMP4 BUMP COUNT JMP TSTB1G DO NEXT WORD JMP *TSTB1F RETURN TSTB1D EQU $ COPY =21,A WORDC RC MISCOMPARE JST ERROR JST ERSET JMP TSTB14 COPY CAR,A SEE IF ERRORS WANTED SHIFT A,RO,2 JT OV,TSTB1410 NO JST MSGA YES PRINT CRC WORD ACCRCM COPY TCTEMP,Y COPY 0(Y),A JST OHEX JST MSGA AND EXPECTED CRC WORD XPCRCM COPY TSBCRC,A JST OHEX  COPY WDS,A GO DUMP BUFFER ADD =1,A NEG A COPY =BUF+6,X IF WANTED JST DUMP TSTB1410 JMP TSTB14 * LPOOL TITL TEST B TABLES AND IOBS * TSBCRC WORD 0 SAVE CRC CHAR * TBU0 RES UNITS,0 WORD -1 * TBIOB1 WORD RDRG,0,0,0,0 WORD 0,BUF,INTLOC RES 4,0 * TBIOB2 WORD SEEK RES 6,0 WORD INTLOC RES 4,0 * TBIOBA WORD SEEK TBUNA WORD 0 RES 5,0 WORD TBINT1,0,0,0,0 * TBIOBB WORD SEEK TBUNB WORD 0 RES 5,0 WORD TBINT1,0,0,0,0 * TBIOBC WORD TIO RES 6,0 WORD TBINT2,0,0,0,0 * CMPBUF RES 10,0 * SIMTAB EQU $ SIMULATANEOUS SEEK WORD :8000,:8000,0,0 WORD :C000,:8000,:4000,0 STATUS COMP- WORD :A000,:8000,:2000,0 ARISON TABLE WORD :9000,:8000,:1000,0 WORD :C000,:4000,:8000,0 WORD :4000,:4000,0,0 WORD :6000,:4000,:2000,0 WORD :5000,:4000,:1000,0 WORD :A000,:2000,:8000,0 WORD :6000,:2000,:4000,0 WORD :2000,:2000,0,0 WORD :3000,:2000,:1000,0 WORD :9000,:1000,:8000,0 WORD :5000,:1000,:4000,0 WORD :3000,:1000,:2000,0 WORD :1000,:1000,0,0 TITL TEST C - FORMAT FUNCTION TESTING ***************************** *  * TEST C - FORMAT FUNCTION TESTING * * FORMAT 1 SECTOR - SHOULD COMPLETE WITHOUT ERROR * TEST SECTOR OVERRUN - SHOULD GET FORMAT ERROR * TEST TRACK OVERRUN - SHOULD GET FORMAT ERROR * * FORMAT TESTING IS DONE ON EACH TRACK AS FOLLOWS: * * A FORMAT FUNCTION IS ISSUED TO EACH TRACK IN STANADARD CAI * FORMAT, FOR A LENGTH OF TWO TRACKS. THEN A READ REGARDLESS * IS DONE TO THE SECOND TRACK, TO READ IN THE HEAD, ID, AND * ONE DATA WORD FROM EACH TRACK. THEN A READ REGARDLESS IS * DONE TO A FULL SECTOR (HEADER+ID+DATA+CRC) ON THE FIRST * TRACK. THEN A READ VERIFY OPERATION IS DONE TO THE FIRST * TRACK, FOR A LENGTH OF TWO TRACKS. CORRECT HEADER, ID, AND * DATA TRANSFER IS VERIFIED FOR EACH READ OPERATION. * * HIGH CAPACITY OVERRUN TESTING USES 4095 WORDS IN 3 SECTORS. * * MEDIMUM CAPACITY OVERRUN TESTING DOUBLES THE QUERY INPUTS. * * THIS TEST IS NOT RUN IF NONDESTRUCTIVE TESTING IS REQUESTED. * ***************************** * TMP:C1 RES 1,0 TEMPORARY CELL TMP:C2 RES 1,0 TEMPORARY CELL * TESTC EQU $ TEST C - FORMAT TEST COPY ='C',A PRINT TEST C TITLE JST TSTITL COPY NONDES,A NONDESTRUCTIVE? JEQ A,$+2 NO JMP TSTEND YES, DONT RUN IT COPY SHORTC,A GET SHORT TEST CYLS. JNE A,$+3 IF SHOFT TESTING, JUMP JST TEST:C DO TEST C OVER FULL RANGE JMP TSTEND EXIT TEST COPY ECYL,A GET ENDING CYL. NUMBER COPY A,TMP:C1 SAVE IT COPY SCYL,A GET STARTING CYL. NUMBER COPY A,TMP:C2 SAVE IT ADD SHORTC,A ADD IN SHORT TEST CYLS. SUB =1,A DECREMENT ONCE COPY A,ECYL STORE NEW ENDING CYL. NUMBER JST TEST:C DO TEST C COPY TMP:C1,A GET ENDING CYL. NUMBER COPY A,ECYL STORE ENDING CYL. NUMBER SUB SHORTC,A GENERATE STARTING CYL. NUMBER ADD =1,A INCREMENT ONCE COPY A,SCYL STORE NEW STARTING CYL. NUMBER JST TEST:C DO TEST C COPY TMP:C2,A GET OLD STARTING CYL. NUMBER COPY A,SCYL STORE VALUE JMP TSTEND * LPOOL TITL * TEST:C ENT START OF TEST C JMP $+2 CONTINUE TSCEXT JMP *TEST:C EXIT TEST C COPY WDS,A COPY SECS,X TC60A COPY A,TCWDS COPY X,TCSECS JST PREP INITIALIZE DISK TC61 COPY DISK,A CLSN ='H',A JMP TC69 * * THE FOLLOWING CODE IS RUN FOR MED CAP DISKS ONLY * * FORMAT 1 SECTOR--SHOULD NOT GET ERROR * RESET TCBUF2 AND TCIOB6 * COPY =TCBUF2,X COPY =0,A COPY A,4(X) RESET SECTOR WORD COUNT COPY =TCIOB6,X COPY =TCBUF2,A COPY A,MA(X) RESET MA TO SECTOR BLOCK COPY =1,A COPY A,WC(X) RESET WC TO 1 SECTOR COPY =TCBUF2,X GET SECTOR BLOCK COPY TCWDS,A COPY A,4(X) INSERT SECTOR WORD COUNT COPY =TCIOB6,X INDEX OVERRUN IOB JST RYINIT RESET RETRIES WORD TC62 WORD TC63 TC62 JST MKIOB SET UP IOB JST DOIO FORMAT 1 SECTOR JST STATUS CHECK STATUS JST RETRY RETRY ON ERROR * * NOW FORMAT 1 SECTOR WITH EXCESSIVE WORD LENGTH * SHOULD GET FORMAT ERROR DUE TO SECTOR OVERRUN * TC63 COPY =TCBUF2,X GET SECTOR BLOCK COPY TCWDS,A SHIFT A,LO,1 DOUBLE WORD LENGTH COPY A,4(X) INSERT IN SECTOR WORD COUNT COPY =TCIOB6,X INDEX OVERRUN IOB  JST RYINIT RESET RETRIES WORD TC64 WORD TC66 TC64 JST MKIOB SET UP IOB JST DOIO DO OVERRUN FORMAT COPY CST(X),A GET STATUS  XOR =:8500,A IS IT FORMAT ERROR JEQ A,TC65 YES COPY =32,A NO,ERROR JST ERROR NO FORMAT ERROR ON SECTOR OVERRUN TC65 JST RETRY RETRY ON ERROR * * NOW FORMAT 1 TRACK WITH TOO MANY SECTORS PER TRACK * SHOULD GET FORMAT ERROR DUE TO TRACK OVERRUN * TC66  COPY =TCIOB6,X INDEX OVERRUN IOB COPY SECS,A GET NUMBER OF SECTORS SHIFT A,LO,1 DOUBLE IT-SHOULD CAUSE TROUBLE COPY A,WC(X) TO WORD 5 COPY A,TCSECS COPY =BUF,A GET STARTING SECTOR BLOCK ADD COPY A,MA(X) TO WORD 6 COPY A,X COPY CCUR,A BUILD FORMAT BUFFER COPY A,FMCS PARAMETERS COPY A,FMCN FOR COPY A,FMCL SUBROUTINE COPY HCUR,A FMBLD COPY A,FMHS COPY A,FMHN ADD =1,A BUMP HEAD COUNT COPY A,FMHL JST FMBLDC BUILD FORMAT BUFFER-1 TRACK COPY =TCIOB6,X GET IOB ADDRESS JST RYINIT RESET RETRIES WORD TC67 WORD TC73 TC67 JST MKIOB SET UP IOB JST DOIO DO OVERRUN FORMAT COPY CST(X),A GET STATUS XOR =:8500,A IS IT FORMAT ERROR? JEQ A,TC68 YES COPY =32,A NO,ERROR JST ERROR NO FORMAT ERROR ON TRACK OVERRUN TC68 JST RETRY RETRY ON ERROR JMP TC73 *  LPOOL TITL * * THE FOLLOWING CODE IS RUN ON HIGH CAP DISKS ONLY * TC69 COPY =TCIOB5,X INDEX OVERRUN IOB JST RYINIT INITIALIZE WORD TC70 WORD TC71 TC70 COPY =FRMT,A STORE FORMAT OP COPY A,OP(X) COPY =1,A ONE SECTOR COPY A,WC(X) JST MKIOB SET UP IOB JST DOIO DO FORMAT JST STATUS CHECK STATUS JST RETRY RETRY ON ERROR TC71 JST RYINIT REINITIALIZE WORD TC72 WORD TC73 TC72 COPY =FRMT,A SET FORMAT OP COPY A,OP(X) COPY =3,A 3 SECTORS COPY A,WC(X) JST MKIOB JST DOIO DO OVERRUN FORMAT COPY CST(X),A GET STATUS XOR =:8500,A IS IT FORMAT ERROR? JEQ A,TC72A YES COPY =32,A NO, ERROR JST ERROR NO FORMAT ERROR ON * * OVERRUN LENGTH * TC72A JST RETRY RETRY ON ERROR * * TEST CONTINUES FOR BOTH HIGH AND MEDIUM * TC73 EQU $ COPY SECS,A COPY A,TCSECS  COPY UCUR,A STORE UNIT NO COPY A,TCIOB1+US COPY A,TCIOB2+US COPY A,TCIOB3+US COPY A,TCIOB4+US TESTC1 COPY =-2,A COUNT 2 TRACKS COPY A,TEMP1 COPY =TCIOB1,X INDEX IOB COPY CCUR,A COPY A,CS(X) OR =:3000,A OUTPUT A RUN INDICATOR SELP A,4 COPY HCUR,A GET CURRENT HEAD COPY A,HS(X) COPY TCSECS,A GET SECTORS/TRACK SHIFT A,LO,1 DOUBLE IT COPY A,WC(X) TO FORMAT 2 TRACKS COPY TCSECS,A GET SECTORS/TRACK SHIFT A,LO,2 TIMES 4 ADD TCSECS,A TIMES 5--EACH SECTOR BLOCK COPY A,TEMP3 REQUIRES FIVE WORDS TSTC1X COPY CCUR,A BUILD COPY A,FMCS FORMAT BUFFER COPY A,FMCN COPY HCUR,A COPY A,FMHS COPY A,FMHN JST INCRH BUMP HEAD/CYL JMP TSTC2X CONTINUE JMP TSCEXT EXIT TEST * LPOOL TITL TSTC2X COPY CCUR,A COPY A,FMCL COPY HCUR,A COPY A,FMHL COPY TEMP1,X SET UP BUF PTR NEG X COPY =BUF,A BUF FOR FIRST TRACK ADD TEMP3,A BUF+TEMP3 FOR SECOND TRACK CLSN =2,X SUB TEMP3,A FIRST TRACK COPY A,X JST FMBLDC BUILD FORMAT BUFFER * * ALTERNATE ENTRY POINT * IMS TEMP1 BUMP 2-TRACK COUNTER JMP TSTC1X DO SECOND TRACK COPY =TCIOB1,X INDEX IOB JST RYINIT RESET RETRIES WORD TESTC7 TESTC7 DATA GOES HERE WORD TESTC8 TESTC8 DATA GOES HERE TESTC7 EQU $ JST DOIO DO FORMAT 2 TRACKS JST STATUS CHECK STATUS JST RETRY RETRIES TESTC8 EQU $ COPY FMCS,A GET TRACK 2 PTRS COPY A,TCIOB2+CS COPY FMHS,A FOR VERIFY COPY A,TCIOB2+HS COPY =-4,A JST MOVE WORD TCIOB1+US WORD TCIOB3+US AND TO SINGLE SECTOR RD IOB COPY =-4,A JST MOVE AND TO VERIFY IOB WORD TCIOB1+US WORD TCIOB4+US COPY =SAVBUF,A BUILD COMPARE BUFFER COPY A,TEMP2 FOR RD REGARDLESS COPY TCSECS,A SUB =1,A NEG A COPY A,TEMP1 NEG NUMBER OF WORD CHAIN IOBS COPY =TCLINK-1,X GET WORD CHAIN IOB TABLE ADD-1 JMP TESTC3 * LPOOL TITL TESTC3 COPY =7,A 5 HEADER WORDS+1 CRC WORD+1 WORD WORD COPY A,1(X) TO WORD  COUNT ADD TEMP2,A ADD SAVEBUF ADDR COPY A,TEMP2 COPY A,2(X) ADDR WHERE THE 7 WORDS/SECTOR FOUND COPY =0,A COPY A,3(X) NEXT WORD IS RESERVED COPY X,A ADD =5,A BUMP TCLINK PTR COPY A,4(X) TO GET NEXT DC IOB ADDRESS ADD =4,X NOW REALLY BUMP TCLINK PTR IMS TEMP1 DONE YET JMP TESTC3 NO COPY =0,A YES LAST IOB PTR OUT COPY A,0(X) COPY =TCIOB2,X JST RYINIT RESET RETRIES WORD TC3A WORD TC3B TC3A EQU $ COPY =-1,A SPREAD :FFFF COPY A,SAVBUF INTO BUFFER COPY =-519,A 519 WORDS JST MOVE WORD SAVBUF WORD SAVBUF+1 JST DOIO READ TRACK HEADERS JST STATUS CK STATUS COPY TCSECS,A COMPARE 7 WORDSIN EACH SECTOR NEG A COPY A,TEMP1 COPY =BUF,A ADD TEMP3,A COPY A,X COMPARE SECOND TRACK BUFFER JST TESTC4 GO COMPARE INPUT JST RETRY RETRY ON ERROR TC3B EQU $ COPY =TCIOB3,X INDEX IOB COPY TCWDS,A GET WDS/SECTOR ADD =7,A MAKE IT A FULL SECTOR COPY A,WC(X) TO IOB WORD COUNT JST RYINIT RESET RETRIES WORD TC3C WORD TC3D TC3C EQU $ JST DOIO READ ONE SECTOR JST STATUS CK STATUS COPY =-1,A COPY A,TEMP1 COPY =BUF,X INDEX FIRST TRACK BUF JST TESTC4 COMPARE INPUT COPY =SAVBUF+6,A NOW COMPARE WORD COPY A,MISCAD EACH WORD WORD COPY =PAT,A SHOULD BE :6DB6 COPY A,EXP COPY TCWDS,A NEG A JST COMPAR COMPARE THEM JMP TESTC5 ERROR COPY =SAVBUF+6,A COPY A,X ADD TCWDS,A WORD CRC CHAR ADDRESS COPY A,TCTEMP STORE IT COPY TCWDS,A NOW CALCULATE CRC JST CRC AND COMPARE CALCULATED CRC COPY TCTEMP,Y WITH INPUT CRC XOR 0(Y),A JEQ A,TESTC6 COMPARE CRC TO INPUT CRC TESTC5 EQU $ COPY =31,A NO, PRINT IT JST ERROR MISCOMPARE ON WORD JST ERSET JMP TESTC6 COPY CAR,A SEE IF ERRORS WANTED SHIFT A,RO,2 JT OV,TESTC6 NO COPY =SAVBUF,X YES PREPARE FOR BUF DUMP COPY TCWDS,A ADD =7,A GET FULL SECTOR NEG A JST DUMP DUMP IT TESTC6 JST RETRY RETRY ON ERROR TC3D EQU $ COPY =TCIOB4,X INDEX VERIFY IOB COPY TCSECS,A NEG A COPY A,TCTEMP NEG NUMBER OF SECTORS/TRACK COPY =0,A TC3G ADD TCWDS,A SECTORS/TRACK IMS TCTEMP TIMES WDS/SECTOR JMP TC3G GIVES WDS/TRACK SHIFT A,LO,1 DOUBLE IT FOR 2 TRACKS COPY A,WC(X) TO IOB WORD COUNT JST RYINIT RESET RETRIES WORD TC3E WORD TC3F TC3E EQU $ JST DOIO VERIFY 2 TRACKS JST STATUS CK STATUS JST RETRY RETRY TC3F JMP TESTC1 DO NEXT TRACK * LPOOL TITL TEST C SUBROUTINES (TESTC4) ***************************** * * TESTC4 - COMPARE INPUT BUFFER * * THIS SUBROUTINE IS USED BY TEST C TO * COMPARE BUFFERS FOR A MISMATCH IN DATA. * * CALLING SEQUENCE: * COPY =BUFFER ADDRESS,X * JST TESTC4 * ***************************** * TESTC4 ENT COMPARE INPUT BUFFER COPY X,TCTEMP SAVE BUF PTR COPY =SAVBUF,X INDEX INPUT TSTC4B COPY 1(X),A GET SECTOR NUMBER SHIFT A,RO,8 TO USE AS INDEX COPY A,TEMP3 SHIFT A,LO,2 INTO COMPARISON BUFFER ADD TEMP3,A ADD TCTEMP,A ADD IN BUF PTR COPY A,TEMP2 COPY =-5,A COMPARE 5 WORDS COPY A,TEMP3 TSTC4A COPY 0(X),A COMPARE A WORD COPY TEMP2,Y XOR 0(Y),A JNE A,TSTC4C MISCOMPARE ADD =1,X BUMP PTRS IMS TEMP2 IMS TEMP3 AND COUNT JMP TSTC4A COMPARENEXT WORD SUB =5,X NOW CALCULATE CRC COPY =5,A JST CRC XOR 5(X),A COMPARE IT TO INPUT CRC JNE A,TSTC4C MISCOMPARE COPY =PAT,A CHECK THAT FIRST WORD WORD IS COOL XOR 6(X),A JNE A,TSTC4C MISCOMPARE ADD =7,X TO NEXT HEADER IMS TEMP1 CHECK WORDS IN NEXT SECTOR JMP TSTC4B TSTC4D EQU $ JMP *TESTC4 EXIT TSTC4C EQU $ CO PY =30,A NO, PRINT IT JST ERROR WORD MISCOMPARE JST ERSET JMP TSTC4D COPY CAR,A SEE IF ERRORS WANTED SHIFT A,RO,2 JT OV,TSTC4D NO COPY ADRIOB,X COPY WC(X),A CLSN =7,A JMP TSTC4E JMP TSTC4G TSTC4E COPY TCSECS,X SUB =1,X NEG X COPY X,TEMP4 COPY ADRIOB,X TSTC4F ADD WC(X),A NO. WDS TO DUMP IN A IMS TEMP4 JMP TSTC4F TSTC4G NEG A COPY =SAVBUF,X YES, DUMP BUFFER JST DUMP JMP TSTC4D * LPOOL TITL TEST C TABLES AND IOBS * TCWDS WORD 0 WDS/SECTOR TCSECS WORD 0 SECTORS/TRACK * TCIOB1 WORD FRMT TWO TRACK FORMAT IOB RES 5,0 WORD BUF,INTLOC RES 4,0 * TCIOB2 WORD RDRG SECOND TRACK RES 4,0 READ REGARDLESS IOB WORD 7,SAVBUF FOR 7 WDS/SECTOR WORD INTLOC,TCLINK RES 3,0 * TCIOB3 WORD RDRG FIRST TRACK RES 5,0 READ REGARDLESS IOB FOR WORD SAVBUF 1-FULL SECTOR WORD INTLOC RES 4,0 * TCIOB4 WORD RDVER READ VERIFY IOB FOR RES 6,0 2 TRACKS WORD INTLOC RES 4,0 * TCLINK RES 220,0 WORD CHAIN IOB TABLE * TCIOB5 RES 5,0 OVERRUN IOB WORD 1,TCBUF,INTLOC RES 4,0 * TCBUF WORD 0,0,0,:100,4095 WORD 0,:100,0,:200,4095 WORD 0,:200,0,0,4095 * TCIOB6 WORD FRMT OVERRUN FORMAT IOB RES 4,0 FOR MED CAP DISK WORD 1,TCBUF2,INTLOC RES 4,0 * TCBUF2 WORD 0,0,0,:100,0 TITL TEST D - SHORT WORD TRANSFER TEST ***************************** * * TEST D - SHORT WORD TRANSFER TEST * * TEST D PERFORMS WRITE/READ/VERIFY OPERATIONS IN * SEQUENTIAL SECTOR ORDER, USING THE WORST CASE * PATTERN AS DATA ON THE FIRST AND LAST 10 * CYLINDERS ONLY. THE LENGTH OF EACH I/O IS ONE * SECTOR FOR THE OUTSIDE CYLINDERS AND TWO SECTORS * FOR THE INSIDE CYLINDERS. * * THE TWO SECTOR I/O IS PERFORMED WITH THESE * DATA-CHAINED WORD COUNTS: * * DCIOB (WDS * 2) * .25 (LESS THAN 1 SECTOR) * CIOB (WDS * 2) * .75 (MORE THAN 1 SECTOR) * ***************************** * TMP:D1 RES 1,0 TEMPORARY CELL TMP:D2 RES 1,0 TEMPORARY CELL * TESTD EQU $ COPY ='D',A PRINT TITLE JST TSTITL JST PREP PREP THE DISK COPY SHORTC,A GET SHORT TEST CYLS. JEQ A,TESTDA IF NONE, JUMP COPY ECYL,A GET ENDING CYL. NUMBER COPY A,TMP:D1 STORE VALUE COPY SCYL,A GET STARTING CYL. NUMBER COPY A,TMP:D2 SAVE NUMBER ADD SHORTC,A ADD IN SHORT TEST CYL. OFFSET SUB =1,A DECREMENT ONCE COPY A,ECYL STORE NEW ENDING CYL. NUMBER TEST:D1 JST TESTD1 DO TEST JST INCR INCREMENT CYLINDER NUMBER JMP TEST:D1 IF NOT DONE, DO MORE COPY TMP:D1,A GET OLD ENDING CYL. NUMBER COPY A,ECYL RESTORE VALUE SUB SHORTC,A GENERATE NEW STARTING CYL. NUMBER ADD =1,A INCREMENT ONCE COPY A,SCYL STORE NEW STARTING CYL. NUMBER COPY A,CCUR SET STARTING CYLINDER TEST:D2 JST TESTD1 DO TEST JST INCR INCREMENT CYLINDER NUMBER JMP TEST:D2 IF NOT DONE, DO MORE COPY TMP:D2,A GET STARTING CYL. NUMBER COPY A,SCYL RESTORE NUMBER JMP TSTEND EXIT TEST * TESTDA JST TESTD1 TEST ONE SECTOR JST INCR BUMP DMA ADDR JMP $+2 NOT DONE YET JMP TSTEND DONE, EXIT COPY =10,A SEE IF TESTING CYL 10  CSK A,CCUR JMP TESTDA NO JMP TESTDA NO COPY =-9,A YES, DO LAST 10 NOW ADD ECYL,A COPY A,CCUR JMP TESTDA CONTINUE TITL TEST I - SAME AS TEST D,EXCEPT ALL CYLS ***************************** * * TEST I - LOND WORD TRANSFER TEST * * TEST I IS THE SAME AS TEST D, EXCEPT * ALL REQUESTED CYLINDERS ARE TESTED. * ***************************** * TESTI EQU $ COPY  ='I',A PRINT TEST TITLE JST TSTITL TESTI1 JST PREP INITIALIZE STUFF JST TESTD1 CALL SECTOR TEST ROUTINE JST INCR BUMP DMA ADDR JMP $-2 CONTINUE JMP TSTEND EXIT * LPOOL TITL TEST D1 - SINGLE SECTOR TEST ROUTINE ***************************** * * TEST D1 - SINGLE SECTOR TEST ROUTINE * * COMMON TO BOTH TEST D AND TEST I. * ***************************** * TESTD1 ENT  COPY TCUR,A OUTPUT TEST NO TO LIGHTS SHIFT A,LO,8 SHIFT A,LO,4 OR CCUR,A ALSO CURRENT CYL NO SELP A,4 COPY WDS,A SHIFT A,LO,1 DOUBLE WORD COUNT COPY A,TEMP1 SHIFT A,LO,1 DOUBLE THIS QUABTITY ADD WDS,A TIMES 3 SHIFT A,RO,2 DIVIDE BY 4 COPY A,WC1 CIOB WORD COUNT COPY TEMP1,A DIFFERENCE BETWEEN DOUBLE WC SUB WC1,A AND CIOB WC COPY A,WC2 IS DCIOB WORD COUNT JST NXTHDR CALCULATE NEXT DMAADDR COPY CNEXT,A IF NEGATIVE, JGE A,$+2 JMP *TESTD1 THEN WERE DONE COPY ECYL,A CALCULATE WHETHER ITS SUB SCYL,A INSIDE OR OUTSIDE CYL COPY A,TEMP1 COPY CCUR,A SHIFT A,LO,1 MULT BY TWO SUB TEMP1,A DETERMINE WHICH SIDE JGE A,TESTD7 OF THE DISK WE'RE ON COPY WDS,A OUTSIDE. 1 SECTOR COPY A,TDIOB1+WC COPY A,TDIOBS+WC COPY =0,A COPY A,TDIOB1+NB AND NO WORD CHAIN JMP TESTD8 CONTINUE TESTD7 COPY WC1,A INSIDE. 2 SECTORS COPY A,TDIOB1+WC COPY WDS,A SHIFT A,LO,1 DOUBLE WORD COUNT COPY A,TDIOBS+WC TO SAVE 2 SECTORS COPY WC2,A COPY A,TDIOB2 DCIOB WD CNT COPY =TDIOB2,A WORD CHAINING COPY A,TDIOB1+NB COPY =TDIOB2,X COPY =BUF,A ADD WC1,A GET MEM ADDR COPY A,1(X) FOR DCIOB TESTD8 COPY NONDES,A SAVE USER AREA? JEQ A,TESTD3 NO COPY =TDIOBS,X YES, SAVE IT COPY =RDDAT,A READ IT IN JST TESTD4 PERFORM THE I/O TESTD3 COPY WCPAT,A SPREAD PATTERN FOR WRITE JST FILCON COPY =TDIOB1,X INDEX WRITE IOB COPY =WRTDAT,A JST TESTD4 DO THE WRITE COPY =RDVER,A JST TESTD4 DO THE VERIFY COPY =0,A CLEAR THE BUFFER FOR READ JST FILCON COPY =RDDAT,A COPY A,OP(X) STORE OPCODE JST RYINIT RESET RETRIES WORD TD3A WORD TD3B TD3A JST TD4C COPY =BUF,A DO WORD COMPARE NOW COPY A,MISCAD SET COMPARE ADDR COPY WCPAT,A AND EXPECTED DAT COPY A,EXP  COPY TDIOBS+WC,A GET LENGTH NEG A JST COMPAR JMP TESTD5 MISCOMPARE JMP TESTD6 CONTINUE TESTD5 EQU $ COPY =40,A PRINT MISCOMP ERROR JST ERROR JST ERSET JMP TESTD6 COPY =BUF,X DO BUFFER DUMP IF WANTED COPY TDIOBS+WC,A NEG A SET LENGTH JST DUMP TESTD6 JST RETRY RETRY ON ERROR TD3B COPY NONDES,A SEE IF SAVING JEQ A,TSTD6A NO COPY =TDIOBS,X YES, RESTORE IT TO DISK COPY =WRTDAT,A JST TESTD4 DO THE WRITE TSTD6A JMP *TESTD1 EXIT * LPOOL TITL TEST D1 SUBROUTINES (TESTD4) **************************** * * TESTD4 - RETRY I/O * * THIS SUBROUTINE WILL RESET RETRY * ADDRESSES AND RETRY THE I/O OPERATION. * * CALLING SEQUENCE: * COPY =OP CODE,A * JST TESTD4 * **************************** * TESTD4 ENT COPY A,OP(X) STORE OPCODE JST RYINIT RESET RETRIES WORD TD4A WORD TD4B TD4A JST TD4C DO I/O JST RETRY RETRY ON ERROR TD4B JMP *TESTD4 EXIT TITL TEST D1 SUBROUTINES (TD4C) ***************************** * * TD4C - DO TEST D1 I/O * * THIS SUBROUTINE IS USED TO DO * TEST D1 I/O OPERATIONS. * * CALLING SEQUENCE: * JST TD4C * ***************************** * TD4C ENT I/O ROUTINE JST MKIOB BUILD IOB JST DOIO DO THE I/O JST STATUS CHECK STATUS COPY CCUR,A SEE IF IOB DMA ADDR XOR CS(X),A HAS C HANGED JNE A,TSTD4D YES, ERROR COPY HCUR,A XOR HS(X),A JNE A,TSTD4D COPY SCUR,A XOR SSS(X),A JEQ A,TSTD4C OK TSTD4D EQU $ COPY =41,A JST ERROR DMA ADDR CHANGED TSTD4C JMP *TD4C EXIT * LPOOL TITL TEST D1 IOBS * TDIOB1 RES 5,0 TEST D I/B WORD 0 WORD COUNT WORD BUF WORD INTLOC WORD TDIOB2 CHAINED TO TDIOB2 RES 3,0 * TDIOB2 WORD 0 WORD CHAIN IOB WORD 0 WORD 0,0 * TDIOBS RES 5,0 USER SAVE IOB WORD 0 WD COUNT WORD SAVBUF INTO SAVBUF WORD INTLOC RES 4,0 * WC1 WORD 0 FIRST WD COUNT WC2 WORD 0 SECOND WD COUNT TITL TEST E - RANDOM I-O TEST ***************************** * * TEST E - RANDOM I/O TEST * * THE RANDOM NUMBER GENERATOR IS USED TO DETERMINE * THE CYLINDER, HEAD, SECTOR AND DATA LENGTH TO BE * USED IN THE TEST. THE DATA WRITTEN IS AN * INCREMENTING PATTERN WITH THE FIRST WORD EQUAL TO * THE CYLINDER NUMBER. USING THIS PATTERN AND DMA * ADDRESS, WRITE AND READ/VERIFY FUNCTIONS ARE * PERFORMED FOR A FULL SECTOR TO VERIFY UNUSED * SECTOR (FILLED WITH :6DB6). THIS READ CONSISTS OF * A DATA-CHAIN IOB CONTAINING THE REMAINDER WORD * COUNT. EACH I/O FUNCTION IS ISSUED USING THE * 'RETURN NEXT DMA ADDRESS' FEATURE, WHICH IS *  VERIFIED. * * THIS IS DONE FOR ALL REQUESTED CYLINDERS. * ***************************** * TESTE EQU $ COPY ='E',A PRINT TEST E TITLE JST TSTITL COPY SCYL,A CALCULATE PASSES SUB ECYL,A THROUGH THIS SUB =1,A COPY SHORTC,X GET SHORT TEST CYLS. JEQ X,$+2 IF NO, JUMP NEG X,A NEGATE COPY A,TEMP1 JST PREP SET DISK, DMA ADDR COPY =1,A PRESET RANDOM COPY A,SEED NO.GENERATOR TESTE1 COPY TEMP1,A SET RUN INDICATOR NEG A OR =:5000,A SELP A,4 COPY CYLS,A JST MASK GET CYLINDER MASK COPY X,TEMP2 TESTEF JST RANDOM GET CYL NO AND TEMP2,A MASK OFF UNWANTED BITS CSK A,CYLS JMP CHECK1 MAKE RANGE CHECK SUB CYLS,A DECREASE SUB =1,A SIZE CHECK1 CSK A,ECYL WITHIN RANGE? CSK A,SCYL JMP TESTEF NO, TRY AGAIN NOP COPY A,CCUR STORE CURRENTCYL COPY HDS,A JST MASK GET HEAD MASK COPY X,TEMP2 TESTE2 JST RANDOM GET HEAD NO AND TEMP2,A MASK OFF UNWANTED BITS CSK A,HDS JMP CHECK2 MAKE RANGE CHECK SUB HDS,A DECREASE SUB =1,A SIZE CHECK2 CSK A,EHD WITHIN RANGE? CSK A,SHD JMP TESTE2 NO NOP COPY A,HCUR YES, SAVE IT COPY SECS,A JST MASK GET SECTOR MASK COPY X,TEMP2 TESTE3 JST RANDOM GET SECTOR NO AND TEMP2,A MASK OFF UNWANTED BITS CSK A,SECS JMP CHECK3 MAKE RANGE CHECK SUB SECS,A DECREASE SUB =1,A SIZE CHECK3 CSK A,ESEC WITHIN RANGE CSK A,SSEC JMP TESTE3 NO NOP COPY A,SCUR OK COPY NONDES,A SAVE USER STUFF? JEQ A,TESTE5 NO COPY =TEIOBS,X YES, READ IT IN COPY WDS,A COPY A,WC(X) COPY =RDDAT;UPDATE,A JST TESTE4 TESTE5 COPY X,TEMP5 COPY =BUF,A COPY A,TTBUF ADD =2,A COPY A,TTBUF+1 COPY =1,X COPY CCUR,A THE FIRST WORD WORD OF A SECTOR COPY A,TEMP2 IS THE CYLINDER NUMBER JST FILINC SPREAD THE PATTERN COPY TEMP5,X COPY WDS,A JST MASK GET WORD MASK COPY X,TCTEMP TESTE7 JST RANDOM GET WORD LENGTH AND TCTEMP,A MASK OFF UNWANTED BITS JEQ A,TESTE7 CAUTION: DON'T USE 0 WORD CT CSK A,WDS WITHIN RANGE? JMP TESTE8 YES JMP TESTE7 NO TESTE8 COPY =TEIOB1,X INDEX IOB COPY A,TEMP3 SAVE WORD LENGTH COPY A,WC(X) COPY =WRTDAT;UPDATE,A JST TESTE4 DO WRITE OP COPY =RDVER;UPDATE,A JST TESTE 4 DO VERIFY OP JST TESTEC DO READ OP, PARTIAL SEC COPY =TEIOB3,X INDEX 4-WORD WORD CHAIN COPY WDS,A SUB =10,A COPY A,TEMP4  COPY A,0(X) STORE WORD COUNT (WORD 0) COPY =TEIOB2,X INDEX CHAINED IOB JST TESTEC NOW ODO FULL SECTOR READ COPY NONDES,A SAVE USER STUFF? JEQ A,TESTE6 NO COPY =TEIOBS,X YES COPY =WRTDAT;UPDATE,A JST TESTE4 WRITE IT BACK OUT TESTE6 IMS TEMP1 BUMP COUNTER JMP TESTE1 JMP TSTEND EXIT * LPOOL TITL TEST E SUBROUTINES (TESTEC) ***************************** * * TESTEC - READ/DATA COMPARE * * THIS SUBROUTINE IS USED BY TEST E TO DO * A READ OPERATION THEN COMPARE THE DATA *  FOR A MISMATCH. * * CALLING SEQUENCE: * COPY =IOB ADDRESS,X * JST TESTEC * ***************************** * TESTEC ENT READ/WORD COMP ROUTINE COPY =0,A CLEAR BUF JST FILCON COPY =RDDAT;UPDATE,A COPY A,OP(X) STORE OPCODE JST RYINIT RESET RETRIOES WORD TE4E WORD TE4F TE4E JST TE4C DO READ COPY WC(X),A IF SKIP BIT NOT ON, JGE A,TE4G ITS PARTIAL READ COPY =BUF,A ELSE ITS A FULL READ COPY A,MISCAD FOR WHICH THE FIRST TEN COPY =0,A WORDS ARE ZERO COPY A,EXP COPY =-10,A COMPARE FIRST TEN WORDS JST COMPAR FOR ZERO JMP TESTEE MISCOMPARE COPY =10,A IS RANDOM LENGTH 10 SUB TEMP3,A OR LESS? JLT A,TE4J NO  COPY TEMP4,X YES,NEXT TEMP4 WORDS SHOULD BE NEG X JMP TE4H 4294 TE4J COPY =10,A COMPARE RANDOM PATTERN ADD TEMP2,A PLUS 10 COPY A,EXP COPY TEMP3,A FOR A LENGTH OF SUB =10,A TEMP3-10 JST COMPAR JMP TESTEE MISCOMPARE COPY TEMP4,A NOW COMPARE THE NEXT NEG A ADD TEMP3,A TEMP4-(TEMP3-10) WORDS SUB =10,A FOR 4294 JEQ A,TESTED COPY A,X JMP TE4H TE4G COPY =BUF,A PARTIAL READ COMPARE. COPY A,MISCAD COMPARE FIRST TEMP3 WDS COPY TEMP2,A OF TEMP2 PATTERN COPY A,EXP COPY TEMP3,A JST COMPAR JMP TESTEE MISCOMPARE COPY =0,A NOW COMPARE REMAINEDER COPY A,EXP SHOULD BE ZERO. COPY WDS,A NEG A ADD TEMP3,A JEQ A,TESTED JMP TE4M TE4H COPY =PAT,A SETEXP PATTERN COPY A,EXP COPY X,A SET LENGTH COPY ADRIOB,X RESTORE IOB ADDR TE4M EQU $ JST COMPAR JMP TESTEE MISCOMPARE TESTED JST RETRY RETRY ON ERROR TE4F JMP *TESTEC EXIT TESTEE EQU $ COPY =50,A WORD MISCOMPARE JST ERROR JST ERSET JMP TESTED COPY =BUF,X COPY WDS,A DO BUFF DUMP NEG A JST DUMP JMP TESTED * LPOOL TITL TEST E SUBROUTINES (TESTE4) ***************************** * * TESTE4 - RETRY I/O * * THIS SUBROUTINE IS USED BY TEST E TO * RETRY AN I/O OPERATION. * * CALLING SEQUENCE: * COPY =OP CODE,A * JST TESTE4 * ***************************** * TESTE4 ENT COPY A,OP(X) STORE OPCODE JST RYINIT RESET RETRIES WORD TE4A WORD TE4B TE4A JST TE4C DO I/O JST RETRY RETRY ON ERROR TE4B JMP *TESTE4 EXIT TITL TEST E SUBROUTINES (TE4C) ***************************** * * TE4C - DO I/O * * THIS SUBROUTINE IS USED BY TEST E TO * DO THE I/O OPERATION. * * CALLING SEQUENCE: * COPY =IOB ADDRESS,X * JST TE4C * ***************************** * TE4C ENT JST MKIOB BUILD IOB JST DOIO DO I/O JST STATUS CK STATUS JST NXTHDR SEE WHAT NEXT DMA ADDR COPY CNEXT,A SHOULD BE, THEN COMPARE XOR CS(X),A IT TO THE IOB JNE A,TSTE4A MISCOMPARE COPY =:FF,A AND HNEXT,A NOW DO THE HEAD NO XOR HS(X),A JNE A,TSTE4A MISCOMPARE COPY =:FF,A NOW DO SECTOR NO XOR SSS(X),A AND SNEXT,A JEQ A,TSTE4B OK  TSTE4A COPY =51,A IOB NOT UPDATED JST ERROR CORRECTLY TSTE4B JMP *TE4C EXIT * LPOOL TITL TEST E IOBS * TEIOB1 RES 6,0 TEST E IOB WORD BUF WORD INTLOC RES 4,0 * TEIOBS RES 6,0 TEST E SAVE IOB WORD SAVBUF WORD INTLOC RES 4,0 * TEIOB2 RES 5,0 CHAINED READ IOB WORD :800A SKIP TEN WORDS WORD BUF WORD INTLOC WORD TEIOB3 RES 3,0 * TEIOB3 WORD 0 WORD CHAIN IOB WORD BUF+10  WORD 0,0 TITL TEST F - INITALIZE TESTING/ ***************************** * * TEST F - INITIALIZE TEST * * THIS TEST VERIFIES THAN AN INITALIZE (SELP R,DA:4) * FUNCTION, ISSUED BEFORE A PREVIOUS OPERATION HAS * TERMINATED, WILL ABORT THE OPERATION AND RESET THE * I/O INTERRUPT. * * THIS IS DONE AS FOLLOWS: * * THIS IS DONE BY ISSUING A READ REAGARDLESS FUNCTION * TO THE INSIDE CYLINDER. AN INITIALIZE IS ISSUED * BEFORE THE READ HAS COMPLETED. THEN A TIMEOUT IS * ENTERED TO ALLOW SUFFICIENT TIME TO TERMINATE. AN * ERROR IS REPORTED IF AN I/O INTERRUPT SUBSEQUENTLY * OCCURS, OR IF THE INPUT BUFFER IS ALTERED. * ***************************** * TESTF EQU $ TEST F - INITIALIZE TEST COPY ='F',A PRINT TEST F TITLE JST TSTITL JST PREP RESET DMA ADDR, DRIVE COPY =TFIOB,X INDEX RD REG IOB JST RYINIT RESET RETRIES WORD TF3 WORD TF6 TF3 EQU $ SBIT 8,S COPY =RDRG,A COPY A,OP(X) JST MKIOB SET UP RESTOF IOB COPY =-1,A FILL BUF WITH FFFF JST FILCON JST TIMER RESET TIME CONSTANTS JST OTX SELECT RD REGARDLESS JST SEL INITIALIZE JST TIME TIME OUT JMP $-1 JMP TF5 OK, NO INTERRUPT TFINT EQU $ RD REGARDLESS INT PT JST $+1 SERVICE INTERRUPT NOP COPY =60,A INTERRUPTED AFTER INIT JST ERROR TF5 EQU $ COPY CST(X),A GET STATUS ADD =1,A SHOULD BE UNCHANGED JEQ A,TF1 (FFFF) COPY =61,A ERROR. STATUS CHANGED JST ERROR SAY SO TF1 COPY =BUF,X CHECK BUFFER. SHOULD BE COPY 0(X),A UNCHANGTED (FFFF) AND 1(X),A AND 2(X),A AND 3(X),A AND 4(X),A ADD =1,A JEQ A,TESTF2 OK COPY =62,A ERROR. BUF ALTERED JST ERROR JST ERSET JMP TESTF2 COPY CAR,A SEE IF ERRORS WANTED SHIFT A,RO,2 JT OV,TESTF2 NO JST MSGA YES, DISPLAY ACTUAL HDR WORD ACTHDM COPY =BUF,A INDEX HDR BUFFER JST TSTB1F PRINT ITOUT TESTF2 JST RETRY RETRY ON ERROR TF6 JMP *$+1 WORD TSTEND EXIT * TFIOB RES 5,0 RD REGARDLESS IOB WORD 5 LENGTH OF HEADER WORD BUF WORD TFINT INT LOC RES 4,0 * LPOOL TITL TEST G - FORCED ERRORS TEST ***************************** * * TEST G - FORCED ERRORS TEST. * * THE FOLLOWING ERRORS ARE FORCED: * * SYNC ERROR (HEAD = :FF) -- NOT RUN FOR MED CAP DISKS * FAULT (HEAD = :FF) -- NOT RUN FOR MED CAP DISKS * RATE ERROR (TWO CHAINGED IOBS IN A CLOSED LOOP) * NO ID COMPARE (CYL FLAG BITS ON) * ILLEGAL OPERATION (:7FFF) *  END OF MEDIA -- NOT RUN IF SHORT TESTING REQUESTED * ***************************** * TESTG EQU $ TEST G - FORCED ERRORS COPY ='G',A PRINT TEST G TITLE JST TSTITL JST PREP RESET DISK, DMA ADDR COPY DISK,A CLSN ='M',A SKIP SYNC AND FAULT ERROR TESTING JMP TGB FOR MED CAP DISKS COPY =TGIOB1,X INDEX IOB COPY =RDDAT,A DO A READ COPY A,OP(X) JST RYINIT RESET RETRIES WORD TG1 WORD TG2 TG1 EQU $ JST MKIOB COPY =:FF,A SET ILLEGAL HEAD NUMBER COPY A,HS(X) JST DOIO COPY CST(X),A GET STATUS  XOR =:8490,A IS IT SYNC ERROR? JEQ A,TESTG1 YES, OK COPY =71,A ERROR. NO SYNC ERROR JST ERROR OCCURRED TESTG1 JST RETRY RETRY ON ERROR TG2 EQU $ COPY =FRMT,A PREPARE FOR FAULT ERROR COPY A,OP(X) USE FORMAT FC JST RYINIT RESET RETRIES WORD TGA WORD TGB TGA EQU $ JST MKIOB SET UP IOB COPY =:FF,A USE HEAD FF COPY A,HS(X) JST DOIO DO THE OPERATION COPY CST(X),A GET STATUS  AND =4,A ISOLATE FAULT BIT JNE A,TGC IS IT ON? COPY =70,A NO, ERROR REPORT JST ERROR NO FAULT ERROR TGC EQU $ JST RETRY RETRY ANY ERRORS TGB EQU $ COPY =TGIOB1,X INDEX IOB COPY =RDDAT,A READ FUNC COPY A,OP(X) COPY =1,A WORD LENGTH =1 COPY A,WC(X) COPY =TGIOB2,A CHAIN THE IOBS COPY A,NB(X) JST PREP RESET STUFF JST RYINIT RESET RETRIES WORD TG3 WORD TG4 TG3 EQU $ JST MKIOB SET UP REST OF IOB JST DOIO COPY CST(X),A GET STATUS XOR =:8402,A IS IT RATE ERROR? JEQ A,TESTG2 YES, OK COPY =72,A ERROR. NO RATE ERROR STATUS JST ERROR OCCURRED. TESTG2 EQU $ NOW DO NO ID COMPARE JST RETRY RETRY ON ERROR TG4 EQU $ COPY =0,A RESET CHAINED STUFF COPY A,NB(X) COPY =:C000,A SET FLAG BITS IN CYL NO COPY A,CS(X) JST RYINIT RESET RETRIES WORD TG5 WORD TG6 TG5 EQU $ JST DOIO DO IT COPY CST(X),A GET STATUS XOR =:8410,A IS IT NO ID COMP? JEQ A,TESTG3 YES, OK COPY =73,A ERROR. DIDNT GET A JST ERROR NO ID COMPARE STATUS TESTG3 EQU $ NOW DO ILLEGAL OP CODE JST RETRY RETYR ON ERROR TG6 EQU $ COPY =:7FFF,A COPY A,OP(X) JST RYINIT RESET RETRIES WORD TG7 WORD TG8 TG7 EQU $ JST MKIOB JST DOIO DO IT COPY CST(X),A GET STATUS XOR =:8400,A RIGHT STATUS? JEQ A,TESTG4 YES, OK COPY =74,A ERROR. DIDNT GET JST ERROR ILLEGAL OP CODE STATUS TESTG4 EQU $ JST RETRY RETRY ON ERROR TG8 EQU $ COPY SHORT,A DON'T RUN END OF MEDIA TEST JNE A,TG10 IF SHORT TEST SPECIFIED COPY =TGIOB3,X INDEX IOB COPY =RDDAT,A READ FUNC COPY A,OP(X) COPY UCUR,A GET UNIT COPY A,US(X) COPY CYLS,A DO LAST CYL SUB =1,A COPY A,CS(X) COPY EHD,A GET LAST HEAD COPY A,HS(X) TO IOB WORD 3 COPY SECS,A SUB =1,A LAST SECTOR COPY A,SSS(X) TO IOB WORD 4  COPY WDS,A ADD =1,A EXCESS WORD COUNT COPY A,WC(X) TO IOB WORD 5 TG8B JST RYINIT RETRY RESET WORD TG9 WORD TG10 TG9 EQU $ JST DOIO READ PAST LAST SEC COPY CST(X),A GET STATUS XOR =:8C00,A SHD BE END OF MEDIA JEQ A,TESTG5 OK COPY =75,A NO END OF MEDIA STATUS JST ERROR TESTG5 EQU $ JST RETRY RETRY ON ERROR TG10 JMP *$+1 WORD TSTEND EXIT * LPOOL TITL TEST G IOBS * TGIOB1 EQU $ TEST G IOB RES 5,0 WORD 1 WORD LENGTH WORD BUF BUFFER AD WORD INTLOC INT LOC RES 4,0 * TGIOB2 WORD 1 CHAINED IOB FOR RATE ERR WORD BUF WORD 0 WORD TGIOB2 * TGIOB3 EQU $ WORD RDDAT,0,0,0,0,0 WORD BUF,INTLOC,0,0,0,0 TITL TEST H - RETURN NEXT ADDRESS TEST ***************************** * * TEST H - RETURN NEXT ADDRESS TEST * * THIS TEST VERIFIES THE OPERATION OF THE 'RETURN * NEXT ADDRESS' FEATURE FOR SEEK, TIO, AND READ- * REGARDLESS FUNCTIONS. * * THESE FUNCTIONS ARE EACH EXECUTED WITHOUT THE * UPDATE BIT ON IN THE OPCODE. THEN THEY ARE * EXECUTED A SECOND TIME, THIS TIME WITH THE UPDATE * BIT ON. IN EVERY CASE, IT IS EXPECTED THAT THE * ADDRESS IN THE IOB WILL REMAIN UNCHANGED. * * PART 2 OF TEST H IS THE HIGH MEMORY TEST. THE * HIGHEST READ/WRITE LOCATION IS FOUND . AN * INCREMENTING PATTERN IS WRITTEN FOR 1 SECTOR, * THEN READ INTO THE ORIGINAL OUTPUT BUFFER TO MAKE *  SURE THAT WHAT WAS READ EQUALS WHAT WAS WRITTEN. * THIS IS PERFORMED UNDER THREE CONDITIONS: * * 1) IOB AT END-OF-MEMORY, DATA BUFFER IN LOW MEMORY, * 2) IOB IN LOW MEMORY, DATA BUFFER AT END-OF-MEMORY, * 3) IOB AND DATA BUFFER AT END-OF-MEMORY. * * PART 3 OF TEST H IS THE INTERRUPT LEVELS TEST. A TIO * OPERATION IS PERFORMED WITH AN INTERRUPT ADDRESS IN * IOB WORD 7. FOUR I/O'S ARE PERFORMED WITH BITS 12 * AND 13 OF THE PSW SET AS FOLLOWS: * * PASS PSW BIT 13 PSW BIT 12 ACTION * ---- ---------- ---------- ------ * *  1 OFF ON SUPPRESS INT. TIME OUT * 2 ON ON SUPPRESS INT. TIME OUT *  3 OFF OFF SHOULD REACH INT. ADDR. * 4 ON OFF SHOULD REACH INT. ADDR. * ***************************** * TESTH EQU $ COPY ='H',A OUTPUT TEST TITLE JST TSTITL COPY =:8000,A OUTPUT RUN INDICATOR OR =1,A SELP A,4 JST PREP RESET DISK, ADDRESSES COPY =THIOB2,X INDEX IOB COPY X,ADRIOB JST MKIOB SET UP ADDRESS COPY =THIOB1,X NOW SET UP ADDRESS FOR COPY X,ADRIOB JST MKIOB REAL IOB. COPY =-6,A (THIOB1 IS ACTUAL IOB, COPY A,TEMP1 THIOB2 IS COMPARATOR IOB. TESTH1 COPY TEMP1,A FIND OPCODE IN TABLE ADD =THTBL+6,A COPY A,TEMP2 COPY TEMP2,Y COPY 0(Y),A COPY A,OP(X) STORE OPCODE JST RYINIT RESET RETRIES WORD TH1 WORD TH2 TH1 EQU $ JST DOIO DO OPERATION JST STATUS CHECK STATUS COPY THIOB2+CS,A COMPARE CYL NO XOR THIOB1+CS,A JNE A,TESTH2 MISCOMPARE COPY THIOB2+HS,A COMPARE HEADNO XOR THIOB1+HS,A JNE A,TESTH2 MISCOMPARE COPY THIOB2+SSS,A XOR THIOB1+SSS,A COMPARE SECTOR NO JEQ A,TESTH3 OK TESTH2 COPY =80,A MISCOMPARE JST ERROR TESTH3 EQU $ JST RETRY RETRY ON ERROIR TH2 EQU $ IMS TEMP1 DO NEXT OPCODE JMP TESTH1 * * HIGH MEMORY TEST * FIND END OF MEMORY--- STORE IN EOMPTR * TESTH4 EQU $ COPY =TESTH5:,A COPY A,UNMET+3 SBIT 6,S ALLOW 64K ADDRESSING COPY =:8002,A OUTPUT RUN INDICATOR SELP A,4 COPY FLBTOP,X MAX MEMORY +1K-1 JMP $+2 TESTH5: ENT TESTH5 SUB FLBDEC,X SUBTRACT MEMORY INCREMENT COPY =:55,A GET PATTERN EXCH 0(X),A WRITE IT OUT EXCH 0(X),A AND READ IT BACK IN SUB =:55,A IS IT THE SAME? JNE A,TESTH5 NO--KEEP TRYING EXCH 0(X),A IF SO, TRY THE SAME THING EXCH 0(X),A WITH A ZERO JNE A,TESTH5 KEEP TRYING IF NOT ZERO * * EOM FOUND * COPY X,EOMPTR PTR TO LAST READ/WRITE CELL COPY =UNMET:,A COPY A,UNMET+3 SBIT 8,S * *IOB IN HIGH MEMORY--WORD BUFFER IN LOW MEMORY * TESTH6 COPY =0,A COPY A,TEMP1 ERROR INCREMENT COPY EOMPTR,A SUB =11,A ALLOW 12 HIGH MEM WORDS COPY A,EOMIOB IOB IN HIGH MEMORY JST PREP RESET DISK ADDRESSES COPY =BUF,X BUFFER ADDRESS JST TSTHR1 SET UP OUTPUT BUFFER COPY EOMIOB,X COPY =BUF,A GET BUFF ADDR COPY A,MA(X) STORE IT IN IOB COPY EOMIOB,X JST TSTHR3 BUILD PART OF IOB JST RYINIT RESET RETRIES WORD TEST6H WORD TESTH7 TEST6H COPY EOMIOB,X JST MKIOB BUILD REST OF IOB FOR WRITE JST DOIO DO I/O JST STATUS GET STATUS JST RETRY RETRY IF ERROR TESTH7 COPY EOMIOB,X COPY =RDDAT,A READ WORD BACK INTO BUFF COPY A,OP(X) JST RYINIT RESET RETRIES WORD TEST77 WORD TESTHA TES T77 COPY EOMIOB,X JST MKIOB SET UP I/O FOR READ JST DOIO DO I/O JST STATUS GET STATUS COPY =BUF,X JST TSTHR2 SEE IF WE READ WHAT WE WROTE JST TSTHR4 NO--OUTPUT ERROR MESSAGE JST RETRY RETRY ON ERROR JMP TESTHA * LPOOL TITL * *IOB IN LOW MEMORY--WORD BUFFER IN HIGH MEMORY * TESTHA COPY =1,A COPY A,TEMP1 ERROR INCREMENT COPY EOMPTR,A SUB WDS,A ADD =1,A COPY A,EOMBUF WORD BUFF IN HIGH MEMORY COPY EOMBUF,X GET WORD BUF ADDRESS JST TSTHR1 SET UP OUTPUT BUFFER COPY =THIOB3,X COPY EOMBUF,A COPY A,MA(X) PUT BUFFER ADDR IN IOB JST TSTHR3 BUILD PART OF IOB JST RYINIT RESET RETRIES WORD TESTHB WORD TESTHC TESTHB JST MKIOB SET UP REST OF IOB FOR WRITE JST DOIO DO I/O JST STATUS GET STATUS JST RETRY RETRY ON ERROR TESTHC COPY =THIOB3,X COPY =RDDAT,A READ WORD BACK INTO BUFFER COPY A,OP(X) JST RYINIT RESET RETRIES WORD TESTHD WORD TESTHF TESTHD JST MKIOB SET UPIOB FOR READ JST DOIO DO I/O JST STATUS GET STATUS COPY EOMBUF,X GET BUFF ADDRESS JST TSTHR2 SEE IF WE READ WHAT WE WROTE JST TSTHR4 NO--OUTPUT ERROR MESSAGE JST RETRY RETRY ON ERROR * *BOTH IOB AND BUFF IN HIGH MEMORY * TESTHF COPY =2,A COPY A,TEMP1 ERROR INCREMENT COPY EOMPTR,A SUB WDS,A ADD =1,A COPY A,EOMBUF WORD BUFF IN HIGH MEMORY SUB =12,A COPY A,EOMIOB IOB IN HIGH MEMORY COPY EOMBUF,X JST TSTHR1 SET UP OUTPUT BUFFER COPY EOMIOB,X COPY EOMBUF,A GET BUFF ADDR COPY A,MA(X) STORE IT IN IOB  JST TSTHR3 BUILD PART OF IOB JST RYINIT RESET RETRIES WORD TESTHG WORD TESTHH TESTHG COPY EOMIOB,X JST MKIOB BUILD REST OF IOB FOR WRITE JST DOIO DO I/O JST STATUS GET STATUS JST RETRY RETRY ON ERROR TESTHH COPY EOMIOB,X COPY =RDDAT,A READ WORD BACK INTO BUFFER COPY A,OP(X) JST RYINIT RESET RETRIES WORD TESTHI WORD TESTHJ TESTHI JST MKIOB SET UP I/O FOR READ JST DOIO DO I/O JST STATUS GET STATUS COPY EOMBUF,X GET BUFF ADDR JST TSTHR2 SEE IF WE READ IN WHAT WE WROTE JST TSTHR4 NO--OUTPUT ERROR MESSAGE JST RETRY RETRY IF ERROR TESTHJ RBIT 6,S END 64K TEST JMP TESTHK THIS PART OF TEST FINISHED * LPOOL TITL TEST H - SUBROUTINES (TSTHR1) ***************************** * * TSTHR1 - SET UP OUTPUT BUFFER * * THIS SUBROUTINE WILL SET UP THE OUTPUT * BUFFER CONTAINING THE INCREMENTING * PATTERN. * * ENTER WITH XR = BUFFER ADDRSS. * * CALLING SEQUENCE: * COPY =BUFFER ADDRESS,X * JST TSTHR1 * **************************** * TSTHR1 ENT COPY X,TCTEMP SAVE X COPY WDS,A NEG A COPY A,TEMP2 NEG WD COUNT COPY =0,A H6 COPY A,0(X) ADD =1,X BUMP BUFFER INDEX ADD =1,A BUMP PATTERN IMS TEMP2 BUMP WD COUNT JMP H6 COPY TCTEMP,X RESTORE X JMP *TSTHR1 TITL TEST H - SUBROUTINES (TSTHR2) ***************************** * * TSTHR2 - EXAMINE INPUT BUFFER * * THIS SUBROUTINE WILL EXAMINE THE INPUT * BUFFER AFTER A READ OPERATION. * * ENTER WITH XR = BUFFER ADDRESS. RETURN * TO CALL+1 IF MISCOMPARE, OTHERWISE, CALL+2. * * CALLING SEQUENCE: * COPY =BUFFER ADDRESS,X * JST TSTHR2 * JMP ? MISCOMPARE R *  JMP ? GOOD R+1 * ***************************** * TSTHR2 ENT COPY X,TCTEMP SAVE X COPY WDS,A NEG A COPY A,TEMP2 NEG WD COUNT COPY =0,A COPY A,TEMP3 H7 COPY 0(X),A CSK A,TEMP3 JMP H8 MISCOMPARE JMP H8 MISCOMPARE IMS TEMP3 BUMP PATT ERN ADD =1,X BUMP BUFFER INDEX IMS TEMP2 BUMP WD COUNT JMP H7 IMS TSTHR2 MADE IT! H8 COPY TCTEMP,X RESTORE X JMP *TSTHR2 TITL TEST H - SUBROUTINES (TSTHR3) ***************************** * * TSTHR3 - BUILD IOB * * THIS SUBROUTINE BUILDS WORDS 0, 5, 7, * AND 8 OF THE IOB FOR A WRITE OPERATION. * * ENTER WITH XR = IOB ADDRESS. * * CALLING SEQUENCE: * COPY =IOB ADDRESS,X * JST TSTHR3 * ***************************** * TSTHR3 ENT COPY =WRTDAT,A COPY A,OP(X) WRITE WORD OP CODE COPY WDS,A COPY A,WC(X) WRITE 1 SECTOR COPY =0,A COPY A,IN(X) NO INTERRUPTS COPY A,NB(X) NO WORD CHAINING JMP *TSTHR3 TITL TEST H - SUBROUTINES (TSTHR4) ***************************** * * TSTHR4 - OUTPUT ERROR MESSAGE * *  THIS SUBROUTINE WILL OUTPUT AN ERROR * MESSAGE 'TEMP1+81'. IT WILL DUMP THE * BUFFER. * * CALLING SEQUENCE: * JST TSTHR4 * ***************************** * TSTHR4 ENT COPY =81,A DIDN'T READ IN WHAT WE WROTE OUT ADD TEMP1,A JST ERROR COPY ADRIOB,X COPY MA(X),A GET BUFF ADDR COPY A,X TO X COPY WDS,A NEG A NEG WD COUNT TO A JST DUMP DUMP BUFFER H9 JMP *TSTHR4 * LPOOL TITL TEST H - INTERRUPT LEVELS TEST ***************************** * * TEST H - INTERRUPT LEVELS TEST * * THIS IS THE SECOND PART OF TEST H. * ***************************** * *BIT 12 OF PSW ON. THIS SHOULD SUPPRESS INTERRUPTS + CAUSE TIME OUT * TESTHK COPY =:8003,A SET RUN INDICATOR SELP A,4 COPY =-2,A TWO-PASS COUNTER COPY A,TEMP1 RBIT 8,S JST SEL RESET THE DISK COPY =:1000,A PASS 1: PSW BIT 12 ON; BIT 13 OFF TSTHK COPY A,BITMSK COPY =THIOB4,X JST RYINIT SET UP RETRIES WORD TESTHL WORD TESTHM TESTHL COPY S,A UPDATE PSW OR BITMSK,A COPY A,S UIS SBIT 8,S ENABLE INTERRUPTS JST TIMER RESET TIME COPY =THIOB4,X JST OTX INITIATE THE I/O JST TIME TIME THE I/O JMP $-1 3-SECOND DELAY RBIT 8,S TIMER EXPIRED. GOOD JST SEL RESET THE DISK JMP TESTHM PERFORM NEXT PASS THINT1 EQU $ OOPS! GOT AN INTERRUPT JST $+1 SERVICE IT NOP COPY =85,A GOT AN INTERRUPT WHEN PSW BIT 12 ON JST ERROR JST RETRY RETRY THE I/O TESTHM IMS TEMP1 BUMP PASS COUNTER JMP TESTHN DO PASS 2 JMP TESTHO GO TO PASS 3 TESTHN COPY =:3000,A PASS 2: PSW BIT 12 ON; BIT 13 ON JMP TSTHK * *BIT 12 OF PSW OFF. THIS SHOULD ALLOW INTERRUPTS. * TESTHO EQU $ COPY =-2,A TWO-PASS COUNTER COPY A,TEMP1 RBIT 8,S JST SEL RESET THE DISK COPY =:EFFF,A PASS 3: PSW BIT 12 OFF;BIT 13 ON TESTHP COPY A,BITMSK COPY =THIOB5,X JST RYINIT SET UP RETRIES WORD TESTHQ WORD TESTHR TESTHQ COPY S,A UPDATE PSW AND BITMSK,A COPY A,S UIS SBIT 8,S ENABLE INTERRUPTS JST TIMER RESET TIME COPY =THIOB5,X JST OTX INITIATE THE I/O JST TIME TIME THE I/O JMP $-1 3-SECOND DELAY RBIT 8,S TIMED OUT. ERROR JST SEL RESET THE DISK COPY =86,A NO INTERRUPT WHEN PSW BIT 12 OFF JST ERROR JST RETRY THINT2 EQU $ GOOD. INTERRUPT OCCURRED JST $+1 SERVICE IT NOP TESTHR IMS TEMP1 JMP TESTHS DO PASS 4 JMP TSTEND EXIT TESTHS COPY =:CFFF,A PASS 4: PSW BIT 12 OFF; BIT 13 OFF JMP TESTHP * LPOOL TITL TEST H IOBS * THIOB1 RES 5,0 WORD 6,BUF,INTLOC RES 4,0 * THIOB2 RES 12,0 * THIOB3 RES 12,0 * THIOB4 RES 6,0 TIO IOB WORD BUF FOR PSW BIT 12 ON WORD THINT1 RES 4,0 * THIOB5 RES 6,0 TIO IOB WORD BUF FOR PSW BIT 12 OFF WORD THINT2 RES 4,0 * THTBL WORD  SEEK WORD TIO WORD RDRG WORD SEEK;UPDATE WORD TIO;UPDATE WORD RDRG;UPDATE * EOMPTR WORD 0 POINTER TO END OF MEMORY EOMIOB WORD 0 POINTER TO EOM IOB EOMBUF WORD 0 POINTER TO EOM WORD BUFFER FLBTOP WORD MEMINC-1 START SEARCHING FOR EOM HERE FLBDEC WORD MEMINC BITMSK WORD 0 PSW MASK TITL FORMATTER ***************************** * * FORMATTER - THIS IS THE FORMMATTING ROUTINE * * IT FORMATS THE ENTIRE DISK (OR PART OF A * DISK) IN STANDARD CAI FORMAT. * * EACH SECTOR IS SEQUENTIALLY LINKED TO THE NEXT * SECTOR AND WHEN ALL HEADS ARE EXHAUSTED, LINKAGE * CONTINUES WITH THE NEXT CYLINDER. THE LAST SECTOR * OF THE LAST SPECIFIED TRACK IS FLAGGED 'END OF * MEDIA' (SECTOR BLOCK WORDS 2 AND 3 = :FFFF). * * BAD TRACKS HAVE :F000 OR'ED INTO THE UPPER FOUR * BITS OF WORDS 0 AND 2 OF EACH SECTOR BLOCK. * SEQUENTIAL LINKING WILL CONTINUE. THE BAD * CYLINDER AND HEAD ARE OUTPUT ON THE CRT/TTY. * ***************************** * FMATTR EQU $ JST PREP INITIALIZE COPY =TAIOB,X INDEX TEST A IOB COPY X,ADRIOB COPY =TIO,A COPY A,OP(X) COPY =0,A COPY A,IN(X) NO INTERRUPTS JST MKIOB SET UP IOB JST DOIO JST MKIOB SET UP IOB AGAIN JST DOIO DO I/O AGAIN JST STALT CHECK STATUS FMATR3 EQU $ COPY ECYL,A GET ENDING CYLINDER ADD =1,A COPY A,FMAT3B SET UP LAST CYL+1 COPY SCYL,A GET STARTING CYLINDER COPY SHD,X GET STARTING HEAD * FMAT3A COPY A,FMCS SAVE CURRENT CYLINDER SELP A,4 COPY A,FMCN WHICH IS ALSO NEXT CYLINDER COPY X,FMHS SAVE CURRENT HEAD COPY X,FMHN WHICH IS ALSO NEXT HEAD JST FMBUMP BUMP TO FIND LAST CYL/HD FMAT3B WORD $-$ CYL LIMIT COPY A,FMCL STORE NEW LAST CYL COPY X,FMHL STORE NEW LAST HEAD COPY =-5,A FIVE RETRIES ALLOWED COPY A,FMRET BEFORE BAD TRACK FLAGGED COPY =0,A COPY A,FMFLAG FLAG=0=NORMAL FMAT COPY =BUF,X INDEX BUFFER  JST FMBLD BUILD TRACK HDR FMATB3 JST FMWRIT FORMAT A TRACK JMP FMAT3L GOOD WRITE. CONTINUE IMS FMRET BAD FORMAT. BUMP RETRY COUNT JMP FMATB3 AND TRY AGAIN JMP FMATNG BAD TRACK--FLAG IT FMAT3L COPY FMCL,A SEE IF LAST CYL REACHED ADD =1,A IS FMCL=:FFFF? JNE A,$+2 NO JMP ENT2B YES--RESTART PROGRAM COPY FMCL,A UPDATE FMCL AND FMHL COPY FMHL,X JMP FMAT3A CONTINUE WITH NEXT TRACK FMATNG EQU $ BAD TRACK FOUND JST MSGA SAY SO WORD BADTRK COPY FMCS,A PRINT CYL NO JST ODEC JST MSGA WORD BADTK1 AND HEAD NO COPY FMHS,A JST ODEC COPY =:F000,A SET BAD TRK FLAG COPY A,FMFLAG COPY =BUF,X INDEX BUFFER JST FMBLD BUILD BAD TRACK HEADER JST FMWRIT WRITE BAD TRACK HEADER NOP IGNORE STATUS--WE KNOW ITS BAD JMP FMAT3L CONTINUE * LPOOL TITL FORMATTER - SUBROUTINES (FMBUMP) ***************************** * * FMBUMP - INCREMENT PARAMETERS * * THIS SUBROUTINE WILL INCREMENT THE CURRENT * CYLINDER, HEAD TO HEXT VALUE. * * ENTER WITH; * AR = CURRENT CYLINDER * XR = CURRENT HEAD * * EXIT WITH; * AR = CURRENT CYLINDER, OR IF HEADS OVERFLOW, * NEXT HIGHEST CYLINDER * XR = NEXT HIGHEST HEAD, IF CYLINDER IS INCREMENTED, * OTHERWISE, THE INITIAL HEA NUMBER. * * IF CYLINDER NUMBER REACHES LAST LEGAL CYLINDER, THEN * AR AND XR ARE RETURNED WITH :FFFF. * * CALLING SE QUENCE: * COPY =CURRENT CYLINDER,A * COPY =CURRENT HEAD,X * JST FMBUMP * WORD (LAST LEGAL CYLINDER NUMBER) * ***************************** * FMBUMP ENT COPY A,FMBMPC SAVE CURRENT CYL COPY X,FMBMPH SAVE CURRENT HEAD IMS FMBMPH BUMP HEAD FIRST COPY FMBMPH,A CSK A,EHD HAS HEAD OVERFLOWED? JMP FMBMP0 NO JMP FMBMP2 YES IT HAS FMBMP0 COPY FMBMPH,X RESTORE X WITH NEW HEAD FMBMP1 IMS FMBUMP BUMP PAST DELIMITER COPY FMBMPC,A JMP *FMBUMP AND RETURN WITH BUMPED HEAD FMBMP2 COPY SHD,X RESTORE STARTING HEAD COPY X,FMBMPH IMS FMBMPC NOW BUMP CYL COPY *FMBUMP,A COMPARE IT TO DELIMITER SUB FMBMPC,A JLE A,FMBMP3 ALLCYLINDERS USED UP COPY FMBMPC,A NOT AT END YET JMP FMBMP1 RETURN WITH BUMPED CYL FMBMP3 COPY =-1,A FLAG END OF MEDIA COPY =-1,X IMS FMBUMP JMP *FMBUMP * FMBMPC WORD 0 CYL SAVE CELL FMBMPH WORD 0 HEAD SAVE CELL * LPOOL TITL FORMATTER - SUBROUTINES (FMBLD) ***************************** * * FMBLD - BUILDS THE HEADERS * * THIS SUBROUTINE BUILDS THE HEADERS NEEDED TO * FORMAT ONE TRACK. IT REQUIRES THE FOLLOWING * UPON ENTRY: * * XR = HEADER ADDRESS * FMCS = HEADER WORD 0 (CURRENT CYLINDER) * FMHS = HEADER WORD 1 (CURRENT HEAD) * FMCN = HEADER WORD 2 (NEXT CYLINDER) * FMHN = HEADER WORD 3 (NEXT HEAD) * WDS = HEADER WORD 4 (NUMBER OF WORDS PER SECTOR) *  FMCL = * FMHL = NEXT CYLINDER AND HEAD, TO BE USED AS WORDS * 2 AND 3 OF LAST SECTOR OF THE HEADER. * FMFLAG = SETTING OF FLAG BITS FOR CYLINDER NUMBER. * :F000 = BAD TRACK * :0000 = NORMAL TRACK * * CALLING SEQUENCE: * COPY =HEADER ADDRESS,X * JST FMBLD * ***************************** * FMBLD ENT COPY SECS,A HEADERS=NO OF SECT/TRACK FMBLD0 NEG A COPY A,FMBLDA COPY SSEC,A COPY A,FMS STARTING SECTOR FMBLD1 COPY FMCS,A GET CURRENT CYL OR FMFLAG,A OR IN FLAG COPY A,0(X) TO SECTOR BLOCK WORD 0 COPY FMS,A GET SECTOR NUMBER SHIFT A,LO,8 MOVE TO MS BYTE OR FMHS,A OR IN CURRENT HEAD COPY A,1(X) TO SECTOR BLOCK WORD 1 IMS FMS BUMP SECTOR NO. COPY FMCN,A GET NEXT CYLINDER OR FMFLAG,A OR IN FLAG COPY A,2(X) TO SECTOR BLOCK WORD 2 COPY FMS,A GET NEXT SECTOR SHIFT A,LO,8 MOVE TO MS BYTE OR FMHN,A OR IN CURRENT HEAD COPY A,3(X) TO SECTOR BLOCK WORD 3 FMBLD2 COPY WDS,A GET WDS PER SECTOR COPY A,4(X) TO SECTOR BLOCK WORD 4 ADD =5,X MOVE BUF PTR TO NEXT SECTOR BLOCK IMS FMBLDA INC SECTOR COUNT JMP FMBLD1 DO NEXT HEADER SUB =5,X OTHERWISE,THIS IS LAST HEADER COPY FMCL,A SO USE FMCL/FMHL STUFF OR FMFLAG,A COPY A,2(X) COPY SSEC,A ALSO GET STARTING SECTOR SHIFT A,LO,8 OR FMHL,A COPY A,3(X) FMBLD3 JMP *FMBLD EXIT * FMBLDA WORD 0 SECTOR NUMBER * * FMBLDC - ALTERNATE ENTRY POINT INTO FORMATTER * SUBROUTINE 'FMBLD' USED IN TEST C. * FMBLDC ENT COPY FMBLDC,A COPY A,FMBLD COPY TCSECS,A GET SECTORS/ TRACK JMP FMBLD0 * LPOOL TITL FORMATTER - SUBROUTINES (FMWRIT) ***************************** * * FMWRIT - BUILD IOB * *  THIS SUBROUTINE BUILDS THE IOB TO BE USED * IN A FORMAT OPERATION. THE FORMAT FUNCTION * WILL FORMAT ONE TRACK. * * CALLING SEQUENCE: * JST FMWRIT * ***************************** * FMWRIT ENT WRITE FORMAT ROUTINE COPY = FMTIOB,X INDEX THE IOB COPY X,ADRIOB COPY =FRMT,A SET UP FORMAT FC COPY A,OP(X) COPY UCUR,A STORE UNIT NO COPY A,US(X) COPY BUF,A STORE CYL NO COPY A,CS(X) COPY =:FF,A AND HEAD NO AND BUF+1,A COPY A,HS(X) COPY =:FF00,A AND BUF+1,A AND SECTOR NO SHIFT A,RO,8 COPY A,SSS(X) COPY SECS,A GET SECTOR BLOCK COUNT COPY A,WC(X) STORE IN IOB WORD 5 JST DINIT RESET THE DISK JST DOIO THDO THE I/O COPY CST(X),A GET STATUS AND =:160,A CRC/FORMAT ERROR? JNE A,FMWRT1 YES, BAD TRACK JST STALT NO, CHECK NORMAL STATUS JMP *FMWRIT EXIT GOOD FMWRT1 IMS FMWRIT BUMP RETURN JMP *FMWRIT BAD RETURN * FMTIOB WORD FRMT FORMAT IOB RES 5,0 WORD BUF WORD INTLOC RES 4,0 * FMCS WORD 0 CURRENT CYL FMHS WORD 0 CURRENT HEAD FMCN WORD 0 NEXT CYL FMHN WORD 0 NEXT HEAD FMCL WORD 0 LAST CYL FMHL WORD 0 LAST HEAD FMS WORD 0 SECTOR NO FMRET WORD 0 RETRY COUNTER FMFLAG WORD 0 MODE FLAG: - :F000 (BAD), :0000 (GOOD) * 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 OR TIMEOUT LOOPS. AS SOON AS * AN OPERATION COMPLETES, IT IS REPEATED. * * ESCAPE IS VIA THE CONSOLE INTERRUPT WHICH RETURNS TO * THE QUERIES. * ***************************** * TECH EQU $ TECH1 EQU $ RBIT 8,S JST SEL KILL ANY DISK INTS SBIT 8,S NEED INTERRUPTS SBIT 4,S FOR CONSOLE TOO COPY =0,A COPY A,TTFC CLEAR PARAMETER TABLE COPY A,TEMP5 RESET INPUT FLAG COPY =-15,A JST MOVE WORD TTFC WORD TTFC+1 COPY WDS,A GET WD COUNT SHIFT A,LO,1 DOUBLE IT COPY A,TTLT FOR MAX WORD LENGTH JST MSGA REQUEST PARAMETERS WORD TTMS JST GNF GET NEXT FIELD COPY A,TTFC SAVE FC AND =:7F7F,A 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 QUERIES JST GNF GET UNIT NO COPY A,TTU SAVE UNIT NO JLT A,TECH1 MUST BE 0-3 SUB =UNITS-1,A JGT A,TECH1 NO, START OVER CLSN =CR:,X DONE? JMP TECH2 YES COPY CYLS,A SUB =1,A COPY A,TCTEMP HIGHEST CYLINDER NO JST GNF NO, GET CYL NO COPY A,TTC SAVE CYL NO COPY =:FFF,A MUST BE WITHIN RANGE AND TTC,A CSK A,TCTEMP JMP $+2 OK TOTT1 JMP TECH1 BAD.START OVER CLSN =CR:,X DONE? JMP TECH2 YES COPY HDS,A SUB =1,A COPY A,TCTEMP HIGHEST HEAD NO JST GNF NO, GET HEAD NO COPY A,TTH SAVE HEAD NO JLT A,TECH1 MUST BE WITHIN RANGE AND =:FF1F,A SUB TCTEMP,A JGT A,TECH1 ERROR. START OVER CLSN =CR:,X DONE? JMP TECH2 YES COPY SECS,A SUB =1,A COPY A,TCTEMP HIGHEST SECTOR NO JST GNF NO, GET SECTOR NO COPY A,TTS SAVE SECTOR NO JLT A,TOTT1 MUST BE WITHIN RANGE SUB TCTEMP,A JGT A,TOTT1 NO, SGART OVER CLSN =CR:,X DONE? JMP TECH2 YES JST IKB GET INTERRUPT REQUEST CLSN ='Y',A Y OR N JMP TECH1A CLSN ='N',A JMP TECH1A TECH1B CLSN =',',A COMMA OK JMP TECH1C CLSN =CR:,A CARRIAGE RETURN OK TOO JMP TECH2 JMP TECH1 ELSE ILLEGAL * LPOOL TITL * TECH1A SUB ='Y',A SET FLAG 0=YES 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 OR 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. SECS CSK A,SECS 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 BUFPAT COPY X,PATFLG JST GNF COPY A,INCCNT JMP TECH2A BUFSET COPY X,PATFLG JST GNF COPY A,TTDP1 TECH2A CLSN X,=CR: JMP TECH2 JST GNF INPUT THE OPTION COPY A,TOPT STORE IT CLSN X,=CR: JMP TECH2 YES JST GNF GET CHAINED LENGTH IF ANY COPY A,TTCL 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 CHAIN WORD PATTERN COPY A,TTCP SAVE INPUT CLSN =',',X COMMA ILLEGAL HERE JMP TECH1 JMP TECH2 * LPOOL TITL TECH2 COPY TTLN,A LENGTH MUST BE AT LEAST 1 JNE A,$+2 IMS TTLN COPY =-6,A FILL IOB WITH ADDRESS JST MOVE WORD TTFC WORD TTIOB1 COPY TTBUF,A STORE BUF AD COPY A,TTIOB1+MA COPY =TTINTL,A STORE INTERRUPT AD 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 =SAVBUF,A AND CHAINED BUF AD COPY A,TTIOB2+1 COPY =:F,A CERTAIN FUNCTIONS AND TTFC,A CANT 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 COPY X,TTIOB1+NB CLSN =FRMT,A FORMAT? COPY X,TTIOB1+SSS YES FIRST SECTOR IS 0 CLSN =FRMT,A IF FORMAT? JMP TECH3 BUILD FORMAT BUFFER CLSN =WRTDAT,A IF WRITE, JMP TECH4 PUT WORD IN 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 BUF WORD BUF+1 JMP TECH5 ELSE DO I/O * LPOOL TITL TECH3 COPY TTH,A BUILD FORMAT BUFFER COPY A,TEMP2 COPY TTLN,A SET COUNT OF HEADERS NEG A COPY A,TEMP1 COPY TTBUF,X INDEX BUFFER TECH3A COPY TTC,A PUT CYLINDER NO COPY A,0(X) IN WORD 1 COPY A,2(X) AND WORD 3 COPY TEMP2,A PUT SECTOR/HD COPY A,1(X) IN WORD 2 ADD =:100,A AND SECTOR+1 COPY A,3(X) IN WORD 4 COPY A,TEMP2 COPY WDS,A PUT SECTOR WD COUNT COPY A,4(X) IN WORD 5 ADD =5,X BUMP TO NEXT HEADER IMS TEMP1 BUMP COUNT JMP TECH3A DO NEXT HEADER SUB =5,X LAST HEADER IS SPECIAL COPY TTH,A BUMP HEAD NO ADD =1,A CSK A,HDS IF HEAD OV,DO NEXT CYL JMP TECHBB NOP JMP TECH3B TECHBB COPY A,3(X) ELSE PUT HEAD+1 IN WD 4 JMP TECH5 TO I/O TECH3B COPY =0,A SECTOR/HEAD=0 COPY A,3(X) COPY =:FFF,A BUMP CYL NO AND TTC,A ADD =1,A XOR CYLS,A LAST CYL ALREADY JEQ A,TECH3C YES IMS 2(X) ELSE BUMP CYL NO JMP TECH5 TO I/O TECH3C COPY =-1,A SET EOMFLAG COPY A,2(X) IN CYL COPY A,3(X) AND SECTOR/HD JMP TECH5 TO I/O TECH4 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 BUF WORD BUF+2 JMP TECH5 TTBFI COPY TTDP,A COPY INCCNT,X JST FILINC JMP TECH5 TTBFD COPY TTDP,A COPY INCCNT,X NEG X JST FILINC COPY TTCP,A PUT CHAINED WORD C OPY A,SAVBUF COPY =-511,A INTO CHAIN BUFFER JST MOVE WORD SAVBUF WORD SAVBUF+1 JMP TECH5 TOTTT JMP TOTT TECH5 JST SEL RESET DISK SBIT 8,S I/O ROUTINE SBIT 4,S ENABLE CONSOLE FOR EXIT COPY =-3,A RESTORE CYL/HD/SECTOR JST MOVE IN CASE UPDATE BIT IS USED WORD TTC WORD TTIOB1+CS JST TIMER RESET TIME COPY =TTIOB1,X GET IOB ADDRESS COPY TTIOB1+IN,A INTERRUPTS? JST OTX DO I/O JEQ A,TECH6 NO JST TIME TIME THE I/O JMP $-1 JT SS,TOTT JMP TECH5 NO INTERRUPT TTINTL EQU $ INTERRUPT PT JST $+1 FOR INTERRUPTS NOP TECH51 COPY TTIOB1+CST,A SELP A,4 COPY TOPT,A SHIFT A,RO,1 JT OV,TTDMP1 JT SS,TOTT JMP TECH5 DO IT AGAIN TECH6 JST SENRDY WAIT UNTIL DONE JMP $+2 NOT DONE 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 JMP TECH1 * LPOOL TITL * * GNF - INPUTS PARAMETERS FOR THE * TECH TEST TO BUILD AN IOB FROM * GNF ENT GET NEXT FIELD ROUTINE JST IHEX INPUT VALUE JEQ X,GNF2 IF ZERO, SEE WHY GNF1 IMS TEMP5 SET INPUT FLAG JST CHRIN CHECK FOR SPECIAL CHAR. JMP GNF4 CR JMP TECH1 # JMP TECH1 _ JMP GNF3 ^ JMP GNF4 , JMP TECH1 ANYTHING ELSE GNF2 COPY IDCTM3,X GET INPUT COUNT JEQ X,GNF1+1 IF ZERO, DON'T SET INPUT FLAG COPY =0,X ELSE SET X TO ZERO AND JMP GNF1 SET INPUT FLAG GNF3 COPY TEMP5,A GET INPUT FLAG JNE A,$+2 IF SET, CAN'T JMP QERY90 ELSE CAN GO BACK ONE JMP TECH1 TRY AGAIN GNF4 EXCH A,X AND TERMINATOR IN XR JMP *GNF YES, OK * * TTDMP1 COPY =0,X RESET LP FLAG COPY TOPT,A TBIT 3,A LP? JF OV,$+2 IF NOT, JUMP COPY =1,X OTHERWISE SET LP FLAG COPY X,LPFLAG STORE FLAG SHIFT A,RO,2 JF OV,TTDMP2 COPY TTLN,A NEG A COPY TTBUF,X JST DUMP TTDMP2 COPY TOPT,A SHIFT A,RO,3 JF OV,TTDMP3 COPY TTLN,A NEG A COPY =SAVBUF,X JST DUMP TTDMP3 COPY =0,A RESET LP FLAG COPY A,LPFLAG STORE FLAG 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 WORD 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 CHAINED IOB OPCODE WORD 0,1,2,4,6,8,9 TITL 'CHRIN' SUBROUTINE ***************************** * * CHRIN - CHECK TERMINATOR * *  THIS SUBROUTINE WILL CHECK THE * TEMINATOR CHARACTER FOR INPUT THROUGH * THE 'IHEX' OR 'IDEC' SUBROUTINE IF IT * 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 * ****************************** * CHRIN ENT TERMINATOR CHECK ROUTINE 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 'TESTCK' SUBROUTINE ****************************** * * TESTCK - FUNCTION JUMP * * THIS SUBROUTINE WILL DETERMINE WHICH FUNCTION * WAS SELECTED AND MAKE AN APPROPRIATE RETURN. * * CALLING SEQUENCE: * JST TESTCK * JMP ? FORMATTER R * JMP ? TECH TEST R+1 * JMP ? DIAGNOSTIC R+2 * ****************************** * TESTCK ENT COPY MODEY,A GET MODE FLAG CLSN A,='F' FORMATTER? JMP *TESTCK YES, EXIT IMS TESTCK SET RETURN ADDRESS CLSN A,='T' TECH TEST? JMP *TESTCK YES, EXTI IMS TESTCK SET RETURN ADDRESS JMP *TESTCK ELSE DIAGNOSTIC TITL 'COMPAR' SUBROUTINE ****************************** * * COMPAR - DATA COMPARE ROUTINE * *  THE DATA LENGTH FOR THE COMPARISON * IS IN THE A REGISTER UPON ENTRY. IF THE * A REGISTER IS NEGATIVE, THE VALUE IN 'EXP' * IS COMPARED AGAINST EACH WORD IN THE BUFFER * (POINTED TO BY 'MISCAD'). IF THE A REGISTER * IS POSITIVE, 'EXP' IS INCREMENDTED AFTER * EACH SUCCESSFUL COMPARE. * * THE FOLLOWING IS REQUIRED UPON ENTRY: * AREG = DATA LENGTH * EXP = EXPECTED VALUE * MISCAD = POINTER TO BUFFER * * CALLING SEQUENCE: * COPY =DATA LENGTH,A * JST COMPAR * JMP ? MISCOMPARE R * JMP ? GOOD COMPARE R+1 * ******************************* * COMPAR ENT COPY A,COMPFG SAVE INCREMENTFLAG JLT A,$+2 DONT INCREMENT PATTERN NEG A NEGATE COUNT COPY A,COMPCT STORE COUNT CMPAR1 COPY MISCAD,Y GET A WORD COPY 0(Y),A COPY A,ACT SAVE IT FOR ERROR ROUTINE XOR EXP,A COMPARE IT JNE A,CMPAR2 MISCOMPARE COPY COMPFG,A SEE IF INCREMENTING PATTERN JLT A,CMPAR3 NO IMS EXP YES, BUMP PATTERN NOP CMPAR3 IMS MISCAD BUMP ADDR PTR IMS COMPCT AND COUNT JMP CMPAR1 CONTINUE IMS COMPAR GOOD RETURN CMPAR2 JMP *COMPAR BAD RETURN * COMPCT WORD 0 WORD COUNT COMPFG WORD 0 INCREMENT FLAG * LPOOL TITL 'CRC' SUBROUTINE ****************************** * * CRC - GENERATES CRC CHARACTER * * THIS SUBROUTINE WILL COMPUTE THE * CRC FOR A GIVEN DATA REGION VIA THE * FOLLOWING POLYNOMIAL: * * X**16 + X**15 + X**13 + X**7 + X**4 + X**2 + X**1 + X**0 * * UPON ENTRY XREG SHOULD CONTAIN THE ADDRESS OF THE * DATA REGION AND AREG SHOULD CONTAIN THE DATA LENGTH * IN WORDS. * * UPON EXIT AREG WILL CONTAIN THE COMPUTED CRC AND * LOCATION 'CRCC' WILL ALSO CONTAIN THE COMPUTED *  CRC. * * CALLING SEQUENCE: * COPY =DATA ADDRESS,X * COPY =DATA LENGTH,A * JST CRC * ****************************** * CRC ENT ENTRY/EXIT. COPY X,CRCX: SAVE 'X' REGISTER. NEG A - SIZE OF WORD ZONE. COPY A,CRCN BIND LENGTH COUNTER. COPY =0,A COPY A,CCRC INITIALIZE CRC ACCUMLATOR. CRC2 EQU $ COPY =-16,A COMPUTATIONAL CONSTANT. COPY A,CRCX BIND COUNTER. COPY CCRC,A FETCH CRC ACCUMLATOR. XOR 0(X),A INITATE MODULUS COMPUTATION. CRC1 EQU $ SHIFT A,LO,1 SAMPLE JF OV,$+2 CONTIN UE MODULUS COMPUTATION. XOR CRCP,A APPLY CRC POLYNOMIAL AND CONTINUE COMPUTATION. IMS CRCX BUMP COMPUTATIONAL STEP COUNT. JMP CRC1 CONTIUE COMPUTATION. COPY A,CCRC BIND FINALIZE CRC COMPUTATION. ADD =1,X BUMP INDEX TO WORD REGION. IMS CRCN TEST FOR WORD REGION EXPIRATION. JMP CRC2 CONTINUE CRC COMPUTATION FOR REMAINING WORD REG COPY CRCX:,X REFRESH 'X' REGISTER. JMP *CRC BACK TO CALLER. * CRCP WORD :A097 CRC POLYNOMIAL MASK CRCX RES 1 -16 UP COUNTER. CRCN RES 1 - WORD REGION LENGTH KEEPER, IN WORDS. CCRC RES 1 CRC ACCUMALTOR. CRCX: RES 1 'X' KEEPER. * 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 * ****************************** * CRLF ENT COPY =CR:,A OUTPUT CR JST OTTY COPY =LF:,A OUTPUT LF JST OTTY JMP *CRLF * LPOOL TITL 'DINIT' SUBROUTINE ****************************** * * DINIT - INITIALIZE DISK * * THIS SUBROUTINE WILL RESET THE DISK, SENSE FOR * PRESENCE OF THE DISK, SENSE FOR THE DISK READY * AND PERFORM MICRODIAGNOSTIC WITH STATUS * VERIFICATION. * * CALLING SEQUENCE: * JST DINITMACRO HCMCDIAG(L=) LINK HCMCDIAG+SF.DEBUGS(AB=2000,UL) IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII! IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIe820607085727820607085727 860218154636e@820607085727820607085727820607090213" e820607085727820607085727820607085727e820607085727820607085727820607085727820607085727820607085727820607085727e^K82043008332775820430083444 860218154634e|A82060708252125820607082522 860218154500e 7860218154450 860218154500 860218154635# $ % & ' ( ) * + . HCMCDIAG ASMHCMCDIAG BAKHCMCDIAG JCL,  * ****************************** * DINIT ENT COPY =MUIOB,A INDEX IOB EXCH ADRIOB,A SAVE ADRIOB COPY A,DINIOB JST SEL INITIALIZE JST SENHIM SENSE PRESENCE JMP DINIT1 ERROR JST SENRDY SENSE READY JMP DINIT2 ERROR COPY ADRIOB,A JST OTA DO IT JST TIMER RESET TIMER DINIT0 JST TIME TIME OUT MICRODIAG JMP $+2 JMP DINIT3 TIMER EXPIRED. ERROR JST SENRDY DONE YET? JMP DINIT0 NO, KEEP TRYING COPY =:400,A YES CHECK STATUS XOR MUIOB+CST,A JNE A,DINIT4 BAD STATUS. ERROR COPY MUIOB+DST,A CHECK DRIVE STATUS NEG A SHOULD BE COMPLEMENT OF SUB =1,A XOR MUIOB+OP,A FC FIELD JNE A,DINIT4 IT ISNT. ERROR JMP DINIT6 NO ERROR DINIT1 COPY =0,A CONTROLLER NOT PRESENT JMP DINIT5 DINIT2 COPY =1,A CONTROLLER NOT IDLE JMP DINIT5 DINIT3 COPY =11,A MUDIAG TIMER EXPIRED JMP DINIT5 DINIT4 COPY =12,A STATUS ERROR DINIT5 JST ERROR PRINT ERROR DINIT6 COPY DINIOB,A RESTORE ADRIOB COPY A,ADRIOB  JMP *DINIT EXIT * DINIOB WORD 0 ADRIOB HOLDER MUIOB WORD :AA55 MU-DIAG IOB RES 11,0 * LPOOL TITL 'DOIO' SUBROUTINE ****************************** * * DOIO - PERFORM I/O * * THIS SUBROUTINE WILL PERFORM AN I/O OPERATION * TO THE DISK, WITH OR WITHOUT INTERRUPTS. * * CALLING SEQUENCE: * JST DOIO * ****************************** * DOIO ENT COPY ADRIOB,X SAVE IOB ADDR COPY =-1,A COPY A,XF(X) PRESET WDS XFRRED COPY A,CST(X) AND STATUS COPY A,DST(X) JST TIMER RESET TIME COPY IN(X),A INTERRUPTS BEING USED JEQ A,DOIO1 NO SBIT 8,S YES JST OTX SELECT DISK JST TIME TIME THE I/O JMP $-1 RBIT 8,S ERROR  JST SEL RESET DISK COPY =2,A JST ERROR NO INTERRUPT JMP *DOIO EXIT INTLOC EQU $ I/O INTERRUPT LOC JST $+1 SERVICE INTERRUPT NOP JST SENRDY SEE IF IDLE JMP $+2 JMP *DOIO OK EXIT COPY =3,A NOT IDLE AFTERINTERRUPT JST ERROR JMP *DOIO DOIO1 JST OTX SELECT DISK DOIO2 JST SENRDY SENSE FOR COMPLETION JMP DOIO3 NOT DONE JMP *DOIO EXIT DOIO3 JST TIME TIME THE I/O JMP DOIO2 COPY =4,A TIME EXPIRED, DISK NOTREADY JST ERROR TO ERROR SUB JMP *DOIO EXIT * LPOOL TITL 'DUMP' SUBROUTINE ****************************** * * DUMP - DISPLAYS I/O BUFFER * * THIS SUBROUTINE WILL DISPLAY THE I/O BUFFER TO * THE CRT/TTY WITH 14 WORDS PER LINE. * * ENTER WITH AREG = NEGATIVE WORD LENGTH TO DUMP * AND XREG = BUFFER ADDRESS. * * CALLING SEQUENCE: * COPY =-WORD LENGTH,A * COPY =BUFFER ADDRESS,X * JST DUMP * ****************************** * DUMP ENT BUFFER DUMP ROUTINE COPY A,DUMPLN SAVE LENGT COPY X,DUMPAD AND ADDRESS COPY MODE,A GET MODE FLAG CLSN A,='T' TECH TEST? JMP DUMP0 YES, JUMP LIKE A BUNNY JST ERSET 6 JMP DUMP4 COPY CAR,A ERROR MESS AGE? (BIT 1 SET) SHIFT A,RO,2 JT OV,DUMP3 YES, SKIP IT JST DUMPND SEE IF DUMP SUPRESSED DUMP0 JST MSGA PRINT "DUMP" WORD DUMPMG COPY DUMPAD,A GET ADDRESS JST OHEX PRINT IT DUMP1 JST CRLF COPY =-14,A 14 WDS/LINE COPY A,DUMPCT DUMP2 COPY MODE,A GET MODE FLAG AGAIN CLSN A,='T' TECH TEST STILL? JMP $+2 YES, JUMP OVER JST DUMPND EXIT IF DUMP SUPRESSED COPY *DUMPAD,A GET A WORD JST OHEX PRINT IT IMS DUMPAD BUMP PTR COPY =' ',A PRINT SPACE JST OTTY IMS DUMPLN BUMP COUNT JMP $+2 DUMP3 JMP *DUMP EXIT IF DONE IMS DUMPCT BUMP WDS PERLINE COUNT JMP DUMP2 PRINT NEXT WORD JMP DUMP1 PRINT NEXT LINE DUMPND ENT SEE IF COPY CAR,A DUMP WANTED? (BIT 0 SET?) SHIFT A,RO- ,1 JF OV,DUMP3 NO, EXIT DUMP4 EQU $ JMP *DUMPND YES,CONTINUE * DUMPAD WORD 0 BUF PTR DUMPLN WORD 0 TOTAL COUNT DUMPCT WORD 0 WDS PER LINE COUNT * LPOOL TITL 'ERROR' SUBROUTINE ****************************** * * ERROR - PRINTS ERROR REPORT * *  THIS SUBROUTINE WILL PRINT AN ERROR REPORT * IN THE FOLLOWING FORMAT: * * ER XXXX * ER AD :XXXX PASS XXXX UNIT XXXX TEST X * IOB ADDRESS :XXXX * STATUS :XXXX ( XXXX XXXX XXXX XXXX ) * DRIVE STATUS :XXXX ( XXXX XXXX XXXX XXXX ) * FUNC :XXXX (FUNCTION) CYL XXXX HEAD XXXX SECT XXXX * BUF :XXXX LEN :XXXX WDS XFRD :XXXX * INT LOC :XXXX * * CALLING SEQUENCE: * COPY =ERROR NUMBER,A * JST ERROR * ****************************** * ERROR ENT COPY S,Q SAVE PSW RBIT 6,S XA-BIT MUST BE OFF RBIT 8,S DISABLE INT. COPY A,ERT1 SAVE ERROR NO COPY ERLPFL,A GET ERROR LP FLAG EXCH A,LPFLAG CHANGE WITH LP FLAG COPY A,ERLPFL SAVE LP FLAG COPY ERROR,A DONT CALL ERSET IF SUB =STAT8,A STALT CALL JEQ A,ERRO20 COPY MODE,A OR IF FORMATTER CLSN ='F',A JMP ERRO20 COPY =ERR0,A BUMP TOTAL ERROR COUNT ADD UCUR,A COPY A,X IMS 0(X) NOP COPY ERROR,A SUB =DINIT6,A OR DINIT CALL JEQ A,ERRO20 COPY ADRIOB,X INDEX IOB JST ERSET JMP ER3A EXIT ERRO20 EQU $ COPY =-5,A ALLOW FIVE NEXT DIB'S COPY A,ERT2 COPY ADRIOB,X GET IOB ADDR COPY CAR,A ERROR MESSAGE? (BIT 1 SET) SHIFT A,RO,2 JT OV,ERRTT NO, EXIT JST MSGA PRINT ERRORNO WORD ERMS1 COPY ERT1,A JST ODEC COPY MODE,A CLSN ='F',A FORMATTING? JMP $+2 YES JMP ERROR6 NO JST MSGA YES, SAY SO WORD ERMS2 ERROR6 JST MSGA PRINT ERROR ADDR WORD ERMS3 COPY STATER,A DID ERROR OCCUR IN STATUS ROUTINE? JEQ A,ERRR6A COPY STATAD,A YES JMP ERRR6B ERRR6A COPY ERROR,A NO ERRR6B SUB =1,A JST OHEX COPY MODE,A CLSN ='F',A FORMAT? JMP ERROR5 YES, DONT PRINT PASS JST SPACE JST MSGA PRINT PASS NO WORD ERMS4 COPY PASCTR,A JST ODEC ERROR5 JST SPACE JST MSGA PRINT UNIT NO WORD ERMS5 COPY UCUR,A JST ODEC COPY MODE,A CLSN ='F',A FORMAT? JMP ERROR7 YES DONT PRINT TEST NO JST SPACE JST MSGA PRINT CURRENT TEST NO WORD ERMS6 COPY TCUR,A JST OTTY ERROR7 JNE X,$+2 EXIT IF NO IOB ADDRESS ERRTT JMP ER3A EXIT COPY ERT1,A ALSO EXIT IF JEQ A,ERRTT ERROR #0 SUB =1,A OR ERROR #1 JEQ A,ERRTT JST MSGA PRINT IOB ADDR WORD ERMS7 COPY X,A JST OHEX JST MSGA PRINT CONTROLLER STATUS WORD ERMS8 COPY CST(X),A JST OHEX COPY CST(X),A JST OBIN ALSO IN BINARY JST MSGA WORD ERMS9 PRINT DRIVE STATUS COPY DST(X),A JST OHEX COPY DST(X),A JST OBIN ALSO IN BINARY JST MSGA PRINT FUNCTION WORD ERMS10 COPY OP(X),A OUTPUT OPCODE JST OHEX COPY =:F,A AND OP(X),A COPY A,ERT3 COPY =ERFCTB,A ADD ERT3,A FIND FUNCTION IN TABLE COPY A,X COPY 0(X),A COPY ADRIOB,X COPY A,$+2 STORE ADDR IN PRINT CALL JST MSGA PRINT FUNC WORD $-$ ADDR OF FUNCMSG GOES HERE JST SPACE JST MSGA PRINT CYL WORD ERMS11 JMP ERRO13 * LPOOL TITL * * ERROR REPORT CONTINUED * ERRO13 EQU $ COPY ERT1,A GET ERROR NO CLSN =41,A IF 41 JMP ERRO11 CLSN =51,A OR 51 JMP ERRO11 THEN PRINT ORIGINAL ADDR COPY CS(X),A AND =:FFF,A JST ODEC JST SPACE JST MSGA PRINT HEAD WORD ERMS12 COPY HS(X),A JST ODEC JST SPACE JST MSGA PRINT SECTOR WORD ERMS13 COPY SSS(X),A JMP ERRO10 ERRO11 COPY CCUR,A SHOW ORIGINAL CYL JST ODEC JST SPACE JST MSGA W. ORD ERMS12 COPY HCUR,A ORIGINAL HEAD JST ODEC JST SPACE JST MSGA WORD ERMS13 COPY SCUR,A AND ORIG SECTOR NOS ERRO10 JST ODEC JST MSGA PRINT BUFFER ADDR WORD ERMS14 COPY MA(X),A JST OHEX JST SPACE JST MSGA PRINT REQUESTED LENGTH WORD ERMS15 COPY WC(X),A JST OHEX JST SPACE JST MSGA PRINT WDS ACTUALLY XFERRED WORD ERMS16 COPY XF(X),A JST OHEX COPY ERT1,A SEE IF WORD MISCOMP ERROR CLSN =40,A JMP ERRO12 CLSN =50,A JMP ERRO12 JMP ERROR1 NO, SKIP NEXT INFO ERRO12 JST MSGA YES PRINT MISCOMP STUFF WORD ERMS17 COPY MISCAD,A JST OHEX JST SPACE JST MSGA PRINT EXPECTED WORD WORD ERMS18 COPY EXP,A JST OHEX JST SPACE JST MSGA PRINT ACTUAL WORD WORD ERMS19 COPY ACT,A JST OHEX ERROR1 COPY IN(X),A JEQ A,ERROR9 NO, SKIP NEXT JST MSGA YES, PRINT INT LOC WORD ERMS20 COPY IN(X),A JST OHEX ERROR9 COPY ERT1,A SEE IF ERROR NO IS CLSN =41,A 41 JMP ERROR8 CLSN =51,A OR 51 JMP ERROR8 IF SO, PRINT JMP ERROR2 ERROR8 JST MSGA CHANGED CYL/HD/SECTOR STUFF WORD ERMS21 COPY CS(X),A PRINT NEW CYL NO AND =:FFF,A JST ODEC JST SPACE COPY HS(X),A NEW HEAD, JST ODEC JST SPACE COPY SSS(X),A AND NEW SECTOR NO JST ODEC ERROR2 COPY NB(X),A JEQ A,ERROR3 NO, SKIP IT ERROR4 COPY A,ERT4 SAVE CHAINED IOB ADDR JST MSGA PRINT WORD CHAINED IOB WORD ERMS22 COPY ERT4,A JST OHEX PRINT ADDRESS JST SPACE JST MSGA PRINT WORD COUNT WORD ERMS23 COPY ERT4,X COPY 0(X),A JST OHEX JST SPACE JST MSGA PRINT BUF ADDR WORD ERMS24 COPY 1(X),A JST OHEX COPY 3(X),A ANOTHER CHAINED IOB JEQ A,ERROR3 NO, SKIP IT COPY ERT1,A GET ERROR NO CLSN =72,A IF 72,EXIT JMP ERROR3 COPY 3(X),A IMS ERT2 YES BUMP COUNT OF 5 JMP ERROR4 PRINT NEXT CHAINED IOB ERROR3 COPY ADRIOB,X RESTORE IOB ADDRESS ER3A EQU $ COPY ERLPFL,A GET LP FLAG EXCH A,LPFLAG CHANGE WITH ERROR LP FLAG COPY A,ERLPFL RESTORE ERROR LP FLAG COPY CAR,A GET RUN OPTIONS TBIT 4,A HALT ON HARD ERROR? JF OV,$+2 IF NOT, JUMP HLT OTHERWISE HALT COPY Q,S RESET STATUS REGISTER COPY ERROR,Y JMP 0(Y) AND EXIT * ERT1 WORD 0 SAVED ERROR NO. ERT2 WORD 0 COUNT OF 5 IOB'S ERT3 WORD 0 FUNC CODE (0-9) ERT4 WORD 0 NEXT DIOB ADDRESS ERLPFL WORD 0 ERROR LP FLAG * LPOOL TITL 'ERSET' SUBROUTINE ****************************** * * ERSET - CHECK 'ERFLAG' * * THIS SUBROUTINE IS CALLED PRIOR TO AN ERROR *  PRINTOUT, TO SEE IF WE ARE IN THE MIDDLE OF * A RETRY SEQUENCE. IF SO, THE ERROR SHOULD NOT * BE DISPLAYED. THIS SUBROUTINE ALSO INCREMENTS * 'ERFLAG' FOR RETRY. * * CALLING SEQUENCE: * JST ERSET * JMP ?  SKIP ERROR REPORT R * JMP ? PRINT ERROR REPORT R+1 * ****************************** * ERSET ENT IMS ERFLAG BUMP ERROR FLAG COPY ERCT1,A IS THIS FIRST ERROR JNE A,$+2 NO, SKIP ERROR PRINT IMS ERSET YES PRINT ERROR JMP *ERSET RETURN TITL 'FILCON' SUBROUTINE ****************************** * * FILCON - FILL I/O BUFFER * * THIS SUBROUTINE FILLS THE 520 WORD I/O * BUFFER WITH THE CONTENTS OF THE A REGISTER. * THE A REGISTER MUST BE LOADED WITH THE FILL *  CHARACTER PRIOR TO ENTERING THIS ROUTINE. * * CALLING SEQUENCE: * COPY =FILL CHARACTER,A * JST FILCON * ****************************** * FILCON ENT SPREAD A CONSTANT COPY A,BUF TO BUFFER COPY =-519,A 519 WORDS JST MOVE MOVE IT W/ ORD BUF WORD BUF+1 JMP *FILCON EXIT * 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 REGISTER. * * ENTER WITH FILL INCREMENTING VALUE IN THE *  X REGISTER. * * CALLING SEQUENCE: * COPY =STARTING VALUE,A * COPY =INC. VALUE,X * JST FILINC * ******************************* * 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) STORE IT ADD =1,X BUMP IT IMS FILNCT AND COUNT JMP FILNC1 CONTINUE COPY FILNCX,X RESTORE X-REG JMP *FILINC RETURN * FILNCT WORD 0 COUNT FILNCX WORD 0 X-REG SAVER * LPOOL 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 32768 AND * RESTARTS THE INPUT. * * CALLING SEQUENCE: * JST IDEC * ****************************** * 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 VALUE IN A COPY IDCTM1,X GET TERMINATOR 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 SUBROUTIJNE IS EXITED UPON INPUT OF * THE FIRST NON ASCII-HEX CHARACTER WHICH IT *  RETURNS IN THE A REGISTER. * * CALLING SEQUENCE: * JST IHEX * ******************************* * IHEX ENT INPUT HEX VALUE (4-DIGIT) COPY =0,A CLEAR VALUE AREA COPY A,IDCTM1 COPY A,IDCTM3 AND COUNT COPY =-5,A SET DIGIT COUNT COPY A,IHXTMP STORE 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 IM0 S IHXTMP INC. DIGIT COUNT JMP IHEX3 GET NEXT CHAR COPY ='?',A TOO MANY CHARS. JST OTTY DISPLAY '?' JMP IHEX+1 TRY AGAIN 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 * IHXTMP RES 1,0 DIGIT COUNT 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 * ****************************** * IKB ENT INPUT TTY CHAR ROUTINE COPY X,IKBTMP SAVE XR 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 ASCII COPY IKBTMP,X RESTORE XR JMP *IKB * IKBTMP WORD 0 XR SAVE CELL * LPOOL TITL 'INCR' SUBROUTINE ****************************** * * INCR - INCREMENT CURRENT SECTOR, HEAD, CYLINDER * * THIS SUBROUTINE WILL INCREMENT THE CURRENT SECTOR * NUMBER. WHEN ALL SECTORS ARE DONE, IT WILL INCREMENT * THE CURRENT HEAD NUMBER. WHEN ALL HEADS ARE DONE, IT * WILL INCREMENT THE CURRENT CYLINDER NUMBER. WHEN ALL * CYLINDERS ARE DONE, IT WILL RETURN TO *  RETURN ADDRESS + 1. * * CALLING SEQUENCE: * JST INCR * JMP ? STILL INCREMENTING R * JMP ? ALL CYLINDERS ARE DONE R+1 * ****************************** * INCR ENT BUMPSECTOR NO IMS SCUR COPY SCUR,A LAST SECTOR? CSK A,SECS JMP *INCR NO, EXIT NOP INCR2 COPY =0,A RESET SECTOR NO COPY A,SCUR IMS HCUR COPY EHD,A NO CSK A,HCUR LAST HEAD JMP INCR6 YES, RESET HEAD NO NOP NO JMP *INCR INCR6 COPY SHD,A RESET HEAD NO COPY A,HCUR IMS CCUR COPY ECYL,A IS THIS LAST CYL CSK A,CCUR JMP INCR3 YES NOP NO JMP *INCR NO, RETURN INCR3 COPY SCYL,A RESET CYL COPY A,CCUR IMS INCR SPECIAL RETURN JMP *INCR * * INCRH - SAME AS 'INCR' EXCEPT THE HEAD AND * CYLINDER NUMBERS ONLY ARE INCREMENTED. * * SECTOR = 0 * INCRH ENT COPY INCRH,A SAVE RETURN AD COPY A,INCR JMP INCR2 SKIP SECTOR UPDATE * 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 * * SENRDY - JST SENRDY *  JMP ? CONTROLLER NOT READY R * JMP ? CONTROLLER READY R+1 * ******************************* * OTA ENT DA1 EQU $ OUT A,SMDA*8+0 OUTPUT A-REG JMP *OTA * OTX ENT DA2 EQU $ OUT X,SMDA*8+0 OUTPUT X-R JMP *OTX * 1 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 'MASK' SUBROUTINE ****************************** * * MASK - MASK UNWANTED BITS * * THIS SUBROUTINE IS USED TO MASK OUT UNWANTED * BITS AFTER A RANDOM NUMBER IS GENERATED. * * ENTER WITH HIGHEST POSSIBLE VALUE IN A REGISTER, * EXIT WITH NUMBER IN X REGISTER. * * CALLING SEQUENCE: * COPY =HIGHEST POSSIBLE VALUE,A * JST MASK * ****************************** * MASK ENT COPY =0,X MASK1 JEQ A,MASK2 IF A=0, MASK COMPLETE SHIFT A,RO,1 SBIT 1,S ROTATE X,LO,1 SHIFT "1" BIT INTO X JMP MASK1 MASK2 JMP *MASK TITL 'MKIOB' SUBROUTINE ****************************** * * MKIOB - UPDATE IOB * * THIS SUBROUTINE IS USED TO UPDATE THE FOLLOWING * PARAMETERS IN THE IOB: * * UNIT *  CYLINDER * HEAD * SECTOR * * IT ALSO PRESETS THE WORDS TRANSFERRED, * RETURNED STATUS, AND RETURNED DRIVE STATUS * TO :FFFF. * * CALLING SEQUENCE: * JST MKIOB * ****************************** * MKIOB ENT COPY ADRIOB,X INDEX IOB COPY UCUR,A SET CURRENT UNIT COPY A,US(X) STORE UNIT COPY CCUR,A SET CURRENT CYL COPY A,CS(X) STORE CYL COPY HCUR,A SET CURRENT HEAD COPY A,HS(X) STORE HEAD COPY SCUR,A SET CURRENT SECTOR COPY A,SSS(X) STORE SECTOR  COPY =-1,A COPY A,XF(X) PRESET WDS XFRRED COPY A,CST(X) AND STATA COPY A,DST(X) JMP *MKIOB BACK TO CALLER. * 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' * ****************************** * MOVE ENT MOVE WORD ROUTINE COPY A,MOVECT SAVE LENGTH 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 * ***************************** * MSGA ENT PRINT A MSG ROUTINE COPY X,MSGA3 SAVE X REG COPY *MSGA,X GET MSG ADRESS SHIFT X,LO,1 IMS MSGA BUMP FOR RTN 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 XREG CELL * LPOOL TITL 'NXTHDR' SUBROUTINE ****************************** * * NXTHDR - GENERATE NEXT PARAMETERS * * 2  THIS SUBROUTINE WILL GENERATE THE NEXT * VALUES FOR THE FOLLOWING PARAMETERS: * * CYLINDER *  HEAD * SECTOR * * IF END-OF-MEDIA OCCURS IN THE GENERATION, A * :FFFF IS STORED. * * CALLING SEQUENCE: * JST NXTHDR * ******************************* * NXTHDR ENT CALC NEXT HDR ADDR COPY CCUR,A UPDATE PTRS COPY A,CNEXT COPY HCUR,A COPY A,HNEXT COPY SCUR,A LOOK AT CURRENT SECTOR COPY A,SNEXT ADD =1,A SUB SECS,A JLT A,$+3 LAST COPY =0,A YES JMP $+2 ADD SECS,A NO COPY A,SNEXT STORE IT JNE A,NXT1 LAST SECT? IMS HNEXT YES. LOOK AT NEXT HEAD COPY EHD,A CSK A,HNEXT LAST HEAD? JMP NXT0 YES NOP JMP *NXTHDR NXT0 COPY SHD,A RESET HEAD NO. COPY A,HNEXT IMS CNEXT BUMP CYL NO COPY ECYL,A CSK A,CNEXT LAST CYL? JMP NXT2 YES NOP NXT1 JMP *NXTHDR RETURN NXT2 COPY =-1,A SET EOM FLAG COPY A,SNEXT COPY A,HNEXT COPY A,CNEXT JMP *NXTHDR RETURN * SNEXT WORD 0 NEXT SECTOR HNEXT WORD 0 NEXT HEAD CNEXT WORD 0 NEXT CYL 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 * ****************************** * 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' SUBROUTINE ****************************** * * ODEC - PRINT DECIMAL NUMBER * * THIS SUBROUTINE WILL CONVERT THE A REGISTER * 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 REGISTER. * * CALLING SEQUENCE: * COPY =NUMBER,A * JST ODEC * ****************************** * ODEC ENT OUTPUT A 5-DIGIT DECIMAL NO COPY X,ODECX SAVE X-REG COPY A,IDCTM1 SAVE BINARY VALUE CSK A,ODCTBL+1 IS IT GREATER THAN 10,000? JMP ODEC0 NO, CONTINUE NOP JST MSGA YES, PRINT '****' WORD STARS JMP ODEC2 EXIT ODEC0 COPY ODCTBL,A GET TABLE COPY A,IDCTM2 COPY =-5,A COUNT 5 DIGITS COPY A,IDCTM3 ODEC1 COPY IDCTM1,A GET REMAINDER COPY IDCTM2,Y COPY ='0'-1,X SUB 0(Y),A DIVIDE INDECIMAL ADD =1,X ADD TO OUTPUT VALUE JGE A,$-2 ADD 0(Y),A ADD BACK IN IF GONE NEG COPY A,IDCTM1 STORE REMAINDER COPY X,A JST OTTY PRINT CALCULATED DIGIT IMS IDCTM2 BUMP TABLE PTR IMS IDCTM3 AND COUNT JMP ODEC1 DO NEXT DIGIT ODEC2 COPY ODECX,X RESTORE X-REG JMP *ODEC EXIT AFTER 5 * ODCTBL WORD $+1,10000,1000,100,10,1 ODECX WORD 0 X-REG SAVE * LPOOL TITL 'OHEX' SUBROUTINE ****************************** * * OHEX - PRINT HEX NUMBER * * THIS SUBROUTINE WILL 3 CONVERT THE A REGISTER * TO AN EQUIVALENT ASCII-HEX NUMBER AND PRINT * IT TO THE CRT/TTY. * * ENTER WITH NUMBER IN THE A REGISTER. * * CALLING SEQUENCE: * COPY =NUMBER,A * JST OHEX * ****************************** * OHEX ENT OUTPUT 4 HEX DIGITS COPY X,ODECX SAVE X-REG COPY A,X SAVE NO 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 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 AND EXIT * OHEXC1 WORD 0 4-DIGIT COUNTER OHEXC WORD 0 4-BIT SHIFT COUNT TITL 'OTTY' - PRINT ASCII CHARACTER ****************************** * * OTTY - PRINT ASCII CHARACTER * * THIS SUBROUTINE WILL PRINT AN ASCII CHARACTER * IN THE LS. BYTE OF THE A REGISTER TO THE CRT/TTY, * AND LP. * * ENTER WITH CHARACTER IN LS. BYTE OF THE A REGISTER. * * CALLING SEQUENCE: * COPY =CHARACTER,A * JST OTTY * ******************************* * 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 A-REG. 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 A-REG. CONTENTS COPY A,OTTMP3 SAVE IT COPY LPFLAG,A GET LP FLAG COPY A,OTTMP4 SAVE IT COPY OTTMP2,A GET ORIGINAL X-REG. CONTENTS  COPY A,OTTMP5 SAVE IT COPY OTTY,A GET RETURN ADD. 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 ADD. '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 LOOP JMP OTTY4 JST OTTY DISPLAY ON CRT/TTY ADD =1,X INC. MESSAGE ADD. JMP OTTY3 LOOP FOR MORE OTTY4 JST IKB INPUT CHAR. FROM KEYBOARD COPY OTTMP6,A GET RETURN ADD. COPY A,OTTY SET IT COPY OTTMP4,A GET ORIGINAL LP FLAG COPY A,LPFLAG SET IT COPY OTTMP5,A GET ORIGIANL X REG COPY A,OTTMP2 SET IT COPY OTTMP3,A GET ORIGINAL A REG 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 WASTE SOME TIME  JNE X,$-1 DITTO OTTY6 COPY OTTMP1,A RESTORE A REG COPY OTTMP2,X RESTORE X REG JMP *OTTY * OTTMP1 WORD 0 AR SAVE CELL OTTMP2 WORD 0 XR SAVE CELL OTTMP3 WORD 0 SAVE A REG OTTMP4 WORD 0 SAVE LP FLAG OTTMP5 WORD 0 SAVE X REG OTTMP6 WORD 0 SAVE RETURN ADD LPFLAG WORD 0 LP FLAG * LPOOL TITL 'PREP' SUBROUTINE ****************************** * * PREP - PREPARE DISK * * THIS SU4 BROUTINE WILL PREPARE THE DISK FOR A NEW * TEST. IT WILL RESET THE CURRENT CYLINDER, * CURRENT HEAD AND CURRENT SECTOR TO THE STARTING * VALUES. * * CALLING SEQUENCE: * JST PREP * ***************************** * PREP ENT INITALIZE CYL/HD/SECTOR NOS COPY SSEC,A RESET SECTOR NO COPY A,SCUR COPY SHD,A RESET HD NO COPY A,HCUR COPY SCYL,A RESET CYL NO COPY A,CCUR JST DINIT RESET THE DISK JMP *PREP EXIT * LPOOL TITL 'RANDOM' SUBROUTINE ****************************** * *  RANDOM - RANDOM NUMBER GENERATOR * * THIS SUBROUTINE WILL GENERATE A * PSEDUO RANDOM NUMBER USING THE FOLLOWING * EQUATION: * * C(I+1) = C(C(I)*Y+U)MOD(P)) * * WHERE * * C(I) = SEED 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 * ****************************** * RANDOM ENT ENTRY/EXIT. COPY X,RMD:X SAVE 'X' REGISTER.  COPY =0,A CLEAR A-REG COPY SEED,X SET C(I) --> 'X'. * * 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 REFRESH 'X' REGISTER. JMP *RANDOM BACK TO CALLER. * SEED RES 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' REGISTER KEEPER FOR RANDOM ROUTINE. TITL 'RETRY' SUBROUTINE ****************************** * * RETRY - RETRY I/O * * THIS SUBROUTINE WILL RETRY THE I/O FUNCTION * USING NEXT OFFSET BITS, IF THE ERFLAG HAS BEEN * SET TO A NON ZERO VALUE (BY 'ERSET'), AND GOING * TO "RLOOP" (SET UP BY 'RYINT'). OTHERWISE, IT WILL GO * TO "*RLOOP" TO EXIT THE RETRY LOOP. * * THIS SUBROUTINE WILL ALSO INCREMENT THE SOFT, FIRM, * AND HARD ERROR COUNTS. * * CALLING SEQUENCE: *  JST RETRY * ****************************** * RETRY ENT COPY ADRIOB,X INDEX IOB COPY =:F0FF,A CLEAR OFFSETS FROM FC AND OP(X),A COPY A,OP(X) COPY =0,A GET ERFLAG EXCH ERFLAG,A AND CLEAR IT TO ZERO JEQ A,RETRY2 IF NO ERRORS, EXIT IMS ERCT1 ELSE BUMP ERROR COUNT COPY =ERTABL-1,A GET OFFSET MASK ADD ERCT1,A COPY A,RETRYA COPY *RETRYA,A GET NEXT OFFSET RETRY COPY DISK,X A HIGH CAP DISK CLSN ='H',X CAN RETRY 27 TIMES JMP RETRY0 BY USING ALL OF ERTABL CSK A,MEDOFF BUT A MEDIUM CAP DISK JMP RETRY0 CAN ONLY RETRY 12 TIMES NOP SINCE OFFSETS .GE. TO :300 JMP RETRY1 ARE NOT USED FOR RETRIES RETRY0 COPY ADRIOB,X INDEX IOB JLT A,RETRY1 IF NEG,ALL OFFSETS IN TABLE DONE OR OP(X),A ELSE PUT IT IN OPCODE COPY A,OP(X) COPY ERCT1,A IF FIRST ERROR, CLSN =1,A IMS ERCT2 BUMP SOFT COUNT CLSN =4,A IF FIRST OFFSET IMS ERCT2 BUMP FIRM COUNT JMP *RLOOP GO RETRY RETRY1 IMS ERCT2 BUMP HARD COUNT JMP RETRY3 GO TALLY ERRORS RETRY2 EXCH ERCT1,A ANY PREVIOUS ERRORS? JEQ A,RETRY4 NO, EXIT RETRY3 COPY SFHTBL,A FIND ERROR ADDR IN TBL COPY ADRIOB,X ADD ERCT2,A COPY A,RETRYA COPY *RETRYA,A ADD US(X),A ADD IN UNIT NO FOR COPY A,RETRYA TABLE ENTRY IMS *RETRYA BUMP ACTUAL ERR COUNT RETRY4 JMP *RLOOPX EXIT * MEDOFF WORD :300 RETRYA WORD 0 TEMP SFHTBL WORD $5 ,SOFT0,FIRM0,HARD0 RLOOP WORD 0 RETRY ADDREDS RLOOPX WORD 0 END RETRY ADDR ERCT1 WORD 0 PRIMARY ERROR COUNT ERCT2 WORD 0 SOFT/FIRM/HARD FLAG ERFLAG WORD 0 ERROR INDICATOR * ERTABL WORD 0,0,0 OFFSET MASK TABLE WORD :100,:100,:100 WORD :200,:200,:200 WORD :300,:300,:300 WORD :400,:400,:400 WORD :500,:500,:500 WORD :600,:600,:600 WORD :700,:700,:700 WORD :800,:800,:800 WORD -1 * LPOOL TITL 'RYINIT' SUBROUTINE ****************************** * * RYINIT - INITIALIZE ERROR RETRY COUNTERS * * THIS SUBROUTINE WILL INITIALIZE THE ERROR * RETRY COUNTERS, RETRY AND END RETRY ADDRESSES. * * ENTER WITH IOB ADDRESS IN X REGISTER. * * CALLING SEQUENCE: * COPY =IOB ADDRESS,X * JST RYINIT * WORD ADDRESS1 RETRY ADDRESS * WORD ADDRESS2 END RETRY ADDRESS * ****************************** * RYINIT ENT COPY X,ADRIOB STORE IOB COPY *RYINIT,A GET RETRY ADDRESS COPY A,RLOOP IMS RYINIT BUMP FOR END RETRY ADDR COPY *RYINIT,A GET IT COPY A,RLOOPX  IMS RYINIT BUMP FORRETURN COPY =0,A RESET ERROR COUNTERS COPY A,ERCT1 COPY A,ERCT2 COPY A,ERFLAG JMP *RYINIT EXIT TITL 'SPACE' SUBROUTINE ****************************** * * SPACE - PRINT SPACES * * THIS SUBROUTINE WILL PRINT THREE ASCII *  SPACES TO THE CRT/TTY. * * CALLING SEQUENCE: * JST SPACE * ****************************** * SPACE ENT PRINT 3 SPACES COPY =' ',A FOR ERROR REPORT JST OTTY JST OTTY JST OTTY JMP *SPACE EXIT * LPOOL TITL 'STATUS' SUBROUTINE ***************************** * * STATUS - STATUS CHECK * * THIS SUBROUTINE WILL CHECK THE RETURNED * STATUS FROM AN I/O OPERATION. IF A BAD * STATUS IS RETURNED IT WILL CALL 'ERROR'. * * CALLING SEQUENCE: * JST STATUS * ***************************** * STATUS ENT COPY =0,A CLEAR STALT FLAG STATS COPY A,STFG COPY STATUS,A COPY A,STATAD SAVE STATUS CALLING ADDR COPY =1,A LET ERROR ROUTINE KNOW COPY A,STATER WE'RE IN STATUS ROUTINE COPY ADRIOB,X INDEX IOB COPY CST(X),A LOOK AT STATUS ADD =1,A ALL FFFF'S? JEQ A,STAT1 YES, NO STATUS AT ALL SUB =1,A SHIFT A,RO,6 ID CRC? JT OV,STAT2 YES SHIFT A,RO,1 WORD CRC? JT OV,STAT3 YES COPY CST(X),A ELSE XOR =:400,A GOOD STATUS? JNE A,STAT1 NO COPY US(X),A GET UNIT COPY =:8000,X STAT1B JEQ A,STAT1A MASK OFF OTHER UNITS SHIFT X,RO,1 SUB =1,A JMP STAT1B STAT1A COPY X,A COPY ADRIOB,X AND DST(X),A CHECK DRIVE STATUS (BITS 12-15) JNE A,STAT4 BAD DRIVE STATUS COPY DST(X),A GET DRIVE STATUS AGAIN AND =:FF,A MASK OFF HIGH ORDER BITS XOR MCDF,A SEE IF MED CAP DRIVE (BIT 0) COPY DISK,X CLSN ='H',X HIGH CAP DISK? JMP STAT1C YES--DON'T CHECK BPI STATUS XOR BPIF,A CHECK BPI STATUS (BIT 1) STAT1C JNE A,STAT4 BAD STATUS COPY ADRIOB,X COPY XF(X),A SEE IF REQUESTED LENGTH SUB WC(X),A =ACTUAL LENGTH JNE A,STAT5 NO, SEE WHY NOT JMP STAT8 ALL OK,EXIT STAT1 COPY =5,A STATUS ERROR JMP STAT6 STAT2 COPY =7,A ID CRC ERROR JMP STAT6 STAT3 COPY =8,A WORD CRC ERROR JMP STAT6 STAT4 COPY =6,A DRIVE STATUS ERROR JMP STAT6 STAT5 COPY =:F,A LENGTH BAD. AND OP(X),A IS THIS A CLSN =SEEK,A SEEK? JMP STAT5A YES, SHD BE ZERO CLSN =TIO,A IS IT A TIO? JMP STAT5A YES, SHD BE ZERO COPY NB(X),A IS IT WORD CHAINED? JNE A,STAT8 OH, THAT EXPLAINS IT. COPY =9,A NO, JUST BAD LENGTH JMP STAT6 ST6 AT5A COPY XF(X),A LENGTH = 0? JNE A,$+2 NO, ERROR JMP STAT8 YES,OK COPY =10,A ERROR STAT6 COPY STFG,X IS THIS STALT CALL? JNE X,STAT7 YES, USE SPECIAL ERR CALL COPY ADRIOB,X RESTORE IOB ADDR JST ERROR CALL ERROR JMP STAT8 EXIT STAT7 COPY ADRIOB,X STALT ERROR CALL. JST ERROR (ERROR WONT CALL ERSET) STAT8 COPY =0,A COPY A,STATER RESET ERROR ROUTINE FLAG JMP *STATUS EXIT * STFG WORD 0 STALT FLAG STATAD WORD 0 CALLING ADDRESS STATER WORD 0 FLAG FOR JST ERROR * * STALT - ALTERNATE ENTRY POINT TO STATUS. THIS * SUBROUTINE DOESN'T CALL ERSET TO * INCREMENT ERROR FLAG. * STALT ENT STALT STUFF COPY STALT,A MOVE RETURN ADDRESS COPY A,STATUS COPY =1,A SET STALT FLAG JMP STATS CONTINUE * LPOOL TITL 'TIME' SUBROUTINE ***************************** * * TIME - TAKES ABOUT 3 SECONDS. * * TAKES APPROXIMATELY 3 SECONDS IF TIMING * CELLS ARE INITIALIZED BY 'TIMER'. * * CALLING SEQUENCE: * JST TIME * JMP ? TIME NOT FULLY EXPIRED R * JMP ? TIME FULLY EXPIRED R+1 * ***************************** * 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 TITL 'TIMER' SUBROUTINE ***************************** * * TIMER - INITIALIZES TIMING CELLS * * SETS UP TIMING CELLS FOR *  'TIME' * * CALLING SEQUENCE: * JST TIMER * ***************************** * TIMER ENT COPY =0,A SET LOW WORD COPY A,TC1 COPY =-3,A SET HIGH WORD COPY A,TC2 JMP *TIMER TITL 'TSTITL' SUBROUTINE ***************************** * * TSTITL - PRINTS TEST TITLE * * CALLING SEQUENCE: * COPY =TEST LETTER,A * JST TSTITL * ***************************** * TSTITL ENT PRINT TEST TITLE COPY A,TCUR STORE TEST NO SHIFT A,LO,8 IN BITS 12-15 OF THE LIGHTS SHIFT A,LO,4 SELP A,4 JT SS,TSTTL1 SEE IF WANTED JST CRLF JST MSGA PRINT TITLE WORD ERMS6 COPY TCUR,A JST OTTY TSTTL1 JMP *TSTITL ESXIT * LPOOL TITL TRAP/EXCEPTION SERVICE ROUTINES ****************************** * * TRAP EXCEPTION SERVICE ROUTINES * * CONSOLE INTERRUPT SERVICE ROUTINE * ****************************** * * POWER UP * PWRUP: ENT POWER UP SERVICE ROUTINE SIN 3 STATUS INHIBIT COPY =PFMSG,X GET MESSAGE ADDRESS SERVR EQU $ COPY =0,A SET A TO ZERO COPY A,S SET PSW TO ZERO JST SEL RESET/INITIALIZE CONTROLLER COPY X,$+2 STORE MESSAGE ADDRESS JST MSGA DISPLAY TRAP/EXCEPTION WORD 0 MESSAGE ADDRESS HLT WAIT HERE JMP ENT2A TO GO QUERIES * * UNIMPLEMENTED INSTRUCTION TRAP * UNINT: ENT UNI. INSTR. SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =INMSG,X GET MESSAGE ADDRESS JMP SERVR DISPLAY MESSAGE * * UNINSTALLED MEMORY TRAP * UNMET: ENT UNI. MEM. TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =MEMSG,X GET MESSAGE ADDRESS JMP SERVR DISPLAY MESSAGE * * POWER FAIL * PWRFL: ENT POWER FAIL SERVICE ROUTINE HLT WAIT FOR POWER * * CHAR./NUM. EXCEPTION * CHNUE: ENT CHAR./NUM. EXCEP. SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =CHMSG,X GET MESSAGE ADDRESS JMP SERVR DISPLAY MESSAGE * * STACK OVERFLOW * STKOV: ENT STK. OVR. TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =STMSG,X GET MESSAGE ADDRESS JMP SERVR DISPLAY MESSAGE * * USER TRAP * USETR: ENT USER TRAP SERVICE ROUTINE SIN 4 STA7 TUS INHIBIT COPY =USMSG,X GET MESSAGE ADDRESS JMP SERVR DISPLAY MESSAGE * * SYSTEM TRAP * SYSTR: ENT SYSTEM TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =SYMSG,X GET MESSAGE ADDRESS JMP SERVR DISPLAY MESSAGE * * ARITHMETIC ERROR * ARIER: ENT ARIT. ERROR SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =ARMSG,X GET MESSAGE ADDRESS JMP SERVR DISPLAY MESSAGE * * CONSOLE INTERRUPT * CNINT: ENT CONSOLE INTERRUPT SERVICE ROUTINE 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 JMP ENT2A GO TO QUERIES * LPOOL TITL TABLES (GLOBAL VARIABLES) ****************************** * * GLOBAL VARIABLES * * USED THROUGH OUT THE PROGRAM * ****************************** * OPTIONS +:20 * ACT WORD 0 ACTUAL WORD * ADRIOB WORD 0 CURRENT IOB ADDRESS * CCUR WORD 0 CURRENT CYL NO * EXP WORD 0 EXPECTED WORD * EOM WORD 0 END OF MEDIA FLAG * HCUR WORD 0 CURRENT HEAD NO * MISCAD WORD 0 WORD IN ERROR * SCUR WORD 0 CURRENT SECTOR NO * TCTEMP WORD 0 BUF PTR * TCUR WORD ' A' CURRENT TEST NO (A-I) * TEMP1 WORD 0 TEMP CELL * TEMP2 WORD 0 TEMP CELL * TEMP3 WORD 0 TEMP CELL * TEMP4 WORD 0 TEMP CELL * TEMP5 WORD 0 TEMP CELL * TPTR WORD 0 PTR TO TEST NO * UCUR WORD 0 CURRENT UNIT NO * UPTR WORD 0 PTR TO UNIT NO * MCDF WORD 1 MED CAP DISK FLAG TITL TABLES (I/O INSTRUCTION ADDRESSES) ****************************** * * I/O INSTRUCTION ADDRESSES * * TABLE OF I/O INSTRUCTION ADDRESSES * WHICH REQUIRE MODIFICATION WHEN THE * DEVICE ADDRESS IS CHANGED. * * TABLE MUST BE KEPT CONTIGUOUS * ****************************** * DAFRST EQU $ START OF DEV AD TABLE * WORD DA1 'OTA'  I/O SUBROUTINE * WORD DA2 'OTX' I/O SUBROUTINE * WORD DA3 'SEL' I/O SUBROUTINE * WORD DA4 'SENHIM' I/O SUBROUTINE * WORD DA5 'SENRDY' I/O SUBROUTINE * DASIZ EQU $-DAFRST DEV AD TABLE SIZE TITL TABLES (FC. ERROR MSGS. ADDRESSES) ****************************** * * TABLE OF FUNCTION CODE ERROR MESSAGE ADDRESSES * * TABLE MUST BE KEPT CONTIGUOUS * ****************************** * ERFCTB EQU $ PTR TO FUNC MSGS * WORD ERFC0 * WORD ERFC1 * WORD ERFC2 * WORD ERFC3 * WORD ERFC4 * WORD ERFC5 * WORD ERFC6 * WORD ERFC7 * WORD ERFC8 * WORD ERFC9 * WORD ERFCA * WORD ERFCB * WORD ERFCC * WORD ERFCD * WORD ERFCE *  WORD ERFCF TITL TABLES (TEST ADDRESSES) ****************************** * * TABLE OF TEST ADDRESSES * * TABLE MUST BE KEPT CONTIGUOUS * ****************************** * TSTABL EQU $ * WORD TESTA * WORD TESTB * WORD TESTC * WORD TESTD * WORD TESTE * WORD TESTF * WORD TESTG * WORD TESTH * WORD TESTI * TITL TABLES (MEDIMUM CAPACITY DISK PARAMETERS) ****************************** * * MEDIMUM CAPACITY DISK PARAMETERS * * THESE ARE THE PARAMETERS USED IN PLACE OF * THE HIGH CAPACITY DISK DEFAULTS. * * TABLE MUST BE KEPT CONTIGUOUS * ****************************** * MCP EQU $ MED CAP PARAMS WORD 203 NO OF CYLS WORD 0 STARTING CYL WORD 202 ENDING CYL WORD 4 NO OF HEADS WORD 0 STARTING HEAD WORD 3 ENDING HEAD WORD 12 NO OF SECTORS WORD 0 STARTING SECTOR NO WORD 11 ENDING SECTOR NO WORD 256 WDS PER SECTOR MCSIZ EQU $-MCP TABLE SIZE TITL TABLES (RESET-PARAMETER TABLE) ****************************** * * RESET-PARAMETER TABLE * * THESE ARE THE DEFAULT PARAMETERS. * TABLE MUST BE KEPT IN ORDE8 R * ****************************** * PRAMSX EQU $ START OF TEMP PARAM TABLE * TESTSX WORD TESTA WORD TESTB WORD TESTC WORD TESTD WORD TESTE WORD TESTF WORD TESTG WORD TESTH WORD -1 WORD -1 * DISKX WORD 'H' DISK TYPE * MODEX WORD 'D' DIAG * NONDEX WORD 0 DESTRUCTIVE * HCPX EQU $ * HIGH CAP PARAMETERS ******** CYLSX WORD 411 * TEMP NO OF CYLS * SCYLX WORD 0 * TEMP STARTING CYL NO * ECYLX WORD 410 * TEMP ENDING CYL NO * HDSX WORD 5 * TEMP NO OF HEADS * SHDX WORD 0 * TEMP STARTING HEAD NO * EHDX WORD 4 * TEMP ENDING HEAD NO * SECSX WORD 32 * TEMP NO OF SECTORS * SSECX  WORD 0 * TEMP STARTING SECTOR NUM * ESECX WORD 31 * ENDING SECTOR NUMBER * WDSX WORD 256 * WDS PER SECTOR  * EHCPX EQU $ ****************************** * WCPATX WORD PAT PATTERN DEFAULT * UNX WORD 0,-1 UNIT TABLE RES UNITS-1,0 * DEVADX WORD SMDA DEVICE ADDRESS * SHORTX WORD 0 SHORT TEST FLAG * SHORTCX WORD 0 SHORT TEST CYLINDERS * PASCTX WORD 0 PASS ZERO FIRST * CARX WORD 0 RUN OPTION SETTING * BPIFX WORD 0 BPI FLAG * ERR0X RES UNITS,0 UNIT ERRS * SOFT0X RES UNITS,0 UNIT SOFT ERRORS * FIRM0X RES UNITS,0 UNIT FIRM ERRORS * HARD0X RES UNITS,0 UNIT HARD ERRORS TITL TABLES (DYNAMIC-PARAMETER TABLE) ****************************** * * DYNAMIC-PARAMETER TABLE * * THESE ARE THE INTERMEDIATE VALUES FILLED * IN BY THE QUERIES. * * TABLE MUST BE KEPT IN ORDER. * ******************************* * PRAMSY EQU $ START OF DYNAM PARAM TABLE * TESTSY WORD TESTA WORD TESTB WORD TESTC WORD TESTD WORD TESTE WORD TESTF WORD TESTG WORD TESTH WORD -1 WORD -1 * DISKY WORD 'H' HIGH CAP * MODEY WORD 'D' DIAGNOSTIC * NONDEY WORD 0 DESTRUCTIVE * HCPY EQU $ * HIGH CAP PARAMS ***** CYLSY WORD 411 * 411 CYLS * SCYLY WORD 0 * FIRST CYL = 0 * ECYLY WORD 410 * LAST CYL = 410 * HDSY WORD 5 * 5 HEADS * SHDY WORD 0 * FIRST HEAD = 0 * EHDY WORD 4 * LAST HEAD = 4 * SECSY WORD 32 * 32 SECTORS * SSECY WORD 0 * FIRST SECTOR = 0 * ESECY WORD 31 * LAST SECTOR=31 * WDSY WORD 256 * 256 WDS/SECTOR * EHCPY EQU $ ************************ * WCPATY WORD PAT WORD PATTERN * UNY WORD 0,-1 UNIT TABLE RES UNITS-1,0 * DEVADY WORD SMDA DEVICE ADDRESS * SHORTY WORD 0 SHORT TEST FLAG * SHORTCY WORD 0 SHORT TEST CYLINDERS * PASCTY WORD 0 PASS ZERO * CARY WORD 0 RUN OPTION SETTING * BPIFY WORD 0 BPI FLAG * ERR0Y RES UNITS,0 UNIT ERRS * SOFT0Y RES UNITS,0 UNIT SOFT ERRORS * FIRM0Y RES UNITS,0 UNIT FIRM ERRORS * HARD0Y RES UNITS,0 UNIT HARD ERRORS TITL TABLES (WORKING-PARAMETER TABLE) ****************************** * * WORKING-PARAMETER TABLE * * THIS IS THE ACTUAL WORKING PARAMETER TABLE * TABLE MUST BE KEPT IN ORDER. * ****************************** * PRAMS EQU $ START OF PARAMETER TABLE * TESTS WORD TESTA TEST NO TABLE WORD TESTB WORD TESTC WORD TESTD WORD TESTE WORD TESTF WORD TESTG WORD TESTH WORD -1 WORD -1 TESTSN EQU $ * DISK WORD 'H' HIGH CAP DISK * MODE WORD 'D' DIAG * NONDES WORD 0 DESTRUCTIVE * HCP EQU $ * HIGH CAP PARAMETERS ***** CYLS WORD 411 * NO OF CYLS * SCYL WORD 0 * STARTING CYL NO * ECYL WORD 410 * ENDING CYL NO * HDS WORD 5 * NO OF HEADS * SHD WORD 0 * STARTING HEAD NO * EHD WORD 4 * ENDING HEA9 D NO * SECS WORD 32 * NO OF SECTORS * SSEC WORD 0 * STARTING SECTOR NUMBER * ESEC WORD 31 * ENDING SECTOR NUMBER * WDS WORD 256 * WDS PER SECTOR * EHCP EQU $ *************************** * WCPAT WORD PAT PATTERN * UN WORD 0,-1 UNIT TABLE RES UNITS-1,0 * DEVAD WORD SMDA DEVICE ADDRESS * SHORT WORD 0 SHORT TEST FLAG * SHORTC WORD 0 SHORT TEST CYLINDERS * PASCTR WORD 0 PASS COUNT AT FIRST * CAR WORD 0 RUN OPTION SETTING * BPIF WORD 0 BPI FLAG * ERR0 RES UNITS,0 UNIT ERRORS * SOFT0 RES UNITS,0 UNIT SOFT ERRORS * FIRM0 RES UNITS,0 UNIT FIRM ERRORS * HARD0 RES UNITS,0 UNIT HARD ERRORS * PRMSIZ EQU $-PRAMS TABLE SIZE PRMSZ2 EQU $-PRAMS*2 DOUBLE SIZE TSTSIZ EQU TESTSN-TESTS TEST TABLE SIZE TITL CRT/TTY MESSAGES (QUERIES) ****************************** * * QUERY MESSAGES * ****************************** * TITLE BYTE CR:,LF:,LF:,'HIGH/MEDIMUM CAPACITY DISK DIAGNOSTIC/FORMATTER' BYTE CR:,LF:,'93919-' WORD REV:,CRLF:,-1 * QERM10 BYTE CR:,LF:,'HIGH OR MEDIUM?',:FF * QERM20 BYTE CR:,LF:,'DIAG, FMATTER OR TECH TEST (D,F,T)?',:FF * QERM30 BYTE CR:,LF:,'DEV AD (:14)?:',:FF * QERM40 BYTE CR:,LF:,'TSTS (A-H)?',:FF * QERM50 BYTE CR:,LF:,'CYLS?',:FF * QERM60 BYTE CR:,LF:,'SHORT TEST-CYLS?',:FF * QERM70 BYTE CR:,LF:,'HDS?',:FF * QERM80 BYTE CR:,LF:,'SECTORS/TRACK?',:FF * QERM90 BYTE CR:,LF:,'WORDS/SECTOR (256)?',:FF * QERMA0 BYTE CR:,LF:,'BPI UNIT (2200)?',:FF * QERMB0 BYTE CR:,LF:,'PATN (:6DB6)?:',:FF * QERMC0 BYTE CR:,LF:,'UNITS=',:FF * QERMD0 BYTE CR:,LF:,'SAVE DATA (Y OR N)?',:FF * QERME0 BYTE CR:,LF:,'RUN OPTIONS (:00)?:',:FF * QERMF0 BYTE CR:,LF:,'UNIT TO FORMAT (0)?',:FF * TTMS BYTE CR:,LF:,'ENTER:',CR:,LF: TECH TEST QUERY BYTE 'FC,U,C,H,S,IN,LN,DP,OP,CL,CP',CR:,LF:,'?',:FF TITL CRT/TTY MESSAGES (ERROR FUNC. CODES) ****************************** * * ERROR FUNCTION CODE MESSAGES * ****************************** * ERFC0 BYTE ' (TEST I/O)',:FF * ERFC1 BYTE ' (FORMAT)',:FF * ERFC2 BYTE ' (WRITE)',:FF * ERFC3 EQU $ RESERVED * ERFC4 BYTE ' (READ)',:FF * ERFC5 EQU $ RESERVED * ERFC6 BYTE ' (RD REG)',:FF * ERFC7 EQU $ RESERVED * ERFC8 BYTE ' (VERIFY)',:FF * ERFC9 BYTE ' (SEEK)',:FF * ERFCA EQU $ RESERVED * ERFCB EQU $ RESERVED * ERFCC EQU $ RESERVED * ERFCD EQU $ RESERVED * ERFCE EQU $ RESERVED * ERFCF EQU $ RESERVED TITL CRT/TTY MESSAGES (ERROR REPORT) ****************************** * * ERROR REPORT MESSAGES * ****************************** * ERMS1 BYTE CR:,LF:,LF:,'ER ',:FF * ERMS2 BYTE ' (FORMATTER)',:FF * ERMS3 BYTE CR:,LF:,'ER AD :',:FF * ERMS4 BYTE 'PASS ',:FF * ERMS5 BYTE 'UNIT ',:FF * ERMS6 BYTE 'TEST ',:FF * ERMS7 BYTE CR:,LF:,'IOB ADDRESS :',:FF * ERMS8 BYTE CR:,LF:,'STATUS :',:FF * ERMS9 BYTE CR:,LF:,'DRIVE STATUS :',:FF * ERMS10 BYTE CR:,LF:,'FUNC :',:FF * ERMS11 BYTE 'CYL ',:FF * ERMS12 BYTE 'HEAD ',:FF * ERMS13 BYTE 'SECT ',:FF * ERMS14 BYTE CR:,LF:,'BUF :',:FF * ERMS15 BYTE 'LEN :',:FF * ERMS16 BYTE 'WDS XFRD :',:FF * ERMS17 BYTE CR:,LF:,'WD IN ERROR :',:FF * ERMS18 BYTE 'EXP :',:FF * ERMS19 BYTE 'ACT :',:FF * ERMS20 BYTE CR:,LF:,'INT LOC :',:FF * ERMS21 BYTE CR:,LF:,'SECTOR ADDRESS AFTER I/O ',:FF * ERMS22 BYTE CR:,LF:,LF:,'WORD CHAIN IOB :',:FF * ERMS23 BYTE 'WD COUNT :',:FF * ERMS24 BYTE 'BUF AD :',:FF * TITL CRT/TTY MESSAGES (TRAPS) ****************************** * * TRAP MESSAGES * ****************************** * IN: MSG BYTE CR:,LF:,LF:,'UNIMPLEMENTED INSTRUCTION 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 TITL CRT/TTY MESSAGES (MISCELLANEOUS) ***************************** * * MISCELLANEOUS MESSAGES * ***************************** * TALTTL BYTE CR:,LF:,LF:,'ERROR TOTALS',:FF * UNITMG BYTE CR:,LF:,'UNIT' PRUNIT BYTE ' ',:FF * SOFTMS BYTE ' SOFT ',:FF * FIRMS BYTE ' FIRM ',:FF * HARDMS BYTE ' HARD ',:FF * ALLMS BYTE ' ALL ',:FF * ACTHDM BYTE CR:,LF:,'ACT HEADER: ',:FF * EXPHDM BYTE CR:,LF:,'EXP HEADER: ',:FF * ACCRCM BYTE CR:,LF:,'ACT CRC: ',:FF * XPCRCM BYTE CR:,LF:,'EXP CRC: ',:FF * BADTRK BYTE CR:,LF:,LF:,'BAD TRACK: CYL ',:FF * BADTK1 BYTE ' HEAD ',:FF * DUMPMG BYTE CR:,LF:,LF:,'BUFFER DUMP, AT :',:FF * EOT BYTE CR:,LF:,'END OF TEST ',:FF * PASSMG BYTE CR:,LF:,'PASS ',:FF * STARS BYTE '****',:FF * LPMSG BYTE CR:,LF:,'LINE PRINTER TIMED OUT',CR:,LF:,:FF * TITL I/O BUFFERS ****************************** * * I/O BUFFERS * * BUF - STANDARD BUFFER * * SAVBUF - USER'S SAVE BUFFER * ****************************** * BUF RES 570,0 STANDARD BUFFER * SAVBUF RES 570,0 USER'S SAVE BUFFER * ENDPROG EQU $ THAT'S ALL FOLKES !!!! END SMD DTK1 BYTE ' HEAD ',:FF * DUMAS LO=TV MACRO HCMCDIAG(ERR) LINK HCMCDIAG+SF.DEBUGS(AB=2000,UL) 820607085727820607085727820607085727IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII< IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII