31 # include <mmsystem.h>
39 bool bUninitializedTimers(
true);
41 volatile std::uint32_t system_tick;
49 std::uint32_t(*p_tick_getter)();
50 std::uint64_t(*p_tick_getter_nano)();
56 ::LARGE_INTEGER start;
66 ::QueryPerformanceCounter(&now);
67 now.QuadPart -= g_ticks.hi.start.QuadPart;
69 return ::DWORD(now.QuadPart / g_ticks.hi.tps.QuadPart);
73 get_ticks_hi_res_nano()
77 ::QueryPerformanceCounter(&now);
78 now.QuadPart -= g_ticks.hi.start.QuadPart;
79 now.QuadPart *= 1000000000;
80 return now.QuadPart / g_ticks.hi.tps.QuadPart;
86 ::DWORD now(::timeGetTime());
88 return now < g_ticks.start ? (~::DWORD(0) - g_ticks.start) + now
89 : now - g_ticks.start;
95 return get_ticks_mm() * 1000000;
103 if(bUninitializedTimers)
109 ::irqSet(IRQ_TIMER(2), timer_callback);
110 ::irqEnable(IRQ_TIMER(2));
112 TIMER2_CR = TIMER_ENABLE | ::ClockDivider_1;
114 ::timerStart(2, ::ClockDivider_1,
u16(TIMER_FREQ(1000)),
117 if(::QueryPerformanceFrequency(&g_ticks.hi.tps))
119 yunseq(p_tick_getter = get_ticks_hi_res,
120 p_tick_getter_nano = get_ticks_hi_res_nano),
121 ::QueryPerformanceCounter(&g_ticks.hi.start);
125 yunseq(p_tick_getter = get_ticks_mm,
126 p_tick_getter_nano = get_ticks_mm_nano),
127 ::timeBeginPeriod(1);
129 g_ticks.start = ::timeGetTime();
132 # error Unsupported platform found!
134 bUninitializedTimers =
false;
145 return p_tick_getter();
147 # error Unsupported platform found!
156 return system_tick * 1000000ULL
157 + TIMER2_DATA * 1000000ULL / BUS_CLOCK;
159 return p_tick_getter_nano();
161 # error Unsupported platform found!