From 13becb31e8b669dd6254c68b3aae110e7711d9db Mon Sep 17 00:00:00 2001 From: Sophie Forrest <57433227+sophieforrest@users.noreply.github.com> Date: Sat, 13 Jan 2024 19:17:57 +1300 Subject: chore: init project --- src/instruction.rs | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/instruction.rs (limited to 'src/instruction.rs') diff --git a/src/instruction.rs b/src/instruction.rs new file mode 100644 index 0000000..2744048 --- /dev/null +++ b/src/instruction.rs @@ -0,0 +1,51 @@ +//! Implementation of instructions for MOS 6502. + +/// List of all instructions for MOS 6502. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum Instruction { + /// Load accumulator. + Lda, +} + +/// Addressing modes for MOS 6502. +#[derive(Clone, Copy, Debug)] +pub enum AddressingMode { + /// Immediate mode + Immediate, + + /// Zero Page mode + ZeroPage, + + /// ZeroPage.X mode + ZeroPageX, +} + +/// Operation retrieved from decoding an opcode. +pub struct Operation { + /// [`AddressingMode`] + pub addressing_mode: AddressingMode, + + /// [`Instruction`] + pub instruction: Instruction, +} + +impl Operation { + /// Creates a new operation from the `instruction` and `addressing_mode`. + pub const fn new(instruction: Instruction, addressing_mode: AddressingMode) -> Self { + Self { + addressing_mode, + instruction, + } + } +} + +/// Gets the operation from the passed in opcode. Returns [`None`] if no +/// operation exists. +pub const fn get_operation(opcode: u8) -> Option { + match opcode { + 0xA5 => Some(Operation::new(Instruction::Lda, AddressingMode::ZeroPage)), + 0xA9 => Some(Operation::new(Instruction::Lda, AddressingMode::Immediate)), + 0xB5 => Some(Operation::new(Instruction::Lda, AddressingMode::ZeroPageX)), + _ => None, + } +} -- cgit 1.4.1