mirror of
https://github.com/transistorfet/moa.git
synced 2024-06-10 22:29:41 +00:00
Implemented the CHK and NEGX instructions
This commit is contained in:
parent
9ff528c463
commit
873741846c
|
@ -179,11 +179,9 @@ impl M68kDecoder {
|
||||||
if (ins & 0x040) == 0 {
|
if (ins & 0x040) == 0 {
|
||||||
let size = match get_size(ins) {
|
let size = match get_size(ins) {
|
||||||
Some(Size::Word) => Size::Word,
|
Some(Size::Word) => Size::Word,
|
||||||
// TODO 2021-12-14: the docs for the 68000 show the size field, even though it says it only operates on words
|
Some(Size::Long) if self.cputype >= M68kType::MC68020 => Size::Long,
|
||||||
// and according to some other sources, it seems they are parsed and executed on the 68000, so
|
// On the 68000, long words in CHK are not supported, but the opcode maps to the word size instruction
|
||||||
// I'm removing the check that only allows this on the MC68020
|
Some(Size::Long) => Size::Word,
|
||||||
//Some(Size::Long) if self.cputype >= M68kType::MC68020 => Size::Long,
|
|
||||||
Some(Size::Long) => Size::Long,
|
|
||||||
_ => return Err(Error::processor(Exceptions::IllegalInstruction as u32)),
|
_ => return Err(Error::processor(Exceptions::IllegalInstruction as u32)),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -381,8 +381,20 @@ impl M68k {
|
||||||
},
|
},
|
||||||
//Instruction::BKPT(u8) => {
|
//Instruction::BKPT(u8) => {
|
||||||
//},
|
//},
|
||||||
//Instruction::CHK(Target, Size) => {
|
Instruction::CHK(target, reg, size) => {
|
||||||
//},
|
let upper_bound = sign_extend_to_long(self.get_target_value(target, size, Used::Once)?, size) as i32;
|
||||||
|
let dreg = sign_extend_to_long(self.state.d_reg[reg as usize], size) as i32;
|
||||||
|
|
||||||
|
self.set_sr(self.state.sr & 0xFFF0);
|
||||||
|
if dreg < 0 || dreg > upper_bound {
|
||||||
|
if dreg < 0 {
|
||||||
|
self.set_flag(Flags::Negative, true);
|
||||||
|
} else if dreg > upper_bound {
|
||||||
|
self.set_flag(Flags::Negative, false);
|
||||||
|
}
|
||||||
|
self.exception(Exceptions::ChkInstruction as u8, false)?;
|
||||||
|
}
|
||||||
|
},
|
||||||
Instruction::CLR(target, size) => {
|
Instruction::CLR(target, size) => {
|
||||||
self.set_target_value(target, 0, size, Used::Once)?;
|
self.set_target_value(target, 0, size, Used::Once)?;
|
||||||
// Clear flags except Zero flag
|
// Clear flags except Zero flag
|
||||||
|
@ -652,8 +664,24 @@ impl M68k {
|
||||||
self.set_compare_flags(result, size, carry, overflow);
|
self.set_compare_flags(result, size, carry, overflow);
|
||||||
self.set_flag(Flags::Extend, carry);
|
self.set_flag(Flags::Extend, carry);
|
||||||
},
|
},
|
||||||
//Instruction::NEGX(Target, Size) => {
|
Instruction::NEGX(dest, size) => {
|
||||||
//},
|
let existing = self.get_target_value(dest, size, Used::Twice)?;
|
||||||
|
let extend = self.get_flag(Flags::Extend) as u32;
|
||||||
|
let (result1, carry1) = overflowing_sub_sized(0, existing, size);
|
||||||
|
let (result2, carry2) = overflowing_sub_sized(result1, extend, size);
|
||||||
|
let overflow = get_sub_overflow(0, existing, result2, size);
|
||||||
|
|
||||||
|
// Handle flags
|
||||||
|
let zero = self.get_flag(Flags::Zero);
|
||||||
|
self.set_compare_flags(result2, size, carry1 || carry2, overflow);
|
||||||
|
if self.get_flag(Flags::Zero) {
|
||||||
|
// NEGX can only clear the zero flag, so if it's set, restore it to whatever it was before
|
||||||
|
self.set_flag(Flags::Zero, zero);
|
||||||
|
}
|
||||||
|
self.set_flag(Flags::Extend, carry1 || carry2);
|
||||||
|
|
||||||
|
self.set_target_value(dest, result2, size, Used::Twice)?;
|
||||||
|
},
|
||||||
Instruction::NOP => { },
|
Instruction::NOP => { },
|
||||||
Instruction::NOT(target, size) => {
|
Instruction::NOT(target, size) => {
|
||||||
let mut value = self.get_target_value(target, size, Used::Twice)?;
|
let mut value = self.get_target_value(target, size, Used::Twice)?;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
Last run on 2022-09-12 at commit 5a55aa7f63834a24aae1db195a0d3aa7d8943fb9
|
Last run on 2022-09-12 at commit 9ff528c4638b7b5757d110ba87c10ab60aa33557
|
||||||
|
|
||||||
ABCD.json completed: 301 passed, 7764 FAILED
|
ABCD.json completed: 301 passed, 7764 FAILED
|
||||||
ADD.b.json completed, all passed!
|
ADD.b.json completed, all passed!
|
||||||
|
@ -26,7 +26,7 @@ BSET.json completed, all passed!
|
||||||
BSR.json completed: 4085 passed, 3980 FAILED
|
BSR.json completed: 4085 passed, 3980 FAILED
|
||||||
BTST.json completed: 8052 passed, 13 FAILED
|
BTST.json completed: 8052 passed, 13 FAILED
|
||||||
Bcc.json completed: 5865 passed, 2200 FAILED
|
Bcc.json completed: 5865 passed, 2200 FAILED
|
||||||
CHK.json completed: 0 passed, 8065 FAILED
|
CHK.json completed: 7744 passed, 321 FAILED
|
||||||
CLR.b.json completed, all passed!
|
CLR.b.json completed, all passed!
|
||||||
CLR.l.json completed: 6882 passed, 1183 FAILED
|
CLR.l.json completed: 6882 passed, 1183 FAILED
|
||||||
CLR.w.json completed: 6862 passed, 1203 FAILED
|
CLR.w.json completed: 6862 passed, 1203 FAILED
|
||||||
|
@ -77,9 +77,9 @@ NBCD.json completed: 0 passed, 8065 FAILED
|
||||||
NEG.b.json completed, all passed!
|
NEG.b.json completed, all passed!
|
||||||
NEG.l.json completed: 7552 passed, 513 FAILED
|
NEG.l.json completed: 7552 passed, 513 FAILED
|
||||||
NEG.w.json completed: 7531 passed, 534 FAILED
|
NEG.w.json completed: 7531 passed, 534 FAILED
|
||||||
NEGX.b.json completed: 0 passed, 8065 FAILED
|
NEGX.b.json completed, all passed!
|
||||||
NEGX.l.json completed: 0 passed, 8065 FAILED
|
NEGX.l.json completed: 7520 passed, 545 FAILED
|
||||||
NEGX.w.json completed: 0 passed, 8065 FAILED
|
NEGX.w.json completed: 7510 passed, 555 FAILED
|
||||||
NOP.json completed, all passed!
|
NOP.json completed, all passed!
|
||||||
NOT.b.json completed, all passed!
|
NOT.b.json completed, all passed!
|
||||||
NOT.l.json completed: 7512 passed, 553 FAILED
|
NOT.l.json completed: 7512 passed, 553 FAILED
|
||||||
|
@ -125,5 +125,5 @@ TST.l.json completed, all passed!
|
||||||
TST.w.json completed, all passed!
|
TST.w.json completed, all passed!
|
||||||
UNLINK.json completed, all passed!
|
UNLINK.json completed, all passed!
|
||||||
|
|
||||||
passed: 860483, failed: 139577, total 86%
|
passed: 891322, failed: 108738, total 89%
|
||||||
completed in 16m 38s
|
completed in 13m 52s
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
Last run on 2022-09-11 at commit 42bfabb7434fdff65a1ccacced82ddc6597ed835
|
Last run on 2022-09-12 at commit 5a55aa7f63834a24aae1db195a0d3aa7d8943fb9
|
||||||
|
|
||||||
ABCD.json completed: 301 passed, 7764 FAILED
|
ABCD.json completed: 301 passed, 7764 FAILED
|
||||||
ADD.b.json completed, all passed!
|
ADD.b.json completed, all passed!
|
||||||
|
|
Loading…
Reference in New Issue
Block a user