summaryrefslogtreecommitdiff
path: root/engine/rtc/rtc.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/rtc/rtc.asm')
-rw-r--r--engine/rtc/rtc.asm198
1 files changed, 198 insertions, 0 deletions
diff --git a/engine/rtc/rtc.asm b/engine/rtc/rtc.asm
new file mode 100644
index 000000000..4a8aab50a
--- /dev/null
+++ b/engine/rtc/rtc.asm
@@ -0,0 +1,198 @@
+Unreferenced_StopRTC:
+ ld a, SRAM_ENABLE
+ ld [MBC3SRamEnable], a
+ call LatchClock
+ ld a, RTC_DH
+ ld [MBC3SRamBank], a
+ ld a, [MBC3RTC]
+ set 6, a ; halt
+ ld [MBC3RTC], a
+ call CloseSRAM
+ ret
+
+StartRTC:
+ ld a, SRAM_ENABLE
+ ld [MBC3SRamEnable], a
+ call LatchClock
+ ld a, RTC_DH
+ ld [MBC3SRamBank], a
+ ld a, [MBC3RTC]
+ res 6, a ; halt
+ ld [MBC3RTC], a
+ call CloseSRAM
+ ret
+
+GetTimeOfDay::
+; get time of day based on the current hour
+ ld a, [hHours] ; hour
+ ld hl, TimesOfDay
+
+.check
+; if we're within the given time period,
+; get the corresponding time of day
+ cp [hl]
+ jr c, .match
+; else, get the next entry
+ inc hl
+ inc hl
+; try again
+ jr .check
+
+.match
+; get time of day
+ inc hl
+ ld a, [hl]
+ ld [wTimeOfDay], a
+ ret
+
+TimesOfDay:
+; hours for the time of day
+; 0400-0959 morn | 1000-1759 day | 1800-0359 nite
+ db MORN_HOUR, NITE_F
+ db DAY_HOUR, MORN_F
+ db NITE_HOUR, DAY_F
+ db MAX_HOUR, NITE_F
+ db -1, MORN_F
+
+Unreferenced_1404e:
+ db 20, NITE_F
+ db 40, MORN_F
+ db 60, DAY_F
+ db -1, MORN_F
+
+StageRTCTimeForSave:
+ call UpdateTime
+ ld hl, wRTC
+ ld a, [wCurDay]
+ ld [hli], a
+ ld a, [hHours]
+ ld [hli], a
+ ld a, [hMinutes]
+ ld [hli], a
+ ld a, [hSeconds]
+ ld [hli], a
+ ret
+
+SaveRTC:
+ ld a, $a
+ ld [MBC3SRamEnable], a
+ call LatchClock
+ ld hl, MBC3RTC
+ ld a, $c
+ ld [MBC3SRamBank], a
+ res 7, [hl]
+ ld a, BANK(sRTCStatusFlags)
+ ld [MBC3SRamBank], a
+ xor a
+ ld [sRTCStatusFlags], a
+ call CloseSRAM
+ ret
+
+StartClock::
+ call GetClock
+ call Function1409b
+ call FixDays
+ jr nc, .skip_set
+ ; bit 5: Day count exceeds 139
+ ; bit 6: Day count exceeds 255
+ call RecordRTCStatus ; set flag on sRTCStatusFlags
+
+.skip_set
+ call StartRTC
+ ret
+
+Function1409b:
+ ld hl, hRTCDayHi
+ bit 7, [hl]
+ jr nz, .set_bit_7
+ bit 6, [hl]
+ jr nz, .set_bit_7
+ xor a
+ ret
+
+.set_bit_7
+ ; Day count exceeds 16383
+ ld a, %10000000
+ call RecordRTCStatus ; set bit 7 on sRTCStatusFlags
+ ret
+
+Function140ae:
+ call CheckRTCStatus
+ ld c, a
+ and %11000000 ; Day count exceeded 255 or 16383
+ jr nz, .time_overflow
+
+ ld a, c
+ and %00100000 ; Day count exceeded 139
+ jr z, .dont_update
+
+ call UpdateTime
+ ld a, [wRTC + 0]
+ ld b, a
+ ld a, [wCurDay]
+ cp b
+ jr c, .dont_update
+
+.time_overflow
+ farcall ClearDailyTimers
+ farcall Function170923
+; mobile
+ ld a, 5 ; MBC30 bank used by JP Crystal; inaccessible by MBC3
+ call GetSRAMBank
+ ld a, [$aa8c] ; address of MBC30 bank
+ inc a
+ ld [$aa8c], a ; address of MBC30 bank
+ ld a, [$b2fa] ; address of MBC30 bank
+ inc a
+ ld [$b2fa], a ; address of MBC30 bank
+ call CloseSRAM
+ ret
+
+.dont_update
+ xor a
+ ret
+
+_InitTime::
+ call GetClock
+ call FixDays
+ ld hl, hRTCSeconds
+ ld de, wStartSecond
+
+ ld a, [wStringBuffer2 + 3]
+ sub [hl]
+ dec hl
+ jr nc, .okay_secs
+ add 60
+.okay_secs
+ ld [de], a
+ dec de
+
+ ld a, [wStringBuffer2 + 2]
+ sbc [hl]
+ dec hl
+ jr nc, .okay_mins
+ add 60
+.okay_mins
+ ld [de], a
+ dec de
+
+ ld a, [wStringBuffer2 + 1]
+ sbc [hl]
+ dec hl
+ jr nc, .okay_hrs
+ add 24
+.okay_hrs
+ ld [de], a
+ dec de
+
+ ld a, [wStringBuffer2]
+ sbc [hl]
+ dec hl
+ jr nc, .okay_days
+ add 140
+ ld c, 7
+ call SimpleDivide
+
+.okay_days
+ ld [de], a
+ ret