アセンブラーで区分データセットのディレクトリー部を読み込む

区分データセットのディレクトリー部は、構造的には256バイト固定長の非ブロック化レコードの順次データセットと同じです。そのため、区分データセット内にどのようなメンバーが格納されているかを知るためにBSAMまたはQSAMによってディレクトリー・ブロックを読み取る方法が昔から使われてきました。この記事は、以前に掲載した「COBOLで区分データセットのディレクトリー部を直接読むサンプル」をアセンブラー言語用に作り直したものです。

QSAMのGETマクロでPDSディレクトリー部を読み込む

実際のディレクトリー・ブロックには8バイトのキーが付いており、キー部8バイト+データ部256バイトでDASD上に書き込まれています。PDSのDIRブロックの8バイトのキーには、そのディレクトリー・ブロックに格納された最後のメンバーエントリーのメンバー名が入っています。このキーは、割当て済みのDIRブロックから使用済みの最後のブロック位置を判定する目的などで利用できます。OSのように直接チャネル・プログラムを使ってアクセスする場合、目的のメンバーが格納されているDIRブロックを1回のサーチ動作で探すこともできます。
アクセス方式によってキーにアクセスするにはBSAMを使用する必要がありますが、サンプルの処理ではキーを使用しないのでCOBOLのサンプル同様にQSAMでアクセスしています。非ブロック化レコードなのでBSAMでもQSAMでもアクセス単位はブロックですが、順次データセットのアクセスでは一般的に使われるQSAMを使用しています。

PDSディレクトリー読み込みプログラム・サンプル(QSAM)

読み込んだPDSディレクトリー・ブロックは、文字’>>>’と’<<<'で囲んでSYSUT2データセットへ書き出しています。>>>と<<<に囲まれた部分が読み込んだディレクトリー・ブロック内容です。ISPFブラウザーなどのHEXモードで表示すれば、区分データセットのディレクトリー・ブロックの構造が目視できます。※区分データセットのディレクトリー内容は「区分データセットのディレクトリー構造」に解説があります。

なお、PDSEであってもPDS同様に従来から知られているBSAMやQSAMによってディレクトリー・ブロックを読み込むことができます。PDSEの内部構造にはPDSと同じディレクトリー・ブロック・データはありませんが、アクセス方式によってアクセスする場合はプログラムに対しては従来の区分データセットのメンバー部がエミュレートされるようになっています。

DESERVマクロでPDSディレクトリー部を読み込む

こちらは、QSAMやBSAMでディレクトリー・ブロックを直接読み込むのではなくDESERVマクロを利用する方法です。DESERVは、DFSMS/MVS V1R3からサポートされた比較的新しいサービスです。ディレクトリー・ブロックがそのままのイメージで入ってくるのではなく、DESERV内部の形式に展開された内容でメンバー・ディレクトリー情報が渡されます。そのため、サンプル・プログラムの出力もメンバー名+ディレクトリー部のユーザー・データで書き出しています。ユーザー・データ部分(>>>と<<<に囲まれた部分)はバイナリーのまま出力していますので、必要に応じてISPFブラウザーなどのHEXモードでの表示に切り替えて下さい。

PDSディレクトリー読み込みプログラム・サンプル(BPAM:DESERV)

DESERVマクロは少々複雑です。特に、返答領域であるSMDE(システム管理ディレクトリー項目)は、従来のPDSデータセットのメンバー・エントリーよりも構造が複雑です。マッピングされるDSECTも多く、BSAM/QSAMによるディレクトリー部アクセスに比べると煩雑になります。ISPF等で編集するJCLやソース・プログラムなどのライブラリー・データセットであれば、PDSでもPDSEでもBSAM/QSAMによる方法が手軽でしょう。
ただし、ロード・モジュールを格納しているPDSEデータセットの場合は、ロード・モジュールの形式がプログラム・オブジェクトと呼ばれる新しい形式に変わっています。プログラム・オブジェクトは別名であれば1024バイトという長い名前を付けることもできます。その場合はDESERVマクロでないとアクセスできません。