On Mon, 31 Jan 2022 at 15:55, Dave Clark <dlcl...@winsupplyinc.com> wrote:

>         Good deal.  I replaced the following 104 bytes of machine code...
...
>         ...with the following 38 bytes of machine code.  Thanks.

Here's a different approach, though if you are primarily looking to
economize on code bytes, it may not be for you. It uses a 256-byte table to
contain the possible output values, and just translates the input to output
directly. (I'm assuming that the bits to the right of the top four may not
be zero.)

     SR    R0,R0           Test char not in table (for older machines)

     LA    R1,TABLE1       -> 256-byte table

     LA    R3,RECBUF+108   -> Input byte

     LA    R6,CWORK        -> One output byte

          LHI   R7,1            Length of input in bytes



TROO      TROO  R6,R3,B’0001’   Translate with no test

          BC    3,TROO          Unlikely, but be safe



TABLE1     DS 0D  Critical alignment! Input values

           DC C'1111111111111111'     00-0F

           DC C'1111111111111111'     10-1F

           DC C'1111111111111111'     20-2F

           DC C'1111111111111111'     30-3F

           DC C'2222222222222222'     40-4F

           DC C'2222222222222222'     50-5F

           DC C'2222222222222222'     60-6F

           DC C'2222222222222222'     70-7F

           DC C'3333333333333333'     80-8F

           DC C'3333333333333333'     90-9F

           DC C'3333333333333333'     A0-AF

           DC C'3333333333333333'     B0-BF

           DC C'4444444444444444'     C0-CF

           DC C'4444444444444444'     D0-DF

           DC C'4444444444444444'     E0-EF

           DC C'4444444444444444'     F0-FF


The above handles only the first of your two sets of two bits, and a
different table is needed to deal with the second. But it can all be done
in a single translate with the right table:

   SR    R0,R0            Test char not in table (for older machines)

        LA    R1,TABLE2         -> 512-byte table

   LA    R3,RECBUF+108     -> Input byte

   LA    R6,CWORK          -> Two output bytes

        LHI   R7,1              Length of input in bytes

TROT    TROT  R6,R3,B’0001’     Translate with no test

        BC    3,TROT            Unlikely, but be safe



TABLE2   DS    0D  Critical alignment!          Input values

         DC C'11111111111111111111111111111111'  00-0F

         DC C'12121212121212121212121212121212'  10-1F

         DC C'13131313131313131313131313131313'  20-2F

         DC C'14141414141414141414141414141414'  30-3F

         DC C'21212121212121212121212121212121'  40-4F

         DC C'22222222222222222222222222222222'  50-5F

         DC C'23232323232323232323232323232323'  60-6F

         DC C'24242424242424242424242424242424'  70-7F

         DC C'31313131313131313131313131313131'  80-8F

         DC C'32323232323232323232323232323232'  90-9F

         DC C'33333333333333333333333333333333'  A0-AF

         DC C'34343434343434343434343434343434'  B0-BF

         DC C'41414141414141414141414141414141'  C0-CF

         DC C'42424242424242424242424242424242'  D0-DF

         DC C'43434343434343434343434343434343'  E0-EF

         DC C'44444444444444444444444444444444'  F0-FF

This isn't a complete drop-in for your code because it produces the two
output value in adjacent bytes at CWORK, but perhaps you can accept that,
or if not, you can copy the second byte to the right place. lease excuse
typos; I haven't actually built or tested this. One could write a simple
macro to generate the table from the bit field sizes and range, and it
could handle any number of bytes with the same bit layout within each byte.


Of course I wouldn't seriously recommend this approach for dealing with one
byte, but it does show how powerful TROT in particular can be. I've been
using it to produce printable hex fields for a few years, and it sure beats
an UNPK loop. I'm sure there are other innovative uses for it.


Tony H.

Reply via email to