1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-22 12:33:29 +00:00

Correct 8520 TOD setting and getting.

This commit is contained in:
Thomas Harte 2021-10-30 12:02:43 -07:00
parent 5ffe71346c
commit 9ecd43238f

View File

@ -123,7 +123,7 @@ template <> class TODStorage<true>: public TODBase {
uint32_t increment_mask_ = uint32_t(~0); uint32_t increment_mask_ = uint32_t(~0);
uint32_t latch_ = 0; uint32_t latch_ = 0;
uint32_t value_ = 0; uint32_t value_ = 0;
uint32_t alarm_ = 0xffffff; uint32_t alarm_ = 0xff'ffff;
public: public:
template <int byte> void write(uint8_t v) { template <int byte> void write(uint8_t v) {
@ -135,43 +135,42 @@ template <> class TODStorage<true>: public TODBase {
// Write to either the alarm or the current value as directed; // Write to either the alarm or the current value as directed;
// writing to any part of the current value other than the LSB // writing to any part of the current value other than the LSB
// pauses incrementing until the LSB is written. // pauses incrementing until the LSB is written.
const uint32_t mask = uint32_t(~(0xff << shift));
if(write_alarm) { if(write_alarm) {
alarm_ = (alarm_ & (0x00ff'ffff >> (24 - shift))) | uint32_t(v << shift); alarm_ = (alarm_ & mask) | uint32_t(v << shift);
} else { } else {
value_ = (alarm_ & (0x00ff'ffff >> (24 - shift))) | uint32_t(v << shift); value_ = (value_ & mask) | uint32_t(v << shift);
increment_mask_ = (shift == 0) ? uint32_t(~0) : 0; increment_mask_ = (byte == 0) ? uint32_t(~0) : 0;
} }
} }
template <int byte> uint8_t read() { template <int byte> uint8_t read() {
if constexpr (byte == 3) { if constexpr (byte == 3) {
return 0xff; // Assumed. Just a guss. return 0xff; // Assumed. Just a guess.
} }
constexpr int shift = byte << 3; constexpr int shift = byte << 3;
if(latch_) { if constexpr (byte == 2) {
// Latching: if this is a latched read from the LSB, latch_ = value_ | 0xff00'0000;
// empty the latch.
const uint8_t result = uint8_t((latch_ >> shift) & 0xff);
if constexpr (shift == 0) {
latch_ = 0;
}
return result;
} else {
// Latching: if this is a read from the MSB, latch now.
if constexpr (shift == 16) {
latch_ = value_ | 0xff00'0000;
}
return uint8_t((value_ >> shift) & 0xff);
} }
const uint32_t source = latch_ ? latch_ : value_;
const uint8_t result = uint8_t((source >> shift) & 0xff);
if constexpr (byte == 0) {
latch_ = 0;
}
return result;
} }
bool advance(int count) { bool advance(int count) {
// The 8250 uses a simple binary counter to replace the // The 8250 uses a simple binary counter to replace the
// 6526's time-of-day clock. So this is easy. // 6526's time-of-day clock. So this is easy.
const uint32_t distance_to_alarm = (alarm_ - value_) & 0xffffff; const uint32_t distance_to_alarm = (alarm_ - value_) & 0xff'ffff;
value_ += uint32_t(count) & increment_mask_; const auto increment = uint32_t(count) & increment_mask_;
return distance_to_alarm <= uint32_t(count); value_ = (value_ + increment) & 0xff'ffff;
return distance_to_alarm <= increment;
} }
}; };