# 日本語 OpenVMS
日本語画面管理ライブラリ
利用者の手引き

前へ | 次へ | 目次 | 索引

表 5-4 は STRING_2 機能を示しています。 SMG$M_USER1 から SMG$M_USER8 のユーザ定義レンディションのいずれかを作成する場合には， STRING_2 機能を使用して TERMTABLE.TXT ファイルに適切な定義を登録しなければなりません。

表 5-4 String_2 機能
VMS名 | SMGによる使用 | 説明
--- | --- | ---
BEGIN_STATUS_LINE | ○ | ハードウェア状態行への出力を開始する。
BEGIN_USER1 | ○ | 最初のユーザ定義属性を開始する。
BEGIN_USER2 | ○ | 2番目のユーザ定義属性を開始する。
BEGIN_USER3 | ○ | 3番目のユーザ定義属性を開始する。
BEGIN_USER4 | ○ | 4番目のユーザ定義属性を開始する。
BEGIN_USER5 | ○ | 5番目のユーザ定義属性を開始する。
BEGIN_USER6 | ○ | 6番目のユーザ定義属性を開始する。
BEGIN_USER7 | ○ | 7番目のユーザ定義属性を開始する。
BEGIN_USER8 | ○ | 8番目のユーザ定義属性を開始する。
END_STATUS_LINE | ○ | ハードウェア状態行への出力を終了する。
END_USER1 | × | 最初のユーザ定義属性を終了する。
END_USER2 | × | 2番目のユーザ定義属性を終了する。
END_USER3 | × | 3番目のユーザ定義属性を終了する。
END_USER4 | × | 4番目のユーザ定義属性を終了する。
END_USER5 | × | 5番目のユーザ定義属性を終了する。
END_USER6 | × | 6番目のユーザ定義属性を終了する。
END_USER7 | × | 7番目のユーザ定義属性を終了する。
END_USER8 | × | 7番目のユーザ定義属性を終了する。
BLACK_SCREEN | ○ | 画面の背景色を黒に設定する。
BLUE_SCREEN | ○ | 画面の背景色を青に設定する。
CYAN_SCREEN | ○ | 画面の背景色を青緑に設定する。
GREEN_SCREEN | ○ | 画面の背景色を緑に設定する。
MAGENTA_SCREEN | ○ | 画面の背景色を紫に設定する。
RED_SCREEN | ○ | 画面の背景色を赤に設定する。
WHITE_SCREEN | ○ | 画面の背景色を白に設定する。
YELLOW_SCREEN | ○ | 画面の背景色を黄色に設定する。
USER1_SCREEN | ○ | ユーザ定義背景色。
USER2_SCREEN | ○ | ユーザ定義背景色。

文字列機能フィールドには，印字不可能な文字が含まれることが多いため，これらの文字を機能文字列に容易に挿入できるようにするために，次に示す置換文字を使用します。プリントされない文字を表現するには特殊文字を使用します。

特殊文字 | プリントされない文字 | 意味
--- | --- | ---
$ | ESCAPE | 10 進数で 27のASCII 文字
^ | CONTROL | コントロール・シフト
& | CSI | 10 進数で 155のASCII 文字
@ | SS3 | 10 進数で 143のASCII 文字

したがって，エスケープ文字を含む機能文字列を作成する場合には，その位置に単にドル記号を指定します。制御文字を含む機能文字列を作成する場合には，文字の前にサーカンフレックス (^) を指定します。次の例を参照してください。

    NAME = "VT300_series"

       .
       .
       .

        STRING
            begin_alternate_char = "^N",
            end_alternate_char = "^O",
            erase_whole_display = "$[2J"

       .
       .
       .

    END

機能文字列内で文字を使用し，その文字の通常の ASCII 値を使用する場合には，その文字の前にアンダースコアを指定します ( たとえば，"_$" と指定すると，アンダースコアの後にエスケープ文字が挿入されるのではなく， 1 つのドル記号が挿入されます )。次に示す文字を通常の ASCII テキストとして取り扱うには，その文字の前にアンダースコアを指定しなければなりません。

アンパーサンド | &
アポストロフィ | '
アットマーク | @
引用符 | "
サーカンフレックス | ^
ドル記号 | $
感嘆符 | !
左括弧 | (
アンダースコア | _

日本語 SMG はライン描画文字集合 ( たとえば，bottom_t_char， top_t_char
など ) を表示するために，必要なグラフィック・モードを自動的に起動します。しかし，フォーリン・ターミナル・ルーチンを直接呼び出す場合には，ユーザが必要なグラフィック・モードを起動しなければなりません。

漢字ターミナルがコマンドを実行するための十分な時間を確保できるように，パッド文字 ( たとえば，NULL 文字 ) をターミナル・コマンドに追加しなければならないことがあります。必要なパッド文字の数は，使用する漢字ターミナルとボー・レートに応じて異なります。パッド文字機能フィールドは将来の拡張に備えて準備されているものであり，このリリースでは機能しません。パッド文字を挿入する操作はユーザが実行しなければなりません。

フォーリン・ターミナル・サポート・ルーチンを直接呼び出す場合には，多くの文字列機能フィールドは引数を使用し，その引数の値を実行時に指定しなければなりません。さらに，引数の中には，引数に対して値を代入するときに算術演算を実行しなければならないものがあります。この後の節では，引数の置換と算術演算について説明します。

## 5.2.4 引数の置き換え

多くの場合，ターミナル・コマンド文字列内の値を置き換えなければなりません。たとえば，スクロール領域を設定する場合や，カーソルを右に 10 カラムだけ移動する場合には，実行時に値を置き換える必要があります。これらの値は TERMTABLE ターミナル定義には登録できません。 TERMTABLE は文字列を置き換えるために，!UL を受け付けます。これは $FAO 形式のディレクティブです。 !UL ディレクティブは，その場所に値を挿入することを示します。

TERMTABLE インターフェイス・ルーチンは機能フィールド文字列 ( および戻されるコマンド文字列 ) 内の値を置き換える前に，符号なしロングワードを受け付け，それを ASCII の数値に変換します。次の例を参照してください。

    NAME = "VT300_series"

       .
       .
       .

        STRING
        set_cursor_abs = "$[!UL;!ULH"

       .
       .
       .

    END

SET_CURSOR_ABS に対して定義される文字列には， 2 つの !UL ディレクティブに対して置き換えられる値を指定しておかなければなりません。これらの値は，カーソルを設定する行番号とカラム番号を示します。これらの実行時引数は， SMG$GET_TERM_DATA ルーチンに対する省略可能なロングワード・ベクタ引数として指定します。ベクタ内の最初のエントリには，その後に続く引数の数が指定されます。したがって，最初のエントリが 2 の場合には，2 番目のエントリは行番号を示し， 3 番目のエントリはカラム番号です。 SMG$GET_TERM_DATA ルーチンは最初のデータ項目 ( ベクタ内の 2 番目の項目 ) を ASCII の対応する数値に変換し，最初の !UL ディレクティブに対してその ASCII 値を挿入します。その後，2番目のデータ項目を変換し，その結果を2番目の !UL ディレクティブに対して挿入します。以下も同様です。

## 5.2.5 算術演算

引数の置き換えの他に，ターミナル・コマンド・シーケンスは算術演算も必要とすることがあります。引数の置き換えと算術演算を実行する場合には，TERMTABLE エントリは，引数変換および置換の場合と異なる方式を必要とします。

引数の置き換えと算術演算のどちらも実行する場合には，左括弧，パーセント記号 ( 置換の場所を示す )，算術演算子，オペランド，右括弧を使用します。次の例を参照してください。

    NAME = "VT52"

       .
       .
       .

        STRING
        set_cursor_abs = "$Y(%1+31)(%2+31)"

       .
       .
       .

    END

この例では，VT52 でカーソルを直接移動する文字列を示しています。ただし，バイアスを行番号とカラム番号に加算しなければなりません。数式内で置換される値は，引数置換を単独で実行する場合と同じ方法で， SMG$GET_TERM_DATA ルーチンによって渡されます。パーセント記号の後に常に整数が続きます。この整数は引数を置換する順序を示します。

次の表は算術演算で使用する文字を示しています。

文字 | 意味
--- | ---
( | 数式の先頭
%n | n 番目のユーザ引数を置換する
+ | 加算演算子
-- | 減算演算子
* | 乗算演算子
/ | 除算演算子
) | 数式の最後

画面の座標を表現するには，ロングワード整数で十分です。数式は左から右に評価されます。演算子に優先順位はありません。

項目間のスペースは意味がありません。数式を読みやすくするために，スペースを任意に使用してもかまいません。機能文字列の長さは 128 バイトに制限されています。

# 5.3 OpenVMSターミナル機能ファイルの作成

ターミナル機能データベースのソース・コードは TERMTABLE.TXT という名前の ASCII ファイルです。このファイルには，各タイプの漢字ターミナルに対してエントリが登録されています。各エントリには，漢字ターミナルの機能をはじめ，初期化シーケンスや画面のサイズなどの装置固有の情報が登録されています。ひとつの TERMTABLE エントリからファイル内の複数のレコードを参照できます。ターミナル定義の追加は TERMTABLE.TXT ファイルを編集することにより可能です。ただし，その後 SYS$SYSTEM:SMGBLDTRM.EXE を実行し， TERMTABLE.TXT を再処理しなければなりません。

TERMTABLE.TXT は任意のテキスト・エディタを使用して作成できます。 TERMTABLE エントリは 1 つのターミナル名，任意の数の機能フィールドとその値で構成されます ( 機能フィールドについての詳しい説明は， 第 5.2 節 を参照してください )。 TERMTABLE.TXT は，コンパイルのために適切な形式に設定しなければなりませんが，機能名はその機能をわかりやすく表現しており，簡単に理解できます。ターミナル名は固有の名前でなければなりません。たとえば，フォーリン・ターミナルに対して複数の定義が必要な場合には，複数の名前を使用しなければなりません。

TERMTABLE ルーチンが最初にターミナル・エントリを検索する場合には， TERM$TABLOC という論理名の領域から TERMTABLE.EXE を検索しようとします。指定されたターミナル・エントリをその領域から検索できない場合には，ルーチンは SYS$SYSTEM から TERMTABLE.EXE を検索します。ある漢字ターミナルに対して，システム定義と異なるターミナル定義を使用する場合には， TERMTABLE.TXT と TERMTABLE.EXE のプライベート・コピーを作成できます。そうすれば，SYS$SYSTEM:TERMTABLE.EXE に登録されている定義と異なる定義を使用してその漢字ターミナルを定義でき，他の漢字ターミナルに対しては，標準的なシステム定義を使用できます。

TERMTABLE エントリの形式は次のとおりです。

    NAME = "terminal-name"
            capability-field [,...]
    END

TERMTABLE.TXT ファイルでは，REQUIRE ディレクティブを使用できます。 REQUIRE ディレクティブを使用すれば， TERMTABLE.TXT ファイルに別のソース・ファイルを取り込むことができます。その形式は次のとおりです。

    REQUIRE "filespec"

この形式で，"filespec" は適切な OpenVMS ファイル指定です。

# 5.4 例

    !
    !       Private versions of DIGITAL terminal definitions
    !
    NAME = 'myvt300'

            BOOLEAN
            ansi_crt = 1,           dec_crt = 1

            NUMERIC
            rows = 24,              columns = 80,
            wide_screen_columns = 132

            STRING
            begin_alternate_char = "^N",
            end_alternate_char = "^O",
            erase_whole_display = "$[2J",
            init_string = "$_(B",
            set_cursor_abs = "$[!UL;!ULH"
    END

    NAME = "MYVT52"

            BOOLEAN
            ansi_crt = 0,           dec_crt = 1

            NUMERIC
            rows = 24,              columns = 80,
            wide_screen_columns = 80

            STRING
            begin_alternate_char = "$F"
            end_alternate_char = "$G",
            erase_whole_display = "$Y(32)(32)$J",  !position to 1,1; then erase
            set_cursor_abs = "$Y(%1+31)(%2+31)"

    END

VT300 シリーズ(MYVT300)に対して登録されているカーソル設定シーケンスの場合，戻される文字列は，SMG$GET_TERM_DATA ルーチンを呼び出すときに指定した引数ベクタ内の値に応じて異なります。たとえば，カーソルを3行目，12 カラム目に移動する場合には，これらのロングワード値をベクタ内の2番目のエントリと3番目のエントリに指定します(最初のエントリはその後に続く値の個数です)。SMG$GET_TERM_DATA ルーチンはこれらのロングワード値を ASCII 値に変換し，変換した値に対応する !UL ディレクティブの位置に戻される文字列に挿入します。

VT52 (MYVT52)に対して登録されているカーソル設定シーケンスの場合には，戻される文字列は引数置換によってではなく，算術演算に応じて変化します(VT52 はバイアス操作を必要とするため)。SMG$GET_TERM_DATA ルーチンに対する引数ベクタのエントリ 2 とエントリ 3 に指定した行番号とカラム番号に 31 (10 進数)を加算するために，算術演算子を使用しています。

MYVT300 内の INIT_STRING フィールドは，括弧が，通常は数式を示す特殊文字として取り扱われることを示しています。括弧を通常のテキスト文字として解釈するには，その前にアンダースコアを指定しなければなりません。したがって，“$_(B”という文字列は ESC(B になります。これは ASCII 文字集合を G0 に設定するためのコマンドです。

MYVT52 に対する ERASE_WHOLE_DISPLAY シーケンスは，特定の機能を提供するために，シーケンスを組み合わせなければならない可能性があることを示しています。VT52 には画面全体を消去するコマンドがありません。しかし，カーソルをホーム・ポジションに移動し，現在の位置から画面の最後まで消去するコマンドを使用すれば，画面全体を消去できます。

# 5.5 TERMTABLE.EXE の作成

各プログラムが ASCII ファイルをアクセスするのは非効率的です。これは，ASCII テキストを，漢字ターミナルに対して使用可能な文字列として渡すには，その前にバイナリ情報として処理しておかなければならないからです。各イメージを開始するときにこの処理を実行する必要がないようにするために，TERMTABLE.TXT は必要なバイナリ形式に "プリコンパイル" されています。この場合，画面アプリケーションはプリコンパイルされたバイナリの機能ファイルからターミナル・シーケンスを検索できます。

TERMTABLE.TXT をコンパイルするには，SYS$SYSTEM:SMGBLDTRM
.EXE プログラムを実行します。このユーティリティは入力ファイル TERMTABLE.TXT を受け付け，TERM$TABLOC という論理名によって示される装置とディレクトリに，出力ファイルとして TERMTABLE.EXE を作成します。

コンパイルされたターミナル機能は，グローバル・セクションにマップされるファイルにテーブルとして登録されます。したがって，ユーザ・プログラムはグローバル・セクションを参照すれば良く，機能データのコピーを独自に持つ必要がありません。

ユーザが自分のディレクトリから個人用の TERMTABLE.TXT をコンパイルする場合には，インターフェイス・ルーチンはそれを一時的なセクションとしてマッピングすることによりアクセスします。TERMTABLE インターフェイス・ルーチンはシステムのグローバル・セクションを検索する前に，一時的なセクションから定義を検索します。

システム管理者は，標準でない定義がユーザの個人領域に制限されるようにするために，ターミナル定義を調整しなければならないことがあります。

ほとんどのユーザはグローバル・セクションを作成するための特権を与えられていません。SYS$SYSTEM:SMGMAPTRM.EXE という短いプログラムはコンパイルされた TERMTABLE をグローバル・セクションとしてマップするプログラムであり，標準的な OpenVMS スタートアップ・プロシージャの一部です。変更した TERMTABLE.EXE をグローバル・セクションとしてマップするには，既存のグローバル・セクションを最初に削除しておかなければなりません。システムが動作中にグローバル・セクションを削除すると，ユーザ・プログラムが異常終了する可能性があります。したがって，変更した TERMTABLE.EXE を省略時の設定として定義するには，システムを再ブートしなければなりません。

コンパイル時間と作成されるグローバル・セクションのサイズを削減するために， SYS$SYSTEM:TERMTABLE.TXT 内のターミナル定義は最低限に抑えなければなりません。実際にコンピュータ・システムに接続される漢字ターミナルのタイプだけを定義するようにしてください。

前へ | 次へ | 目次 | 索引