shithub: pokecrystal

Download patch

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]