mirror of
https://github.com/TomHarte/CLK.git
synced 2024-09-29 16:55:59 +00:00
Implement RTS, RTR, RTE.
This commit is contained in:
parent
ac6a9ab631
commit
1defeca1ad
@ -55,6 +55,9 @@ template <Model model, typename BusHandler> class Executor {
|
|||||||
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);
|
void pea(uint32_t address);
|
||||||
void tas(Preinstruction instruction, uint32_t address);
|
void tas(Preinstruction instruction, uint32_t address);
|
||||||
|
void rtr();
|
||||||
|
void rts();
|
||||||
|
void rte();
|
||||||
|
|
||||||
// TODO: ownership of this shouldn't be here.
|
// TODO: ownership of this shouldn't be here.
|
||||||
struct Registers {
|
struct Registers {
|
||||||
|
@ -401,6 +401,26 @@ void Executor<model, BusHandler>::pea(uint32_t address) {
|
|||||||
bus_handler_.template write<uint32_t>(sp().l, address);
|
bus_handler_.template write<uint32_t>(sp().l, address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <Model model, typename BusHandler>
|
||||||
|
void Executor<model, BusHandler>::rtr() {
|
||||||
|
status_.set_ccr(bus_handler_.template read<uint16_t>(sp().l));
|
||||||
|
sp().l += 2;
|
||||||
|
rts();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <Model model, typename BusHandler>
|
||||||
|
void Executor<model, BusHandler>::rte() {
|
||||||
|
status_.set_status(bus_handler_.template read<uint16_t>(sp().l));
|
||||||
|
sp().l += 2;
|
||||||
|
rts();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <Model model, typename BusHandler>
|
||||||
|
void Executor<model, BusHandler>::rts() {
|
||||||
|
program_counter_.l = bus_handler_.template read<uint32_t>(sp().l);
|
||||||
|
sp().l += 4;
|
||||||
|
}
|
||||||
|
|
||||||
template <Model model, typename BusHandler>
|
template <Model model, typename BusHandler>
|
||||||
void Executor<model, BusHandler>::tas(Preinstruction instruction, uint32_t address) {
|
void Executor<model, BusHandler>::tas(Preinstruction instruction, uint32_t address) {
|
||||||
uint8_t original_value;
|
uint8_t original_value;
|
||||||
|
@ -1204,21 +1204,17 @@ template <
|
|||||||
/*
|
/*
|
||||||
RTE and RTR share an implementation.
|
RTE and RTR share an implementation.
|
||||||
*/
|
*/
|
||||||
// case Operation::RTE_RTR:
|
case Operation::RTR:
|
||||||
// // If this is RTR, patch out the supervisor half of the status register.
|
flow_controller.rtr();
|
||||||
// if(decoded_instruction_.l == 0x4e77) {
|
break;
|
||||||
// const auto current_status = status();
|
|
||||||
// source_bus_data_.halves.low.halves.high =
|
|
||||||
// uint8_t(current_status >> 8);
|
|
||||||
// }
|
|
||||||
// apply_status(source_bus_data_.l);
|
|
||||||
// break;
|
|
||||||
|
|
||||||
// case Operation::RTE:
|
case Operation::RTE:
|
||||||
// break;
|
flow_controller.rte();
|
||||||
//
|
break;
|
||||||
// case Operation::RTR:
|
|
||||||
// break;
|
case Operation::RTS:
|
||||||
|
flow_controller.rts();
|
||||||
|
break;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TSTs: compare to zero.
|
TSTs: compare to zero.
|
||||||
|
@ -276,6 +276,7 @@ template <Model model, Operation t_operation = Operation::Undefined> uint8_t ope
|
|||||||
case Operation::MOVEMtoMw: case Operation::MOVEMtoMl:
|
case Operation::MOVEMtoMw: case Operation::MOVEMtoMl:
|
||||||
case Operation::MOVEMtoRw: case Operation::MOVEMtoRl:
|
case Operation::MOVEMtoRw: case Operation::MOVEMtoRl:
|
||||||
case Operation::TAS:
|
case Operation::TAS:
|
||||||
|
case Operation::RTR: case Operation::RTS: case Operation::RTE:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -52,6 +52,8 @@
|
|||||||
// swap
|
// swap
|
||||||
// tas
|
// tas
|
||||||
// tst
|
// tst
|
||||||
|
// rts
|
||||||
|
// rtr
|
||||||
|
|
||||||
// Issues to fix:
|
// Issues to fix:
|
||||||
//
|
//
|
||||||
@ -81,7 +83,7 @@
|
|||||||
|
|
||||||
- (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:@[@"rts.json", @"rtr.json"]];
|
// _fileSet = [NSSet setWithArray:@[@"rts.json", @"rtr.json"]];
|
||||||
// _testSet = [NSSet setWithArray:@[@"NEGX 00c0"]];
|
// _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…
Reference in New Issue
Block a user