CUPL, part III

Битовые поля
Объявление битового поля назначает простое имя переменной группе бит.

Объявление выглядит так:

FIELD var = [var1, var2, ... varN];

где FIELD – ключевое слово, var – имя переменной, var1 и т.д. – список имён переменных, входящих в битовое поле.
Битовые поля могут быть использованы в выражениях. С ними можно обращаться как с обычными переменными.

Примеры:

FIELD addr = [A7, A6, A5, A4, A3, A2, A1, A0];

или

FIELD addr = [A7..A0];

При использовании FIELD компилятор внутренне генерирует простое 32 битное поле. Оно используется для представления переменных в битовом поле.

Порядок появления индексных переменных в битовых полях не имеет значения. Индексная переменная занимает бит с номером, совпадающим с индексом.
То есть, A0 будет располагаться в бите 0. Объявления [A7..0] и [A0..7] обозначают одно и то же. Не стоит использовать различные индексные переменные в одном битовом поле. Битовое поле содержащее A2 и B2 будет содержать обе этих переменных в одном бите, что приведёт к генерации ошибочного выражения.
Не рекомендуется использовать в одном выражении индексные и неиндексные переменные.

Примеры операций с битовыми полями:

/* привязываем к пинам переменные */
PIN [2..5] = [a0..a3];
PIN [6..9] = [b0..b3];
PIN [12..15] = [z0..z3];

/* собираем переменные в битовые поля */
FIELD a = [a0..a3];
FIELD b = [b0..b3];
FIELD z = [z0..z3];

/* работаем с битовыми полями */
z = a & b;

/* в результате компилятор развернёт выражение до:
z0 =>
a0 & b0

z1 =>
a1 & b1

z2 =>
a2 & b2

z3 =>
a3 & b3
*/

/* Не обязательно выполнять операцию между парой битовых полей. Можно выполнять операции между полем и отдельной переменной: */
z = a & b1;

в результате компилятор развернёт выражение до:
z0 =>
a0 & b1

z1 =>
a1 & b1

z2 =>
a2 & b1

z3 =>
a3 & b1