summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/6F9B10.h16
-rw-r--r--include/lb_reki.h34
-rw-r--r--linker_scripts/jp/symbol_addrs_code.txt18
-rw-r--r--src/code/lb_reki.c218
-rw-r--r--yamls/jp/code.yaml5
5 files changed, 264 insertions, 27 deletions
diff --git a/include/6F9B10.h b/include/6F9B10.h
deleted file mode 100644
index 5a43230..0000000
--- a/include/6F9B10.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef C_6F9B10_H
-#define C_6F9B10_H
-
-#include "ultra64.h"
-
-// void func_800D5E70_jp();
-// void func_800D5EA8_jp();
-// void func_800D5EE4_jp();
-// void func_800D5EFC_jp();
-// void func_800D5F28_jp();
-// void func_800D5F44_jp();
-// void func_800D5FA0_jp();
-// void func_800D60E4_jp();
-// void func_800D6218_jp();
-
-#endif
diff --git a/include/lb_reki.h b/include/lb_reki.h
new file mode 100644
index 0000000..60973cc
--- /dev/null
+++ b/include/lb_reki.h
@@ -0,0 +1,34 @@
+#ifndef LB_REKI_H
+#define LB_REKI_H
+
+#include "ultra64.h"
+#include "lb_rtc.h"
+
+typedef struct lbRekiPhase {
+ /* 0x00 */ lbRTC_month_t month;
+ /* 0x01 */ lbRTC_day_t day;
+} lbRekiPhase; // size = 0x2
+
+#define lbRk_YEAR_MIN GAME_YEAR_MIN
+#define lbRk_YEAR_MAX GAME_YEAR_MAX
+#define lbRk_YEAR_NUM ((lbRk_YEAR_MAX - lbRk_YEAR_MIN) + 1)
+
+#define lbRk_KYUU_MONTH_START 1
+#define lbRk_KYUU_MONTH_END 12
+#define lbRk_KYUU_LEAP_MONTH 13
+
+#define lbRk_HARVEST_MOON_YEAR_MIN 2002
+#define lbRk_HARVEST_MOON_YEAR_MAX 2030
+
+#define lbRk_KYUU_DAY_START 1
+
+s32 lbRk_SeirekiDays(s32 year, s32 month);
+lbRekiPhase* lbRk_ToSeiyoMonthAndDay(s32 year, s32 month);
+s32 lbRk_KyuurekiLeapDays(s32 year);
+s32 lbRk_IsKyuurekiLeapYear(s32 year);
+s32 lbRk_IsLeapMonth(s32 month);
+s32 lbRk_IsLeapOnNextMonth(s32 year, s32 month);
+s32 lbRk_KyuurekiDays(s32 year, s32 month);
+s32 lbRk_ToSeiyouReki(lbRTC_ymd_t* seiyoTime, const lbRTC_ymd_t* kyuuTime);
+s32 lbRk_ToKyuuReki(lbRTC_ymd_t* kyuuTime, const lbRTC_ymd_t* seiyoTime);
+#endif
diff --git a/linker_scripts/jp/symbol_addrs_code.txt b/linker_scripts/jp/symbol_addrs_code.txt
index 5279e01..0ae845d 100644
--- a/linker_scripts/jp/symbol_addrs_code.txt
+++ b/linker_scripts/jp/symbol_addrs_code.txt
@@ -3482,15 +3482,15 @@ lbRTC_Sub_Date = 0x800D5C84; // type:func
lbRTC_Week = 0x800D5CF8; // type:func
lbRTC_TimeCopy = 0x800D5D6C; // type:func
lbRTC_IsValidTime = 0x800D5D94; // type:func
-func_800D5E70_jp = 0x800D5E70; // type:func
-func_800D5EA8_jp = 0x800D5EA8; // type:func
-func_800D5EE4_jp = 0x800D5EE4; // type:func
-func_800D5EFC_jp = 0x800D5EFC; // type:func
-func_800D5F28_jp = 0x800D5F28; // type:func
-func_800D5F44_jp = 0x800D5F44; // type:func
-func_800D5FA0_jp = 0x800D5FA0; // type:func
-func_800D60E4_jp = 0x800D60E4; // type:func
-func_800D6218_jp = 0x800D6218; // type:func
+lbRk_SeirekiDays = 0x800D5E70; // type:func
+lbRk_ToSeiyoMonthAndDay = 0x800D5EA8; // type:func
+lbRk_KyuurekiLeapDays = 0x800D5EE4; // type:func
+lbRk_IsKyuurekiLeapYear = 0x800D5EFC; // type:func
+lbRk_IsLeapMonth = 0x800D5F28; // type:func
+lbRk_IsLeapOnNextMonth = 0x800D5F44; // type:func
+lbRk_KyuurekiDays = 0x800D5FA0; // type:func
+lbRk_ToSeiyouReki = 0x800D60E4; // type:func
+lbRk_ToKyuuReki = 0x800D6218; // type:func
func_800D6390_jp = 0x800D6390; // type:func
func_800D63A4_jp = 0x800D63A4; // type:func
func_800D6410_jp = 0x800D6410; // type:func
diff --git a/src/code/lb_reki.c b/src/code/lb_reki.c
new file mode 100644
index 0000000..1ff0f48
--- /dev/null
+++ b/src/code/lb_reki.c
@@ -0,0 +1,218 @@
+#include "lb_reki.h"
+#include "attributes.h"
+
+lbRTC_day_t t_seiyo_days_tbl[2][lbRTC_MONTHS_MAX + 1] = {
+ { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, /* Standard days for each month */
+ { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, /* Days for each month during leap year */
+};
+
+// clang-format off
+lbRekiPhase l_lbRk_ConvertTable[lbRk_YEAR_NUM][lbRk_KYUU_LEAP_MONTH] = {
+ /* 2000 */ {{2, 5}, {3, 6}, {4, 5}, {5, 4}, {6, 2}, {7, 2}, {7, 31}, {8, 29}, { 9, 28}, {10, 27}, {11, 26}, {12, 26}, { 0, 0}},
+ /* 2001 */ {{1, 24}, {2, 23}, {3, 25}, {4, 24}, {6, 21}, {7, 21}, {8, 19}, {9, 17}, {10, 17}, {11, 15}, {12, 15}, { 1, 13}, { 5, 23}},
+ /* 2002 */ {{2, 12}, {3, 14}, {4, 13}, {5, 12}, {6, 11}, {7, 10}, {8, 9}, {9, 7}, {10, 6}, {11, 5}, {12, 4}, { 1, 3}, { 0, 0}},
+ /* 2003 */ {{2, 1}, {3, 3}, {4, 2}, {5, 1}, {5, 31}, {6, 30}, {7, 29}, {8, 28}, { 9, 29}, {10, 25}, {11, 24}, {12, 23}, { 0, 0}},
+ /* 2004 */ {{1, 22}, {2, 20}, {4, 19}, {5, 19}, {6, 18}, {7, 17}, {8, 16}, {9, 14}, {10, 14}, {11, 12}, {12, 12}, { 1, 10}, { 3, 21}},
+ /* 2005 */ {{2, 9}, {3, 10}, {4, 9}, {5, 8}, {6, 7}, {7, 6}, {8, 5}, {9, 4}, {10, 3}, {11, 2}, {12, 2}, {12, 31}, { 0, 0}},
+ /* 2006 */ {{1, 29}, {2, 28}, {3, 29}, {4, 28}, {5, 27}, {6, 26}, {7, 25}, {9, 22}, {10, 22}, {11, 21}, {12, 20}, { 1, 19}, { 8, 24}},
+ /* 2007 */ {{2, 18}, {3, 19}, {4, 17}, {5, 17}, {6, 15}, {7, 14}, {8, 13}, {9, 11}, {10, 11}, {11, 10}, {12, 10}, { 1, 8}, { 0, 0}},
+ /* 2008 */ {{2, 7}, {3, 8}, {4, 6}, {5, 5}, {6, 4}, {7, 3}, {8, 1}, {8, 31}, { 9, 29}, {10, 29}, {11, 28}, {12, 27}, { 0, 0}},
+ /* 2009 */ {{1, 26}, {2, 25}, {3, 27}, {4, 25}, {5, 24}, {7, 22}, {8, 20}, {9, 19}, {10, 18}, {11, 17}, {12, 16}, { 1, 15}, { 6, 23}},
+ /* 2010 */ {{2, 14}, {3, 16}, {4, 14}, {5, 14}, {6, 12}, {7, 12}, {8, 10}, {9, 8}, {10, 8}, {11, 6}, {12, 6}, { 1, 4}, { 0, 0}},
+ /* 2011 */ {{2, 3}, {3, 5}, {4, 3}, {5, 3}, {6, 2}, {7, 1}, {7, 31}, {8, 29}, { 9, 27}, {10, 27}, {11, 25}, {12, 25}, { 0, 0}},
+ /* 2012 */ {{1, 23}, {2, 22}, {3, 22}, {5, 21}, {6, 20}, {7, 19}, {8, 18}, {9, 16}, {10, 15}, {11, 14}, {12, 13}, { 1, 12}, { 4, 21}},
+ /* 2013 */ {{2, 10}, {3, 12}, {4, 10}, {5, 10}, {6, 9}, {7, 8}, {8, 7}, {9, 5}, {10, 5}, {11, 3}, {12, 3}, { 1, 1}, { 0, 0}},
+ /* 2014 */ {{1, 31}, {3, 1}, {3, 31}, {4, 29}, {5, 29}, {6, 27}, {7, 27}, {8, 25}, { 9, 24}, {11, 22}, {12, 22}, { 1, 20}, {10, 24}},
+ /* 2015 */ {{2, 19}, {3, 20}, {4, 19}, {5, 18}, {6, 16}, {7, 16}, {8, 14}, {9, 13}, {10, 13}, {11, 12}, {12, 11}, { 1, 10}, { 0, 0}},
+ /* 2016 */ {{2, 8}, {3, 9}, {4, 7}, {5, 7}, {6, 5}, {7, 4}, {8, 3}, {9, 1}, {10, 1}, {10, 31}, {11, 29}, {12, 29}, { 0, 0}},
+ /* 2017 */ {{1, 28}, {2, 26}, {3, 28}, {4, 26}, {5, 26}, {7, 23}, {8, 22}, {9, 20}, {10, 20}, {11, 18}, {12, 18}, { 1, 17}, { 6, 24}},
+ /* 2018 */ {{2, 16}, {3, 17}, {4, 16}, {5, 15}, {6, 14}, {7, 13}, {8, 11}, {9, 10}, {10, 9}, {11, 8}, {12, 27}, { 1, 6}, { 0, 0}},
+ /* 2019 */ {{2, 5}, {3, 7}, {4, 5}, {5, 5}, {6, 3}, {7, 3}, {8, 1}, {8, 30}, { 9, 29}, {10, 28}, {11, 27}, {12, 26}, { 0, 0}},
+ /* 2020 */ {{1, 25}, {2, 24}, {3, 24}, {4, 23}, {6, 21}, {7, 21}, {8, 19}, {9, 17}, {10, 17}, {11, 15}, {12, 15}, { 1, 13}, { 5, 23}},
+ /* 2021 */ {{2, 12}, {3, 13}, {4, 12}, {5, 12}, {6, 10}, {7, 10}, {8, 8}, {9, 7}, {10, 6}, {11, 5}, {12, 4}, { 1, 3}, { 0, 0}},
+ /* 2022 */ {{2, 1}, {3, 3}, {4, 1}, {5, 1}, {5, 30}, {6, 29}, {7, 29}, {8, 27}, { 9, 26}, {10, 25}, {11, 24}, {12, 23}, { 0, 0}},
+ /* 2023 */ {{1, 22}, {2, 20}, {3, 22}, {5, 20}, {6, 18}, {7, 18}, {8, 16}, {9, 15}, {10, 15}, {11, 13}, {12, 13}, { 1, 11}, { 4, 20}},
+ /* 2024 */ {{2, 10}, {3, 10}, {4, 9}, {5, 8}, {6, 6}, {7, 6}, {8, 4}, {9, 3}, {10, 3}, {11, 1}, {12, 1}, {12, 31}, { 0, 0}},
+ /* 2025 */ {{1, 29}, {2, 28}, {3, 29}, {4, 28}, {5, 27}, {6, 25}, {8, 23}, {9, 22}, {10, 21}, {11, 20}, {12, 20}, { 1, 19}, { 7, 25}},
+ /* 2026 */ {{2, 17}, {3, 19}, {4, 17}, {5, 17}, {6, 15}, {7, 14}, {8, 13}, {9, 11}, {10, 11}, {11, 9}, {12, 9}, { 1, 8}, { 0, 0}},
+ /* 2027 */ {{2, 7}, {3, 8}, {4, 7}, {5, 6}, {6, 5}, {7, 4}, {8, 2}, {9, 1}, { 9, 30}, {10, 29}, {11, 28}, {12, 28}, { 0, 0}},
+ /* 2028 */ {{1, 27}, {2, 25}, {3, 26}, {4, 25}, {5, 24}, {7, 22}, {8, 20}, {9, 19}, {10, 18}, {11, 16}, {12, 16}, { 1, 15}, { 6, 23}},
+ /* 2029 */ {{2, 13}, {3, 15}, {4, 14}, {5, 13}, {6, 12}, {7, 12}, {8, 10}, {9, 8}, {10, 8}, {11, 6}, {12, 5}, { 1, 4}, { 0, 0}},
+ /* 2030 */ {{2, 3}, {3, 4}, {4, 3}, {5, 2}, {6, 1}, {7, 1}, {7, 30}, {8, 29}, { 9, 27}, {10, 27}, {11, 25}, {12, 25}, { 0, 0}},
+ /* 2031 */ {{1, 23}, {2, 22}, {3, 23}, {4, 22}, {6, 20}, {7, 19}, {8, 18}, {9, 17}, {10, 16}, {11, 15}, {12, 14}, { 1, 13}, { 5, 21}},
+ /* 2032 */ {{2, 11}, {3, 12}, {4, 10}, {5, 9}, {6, 8}, {7, 7}, {8, 6}, {9, 5}, {10, 4}, {11, 3}, {12, 3}, { 1, 1}, { 0, 0}},
+};
+// clang-format on
+
+s32 l_lbRk_leapdays[lbRk_YEAR_NUM] = {
+ 0, 29, 0, 0, 29, 0, 29, 0, 0, 29, 0, 0, 30, 0, 29, 0, 0, 29, 0, 0, 29, 0, 0, 30, 0, 29, 0, 0, 29, 0, 0, 30, 0,
+};
+
+s32 lbRk_SeirekiDays(s32 year, s32 month) {
+ s32 idx = 0;
+
+ if ((year % 4) == 0) {
+ idx = 1;
+ }
+
+ return t_seiyo_days_tbl[idx][month];
+}
+
+lbRekiPhase* lbRk_ToSeiyoMonthAndDay(s32 year, s32 month) {
+ return &l_lbRk_ConvertTable[year - lbRk_YEAR_MIN][month - 1];
+}
+
+s32 lbRk_KyuurekiLeapDays(s32 year) {
+ return l_lbRk_leapdays[year - lbRk_YEAR_MIN];
+}
+
+s32 lbRk_IsKyuurekiLeapYear(s32 year) {
+ if (l_lbRk_leapdays[year - lbRk_YEAR_MIN] != 0) {
+ return 1;
+ };
+
+ return 0;
+}
+
+s32 lbRk_IsLeapMonth(s32 month) {
+ if (month == lbRk_KYUU_LEAP_MONTH) {
+ return 1;
+ }
+
+ return 0;
+}
+
+s32 lbRk_IsLeapOnNextMonth(s32 year, s32 month) {
+ if ((lbRk_ToSeiyoMonthAndDay(year, month)->month + 1) ==
+ (l_lbRk_ConvertTable[year - lbRk_YEAR_MIN][lbRTC_MONTHS_MAX].month)) {
+ return 1;
+ }
+ return 0;
+}
+
+s32 lbRk_KyuurekiDays(s32 year, s32 month) {
+ lbRekiPhase* seiyoDay;
+ lbRekiPhase* nextSeiyo;
+ s32 days;
+
+ seiyoDay = lbRk_ToSeiyoMonthAndDay(year, month);
+
+ if (lbRk_IsLeapMonth(month) == TRUE) {
+ return lbRk_KyuurekiLeapDays(year);
+ }
+
+ if (month != lbRTC_MONTHS_MAX) {
+ if (lbRk_IsLeapOnNextMonth(year, month) == TRUE) {
+ nextSeiyo = lbRk_ToSeiyoMonthAndDay(year, lbRk_KYUU_LEAP_MONTH);
+ } else {
+ nextSeiyo = lbRk_ToSeiyoMonthAndDay(year, month + 1);
+ }
+ } else {
+ nextSeiyo = lbRk_ToSeiyoMonthAndDay(year + 1, 1);
+ }
+
+ if (seiyoDay->month == nextSeiyo->month) {
+ days = nextSeiyo->day - seiyoDay->day;
+ } else {
+ if (seiyoDay->month < month) {
+ year += 1;
+ }
+ days = lbRk_SeirekiDays(year, seiyoDay->month) - seiyoDay->day;
+ if ((nextSeiyo->month - seiyoDay->month) >= 2) {
+ days += lbRk_SeirekiDays(year, seiyoDay->month + 1);
+ }
+ days += nextSeiyo->day;
+ }
+ return days;
+}
+
+s32 lbRk_ToSeiyouReki(lbRTC_ymd_t* seiyoTime, const lbRTC_ymd_t* kyuuTime) {
+ s32 pad UNUSED;
+ s32 rekiDays;
+ s32 year;
+ s32 month;
+ s32 day;
+ lbRekiPhase* seiyoDay;
+
+ if ((kyuuTime->year < 1) || (kyuuTime->year > lbRk_YEAR_MAX)) {
+ return FALSE;
+ }
+ if (kyuuTime->month > lbRk_KYUU_LEAP_MONTH) {
+ return FALSE;
+ }
+ if (lbRk_IsKyuurekiLeapYear(kyuuTime->year) == FALSE && kyuuTime->month >= lbRk_KYUU_LEAP_MONTH) {
+ return FALSE;
+ }
+ if (lbRk_KyuurekiDays(kyuuTime->year, kyuuTime->month) < kyuuTime->day) {
+ return FALSE;
+ }
+
+ seiyoDay = lbRk_ToSeiyoMonthAndDay(kyuuTime->year, kyuuTime->month);
+
+ year = kyuuTime->year;
+ month = seiyoDay->month;
+ day = seiyoDay->day + kyuuTime->day - 1;
+
+ rekiDays = lbRk_SeirekiDays(year, month);
+
+ if (day > rekiDays) {
+ month++;
+ day -= rekiDays;
+ if (month > lbRTC_MONTHS_MAX) {
+ month = 1;
+ }
+ }
+
+ if (month < kyuuTime->month && kyuuTime->month != lbRk_KYUU_LEAP_MONTH) {
+ year++;
+ }
+
+ seiyoTime->year = year;
+ seiyoTime->month = month;
+ seiyoTime->day = day;
+
+ return TRUE;
+}
+
+s32 lbRk_ToKyuuReki(lbRTC_ymd_t* kyuuTime, const lbRTC_ymd_t* seiyoTime) {
+ lbRTC_ymd_t kyuuDate = { lbRk_YEAR_MIN, lbRk_KYUU_MONTH_START, lbRk_KYUU_DAY_START };
+ lbRTC_ymd_t seyioDate;
+
+ while (TRUE) {
+
+ if (lbRk_ToSeiyouReki(&seyioDate, &kyuuDate) == FALSE) {
+ return FALSE;
+ }
+
+ if (seyioDate.day == seiyoTime->day && seyioDate.month == seiyoTime->month &&
+ seyioDate.year == seiyoTime->year) {
+ kyuuTime->day = kyuuDate.day;
+ kyuuTime->month = kyuuDate.month;
+ kyuuTime->year = kyuuDate.year;
+ return TRUE;
+ }
+
+ kyuuDate.day++;
+
+ if (lbRk_KyuurekiDays(kyuuDate.year, kyuuDate.month) < kyuuDate.day) {
+ kyuuDate.day = 1;
+ kyuuDate.month++;
+
+ if (lbRk_IsKyuurekiLeapYear(kyuuDate.year) == FALSE) {
+ if (kyuuDate.month > lbRk_KYUU_MONTH_END) {
+ kyuuDate.month = 1;
+ kyuuDate.year++;
+ if (kyuuDate.year > lbRk_YEAR_MAX) {
+ return FALSE;
+ }
+ }
+ } else if (kyuuDate.month > lbRk_KYUU_LEAP_MONTH) {
+ kyuuDate.month = 1;
+ kyuuDate.year++;
+ if (kyuuDate.year > lbRk_YEAR_MAX) {
+ return FALSE;
+ }
+ }
+ }
+ }
+}
diff --git a/yamls/jp/code.yaml b/yamls/jp/code.yaml
index 79a3588..005cad3 100644
--- a/yamls/jp/code.yaml
+++ b/yamls/jp/code.yaml
@@ -96,7 +96,7 @@
- [0x6F7580, asm, code/graph]
- [0x6F83B0, c, code/irqmgr]
- [0x6F8A60, c, code/lb_rtc]
- - [0x6F9B10, asm, code/6F9B10]
+ - [0x6F9B10, c, code/lb_reki]
- [0x6FA030, asm, code/listalloc]
- [0x6FA180, asm, code/main]
- [0x6FA6B0, asm, code/padmgr]
@@ -163,7 +163,8 @@
- [0x732C40, data, code/732C40]
- [0x732C50, .data, code/irqmgr]
- [0x732C70, .data, code/lb_rtc]
- - [0x732C80, data, code/732C80]
+ - [0x732C80, .data, code/lb_reki]
+ - [0x733080, data, code/733080]
- [0x733160, .data, code/sys_math_atan]
- [0x733970, .data, code/sys_matrix]
- [0x7339F0, .data, code/sys_ucode]