diff --git a/src/cpus/m68k/decode.rs b/src/cpus/m68k/decode.rs index 37b2ae8..80aa39c 100644 --- a/src/cpus/m68k/decode.rs +++ b/src/cpus/m68k/decode.rs @@ -43,6 +43,7 @@ pub struct M68kDecoder { pub cputype: M68kType, pub start: u32, pub end: u32, + pub instruction_word: u16, pub instruction: Instruction, } @@ -52,6 +53,7 @@ impl M68kDecoder { cputype, start: start, end: start, + instruction_word: 0, instruction: Instruction::NOP, } } @@ -70,6 +72,7 @@ impl M68kDecoder { pub fn decode_one(&mut self, memory: &mut dyn Addressable) -> Result { let ins = self.read_instruction_word(memory)?; + self.instruction_word = ins; match ((ins & 0xF000) >> 12) as u8 { OPCG_BIT_OPS => { @@ -517,7 +520,7 @@ impl M68kDecoder { let dest = get_high_reg(ins); match (ins & 0x08) == 0 { true => Ok(Instruction::ADDX(Target::DirectDReg(src), Target::DirectDReg(dest), size)), - false => Ok(Instruction::ADDX(Target::IndirectARegDec(src), Target::DirectDReg(dest), size)), + false => Ok(Instruction::ADDX(Target::IndirectARegDec(src), Target::IndirectARegDec(dest), size)), } } else { let target = self.decode_lower_effective_address(memory, ins, Some(size))?; @@ -609,14 +612,14 @@ impl M68kDecoder { } } - fn read_instruction_word(&mut self, device: &mut dyn Addressable) -> Result { - let word = device.read_beu16(self.end as Address)?; + fn read_instruction_word(&mut self, memory: &mut dyn Addressable) -> Result { + let word = memory.read_beu16(self.end as Address)?; self.end += 2; Ok(word) } - fn read_instruction_long(&mut self, device: &mut dyn Addressable) -> Result { - let word = device.read_beu32(self.end as Address)?; + fn read_instruction_long(&mut self, memory: &mut dyn Addressable) -> Result { + let word = memory.read_beu32(self.end as Address)?; self.end += 4; Ok(word) } diff --git a/src/cpus/m68k/execute.rs b/src/cpus/m68k/execute.rs index e147a92..6195aa0 100644 --- a/src/cpus/m68k/execute.rs +++ b/src/cpus/m68k/execute.rs @@ -3,7 +3,7 @@ use crate::system::System; use crate::error::{ErrorType, Error}; use crate::devices::{ClockElapsed, Address, Steppable, Interruptable, Addressable, Debuggable, Transmutable}; -use super::state::{M68k, M68kType, Status, Flags, Exceptions, InterruptPriority}; +use super::state::{M68k, M68kType, Status, Flags, Exceptions, InterruptPriority, FunctionCode, MemType, MemAccess}; use super::instructions::{ Register, Size, @@ -94,7 +94,6 @@ impl M68k { self.decode_next()?; self.execute_current()?; self.timer.cycle.end(); - //if (self.timer.cycle.events % 500) == 0 { // println!("{}", self.timer); //} @@ -134,12 +133,26 @@ impl M68k { pub fn exception(&mut self, number: u8, is_interrupt: bool) -> Result<(), Error> { debug!("{}: raising exception {}", DEV_NAME, number); + let ins_word = self.decoder.instruction_word; + let extra_code = self.state.request.get_type_code(); + let fault_address = self.state.request.address; + let offset = (number as u16) << 2; if self.cputype >= M68kType::MC68010 { self.push_word(offset)?; } - self.push_long(self.state.pc)?; - self.push_word(self.state.sr)?; + + // If BusError or AddressError + if number == 2 || number == 3 { + self.push_long(self.state.pc - 4)?; + self.push_word(self.state.sr)?; + self.push_word(ins_word)?; + self.push_long(fault_address)?; + self.push_word((ins_word & 0xFFF0) | extra_code)?; + } else { + self.push_long(self.state.pc)?; + self.push_word(self.state.sr)?; + } // Changes to the flags must happen after the previous value has been pushed to the stack self.set_flag(Flags::Supervisor, true); @@ -148,7 +161,17 @@ impl M68k { self.state.sr = (self.state.sr & !(Flags::IntMask as u16)) | ((self.state.current_ipl as u16) << 8); } - self.state.pc = self.port.read_beu32((self.state.vbr + offset as u32) as Address)?; + let vector = self.state.vbr + offset as u32; + self.state.pc = self.port.read_beu32(vector as Address)?; + let result = self.start_request(vector, Size::Word, MemAccess::Read, MemType::Program); + + // If BusError or AddressError, and another AddressError occurs, then halt + if number == 2 || number == 3 { + if let Err(err) = result { + self.state.status = Status::Stopped; + return Err(err); + } + } Ok(()) } @@ -157,6 +180,7 @@ impl M68k { self.timing.reset(); self.timer.decode.start(); + self.start_request(self.state.pc, Size::Word, MemAccess::Read, MemType::Program)?; self.decoder.decode_at(&mut self.port, self.state.pc)?; self.timer.decode.end(); @@ -248,16 +272,19 @@ impl M68k { let should_branch = self.get_current_condition(cond); if should_branch { self.state.pc = (self.decoder.start + 2).wrapping_add(offset as u32); + self.start_request(self.state.pc, Size::Word, MemAccess::Read, MemType::Program)?; } }, Instruction::BRA(offset) => { self.state.pc = (self.decoder.start + 2).wrapping_add(offset as u32); + self.start_request(self.state.pc, Size::Word, MemAccess::Read, MemType::Program)?; }, Instruction::BSR(offset) => { self.push_long(self.state.pc)?; let sp = *self.get_stack_pointer_mut(); self.debugger.stack_tracer.push_return(sp); self.state.pc = (self.decoder.start + 2).wrapping_add(offset as u32); + self.start_request(self.state.pc, Size::Word, MemAccess::Read, MemType::Program)?; }, Instruction::BCHG(bitnum, target, size) => { let bitnum = self.get_target_value(bitnum, Size::Byte, Used::Once)?; @@ -460,12 +487,17 @@ impl M68k { //}, Instruction::JMP(target) => { self.state.pc = self.get_target_address(target)?; + self.start_request(self.state.pc, Size::Word, MemAccess::Read, MemType::Program)?; }, Instruction::JSR(target) => { - self.push_long(self.state.pc)?; + let previous_pc = self.state.pc; + self.state.pc = self.get_target_address(target)?; + self.start_request(self.state.pc, Size::Word, MemAccess::Read, MemType::Program)?; + + // If the address is good, then push the old PC onto the stack + self.push_long(previous_pc)?; let sp = *self.get_stack_pointer_mut(); self.debugger.stack_tracer.push_return(sp); - self.state.pc = self.get_target_address(target)?; }, Instruction::LEA(target, reg) => { let value = self.get_target_address(target)?; @@ -884,32 +916,6 @@ impl M68k { Ok(addr) } - fn push_word(&mut self, value: u16) -> Result<(), Error> { - *self.get_stack_pointer_mut() -= 2; - let addr = *self.get_stack_pointer_mut(); - self.port.write_beu16(addr as Address, value) - } - - fn pop_word(&mut self) -> Result { - let addr = *self.get_stack_pointer_mut(); - let value = self.port.read_beu16(addr as Address)?; - *self.get_stack_pointer_mut() += 2; - Ok(value) - } - - fn push_long(&mut self, value: u32) -> Result<(), Error> { - *self.get_stack_pointer_mut() -= 4; - let addr = *self.get_stack_pointer_mut(); - self.port.write_beu32(addr as Address, value) - } - - fn pop_long(&mut self) -> Result { - let addr = *self.get_stack_pointer_mut(); - let value = self.port.read_beu32(addr as Address)?; - *self.get_stack_pointer_mut() += 4; - Ok(value) - } - pub fn get_target_value(&mut self, target: Target, size: Size, used: Used) -> Result { match target { Target::Immediate(value) => Ok(value), @@ -1050,7 +1056,24 @@ impl M68k { *reg_addr } + pub fn start_request(&mut self, addr: u32, size: Size, access: MemAccess, mtype: MemType) -> Result { + self.state.request.code = match mtype { + MemType::Program => FunctionCode::program(self.state.sr), + MemType::Data => FunctionCode::data(self.state.sr), + }; + + self.state.request.access = access; + self.state.request.address = addr; + + if size == Size::Byte || addr & 0x1 == 0 { + Ok(addr) + } else { + Err(Error::processor(Exceptions::AddressError as u32)) + } + } + pub fn get_address_sized(&mut self, addr: Address, size: Size) -> Result { + self.start_request(addr as u32, size, MemAccess::Read, MemType::Data)?; match size { Size::Byte => self.port.read_u8(addr).map(|value| value as u32), Size::Word => self.port.read_beu16(addr).map(|value| value as u32), @@ -1059,6 +1082,7 @@ impl M68k { } pub fn set_address_sized(&mut self, addr: Address, value: u32, size: Size) -> Result<(), Error> { + self.start_request(addr as u32, size, MemAccess::Write, MemType::Data)?; match size { Size::Byte => self.port.write_u8(addr, value as u8), Size::Word => self.port.write_beu16(addr, value as u16), @@ -1066,6 +1090,36 @@ impl M68k { } } + fn push_word(&mut self, value: u16) -> Result<(), Error> { + *self.get_stack_pointer_mut() -= 2; + let addr = *self.get_stack_pointer_mut(); + self.start_request(addr, Size::Word, MemAccess::Write, MemType::Data)?; + self.port.write_beu16(addr as Address, value) + } + + fn pop_word(&mut self) -> Result { + let addr = *self.get_stack_pointer_mut(); + let value = self.port.read_beu16(addr as Address)?; + self.start_request(addr, Size::Word, MemAccess::Read, MemType::Data)?; + *self.get_stack_pointer_mut() += 2; + Ok(value) + } + + fn push_long(&mut self, value: u32) -> Result<(), Error> { + *self.get_stack_pointer_mut() -= 4; + let addr = *self.get_stack_pointer_mut(); + self.start_request(addr, Size::Long, MemAccess::Write, MemType::Data)?; + self.port.write_beu32(addr as Address, value) + } + + fn pop_long(&mut self) -> Result { + let addr = *self.get_stack_pointer_mut(); + let value = self.port.read_beu32(addr as Address)?; + self.start_request(addr, Size::Long, MemAccess::Read, MemType::Data)?; + *self.get_stack_pointer_mut() += 4; + Ok(value) + } + pub fn get_bit_field_args(&self, offset: RegOrImmediate, width: RegOrImmediate) -> (u32, u32) { let offset = self.get_reg_or_immediate(offset); let mut width = self.get_reg_or_immediate(width) % 32; @@ -1239,7 +1293,6 @@ impl M68k { } } - fn overflowing_add_sized(operand1: u32, operand2: u32, size: Size) -> (u32, bool) { match size { Size::Byte => { diff --git a/src/cpus/m68k/state.rs b/src/cpus/m68k/state.rs index 9973876..f3b9f5b 100644 --- a/src/cpus/m68k/state.rs +++ b/src/cpus/m68k/state.rs @@ -3,6 +3,7 @@ use crate::devices::Address; use crate::timers::CpuTimer; use crate::memory::BusPort; +use super::instructions::Size; use super::decode::M68kDecoder; use super::debugger::M68kDebugger; use super::timing::M68kInstructionTiming; @@ -49,6 +50,19 @@ pub enum Exceptions { LineFEmulator = 11, } +#[repr(u8)] +#[allow(dead_code)] +#[derive(Copy, Clone, Debug, PartialEq)] +pub enum FunctionCode { + Reserved0 = 0, + UserData = 1, + UserProgram = 2, + Reserved3 = 3, + Reserved4 = 4, + SupervisorData = 5, + SupervisorProgram = 6, + CpuSpace = 7, +} #[derive(Copy, Clone, Debug, PartialEq)] pub enum Status { @@ -70,24 +84,30 @@ pub enum InterruptPriority { Level7 = 7, } -impl InterruptPriority { - pub fn from_u8(priority: u8) -> InterruptPriority { - match priority { - 0 => InterruptPriority::NoInterrupt, - 1 => InterruptPriority::Level1, - 2 => InterruptPriority::Level2, - 3 => InterruptPriority::Level3, - 4 => InterruptPriority::Level4, - 5 => InterruptPriority::Level5, - 6 => InterruptPriority::Level6, - _ => InterruptPriority::Level7, - } - } +#[derive(Copy, Clone, Debug, PartialEq)] +pub enum MemType { + Program, + Data, +} + +#[derive(Copy, Clone, Debug, PartialEq)] +pub enum MemAccess { + Read, + Write, +} + +#[derive(Copy, Clone, Debug, PartialEq)] +pub struct MemoryRequest { + pub access: MemAccess, + pub code: FunctionCode, + pub size: Size, + pub address: u32, } #[derive(Clone, Debug, PartialEq)] pub struct M68kState { pub status: Status, + pub request: MemoryRequest, pub current_ipl: InterruptPriority, pub pending_ipl: InterruptPriority, @@ -101,10 +121,23 @@ pub struct M68kState { pub vbr: u32, } +#[derive(Clone)] +pub struct M68k { + pub cputype: M68kType, + pub frequency: u32, + pub state: M68kState, + pub decoder: M68kDecoder, + pub timing: M68kInstructionTiming, + pub debugger: M68kDebugger, + pub port: BusPort, + pub timer: CpuTimer, +} + impl M68kState { pub fn new() -> M68kState { M68kState { status: Status::Init, + request: MemoryRequest::new(), current_ipl: InterruptPriority::NoInterrupt, pending_ipl: InterruptPriority::NoInterrupt, @@ -120,18 +153,6 @@ impl M68kState { } } -#[derive(Clone)] -pub struct M68k { - pub cputype: M68kType, - pub frequency: u32, - pub state: M68kState, - pub decoder: M68kDecoder, - pub timing: M68kInstructionTiming, - pub debugger: M68kDebugger, - pub port: BusPort, - pub timer: CpuTimer, -} - impl M68k { pub fn new(cputype: M68kType, frequency: u32, port: BusPort) -> M68k { M68k { @@ -172,3 +193,62 @@ impl M68k { } } +impl InterruptPriority { + pub fn from_u8(priority: u8) -> InterruptPriority { + match priority { + 0 => InterruptPriority::NoInterrupt, + 1 => InterruptPriority::Level1, + 2 => InterruptPriority::Level2, + 3 => InterruptPriority::Level3, + 4 => InterruptPriority::Level4, + 5 => InterruptPriority::Level5, + 6 => InterruptPriority::Level6, + _ => InterruptPriority::Level7, + } + } +} + +impl FunctionCode { + pub fn program(sr: u16) -> Self { + if sr & Flags::Supervisor as u16 != 0 { + FunctionCode::SupervisorProgram + } else { + FunctionCode::UserProgram + } + } + + pub fn data(sr: u16) -> Self { + if sr & Flags::Supervisor as u16 != 0 { + FunctionCode::SupervisorData + } else { + FunctionCode::UserData + } + } +} + +impl MemoryRequest { + pub fn new() -> Self { + Self { + access: MemAccess::Read, + code: FunctionCode::Reserved0, + size: Size::Word, + address: 0, + } + } + + pub fn get_type_code(&self) -> u16 { + let ins = match self.code { + // TODO this is wrong (should be opposite results), but is a temporary hack + FunctionCode::SupervisorProgram | FunctionCode::UserProgram => 0x0008, + _ => 0x0000, + }; + + let rw = match self.access { + MemAccess::Write => 0x0000, + MemAccess::Read => 0x0010, + }; + + ins | rw | (self.code as u16) + } +} + diff --git a/tests/harte_tests/latest.txt b/tests/harte_tests/latest.txt index 0d551be..d6d0f6d 100644 --- a/tests/harte_tests/latest.txt +++ b/tests/harte_tests/latest.txt @@ -1,4 +1,4 @@ -Last run on 2022-09-10 at commit 27f71b0f3317b8d804e2750e8e37eeb57ee06274 +Last run on 2022-09-11 at commit 34bdd86772c55df6167a085b39554fe28cbe1cb5 ABCD.json completed: 301 passed, 7764 FAILED ADD.b.json completed, all passed! @@ -6,9 +6,9 @@ ADD.l.json completed: 5143 passed, 2922 FAILED ADD.w.json completed: 5117 passed, 2948 FAILED ADDA.l.json completed: 5372 passed, 2693 FAILED ADDA.w.json completed: 5431 passed, 2634 FAILED -ADDX.b.json completed: 4051 passed, 4014 FAILED -ADDX.l.json completed: 4065 passed, 4000 FAILED -ADDX.w.json completed: 4012 passed, 4053 FAILED +ADDX.b.json completed: 8044 passed, 21 FAILED +ADDX.l.json completed: 5472 passed, 2593 FAILED +ADDX.w.json completed: 5465 passed, 2600 FAILED AND.b.json completed, all passed! AND.l.json completed: 4745 passed, 3320 FAILED AND.w.json completed: 4668 passed, 3397 FAILED @@ -23,9 +23,9 @@ ASR.w.json completed: 5988 passed, 2077 FAILED BCHG.json completed, all passed! BCLR.json completed, all passed! BSET.json completed, all passed! -BSR.json completed: 4078 passed, 3987 FAILED +BSR.json completed, all passed! BTST.json completed: 8052 passed, 13 FAILED -Bcc.json completed: 5861 passed, 2204 FAILED +Bcc.json completed, all passed! CHK.json completed: 0 passed, 8065 FAILED CLR.b.json completed, all passed! CLR.l.json completed: 4903 passed, 3162 FAILED @@ -35,19 +35,19 @@ CMP.l.json completed: 5034 passed, 3031 FAILED CMP.w.json completed: 5024 passed, 3041 FAILED CMPA.l.json completed: 5450 passed, 2615 FAILED CMPA.w.json completed: 4200 passed, 3865 FAILED -DBcc.json completed: 5194 passed, 2871 FAILED +DBcc.json completed: 6101 passed, 1964 FAILED DIVS.json completed: 612 passed, 7453 FAILED DIVU.json completed: 1267 passed, 6798 FAILED EOR.b.json completed, all passed! EOR.l.json completed: 4904 passed, 3161 FAILED EOR.w.json completed: 4930 passed, 3135 FAILED EORItoCCR.json completed: 1067 passed, 6998 FAILED -EORItoSR.json completed: 141 passed, 7924 FAILED +EORItoSR.json completed, all passed! EXG.json completed, all passed! EXT.l.json completed, all passed! EXT.w.json completed, all passed! -JMP.json completed: 623 passed, 7442 FAILED -JSR.json completed: 200 passed, 7865 FAILED +JMP.json completed, all passed! +JSR.json completed, all passed! LEA.json completed, all passed! LINK.json completed: 7060 passed, 1005 FAILED LSL.b.json completed: 7774 passed, 291 FAILED @@ -57,9 +57,9 @@ LSR.b.json completed: 7797 passed, 268 FAILED LSR.l.json completed: 7044 passed, 1021 FAILED LSR.w.json completed: 6768 passed, 1297 FAILED MOVE.b.json completed, all passed! -MOVE.l.json completed: 3270 passed, 4795 FAILED +MOVE.l.json completed: 4198 passed, 3867 FAILED MOVE.q.json completed, all passed! -MOVE.w.json completed: 3368 passed, 4697 FAILED +MOVE.w.json completed: 4307 passed, 3758 FAILED MOVEA.l.json completed: 5379 passed, 2686 FAILED MOVEA.w.json completed: 5322 passed, 2743 FAILED MOVEM.l.json completed: 4099 passed, 3966 FAILED @@ -68,8 +68,8 @@ MOVEP.l.json completed: 4036 passed, 4029 FAILED MOVEP.w.json completed: 4046 passed, 4019 FAILED MOVEfromSR.json completed: 5017 passed, 3048 FAILED MOVEfromUSP.json completed, all passed! -MOVEtoCCR.json completed: 614 passed, 7451 FAILED -MOVEtoSR.json completed: 96 passed, 7969 FAILED +MOVEtoCCR.json completed: 4958 passed, 3107 FAILED +MOVEtoSR.json completed: 4938 passed, 3127 FAILED MOVEtoUSP.json completed, all passed! MULS.json completed: 2548 passed, 5517 FAILED MULU.json completed: 4992 passed, 3073 FAILED @@ -87,8 +87,8 @@ NOT.w.json completed: 4957 passed, 3108 FAILED OR.b.json completed, all passed! OR.l.json completed: 4730 passed, 3335 FAILED OR.w.json completed: 4650 passed, 3415 FAILED -ORItoCCR.json completed: 987 passed, 7078 FAILED -ORItoSR.json completed: 118 passed, 7947 FAILED +ORItoCCR.json completed, all passed! +ORItoSR.json completed, all passed! PEA.json completed, all passed! RESET.json completed: 0 passed, 8065 FAILED ROL.b.json completed, all passed! @@ -103,9 +103,9 @@ ROXL.w.json completed: 7114 passed, 951 FAILED ROXR.b.json completed: 8037 passed, 28 FAILED ROXR.l.json completed: 8022 passed, 43 FAILED ROXR.w.json completed: 7141 passed, 924 FAILED -RTE.json completed: 0 passed, 8065 FAILED +RTE.json completed: 2047 passed, 6018 FAILED RTR.json completed: 0 passed, 8065 FAILED -RTS.json completed: 11 passed, 8054 FAILED +RTS.json completed: 4008 passed, 4057 FAILED SBCD.json completed: 884 passed, 7181 FAILED SUB.b.json completed, all passed! SUB.l.json completed: 5093 passed, 2972 FAILED @@ -125,5 +125,5 @@ TST.l.json completed: 4963 passed, 3102 FAILED TST.w.json completed: 4928 passed, 3137 FAILED UNLINK.json completed, all passed! -passed: 653776, failed: 346284, total 65% -completed in 18m 5s +passed: 723080, failed: 276980, total 72% +completed in 13m 44s diff --git a/tests/harte_tests/previous.txt b/tests/harte_tests/previous.txt index 1d726fd..0d551be 100644 --- a/tests/harte_tests/previous.txt +++ b/tests/harte_tests/previous.txt @@ -1,129 +1,129 @@ -Last run on 2022-09-10 at commit 1a3d8cc0c575ff4f5fa7e9fe9d9cb381ff7fd04d +Last run on 2022-09-10 at commit 27f71b0f3317b8d804e2750e8e37eeb57ee06274 -ABCD.json completed: 261 passed, 7804 FAILED -ADD.b.json completed: 6520 passed, 1545 FAILED -ADD.l.json completed: 4583 passed, 3482 FAILED -ADD.w.json completed: 4579 passed, 3486 FAILED -ADDA.l.json completed: 4843 passed, 3222 FAILED -ADDA.w.json completed: 4916 passed, 3149 FAILED +ABCD.json completed: 301 passed, 7764 FAILED +ADD.b.json completed, all passed! +ADD.l.json completed: 5143 passed, 2922 FAILED +ADD.w.json completed: 5117 passed, 2948 FAILED +ADDA.l.json completed: 5372 passed, 2693 FAILED +ADDA.w.json completed: 5431 passed, 2634 FAILED ADDX.b.json completed: 4051 passed, 4014 FAILED ADDX.l.json completed: 4065 passed, 4000 FAILED ADDX.w.json completed: 4012 passed, 4053 FAILED -AND.b.json completed: 6532 passed, 1533 FAILED -AND.l.json completed: 4111 passed, 3954 FAILED -AND.w.json completed: 4080 passed, 3985 FAILED +AND.b.json completed, all passed! +AND.l.json completed: 4745 passed, 3320 FAILED +AND.w.json completed: 4668 passed, 3397 FAILED ANDItoCCR.json completed, all passed! ANDItoSR.json completed, all passed! ASL.b.json completed: 3941 passed, 4124 FAILED ASL.l.json completed: 3578 passed, 4487 FAILED -ASL.w.json completed: 3645 passed, 4420 FAILED +ASL.w.json completed: 3814 passed, 4251 FAILED ASR.b.json completed: 6316 passed, 1749 FAILED ASR.l.json completed: 7007 passed, 1058 FAILED -ASR.w.json completed: 5816 passed, 2249 FAILED -BCHG.json completed: 6570 passed, 1495 FAILED -BCLR.json completed: 6885 passed, 1180 FAILED -BSET.json completed: 6616 passed, 1449 FAILED +ASR.w.json completed: 5988 passed, 2077 FAILED +BCHG.json completed, all passed! +BCLR.json completed, all passed! +BSET.json completed, all passed! BSR.json completed: 4078 passed, 3987 FAILED -BTST.json completed: 6851 passed, 1214 FAILED +BTST.json completed: 8052 passed, 13 FAILED Bcc.json completed: 5861 passed, 2204 FAILED CHK.json completed: 0 passed, 8065 FAILED -CLR.b.json completed: 6594 passed, 1471 FAILED -CLR.l.json completed: 4301 passed, 3764 FAILED -CLR.w.json completed: 4327 passed, 3738 FAILED -CMP.b.json completed: 6627 passed, 1438 FAILED -CMP.l.json completed: 4634 passed, 3431 FAILED -CMP.w.json completed: 4597 passed, 3468 FAILED -CMPA.l.json completed: 4998 passed, 3067 FAILED -CMPA.w.json completed: 3895 passed, 4170 FAILED +CLR.b.json completed, all passed! +CLR.l.json completed: 4903 passed, 3162 FAILED +CLR.w.json completed: 4896 passed, 3169 FAILED +CMP.b.json completed, all passed! +CMP.l.json completed: 5034 passed, 3031 FAILED +CMP.w.json completed: 5024 passed, 3041 FAILED +CMPA.l.json completed: 5450 passed, 2615 FAILED +CMPA.w.json completed: 4200 passed, 3865 FAILED DBcc.json completed: 5194 passed, 2871 FAILED -DIVS.json completed: 539 passed, 7526 FAILED -DIVU.json completed: 1093 passed, 6972 FAILED -EOR.b.json completed: 6699 passed, 1366 FAILED -EOR.l.json completed: 4340 passed, 3725 FAILED -EOR.w.json completed: 4399 passed, 3666 FAILED +DIVS.json completed: 612 passed, 7453 FAILED +DIVU.json completed: 1267 passed, 6798 FAILED +EOR.b.json completed, all passed! +EOR.l.json completed: 4904 passed, 3161 FAILED +EOR.w.json completed: 4930 passed, 3135 FAILED EORItoCCR.json completed: 1067 passed, 6998 FAILED EORItoSR.json completed: 141 passed, 7924 FAILED EXG.json completed, all passed! EXT.l.json completed, all passed! EXT.w.json completed, all passed! -JMP.json completed: 533 passed, 7532 FAILED -JSR.json completed: 152 passed, 7913 FAILED -LEA.json completed: 5726 passed, 2339 FAILED +JMP.json completed: 623 passed, 7442 FAILED +JSR.json completed: 200 passed, 7865 FAILED +LEA.json completed, all passed! LINK.json completed: 7060 passed, 1005 FAILED LSL.b.json completed: 7774 passed, 291 FAILED LSL.l.json completed: 7017 passed, 1048 FAILED -LSL.w.json completed: 6545 passed, 1520 FAILED +LSL.w.json completed: 6727 passed, 1338 FAILED LSR.b.json completed: 7797 passed, 268 FAILED LSR.l.json completed: 7044 passed, 1021 FAILED -LSR.w.json completed: 6609 passed, 1456 FAILED -MOVE.b.json completed: 5383 passed, 2682 FAILED -MOVE.l.json completed: 2626 passed, 5439 FAILED +LSR.w.json completed: 6768 passed, 1297 FAILED +MOVE.b.json completed, all passed! +MOVE.l.json completed: 3270 passed, 4795 FAILED MOVE.q.json completed, all passed! -MOVE.w.json completed: 2709 passed, 5356 FAILED -MOVEA.l.json completed: 4827 passed, 3238 FAILED -MOVEA.w.json completed: 4813 passed, 3252 FAILED -MOVEM.l.json completed: 3286 passed, 4779 FAILED -MOVEM.w.json completed: 3324 passed, 4741 FAILED +MOVE.w.json completed: 3368 passed, 4697 FAILED +MOVEA.l.json completed: 5379 passed, 2686 FAILED +MOVEA.w.json completed: 5322 passed, 2743 FAILED +MOVEM.l.json completed: 4099 passed, 3966 FAILED +MOVEM.w.json completed: 4169 passed, 3896 FAILED MOVEP.l.json completed: 4036 passed, 4029 FAILED MOVEP.w.json completed: 4046 passed, 4019 FAILED -MOVEfromSR.json completed: 4456 passed, 3609 FAILED +MOVEfromSR.json completed: 5017 passed, 3048 FAILED MOVEfromUSP.json completed, all passed! -MOVEtoCCR.json completed: 541 passed, 7524 FAILED -MOVEtoSR.json completed: 90 passed, 7975 FAILED +MOVEtoCCR.json completed: 614 passed, 7451 FAILED +MOVEtoSR.json completed: 96 passed, 7969 FAILED MOVEtoUSP.json completed, all passed! -MULS.json completed: 2241 passed, 5824 FAILED -MULU.json completed: 4388 passed, 3677 FAILED +MULS.json completed: 2548 passed, 5517 FAILED +MULU.json completed: 4992 passed, 3073 FAILED NBCD.json completed: 0 passed, 8065 FAILED -NEG.b.json completed: 6611 passed, 1454 FAILED -NEG.l.json completed: 4461 passed, 3604 FAILED -NEG.w.json completed: 4352 passed, 3713 FAILED +NEG.b.json completed, all passed! +NEG.l.json completed: 5031 passed, 3034 FAILED +NEG.w.json completed: 4911 passed, 3154 FAILED NEGX.b.json completed: 0 passed, 8065 FAILED NEGX.l.json completed: 0 passed, 8065 FAILED NEGX.w.json completed: 0 passed, 8065 FAILED NOP.json completed, all passed! -NOT.b.json completed: 6636 passed, 1429 FAILED -NOT.l.json completed: 4372 passed, 3693 FAILED -NOT.w.json completed: 4378 passed, 3687 FAILED -OR.b.json completed: 6501 passed, 1564 FAILED -OR.l.json completed: 4085 passed, 3980 FAILED -OR.w.json completed: 4039 passed, 4026 FAILED +NOT.b.json completed, all passed! +NOT.l.json completed: 4924 passed, 3141 FAILED +NOT.w.json completed: 4957 passed, 3108 FAILED +OR.b.json completed, all passed! +OR.l.json completed: 4730 passed, 3335 FAILED +OR.w.json completed: 4650 passed, 3415 FAILED ORItoCCR.json completed: 987 passed, 7078 FAILED ORItoSR.json completed: 118 passed, 7947 FAILED -PEA.json completed: 5798 passed, 2267 FAILED +PEA.json completed, all passed! RESET.json completed: 0 passed, 8065 FAILED ROL.b.json completed, all passed! ROL.l.json completed, all passed! -ROL.w.json completed: 6961 passed, 1104 FAILED +ROL.w.json completed: 7135 passed, 930 FAILED ROR.b.json completed, all passed! ROR.l.json completed, all passed! -ROR.w.json completed: 6970 passed, 1095 FAILED +ROR.w.json completed: 7141 passed, 924 FAILED ROXL.b.json completed: 8039 passed, 26 FAILED ROXL.l.json completed: 8029 passed, 36 FAILED -ROXL.w.json completed: 6941 passed, 1124 FAILED +ROXL.w.json completed: 7114 passed, 951 FAILED ROXR.b.json completed: 8037 passed, 28 FAILED ROXR.l.json completed: 8022 passed, 43 FAILED -ROXR.w.json completed: 6985 passed, 1080 FAILED +ROXR.w.json completed: 7141 passed, 924 FAILED RTE.json completed: 0 passed, 8065 FAILED RTR.json completed: 0 passed, 8065 FAILED RTS.json completed: 11 passed, 8054 FAILED -SBCD.json completed: 776 passed, 7289 FAILED -SUB.b.json completed: 6567 passed, 1498 FAILED -SUB.l.json completed: 4537 passed, 3528 FAILED -SUB.w.json completed: 4567 passed, 3498 FAILED -SUBA.l.json completed: 4787 passed, 3278 FAILED -SUBA.w.json completed: 4842 passed, 3223 FAILED +SBCD.json completed: 884 passed, 7181 FAILED +SUB.b.json completed, all passed! +SUB.l.json completed: 5093 passed, 2972 FAILED +SUB.w.json completed: 5121 passed, 2944 FAILED +SUBA.l.json completed: 5329 passed, 2736 FAILED +SUBA.w.json completed: 5386 passed, 2679 FAILED SUBX.b.json completed: 3861 passed, 4204 FAILED SUBX.l.json completed: 3955 passed, 4110 FAILED SUBX.w.json completed: 3876 passed, 4189 FAILED -SWAP.json completed: 509 passed, 7556 FAILED -Scc.json completed: 6637 passed, 1428 FAILED -TAS.json completed: 6655 passed, 1410 FAILED +SWAP.json completed, all passed! +Scc.json completed, all passed! +TAS.json completed, all passed! TRAP.json completed, all passed! TRAPV.json completed, all passed! -TST.b.json completed: 6566 passed, 1499 FAILED -TST.l.json completed: 4381 passed, 3684 FAILED -TST.w.json completed: 4362 passed, 3703 FAILED +TST.b.json completed, all passed! +TST.l.json completed: 4963 passed, 3102 FAILED +TST.w.json completed: 4928 passed, 3137 FAILED UNLINK.json completed, all passed! -passed: 594436, failed: 405624, total 59% -completed in 16m 7s +passed: 653776, failed: 346284, total 65% +completed in 18m 5s