mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-09 02:31:22 +00:00
Do a de minimis checking of memory accesses.
This commit is contained in:
parent
a2896b9bd0
commit
4e7a63f792
@ -64,13 +64,41 @@ struct Memory {
|
|||||||
struct MemoryLedger {
|
struct MemoryLedger {
|
||||||
template <typename IntT>
|
template <typename IntT>
|
||||||
bool write(uint32_t address, IntT source, Mode, bool) {
|
bool write(uint32_t address, IntT source, Mode, bool) {
|
||||||
return false; // TODO.
|
if(write_pointer == writes.size() || writes[write_pointer].size != sizeof(IntT) || writes[write_pointer].address != address || writes[write_pointer].value != source) {
|
||||||
|
throw 0;
|
||||||
|
}
|
||||||
|
++write_pointer;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename IntT>
|
template <typename IntT>
|
||||||
bool read(uint32_t address, IntT &source, Mode, bool) {
|
bool read(uint32_t address, IntT &source, Mode, bool) {
|
||||||
return false; // TODO.
|
if(read_pointer == reads.size() || reads[read_pointer].size != sizeof(IntT) || reads[read_pointer].address != address) {
|
||||||
|
throw 0;
|
||||||
|
}
|
||||||
|
source = reads[read_pointer].value;
|
||||||
|
++read_pointer;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Access {
|
||||||
|
size_t size;
|
||||||
|
uint32_t address;
|
||||||
|
uint32_t value;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename IntT>
|
||||||
|
void add_access(bool is_read, uint32_t address, IntT value) {
|
||||||
|
auto &read = is_read ? reads.emplace_back() : writes.emplace_back();
|
||||||
|
read.address = address;
|
||||||
|
read.value = value;
|
||||||
|
read.size = sizeof(IntT);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<Access> reads;
|
||||||
|
std::vector<Access> writes;
|
||||||
|
size_t read_pointer = 0;
|
||||||
|
size_t write_pointer = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -339,7 +367,10 @@ struct MemoryLedger {
|
|||||||
execute<Model::ARMv2>(instruction, *test);
|
execute<Model::ARMv2>(instruction, *test);
|
||||||
|
|
||||||
for(uint32_t c = 0; c < 15; c++) {
|
for(uint32_t c = 0; c < 15; c++) {
|
||||||
XCTAssertEqual(regs[c], registers[c]);
|
XCTAssertEqual(
|
||||||
|
regs[c],
|
||||||
|
registers[c],
|
||||||
|
@"R%d doesn't match during instruction %08x", c, instruction);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
@ -353,21 +384,25 @@ struct MemoryLedger {
|
|||||||
|
|
||||||
if(label == "r.b") {
|
if(label == "r.b") {
|
||||||
// Capture a byte read for provision.
|
// Capture a byte read for provision.
|
||||||
|
test->bus.add_access<uint8_t>(true, address, value);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(label == "r.w") {
|
if(label == "r.w") {
|
||||||
// Capture a word read for provision.
|
// Capture a word read for provision.
|
||||||
|
test->bus.add_access<uint32_t>(true, address, value);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(label == "w.b") {
|
if(label == "w.b") {
|
||||||
// Capture a byte write for comparison.
|
// Capture a byte write for comparison.
|
||||||
|
test->bus.add_access<uint8_t>(false, address, value);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(label == "w.w") {
|
if(label == "w.w") {
|
||||||
// Capture a word write for comparison.
|
// Capture a word write for comparison.
|
||||||
|
test->bus.add_access<uint32_t>(false, address, value);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user