08.1TSO端末との通信(TPUTとTGET)
MVSにおけるアプリケーション・プログラムの基本はバッチ処理ですが、端末と直接会話できるオンライン処理もポピュラーな利用方法です。基幹業務システムに使うプログラムはCICSやIMSなどを使って動かしますが、簡単な処理や非定型なものはTSOが便利です。ここではTSO端末への簡単なI/O方法(送受信処理)を紹介します。MSPとVOS3にも共通な方法です。
QSAMによるTSO端末I/Oプログラム
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- OPEN (SYSPRINT,OUTPUT, OPEN SYSPRINT/SYSIN + SYSIN,INPUT) PUT SYSPRINT,MSG1 PUT MESSAGE-1 LOOP DS 0H PUT SYSPRINT,MSG2 PUT MESSAGE-2(COMMAND PROMPT) GET SYSIN,CMDBUF GET COMMAND FROM SYSIN PUT SYSPRINT,MSG3 ECHO IT B LOOP LOOP UNTIL E.O.D EODAD DS 0H CLOSE (SYSPRINT,,SYSIN) CLOSE SYSPRINT/SYSIN : : : MSG1 DC CL80'TSO COMMAND LINE PROGRAM STARTED.' MSG2 DC CL80'COMMAND READY.' MSG3 DC C'ENTERED COMMAND IS ==>' CMDBUF DC CL80' ' SYSPRINT DCB DDNAME=SYSPRINT, + MACRF=PM,DSORG=PS,RECFM=FB,LRECL=80 SYSIN DCB DDNAME=SYSIN,EODAD=EODAD, + MACRF=GM,DSORG=PS,RECFM=FB,LRECL=80
別のカテゴリー「TSOで動作する簡単なコマンドライン版プログラムの作り方」でも紹介したQSAMによる方法です。SYSPRINTが端末への出力、SYSINが端末からの入力になります。MVSとMSPではこのDD名でLOGONプロシージャーに割り当てられていますからDD名を合わせればそのまま使えます。
サンプルのようにSYSPRINTとSYSINをそれぞれOUTPUTモード、INPUTモードでOPENします。端末へメッセージを送信するにはPUTマクロを、端末からデータを受信するにはGETマクロを発行します。PUTマクロはメッセージの送信がキューイングされれば完了するので、実際にはすぐに戻ってきます。GETマクロは端末でキー入力が行われるまで待ち状態になります。端末で「/*」の2文字が入力されるとEODと見なされ、DCBで指定したEODADルーチンが実行されます。EODADを使わず任意の文字列を入力終了の判定に使ってもかまいません。処理が終了したらSYSPRINTとSYSINをCLOSEします。
サンプルでは簡単にするために固定長レコードを使っていますが、メッセージ領域を節約するならRECFM=VBで可変長レコード形式にしてもかまいません。
TSOプログラミングAPIによるTSO端末I/Oプログラム?
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- TPUT MSG1,L'MSG1 PUT MESSAGE-1 LOOP DS 0H TPUT MSG2,L'MSG2 PUT MESSAGE-2(COMMAND PROMPT) TGET CMDBUF,L'CMDBUF GET COMMAND FROM TERMINAL + GR1 <-- contain input length space , clc cmdbuf(2),=CL2'/*' pseudo eod ? be eodad yes, done la r0,l'msg3 load msg3 alr r0,r1 add data r1,msg3 address tput (1),(0) echo it b loop until e.o.d eodad ds 0h : : msg1 dc c'tso command line program started.' msg2 c'command ready.' msg3 c'entered is ==>' CMDBUF DC CL80' '
最初のサンプルと同じことをQSAMではなくTSOのプログラミングAPIであるTPUTマクロとTGETマクロに置換えたものです。TSOでのみ動かすプログラムならTPUT,TGETの方がすっきりしますが、QSAMを使えばバッチ、TSO両方でも実行できるメリットがあります。
TPUT/TGETではメッセージ領域のアドレスと長さを指定します。TGETでは実際にメッセージ領域に格納されたデータ長がGR1に返されます。サンプルでは省略していますがTPUTもTGETも復帰コードを返しますので本来ならば正しくチェックすべきです。QSAMと違って/*入力でのEOD処理はされませんから自分で入力データを判定して同様のことを行っています。TPUT/TGETは可変長データの取り扱いになりますが、RECFM=VB指定のQSAMアクセスと異なりRDWを必要としません。
TSOプログラミングAPIによるTSO端末I/Oプログラム?
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- TPUT MSG1,L'MSG1 PUT MESSAGE-1 LOOP DS 0H TPUT MSG2,L'MSG2,ASIS PUT MESSAGE-2(COMMAND PROMPT) TGET AIDCHR,1,ASIS GET AID BYTE TGET CMDBUF,L'CMDBUF GET COMMAND FROM TERMINAL + GR1 <-- contain input length space , cli aidchr,x'f3' hit pf3 ? be eodad yes, done clc cmdbuf(2),=CL2'/*' pseudo eod aidchr,x'7c' pf12 clrscrn clear screen cmdbuf(3), =CL3'CLR' screen la r0,l'msg3+1 load msg3 length + aid char alr r0,r1 add data r1,msg3 address tput (1),(0) echo it b loop until e.o.d clrscrn ds 0h clrdata,l'clrdata, terminal + fullscr loop clrdata dc x'27f5c311000013' erase screen(3270>>' MSG3 DC C'ENTERED COMMAND IS ==>' AIDCHR DC CL1' ' CMDBUF DC CL256' '
少しだけ込み入った処理を加えます。プロンプトの「COMMAND READY >>」の直後にデータを入力できるようにして、入力に使ったキーの種類(アテンションID)をエコーするようにしたものです。TPUTマクロでのASISオプションはメッセージを自動改行しないようにします。TGETマクロでのASISオプションは端末からの入力データを制御コード付きのままプログラムに渡します。
TPUTでコマンドプロンプト・メッセージを送った後、ASIS指定のTGETで入力を待ち合わせます。1バイトのみ読み込んでいるのはどのキーでデータを入力したのかを得るためです。ENTERキーであればx7D、PF1?PF9キーであればxF1?xF9、PF10?PF12キーであればx7A?x7Cとなります。次のTGETで入力された文字列を読み込んでいます。エコーするメッセージの先頭には入力に使われたAID文字を表示するようにしています。
/*の入力またはPF3キー押下であれば処理を終了します。CLRの入力またはPF12キー押下であれば画面をクリアーします。画面のクリアーは端末画面(3270)のデータストリーム・制御コードを直接定義して行っています。データストリームの解説はここでは行いませんが、CLRDATAに定義したコードが画面消去用のデータです。(先頭のx27を除く)これをFULLSCRオプションのTPUTで送信します。FULLSCRオプションを使う時はデータストリームの先頭にx27を付加する決まり事になっています。
TPUTおよびTGETはMVSのAPIではなくTSOのAPIです。
マクロの詳細はTSOのプログラミング・マニュアルを参照して下さい。
- z/OS:TSO/E Programming Services
- MSP:TSS/Eコマンド開発手引書
- VOS3:システムプログラマの手引?TSS編?