mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-28 22:30:30 +00:00
Add enough wiring to complete but fail EXT and JMP/JSR.
This commit is contained in:
parent
39f0ec7536
commit
052ba80fd7
@ -46,6 +46,7 @@ template <Model model, typename BusHandler> class Executor {
|
|||||||
void decline_branch() {}
|
void decline_branch() {}
|
||||||
void did_update_status();
|
void did_update_status();
|
||||||
void bsr(uint32_t offset);
|
void bsr(uint32_t offset);
|
||||||
|
void jsr(uint32_t offset);
|
||||||
|
|
||||||
// TODO: ownership of this shouldn't be here.
|
// TODO: ownership of this shouldn't be here.
|
||||||
struct Registers {
|
struct Registers {
|
||||||
|
@ -371,6 +371,13 @@ void Executor<model, BusHandler>::bsr(uint32_t offset) {
|
|||||||
program_counter_.l = instruction_address_ + offset;
|
program_counter_.l = instruction_address_ + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <Model model, typename BusHandler>
|
||||||
|
void Executor<model, BusHandler>::jsr(uint32_t address) {
|
||||||
|
address_[7].l -= 4;
|
||||||
|
bus_handler_.template write<uint32_t>(address_[7].l, program_counter_.l);
|
||||||
|
program_counter_.l = address;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -408,6 +408,11 @@ template <
|
|||||||
flow_controller.set_pc(src.l);
|
flow_controller.set_pc(src.l);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// JSR: jump to EA(0), pushing the current PC to the stack.
|
||||||
|
case Operation::JSR:
|
||||||
|
flow_controller.jsr(src.l);
|
||||||
|
break;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
MOVE.b, MOVE.l and MOVE.w: move the least significant byte or word, or the entire long word,
|
MOVE.b, MOVE.l and MOVE.w: move the least significant byte or word, or the entire long word,
|
||||||
and set negative, zero, overflow and carry as appropriate.
|
and set negative, zero, overflow and carry as appropriate.
|
||||||
|
@ -260,9 +260,10 @@ template <Model model, Operation t_operation = Operation::Undefined> uint8_t ope
|
|||||||
|
|
||||||
//
|
//
|
||||||
// No operands are fetched or stored.
|
// No operands are fetched or stored.
|
||||||
|
// (which means that source and destination will appear as their effective addresses)
|
||||||
//
|
//
|
||||||
case Operation::LEA:
|
case Operation::LEA: case Operation::PEA:
|
||||||
case Operation::PEA:
|
case Operation::JMP: case Operation::JSR:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -291,6 +292,7 @@ template <Model model, Operation t_operation = Operation::Undefined> uint8_t ope
|
|||||||
case Operation::NEGb: case Operation::NEGw: case Operation::NEGl:
|
case Operation::NEGb: case Operation::NEGw: case Operation::NEGl:
|
||||||
case Operation::NEGXb: case Operation::NEGXw: case Operation::NEGXl:
|
case Operation::NEGXb: case Operation::NEGXw: case Operation::NEGXl:
|
||||||
case Operation::EXTbtow: case Operation::EXTwtol:
|
case Operation::EXTbtow: case Operation::EXTwtol:
|
||||||
|
case Operation::SWAP:
|
||||||
return FetchOp1 | StoreOp1;
|
return FetchOp1 | StoreOp1;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -331,6 +333,8 @@ template <Model model, Operation t_operation = Operation::Undefined> uint8_t ope
|
|||||||
case Operation::ORb: case Operation::ORw: case Operation::ORl:
|
case Operation::ORb: case Operation::ORw: case Operation::ORl:
|
||||||
case Operation::ANDb: case Operation::ANDw: case Operation::ANDl:
|
case Operation::ANDb: case Operation::ANDw: case Operation::ANDl:
|
||||||
case Operation::EORb: case Operation::EORw: case Operation::EORl:
|
case Operation::EORb: case Operation::EORw: case Operation::EORl:
|
||||||
|
case Operation::DIVU: case Operation::DIVS:
|
||||||
|
case Operation::MULU: case Operation::MULS:
|
||||||
return FetchOp1 | FetchOp2 | StoreOp2;
|
return FetchOp1 | FetchOp2 | StoreOp2;
|
||||||
|
|
||||||
// case Operation::MOVEMw:
|
// case Operation::MOVEMw:
|
||||||
|
@ -36,13 +36,24 @@
|
|||||||
// addq_subq
|
// addq_subq
|
||||||
// addx_subx
|
// addx_subx
|
||||||
// bcc
|
// bcc
|
||||||
|
// cmp
|
||||||
|
// dbcc_scc
|
||||||
|
// eori_andi_ori
|
||||||
|
|
||||||
// Skipped for now:
|
// Skipped for now, for implying a more granular decoder:
|
||||||
|
//
|
||||||
// btst_bchg_bclr_bset
|
// btst_bchg_bclr_bset
|
||||||
|
// chk
|
||||||
|
//
|
||||||
|
// And for uncertainty around the test result status register correctness:
|
||||||
|
//
|
||||||
|
// divu_divs
|
||||||
|
// eor_and_or (which invokes BCD)
|
||||||
|
// exg (also BCD)
|
||||||
|
|
||||||
- (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:@[@"chk.json"]];
|
_fileSet = [NSSet setWithArray:@[@"ext.json", @"jmp_jsr.json"]];
|
||||||
// _testSet = [NSSet setWithArray:@[@"Bcc 6206"]];
|
// _testSet = [NSSet setWithArray:@[@"Bcc 6206"]];
|
||||||
// _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