From 449ead1141466c59bb48c242520d58eb8567b318 Mon Sep 17 00:00:00 2001 From: plutoo Date: Sat, 6 Sep 2014 21:07:26 +0200 Subject: [PATCH] os: Added osGetTime(). --- libctru/include/3ds/os.h | 1 + libctru/source/os.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/libctru/include/3ds/os.h b/libctru/include/3ds/os.h index c267590..92e6483 100644 --- a/libctru/include/3ds/os.h +++ b/libctru/include/3ds/os.h @@ -7,3 +7,4 @@ u32 osConvertVirtToPhys(u32 vaddr); const char* osStrError(u32 error); u32 osGetFirmVersion(); u32 osGetKernelVersion(); +u64 osGetTime(); diff --git a/libctru/source/os.c b/libctru/source/os.c index f09bf24..84431bf 100644 --- a/libctru/source/os.c +++ b/libctru/source/os.c @@ -1,5 +1,21 @@ #include <3ds.h> +#define TICKS_PER_MSEC 268123.480 + +typedef struct { + u64 date_time; + u64 update_tick; + //... +} datetime_t; + +static volatile u32* __datetime_selector = + (u32*) 0x1FF81000; +static volatile datetime_t* __datetime1 = + (datetime_t*) 0x1FF81020; +static volatile datetime_t* __datetime2 = + (datetime_t*) 0x1FF81040; + + u32 osConvertVirtToPhys(u32 vaddr) { if(vaddr >= 0x14000000 && vaddr < 0x1c000000) @@ -13,6 +29,21 @@ u32 osConvertVirtToPhys(u32 vaddr) return 0; } +// Returns number of milliseconds since 1st Jan 1900 00:00. +u64 osGetTime() { + volatile datetime_t* dt; + + switch(*__datetime_selector & 1) { + case 0: + dt = __datetime1; + case 1: + dt = __datetime2; + } + + u64 offset = (svcGetSystemTick() - dt->update_tick) / TICKS_PER_MSEC; + return dt->date_time + offset; +} + u32 osGetFirmVersion() { return (*(u32*)0x1FF80000) & ~0xFF; }