mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-28 21:49:27 +00:00
Remove a conditional from the hot path.
This commit is contained in:
parent
5a84e98256
commit
c7747ec5a0
@ -135,7 +135,7 @@ struct MemoryController {
|
|||||||
|
|
||||||
case Zone::LogicallyMappedRAM: {
|
case Zone::LogicallyMappedRAM: {
|
||||||
const auto item = logical_ram<IntT, false>(address, trans);
|
const auto item = logical_ram<IntT, false>(address, trans);
|
||||||
if(!item) {
|
if(item < reinterpret_cast<IntT *>(ram_.data())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
*item = source;
|
*item = source;
|
||||||
@ -182,7 +182,7 @@ struct MemoryController {
|
|||||||
|
|
||||||
case Zone::LogicallyMappedRAM: {
|
case Zone::LogicallyMappedRAM: {
|
||||||
const auto item = logical_ram<IntT, true>(address, trans);
|
const auto item = logical_ram<IntT, true>(address, trans);
|
||||||
if(!item) {
|
if(item < reinterpret_cast<IntT *>(ram_.data())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
source = *item;
|
source = *item;
|
||||||
@ -276,8 +276,8 @@ struct MemoryController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool has_moved_rom_ = false;
|
bool has_moved_rom_ = false;
|
||||||
std::array<uint8_t, 4*1024*1024> ram_{};
|
|
||||||
std::array<uint8_t, 2*1024*1024> rom_;
|
std::array<uint8_t, 2*1024*1024> rom_;
|
||||||
|
std::array<uint8_t, 4*1024*1024> ram_{};
|
||||||
InputOutputController<InterruptObserverT, ClockRateObserverT> ioc_;
|
InputOutputController<InterruptObserverT, ClockRateObserverT> ioc_;
|
||||||
|
|
||||||
template <typename IntT>
|
template <typename IntT>
|
||||||
@ -353,6 +353,7 @@ struct MemoryController {
|
|||||||
|
|
||||||
bool map_dirty_ = true;
|
bool map_dirty_ = true;
|
||||||
|
|
||||||
|
/// @returns A pointer to somewhere in @c ram_ if RAM is mapped to this area, or a pointer to somewhere lower than @c ram_.data() otherwise.
|
||||||
template <typename IntT, bool is_read>
|
template <typename IntT, bool is_read>
|
||||||
IntT *logical_ram(uint32_t address, bool trans) {
|
IntT *logical_ram(uint32_t address, bool trans) {
|
||||||
// Possibly TODO: this recompute-if-dirty flag is supposed to ameliorate for an expensive
|
// Possibly TODO: this recompute-if-dirty flag is supposed to ameliorate for an expensive
|
||||||
@ -366,10 +367,6 @@ struct MemoryController {
|
|||||||
const size_t page = address >> page_address_shift_;
|
const size_t page = address >> page_address_shift_;
|
||||||
|
|
||||||
const auto &map = mapping<is_read>(trans, os_mode_);
|
const auto &map = mapping<is_read>(trans, os_mode_);
|
||||||
if(!map[page]) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
address &= page_adddress_mask_;
|
address &= page_adddress_mask_;
|
||||||
return reinterpret_cast<IntT *>(&map[page][address]);
|
return reinterpret_cast<IntT *>(&map[page][address]);
|
||||||
}
|
}
|
||||||
@ -389,7 +386,9 @@ struct MemoryController {
|
|||||||
void update_mapping() {
|
void update_mapping() {
|
||||||
// Clear all logical mappings.
|
// Clear all logical mappings.
|
||||||
for(auto &map: mapping_) {
|
for(auto &map: mapping_) {
|
||||||
std::fill(map.begin(), map.end(), nullptr);
|
// Seed all pointers to an address sufficiently far lower than the beginning of RAM as to mark
|
||||||
|
// the entire page as unmapped no matter what offset is added.
|
||||||
|
std::fill(map.begin(), map.end(), ram_.data() - 32768);
|
||||||
}
|
}
|
||||||
|
|
||||||
// For each physical page, project it into logical space
|
// For each physical page, project it into logical space
|
||||||
|
Loading…
Reference in New Issue
Block a user