mirror of
https://github.com/transistorfet/moa.git
synced 2024-06-08 10:30:21 +00:00
Added PC hack to the various branch/jump instructions
This commit is contained in:
parent
f5a548ac90
commit
267ef488ab
|
@ -309,17 +309,26 @@ impl M68k {
|
||||||
Instruction::Bcc(cond, offset) => {
|
Instruction::Bcc(cond, offset) => {
|
||||||
let should_branch = self.get_current_condition(cond);
|
let should_branch = self.get_current_condition(cond);
|
||||||
if should_branch {
|
if should_branch {
|
||||||
self.set_pc((self.decoder.start + 2).wrapping_add(offset as u32))?;
|
if let Err(err) = self.set_pc((self.decoder.start + 2).wrapping_add(offset as u32)) {
|
||||||
|
self.state.pc -= 2;
|
||||||
|
return Err(err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Instruction::BRA(offset) => {
|
Instruction::BRA(offset) => {
|
||||||
self.set_pc((self.decoder.start + 2).wrapping_add(offset as u32))?;
|
if let Err(err) = self.set_pc((self.decoder.start + 2).wrapping_add(offset as u32)) {
|
||||||
|
self.state.pc -= 2;
|
||||||
|
return Err(err);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
Instruction::BSR(offset) => {
|
Instruction::BSR(offset) => {
|
||||||
self.push_long(self.state.pc)?;
|
self.push_long(self.state.pc)?;
|
||||||
let sp = *self.get_stack_pointer_mut();
|
let sp = *self.get_stack_pointer_mut();
|
||||||
self.debugger.stack_tracer.push_return(sp);
|
self.debugger.stack_tracer.push_return(sp);
|
||||||
self.set_pc((self.decoder.start + 2).wrapping_add(offset as u32))?;
|
if let Err(err) = self.set_pc((self.decoder.start + 2).wrapping_add(offset as u32)) {
|
||||||
|
self.state.pc -= 2;
|
||||||
|
return Err(err);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
Instruction::BCHG(bitnum, target, size) => {
|
Instruction::BCHG(bitnum, target, size) => {
|
||||||
let bitnum = self.get_target_value(bitnum, Size::Byte, Used::Once)?;
|
let bitnum = self.get_target_value(bitnum, Size::Byte, Used::Once)?;
|
||||||
|
@ -450,7 +459,10 @@ impl M68k {
|
||||||
let next = ((get_value_sized(self.state.d_reg[reg as usize], Size::Word) as u16) as i16).wrapping_sub(1);
|
let next = ((get_value_sized(self.state.d_reg[reg as usize], Size::Word) as u16) as i16).wrapping_sub(1);
|
||||||
set_value_sized(&mut self.state.d_reg[reg as usize], next as u32, Size::Word);
|
set_value_sized(&mut self.state.d_reg[reg as usize], next as u32, Size::Word);
|
||||||
if next != -1 {
|
if next != -1 {
|
||||||
self.set_pc((self.decoder.start + 2).wrapping_add(offset as u32))?;
|
if let Err(err) = self.set_pc((self.decoder.start + 2).wrapping_add(offset as u32)) {
|
||||||
|
self.state.pc -= 2;
|
||||||
|
return Err(err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -559,12 +571,18 @@ impl M68k {
|
||||||
},
|
},
|
||||||
Instruction::JMP(target) => {
|
Instruction::JMP(target) => {
|
||||||
let addr = self.get_target_address(target)?;
|
let addr = self.get_target_address(target)?;
|
||||||
self.set_pc(addr)?;
|
if let Err(err) = self.set_pc(addr) {
|
||||||
|
self.state.pc -= 2;
|
||||||
|
return Err(err);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
Instruction::JSR(target) => {
|
Instruction::JSR(target) => {
|
||||||
let previous_pc = self.state.pc;
|
let previous_pc = self.state.pc;
|
||||||
let addr = self.get_target_address(target)?;
|
let addr = self.get_target_address(target)?;
|
||||||
self.set_pc(addr)?;
|
if let Err(err) = self.set_pc(addr) {
|
||||||
|
self.state.pc -= 2;
|
||||||
|
return Err(err);
|
||||||
|
}
|
||||||
|
|
||||||
// If the address is good, then push the old PC onto the stack
|
// If the address is good, then push the old PC onto the stack
|
||||||
self.push_long(previous_pc)?;
|
self.push_long(previous_pc)?;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user