Sampl_string_select_pgm

         AGO   .START


C:\USERS\LIN\DOCUMENTS\Z390CODE\SAMPLSEL


Z390  ASSEMBLE, LINK, AND GO (TEST)


SET PA="LA" 

SET  G=C:\USERS\LIN\DOCUMENTS\Z390CODE\SAMPLSEL

SET       IN=%G%.PRN

SET      OUT=%G%.OUTPUT.OUT.TXT

SET SYSPRINT=%G%.OUTPUT.SYSPRINT.TXT

BAT\ASMLG %G%.MLC TIME(1) PARM(%PA%)


Z390  JUST TEST


SET PA="LA"

SET  G=C:\USERS\LIN\DOCUMENTS\Z390CODE\SAMPLSEL

SET       IN=%G%.PRN

SET      OUT=%G%.OUTPUT.OUT.TXT

SET SYSPRINT=%G%.OUTPUT.SYSPRINT.TXT

BAT\EZ390 %G%.MLC TEST  PARM(%PA%)

 ------------------ PAST THE Z390 STUFF -----------------

IN COPY, YOU LEARNED WHAT REGS 13, 14, AND 15 ARE ON ENTRY.

IN THE OLDEN DAYS, COMPUTERS HAD SWITCHES THAT COULD BE USED

TO CHANGE PROGRAM OPERATION.  WITH THE 360, THERE IS THE ABILITY

TO PASS 0-100 BYTES OF DATA TO A PROGRAM.  YOU CAN CODE A "PARM"

FIELD.  THE SYSTEM CALCULATES THE LENGTH OF THAT PARM FIELD, AND

PASSES THE ADDRESS OF THE 2-BYTE LENGTH, FOLLOWED BY THE DATA.

EG, IF YOU WANTED TO PASS  "HELLO"  TO YOUR PROGRAM, THEN

REG-1 CONTAINS THE ADDRESS OF ANOTHER WORD THAT THEN CONTAINS

THE ADDRESS OF  H'05',CL5'HELLO'.  OR ...


REG-1 -->

         DC    A(PARMLEN)

PARMLEN  DC    H'5',CL5'HELLO'


YOU COULD HAVE YOUR PROGRAM CALL ANOTHER PROGRAM, AND PASS, MAYBE

4 PARAMETERS.  THE X'80' IS THE HIGH BIT, SET ON THE LAST PARAMERER,

AND IT INDICATES THE LAST ENTRY IN THE LIST.


REG-1 -->

         DC    A(FIELD-1)

         DC    A(FIELD-2)

         DC    A(FIELD-3)

         DC    X'80',AL3(FIELD-4)


THE PARM FIELD PROCESSING IS SIMILAR, WITH ONLY 1 PARAMETER PASSED.


IN THIS EXERCISE, WE'LL READ A FILE, AND ONLY COPY RECORDS THAT

CONTAIN WHATEVER STRING IS PASSED IN THE PARM FIELD.  THIS WAS

ACTUALLY SOMETHING I WROTE EARLY IN MY CAREER.


I'M ALSO GOING TO DO SOMETHING ELSE, THAT IS BAD PRACTICE, BUT

GIVES YOU AN EXTRA REGISTER.  YOU'RE LIKELY TO FIND THAT YOU'RE

ALWAYS LOOKING FOR AN EXTRA REGISTER.


WHAT I'M GOING TO DO IS USE REG-13 FOR BOTH THE SAVE AREA, AND

ALSO THE BASE REGISTER.


.START   ANOP

*

SAMPLSEL START 0

         YREGS  ,          THIS DOES REG EQUATES, SO USE R1, R2, ETC

         USING *,13

         B     72(R15)

         DS    17F

         STM   14,12,12(13)

         ST    13,4(15)

         ST    15,8(13)

         LR    13,15

         L     R1,0(R1)       POINT TO PARM ADDRESS

         LH    R6,0(R1)       LOAD PARM LENGTH

         SH    R6,=H'1'       CALC LENGTH-1 TO USE EXECUTE INST

         BM    NOPARM           IF PARM LENGTH=0, ERROR

         EX    R6,MVCPARM

**       EX    0,*

         OPEN  (SYSPRINT,OUTPUT)

         PUT   SYSPRINT,LINE-1

         PUT   SYSPRINT,PARM-7

         MVC   LINE,LINE-1

         LA    R2,IN

         BAL   R9,OPENIN

         LA    R2,OUT

         BAL   R9,OPENOUT

         B     READ

MVCPARM  MVC   PARM(0),2(R1)

         PUSH  PRINT

         PRINT NOGEN

         USING IHADCB,2

OPENIN   MVC   OPENMSG+5(8),DCBDDNAM

         MVC   OPENMSG+14(3),=C' IN'

         OPEN  ((2),INPUT)

         B     UNPKRECF

OPENOUT  MVC   OPENMSG+5(8),DCBDDNAM

         MVC   OPENMSG+14(3),=C'OUT'

         OPEN  ((2),OUTPUT)

UNPKRECF UNPK  OPENMSG+28(3),DCBRECFM(2)

         TR    OPENMSG+28(2),HEX-240

         MVI   OPENMSG+30,C','

         LH    R0,DCBLRECL

         CVD   R0,DW

         OI    DW+7,X'0F'

         UNPK  OPENMSG+38(5),DW+5(3)

         LH    R0,DCBBLKSI

         CVD   R0,DW

         OI    DW+7,X'0F'

         UNPK  OPENMSG+48(5),DW+5(3)

         MVC   LINE(L'OPENMSG),OPENMSG

         PUT   SYSPRINT,LINE-1

         MVC   LINE,LINE-1

         BR    R9

OPENMSG DC CL60'OPEN ........ OUTPUT, RECFM=XX, LRECL=....., BLKSIZE='

         POP   PRINT

         DC    F'0'

WRITE    L     R0,WRITE-4

         PUT   OUT,(0)

         AP    #WRITE,=P'1'

READ     GET   IN

         ST    R1,WRITE-4               SAVE REC ADDR TO WRITE.

         LA    R3,0(R1)                 SAVE RECORD ADDR

         LH    R4,DCBLRECL-IHADCB+IN    LOAD LENGTH OF RECORD

         LA    R4,0(R4,R3)              POINT END OF RECORD

         SR    R4,R6                    BACK UP LENGTH OF STRING

         AP    #READ,=P'1'

*

LOOP     CLC   0(1,R3),PARM   Q. DOES THE 1ST CHAR MATCH?

         BNE   TRYNEXT           NO.

         EX    R6,CLCPARM     Q. DOES THE ENTIRE STRING MATCH?

         BE    WRITE             YES, WRITE THE RECORD

TRYNEXT  LA    R3,1(R3)          NO, BUMP TO NEXT CHAR IN RECORD

         CR    R3,R4          Q. END OF RECORD?

         BL    LOOP              NO, LOOP

**       EX    0,*

         B     READ              YES, NOT FOUND, READ NEXT RECORD.

*

CLCPARM  CLC   PARM(0),0(R3)     COMPARE PARM WITH EX INSTRUCTION

*

ED9      DC    X'402020206B2020206B212020'

NOPARM   OI    RC,8

Z        LA    R3,2

         LA    R4,#READ

ZLOOP    MVC   LINE(L'ED9),ED9

         ED    LINE(L'ED9),0(R4)

         MVC   LINE+L'ED9+1(15),5(R4)

         PUT   SYSPRINT,LINE

         LA    R4,20(R4)

         BCT   R3,ZLOOP

         CLOSE (IN,,OUT,,SYSPRINT)

         SR    15,15

         IC    15,RC

         L     13,4(13)

         L     14,12(13)

         LM    0,12,20(13)

         BR    14

         LTORG

#READ    DC    PL5'0',CL15'RECORDS READ'

#WRITE   DC    PL5'0',CL15'RECORDS WRITTEN'

RC       DC    X'00'

HEX      DC    C'0123456789ABCDEF'

DW       DC    2D'0',C' '

LINE     DC    CL133'SAMPLSEL ASM &SYSDATE AT &SYSTIME'

         DC    C'PARM= '

PARM     DC    CL131' '

         PUSH  PRINT

         PRINT NOGEN

IN       DCB   DDNAME=IN,DSORG=PS,LRECL=133,RECFM=FT,MACRF=GL,EODAD=Z

OUT      DCB  DDNAME=OUT,DSORG=PS,LRECL=133,RECFM=FT,MACRF=PM

SYSPRINT DCB  DDNAME=SYSPRINT,DSORG=PS,LRECL=133,RECFM=FT,MACRF=PM

         POP   PRINT

*

*

@@PAD#1  EQU   ((*-SAMPLSEL)/4096+1)*4096

@@PAD#2  EQU   @@PAD#1-(*-SAMPLSEL)

         ORG   *+@@PAD#2

*

         END   SAMPLSEL