summaryrefslogtreecommitdiff
path: root/arm9/source
diff options
context:
space:
mode:
authorBen Bridle <ben@derelict.engineering>2024-11-22 16:01:31 +1300
committerBen Bridle <ben@derelict.engineering>2024-11-22 16:07:48 +1300
commite05888d141bc64e92d81859af0d87627e6fbc477 (patch)
tree8d4008de05045c5721cfa6ba49aa4c39cb12cf2f /arm9/source
parent2acaa6cb6c54c246b7f152f91d0428325c5b3ebd (diff)
downloadbedrock-nds-e05888d141bc64e92d81859af0d87627e6fbc477.zip
Simplify clock device implementation
Two pairs of generic get/set functions now do the role of the previous pair of custom get/set functions for each timer.
Diffstat (limited to 'arm9/source')
-rw-r--r--arm9/source/core.c32
-rw-r--r--arm9/source/devices/clock.c42
-rw-r--r--arm9/source/devices/clock.h25
3 files changed, 28 insertions, 71 deletions
diff --git a/arm9/source/core.c b/arm9/source/core.c
index 66bd204..a1f9ec1 100644
--- a/arm9/source/core.c
+++ b/arm9/source/core.c
@@ -107,14 +107,14 @@ u8 dev_read(Bedrock *br, u8 port) {
case 0x35: return SECOND(get_datetime());
case 0x36: return HIGH(get_uptime()-br->clk.start);
case 0x37: return LOW(get_uptime()-br->clk.start);
- case 0x38: return get_timer1_high(&br->clk);
- case 0x39: return get_timer1_low( &br->clk);
- case 0x3A: return get_timer2_high(&br->clk);
- case 0x3B: return get_timer2_low( &br->clk);
- case 0x3C: return get_timer3_high(&br->clk);
- case 0x3D: return get_timer3_low( &br->clk);
- case 0x3E: return get_timer4_high(&br->clk);
- case 0x3F: return get_timer4_low( &br->clk);
+ case 0x38: return get_timer_high(&br->clk.t1);
+ case 0x39: return get_timer_low( &br->clk.t1);
+ case 0x3A: return get_timer_high(&br->clk.t2);
+ case 0x3B: return get_timer_low( &br->clk.t2);
+ case 0x3C: return get_timer_high(&br->clk.t3);
+ case 0x3D: return get_timer_low( &br->clk.t3);
+ case 0x3E: return get_timer_high(&br->clk.t4);
+ case 0x3F: return get_timer_low( &br->clk.t4);
// INPUT DEVICE
case 0x40: return BOOL(br->inp.pointer);
case 0x41: return br->inp.pointer << 7;
@@ -169,14 +169,14 @@ Signal dev_write(Bedrock *br, u8 port, u8 v) {
case 0x23: set_op2_low( &br->math,v); return 0;
// CLOCK DEVICE
// TODO: Set time and date
- case 0x38: set_timer1_high(&br->clk,v); return 0;
- case 0x39: set_timer1_low( &br->clk,v); return 0;
- case 0x3A: set_timer2_high(&br->clk,v); return 0;
- case 0x3B: set_timer2_low( &br->clk,v); return 0;
- case 0x3C: set_timer3_high(&br->clk,v); return 0;
- case 0x3D: set_timer3_low( &br->clk,v); return 0;
- case 0x3E: set_timer4_high(&br->clk,v); return 0;
- case 0x3F: set_timer4_low( &br->clk,v); return 0;
+ case 0x38: set_timer_high(&br->clk.t1,v); return 0;
+ case 0x39: set_timer_low( &br->clk.t1,v); return 0;
+ case 0x3A: set_timer_high(&br->clk.t2,v); return 0;
+ case 0x3B: set_timer_low( &br->clk.t2,v); return 0;
+ case 0x3C: set_timer_high(&br->clk.t3,v); return 0;
+ case 0x3D: set_timer_low( &br->clk.t3,v); return 0;
+ case 0x3E: set_timer_high(&br->clk.t4,v); return 0;
+ case 0x3F: set_timer_low( &br->clk.t4,v); return 0;
// SCREEN DEVICE
case 0x54: SET_HIGH(br->scr.x,v); return 0;
case 0x55: SET_LOW( br->scr.x,v); return 0;
diff --git a/arm9/source/devices/clock.c b/arm9/source/devices/clock.c
index 6f3ce85..6ecee1d 100644
--- a/arm9/source/devices/clock.c
+++ b/arm9/source/devices/clock.c
@@ -11,22 +11,10 @@ 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;
- }
+ 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;
}
@@ -34,8 +22,7 @@ u8 get_timer_high(ClockTimer *t) {
if (t->end > uptime) {
t->read = t->end - uptime;
} else {
- t->end = 0;
- t->read = 0;
+ t->end = 0; t->read = 0;
}
return HIGH(t->read);
}
@@ -56,25 +43,6 @@ void set_timer_low(ClockTimer *t, u8 low) {
}
}
-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);
diff --git a/arm9/source/devices/clock.h b/arm9/source/devices/clock.h
index 892479f..04c4d5d 100644
--- a/arm9/source/devices/clock.h
+++ b/arm9/source/devices/clock.h
@@ -1,8 +1,8 @@
+#include <time.h>
+
#ifndef CLOCK_H_
#define CLOCK_H_
- #include <time.h>
-
typedef struct {
u32 end; // real end time
u16 read, write; // read write caches
@@ -27,20 +27,9 @@
bool check_timers(ClockDevice *clk);
- u8 get_timer1_high(ClockDevice *clock);
- u8 get_timer1_low( ClockDevice *clock);
- u8 get_timer2_high(ClockDevice *clock);
- u8 get_timer2_low( ClockDevice *clock);
- u8 get_timer3_high(ClockDevice *clock);
- u8 get_timer3_low( ClockDevice *clock);
- u8 get_timer4_high(ClockDevice *clock);
- u8 get_timer4_low( ClockDevice *clock);
- void set_timer1_high(ClockDevice *clock, u8 high);
- void set_timer1_low( ClockDevice *clock, u8 low);
- void set_timer2_high(ClockDevice *clock, u8 high);
- void set_timer2_low( ClockDevice *clock, u8 low);
- void set_timer3_high(ClockDevice *clock, u8 high);
- void set_timer3_low( ClockDevice *clock, u8 low);
- void set_timer4_high(ClockDevice *clock, u8 high);
- void set_timer4_low( ClockDevice *clock, u8 low);
+ u8 get_timer_high(ClockTimer *t);
+ u8 get_timer_low( ClockTimer *t);
+ void set_timer_high(ClockTimer *t, u8 high);
+ void set_timer_low( ClockTimer *t, u8 low);
+
#endif