mos6502/core/src/address_mode.rs
2025-07-01 13:08:23 -04:00

78 lines
2.3 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/// Represents the various addressing modes of the 6502 CPU.
#[derive(PartialEq, Debug, Copy, Clone)]
pub enum AddressMode {
/// Implied
///
/// No operand is needed; the instruction implicitly operates on a register or flag.
/// Example: `CLC` (Clear Carry Flag)
Implied,
/// Accumulator
///
/// Operates directly on the accumulator register.
/// Example: `ASL A` (Arithmetic Shift Left on Accumulator)
Accumulator,
/// Immediate
///
/// Operand is a constant 8-bit value.
/// Example: `LDA #$01` loads the value 0x01 into the accumulator.
Immediate,
/// Zero Page
///
/// Operand is an address in the first 256 bytes of memory (0x00000x00FF).
/// Example: `LDA $10` reads from address 0x0010.
ZeroPage,
/// Zero Page X
///
/// Zero page address offset by the X register.
/// Example: If X = 0x10, `LDA $23,X` reads from 0x33.
ZeroPageX,
/// Zero Page Y
///
/// Zero page address offset by the Y register.
/// Used only by a few instructions like `LDX` and `STX`.
/// Example: If Y = 0x10, `LDX $23,Y` reads from 0x33.
ZeroPageY,
/// Absolute
///
/// Full 16-bit address is provided as the operand.
/// Example: `LDA $1234` reads from address 0x1234.
Absolute,
/// Absolute X
///
/// Absolute address offset by the X register.
/// Example: If X = 0x10, `LDA $1234,X` reads from 0x1244.
AbsoluteX,
/// Absolute Y
///
/// Absolute address offset by the Y register.
/// Example: If Y = 0x10, `LDA $1234,Y` reads from 0x1244.
AbsoluteY,
/// Indirect
///
/// Only used by `JMP`. Operand is a 16-bit address pointing to another 16-bit address.
/// Example: `JMP ($1234)` jumps to the address stored at 0x1234/0x1235.
Indirect,
/// Indirect X (Indexed Indirect)
///
/// Operand is a zero-page address. Add X to it, then fetch the 16-bit address from that location.
/// Example: If X = 0x04 and operand = $20, `LDA ($20,X)` reads from the address at $24/$25.
IndirectX,
/// Indirect Y (Indirect Indexed)
///
/// Operand is a zero-page address. Fetch the 16-bit address from that location, then add Y.
/// Example: If Y = 0x10 and ($20) = $3000, `LDA ($20),Y` reads from $3010.
IndirectY,
}