Arithmetic expressions are composed of operands, operators and parentheses.
Operands may be user-defined symbols, constants or special assembler symbols.
All operands are treated as unsigned 16-bit numbers.
Special assembler symbols, that can be used as operands are:
| AR0, ... , AR7 || direct addresses of registers R0 thru R7 |
| $ || the location counter of the currently active segment
(start address of the current assembler statement)|
The following operators are implemented:
|Operator ||Operation ||Definition |
|+ ||identity || +x = x |
|- ||two's complement|| -x = 0-x |
|NOT ||one's complement||NOT x = FFFFH-x|
|HIGH||high order byte || |
|LOW ||low order byte || |
|Operator ||Operation ||Result|
|+ ||unsigned addition || |
|- ||unsigned subtraction |
|* ||unsigned multiplication|
|/ ||unsigned division |
|MOD ||unsigned remainder |
|SHL ||logical shift left |
|SHR ||logical shift right |
|AND ||logical and |
|OR ||logical or |
|XOR ||exclusive or |
|. ||bit operator used for bit-adressable locations|
|EQ or = ||equal to ||0 if FALSE,|
FFFFH if TRUE
|NE or <>||not equal to |
|LT or < ||less than |
|LE or <= ||less or equal than |
|GT or > ||greater than |
|GE or >= ||greater or equal than |
Operators that are no special characters but keywords as SHR or AND must
be separated from their operands by at least one blank or tab.
In general expressions are evaluated from left to right according to
operator precedence, which may be overridden by parentheses.
Parentheses may be nested to any level.
Expressions always evaluate to unsigned 16-bit numbers, while overflows
are ignored. When an expression result is to be assigned to an 8-bit
quantity, the high byte must be either 00 or FF.
| Operator(s) || Type || Precedence |
| ( ) || || highest |
| + - NOT HIGH LOW || unary || |
| . || |
| * / MOD |
| SHL SHR |
| + - || binary |
| EQ = NE <> LT < LE <= GT > GE >= || |
| AND |
| OR XOR || lowest |
P1.((87+3)/10 AND -1 SHR 0DH)
will evaluate to 91H.