Will the madness ever end?  I knew I had a working subroutine someplace that
did the fullword to 8-character conversion.  I found it over the weekend.
It was used "back in the day" by some COBOL programs for who knows what and
is 35 years old.  I tested it last evening under MVS 3.8J and it worked just
fine.  The entire CSECT is X'90' in length.

V100     TITLE 'CSECT --> BIN2CHAR, CONVERT FULLWORD TO 8 CHARACTERS'
BIN2CHAR CSECT ,                   SET &SYSECT TO AVOID PRIVATE CSECT
         SPACE 3
* * --> CSECT : CONVERT FULLWORD TO AN 8 CHARACTER STRING * * * * * * *
*        THIS ROUTINE WILL GENERATE AN 8 CHARACTER STRING FROM A      *
*     FULLWORD BINARY STRING.                                         *
*     ENTRY CONDITIONS :                                              *
*        R15 --> EP ADDRESS.                                          *
*        R14 --> RET ADDRESS.                                         *
*        R13 --> STANDARD 72 BYTE SAVE AREA.                          *
*        R1  --> PARM LIST.                                           *
*                PARM1 -> INPUT FULLWORD VALUE.                       *
*                PARM2 -> OUTPUT 8 BYTE STRING BUFFER.                *
*     EXIT CONDITIONS :                                               *
*        NO REGISTERS ALTERED.                                        *
*        OUTPUT BUFFER SET.                                           *
*        R15 --> 0 SUCCESSFUL COMPLETION.                             *
*                8 PARM ERROR.                                        *
*     CALLS SUBROUTINES : -NONE-                                      *
*     USES DSECTS : SAVESECT,WORKSECT.                                *
*     ISSUES MACROS : YREGS.                                          *
*                                                                     *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*                                                                     *
*             M O D I F I C A T I O N   L O G :                       *
*                                                                     *
*   DATE   WHO         REASON                                         *
* 01/03/77 D K SKOMSKY INITIAL PROGRAM CREATION.                      *
*                                                                     *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
         SPACE 3
SAVESECT DSECT ,                   SAVE AREA DSECT
SAVESEST EQU   *                   BEGINNING OF DSECT
SAVENOTU DS    F                   NOT USED
SAVEPREV DS    A                   PREVIOUS SAVE AREA POINTER
SAVENEXT DS    A                   NEXT SAVE AREA POINTER
SAVER14  DS    F                   R14
SAVER15  DS    F                   R15
SAVER0   DS    F                   R0
SAVER1   DS    F                   R1
SAVER2   DS    F                   R2
SAVER3   DS    F                   R3
SAVER4   DS    F                   R4
SAVER5   DS    F                   R5
SAVER6   DS    F                   R6
SAVER7   DS    F                   R7
SAVER8   DS    F                   R8
SAVER9   DS    F                   R9
SAVER10  DS    F                   R10
SAVER11  DS    F                   R11
SAVER12  DS    F                   R12
SAVESELN EQU   *-SAVESEST          LENGTH OF DSECT
         SPACE 1
WORKSECT DSECT ,                   OUR WORK AREA BUFFER
WORKSEST EQU   *                   BEGINNING OF DSECT
WORKBIN  DS    F,CL1               OUR INPUT WORD
WORKVALU DS    CL8,CL1             HOLD OUR OUTPUT VALUE
WORKSELN EQU   *-WORKSEST          LENGTH OF DSECT
         SPACE 1
BIN2CHAR CSECT ,                   CONTINUE OUR CSECT
         USING BIN2CHAR,R15        DEFINE TEMP BASE
         B     BIN2STRT            SKIP OVER THE DC'S
         DC    AL1(9),CL9'&SYSECT' EYE CATCHER
         DC    C' - ',C'&SYSDATE'              TO FIND
         DC    C'@',C'&SYSTIME'                        IN A DUMP
         SPACE 1
BIN2STRT DS    0H                  START OF OUR CODE
         USING SAVESECT,R13        OVERLAY SAVE AREA DSECT
         STM   R14,R12,SAVER14     SAVE ALL REGISTERS
         LR    R12,R15             GET EP ADDRESS
         USING BIN2CHAR,R12        SET NEW PGM BASE
         DROP  R15                 KILL TEMP BASE
         SR    R15,R15             ANTICIPATE A GOOD RC
         LM    R10,R11,0(R1)       ADDRESS OUR PARMS
         LTR   R10,R10             CHECK FIRST PARM
         BM    BIN2ERR             IF TAGGED, ERROR
         LTR   R11,R11             CHECK SECOND PARM
         BNM   BIN2ERR             MUST BE TAGGED
         LA    R9,SAVER5           POINT INTO REGISTER SAVE AREA
*                                  THIS AREA USED FOR OUR WORK AREA
         USING WORKSECT,R9         OVERLAY OUR WORKAREA
         MVC   WORKBIN,0(R10)      FETCH OUR INPUT WORD
         UNPK  WORKVALU(L'WORKVALU+1),WORKBIN(L'WORKBIN+1) ALL NIBBLES
         MVZ   WORKVALU,=(L'WORKVALU)X'00' ZAP ALL HIGH ORDER NIBBLES
*                                  WITHIN OUR OUTPUT DATA BUFFER
         TR    WORKVALU,=CL16'0123456789ABCDEF' CONVERT TO CHAR VALUE
         MVC   0(L'WORKVALU,R11),WORKVALU MOVE ANSWER TO CALLER
         DROP  R9                  DROP WORKAREA BASE REGISTER
         STM   R5,R8,SAVER5        RELOAD ZAPPED REGISTER SAVE AREA
*                                  THAT WAS USED FOR OUR WORK AREA
         B     BIN2RTRN            TIME TO END IT ALL
         SPACE 1
BIN2ERR  DS    0H                  ERROR WITH PARAMETER LIST
         LA    R15,8               SET ERROR RETURN CODE
         SPACE 1
BIN2RTRN DS    0H                  RETURN TO CALLER
         L     R14,SAVER14         RESTORE RETURN ADDRESS
*                                  R15 HAS OUR RETURN CODE
         LM    R0,R12,SAVER0       RESTORE REST OF THE REGISTERS
         MVI   SAVER14,X'FF'       MARK SAVE AREA AS INACTIVE
         SPM   R14                 RESTORE CALLERS CC, ILC, AND MASK
         BR    R14                 AND RETURN TO CALLER
         DROP  R12                 DROP PROGRAM BASE
         DROP  R13                 DROP SAVE AREA OVERLAY
         LTORG ,                   NICE PLACE FOR THE LITERAL POOL
         SPACE 1
         YREGS ,                   STD EQUATES
         END   ,                   END ASSEMBLY


-----Original Message-----
From: IBM Mainframe Assembler List [mailto:[email protected]]
On Behalf Of Tom Marchant
Sent: Tuesday, August 14, 2012 8:04 AM
To: [email protected]
Subject: Re: Printing a return code

On Mon, 13 Aug 2012 22:00:24 +0000, Hall, Keven wrote:

>That may be so but the DC statement I posted generates the same
>data as the statements in the original posting I was responding to.

No, it doesn't.  Yours generates X'0001020304050607...'.
The post that you replied to had C'0001020304050607...'.

--
Tom Marchant

>
>>From: Lennie J Dymoke-Bradshaw
>>
>>That would generate a 256 byte table in Hex.
>>For the TROT translation we need a 512 byte table in char.
>>
>>From:   "Hall, Keven" <[email protected]>
>>>
>>>Or like so:
>>>
>>>HEX2CHAR DC   256AL1(*-HEX2CHAR)
>>>
>>>From: Steve Smith
>>>>
>>>>Using TROT is a great idea, but why not code the table like so:
>>>>
>>>>HEX2CHAR DC    C'000102030405060708090A0B0C0D0E0F'
>>>>         DC    C'101112131415161718191A1B1C1D1E1F'
>>>>         DC    C'202122232425262728292A2B2C2D2E2F'
>>>>
>>>>On Wed, Aug 8, 2012 at 9:24 AM, Rob Scott wrote:
>>>>>
>>>>> I use the "TROT" instruction ...
>>>>>                    DC    X'F0F0F0F1F0F2F0F3F0F4F0F5F0F6F0F7' 00-07
>>>>>                    DC    X'F0F8F0F9F0C1F0C2F0C3F0C4F0C5F0C6' 08-0F
>>>>>                    DC    X'F1F0F1F1F1F2F1F3F1F4F1F5F1F6F1F7' 10-17
>>>>>                    DC    X'F1F8F1F9F1C1F1C2F1C3F1C4F1C5F1C6' 18-1F

Reply via email to