Someone asked if they could change x'00' to x'40 on every record of a file.
So I wrote a program. Just for exercise. The //SYSPRINT file tells you how it worked.
FIXHEX0, ASM 03/06/26, 18.21, CHANGE X40E9
SYSPRINT OPENED OUTPUT, RECFM=A0 LRECL=00133
SYSUT1 OPENED INPUT, RECFM=A0 LRECL=00163
SYSUT2 OPENED OUTPUT, RECFM=A0 LRECL=00163
000000000000379 RECORDS READ
000000000061777 CHARS TESTED
000000000044301 X"40"S CHANGED
AGO .START
THE ORIGINAL REQUEST WAS CHANGE ALL X'00' TO C' '
COOL, BUT CHANGE ANY 1 CHAR TO ANOTHER IS JUST AS EASY.
//ED EXEC FIXHEX0,PARM='X0040' OR PARM='X??##'
//SYSPRINT DD SYSOUT=* CHANGE X'??' TO X'##'
//STEPLIB DD DISP=SHR,DSN=...
//SYSUT1 DD DISP=SHR,DSN=..
//SYSUT2 DD SYSOUT=*
TO TEST, TO SEE IF IT'S DOING WHAT YOU WANT, MAYBE TEST THE FIRST 44
RECORDS. CODE PARM='44,X0040'
THIS RUNS ON THE EZ390 SIMULATOR. TO RUN ON MVS YOU NEED TO:
- FIX THE DCBS
- UNCOMMENT DCBD AT THE END
- REMOVE ALL THE @@PAD STUFF AT THE END
- REMOVE THE HARDCODED DCB STUFF,
- AND ADD EXLST=EXL ON SYSUT2
THIS GOES BEFORE THE DCBS
EXL DC A(EXL+4+X'87000000')
USING *,15
CLI DCBRECFM-IHADCB+SYSUT2,0
BNER 14
MVC DCBRECFM-IHADCB+SYSUT2(1),DCBRECFM-IHADCB+SYSUT1
MVC DCBLRECL-IHADCB+SYSUT2(2),DCBLRECL-IHADCB+SYSUT1
BR 14
KEEP IN MIND, I'M OLD+HAVEN'T HAD ACCESS TO A REAL SYSTEM IN 30 YEARS
BUT THIS IS KIND OF FUN. I MIGHT DO SOME MORE.
.START ANOP --------------------------------------
FIXHEX0 START 0
YREGS
USING *,13
B START-*(R15)
DC 17F'0'
IDLINE DC C'FIXHEX0, ASM &SYSDATE, &SYSTIME, CHANGE '
START STM 14,12,12(13)
ST 13,4(15)
ST 15,8(13)
LR 13,15
L R3,0(R1)
CLI 1(R3),0
LH R4,0(R3)
SH R4,=H'1'
BM NOPARM
CLI 2(R3),C'0'
BL NOLIMIT
SR R0,R0
CALCLIM IC R1,2(R3)
N R1,=F'15'
MH R0,=H'10'
AR R0,R1
LA R3,1(R3)
SH R4,=H'1'
CLI 2(R3),C'0'
BNL CALCLIM
CVD R0,LIM
LA R3,1(R3)
SH R4,=H'1'
NOLIMIT MVC IDLINE+L'IDLINE-8(0),2(R3)
EX R4,*-6
FIXCH MVC 12(4,R13),3(R3)
TR 12(4,R13),MAKEHEX-192
PACK 20(3,R13),12(5,R13)
MVC CHANGFR,20(R13)
MVC CLI+1(1),CHANGFR
MVC FIX+1(1),CHANGFR+1
*
NOPARM UNPK #CHANGE+10(3),CLI+1(2)
TR #CHANGE+10(2),HEX-240
MVI #CHANGE+12,C'"'
*
LA R2,SYSPRINT
BAL R9,OPENOUT
LA R2,SYSUT1
BAL R9,OPENIN
LA R2,SYSUT2
BAL R9,OPENOUT
SR R6,R6
SR R7,R7
SR R8,R8
MVC CLI+1(1),CHANGFR
MVC FIX+1(1),CHANGFR+1
B GET
*
OPENOUT MVC DCBLINE(8),DCBDDNAM-IHADCB(R2)
CLI DCBRECFM-IHADCB(R2),0
BNE *+16
MVC DCBRECFM-IHADCB+SYSUT2,DCBRECFM-IHADCB+SYSUT1
MVC DCBLRECL-IHADCB+SYSUT2,DCBLRECL-IHADCB+SYSUT1
*
PUSH PRINT
PRINT NOGEN
OPEN ((2),OUTPUT)
MVC DCBLINE+16(3),=C'OUT'
CLC =C'SYSPRINT',DCBLINE
BNE NOTSYSP
MVC LINE(L'IDLINE),IDLINE
PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
B NOTSYSP
OPENIN MVC DCBLINE(8),DCBDDNAM-IHADCB(R2)
OPEN ((2),INPUT)
POP PRINT
MVC DCBLINE+16(3),=C' IN'
NOTSYSP UNPK DCBLINE+30(3),DCBRECFM-IHADCB(2,R2)
TR DCBLINE+30(2),HEX-240
MVI DCBLINE+32,C' '
LH R0,DCBLRECL-IHADCB(R2)
CVD R0,12(R13)
OI 19(R13),X'0F'
MVC LINE(L'DCBLINE),DCBLINE
UNPK LINE+L'DCBLINE(5),17(3,R13)
PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
BR R9
DCBLINE DC C'........ OPENED OUTPUT, RECFM=.. LRECL='
*
PUT PUT SYSUT2,(3)
SP LIM,P1
BZ Z
*
GET GET SYSUT1
LA R6,1(R6)
AP #LINE,P1
LR R3,R1
LR R4,R3
LH R5,DCBLRECL-IHADCB+SYSUT1
TM DCBRECFM-IHADCB+SYSUT1,X'80'
BO CLI
LA R4,4(R4)
SH R5,=H'4'
CLI CLI 0(R4),0
BNE NOCH
FIX MVI 0(R4),C' '
AP #CHANGE,P1
LA R8,1(R8)
NOCH LA R7,1(R7)
AP #CHARSTS,P1
LA R4,1(R4)
BCT R5,CLI
B PUT
*
Z LA R2,3
LA R3,#LINE
LIST# MVC LINE,LINE-1
OI 7(R3),X'0F'
UNPK LINE(15),0(8,R3)
MVC LINE+16(16),8(R3)
PUT SYSPRINT,LINE-1
LA R3,24(R3)
BCT R2,LIST#
*
CLOSE (SYSUT1,,SYSUT2,,SYSPRINT)
L 13,4(13)
LM 14,12,12(13)
SR 15,15
BR 14
LTORG
DW DC D'0'
LIM DC PL8'999999999999999'
MAKEHEX DC XL64'000A0B0C0D0E0F'
ORG MAKEHEX+1
DC X'0A0B0C0D0E0F'
ORG MAKEHEX+48
DC X'00010203040506070809'
ORG
CHANGFR DC X'0040'
*
HEX DC C'0123456789ABCDEF'
P1 DC X'1C'
#LINE DC PL8'0',CL16'RECORDS READ'
#CHARSTS DC PL8'0',CL16'CHARS TESTED'
***CHANGE DC PL8'0',CL16'ZEROS CHANGED'
#CHANGE DC PL8'0',CL16'X"??"S CHANGED'
LINE DC CL133' '
*
EXL DC A(EXL+4+X'87000000')
PUSH USING
USING *,15
CLI DCBRECFM-IHADCB+SYSUT2,0
BNER 14
MVC DCBRECFM-IHADCB+SYSUT2(1),DCBRECFM-IHADCB+SYSUT1
MVC DCBLRECL-IHADCB+SYSUT2(2),DCBLRECL-IHADCB+SYSUT1
BR 14
POP USING
*
PUSH PRINT
PRINT NOGEN
SYSUT1 DCB DDNAME=SYSUT1,DSORG=PS,MACRF=GL,RECFM=FT,LRECL=163, X
EODAD=Z
SYSUT2 DCB DDNAME=SYSUT2,DSORG=PS,MACRF=PM,RECFM=FT,LRECL=163, X
EXLST=EXL
SYSPRINT DCB DDNAME=SYSPRINT,DSORG=PS,MACRF=PM,RECFM=FT,LRECL=133
POP PRINT
*
@@PAD#0 EQU *-FIXHEX0+4095
@@PAD#1 EQU @@PAD#0/(4097)
@@PAD#2 EQU (@@PAD#1*4096)
ORG FIXHEX0+@@PAD#2
*
* DCBD DEVD=DA
*
END FIXHEX0