diff options
author | Ben Bridle <ben@derelict.engineering> | 2024-11-18 14:57:19 +1300 |
---|---|---|
committer | Ben Bridle <ben@derelict.engineering> | 2024-11-18 14:57:19 +1300 |
commit | 722d5509178fa5bdaa488fbbd9196f21377f8775 (patch) | |
tree | 112b39cd80cb8e074d9e71d1def4d8de33c9eefa /arm9/source/devices/clock.c | |
download | bedrock-nds-722d5509178fa5bdaa488fbbd9196f21377f8775.zip |
Initial commit
Diffstat (limited to 'arm9/source/devices/clock.c')
-rw-r--r-- | arm9/source/devices/clock.c | 87 |
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(×tamp); + return datetime; +} |