summaryrefslogtreecommitdiff
path: root/arm9/source/devices/clock.c
diff options
context:
space:
mode:
authorBen Bridle <ben@derelict.engineering>2024-11-18 14:57:19 +1300
committerBen Bridle <ben@derelict.engineering>2024-11-18 14:57:19 +1300
commit722d5509178fa5bdaa488fbbd9196f21377f8775 (patch)
tree112b39cd80cb8e074d9e71d1def4d8de33c9eefa /arm9/source/devices/clock.c
downloadbedrock-nds-722d5509178fa5bdaa488fbbd9196f21377f8775.zip
Initial commit
Diffstat (limited to 'arm9/source/devices/clock.c')
-rw-r--r--arm9/source/devices/clock.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/arm9/source/devices/clock.c b/arm9/source/devices/clock.c
new file mode 100644
index 0000000..6f3ce85
--- /dev/null
+++ b/arm9/source/devices/clock.c
@@ -0,0 +1,87 @@
+#include <nds.h>
+#include <time.h>
+#include "clock.h"
+#include "../bang.h"
+
+// Uptime is the number of 1/256th second ticks since the emulator began.
+static u32 uptime;
+u32 get_uptime(void) { return uptime; }
+void uptime_handler(void) { uptime++; }
+
+// Check if any timer has expired.
+bool check_timers(ClockDevice *clk) {
+ bool output = FALSE;
+ if (clk->t1.end && clk->t1.end <= uptime) {
+ clk->t1.end = 0;
+ output = TRUE;
+ }
+ if (clk->t2.end && clk->t2.end <= uptime) {
+ clk->t2.end = 0;
+ output = TRUE;
+ }
+ if (clk->t3.end && clk->t3.end <= uptime) {
+ clk->t3.end = 0;
+ output = TRUE;
+ }
+ if (clk->t4.end && clk->t4.end <= uptime) {
+ clk->t4.end = 0;
+ output = TRUE;
+ }
+ return output;
+}
+
+u8 get_timer_high(ClockTimer *t) {
+ if (t->end > uptime) {
+ t->read = t->end - uptime;
+ } else {
+ t->end = 0;
+ t->read = 0;
+ }
+ return HIGH(t->read);
+}
+
+u8 get_timer_low(ClockTimer *t) {
+ return LOW(t->read);
+}
+
+void set_timer_high(ClockTimer *t, u8 high) {
+ SET_HIGH(t->write, high);
+}
+void set_timer_low(ClockTimer *t, u8 low) {
+ SET_LOW(t->write, low);
+ if (t->write) {
+ t->end = uptime + t->write;
+ } else {
+ t->end = 0;
+ }
+}
+
+u8 get_timer1_high(ClockDevice *clock) { return get_timer_high(&clock->t1); }
+u8 get_timer1_low( ClockDevice *clock) { return get_timer_low( &clock->t1); }
+u8 get_timer2_high(ClockDevice *clock) { return get_timer_high(&clock->t2); }
+u8 get_timer2_low( ClockDevice *clock) { return get_timer_low( &clock->t2); }
+u8 get_timer3_high(ClockDevice *clock) { return get_timer_high(&clock->t3); }
+u8 get_timer3_low( ClockDevice *clock) { return get_timer_low( &clock->t3); }
+u8 get_timer4_high(ClockDevice *clock) { return get_timer_high(&clock->t4); }
+u8 get_timer4_low( ClockDevice *clock) { return get_timer_low( &clock->t4); }
+
+void set_timer1_high(ClockDevice *clock, u8 high) { set_timer_high(&clock->t1, high); }
+void set_timer1_low( ClockDevice *clock, u8 low) { set_timer_low( &clock->t1, low); }
+void set_timer2_high(ClockDevice *clock, u8 high) { set_timer_high(&clock->t2, high); }
+void set_timer2_low( ClockDevice *clock, u8 low) { set_timer_low( &clock->t2, low); }
+void set_timer3_high(ClockDevice *clock, u8 high) { set_timer_high(&clock->t3, high); }
+void set_timer3_low( ClockDevice *clock, u8 low) { set_timer_low( &clock->t3, low); }
+void set_timer4_high(ClockDevice *clock, u8 high) { set_timer_high(&clock->t4, high); }
+void set_timer4_low( ClockDevice *clock, u8 low) { set_timer_low( &clock->t4, low); }
+
+
+void init_clock(void) {
+ // Start a 256Hz timer to increment the uptime value.
+ timerStart(0, ClockDivider_1024, TIMER_FREQ_1024(256), uptime_handler);
+}
+
+struct tm* get_datetime(void) {
+ time_t timestamp = time(NULL);
+ struct tm* datetime = localtime(&timestamp);
+ return datetime;
+}