* 09/11/74 -- 17:00
* MODULE NAME: PRFMT
* NUMBER: 9
* PURPOSE: PROVIDE VARIOUS FORMATTING SERVICES TO PRINT ROUTINES,
*                 ALSO FORMAT HEADINGS AND FOOTINGS
* ENTRY POINTS:
*
         DEF      C09FORM           SET FORM-LETTER MODE
         DEF      E09TUH,E09TUF     ENTER HEADING/FOOTING MODE
         DEF      S09SAVHF          SAVE HEADING/FOOTING LINE
         DEF      S09PRHDG,S09PRFTG PRINT HEADING/FOOTING
         DEF      S09RDKEY,S09RDNXT READ TEXT LINE
         DEF      S09STABS          INSERT OUTPUT LINE LEADING TABS
         DEF      S09RESLN          RESET OUTPUT LINE
         DEF      S09RDATN          READ ATTN-ATTN RESPONSE
         DEF      S09WRSTA,S09RDSTA SAVE/RESTORE PRINTOUT STATUS
*
         REF      E08TU             ENTER UNFORMATTED MODE
         REF      S27RCPY,S27WCPY   READ/WRITE PRINT FILE
         REF      S37OUTLN          PRINT OUTPUT LINE
         REF      S35CNVRT          CONVERT BINARY TO EBCDIC
         REF      S27RTXT,S27READ   READ TEXT LINE, READ TERMINAL
         REF      S36RSBRK          RESET BREAK COUNT
         REF      S12SAVPG,S12RESPG SAVE,RESTORE TABLE PAGES
         REF      PRINTBRK          BREAK RETURN ADDR
         REF      S40BFLGS          H/F BOX CONTROL FLAGS
*
         SYSTEM   TEXTDEF
         SYSTEM   ITEMDEF
            INVCMDSTA
            INVPRSTA
            INVLNSTA
            INVWSSTA
*
*
         PAGE
*
*
*
         DEF      9P,9D
*
9P       EQU      %
         DATA     X'09'             MODULE NUMBER
         DATA     X'091174'         DATE
         DATA     X'1700'           TIME
*
*
         TITLE    '** PRFMT(9)** '
*
* C09FORM -- SET FORM-LETTER MODE (CONTIUOUS PRINTOUT)
*
*
C09FORM  EQU      %
         SAVRTN
*
         LI,D1    1                 SET FORM-LETTER FLAG
         PUT,D1   WS:FORM
         RETURN
*
*
         PAGE
*
*
* E09TUH,E09TUF -- ENTER HEADING/FOOTING MODE
*
*
E09TUH   EQU      %                 'HEADING MODE' COMMAND
         LI,X1    1                 SET H/F INDEX
         B        SETMODE           GO SET MODE
E09TUF   EQU      %                 'FOOTING MODE' COMMAND
         LI,X1    2                 SET H/F INDEX
*
SETMODE  EQU      %
         SAVRTN
         STW,X1   HFINDX            SAVE H/F INDEX
*
         BAL,SRTN E08TU             SET UNFORMATTED MODE
         LW,X1    HFINDX            GET H/F INDEX
         PUT,X1   PR:HFSAV          SET H/F SAVE FLAG
         JEZ,D1   (PR:HFLNS,X1),GETHFCDE  TEST FOR PREVIOUS H/F LINES
         GET,D2   PR:RLNS           YES, GET REMAINING LINE COUNT
         AW,D2    D1                ADD PREVIOUS H/F LINES
         PUT,D2   PR:RLNS           STORE NEW REMAINING LINE COUNT
         LI,D1    0
         PUT,D1   PR:HFLNS,X1       RESET H/F LINE COUNT
*
*
         PAGE
*
*
GETHFCDE EQU      %
         JNEZ,AC1 (#DSHW,:K(1)),TSTHCDE TEST FOR PAGE/START CODE
         LW,AC1   HFDEF,X1          NO, GET DEFAULT CODE
TSTHCDE  EQU      %
         SLD,AC1  -32               SHIFT FOR DIVIDE
         DW,AC1   L(10)             DIVIDE BY 10 (1ST PAGE IN AC2)
         STW,AC2  HFPG,X1           STORE FIRST H/F PAGE
         SW,AC1   AC2               SUBTRACT 1ST PAGE FROM 2ND
         CI,AC1   1                 TEST FOR ALL PAGES
         BG       TSTEVOD               NO, GO TEST FOR EVEN-ODD
         LI,AC2   -1                    YES, SET E-O CODE FOR ALL(-1)
         B        STEVOD            STORE EVEN-ODD CODE
*
TSTEVOD  EQU      %
         AND,AC2  L(X'01')          TEST FOR EVEN-ODD (0=EVEN,1=ODD)
STEVOD   EQU      %
         STW,AC2  HFEVOD,X1         STORE EVEN-ODD CODE
*
*
         PAGE
*
*
         LI,X2    3                 THREE COMMAND FLAGS TO CHECK
TSTFLGLP EQU      %
         JNEZ,D1  (#FLAGS,X2),SETPFLG  TEST FOR FLAG, SET IF PRESENT
         BDR,X2   TSTFLGLP          NOT THERE, TEST NEXT FLAG
*
SETPFLG  EQU      %
         LB,D1    PSTNTBL,X2        GET POSITION SETTING FROM TABLE
         B        STFLG             GO STORE POSITIONING CODE
*
PSTNTBL  EQU      %                 POSITIONING TABLE FOR HEADINGS & FOOTINGS
         DATA,1   1                 NO POSITIONING (NO FLAGS SET)
         DATA,1   2                 CENTER LINES (FLAG 1 SET)
         DATA,1   0                 ALTERNATE LINES (FLAG 2 SET)
         DATA,1   3                 MOVE LINES AGAINST RIGHT MARGIN (FLAG 3)
         BOUND    4                 MAKE SURE TO STAY ON WORD BOUNDARY
*
STFLG    EQU      %
         STW,D1   HFPSTN,X1         STORE POSITIONING FLAG
         LW,AC1   HFKEY,X1          GET FIRST H/F KEY
         STW,AC1  HFLKEY,X1         STORE FIRST H/F KEY
         RETURN
*
*
HFKEY    EQU      %-1
         DATA     X'03FF0000'       FIRST HEADING KEY
         DATA     X'03FF1000'       FIRST FOOTING KEY
*
HFDEF    EQU      %-1               FIRST,SECOND PAGE DEFAULTS
         DATA     23                HEADING FIRST TWO PAGES
         DATA     12                FOOTING FIRST TWO PAGES
*
*
         PAGE
*
* S09SAVHF -- SAVE H/F LINES
*
S09SAVHF EQU      %
         SAVRTN
*
         GET,X1   PR:HFSAV          GET H/F INDEX
         STW,X1   HFINDX            SAVE H/F INDEX
         GET,D1   PR:HFLNS,X1       GET H/F LINE COUNT
         GET,D2   #DEPTH            GET MAX PAGE DEPTH
         CW,D1    D2                TEST FOR TOO MANY LINES
         BGE      RTNSAVHF             YES, RETURN
         LB,AC2   0,BUF3            GET NUMBER OF SKIP LINES
         AW,D1    AC2               ADD TO LINE COUNT
         PUT,D1   PR:HFLNS,X1       STORE NEW H/F LINE COUNT
         GET,D1   PR:PGNUM          GET CURRENT PAGE NUMBER
         CW,D1    HFPG,X1           TEST FIRST H/F PAGE
         BL       SKPLCNT              LESS, SKIP LINE DECR.
         GET,D1   PR:RLNS           GET REMAINING LINES ON PAGE
         SW,D1    AC2               SUBTRACT H/F LINES
         PUT,D1   PR:RLNS           STORE REMAINING LINES ON PAGE
SKPLCNT  EQU      %
         JLZ,D1   PR:LPFLG,RTNSAVHF TEST FOR INDEXING ONLY
         CI,AC1   1                     NO, TEST FOR SKIP ONLY
         BLE      SAVHF             SKIP ONLY, GO SAVE H/F LINE
         LW,X2    BUF3              GET ADDR OF LINE START
         AW,X2    AC1               ADD LINE SIZE
         GET,D1   LN:CPSTN          GET CARRIER POSITION
         STB,D1   0,X2              STORE AT END OF LINE
         AI,AC1   1                 INCREMENT LINE SIZE
*
*
         PAGE
*
*
SAVHF    EQU      %
         LW,AC2   HFLKEY,X1         GET KEY FOR THIS H/F LINE
         BAL,SRTN S27WCPY           WRITE H/F LINE TO PRINT FILE
         AI,AC2   1                 ADD INCR. FOR NEXT H/F LINE
         LW,X1    HFINDX            GET H/F INDEX
         STW,AC2  HFLKEY,X1         STORE NEXT H/F KEY
*
RTNSAVHF EQU      %
         RETURN
         PAGE
*
* S09PRHDG,S09PRFTG -- PRINT HEADING OR FOOTING
*
*
S09PRHDG EQU      %
         LI,X1    1                 SET HEDING INDEX
         B        TSTPRNT           GO TEST FOR PRINT
S09PRFTG EQU      %
         LI,X1    2                 SET FOOTING INDEX
*
TSTPRNT  EQU      %
         SAVRTN
*
*
         STW,X1   HFINDX            SAVE H/F INDEX
         JEZ,D1   (PR:HFLNS,X1),RTNPRHF TEST H/F LINES
         LI,AC1   2                 H/F START FLAG FOR BOX CTRL
         BAL,SRTN S40BFLGS
         LW,X1    HFINDX            GET H/F INDEX
         GET,AC1  PR:PGNUM          GET CURRENT PAGE NUMBER
         CW,AC1   HFPG,X1           COMPARE TO FIRST H/F PAGE
         BL       RTNPRHF              LESS, RETURN
         BAL,SRTN S35CNVRT              >=, CONVERT TO EBCDIC
         STW,AC2  PGNUM             SAVE EBCDIC PAGE NUMBER
*
         AND,AC1  L(X'01')          SET FOR EVEN-ODD TEST
         LW,X1    HFINDX            GET H/F INDEX
         MTW,0    HFEVOD,X1         TEST EVEN-ODD CODE
         BLZ      TSTPSTN               EVERY PAGE, TEST POSITIONING
         CW,AC1   HFEVOD,X1         TEST PAGE NUMBER FOR EVEN-ODD
         BNE      PRHFSKPS              NO, PRINT SKIPS
*
*
         PAGE
*
*
TSTPSTN  EQU      %
         LW,AC2   HFPSTN,X1         GET POSITIONING CODE
         BGZ      STMPSTN              SET, GO SAVE POSITIONING CODE
         LI,AC2   1                 INITIALIZE TO NO POSITIONING
         CI,AC1   0                 TEST FOR EVEN PAGE
         BE       STMPSTN               YES, NO POSITIONING
         LI,AC2   3                    NO, SET 'RIGHT MARGIN' POSITIONING
*
STMPSTN  EQU      %
         STW,AC2  TMPSTN            SAVE POSITIONING CODE
         LI,D1    0                 RESET EXTRA LINES FLAG
         STW,D1   XLNSFLG
         CI,X1    2                 TEST FOR FOOTING
         BNE      GHFKEY               NO, GET H/F KEY
         GET,D1   PR:RLNS              YES, GET REMAINING LINES
         CI,D1    0                 TEST REMAINING LINES
         BEZ      GHFKEY               ZERO, GET H/F KEY
         BLZ      DFSTLN               -1, DELETE FIRST FOOTING LINE
*                                      1, ADD ONE FOOTING LINE
         LI,BUF2  BA(STDINBUF)      GET BUFFER ADDR
         STB,D1   0,BUF2            STORE SKIP COUNT
         LI,AC1   1                 SET LINE SIZE TO 1
         LI,AC3   1                 SET FORMATTING MODE TO ONE
         BAL,SRTN S37OUTLN          PRINT SKIP LINE
         LI,X1    2                 RESTORE H/F INDEX
         B        GHFKEY            GO GET FIRST H/F KEY
*
DFSTLN   EQU      %
         LCW,D2   D1                GET # OF EXTRA LINES
         STW,D2   XLNSFLG           SAVE EXTRA LINES COUNT
*
GHFKEY   EQU      %
         LW,AC2   HFKEY,X1          GET FIRST H/F KEY
*
PRNTLP   EQU      %
         LI,AC1   #STDBUFSZ         GET MAX BUFFER SIZE
         LI,BUF2  BA(STDINBUF)      GET ADDR OF BUFFER
         BAL,SRTN S27RCPY           READ H/F RECORD
         CI,AC1   0                 TEST FOR EOF
         BE       RTNPRHF               YES, RETURN
         LW,X1    HFINDX                NO, GET H/F INDEX
         CW,AC2   HFLKEY,X1         TEST FOR LAST H/F KEY
         BGE      RTNPRHF               >=, RETURN
*
*
         PAGE
*
*
         LW,AC2   XLNSFLG           GET EXTRA LINES FLAG
         BLEZ     TSKONLY              ZERO, TEST FOR SKIP ONLY
         LB,AC3   0,BUF2               +, GET SKIP COUNT FOR THIS LINE
         SLS,AC3  24                CONVERT SKIP COUNT TO POSITIVE
         SAS,AC3  -24
         LAW,AC3  AC3
*
         CW,AC3   XLNSFLG           COMPARE TO EXTRA LINES COUNT
         BG       DSKPCNT              >, DECR SKIP COUNT
         SW,AC2   AC3                  <=, SUBTRACT COUNT FROM XTRA LINES
         STW,AC2  XLNSFLG           STORE NEW XTRA LINES COUNT
         LI,AC2   0                 SET KEY FOR READ NEXT
         B        PRNTLP            GO READ NEXT H/F LINE
*
DSKPCNT  EQU      %
         SW,AC3   XLNSFLG           SUBTRACT XTRA LINES FROM COUNT
         STB,AC3  0,BUF2            STORE NEW SKIP COUNT
         LI,AC2   0                 RESET EXTRA LINES FLAG
         STW,AC2  XLNSFLG
*
TSKONLY  EQU      %
         CI,AC1   3                 TEST FOR SKIP OR CR ONLY
         BLE      WRHFLN                YES, GO PRINT LINE
         AI,BUF2  1                     NO, INCREMENT BUFFER POINTER
         LB,X2    0,BUF2            GET STOP CODE DISP.
         BEZ      PSTNLN                ZERO, GO POSITION LINE
         AI,X2    BA(STDINBUF)+1    CALC. ADDR FOR PAGE NUMBER
         MOVE,X3  BA(PGNUM),*X2,4   MOVE PAGE NUMBER TO OUTPUT LINE
         LI,X2    0                 SET STOP COUNT TO ZERO
         STB,X2   0,BUF2
*
PSTNLN   EQU      %
         AI,AC1   -1                DECREMENT SIZE BY ONE
         LW,AC3   TMPSTN            GET TEMP POSITIONING FLAG
         CI,AC3   3                 TEST FOR RIGHT-MARGIN POSITION
         BNE      WRHFLN               NO, GO WRITE LINE
         LI,X2    BA(STDINBUF)      GET ADDR OF BUFFER
         AW,X2    AC1               ADD LINE SIZE
         LB,AC2   0,X2              GET CARRIER POSITION
*
*
         PAGE
*
*
MVHFLN   EQU      %
         GET,D1   #WIDTH            GET PAGE WIDTH
         SW,D1    AC2               SUBTRACT CARRIER POSITION
         BLEZ     WRHFLN                ZERO, GO WRITE LINE
         LW,AC2   AC1               GET SIZE FOR SHIFT
         AI,AC2   -2                SUBTRACT CONTROL BYTES
         LI,X1    BA(STDINBUF)+1    ADDR OF LINE
         AW,X1    AC2               ADDR OF LAST CHAR
         LW,X2    X1                GET ADDR FOR DEST.
         AW,X2    D1                ADD SHIFT SIZE
*
MVHFLP   EQU      %
         LB,AC3   0,X1              GET LAST CHAR IN LINE
         STB,AC3  0,X2              STORE IN NEW POSITION
         AI,X1    -1                DECREMENT POINTERS
         AI,X2    -1
         BDR,AC2  MVHFLP            GET NEXT CHAR
*
         INSCHAR  #BLANK,BA(STDINBUF)+2,*D1 INSERT BLANKS IN FRONT
         AW,AC1   D1                INCREMENT LINE SIZE
*
*
         PAGE
*
*
WRHFLN   EQU      %
         LW,AC3   TMPSTN            GET FORMATTING CODE
         LI,BUF2  BA(STDINBUF)      GET ADDR OF BUFFER START
         BAL,SRTN S37OUTLN          GO PRINT OUTPUT LINE
         LI,AC2   0                 SET KEY FOR READ NEXT
         B        PRNTLP            GO GET NEXT H/F LINE
*
PRHFSKPS EQU      %                 SKIP H/F LINES
         LI,BUF2  BA(STDINBUF)      GET ADDR OF BUFFER
         STB,D1   0,BUF2            STORE SKIP COUNT IN FIRST BYTE
         LI,AC1   1                 SET SIZE TO 1
         LI,AC3   1                 SET FORMATTING CODE
         BAL,SRTN S37OUTLN          PRINT H/F SKIPS
*
RTNPRHF  EQU      %                 RETURN
         LI,AC1   3                 H/F END FLAG FOR BOX CONTROL
         BAL,SRTN S40BFLGS
         RETURN
*
*
         PAGE
*
* S09RDKEY,S09RDNXT -- READ TEXT LINE
*
*
S09RDKEY EQU      %
         SAVRTN
*
         BAL,SRTN S09RDLN           READ INPUT LINE
         B        RDNXT             NOW GO SET NEXT INPUT LINE
*
*
S09RDNXT EQU      %
         SAVRTN
*
RDNXT    EQU      %
         LCI      3                 GET NEXT-LINE PARAMETERS
         LM,AC1   NXTRDSZ
         STM,AC1  RDLNSZ
         CI,AC1   0                 TEST FOR EOF
         BLE      SETLNTBL              YES, RETURN
         MOVE,X1  BA(STDX2BUF)+1,BA(STDX1BUF),*AC1 MOVE NEXT LINE
         LI,AC2   0                 SET KEY FOR READ NEXT
         BAL,SRTN S09RDLN           READ LINE
*
*
         PAGE
*
*
SETLNTBL EQU      %                 SET LINE TABLE FOR NEW INPUT LINE:
         LW,AC1   RDLNSZ                SIZE
         PUT,AC1  LN:INSZ
         LW,AC2   RDLNKEY               KEY
         PUT,AC2  LN:CKEY
         LI,D1    BA(STDX1BUF)          BUFFER ADDR
         PUT,D1   LN:INPTR
         LW,X1    RDLNTAB               CURRENT LINE LEADING TABS
         LW,X2    NXTRDTAB              NEXT LINE LEADING TABS
         RETURN
*
*
         PAGE
*
*
S09RDLN  EQU      %
         SAVRTN
*
         LI,BUF2  BA(STDX2BUF)      GET ADDR OF NEXT-READ BUFFER
         LI,AC1   #STDBUFSZ         MAX SIZE
         BAL,SRTN S27RTXT           READ TEXT LINE
         LI,AC3   -1                INITIALIZE TAB COUNT
         AI,AC1   -1                DECREMENT LINE SIZE FOR ATTN COUNT
         BLEZ     SETNXTLN             SIZE ZERO, RETURN
*
         AI,BUF2  1                 INCREMENT LINE POINTER FOR ATTN
         LB,D1    0,BUF2            GET FIRST CHAR
         CI,D1    #CR               TEST FOR CR
         BE       SETNXTLN              YES, SET RETURN
         LI,D1    #TAB              GET TAB CHAR FOR COMPARE
*
TSTNXTAB EQU      %
         AI,AC3   1                 INCREMENT TAB COUNT
         CB,D1    0,BUF2            TEST FOR TAB
         BNE      SETNXTLN              NO, SET RETURN LINE
         AI,BUF2  1                     YES, INCREMENT BUFFER POINTER
         B        TSTNXTAB          TEST NEXT CHAR
*
SETNXTLN EQU      %
         LCI      3                 SAVE LINE SIZE, KEY, TABS
         STM,AC1  NXTRDSZ
         RETURN
         PAGE
*
* S09STABS -- INSERT LEADING TABS IN FORMATTED OUTPUT LINE
*
* ENTRY: X3= NUMBER OF LEADING TABS
*
S09STABS EQU      %
         SAVRTN
*
         CI,X3    0                 TEST FOR NO LEADING TABS
         BLE      RTNSTABS              NONE, RETURN
         GET,X1   LN:OUTPTR         GET CURRENT OUTPUT LINE POINTER
         LI,X2    1                 INITIALIZE TAB COUNT
         LI,D1    0                 INITIALIZE CARRIER POSITION
         LI,AC2   #TAB              GET TAB CHAR
*
NXTABLP  EQU      %
         JNEZ,D2  (WS:TABS,X2),INSTAB GET NEXT TAB POSITION
         LI,AC2   #BLANK                ZERO, STORE BLANKS
         AI,D1    1                 INCREMENT CARRIER ONE POSITION
         B        STLTAB            NOW STORE LEADING BLANK
*
INSTAB   EQU      %
         LW,D1    D2                GET NEW CARRIER POSITION
         AI,X2    1                 INCREMENT TAB COUNT
STLTAB   EQU      %
         STB,AC2  0,X1              STORE LEADING TAB/BLANK
         AI,X1    1                 INCREMENT OUTPUT POINTER
         BDR,X3   NXTABLP           GET NEXT TAB POSITION (IF MORE)
         AI,D1    -1
         PUT,D1   LN:CPSTN          SAVE NEW CARRIER POSITION
         PUT,X1   LN:OUTPTR         SAVE NEW OUTPUT POINTER
*
RTNSTABS EQU      %                 RETURN
         RETURN
         PAGE
*
* S09RESLN -- RESET PRINT OUTPUT LINE
*
*
S09RESLN EQU      %
         SAVRTN
*
         GET,D1   PR:SPACE          GET SPACING COUNT
         SLS,D1   8                 BYTE 0=SPACING COUNT, BYTE 1= STOPS
         STH,D1   STDPRBUF          STORE CONTROL BYTES IN BUFFER
         LI,D1    BA(STDPRBUF)+2    GET ADDR OF LINE START
         PUT,D1   LN:OUTPTR         STORE IN OUTPUT POINTER
*
         LI,D1    0                 INITIALIZE OUTPUT LINE:
         PUT,D1   LN:OUTSZ              SIZE
         PUT,D1   LN:CPSTN              CARRIER POSITION
         PUT,D1   LN:STKEY              START KEY
         PUT,D1   LN:NSTOP              # OF STOP CODES
         PUT,D1   PR:LNFIN              LINE FINISHED FLAG
         LI,D1    1
         PUT,D1   PR:NLFLG          SET NEW-LINE FLAG
*
         RETURN
*
*
         PAGE
*
* S09RDATN -- READ ATTN-ATTN(GO) OR ATTN-CR(STOP) RESPONSE
*
* EXIT PARAMETER: SR3=CHAR AFTER 1ST ATTN IS RECEIVED
*
S09RDATN EQU      %
         SAVRTN
*
         BAL,SRTN S36RSBRK          RESET BREAK COUNT
         LI,AC1   1                 INITIALIZE ATTN FLAG
         STW,AC1  ATTNFLG
         BRKCTRL  ATTNFND           SET BREAK CONTROL
*
RDATNLP  EQU      %
         LI,BUF1  BA(MSGBUF)        GET ADDR OF INPUT BUFFER
         LI,AC2   #MSGBUFSZ         MAX SIZE
         BAL,SRTN S27READ           READ INPUT LINE
         CI,SR3   #ATTN             ACTIVATION CHAR = ATTN?
         BE       ATTNFND               YES, GO TEST ATTN FLAG
         CI,SR3   #CR               ACTIVATION CHAR = CR?
         BNE      RDATNLP               NO, GO READ MORE
*
*
         PAGE
*
*
CRFND    EQU      %                 CR ACTIVATION
         MTW,0    ATTNFLG           TEST FOR PREVIOUS ATTN
         BNEZ     RDATNLP               NO, GO READ MORE
         B        RTNRDATN              YES, RETURN WITH ATTN-CR
*
ATTNFND  EQU      %                 ATTN ACTIVATION
         LI,D1    0                 RESET BREAK FLAG
         STW,D1   BRKFLAG
         MTW,-1   ATTNFLG           DECREMENT ATTN FLAG
         BGEZ     RDATNLP               FIRST ATTN, READ MORE
*
RTNRDATN EQU      %                 RETURN
         BAL,SRTN S36RSBRK          RESET BREAK COUNT
         BRKCTRL  PRINTBRK          RESET BREAK CONTROL
         RETURN
*
*
         PAGE
*
* S09WRSTA,S09RDSTA -- SAVE/RESTORE PRINTOUT STATUS
*
*
S09RDSTA EQU      %
         LI,D1    0                 SET READ-TYPE
         B        MVSTA
S09WRSTA EQU      %
         LI,D1    1                 SET WRITE-TYPE
MVSTA    EQU      %
         SAVRTN
*
         BRKCTRL  0                 SET BREAK CONTROL
         STW,D1   STATYPE           SAVE STATUS-TYPE
         LI,X1    SZSAVTBL          GET SIZE OF SAVE TABLE
         STW,X1   STAINDX           SAVE STATUS INDEX
         LW,AC2   L(FSTSVKEY)       GET FIRST SAVE KEY
         STW,AC2  STAKEY            STORE KEY
*
MVSTALP  EQU      %
         LW,X1    STAINDX           GET CURRENT INDEX
         LW,AC1   STASZTBL,X1       GET SIZE FOR CURRENT SAVE RECORD
         LW,AC2   STAKEY            GET KEY FOR CURRENT SAVE RECORD
         MTW,0    STATYPE           TEST READ/WRITE TYPE
         BNEZ     WRTYPE                WRITE TYPE
*
*
         PAGE
*
*
RDTYPE   EQU      %                 READ TYPE
         LW,BUF2  ADDRTBL,X1        GET ADDR OF CURRENT RECORD
         BAL,SRTN S27RCPY           READ CURRENT RECORD
         CI,AC2   0                 TEST FOR READ ERROR
         BE       RTNMVSTA              YES, RETURN
         B        INCRKEY               NO, GO READ NEXT
*
WRTYPE   EQU      %
         LW,BUF3  ADDRTBL,X1        GET ADDR OF CURRENT RECORD
         BAL,SRTN S27WCPY           WRITE CURRENT RECORD
*
INCRKEY  EQU      %
         MTW,1    STAKEY            INCREMENT KEY
         MTW,-1   STAINDX           DECREMENT COUNT
         BGZ      MVSTALP               >0, SAVE/RESTORE NEXT RECORD
         MTW,0    STATYPE           TEST SAVE/RESTORE TYPE
         BNEZ     WRRTNSTA              WRITE TYPE
*
*
         PAGE
*
*
RDRTNSTA EQU      %
         LW,AC2   STAKEY            GET NEXT KEY
         BAL,SRTN S12RESPG          RESTORE TABLE PAGES
         STW,AC2  STAKEY            SAVE KEY
         LI,AC1   0                 RESET FILE POINTER
         LW,AC2   NXTRDKEY          GET KEY
         BAL,SRTN S27RTXT           POSITION
         LI,AC1   (STACKSZ+2)*4     GET SIZE OF RETURN STACK
         LW,AC2   STAKEY            GET STACK KEY
         LI,BUF2  BA(RTNSTACK)      GET ADDR OF RETURN STACK
         BAL,SRTN S27RCPY           GO READ SAVED STACK
         B        RTNMVSTA              NO RETURN UNLESS ERROR
*
WRRTNSTA EQU      %
         LW,AC2   STAKEY            GET NEXT KEY
         BAL,SRTN S12SAVPG          SAVE TABLE PAGES
         LI,AC1   (STACKSZ+2)*4     GET SIZE OF RETURN STACK
         LI,BUF3  BA(RTNSTACK)      GET ADDR OF RETURN STACK
         BAL,SRTN S27WCPY           SAVE RETURN STACK
*
RTNMVSTA EQU      %                 RETURN
         BRKCTRL  PRINTBRK          RESET BREAK CONTROL
         RETURN
*
*
FSTSVKEY EQU      X'03FF2000'       FIRST SAVE KEY
*
*
         PAGE
*
         REF      8D,8END,12D,12END,37D,37END,39D,39END
*
ADDRTBL  EQU      %-1               RECORDS FOR SAVE/RESTORE ROUTINES
         DATA     BA(PRSTA)         PRINT STATUS TABLE
         DATA     BA(8D)            PRINT LOCALS
         DATA     BA(9D)            PRFMT LOCALS
         DATA     BA(12D)           TABLE LOCALS
         DATA     BA(37D)           PRNTSM LOCALS
         DATA     BA(39D)           BLOCK LOCALS
SZSAVTBL EQU      %-ADDRTBL-1       SIZE OF SAVE/RESTORE TABLE
*
STASZTBL EQU      %-1               SAVE/RESTORE RECORD SIZES
         DATA     (SZPRSTA+SZCMDSTA+SZLNSTA)*4+#STDBUFSZ*4
         DATA     BA(8END)-BA(8D)
         DATA     BA(9END)-BA(9D)
         DATA     BA(12END)-BA(12D)
         DATA     BA(37END)-BA(37D)
         DATA     BA(39END)-BA(39D)
*
*
         PAGE
*
* PRFMT LOCAL VARIABLES
*
*
9D       CSECT    0                 PRFMT LOCALS
*
HFINDX   RES      1                 H/F INDEX POINTER
*
HFPG     EQU      %-1               H/F FIRST PRINT PAGE
         RES      2
HFPSTN   EQU      %-1               H/F POSITIONING FLAG
         RES      2
HFLKEY   EQU      %-1               H/F LAST PRINT FILE KEY
         RES      2
HFEVOD   EQU      %-1               H/F EVEN-ODD FLAG
         RES      2
*
PGNUM    RES      1                 EBCDIC PAGE NUMBER
TMPSTN   RES      1                 TEMP FOR POSITIONING FLAG
XLNSFLG  RES      1                 EXTRA LINES COUNT
*
*
         PAGE
*
*
NXTRDSZ  RES      1                 NEXT-READ SIZE
NXTRDKEY RES      1                     KEY
NXTRDTAB RES      1                     LEADING TABS
*
RDLNSZ   RES      1                 CURRENT LINE SIZE
RDLNKEY  RES      1                     KEY
RDLNTAB  RES      1                     LEADING TABS
*
ATTNFLG  RES      1                 ATTN FLAG
9END     EQU      %                 END OF PRFMT LOCALS
*
STATYPE  RES      1                 SAVE/RESTORE TYPE
STAINDX  RES      1                 SAVE/RESTORE INDEX
STAKEY   RES      1                 SAVE/RESTORE KEY
*
*
         USECT    #PLOC
         END
