ref: d7bf70f3c902ce9380e05ccd6828b5e8973d4ae1
parent: 72ff6fd0b0a76c66d0ed3fcfb529ab178836ebbc
author: yenatch <[email protected]>
date: Thu Nov 28 21:30:08 EST 2013
home.o
--- a/Makefile
+++ b/Makefile
@@ -9,6 +9,7 @@
CRYSTAL_OBJS := \
wram.o \
main.o \
+home.o \
audio.o \
maps_crystal.o \
engine/events.o \
--- /dev/null
+++ b/home.asm
@@ -1,0 +1,3400 @@
+INCLUDE "includes.asm"
+
+
+SECTION "Hardware", ROM0
+
+INCLUDE "rst.asm"
+INCLUDE "interrupts.asm"
+
+
+SECTION "Header", ROM0[$100]
+
+Start:
+ nop
+ jp _Start
+
+
+SECTION "Home", ROM0[$150]
+
+INCLUDE "home/init.asm"
+INCLUDE "home/vblank.asm"
+INCLUDE "home/delay.asm"
+INCLUDE "home/rtc.asm"
+INCLUDE "home/fade.asm"
+INCLUDE "home/lcd.asm"
+INCLUDE "home/time.asm"
+INCLUDE "home/serial.asm"
+INCLUDE "home/joypad.asm"
+INCLUDE "home/decompress.asm"
+INCLUDE "home/palettes.asm"
+INCLUDE "home/copy.asm"
+INCLUDE "home/text.asm"
+INCLUDE "home/video.asm"
+INCLUDE "home/map_objects.asm"
+INCLUDE "home/sine.asm"
+INCLUDE "home/movement.asm"
+INCLUDE "home/tilemap.asm"
+INCLUDE "home/menu.asm"
+INCLUDE "home/handshake.asm"
+INCLUDE "home/game_time.asm"
+INCLUDE "home/map.asm"
+
+
+Function2d43: ; 2d43
+; Inexplicably empty.
+; Seen in PredefPointers.
+ rept 16
+ nop
+ endr
+ ret
+; 2d54
+
+
+INCLUDE "home/farcall.asm"
+INCLUDE "home/predef.asm"
+INCLUDE "home/window.asm"
+
+
+Function2e4e: ; 2e4e
+ scf
+ ret
+; 2e50
+
+
+INCLUDE "home/flag.asm"
+
+
+Function2ebb: ; 2ebb
+ ld a, [$c2cc]
+ bit 1, a
+ ret z
+ ld a, [hJoyDown]
+ bit A_BUTTON, a
+ ret
+; 2ec6
+
+
+Function2ec6: ; 2ec6
+ xor a
+ ret
+; 2ec8
+
+Function2ec8: ; 2ec8
+ xor a
+ dec a
+ ret
+; 2ecb
+
+Function2ecb: ; 2ecb
+ push hl
+ ld hl, $c2cc
+ bit 1, [hl]
+ pop hl
+ ret
+; 2ed3
+
+
+Function2ed3: ; 0x2ed3
+; disables overworld sprite updating?
+ xor a
+ ld [$ffde], a
+ ld a, [VramState]
+ res 0, a
+ ld [VramState], a
+ ld a, $0
+ ld [$c2ce], a
+ ret
+; 0x2ee4
+
+Function2ee4: ; 2ee4
+ ld a, $1
+ ld [$c2ce], a
+ ld a, [VramState]
+ set 0, a
+ ld [VramState], a
+ ld a, $1
+ ld [$ffde], a
+ ret
+; 2ef6
+
+
+INCLUDE "home/string.asm"
+
+
+IsInJohto: ; 2f17
+; Return 0 if the player is in Johto, and 1 in Kanto.
+
+ ld a, [MapGroup]
+ ld b, a
+ ld a, [MapNumber]
+ ld c, a
+ call GetWorldMapLocation
+
+ cp FAST_SHIP
+ jr z, .Johto
+
+ cp SPECIAL_MAP
+ jr nz, .CheckRegion
+
+ ld a, [BackupMapGroup]
+ ld b, a
+ ld a, [BackupMapNumber]
+ ld c, a
+ call GetWorldMapLocation
+
+.CheckRegion
+ cp KANTO_LANDMARK
+ jr nc, .Kanto
+
+.Johto
+ xor a
+ ret
+
+.Kanto
+ ld a, 1
+ ret
+; 2f3e
+
+
+Function2f3e: ; 2f3e
+ ret
+; 2f3f
+
+
+INCLUDE "home/item.asm"
+INCLUDE "home/random.asm"
+INCLUDE "home/sram.asm"
+
+
+; Register aliases
+
+_hl_: ; 2fec
+ jp [hl]
+; 2fed
+
+_de_: ; 2fed
+ push de
+ ret
+; 2fef
+
+
+INCLUDE "home/double_speed.asm"
+
+
+ClearSprites: ; 300b
+; Erase OAM data
+ ld hl, Sprites
+ ld b, SpritesEnd - Sprites
+ xor a
+.loop
+ ld [hli], a
+ dec b
+ jr nz, .loop
+ ret
+; 3016
+
+HideSprites: ; 3016
+; Set all OAM y-positions to 160 to hide them offscreen
+ ld hl, Sprites
+ ld de, 4 ; length of an OAM struct
+ ld b, (SpritesEnd - Sprites) / 4 ; number of OAM structs
+ ld a, 160 ; y
+.loop
+ ld [hl], a
+ add hl, de
+ dec b
+ jr nz, .loop
+ ret
+; 3026
+
+
+INCLUDE "home/copy2.asm"
+
+
+Function309d: ; 309d
+ ld a, [rSVBK]
+ push af
+ ld a, 2
+ ld [rSVBK], a
+ ld hl, TileMap
+ ld de, $d000
+ ld bc, 360
+ call CopyBytes
+ pop af
+ ld [rSVBK], a
+ ret
+; 30b4
+
+Function30b4: ; 30b4
+ xor a
+ ld [hBGMapMode], a
+ call Function30bf
+ ld a, 1
+ ld [hBGMapMode], a
+ ret
+; 30bf
+
+Function30bf: ; 30bf
+ ld a, [rSVBK]
+ push af
+ ld a, 2
+ ld [rSVBK], a
+ ld hl, $d000
+ ld de, TileMap
+ ld bc, 360
+ call CopyBytes
+ pop af
+ ld [rSVBK], a
+ ret
+; 30d6
+
+
+CopyName1: ; 30d6
+ ld hl, StringBuffer2
+
+CopyName2: ; 30d9
+.loop
+ ld a, [de]
+ inc de
+ ld [hli], a
+ cp "@"
+ jr nz, .loop
+ ret
+; 30e1
+
+IsInArray: ; 30e1
+; Find value a for every de bytes in array hl.
+; Return index in b and carry if found.
+
+ ld b, 0
+ ld c, a
+.loop
+ ld a, [hl]
+ cp $ff
+ jr z, .NotInArray
+ cp c
+ jr z, .InArray
+ inc b
+ add hl, de
+ jr .loop
+
+.NotInArray
+ and a
+ ret
+
+.InArray
+ scf
+ ret
+; 30f4
+
+SkipNames: ; 0x30f4
+; skips n names where n = a
+ ld bc, $000b ; name length
+ and a
+ ret z
+.loop
+ add hl, bc
+ dec a
+ jr nz, .loop
+ ret
+; 0x30fe
+
+AddNTimes: ; 0x30fe
+; adds bc n times where n = a
+ and a
+ ret z
+.loop
+ add hl, bc
+ dec a
+ jr nz, .loop
+ ret
+; 0x3105
+
+
+INCLUDE "home/math.asm"
+
+
+PrintLetterDelay: ; 313d
+; Wait before printing the next letter.
+
+; The text speed setting in Options is actually a frame count:
+; fast: 1 frame
+; mid: 3 frames
+; slow: 5 frames
+
+; $cfcf[!0] and A or B override text speed with a one-frame delay.
+; Options[4] and $cfcf[!1] disable the delay.
+
+; delay off?
+ ld a, [Options]
+ bit 4, a
+ ret nz
+
+; non-scrolling text?
+ ld a, [$cfcf]
+ bit 1, a
+ ret z
+
+ push hl
+ push de
+ push bc
+
+ ld hl, hOAMUpdate
+ ld a, [hl]
+ push af
+
+; orginally turned oam update off...
+; ld a, 1
+ ld [hl], a
+
+; force fast scroll?
+ ld a, [$cfcf]
+ bit 0, a
+ jr z, .fast
+
+; text speed
+ ld a, [Options]
+ and %111
+ jr .updatedelay
+
+.fast
+ ld a, 1
+
+.updatedelay
+ ld [TextDelayFrames], a
+
+.checkjoypad
+ call GetJoypadPublic
+
+; input override
+ ld a, [$c2d7]
+ and a
+ jr nz, .wait
+
+; Wait one frame if holding A or B.
+ ld a, [hJoyDown]
+ bit 0, a ; A_BUTTON
+ jr z, .checkb
+ jr .delay
+.checkb
+ bit 1, a ; B_BUTTON
+ jr z, .wait
+
+.delay
+ call DelayFrame
+ jr .end
+
+.wait
+ ld a, [TextDelayFrames]
+ and a
+ jr nz, .checkjoypad
+
+.end
+ pop af
+ ld [hOAMUpdate], a
+ pop bc
+ pop de
+ pop hl
+ ret
+; 318c
+
+
+CopyDataUntil: ; 318c
+; Copy [hl .. bc) to [de .. de + bc - hl).
+
+; In other words, the source data is
+; from hl up to but not including bc,
+; and the destination is de.
+
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, h
+ cp b
+ jr nz, CopyDataUntil
+ ld a, l
+ cp c
+ jr nz, CopyDataUntil
+ ret
+; 0x3198
+
+
+PrintNum: ; 3198
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(_PrintNum)
+ rst Bankswitch
+
+ call _PrintNum
+
+ pop af
+ rst Bankswitch
+ ret
+; 31a4
+
+
+Function31a4: ; 31a4
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(Function1061ef)
+ rst Bankswitch
+
+ call Function1061ef
+
+ pop af
+ rst Bankswitch
+ ret
+; 31b0
+
+
+FarPrintText: ; 31b0
+ ld [hBuffer], a
+ ld a, [hROMBank]
+ push af
+ ld a, [hBuffer]
+ rst Bankswitch
+
+ call PrintText
+
+ pop af
+ rst Bankswitch
+ ret
+; 31be
+
+
+CallPointerAt: ; 31be
+ ld a, [hROMBank]
+ push af
+ ld a, [hli]
+ rst Bankswitch
+
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+ call _hl_
+
+ pop hl
+ ld a, h
+ rst Bankswitch
+ ret
+; 31cd
+
+
+Function31cd: ; 31cd
+; Push pointer hl in the current bank to $d0e8.
+ ld a, [hROMBank]
+
+Function31cf: ; 31cf
+; Push pointer a:hl to $d0e8.
+ ld [$d0e8], a
+ ld a, l
+ ld [$d0e9], a
+ ld a, h
+ ld [$d0ea], a
+ ret
+; 31db
+
+
+StringCmp: ; 31db
+; Compare c bytes at de and hl.
+; Return z if they all match.
+ ld a, [de]
+ cp [hl]
+ ret nz
+ inc de
+ inc hl
+ dec c
+ jr nz, StringCmp
+ ret
+; 0x31e4
+
+
+CompareLong: ; 31e4
+; Compare bc bytes at de and hl.
+; Return carry if they all match.
+
+ ld a, [de]
+ cp [hl]
+ jr nz, .Diff
+
+ inc de
+ inc hl
+ dec bc
+
+ ld a, b
+ or c
+ jr nz, CompareLong
+
+ scf
+ ret
+
+.Diff
+ and a
+ ret
+; 31f3
+
+
+WhiteBGMap: ; 31f3
+ call ClearPalettes
+WaitBGMap: ; 31f6
+; Tell VBlank to update BG Map
+ ld a, 1 ; BG Map 0 tiles
+ ld [hBGMapMode], a
+; Wait for it to do its magic
+ ld c, 4
+ call DelayFrames
+ ret
+; 3200
+
+Function3200: ; 0x3200
+ ld a, [hCGB]
+ and a
+ jr z, .asm_320e
+ ld a, 2
+ ld [hBGMapMode], a
+ ld c, 4
+ call DelayFrames
+
+.asm_320e
+ ld a, 1
+ ld [hBGMapMode], a
+ ld c, 4
+ call DelayFrames
+ ret
+; 0x3218
+
+
+Function3218: ; 3218
+ ld a, [hCGB]
+ and a
+ ret
+; 321c
+
+
+Function321c: ; 321c
+ ld a, [hCGB]
+ and a
+ jr z, .asm_322e
+
+ ld a, [$c2ce]
+ cp 0
+ jr z, .asm_322e
+
+ ld a, 1
+ ld [hBGMapMode], a
+ jr Function323d
+
+.asm_322e
+ ld a, 1
+ ld [hBGMapMode], a
+ ld c, 4
+ call DelayFrames
+ ret
+; 3238
+
+Function3238: ; 3238
+ ld a, [hCGB]
+ and a
+ jr z, WaitBGMap
+
+Function323d: ; 323d
+ jr Function3246
+; 323f
+
+Function323f: ; 323f
+ callba Function104000
+ ret
+; 3246
+
+Function3246: ; 3246
+ ld a, [hBGMapMode]
+ push af
+ xor a
+ ld [hBGMapMode], a
+ ld a, [$ffde]
+ push af
+ xor a
+ ld [$ffde], a
+.asm_3252
+ ld a, [rLY]
+ cp $7f
+ jr c, .asm_3252 ; 3256 $fa
+ di
+ ld a, $1
+ ld [rVBK], a
+ ld hl, AttrMap
+ call Function327b
+ ld a, $0
+ ld [rVBK], a
+ ld hl, TileMap
+ call Function327b
+.asm_326d
+ ld a, [rLY]
+ cp $7f
+ jr c, .asm_326d ; 3271 $fa
+ ei
+ pop af
+ ld [$ffde], a
+ pop af
+ ld [hBGMapMode], a
+ ret
+; 327b
+
+Function327b: ; 327b
+ ld [hSPBuffer], sp
+ ld sp, hl
+ ld a, [$ffd7]
+ ld h, a
+ ld l, $0
+ ld a, $12
+ ld [$ffd3], a
+ ld b, $2
+ ld c, $41
+.asm_328c
+ pop de
+
+rept 9
+.loop\@
+ ld a, [$ff00+c]
+ and b
+ jr nz, .loop\@
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc l
+ pop de
+endr
+
+.asm_32de
+ ld a, [$ff00+c]
+ and b
+ jr nz, .asm_32de
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc l
+
+ ld de, $000c
+ add hl, de
+ ld a, [$ffd3]
+ dec a
+ ld [$ffd3], a
+ jr nz, .asm_328c
+ ld a, [hSPBuffer]
+ ld l, a
+ ld a, [$ffda]
+ ld h, a
+ ld sp, hl
+ ret
+; 32f9
+
+
+
+Function32f9: ; 32f9
+ ld a, [hCGB]
+ and a
+ jr nz, .asm_3309
+ ld a, $e4
+ ld [rBGP], a
+ ld a, $d0
+ ld [rOBP0], a
+ ld [rOBP1], a
+ ret
+
+.asm_3309
+ push de
+ ld a, $e4
+ call DmgToCgbBGPals
+ ld de, $e4e4
+ call DmgToCgbObjPals
+ pop de
+ ret
+; 3317
+
+
+ClearPalettes: ; 3317
+; Make all palettes white
+
+; CGB: make all the palette colors white
+ ld a, [hCGB]
+ and a
+ jr nz, .cgb
+
+; DMG: just change palettes to 0 (white)
+ xor a
+ ld [rBGP], a
+ ld [rOBP0], a
+ ld [rOBP1], a
+ ret
+
+.cgb
+ ld a, [rSVBK]
+ push af
+
+ ld a, 5
+ ld [rSVBK], a
+
+; Fill BGPals and OBPals with $ffff (white)
+ ld hl, BGPals
+ ld bc, $80
+ ld a, $ff
+ call ByteFill
+
+ pop af
+ ld [rSVBK], a
+
+; Request palette update
+ ld a, 1
+ ld [hCGBPalUpdate], a
+ ret
+; 333e
+
+
+ClearSGB: ; 333e
+ ld b, $ff
+
+GetSGBLayout: ; 3340
+; load sgb packets unless dmg
+
+ ld a, [hCGB]
+ and a
+ jr nz, .dosgb
+
+ ld a, [hSGB]
+ and a
+ ret z
+
+.dosgb
+ ld a, $31 ; LoadSGBLayout
+ jp Predef
+; 334e
+
+
+SetHPPal: ; 334e
+; Set palette for hp bar pixel length e at hl.
+ call GetHPPal
+ ld [hl], d
+ ret
+; 3353
+
+
+GetHPPal: ; 3353
+; Get palette for hp bar pixel length e in d.
+
+ ld d, 0 ; green
+ ld a, e
+ cp 24
+ ret nc
+ inc d ; yellow
+ cp 10
+ ret nc
+ inc d ; red
+ ret
+; 335f
+
+
+CountSetBits: ; 0x335f
+; Count the number of set bits in b bytes starting from hl.
+; Return in a, c and [$d265].
+
+ ld c, 0
+.next
+ ld a, [hli]
+ ld e, a
+ ld d, 8
+
+.count
+ srl e
+ ld a, 0
+ adc c
+ ld c, a
+ dec d
+ jr nz, .count
+
+ dec b
+ jr nz, .next
+
+ ld a, c
+ ld [$d265], a
+ ret
+; 0x3376
+
+
+GetWeekday: ; 3376
+ ld a, [CurDay]
+.mod
+ sub 7
+ jr nc, .mod
+ add 7
+ ret
+; 3380
+
+
+INCLUDE "home/pokedex_flags.asm"
+
+
+NamesPointers: ; 33ab
+ dbw BANK(PokemonNames), PokemonNames
+ dbw BANK(MoveNames), MoveNames
+ dbw 0, 0
+ dbw BANK(ItemNames), ItemNames
+ dbw 0, PartyMonOT
+ dbw 0, OTPartyMonOT
+ dbw BANK(TrainerClassNames), TrainerClassNames
+ dbw $04, $4b52 ; ????
+; 33c3
+
+
+GetName: ; 33c3
+; Return name CurSpecies from name list $cf61 in StringBuffer1.
+
+ ld a, [hROMBank]
+ push af
+ push hl
+ push bc
+ push de
+
+ ld a, [$cf61]
+ cp 1 ; Pokemon names
+ jr nz, .NotPokeName
+
+ ld a, [CurSpecies]
+ ld [$d265], a
+ call GetPokemonName
+ ld hl, 11
+ add hl, de
+ ld e, l
+ ld d, h
+ jr .done
+
+.NotPokeName
+ ld a, [$cf61]
+ dec a
+ ld e, a
+ ld d, 0
+ ld hl, NamesPointers
+ add hl, de
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ rst Bankswitch
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+ ld a, [CurSpecies]
+ dec a
+ call GetNthString
+
+ ld de, StringBuffer1
+ ld bc, $000d
+ call CopyBytes
+
+.done
+ ld a, e
+ ld [$d102], a
+ ld a, d
+ ld [$d103], a
+
+ pop de
+ pop bc
+ pop hl
+ pop af
+ rst Bankswitch
+ ret
+; 3411
+
+
+GetNthString: ; 3411
+; Return the address of the
+; ath string starting from hl.
+
+ and a
+ ret z
+
+ push bc
+ ld b, a
+ ld c, "@"
+.readChar
+ ld a, [hli]
+ cp c
+ jr nz, .readChar
+ dec b
+ jr nz, .readChar
+ pop bc
+ ret
+; 3420
+
+
+GetBasePokemonName: ; 3420
+; Discards gender (Nidoran).
+
+ push hl
+ call GetPokemonName
+
+ ld hl, StringBuffer1
+.loop
+ ld a, [hl]
+ cp "@"
+ jr z, .quit
+ cp "♂"
+ jr z, .end
+ cp "♀"
+ jr z, .end
+ inc hl
+ jr .loop
+.end
+ ld [hl], "@"
+.quit
+ pop hl
+ ret
+
+; 343b
+
+
+GetPokemonName: ; 343b
+; Get Pokemon name $d265.
+
+ ld a, [hROMBank]
+ push af
+ push hl
+ ld a, BANK(PokemonNames)
+ rst Bankswitch
+
+; Each name is ten characters
+ ld a, [$d265]
+ dec a
+ ld d, 0
+ ld e, a
+ ld h, 0
+ ld l, a
+ add hl, hl
+ add hl, hl
+ add hl, de
+ add hl, hl
+ ld de, PokemonNames
+ add hl, de
+
+; Terminator
+ ld de, StringBuffer1
+ push de
+ ld bc, PKMN_NAME_LENGTH - 1
+ call CopyBytes
+ ld hl, StringBuffer1 + PKMN_NAME_LENGTH - 1
+ ld [hl], "@"
+ pop de
+
+ pop hl
+ pop af
+ rst Bankswitch
+ ret
+; 3468
+
+
+GetItemName: ; 3468
+; Get item name $d265.
+
+ push hl
+ push bc
+ ld a, [$d265]
+
+ cp TM_01
+ jr nc, .TM
+
+ ld [CurSpecies], a
+ ld a, 4 ; Item names
+ ld [$cf61], a
+ call GetName
+ jr .Copied
+.TM
+ call GetTMHMName
+.Copied
+ ld de, StringBuffer1
+ pop bc
+ pop hl
+ ret
+; 3487
+
+
+GetTMHMName: ; 3487
+; Get TM/HM name by item id $d265.
+
+ push hl
+ push de
+ push bc
+ ld a, [$d265]
+ push af
+
+; TM/HM prefix
+ cp HM_01
+ push af
+ jr c, .TM
+
+ ld hl, .HMText
+ ld bc, .HMTextEnd - .HMText
+ jr .asm_34a1
+
+.TM
+ ld hl, .TMText
+ ld bc, .TMTextEnd - .TMText
+
+.asm_34a1
+ ld de, StringBuffer1
+ call CopyBytes
+
+; TM/HM number
+ push de
+ ld a, [$d265]
+ ld c, a
+ callab GetTMHMNumber
+ pop de
+
+; HM numbers start from 51, not 1
+ pop af
+ ld a, c
+ jr c, .asm_34b9
+ sub NUM_TMS
+
+; Divide and mod by 10 to get the top and bottom digits respectively
+.asm_34b9
+ ld b, "0"
+.mod10
+ sub 10
+ jr c, .asm_34c2
+ inc b
+ jr .mod10
+.asm_34c2
+ add 10
+
+ push af
+ ld a, b
+ ld [de], a
+ inc de
+ pop af
+
+ ld b, "0"
+ add b
+ ld [de], a
+
+; End the string
+ inc de
+ ld a, "@"
+ ld [de], a
+
+ pop af
+ ld [$d265], a
+ pop bc
+ pop de
+ pop hl
+ ret
+
+.TMText
+ db "TM"
+.TMTextEnd
+ db "@"
+
+.HMText
+ db "HM"
+.HMTextEnd
+ db "@"
+; 34df
+
+
+IsHM: ; 34df
+ cp HM_01
+ jr c, .NotHM
+ scf
+ ret
+.NotHM
+ and a
+ ret
+; 34e7
+
+
+IsHMMove: ; 34e7
+ ld hl, .HMMoves
+ ld de, 1
+ jp IsInArray
+
+.HMMoves
+ db CUT
+ db FLY
+ db SURF
+ db STRENGTH
+ db FLASH
+ db WATERFALL
+ db WHIRLPOOL
+ db $ff
+; 34f8
+
+
+GetMoveName: ; 34f8
+ push hl
+; move name
+ ld a, $2 ; move names
+ ld [$cf61], a
+; move id
+ ld a, [$d265]
+ ld [CurSpecies], a
+
+ call GetName
+ ld de, StringBuffer1
+ pop hl
+ ret
+; 350c
+
+
+Function350c: ; 350c
+ call Function1c66
+ ld a, [hROMBank]
+ push af
+ ld a, $9
+ rst Bankswitch
+
+ call Function245af
+ call Function3524
+ call Function245cb
+ pop af
+ rst Bankswitch
+
+ ld a, [$cf73]
+ ret
+; 3524
+
+Function3524: ; 3524
+ ld hl, VramState
+ bit 0, [hl]
+ jp nz, UpdateTimePals
+ jp Function32f9
+; 352f
+
+Function352f: ; 352f
+ ld a, [$cf82]
+ dec a
+ ld b, a
+ ld a, [$cf84]
+ sub b
+ ld d, a
+ ld a, [$cf83]
+ dec a
+ ld c, a
+ ld a, [$cf85]
+ sub c
+ ld e, a
+ push de
+ call GetTileCoord
+ pop bc
+ jp TextBox
+; 354b
+
+Function354b: ; 354b
+ call DelayFrame
+ ld a, [$ffaa]
+ push af
+ ld a, $1
+ ld [$ffaa], a
+ call Functiona57
+ pop af
+ ld [$ffaa], a
+ ld a, [$ffa9]
+ and $f0
+ ld c, a
+ ld a, [hJoyPressed]
+ and $f
+ or c
+ ld c, a
+ ret
+; 3567
+
+
+Function3567: ; 3567
+ ld a, [hROMBank]
+ push af
+ call Function2c52
+ call Function3574
+ pop bc
+ ld a, b
+ rst Bankswitch
+
+ ret
+; 3574
+
+Function3574: ; 3574
+ ld hl, $0001
+ add hl, de
+ ld a, [hl]
+ cp $ff
+ jr z, .asm_3597
+ ld l, a
+ push hl
+ call Function3599
+ pop hl
+ jr nc, .asm_3597
+ ld d, a
+ ld e, l
+ call Function35de
+ jr nc, .asm_3597
+ call Function2631
+ callba Function96c56
+ scf
+ ret
+
+.asm_3597
+ and a
+ ret
+; 3599
+
+Function3599: ; 3599
+ push de
+ ld hl, $0010
+ add hl, de
+ ld a, [hl]
+ ld hl, $0011
+ add hl, de
+ ld e, [hl]
+ sub $4
+ ld d, a
+ ld a, e
+ sub $4
+ ld e, a
+ call Function35b0
+ pop de
+ ret
+; 35b0
+
+Function35b0: ; 35b0
+ ld hl, $dbfc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [$dbfb]
+ and a
+ jr z, .asm_35d3
+.asm_35bc
+ push af
+ ld a, [hl]
+ cp e
+ jr nz, .asm_35c8
+ inc hl
+ ld a, [hld]
+ cp d
+ jr nz, .asm_35c8
+ jr .asm_35d5
+
+.asm_35c8
+ ld a, $5
+ add l
+ ld l, a
+ jr nc, .asm_35cf
+ inc h
+
+.asm_35cf
+ pop af
+ dec a
+ jr nz, .asm_35bc
+
+.asm_35d3
+ and a
+ ret
+
+.asm_35d5
+ pop af
+ ld d, a
+ ld a, [$dbfb]
+ sub d
+ inc a
+ scf
+ ret
+; 35de
+
+Function35de: ; 35de
+ inc e
+ ld hl, $0001
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+.asm_35e6
+ ld a, [hli]
+ cp $ff
+ jr z, .asm_35fc
+ cp d
+ jr nz, .asm_35f7
+ ld a, [hli]
+ cp e
+ jr nz, .asm_35f8
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jr .asm_35fe
+
+.asm_35f7
+ inc hl
+
+.asm_35f8
+ inc hl
+ inc hl
+ jr .asm_35e6
+
+.asm_35fc
+ and a
+ ret
+
+.asm_35fe
+ scf
+ ret
+; 3600
+
+
+CheckTrainerBattle2: ; 3600
+
+ ld a, [hROMBank]
+ push af
+ call Function2c52
+
+ call CheckTrainerBattle
+
+ pop bc
+ ld a, b
+ rst Bankswitch
+ ret
+; 360d
+
+
+CheckTrainerBattle: ; 360d
+; Check if any trainer on the map sees the player and wants to battle.
+
+; Skip the player object.
+ ld a, 1
+ ld de, MapObjects + OBJECT_LENGTH
+
+.loop
+
+; Start a battle if the object:
+
+ push af
+ push de
+
+; Has a sprite
+ ld hl, $0001
+ add hl, de
+ ld a, [hl]
+ and a
+ jr z, .next
+
+; Is a trainer
+ ld hl, $0008
+ add hl, de
+ ld a, [hl]
+ and $f
+ cp $2
+ jr nz, .next
+
+; Is visible on the map
+ ld hl, $0000
+ add hl, de
+ ld a, [hl]
+ cp $ff
+ jr z, .next
+
+; Is facing the player...
+ call Function1ae5
+ call FacingPlayerDistance_bc
+ jr nc, .next
+
+; ...within their sight range
+ ld hl, $0009
+ add hl, de
+ ld a, [hl]
+ cp b
+ jr c, .next
+
+; And hasn't already been beaten
+ push bc
+ push de
+ ld hl, $000a
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld b, CHECK_FLAG
+ call EventFlagAction
+ ld a, c
+ pop de
+ pop bc
+ and a
+ jr z, .asm_3666
+
+.next
+ pop de
+ ld hl, OBJECT_LENGTH
+ add hl, de
+ ld d, h
+ ld e, l
+
+ pop af
+ inc a
+ cp NUM_OBJECTS
+ jr nz, .loop
+ xor a
+ ret
+
+.asm_3666
+ pop de
+ pop af
+ ld [$ffe0], a
+ ld a, b
+ ld [$d03f], a
+ ld a, c
+ ld [MartPointer], a
+ jr Function367e
+; 3674
+
+Function3674: ; 3674
+ ld a, $1
+ ld [$d03f], a
+ ld a, $ff
+ ld [MartPointer], a
+
+Function367e: ; 367e
+ call GetMapScriptHeaderBank
+ ld [EngineBuffer1], a
+ ld a, [$ffe0]
+ call GetMapObject
+ ld hl, $000a
+ add hl, bc
+ ld a, [EngineBuffer1]
+ call GetFarHalfword
+ ld de, $d041
+ ld bc, $000d
+ ld a, [EngineBuffer1]
+ call FarCopyBytes
+ xor a
+ ld [$d04d], a
+ scf
+ ret
+; 36a5
+
+
+FacingPlayerDistance_bc: ; 36a5
+
+ push de
+ call FacingPlayerDistance
+ ld b, d
+ ld c, e
+ pop de
+ ret
+; 36ad
+
+
+FacingPlayerDistance: ; 36ad
+; Return carry if the sprite at bc is facing the player,
+; and its distance in d.
+
+ ld hl, $0010 ; x
+ add hl, bc
+ ld d, [hl]
+
+ ld hl, $0011 ; y
+ add hl, bc
+ ld e, [hl]
+
+ ld a, [MapX]
+ cp d
+ jr z, .CheckY
+
+ ld a, [MapY]
+ cp e
+ jr z, .CheckX
+
+ and a
+ ret
+
+.CheckY
+ ld a, [MapY]
+ sub e
+ jr z, .NotFacing
+ jr nc, .Above
+
+; Below
+ cpl
+ inc a
+ ld d, a
+ ld e, UP << 2
+ jr .CheckFacing
+
+.Above
+ ld d, a
+ ld e, DOWN << 2
+ jr .CheckFacing
+
+.CheckX
+ ld a, [MapX]
+ sub d
+ jr z, .NotFacing
+ jr nc, .Left
+
+; Right
+ cpl
+ inc a
+ ld d, a
+ ld e, LEFT << 2
+ jr .CheckFacing
+
+.Left
+ ld d, a
+ ld e, RIGHT << 2
+
+.CheckFacing
+ call GetSpriteDirection
+ cp e
+ jr nz, .NotFacing
+ scf
+ ret
+
+.NotFacing
+ and a
+ ret
+; 36f5
+
+
+Function36f5: ; 36f5
+ push bc
+ ld hl, $0001
+ add hl, bc
+ ld a, [hl]
+ call GetMapObject
+ ld hl, $000a
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call GetMapScriptHeaderBank
+ call GetFarHalfword
+ ld d, h
+ ld e, l
+ push de
+ ld b, $2
+ call EventFlagAction
+ pop de
+ ld a, c
+ and a
+ pop bc
+ ret
+; 3718
+
+
+Function3718: ; 3718
+ ld a, [BattleType]
+ cp $1
+ jr .asm_3724
+
+ ld hl, WalkingTile
+ jr .asm_3731
+
+.asm_3724
+ ld a, [$d0ee]
+ ld hl, WalkingTile
+ and $f
+ jr z, .asm_3731
+ ld hl, $d049
+
+.asm_3731
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call GetMapScriptHeaderBank
+ call FarPrintText
+ call WaitBGMap
+ call Functiona80
+ ret
+; 3741
+
+
+
+IsAPokemon: ; 3741
+; Return carry if species a is not a Pokemon.
+ and a
+ jr z, .NotAPokemon
+ cp EGG
+ jr z, .Pokemon
+ cp NUM_POKEMON + 1
+ jr c, .Pokemon
+
+.NotAPokemon
+ scf
+ ret
+
+.Pokemon
+ and a
+ ret
+; 3750
+
+
+DrawHPBar: ; 3750
+; Draw an HP bar d tiles long at hl
+; Fill it up to e pixels
+
+ push hl
+ push de
+ push bc
+
+; Place 'HP:'
+ ld a, $60
+ ld [hli], a
+ ld a, $61
+ ld [hli], a
+
+; Draw a template
+ push hl
+ ld a, $62 ; empty bar
+.template
+ ld [hli], a
+ dec d
+ jr nz, .template
+ ld a, $6b ; bar end
+ add b
+ ld [hl], a
+ pop hl
+
+; Safety check # pixels
+ ld a, e
+ and a
+ jr nz, .fill
+ ld a, c
+ and a
+ jr z, .done
+ ld e, 1
+
+.fill
+; Keep drawing tiles until pixel length is reached
+ ld a, e
+ sub TILE_WIDTH
+ jr c, .lastbar
+
+ ld e, a
+ ld a, $6a ; full bar
+ ld [hli], a
+ ld a, e
+ and a
+ jr z, .done
+ jr .fill
+
+.lastbar
+ ld a, $62 ; empty bar
+ add e ; + e
+ ld [hl], a
+
+.done
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3786
+
+
+Function3786: ; 3786
+ ld a, $1
+ ld [$c2c6], a
+
+Function378b: ; 378b
+ ld a, [CurPartySpecies]
+ call IsAPokemon
+ jr c, .asm_37ad
+ push hl
+ ld de, VTiles2
+ ld a, $3c
+ call Predef
+ pop hl
+ xor a
+ ld [$ffad], a
+ ld bc, $0707
+ ld a, $13
+ call Predef
+ xor a
+ ld [$c2c6], a
+ ret
+
+.asm_37ad
+ xor a
+ ld [$c2c6], a
+ inc a
+ ld [CurPartySpecies], a
+ ret
+; 37b6
+
+Function37b6: ; 37b6
+ push af
+ ld a, $1
+ ld [$c2bc], a
+ pop af
+ call Function37e2
+ call WaitSFX
+ ret
+; 37c4
+
+Function37c4: ; 37c4
+ push af
+ ld a, $1
+ ld [$c2bc], a
+ pop af
+ jp Function37e2
+; 37ce
+
+Function37ce: ; 37ce
+ call Function37d5
+ call WaitSFX
+ ret
+; 37d5
+
+Function37d5: ; 37d5
+ push af
+ xor a
+ ld [$c2bc], a
+ ld [CryTracks], a
+ pop af
+ call Function37e2
+ ret
+; 37e2
+
+Function37e2: ; 37e2
+ push hl
+ push de
+ push bc
+ call Function381e
+ jr c, .asm_37ef
+ ld e, c
+ ld d, b
+ call PlayCryHeader
+
+.asm_37ef
+ pop bc
+ pop de
+ pop hl
+ ret
+; 37f3
+
+Function37f3: ; 37f3
+ call Function381e
+ ret c
+ ld a, [hROMBank]
+ push af
+ ld a, $3c
+ rst Bankswitch
+
+ ld hl, $6787
+ add hl, bc
+ add hl, bc
+ add hl, bc
+ add hl, bc
+ add hl, bc
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc hl
+ ld a, [hli]
+ ld [CryPitch], a
+ ld a, [hli]
+ ld [CryEcho], a
+ ld a, [hli]
+ ld [CryLength], a
+ ld a, [hl]
+ ld [$c2b3], a
+ pop af
+ rst Bankswitch
+
+ and a
+ ret
+; 381e
+
+Function381e: ; 381e
+ and a
+ jr z, .asm_382b
+ cp $fc
+ jr nc, .asm_382b
+ dec a
+ ld c, a
+ ld b, $0
+ and a
+ ret
+
+.asm_382b
+ scf
+ ret
+; 382d
+
+
+PrintLevel: ; 382d
+; Print TempMonLevel at hl
+
+ ld a, [TempMonLevel]
+ ld [hl], $6e ; ":L"
+ inc hl
+
+; How many digits?
+ ld c, 2
+ cp 100
+ jr c, Function3842
+
+; 3-digit numbers overwrite the :L.
+ dec hl
+ inc c
+ jr Function3842
+; 383d
+
+Function383d: ; 383d
+; Print :L and all 3 digits
+ ld [hl], $6e
+ inc hl
+ ld c, 3
+; 3842
+
+Function3842: ; 3842
+ ld [$d265], a
+ ld de, $d265
+ ld b, %01000001 ; flags
+ jp PrintNum
+; 384d
+
+
+Function384d: ; 384d
+ ld hl, $d25e
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld a, [hl]
+ ret
+; 3856
+
+
+GetBaseData: ; 3856
+ push bc
+ push de
+ push hl
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(BaseData)
+ rst Bankswitch
+
+; Egg doesn't have BaseData
+ ld a, [CurSpecies]
+ cp EGG
+ jr z, .egg
+
+; Get BaseData
+ dec a
+ ld bc, BaseData1 - BaseData0
+ ld hl, BaseData
+ call AddNTimes
+ ld de, CurBaseData
+ ld bc, BaseData1 - BaseData0
+ call CopyBytes
+ jr .end
+
+.egg
+; ????
+ ld de, $7d9c
+
+; Sprite dimensions
+ ld b, $55 ; 5x5
+ ld hl, BasePicSize
+ ld [hl], b
+
+; ????
+ ld hl, BasePadding
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ inc hl
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ jr .end
+
+.end
+; Replace Pokedex # with species
+ ld a, [CurSpecies]
+ ld [BaseDexNo], a
+
+ pop af
+ rst Bankswitch
+ pop hl
+ pop de
+ pop bc
+ ret
+; 389c
+
+
+GetCurNick: ; 389c
+ ld a, [CurPartyMon]
+ ld hl, PartyMonNicknames
+
+GetNick: ; 38a2
+; Get nickname a from list hl.
+
+ push hl
+ push bc
+
+ call SkipNames
+ ld de, StringBuffer1
+
+ push de
+ ld bc, PKMN_NAME_LENGTH
+ call CopyBytes
+ pop de
+
+ callab CheckNickErrors
+
+ pop bc
+ pop hl
+ ret
+; 38bb
+
+
+PrintBCDNumber: ; 38bb
+; function to print a BCD (Binary-coded decimal) number
+; de = address of BCD number
+; hl = destination address
+; c = flags and length
+; bit 7: if set, do not print leading zeroes
+; if unset, print leading zeroes
+; bit 6: if set, left-align the string (do not pad empty digits with spaces)
+; if unset, right-align the string
+; bit 5: if set, print currency symbol at the beginning of the string
+; if unset, do not print the currency symbol
+; bits 0-4: length of BCD number in bytes
+; Note that bits 5 and 7 are modified during execution. The above reflects
+; their meaning at the beginning of the functions's execution.
+ ld b, c ; save flags in b
+ res 7, c
+ res 6, c
+ res 5, c ; c now holds the length
+ bit 5, b
+ jr z, .loop
+ bit 7, b
+ jr nz, .loop
+ ld [hl], "¥"
+ inc hl
+.loop
+ ld a, [de]
+ swap a
+ call PrintBCDDigit ; print upper digit
+ ld a, [de]
+ call PrintBCDDigit ; print lower digit
+ inc de
+ dec c
+ jr nz, .loop
+ bit 7, b ; were any non-zero digits printed?
+ jr z, .done ; if so, we are done
+.numberEqualsZero ; if every digit of the BCD number is zero
+ bit 6, b ; left or right alignment?
+ jr nz, .skipRightAlignmentAdjustment
+ dec hl ; if the string is right-aligned, it needs to be moved back one space
+.skipRightAlignmentAdjustment
+ bit 5, b
+ jr z, .skipCurrencySymbol
+ ld [hl], "¥" ; currency symbol
+ inc hl
+.skipCurrencySymbol
+ ld [hl], "0"
+ call PrintLetterDelay
+ inc hl
+.done
+ ret
+; 0x38f2
+
+PrintBCDDigit: ; 38f2
+ and a, %00001111
+ and a
+ jr z, .zeroDigit
+.nonzeroDigit
+ bit 7, b ; have any non-space characters been printed?
+ jr z, .outputDigit
+; if bit 7 is set, then no numbers have been printed yet
+ bit 5, b ; print the currency symbol?
+ jr z, .skipCurrencySymbol
+ ld [hl], "¥"
+ inc hl
+ res 5, b
+.skipCurrencySymbol
+ res 7, b ; unset 7 to indicate that a nonzero digit has been reached
+.outputDigit
+ add a, "0"
+ ld [hli], a
+ jp PrintLetterDelay
+.zeroDigit
+ bit 7, b ; either printing leading zeroes or already reached a nonzero digit?
+ jr z, .outputDigit ; if so, print a zero digit
+ bit 6, b ; left or right alignment?
+ ret nz
+ ld a, " "
+ ld [hli], a ; if right-aligned, "print" a space by advancing the pointer
+ ret
+; 0x3917
+
+GetPartyParamLocation: ; 3917
+; Get the location of parameter a from CurPartyMon in hl
+ push bc
+ ld hl, PartyMons
+ ld c, a
+ ld b, $00
+ add hl, bc
+ ld a, [CurPartyMon]
+ call GetPartyLocation
+ pop bc
+ ret
+; 3927
+
+GetPartyLocation: ; 3927
+; Add the length of a PartyMon struct to hl a times.
+ ld bc, PartyMon2 - PartyMon1
+ jp AddNTimes
+; 392d
+
+
+Function392d: ; 392d
+ push hl
+ ld a, b
+ dec a
+ ld b, $0
+ add hl, bc
+ ld hl, $5424
+ ld bc, $0020
+ call AddNTimes
+ ld a, $14
+ call GetFarHalfword
+ ld b, l
+ ld c, h
+ pop hl
+ ret
+; 3945
+
+
+UserPartyAttr: ; 3945
+ push af
+ ld a, [hBattleTurn]
+ and a
+ jr nz, .asm_394e
+ pop af
+ jr BattlePartyAttr
+.asm_394e
+ pop af
+ jr OTPartyAttr
+; 3951
+
+
+OpponentPartyAttr: ; 3951
+ push af
+ ld a, [hBattleTurn]
+ and a
+ jr z, .asm_395a
+ pop af
+ jr BattlePartyAttr
+.asm_395a
+ pop af
+ jr OTPartyAttr
+; 395d
+
+
+BattlePartyAttr: ; 395d
+; Get attribute a from the active BattleMon's party struct.
+ push bc
+ ld c, a
+ ld b, 0
+ ld hl, PartyMons
+ add hl, bc
+ ld a, [CurBattleMon]
+ call GetPartyLocation
+ pop bc
+ ret
+; 396d
+
+
+OTPartyAttr: ; 396d
+; Get attribute a from the active EnemyMon's party struct.
+ push bc
+ ld c, a
+ ld b, 0
+ ld hl, OTPartyMon1Species
+ add hl, bc
+ ld a, [CurOTMon]
+ call GetPartyLocation
+ pop bc
+ ret
+; 397d
+
+
+ResetDamage: ; 397d
+ xor a
+ ld [CurDamage], a
+ ld [CurDamage + 1], a
+ ret
+; 3985
+
+SetPlayerTurn: ; 3985
+ xor a
+ ld [hBattleTurn], a
+ ret
+; 3989
+
+SetEnemyTurn: ; 3989
+ ld a, 1
+ ld [hBattleTurn], a
+ ret
+; 398e
+
+
+UpdateOpponentInParty: ; 398e
+ ld a, [hBattleTurn]
+ and a
+ jr z, UpdateEnemyMonInParty
+ jr UpdateBattleMonInParty
+; 3995
+
+UpdateUserInParty: ; 3995
+ ld a, [hBattleTurn]
+ and a
+ jr z, UpdateBattleMonInParty
+ jr UpdateEnemyMonInParty
+; 399c
+
+UpdateBattleMonInParty: ; 399c
+; Update level, status, current HP
+
+ ld a, [CurBattleMon]
+
+Function399f: ; 399f
+ ld hl, PartyMon1Level
+ call GetPartyLocation
+
+ ld d, h
+ ld e, l
+ ld hl, BattleMonLevel
+ ld bc, BattleMonMaxHP - BattleMonLevel
+ jp CopyBytes
+; 39b0
+
+UpdateEnemyMonInParty: ; 39b0
+; Update level, status, current HP
+
+; No wildmons.
+ ld a, [IsInBattle]
+ dec a
+ ret z
+
+ ld a, [CurOTMon]
+ ld hl, OTPartyMon1Level
+ call GetPartyLocation
+
+ ld d, h
+ ld e, l
+ ld hl, EnemyMonLevel
+ ld bc, EnemyMonMaxHP - EnemyMonLevel
+ jp CopyBytes
+; 39c9
+
+
+RefreshBattleHuds: ; 39c9
+ call UpdateBattleHuds
+ ld c, 3
+ call DelayFrames
+ jp WaitBGMap
+; 39d4
+
+UpdateBattleHuds: ; 39d4
+ callba Function3df48
+ callba Function3e036
+ ret
+; 39e1
+
+
+GetBattleVar: ; 39e1
+; Preserves hl.
+ push hl
+ call _GetBattleVar
+ pop hl
+ ret
+; 39e7
+
+_GetBattleVar: ; 39e7
+; Get variable from pair a, depending on whose turn it is.
+; There are 21 variable pairs.
+
+ push bc
+
+ ld hl, .battlevarpairs
+ ld c, a
+ ld b, 0
+ add hl, bc
+ add hl, bc
+
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+; Enemy turn uses the second byte instead.
+; This lets battle variable calls be side-neutral.
+ ld a, [hBattleTurn]
+ and a
+ jr z, .getvar
+ inc hl
+
+.getvar
+; var id
+ ld a, [hl]
+ ld c, a
+ ld b, 0
+
+ ld hl, .vars
+ add hl, bc
+ add hl, bc
+
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+ ld a, [hl]
+
+ pop bc
+ ret
+
+
+.battlevarpairs
+ dw .substatus1, .substatus2, .substatus3, .substatus4, .substatus5
+ dw .substatus1opp, .substatus2opp, .substatus3opp, .substatus4opp, .substatus5opp
+ dw .status, .statusopp, .animation, .effect, .power, .type
+ dw .curmove, .lastcounter, .lastcounteropp, .lastmove, .lastmoveopp
+
+
+ const_def
+ const PLAYER_SUBSTATUS_1
+ const ENEMY_SUBSTATUS_1
+ const PLAYER_SUBSTATUS_2
+ const ENEMY_SUBSTATUS_2
+ const PLAYER_SUBSTATUS_3
+ const ENEMY_SUBSTATUS_3
+ const PLAYER_SUBSTATUS_4
+ const ENEMY_SUBSTATUS_4
+ const PLAYER_SUBSTATUS_5
+ const ENEMY_SUBSTATUS_5
+ const PLAYER_STATUS
+ const ENEMY_STATUS
+ const PLAYER_MOVE_ANIMATION
+ const ENEMY_MOVE_ANIMATION
+ const PLAYER_MOVE_EFFECT
+ const ENEMY_MOVE_EFFECT
+ const PLAYER_MOVE_POWER
+ const ENEMY_MOVE_POWER
+ const PLAYER_MOVE_TYPE
+ const ENEMY_MOVE_TYPE
+ const PLAYER_CUR_MOVE
+ const ENEMY_CUR_MOVE
+ const PLAYER_COUNTER_MOVE
+ const ENEMY_COUNTER_MOVE
+ const PLAYER_LAST_MOVE
+ const ENEMY_LAST_MOVE
+
+
+; player enemy
+.substatus1 db PLAYER_SUBSTATUS_1, ENEMY_SUBSTATUS_1
+.substatus1opp db ENEMY_SUBSTATUS_1, PLAYER_SUBSTATUS_1
+.substatus2 db PLAYER_SUBSTATUS_2, ENEMY_SUBSTATUS_2
+.substatus2opp db ENEMY_SUBSTATUS_2, PLAYER_SUBSTATUS_2
+.substatus3 db PLAYER_SUBSTATUS_3, ENEMY_SUBSTATUS_3
+.substatus3opp db ENEMY_SUBSTATUS_3, PLAYER_SUBSTATUS_3
+.substatus4 db PLAYER_SUBSTATUS_4, ENEMY_SUBSTATUS_4
+.substatus4opp db ENEMY_SUBSTATUS_4, PLAYER_SUBSTATUS_4
+.substatus5 db PLAYER_SUBSTATUS_5, ENEMY_SUBSTATUS_5
+.substatus5opp db ENEMY_SUBSTATUS_5, PLAYER_SUBSTATUS_5
+.status db PLAYER_STATUS, ENEMY_STATUS
+.statusopp db ENEMY_STATUS, PLAYER_STATUS
+.animation db PLAYER_MOVE_ANIMATION, ENEMY_MOVE_ANIMATION
+.effect db PLAYER_MOVE_EFFECT, ENEMY_MOVE_EFFECT
+.power db PLAYER_MOVE_POWER, ENEMY_MOVE_POWER
+.type db PLAYER_MOVE_TYPE, ENEMY_MOVE_TYPE
+.curmove db PLAYER_CUR_MOVE, ENEMY_CUR_MOVE
+.lastcounter db PLAYER_COUNTER_MOVE, ENEMY_COUNTER_MOVE
+.lastcounteropp db ENEMY_COUNTER_MOVE, PLAYER_COUNTER_MOVE
+.lastmove db PLAYER_LAST_MOVE, ENEMY_LAST_MOVE
+.lastmoveopp db ENEMY_LAST_MOVE, PLAYER_LAST_MOVE
+
+.vars
+ dw PlayerSubStatus1, EnemySubStatus1
+ dw PlayerSubStatus2, EnemySubStatus2
+ dw PlayerSubStatus3, EnemySubStatus3
+ dw PlayerSubStatus4, EnemySubStatus4
+ dw PlayerSubStatus5, EnemySubStatus5
+ dw BattleMonStatus, EnemyMonStatus
+ dw PlayerMoveAnimation, EnemyMoveAnimation
+ dw PlayerMoveEffect, EnemyMoveEffect
+ dw PlayerMovePower, EnemyMovePower
+ dw PlayerMoveType, EnemyMoveType
+ dw CurPlayerMove, CurEnemyMove
+ dw LastEnemyCounterMove, LastPlayerCounterMove
+ dw LastPlayerMove, LastEnemyMove
+; 3a90
+
+
+Function3a90: ; 3a90
+ inc hl
+ ld a, [hROMBank]
+ push af
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+ ld a, e
+ ld l, a
+ ld a, d
+ ld h, a
+ ld de, $d00c
+ ld bc, $0028
+ call CopyBytes
+ pop af
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+ ret
+; 3ab2
+
+
+MobileTextBorder: ; 3ab2
+; For mobile link battles only.
+ ld a, [InLinkBattle]
+ cp 4
+ ret c
+; Draw a cell phone icon at the top right corner of the border.
+ ld hl, $c5a3 ; TileMap(19,12)
+ ld [hl], $5e ; cell phone top
+ ld hl, $c5b7 ; TileMap(19,13)
+ ld [hl], $5f ; cell phone bottom
+ ret
+; 3ac3
+
+
+BattleTextBox: ; 3ac3
+; Open a textbox and print text at hl.
+ push hl
+ call SpeechTextBox
+ call MobileTextBorder
+ call Function1ad2
+ call Function321c
+ pop hl
+ call PrintTextBoxText
+ ret
+; 3ad5
+
+
+StdBattleTextBox: ; 3ad5
+; Open a textbox and print battle text at 20:hl.
+
+ ld a, [hROMBank]
+ push af
+
+ ld a, BANK(BattleText)
+ rst Bankswitch
+
+ call BattleTextBox
+
+ pop af
+ rst Bankswitch
+ ret
+; 3ae1
+
+
+Function3ae1: ; 3ae1
+ ld a, $32
+ rst Bankswitch
+
+ ld a, [hli]
+ ld [$d410], a
+ ld a, [hl]
+ ld [$d411], a
+ ld a, $33
+ rst Bankswitch
+
+ ret
+; 3af0
+
+Function3af0: ; 3af0
+ push hl
+ push de
+ ld hl, $d410
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld a, $32
+ rst Bankswitch
+
+ ld a, [de]
+ ld [$d417], a
+ inc de
+ ld a, $33
+ rst Bankswitch
+
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ pop de
+ pop hl
+ ld a, [$d417]
+ ret
+; 3b0c
+
+Function3b0c: ; 3b0c
+ ld a, [hLCDStatCustom]
+ and a
+ ret z
+
+ ld a, $00
+ ld [Requested2bppSource], a
+ ld a, $d2
+ ld [Requested2bppSource + 1], a
+
+ ld a, $00
+ ld [Requested2bppDest], a
+ ld a, $d1
+ ld [Requested2bppDest + 1], a
+
+ ld a, $9
+ ld [Requested2bpp], a
+ ret
+; 3b2a
+
+
+
+Function3b2a: ; 3b2a
+ ld [$c3b8], a
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(Function8cfd6)
+ rst Bankswitch
+
+ ld a, [$c3b8]
+ call Function8cfd6
+ pop af
+ rst Bankswitch
+
+ ret
+; 3b3c
+
+
+Function3b3c: ; 3b3c
+ ld [$c3b8], a
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(Function8d120)
+ rst Bankswitch
+
+ ld a, [$c3b8]
+ call Function8d120
+ pop af
+ rst Bankswitch
+
+ ret
+; 3b4e
+
+
+SoundRestart: ; 3b4e
+
+ push hl
+ push de
+ push bc
+ push af
+
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(_SoundRestart)
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ call _SoundRestart
+
+ pop af
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3b6a
+
+
+UpdateSound: ; 3b6a
+
+ push hl
+ push de
+ push bc
+ push af
+
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(_UpdateSound)
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ call _UpdateSound
+
+ pop af
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3b86
+
+
+_LoadMusicByte: ; 3b86
+; CurMusicByte = [a:de]
+
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ ld a, [de]
+ ld [CurMusicByte], a
+ ld a, BANK(LoadMusicByte)
+
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+ ret
+; 3b97
+
+
+PlayMusic: ; 3b97
+; Play music de.
+
+ push hl
+ push de
+ push bc
+ push af
+
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(_PlayMusic) ; and BANK(_SoundRestart)
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ ld a, e
+ and a
+ jr z, .nomusic
+
+ call _PlayMusic
+ jr .end
+
+.nomusic
+ call _SoundRestart
+
+.end
+ pop af
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3bbc
+
+
+PlayMusic2: ; 3bbc
+; Stop playing music, then play music de.
+
+ push hl
+ push de
+ push bc
+ push af
+
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(_PlayMusic)
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ push de
+ ld de, MUSIC_NONE
+ call _PlayMusic
+ call DelayFrame
+ pop de
+ call _PlayMusic
+
+ pop af
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+
+; 3be3
+
+
+PlayCryHeader: ; 3be3
+; Play a cry given parameters in header de
+
+ push hl
+ push de
+ push bc
+ push af
+
+; Save current bank
+ ld a, [hROMBank]
+ push af
+
+; Cry headers are stuck in one bank.
+ ld a, BANK(CryHeaders)
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+; Each header is 6 bytes long:
+ ld hl, CryHeaders
+ add hl, de
+ add hl, de
+ add hl, de
+ add hl, de
+ add hl, de
+ add hl, de
+
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc hl
+
+ ld a, [hli]
+ ld [CryPitch], a
+ ld a, [hli]
+ ld [CryEcho], a
+ ld a, [hli]
+ ld [CryLength], a
+ ld a, [hl]
+ ld [CryLength+1], a
+
+ ld a, BANK(PlayCry)
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ call PlayCry
+
+ pop af
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3c23
+
+
+PlaySFX: ; 3c23
+; Play sound effect de.
+; Sound effects are ordered by priority (lowest to highest)
+
+ push hl
+ push de
+ push bc
+ push af
+
+; Is something already playing?
+ call CheckSFX
+ jr nc, .play
+; Does it have priority?
+ ld a, [CurSFX]
+ cp e
+ jr c, .quit
+
+.play
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(_PlaySFX)
+ ld [hROMBank], a
+ ld [MBC3RomBank], a ; bankswitch
+
+ ld a, e
+ ld [CurSFX], a
+ call _PlaySFX
+
+ pop af
+ ld [hROMBank], a
+ ld [MBC3RomBank], a ; bankswitch
+.quit
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3c4e
+
+
+WaitPlaySFX: ; 3c4e
+ call WaitSFX
+ call PlaySFX
+ ret
+; 3c55
+
+
+WaitSFX: ; 3c55
+; infinite loop until sfx is done playing
+
+ push hl
+
+.loop
+ ; ch5 on?
+ ld hl, Channel5 + Channel1Flags - Channel1
+ bit 0, [hl]
+ jr nz, .loop
+ ; ch6 on?
+ ld hl, Channel6 + Channel1Flags - Channel1
+ bit 0, [hl]
+ jr nz, .loop
+ ; ch7 on?
+ ld hl, Channel7 + Channel1Flags - Channel1
+ bit 0, [hl]
+ jr nz, .loop
+ ; ch8 on?
+ ld hl, Channel8 + Channel1Flags - Channel1
+ bit 0, [hl]
+ jr nz, .loop
+
+ pop hl
+ ret
+; 3c74
+
+Function3c74: ; 3c74
+ push hl
+ ld hl, $c1cc
+ bit 0, [hl]
+ jr nz, .asm_3c94
+ ld hl, $c1fe
+ bit 0, [hl]
+ jr nz, .asm_3c94
+ ld hl, $c230
+ bit 0, [hl]
+ jr nz, .asm_3c94
+ ld hl, $c262
+ bit 0, [hl]
+ jr nz, .asm_3c94
+ pop hl
+ scf
+ ret
+
+.asm_3c94
+ pop hl
+ and a
+ ret
+; 3c97
+
+MaxVolume: ; 3c97
+ ld a, $77 ; max
+ ld [Volume], a
+ ret
+; 3c9d
+
+LowVolume: ; 3c9d
+ ld a, $33 ; 40%
+ ld [Volume], a
+ ret
+; 3ca3
+
+VolumeOff: ; 3ca3
+ xor a
+ ld [Volume], a
+ ret
+; 3ca8
+
+Function3ca8: ; 3ca8
+ ld a, $4
+ ld [MusicFade], a
+ ret
+; 3cae
+
+Function3cae: ; 3cae
+ ld a, $84
+ ld [MusicFade], a
+ ret
+; 3cb4
+
+Function3cb4: ; 3cb4
+.asm_3cb4
+ and a
+ ret z
+ dec a
+ call UpdateSound
+ jr .asm_3cb4
+; 3cbc
+
+Function3cbc: ; 3cbc
+ push hl
+ push de
+ push bc
+ push af
+ call Function3d97
+ ld a, [CurMusic]
+ cp e
+ jr z, .asm_3cda
+ ld a, $8
+ ld [MusicFade], a
+ ld a, e
+ ld [MusicFadeIDLo], a
+ ld a, d
+ ld [MusicFadeIDHi], a
+ ld a, e
+ ld [CurMusic], a
+
+.asm_3cda
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3cdf
+
+Function3cdf: ; 3cdf
+ push hl
+ push de
+ push bc
+ push af
+ call Function3d97
+ ld a, [CurMusic]
+ cp e
+ jr z, .asm_3cfe
+ push de
+ ld de, MUSIC_NONE
+ call PlayMusic
+ call DelayFrame
+ pop de
+ ld a, e
+ ld [CurMusic], a
+ call PlayMusic
+
+.asm_3cfe
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3d03
+
+Function3d03: ; 3d03
+ push hl
+ push de
+ push bc
+ push af
+ xor a
+ ld [$c2c1], a
+ ld de, MUSIC_BICYCLE
+ ld a, [PlayerState]
+ cp $1
+ jr z, .asm_3d18
+ call Function3d97
+.asm_3d18
+ push de
+ ld de, MUSIC_NONE
+ call PlayMusic
+ call DelayFrame
+ pop de
+ ld a, e
+ ld [CurMusic], a
+ call PlayMusic
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3d2f
+
+Function3d2f: ; 3d2f
+ ld a, [$c2c1]
+ and a
+ jr z, Function3d47
+ xor a
+ ld [CurMusic], a
+ ld de, MUSIC_NONE
+ call PlayMusic
+ call DelayFrame
+ xor a
+ ld [$c2c1], a
+ ret
+; 3d47
+
+Function3d47: ; 3d47
+ push hl
+ push de
+ push bc
+ push af
+ ld de, MUSIC_NONE
+ call PlayMusic
+ call DelayFrame
+ ld a, [CurMusic]
+ ld e, a
+ ld d, 0
+ call PlayMusic
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3d62
+
+Function3d62: ; 3d62
+ ld a, [PlayerState]
+ cp $4
+ jr z, .asm_3d7b
+ cp $8
+ jr z, .asm_3d7b
+ ld a, [StatusFlags2]
+ bit 2, a
+ jr nz, .asm_3d80
+.asm_3d74
+ and a
+ ret
+
+ ld de, $0013
+ scf
+ ret
+
+.asm_3d7b
+ ld de, $0021
+ scf
+ ret
+
+.asm_3d80
+ ld a, [MapGroup]
+ cp $a
+ jr nz, .asm_3d74
+ ld a, [MapNumber]
+ cp $f
+ jr z, .asm_3d92
+ cp $11
+ jr nz, .asm_3d74
+
+.asm_3d92
+ ld de, $0058
+ scf
+ ret
+; 3d97
+
+Function3d97: ; 3d97
+ call Function3d62
+ ret c
+ call Function2cbd
+ ret
+; 3d9f
+
+Function3d9f: ; 3d9f
+ ld a, $20
+ ld [$c498], a
+ ld [$c49c], a
+ ld a, $50
+ ld [$c499], a
+ ld a, $58
+ ld [$c49d], a
+ xor a
+ ld [$c49b], a
+ ld [$c49f], a
+ ld a, [$c296]
+ cp $64
+ jr nc, .asm_3dd5
+ add $1
+ daa
+ ld b, a
+ swap a
+ and $f
+ add $f6
+ ld [$c49a], a
+ ld a, b
+ and $f
+ add $f6
+ ld [$c49e], a
+ ret
+
+.asm_3dd5
+ ld a, $ff
+ ld [$c49a], a
+ ld [$c49e], a
+ ret
+; 3dde
+
+CheckSFX: ; 3dde
+; returns carry if sfx channels are active
+ ld a, [$c1cc] ; 1
+ bit 0, a
+ jr nz, .quit
+ ld a, [$c1fe] ; 2
+ bit 0, a
+ jr nz, .quit
+ ld a, [$c230] ; 3
+ bit 0, a
+ jr nz, .quit
+ ld a, [$c262] ; 4
+ bit 0, a
+ jr nz, .quit
+ and a
+ ret
+.quit
+ scf
+ ret
+; 3dfe
+
+Function3dfe: ; 3dfe
+ xor a
+ ld [$c1cc], a
+ ld [SoundInput], a
+ ld [rNR10], a
+ ld [rNR11], a
+ ld [rNR12], a
+ ld [rNR13], a
+ ld [rNR14], a
+ ret
+; 3e10
+
+
+ChannelsOff: ; 3e10
+; Quickly turn off music channels
+ xor a
+ ld [Channel1Flags], a
+ ld [$c136], a
+ ld [$c168], a
+ ld [$c19a], a
+ ld [SoundInput], a
+ ret
+; 3e21
+
+SFXChannelsOff: ; 3e21
+; Quickly turn off sound effect channels
+ xor a
+ ld [$c1cc], a
+ ld [$c1fe], a
+ ld [$c230], a
+ ld [$c262], a
+ ld [SoundInput], a
+ ret
+; 3e32
+
+Function3e32: ; 3e32
+ cp $2
+ ld [$c988], a
+ ld a, l
+ ld [$c986], a
+ ld a, h
+ ld [$c987], a
+ jr nz, .asm_3e4f
+ ld [$c982], a
+ ld a, l
+ ld [$c981], a
+ ld hl, $c983
+ ld a, c
+ ld [hli], a
+ ld a, b
+ ld [hl], a
+
+.asm_3e4f
+ ld hl, $c822
+ set 6, [hl]
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(Function110030)
+ ld [$c981], a
+ rst Bankswitch
+
+ jp Function110030
+; 3e60
+
+
+Function3e60: ; 3e60
+ ld [$c986], a
+ ld a, l
+ ld [$c987], a
+ ld a, h
+ ld [$c988], a
+ pop bc
+ ld a, b
+ ld [$c981], a
+ rst Bankswitch
+
+ ld hl, $c822
+ res 6, [hl]
+ ld hl, $c987
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [$c986]
+ ret
+; 3e80
+
+
+Function3e80: ; 3e80
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(Function1116c5)
+ ld [$c981], a
+ rst Bankswitch
+
+ call Function1116c5
+ pop bc
+ ld a, b
+ ld [$c981], a
+ rst Bankswitch
+
+ ret
+; 3e93
+
+
+Timer: ; 3e93
+ push af
+ push bc
+ push de
+ push hl
+
+ ld a, [$ffe9]
+ and a
+ jr z, .asm_3ed2
+
+ xor a
+ ld [rTAC], a
+
+; Turn off timer interrupt
+ ld a, [rIF]
+ and 1 << VBLANK | 1 << LCD_STAT | 1 << SERIAL | 1 << JOYPAD
+ ld [rIF], a
+
+ ld a, [$c86a]
+ or a
+ jr z, .asm_3ed2
+
+ ld a, [$c822]
+ bit 1, a
+ jr nz, .asm_3eca
+
+ ld a, [rSC]
+ and 1 << rSC_ON
+ jr nz, .asm_3eca
+
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(Function1118de)
+ ld [$c981], a
+ rst Bankswitch
+
+ call Function1118de
+
+ pop bc
+ ld a, b
+ ld [$c981], a
+ rst Bankswitch
+
+.asm_3eca
+ ld a, [rTMA]
+ ld [rTIMA], a
+
+ ld a, 1 << rTAC_ON | rTAC_65536_HZ
+ ld [rTAC], a
+
+.asm_3ed2
+ pop hl
+ pop de
+ pop bc
+ pop af
+ reti
+; 3ed7
+
+Function3ed7: ; 3ed7
+ ld [$dc02], a
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(Function114243)
+ rst Bankswitch
+
+ call Function114243
+ pop bc
+ ld a, b
+ rst Bankswitch
+
+ ld a, [$dc02]
+ ret
+; 3eea
+
+Function3eea: ; 3eea
+ push hl
+ push bc
+ ld de, $0939
+ add hl, de
+ inc b
+ inc b
+ inc c
+ inc c
+ call Function3f35
+ pop bc
+ pop hl
+ call Function3f47
+ ret
+; 3efd
+
+Function3efd: ; 3efd
+ push hl
+ ld hl, $c590
+ ld b, $4
+ ld c, $12
+ call Function3f0d
+ pop hl
+ call PrintTextBoxText
+ ret
+; 3f0d
+
+Function3f0d: ; 3f0d
+ push hl
+ push bc
+ ld de, $0939
+ add hl, de
+ inc b
+ inc b
+ inc c
+ inc c
+ call Function3f35
+ pop bc
+ pop hl
+ call TextBoxBorder
+ ret
+; 3f20
+
+Function3f20: ; 3f20
+ ld hl, AttrMap
+ ld b, $6
+ ld c, $14
+ call Function3f35
+ ld hl, TileMap
+ ld b, $4
+ ld c, $12
+ call Function3f47
+ ret
+; 3f35
+
+Function3f35: ; 3f35
+ ld a, $6
+ ld de, $0014
+.asm_3f3a
+ push bc
+ push hl
+.asm_3f3c
+ ld [hli], a
+ dec c
+ jr nz, .asm_3f3c
+ pop hl
+ add hl, de
+ pop bc
+ dec b
+ jr nz, .asm_3f3a
+ ret
+; 3f47
+
+Function3f47: ; 3f47
+ push bc
+ call Function3f58
+ pop bc
+.asm_3f4c
+ push bc
+ call Function3f68
+ pop bc
+ dec b
+ jr nz, .asm_3f4c
+ call Function3f60
+ ret
+; 3f58
+
+Function3f58: ; 3f58
+ ld a, $63
+ ld d, $62
+ ld e, $64
+ jr Function3f6e
+
+Function3f60: ; 3f60
+ ld a, $68
+ ld d, $67
+ ld e, $69
+ jr Function3f6e
+
+Function3f68: ; 3f68
+ ld a, $7f
+ ld d, $65
+ ld e, $66
+
+Function3f6e: ; 3f6e
+ push hl
+ ld [hl], d
+ inc hl
+.asm_3f71
+ ld [hli], a
+ dec c
+ jr nz, .asm_3f71
+ ld [hl], e
+ pop hl
+ ld de, $0014
+ add hl, de
+ ret
+; 3f7c
+
+Function3f7c: ; 3f7c
+ call Function1cfd
+ call Function1c53
+ dec b
+ dec c
+ call Function3eea
+ ret
+; 3f88
+
+Function3f88: ; 3f88
+ ld hl, $d000
+ ld b, $0
+.asm_3f8d
+ push bc
+ ld c, $8
+.asm_3f90
+ ld a, [de]
+ inc de
+ cpl
+ ld [hl], $0
+ inc hl
+ ld [hli], a
+ dec c
+ jr nz, .asm_3f90
+ pop bc
+ dec c
+ jr nz, .asm_3f8d
+ ret
+; 3f9f
+
+Function3f9f: ; 3f9f
+ ld hl, $d000
+.asm_3fa2
+ push bc
+ ld c, $8
+.asm_3fa5
+ ld a, [de]
+ inc de
+ inc de
+ cpl
+ ld [hl], $0
+ inc hl
+ ld [hli], a
+ dec c
+ jr nz, .asm_3fa5
+ pop bc
+ dec c
+ jr nz, .asm_3fa2
+ ret
+; 3fb5
+
--- a/main.asm
+++ b/main.asm
@@ -1,3404 +1,6 @@
INCLUDE "includes.asm"
-SECTION "Hardware", ROM0
-
-INCLUDE "rst.asm"
-INCLUDE "interrupts.asm"
-
-
-SECTION "Header", ROM0[$100]
-
-Start:
- nop
- jp _Start
-
-
-SECTION "Home", ROM0[$150]
-
-INCLUDE "home/init.asm"
-INCLUDE "home/vblank.asm"
-INCLUDE "home/delay.asm"
-INCLUDE "home/rtc.asm"
-INCLUDE "home/fade.asm"
-INCLUDE "home/lcd.asm"
-INCLUDE "home/time.asm"
-INCLUDE "home/serial.asm"
-INCLUDE "home/joypad.asm"
-INCLUDE "home/decompress.asm"
-INCLUDE "home/palettes.asm"
-INCLUDE "home/copy.asm"
-INCLUDE "home/text.asm"
-INCLUDE "home/video.asm"
-INCLUDE "home/map_objects.asm"
-INCLUDE "home/sine.asm"
-INCLUDE "home/movement.asm"
-INCLUDE "home/tilemap.asm"
-INCLUDE "home/menu.asm"
-INCLUDE "home/handshake.asm"
-INCLUDE "home/game_time.asm"
-INCLUDE "home/map.asm"
-
-
-Function2d43: ; 2d43
-; Inexplicably empty.
-; Seen in PredefPointers.
- rept 16
- nop
- endr
- ret
-; 2d54
-
-
-INCLUDE "home/farcall.asm"
-INCLUDE "home/predef.asm"
-INCLUDE "home/window.asm"
-
-
-Function2e4e: ; 2e4e
- scf
- ret
-; 2e50
-
-
-INCLUDE "home/flag.asm"
-
-
-Function2ebb: ; 2ebb
- ld a, [$c2cc]
- bit 1, a
- ret z
- ld a, [hJoyDown]
- bit A_BUTTON, a
- ret
-; 2ec6
-
-
-Function2ec6: ; 2ec6
- xor a
- ret
-; 2ec8
-
-Function2ec8: ; 2ec8
- xor a
- dec a
- ret
-; 2ecb
-
-Function2ecb: ; 2ecb
- push hl
- ld hl, $c2cc
- bit 1, [hl]
- pop hl
- ret
-; 2ed3
-
-
-Function2ed3: ; 0x2ed3
-; disables overworld sprite updating?
- xor a
- ld [$ffde], a
- ld a, [VramState]
- res 0, a
- ld [VramState], a
- ld a, $0
- ld [$c2ce], a
- ret
-; 0x2ee4
-
-Function2ee4: ; 2ee4
- ld a, $1
- ld [$c2ce], a
- ld a, [VramState]
- set 0, a
- ld [VramState], a
- ld a, $1
- ld [$ffde], a
- ret
-; 2ef6
-
-
-INCLUDE "home/string.asm"
-
-
-IsInJohto: ; 2f17
-; Return 0 if the player is in Johto, and 1 in Kanto.
-
- ld a, [MapGroup]
- ld b, a
- ld a, [MapNumber]
- ld c, a
- call GetWorldMapLocation
-
- cp FAST_SHIP
- jr z, .Johto
-
- cp SPECIAL_MAP
- jr nz, .CheckRegion
-
- ld a, [BackupMapGroup]
- ld b, a
- ld a, [BackupMapNumber]
- ld c, a
- call GetWorldMapLocation
-
-.CheckRegion
- cp KANTO_LANDMARK
- jr nc, .Kanto
-
-.Johto
- xor a
- ret
-
-.Kanto
- ld a, 1
- ret
-; 2f3e
-
-
-Function2f3e: ; 2f3e
- ret
-; 2f3f
-
-
-INCLUDE "home/item.asm"
-INCLUDE "home/random.asm"
-INCLUDE "home/sram.asm"
-
-
-; Register aliases
-
-_hl_: ; 2fec
- jp [hl]
-; 2fed
-
-_de_: ; 2fed
- push de
- ret
-; 2fef
-
-
-INCLUDE "home/double_speed.asm"
-
-
-ClearSprites: ; 300b
-; Erase OAM data
- ld hl, Sprites
- ld b, SpritesEnd - Sprites
- xor a
-.loop
- ld [hli], a
- dec b
- jr nz, .loop
- ret
-; 3016
-
-HideSprites: ; 3016
-; Set all OAM y-positions to 160 to hide them offscreen
- ld hl, Sprites
- ld de, 4 ; length of an OAM struct
- ld b, (SpritesEnd - Sprites) / 4 ; number of OAM structs
- ld a, 160 ; y
-.loop
- ld [hl], a
- add hl, de
- dec b
- jr nz, .loop
- ret
-; 3026
-
-
-INCLUDE "home/copy2.asm"
-
-
-Function309d: ; 309d
- ld a, [rSVBK]
- push af
- ld a, 2
- ld [rSVBK], a
- ld hl, TileMap
- ld de, $d000
- ld bc, 360
- call CopyBytes
- pop af
- ld [rSVBK], a
- ret
-; 30b4
-
-Function30b4: ; 30b4
- xor a
- ld [hBGMapMode], a
- call Function30bf
- ld a, 1
- ld [hBGMapMode], a
- ret
-; 30bf
-
-Function30bf: ; 30bf
- ld a, [rSVBK]
- push af
- ld a, 2
- ld [rSVBK], a
- ld hl, $d000
- ld de, TileMap
- ld bc, 360
- call CopyBytes
- pop af
- ld [rSVBK], a
- ret
-; 30d6
-
-
-CopyName1: ; 30d6
- ld hl, StringBuffer2
-
-CopyName2: ; 30d9
-.loop
- ld a, [de]
- inc de
- ld [hli], a
- cp "@"
- jr nz, .loop
- ret
-; 30e1
-
-IsInArray: ; 30e1
-; Find value a for every de bytes in array hl.
-; Return index in b and carry if found.
-
- ld b, 0
- ld c, a
-.loop
- ld a, [hl]
- cp $ff
- jr z, .NotInArray
- cp c
- jr z, .InArray
- inc b
- add hl, de
- jr .loop
-
-.NotInArray
- and a
- ret
-
-.InArray
- scf
- ret
-; 30f4
-
-SkipNames: ; 0x30f4
-; skips n names where n = a
- ld bc, $000b ; name length
- and a
- ret z
-.loop
- add hl, bc
- dec a
- jr nz, .loop
- ret
-; 0x30fe
-
-AddNTimes: ; 0x30fe
-; adds bc n times where n = a
- and a
- ret z
-.loop
- add hl, bc
- dec a
- jr nz, .loop
- ret
-; 0x3105
-
-
-INCLUDE "home/math.asm"
-
-
-PrintLetterDelay: ; 313d
-; Wait before printing the next letter.
-
-; The text speed setting in Options is actually a frame count:
-; fast: 1 frame
-; mid: 3 frames
-; slow: 5 frames
-
-; $cfcf[!0] and A or B override text speed with a one-frame delay.
-; Options[4] and $cfcf[!1] disable the delay.
-
-; delay off?
- ld a, [Options]
- bit 4, a
- ret nz
-
-; non-scrolling text?
- ld a, [$cfcf]
- bit 1, a
- ret z
-
- push hl
- push de
- push bc
-
- ld hl, hOAMUpdate
- ld a, [hl]
- push af
-
-; orginally turned oam update off...
-; ld a, 1
- ld [hl], a
-
-; force fast scroll?
- ld a, [$cfcf]
- bit 0, a
- jr z, .fast
-
-; text speed
- ld a, [Options]
- and %111
- jr .updatedelay
-
-.fast
- ld a, 1
-
-.updatedelay
- ld [TextDelayFrames], a
-
-.checkjoypad
- call GetJoypadPublic
-
-; input override
- ld a, [$c2d7]
- and a
- jr nz, .wait
-
-; Wait one frame if holding A or B.
- ld a, [hJoyDown]
- bit 0, a ; A_BUTTON
- jr z, .checkb
- jr .delay
-.checkb
- bit 1, a ; B_BUTTON
- jr z, .wait
-
-.delay
- call DelayFrame
- jr .end
-
-.wait
- ld a, [TextDelayFrames]
- and a
- jr nz, .checkjoypad
-
-.end
- pop af
- ld [hOAMUpdate], a
- pop bc
- pop de
- pop hl
- ret
-; 318c
-
-
-CopyDataUntil: ; 318c
-; Copy [hl .. bc) to [de .. de + bc - hl).
-
-; In other words, the source data is
-; from hl up to but not including bc,
-; and the destination is de.
-
- ld a, [hli]
- ld [de], a
- inc de
- ld a, h
- cp b
- jr nz, CopyDataUntil
- ld a, l
- cp c
- jr nz, CopyDataUntil
- ret
-; 0x3198
-
-
-PrintNum: ; 3198
- ld a, [hROMBank]
- push af
- ld a, BANK(_PrintNum)
- rst Bankswitch
-
- call _PrintNum
-
- pop af
- rst Bankswitch
- ret
-; 31a4
-
-
-Function31a4: ; 31a4
- ld a, [hROMBank]
- push af
- ld a, BANK(Function1061ef)
- rst Bankswitch
-
- call Function1061ef
-
- pop af
- rst Bankswitch
- ret
-; 31b0
-
-
-FarPrintText: ; 31b0
- ld [hBuffer], a
- ld a, [hROMBank]
- push af
- ld a, [hBuffer]
- rst Bankswitch
-
- call PrintText
-
- pop af
- rst Bankswitch
- ret
-; 31be
-
-
-CallPointerAt: ; 31be
- ld a, [hROMBank]
- push af
- ld a, [hli]
- rst Bankswitch
-
- ld a, [hli]
- ld h, [hl]
- ld l, a
-
- call _hl_
-
- pop hl
- ld a, h
- rst Bankswitch
- ret
-; 31cd
-
-
-Function31cd: ; 31cd
-; Push pointer hl in the current bank to $d0e8.
- ld a, [hROMBank]
-
-Function31cf: ; 31cf
-; Push pointer a:hl to $d0e8.
- ld [$d0e8], a
- ld a, l
- ld [$d0e9], a
- ld a, h
- ld [$d0ea], a
- ret
-; 31db
-
-
-StringCmp: ; 31db
-; Compare c bytes at de and hl.
-; Return z if they all match.
- ld a, [de]
- cp [hl]
- ret nz
- inc de
- inc hl
- dec c
- jr nz, StringCmp
- ret
-; 0x31e4
-
-
-CompareLong: ; 31e4
-; Compare bc bytes at de and hl.
-; Return carry if they all match.
-
- ld a, [de]
- cp [hl]
- jr nz, .Diff
-
- inc de
- inc hl
- dec bc
-
- ld a, b
- or c
- jr nz, CompareLong
-
- scf
- ret
-
-.Diff
- and a
- ret
-; 31f3
-
-
-WhiteBGMap: ; 31f3
- call ClearPalettes
-WaitBGMap: ; 31f6
-; Tell VBlank to update BG Map
- ld a, 1 ; BG Map 0 tiles
- ld [hBGMapMode], a
-; Wait for it to do its magic
- ld c, 4
- call DelayFrames
- ret
-; 3200
-
-Function3200: ; 0x3200
- ld a, [hCGB]
- and a
- jr z, .asm_320e
- ld a, 2
- ld [hBGMapMode], a
- ld c, 4
- call DelayFrames
-
-.asm_320e
- ld a, 1
- ld [hBGMapMode], a
- ld c, 4
- call DelayFrames
- ret
-; 0x3218
-
-
-Function3218: ; 3218
- ld a, [hCGB]
- and a
- ret
-; 321c
-
-
-Function321c: ; 321c
- ld a, [hCGB]
- and a
- jr z, .asm_322e
-
- ld a, [$c2ce]
- cp 0
- jr z, .asm_322e
-
- ld a, 1
- ld [hBGMapMode], a
- jr Function323d
-
-.asm_322e
- ld a, 1
- ld [hBGMapMode], a
- ld c, 4
- call DelayFrames
- ret
-; 3238
-
-Function3238: ; 3238
- ld a, [hCGB]
- and a
- jr z, WaitBGMap
-
-Function323d: ; 323d
- jr Function3246
-; 323f
-
-Function323f: ; 323f
- callba Function104000
- ret
-; 3246
-
-Function3246: ; 3246
- ld a, [hBGMapMode]
- push af
- xor a
- ld [hBGMapMode], a
- ld a, [$ffde]
- push af
- xor a
- ld [$ffde], a
-.asm_3252
- ld a, [rLY]
- cp $7f
- jr c, .asm_3252 ; 3256 $fa
- di
- ld a, $1
- ld [rVBK], a
- ld hl, AttrMap
- call Function327b
- ld a, $0
- ld [rVBK], a
- ld hl, TileMap
- call Function327b
-.asm_326d
- ld a, [rLY]
- cp $7f
- jr c, .asm_326d ; 3271 $fa
- ei
- pop af
- ld [$ffde], a
- pop af
- ld [hBGMapMode], a
- ret
-; 327b
-
-Function327b: ; 327b
- ld [hSPBuffer], sp
- ld sp, hl
- ld a, [$ffd7]
- ld h, a
- ld l, $0
- ld a, $12
- ld [$ffd3], a
- ld b, $2
- ld c, $41
-.asm_328c
- pop de
-
-rept 9
-.loop\@
- ld a, [$ff00+c]
- and b
- jr nz, .loop\@
- ld [hl], e
- inc l
- ld [hl], d
- inc l
- pop de
-endr
-
-.asm_32de
- ld a, [$ff00+c]
- and b
- jr nz, .asm_32de
- ld [hl], e
- inc l
- ld [hl], d
- inc l
-
- ld de, $000c
- add hl, de
- ld a, [$ffd3]
- dec a
- ld [$ffd3], a
- jr nz, .asm_328c
- ld a, [hSPBuffer]
- ld l, a
- ld a, [$ffda]
- ld h, a
- ld sp, hl
- ret
-; 32f9
-
-
-
-Function32f9: ; 32f9
- ld a, [hCGB]
- and a
- jr nz, .asm_3309
- ld a, $e4
- ld [rBGP], a
- ld a, $d0
- ld [rOBP0], a
- ld [rOBP1], a
- ret
-
-.asm_3309
- push de
- ld a, $e4
- call DmgToCgbBGPals
- ld de, $e4e4
- call DmgToCgbObjPals
- pop de
- ret
-; 3317
-
-
-ClearPalettes: ; 3317
-; Make all palettes white
-
-; CGB: make all the palette colors white
- ld a, [hCGB]
- and a
- jr nz, .cgb
-
-; DMG: just change palettes to 0 (white)
- xor a
- ld [rBGP], a
- ld [rOBP0], a
- ld [rOBP1], a
- ret
-
-.cgb
- ld a, [rSVBK]
- push af
-
- ld a, 5
- ld [rSVBK], a
-
-; Fill BGPals and OBPals with $ffff (white)
- ld hl, BGPals
- ld bc, $80
- ld a, $ff
- call ByteFill
-
- pop af
- ld [rSVBK], a
-
-; Request palette update
- ld a, 1
- ld [hCGBPalUpdate], a
- ret
-; 333e
-
-
-ClearSGB: ; 333e
- ld b, $ff
-
-GetSGBLayout: ; 3340
-; load sgb packets unless dmg
-
- ld a, [hCGB]
- and a
- jr nz, .dosgb
-
- ld a, [hSGB]
- and a
- ret z
-
-.dosgb
- ld a, $31 ; LoadSGBLayout
- jp Predef
-; 334e
-
-
-SetHPPal: ; 334e
-; Set palette for hp bar pixel length e at hl.
- call GetHPPal
- ld [hl], d
- ret
-; 3353
-
-
-GetHPPal: ; 3353
-; Get palette for hp bar pixel length e in d.
-
- ld d, 0 ; green
- ld a, e
- cp 24
- ret nc
- inc d ; yellow
- cp 10
- ret nc
- inc d ; red
- ret
-; 335f
-
-
-CountSetBits: ; 0x335f
-; Count the number of set bits in b bytes starting from hl.
-; Return in a, c and [$d265].
-
- ld c, 0
-.next
- ld a, [hli]
- ld e, a
- ld d, 8
-
-.count
- srl e
- ld a, 0
- adc c
- ld c, a
- dec d
- jr nz, .count
-
- dec b
- jr nz, .next
-
- ld a, c
- ld [$d265], a
- ret
-; 0x3376
-
-
-GetWeekday: ; 3376
- ld a, [CurDay]
-.mod
- sub 7
- jr nc, .mod
- add 7
- ret
-; 3380
-
-
-INCLUDE "home/pokedex_flags.asm"
-
-
-NamesPointers: ; 33ab
- dbw BANK(PokemonNames), PokemonNames
- dbw BANK(MoveNames), MoveNames
- dbw 0, 0
- dbw BANK(ItemNames), ItemNames
- dbw 0, PartyMonOT
- dbw 0, OTPartyMonOT
- dbw BANK(TrainerClassNames), TrainerClassNames
- dbw $04, $4b52 ; ????
-; 33c3
-
-
-GetName: ; 33c3
-; Return name CurSpecies from name list $cf61 in StringBuffer1.
-
- ld a, [hROMBank]
- push af
- push hl
- push bc
- push de
-
- ld a, [$cf61]
- cp 1 ; Pokemon names
- jr nz, .NotPokeName
-
- ld a, [CurSpecies]
- ld [$d265], a
- call GetPokemonName
- ld hl, 11
- add hl, de
- ld e, l
- ld d, h
- jr .done
-
-.NotPokeName
- ld a, [$cf61]
- dec a
- ld e, a
- ld d, 0
- ld hl, NamesPointers
- add hl, de
- add hl, de
- add hl, de
- ld a, [hli]
- rst Bankswitch
- ld a, [hli]
- ld h, [hl]
- ld l, a
-
- ld a, [CurSpecies]
- dec a
- call GetNthString
-
- ld de, StringBuffer1
- ld bc, $000d
- call CopyBytes
-
-.done
- ld a, e
- ld [$d102], a
- ld a, d
- ld [$d103], a
-
- pop de
- pop bc
- pop hl
- pop af
- rst Bankswitch
- ret
-; 3411
-
-
-GetNthString: ; 3411
-; Return the address of the
-; ath string starting from hl.
-
- and a
- ret z
-
- push bc
- ld b, a
- ld c, "@"
-.readChar
- ld a, [hli]
- cp c
- jr nz, .readChar
- dec b
- jr nz, .readChar
- pop bc
- ret
-; 3420
-
-
-GetBasePokemonName: ; 3420
-; Discards gender (Nidoran).
-
- push hl
- call GetPokemonName
-
- ld hl, StringBuffer1
-.loop
- ld a, [hl]
- cp "@"
- jr z, .quit
- cp "♂"
- jr z, .end
- cp "♀"
- jr z, .end
- inc hl
- jr .loop
-.end
- ld [hl], "@"
-.quit
- pop hl
- ret
-
-; 343b
-
-
-GetPokemonName: ; 343b
-; Get Pokemon name $d265.
-
- ld a, [hROMBank]
- push af
- push hl
- ld a, BANK(PokemonNames)
- rst Bankswitch
-
-; Each name is ten characters
- ld a, [$d265]
- dec a
- ld d, 0
- ld e, a
- ld h, 0
- ld l, a
- add hl, hl
- add hl, hl
- add hl, de
- add hl, hl
- ld de, PokemonNames
- add hl, de
-
-; Terminator
- ld de, StringBuffer1
- push de
- ld bc, PKMN_NAME_LENGTH - 1
- call CopyBytes
- ld hl, StringBuffer1 + PKMN_NAME_LENGTH - 1
- ld [hl], "@"
- pop de
-
- pop hl
- pop af
- rst Bankswitch
- ret
-; 3468
-
-
-GetItemName: ; 3468
-; Get item name $d265.
-
- push hl
- push bc
- ld a, [$d265]
-
- cp TM_01
- jr nc, .TM
-
- ld [CurSpecies], a
- ld a, 4 ; Item names
- ld [$cf61], a
- call GetName
- jr .Copied
-.TM
- call GetTMHMName
-.Copied
- ld de, StringBuffer1
- pop bc
- pop hl
- ret
-; 3487
-
-
-GetTMHMName: ; 3487
-; Get TM/HM name by item id $d265.
-
- push hl
- push de
- push bc
- ld a, [$d265]
- push af
-
-; TM/HM prefix
- cp HM_01
- push af
- jr c, .TM
-
- ld hl, .HMText
- ld bc, .HMTextEnd - .HMText
- jr .asm_34a1
-
-.TM
- ld hl, .TMText
- ld bc, .TMTextEnd - .TMText
-
-.asm_34a1
- ld de, StringBuffer1
- call CopyBytes
-
-; TM/HM number
- push de
- ld a, [$d265]
- ld c, a
- callab GetTMHMNumber
- pop de
-
-; HM numbers start from 51, not 1
- pop af
- ld a, c
- jr c, .asm_34b9
- sub NUM_TMS
-
-; Divide and mod by 10 to get the top and bottom digits respectively
-.asm_34b9
- ld b, "0"
-.mod10
- sub 10
- jr c, .asm_34c2
- inc b
- jr .mod10
-.asm_34c2
- add 10
-
- push af
- ld a, b
- ld [de], a
- inc de
- pop af
-
- ld b, "0"
- add b
- ld [de], a
-
-; End the string
- inc de
- ld a, "@"
- ld [de], a
-
- pop af
- ld [$d265], a
- pop bc
- pop de
- pop hl
- ret
-
-.TMText
- db "TM"
-.TMTextEnd
- db "@"
-
-.HMText
- db "HM"
-.HMTextEnd
- db "@"
-; 34df
-
-
-IsHM: ; 34df
- cp HM_01
- jr c, .NotHM
- scf
- ret
-.NotHM
- and a
- ret
-; 34e7
-
-
-IsHMMove: ; 34e7
- ld hl, .HMMoves
- ld de, 1
- jp IsInArray
-
-.HMMoves
- db CUT
- db FLY
- db SURF
- db STRENGTH
- db FLASH
- db WATERFALL
- db WHIRLPOOL
- db $ff
-; 34f8
-
-
-GetMoveName: ; 34f8
- push hl
-; move name
- ld a, $2 ; move names
- ld [$cf61], a
-; move id
- ld a, [$d265]
- ld [CurSpecies], a
-
- call GetName
- ld de, StringBuffer1
- pop hl
- ret
-; 350c
-
-
-Function350c: ; 350c
- call Function1c66
- ld a, [hROMBank]
- push af
- ld a, $9
- rst Bankswitch
-
- call Function245af
- call Function3524
- call Function245cb
- pop af
- rst Bankswitch
-
- ld a, [$cf73]
- ret
-; 3524
-
-Function3524: ; 3524
- ld hl, VramState
- bit 0, [hl]
- jp nz, UpdateTimePals
- jp Function32f9
-; 352f
-
-Function352f: ; 352f
- ld a, [$cf82]
- dec a
- ld b, a
- ld a, [$cf84]
- sub b
- ld d, a
- ld a, [$cf83]
- dec a
- ld c, a
- ld a, [$cf85]
- sub c
- ld e, a
- push de
- call GetTileCoord
- pop bc
- jp TextBox
-; 354b
-
-Function354b: ; 354b
- call DelayFrame
- ld a, [$ffaa]
- push af
- ld a, $1
- ld [$ffaa], a
- call Functiona57
- pop af
- ld [$ffaa], a
- ld a, [$ffa9]
- and $f0
- ld c, a
- ld a, [hJoyPressed]
- and $f
- or c
- ld c, a
- ret
-; 3567
-
-
-Function3567: ; 3567
- ld a, [hROMBank]
- push af
- call Function2c52
- call Function3574
- pop bc
- ld a, b
- rst Bankswitch
-
- ret
-; 3574
-
-Function3574: ; 3574
- ld hl, $0001
- add hl, de
- ld a, [hl]
- cp $ff
- jr z, .asm_3597
- ld l, a
- push hl
- call Function3599
- pop hl
- jr nc, .asm_3597
- ld d, a
- ld e, l
- call Function35de
- jr nc, .asm_3597
- call Function2631
- callba Function96c56
- scf
- ret
-
-.asm_3597
- and a
- ret
-; 3599
-
-Function3599: ; 3599
- push de
- ld hl, $0010
- add hl, de
- ld a, [hl]
- ld hl, $0011
- add hl, de
- ld e, [hl]
- sub $4
- ld d, a
- ld a, e
- sub $4
- ld e, a
- call Function35b0
- pop de
- ret
-; 35b0
-
-Function35b0: ; 35b0
- ld hl, $dbfc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld a, [$dbfb]
- and a
- jr z, .asm_35d3
-.asm_35bc
- push af
- ld a, [hl]
- cp e
- jr nz, .asm_35c8
- inc hl
- ld a, [hld]
- cp d
- jr nz, .asm_35c8
- jr .asm_35d5
-
-.asm_35c8
- ld a, $5
- add l
- ld l, a
- jr nc, .asm_35cf
- inc h
-
-.asm_35cf
- pop af
- dec a
- jr nz, .asm_35bc
-
-.asm_35d3
- and a
- ret
-
-.asm_35d5
- pop af
- ld d, a
- ld a, [$dbfb]
- sub d
- inc a
- scf
- ret
-; 35de
-
-Function35de: ; 35de
- inc e
- ld hl, $0001
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
-.asm_35e6
- ld a, [hli]
- cp $ff
- jr z, .asm_35fc
- cp d
- jr nz, .asm_35f7
- ld a, [hli]
- cp e
- jr nz, .asm_35f8
- ld a, [hli]
- ld h, [hl]
- ld l, a
- jr .asm_35fe
-
-.asm_35f7
- inc hl
-
-.asm_35f8
- inc hl
- inc hl
- jr .asm_35e6
-
-.asm_35fc
- and a
- ret
-
-.asm_35fe
- scf
- ret
-; 3600
-
-
-CheckTrainerBattle2: ; 3600
-
- ld a, [hROMBank]
- push af
- call Function2c52
-
- call CheckTrainerBattle
-
- pop bc
- ld a, b
- rst Bankswitch
- ret
-; 360d
-
-
-CheckTrainerBattle: ; 360d
-; Check if any trainer on the map sees the player and wants to battle.
-
-; Skip the player object.
- ld a, 1
- ld de, MapObjects + OBJECT_LENGTH
-
-.loop
-
-; Start a battle if the object:
-
- push af
- push de
-
-; Has a sprite
- ld hl, $0001
- add hl, de
- ld a, [hl]
- and a
- jr z, .next
-
-; Is a trainer
- ld hl, $0008
- add hl, de
- ld a, [hl]
- and $f
- cp $2
- jr nz, .next
-
-; Is visible on the map
- ld hl, $0000
- add hl, de
- ld a, [hl]
- cp $ff
- jr z, .next
-
-; Is facing the player...
- call Function1ae5
- call FacingPlayerDistance_bc
- jr nc, .next
-
-; ...within their sight range
- ld hl, $0009
- add hl, de
- ld a, [hl]
- cp b
- jr c, .next
-
-; And hasn't already been beaten
- push bc
- push de
- ld hl, $000a
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld b, CHECK_FLAG
- call EventFlagAction
- ld a, c
- pop de
- pop bc
- and a
- jr z, .asm_3666
-
-.next
- pop de
- ld hl, OBJECT_LENGTH
- add hl, de
- ld d, h
- ld e, l
-
- pop af
- inc a
- cp NUM_OBJECTS
- jr nz, .loop
- xor a
- ret
-
-.asm_3666
- pop de
- pop af
- ld [$ffe0], a
- ld a, b
- ld [$d03f], a
- ld a, c
- ld [MartPointer], a
- jr Function367e
-; 3674
-
-Function3674: ; 3674
- ld a, $1
- ld [$d03f], a
- ld a, $ff
- ld [MartPointer], a
-
-Function367e: ; 367e
- call GetMapScriptHeaderBank
- ld [EngineBuffer1], a
- ld a, [$ffe0]
- call GetMapObject
- ld hl, $000a
- add hl, bc
- ld a, [EngineBuffer1]
- call GetFarHalfword
- ld de, $d041
- ld bc, $000d
- ld a, [EngineBuffer1]
- call FarCopyBytes
- xor a
- ld [$d04d], a
- scf
- ret
-; 36a5
-
-
-FacingPlayerDistance_bc: ; 36a5
-
- push de
- call FacingPlayerDistance
- ld b, d
- ld c, e
- pop de
- ret
-; 36ad
-
-
-FacingPlayerDistance: ; 36ad
-; Return carry if the sprite at bc is facing the player,
-; and its distance in d.
-
- ld hl, $0010 ; x
- add hl, bc
- ld d, [hl]
-
- ld hl, $0011 ; y
- add hl, bc
- ld e, [hl]
-
- ld a, [MapX]
- cp d
- jr z, .CheckY
-
- ld a, [MapY]
- cp e
- jr z, .CheckX
-
- and a
- ret
-
-.CheckY
- ld a, [MapY]
- sub e
- jr z, .NotFacing
- jr nc, .Above
-
-; Below
- cpl
- inc a
- ld d, a
- ld e, UP << 2
- jr .CheckFacing
-
-.Above
- ld d, a
- ld e, DOWN << 2
- jr .CheckFacing
-
-.CheckX
- ld a, [MapX]
- sub d
- jr z, .NotFacing
- jr nc, .Left
-
-; Right
- cpl
- inc a
- ld d, a
- ld e, LEFT << 2
- jr .CheckFacing
-
-.Left
- ld d, a
- ld e, RIGHT << 2
-
-.CheckFacing
- call GetSpriteDirection
- cp e
- jr nz, .NotFacing
- scf
- ret
-
-.NotFacing
- and a
- ret
-; 36f5
-
-
-Function36f5: ; 36f5
- push bc
- ld hl, $0001
- add hl, bc
- ld a, [hl]
- call GetMapObject
- ld hl, $000a
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- call GetMapScriptHeaderBank
- call GetFarHalfword
- ld d, h
- ld e, l
- push de
- ld b, $2
- call EventFlagAction
- pop de
- ld a, c
- and a
- pop bc
- ret
-; 3718
-
-
-Function3718: ; 3718
- ld a, [BattleType]
- cp $1
- jr .asm_3724
-
- ld hl, WalkingTile
- jr .asm_3731
-
-.asm_3724
- ld a, [$d0ee]
- ld hl, WalkingTile
- and $f
- jr z, .asm_3731
- ld hl, $d049
-
-.asm_3731
- ld a, [hli]
- ld h, [hl]
- ld l, a
- call GetMapScriptHeaderBank
- call FarPrintText
- call WaitBGMap
- call Functiona80
- ret
-; 3741
-
-
-
-IsAPokemon: ; 3741
-; Return carry if species a is not a Pokemon.
- and a
- jr z, .NotAPokemon
- cp EGG
- jr z, .Pokemon
- cp NUM_POKEMON + 1
- jr c, .Pokemon
-
-.NotAPokemon
- scf
- ret
-
-.Pokemon
- and a
- ret
-; 3750
-
-
-DrawHPBar: ; 3750
-; Draw an HP bar d tiles long at hl
-; Fill it up to e pixels
-
- push hl
- push de
- push bc
-
-; Place 'HP:'
- ld a, $60
- ld [hli], a
- ld a, $61
- ld [hli], a
-
-; Draw a template
- push hl
- ld a, $62 ; empty bar
-.template
- ld [hli], a
- dec d
- jr nz, .template
- ld a, $6b ; bar end
- add b
- ld [hl], a
- pop hl
-
-; Safety check # pixels
- ld a, e
- and a
- jr nz, .fill
- ld a, c
- and a
- jr z, .done
- ld e, 1
-
-.fill
-; Keep drawing tiles until pixel length is reached
- ld a, e
- sub TILE_WIDTH
- jr c, .lastbar
-
- ld e, a
- ld a, $6a ; full bar
- ld [hli], a
- ld a, e
- and a
- jr z, .done
- jr .fill
-
-.lastbar
- ld a, $62 ; empty bar
- add e ; + e
- ld [hl], a
-
-.done
- pop bc
- pop de
- pop hl
- ret
-; 3786
-
-
-Function3786: ; 3786
- ld a, $1
- ld [$c2c6], a
-
-Function378b: ; 378b
- ld a, [CurPartySpecies]
- call IsAPokemon
- jr c, .asm_37ad
- push hl
- ld de, VTiles2
- ld a, $3c
- call Predef
- pop hl
- xor a
- ld [$ffad], a
- ld bc, $0707
- ld a, $13
- call Predef
- xor a
- ld [$c2c6], a
- ret
-
-.asm_37ad
- xor a
- ld [$c2c6], a
- inc a
- ld [CurPartySpecies], a
- ret
-; 37b6
-
-Function37b6: ; 37b6
- push af
- ld a, $1
- ld [$c2bc], a
- pop af
- call Function37e2
- call WaitSFX
- ret
-; 37c4
-
-Function37c4: ; 37c4
- push af
- ld a, $1
- ld [$c2bc], a
- pop af
- jp Function37e2
-; 37ce
-
-Function37ce: ; 37ce
- call Function37d5
- call WaitSFX
- ret
-; 37d5
-
-Function37d5: ; 37d5
- push af
- xor a
- ld [$c2bc], a
- ld [CryTracks], a
- pop af
- call Function37e2
- ret
-; 37e2
-
-Function37e2: ; 37e2
- push hl
- push de
- push bc
- call Function381e
- jr c, .asm_37ef
- ld e, c
- ld d, b
- call PlayCryHeader
-
-.asm_37ef
- pop bc
- pop de
- pop hl
- ret
-; 37f3
-
-Function37f3: ; 37f3
- call Function381e
- ret c
- ld a, [hROMBank]
- push af
- ld a, $3c
- rst Bankswitch
-
- ld hl, $6787
- add hl, bc
- add hl, bc
- add hl, bc
- add hl, bc
- add hl, bc
- add hl, bc
- ld e, [hl]
- inc hl
- ld d, [hl]
- inc hl
- ld a, [hli]
- ld [CryPitch], a
- ld a, [hli]
- ld [CryEcho], a
- ld a, [hli]
- ld [CryLength], a
- ld a, [hl]
- ld [$c2b3], a
- pop af
- rst Bankswitch
-
- and a
- ret
-; 381e
-
-Function381e: ; 381e
- and a
- jr z, .asm_382b
- cp $fc
- jr nc, .asm_382b
- dec a
- ld c, a
- ld b, $0
- and a
- ret
-
-.asm_382b
- scf
- ret
-; 382d
-
-
-PrintLevel: ; 382d
-; Print TempMonLevel at hl
-
- ld a, [TempMonLevel]
- ld [hl], $6e ; ":L"
- inc hl
-
-; How many digits?
- ld c, 2
- cp 100
- jr c, Function3842
-
-; 3-digit numbers overwrite the :L.
- dec hl
- inc c
- jr Function3842
-; 383d
-
-Function383d: ; 383d
-; Print :L and all 3 digits
- ld [hl], $6e
- inc hl
- ld c, 3
-; 3842
-
-Function3842: ; 3842
- ld [$d265], a
- ld de, $d265
- ld b, %01000001 ; flags
- jp PrintNum
-; 384d
-
-
-Function384d: ; 384d
- ld hl, $d25e
- ld c, a
- ld b, $0
- add hl, bc
- ld a, [hl]
- ret
-; 3856
-
-
-GetBaseData: ; 3856
- push bc
- push de
- push hl
- ld a, [hROMBank]
- push af
- ld a, BANK(BaseData)
- rst Bankswitch
-
-; Egg doesn't have BaseData
- ld a, [CurSpecies]
- cp EGG
- jr z, .egg
-
-; Get BaseData
- dec a
- ld bc, BaseData1 - BaseData0
- ld hl, BaseData
- call AddNTimes
- ld de, CurBaseData
- ld bc, BaseData1 - BaseData0
- call CopyBytes
- jr .end
-
-.egg
-; ????
- ld de, $7d9c
-
-; Sprite dimensions
- ld b, $55 ; 5x5
- ld hl, BasePicSize
- ld [hl], b
-
-; ????
- ld hl, BasePadding
- ld [hl], e
- inc hl
- ld [hl], d
- inc hl
- ld [hl], e
- inc hl
- ld [hl], d
- jr .end
-
-.end
-; Replace Pokedex # with species
- ld a, [CurSpecies]
- ld [BaseDexNo], a
-
- pop af
- rst Bankswitch
- pop hl
- pop de
- pop bc
- ret
-; 389c
-
-
-GetCurNick: ; 389c
- ld a, [CurPartyMon]
- ld hl, PartyMonNicknames
-
-GetNick: ; 38a2
-; Get nickname a from list hl.
-
- push hl
- push bc
-
- call SkipNames
- ld de, StringBuffer1
-
- push de
- ld bc, PKMN_NAME_LENGTH
- call CopyBytes
- pop de
-
- callab CheckNickErrors
-
- pop bc
- pop hl
- ret
-; 38bb
-
-
-PrintBCDNumber: ; 38bb
-; function to print a BCD (Binary-coded decimal) number
-; de = address of BCD number
-; hl = destination address
-; c = flags and length
-; bit 7: if set, do not print leading zeroes
-; if unset, print leading zeroes
-; bit 6: if set, left-align the string (do not pad empty digits with spaces)
-; if unset, right-align the string
-; bit 5: if set, print currency symbol at the beginning of the string
-; if unset, do not print the currency symbol
-; bits 0-4: length of BCD number in bytes
-; Note that bits 5 and 7 are modified during execution. The above reflects
-; their meaning at the beginning of the functions's execution.
- ld b, c ; save flags in b
- res 7, c
- res 6, c
- res 5, c ; c now holds the length
- bit 5, b
- jr z, .loop
- bit 7, b
- jr nz, .loop
- ld [hl], "¥"
- inc hl
-.loop
- ld a, [de]
- swap a
- call PrintBCDDigit ; print upper digit
- ld a, [de]
- call PrintBCDDigit ; print lower digit
- inc de
- dec c
- jr nz, .loop
- bit 7, b ; were any non-zero digits printed?
- jr z, .done ; if so, we are done
-.numberEqualsZero ; if every digit of the BCD number is zero
- bit 6, b ; left or right alignment?
- jr nz, .skipRightAlignmentAdjustment
- dec hl ; if the string is right-aligned, it needs to be moved back one space
-.skipRightAlignmentAdjustment
- bit 5, b
- jr z, .skipCurrencySymbol
- ld [hl], "¥" ; currency symbol
- inc hl
-.skipCurrencySymbol
- ld [hl], "0"
- call PrintLetterDelay
- inc hl
-.done
- ret
-; 0x38f2
-
-PrintBCDDigit: ; 38f2
- and a, %00001111
- and a
- jr z, .zeroDigit
-.nonzeroDigit
- bit 7, b ; have any non-space characters been printed?
- jr z, .outputDigit
-; if bit 7 is set, then no numbers have been printed yet
- bit 5, b ; print the currency symbol?
- jr z, .skipCurrencySymbol
- ld [hl], "¥"
- inc hl
- res 5, b
-.skipCurrencySymbol
- res 7, b ; unset 7 to indicate that a nonzero digit has been reached
-.outputDigit
- add a, "0"
- ld [hli], a
- jp PrintLetterDelay
-.zeroDigit
- bit 7, b ; either printing leading zeroes or already reached a nonzero digit?
- jr z, .outputDigit ; if so, print a zero digit
- bit 6, b ; left or right alignment?
- ret nz
- ld a, " "
- ld [hli], a ; if right-aligned, "print" a space by advancing the pointer
- ret
-; 0x3917
-
-GetPartyParamLocation: ; 3917
-; Get the location of parameter a from CurPartyMon in hl
- push bc
- ld hl, PartyMons
- ld c, a
- ld b, $00
- add hl, bc
- ld a, [CurPartyMon]
- call GetPartyLocation
- pop bc
- ret
-; 3927
-
-GetPartyLocation: ; 3927
-; Add the length of a PartyMon struct to hl a times.
- ld bc, PartyMon2 - PartyMon1
- jp AddNTimes
-; 392d
-
-
-Function392d: ; 392d
- push hl
- ld a, b
- dec a
- ld b, $0
- add hl, bc
- ld hl, $5424
- ld bc, $0020
- call AddNTimes
- ld a, $14
- call GetFarHalfword
- ld b, l
- ld c, h
- pop hl
- ret
-; 3945
-
-
-UserPartyAttr: ; 3945
- push af
- ld a, [hBattleTurn]
- and a
- jr nz, .asm_394e
- pop af
- jr BattlePartyAttr
-.asm_394e
- pop af
- jr OTPartyAttr
-; 3951
-
-
-OpponentPartyAttr: ; 3951
- push af
- ld a, [hBattleTurn]
- and a
- jr z, .asm_395a
- pop af
- jr BattlePartyAttr
-.asm_395a
- pop af
- jr OTPartyAttr
-; 395d
-
-
-BattlePartyAttr: ; 395d
-; Get attribute a from the active BattleMon's party struct.
- push bc
- ld c, a
- ld b, 0
- ld hl, PartyMons
- add hl, bc
- ld a, [CurBattleMon]
- call GetPartyLocation
- pop bc
- ret
-; 396d
-
-
-OTPartyAttr: ; 396d
-; Get attribute a from the active EnemyMon's party struct.
- push bc
- ld c, a
- ld b, 0
- ld hl, OTPartyMon1Species
- add hl, bc
- ld a, [CurOTMon]
- call GetPartyLocation
- pop bc
- ret
-; 397d
-
-
-ResetDamage: ; 397d
- xor a
- ld [CurDamage], a
- ld [CurDamage + 1], a
- ret
-; 3985
-
-SetPlayerTurn: ; 3985
- xor a
- ld [hBattleTurn], a
- ret
-; 3989
-
-SetEnemyTurn: ; 3989
- ld a, 1
- ld [hBattleTurn], a
- ret
-; 398e
-
-
-UpdateOpponentInParty: ; 398e
- ld a, [hBattleTurn]
- and a
- jr z, UpdateEnemyMonInParty
- jr UpdateBattleMonInParty
-; 3995
-
-UpdateUserInParty: ; 3995
- ld a, [hBattleTurn]
- and a
- jr z, UpdateBattleMonInParty
- jr UpdateEnemyMonInParty
-; 399c
-
-UpdateBattleMonInParty: ; 399c
-; Update level, status, current HP
-
- ld a, [CurBattleMon]
-
-Function399f: ; 399f
- ld hl, PartyMon1Level
- call GetPartyLocation
-
- ld d, h
- ld e, l
- ld hl, BattleMonLevel
- ld bc, BattleMonMaxHP - BattleMonLevel
- jp CopyBytes
-; 39b0
-
-UpdateEnemyMonInParty: ; 39b0
-; Update level, status, current HP
-
-; No wildmons.
- ld a, [IsInBattle]
- dec a
- ret z
-
- ld a, [CurOTMon]
- ld hl, OTPartyMon1Level
- call GetPartyLocation
-
- ld d, h
- ld e, l
- ld hl, EnemyMonLevel
- ld bc, EnemyMonMaxHP - EnemyMonLevel
- jp CopyBytes
-; 39c9
-
-
-RefreshBattleHuds: ; 39c9
- call UpdateBattleHuds
- ld c, 3
- call DelayFrames
- jp WaitBGMap
-; 39d4
-
-UpdateBattleHuds: ; 39d4
- callba Function3df48
- callba Function3e036
- ret
-; 39e1
-
-
-GetBattleVar: ; 39e1
-; Preserves hl.
- push hl
- call _GetBattleVar
- pop hl
- ret
-; 39e7
-
-_GetBattleVar: ; 39e7
-; Get variable from pair a, depending on whose turn it is.
-; There are 21 variable pairs.
-
- push bc
-
- ld hl, .battlevarpairs
- ld c, a
- ld b, 0
- add hl, bc
- add hl, bc
-
- ld a, [hli]
- ld h, [hl]
- ld l, a
-
-; Enemy turn uses the second byte instead.
-; This lets battle variable calls be side-neutral.
- ld a, [hBattleTurn]
- and a
- jr z, .getvar
- inc hl
-
-.getvar
-; var id
- ld a, [hl]
- ld c, a
- ld b, 0
-
- ld hl, .vars
- add hl, bc
- add hl, bc
-
- ld a, [hli]
- ld h, [hl]
- ld l, a
-
- ld a, [hl]
-
- pop bc
- ret
-
-
-.battlevarpairs
- dw .substatus1, .substatus2, .substatus3, .substatus4, .substatus5
- dw .substatus1opp, .substatus2opp, .substatus3opp, .substatus4opp, .substatus5opp
- dw .status, .statusopp, .animation, .effect, .power, .type
- dw .curmove, .lastcounter, .lastcounteropp, .lastmove, .lastmoveopp
-
-
- const_def
- const PLAYER_SUBSTATUS_1
- const ENEMY_SUBSTATUS_1
- const PLAYER_SUBSTATUS_2
- const ENEMY_SUBSTATUS_2
- const PLAYER_SUBSTATUS_3
- const ENEMY_SUBSTATUS_3
- const PLAYER_SUBSTATUS_4
- const ENEMY_SUBSTATUS_4
- const PLAYER_SUBSTATUS_5
- const ENEMY_SUBSTATUS_5
- const PLAYER_STATUS
- const ENEMY_STATUS
- const PLAYER_MOVE_ANIMATION
- const ENEMY_MOVE_ANIMATION
- const PLAYER_MOVE_EFFECT
- const ENEMY_MOVE_EFFECT
- const PLAYER_MOVE_POWER
- const ENEMY_MOVE_POWER
- const PLAYER_MOVE_TYPE
- const ENEMY_MOVE_TYPE
- const PLAYER_CUR_MOVE
- const ENEMY_CUR_MOVE
- const PLAYER_COUNTER_MOVE
- const ENEMY_COUNTER_MOVE
- const PLAYER_LAST_MOVE
- const ENEMY_LAST_MOVE
-
-
-; player enemy
-.substatus1 db PLAYER_SUBSTATUS_1, ENEMY_SUBSTATUS_1
-.substatus1opp db ENEMY_SUBSTATUS_1, PLAYER_SUBSTATUS_1
-.substatus2 db PLAYER_SUBSTATUS_2, ENEMY_SUBSTATUS_2
-.substatus2opp db ENEMY_SUBSTATUS_2, PLAYER_SUBSTATUS_2
-.substatus3 db PLAYER_SUBSTATUS_3, ENEMY_SUBSTATUS_3
-.substatus3opp db ENEMY_SUBSTATUS_3, PLAYER_SUBSTATUS_3
-.substatus4 db PLAYER_SUBSTATUS_4, ENEMY_SUBSTATUS_4
-.substatus4opp db ENEMY_SUBSTATUS_4, PLAYER_SUBSTATUS_4
-.substatus5 db PLAYER_SUBSTATUS_5, ENEMY_SUBSTATUS_5
-.substatus5opp db ENEMY_SUBSTATUS_5, PLAYER_SUBSTATUS_5
-.status db PLAYER_STATUS, ENEMY_STATUS
-.statusopp db ENEMY_STATUS, PLAYER_STATUS
-.animation db PLAYER_MOVE_ANIMATION, ENEMY_MOVE_ANIMATION
-.effect db PLAYER_MOVE_EFFECT, ENEMY_MOVE_EFFECT
-.power db PLAYER_MOVE_POWER, ENEMY_MOVE_POWER
-.type db PLAYER_MOVE_TYPE, ENEMY_MOVE_TYPE
-.curmove db PLAYER_CUR_MOVE, ENEMY_CUR_MOVE
-.lastcounter db PLAYER_COUNTER_MOVE, ENEMY_COUNTER_MOVE
-.lastcounteropp db ENEMY_COUNTER_MOVE, PLAYER_COUNTER_MOVE
-.lastmove db PLAYER_LAST_MOVE, ENEMY_LAST_MOVE
-.lastmoveopp db ENEMY_LAST_MOVE, PLAYER_LAST_MOVE
-
-.vars
- dw PlayerSubStatus1, EnemySubStatus1
- dw PlayerSubStatus2, EnemySubStatus2
- dw PlayerSubStatus3, EnemySubStatus3
- dw PlayerSubStatus4, EnemySubStatus4
- dw PlayerSubStatus5, EnemySubStatus5
- dw BattleMonStatus, EnemyMonStatus
- dw PlayerMoveAnimation, EnemyMoveAnimation
- dw PlayerMoveEffect, EnemyMoveEffect
- dw PlayerMovePower, EnemyMovePower
- dw PlayerMoveType, EnemyMoveType
- dw CurPlayerMove, CurEnemyMove
- dw LastEnemyCounterMove, LastPlayerCounterMove
- dw LastPlayerMove, LastEnemyMove
-; 3a90
-
-
-Function3a90: ; 3a90
- inc hl
- ld a, [hROMBank]
- push af
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- ld a, [hli]
- ld [hROMBank], a
- ld [MBC3RomBank], a
- ld a, e
- ld l, a
- ld a, d
- ld h, a
- ld de, $d00c
- ld bc, $0028
- call CopyBytes
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
- ret
-; 3ab2
-
-
-MobileTextBorder: ; 3ab2
-; For mobile link battles only.
- ld a, [InLinkBattle]
- cp 4
- ret c
-; Draw a cell phone icon at the top right corner of the border.
- ld hl, $c5a3 ; TileMap(19,12)
- ld [hl], $5e ; cell phone top
- ld hl, $c5b7 ; TileMap(19,13)
- ld [hl], $5f ; cell phone bottom
- ret
-; 3ac3
-
-
-BattleTextBox: ; 3ac3
-; Open a textbox and print text at hl.
- push hl
- call SpeechTextBox
- call MobileTextBorder
- call Function1ad2
- call Function321c
- pop hl
- call PrintTextBoxText
- ret
-; 3ad5
-
-
-StdBattleTextBox: ; 3ad5
-; Open a textbox and print battle text at 20:hl.
-
- ld a, [hROMBank]
- push af
-
- ld a, BANK(BattleText)
- rst Bankswitch
-
- call BattleTextBox
-
- pop af
- rst Bankswitch
- ret
-; 3ae1
-
-
-Function3ae1: ; 3ae1
- ld a, $32
- rst Bankswitch
-
- ld a, [hli]
- ld [$d410], a
- ld a, [hl]
- ld [$d411], a
- ld a, $33
- rst Bankswitch
-
- ret
-; 3af0
-
-Function3af0: ; 3af0
- push hl
- push de
- ld hl, $d410
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld a, $32
- rst Bankswitch
-
- ld a, [de]
- ld [$d417], a
- inc de
- ld a, $33
- rst Bankswitch
-
- ld [hl], d
- dec hl
- ld [hl], e
- pop de
- pop hl
- ld a, [$d417]
- ret
-; 3b0c
-
-Function3b0c: ; 3b0c
- ld a, [hLCDStatCustom]
- and a
- ret z
-
- ld a, $00
- ld [Requested2bppSource], a
- ld a, $d2
- ld [Requested2bppSource + 1], a
-
- ld a, $00
- ld [Requested2bppDest], a
- ld a, $d1
- ld [Requested2bppDest + 1], a
-
- ld a, $9
- ld [Requested2bpp], a
- ret
-; 3b2a
-
-
-
-Function3b2a: ; 3b2a
- ld [$c3b8], a
- ld a, [hROMBank]
- push af
- ld a, BANK(Function8cfd6)
- rst Bankswitch
-
- ld a, [$c3b8]
- call Function8cfd6
- pop af
- rst Bankswitch
-
- ret
-; 3b3c
-
-
-Function3b3c: ; 3b3c
- ld [$c3b8], a
- ld a, [hROMBank]
- push af
- ld a, BANK(Function8d120)
- rst Bankswitch
-
- ld a, [$c3b8]
- call Function8d120
- pop af
- rst Bankswitch
-
- ret
-; 3b4e
-
-
-SoundRestart: ; 3b4e
-
- push hl
- push de
- push bc
- push af
-
- ld a, [hROMBank]
- push af
- ld a, BANK(_SoundRestart)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- call _SoundRestart
-
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3b6a
-
-
-UpdateSound: ; 3b6a
-
- push hl
- push de
- push bc
- push af
-
- ld a, [hROMBank]
- push af
- ld a, BANK(_UpdateSound)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- call _UpdateSound
-
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3b86
-
-
-_LoadMusicByte: ; 3b86
-; CurMusicByte = [a:de]
-
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- ld a, [de]
- ld [CurMusicByte], a
- ld a, BANK(LoadMusicByte)
-
- ld [hROMBank], a
- ld [MBC3RomBank], a
- ret
-; 3b97
-
-
-PlayMusic: ; 3b97
-; Play music de.
-
- push hl
- push de
- push bc
- push af
-
- ld a, [hROMBank]
- push af
- ld a, BANK(_PlayMusic) ; and BANK(_SoundRestart)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- ld a, e
- and a
- jr z, .nomusic
-
- call _PlayMusic
- jr .end
-
-.nomusic
- call _SoundRestart
-
-.end
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3bbc
-
-
-PlayMusic2: ; 3bbc
-; Stop playing music, then play music de.
-
- push hl
- push de
- push bc
- push af
-
- ld a, [hROMBank]
- push af
- ld a, BANK(_PlayMusic)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- push de
- ld de, MUSIC_NONE
- call _PlayMusic
- call DelayFrame
- pop de
- call _PlayMusic
-
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- pop af
- pop bc
- pop de
- pop hl
- ret
-
-; 3be3
-
-
-PlayCryHeader: ; 3be3
-; Play a cry given parameters in header de
-
- push hl
- push de
- push bc
- push af
-
-; Save current bank
- ld a, [hROMBank]
- push af
-
-; Cry headers are stuck in one bank.
- ld a, BANK(CryHeaders)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
-; Each header is 6 bytes long:
- ld hl, CryHeaders
- add hl, de
- add hl, de
- add hl, de
- add hl, de
- add hl, de
- add hl, de
-
- ld e, [hl]
- inc hl
- ld d, [hl]
- inc hl
-
- ld a, [hli]
- ld [CryPitch], a
- ld a, [hli]
- ld [CryEcho], a
- ld a, [hli]
- ld [CryLength], a
- ld a, [hl]
- ld [CryLength+1], a
-
- ld a, BANK(PlayCry)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- call PlayCry
-
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3c23
-
-
-PlaySFX: ; 3c23
-; Play sound effect de.
-; Sound effects are ordered by priority (lowest to highest)
-
- push hl
- push de
- push bc
- push af
-
-; Is something already playing?
- call CheckSFX
- jr nc, .play
-; Does it have priority?
- ld a, [CurSFX]
- cp e
- jr c, .quit
-
-.play
- ld a, [hROMBank]
- push af
- ld a, BANK(_PlaySFX)
- ld [hROMBank], a
- ld [MBC3RomBank], a ; bankswitch
-
- ld a, e
- ld [CurSFX], a
- call _PlaySFX
-
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a ; bankswitch
-.quit
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3c4e
-
-
-WaitPlaySFX: ; 3c4e
- call WaitSFX
- call PlaySFX
- ret
-; 3c55
-
-
-WaitSFX: ; 3c55
-; infinite loop until sfx is done playing
-
- push hl
-
-.loop
- ; ch5 on?
- ld hl, Channel5 + Channel1Flags - Channel1
- bit 0, [hl]
- jr nz, .loop
- ; ch6 on?
- ld hl, Channel6 + Channel1Flags - Channel1
- bit 0, [hl]
- jr nz, .loop
- ; ch7 on?
- ld hl, Channel7 + Channel1Flags - Channel1
- bit 0, [hl]
- jr nz, .loop
- ; ch8 on?
- ld hl, Channel8 + Channel1Flags - Channel1
- bit 0, [hl]
- jr nz, .loop
-
- pop hl
- ret
-; 3c74
-
-Function3c74: ; 3c74
- push hl
- ld hl, $c1cc
- bit 0, [hl]
- jr nz, .asm_3c94
- ld hl, $c1fe
- bit 0, [hl]
- jr nz, .asm_3c94
- ld hl, $c230
- bit 0, [hl]
- jr nz, .asm_3c94
- ld hl, $c262
- bit 0, [hl]
- jr nz, .asm_3c94
- pop hl
- scf
- ret
-
-.asm_3c94
- pop hl
- and a
- ret
-; 3c97
-
-MaxVolume: ; 3c97
- ld a, $77 ; max
- ld [Volume], a
- ret
-; 3c9d
-
-LowVolume: ; 3c9d
- ld a, $33 ; 40%
- ld [Volume], a
- ret
-; 3ca3
-
-VolumeOff: ; 3ca3
- xor a
- ld [Volume], a
- ret
-; 3ca8
-
-Function3ca8: ; 3ca8
- ld a, $4
- ld [MusicFade], a
- ret
-; 3cae
-
-Function3cae: ; 3cae
- ld a, $84
- ld [MusicFade], a
- ret
-; 3cb4
-
-Function3cb4: ; 3cb4
-.asm_3cb4
- and a
- ret z
- dec a
- call UpdateSound
- jr .asm_3cb4
-; 3cbc
-
-Function3cbc: ; 3cbc
- push hl
- push de
- push bc
- push af
- call Function3d97
- ld a, [CurMusic]
- cp e
- jr z, .asm_3cda
- ld a, $8
- ld [MusicFade], a
- ld a, e
- ld [MusicFadeIDLo], a
- ld a, d
- ld [MusicFadeIDHi], a
- ld a, e
- ld [CurMusic], a
-
-.asm_3cda
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3cdf
-
-Function3cdf: ; 3cdf
- push hl
- push de
- push bc
- push af
- call Function3d97
- ld a, [CurMusic]
- cp e
- jr z, .asm_3cfe
- push de
- ld de, MUSIC_NONE
- call PlayMusic
- call DelayFrame
- pop de
- ld a, e
- ld [CurMusic], a
- call PlayMusic
-
-.asm_3cfe
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3d03
-
-Function3d03: ; 3d03
- push hl
- push de
- push bc
- push af
- xor a
- ld [$c2c1], a
- ld de, MUSIC_BICYCLE
- ld a, [PlayerState]
- cp $1
- jr z, .asm_3d18
- call Function3d97
-.asm_3d18
- push de
- ld de, MUSIC_NONE
- call PlayMusic
- call DelayFrame
- pop de
- ld a, e
- ld [CurMusic], a
- call PlayMusic
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3d2f
-
-Function3d2f: ; 3d2f
- ld a, [$c2c1]
- and a
- jr z, Function3d47
- xor a
- ld [CurMusic], a
- ld de, MUSIC_NONE
- call PlayMusic
- call DelayFrame
- xor a
- ld [$c2c1], a
- ret
-; 3d47
-
-Function3d47: ; 3d47
- push hl
- push de
- push bc
- push af
- ld de, MUSIC_NONE
- call PlayMusic
- call DelayFrame
- ld a, [CurMusic]
- ld e, a
- ld d, 0
- call PlayMusic
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3d62
-
-Function3d62: ; 3d62
- ld a, [PlayerState]
- cp $4
- jr z, .asm_3d7b
- cp $8
- jr z, .asm_3d7b
- ld a, [StatusFlags2]
- bit 2, a
- jr nz, .asm_3d80
-.asm_3d74
- and a
- ret
-
- ld de, $0013
- scf
- ret
-
-.asm_3d7b
- ld de, $0021
- scf
- ret
-
-.asm_3d80
- ld a, [MapGroup]
- cp $a
- jr nz, .asm_3d74
- ld a, [MapNumber]
- cp $f
- jr z, .asm_3d92
- cp $11
- jr nz, .asm_3d74
-
-.asm_3d92
- ld de, $0058
- scf
- ret
-; 3d97
-
-Function3d97: ; 3d97
- call Function3d62
- ret c
- call Function2cbd
- ret
-; 3d9f
-
-Function3d9f: ; 3d9f
- ld a, $20
- ld [$c498], a
- ld [$c49c], a
- ld a, $50
- ld [$c499], a
- ld a, $58
- ld [$c49d], a
- xor a
- ld [$c49b], a
- ld [$c49f], a
- ld a, [$c296]
- cp $64
- jr nc, .asm_3dd5
- add $1
- daa
- ld b, a
- swap a
- and $f
- add $f6
- ld [$c49a], a
- ld a, b
- and $f
- add $f6
- ld [$c49e], a
- ret
-
-.asm_3dd5
- ld a, $ff
- ld [$c49a], a
- ld [$c49e], a
- ret
-; 3dde
-
-CheckSFX: ; 3dde
-; returns carry if sfx channels are active
- ld a, [$c1cc] ; 1
- bit 0, a
- jr nz, .quit
- ld a, [$c1fe] ; 2
- bit 0, a
- jr nz, .quit
- ld a, [$c230] ; 3
- bit 0, a
- jr nz, .quit
- ld a, [$c262] ; 4
- bit 0, a
- jr nz, .quit
- and a
- ret
-.quit
- scf
- ret
-; 3dfe
-
-Function3dfe: ; 3dfe
- xor a
- ld [$c1cc], a
- ld [SoundInput], a
- ld [rNR10], a
- ld [rNR11], a
- ld [rNR12], a
- ld [rNR13], a
- ld [rNR14], a
- ret
-; 3e10
-
-
-ChannelsOff: ; 3e10
-; Quickly turn off music channels
- xor a
- ld [Channel1Flags], a
- ld [$c136], a
- ld [$c168], a
- ld [$c19a], a
- ld [SoundInput], a
- ret
-; 3e21
-
-SFXChannelsOff: ; 3e21
-; Quickly turn off sound effect channels
- xor a
- ld [$c1cc], a
- ld [$c1fe], a
- ld [$c230], a
- ld [$c262], a
- ld [SoundInput], a
- ret
-; 3e32
-
-Function3e32: ; 3e32
- cp $2
- ld [$c988], a
- ld a, l
- ld [$c986], a
- ld a, h
- ld [$c987], a
- jr nz, .asm_3e4f
- ld [$c982], a
- ld a, l
- ld [$c981], a
- ld hl, $c983
- ld a, c
- ld [hli], a
- ld a, b
- ld [hl], a
-
-.asm_3e4f
- ld hl, $c822
- set 6, [hl]
- ld a, [hROMBank]
- push af
- ld a, BANK(Function110030)
- ld [$c981], a
- rst Bankswitch
-
- jp Function110030
-; 3e60
-
-
-Function3e60: ; 3e60
- ld [$c986], a
- ld a, l
- ld [$c987], a
- ld a, h
- ld [$c988], a
- pop bc
- ld a, b
- ld [$c981], a
- rst Bankswitch
-
- ld hl, $c822
- res 6, [hl]
- ld hl, $c987
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld a, [$c986]
- ret
-; 3e80
-
-
-Function3e80: ; 3e80
- ld a, [hROMBank]
- push af
- ld a, BANK(Function1116c5)
- ld [$c981], a
- rst Bankswitch
-
- call Function1116c5
- pop bc
- ld a, b
- ld [$c981], a
- rst Bankswitch
-
- ret
-; 3e93
-
-
-Timer: ; 3e93
- push af
- push bc
- push de
- push hl
-
- ld a, [$ffe9]
- and a
- jr z, .asm_3ed2
-
- xor a
- ld [rTAC], a
-
-; Turn off timer interrupt
- ld a, [rIF]
- and 1 << VBLANK | 1 << LCD_STAT | 1 << SERIAL | 1 << JOYPAD
- ld [rIF], a
-
- ld a, [$c86a]
- or a
- jr z, .asm_3ed2
-
- ld a, [$c822]
- bit 1, a
- jr nz, .asm_3eca
-
- ld a, [rSC]
- and 1 << rSC_ON
- jr nz, .asm_3eca
-
- ld a, [hROMBank]
- push af
- ld a, BANK(Function1118de)
- ld [$c981], a
- rst Bankswitch
-
- call Function1118de
-
- pop bc
- ld a, b
- ld [$c981], a
- rst Bankswitch
-
-.asm_3eca
- ld a, [rTMA]
- ld [rTIMA], a
-
- ld a, 1 << rTAC_ON | rTAC_65536_HZ
- ld [rTAC], a
-
-.asm_3ed2
- pop hl
- pop de
- pop bc
- pop af
- reti
-; 3ed7
-
-Function3ed7: ; 3ed7
- ld [$dc02], a
- ld a, [hROMBank]
- push af
- ld a, BANK(Function114243)
- rst Bankswitch
-
- call Function114243
- pop bc
- ld a, b
- rst Bankswitch
-
- ld a, [$dc02]
- ret
-; 3eea
-
-Function3eea: ; 3eea
- push hl
- push bc
- ld de, $0939
- add hl, de
- inc b
- inc b
- inc c
- inc c
- call Function3f35
- pop bc
- pop hl
- call Function3f47
- ret
-; 3efd
-
-Function3efd: ; 3efd
- push hl
- ld hl, $c590
- ld b, $4
- ld c, $12
- call Function3f0d
- pop hl
- call PrintTextBoxText
- ret
-; 3f0d
-
-Function3f0d: ; 3f0d
- push hl
- push bc
- ld de, $0939
- add hl, de
- inc b
- inc b
- inc c
- inc c
- call Function3f35
- pop bc
- pop hl
- call TextBoxBorder
- ret
-; 3f20
-
-Function3f20: ; 3f20
- ld hl, AttrMap
- ld b, $6
- ld c, $14
- call Function3f35
- ld hl, TileMap
- ld b, $4
- ld c, $12
- call Function3f47
- ret
-; 3f35
-
-Function3f35: ; 3f35
- ld a, $6
- ld de, $0014
-.asm_3f3a
- push bc
- push hl
-.asm_3f3c
- ld [hli], a
- dec c
- jr nz, .asm_3f3c
- pop hl
- add hl, de
- pop bc
- dec b
- jr nz, .asm_3f3a
- ret
-; 3f47
-
-Function3f47: ; 3f47
- push bc
- call Function3f58
- pop bc
-.asm_3f4c
- push bc
- call Function3f68
- pop bc
- dec b
- jr nz, .asm_3f4c
- call Function3f60
- ret
-; 3f58
-
-Function3f58: ; 3f58
- ld a, $63
- ld d, $62
- ld e, $64
- jr Function3f6e
-
-Function3f60: ; 3f60
- ld a, $68
- ld d, $67
- ld e, $69
- jr Function3f6e
-
-Function3f68: ; 3f68
- ld a, $7f
- ld d, $65
- ld e, $66
-
-Function3f6e: ; 3f6e
- push hl
- ld [hl], d
- inc hl
-.asm_3f71
- ld [hli], a
- dec c
- jr nz, .asm_3f71
- ld [hl], e
- pop hl
- ld de, $0014
- add hl, de
- ret
-; 3f7c
-
-Function3f7c: ; 3f7c
- call Function1cfd
- call Function1c53
- dec b
- dec c
- call Function3eea
- ret
-; 3f88
-
-Function3f88: ; 3f88
- ld hl, $d000
- ld b, $0
-.asm_3f8d
- push bc
- ld c, $8
-.asm_3f90
- ld a, [de]
- inc de
- cpl
- ld [hl], $0
- inc hl
- ld [hli], a
- dec c
- jr nz, .asm_3f90
- pop bc
- dec c
- jr nz, .asm_3f8d
- ret
-; 3f9f
-
-Function3f9f: ; 3f9f
- ld hl, $d000
-.asm_3fa2
- push bc
- ld c, $8
-.asm_3fa5
- ld a, [de]
- inc de
- inc de
- cpl
- ld [hl], $0
- inc hl
- ld [hli], a
- dec c
- jr nz, .asm_3fa5
- pop bc
- dec c
- jr nz, .asm_3fa2
- ret
-; 3fb5
-
-
SECTION "bank1", ROMX, BANK[$1]