Expression

Enum Expression 

Source
pub enum Expression {
Show 34 variants Constant(u32), SymbolAddressIndex(u16), SectionAddressIndex(u16), Bank(u16), SectionOffset(u16), Offset(u16), SectionStart(u16), GroupStart(u16), GroupOffset(u16), Segment(u16), GroupOrg(u16), SectionEnd(u16), Equals(Box<Expression>, Box<Expression>), NotEquals(Box<Expression>, Box<Expression>), LTE(Box<Expression>, Box<Expression>), LessThan(Box<Expression>, Box<Expression>), GTE(Box<Expression>, Box<Expression>), GreaterThan(Box<Expression>, Box<Expression>), Add(Box<Expression>, Box<Expression>), Subtract(Box<Expression>, Box<Expression>), Multiply(Box<Expression>, Box<Expression>), Divide(Box<Expression>, Box<Expression>), And(Box<Expression>, Box<Expression>), Or(Box<Expression>, Box<Expression>), XOR(Box<Expression>, Box<Expression>), LeftShift(Box<Expression>, Box<Expression>), RightShift(Box<Expression>, Box<Expression>), Mod(Box<Expression>, Box<Expression>), Dashes(Box<Expression>, Box<Expression>), Revword(Box<Expression>, Box<Expression>), Check0(Box<Expression>, Box<Expression>), Check1(Box<Expression>, Box<Expression>), BitRange(Box<Expression>, Box<Expression>), ArshiftChk(Box<Expression>, Box<Expression>),
}
Expand description

An expression used in relocations.

PSY-Q uses a sophisticated expression system for calculating relocated addresses. Expressions can be constants, symbol references, or complex arithmetic operations.

Each component of an expression has a unique on disk format. There are no synchronization points, or sizes encoded into the structure, so it is important that each type is explicitly modeled.

Linker expressions are similar, but not identical to assembler expressions and some built-in functions are available in both.

§Example Expressions

  • $1000 - Constant value 0x1000
  • [5] - Address of symbol #5
  • sectbase(2) - Base address of section #2
  • (sectstart(1)+$100) - Section 1 start plus 0x100

Variants§

§

Constant(u32)

A constant value.

$123D

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x0
1u32Value.
§

SymbolAddressIndex(u16)

Index of a symbol’s address.

[x]

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x2
1u16???
§

SectionAddressIndex(u16)

Base address of a section.

sectbase(x)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x4
1u16???
§

Bank(u16)

Untested

bank(x)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x6
1u16???
§

SectionOffset(u16)

Untested

sectof(x)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x8
1u16Section ID.
§

Offset(u16)

Untested

offs(x)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0xA
1u16???
§

SectionStart(u16)

Start address of a section.

sectstart(x)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0xC
1u16Section ID.
§

GroupStart(u16)

Untested

groupstart(x)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0xE
1u16Group ID.
§

GroupOffset(u16)

The offset of a group.

Untested

groupof(x)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x10
1u16Group ID.
§

Segment(u16)

Untested

seg(x)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x12
1u16???
§

GroupOrg(u16)

The ORG address of a group for a symbol.

grouporg(x)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x14
1u16Symbol ID.
§

SectionEnd(u16)

End address of a section.

sectend(X)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x16
1u16Section ID.
§

Equals(Box<Expression>, Box<Expression>)

Equality comparison.

(a=b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x20
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

NotEquals(Box<Expression>, Box<Expression>)

Inequality comparison.

(a<>b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x22
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

LTE(Box<Expression>, Box<Expression>)

Less than or equal.

(a<=b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x24
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

LessThan(Box<Expression>, Box<Expression>)

Less than.

(a<b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x26
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

GTE(Box<Expression>, Box<Expression>)

Greater than or equal.

(a>=b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x28
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

GreaterThan(Box<Expression>, Box<Expression>)

Greater than.

(a>b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x2A
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

Add(Box<Expression>, Box<Expression>)

Addition.

(a+b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x2C
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

Subtract(Box<Expression>, Box<Expression>)

Subtraction.

(a-b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x2E
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

Multiply(Box<Expression>, Box<Expression>)

Multiplication.

(a*b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x30
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

Divide(Box<Expression>, Box<Expression>)

Division.

(a/b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x32
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

And(Box<Expression>, Box<Expression>)

Bitwise AND.

(a&b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x34
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

Or(Box<Expression>, Box<Expression>)

Bitwise OR operator.

(a!b)

Instead of using the typical | (pipe) symbol, the default rendering of this operator is the ! (exclamation point/bang) symbol. In the assembler, the | symbol acts as an alias for !.

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x36
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

XOR(Box<Expression>, Box<Expression>)

Bitwise XOR.

(a^b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x38
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

LeftShift(Box<Expression>, Box<Expression>)

Left shift.

(a<<b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x3A
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

RightShift(Box<Expression>, Box<Expression>)

Right shift.

(a>>b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x3C
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

Mod(Box<Expression>, Box<Expression>)

Modulo.

(a%b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x3E
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

Dashes(Box<Expression>, Box<Expression>)

Dashes operator.

(a---b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x40
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

Revword(Box<Expression>, Box<Expression>)

Reverse word.

(a-revword-b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x42
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

Check0(Box<Expression>, Box<Expression>)

Check0.

(a-check0-b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x44
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

Check1(Box<Expression>, Box<Expression>)

Check1.

(a-check1-b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x46
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

BitRange(Box<Expression>, Box<Expression>)

Bit range extraction.

(a-bitrange-b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x48
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.
§

ArshiftChk(Box<Expression>, Box<Expression>)

Arithmetic shift with check.

(a-arshift_chk-b)

§Structure on Disk

OffsetTypeDescription
0u8Magic: 0x4A
1ExpressionLeft Expression.
sizeof(left_expression) + 1ExpressionRight Expression.

Trait Implementations§

Source§

impl BinRead for Expression

Source§

type Args<'__binrw_generated_args_lifetime> = ()

The type used for the args parameter of read_args() and read_options(). Read more
Source§

fn read_options<R: Read + Seek>( __binrw_generated_var_reader: &mut R, __binrw_generated_var_endian: Endian, __binrw_generated_var_arguments: Self::Args<'_>, ) -> BinResult<Self>

Read Self from the reader using the given Endian and arguments. Read more
Source§

fn read<R>(reader: &mut R) -> Result<Self, Error>
where R: Read + Seek, Self: ReadEndian, Self::Args<'a>: for<'a> Required,

Read Self from the reader using default arguments. Read more
Source§

fn read_be<R>(reader: &mut R) -> Result<Self, Error>
where R: Read + Seek, Self::Args<'a>: for<'a> Required,

Read Self from the reader using default arguments and assuming big-endian byte order. Read more
Source§

fn read_le<R>(reader: &mut R) -> Result<Self, Error>
where R: Read + Seek, Self::Args<'a>: for<'a> Required,

Read Self from the reader using default arguments and assuming little-endian byte order. Read more
Source§

fn read_ne<R>(reader: &mut R) -> Result<Self, Error>
where R: Read + Seek, Self::Args<'a>: for<'a> Required,

Read T from the reader assuming native-endian byte order. Read more
Source§

fn read_args<R>(reader: &mut R, args: Self::Args<'_>) -> Result<Self, Error>
where R: Read + Seek, Self: ReadEndian,

Read Self from the reader using the given arguments. Read more
Source§

fn read_be_args<R>(reader: &mut R, args: Self::Args<'_>) -> Result<Self, Error>
where R: Read + Seek,

Read Self from the reader, assuming big-endian byte order, using the given arguments. Read more
Source§

fn read_le_args<R>(reader: &mut R, args: Self::Args<'_>) -> Result<Self, Error>
where R: Read + Seek,

Read Self from the reader, assuming little-endian byte order, using the given arguments. Read more
Source§

fn read_ne_args<R>(reader: &mut R, args: Self::Args<'_>) -> Result<Self, Error>
where R: Read + Seek,

Read T from the reader, assuming native-endian byte order, using the given arguments. Read more
Source§

impl BinWrite for Expression

Source§

type Args<'__binrw_generated_args_lifetime> = ()

The type used for the args parameter of write_args() and write_options(). Read more
Source§

fn write_options<W: Write + Seek>( &self, __binrw_generated_var_writer: &mut W, __binrw_generated_var_endian: Endian, __binrw_generated_var_arguments: Self::Args<'_>, ) -> BinResult<()>

Write Self to the writer using the given Endian and arguments. Read more
Source§

fn write<W>(&self, writer: &mut W) -> Result<(), Error>
where W: Write + Seek, Self: WriteEndian, Self::Args<'a>: for<'a> Required,

Write Self to the writer using default arguments. Read more
Source§

fn write_be<W>(&self, writer: &mut W) -> Result<(), Error>
where W: Write + Seek, Self::Args<'a>: for<'a> Required,

Write Self to the writer assuming big-endian byte order. Read more
Source§

fn write_le<W>(&self, writer: &mut W) -> Result<(), Error>
where W: Write + Seek, Self::Args<'a>: for<'a> Required,

Write Self to the writer assuming little-endian byte order. Read more
Source§

fn write_ne<W>(&self, writer: &mut W) -> Result<(), Error>
where W: Write + Seek, Self::Args<'a>: for<'a> Required,

Write Self to the writer assuming native-endian byte order. Read more
Source§

fn write_args<W>( &self, writer: &mut W, args: Self::Args<'_>, ) -> Result<(), Error>
where W: Write + Seek, Self: WriteEndian,

Write Self to the writer using the given arguments. Read more
Source§

fn write_be_args<W>( &self, writer: &mut W, args: Self::Args<'_>, ) -> Result<(), Error>
where W: Write + Seek,

Write Self to the writer, assuming big-endian byte order, using the given arguments. Read more
Source§

fn write_le_args<W>( &self, writer: &mut W, args: Self::Args<'_>, ) -> Result<(), Error>
where W: Write + Seek,

Write Self to the writer, assuming little-endian byte order, using the given arguments. Read more
Source§

fn write_ne_args<W>( &self, writer: &mut W, args: Self::Args<'_>, ) -> Result<(), Error>
where W: Write + Seek,

Write Self to the writer, assuming native-endian byte order, using the given arguments. Read more
Source§

impl Clone for Expression

Source§

fn clone(&self) -> Expression

Returns a duplicate of the value. Read more
1.0.0§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Expression

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for Expression

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Expression

Source§

fn eq(&self, other: &Expression) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl ReadEndian for Expression

Source§

const ENDIAN: EndianKind

The endianness of the type.
Source§

impl WriteEndian for Expression

Source§

const ENDIAN: EndianKind

The endianness of the type.
Source§

impl StructuralPartialEq for Expression

Auto Trait Implementations§

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneToUninit for T
where T: Clone,

§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> CustomError for T
where T: Display + Debug + Send + Sync + 'static,

Source§

fn as_any(&self) -> &(dyn Any + Sync + Send + 'static)

Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + Sync + Send + 'static)

Source§

fn as_box_any(self: Box<T>) -> Box<dyn Any + Sync + Send>

§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T> ToString for T
where T: Display + ?Sized,

§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.