*DECK FFSCFIO 
          IDENT  FFSCFIO
*CALL COPYRITE
  
          ENTRY  FFSCFIO     PERFORM FILE I-O 
          ENTRY  FFSCPRS     PRESET FOR FILE I-O
          ENTRY  FFSCFFB     FLUSH FILE BUFFER (RECEIVING DATA) 
          ENTRY  CTABLES
          ENTRY  PRS5B
  
          SYSCOM B1 
          SST 
*COMMENT  FFSCFIO - PERFORM FILE INPUT/OUTPUT 
          TITLE  FFSCFIO - PERFORM FILE I/O AND CHARACTER CONVERSION
          COMMENT  FFSCFIO - PERFORM FILE I/O AND CHARACTER CONVERSION
          SPACE  4,10 
***       FFSCFIO PERFORMS FILE I/O FOR THE FTP FILE TRANSFER 
*         COMMANDS, AND ALSO DOES CHARACTER TRANSLATION PRIOR 
*         TO WRITING THE DATA TO DISK (STOR), OR SENDING IT 
***       OVER TCP (RETR/LIST). 
  
          SPACE  4,20 
*** 
* 
*         CALLING SEQUENCE
* 
*         FFSCFIO;
* 
*         INPUT:- 
* 
*         THE FOLLOWING VARIABLES ARE SET IN COMMON BLOCK CTRLREC:- 
*         (FOR APPE & STOR ONLY)
*                (BUFFAD)  = ADDRESS OF BUFFER OF DATA (APPE, STOR),
*                          = 0 IF RETR (CDTBUF POINTS TO DATA BUFFER),
*                (WDCNT)   = TOTAL WORDS IN BUFFER (FROM ZERO), 
* 
*         (FOR LIST)
*                (WDCNT)   = TOTAL WORDS OF CATLIST DATA IN PBUF. 
*                (PBUF)    = CATLIST DATA.
* 
*         FOR ALL TYPES,
*                (BYTESIN) = TOTAL BYTES IN BUFFER (APPE, STOR),
*                          = TOTAL BYTES IN FILE (BINARY RETR). 
* 
*         EXIT :- 
* 
*                (STATMSG) = FTP MESSAGE NUMBER INDICATING STATUS,
*                          = 0 IF NO STATUS IS RELEVANT.
*               (BYTESOUT) = OUTPUT BYTE/CHAR. COUNT TO DISK OR TCP.
* 
*         NUMEROUS LOCAL VARIABLES HAVE PREVIOUSLY BEEN SET BY THE
*         CALL TO FFSCPRS VIZ.
*         FET = FET ADDRESS WHETHER INPUT OR OUTPUT,
*         PC, NC, PL, NL, EVENT, BINARY, ICL, OCL, CPIW, CPOW ETC 
*         ARE ALL SET BY FFSCPRS. 
* 
* 
  
          TITLE  SYMBOL DEFINITIONS.
          SPACE  4,10 
****      ASSEMBLY CONSTANTS. 
  
  
 OUTSIZ   EQU    273         OUTPUT BUFFER SIZE (SET IN TEXTFFS)
  
 BPNB     SET    OUTSIZ-1 
 BPNB     SET    BPNB*15
 BPNB     SET    BPNB/2      BYTES PER FULL NAM BUFFER
  
 BITSWORD EQU    60D         BITS PER CM WORD 
 BIBYTE   EQU    8           BITS PER IMAGE BYTE
 CRECLEN  EQU    4           CONTROL RECORD LENGTH
 INPSIZ   EQU    273         INPUT BUFFER SIZE  (MUST MATCH VALUES..
 BLNK     EQU    55B         DISPLAY CHARACTER BLANK
 ZBCH     EQU    400B        INTERNAL ZERO BYTE CHARACTER 
 EORC     EQU    401B        INTERNAL EOR CHARACTER 
 EOFC     EQU    402B        INTERNAL EOF CHARACTER 
 EOIC     EQU    403B        INTERNAL EOI CHARACTER 
 TLEN     EQU    403B        CONVERSION BASE TABLE LENGTH 
 MCVTL    EQU    1006B       MAXIMUM CONVERSION TABLE LENGTH
  
 LTD64    EQU    404B 
 LTD63    EQU    404B 
 LTA64    EQU    404B 
 LTA63    EQU    404B 
 LTAS8    EQU    404B 
 LTASC    EQU    404B 
  
 BUFSIZ   SET    LTD64+LTD63+LTA64+LTA63+LTAS8+LTASC
 BUFSIZ   SET    BUFSIZ+20B  ALLOW FOR 5400 TABLE & SOME CODE 
  
 PBUFL    SET    BUFSIZ/272  NO. OF WHOLE BLOCKS
 PBUFL    SET    PBUFL*272D+1 
  
****
          SPACE  4,10 
*         COMMON DECKS. 
  
  
 OPL      XTEXT  COMCMAC
 OPL      XTEXT  COMCCMD
 OPL      XTEXT  COMSLFM
          TITLE  WORKING STORAGE. 
          SPACE  4,10 
*         INPUT PARAMETERS. 
  
 FET      BSS    1           ADDRESS OF THE FET 
 BINARY   BSS    1           BINARY FLAG 1 = BINARY TRFR, 0 = NOT BINARY
 EVENT    BSS    1           INPUT EVENT 0=RETR, 1=STOR, 2=APPE, 3=LIST 
 RDEOI    BSS    1           TRUE IF TO READ TO EOI (RETR)
 TRUNC    BSS    1           =1 IF TRUNCATION IN EFFECT 
  
 PC       CON    0           INPUT CHARACTER SET
 NC       CON    0           OUTPUT CHARACTER SET 
 PL       CON    0           OLD FILE LINE TERMINATOR 
 NL       CON    0           NEW FILE LINE TERMINATOR 
 OPC      BSS    1           CSIN VALUE 
 ONC      BSS    1           CSOUT VALUE
          SPACE  4,10 
*         GLOBAL VARIABLES. 
  
  
 CLNF     BSS    1           6 BIT COLON FOUND FLAG 
 CPIW     BSS    1           CURRENT POSITION IN INPUT WORD 
 CPOW     BSS    1           CURRENT POSITION IN OUTPUT WORD
 CTAB     BSS    1           ADDRESS OF GENERATED CONVERSION TABLE
 ENDF     BSS    1           EOI DETECTED FLAG
 ERCT     BSS    1           ERROR COUNT
 ERLM     CON    20D         ERROR LIMIT
 ICL      BSS    1           INPUT CHARACTER LENGTH 
 INDX     BSS    1           OFFSET TO SPECIAL SECTION OF TABLE 
 IWRD     BSS    1           CURRENT INPUT WORD 
 NXTCWRD  BSS    1           NEXT WORD IN PBUF BUFFER FOR CATLIST 
 OCL      BSS    1           OUTPUT CHARACTER LENGTH
 OWRD     BSS    1           CURRENT OUTPUT WORD
 RAHD     BSS    1           READ AHEAD CHARACTER (=-1 IF NONE) 
 RETSTAT  BSS    1           STATUS RETURNED FROM CALLS 
 TCVTL    CON    TLEN        CONVERSION TABLE LENGTH
  
  
*         INPUT BUFFER FROM NAM 
  
          USE    /INPBUFF/
          BSS    1           FILL TO INPBUF 
 INPBUF   BSS    INPSIZ 
          USE    *
  
*         POINTER TO OUTPUT BUFFER
  
          USE    /DATABUF/
 CDTBUF   BSS    1           POINTER TO OUTPUT BUFFER TO USE
          USE    *
  
*         CONTROL RECORD BUFFER 
*         - USED FOR EASY COMMUNICATION WITH SYMPL CALLERS
  
          USE    /CTRLREC/
  
 NXTBWRD  BSS    1           NEXT WORD IN BUFFER
 BUFFAD   BSS    1           INPUT/OUTPUT BUFFER ADDRESS
 WDCNT    BSS    1           TOTAL WORDS IN BUFFER FROM ZERO
 WHCNT    BSS    1           WHOLE WORDS IN BUFFER FROM ZERO
 BYTESIN  BSS    1           TOTAL BYTES ON INPUT FILE
 BYTESOUT BSS    1           TOTAL BYTES ON OUTPUT FILE 
 CURRIN   BSS    1           CURRENT INPUT BYTE COUNT 
 CURROUT  BSS    1           CURRENT OUTPUT BYTE COUNT
 OUTFCR   BSS    1           FLOW CONTROL RELEASE INDICATOR 
 STATMSG  BSS    1           MESSAGE NUMBER TO RETURN TO CALLER 
 CLHEAD   BSS    1           CATLIST HEADER REQD FLAG (1=YES) 
 CLFULL   BSS    1           FULL CATLIST REQUIRED
  
 OUCREC   BSS    CRECLEN     BUFFER FOR CONTROL RECORD
 OUCHDDR  EQU    OUCREC      HEADER WORD
 OUCBCNT  EQU    OUCREC+1    BYTE COUNT ON FILE (BITS 47-0) 
 OUCKSUM  EQU    OUCREC+2    FILE CHECKSUM
 OUCPSUM  EQU    OUCREC+3    FILE CHECKSUM TO LAST FULL WORD
  
          USE    *
  
*         COMMUNICATION COMMON BLOCK TO BE USED BY FFSCFIO/FFSCTAB
*         THIS BLOCK WILL CONTAIN THE ADDRESSES OF THE NAMED VARIABLES
  
          USE    /CTABCOM/
  
 TD64A    BSS    1           64 CHARACTER DISPLAY CODE
 TD63A    BSS    1           63 CHARACTER DISPLAY CODE
 TA64A    BSS    1           64 CHARACTER ASCII 6/12
 TA63A    BSS    1           63 CHARACTER 6/12 DISPLAY CODE 
 TAS8A    BSS    1           SHORT VERSION OF 8 BIT ASCII 
 TASCA    BSS    1           FULL 8 BIT ASCII 
 PBUFA    BSS    1           FILE I/O BUFFER
 ENDTABA  BSS    1           END OF CONVERSION TABLES 
  
          USE    *
  
          SPACE  4,10 
*         DAYFILE MESSAGES. 
  
 MSGA     DATA   C* FFSCFIO - INVALID INPUT BLOCK RECEIVED.*
 MSGB     DATA   C* FFSCFIO - BAD CHARACTER CONVERSION TABLE.*
 MSGC     DATA   C* FFSCFIO - OUTPUT BUFFER OVERFLOW.*
 MSGD     DATA   C* FFSCFIO - ILLEGAL WRITE TO NAM BUFFER.* 
  
          TITLE  MAIN ROUTINES. 
 FCO8     SA1    FET
          RECALL X1 
  
 FFSCFIO  SUBR               ENTRY/EXIT 
          SA2    ENDF 
          NZ     X2,FFSCFIOX EXIT IF EOF IS SET 
          RJ     SETREG      SET REGISTERS FOR TRANSFER 
          NZ     B7,FCO1     IF CSIN NOT = CSOUT
          SA1    EVENT       (X1) = 0 FOR RETR
          NZ     X1,FCO0     EXIT NOT RETR COMMAND
          RJ     R8D         EXIT TO PERFORM 8-BIT RETR 
          EQ     FFSCFIOX 
  
 FCO0     RJ     S8D         EXIT TO PERFORM 8-BIT APPE/STOR
          EQ     FFSCFIOX 
  
 FCO1     SA1    FET
          RECALL X1 
  
          SA1    EVENT
          ZR     X1,FCO2     IF *RETR*
          SX1    X1-3 
          ZR     X1,FCO2     IF *LIST*
          RJ     SCD         STOR / APPE CHARACTER DATA 
          EQ     FCO4        CHECK FOR EOI
  
 FCO2     SX1    B4-6 
          ZR     X1,FCO3     IF 6 BIT CHARACTERS
          RJ     RTD         RETRIEVE 8/12 ASCII DATA FILE
          EQ     FCO4        CHECK FOR EOI
  
 FCO3     RJ     R6D         RETR / LIST 6 BIT DATA 
 FCO4     SA2    ENDF 
          NZ     X2,FCO8     IF EOI 
 FCO7     RJ     SAVREG 
          MX6    0
          SA6    STATMSG     SET NO STATUS
          EQ     FFSCFIOX    RETURN 
          SPACE  4,10 
  
**        FFSCFFB - FLUSH OUTPUT FILE BUFFER ENTRY POINT
  
 FFSCFFB  SUBR               ENTRY/EXIT 
          RJ     SETREG 
          SX2    EOIC        (X2) = END OF INFORMATION CHARACTER
          SX6    B1 
          RJ     PCH         CAUSE BUFFER FLUSH 
          SA5    FET
          RECALL X5 
          SA1    BINARY      (X1) = 1 IF BINARY TRANSFER
          SA2    OUCHDDR
          ZR     X1,FFSCFFBX RETURN IF NOT BINARY 
          SA5    FET
          ZR     X2,FFSCFFBX RETURN IF NO CONTROL RECORD
          WRITEF X5,R        WRITE (EOF) FOR CONTROL RECORD 
          SX3    CRECLEN
          SA2    OUCHDDR
          MX0    42D
          BX6    X0*X2       CLEAR REC LENGTH 
          IX6    X6+X3
          SA3    BYTESOUT 
          SA6    A2 
          BX7    X3 
          MX6    0
          SA7    OUCBCNT     SET BYTE COUNT 
          SA6    OUCKSUM
          SA6    OUCPSUM
          WRITEW X5,OUCREC,CRECLEN
          SX1    X1+3 
          NZ     X1,FFB2
          RJ     PTE         EXIT IF FILE ERRORS
  
 FFB2     WRITER X5,R 
          EQ     FFSCFFBX    RETURN 
  
          TITLE  SUBROUTINES. 
 ABTRTNE  SPACE  4,20 
**        ABTRTNE - ABORT THE APPLICATION.
* 
*         ENTRY  (X5) = ADDRESS OF MESSAGE TO OUTPUT. 
* 
*         THIS ROUTINE DOES NOT EXIT. THE MESSAGE IS ISSUED TO THE
*         DAYFILES AND THE APPLICATION IS ABORTED.
* 
  
 ABTRTNE  SUBR               ENTRY
          SA1    FET
          RECALL X1 
          MESSAGE X5,0
          ABORT 
  
 CEC      SPACE  4,10 
**        CEC - CHECK FOR EXTRANEOUS ZERO CHARACTERS. 
* 
*         EXIT   (X2) = CHARACTER.
* 
*         CALLS  ABTRTNE, PCH, RCH, TCH.
  
  
 CEC      SUBR               ENTRY / EXIT 
          SX5    B2          COMPUTE NUMBER OF CHARACTERS LEFT IN WORD
          SX4    B4 
          IX6    X5/X4
          SX4    B4 
          IX4    X4*X6       COMPUTE LEFTOVER BITS
          SX6    X6+1 
          IX5    X5-X4
          SA6    CECA 
          SB2    X5 
          RJ     RCH         READ NEXT CHARACTER FROM NEW WORD
          SX5    X2-EOIC
          ZR     X5,CECX     IF EOI 
          SX6    X2          SAVE CHARACTER 
          SA6    CECB 
 CEC1     SA1    CECA        CHECK ZERO CHARACTER COUNT 
          SX7    X1-1        DECREMENT CHARACTER COUNT
          NG     X7,CEC2     IF NO MORE ZERO CHARACTERS TO PROCESS
          BX2    X2-X2
          SA7    CECA        SAVE COUNT 
          RJ     TCH         TRANSLATE ZERO CHARACTER 
          NG     X2,CEC1     IF CHARACTER IS TO BE IGNORED
          RJ     PCH         OUTPUT CHARACTER 
          SA1    OUTFCR      (X1) = 1 IF NO FLOW CONTROL
          NZ     X1,CEC1     EXIT OK TO CONTINUE
  
*         LOGIC INVOLVED HERE:- 
*         2 POSSIBLE SITUATIONS FOR INPUT EOL NOT = Z-BYTE:-
*          1. INPUT ASCII88 FROM FILE, OUTPUT CAN ONLY BE ASCII88.
*             ALL ARE HANDLED IN ROUTINE R8D, SO N/A. 
*          2. INPUT ASCII8 FROM FILE, OUTPUT CAN ONLY BE ASCII88. 
*             THEN WE WILL NEED A MAXIMUM LOOK-AHEAD SIZE OF 4 8-BIT
*             CHARACTERS IN THE OUTPUT BUFFER. OWRD GIVES AT LEAST 7. 
  
          SB6    B3-B5       CHECK ROOM FOR AT LEAST 1 MORE CHAR
          PL     B6,CEC1     CONTINUE 
          SX5    MSGC 
          RJ     ABTRTNE     NO RETURN
  
 CEC2     SA2    CECB        RESTORE FINAL CHARACTER
          EQ     CECX        RETURN 
  
 CECA     CON    0           ZERO CHARACTER COUNT 
 CECB     CON    0           TEMPORARY CHARACTER STORAGE
 GBD      SPACE  4,20 
**        GBD - GET A BUFFER OF DATA (ASCII88 PROCESSING) 
* 
*         ENTRY  (FET)   = FET ADDRESS, 
* 
*         EXIT   (X5) = 0 IF MORE THAN 272 (OUTSIZ-1) WORDS 
*                         ARE AVAILABLE IN THE FET, 
*                     < 0 IF EOF/EOI DETECTED BEFORE 273 WORDS. 
*                (X2) = FET ADDRESS.
*                (B7) = 272 OR WORDS AVAILABLE IF LESS. 
* 
  
 GBD      SUBR               ENTRY/EXIT 
 GBD0     SA2    FET         (X2) = FET ADDRESS 
          SB7    OUTSIZ-1    SET BUFFER SIZE TO NEAREST EVEN WORD 
          ERRNZ  OUTSIZ-273D ERROR IN NAM BUFFER SIZE 
+         SA5    X2          FET WD 0 
          SA1    X2+2        (X1) = IN WORD 
          SA3    A1+B1       (X3) = OUT WORD
          SB4    X3          (B4) = OUT 
          SA4    A3+B1       (X4) = LIMIT WORD
          SB3    X1          (B3) = IN
          BX7    X5 
          SA5    X2+B1       (X5) = FIRST WORD
          SB5    X4          (B5) = LIMIT 
          GE     B3,B4,GBD1  EXIT IF NO END AROUND
          SB2    X5          (B2) = FIRST 
          SB3    B3-B2       IN-FIRST 
          SB3    B3+B5
  
 GBD1     SB6    B3-B4       (B6) = FREE DATA LENGTH
          MX5    0
          GE     B6,B7,GBDX  EXIT IF SUFFICIENT DATA
          BX5    X7          FET WD 0 
          SB7    B6 
          LX5    59-0 
          NG     X5,GBD2     EXIT FET COMPLETE
          RECALL X2 
          EQ     GBD0        LOOP TO TRY AGAIN
  
 GBD2     LX5    -3 
          PL     X5,GBD3     EXIT IF NOT EOF/EOI
          LX5    3-9
          NG     X5,GBDX     EXIT IF EOI
          SA4    BINARY      (X4) = 1 IF BINARY TRANSFER
          MX5    59 
          SA3    RDEOI       (X3) = 1 IF READ TO EOI
          NZ     X4,GBDX     EXIT IF BINARY TRANSFER
          ZR     X3,GBDX     EXIT IF NOT READ-TO-EOI
  
 GBD3     READ   X2,R 
          EQ     GBD0        LOOP TO SEE IF MORE DATA 
  
 GCH      SPACE  4,20 
**        GCH - GET CHARACTER.
* 
*         ENTRY  (B2) = CURRENT POSITION IN INPUT WORD. 
*                (B4) = INPUT CHARACTER LENGTH. 
*                (IWRD) = CURRENT INPUT WORD. 
*                (RAHD) = READ AHEAD CHARACTER. 
*                       = -1 IF NONE. 
* 
*         EXIT   (X2) = CHARACTER TO PROCESS. 
*                     = -1 IF EOB ON INPUT BUFFER.
*                (B2) = NEW POSITION IN INPUT WORD. 
*                (RAHD) = NEW READ AHEAD CHARACTER. 
*                       = -1 IF NONE. 
*                IN FILES NOT USING THE ZERO BYTE LINE TERMINATOR,
*                ZERO CHARACTERS OCCURRING BETWEEN AN EOR, EOF OR EOI 
*                AND THE LAST LINE TERMINATOR PRECEDING IT ARE IGNORED. 
* 
*         USES   X - 1, 2, 3, 4, 5, 6, 7. 
*                A - 1, 2, 3, 6, 7. 
*                B - 2, 6, 7. 
* 
*         CALLS  CEC. 
  
  
 GCH      SUBR               ENTRY/EXIT 
          SA2    RAHD        GET READ AHEAD WORD
          SX6    -B1         CLEAR READ AHEAD 
          SA6    A2 
          PL     X2,GCHX     IF CHARACTER ALREADY READ
          RJ     RCH         READ CHARACTER 
          NZ     X2,GCHX     IF NOT ZERO CHARACTER OR EOB 
          SA1    IWRD        GET INPUT WORD 
          NZ     X1,GCHX     IF MORE CHARACTERS IN WORD 
          SA3    PL          GET INPUT LINE TERMINATOR
          SX3    X3-ZBCH
          NZ     X3,GCH3     IF INPUT LINE TERMINATOR NOT ZERO BYTE 
          SA1    INDX        GET INDEX
          NZ     X1,GCHX     IF UNCOMPLETED DOUBLE LENGTH CHARACTER 
  
*         CHECK FOR ZERO BYTE.
  
          SB7    B2+B4
          SB6    12D
          LT     B7,B6,GCH1  IF NO ROOM FOR ZERO BYTE 
          SX2    ZBCH        SET ZERO BYTE CHARACTER
          SB2    B0+         SET CURRENT INPUT WORD EMPTY 
          EQ     GCHX        RETURN 
  
 GCH1     RJ     RCH         READ NEXT CHARACTER
*                            CANNOT GET HERE FOR 8-BIT DATA 
          SA1    IWRD        GET NEW INPUT WORD 
          NZ     X2,GCH2     IF NOT ZERO CHARACTER
          NZ     X1,GCH2     IF NOT ZERO BYTE 
          SX2    ZBCH        SET ZERO BYTE CHARACTER
          SB2    B0+         INPUT WORD IS EMPTY
          EQ     GCHX        RETURN 
  
 GCH2     SX6    X2          SET READ AHEAD CHARACTER 
          SA6    RAHD 
          BX2    X2-X2       RESET CHARACTER TO ZERO
          EQ     GCHX        RETURN 
  
*         CHECK FOR EXTRANEOUS ZERO CHARACTERS. 
*         (CAN ONLY BE HERE FOR ASCII8 INPUT) 
*         DONT CHECK UNLESS INPUT IS FROM A FILE
  
 GCH3     SA4    EVENT
          NZ     X4,GCHX     EXIT IF NOT RETR (FILE INPUT)
          RJ     CEC         CHECK FOR EXTRANEOUS ZERO CHARACTERS 
          EQ     GCHX        EXIT 
 GETBWRD  SPACE  4,10 
**        GETBWRD - GET NEXT WORD FROM THE INPUT BLOCK. 
* 
*         ENTRY  (NXTBWRD) = OFFSET OF NEXT WORD IN INPUT BLOCK,
*                (BUFFAD)  = ADDRESS OF BLOCK,
*                (WDCNT)   = TOTAL WORDS IN BLOCK STARTING FROM 0.
* 
*         EXIT   TO RCH2B, (X6) = NEXT WORD 
*                TO RCH6,  IF VALID END OF BUFFER.
* 
*         NOTE - THIS ROUTINE IS JUMPED TO AND FROM IE NO *RJ*. 
* 
*         USES   X - 1, 2, 6, 7.
*                A - 1, 2, 6, 7.
*                B - 7. 
* 
  
 GETBWRD  BSS    0           ENTRY
          SA2    NXTBWRD     (X2) = OFFSET OF NEXT WORD TO GET
          SA1    WDCNT       (X1) = TOTAL WORDS IN BLOCK
          SB7    X2 
          IX1    X1-X2
          SA2    BUFFAD      (X2) = START ADDRESS OF BLOCK
          NG     X1,GBWRD1   EXIT IF NO MORE WORDS IN BUFFER
          SA1    X2+B7       (X1) = NEXT WORD FROM BUFFER 
          SX7    B7+B1       BUMP POINTER 
          BX6    X1 
          SA7    NXTBWRD
          EQ     RCH2B       EXIT 
  
 GBWRD1   ZR     X5,RCH6     EXIT IF NO BYTE SPLIT ACROSS BLOCK 
          SX5    MSGA        * FFSCFIO - INVALID INPUT BLOCK RECEIVED.* 
          RJ     ABTRTNE     NO RETURN
  
 GETCLD   SPACE  4,10 
**        GETCLD - GET NEXT WORD OF CATLIST DATA. 
* 
*         ENTRY  (NXTCWRD) = OFFSET OF NEXT WORD IN PBUF, 
*                (PBUF)    = CATLIST DATA BUFFER, 
*                (WDCNT)   = TOTAL WORDS IN BLOCK STARTING FROM 0.
* 
*         EXIT   (X6)      = NEXT WORD, 
*                            AND EXIT TO RCH2B IF NOT END OF CATLIST. 
* 
*                (X6)      = 0
*                            AND EXIT TO RCH5 IF END OF CATLIST.
* 
*         NOTE - THIS ROUTINE IS JUMPED TO AND FROM IE NO *RJ*. 
* 
*         USES   X - 1, 2, 6, 7.
*                A - 1, 2, 6, 7.
*                B - 7. 
* 
  
 GETCLD   BSS    0           ENTRY
 GETCLD0  SA2    NXTCWRD     (X2) = OFFSET OF NEXT WORD TO GET
          SA1    WDCNT       (X1) = TOTAL WORDS IN BUFFER 
          SB7    X2 
          IX1    X1-X2
          NG     X1,GETCLD1  EXIT IF NO MORE WORDS IN BUFFER
          SA1    PBUFA       (X1) = ADDRESS OF BUFFER 
          SX7    B7+B1       BUMP POINTER 
          SA1    X1+B7       (X1) = NEXT WORD FROM BUFFER 
          BX6    X1 
          SA7    NXTCWRD
          EQ     RCH2B       EXIT 
  
 GETCLD1  MX6    0
          SA2    RETSTAT     (X2) = 0 IF NO MORE CATLIST DATA 
          SA6    NXTCWRD
          ZR     X2,RCH5     EXIT IF END OF CATLIST 
          SA2    FET
          BX7    X2 
          SA7    FETADD 
          RJ     SAVREG 
          SA2    PBUFA       (X2) = ADDRESS OF BUFFER 
          BX6    X2 
          SA6    CLIST
          SA1    A6 
          RJ     =XFFSCLST   EXIT TO GET MORE CATLIST DATA
          SA1    STATMSG     CHECK FOR ERRORS 
          ZR     X1,GETCLD2 
          RJ     PTE         EXIT IF ERRORS (NO RETURN) 
  
 GETCLD2  SA1    WDCNT       (X1) = WORDS IN BUFFER AFTER CALL
          SX6    X1-1        (X6) = WDCNT AS AN OFFSET
          SA6    WDCNT
          RJ     SETREG 
          SB6    B4 
          MX5    0           SET NO PARTIAL CHARACTER 
          EQ     GETCLD0     EXIT TO GET NEXT WORD
  
 CLIST    BSS    0               PARAMETER LIST FOR FFSCLST CALL
          VFD    42/0,18/**      BUFFER ADDRESS 
          VFD    42/0,18/RETSTAT MORE-DATA FLAG ADDRESS 
 FETADD   BSS    1               FET ADDRESS
          CON    0
  
 PCH      SPACE  4,20 
**        PCH - OUTPUT CHARACTER. 
* 
*         ENTRY  (X2) = CHARACTER TO WRITE. 
*                (B3) = CURRENT POSITION IN OUTPUT WORD.
*                (B5) = OUTPUT CHARACTER LENGTH.
*                (X6) = CHARACTER COUNT.
* 
*         EXIT   (B3) = NEW POSITION IN OUTPUT WORD.
*                (CLNF) = 1 IF CHARACTER WRITTEN WAS A
*                          6 BIT DISPLAY CODE COLON.
*                (ENDF) = 1 IF EOI DETECTED.
* 
*         USES   X - 1, 2, 3, 5, 6, 7.
*                A - 1, 3, 7. 
*                B - 6, 7.
* 
*         CALLS  GCH, WCH, WTB, WZB.
* 
*         MACROS WRITEO.
  
  
 PCH      SUBR               ENTRY/EXIT 
          SX3    B5          SET BIT COUNT
          IX6    X3*X6
          SA1    NL          CHECK FOR EOL
          SB7    X6 
          BX1    X1-X2
          NZ     X1,PCH3     IF NOT EOL 
  
*         PROCESS DISPLAY CODE COLON. 
  
 PCH1     SX5    X2-ZBCH
          SA3    CLNF        GET COLON FLAG 
          NZ     X5,PCH3     IF NOT ZERO BYTE EOL 
          ZR     X3,PCH2     IF COLON FLAG NOT SET
          SX2    BLNK        SET BLANK TO GUARD COLON 
          RJ     WCH         WRITE BLANK CHARACTER
          BX7    X7-X7       CLEAR COLON FLAG 
          SA7    CLNF 
 PCH2     RJ     WZB         WRITE ZERO BYTE
          EQ     PCHX        RETURN 
  
*         WRITE CHARACTER.
  
 PCH3     BX7    X7-X7       CLEAR COLON FLAG 
          SB6    6
          NZ     X2,PCH4     IF NOT ZERO CHARACTER
          NE     B6,B7,PCH4  IF ZERO CHARACTER NOT 6 BIT COLON
          SX7    B1+         SET COLON FLAG 
 PCH4     SA7    CLNF        SAVE COLON FLAG
          RJ     WCH         WRITE CHARACTER
          EQ     PCHX        RETURN 
  
          SPACE  4,10 
**        PUTBWRD - WRITE WORD TO NAM OUTPUT BUFFER.
* 
*         ENTRY  (X6) = WORD TO WRITE TO BUFFER,
*                (NXTBWRD) = OFFSET OF NEXT WORD TO WRITE TO, 
*                (EOF) = 1 IF THIS IS THE EOF BLOCK.
* 
*         EXIT   (OUTFCR) = 0 IF NEED TO DROP OUT (FLOW CONTROLLED),
*                         = 1 IF PROCESSING CAN CONTINUE. 
* 
*         NOTE:-  THE ROUTINE USES OUTSIZ-1 (272) AS THE FULL-BUFFER
*                 TEST. THIS IS DONE TO GET AN EVEN WORD COUNT, THUS
*                 ENSURING NO BYTES WILL BE SPLIT ACROSS BLOCKS.
* 
*         USES   X - 1, 2, 3, 6.
*                A - 1, 2, 3, 6.
* 
  
 PUTBWRD  SUBR               ENTRY/EXIT 
          SA1    OUTFCR      (X1) = 1 IF NOT FLOW CONTROLLED
          SA3    CDTBUF      (X3) = ADDRESS OF OUTPUT BUFFER
          NZ     X1,PBWRD0
          SX5    MSGD        * ILLEGAL WRITE TO NAM BUFFER.*
          RJ     ABTRTNE     NO RETURN
  
 PBWRD0   SA2    NXTBWRD     (X2) = OFFSET OF NEXT WORD TO WRITE TO 
          SX1    OUTSIZ-1-1  (X1) = TOTAL AVAILABLE WORDS (FROM 0)
          IX3    X2+X3
          SA6    X3          SET WORD IN OUTPUT BUFFER
          SX6    X2+B1
          IX2    X1-X6
          PL     X2,PBWRD1   EXIT IF MORE SPACE IN BUFFER 
          RJ     SAVREG 
          SX7    B7 
          SA1    PLIST3 
          SA7    SAVEB7      SAVE OUTPUT BIT COUNT
          RJ     =XFFSUSOB   EXIT TO SEND OUTPUT BUFFER VIA TCP 
          RJ     SETREG 
          SA1    SAVEB7 
          SB7    X1 
          MX6    0           RESET BUFFER POINTER 
  
 PBWRD1   SA6    NXTBWRD
          EQ     PUTBWRDX    RETURN 
  
 SAVEB7   BSS    1
          SPACE  4,15 
**        PTE - PROCESS TRANSLATION ERROR.
* 
*         ENTRY  (X2) = CHARACTER CODE, RIGHT JUSTIFIED.
*                (X5) = INDEX VALUE FOR 6/12 CHARACTERS.
* 
*         USES   X - 1, 6.
*                A - 1, 6.
* 
*         NOTE:- THIS ROUTINE DOES NOT RETURN - IT EXITS TO FCO8. 
* 
  
  
 PTE      SUBR               ENTRY/EXIT 
*         SA1    ERCT        GET ERROR COUNT
*         SA3    ERLM        GET ERROR LIMIT
*         SX6    X1+B1       INCREMENT ERROR COUNT
*         SA6    A1+
*         IX6    X3-X6
*         NG     X6,PTEX     IF ERROR LIMIT EXCEEDED, RETURN
          SX6    550         ERROR CODE 
          SA6    STATMSG     SET STATUS MESSAGE NUMBER
          EQ     FCO8        EXIT 
  
          SPACE  4,10 
**        RCH - READ CHARACTER. 
* 
*         ENTRY  (B2) = CURRENT POSITION IN INPUT WORD. 
*                (B4) = INPUT CHARACTER LENGTH. 
*                (IWRD) = CURRENT INPUT WORD. 
* 
*         EXIT   (X2) = CHARACTER READ, RIGHT JUSTIFIED,
*                     = -1 IF END OF BLOCK WHILE RECEIVING. 
*                (B2) = NEW POSITION IN INPUT WORD. 
*                (IWRD) = CURRENT INPUT WORD. 
*                (CURRIN) UPDATED IF CHAR RETURNED. 
* 
*         USES   X - 0, 1, 2, 3, 5, 6, 7. 
*                A - 1, 2, 3, 6, 7. 
*                B - 2, 6, 7. 
* 
*         CALLS  STB. 
* 
*         MACROS READ, READO, RECALL. 
  
  
 RCH      SUBR               ENTRY/EXIT 
          SA3    BYTESIN     (X3) = FILE (RETR)/BLOCK (STOR) COUNT
          ZR     X3,RCH00    EXIT IF BYTE COUNT NOT USED
          SA1    CURRIN      (X1) = COUNT TO DATE 
          IX7    X1-X3
          PL     X7,RCH6     EXIT IF NO MORE BYTES THIS BLOCK 
  
 RCH00    GT     B4,B2,RCH1  IF NO WHOLE CHARACTERS LEFT IN WORD
          MX0    1           BUILD MASK 
          SB7    B4-B1
          SA1    IWRD        GET INPUT WORD 
          AX0    B7 
          BX2    X0*X1       EXTRACT CHARACTER
          BX6    -X0*X1      DELETE CHARACTER FROM INPUT WORD 
          LX2    B4 
          LX6    B4 
          SB2    B2-B4
 RCH0     SA6    IWRD        SAVE INPUT WORD
          SA3    CURRIN 
          SX1    B1 
          IX7    X3+X1
          SA7    A3+         BUMP CURRENT BYTE COUNT
          EQ     RCHX        RETURN 
  
 RCH1     SB6    B4 
          BX5    X5-X5
          ZR     B2,RCH2     IF INPUT WORD EMPTY
          SA1    IWRD        GET INPUT WORD 
          SB6    B4-B2       COMPUTE REMAINDER
          LX5    X1,B4       SET PARTIAL CHARACTER
 RCH2     SA1    FET         ***CODE MODIFIED IF RECEIVING DATA***
          EQ     RCH2A
*         EQ     GETBWRD     JUMP TO GET WORD FROM INPUT BUFFER 
*                            RETURNS TO RCH2B OR RCH6 
*         EQ     GETCLD      EXIT TO GET WORD OF CATLIST DATA 
*                            RETURNS TO RCH2B OR RCH5 
  
 RCH2A    READO  X1          READ NEXT WORD 
          NZ     X1,RCH3     IF EOR, EOF, OR EOI
 RCH2B    MX0    1           BUILD MASK 
          SB7    B6-B1
          AX0    B7 
          BX2    X0*X6       EXTRACT PARTIAL CHARACTER
          BX6    -X0*X6      DELETE USED BITS 
          LX2    B6 
          LX6    B6 
          BX2    X5+X2
          SB2    60D         RESET CURRENT POSTION
          SB2    B2-B6
          EQ     RCH0        EXIT TO BUMP BYTE COUNT
  
 RCH3     NG     X1,RCH4     IF EOF OR EOI
          SA2    FET
          READ   X2,R 
*         SX2    EORC        SET EOR CHARACTER
          SB2    B0+         SET CURRENT INPUT WORD EMPTY 
          EQ     RCH00       IGNORE EOR'S 
  
 RCH4     SX1    X1+1 
          NG     X1,RCH5     IF EOI 
          SA3    RDEOI       (X3) = 1 IF TO READ TO EOI 
          ZR     X3,RCH5     EXIT NO READ-TO-EOI
          SA2    FET
          READ   X2,R 
*         SX2    EOFC        SET EOF CHARACTER
          SB2    B0+         SET CURRENT INPUT WORD EMPTY 
          EQ     RCH00       IGNORE EOF'S 
  
 RCH5     SX2    EOIC        SET EOI CHARACTER
          EQ     RCHX        RETURN 
  
*         END OF BLOCK WHILE RECEIVING DATA 
  
 RCH6     MX2    59          SET NEGATIVE 
          BX6    X6-X6
          SB2    B0+         SET CURRENT INPUT WORD EMPTY 
          SA6    NXTBWRD     ZERO CURRENT BUFFER POSITION 
          EQ     RCHX        RETURN 
 RTD      SPACE  4,10 
**        RTD - RETR 8/12 ASCII DATA. 
* 
*         READ 8/12 ASCII DATA FROM DISK, PACK 7.5 CHARACTERS PER 60 BIT
*         WORD AND WRITE TO NETWORK OUTPUT BUFFER.
* 
*         CALLS  WCH. 
  
  
 RTD      SUBR               ENTRY / EXIT 
  
*         GET NEXT CHARACTER. 
  
 RTD1     LE     B4,B2,RTD5  IF CHARACTER LEFT IN INPUT WORD
          SA2    FET
          READO  X2          READ NEXT WORD 
          SA6    IWRD 
          SB2    60          RESET CURRENT POSITION 
          ZR     X1,RTD5     IF NOT EOR, EOF, OR EOI
          NG     X1,RTD3     IF EOF OR EOI
 RTD2     READ   X2,R 
          SB2    B0 
          EQ     RTD1        IGNORE EOR 
  
 RTD3     SX1    X1+1 
          NG     X1,RTD4     IF EOI 
          SA3    RDEOI
          NZ     X3,RTD2     IF READ-TO-EOI SET 
 RTD4     SX2    EOIC 
          RJ     WCH         PROCESS EOI
          EQ     RTDX        EXIT 
  
 RTD5     SA1    IWRD        GET INPUT WORD 
          MX0    -12
          LX1    12 
          BX2    -X0*X1      EXTRACT CHARACTER
          SB2    B2-B4
          BX6    X0*X1       DELETE CHARACTER FROM INPUT WORD 
          SA6    A1 
          NZ     X2,RTD7     IF NOT ZERO CHARACTER
  
*         PROCESS ZERO CHARACTER. 
  
          SA1    IWRD        GET INPUT WORD 
          NZ     X1,RTD7     IF MORE CHARACTERS IN WORD 
          SA3    PL          GET INPUT LINE TERMINATOR
          SX3    X3-ZBCH
          ZR     X3,RTD6     IF INPUT LINE TERMINATOR = ZERO BYTE 
          RJ     CEC         CHECK FOR EXTRANEOUS ZERO CHARACTERS 
          SX1    X2-EOIC
          NZ     X1,RTD7     IF NOT EOI 
          RJ     WCH         PROCESS EOI CHARACTER
          EQ     RTDX        EXIT 
  
*         PROCESS ZERO-BYTE CHARACTER.
  
 RTD6     SA1    TCVT+ZBCH   TRANSLATE ZERO-BYTE CHARACTER
          SB2    B0          SET CURRENT INPUT WORD EMPTY 
          SX6    B1+B1       SET CHARACTER COUNT
          SB7    B5+B5       SET CHARACTER BIT COUNT
          SX2    X1 
          EQ     RTD8        STORE CHARACTER
  
*         TRANSLATE CHARACTER.
  
 RTD7     MX0    -9 
          BX2    -X0*X2      TRUNCATE TOP 3 BITS
          SX6    B1          SET CHARACTER COUNT
          SB7    B5          SET CHARACTER BIT COUNT
  
*         STORE CHARACTER IN NETWORK OUTPUT BUFFER. 
  
 RTD8     LE     B7,B3,RTD9  IF ROOM IN CURRENT WORD
          RJ     WCH         PROCESS CHARACTER SPLIT ACROSS WORD
          SA2    OUTFCR 
          NZ     X2,RTD1     IF OUTPUT FLOW CONTROL NOT SET 
          EQ     RTDX        RETURN 
  
 RTD9     SA1    OWRD        GET OUTPUT WORD
          SB3    B3-B7       DECREMENT CURRENT POSITION 
          LX2    B3 
          BX7    X1+X2
          SA7    A1 
          SA1    BYTESOUT    INCREMENT BYTE COUNT 
          IX7    X6+X1
          SA7    A1 
          EQ     RTD1        PROCESS NEXT CHARACTER 
 R6D      SPACE  4,10 
**        R6D - RETR / LIST 6 BIT CHARACTER DATA. 
* 
*         READ 6 BIT DATA (DISPLAY OR 6/12 ASCII) FROM DISK, TRANSLATE
*         TO 8 BIT ASCCI PACKED 7.5 CHARACTERS PER 60 BIT WORD AND
*         WRITE TO NETWORK OUTPUT BUFFER. 
* 
*         CALLS  RCH, WCH.
  
  
 R6D      SUBR               ENTRY / EXIT 
  
*         GET NEXT CHARACTER. 
  
 R6D1     LE     B4,B2,R6D2  IF WHOLE CHARACTER LEFT IN WORD
          RJ     RCH         READ CHARACTER 
          ZR     X2,R6D3     IF ZERO CHARACTER
          SX1    X2-EOIC
          NZ     X1,R6D6     IF NOT EOI 
          RJ     WCH         PROCESS EOI
          EQ     R6DX        EXIT 
  
 R6D2     SA1    IWRD        GET INPUT WORD 
          MX0    -6 
          LX1    6
          BX2    -X0*X1      EXTRACT CHARACTER
          SB2    B2-B4
          BX6    X0*X1       DELETE CHARACTER FROM INPUT WORD 
          SA6    A1 
          NZ     X2,R6D6     IF NOT ZERO CHARACTER
  
*         DETERMINE IF ZERO CHARACTER IS COLON OR ZERO BYTE EOL.
  
 R6D3     SA1    IWRD        GET INPUT WORD 
          NZ     X1,R6D6     IF MORE CHARACTERS IN WORD 
          SB7    B2+B4
          SB6    12D
          GE     B7,B6,R6D4  IF ROOM FOR ZERO BYTE
          RJ     RCH         READ NEXT CHARACTER
          SA1    IWRD        GET NEW INPUT WORD 
          NZ     X2,R6D5     IF NOT ZERO CHARACTER
          NZ     X1,R6D5     IF NOT ZERO BYTE 
  
*         PROCESS ZERO BYTE CHARACTER.
  
 R6D4     SA1    TCVT+ZBCH   GET CONVERSION TABLE ENTRY 
          SB7    B5+B5       SET BIT COUNT
          SX6    B1+B1       SET CHARACTER COUNT
          SB2    B0          SET INPUT WORD EMPTY 
          SX2    X1          EXTRACT DATA ITEM
          EQ     R6D9        STORE CHARACTER
  
 R6D5     LX2    -6          PUT READ-AHEAD CHAR BACK IN INPUT WORD 
          LX1    -6 
          BX6    X2+X1
          SA6    A1 
          SB2    B2+B4
          BX2    X2-X2       RESET CHARACTER TO ZERO
  
*         TRANSLATE CHARACTER TO 8 BIT ASCII. 
  
 R6D6     SA1    TCVT+X2     GET CONVERSION TABLE ENTRY 
          MX0    2
          SX2    X1          EXTRACT DATA ITEM
          SX6    B1          SET CHARACTER COUNT
          SB7    B5+         SET BIT COUNT
          BX3    X0*X1       EXTRACT OPTION 
          ZR     X3,R6D9     IF NORMAL CONVERSION 
          NG     X3,R6D7     IF SET INDEX OPTION
          ZR     X2,R6D1     IF CHARACTER TO BE IGNORED 
          RJ     PTE         PROCESS ERROR - NEVER RETURNS
  
 R6D7     LE     B4,B2,R6D8  IF WHOLE CHARACTER LEFT IN INPUT WORD
          BX6    X2          SET INDEX
          SA6    INDX 
          RJ     RCH         GET NEXT CHARACTER 
          SA1    INDX 
          IX2    X1+X2       FORM TABLE ENTRY 
          EQ     R6D6        TRANSLATE CHARACTER
  
 R6D8     SA1    IWRD        GET INPUT WORD 
          MX0    -6 
          LX1    6
          BX3    -X0*X1      EXTRACT CHARACTER
          SB2    B2-B4
          BX6    X0*X1       DELETE CHARACTER FROM INPUT WORD 
          SA6    A1 
          IX2    X2+X3       FORM TABLE ENTRY 
          EQ     R6D6        TRANSLATE CHARACTER
  
*         STORE CHARACTER IN NETWORK OUTPUT BUFFER. 
  
 R6D9     LE     B7,B3,R6D10 IF ROOM IN CURRENT WORD
          RJ     WCH         PROCESS CHARACTER SPLIT ACROSS WORD
          SA2    OUTFCR 
          NZ     X2,R6D1     IF OUTPUT FLOW CONTROL NOT SET 
          EQ     R6DX        RETURN 
  
 R6D10    SA1    OWRD        GET OUTPUT WORD
          SB3    B3-B7       DECREMENT CURRENT POSITION 
          LX2    B3 
          BX7    X1+X2
          SA7    A1 
          SA1    BYTESOUT    INCREMENT BYTE COUNT 
          IX7    X6+X1
          SA7    A1 
          EQ     R6D1        PROCESS NEXT CHARACTER 
 R8D      SPACE  4,10 
**        R8D - RETRIEVE 8-BIT DATA 
* 
*         ENTRY  (PBUF)   = BUFFER OF ASCII88 DATA. 
* 
*         EXIT  (STATMSG) = 0 IF FLOW CONTROL SET 
*                         = 226 IF EOF/EOI, 
*                         = 550 IF ERROR DETECTED (EXIT THRU PTE).
* 
*                THE FILE IS EITHER FULLY SENT OR FLOW CONTROL
*                HAS BEEN SET, OR A DISK ERROR HAS OCCURRED (AND
*                ANY ERROR MESSAGE IS SET IN PFM$TEXT). 
* 
*         CALLS  FFSUSOB, FFSUPEF 
* 
* 
  
 R8D      SUBR               ENTRY/EXIT 
 R8D0     RJ     GBD         EXIT TO GET A BUFFER OF DATA 
          SA3    CDTBUF      (X3) = ADDRESS OF OUTPUT BUFFER
          READW  X2,X3,B7    READ BLOCK TO NAM BUFFER 
          SX1    X1+3        CHECK FOR DISK ERRORS
          NZ     X1,R8D1
          RJ     PTE         EXIT IF DISK ERRORS - NO RETURN
  
 R8D1     NZ     X5,R8D3     EXIT IF EOF/EOI (SET IN GBD) 
          SX4    BPNB        BYTES PER FULL NAM BUFFER
          SA1    BYTESOUT    (X1) = TOTAL BYTES SENT SO FAR 
          IX7    X1+X4
          MX6    0
          SA7    A1          BUMP OUTPUT BYTE COUNT 
          SA6    EOF
          SA1    PLIST3 
          RJ     =XFFSUSOB   EXIT TO SEND BUFFER TO NAM 
          SB1    1
          SA1    OUTFCR 
          NZ     X1,R8D0     EXIT TO GET MORE IF NO FLOW CONTROL
          MX6    0
          SA6    STATMSG
          EQ     R8DX        RETURN 
  
 R8D3     SA3    CDTBUF      (X3) = ADDRESS OF OUTPUT BUFFER
          SB7    X3 
          SX6    B6-B7       (X6) = WORDS TRANSFERRED 
          SA6    WDCNT
          RJ     =XFFSUPEF   EXIT TO PROCESS FINAL BLOCK
          SB1    1
          SX6    226D 
          SX7    B1 
          SA6    STATMSG
          SA7    ENDF 
          EQ     R8DX        RETURN 
 SAVREG   SPACE  4,15 
**        SAVREG - SAVE REGISTERS 
* 
*         ENTRY 
* 
*         EXIT   REGISTERS USED IN TRANSFER ARE SAVED.
* 
*         USES   X - 6, 7.
*                A - 6, 7.
  
 SAVREG   SUBR               ENTRY/EXIT 
          SX6    B2 
          SA6    CPIW        (X6) = CURRENT POSITION IN INPUT WORD
          SX7    B3 
          SA7    CPOW        (X7) = CURRENT POSITION IN OUTPUT WORD 
          SX6    B4 
          SA6    ICL         (X6) = INPUT CHARACTER LENGTH
          SX7    B5 
          SA7    OCL         (X7) = OUTPUT CHARACTER LENGTH 
          SX6    A0 
          SA6    CTAB        (X6) = CONVERSION TABLE ADDRESS
          EQ     SAVREGX     RETURN 
  
 SETREG   SPACE  4,15 
**        SETREG - SET REGISTERS
* 
*         ENTRY 
* 
*         EXIT   REGISTERS USED IN TRANSFER ARE SET 
* 
*         USES   X - 1, 2.
*                A - 1, 2, 3. 
  
 SETREG   SUBR               ENTRY/EXIT 
          SB1    1
          SA1    CPIW 
          SB2    X1          (B2) = CURRENT POSITION IN INPUT WORD
          SA2    CPOW 
          SB3    X2          (B3) = CURRENT POSITION IN OUTPUT WORD 
          SA1    ICL
          SB4    X1          (B4) = INPUT CHARACTER LENGTH
          SA2    OCL
          SB5    X2          (B5) = OUTPUT CHARACTER LENGTH 
          SA3    CTAB 
          SA0    X3          (A0) = CONVERSION TABLE ADDRESS
          SB7    A0 
          EQ     SETREGX     RETURN 
  
 SCD      SPACE  4,10 
**        SCD - STOR / APPE CHRACTER DATA.
* 
*         READ 7.5 ASCII DATA FROM NETWORK INPUT BUFFER, TRANSLATE, 
*         AND WRITE TO DISK.
* 
*         CALLS  RCH, PTE, TCH, WCH, WZB. 
  
  
 SCD      SUBR               ENTRY / EXIT 
          SA1    INDX 
          NZ     X1,SCD6     IF 2X LENGTH CHARACTER FROM PREVIOUS BLOCK 
  
*         GET NEXT CHARACTER. 
  
 SCD1     LE     B4,B2,SCD2  IF WHOLE CHARACTER LEFT IN INPUT WORD
          RJ     RCH         READ CHARACTER 
          PL     X2,SCD4     IF NOT EOB 
          EQ     SCDX        EXIT 
  
 SCD2     SA3    BYTESIN
          SA4    CURRIN 
          IX7    X4-X3
          NG     X7,SCD3     IF MORE BYTES IN BLOCK 
          RJ     RCH         PROCESS EOB
          EQ     SCDX        EXIT 
  
 SCD3     SA1    IWRD        GET INPUT WORD 
          MX0    -8 
          LX1    8
          BX2    -X0*X1      EXTRACT CHARACTER
          SB2    B2-B4
          BX6    X0*X1       DELETE CHARACTER FROM INPUT WORD 
          SA6    A1          SAVE INPUT WORD
          SX7    B1 
          IX7    X4+X7       INCREMENT CURRENT BYTE COUNT 
          SA7    A4+
  
*         TRANSLATE CHARACTER.
  
 SCD4     SA1    TCVT+X2     GET CONVERSION TABLE ENTRY 
          SX2    X1          EXTRACT DATA ITEM
          MX0    2
          BX3    X0*X1       EXTRACT OPTION 
          MX0    -3 
          LX1    59-53
          BX6    -X0*X1      GET COUNT
          ZR     X3,SCD9     IF NORMAL CONVERSION 
          NG     X3,SCD5     IF SET INDEX OPTION
          ZR     X2,SCD1     IF CHARACTER TO BE IGNORED 
          RJ     PTE         PROCESS ERROR - NEVER RETURNS
  
*         PROCESS ESCAPE CHARACTER (<CR>) - POSSIBLE END-OF-LINE. 
  
 SCD5     BX6    X2          SET INDEX
          SA6    INDX 
 SCD6     RJ     RCH         GET NEXT CHARACTER 
          NG     X2,SCDX     IF EOB WHILE RECEIVING DATA
          BX7    X2 
          RJ     TCH         TRANSLATE CHARACTER
          NG     X2,SCD1     IF CHARACTER IS TO BE IGNORED
          SA1    NL 
          SX1    X1-ZBCH
          NZ     X1,SCD9     IF NOT USING ZERO-BYTE EOLS
  
*         PROCESS SPECIAL CASE - <CR><CR>.
  
          SA1    TCVT+X7
          PL     X1,SCD7     IF NOT ESCAPE CHARACTER (<CR>) 
          SX7    X1 
          SA7    INDX        SET INDEX
          AX6    1           REDUCE CHARACTER COUNT BY 1
          AX2    12          DROP OFF SECOND <CR> 
          SX3    B5          SET BIT COUNT
          IX7    X3*X6
          SB7    X7 
          RJ     WCH         OUTPUT SINGLE <CR> 
          EQ     SCD6        PROCESS ESCAPE CHARACTER 
  
*         PROCESS ZERO BYTE END-OF-LINE.
  
 SCD7     SX5    X2-ZBCH
          NZ     X5,SCD9     IF NOT ZERO BYTE-EOL 
          SA3    CLNF 
          ZR     X3,SCD8     IF COLON FLAG NOT SET
          SB7    6
          SX2    BLNK 
          RJ     WCH         STORE BLANK TO GUARD COLON 
          BX7    X7-X7
          SA7    CLNF        CLEAR COLON FLAG 
 SCD8     RJ     WZB         WRITE ZERO-BYTE EOL
          EQ     SCD1        PROCESS NEXT CHARACTER 
  
*         STORE CHARACTER.
  
 SCD9     SX3    B5          SET BIT COUNT
          IX7    X3*X6
          SB7    X7 
          BX7    X7-X7       CLEAR COLON FLAG 
          NZ     X2,SCD10    IF NOT ZERO CHARACTER
          SB6    6
          NE     B6,B7,SCD10 IF ZERO CHARACTER NOT 6 BIT COLON
          SX7    B1+         SET COLON FLAG 
 SCD10    SA7    CLNF        SAVE COLON FLAG
          LE     B7,B3,SCD11 IF ROOM IN CURRENT WORD
          RJ     WCH         PROCESS CHARACTER SPLIT ACROSS WORD
          EQ     SCD1        PROCESS NEXT CHARACTER 
  
 SCD11    SA1    OWRD        GET OUTPUT WORD
          SB3    B3-B7       DECREMENT CURRENT POSITION 
          LX2    B3 
          BX7    X1+X2
          SA7    A1 
          SA1    BYTESOUT    INCREMENT BYTE COUNT 
          IX7    X6+X1
          SA7    A1 
          EQ     SCD1        PROCESS NEXT CHARACTER 
 S8D      SPACE  4,20 
**        S8D - STORE 8-BIT DATA
* 
*         ENTRY  (PBUF)   = BUFFER OF ASCII88 DATA. 
* 
*         EXIT  (STATMSG) = 0 IF BLOCK PROCESSED OK,
*                         = 550 IF ERROR DETECTED (EXIT THRU PTE).
* 
* 
  
 S8D      SUBR               ENTRY/EXIT 
          SA5    FET
          NZ     B3,S8D1     EXIT IF OUTPUT WORD NOT FULL 
          WRITEW X5,OWRD,1   WRITE OUTPUT WORD
          SX1    X1+3        CHECK FOR ERRORS 
          NZ     X1,S8D0
          RJ     PTE         EXIT IF DISK ERRORS - NO RETURN
  
 S8D0     MX6    0
          SB3    60D         SET OUTPUT WORD EMPTY
          SA6    OWRD 
  
*         OUTPUT WORD EMPTY - SO TRANSFER IS WORD-ALIGNED 
  
 S8D1     SX1    B3-60D 
          NZ     X1,S8D5     EXIT IF TRANSFER NOT WORD-ALIGNED
          SA2    BUFFAD 
          SA3    WHCNT
          SX4    X3+B1       TURN OFFSET INTO WORD COUNT
          WRITEW X5,X2,X4    WRITE WHOLE WORDS TO FILE
          SX1    X1+3        CHECK FOR ERRORS 
          NZ     X1,S8D2
          RJ     PTE         EXIT IF DISK ERRORS - NO RETURN
  
 S8D2     SA1    BYTESOUT 
          SA3    BYTESIN     (X3) = BYTES IN BLOCK
          IX7    X1+X3       BUMP OUTPUT BYTE COUNT 
          SA2    WHCNT       (X2) = WHOLE WORDS COUNT (OFFSET)
          SA7    A1 
          SA1    WDCNT       (X1) = ROUNDED WORDS COUNT (OFFSET)
          IX6    X1-X2
          SB7    X1 
          SB3    60D
          ZR     X6,S8D3     EXIT IF LAST WORD COMPLETE 
          SX1    X1+B1
          BX0    X1          (X0) = TOTAL WORDS ROUNDED UP
          LX3    3           (X3) = BYTES * 8 = BITS IN BLOCK 
          LX0    4           (X0) = TOTAL WORDS * 16
          IX7    X0-X1       (X7) = TOTAL WORDS * 15
          LX7    2           (X7) = TOTAL WORDS * 60 = TOTAL BITS 
          SA4    BUFFAD 
          IX6    X7-X3       (X6) = UNUSED BITS IN LAST WORD
          SA2    X4+B7       (X2) = ACTUAL LAST WORD
          SB3    X6 
          SB6    60D
          SB7    B6-B3       (B7) = USED BITS IN LAST WORD
          MX0    1
          SB7    B7-B1
          AX0    B7 
          BX6    X0*X2       CLEAR UNUSED BITS
  
 S8D3     SX7    B3 
          SA6    OWRD        SET OUTPUT WORD
          SA7    CPOW 
          EQ     S8D7        EXIT - END OF BUFFER 
  
*         PROCESS NON-ALIGNED TRANSFER
  
 S8D5     RJ     GCH         GET NEXT CHARACTER 
          NG     X2,S8D6     EXIT IF EOB
          SX6    B1 
          RJ     PCH         OUTPUT CHARACTER 
          EQ     S8D5        LOOP FOR NEXT CHARACTER
  
 S8D6     RJ     SAVREG 
 S8D7     MX6    0
          SA6    STATMSG     SET NO STATUS
          EQ     S8DX        RETURN 
  
          SPACE  4,20 
**        TCH - TRANSLATE CHARACTER.
* 
*         ENTRY  (X2) = CHARACTER TO TRANSLATE. 
* 
*         EXIT   (X2) = NEW CHARACTER(S), RIGHT JUSTIFIED.
*                     = -1 IF CHARACTER IS TO BE IGNORED. 
*                (X6) = CHARACTER COUNT.
* 
*         USES   X - 0, 1, 2, 3, 4, 5, 6. 
*                A - 1, 5, 6. 
*                B - 6, 7.
* 
*         CALLS  ABTRTNE, PTE.
* 
  
  
 TCH      SUBR               ENTRY/EXIT 
          SA5    INDX        GET INDEX
          MX0    -9 
          BX2    -X0*X2      TRUNCATE TOP 3 BITS
          BX6    X6-X6       CLEAR INDEX
          SB7    X2 
          SA1    TCVTL       GET TABLE LENGTH 
          SB6    X1 
          SA6    A5+
          SB7    B7+X5       COMPUTE ENTRY NUMBER 
          LE     B7,B6,TCH1  IF ENTRY NEEDED IS WITHIN TABLE BOUNDS 
*         SX2    B7+
          RJ     PTE         GENERATE ERROR - NEVER RETURNS 
*         SX2    -B1         IGNORE CHARACTER 
          EQ     TCHX        RETURN 
  
 TCH1     SA1    TCVT+B7     GET CONVERSION TABLE ENTRY 
          MX0    -36         EXTRACT DATA ITEM
          BX4    -X0*X1 
          MX0    -3 
          LX1    59-53
          BX6    -X0*X1      GET COUNT
          MX0    -2 
          AX1    4
          BX3    -X0*X1      EXTRACT OPTION 
          NZ     X3,TCH3     IF NOT NORMAL CONVERSION 
          BX2    X4          SET NEW CHARACTER
          EQ     TCHX        RETURN 
  
 TCH3     SX3    X3-1 
          NZ     X3,TCH5     IF NOT NO-CONVERSION OPTION
          ZR     X4,TCH4     IF NOT AN ERROR
          RJ     PTE         PROCESS ERROR - NEVER RETURNS
 TCH4     SX2    -B1         IGNORE CHARACTER 
          EQ     TCHX        RETURN 
  
 TCH5     SX3    X3-1 
          NZ     X3,TCH6     IF NOT SET INDEX OPTION
          BX6    X4          SET INDEX
          SA6    INDX 
          SX2    -B1         IGNORE CHARACTER 
          EQ     TCHX        RETURN 
  
 TCH6     SX5    MSGB        * FFSCFIO - BAD CHAR CONVERSION TABLE.*
          RJ     ABTRTNE
  
 WCH      SPACE  4,15 
**        WCH - WRITE CHARACTER.
* 
*         ENTRY  (X2) = CHARACTER TO WRITE. 
*                (B3) = CURRENT POSITION IN OUTPUT WORD.
*                (B5) = OUTPUT CHARACTER LENGTH.
*                (B7) = BITS TO OUTPUT. 
* 
*         EXIT   (B3) = NEW POSITION IN OUTPUT WORD.
*                (ENDF) = 1 IF EOI DETECTED.
*                (OUTFCR) = 0 IF FLOW CONTROLLED, 1 IF NOT. 
*                (BYTESOUT) - UPDATED FOR BYTES WRITTEN.
* 
*         USES   X - 0, 1, 2, 3, 5, 6, 7. 
*                A - 1, 2, 3, 5, 6, 7.
*                B - 3, 6, 7. 
* 
*         MACROS WRITEF, WRITEO, WRITER.
  
  
 WCH17    SX7    B1+         SET END FLAG 
          SA7    ENDF 
  
 WCH      SUBR               ENTRY/EXIT 
          SA1    OWRD        GET OUTPUT WORD
          SX5    X2-EOIC
          NZ     X5,WCH7     IF NOT EOI 
          SA3    EVENT       (X3) = 1,2 FOR APPE/STOR 
          SB6    B3-60D 
          SX2    X3-3 
          ZR     X3,WCH14    EXIT IF RETR 
          ZR     X2,WCH14    EXIT IF LIST 
  
*         PROCESS EOI ON APPE/STOR (= EOF RECEIVED ON INPUT). 
  
          ZR     B6,WCH3     IF OUTPUT WORD EMPTY 
          SA2    TRUNC       (X2) = 1 IF TRUNCATION IN EFFECT 
          ZR     X2,WCH2     EXIT IF NO TRUNCATION
          SB6    B6+4 
          ZR     B6,WCH3     EXIT IF ONLY 4 BITS IN OUTPUT WORD 
  
 WCH2     BX6    X1 
          SB3    60D         RESET CURRENT POSITION 
          SA1    FET
          WRITEO X1 
          BX7    X7-X7       CLEAR OUTPUT WORD
          SA7    OWRD 
  
 WCH3     SA5    FET
          RECALL X5 
          SA3    X5+2         GET *IN* POINTER
          SA2    X5+3         GET *OUT* POINTER 
          IX3    X3-X2
          ZR     X3,WCH17    IF NO MORE WORDS TO WRITE
          WRITER X5          FLUSH BUFFER 
          EQ     WCH17       SET END FLAG 
  
*         WRITE CHARACTER.
  
 WCH7     GT     B7,B3,WCH8  IF NOT ENOUGH ROOM FOR CHARACTER IN WORD 
          SB3    B3-B7       DECREMENT CURRENT POSITION 
          LX2    B3 
          BX6    X1+X2
          SA6    OWRD        SAVE OUTPUT WORD 
          EQ     WCH13       EXIT TO BUMP OUTPUT BYTE COUNT 
  
*         START A NEW OUTPUT WORD.
  
 WCH8     SB6    B7          SET DEFAULT REMAINDER
          BX6    X1          (X6) = OUTPUT WORD 
          ZR     B3,WCH10    IF NO ROOM IN WORD 
          SB6    B7-B3       FORM AND INSERT PARTIAL CHARACTER
          AX3    X2,B6
          BX6    X1+X3
  
 WCH9     LT     B3,B5,WCH10 EXIT IF NO FULL BYTE OUTPUT
          SX7    B1 
          SA1    BYTESOUT 
          SB3    B3-B5       ADJUST BITS WRITTEN TO THIS WORD 
          IX7    X1+X7       BUMP BYTES WRITTEN 
          SB7    B7-B5       ADJUST TOTAL BITS WRITTEN
          SA7    A1 
          EQ     WCH9        EXIT TO CHECK IF MORE FULL BYTES OUTPUT
  
 WCH10    SB3    60D         RESET CURRENT POSITION 
          MX0    1
          SB3    B3-B6       DECREMENT CURRENT POSITION 
          SB6    B6-B1
          LX2    B3 
          AX0    X0,B6
          BX7    X0*X2       SET NEW OUTPUT WORD
          SA7    OWRD 
 WCH11    SA3    FET         ***CODE MODIFIED FOR RETR PROCESSING***
 WCH12    WRITEO X3          STOR,APPE - WRITE WORD TO FILE 
*         RJ     PUTBWRD     RETR,LIST - WRITE WORD TO BUFFER 
*         EQ     WCH13
  
 WCH13    SX1    B7          (X1) = TOTAL BITS WRITTEN
          SX3    B5          (X3) = BITS PER OUTPUT BYTE
          IX6    X1/X3       (X6) = CHARACTERS WRITTEN
          SA1    BYTESOUT 
          IX7    X6+X1       BUMP BYTES WRITTEN 
          SA7    A1 
          EQ     WCHX        RETURN 
  
*         PROCESS EOI ON RETR/LIST (= EOF/EOI ON INPUT FILE)
  
 WCH14    SX6    B1 
          SA6    EOF         SET EOF FLAG 
          ZR     B6,WCH15    EXIT IF OUTPUT WORD EMPTY
          BX6    X1          (X6) = OUTPUT WORD 
          RJ     PUTBWRD
  
 WCH15    SA3    NXTBWRD     (X3) = OUTPUT BUFFER POINTER 
          ZR     X3,WCH16    EXIT NO DATA TO FLUSH
          SA1    PLIST3 
          RJ     =XFFSUSOB   EXIT TO ISSUE SEND DATA REQUEST
          SB1    1
 WCH16    SX6    226D        CONNECTION CLOSING, FILE ACTION COMPLETE 
          SA6    STATMSG
          EQ     WCH17       SET END FLAG 
  
 WZB      SPACE  4,15 
**        WZB - WRITE ZERO BYTE.
* 
*         ENTRY  (B3) = POSITION IN OUTPUT WORD.
* 
*         EXIT   (B3) UPDATED.
* 
*         NOTE:- 6-BIT DATA IS ONLY WRITTEN TO DISK BECAUSE ALL NETWORK 
*                OUTPUT IS 8-BIT. THUS THIS ROUTINE CONTAINS NO LOGIC 
*                TO DEAL WITH OUTPUT TO THE NAM BUFFER. 
* 
*         USES   X - 1, 6, 7. 
*                A - 1, 6, 7. 
*                B - 3. 
* 
*         MACROS WRITEO.
  
  
 WZB      SUBR               ENTRY/EXIT 
          SA1    OWRD        GET OUTPUT WORD
          SB6    12D
          BX6    X1 
          SA1    FET
          WRITEO X1 
          SB7    B3          BITS WRITTEN SO FAR
          GE     B3,B6,WZB1  IF WORD WRITTEN WAS PROPER ZERO BYTE 
          SX6    B0+
          SB7    B7+60D      BUMP BITS WRITTEN
          SA1    FET
          WRITEO X1 
 WZB1     SX1    B7          (X1) = TOTAL BITS WRITTEN
          SX6    B5          (X6) = BITS PER OUTPUT BYTE
          IX7    X1/X6       (X7) = CHARACTERS OR BYTES WRITTEN 
          SA1    BYTESOUT    (X1) = OUTPUT BYTE COUNT 
          IX6    X7+X1
          MX7    0           ZERO OUTPUT WORD 
          SA6    A1 
          SA7    OWRD 
          SB3    60D         RESET CURRENT POSITION 
          EQ     WZBX        RETURN 
  
          SPACE  4,10 
*         COMMON DECKS. 
  
  
 OPL      XTEXT  COMCCIO
 OPL      XTEXT  COMCLFM
 OPL      XTEXT  COMCRDO
 OPL      XTEXT  COMCRDW
 OPL      XTEXT  COMCSYS
 OPL      XTEXT  COMCWTO
 OPL      XTEXT  COMCWTW
  
          TITLE  FFSCPRS - SETUP FOR PROCESSING 
 FFSCPRS  SPACE  4,15 
**        FFSCPRS - SETUP FOR FILE I/O PROCESSING.
* 
*         *FFSCPRS* PREPARES FOR FILE I/O AND CHARACTER CONVERSION FOR
*         ALL THE DATA TRANSFER COMMANDS VIZ APPE, RETR & STOR. 
*         THE ROUTINE PERFORMS THE FOLLOWING FUNCTIONS:-
*           1 - SETS INPUT CHAR. SET END-OF-LINE CODE,
*           2 - SETS OUTPUT CHAR. SET END-OF-LINE CODE, 
*           3 - BUILDS A CONVERSION TABLE IF NECESSARY, 
*           4 - PERFORMS FILE POSITIONING,
*           5 - SETS INPUT & OUTPUT CHARACTER LENGTHS,
*           6 - FOR APPENDS, SETS THE LAST PRU IN THE BUFFER
*               AND SETS THE FILE READY TO ADD DIRECTLY AFTER 
*               THE LAST BYTE 
*           7 - INITIALISES VARIABLES USED BY FFSCFIO.
* 
*         CALLING SEQUENCE:-
*         FFSCSFP(LFN, CSIN, CSOUT, EVENT, BINARY, FSC, RDEOI, TRUNC, 
*                 STATUS);
* 
*         WHERE 
*                (LFN)   = FET ADDRESS OF FILE IN THE TRANSFER, 
*                (CSIN)  = INPUT CHARACTER SET TO CONVERSION, 
*                (CSOUT) = OUTPUT CHARACTER SET TO CONVERSION,
*                (EVENT) - 0 = RETR, 1 = STOR, 2 = APPE, 3 = LIST,
*                (BINARY) - 0 = CHAR MODE, 1 = BINARY MODE, 
*                (FSC)   = FILE SKIP COUNT (FOR RETR COMMAND),
*                (RDEOI) = READ TO EOI (FOR RETR COMMAND).
*                (TRUNC) = TRUE IF TRUNCATION IN EFFECT,
*                (STATUS)= RETURNED STATUS
* 
*         EXIT
*                (CTAB) = FWA CONVERSION TABLE. 
*                       = 0 IF NO CONVERSION NEEDED.
*                (CPIW) = CURRENT POSITION IN INPUT WORD. 
*                (CPOW) = CURRENT POSITION IN OUTPUT WORD.
*                 (ICL) = INPUT CHARACTER LENGTH. 
*                 (OCL) = OUTPUT CHARACTER LENGTH.
*              (OUCREC) = CONTROL RECORD IF EXISTS, OTHERWISE = 0 
*                (OWRD) = PARTIALLY FILLED LAST WORD FOR BINARY APPEND
*              (STATUS) = STATUS RETURNED TO CALLER 
*             (BYTESIN) = OUCBCNT IF RETR, 0 OTHERWISE. 
*            (BYTESOUT) = OUCBCNT TO DATE (APPE), 0 OTHERWISE.
* 
*         CALLS  BLD, VLC.
* 
*         MACROS ABORT. 
**
  
  
 FFSCPRS  SUBR               ENTRY/EXIT 
          SB1    1
          SA2    A1+B1       (X2) = CSIN ADDRESS
          SA3    X2          (X3) = CSIN VALUE
          SA5    OPC         (X5) = PREVIOUS CSIN VALUE 
          BX5    X5-X3
          SA4    A2+B1       (X4) = CSOUT ADDRESS 
          BX6    X3 
          MX7    0           PRESET NEW CHARACTER SET 
          SA3    X4          (X3) = CSOUT VALUE 
          NZ     X5,PRS0     EXIT IF DIFFERENT CSIN 
          SA5    ONC         (X5) = PREVIOUS CSOUT VALUE
          BX5    X5-X3
          NZ     X5,PRS0     EXIT IF DIFFERENT CHARACTER SETS 
          MX7    1           SET NO CHARACTER SET TABLE BUILD 
  
 PRS0     SA6    OPC         SAVE CSIN VALUE
          SA7    CSETBLD
          BX7    X3 
          SA7    ONC         SAVE CSOUT VALUE 
          SA2    A4+B1       (X2) = EVENT ADDRESS 
          SA3    X2          (X3) = EVENT VALUE (0-3) 
          BX6    X1          (X6) = I/O FET ADDRESS 
          SX7    X3 
          SA6    FET         SET FET ADDRESS
          SA7    EVENT       SAVE EVENT CODE
          SA6    PLIST1 
          SX7    X7-4        VALIDATE VALUE 
          SA6    PLIST2 
          NG     X7,PRS2     EXIT VALUE OK
          SX3    PRSA 
  
 PRS1     MESSAGE X3,0
          ABORT              ABORT
  
 PRS2     BSS    0
          SA5    A2+B1       (X5) = ADDRESS OF BINARY FLAG
          SA4    X5          (X4) = BINARY FLAG VALUE 
          SA2    A5+B1       (X2) = ADDRESS OF FSC VALUE
          BX6    X4 
          SA1    A2+B1       (X1) = ADDRESS OF RDEOI
          SA6    BINARY 
          SA2    X2          (X2) = FSC VALUE 
          SA4    X1          (X4) = RDEOI VALUE 
          BX7    X2 
          SA2    A1+B1       (X2) = ADDRESS OF TRUNC
          SA7    FSC
          BX7    X4 
          SA1    A2+B1       (X1) = ADDRESS OF STATUS 
          SA7    RDEOI
          SA2    X2          (X2) = TRUNC VALUE 
          BX7    X2 
          SA7    TRUNC
          BX7    X1 
          SA1    CSETBLD
          SA7    STATUS 
          ZR     X1,PRS5     EXIT IF CONVERSION TABLE BUILD NEEDED
          RJ     SETREG      SET REGISTER VALUES
          EQ     PRS25       SKIP REMAINDER OF VALIDATION 
  
*         LOAD THE CONVERSION TABLES
  
 PRS5     BSS    0
          SA1    LOADBLK
          RJ     =XFOL.LOV   EXIT TO LOAD OVERLAY 
          GE     B7,PRS5A    EXIT IF NO ERRORS
          SX7    B7 
          SA7    ERRNO       SAVE ERROR CODE
          SX3    PRSF        * OVERLAY LOAD ERROR * 
          EQ     PRS1 
  
 PRS5A    JP     B7          EXIT TO OVERLAY
  
 PRS5B    BSS    0           RETURN TO HERE FROM OVERLAY
          SA1    ENDTABA     (X1) = ADDRESS OF ENDTAB 
          SA2    PBUFA       (X2) = ADDRESS OF PBUF 
          IX3    X1-X2       (X3) = LENGTH OF OVERLAY 
          SX4    BUFSIZ 
          IX5    X4-X3
          PL     X5,PRS5C    EXIT IF BUFFER SIZE LARGE ENOUGH 
          SX3    PRSD        * OVERLAY SIZE ERROR * 
          EQ     PRS1 
  
*         SET PC/PL & NC/NL TO VALID VALUES 
  
 PRS5C    MX0    12 
          SA1    OPC         (X1) = CSIN VALUE
          SA2    TCSD        TABLE OF CHAR SET DESIGNATIONS 
          BX1    X0*X1
          SX3    PRSC        *UNRECOGNISED CODE SET PARAMETER*
 PRS6     ZR     X2,PRS1     IF END OF TCSD TABLE 
          BX6    X1-X2
          ZR     X6,PRS7     IF LEGAL C/SET VALUE 
          SA2    A2+3 
          EQ     PRS6        EXIT TO READ NEXT ENTRY
  
 PRS7     SA2    A2+B1       GET CHARACTER TYPE 
          BX6    X2 
          SA4    A2+B1       (X4) = LINE TERMINATOR ADDRESS 
          SA2    X4          (X2) = LINE TERMINATOR 
          SA6    PC          SET PC VALUE 
          BX7    X2 
          SA1    ONC         (X1) = CSOUT VALUE 
          SA7    PL 
          BX1    X0*X1
          SA2    TCSD        TABLE OF CHAR SET DESIGNATIONS 
 PRS8     ZR     X2,PRS1     IF END OF TCSD TABLE 
          BX6    X1-X2
          ZR     X6,PRS9     IF LEGAL C/SET VALUE 
          SA2    A2+3 
          EQ     PRS8        EXIT TO READ NEXT ENTRY
  
 PRS9     SA2    A2+B1       GET CHARACTER TYPE 
          BX6    X2 
          SA4    A2+B1       (X4) = LINE TERMINATOR ADDRESS 
          SA2    X4 
          SA6    NC          SET NC VALUE 
          BX7    X2 
          SA1    CSMR        CHECK CHARACTER SET MODE 
          SA7    NL 
          NG     X1,PRS14    EXIT IF IN 64 CHARACTER MODE 
          SA2    ADTE        GET ALTERNATE TYPE TABLE ENTRIES 
          SA3    AATE 
          BX6    X2 
          BX7    X3 
          SA6    ADTP        SET ALTERNATE TYPE TABLE ENTRIES 
          SA7    AATP 
  
 PRS14    SA1    PC          CHECK FILE CHARACTERISTICS 
          SX3    PRSC        * UNRECOGNIZED CODE SET PARAMETER.*
          MX0    42 
          SA2    TCHT 
 PRS15    ZR     X2,PRS1     IF END OF *TCHT* TABLE 
          BX6    X1-X2
          BX6    X0*X6
          ZR     X6,PRS16    IF LEGAL *PC* VALUE
          SA2    A2+2 
          EQ     PRS15       READ NEXT TABLE ENTRY
  
 PRS16    SA2    A2+B1       GET FWA OF INPUT BASE TABLE
          SA1    X2 
          SB6    X1          (B6) = FWA INPUT CONVERSION TABLE
          AX2    48 
          SB4    X2          (B4) = INPUT CHAR CODE LENGTH
          SX6    B4 
          SA6    ICL
          SA1    NC 
          SA2    TCHT 
 PRS18    ZR     X2,PRS1     IF END OF *TCHT* TABLE 
          BX6    X1-X2
          BX6    X0*X6
          ZR     X6,PRS19    IF LEGAL *NC* VALUE
          SA2    A2+2 
          EQ     PRS18       READ NEXT TABLE ENTRY
  
 PRS19    SA2    A2+B1       GET FWA OF OUTPUT BASE TABLE 
          SA1    X2 
          SB7    X1          (B7) = FWA OUTPUT CONVERSION TABLE 
          AX2    48 
          SB5    X2          (B5) = OUTPUT CHAR CODE LENGTH 
          SX6    B5 
          SA6    OCL
          SA1    PL          INPUT LINE TERMINATOR
          SX6    X1 
          SB2    B4          CHARACTER LENGTH 
          SB3    B6          FWA OF CONVERSION TABLE
          RJ     VLC         VERIFY LINE TERMINATOR WITH CODE SET 
          NZ     X3,PRS1     IF AN ERROR
          SA6    PL          SAVE CONVERTED LINE TERMINATOR 
          SA1    NL          OUTPUT LINE TERMINATOR 
          SX6    X1 
          SB2    B5          CHARACTER LENGTH 
          SB3    B7          FWA OF CONVERSION TABLE
          RJ     VLC         VERIFY LINE TERMINATOR WITH CODE SET 
          NZ     X3,PRS1     IF AN ERROR
          SA6    NL          SAVE CONVERTED LINE TERMINATOR 
          SA1    PL 
          BX6    X6-X1
          SA0    B0 
          NZ     X6,PRS24    IF LINE TERMINATORS ARE DIFFERENT
          NE     B4,B5,PRS24 IF CHARACTER LENGTHS ARE DIFFERENT 
          EQ     B6,B7,PRS25 IF JUST COPY, NO CONVERSION
  
 PRS24    RJ     BLD         BUILD CONVERSION TABLE 
  
 PRS25    SX6    A0+         SAVE FWA OF CONVERSION TABLE 
          SA6    CTAB 
  
*         INITIALISE VARIABLES, 
*         PERFORM FILE POSITIONING... 
  
          BX6    X6-X6       PRESET VARIABLES 
          SA6    CLNF 
          SA6    CPIW 
          SA6    ENDF 
          SA6    ERCT 
          SA6    CECA 
          SA6    CECB 
          SA6    INDX 
          SA6    IWRD 
          SA6    NXTBWRD
          SA6    NXTCWRD
          SA6    OWRD 
          SA6    BUFFAD      ZERO CTRLREC COMMON BLOCK
          SA6    BYTESIN
          SA6    BYTESOUT 
          SA6    CURRIN 
          SA6    CURROUT
          SA6    OUCHDDR     ZERO WD0 OF CONTROL REC BUFFER 
          SA6    OUCBCNT
          SA6    OUCKSUM
          SA6    OUCPSUM
          SA6    STATMSG
          SA6    WDCNT
          SA6    OUBBIT 
          SX7    B1 
          SA7    OUTFCR      SET FLOW CONTROL RELEASE 
          SX6    -B1
          SA6    RAHD        SET NO READ-AHEAD WORD 
          SA2    EVENT
          SX7    BITSWORD    RESET CURRENT POSITION IN OUTPUT WORD
          SB7    X2-3 
          SA7    CPOW 
          SA1    FET         (X1) = FET ADDRESS 
          ZR     B7,PRS28    EXIT IF LIST COMMAND 
          SA2    PBUFA
          SETFET X1,(BUF=X2,PBUFL)
          SA1    EVENT       (X1) = 0, 1, OR 2
          SA2    BINARY      (X2) = 0 OR 1
          NZ     X1,PRS26    EXIT IF NOT SENDING DATA 
  
*         SENDING DATA (RETR) 
  
          ZR     X2,PRS25A   EXIT IF NOT BINARY TRANSFER
          SA1    PLIST1      PARAMETER LIST FOR CALL
          RJ     =XFFSCGCR   EXIT TO SEE IF HAVE A CONTROL RECORD 
          SA1    RETSTAT     GET RETURNED STATUS OF CALL
          NZ     X1,PRS35    RETURN WITH ERROR
          MX0    -48
          SA1    OUCBCNT
          BX7    -X0*X1      EXTRACT BYTE COUNT 
          SA7    BYTESIN
 PRS25A   SA1    RCH2RET     PERFORM CODE MODIFICATION
          SA2    WCH11RET 
          BX6    X1 
          SA1    A2+B1
          BX7    X2 
          SA6    RCH2 
          BX6    X1 
          SA7    WCH11
          SA6    A7+B1
          SA1    FET         (X1) = FET ADDRESS 
          SA5    FSC
          REWIND X1 
 PRS25B   ZR     X5,PRS25C   EXIT NO FILE SKIP COUNT
          SA1    FET
          SKIPFF X1,1,R      PERFORM FILE SKIP
          SX5    X5-1 
          EQ     PRS25B 
 PRS25C   SA1    FET
          READ   X1          READ FIRST BUFFER
          BX7    X7-X7
          EQ     PRS40       EXIT 
  
*         RECEIVING DATA (APPE/STOR)
  
 PRS26    BSS    0
          SA1    RCH2STO     PERFORM CODE MODIFICATION
          SA3    WCH11STO 
          BX6    X1 
          SA1    A3+B1
          BX7    X3 
          SA6    RCH2 
          BX6    X1 
          SA7    WCH11
          SA1    FET
          SA6    A7+B1
          REWIND X1 
          SA5    BINARY 
          ZR     X5,PRS27    EXIT NOT BINARY TRANSFER 
          SA2    =0LFTPCTRL  CONTROL RECORD HEADER
          BX7    X2 
          SA1    EVENT
          SA7    OUCHDDR     INDICATE CONTROL REC TO BE CREATED 
          LX1    59 
          MX7    0           SET EXIT CONDITION 
          NG     X1,PRS40    EXIT IF STOR COMMAND 
  
*         APPE PROCESSING - GET CTRL REC, POSITION LAST PRU IN BUFFER 
  
          BX6    X6-X6
          SA6    RETSTAT     INDICATE BINARY APPEND 
          SA1    PLIST2      PARAMETER LIST FOR CALL
          RJ     =XFFSCSFP   EXIT TO SET FILE POSITION
          SA1    RETSTAT     GET RETURNED STATUS OF CALL
          NZ     X1,PRS35    RETURN WITH ERROR
          SA1    OUCHDDR
          MX7    0           SET EXIT CONDITION 
          ZR     X1,PRS40    EXIT IF NO CONTROL RECORD
  
*         LAST PRU ON FILE IS IN PBUF.
*         NOW CALCULATE BITS USED IN LAST WORD OF THAT PRU... 
  
          SX0    BITSWORD 
          PX0    X0 
          MX1    12 
          NX0    X0          (X0) = NORMALISED F/P *60* 
          SA4    OUCBCNT
          BX2    -X1*X4      (X2) = TOTAL FILE BYTE COUNT 
          SA5    OCL         (X5) = OUTPUT CHAR LENGTH
          BX7    X2 
          DX6    X2*X5       (X6) = TOTAL BITS IN FILE
          SA7    BYTESOUT    (BYTESOUT) = BYTES SENT SO FAR 
          PX2    B0,X6       (X2) = PACKED TOTAL BITS 
          FX3    X2/X0       (X3) = PACKED TOT BITS / 60
          UX0    B1,X3
          LX2    B1,X0       (X2) = TOT WHOLE WORDS 
          SB1    1
          BX0    X2 
          LX0    4           (X0) = TOTAL WORDS * 16
          IX7    X0-X2       (X7) = TOTAL WORDS * 15
          LX7    2           (X7) = TOTAL WORDS * 60
          IX6    X6-X7       (X6) = USED BITS IN LAST WORD
          SA6    OUBBIT 
          SX1    BITSWORD 
          IX7    X1-X6
          SB3    X7          (B3) = UNUSED BITS IN LAST WORD
          SA7    CPOW 
          MX7    0
          ZR     X6,PRS40    EXIT IF EXACT WORD BOUNDARY
          SA1    FET         (X1) = FET ADDRESS 
          SA3    X1+2        (X3) = IN-POINTER WORD 
          MX0    -18
          BX4    -X0*X3 
          SX4    X4-1        (X4) = ADDRESS OF LAST USED WORD OF PRU
          SA2    X4          (X2) = LAST USED WORD OF LAST PRU
          BX6    X2 
          SA6    OWRD        (OWRD) = LAST INCOMPLETE WORD
          BX3    X0*X3       CLEAR IN-POINTER VALUE 
          IX7    X3+X4       SET NEW IN-POINTER 
          SA7    A3 
          SA2    OUBWORD     (X2) = IN - OUT (SET IN FFSCSFP) 
          MX0    59 
          IX7    X2+X0       (X7) = (X2) - 1
          SA7    A2          (X2) = TOTAL FULL WORDS IN PRU 
          SA2    OUCPSUM
          BX7    X2          (X7) = PREVIOUS CHECKSUM 
          SA7    OUCKSUM
          MX7    0
          EQ     PRS40
  
*         RECEIVING DATA, CHARACTER MODE (APPE,STOR)
  
 PRS27    BSS    0
          SA1    EVENT
          LX1    58 
          MX7    0           SET EXIT CONDITION 
          PL     X1,PRS40    EXIT IF STOR 
          SX6    B1          INDICATE CHARACTER APPEND
          SA6    RETSTAT
          SA1    PLIST2      PARAMETER LIST FOR CALL
          RJ     =XFFSCSFP   EXIT TO SET FILE POSITION
          SA1    RETSTAT     GET RETURNED STATUS OF CALL
          MX7    0           SET EXIT CONDITION 
          ZR     X1,PRS40    RETURN IF NO ERROR 
          EQ     PRS35       ERROR EXIT 
  
*         LIST COMMAND
  
 PRS28    SA1    RCH2LST     PERFORM CODE MODIFICATION
          SA3    WCH11RET    USE RETR OUTPUT ROUTINES 
          BX6    X1 
          SA1    A3+B1
          BX7    X3 
          SA6    RCH2 
          BX6    X1 
          SA7    WCH11
          SA6    A7+B1
          SX6    B1 
          MX7    0
          SA6    RETSTAT     SET MORE-DATA INDICATOR ON 
          SX6    77B
          SA6    NXTCWRD     FORCE FIRST GETCLD TO GET DATA 
          EQ     PRS40
  
*         ERROR EXIT
  
 PRS35    BSS    0           ERROR IN READING/POSITIONING FILE
          BX7    X1          RETSTAT VALUE FROM FFSCSFP 
  
 PRS40    BSS    0
          SA2    STATUS      (X2) = ADDRESS OF STATUS VARIABLE
          SA7    X2 
          EQ     FFSCPRSX    RETURN 
  
 PLIST1   BSS    1           FET ADDRESS
          VFD    42/0,18/OUCREC 
          VFD    42/0,18/RETSTAT
          CON    0
  
 CSETBLD  BSS    1           BUILD CHARACTER SET FLAG 
 ERRNO    BSSZ   1           OVERLAY LOAD ERROR 
 FSC      BSS    1           FILE SKIP COUNT
 OUBBIT   BSS    1           USED BITS IN LAST WORD 
 OUBWORD  BSS    1           CURRENT WORD IN OUTPUT BUFFER
  
 PLIST3   VFD    42/0,18/EOF
 EOF      BSS    1
  
 STATUS   BSS    1           ADDRESS OF STAT VARIABLE TO CALLER 
  
 LOADBLK  VFD    42/0,6/0,6/1,6/0    FOL.LOV PARAMETER WORD 
  
 PLIST2   BSS    1           FET ADDRESS
          VFD    42/0,18/OUBWORD
          VFD    42/0,18/OUCREC 
          VFD    42/0,18/RETSTAT
          CON    0
  
 PRSA     DATA   C* FFSCPRS - ERROR IN CALLING SEQUENCE.* 
 PRSB     DATA   C* FFSCPRS - INVALID FILE SPECIFIED.*
 PRSC     DATA   C* FFSCPRS - UNRECOGNIZED CODE SET PARAMETER.* 
 PRSD     DATA   C* FFSCPRS - OVERLAY SIZE ERROR.*
 PRSF     DATA   C* FFSCPRS - OVERLAY LOAD ERROR.*
  
*         FILINFO PARAMETER BLOCK 
  
 PRSE     VFD    42/0,6/PRSEL,12/1
          BSS    FIPBL-1
 PRSEL    EQU    *-PRSE 
  
*         THE FOLLOWING ARE INSTRUCTIONS USED IN CODE MODIFICATION
*         FOR RETRIEVE AS OPPOSED TO STORE/APPEND.
  
 RCH2RET  SA1    FET         FOR RETR INPUT 
          EQ     RCH2A
 RCH2STO  EQ     GETBWRD     FOR STOR INPUT 
 RCH2LST  EQ     GETCLD      FOR LIST INPUT 
  
 WCH11RET RJ     PUTBWRD     FOR RETR/LIST OUTPUT 
          EQ     WCH13
 WCH11STO SA3    FET         FOR APPE/STOR OUTPUT 
 WCHXXX   WRITEO X3          FORCE NEW WORD 
  
          SPACE  4,10 
  
*         INPUT CHARACTER SET DESIGNATIONS --> CHARACTER TYPE & 
*                                              LINE TERMINATOR
  
 TCSD     BSS    0
 CSD      VFD    60/0LD                DISPLAY, Z-BYTE TERMINATION
          VFD    60/0LDIS 
          VFD    42/0,18/DTRM 
 CSA      VFD    60/0LA                6/12 ASCII, Z-BYTE TERMINATION 
          VFD    60/0LASCII 
          VFD    42/0,18/DTRM 
 CS8      VFD    60/0L8                8/12 ASCII, Z-BYTE TERMINATION 
          VFD    60/0LASCII8
          VFD    42/0,18/DTRM 
 CS8E     VFD    60/0L8E               8/12 ASCII, CR-LF TERMINATION
          VFD    60/0LASCII8
          VFD    42/0,18/ITRM 
 CS88     VFD    60/0L88               8/8 ASCII, CR-LF TERMINATION 
          VFD    60/0LASCII88 
          VFD    42/0,18/ITRM 
          CON    0
  
          SPACE  4,10 
**        TCHT - CHARACTER TYPE TABLE.
* 
* T       42/CS, 18/0 
* T       12/CCL, 30/0, 18/CBTA 
* 
*         CS = CHARACTER SET NAME.
*         CCL = CHARACTER CODE LENGTH.
*         CBTA = POINTER TO CONVERSION BASE TABLE FWA.
  
  
 TCHT     BSS    0
          VFD    42/0LDIS,18/0
 ADTP     VFD    12/6,30/0,18/TD64A 
          VFD    42/0LDIS63,18/0
 ADTE     VFD    12/6,30/0,18/TD63A 
          VFD    42/0LDIS64,18/0
          VFD    12/6,30/0,18/TD64A 
          VFD    42/0LASCII,18/0
 AATP     VFD    12/6,30/0,18/TA64A 
          VFD    42/0LASCII63,18/0
 AATE     VFD    12/6,30/0,18/TA63A 
          VFD    42/0LASCII64,18/0
          VFD    12/6,30/0,18/TA64A 
          VFD    42/0LASCII8,18/0 
          VFD    12/12,30/0,18/TAS8A
          VFD    42/0LASCII88,18/0
          VFD    12/8,30/0,18/TASCA 
          VFD    42/0LICS,18/0
          VFD    12/12,30/0,18/0
          CON    0
  
          SPACE  4,10 
**        TLNT - TABLE OF LINE TERMINATORS. 
* 
* T       42/TERMINATOR NAME,18/0 
* T       1/D, 1/C, 42/0, 16/TERMINATOR VALUE(S)
* 
*         D = DOUBLE LENGTH FLAG. 
*         C = CONVERTED TERMINATOR FLAG.
  
 TLNT     BSS    0
          VFD    42/0LZB,18/0 
 DTRM     VFD    1/0,1/1,42/0,16/ZBCH 
          VFD    42/0LCR,18/0 
          VFD    1/0,1/0,42/0,16/15B
          VFD    42/0LFF,18/0 
          VFD    1/0,1/0,42/0,16/14B
          VFD    42/0LLF,18/0 
          VFD    1/0,1/0,42/0,16/12B
          VFD    42/0LUS,18/0 
 ATRM     VFD    1/0,1/0,42/0,16/37B
          VFD    42/0LRS,18/0 
          VFD    1/0,1/0,42/0,16/36B
          VFD    42/0LCRLF,18/0 
 ITRM     VFD    1/1,1/0,42/0,8/15B,8/12B 
          VFD    42/0LLFCR,18/0 
          VFD    1/1,1/0,42/0,8/12B,8/15B 
          CON    0
          SPACE  4,10 
**        BLD - BUILD TABLE.
* 
*         ENTRY  (B6) = FWA INPUT CONVERSION BASE TABLE.
*                (B7) = FWA OUTPUT CONVERSION BASE TABLE. 
*                (B4) = INPUT CHARACTER LENGTH. 
*                (B5) = OUTPUT CHARACTER LENGTH.
* 
*         EXIT   (A0) = FWA CONVERSION TABLE. 
* 
*         BUILT TABLE FORMAT
* 
*                1/ESC   1/NO   1/0, 3/COUNT  ,54/CHARACTERS
*                  CHAR,  CONV,        1=SNGL     (= 0 IF ERROR)
*                                      2=DBLE 
* 
*         USES   X - 1, 2, 3, 4, 5, 6, 7. 
*                A - 0, 1, 2, 5, 6, 7.
*                B - 2, 3, 6, 7.
  
  
 BLD      SUBR               ENTRY/EXIT 
          SB2    TLEN        SET BASE TABLE LENGTH
          SA0    TCVT        SET ADDRESS OF CONVERSION TABLE
          SX6    B2 
          MX0    5           FORM MASKS 
          MX2    -11
          MX5    -12
          SB3    B0          INITIALIZE TABLE OFFSET
          SA6    TCVTL
 BLD1     SA1    B6+B3       GET NEXT TABLE ENTRY 
          NZ     B6,BLD2     IF INPUT CHARACTER IS NOT *ICS*
          SA1    B7+B3       GET NEXT TABLE ENTRY 
          AX1    18 
 BLD2     LX1    59-17       EXTRACT FLAGS
          BX6    X0*X1
          NZ     X6,BLD3     IF EITHER FLAG IS SET
          ZR     B6,BLD3     IF INPUT CHARACTER SET IS *ICS*
          ZR     B7,BLD3     IF OUTPUT CHARACTER SET IS *ICS* 
          LX1    -59+17 
          BX1    -X2*X1      GET *ICS* CHARACTER
          SA1    B7+X1       GET CONVERSION FOR CHARACTER 
          LX1    59-35       EXTRACT FLAGS
          BX6    X0*X1
 BLD3     LX1    59-30-59+35 FORM COUNT 
          SX4    B1 
          PL     X1,BLD4     IF DOUBLE LENGTH FLAG NOT SET
          SX4    2
 BLD4     LX1    59-17-59+30 EXTRACT CHARACTER FIELD
          BX1    -X5*X1 
          LX4    54          FORM FINAL TABLE WORD
          LX6    59-32-59+35
          BX4    X4+X1
          BX6    X4+X6
          SA6    A0+B3       SAVE TABLE WORD
          SB3    B3+B1       INCREMENT TABLE POINTER
          LE     B3,B2,BLD1  IF MORE TABLE ENTRIES TO BUILD 
  
*         ADD LINE TERMINATOR CONVERSIONS TO TABLE. 
  
          SA1    PL          GET OLD LINE TERMINATOR
          SA2    NL          GET NEW LINE TERMINATOR
          SX4    1           FORM NEW LINE TERMINATOR LENGTH
          PL     X2,BLD5     IF NEW TERMINATOR IS DOUBLE LENGTH 
          SX4    2
 BLD5     MX0    1           EXTRACT CHARACTERS 
          BX6    -X0*X2 
          LX4    59-5        FORM NEW LINE TERMINATOR WORD
          BX6    X4+X6
          NG     X1,BLD6     IF OLD TERMINATOR IS DOUBLE LENGTH 
          SB3    X1 
          SA6    A0+B3       SAVE LINE TERMINATOR WORD
          EQ     BLDX        RETURN 
  
 BLD6     SA6    BLDA        SAVE NEW LINE TERMINATOR WORD
          SB3    B4-B1       FORM MASK FOR OLD CHARACTERS 
          AX0    B3 
          LX0    B4 
          BX3    X0*X1       EXTRACT SECOND CHARACTER OF OLD TERMINATOR 
          AX1    B4          EXTRACT FIRST CHARACTER OF OLD TERMINATOR
          BX1    X0*X1
          SB7    6
          SX4    TLEN+1      PRESET OFFSET TO TERMINATOR CONVERSION 
          NE     B4,B7,BLD7  IF OLD CHARACTER SET IS NOT 6/12 
          SX5    X1-74B      CHECK FOR 74B ESCAPE CODE
          SX4    200B        SET OFFSET FOR 74B ESCAPE CODE 
          ZR     X5,BLD7     IF FIRST CHARACTER IS 74B ESCAPE CODE
          SX4    300B        SET OFFSET FOR 76B ESCAPE CODE 
 BLD7     MX7    1           FORM OFFSET WORD 
          BX7    X7+X4
          SB6    X4+         SET OFFSET TO TABLE EXTENSION
          SA7    BLDB        SAVE OFFSET WORD 
          EQ     B4,B7,BLD10 IF CHARACTER SET IS 6/12 
  
*         BUILD CONVERSION TABLE EXTENSION. 
  
          SB3    B0          INITIALIZE TABLE POINTER 
          SB7    X1          (B7) = FIRST CHARACTER OF OLD TERMINATOR 
          SA4    A0+B7       TRANSLATE TERMINATOR CHARACTER 
          MX0    3           FORM MASK FOR CHARACTER COUNT
          LX0    60-3 
          BX7    X0*X4       EXTRACT CHARACTER COUNT
          MX2    -36
          SA7    BLDC        SAVE COUNT (IN BITS 54-56) 
          BX6    -X2*X4      EXTRACT CONVERTED TERMINATOR CHARACTERS
          BX2    X4          FORM ALTERATION WORD FOR DELETION ENTRY
          LX4    59-58
          PL     X4,BLD8     IF TRANSLATION FOR TERMINATOR EXISTS 
          BX7    X7-X7       CLEAR CHARACTER COUNT
          SA7    BLDC 
  
 BLD8     SA5    A0+B3       GET NEXT TABLE ENTRY 
          BX7    X0*X5       EXTRACT TRANSLATION CHARACTER COUNT
          LX7    6           POSITION CHARACTER COUNT TO BOTTOM 
          SX4    B5          (X4) = OUTPUT CHARACTER LENGTH 
          IX7    X7*X4       COMPUTE TOTAL BITS 
          SB2    X7 
          LX7    X6,B2       POSITION CONVERTED FIRST TERMINATOR CHAR.
          SA4    BLDC        (X4) = CHARACTER COUNT IN ABOVE CONVERSION 
          BX7    X5+X7       MOVE IN CURRENT CONVERTED CHARACTER
          IX7    X4+X7       BUMP FINAL CONVERSION CHARACTER COUNT
          LX5    1
          PL     X5,BLD9     IF NORMAL CONVERSION ENTRY 
          BX7    X2          USE ALTERATION WORD FOR DELETION ENTRY 
 BLD9     SB7    B6+B3       SAVE EXTENSION ENTRY 
          SA7    A0+B7
          SB3    B3+B1       INCREMENT TABLE POINTER
          LT     B3,B6,BLD8  IF TABLE EXTENSION NOT COMPLETE
          SX7    B7+         SET NEW TABLE LENGTH 
          SA7    TCVTL
 BLD10    SA4    BLDB        GET OFFSET-TO-TABLE-EXTENSION ENTRY
          SA5    BLDA        GET NEW TERMINATOR ENTRY 
          BX6    X4 
          SB2    X1 
          BX7    X5 
          SB6    B6+X3
          SA6    A0+B2       SAVE OFFSET ENTRY
          SA7    A0+B6       SAVE NEW TERMINATOR ENTRY
          EQ     BLDX        RETURN 
  
  
 BLDA     CON    0           TEMPORARY STORAGE
 BLDB     CON    0           TEMPORARY STORAGE
 BLDC     CON    0           TEMPORARY STORAGE
 VLC      SPACE  4,15 
**        VLC - VERIFY LINE TERMINATOR WITH CODE SET. 
* 
*         ENTRY  (B2) = CHARACTER LENGTH. 
*                (B3) = FWA OF CONVERSION TABLE.
*                (X1) = LINE TERMINATOR.
* 
*         EXIT   (X3) = 0 IF NO ERROR, OTHERWISE ERROR MESSAGE ADDRESS. 
*                (X6) = CONVERTED LINE TERMINATOR.
* 
*         USES   X - 1, 2, 3, 4, 5, 6.
*                A - 1, 2.
*                B - 2. 
  
 VLC6     SX3    VLCA        *CODE SET LINE TERMINATOR CONFLICT*
  
 VLC      SUBR               ENTRY/EXIT 
          SX3    B0+         PRESET TO NO ERROR 
          BX6    X1 
          LX6    59-58
          PL     X6,VLC4     IF TERMINATOR NEEDS TO BE CONVERTED
          SB2    B2-B1
          SX1    X1          REMOVE FLAGS 
          SX2    X1-ZBCH
          BX6    X1 
          NZ     X2,VLC1     IF TERMINATOR NOT ZERO BYTE
          SA5    TASCA       (X5) = ADDRESS OF TASC TABLE 
          SX2    B3 
          IX2    X2-X5
          ZR     X2,VLC6     IF CHARACTER SET IS *ASCII88*
          EQ     VLCX        RETURN 
  
 VLC1     MX6    1
          AX6    B2 
          SB2    B2+1 
          LX6    B2 
          BX5    -X6*X1 
          NZ     X5,VLC2     IF TERMINATOR LARGER THAN CHARACTER LENGTH 
          BX6    X1*X6
          EQ     VLCX        RETURN LINE TERMINATOR VALUE 
  
 VLC2     SA5    TA64A       (X5) = ADDRESS OF TA64 TABLE 
          SX2    B3 
          IX2    X2-X5
          SA5    TA63A       (X5) = ADDRESS OF TA63 TABLE 
          ZR     X2,VLC3     IF 6/12 CHARACTER SET
          SX2    B3 
          IX2    X2-X5
          NZ     X2,VLC6     IF NOT 6/12 CHARACTER SET
 VLC3     AX4    X1,B2       CHECK FIRST CHARACTER OF TERMINATOR
          SX2    X4-74B 
          ZR     X2,VLCX     IF FIRST CHARACTER IS 74B ESCAPE CODE
          SX2    X4-76B 
          ZR     X2,VLCX     IF FIRST CHARACTER IS 76B ESCAPE CODE
          EQ     VLC6        ERROR IN TERMINATOR
  
 VLC4     MX6    60-8 
          NG     X1,VLC5     IF DOUBLE LENGTH TERMINATOR
          BX1    -X6*X1 
          SA1    B3+X1       GET CHARACTER FROM TABLE 
          MX6    60-12
          AX1    18 
          BX6    -X6*X1      EXTRACT CHARACTER
          MX2    1
          LX1    59-12
          BX2    X1*X2
          BX6    X2+X6       MERGE DOUBLE LENGTH FLAG 
          MX2    60-5 
          BX1    -X2*X1      EXTRACT SPECIAL FLAGS
          NZ     X1,VLC6     IF SPECIAL FLAGS SET 
          EQ     VLCX        RETURN 
  
 VLC5     LX1    -8 
          BX2    -X6*X1 
          SA2    B3+X2       GET CHARACTER FROM TABLE 
          MX4    60-12
          AX2    18 
          BX5    -X4*X2      EXTRACT CHARACTER
          AX2    12 
          NZ     X2,VLC6     IF ANY FLAGS SET 
          LX5    X5,B2
          LX1    8
          BX2    -X6*X1 
          SA2    B3+X2
          AX2    18 
          BX6    -X4*X2      EXTRACT CHARACTER
          AX2    12 
          NZ     X2,VLC6     IF ANY FLAGS SET 
          BX6    X5+X6       MERGE CHARACTERS 
          MX1    1
          BX6    X6+X1       SET DOUBLE LENGTH FLAG 
          EQ     VLCX        RETURN 
  
  
 VLCA     DATA   C* CODE SET LINE TERMINATOR CONFLICT.* 
          SPACE  4,10 
          TITLE  BUFFERS
*         BUFFERS.
  
 TCVT     BSSZ   MCVTL       CONVERSION TABLE 
  
*         NOTE - THE BASE CONVERSION TABLES ARE LOADED AS AN OVERLAY
*         AT CTABLES. IF FURTHER TABLES ARE ADDED TO FFSCTAB, THEN
*         BUFSIZ MUST BE APPROPRIATELY ADJUSTED BY THEIR SIZE.
*         THE TABLES ARE OVERLAID AFTER USE BY THE FILE BUFFERS.
  
 CTABLES  BSS    BUFSIZ      OVERLAY ADDRESS FOR CONVERSION TABLES
  
          END 
