Files
pokecrystal/engine/rtc/rtc.asm

195 lines
2.7 KiB
NASM

StopRTC: ; unreferenced
ld a, RAMG_SRAM_ENABLE
ld [rRAMG], a
call LatchClock
ld a, RAMB_RTC_DH
ld [rRAMB], a
ld a, [rRTCREG]
set B_RAMB_RTC_DH_HALT, a
ld [rRTCREG], a
call CloseSRAM
ret
StartRTC:
ld a, RAMG_SRAM_ENABLE
ld [rRAMG], a
call LatchClock
ld a, RAMB_RTC_DH
ld [rRAMB], a
ld a, [rRTCREG]
res B_RAMB_RTC_DH_HALT, a
ld [rRTCREG], a
call CloseSRAM
ret
GetTimeOfDay::
; get time of day based on the current hour
ldh 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
BetaTimesOfDay: ; unreferenced
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
ldh a, [hHours]
ld [hli], a
ldh a, [hMinutes]
ld [hli], a
ldh a, [hSeconds]
ld [hli], a
ret
SaveRTC:
ld a, RAMG_SRAM_ENABLE
ld [rRAMG], a
call LatchClock
ld hl, rRTCREG
ld a, RAMB_RTC_DH
ld [rRAMB], a
res B_RAMB_RTC_DH_CARRY, [hl]
ld a, BANK(sRTCStatusFlags)
ld [rRAMB], a
xor a
ld [sRTCStatusFlags], a
call CloseSRAM
ret
StartClock::
call GetClock
call _FixDays
call FixDays
jr nc, .skip_set
call RecordRTCStatus
.skip_set
call StartRTC
ret
_FixDays:
ld hl, hRTCDayHi
bit B_RAMB_RTC_DH_CARRY, [hl]
jr nz, .reset_rtc
bit B_RAMB_RTC_DH_HALT, [hl]
jr nz, .reset_rtc
xor a
ret
.reset_rtc
ld a, RTC_RESET
call RecordRTCStatus
ret
ClockContinue:
call CheckRTCStatus
ld c, a
and RTC_RESET | RTC_DAYS_EXCEED_255
jr nz, .time_overflow
ld a, c
and RTC_DAYS_EXCEED_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
ld a, BANK(s5_aa8c) ; aka BANK(s5_b2fa)
call OpenSRAM
ld a, [s5_aa8c]
inc a
ld [s5_aa8c], a
ld a, [s5_b2fa]
inc a
ld [s5_b2fa], a
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