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

Made the base 6522 class more abstract: you must now opt-in if you want the IRQ line to be sent to a delegate.

This commit is contained in:
Thomas Harte 2016-06-18 08:51:18 -04:00
parent d6cb4fe15c
commit 595791cee0
2 changed files with 25 additions and 15 deletions

View File

@ -14,11 +14,6 @@
namespace MOS { namespace MOS {
class MOS6522Delegate {
public:
virtual void mos6522_did_change_interrupt_status(void *mos6522) = 0;
};
template <class T> class MOS6522 { template <class T> class MOS6522 {
private: private:
enum InterruptFlag: uint8_t { enum InterruptFlag: uint8_t {
@ -181,11 +176,6 @@ template <class T> class MOS6522 {
return !!interrupt_status; return !!interrupt_status;
} }
void set_delegate(MOS6522Delegate *delegate)
{
_delegate = delegate;
}
MOS6522() : MOS6522() :
_timer_is_running{false, false}, _timer_is_running{false, false},
_last_posted_interrupt_status(false) _last_posted_interrupt_status(false)
@ -197,7 +187,6 @@ template <class T> class MOS6522 {
void set_port_output(int port, uint8_t value) {} void set_port_output(int port, uint8_t value) {}
// Delegate and communications // Delegate and communications
MOS6522Delegate *_delegate;
bool _last_posted_interrupt_status; bool _last_posted_interrupt_status;
inline void reevaluate_interrupts() inline void reevaluate_interrupts()
{ {
@ -205,7 +194,7 @@ template <class T> class MOS6522 {
if(new_interrupt_status != _last_posted_interrupt_status) if(new_interrupt_status != _last_posted_interrupt_status)
{ {
_last_posted_interrupt_status = new_interrupt_status; _last_posted_interrupt_status = new_interrupt_status;
if(_delegate) _delegate->mos6522_did_change_interrupt_status(this); static_cast<T *>(this)->set_interrupt_status(new_interrupt_status);
} }
} }
@ -228,6 +217,27 @@ template <class T> class MOS6522 {
bool _timer_is_running[2]; bool _timer_is_running[2];
}; };
class MOS6522IRQDelegate {
public:
class Delegate {
public:
virtual void mos6522_did_change_interrupt_status(void *mos6522) = 0;
};
void set_delegate(Delegate *delegate)
{
_delegate = delegate;
}
void set_interrupt_status(bool new_status)
{
if(_delegate) _delegate->mos6522_did_change_interrupt_status(this);
}
private:
Delegate *_delegate;
};
} }
#endif /* _522_hpp */ #endif /* _522_hpp */

View File

@ -44,10 +44,10 @@ enum Key: uint16_t {
Key9 = key(0, 0x10), KeyPlus = key(0, 0x20), KeyGBP = key(0, 0x40), KeyDelete = key(0, 0x80), Key9 = key(0, 0x10), KeyPlus = key(0, 0x20), KeyGBP = key(0, 0x40), KeyDelete = key(0, 0x80),
}; };
class UserPortVIA: public MOS::MOS6522<UserPortVIA> { class UserPortVIA: public MOS::MOS6522<UserPortVIA>, public MOS::MOS6522IRQDelegate {
}; };
class KeyboardVIA: public MOS::MOS6522<KeyboardVIA> { class KeyboardVIA: public MOS::MOS6522<KeyboardVIA>, public MOS::MOS6522IRQDelegate {
public: public:
void set_key_state(Key key, bool isPressed) { void set_key_state(Key key, bool isPressed) {
if(isPressed) if(isPressed)
@ -88,7 +88,7 @@ class KeyboardVIA: public MOS::MOS6522<KeyboardVIA> {
uint8_t _activation_mask; uint8_t _activation_mask;
}; };
class Machine: public CPU6502::Processor<Machine>, public CRTMachine::Machine, public MOS::MOS6522Delegate { class Machine: public CPU6502::Processor<Machine>, public CRTMachine::Machine, public MOS::MOS6522IRQDelegate::Delegate {
public: public:
Machine(); Machine();
~Machine(); ~Machine();