phx phy plx ply

This commit is contained in:
Sam M W 2024-04-27 02:55:49 +01:00
parent 0f1c01ce60
commit cfb956f6a2
2 changed files with 44 additions and 0 deletions

View File

@ -471,11 +471,47 @@ impl<M: Bus, V: Variant> CPU<M, V> {
let val = self.registers.accumulator;
self.push_on_stack(val);
}
(Instruction::PHX, OpInput::UseImplied) => {
// Push X
self.push_on_stack(self.registers.index_x);
}
(Instruction::PHY, OpInput::UseImplied) => {
// Push Y
self.push_on_stack(self.registers.index_y);
}
(Instruction::PHP, OpInput::UseImplied) => {
// Push status
let val = self.registers.status.bits() | 0x30;
self.push_on_stack(val);
}
(Instruction::PLX, OpInput::UseImplied) => {
// Pull accumulator
self.pull_from_stack();
let val: u8 = self.fetch_from_stack();
self.registers.index_x = val;
self.registers.status.set_with_mask(
Status::PS_ZERO | Status::PS_NEGATIVE,
Status::new(StatusArgs {
zero: val == 0,
negative: self.registers.accumulator > 127,
..StatusArgs::none()
}),
);
}
(Instruction::PLY, OpInput::UseImplied) => {
// Pull accumulator
self.pull_from_stack();
let val: u8 = self.fetch_from_stack();
self.registers.index_y = val;
self.registers.status.set_with_mask(
Status::PS_ZERO | Status::PS_NEGATIVE,
Status::new(StatusArgs {
zero: val == 0,
negative: self.registers.accumulator > 127,
..StatusArgs::none()
}),
);
}
(Instruction::PLA, OpInput::UseImplied) => {
// Pull accumulator
self.pull_from_stack();

View File

@ -83,8 +83,12 @@ pub enum Instruction {
NOP, // No OPeration.................. | .. ..... =
ORA, // inclusive OR (bitwise)........ | N. ...Z. A = A | M
PHA, // PusH Accumulator.............. | .. ..... S M = A
PHX, // PusH X........................ | .. ..... S M = A
PHY, // PusH Y........................ | .. ..... S M = A
PHP, // PusH Processor status......... | .. ..... S M = F
PLA, // PuLl Accumulator.............. | N. ...Z. A S = M (stack)
PLX, // PuLl X........................ | N. ...Z. A S = M (stack)
PLY, // PuLl Y........................ | N. ...Z. A S = M (stack)
PLP, // PuLl Processor status......... | NV BDIZC S = M (stack)
ROL, // ROtate Left................... | N. ...ZC A = C A rotated
// or N. ...ZC M = C M rotated
@ -499,6 +503,10 @@ impl crate::Variant for Cmos6502 {
0x74 => Some((Instruction::STZ, AddressingMode::ZeroPageX)),
0x9c => Some((Instruction::STZ, AddressingMode::Absolute)),
0x9e => Some((Instruction::STZ, AddressingMode::AbsoluteX)),
0x7a => Some((Instruction::PLY, AddressingMode::Implied)),
0xfa => Some((Instruction::PLX, AddressingMode::Implied)),
0x5a => Some((Instruction::PHY, AddressingMode::Implied)),
0xda => Some((Instruction::PHX, AddressingMode::Implied)),
_ => Nmos6502::decode(opcode),
}
}