Processing a data-in-virtual object

The following example shows a program that processes a data-in-virtual object. The first part of the program identifies the data set and accesses the object. Then it obtains the virtual storage where it will place the window.
SAMPLE   CSECT ,
SAMPLE   AMODE 31
SAMPLE   RMODE ANY
*
*        FUNCTION: OBTAIN VIRTUAL STORAGE.  THEN IDENTIFY AND
*        ACCESS THE LINEAR DATA SET.  THEN MAP AND PROCESS THE
*        VIRTUAL STORAGE, AND STORE DATA INTO IT. THEN DO SAVES &
*        RESETS.  FINISH UP WITH AN UNMAP, AN UNACCESS AND AN
*        UNIDENTIFY.  ALL INVOCATIONS OF DATA-IN-VIRTUAL IN THIS
*        PROGRAM DEFAULT TO 'RETAIN = NO'.
*
*        DESCRIPTION: THIS JOB MAKES CHANGES IN THE LINEAR DATASET
*        CLUSTER, 'DIV.SAMPLE', WHICH IS TREATED AS A LINEAR
*        DATASET.  AFTER THIS JOB IS RUN, THE DATASET WILL CONTAIN
*        SEVEN PAGES OF ONES, FOLLOWED BY ONE PAGE OF ZEROES,
*        FOLLOWED BY EIGHT PAGES OF FIVES.  IT IS ASSUMED THE
*        DATASET WAS CREATED BY A DEFINE CLUSTER COMMAND AND THAT
*        IT CONTAINS ZEROES WHEN THIS PROGRAM BEGINS TO EXECUTE.
*
@MAINENT DS    0H
         USING *,R15
         B     @PROLOG
         DC    AL1(14)
         DC    C'SAMPLE PROGRAM'
         DROP  R15
@PROLOG  STM   R14,R12,12(R13)    STD ENTRY LINKAGE
         LR    R12,R15
         USING SAMPLE,R12
         ST    R13,SAVEAREA+4
         LR    R2,R13
         LA    R13,SAVEAREA
         ST    R13,8(R2)
         SR    R15,R15            CLEAR R15
*
*        GET STORAGE FOR THE WINDOW
*
         GETMAIN RU,LV=16*4096,SP=0,BNDRY=PAGE
         ST    R1,MAPPTR1         PTR TO STORAGE
*
*        INVOKE IDENTIFY SERVICE OF DIV MACRO
*
         DIV   IDENTIFY,DDNAME=DDAREA,TYPE=DA,ID=TESTID
         LTR   R15,R15            CHECK IF RC IS ZERO
         BNZ   ERROR              IDENTIFY FAILED
*
*        INVOKE ACCESS SERVICE OF DIV MACRO
*
         DIV   ACCESS,MODE=UPDATE,ID=TESTID
         LTR   R15,R15            CHECK IF RC IS ZERO
         BNZ   ERROR              ACCESS FAILED
The program maps the data set object. The resulting virtual storage window is eight pages long, and it corresponds to the second eight blocks of the object. The window is situated in the virtual storage obtained earlier by the GETMAIN macro. The program fills the window with fives, then saves the window back into the second eight blocks of the object. The program eliminates the window by invoking UNMAP.
*        INVOKE THE MAP SERVICE OF THE DIV MACRO
*        TO SKIP THE FIRST EIGHT BLOCKS OF THE OBJECT
*
         L     R3,EIGHT           GET SPAN
         ST    R3,SPVALUE         INITIALIZE SPAN
         ST    R3,OFFS            INITIALIZE OFFSET
         DIV   MAP,ID=TESTID,AREA=MAPPTR1,               x
               SPAN=SPVALUE,OFFSET=OFFS
         LTR   R15,R15            CHECK IF RC IS ZERO
         BNZ   ERROR              MAP FAILED
*
*        FILL IN  5'S FOR ALL EIGHT MAPPED BLOCKS
*
         L     R1,MAPPTR1         POINTS TO WINDOW
         LR    R2,R1              POINTS TO MAP
         SR    R5,R5              COUNTER 32 KBYTES
         L     R6,PAGE8           COUNTER MAXIMUM
         IC    R3,N55             5S USED AS FILLER
LOOP1    STC   R3,0(,R2)          STORE INTO MAP
         LA    R2,1(,R2)          POINTS NEXT BYTE
         LA    R5,1(,R5)          COUNT UP ONE BYTE
         CR    R5,R6              LAST BYTE OF MAP?
         BM    LOOP1              DO AGAIN IF NOT
*
*        INVOKE THE SAVE SERVICE OF THE DIV MACRO
*
         DIV   SAVE,ID=TESTID,SIZE=OBJSIZE
         LTR   R15,R15            CHECK ZERO RC
         BNZ   ERROR              SAVE FAILED
*
*        INVOKE THE UNMAP SERVICE OF THE DIV MACRO
*
         DIV   UNMAP,ID=TESTID,AREA=MAPPTR1
         LTR   R15,R15            CHECK ZERO RC
         BNZ   ERROR              UNMAP FAILED
*
*        OBJECT NOW HAS . CONTIGUOUS PAGES OF 5'S
*
The program creates a new window that includes the first eight blocks of the object. This map omits OFFSET, causing a default offset of zero to be used with the specified span of eight blocks. After filling the window with ones, the program invokes RESET against the eighth block of the object which corresponds to the eighth page of the window. Because the information provided by the reset comes from the object which still contains zeroes, the eighth page in the window is set to zeros.
*        INVOKE MAP SERVICE FOR FIRST EIGHT 4K
*        BLOCKS OF DATASET, WITH DEFAULT OFFSET.
*
         L     R3,EIGHT           GET VALUE OF SPAN
         ST    R3,SPVALUE         INITIALIZE SPAN
         DIV   MAP,ID=TESTID,AREA=MAPPTR1,               x
               SPAN=SPVALUE
         LTR   R15,R15            CHECK ZERO RC
         BNZ   ERROR              MAP FAILED
*
*        FILL IN DATA - 1'S FOR THE FIRST 8 PAGES
*
         L     R1,MAPPTR1         POINTS TO WINDOW
         LR    R2,R1              POINTS TO MAP
         SR    R5,R5              COUNTER 32 KBYTES
         L     R6,PAGE8           COUNTER MAXIMUM
         IC    R3,N11             1S USED AS FILLER
LOOP2    STC   R3,0(,R2)          STORE INTO MAP
         LA    R2,1(,R2)          POINTS TO NEXT BYTE
         LA    R5,1(,R5)          COUNT UP ONE BYTE
         CR    R5,R6              LAST BYTE OF MAP?
         BM    LOOP2              DO AGAIN IF NOT
*
*     RESET 8TH VIRTUAL BLOCK FROM THE CORRESPONDING
*     BLOCK ON DASD.  THIS BLOCK NOW CONTAINS ZEROES
*     SINCE THE PROGRAM HAS NOT YET INVOKED ANY
*     SAVE SERVICES AFFECTING IT.
*
         L     R3,SEVEN
         ST    R3,OFFS            INITIALIZE OFFSET
         L     R3,ONE
         ST    R3,SPVALUE         INITIALIZE SPAN
         DIV   RESET,ID=TESTID,                          x
               SPAN=SPVALUE,OFFSET=OFFS
         LTR   R15,R15            CHECK IF RC IS ZERO
         BNZ   ERROR              RESET FAILED
The program saves the window in the first eight blocks of the object by issuing the DIV macro, specifying SAVE. Then it terminates its use of the object by invoking the UNMAP, UNACCESS, and UNIDENTIFY services of the DIV macro.
*        INVOKE SAVE, USING DEFAULTS FOR SPAN AND
*        OFFSET.  THIS SAVES ALL MAPPED BLOCKS ON
*        THE OBJECT.  THE FIRST SEVEN ARE FILLED
*        WITH X'11' AND THE LAST HAS ALL BINARY
*        ZEROES.
*
         DIV   SAVE,ID=TESTID,SIZE=OBJSIZE
         LTR   R15,R15            CHECK ZERO RC
         BNZ   ERROR              SAVE FAILED
*
*        INVOKE THE UNMAP SERVICE
*
         DIV   UNMAP,ID=TESTID,AREA=MAPPTR1
         LTR   R15,R15            CHECK IF RC IS ZERO
         BNZ   ERROR              UNMAP FAILED
*
*        THE OBJECT NOW HAS SEVEN CONTIGUOUS BLOCKS OF
*        1'S, FOLLOWED BY ONE BLOCK  OF 0'S, FOLLOWED BY
*        EIGHT BLOCKS OF 5'S.  NOW INVOKE  UNACCESS.
*
         DIV   UNACCESS,ID=TESTID
         LTR   R15,R15            CHECK IF RC IS ZERO
         BNZ   ERROR              UNACCESS FAILED
*
*        INVOKE THE UNIDENTIFY SERVICE
*
         B     EXIT               SKIP ERROR PROCESSING
ERROR    EQU   *
         L     R15,SIXTEEN        BAD RETURN CODE
         ST    R15,SAVER15        HOLD R15 VALUE
EXIT     EQU   *
         DIV   UNIDENTIFY,ID=TESTID
         LTR   R15,R15            CHECK IF RC IS ZERO
         BZ    FREE               IF SO, LEAVE RC GOOD
         L     R15,SIXTEEN        SET BAD RETURN CODE
         ST    R15,SAVER15        HOLD R15 VALUE
Finally, the program frees its virtual storage and goes through a standard exit linkage sequence.
*        FREE STORAGE AND EXIT
*
FREE     EQU   *
         FREEMAIN RU,A=MAPPTR1,LV=16*4096,SP=0
         L     R15,SAVER15        RETRIEVE R15
         L     R13,4(R13)         STD EXIT LINKAGE
         L     R14,12(R13)
         LM    R0,R12,20(R13)     SAVE RETURN CODE
         BR    R14
         SPACE 2
*
*        DECLARE VARIABLES
*
MAPPTR1  DS    A             PTR TO GETMAINED STORAGE
OBJSIZE  DS    F             SIZE RETURNED FROM ACCESS
OFFS     DS    A             POSITION IN OBJECT
SPVALUE  DS    A             LENGTH TO BE MAPPED-RESET
SAVER15  DS    F'0'          RC VALUE IN REG 15
SAVEAREA DS    CL72          USED BY DATA-IN-VIRTUAL
TESTID   DS    CL8           ID RETURNED FROM IDENTIFY
DDAREA   DS    CL8
         ORG   DDAREA
         DC    AL1(7)        LENGTH OF DDNAME
         DC    CL7'DYNAMIC'  NAME USED IN JCL
         ORG   DDAREA+8
         SPACE 2
*
*        CONSTANTS
*
N11     DC X'11'             HEX ONES
N55     DC X'55'             HEX FIVES
ONE     DC F'1'              ONE
SEVEN   DC F'7'              SEVEN
EIGHT   DC F'8'              EIGHT
SIXTEEN DC F'16'             SIXTEEN
PAGE8   DC F'32768'          8 TIMES 4096
*
*                    REGISTERS
R0      EQU 0
R1      EQU 1
R2      EQU 2
R3      EQU 3
R5      EQU 5
R6      EQU 6
R12     EQU 12
R13     EQU 13
R14     EQU 14
R15     EQU 15
        EJECT
        END   SAMPLE