1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-26 08:49:37 +00:00

Avoid infinite loops for completely undefined addresses.

This commit is contained in:
Thomas Harte 2021-12-18 17:48:45 -05:00
parent f118891970
commit 54aa211f56
2 changed files with 8 additions and 8 deletions

View File

@ -810,13 +810,13 @@ void Chipset::perform(const CPU::MC68000::Microcycle &cycle) {
const uint32_t register_address = *cycle.address & 0x1fe; const uint32_t register_address = *cycle.address & 0x1fe;
if(cycle.operation & Microcycle::Read) { if(cycle.operation & Microcycle::Read) {
cycle.set_value16(read(register_address)); cycle.set_value16(read<true>(register_address));
} else { } else {
write(register_address, cycle.value16()); write<true>(register_address, cycle.value16());
} }
} }
void Chipset::write(uint32_t address, uint16_t value) { template <bool allow_conversion> void Chipset::write(uint32_t address, uint16_t value) {
#define ApplySetClear(target, mask) { \ #define ApplySetClear(target, mask) { \
if(value & 0x8000) { \ if(value & 0x8000) { \
target |= (value & mask); \ target |= (value & mask); \
@ -828,7 +828,7 @@ void Chipset::write(uint32_t address, uint16_t value) {
switch(address) { switch(address) {
default: default:
// If there was nothing to write, perform a throwaway read. // If there was nothing to write, perform a throwaway read.
read(address); if constexpr (allow_conversion) read<false>(address);
break; break;
// Raster position. // Raster position.
@ -1083,12 +1083,12 @@ void Chipset::write(uint32_t address, uint16_t value) {
#undef ApplySetClear #undef ApplySetClear
} }
uint16_t Chipset::read(uint32_t address) { template <bool allow_conversion> uint16_t Chipset::read(uint32_t address) {
switch(address) { switch(address) {
default: default:
// If there was nothing to read, perform a write. // If there was nothing to read, perform a write.
// TODO: Rather than 0xffff, should be whatever is left on the bus, vapour-lock style. // TODO: Rather than 0xffff, should be whatever is left on the bus, vapour-lock style.
write(address, 0xffff); if constexpr (allow_conversion) write<false>(address, 0xffff);
return 0xffff; return 0xffff;
// Raster position. // Raster position.

View File

@ -108,8 +108,8 @@ class Chipset: private ClockingHint::Observer {
friend class DMADeviceBase; friend class DMADeviceBase;
// MARK: - Register read/write functions. // MARK: - Register read/write functions.
uint16_t read(uint32_t address); template <bool allow_conversion> uint16_t read(uint32_t address);
void write(uint32_t address, uint16_t value); template <bool allow_conversion> void write(uint32_t address, uint16_t value);
// MARK: - E Clock and keyboard dividers. // MARK: - E Clock and keyboard dividers.