.APIとマクロ命令
実用的なプログラムやシステムプログラム、OSの出口ルーチンなどを作っていく場合、避けて通れないのがMVSの各種プログラミングサービスの利用です。プログラムに必要と思われるさまざまな機能がAPIで提供されています。プログラムから直接分岐命令で呼ばれるもの、SVC命令で呼び出すもの、新しいAPIはPC命令でクロスメモリーサービスを使った呼び出しなども行われます。いずれも一般のプログラムはOSが提供するマクロ命令を使って呼び出しますので、細かな命令を最初は意識する必要はありません。
APIマクロはSYS1.MACLIBもしくはSYS1.MODGENに格納されています。一般のプログラムで使用するものはほぼSYS1.MACLIBで提供されます。
マクロには実際にAPIを呼び出すためのパラメーター設定や呼び出し命令などを展開する「実行マクロ」と、APIのパラメーター領域やOSのコントロールブロックをラベル名で参照するための「マッピングマクロ」に大別されます。
マクロによっても多少異なりますが、実行マクロには標準・リスト・実行の3形式があります。標準形式はサービスの呼び出し命令列とパラメーターの定義が同時に行われるもので、一般的に使われるものです。リスト形式はパラメーター定義だけを行うもので、データ領域に記述します。実行形式はサービスの呼び出し部分だけが展開され、リスト形式で定義したパラメーターと組み合わせて利用します。リスト+実行形式の組み合わせは、プログラム内に書き込みが出来ないリエントラント構造(再入可能)のプログラムでマクロを使う場合や、プログラムの外にある領域をパラメーターに指定したい場合に利用します。最初のうちは標準形式のマクロでいろいろなAPIの基本的な使い方を覚えてから、必要に応じてリスト+実行形式でのコーディング・テクニックを身につけるといいでしょう。
マッピングマクロは基本的に領域のDSECTを展開するものです。
身近なものにアクセス法のDCBをマッピングする「DCBD」と言うマクロがあります。DCBDを使うと、プログラム内に定義したDCBの各フィールドを名前で参照できるようになります。DCBマクロ自体に定義したパラメーターを変更したり、プログラムの処理によって値が変わるようなパラメーターを設定する際に利用します。
OSの出口ルーチンなどを作る場合は、出口ルーチンに渡されたパラメーター領域や処理に必要なOSのコントロールブロックを参照するために利用します。
DSECTについては「OS/390アセンブラーハンドブック」に説明があります。
DCBDマクロによるDCBのマッピング・サンプル
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- LA R2,SYSPRINT GR2 --> SYSPRINT DCB AREA USING IHADCB,R2 ADDRESS IT MVC DCBDDNAM,PARMDDN SET DDNAME FROM EXEC PARAMETER MVC DCBLRECL,PARMLNG SET LRECL FROM EXEC PARAMETER OI DCBRECFM,DCBRECF+DCBRECBR SET RECFM=FB OPEN ((2),OUTPUT) OPEN TARGET DATASET : : : CLOSE ((2)) CLOSE DATASET FREEPOOL IHADCB : PARMLNG DC H'0' LRECL FROM PARAMETER PARMDDN DC CL8' ' DDNAME FROM PARAMETER : SYSPRINT DCB DDNAME=********, OUTPUT DATASET DCB + DSORG=PS,MACRF=PM * DCBD DEVD=DA,DSORG=QS DCB MAP
DEVDパラメーターにDA(DASDの意味)、DSORGパラメーターにQS(QSAM)を指定した例です。
DD名などを固定せずに、パラメーターで指定できるようにするプログラムではOPENまでにDD名をDCBに直接セットする必要があります。このような時マニュアルなどを見てDCBの各フィールドの位置がわかったとしても、MVC SYSPRINT+40(8),PARMDDN のように書くのはよくありません。OSのコントロールブロック類は必ず対応するマッピングマクロを使い、サンプルのようにフィールド名で参照するようにします。MVSではAPIに直接関連するフィールドの名前や位置が変更されることはありませんが、ユーザー独自のパラメーター領域などでは、将来変更などがされた際にアセンブルし直すだけで対応できるようになります。また SYSPRINT+40 よりは DCBDDNAM の方がDCBのどこをいじっているか、直感でわかります。また40を間違えて50としてしまってもアセンブルは通りますから、後でデバッグする羽目になります。フィールド名を間違えればアセンブルでエラーになりますからそこで間違いに気づくことができます。