Added proper AddressError handling to m68k

Also a few fixes, such as correcting a decode error in ADDX
This commit is contained in:
transistor 2022-09-11 17:42:54 -07:00
parent 34bdd86772
commit 03f4e11e3b
5 changed files with 294 additions and 158 deletions

View File

@ -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<Instruction, Error> {
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<u16, Error> {
let word = device.read_beu16(self.end as Address)?;
fn read_instruction_word(&mut self, memory: &mut dyn Addressable) -> Result<u16, Error> {
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<u32, Error> {
let word = device.read_beu32(self.end as Address)?;
fn read_instruction_long(&mut self, memory: &mut dyn Addressable) -> Result<u32, Error> {
let word = memory.read_beu32(self.end as Address)?;
self.end += 4;
Ok(word)
}

View File

@ -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<u16, Error> {
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<u32, Error> {
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<u32, Error> {
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<u32, Error> {
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<u32, Error> {
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<u16, Error> {
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<u32, Error> {
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 => {

View File

@ -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)
}
}

View File

@ -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

View File

@ -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