*COMDECK COM2NS 
COB       SPACE  4,10 
**        COB - CHECK OUTPUT BUFFER POINTERS. 
* 
*         READ IN POINTER.
*         VALIDATE IN POINTER.
*         CALCULATE DATA AVAILABLE FOR OUTPUT.
*         RETURN. 
* 
*         ENTRY  NONE.
* 
*         EXIT   (A) .LT. 0, ERROR RETURN.
*                    .GE. 0, DATA AVAILABLE FOR OUTPUT. 
* 
*         USES   D.T0 - D.T4, INPNT, FIRST, LIMIT.
* 
*         CALLS  CSZ. 
  
  
 COB      ENM    X                 ENTRY/EXIT 
          FETREL 2
          ZJN    COB1              IF ADDRESS ERROR 
          CRD    D.T0              READ IN
          LDD    D.T0+C.PT+1
          STD    INPNT+1           SAVE IN
          LDD    D.T0+C.PT
          LPN    77B
          STD    INPNT
          SBD    LIMIT             CALCULATE IN - LIMIT 
          SHN    12 
          ADD    INPNT+1
          SBD    LIMIT+1
          PJN    COB1              IF IN PAST LIMIT 
          LDD    INPNT
          SBD    FIRST             CALCULATE IN - FIRST 
          SHN    12 
          ADD    INPNT+1
          SBD    FIRST+1
          PJN    COB2              IF FIRST .LE. IN 
 COB1     LCN    0                 SET ERROR RETURN 
          UJN    COBX 
  
 COB2     RJM    CSZ               OBTAIN DATA SIZE 
          UJN    COBX 
RBB       SPACE  4,10 
**        RBB - READ BINARY BUFFER. 
* 
*         ENTRY  (A) = CM WORD COUNT. 
*                (D.T0) = PP BUFFER ADDRESS.
* 
*         EXIT   (A) .NE. 0, NORMAL RETURN. 
*                    = 0, ADDRESS ERROR.
* 
*         USES   D.T0 - D.T3, FIRST, OUTPNT, LIMIT. 
* 
*         CALLS  NONE.
  
  
 RBB      ENM    X                 ENTRY/EXIT 
          STD    D.T2              SET FIRST PART WORD COUNT
          STD    D.T1              SAVE CM WORD COUNT 
          SBN    1
          MJN    RBBX              IF NO DATA TO READ 
          LDD    D.T0 
          STM    RBBA              SET READ ADDRESS 
          LDD    OUTPNT            CALCULATE OUT - LIMIT + WORD COUNT 
          SBD    LIMIT
          SHN    12 
          ADD    OUTPNT+1 
          SBD    LIMIT+1
          ADD    D.T1 
          MJN    RBB1              IF NO WRAP AROUND
          STD    D.T3              SET SECOND PART WORD COUNT 
          LDD    D.T1 
          SBD    D.T3 
          STD    D.T2              SET FIRST PART WORD COUNT
 RBB1     LDD    OUTPNT 
          SHN    12 
          LMD    OUTPNT+1 
          ADD    D.T2              VALIDATE LAST WORD BEING READ
          ADDRA  ER=RBBX
          SBD    D.T2 
          CRM    *,D.T2            READ CM BUFFER 
 RBBA     EQU    *-1
          LDD    D.T2 
          RAD    OUTPNT+1          ADVANCE OUT POINTER
          SHN    -12
          RAD    OUTPNT 
          SBD    LIMIT             CALCULATE OUT - LIMIT
          SHN    12 
          ADD    OUTPNT+1 
          SBD    LIMIT+1
          MJN    RBB2              IF NOT AT LIMIT
          LDD    FIRST
          STD    OUTPNT            RESET OUT POINTER TO FIRST 
          LDD    FIRST+1
          STD    OUTPNT+1 
          LDD    D.T2              ADVANCE PP BUFFER ADDRESS
          SHN    2                 *4 
          ADD    D.T2              *5 
          RAM    RBBA 
          LDD    D.T3 
          ZJN    RBB2              IF NO SECOND PART
          STD    D.T2              SET WORD COUNT 
          LDN    0
          STD    D.T3              CLEAR SECOND PART WORD COUNT 
          LJM    RBB1 
  
 RBB2     LDN    1                 NORMAL RETURN
          LJM    RBBX 
OBD       SPACE  4,10 
**        OBD - OUTPUT BINARY DATA. 
* 
*         CALL BRH TO BUILD RECORD HEADER.
*         CALL SEL TO SELECT PATH.
*         IF ERROR THEN RETURN. 
*         IF OUTPUT NOT BELOW THRESHOLD 
*         THEN
*           SET OUTPUT CHANGE EVENT.
*           ZERO DBC. 
*           IF RETRYS EXHAUSTED 
*           THEN
*             RETURN NO BUFFERS FOR OUTPUT. 
*           ELSE
*             SET NO BUFFERS REISSUE. 
*             RETURN NO FET COMPLETE CODE.
*         OUTPUT BINARY DATA. 
*         RETURN. 
* 
*         ENTRY  NONE.
* 
*         EIXT   (A) = 0, NORMAL RETURN.
*                    .GT. 0, EXPLICIT FET COMPLETE CODE.
*                    .LT. 0, COMPLETE FET WITH NO ERROR.
*                (DBC) = 0, IF NO DATA OUTPUT.
* 
*         USES   DD, D.REQ2 - D.REQ3, EVENT, STATUS.
* 
*         CALLS  BRH, ERR, FAN, FFN, OUT, REL, SEL, WFP.
  
  
 OBD      ENM    X                 ENTRY/EXIT 
          RJM    BRH               BUILD RECORD HEADER
          LDK    DELRTY 
          STM    DELA              RESET RETRY COUNT
 OBD00    BSS    0
          RJM    SEL               SELECT PATH
          NJN    OBDX              IF ERROR 
          LDD    STATUS 
          SHN    17-S.CSTOA 
          MJN    OBD04             IF OUTPUT BELOW THRESHOLD
 OBD00.5  RJM    DEL               DELAY FOR A WHILE
          PJN    OBD00             IF RETRIES NOT EXHAUSTED 
 OBD01    LDN    EVTOUT 
          STD    EVENT             SET CHANGE IN OUTPUT EVENT 
          LDN    0
          STD    DBC               INDICATE NO DATA OUTPUT
          LDK    MAXRETRY 
          SBD    D.REQ2+C.RETRY 
          MJN    OBD02             IF RETRYS EXHAUSTED
          LDK    RC.FNOBF          NO BUFFERS REISSUE 
          STD    D.REQ3+C.RC
          LDN    0                 NO FET COMPLETE CODE 
          UJN    OBDX 
  
 OBD02    LDK    FETNOBUF          NO BUFFERS FOR OUTPUT
 OBD03    UJN    OBDX 
  
 OBD03.5  LDN    EVTABT 
          STD    EVENT             SAVE EVENT PATH ABORTED
          LCN    0
          UJN    OBD03
  
 OBD04    LDK    FCWD              WRITE DATA FUNCTION
          RJM    FFN
          ZJN    OBD07             IF ACK RESPONSE
          MJN    OBD06             IF HARDWARE ERROR
          LMN    RCTN&RCAK
          ZJN    OBD00.5           IF TNR RESPONSE
          LMN    RCFL&RCTN
          ZJN    OBD01             IF PATH IN FLUSH STATE 
          LMN    RCAB&RCFL
          ZJN    OBD03.5           IF PATH ABORTED
          LMN    RCCA&RCAB
          ZJN    OBD02             IF CONVERT MODE ACTIVE 
 OBD05    LCN    NADERRH           ABNORMAL RESPONSE CODE 
 OBD06    RJM    ERR               REPORT ERROR 
          MJN    OBD03             IF FIRM HARDWARE ERROR 
          LDK    FCAB              ABORT OUTPUT 
          RJM    FFN
          MJN    OBD06             IF HARDWARE ERROR
          UJN    OBD04             RESTART OUTPUT 
  
 OBD07    LDD    D.REQ1+C.REQFLG
          SHN    17-S.CHNDED
          PJN    OBD08             IF CHANNEL NOT DEDICATED 
          LDM    BLKCNT+C.WRITE+1 
          NJN    OBD10             IF BLOCK ALWAYS WRITTEN IN BINARY
 OBD08    LDK    FCBM              SELECT BINARY MODE 
          RJM    FFN
 OBD09    MJN    OBD06             IF HARDWARE ERROR
          NJN    OBD05             IF RESPONSE ERROR
 OBD10    RJM    WFP               WAIT FOR PRIMED
          MJN    OBD09             IF ERROR 
          LDK    FCOB              OUTPUT BIT STRING
          RJM    FAN
          MJN    OBD09             IF ERROR 
          LDC    HDR
          STM    OUTA              SET OUTPUT BUFFER ADDRESS
          LDC    0                 BYTES TO OUTPUT
 OBDA     EQU    *-1
          RJM    OUT               OUTPUT DATA
          ZJN    OBD11             IF OUTPUT COMPLETE 
          MJN    OBD09             IF HARDWARE ERROR
          LCN    NADERRK           TRANSFER LENGTH ERROR
          UJN    OBD09
  
 OBD11    LDD    BUFBYTES 
          ZJN    OBD12             IF ZERO LENGTH RECORD
          LDD    DD 
          SBN    DDAS 
          ZJN    OBD14             IF ASCII DATA
 OBD12    LDK    FCTD              TRANSMIT DATA
          RJM    FFN
          PJN    OBD13             IF NO HARDWARE ERROR 
          RJM    ERR               REPORT ERROR 
          MJN    OBD15             IF FIRM HARDWARE ERROR 
          UJN    OBD12             RETRY
  
 OBD13    LDD    D.REQ1+C.REQFLG
          SHN    17-S.CHNDED
          MJN    OBD14             IF CHANNEL DEDICATED 
          LDN    1                 TEMPORARILY
          RJM    REL               RELEASE CHANNEL
 OBD14    LDN    0                 NORMAL RETURN
 OBD15    LJM    OBDX 
BRH       SPACE  4,10 
**        BRH - BUILD RECORD HEADER.
* 
*         CONVERT BYTES IN PP BUFFER, REMAINING CM WORDS, AND UNUSED
*           BIT COUNT INTO TEXT LENGTH BIT COUNT. 
*         CONVERT BYTES IN PP BUFFER INTO MULTIPLE OF NAD WORDS.
*         INSERT PATH ID, DATA BLOCK CLARIFIER, AND ABN INTO HEADER.
*         RETURN. 
* 
*         ENTRY  NONE.
* 
*         EXIT   NONE.
* 
*         USES   D.T0, BUFBYTES, DBC, DD, D.REQ2, REMWORDS, UBC.
* 
*         CALLS  NONE.
* 
*         NOTES  SEE NOTES FOR SUBROUTINE CMW.
* 
*                THE PP BYTE COUNT IS MULTIPLIED BY 12
*                MINUS UBC FOR BINARY MODE. 
*                THE PP BYTE COUNT IS MULTIPLIED BY 12 * 4/3 (OR 16)
*                FOR DISPLAY CODE MODE.  THE PP BYTE COUNT IS 
*                MULTIPLIED BY 12 * 2/3 (OR 8) FOR ASCII MODE.
* 
*                THE PP BYTE COUNT IS ROUNDED TO A MULTIPLE OF
*                16-BIT NAD WORDS.  NO ROUNDING IS REQUIRED IN
*                DISPLAY CODE MODE (6 TO 8).  PP BYTE COUNT IS
*                ROUNDED TO AN EVEN NUMBER FOR ASCII MODE (12 TO 8).
*                PP BYTE COUNT IS ROUNDED TO A MULTIPLE OF FOUR 
*                FOR BINARY MODE. 
  
  
 BRH      ENM    X                 ENTRY/EXIT 
          LDD    DD 
          SBN    DDAS 
          ZJN    BRH2              IF ASCII DATA
          LDD    BUFBYTES 
          SHN    1                 BYTES*2
          STD    D.T0 
          SHN    2                 BYTES*8
          ADD    D.T0              BYTES*10 
          ADD    D.T0              BYTES*12 
          SBD    UBC
          UJN    BRH3 
  
 BRH2     LDD    REMWORDS          CALCULATE REMAINING + BUFFER BYTES 
          SHN    2
          ADD    REMWORDS 
          ADD    BUFBYTES 
 BRH2.3   STD    D.T0 
          LCN    12 
          RAD    UBC
          MJN    BRH2.5            IF NOT FULL UNUSED BYTE
          SOD    D.T0              SUBTRACT OFF ONE BYTE
          UJN    BRH2.3 
  
 BRH2.5   LDD    D.T0 
          SHN    3                 BYTES*8
 BRH3     SHN    18-4 
          STM    HDR+R.PTXTLN      INSERT UPPER 12 BITS 
          SHN    -6 
          LPC    7400B
          STM    HDR+R.PTXTLN+1    INSERT LOWER 12 BITS 
          LDN    HDRLEN 
          STM    OBDA              PRESET TO OUTPUT BINARY HEADER 
          LDD    DD 
          SBN    DDAS 
          ZJN    BRH4              IF ASCII DATA
          LDD    BUFBYTES 
          ADN    3                 ROUND TO MULTIPLE OF FOUR
          SCN    3
          STD    BUFBYTES 
          RAM    OBDA              OUTPUT ENTIRE BLOCK
 BRH4     LDD    D.REQ2+C.PATH
          SHN    4
          STM    HDR+R.PCN         INSERT PATH ID 
          LDN    BTMSG             MSG BLOCK TYPE 
          SHN    S.PBT
          ADD    DBC               ADD DATA BLOCK CLARIFIER 
          STM    HDR+R.PDBC        INSERT IN MESSAGE
          LDM    FETWD5+C.FABN
          LPN    77B
          STM    HDR+R.PABN        INSERT ABN 
          LDM    FETWD5+C.FABN+1
          STM    HDR+R.PABN+1 
          LJM    BRHX 
OCR       SPACE  4,10 
**        OCR - OUTPUT CHARACTER RECORD.
* 
*         IF ZERO LENGTH RECORD THEN RETURN.
*         IF ASCII 8/12 THEN ROUND BUFBYTES TO A MULTIPLE OF
*           TWO. (SEE NOTES IN BRH) 
*         CALL SEL TO SELECT PATH.
*         IF ERROR THEN RETURN. 
*         OUTPUT CHARACTER DATA.
*         IF ERROR THEN RETURN. 
*         IF REMAINING WORDS ARE ZERO 
*         THEN
*           TRANSMIT BLOCK. 
*         RELEASE CHANNEL.
*         RETURN. 
* 
*         ENTRY  NONE.
* 
*         EXIT   (A) = 0, NORMAL RETURN.
*                    .LT. 0, COMPLETE FET WITH NO ERROR.
* 
*         USES   REMWORDS.
* 
*         CALLS  ERR, FAN, FFN, OUT, REL, SEL, WFP. 
  
  
 OCR      ENM    X                 ENTRY/EXIT 
          LDD    BUFBYTES 
          ZJN    OCRX              IF ZERO LENGTH RECORD
          AOD    BUFBYTES 
          SCN    1
          STD    BUFBYTES          BUFBYTES IS NOW A MULTIPLE OF TWO
 OCR1     RJM    SEL               SELECT PATH
          NJN    OCRX              IF ERROR 
          LDK    FCWD              WRITE DATA 
          RJM    FFN
          ZJN    OCR4              IF ACK RESPONSE
          LMN    RCFL&RCAK
          ZJN    OCR4              IF PATH IN FLUSH STATE 
          LMN    RCAB&RCFL
          NJN    OCR2              IF NOT PATH ABORTED
          LDN    EVTABT 
          STD    EVENT             SAVE EVENT PATH ABORTED
          LCN    0
          UJN    OCRX 
  
 OCR2     MJN    OCR3              IF HARDWARE ERROR
          LCN    NADERRH           ABNORMAL RESPONSE CODE 
 OCR3     RJM    ERR               REPORT ERROR 
          MJN    OCRX              IF FIRM HARDWARE ERROR 
          LDK    FCAB              ABORT TRANSACTION
          RJM    FFN
          MJN    OCR3              IF HARDWARE ERROR
          AOD    RESET             SET OUTPUT RESET FLAG
          LDN    0
          LJM    OCRX 
  
 OCR4     LDK    FCBM              SELECT BINARY MODE 
          RJM    FFN
          NJN    OCR2              IF ERROR 
          RJM    WFP               WAIT FOR PRIMED
          MJN    OCR3              IF ERROR 
          LDK    FCO8              OUTPUT 12 TO 8 
          RJM    FAN
 OCR5     MJN    OCR3              IF ERROR 
          LDC    BUFW 
          STM    OUTA              SET OUTPUT BUFFER ADDRESS
          LDD    BUFBYTES 
          RJM    OUT               OUTPUT CHARACTER DATA
          ZJN    OCR6              IF OUTPUT COMPLETE 
          MJN    OCR5              IF HARDWARE ERROR
          LCN    NADERRK           TRANSFER LENGTH ERROR
          UJN    OCR5 
  
 OCR6     LDD    REMWORDS 
          NJN    OCR7              IF MORE WORDS TO OUTPUT
          LDK    FCTD              TRANSMIT DATA
          RJM    FFN
          PJN    OCR7              IF NO HARDWARE ERROR 
          RJM    ERR               REPORT ERROR 
          MJN    OCR9              IF FIRM HARDWARE ERROR 
          UJN    OCR6              RETRY
  
 OCR7     LDD    D.REQ1+C.REQFLG
          SHN    17-S.CHNDED
          MJN    OCR8              IF CHANNEL DEDICATED 
          LDN    1                 TEMPORARILY
          RJM    REL               RELEASE CHANNEL
 OCR8     LDN    0                 NORMAL RETURN
 OCR9     LJM    OCRX 
CSZ       SPACE  4,10 
**        CSZ - CHECK DATA SIZE AVAILABLE 
* 
*         ENTRY  NONE.
  
*         EXIT   (A) = DATA SIZE AVAILABLE. 
* 
*         USES   FIRST, INPUT, OUTPUT, LIMIT. 
* 
*         CALLS  NONE.
  
  
 CSZ      ENM    X                 ENTRY/EXIT 
          LDD    INPNT             CALCULATE IN - OUT 
          SBD    OUTPNT 
          SHN    12 
          ADD    INPNT+1
          SBD    OUTPNT+1 
          PJN    CSZX              IF DATA IN ONE PIECE 
          ADD    LIMIT+1
          SBD    FIRST+1           CALCULATE IN - OUT + LIMIT - FIRST 
          SHN    6
          ADD    LIMIT             GIVES DATA WHEN WRAP AROUND OCCURS 
          SBD    FIRST
          SHN    12 
          UJN    CSZX 
UPO       SPACE  4,10 
**        UPO - UPDATE OUT AND ABN WITHIN UCP FET.
* 
*         ENTRY  NONE.
* 
*         EXIT   (A) = 0, NORMAL RETURN.
*                    = FETPERR, ADDRESS ERROR.
* 
*         USES   D.T0 - D.T4, OUTPNT. 
* 
*         CALLS  NONE.
  
  
 UPO      ENM    X                 ENTRY/EXIT 
          LDK    P.ZERO 
          CRD    D.T0 
          LDD    OUTPNT 
          STD    D.T0+C.PT         SET UP OUT POINTER 
          LDD    OUTPNT+1 
          STD    D.T0+C.PT+1
          FETREL 5
          ZJN    UPO1              IF ADDRESS ERROR 
          SBN    2
          CWD    D.T0              WRITE OUT
          ADN    2
          CWM    FETWD5,ONE        WRITE ABN, UBC, AND DD.
          LDN    0                 NORMAL RETURN
          UJN    UPOX 
  
 UPO1     LDN    FETPERR           ADDRESS ERROR
          UJN    UPOX 
