      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 
          