実用的なプログラムやシステム系プログラム、あるいは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 8 9 10 11 12 13 14 15 16 17 18 19 20 |
----+----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としてしまってもアセンブルは通りますから、後でデバッグする羽目になります。フィールド名なら間違えてもアセンブルでエラーになりますから、そこで間違いに気付くことができます。