HED S2 - SECTION 2 * * * SECTION 2 IS ORGANIZED AS FOLLOWS * * CYLINDER ADVANCE * SWITCH 6=0 -- ALL CYLINDERS FROM 0 TO 202 * SWITCH 6=1 -- ALL CYLINDERS IN TRTAB * . * . * . PATTERN GENERATOR * . GENERATE BUFFERS FOR EACH OF THE PATTERNS IN PATTR * . SKIP THIS SECTION IF SWITCH 5=1 * . . * . . TRACK ADVANCE * . . ALL TRACKS FROM 0 TO TRPC-1 * . . . * . . . BLOCK ADVANCE * . . . EACH TRACK IS WRITTEN AS THREE BLOCKS * . . . . * . . . . WRITE DATA BUFFER * . . . . * . . * . . TRACK ADVANCE * . . ALL TRACKS FROM 0 TO TRPC-1 * . . . * . . . BLOCK ADVANCE * . . . EACH TRACK IS READ AS THREE * . . . BLOCKS * . . . . * . . . . READ EACH BLOCK * . . . . * . . . . CHECK DATA READ * . . . . * . . . * . . * . * . * * SVCT EQU GLOB1 USED TO COUNT TOTAL TIME FLAG2 EQU GLOB2 USED WHEN STEP 45 LOOPS SVKC EQU GLOB3 PATT EQU GLOB4 VARIABLE TO SAVE CURRENT PATTERN PTNX EQU GLOB5 COUNTER FOR PATTERN TABLE S2 EQU * CLA STA SVCT ZERO TOTAL TIME IN SEEKS STA SVKC ZERO SEEK COUNT STA CYLX SET ZERO INTO INITIAL CYLINDER STA SHTAS CCA STA FIRST FIRST = -1 S2L EQU * JSB CYLJ TRANSLATE CYLX INTO CYL CLA A _ 0 STA HEAD POSITION FOR HEAD ZERO AND STA SECTR SECTOR ZERO CLA,INA SET UP STA FLAG2 FOR TIMING LDA SVCT MOVE SAVED STA SVCTA COUNTER BACK * * STEP 45 * SELECT CYLINDER ACCORDING TO SWITCH REGISTER BIT 6. PERFORM * SEEK OPERATION * LDA D45 JSB COPR JSB FSEEK LDA FLAG2 HAS THIS STEP BEEN REPEATED? SZA,RSS SKIP IF NO JMP S2A YES CLA DON'T COUNT STA FLAG2 ( DISABLE TIMING ON LOOP ) ISZ FIRST FIRST SEEK LDA SVCTA SAVE CURRENT STA SVCT MILLISECOND COUNT S2A EQU * JSB ENDST LDA SVKC INA COUNT UP SEEK COUNTER STA SVKC CPA D129 HAVE WE DONE 128 FULL SEEKS RSS YES, PRINT OUT SEEK TIMING JMP TNTW NO, CONTINUE ON * JSB SWR LOAD SWITCH REGISTER AND BIT12 SZA SKIP IF BIT 12 CLEAR JSB TTYCK JMP TNTW ABORT PRINOUT LDA SVCT LOAD NUMBER OF MILLISECONDS ADA MM64 AVERAGE ADJUSTMENT JSB MSCV CALL CONVERTER LDA CVT2 TRANSFER STA P053A,I TO LDA CVT3 MESSAGE STA P053B,I H53 LDA B53 AVERAGE MINIMUM SEEK TIME XX.X JSB PRINT PRINT OUT SEEK TIME MESSAGE * TNTW EQU * JSB SWR LOAD SWITCH REGISTER AND BIT5 CHECK FOR SHORT TEST SZA SKIP IF LONG JMP S2H SHORTEN SECTION TWO * * * THE FOLLOWING SECTION OF CODE CYCLES THROUGH * ALL TEN PATTERNS IN THE PATTERN TABLE * * LDA BPTR LOAD BUFFER ADDRESS STA BUFAD SET WRITE AND LDA BPTS STA BUFAE READ BUFFER ADDRESSES LDA MM10 PATTERN TABLE IS TEN ENTRIES LONG STA PTNX SAVE IN COUNTER WORD * WGEN EQU * LDA M256+SZREF 8 SECTOR WORD COUNT / 4 STA TEMP1 SAVE FOR THE FAST FILL LOOP LDB PTNX LOAD THE PATTERN COUNTER ADB PATR ADD ON THE TABLE ADDRESS LDA B,I LOAD THE PATTERN TO A STA PATT SAVE IT FOR THE PCHK ROUTINE LDB BUFAD LOAD THE WRITE ADDRESS WGL EQU * STA B,I INB STA B,I INB STA B,I INB STA B,I INB ISZ TEMP1 COUNT DOWN COUNTER ( BY FOUR ) JMP WGL CONTINUE ON IF NOT DONE SKP * * STEP 46 * THE FOLLOWING CODE WRITES THE PATTERN IN THE BUFFER * ONTO THE ENTIRE CYLINDER * * TO USE THE MINIMUM TIME FOR EACH TRACK, THE TRACK * IS DIVIDED INTO THIRDS WHICH ARE WRITTEN * IN THE ORDER, FIRST, THIRD, SECOND. * LDA D46 JSB COPR CLB STB HEAD SET HEAD ZERO WNHW EQU * CLA STA SECTR FIRST BLOCK STARTS AT SECTOR ZERO * * THIS SEEK SELECTS A NEW HEAD * JSB SEEH SEEK TO CURRENT HEAD * * THE FOLLOWING WRITE IS FOR THE * FIRST THIRD OF THIS TRACK * LDA WCFT STA WCNT SET WORD COUNT JSB WAIH WAIT FOR HEAD SWITCHING JSB WRITE JSB WCHK CHECK FOR ERRORS * * THIS OPERATION IS A WRITE FOR * THE LAST THIRD OF THIS TRACK * LDA SCLT STA SECTR JSB SEES LDA WCLT STA WCNT SET WORD COUNT JSB WAIS WAIT FOR SECTOR SWITCHING JSB WRITE JSB WCHK CHECK FOR ERRORS * * THIS OPERATION IS A WRITE FOR * THE SECOND THIRD OF THIS TRACK * LDA SCST STA SECTR JSB SEES LDA WCFT STA WCNT SET WORD COUNT JSB WAIS WAIT FOR SECTOR SWITCHING JSB WRITE JSB WCHK CHECK FOR ERRORS * ISZ HEAD HEAD := HEAD + 1 LDA HEAD CPA TRPC CONTINUE ON IF NOT FINISHED WITH THE CYLINDER CLA,RSS DONE, SKIP OUT JMP WNHW WRITE ON EACH TRACK JSB ENDST SKP * * STEP 47 * THE FOLLOWING SECTION READS BACK THE PATTERNS AND * COMPARES EACH WORD WITH PATT. * LDA D47 JSB COPR CLA STA HEAD SET HEAD ZERO WNHR EQU * CLA STA SECTR START AT SECTOR ZERO JSB FSEEH ADDRESS RECORD IN S2 * * THIS OPERATION IS A READ FOR * THE FIRST THIRD OF THIS TRACK * LDA WCFT STA WCNT SET LENGTH OF FIRST THIRD JSB READ JSB PCHK CHECK FOR BUFFER MISMATCH * * THIS OPERATION IS A READ FOR * THE LAST THIRD OF THIS TRACK * LDA SCLT STA SECTR SET SECTOR NUMBER JSB SEES LDA WCLT LENGTH OF LAST THIRD STA WCNT SET WORD COUNT JSB WAIS WAIT FOR SECTOR SWITCHING JSB READ JSB PCHK * * THIS OPERATION IS A READ FOR * THE SECOND THIRD OF THIS TRACK * LDA SCST SECTOR WHERE SECOND THIRD STARTS STA SECTR JSB SEES LDA WCFT WORD COUNT FOR FIRST THIRD STA WCNT SET WORD COUNT JSB WAIS WAIT FOR SECTOR SWITCHING JSB READ JSB PCHK CHECK FOR BUFFER ERRORS ISZ HEAD HEAD := HEAD + 1 LDA HEAD CPA TRPC CHECK FOR END OF CYLINDER RSS SKIP OUT IF DONE JMP WNHR CONTINUE FOR ALL TRACKS JSB ENDST ISZ PTNX HAVE ALL PATTERNS BEEN TRIED JMP WGEN NO, GO BACK FOR NEXT SKP S2H EQU * JSB CYLD COUNT UP CYLX AND CHECK FOR DONE JMP S2L LOOP * JMP SKIPI,I EXIT S2 * * OCT 000000 OCT 177777 OCT 125252 OCT 052525 OCT 007417 OCT 170360 OCT 162745 OCT 163346 OCT 155555 OCT 022222 PATTR EQU * HED S3 - SECTION 3 * * * SECTION 3 * * SECTION 3 IS ORGANIZED AS FOLLOWS * * GENERATE RANDOM CYLINDER NUMBERS AND * RANDOM HEAD AND SECTOR NUMBERS * . * . * . GENERATE A RANDOM WORD COUNT * . ( NOT BEYOND END OF CYLINDER ) * . . * . . * . . GENERATE A BUFFER OF RANDOM DATA * . . STORE A WORD OF ZERO INTO THE * . . FIRST UNUSED WORD * . . * . . * . . WRITE BUFFER TO DISK * . . * . . * . . . * . . . ISSUE SEEK * . . . * . . . * . . . READ BLOCK BACK * . . . READ AND CHECK ONE EXTRA WORD IF * . . . NOT A MULTIPLE OF SECTOR SIZE * . . . * . . . * . . . CHECK DATA READ * . . . * . . . * . . * . . * . * . * SKNT EQU GLOB1 RRPT EQU GLOB2 WSAVE EQU GLOB3 WRPT EQU GLOB4 S3 EQU * JSB SWR SWITCH REGISTER TO A AND BIT5 LDB M1024 COUNT FOR LONG VERSION SZA SKIP IF INDEED LONG TEST LDB MM64 COUNT FOR SHORT TEST STB SKNT S3A EQU * JSB RNCH GET RANDOM CYLINDER,HEAD NUMBER JSB RNSC GET RANDOM SECTOR NUMBER * * STEP 48 * THIS SEEK MOVES THE POSITIONER TO A RANDOM * CYLINDER AND HEAD. * LDA D48 JSB COPR JSB SEEK START SEEK ON ITS WAY * GENERATE A RANDOM WORD COUNT BETWEEN 1 AND * 1023. THE WORD COUNT WILL NOT EXTEND BEYOND * THE END OF CYLINDER. RWCA EQU * JSB RAND GET A RANDOM NUMBER RAR AND B1777 WCNT < 1024 SZA,RSS ZERO IS NOT LEGAL JMP RWCA IF ZERO,TRY AGAIN RWCT EQU * STA WCNT SAVE CHOSEN WORD COUNT LDB HEAD CHECK FOR LAST HEAD IN CYLINDER INB CPB TRPC CHECK FOR LAST HEAD RSS JMP RWCG OK LDB SCPT IS CMB,INB WORD ADB SECTR COUNT ALF,ALF TOO RAL LARGE? AND B77 ADA B SSA JMP RWCG OK LDA WCNT TRY HALF ARS AS JMP RWCT MUCH RWCG EQU * LDA BPTR LOAD FIRST BUFFER POINTER STA BUFAD LDA BPTS LOAD SECOND BUFFER POINTER STA BUFAE JSB DGEN GENERATE A RANDOM BUFFER LDA WCNT SAVE LAST STA WSAVE LOCATION+1 ADA BUFAD ADD BASE OF WRITE BUFFER CLB STB A,I SAVE TO CHECK SECTOR ZEROING JSB WAITS WAIT FOR SEEK TO FINISH JSB WENDI,I LDA MM2 TRY TWO WRITE/READ CYCLES STA WRPT * S3RA EQU * * * STEP 49 * THIS WRITE FILLS UP A GIVEN AREA WITH * RANDOM DATA. THE WORD COUNT MAY BE FROM * ONE WORD TO 1023 WORDS. * LDA D49 JSB COPR JSB FSEEH ADDRESS RECORD IN S3 JSB WRITE FILL UP CHOSEN AREA WITH JUNK JSB WENDI,I LDA MM2 TRY TWO READS STA RRPT S3RB EQU * * * STEP 50 * READ IT BACK TWICE FOR EACH OF TWO WRITES (STEP 49) * LDA D50 JSB COPR LDA WCNT CHECK FOR SECTOR BOUNDARY AND B177+SZREF CHECK FOR EVEN SECTOR BOUNDARY SZA SKIP IF EVEN MULTIPLE OF SECTOR ISZ WCNT COUNT UP WORD COUNT * * THIS SEEK RESELECTS THE PROPER HEAD JSB FSEEH ADDRESS RECORD IN S3 * * THIS READ READS BACK THE DATA WRITTEN * BY THE PREVIOUS WRITE. * THE DATA IS COMPARED WITH THAT WRITTEN. * JSB DENDI,I LDA WSAVE STA WCNT ISZ RRPT CHECK FOR ENOUGH TIMES JMP S3RB TRY TO READ AGAIN ISZ WRPT JMP S3RA TRY TO WRITE AGAIN ISZ SKNT ARE WE DONE WITH THIS SECTION JMP S3A NOT DONE, TRY ANOTHER PLACE JMP SKIPI,I EXIT S3 HED CYLD,CYLJ * * * CYLD COUNTS UP CYLX AND CHECKS FOR COMPLETION OF * TEST ON ALL CYLINDERS. IT GIVES A SKIP RETURN WHEN * ALL CYLINDERS HAVE BEEN COVERED * CYLD NOP LDB CYLX LOAD CURRENT CYLINDER REFERENCE INB COUNT IT UP BY ONE STB CYLX AND STORE IT BACK CMB MAKE ONES COMPLEMENT JSB SWR4 LOAD EFFECTIVE SWITCH REGISTER AND BIT6 CHECK FOR RESTRICTED CYLINDERS SZA,RSS SKIP IF SHORT TEST REQUESTED JMP CDY FULL TEST ADB D10 THERE ARE TEN TABLE ENTRIES JMP CDZ CDY EQU * ADB CYPP CHECK FOR END OF PACK CDZ EQU * SSB SKIP IF NOT DONE ISZ CYLD COUNT UP RETURN ADDRESS ( DONE ) JMP CYLD,I RETURN * * CYLJ TRANSLATES THE NUMBER IN CYLX TO THE DESIRED * CYLINDER NUMBER IN CYL * CYLJ NOP JSB SWR4 LOAD EFFECTIVE SWITCH REGISTER AND BIT6 CHECK FOR RESTRICTED CYLINDERS SZA,RSS SKIP IF SHORT TEST JMP CJW LDA CYLX CJQ EQU * ADA MM10 CHECK FOR CYLX TOO BIG SSA,RSS SKIP IF OKAY JMP CJQ OTHERWISE, KEEP REDUCING ADA TRT ADD ON THE TABLE ADDRESS LDA A,I LOAD THE WORD FROM THE TABLE STA CYL SET BACK INTO CYLINDER JMP CYLJ,I RETURN * CJW EQU * LDA CYLX STA CYL STRAIGHT COPY JMP CYLJ,I RETURN * * FTRBN EQU * TRACK TABLE BEGIN OCT 0,1,2,4,10,20,40,100,200 ABS LCYL TRTBP EQU * HED S4 - SECTION 4 * * * SECTION 4 IS ORGANIZED AS FOLLOWS * * CYLINDER ADVANCE * SWITCH 6=0 -- ALL CYLINDERS FROM 0 TO 202 * SWITCH 6=1 -- ALL CYLINDERS IN TRTAB * . * . * . RANDOM NUMBER GENERATOR * . GENERATES A NEW BUFFER OF RANDOM DATA * . FOR EACH CYLINDER * . * . TRACK ADVANCE * . ALL TRACKS FROM 0 TO TRPC-1 * . . * . . BLOCK ADVANCE * . . EACH TRACK IS WRITTEN AS THREE * . . BLOCKS * . . THE SCHEME USED IS THE SAME * . . AS THAT OF THE SECTION * . . 2 PATTERN READ SINCE * . . RCGEN AND PCHK TAKE * . . ABOUT THE SAME AMOUNT * . . OF TIME. * . . . * . . . CHECKSUM BLOCK SO THAT IT IS * . . . UNIQUE AND IDENTIFIABLE. * . . . * . . . WRITE BLOCK TO DISK * . . . * . . * . * . * . * * S4 EQU * JSB SWR LOAD SWITCH REGISTER AND BIT6 SAVE BIT 6 LDB S400 FOR ADB UNIT S4,S5 AND S6 STA B,I CLA,INA A = 1 STA SFLAG CLA STA CYLX SET CYLINDER REFERENCE WORD * S4L EQU * JSB CYLJ TRANSLATE CYLX INTO CYL CLA STA HEAD POSITION FOR HEAD ZERO AND STA SECTR SECTOR ZERO * * STEP 51 * THIS SEEK CAUSES POSITIONER MOTION TO * THE NEXT CYLINDER. * LDA D51 JSB COPR JSB FSEEK SEEK IN S4 JSB ENDST * * STEP 52 * THE FOLLOWING SECTION OF CODE GENERATES THE * CHECKSUMMED RANDOM DATA. * LDA D52 JSB COPR LDA WCFT LENGTH OF FIRST THIRD STA WCNT SET WORD COUNT JSB DGEN GENERATE RANDOM BUFFER CLA STA SHTAS STATUS SHOULD BE ZERO S4RN EQU * CLA STA SECTR THIS OP STARTS AT SECTOR ZERO JSB FSEEH ADDRESS RECORD IN S4 * * THIS OPERATION IS A WRITE FOR * THE FIRST THIRD OF THIS TRACK * * WCNT AND SECTR ARE SET UP JSB RCGEN GENERATE CHECKSUMS JSB WRITE JSB WCHK CHECK FOR ERRORS * * THIS OPERATION IS A WRITE FOR * THE LAST THIRD OF THIS TRACK * LDA SCLT SECTOR WHERE LAST THIRD STARTS STA SECTR JSB SEES LDA WCLT LENGTH OF LAST THIRD STA WCNT SET WORD COUNT JSB RCGEN GENERATE CHECKSUMS JSB WAIS WAIT FOR SECTOR SWITCHING JSB WRITE JSB WCHK CHECK FOR ERRORS * * THIS OPERATION IS A WRITE FOR * THE MIDDLE THIRD OF THIS TRACK * LDA SCST SECTOR WHERE THIS THIRD STARTS STA SECTR JSB SEES LDA WCFT LENGTH OF MIDDLE THIRD STA WCNT SET WORD COUNT JSB RCGEN GENERATE CHECKSUMS JSB WAIS WAIT FOR SECTOR SWITCHING JSB WRITE JSB WCHK CHECK FOR ERRORS ISZ HEAD HEAD := HEAD + 1 LDA HEAD CPA TRPC CHECK TO SEE IF DONE RSS SKIP OUT WHEN DONE JMP S4RN FINISH ENTIRE CYLINDER JSB ENDST JSB CYLD COUNT UP CYLX AND CHECK FOR DONE JMP S4L CONTINUE ON TO NEXT CYLINDER JMP S5A CONTINUE SECTION 4 HED RCGEN,RNCH,RNSC * * * RCGEN * THIS ROUTINE CONSTRUCTS THE CHECKSUMS FOR THE WRITE BUFFER. * 1.) EACH SECTOR IS CHECKSUMMED SEPARATELY * 2.) THE ENTIRE SECTOR SUMS TO ZERO ( TWOS COMPLEMENT ) * 3.) THE FIRST TWO WORDS SUM TO THE CYLINDER NUMBER * 4.) WORDS 2 AND 3 SUM TO THE HEAD/SECTOR NUMBER * RCGEN NOP LDA WCNT ALF,ALF RAL AND B77 LEAVE THE NUMBER OF SECTORS CMA,INA COMPLEMENT FOR ISZ STA TEMP1 LDA HEAD IOR HDON ALF,ALF HEAD NUMBER TO LEFT SIDE IOR SECTR PLUG IN SECTOR NUMBER STA TEMP2 LDB BUFAD LOAD ADDRESS OF FIRST SECTOR * RCGL EQU * LDA MM31+SZREF STA TEMP3 COUNT FOR FOUR UNIT LOOP * LDA B,I GET WORD ZERO CMA,INA MAKE COMPLEMENT ADA CYL THIS SUMS TO THE CYLINDER NUMBER INB COUNT UP BUFFER ADDRESS STA B,I * INB COUNT UP BUFFER POINTER LDA B,I LOAD WORD 2 CMA,INA CHECK WORD IS COMPLEMENT ADA TEMP2 ADD HEAD/SECTOR INB COUNT UP TO SLOT FOR WORD STA B,I SAVE SECOND CHECKWORD * LDA CYL ADA TEMP2 ADD ON HEAD/SECTOR NUMBER * SUM TO DATE IN A RCGF EQU * INB COUNT UP BUFFER POINTER ADA B,I ADD ON NEXT WORD OF BUFFER INB ADA B,I INB ADA B,I INB ADA B,I ISZ TEMP3 CHECK FOR DONE JMP RCGF GET ENTIRE BUFFER * CMA,INA CHECK IS NEGATIVE ADA B,I SUBTRACT OUT LAST WORD STA B,I INB COUNT TO BEGINNING OF NEXT SECTOR ISZ TEMP2 COUNT UP SECTOR NUMBER ISZ TEMP1 CHECK FOR DONE WITH ENTIRE WRITE BUFFER JMP RCGL NO, GO DO ANOTHER SECTOR JMP RCGEN,I RETURN * * ROUTINE TO PICK A RANDOM CYLINDER AND HEAD NUMBER * * RNCH NOP RNCA EQU * JSB RAND GET A RANDOM NUMBER ALF,ALF USE LEFT HALF AND B377 CYL < 256 STA CYLX SAVE IN CYLINDER REFERENCE WORD CMA ONES COMPLEMENT ADA CYPP CANNOT BE A NON-EXISTANT CYLINDER SSA SKIP IF OKAY JMP RNCA OTHERWISE, TRY AGAIN JSB CYLJ TRANSLATE CYLX INTO CYL * JSB RAND GET A RANDOM NUMBER RAR,RAR TO ELIMINATE CORRELATION-SECTOR AND B1 HEAD < 2 STA HEAD SET HEAD NUMBER JMP RNCH,I RETURN * * ROUTINE TO PICK A RANDOM SECTOR NUMBER * * RNSC NOP RNSA EQU * JSB RAND CALL RAND THREE TIMES TO JSB RAND GET THREE GOOD BITS ON RIGHT END JSB RAND WANT NO CORRELATION WITH HEAD NUMBER JSB RAND RAR DO NOT USE BIT 0(NOT RANDOM) AND B37 SECTOR < 32 STA SECTR SAVE SECTOR NUMBER CMA ONES COMPLEMENT ADA SCPT TEST FOR LEGAL SECTOR NUMBER SSA SKIP IF OKAY JMP RNSA OTHERWISE, TRY AGAIN JMP RNSC,I RETURN