24 typedef int_fast64_t event_clock_t;
32 typedef enum {EVENT_CLOCK_PHI1 = 0, EVENT_CLOCK_PHI2 = 1} event_phase_t;
52 const char *
const m_name;
55 event_clock_t triggerTime;
83 virtual void event (
void) = 0;
86 bool pending ()
const {
return m_pending; }
93 SID_DEPRECATED
void cancel ();
100 SID_DEPRECATED
void schedule(
EventContext &context, event_clock_t cycles,
101 event_phase_t phase);
105 template<
class This >
109 typedef void (This::*Callback) ();
111 Callback
const m_callback;
112 void event(
void) { (m_this.*m_callback) (); }
115 EventCallback (
const char *
const name, This &_this, Callback callback)
116 :
Event(name), m_this(_this),
117 m_callback(callback) {}
128 virtual void schedule (
Event &event,
const event_clock_t cycles,
129 const event_phase_t phase) = 0;
130 virtual void schedule (
Event &event,
const event_clock_t cycles) = 0;
131 virtual event_clock_t getTime (
const event_phase_t phase)
const = 0;
132 virtual event_clock_t getTime (
const event_clock_t clock,
const event_phase_t phase)
const = 0;
133 virtual event_phase_t phase ()
const = 0;
163 event_clock_t currentTime;
174 void schedule(
Event &event) {
179 event.m_pending =
true;
182 Event **scan = &firstEvent;
184 if (*scan == 0 || (*scan)->triggerTime > event.triggerTime) {
189 scan = &((*scan)->next);
200 void schedule (
Event &event,
const event_clock_t cycles,
201 const event_phase_t
phase) {
203 event.triggerTime = (cycles << 1) + currentTime + ((currentTime & 1) ^
phase);
213 event.triggerTime = (cycles << 1) + currentTime;
234 Event &
event = *firstEvent;
235 firstEvent = firstEvent->next;
236 event.m_pending =
false;
237 currentTime =
event.triggerTime;
247 {
return (currentTime + (phase ^ 1)) >> 1; }
262 event_phase_t
phase ()
const {
return (event_phase_t) (currentTime & 1); }
269 m_context = &context;
270 m_context->schedule (*
this, cycles, phase);
276 m_context->cancel (*
this);