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