pokecrystal-board/home/time.asm

289 lines
4.0 KiB
NASM
Raw Normal View History

; Functions relating to the timer interrupt and the real-time-clock.
2018-06-24 07:09:41 -07:00
AskTimer::
push af
ldh a, [hMobile]
and a
2015-11-17 20:29:14 -08:00
jr z, .not_mobile
call Timer
2015-11-17 20:29:14 -08:00
.not_mobile
pop af
reti
2018-06-24 07:09:41 -07:00
LatchClock::
; latch clock counter data
ld a, 0
ld [MBC3LatchClock], a
ld a, 1
ld [MBC3LatchClock], a
ret
2018-06-24 07:09:41 -07:00
UpdateTime::
call GetClock
call FixDays
call FixTime
2017-12-24 09:47:30 -08:00
farcall GetTimeOfDay
ret
2018-06-24 07:09:41 -07:00
GetClock::
; store clock data in hRTCDayHi-hRTCSeconds
; enable clock r/w
ld a, SRAM_ENABLE
ld [MBC3SRamEnable], a
; clock data is 'backwards' in hram
call LatchClock
ld hl, MBC3SRamBank
ld de, MBC3RTC
ld [hl], RTC_S
ld a, [de]
2016-05-15 18:50:31 -07:00
maskbits 60
ldh [hRTCSeconds], a
ld [hl], RTC_M
ld a, [de]
2016-05-15 18:50:31 -07:00
maskbits 60
ldh [hRTCMinutes], a
ld [hl], RTC_H
ld a, [de]
2016-05-15 18:50:31 -07:00
maskbits 24
ldh [hRTCHours], a
ld [hl], RTC_DL
ld a, [de]
ldh [hRTCDayLo], a
ld [hl], RTC_DH
ld a, [de]
ldh [hRTCDayHi], a
; unlatch clock / disable clock r/w
call CloseSRAM
ret
2018-06-24 07:09:41 -07:00
FixDays::
; fix day count
; mod by 140
; check if day count > 255 (bit 8 set)
ldh a, [hRTCDayHi] ; DH
bit 0, a
jr z, .daylo
; reset dh (bit 8)
res 0, a
2020-01-31 17:59:48 -08:00
ldh [hRTCDayHi], a
; mod 140
; mod twice since bit 8 (DH) was set
2020-01-31 17:59:48 -08:00
ldh a, [hRTCDayLo]
.modh
sub 140
jr nc, .modh
.modl
sub 140
jr nc, .modl
add 140
; update dl
2020-01-31 17:59:48 -08:00
ldh [hRTCDayLo], a
2015-11-20 08:47:52 -08:00
; flag for sRTCStatusFlags
ld a, %01000000
jr .set
.daylo
; quit if fewer than 140 days have passed
2020-01-31 17:59:48 -08:00
ldh a, [hRTCDayLo]
cp 140
jr c, .quit
; mod 140
.mod
sub 140
jr nc, .mod
add 140
; update dl
2020-01-31 17:59:48 -08:00
ldh [hRTCDayLo], a
2015-11-20 08:47:52 -08:00
; flag for sRTCStatusFlags
ld a, %00100000
.set
; update clock with modded day value
push af
call SetClock
pop af
scf
ret
.quit
xor a
ret
2018-06-24 07:09:41 -07:00
FixTime::
; add ingame time (set at newgame) to current time
2018-01-23 14:39:09 -08:00
; store time in wCurDay, hHours, hMinutes, hSeconds
; second
2020-01-31 17:59:48 -08:00
ldh a, [hRTCSeconds]
ld c, a
2018-01-23 14:39:09 -08:00
ld a, [wStartSecond]
add c
sub 60
jr nc, .updatesec
add 60
.updatesec
ldh [hSeconds], a
; minute
ccf ; carry is set, so turn it off
2020-01-31 17:59:48 -08:00
ldh a, [hRTCMinutes]
ld c, a
2018-01-23 14:39:09 -08:00
ld a, [wStartMinute]
adc c
sub 60
jr nc, .updatemin
add 60
.updatemin
ldh [hMinutes], a
; hour
ccf ; carry is set, so turn it off
2020-01-31 17:59:48 -08:00
ldh a, [hRTCHours]
ld c, a
2018-01-23 14:39:09 -08:00
ld a, [wStartHour]
adc c
sub 24
jr nc, .updatehr
add 24
.updatehr
ldh [hHours], a
; day
ccf ; carry is set, so turn it off
2020-01-31 17:59:48 -08:00
ldh a, [hRTCDayLo]
ld c, a
2018-01-23 14:39:09 -08:00
ld a, [wStartDay]
adc c
2018-01-23 14:39:09 -08:00
ld [wCurDay], a
ret
2018-06-24 07:09:41 -07:00
InitTimeOfDay::
xor a
2018-01-23 14:39:09 -08:00
ld [wStringBuffer2], a
2020-01-31 17:59:48 -08:00
ld a, 0 ; useless
2018-01-23 14:39:09 -08:00
ld [wStringBuffer2 + 3], a
2015-12-18 17:07:09 -08:00
jr InitTime
2018-06-24 07:09:41 -07:00
InitDayOfWeek::
call UpdateTime
ldh a, [hHours]
2018-01-23 14:39:09 -08:00
ld [wStringBuffer2 + 1], a
ldh a, [hMinutes]
2018-01-23 14:39:09 -08:00
ld [wStringBuffer2 + 2], a
ldh a, [hSeconds]
2018-01-23 14:39:09 -08:00
ld [wStringBuffer2 + 3], a
2015-12-18 17:07:09 -08:00
jr InitTime ; useless
2018-06-24 07:09:41 -07:00
InitTime::
2017-12-24 09:47:30 -08:00
farcall _InitTime
ret
2018-06-24 07:09:41 -07:00
PanicResetClock::
2015-11-17 20:29:14 -08:00
call .ClearhRTC
call SetClock
ret
2018-06-24 07:09:41 -07:00
.ClearhRTC:
xor a
ldh [hRTCSeconds], a
ldh [hRTCMinutes], a
ldh [hRTCHours], a
ldh [hRTCDayLo], a
ldh [hRTCDayHi], a
ret
2018-06-24 07:09:41 -07:00
SetClock::
; set clock data from hram
; enable clock r/w
ld a, SRAM_ENABLE
ld [MBC3SRamEnable], a
; set clock data
; stored 'backwards' in hram
call LatchClock
ld hl, MBC3SRamBank
ld de, MBC3RTC
; seems to be a halt check that got partially commented out
; this block is totally pointless
ld [hl], RTC_DH
ld a, [de]
bit 6, a ; halt
ld [de], a
; seconds
ld [hl], RTC_S
ldh a, [hRTCSeconds]
ld [de], a
; minutes
ld [hl], RTC_M
ldh a, [hRTCMinutes]
ld [de], a
; hours
ld [hl], RTC_H
ldh a, [hRTCHours]
ld [de], a
; day lo
ld [hl], RTC_DL
ldh a, [hRTCDayLo]
ld [de], a
; day hi
ld [hl], RTC_DH
ldh a, [hRTCDayHi]
res 6, a ; make sure timer is active
ld [de], a
; cleanup
call CloseSRAM ; unlatch clock, disable clock r/w
ret
2018-06-24 07:09:41 -07:00
ClearRTCStatus::
2015-11-20 08:47:52 -08:00
; clear sRTCStatusFlags
xor a
push af
2015-11-20 08:47:52 -08:00
ld a, BANK(sRTCStatusFlags)
call GetSRAMBank
pop af
2015-11-20 08:47:52 -08:00
ld [sRTCStatusFlags], a
call CloseSRAM
ret
2018-06-24 07:09:41 -07:00
RecordRTCStatus::
2015-11-20 08:47:52 -08:00
; append flags to sRTCStatusFlags
ld hl, sRTCStatusFlags
push af
2015-11-20 08:47:52 -08:00
ld a, BANK(sRTCStatusFlags)
call GetSRAMBank
pop af
or [hl]
ld [hl], a
call CloseSRAM
ret
2018-06-24 07:09:41 -07:00
CheckRTCStatus::
2015-11-20 08:47:52 -08:00
; check sRTCStatusFlags
ld a, BANK(sRTCStatusFlags)
call GetSRAMBank
2015-11-20 08:47:52 -08:00
ld a, [sRTCStatusFlags]
call CloseSRAM
ret