2018-04-02 22:21:26 +00:00
|
|
|
|
[< back to index](../index.md)
|
|
|
|
|
|
2018-01-04 00:15:04 +00:00
|
|
|
|
# Literals and initializers
|
2018-02-27 12:26:56 +00:00
|
|
|
|
|
|
|
|
|
## Numeric literals
|
|
|
|
|
|
|
|
|
|
Decimal: `1`, `10`
|
|
|
|
|
|
|
|
|
|
Binary: `%0101`, `0b101001`
|
|
|
|
|
|
2018-03-03 00:21:57 +00:00
|
|
|
|
Quaternary: `0q2131`
|
|
|
|
|
|
|
|
|
|
Octal: `0o172`
|
|
|
|
|
|
2018-02-27 12:26:56 +00:00
|
|
|
|
Hexadecimal: `$D323`, `0x2a2`
|
|
|
|
|
|
2018-08-03 11:23:37 +00:00
|
|
|
|
When using Intel syntax for inline assembly, another hexadecimal syntax is available: `0D323H`, `2a2h`.
|
|
|
|
|
It is not allowed in any other places.
|
|
|
|
|
|
2018-02-27 12:26:56 +00:00
|
|
|
|
## String literals
|
|
|
|
|
|
2018-07-27 22:58:20 +00:00
|
|
|
|
String literals can be used as either array initializers or expressions of type `pointer`.
|
|
|
|
|
|
2018-07-06 22:58:44 +00:00
|
|
|
|
String literals are surrounded with double quotes and optionally followed by the name of the encoding:
|
2018-02-27 12:26:56 +00:00
|
|
|
|
|
|
|
|
|
"this is a string" ascii
|
2018-07-06 22:58:44 +00:00
|
|
|
|
"this is also a string"
|
2018-02-27 12:26:56 +00:00
|
|
|
|
|
2018-07-27 22:58:20 +00:00
|
|
|
|
If there is no encoding name specified, then the `default` encoding is used.
|
|
|
|
|
Two encoding names are special and refer to platform-specific encodings:
|
|
|
|
|
`default` and `scr`.
|
2018-07-06 22:58:44 +00:00
|
|
|
|
|
2018-07-27 22:58:20 +00:00
|
|
|
|
You can also append `z` to the name of the encoding to make the string zero-terminated.
|
|
|
|
|
This means that the string will have one extra byte appended, equal to 0.
|
2018-02-27 12:26:56 +00:00
|
|
|
|
|
2018-07-27 22:58:20 +00:00
|
|
|
|
"this is a zero-terminated string" asciiz
|
|
|
|
|
"this is also a zero-terminated string"z
|
2018-02-27 12:26:56 +00:00
|
|
|
|
|
2018-07-27 22:58:20 +00:00
|
|
|
|
Most characters between the quotes are interpreted literally.
|
|
|
|
|
To allow characters that cannot be inserted normally,
|
|
|
|
|
each encoding may define escape sequences.
|
|
|
|
|
Every encoding is guaranteed to support at least
|
|
|
|
|
`{q}` for double quote
|
|
|
|
|
and `{apos}` for single quote/apostrophe.
|
2018-02-27 12:26:56 +00:00
|
|
|
|
|
2018-07-27 22:58:20 +00:00
|
|
|
|
For the list of all text encodings and escape sequences, see [this page](./text.md).
|
2018-04-02 17:47:11 +00:00
|
|
|
|
|
2018-07-27 22:58:20 +00:00
|
|
|
|
In some encodings, multiple characters are mapped to the same byte value,
|
|
|
|
|
for compatibility with multiple variants.
|
2018-07-06 22:58:44 +00:00
|
|
|
|
|
|
|
|
|
If the characters in the literal cannot be encoded in particular encoding, an error is raised.
|
|
|
|
|
However, if the command-line option `-flenient-encoding` is used,
|
2018-07-27 22:58:20 +00:00
|
|
|
|
then literals using `default` and `scr` encodings replace unsupported characters with supported ones,
|
|
|
|
|
skip unsupported escape sequences, and a warning is issued.
|
2018-12-24 00:32:17 +00:00
|
|
|
|
For example, if `-flenient-encoding` is enabled, then a literal `"£¥↑ž©ß"` is equivalent to:
|
2018-07-06 22:58:44 +00:00
|
|
|
|
|
|
|
|
|
* `"£Y↑z(C)ss"` if the default encoding is `pet`
|
|
|
|
|
|
|
|
|
|
* `"£Y↑z©ss"` if the default encoding is `bbc`
|
|
|
|
|
|
|
|
|
|
* `"?Y^z(C)ss"` if the default encoding is `ascii`
|
|
|
|
|
|
|
|
|
|
* `"?Y^ž(C)ss"` if the default encoding is `iso_yu`
|
|
|
|
|
|
|
|
|
|
* `"?Y^z(C)ß"` if the default encoding is `iso_de`
|
|
|
|
|
|
|
|
|
|
* `"?¥^z(C)ss"` if the default encoding is `jisx`
|
|
|
|
|
|
|
|
|
|
Note that the final length of the string may vary.
|
2018-02-27 12:26:56 +00:00
|
|
|
|
|
2018-04-02 19:06:18 +00:00
|
|
|
|
## Character literals
|
|
|
|
|
|
2018-07-06 22:58:44 +00:00
|
|
|
|
Character literals are surrounded by single quotes and optionally followed by the name of the encoding:
|
2018-04-02 19:06:18 +00:00
|
|
|
|
|
|
|
|
|
'x' ascii
|
2018-07-06 22:58:44 +00:00
|
|
|
|
'W'
|
2018-04-02 19:06:18 +00:00
|
|
|
|
|
|
|
|
|
From the type system point of view, they are constants of type byte.
|
2018-02-27 12:26:56 +00:00
|
|
|
|
|
2018-07-27 22:58:20 +00:00
|
|
|
|
For the list of all text encodings and escape sequences, see [this page](./text.md).
|
|
|
|
|
|
2018-07-06 22:58:44 +00:00
|
|
|
|
If the characters in the literal cannot be encoded in particular encoding, an error is raised.
|
|
|
|
|
However, if the command-line option `-flenient-encoding` is used,
|
|
|
|
|
then literals using `default` and `scr` encodings replace unsupported characters with supported ones.
|
2018-07-27 22:58:20 +00:00
|
|
|
|
If the replacement is one character long, only a warning is issued, otherwise an error is raised.
|
2018-07-06 22:58:44 +00:00
|
|
|
|
|
2018-02-27 12:26:56 +00:00
|
|
|
|
## Array initialisers
|
|
|
|
|
|
2018-04-02 22:21:26 +00:00
|
|
|
|
An array is initialized with either:
|
|
|
|
|
|
|
|
|
|
* a string literal
|
|
|
|
|
|
|
|
|
|
* a `file` expression
|
|
|
|
|
|
|
|
|
|
* a `for`-style expression
|
|
|
|
|
|
2018-06-18 00:52:14 +00:00
|
|
|
|
* a format, followed by an array initializer:
|
|
|
|
|
|
|
|
|
|
* `@word` (=`@word_le`): for every term of the array initializer, emit two bytes, first being the low byte of the value, second being the high byte:
|
|
|
|
|
`@word [$1122]` is equivalent to `[$22, $11]`
|
|
|
|
|
|
|
|
|
|
* `@word_be` – like the above, but opposite:
|
|
|
|
|
`@word_be [$1122]` is equivalent to `[$11, $22]`
|
|
|
|
|
|
|
|
|
|
|
2018-04-02 22:21:26 +00:00
|
|
|
|
* a list of byte literals and/or other array initializers, surrounded by brackets:
|
|
|
|
|
|
2018-02-27 12:26:56 +00:00
|
|
|
|
|
|
|
|
|
array a = [1, 2]
|
|
|
|
|
array b = "----" scr
|
|
|
|
|
array c = ["hello world!" ascii, 13]
|
2018-04-02 22:21:26 +00:00
|
|
|
|
array d = file("d.bin")
|
|
|
|
|
array e = file("d.bin", 128, 256)
|
|
|
|
|
array f = for x,0,until,8 [x * 3 + 5] // equivalent to [5, 8, 11, 14, 17, 20, 23, 26]
|
|
|
|
|
|
|
|
|
|
Trailing commas (`[1, 2,]`) are not allowed.
|
|
|
|
|
|
|
|
|
|
The parameters for `file` are: file path, optional start offset, optional length
|
|
|
|
|
(start offset and length have to be either both present or both absent).
|
2018-02-27 12:26:56 +00:00
|
|
|
|
|
2018-04-02 22:21:26 +00:00
|
|
|
|
The `for`-style expression has a variable, a starting index, a direction, a final index,
|
2018-07-03 21:28:05 +00:00
|
|
|
|
and a parameterizable array initializer.
|
2018-04-02 22:21:26 +00:00
|
|
|
|
The initializer is repeated for every value of the variable in the given range.
|
2018-08-08 21:52:47 +00:00
|
|
|
|
|
|
|
|
|
What might be useful is the fact that the compiler allows for built-in trigonometric functions
|
|
|
|
|
in constant expressions only:
|
|
|
|
|
|
|
|
|
|
* `sin(x, n)` – returns _n_·**sin**(*x*π/128)
|
|
|
|
|
|
|
|
|
|
* `cos(x, n)` – returns _n_·**cos**(*x*π/128)
|
|
|
|
|
|
|
|
|
|
* `tan(x, n)` – returns _n_·**tan**(*x*π/128)
|
|
|
|
|
|