TR命令とTRT命令
TR命令
機能と構文
TR(Translate)は、メモリー内のデータの変換を行う命令です。A番地にあるバイト・データをB番地にある変換用テーブルにしたがってバイト単位に変換します。ある文字を別の文字に変更する、といったような場合に利用できます。わかりやすい例としては、EBCDIC文字をASCII文字に変換することです。
TR d1(l,b1),d2(b2)
命令の機能としては、第1オペランドd1(l,b1)で示される領域データが、第2オペランドd2(b2)で示される変換表に従って変換されます。第1オペランドのデータが引数で、第2オペランドが変換テーブルとなります。
第1オペランドのバイトデータが左から右に向かって(低位アドレスから高位アドレスに向かって)、1バイトずつ取り出され、取り出されたバイトデータが、第2オペランドが示す変換用テーブル内の対応するバイトデータで置き換わります。変換される長さは最大256バイトで第1オペランドで指定します。
テーブル内のどのバイトデータに置き換わるかは、第1オペランドが示す引数バイトの値で決まります。変換動作の際、引数バイトの値は変換テーブル内の位置を示すオフセットとなります。取り出された引数バイトがx00なら変換テーブルの先頭バイト、取り出された引数バイトがx08なら変換テーブルの先頭を0として+8バイト先にあるバイトです。
: BREAK01 DS 0H TR TEXTDATA,EBCOUTT 領域TEXTDATAの文字列を変換 ECBDICからASCIIへ変換する。 BREAK02 DS 0H : TEXTDATA DC C'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#-=+-,.%$\:' * * EBCDIC -> ASCII TRANSLATE TABLE ---------------------------- * THIS TABLE IS EFFECTIVE * POSSIBILITY TO BOTH OF LOWER * CASE ENGLISH AND JAPANESE * KATAKANA. (BASED IBM930) * EBCOUTT EQU *,256 EBCDIC -> ASCII TRANSLATE TABLE *--------------- +0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F 0123456789ABCDEF DC X'000102030405060708090A0B0C0D0E0F' 0. DC X'10111213140A161718191A1B1C1D1E1F' 1. DC X'202122232425262728292A2B2C2D2E2F' 2. DC X'303132333435363738393A3B3C3D3E3F' 3. DC X'20A1A2A3A4A5A6A7A8A94A2E3C282B7C' 4. !"#$%&'() <(+| DC X'26AAABACADAEAF57B05921242A293B5F' 5. &*+,-./ - !$*); DC X'2D2F62636465666768696A2C255F3E3F' 6. -/ ,%_>? DC X'707172737475767778603A2340273D22' 7. :#@'=" DC X'80616263646566676869BA8BBBBCBDBE' 8. abcdefghi: ;<=> DC X'BF6A6B6C6D6E6F707172C97D9CCACBCC' 9. ?jklmnopqrI JKL DC X'A07E737475767778797AD5ABD6D7D8D9' A. stuvwxyzU VWXY DC X'B0B1B2B3B4B5B6B7B8B9DADBDCDDBEBF' B. Z[\] DC X'7B414243444546474849CACBCCCDCECF' C. ABCDEFGHI DC X'7D4A4B4C4D4E4F505152DADBDCDDDEDF' D. JKLMNOPQR DC X'5C7E535455565758595AEAEBECEDEEEF' E. \ STUVWXYZ DC X'30313233343536373839FAFBFCFDFEFF' F. 0123456789
EBCDICの文字AをASCIIに変換する場合、文字AはxC1なので、変換テーブルのオフセットxC1の位置にASCIIの文字Aであるx41をセットしておきます。同様にして他の文字も対応するオフセット位置に変換後のASCII文字コードをセットしておきます。そしてそのテーブルを使ってTR命令を出せば、指定された領域内のEBCDIC文字列がASCII文字列に変換されます。
TR命令では最大256バイトまでしか変換できないので、長い文字列の場合は必要な回数TR命令をループさせるなどして変換動作を256バイト単位に繰り返します。もしくはTRE命令を使用します。英語圏のソフトウェアであれば、EBCDICとASCIIの変換は非常に簡単です。TR命令を実行するだけで済みます。なお、z/ArchitectureからTRTT(Translate Two to Two)という2バイト文字に対応した命令も追加されていますが、文字数が64K個になるためテーブルの作成がかなり大変です。
TRT命令
機能と構文
TRに似た命令にTRT(Translate and Test)命令があります。Translateとなっていますが、TRTはTRと異なり変換と言うよりは文字列中の特定文字を探索するために利用されます。A番地にあるバイト・データの中に、B番地にある探索用テーブルで指定された特定文字が存在するかどうかをTRT命令によって調べることができます。ネットワーク・プログラミングなどで、送受信データの中にある制御用の特殊文字などを検出するような際に重宝する命令です。例えばTELNETサーバーなどを作る際に、データ中に含まれるIAC制御文字を見つけ出す、といった処理で利用できます。
TRT 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命令と同じです。
: XC SCANTAB,SCANTAB INIT SCAN TABLE MVI SCANTAB+C'-',4 FIND C'-' IN STRING(=4) MVI SCANTAB+C'$',8 FIND C'$' IN STRING(=8) SLR R2,R2 CLEAR GR2 BREAK01 DS 0H TRT TEXTDATA,SCANTAB SEARCH FUNCTION BYTE IN STRING + (GR1: FOUND ADDRESS) + (GR2: FOUND ARGBYTE) + (BC 8,NOT FOUND) + (BC 4,FOUND IT) + (BC 2,FOUND IT ON LAST BYTE) BC 4,FOUNDCHR FOUND IT BC 2,FOUNDCHR FOUND IT ON LAST BYTE NOP 0 NOT FOUND IN THIS 256BYTES : FOUNDCHR DS 0H B *+4(R2) BRANCH BY FOUND CHARACTER NOP 0 00: ----------------------- B DOCHAR10 04: FOUND CHAR = C'-' B DOCHAR20 08: FOUND CHAR = C'$' : TEXTDATA DC C'President Obama says that America needs an all-of-the-+ above energy strategy that invests in new technologies a+ nd ends the $4 billion in annual subsidies to oil compan+ ies that are earning historic profits.' SCANTAB DC XL256'00' 256BYTES SCAN TABLE AREA
探したい文字が複数ある場合、関数バイトをその文字に応じて異なる値となるようにするといいです。そうすればどの文字が見つかったかを容易に判別できます。サンプルでは、関数バイトを4の倍数で設定していますが、これは見つかった文字に応じた処理ルーチンに分岐するためのインデックス値とするためです。
引数バイト領域内に、変換表の関数バイトで指定した文字が見つかるとGR2の末尾バイト(ビット24から31)に格納されますが、上位バイト部分(ビット0から23)の内容は変わりません。サンプルのように後で分岐命令のインデックス・レジスターとして使用する場合などには、事前にゼロクリアーするなどを行います。また、第1オペランドで指定した探索される領域は変更されません。
TRT命令も最大256バイトまでしか探索できないので、長い文字列の場合は必要な回数TRT命令をループさせるなどして探索動作を256バイト単位に繰り返します。