- 「メインフレーム・コンピューター」で遊ぼう - http://www.arteceed.net -

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で動作する簡単なコマンドライン版プログラムの作り方」 [1]でも紹介した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
             SPACE ,
             LA    R0,L'MSG3                LOAD MSG3 LENGTH
             ALR   R0,R1                    ADD INPUT DATA LENGTH
             LA    R1,MSG3                  LOAD MSG3 ADDRESS
             TPUT  (1),(0)                  ECHO IT
             B     LOOP                     LOOP UNTIL E.O.D
    EODAD    DS    0H
             :
             :
             :
    MSG1     DC    C'TSO COMMAND LINE PROGRAM STARTED.'
    MSG2     DC    C'COMMAND READY.'
    MSG3     DC    C'ENTERED COMMAND 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 ?
             BE    EODAD                    YES, DONE
             CLI   AIDCHR,X'7C'             HIT PF12 ?
             BE    CLRSCRN                  YES, CLEAR SCREEN
             CLC   CMDBUF(3),=CL3'CLR'      CLEAR SCREEN ?
             BE    CLRSCRN                  YES, CLEAR SCREEN
             SPACE ,
             LA    R0,L'MSG3+1              LOAD MSG3 LENGTH + AID CHAR
             ALR   R0,R1                    ADD INPUT DATA LENGTH
             LA    R1,MSG3                  LOAD MSG3 ADDRESS
             TPUT  (1),(0)                  ECHO IT
             B     LOOP                     LOOP UNTIL E.O.D
    CLRSCRN  DS    0H
             TPUT  CLRDATA,L'CLRDATA,       CLEAR TERMINAL SCREEN          +
                   FULLSCR
             B     LOOP
    CLRDATA  DC    X'27F5C311000013'        ERASE SCREEN(3270/6680)        +
                   X'27F5838111E0C013'      ERASE SCREEN(560/20)
    EODAD    DS    0H
             :
             :
             :
    MSG1     DC    C'TSO COMMAND LINE PROGRAM STARTED.'
    MSG2     DC    C'COMMAND READY >>'
    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編?