mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-25 18:30:21 +00:00
Implements EXT.
This commit is contained in:
parent
7df85ea695
commit
dab9bb6575
@ -519,6 +519,31 @@ template <class T, bool dtack_is_implicit, bool signal_will_perform> void Proces
|
|||||||
set_ccr(active_program_->source->full);
|
set_ccr(active_program_->source->full);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Operation::EXTbtow:
|
||||||
|
active_program_->destination->halves.low.halves.high =
|
||||||
|
(active_program_->destination->halves.low.halves.low & 0x80) ? 0xff : 0x00;
|
||||||
|
overflow_flag_ = carry_flag_ = 0;
|
||||||
|
zero_result_ = active_program_->destination->halves.low.halves.high;
|
||||||
|
negative_flag_ = zero_result_ & 0x8000;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Operation::EXTbtol:
|
||||||
|
active_program_->destination->full =
|
||||||
|
active_program_->destination->halves.low.halves.low |
|
||||||
|
((active_program_->destination->halves.low.halves.low & 0x80) ? 0xffffff00 : 0x00000000);
|
||||||
|
overflow_flag_ = carry_flag_ = 0;
|
||||||
|
zero_result_ = active_program_->destination->full;
|
||||||
|
negative_flag_ = zero_result_ & 0x80000000;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Operation::EXTwtol:
|
||||||
|
active_program_->destination->halves.high.full =
|
||||||
|
(active_program_->destination->halves.low.full & 0x8000) ? 0xffff : 0x0000;
|
||||||
|
overflow_flag_ = carry_flag_ = 0;
|
||||||
|
zero_result_ = active_program_->destination->full;
|
||||||
|
negative_flag_ = zero_result_ & 0x80000000;
|
||||||
|
break;
|
||||||
|
|
||||||
#define and_op(a, b) a &= b
|
#define and_op(a, b) a &= b
|
||||||
#define or_op(a, b) a |= b
|
#define or_op(a, b) a |= b
|
||||||
#define eor_op(a, b) a ^= b
|
#define eor_op(a, b) a ^= b
|
||||||
|
@ -449,7 +449,7 @@ struct ProcessorStorageConstructor {
|
|||||||
NOP, // Maps to a NOP.
|
NOP, // Maps to a NOP.
|
||||||
|
|
||||||
EXG, // Maps source and destination registers and an operation mode to an EXG.
|
EXG, // Maps source and destination registers and an operation mode to an EXG.
|
||||||
SWAP, // Maps a source register to a SWAP.
|
EXT_SWAP, // Maps a source register to a SWAP or EXT.
|
||||||
|
|
||||||
EORI_ORI_ANDI_SR, // Maps to an EORI, ORI or ANDI to SR/CCR.
|
EORI_ORI_ANDI_SR, // Maps to an EORI, ORI or ANDI to SR/CCR.
|
||||||
|
|
||||||
@ -656,7 +656,7 @@ struct ProcessorStorageConstructor {
|
|||||||
{0xf1f8, 0xc148, Operation::EXG, Decoder::EXG}, // 4-105 (p209)
|
{0xf1f8, 0xc148, Operation::EXG, Decoder::EXG}, // 4-105 (p209)
|
||||||
{0xf1f8, 0xc188, Operation::EXG, Decoder::EXG}, // 4-105 (p209)
|
{0xf1f8, 0xc188, Operation::EXG, Decoder::EXG}, // 4-105 (p209)
|
||||||
|
|
||||||
{0xfff8, 0x4840, Operation::SWAP, Decoder::SWAP}, // 4-185 (p289)
|
{0xfff8, 0x4840, Operation::SWAP, Decoder::EXT_SWAP}, // 4-185 (p289)
|
||||||
|
|
||||||
{0xffff, 0x027c, Operation::ANDItoSR, Decoder::EORI_ORI_ANDI_SR},
|
{0xffff, 0x027c, Operation::ANDItoSR, Decoder::EORI_ORI_ANDI_SR},
|
||||||
{0xffff, 0x023c, Operation::ANDItoCCR, Decoder::EORI_ORI_ANDI_SR},
|
{0xffff, 0x023c, Operation::ANDItoCCR, Decoder::EORI_ORI_ANDI_SR},
|
||||||
@ -671,6 +671,10 @@ struct ProcessorStorageConstructor {
|
|||||||
{0xffc0, 0x08c0, Operation::BSETb, Decoder::BCHG_BSET}, // 4-58 (p162)
|
{0xffc0, 0x08c0, Operation::BSETb, Decoder::BCHG_BSET}, // 4-58 (p162)
|
||||||
|
|
||||||
{0xffc0, 0x4ac0, Operation::TAS, Decoder::TAS}, // 4-186 (p290)
|
{0xffc0, 0x4ac0, Operation::TAS, Decoder::TAS}, // 4-186 (p290)
|
||||||
|
|
||||||
|
{0xfff8, 0x4880, Operation::EXTbtow, Decoder::EXT_SWAP}, // 4-106 (p210)
|
||||||
|
{0xfff8, 0x48c0, Operation::EXTwtol, Decoder::EXT_SWAP}, // 4-106 (p210)
|
||||||
|
{0xfff8, 0x49c0, Operation::EXTbtol, Decoder::EXT_SWAP}, // 4-106 (p210)
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<size_t> micro_op_pointers(65536, std::numeric_limits<size_t>::max());
|
std::vector<size_t> micro_op_pointers(65536, std::numeric_limits<size_t>::max());
|
||||||
@ -812,7 +816,7 @@ struct ProcessorStorageConstructor {
|
|||||||
op(Action::PerformOperation, seq("np np"));
|
op(Action::PerformOperation, seq("np np"));
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case Decoder::SWAP: {
|
case Decoder::EXT_SWAP: {
|
||||||
storage_.instructions[instruction].set_destination(storage_, Dn, ea_register);
|
storage_.instructions[instruction].set_destination(storage_, Dn, ea_register);
|
||||||
op(Action::PerformOperation, seq("np"));
|
op(Action::PerformOperation, seq("np"));
|
||||||
} break;
|
} break;
|
||||||
|
@ -109,6 +109,8 @@ class ProcessorStorage {
|
|||||||
BSETl, BSETb,
|
BSETl, BSETb,
|
||||||
|
|
||||||
TAS,
|
TAS,
|
||||||
|
|
||||||
|
EXTbtow, EXTbtol, EXTwtol,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
Loading…
Reference in New Issue
Block a user