#if defined(W32) || defined (LNX)

   .TSO サポート

          tn3270+s3270+ind$file で TSO/E と接続し MVS のファイルを Downloadしlocalで編集,Upload します。
          3270-FTP はかなり遅いので,xeの操作性を取る場合はお試しください。
          しばらくはプライベートな Dataset で様子を見て下さい。

      !!! xeの使用によるいかなる問題が発生しても責任は負えません。!!!

          Windows版しかテストできていません。また HOSTの設定の関係で ISPF =6 画面でしかテストできていません。
          初期画面がセッションマネージャーモード(ネイティブ TSO READY 画面)の場合は
          xe3270.cfgのログオン手順定義でISPFコマンドを追加してください。

            (--TurnkeyMVSの場合--)
              "Turnkey MVS"はPC上で動くMVSR38Jです。HerculesがS370命令をエミュレートします。
              以下TurnkeyMVSに特殊なことは(--TurnkeyMVSの場合--)で記述されます。

      (0) 前提

          s3270を経由します。s3270の導入が必要です。x3270/c3270/wc3270は使用できません。
#ifdef W32
          s3270.exe のため cygwinの導入が必要です。
#endif
            (--TurnkeyMVSの場合--)
               x3270を使用する場合はその導入と、xe3270.cfgでの設定が必要です。
               x3270を使用するとその時点の3270画面が見れますが、Focusを取られるようなら
               Minimaizeしたほうが良いでしょう。
               #ifdef W32
                   xe3270を開始する前にXサーバーを開始しておかないとコネクションが
                   失敗します("Pipe Closed"ないしは"TimeOut"になります)
               #endif

          MVS に IND$FILE の導入が必要です。ISPFの=6画面で IND$FILE と打って見て下さい。
          (APVUFILEはDBCS対応していますが) IND$FILEは DBCS 対応していません。
          DBCS(DoubleByteCharacterSet)については(6)を見て下さい。
          また、SBCS言語環境でもuploadでスペース(0x20)がEBCDICブランク(0x40)にならない場合の
          の対応についても(6)を見て下さい。

            (--TurnkeyMVSの場合--)
             (注意)IND$FILEバージョンに注意。
              Hostファイル名を間違った時 ind$file106は "TARNS00file not opened"を
              返しますが、ind$file111は応答を返さず待ちになります。
              xeの対応としては事前にLISTDSコマンドで存在を確認します。
              herculesがリモートにある場合はFireWallの例外設定が必要になる場合があります。

          最初はs3270単体で次のように接続テストをしたほうがよいでしょう。
           .s3270をオペランド無しでスタート。
           .'connect hostname:23' と入力。 hostnameのところは "localhost" など
            (--TurnkeyMVSの場合--)
               'connect hostname:3270'
            hosts ファイル(/etc/hosts ないし c:\windows\system32\drivers\etc\hosts) に定義された宛先。
            表示されるステータス行のインディケータが"C"(4番目の文字)に変わりましたか。
            画面内容はいつでも ascii コマンドで確認できます。
              ascii
            と入力してログイン画面が確認できますか。
           .接続できたらLOGON 手順を実施するのですがこれはそれぞれの環境で異なります。
            文字はStringコマンドで入力します。 例えば "LOGON UID001" と入力したい場合は
              String "LOGON UID001\n"
            と入力します。 最後の \n は Enterキーの意味で これを省略した場合は次に
              Enter
            と打ち込みます。
            パスワードプロンプトが出たら同様にStringコマンドで答えます。
            REENTER などがでて、ブレークにPA1を打ちたい場合は
              PA(1)
            PFキー,例えばPF3は
              PF(3)
            と打ち込みます。

            (--TurnkeyMVSの場合--)
              String "logon herc01\n"
              と入力してログオンする


           .FTPするにはTransferコマンドを使用します。
              Transfer Direction=Receive HostFile=xxxx(yyy) LocalFile=zzz Exist=replace
            FTPコマンド入力は 画面が TSO READY のときでないと出来ませんが
            HOSTのLOGON PROCEDUREがLOGON後ISPF画面を呼び出す設定になっているかもしれません
            その場合は "String =6\n" で SPF をコマンドシェル画面にしてください。

      (1) xe の設定。
         ."::xehosts"(ワークディレクトリー内のxehostsファイル) に 接続先を定義する

          例)  T4E     Heaven         HERC01  ""        TSO=23R
                T4J     192.168.2.33   HERC02  password  TSO=23R  HOME='TEST.SRC.ASM'

          "TSO=" が3270接続識別になります。オペランドにtn3270のポート番号を指定してください
          通常は telnet の 23 で良いと思います
          "R" は TurnkeyMVS でないことを示します。
          (xe の SUB コマンドはTSOのSUBMITコマンドを使用します)

            (--TurnkeyMVSの場合--)
              TSO=3270 を指定してください
              TurnkeyMVS の場合でその submit ツールを使用せず
              TSOのSUBMITコマンドでJOBをSUBMITする場合は TSO=3270Sとしてください。

          "TSO=" がないと通常の tcpip:ftp を使用したリモートファイルアクセスとなります。
          TSOの場合ホストID(1つ目の項目)は大文字小文字区別無しです。
          パスワードはファイルを保存すると暗号化されます。

          HOMEを設定するとファイル名指定でDSNを省略してメンバー名のみを指定すればよくなります。
          例えば "e h01:" でPDS メンバーリストを表示し、"e h01:abc"でメンバーABCを開きます。
          HOMEは省略値の現行PDSの意味ですが CD コマンドでこれを一時的に変更できます。
          HOME指定を有効に戻すには "CD h02:''"のように指定してください。
          よく使用するPDSをいくつか別のホストIDで登録しておくのも良いでしょう。
          但しlogon は userID 単位なのでリモートシェルでは同じ画面を見ることになります。

         .xe3270.cfgの設定。

          (作成、修正したら1度
             xe3270 1 -wxxdir
           でエラーがないかチェックしてください。xxdir は xe3270.cfg のあるディレクトリー。
           xe3270.cfg に形式エラーがなければ
           ==>のコマンドプロンプトから
             logon hostid,userid[/pswd]
           と入力しLOGON手順を確認してください。
           ここでの hostid は xehosts の宛先でなく OS の hosts の宛先です。
          )
          ファイルの場所は xe3270 の /w コマンドラインオプションでDirを指定しますが、
          xe から自動起動される場合は 自動的にxeのワークディレクトリになります。

          このファイルでログオン手順を定義してください。
          SPF情報を表示/更新するにはSPF_LEVELとCMD_MEMBLISTの両方を指定します。
          以下のオプションIDは、
            CMD3270, OPTIONS, LOGON_CMD, LOGOFF_CMD, LOGON_ERR, TEXT_PRELOGON, SUBMITWORK
          例えば LOGON_CMD は LOGON_CMD.T4E のように
          オプションIDの後ろに宛先ID(xehostの1番目のワード)を指定できます
          指定無しは省略値を設定します。宛先IDを指定した場合は
          その宛先に対しては省略値は使用されないのでそのオプションIDに
          ついて全記述する必要があります。

            CMD3270        :s3270 にパスが通ってない場合、-charsetなどのオプションを指定する場合に使用。
                           :省略値は s3270。

            (--TurnkeyMVSの場合--)
                            x3270を使用する場合は -script オプションをつけてください
                            #ifdef LNX
                                CMD3270 = "x3270 -script"
                            #else
                                CMD3270 = "bash c:\x3270script"
                                          シェル x3270scriptは
                                              DISPLAY=:0.0  x3270 -script
                            #endif

            OPTIONS        :以下のオプションがあります
                            NOGETCONF :Turnkey MVS との接続の場合転送ミスがあったのでDownloadは2度やって
                                       両者が等しいことを確認います。これをオプションにしました。
                            NOPUTCONF :同様にUploadもUploadが完了したら再度Downloadして転送ミスがないか
                                       確認しています。NOPUTCONFでやめることが出来ます。
                            (確認オプションONで転送確認処理でエラーを見つけた場合 ::xe3270ftp.perrlogに追加モードで
                             記録しています。一時は様子を見たほうが良いでしょう)
            TEXT_PRELOGON  :VTAM LOGON 画面を識別する文字列。
                            画面でこの文字列を見つけるとLOGON手順を開始します。
                            指定がないと3270セッションがx22で切れた場合に
                            "UNSUPPORTED FUNCTION"などのエラーが戻ります。
            LOGON_CMD      :LOGON 手順を記述します。
                            LOGON手順を記述しないと "logon %userid%/%pswd%\n" を打ち込みます
                            (%userid%,%pswd%はxehostに定義したものに置換)
                            各行に入力文字列[,確認文字列,[リトライ回数]]を指定し、xe3270は順に実行します
                            確認文字列の指定がありそれがリトライ回数以内に見つからないと手順は中断します。
                            リトライ回数の省略値=8で3秒(100から700msまでの和)待ちに相当します。
                            入力文字列には最後に\nをつけてください、そうしないとEnterキーを押したことになりません。
                            例えば
                              LOGON_CMD = "LOGON %user%\n"
                            入力文字列に"Action" プレフィクスをつけて3270アクション(3270のコマンド)を指定できます
                            例えば
                              LOGON_CMD = "Action MoveCursot(6,10)"
                            ただしEnter だけは Actionプレフィックスは省略できます
                              LOGON_CMD = Enter
                            のように"Action"プレフィックスなしで指定でき、Enter処理します。
                            3270アクションはs3270,x3270-scriptのマニアルを見てください。
                            EraseEOF,Attnなどがあります
                            複数フィールドに入力するとき\nをつけずに "ABC"のように入力、
                            Home,Tabアクションでカーソル移動し最後にEnterしてください。
                            \t(TAB),\r(改行),\f(Clear)も利用できます。
                              ABC\t123\rXYZ\n
                            は
                              ABC ; Action TAB ; 123 ; Action Newline ; XYX ; Enter
                            と同等です。
                            待ち時間をとるには ミリ秒単位でsleepコマンドを入れます
                              LOGON_CMD ="Sleep 5000" は5秒waitします

                            確認MSGの先頭に"|"をつけると取り扱いが変わります。例2参照。

                            例-1. TSO READY モードでない場合
                              LOGON_CMD = "Action Reset"           # 保護エラー状態の可能性に対処。
                              LOGON_CMD = "Action Clear"           # カーソル位置の入力可能を確保。
                              LOGON_CMD = "APP TSO4\n",IKJ56700A   # VTAMの画面に "APP TSO4" を入力
                                                                   # 画面中に"IKJ56700A" が表示されるのを待ちます。
                                                                   # (IKJ56700A ENTER USERID)
                              LOGON_CMD = %user%\n,"TSO/E LOGON"   # user id を入力します
                                                                   # %user% は xehosts で定義されたuseridに置換されます
                                                                   # "TSO/E LOGON" はこの例で ユーザーIDを入力した後
                                                                   # パスワード入力用の画面のタイトル部に表示される文字列です。
                                                                   # ユーザーID入力で画面が切り替わるのを待ちます。
                              LOGON_CMD = %pswd%\n,ICH70001I       # %pswd% は xehosts で定義されたパスワードに置換されます。
                                                                   # パスワード入力で画面が ICH7001I ... LAST ACCESSED ...
                                                                   # に切り替わるのを待ちます。
                              LOGON_CMD = Enter,ISPF,3             # Enter Key を押す。
                                                                   # ISPF 初期メニュー画面が表示されるのを待ちます。
                                                                   # Timingの問題か時々ミスるので100ms sleepし3回リトライします。
                              LOGON_CMD = "=6\n"                   # SPF コマンドシェルパネルに移行します。

                            例-2  DBCS 環境のため パネルなしエラーとなる場合

                              LOGON_CMD = "Action Reset"           # 保護エラー状態の可能性に対処。
                              LOGON_CMD = "Action Clear"           # カーソル位置の入力可能を確保。
                              LOGON_CMD = "APP TSO4\n",IKJ56700A
                              LOGON_CMD = %user%\n,"TSO/E LOGON"
                              LOGON_CMD = %pswd%\n,ICH70001I
                              LOGON_CMD = Enter,"|ISPF DIALOG ERROR" #パネルエラー画面が出るので
                                                                     #Enterをおすと TSO READY モードになるが
                                                                     #("|ISPF DIALOG ERROR"のプレフィックス"|"は
                                                                     #確認MSGが見つからなくてもLOGON失敗とせず次に進む。)
                              LOGON_CMD = Enter,READY               #Enterをおすと TSO READY モードになるが
                                                                    #この状態でTSOコマンドは使用できないので
                              LOGON_CMD = ISPF\n,"OPTION ===>"      #ISPF と打って ISPFメニューを出す(但し英語モード)
                              LOGON_CMD = "=6\n","COMMAND SHELL"    #=6パネルに移行(英語モードのタイトルを確認。)

            LOGOFF_CMD     :LOGOFF手順。
                            指定方法はLOGON_CMDと同じです。
                            LOGOFF手順を指定しないと PA(1)でREADYが出るのを待って"logoff\n"を打ち込みます

                            (--TurnkeyMVSの場合--)
                              PA1でRPFがbreakされTSO READY 画面になり有効ですが

                            ISPF では breakしても元のISPF画面に戻るため LOGOFF が unsupported cmd
                            になります。

                            例-1 (SPF終了で自動で切断される場合)
                              LOGOFF_CMD = "=X\n","*** VTAM"        #SPF LOG/LIST 印刷オプション画面でとまらないように設定してください
                                                                    #VTAM LOGON プロンプト画面を確認

                            例-2
                              logoff_cmd       = "=X\n",BATCH       #LOG/LIST オプション指定画面でとまる場合
                              logoff_cmd       = "2\n","*** (T4)"   #LOG/LIST オプションを入力してVTAM画面に推移するのを待つ

            LOGON_ERR      :LOGON 手順中画面に現れるエラーメッセージと対応アクションを定義。
                            アクションの指定方法はLOGON_CMDと同じですが、
                            複数アクションを";"で連結できます。
                            但し、"CONTINUE" アクションはエラーーとせずに何らかのアクションを
                            実行するための便宜的なものです。
                            下の例では"HIT THE ENTER KEY"が現れたらEnterキーを押すが
                            このMSGはエラーでなくログオン処理を続ける(LOGON_CMDの確認文字列を探す)。
                            また例の "_"プレフィックスは確認文字列が見つからなかった時に調べることを意味する。
                            "_"がない場合はLOGON_ERRを先にチェックするので同時に確認文字列があっても
                            LOGON失敗になる。
                            例
                              LOGON_ERR = IKJ56425I,"logoff\n"      #ユーザーIDは使用中
                                                                    #ENTER LOGON OR LOGOFF に LOGOFF と応答する
                              LOGON_ERR = IKJ56420I,"Action PF(3)"  #ユーザーIDがオーソライズされてない。
                                                                    #この場合の画面はPF3でLOGOFF処理がされる
                              LOGON_ERR = IKJ56421I,"Action PF(3)"  #パスワードエラー
                              LOGON_ERR = IKJ56447I,"Action PF(3)"  #REENTER THE NEW PASSWORD ... FOR VERIFICATION
                              LOGON_ERR = IKJ56415I,"Action PF(3)"  #CURRENT PASSWORD HAS EXPIRED
                              LOGON_ERR = IKJ56710I,"Action PA(1);logoff\n"  #INVALID USERID REENTER と出た場合
                                                                             #PA1でブレークし、LOGOFF と入力する
                              LOGON_ERR = "_HIT THE ENTER KEY","Enter;Continue"       #
            RETRY_UPLOAD   :PUTCONFIRM オプションの時のリトライ回数を指定。
                            Max:4 Min:0 Default:2
            RETRY_DOWNLOAD :GETCONFIRM オプションの時のリトライ回数を指定。
                            Max:4 Min:0 Default:2
            SPF_LEVEL      :Dataset メンバーのSPF情報の取り扱い
                            0:TSOのLISTDS コマンドの出力情報を表示します。
                            1:メンバーのSPF情報がXE4S001Zを呼び出してディレクトリーリスト画面に表示されます。
                            2:SPF情報がxeのやり方で更新されます。
                            省略値はCMD_MEMBLIST指定がなければ 0, あれば 2。
            CMD_MEMBLIST   :PDSのメンバーリストを得るための TSO コマンド
                            XE4S001Z を呼び出すCALL コマンドを指定する。
                            指定しないと TSO の LISTDS コマンドが使用され、SPF 情報は表示されない。
                            例
                              CMD_MEMBLIST  = "call 'TEST01.load.asm(xe4s001z)'"
            PS_UPLOAD      :Uploadの宛先としてメンバー指定のないDSNAME指定を許すか否か
                            1:許可 0:不許可(省略値)
                            PDSが壊されるのを心配したが現在は宛先にPDSのDSNAMEを指定すると
                              TRANS17   Missing or incorrect TSO data set name: file transfer canceled
                            で拒否されるようなので。
                            1としても問題はないようです。
            RSH_ECHO       :=6 (リモートシェル)画面のとき画面出力内容を
                            xe3270画面にもエコーする。
                            1:エコーあり(省略値)。0:エコー無し。
                            エコー無しにするとカーソル移動などの応答が多少よくなる。
            TIMEOUT_CONNECT:3270接続のタイムアウト時間。
                            タイムアウトになるとxe3270の処理は続いているが一旦タイムアウト応答をxeに返すので
                            xe側は応答待ちを抜けて操作可能になる。
                            xe3270のDOS窓で状況をチェックしてください。
                            -1:無制限, 省略値=10秒
            TIMEOUT_LOGON  :接続後LOGON処理のタイムアウト時間
                            -1:無制限, 省略値=5秒
            TIMEOUT_LOGOFF :接続後LOGOFF処理のタイムアウト時間
                            -1:無制限, 省略値=3秒
            TIMEOUT_DISCONN:LOGOFF後切断処理のタイムアウト時間
                            -1:無制限, 省略値=3秒
            TIMEOUT_FTP    :FTP Send/Receive のタイムアウト時間
                            commandline parm -T override this cfg parm
                            -1:無制限,省略値=600秒(10分)
            TIMEOUT_TSOCMD :RENAME,ALLOC,FREE など xe の tso コマンドで入力したコマンドの
                            タイムアウト時間。
                            -1:無制限, 省略値=30秒
            CMD_ROW        :SPFのコマンドシェル画面のコマンド入力行の行番号
                            REDAY モードかSPFパネルモードかの判定に使用
                            省略値は 6 (先頭行は1)
            CHARSET_CFG    :ICU/iconvなどの外部コンバータを使用する場合の
                            変換定義パラメータファイル名。
                            ("EBCDIC変換"参照)

          例。(先頭 "#"はコメントです)
            #####################################################################
            # xe3270.cfg
            #          Following options may be destination specific by the format of OPT.dest=xxxx.
            #            CMD3270, OPTIONS, LOGON_CMD, LOGOFF_CMD, LOGON_ERR, TEXT_PRELOGON, SUBMITWORK
            #          For ex. LOGON_CMD.T4E is for the destination T4E on xehosts.
            #          That is default if destination specified.
            #
            #     CMD3270        :cmd to call 3270(enclose by quotation if optional parameter required)
            #                     default is s3270
            #                       To use x3270 on TurnkeyMVS -script option is required for xe.
            #                         Windows example
            #                           CMD3270 = "bash c:\x3270script"
            #                             c:\x3270script contents is as following
            #                               DISPLAY=:0.0  x3270 -script
            #                         Linux example
            #                           CMD3270 = "x3270 -script"
            #     OPTIONS        : NOGETCONF:bypass confirmation procedure to download twice then compare.
            #                    : NOPUTCONF:bypass confirmation procedure to download after upload then compare.
            #                      ex) OPTIONS=NOGETCONF,NOPUTCONF
            #     TEXT_PRELOGON  :String to detect VTAM LOGON prompt screen.
            #                     Start logon procedure when this string is found on the screen.
            #                     ex) TEXT_PRELOGON="Welcome to MVS3.8J"    # Turnkey-MVS VTAM panel detection
            #     LOGON_CMD      :defines xe3270 logon procedure.
            #                     Each line format is
            #                       Input string[,String to be detected[,Retry count]]
            #
            #                       ex)  LOGON_CMD = "LOGON %user%\n",ICH70001I
            #                       %user% and %pswd% is replaced by those defined on ::xehosts.
            #                       \n:Enter, \r:Newline, \t:Tab, \f:Clear
            #                     You can specify 3270 Actions(3270 cmd) using "Action" prefix.
            #                       ex)  LOGON_CMD = "Action Home"
            #                     To insert timing sleep,
            #                       ex)  LOGON_CMD ="Sleep 5000".
            #
            #
            #     LOGOFF_CMD     :define xe3270 LOGOFF procedure.
            #                     same format as LOGON_CMD
            #                       ex) LOGOFF_CMD = "=X\n","*** VTAM"
            #     LOGON_ERR      :defines error message to be detected in LOGON procedure and related actions.
            #                       ex) LOGON_ERR = IKJ56420I,"Action PF(3)"  #USERID NOT AUTHORIZED
            #               Ex. (in my environment)
            #                 LOGON_ERR = IKJ56425I,"logoff\n"        #REJECT BY ALREADY LOGON
            #                 LOGON_ERR = IKJ56420I,"Action PF(3)"    #REJECT BY USERID NOT AUTH
            #                 LOGON_ERR = IKJ56421I,"Action PF(3)"    #REJECT BY PSWD   NOT AUTH
            #                 LOGON_ERR = IKJ56447I,"Action PF(3)"    #REENTER THE NEW PASSWORD ... FOR VERIFICATION
            #                 LOGON_ERR = IKJ56415I,"Action PF(3)"    #CURRENT PASSWORD HAS EXPIRED
            #                 LOGON_ERR = IKJ56710I,"Action PA(1);logoff\n"  #invalid userid reenter
            #     RETRY_UPLOAD   :read-check retry count when read check after put failed.
            #                     Max:4 Min:0 Default:2
            #     RETRY_DOWNLOAD :read retry count when dual read unmatch
            #                     Max:4 Min:0 Default:2
            #     SPF_LEVEL      :process level of SPF information
            #                     0:CMD_MEMBLIST is not used.
            #                     1:SPF info is displayed on dir-list using XE4S001Z
            #                     2:SPF info is maintenanced using XE4S001Z
            #                     default is 0 without CMD_MEMBLIST or 2 with CMD_MEMBLIST specified
            #     CMD_MEMBLIST   :TSO command to get PDS memberlist
            #                     Default is TSO native "LISTDS" command
            #                     Specify you LibraryDataSet name if you use XE4S001Z prepared by xe package.
            #                       ex)  CMD_MEMBLIST  = "call 'herc01.load.asm(xe4s001z)'"
            #     PS_UPLOAD      :Allow DSNAME as upload target
            #                     1:allow 0:prohibit(default)
            #                     "1" may accidentaly cause corruption of PDS directory.
            #     RSH_ECHO       :Echo output to RSH screen to also xe3270 screen.
            #                      1:Echo ON(Default),  0:Echo OFF.
            #     CHASET_CFG     :FTP translation parameter filename
            #
            #     TIMEOUT_CONNECT:timeout to get 3270 connection by seconds
            #                     commandline parm -C override this cfg parm
            #                     -1:infinite, default=10
            #     TIMEOUT_LOGON  :timeout to LOGON after 3270 connection succeeded.
            #                     default=5
            #     TIMEOUT_LOGOFF :timeout to LOGOFF.
            #                     default=3
            #     TIMEOUT_DISCONN:timeout to disconnect after LOGOFF.
            #                     default=3
            #     TIMEOUT_FTP    :timeout to file Send/Receive
            #                     commandline parm -T override this cfg parm
            #                     default=600
            #     TIMEOUT_TSOCMD :timeout to file Send/Receive
            #                     -1:infinite, default=30
            #     CMD_ROW        :Command input line of ISPF command shell panel.
            #                     default=6 (start from 1)
            #####################################################################
             CMD3270.T4J     = "s3270 -charset japanese-939 -km windows-932 -trace -tracefile c:\xe_wd\s3270.trc"
             CMD3270.T4E     = "s3270 -trace -tracefile c:\xe_wd\s3270.trc"
             CMD3270         = s3270
             OPTIONS         = NOPUTCONF,NOGETCONF
            #RETRY_UPLOAD    = 2
            #RETRY_DOWNLOAD  = 2
             SPF_LEVEL       = 2
             CMD_MEMBLIST    = "call 'sak01.load.asm(xe4s001z)'"
             PS_UPLOAD       = 1                    #allow upload to dataset without member specification
             RSH_ECHO        = 0                    #no echo to xe3270 for input from RSH
             charset_cfg     = c:\xeebc.map
            #######
            #text_prelogon   ="Welcome to MVS3.8J"    # Turnkey-MVS VTAM panel detection
            text_prelogon      ="*** (T4)"            #VTAM panel detection
            text_prelogon      ="UNSUPPORTED FUNCTION"  #VTAM panel detection
            ###### LOGON procedure for the case initialy ISPF panel opened #########
            #
               LOGON_CMD.t4j = "Action Reset"           # Reset protection error status
               LOGON_CMD.t4j = "Action Clear"           # confirm string input availability
               LOGON_CMD.t4j = "APP TSO4\n",IKJ56700A   # Input on VTAM prompt panel
                                                    # After input "APP TSO4", wait "IKJ56700A" appears.
                                                    # (IKJ56700A ENTER USERID)
               LOGON_CMD.t4j = %user%\n,"TSO/E LOGON"   # Input user id.
                                                    # %user% is replaced by userid defined on xehosts.
                                                    # Wait "TSO/E LOGON" appears.
                                                    # "TSO/E" the string in the panel prompting input password
                                                    # in my environment.
               LOGON_CMD.t4j = %pswd%\n,ICH70001I       # %pswd% is replaced by password on xehosts.
                                                    # Wait "ICH7001I ... LAST ACCESSED ..." appears.
               LOGON_CMD.t4j = Enter,ISPF,3             # Press Enter key.
                                                    # Wait ISPF primary options menu panel.
                                                    # Retry screen check 3 times inserting 10mms sleep.
               LOGON_CMD.t4j = "=6\n"                   # change to command shell panel
            #
            ## DIALOG ERROR case when s3270 is not enable-DBCS and HOST SPF is DBCS panel(for Japanese user)
            #
               LOGON_CMD.t4e = "Action Reset"           # Reset protection error status
               LOGON_CMD.t4e = "Action Clear"           # confirm string input availability
               LOGON_CMD.t4e = "APP TSO4\n",IKJ56700A
               LOGON_CMD.t4e = %user%\n,"TSO/E LOGON"
               LOGON_CMD.t4e = %pswd%\n,ICH70001I
               LOGON_CMD.t4e = Enter,"|ISPF DIALOG ERROR",3 #error caused by DBCS environment
                                                            #but changes to native TSO READY mode by Enter key.
                                                            #prefix "|" means that it is not logon-fail
                                                            #when the msg is not found,
                                                            # and continue to next procedure.
               LOGON_CMD.t4e = Enter,READY,3               #change to native TSO READY mode by Enter key.
                                                       #any TSO cmd cause disconnection in this status.
               LOGON_CMD.t4e = ISPF\n,"OPTION ===>"        #but ISPF is only avalable cmd,
                                                       #change to english mode ISPF primary options menu panel.
               LOGON_CMD.t4e = "=6\n","COMMAND SHELL"      #change to command shell panel.
            #define action if detected error msg in logon procedure
             LOGON_ERR   = IKJ56425I,"logoff\n"            #REJECT BY ALREADY LOGON
             LOGON_ERR   = IKJ56420I,"Action PF(3)"        #REJECT BY USERID NOT AUTH
             LOGON_ERR   = IKJ56421I,"Action PF(3)"        #REJECT BY PSWD   NOT AUTH
             LOGON_ERR   = IKJ56447I,"Action PF(3)"        #REENTER THE NEW PASSWORD ... FOR VERIFICATION
             LOGON_ERR   = IKJ56415I,"Action PF(3)"        #CURRENT PASSWORD HAS EXPIRED
             LOGON_ERR   = IKJ56710I,"Action PA(1);logoff\n"  #invalid userid reenter
             LOGON_ERR = "_HIT THE ENTER KEY","Enter;Continue"       #
            ##
            #define logoff procedure
            ## for the case that Automatically disconnected when exit from ISPF
             LOGOFF_CMD = "Action Home"            #move cursor to home position
             LOGOFF_CMD = "Action EraseEOF"        #enable to input string
             LOGOFF_CMD = "=X\n","*** VTAM",3      #Set LOG/LIST option to bypass the LOG/LIST option input panel.
            #                                      #detect VTAM LOGON prompting panel
            ##SPF LOG/LIST option set required case
            #logoff_cmd    = "=X\n",BATCH       #detect LOG/LIST option input panel
            #logoff_cmd    = "2\n","*** VTAM"   #Input LOG/LIST option,then wait ISPF exit.
            #
            #TIMEOUT_CONNECT = 20
             TIMEOUT_LOGON   = 20
             TIMEOUT_LOGOFF  =  5
            #TIMEOUT_FTP     = 600
            #TIMEOUT_TSOCMD  = 60
            #CMD_ROW         =6
            #####################################################################

         .XE4S001Zの導入。
          xe3270.cfgでCMD_MEMBLISTを使用する場合は添付のXE4S001Zを
          ASSEMBLEして適当なLoadModuleLibralyに置きconfigを設定してください。
          PDSのメンバーリストにSPF情報(最終更新日時、ファイルサイズ、行数、
          ユーザー名)が表示されメンテナンスされるようになります。
          ASSEMLE の参照 MACLIB はつぎのとうりです。(SPマクロを使用しています)
              // EXEC PGM=IFOX00,PARM='...,SYSPARM=NOSNAP',...
              //SYSLIB   DD   DSN=SYS2.MACLIB,DISP=SHR
              //         DD   DSN=SYS1.MACLIB,DISP=SHR
              //         DD   DSN=SYS1.AMODGEN,DISP=SHR
          (SYSPARM=NOSNAPはデバッグ用のマクロULSNAPをNOP化するための指定です)
          Assemble 出来ない場合は添付のOBJECTをLKEDして見て下さい
          XE4S001Z.obj を LRECL=80 バイナリーモードでFTP UploadしLKED。
            //TESTLKED  PROC MBR=                                                   00040000
            //********************************************************************//00050000
            //*            LKED                                                  *//00060000
            //********************************************************************//00070000
            //********************************************************************//00127000
            //*            LINK EDIT ( AMODE=31,RMODE=ANY )                      *//00128000
            //********************************************************************//00129000
            //LKED   EXEC  PGM=IEWL,                                                00130000
            //       PARM='LET,LIST,MAP,XREF,RENT'                                  00140001
            //SYSLMOD  DD  DISP=SHR,DSN=TEST.SAK.LOAD(&MBR)                         00170000
            //SYSUT1   DD  DSN=&&SYSUT1,UNIT=SYSDA,                                 00180000
            //             SPACE=(1024,(200,50),,CONTIG,ROUND),DCB=BLKSIZE=1024     00190000
            //SYSPRINT DD  SYSOUT=*                                                 00200000
            //SYSLIN   DD DISP=OLD,DSN=TEST.SAK.OBJ(&MBR)                           00211000
            //         PEND                                                         00220000
            //SS1 EXEC TESTLKED,MBR=XE4S001Z COND=ONLY                              00230000
            //*                                                                     00260000

            (--TurnkeyMVSの場合--)
              添付のawsテープファイルからLoadModuleを導入するには次のようにしてください
               - テープユニットをオンラインにする。
                 MVS コンソールから "V 480,ONLINE" と入力
               - XE4S001Z.jclをサブミットする。
                 Turnkey-MVSのsubツールを使用するか、3270FTPで転送してTSOサブミットする。
                 jclは//DD2の導入先DSNを自分の環境にあわせて変更してください。
                 (LoadModuleはBLKSIZE=19069で作成してあります)
               - マウント要求がでるので Hercules のコンソールからawsファイルをマウントする。
                 "devinit 480 (path)XE4S001Z.aws"
                 (path)のところにはPCでのXE4S001Z.awsの経路をあたえる。

               修正してaws ファイルを作成する方法は添付の MAKEAWS.jcl を参照


      (2) TSO アクセス。

        (2-1) FTP
          xe の Edit/Browse コマンドでファイル名の先頭でHost識別を指定します。

          例)  e h02:'herc01.source.asm(memb1)'
                e herc01:source.asm(memb1)

          最初のアクセス要求の時にxe3270.exeをスタートさせ名前付パイプでやり取りします。
#ifdef LNX
          中継サーバー子プロセスxe3270を起動するTerminal Emulatorはiniファイルで
          設定されます。省略値はgnome-terminal,konsoleを探しなければxtermが使用されます。
#endif
          パイプの窓口はマルチで対3270はマルチスレッドですがこれはTimeout用で
          基本的にはシングルスレッド処理です。
          ユーザーID毎に3270エミュレータプロセスを立ち上げるので複数xeからの
          同じユーザーIDの使用が出来、一つのxeから複数のユーザーIDの使用も出来ます。
          xeを終了してもxe3270.exeは残り、xeからの次のリクエストを待ちます。
          xe3270.exeはDOS窓を持ち、状況が確認できます。
          画面出力はオプション(xeの /F オプション)で::xe3270.logにロギングします。

          xe の "TSO" コマンドでいくつかのコマンドをサポートし、
          MVS TSO コマンドの実行、障害時の応答の入力などに使用します。

          コマンドはxe3270プロセスのシェル窓からも入力できます。
          ログオン手順が失敗して正しく画面推移できなかった場合や、
          予期せぬ応答待ち画面(ENTER-,REENTER-)になった場合に
          String コマンドで適切に対応する場合などに使用します。

        (2-2) リモートシェル。

         (a) xeのコマンド出力画面(=6画面)を開いて TSO logonするとlistalcなどのTSOコマンドを
             そのまま入力できます。

             =6.xxx [FS3|FST|NFS]
                xxx :xehostに定義された宛先.
                FS3 :(b)の3270キーボードモードで開始。
                FST :(c)のTSOキーボードモードで開始。
                NFS :(全画面モードではない)画面追記モードで開始。
                指定なしは"TSO xxx: logon FS" と同じです。

             FS(全画面モード)でない場合は応答分のみが表示されます。
             入力は最初が CAP ON 状態です。
             ("\"のあとの文字はs3270に送る時には小文字に戻されます。 例えば \N-->\n。)
             Ascii/Snapコマンドは現在の 3270 画面を全画面表示します。
             全画面モードのとき画面には入力できません。
             TSO logoffでローカルコマンドモードに戻ります。
             ("TSO xxx logoff" と入力、xxxは上記のxxx)

             操作性は良くないですが SPF の画面入力も出来ます。
             xeのコマンド行からカーソル位置への文字列入力、
             s3270がサポートするActionコマンドが利用できます。
             xeのコマンド,TSO画面入力文字列,Actionコマンドで重複がある場合
             ">" プレフィックスをつければ3270入力、
             2重引用符で囲めばTSO画面文字列、
             Action プレフィックスをつければActionコマンドになります。
             例えば exec TSO コマンドは xe の EXEecute コマンドとコマンド名が重複します
             TSOへ送るには
               >exec 'herc01.source.clist(helloc)'\n
             のように入力します。
               =2
             は xe の =2 ですが
               >=2\n
               "=2\n"
             は TSO 画面への入力となります。
               Action Home
               >Action Home
               >>Home
             はs3270 Action コマンドです。

             以下のコマンドは Action プレフィックス無しで入力できます。
             大文字小文字の区別はありません
             例)  eraseeof
                  EEOF
                  >EEOF
                  >>H
                  >>D
                  >Ins

                次のキーは代替の文字入力出来ます
                   Enter:\n, TAB:\t, 改行:\r, 画面クリアー:\f, Left :\b
                   例)  >ABC\tEFG\tXYZ\n

                 3270 Action    短縮形   機能
                 -------------  ------   -------------------------------------
                 "Attn"         "Att"    //attention key
                 "BackSpace"    "BS"     //move cursor left (or send ASCII BS)
                 "BackTab"      "BT"     //tab to start of previous input field
                 "CircumNot"    "Not"    //input "^" in NVT mode, or "¬" in 3270 mode
                 "Clear"        ""       //clear screen
                 "DeleteField"  "DF"     //delete the entire field
                 "Delete"       "DC"     //delete character under cursor (or send ASCII DEL)
                 "Down"         ">D"     //move cursor down
                 "Enter"        ""       //Enter AID (or send ASCII CR)
                 "EraseEOF"     "EEOF"   //erase to end of current field
                 "EraseInput"   "EINP"   // erase all input fields
                 "Erase"        "ERA"    //erase previous character (or send ASCII BS)
                 "FieldEnd"     "FEND"   //move cursor to end of field
                 "HexString"    "Hex"    //(hex_digits) insert control-character string
                 "Home"         ">H"     //move cursor to first input field
                 "Insert"       ""       //set insert mode
                 "Key"          ""       //(keysym) insert key keysym
                 "Left"         ">L"     //move cursor left
                 "MoveCursor"   "MVC"    //(row, col) move cursor to (row,col)
                 "Newline"      "NL"     //move cursor to first field on next line (or send ASCII LF)
                 "PA"           ""       //PA n/PA(n)  Program Attention AID (n from 1 to 3)
                 "PF"           ""       //PF n/PF(n)  Program Function AID (n from 1 to 24)
                 "Reset"        "Res"    //reset locked keyboard
                 "Right"        ">R"     //move cursor right
                 "String"       "Str"    //(string) insert string (simple macro facility)
                 "SysReq"       "Sys"    //System Request AID
                 "Tab"          ""       //move cursor to next input field
                 "ToggleInsert" "Ins"    //toggle insert mode
                 "Transfer"     "FTP"    //(option=value...) file transfer
                 "Up"           ">U"     //move cursor up

                (注) 現在の所 画面のInsert状態を知る手段がありません。
                     InsertキーをToggleInsertアクションに割りあてています。

             TSOモードのときにローカルコマンドを実行したい場合はローカルコマンドの前に
             ":"を付けてください。例えば
               :grep ABC *.c

         (b) HOTキーでキーボードアクションを3270様に切り替えることができます

               3270---*::SO2 T4J:(128.101.207.9) ---------------------------- 001-(   1)-102=Rep
               ===>                                                                    ===>HALF
               11:26:41 ===>> PF(11)
                   メニュー    ユーティリティー    コンパイラー    オプション    状況
                   ヘルプ
                ------------------------------------------------------------------------------
                                        ISPF 基本オプション・メニュ   .RIGHT   . が非活動状態
                 オプション  ===>

                0   設定                 端末とユーザー・パラメーター    USER ID . : USER002
                1   ビュー               ソース・データまたは            時刻  . . : 11:24
                                         リスト表示                      端末  . . : 3277KN
                2   編集                 ソース・データの作成と変更      画面  . . : 1
                3   ユーティリティー     ユーティリティー機能の実行      言語  . . : KANJDBCS
                4   前景                 対話式言語処理                  APPL ID . : XXX
                5   バッチ               言語処理へジョブの実行要求      TSO LOGON : TSOLPS2
                6   コマンド             TSO またはワークステー          TSO PREFIX: USER002
                                         ション・コマンドの入力          SYSTEM ID : T4J1
                7   ダイアログ・テスト   ダイアログ・テストの実行        MVS 会計  : * なし *
                8   LM 機能              ライブラリー管理機能             リリース : ISPF 5.0
                9   IBM 製品             IBM プログラム開発製品


                X  を入力すると、ログ/リストの省略値を用いて終了します。
               U F U C(128.101.207.9) I 4 24 80 4 19 0x0 -
               ok
               ********** END OF FILE **********************************************************

               (日本語画面表示のためにはセットアップが必要です。(6) DBCS 環境 を参照)

               3270---*::SO1 T4E:(128.101.207.9) ------------------------------- 001-(   5)-102=Ins
               ===>                                                                       ===>HALF
               10:21:35 ===>> PF(3)
                  MENU  UTILITIES  COMPILERS  OPTIONS  STATUS  HELP

                                           ISPF PRIMARY OPTION MENU
                OPTION ===>

                0  SETTINGS      TERMINAL AND USER PARAMETERS            User ID . : USER002
                1  VIEW          DISPLAY SOURCE DATA OR LISTINGS         Time. . . : 10:20
                2  EDIT          CREATE OR CHANGE SOURCE DATA            Terminal. : 3277KN
                3  UTILITIES     PERFORM UTILITY FUNCTIONS               Screen. . : 1
                4  FOREGROUND    INTERACTIVE LANGUAGE PROCESSING         Language. : ENGLISH
                5  BATCH         SUBMIT JOB FOR LANGUAGE PROCESSING      Appl ID . : XXX
                6  COMMAND       ENTER TSO OR WORKSTATION COMMANDS       TSO logon : TSOLPS2
                7  DIALOG TEST   PERFORM DIALOG TESTING                  TSO prefix: USER002
                8  LM FACILITY   LIBRARY ADMINISTRATOR FUNCTIONS         System ID : T4E1
                9  IBM PRODUCTS  IBM PROGRAM DEVELOPMENT PRODUCTS        MVS acct. : **NONE**


                     ENTER X TO TERMINATE USING LOG/LIST DEFAULTS




               U F U C(128.101.207.9) I 4 24 80 3 13 0x0 -
               ok
               ********** END OF FILE *********************************************************

             HOTキーの省略値は A+z です。再度押すとxeのモードに戻ります。
             ヘッダー行の左端 "3270" が3270キーボードモードを示します。
             3270キーボードの機能キーは次の表のとおりです。
             xeの機能の余地を残すためPCOM省略値とは多少違います。
             たとえば "Attn" は Shift+Esc,カーソル移動はShift+です。
             画面には入力できません。コマンド入力行から入力します。
             入力文字列はEnterキーでTSO画面入力とされます。
             xeのコマンドと重複する場合xeの処理が行われます。
             例えば、
               HEX
             は xe のHEX コマンド、
               >HEX
               "HEX"
             は 画面文字入力=HEX、
               >>HEX
             は 画面文字入力=>HEX となります。
             3270 Action 入力は,3270アクションをコマンド入力行に入力し
             Alt+aキーを使用してください。

             ISPFの場合FTPコマンドLISTCなどのTSOコマンドは=6画面からしか入力できないので
             xe3270はSPF画面のときは内部的に=6を発行しています。
             従ってTSOフルスクリーンリモートシェルの画面は裏面で変わっていることがあります。

             (--TurnkeyMVSの場合--)

               RPF は =6を入力できない画面があるので=6を発行しません。
               FTP/LISTC は READY モードで使用してください。
               RPFを全画面で操作する場合別のUSERIDを使用してください。


             3270モードキーとアクション
             +----------------------------------------------------------------+
             | Key      ||(No modifier)|Shift+      | Alt+        | Ctrl+     |
             |----------||-------------|------------|-------------|-----------|
             | Enter    ||Enter/NewLine|            |             |           |
             | R-Ctrl   ||Enter/NewLine|            |             |           |
             | Esc      ||             |Attn        |SysReq       |           |
             | Tab      ||Tab          |BackTab     |             |           |
             | BackSpace||Erase        |            |             |           |
             | a        ||             |            |Action       |           |
             | c        ||             |            |Reset        |           |
             | q        ||             |            |(TSO-kbd)    |           |
             | r        ||             |            |NewLine      |           |
             | Insert   ||ToggleInsert |            |PA(1)        |           |
             | Delete   ||Delete       |            |             |DeleteWord |
             | Home     ||Home         |            |PA(2)        |           |
             | End      ||EraseEOF     |DeleteField |EraseInput   |           |
             | Left     ||             |Left        |PreviousWord |           |
             | Right    ||             |Right       |NextWord     |           |
             | Up       ||             |Up          |             |           |
             | Down     ||             |Down        |             |           |
             | PgUp     ||             |            |PA(3)        |           |
             | F1       ||PF(1)        |PF(13)      |             |           |
             | F2       ||PF(2)        |PF(14)      |             |           |
             | F3       ||PF(3)        |PF(15)      |             |           |
             | F4       ||PF(4)        |PF(16)      |             |           |
             | F5       ||PF(5)        |PF(17)      |             |           |
             | F6       ||PF(6)        |PF(18)      |             |           |
             | F7       ||PF(7)        |PF(19)      |             |           |
             | F8       ||PF(8)        |PF(20)      |             |           |
             | F9       ||PF(9)        |PF(21)      |             |           |
             | F10      ||PF(10)       |PF(22)      |             |           |
             | F11      ||PF(11)       |PF(23)      |             |           |
             | F12      ||PF(12)       |PF(24)      |             |           |
             +----------------------------------------------------------------+

             (注)右Ctrlキー使用のオプションでEnter/R-Ctrl の効果は変わります
                 また各々、条件によってはxeの機能が実行されます。
                 基本はコマンド入力行に入力があるときは xe の処理をします。

                 Enter/Rctrl:実行機能の時はカーソルがコマンド入力行にあり、
                             コマンド入力行に入力があるときはxeとしてコマンド行入力を処理します。
                 Home       :カーソルがxeのホーム(コマンド入力行の最初)にないときは
                             xeのホームにカーソルを移動します。
                 BackSpace  :カーソルがコマンド入力行でホーム位置でないときは
                             xeが処理します。
                 Ins/Del/End:カーソルがコマンド入力行にあり、コマンド入力行に入力が
                                   あるときはxeが処理します。

         (c) A+q でさらに TSO スペシフィックなモードになります。

             文字入力は1文字づつ転送されます。"\n"なども特別な意味は持ちません
             Alt+a(アクションコマンド)は使えません。
             カーソル移動はシフトキーなしです。
             このモードの時Alt+qは3270モードへ、3270ホットキーはxeモードへ
             戻します。


      (3) 障害対応

            (--TurnkeyMVSの場合--)
              .Herculesがあがってない,MVSがあがってない
              #ifdef LNX
                  "port 3270:Connection refused."(Heculesがあがっていない場合)
                  "Connection rejected,no available 3270 device"(Heculesがあがっている場合)
              #else
                  応答無し-->TimeOut(10秒)
              #endif
              .3270デバイスがつながってない。
                  応答無し-->TimeOut(10秒)
                  ---> MVSコンソールから INACT/ACTする。
                         V NET,INACT,ID=CUU0Cx,I
                         V NET,ACT,ID=CUU0Cx
                       この手順は、PF2にコマンド設定されいるとおもいます。
                       (MVSコンソールから"D PFK"で確認)
              .セッション数が定義を超えた(xeはホスト名+USERID単位でs3270を立ち上げます)
                  "no available 3270 device"
                  --->開いている 00Cx のTSO画面をどれか閉じてxe3270から使えるようにする。
                      また、端末数を増やすにはsetupterm を実行する。
                      starttermも調整してxe用にセッションを空ける。
                      (SYS1.VTAMLSTには0C0から0C7までの8個が定義されている。)
              .TSOがあがってない
                  "APPLICATION IS INACTIVE"
                  --->S TSO

          .USERID エラー
              "INPUT NOT RECOGNIZED"
              --->::xehostsを修正してリトライ
          .PSWD エラー
              "PASSWORD NOT AUTOLIZED FOR USERID"
              "REENTER -"
              --->"TSO reply hostid valid-password"コマンドを入力
                  (LOGON 手順定義の中でREENTERをブレークしLOGOFF発行まで自動化できます)
                  ::xehostsのパスワードは修正しておく
                  現在の3270画面はxe3270.exeDOS窓から"snap"コマンドで見ることが出来ます。
          .重複ログオン
              "IKJ56425I LOGON REJECTED, USERID xxxx INUSE"
              --->Native TSO READY モードの場合は内部的にLOGOFFを発行する。
                  SPF モードの場合はLOGON 手順定義の中にLOGOFF発行を組み込んでください。
                  もし複数ユーザーIDを持っていれば別のユーザーIDでLOGONし
                  "C U=xxxx"と打てば早く開放できる。

            (--TurnkeyMVSの場合--)
               "C U=xxxx"はMVS コンソールから入力します。

          .ファイルエラー
              Datasetなし、メンバーなしともに
                TRANS17   Missing or incorrect TSO data set name: file transfer canceled
              が返されます。
              x37のABENDが起こっても次のような応答が帰り、
                TRANS19   Error reading or writing to host disk: file transfer canceled

            (--TurnkeyMVSの場合--)
              ファイルが見つからないとき
              IND$FILEのv106は FILE00のエラーを返すが、v111では無限Waitします。
              xeはLISTDSコマンドで事前に存在確認をしますがWaitした場合
              MVSコンソールでS013ABENDなどが起こってないかチェックしてください。

          .タイムアウト。
              LANケーブル抜けなど
              接続時は10秒TimeOutを設定していますが、FTP時はTimeout無しです。
              xe3270.exe のDOS窓からCancelしてください。
              Timeout しても s3270から応答が帰るまではスレッドはふさがっているので
              "now busy"のエラーになります。
              xe3270が反応しない場合はTSOユーザーをキャンセルして見て下さい
                C U=userid
              だめならs3270プロセスをキャンセルしてください
              #ifdef LNX
                  killコマンドを使用。
              #else
                  Windowsの場合は同梱のツール xkp を使用してください
                  xkp -l で xe3270 の 子プロセスのs3270を特定し
                  xkp pid で kill します。
              #endif


          障害で保存できない時は Save コマンドで一旦ローカルに保存し
          CANcel で編集を終え、回復したら保存先を開いて元のファイルに戻してください。


      (4) その他。

         .TSOファイルを開く時省略値はCAPS ONで開きます。
          そうしたくない場合はCAPコマンドで省略値を変更するか
          Edit/Browseコマンドで[CAP|NOCAP]オプションを指定してください。
          CAPオプションが有効な時英小文字入力ははShiftキーを使用します。

         .RECFM=Fx,LRECL=80のTSO ファイルでは E/B コマンドはデフォルトでEN/BNの
          扱いになります。(COBOLファイルの場合 col73-80:行番号を自動メンテするには
          依然としてECNのようにNの指定が必要です)
          col.73-80が行番号でなく通常データのファイルの場合 F80のオプション指定が
          便利ですがこれも E8 コマンドを使用してください。
          別名コマンド機能を使うと/p1(col73-80を保護)などのオプションパラメータを
          毎回指定するわずらわしさを避けることができます。
          バイナリーオープン(EB,EHコマンド)するとEBCDICのままDownload/Upload
          されます。(Copy/Move/App コマンドでは /B オプションで無変換転送になります)

         .ファイル名の他ファイル参照形式は次の形式も使用できます。
            *\ --> *.  **\ --> **.   ^*\ --> ^*.
          例えば h01:'a.b.c(m1)' を開いている画面で "e *(m2)"と入力すると
          h01:'a.b.c(m2)'を開きます。 **.d(m3) で h01:'a.b.d(m3)'。
          分割画面では "^*"で他方の画面のファイル名を参照します。
          例えば h01:'a.b.c(m1)' を開いているとき分割画面のもう一方から
          "e ^*(m2)"で h01:'a.b.c(m2)'を開きます。 ^*.**(m4)で h01:'a.b(m4)'。

         .JCLのSUBMITは TSO SUBMIT コマンドを使用します
          DataSet のメンバーを開き画面上で更新ありの場合は、
          規定のDataset:'XE3270.TEMP.SUBMIT'に更新内容をUploadしSUBMITします。
            規定のSUBMIT用のワークは xe3270.cfg で変更できます。
            SUBMITWORK.xxx="'DSNAME(MEMBNAME)'" の形式で指定してください
            PDSでなくSEQUENCIAL D/S よい。1重引用符(')なしのばあい UserIDが前に着く。
          それ以外の場合(DataSet ディレクトリーリストの "#" 行コマンド,
          ファイル名指定の SUBmit コマンド、JCL メンバーを開いた画面で更新無しの場合)は
          そのまま、そのDSN(MEMBER)をSUBMIT します。
          ローカルファイルを直接TSO SUBMITはできません。Uploadしてください。

            (--TurnkeyMVSの場合--)
              Download の オーバーヘッドを避けるため TSOEの場合と同じにしたい場合は
              ::xehost での指定が必要です
                TSO=3270S
              のように "S" をつけてください。
              ローカルのファイルを直接SUBMITしたい場合は以下のようにしてください。

              JCLをSUBMITするにはTurnkey-MVSで提供されているsub.batを使用します。
              xe の SUBコマンドでこのsub.batを呼び出します。
              PATHを通して置いてください。
              Turnkey-MVSのファイルを開いている画面では単に"SUB"とすればSubmitされます。
              Localのファイルを開いている画面では "SUB sub *"と入力します。
              これが面倒な場合、別名コマンド機能を使用すれば入力を簡略化できます。
              =0.1の画面で 例えば"Alis:JCL SUB sub.bat *"としておけば
              Localのファイルを開いている画面で JCL とだけ入力すればよい。
              さらにはSUBをTSOサブミットとしたければiniファイルのサブミットコマンドの
              コマンドIDをSUB以外に換えてAliasでSUBを定義すれば可能です。
              ディレクトリーリストからSUBする場合は "#" 行コマンドを使用します。
              改名欄のオペランドは指定しても無視されます。
              "%" 行コマンドを使用する場合は改名欄に sub(Turnkey-MVSの提供するツール名)を
              入力します。

         .SPF情報について。
          xe3270.cfgでXE4S001Z使用を指定した場合、RECFM=Fx,LRECL=80のPDSのメンバーについては
          ディレクトリーのSPF情報(バージョン、更新日、行数など)をもしあれば
          それをディレクトリーリスト画面で表示します。
          F6キーで行数とファイルサイズ表示を切り替えられますが、TSOファイルの初期値は行数表示です。
          USERIDを表示するにはShift+F6を使用します。
          PDSのディレクトリーのユーザーデータ(SPF情報)はIND$FILEでUploadすると失われますがxeで更新情報を
          復元します。
          MM(更新番号)の更新は以下のようになります。
            カラム73-80が全て数字の場合カラム79-80が更新番号として使用されます
            読み込み時に全行の最大番号がそのメンバーのMMとなり編集終了時に
            そのセッションでの更新行に+1が設定されます。
            Save/Replaceコマンドで既存メンバーを置換する時もその値が設定されます。
            PCファイルなど元ファイルがSPF情報がないファイルをTSOファイルに
            Save/Replaceする場合とAppendコマンドの場合は宛先のMM+1を設定します。
            XCOpyコマンドでは複写元の値が複写され、XAPpendコマンドでは+1になります
          バージョン番号の変更はディレクトリーリストの"a"行コマンドでも可能です。
          xeのTSOコマンド-SPFサブコマンドでPDS全体(ワイルドカード指定も可能)の
          SPF情報を一括して設定することも出来ます。
          例えば、SPF情報のないPDSの全メンバーに現在行数をカウントしてSPF情報を設定したい場合など。
          (RPFでSPF情報が表示されるには作成日、更新日、ユーザー名が必要なようです)
          XE4S001Zをバッチで実行する場合、パラメータの指定はXE4S001Zのソースのヘッダー部を参照してください
            "NOW"を作成日、更新日時、初期行数、現在行数で指定できます。
            今日の日付,時間,メンバー現在行数が設定されます。
            ユーザーID以外では先頭が数字でなければ無指定とみなします。

            *(2)* UPDATE  SPF INFORMATION ON PDS DIRECTORY *********************    00330030
            * PARM FORMAT                                                           00340030
            *  '1,DSN(MEMB),VV,MM,CDATE,UDATE,UTIME,CURLINE,INITLINE,USER'          00350035
            *                                                                       00360034
            *  (START BY NOT NUMERIC MEANS MISSING OPERAND EXCEPT FOR USERID)       00370034
            *  (!!! RPF(V153) NEED CRE-DATE/UP-DATE/USERID TO DISPLY ON DIRLIST)    00380039
            *                                                                       00390034
            *  1:FUNCTION ID:UPDATE SPF INFO                                        00400030
            *  MEMB:REQUIRE. WILDCARD('*' or '?') IS AVAILABLE.                     00410030
            *  VV:VERSION                                                           00410030
            *     IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO        00420034
            *     +N FORMAT IS USED TO INCREMENT                                    00430030
            *  MM:MODIFICATION LEVEL                                                00440030
            *     IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO        00450034
            *     +N FORMAT IS USED TO INCREMENT                                    00460030
            *     'NOW' IS USED TO SET TO MAX VALUE OF COLUMN 79-80                 00470038
            *  CDATE:CREATED DATE                                                   00480030
            *     IF MISSING,KEEP CURRENT VALUE OR SET 0     IF NO PREVIOUS INFO    00490039
            *     'NOW' IS USED TO SET TO TODAY                                     00500034
            *     '000000' IS USED TO SET TO 0                                      00510039
            *  UDATE:LAST UPDATED DATE                                              00520030
            *     IF MISSING,KEEP CURRENT VALUE OR SET 0     IF NO PREVIOUS INFO    00530039
            *     'NOW' IS USED TO SET TO TODAY                                     00540030
            *     '000000' IS USED TO SET TO 0                                      00550039
            *  UTIME:LAST UPDATED TIME                                              00560030
            *     IF MISSING,KEEP CURRENT VALUE OR SET 0       IF NO PREVIOUS INFO  00570039
            *     'NOW' IS USED TO SET TO CURRENT TIME                              00580031
            *  CURLINE:CURRENT LINE COUNT                                           00590031
            *     IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO        00600033
            *     'NOW' IS USED TO SET CURRENT LINE COUNT BY READING MEMBER         00610034
            *  INITLINE:INITIAL LINE COUNT                                          00620035
            *     IF MISSING,KEEP CURRENT VALUE OR SET 0 IF NO PREVIOUS INFO.       00630035
            *     'NOW' IS USED TO SET CURRENT LINE COUNT BY READING MEMBER         00640035
            *  USER   :LAST UPDATED USER                                            00650031
            *     IF MISSING,KEEP CURRENT VALUE OR SET BLANK IF NO PREVIOUS INFO    00660031
            *SAMPLE JCL TO EXECUTE BATCH *                                          00670031
            *//GO EXEC PGM=XE4S001Z,PARM=('1','HERC01.SOURCE.ASM(MEMB),',           00680033
            *//        '01,21,061105,061125,2210,99,101,HERC01')                    00690031
            *//GO EXEC PGM=XE4S001Z,PARM=('1','HERC01.SOURCE.ASM(MEMB),',           00700033
            *//        'VV,+1,CDT,NOW,NOW,CLC,NOW,HERC01')                          00710035
            *//GO EXEC PGM=XE4S001Z,PARM='1,HERC01.SOURCE.ASM(MEMB),DEL'            00720035
            *//STEPLIB DD DISP=SHR,DSN=HERC01.LOAD.ASM                              00730031


      (5) 使用上の制限

      !! .SPF情報の更新はPDSディレクトリを排他使用する必要があるためDISP=OLDのアロケーションで
          失敗することがあります。(RESERVEは使用していません)
          SPFを閉じて再度保存を実行してください。
         .UploadはデフォルトではPDSのメンバーに限ります。
         .RECFM=F(B)へUploadすると短文は拡張され,長文は分割されるようです。
          Downloadでは後ろのブランクはトリムされます。
          バイナリーモードでDown/Upすると固定長の整数倍にNullが補填される様です。
      !! .TurnkeyMVSとのS3270+IND$FILEでは原因は不明ですがUp/Downとも転送で1画面量(24*76=1844?)程度の重複出力が
          発生することがありました。
          以下の対応をしていますが現在のメインフレーム相手で必要かどうかはわかっていません。
          ::xe3270ftp.errlogにappendモードで記録しているので様子を見てください。
          cfgファイルで NOPUTCONFIRM,NOGETCONFIRM オプションを指定することにより以下の処理は省略出来ます

          xe3270ではGet時Downloadを2回行い2回の内容が同じ時にGet成功としています。
          2回の内容が異なる時リトライします。リトライ回数はxe3270.cfgで指定します。
          (タイムアウトの場合はリトライしません)
          リトライ回数を超えて失敗した場合一時Dir(Windowsでは TEMP環境変数のDir,Linuxでは/tmp)に
          検証用のファイル残されています。
          ネーミングはxe32270pc.xxxxxxxx.GETn.yy。xxxxxxxxはメンバー名。
          エラーが発生したら通常は再度Getをすればよいでしょう。
          PDS全体ののコピーが中断した場合などには"/y-"(同じ名前がある場合は飛ばして処理続行)
          オプションを指定すると良いでしょう。

          Put時は再Downloadし送信元と同じか確認します。
          SPF_LEVELを指定した場合はタイムスタンプが変わっていなければOKと判断しますが
          そうでない場合サイドDownloadして中身を比較します。
            (--TurnkeyMVSの場合--)
              RPF V1M5R3ではディレクトリーには時分しか保存されていません
              分単位の誤差が出ます。

          バイナリーモードのPutではRECFM=Fを維持するためNullが補填され
          長さが変わることがあります。Nullが追加されただけの場合はxe3270の窓に
          出力されます(Logオプションを指定していればLogにも残ります)が
          xe上は正常保存とみなされます。
          READ-CHKが失敗したらPut/Getをリトライします。リトライ回数はxe3270.cfgで指定します。
          リトライ回数を超えて失敗した場合一時Dirに検証用のファイル残されています。
          ファイルのネーミングはxe32270pc.xxxxxxxx.PUTGETn.yyです。xxxxxxxxはメンバー名。
          編集の保存によるPutでこれが発生した場合は更新を破棄しても編集後の内容が
          ワークDir\xeftpwdに残されています。ファイルのネーミングは xxxxxxxx.timestampです。
          エラーが発生したら通常は再度保存すればよいでしょう。
          但し、IND$FILEはRECFM=Fxで行長がLRECLを超える場合行を分割します。
          READ-CHKはこれを考慮し行分割を検知したらxe3270窓に警告を出しBeepを二回
          鳴らしますがUploadは成功とします。
          EBCDIC<-->ASCIIの変換が可逆的でない文字が含まれる場合にも発生します。
          ファイル比較ツールなどで確認してください。(xeパッケージにも
          比較ツールxfcがついています)

      !! .保存時に再度DownloadしてUpload時と内容が同じか確認しますが
          (前項のタイムスタンプチェック)ファイルのロックはかかっていません。
          SPFはDownload中であることを知らないので上書きされる可能性もあります。
          必要に応じて xe の TSO コマンド Alloc/Free を利用してください。
          保存時に内容がUpload時と異なる場合ワークDir\xeftpwdに
          最初にDawnloadした時のと保存時にDownloadしたのと両方のファイルが
          残されていますが現在の状態は自分で保存する必要があります。
          保存を強行するか他ファイルに保存してください。
          保存ファイル名はxxxxxxxx.timestampとxxxxxxxx.timestamp.UPDATECHKです。

         .xe3270はLogon Procedure,LISTDS コマンドなどの応答メッセージの様式に
          依存しています。cfgで対応できない場合xe3270?.cを修正してください。

      (6) DBCS 環境
         .Uploadでスペース(ASCII-0x20)がブランク(EBCDIC-0x40)以外に変換される障害について。
          s3270 で -charset を指定した場合 charset によってはこの障害が起こります。
          s3270のソースパッケージ中の X3270.xadで定義されているEBC->ASCII 変換テーブル(#table)で
          ASCIIコードが >0x40 のコードポイントが 0 となっているもので発生すると思われます。
          バージョン3.3では
            hebrew, bracket437, simplified-chinese, chinese-gb18030,
            japanese, japanese-290, japanese-930, japanese-939, japanese-1390, japanese-1399
          がそうでした。
          charset.c の以下の修正を試して見て下さい。(全体はsample Dirに入れておきます)
          この1行の追加です ==> if (iso!=0x20)  //a#20080802 for the case apace->unprintable

            /* Process a single character definition. */
            static void
            remap_one(unsigned char ebc, KeySym iso, remap_scope scope, Boolean one_way)
            {
                unsigned char cg;

                /* Ignore mappings of EBCDIC control codes and the space character. */
                if (ebc <= 0x40)
                    return;

                /* If they want to map to a NULL or a blank, make it a one-way blank. */
                if (iso == 0x0)
                    iso = 0x20;
                if (iso == 0x20)
                    one_way = True;

                if (!auto_keymap || iso <= 0xff) {
            #if defined(X3270_FT) /*[*/
                    unsigned char aa;
            #endif /*]*/

                    if (scope == BOTH || scope == CS_ONLY) {
                        if (iso <= 0xff) {
                            cg = asc2cg[iso];

                            if (cg2asc[cg] == iso || iso == 0) {
                                /* well-defined */
                                ebc2cg[ebc] = cg;
                                if (!one_way)
                                    cg2ebc[cg] = ebc;
                            } else {
                                /* into a hole */
                                ebc2cg[ebc] = CG_boxsolid;
                            }
                        }
                        if (ebc > 0x40) {
                            ebc2asc[ebc] = iso;
                            if (!one_way)
                                asc2ebc[iso] = ebc;
                        }
                    }
            #if defined(X3270_FT) /*[*/
                    if (iso <= 0xff && ebc > 0x40) {
                        /* Change the file transfer translation table. */
                        if (scope == BOTH) {
                            /*
                             * We have an alternate mapping of an EBCDIC
                             * code to an ASCII code.  Modify the existing
                             * ASCII(ft)-to-ASCII(desired) maps.
                             *
                             * This is done by figuring out which ASCII
                             * code the host usually translates the given
                             * EBCDIC code to (asc2ft0[ebc2asc0[ebc]]).
                             * Now we want to translate that code to the
                             * given ISO code, and vice-versa.
                             */
                            aa = asc2ft0[ebc2asc0[ebc]];
                            if (aa != ' ') {
                                ft2asc[aa] = iso;
                                if (iso!=0x20)  //a#20080802 for the case apace->unprintable
                                asc2ft[iso] = aa;
                            }
                        } else if (scope == FT_ONLY) {
                            /*
                             * We have a map of how the host translates
                             * the given EBCDIC code to an ASCII code.
                             * Generate the translation between that code
                             * and the ISO code that we would normally
                             * use to display that EBCDIC code.
                             */
                            ft2asc[iso] = ebc2asc[ebc];
                            asc2ft[ebc2asc[ebc]] = iso;
                        }
                    }
            #endif /*]*/
                } else {
                    /* Auto-keymap. */
                    add_xk(iso, (KeySym)ebc2asc[ebc]);
                }
            }

         .IND$FILEはDBCSをサポートしません。
          (APVUFILEが対応,日本語についてはxeで対応(次項))
          s3270の -charset での指定は画面出力、キーボード入力にのみ有効です。
          FTPの部分は1バイトごとのASCII<-->EBCDIC 変換です(X3270.xadの変換テーブル使用)
          また、ホストがDBCS環境の場合 適切な -charset オプションを指定しないと
          LOGON手順がISPF パネルなしで失敗します。
          (クライアントがDBCSである通知をあげないと、//ISPPALT DD を探さず、DBCS用パネルが見つからない)
          幸いパネル無しのダイアログエラーにEnterを入力しREADYになった場面でISPFを入力すると
          英語モードでISPFがあがるのでxeはファイルをDownload/Uploadできます。
          サンプルのLOGON 手順はこの例を手順化しています。

          画面をDBCSとしたい場合は日本語の例ですが以下のようにします
            a. s3270 を -DX3270_DBCS でコンパイルする。(cygwin bash上で configure, make )
               (私の環境でコンパイルしたものを同梱しています、 s3270-cygwin-dbcs.exe)
               s3270 を
                 ./configure --enable-dbcs
               s3270の.configure が
                 Warning disabling DBCS
               を発するかもしれません
               ICUの導入が必要です、但しcygwinの場合特殊事情があります。
               ICUのライブラリー名がcygwinのときlinuxの時とは変わります
               s3270 の configure 4803 行あたりの1行に以下の修正を加えた後
                   #LIBS="-licui18n  $LIBS"
                   LIBS="-lsicuuc  $LIBS"
               次のようにconfigure && make してください
                   export LIBS="-lsicudt -enable-auto-import"
                   ./configure --enable-dbcs

            b. ICUの導入
               通常の導入以外に次の場合は追加の操作が必要です。
               s3270 の -charset に japanese を指定すると
                   Cannot find ICU converter for ibm-1027
               が出るかもしれません。
                    japanese    :1027(SBCS)+300(DBCS)   1027は英小文字の空いたところにカタカナを埋めたもの
                    japanese-290: 290(SBCS)+300(DBCS)    290はカタカナに英小文字を埋めたもの
               がX3270.xadに定義されています。
               930=290(SBCS)+300(DBCS),939=1027(SBCS)+300(DBCS)のはずですが
               X3270.xadではDBCSのみ定義してあるので jpanese-939もcp1027なしで通るようです。
               cp1027を使用する場合は以下のようにします
               ibm-1027....ucm ファイルは s3270のパッケージに含まれて居ます。
               s3270を --enable-dbcs で configure すると makeconv により対応する.cnvファイルが
               作成されるのですが、ICU_DATA 環境変数の設定がうまく効いてくれず japaneseが使えませんでした。
               そこでICUのmakeに組み込みました。以下のようにします
                 s3270 パッケージの ucm ファイルを icu\source\data\mappings にcopy
                 icu\source\data\mappings\ucmlocal.mk を作成する

                    ###
                    UCM_SOURCE_LOCAL =  ibm-1027_P100-1995.ucm\
                    ibm-1385_P100-1997.ucm\
                    ibm-300_P110-1997.ucm\
                    ibm-837_P100-2000.ucm
                 ./configure --enable-static && make する

         .xeの日本語対応は以下の通りです。
            HOST のコードページは CP1027(英小文字拡張)とCP290(カタカナ拡張)を
            サポート。xehosts で DBCS= オプションの指定が必要です。
              DBCS={cp930|cp939}
                cp930のSBCSはcp290、cp939のSBCSが CP1027です
            DBCSは新JIS(JIS83)+IBMです。(CV コマンド参照)

            固定長レコードDatasetのみの対応です。
            バイナリーモードでDownloadしLRECLで行分割し
            EBCDIC->SJIS変換。SO(0x0e)/SI(0x0f)はスペース(0x20)に置換します。
            Upload時は行ごとにSJIS->EBCDICS変換。
            DBCSの前後にSO/SIを設定する方法は、スペースがあれば置換、
            なければ挿入しますが延長した分は後続のスペースを潰して補います。
            但し、1桁のスペースは潰しません。
            変換後がLRECLより長い場合、変換前がLRECL以下の場合は切り捨て、
            元々長文の場合はLRECLで行分割します(SO/SOの途中の考慮はしていません)。
            変換後がLRECLより短い意場合はLRECL迄スペースパディングします。
            従って73-80の行番号の位置がずれる可能性があります。
  #ifdef LNX
            LANGがEUC の場合に EBCDIC<=>euc.jp 変換します。
            EUC.JPでは半角カタカナが2バイト(0x8e+xx)になります
            半角カタカナが含まれているとDownloadで行長がLRECLを超えます。
            xeが行長エラーの警告を出します。
            Uploadで行長が短くなるとスペースパディングされます。
            従って73-80の行番号の位置がずれる可能性があります。
            SPF ファイルとして開いたファイルはできるだけ73-80の行番号位置を保持しようとします
            Save/Rep/CreコマンドではプロファイルでNUMSTDが設定されていれば考慮されます。
            XCOpy/XMOvコマンド、行コマンドCopy/Moveでは考慮されません。
  #endif


#endif