diff --git a/src/cpus/m68k/execute.rs b/src/cpus/m68k/execute.rs index 3bacbf8..ced4bb4 100644 --- a/src/cpus/m68k/execute.rs +++ b/src/cpus/m68k/execute.rs @@ -273,13 +273,18 @@ impl M68k { self.set_target_value(target, pair.0, size, Used::Twice)?; // Adjust flags - self.set_flag(Flags::Extend, false); self.set_logic_flags(pair.0, size); - if pair.1 { - self.set_flag(Flags::Carry, true); - self.set_flag(Flags::Extend, true); - } self.set_flag(Flags::Overflow, overflow); + + if count != 0 { + self.set_flag(Flags::Extend, false); + if pair.1 { + self.set_flag(Flags::Carry, true); + self.set_flag(Flags::Extend, true); + } + } else { + self.set_flag(Flags::Carry, false); + } }, Instruction::Bcc(cond, offset) => { let should_branch = self.get_current_condition(cond); @@ -536,12 +541,12 @@ impl M68k { *addr = value; }, Instruction::LINK(reg, offset) => { - let value = *self.get_a_reg_mut(reg); - self.push_long(value)?; + *self.get_stack_pointer_mut() -= 4; let sp = *self.get_stack_pointer_mut(); - let addr = self.get_a_reg_mut(reg); - *addr = sp; - *self.get_stack_pointer_mut() = sp.wrapping_add((offset as i32) as u32); + let value = *self.get_a_reg_mut(reg); + self.set_address_sized(sp as Address, value, Size::Long)?; + *self.get_a_reg_mut(reg) = sp; + *self.get_stack_pointer_mut() = (sp as i32).wrapping_add(offset as i32) as u32; }, Instruction::LSd(count, target, size, shift_dir) => { let count = self.get_target_value(count, size, Used::Once)? % 64; diff --git a/src/cpus/m68k/state.rs b/src/cpus/m68k/state.rs index 49ee0a2..74dc8db 100644 --- a/src/cpus/m68k/state.rs +++ b/src/cpus/m68k/state.rs @@ -183,7 +183,7 @@ impl M68k { for i in 0..7 { println!("D{}: {:#010x} A{}: {:#010x}", i, self.state.d_reg[i as usize], i, self.state.a_reg[i as usize]); } - println!("D7: {:#010x} USP: {:#010x}", self.state.d_reg[7], self.state.ssp); + println!("D7: {:#010x} USP: {:#010x}", self.state.d_reg[7], self.state.usp); println!(" SSP: {:#010x}", self.state.ssp); println!("Current Instruction: {:#010x} {:?}", self.decoder.start, self.decoder.instruction);