
Packed decimal data fields are created by specifying a “P” for
the type in a DC or DS declarative. In
this format, when assembled, each byte in the field contains 2 decimal digits
except the right-most byte in the field which contains a decimal digit followed
by a sign. The valid positive signs are
the hexadecimal characters A, C, E, and F.
The valid negative signs are the hexadecimal characters B and D. The “preferred” signs, those which are
generated by the machine or chosen by the assembler, are positive “C” and
negative “D”. It is standard practice to use “C” and “D”, but be aware that the
other signs are recognized as well.
Consider the two fields defined below,
AMOUNT1 DC
PL3’+20’
AMOUNT2 DC
PL2’-34’
In the first example the assembler generates x’00020C’ for AMOUNT1 and x’034D’ for AMOUNT2.
A packed decimal field can be created using either of the
following formats,
name DC
dPLn’constant’
or
name DS dPLn
where ‘name’ is an optional
field name
‘d’ is a duplication factor used to create consecutive
copies of the field (default = 1copy)
‘P’ represents the
packed decimal data type
‘L’ represents an optional length (default = 1 byte)
‘n’ is the number of bytes in the field
‘constant’ is the initial value of the field in decimal
format. Optionally, a decimal
point and a + or - sign can be coded but
the decimal point is not assembled.
It is important to note that if a name for a field is specified,
it will represent the address of the first byte of the field. Additionally, the name of the field will be
associated with a length attribute which equals the number of bytes in the
field. If the “Ln” construction is
omitted in a DC, the length will be just large enough to accommodate the digits
specified in the constant (along with a padded 0 on the left if the number of
digits in the constant is even). In a
DS declarative, “Ln” must be coded. The
length of a packed field defined using a DC or DS is limited to a maximum of 16
bytes. This limits the size of decimal
fields to 31 digits.
During assembly, fields that were defined consecutively in
the source with DC’s or DS’s are assigned consecutive storage locations in the
program according to the value of the location counter which is maintained by
the assembler. For example, in the
fields below, if PKD1 is associated with address x’1000’, then PKD2 is located
at x’1008’ and PKD3 is located at x’1011’.
LOCATION
1000 PKD1 DS PL8
1008 PKD2 DC PL9’20’
1011 PKD3 DS PL3
Some Typical DS’s and DC’s:
R
DS PL8 An 8-byte field reserved for packed data
S
DS PL16 The maximum size of a packed field (31
digits)
T
DS PL1 The minimum size of a packed field (1
digit)
U
DS 3PL4 Three consecutive packed fields (U refers
to
the first field)
V
DC P’123’ V = x’123C’, field is assumed positive
W
DC P’-123’ W = x’123D’
X
DC P’12’ X = x’012C’, field padded with a 0 to
fill
up 2 bytes
Y
DC PL4’12’ Y = x’0000012C’, constant shorter than the
field length -
padded
Z
DC PL2’12345’ Z = x’345C’, constant too big, truncation
occurs on the
left
DOG
DC P’123.45’ DOG = x’12345C’, decimal is treated as a
comment, not
assembled

1. Be sure and use DC instead of DS when providing a constant. Consider the example below,
AMOUNT DS
PL4’1234’
The assembler will not complain about you providing a constant
on a DS statement. It will, however,
ignore the constant and treat it as a comment. The field remains uninitialized.
2.
Be sure to make any
packed fields you define large enough to hold any possible values that might be
developed in them. You cannot err by
overestimating the size of a packed field.
On the other hand, it is disastrous to underestimate the size of a
packed field - this will result in truncation of digits in arithmetic
operations (decimal overflow exception).
3.
The specification of
“P” as the type of data does not insure that the data is packed. In fact,
many kinds of data might be stored in a packed field.