条件文の利用

WORDの登録時には様々な構文が使用できます。
今回は条件文を使ってみます。

要件としては以下。
 実行するごとにONとOFFを切り替えるWORDの作成。

です。
デフォルトではこういうWORDが無かったと思うので、自作してみましょう。



出力状態のチェック

まず出力状態の確認です。
「IOX@」で出力状態をスタックするので、それを「.」で表示。
すると現在出力している状態を確認できます。

最初に作るWORDということで、白の信号の制御をするWORDにしましょう。
白の信号のON/OFFは
0000 0000 0000 0000 (0)
0000 0000 0000 0001 (1)
です。
これだけなら話は簡単なのですが、
0000 0000 0000 0011 (3)
だったり、
0000 0000 0000 1111 (15)
だったり、
0100 0100 0110 0101 (?)
でも10進数の0か1かで判断しなければなりません。

じゃあどうするかというと、下位1桁の情報だけを取り出せばいいだけです。
0100 0100 0110 0101

0000 0000 0000 0001
にできれば、白の情報がどうなのか確認できますね。
これをFORTH上で行うには、AND演算子を使います。

AND演算子はビット操作をするための演算子です。
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
の操作を各桁に行います。

先程の
0100 0100 0110 0101
を、
0000 0000 0000 0001
でAND演算をかけてやります。
するとどうでしょう。計算結果は
0000 0000 0000 0001
となります。
これを10進数に直した値が返ってきますので、1を受け取れます。
1ならONなので、
0100 0100 0110 0101
における白の信号の状態はON状態、ということがいえます。

長くなりましたが、実際のコンピューターで確認してみましょう。


点灯状況

これの白の信号の状態を確認します。


白の信号の確認

まずIOX@で現在の全体の信号情報を受け取ります。(3行目)
表示はしなくていいですが、確認ということで表示させています。2345です。
で、実際に白の信号の状態を見ているのが4行目。
IOX@で得た数値に、1という数値でAND演算をします。
その結果はスタックに詰まれるので、.演算子で表示します。
これで白の信号がONかOFFかが分かるようになりました。



ここまででは壮大なタイトル詐欺となってしまうので、本題にいきましょう。
条件文を利用するところでしたね。
FORTHの条件文の構文は
「条件文 IF 真の処理 ELSE 偽の処理 THEN」
です。
これを今回やりたい処理に置き換えると・・・。

<白の信号がONか?>IF
 白の信号をOFFにする
ELSE
 白の信号をONにする
THEN

こうなります。
呼び出す度にこの処理を行うWORDを作りましょう。


: WHITE_TOGGLEの定義

こうなりました。

: WHITE_TOGGLE
 IOX@ 1 AND 1 = IF
  1 IOXRST
 ELSE
  1 IOXSET
 THEN
;


です。コピーできないので、頑張って打ち込んでください。


ランプの状態

さて、現在のランプの状態です。
WHITE_TOGGLEにより白の信号のみ切り替われば、WHITE_TOGGLEは完成です。


1度目のWHITE_TOGGLE

1度目のWHITE_TOGGLEの実行。


ランプの状態

白の信号だけOFFになりました。


2度目のWHITE_TOGGLE

2度目のWHITE_TOGGLEの実行。


ランプの状態

今度は白の信号だけONになりました。

ということで、同じWORDでも条件によって異なる動作をさせることができるようになりました。
これが条件文のすごいところです。といっても超基礎的な内容でしたが・・・。

マゼンタの切り替えWORDの作成

順当にいけば次は橙の信号の操作ですが、
ひとつ飛ばしてマゼンタの信号の切り替えWORDを作ってみましょう。
といっても条件文の一部がちょっぴり変わるだけです。

条件判断の内容としては、
IOX@で得た数値に対して、
0000 0000 0000 0100
でAND演算して、3桁目の状態から入出力を操作する、
です。
3桁目が0なら0、1なら4となりますので、これをコードに直すと・・・。


: MAGENTA_TOGGLE
 IOX@ 4 AND 4 = IF
  4 IOXRST
 ELSE
  4 IOXSET
 THEN
;


ですね。


ランプの状態


ランプの状態

こうなれば作成成功です。
デバッグが面倒なのがRP2 FORTHの難点ですね・・・。
2012/12/28 作成

お知らせ

特にありません。