 `ADDHEX          ADD HEX                                TAACLTZ`
```
decimal  values and  returns either  or both  a hexadecimal  or decimal
value.   Either  unsigned or  signed hex values  may be  entered.  Each
type of value can  be the same or a  different type in each of  the two

See  also  the  WRKADDHEX  command  for  a  work  display  that  is  an

The following are some examples:

**   While  intended  for  factors  involving  some  hex  value,  the
command may be used as a simple decimal calculator such as:

DECOUT(&DECOUT)

The Factor 1 value  of decimal 12 would  be added to the  Factor
2 value  of decimal  13 and  the result  of 25  returned in  the
&DECOUT  variable.   The  &DECOUT  variable must  be  defined as
*CHAR LEN(21).  The  value would be left  adjusted.  A  negative
value would be left adjusted with a preceding minus sign.

**   You  can use  WRKADDHEX  to translate  hex  to decimal  or  vice
versa by adding 0 such as:

DECOUT(&DECOUT)

**   More typical  would be to  calculate a hex offset  by adding the
offset to the initial hex value: such as:

HEXOUT(&HEXOUT)

The  decimal 13  value would be  added to X'0A'  (10 in decimal)
and the &HEXOUT  value would be X'17'.   The '*HEXU' type  means
the hex value is unsigned.

**   You may  also add  two hex  values and return  a hex  value such
as:

HEXOUT(&HEXOUT)

The  &HEXOUT variable  must be  declared as  *CHAR LEN(18).   In
this case  the X'0A' (10  in decimal)  and the  the X'11'  value
(17  in  decimal)  are  added  and  X'1B'  is  returned  (27  in
decimal).        The    actual    return    value    would    be
X'00000000000000001B'.

**   You may use  either signed or  unsigned hex values.   The  *HEXU
(hex unsigned) entry  indicates that all hex values  entered are
positive.   Using *HEXS (signed hex) allows  positive hex values
from   0  to  7FFFFFFFFFFFFFFF  and  negative  hex  values  from
8000000000000000 to FFFFFFFFFFFFFFFF.

**   Note  than  when   entering  signed  (type  *HEXS)   hexadecimal
values, the  sign of  the value is  determined by  the left-most

For  example, the values x'F', x'0F',  and x'00F' are treated as
x'F', which has a decimal of -1.

Note that hex  values from  0 to  7FFFFFFFFFFFFFFF are  positive
for both *HEXU or *HEXS.

HEXOUT(&HEXOUT)

The return value would also be X'00000000000000001B'.

**   Adding a negative hex value could be specified as:

FACTOR2(*HEXS FC 0)
HEXOUT(&HEXOUT)

The  signed  hex values  A  and  FC  are  equal to  -6  and  -4,
respectively.    The  sums  would  be X'FFFFFFFFFFFFFFFFF6'  and
-10.   See  the later  discussion  of how  negative  signed  hex
values are determined.

You may subtract also such as:

FACTOR1(*HEXU A 0) FACTOR2(*HEXU 2 0)
HEXOUT(&HEXOUT)

The decimal  result would  be 12.   The &HEXOUT  value would  be
X'00000000000000000C'.

------------------

Hex Signed  and Unsigned values  are the same for  positive values from
0   to   7FFFFFFFFFFFFFFF.     The   decimal  equivalents   are   0  to
9223372036854775807

The   decimal  equivalents   of   unsigned  hex   8000000000000000   to
FFFFFFFFFFFFFFFF are 9223372036854775808 to 18446744073709551615

The   decimal   equivalents   of   signed   hex   8000000000000000   to
FFFFFFFFFFFFFFFF are -9223372036854775808 to -1.

Negative  hex values are difficult to read.   So, they can be converted
to  their  corresponding  absolute   hexadecimal  values  using   twos'
complements,  a two  step  process.   First,  the  one complement  (the
logical  NOT operation,  also called  bitwise negation)  is calculated.
Then binary 1 is added to the result.

For example:

Hex Signed Value     Decimal Value           Notes
------------------   -------------           -------------

FFFFFFFFFFFFFFFFF1    -14                    original
00000000000000000D     13                    bitwise negation

8FFFFFFFFFFFFFFFFF   -8070450532247928833    original
007000000000000000    8070450532247928832    bitwise negation

Fortunately, you  can use  ADDHEX to  calculate a  negative  hex
value's  twos' complement  by  subtracting the  negative  signed
hex value from 0.  For example:

FACTOR2(*HEXS FFFFFFFFFFFFFFFC 0)
HEXOUT(&HEXOUT)

The   &HEXOUT   value,  X'000000000000000004',   is   the  twos'
complement of X'FFFFFFFFFFFFFFFC'.

ADDHEX escape messages you can monitor for
------------------------------------------

None.  Escape messages from based on functions will be re-sent.

-------------------------

OP            The  operation to be  performed.  *ADD  is the default
to add Factor 1 and 2.

*SUB  may be  specified  to  subtract  Factor  2  from
Factor  1.   When *SUB  is used  with  unsigned values
where  Factor  1  is  greater  than  Factor  2, ADDHEX
returns the correct negative result.

FACTOR1       A 3 part entry must be specified.

The first part  is the  Type of value  to be  entered.
The  second part  allows  a hex  value  and the  third
part allows a decimal value.

*HEXU  (unsigned  hex)  is  the  default).    Hex
values     may     range     from     X'0'     to
'FFFFFFFFFFFFFFFF'

*HEXS (signed  hex) may  be specified.   Positive
values    may   be    entered   from    X'0'   to
'7FFFFFFFFFFFFFFF'.     Negative  values  may  be
entered      from       8000000000000000       to
FFFFFFFFFFFFFFFF.   See  the previous  section on
Hexadecimal   values  for  examples  of  negative
signed values.

*DEC (decimal)  may be  specified  for up  to  20
decimal digits.   The value should be  entered as
a  left  justified character  field.    A leading
minus or  plus sign  is  permitted.   A  trailing
sign  is  not  permitted.     The  decimal  input
values     must    be     in    a     range    of
-99999999999999999999   to   99999999999999999999
(each with 20 decimal digits).

Note that a 0 must  be in the Hex value if  a non-zero
decimal value  is entered and vice versa.   You cannot
enter  both  a  non-zero  hex  value  and  a  non-zero
decimal value.

FACTOR2       A 3 part entry must be specified.

The first part  is the  Type of value  to be  entered.
The  second part  allows  a hex  value  and the  third
part allows a decimal value.

*HEXU  (unsigned  hex)  is  the  default).    Hex
values     may     range     from     X'0'     to
'FFFFFFFFFFFFFFFF'

*HEXS (signed  hex) may  be specified.   Positive
values    may   be    entered   from    X'0'   to
'7FFFFFFFFFFFFFFF'.     Negative  values  may  be
entered      from       8000000000000000       to
FFFFFFFFFFFFFFFF.   See  the previous  section on
Hexadecimal   values  for  examples  of  negative
signed values.

*DEC (decimal)  may be  specified  for up  to  20
decimal digits.   The value should be  entered as
a  left  justified character  field.    A leading
minus or  plus sign  is  permitted.   A  trailing
sign  is  not  permitted.     The  decimal  input
values     must    be     in    a     range    of
-99999999999999999999   to   99999999999999999999
(each with 20 decimal digits).

Note that a 0 must  be in the Hex value if  a non-zero
decimal value  is entered and vice versa.   You cannot
enter  both  a  non-zero  hex  value  and  a  non-zero
decimal value.

HEXOUT        An  optional  return  variable   for  the  result   in
hexadecimal.  If  used, the variable must  be declared
as *CHAR LEN(18).

DECOUT        An   optional  return  variable  for   the  result  in
decimal.  If  used, the variable  must be declared  as
*CHAR  LEN(21).   The  value  will be  left  adjusted,
will consist  of up 20 decimal digits,  and may have a

Restrictions
------------

Because  ADDHEX returns variables,  the command may only  be used in an
OPM CL  program,  or in  an ILE  program or  service  program in  which
ADDHEX is executed in an ILE CL (CLLE) module.

Prerequisites
-------------

The following TAA Tools must be on your system:

CVTHEX          Convert hex
SNDESCMSG       Send escape message

Implementation
--------------

None, the tool is ready to use.

Objects used by the tool
------------------------

Object        Type    Attribute      Src member    Src file
------        ----    ---------      ----------    ----------