1
0
mirror of https://github.com/KarolS/millfork.git synced 2024-08-17 11:29:00 +00:00
millfork/doc/lang/operators.md
2018-01-10 13:08:24 +01:00

4.0 KiB

Operators

Unlike in high-level languages, operators in Millfork have limited applicability. Not every well-formed expression is actually compilable. Further improvements to the compiler may increase the number of acceptable combinations.

Precedence

Millfork has different operator precedence compared to most other languages. From highest to lowest it goes:

  • *, *'

  • +, +', -, -', |, &, ^, >>, >>', <<, <<', >>>>

  • :

  • ==, !=, <, >, <=, >=

  • &&

  • ||

  • assignment and in-place modification operators

You cannot use two different operators at the same precedence levels without using parentheses to disambiguate. It is to prevent confusion about whether a + b & c << d means (a + b) & (c << d) ((a + b) & c) << d or something else.
The only exceptions are + and -, and +' and -'. They are interpeted as expected: 5 - 3 + 2 == 4 and 5 -' 3 +' 2 == 4.
Note that you cannot mix +' and -' with + and -.

Argument types

In the descriptions below, arguments to the operators are explained as follows:

  • byte means any one-byte type

  • word means any two-byte type, or a byte expanded to a word

  • long means any type longer than two bytes, or a shorted type expanded to such length to match the other argument

  • constant means a compile-time constant

  • simple means either: a constant, a non-stack variable, a pointer indexed with a constant, a pointer indexed with a non-stack variable, an array indexed with a constant, an array indexed with a non-stack variable, an array indexed with a sum of a constant and a non-stack variable, or a split-word expression made of two simple expressions. Examples: 1, a, p[2], p[i], arr[2], arr[i], arr[i+2], h:l, h[i]:l[i] Such expressions have the property that the only register they may clobber is Y.

  • mutable means an expression than can be assigned to

Binary arithmetic operators

  • +, -:
    byte + byte
    word + word
    long + long

  • *: 8-bit multiplication
    byte * constant byte
    constant byte * byte

There are no division, remainder or modulo operators.

Bitwise operators

  • |, ^, &: OR, EXOR and AND
    byte | byte

  • <<, >>: bit shifting; shifting right pads the result with zeroes
    byte * constant byte

  • >>>>: shifting a 9-bit value and returning a byte; a >>>> b is equivalent to (a & $1FF) >> b, but the latter doesn't compile yet
    word >>>> constant byte

Decimal arithmetic operators

These operators work using the decimal arithmetic and will not work on Ricoh CPU's.

  • +', -': decimal addition/subtraction
    byte +' byte
    word +' word
    long +' long

  • *': decimal multiplication
    constant *' constant

  • <<', >>': decimal multiplication/division by power of two
    byte * constant byte

Comparison operators

These operators (except for !=) can accept more than 2 arguments. In such case, the result is true if each comparison in the group is true. Note you cannot mix those operators, so a <= b < c is not valid.

  • ==: equality
    byte == byte
    word == word
    long == long

  • !=: inequality
    byte == byte
    word == word
    long == long

  • >, <, <=, >=: inequality
    byte > byte
    word > word
    long > long

Currently, >, <, <=, >= operators perform unsigned comparison if none of the types of their arguments is signed, and fail to compile otherwise. This will be changed in the future.

Assignment operators

  • =: normal assignment
    mutable byte = byte
    mutable word = word mutable long = long

  • +=, +'=, |=, ^=, &=: modification in place
    mutable byte += byte
    mutable word += word
    mutable long += long

  • <<=, >>=, <<'=, >>'=: shift in place
    mutable byte <<= constant byte
    mutable word <<= constant byte
    mutable long <<= constant byte

  • -=, -'=: subtraction in place
    mutable byte -= byte
    mutable word -= simple word
    mutable long -= simple long

  • *=: multiplication in place
    mutable byte *= constant byte

There are no *'= operator yet.