shithub: pokecrystal

Download patch

ref: 7f54df58bfb00564874f8b6b3acef52a9aff7442
parent: 5e4fa42fa7e2405760efc77f8c2e7167e67990ac
author: Remy Oukaour <[email protected]>
date: Sun Jan 21 13:00:23 EST 2018

Group engine/pokedex files

--- a/docs/bugs_and_glitches.md
+++ b/docs/bugs_and_glitches.md
@@ -993,7 +993,7 @@
 
 ([Video](https://www.youtube.com/watch?v=z305e4sIO24))
 
-The exact cause is unknown, but a workaround exists for `DexEntryScreen_MenuActionJumptable.Cry` in [engine/pokedex.asm](/engine/pokedex.asm):
+The exact cause is unknown, but a workaround exists for `DexEntryScreen_MenuActionJumptable.Cry` in [engine/pokedex/pokedex.asm](/engine/pokedex/pokedex.asm):
 
 ```asm
 .Cry: ; 40340
--- a/docs/design_flaws.md
+++ b/docs/design_flaws.md
@@ -228,7 +228,7 @@
 ...
 ```
 
-`Pokedex_LoadAnyFootprint` in [engine/pokedex.asm](/engine/pokedex.asm):
+`Pokedex_LoadAnyFootprint` in [engine/pokedex/pokedex.asm](/engine/pokedex/pokedex.asm):
 
 ```asm
 	push hl
@@ -282,7 +282,7 @@
 
 `PokedexDataPointerTable` in [data/pokemon/dex_entry_pointers.asm](/data/pokemon/dex_entry_pointers.asm) is a table of `dw`, not `dba`, yet there are four banks used for Pokédex entries. The correct bank is derived from the species ID at the beginning of each Pokémon's base stats. (This is the only use the base stat species ID has.)
 
-Three separate routines do the same derivation; `GetDexEntryPointer` in [engine/pokedex_2.asm](/engine/pokedex_2.asm):
+Three separate routines do the same derivation; `GetDexEntryPointer` in [engine/pokedex/pokedex_2.asm](/engine/pokedex/pokedex_2.asm):
 
 ```asm
 GetDexEntryPointer: ; 44333
--- a/engine/pokedex.asm
+++ /dev/null
@@ -1,2592 +1,0 @@
-; Pokedex_RunJumptable.Jumptable indexes
-	const_def
-	const DEXSTATE_MAIN_SCR
-	const DEXSTATE_UPDATE_MAIN_SCR
-	const DEXSTATE_DEX_ENTRY_SCR
-	const DEXSTATE_UPDATE_DEX_ENTRY_SCR
-	const DEXSTATE_REINIT_DEX_ENTRY_SCR
-	const DEXSTATE_SEARCH_SCR
-	const DEXSTATE_UPDATE_SEARCH_SCR
-	const DEXSTATE_OPTION_SCR
-	const DEXSTATE_UPDATE_OPTION_SCR
-	const DEXSTATE_SEARCH_RESULTS_SCR
-	const DEXSTATE_UPDATE_SEARCH_RESULTS_SCR
-	const DEXSTATE_UNOWN_MODE
-	const DEXSTATE_UPDATE_UNOWN_MODE
-	const DEXSTATE_EXIT
-
-POKEDEX_SCX EQU 5
-GLOBAL POKEDEX_SCX
-
-Pokedex: ; 40000
-
-	ld a, [hWX]
-	ld l, a
-	ld a, [hWY]
-	ld h, a
-	push hl
-	ld a, [hSCX]
-	push af
-	ld hl, Options
-	ld a, [hl]
-	push af
-	set NO_TEXT_SCROLL, [hl]
-	ld a, [VramState]
-	push af
-	xor a
-	ld [VramState], a
-	ld a, [hInMenu]
-	push af
-	ld a, $1
-	ld [hInMenu], a
-
-	xor a
-	ld [hMapAnims], a
-	call InitPokedex
-	call DelayFrame
-
-.main
-	call JoyTextDelay
-	ld a, [wJumptableIndex]
-	bit 7, a
-	jr nz, .exit
-	call Pokedex_RunJumptable
-	call DelayFrame
-	jr .main
-
-.exit
-	ld de, SFX_READ_TEXT_2
-	call PlaySFX
-	call WaitSFX
-	call ClearSprites
-	ld a, [wCurrentDexMode]
-	ld [wLastDexMode], a
-
-	pop af
-	ld [hInMenu], a
-	pop af
-	ld [VramState], a
-	pop af
-	ld [Options], a
-	pop af
-	ld [hSCX], a
-	pop hl
-	ld a, l
-	ld [hWX], a
-	ld a, h
-	ld [hWY], a
-	ret
-
-InitPokedex: ; 40063
-	call ClearBGPalettes
-	call ClearSprites
-	call ClearTileMap
-	call Pokedex_LoadGFX
-
-	ld hl, wPokedexDataStart
-	ld bc, wPokedexDataEnd - wPokedexDataStart
-	xor a
-	call ByteFill
-
-	xor a
-	ld [wJumptableIndex], a
-	ld [wPrevDexEntryJumptableIndex], a
-	ld [wPrevDexEntryBackup], a
-	ld [wcf66], a
-
-	call Pokedex_CheckUnlockedUnownMode
-
-	ld a, [wLastDexMode]
-	ld [wCurrentDexMode], a
-
-	call Pokedex_OrderMonsByMode
-	call Pokedex_InitCursorPosition
-	call Pokedex_GetLandmark
-	farcall DrawDexEntryScreenRightEdge
-	call Pokedex_ResetBGMapMode
-	ret
-
-Pokedex_CheckUnlockedUnownMode: ; 400a2
-	ld a, [wStatusFlags]
-	bit 1, a
-	jr nz, .unlocked
-
-	xor a
-	ld [wUnlockedUnownMode], a
-	ret
-
-.unlocked
-	ld a, TRUE
-	ld [wUnlockedUnownMode], a
-	ret
-
-Pokedex_InitCursorPosition: ; 400b4
-	ld hl, wPokedexOrder
-	ld a, [wPrevDexEntry]
-	and a
-	jr z, .done
-	cp NUM_POKEMON + 1
-	jr nc, .done
-
-	ld b, a
-	ld a, [wDexListingEnd]
-	cp $8
-	jr c, .only_one_page
-
-	sub $7
-	ld c, a
-.loop1
-	ld a, b
-	cp [hl]
-	jr z, .done
-	inc hl
-	ld a, [wDexListingScrollOffset]
-	inc a
-	ld [wDexListingScrollOffset], a
-	dec c
-	jr nz, .loop1
-
-.only_one_page
-	ld c, $7
-.loop2
-	ld a, b
-	cp [hl]
-	jr z, .done
-	inc hl
-	ld a, [wDexListingCursor]
-	inc a
-	ld [wDexListingCursor], a
-	dec c
-	jr nz, .loop2
-
-.done
-	ret
-
-Pokedex_GetLandmark: ; 400ed
-	ld a, [MapGroup]
-	ld b, a
-	ld a, [MapNumber]
-	ld c, a
-	call GetWorldMapLocation
-
-	cp SPECIAL_MAP
-	jr nz, .load
-
-	ld a, [BackupMapGroup]
-	ld b, a
-	ld a, [BackupMapNumber]
-	ld c, a
-	call GetWorldMapLocation
-
-.load
-	ld [wDexCurrentLocation], a
-	ret
-
-Pokedex_RunJumptable: ; 4010b
-	ld a, [wJumptableIndex]
-	ld hl, .Jumptable
-	call Pokedex_LoadPointer
-	jp hl
-
-.Jumptable: ; 40115 (10:4115)
-; entries correspond to DEXSTATE_* constants
-	dw Pokedex_InitMainScreen
-	dw Pokedex_UpdateMainScreen
-	dw Pokedex_InitDexEntryScreen
-	dw Pokedex_UpdateDexEntryScreen
-	dw Pokedex_ReinitDexEntryScreen
-	dw Pokedex_InitSearchScreen
-	dw Pokedex_UpdateSearchScreen
-	dw Pokedex_InitOptionScreen
-	dw Pokedex_UpdateOptionScreen
-	dw Pokedex_InitSearchResultsScreen
-	dw Pokedex_UpdateSearchResultsScreen
-	dw Pokedex_InitUnownMode
-	dw Pokedex_UpdateUnownMode
-	dw Pokedex_Exit
-
-Pokedex_IncrementDexPointer: ; 40131 (10:4131)
-	ld hl, wJumptableIndex
-	inc [hl]
-	ret
-
-Pokedex_Exit: ; 40136 (10:4136)
-	ld hl, wJumptableIndex
-	set 7, [hl]
-	ret
-
-Pokedex_InitMainScreen: ; 4013c (10:413c)
-	xor a
-	ld [hBGMapMode], a
-	call ClearSprites
-	xor a
-	hlcoord 0, 0, AttrMap
-	ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
-	call ByteFill
-	farcall DrawPokedexListWindow
-	hlcoord 0, 17
-	ld de, String_START_SEARCH
-	call Pokedex_PlaceString
-	ld a, 7
-	ld [wDexListingHeight], a
-	call Pokedex_PrintListing
-	call Pokedex_SetBGMapMode_3ifDMG_4ifCGB
-	call Pokedex_ResetBGMapMode
-	call Pokedex_DrawMainScreenBG
-	ld a, POKEDEX_SCX
-	ld [hSCX], a
-
-	ld a, [wCurrentDexMode]
-	cp DEXMODE_OLD
-	ld a, $4a
-	jr z, .okay
-	ld a, $47
-.okay
-	ld [hWX], a
-	xor a
-	ld [hWY], a
-	call WaitBGMap
-
-	call Pokedex_ResetBGMapMode
-	ld a, -1
-	ld [CurPartySpecies], a
-	ld a, SCGB_POKEDEX
-	call Pokedex_GetSGBLayout
-	call Pokedex_UpdateCursorOAM
-	farcall DrawPokedexListWindow
-	hlcoord 0, 17
-	ld de, String_START_SEARCH
-	call Pokedex_PlaceString
-	ld a, 7
-	ld [wDexListingHeight], a
-	call Pokedex_PrintListing
-	call Pokedex_IncrementDexPointer
-	ret
-
-Pokedex_UpdateMainScreen: ; 401ae (10:41ae)
-	ld hl, hJoyPressed
-	ld a, [hl]
-	and B_BUTTON
-	jr nz, .b
-	ld a, [hl]
-	and A_BUTTON
-	jr nz, .a
-	ld a, [hl]
-	and SELECT
-	jr nz, .select
-	ld a, [hl]
-	and START
-	jr nz, .start
-	call Pokedex_ListingHandleDPadInput
-	ret nc
-	call Pokedex_UpdateCursorOAM
-	xor a
-	ld [hBGMapMode], a
-	call Pokedex_PrintListing
-	call Pokedex_SetBGMapMode3
-	call Pokedex_ResetBGMapMode
-	ret
-
-.a
-	call Pokedex_GetSelectedMon
-	call Pokedex_CheckSeen
-	ret z
-	ld a, DEXSTATE_DEX_ENTRY_SCR
-	ld [wJumptableIndex], a
-	ld a, DEXSTATE_MAIN_SCR
-	ld [wPrevDexEntryJumptableIndex], a
-	ret
-
-.select
-	call Pokedex_BlackOutBG
-	ld a, DEXSTATE_OPTION_SCR
-	ld [wJumptableIndex], a
-	xor a
-	ld [hSCX], a
-	ld a, $a7
-	ld [hWX], a
-	call DelayFrame
-	ret
-
-.start
-	call Pokedex_BlackOutBG
-	ld a, DEXSTATE_SEARCH_SCR
-	ld [wJumptableIndex], a
-	xor a
-	ld [hSCX], a
-	ld a, $a7
-	ld [hWX], a
-	call DelayFrame
-	ret
-
-.b
-	ld a, DEXSTATE_EXIT
-	ld [wJumptableIndex], a
-	ret
-
-Pokedex_InitDexEntryScreen: ; 40217 (10:4217)
-	call LowVolume
-	xor a ; page 1
-	ld [wPokedexStatus], a
-	xor a
-	ld [hBGMapMode], a
-	call ClearSprites
-	call Pokedex_LoadCurrentFootprint
-	call Pokedex_DrawDexEntryScreenBG
-	call Pokedex_InitArrowCursor
-	call Pokedex_GetSelectedMon
-	ld [wPrevDexEntry], a
-	farcall DisplayDexEntry
-	call Pokedex_DrawFootprint
-	call WaitBGMap
-	ld a, $a7
-	ld [hWX], a
-	call Pokedex_GetSelectedMon
-	ld [CurPartySpecies], a
-	ld a, SCGB_POKEDEX
-	call Pokedex_GetSGBLayout
-	ld a, [CurPartySpecies]
-	call PlayMonCry
-	call Pokedex_IncrementDexPointer
-	ret
-
-Pokedex_UpdateDexEntryScreen: ; 40258 (10:4258)
-	ld de, DexEntryScreen_ArrowCursorData
-	call Pokedex_MoveArrowCursor
-	ld hl, hJoyPressed
-	ld a, [hl]
-	and B_BUTTON
-	jr nz, .return_to_prev_screen
-	ld a, [hl]
-	and A_BUTTON
-	jr nz, .do_menu_action
-	call Pokedex_NextOrPreviousDexEntry
-	ret nc
-	call Pokedex_IncrementDexPointer
-	ret
-
-.do_menu_action
-	ld a, [wDexArrowCursorPosIndex]
-	ld hl, DexEntryScreen_MenuActionJumptable
-	call Pokedex_LoadPointer
-	jp hl
-
-.return_to_prev_screen
-	ld a, [LastVolume]
-	and a
-	jr z, .max_volume
-	ld a, $77
-	ld [LastVolume], a
-
-.max_volume
-	call MaxVolume
-	ld a, [wPrevDexEntryJumptableIndex]
-	ld [wJumptableIndex], a
-	ret
-
-Pokedex_Page: ; 40292
-	ld a, [wPokedexStatus]
-	xor 1 ; toggle page
-	ld [wPokedexStatus], a
-	call Pokedex_GetSelectedMon
-	ld [wPrevDexEntry], a
-	farcall DisplayDexEntry
-	call WaitBGMap
-	ret
-
-Pokedex_ReinitDexEntryScreen: ; 402aa (10:42aa)
-; Reinitialize the Pokédex entry screen after changing the selected mon.
-	call Pokedex_BlackOutBG
-	xor a ; page 1
-	ld [wPokedexStatus], a
-	xor a
-	ld [hBGMapMode], a
-	call Pokedex_DrawDexEntryScreenBG
-	call Pokedex_InitArrowCursor
-	call Pokedex_LoadCurrentFootprint
-	call Pokedex_GetSelectedMon
-	ld [wPrevDexEntry], a
-	farcall DisplayDexEntry
-	call Pokedex_DrawFootprint
-	call Pokedex_LoadSelectedMonTiles
-	call WaitBGMap
-	call Pokedex_GetSelectedMon
-	ld [CurPartySpecies], a
-	ld a, SCGB_POKEDEX
-	call Pokedex_GetSGBLayout
-	ld a, [CurPartySpecies]
-	call PlayMonCry
-	ld hl, wJumptableIndex
-	dec [hl]
-	ret
-
-DexEntryScreen_ArrowCursorData: ; 402e8
-	db D_RIGHT | D_LEFT, 4
-	dwcoord 1, 17  ; PAGE
-	dwcoord 6, 17  ; AREA
-	dwcoord 11, 17 ; CRY
-	dwcoord 15, 17 ; PRNT
-
-
-DexEntryScreen_MenuActionJumptable: ; 402f2
-	dw Pokedex_Page
-	dw .Area
-	dw .Cry
-	dw .Print
-
-.Area: ; 402fa
-	call Pokedex_BlackOutBG
-	xor a
-	ld [hSCX], a
-	call DelayFrame
-	ld a, $7
-	ld [hWX], a
-	ld a, $90
-	ld [hWY], a
-	call Pokedex_GetSelectedMon
-	ld a, [wDexCurrentLocation]
-	ld e, a
-	predef Pokedex_GetArea
-	call Pokedex_BlackOutBG
-	call DelayFrame
-	xor a
-	ld [hBGMapMode], a
-	ld a, $90
-	ld [hWY], a
-	ld a, POKEDEX_SCX
-	ld [hSCX], a
-	call DelayFrame
-	call Pokedex_RedisplayDexEntry
-	call Pokedex_LoadSelectedMonTiles
-	call WaitBGMap
-	call Pokedex_GetSelectedMon
-	ld [CurPartySpecies], a
-	ld a, SCGB_POKEDEX
-	call Pokedex_GetSGBLayout
-	ret
-
-.Cry: ; 40340
-	call Pokedex_GetSelectedMon
-	ld a, [wd265]
-	call GetCryIndex
-	ld e, c
-	ld d, b
-	call PlayCry
-	ret
-
-.Print: ; 4034f
-	call Pokedex_ApplyPrintPals
-	xor a
-	ld [hSCX], a
-	ld a, [wPrevDexEntryBackup]
-	push af
-	ld a, [wPrevDexEntryJumptableIndex]
-	push af
-	ld a, [wJumptableIndex]
-	push af
-	farcall PrintDexEntry
-	pop af
-	ld [wJumptableIndex], a
-	pop af
-	ld [wPrevDexEntryJumptableIndex], a
-	pop af
-	ld [wPrevDexEntryBackup], a
-	call ClearBGPalettes
-	call DisableLCD
-	call Pokedex_LoadInvertedFont
-	call Pokedex_RedisplayDexEntry
-	call EnableLCD
-	call WaitBGMap
-	ld a, POKEDEX_SCX
-	ld [hSCX], a
-	call Pokedex_ApplyUsualPals
-	ret
-
-Pokedex_RedisplayDexEntry: ; 4038d
-	call Pokedex_DrawDexEntryScreenBG
-	call Pokedex_GetSelectedMon
-	farcall DisplayDexEntry
-	call Pokedex_DrawFootprint
-	ret
-
-Pokedex_InitOptionScreen: ; 4039d (10:439d)
-	xor a
-	ld [hBGMapMode], a
-	call ClearSprites
-	call Pokedex_DrawOptionScreenBG
-	call Pokedex_InitArrowCursor
-	ld a, [wCurrentDexMode] ; Index of the topmost visible item in a scrolling menu ???
-	ld [wDexArrowCursorPosIndex], a
-	call Pokedex_DisplayModeDescription
-	call WaitBGMap
-	ld a, SCGB_POKEDEX_SEARCH_OPTION
-	call Pokedex_GetSGBLayout
-	call Pokedex_IncrementDexPointer
-	ret
-
-Pokedex_UpdateOptionScreen: ; 403be (10:43be)
-	ld a, [wUnlockedUnownMode]
-	and a
-	jr nz, .okay
-	ld de, .NoUnownModeArrowCursorData
-	jr .okay2
-.okay
-	ld de, .ArrowCursorData
-.okay2
-	call Pokedex_MoveArrowCursor
-	call c, Pokedex_DisplayModeDescription
-	ld hl, hJoyPressed
-	ld a, [hl]
-	and SELECT | B_BUTTON
-	jr nz, .return_to_main_screen
-	ld a, [hl]
-	and A_BUTTON
-	jr nz, .do_menu_action
-	ret
-
-.do_menu_action
-	ld a, [wDexArrowCursorPosIndex]
-	ld hl, .MenuActionJumptable
-	call Pokedex_LoadPointer
-	jp hl
-
-.return_to_main_screen
-	call Pokedex_BlackOutBG
-	ld a, DEXSTATE_MAIN_SCR
-	ld [wJumptableIndex], a
-	ret
-
-.NoUnownModeArrowCursorData: ; 403f3
-	db D_UP | D_DOWN, 3
-	dwcoord 2,  4 ; NEW
-	dwcoord 2,  6 ; OLD
-	dwcoord 2,  8 ; ABC
-
-.ArrowCursorData: ; 403fb
-	db D_UP | D_DOWN, 4
-	dwcoord 2,  4 ; NEW
-	dwcoord 2,  6 ; OLD
-	dwcoord 2,  8 ; ABC
-	dwcoord 2, 10 ; UNOWN
-
-.MenuActionJumptable: ; 40405 (10:4405)
-	dw .MenuAction_NewMode
-	dw .MenuAction_OldMode
-	dw .MenuAction_ABCMode
-	dw .MenuAction_UnownMode
-
-.MenuAction_NewMode: ; 4040d (10:440d)
-	ld b, DEXMODE_NEW
-	jr .ChangeMode
-
-.MenuAction_OldMode: ; 40411 (10:4411)
-	ld b, DEXMODE_OLD
-	jr .ChangeMode
-
-.MenuAction_ABCMode: ; 40415 (10:4415)
-	ld b, DEXMODE_ABC
-
-.ChangeMode: ; 40417 (10:4417)
-	ld a, [wCurrentDexMode]
-	cp b
-	jr z, .skip_changing_mode ; Skip if new mode is same as current.
-
-	ld a, b
-	ld [wCurrentDexMode], a
-	call Pokedex_OrderMonsByMode
-	call Pokedex_DisplayChangingModesMessage
-	xor a
-	ld [wDexListingScrollOffset], a
-	ld [wDexListingCursor], a
-	call Pokedex_InitCursorPosition
-
-.skip_changing_mode
-	call Pokedex_BlackOutBG
-	ld a, DEXSTATE_MAIN_SCR
-	ld [wJumptableIndex], a
-	ret
-
-.MenuAction_UnownMode: ; 4043a (10:443a)
-	call Pokedex_BlackOutBG
-	ld a, DEXSTATE_UNOWN_MODE
-	ld [wJumptableIndex], a
-	ret
-
-Pokedex_InitSearchScreen: ; 40443 (10:4443)
-	xor a
-	ld [hBGMapMode], a
-	call ClearSprites
-	call Pokedex_DrawSearchScreenBG
-	call Pokedex_InitArrowCursor
-	ld a, NORMAL + 1
-	ld [wDexSearchMonType1], a
-	xor a
-	ld [wDexSearchMonType2], a
-	call Pokedex_PlaceSearchScreenTypeStrings
-	xor a
-	ld [wDexSearchSlowpokeFrame], a
-	farcall DoDexSearchSlowpokeFrame
-	call WaitBGMap
-	ld a, SCGB_POKEDEX_SEARCH_OPTION
-	call Pokedex_GetSGBLayout
-	call Pokedex_IncrementDexPointer
-	ret
-
-Pokedex_UpdateSearchScreen: ; 40471 (10:4471)
-	ld de, .ArrowCursorData
-	call Pokedex_MoveArrowCursor
-	call Pokedex_UpdateSearchMonType
-	call c, Pokedex_PlaceSearchScreenTypeStrings
-	ld hl, hJoyPressed
-	ld a, [hl]
-	and START | B_BUTTON
-	jr nz, .cancel
-	ld a, [hl]
-	and A_BUTTON
-	jr nz, .do_menu_action
-	ret
-
-.do_menu_action
-	ld a, [wDexArrowCursorPosIndex]
-	ld hl, .MenuActionJumptable
-	call Pokedex_LoadPointer
-	jp hl
-
-.cancel
-	call Pokedex_BlackOutBG
-	ld a, DEXSTATE_MAIN_SCR
-	ld [wJumptableIndex], a
-	ret
-
-.ArrowCursorData: ; 4049e
-	db D_UP | D_DOWN, 4
-	dwcoord 2, 4  ; TYPE 1
-	dwcoord 2, 6  ; TYPE 2
-	dwcoord 2, 13 ; BEGIN SEARCH
-	dwcoord 2, 15 ; CANCEL
-
-.MenuActionJumptable: ; 404a8
-	dw .MenuAction_MonSearchType
-	dw .MenuAction_MonSearchType
-	dw .MenuAction_BeginSearch
-	dw .MenuAction_Cancel
-
-.MenuAction_MonSearchType: ; 404b0
-	call Pokedex_NextSearchMonType
-	call Pokedex_PlaceSearchScreenTypeStrings
-	ret
-
-.MenuAction_BeginSearch: ; 404b7
-	call Pokedex_SearchForMons
-	farcall AnimateDexSearchSlowpoke
-	ld a, [wDexSearchResultCount]
-	and a
-	jr nz, .show_search_results
-
-; No mon with matching types was found.
-	call Pokedex_OrderMonsByMode
-	call Pokedex_DisplayTypeNotFoundMessage
-	xor a
-	ld [hBGMapMode], a
-	call Pokedex_DrawSearchScreenBG
-	call Pokedex_InitArrowCursor
-	call Pokedex_PlaceSearchScreenTypeStrings
-	call WaitBGMap
-	ret
-
-.show_search_results
-	ld [wDexListingEnd], a
-	ld a, [wDexListingScrollOffset]
-	ld [wDexListingScrollOffsetBackup], a
-	ld a, [wDexListingCursor]
-	ld [wDexListingCursorBackup], a
-	ld a, [wPrevDexEntry]
-	ld [wPrevDexEntryBackup], a
-	xor a
-	ld [wDexListingScrollOffset], a
-	ld [wDexListingCursor], a
-	call Pokedex_BlackOutBG
-	ld a, DEXSTATE_SEARCH_RESULTS_SCR
-	ld [wJumptableIndex], a
-	ret
-
-.MenuAction_Cancel: ; 40501
-	call Pokedex_BlackOutBG
-	ld a, DEXSTATE_MAIN_SCR
-	ld [wJumptableIndex], a
-	ret
-
-Pokedex_InitSearchResultsScreen: ; 4050a (10:450a)
-	xor a
-	ld [hBGMapMode], a
-	xor a
-	hlcoord 0, 0, AttrMap
-	ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
-	call ByteFill
-	call Pokedex_SetBGMapMode4
-	call Pokedex_ResetBGMapMode
-	farcall DrawPokedexSearchResultsWindow
-	call Pokedex_PlaceSearchResultsTypeStrings
-	ld a, 4
-	ld [wDexListingHeight], a
-	call Pokedex_PrintListing
-	call Pokedex_SetBGMapMode3
-	call Pokedex_ResetBGMapMode
-	call Pokedex_DrawSearchResultsScreenBG
-	ld a, POKEDEX_SCX
-	ld [hSCX], a
-	ld a, $4a
-	ld [hWX], a
-	xor a
-	ld [hWY], a
-	call WaitBGMap
-	call Pokedex_ResetBGMapMode
-	farcall DrawPokedexSearchResultsWindow
-	call Pokedex_PlaceSearchResultsTypeStrings
-	call Pokedex_UpdateSearchResultsCursorOAM
-	ld a, -1
-	ld [CurPartySpecies], a
-	ld a, SCGB_POKEDEX
-	call Pokedex_GetSGBLayout
-	call Pokedex_IncrementDexPointer
-	ret
-
-Pokedex_UpdateSearchResultsScreen: ; 40562 (10:4562)
-	ld hl, hJoyPressed
-	ld a, [hl]
-	and B_BUTTON
-	jr nz, .return_to_search_screen
-	ld a, [hl]
-	and A_BUTTON
-	jr nz, .go_to_dex_entry
-	call Pokedex_ListingHandleDPadInput
-	ret nc
-	call Pokedex_UpdateSearchResultsCursorOAM
-	xor a
-	ld [hBGMapMode], a
-	call Pokedex_PrintListing
-	call Pokedex_SetBGMapMode3
-	call Pokedex_ResetBGMapMode
-	ret
-
-.go_to_dex_entry
-	call Pokedex_GetSelectedMon
-	call Pokedex_CheckSeen
-	ret z
-	ld a, DEXSTATE_DEX_ENTRY_SCR
-	ld [wJumptableIndex], a
-	ld a, DEXSTATE_SEARCH_RESULTS_SCR
-	ld [wPrevDexEntryJumptableIndex], a
-	ret
-
-.return_to_search_screen
-	ld a, [wDexListingScrollOffsetBackup]
-	ld [wDexListingScrollOffset], a
-	ld a, [wDexListingCursorBackup]
-	ld [wDexListingCursor], a
-	ld a, [wPrevDexEntryBackup]
-	ld [wPrevDexEntry], a
-	call Pokedex_BlackOutBG
-	call ClearSprites
-	call Pokedex_OrderMonsByMode
-	ld a, DEXSTATE_SEARCH_SCR
-	ld [wJumptableIndex], a
-	xor a
-	ld [hSCX], a
-	ld a, $a7
-	ld [hWX], a
-	ret
-
-Pokedex_InitUnownMode: ; 405bd (10:45bd)
-	call Pokedex_LoadUnownFont
-	call Pokedex_DrawUnownModeBG
-	xor a
-	ld [wDexCurrentUnownIndex], a
-	call Pokedex_LoadUnownFrontpicTiles
-	call Pokedex_UnownModePlaceCursor
-	farcall PrintUnownWord
-	call WaitBGMap
-	ld a, SCGB_POKEDEX_UNOWN_MODE
-	call Pokedex_GetSGBLayout
-	call Pokedex_IncrementDexPointer
-	ret
-
-Pokedex_UpdateUnownMode: ; 405df (10:45df)
-	ld hl, hJoyPressed
-	ld a, [hl]
-	and A_BUTTON | B_BUTTON
-	jr nz, .a_b
-	call Pokedex_UnownModeHandleDPadInput
-	ret
-
-.a_b
-	call Pokedex_BlackOutBG
-	ld a, DEXSTATE_OPTION_SCR
-	ld [wJumptableIndex], a
-	call DelayFrame
-	call Pokedex_CheckSGB
-	jr nz, .decompress
-	farcall LoadSGBPokedexGFX2
-	jr .done
-
-.decompress
-	ld hl, PokedexLZ
-	ld de, vTiles2 tile $31
-	lb bc, BANK(PokedexLZ), 58
-	call DecompressRequest2bpp
-
-.done
-	ret
-
-Pokedex_UnownModeHandleDPadInput: ; 40610 (10:4610)
-	ld hl, hJoyLast
-	ld a, [hl]
-	and D_RIGHT
-	jr nz, .right
-	ld a, [hl]
-	and D_LEFT
-	jr nz, .left
-	ret
-
-.right
-	ld a, [wDexUnownCount]
-	ld e, a
-	ld hl, wDexCurrentUnownIndex
-	ld a, [hl]
-	inc a
-	cp e
-	ret nc
-	ld a, [hl]
-	inc [hl]
-	jr .update
-
-.left
-	ld hl, wDexCurrentUnownIndex
-	ld a, [hl]
-	and a
-	ret z
-	ld a, [hl]
-	dec [hl]
-
-.update
-	push af
-	xor a
-	ld [hBGMapMode], a
-	pop af
-	call Pokedex_UnownModeEraseCursor
-	call Pokedex_LoadUnownFrontpicTiles
-	call Pokedex_UnownModePlaceCursor
-	farcall PrintUnownWord
-	ld a, $1
-	ld [hBGMapMode], a
-	call DelayFrame
-	call DelayFrame
-	ret
-
-Pokedex_UnownModeEraseCursor: ; 40654 (10:4654)
-	ld c, " "
-	jr Pokedex_UnownModeUpdateCursorGfx
-
-Pokedex_UnownModePlaceCursor: ; 40658 (10:4658)
-	ld a, [wDexCurrentUnownIndex]
-	ld c, $5a ; diamond cursor
-
-Pokedex_UnownModeUpdateCursorGfx: ; 4065d (10:465d)
-	ld e, a
-	ld d, 0
-	ld hl, UnownModeLetterAndCursorCoords + 2
-rept 4
-	add hl, de
-endr
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld [hl], c
-	ret
-
-Pokedex_NextOrPreviousDexEntry: ; 4066c (10:466c)
-	ld a, [wDexListingCursor]
-	ld [wBackupDexListingCursor], a
-	ld a, [wDexListingScrollOffset]
-	ld [wBackupDexListingPage], a
-	ld hl, hJoyLast
-	ld a, [hl]
-	and D_UP
-	jr nz, .up
-	ld a, [hl]
-	and D_DOWN
-	jr nz, .down
-	and a
-	ret
-
-.up
-	ld a, [wDexListingHeight]
-	ld d, a
-	ld a, [wDexListingEnd]
-	ld e, a
-	call Pokedex_ListingMoveCursorUp
-	jr nc, .nope
-	call Pokedex_GetSelectedMon
-	call Pokedex_CheckSeen
-	jr nz, .yep
-	jr .up
-
-.down
-	ld a, [wDexListingHeight]
-	ld d, a
-	ld a, [wDexListingEnd]
-	ld e, a
-	call Pokedex_ListingMoveCursorDown
-	jr nc, .nope
-	call Pokedex_GetSelectedMon
-	call Pokedex_CheckSeen
-	jr nz, .yep
-	jr .down
-
-.yep
-	scf
-	ret
-
-.nope
-	ld a, [wBackupDexListingCursor]
-	ld [wDexListingCursor], a
-	ld a, [wBackupDexListingPage]
-	ld [wDexListingScrollOffset], a
-	and a
-	ret
-
-Pokedex_ListingHandleDPadInput: ; 406c5 (10:46c5)
-; Handles D-pad input for a list of Pokémon.
-	ld a, [wDexListingHeight]
-	ld d, a
-	ld a, [wDexListingEnd]
-	ld e, a
-	ld hl, hJoyLast
-	ld a, [hl]
-	and D_UP
-	jr nz, Pokedex_ListingMoveCursorUp
-	ld a, [hl]
-	and D_DOWN
-	jr nz, Pokedex_ListingMoveCursorDown
-	ld a, d
-	cp e
-	jr nc, Pokedex_ListingPosStayedSame
-	ld a, [hl]
-	and D_LEFT
-	jr nz, Pokedex_ListingMoveUpOnePage
-	ld a, [hl]
-	and D_RIGHT
-	jr nz, Pokedex_ListingMoveDownOnePage
-	jr Pokedex_ListingPosStayedSame
-
-Pokedex_ListingMoveCursorUp: ; 406ea (10:46ea)
-	ld hl, wDexListingCursor
-	ld a, [hl]
-	and a
-	jr z, .try_scrolling
-	dec [hl]
-	jr Pokedex_ListingPosChanged
-.try_scrolling
-	ld hl, wDexListingScrollOffset
-	ld a, [hl]
-	and a
-	jr z, Pokedex_ListingPosStayedSame
-	dec [hl]
-	jr Pokedex_ListingPosChanged
-
-Pokedex_ListingMoveCursorDown: ; 406fe (10:46fe)
-	ld hl, wDexListingCursor
-	ld a, [hl]
-	inc a
-	cp e
-	jr nc, Pokedex_ListingPosStayedSame
-	cp d
-	jr nc, .try_scrolling
-	inc [hl]
-	jr Pokedex_ListingPosChanged
-.try_scrolling
-	ld hl, wDexListingScrollOffset
-	add [hl]
-	cp e
-	jr nc, Pokedex_ListingPosStayedSame
-	inc [hl]
-	jr Pokedex_ListingPosChanged
-
-Pokedex_ListingMoveUpOnePage: ; 40716 (10:4716)
-	ld hl, wDexListingScrollOffset
-	ld a, [hl]
-	and a
-	jr z, Pokedex_ListingPosStayedSame
-	cp d
-	jr nc, .not_near_top
-; If we're already less than page away from the top, go to the top.
-	xor a
-	ld [hl], a
-	jr Pokedex_ListingPosChanged
-.not_near_top
-	sub d
-	ld [hl], a
-	jr Pokedex_ListingPosChanged
-
-Pokedex_ListingMoveDownOnePage: ; 40728 (10:4728)
-; When moving down a page, the return value always report a change in position.
-	ld hl, wDexListingScrollOffset
-	ld a, d
-	add a
-	add [hl]
-	jr c, .near_bottom
-	cp e
-	jr c, .not_near_bottom
-.near_bottom
-	ld a, e
-	sub d
-	ld [hl], a
-	jr Pokedex_ListingPosChanged
-.not_near_bottom
-	ld a, [hl]
-	add d
-	ld [hl], a
-	jr Pokedex_ListingPosChanged
-
-Pokedex_ListingPosStayedSame: ; 4073d (10:473d)
-	and a
-	ret
-
-Pokedex_ListingPosChanged: ; 4073f (10:473f)
-	scf
-	ret
-
-Pokedex_FillColumn: ; 40741
-; Fills a column starting at HL, going downwards.
-; B is the height of the column and A is the tile it's filled with.
-	push de
-	ld de, SCREEN_WIDTH
-.loop
-	ld [hl], a
-	add hl, de
-	dec b
-	jr nz, .loop
-	pop de
-	ret
-
-
-Pokedex_DrawMainScreenBG: ; 4074c (10:474c)
-; Draws the left sidebar and the bottom bar on the main screen.
-	hlcoord 0, 17
-	ld de, String_START_SEARCH
-	call Pokedex_PlaceString
-	ld a, $32
-	hlcoord 0, 0
-	ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
-	call ByteFill
-	hlcoord 0, 0
-	lb bc, 7, 7
-	call Pokedex_PlaceBorder
-	hlcoord 0, 9
-	lb bc, 6, 7
-	call Pokedex_PlaceBorder
-	hlcoord 1, 11
-	ld de, String_SEEN
-	call Pokedex_PlaceString
-	ld hl, PokedexSeen
-	ld b, EndPokedexSeen - PokedexSeen
-	call CountSetBits
-	ld de, wd265
-	hlcoord 5, 12
-	lb bc, 1, 3
-	call PrintNum
-	hlcoord 1, 14
-	ld de, String_OWN
-	call Pokedex_PlaceString
-	ld hl, PokedexCaught
-	ld b, EndPokedexCaught - PokedexCaught
-	call CountSetBits
-	ld de, wd265
-	hlcoord 5, 15
-	lb bc, 1, 3
-	call PrintNum
-	hlcoord 1, 17
-	ld de, String_SELECT_OPTION
-	call Pokedex_PlaceString
-	hlcoord 8, 1
-	ld b, 7
-	ld a, $5a
-	call Pokedex_FillColumn
-	hlcoord 8, 10
-	ld b, 6
-	ld a, $5a
-	call Pokedex_FillColumn
-	hlcoord 8, 0
-	ld [hl], $59
-	hlcoord 8, 8
-	ld [hl], $53
-	hlcoord 8, 9
-	ld [hl], $54
-	hlcoord 8, 16
-	ld [hl], $5b
-	call Pokedex_PlaceFrontpicTopLeftCorner
-	ret
-
-String_SEEN: ; 407e1
-	db "SEEN", -1
-String_OWN: ; 407e6
-	db "OWN", -1
-String_SELECT_OPTION: ; 407ea
-	db $3b, $48, $49, $4a, $44, $45, $46, $47 ; SELECT > OPTION
-	; fallthrough
-String_START_SEARCH: ; 407f2
-	db $3c, $3b, $41, $42, $43, $4b, $4c, $4d, $4e, $3c, -1 ; START > SEARCH
-
-Pokedex_DrawDexEntryScreenBG: ; 407fd
-	call Pokedex_FillBackgroundColor2
-	hlcoord 0, 0
-	lb bc, 15, 18
-	call Pokedex_PlaceBorder
-	hlcoord 19, 0
-	ld [hl], $34
-	hlcoord 19, 1
-	ld a, " "
-	ld b, 15
-	call Pokedex_FillColumn
-	ld [hl], $39
-	hlcoord 1, 10
-	ld bc, 19
-	ld a, $61
-	call ByteFill
-	hlcoord 1, 17
-	ld bc, 18
-	ld a, " "
-	call ByteFill
-	hlcoord 9, 7
-	ld de, .Height
-	call Pokedex_PlaceString
-	hlcoord 9, 9
-	ld de, .Weight
-	call Pokedex_PlaceString
-	hlcoord 0, 17
-	ld de, .MenuItems
-	call Pokedex_PlaceString
-	call Pokedex_PlaceFrontpicTopLeftCorner
-	ret
-
-.Unused: ; 4084f
-	db $5c, $5d, -1 ; No.
-.Height: ; 40852
-	db "HT  ?", $5e, "??", $5f, -1 ; HT  ?'??"
-.Weight: ; 4085c
-	db "WT   ???lb", -1 ; WT   ???lb
-.MenuItems: ; 40867
-	db $3b, " PAGE AREA CRY PRNT", -1
-
-Pokedex_DrawOptionScreenBG: ; 4087c (10:487c)
-	call Pokedex_FillBackgroundColor2
-	hlcoord 0, 2
-	lb bc, 8, 18
-	call Pokedex_PlaceBorder
-	hlcoord 0, 12
-	lb bc, 4, 18
-	call Pokedex_PlaceBorder
-	hlcoord 0, 1
-	ld de, .Title
-	call Pokedex_PlaceString
-	hlcoord 3, 4
-	ld de, .Modes
-	call PlaceString
-	ld a, [wUnlockedUnownMode]
-	and a
-	ret z
-	hlcoord 3, 10
-	ld de, .UnownMode
-	call PlaceString
-	ret
-
-.Title: ; 408b2
-	db $3b, " OPTION ", $3c, -1
-
-.Modes: ; 408bd
-	db   "NEW #DEX MODE"
-	next "OLD #DEX MODE"
-	next "A to Z MODE"
-	db "@"
-
-.UnownMode: ; 408e5
-	db "UNOWN MODE@"
-
-Pokedex_DrawSearchScreenBG: ; 408f0 (10:48f0)
-	call Pokedex_FillBackgroundColor2
-	hlcoord 0, 2
-	lb bc, 14, 18
-	call Pokedex_PlaceBorder
-	hlcoord 0, 1
-	ld de, .Title
-	call Pokedex_PlaceString
-	hlcoord 8, 4
-	ld de, .TypeLeftRightArrows
-	call Pokedex_PlaceString
-	hlcoord 8, 6
-	ld de, .TypeLeftRightArrows
-	call Pokedex_PlaceString
-	hlcoord 3, 4
-	ld de, .Types
-	call PlaceString
-	hlcoord 3, 13
-	ld de, .Menu
-	call PlaceString
-	ret
-
-.Title: ; 4092a
-	db $3b, " SEARCH ", $3c, -1
-
-.TypeLeftRightArrows: ; 40935
-	db $3d, "        ", $3e, -1
-
-.Types: ; 40940
-	db   "TYPE1"
-	next "TYPE2"
-	db   "@"
-
-.Menu: ; 4094c
-	db   "BEGIN SEARCH!!"
-	next "CANCEL"
-	db   "@"
-
-Pokedex_DrawSearchResultsScreenBG: ; 40962 (10:4962)
-	call Pokedex_FillBackgroundColor2
-	hlcoord 0, 0
-	lb bc, 7, 7
-	call Pokedex_PlaceBorder
-	hlcoord 0, 11
-	lb bc, 5, 18
-	call Pokedex_PlaceBorder
-	hlcoord 1, 12
-	ld de, .BottomWindowText
-	call PlaceString
-	ld de, wDexSearchResultCount
-	hlcoord 1, 16
-	lb bc, 1, 3
-	call PrintNum
-	hlcoord 8, 0
-	ld [hl], $59
-	hlcoord 8, 1
-	ld b, 7
-	ld a, $5a
-	call Pokedex_FillColumn
-	hlcoord 8, 8
-	ld [hl], $53
-	hlcoord 8, 9
-	ld [hl], $69
-	hlcoord 8, 10
-	ld [hl], $6a
-	call Pokedex_PlaceFrontpicTopLeftCorner
-	ret
-
-.BottomWindowText: ; 409ae
-	db   "SEARCH RESULTS"
-	next "  TYPE"
-	next "    FOUND!"
-	db   "@"
-
-Pokedex_PlaceSearchResultsTypeStrings: ; 409cf (10:49cf)
-	ld a, [wDexSearchMonType1]
-	hlcoord 0, 14
-	call Pokedex_PlaceTypeString
-	ld a, [wDexSearchMonType1]
-	ld b, a
-	ld a, [wDexSearchMonType2]
-	and a
-	jr z, .done
-	cp b
-	jr z, .done
-	hlcoord 2, 15
-	call Pokedex_PlaceTypeString
-	hlcoord 1, 15
-	ld [hl], "/"
-.done
-	ret
-
-Pokedex_DrawUnownModeBG: ; 409f1 (10:49f1)
-	call Pokedex_FillBackgroundColor2
-	hlcoord 2, 1
-	lb bc, 10, 13
-	call Pokedex_PlaceBorder
-	hlcoord 2, 14
-	lb bc, 1, 13
-	call Pokedex_PlaceBorder
-	hlcoord 2, 15
-	ld [hl], $3d
-	hlcoord 16, 15
-	ld [hl], $3e
-	hlcoord 6, 5
-	call Pokedex_PlaceFrontpicAtHL
-	ld de, 0
-	ld b, 0
-	ld c, 26
-.loop
-	ld hl, UnownDex
-	add hl, de
-	ld a, [hl]
-	and a
-	jr z, .done
-	push af
-	ld hl, UnownModeLetterAndCursorCoords
-rept 4
-	add hl, de
-endr
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	pop af
-	add $40 - 1 ; Unown A
-	ld [hl], a
-	inc de
-	inc b
-	dec c
-	jr nz, .loop
-.done
-	ld a, b
-	ld [wDexUnownCount], a
-	ret
-
-UnownModeLetterAndCursorCoords: ; 40a3e
-; entries correspond to Unown forms
-;           letter, cursor
-	dwcoord   4,11,   3,11 ; A
-	dwcoord   4,10,   3,10 ; B
-	dwcoord   4, 9,   3, 9 ; C
-	dwcoord   4, 8,   3, 8 ; D
-	dwcoord   4, 7,   3, 7 ; E
-	dwcoord   4, 6,   3, 6 ; F
-	dwcoord   4, 5,   3, 5 ; G
-	dwcoord   4, 4,   3, 4 ; H
-	dwcoord   4, 3,   3, 2 ; I
-	dwcoord   5, 3,   5, 2 ; J
-	dwcoord   6, 3,   6, 2 ; K
-	dwcoord   7, 3,   7, 2 ; L
-	dwcoord   8, 3,   8, 2 ; M
-	dwcoord   9, 3,   9, 2 ; N
-	dwcoord  10, 3,  10, 2 ; O
-	dwcoord  11, 3,  11, 2 ; P
-	dwcoord  12, 3,  12, 2 ; Q
-	dwcoord  13, 3,  13, 2 ; R
-	dwcoord  14, 3,  15, 2 ; S
-	dwcoord  14, 4,  15, 4 ; T
-	dwcoord  14, 5,  15, 5 ; U
-	dwcoord  14, 6,  15, 6 ; V
-	dwcoord  14, 7,  15, 7 ; W
-	dwcoord  14, 8,  15, 8 ; X
-	dwcoord  14, 9,  15, 9 ; Y
-	dwcoord  14,10,  15,10 ; Z
-
-Pokedex_FillBackgroundColor2: ; 40aa6
-	hlcoord 0, 0
-	ld a, $32
-	ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
-	call ByteFill
-	ret
-
-Pokedex_PlaceFrontpicTopLeftCorner: ; 40ab2
-	hlcoord 1, 1
-Pokedex_PlaceFrontpicAtHL: ; 40ab5
-	xor a
-	ld b, $7
-.row
-	ld c, $7
-	push af
-	push hl
-.col
-	ld [hli], a
-	add $7
-	dec c
-	jr nz, .col
-	pop hl
-	ld de, SCREEN_WIDTH
-	add hl, de
-	pop af
-	inc a
-	dec b
-	jr nz, .row
-	ret
-
-Pokedex_PlaceString: ; 40acd
-.loop
-	ld a, [de]
-	cp -1
-	ret z
-	inc de
-	ld [hli], a
-	jr .loop
-
-
-Pokedex_PlaceBorder: ; 40ad5
-	push hl
-	ld a, $33
-	ld [hli], a
-	ld d, $34
-	call .FillRow
-	ld a, $35
-	ld [hl], a
-	pop hl
-	ld de, SCREEN_WIDTH
-	add hl, de
-.loop
-	push hl
-	ld a, $36
-	ld [hli], a
-	ld d, $7f
-	call .FillRow
-	ld a, $37
-	ld [hl], a
-	pop hl
-	ld de, SCREEN_WIDTH
-	add hl, de
-	dec b
-	jr nz, .loop
-	ld a, $38
-	ld [hli], a
-	ld d, $39
-	call .FillRow
-	ld a, $3a
-	ld [hl], a
-	ret
-
-.FillRow: ; 40b06
-	ld e, c
-.row_loop
-	ld a, e
-	and a
-	ret z
-	ld a, d
-	ld [hli], a
-	dec e
-	jr .row_loop
-
-
-Pokedex_PrintListing: ; 40b0f (10:4b0f)
-; Prints the list of Pokémon on the main Pokédex screen.
-
-; This check is completely useless.
-	ld a, [wCurrentDexMode]
-	cp DEXMODE_OLD
-	jr z, .okay
-	ld c, 11
-	jr .resume
-.okay
-	ld c, 11
-; End useless check
-
-.resume
-; Clear (2 * [wDexListingHeight] + 1) by 11 box starting at 0,1
-	hlcoord 0, 1
-	ld a, [wDexListingHeight]
-	add a
-	inc a
-	ld b, a
-	ld a, " "
-	call Pokedex_FillBox
-
-; Load de with wPokedexOrder + [wDexListingScrollOffset]
-	ld a, [wDexListingScrollOffset]
-	ld e, a
-	ld d, $0
-	ld hl, wPokedexOrder
-	add hl, de
-	ld e, l
-	ld d, h
-	hlcoord 0, 2
-	ld a, [wDexListingHeight]
-.loop
-	push af
-	ld a, [de]
-	ld [wd265], a
-	push de
-	push hl
-	call .PrintEntry
-	pop hl
-	ld de, 2 * SCREEN_WIDTH
-	add hl, de
-	pop de
-	inc de
-	pop af
-	dec a
-	jr nz, .loop
-	call Pokedex_LoadSelectedMonTiles
-	ret
-
-.PrintEntry: ; 40b55 (10:4b55)
-; Prints one entry in the list of Pokémon on the main Pokédex screen.
-	and a
-	ret z
-	call Pokedex_PrintNumberIfOldMode
-	call Pokedex_PlaceDefaultStringIfNotSeen
-	ret c
-	call Pokedex_PlaceCaughtSymbolIfCaught
-	push hl
-	call GetPokemonName
-	pop hl
-	call PlaceString
-	ret
-
-Pokedex_PrintNumberIfOldMode: ; 40b6a (10:4b6a)
-	ld a, [wCurrentDexMode]
-	cp DEXMODE_OLD
-	jr z, .printnum
-	ret
-
-.printnum
-	push hl
-	ld de, -SCREEN_WIDTH
-	add hl, de
-	ld de, wd265
-	lb bc, PRINTNUM_LEADINGZEROS | 1, 3
-	call PrintNum
-	pop hl
-	ret
-
-Pokedex_PlaceCaughtSymbolIfCaught: ; 40b82 (10:4b82)
-	call Pokedex_CheckCaught
-	jr nz, .place_caught_symbol
-	inc hl
-	ret
-
-.place_caught_symbol
-	ld a, $4f
-	ld [hli], a
-	ret
-
-Pokedex_PlaceDefaultStringIfNotSeen: ; 40b8d (10:4b8d)
-	call Pokedex_CheckSeen
-	ret nz
-	inc hl
-	ld de, .NameNotSeen
-	call PlaceString
-	scf
-	ret
-
-.NameNotSeen: ; 40b9a
-	db "-----@"
-
-Pokedex_DrawFootprint: ; 40ba0
-	hlcoord 18, 1
-	ld a, $62
-	ld [hli], a
-	inc a
-	ld [hl], a
-	hlcoord 18, 2
-	ld a, $64
-	ld [hli], a
-	inc a
-	ld [hl], a
-	ret
-
-
-Pokedex_GetSelectedMon: ; 40bb1
-; Gets the species of the currently selected Pokémon. This corresponds to the
-; position of the cursor in the main listing, but this function can be used
-; on all Pokédex screens.
-	ld a, [wDexListingCursor]
-	ld hl, wDexListingScrollOffset
-	add [hl]
-	ld e, a
-	ld d, $0
-	ld hl, wPokedexOrder
-	add hl, de
-	ld a, [hl]
-	ld [wd265], a
-	ret
-
-
-Pokedex_CheckCaught: ; 40bc4 (10:4bc4)
-	push de
-	push hl
-	ld a, [wd265]
-	dec a
-	call CheckCaughtMon
-	pop hl
-	pop de
-	ret
-
-
-Pokedex_CheckSeen: ; 40bd0
-	push de
-	push hl
-	ld a, [wd265]
-	dec a
-	call CheckSeenMon
-	pop hl
-	pop de
-	ret
-
-
-
-Pokedex_OrderMonsByMode: ; 40bdc
-	ld hl, wPokedexOrder
-	ld bc, wPokedexOrderEnd - wPokedexOrder
-	xor a
-	call ByteFill
-	ld a, [wCurrentDexMode]
-	ld hl, .Jumptable
-	call Pokedex_LoadPointer
-	jp hl
-
-.Jumptable: ; 40bf0 (10:4bf0)
-	dw .NewMode
-	dw .OldMode
-	dw Pokedex_ABCMode
-
-.NewMode: ; 40bf6 (10:4bf6)
-	ld de, NewPokedexOrder
-	ld hl, wPokedexOrder
-	ld c, NUM_POKEMON
-.loopnew
-	ld a, [de]
-	inc de
-	ld [hli], a
-	dec c
-	jr nz, .loopnew
-	call .FindLastSeen
-	ret
-
-.OldMode: ; 40c08 (10:4c08)
-	ld hl, wPokedexOrder
-	ld a, $1
-	ld c, NUM_POKEMON
-.loopold
-	ld [hli], a
-	inc a
-	dec c
-	jr nz, .loopold
-	call .FindLastSeen
-	ret
-
-.FindLastSeen: ; 40c18 (10:4c18)
-	ld hl, wPokedexOrder + NUM_POKEMON - 1
-	ld d, NUM_POKEMON
-	ld e, d
-.loopfindend
-	ld a, [hld]
-	ld [wd265], a
-	call Pokedex_CheckSeen
-	jr nz, .foundend
-	dec d
-	dec e
-	jr nz, .loopfindend
-.foundend
-	ld a, d
-	ld [wDexListingEnd], a
-	ret
-
-Pokedex_ABCMode: ; 40c30
-	xor a
-	ld [wDexListingEnd], a
-	ld hl, wPokedexOrder
-	ld de, AlphabeticalPokedexOrder
-	ld c, NUM_POKEMON
-.loop1abc
-	push bc
-	ld a, [de]
-	ld [wd265], a
-	call Pokedex_CheckSeen
-	jr z, .skipabc
-	ld a, [wd265]
-	ld [hli], a
-	ld a, [wDexListingEnd]
-	inc a
-	ld [wDexListingEnd], a
-
-.skipabc
-	inc de
-	pop bc
-	dec c
-	jr nz, .loop1abc
-	ld a, [wDexListingEnd]
-	ld c, 0
-.loop2abc
-	cp NUM_POKEMON
-	jr z, .doneabc
-	ld [hl], c
-	inc hl
-	inc a
-	jr .loop2abc
-
-.doneabc
-	ret
-
-
-INCLUDE "data/pokemon/dex_order_alpha.asm"
-
-INCLUDE "data/pokemon/dex_order_new.asm"
-
-
-Pokedex_DisplayModeDescription: ; 40e5b
-	xor a
-	ld [hBGMapMode], a
-	hlcoord 0, 12
-	lb bc, 4, 18
-	call Pokedex_PlaceBorder
-	ld a, [wDexArrowCursorPosIndex]
-	ld hl, .Modes
-	call Pokedex_LoadPointer
-	ld e, l
-	ld d, h
-	hlcoord 1, 14
-	call PlaceString
-	ld a, $1
-	ld [hBGMapMode], a
-	ret
-
-.Modes: ; 40e7d
-	dw .NewMode
-	dw .OldMode
-	dw .ABCMode
-	dw .UnownMode
-
-.NewMode: ; 40e85
-	db   "<PK><MN> are listed by"
-	next "evolution type.@"
-
-.OldMode: ; 40ea6
-	db   "<PK><MN> are listed by"
-	next "official type.@"
-
-.ABCMode: ; 40ec6
-	db   "<PK><MN> are listed"
-	next "alphabetically.@"
-
-.UnownMode: ; 40ee4
-	db   "UNOWN are listed"
-	next "in catching order.@"
-
-Pokedex_DisplayChangingModesMessage: ; 40f08 (10:4f08)
-	xor a
-	ld [hBGMapMode], a
-	hlcoord 0, 12
-	lb bc, 4, 18
-	call Pokedex_PlaceBorder
-	ld de, String_ChangingModesPleaseWait
-	hlcoord 1, 14
-	call PlaceString
-	ld a, $1
-	ld [hBGMapMode], a
-	ld c, 64
-	call DelayFrames
-	ld de, SFX_CHANGE_DEX_MODE
-	call PlaySFX
-	ld c, 64
-	call DelayFrames
-	ret
-
-String_ChangingModesPleaseWait: ; 40f32
-	db   "Changing modes."
-	next "Please wait.@"
-
-Pokedex_UpdateSearchMonType: ; 40f4f (10:4f4f)
-	ld a, [wDexArrowCursorPosIndex]
-	cp 2
-	jr nc, .no_change
-	ld hl, hJoyLast
-	ld a, [hl]
-	and D_LEFT
-	jr nz, Pokedex_PrevSearchMonType
-	ld a, [hl]
-	and D_RIGHT
-	jr nz, Pokedex_NextSearchMonType
-.no_change
-	and a
-	ret
-
-Pokedex_PrevSearchMonType: ; 40f65
-	ld a, [wDexArrowCursorPosIndex]
-	and a
-	jr nz, .type2
-
-	ld hl, wDexSearchMonType1
-	ld a, [hl]
-	cp 1
-	jr z, .wrap_around
-	dec [hl]
-	jr .done
-
-.type2
-	ld hl, wDexSearchMonType2
-	ld a, [hl]
-	and a
-	jr z, .wrap_around
-	dec [hl]
-	jr .done
-
-.wrap_around
-	ld [hl], NUM_TYPES - 1
-
-.done
-	scf
-	ret
-
-Pokedex_NextSearchMonType: ; 40f84
-	ld a, [wDexArrowCursorPosIndex]
-	and a
-	jr nz, .type2
-
-	ld hl, wDexSearchMonType1
-	ld a, [hl]
-	cp NUM_TYPES - 1
-	jr nc, .type1_wrap_around
-	inc [hl]
-	jr .done
-.type1_wrap_around
-	ld [hl], 1
-	jr .done
-
-.type2
-	ld hl, wDexSearchMonType2
-	ld a, [hl]
-	cp NUM_TYPES - 1
-	jr nc, .type2_wrap_around
-	inc [hl]
-	jr .done
-.type2_wrap_around
-	ld [hl], 0
-
-.done
-	scf
-	ret
-
-Pokedex_PlaceSearchScreenTypeStrings: ; 40fa8 (10:4fa8)
-	xor a
-	ld [hBGMapMode], a
-	hlcoord 9, 3
-	lb bc, 4, 8
-	ld a, " "
-	call Pokedex_FillBox
-	ld a, [wDexSearchMonType1]
-	hlcoord 9, 4
-	call Pokedex_PlaceTypeString
-	ld a, [wDexSearchMonType2]
-	hlcoord 9, 6
-	call Pokedex_PlaceTypeString
-	ld a, $1
-	ld [hBGMapMode], a
-	ret
-
-Pokedex_PlaceTypeString: ; 40fcd (10:4fcd)
-	push hl
-	ld e, a
-	ld d, 0
-	ld hl, PokedexTypeSearchStrings
-rept 9
-	add hl, de
-endr
-	ld e, l
-	ld d, h
-	pop hl
-	call PlaceString
-	ret
-
-INCLUDE "data/types/search_strings.asm"
-
-Pokedex_SearchForMons: ; 41086
-	ld a, [wDexSearchMonType2]
-	and a
-	call nz, .Search
-	ld a, [wDexSearchMonType1]
-	and a
-	call nz, .Search
-	ret
-
-.Search: ; 41095
-	dec a
-	ld e, a
-	ld d, 0
-	ld hl, PokedexTypeSearchConversionTable
-	add hl, de
-	ld a, [hl]
-	ld [wDexConvertedMonType], a
-	ld hl, wPokedexOrder
-	ld de, wPokedexOrder
-	ld c, NUM_POKEMON
-	xor a
-	ld [wDexSearchResultCount], a
-.loop
-	push bc
-	ld a, [hl]
-	and a
-	jr z, .next_mon
-	ld [wd265], a
-	ld [CurSpecies], a
-	call Pokedex_CheckCaught
-	jr z, .next_mon
-	push hl
-	push de
-	call GetBaseData
-	pop de
-	pop hl
-	ld a, [wDexConvertedMonType]
-	ld b, a
-	ld a, [BaseType1]
-	cp b
-	jr z, .match_found
-	ld a, [BaseType2]
-	cp b
-	jr nz, .next_mon
-
-.match_found
-	ld a, [wd265]
-	ld [de], a
-	inc de
-	ld a, [wDexSearchResultCount]
-	inc a
-	ld [wDexSearchResultCount], a
-
-.next_mon
-	inc hl
-	pop bc
-	dec c
-	jr nz, .loop
-
-	ld l, e
-	ld h, d
-	ld a, [wDexSearchResultCount]
-	ld c, 0
-
-.zero_remaining_mons
-	cp NUM_POKEMON
-	jr z, .done
-	ld [hl], c
-	inc hl
-	inc a
-	jr .zero_remaining_mons
-
-.done
-	ret
-
-INCLUDE "data/types/search_types.asm"
-
-Pokedex_DisplayTypeNotFoundMessage: ; 41107
-	xor a
-	ld [hBGMapMode], a
-	hlcoord 0, 12
-	lb bc, 4, 18
-	call Pokedex_PlaceBorder
-	ld de, .TypeNotFound
-	hlcoord 1, 14
-	call PlaceString
-	ld a, $1
-	ld [hBGMapMode], a
-	ld c, $80
-	call DelayFrames
-	ret
-
-.TypeNotFound: ; 41126
-	db   "The specified type"
-	next "was not found.@"
-
-Pokedex_UpdateCursorOAM: ; 41148 (10:5148)
-	ld a, [wCurrentDexMode]
-	cp DEXMODE_OLD
-	jp z, Pokedex_PutOldModeCursorOAM
-	call Pokedex_PutNewModeABCModeCursorOAM
-	call Pokedex_PutScrollbarOAM
-	ret
-
-Pokedex_PutOldModeCursorOAM: ; 41157 (10:5157)
-	ld hl, .CursorOAM
-	ld a, [wDexListingCursor]
-	or a
-	jr nz, .okay
-	ld hl, .CursorAtTopOAM
-.okay
-	call Pokedex_LoadCursorOAM
-	ret
-
-.CursorOAM: ; 41167
-	dsprite  3,  0,  9, -1, $30, 7
-	dsprite  2,  0,  9, -1, $31, 7
-	dsprite  2,  0, 10, -1, $32, 7
-	dsprite  2,  0, 11, -1, $32, 7
-	dsprite  2,  0, 12, -1, $32, 7
-	dsprite  2,  0, 13, -1, $33, 7
-	dsprite  2,  0, 16, -2, $33, 7 | X_FLIP
-	dsprite  2,  0, 17, -2, $32, 7 | X_FLIP
-	dsprite  2,  0, 18, -2, $32, 7 | X_FLIP
-	dsprite  2,  0, 19, -2, $32, 7 | X_FLIP
-	dsprite  2,  0, 20, -2, $31, 7 | X_FLIP
-	dsprite  3,  0, 20, -2, $30, 7 | X_FLIP
-	dsprite  4,  0,  9, -1, $30, 7 | Y_FLIP
-	dsprite  5,  0,  9, -1, $31, 7 | Y_FLIP
-	dsprite  5,  0, 10, -1, $32, 7 | Y_FLIP
-	dsprite  5,  0, 11, -1, $32, 7 | Y_FLIP
-	dsprite  5,  0, 12, -1, $32, 7 | Y_FLIP
-	dsprite  5,  0, 13, -1, $33, 7 | Y_FLIP
-	dsprite  5,  0, 16, -2, $33, 7 | X_FLIP | Y_FLIP
-	dsprite  5,  0, 17, -2, $32, 7 | X_FLIP | Y_FLIP
-	dsprite  5,  0, 18, -2, $32, 7 | X_FLIP | Y_FLIP
-	dsprite  5,  0, 19, -2, $32, 7 | X_FLIP | Y_FLIP
-	dsprite  5,  0, 20, -2, $31, 7 | X_FLIP | Y_FLIP
-	dsprite  4,  0, 20, -2, $30, 7 | X_FLIP | Y_FLIP
-	db -1
-
-.CursorAtTopOAM: ; 411c8
-; OAM data for when the cursor is at the top of the list. The tiles at the top
-; are cut off so they don't show up outside the list area.
-	dsprite  3,  0,  9, -1, $30, 7
-	dsprite  2,  0,  9, -1, $34, 7
-	dsprite  2,  0, 10, -1, $35, 7
-	dsprite  2,  0, 11, -1, $35, 7
-	dsprite  2,  0, 12, -1, $35, 7
-	dsprite  2,  0, 13, -1, $36, 7
-	dsprite  2,  0, 16, -2, $36, 7 | X_FLIP
-	dsprite  2,  0, 17, -2, $35, 7 | X_FLIP
-	dsprite  2,  0, 18, -2, $35, 7 | X_FLIP
-	dsprite  2,  0, 19, -2, $35, 7 | X_FLIP
-	dsprite  2,  0, 20, -2, $34, 7 | X_FLIP
-	dsprite  3,  0, 20, -2, $30, 7 | X_FLIP
-	dsprite  4,  0,  9, -1, $30, 7 | Y_FLIP
-	dsprite  5,  0,  9, -1, $31, 7 | Y_FLIP
-	dsprite  5,  0, 10, -1, $32, 7 | Y_FLIP
-	dsprite  5,  0, 11, -1, $32, 7 | Y_FLIP
-	dsprite  5,  0, 12, -1, $32, 7 | Y_FLIP
-	dsprite  5,  0, 13, -1, $33, 7 | Y_FLIP
-	dsprite  5,  0, 16, -2, $33, 7 | X_FLIP | Y_FLIP
-	dsprite  5,  0, 17, -2, $32, 7 | X_FLIP | Y_FLIP
-	dsprite  5,  0, 18, -2, $32, 7 | X_FLIP | Y_FLIP
-	dsprite  5,  0, 19, -2, $32, 7 | X_FLIP | Y_FLIP
-	dsprite  5,  0, 20, -2, $31, 7 | X_FLIP | Y_FLIP
-	dsprite  4,  0, 20, -2, $30, 7 | X_FLIP | Y_FLIP
-	db -1
-
-Pokedex_PutNewModeABCModeCursorOAM: ; 41229 (10:5229)
-	ld hl, .CursorOAM
-	call Pokedex_LoadCursorOAM
-	ret
-
-.CursorOAM: ; 41230
-	dsprite  3,  3,  9, -1, $30, 7
-	dsprite  2,  3,  9, -1, $31, 7
-	dsprite  2,  3, 10, -1, $32, 7
-	dsprite  2,  3, 11, -1, $32, 7
-	dsprite  2,  3, 12, -1, $33, 7
-	dsprite  2,  3, 16,  0, $33, 7 | X_FLIP
-	dsprite  2,  3, 17,  0, $32, 7 | X_FLIP
-	dsprite  2,  3, 18,  0, $32, 7 | X_FLIP
-	dsprite  2,  3, 19,  0, $31, 7 | X_FLIP
-	dsprite  3,  3, 19,  0, $30, 7 | X_FLIP
-	dsprite  4,  3,  9, -1, $30, 7 | Y_FLIP
-	dsprite  5,  3,  9, -1, $31, 7 | Y_FLIP
-	dsprite  5,  3, 10, -1, $32, 7 | Y_FLIP
-	dsprite  5,  3, 11, -1, $32, 7 | Y_FLIP
-	dsprite  5,  3, 12, -1, $33, 7 | Y_FLIP
-	dsprite  5,  3, 16,  0, $33, 7 | X_FLIP | Y_FLIP
-	dsprite  5,  3, 17,  0, $32, 7 | X_FLIP | Y_FLIP
-	dsprite  5,  3, 18,  0, $32, 7 | X_FLIP | Y_FLIP
-	dsprite  5,  3, 19,  0, $31, 7 | X_FLIP | Y_FLIP
-	dsprite  4,  3, 19,  0, $30, 7 | X_FLIP | Y_FLIP
-	db -1
-
-Pokedex_UpdateSearchResultsCursorOAM: ; 41281 (10:5281)
-	ld a, [wCurrentDexMode]
-	cp DEXMODE_OLD
-	jp z, Pokedex_PutOldModeCursorOAM
-	ld hl, .CursorOAM
-	call Pokedex_LoadCursorOAM
-	ret
-
-.CursorOAM: ; 41290
-	dsprite  3,  3,  9, -1, $30, 7
-	dsprite  2,  3,  9, -1, $31, 7
-	dsprite  2,  3, 10, -1, $32, 7
-	dsprite  2,  3, 11, -1, $32, 7
-	dsprite  2,  3, 12, -1, $32, 7
-	dsprite  2,  3, 13, -1, $33, 7
-	dsprite  2,  3, 16, -2, $33, 7 | X_FLIP
-	dsprite  2,  3, 17, -2, $32, 7 | X_FLIP
-	dsprite  2,  3, 18, -2, $32, 7 | X_FLIP
-	dsprite  2,  3, 19, -2, $32, 7 | X_FLIP
-	dsprite  2,  3, 20, -2, $31, 7 | X_FLIP
-	dsprite  3,  3, 20, -2, $30, 7 | X_FLIP
-	dsprite  4,  3,  9, -1, $30, 7 | Y_FLIP
-	dsprite  5,  3,  9, -1, $31, 7 | Y_FLIP
-	dsprite  5,  3, 10, -1, $32, 7 | Y_FLIP
-	dsprite  5,  3, 11, -1, $32, 7 | Y_FLIP
-	dsprite  5,  3, 12, -1, $32, 7 | Y_FLIP
-	dsprite  5,  3, 13, -1, $33, 7 | Y_FLIP
-	dsprite  5,  3, 16, -2, $33, 7 | X_FLIP | Y_FLIP
-	dsprite  5,  3, 17, -2, $32, 7 | X_FLIP | Y_FLIP
-	dsprite  5,  3, 18, -2, $32, 7 | X_FLIP | Y_FLIP
-	dsprite  5,  3, 19, -2, $32, 7 | X_FLIP | Y_FLIP
-	dsprite  5,  3, 20, -2, $31, 7 | X_FLIP | Y_FLIP
-	dsprite  4,  3, 20, -2, $30, 7 | X_FLIP | Y_FLIP
-	db -1
-
-Pokedex_LoadCursorOAM: ; 412f1 (10:52f1)
-	ld de, Sprite01
-.loop
-	ld a, [hl]
-	cp -1
-	ret z
-	ld a, [wDexListingCursor]
-	and $7
-	swap a
-	add [hl] ; y
-	inc hl
-	ld [de], a
-	inc de
-	ld a, [hli] ; x
-	ld [de], a
-	inc de
-	ld a, [hli] ; tile id
-	ld [de], a
-	inc de
-	ld a, [hli] ; attributes
-	ld [de], a
-	inc de
-	jr .loop
-
-Pokedex_PutScrollbarOAM: ; 4130e (10:530e)
-; Writes the OAM data for the scrollbar in the new mode and ABC mode.
-	push de
-	ld a, [wDexListingEnd]
-	dec a
-	ld e, a
-	ld a, [wDexListingCursor]
-	ld hl, wDexListingScrollOffset
-	add [hl]
-	cp e
-	jr z, .asm_4133f
-	ld hl, $0
-	ld bc, $79
-	call AddNTimes
-	ld e, l
-	ld d, h
-	ld b, $0
-	ld a, d
-	or e
-	jr z, .asm_41341
-	ld a, [wDexListingEnd]
-	ld c, a
-.asm_41333
-	ld a, e
-	sub c
-	ld e, a
-	ld a, d
-	sbc $0
-	ld d, a
-	jr c, .asm_41341
-	inc b
-	jr .asm_41333
-.asm_4133f
-	ld b, $79
-.asm_41341
-	ld a, $14
-	add b
-	pop hl
-	ld [hli], a
-	ld a, $a1
-	ld [hli], a
-	ld a, $f
-	ld [hli], a
-	ld [hl], $0
-	ret
-
-Pokedex_InitArrowCursor: ; 4134f (10:534f)
-	xor a
-	ld [wDexArrowCursorPosIndex], a
-	ld [wDexArrowCursorDelayCounter], a
-	ld [wDexArrowCursorBlinkCounter], a
-	ret
-
-Pokedex_MoveArrowCursor: ; 4135a (10:535a)
-; bc = [de] - 1
-	ld a, [de]
-	ld b, a
-	inc de
-	ld a, [de]
-	dec a
-	ld c, a
-	inc de
-	call Pokedex_BlinkArrowCursor
-
-	ld hl, hJoyPressed
-	ld a, [hl]
-	and D_LEFT | D_UP
-	and b
-	jr nz, .move_left_or_up
-	ld a, [hl]
-	and D_RIGHT | D_DOWN
-	and b
-	jr nz, .move_right_or_down
-	ld a, [hl]
-	and SELECT
-	and b
-	jr nz, .select
-	call Pokedex_ArrowCursorDelay
-	jr c, .no_action
-	ld hl, hJoyLast
-	ld a, [hl]
-	and D_LEFT | D_UP
-	and b
-	jr nz, .move_left_or_up
-	ld a, [hl]
-	and D_RIGHT | D_DOWN
-	and b
-	jr nz, .move_right_or_down
-	jr .no_action
-
-.move_left_or_up
-	ld a, [wDexArrowCursorPosIndex]
-	and a
-	jr z, .no_action
-	call Pokedex_GetArrowCursorPos
-	ld [hl], " "
-	ld hl, wDexArrowCursorPosIndex
-	dec [hl]
-	jr .update_cursor_pos
-
-.move_right_or_down
-	ld a, [wDexArrowCursorPosIndex]
-	cp c
-	jr nc, .no_action
-	call Pokedex_GetArrowCursorPos
-	ld [hl], " "
-	ld hl, wDexArrowCursorPosIndex
-	inc [hl]
-
-.update_cursor_pos
-	call Pokedex_GetArrowCursorPos
-	ld [hl], "▶"
-	ld a, 12
-	ld [wDexArrowCursorDelayCounter], a
-	xor a
-	ld [wDexArrowCursorBlinkCounter], a
-	scf
-	ret
-
-.no_action
-	and a
-	ret
-
-.select
-	call Pokedex_GetArrowCursorPos
-	ld [hl], " "
-	ld a, [wDexArrowCursorPosIndex]
-	cp c
-	jr c, .update
-	ld a, -1
-.update
-	inc a
-	ld [wDexArrowCursorPosIndex], a
-	jr .update_cursor_pos
-
-Pokedex_GetArrowCursorPos: ; 413d4 (10:53d4)
-	ld a, [wDexArrowCursorPosIndex]
-	add a
-	ld l, a
-	ld h, 0
-	add hl, de
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ret
-
-Pokedex_BlinkArrowCursor: ; 413e0 (10:53e0)
-	ld hl, wDexArrowCursorBlinkCounter
-	ld a, [hl]
-	inc [hl]
-	and $8
-	jr z, .blink_on
-	call Pokedex_GetArrowCursorPos
-	ld [hl], " "
-	ret
-
-.blink_on
-	call Pokedex_GetArrowCursorPos
-	ld [hl], "▶"
-	ret
-
-Pokedex_ArrowCursorDelay: ; 413f5 (10:53f5)
-; Updates the delay counter set when moving the arrow cursor.
-; Returns whether the delay is active in carry.
-	ld hl, wDexArrowCursorDelayCounter
-	ld a, [hl]
-	and a
-	ret z
-
-	dec [hl]
-	scf
-	ret
-
-Pokedex_FillBox: ; 413fe (10:53fe)
-	jp FillBoxWithByte
-
-Pokedex_BlackOutBG: ; 41401 (10:5401)
-; Make BG palettes black so that the BG becomes all black.
-	ld a, [rSVBK]
-	push af
-	ld a, BANK(wBGPals1)
-	ld [rSVBK], a
-	ld hl, wBGPals1
-	ld bc, 8 palettes
-	xor a
-	call ByteFill
-	pop af
-	ld [rSVBK], a
-
-Pokedex_ApplyPrintPals: ; 41415
-	ld a, $ff
-	call DmgToCgbBGPals
-	ld a, $ff
-	call DmgToCgbObjPal0
-	call DelayFrame
-	ret
-
-Pokedex_GetSGBLayout: ; 41423
-	ld b, a
-	call GetSGBLayout
-
-Pokedex_ApplyUsualPals: ; 41427
-; This applies the palettes used for most Pokédex screens.
-	ld a, $e4
-	call DmgToCgbBGPals
-	ld a, $e0
-	call DmgToCgbObjPal0
-	ret
-
-
-Pokedex_LoadPointer: ; 41432
-	ld e, a
-	ld d, 0
-	add hl, de
-	add hl, de
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ret
-
-Pokedex_LoadSelectedMonTiles: ; 4143b
-; Loads the tiles of the currently selected Pokémon.
-	call Pokedex_GetSelectedMon
-	call Pokedex_CheckSeen
-	jr z, .QuestionMark
-	ld a, [wFirstUnownSeen]
-	ld [UnownLetter], a
-	ld a, [wd265]
-	ld [CurPartySpecies], a
-	call GetBaseData
-	ld de, vTiles2
-	predef GetMonFrontpic
-	ret
-
-.QuestionMark:
-	ld a, BANK(sScratch)
-	call GetSRAMBank
-	farcall LoadQuestionMarkPic
-	ld hl, vTiles2
-	ld de, sScratch
-	ld c, 7 * 7
-	ld a, [hROMBank]
-	ld b, a
-	call Get2bpp
-	call CloseSRAM
-	ret
-
-
-Pokedex_LoadCurrentFootprint: ; 41478 (10:5478)
-	call Pokedex_GetSelectedMon
-
-Pokedex_LoadAnyFootprint: ; 4147b
-	ld a, [wd265]
-	dec a
-	and %11111000
-	srl a
-	srl a
-	srl a
-	ld e, 0
-	ld d, a
-	ld a, [wd265]
-	dec a
-	and %111
-	swap a ; * $10
-	ld l, a
-	ld h, 0
-	add hl, de
-	ld de, Footprints
-	add hl, de
-
-	push hl
-	ld e, l
-	ld d, h
-	ld hl, vTiles2 tile $62
-	lb bc, BANK(Footprints), 2
-	call Request1bpp
-	pop hl
-
-	; Whoever was editing footprints forgot to fix their
-	; tile editor. Now each bottom half is 8 tiles off.
-	ld de, 8 tiles
-	add hl, de
-
-	ld e, l
-	ld d, h
-	ld hl, vTiles2 tile $64
-	lb bc, BANK(Footprints), 2
-	call Request1bpp
-
-	ret
-
-
-Pokedex_LoadGFX: ; 414b7
-	call DisableLCD
-	ld hl, vTiles2
-	ld bc, $31 tiles
-	xor a
-	call ByteFill
-	call Pokedex_LoadInvertedFont
-	call LoadFontsExtra
-	ld hl, vTiles2 tile $60
-	ld bc, $20 tiles
-	call Pokedex_InvertTiles
-	call Pokedex_CheckSGB
-	jr nz, .LoadPokedexLZ
-	farcall LoadSGBPokedexGFX
-	jr .LoadPokedexSlowpokeLZ
-
-.LoadPokedexLZ:
-	ld hl, PokedexLZ
-	ld de, vTiles2 tile $31
-	call Decompress
-
-.LoadPokedexSlowpokeLZ:
-	ld hl, PokedexSlowpokeLZ
-	ld de, vTiles0
-	call Decompress
-	ld a, 6
-	call SkipMusic
-	call EnableLCD
-	ret
-
-Pokedex_LoadInvertedFont: ; 414fb
-	call LoadStandardFont
-	ld hl, vTiles1
-	ld bc, $80 tiles
-
-Pokedex_InvertTiles: ; 41504
-.loop
-	ld a, [hl]
-	xor $ff
-	ld [hli], a
-	dec bc
-	ld a, b
-	or c
-	jr nz, .loop
-	ret
-
-PokedexLZ: ; 4150e
-INCBIN "gfx/pokedex/pokedex.2bpp.lz"
-
-PokedexSlowpokeLZ: ; 416b0
-INCBIN "gfx/pokedex/slowpoke.2bpp.lz"
-
-Pokedex_CheckSGB: ; 41a24
-	ld a, [hCGB]
-	or a
-	ret nz
-	ld a, [hSGB]
-	dec a
-	ret
-
-Pokedex_LoadUnownFont: ; 41a2c
-	ld a, BANK(sScratch)
-	call GetSRAMBank
-	ld hl, UnownFont
-	ld de, sScratch + $188
-	ld bc, 39 tiles
-	ld a, BANK(UnownFont)
-	call FarCopyBytes
-	ld hl, sScratch + $188
-	ld bc, 27 tiles
-	call Pokedex_InvertTiles
-	ld de, sScratch + $188
-	ld hl, vTiles2 tile $40
-	lb bc, BANK(Pokedex_LoadUnownFont), 27
-	call Request2bpp
-	call CloseSRAM
-	ret
-
-Pokedex_LoadUnownFrontpicTiles: ; 41a58 (10:5a58)
-	ld a, [UnownLetter]
-	push af
-	ld a, [wDexCurrentUnownIndex]
-	ld e, a
-	ld d, 0
-	ld hl, UnownDex
-	add hl, de
-	ld a, [hl]
-	ld [UnownLetter], a
-	ld a, UNOWN
-	ld [CurPartySpecies], a
-	call GetBaseData
-	ld de, vTiles2 tile $00
-	predef GetMonFrontpic
-	pop af
-	ld [UnownLetter], a
-	ret
-
-_NewPokedexEntry: ; 41a7f
-	xor a
-	ld [hBGMapMode], a
-	farcall DrawDexEntryScreenRightEdge
-	call Pokedex_ResetBGMapMode
-	call DisableLCD
-	call LoadStandardFont
-	call LoadFontsExtra
-	call Pokedex_LoadGFX
-	call Pokedex_LoadAnyFootprint
-	ld a, [wd265]
-	ld [CurPartySpecies], a
-	call Pokedex_DrawDexEntryScreenBG
-	call Pokedex_DrawFootprint
-	hlcoord 0, 17
-	ld [hl], $3b
-	inc hl
-	ld bc, 19
-	ld a, " "
-	call ByteFill
-	farcall DisplayDexEntry
-	call EnableLCD
-	call WaitBGMap
-	call GetBaseData
-	ld de, vTiles2
-	predef GetMonFrontpic
-	ld a, SCGB_POKEDEX
-	call Pokedex_GetSGBLayout
-	ld a, [CurPartySpecies]
-	call PlayMonCry
-	ret
-
-
-Pokedex_SetBGMapMode3: ; 41ad7 (10:5ad7)
-	ld a, $3
-	ld [hBGMapMode], a
-	ld c, 4
-	call DelayFrames
-	ret
-
-Pokedex_SetBGMapMode4: ; 41ae1 (10:5ae1)
-	ld a, $4
-	ld [hBGMapMode], a
-	ld c, 4
-	call DelayFrames
-	ret
-
-Pokedex_SetBGMapMode_3ifDMG_4ifCGB: ; 41aeb (10:5aeb)
-	ld a, [hCGB]
-	and a
-	jr z, .DMG
-	call Pokedex_SetBGMapMode4
-.DMG:
-	call Pokedex_SetBGMapMode3
-	ret
-
-
-Pokedex_ResetBGMapMode: ; 41af7
-	xor a
-	ld [hBGMapMode], a
-	ret
--- /dev/null
+++ b/engine/pokedex/newpokedexentry.asm
@@ -1,0 +1,52 @@
+NewPokedexEntry: ; fb877
+	ld a, [hMapAnims]
+	push af
+	xor a
+	ld [hMapAnims], a
+	call LowVolume
+	call ClearBGPalettes
+	call ClearTileMap
+	call UpdateSprites
+	call ClearSprites
+	ld a, [wPokedexStatus]
+	push af
+	ld a, [hSCX]
+	add POKEDEX_SCX
+	ld [hSCX], a
+	xor a
+	ld [wPokedexStatus], a
+	farcall _NewPokedexEntry
+	call WaitPressAorB_BlinkCursor
+	ld a, 1 ; page 2
+	ld [wPokedexStatus], a
+	farcall DisplayDexEntry
+	call WaitPressAorB_BlinkCursor
+	pop af
+	ld [wPokedexStatus], a
+	call MaxVolume
+	call RotateThreePalettesRight
+	ld a, [hSCX]
+	add -POKEDEX_SCX
+	ld [hSCX], a
+	call .ReturnFromDexRegistration
+	pop af
+	ld [hMapAnims], a
+	ret
+; fb8c8
+
+.ReturnFromDexRegistration: ; fb8c8
+	call ClearTileMap
+	call LoadFontsExtra
+	call LoadStandardFont
+	farcall Pokedex_PlaceFrontpicTopLeftCorner
+	call WaitBGMap2
+	farcall GetEnemyMonDVs
+	ld a, [hli]
+	ld [TempMonDVs], a
+	ld a, [hl]
+	ld [TempMonDVs + 1], a
+	ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
+	call GetSGBLayout
+	call SetPalettes
+	ret
+; fb8f1
--- /dev/null
+++ b/engine/pokedex/pokedex.asm
@@ -1,0 +1,2592 @@
+; Pokedex_RunJumptable.Jumptable indexes
+	const_def
+	const DEXSTATE_MAIN_SCR
+	const DEXSTATE_UPDATE_MAIN_SCR
+	const DEXSTATE_DEX_ENTRY_SCR
+	const DEXSTATE_UPDATE_DEX_ENTRY_SCR
+	const DEXSTATE_REINIT_DEX_ENTRY_SCR
+	const DEXSTATE_SEARCH_SCR
+	const DEXSTATE_UPDATE_SEARCH_SCR
+	const DEXSTATE_OPTION_SCR
+	const DEXSTATE_UPDATE_OPTION_SCR
+	const DEXSTATE_SEARCH_RESULTS_SCR
+	const DEXSTATE_UPDATE_SEARCH_RESULTS_SCR
+	const DEXSTATE_UNOWN_MODE
+	const DEXSTATE_UPDATE_UNOWN_MODE
+	const DEXSTATE_EXIT
+
+POKEDEX_SCX EQU 5
+GLOBAL POKEDEX_SCX
+
+Pokedex: ; 40000
+
+	ld a, [hWX]
+	ld l, a
+	ld a, [hWY]
+	ld h, a
+	push hl
+	ld a, [hSCX]
+	push af
+	ld hl, Options
+	ld a, [hl]
+	push af
+	set NO_TEXT_SCROLL, [hl]
+	ld a, [VramState]
+	push af
+	xor a
+	ld [VramState], a
+	ld a, [hInMenu]
+	push af
+	ld a, $1
+	ld [hInMenu], a
+
+	xor a
+	ld [hMapAnims], a
+	call InitPokedex
+	call DelayFrame
+
+.main
+	call JoyTextDelay
+	ld a, [wJumptableIndex]
+	bit 7, a
+	jr nz, .exit
+	call Pokedex_RunJumptable
+	call DelayFrame
+	jr .main
+
+.exit
+	ld de, SFX_READ_TEXT_2
+	call PlaySFX
+	call WaitSFX
+	call ClearSprites
+	ld a, [wCurrentDexMode]
+	ld [wLastDexMode], a
+
+	pop af
+	ld [hInMenu], a
+	pop af
+	ld [VramState], a
+	pop af
+	ld [Options], a
+	pop af
+	ld [hSCX], a
+	pop hl
+	ld a, l
+	ld [hWX], a
+	ld a, h
+	ld [hWY], a
+	ret
+
+InitPokedex: ; 40063
+	call ClearBGPalettes
+	call ClearSprites
+	call ClearTileMap
+	call Pokedex_LoadGFX
+
+	ld hl, wPokedexDataStart
+	ld bc, wPokedexDataEnd - wPokedexDataStart
+	xor a
+	call ByteFill
+
+	xor a
+	ld [wJumptableIndex], a
+	ld [wPrevDexEntryJumptableIndex], a
+	ld [wPrevDexEntryBackup], a
+	ld [wcf66], a
+
+	call Pokedex_CheckUnlockedUnownMode
+
+	ld a, [wLastDexMode]
+	ld [wCurrentDexMode], a
+
+	call Pokedex_OrderMonsByMode
+	call Pokedex_InitCursorPosition
+	call Pokedex_GetLandmark
+	farcall DrawDexEntryScreenRightEdge
+	call Pokedex_ResetBGMapMode
+	ret
+
+Pokedex_CheckUnlockedUnownMode: ; 400a2
+	ld a, [wStatusFlags]
+	bit 1, a
+	jr nz, .unlocked
+
+	xor a
+	ld [wUnlockedUnownMode], a
+	ret
+
+.unlocked
+	ld a, TRUE
+	ld [wUnlockedUnownMode], a
+	ret
+
+Pokedex_InitCursorPosition: ; 400b4
+	ld hl, wPokedexOrder
+	ld a, [wPrevDexEntry]
+	and a
+	jr z, .done
+	cp NUM_POKEMON + 1
+	jr nc, .done
+
+	ld b, a
+	ld a, [wDexListingEnd]
+	cp $8
+	jr c, .only_one_page
+
+	sub $7
+	ld c, a
+.loop1
+	ld a, b
+	cp [hl]
+	jr z, .done
+	inc hl
+	ld a, [wDexListingScrollOffset]
+	inc a
+	ld [wDexListingScrollOffset], a
+	dec c
+	jr nz, .loop1
+
+.only_one_page
+	ld c, $7
+.loop2
+	ld a, b
+	cp [hl]
+	jr z, .done
+	inc hl
+	ld a, [wDexListingCursor]
+	inc a
+	ld [wDexListingCursor], a
+	dec c
+	jr nz, .loop2
+
+.done
+	ret
+
+Pokedex_GetLandmark: ; 400ed
+	ld a, [MapGroup]
+	ld b, a
+	ld a, [MapNumber]
+	ld c, a
+	call GetWorldMapLocation
+
+	cp SPECIAL_MAP
+	jr nz, .load
+
+	ld a, [BackupMapGroup]
+	ld b, a
+	ld a, [BackupMapNumber]
+	ld c, a
+	call GetWorldMapLocation
+
+.load
+	ld [wDexCurrentLocation], a
+	ret
+
+Pokedex_RunJumptable: ; 4010b
+	ld a, [wJumptableIndex]
+	ld hl, .Jumptable
+	call Pokedex_LoadPointer
+	jp hl
+
+.Jumptable: ; 40115 (10:4115)
+; entries correspond to DEXSTATE_* constants
+	dw Pokedex_InitMainScreen
+	dw Pokedex_UpdateMainScreen
+	dw Pokedex_InitDexEntryScreen
+	dw Pokedex_UpdateDexEntryScreen
+	dw Pokedex_ReinitDexEntryScreen
+	dw Pokedex_InitSearchScreen
+	dw Pokedex_UpdateSearchScreen
+	dw Pokedex_InitOptionScreen
+	dw Pokedex_UpdateOptionScreen
+	dw Pokedex_InitSearchResultsScreen
+	dw Pokedex_UpdateSearchResultsScreen
+	dw Pokedex_InitUnownMode
+	dw Pokedex_UpdateUnownMode
+	dw Pokedex_Exit
+
+Pokedex_IncrementDexPointer: ; 40131 (10:4131)
+	ld hl, wJumptableIndex
+	inc [hl]
+	ret
+
+Pokedex_Exit: ; 40136 (10:4136)
+	ld hl, wJumptableIndex
+	set 7, [hl]
+	ret
+
+Pokedex_InitMainScreen: ; 4013c (10:413c)
+	xor a
+	ld [hBGMapMode], a
+	call ClearSprites
+	xor a
+	hlcoord 0, 0, AttrMap
+	ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+	call ByteFill
+	farcall DrawPokedexListWindow
+	hlcoord 0, 17
+	ld de, String_START_SEARCH
+	call Pokedex_PlaceString
+	ld a, 7
+	ld [wDexListingHeight], a
+	call Pokedex_PrintListing
+	call Pokedex_SetBGMapMode_3ifDMG_4ifCGB
+	call Pokedex_ResetBGMapMode
+	call Pokedex_DrawMainScreenBG
+	ld a, POKEDEX_SCX
+	ld [hSCX], a
+
+	ld a, [wCurrentDexMode]
+	cp DEXMODE_OLD
+	ld a, $4a
+	jr z, .okay
+	ld a, $47
+.okay
+	ld [hWX], a
+	xor a
+	ld [hWY], a
+	call WaitBGMap
+
+	call Pokedex_ResetBGMapMode
+	ld a, -1
+	ld [CurPartySpecies], a
+	ld a, SCGB_POKEDEX
+	call Pokedex_GetSGBLayout
+	call Pokedex_UpdateCursorOAM
+	farcall DrawPokedexListWindow
+	hlcoord 0, 17
+	ld de, String_START_SEARCH
+	call Pokedex_PlaceString
+	ld a, 7
+	ld [wDexListingHeight], a
+	call Pokedex_PrintListing
+	call Pokedex_IncrementDexPointer
+	ret
+
+Pokedex_UpdateMainScreen: ; 401ae (10:41ae)
+	ld hl, hJoyPressed
+	ld a, [hl]
+	and B_BUTTON
+	jr nz, .b
+	ld a, [hl]
+	and A_BUTTON
+	jr nz, .a
+	ld a, [hl]
+	and SELECT
+	jr nz, .select
+	ld a, [hl]
+	and START
+	jr nz, .start
+	call Pokedex_ListingHandleDPadInput
+	ret nc
+	call Pokedex_UpdateCursorOAM
+	xor a
+	ld [hBGMapMode], a
+	call Pokedex_PrintListing
+	call Pokedex_SetBGMapMode3
+	call Pokedex_ResetBGMapMode
+	ret
+
+.a
+	call Pokedex_GetSelectedMon
+	call Pokedex_CheckSeen
+	ret z
+	ld a, DEXSTATE_DEX_ENTRY_SCR
+	ld [wJumptableIndex], a
+	ld a, DEXSTATE_MAIN_SCR
+	ld [wPrevDexEntryJumptableIndex], a
+	ret
+
+.select
+	call Pokedex_BlackOutBG
+	ld a, DEXSTATE_OPTION_SCR
+	ld [wJumptableIndex], a
+	xor a
+	ld [hSCX], a
+	ld a, $a7
+	ld [hWX], a
+	call DelayFrame
+	ret
+
+.start
+	call Pokedex_BlackOutBG
+	ld a, DEXSTATE_SEARCH_SCR
+	ld [wJumptableIndex], a
+	xor a
+	ld [hSCX], a
+	ld a, $a7
+	ld [hWX], a
+	call DelayFrame
+	ret
+
+.b
+	ld a, DEXSTATE_EXIT
+	ld [wJumptableIndex], a
+	ret
+
+Pokedex_InitDexEntryScreen: ; 40217 (10:4217)
+	call LowVolume
+	xor a ; page 1
+	ld [wPokedexStatus], a
+	xor a
+	ld [hBGMapMode], a
+	call ClearSprites
+	call Pokedex_LoadCurrentFootprint
+	call Pokedex_DrawDexEntryScreenBG
+	call Pokedex_InitArrowCursor
+	call Pokedex_GetSelectedMon
+	ld [wPrevDexEntry], a
+	farcall DisplayDexEntry
+	call Pokedex_DrawFootprint
+	call WaitBGMap
+	ld a, $a7
+	ld [hWX], a
+	call Pokedex_GetSelectedMon
+	ld [CurPartySpecies], a
+	ld a, SCGB_POKEDEX
+	call Pokedex_GetSGBLayout
+	ld a, [CurPartySpecies]
+	call PlayMonCry
+	call Pokedex_IncrementDexPointer
+	ret
+
+Pokedex_UpdateDexEntryScreen: ; 40258 (10:4258)
+	ld de, DexEntryScreen_ArrowCursorData
+	call Pokedex_MoveArrowCursor
+	ld hl, hJoyPressed
+	ld a, [hl]
+	and B_BUTTON
+	jr nz, .return_to_prev_screen
+	ld a, [hl]
+	and A_BUTTON
+	jr nz, .do_menu_action
+	call Pokedex_NextOrPreviousDexEntry
+	ret nc
+	call Pokedex_IncrementDexPointer
+	ret
+
+.do_menu_action
+	ld a, [wDexArrowCursorPosIndex]
+	ld hl, DexEntryScreen_MenuActionJumptable
+	call Pokedex_LoadPointer
+	jp hl
+
+.return_to_prev_screen
+	ld a, [LastVolume]
+	and a
+	jr z, .max_volume
+	ld a, $77
+	ld [LastVolume], a
+
+.max_volume
+	call MaxVolume
+	ld a, [wPrevDexEntryJumptableIndex]
+	ld [wJumptableIndex], a
+	ret
+
+Pokedex_Page: ; 40292
+	ld a, [wPokedexStatus]
+	xor 1 ; toggle page
+	ld [wPokedexStatus], a
+	call Pokedex_GetSelectedMon
+	ld [wPrevDexEntry], a
+	farcall DisplayDexEntry
+	call WaitBGMap
+	ret
+
+Pokedex_ReinitDexEntryScreen: ; 402aa (10:42aa)
+; Reinitialize the Pokédex entry screen after changing the selected mon.
+	call Pokedex_BlackOutBG
+	xor a ; page 1
+	ld [wPokedexStatus], a
+	xor a
+	ld [hBGMapMode], a
+	call Pokedex_DrawDexEntryScreenBG
+	call Pokedex_InitArrowCursor
+	call Pokedex_LoadCurrentFootprint
+	call Pokedex_GetSelectedMon
+	ld [wPrevDexEntry], a
+	farcall DisplayDexEntry
+	call Pokedex_DrawFootprint
+	call Pokedex_LoadSelectedMonTiles
+	call WaitBGMap
+	call Pokedex_GetSelectedMon
+	ld [CurPartySpecies], a
+	ld a, SCGB_POKEDEX
+	call Pokedex_GetSGBLayout
+	ld a, [CurPartySpecies]
+	call PlayMonCry
+	ld hl, wJumptableIndex
+	dec [hl]
+	ret
+
+DexEntryScreen_ArrowCursorData: ; 402e8
+	db D_RIGHT | D_LEFT, 4
+	dwcoord 1, 17  ; PAGE
+	dwcoord 6, 17  ; AREA
+	dwcoord 11, 17 ; CRY
+	dwcoord 15, 17 ; PRNT
+
+
+DexEntryScreen_MenuActionJumptable: ; 402f2
+	dw Pokedex_Page
+	dw .Area
+	dw .Cry
+	dw .Print
+
+.Area: ; 402fa
+	call Pokedex_BlackOutBG
+	xor a
+	ld [hSCX], a
+	call DelayFrame
+	ld a, $7
+	ld [hWX], a
+	ld a, $90
+	ld [hWY], a
+	call Pokedex_GetSelectedMon
+	ld a, [wDexCurrentLocation]
+	ld e, a
+	predef Pokedex_GetArea
+	call Pokedex_BlackOutBG
+	call DelayFrame
+	xor a
+	ld [hBGMapMode], a
+	ld a, $90
+	ld [hWY], a
+	ld a, POKEDEX_SCX
+	ld [hSCX], a
+	call DelayFrame
+	call Pokedex_RedisplayDexEntry
+	call Pokedex_LoadSelectedMonTiles
+	call WaitBGMap
+	call Pokedex_GetSelectedMon
+	ld [CurPartySpecies], a
+	ld a, SCGB_POKEDEX
+	call Pokedex_GetSGBLayout
+	ret
+
+.Cry: ; 40340
+	call Pokedex_GetSelectedMon
+	ld a, [wd265]
+	call GetCryIndex
+	ld e, c
+	ld d, b
+	call PlayCry
+	ret
+
+.Print: ; 4034f
+	call Pokedex_ApplyPrintPals
+	xor a
+	ld [hSCX], a
+	ld a, [wPrevDexEntryBackup]
+	push af
+	ld a, [wPrevDexEntryJumptableIndex]
+	push af
+	ld a, [wJumptableIndex]
+	push af
+	farcall PrintDexEntry
+	pop af
+	ld [wJumptableIndex], a
+	pop af
+	ld [wPrevDexEntryJumptableIndex], a
+	pop af
+	ld [wPrevDexEntryBackup], a
+	call ClearBGPalettes
+	call DisableLCD
+	call Pokedex_LoadInvertedFont
+	call Pokedex_RedisplayDexEntry
+	call EnableLCD
+	call WaitBGMap
+	ld a, POKEDEX_SCX
+	ld [hSCX], a
+	call Pokedex_ApplyUsualPals
+	ret
+
+Pokedex_RedisplayDexEntry: ; 4038d
+	call Pokedex_DrawDexEntryScreenBG
+	call Pokedex_GetSelectedMon
+	farcall DisplayDexEntry
+	call Pokedex_DrawFootprint
+	ret
+
+Pokedex_InitOptionScreen: ; 4039d (10:439d)
+	xor a
+	ld [hBGMapMode], a
+	call ClearSprites
+	call Pokedex_DrawOptionScreenBG
+	call Pokedex_InitArrowCursor
+	ld a, [wCurrentDexMode] ; Index of the topmost visible item in a scrolling menu ???
+	ld [wDexArrowCursorPosIndex], a
+	call Pokedex_DisplayModeDescription
+	call WaitBGMap
+	ld a, SCGB_POKEDEX_SEARCH_OPTION
+	call Pokedex_GetSGBLayout
+	call Pokedex_IncrementDexPointer
+	ret
+
+Pokedex_UpdateOptionScreen: ; 403be (10:43be)
+	ld a, [wUnlockedUnownMode]
+	and a
+	jr nz, .okay
+	ld de, .NoUnownModeArrowCursorData
+	jr .okay2
+.okay
+	ld de, .ArrowCursorData
+.okay2
+	call Pokedex_MoveArrowCursor
+	call c, Pokedex_DisplayModeDescription
+	ld hl, hJoyPressed
+	ld a, [hl]
+	and SELECT | B_BUTTON
+	jr nz, .return_to_main_screen
+	ld a, [hl]
+	and A_BUTTON
+	jr nz, .do_menu_action
+	ret
+
+.do_menu_action
+	ld a, [wDexArrowCursorPosIndex]
+	ld hl, .MenuActionJumptable
+	call Pokedex_LoadPointer
+	jp hl
+
+.return_to_main_screen
+	call Pokedex_BlackOutBG
+	ld a, DEXSTATE_MAIN_SCR
+	ld [wJumptableIndex], a
+	ret
+
+.NoUnownModeArrowCursorData: ; 403f3
+	db D_UP | D_DOWN, 3
+	dwcoord 2,  4 ; NEW
+	dwcoord 2,  6 ; OLD
+	dwcoord 2,  8 ; ABC
+
+.ArrowCursorData: ; 403fb
+	db D_UP | D_DOWN, 4
+	dwcoord 2,  4 ; NEW
+	dwcoord 2,  6 ; OLD
+	dwcoord 2,  8 ; ABC
+	dwcoord 2, 10 ; UNOWN
+
+.MenuActionJumptable: ; 40405 (10:4405)
+	dw .MenuAction_NewMode
+	dw .MenuAction_OldMode
+	dw .MenuAction_ABCMode
+	dw .MenuAction_UnownMode
+
+.MenuAction_NewMode: ; 4040d (10:440d)
+	ld b, DEXMODE_NEW
+	jr .ChangeMode
+
+.MenuAction_OldMode: ; 40411 (10:4411)
+	ld b, DEXMODE_OLD
+	jr .ChangeMode
+
+.MenuAction_ABCMode: ; 40415 (10:4415)
+	ld b, DEXMODE_ABC
+
+.ChangeMode: ; 40417 (10:4417)
+	ld a, [wCurrentDexMode]
+	cp b
+	jr z, .skip_changing_mode ; Skip if new mode is same as current.
+
+	ld a, b
+	ld [wCurrentDexMode], a
+	call Pokedex_OrderMonsByMode
+	call Pokedex_DisplayChangingModesMessage
+	xor a
+	ld [wDexListingScrollOffset], a
+	ld [wDexListingCursor], a
+	call Pokedex_InitCursorPosition
+
+.skip_changing_mode
+	call Pokedex_BlackOutBG
+	ld a, DEXSTATE_MAIN_SCR
+	ld [wJumptableIndex], a
+	ret
+
+.MenuAction_UnownMode: ; 4043a (10:443a)
+	call Pokedex_BlackOutBG
+	ld a, DEXSTATE_UNOWN_MODE
+	ld [wJumptableIndex], a
+	ret
+
+Pokedex_InitSearchScreen: ; 40443 (10:4443)
+	xor a
+	ld [hBGMapMode], a
+	call ClearSprites
+	call Pokedex_DrawSearchScreenBG
+	call Pokedex_InitArrowCursor
+	ld a, NORMAL + 1
+	ld [wDexSearchMonType1], a
+	xor a
+	ld [wDexSearchMonType2], a
+	call Pokedex_PlaceSearchScreenTypeStrings
+	xor a
+	ld [wDexSearchSlowpokeFrame], a
+	farcall DoDexSearchSlowpokeFrame
+	call WaitBGMap
+	ld a, SCGB_POKEDEX_SEARCH_OPTION
+	call Pokedex_GetSGBLayout
+	call Pokedex_IncrementDexPointer
+	ret
+
+Pokedex_UpdateSearchScreen: ; 40471 (10:4471)
+	ld de, .ArrowCursorData
+	call Pokedex_MoveArrowCursor
+	call Pokedex_UpdateSearchMonType
+	call c, Pokedex_PlaceSearchScreenTypeStrings
+	ld hl, hJoyPressed
+	ld a, [hl]
+	and START | B_BUTTON
+	jr nz, .cancel
+	ld a, [hl]
+	and A_BUTTON
+	jr nz, .do_menu_action
+	ret
+
+.do_menu_action
+	ld a, [wDexArrowCursorPosIndex]
+	ld hl, .MenuActionJumptable
+	call Pokedex_LoadPointer
+	jp hl
+
+.cancel
+	call Pokedex_BlackOutBG
+	ld a, DEXSTATE_MAIN_SCR
+	ld [wJumptableIndex], a
+	ret
+
+.ArrowCursorData: ; 4049e
+	db D_UP | D_DOWN, 4
+	dwcoord 2, 4  ; TYPE 1
+	dwcoord 2, 6  ; TYPE 2
+	dwcoord 2, 13 ; BEGIN SEARCH
+	dwcoord 2, 15 ; CANCEL
+
+.MenuActionJumptable: ; 404a8
+	dw .MenuAction_MonSearchType
+	dw .MenuAction_MonSearchType
+	dw .MenuAction_BeginSearch
+	dw .MenuAction_Cancel
+
+.MenuAction_MonSearchType: ; 404b0
+	call Pokedex_NextSearchMonType
+	call Pokedex_PlaceSearchScreenTypeStrings
+	ret
+
+.MenuAction_BeginSearch: ; 404b7
+	call Pokedex_SearchForMons
+	farcall AnimateDexSearchSlowpoke
+	ld a, [wDexSearchResultCount]
+	and a
+	jr nz, .show_search_results
+
+; No mon with matching types was found.
+	call Pokedex_OrderMonsByMode
+	call Pokedex_DisplayTypeNotFoundMessage
+	xor a
+	ld [hBGMapMode], a
+	call Pokedex_DrawSearchScreenBG
+	call Pokedex_InitArrowCursor
+	call Pokedex_PlaceSearchScreenTypeStrings
+	call WaitBGMap
+	ret
+
+.show_search_results
+	ld [wDexListingEnd], a
+	ld a, [wDexListingScrollOffset]
+	ld [wDexListingScrollOffsetBackup], a
+	ld a, [wDexListingCursor]
+	ld [wDexListingCursorBackup], a
+	ld a, [wPrevDexEntry]
+	ld [wPrevDexEntryBackup], a
+	xor a
+	ld [wDexListingScrollOffset], a
+	ld [wDexListingCursor], a
+	call Pokedex_BlackOutBG
+	ld a, DEXSTATE_SEARCH_RESULTS_SCR
+	ld [wJumptableIndex], a
+	ret
+
+.MenuAction_Cancel: ; 40501
+	call Pokedex_BlackOutBG
+	ld a, DEXSTATE_MAIN_SCR
+	ld [wJumptableIndex], a
+	ret
+
+Pokedex_InitSearchResultsScreen: ; 4050a (10:450a)
+	xor a
+	ld [hBGMapMode], a
+	xor a
+	hlcoord 0, 0, AttrMap
+	ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+	call ByteFill
+	call Pokedex_SetBGMapMode4
+	call Pokedex_ResetBGMapMode
+	farcall DrawPokedexSearchResultsWindow
+	call Pokedex_PlaceSearchResultsTypeStrings
+	ld a, 4
+	ld [wDexListingHeight], a
+	call Pokedex_PrintListing
+	call Pokedex_SetBGMapMode3
+	call Pokedex_ResetBGMapMode
+	call Pokedex_DrawSearchResultsScreenBG
+	ld a, POKEDEX_SCX
+	ld [hSCX], a
+	ld a, $4a
+	ld [hWX], a
+	xor a
+	ld [hWY], a
+	call WaitBGMap
+	call Pokedex_ResetBGMapMode
+	farcall DrawPokedexSearchResultsWindow
+	call Pokedex_PlaceSearchResultsTypeStrings
+	call Pokedex_UpdateSearchResultsCursorOAM
+	ld a, -1
+	ld [CurPartySpecies], a
+	ld a, SCGB_POKEDEX
+	call Pokedex_GetSGBLayout
+	call Pokedex_IncrementDexPointer
+	ret
+
+Pokedex_UpdateSearchResultsScreen: ; 40562 (10:4562)
+	ld hl, hJoyPressed
+	ld a, [hl]
+	and B_BUTTON
+	jr nz, .return_to_search_screen
+	ld a, [hl]
+	and A_BUTTON
+	jr nz, .go_to_dex_entry
+	call Pokedex_ListingHandleDPadInput
+	ret nc
+	call Pokedex_UpdateSearchResultsCursorOAM
+	xor a
+	ld [hBGMapMode], a
+	call Pokedex_PrintListing
+	call Pokedex_SetBGMapMode3
+	call Pokedex_ResetBGMapMode
+	ret
+
+.go_to_dex_entry
+	call Pokedex_GetSelectedMon
+	call Pokedex_CheckSeen
+	ret z
+	ld a, DEXSTATE_DEX_ENTRY_SCR
+	ld [wJumptableIndex], a
+	ld a, DEXSTATE_SEARCH_RESULTS_SCR
+	ld [wPrevDexEntryJumptableIndex], a
+	ret
+
+.return_to_search_screen
+	ld a, [wDexListingScrollOffsetBackup]
+	ld [wDexListingScrollOffset], a
+	ld a, [wDexListingCursorBackup]
+	ld [wDexListingCursor], a
+	ld a, [wPrevDexEntryBackup]
+	ld [wPrevDexEntry], a
+	call Pokedex_BlackOutBG
+	call ClearSprites
+	call Pokedex_OrderMonsByMode
+	ld a, DEXSTATE_SEARCH_SCR
+	ld [wJumptableIndex], a
+	xor a
+	ld [hSCX], a
+	ld a, $a7
+	ld [hWX], a
+	ret
+
+Pokedex_InitUnownMode: ; 405bd (10:45bd)
+	call Pokedex_LoadUnownFont
+	call Pokedex_DrawUnownModeBG
+	xor a
+	ld [wDexCurrentUnownIndex], a
+	call Pokedex_LoadUnownFrontpicTiles
+	call Pokedex_UnownModePlaceCursor
+	farcall PrintUnownWord
+	call WaitBGMap
+	ld a, SCGB_POKEDEX_UNOWN_MODE
+	call Pokedex_GetSGBLayout
+	call Pokedex_IncrementDexPointer
+	ret
+
+Pokedex_UpdateUnownMode: ; 405df (10:45df)
+	ld hl, hJoyPressed
+	ld a, [hl]
+	and A_BUTTON | B_BUTTON
+	jr nz, .a_b
+	call Pokedex_UnownModeHandleDPadInput
+	ret
+
+.a_b
+	call Pokedex_BlackOutBG
+	ld a, DEXSTATE_OPTION_SCR
+	ld [wJumptableIndex], a
+	call DelayFrame
+	call Pokedex_CheckSGB
+	jr nz, .decompress
+	farcall LoadSGBPokedexGFX2
+	jr .done
+
+.decompress
+	ld hl, PokedexLZ
+	ld de, vTiles2 tile $31
+	lb bc, BANK(PokedexLZ), 58
+	call DecompressRequest2bpp
+
+.done
+	ret
+
+Pokedex_UnownModeHandleDPadInput: ; 40610 (10:4610)
+	ld hl, hJoyLast
+	ld a, [hl]
+	and D_RIGHT
+	jr nz, .right
+	ld a, [hl]
+	and D_LEFT
+	jr nz, .left
+	ret
+
+.right
+	ld a, [wDexUnownCount]
+	ld e, a
+	ld hl, wDexCurrentUnownIndex
+	ld a, [hl]
+	inc a
+	cp e
+	ret nc
+	ld a, [hl]
+	inc [hl]
+	jr .update
+
+.left
+	ld hl, wDexCurrentUnownIndex
+	ld a, [hl]
+	and a
+	ret z
+	ld a, [hl]
+	dec [hl]
+
+.update
+	push af
+	xor a
+	ld [hBGMapMode], a
+	pop af
+	call Pokedex_UnownModeEraseCursor
+	call Pokedex_LoadUnownFrontpicTiles
+	call Pokedex_UnownModePlaceCursor
+	farcall PrintUnownWord
+	ld a, $1
+	ld [hBGMapMode], a
+	call DelayFrame
+	call DelayFrame
+	ret
+
+Pokedex_UnownModeEraseCursor: ; 40654 (10:4654)
+	ld c, " "
+	jr Pokedex_UnownModeUpdateCursorGfx
+
+Pokedex_UnownModePlaceCursor: ; 40658 (10:4658)
+	ld a, [wDexCurrentUnownIndex]
+	ld c, $5a ; diamond cursor
+
+Pokedex_UnownModeUpdateCursorGfx: ; 4065d (10:465d)
+	ld e, a
+	ld d, 0
+	ld hl, UnownModeLetterAndCursorCoords + 2
+rept 4
+	add hl, de
+endr
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld [hl], c
+	ret
+
+Pokedex_NextOrPreviousDexEntry: ; 4066c (10:466c)
+	ld a, [wDexListingCursor]
+	ld [wBackupDexListingCursor], a
+	ld a, [wDexListingScrollOffset]
+	ld [wBackupDexListingPage], a
+	ld hl, hJoyLast
+	ld a, [hl]
+	and D_UP
+	jr nz, .up
+	ld a, [hl]
+	and D_DOWN
+	jr nz, .down
+	and a
+	ret
+
+.up
+	ld a, [wDexListingHeight]
+	ld d, a
+	ld a, [wDexListingEnd]
+	ld e, a
+	call Pokedex_ListingMoveCursorUp
+	jr nc, .nope
+	call Pokedex_GetSelectedMon
+	call Pokedex_CheckSeen
+	jr nz, .yep
+	jr .up
+
+.down
+	ld a, [wDexListingHeight]
+	ld d, a
+	ld a, [wDexListingEnd]
+	ld e, a
+	call Pokedex_ListingMoveCursorDown
+	jr nc, .nope
+	call Pokedex_GetSelectedMon
+	call Pokedex_CheckSeen
+	jr nz, .yep
+	jr .down
+
+.yep
+	scf
+	ret
+
+.nope
+	ld a, [wBackupDexListingCursor]
+	ld [wDexListingCursor], a
+	ld a, [wBackupDexListingPage]
+	ld [wDexListingScrollOffset], a
+	and a
+	ret
+
+Pokedex_ListingHandleDPadInput: ; 406c5 (10:46c5)
+; Handles D-pad input for a list of Pokémon.
+	ld a, [wDexListingHeight]
+	ld d, a
+	ld a, [wDexListingEnd]
+	ld e, a
+	ld hl, hJoyLast
+	ld a, [hl]
+	and D_UP
+	jr nz, Pokedex_ListingMoveCursorUp
+	ld a, [hl]
+	and D_DOWN
+	jr nz, Pokedex_ListingMoveCursorDown
+	ld a, d
+	cp e
+	jr nc, Pokedex_ListingPosStayedSame
+	ld a, [hl]
+	and D_LEFT
+	jr nz, Pokedex_ListingMoveUpOnePage
+	ld a, [hl]
+	and D_RIGHT
+	jr nz, Pokedex_ListingMoveDownOnePage
+	jr Pokedex_ListingPosStayedSame
+
+Pokedex_ListingMoveCursorUp: ; 406ea (10:46ea)
+	ld hl, wDexListingCursor
+	ld a, [hl]
+	and a
+	jr z, .try_scrolling
+	dec [hl]
+	jr Pokedex_ListingPosChanged
+.try_scrolling
+	ld hl, wDexListingScrollOffset
+	ld a, [hl]
+	and a
+	jr z, Pokedex_ListingPosStayedSame
+	dec [hl]
+	jr Pokedex_ListingPosChanged
+
+Pokedex_ListingMoveCursorDown: ; 406fe (10:46fe)
+	ld hl, wDexListingCursor
+	ld a, [hl]
+	inc a
+	cp e
+	jr nc, Pokedex_ListingPosStayedSame
+	cp d
+	jr nc, .try_scrolling
+	inc [hl]
+	jr Pokedex_ListingPosChanged
+.try_scrolling
+	ld hl, wDexListingScrollOffset
+	add [hl]
+	cp e
+	jr nc, Pokedex_ListingPosStayedSame
+	inc [hl]
+	jr Pokedex_ListingPosChanged
+
+Pokedex_ListingMoveUpOnePage: ; 40716 (10:4716)
+	ld hl, wDexListingScrollOffset
+	ld a, [hl]
+	and a
+	jr z, Pokedex_ListingPosStayedSame
+	cp d
+	jr nc, .not_near_top
+; If we're already less than page away from the top, go to the top.
+	xor a
+	ld [hl], a
+	jr Pokedex_ListingPosChanged
+.not_near_top
+	sub d
+	ld [hl], a
+	jr Pokedex_ListingPosChanged
+
+Pokedex_ListingMoveDownOnePage: ; 40728 (10:4728)
+; When moving down a page, the return value always report a change in position.
+	ld hl, wDexListingScrollOffset
+	ld a, d
+	add a
+	add [hl]
+	jr c, .near_bottom
+	cp e
+	jr c, .not_near_bottom
+.near_bottom
+	ld a, e
+	sub d
+	ld [hl], a
+	jr Pokedex_ListingPosChanged
+.not_near_bottom
+	ld a, [hl]
+	add d
+	ld [hl], a
+	jr Pokedex_ListingPosChanged
+
+Pokedex_ListingPosStayedSame: ; 4073d (10:473d)
+	and a
+	ret
+
+Pokedex_ListingPosChanged: ; 4073f (10:473f)
+	scf
+	ret
+
+Pokedex_FillColumn: ; 40741
+; Fills a column starting at HL, going downwards.
+; B is the height of the column and A is the tile it's filled with.
+	push de
+	ld de, SCREEN_WIDTH
+.loop
+	ld [hl], a
+	add hl, de
+	dec b
+	jr nz, .loop
+	pop de
+	ret
+
+
+Pokedex_DrawMainScreenBG: ; 4074c (10:474c)
+; Draws the left sidebar and the bottom bar on the main screen.
+	hlcoord 0, 17
+	ld de, String_START_SEARCH
+	call Pokedex_PlaceString
+	ld a, $32
+	hlcoord 0, 0
+	ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+	call ByteFill
+	hlcoord 0, 0
+	lb bc, 7, 7
+	call Pokedex_PlaceBorder
+	hlcoord 0, 9
+	lb bc, 6, 7
+	call Pokedex_PlaceBorder
+	hlcoord 1, 11
+	ld de, String_SEEN
+	call Pokedex_PlaceString
+	ld hl, PokedexSeen
+	ld b, EndPokedexSeen - PokedexSeen
+	call CountSetBits
+	ld de, wd265
+	hlcoord 5, 12
+	lb bc, 1, 3
+	call PrintNum
+	hlcoord 1, 14
+	ld de, String_OWN
+	call Pokedex_PlaceString
+	ld hl, PokedexCaught
+	ld b, EndPokedexCaught - PokedexCaught
+	call CountSetBits
+	ld de, wd265
+	hlcoord 5, 15
+	lb bc, 1, 3
+	call PrintNum
+	hlcoord 1, 17
+	ld de, String_SELECT_OPTION
+	call Pokedex_PlaceString
+	hlcoord 8, 1
+	ld b, 7
+	ld a, $5a
+	call Pokedex_FillColumn
+	hlcoord 8, 10
+	ld b, 6
+	ld a, $5a
+	call Pokedex_FillColumn
+	hlcoord 8, 0
+	ld [hl], $59
+	hlcoord 8, 8
+	ld [hl], $53
+	hlcoord 8, 9
+	ld [hl], $54
+	hlcoord 8, 16
+	ld [hl], $5b
+	call Pokedex_PlaceFrontpicTopLeftCorner
+	ret
+
+String_SEEN: ; 407e1
+	db "SEEN", -1
+String_OWN: ; 407e6
+	db "OWN", -1
+String_SELECT_OPTION: ; 407ea
+	db $3b, $48, $49, $4a, $44, $45, $46, $47 ; SELECT > OPTION
+	; fallthrough
+String_START_SEARCH: ; 407f2
+	db $3c, $3b, $41, $42, $43, $4b, $4c, $4d, $4e, $3c, -1 ; START > SEARCH
+
+Pokedex_DrawDexEntryScreenBG: ; 407fd
+	call Pokedex_FillBackgroundColor2
+	hlcoord 0, 0
+	lb bc, 15, 18
+	call Pokedex_PlaceBorder
+	hlcoord 19, 0
+	ld [hl], $34
+	hlcoord 19, 1
+	ld a, " "
+	ld b, 15
+	call Pokedex_FillColumn
+	ld [hl], $39
+	hlcoord 1, 10
+	ld bc, 19
+	ld a, $61
+	call ByteFill
+	hlcoord 1, 17
+	ld bc, 18
+	ld a, " "
+	call ByteFill
+	hlcoord 9, 7
+	ld de, .Height
+	call Pokedex_PlaceString
+	hlcoord 9, 9
+	ld de, .Weight
+	call Pokedex_PlaceString
+	hlcoord 0, 17
+	ld de, .MenuItems
+	call Pokedex_PlaceString
+	call Pokedex_PlaceFrontpicTopLeftCorner
+	ret
+
+.Unused: ; 4084f
+	db $5c, $5d, -1 ; No.
+.Height: ; 40852
+	db "HT  ?", $5e, "??", $5f, -1 ; HT  ?'??"
+.Weight: ; 4085c
+	db "WT   ???lb", -1 ; WT   ???lb
+.MenuItems: ; 40867
+	db $3b, " PAGE AREA CRY PRNT", -1
+
+Pokedex_DrawOptionScreenBG: ; 4087c (10:487c)
+	call Pokedex_FillBackgroundColor2
+	hlcoord 0, 2
+	lb bc, 8, 18
+	call Pokedex_PlaceBorder
+	hlcoord 0, 12
+	lb bc, 4, 18
+	call Pokedex_PlaceBorder
+	hlcoord 0, 1
+	ld de, .Title
+	call Pokedex_PlaceString
+	hlcoord 3, 4
+	ld de, .Modes
+	call PlaceString
+	ld a, [wUnlockedUnownMode]
+	and a
+	ret z
+	hlcoord 3, 10
+	ld de, .UnownMode
+	call PlaceString
+	ret
+
+.Title: ; 408b2
+	db $3b, " OPTION ", $3c, -1
+
+.Modes: ; 408bd
+	db   "NEW #DEX MODE"
+	next "OLD #DEX MODE"
+	next "A to Z MODE"
+	db "@"
+
+.UnownMode: ; 408e5
+	db "UNOWN MODE@"
+
+Pokedex_DrawSearchScreenBG: ; 408f0 (10:48f0)
+	call Pokedex_FillBackgroundColor2
+	hlcoord 0, 2
+	lb bc, 14, 18
+	call Pokedex_PlaceBorder
+	hlcoord 0, 1
+	ld de, .Title
+	call Pokedex_PlaceString
+	hlcoord 8, 4
+	ld de, .TypeLeftRightArrows
+	call Pokedex_PlaceString
+	hlcoord 8, 6
+	ld de, .TypeLeftRightArrows
+	call Pokedex_PlaceString
+	hlcoord 3, 4
+	ld de, .Types
+	call PlaceString
+	hlcoord 3, 13
+	ld de, .Menu
+	call PlaceString
+	ret
+
+.Title: ; 4092a
+	db $3b, " SEARCH ", $3c, -1
+
+.TypeLeftRightArrows: ; 40935
+	db $3d, "        ", $3e, -1
+
+.Types: ; 40940
+	db   "TYPE1"
+	next "TYPE2"
+	db   "@"
+
+.Menu: ; 4094c
+	db   "BEGIN SEARCH!!"
+	next "CANCEL"
+	db   "@"
+
+Pokedex_DrawSearchResultsScreenBG: ; 40962 (10:4962)
+	call Pokedex_FillBackgroundColor2
+	hlcoord 0, 0
+	lb bc, 7, 7
+	call Pokedex_PlaceBorder
+	hlcoord 0, 11
+	lb bc, 5, 18
+	call Pokedex_PlaceBorder
+	hlcoord 1, 12
+	ld de, .BottomWindowText
+	call PlaceString
+	ld de, wDexSearchResultCount
+	hlcoord 1, 16
+	lb bc, 1, 3
+	call PrintNum
+	hlcoord 8, 0
+	ld [hl], $59
+	hlcoord 8, 1
+	ld b, 7
+	ld a, $5a
+	call Pokedex_FillColumn
+	hlcoord 8, 8
+	ld [hl], $53
+	hlcoord 8, 9
+	ld [hl], $69
+	hlcoord 8, 10
+	ld [hl], $6a
+	call Pokedex_PlaceFrontpicTopLeftCorner
+	ret
+
+.BottomWindowText: ; 409ae
+	db   "SEARCH RESULTS"
+	next "  TYPE"
+	next "    FOUND!"
+	db   "@"
+
+Pokedex_PlaceSearchResultsTypeStrings: ; 409cf (10:49cf)
+	ld a, [wDexSearchMonType1]
+	hlcoord 0, 14
+	call Pokedex_PlaceTypeString
+	ld a, [wDexSearchMonType1]
+	ld b, a
+	ld a, [wDexSearchMonType2]
+	and a
+	jr z, .done
+	cp b
+	jr z, .done
+	hlcoord 2, 15
+	call Pokedex_PlaceTypeString
+	hlcoord 1, 15
+	ld [hl], "/"
+.done
+	ret
+
+Pokedex_DrawUnownModeBG: ; 409f1 (10:49f1)
+	call Pokedex_FillBackgroundColor2
+	hlcoord 2, 1
+	lb bc, 10, 13
+	call Pokedex_PlaceBorder
+	hlcoord 2, 14
+	lb bc, 1, 13
+	call Pokedex_PlaceBorder
+	hlcoord 2, 15
+	ld [hl], $3d
+	hlcoord 16, 15
+	ld [hl], $3e
+	hlcoord 6, 5
+	call Pokedex_PlaceFrontpicAtHL
+	ld de, 0
+	ld b, 0
+	ld c, 26
+.loop
+	ld hl, UnownDex
+	add hl, de
+	ld a, [hl]
+	and a
+	jr z, .done
+	push af
+	ld hl, UnownModeLetterAndCursorCoords
+rept 4
+	add hl, de
+endr
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	pop af
+	add $40 - 1 ; Unown A
+	ld [hl], a
+	inc de
+	inc b
+	dec c
+	jr nz, .loop
+.done
+	ld a, b
+	ld [wDexUnownCount], a
+	ret
+
+UnownModeLetterAndCursorCoords: ; 40a3e
+; entries correspond to Unown forms
+;           letter, cursor
+	dwcoord   4,11,   3,11 ; A
+	dwcoord   4,10,   3,10 ; B
+	dwcoord   4, 9,   3, 9 ; C
+	dwcoord   4, 8,   3, 8 ; D
+	dwcoord   4, 7,   3, 7 ; E
+	dwcoord   4, 6,   3, 6 ; F
+	dwcoord   4, 5,   3, 5 ; G
+	dwcoord   4, 4,   3, 4 ; H
+	dwcoord   4, 3,   3, 2 ; I
+	dwcoord   5, 3,   5, 2 ; J
+	dwcoord   6, 3,   6, 2 ; K
+	dwcoord   7, 3,   7, 2 ; L
+	dwcoord   8, 3,   8, 2 ; M
+	dwcoord   9, 3,   9, 2 ; N
+	dwcoord  10, 3,  10, 2 ; O
+	dwcoord  11, 3,  11, 2 ; P
+	dwcoord  12, 3,  12, 2 ; Q
+	dwcoord  13, 3,  13, 2 ; R
+	dwcoord  14, 3,  15, 2 ; S
+	dwcoord  14, 4,  15, 4 ; T
+	dwcoord  14, 5,  15, 5 ; U
+	dwcoord  14, 6,  15, 6 ; V
+	dwcoord  14, 7,  15, 7 ; W
+	dwcoord  14, 8,  15, 8 ; X
+	dwcoord  14, 9,  15, 9 ; Y
+	dwcoord  14,10,  15,10 ; Z
+
+Pokedex_FillBackgroundColor2: ; 40aa6
+	hlcoord 0, 0
+	ld a, $32
+	ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+	call ByteFill
+	ret
+
+Pokedex_PlaceFrontpicTopLeftCorner: ; 40ab2
+	hlcoord 1, 1
+Pokedex_PlaceFrontpicAtHL: ; 40ab5
+	xor a
+	ld b, $7
+.row
+	ld c, $7
+	push af
+	push hl
+.col
+	ld [hli], a
+	add $7
+	dec c
+	jr nz, .col
+	pop hl
+	ld de, SCREEN_WIDTH
+	add hl, de
+	pop af
+	inc a
+	dec b
+	jr nz, .row
+	ret
+
+Pokedex_PlaceString: ; 40acd
+.loop
+	ld a, [de]
+	cp -1
+	ret z
+	inc de
+	ld [hli], a
+	jr .loop
+
+
+Pokedex_PlaceBorder: ; 40ad5
+	push hl
+	ld a, $33
+	ld [hli], a
+	ld d, $34
+	call .FillRow
+	ld a, $35
+	ld [hl], a
+	pop hl
+	ld de, SCREEN_WIDTH
+	add hl, de
+.loop
+	push hl
+	ld a, $36
+	ld [hli], a
+	ld d, $7f
+	call .FillRow
+	ld a, $37
+	ld [hl], a
+	pop hl
+	ld de, SCREEN_WIDTH
+	add hl, de
+	dec b
+	jr nz, .loop
+	ld a, $38
+	ld [hli], a
+	ld d, $39
+	call .FillRow
+	ld a, $3a
+	ld [hl], a
+	ret
+
+.FillRow: ; 40b06
+	ld e, c
+.row_loop
+	ld a, e
+	and a
+	ret z
+	ld a, d
+	ld [hli], a
+	dec e
+	jr .row_loop
+
+
+Pokedex_PrintListing: ; 40b0f (10:4b0f)
+; Prints the list of Pokémon on the main Pokédex screen.
+
+; This check is completely useless.
+	ld a, [wCurrentDexMode]
+	cp DEXMODE_OLD
+	jr z, .okay
+	ld c, 11
+	jr .resume
+.okay
+	ld c, 11
+; End useless check
+
+.resume
+; Clear (2 * [wDexListingHeight] + 1) by 11 box starting at 0,1
+	hlcoord 0, 1
+	ld a, [wDexListingHeight]
+	add a
+	inc a
+	ld b, a
+	ld a, " "
+	call Pokedex_FillBox
+
+; Load de with wPokedexOrder + [wDexListingScrollOffset]
+	ld a, [wDexListingScrollOffset]
+	ld e, a
+	ld d, $0
+	ld hl, wPokedexOrder
+	add hl, de
+	ld e, l
+	ld d, h
+	hlcoord 0, 2
+	ld a, [wDexListingHeight]
+.loop
+	push af
+	ld a, [de]
+	ld [wd265], a
+	push de
+	push hl
+	call .PrintEntry
+	pop hl
+	ld de, 2 * SCREEN_WIDTH
+	add hl, de
+	pop de
+	inc de
+	pop af
+	dec a
+	jr nz, .loop
+	call Pokedex_LoadSelectedMonTiles
+	ret
+
+.PrintEntry: ; 40b55 (10:4b55)
+; Prints one entry in the list of Pokémon on the main Pokédex screen.
+	and a
+	ret z
+	call Pokedex_PrintNumberIfOldMode
+	call Pokedex_PlaceDefaultStringIfNotSeen
+	ret c
+	call Pokedex_PlaceCaughtSymbolIfCaught
+	push hl
+	call GetPokemonName
+	pop hl
+	call PlaceString
+	ret
+
+Pokedex_PrintNumberIfOldMode: ; 40b6a (10:4b6a)
+	ld a, [wCurrentDexMode]
+	cp DEXMODE_OLD
+	jr z, .printnum
+	ret
+
+.printnum
+	push hl
+	ld de, -SCREEN_WIDTH
+	add hl, de
+	ld de, wd265
+	lb bc, PRINTNUM_LEADINGZEROS | 1, 3
+	call PrintNum
+	pop hl
+	ret
+
+Pokedex_PlaceCaughtSymbolIfCaught: ; 40b82 (10:4b82)
+	call Pokedex_CheckCaught
+	jr nz, .place_caught_symbol
+	inc hl
+	ret
+
+.place_caught_symbol
+	ld a, $4f
+	ld [hli], a
+	ret
+
+Pokedex_PlaceDefaultStringIfNotSeen: ; 40b8d (10:4b8d)
+	call Pokedex_CheckSeen
+	ret nz
+	inc hl
+	ld de, .NameNotSeen
+	call PlaceString
+	scf
+	ret
+
+.NameNotSeen: ; 40b9a
+	db "-----@"
+
+Pokedex_DrawFootprint: ; 40ba0
+	hlcoord 18, 1
+	ld a, $62
+	ld [hli], a
+	inc a
+	ld [hl], a
+	hlcoord 18, 2
+	ld a, $64
+	ld [hli], a
+	inc a
+	ld [hl], a
+	ret
+
+
+Pokedex_GetSelectedMon: ; 40bb1
+; Gets the species of the currently selected Pokémon. This corresponds to the
+; position of the cursor in the main listing, but this function can be used
+; on all Pokédex screens.
+	ld a, [wDexListingCursor]
+	ld hl, wDexListingScrollOffset
+	add [hl]
+	ld e, a
+	ld d, $0
+	ld hl, wPokedexOrder
+	add hl, de
+	ld a, [hl]
+	ld [wd265], a
+	ret
+
+
+Pokedex_CheckCaught: ; 40bc4 (10:4bc4)
+	push de
+	push hl
+	ld a, [wd265]
+	dec a
+	call CheckCaughtMon
+	pop hl
+	pop de
+	ret
+
+
+Pokedex_CheckSeen: ; 40bd0
+	push de
+	push hl
+	ld a, [wd265]
+	dec a
+	call CheckSeenMon
+	pop hl
+	pop de
+	ret
+
+
+
+Pokedex_OrderMonsByMode: ; 40bdc
+	ld hl, wPokedexOrder
+	ld bc, wPokedexOrderEnd - wPokedexOrder
+	xor a
+	call ByteFill
+	ld a, [wCurrentDexMode]
+	ld hl, .Jumptable
+	call Pokedex_LoadPointer
+	jp hl
+
+.Jumptable: ; 40bf0 (10:4bf0)
+	dw .NewMode
+	dw .OldMode
+	dw Pokedex_ABCMode
+
+.NewMode: ; 40bf6 (10:4bf6)
+	ld de, NewPokedexOrder
+	ld hl, wPokedexOrder
+	ld c, NUM_POKEMON
+.loopnew
+	ld a, [de]
+	inc de
+	ld [hli], a
+	dec c
+	jr nz, .loopnew
+	call .FindLastSeen
+	ret
+
+.OldMode: ; 40c08 (10:4c08)
+	ld hl, wPokedexOrder
+	ld a, $1
+	ld c, NUM_POKEMON
+.loopold
+	ld [hli], a
+	inc a
+	dec c
+	jr nz, .loopold
+	call .FindLastSeen
+	ret
+
+.FindLastSeen: ; 40c18 (10:4c18)
+	ld hl, wPokedexOrder + NUM_POKEMON - 1
+	ld d, NUM_POKEMON
+	ld e, d
+.loopfindend
+	ld a, [hld]
+	ld [wd265], a
+	call Pokedex_CheckSeen
+	jr nz, .foundend
+	dec d
+	dec e
+	jr nz, .loopfindend
+.foundend
+	ld a, d
+	ld [wDexListingEnd], a
+	ret
+
+Pokedex_ABCMode: ; 40c30
+	xor a
+	ld [wDexListingEnd], a
+	ld hl, wPokedexOrder
+	ld de, AlphabeticalPokedexOrder
+	ld c, NUM_POKEMON
+.loop1abc
+	push bc
+	ld a, [de]
+	ld [wd265], a
+	call Pokedex_CheckSeen
+	jr z, .skipabc
+	ld a, [wd265]
+	ld [hli], a
+	ld a, [wDexListingEnd]
+	inc a
+	ld [wDexListingEnd], a
+
+.skipabc
+	inc de
+	pop bc
+	dec c
+	jr nz, .loop1abc
+	ld a, [wDexListingEnd]
+	ld c, 0
+.loop2abc
+	cp NUM_POKEMON
+	jr z, .doneabc
+	ld [hl], c
+	inc hl
+	inc a
+	jr .loop2abc
+
+.doneabc
+	ret
+
+
+INCLUDE "data/pokemon/dex_order_alpha.asm"
+
+INCLUDE "data/pokemon/dex_order_new.asm"
+
+
+Pokedex_DisplayModeDescription: ; 40e5b
+	xor a
+	ld [hBGMapMode], a
+	hlcoord 0, 12
+	lb bc, 4, 18
+	call Pokedex_PlaceBorder
+	ld a, [wDexArrowCursorPosIndex]
+	ld hl, .Modes
+	call Pokedex_LoadPointer
+	ld e, l
+	ld d, h
+	hlcoord 1, 14
+	call PlaceString
+	ld a, $1
+	ld [hBGMapMode], a
+	ret
+
+.Modes: ; 40e7d
+	dw .NewMode
+	dw .OldMode
+	dw .ABCMode
+	dw .UnownMode
+
+.NewMode: ; 40e85
+	db   "<PK><MN> are listed by"
+	next "evolution type.@"
+
+.OldMode: ; 40ea6
+	db   "<PK><MN> are listed by"
+	next "official type.@"
+
+.ABCMode: ; 40ec6
+	db   "<PK><MN> are listed"
+	next "alphabetically.@"
+
+.UnownMode: ; 40ee4
+	db   "UNOWN are listed"
+	next "in catching order.@"
+
+Pokedex_DisplayChangingModesMessage: ; 40f08 (10:4f08)
+	xor a
+	ld [hBGMapMode], a
+	hlcoord 0, 12
+	lb bc, 4, 18
+	call Pokedex_PlaceBorder
+	ld de, String_ChangingModesPleaseWait
+	hlcoord 1, 14
+	call PlaceString
+	ld a, $1
+	ld [hBGMapMode], a
+	ld c, 64
+	call DelayFrames
+	ld de, SFX_CHANGE_DEX_MODE
+	call PlaySFX
+	ld c, 64
+	call DelayFrames
+	ret
+
+String_ChangingModesPleaseWait: ; 40f32
+	db   "Changing modes."
+	next "Please wait.@"
+
+Pokedex_UpdateSearchMonType: ; 40f4f (10:4f4f)
+	ld a, [wDexArrowCursorPosIndex]
+	cp 2
+	jr nc, .no_change
+	ld hl, hJoyLast
+	ld a, [hl]
+	and D_LEFT
+	jr nz, Pokedex_PrevSearchMonType
+	ld a, [hl]
+	and D_RIGHT
+	jr nz, Pokedex_NextSearchMonType
+.no_change
+	and a
+	ret
+
+Pokedex_PrevSearchMonType: ; 40f65
+	ld a, [wDexArrowCursorPosIndex]
+	and a
+	jr nz, .type2
+
+	ld hl, wDexSearchMonType1
+	ld a, [hl]
+	cp 1
+	jr z, .wrap_around
+	dec [hl]
+	jr .done
+
+.type2
+	ld hl, wDexSearchMonType2
+	ld a, [hl]
+	and a
+	jr z, .wrap_around
+	dec [hl]
+	jr .done
+
+.wrap_around
+	ld [hl], NUM_TYPES - 1
+
+.done
+	scf
+	ret
+
+Pokedex_NextSearchMonType: ; 40f84
+	ld a, [wDexArrowCursorPosIndex]
+	and a
+	jr nz, .type2
+
+	ld hl, wDexSearchMonType1
+	ld a, [hl]
+	cp NUM_TYPES - 1
+	jr nc, .type1_wrap_around
+	inc [hl]
+	jr .done
+.type1_wrap_around
+	ld [hl], 1
+	jr .done
+
+.type2
+	ld hl, wDexSearchMonType2
+	ld a, [hl]
+	cp NUM_TYPES - 1
+	jr nc, .type2_wrap_around
+	inc [hl]
+	jr .done
+.type2_wrap_around
+	ld [hl], 0
+
+.done
+	scf
+	ret
+
+Pokedex_PlaceSearchScreenTypeStrings: ; 40fa8 (10:4fa8)
+	xor a
+	ld [hBGMapMode], a
+	hlcoord 9, 3
+	lb bc, 4, 8
+	ld a, " "
+	call Pokedex_FillBox
+	ld a, [wDexSearchMonType1]
+	hlcoord 9, 4
+	call Pokedex_PlaceTypeString
+	ld a, [wDexSearchMonType2]
+	hlcoord 9, 6
+	call Pokedex_PlaceTypeString
+	ld a, $1
+	ld [hBGMapMode], a
+	ret
+
+Pokedex_PlaceTypeString: ; 40fcd (10:4fcd)
+	push hl
+	ld e, a
+	ld d, 0
+	ld hl, PokedexTypeSearchStrings
+rept 9
+	add hl, de
+endr
+	ld e, l
+	ld d, h
+	pop hl
+	call PlaceString
+	ret
+
+INCLUDE "data/types/search_strings.asm"
+
+Pokedex_SearchForMons: ; 41086
+	ld a, [wDexSearchMonType2]
+	and a
+	call nz, .Search
+	ld a, [wDexSearchMonType1]
+	and a
+	call nz, .Search
+	ret
+
+.Search: ; 41095
+	dec a
+	ld e, a
+	ld d, 0
+	ld hl, PokedexTypeSearchConversionTable
+	add hl, de
+	ld a, [hl]
+	ld [wDexConvertedMonType], a
+	ld hl, wPokedexOrder
+	ld de, wPokedexOrder
+	ld c, NUM_POKEMON
+	xor a
+	ld [wDexSearchResultCount], a
+.loop
+	push bc
+	ld a, [hl]
+	and a
+	jr z, .next_mon
+	ld [wd265], a
+	ld [CurSpecies], a
+	call Pokedex_CheckCaught
+	jr z, .next_mon
+	push hl
+	push de
+	call GetBaseData
+	pop de
+	pop hl
+	ld a, [wDexConvertedMonType]
+	ld b, a
+	ld a, [BaseType1]
+	cp b
+	jr z, .match_found
+	ld a, [BaseType2]
+	cp b
+	jr nz, .next_mon
+
+.match_found
+	ld a, [wd265]
+	ld [de], a
+	inc de
+	ld a, [wDexSearchResultCount]
+	inc a
+	ld [wDexSearchResultCount], a
+
+.next_mon
+	inc hl
+	pop bc
+	dec c
+	jr nz, .loop
+
+	ld l, e
+	ld h, d
+	ld a, [wDexSearchResultCount]
+	ld c, 0
+
+.zero_remaining_mons
+	cp NUM_POKEMON
+	jr z, .done
+	ld [hl], c
+	inc hl
+	inc a
+	jr .zero_remaining_mons
+
+.done
+	ret
+
+INCLUDE "data/types/search_types.asm"
+
+Pokedex_DisplayTypeNotFoundMessage: ; 41107
+	xor a
+	ld [hBGMapMode], a
+	hlcoord 0, 12
+	lb bc, 4, 18
+	call Pokedex_PlaceBorder
+	ld de, .TypeNotFound
+	hlcoord 1, 14
+	call PlaceString
+	ld a, $1
+	ld [hBGMapMode], a
+	ld c, $80
+	call DelayFrames
+	ret
+
+.TypeNotFound: ; 41126
+	db   "The specified type"
+	next "was not found.@"
+
+Pokedex_UpdateCursorOAM: ; 41148 (10:5148)
+	ld a, [wCurrentDexMode]
+	cp DEXMODE_OLD
+	jp z, Pokedex_PutOldModeCursorOAM
+	call Pokedex_PutNewModeABCModeCursorOAM
+	call Pokedex_PutScrollbarOAM
+	ret
+
+Pokedex_PutOldModeCursorOAM: ; 41157 (10:5157)
+	ld hl, .CursorOAM
+	ld a, [wDexListingCursor]
+	or a
+	jr nz, .okay
+	ld hl, .CursorAtTopOAM
+.okay
+	call Pokedex_LoadCursorOAM
+	ret
+
+.CursorOAM: ; 41167
+	dsprite  3,  0,  9, -1, $30, 7
+	dsprite  2,  0,  9, -1, $31, 7
+	dsprite  2,  0, 10, -1, $32, 7
+	dsprite  2,  0, 11, -1, $32, 7
+	dsprite  2,  0, 12, -1, $32, 7
+	dsprite  2,  0, 13, -1, $33, 7
+	dsprite  2,  0, 16, -2, $33, 7 | X_FLIP
+	dsprite  2,  0, 17, -2, $32, 7 | X_FLIP
+	dsprite  2,  0, 18, -2, $32, 7 | X_FLIP
+	dsprite  2,  0, 19, -2, $32, 7 | X_FLIP
+	dsprite  2,  0, 20, -2, $31, 7 | X_FLIP
+	dsprite  3,  0, 20, -2, $30, 7 | X_FLIP
+	dsprite  4,  0,  9, -1, $30, 7 | Y_FLIP
+	dsprite  5,  0,  9, -1, $31, 7 | Y_FLIP
+	dsprite  5,  0, 10, -1, $32, 7 | Y_FLIP
+	dsprite  5,  0, 11, -1, $32, 7 | Y_FLIP
+	dsprite  5,  0, 12, -1, $32, 7 | Y_FLIP
+	dsprite  5,  0, 13, -1, $33, 7 | Y_FLIP
+	dsprite  5,  0, 16, -2, $33, 7 | X_FLIP | Y_FLIP
+	dsprite  5,  0, 17, -2, $32, 7 | X_FLIP | Y_FLIP
+	dsprite  5,  0, 18, -2, $32, 7 | X_FLIP | Y_FLIP
+	dsprite  5,  0, 19, -2, $32, 7 | X_FLIP | Y_FLIP
+	dsprite  5,  0, 20, -2, $31, 7 | X_FLIP | Y_FLIP
+	dsprite  4,  0, 20, -2, $30, 7 | X_FLIP | Y_FLIP
+	db -1
+
+.CursorAtTopOAM: ; 411c8
+; OAM data for when the cursor is at the top of the list. The tiles at the top
+; are cut off so they don't show up outside the list area.
+	dsprite  3,  0,  9, -1, $30, 7
+	dsprite  2,  0,  9, -1, $34, 7
+	dsprite  2,  0, 10, -1, $35, 7
+	dsprite  2,  0, 11, -1, $35, 7
+	dsprite  2,  0, 12, -1, $35, 7
+	dsprite  2,  0, 13, -1, $36, 7
+	dsprite  2,  0, 16, -2, $36, 7 | X_FLIP
+	dsprite  2,  0, 17, -2, $35, 7 | X_FLIP
+	dsprite  2,  0, 18, -2, $35, 7 | X_FLIP
+	dsprite  2,  0, 19, -2, $35, 7 | X_FLIP
+	dsprite  2,  0, 20, -2, $34, 7 | X_FLIP
+	dsprite  3,  0, 20, -2, $30, 7 | X_FLIP
+	dsprite  4,  0,  9, -1, $30, 7 | Y_FLIP
+	dsprite  5,  0,  9, -1, $31, 7 | Y_FLIP
+	dsprite  5,  0, 10, -1, $32, 7 | Y_FLIP
+	dsprite  5,  0, 11, -1, $32, 7 | Y_FLIP
+	dsprite  5,  0, 12, -1, $32, 7 | Y_FLIP
+	dsprite  5,  0, 13, -1, $33, 7 | Y_FLIP
+	dsprite  5,  0, 16, -2, $33, 7 | X_FLIP | Y_FLIP
+	dsprite  5,  0, 17, -2, $32, 7 | X_FLIP | Y_FLIP
+	dsprite  5,  0, 18, -2, $32, 7 | X_FLIP | Y_FLIP
+	dsprite  5,  0, 19, -2, $32, 7 | X_FLIP | Y_FLIP
+	dsprite  5,  0, 20, -2, $31, 7 | X_FLIP | Y_FLIP
+	dsprite  4,  0, 20, -2, $30, 7 | X_FLIP | Y_FLIP
+	db -1
+
+Pokedex_PutNewModeABCModeCursorOAM: ; 41229 (10:5229)
+	ld hl, .CursorOAM
+	call Pokedex_LoadCursorOAM
+	ret
+
+.CursorOAM: ; 41230
+	dsprite  3,  3,  9, -1, $30, 7
+	dsprite  2,  3,  9, -1, $31, 7
+	dsprite  2,  3, 10, -1, $32, 7
+	dsprite  2,  3, 11, -1, $32, 7
+	dsprite  2,  3, 12, -1, $33, 7
+	dsprite  2,  3, 16,  0, $33, 7 | X_FLIP
+	dsprite  2,  3, 17,  0, $32, 7 | X_FLIP
+	dsprite  2,  3, 18,  0, $32, 7 | X_FLIP
+	dsprite  2,  3, 19,  0, $31, 7 | X_FLIP
+	dsprite  3,  3, 19,  0, $30, 7 | X_FLIP
+	dsprite  4,  3,  9, -1, $30, 7 | Y_FLIP
+	dsprite  5,  3,  9, -1, $31, 7 | Y_FLIP
+	dsprite  5,  3, 10, -1, $32, 7 | Y_FLIP
+	dsprite  5,  3, 11, -1, $32, 7 | Y_FLIP
+	dsprite  5,  3, 12, -1, $33, 7 | Y_FLIP
+	dsprite  5,  3, 16,  0, $33, 7 | X_FLIP | Y_FLIP
+	dsprite  5,  3, 17,  0, $32, 7 | X_FLIP | Y_FLIP
+	dsprite  5,  3, 18,  0, $32, 7 | X_FLIP | Y_FLIP
+	dsprite  5,  3, 19,  0, $31, 7 | X_FLIP | Y_FLIP
+	dsprite  4,  3, 19,  0, $30, 7 | X_FLIP | Y_FLIP
+	db -1
+
+Pokedex_UpdateSearchResultsCursorOAM: ; 41281 (10:5281)
+	ld a, [wCurrentDexMode]
+	cp DEXMODE_OLD
+	jp z, Pokedex_PutOldModeCursorOAM
+	ld hl, .CursorOAM
+	call Pokedex_LoadCursorOAM
+	ret
+
+.CursorOAM: ; 41290
+	dsprite  3,  3,  9, -1, $30, 7
+	dsprite  2,  3,  9, -1, $31, 7
+	dsprite  2,  3, 10, -1, $32, 7
+	dsprite  2,  3, 11, -1, $32, 7
+	dsprite  2,  3, 12, -1, $32, 7
+	dsprite  2,  3, 13, -1, $33, 7
+	dsprite  2,  3, 16, -2, $33, 7 | X_FLIP
+	dsprite  2,  3, 17, -2, $32, 7 | X_FLIP
+	dsprite  2,  3, 18, -2, $32, 7 | X_FLIP
+	dsprite  2,  3, 19, -2, $32, 7 | X_FLIP
+	dsprite  2,  3, 20, -2, $31, 7 | X_FLIP
+	dsprite  3,  3, 20, -2, $30, 7 | X_FLIP
+	dsprite  4,  3,  9, -1, $30, 7 | Y_FLIP
+	dsprite  5,  3,  9, -1, $31, 7 | Y_FLIP
+	dsprite  5,  3, 10, -1, $32, 7 | Y_FLIP
+	dsprite  5,  3, 11, -1, $32, 7 | Y_FLIP
+	dsprite  5,  3, 12, -1, $32, 7 | Y_FLIP
+	dsprite  5,  3, 13, -1, $33, 7 | Y_FLIP
+	dsprite  5,  3, 16, -2, $33, 7 | X_FLIP | Y_FLIP
+	dsprite  5,  3, 17, -2, $32, 7 | X_FLIP | Y_FLIP
+	dsprite  5,  3, 18, -2, $32, 7 | X_FLIP | Y_FLIP
+	dsprite  5,  3, 19, -2, $32, 7 | X_FLIP | Y_FLIP
+	dsprite  5,  3, 20, -2, $31, 7 | X_FLIP | Y_FLIP
+	dsprite  4,  3, 20, -2, $30, 7 | X_FLIP | Y_FLIP
+	db -1
+
+Pokedex_LoadCursorOAM: ; 412f1 (10:52f1)
+	ld de, Sprite01
+.loop
+	ld a, [hl]
+	cp -1
+	ret z
+	ld a, [wDexListingCursor]
+	and $7
+	swap a
+	add [hl] ; y
+	inc hl
+	ld [de], a
+	inc de
+	ld a, [hli] ; x
+	ld [de], a
+	inc de
+	ld a, [hli] ; tile id
+	ld [de], a
+	inc de
+	ld a, [hli] ; attributes
+	ld [de], a
+	inc de
+	jr .loop
+
+Pokedex_PutScrollbarOAM: ; 4130e (10:530e)
+; Writes the OAM data for the scrollbar in the new mode and ABC mode.
+	push de
+	ld a, [wDexListingEnd]
+	dec a
+	ld e, a
+	ld a, [wDexListingCursor]
+	ld hl, wDexListingScrollOffset
+	add [hl]
+	cp e
+	jr z, .asm_4133f
+	ld hl, $0
+	ld bc, $79
+	call AddNTimes
+	ld e, l
+	ld d, h
+	ld b, $0
+	ld a, d
+	or e
+	jr z, .asm_41341
+	ld a, [wDexListingEnd]
+	ld c, a
+.asm_41333
+	ld a, e
+	sub c
+	ld e, a
+	ld a, d
+	sbc $0
+	ld d, a
+	jr c, .asm_41341
+	inc b
+	jr .asm_41333
+.asm_4133f
+	ld b, $79
+.asm_41341
+	ld a, $14
+	add b
+	pop hl
+	ld [hli], a
+	ld a, $a1
+	ld [hli], a
+	ld a, $f
+	ld [hli], a
+	ld [hl], $0
+	ret
+
+Pokedex_InitArrowCursor: ; 4134f (10:534f)
+	xor a
+	ld [wDexArrowCursorPosIndex], a
+	ld [wDexArrowCursorDelayCounter], a
+	ld [wDexArrowCursorBlinkCounter], a
+	ret
+
+Pokedex_MoveArrowCursor: ; 4135a (10:535a)
+; bc = [de] - 1
+	ld a, [de]
+	ld b, a
+	inc de
+	ld a, [de]
+	dec a
+	ld c, a
+	inc de
+	call Pokedex_BlinkArrowCursor
+
+	ld hl, hJoyPressed
+	ld a, [hl]
+	and D_LEFT | D_UP
+	and b
+	jr nz, .move_left_or_up
+	ld a, [hl]
+	and D_RIGHT | D_DOWN
+	and b
+	jr nz, .move_right_or_down
+	ld a, [hl]
+	and SELECT
+	and b
+	jr nz, .select
+	call Pokedex_ArrowCursorDelay
+	jr c, .no_action
+	ld hl, hJoyLast
+	ld a, [hl]
+	and D_LEFT | D_UP
+	and b
+	jr nz, .move_left_or_up
+	ld a, [hl]
+	and D_RIGHT | D_DOWN
+	and b
+	jr nz, .move_right_or_down
+	jr .no_action
+
+.move_left_or_up
+	ld a, [wDexArrowCursorPosIndex]
+	and a
+	jr z, .no_action
+	call Pokedex_GetArrowCursorPos
+	ld [hl], " "
+	ld hl, wDexArrowCursorPosIndex
+	dec [hl]
+	jr .update_cursor_pos
+
+.move_right_or_down
+	ld a, [wDexArrowCursorPosIndex]
+	cp c
+	jr nc, .no_action
+	call Pokedex_GetArrowCursorPos
+	ld [hl], " "
+	ld hl, wDexArrowCursorPosIndex
+	inc [hl]
+
+.update_cursor_pos
+	call Pokedex_GetArrowCursorPos
+	ld [hl], "▶"
+	ld a, 12
+	ld [wDexArrowCursorDelayCounter], a
+	xor a
+	ld [wDexArrowCursorBlinkCounter], a
+	scf
+	ret
+
+.no_action
+	and a
+	ret
+
+.select
+	call Pokedex_GetArrowCursorPos
+	ld [hl], " "
+	ld a, [wDexArrowCursorPosIndex]
+	cp c
+	jr c, .update
+	ld a, -1
+.update
+	inc a
+	ld [wDexArrowCursorPosIndex], a
+	jr .update_cursor_pos
+
+Pokedex_GetArrowCursorPos: ; 413d4 (10:53d4)
+	ld a, [wDexArrowCursorPosIndex]
+	add a
+	ld l, a
+	ld h, 0
+	add hl, de
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ret
+
+Pokedex_BlinkArrowCursor: ; 413e0 (10:53e0)
+	ld hl, wDexArrowCursorBlinkCounter
+	ld a, [hl]
+	inc [hl]
+	and $8
+	jr z, .blink_on
+	call Pokedex_GetArrowCursorPos
+	ld [hl], " "
+	ret
+
+.blink_on
+	call Pokedex_GetArrowCursorPos
+	ld [hl], "▶"
+	ret
+
+Pokedex_ArrowCursorDelay: ; 413f5 (10:53f5)
+; Updates the delay counter set when moving the arrow cursor.
+; Returns whether the delay is active in carry.
+	ld hl, wDexArrowCursorDelayCounter
+	ld a, [hl]
+	and a
+	ret z
+
+	dec [hl]
+	scf
+	ret
+
+Pokedex_FillBox: ; 413fe (10:53fe)
+	jp FillBoxWithByte
+
+Pokedex_BlackOutBG: ; 41401 (10:5401)
+; Make BG palettes black so that the BG becomes all black.
+	ld a, [rSVBK]
+	push af
+	ld a, BANK(wBGPals1)
+	ld [rSVBK], a
+	ld hl, wBGPals1
+	ld bc, 8 palettes
+	xor a
+	call ByteFill
+	pop af
+	ld [rSVBK], a
+
+Pokedex_ApplyPrintPals: ; 41415
+	ld a, $ff
+	call DmgToCgbBGPals
+	ld a, $ff
+	call DmgToCgbObjPal0
+	call DelayFrame
+	ret
+
+Pokedex_GetSGBLayout: ; 41423
+	ld b, a
+	call GetSGBLayout
+
+Pokedex_ApplyUsualPals: ; 41427
+; This applies the palettes used for most Pokédex screens.
+	ld a, $e4
+	call DmgToCgbBGPals
+	ld a, $e0
+	call DmgToCgbObjPal0
+	ret
+
+
+Pokedex_LoadPointer: ; 41432
+	ld e, a
+	ld d, 0
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ret
+
+Pokedex_LoadSelectedMonTiles: ; 4143b
+; Loads the tiles of the currently selected Pokémon.
+	call Pokedex_GetSelectedMon
+	call Pokedex_CheckSeen
+	jr z, .QuestionMark
+	ld a, [wFirstUnownSeen]
+	ld [UnownLetter], a
+	ld a, [wd265]
+	ld [CurPartySpecies], a
+	call GetBaseData
+	ld de, vTiles2
+	predef GetMonFrontpic
+	ret
+
+.QuestionMark:
+	ld a, BANK(sScratch)
+	call GetSRAMBank
+	farcall LoadQuestionMarkPic
+	ld hl, vTiles2
+	ld de, sScratch
+	ld c, 7 * 7
+	ld a, [hROMBank]
+	ld b, a
+	call Get2bpp
+	call CloseSRAM
+	ret
+
+
+Pokedex_LoadCurrentFootprint: ; 41478 (10:5478)
+	call Pokedex_GetSelectedMon
+
+Pokedex_LoadAnyFootprint: ; 4147b
+	ld a, [wd265]
+	dec a
+	and %11111000
+	srl a
+	srl a
+	srl a
+	ld e, 0
+	ld d, a
+	ld a, [wd265]
+	dec a
+	and %111
+	swap a ; * $10
+	ld l, a
+	ld h, 0
+	add hl, de
+	ld de, Footprints
+	add hl, de
+
+	push hl
+	ld e, l
+	ld d, h
+	ld hl, vTiles2 tile $62
+	lb bc, BANK(Footprints), 2
+	call Request1bpp
+	pop hl
+
+	; Whoever was editing footprints forgot to fix their
+	; tile editor. Now each bottom half is 8 tiles off.
+	ld de, 8 tiles
+	add hl, de
+
+	ld e, l
+	ld d, h
+	ld hl, vTiles2 tile $64
+	lb bc, BANK(Footprints), 2
+	call Request1bpp
+
+	ret
+
+
+Pokedex_LoadGFX: ; 414b7
+	call DisableLCD
+	ld hl, vTiles2
+	ld bc, $31 tiles
+	xor a
+	call ByteFill
+	call Pokedex_LoadInvertedFont
+	call LoadFontsExtra
+	ld hl, vTiles2 tile $60
+	ld bc, $20 tiles
+	call Pokedex_InvertTiles
+	call Pokedex_CheckSGB
+	jr nz, .LoadPokedexLZ
+	farcall LoadSGBPokedexGFX
+	jr .LoadPokedexSlowpokeLZ
+
+.LoadPokedexLZ:
+	ld hl, PokedexLZ
+	ld de, vTiles2 tile $31
+	call Decompress
+
+.LoadPokedexSlowpokeLZ:
+	ld hl, PokedexSlowpokeLZ
+	ld de, vTiles0
+	call Decompress
+	ld a, 6
+	call SkipMusic
+	call EnableLCD
+	ret
+
+Pokedex_LoadInvertedFont: ; 414fb
+	call LoadStandardFont
+	ld hl, vTiles1
+	ld bc, $80 tiles
+
+Pokedex_InvertTiles: ; 41504
+.loop
+	ld a, [hl]
+	xor $ff
+	ld [hli], a
+	dec bc
+	ld a, b
+	or c
+	jr nz, .loop
+	ret
+
+PokedexLZ: ; 4150e
+INCBIN "gfx/pokedex/pokedex.2bpp.lz"
+
+PokedexSlowpokeLZ: ; 416b0
+INCBIN "gfx/pokedex/slowpoke.2bpp.lz"
+
+Pokedex_CheckSGB: ; 41a24
+	ld a, [hCGB]
+	or a
+	ret nz
+	ld a, [hSGB]
+	dec a
+	ret
+
+Pokedex_LoadUnownFont: ; 41a2c
+	ld a, BANK(sScratch)
+	call GetSRAMBank
+	ld hl, UnownFont
+	ld de, sScratch + $188
+	ld bc, 39 tiles
+	ld a, BANK(UnownFont)
+	call FarCopyBytes
+	ld hl, sScratch + $188
+	ld bc, 27 tiles
+	call Pokedex_InvertTiles
+	ld de, sScratch + $188
+	ld hl, vTiles2 tile $40
+	lb bc, BANK(Pokedex_LoadUnownFont), 27
+	call Request2bpp
+	call CloseSRAM
+	ret
+
+Pokedex_LoadUnownFrontpicTiles: ; 41a58 (10:5a58)
+	ld a, [UnownLetter]
+	push af
+	ld a, [wDexCurrentUnownIndex]
+	ld e, a
+	ld d, 0
+	ld hl, UnownDex
+	add hl, de
+	ld a, [hl]
+	ld [UnownLetter], a
+	ld a, UNOWN
+	ld [CurPartySpecies], a
+	call GetBaseData
+	ld de, vTiles2 tile $00
+	predef GetMonFrontpic
+	pop af
+	ld [UnownLetter], a
+	ret
+
+_NewPokedexEntry: ; 41a7f
+	xor a
+	ld [hBGMapMode], a
+	farcall DrawDexEntryScreenRightEdge
+	call Pokedex_ResetBGMapMode
+	call DisableLCD
+	call LoadStandardFont
+	call LoadFontsExtra
+	call Pokedex_LoadGFX
+	call Pokedex_LoadAnyFootprint
+	ld a, [wd265]
+	ld [CurPartySpecies], a
+	call Pokedex_DrawDexEntryScreenBG
+	call Pokedex_DrawFootprint
+	hlcoord 0, 17
+	ld [hl], $3b
+	inc hl
+	ld bc, 19
+	ld a, " "
+	call ByteFill
+	farcall DisplayDexEntry
+	call EnableLCD
+	call WaitBGMap
+	call GetBaseData
+	ld de, vTiles2
+	predef GetMonFrontpic
+	ld a, SCGB_POKEDEX
+	call Pokedex_GetSGBLayout
+	ld a, [CurPartySpecies]
+	call PlayMonCry
+	ret
+
+
+Pokedex_SetBGMapMode3: ; 41ad7 (10:5ad7)
+	ld a, $3
+	ld [hBGMapMode], a
+	ld c, 4
+	call DelayFrames
+	ret
+
+Pokedex_SetBGMapMode4: ; 41ae1 (10:5ae1)
+	ld a, $4
+	ld [hBGMapMode], a
+	ld c, 4
+	call DelayFrames
+	ret
+
+Pokedex_SetBGMapMode_3ifDMG_4ifCGB: ; 41aeb (10:5aeb)
+	ld a, [hCGB]
+	and a
+	jr z, .DMG
+	call Pokedex_SetBGMapMode4
+.DMG:
+	call Pokedex_SetBGMapMode3
+	ret
+
+
+Pokedex_ResetBGMapMode: ; 41af7
+	xor a
+	ld [hBGMapMode], a
+	ret
--- /dev/null
+++ b/engine/pokedex/pokedex_2.asm
@@ -1,0 +1,280 @@
+AnimateDexSearchSlowpoke: ; 441cf
+	ld hl, .FrameIDs
+	ld b, 25
+.loop
+	ld a, [hli]
+
+	; Wrap around
+	cp $fe
+	jr nz, .ok
+	ld hl, .FrameIDs
+	ld a, [hli]
+.ok
+
+	ld [wDexSearchSlowpokeFrame], a
+	ld a, [hli]
+	ld c, a
+	push bc
+	push hl
+	call DoDexSearchSlowpokeFrame
+	pop hl
+	pop bc
+	call DelayFrames
+	dec b
+	jr nz, .loop
+	xor a
+	ld [wDexSearchSlowpokeFrame], a
+	call DoDexSearchSlowpokeFrame
+	ld c, 32
+	call DelayFrames
+	ret
+
+.FrameIDs: ; 441fc
+	; frame ID, duration
+	db 0, 7
+	db 1, 7
+	db 2, 7
+	db 3, 7
+	db 4, 7
+	db -2
+
+DoDexSearchSlowpokeFrame: ; 44207
+	ld a, [wDexSearchSlowpokeFrame]
+	ld hl, .SlowpokeSpriteData
+	ld de, Sprite01
+.loop
+	ld a, [hli]
+	cp -1
+	ret z
+	ld [de], a ; y
+	inc de
+	ld a, [hli]
+	ld [de], a ; x
+	inc de
+	ld a, [wDexSearchSlowpokeFrame]
+	ld b, a
+	add a
+	add b
+	add [hl]
+	inc hl
+	ld [de], a ; tile id
+	inc de
+	ld a, [hli]
+	ld [de], a ; attributes
+	inc de
+	jr .loop
+
+.SlowpokeSpriteData: ; 44228
+	dsprite 11, 0,  9, 0, $00, 0
+	dsprite 11, 0, 10, 0, $01, 0
+	dsprite 11, 0, 11, 0, $02, 0
+	dsprite 12, 0,  9, 0, $10, 0
+	dsprite 12, 0, 10, 0, $11, 0
+	dsprite 12, 0, 11, 0, $12, 0
+	dsprite 13, 0,  9, 0, $20, 0
+	dsprite 13, 0, 10, 0, $21, 0
+	dsprite 13, 0, 11, 0, $22, 0
+	db -1
+
+DisplayDexEntry: ; 4424d
+	call GetPokemonName
+	hlcoord 9, 3
+	call PlaceString ; mon species
+	ld a, [wd265]
+	ld b, a
+	call GetDexEntryPointer
+	ld a, b
+	push af
+	hlcoord 9, 5
+	call FarString ; dex species
+	ld h, b
+	ld l, c
+	push de
+; Print dex number
+	hlcoord 2, 8
+	ld a, $5c ; No
+	ld [hli], a
+	ld a, $5d ; .
+	ld [hli], a
+	ld de, wd265
+	lb bc, PRINTNUM_LEADINGZEROS | 1, 3
+	call PrintNum
+; Check to see if we caught it.  Get out of here if we haven't.
+	ld a, [wd265]
+	dec a
+	call CheckCaughtMon
+	pop hl
+	pop bc
+	ret z
+; Get the height of the Pokemon.
+	ld a, [CurPartySpecies]
+	ld [CurSpecies], a
+	inc hl
+	ld a, b
+	push af
+	push hl
+	call GetFarHalfword
+	ld d, l
+	ld e, h
+	pop hl
+	inc hl
+	inc hl
+	ld a, d
+	or e
+	jr z, .skip_height
+	push hl
+	push de
+	ld hl, sp+$0
+	ld d, h
+	ld e, l
+	hlcoord 12, 7
+	lb bc, 2, PRINTNUM_MONEY | 4
+	call PrintNum
+	hlcoord 14, 7
+	ld [hl], $5e ; ft symbol
+	pop af
+	pop hl
+
+.skip_height
+	pop af
+	push af
+	inc hl
+	push hl
+	dec hl
+	call GetFarHalfword
+	ld d, l
+	ld e, h
+	ld a, e
+	or d
+	jr z, .skip_weight
+	push de
+	ld hl, sp+$0
+	ld d, h
+	ld e, l
+	hlcoord 11, 9
+	lb bc, 2, PRINTNUM_RIGHTALIGN | 5
+	call PrintNum
+	pop de
+
+.skip_weight
+; Page 1
+	lb bc, 5, SCREEN_WIDTH - 2
+	hlcoord 2, 11
+	call ClearBox
+	hlcoord 1, 10
+	ld bc, SCREEN_WIDTH - 1
+	ld a, $61 ; horizontal divider
+	call ByteFill
+	; page number
+	hlcoord 1, 9
+	ld [hl], $55
+	inc hl
+	ld [hl], $55
+	hlcoord 1, 10
+	ld [hl], $56 ; P.
+	inc hl
+	ld [hl], $57 ; 1
+	pop de
+	inc de
+	pop af
+	hlcoord 2, 11
+	push af
+	call FarString
+	pop bc
+	ld a, [wPokedexStatus]
+	or a ; check for page 2
+	ret z
+
+; Page 2
+	push bc
+	push de
+	lb bc, 5, SCREEN_WIDTH - 2
+	hlcoord 2, 11
+	call ClearBox
+	hlcoord 1, 10
+	ld bc, SCREEN_WIDTH - 1
+	ld a, $61
+	call ByteFill
+	; page number
+	hlcoord 1, 9
+	ld [hl], $55
+	inc hl
+	ld [hl], $55
+	hlcoord 1, 10
+	ld [hl], $56 ; P.
+	inc hl
+	ld [hl], $58 ; 2
+	pop de
+	inc de
+	pop af
+	hlcoord 2, 11
+	call FarString
+	ret
+
+String_44331: ; 44331
+	db "#@"
+
+GetDexEntryPointer: ; 44333
+; return dex entry pointer b:de
+	push hl
+	ld hl, PokedexDataPointerTable
+	ld a, b
+	dec a
+	ld d, 0
+	ld e, a
+	add hl, de
+	add hl, de
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	push de
+	rlca
+	rlca
+	maskbits NUM_DEX_ENTRY_BANKS
+	ld hl, .PokedexEntryBanks
+	ld d, 0
+	ld e, a
+	add hl, de
+	ld b, [hl]
+	pop de
+	pop hl
+	ret
+
+.PokedexEntryBanks: ; 44351
+	db BANK(PokedexEntries1)
+	db BANK(PokedexEntries2)
+	db BANK(PokedexEntries3)
+	db BANK(PokedexEntries4)
+
+GetDexEntryPagePointer: ; 44355
+	call GetDexEntryPointer ; b:de
+	push hl
+	ld h, d
+	ld l, e
+; skip species name
+.loop1
+	ld a, b
+	call GetFarByte
+	inc hl
+	cp "@"
+	jr nz, .loop1
+; skip height and weight
+rept 4
+	inc hl
+endr
+; if c != 1: skip entry
+	dec c
+	jr z, .done
+; skip entry
+.loop2
+	ld a, b
+	call GetFarByte
+	inc hl
+	cp "@"
+	jr nz, .loop2
+
+.done
+	ld d, h
+	ld e, l
+	pop hl
+	ret
--- /dev/null
+++ b/engine/pokedex/pokedex_3.asm
@@ -1,0 +1,162 @@
+LoadSGBPokedexGFX: ; 1ddf1c
+	ld hl, SGBPokedexGFX_LZ
+	ld de, vTiles2 tile $31
+	call Decompress
+	ret
+
+LoadSGBPokedexGFX2: ; 1ddf26 (77:5f26)
+	ld hl, SGBPokedexGFX_LZ
+	ld de, vTiles2 tile $31
+	lb bc, BANK(SGBPokedexGFX_LZ), 58
+	call DecompressRequest2bpp
+	ret
+
+SGBPokedexGFX_LZ: ; 1ddf33
+INCBIN "gfx/pokedex/sgb.2bpp.lz"
+
+LoadQuestionMarkPic: ; 1de0d7
+	ld hl, .QuestionMarkLZ
+	ld de, sScratch
+	call Decompress
+	ret
+
+.QuestionMarkLZ: ; 1de0e1
+INCBIN "gfx/pokemon/questionmark/front.2bpp.lz"
+
+DrawPokedexListWindow: ; 1de171 (77:6171)
+	ld a, $32
+	hlcoord 0, 17
+	ld bc, 12
+	call ByteFill
+	hlcoord 0, 1
+	lb bc, 15, 11
+	call ClearBox
+	ld a, $34
+	hlcoord 0, 0
+	ld bc, 11
+	call ByteFill
+	ld a, $39
+	hlcoord 0, 16
+	ld bc, 11
+	call ByteFill
+	hlcoord 5, 0
+	ld [hl], $3f
+	hlcoord 5, 16
+	ld [hl], $40
+	ld a, [wCurrentDexMode]
+	cp DEXMODE_OLD
+	jr z, .OldMode
+; scroll bar
+	hlcoord 11, 0
+	ld [hl], $50
+	ld a, $51
+	hlcoord 11, 1
+	ld b, SCREEN_HEIGHT - 3
+	call Bank77_FillColumn
+	ld [hl], $52
+	jr .Done
+
+.OldMode:
+; no scroll bar
+	hlcoord 11, 0
+	ld [hl], $66
+	ld a, $67
+	hlcoord 11, 1
+	ld b, SCREEN_HEIGHT - 3
+	call Bank77_FillColumn
+	ld [hl], $68
+.Done:
+	ret
+
+DrawPokedexSearchResultsWindow: ; 1de1d1 (77:61d1)
+	ld a, $34
+	hlcoord 0, 0
+	ld bc, 11
+	call ByteFill
+	ld a, $39
+	hlcoord 0, 10
+	ld bc, 11
+	call ByteFill
+	hlcoord 5, 0
+	ld [hl], $3f
+	hlcoord 5, 10
+	ld [hl], $40
+	hlcoord 11, 0
+	ld [hl], $66
+	ld a, $67
+	hlcoord 11, 1
+	ld b, SCREEN_HEIGHT / 2
+	call Bank77_FillColumn
+	ld [hl], $68
+	ld a, $34
+	hlcoord 0, 11
+	ld bc, 11
+	call ByteFill
+	ld a, $39
+	hlcoord 0, 17
+	ld bc, 11
+	call ByteFill
+	hlcoord 11, 11
+	ld [hl], $66
+	ld a, $67
+	hlcoord 11, 12
+	ld b, 5
+	call Bank77_FillColumn
+	ld [hl], $68
+	hlcoord 0, 12
+	lb bc, 5, 11
+	call ClearBox
+	ld de, .esults_D
+	hlcoord 0, 12
+	call PlaceString
+	ret
+
+.esults_D ; 1de23c
+; (SEARCH R)
+	db   "ESULTS"
+	next ""
+; (### FOUN)
+	next "D!@"
+
+DrawDexEntryScreenRightEdge: ; 1de247
+	ld a, [hBGMapAddress]
+	ld l, a
+	ld a, [hBGMapAddress + 1]
+	ld h, a
+	push hl
+	inc hl
+	ld a, l
+	ld [hBGMapAddress], a
+	ld a, h
+	ld [hBGMapAddress + 1], a
+	hlcoord 19, 0
+	ld [hl], $66
+	hlcoord 19, 1
+	ld a, $67
+	ld b, 15
+	call Bank77_FillColumn
+	ld [hl], $68
+	hlcoord 19, 17
+	ld [hl], $3c
+	xor a
+	ld b, SCREEN_HEIGHT
+	hlcoord 19, 0, AttrMap
+	call Bank77_FillColumn
+	call WaitBGMap2
+	pop hl
+	ld a, l
+	ld [hBGMapAddress], a
+	ld a, h
+	ld [hBGMapAddress + 1], a
+	ret
+
+Bank77_FillColumn: ; 1de27f
+	push de
+	ld de, SCREEN_WIDTH
+.loop
+	ld [hl], a
+	add hl, de
+	dec b
+	jr nz, .loop
+	pop de
+	ret
--- /dev/null
+++ b/engine/pokedex/unown_dex.asm
@@ -1,0 +1,52 @@
+UpdateUnownDex: ; fba18
+	ld a, [UnownLetter]
+	ld c, a
+	ld b, NUM_UNOWN
+	ld hl, UnownDex
+.loop
+	ld a, [hli]
+	and a
+	jr z, .done
+	cp c
+	ret z
+	dec b
+	jr nz, .loop
+	ret
+
+.done
+	dec hl
+	ld [hl], c
+	ret
+; fba2e
+
+PrintUnownWord: ; fba2e (3e:7a2e)
+	hlcoord 4, 15
+	ld bc, 12
+	ld a, " "
+	call ByteFill
+	ld a, [wDexCurrentUnownIndex]
+	ld e, a
+	ld d, 0
+	ld hl, UnownDex
+	add hl, de
+	ld a, [hl]
+	ld e, a
+	ld d, 0
+	ld hl, UnownWords
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld e, a
+	ld d, [hl]
+	hlcoord 4, 15
+.loop
+	ld a, [de]
+	cp -1
+	ret z
+	inc de
+	ld [hli], a
+	jr .loop
+; fba5a (3e:7a5a)
+
+
+INCLUDE "data/unown_words.asm"
--- a/engine/pokedex_2.asm
+++ /dev/null
@@ -1,280 +1,0 @@
-AnimateDexSearchSlowpoke: ; 441cf
-	ld hl, .FrameIDs
-	ld b, 25
-.loop
-	ld a, [hli]
-
-	; Wrap around
-	cp $fe
-	jr nz, .ok
-	ld hl, .FrameIDs
-	ld a, [hli]
-.ok
-
-	ld [wDexSearchSlowpokeFrame], a
-	ld a, [hli]
-	ld c, a
-	push bc
-	push hl
-	call DoDexSearchSlowpokeFrame
-	pop hl
-	pop bc
-	call DelayFrames
-	dec b
-	jr nz, .loop
-	xor a
-	ld [wDexSearchSlowpokeFrame], a
-	call DoDexSearchSlowpokeFrame
-	ld c, 32
-	call DelayFrames
-	ret
-
-.FrameIDs: ; 441fc
-	; frame ID, duration
-	db 0, 7
-	db 1, 7
-	db 2, 7
-	db 3, 7
-	db 4, 7
-	db -2
-
-DoDexSearchSlowpokeFrame: ; 44207
-	ld a, [wDexSearchSlowpokeFrame]
-	ld hl, .SlowpokeSpriteData
-	ld de, Sprite01
-.loop
-	ld a, [hli]
-	cp -1
-	ret z
-	ld [de], a ; y
-	inc de
-	ld a, [hli]
-	ld [de], a ; x
-	inc de
-	ld a, [wDexSearchSlowpokeFrame]
-	ld b, a
-	add a
-	add b
-	add [hl]
-	inc hl
-	ld [de], a ; tile id
-	inc de
-	ld a, [hli]
-	ld [de], a ; attributes
-	inc de
-	jr .loop
-
-.SlowpokeSpriteData: ; 44228
-	dsprite 11, 0,  9, 0, $00, 0
-	dsprite 11, 0, 10, 0, $01, 0
-	dsprite 11, 0, 11, 0, $02, 0
-	dsprite 12, 0,  9, 0, $10, 0
-	dsprite 12, 0, 10, 0, $11, 0
-	dsprite 12, 0, 11, 0, $12, 0
-	dsprite 13, 0,  9, 0, $20, 0
-	dsprite 13, 0, 10, 0, $21, 0
-	dsprite 13, 0, 11, 0, $22, 0
-	db -1
-
-DisplayDexEntry: ; 4424d
-	call GetPokemonName
-	hlcoord 9, 3
-	call PlaceString ; mon species
-	ld a, [wd265]
-	ld b, a
-	call GetDexEntryPointer
-	ld a, b
-	push af
-	hlcoord 9, 5
-	call FarString ; dex species
-	ld h, b
-	ld l, c
-	push de
-; Print dex number
-	hlcoord 2, 8
-	ld a, $5c ; No
-	ld [hli], a
-	ld a, $5d ; .
-	ld [hli], a
-	ld de, wd265
-	lb bc, PRINTNUM_LEADINGZEROS | 1, 3
-	call PrintNum
-; Check to see if we caught it.  Get out of here if we haven't.
-	ld a, [wd265]
-	dec a
-	call CheckCaughtMon
-	pop hl
-	pop bc
-	ret z
-; Get the height of the Pokemon.
-	ld a, [CurPartySpecies]
-	ld [CurSpecies], a
-	inc hl
-	ld a, b
-	push af
-	push hl
-	call GetFarHalfword
-	ld d, l
-	ld e, h
-	pop hl
-	inc hl
-	inc hl
-	ld a, d
-	or e
-	jr z, .skip_height
-	push hl
-	push de
-	ld hl, sp+$0
-	ld d, h
-	ld e, l
-	hlcoord 12, 7
-	lb bc, 2, PRINTNUM_MONEY | 4
-	call PrintNum
-	hlcoord 14, 7
-	ld [hl], $5e ; ft symbol
-	pop af
-	pop hl
-
-.skip_height
-	pop af
-	push af
-	inc hl
-	push hl
-	dec hl
-	call GetFarHalfword
-	ld d, l
-	ld e, h
-	ld a, e
-	or d
-	jr z, .skip_weight
-	push de
-	ld hl, sp+$0
-	ld d, h
-	ld e, l
-	hlcoord 11, 9
-	lb bc, 2, PRINTNUM_RIGHTALIGN | 5
-	call PrintNum
-	pop de
-
-.skip_weight
-; Page 1
-	lb bc, 5, SCREEN_WIDTH - 2
-	hlcoord 2, 11
-	call ClearBox
-	hlcoord 1, 10
-	ld bc, SCREEN_WIDTH - 1
-	ld a, $61 ; horizontal divider
-	call ByteFill
-	; page number
-	hlcoord 1, 9
-	ld [hl], $55
-	inc hl
-	ld [hl], $55
-	hlcoord 1, 10
-	ld [hl], $56 ; P.
-	inc hl
-	ld [hl], $57 ; 1
-	pop de
-	inc de
-	pop af
-	hlcoord 2, 11
-	push af
-	call FarString
-	pop bc
-	ld a, [wPokedexStatus]
-	or a ; check for page 2
-	ret z
-
-; Page 2
-	push bc
-	push de
-	lb bc, 5, SCREEN_WIDTH - 2
-	hlcoord 2, 11
-	call ClearBox
-	hlcoord 1, 10
-	ld bc, SCREEN_WIDTH - 1
-	ld a, $61
-	call ByteFill
-	; page number
-	hlcoord 1, 9
-	ld [hl], $55
-	inc hl
-	ld [hl], $55
-	hlcoord 1, 10
-	ld [hl], $56 ; P.
-	inc hl
-	ld [hl], $58 ; 2
-	pop de
-	inc de
-	pop af
-	hlcoord 2, 11
-	call FarString
-	ret
-
-String_44331: ; 44331
-	db "#@"
-
-GetDexEntryPointer: ; 44333
-; return dex entry pointer b:de
-	push hl
-	ld hl, PokedexDataPointerTable
-	ld a, b
-	dec a
-	ld d, 0
-	ld e, a
-	add hl, de
-	add hl, de
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-	push de
-	rlca
-	rlca
-	maskbits NUM_DEX_ENTRY_BANKS
-	ld hl, .PokedexEntryBanks
-	ld d, 0
-	ld e, a
-	add hl, de
-	ld b, [hl]
-	pop de
-	pop hl
-	ret
-
-.PokedexEntryBanks: ; 44351
-	db BANK(PokedexEntries1)
-	db BANK(PokedexEntries2)
-	db BANK(PokedexEntries3)
-	db BANK(PokedexEntries4)
-
-GetDexEntryPagePointer: ; 44355
-	call GetDexEntryPointer ; b:de
-	push hl
-	ld h, d
-	ld l, e
-; skip species name
-.loop1
-	ld a, b
-	call GetFarByte
-	inc hl
-	cp "@"
-	jr nz, .loop1
-; skip height and weight
-rept 4
-	inc hl
-endr
-; if c != 1: skip entry
-	dec c
-	jr z, .done
-; skip entry
-.loop2
-	ld a, b
-	call GetFarByte
-	inc hl
-	cp "@"
-	jr nz, .loop2
-
-.done
-	ld d, h
-	ld e, l
-	pop hl
-	ret
--- a/engine/pokedex_3.asm
+++ /dev/null
@@ -1,162 +1,0 @@
-LoadSGBPokedexGFX: ; 1ddf1c
-	ld hl, SGBPokedexGFX_LZ
-	ld de, vTiles2 tile $31
-	call Decompress
-	ret
-
-LoadSGBPokedexGFX2: ; 1ddf26 (77:5f26)
-	ld hl, SGBPokedexGFX_LZ
-	ld de, vTiles2 tile $31
-	lb bc, BANK(SGBPokedexGFX_LZ), 58
-	call DecompressRequest2bpp
-	ret
-
-SGBPokedexGFX_LZ: ; 1ddf33
-INCBIN "gfx/pokedex/sgb.2bpp.lz"
-
-LoadQuestionMarkPic: ; 1de0d7
-	ld hl, .QuestionMarkLZ
-	ld de, sScratch
-	call Decompress
-	ret
-
-.QuestionMarkLZ: ; 1de0e1
-INCBIN "gfx/pokemon/questionmark/front.2bpp.lz"
-
-DrawPokedexListWindow: ; 1de171 (77:6171)
-	ld a, $32
-	hlcoord 0, 17
-	ld bc, 12
-	call ByteFill
-	hlcoord 0, 1
-	lb bc, 15, 11
-	call ClearBox
-	ld a, $34
-	hlcoord 0, 0
-	ld bc, 11
-	call ByteFill
-	ld a, $39
-	hlcoord 0, 16
-	ld bc, 11
-	call ByteFill
-	hlcoord 5, 0
-	ld [hl], $3f
-	hlcoord 5, 16
-	ld [hl], $40
-	ld a, [wCurrentDexMode]
-	cp DEXMODE_OLD
-	jr z, .OldMode
-; scroll bar
-	hlcoord 11, 0
-	ld [hl], $50
-	ld a, $51
-	hlcoord 11, 1
-	ld b, SCREEN_HEIGHT - 3
-	call Bank77_FillColumn
-	ld [hl], $52
-	jr .Done
-
-.OldMode:
-; no scroll bar
-	hlcoord 11, 0
-	ld [hl], $66
-	ld a, $67
-	hlcoord 11, 1
-	ld b, SCREEN_HEIGHT - 3
-	call Bank77_FillColumn
-	ld [hl], $68
-.Done:
-	ret
-
-DrawPokedexSearchResultsWindow: ; 1de1d1 (77:61d1)
-	ld a, $34
-	hlcoord 0, 0
-	ld bc, 11
-	call ByteFill
-	ld a, $39
-	hlcoord 0, 10
-	ld bc, 11
-	call ByteFill
-	hlcoord 5, 0
-	ld [hl], $3f
-	hlcoord 5, 10
-	ld [hl], $40
-	hlcoord 11, 0
-	ld [hl], $66
-	ld a, $67
-	hlcoord 11, 1
-	ld b, SCREEN_HEIGHT / 2
-	call Bank77_FillColumn
-	ld [hl], $68
-	ld a, $34
-	hlcoord 0, 11
-	ld bc, 11
-	call ByteFill
-	ld a, $39
-	hlcoord 0, 17
-	ld bc, 11
-	call ByteFill
-	hlcoord 11, 11
-	ld [hl], $66
-	ld a, $67
-	hlcoord 11, 12
-	ld b, 5
-	call Bank77_FillColumn
-	ld [hl], $68
-	hlcoord 0, 12
-	lb bc, 5, 11
-	call ClearBox
-	ld de, .esults_D
-	hlcoord 0, 12
-	call PlaceString
-	ret
-
-.esults_D ; 1de23c
-; (SEARCH R)
-	db   "ESULTS"
-	next ""
-; (### FOUN)
-	next "D!@"
-
-DrawDexEntryScreenRightEdge: ; 1de247
-	ld a, [hBGMapAddress]
-	ld l, a
-	ld a, [hBGMapAddress + 1]
-	ld h, a
-	push hl
-	inc hl
-	ld a, l
-	ld [hBGMapAddress], a
-	ld a, h
-	ld [hBGMapAddress + 1], a
-	hlcoord 19, 0
-	ld [hl], $66
-	hlcoord 19, 1
-	ld a, $67
-	ld b, 15
-	call Bank77_FillColumn
-	ld [hl], $68
-	hlcoord 19, 17
-	ld [hl], $3c
-	xor a
-	ld b, SCREEN_HEIGHT
-	hlcoord 19, 0, AttrMap
-	call Bank77_FillColumn
-	call WaitBGMap2
-	pop hl
-	ld a, l
-	ld [hBGMapAddress], a
-	ld a, h
-	ld [hBGMapAddress + 1], a
-	ret
-
-Bank77_FillColumn: ; 1de27f
-	push de
-	ld de, SCREEN_WIDTH
-.loop
-	ld [hl], a
-	add hl, de
-	dec b
-	jr nz, .loop
-	pop de
-	ret
--- a/engine/routines/newpokedexentry.asm
+++ /dev/null
@@ -1,52 +1,0 @@
-NewPokedexEntry: ; fb877
-	ld a, [hMapAnims]
-	push af
-	xor a
-	ld [hMapAnims], a
-	call LowVolume
-	call ClearBGPalettes
-	call ClearTileMap
-	call UpdateSprites
-	call ClearSprites
-	ld a, [wPokedexStatus]
-	push af
-	ld a, [hSCX]
-	add POKEDEX_SCX
-	ld [hSCX], a
-	xor a
-	ld [wPokedexStatus], a
-	farcall _NewPokedexEntry
-	call WaitPressAorB_BlinkCursor
-	ld a, 1 ; page 2
-	ld [wPokedexStatus], a
-	farcall DisplayDexEntry
-	call WaitPressAorB_BlinkCursor
-	pop af
-	ld [wPokedexStatus], a
-	call MaxVolume
-	call RotateThreePalettesRight
-	ld a, [hSCX]
-	add -POKEDEX_SCX
-	ld [hSCX], a
-	call .ReturnFromDexRegistration
-	pop af
-	ld [hMapAnims], a
-	ret
-; fb8c8
-
-.ReturnFromDexRegistration: ; fb8c8
-	call ClearTileMap
-	call LoadFontsExtra
-	call LoadStandardFont
-	farcall Pokedex_PlaceFrontpicTopLeftCorner
-	call WaitBGMap2
-	farcall GetEnemyMonDVs
-	ld a, [hli]
-	ld [TempMonDVs], a
-	ld a, [hl]
-	ld [TempMonDVs + 1], a
-	ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
-	call GetSGBLayout
-	call SetPalettes
-	ret
-; fb8f1
--- a/engine/unown_dex.asm
+++ /dev/null
@@ -1,52 +1,0 @@
-UpdateUnownDex: ; fba18
-	ld a, [UnownLetter]
-	ld c, a
-	ld b, NUM_UNOWN
-	ld hl, UnownDex
-.loop
-	ld a, [hli]
-	and a
-	jr z, .done
-	cp c
-	ret z
-	dec b
-	jr nz, .loop
-	ret
-
-.done
-	dec hl
-	ld [hl], c
-	ret
-; fba2e
-
-PrintUnownWord: ; fba2e (3e:7a2e)
-	hlcoord 4, 15
-	ld bc, 12
-	ld a, " "
-	call ByteFill
-	ld a, [wDexCurrentUnownIndex]
-	ld e, a
-	ld d, 0
-	ld hl, UnownDex
-	add hl, de
-	ld a, [hl]
-	ld e, a
-	ld d, 0
-	ld hl, UnownWords
-	add hl, de
-	add hl, de
-	ld a, [hli]
-	ld e, a
-	ld d, [hl]
-	hlcoord 4, 15
-.loop
-	ld a, [de]
-	cp -1
-	ret z
-	inc de
-	ld [hli], a
-	jr .loop
-; fba5a (3e:7a5a)
-
-
-INCLUDE "data/unown_words.asm"
--- a/main.asm
+++ b/main.asm
@@ -175,7 +175,7 @@
 
 SECTION "bank10", ROMX
 
-INCLUDE "engine/pokedex.asm"
+INCLUDE "engine/pokedex/pokedex.asm"
 INCLUDE "data/moves/moves.asm"
 INCLUDE "engine/evolve.asm"
 
@@ -184,7 +184,7 @@
 
 INCLUDE "engine/events/fruit_trees.asm"
 INCLUDE "engine/battle/ai/move.asm"
-INCLUDE "engine/pokedex_2.asm"
+INCLUDE "engine/pokedex/pokedex_2.asm"
 INCLUDE "data/pokemon/dex_entry_pointers.asm"
 INCLUDE "engine/mail.asm"
 
@@ -451,9 +451,9 @@
 INCLUDE "engine/time_capsule.asm"
 INCLUDE "engine/events/name_rater.asm"
 INCLUDE "engine/routines/playslowcry.asm"
-INCLUDE "engine/routines/newpokedexentry.asm"
+INCLUDE "engine/pokedex/newpokedexentry.asm"
 INCLUDE "engine/time_capsule_2.asm"
-INCLUDE "engine/unown_dex.asm"
+INCLUDE "engine/pokedex/unown_dex.asm"
 INCLUDE "engine/events/magikarp.asm"
 INCLUDE "engine/battle/hidden_power.asm"
 INCLUDE "engine/battle/misc.asm"
@@ -584,7 +584,7 @@
 
 INCLUDE "engine/routines/printhoursmins.asm"
 INCLUDE "engine/diploma.asm"
-INCLUDE "engine/pokedex_3.asm"
+INCLUDE "engine/pokedex/pokedex_3.asm"
 INCLUDE "engine/events/catch_tutorial_input.asm"
 INCLUDE "engine/routines/townmap_convertlinebreakcharacters.asm"