1 #pragma once
2 
3 #include <functional>
4 #include <utility>
5 #include "common_types.h"
6 #include "core_timing.h"
7 
8 namespace Teakra {
9 
10 class Timer : public CoreTiming::Callbacks {
11 public:
12     Timer(CoreTiming& core_timing);
13 
14     enum class CountMode : u16 {
15         Single = 0,
16         AutoRestart = 1,
17         FreeRunning = 2,
18         EventCount = 3,
19     };
20 
21     void Reset();
22 
23     void Restart();
24     void Tick() override;
25     void TickEvent();
26     u64 GetMaxSkip() const override;
27     void Skip(u64 ticks) override;
28 
29     u16 update_mmio = 0;
30     u16 pause = 0;
31     CountMode count_mode = CountMode::Single;
32     u16 scale = 0;
33 
34     u16 start_high = 0;
35     u16 start_low = 0;
36     u32 counter = 0;
37     u16 counter_high = 0;
38     u16 counter_low = 0;
39 
SetInterruptHandler(std::function<void ()> handler)40     void SetInterruptHandler(std::function<void()> handler) {
41         interrupt_handler = std::move(handler);
42     }
43 
44 private:
45     std::function<void()> interrupt_handler;
46 
47     void UpdateMMIO();
48 
49     class TimerTimingCallbacks;
50 };
51 
52 } // namespace Teakra
53