HED S4 - SECTION 4 (CONTINUED) * * * SECTION 4 - CONTINUED * * THIS SECTION READS RANDOM SECTORS AND VERIFIES * THAT THEY ACTUALLY ARE THE SECTORS REQUESTED. * * THE TEST RUNS FOR ABOUT 250 SEEKS * * AT THE END OF EACH SEEK, A READ IS ISSUED FOR THE * NEXT AVAILABLE SECTOR. AS SOON AS THIS READ IS COMPLETED, THE * NEXT SEEK IS STARTED. * * FLAG4 EQU GLOB2 USED WHEN STEP 53 LOOPS ALNT EQU GLOB4 SEEK LENGTH COUNTER ZCYL EQU GLOB5 HOLDS PREVIOUS CYLINDER NUMBER ZHDS EQU GLOB6 HOLDS PREVIOUS HEAD/SECTOR S5A EQU * CLA STA ALNT ZERO SEEK LENGTH COUNTER STA SVCT ZERO TOTAL TIME IN SEEKS STA SVKC ZERO SEEK COUNT CCA -1 STA FIRST LDA D128+SZREF CHECK ONE SECTOR STA WCNT SET WORD COUNT FOR ONE SECTOR * S5C EQU * LDA CYL LOAD PREVIOUS CYLINDER NUMBER STA ZCYL AND SAVE IT FOR RCHK LDA HEAD LOAD PREVIOUS HEAD NUMBER IOR HDON ALF,ALF MOVE TO LEFT HALF IOR SECTR PLUG IN SECTOR NUMBER STA ZHDS AND SAVE FOR RCHK IFAKE EQU * USED IN RCHK JSB RNCH GENERATE CYLINDER AND HEAD NUMBER JSB RNSC CLA,INA SET UP STA FLAG4 FOR TIMING LDA SVCT SET UP STA SVCTA CURRENT MILLISECOND COUNT * * STEP 53 * THIS SEEK MOVES TO A * RANDOM CYLINDER AND HEAD. * LDA D53 JSB COPR JSB FSEEK LDA FLAG4 HAS THIS STEP BEEN REPEATED SZA,RSS SKIP IF NO JMP S4A YES CLA STA FLAG4 DISABLE TIMING ON LOOP LDA SVCTA SAVE CURRENT STA SVCT MILLISECOND COUNT ISZ FIRST JSB RCHK S4A EQU * JSB ENDST * * STEP 54 * THIS READ READS IN ONE SECTOR * FROM A RANDOM LOCATION * LDA D54 JSB COPR JSB SEEH JSB READ GO DO READ JSB WENDI,I CLA STA FIRST RESET LDA CYL LOAD CYLINDER NUMBER CMA,INA ADA ZCYL GET SEEK LENGTH SSA SKIP IF NOW POSITIVE CMA,INA ABSOLUTE VALUE ADA ALNT ADD TO TOTAL STA ALNT LDA SVKC INA COUNT UP SEEK COUNT STA SVKC CPA D128 SKIP IF NO PRINT RSS 128 TH. PRINT OUT TIMING JMP S5TE NOT NOW * JSB SWR AND BIT12 ABORT IF SZA,RSS BIT 12 IS CLEAR JMP S5TE ABORT PRINTOUT JSB TTYCK JMP S5TE ABORT PRINTOUT LDA SVCT LOAD TOTAL TIME ADA MM64 AVERAGE ADJUSTMENT JSB MSCV CONVERT TO ASCII LDB P054A LDA CVT1 TRANSFER STA B,I TO INB LDA CVT2 MESSAGE STA B,I INB LDA CVT3 STA B,I LDA ALNT LOAD TOTAL LENGTH JSB MSCV CONVERT TO ASCII LDB P054B LDA CVT2 TRANSFER STA B,I TO INB LDA CVT3 MESSAGE STA B,I H54 LDA B54 JSB PRINT AVERAGE RANDOM SEEK TIME XXXX.X. * AVERAGE RANDOM SEEK LENGTH XX.X * S5TE EQU * LDB SVKC LOAD SEEK COUNTER JSB SWR SWITCH REGISTER TO A AND BIT5 ADB M256 SHORT TEST SZA,RSS SKIP IF YES ADB M7936 NO SSB SKIP IF DONE JMP S5C DO ANOTHER JMP SKIPI,I EXIT S4 HED RCHK,RCHK1 * * * RCHK * THIS ROUTINE CHECKS THE BUFFERS GENERATED BY RCGEN * IT USES BUFAE FOR A POINTER AND CHECKS ONE SECTOR * SEE RCGEN FOR A DESCRIPTION OF THE SECTOR FORMAT * * RCHK NOP * LDA RCHK SAVE RETURN ADDRESS FOR EXIT JSB RCHK1 FORM BUFFER CHECK SUM SZA SKIP IF CHECKSUM OK JMP RCER CHECKSUM ERROR LDA TEMP2 GET CYLINDER CHECK BACK CPA ZCYL CHECK FOR PROPER CYLINDER RSS JMP RCER WRONG CYLINDER LDA TEMP3 GET HEAD/SECTOR BACK CPA ZHDS JMP WRERX NO BUFFER ERRORS, CHECK STATUS * RCER EQU * LDA ZCYL RESTORE STA CYL CYL LDA ZHDS ALF,ALF AND B377 STA HEAD HEAD LDA ZHDS AND B377 STA SECTR AND SECTR CCA -1 STA FIRST RESET FIRST FLAG LDA FAKE RESET STA WCHK RETURN RCER1 EQU * LDA TEMP1 LOAD CHECKSUM LDB P052A POINTER-CHECKSUM JSB CNVRT CONVERT TO ASCII LDA TEMP2 LOAD CYLINDER CHECK LDB P052B POINTER-CYLINDER JSB CNVRT CONVERT TO ASCII LDA TEMP3 LOAD HEAD/SECTOR CHECK LDB P052C POINTER-HEAD AND SECTOR JSB CNVRT CONVERT TO ASCII LDA TEMP2 LDB P052D PRINT CYLINDER IN DECIMAL JSB DCIN2 LDA TEMP3 ALF,ALF AND B377 LDB P052E PRINT HEAD IN DECIMAL JSB DCIN1 LDA TEMP3 AND B377 LDB P052F PRINT SECTOR IN DECIMAL JSB DCIN1 E52 LDB B52 BUFFER CHECKSUM XXXXXX CYL * YYYYYY HD/S ZZZZZZ STB STRF SET ERROR MESSAGE POINTER STB ELOC SAVE FOR ERHLT JMP WRERZ GO ANALYZE ERRORS * * RCHK1 * FORM BUFFER CHECKSUM * RCHK1 NOP STA WCHK LDA B46 READ STA COPRN LDB BUFAE LOAD BUFFER POINTER LDA M124+SZREF STA TEMP1 SET COUNT FOR ADD LOOP LDA B,I LOAD FIRST WORD INB ADA B,I MAKE CYLINDER CHECK INB STA TEMP2 SAVE CYLINDER CHECK LDA B,I INB ADA B,I MAKE HEAD/SECTOR CHECK INB STA TEMP3 SAVE HDS CHECK ADA TEMP2 CHECKSUM SO FAR * RCQ EQU * ADA B,I ADD UP ALL WORDS INB ISZ TEMP1 COUNT DOWN COUNTER JMP RCQ STA TEMP1 SAVE CHECKSUM JMP RCHK1,I RETURN HED S5 - SECTION 5 * * * SECTION 5 * THIS SECTION RUNS MULTIPLE UNIT TEST IF AT LEAST TWO UNITS * ARE PRESENT. THE SEEKS OVERLAP. THE READ CHECK IS THE SAME * THAT S4 PERFORMS. * STBLE EQU GLOB1 STBLF EQU GLOB2 STBLG EQU GLOB3 S5 EQU * LDA UNITC NUMBER OF UNITS CPA D1 IS IT ONLY ONE? JMP S6NO YES,ABORT TEST CPA NI ARE ALL INITIALIZED? JMP S6TST YES LDA NI NO,FINISH ADA UNITS INITIALIZATION LDA A,I STA UNIT INITIALIZE NEXT UNIT ISZ NI JSB SHEAD SET HEADS INTO PASS MESSAGE JMP THRUI,I DISABLE REPEAT OF SECTION S6TST EQU * LDB S4BUG TROUBLE? SZB JMP S6NO YES - ABORT CLA STA S6CNT ZERO COUNT STA SHTAS AND STATUS * CHECK FOR RESTRICTED CYLINDER JSB S6SET CLA S6X1 EQU * LDB SAV6,I ADB S400 IOR B,I OR THE SWR'S TOGETHER ISZ SAV6 ISZ FL6 JMP S6X1 STA TEMP1 JSB S6SET LDA TEMP1 S6X2 EQU * LDB SAV6,I ADB S400 STA B,I STORE RESULT BACK ISZ SAV6 ISZ FL6 JMP S6X2 * LDA D128+SZREF STA WCNT WORD COUNT = 128 * THIS SECTION IS TIME DEPENDENT AND MAY NOT BE SINGLE CYCLED S6L EQU * JSB RNCH SELECT RANDOM CYL AND HEAD JSB RNSC SELECT RANDOM SECTOR * * STEP 55 * PERFORM MULTI-SEEK AND READ * LDA D55 JSB COPR JSB S6SET S6SL EQU * LDA SAV6,I GENERATE STA UNIT UNIT NUMBER JSB SEEK PERFORM SEEK ISZ SAV6 NEXT UNIT ISZ FL6 DONE? JMP S6SL NO JSB S6SET LDB BPTO WORK AREA S6L1 EQU * SET UP FOR VALIDITY CHECK LDA SAV6,I STA B,I INB ISZ SAV6 ISZ FL6 JMP S6L1 JSB S6SET STB STBLE SET UP FOR STB STBLF ATTENTION/SEEK-STATUS TABLE S6RL EQU * LDA B44 SEEK IN S5 STA COPRN LDA MM512 STA LCNT ALLOW 512 MILLISECONDS FOR FLAG S6D EQU * CLA,INA JSB TMR,I DELAY 1 MSEC CC09 SFC CC JMP CC10 FLAG IS SET ISZ LCNT JMP S6D JSB PCOP CURRENT OPERATION LDA B10 NO CC FLAG STA ELOC JSB FPRNT JSB S6SET SET UP POINTER SL3 LDA SAV6,I GET NEXT STA UNIT UNIT LDA STBLE CMA,INA ADA STBLF SZA,RSS JMP S6L4 NO INTERRUPTS OCCURRED INA RAR STA LOCAL = NUMBER OF INTERRUPTS LDA STBLF SET UP STA STBLG POINTER SL1 LDA STBLG,I GET ATTENTION WORD JSB GETN CONVERT TO UNIT (IN B) CPB UNIT IS THIS THE ONE? JMP SL2 YES - THIS UNIT IS OK ISZ STBLG NO MOVE ISZ STBLG POINTER TWICE -PAST SEEK STATUS ISZ LOCAL JMP SL1 JMP S6L4 SL2 ISZ SAV6 JMP SL3 CC10 LIA CC STA ATTN SAVE ATTENTION BITS STA STBLE,I SAVE ATTENTION ISZ STBLE JSB GETN JMP S6F EE21 JSB PCOP E21 JSB ERROR MISSING OR DUPLICATE ATTENTION S6L4 LDA STBLE CALCULATE CMA,INA NUMBER OF ADA STBLF WORDS IN THE STA LOCAL STACK LDB P033A BUFFER ADDRESS S6M3 LDA BB BLANK,BLANK JSB S6M6 SET UP BUFFER LDA CRLF CR,LF JSB S6M6 SET UP BUFFER JMP S6M3 S6M6 NOP STA TEMP2 ENDING WORD STB TEMP1 BUFFER POINTER LDA STBLF,I GET NEXT WORD FROM TABLE ISZ STBLF JSB CNVRT DEPOSIT RESULT IN OCTAL LDB TEMP1 ADB B3 LDA TEMP2 STA B,I STORE ENDING INB ISZ LOCAL DONE? JMP S6M6,I NO ADB MM1 YES LDA C1440 #,BLANK STA B,I LDA B33 H33 JSB FPRNT ATTENTION/SEEK-STATUS TABLE JSB ADDOI,I JMP STP55 S6F STB UNIT JSB STAT STA STBLE,I SAVE SEEK-STATUS ISZ STBLE LDA UNITC CHECK VALIDITY OF UNIT NUMBER CMA,INA STA GLOB4 LDB BPTO S6L3 EQU * LDA B,I CPA UNIT JMP S6OK INB ISZ GLOB4 JMP S6L3 JMP EE21 NOT VALID BIT S6OK STB B,I DON'T ALLOW SAME BIT AGAIN JSB WCHK CHECK STATUS JSB FSEEH ADDRESS RECORD IN S5 JSB READ JSB S6CHK CHECK BUFFER ISZ FL6 DONE? JMP S6RL NO STP55 EQU * JSB ENDST ISZ S6CNT BUMP COUNTER LDB S6CNT JSB SWR AND BIT5 SHORTEN TEST? ADB M256 -256 SZA,RSS SKIP IF YES ADB M7936 -7936 SSB DONE? JMP S6L NO LDA B14 STA MDFLG S6NO EQU * LDA UNITA RESET STA UNIT UNIT NUMBER FOR NEXT PASS JSB SHEAD SET HEADS INTO PASS MESSAGE LDA HFLAG IS FLAG SET SLA,RSS SKIP IF YES JMP S6OUT LDA HDON SWITCH XOR D2 SURFACE STA HDON LDA HDON UPPER PLATTER SZA SELECTED? JMP SKIPI,I NO - EXIT S5 LDA S4BUG TROUBLE? SZA JMP S6OUT YES * * STEP 56 * FOR MODE C AND HEAD = 2,CHECK ONE SECTOR FROM HEAD 0(WRITTEN * IN S4 ON SOME PREVIOUS PASS) TO VERIFY HEAD SELECT LOGIC. * STEP IS RUN ON ALL DRIVES. * LDA D56 JSB COPR CLA STA HEAD STA SECTR LDA FTR,I FIRST ENTRY IN CYLINDER TABLE STA CYL JSB S6SET SET UP FOR ALL UNITS STP56 LDA SAV6,I STA UNIT ISZ SAV6 JSB FSEEK JSB READ JSB WCHK JSB S6CHK CHECK DATA INCLUDING HEAD # ISZ FL6 DONE? JMP STP56 NO LDA UNITA RESET STA UNIT UNIT FOR NEXT PASS JSB ENDST S6OUT EQU * CLA STA S4BUG JMP SKIPI,I * * * * S6CHK * CHECKS BUFFER FOR PROPER POSITION AND DATA * TRANSFER * S6CHK NOP LDA S6CHK JSB RCHK1 FORM BUFFER CHECKSUM SZA SKIP IF OK JMP SCER ERROR LDA TEMP2 CPA CYL IS CYLINDER OK? RSS YES JMP SCER NO,ERROR LDA TEMP3 ALF,ALF AND B377 LDB A LDA HEAD IOR HDON CPA B IS HEAD OK? RSS YES JMP SCER NO,ERROR LDA TEMP3 AND B377 CPA SECTR IS SECTOR OK? JMP WRERX YES SCER EQU * JMP RCER1 * * S6SET NOP LDA UNITC NUMBER OF UNITS CMA,INA TWO'S COMPLEMENT STA FL6 LDA UNITS POINTER FOR STA SAV6 UNIT NUMBERS JMP S6SET,I * * SHEAD * SET HEADS INTO PASS MESSAGE * SHEAD NOP LDB P065E ADB MM4 LDA HDON IOR C7461 27461B (/,1) STA B,I ADB MM1 LDA HDON IOR B2060 20060B (BLANK,0) STA B,I JMP SHEAD,I HED GETN * * * GETN * SCANS A REGISTER, RETURNS WITH BIT POSITION OF * RIGHTMOST "1" IN REGISTER B. SKIPS ON ERROR. * GETN NOP CLB S6L2 SLA JMP GETN,I FOUND IT INB MAYBE NEXT TIME? RAR CPB D4 RSS JMP S6L2 ONLY FIRST 4 BITS (0,1,2,3) ISZ GETN JMP GETN,I HED PCHK,MSCV * * PCHK ROUTINE. * THIS ROUTINE CHECKS THE ENTIRE READ BUFFER FOR * EQUALITY WITH THE WORD IN PATT. * PCHK NOP * LDA PCHK LOAD RETURN ADDRESS STA WCHK SAVE FOR POSSIBLE CALL * LDA WCNT LOAD BUFFER LENGTH ARS,ARS DIVIDE BY EIGHT ARS ( FOR EIGHT UNIT LOOP ) CMA,INA TWOS COMPLEMENT STA TEMP1 SET COUNTER FOR LOOP LDA PATT LOAD COMPARISON WORD LDB BUFAE LOAD READ BUFFER ADDRESS * * BEGINNING OF THE LOOP * PCHL EQU * CPA B,I CHECK FOR MATCH WITH BUFFER INB,RSS COUNT UP BUFFER ADDRESS AND SKIP JMP PCHE MIS-COMPARE CPA B,I INB,RSS JMP PCHE CPA B,I INB,RSS JMP PCHE CPA B,I INB,RSS JMP PCHE CPA B,I INB,RSS JMP PCHE CPA B,I INB,RSS JMP PCHE CPA B,I INB,RSS JMP PCHE CPA B,I INB,RSS JMP PCHE ISZ TEMP1 COUNT OUT JMP PCHL NOT DONE, CONTINUE CHECKING * JMP WRERX NO BUFFER ERRORS, CHECK STATUS * * PCHE STB TEMP2 POINTER - IS LDA PATTI SET UP STA TEMP1 SHOULD BE PART OF ERROR MESSAGE LDA BUFAE CMA,INA ADA TEMP2 A = WORD NUMBER JMP EE101 SKP * * THIS ROUTINE TAKES THE NUMBER IN THE A-REG, * DIVIDES BY 128 AND PUTS THE ASCII ( DECIMAL ) * RESULT INTO CVT1,CVT2 AND CVT3 (XXXX.X) * * MSCV NOP STA TEMP1 LOAD NUMBER OF MILLISECONDS ALF,ALF RAL DIVIDE BY 128 AND B377 INTEGRAL NUMBER OF MILLISECONDS JSB DECIN CONVERT INTEGER TO DECIMAL ASCII LDA TEMP1 START ON FRACTION PART AND B177 LEAVE ONLY FRACTION PART CCB B _ -1 TMDL ADA MM13 CLOSE TO 128/10 INB COUNT UP TENTHS PART SSA,RSS SKIP IF TENTHS CALCULATION DONE JMP TMDL ADB ASCD0 MAKE INTO .X STB CVT3 STORE JMP MSCV,I RETURN HED MESSAGE TABLES * FERC ABS -FER FER DEF *+1 * NOTE: UNUSED POSITIONS ARE USED FOR OTHER POINTERS ETC. DEF H0 MESSAGE NUMBER TABLE DEF H1 DEF E2 DEF E3 DEF E4 DEF E5 DEF E6 DEF E7 DEF E10 DEF E11 DEF E12 DEF E13 DEF E14 N5777 OCT 155777 (H15) WENDI DEF WEND (H16) DEF H17 DEF H20 DEF E21 SENDI DEF SEND (H22) DEF H23 DEF H24 DEF H25 DEF H26 DEF H27 DEF H30 DEF H31 DEF H32 DEF H33 DEF H34 DEF H35 DENDI DEF DEND (H36) DEF H37 DEF H40 DEF H41 DEF H42 DEF E43 FAKE DEF IFAKE (H44) NOP H45 NOP H46 DEF E47 DEF E50 DEF H51 DEF E52 DEF H53 DEF H54 DEF H55 DEF H56 DEF E57 NOP H60 NOP USED BY PCOPR DEF H62 DEF E63 DEF E64 DEF H65 NOP H66 NOP H67 DEF H70 DEF H71 DEF E72 LER DEF * FMI DEF *+1 MESSAGE ADDRESS TABLE DEF M0 DEF M1 DEF M2 DEF M3 DEF M4 DEF M5 DEF M6 DEF M7 DEF M10 DEF M11 DEF M12 DEF M13 DEF M14 DEF M15 DEF M16 DEF M17 DEF M20 DEF M21 DEF M22 DEF M23 DEF M24 DEF M25 DEF M26 DEF M27 DEF M30 DEF M31 DEF M32 DEF M33 DEF M34 DEF M35 DEF M36 DEF M37 DEF M40 DEF M41 DEF M42 DEF M43 DEF M44 DEF M45 DEF M46 DEF M47 DEF M50 DEF M51 DEF M52 DEF M53 DEF M54 DEF M55 DEF M56 DEF M57 DEF M60 DEF M61 DEF M62 DEF M63 DEF M64 DEF M65 DEF M66 DEF M67 DEF M70 DEF M71 DEF M72