          CTEXT  COMPTMA - TWO-PORT MULTIPLEXOR ACCESS.
          SPACE  4
QUAL$     IF     -DEF,QUAL$
          QUAL   COMPTMA
QUAL$     ENDIF
          BASE   M
*         COMMENT COPYRIGHT CONTROL DATA SYSTEMS INC. 1992
          SPACE  4
***       COMPTMA - TWO-PORT MULTIPLEXOR ACCESS.
*         B. R. HANSON
          SPACE  4
***              COMPTMA DEFINES ROUTINES TO TALK WITH A TERMINAL
*         ON THE TWO PORT MULTIPLEXOR.  THESE ROUTINES OBSERVE THE
*         PROTOCOL FOR ACCESSING A PORT ON THE MULTIPLEXOR AND FOR
*         TALKING WITH THAT PORT.  THIS PROTOCOL PROVIDES FOR SHARING
*         THE PORT AND THE MULTIPLEXOR BETWEEN PP PROGRAMS AND
*         OPERATING SYSTEMS.
*
*         THE PROTOCOL FOR ACCESSING A TERMINAL ON THE TWO PORT MUX
*         IS AS FOLLOWS.
*
*         THE IOU TEST-MODE REGISTER (A0) CONTAINS SIX BITS RESERVED
*         FOR SOFTWARE USE - BITS 58-63.  THEY ARE DEFINED AS
*                58 - NOT USED.
*                59 - NOT USED.
*                60 - PORT 1 REQUESTED.
*                61 - PORT 0 REQUESTED.
*                62 - PORT 1 RESERVED.
*                63 - PORT 0 RESERVED.
*
*         WHEN A PP PROGRAM WANTS TO USE A PORT ON THE TWO PORT MUX,
*         IT MUST SET THE *RESERVED* BIT IN THE TEST-MODE REGISTER.  IF
*         THAT BIT IS ALREADY SET, IT MAY SET THE *REQUESTED* BIT IN
*         THE REGISTER AND WAIT FOR THE OTHER PP TO RELEASE THE PORT
*         BY CLEARING THE *RESERVED* BIT.
*
*         THE SHARING OF THE TWO-PORT MULTIPLEXOR BETWEEN TWO PP-S
*         TALKING TO SEPERATE PORTS ON THE MULTIPLEXOR IS THROUGH
*         THE CHANNEL 15 AND 17 FLAGS.  SINCE THE *SCF* INSTRUCTION
*         FOR CHANNEL 15 DOES NOT GUARANTEE EXCLUSIVE ACCESS TO THE
*         CHANNEL, THE CHANNEL FLAG FOR CHANNEL 17 MUST BE USED TO
*         ENSURE THIS CONDITION.  THE SEQUENCE OF ACCESS TO CHANNEL
*         15 SHOULD BE -
*
*         SCF 17             INTERLOCK CHANNEL 17
*         SCF 15             INTERLOCK CHANNEL 15
*         CCF 17             CLEAR INTERLOCK ON 17
*         SELECT PORT
*         STATUS PORT
*         PERFORM IO OPERATION
*         DESELECT PORT
*         CCF 15             CLEAR INTERLOCK ON 15
*
*         THE FUNCTIONS PROVIDED BY THIS COMMON DECK ARE -
*           *STM* - SELECT TERMINAL ON MULTIPLEXOR.  GAINS ACCESS TO
*                A SPECIFIC PORT ON THE MULTIPLEXOR.
*           *CPR* - CHECK FOR PORT REQUEST.  CHECKS THE TEST-MODE REG
*                FOR REQUESTS FOR ACCESS TO THE PORT BEING USED.
*           *RCT* - READ CHARACTER FROM TERMINAL.  DOES THE OPERATIONS
*                NEEDED TO READ A CHARACTER FROM THE TERMINAL ON THE
*                PORT BEING USED.
*           *WCT* - WRITE CHARACTER TO TERMINAL.  DOES THE OPERATIONS
*                NEEDED TO WRITE A CHARACTER TO THE TERMINAL CONNECTED
*                TO THE PORT BEING USED.
*           *GTS* - GET TERMINAL STATUS.  GETS JUST THE STATUS INFO
*                FOR THE PORT BEING USED.
          SPACE  4,10
          PURGMAC DCN*
 DCN*     PPOP   4,7500      DEFINE *DCN**
          SPACE  4
**        GLOBAL DATA FOR ALL ROUTINES.
*


 RBUF     BSSZ   10          MAINTENANCE REGISTER BUFFER
 SFMX     CON    0           PORT SELECT FUNCTION
 SSMX     CON    0           LAST TERMINAL STATUS
 CPA      SPACE  4
**        CPA - CLEAR PORT ACCESS.
*
*         ENTRY  TWO-PORT MUX IS RESERVED BY THIS PP.
*
*         EXIT   TWO-PORT MUX IS DESELECTED AND CHANNEL IS RELEASED.


 CPA      SUBR               ENTRY/EXIT
          FNC    MXDM,MX     DESELECT MULTIPLEXOR
          AJM    *,MX        WAIT FOR FUNCTION COMPLETE
          CCF    *,MX        RELEASE CHANNEL INTERLOCK
          UJN    CPAX        RETURN
 CPR      SPACE  4,10
**        CPR - CHECK FOR PORT REQUEST.
*
*         ENTRY  PORT RESERVED BY THIS PP.
*
*         EXIT   (A) = 0, IF NO REQUEST FOR THIS PORT
*
*         CALLS  RSB.


 CPR      SUBR               ENTRY/EXIT
          RJM    RSB         READ STATUS BITS
          SHN    -2          IGNORE PORT RESERVED BIT
          UJN    CPRX        RETURN
 DLY      SPACE  4,10
**        DLY - DELAY FOR .05 OF A SECOND.
*
*         ENTRY  NONE.
*
*         EXIT   0.05 SECONDS LATER.
*
*         USES   A.


 DLY      SUBR               ENTRY/EXIT
          LDC    100000
 DLY1     SBN    1
          PJN    DLY1        IF DELAY NOT EXPIRED
          UJN    DLYX        RETURN
 GTS      SPACE  4,10
**        GTS - GET TERMINAL STATUS.
*
*         ENTRY  NONE.
*
*         EXIT   (A) = STATUS OF TERMINAL.
*
*         CALLS  CPA, SPA.


 GTS      SUBR               ENTRY/EXIT
          RJM    SPA         SET PORT ACCESS
          RJM    CPA         CLEAR PORT ACCESS
          UJN    GTSX        RETURN
 RCT      SPACE  4,10
**        RCT - READ CHARACTER FROM TERMINAL.
*
*         ENTRY  PORT RESERVED BY THIS PP.
*
*         EXIT   (A) = CHARACTER DESIRED.
*                (A) = 0, IF NO CHARACTER PRESENT.
*
*         CALLS  CPA, SPA, WCT.


 RCT1     FNC    MXRD,MX     READ CHARACTER FUNCTION
          AJM    *,MX        WAIT FOR FUNCTION COMPLETE
          ACN    MX
          IAN    MX
          DCN*   MX
          RJM    CPA         CLEAR PORT ACCESS

 RCT      SUBR               ENTRY/EXIT
          RJM    SPA         START PORT ACCESS
          SHN    21-3
          MJN    RCT1        IF CHARACTER PRESENT
          RJM    CPA         CLEAR PORT ACCESS
          LDN    0
          UJN    RCTX        RETURN WITH NO CHARACTER
 RSB      SPACE  4,10
**        RSB - READ STATUS BITS.
*
*         ENTRY  (RSBA) = SET BASED ON PORT BEING USED.
*
*         EXIT   (A) = 1/REQUESTED, 1/0, 1/RESERVED.
*
*         USES   (RBUF - RBUF+7).
*
*         MACROS READMR.


 RSB      SUBR               ENTRY/EXIT
          READMR RBUF,ELIO,ITMR
          LDM    RBUF+7      FETCH BITS 59-63
 RSBA     SHN    0           (IF PORT 0 BEING USED)
*         SHN    -1          (IF PORT 1 BEING USED)
          LPN    5
          UJN    RSBX        RETURN
 RTM      SPACE  4,10
**        RTM - RELEASE TERMINAL ON MULTIPLEXOR.
*
*         ENTRY  THIS TERMINAL HAS ACCESS TO THE TERMINAL.
*
*         EXIT   THE FLAGS IN THE TEST MODE REGISTER RESET.
*
*         USES   SFMX.
*
*         CALLS  RSB, USB.
*
*         MACROS LOCKMR.


 RTM      SUBR               ENTRY/EXIT
          LOCKMR SET
          RJM    RSB         READ STATUS BITS
          LDC    5S12+0
          RJM    USB         CLEAR STATUS BITS
          LOCKMR CLEAR
          LDN    0
          STM    SFMX        CLEAR ACCESS CODE
          UJN    RTMX        RETURN
 SPA      SPACE  4,10
**        SPA - START PORT ACCESS.
*
*         ENTRY  PORT RESERVED BY PP.
*                (SFMX) = FUNCTION CODE TO SELECT PORT.
*
*         EXIT   PORT ACCESS OBTAINED.


 SPA      SUBR               ENTRY/EXIT

 SPA1     LDM    SFMX        FETCH PORT SELECT FUNCTION
          ZJN    SPAX        IF NO PORT DEFINED
          SCF    SPA3,MR     GET ACCESS TO MAINTENANCE CHANNEL
          SCF    SPA2,MX     GET ACCESS TO TWO-PORT MULTIPLEXOR
          CCF    *,MR
          FAN    MX          SELECT PORT
          AJM    *,MX        WAIT FOR FUNCTION COMPLETE
          FNC    MXSS,MX     FETCH PORT STATUS
          AJM    *,MX        WAIT FOR FUNCTION COMPLETE
          ACN    MX
          IAN    MX
          DCN*   MX
          STM    SSMX        SAVE TERMINAL STATUS
          UJN    SPAX        RETURN

 SPA2     CCF    *,MR        CLEAR MAINTENANCE CHANNEL INTERLOCK
 SPA3     LDN    7           BRIEF DELAY
          SBN    1
          PJN    *-1         IF DELAY NOT COMPLETE
          UJN    SPA1        TRY TO RESERVE PORT AGAIN
 STM      SPACE  4,10
**        STM - SELECT TERMINAL ON MULTIPLEXOR.
*
*         ENTRY  (A) = TERMINAL TO OBTAIN ACCESS TO.
*
*         EXIT   (A) = 0, IF ACCESS FAILED.
*
*         CALLS  DLY, RSB, USB.
*
*         USES   RSBA, SFMX, T2, USBA.
*
*         MACROS LOCKMR.


 STM      SUBR               ENTRY/EXIT
          ADC    MXPT        FORM PORT SELECT FUNCTION
          STM    SFMX
          LMC    SHNI&MXPT   FORM SHIFT INSTRUCTION
          STM    USBA
          LMN    77          COMPLEMENT SHIFT COUNT
          STM    RSBA
          LDN    0
          STD    T2

 STM1     LOCKMR SET
          RJM    RSB         READ STATUS BITS
          ZJN    STM4        IF PORT IS FREE
          LDC    4S12+4
          RJM    USB         SET PORT REQUESTED BIT
          LOCKMR CLEAR
          RJM    DLY         DELAY 0.05 SECONDS
          SOD    T2
          NJN    STM1        IF TIMEOUT NOT EXPIRED
          STM    SFMX        CLEAR PORT SELECT FUNCTION
 STM3     LJM    STMX        RETURN

 STM4     LDC    5S12+1
          RJM    USB         SET PORT RESERVED, PORT NOT REQUESTED
          LOCKMR CLEAR
          RJM    SPA         SET PORT ACCESS
          FNC    MXSM+2S1+1,MX  CONFIGURE PORT
          AJM    *,MX        WAIT FOR FUNCTION COMPLETE
          FNC    MXMC,MX     MASTER CLEAR PORT
          LDN    0
          SBN    10
          MJN    *-1         DELAY FOR A WHILE
          RJM    CPA         CLEAR PORT ACCESS
          LDN    1
          UJN    STM3        RETURN
 USB      SPACE  4,10
**        USB - UPDATE STATUS BITS.
*
*         ENTRY  (A) = 3/MASK, 9/0, 3/VALUE
*                (RBUF - RBUF+7) = CURRENT TESTMODE REGISTER CONTENTS.
*
*         EXIT   TESTMODE REGISTER REWRITTEN.
*
*         USES   T1.
*
*         MACROS WRITMR.


 USB      SUBR               ENTRY/EXIT
 USBA     SHN    0           (IF PORT 0)
*         SHN    1           (IF PORT 1)
          STD    T1
          SHN    -14
          ADC    SCNI        FORM MASK
          STM    USBB
          LDM    RBUF+7
 USBB     SCN    0
          LMD    T1
          STM    RBUF+7
          WRITMR RBUF,ELIO,ITMR
          UJN    USBX        RETURN
 WCT      SPACE  4,10
**        WCT - WRITE CHARACTER TO TERMINAL.
*
*         ENTRY  (A) = ASCII CHARACTER VALUE.
*
*         EXIT   (A) = ENTRY VALUE.
*
*         CALLS  CPA, DLY, SPA.
*
*         USES   T1.


 WCT1     FNC    MXWT,MX     FUNCTION TO WRITE
          LDD    T1
          AJM    *,MX        WAIT FOR FUNCTION COMPLETE
          ACN    MX
          OAN    MX          OUTPUT CHARACTER
          DCN*   MX+40       DISCONNECT CHANNEL
          RJM    CPA         CLEAR PORT ACCESS

 WCT      SUBR               ENTRY/EXIT
          STD    T1
 WCT2     RJM    SPA         START PORT ACCESS
          SHN    21-4
          MJN    WCT1        IF BUFFER NOT FULL
          RJM    CPA         CLEAR PORT ACCESS
          RJM    DLY         DELAY FOR 0.05 SECONDS
          UJN    WCT2        TRY TO OUTPUT AGAIN
          SPACE  4
          BASE   *
          PURGMAC DCN*
 QUAL$    IF     -DEF,QUAL$
          QUAL   *
 CPR      EQU    /COMPTMA/CPR
 GTS      EQU    /COMPTMA/GTS
 RCT      EQU    /COMPTMA/RCT
 RTM      EQU    /COMPTMA/RTM
 SSMX     EQU    /COMPTMA/SSMX
 STM      EQU    /COMPTMA/STM
 WCT      EQU    /COMPTMA/WCT
 QUAL$    ENDIF
          ENDX
