From 084d6ca11dee23dce8442b866d58d867c626ee32 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Thu, 19 May 2022 12:18:47 -0400 Subject: [PATCH] Simplify address handling; add perform patterns for CMP, AND, OR, EOR. --- .../Implementation/68000Mk2Implementation.hpp | 122 +++++++++++++----- 1 file changed, 90 insertions(+), 32 deletions(-) diff --git a/Processors/68000Mk2/Implementation/68000Mk2Implementation.hpp b/Processors/68000Mk2/Implementation/68000Mk2Implementation.hpp index b3ce31921..d646ff4ac 100644 --- a/Processors/68000Mk2/Implementation/68000Mk2Implementation.hpp +++ b/Processors/68000Mk2/Implementation/68000Mk2Implementation.hpp @@ -61,6 +61,7 @@ enum ExecutionState: int { Perform_np, Perform_np_n, + Perform_np_nn, // MOVE has unique bus usage, so has specialised states. @@ -165,12 +166,15 @@ void Processor(); - -#define FetchOperands(x) \ - if constexpr (InstructionSet::M68k::operand_size() == InstructionSet::M68k::DataSize::LongWord) { \ - SetupDataAccess(temporary_address_, Microcycle::Read, Microcycle::SelectWord); \ - MoveToState(FetchOperand_l); \ - } else { \ - if constexpr (InstructionSet::M68k::operand_size() == InstructionSet::M68k::DataSize::Byte) { \ - SetupDataAccess(temporary_address_, Microcycle::Read, Microcycle::SelectByte); \ +#define CASE(x, y) \ + case InstructionSet::M68k::Operation::x: \ + operand_flags_ = InstructionSet::M68k::operand_flags(); \ + y; \ + \ + if constexpr (InstructionSet::M68k::operand_size() == InstructionSet::M68k::DataSize::LongWord) { \ + SetupDataAccess(Microcycle::Read, Microcycle::SelectWord); \ + MoveToState(FetchOperand_l); \ } else { \ - SetupDataAccess(temporary_address_, Microcycle::Read, Microcycle::SelectWord); \ - } \ - MoveToState(FetchOperand_bw); \ - } + if constexpr (InstructionSet::M68k::operand_size() == InstructionSet::M68k::DataSize::Byte) { \ + SetupDataAccess(Microcycle::Read, Microcycle::SelectByte); \ + } else { \ + SetupDataAccess(Microcycle::Read, Microcycle::SelectWord); \ + } \ + MoveToState(FetchOperand_bw); \ + } switch(instruction_.operation) { - CASE(NBCD) + CASE(NBCD, { if(instruction_.mode(0) == Mode::DataRegisterDirect) { perform_state_ = Perform_np_n; } else { perform_state_ = Perform_np; } - FetchOperands(NBCD) + }) - CASE(SWAP) - perform_state_ = Perform_np; - FetchOperands(SWAP) + CASE(SWAP, perform_state_ = Perform_np); - CASE(MOVEw) - perform_state_ = MOVEw; - FetchOperands(MOVEw) + CASE(MOVEw, perform_state_ = MOVEw); + + CASE(CMPb, perform_state_ = Perform_np); + CASE(CMPw, perform_state_ = Perform_np); + CASE(CMPl, perform_state_ = Perform_np_n); + + CASE(ANDb, perform_state_ = Perform_np); + CASE(ANDw, perform_state_ = Perform_np); + CASE(ANDl, { + if(instruction_.mode(1) == Mode::DataRegisterDirect) { + switch(instruction_.mode(0)) { + default: + perform_state_ = Perform_np_n; + break; + case Mode::DataRegisterDirect: + case Mode::ImmediateData: + perform_state_ = Perform_np_nn; + break; + } + } else { + perform_state_ = Perform_np; + } + }); + + CASE(ORb, perform_state_ = Perform_np); + CASE(ORw, perform_state_ = Perform_np); + CASE(ORl, { + if(instruction_.mode(1) == Mode::DataRegisterDirect) { + switch(instruction_.mode(0)) { + default: + perform_state_ = Perform_np_n; + break; + case Mode::DataRegisterDirect: + case Mode::ImmediateData: + perform_state_ = Perform_np_nn; + break; + } + } else { + perform_state_ = Perform_np; + } + }); + + CASE(EORb, perform_state_ = Perform_np); + CASE(EORw, perform_state_ = Perform_np); + CASE(EORl, { + if(instruction_.mode(1) == Mode::DataRegisterDirect) { + perform_state_ = Perform_np_nn; + } else { + perform_state_ = Perform_np; + } + }) default: assert(false); @@ -403,19 +454,18 @@ void Processor( + instruction_, operand_[0], operand_[1], status_, *static_cast(this)); + Prefetch(); // np + IdleBus(2); // nn + MoveToWritePhase(); + #undef MoveToWritePhase