「メインフレーム・コンピューター」で遊ぼうこんな時代に今さらメインフレーム・コンピューターに取り組むハメになったみんなが助けあうサイトです。RSSWordPress.orgコスパのいい社内システムの作り方メインフレームを扱っていると、軽い開発やメンテナンスにリソースを割けない、しかし、BPCも考えねば。解決策のひとつがクラウドにおくFileMakerです。機能と構文TR(Translate)は、メモリー内のデータの変換を行う命令です。A番地にあるバイト・データをB番地にある変換用テーブルにしたがってバイト単位に変換します。ある文字を別の文字に変更する、といったような場合に利用できます。わかりやすい例としては、EBCDIC文字をASCII文字に変換することです。d1(l,b1),d2(b2)命令の機能としては、第1オペランドd1(l,b1)で示される領域データが、第2オペランドd2(b2)で示される変換表に従って変換されます。第1オペランドのデータが引数で、第2オペランドが変換テーブルとなります。第1オペランドのバイトデータが左から右に向かって(低位アドレスから高位アドレスに向かって)、1バイトずつ取り出され、取り出されたバイトデータが、第2オペランドが示す変換用テーブル内の対応するバイトデータで置き換わります。変換される長さは最大256バイトで第1オペランドで指定します。テーブル内のどのバイトデータに置き換わるかは、第1オペランドが示す引数バイトの値で決まります。変換動作の際、引数バイトの値は変換テーブル内の位置を示すオフセットとなります。取り出された引数バイトがx00なら変換テーブルの先頭バイト、取り出された引数バイトがx08なら変換テーブルの先頭を0として+8バイト先にあるバイトです。ECBDICからASCIIへ変換する。0123456789TR命令の動きとメモリー内容の変化EBCDICの文字AをASCIIに変換する場合、文字AはxC1なので、変換テーブルのオフセットxC1の位置にASCIIの文字Aであるx41をセットしておきます。同様にして他の文字も対応するオフセット位置に変換後のASCII文字コードをセットしておきます。そのテーブルを使ってTR命令を出せば、指定された領域内のEBCDIC文字列がASCII文字列に変換されます。TR命令では最大256バイトまでしか変換できないので、長い文字列の場合は必要な回数TR命令をループさせるなどして変換動作を256バイト単位に繰り返します。TRE命令を使用します。英語圏のソフトウェアであれば、EBCDICとASCIIの変換は非常に簡単です。TR命令を実行するだけで済みます。Two)という2バイト文字に対応した命令も追加されていますが、文字数が64K個になるためテーブルの作成がかなり大変です。Test)命令があります。Translateとなっていますが、TRTはTRと異なり変換と言うよりは文字列中の特定文字を探索するために利用されます。A番地にあるバイト・データの中に、B番地にある探索用テーブルで指定された特定文字が存在するかどうかをTRT命令によって調べることができます。ネットワーク・プログラミングなどで、送受信データの中にある制御用の特殊文字などを検出するような際に重宝する命令です。TELNETサーバーなどを作る際に、データ中に含まれるIAC制御文字を見つけ出す、といった処理で利用できます。d1(l,b1),d2(b2)命令の機能としては、第1オペランドd1(l,b1)で示される領域データが、第2オペランドd2(b2)で示される変換表に従って検査されます。第1オペランドのデータが引数で、第2オペランドが変換(検査)テーブルとなります。引数バイトの値に対応した変換表のバイト(関数バイト)の内容が0の場合、何もされず次の引数が検査されます。引数バイトの値に対応した変換表のバイト内容が0以外の場合、関数バイトの内容が汎用レジスター2の最下位バイト位置に読み出され、汎用レジスター1にその引数バイトのアドレスが格納されて命令動作は終了します。これは探したい文字が見つかったことを意味します。探したい文字に対応した変換テーブル内バイトの値を0以外にしてTRT命令を実行すれば、見つかった場所とどの文字が見つかったかをレジスターに通知してくれるわけです。TRT命令でも第1オペランドのバイトデータが左から右に向かって(低位アドレスから高位アドレスに向かって)、1バイトずつ取り出され、取り出されたバイトデータが、第2オペランドが示す変換用テーブル内の対応するバイトデータで検査されます。探索できる長さは最大256バイトで第1オペランドで指定します。動きは異なりますが、オペランドの指定方法などはTR命令と同じです。探したい文字が複数ある場合、関数バイトをその文字に応じて異なる値となるようにするといいです。すればどの文字が見つかったかを容易に判別できます。サンプルでは、関数バイトを4の倍数で設定していますが、これは見つかった文字に応じた処理ルーチンに分岐するためのインデックス値とするためです。引数バイト領域内に、変換表の関数バイトで指定した文字が見つかるとGR2の末尾バイト(ビット24から31)に格納されますが、上位バイト部分(ビット0から23)の内容は変わりません。サンプルのように後で分岐命令のインデックス・レジスターとして使用する場合などには、事前にゼロクリアーするなどを行います。第1オペランドで指定した探索される領域は変更されません。TRT命令も最大256バイトまでしか探索できないので、長い文字列の場合は必要な回数TRT命令をループさせるなどして探索動作を256バイト単位に繰り返します。