目次
前
次
論理演算
論理演算は、Forthインタプリタでは、以下のものがあります。
- not ( x1 -- x2 ) Invert all bits
- xor ( x1 x2 -- x3 ) Bitwise Exclusive-OR
- or ( x1 x2 -- x3 ) Bitwise OR
- and ( x1 x2 -- x3 ) Bitwise AND
論理否定のワード「not」だけは、スタックに
入れるパラメータはひとつだけ。
各論理演算の動作テストをすると、以下。
論理演算を利用するのは、自分の場合は
次のリストに示す場面が多いです。
- バイト、ワードに複数のフラグを用意し、セット、リセット
- 論理積は、特定ビットのリセット
- 論理積は、複数ビットのリセットでマスク
- 論理和は、特定ビットのセット
- 現在と一つ前の状態の排他的論理和を求めて、一致か不一致の判定
排他的論理和と論理否定を利用すると、一致か不一致を
フラグで確認できます。
以下のように論理演算ワードを使います。
新しいワードで定義してみると、以下。
: ?same xor not 1 and ;
実際に使ってみます。
変数、定数を使った判定では、次のようになります。
定数の場合、ラベルをタイプするだけでスタックに
数値を入れることができます。
変数の値をスタックに入れるため、ワード「@」を利用。
マスク処理では、最下位ビット(LSB)とその上のビット
の値を取り出したい場合に使います。
この例では、変数の値そのものを操作していません。
変数の値をスタックに入れ、その値と他の値の
論理積を求めるので、call by valueの操作と
言ってもよいでしょう。
マイコンのレジスタの値を操作するときにも
論理演算を使えます。
LPC1114のピンは、複数の機能が割り当てられているので
現在の状態を確認するのと、状態変更に論理演算を活用
できます。
GPIOのPIO0_2の状態を確認し、変更するときは
次のようにタイプ。
レジスタ$4004401Cの各ビットは、次の機能設定用
ビットとパターンになっています。
最初の設定は、GPIOとなっていたのが、LSBに'1'を
セットしたことで、SSEL0(SPIモードの信号SEL)を
扱うように状態を変えられました。
論理演算は、シフト処理と組み合わせると、スタックを
数値を出し入れする無限個のレジスタとして扱えます。
目次
前
次