*DECK,CPE                                                                CPE
   MODULE CPE00,3000(21),LOCK   CARD PUNCH EXERCISER                     VER1048
*** CPE - 415 CARD PUNCH REPAIR EXERCISER                                CPE
**                                                                       CPE
*                                                                        CPE
*   AUTHOR - J.E. SIPPER                                                 CPE
*            CONSULTANT - SOUTHEAST REGION                               CPE
*            ENGINEERING SERVICES                                        CPE
*                                                                        CPE
*   DATE   - 78/10/23                                                    CPE
*                                                                        CPE
*   OVERVIEW -                                                           CPE
*                                                                        CPE
*         CPE IS A 415 CARD PUNCH EXERCISER THAT RUNS UNDER THE          CPE
*         MALET SOFTWARE SUBSYSTEM.  IT IS DESIGNED TO TEST ONE          CPE
*         CARD PUNCH/CONTROLLER AT A TIME.  AN ACCESS LEVEL OF 10        VER1053
*         MUST BE SPECIFIED ON THE MALET ASSIGN DIRECTIVE IN ORDER       VER1053
*         TO EXECUTE CPE SINCE IT IS WRITTEN IN THE LOW-LEVEL MALET      VER1053
*         LANGUAGE.                                                      VER1053
*                                                                        CPE
*         THE GOAL IS TO INTRODUCE THE FIELD CUSTOMER ENGINEER TO        CPE
*         THE USE OF A SOFTWARE PRODUCT TO BE USED IN PLACE OF A         CPE
*         HARDWARE BLACK-BOX EXERCISER.  THIS TECHNIQUE IS CURRENTLY     CPE
*         PLANNED FOR FUTURE PERIPHERALS.                                CPE
*                                                                        CPE
*         CPE IS DESIGNED TO DRIVE A 415 CARD PUNCH SUCH THAT            CPE
*         SCOPING, SHOCK TESTING, ETC. CAN BE PERFORMED WHILE            CPE
*         IT IS EXECUTING TO ASSIST IN THE REPAIR OF A FAILING           CPE
*         PUNCH OR CONTROLLER.  THIS MODULE PERFORMS PUNCHING            CPE
*         AND CARD OFFSETS ACCORDING TO PARAMETERS PROVIDED IN           CPE
*         MALET PARAMETER REGISTERS P0 - P9.                             CPE
*                                                                        CPE
*         VIA PARAMETER REGISTERS, THE USER CONTROLS THE DATA            CPE
*         PATTERN TO PUNCH, THE COLUMNS THAT WILL BE PUNCHED,            CPE
*         WHEN CARDS WILL BE OFFSET, THE SPEED OF PUNCHING AND           CPE
*         THE NUMBER OF CARDS TO PUNCH.  CARD SEQUENCE NUMBERS           CPE
*         CAN ALSO BE PUNCHED IN COLUMN 80 TO VERIFY THAT CARDS          CPE
*         ARE NOT BEING LOST OR SHUFFLED (VERIFIED MANUALLY OR           CPE
*         BY THE USE OF THE CARD READER EXERCISER, CRE).                 CPE
*                                                                        CPE
*         A TYPICAL APPLICATION OF CPE IS TO DETERMINE WHAT              CPE
*         COLUMN IS CAUSING A COMPARE ERROR.  BY CONTROLLING             CPE
*         THE COLUMNS TO PUNCH AND THE DATA PATTERNS, THE USER           CPE
*         CAN ISOLATE THE FAILURE.                                       CPE
*                                                                        CPE
*         NOTE:  CPE PERFORMS ALL PUNCHING IN BINARY MODE, THEREFORE     VER1049
*                THE BCD CAPABILITIES OF THE CONTROLLER CANNOT BE        VER1049
*                REPAIRED USING THIS EXERCISER.                          VER1049
*                                                                        VER1049
*** CPE PARAMETERS                                                       CPE
**                                                                       CPE
*   PARAMETERS -                                                         CPE
*                                                                        CPE
*         DATA IN PARAMETER REGISTERS P0-P9 CONTROL THE ACTIONS          CPE
*         PERFORMED BY CPE AS FOLLOWS:                                   CPE
*                                                                        CPE
*         P0/P1 - THE USE OF P0 AND P1 DEPENDS UPON THE SETTING OF       CPE
*              BIT 0 OF P9.  IF THIS BIT IS A ZERO, THE CONTENTS         CPE
*              OF P0 WILL BE USED AS A RANDOM STARTER IN GENERATING      CPE
*              THE PUNCH CARD IMAGE.  REGISTER P1 WILL BE USED AS        CPE
*              A MASK TO THE RANDOM DATA SO THAT THE USER CAN            CPE
*              ELIMINATE DATA WITHIN CERTAIN ROWS ON THE CARD IMAGE.     CPE
*              IF (P1) IS ZERO, THERE IS NO MASK.  IF (P0) IS ZERO,      CPE
*              EACH CARD CONTAINS A NEW RANDOM PATTERN WITH THE          CPE
*              STARTER OBTAINED FROM THE REAL TIME CLOCK, MASKED AND     CPE
*              STORED INTO THE COLUMN SPECIFIED BY P2 (FIRST COLUMN).    CPE
*                                                                        CPE
*              IF BIT 0 OF P9 IS A ONE, P0 AND P1 BECOME FIXED DATA      CPE
*              BYTES THAT ARE TO BE USED ALTERNATELY IN FORMING THE      CPE
*              PUNCH CARD IMAGE.                                         CPE
*                                                                        CPE
*         P2 - THE FIRST COLUMN TO START DATA CONSTRUCTION IN            CPE
*              WHEN BUILDING THE CARD PUNCH IMAGE (1-80 DECIMAL).        CPE
*              IF THE VAULE SPECIFIED IS ZERO OR GREATER THAN 80, IT     CPE
*              DEFAULTS TO 1.                                            CPE
*                                                                        CPE
*              NOTE:  IT IS ILLEGAL TO SPECIFY A STARTING COLUMN OF      CPE
*                     80 IF CARD SEQUENCE NUMBERS ARE SELECTED IN P9     CPE
*                     SINCE SEQUENCE NUMBERS ARE PUNCHED IN COLUMN 80.   CPE
*                                                                        CPE
*         P3 - LAST COLUMN TO STORE DATA WHEN BUILDING THE PUNCH         CPE
*              CARD IMAGE (1-80 DECIMAL).                                CPE
*              IF THE VALUE SPECIFIED IN P3 IS ZERO OR GREATER THAN      CPE
*              80, IT DEFAULTS TO 80.  NOTE THAT THE (P3) CAN BE         CPE
*              SMALLER THAN THE (P2).  IF THIS IS THE CASE, DATA         CPE
*              STARTS IN COLUMN P2 TO THE END OF THE CARD, THEN          CPE
*              FROM COLUMN 1 TO AND INCLUDING COLUMN P3.                 CPE
*                                                                        CPE
*         P4 - NUMBER OF BLANKS TO INSERT AFTER EACH COLUMN THAT         CPE
*              CONTAINS DATA WHEN BUILDING THE PUNCH CARD IMAGE          CPE
*              (0-80 DECIMAL). IF THE VALUE IS ZERO OR GREATER THAN      CPE
*              80, NO BLANKS ARE INSERTED.  EXAMPLE:  IF (P4) IS 1,      CPE
*              EVERY-OTHER COLUMN BETWEEN P2 AND P3 WILL CONTAIN DATA    CPE
*              WITH BLANKS IN ALL OTHER COLUMNS.                         CPE
*                                                                        CPE
***                                                                      CPE
**                                                                       CPE
*         P5 - NUMBER OF CARDS TO PUNCH BEFORE PERFORMING AN OFFSET      CPE
*              OF ONE CARD (DEFAULTS TO 0000). IF (P5) IS ZERO, NO       CPE
*              OFFSETS ARE PERFORMED.  EXAMPLE:  IF (P5) = 1, EVERY-     CPE
*              OTHER CARD WILL BE OFFSET.                                CPE
*                                                                        CPE
*              NOTE: IN ORDER FOR THE OFFSET FUNCTION TO CORRECTLY       CPE
*                    OFFSET A CARD IN THE STACKER, IT MUST BE ISSUED     CPE
*                    WITHIN 50 MILLISECONDS AFTER THE PUNCH GOES NOT     CPE
*                    BUSY WITH THE CARD IN MOTION FROM THE READ          CPE
*                    STATION TO THE STACKER.  UNDER HEAVY SYSTEM LOAD    CPE
*                    THIS TIMING CANNOT BE GUARENTEED SINCE THE I/O      CPE
*                    CHANNEL MUST BE SHARED WHILE WAITING FOR NOT BUSY.  CPE
*                    THEREFORE, ALL CARDS THAT SHOULD BE OFFSET MAY NOT  CPE
*                    BE.                                                 CPE
*                                                                        CPE
*         P6 - MILLISECONDS TO DELAY AFTER EACH CARD PUNCHED. IF P9 BIT  CPE
*              1 = 0, (P6) IS A FIXED DELAY.  IF P9 BIT 1 = 1, (P6)      CPE
*              IS A MASK TO USE WITH THE REAL TIME CLOCK TO ESTABLISH    CPE
*              A RANDOM DELAY BETWEEN PUNCHING.  (THE MAXIMUM DELAY IS   CPE
*              7777 OCTAL/4095 DECIMAL MILLISECONDS OR 4.095 SECONDS.    CPE
*                                                                        CPE
*         P7/P8 - NUMBER OF CARDS TO PUNCH BEFORE TERMINATING.  BOTH     CPE
*              REGISTERS DEFAULT TO 0000 WHICH MEANS THAT 77777777       CPE
*              CARDS WILL BE PUNCHED BEFORE NORMAL TERMINATION.  P8 IS   CPE
*              THE LOWER 12 BITS OF THE COUNTER.                         CPE
*                                                                        CPE
*         P9 - CONTROL BITS FOR OPTIONS (DEFAULTS TO 0000)               CPE
*                                                                        CPE
*              BIT 0 (XXX1) - 0= GENERATE RANDOM DATA BASED ON THE       CPE
*                                CONTENTS OF P0-P4.                      CPE
*                             1= GENERATE FIXED DATA USING P0-P4.        CPE
*                                                                        CPE
*              BIT 1 (XXX2) - 0= (P6) IS A FIXED DELAY                   CPE
*                             1= (P6) IS A MASK FOR RANDOM DELAY         CPE
*                                                                        CPE
*              BITS 2-7     - NOT USED                                   CPE
*                                                                        CPE
*              BIT 8 (X4XX) - 0= CARD SEQUENCE NUMBERS ARE NOT PUNCHED   CPE
*                                IN COLUMN 80.                           CPE
*                             1= CARD SEQUENCE NUMBERS ARE PUNCHED IN    CPE
*                                COLUMN 80.  SEQUENCE NUMBERS START      VER1050
*                                AT 0001 AND CYCLE TO 7777 OCTAL, THEN   VER1050
*                                RESTART AT 0000.  ONLY COLUMN 80 IS     VER1050
*                                USED FOR SEQUENCE NUMBERS.              VER1050
*                                                                        CPE
*              BITS 9-11    - NOT USED                                   CPE
*                                                                        CPE
*** CPE DESCRIPTION                                                      CPE
**                                                                       CPE
*   DESCRIPTION -                                                        CPE
*                                                                        CPE
*         1. GENERATE PUNCH PATTERN BASED ON (P0) - (P4) AND P9 BIT 0    CPE
*            (RANDOM/FIXED DATA).                                        CPE
*         2. BUILD STATUS DISPLAY.                                       CPE
*         3. SET COLUMN 80 TO 0000 IF SEQUENCE NUMBERS ARE SELECTED      CPE
*            (P9 BIT 8 = 1).                                             CPE
*         4. POST WAIT RDY/NOT BUSY MESSAGE.                             CPE
*         5. CONNECT, GET STATUS AND GO TO STEP 7 IF READY/NOT BUSY.     CPE
*         6. RELEASE, REPORT CURRENT STATUS, DELAY 50 MILLISECONDS       CPE
*            AND GO TO STEP 5.                                           CPE
*         7. POST PUNCHING CARDS MESSAGE.                                CPE
*         8. IF CORRECT PATTERN IS IN OUTPUT BUFFER, GO TO STEP 9.       CPE
*            OTHERWISE, GENERATE THE CORRECT PATTERN IN OUTPUT BUFFER.   CPE
*         9. IF SEQUENCE NUMBERS ARE SELECTED (P9 BIT 8 = 1), STORE      CPE
*            THE NEXT SEQUENCE NUMBER INTO COLUMN 80 (THE FIRST CARD     CPE
*            PUNCHED WILL HAVE A SEQUENCE NUMBER OF 0001).               CPE
*        10. CONNECT, GET STATUS AND GO TO STEP 12 IF NOT BUSY.          CPE
*        11. DELAY 1 MSEC AND GO TO STEP 10 IF 1 SECOND HAS NOT          CPE
*            ELAPSED.  OTHERWISE, GO TO STEP 23 TO REPORT HUNG BUSY.     CPE
*        12. IF PUNCH IS READY, GO TO STEP 13.  OTHERWISE GO TO STEP     CPE
*            23 TO REPORT FAIL-TO-FEED ERROR IF FAIL-TO-FEED STATUS,     CPE
*            OR PUNCH NOT READY - CHECK HOPPER/STACKER IF NO FAIL-TO-    VER1057
*            FEED STATUS.                                                VER1057
*        13. SELECT BINARY (FUNC 1).                                     CPE
*        14. OUTPUT 80 WORDS USING WORD MODE (OUT COMMAND).              CPE
*        15. BUMP NUMBER OF CARDS PUNCHED.                               CPE
*        16. IF WORDS TRANSMITTED (WT) IS NOT 80, GO TO STEP 23 TO       CPE
*            REPORT WT ERROR.                                            CPE
*        17. RELEASE AND DELAY 240 MSEC.                                 CPE
*        18. RESERVE AND GET STATUS.  WAIT UP TO 50 MSEC FOR             CPE
*            NOT BUSY.  GO TO STEP 23 TO REPORT HUNG BUSY ERROR          CPE
*            IF BUSY DOES NOT DROP WITHIN 50 MSEC (TOTAL CARD            CPE
*            CYCLE SHOULD BE 240 MSEC - 290 MSEC ALLOWED WITH            CPE
*            ADDITIONAL SYSTEM OVERHEAD TIME OF AT LEAST 5 MSEC).        CPE
*        19. IF STATUS INDICATES A COMPARE ERROR, OFFSET THE CARD        CPE
*            (FUNC 3) AND GO TO STEP 23 TO REPORT THE COMPARE ERROR.     CPE
*        20. GO TO STEP 21 IF OFFSETS ARE NOT SELECTED (P5 = 0).         CPE
*            OTHERWISE, DETERMINE IF IT IS TIME TO PERFORM AN OFFSET     CPE
*            AND, IF SO, DO IT.                                          CPE
*        21. DELAY THE NUMBER OF MILLISECONDS SPECIFIED BY P6 AND P9     CPE
*            BIT 1 (FIXED OR RANDOM DELAY).  A RELEASE IS PERFORMED IF   CPE
*            THE DELAY EXCEEDS 20 MILLISECONDS.                          CPE
*        22. GO TO STEP 8 IF P7/P8 CARDS HAVE NOT BEEN PUNCHED.  OTHER-  CPE
*            WISE, UPDATE THE STATUS DISPLAY, TAKE A PICTURE OF IT AND   CPE
*            EXIT.                                                       CPE
*        23. THIS STEP IS ENTERED WHEN ANY ERROR IS DETECTED.  REPORT    CPE
*            THE ERROR MESSAGE, BUMP THE PROPER ERROR COUNTER AND        CPE
*           UPDATE THE DISPLAY.  DELAY THE NUMBER OF MILLISECONDS        VER1051
*           SELECTED IN P6 TO INSURE THAT THE SAME REPETITION RATE OF    VER1051
*           THE CARD PUNCH IS MAINTAINED DURING A FAILURE SEQUENCE AS    VER1051
*           DURING NO FAILURE.  IF STOP-ON-ERROR (SE) IS NOT             VER1051
*            SELECTED, GO TO STEP 4.  OTHERWISE, TAKE A PICTURE OF THE   CPE
*            DISPLAY, HALT AND GO TO STEP 4 UPON OPERATOR GO.            CPE
*                                                                        CPE
*** CPE MESSAGES                                                         CPE
**                                                                       CPE
*   ERRORS REPORTED -                                                    CPE
*                                                                        CPE
*         1. ALL PRODUCT OVERLAY ERROR MESSAGES.                         CPE
*                                                                        CPE
*         2. P2=80 IS ILLEGAL WITH SEQUENCE NUMBERS SELECTED.            CPE
*         3. CPE - WAIT PUNCH RDY/NOT BUSY.                              CPE
*         4. CPE - PUNCH HUNG BUSY FOR 1 SECOND.                         CPE
*         5. CPE - PUNCH DROPPED READY - CHECK HOPPER/STACKER            VER1057
*         6. CPE - COMPARE ERROR - CARD OFFSET.                          CPE
*         7. CPE - WT ERROR ON OUTPUT - EXP=0080  ACT=*DEC               CPE
*         8. CPE - PUNCH FAIL-TO-FEED.                                   CPE
*                                                                        CPE
*         9. CPE - ABORT ON .CONN. COMMAND.                              CPE
*        10. CPE - ABORT ON .REL. COMMAND.                               CPE
*        11. CPE - ABORT ON .FUNC. COMMAND.                              CPE
*        12. CPE - ABORT ON .STATUS. COMMAND.                            CPE
*        13. CPE - ABORT ON .OUT. COMMAND.                               CPE
*                                                                        CPE
*         IN ADDITION TO THE ABOVE ERROR MESSAGES, A DISPLAY IS          CPE
*         MAINTAINED IN THE FOLLOWING FORMAT TO DOCUMENT RUNNING         CPE
*         TOTALS OF ERRORS, STATUS AND OTHER STATISTICS.  ALL VALUES     CPE
*         ARE IN DECIMAL EXCEPT THE NUMBER OF CARDS READ AND THE LAST    CPE
*         ERROR STATUS ARE DISPLAYED IN OCTAL.                           CPE
*                                                                        CPE
*         CPE- OCTAL CARDS PUNCHED = XXXXXXXX                            CPE
*         CONN ABT-------XXXX   REL ABT--------XXXX                      CPE
*         FUNC ABT-------XXXX   STATUS ABT-----XXXX                      CPE
*         OUT ABT--------XXXX   WT ERRORS------XXXX                      CPE
*         READY DROPS----XXXX   HUNG BUSYS-----XXXX                      CPE
*         COMPARE ERRORS-XXXX   FEED FAILS-----XXXX                      CPE
*         LAST ERR STS-668X=XXXX EQ=XXXX- LAST ERR BELOW                 CPE
*                                                                        CPE
*         XXXXXXXXXX- ERROR MESSAGE -XXXXXXXXXXXXXXXXXXX                 CPE
*         --------------------------------------------------             VER1066
*                                                                        CPE
*** CPE - INTERNAL DOCUMENTATION                                         CPE
*                                                                        CPE
*   REGISTER USAGE -                                                     CPE
*                                                                        CPE
*         B0 = PRIMARY DATA BYTE                                         CPE
*            = BUFFER INDEX                                              CPE
*            = COLUMN COUNTER                                            CPE
*         B1 = ALTERNATE DATA BYTE                                       CPE
*            = BLANK COUNTER                                             CPE
*         B2 = STARTING/CURRENT COLUMN COUNTER                           CPE
*         B3 = LAST COLUMN                                               CPE
*         B4 = NUMBER OF BLANKS                                          CPE
*         B5 = BLANK COUNTER                                             CPE
*            = DATA MASK                                                 CPE
*            = ERROR COUNTER INDEX                                       CPE
*            = MESSAGE NUMBER                                            CPE
*         B6 = DATA STARTER                                              CPE
*            = BUFFER INDEX                                              CPE
*            = DELAY TIME                                                CPE
*            = MESSAGE LINE NUMBER                                       CPE
*            = RETRY COUNTER                                             CPE
*         B7 = CARD SEQUENCE NUMBER                                      CPE
*            = PATTERN FLAG                                              CPE
*         BA = OFFSET COUNTER                                            CPE
*                                                                        CPE
*   BUFFER USAGE -                                                       CPE
*                                                                        CPE
*         IB(200) = UPPER BITS OF CARDS PUNCHED COUNTER                  CPE
*         IB(201) = LOWER BITS OF CARDS PUNCHED COUNTER                  CPE
*         IB(202) = CONN ABT COUNTER                                     CPE
*         IB(203) = REL ABT COUNTER                                      CPE
*         IB(204) = FUNC ABT COUNTER                                     CPE
*         IB(205) = STATUS ABT COUNTER                                   CPE
*         IB(206) = OUT ABT COUNTER                                      CPE
*         IB(207) = WT ERRORS COUNTER                                    CPE
*         IB(210) = READY DROPS COUNTER                                  CPE
*         IB(211) = HUNG BUSY COUNTER                                    CPE
*         IB(212) = COMPARE ERRORS COUNTER                               CPE
*         IB(213) = FEED FAILS COUNTER                                   CPE
*         OB(1-80)= DATA TO PUNCH                                        CPE
*                                                                        CPE
*   MODULES CALLED -                                                     VER1052
*                                                                        VER1052
*         CPE00A - PREPARE FOR MAIN LOOP                                 VER1052
*         CPE00B - MAIN LOOP                                             VER1052
*                                                                        VER1052
 1 FORMAT CPE - CARD PUNCH EXERCISER                                     CPE
 2 FORMAT P0-P4 = *OCT  *OCT  *OCT  *OCT  *OCT                           CPE
 3 FORMAT P5-P9 = *OCT  *OCT  *OCT  *OCT  *OCT                           CPE
 4 FORMAT P2=80 IS ILLEGAL WITH SEQUENCE NUMBERS SELECTED                CPE
20 MSG 1 TO DISPLAY                                                      CPE
   MSG 1 TO LINE 0                                                       CPE
   MSG 2 (P0,P1,P2,P3,P4) TO LINE 1                                      CPE
   MSG 3 (P5,P6,P7,P8,P9) TO LINE 2                                      CPE
   PICTURE AND BLANK                                                     CPE
   BA = P5                    *OFFSET CONTROL TO BA                      CPE
   B0 = P0                    *PRIMARY DATA BYTE                         CPE
   B1 = P1                    *ALTERNATE DATA BYTE                       CPE
   B2 = 1                     *DEFAULT STARTING COLUMN                   CPE
   IF(P2.EQ.0) GOTO 21        *IF NO STARTING COLUMN                     CPE
   IF(P2.GT.80D) GOTO 21      *IF COLUMN IS OUT OF RANGE                 CPE
   B2 = P2                    *USE USER SUPPLIED COLUMN                  CPE
21 B3 = 80D                   *DEFAULT LAST COLUMN                       CPE
   IF(P3.EQ.0) GOTO 22        *IF NO LAST COLUMN                         CPE
   IF(P3.GT.80D) GOTO 22      *IF COLUMN IS OUT OF RANGE                 CPE
   B3 = P3                    *USE USER SUPPLIED COLUMN                  CPE
22 B4 = 0                     *DEFAULT NUMBER OF BLANKS                  CPE
   IF(P4.EQ.0) GOTO 23        *IF NO BLANKS TO INSERT                    CPE
   IF(P4.GT.80D) GOTO 23      *IF OUT OF RANGE                           CPE
   B4 = P4                    *USE USER SUPPLIED VALUE                   CPE
23 IF(P9.AND.400.EQ.0) GOTO 24  *IF NO SEQUENCE NUMBERS                  CPE
   IF(B2.NE.80D) GOTO 24        *IF FIRST COLUMN IS LEGAL                CPE
   MSG 4 TO PRINT                                                        CPE
   GOTO 77                      *TERMINATE                               CPE
24 IF(P9.AND.1.EQ.0) GOTO 31  *IF RANDOM DATA IS SELECTED                CPE
25 OB(B2) = B0                *BUILD CARD IMAGE                          CPE
   B5 = B0                                                               CPE
   B0 = B1                                                               CPE
   B1 = B5                    *SWAP PRIMARY/ALTERNATE DATA               CPE
   B5 = 0                     *CLEAR BLANK COUNTER                       CPE
26 IF(B2.EQ.B3) GOTO 30       *IF CURRENT COLUMN = LAST                  CPE
   GOTO 27 WHILE (B2+1.LE.80D)  *IF NOT END OF CARD                      CPE
   B2 = 1                     *RESET CURRENT COLUMN TO 1                 CPE
27 GOTO 26 WHILE (B5+1.LE.B4)   *IF ALL BLANKS NOT INSERTED              CPE
   GOTO 25                    *CONTINUE STORING DATA                     CPE
30 B7 = 0                     *CLEAR PATTERN FLAG                        CPE
   EXIT TO 00A                *ENTER EXERCISER                           CPE
*                                                                        CPE
*---------RANDOM DATA IS SELECTED--------                                CPE
*                                                                        CPE
31 IF(P0.EQ.0) GOTO 30        *EXIT IF RANDOM DATA SELECTED              CPE
   B6 = P0                    *DATA STARTER                              CPE
   B5 = 7777                  *DEFAULT MASK                              CPE
   IF(P1.EQ.0) GOTO 32        *IF NO MASK PROVIDED                       CPE
   B5 = P1                                                               CPE
   B6 = P0.AND.P1             *USER SUPPLIED MASK                        CPE
32 RANDOM TO OB(200) FOR 80D, START B6                                   CPE
   B6 = 200                                                              CPE
33 OB(B2) = OB(B6).AND.B5                                                CPE
   B6 = B6 + 1                *BUMP INDEX TO DATA                        CPE
   B1 = 0                     *CLEAR BLANK COUNTER                       CPE
34 IF(B2.EQ.B3) GOTO 30       *EXIT IF CURRENT=LAST                      CPE
   GOTO 35 WHILE (B2+1.LE.80D)  *IF NOT END OF CARD                      CPE
   B2 = 1                     *RESET CURRENT COLUMN TO 1                 CPE
35 GOTO 34 WHILE (B1+1.LE.B4)  *IF ALL BLANKS NOT INSERTED               CPE
   GOTO 33                    *CONTINUE STORING DATA                     CPE
77 END 20                                                                CPE
COMPILE   - CPE00 -                                                      CPE
   MODULE CPE00A,3000(21),LOCK                                           VER1048
 0 FORMAT CPE- PUNCHING CARDS                                            CPE
 1 FORMAT CPE- WAIT PUNCH RDY/NOT BUSY                                   CPE
 2 FORMAT CPE- PUNCH HUNG BUSY FOR 1 SECOND                              CPE
 3 FORMAT CPE - PUNCH DROPPED READY - CHECK HOPPER/STACKER               VER1057
 4 FORMAT CPE- COMPARE ERROR - CARD OFFSET                               CPE
 5 FORMAT CPE- WT ERROR ON OUTPUT - EXP=0080  ACT=*DEC                   CPE
 6 FORMAT CPE- PUNCH FAIL-TO-FEED                                        CPE
 7 FORMAT                                                                CPE
10 FORMAT CPE- NORMAL TERMINATION- FINAL COUNTS BELOW                    CPE
11 FORMAT CPE- OCTAL CARDS PUNCHED = *OCT*OCT                            CPE
12 FORMAT CONN ABT-------*DEC   REL ABT--------*DEC                      CPE
13 FORMAT FUNC ABT-------*DEC   STATUS ABT-----*DEC                      CPE
14 FORMAT OUT ABT--------*DEC   WT ERRORS------*DEC                      CPE
15 FORMAT READY DROPS----*DEC   HUNG BUSYS-----*DEC                      CPE
16 FORMAT COMPARE ERRORS-*DEC   FEED FAILS-----*DEC                      CPE
20 FORMAT LAST ERR STS-668X=*OCT EQ=*OCT- LAST ERR BELOW                 CPE
22 FORMAT CPE- ABORT ON .CONN. COMMAND                                   CPE
23 FORMAT CPE- ABORT ON .REL. COMMAND                                    CPE
24 FORMAT CPE- ABORT ON .FUNC. COMMAND                                   CPE
25 FORMAT CPE- ABORT ON .STATUS. COMMAND                                 CPE
26 FORMAT CPE- ABORT ON .OUT. COMMAND                                    CPE
27 FORMAT --------------------------------------------------             VER1066
*                                                                        CPE
*---------PREPARE FOR THE MAIN LOOP.  THIS CODE IS EXECUTED              CPE
*         INITIALLY AND EACH TIME A FAILURE IS DETECTED.                 CPE
*                                                                        CPE
30 GOSUB 66                        *BUILD STATUS DISPLAY                 CPE
   IF(P9.AND.400.EQ.0) GOTO 31     *IF NO SEQUENCE NUMBERS               CPE
   OB(80D) = 0                     *CLEAR SEQUENCE NUMBER                CPE
31 MSG 1 TO DISPLAY                *POST WAIT MESSAGE                    CPE
32 B5 = 202                                                              CPE
   CONN, ABT 70                                                          CPE
   B5 = 205                                                              CPE
   STATUS 1 WORDS TO SB(1), ABT 70                                       CPE
   IF(SB(1).AND.3.EQ.1) GOTO 33      *IF READY AND NOT BUSY              CPE
   B5 = 203                                                              CPE
   REL, ABT 70                       *RELEASE                            CPE
   MSG 20, 2 WORDS FROM SB TO LINE 6   *REPORT STATUS                    CPE
   DELAY 50D MSEC                                                        CPE
   GOTO 32                           *RETRY                              CPE
*                                                                        CPE
*--------THE PUNCH IS READY AND NOT BUSY, SO LETS GO                     CPE
*                                                                        CPE
33 MSG 0 TO DISPLAY                  *POST PUNCHING MESSAGE              CPE
   CALL 00B                          *PUNCH CARDS                        CPE
   GOTO 70                           *PROCESS THE EXIT                   CPE
*                                                                        CPE
*---------DELAY SUBROUTINE                                               CPE
*                                                                        CPE
63 B6 = P6                           *FIXED DELAY TIME                   CPE
   IF(P9.AND.2.EQ.0) GOTO 64         *IF FIXED DELAY REQUEST             CPE
   B6 = RT.AND.P6                    *RANDOM DELAY                       CPE
64 IF(B6.LE.20D) GOTO 65             *IF SHORT DELAY                     CPE
   B5 = 203                                                              CPE
   REL, ABT 70                       *RELEASE                            CPE
   B6 = B6-20D                       *ADJUST DELAY                       CPE
65 DELAY B6 MSEC                                                         CPE
   RETURN                                                                CPE
*                                                                        CPE
*---------UPDATE STATUS DISPLAY SUBROUTINE                               CPE
*                                                                        CPE
66 B6 = 0                            *LINE NUMBER                        CPE
   B5 = 11                           *MESSAGE NUMBER                     CPE
   B0 = 200                          *BUFFER INDEX                       CPE
67 MSG B5, 2 WORDS FROM IB(B0) TO LINE B6                                CPE
   B0 = B0 + 2                       *UPDATE BUFFER INDEX                CPE
   B5 = B5 + 1                       *BUMP MESSAGE NUMBER                CPE
   GOTO 67 WHILE (B6+1.LE.5)         *DO ALL MESSAGES                    CPE
   MSG 20, 2 WORDS FROM SB TO LINE B6  *DISPLAY STATUS                   CPE
   MSG 27 TO LINE 9D                                                     VER1066
   RETURN                                                                CPE
*                                                                        CPE
*---------ERROR PROCESSOR                                                CPE
*                                                                        CPE
70 IF(B5.EQ.0) GOTO 74               *IF ALL CARDS PUNCHED               VER1072
   IF(EM.GT.77) GOTO 71              *IF COMMAND ABORT                   CPE
   B5 = EC                                                               CPE
   MSG 7 TO LINE 7                   *BLANK LAST ERROR                   CPE
   GOTO 72                                                               CPE
71 B6 = B5.AND.7+20                  *FORM MESSAGE NUMBER                CPE
   MSG B6 TO LINE 7                  *POST COMMAND NAME                  CPE
72 MSG EM(WT) TO LINE 8D           *POST ERROR MESSAGE                   CPE
   MSG EM(WT) TO DISPLAY                                                 VER1063
   IB(B5) = IB(B5) + 1              *BUMP ERROR COUNTERS                 CPE
   GOSUB 66                         *UPDATE STATUS DISPLAY               CPE
   GOSUB 63                         *DELAY                               CPE
   IF(ES.AND.SE.EQ.0) GOTO 73       *IF NO STOP ON ERROR                 VER1072
   PICTURE                                                               CPE
   HALT                                                                  CPE
73 IF(IB(200).NE.P7) GOTO 31        *IF ALL CARDS NOT DONE               VER1072
   IF(IB(201).NE.P8) GOTO 31        *IF ALL CARDS NOT DONE               VER1072
74 MSG 10 TO PRINT                  *POST FINAL COUNTS                   VER1072
   GOSUB 66                                                              CPE
   PICTURE                                                               CPE
   END 30                                                                CPE
COMPILE   - CPE00A -                                                     CPE
   MODULE CPE00B,3000(21),LOCK                                           VER1048
11 FORMAT CPE- OCTAL CARDS PUNCHED = *OCT*OCT                            CPE
*                                                                        CPE
*---------BEGIN MAIN LOOP TO PUNCH CARDS                                 CPE
*                                                                        CPE
30 IF(B7.NE.0) GOTO 40               *IF PATTERN GENERATED               CPE
   B7 = OB(80D)+1                    *NEW SEQUENCE NUMBER                CPE
   IF(P9.AND.1.NE.0) GOTO 35         *IF FIXED DATA                      CPE
   IF(P0.NE.0) GOTO 35               *IF LOCK ON PATTERN                 CPE
   B5 = 7777                         *DEFAULT DATA MASK                  CPE
   B6 = RT                                                               CPE
   IF(P1.EQ.0) GOTO 31               *IF NO MASK                         CPE
   B5 = P1                                                               CPE
   B6 = B5.AND.B6                    *MASK THE STARTER                   CPE
31 RANDOM TO OB(200) FOR 80D, START B6                                   CPE
   B0 = B2                           *FIRST COLUMN                       CPE
   B6 = 200                          *FIRST DATA WORD                    CPE
32 OB(B0) = OB(B6).AND.B5            *STORE DATA IN OB                   CPE
   B6 = B6 + 1                                                           CPE
   B1 = 0                            *CLEAR BLANK COUNTER                CPE
33 IF(B0.EQ.B3) GOTO 35              *IF ALL WORDS STORED                CPE
   GOTO 34 WHILE (B0+1.LE.80D)       *IF NOT END OF CARD                 CPE
   B0 = 1                            *RESET TO COLUMN 1                  CPE
34 GOTO 33 WHILE (B1+1.LE.B4)        *IF ALL BLANKS NOT DONE             CPE
   GOTO 32                           *STORE MORE DATA                    CPE
35 IF(P9.AND.400.EQ.0) GOTO 36       *IF NO SEQUENCE NUMBERS             CPE
   OB(80D) = B7                      *ADD SEQUENCE NUMBER                CPE
36 B7 = 1                            *SET PATTERN OK FLAG                CPE
*                                                                        CPE
*--------PUNCH A CARD IF READY AND NOT BUSY                              CPE
*                                                                        CPE
40 GOSUB 60                          *RESERVE/WAIT NOT BUSY              CPE
   IF(SB(1).AND.1.NE.0) GOTO 41      *IF READY                           CPE
   IF(SB(1).AND.100.NE.0) ERROR 6/213, GOTO 70  *FEED FAIL               CPE
   ERROR 3/210, GOTO 70              *READY DROP                         CPE
41 B5 = 204                                                              CPE
   FUNC 1, ABT 70                    *SELECT BINARY                      CPE
   B5 = 206                                                              CPE
   OUT 80D WORDS FROM OB(1), ABT 70  *PUNCH                              CPE
   B7 = 0                            *CLEAR PATTERN FLAG                 CPE
   B6 = IB(201)+1.RS.12D             *BUMP CARDS PUNCHED                 CPE
   IB(200) = IB(200) + B6            *ADD OVERFLOW TO UPPER              CPE
   IB(201) = IB(201) + 1             *BUMP LOWER                         CPE
   IF(WT.NE.80D) ERROR 5/207, GOTO 70  *IF WT ERROR                      VER1055
   B5 = 203                                                              CPE
   REL, ABT 70                       *RELEASE                            CPE
   DELAY 230D MSEC                   *WAIT ON CARD CYCLE                 CPE
   B5 = 202                                                              CPE
   CONN, ABT 70                                                          CPE
   B6 = 0                                                                CPE
   B5 = 205                                                              CPE
43 STATUS 1 WORDS TO SB(1), ABT 70   *GET STATUS                         CPE
   IF(SB(1).AND.2.EQ.0) GOTO 44      *IF NOT BUSY                        CPE
   DELAY 1 MSEC                                                          CPE
   GOTO 43 WHILE (B6+1.LT.1000D)     *WAIT UP TO 1 SECOND                CPE
   ERROR 2/211, GOTO 70              *REPORT HUNG BUSY ERR               CPE
44 IF(SB(1).AND.2000.EQ.0) GOTO 50   *IF NO COMPARE ERROR                CPE
   B5 = 204                                                              CPE
   FUNC 3, ABT 70                    *ATTEMPT TO OFFSET                  CPE
   ERROR 4/212, GOTO 70              *COMPARE ERROR                      CPE
50 IF(P5.EQ.0) GOTO 51               *IF NO OFFSET SELECTED              CPE
   B5 = BA                           *SAVE CURRENT COUNT                 CPE
   BA = BA - 1                       *DECREMENT THE COUNT                VER1054
   IF(B5-1.GE.0) GOTO 51             *IF NOT TIME TO OFFSET              CPE
   BA = P5                           *RESET COUNT                        CPE
   B5 = 204                                                              CPE
   FUNC 3, ABT 70                    *ATTEMPT TO OFFSET                  CPE
51 GOSUB 63                          *DELAY                              CPE
   MSG 11, 2 WORDS FROM IB(200) TO LINE 0  *CARDS PUNCHED                CPE
   B5 = 0                            *INDICATE NORMAL EXIT               CPE
   IF(IB(200).NE.P7) GOTO 30         *IF UPPER NOT REACHED               CPE
   IF(IB(201).NE.P8) GOTO 30         *IF LOWER NOT REACHED               CPE
   GOTO 70                           *TERMINATE                          CPE
*                                                                        CPE
*--------CONNECT AND WAIT NOT BUSY SUBROUTINE                            CPE
*                                                                        CPE
60 B6 = 0                                                                CPE
61 B5 = 202                                                              CPE
   CONN, ABT 70                                                          CPE
   B5 = 205                                                              CPE
   STATUS 1 WORDS TO SB(1), ABT 70                                       CPE
   IF(SB(1).AND.2.EQ.0) GOTO 62      *IF NOT BUSY                        CPE
   DELAY 1 MSEC                                                          CPE
   GOTO 61 WHILE (B6+1.NE.1000D)     *WAIT UP TO 1 SECOND                CPE
   ERROR 2/211, GOTO 70              *HUNG BUSY                          CPE
62 RETURN                                                                CPE
*                                                                        CPE
*---------DELAY SUBROUTINE                                               CPE
*                                                                        CPE
63 B6 = P6                           *FIXED DELAY TIME                   CPE
   IF(P9.AND.2.EQ.0) GOTO 64         *IF FIXED DELAY REQUEST             CPE
   B6 = RT.AND.P6                    *RANDOM DELAY                       CPE
64 IF(B6.LE.20D) GOTO 65             *IF SHORT DELAY                     CPE
   B5 = 203                                                              CPE
   REL, ABT 70                       *RELEASE                            CPE
   B6 = B6-20D                       *ADJUST DELAY                       CPE
65 DELAY B6 MSEC                                                         CPE
   RETURN                                                                CPE
*                                                                        CPE
*--------ERROR PROCESSOR                                                 CPE
*                                                                        CPE
70 ENDSUB                             *CLEAR SUBROUTINE MODE             CPE
   EXIT                               *EXIT TO PROCESS ERROR             CPE
   END 30                                                                CPE
COMPILE   - CPE00B -                                                     CPE
   MODULE CPE99,3000(21),LOCK   CPE PARAMETERS                           VER1048
/                                                                        CPE
/         P0 - PRIMARY DATA BYTE IF P9 BIT 0= 1 (FIXED DATA)             CPE
/              RANDOM DATA STARTER IF P9 BIT 0= 0.                       CPE
/                                                                        CPE
/         P1 - SECONDARY DATA BYTE IF P9 BIT 0= 1.                       CPE
/              RANDOM DATA MASK IF P9 BIT 0= 0.                          CPE
/                                                                        CPE
/         P2 - FIRST COLUMN TO PUNCH DATA (DEFAULTS TO 1).               CPE
/                                                                        CPE
/         P3 - LAST COLUMN TO PUNCH DATA (DEFAULTS TO 80).               CPE
/                                                                        CPE
/         P4 - NUMBER OF BLANKS TO INSERT BETWEEN PRIMARY                CPE
/              AND SECONDARY DATA WORDS OR RANDOM DATA WORDS             CPE
/              (DEFAULTS TO 0 - NONE).                                   CPE
/                                                                        CPE
/         P5 - NUMBER OF CARDS TO PUNCH BEFORE OFFSETTING                CPE
/              ONE (DEFAULTS TO 0).                                      CPE
/                                                                        CPE
/         P6 - MSEC TO DELAY AFTER EACH CARD PUNCHED.                    CPE
/              (DEFAULTS TO 0 - SEE P9 BIT 1).                           CPE
/                                                                        CPE
/         P7/P8 - NUMBER OF CARDS TO PUNCH (P8 IS LOWER BITS)            CPE
/              (DEFAULTS TO 77777777).                                   CPE
/                                                                        CPE
/         P9 - CONTROL BITS FOR OPTIONS                                  CPE
/                                                                        VER1071
/                      CLEAR          /      SET                         VER1071
/                                                                        VER1071
/              XXX1- RANDOM DATA      / FIXED DATA                       VER1071
/              XXX2- P6 = FIXED DELAY / P6 = DELAY MASK                  VER1071
/              XXX4-X2XX NOT USED                                        VER1071
/              X4XX- NO SEQ. NUMBERS  / SEQ. NUMBERS COL 80              VER1071
/              1XXX-4XXX NOT USED                                        VER1071
/                                                                        CPE
20 PAUSE                                                                 CPE
   END 20                                                                CPE
COMPILE,SOURCE   - CPE99 -                                               CPE
