Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Example 6 - Assembler application routine

&pagelevel(3)&pagelevel

This example uses the interfaces IEDTGTM, IEDTPARL and IEDTEXE to read marked file names from the current work file and import the associated files in sequence into free work areas.

           TITLE 'BEISPIEL6'
********************************************************************
*                                                                  *
* Example 6                                                        *
*                                                                  *
* This example implements a user routine which makes it            *
* possible to read in multiple files which have been marked        *
* in a list of file names.                                         *
* It uses the iedtgtm interface to read all the marked records     *
* from the current work area.                                      *
* It is expected that the records contain file names which, for    *
* example, were created with SHOW F=* TO 1.                        *
*                                                                  *
* The example program performs the following actions:              *
*                                                                  *
* 1) Execute a loop in which all the marked records in the         *
*    work file are read.                                           *
* 2) For each marked file, iedtparl is called to search for        *
*    a free work file.                                             *
* 3) If a free work file is available, the file is read in using   *
*    @COPY FILE= (via iedtexe)                                     *
*                                                                  *
********************************************************************
*
CMULTI   CSECT
CMULTI   AMODE ANY
CMULTI   RMODE ANY
         GPARMOD 31
*
         STM   R14,R12,12(R13)    * SAVE REGISTERS
         LR    R10,R15            * ENTER VALUES IN BASE REGISTER
         USING CMULTI,R10
*
*        ENTER VALUES IN PL USING THE SUPPLIED GLCB
*
         L     R11,0(,R1)         GLCB FROM EDT
         ST    R11,EXEPL          -> TO THE EXE PL
         ST    R11,PARLPL         -> TO THE PARL PL
         ST    R11,GTMPL          -> TO THE GTM PL
         USING EDTGLCB,R11
*
*        SUPPLY SAVE AREA FOR UP CALLS
*
         LR    R7,R13             SAVE R13
         LA    R13,SAVEAREA
*
*        SUPPLY AMCB  FOR GTM
*
         MVC   EAMFILE,EGLFILE    CURRENT WORK FILE FROM GLCB
         MVC   EAMDISP,=A(1)      READ RECORD BY KEY
         MVC   EAMLKEY1,=Y(8)     ENTER VALUES IN LENGTH FIELDS
         MVC   EAMPKEY,=Y(8)
         MVC   EAMPREC,=Y(54)
*
*        SUPPLY AMCB  FOR PARL
*
         MVC   PAMFILE(3),=C'L00' WORK FILE FOR PARL
         MVC   PAMLKEY1,=Y(8)     ENTER VALUES IN LENGTH FIELDS
         MVC   PAMPKEY,=Y(8)
         MVC   PAMPREC,=Y(EPLPARLL)
*
*        LOOP THROUGH ALL MARKED RECORDS
*
         LA    R3,0(0,0)          COUNTER FOR WORK FILES
LOOP     DS    0Y
         LA    R1,GTMPL           ADDRESS OF EDT STATEMENT
         L     R15,=V(IEDTGTM)    GTM ROUTINE
         BALR  R14,R15
         CLC   EGLMRET,=Y(EAMRETOK) GTM OK ?
         LA    R1,ERRGTM          ERROR MESSAGE
         BNE   LOOPERR            ERROR OUTPUT
         CLI   EGLSR1,EAMOK12     LAST MARKED RECORD?
         BE    LOOPEX             NORMAL OUTPUT
*
*        SEARCH FOR FREE WORK FILE
*
LOOPI    DS    0Y
         LA    R4,ARBDATNR        PRINTABLE NUMBERS
         LA    R4,0(R3,R4)        ADD COUNTERS
         MVC   PAMFILE+1(2),0(R4) TRANSFER NUM TO AMCB
         LA    R1,PARLPL          FOR PARL CALL
         L     R15,=V(IEDTGET)    GET ROUTINE (PARL)
         BALR  R14,R15
         CLC   EGLMRET,=Y(EAMRETOK)   PARL OK?
         LA    R1,ERRPARL
         BNE   LOOPERR            ERROR OUTPUT
         CLI   EPLEMPTY,'1'       WORK FILE EMPTY?
         BE    LOOPIEX            EXIT LOOP
         LA    R3,2(,R3)          NEXT WORK FILE IN 2ND STEP BECAUSE
*                                 2-DIGIT IN WORK FILE NO.
         CH    R3,=Y(44)          LAST WORK FILE REACHED?
         BH    LOOPEX             NORMAL OUTPUT
         B     LOOPI              TRY NEXT
*
LOOPIEX  DS    0Y
         MVC   ADAT,PAMFILE+1     WORK FILE IN SETF STATEMENT
         MVI   FILE,' '           PRELIMINARY DELETE OF FILE NAME
         MVC   FILE+1(53),FILE
         LH    R15,EAMLREC        LENGTH OF READ RECORD
         BCTR  R15,0              MINUS 1 FOR EX
         EX    R15,EXMVCFIL       FILE NAME IN @COPY STATEMENT
         LA    R1,EXEPL           FOR EXE CALL
         L     R15,=V(IEDTEXE)
         BALR  R14,R15
         CLC   EGLMRET,=Y(EUPRETOK)   EXE OK?
         LA    R1,ERREXE
         BNE   LOOPERR            ERROR OUTPUT
         MVC   KEY1(8),KEY        NEW BASIS IS READ RECORD --- (1)
         B     LOOP
*
LOOPEX   DS    0Y
         MVC   EGLMRET,=Y(EUPRETOK)   RC OK
         MVI   EGLSR1,EUPOK00
         LR    R13,R7                 RESTORE R13
         LM    R14,R12,12(R13)
         BR    R14                    RETURN TO EDT
*
LOOPERR  DS    0Y                                --------------------- (2)
         MVC   EGLMRET,=Y(EUPRTERR)   ERROR IN USER PROGRAM
         MVI   EGLSR1,EUPOK00
         MVC   EGLRMSG(ERRMSGL+2),0(R1)
         LR    R13,R7                 RESTORE R13
         LM    R14,R12,12(R13)
         BR    R14
**********************************************************************
*        INITIALIZATION ROUTINE                                      *
**********************************************************************
         ENTRY CMULTI@I
CMULTI@I DS    0D                     -------------------------------- (3)
         STM   R14,R12,12(R13)
         USING CMULTI@I,R15
         L     R11,0(,R1)             ADDRESS OF GLCB
         USING EDTGLCB,R11
         MVC   EGLCCSN,=C'EDF041  '
         LM    R14,R12,12(R13)
         BR    R14
         DROP  R11,R15
         EJECT
**********************************************************************
*                                                                    *
*        CONSTANTS                                                   *
*                                                                    *
**********************************************************************
*
*        REGISTER DEFINITIONS
*
R0       EQU   0
R1       EQU   1
R2       EQU   2
R3       EQU   3
R4       EQU   4
R5       EQU   5
R6       EQU   6
R7       EQU   7
R8       EQU   8
R9       EQU   9
R10      EQU   10
R11      EQU   11
R12      EQU   12
R13      EQU   13
R14      EQU   14
R15      EQU   15
         EJECT
**********************************************************************
*                                                                    *
*        FIELDS                                                      *
*                                                                    *
**********************************************************************
SAVEAREA DS    18F                     SAVE AREA
*
EXMVCFIL MVC   FILE(0),REC             FILE NAME IN COPY STATEMENT
*
REC      DS    CL54                    AREA FOR FILE NAMES
*
ERRGTM   DC    Y(ERRMSGL)
         DC    'FEHLER BEI IEDTGTM   '
ERRMSGL  EQU   *-ERRGTM-2
ERRPARL  DC    Y(ERRMSGL)
         DC    'FEHLER BEI IEDTPARL  '
ERREXE   DC    Y(ERRMSGL)
         DC    'FEHLER BEI IEDTEXE   '
*
CMD1     DC    Y(CMD1END-CMD1)         EDT STATEMENT: COPY
         DS    CL2
         DC    C'@SETF('
ADAT     DC    C'00'
         DC    ');@COPY FILE='
FILE     DC    CL54' '
CMD1END  EQU   *
*
ARBDATNR DC    C'00010203040506070809101213141516171819202122'
*
*        PARAMETER LIST FOR THE EDT EXE INTERFACE
*
EXEPL    DC    A(0)                    EDTGLCB ADDRESS
         DC    A(CMD1)                 ADDRESS OF STATEMENT
*
*        PARAMETER LIST FOR THE EDT GTM INTERFACE
*
GTMPL    DC    A(0)                    EDTGLCB ADDRESS
         DC    A(EDTAMCB)              EDTAMCB ADDRESS
         DC    A(KEY1)                 KEY1 (IN) ADDRESS
         DC    A(KEY)                  KEY (OUT) ADDRESS
         DC    A(REC)                  ADDRESS OF READ RECORD
*
*        PARAMETER LIST FOR THE EDT PARL INTERFACE
*
PARLPL   DC    A(0)                    EDTGLCB ADDRESS
         DC    A(PEDTAMCB)             EDTAMCB ADDRESS
         DC    A(KEY1)                 KEY1 (IN) ADDRESS
         DC    A(KEY)                  KEY (OUT) ADDRESS
         DC    A(EDTPARL)              ADDRESS OF INFO OUTPUT
*
KEY1     DC    2A(0)                   KEY FOR GTM
KEY      DC    2A(0)                   KEY (RETURN VALUE)
*
*        EDT-SPECIFIC INTERFACE MACROS IN V17.0A
*
         IEDTAMCB C,VERSION=2
*
         IEDTAMCB C,P,VERSION=2
*
         IEDTPARL C,VERSION=4
*
         IEDTGLCB D,VERSION=2
CMULTI   CSECT
         END

Explanations

(1)EDTGTM reads starting from the specified key in the direction specified by EAMDISP (here forwards). As a result, the new key must become the new starting point.
(2)For reasons of clarity, there is only a brief indication of the error handling mechanisms. However, at the very least, the original return code provided by the interface should be prepared and output.
(3)Specifying the initialization routine also causes CMULTI to be called with the V17 GLCB.

If the procedure explained in “Producing user routines in Assembler” is stored in a file named ASSMOD.DO in BS2000 and the source file
is stored as the S element ANWEND2.ASS in the library EDT.BEISPIELE then the above program can be compiled and linked with

/CALL-PROC ASSMOD.DO,(2)

The generated program can then be loaded from EDT with

@USE COMMAND='*',ELEMENT=CMULTI,MODLIB=EDT.BEISPIELE

The procedure ASSMOD.DO generates output resembling the following:

%  BLS0523 ELEMENT 'ASSEMBH', VERSION '012', TYPE 'C' FROM LIBRARY ':MARS: 
$TSOS.SYSPRG.ASSEMBH.012' IN PROCESS
%  BLS0500 PROGRAM 'ASSEMBH', VERSION '01.2C00' OF '2002-03-06' LOADED
%  BLS0552 COPYRIGHT (C) FUJITSU SIEMENS COMPUTERS GMBH 2002. ALL RIGHTS 
RESERVED
%  ASS6010 V01.2C00 OF BS2000 ASSEMBH  READY
%  ASS6011 ASSEMBLY TIME: 480 MSEC
%  ASS6018 0 FLAGS, 0 PRIVILEGED FLAGS, 0 MNOTES
%  ASS6019 HIGHEST ERROR-WEIGHT: NO ERRORS
%  ASS6006 LISTING GENERATOR TIME: 12 MSEC
%  ASS6012 END OF ASSEMBH

The operation of the routine will be demonstrated in L mode, i.e. EDT must already be loaded and be waiting for input in L mode:

  1.     @SHOW F=* TO 1                           ----------- (1)
550.     @O&F'BEISPIEL'                           ----------- (2)
550.     @USE COM='*',E=CMULTI,M=EDT.BEISPIELE    ----------- (3)
550.     *CMULTI                                  ----------- (4)
  %  EDT5999 FEHLER BEI IEDTEXE                   ----------- (5)
  1. @PROC 22
  1. @STA=PAR TO 1                                ----------- (6)
254. @ON & P '$ ='
  7.0000     % =    1.0000  $ =  549.0000  * =  550.0000  ? =   22.0000
 18.0000     % =    1.0000  $ =  309.0000  * =  310.0000  ? =    0.0000
 29.0000     % =    1.0000  $ =  187.0000  * =  188.0000  ? =    0.0000
 40.0000     % =    1.0000  $ =  179.0000  * =  180.0000  ? =    0.0000
 51.0000     % =    1.0000  $ =  235.0000  * =  236.0000  ? =    0.0000
 62.0000     % =    1.0000  $ =    1.0000  * =    1.0000  ? =    0.0000
.... 

Explanations

(1)The file list is constructed in the work file. Here, for example, the list has 549 entries.
(2)All files which have the name component BEISPIEL are searched for and marked.
(3)The user routine CMULTI is loaded from the library EDT.BEISPIELE and is used to process user statements which start with '*' .
(4)The user routine is called. Since it does not evaluate the input string, it could be called with any other statement, e.g. *XXX.
(5)The message comes from the user routine since IEDTEXE has supplied a return code. The library EDT.BEISPIELE is also found. This cannot be read using @COPY.
(6)@STA=PAR provides a view of file occupancy and makes it clear that files have been read into work files 1 to 4.