diff --git a/InstructionSets/68k/Decoder.cpp b/InstructionSets/68k/Decoder.cpp index 9db1367c8..a0a8c72f8 100644 --- a/InstructionSets/68k/Decoder.cpp +++ b/InstructionSets/68k/Decoder.cpp @@ -92,8 +92,26 @@ constexpr Operation Predecoder::operation(OpT op) { } template -template Preinstruction Predecoder::validated(Preinstruction original) { - return original; +template Preinstruction Predecoder::validated(Preinstruction original) { + if constexpr (!validate) { + return original; + } + + switch(op) { + default: return original; + + // NBCD: don't permit address registers + case OpT(Operation::NBCD): + switch(original.mode<0>()) { + default: return original; + + case AddressingMode::AddressRegisterDirect: + case AddressingMode::ProgramCounterIndirectWithDisplacement: + case AddressingMode::ProgramCounterIndirectWithIndex8bitDisplacement: + case AddressingMode::ImmediateData: + return Preinstruction(); + } + } } /// Decodes the fields within an instruction and constructs a `Preinstruction`, given that the operation has already been diff --git a/OSBindings/Mac/Clock SignalTests/m68kDecoderTests.mm b/OSBindings/Mac/Clock SignalTests/m68kDecoderTests.mm index 9df10b9c4..85a287482 100644 --- a/OSBindings/Mac/Clock SignalTests/m68kDecoderTests.mm +++ b/OSBindings/Mac/Clock SignalTests/m68kDecoderTests.mm @@ -86,7 +86,7 @@ template NSString *operand(Preinstruction instruction) { case Operation::ABCD: instruction = @"ABCD"; break; case Operation::SBCD: instruction = @"SBCD"; break; case Operation::NBCD: instruction = @"NBCD"; break; - case Operation::ADDb: instruction = @"ADD.b"; break; +// case Operation::ADDb: instruction = @"ADD.b"; break; // For now, skip any unmapped operations. default: continue;