ref: 5147e6c0a2ee53bc96942ad7ab200afe8840ba24
dir: /engine/time.asm/
; Functions relating to the timer interrupt and the real-time-clock. AskTimer: ; 591 push af ld a, [$ffe9] and a jr z, .asm_59a call Timer .asm_59a pop af reti ; 59c LatchClock: ; 59c ; latch clock counter data ld a, 0 ld [MBC3LatchClock], a ld a, 1 ld [MBC3LatchClock], a ret ; 5a7 UpdateTime: ; 5a7 call GetClock call FixDays call FixTime callba GetTimeOfDay ret ; 5b7 GetClock: ; 5b7 ; 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] and $3f ld [hRTCSeconds], a ld [hl], RTC_M ld a, [de] and $3f ld [hRTCMinutes], a ld [hl], RTC_H ld a, [de] and $1f ld [hRTCHours], a ld [hl], RTC_DL ld a, [de] ld [hRTCDayLo], a ld [hl], RTC_DH ld a, [de] ld [hRTCDayHi], a ; unlatch clock / disable clock r/w call CloseSRAM ret ; 5e8 FixDays: ; 5e8 ; fix day count ; mod by 140 ; check if day count > 255 (bit 8 set) ld a, [hRTCDayHi] ; DH bit 0, a jr z, .daylo ; reset dh (bit 8) res 0, a ld [hRTCDayHi], a ; DH ; mod 140 ; mod twice since bit 8 (DH) was set ld a, [hRTCDayLo] ; DL .modh sub 140 jr nc, .modh .modl sub 140 jr nc, .modl add 140 ; update dl ld [hRTCDayLo], a ; DL ; unknown output ld a, $40 ; %1000000 jr .set .daylo ; quit if fewer than 140 days have passed ld a, [hRTCDayLo] ; DL cp 140 jr c, .quit ; mod 140 .mod sub 140 jr nc, .mod add 140 ; update dl ld [hRTCDayLo], a ; DL ; unknown output ld a, $20 ; %100000 .set ; update clock with modded day value push af call SetClock pop af scf ret .quit xor a ret ; 61d FixTime: ; 61d ; add ingame time (set at newgame) to current time ; day hr min sec ; store time in CurDay, hHours, hMinutes, hSeconds ; second ld a, [hRTCSeconds] ; S ld c, a ld a, [StartSecond] add c sub 60 jr nc, .updatesec add 60 .updatesec ld [hSeconds], a ; minute ccf ; carry is set, so turn it off ld a, [hRTCMinutes] ; M ld c, a ld a, [StartMinute] adc c sub 60 jr nc, .updatemin add 60 .updatemin ld [hMinutes], a ; hour ccf ; carry is set, so turn it off ld a, [hRTCHours] ; H ld c, a ld a, [StartHour] adc c sub 24 jr nc, .updatehr add 24 .updatehr ld [hHours], a ; day ccf ; carry is set, so turn it off ld a, [hRTCDayLo] ; DL ld c, a ld a, [StartDay] adc c ld [CurDay], a ret ; 658 Function658: ; 658 xor a ld [StringBuffer2], a ld a, $0 ld [$d089], a jr .asm_677 call UpdateTime ld a, [hHours] ld [$d087], a ld a, [hMinutes] ld [$d088], a ld a, [hSeconds] ld [$d089], a jr .asm_677 .asm_677 ld a, $5 ld hl, $40ed rst FarCall ret ; 67e Function67e: ; 67e call Function685 call SetClock ret ; 685 Function685: ; 685 xor a ld [hRTCSeconds], a ld [hRTCMinutes], a ld [hRTCHours], a ld [hRTCDayLo], a ld [hRTCDayHi], a ret ; 691 SetClock: ; 691 ; 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 ld a, [hRTCSeconds] ld [de], a ; minutes ld [hl], RTC_M ld a, [hRTCMinutes] ld [de], a ; hours ld [hl], RTC_H ld a, [hRTCHours] ld [de], a ; day lo ld [hl], RTC_DL ld a, [hRTCDayLo] ld [de], a ; day hi ld [hl], RTC_DH ld a, [hRTCDayHi] res 6, a ; make sure timer is active ld [de], a ; cleanup call CloseSRAM ; unlatch clock, disable clock r/w ret ; 6c4 Function6c4: ; 6c4 xor a push af ld a, $0 call GetSRAMBank pop af ld [$ac60], a call CloseSRAM ret ; 6d3 Function6d3: ; 6d3 ld hl, $ac60 push af ld a, $0 call GetSRAMBank pop af or [hl] ld [hl], a call CloseSRAM ret ; 6e3 Function6e3: ; 6e3 ld a, $0 call GetSRAMBank ld a, [$ac60] call CloseSRAM ret ; 6ef