On Mon, 27 Dec 2010 19:47:24 +0200, Shimon Lebowitz <shim...@iname.com> 

wrote:

>My thanks to Sir Rob, who kindly supplied the code for a rexx exec to do

>this.
>
>Thank you!
>
>Shimon
>
>
>On Mon, Dec 27, 2010 at 1:10 PM, Shimon Lebowitz <shim...@iname.com> 
wrote:
>
>> Base64 Encode, like the 64encode pipe stage.
>>
>> Thanks!
>>
>>
>> On Mon, Dec 27, 2010 at 12:44 PM, Les Koehler 
<vmr...@tampabay.rr.com>wrote:
>>
>>> Do you mean a base64 encode? Or 64 bit encode?
>>>
>>> Les
>>>
>>>
>>> Shimon Lebowitz wrote:
>>>
>>>> Is there a 64encode EXEC (not pipe stage) hanging around anywhere,
>>>> or do I need to write my own?
>>>>
>>>> Thanks,
>>>> Shimon
>>>>

Here is some Assembler code that I have that is supposed to do base64 
encoding on z/OS.  I think I got it from the CBT "Tape", but I don't 
remember for sure! 

* PROGRAM NAME: ENCODE64
* DATE WRITTEN: October 2000
* AUTHOR:       Mark Feldman    Empire Medicare Services
* FACILITY:     XMITIP Support
* ENVIRONMENT:  Assembled under OS for MVS
*               N.B.: this program file contains lower-case characters!
*                     Characters at address TRANTBL must remain l/c!
* SUMMARY:
* ENCODE64 encodes a file into base64 format.  In the base 64
* scheme, successive 24-bit groups (3 bytes) of data are
* converted into 4 6-bit values, which are mapped to the base
* 64 alphabet.  The base64 alphabet consists of these characters:
*    0 - 25: upper case alphabet
*   26 - 51: lower case alphabet
*   52 - 61: digits 0 - 9
*        62: +
*        63: /
*
* Input bytes are encoded from left to right (in the IBM mainframe
* view of a byte), or from high-order to low-order bits, as follows:
* Input byte 1, bits 2-7   ==> Output character 1 (in Base64)
* Input byte 1, bits 0-1 + ==> Output character 2
*       byte 2, bits 4-7 +
* Input byte 2, bits 0-3 + ==> Output character 3
*       byte 3, bits 6-7 +
* Input byte 4, bits 0-5   ==> Output character 4
*
* Note that the size of the file expands about 33% during encoding,
* since each set of three characters are converted to four bytes.
*
* According to the base64 standard, special processing is required
* at the end of file if the number of bytes in the file does not
* end evenly in a 3-character group.  In this case, one or two
* pad characters ("=") are added to the last record and the rest
* of the record is left blank.  Following the standard, the
* encoded output file contains fixed length, 76 character records.
*
* This program can process a fixed (F), variable (V) and undefined (U)
* files of any record length (spanned records are not allowed).
*
* JCL for ENCODE64: The input DD is named ENCODIN;
* the output DD is ENCODOUT.  The output DCB information may be
* left blank, i.e., the RECFM and LRECL are supplied by this program.
* By default, the output LRECL=76 and the BLKSIZE defaults to an
* optimal size (this may NOT work in a non-SMS environment).
* DD SYSOUT is used for informative messages and end-of-job
* totals.  The program will abend with a condition code of 100 if
* it encounters any error (the only two checked are errors opening
* the input or output files).
*
* //JOBLIB  DD  DSN=load-library-containing-ENCODE64,DISP=SHR
* //S010     EXEC PGM=ENCODE64
* //ENCODIN  DD DSN=your-input-file,DISP=SHR
* //ENCODOUT DD DSN=encoded-output-file,
* //            UNIT=unit,SPACE=(TRK,(3,2),RLSE),
* //            DISP=(NEW,CATLG,DELETE)
* //SYSOUT      DD SYSOUT=*
* //SYSUDUMP    DD SYSOUT=Z
*
* Base64 encoding is an accepted content-transfer-encoding value
* in the Internet MIME standard.  Using base64 encoding avoids
* communication path problems that may arise if a file being
* appended to an Email contains non-printable characters.  This
* program can be used with the XMITIP Rexx program to append
* binary files to an Email originating on the mainframe.  ENCODE64
* is much faster than the encoding algorithm built into XMITIP.
*
* For more information on base64, refer to the MIME standards
* at http://www.oac.uci.edu/indiv/ehood/MIME/2045/rfc2045.html.
*
**********************************************************************
ENCODE64 CSECT
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
*
         USING *,R11                  R11
         LR    R11,R15                ADDRESSABILITY ON ...
         STM   R14,R12,12(R13)        SAVE CALLER'S REGISTERS
         LR    R14,R13                R14=CALLER'S SAVE AREA
         LA    R13,SAVEAREA           OUR SAVE AREA
         ST    R14,4(,R13)            STORE CALLERS SAVE AREA
         ST    R13,8(,R14)            AND OURS
*
* SUBROUTINE ENINIT OPENS FILES AND DOES OTHER HOUSKEEPING
         BAL   R15,ENINIT             INITIALIZE
         LTR   R1,R1                  TEST RETURN CODE
         BZ    M0010                  CONTINUE
         ABEND 100,DUMP               ABEND - OPEN FAILURES
*
* ENCODING LOGIC:
* -  GET NEXT 24-BIT GROUP FROM INPUT RECORD (ENREAD).
*    BITS 0-23 IN R2 CONTAIN THE GROUP.  R3 CONTAINS THE NUMBER
*    OF BYTES READ (0, 1, 2, OR 3).
* -  IF R3 = 0, THEN DONE.
* -  INCREMENT R3 TO GET THE NUMBER OF ITERATIONS NEEDED TO PROCESS
*    EACH SET OF 6 BITS IN R2.
* -  IN EACH ITERATION, SHIFT R2 6 BITS TO THE LEFT TO ISOLATE THE
*    NEXT 6 HIGH-ORDER BITS IN THE 4TH BYTE OF THE REGISTER.  MOVE R2
*    TO R5 FOR CALCULATIONS, ZERO ALL BITS BUT THOSE WE WANT (24-29)
*    AND THEN RIGHT SHIFT TO BITS 0-6. R5 NOW HAS NUMBER BETWEEN 0 AND
*    63 READY FOR TRANSLATION TO THE BASE64 ALPHABET.
* -  ADD THE ENCODED BYTE TO THE OUTPUT RECORD, WRITING IF FULL.
* -  AT THE END OF THE LOOP, CHECK FOR EOF AND PAD THE FINAL OUTPUT
*    RECORD IF NECESSARY.  IF R3 WAS 1, ADD TWO "=" CHARACTERS.  IF
*    R3 WAS 2, ADD ONE "=".
*    N.B.: IN THIS SECTION, I NUMBER BITS FROM RIGHT TO LEFT.
* REGISTER ASSIGNMENTS IN THIS SECTION
* R2:  24-BIT GROUP FROM FILE
* R3:  NUMBER OF BYTES IN 24-BIT GROUP (0-3)
* R4:  LOOP COUNTER (R3 + 1)
* R5:  ITERATION RESULT (6-BIT NUMBER BETWEEN 0 AND 63)
* R9:  OUTPUT RECORD POINTER (MAINTAINED ACROSS READS)
* R10: NUMBER OF BYTES IN THE OUTPUT RECORD  (ALSO MAINTAINED)
*
M0010    EQU   *
         LA    R9,OUTREC              POINT TO OUTPUT RECORD
         XR    R10,R10                COUNT OF BYTES IN OUTREC
*
*  MAIN ENCODING LOOP: E0000 THROUGH E0060
E0000    EQU   *
         BAL   R15,ENREAD             GET NEXT 24-BIT GROUP
         LTR   R3,R3                  24-BIT GROUP EMPTY?
         BZ    E0030                  YES - GO TO EOF PROCESSING
         LA    R4,1(,R3)              ITERATION COUNTER
*
E0010    EQU   *                      LOOP HERE
         SLL   R2,6                   SHIFT R2 LEFT 6-BITS
         LR    R5,R2                  MOVE TO WORK AREA
         N     R5,=X'3F000000'        ZERO ALL BITS BUT 24-29
         SRL   R5,24                  SHIFT TO BITS 0-5
*  RIGHT-JUSTIFIED 6 BITS ARE IN R5 (BITS 6-31 ARE ZERO).
*  TRANSLATE TO BASE64 ALPHABET USING TABLE 'TRANTBL'
         LA    R1,TRANTBL             LOAD ADDRESS OF TRANSLATION TABLE
         AR    R1,R5                  ADD 6-BIT NUMBER AS OFFSET
         MVC   0(1,R9),0(R1)          ADD ENCODED BYTE
         L     R1,BYTSOUT             LOAD COUNT OF BYTES WRITTEN
         LA    R1,1(,R1)              INCREMENT COUNT
         ST    R1,BYTSOUT             STORE COUNT
         LA    R9,1(,R9)              INCREMENT RECORD POINTER
         LA    R10,1(,R10)            INCREMENT RECORD LENGTH
         CH    R10,=H'76'             DID WE FILL THE RECORD (LRECL=7
6)
         BNE   E0020                  NO
         BAL   R15,ENWRITE            WRITE THIS RECORD
         LA    R9,OUTREC              POINT TO START OF OUTPUT RECORD
         XR    R10,R10                INITIALIZE THE RECORD LENGTH
E0020    EQU   *
         BCT   R4,E0010               LOOP BACK TO E0010
         TM    STATWORD,EOFFLG        AT END OF FILE?
         BZ    E0000                  NO, KEEP ON ENCODING
*
*  WRITE OUT THE LAST OUTPUT RECORD, IF ANYTHING IN IT
E0030    EQU   *
         LTR   R10,R10                ANY LENGTH?
         BZ    E0060                  ENDED ON FULL OUTPUT RECORD
*  PAD LAST 24-BIT GROUP BASED ON THE NUMBER OF BYTES RETURNED IN R3
         CH    R3,=H'1'               ONE BYTE IN FINAL GROUP?
         BNE   E0040                  NO
         MVC   0(2,R9),=C'=='         PAD WITH TWO BYTES
         B     E0050
E0040    EQU   *
         CH    R3,=H'2'               TWO BYTES IN FINAL GROUP?
         BNE   E0050                  NO - SKIP PADDING
         MVI   0(R9),C'='             PAD WITH ONE BYTE
E0050    EQU   *
         BAL   R15,ENWRITE            WRITE THE LAST RECORD
E0060    EQU   *
*
*  END OF ENCODING LOGIC
*
         BAL   R15,ENCLOS             END OF PROGRAM PROCESSING
         XR    R15,R15                GOOD STATUS
M0020    EQU   *
         L     R13,4(,R13)            LOAD CALLER'S SAVEAREA ADDRESS
         ST    R15,16(,R13)           STORE RETURN CODE
         LM    R14,R12,12(R13)        RESTORE CALLERS REGS
         BR    R14                    RETURN TO CALLER.
*
*
******************************************************************
*  SUBROUTINE: ENINIT
*  THIS ROUTINES OPENS FILES.  SAVES THE FILES RECFM AND LRECL.
*  WRITES INTRO MESSAGES.
*
ENINIT   EQU   *
         ST    R15,SAVREG15           SAVE RETURN ADDRESS
         OPEN  (SYSOUT,OUTPUT)        OPEN A DD FOR MESSAGES
*
*  OPEN THE OUTPUT FILE
         USING IHADCB,R3              DCB ADDRESSABILITY
         LA    R3,ENCODOUT            ADDRESS OF OUTPUT FILE DCB
         OPEN  ((R3),(OUTPUT))        OPEN IT
         TM    DCBOFLGS,DCBOFOPN      DID THE FILE OPEN?
         BO    I2060                  YES THEN CONTINUE ON OUR WAY
         LA    R1,OUTMSG              ERROR MESSAGE
         BAL   R15,PUTMSG             WRITE TO SYSOUT
         B     I2999                  BRANCH TO RETURN POINT
         DROP  R3
I2060    EQU   *
*
*  READ THE JFCB FOR DD 'ENCODIN' AND WRITE OUT THE NAME OF THE
*  INPUT FILE.
         LA    R2,JFCB                REG2 = ADDRESS TO PLACE JFCB
         STCM  R2,B'1111',EXLST       STORE ADDRESS OF JFCB FOR RDJFCB
         OI    EXLST,X'87'            POST THE EXIT TYPE
         LA    R3,ENCODIN             REG3 = DCB ADDRESS OF ENCODIN
         LA    R1,EXLST               REG1 = ADDRESS OF EXIT LIST
         USING IHADCB,R3              ADDRESSABILITY TO THE DCB
         STCM  R1,B'0111',DCBEXLSA    STORE ADDRESS OF EXIT LIST IN DCB
*
*   READ THE JFCB TO DETERMINE THE DSN
         RDJFCB ((R3))                READ THE JFCB
         USING JFCBDS,R2              ADDRESSABILITY TO THE JFCB
         LA    R2,JFCB                REG2 = ADDRESS OF JFCB WORK AREA
         MVC   OUTREC+31(44),JFCBDSNM STORE FILENAME IN MSG AREA
         LA    R1,DSNMSG              MESSAGE CODE
         BAL   R15,PUTMSG             WRITE TO SYSOUT
         DROP  R2                     DONE WITH THE JFCB
*
*  OPEN THE FILE TO BE ENCODED
         OPEN  ((R3),(INPUT))         OPEN ENCODIN
         TM    DCBOFLGS,DCBOFOPN      DID THE FILE OPEN?
         BO    I2010                  YES THEN CONTINUE ON OUR WAY
         LA    R1,INMSG               ERROR MESSAGE
         BAL   R15,PUTMSG             WRITE TO SYSOUT
         B     I2999                  BRANCH TO RETURN POINT
*
*  SAVE THE LRECL AND RECFM FROM THE OPEN DCB
I2010    EQU   *
         XR    R4,R4                  CLEAR REGISTER 4
         ICM   R4,B'0011',DCBLRECL    GRAB THE FILE'S LRECL
         ST    R4,TFLRECL             SAVE LRECL
         LA    R4,1(,R4)              SET CURRENT RECORD POSITION HIGH
         ST    R4,RECPTR               TO FORCE FIRST READ IN 'ENREAD'
         TM    DCBRECFM,DCBRECU       RECFM=U?
         BO    I2020                  NO - DEFAULT TO FIXED LENGTH
         TM    DCBRECFM,DCBRECV       IS THE "V" BIT SET?
         BNO   I2030                  NO
         OI    STATWORD,RECFMVB       FLAG THE FILE AS VB
         B     I2030
I2020    EQU   *
         OI    STATWORD,RECFMU        FLAG THE FILE AS UNDEFINED
I2030    EQU   *
         XR    R1,R1                  GOOD STATUS
*
I2999    EQU   *
         L     R15,SAVREG15           LOAD THE RETURN ADDRESS
         BR    R15                    RETURN
         DROP  R3
*
*
******************************************************************
*  SUBROUTINE: ENREAD
*  THIS ROUTINE GETS THE NEXT 24-BIT GROUP (3 BYTES) FROM THE
*  INPUT FILE.  THE MAJOR LOOP IN THIS ROUTINE IS CYCLED THREE
*  TIMES TO GATHER A FULL 24-BIT GROUP.  THE ONLY TIME LESS
*  THAN 24 BITS ARE RETURNED TO THE CALLER IS AT END OF FILE.
*  WHEN NECESSARY, SUBSEQUENT RECORDS ARE READ FROM 'ENCODIN'.
*
*  REGISTER ASSIGNMENTS:
*  R1: ADDRESS OF NEXT BYTE IN INPUT RECORD
*  R2: 24-BIT GROUP IN BITS 0 - 23 (RETURNED TO CALLER)
*  R3: NUMBER OF BYTES RETURNED (1-3, ALSO RETURNED TO CALLER)
*  R4: WORK REG FOR CURRENT POSITION IN INPUT RECORD (FROM RECPTR)
*  R5: WORK REG FOR CURRENT RECORD LENGTH (FROM TFLRECL)
*  R6: TEMPORARY ADDRESSABILITY, ETC.
*
ENREAD   EQU   *
         ST    R15,SAVREG15           SAVE RETURN ADDRESS
         L     R1,RECADDR             ADDRESS OF RECORD BUFFER
         L     R4,RECPTR              CURRENT OFFSET IN BUFFER
         AR    R1,R4                  NEXT BYTE IN INPUT RECORD
         L     R5,TFLRECL             LENGTH OF CURRENT RECORD
         XR    R2,R2                  CLEAR THE RESULT REGISTER
         XR    R3,R3                  CLEAR COUNT OF BYTES RETURNED
R0010    EQU   *
         CR    R4,R5                  STILL BYTES IN THIS RECORD?
         BL    R0050                  YES - SO NO NEED TO READ
*
*  READ THE NEXT RECORD.
R0012    EQU   *
         GET   ENCODIN
         TM    STATWORD,RECFMU        RECFM=U FILE?
         BZ    R0020                  TRY OTHER FORMAT
*  DETERMINE LENGTH OF RECFM=U RECORD
         USING IHADCB,R6              ADDRESSABILITY TO THE DCB
         LA    R6,ENCODIN             INPUT FILE DCB
         ICM   R5,B'0011',DCBLRECL    LOAD LENGTH OF THIS RECORD
         DROP  R6                     DROP ADDRESSABILITY TO DCB
         B     R0030
R0020    EQU   *
*  DETERMINE LENGTH OF RECFM=V RECORD
         TM    STATWORD,RECFMVB       VARIABLE FILE?
         BZ    R0030                  NO, SKIP TO COMMON LOGIC.
         ICM   R5,B'0011',0(R1)       R4=RDW OF THIS RECORD
         S     R5,=F'4'               LESS 4 TO ACCOUNT FOR RDW LENGTH
         LA    R1,4(,R1)              BUMP THE RECORD ADDR PAST THE RDW
R0030    EQU   *
*  CONTINUING FOR ALL FILE FORMATS
         ST    R1,RECADDR             STORE BUFFER ADDRESS
         ST    R5,TFLRECL             STORE RECORD LENGTH
         L     R4,RECSIN              LOAD COUNT OF RECORDS READ
         LA    R4,1(,R4)              INCREMENT COUNT
         ST    R4,RECSIN              STORE COUNT
         LTR   R5,R5                  COULD A RECORD HAVE LENGTH=0?
         BZ    R0012                  IF SO, SKIP IT AND READ AGAIN.
         XR    R4,R4                  ZERO R4 (CURR POS IN NEW REC)
R0050    EQU   *
*
*  MOVE NEXT BYTE INTO POSITION IN R2.  BUT FIRST SHIFT THE
*  REGISTER 8 BITS TO THE LEFT TO MAKE ROOM.
         SLL   R2,8                   MAKE ROOM FOR NEW BYTE
         IC    R2,0(R1)               INSERT BYTE
         LA    R1,1(,R1)              INCREMENT BUFFER ADDRESS
         LA    R3,1(,R3)              COUNT BYTES RETURNED
         LA    R4,1(,R4)              INCREMENT POSITION IN RECORD
         CH    R3,=H'3'               LOOP THREE TIMES
         BL    R0010                  GO BACK
         ST    R4,RECPTR              STORE UPDATED RECORD POINTER
         L     R6,BYTSIN              LOAD COUNT OF BYTES READ
         AR    R6,R3                  INCREMENT BY # BYTES RETURNED
         ST    R6,BYTSIN              STORE COUNT
         L     R15,SAVREG15           LOAD THE RETURN ADDRESS
         BR    R15                    RETURN
*
* INPUT FILE END-OF-FILE ADDRESS.  NOTE THAT IN THIS CASE ONLY, WE
* RETURN LESS THAN 3 BYTES IN R2 AND R3 TO THE ENCODING ALGORITHM.
* EXTRA SHIFTING MAY BE NEEDED IF LESS THAN 3 BYTES HAVE BEEN MOVE.
ENEOF    EQU   *
         OI    STATWORD,EOFFLG        FLAG EOF
         L     R6,BYTSIN              LOAD COUNT OF BYTES READ
         AR    R6,R3                  INCREMENT BY # BYTES RETURNED
         ST    R6,BYTSIN              STORE COUNT
         CH    R3,=H'2'               TWO BYTES MOVED AT EOF?
         BNE   R0100
         SLL   R2,8                   SHIFT THEM OVER ONE BYTE
         B     R0200
R0100    EQU   *
         CH    R3,=H'1'               ONE BYTE MOVED AT EOF?
         BNE   R0200
         SLL   R2,16                  SHIFT IT OVER TWO BYTES
R0200    EQU   *
         L     R15,SAVREG15           LOAD ENREAD'S RETURN ADDRESS
         BR    R15                    RETURN
*
*
********************************************************************
*  SUBROUTINE: ENWRITE
*  THIS ROUTINE WRITES AN OUTPUT RECORD, COUNTS THE RECORDS
*  WRITTEN, AND THEN CLEARS THE OUTPUT BUFFER.
*
ENWRITE  EQU   *
         ST    R15,SAVREG15           SAVE RETURN ADDRESS
         PUT   ENCODOUT,OUTREC        WRITE THE RECORD
         L     R1,RECSOUT             LOAD COUNT OF RECORDS WRITTEN
         LA    R1,1(,R1)              INCREMENT COUNT
         ST    R1,RECSOUT             STORE COUNT
         MVI   OUTREC,C' '            INITIALIZE THE BUFFER
         MVC   OUTREC+1(75),OUTREC    ... TO SPACES
         L     R15,SAVREG15           LOAD THE RETURN ADDRESS
         BR    R15                    RETURN
*
*
********************************************************************
*  SUBROUTINE: ENCLOS
*  CLOSE FILES AND WRITE PROGRAM RESULTS.
*
ENCLOS   EQU   *
         ST    R15,SAVREG15           SAVE RETURN ADDRESS
         PUT   SYSOUT,OUTREC          WRITE A BLANK LINE
         LA    R5,RECSIN              ADDRESS OF FIRST COUNT TO DISPLAY
         LA    R6,EOFMSG1             FIRST MESSAGE NUMBER TO WRITE
         LA    R7,5                   NUMBER OF MESSAGES TO WRITE
*
C0010    EQU   *
         LR    R1,R6                  R1=MESSAGE NUMBER
         L     R2,0(R5)               R2=BINARY VALUE TO DISPLAY
         BAL   R15,PUTMSG             WRITE TO SYSOUT
         LA    R5,4(,R5)              NEXT COUNT TO DISPLAY
         LA    R6,1(,R6)              NEXT MESSAGE TO DISPLAY
         BCT   R7,C0010               LOOP
*  CLOSE FILES
         CLOSE (ENCODIN,FREE)         CLOSE THE INPUT FILE
         CLOSE (ENCODOUT,FREE)        CLOSE THE OUTPUT FILE
         CLOSE SYSOUT                 CLOSE SYSOUT
         L     R15,SAVREG15           LOAD THE RETURN ADDRESS
         BR    R15                    RETURN TO MAIN ROUTINE
*
*
******************************************************************
*  SUBROUTINE: PUTMSG (ERROR OR INFORMATIONAL MESSAGES)
*  WRITES A MESSAGE TO THE SYSOUT DD STATEMENT
*  THE MESSAGE TEXT IS STORED AS LOCATION "MSGAREA".  EACH MESSAGE
*  IS 32 BYTES IN LENGTH, BUT THE FIRST BYTE CONTAINS A FORMAT
*  INDICATOR:
*  0=NO FORMATTING
*  1=CONVERT THE VALUE STORED IN R2 TO DECIMAL AND ADD TO END OF MSG
*  PUTMSG USES THE MESSAGE NUMBER PASSED IN R1 TO INDEX THE MSGAREA
*  STRINGS.  IT MOVES BYTES 2-32 OF THE MESSAGE TO THE OUTPUT AREA
*  AND THEN PERFORMS THE OPTIONAL FORMATTING.
*  INPUT REGS:
*  R1:   ERROR/INFORMATION MESSAGE NUMBER
*  R2:   BINARY FW TO BE FORMATTED
*
PUTMSG   EQU   *
         ST    R15,SAVREG15+4         SAVE RETURN ADDRESS
         LR    R0,R2
         BCTR  R1,0                   SUBTRACT ONE FROM MSG CODE
         SLL   R1,5                   MULTIPLY BY 32
         LA    R2,MSGAREA(R1)         POINT TO MESSAGE INDEXED BY R1
         MVC   OUTREC(31),1(R2)       MOVE THE MESSAGE (BYTES 2-32)
*
*  SEE IF THE MESSAGE WILL BE FOLLOWED BY A STRING OR NUMBER
         CLI   0(R2),C'0'             NO FORMATTING?
         BE    PUT030                 YES - SKIP
*  CONVERT THE NUMBER IN R2 TO DECIMAL
         CVD   R0,DBLWORD             CONVERT BIN-TO-DECIMAL
         MVC   OUTREC+31(L'EDMASK),EDMASK     MOVE MASK TO PRINT LINE
         ED    OUTREC+31(L'EDMASK),DBLWORD+3 MOVE NUMBER
*  NOW WRITE THE MESSAGE
PUT030   EQU   *
         PUT   SYSOUT,OUTREC          WRITE MESSAGE TO SYSOUT
         MVI   OUTREC,C' '            BLANK OUT .THE MESSAGE AREA
         MVC   OUTREC+1(79),OUTREC    FOR THE NEXT TIME
         L     R15,SAVREG15+4         RESTORE RETURN ADDRESS
         BR    R15                    RETURN
*
*
******************************************************************
*  WORKING STORAGE
*
         DS    0D
DBLWORD  DS    D                      WORKAREA FOR PACK/UNPACK
SAVEAREA DS    18F                    PROGRAM SAVE AREA
SAVREG15 DS    2F                     REGISTER SAVE AREA
RECSIN   DC    F'0'                   COUNT OF RECORDS READ
BYTSIN   DC    F'0'                   COUNT OF BYTES READ
RECSOUT  DC    F'0'                   COUNT OF RECORDS WRITTEN
BYTSOUT  DC    F'0'                   COUNT OF BYTES WRITTEN
RECADDR  DS    F                      ADDRESS OF INPUT RECORD
TFLRECL  DS    F                      ENCODIN LRECL
RECPTR   DC    F'0'                   INPUT BUFFER POINTER
*
OUTREC   DC    CL80' '                OUTPUT BUFFER
STATWORD DC    XL1'00'                PROGRAM STATUS WORD
RECFMVB  EQU   1                      ..FILE IS RECFM=V
RECFMU   EQU   2                      ..FILE IS RECFM=U
EOFFLG   EQU   4                      ..EOF ON INPUT
*
*   BASE64 TRANSLATION TABLE
TRANTBL  DC    CL26'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
         DC    CL26'abcdefghijklmnopqrstuvwxyz'
         DC    CL12'0123456789+/'
*
*   MESSAGE AREA
EDMASK   DC    X'402020206B2020206B202021'       EDIT MASK
MSGAREA  EQU   *                      SYSOUT MESSAGES
DSNMSG   EQU   1
         DC    CL32'0BASE64 ENCODING ..............'
OUTMSG   EQU   2
         DC    CL32'0ERROR OPENING DDNAME ENCODOUT '
INMSG    EQU   3
         DC    CL32'0ERROR OPENING DDNAME ENCODIN  '
EOFMSG1  EQU   4
         DC    CL32'1RECORDS READ .................'
EOFMSG2  EQU   5
         DC    CL32'1BYTES READ ...................'
EOFMSG3  EQU   6
         DC    CL32'1RECORDS WRITTEN ..............'
EOFMSG4  EQU   7
         DC    CL32'1BYTES WRITTEN ................'
EOFMSG5  EQU   8
         DC    CL32'0BASE64 ENCODING COMPLETE      '
*
         DS    0F
         LTORG
*
*  DEFINE DCBS
         PRINT NOGEN
ENCODIN  DCB   DDNAME=ENCODIN,DSORG=PS,MACRF=(GL),EODAD=ENEOF
ENCODOUT DCB   DDNAME=ENCODOUT,DSORG=PS,MACRF=(PM),RECFM=FB,LRECL
=76
SYSOUT   DCB   DDNAME=SYSOUT,DSORG=PS,MACRF=(PM),RECFM=FB,LRECL=
80
*
JFCB     DS    CL176                  AREA TO PLACE JFCB
EXLST    DC    A(0)                   ENCODIN DCB EXIT LIST
*
********** SYSTEM DSECTS
*
JFCBDS   DSECT
         IEFJFCBN                          JFCB SYMBOLICS
         DCBD  DSORG=(DA,PS),DEVD=(DA)     DCB SYMBOLICS
         END

-- 
Dale R. Smith

Reply via email to