Push and pop trap information in supervisior mode
This commit is contained in:
parent
d05eb249bb
commit
6bbc879244
10
src/m68k.rs
10
src/m68k.rs
@ -1675,11 +1675,12 @@ impl M68K {
|
||||
}
|
||||
|
||||
fn trap(&mut self, vector: u8) -> Result<(), InsExecError> {
|
||||
let orig_sr = self.sr;
|
||||
self.sr |= 0x2000;
|
||||
let new_pc = self.read_address((u32::from(vector) * 4) + self.vbr, Size::Long)?;
|
||||
self.push(u32::from(vector), Size::Word)?;
|
||||
self.push(self.pc, Size::Long)?;
|
||||
self.push(u32::from(self.sr), Size::Word)?;
|
||||
self.sr |= 0x2000;
|
||||
self.push(u32::from(orig_sr), Size::Word)?;
|
||||
self.pc = new_pc;
|
||||
Ok(())
|
||||
}
|
||||
@ -1692,6 +1693,8 @@ impl M68K {
|
||||
fault_addr: u32,
|
||||
write_data: u16,
|
||||
) -> Result<(), InsExecError> {
|
||||
let orig_sr = self.sr;
|
||||
self.sr |= 0x2000;
|
||||
let new_pc = self.read_address(2 * 4 + self.vbr, Size::Long)?;
|
||||
// Version & internal information
|
||||
self.push(0, Size::Long)?;
|
||||
@ -1729,8 +1732,7 @@ impl M68K {
|
||||
// Program counter
|
||||
self.push(self.pc, Size::Long)?;
|
||||
// Status register
|
||||
self.push(u32::from(self.sr), Size::Word)?;
|
||||
self.sr |= 0x2000;
|
||||
self.push(u32::from(orig_sr), Size::Word)?;
|
||||
self.pc = new_pc;
|
||||
Ok(())
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user