COMPAPI 
COMMON
          CTEXT  COMPAPI - *APP* INTERFACE. 
 API      SPACE  4,10 
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   COMPAPI
 QUAL$    ENDIF 
*         COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
          BASE   MIXED
 API      SPACE  4,10 
***       API -  *APP* INTERFACE. 
*         P. T. BARNETT      84/01/01.
*         R. M. DANISCH      84/03/25.
 API      SPACE  4,50 
***       *API* IS THE SOLE INTERFACE TO PP PROGRAM *APP* THAT IS 
*         INITIALIZED AND ACTIVATED BY *CTI* AT DEADSTART.  THERE 
*         ARE SEVERAL SECTIONS IN THIS DECK, WHICH ARE ASSEMBLED
*         ACCORDING TO THE DEFINITION OF THE FOLLOWING SYMBOLS: 
* 
*         API$ - THE STANDARD *APP* REQUEST PROCESSOR.  THIS
*                IS USED FOR DATA RETRIEVAL FUNCTIONS.
* 
*         CDA$ - THE COMMON DISK AREA REQUEST PROCESSOR.  THIS ONE
*                IS USED FOR RETRIEVAL OF DATA FROM THE COMMON DISK 
*                AREA, SUCH AS CONTROLWARE, MICROCODE, ETC. 
* 
*         APM$ - THE *APP* MANAGEMENT PROCESSOR.  THIS IS USED
*                FOR MANIPULATION OF *APP*, AND IS NOT FOR
*                RETRIEVING DATA OF ANY KIND (FUNCTIONS 21B, 76B, 77B). 
* 
*         PRS$ - THE COMMON DECK PRESET PROCESSOR.  THIS ONLY PRESETS 
*                THE CHANNEL NUMBER IN ALL OF THE CHANNEL INSTRUCTIONS, 
*                AND CAN BE DONE INDEPENDENTLY. 
* 
*         EACH SECTION IS INDEPENDENT OF THE OTHERS, AND ONLY THE 
*         ONE(S) REQUIRED IN A PARTICULAR DECK NEED BE SELECTED.
* 
*         THE ENTRY POINT FOR EACH ROUTINE IS THE SAME AS THE SYMBOL
*         FOR SELECTING ASSEMBLY OF IT, WITH THE DOLLAR SIGN ($)
*         TRUNCATED FROM IT.  AN UNQUALIFIED FORM OF *PRS* WILL NOT BE
*         GENERATED IF *QUAL$* IS DEFINED.
* 
*         *COMPCHM* (WHICH REDEFINES THE CHANNEL INSTRUCTIONS) MUST BE
*         INCLUDED WITH THIS COMMON DECK IF *PRS$* IS SELECTED.  IF 
*         *PRS$* IS NOT DEFINED, THEN ANY METHOD OF SELECTING THE 
*         PROPER CHANNEL MAY BE USED, INCLUDING DEFINITION OF 
*         THE SYMBOL *AC* (THE *APP* COMMUNICATIONS CHANNEL). 
* 
*         *COMSDSL* AND *COMSPIM* ARE ALSO REQUIRED.
  
  
 APCL     EQU    2           *APP* COMMAND DATA LENGTH
 API      SPACE  4,10 
**        THE FOLLOWING DEFINES *AC* TO BE ZERO (SO THAT */COMPAPI/PRS* 
*         WILL WORK PROPERLY) IF IT HAS NOT BEEN PREVIOUSLY DEFINED.
*         THE USER OF THIS COMMON DECK CAN PREDEFINE THE ALTERNATE
*         PP COMMUNICATIONS CHANNEL TO A PARTICULAR VALUE WITHOUT FEAR
*         OF IT BEING RESET.
  
  
 .A       IF     -DEF,AC
  
 AC       EQU    0           *APP* COMMUNICATIONS CHANNEL 
  
 .A       ENDIF 
 EXCSI    SPACE  4,15 
**        EXCSI - EXECUTE CHANNEL STATUS INSTRUCTION. 
* 
*         THIS MACRO IS USED TO EXECUTE ALL CHANNEL STATUS
*         INSTRUCTIONS (AJM, IJM, EJM, FJM).  IT PROVIDES THE TIMEOUT 
*         MECHANISM NEEDED TO AVOID HANGING THE NOS PP DUE TO *APP* 
*         COMMUNICATION PROBLEMS. 
* 
*         EXCSI  INSTR,ERRAD
* 
*         ENTRY  INSTR = INSTRUCTION (AJM, IJM, EJM, FJM).
*                ERRAD = TRANSFER ADDRESS IN CASE OF TIMEOUT. 
  
  
          PURGMAC  EXCSI
  
 EXCSI    MACRO  INSTR,ERRAD
  MACREF EXCSI
.1 SET 0
.A ECHO ,TB=(AJM,EJM,FJM,IJM) 
.B IFC EQ,$TB$INSTR$
.1 SET 1
  STOPDUP 
.B ENDIF
.A ENDD 
.A IFEQ .1,1
  LDC INSTR_I 
  RJM ECI 
  MJP ERRAD 
.A ELSE 
  ERR INCORRECT INSTRUCTION TYPE - INSTR
.A ENDIF
 EXCSI    ENDM
 API      SPACE  4,25 
**        API -  *APP* DATA REQUEST PROCESSOR.
* 
*         ENTRY  (A) = 6/ FCN, 12/ ADDR 
*                FCN = FUNCTION CODE. 
*                ADDR = ADDRESS OF BUFFER TO RECEIVE DATA.
* 
*         THE FUNCTION CODES ARE DEFINED IN *COMSDSL*.  IF FUNCTION 
*         12B (CPDS) IS SPECIFIED, THEN THE NUMBER OF THE PROCESSOR 
*         FOR WHICH THE DESCRIPTOR IS BEING REQUESTED MUST BE IN
*         THE FIRST BYTE OF THE BUFFER SPECIFIED BY *ADDR*. 
* 
*         EXIT   (A) = 0  IF REQUEST COMPLETED SUCCESSFULLY.
*                (A) = 1/1, 5/0, 12/MESSAGE ADDRESS   IF *APP*
*                      NOT RESPONDING.
*                (ADDR) = WORD COUNT OF DATA TO FOLLOW. 
*                (ADDR+APDL - ADDR+N) = DATA. 
* 
*         IF THE WORD COUNT IS ZERO, THEN THERE WAS NO DATA RETURNED. 
* 
*         USES   T3.
* 
*         CALLS  CAI, WAR.
* 
*         MACROS EXCSI. 
  
  
 .B       IF     DEF,API$ 
  
 API2     LDC    CAIA+400000  SET *APP* NOT RESPONDING
  
 API      SUBR               ENTRY/EXIT 
          STD    T3 
          ADK    APDL        DATA OFFSET
          STM    APIA 
          RJM    CAI         COMMON *APP* INITIALIZATION
          MJN    APIX        IF *APP* NOT RESPONDING
          LDD    T2          FUNCTION CODE
          LMK    CPDS 
          NJN    API1        IF NOT PROCESSOR DESCRIPTOR REQUEST
          LDI    T3          GET PROCESSOR NUMBER 
          OAN    AC 
 API1     EXCSI  FJM,API2    WAIT FOR CHANNEL EMPTY 
          DCN    AC          DEACTIVATE CHANNEL 
          RJM    WAR         WAIT FOR *APP* RESPONSE
          MJN    APIX        IF *APP* NOT RESPONDING
          IAN    AC          INPUT DATA LENGTH
          STI    T3          STORE LENGTH OF SUBSEQUENT DATA
          ZJN    APIX        IF NO DATA 
          IAM    **,AC       INPUT DATA 
 APIA     EQU    *-1         DATA BUFFER ADDRESS + APDL 
          NJN    API2        IF PREMATURE TERMINATION 
          UJN    APIX        RETURN 
  
 .B       ENDIF 
 CDA      SPACE  4,30 
**        CDA -  COMMON DISK AREA REQUEST PROCESSOR.
* 
*         ENTRY  (A) = 6/ FCN, 18/ ADDR 
*                FCN    = FUNCTION CODE (20B).
*                ADDR   = ADDRESS OF BUFFER TO RECEIVE DATA.
*                (ADDR) = 18/ NAME, 6/0 
*                NAME   = 3 CHARACTER (DISPLAY CODE) NAME 
*                         OF DATA TO RETURN.
* 
*         EXIT   (A) = 0  IF REQUEST COMPLETED SUCCESSFULLY.
*                (A) = 1/0, 5/EC, 12/MESSAGE ADDRESS   IF *APP* 
*                      RETURNED ERROR.
*                      EC = 1  IF REQUEST NOT FOUND.
*                           2  IF DISK STATUS ERROR.
*                           3  IF COMMON DISK AREA ERROR. 
*                (A) = 1/1, 5/0, 12/MESSAGE ADDRESS   IF *APP*
*                      NOT RESPONDING.
*                (ADDR) = STATUS: 
*                         4XXX - IF LAST PORTION OF REQUEST.
*                                XXX = REMAINING WORD COUNT.
*                         0XXX - ERROR STATUS OR FULL SECTOR. 
*                                XXX = 500  IF FULL SECTOR. 
*                                    = 1  IF REQUEST NOT FOUND. 
*                                    = 2  DISK STATUS ERROR.
*                                    (GENERAL STATUS IN (ADDR+APDL))
*                                    = 3  IF NO COMMON DISK AREA. 
*                (ADDR+APDL - ADDR+N) = REQUESTED DATA. 
* 
*         THE 7700 TABLE WILL BE TRANSMITTED WITH THE REQUEST.
* 
*         CALLS  CAI, WAR.
* 
*         USES   T1.
* 
*         MACROS EXCSI. 
  
  
 .C       IF     DEF,CDA$ 
  
 CDA8     LDC    CAIA+400000 SET *APP* NOT RESPONDING 
  
 CDA      SUBR               ENTRY/EXIT 
          STM    CDAA        DATA BUFFER ADDRESS
          STM    CDAB 
          ADK    APDL        ADD DATA OFFSET
          STM    CDAC 
          STM    CDAD 
          RJM    CAI         ISSUE *APP* FUNCTION 
          MJN    CDAX        IF *APP* NOT RESPONDING
          LDK    CPNL        LENGTH OF NAME 
          OAM    **,AC       OUTPUT DATA NAME 
 CDAA     EQU    *-1         DATA BUFFER ADDRESS
 CDA1     NJN    CDA8        IF PREMATURE TERMINATION 
          STM    CDAE 
          EXCSI  FJM,CDA8    WAIT FOR CHANNEL EMPTY 
          DCN    AC          DEACTIVATE CHANNEL 
          RJM    WAR         WAIT *APP* RESPONSE
          MJN    CDAX        IF *APP* NOT RESPONDING
          IAN    AC          INPUT STATUS WORD
          STM    **          STORE IN DATA BUFFER 
 CDAB     EQU    *-1         DATA BUFFER ADDRESS
          LPC    4777 
          STD    T1 
          SHN    21-13
          MJN    CDA4        IF LAST PORTION OF REQUESTED DATA
          SHN    13-21+22 
          LMC    500
          NJN    CDA7        IF ERROR 
          LDD    T1 
          IAM    **,AC
 CDAC     EQU    *-1
 CDA2     NJN    CDA1        IF PREMATURE TERMINATION 
 CDA3     LJM    CDAX        RETURN 
  
 CDA4     SHN    1
          SHN    -7 
          ZJN    CDA6        IF NO DATA 
 CDA5     IAM    **,AC
 CDAD     EQU    *-1
          NJN    CDA2        IF PREMATURE TERMINATION 
 CDA6     DCN    AC 
          LDC    **          SET EXIT STATUS
 CDAE     EQU    *-1
          UJN    CDA3        RETURN 
  
 CDA7     LDM    TEMS-1,T1   SET MESSAGE ADDRESS
          STM    CDAE 
          LDD    T1          SET ERROR CODE 
          RAM    CDAE-1 
          LDD    T1 
          LMK    APDE 
          NJN    CDA6        IF NOT DISK STATUS ERROR 
          LDN    1           LENGTH OF GENERAL STATUS 
          UJN    CDA5        INPUT GENERAL STATUS 
  
*         ERROR MESSAGES. 
  
 CDAF     DATA   C* APP REQUEST NOT FOUND.* 
 CDAG     DATA   C* APP DISK STATUS ERROR.* 
 CDAH     DATA   C* APP CDA ERROR.* 
  
*         TABLE OF MESSAGE ADDRESSES. 
  
 TEMS     BSS    0
          LOC    1
          CON    CDAF 
          CON    CDAG 
          CON    CDAH 
          LOC    *O 
 .C       ENDIF 
 APM      SPACE  4,20 
**        APM -  *APP* MANAGEMENT PROCESSOR.
* 
*         ENTRY  (A) = 6/ FCN, 12/ PARM 
*                FCN = FUNCTION CODE (21B, 76B, 77B). 
*                PARM = CM ADDRESS TO MONITOR (FCN = 21B),
*                    = CHANNEL TO CHANGE TO  (FCN = 76B), OR
*                    = PP TO CHANGE TO       (FCN = 77B). 
* 
*         EXIT   (A) = 0  IF REQUEST COMPLETED SUCCESSFULLY.
*                (A) = 1/1, 5/0, 12/MESSAGE ADDRESS   IF *APP*
*                      NOT RESPONDING.
* 
*         CALLS  CAI. 
* 
*         NOTE - IT IS THE RESPONSIBILITY OF THE CALLER TO CALL 
*                */COMPAPI/PRS* AGAIN TO PRESET THE NEW CHANNEL 
*                NUMBER AFTER USING FUNCTIONS 76B OR 77B. 
* 
*         MACROS EXCSI. 
  
  
 .D       IF     DEF,APM$ 
  
 APM5     LDC    CAIA+400000 SET *APP* NOT RESPONDING 
  
 APM      SUBR               ENTRY/EXIT 
          STM    APMA        SAVE PARAMETER 
          RJM    CAI         ISSUE *APP* FUNCTION 
          MJN    APMX        IF *APP* NOT RESPONDING
          LDC    ** 
 APMA     EQU    *-1         ARGUMENT 
          OAN    AC 
 APMB     EQU    *-1         OLD CHANNEL/PP 
          EXCSI  FJM,APM5    WAIT FOR CHANNEL EMPTY 
          DCN    AC          DEACTIVATE CHANNEL 
          LDD    T2          FUNCTION CODE
          LMK    RPCS 
 APM1     ZJN    APMX        IF REMOVING PP FROM CHANNEL
          LMK    MAPS&RPCS
          NJN    APM3        IF NOT MOVING *APP*
          LDM    APMB        OLD CHANNEL/PP 
          LPN    37 
          UJN    APM4        WAIT *APP* RESPONSE
  
 APM2     UJN    APM5        SET *APP* NOT RESPONDING 
  
 APM3     LDM    APMA        NEW CHANNEL/PP 
 APM4     LMK    IJMI 
          OAN    AC          CAUSE PLUG OF ORIGINAL CHANNEL 
          ORG    *-1
          LMN    ** 
          STM    APMC+1 
          ADK    FJMI-IJMI
          STM    APMD+1 
 APMC     EXCSI  IJM,APM2 
 APMD     EXCSI  FJM,APM2 
          LDN    0           SET EXIT CONDITION 
          UJN    APM1        RETURN 
  
 .D       ENDIF 
 CAI      SPACE  4,20 
**        CAI - ISSUE *APP* FUNCTION. 
* 
*         ENTRY  (A) = 6/ FUNCTION CODE, 12/
* 
*         EXIT   (A) = 0  IF INITIALIZATION COMPLETE. 
*                (A) = 1/1, 5/0, 12/MESSAGE ADDRESS   IF *APP*
*                      NOT RESPONDING.
*                (T2) = *APP* FUNCTION CODE.
* 
*         USES   T1, T2.
* 
*         MACROS EXCSI. 
  
  
 CAI1     LDC    CAIA+400000 SET *APP* NOT RESPONDING 
          UJN    CAIX        RETURN 
  
 CAI      SUBR               ENTRY/EXIT 
          SHN    -14         POSITION TO FUNCTION CODE
          STD    T2 
          LDK    APXA 
          STD    T1 
          EXCSI  IJM,CAI1    WAIT FOR CHANNEL ACTIVE
          EXCSI  FJM,CAI1    WAIT FOR CHANNEL EMPTY 
          LDK    APCL        *APP* COMMAND LENGTH 
          OAM    T1,AC       OUTPUT COMMAND DATA
          ZJN    CAIX        IF NOT PREMATURE TERMINATION 
          UJN    CAI1        SET ERROR CONDITION
  
 CAIA     DATA   C* APP TIMEOUT.* 
 ECI      SPACE  4,10 
**        ECI - EXECUTE CHANNEL STATUS INSTRUCTION. 
* 
*         THIS ROUTINE IS USED TO EXECUTE ALL IJM, AJM, EJM, AND FJM
*         INSTRUCTIONS. 
* 
*         ENTRY  (A) = INSTRUCTION (INCLUDING CHANNEL). 
* 
*         EXIT   (A) .LT. 0  IF TIMEOUT.
* 
*         USES   T0.
* 
*         NOTE   THE TIMEOUT LENGTH MAY BE CHANGED TO A GIVEN 
*                NUMBER OF MICROSECONDS BY USING 4 MULTIPLIED BY
*                THE SQUARE ROOT OF THAT NUMBER AS THE LOOP 
*                COUNTER AT *ECIC*. 
  
  
 ECI      SUBR               ENTRY/EXIT 
          OAN    AC          GENERATE CHANNEL TABLE ENTRY 
          ORG    *-1
          LMN    **          PLACE CHANNEL NUMBER IN INSTRUCTION
          STM    ECIB 
          LDM    DLYA 
          LPN    77 
          SHN    -2 
          LMK    SBNI 
          STM    ECIA 
          LDM    ECIC 
          STD    T0 
 ECI1     SOD    T0 
          MJN    ECIX        IF TIMEOUT 
 ECIA     SBN    ** 
          PJN    *-1         IF DELAY NOT DONE
 ECIB     CON    AC          INSTRUCTION
          CON    ECI1 
          LDN    0           SET EXIT CONDITION 
          UJN    ECIX        RETURN 
  
 ECIC     CON    4*1000D
 WAR      SPACE  4,15 
**        WAR -  WAIT FOR *APP* RESPONSE. 
* 
*         EXIT   (A) = 0  IF *APP* RESPONDED. 
*                (A) = 1/1, 5/0, 12/MESSAGE ADDRESS   IF *APP*
*                      NOT RESPONDING.
  
  
 WAR1     LDC    CAIA+400000  SET *APP* NOT RESPONDING
  
 WAR      SUBR               ENTRY/EXIT 
          EXCSI  IJM,WAR1    WAIT FOR CHANNEL ACTIVE
          EXCSI  EJM,WAR1    WAIT FOR CHANNEL FULL
          LDN    0           SET RESPONSE RECEIVED
          UJN    WARX        RETURN 
 API      SPACE  4,10 
 .OVL     EQU    *           OVERLAY FWA
 PRS      SPACE  4,10 
**        PRS -  *COMPAPI* PRESET ROUTINE.
* 
*         ENTRY  (A) = COMMUNICATIONS CHANNEL NUMBER. 
* 
*         USES   T0, T1, T2.
  
  
 .E       IF     DEF,PRS$ 
  
 PRS1     STD    T2          INSTRUCTION ADDRESS
          LDI    T2          INSTRUCTION
          SCN    37          CLEAR CHANNEL FIELD
          LMD    T0          INSERT CHANNEL NUMBER
          STI    T2          UPDATE INSTRUCTION 
          AOD    T1          INCREMENT TABLE ADDRESS
 PRS2     LDI    T1          INSTRUCTION ADDRESS
          NJN    PRS1        IF NOT END OF TABLE
  
 PRS      SUBR               ENTRY/EXIT 
          STD    T0          CHANNEL NUMBER 
          LDK    CTAC        INSTRUCTION ADDRESS TABLE
          STD    T1 
          UJN    PRS2        ENTER LOOP 
  
  
          CHTB   AC          GENERATE INSTRUCTION ADDRESS TABLE 
  
 .E       ENDIF 
 API      SPACE  4,10 
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 .F       IF     DEF,API$ 
 API      EQU    /COMPAPI/API 
 .F       ENDIF 
 .G       IF     DEF,CDA$ 
 CDA      EQU    /COMPAPI/CDA 
 .G       ENDIF 
 .H       IF     DEF,APM$ 
 APM      EQU    /COMPAPI/APM 
 .H       ENDIF 
 QUAL$    ENDIF 
          BASE   *
          ENDX
