mirror of
https://github.com/FranLMSP/snes.git
synced 2026-10-02 07:25:19 -04:00
SET instructions
This commit is contained in:
@@ -348,6 +348,14 @@ impl CPU {
|
|||||||
pub fn increment_cycles_return_subroutine(&mut self) {
|
pub fn increment_cycles_return_subroutine(&mut self) {
|
||||||
self.cycles += 6;
|
self.cycles += 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn increment_cycles_set_flag(&mut self) {
|
||||||
|
self.registers.increment_pc(1); self.cycles += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn increment_cycles_sep(&mut self) {
|
||||||
|
self.registers.increment_pc(2); self.cycles += 3;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|||||||
@@ -798,6 +798,26 @@ impl CPU {
|
|||||||
self.increment_cycles_return_subroutine();
|
self.increment_cycles_return_subroutine();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn sec(&mut self) {
|
||||||
|
self.registers.set_carry_flag(true);
|
||||||
|
self.increment_cycles_set_flag();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sed(&mut self) {
|
||||||
|
self.registers.set_decimal_mode_flag(true);
|
||||||
|
self.increment_cycles_set_flag();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sei(&mut self) {
|
||||||
|
self.registers.set_irq_disable_flag(true);
|
||||||
|
self.increment_cycles_set_flag();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sep(&mut self, bus: &Bus) {
|
||||||
|
self.registers.p = self.get_8bit_from_address(bus, AddressingMode::Immediate);
|
||||||
|
self.increment_cycles_sep();
|
||||||
|
}
|
||||||
|
|
||||||
pub fn execute_opcode(&mut self, opcode: u8, bus: &mut Bus) {
|
pub fn execute_opcode(&mut self, opcode: u8, bus: &mut Bus) {
|
||||||
type A = AddressingMode;
|
type A = AddressingMode;
|
||||||
type I = IndexRegister;
|
type I = IndexRegister;
|
||||||
@@ -1072,6 +1092,14 @@ impl CPU {
|
|||||||
0xF7 => self.sbc(bus, A::DirectPageIndirectLongIndexed(I::Y)),
|
0xF7 => self.sbc(bus, A::DirectPageIndirectLongIndexed(I::Y)),
|
||||||
0xE3 => self.sbc(bus, A::StackRelative),
|
0xE3 => self.sbc(bus, A::StackRelative),
|
||||||
0xF3 => self.sbc(bus, A::StackRelativeIndirectIndexed(I::Y)),
|
0xF3 => self.sbc(bus, A::StackRelativeIndirectIndexed(I::Y)),
|
||||||
|
// SEC
|
||||||
|
0x38 => self.sec(),
|
||||||
|
// SED
|
||||||
|
0xF8 => self.sed(),
|
||||||
|
// SEI
|
||||||
|
0x78 => self.sei(),
|
||||||
|
// SEP
|
||||||
|
0xE2 => self.sep(bus),
|
||||||
_ => println!("Invalid opcode: {:02X}", opcode),
|
_ => println!("Invalid opcode: {:02X}", opcode),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2228,4 +2256,50 @@ mod cpu_instructions_tests {
|
|||||||
assert_eq!(cpu.registers.pc, 0x1234);
|
assert_eq!(cpu.registers.pc, 0x1234);
|
||||||
assert_eq!(cpu.cycles, 6);
|
assert_eq!(cpu.cycles, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_sec() {
|
||||||
|
let mut cpu = CPU::new();
|
||||||
|
cpu.registers.pc = 0x0000;
|
||||||
|
cpu.registers.set_carry_flag(false);
|
||||||
|
cpu.sec();
|
||||||
|
assert_eq!(cpu.registers.get_carry_flag(), true);
|
||||||
|
assert_eq!(cpu.registers.pc, 0x0001);
|
||||||
|
assert_eq!(cpu.cycles, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_sed() {
|
||||||
|
let mut cpu = CPU::new();
|
||||||
|
cpu.registers.pc = 0x0000;
|
||||||
|
cpu.registers.set_decimal_mode_flag(false);
|
||||||
|
cpu.sed();
|
||||||
|
assert_eq!(cpu.registers.get_decimal_mode_flag(), true);
|
||||||
|
assert_eq!(cpu.registers.pc, 0x0001);
|
||||||
|
assert_eq!(cpu.cycles, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_sei() {
|
||||||
|
let mut cpu = CPU::new();
|
||||||
|
cpu.registers.pc = 0x0000;
|
||||||
|
cpu.registers.set_irq_disable_flag(false);
|
||||||
|
cpu.sei();
|
||||||
|
assert_eq!(cpu.registers.get_irq_disable_flag(), true);
|
||||||
|
assert_eq!(cpu.registers.pc, 0x0001);
|
||||||
|
assert_eq!(cpu.cycles, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_sep() {
|
||||||
|
let mut cpu = CPU::new();
|
||||||
|
let mut bus = Bus::new();
|
||||||
|
cpu.registers.pc = 0x0000;
|
||||||
|
cpu.registers.p = 0x00;
|
||||||
|
bus.write(0x0001, 0xFF);
|
||||||
|
cpu.sep(&bus);
|
||||||
|
assert_eq!(cpu.registers.p, 0xFF);
|
||||||
|
assert_eq!(cpu.registers.pc, 0x0002);
|
||||||
|
assert_eq!(cpu.cycles, 3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user