IDENTIFICATION DIVISION. PROGRAM-ID. ISMALT. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. RMC. OBJECT-COMPUTER. RMC. SPECIAL-NAMES. SWITCH-1 ON STATUS IS TIMING, SWITCH-2 ON STATUS IS OPEN-LOCK. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT ISAM-FILE ASSIGN TO RANDOM, "INXFA" ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC, RECORD KEY IS KEY-NUM ALTERNATE RECORD KEY IS ALT-KEY-1 WITH DUPLICATES FILE STATUS IS IO-STAT. DATA DIVISION. FILE SECTION. FD ISAM-FILE BLOCK CONTAINS 512 CHARACTERS RECORD CONTAINS 40 CHARACTERS DATA RECORD IS DATA-REC. 01 DATA-REC. 03 KEY-NUM PIC X(6). 03 ALT-KEY-1 PIC X(6). 03 FIELD PIC X(6). 03 FILLER PIC X(22). / WORKING-STORAGE SECTION. 01 TITLE. 03 FILLER PIC X(51) VALUE "ISMALT: RM/COBOL Indexed file testing program. ver.". 03 TITLE-DATE PIC X(10). 03 TITLE-TIME PIC X(8). 01 VERSION-INFO. 03 FILLER PIC X(4) VALUE "@(#)". 03 PROGRAM-NAME PIC X(10) VALUE "ISMALT". 03 FILLER PIC X(6) VALUE " ver. ". 03 VERSION PIC X(4) VALUE "1.7". 03 VER-DATE PIC X(10) VALUE " 85/04/05 ". 03 VER-TIME PIC X(8) VALUE "09:04:45". 03 FILLER PIC X VALUE ">". 77 FLAG PIC 9. 77 ALT-NUM PIC 9(6). 77 NKEY-NUM PIC 9(6). 01 SPLIT-FIELD. 03 PART-1 PIC X(3). 03 PART-2 PIC X(3). 77 PIC-3-X PIC X(3). 01 IO-STAT. 03 IO-STAT-1 PIC X. 03 IO-STAT-2 PIC X. 77 BIAS PIC 9(3) VALUE 363. 77 PASSES PIC 9(5). 77 ERRORS PIC 9(5) VALUE 0. 77 COMMAND PIC 99 . 77 NUMBER-TO-MAKE PIC 9(5). 77 BLANKS PIC X(40) VALUE SPACES. 77 OPERATION PIC X. 77 REPLY PIC X. 77 DUMMY PIC 99. 77 ALT-FLAG PIC 99. 77 RE-TRY PIC 9(5). 77 PREVIOUS-FIELD PIC X(6). 77 TEMP-FIELD PIC X(6). 77 PREVIOUS-ALT-KEY PIC X(6). 77 TEMP-ALT-KEY PIC X(6). * 01 COMMAND-VALUE. 03 COMMAND-VAL-1 PIC X. 03 COMMAND-VAL-2 PIC X. 01 PREV-COMMAND PIC 99 COMP-3 VALUE 10. 88 PREV-COMM-SINGLE VALUE 01 THRU 07. 88 PREV-COMM-CLOSED-FILE VALUE 09 THRU 15. 01 CUR-COMMAND PIC 99 COMP-3. 88 CUR-COMM-SINGLE VALUE 01 THRU 07. 88 CUR-COMM-CLOSES-FILE VALUE 10 THRU 15. 01 RND-KEY. 03 SLOT PIC 99. 03 FILLER PIC 9(2). 03 RANDOM-KEY PIC 9(6). 03 FILLER PIC 9(2). 01 KEYS. 03 KEY-1 PIC 9(6). 03 KEY-2 PIC 9(6). 01 KEY-PROD PIC 9(12). 01 MONTHS. 03 FILLER PIC XXX VALUE "JAN". 03 FILLER PIC XXX VALUE "FEB". 03 FILLER PIC XXX VALUE "MAR". 03 FILLER PIC XXX VALUE "APR". 03 FILLER PIC XXX VALUE "MAY". 03 FILLER PIC XXX VALUE "JUN". 03 FILLER PIC XXX VALUE "JLY". 03 FILLER PIC XXX VALUE "AUG". 03 FILLER PIC XXX VALUE "SEP". 03 FILLER PIC XXX VALUE "OCT". 03 FILLER PIC XXX VALUE "NOV". 03 FILLER PIC XXX VALUE "DEC". 01 MONTH-NAMES REDEFINES MONTHS. 03 MONTH-NAME OCCURS 12 TIMES. 05 FILLER PIC XXX. 01 JULIAN. 03 J-YEAR PIC 99. 03 J-DAY PIC 999. 01 ACCEPT-DAYTIME. 03 ACCEPT-DATE. 05 YEAR PIC 99. 05 MO PIC 99. 05 JOUR PIC 99. 03 ACCEPT-TIME. 05 HOUR PIC 99. 05 MIN PIC 99. 05 SEC PIC 99. 05 FILLER PIC 99. 01 DISPLAY-DAYTIME. 03 DISPLAY-DATE. 05 JOUR PIC 99. 05 FILLER PIC X VALUE " ". 05 MO-NAME PIC XXX. 05 FILLER PIC XXX VALUE " 19". 05 YEAR PIC 99. 05 FILLER PIC X VALUE " ". 03 DISPLAY-TIME. 05 HOUR PIC 99. 05 FILLER PIC X VALUE ":". 05 MIN PIC 99. 05 FILLER PIC X VALUE ":". 05 SEC PIC 99. 05 FILLER PIC 99. 77 START-SECONDS PIC 9(10). 77 NOW-SECONDS PIC 9(10). 77 ELAPSED-SECONDS PIC Z(5)9. / PROCEDURE DIVISION. * DDECLARATIVES. DIO-ERROR SECTION. D USE AFTER STANDARD ERROR PROCEDURE ON ISAM-FILE. DERROR-HANDLER. D ADD 1 TO ERRORS. D DISPLAY ERRORS LINE 23 POSITION 71. D DISPLAY IO-STAT LINE 23 POSITION 54, D IF OPERATION EQUAL "O" OR OPERATION EQUAL "R" D GO TO LOOP. DEND DECLARATIVES. * NORMAL SECTION. START-UP. MOVE VER-TIME TO TITLE-TIME. MOVE VER-DATE TO TITLE-DATE. DISPLAY TITLE LINE 1 ERASE, "40 byte record size, 1 Primary, 1 alternate key, file create - "d = INXFA" LINE 2 POSITION 2, "COMMAND", LINE 21 POSITION 1, "PASSES", LINE 21 POSITION 11, "KEY", LINE 21 POSITION 22, "FIELD", LINE 21 POSITION 31, "I/O STAT", LINE 21 POSITION 51, "RETRIES", LINE 21 POSITION 61, "ERRORS", LINE 21 POSITION 71, "1 READ RECORD WITH LOCK" LINE 4 POSITION 5, "2 READ RECORD NO LOCK" LINE 5 POSITION 5, "3 WRITE RECORD" LINE 6 POSITION 5, "4 REWRITE RECORD" LINE 7 POSITION 5, "5 DELETE RECORD" LINE 8 POSITION 5, "6 UNLOCK RECORD" LINE 9 POSITION 5, "7 START, READ NEXT RECORD" LINE 10 POSITION 5, "8 UPDATE FIELD VALUE" LINE 11 POSITION 5, "9 CLOSE FILE" LINE 4 POSITION 45, "10 SEQUENTIAL WRITE N TIMES" LINE 5 POSITION 45, "11 READ FILE SEQUENTIALLY" LINE 6 POSITION 45, "12 RANDOM WRITE N TIMES" LINE 7 POSITION 45, "13 RANDOM UPDATE N TIMES" LINE 8 POSITION 45, "14 RANDOM DELETE N TIMES" LINE 9 POSITION 45, "15 RANDOM READ N TIMES" LINE 10 POSITION 45, "16 EXIT PROGRAM" LINE 11 POSITION 45. IF TIMING DISPLAY "SECONDS" LINE 21 POSITION 41. DISPLAY "Primary Alt-1 Field" LINE 17 POSITION 5. D IF 1 NOT EQUAL 1, DISPLAY "No DECLARATIVES, program will exit on FATAL I/O errors" REVERSE LINE 3 POSITION 8. IF OPEN-LOCK DISPLAY "OPEN WITH LOCK (ALL OPENS)" LINE 19 POSITION 45. / LOOP. PERFORM ASK-COMMAND. GO TO P-READ-LOCK, P-READ, P-WRITE, P-REWRITE, P-DELETE, P-UNLOCK, P-START, P-UPDATE, CL-FILE, P-WRITE-N-S, P-READ-N-S, P-WRITE-N-R, P-UPDATE-N-R, P-DELETE-N-R, P-READ-N-R DEPENDING ON COMMAND. DISPLAY BLANKS SIZE 1 LINE 24. * EXIT-PARA. EXIT PROGRAM. STOP-PARA. STOP RUN. * ASK-COMMAND. DISPLAY SPACES SIZE 79 LINE 16. DISPLAY SPACES SIZE 79 LINE 15. DISPLAY SPACES SIZE 79 LINE 14. DISPLAY SPACES SIZE 79 LINE 13. DISPLAY "ENTER COMMAND " LINE 15. ACCEPT COMMAND-VALUE POSITION 0 PROMPT TAB ON EXCEPTION DUMMY GO TO ASK-COMMAND. IF COMMAND-VALUE = SPACES GO TO ASK-COMMAND. IF COMMAND-VAL-1 = " " MOVE 0 TO COMMAND-VAL-1. IF COMMAND-VAL-2 = " " MOVE COMMAND-VAL-1 TO COMMAND-VAL-2 MOVE 0 TO COMMAND-VAL-1. IF COMMAND-VALUE = 00 OR COMMAND-VALUE > 16 OR COMMAND-VALUE NOT NUMERIC GO TO ASK-COMMAND. MOVE COMMAND-VALUE TO COMMAND. MOVE 0 TO PASSES. DISPLAY PASSES LINE 23 POSITION 11, BLANKS SIZE 6 LINE 23 POSITION 62, BLANKS SIZE 6 LINE 23 POSITION 71. IF OPERATION = "R" AND COMMAND NOT = 9 PERFORM CLOSE-FILE. MOVE COMMAND TO CUR-COMMAND. IF COMMAND = 16 DISPLAY BLANKS LINE 24. IF CUR-COMM-SINGLE AND PREV-COMM-CLOSED-FILE PERFORM OPEN-I-O. IF CUR-COMM-CLOSES-FILE AND PREV-COMM-SINGLE PERFORM CLOSE-FILE. IF COMMAND NOT = 08 MOVE COMMAND TO PREV-COMMAND. / P-READ-LOCK. DISPLAY "READ L" LINE 23 POSITION 1. MOVE SPACES TO DATA-REC. PERFORM GET-KEY. DISPLAY BLANKS LINE 23 POSITION 31 SIZE 6. PERFORM SET-TIME. IF ALT-FLAG = 1 DISPLAY "ALT 1" LINE 23 POSITION 1 READ ISAM-FILE KEY ALT-KEY-1 INVALID KEY PERFORM SHOW-RESULTS GO TO LOOP ELSE READ ISAM-FILE INVALID KEY PERFORM SHOW-RESULTS GO TO LOOP. PERFORM SHOW-RESULTS. GO TO LOOP. P-READ. DISPLAY "READ NL" LINE 23 POSITION 1. MOVE SPACES TO DATA-REC. PERFORM GET-KEY. DISPLAY BLANKS LINE 23 POSITION 31 SIZE 6. PERFORM SET-TIME. IF ALT-FLAG = 1 DISPLAY "ALT 1" LINE 23 POSITION 1 READ ISAM-FILE NO LOCK KEY ALT-KEY-1 INVALID KEY PERFORM SHOW-RESULTS GO TO LOOP ELSE READ ISAM-FILE NO LOCK INVALID KEY PERFORM SHOW-RESULTS GO TO LOOP. PERFORM SHOW-RESULTS. GO TO LOOP. P-UNLOCK. DISPLAY "UNLOCK " LINE 23 POSITION 1. DISPLAY BLANKS LINE 23 POSITION 31 SIZE 6. MOVE SPACES TO DATA-REC. PERFORM SET-TIME. UNLOCK ISAM-FILE. PERFORM SHOW-RESULTS. GO TO LOOP. P-WRITE. DISPLAY "WRITE " LINE 23 POSITION 1. PERFORM GET-W-KEY. PERFORM SET-TIME. WRITE DATA-REC INVALID KEY PERFORM SHOW-RESULTS GO TO LOOP. PERFORM SHOW-RESULTS. GO TO LOOP. / P-REWRITE. DISPLAY "REWRITE" LINE 23 POSITION 1. PERFORM GET-W-KEY. PERFORM SET-TIME. REWRITE DATA-REC INVALID KEY PERFORM SHOW-RESULTS GO TO LOOP. PERFORM SHOW-RESULTS. GO TO LOOP. P-DELETE. MOVE SPACES TO DATA-REC. DISPLAY "DELETE " LINE 23 POSITION 1. DISPLAY "PRIMARY KEY VALUE?" LINE 15 POSITION 18. ACCEPT NKEY-NUM LINE 15 POSITION 37 PROMPT ECHO CONVERT TAB. MOVE NKEY-NUM TO KEY-NUM. DISPLAY NKEY-NUM LINE 23 POSITION 21. DISPLAY BLANKS LINE 23 POSITION 31 SIZE 6. PERFORM SET-TIME. DELETE ISAM-FILE INVALID KEY PERFORM SHOW-RESULTS GO TO LOOP. PERFORM SHOW-RESULTS. GO TO LOOP. CL-FILE. DISPLAY "CL-FILE" LINE 23. MOVE "N" TO OPERATION. MOVE SPACES TO DATA-REC. PERFORM SET-TIME. CLOSE ISAM-FILE. PERFORM SHOW-RESULTS. DISPLAY "FILE CLOSED" LINE 19 POSITION 60 BLINK. GO TO LOOP. P-START. DISPLAY "START " LINE 23 POSITION 1. DISPLAY "START VALUE (OR 0 FOR NO START)? " LINE 15 POSITION 18. ACCEPT NKEY-NUM POSITION 0 PROMPT ECHO CONVERT TAB ON EXCEPTION DUMMY GO TO P-START. MOVE SPACES TO DATA-REC. IF NKEY-NUM NOT EQUAL 0, MOVE NKEY-NUM TO KEY-NUM, START ISAM-FILE KEY NOT LESS THAN KEY-NUM. COND-LOCK. DISPLAY KEY-NUM LINE 23 POSITION 21, "READ NEXT WITH LOCK? " LINE 15 POSITION 58 " ( is no)" LINE 16 POSITION 58. MOVE SPACES TO REPLY. ACCEPT REPLY PROMPT LINE 15 POSITION 79 TAB. MOVE SPACES TO DATA-REC. PERFORM SET-TIME. IF REPLY = "Y" OR REPLY = "y" READ ISAM-FILE NEXT RECORD AT END PERFORM SHOW-RESULTS GO TO LOOP ELSE READ ISAM-FILE NEXT RECORD NO LOCK AT END PERFORM SHOW-RESULTS GO TO LOOP. PERFORM SHOW-RESULTS. GO TO LOOP. / P-UPDATE. DISPLAY "UPDATE " LINE 23 POSITION 1, "FIELD VALUE " LINE 15 POSITION 18. ACCEPT FIELD PROMPT POSITION 0 TAB. DISPLAY FIELD LINE 23 POSITION 31. GO TO LOOP. P-WRITE-N-S. DISPLAY "WR SEQ " LINE 23 POSITION 1. PERFORM OPEN-OUT. MOVE SPACES TO DATA-REC. PERFORM GET-START. MOVE "R" TO OPERATION. PERFORM GET-NUM. MOVE 0 TO ALT-NUM. PERFORM SET-TIME. P-W-N-S. IF ALT-NUM = 10 MOVE 0 TO ALT-NUM. ADD 1 TO ALT-NUM. ADD 1 TO PASSES. IF PASSES GREATER THAN NUMBER-TO-MAKE, PERFORM CLOSE-FILE, GO TO LOOP. MOVE NKEY-NUM TO KEY-NUM. MOVE KEY-NUM TO FIELD. MOVE ALT-NUM TO ALT-KEY-1. WRITE DATA-REC INVALID KEY ADD NUMBER-TO-MAKE TO PASSES GO TO P-W-N-S. IF NOT TIMING PERFORM SHOW-RESULTS. ADD 1 TO NKEY-NUM. GO TO P-W-N-S. / P-WRITE-N-R. DISPLAY "WR RAND" LINE 23 POSITION 1. PERFORM OPEN-OUT. MOVE SPACES TO DATA-REC. MOVE "R" TO OPERATION. PERFORM GET-NUM. PERFORM GET-SEED. MOVE 0 TO ALT-NUM. PERFORM SET-TIME. L-W-N-R. ADD 1 TO PASSES. IF PASSES GREATER THAN NUMBER-TO-MAKE, PERFORM CLOSE-FILE, GO TO LOOP. MOVE 0 TO RE-TRY. PERFORM RND-KEY. L-W-N-R-2. MOVE RANDOM-KEY TO KEY-NUM. MOVE KEY-NUM TO FIELD, SPLIT-FIELD. MOVE PART-1 TO PIC-3-X MOVE PART-2 TO PART-1 MOVE PIC-3-X TO PART-2. MOVE SPLIT-FIELD TO ALT-KEY-1. WRITE DATA-REC, INVALID KEY ADD 1 TO RANDOM-KEY, PERFORM SHOW-RE-TRY, GO TO L-W-N-R-2. IF NOT TIMING PERFORM SHOW-RESULTS. GO TO L-W-N-R. SHOW-RE-TRY. ADD 1 TO RE-TRY. IF NOT TIMING DISPLAY RE-TRY LINE 23 POSITION 61. / P-UPDATE-N-R. DISPLAY "UP RAND" LINE 23 POSITION 1. PERFORM OPEN-I-O. MOVE SPACES TO DATA-REC. PERFORM GET-NUM. PERFORM GET-SEED. MOVE "R" TO OPERATION. MOVE "11111111" TO PREVIOUS-FIELD, PREVIOUS-ALT-KEY. PERFORM SET-TIME. L-U-N-R. ADD 1 TO PASSES. IF PASSES GREATER THAN NUMBER-TO-MAKE, PERFORM CLOSE-FILE, GO TO LOOP. PERFORM RND-KEY. MOVE RANDOM-KEY TO KEY-NUM. START ISAM-FILE KEY NOT LESS THAN KEY-NUM, INVALID KEY GO TO L-U-N-R-I. L-U-N-R-R. READ ISAM-FILE NEXT RECORD AT END ADD NUMBER-TO-MAKE TO PASSES GO TO L-U-N-R. MOVE FIELD TO TEMP-FIELD. MOVE PREVIOUS-FIELD TO FIELD. MOVE TEMP-FIELD TO PREVIOUS-FIELD. MOVE ALT-KEY-1 TO TEMP-ALT-KEY. MOVE PREVIOUS-ALT-KEY TO ALT-KEY-1. MOVE TEMP-ALT-KEY TO PREVIOUS-ALT-KEY. REWRITE DATA-REC. IF NOT TIMING PERFORM SHOW-RESULTS. GO TO L-U-N-R. L-U-N-R-I. PERFORM FIND-BEGINNING-OF-FILE. GO TO L-U-N-R-R. / P-DELETE-N-R. DISPLAY "DL RAND" LINE 23 POSITION 1. PERFORM OPEN-I-O. MOVE SPACES TO DATA-REC. PERFORM GET-NUM. PERFORM GET-SEED. MOVE "R" TO OPERATION. PERFORM SET-TIME. L-D-N-R. ADD 1 TO PASSES. IF PASSES GREATER THAN NUMBER-TO-MAKE, PERFORM CLOSE-FILE, GO TO LOOP. PERFORM RND-KEY. MOVE RANDOM-KEY TO KEY-NUM. START ISAM-FILE KEY NOT LESS THAN KEY-NUM, INVALID KEY GO TO L-D-N-R-I. L-D-N-R-R. READ ISAM-FILE NEXT RECORD AT END ADD NUMBER-TO-MAKE TO PASSES GO TO L-D-N-R. DELETE ISAM-FILE. IF NOT TIMING PERFORM SHOW-RESULTS. GO TO L-D-N-R. L-D-N-R-I. PERFORM FIND-BEGINNING-OF-FILE. GO TO L-D-N-R-R. P-READ-N-R. DISPLAY "RD RAND" LINE 23 POSITION 1. PERFORM OPEN-IN. MOVE SPACES TO DATA-REC. PERFORM GET-NUM. PERFORM GET-SEED. MOVE "R" TO OPERATION. PERFORM SET-TIME. L-R-N-R. ADD 1 TO PASSES. IF PASSES GREATER THAN NUMBER-TO-MAKE, PERFORM CLOSE-FILE, GO TO LOOP. PERFORM RND-KEY. MOVE RANDOM-KEY TO KEY-NUM. START ISAM-FILE KEY NOT LESS THAN KEY-NUM, INVALID KEY GO TO L-R-N-R-I. L-R-N-R-R. READ ISAM-FILE NEXT RECORD AT END ADD NUMBER-TO-MAKE TO PASSES GO TO L-R-N-R. IF NOT TIMING PERFORM SHOW-RESULTS. GO TO L-R-N-R. L-R-N-R-I. PERFORM FIND-BEGINNING-OF-FILE. GO TO L-R-N-R-R. / P-READ-N-S. DISPLAY "RD SEQ " LINE 23 POSITION 1. PERFORM OPEN-IN. MOVE SPACES TO DATA-REC. MOVE "R" TO OPERATION. PERFORM READ-SEQ-START THRU READ-SEQ-START-EXIT. PERFORM SET-TIME. P-R-N-S. ADD 1 TO PASSES. READ ISAM-FILE NEXT RECORD, AT END PERFORM CLOSE-FILE, GO TO LOOP. IF NOT TIMING PERFORM SHOW-RESULTS. GO TO P-R-N-S. * * SUBROUTINES * CLOSE-FILE. PERFORM SHOW-RESULTS. MOVE "N" TO OPERATION. CLOSE ISAM-FILE. DISPLAY "FILE CLOSED" LINE 19 POSITION 60 BLINK. OPEN-IN. DISPLAY " " LINE 19 POSITION 1. MOVE "O" TO OPERATION. OPEN INPUT ISAM-FILE. DISPLAY "OPEN INPUT " LINE 19 POSITION 60 BLINK. MOVE "N" TO OPERATION. OPEN-I-O. DISPLAY " " LINE 19 POSITION 1. MOVE "O" TO OPERATION. IF OPEN-LOCK OPEN I-O ISAM-FILE WITH LOCK ELSE OPEN I-O ISAM-FILE. DISPLAY "OPEN I-O " LINE 19 POSITION 60 BLINK. MOVE "N" TO OPERATION. OPEN-OUT. MOVE 0 TO FLAG. DISPLAY "NEW FILE? " LINE 14 POSITION 1. MOVE " " TO REPLY. ACCEPT REPLY POSITION 0 TAB ON EXCEPTION DUMMY GO TO OPEN-OUT. MOVE "O" TO OPERATION. DISPLAY " " LINE 19 POSITION 1. IF REPLY = "Y" OR REPLY = "y" ADD 1 TO FLAG DISPLAY "OPEN OUTPUT" LINE 19 POSITION 60 BLINK OPEN OUTPUT ISAM-FILE. IF REPLY = "N" OR REPLY = "n" OR REPLY = " " ADD 1 TO FLAG DISPLAY "OPEN I-O " LINE 19 POSITION 60 BLINK IF OPEN-LOCK OPEN I-O ISAM-FILE WITH LOCK ELSE OPEN I-O ISAM-FILE. IF FLAG = 0 GO TO OPEN-OUT. MOVE "N" TO OPERATION. / GET-KEY. DISPLAY "KEY VALUE?" LINE 15 POSITION 20. DISPLAY "(F1 FOR ALT-1)" LINE 16 POSITION 6. ACCEPT NKEY-NUM LINE 15 POSITION 30 PROMPT ECHO CONVERT TAB ON EXCEPTION ALT-FLAG MOVE ALT-FLAG TO DUMMY. MOVE NKEY-NUM TO KEY-NUM, ALT-KEY-1. DISPLAY NKEY-NUM LINE 23 POSITION 21. GET-W-KEY. DISPLAY "PRIMARY KEY VALUE? " LINE 14. ACCEPT NKEY-NUM POSITION 0 PROMPT ECHO CONVERT TAB. MOVE NKEY-NUM TO KEY-NUM. DISPLAY NKEY-NUM LINE 23 POSITION 21. DISPLAY "ALT-1 KEY VALUE? " LINE 14 POSITION 29. ACCEPT NKEY-NUM POSITION 0 PROMPT ECHO CONVERT TAB. MOVE NKEY-NUM TO ALT-KEY-1. DISPLAY NKEY-NUM LINE 23 POSITION 21. GET-START. DISPLAY "START VALUE? " LINE 14 POSITION 18. ACCEPT NKEY-NUM POSITION 0 PROMPT ECHO CONVERT TAB ON EXCEPTION DUMMY GO TO GET-START. IF NKEY-NUM EQUAL 0 MOVE 1 TO NKEY-NUM. MOVE NKEY-NUM TO KEY-NUM. DISPLAY KEY-NUM LINE 23 POSITION 21, BLANKS LINE 23 POSITION 31 SIZE 6. / READ-SEQ-START. MOVE LOW-VALUES TO DATA-REC. DISPLAY "Read sequential by key number" LINE 14 POSITION 1 " (0=Main, 1=Alt-1) ". ACCEPT DUMMY POSITION 0 PROMPT ECHO CONVERT TAB. ADD 1 TO DUMMY. IF DUMMY < 1 OR DUMMY > 2 GO TO READ-SEQ-START. GO TO S1, S2 DEPENDING ON DUMMY. READ-SEQ-START-EXIT. EXIT. S1. PERFORM FIND-BEGINNING-OF-FILE. GO TO READ-SEQ-START-EXIT. S2. START ISAM-FILE KEY NOT LESS THAN ALT-KEY-1 INVALID KEY PERFORM CHECK-FOR-IOSTAT23. GO TO READ-SEQ-START-EXIT. CHECK-FOR-IOSTAT23. IF IO-STAT = "23" PERFORM CLOSE-FILE PERFORM OPEN-I-O READ ISAM-FILE NEXT RECORD AT END MOVE 0 TO DUMMY. IF NOT TIMING PERFORM SHOW-RESULTS. IF IO-STAT = "10" OR IO-STAT-1 = "2" PERFORM CLOSE-FILE, GO TO LOOP. / FIND-BEGINNING-OF-FILE. MOVE LOW-VALUES TO KEY-NUM. START ISAM-FILE KEY NOT LESS THAN KEY-NUM INVALID KEY PERFORM CHECK-FOR-IOSTAT23. GET-NUM. DISPLAY "NUMBER OF RECORDS? " LINE 15 POSITION 22. ACCEPT NUMBER-TO-MAKE LINE 15 POSITION 41 PROMPT ECHO CONVERT TAB ON EXCEPTION DUMMY GO TO GET-NUM. GET-SEED. DISPLAY "RANDOMIZATION SEED?" LINE 15 POSITION 49. ACCEPT KEY-1 LINE 15 POSITION 69 PROMPT ECHO CONVERT TAB ON EXCEPTION DUMMY GO TO GET-SEED. ADD BIAS TO KEY-1. MOVE KEY-1 TO KEY-2. ADD BIAS TO KEY-2. * * GENERATE RANDOM KEY: * MULTIPLY TWO SIX DIGIT NUMBERS. * TAKE THE MIDDLE SIX DIGITS OF THE 12 DIGIT PRODUCT AS TH * ADD ABITRARY BIAS TO PRODUCT TO PREVENT STUCK AT ZERO. * RND-KEY. MULTIPLY KEY-1 BY KEY-2 GIVING KEY-PROD. MOVE KEY-PROD TO RND-KEY. MOVE KEY-PROD TO KEYS. ADD BIAS TO KEY-1. ADD BIAS TO KEY-2. SET-TIME. IF TIMING DISPLAY SPACES SIZE 6 LINE 23 POSITION 43 PERFORM GET-DATE-TIME DISPLAY "Start: " LINE 24 POSITION 1 DISPLAY-DAYTIME SPACES SIZE 47 MOVE NOW-SECONDS TO START-SECONDS. GET-DATE-TIME. ACCEPT ACCEPT-DATE FROM DATE ACCEPT ACCEPT-TIME FROM TIME. ACCEPT JULIAN FROM DAY. IF MO OF ACCEPT-DATE < 1 OR MO OF ACCEPT-DATE > 12 MOVE 4 TO MO OF ACCEPT-DATE. IF JOUR OF ACCEPT-DATE < 1 OR JOUR OF ACCEPT-DATE > 31 MOVE 1 TO JOUR OF ACCEPT-DATE. IF YEAR OF ACCEPT-DATE < 1 MOVE 84 TO YEAR OF ACCEPT-DATE. IF J-YEAR < 1 MOVE 84 TO J-YEAR. IF J-DAY < 1 OR J-DAY > 366 MOVE 92 TO J-DAY. IF HOUR OF ACCEPT-TIME > 23 MOVE 12 TO HOUR OF ACCEPT-TIME. IF MIN OF ACCEPT-TIME > 59 MOVE 0 TO MIN OF ACCEPT-TIME. IF SEC OF ACCEPT-TIME > 59 MOVE 0 TO SEC OF ACCEPT-TIME. MOVE CORRESPONDING ACCEPT-DATE TO DISPLAY-DATE MOVE CORRESPONDING ACCEPT-TIME TO DISPLAY-TIME. MOVE MONTH-NAME ( MO OF ACCEPT-DATE ) TO MO-NAME. COMPUTE NOW-SECONDS = ( J-DAY - 1 ) * 86400 + HOUR OF ACCEPT-TIME * 3600 + MIN OF ACCEPT-TIME * 60 + SEC OF ACCEPT-TIME. * SHOW-RESULTS. IF TIMING PERFORM GET-DATE-TIME DISPLAY "Finished: " LINE 24 POSITION 46 DISPLAY-DAYTIME COMPUTE ELAPSED-SECONDS = NOW-SECONDS - START-SECONDS DISPLAY ELAPSED-SECONDS LINE 23 POSITION 41. DISPLAY PASSES LINE 23 POSITION 11, KEY-NUM LINE 23 POSITION 21, FIELD LINE 23 POSITION 31, IO-STAT LINE 23 POSITION 54, KEY-NUM LINE 18 POSITION 5 " " ALT-KEY-1 " " FIELD. END PROGRAM.