端末入出力での $Y
以下の表は、$Y での異なる文字の影響を示します。
エコーされる文字 |
ASCII コード |
$Y での効果 |
<FORM FEED> |
12 |
$Y=0 |
<RETURN> |
13 |
$Y=$Y |
<LINE FEED> |
10 |
$Y=$Y+1 |
<BACKSPACE> |
8 |
$Y=$Y |
<TAB> |
9 |
$Y=$Y |
出力できる ASCII 文字 |
32-126 |
$Y=$Y |
OPEN コマンドと USE コマンドの S(ecret) プロトコルは、エコーをオフにします。また、入力中に $Y が変更されるのを防ぎ、正しいカーソル位置を示します。
垂直位置を変更する WRITE $CHAR() は $Y も変更します。垂直位置を変更する WRITE * は $Y を変更ません。例えば、WRITE $Y,$CHAR(10),$Y は改行を行い、$Y をインクリメントします。一方、WRITE $Y,*10,$Y は改行を行いますが、$Y をインクリメントしません (詳細は、"WRITE" コマンドを参照してください)。
WRITE * は $Y を変更しないので、制御シーケンスを端末に送信しても、正しいカーソル位置を反映することができます。制御シーケンスによってはカーソルを移動するものもあるので、SET コマンドを使用して直接 $Y を設定することができます。例えば、以下のコマンドは VT100 ターミナルでコラム 20 と行 10 にカーソルを移動し、それにしたがって $X と $Y を設定します。
SET dy=10,dx=20
WRITE *27,*91,dy+1,*59,dx+1,*72
SET $Y=dy,$X=dx
デバイスは動作するのに出力しない ANSI 標準制御シーケンス (エスケープ・シーケンスなど) は、$X 値、$Y 値と正しいカーソル位置の間での矛盾を生じます。この問題を避けるために WRITE * 文を使用して、文字列で各文字の ASCII 値を指定します。例えば、以下のコードを使用する代わりに、
WRITE $CHAR(27)_"[1m"
同じ意味を持つ以下の形式を使用します。
WRITE *27,*91,*49,*109
通常、明示的にカーソルを移動するエスケープ・シーケンスの後、$X と $Y を更新して、実カーソル位置を反映します。