summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
Diffstat (limited to 'engine')
-rwxr-xr-xengine/events/overworld.asm20
-rwxr-xr-xengine/events/specials.asm2
-rw-r--r--engine/menus/intro_menu.asm8
-rw-r--r--engine/menus/naming_screen.asm6
-rwxr-xr-xengine/overworld/map_object_action.asm2
-rw-r--r--engine/overworld/overworld.asm504
-rwxr-xr-xengine/overworld/player_movement.asm2
-rwxr-xr-xengine/overworld/time.asm4
-rw-r--r--engine/rtc/rtc.asm210
9 files changed, 736 insertions, 22 deletions
diff --git a/engine/events/overworld.asm b/engine/events/overworld.asm
index 086587b2..f4e420bb 100755
--- a/engine/events/overworld.asm
+++ b/engine/events/overworld.asm
@@ -416,7 +416,7 @@ UsedSurfScript:
closetext
readmem wBuffer2
writevar VAR_MOVEMENT
- special ReplacePlayerSprite
+ special ReplaceChrisSprite
special PlayMapMusic
; step into the water (slow_step DIR, step_end)
special SurfStartStep
@@ -537,7 +537,7 @@ TryToFly:
ld de, ENGINE_STORMBADGE
call FieldMoveBadgeCheck
jr c, .asm_caa4
- call GetMapPermission
+ call GetMapEnvironment
call CheckOutdoorMap
jr z, .asm_ca83
jr .asm_caa7
@@ -597,7 +597,7 @@ FlyScript:
newloadmap MAPSETUP_TELEPORT
callasm FlyToAnimation
special WaitSFX
- special ReplacePlayerSprite
+ special ReplaceChrisSprite
callasm Function1415c
end
@@ -737,7 +737,7 @@ asm_cbaa:
dw FailToEscapeFromDungeon
TryEscapeFromDungeon:
- call GetMapPermission
+ call GetMapEnvironment
cp CAVE
jr z, .asm_cbcf
cp DUNGEON
@@ -853,7 +853,7 @@ TeleportFunction:
dw FailTeleport
TryTeleport:
- call GetMapPermission
+ call GetMapEnvironment
call CheckOutdoorMap
jr z, .asm_cc85
jr .asm_cc9c
@@ -1556,7 +1556,7 @@ PutTheRodAway: ; d096
ld a, $1
ld [wPlayerAction], a
call UpdateSprites
- call ReplacePlayerSprite
+ call ReplaceChrisSprite
ret
Text_OhABite:
@@ -1637,7 +1637,7 @@ ChooseScriptBasedOnWhetherBikeIsRegistered: ; d126 (3:5126)
ret
CheckBikePermission: ; d12e (3:512e)
- call GetMapPermission
+ call GetMapEnvironment
call CheckOutdoorMap
jr z, .asm_d140
cp CAVE
@@ -1664,13 +1664,13 @@ Script_GetOnBike: ; d14b
writetext GotOnBikeText
waitbutton
closetext
- special ReplacePlayerSprite
+ special ReplaceChrisSprite
end
Script_GetOnBike_Register:
loadvar VAR_MOVEMENT, PLAYER_BIKE
closetext
- special ReplacePlayerSprite
+ special ReplaceChrisSprite
end
nop
@@ -1684,7 +1684,7 @@ Script_GetOffBike:
waitbutton
FinishGettingOffBike:
closetext
- special ReplacePlayerSprite
+ special ReplaceChrisSprite
special PlayMapMusic
end
diff --git a/engine/events/specials.asm b/engine/events/specials.asm
index 770b8cfb..8b7243d1 100755
--- a/engine/events/specials.asm
+++ b/engine/events/specials.asm
@@ -85,7 +85,7 @@ SpecialsPointers:
add_special UpdateTimePals
add_special ClearTilemap
add_special UpdateSprites
- add_special ReplacePlayerSprite
+ add_special ReplaceChrisSprite
add_special GameCornerPrizeMonCheckDex
add_special UnusedSetSeenMon
add_special WaitSFX, $03
diff --git a/engine/menus/intro_menu.asm b/engine/menus/intro_menu.asm
index 41b93708..763b4fbb 100644
--- a/engine/menus/intro_menu.asm
+++ b/engine/menus/intro_menu.asm
@@ -961,7 +961,7 @@ ShrinkPlayer: ; 6123 (1:6123)
ld c, 3
call DelayFrames
- call Intro_PlacePlayerSprite
+ call Intro_PlaceChrisSprite
call LoadFontsExtra
ld c, 50
@@ -1059,9 +1059,9 @@ ShrinkFrame: ; 61f7 (1:61f7)
predef PlaceGraphic
ret
-Intro_PlacePlayerSprite: ; 6210 (1:6210)
- ld de, PlayerSpriteGFX
- lb bc, BANK(PlayerSpriteGFX), 12
+Intro_PlaceChrisSprite: ; 6210 (1:6210)
+ ld de, ChrisSpriteGFX
+ lb bc, BANK(ChrisSpriteGFX), 12
ld hl, $8000
call Request2bpp
ld hl, wVirtualOAM
diff --git a/engine/menus/naming_screen.asm b/engine/menus/naming_screen.asm
index d5b35a8e..55c6ca82 100644
--- a/engine/menus/naming_screen.asm
+++ b/engine/menus/naming_screen.asm
@@ -112,7 +112,7 @@ Function11b2a:
db "NICKNAME?@"
Function11b79:
- ld de, PlayerSpriteGFX ; $4000
+ ld de, ChrisSpriteGFX ; $4000
call Function11c11
hlcoord 5, 2
ld de, .String
@@ -174,7 +174,7 @@ Function11bda:
Function11c11: ; 11c11 (4:5c11)
push de
ld hl, $8000
- lb bc, BANK(PlayerSpriteGFX), 4
+ lb bc, BANK(ChrisSpriteGFX), 4
call Request2bpp
pop de
ld hl, $c0
@@ -182,7 +182,7 @@ Function11c11: ; 11c11 (4:5c11)
ld e, l
ld d, h
ld hl, $8040
- lb bc, BANK(PlayerSpriteGFX), 4
+ lb bc, BANK(ChrisSpriteGFX), 4
call Request2bpp
xor a
ld hl, wMisc
diff --git a/engine/overworld/map_object_action.asm b/engine/overworld/map_object_action.asm
index f895fe15..7701ec4f 100755
--- a/engine/overworld/map_object_action.asm
+++ b/engine/overworld/map_object_action.asm
@@ -216,7 +216,7 @@ Function4597:
ret
Function459e:
- ld a, [wd558]
+ ld a, [wVariableSprites + SPRITE_BIG_DOLL - SPRITE_VARS]
ld d, $17
cp $33
jr z, .asm_45ad
diff --git a/engine/overworld/overworld.asm b/engine/overworld/overworld.asm
new file mode 100644
index 00000000..fec0b95a
--- /dev/null
+++ b/engine/overworld/overworld.asm
@@ -0,0 +1,504 @@
+_ReplaceChrisSprite::
+ call GetChrisSprite
+ ld a, [wUsedSprites]
+ ld c, a
+ ld a, [wUsedSprites + 1]
+ ld b, a
+ call GetUsedSprite
+ ret
+
+Function1414b::
+ ld hl, wSpriteFlags
+ ld a, [hl]
+ push af
+ res 7, [hl]
+ set 6, [hl]
+ call LoadUsedSpritesGFX
+ pop af
+ ld [wSpriteFlags], a
+ ret
+
+Function1415c::
+ ld hl, wSpriteFlags
+ ld a, [hl]
+ push af
+ set 7, [hl]
+ res 6, [hl]
+ call LoadUsedSpritesGFX
+ pop af
+ ld [wSpriteFlags], a
+ ret
+
+RefreshSprites::
+ call .Refresh
+ call LoadUsedSpritesGFX
+ ret
+
+.Refresh:
+ xor a
+ ld bc, SPRITE_GFX_LIST_CAPACITY * 2
+ ld hl, wUsedSprites
+ call ByteFill
+ call GetChrisSprite
+ call AddMapSprites
+ ret
+
+GetChrisSprite:
+ ld a, [wPlayerState]
+ ld c, a
+; Get Chris's sprite.
+ ld hl, ChrisStateSprites
+.loop
+ ld a, [hli]
+ cp c
+ jr z, .good
+ inc hl
+ cp -1
+ jr nz, .loop
+
+; Any player state not in the array defaults to Chris's sprite.
+ xor a ; ld a, PLAYER_NORMAL
+ ld [wPlayerState], a
+ ld a, SPRITE_CHRIS
+ jr .finish
+
+.good
+ ld a, [hl]
+
+.finish
+ ld [wUsedSprites + 0], a
+ ld [wPlayerSprite], a
+ ld [wPlayerObjectSprite], a
+ ret
+
+INCLUDE "data/sprites/player_sprites.asm"
+
+AddMapSprites:
+ call GetMapEnvironment
+ call CheckOutdoorMap
+ jr z, .outdoor
+ call AddIndoorSprites
+ ret
+
+.outdoor
+ call AddOutdoorSprites
+ ret
+
+AddIndoorSprites:
+ ld hl, wMap2ObjectSprite
+ ld a, 2
+.loop
+ push af
+ ld a, [hl]
+ call AddSpriteGFX
+ ld de, MAPOBJECT_LENGTH
+ add hl, de
+ pop af
+ inc a
+ cp NUM_OBJECTS
+ jr nz, .loop
+ ret
+
+AddOutdoorSprites:
+ ld a, [wMapGroup]
+ dec a
+ ld c, a
+ ld b, 0
+ ld hl, OutdoorSprites
+ add hl, bc
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld c, MAX_OUTDOOR_SPRITES
+.loop
+ push bc
+ ld a, [hli]
+ call AddSpriteGFX
+ pop bc
+ dec c
+ jr nz, .loop
+
+ ld a, [wd05a]
+ ld c, a
+ ret
+
+AddSpriteGFX:
+ and a
+ ret z
+
+ ld c, a
+ call _DoesSpriteHaveFacings
+ jr nc, .nope
+
+ ld de, wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 2) * 2
+ ld b, 2
+ call Function14212
+ jr nc, .ok
+
+.nope:
+ ld de, wUsedSprites + 2
+ ld b, SPRITE_GFX_LIST_CAPACITY - 3
+ call Function14212
+ jr .ok
+
+.ok:
+ ret
+
+Function14212:
+.loop
+ ld a, [de]
+ and a
+ jr z, .new
+
+ cp c
+ jr z, .exists
+
+ inc de
+ inc de
+ dec b
+ jr nz, .loop
+
+ scf
+ ret
+
+.new:
+ ld a, c
+ ld [de], a
+ xor a
+ ret
+
+.exists:
+ xor a
+ ret
+
+LoadUsedSpritesGFX:
+ ld a, MAPCALLBACK_SPRITES
+ call RunMapCallback
+ call GetUsedSprites
+ ret c
+
+ call Function14265
+ call LoadMiscTiles
+ ret
+
+GetUsedSprites:
+ xor a
+ ldh [hUsedSpriteTile], a
+ ld hl, wUsedSprites
+ ld a, $a
+
+.loop
+ push af
+ ld a, [hli]
+ ldh [hUsedSpriteIndex], a
+ and a
+ jr z, .dont_set
+
+ call GetSprite
+ push hl
+ push bc
+ ldh a, [hUsedSpriteTile]
+ call CopyToVram
+ pop bc
+ pop hl
+ ldh a, [hUsedSpriteTile]
+ ld [hl], a
+ add c
+ ldh [hUsedSpriteTile], a
+ cp $80
+ jr nc, .done
+
+.dont_set
+ inc hl
+ pop af
+ dec a
+ jr nz, .loop
+
+ xor a
+ ret
+
+.done
+ pop af
+ scf
+ ret
+
+Function14265:
+ ld a, [wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 2) * 2]
+ and a
+ jr z, .asm_14274
+
+ call GetSprite
+ ld hl, vTiles0 tile $78
+ call Get2bpp
+
+.asm_14274
+ ld a, $78
+ ld [wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 2) * 2 + 1], a
+ ld a, [wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 1) * 2]
+ and a
+ jr z, .asm_14288
+
+ call GetSprite
+ ld hl, vTiles0 tile $7c
+ call Get2bpp
+
+.asm_14288
+ ld a, $7c
+ ld [wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 1) * 2 + 1], a
+ ret
+
+LoadMiscTiles:
+ ld a, [wSpriteFlags]
+ bit 6, a
+ ret nz
+
+ ld c, EMOTE_SHADOW
+ farcall LoadEmote
+ call GetMapEnvironment
+ call CheckOutdoorMap
+ ld c, EMOTE_GRASS_RUSTLE
+ jr z, .outdoor
+ ld c, EMOTE_BOULDER_DUST
+.outdoor
+ farcall LoadEmote
+ ret
+
+GetSprite:
+ call GetMonSprite
+ ret c
+
+ push hl
+ ld hl, OverworldSprites + SPRITEDATA_ADDR
+ dec a
+ ld c, a
+ ld b, 0
+ ld a, NUM_SPRITEDATA_FIELDS
+ call AddNTimes
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ swap a
+ ld c, a
+ ld b, [hl]
+ pop hl
+ ret
+
+GetMonSprite:
+; Return carry if a monster sprite was loaded.
+
+ cp SPRITE_POKEMON
+ jr c, .Normal
+ cp SPRITE_DAY_CARE_MON_1
+ jr z, .BreedMon1
+ cp SPRITE_DAY_CARE_MON_2
+ jr z, .BreedMon2
+ cp SPRITE_VARS
+ jr nc, .Variable
+ jr .Icon
+
+.Normal:
+ and a
+ ret
+
+.Icon:
+ push hl
+ sub SPRITE_POKEMON
+ ld e, a
+ ld d, 0
+ ld hl, SpriteMons
+ add hl, de
+ ld a, [hl]
+ pop hl
+ jr .Mon
+
+.BreedMon1
+ ld a, [wBreedMon1Species]
+ jr .Mon
+
+.BreedMon2
+ ld a, [wBreedMon2Species]
+
+.Mon:
+ ld e, a
+ and a
+ jr z, .NoBreedmon
+
+ push hl
+ farcall LoadOverworldMonIcon
+ pop hl
+
+ scf
+ ret
+
+.Variable:
+ push hl
+ sub SPRITE_VARS
+ ld e, a
+ ld d, 0
+ ld hl, wVariableSprites
+ add hl, de
+ ld a, [hl]
+ pop hl
+ and a
+ jp nz, GetMonSprite
+
+.NoBreedmon:
+ ld a, 1
+ and a
+ ret
+
+_DoesSpriteHaveFacings::
+; Checks to see whether we can apply a facing to a sprite.
+; Returns carry unless the sprite is a Pokemon or a Still Sprite.
+ cp SPRITE_POKEMON
+ jr nc, .only_down
+
+ push hl
+ push bc
+ ld hl, OverworldSprites + SPRITEDATA_TYPE
+ dec a
+ ld c, a
+ ld b, 0
+ ld a, NUM_SPRITEDATA_FIELDS
+ call AddNTimes
+ ld a, [hl]
+ pop bc
+ pop hl
+ cp STILL_SPRITE
+ jr nz, .only_down
+ scf
+ ret
+
+.only_down
+ and a
+ ret
+
+_GetSpritePalette::
+ ld a, c
+ call GetMonSprite
+ jr c, .is_pokemon
+
+ ld hl, OverworldSprites + SPRITEDATA_PALETTE
+ dec a
+ ld c, a
+ ld b, 0
+ ld a, NUM_SPRITEDATA_FIELDS
+ call AddNTimes
+ ld c, [hl]
+ ret
+
+.is_pokemon
+ xor a
+ ld c, a
+ ret
+
+CopyToVram:
+ ld l, a
+ ld h, 0
+rept 4
+ add hl, hl
+endr
+ ld a, l
+ add LOW(vTiles0)
+ ld l, a
+ ld a, h
+ adc HIGH(vTiles0)
+ ld h, a
+ push hl
+ push de
+ push bc
+ ld a, [wSpriteFlags]
+ bit 7, a
+ jr nz, .skip
+ call Get2bpp
+
+.skip:
+ pop bc
+ ld l, c
+ ld h, 0
+rept 4
+ add hl, hl
+endr
+ pop de
+ add hl, de
+ ld e, l
+ ld d, h
+ pop hl
+ ld a, h
+ add HIGH(vTiles1 - vTiles0)
+ ld h, a
+ ldh a, [hUsedSpriteIndex]
+ call _DoesSpriteHaveFacings
+ jr c, .done
+
+ ld a, [wSpriteFlags]
+ bit 6, a
+ jr nz, .done
+
+ call Get2bpp
+
+.done:
+ ret
+
+Function1438a:
+ ld a, c
+ jr GetUsedSprite
+
+ ld a, c
+ ld b, 0
+ jr GetUsedSprite
+
+ ld a, c
+ ld b, 12
+ jr GetUsedSprite
+
+GetUsedSprite:
+ push bc
+ ld a, c
+ ldh [hUsedSpriteIndex], a
+ call GetSprite
+ pop af
+ call CopyToVram
+ ret
+
+LoadEmote::
+; Get the address of the pointer to emote c.
+ ld a, c
+ ld bc, 6 ; sizeof(emote)
+ ld hl, Emotes
+ call AddNTimes
+; Load the emote address into de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+; load the length of the emote (in tiles) into c
+ inc hl
+ ld c, [hl]
+ swap c
+; load the emote pointer bank into b
+ inc hl
+ ld b, [hl]
+; load the VRAM destination into hl
+ inc hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+; if the emote has a length of 0, do not proceed (error handling)
+ ld a, c
+ and a
+ ret z
+ call Get2bpp
+ ret
+
+INCLUDE "data/sprites/emotes.asm"
+
+INCLUDE "gfx/emotes.asm"
+
+INCLUDE "data/sprites/sprite_mons.asm"
+
+INCLUDE "data/maps/outdoor_sprites.asm"
+
+INCLUDE "data/sprites/sprites.asm"
diff --git a/engine/overworld/player_movement.asm b/engine/overworld/player_movement.asm
index 579ae6f9..1ac7fc6a 100755
--- a/engine/overworld/player_movement.asm
+++ b/engine/overworld/player_movement.asm
@@ -700,7 +700,7 @@ Function103f9: ; 103f9 (4:43f9)
push bc
ld a, $0
ld [wPlayerState], a
- call ReplacePlayerSprite
+ call ReplaceChrisSprite
pop bc
ret
diff --git a/engine/overworld/time.asm b/engine/overworld/time.asm
index 9cce323c..6324420f 100755
--- a/engine/overworld/time.asm
+++ b/engine/overworld/time.asm
@@ -137,12 +137,12 @@ CheckBugContestTimer:
Function118c9: ; 118c9 (4:58c9)
call UpdateTime
- ld hl, wStartDay
+ ld hl, wTimerEventStartDay
call CopyDayToHL
ret
CheckPokerusTick:
- ld hl, wStartDay
+ ld hl, wTimerEventStartDay
call CalcDaysSince
call Function119b4
and a
diff --git a/engine/rtc/rtc.asm b/engine/rtc/rtc.asm
new file mode 100644
index 00000000..4f9bdcbb
--- /dev/null
+++ b/engine/rtc/rtc.asm
@@ -0,0 +1,210 @@
+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
+ 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
+
+Unreferenced_14044:
+ 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
+
+UnreferencedSaveRTC:
+ 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 SaveRTC
+ call GetClock
+ call Function1409e
+ 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
+
+Function1409e:
+ 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
+
+SaveRTC:
+ ld a, $a
+ ld [MBC3SRamEnable], a
+ call LatchClock
+ ld a, $c
+ ld [MBC3SRamBank], a
+ ld a, [MBC3RTC]
+ push af
+ call CloseSRAM
+ pop af
+ bit 6, a
+ ret z
+
+ ld a, BANK(sRTCStatusFlags)
+ call OpenSRAM
+ ld a, $34
+ ld [s0_b7ef], a
+ ld a, $12
+ ld [s0_b7f0], a
+ call CloseSRAM
+ ret
+
+ClockContinue:
+ 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
+ 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