
PACK is a SS2
instruction which is designed to convert data from character or zoned decimal
format to packed decimal format. The
operation proceeds by transferring the contents of operand 2 to operand 1. Bytes in operand 1 and 2 are referenced from
right to left within the fields. The
rightmost byte of operand 2 is referenced first, and the zone and numeric parts
of the byte are reversed and placed in the rightmost byte of operand 1. Then the numeric parts of the next two bytes
of operand 2 are placed in the next byte of operand 1. This process continues by “packing” the
numeric parts of operand 2 into operand 1, always moving from right to left,
taking two bytes and packing into one byte.
The example below illustrates this idea. The first field, AZONED, contains zoned decimal data, while the
second field, APK, shows the results of executing “PACK APK,AZONED”. We assume the following definitions,
AZONED DC
ZL7’7893023’
APK DS
PL4
...
PACK APK,AZONED

Since PACK is SS2,
each operand contributes a 4-bit length which is stored in the second byte of
the object code as pictured at the top of this page. The maximum length in the object code is B’1111’ = 15. Since the assembler always decrements
lengths by 1, packed fields are limited to a maximum of 16 bytes. It is also important to note that the
lengths of both fields are used to execute this instruction. For instance, if APK was defined as PL3, the
high-order digits in the packed field (those on the left) are truncated.
PACK APK,AZONE

On the other hand, if there are too few bytes in operand 2,
zeros will be padded on the left in operand 1 as illustrated below. Assume APK was defined as PL6.
PACK APK,AZONED

Some unrelated PACK’s:
A
DC C’12345’ = X’F1F2F3F4F5’
B
DC Z’1234’ = X’F1F2F3C4’
C
DC C’ABC’ = X’C1C2C3’
D
DC X’12ABCDEF’ = X’12ABCDEF’
P
DS PL3
Q
DS PL2
R
DS PL4
PACK P,A P =
X’12345F’ SIGN UNCHANGED
PACK Q,A Q =
X’345F’ LEFT TRUNCATION
PACK R,A R =
X’0012345F’ PAD ZEROES
PACK P,B P =
X’01234C’
PACK Q,B Q =
X’234C’ LEFT TRUNCATION
PACK R,B R =
X’0001234C’ PAD ZEROES
PACK P,C P =
X’00123C’ PACK WILL PROCESS
ANY DATA WITHOUT
ABEND
PACK P,D P =
X’02BDFE’ IT WILL PACK...

1. PACK works with any
kind of data. That does not mean that
you will compute correct results. It
simply means that the program will not abend because of the data contents in a
field you are packing. Packed decimal
problems show up when arithmetic instructions are executed.