//HBE15 JOB ...
//**
//** Assemble the HBE15 exit
//**
//ASM      EXEC PGM=IEV90,REGION=2500K,
//         PARM='NOXREF,NOESD,NORLD,OBJECT,NODECK'
//SYSPRINT DD SYSOUT=*,DCB=(BLKSIZE=3146)
//SYSLIB DD DISP=SHR,DSN=SYS1.MACLIB
//SYSLIN DD UNIT=SYSDA,SPACE=(CYL,(2,1)),
//       DISP=(,PASS),DCB=(BLKSIZE=3120)
//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(2,1))
//SYSUT2 DD UNIT=SYSDA,SPACE=(CYL,(2,1))
//SYSUT3 DD UNIT=SYSDA,SPACE=(CYL,(2,1))
//SYSIN DD *
         TITLE 'DFSORT E15 for reading HiperBatch data with QSAM'
HBE15    CSECT
* This DFSORT E15 exit uses QSAM to read Hiperbatch input for
* a Sort or Copy application.
* The input ddname must be HBIN.
* SYSIN must contain appropriate RECORD and MOD statements.
R1       EQU   1
R2       EQU   2
R12      EQU   12
R13      EQU   13
R14      EQU   14
R15      EQU   15
         USING HBE15,R12          Show base register
         STM   R14,R12,12(R13)    Save registers
         LA    R12,0(,R15)        Set base register
         ST    R13,SAVE15+4       Save backward pointer
         LA    R14,SAVE15         Set forward pointer
         ST    R14,8(,R13)          in savearea
         LR    R13,R14            Set our savearea
         CLI   FLAGS,FIRST        If not first entry,
         BNE   GETRCD               skip Open
         OPEN  (IN,(INPUT))       Open the input data set
         MVI   FLAGS,0            Turn off first entry flag
         B     GETRCD             Get first record
EOF      DS    0H
         CLOSE IN                 End of data - Close data set
         FREEPOOL IN              Free buffers
         LA    R15,8              Set RC=8 (End of data)
         B     GOBACK             Return to DFSORT
GETRCD   DS    0H
         GET   IN                 Get a record
         LA    R15,12             Set RC=12 (Insert record)
GOBACK   DS    0H
         L     R13,4(,R13)
         L     R14,12(,R13)
         LM    R2,R12,28(R13)     Restore registers
         BR    R14                Return to DFSORT
*
SAVE15   DS    18F                Savearea
FLAGS    DC    X'FF'              Flags = Init. for first entry
FIRST    EQU   X'FF'              First entry
         DS    3C
IN       DCB   DDNAME=HBIN,MACRF=GL,EODAD=EOF,DSORG=PS
         END
//**
//** Linkedit the HBE15 exit
//**
//LKED     EXEC PGM=IEWL,REGION=512K,COND=(8,LT,ASM),
//        PARM='MAP,LIST,NCAL,LET,SIZE=(490K,40K),AMODE=24,RMODE=24'
//SYSLIN DD DSN=*.ASM.SYSLIN,DISP=(OLD,DELETE)
//       DD DDNAME=SYSIN
//SYSUT1 DD UNIT=SYSDA,SPACE=(3156,(24,20))
//SYSPRINT DD SYSOUT=*,DCB=(BLKSIZE=2420,LRECL=121,RECFM=FBSA)
//SYSLMOD DD DSN=linklib(HBE15),DISP=OLD
//**
//** Sort Example - Fixed-Length Hiperbatch Input
//**
//HB15SORT EXEC PGM=ICEMAN,REGION=8M
//SYSUDUMP DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//EXITLIB DD DSN=linklib,DISP=SHR
//HBIN DD DSN=finput,DISP=SHR
//SORTOUT DD DSN=foutput1,UNIT=SYSDA,SPACE=(CYL,(25,25),RLSE),
//  DISP=(NEW,CATLG,DELETE)
//SYSIN DD *
 RECORD TYPE=F,LENGTH=300
 SORT FIELDS=(21,4,BI,A)
 MODS E15=(HBE15,16184,EXITLIB)
/*
//**
//** Copy Example - Variable-Length Hiperbatch Input
//**
//HB15COPY EXEC PGM=ICEMAN,REGION=8M
//SYSUDUMP DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//EXITLIB DD DSN=linklib,DISP=SHR
//HBIN DD DSN=vinput,DISP=SHR
//SORTOUT DD DSN=voutput1,UNIT=SYSDA,SPACE=(CYL,(25,25),RLSE),
//  DISP=(NEW,CATLG,DELETE)
//SYSIN DD *
 RECORD TYPE=V,LENGTH=2000
 OPTION COPY
 MODS E15=(HBE15,16184,EXITLIB)
/*
