Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

Beispiel 6 - Assembler-Anwendungsroutine

&pagelevel(3)&pagelevel

Dieses Beispiel benutzt die Schnittstellen IEDTGTM, IEDTPARL und IEDTEXE, um aus der aktuellen Arbeitsdatei markierte Dateinamen zu lesen und die dazugehörigen Dateien nacheinander in freie Arbeitsbereiche einzulesen.

           TITLE 'BEISPIEL6'
********************************************************************
*                                                                  *
* Beispiel 6                                                       *
*                                                                  *
* Dieses Beispiel realisiert eine Anwenderroutine, die das Ein-    *
* lesen mehrerer Dateien erlaubt, die in einer Dateinamensliste    *
* markiert wurden.                                                 *
* Es verwendet die iedtgtm-Schnittstelle, um alle markierten Sätze *
* aus dem aktuellen Arbeitsbereich zu lesen.                       *
* Es wird erwartet, dass die Sätze Dateinamen enthalten, die z.B.  *
* mit SHOW F=* TO 1 erstellt wurden.                               *
*                                                                  *
* Das Beispielprogramm fuehrt folgende Aktionen durch:             *
*                                                                  *
* 1) In Schleife werden alle markierten Sätze der aktuellen        *
*    Arbeitsdatei gelesen.                                         *
* 2) Für jede markierte Datei wird über einen Aufruf von iedtparl  *
*    eine freie Arbeitsdatei gesucht.                              *
* 3) Falls es noch eine freie Arbeitsdatei gibt, wird die Datei    *
*    mittels @COPY FILE= (via iedtexe) eingelesen                  *
*                                                                  *
********************************************************************
*
CMULTI   CSECT
CMULTI   AMODE ANY
CMULTI   RMODE ANY
         GPARMOD 31
*
         STM   R14,R12,12(R13)    * REGISTER SICHERN
         LR    R10,R15            * BASISREGISTER VERSORGEN
         USING CMULTI,R10
*
*        VERSORGE PL MIT DEM MITGELIEFERTEN GLCB
*
         L     R11,0(,R1)         GLCB VON EDT
         ST    R11,EXEPL          -> IN DIE EXE PL
         ST    R11,PARLPL         -> IN DIE PARL PL
         ST    R11,GTMPL          -> IN DIE GTM PL
         USING EDTGLCB,R11
*
*        SAVEAREA FUER UP-AUFRUFE VERSORGEN
*
         LR    R7,R13             SICHERE R13
         LA    R13,SAVEAREA
*
*        AMCB  FUER GTM VERSORGEN
*
         MVC   EAMFILE,EGLFILE    AKTUELLE ARBEITSDATEI AUS GLCB
         MVC   EAMDISP,=A(1)      LESE SATZ NACH SCHLUESSEL
         MVC   EAMLKEY1,=Y(8)     LAENGENFELDER VERSORGEN
         MVC   EAMPKEY,=Y(8)
         MVC   EAMPREC,=Y(54)
*
*        AMCB  FUER PARL VERSORGEN
*
         MVC   PAMFILE(3),=C'L00' ARBEITSDATEI FUER PARL
         MVC   PAMLKEY1,=Y(8)     LAENGENFELDER VERSORGEN
         MVC   PAMPKEY,=Y(8)
         MVC   PAMPREC,=Y(EPLPARLL)
*
*        SCHLEIFE UEBER ALLE MARKIERTEN SAETZE
*
         LA    R3,0(0,0)          ZAEHLER FUER ARBEITSDATEIEN
LOOP     DS    0Y
         LA    R1,GTMPL           ADRESSE EDT-ANWEISUNG
         L     R15,=V(IEDTGTM)    GTM ROUTINE
         BALR  R14,R15
         CLC   EGLMRET,=Y(EAMRETOK) GTM OK ?
         LA    R1,ERRGTM          FEHLERMELDUNG
         BNE   LOOPERR            FEHLERAUSGANG
         CLI   EGLSR1,EAMOK12     LETZTER MARKIERTER SATZ?
         BE    LOOPEX             NORMALER AUSGANG
*
*        SUCHE FREIE ARBEITSDATEI
*
LOOPI    DS    0Y
         LA    R4,ARBDATNR        ABDRUCKBARE NUMMERN
         LA    R4,0(R3,R4)        ADDIERE ZAEHLER
         MVC   PAMFILE+1(2),0(R4) NR IN DEN AMCB UEBERTRAGEN
         LA    R1,PARLPL          FUER PARL AUFRUF
         L     R15,=V(IEDTGET)    GET ROUTINE (PARL)
         BALR  R14,R15
         CLC   EGLMRET,=Y(EAMRETOK)   PARL OK?
         LA    R1,ERRPARL
         BNE   LOOPERR            FEHLERAUSGANG
         CLI   EPLEMPTY,'1'       ARBEITSDATEI LEER?
         BE    LOOPIEX            SCHLEIFE VERLASSEN
         LA    R3,2(,R3)          NAECHSTE ARBEITSDATEI IN 2ER SCHR.
*                                 DA 2STELLIG IN ARBDATNR
         CH    R3,=Y(44)          LETZTE ARBEITSDATEI ERREICHT?
         BH    LOOPEX             NORMALER AUSGANG
         B     LOOPI              NAECHSTE VERSUCHEN
*
LOOPIEX  DS    0Y
         MVC   ADAT,PAMFILE+1     ARBEITSDATEI IN SETF-ANWEISUNG
         MVI   FILE,' '           DATEINAMEN VORLOESCHEN
         MVC   FILE+1(53),FILE
         LH    R15,EAMLREC        LAENGE DES GELESENEN SATZES
         BCTR  R15,0              MINUS 1 FUER EX
         EX    R15,EXMVCFIL       DATEINAME IN @COPY-ANWEISUNG
         LA    R1,EXEPL           FUER EXE AUFRUF
         L     R15,=V(IEDTEXE)
         BALR  R14,R15
         CLC   EGLMRET,=Y(EUPRETOK)   EXE OK?
         LA    R1,ERREXE
         BNE   LOOPERR            FEHLERAUSGANG
         MVC   KEY1(8),KEY        NEUE BASIS IST DER GELESENE SATZ --- (1)
         B     LOOP
*
LOOPEX   DS    0Y
         MVC   EGLMRET,=Y(EUPRETOK)   RC OK
         MVI   EGLSR1,EUPOK00
         LR    R13,R7                 R13 WIEDERHERSTELLEN
         LM    R14,R12,12(R13)
         BR    R14                    ZURÜCK ZUM EDT
*
LOOPERR  DS    0Y                                --------------------- (2)
         MVC   EGLMRET,=Y(EUPRTERR)   FEHLER IM BENUTZERPROGRAMM
         MVI   EGLSR1,EUPOK00
         MVC   EGLRMSG(ERRMSGL+2),0(R1)
         LR    R13,R7                 R13 WIEDERHERSTELLEN
         LM    R14,R12,12(R13)
         BR    R14
**********************************************************************
*        INITIALISIERUNGS-ROUTINE                                    *
**********************************************************************
         ENTRY CMULTI@I
CMULTI@I DS    0D                     -------------------------------- (3)
         STM   R14,R12,12(R13)
         USING CMULTI@I,R15
         L     R11,0(,R1)             ADRESSE DES GLCB
         USING EDTGLCB,R11
         MVC   EGLCCSN,=C'EDF041  '
         LM    R14,R12,12(R13)
         BR    R14
         DROP  R11,R15
         EJECT
**********************************************************************
*                                                                    *
*        KONSTANTEN                                                  *
*                                                                    *
**********************************************************************
*
*        REGISTERDEFINITIONEN
*
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
**********************************************************************
*                                                                    *
*        FELDER                                                      *
*                                                                    *
**********************************************************************
SAVEAREA DS    18F                     SAVEAEREA
*
EXMVCFIL MVC   FILE(0),REC             DATEINAME IN COPY-ANWEISUNG
*
REC      DS    CL54                    BEREICH FUER DATEINAMEN
*
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-ANWEISUNG: COPY
         DS    CL2
         DC    C'@SETF('
ADAT     DC    C'00'
         DC    ');@COPY FILE='
FILE     DC    CL54' '
CMD1END  EQU   *
*
ARBDATNR DC    C'00010203040506070809101213141516171819202122'
*
*        PARAMETERLISTE DER EDT-EXE-SCHNITTSTELLE
*
EXEPL    DC    A(0)                    ADRESSE EDTGLCB
         DC    A(CMD1)                 ADRESSE DER ANWEISUNG
*
*        PARAMETERLISTE DER EDT-GTM-SCHNITTSTELLE
*
GTMPL    DC    A(0)                    ADRESSE EDTGLCB
         DC    A(EDTAMCB)              ADRESSE EDTAMCB
         DC    A(KEY1)                 ADRESSE KEY1 (IN)
         DC    A(KEY)                  ADRESSE KEY  (OUT)
         DC    A(REC)                  ADRESSE DES GELESENEN SATZES
*
*        PARAMETERLISTE DER EDT-PARL-SCHNITTSTELLE
*
PARLPL   DC    A(0)                    ADRESSE EDTGLCB
         DC    A(PEDTAMCB)             ADRESSE EDTAMCB
         DC    A(KEY1)                 ADRESSE KEY1 (IN)
         DC    A(KEY)                  ADRESSE KEY  (OUT)
         DC    A(EDTPARL)              ADRESSE DER AUSGABE INFO
*
KEY1     DC    2A(0)                   SCHLUESSEL FUER GTM
KEY      DC    2A(0)                   SCHLUESSEL (RUECKGABEWERT)
*
*        EDT-SPEZIFISCHE SCHNITTSTELLEN-MAKROS DER V17.0A
*
         IEDTAMCB C,VERSION=2
*
         IEDTAMCB C,P,VERSION=2
*
         IEDTPARL C,VERSION=4
*
         IEDTGLCB D,VERSION=2
CMULTI   CSECT
         END

Erläuterungen

(1)EDTGTM liest ausgehend vom angegebenen Schlüssel in der durch EAMDISP bestimmten Richtung (hier vorwärts). Daher muss der gelesene Schlüssel zum neuen Ausgangspunkt gemacht werden.
(2)Die Fehlerbehandlung ist aus Gründen der Übersichtlichkeit nur angedeutet. Man sollte zumindest den Original-Returncode, der von der Schnittstelle geliefert wurde, aufbereiten und ausgeben.
(3)Durch Angabe der Initialisierungsroutine wird gleichzeitig erreicht, dass CMULTI mit dem V17-GLCB gerufen wird.

Wenn die in Abschnitt „Produktion von Anwenderroutinen in Assembler“ erklärte Prozedur im BS2000 in einer Datei namens ASSMOD.DO und die Quelldatei als S-Element ANWEND2.ASS in der Bibliothek EDT.BEISPIELE abgelegt ist, kann das obige Programm mit

/CALL-PROC ASSMOD.DO,(2)

übersetzt und gebunden werden. Das erzeugte Programm ist anschließend aus dem EDT heraus mit

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

ladbar. Die Prozedur ASSMOD.DO erzeugt in etwa folgende Ausgaben:

%  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

Die Arbeitsweise der Routine sei im L-Modus demonstriert, d.h. es ist vorausgesetzt, dass der EDT schon geladen ist und auf eine Eingabe im L-Modus wartet:

  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
.... 

Erläuterungen

(1)Die Dateiliste wird in der Arbeitsdatei aufgebaut. Die Liste umfasst hier z.B. 549 Einträge.
(2)Alle Dateien, die den Namensbestandteil BEISPIEL haben, werden gesucht und markiert.
(3)Die Anwenderroutine CMULTI wird aus der Bibliothek EDT.BEISPIELE geladen und soll Benutzeranweisungen bearbeiten, die mit '*' beginnen
(4)Die Anwenderroutine wird aufgerufen. Da sie den Eingabestring nicht auswertet, könnte man sie auch mit einer beliebigen anderen Anweisung, z.B. *XXX aufrufen.
(5)Die Meldung stammt von der Anwenderroutine, da IEDTEXE einen Returncode gebracht hat. Es wird auch die Bibliothek EDT.BEISPIELE gefunden, die nicht mit @COPY eingelesen werden kann.
(6)Mit @STA=PAR verschafft man sich eine Übersicht über die Dateibelegung und sieht, dass offenbar in die Arbeitsdateien 1 bis 4 Dateien eingelesen wurden.