AddressingMode

Enum AddressingMode 

Source
pub enum AddressingMode {
Show 13 variants Implied, Accumulator, Immediate, ZeroPage, ZeroPageX, ZeroPageY, Absolute, AbsoluteX, AbsoluteY, Indirect, IndexedIndirectX, IndirectIndexedY, Relative,
}
Expand description

CPU Addressing Modes

Defines how an instruction’s operand is accessed.

Variants§

§

Implied

No operand (instruction operates on CPU state)

Example: NOP, CLC, DEX

§

Accumulator

Operand is the accumulator register

Example: ASL A, ROL A

§

Immediate

Operand is the next byte after the opcode

Example: LDA #$42 loads the value $42

§

ZeroPage

Operand is in zero page ($00-$FF)

Example: LDA $80 reads from address $0080

§

ZeroPageX

Zero page address + X register (wraps within zero page)

Example: LDA $80,X with X=$05 reads from $0085

§

ZeroPageY

Zero page address + Y register (wraps within zero page)

Example: LDX $80,Y with Y=$05 reads from $0085

§

Absolute

Operand is a 16-bit absolute address

Example: LDA $1234 reads from address $1234

§

AbsoluteX

Absolute address + X register

Example: LDA $1234,X with X=$10 reads from $1244

§

AbsoluteY

Absolute address + Y register

Example: LDA $1234,Y with Y=$10 reads from $1244

§

Indirect

Indirect addressing (JMP only)

Example: JMP ($1234) reads target address from $1234-$1235

§

IndexedIndirectX

Indexed Indirect: (Zero Page + X), then dereference

Example: LDA ($80,X) with X=$05:

  1. Calculate pointer address: $80 + $05 = $85
  2. Read pointer: [$85] = $20, [$86] = $30
  3. Read from $3020
§

IndirectIndexedY

Indirect Indexed: Dereference Zero Page, then + Y

Example: LDA ($80),Y with Y=$10:

  1. Read pointer: [$80] = $20, [$81] = $30
  2. Add Y: $3020 + $10 = $3030
  3. Read from $3030
§

Relative

Relative offset for branch instructions

Example: BNE $02 branches PC + 2 bytes forward

Implementations§

Source§

impl AddressingMode

Source

pub const fn operand_bytes(self) -> u8

Get the number of operand bytes for this addressing mode

§Returns
  • 0 bytes: Implied, Accumulator
  • 1 byte: Immediate, Zero Page variants, Indexed Indirect, Indirect Indexed, Relative
  • 2 bytes: Absolute variants, Indirect
Source

pub const fn can_page_cross(self) -> bool

Check if this addressing mode can have a page crossing penalty

§Returns

true for:

  • Absolute,X
  • Absolute,Y
  • (Indirect),Y
  • Relative (branches)
Source§

impl AddressingMode

Addressing mode implementations

These methods are called during instruction execution to resolve operand addresses.

Source

pub fn resolve(self, pc: u16, x: u8, y: u8, bus: &mut impl Bus) -> AddressResult

Resolve the effective address for this addressing mode

§Arguments
  • pc - Current program counter (AFTER opcode fetch)
  • x - X register value
  • y - Y register value
  • bus - Memory bus for reading operands
§Returns

AddressResult containing the effective address and page crossing status

§Notes
  • For Immediate, addr is the value itself
  • For Accumulator and Implied, addr is unused
  • PC should point to the first operand byte

Trait Implementations§

Source§

impl Clone for AddressingMode

Source§

fn clone(&self) -> AddressingMode

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for AddressingMode

Source§

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

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

impl Hash for AddressingMode

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for AddressingMode

Source§

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

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

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 Copy for AddressingMode

Source§

impl Eq for AddressingMode

Source§

impl StructuralPartialEq for AddressingMode

Auto Trait Implementations§

Blanket Implementations§

Source§

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

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

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

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

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

Source§

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

Mutably borrows from an owned value. Read more
Source§

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

Source§

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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

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

Source§

fn into(self) -> U

Calls U::from(self).

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

Source§

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

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

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

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

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

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

Source§

type Error = Infallible

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

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

Performs the conversion.
Source§

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

Source§

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

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

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

Performs the conversion.