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