*COMDECK,CPCOM
****
*        START OF COMDECK CPCOM 
          SPACE    2
*     FUNCTION -- CPC TRANSMITS REQUESTS FOR PP ACTION FROM CP
*     PROGRAMS TO MONITOR, AND IN SOME CASES RETURNS INFORMATION
*     AFTER COMPLETION BY THE PP PROGRAM. 
          SPACE    2
*     ENTRY INFORMATION -- FOR FILE ACTION, A1 MUST CONTAIN THE 
*     ADDRESS OF THE FIRST WORD OF THE FET. THE REQUEST WORD
*     FOLLOWING THE RETURN JUMP MUST HAVE IN BITS 42-59 EITHER THE
*     NAME OF THE WANTED PP PROGRAM, OR ONE OF OCTAL 000001 IF
*     ONLY A RECALL ON THE FILE IS WANTED, 000007 FOR CLOSE,
*     000004 FOR OPEN, 000002 FOR READ OR WRITE, AND 000003 FOR 
*     OTHER FUNCTIONS. BIT 41 MUST BE ZERO, AND BIT 40 IS ZERO
*     FOR NO RECALL OR 1 FOR RECALL. BITS 0-17 CONTAIN THE FUNCTION 
*     CODE, OR 777777B IN CASE OF A FILE RECALL, AND THE
*     REMAINDER OF THE WORD IS NORMALLY ZERO, EXCEPT FOR A RECORD 
*     COUNT IN BITS 18-35 FOR CERTAIN SKIP FUNCTIONS. 
          SPACE    1
*     FOR NON-FILE ACTION, A1 NEED NOT CONTAIN ANYTHING IN PARTICULAR.
*     BITS 42-59 OF THE REQUEST WORD CONTAIN THE NAME OF
*     THE WANTED PP PROGRAM. BIT 41 MUST BE 1. BIT 40 IS 0 FOR NO 
*     RECALL OR 1 FOR RECALL. BITS 0-17 CONTAIN THE ADDRESS IN CM 
*     RELATIVE TO RA AT WHICH THE PP PROGRAM IS TO START FINDING
*     INFORMATION AND/OR PLACING ITS RESPONSE. FOR EVERY
*     PP PROGRAM EXCEPT MSG, THINGS ARE ARRANGED SO THAT BIT 0 OF 
*     THE WORD THIS ADDRESS POINTS TO IS INITIALLY 0, AND BECOMES 1 ON
*     COMPLETION. FOR MSG, WHEN A REQUEST WITH RECALL IS MADE,
*     CPC SETS UP, INSIDE ITSELF, A WORD WITH A POINTER TO THE
*     MESSAGE IN ITS LEFT HALF AND SPACE FOR RESPONSE IN ITS RIGHT
*     HALF. THEN THE ADDRESS OF THIS WORD, RATHER THAN OF THE MESSAGE 
*     ITSELF, IS SENT TO MONITOR, AND MSG KNOWS THAT IF THE REQUEST 
*     IS WITH RECALL, THE POINTER TO THE MESSAGE IS INDIRECT. 
          SPACE    1
*     EXIT INFORMATION -- ONLY FOR FILE ACTION REQUESTS. THEN X1=0
*     UNLESS THE PP PROGRAM RETURNED NON-ZERO IN BITS 9-13 OF THE 
*     WORD AT FET. IN THAT CASE, X1 CONTAINS THAT WORD. 
*     FOR WHAT IS DONE WHEN OWNCODE IS PROVIDED, SEE BELOW IN 
*     SUBROUTINE CPC4.
          SPACE    1
*     REGISTERS USED -- A1,X1,A6,X6 
          SPACE    1
*     SUBROUTINE CPC03 IS CALLED TO SAVE ALL REGISTERS EXCEPT 
*     A1,X1,A6,X6,A7 AND X7, AND TO SET B1=1. IT IS CALLED AT THE 
*     BEGINNING OF CPC, AND ALSO BY THE SUBROUTINE IOSAV IN PROGRAM IO, 
*     WHICH IS CALLED FROM IO ITSELF AND ALSO FROM PROGRAM IORANDM. 
*     THE CALLING SEQUENCE IS  RJ  CPC03
*                              VFD 60/N 
*     THE REGISTERS WILL BE SAVED IN CELLS N THROUGH N+8. X0 GOES INTO
*     N, B1 B2 AND B3 INTO N+1, B4 B5 AND B6 INTO N+2, B7 A0 AND A2 
*     INTO N+3, A3 A4 AND A5 INTO N+4, X2 INTO N+5, X3 INTO N+6,
*     X4 INTO N+7, AND X5 INTO N+8. WHERE THREE SHORT REGISTERS GO
*     INTO ONE WORD, THE FIRST OCCUPIES BITS 36-53, THE SECOND 18-35
*     AND THE THIRD 0-17. 
*     THE REASON CPC03 DOES NOT SAVE A7 AND X7 IS THAT PROGRAMS CPC 
*     IO AND IORANDM LEAVE THEM UNTOUCHED IN ANY CASE.
          SPACE    1
*     ENTRY INFORMATION -- ONLY THE CALLING SEQUENCE
*     EXIT INFORMATION -- NONE
*     REGISTERS USED -- A1, X1, A6, X6, AND B1, WHICH IS LEFT=1.
          SPACE    1
*     THE CORRESPONDING SUBROUTINE FOR RELOADING THE REGISTERS
*     IS CPC04. 
          SPACE    1
****
 CPC03    DATA     0
          SA1      CPC03
          LX1      30 
          SA1      X1 
          BX6      X0 
          SA6      X1 
          SX6      B1 
          SX1      B2 
          SX0      B3 
          SB1      1
          RJ       CPC002 
          SX6      B4 
          SX1      B5 
          SX0      B6 
          RJ       CPC002 
          SX6      B7 
          SX1      A0 
          SX0      A2 
          RJ       CPC002 
          SX6      A3 
          SX1      A4 
          SX0      A5 
          RJ       CPC002 
          BX6      X2 
          SA6      A6+B1
          BX6      X3 
          SA6      A6+B1
          BX6      X4 
          SA6      A6+B1
          BX6      X5 
          SA6      A6+B1
          SA1      CPC03
          LX1      30 
          SB2      X1 
          JP       1+B2 
          EJECT  5,10                                                   01251073
          EJECT  5,10                                                   0125 679
****
*     SUBROUTINE CPC04 RELOADS ALL REGISTERS EXCEPT A1,A6,A7,X1,
*     X6, AND X7. IT IS THE INVERSE OF CPC03, WHICH SEE ABOVE.
*     THE CALLING SEQUENCE IS  RJ  CPC04
*                              VFD 60/N 
*     WHERE N IS THE ADDRESS OF THE FIRST OF 9 WORDS WHERE THE
*     REGISTERS SHOULD HAVE BEEN STORED BY CPC03. 
          SPACE    1
*     ENTRY INFORMATION -- NONE EXCEPT THE CALLING SEQUENCE.
*     EXIT INFORMATION -- NONE. 
          SPACE    2
****
 CPC04    DATA     0
          SA1      CPC04
          LX1      30 
          SX6      B1 
          IX6      X1+X6
          LX6      30 
          SA6      A1 
          SA1      X1 
          SA1      X1 
          BX0      X1 
          SA1      A1+B1
          SB3      X1 
          LX1      42 
          SB2      X1 
          LX1      42 
          BX6      X1         (B1)
          SA1      A1+B1
          SB6      X1 
          LX1      42 
          SB5      X1 
          LX1      42 
          SB4      X1 
          SA1      A1+B1
          SA2      X1 
          LX1      42 
          SA0      X1 
          LX1      42 
          SB7      X1 
          SA1      A1+B1
          SA5      X1 
          LX1      42 
          SA4      X1 
          LX1      42 
          SA3      X1 
          SA1      A1+B1
          BX2      X1 
          SA1      A1+B1
          BX3      X1 
          SA1      A1+B1
          BX4      X1 
          SA1      A1+B1
          BX5      X1 
          SB1      X6 
          EQ       CPC04
          EJECT  5,5                                                    01251075
          EJECT  5,2                                                    0125 681
**    CPC094 IS USED ONLY TO SAVE THE CONTENT OF A1 ON ENTRY TO CPC.
          SPACE    1
 CPC094   DATA     0
          SPACE    1
**    THE 9 WORDS BEGINNING AT CPC091 ARE USED BY CPC03 TO SAVE 
*     REGISTERS ON ENTRY TO CPC.
          SPACE    1
 CPC091   BSS      9
          SPACE    4
**    CPC IS ENTERED AS A SUBROUTINE HERE.  FIRST A1 IS SAVED, AS 
*     IT MAY CONTAIN A POINTER TO THE FET. THEN CPC49 IS ZEROED.
*     THIS IS THE WORD THAT WILL BE IN THE X1 ON EXIT FROM CPC, AND 
*     IT WILL REMAIN ZERO UNLESS THE CPC CALL IS FOR FILE ACTION, 
*     AND THE PP PROGRAM LEAVES BITS 9-13 OF THE FIRST WORD OF THE
*     FET NON-ZERO. IN THAT CASE CPC49 WILL CONTAIN THE FIRST 
*     WORD OF THE FET.
*     THEN CPC03 IS CALLED TO SAVE ALL REGISTERS EXCEPT A1, X1, 
*     A6, X6, A7 AND X7. A7 AND X7 WILL NOT BE TOUCHED BY CPC.
 CPC      DATA     0
          SX6      A1 
          SA6      CPC094     SAVE LFN
          SX6      B0 
          SA6      CPC49           ERROR FLAGS WILL BE SAVED HERRE
          RJ       CPC03           SAVE 
          VFD      60/CPC091
          SA2      CPC094 
**    NOW THE VALUE A1 HAD ON ENTRY TO CPC IS RECOVERED AND PUT 
*     INTO B2, WHERE IT WILL STAY THROUGHOUT CPC IN CASE OF FILE
*     ACTION. 
          SB2      X2         LFN 
          SA2      CPC
          LX2      30 
          SX6      B1 
          IX6      X6+X2
          LX6      30 
          SA6      A2              STEP EXIT FROM CPC 
          SA2      X2 
**    NOW A2 CONTAINS THE ADDRESS OF THE REQUEST WORD IN THE
*     CALLING SEQUENCE TO CPC. THIS VALUE WILL BE KEPT IN A2
*     UNTIL THE EXIT FROM CPC.
          LX2      18 
          PL       X2,CPC3    FILE ACTION 
**    IF THE CPC CALL WAS NOT FOR FILE ACTION, WE HAVE A FAIRLY 
*     SIMPLE PATH DOWN TO EXIT AT CPC0. BUT WE MUST FIRST SEE 
*     IF THE CALL IS FOR MSG WITH RECALL. IF SO, GO OFF TO LOCATION 
*     MSG FROM WHICH WE SHALL COME BACK TO CPC05. IF NOT, GO ON 
*     DOWN TO CPC05.
          SA2      A2 
          BX6      X2 
          LX6      19 
          PL       X6,CPC05        NO RECALL, TREAT MSG NORMALLY
          MX6      18 
          BX6      X6*X2
          LX6      18 
          SX6      X6-152307B 
          ZR       X6,MSG 
          SPACE    1
**    AT CPC05, FOR NON-FILE ACTION, WE PUT INTO B2 NOT THE ADDRESS 
*     THAT WAS IN A1 ON ENTRANCE TO CPC, WHICH IS MEANINGLESS, BUT
*     THE ADDRESS THAT WAS IN BITS 0-17 OF THE REQUEST WORD, AS THIS
*     IS THE ADDRESS OF THE WORD IN WHICH BIT 0 WILL BE CHANGED 
*     FROM 0 TO 1 BY THE PP PROGRAM.
 CPC05    SB2      X2 
          SX6      B1 
          LX6      41 
          BX2      -X6*X2          KILL NON-FILE BIT,KEEP RECALL BIT
          RJ       CPC01      ISSUE NON-FILE REQUEST
**    HAVING ISSUED THE REQUEST, WE PICK UP THE REQUEST WORD AGAIN
*     FROM THE CALLING SEQUENCE AND SEE IF THE RECALL BIT WAS SET.
*     IF NOT, GO TO EXIT AT CPC0. IF SET, FIRST CALL SUBROUTINE 
*     CPC02 TO WAIT UNTIL THE COMPLETION BIT TURNS TO 1.
          SA2      A2 
          LX2       18                  RIGHT JUSTIFY REQUEST 
          SX3       X2-3RMEM
          NZ        X3,CPC050           TEST FOR MEMORY REQUEST 
* 
**    IF MEMORY REQUEST, A CHECK WILL BE MADE OF A-ADDRESSES. IF THEY 
*     ARE WITHIN THE NEW FL NO CHANGE WILL BE MADE OTHERWISE THEY 
*     WILL BE SET TO ZERO.
* 
          SA1       B2
          LX2       23                  CM OR ECS BIT 
          ZR        X1,CPC050           BRANCH IF INFORMATION REQUEST 
          NG        X2,CPC050           BRANCH IF ECS LIMIT 
          AX1       30                  NEW LIMIT 
          SB6       X1                  B6 CARRIES NEW LIMIT
          SA1       CPC091+3            A2 SAVE WORD
          SB4       X1                  B4 USED FOR TESTING 
          AX1       18                  DROP ADDRESS
          BX6       X1                  X6 TO BE REBUILT
          SB3       B0                  0 TO B3 
          SB5       B1+B1               2 TO B5 
* 
**    LOOP TO TEST STORED VALUES FOR A2, A3, A4, AND A5.
* 
 CPC05L   SX5       B4                  A-REGISTER VALUE TO X5
          GT        B6,B4,*+1           BRANCH IF FL MORE THAN A-REG. 
          MX5       0                   OTHERWISE USE ZERO
          LX6       18                  POSITION FOR FIELD
          SB3       B3-B1               INNER LOOP COUNT
          IX6       X6+X5               ADD IN A-ADD
          LX1       18                  NEXT FIELD
          SB4       X1
          PL        B3,CPC05L           BACK IF NOT DONE
          SA6       A1                  STORE SAVED VALUE 
          SB3       B1+B1               RESET INNER COUNT 
          SB5       B5-B1               OUTER LOOP COUNT
          SA1       A1+B1               NEXT SAVED WORD 
          MX6       0 
          LX1       24
          SB4       X1                  A3 FIELD
          NZ        B5,CPC05L           BACK IF NOT DONE
 CPC050   SA2       A2                  RESTORE X2
          LX2      19 
          PL       X2,CPC0   DONE IF NOT R=1
          RJ       CPC02      LFN NOT=0,WAIT
 CPC0     RJ       CPC04      RESTORE REGISTERS AND EXIT
          VFD      60/CPC091
          SA1      CPC49
          EQ       CPC
**    CPC49 WAS ZEROED ON ENTRY TO CPC. IF A FILE ACTION PRODUCED 
*     NON-ZERO IN BITS 9-13 OF THE FIRST WORD OF THE FET, THIS
*     FIRST WORD HAS BEEN STORED IN CPC49 AND IS IN X1 ON EXIT. 
          SPACE    4
**    WE COME TO MSG FROM THE INSTRUCTION BEFORE CPC05 ON FINDING 
*     A CALL FOR MSG WITH RECALL. WE REFORMAT THE CALL AS IF IT 
*     POINTED TO CELL MSGRESP, AND PUT THE ADDRESS OF THE MESSAGE IN
*     THE LEFT HALF OF MSGRESP, AND ZERO IN THE RIGHT HALF. 
*     THIS ALLOWS PP PROGRAM MSG TO SIGNAL COMPLETION BY SETTING
*     BIT 0 OF MSGRESP TO 1. OBVIOUSLY IT COULD NOT DO THIS 
*     TO THE FIRST WORD OF THE MESSAGE, TO WHICH THE REQUEST
*     ACTUALLY POINTED. THEN WE RETURN TO CPC05 IN SUCH A WAY THAT
*     B2 WILL BE SET TO MSGRESP.
          SPACE    4
 MSG      SX6      X2 
          LX6      30 
          SA6      MSGRESP
          MX6      42 
          BX2      X6*X2
          SX6      MSGRESP
          BX2      X6+X2
          EQ       CPC05
 MSGRESP  DATA     0
          SPACE    4
**    WE COME TO CPC8 FROM A POINT AN INCH BELOW CPC31 IN CASE
*     OF AN INVALID FILE ACTION REQUEST, THAT IS, ONE IN WHICH
*     BITS 42-59 ARE NOT PLAUSIBLE. WE ABORT THE JOB WITH A MESSAGE.
 CPC8     RJ       CPC999 
 -        JP       CPC002 
          DIS      3,INVALID REQUEST TO CPC 
          EJECT  5,6                                                    01251077
          EJECT  5,8                                                    0125 683
**    SUBROUTINE CPC002 IS CALLED ONLY BY SUBROUTINE CPC03, TO
*     COMBINE SHORT REGISTERS STORED IN X6,X1, AND X0 INTO ONE
*     WORD AND STORE IT AT A6, AND THEN STEP UP A6. NOTE THAT 
*     B3 IS USED AS TEMPORARY STORAGE. THIS IS POSSIBLE BECAUSE 
*     IT HAD BEEN TRANSFERRED TO X0 JUST BEFORE THE FIRST CALL TO 
*     CPC002. 
          SPACE    2
 CPC002   DATA     0
          SB3      X0 
          MX0      42 
          BX6      -X0*X6 
          BX1      -X0*X1 
          LX6      18 
          BX6      X6+X1
          LX6      18 
          SX1      B3 
          BX1      -X0*X1 
          BX6      X6+X1
          SA6      A6+B1
          EQ       CPC002 
          EJECT  5,6                                                    01251079
          EJECT  5,7                                                    0125 685
**    SUBROUTINE CPC01 IS USED TO PLACE REQUESTS TO MONITOR 
*     FOR PP ACTION IN CELL RA+1. ON ENTRY, THE REQUEST IS IN 
*     X2. FIRST WE WAIT FOR RA+1 TO CONTAIN ZERO, THEN PUT THE
*     REQUEST THERE, THEN WAIT FOR IT TO CONTAIN ZERO AGAIN,
*     THEN EXIT.
*     IF THE SIGN BIT AT RA+66B (RA+RA.CEJ) IS 1, THE SYSTEM SHOULD 
*     HAVE THE XJ INSTRUCTION, SO WE USE THIS TO SHORTEN THE WAIT 
*     FOR MONITOR-S ATTENTION.
          SPACE    2
 CPC01    DATA     0
 +        SA1      B1 
          NZ       X1,* 
          BX6      X2 
          SA6      B1 
          SA1      66B
          PL       X1,CPC011
 +        XJ
 CPC011   SA1      B1 
          NZ       X1,* 
          EQ       CPC01
          EJECT  5,7                                                    01251081
          EJECT  5,8                                                    0125 687
**    SUBROUTINE CPC02 WAITS FOR THE COMPLETION OF A REQUEST. 
*     B2 CONTAINS THE ADDRESS OF THE CELL WHOSE BIT 0 MUST BE 
*     SET TO 1 BY A PP WHEN THE REQUEST IS COMPLETE. B2 IS SET
*     AT THE BEGINNING OF CPC AND RETAINS THIS VALUE THROUGHOUT.
*     FIRST WE CHECK THIS BIT. IF IT IS 1, WE EXIT. IF NOT, 
*     WE CALL CPC01 WITH AN AUTO-RECALL REQUEST.                        0444  18
          SPACE     1                                                   0444  19
 CPC02    DATA     0          WAIT FOR COMPLETION OF A REQUEST
 CPC021   SA1      B2 
          LX1      59 
          NG       X1,CPC02     DONE
          SA1      CPCRCL                                               0444  10
          SX2      B2              SET UP AUTO RECALL REQUEST           0444  11
          BX2      X2+X1                                                0444  12
          RJ       CPC01      ENTER RECALL
          EQ       CPC021                                               0725   5
          SPACE     1                                                   0444  15
CPCRCL    VFD      18/3RRCL,6/20B,36/0                                  0444  16
          EJECT  5,17                                                   01251083
          EJECT  5,18                                                   0125 689
**    WE COME TO CPC3 WHEN WE HAVE FOUND THAT FILE ACTION IS
*     WANTED, AND HAVE SET A2 TO THE ADDRESS OF THE REQUEST 
*     IN THE CALLING SEQUENCE, AND B2 TO THE ADDRESS OF THE 
*     RELEVANT FET. 
*     BITS 42-59 OF THE REQUEST WORD MAY CONTAIN THE NAME OF
*     A PP PROGRAM. IF BITS 54-59 ARE NON-ZERO THIS IS ASSUMED. 
*     THE TABLE OF PP PROGRAM NAMES AT CPC319 IS USED TO DETERMINE
*     IF THE REQUEST WORD CONTAINS OPE OR CLO, AND IF SO SET UP A 
*     CALL TO CIO - AS ALL OPE/CLO REQUESTS WILL BE ROUTED THROUGH CIO. 
*     IF THOSE BITS ARE ZERO, BITS 42-59 MUST CONTAIN A NUMBER
*     BETWEEN 0 AND 7. OTHERWISE WE BRANCH BACK TO CPC8 FOR INVALID 
*     REQUEST ACTION. IF BETWEEN 0 AND 7 AND ODD, WE
*     FIRST CALL CPC4 TO TAKE CARE OF PENDING ACTION AND
*     RESPONSE ON THE FILE. THEN AS IT WERE SUBTRACT 1. 
*     THEN AT CPC31 WE DEAL WITH THE REMAINING 0, 2, 4, OR
*     6. IF 0, WE DO NOTHING FURTHER. IF 2, 4 OR 6 CALL CIO.
          SPACE    2
 CPC319   VFD      60/3LCIO 
          VFD      60/3LOPE 
          VFD      60/3LCLO 
          SPACE    2
 CPC3     SA3      A2         GET REQUEST AGAIN 
          MX2      6
          BX2      X2*X3
          SB7      A2   ADDRESS OF REQST,CONTAINING PP PROG NAME
* 
**    IF BITS 54-59 OF THE REQUEST WORD ARE NON-ZERO WE DETERMINE 
*     IF THE REQUEST WORD CONTAINS THE PP PROGRAM NAME, OPE OR CLO AND
*     IF SO PUT A POINTER TO CPC319(PP NAME - CIO) IN B7, BECAUSE ALL 
*     OPE/CLO REQUESTS WILL GO THROUGH CIO. THEN GO TO CPC312.  IF
*     THE REQUEST WORD DOES NOT CONTAIN OPE OR CLO, GO TO CPC312 WITH 
*     THE ADDRESS OF THE REQUEST ITSELF IN B7 FROM WHICH WE PICK UP THE 
*     PROGRAM NAME AGAIN. IF WE GOT TO CPC312 BECAUSE BITS 54-59 OF THE 
*     REQUEST WORD WERE ZERO, B7 WOULD POINT TO CPC319 WHICH CONTAINS 
*     PP NAME - CIO.
* 
          ZR       X2,NOPPR        BITS 42-59 ARE ZERO
          MX2      18         SET UP MASK TO PICK UP PP ROUTINE NAME
          BX2      X2*X3      PICK UP ROUTINE NAME ONLY 
          SA5      CPC319+1 
          BX4      X2-X5           IS ROUTINE NAME OPE
          ZR       X4,SETCIO       YES - JUMP 
          SA5      CPC319+2 
          BX4      X2-X5           IS ROUTINE NAME CLO
          NZ       X4,CPC312       NO 
 SETCIO   SB7      CPC319          PUT PTR TO PP NAME(CIO) IN B7
          JP       CPC312 
          SPACE    2
**    NOW IF BITS 42-59 OF THE REQUEST CONTAIN AN ODD NUMBER, 
*     WE CALL CPC4 TO PROCESS ANY PREVIOUS ACTION AND RESPONSE ON 
*     THE FILE BEFORE GOING TO CPC31. OTHERWISE GO STRAIGHT TO CPC31. 
 NOPPR    LX3      17 
          PL       X3,CPC31 
          RJ       CPC4 
 CPC31    SA2      A2 
          MX3      17 
          BX3      X2*X3
          LX3      17 
**    NOW WE HAVE IN X3 THE NUMBER FROM BITS 43-59 OF THE REQUEST  WORD.
*     IF THIS IS 0, THE REQUEST WAS MERELY FOR A RECALL ON THE
*     FILE. WE HAVE ALREADY CALLED CPC4 TO WAIT FOR THE 
*     END OF ANY PENDING ACTION ON THE FILE AND PROCESS ITS 
*     RESPONSE, AND WE CAN EXIT THROUGH CPC0. OTHERWISE, WE 
*     BRANCH TO CPC8 FOR INVALID REQUEST IF THESE BITS GIVE A 
*     NUMBER ABOVE 3. 
          ZR       X3,CPC0         FILE RECALL DONE 
          SX3      X3-CPC3-1+CPC319 
          PL       X3,CPC8         INVALID REQUEST
**    OTHERWISE, WE HAVE A VALID REQUEST FOR CIO, OPE, OR CLO.
*     WE PUT A POINTER TO THE PP PROGRAM NAME, CIO IN B7 AS THESE 
*     REQUESTS WILL BE ROUTED THROUGH CIO.
* 
          SB7      CPC319 
* 
**    NOW WE SEE WHICH OF THE FOLLOWING SITUATIONS WE ARE IN. 
*     1. THE REQUEST IS NOT FOR A READ OR WRITE, IN WHICH CASE
*     WE GO TO CPC3107 TO CARRY IT OUT. 
*     2. THE REQUEST IS FOR READ OR WRITE (NOT WRITER OR WRITEF)
*     AND THE FILE IS ALREADY BUSY WITH THE SAME FUNCTION,
*     IN WHICH CASE THE REQUEST IS FOR A CONTINUATION OF AN ACTION
*     ALREADY GOING ON, WHICH THE PP PROGRAMS WILL CONTINUE AS LONG 
*     AS POSSIBLE ANYWAY. SO WE GO TO CPC3102 TO EXIT TO
*     CPC0 IF THE REQUEST IS WITHOUT RECALL, OR TO CALL CPC4
*     TO PROCESS RESPONSE BEFORE GOING TO CPC0 IF THE REQUEST 
*     IS WITH RECALL. 
*     3. THE REQUEST IS FOR READ OR WRITE, BUT THE FILE IS NOT BUSY OR
*     IS BUSY WITH A DIFFERENT ACTION. IN THIS CASE 
*     WE GO TO CPC325.
          SX3      570B            ELIMINATE BITS 0,1,2 AND 7 
          BX3      X2*X3
          SX3      X3-10B 
          NZ       X3,CPC3107 
          SA1      B2              READ/WRITE 
          LX1      59 
          NG       X1,CPC325   BUFFER NOT BUSY
          LX1      52 
          AX1      54              GET FIRST 6 BITS OF PREV.FUNC CODE 
          SX1      X1-1                                                 20145  8
          ZR       X1,CPC3102  BUSY WITH READ/WRITE 
          SPACE    4
**    WE COME TO CPC325 WHEN THE REQUEST IS FOR A READ OR WRITE,
*     AND THE FILE IS NOT BUSY OR IS BUSY WITH A DIFFERENCT ACTION. 
*     FIRST WE CALL CPC4 TO WAIT FOR THE END OF ANY PENDING ACTION
*     AND PROCESS THE RESPONSE. THEN, IF THE REQUEST IS FOR WRITE,
*     WE GO TO CPC3253. BUT IF FOR A READ, WE SEE WHETHER THE FILE
*     STATUS IS NOW END OF RECORD. IF SO, WE GO TO CPC0 AND EXIT
*     TO MAKE SURE THE CALLING PROGRAM WILL NOT FAIL TO SEE THE 
*     EOR STATUS BIT. THE CALLER MUST ZERO THIS BIT TO CONTINUE 
*     READING. OTHERWISE, IT WOULD BE POSSIBLE FOR THE CALLER TO DO A 
*     SERIES OF READS WITHOUT RECALL AND MISS THE EOR.
 CPC325   RJ       CPC4       NOT BUSY,OR BUSY WITH SERIOUS FUNCTION
          SA2      A2 
          LX2      57 
          NG       X2,CPC3253  WRITE
          SA1      B2 
          SX2      60B
          BX2      X1*X2
          SX1      20B
          BX2      X2-X1
          ZR       X2,CPC0    EOR/EOF   DONT READ 
          SA3      B2+2       IN READ 
          SA4      A3+B1      OUT 
          SX3      X3+B1
          EQ       CPC3254
          SPACE    2
**    WE COME TO CPC3253 (FOR WRITE) OR CPC3254 (FOR READ) WHEN 
*     WE HAVE DETERMINED THAT WE SHALL TRANSMIT A READ OR WRITE 
*     REQUEST. NOW WE CHECK TO SEE THAT THERE IS AT LEAST ROOM
*     IN THE BUFFER TO READ OR WRITE ONE PRU. IF NOT, WE EXIT 
*     THROUGH CPC0 TO AVOID WASTING PP TIME.
 CPC3253  SA4      B2+2       IN WRITE
          SA3      A4+B1      OUT 
 CPC3254  SX4      X4 
          SX3      X3 
          IX6      X4-X3
          SA4      B2+4       LIMIT 
          PL       X6,CPC3255 
          SA3      B2+B1      FIRST 
          SX3      X3 
          SX4      X4 
          IX3      X4-X3
          SA4      A4 
          IX6      X6+X3
 CPC3255  LX4      27 
          AX4      45              GET PRU LENGTH 
          IX3      X6-X4
          NG       X3,CPC0         NOT ROOM FOR 1 PRU 
          SPACE    4
**    WE COME TO CPC3107 EITHER WHEN WE FIND THAT THE REQUEST IS
*     NOT FOR READ OR WRITE, OR WHEN WE FIND THAT IT IS READ OR 
*     WRITE AND SHOULD BE PASSED ON.
          SPACE    1
 CPC3107  RJ       CPC5            ISSUE REQUEST
          SPACE    4
**    WE COME TO CPC3102 WHEN WE HAVE EITHER ISSUED THE REQUEST,
*     OR DETERMINED THAT IT WAS FOR A READ OR WRITE THAT ALREADY
*     WAS EFFECTIVELY IN PROGRESS. IF THE REQUEST HAD NO RECALL 
*     BIT, JUST EXIT THROUGH CPC0. IF IT HAD A RECALL BIT, CALL 
*     CPC4 TO WAIT TILL THE FILE IS NOT BUSY AND PROCESS THE
*     RESPONSE, AND THEN EXIT THROUGH CPC0. 
          SPACE    1
 CPC3102  SA2      A2 
          LX2      19 
          PL       X2,CPC0     NOT A RECALL REQ.,DONE 
          RJ       CPC4       PROCESS RESPONSE
          EQ       CPC0       DONE
          SPACE    4
**    WE COME TO CPC312 FROM JUST BELOW CPC3 IF BITS 54-59 OF THE 
*     REQUEST WORD WERE NOT ZERO. WE ASSUME BITS 42-59 CONTAIN
*     THE NAME OF THE WANTED PP PROGRAM. WE CALL CPC4 TO END
*     ANY PREVIOUS ACTION AND PROCESS THE RESPONSE, AND THEN
*     GO TO CPC3107 TO ISSUE THE NEW REQUEST. THIS BY-
*     PASSES VARIOUS TESTS, BUT APART FROM WASTING TIME THE ONLY
*     HARM IT CAN DO IS IF BITS 42-59 DO NOT IN FACT CONTAIN
*     A VALID PP PROGRAM NAME, OR IF THEY CONTAIN ((CIO)), THE
*     REQUEST IS FOR A READ, AND THE STATUS OF THE FILE AFTER 
*     CPC312 IS EOR OR EOF. IN THAT CASE CPC DOES NOT REFUSE TO READ
*     THROUGH AN END OF RECORD AS IT DOES BELOW CPC325. BUT THIS
*     CAN ONLY HAPPEN IF THE CALLER IS NOT USING THE NORMAL ((READ))
*     MACRO, AND PRESUMABLY HE IS IN CONTROL OF THE SITUATION.
          SPACE    1
 CPC312   RJ       CPC4       PROCESS RESPONSE
          EQ       CPC3107
          EJECT  5,10                                                   01251085
          EJECT  5,6                                                    0125 691
**    SUBROUTINE CPC5 FORMATS AND ISSUES A REQUEST FOR FILE ACTION. 
*     ON ENTRY, B7 POINTS TO A WORD CONTAINING THE WANTED PP
*     PROGRAM NAME.  THIS IS EITHER THE REQUEST WORD ITSELF, OR 
*     PP NAME, CIO IN TABLE CPC319. 
          SPACE    1
**    ENTRY INFORMATION - POINTER TO PP PROGRAM IN B7,
*     ADDRESS OF REQUEST WORD IN A2, ADDRESS OF FET IN B2.
*     EXIT INFORMATION - NONE.
*     SUBROUTINE CALLED - CPC01.
          SPACE    1
 CPC5     DATA     0               ISSUE MAIN CIO REQUEST 
          SA2      A2 
          MX0      42 
          SX3      B1+B1
          BX0      X0+X3
          BX3      -X0*X2     OP CODE 
          SA4      B2 
          BX4      X0*X4           FILE NAME
          BX6      X4+X3
          SA6      A4              PUT NEW OPCODE IN FET
          SX6      B1 
          LX6      40 
          BX6      X6*X2           RECALL BIT 
          MX4      18 
          LX4      36 
          BX4      X4*X2   RECORD COUNT IF ANY
          BX6      X4+X6
          SX2      B2              FET ADDRESS
          BX2      X6+X2
          SA4      B7              GET PP PROGRAM NAME
          MX6      18 
          BX6      X4*X6
          BX2      X2+X6
          RJ       CPC01      ISSUE 
          EQ       CPC5 
          EJECT  5,28                                                   01251087
          EJECT  5,30                                                   0125 693
**    SUBROUTINE CPC4 WAITS UNTIL THE FET SHOWS NON-BUSY STATUS,
*     AND THEN PROCESSES THE RESPONSE IN BITS 9-13 OF THE FIRST 
*     WORD OF THE FET. IF THIS FIELD IS NON-ZERO, THE WHOLE WORD IS PUT 
*     INTO CPC49, WHICH WILL BE FOUND IN X1 ON EXIT FROM CPC. 
*     NORMALLY THIS WORD IS ZERO. 
*     IF THERE ARE BITS FOR ERROR, AND THERE IS AN OWNCODE ADDRESS
*     FOR ERROR IN THE FET, THE EXIT ADDRESS FROM CPC IS STORED 
*     AT THAT ADDRESS, THE ERROR FLAGS ARE DELETED FROM THE FIRST 
*     WORD OF THE FET, AND WE GO THROUGH CPC0 SO AS TO RESTORE
*     REGISTERS, PICK UP CPC49 IN X1, AND THEN BRANCH TO THE SECOND 
*     WORD OF THE OWNCODE ROUTINE. IF THERE IS NO OWNCODE 
*     ADDRESS FOR ERROR, WE MERELY LEAVE THE ERROR BITS IN THE FIRST
*     WORD OF THE FET. BUT NOTE THAT IF THIS ENTRY TO CPC4 PRECEDES 
*     THE REAL ACTION WANTED BY THE CALLER ON THIS OCCASION OF
*     CALLING CPC, THE ERROR BITS WILL BE ZEROED WHEN THE REAL ACTION 
*     IS SET UP, AND IF THE CALLER HAS NOT ALREADY NOTED THEM HE
*     WILL NEVER SEE THEM.
*     SIMILARLY FOR EOI FLAG AND ITS OWNCODE ADDRESS. 
*     IN CASE OF BOTH ERROR AND EOI FLAGS --
*     1. IF THERE IS AN OWNCODE ADDRESS FOR ERROR, WE PROCEED AS FOR
*     ERROR FLAGS. THE ERROR FLAGS BUT NOT THE EOI FLAGS ARE REMOVED
*     FROM THE FIRST WORD OF THE FET. 
*     2. IF THERE IS AN OWNCODE FOR EOI BUT NOT FOR ERROR, WE 
*     PROCEED AS FOR EOI, REMOVING THE EOI BUT NOT THE ERROR FLAGS
*     FROM THE FIRST WORD OF THE FET. 
*     3. IF THERE IS NEITHER OWNCODE ADDRESS, THERE IS NOTHING
*     SPECIAL TO BE DONE ANYWAY.
          SPACE    2
 CPC4     DATA     0          PROCESS RESPONSE
          RJ       CPC02      WAIT
          LX1      52  CONTAINS 1ST WD OF FET AFTER LX1 59
          MX0      55 
          BX0      -X0*X1          EXTRACT BITS 9-13
          ZR       X0,CPC4         NO ERROR OR EOI FLAGS
          SA1      B2 
          BX6      X1 
          SA6      CPC49   SAVE (FET+0) IF ANY FLAGS
          SA1      B2+B1
          LX1      36 
          AX1      54 
          SX6      X1-4            LENGTH OF FET-9
          NG       X6,CPC4         NO OWNCODE 
          SA1      B2+8            OWNCODE WORD 
          BX6      X1 
          LX6      30 
          SX1      X1              NOW =ERROR ADDRESS 
          SX6      X6              NOW = EOI ADDRESS
          SX2      37000B  MASK IF ERROR ONLY 
          SX0      X0-20B 
          PL       X0,CPC41        ERROR ONLY 
          SX0      X0+14B 
          NG       X0,CPC42   EOI ONLY
          SX2      34000B          ERROR, MAYBE ALSO EOI
          NZ       X1,CPC411       ERROR OWNCODE PRESENT
          ZR       X6,CPC4         NO OWNCODE AT ALL
          SX1      X6              EOI OWNCODE ADDR 
          MX6      58 
          SX0      X0+4            RESTORE FLAG BITS IN X0
          BX6      -X6*X0 
          ZR       X6,CPC4         NO EOI FLAG
          EQ       CPC421   ALL SET FOR EOI OWNCODE 
 CPC42    ZR       X6,CPC4   EOI ONLY, BUT NO EOI OWNCODE 
          SX1      X6 
 CPC421   SX2      3000B           MASK FOR EOI FLAGS 
          EQ       CPC411 
 CPC41    ZR       X1,CPC4   ERROR ONLY, NO ERROR OWNCODE 
 CPC411   SX0      X1 
          SA1      B2 
          BX6      -X2*X1 
          SA6      A1     DELETE ERROR FLAGS IN FET IF OWNCODE
          SX6      B1 
          LX6      26 
          BX6      X6+X0
          SX1      B1 
          IX6      X6+X1
          LX6      30 
          SA1      CPC
          SA6      A1              PUT BRANCH TO OWN CODE IN CPC
          BX6      X1 
          SA6      X0              MOVE EXIT FROM CPC TO OWNCODE
          EQ       CPC0     STRAIGHT OUT CPC
          EJECT  5,5                                                    01251089
          EJECT  5,6                                                    0125 695
**    CPC49 IS PRESET TO ZERO WHEN CPC IS ENTERED. THE FIRST WORD 
*     OF THE FET IS STORED IN IT WHENEVER A FILE IS CHECKED 
*     IN SUBROUTINE CPC4 AND HAS BITS IN FIELD 9-13. IT IS IN X1 ON 
*     EXIT FROM CPC.
          SPACE    2
 CPC49    DATA     0
          SPACE    2
**    SUBROUTINE CPC999 IS USED TO ISSUE A DAYFILE MESSAGE AND ABORT. 
*     THE CALLING SEQUENCE IS  +   RJ  CPC999 
*                              -   JP  *+N+1
*                                  DIS N,.......... 
*     THAT IS, THE MESSAGE IS N WORDS LONG AND THE ADDRESS AFTER JP 
*     POINTS TO THE WORD AFTER THE END OF THE MESSAGE. THIS WORD
*     IS ZEROES, IN ORDER TO MAKE A TERMINATION FOR THE MESSAGE,
*     BUT PRESUMABLY IT DOES NOT MATTER AS WE ARE ABOUT TO ABORT
*     ANYWAY
          SPACE    2
 CPC999   DATA     0               DAYFILE MESSAGE AND ABORT
          SA1      CPC999 
          LX1      30 
          SX1      X1 
          SX2      152307B
          LX2      42 
          BX2      X2+X1
          SA1      X1-1 
          SX6      B0 
          SA6      X1 
          RJ       CPC01
          SX2      010224B
          LX2      42 
          RJ       CPC01
          PS
*        END OF CPCOM 
