You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
3.5 KiB
Rust

#![allow(unused_variables, dead_code, non_snake_case)]
use super::{R6502, Bus};
// Instruction decoding:
// https://llx.com/Neil/a2/opcodes.html
// GROUP ONE ADDRESS MODES
// 000 (zero page,X) IZX
// 001 zero page ZP0
// 010 #immediate IMM
// 011 absolute ABS
// 100 (zero page),Y IZY
// 101 zero page,X ZPX
// 110 absolute,Y ABY
// 111 absolute,X ABX
// GROUP TWO ADDRESS MODES
// 000 #immediate IMM
// 001 zero page ZP0
// 010 accumulator IMP
// 011 absolute ABS
// 101 zero page,X ZPX
// 111 absolute,X ABX
pub struct AddressingModes;
impl AddressingModes
{
pub const GROUP_ONE_ADDRS: [fn(&mut R6502, &mut dyn Bus); 8] = [
AddressingModes::IZX,
AddressingModes::ZP0,
AddressingModes::IMM,
AddressingModes::ABS,
AddressingModes::IZY,
AddressingModes::ZPX,
AddressingModes::ABY,
AddressingModes::ABX,
];
}
impl AddressingModes
{
// This is also the accumulator mode
pub fn IMP(cpu: &mut R6502, bus: &mut dyn Bus)
{
cpu.working_data = cpu.a as u16;
}
pub fn IMM(cpu: &mut R6502, bus: &mut dyn Bus)
{
cpu.working_data = bus.read(cpu.pc) as u16;
cpu.pc += 1;
}
pub fn ZP0(cpu: &mut R6502, bus: &mut dyn Bus)
{
let working_addr = bus.read(cpu.pc) as u16 & 0x00FF;
cpu.pc += 1;
cpu.working_data = bus.read(working_addr) as u16;
}
pub fn ZPX(cpu: &mut R6502, bus: &mut dyn Bus)
{
let mut working_addr = bus.read(cpu.pc) as u16 & 0x00FF;
working_addr += cpu.x as u16;
cpu.pc += 1;
cpu.working_data = bus.read(working_addr) as u16;
}
pub fn ZPY(cpu: &mut R6502, bus: &mut dyn Bus)
{
let mut working_addr = bus.read(cpu.pc) as u16 & 0x00FF;
working_addr += cpu.y as u16;
cpu.pc += 1;
cpu.working_data = bus.read(working_addr) as u16;
}
pub fn REL(cpu: &mut R6502, bus: &mut dyn Bus)
{
// NOTE: Not sure if we can use the working_data variable for this.
// if any instruction using this address mode needs extra data read
// then we need another variable to store this address
cpu.working_data = bus.read(cpu.pc) as u16;
cpu.pc += 1;
}
pub fn ABS(cpu: &mut R6502, bus: &mut dyn Bus)
{
cpu.working_data = bus.read(cpu.pc) as u16;
cpu.pc += 1;
cpu.working_data |= (bus.read(cpu.pc) as u16) << 8;
cpu.pc += 1;
cpu.working_data = bus.read(cpu.working_data) as u16 & 0x00FF;
}
pub fn ABX(cpu: &mut R6502, bus: &mut dyn Bus)
{
cpu.working_data = bus.read(cpu.pc) as u16;
cpu.pc += 1;
cpu.working_data |= (bus.read(cpu.pc) as u16) << 8;
cpu.pc += 1;
cpu.working_data += cpu.x as u16;
cpu.working_data = bus.read(cpu.working_data) as u16 & 0x00FF;
}
pub fn ABY(cpu: &mut R6502, bus: &mut dyn Bus)
{
cpu.working_data = bus.read(cpu.pc) as u16;
cpu.pc += 1;
cpu.working_data |= (bus.read(cpu.pc) as u16) << 8;
cpu.pc += 1;
cpu.working_data += cpu.y as u16;
cpu.working_data = bus.read(cpu.working_data) as u16 & 0x00FF;
}
pub fn IND(cpu: &mut R6502, bus: &mut dyn Bus)
{
}
pub fn IZX(cpu: &mut R6502, bus: &mut dyn Bus)
{
}
pub fn IZY(cpu: &mut R6502, bus: &mut dyn Bus)
{
}
}