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

   .Turnkey MVS サポート

          Hercules+MVS-R38J のファイルを Downloadしlocalで編集,Upload します。
          "Turnkey MVS"はPC上で動くMVSR38Jです。HerculesがS370命令をエミュレートします。

      (0) 前提

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

          Turnkey MVS に IND$FILE の導入が必要です。
         (注意)IND$FILEバージョンに注意。
            Hostファイル名を間違った時 ind$file106は "TARNS00file not opened"を
            返しますが、ind$file111は応答を返さず待ちになります。
            xeの対応としては事前にLISTDSコマンドで存在を確認します。

          herculesがリモートにある場合はFireWallの例外設定が必要になる場合があります。

          最初はs3270単体で次のように接続テストをしたほうがよいでしょう。
           .MVSがあがったらs3270をオペランド無しでスタート。
           .'connect hostname:3270' と入力。 hostnameのところは "localhost" など。
             表示されるステータス行のインディケータが"C"(4番目の文字)に変わりましたか。
             画面内容は'ascii'コマンドで確認できます。
             'ascii'と入力してログイン画面が確認できますか。
           .'String 'logon herc02/cul8tr\n'と入力してログオンする
           .'Transfer Direction=get HostFile=xxxx(yyy) LocalFile=zzz Exist=replace'で
             FTPしてみる。
      (1) xe の設定。

         ."::xehosts"(ワークディレクトリー内のxehosts) に 接続先を定義する

          例)  herc01  Heaven         HERC01  ""        TSO=3270
                h02     192.168.2.33   HERC02  password  TSO=3270 HOME='herc01.test.src'

          "TSO=" が3270接続識別になります。オペランドにherculesのポート番号を指定してください
          "TSO=" がないと通常の tcpip:ftp を使用したリモートファイルアクセスとなります。
          TSOの場合ホストID(1つ目の項目)は大文字小文字区別無しです。
          パスワードはファイルを保存すると暗号化されます。

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

         .xe3270.cfgの設定。
          このファイルはなくても良いですがSPF情報取得/更新をするためには必要です。
          ファイルの場所は /w コマンドラインオプションでDirを指定しますが、
          xe から自動起動される場合はワークディレクトリになります。
          SPF情報を表示/更新するにはSPF_LEVELとCMD_MEMBLISTの両方を指定します。

          例。(先頭 "#"はコメントです)
            #####################################################################
            # xe3270.cfg
            #     CMD3270        :cmd to call 3270
            #                     default is s3270
            #                       To use x3270(-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"
            #     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_MEMLIST 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.
            #     PS_UPLOAD      :Allow DSNAME as upload target
            #                     1:allow 0:prohibit(default)
            #                     "1" may accidentaly cause corruption of PDS directory.
            #     TIMEOUT_CONNECT:timeout to get 3270 connection by seconds
            #                     commandline parm -C override this cfg parm
            #                     -1:infinite, default=10
            #     TIMEOUT_FTP    :timeout to file Send/Receive
            #                     commandline parm -T override this cfg parm
            #                     -1:infinite(default)
            #     TIMEOUT_TSOCMD :timeout to file Send/Receive
            #                     -1:infinite, default=30
            #   sample
            #     RETRY_UPLOAD  = 1
            #     CMD_MEMBLIST  = "call 'herc01.load.asm(xe4s001z)'"
            #####################################################################
            #CMD3270         = s3270
            #CMD3270         = "x3270 -script"
            #CMD3270         = "bash g:\src\xe\x1x3270s"
             RETRY_UPLOAD    = 2
             RETRY_DOWNLOAD  = 2
             SPF_LEVEL       = 2
             CMD_MEMBLIST    = "call 'sak01.load.asm(xe4s001z)'"
             PS_UPLOAD       = 1
            #TIMEOUT_CONNECT = 20
            #TIMEOUT_FTP     = 600
            #TIMEOUT_TSOCMD  = 60
            #####################################################################

         .XE4S001Zの導入。
          xe3270.cfgでCMD_MEMBLISTを使用する場合は添付のXE4S001Zを
          ASSEMBLEして適当なLoadModuleLibralyに置きconfigを設定してください。
          PDSのメンバーリストにSPF情報(最終更新日時、ファイルサイズ、行数、
          ユーザー名)が表示されメンテナンスされるようになります。
          ASSEMLE の参照 MACLIB はつぎのとうりです。
              // EXEC PGM=IGOX00,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化するための指定です)

          添付の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の経路をあたえる。


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

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

          最初のアクセス要求の時にxe3270.exeをスタートさせ名前付パイプでやり取りします。
          パイプの窓口はマルチで対3270はマルチスレッドですがこれはTimeout用で
          基本的にはシングルスレッド処理です。
          ユーザーID毎に3270エミュレータプロセスを立ち上げるので複数xeからの
          同じユーザーIDの使用が出来、一つのxeから複数のユーザーIDの使用も出来ます。
          xeを終了してもxe3270.exeは残り、xeからの次のリクエストを待ちます。
          xe3270.exeはDOS窓を持ち、状況が確認できます。
          画面出力はオプション(xeの /F オプション)で::xe3270.logにロギングします。

          xe の "TSO" コマンドでいくつかのコマンドをサポートし、障害対応に使用します。

          コマンド出力画面(=6画面)を開いて TSO logonするとlistalcなどのTSOコマンドを
          そのまま入力できます。TSO logoffでローカルコマンドモードに戻ります。
          TSOモードのときにローカルコマンドを実行したい場合はローカルコマンドの前に
          ":"を付けてください。例えば ":grep ABC *.c"。

          コマンドはxe3270プロセスのシェル窓からも入力できます。
          xeが応答待ちでHungした時などに使用します。


      (3) 障害対応

          .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"コマンドを入力
                  ::xehostsのパスワードは修正しておく
                  あるいは "cancel" を入力してスレッドを落とし
                  リトライする。
                  現在の3270画面はxe3270.exeDOS窓から"snap"コマンドで見ることが出来ます。
          .重複ログオン
              "IKJ56425I LOGON REJECTED, USERID xxxx INUSE"
              --->内部的にLOGOFFを発行する。
                  中断されたユーザーIDの場合したMVS コンソールから "C U=xxxx"と打てば
                  早く開放できる。
          .ファイルが見つからない
              IND$FILEのv106は FILE00のエラーを返すが、v111では無限Waitします。
              xeはLISTDSコマンドで事前に存在確認をしますがWaitした場合
              MVSコンソールでS013ABENDなどが起こってないかチェックしてください。
          .タイムアウト。
              接続時は10秒TimeOutを設定していますが、FTP時はTimeout無しです。
              x37のABENDが起こると無限Waitになります。MVSConsoleで確認して
              xe3270.exe のDOS窓からCancelしてください。
              Timeout しても s3270から応答が帰るまではスレッドはふさがっているので
              "now busy"のエラーになります。

          障害で保存できない時は 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の指定が必要です)
          別名コマンド機能を使うと/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するには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のディレクトリーのユーザーデータは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は使用していません)
          RPFを閉じて再度保存を実行してください。
         .UploadはデフォルトではPDSのメンバーに限ります。
          順次編成ファイルを更新して戻すには xe3270.cfgでの設定が必要です。
         .RECFM=F(B)へUploadすると長文は分割されるようです。
          バイナリーモードでDown/Upすると固定長の整数倍にNullが補填される様です。
      !! .原因は不明ですがUp/Downとも転送で1画面量(24*76=1844?)程度の重複出力が
          発生することがあります。
          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し送信元と同じか確認します。
          バイナリーモードの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です。
          エラーが発生したら通常は再度保存すればよいでしょう。
          但し、RECFM=Fxで行長がLRECLを超える場合行分割されるのでこのREAD-CHKは
          何度リトライしても、転送失敗の結果になります。
          (1回目と2回目のDownloadファイル内容が同じ場合はリトライは停止します)
          EBCDIC<-->ASCIIの変換が可逆的でない文字が含まれる場合にも発生します。
          ファイル比較ツールなどで確認してください。(xeパッケージにも
          比較ツールxfcがついています)
      !! .保存時に再度DownloadしてUpload時と内容が同じか確認しますが
          ファイルのロックはかかっていません(RPF同士ではin use で開けない)。
          RPFで開いていてもFTP Uploadは成功するようですしRPFはDownload中
          であることを知らないので上書きされる可能性もあります。
          必要に応じて xe の TSO コマンド Alloc/Free を利用してください。
          保存時に内容がUpload時と異なる場合ワークDir\xeftpwdに
          最初にDawnloadした時のと保存時にDownloadしたのと両方のファイルが
          残されていますが現在の状態は自分で保存する必要があります。
          保存を強行するか他ファイルに保存してください。
          保存ファイル名はxxxxxxxx.timestampとxxxxxxxx.timestamp.UPDATECHKです。


#endif