*COMDECK,FA=DEFS
**        I/O MACRO CODING CONVENTIONS. 
* 
*         1.  MACRO DEFINITIONS THAT ACCEPT NULL CALLING PARAMETERS 
*         SHOULD BE AVOIDED, PARTICULARLY WHEN A NULL PARAMETER IMPLIES 
*         THAT A REGISTER IS ALREADY PROPERLY LOADED.  THE ASSUMPTIONS
*         OR REGISTERS MAY HAVE TO BE CHANGED IN THE FUTURE, WHICH COULD
*         COMPEL RECODING OF ALL CALLS TO THE MACRO IF NULL PARAMETERS
*         HAVE SPECIFIC MEANINGS. 
*             THE PREFERRED TECHNIQUE IS TO REQUIRE EXPLICIT CALL 
*         PARAMETERS, AND THEN SQUEEZE OUT REDUNDANT CODE WITH THE
*         (R=) PSEUDO-OP OR OTHER METHOD. 
* 
*         2.  *USES* LISTS ONLY THE REGISTERS DESTROYED BY THE MACRO
*         CALL EXPANSION.  REGISTERS DESTROYED BY INNER MACRO OR
*         SUBROUTINE CALLS ARE LISTED IN THE DESCRIPTION OF THE CALLED
*         ITEM. 
*             THE ONLY EXCEPTION TO THIS IS THAT REGISTERS DESTROYED BY 
*         THE (R=) PSEUDO-OP SHOULD BE LISTED IN THE *USES* BLOCK OF
*         THE CALLER. 
* 
*         3.  BOTH MACRO AND SUBROUTINE CALLS ARE LISTED IN *CALLS*.
* 
*         4.  CONDITIONAL ASSEMBLY PSEUDO-OPS (IF.., ELSE, SKIP, ENDIF) 
*         ARE ALWAYS EITHER COUNT-CONTROLLED OR LABELED, TO AVOID MACRO 
*         NESTING PROBLEMS. 
*             COUNT CONTROL IS PREFERRED WHERE THE LINE COUNTS ARE
*         SMALL (.LE. 9), TO REDUCE ASSEMBLY TIME.
*             LABELING IS PREFERRED FOR LARGER LINE COUNTS, TO REDUCE 
*         THE CHANCE OF COUNT ERRORS AND TO ENHANCE CODE READABILITY. 
* 
*         5.  ADDRESS TERMINOLOGY.
*                THE FOLLOWING CONVENTIONS ARE ADOPTED FOR REFERRING
*         TO A GROUP OF CONTIGUOUS STORAGE LOCATIONS. 
*             A.  *FWA* OR FIRST WORD ADDRESS IS THE SMALLEST STORAGE 
*             ADDRESS FOR THE GROUP.
*             B.  *LWA* OR LAST WORD ADDRESS IS THE LARGEST STORAGE 
*             ADDRESS FOR THE GROUP.
*             C.  *ADDRESS*, IF NOT OTHERWISE QUALIFIED, IS THE FIRST 
*             WORD ADDRESS. 
*             D. *FWA* IS PREFERRED WHEN BOTH *FWA* AND *LWA* ARE 
*             BEING MENTIONED, TO AVOID CONFUSION.  OTHERWISE,
*             *ADDRESS* IS PREFERRED. 
*             E.  *LWA+1* IS NEVER, NEVER ABBREVIATED AS *LWA*. 
          TITLE  I/O SYSTEM SYMBOLS 
          SPACE  4
 #RM      IFEQ   CP#RM,0
          SPACE  4,8
****      FET STRUCTURE AND WORD OFFSETS. 
* 
* 
*              OFFSET        CONTENTS 
*              ------        -------- 
  
 I.FET    =      0           42/EXTERNAL LFN, 18/CIO CODE AND STATUS
 I.FIRST  =      1           36/0, 6/FET LEN - 5, 18/FIRST
 I.DT     =      1           12/DEVICE TYPE,48/0
 I.IN     =      2           60/IN
 I.OUT    =      3           60/OUT 
 I.LIMIT  =      4           42/0,18/LIMIT
 I.PRU    =      4           26/0,16/PRU SIZE,18/0
 I.CBSET  =      5           24/0, 18/PASS 1 LEN, 18/PASS 1 FWA 
 I.RAN1   =      6           RANDOM FILE INFORMATION
 I.RAN2   =      7           RANDOM FILE INFORMATION
****
          SPACE  4
 #RM      ELSE
          SPACE  4
****      PSEUDO-FET STRUCTURE AND WORD OFFSETS.
* 
* 
*              OFFSET        CONTENTS 
*              ------        -------- 
  
 I.CBSET  =      -1          CIO BUFFER PASS 1 PARAMS - 42/LEN, 18/FWA
 I.FIT    =      0           1/HOLD BUF FLAG, 1/SPILL FLAG, 58/FIT ADDR 
 I.FIRST  =      1           60/FIRST 
 I.IN     =      2           60/IN
 I.OUT    =      3           60/OUT 
 I.LIMIT  =      4           60/LIMIT 
 I.HBSET  =      5           HOLDING BUF PASS 1 PARAMS - 42/LEN, 18/FWA 
****
          SPACE  4
 #RM      ENDIF 
          TITLE  I/O GENERAL MACROS 
 SETFIL   SPACE  4,8
**        SETFIL - SET PARAMS IN FILE MANAGEMENT TABLES.
* 
* 
*         TO SET INITIAL PARAMETER VALUES IN FILE TABLES, 
*         SETFIL    FILE=FNAM,MODE=INIT,FWA=ADDR
*          OR 
*         SETFIL    FILE=FNAM,MODE=INIT,LWA1=ADDR 
* 
*         TO RESTORE FILE TABLES TO INITIAL (PASS 1) CONDITIONS,
*         SETFIL    FILE=FNAM,MODE=RESET
* 
*         ENTRY  *FNAM* = FILE NAME 
*                 MODE  = *INIT* OR *RESET* 
*                *ADDR* = BUFFER FWA OR LWA+1, TO MATCH EQUIV PARAM 
* 
*         USES   X - 1, 2 
*                B - 2, 3 
* 
*         CALLS  FA=SET 
  
  
          PURGMAC   SETFIL
  
 SETFIL   MACROE FILE,MODE,FWA,LWA1 
          LOCAL  CHECK
 CHECK    SET    0
          IFC    NE, LWA1  ,1 
 CHECK    SET    CHECK+1
          IFC    NE, FWA  ,1
 CHECK    SET    CHECK+2
*                            SET FILE ADDRESS.
          IFEQ   CP#RM,0,2
          R=     X2,FILE
          SKIP   1
          R=     A2,FILE
 .M       IFC    NE, MODE INIT
*                            VALIDATE MODE PARAMETER. 
          IFC    NE, MODE RESET ,1
          ERR    (MODE) BAD MODE# "SEQUENCE"
*                            RESET MODE.
          IFNE   CHECK,0,1
 7        ERR    MODE#RESET, FWA#/LWA1# IGNORED "SEQUENCE"
          IFEQ   CP#RM,0,2
          SA1    X2+I.CBSET 
          SKIP   1
          SA1    A2+I.HBSET 
          SB3    B0 
          SB2    X1 
 .M       ELSE
*                            INITIALIZE MODE. 
          IFGE   CHECK,2,5
          IFGE   CHECK,3,1
 7        ERR    BOTH FWA# AND LWA1# SPECIFIED, LWA1# IGNORED "SEQUENCE"
*                            SET FWA. 
          R=     B2,FWA 
          SB3    B0 
          SKIP   5
          IFLE   CHECK,0,2
          ERR    NO FWA#/LWA1# "SEQUENCE" 
          SKIP   2
*                            SET LWA1.
          R=     B3,LWA1
          SB2    B0 
 .M       ENDIF 
*                            CALL PROCESSING SUBROUTINE.
          RJ     =XFA=SET 
 SETFIL   ENDM
          TITLE  FILE ACTION MACROS (RECORD MANAGER I/O)
 #RM      IFNE   CP#RM,0
 BKSP     SPACE  4,8
**        BKSP - BACKSPACE FILE ONE RECORD. 
* 
* 
*         BKSP      FILE
* 
*         ENTRY  *FILE* = FILE NAME 
* 
*         USES   X2, A2 
* 
*         CALLS  SKIPBL 
  
  
          PURGMAC   BKSP
  
 BKSP     MACRO  F
          R=     A2,F 
          SKIPBL X2,1 
 BKSP     ENDM
 CLOSE    SPACE  4,8
**        CLOSE - CLOSE FILE. 
* 
*         CLOSES *FILE*, USING POSITIONING PARAMETER (CF) CURRENTLY 
*         IN THE FIT. 
* 
* 
*         CLOSE     FILE
* 
*         ENTRY  *FILE* = FILE NAME 
* 
*         USES   X2, A2 
* 
*         CALLS  FA=CLO 
  
  
          PURGMAC   CLOSE 
  
 CLOSE    MACRO  F
          R=     A2,F 
          RJ     =XFA=CLO 
 CLOSE    ENDM
 OPEN     SPACE  4,8
**        OPEN - OPEN FILE. 
* 
*         OPENS *FILE*, USING PROCESSING DIRECTION (PD) AND POSITIONING 
*         (OF) PARAMETERS CURRENTLY IN THE FIT. 
* 
* 
*         OPEN      FILE
* 
*         ENTRY  *FILE* = FILE NAME 
* 
*         USES   X2, A2 
* 
*         CALLS  FA=OPE 
  
  
          PURGMAC   OPEN
  
 OPEN     MACRO  F
          R=     A2,F 
          RJ     =XFA=OPE 
 OPEN     ENDM
 REWIND   SPACE  4,8
**        REWIND- REWIND A FILE/BUFFER. 
* 
*         THIS EXTENSION OF A NORMAL *REWIND* PREVENTS UNNECESSARY I/O
*         TRANSFERS OF SMALL INTERNAL SCRATCH FILES BETWEEN CENTRAL 
*         MEMORY AND MASS STORAGE.
* 
* 
*         REWIND    FILE,RECALL 
* 
*         ENTRY  *FILE*    = FILE NAME
*                *RECALL*  = IGNORED; INCLUDED FOR CIO COMPATIBILITY
* 
*         USES   X2, A2 
* 
*         CALLS  FA=RWX 
  
  
          PURGMAC   REWIND
  
 REWIND   MACRO  F
          R=     A2,F 
          RJ     =XFA=RWX 
 REWIND   ENDM
 WRITEF   SPACE  4,8
**        WRITEF - WRITE END-OF-FILE/PARTITION ON FILE. 
* 
*         WRITES END-OF-FILE/PARTITION ON *FILE*.  THE HOLDING BUFFER,
*         IF ONE EXISTS, IS FLUSHED BEFORE WRITING THE E-O-F. 
* 
* 
*         WRITEF    FILE
* 
*         ENTRY  *FILE* = FILE NAME 
* 
*         USES   X2, A2 
* 
*         CALLS  FA=FLSH, RECORD MANAGER
  
  
          PURGMAC   WRITEF
  
 WRITEF   MACRO  F
          R=     A2,F 
          RJ     =XFA=EOF 
 WRITEF   ENDM
 WRITER   SPACE  4,8
**        WRITER - WRITE END-OF-RECORD/SECTION ON FILE. 
* 
*         WRITES LEVEL 0 END-OF-RECORD/SECTION ON *FILE*.  THE HOLDING
*         BUFFER, IF ONE EXISTS, IS FLUSHED BEFORE WRITING THE E-O-R. 
* 
* 
*         WRITER    FILE
* 
*         ENTRY  *FILE* = FILE NAME 
* 
*         USES   X2, A2 
* 
*         CALLS  FA=FLSH, RECORD MANAGER
  
  
          PURGMAC   WRITER
  
 WRITER   MACRO  F
          R=     A2,F 
          RJ     =XFA=EOR 
 WRITER   ENDM
 #RM      ENDIF 
          TITLE  I/O DATA TRANSFER MACROS (RECORD MANAGER I/O)
 #RM      IFNE   CP#RM,0
 READC    SPACE  4,8
**        READC - READ ONE CODED LINE IN -C- FORMAT.
* 
* 
*         READC     FILE,TO,WORDS 
* 
*         ENTRY  *FILE*  = FILE NAME
*                *TO*    = WSA ADDRESS
*                *WORDS* = WSA LENGTH (WORDS) 
* 
*         USES   X2, A2, B6, B7 
* 
*         CALLS  FA=RDC 
  
  
          PURGMAC   READC 
  
 READC    MACRO  F,S,N
          R=     B6,S 
          R=     B7,N 
          R=     A2,F 
          RJ     =XFA=RDC 
 READC    ENDM
 READW    SPACE  4,8
**        READW - READ WORDS TO WORKING STORAGE AREA. 
* 
* 
*         READW     FILE,TO,WORDS 
* 
*         ENTRY  *FILE*  = FILE NAME
*                *TO*    = WSA ADDRESS
*                *WORDS* = WSA LENGTH (WORDS) 
* 
*         USES   X2, A2, B6, B7 
* 
*         CALLS  FA=RDW 
  
  
          PURGMAC   READW 
  
 READW    MACRO  F,S,N
          R=     B6,S 
          R=     B7,N 
          R=     A2,F 
          RJ     =XFA=RDW 
 READW    ENDM
 WRITEC   SPACE  4,8
**        WRITEC - WRITE ONE CODED LINE IN -C- FORMAT.
* 
* 
*         WRITEC    FILE,FROM,WORDS 
* 
*         ENTRY  *FILE*  = FILE NAME
*                *FROM*  = WSA ADDRESS
*                *WORDS* = LINE LENGTH (WORDS).  IF ZERO OR OMITTED,
*                            LENGTH WILL BE DETERMINED BY SCANNING TO 
*                            AN END-OF-LINE MARKER -- SLOWLY. 
* 
*         USES   X2, A2, B6, B7 
* 
*         CALLS  FA=WTC 
  
  
          PURGMAC   WRITEC
  
 WRITEC   MACRO  F,S,N
          R=     B6,S 
          IFC    NE, N  ,2
*                            SET GIVEN LENGTH.
          R=     B7,N 
          SKIP   1
*                            SET LENGTH OMITTED.
          SB7    B0 
          R=     A2,F 
          RJ     =XFA=WTC 
 WRITEC   ENDM
 WRITEW   SPACE  4,8
**        WRITEW - WRITE WORDS FROM WORKING STORAGE AREA. 
* 
* 
*         WRITEW    FILE,FROM,WORDS 
* 
*         ENTRY  *FILE*  = FILE NAME
*                *FROM*  = WSA ADDRESS
*                *WORDS* = WSA LENGTH (WORDS) 
* 
*         USES   X2, A2, B6, B7 
* 
*         CALLS  FA=WTW 
  
  
          PURGMAC   WRITEW
  
 WRITEW   MACRO  F,S,N
          R=     B6,S 
          R=     B7,N 
          R=     A2,F 
          RJ     =XFA=WTW 
 WRITEW   ENDM
          SPACE  4
 #RM      ENDIF 
 POPMAC    OPSYN  PURGMAC 
 POPDEF    OPSYN  PURGDEF 
  
           PURGDEF  =A,Q
           PURGDEF  =A,A
           PURGDEF  =A,AQ 
           PURGDEF  =A,BQ 
           PURGDEF  =A,XQ 
           PURGDEF  =B,Q
           PURGDEF  =B,AQ 
           PURGDEF  =B,B
           PURGDEF  =B,BQ 
           PURGDEF  =B,XQ 
           PURGDEF  =X,Q
           PURGDEF  =X,AQ 
           PURGDEF  =X,BQ 
           PURGDEF  =X,X
           PURGDEF  =X,XQ 
