ZONE形式、PACK形式とは?用途に応じてそれぞれを変換する方法

ZONE形式、PACK形式とはどういう意味か。それぞれを変換する方法について記載します。

ZONE10進

ZONE形式は、COBOLやアセンブラなどのプログラムで使用される一般的なデータ形式です。ZONE形式では、各桁の数字と符号が文字コード(EBCDICなど)の形式で格納されます。数字の部分(下位4ビット)と符号の部分(上位4ビット)が同じバイトに格納されます。正の数の場合、符号部分は「C」が使用され、負の数の場合は「D」が使用されます。

数値 +1234 のZONE10進をEBCDICで表現すると次の通りになります。

C1 C1 C3 C4

PACK10進

PACK形式は、COBOLやアセンブラなどのプログラムで使用される数字を効率的に格納するデータ形式です。PACK形式では、各桁の数字が4ビットで表現され、2つの数字が1バイトにまとめられます。最後の4ビットには符号が格納されます。正の数は「C」で表され、負の数は「D」で表されます。桁数が偶数の場合、先頭4ビットに「0」が入ります。

数値 +1234 のPACK10進をEBCDICで表現すると次の通りになります。

01 23 4C

ZONE→PACK変換

「ZONE形式」「PACK形式」はそれぞれ変換することが出来ます。「ZONE形式」から「PACK形式」に変換する方法を確認していきます。

* ZONEデータを定義
ZONE     DC    C'0123'
* PACKデータ領域を確保
PACKNUM  DS    PL2
* 変換処理
         LA    R1,ZONE      * R1にZONEデータのアドレスをロード
         LA    R2,PACKNUM   * R2にPACKデータ領域のアドレスをロード
         UNPK  PACKNUM,ZONE * ZONEデータをPACK形式に変換

まずZONE形式の文字列’1234’をZONEラベルに定義します。次にPL2(PACK形式データ領域の長さ)でPACK形式のデータを格納する領域を確保しています。そして、MVC命令を使用してZONEデータをPACKデータ領域にコピーし、最後にUNPK(Unpack Numeric)命令でZONE形式のデータをPACK形式に変換しています。このコードを実行すると、PACKNUM領域にPACK形式の’F1 F2 F3’が格納されます。

PACK→ZONE変換

次に「PACK形式」から「ZONE形式」に変換する方法を確認していきます。

* PACKデータを定義
PACKNUM  DC    PL2'123'   * PACK形式の123を定義
* ZONEデータ領域を確保
ZONE     DS    CL4         * ZONE形式のデータを格納するための領域を確保
* 変換処理
         LA    R1,PACKNUM  * R1にPACKデータのアドレスをロード
         LA    R2,ZONE     * R2にZONEデータ領域のアドレスをロード
         PACK  ZONE,PACKNUM  * PACKデータをZONE形式に変換

まずPACK形式のデータ(’123’)をPACKNUMラベルに定義します。次にCL4(ZONE形式データ領域の長さ)でZONE形式のデータを格納する領域を確保しています。そして、PACK命令を使用してPACK形式のデータをZONE形式に変換し、ZONEデータ領域に格納しています。このコードを実行すると、ZONEデータ領域にはZONE形式で表現された’12 3C’が格納されます。

参考

ゾーンおよびパック 10 進数データのサイン表記 – IBM
ゾーン 10 進数形式 – IBM
パック 10 進数形式 – IBM