mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-29 12:50:28 +00:00
Avoid infinite loops for completely undefined addresses.
This commit is contained in:
parent
f118891970
commit
54aa211f56
@ -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.
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user