mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-18 16:30:29 +00:00
Proceed to unimplemented TST.
This commit is contained in:
parent
d478a1b448
commit
9c266d4316
@ -53,6 +53,7 @@ template <Model model, typename BusHandler> class Executor {
|
|||||||
template <typename IntT> void movep(Preinstruction instruction, uint32_t source, uint32_t dest);
|
template <typename IntT> void movep(Preinstruction instruction, uint32_t source, uint32_t dest);
|
||||||
template <typename IntT> void movem_toM(Preinstruction instruction, uint32_t source, uint32_t dest);
|
template <typename IntT> void movem_toM(Preinstruction instruction, uint32_t source, uint32_t dest);
|
||||||
template <typename IntT> void movem_toR(Preinstruction instruction, uint32_t source, uint32_t dest);
|
template <typename IntT> void movem_toR(Preinstruction instruction, uint32_t source, uint32_t dest);
|
||||||
|
void pea(uint32_t address);
|
||||||
|
|
||||||
// TODO: ownership of this shouldn't be here.
|
// TODO: ownership of this shouldn't be here.
|
||||||
struct Registers {
|
struct Registers {
|
||||||
|
@ -395,6 +395,12 @@ void Executor<model, BusHandler>::unlink(uint32_t &address) {
|
|||||||
sp().l += 4;
|
sp().l += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <Model model, typename BusHandler>
|
||||||
|
void Executor<model, BusHandler>::pea(uint32_t address) {
|
||||||
|
sp().l -= 4;
|
||||||
|
bus_handler_.template write<uint32_t>(sp().l, address);
|
||||||
|
}
|
||||||
|
|
||||||
template <Model model, typename BusHandler>
|
template <Model model, typename BusHandler>
|
||||||
template <typename IntT>
|
template <typename IntT>
|
||||||
void Executor<model, BusHandler>::movep(Preinstruction instruction, uint32_t source, uint32_t dest) {
|
void Executor<model, BusHandler>::movep(Preinstruction instruction, uint32_t source, uint32_t dest) {
|
||||||
|
@ -314,17 +314,17 @@ template <
|
|||||||
negative, overflow and carry.
|
negative, overflow and carry.
|
||||||
*/
|
*/
|
||||||
case Operation::CLRb:
|
case Operation::CLRb:
|
||||||
dest.b = 0;
|
src.b = 0;
|
||||||
status.negative_flag_ = status.overflow_flag_ = status.carry_flag_ = status.zero_result_ = 0;
|
status.negative_flag_ = status.overflow_flag_ = status.carry_flag_ = status.zero_result_ = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Operation::CLRw:
|
case Operation::CLRw:
|
||||||
dest.w = 0;
|
src.w = 0;
|
||||||
status.negative_flag_ = status.overflow_flag_ = status.carry_flag_ = status.zero_result_ = 0;
|
status.negative_flag_ = status.overflow_flag_ = status.carry_flag_ = status.zero_result_ = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Operation::CLRl:
|
case Operation::CLRl:
|
||||||
dest.l = 0;
|
src.l = 0;
|
||||||
status.negative_flag_ = status.overflow_flag_ = status.carry_flag_ = status.zero_result_ = 0;
|
status.negative_flag_ = status.overflow_flag_ = status.carry_flag_ = status.zero_result_ = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -440,7 +440,7 @@ template <
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case Operation::MOVEfromSR:
|
case Operation::MOVEfromSR:
|
||||||
dest.w = status.status();
|
src.w = status.status();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Operation::MOVEtoCCR:
|
case Operation::MOVEtoCCR:
|
||||||
@ -697,9 +697,9 @@ template <
|
|||||||
*/
|
*/
|
||||||
case Operation::NEGb: {
|
case Operation::NEGb: {
|
||||||
const int destination = 0;
|
const int destination = 0;
|
||||||
const int source = dest.b;
|
const int source = src.b;
|
||||||
const auto result = destination - source;
|
const auto result = destination - source;
|
||||||
dest.b = uint8_t(result);
|
src.b = uint8_t(result);
|
||||||
|
|
||||||
status.zero_result_ = result & 0xff;
|
status.zero_result_ = result & 0xff;
|
||||||
status.extend_flag_ = status.carry_flag_ = decltype(status.carry_flag_)(result & ~0xff);
|
status.extend_flag_ = status.carry_flag_ = decltype(status.carry_flag_)(result & ~0xff);
|
||||||
@ -709,9 +709,9 @@ template <
|
|||||||
|
|
||||||
case Operation::NEGw: {
|
case Operation::NEGw: {
|
||||||
const int destination = 0;
|
const int destination = 0;
|
||||||
const int source = dest.w;
|
const int source = src.w;
|
||||||
const auto result = destination - source;
|
const auto result = destination - source;
|
||||||
dest.w = uint16_t(result);
|
src.w = uint16_t(result);
|
||||||
|
|
||||||
status.zero_result_ = result & 0xffff;
|
status.zero_result_ = result & 0xffff;
|
||||||
status.extend_flag_ = status.carry_flag_ = decltype(status.carry_flag_)(result & ~0xffff);
|
status.extend_flag_ = status.carry_flag_ = decltype(status.carry_flag_)(result & ~0xffff);
|
||||||
@ -721,9 +721,9 @@ template <
|
|||||||
|
|
||||||
case Operation::NEGl: {
|
case Operation::NEGl: {
|
||||||
const uint64_t destination = 0;
|
const uint64_t destination = 0;
|
||||||
const uint64_t source = dest.l;
|
const uint64_t source = src.l;
|
||||||
const auto result = destination - source;
|
const auto result = destination - source;
|
||||||
dest.l = uint32_t(result);
|
src.l = uint32_t(result);
|
||||||
|
|
||||||
status.zero_result_ = uint_fast32_t(result);
|
status.zero_result_ = uint_fast32_t(result);
|
||||||
status.extend_flag_ = status.carry_flag_ = result >> 32;
|
status.extend_flag_ = status.carry_flag_ = result >> 32;
|
||||||
@ -735,10 +735,10 @@ template <
|
|||||||
NEGXs: NEG, with extend.
|
NEGXs: NEG, with extend.
|
||||||
*/
|
*/
|
||||||
case Operation::NEGXb: {
|
case Operation::NEGXb: {
|
||||||
const int source = dest.b;
|
const int source = src.b;
|
||||||
const int destination = 0;
|
const int destination = 0;
|
||||||
const auto result = destination - source - (status.extend_flag_ ? 1 : 0);
|
const auto result = destination - source - (status.extend_flag_ ? 1 : 0);
|
||||||
dest.b = uint8_t(result);
|
src.b = uint8_t(result);
|
||||||
|
|
||||||
status.zero_result_ |= result & 0xff;
|
status.zero_result_ |= result & 0xff;
|
||||||
status.extend_flag_ = status.carry_flag_ = decltype(status.carry_flag_)(result & ~0xff);
|
status.extend_flag_ = status.carry_flag_ = decltype(status.carry_flag_)(result & ~0xff);
|
||||||
@ -747,10 +747,10 @@ template <
|
|||||||
} break;
|
} break;
|
||||||
|
|
||||||
case Operation::NEGXw: {
|
case Operation::NEGXw: {
|
||||||
const int source = dest.w;
|
const int source = src.w;
|
||||||
const int destination = 0;
|
const int destination = 0;
|
||||||
const auto result = destination - source - (status.extend_flag_ ? 1 : 0);
|
const auto result = destination - source - (status.extend_flag_ ? 1 : 0);
|
||||||
dest.w = uint16_t(result);
|
src.w = uint16_t(result);
|
||||||
|
|
||||||
status.zero_result_ |= result & 0xffff;
|
status.zero_result_ |= result & 0xffff;
|
||||||
status.extend_flag_ = status.carry_flag_ = decltype(status.carry_flag_)(result & ~0xffff);
|
status.extend_flag_ = status.carry_flag_ = decltype(status.carry_flag_)(result & ~0xffff);
|
||||||
@ -759,10 +759,10 @@ template <
|
|||||||
} break;
|
} break;
|
||||||
|
|
||||||
case Operation::NEGXl: {
|
case Operation::NEGXl: {
|
||||||
const uint64_t source = dest.l;
|
const uint64_t source = src.l;
|
||||||
const uint64_t destination = 0;
|
const uint64_t destination = 0;
|
||||||
const auto result = destination - source - (status.extend_flag_ ? 1 : 0);
|
const auto result = destination - source - (status.extend_flag_ ? 1 : 0);
|
||||||
dest.l = uint32_t(result);
|
src.l = uint32_t(result);
|
||||||
|
|
||||||
status.zero_result_ |= uint_fast32_t(result);
|
status.zero_result_ |= uint_fast32_t(result);
|
||||||
status.extend_flag_ = status.carry_flag_ = result >> 32;
|
status.extend_flag_ = status.carry_flag_ = result >> 32;
|
||||||
@ -838,22 +838,22 @@ template <
|
|||||||
|
|
||||||
// NOTs: take the logical inverse, affecting the negative and zero flags.
|
// NOTs: take the logical inverse, affecting the negative and zero flags.
|
||||||
case Operation::NOTb:
|
case Operation::NOTb:
|
||||||
dest.b ^= 0xff;
|
src.b ^= 0xff;
|
||||||
status.zero_result_ = dest.b;
|
status.zero_result_ = src.b;
|
||||||
status.negative_flag_ = status.zero_result_ & 0x80;
|
status.negative_flag_ = status.zero_result_ & 0x80;
|
||||||
status.overflow_flag_ = status.carry_flag_ = 0;
|
status.overflow_flag_ = status.carry_flag_ = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Operation::NOTw:
|
case Operation::NOTw:
|
||||||
dest.w ^= 0xffff;
|
src.w ^= 0xffff;
|
||||||
status.zero_result_ = dest.w;
|
status.zero_result_ = src.w;
|
||||||
status.negative_flag_ = status.zero_result_ & 0x8000;
|
status.negative_flag_ = status.zero_result_ & 0x8000;
|
||||||
status.overflow_flag_ = status.carry_flag_ = 0;
|
status.overflow_flag_ = status.carry_flag_ = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Operation::NOTl:
|
case Operation::NOTl:
|
||||||
dest.l ^= 0xffffffff;
|
src.l ^= 0xffffffff;
|
||||||
status.zero_result_ = dest.l;
|
status.zero_result_ = src.l;
|
||||||
status.negative_flag_ = status.zero_result_ & 0x80000000;
|
status.negative_flag_ = status.zero_result_ & 0x80000000;
|
||||||
status.overflow_flag_ = status.carry_flag_ = 0;
|
status.overflow_flag_ = status.carry_flag_ = 0;
|
||||||
break;
|
break;
|
||||||
@ -1200,6 +1200,10 @@ template <
|
|||||||
flow_controller.template movem_toM<uint16_t>(instruction, src.l, dest.l);
|
flow_controller.template movem_toM<uint16_t>(instruction, src.l, dest.l);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Operation::PEA:
|
||||||
|
flow_controller.pea(src.l);
|
||||||
|
break;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
RTE and RTR share an implementation.
|
RTE and RTR share an implementation.
|
||||||
*/
|
*/
|
||||||
|
@ -47,6 +47,8 @@
|
|||||||
// movep
|
// movep
|
||||||
// moveq
|
// moveq
|
||||||
// mulu_muls
|
// mulu_muls
|
||||||
|
// neg_not
|
||||||
|
// negx_clr
|
||||||
|
|
||||||
// Issues to fix:
|
// Issues to fix:
|
||||||
//
|
//
|
||||||
@ -68,6 +70,7 @@
|
|||||||
// eor_and_or (which invokes BCD)
|
// eor_and_or (which invokes BCD)
|
||||||
// exg (also BCD)
|
// exg (also BCD)
|
||||||
// chk
|
// chk
|
||||||
|
// nbcd_pea (BCD)
|
||||||
//
|
//
|
||||||
// And because possibly my old CHK is pushing the wrong program counter?
|
// And because possibly my old CHK is pushing the wrong program counter?
|
||||||
//
|
//
|
||||||
@ -75,8 +78,8 @@
|
|||||||
|
|
||||||
- (void)setUp {
|
- (void)setUp {
|
||||||
// To limit tests run to a subset of files and/or of tests, uncomment and fill in below.
|
// To limit tests run to a subset of files and/or of tests, uncomment and fill in below.
|
||||||
_fileSet = [NSSet setWithArray:@[@"nbcd_pea.json"]];
|
_fileSet = [NSSet setWithArray:@[@"swap.json", @"tst.json"]];
|
||||||
// _testSet = [NSSet setWithArray:@[@"MOVEM 0098 (0)"]];
|
// _testSet = [NSSet setWithArray:@[@"NEGX 00c0"]];
|
||||||
// _fileSet = [NSSet setWithArray:@[@"jmp_jsr.json"]];
|
// _fileSet = [NSSet setWithArray:@[@"jmp_jsr.json"]];
|
||||||
// _testSet = [NSSet setWithArray:@[@"CHK 41a8"]];
|
// _testSet = [NSSet setWithArray:@[@"CHK 41a8"]];
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user