OVERLAY(名前{:位置 | *NEXT})

OVERLAY キーワードは、1 つのサブフィールドの記憶域に別のサブフィールド の記憶域、またはデータ構造自体の記憶域をオーバーレイ させます。 このキーワードを使用することができるのは、データ構造サブフィールドの場合 だけです。

「名前」記入項目のサブフィールドが、「位置」パラメーターによって 指定された位置で、名前パラメーターによって指定された記憶域にオーバーレイします。 位置が指定されていない場合には、デフォルトの値として 1 が使用されます。

注:
位置パラメーターは、サブフィールドのタイプとは無関係にバイト単位です。

OVERLAY(名前:*NEXT) を指定すると、サブフィールドを、オーバーレイされたフィールド 内の次に使用可能な位置に置きます。 (これは、このサブフィールドより前にあり、同じサブフィールドをオーバーレイ する他のすべてのサブフィールドを過ぎた後の、最初のバイトです。)

キーワード OVERLAY には次の規則が適用されます。

  1. 名前パラメーターは現行データ構造の中で前に定義された サブフィールドの名前、または現行データ構造の名前でなければなりません。
  2. データ構造が修飾されている場合は、OVERLAY キーワードに対する最初のパラメーターは、データ構造名を修飾せずに指定する必要があります。 以下の例では、サブフィールド MsgInfo.MsgPrefix がサブフィールド MsgInfo.MsgId をオーバーレイします。
    D MsgInfo         DS                  QUALIFIED
    D   MsgId                        7
    D     MsgPrefix                  3    OVERLAY(MsgId)
    
  3. 位置パラメーターを指定する場合には、小数点以下の桁数のない 0 より大き い値でなければなりません。 これは、数値リテラル、数値を戻す組み込み関数、または数値定数とすること ができます。 位置が名前付き定数の場合には、この指定の前に定義されていなければなり ません。
  4. OVERLAY キーワードは「開始位置」記入項目がブランクでない時には使用す ることができません。
  5. 名前パラメーターがサブフィールドである場合、定義中のサブフィールドは、 名前パラメーターによって指定されたサブフィールドの中に完全に含まれていなければなりません。
  6. OVERLAY キーワードを使用して定義したサブフィールドの位置合わせは、手操 作で行なわなければなりません。 正しく位置合わせされなかった場合には、警告メッセージが出されます。
  7. OVERLAY キーワードの最初のパラメーターとして指定されたサブフィールド が配列の場合には、OVERLAY キーワードは配列の各要素に適用されます。 すなわち、定義中のフィールドは同じ要素数を持つ配列として定義されます。 この配列の最初の要素は オーバーレイされる配列の最初の要素にオーバーレイし、この 配列の 2 番目の要素はオーバーレイされる配列の 2 番目の要素にオーバーレイ し、以下同様となります。 この状況では、OVERLAY キーワードを持つサブフィールドに配列キーワードを指 定することはできません。(図 129 を参照 してください) SORTA (配列の分類)も参照してください。

    OVERLAY キーワードの最初のパラメーターとして指定されたサブフィールド名が 配列で、その要素の長さが定義中のサブフィールドの長さより長い場合には、定 義中のサブフィールドの配列要素は連続して記憶されません。 このような配列は、PARM 命令の結果のフィールドとして、または MOVEA 命令の 演算項目 2 または結果のフィールドの中では使用することができません。

  8. データ構造に ALIGN キーワードを指定する と、OVERLAY(名前:*NEXT) を指定して定義されたサブフィールド は、その任意の位置に位置合わせされます。 ポインター・サブフィールドは、常に 16 バイト境界に位置合わせされます。
  9. オーバーレイしているサブフィールド をもつサブフィールドが定義されていない場合、そのサブフィールド は次のように暗黙的に定義されます。

図 129. キーワード DIM および OVERLAY を持つサブフィールドの記憶域割り振り
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++++++++++
D DataStruct      DS
D   A                           10    DIM(5)
D     B                          5    OVERLAY(A)
D     C                          5    OVERLAY(A:6)

記憶域でのフィールドの割り振り:

A(1) A(2) A(3) A(4) A(5)
B(1) C(1) B(2) C(2) B(3) C(3) B(4) C(4) B(5) C(5)
図 130. キーワード DIM および OVERLAY を持つサブフィールドの記憶域割り振り
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
D DataStruct      DS
D   A                            5
D     B                          1    OVERLAY(A) DIM(4)

記憶域でのフィールドの割り振り:

A
B(1) B(2) B(3) B(4)  

次の例は、サブフィールドのオーバーレイ位置を定義する ための方法を 2 つ、すなわち、(名前:位置) を指定して明示的 に行う方法と、(名前:*NEXT) を指定して暗黙的に行う方法を示しています。

図 131. NEXT を使用したサブフィールド・オーバーレイ位置の定義
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
 * Define subfield overlay positions explicitly
D DataStruct      DS
D   PartNumber                  10A
D     Family                     3A   OVERLAY(PartNumber)
D     Sequence                   6A   OVERLAY(PartNumber:4)
D     Language                   1A   OVERLAY(PartNumber:10)
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
 * Define subfield overlay positions with *NEXT
D DataStruct      DS
D   PartNumber
D     Family                     3A   OVERLAY(PartNumber)
D     Sequence                   6A   OVERLAY(PartNumber:*NEXT)
D     Language                   1A   OVERLAY(PartNumber:*NEXT)