shithub: pokecrystal

Download patch

ref: ba871547eda6e17e988f4e1dfa7b899050205d5e
parent: 435b0cf686e55bbe60acbce1e6154b0c2450bbac
author: PikalaxALT <PikalaxALT@gmail.com>
date: Mon Nov 16 16:07:26 EST 2015

engine/pokegear.asm

--- /dev/null
+++ b/engine/pokegear.asm
@@ -1,0 +1,2989 @@
+PokeGear: ; 90b8d (24:4b8d)
+	ld hl, Options
+	ld a, [hl]
+	push af
+	set NO_TEXT_SCROLL, [hl]
+
+	ld a, [hInMenu]
+	push af
+	ld a, $1
+	ld [hInMenu], a
+
+	ld a, [VramState]
+	push af
+	xor a
+	ld [VramState], a
+
+	call Function90bea
+	call DelayFrame
+
+.loop
+	call UpdateTime
+	call JoyTextDelay
+	ld a, [wJumptableIndex]
+	bit 7, a
+	jr nz, .done
+	call Function90f04
+	callba Function8cf69
+	call DelayFrame
+	jr .loop
+
+.done
+	ld de, SFX_READ_TEXT_2
+	call PlaySFX
+	call WaitSFX
+	pop af
+	ld [VramState], a
+	pop af
+	ld [hInMenu], a
+	pop af
+	ld [Options], a
+	call ClearBGPalettes
+	xor a
+	ld [hBGMapAddress], a
+	ld a, VBGMap0 / $100
+	ld [hBGMapAddress + 1], a
+	ld a, $90
+	ld [hWY], a
+	call Function91492
+	ret
+
+Function90bea: ; 90bea (24:4bea)
+	call ClearBGPalettes
+	call ClearTileMap
+	call ClearSprites
+	call DisableLCD
+	xor a
+	ld [hSCY], a
+	ld [hSCX], a
+	ld a, $7
+	ld [hWX], a
+	call Function90c4e
+	callba Function8cf53
+	call Function90d32
+	ld a, 8
+	call SkipMusic
+	ld a, $e3
+	ld [rLCDC], a
+	call Function90d70
+	xor a
+	ld [wJumptableIndex], a
+	ld [wcf64], a
+	ld [wcf65], a
+	ld [wcf66], a
+	ld [wc6d2], a
+	ld [wc6d1], a
+	ld [wc6d3], a
+	ld [wc6d9], a
+	ld [wc6da], a
+	ld [wc6db], a
+	call Function90d9e
+	call Function90da8
+	ld b, SCGB_02
+	call GetSGBLayout
+	call SetPalettes
+	ld a, [hCGB]
+	and a
+	ret z
+	ld a, $e4
+	call Functioncf8
+	ret
+
+Function90c4e: ; 90c4e
+	call ClearVBank1
+	ld hl, TownMapGFX
+	ld de, VTiles2
+	ld a, BANK(TownMapGFX)
+	call FarDecompress
+
+	ld hl, PokegearGFX
+	ld de, VTiles2 + $30 tiles
+	ld a, BANK(PokegearGFX)
+	call FarDecompress
+
+	ld hl, PokegearSpritesGFX
+	ld de, VTiles0
+	ld a, BANK(PokegearSpritesGFX)
+	call Decompress
+
+	ld a, [MapGroup]
+	ld b, a
+	ld a, [MapNumber]
+	ld c, a
+	call GetWorldMapLocation
+	cp FAST_SHIP
+	jr z, .ssaqua
+
+	callba GetPlayerIcon
+
+	push de
+	ld h, d
+	ld l, e
+	ld a, b
+
+	push af
+	ld de, VTiles0 tile $10
+	ld bc, 4 tiles
+	call FarCopyBytes
+	pop af
+
+	pop hl
+
+	ld de, $c0
+	add hl, de
+	ld de, VTiles0 tile $14
+	ld bc, 4 tiles
+	call FarCopyBytes
+	ret
+
+.ssaqua
+	ld hl, FastShipGFX
+	ld de, VTiles0 tile $10
+	ld bc, 8 tiles
+	call CopyBytes
+	ret
+; 90cb2
+
+FastShipGFX: ; 90cb2
+INCBIN "gfx/misc/fast_ship.2bpp"
+; 90d32
+
+Function90d32: ; 90d32 (24:4d32)
+	lb de, $24, $10
+	ld a, SPRITE_ANIM_INDEX_0D
+	call _InitSpriteAnimStruct
+	ld hl, $3
+	add hl, bc
+	ld [hl], $0
+	ret
+
+Function90d41: ; 90d41 (24:4d41)
+	ld hl, wcf64
+	ld e, [hl]
+	ld d, 0
+	ld hl, Unknown_90d52
+	add hl, de
+	ld a, [hl]
+	ld hl, $6
+	add hl, bc
+	ld [hl], a
+	ret
+; 90d52 (24:4d52)
+
+Unknown_90d52: ; 90d52
+	db $00, $10, $20, $30
+; 90d56
+
+Function90d56: ; 90d56
+	ld a, [MapGroup]
+	ld b, a
+	ld a, [MapNumber]
+	ld c, a
+	call GetWorldMapLocation
+	cp SPECIAL_MAP
+	ret nz
+	ld a, [BackupMapGroup]
+	ld b, a
+	ld a, [BackupMapNumber]
+	ld c, a
+	call GetWorldMapLocation
+	ret
+; 90d70
+
+
+Function90d70: ; 90d70 (24:4d70)
+	ld a, [MapGroup]
+	ld b, a
+	ld a, [MapNumber]
+	ld c, a
+	call GetWorldMapLocation
+
+	cp FAST_SHIP
+	jr z, .asm_90d95
+
+	cp SPECIAL_MAP
+	jr nz, .asm_90d8e
+
+	ld a, [BackupMapGroup]
+	ld b, a
+	ld a, [BackupMapNumber]
+	ld c, a
+	call GetWorldMapLocation
+
+.asm_90d8e
+	ld [wc6d8], a
+	ld [wc6d7], a
+	ret
+
+.asm_90d95
+	ld [wc6d8], a
+	ld a, NEW_BARK_TOWN
+	ld [wc6d7], a
+	ret
+
+Function90d9e: ; 90d9e (24:4d9e)
+	ld a, $0
+	ld [wJumptableIndex], a
+	xor a
+	ld [wcf64], a
+	ret
+
+Function90da8: ; 90da8 (24:4da8)
+	xor a
+	ld [hBGMapMode], a
+	hlcoord 0, 0
+	ld bc, TileMapEnd - TileMap
+	ld a, $4f
+	call ByteFill
+	ld a, [wcf64]
+	and $3
+	add a
+	ld e, a
+	ld d, 0
+	ld hl, Jumptable_90e12
+	add hl, de
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld de, .asm_90dcb
+	push de
+	jp [hl]
+
+.asm_90dcb
+	call Function90eb0
+	callba TownMapPals
+	ld a, [wcf65]
+	and a
+	jr nz, .asm_90de8
+
+	xor a
+	ld [hBGMapAddress], a
+	ld a, VBGMap0 / $100
+	ld [hBGMapAddress + 1], a
+	call Function90e00
+	ld a, $90
+	jr .asm_90df3
+
+.asm_90de8
+	xor a
+	ld [hBGMapAddress], a
+	ld a, VBGMap1 / $100
+	ld [hBGMapAddress + 1], a
+	call Function90e00
+	xor a
+
+.asm_90df3
+	ld [hWY], a
+	ld a, [wcf65]
+	and 1
+	xor 1
+	ld [wcf65], a
+	ret
+
+Function90e00: ; 90e00 (24:4e00)
+	ld a, [hCGB]
+	and a
+	jr z, .asm_90e0e
+	ld a, $2
+	ld [hBGMapMode], a
+	ld c, 3
+	call DelayFrames
+.asm_90e0e
+	call WaitBGMap
+	ret
+; 90e12 (24:4e12)
+
+Jumptable_90e12: ; 90e12
+	dw Function90e1a
+	dw Function90e3f
+	dw Function90e82
+	dw Function90e72
+; 90e1a
+
+Function90e1a: ; 90e1a
+	ld de, ClockTilemapRLE
+	call Function914bb
+	hlcoord 12, 1
+	ld de, .switch
+	call PlaceString
+	hlcoord 0, 12
+	lb bc, 4, 18
+	call TextBox
+	call Function90f86
+	ret
+; 90e36 (24:4e36)
+
+.switch
+	db " SWITCH▶@"
+; 90e3f
+
+Function90e3f: ; 90e3f
+
+	ld a, [wc6d8]
+	cp FAST_SHIP
+	jr z, .johto
+	cp KANTO_LANDMARK
+	jr nc, .kanto
+.johto
+	ld e, 0
+	jr .ok
+.kanto
+	ld e, 1
+.ok
+	callba Function91ae1
+	ld a, $7
+	ld bc, $12
+	hlcoord 1, 2
+	call ByteFill
+	hlcoord 0, 2
+	ld [hl], $6
+	hlcoord 19, 2
+	ld [hl], $17
+	ld a, [wc6d7]
+	call Function910b4
+	ret
+; 90e72
+
+Function90e72: ; 90e72
+	ld de, RadioTilemapRLE
+	call Function914bb
+	hlcoord 0, 12
+	lb bc, 4, 18
+	call TextBox
+	ret
+; 90e82
+
+Function90e82: ; 90e82
+	ld de, PhoneTilemapRLE
+	call Function914bb
+	hlcoord 0, 12
+	lb bc, 4, 18
+	call TextBox
+	call Function90e98
+	call Function912d8
+	ret
+; 90e98
+
+Function90e98: ; 90e98 (24:4e98)
+	hlcoord 17, 1
+	ld a, $3c
+	ld [hli], a
+	inc a
+	ld [hl], a
+	hlcoord 17, 2
+	inc a
+	ld [hli], a
+	call GetMapHeaderPhoneServiceNybble
+	and a
+	ret nz
+	hlcoord 18, 2
+	ld [hl], $3f
+	ret
+
+Function90eb0: ; 90eb0 (24:4eb0)
+	hlcoord 0, 0
+	ld bc, $8
+	ld a, $4f
+	call ByteFill
+	hlcoord 0, 1
+	ld bc, $8
+	ld a, $4f
+	call ByteFill
+	ld de, wPokegearFlags
+	ld a, [de]
+	bit 0, a
+	call nz, Function90ee4
+	ld a, [de]
+	bit 2, a
+	call nz, Function90eeb
+	ld a, [de]
+	bit 1, a
+	call nz, Function90ef2
+	hlcoord 0, 0
+	ld a, $46
+	call Function90ef7
+	ret
+
+Function90ee4: ; 90ee4 (24:4ee4)
+	hlcoord 2, 0
+	ld a, $40
+	jr Function90ef7
+
+Function90eeb: ; 90eeb (24:4eeb)
+	hlcoord 4, 0
+	ld a, $44
+	jr Function90ef7
+
+Function90ef2: ; 90ef2 (24:4ef2)
+	hlcoord 6, 0
+	ld a, $42
+
+Function90ef7: ; 90ef7 (24:4ef7)
+	ld [hli], a
+	inc a
+	ld [hld], a
+	ld bc, $14
+	add hl, bc
+	add $f
+	ld [hli], a
+	inc a
+	ld [hld], a
+	ret
+
+Function90f04: ; 90f04 (24:4f04)
+	ld a, [wJumptableIndex]
+	ld e, a
+	ld d, 0
+	ld hl, Jumptable_90f13
+rept 2
+	add hl, de
+endr
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp [hl]
+
+Jumptable_90f13: ; 90f13 (24:4f13)
+	dw Function90f2d
+	dw Function90f3e
+	dw Function90fb4
+	dw Function90fcd
+	dw Function90fee
+	dw Function90fcd
+	dw Function90fe9
+	dw Function91156
+	dw Function91171
+	dw Function911eb
+	dw Function91256
+	dw Function910f9
+	dw Function91112
+
+
+Function90f2d: ; 90f2d (24:4f2d)
+	call Function90da8
+	ld hl, UnknownText_0x914d3
+	call PrintText
+	ld hl, wJumptableIndex
+	inc [hl]
+	call Function91492
+	ret
+
+Function90f3e: ; 90f3e (24:4f3e)
+	call Function90f7b
+	ld hl, hJoyLast
+
+	ld a, [hl]
+	and A_BUTTON + B_BUTTON + START + SELECT
+	jr nz, .asm_90f75
+
+	ld a, [hl]
+	and D_RIGHT
+	ret z
+
+	ld a, [wPokegearFlags]
+	bit 0, a
+	jr z, .asm_90f5a
+	ld c, $2
+	ld b, $1
+	jr .asm_90f71
+.asm_90f5a
+
+	ld a, [wPokegearFlags]
+	bit 2, a
+	jr z, .asm_90f67
+	ld c, $7
+	ld b, $2
+	jr .asm_90f71
+.asm_90f67
+
+	ld a, [wPokegearFlags]
+	bit 1, a
+	ret z
+
+	ld c, $b
+	ld b, $3
+
+.asm_90f71
+	call Function91480
+	ret
+
+.asm_90f75
+	ld hl, wJumptableIndex
+	set 7, [hl]
+	ret
+
+Function90f7b: ; 90f7b (24:4f7b)
+	xor a
+	ld [hBGMapMode], a
+	call Function90f86
+	ld a, $1
+	ld [hBGMapMode], a
+	ret
+
+Function90f86: ; 90f86 (24:4f86)
+	hlcoord 3, 5
+	lb bc, 5, 14
+	call ClearBox
+	ld a, [hHours]
+	ld b, a
+	ld a, [hMinutes]
+	ld c, a
+	decoord 6, 8
+	callba PrintHoursMins
+	ld hl, UnknownText_0x90faf
+	bccoord 6, 6
+	call PlaceWholeStringInBoxAtOnce
+	ret
+; 90fa8 (24:4fa8)
+
+String_90fa8: db "ごぜん@"
+String_90fac: db "ごご@"
+
+UnknownText_0x90faf: ; 0x90faf
+	text_jump UnknownText_0x1c5821
+	db "@"
+; 0x90fb4
+
+Function90fb4: ; 90fb4 (24:4fb4)
+	ld a, [wc6d8]
+	cp FAST_SHIP
+	jr z, .johto
+	cp KANTO_LANDMARK
+	jr nc, .kanto
+.johto
+	ld a, 3
+	jr .done
+
+	ret
+
+.kanto
+	ld a, 5
+.done
+	ld [wJumptableIndex], a
+	call Function91492
+	ret
+
+Function90fcd: ; 90fcd (24:4fcd)
+	call Function90da8
+	ld a, [wc6d8]
+	call Function9106a
+	ld a, [wc6d7]
+	call Function91098
+	ld a, c
+	ld [wc6d5], a
+	ld a, b
+	ld [wc6d6], a
+	ld hl, wJumptableIndex
+	inc [hl]
+	ret
+
+Function90fe9: ; 90fe9 (24:4fe9)
+	call Function910e8
+	jr Function90ff2
+
+Function90fee: ; 90fee (24:4fee)
+	ld d, $2e
+	ld e, $1
+Function90ff2: ; 90ff2 (24:4ff2)
+	ld hl, hJoyLast
+	ld a, [hl]
+	and B_BUTTON
+	jr nz, .cancel
+	ld a, [hl]
+	and D_RIGHT
+	jr nz, .right
+	ld a, [hl]
+	and D_LEFT
+	jr nz, .left
+	call Function9102f
+	ret
+
+.right
+	ld a, [wPokegearFlags]
+	bit 2, a
+	jr z, .asm_91015
+	ld c, $7
+	ld b, $2
+	jr .done
+
+.asm_91015
+	ld a, [wPokegearFlags]
+	bit 1, a
+	ret z
+	ld c, $b
+	ld b, $3
+	jr .done
+
+.left
+	ld c, $0
+	ld b, $0
+.done
+	call Function91480
+	ret
+.cancel
+	ld hl, wJumptableIndex
+	set 7, [hl]
+	ret
+
+Function9102f: ; 9102f (24:502f)
+	ld hl, hJoyLast
+	ld a, [hl]
+	and D_UP
+	jr nz, .up
+	ld a, [hl]
+	and D_DOWN
+	jr nz, .down
+	ret
+.up
+	ld hl, wc6d7
+	ld a, [hl]
+	cp d
+	jr c, .asm_91047
+	ld a, e
+	dec a
+	ld [hl], a
+.asm_91047
+	inc [hl]
+	jr .done
+
+.down
+	ld hl, wc6d7
+	ld a, [hl]
+	cp e
+	jr nz, .asm_91054
+	ld a, d
+	inc a
+	ld [hl], a
+.asm_91054
+	dec [hl]
+
+.done
+	ld a, [wc6d7]
+	call Function910b4
+	ld a, [wc6d5]
+	ld c, a
+	ld a, [wc6d6]
+	ld b, a
+	ld a, [wc6d7]
+	call Function910d4
+	ret
+
+Function9106a: ; 9106a
+	push af
+	ld de, 0
+	ld b, SPRITE_ANIM_INDEX_0A
+	ld a, [PlayerGender]
+	bit 0, a
+	jr z, .asm_91079
+	ld b, SPRITE_ANIM_INDEX_1E
+
+.asm_91079
+	ld a, b
+	call _InitSpriteAnimStruct
+	ld hl, $3
+	add hl, bc
+	ld [hl], $10
+	pop af
+	ld e, a
+	push bc
+	callba GetLandmarkCoords
+	pop bc
+	ld hl, $4
+	add hl, bc
+	ld [hl], e
+	ld hl, $5
+	add hl, bc
+	ld [hl], d
+	ret
+; 91098
+
+Function91098: ; 91098
+	push af
+	ld de, 0
+	ld a, SPRITE_ANIM_INDEX_0D
+	call _InitSpriteAnimStruct
+	ld hl, $3
+	add hl, bc
+	ld [hl], $4
+	ld hl, $2
+	add hl, bc
+	ld [hl], $0
+	pop af
+	push bc
+	call Function910d4
+	pop bc
+	ret
+; 910b4
+
+Function910b4: ; 910b4
+	push af
+	hlcoord 8, 0
+	lb bc, 2, 12
+	call ClearBox
+	pop af
+	ld e, a
+	push de
+	callba GetLandmarkName
+	pop de
+	callba Function1de2c5
+	hlcoord 8, 0
+	ld [hl], $34
+	ret
+; 910d4
+
+Function910d4: ; 910d4
+	push bc
+	ld e, a
+	callba GetLandmarkCoords
+	pop bc
+	ld hl, $4
+	add hl, bc
+	ld [hl], e
+	ld hl, $5
+	add hl, bc
+	ld [hl], d
+	ret
+; 910e8
+
+Function910e8: ; 910e8
+	ld a, [StatusFlags]
+	bit 6, a
+	jr z, .asm_910f4
+	ld d, $5e
+	ld e, $2f
+	ret
+
+.asm_910f4
+	ld d, $5e
+	ld e, $58
+	ret
+; 910f9
+
+
+Function910f9: ; 910f9 (24:50f9)
+	call Function90da8
+	lb de, $24, $54
+	ld a, SPRITE_ANIM_INDEX_14
+	call _InitSpriteAnimStruct
+	ld hl, $3
+	add hl, bc
+	ld [hl], $8
+	call _UpdateRadioStation
+	ld hl, wJumptableIndex
+	inc [hl]
+	ret
+
+Function91112: ; 91112 (24:5112)
+	ld hl, hJoyLast
+	ld a, [hl]
+	and B_BUTTON
+	jr nz, .cancel
+	ld a, [hl]
+	and D_LEFT
+	jr nz, .left
+	ld a, [wc6da]
+	ld l, a
+	ld a, [wc6db]
+	ld h, a
+	ld a, [wc6d9]
+	and a
+	ret z
+	rst FarCall
+	ret
+
+.left
+	ld a, [wPokegearFlags]
+	bit 2, a
+	jr z, .asm_9113b
+	ld c, $7
+	ld b, $2
+	jr .asm_9114c
+
+.asm_9113b
+	ld a, [wPokegearFlags]
+	bit 0, a
+	jr z, .asm_91148
+	ld c, $2
+	ld b, $1
+	jr .asm_9114c
+
+.asm_91148
+	ld c, $0
+	ld b, $0
+.asm_9114c
+	call Function91480
+	ret
+
+.cancel
+	ld hl, wJumptableIndex
+	set 7, [hl]
+	ret
+
+Function91156: ; 91156 (24:5156)
+	ld hl, wJumptableIndex
+	inc [hl]
+	xor a
+	ld [wc6d2], a
+	ld [wc6d1], a
+	ld [wc6d3], a
+	call Function90da8
+	call Function91492
+	ld hl, UnknownText_0x914ce
+	call PrintText
+	ret
+
+Function91171: ; 91171 (24:5171)
+	ld hl, hJoyPressed
+	ld a, [hl]
+	and B_BUTTON
+	jr nz, .b
+	ld a, [hl]
+	and A_BUTTON
+	jr nz, .a
+	ld hl, hJoyLast
+	ld a, [hl]
+	and D_LEFT
+	jr nz, .left
+	ld a, [hl]
+	and D_RIGHT
+	jr nz, .right
+	call Function9126d
+	ret
+
+.left
+	ld a, [wPokegearFlags]
+	bit 0, a
+	jr z, .asm_9119c
+	ld c, $2
+	ld b, $1
+	jr .asm_911ac
+.asm_9119c
+	ld c, $0
+	ld b, $0
+	jr .asm_911ac
+
+.right
+	ld a, [wPokegearFlags]
+	bit 1, a
+	ret z
+	ld c, $b
+	ld b, $3
+.asm_911ac
+	call Function91480
+	ret
+
+.b
+	ld hl, wJumptableIndex
+	set 7, [hl]
+	ret
+
+.a
+	ld hl, wPhoneList
+	ld a, [wc6d2]
+	ld e, a
+	ld d, 0
+	add hl, de
+	ld a, [wc6d1]
+	ld e, a
+	ld d, 0
+	add hl, de
+	ld a, [hl]
+	and a
+	ret z
+
+	ld [wc6d3], a
+	hlcoord 1, 4
+	ld a, [wc6d1]
+	ld bc, 20 * 2
+	call AddNTimes
+	ld [hl], "▷"
+	call Function91342
+	jr c, .asm_911e5
+
+	ld hl, wJumptableIndex
+	inc [hl]
+	ret
+
+.asm_911e5
+	ld a, $8
+	ld [wJumptableIndex], a
+	ret
+
+Function911eb: ; 911eb (24:51eb)
+	call GetMapHeaderPhoneServiceNybble
+	and a
+	jr nz, .asm_91234
+	ld hl, Options
+	res NO_TEXT_SCROLL, [hl]
+	xor a
+	ld [hInMenu], a
+	ld de, SFX_CALL
+	call PlaySFX
+	ld hl, UnknownText_0x9124c
+	call PrintText
+	call WaitSFX
+	ld de, SFX_CALL
+	call PlaySFX
+	ld hl, UnknownText_0x9124c
+	call PrintText
+	call WaitSFX
+	ld a, [wc6d3]
+	ld b, a
+	call Function90199
+	ld c, 10
+	call DelayFrames
+	ld hl, Options
+	set NO_TEXT_SCROLL, [hl]
+	ld a, $1
+	ld [hInMenu], a
+	call Function912b7
+	ld hl, wJumptableIndex
+	inc [hl]
+	ret
+.asm_91234
+	callba Phone_NoSignal
+	ld hl, OutOfServiceAreaText
+	call PrintText
+	ld a, $8
+	ld [wJumptableIndex], a
+	ld hl, UnknownText_0x914ce
+	call PrintText
+	ret
+; 9124c (24:524c)
+
+UnknownText_0x9124c: ; 0x9124c
+	;
+	text_jump UnknownText_0x1c5824
+	db "@"
+; 0x91251
+
+OutOfServiceAreaText: ; 0x91251
+	; You're out of the service area.
+	text_jump UnknownText_0x1c5827
+	db "@"
+; 0x91256
+
+Function91256: ; 91256 (24:5256)
+	ld a, [hJoyPressed]
+	and A_BUTTON | B_BUTTON
+	ret z
+	callba HangUp
+	ld a, $8
+	ld [wJumptableIndex], a
+	ld hl, UnknownText_0x914ce
+	call PrintText
+	ret
+
+Function9126d: ; 9126d (24:526d)
+	ld hl, hJoyLast
+	ld a, [hl]
+	and D_UP
+	jr nz, .up
+	ld a, [hl]
+	and D_DOWN
+	jr nz, .down
+	ret
+
+.up
+	ld hl, wc6d1
+	ld a, [hl]
+	and a
+	jr z, .asm_91285
+	dec [hl]
+	jr .asm_912a3
+
+.asm_91285
+	ld hl, wc6d2
+	ld a, [hl]
+	and a
+	ret z
+	dec [hl]
+	jr .asm_912ad
+
+.down
+	ld hl, wc6d1
+	ld a, [hl]
+	cp $3
+	jr nc, .asm_91299
+	inc [hl]
+	jr .asm_912a3
+
+.asm_91299
+	ld hl, wc6d2
+	ld a, [hl]
+	cp $6
+	ret nc
+	inc [hl]
+	jr .asm_912ad
+
+.asm_912a3
+	xor a
+	ld [hBGMapMode], a
+	call Function912b7
+	call WaitBGMap
+	ret
+
+.asm_912ad
+	xor a
+	ld [hBGMapMode], a
+	call Function912d8
+	call WaitBGMap
+	ret
+
+Function912b7: ; 912b7 (24:52b7)
+	ld a, " "
+	hlcoord 1, 4
+	ld [hl], a
+	hlcoord 1, 6
+	ld [hl], a
+	hlcoord 1, 8
+	ld [hl], a
+	hlcoord 1, 10
+	ld [hl], a
+	hlcoord 1, 4
+	ld a, [wc6d1]
+	ld bc, $28
+	call AddNTimes
+	ld [hl], "▶"
+	ret
+
+Function912d8: ; 912d8 (24:52d8)
+	hlcoord 1, 3
+	ld b, $9
+	ld a, $7f
+.asm_912df
+	ld c, $12
+.asm_912e1
+	ld [hli], a
+	dec c
+	jr nz, .asm_912e1
+rept 2
+	inc hl
+endr
+	dec b
+	jr nz, .asm_912df
+	ld a, [wc6d2]
+	ld e, a
+	ld d, $0
+	ld hl, wPhoneList
+	add hl, de
+	xor a
+	ld [wc6d0], a
+.asm_912f8
+	ld a, [hli]
+	push hl
+	push af
+	hlcoord 2, 4
+	ld a, [wc6d0]
+	ld bc, $28
+	call AddNTimes
+	ld d, h
+	ld e, l
+	pop af
+	ld b, a
+	call Function90380
+	pop hl
+	ld a, [wc6d0]
+	inc a
+	ld [wc6d0], a
+	cp $4
+	jr c, .asm_912f8
+	call Function912b7
+	ret
+; 9131e (24:531e)
+
+Function9131e: ; 9131e
+	ld hl, wPhoneList
+	ld a, [wc6d2]
+	ld e, a
+	ld d, 0
+	add hl, de
+	ld a, [wc6d1]
+	ld e, a
+	ld d, 0
+	add hl, de
+	ld [hl], 0
+	ld hl, wPhoneList
+	ld c, $a
+.asm_91336
+	ld a, [hli]
+	and a
+	jr nz, .asm_9133e
+	ld a, [hld]
+	ld [hli], a
+	ld [hl], 0
+.asm_9133e
+	dec c
+	jr nz, .asm_91336
+	ret
+; 91342
+
+Function91342: ; 91342 (24:5342)
+	ld hl, wPhoneList
+	ld a, [wc6d2]
+	ld e, a
+	ld d, 0
+	add hl, de
+	ld a, [wc6d1]
+	ld e, a
+	ld d, 0
+	add hl, de
+	ld c, [hl]
+	callba Function9038a
+	ld a, c
+	and a
+	jr z, .asm_91366
+
+	ld hl, Jumptable_91455
+	ld de, Unknown_9143f
+	jr .asm_9136c
+
+.asm_91366
+	ld hl, Jumptable_9146a
+	ld de, Unknown_9145b
+
+.asm_9136c
+	xor a
+	ld [hBGMapMode], a
+	push hl
+	push de
+	ld a, [de]
+	ld l, a
+	inc de
+	ld a, [de]
+	ld h, a
+	inc de
+	push hl
+	ld bc, hBGMapAddress + 1
+	add hl, bc
+	ld a, [de]
+	inc de
+	sla a
+	ld b, a
+	ld c, 8
+	push de
+	call TextBox
+	pop de
+	pop hl
+	inc hl
+	call PlaceString
+	pop de
+	xor a
+	ld [wc6d4], a
+	call Function9141d
+	call WaitBGMap
+
+.asm_91398
+	push de
+	call JoyTextDelay
+	pop de
+	ld hl, hJoyPressed
+	ld a, [hl]
+	and D_UP
+	jr nz, .asm_913b4
+	ld a, [hl]
+	and D_DOWN
+	jr nz, .asm_913c1
+	ld a, [hl]
+	and A_BUTTON | B_BUTTON
+	jr nz, .asm_913d4
+	call DelayFrame
+	jr .asm_91398
+
+.asm_913b4
+	ld hl, wc6d4
+	ld a, [hl]
+	and a
+	jr z, .asm_91398
+	dec [hl]
+	call Function9141d
+	jr .asm_91398
+
+.asm_913c1
+	ld hl, 2
+	add hl, de
+	ld a, [wc6d4]
+	inc a
+	cp [hl]
+	jr nc, .asm_91398
+	ld [wc6d4], a
+	call Function9141d
+	jr .asm_91398
+
+.asm_913d4
+	xor a
+	ld [hBGMapMode], a
+	call Function912d8
+	ld a, $1
+	ld [hBGMapMode], a
+	pop hl
+	ld a, [hJoyPressed]
+	and B_BUTTON
+	jr nz, Function913f1
+
+	ld a, [wc6d4]
+	ld e, a
+	ld d, 0
+rept 2
+	add hl, de
+endr
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp [hl]
+
+Function913f1: ; 913f1
+	ld hl, UnknownText_0x914ce
+	call PrintText
+	scf
+	ret
+; 913f9 (24:53f9)
+
+Function913f9: ; 913f9
+	ld hl, UnknownText_0x914d8
+	call MenuTextBox
+	call YesNoBox
+	call ExitMenu
+	jr c, .asm_91419
+	call Function9131e
+	xor a
+	ld [hBGMapMode], a
+	call Function912d8
+	ld hl, UnknownText_0x914ce
+	call PrintText
+	call WaitBGMap
+.asm_91419
+	scf
+	ret
+; 9141b
+
+Function9141b: ; 9141b
+	and a
+	ret
+; 9141d
+
+Function9141d: ; 9141d (24:541d)
+	push de
+	ld a, [de]
+	inc de
+	ld l, a
+	ld a, [de]
+	inc de
+	ld h, a
+	ld a, [de]
+	ld c, a
+	push hl
+	ld a, " "
+	ld de, 20 * 2
+.asm_9142c
+	ld [hl], a
+	add hl, de
+	dec c
+	jr nz, .asm_9142c
+	pop hl
+	ld a, [wc6d4]
+	ld bc, 20 * 2
+	call AddNTimes
+	ld [hl], "▶"
+	pop de
+	ret
+; 9143f (24:543f)
+
+Unknown_9143f: ; 9143f
+	dwcoord 10, 6
+	db 3
+	db   "CALL"
+	next "DELETE"
+	next "CANCEL"
+	db   "@"
+; 91455
+
+Jumptable_91455: ; 91455
+	dw Function9141b
+	dw Function913f9
+	dw Function913f1
+; 9145b
+
+Unknown_9145b: ; 9145b
+	dwcoord 10, 8
+	db 2
+	db   "CALL"
+	next "CANCEL"
+	db   "@"
+; 9146a
+
+Jumptable_9146a: ; 9146a
+	dw Function9141b
+	dw Function913f1
+; 9146e
+
+
+Function9146e: ; 9146e
+	ld a, [hHours]
+	cp 12
+	jr c, .asm_9147b
+	sub 12
+	ld [wd265], a
+	scf
+	ret
+
+.asm_9147b
+	ld [wd265], a
+	and a
+	ret
+; 91480
+
+
+Function91480: ; 91480 (24:5480)
+	ld de, SFX_READ_TEXT_2
+	call PlaySFX
+	ld a, c
+	ld [wJumptableIndex], a
+	ld a, b
+	ld [wcf64], a
+	call DeleteSpriteAnimStruct2ToEnd
+	ret
+
+Function91492: ; 91492
+	ld a, [wc6dc]
+	cp $fe
+	jr z, .asm_914a3
+	cp $ff
+	call z, EnterMapMusic
+	xor a
+	ld [wc6dc], a
+	ret
+
+.asm_914a3
+	call RestartMapMusic
+	xor a
+	ld [wc6dc], a
+	ret
+; 914ab
+
+
+DeleteSpriteAnimStruct2ToEnd: ; 914ab (24:54ab)
+	ld hl, SpriteAnim2
+	ld bc, wSpriteAnimationStructsEnd - SpriteAnim2
+	xor a
+	call ByteFill
+	ld a, 2
+	ld [wSpriteAnimCount], a
+	ret
+
+Function914bb: ; 914bb (24:54bb)
+	hlcoord 0, 0
+.asm_914be
+	ld a, [de]
+	cp $ff
+	ret z
+	ld b, a
+	inc de
+	ld a, [de]
+	ld c, a
+	inc de
+	ld a, b
+.asm_914c8
+	ld [hli], a
+	dec c
+	jr nz, .asm_914c8
+	jr .asm_914be
+; 914ce (24:54ce)
+
+UnknownText_0x914ce: ; 0x914ce
+	; Whom do you want to call?
+	text_jump UnknownText_0x1c5847
+	db "@"
+; 0x914d3
+
+UnknownText_0x914d3: ; 0x914d3
+	; Press any button to exit.
+	text_jump UnknownText_0x1c5862
+	db "@"
+; 0x914d8
+
+UnknownText_0x914d8: ; 0x914d8
+	; Delete this stored phone number?
+	text_jump UnknownText_0x1c587d
+	db "@"
+; 0x914dd
+
+
+PokegearSpritesGFX: ; 914dd
+INCBIN "gfx/misc/pokegear_sprites.2bpp.lz"
+; 9150d
+
+RadioTilemapRLE: ; 9150d
+INCBIN "gfx/unknown/09150d.tilemap.rle"
+
+PhoneTilemapRLE: ; 9158a
+INCBIN "gfx/unknown/09158a.tilemap.rle"
+
+ClockTilemapRLE: ; 915db
+INCBIN "gfx/unknown/0915db.tilemap.rle"
+; 9163e
+_UpdateRadioStation: ; 9163e (24:563e)
+	jr UpdateRadioStation
+
+Function91640: ; 91640 (24:5640)
+	push bc
+	call .TuningKnob
+	pop bc
+	ld a, [wRadioTuningKnob]
+	ld hl, $6
+	add hl, bc
+	ld [hl], a
+	ret
+
+.TuningKnob: ; 9164e (24:564e)
+	ld hl, hJoyLast
+	ld a, [hl]
+	and D_DOWN
+	jr nz, .down
+	ld a, [hl]
+	and D_UP
+	jr nz, .up
+	ret
+
+.down
+	ld hl, wRadioTuningKnob
+	ld a, [hl]
+	and a
+	ret z
+rept 2
+	dec [hl]
+endr
+	jr .update
+
+.up
+	ld hl, wRadioTuningKnob
+	ld a, [hl]
+	cp 80
+	ret nc
+rept 2
+	inc [hl]
+endr
+
+.update
+
+UpdateRadioStation: ; 9166f (24:566f)
+	ld hl, wRadioTuningKnob
+	ld d, [hl]
+	ld hl, RadioChannels
+.loop
+	ld a, [hli]
+	cp -1
+	jr z, .nostation
+	cp d
+	jr z, .foundstation
+rept 2
+	inc hl
+endr
+	jr .loop
+
+.nostation
+	call NoRadioStation
+	ret
+
+.foundstation
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld de, .returnafterstation
+	push de
+	jp [hl]
+.returnafterstation
+	ld a, [wc6d9]
+	and a
+	ret z
+	xor a
+	ld [hBGMapMode], a
+	hlcoord 2, 9
+	call PlaceString
+	ld a, $1
+	ld [hBGMapMode], a
+	ret
+; 916a1 (24:56a1)
+
+Function916a1: ; 916a1
+	ld [wc6d9], a
+	ld a, [hli]
+	ld [wc6da], a
+	ld a, [hli]
+	ld [wc6db], a
+	ret
+; 916ad
+
+
+RadioChannels:
+; frequencies and the shows that play on them.
+; frequency value given here = 4 × ingame_frequency − 2
+	dbw 16, .PkmnTalkAndPokedexShow
+	dbw 28, .PokemonMusic
+	dbw 32, .LuckyChannel
+	dbw 40, .BuenasPassword
+	dbw 52, .RuinsOfAlphRadio
+	dbw 64, .PlacesAndPeople
+	dbw 72, .LetsAllSing
+	dbw 78, .PokeFluteRadio
+	dbw 80, .EvolutionRadio
+	db $ff
+
+.PkmnTalkAndPokedexShow
+; Pokédex Show in the morning
+; Oak's Pokémon Talk in the afternoon and evening
+	call .InJohto
+	jr nc, .NoSignal
+	ld a, [TimeOfDay]
+	and a
+	jp z, LoadStation_PokedexShow
+	jp LoadStation_OaksPokemonTalk
+
+.PokemonMusic
+	call .InJohto
+	jr nc, .NoSignal
+	jp LoadStation_PokemonMusic
+
+.LuckyChannel
+	call .InJohto
+	jr nc, .NoSignal
+	jp LoadStation_LuckyChannel
+
+.BuenasPassword
+	call .InJohto
+	jr nc, .NoSignal
+	jp LoadStation_BuenasPassword
+
+.RuinsOfAlphRadio
+	ld a, [wc6d8]
+	cp RUINS_OF_ALPH
+	jr nz, .NoSignal
+	jp LoadStation_UnownRadio
+
+.PlacesAndPeople
+	call .InJohto
+	jr c, .NoSignal
+	ld a, [wPokegearFlags]
+	bit 3, a
+	jr z, .NoSignal
+	jp LoadStation_PlacesAndPeople
+
+.LetsAllSing
+	call .InJohto
+	jr c, .NoSignal
+	ld a, [wPokegearFlags]
+	bit 3, a
+	jr z, .NoSignal
+	jp LoadStation_LetsAllSing
+
+.PokeFluteRadio
+	call .InJohto
+	jr c, .NoSignal
+	ld a, [wPokegearFlags]
+	bit 3, a
+	jr z, .NoSignal
+	jp LoadStation_PokeFluteRadio
+
+.EvolutionRadio
+; This station airs in the Lake of Rage area when Rocket are still in Mahogany.
+
+	ld a, [StatusFlags]
+	bit 4, a
+	jr z, .NoSignal
+
+	ld a, [wc6d8]
+	cp MAHOGANY_TOWN
+	jr z, .ok
+	cp ROUTE_43
+	jr z, .ok
+	cp LAKE_OF_RAGE
+	jr nz, .NoSignal
+.ok
+	jp LoadStation_EvolutionRadio
+
+.NoSignal
+	call NoRadioStation
+	ret
+
+.InJohto
+; if in Johto or on the S.S. Aqua, set carry
+; otherwise clear carry
+	ld a, [wc6d8]
+	cp FAST_SHIP
+	jr z, .johto
+	cp KANTO_LANDMARK
+	jr c, .johto
+.kanto
+	and a
+	ret
+.johto
+	scf
+	ret
+
+
+
+LoadStation_OaksPokemonTalk: ; 91753 (24:5753)
+	xor a ; OAKS_POKEMON_TALK
+	ld [wd002], a
+	ld [wd005], a
+	ld a, BANK(PlayRadioShow)
+	ld hl, PlayRadioShow
+	call Radio_BackUpFarCallParams
+	ld de, OaksPkmnTalkName
+	ret
+
+LoadStation_PokedexShow: ; 91766 (24:5766)
+	ld a, POKEDEX_SHOW
+	ld [wd002], a
+	xor a
+	ld [wd005], a
+	ld a, BANK(PlayRadioShow)
+	ld hl, PlayRadioShow
+	call Radio_BackUpFarCallParams
+	ld de, PokedexShowName
+	ret
+
+LoadStation_PokemonMusic: ; 9177b (24:577b)
+	ld a, POKEMON_MUSIC
+	ld [wd002], a
+	xor a
+	ld [wd005], a
+	ld a, BANK(PlayRadioShow)
+	ld hl, PlayRadioShow
+	call Radio_BackUpFarCallParams
+	ld de, PokemonMusicName
+	ret
+
+LoadStation_LuckyChannel: ; 91790 (24:5790)
+	ld a, LUCKY_CHANNEL
+	ld [wd002], a
+	xor a
+	ld [wd005], a
+	ld a, BANK(PlayRadioShow)
+	ld hl, PlayRadioShow
+	call Radio_BackUpFarCallParams
+	ld de, LuckyChannelName
+	ret
+
+LoadStation_BuenasPassword: ; 917a5 (24:57a5)
+	ld a, BUENAS_PASSWORD
+	ld [wd002], a
+	xor a
+	ld [wd005], a
+	ld a, BANK(PlayRadioShow)
+	ld hl, PlayRadioShow
+	call Radio_BackUpFarCallParams
+	ld de, NotBuenasPasswordName
+	ld a, [StatusFlags2]
+	bit 0, a
+	ret z
+	ld de, BuenasPasswordName
+	ret
+; 917c3 (24:57c3)
+
+BuenasPasswordName:    db "BUENA'S PASSWORD@"
+NotBuenasPasswordName: db "@"
+
+LoadStation_UnownRadio: ; 917d5 (24:57d5)
+	ld a, UNOWN_RADIO
+	ld [wd002], a
+	xor a
+	ld [wd005], a
+	ld a, BANK(PlayRadioShow)
+	ld hl, PlayRadioShow
+	call Radio_BackUpFarCallParams
+	ld de, UnknownStationName
+	ret
+
+LoadStation_PlacesAndPeople: ; 917ea (24:57ea)
+	ld a, PLACES_AND_PEOPLE
+	ld [wd002], a
+	xor a
+	ld [wd005], a
+	ld a, BANK(PlayRadioShow)
+	ld hl, PlayRadioShow
+	call Radio_BackUpFarCallParams
+	ld de, PlacesAndPeopleName
+	ret
+
+LoadStation_LetsAllSing: ; 917ff (24:57ff)
+	ld a, LETS_ALL_SING
+	ld [wd002], a
+	xor a
+	ld [wd005], a
+	ld a, BANK(PlayRadioShow)
+	ld hl, PlayRadioShow
+	call Radio_BackUpFarCallParams
+	ld de, LetsAllSingName
+	ret
+; 91814 (24:5814)
+
+LoadStation_RocketRadio: ; 91814
+	ld a, ROCKET_RADIO
+	ld [wd002], a
+	xor a
+	ld [wd005], a
+	ld a, BANK(PlayRadioShow)
+	ld hl, PlayRadioShow
+	call Radio_BackUpFarCallParams
+	ld de, LetsAllSingName
+	ret
+; 91829
+
+LoadStation_PokeFluteRadio: ; 91829 (24:5829)
+	ld a, POKE_FLUTE_RADIO
+	ld [wd002], a
+	xor a
+	ld [wd005], a
+	ld a, BANK(PlayRadioShow)
+	ld hl, PlayRadioShow
+	call Radio_BackUpFarCallParams
+	ld de, PokeFluteStationName
+	ret
+
+LoadStation_EvolutionRadio: ; 9183e (24:583e)
+	ld a, EVOLUTION_RADIO
+	ld [wd002], a
+	xor a
+	ld [wd005], a
+	ld a, BANK(PlayRadioShow)
+	ld hl, PlayRadioShow
+	call Radio_BackUpFarCallParams
+	ld de, UnknownStationName
+	ret
+; 91853 (24:5853)
+
+LoadStation_Dummy: ; 91853
+	ret
+
+RadioMusicRestartDE: ; 91854 (24:5854)
+	push de
+	ld a, e
+	ld [wc6dc], a
+	ld de, MUSIC_NONE
+	call PlayMusic
+	pop de
+	ld a, e
+	ld [wMapMusic], a
+	call PlayMusic
+	ret
+
+RadioMusicRestartPokemonChannel: ; 91868 (24:5868)
+	push de
+	ld a, $fe
+	ld [wc6dc], a
+	ld de, MUSIC_NONE
+	call PlayMusic
+	pop de
+	ld de, MUSIC_POKEMON_CHANNEL
+	call PlayMusic
+	ret
+
+Radio_BackUpFarCallParams: ; 9187c (24:587c)
+	ld [wc6d9], a
+	ld a, l
+	ld [wc6da], a
+	ld a, h
+	ld [wc6db], a
+	ret
+
+NoRadioStation: ; 91888 (24:5888)
+	call NoRadioMusic
+	call NoRadioName
+	xor a
+	ld [wc6d9], a
+	ld [wc6da], a
+	ld [wc6db], a
+	ld a, $1
+	ld [hBGMapMode], a
+	ret
+
+NoRadioMusic: ; 9189d (24:589d)
+	ld de, MUSIC_NONE
+	call PlayMusic
+	ld a, $ff
+	ld [wc6dc], a
+	ret
+
+NoRadioName: ; 918a9 (24:58a9)
+	xor a
+	ld [hBGMapMode], a
+	hlcoord 1, 8
+	lb bc, 3, 18
+	call ClearBox
+	hlcoord 0, 12
+	ld bc, $412
+	call TextBox
+	ret
+; 918bf
+
+OaksPkmnTalkName:     db "OAK's <PK><MN> Talk@"
+PokedexShowName:      db "#DEX Show@"
+PokemonMusicName:     db "#MON Music@"
+LuckyChannelName:     db "Lucky Channel@"
+UnknownStationName:   db "?????@"
+PlacesAndPeopleName:  db "Places & People@"
+LetsAllSingName:      db "Let's All Sing!@"
+PokeFluteStationName: db "# FLUTE@"
+; 9191c
+
+INCLUDE "engine/town_map.asm"
+
+PlayRadio: ; 91a53
+	ld hl, Options
+	ld a, [hl]
+	push af
+	set 4, [hl]
+	call .PlayStation
+	ld c, 100
+	call DelayFrames
+.loop
+	call JoyTextDelay
+	ld a, [hJoyPressed]
+	and A_BUTTON | B_BUTTON
+	jr nz, .stop
+	ld a, [wc6da]
+	ld l, a
+	ld a, [wc6db]
+	ld h, a
+	ld a, [wc6d9]
+	and a
+	jr z, .zero
+	rst FarCall
+
+.zero
+	call DelayFrame
+	jr .loop
+
+.stop
+	pop af
+	ld [Options], a
+	call Function91492
+	ret
+; 91a87
+
+.PlayStation: ; 91a87
+	ld a, -1
+	ld [EnemyTurnsTaken], a
+	ld hl, .StationPointers
+	ld d, $0
+rept 2
+	add hl, de
+endr
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld de, .jump_return
+	push de
+	jp [hl]
+
+.jump_return
+	push de
+	hlcoord 0, 12
+	lb bc, 4, 18
+	call TextBox
+	hlcoord 1, 14
+	ld [hl], $72
+	pop de
+	hlcoord 2, 14
+	call PlaceString
+	ld h, b
+	ld l, c
+	ld [hl], $73
+	call WaitBGMap
+	ret
+; 91ab9
+
+.StationPointers: ; 91ab9
+	dw .OakOrPnP
+	dw LoadStation_OaksPokemonTalk
+	dw LoadStation_PokedexShow
+	dw LoadStation_PokemonMusic
+	dw LoadStation_LuckyChannel
+	dw LoadStation_UnownRadio
+	dw LoadStation_PlacesAndPeople
+	dw LoadStation_LetsAllSing
+	dw LoadStation_RocketRadio
+; 91acb
+
+.OakOrPnP: ; 91acb
+	call IsInJohto
+	and a
+	jr nz, .kanto
+	call UpdateTime
+	ld a, [TimeOfDay]
+	and a
+	jp z, LoadStation_PokedexShow
+	jp LoadStation_OaksPokemonTalk
+
+.kanto
+	jp LoadStation_PlacesAndPeople
+; 91ae1
+Function91ae1: ; 91ae1
+	ld a, e
+	and a
+	jr nz, .kanto
+	call Function91ff2
+	call FillJohtoMap
+	ret
+
+.kanto
+	call Function91ff2
+	call FillKantoMap
+	ret
+; 91af3
+
+_FlyMap: ; 91af3
+	call ClearBGPalettes
+	call ClearTileMap
+	call ClearSprites
+	ld hl, hInMenu
+	ld a, [hl]
+	push af
+	ld [hl], $1
+	xor a
+	ld [hBGMapMode], a
+	callba Function8cf53
+	call Function91ff2
+	ld de, GFX_922e1
+	ld hl, VTiles2 tile $30
+	lb bc, BANK(GFX_922e1), 6
+	call Request1bpp
+	call FlyMap
+	call Function91c8f
+	ld b, $2
+	call GetSGBLayout
+	call SetPalettes
+.loop
+	call JoyTextDelay
+	ld hl, hJoyPressed
+	ld a, [hl]
+	and B_BUTTON
+	jr nz, .pressedB
+	ld a, [hl]
+	and A_BUTTON
+	jr nz, .pressedA
+	call FlyMapScroll
+	call GetMapCursorCoordinates
+	callba Function8cf69
+	call DelayFrame
+	jr .loop
+
+.pressedB
+	ld a, -1
+	jr .exit
+
+.pressedA
+	ld a, [wd002]
+	ld l, a
+	ld h, 0
+	add hl, hl
+	ld de, Flypoints + 1
+	add hl, de
+	ld a, [hl]
+
+.exit
+	ld [wd002], a
+	pop af
+	ld [hInMenu], a
+	call ClearBGPalettes
+	ld a, $90
+	ld [hWY], a
+	xor a
+	ld [hBGMapAddress], a
+	ld a, VBGMap0 / $100
+	ld [hBGMapAddress + 1], a
+	ld a, [wd002]
+	ld e, a
+	ret
+; 91b73
+
+FlyMapScroll: ; 91b73
+	ld a, [StartFlypoint]
+	ld e, a
+	ld a, [EndFlypoint]
+	ld d, a
+	ld hl, hJoyLast
+	ld a, [hl]
+	and D_UP
+	jr nz, .ScrollNext
+	ld a, [hl]
+	and D_DOWN
+	jr nz, .ScrollPrev
+	ret
+
+.ScrollNext
+	ld hl, wd002
+	ld a, [hl]
+	cp d
+	jr nz, .NotAtEndYet
+	ld a, e
+	dec a
+	ld [hl], a
+
+.NotAtEndYet
+	inc [hl]
+	call CheckIfVisitedFlypoint
+	jr z, .ScrollNext
+	jr .Finally
+
+.ScrollPrev
+	ld hl, wd002
+	ld a, [hl]
+	cp e
+	jr nz, .NotAtStartYet
+	ld a, d
+	inc a
+	ld [hl], a
+
+.NotAtStartYet
+	dec [hl]
+	call CheckIfVisitedFlypoint
+	jr z, .ScrollPrev
+
+.Finally
+	call TownMapBubble
+	call WaitBGMap
+	xor a
+	ld [hBGMapMode], a
+	ret
+; 91bb5
+
+TownMapBubble: ; 91bb5
+; Draw the bubble containing the location text in the town map HUD
+
+; Top-left corner
+	hlcoord 1, 0
+	ld a, $30
+	ld [hli], a
+
+; Top row
+	ld bc, 16
+	ld a, " "
+	call ByteFill
+
+; Top-right corner
+	ld a, $31
+	ld [hl], a
+	hlcoord 1, 1
+
+
+; Middle row
+	ld bc, 18
+	ld a, " "
+	call ByteFill
+
+
+; Bottom-left corner
+	hlcoord 1, 2
+	ld a, $32
+	ld [hli], a
+
+; Bottom row
+	ld bc, 16
+	ld a, " "
+	call ByteFill
+
+; Bottom-right corner
+	ld a, $33
+	ld [hl], a
+
+
+; Print "Where?"
+	hlcoord 2, 0
+	ld de, .Where
+	call PlaceString
+
+; Print the name of the default flypoint
+	call .Name
+
+; Up/down arrows
+	hlcoord 18, 1
+	ld [hl], $34	
+	ret
+
+.Where
+	db "Where?@"
+
+.Name
+; We need the map location of the default flypoint
+	ld a, [wd002]
+	ld l, a
+	ld h, 0
+	add hl, hl ; two bytes per flypoint
+	ld de, Flypoints
+	add hl, de
+	ld e, [hl]
+
+	callba GetLandmarkName
+
+	hlcoord 2, 1
+	ld de, StringBuffer1
+	call PlaceString
+	ret
+; 91c17
+
+GetMapCursorCoordinates: ; 91c17
+	ld a, [wd002]
+	ld l, a
+	ld h, $0
+	add hl, hl
+	ld de, Flypoints
+	add hl, de
+	ld e, [hl]
+	callba GetLandmarkCoords
+	ld a, [wd003]
+	ld c, a
+	ld a, [wd004]
+	ld b, a
+	ld hl, $4
+	add hl, bc
+	ld [hl], e
+	ld hl, $5
+	add hl, bc
+	ld [hl], d
+	ret
+; 91c3c
+
+CheckIfVisitedFlypoint: ; 91c3c
+; Check if the flypoint loaded in [hl] has been visited yet.
+	push bc
+	push de
+	push hl
+	ld l, [hl]
+	ld h, 0
+	add hl, hl
+	ld de, Flypoints + 1
+	add hl, de
+	ld c, [hl]
+	call HasVisitedSpawn
+	pop hl
+	pop de
+	pop bc
+	and a
+	ret
+; 91c50
+
+HasVisitedSpawn: ; 91c50
+; Check if spawn point c has been visited.
+	ld hl, VisitedSpawns
+	ld b, CHECK_FLAG
+	ld d, 0
+	predef FlagPredef
+	ld a, c
+	ret
+; 91c5e
+
+Flypoints: ; 91c5e
+; landmark, spawn point
+
+	const_def
+
+flypoint: MACRO
+; \1\@FLY   EQUS "FLY_\1"
+; \1\@SPAWN EQUS "SPAWN_\1"
+	; const \1\@FLY
+	; db \2, \1\@SPAWN
+	const FLY_\1
+	db \2, SPAWN_\1
+ENDM
+
+; Johto
+	flypoint NEW_BARK,    NEW_BARK_TOWN
+	flypoint CHERRYGROVE, CHERRYGROVE_CITY
+	flypoint VIOLET,      VIOLET_CITY
+	flypoint AZALEA,      AZALEA_TOWN
+	flypoint GOLDENROD,   GOLDENROD_CITY
+	flypoint ECRUTEAK,    ECRUTEAK_CITY
+	flypoint OLIVINE,     OLIVINE_CITY
+	flypoint CIANWOOD,    CIANWOOD_CITY
+	flypoint MAHOGANY,    MAHOGANY_TOWN
+	flypoint LAKE,        LAKE_OF_RAGE
+	flypoint BLACKTHORN,  BLACKTHORN_CITY
+	flypoint MT_SILVER,   SILVER_CAVE
+
+; Kanto
+KANTO_FLYPOINT EQU const_value
+
+	flypoint PALLET,      PALLET_TOWN
+	flypoint VIRIDIAN,    VIRIDIAN_CITY
+	flypoint PEWTER,      PEWTER_CITY
+	flypoint CERULEAN,    CERULEAN_CITY
+	flypoint VERMILION,   VERMILION_CITY
+	flypoint ROCK_TUNNEL, ROCK_TUNNEL
+	flypoint LAVENDER,    LAVENDER_TOWN
+	flypoint CELADON,     CELADON_CITY
+	flypoint SAFFRON,     SAFFRON_CITY
+	flypoint FUCHSIA,     FUCHSIA_CITY
+	flypoint CINNABAR,    CINNABAR_ISLAND
+	flypoint INDIGO,      INDIGO_PLATEAU
+
+	db -1
+; 91c8f
+
+Function91c8f: ; 91c8f
+	ret
+; 91c90
+
+FlyMap: ; 91c90
+
+	ld a, [MapGroup]
+	ld b, a
+	ld a, [MapNumber]
+	ld c, a
+	call GetWorldMapLocation
+
+; If we're not in a valid location, i.e. Pokecenter floor 2F,
+; the backup map information is used
+
+	cp SPECIAL_MAP
+	jr nz, .CheckRegion
+
+	ld a, [BackupMapGroup]
+	ld b, a
+	ld a, [BackupMapNumber]
+	ld c, a
+	call GetWorldMapLocation
+
+.CheckRegion
+; The first 46 locations are part of Johto. The rest are in Kanto
+	cp KANTO_LANDMARK
+	jr nc, .KantoFlyMap
+
+.JohtoFlyMap
+; Note that .NoKanto should be modified in tandem with this branch
+
+	push af
+
+; Start from New Bark Town
+	ld a, FLY_NEW_BARK
+	ld [wd002], a
+
+; Flypoints begin at New Bark Town...
+	ld [StartFlypoint], a
+; ..and end at Silver Cave
+	ld a, FLY_MT_SILVER
+	ld [EndFlypoint], a
+
+; Fill out the map
+	call FillJohtoMap
+	call .MapHud
+	pop af
+	call TownMapPlayerIcon
+	ret
+
+.KantoFlyMap
+
+; The event that there are no flypoints enabled in a map is not
+; accounted for. As a result, if you attempt to select a flypoint
+; when there are none enabled, the game will crash. Additionally,
+; the flypoint selection has a default starting point that
+; can be flown to even if none are enabled
+
+; To prevent both of these things from happening when the player
+; enters Kanto, fly access is restricted until Indigo Plateau is
+; visited and its flypoint enabled
+
+	push af
+	ld c, SPAWN_INDIGO
+	call HasVisitedSpawn
+	and a
+	jr z, .NoKanto
+
+; Kanto's map is only loaded if we've visited Indigo Plateau
+
+; Flypoints begin at Pallet Town...
+	ld a, FLY_PALLET
+	ld [StartFlypoint], a
+; ...and end at Indigo Plateau
+	ld a, FLY_INDIGO
+	ld [EndFlypoint], a
+
+; Because Indigo Plateau is the first flypoint the player
+; visits, it's made the default flypoint
+	ld [wd002], a
+
+; Fill out the map
+	call FillKantoMap
+	call .MapHud
+	pop af
+	call TownMapPlayerIcon
+	ret
+
+.NoKanto
+; If Indigo Plateau hasn't been visited, we use Johto's map instead
+
+; Start from New Bark Town
+	ld a, FLY_NEW_BARK
+	ld [wd002], a
+
+; Flypoints begin at New Bark Town...
+	ld [StartFlypoint], a
+; ..and end at Silver Cave
+	ld a, FLY_MT_SILVER
+	ld [EndFlypoint], a
+
+	call FillJohtoMap
+
+	pop af
+
+.MapHud
+	call TownMapBubble
+	call TownMapPals
+
+	ld hl, VBGMap0 ; BG Map 0
+	call TownMapBGUpdate
+
+	call TownMapMon
+	ld a, c
+	ld [wd003], a
+	ld a, b
+	ld [wd004], a
+	ret
+; 91d11
+
+Function91d11: ; 91d11
+	ld a, [wd002]
+	push af
+	ld a, [wd003]
+	push af
+	ld a, e
+	ld [wd002], a
+	call ClearSprites
+	xor a
+	ld [hBGMapMode], a
+	ld a, $1
+	ld [hInMenu], a
+
+	ld de, GFX_922d1
+	ld hl, VTiles0 tile $7f
+	lb bc, BANK(GFX_922d1), 1
+	call Request2bpp ; actually 1bpp
+
+	call Function91ed0
+
+	ld hl, VTiles0 tile $78
+	ld c, $4
+	call Request2bpp
+
+	call Function91ff2
+	call FillKantoMap
+	call Function91de9
+	call TownMapPals
+	ld hl, VBGMap1
+	call TownMapBGUpdate
+	call FillJohtoMap
+	call Function91de9
+	call TownMapPals
+	ld hl, VBGMap0
+	call TownMapBGUpdate
+	ld b, $2
+	call GetSGBLayout
+	call SetPalettes
+	xor a
+	ld [hBGMapMode], a
+	xor a
+	call Function91e1e
+.loop
+	call JoyTextDelay
+	ld hl, hJoyPressed
+	ld a, [hl]
+	and A_BUTTON | B_BUTTON
+	jr nz, .a_b
+	ld a, [hJoypadDown]
+	and SELECT
+	jr nz, .select
+	call Function91d9b
+	call Function91dcd
+	jr .next
+
+.select
+	call Function91e5a
+
+.next
+	call DelayFrame
+	jr .loop
+
+.a_b
+	call ClearSprites
+	pop af
+	ld [wd003], a
+	pop af
+	ld [wd002], a
+	ret
+; 91d9b
+
+Function91d9b: ; 91d9b
+	ld a, [hl]
+	and $20
+	jr nz, .asm_91da6
+	ld a, [hl]
+	and $10
+	jr nz, .asm_91db7
+	ret
+
+.asm_91da6
+	ld a, [hWY]
+	cp $90
+	ret z
+	call ClearSprites
+	ld a, $90
+	ld [hWY], a
+	xor a
+	call Function91e1e
+	ret
+
+.asm_91db7
+	ld a, [StatusFlags]
+	bit 6, a ; hall of fame
+	ret z
+	ld a, [hWY]
+	and a
+	ret z
+	call ClearSprites
+	xor a
+	ld [hWY], a
+	ld a, $1
+	call Function91e1e
+	ret
+; 91dcd
+
+Function91dcd: ; 91dcd
+	ld a, [hVBlankCounter]
+	ld e, a
+	and $f
+	ret nz
+	ld a, e
+	and $10
+	jr nz, .asm_91ddc
+	call ClearSprites
+	ret
+
+.asm_91ddc
+	hlcoord 0, 0
+	ld de, Sprites
+	ld bc, $a0
+	call CopyBytes
+	ret
+; 91de9
+
+Function91de9: ; 91de9
+	hlcoord 0, 0
+	ld bc, SCREEN_WIDTH
+	ld a, $7f
+	call ByteFill
+	hlcoord 0, 1
+	ld a, $6
+	ld [hli], a
+	ld bc, SCREEN_HEIGHT
+	ld a, $7
+	call ByteFill
+	ld [hl], $17
+	call GetPokemonName
+	hlcoord 2, 0
+	call PlaceString
+	ld h, b
+	ld l, c
+	ld de, String_91e16
+	call PlaceString
+	ret
+; 91e16
+
+String_91e16:
+	db "'S NEST@"
+; 91e1e
+
+Function91e1e: ; 91e1e
+	ld [wd003], a
+	ld e, a
+	callba Function2a01f
+	decoord 0, 0
+	ld hl, Sprites
+.asm_91e2e
+	ld a, [de]
+	and a
+	jr z, .asm_91e4d
+	push de
+	ld e, a
+	push hl
+	callba GetLandmarkCoords
+	pop hl
+	ld a, d
+	sub $4
+	ld [hli], a
+	ld a, e
+	sub $4
+	ld [hli], a
+	ld a, $7f
+	ld [hli], a
+	xor a
+	ld [hli], a
+	pop de
+	inc de
+	jr .asm_91e2e
+
+.asm_91e4d
+	ld hl, Sprites
+	decoord 0, 0
+	ld bc, $a0
+	call CopyBytes
+	ret
+; 91e5a
+
+Function91e5a: ; 91e5a
+	call Function91ea9
+	ret c
+
+	ld a, [wd002]
+	ld e, a
+	callba GetLandmarkCoords
+	ld c, e
+	ld b, d
+	ld de, Unknown_91e9c
+	ld hl, Sprites
+.asm_91e70
+	ld a, [de]
+	cp $80
+	jr z, .asm_91e91
+
+	add b
+	ld [hli], a
+	inc de
+
+	ld a, [de]
+	add c
+	ld [hli], a
+	inc de
+
+	ld a, [de]
+	add $78
+	ld [hli], a
+	inc de
+
+	push bc
+	ld c, 0
+	ld a, [PlayerGender]
+	bit 0, a
+	jr z, .asm_91e8c
+	inc c
+.asm_91e8c
+	ld a, c
+	ld [hli], a
+	pop bc
+
+	jr .asm_91e70
+
+.asm_91e91
+	ld hl, Sprites + $10
+	ld bc, SpritesEnd - (Sprites + $10)
+	xor a
+	call ByteFill
+	ret
+; 91e9c
+
+Unknown_91e9c: ; 91e9c
+	db -8, -8,  0
+	db -8,  0,  1
+	db  0, -8,  2
+	db  0,  0,  3
+	db $80 ; terminator
+; 91ea9
+
+Function91ea9: ; 91ea9
+	ld a, [wd002]
+	cp FAST_SHIP
+	jr z, .johto
+	cp KANTO_LANDMARK
+	jr c, .johto
+
+.kanto
+	ld a, [wd003]
+	and a
+	jr z, .clear
+	jr .ok
+
+.johto
+	ld a, [wd003]
+	and a
+	jr nz, .clear
+
+.ok
+	and a
+	ret
+
+.clear
+	ld hl, Sprites
+	ld bc, SpritesEnd - Sprites
+	xor a
+	call ByteFill
+	scf
+	ret
+; 91ed0
+
+Function91ed0: ; 91ed0
+	ld a, [wd002]
+	cp FAST_SHIP
+	jr z, .asm_91ede
+	callba GetPlayerIcon
+	ret
+
+.asm_91ede
+	ld de, FastShipGFX
+	ld b, BANK(FastShipGFX)
+	ret
+; 91ee4
+
+TownMapBGUpdate: ; 91ee4
+; Update BG Map tiles and attributes
+
+; BG Map address
+	ld a, l
+	ld [hBGMapAddress], a
+	ld a, h
+	ld [hBGMapAddress + 1], a
+
+; Only update palettes on CGB
+	ld a, [hCGB]
+	and a
+	jr z, .tiles
+
+; BG Map mode 2 (palettes)
+	ld a, 2
+	ld [hBGMapMode], a
+
+; The BG Map is updated in thirds, so we wait
+; 3 frames to update the whole screen's palettes.
+	ld c, 3
+	call DelayFrames
+
+.tiles
+; Update BG Map tiles
+	call WaitBGMap
+
+; Turn off BG Map update
+	xor a
+	ld [hBGMapMode], a
+	ret
+; 91eff
+
+FillJohtoMap: ; 91eff
+	ld de, JohtoMap
+	jr FillTownMap
+
+FillKantoMap: ; 91f04
+	ld de, KantoMap
+
+FillTownMap: ; 91f07
+	hlcoord 0, 0
+.loop
+	ld a, [de]
+	cp $ff
+	ret z
+	ld a, [de]
+	ld [hli], a
+	inc de
+	jr .loop
+; 91f13
+
+TownMapPals: ; 91f13
+; Assign palettes based on tile ids
+
+	hlcoord 0, 0
+	decoord 0, 0, AttrMap
+	ld bc, 360
+.loop
+; Current tile
+	ld a, [hli]
+	push hl
+
+; HP/borders use palette 0
+	cp $60
+	jr nc, .pal0
+
+; The palette data is condensed to nybbles,
+; least-significant first.
+	ld hl, TownMapPalMap
+	srl a
+	jr c, .odd
+
+; Even-numbered tile ids take the bottom nybble...
+	add l
+	ld l, a
+	ld a, h
+	adc 0
+	ld h, a
+	ld a, [hl]
+	and %111
+	jr .update
+
+.odd
+; ...and odd ids take the top.
+	add l
+	ld l, a
+	ld a, h
+	adc 0
+	ld h, a
+	ld a, [hl]
+	swap a
+	and %111
+	jr .update
+
+.pal0
+	xor a
+
+.update
+	pop hl
+	ld [de], a
+	inc de
+	dec bc
+	ld a, b
+	or c
+	jr nz, .loop
+	ret
+
+TownMapPalMap:
+	db $11, $21, $22, $00, $11, $13, $54, $54, $11, $21, $22, $00
+	db $11, $10, $01, $00, $11, $21, $22, $00, $00, $00, $00, $00
+	db $00, $00, $44, $04, $00, $00, $00, $00, $33, $33, $33, $33
+	db $33, $33, $33, $03, $33, $33, $33, $33, $00, $00, $00, $00
+; 91f7b
+
+TownMapMon: ; 91f7b
+; Draw the FlyMon icon at town map location in
+
+; Get FlyMon species
+	ld a, [CurPartyMon]
+	ld hl, PartySpecies
+	ld e, a
+	ld d, $0
+	add hl, de
+	ld a, [hl]
+	ld [wd265], a
+
+; Get FlyMon icon
+	ld e, 8 ; starting tile in VRAM
+	callba GetSpeciesIcon
+
+; Animation/palette
+	ld de, 0
+	ld a, $0
+	call _InitSpriteAnimStruct
+
+	ld hl, 3
+	add hl, bc
+	ld [hl], 8
+	ld hl, 2
+	add hl, bc
+	ld [hl], 0
+	ret
+; 91fa6
+
+TownMapPlayerIcon: ; 91fa6
+; Draw the player icon at town map location in a
+	push af
+
+	callba GetPlayerIcon
+
+; Standing icon
+	ld hl, VTiles0 tile $10
+	ld c, 4 ; # tiles
+	call Request2bpp
+
+; Walking icon
+	ld hl, $c0
+	add hl, de
+	ld d, h
+	ld e, l
+	ld hl, VTiles0 tile $14
+	ld c, 4 ; # tiles
+	ld a, BANK(ChrisSpriteGFX) ; does nothing
+	call Request2bpp
+
+; Animation/palette
+	ld de, 0
+	ld b, $0a ; Male
+	ld a, [PlayerGender]
+	bit 0, a
+	jr z, .asm_91fd3
+	ld b, $1e ; Female
+.asm_91fd3
+	ld a, b
+	call _InitSpriteAnimStruct
+
+	ld hl, $3
+	add hl, bc
+	ld [hl], $10
+
+	pop af
+	ld e, a
+	push bc
+	callba GetLandmarkCoords
+	pop bc
+
+	ld hl, 4
+	add hl, bc
+	ld [hl], e
+	ld hl, 5
+	add hl, bc
+	ld [hl], d
+	ret
+; 0x91ff2
+
+Function91ff2: ; 91ff2
+	ld hl, TownMapGFX
+	ld de, VTiles2
+	lb bc, BANK(TownMapGFX), $30
+	call DecompressRequest2bpp
+	ret
+; 91fff
+
+
+JohtoMap: ; 91fff
+INCBIN "gfx/misc/johto.bin"
+; 92168
+
+KantoMap: ; 92168
+INCBIN "gfx/misc/kanto.bin"
+; 922d1
+
+
+GFX_922d1: ; 922d1
+INCBIN "gfx/unknown/0922d1.2bpp"
+GFX_922e1: ; 922e1
+INCBIN "gfx/unknown/0922e1.2bpp"
+GFX_92301: ; 92301
+INCBIN "gfx/unknown/092301.2bpp"
+Function92311: ; unreferenced
+	xor a
+	ld [wd002], a
+	call ClearBGPalettes
+	call ClearTileMap
+	call ClearSprites
+	ld hl, hInMenu
+	ld a, [hl]
+	push af
+	ld [hl], $1
+	xor a
+	ld [hBGMapMode], a
+	callba Function8cf53
+	call Function91ff2
+	ld de, GFX_922e1
+	ld hl, VTiles2 tile $30
+	lb bc, BANK(GFX_922e1), 6
+	call Request1bpp
+	call FillKantoMap
+	call TownMapBubble
+	call TownMapPals
+	ld hl, VBGMap1
+	call TownMapBGUpdate
+	call FillJohtoMap
+	call TownMapBubble
+	call TownMapPals
+	ld hl, VBGMap0
+	call TownMapBGUpdate
+	call TownMapMon
+	ld a, c
+	ld [wd003], a
+	ld a, b
+	ld [wd004], a
+	ld b, SCGB_02
+	call GetSGBLayout
+	call SetPalettes
+.loop
+	call JoyTextDelay
+	ld hl, hJoyPressed
+	ld a, [hl]
+	and B_BUTTON
+	jr nz, .pressedB
+	ld a, [hl]
+	and A_BUTTON
+	jr nz, .pressedA
+	call Function923b8
+	call GetMapCursorCoordinates
+	callba Function8cf69
+	call DelayFrame
+	jr .loop
+
+.pressedB
+	ld a, -1
+	jr .asm_9239f
+
+.pressedA
+	ld a, [wd002]
+	ld l, a
+	ld h, 0
+	add hl, hl
+	ld de, Flypoints + 1
+	add hl, de
+	ld a, [hl]
+
+.asm_9239f
+	ld [wd002], a
+	pop af
+	ld [hInMenu], a
+	call ClearBGPalettes
+	ld a, $90
+	ld [hWY], a
+	xor a
+	ld [hBGMapAddress], a
+	ld a, VBGMap0 / $100
+	ld [hBGMapAddress + 1], a
+	ld a, [wd002]
+	ld e, a
+	ret
+; 923b8
+
+Function923b8: ; 923b8
+	ld hl, hJoyLast
+	ld a, [hl]
+	and D_DOWN | D_RIGHT
+	jr nz, .asm_923c6
+	ld a, [hl]
+	and D_UP | D_LEFT
+	jr nz, .asm_923d3
+	ret
+
+.asm_923c6
+	ld hl, wd002
+	ld a, [hl]
+	cp FLY_INDIGO
+	jr c, .asm_923d0
+	ld [hl], -1
+.asm_923d0
+	inc [hl]
+	jr .asm_923dd
+
+.asm_923d3
+	ld hl, wd002
+	ld a, [hl]
+	and a
+	jr nz, .asm_923dc
+	ld [hl], FLY_INDIGO + 1
+.asm_923dc
+	dec [hl]
+
+.asm_923dd
+	ld a, [wd002]
+	cp KANTO_FLYPOINT
+	jr c, .johto
+
+	call FillKantoMap
+	xor a
+	ld b, $9c
+	jr .asm_923f3
+
+.johto
+	call FillJohtoMap
+	ld a, $90
+	ld b, $98
+
+.asm_923f3
+	ld [hWY], a
+	ld a, b
+	ld [hBGMapAddress + 1], a
+	call TownMapBubble
+	call WaitBGMap
+	xor a
+	ld [hBGMapMode], a
+	ret
+; 92402
--- a/engine/radio2.asm
+++ /dev/null
@@ -1,664 +1,0 @@
-_UpdateRadioStation: ; 9163e (24:563e)
-	jr UpdateRadioStation
-
-Function91640: ; 91640 (24:5640)
-	push bc
-	call .TuningKnob
-	pop bc
-	ld a, [wRadioTuningKnob]
-	ld hl, $6
-	add hl, bc
-	ld [hl], a
-	ret
-
-.TuningKnob: ; 9164e (24:564e)
-	ld hl, hJoyLast
-	ld a, [hl]
-	and D_DOWN
-	jr nz, .down
-	ld a, [hl]
-	and D_UP
-	jr nz, .up
-	ret
-
-.down
-	ld hl, wRadioTuningKnob
-	ld a, [hl]
-	and a
-	ret z
-rept 2
-	dec [hl]
-endr
-	jr .update
-
-.up
-	ld hl, wRadioTuningKnob
-	ld a, [hl]
-	cp 80
-	ret nc
-rept 2
-	inc [hl]
-endr
-
-.update
-
-UpdateRadioStation: ; 9166f (24:566f)
-	ld hl, wRadioTuningKnob
-	ld d, [hl]
-	ld hl, RadioChannels
-.loop
-	ld a, [hli]
-	cp -1
-	jr z, .nostation
-	cp d
-	jr z, .foundstation
-rept 2
-	inc hl
-endr
-	jr .loop
-
-.nostation
-	call NoRadioStation
-	ret
-
-.foundstation
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld de, .returnafterstation
-	push de
-	jp [hl]
-.returnafterstation
-	ld a, [wc6d9]
-	and a
-	ret z
-	xor a
-	ld [hBGMapMode], a
-	hlcoord 2, 9
-	call PlaceString
-	ld a, $1
-	ld [hBGMapMode], a
-	ret
-; 916a1 (24:56a1)
-
-Function916a1: ; 916a1
-	ld [wc6d9], a
-	ld a, [hli]
-	ld [wc6da], a
-	ld a, [hli]
-	ld [wc6db], a
-	ret
-; 916ad
-
-
-RadioChannels:
-; frequencies and the shows that play on them.
-; frequency value given here = 4 × ingame_frequency − 2
-	dbw 16, .PkmnTalkAndPokedexShow
-	dbw 28, .PokemonMusic
-	dbw 32, .LuckyChannel
-	dbw 40, .BuenasPassword
-	dbw 52, .RuinsOfAlphRadio
-	dbw 64, .PlacesAndPeople
-	dbw 72, .LetsAllSing
-	dbw 78, .PokeFluteRadio
-	dbw 80, .EvolutionRadio
-	db $ff
-
-.PkmnTalkAndPokedexShow
-; Pokédex Show in the morning
-; Oak's Pokémon Talk in the afternoon and evening
-	call .InJohto
-	jr nc, .NoSignal
-	ld a, [TimeOfDay]
-	and a
-	jp z, LoadStation_PokedexShow
-	jp LoadStation_OaksPokemonTalk
-
-.PokemonMusic
-	call .InJohto
-	jr nc, .NoSignal
-	jp LoadStation_PokemonMusic
-
-.LuckyChannel
-	call .InJohto
-	jr nc, .NoSignal
-	jp LoadStation_LuckyChannel
-
-.BuenasPassword
-	call .InJohto
-	jr nc, .NoSignal
-	jp LoadStation_BuenasPassword
-
-.RuinsOfAlphRadio
-	ld a, [wc6d8]
-	cp RUINS_OF_ALPH
-	jr nz, .NoSignal
-	jp LoadStation_UnownRadio
-
-.PlacesAndPeople
-	call .InJohto
-	jr c, .NoSignal
-	ld a, [wPokegearFlags]
-	bit 3, a
-	jr z, .NoSignal
-	jp LoadStation_PlacesAndPeople
-
-.LetsAllSing
-	call .InJohto
-	jr c, .NoSignal
-	ld a, [wPokegearFlags]
-	bit 3, a
-	jr z, .NoSignal
-	jp LoadStation_LetsAllSing
-
-.PokeFluteRadio
-	call .InJohto
-	jr c, .NoSignal
-	ld a, [wPokegearFlags]
-	bit 3, a
-	jr z, .NoSignal
-	jp LoadStation_PokeFluteRadio
-
-.EvolutionRadio
-; This station airs in the Lake of Rage area when Rocket are still in Mahogany.
-
-	ld a, [StatusFlags]
-	bit 4, a
-	jr z, .NoSignal
-
-	ld a, [wc6d8]
-	cp MAHOGANY_TOWN
-	jr z, .ok
-	cp ROUTE_43
-	jr z, .ok
-	cp LAKE_OF_RAGE
-	jr nz, .NoSignal
-.ok
-	jp LoadStation_EvolutionRadio
-
-.NoSignal
-	call NoRadioStation
-	ret
-
-.InJohto
-; if in Johto or on the S.S. Aqua, set carry
-; otherwise clear carry
-	ld a, [wc6d8]
-	cp FAST_SHIP
-	jr z, .johto
-	cp KANTO_LANDMARK
-	jr c, .johto
-.kanto
-	and a
-	ret
-.johto
-	scf
-	ret
-
-
-
-LoadStation_OaksPokemonTalk: ; 91753 (24:5753)
-	xor a ; OAKS_POKEMON_TALK
-	ld [wd002], a
-	ld [wd005], a
-	ld a, BANK(PlayRadioShow)
-	ld hl, PlayRadioShow
-	call Radio_BackUpFarCallParams
-	ld de, OaksPkmnTalkName
-	ret
-
-LoadStation_PokedexShow: ; 91766 (24:5766)
-	ld a, POKEDEX_SHOW
-	ld [wd002], a
-	xor a
-	ld [wd005], a
-	ld a, BANK(PlayRadioShow)
-	ld hl, PlayRadioShow
-	call Radio_BackUpFarCallParams
-	ld de, PokedexShowName
-	ret
-
-LoadStation_PokemonMusic: ; 9177b (24:577b)
-	ld a, POKEMON_MUSIC
-	ld [wd002], a
-	xor a
-	ld [wd005], a
-	ld a, BANK(PlayRadioShow)
-	ld hl, PlayRadioShow
-	call Radio_BackUpFarCallParams
-	ld de, PokemonMusicName
-	ret
-
-LoadStation_LuckyChannel: ; 91790 (24:5790)
-	ld a, LUCKY_CHANNEL
-	ld [wd002], a
-	xor a
-	ld [wd005], a
-	ld a, BANK(PlayRadioShow)
-	ld hl, PlayRadioShow
-	call Radio_BackUpFarCallParams
-	ld de, LuckyChannelName
-	ret
-
-LoadStation_BuenasPassword: ; 917a5 (24:57a5)
-	ld a, BUENAS_PASSWORD
-	ld [wd002], a
-	xor a
-	ld [wd005], a
-	ld a, BANK(PlayRadioShow)
-	ld hl, PlayRadioShow
-	call Radio_BackUpFarCallParams
-	ld de, NotBuenasPasswordName
-	ld a, [StatusFlags2]
-	bit 0, a
-	ret z
-	ld de, BuenasPasswordName
-	ret
-; 917c3 (24:57c3)
-
-BuenasPasswordName:    db "BUENA'S PASSWORD@"
-NotBuenasPasswordName: db "@"
-
-LoadStation_UnownRadio: ; 917d5 (24:57d5)
-	ld a, UNOWN_RADIO
-	ld [wd002], a
-	xor a
-	ld [wd005], a
-	ld a, BANK(PlayRadioShow)
-	ld hl, PlayRadioShow
-	call Radio_BackUpFarCallParams
-	ld de, UnknownStationName
-	ret
-
-LoadStation_PlacesAndPeople: ; 917ea (24:57ea)
-	ld a, PLACES_AND_PEOPLE
-	ld [wd002], a
-	xor a
-	ld [wd005], a
-	ld a, BANK(PlayRadioShow)
-	ld hl, PlayRadioShow
-	call Radio_BackUpFarCallParams
-	ld de, PlacesAndPeopleName
-	ret
-
-LoadStation_LetsAllSing: ; 917ff (24:57ff)
-	ld a, LETS_ALL_SING
-	ld [wd002], a
-	xor a
-	ld [wd005], a
-	ld a, BANK(PlayRadioShow)
-	ld hl, PlayRadioShow
-	call Radio_BackUpFarCallParams
-	ld de, LetsAllSingName
-	ret
-; 91814 (24:5814)
-
-LoadStation_RocketRadio: ; 91814
-	ld a, ROCKET_RADIO
-	ld [wd002], a
-	xor a
-	ld [wd005], a
-	ld a, BANK(PlayRadioShow)
-	ld hl, PlayRadioShow
-	call Radio_BackUpFarCallParams
-	ld de, LetsAllSingName
-	ret
-; 91829
-
-LoadStation_PokeFluteRadio: ; 91829 (24:5829)
-	ld a, POKE_FLUTE_RADIO
-	ld [wd002], a
-	xor a
-	ld [wd005], a
-	ld a, BANK(PlayRadioShow)
-	ld hl, PlayRadioShow
-	call Radio_BackUpFarCallParams
-	ld de, PokeFluteStationName
-	ret
-
-LoadStation_EvolutionRadio: ; 9183e (24:583e)
-	ld a, EVOLUTION_RADIO
-	ld [wd002], a
-	xor a
-	ld [wd005], a
-	ld a, BANK(PlayRadioShow)
-	ld hl, PlayRadioShow
-	call Radio_BackUpFarCallParams
-	ld de, UnknownStationName
-	ret
-; 91853 (24:5853)
-
-LoadStation_Dummy: ; 91853
-	ret
-
-RadioMusicRestartDE: ; 91854 (24:5854)
-	push de
-	ld a, e
-	ld [wc6dc], a
-	ld de, MUSIC_NONE
-	call PlayMusic
-	pop de
-	ld a, e
-	ld [wMapMusic], a
-	call PlayMusic
-	ret
-
-RadioMusicRestartPokemonChannel: ; 91868 (24:5868)
-	push de
-	ld a, $fe
-	ld [wc6dc], a
-	ld de, MUSIC_NONE
-	call PlayMusic
-	pop de
-	ld de, MUSIC_POKEMON_CHANNEL
-	call PlayMusic
-	ret
-
-Radio_BackUpFarCallParams: ; 9187c (24:587c)
-	ld [wc6d9], a
-	ld a, l
-	ld [wc6da], a
-	ld a, h
-	ld [wc6db], a
-	ret
-
-NoRadioStation: ; 91888 (24:5888)
-	call NoRadioMusic
-	call NoRadioName
-	xor a
-	ld [wc6d9], a
-	ld [wc6da], a
-	ld [wc6db], a
-	ld a, $1
-	ld [hBGMapMode], a
-	ret
-
-NoRadioMusic: ; 9189d (24:589d)
-	ld de, MUSIC_NONE
-	call PlayMusic
-	ld a, $ff
-	ld [wc6dc], a
-	ret
-
-NoRadioName: ; 918a9 (24:58a9)
-	xor a
-	ld [hBGMapMode], a
-	hlcoord 1, 8
-	lb bc, 3, 18
-	call ClearBox
-	hlcoord 0, 12
-	ld bc, $412
-	call TextBox
-	ret
-; 918bf
-
-OaksPkmnTalkName:     db "OAK's <PK><MN> Talk@"
-PokedexShowName:      db "#DEX Show@"
-PokemonMusicName:     db "#MON Music@"
-LuckyChannelName:     db "Lucky Channel@"
-UnknownStationName:   db "?????@"
-PlacesAndPeopleName:  db "Places & People@"
-LetsAllSingName:      db "Let's All Sing!@"
-PokeFluteStationName: db "# FLUTE@"
-; 9191c
-
-
-Function9191c: ; 9191c
-	ld hl, Options
-	ld a, [hl]
-	push af
-	set 4, [hl]
-	ld a, [hInMenu]
-	push af
-	ld a, $1
-	ld [hInMenu], a
-	ld a, [VramState]
-	push af
-	xor a
-	ld [VramState], a
-	call ClearBGPalettes
-	call ClearTileMap
-	call ClearSprites
-	call DisableLCD
-	call Function90c4e
-	callba Function8cf53
-	ld a, 8
-	call SkipMusic
-	ld a, $e3
-	ld [rLCDC], a
-	call Function90d56
-	ld [wd002], a
-	ld [wd003], a
-	xor a
-	ld [hBGMapMode], a
-	call Function91a04
-	call Function3200
-	ld a, [wd002]
-	call Function9106a
-	ld a, [wd003]
-	call Function91098
-	ld a, c
-	ld [wd004], a
-	ld a, b
-	ld [wd005], a
-	ld b, SCGB_02
-	call GetSGBLayout
-	call SetPalettes
-	ld a, [hCGB]
-	and a
-	jr z, .asm_9198b
-	ld a, $e4
-	call Functioncf8
-	call DelayFrame
-
-.asm_9198b
-	ld a, [wd002]
-	cp KANTO_LANDMARK
-	jr nc, .asm_9199b
-	ld d, KANTO_LANDMARK - 1
-	ld e, 1
-	call Function919b0
-	jr .asm_919a1
-
-.asm_9199b
-	call Function910e8
-	call Function919b0
-
-.asm_919a1
-	pop af
-	ld [VramState], a
-	pop af
-	ld [hInMenu], a
-	pop af
-	ld [Options], a
-	call ClearBGPalettes
-	ret
-; 919b0
-
-Function919b0: ; 919b0
-.asm_919b0
-	call JoyTextDelay
-	ld hl, hJoyPressed
-	ld a, [hl]
-	and B_BUTTON
-	ret nz
-	ld hl, hJoyLast
-	ld a, [hl]
-	and D_UP
-	jr nz, .asm_919d4
-	ld a, [hl]
-	and D_DOWN
-	jr nz, .asm_919e1
-.asm_919c7
-	push de
-	callba Function8cf69
-	pop de
-	call DelayFrame
-	jr .asm_919b0
-
-.asm_919d4
-	ld hl, wd003
-	ld a, [hl]
-	cp d
-	jr c, .asm_919de
-	ld a, e
-	dec a
-	ld [hl], a
-
-.asm_919de
-	inc [hl]
-	jr .asm_919ec
-
-.asm_919e1
-	ld hl, wd003
-	ld a, [hl]
-	cp e
-	jr nz, .asm_919eb
-	ld a, d
-	inc a
-	ld [hl], a
-
-.asm_919eb
-	dec [hl]
-
-.asm_919ec
-	push de
-	ld a, [wd003]
-	call Function910b4
-	ld a, [wd004]
-	ld c, a
-	ld a, [wd005]
-	ld b, a
-	ld a, [wd003]
-	call Function910d4
-	pop de
-	jr .asm_919c7
-; 91a04
-
-Function91a04: ; 91a04
-	ld a, [wd002]
-	cp KANTO_LANDMARK
-	jr nc, .asm_91a0f
-	ld e, $0
-	jr .asm_91a11
-
-.asm_91a0f
-	ld e, $1
-
-.asm_91a11
-	callba Function91ae1
-	ld a, $7
-	ld bc, 6
-	hlcoord 1, 0
-	call ByteFill
-	hlcoord 0, 0
-	ld [hl], $6
-	hlcoord 7, 0
-	ld [hl], $17
-	hlcoord 7, 1
-	ld [hl], $16
-	hlcoord 7, 2
-	ld [hl], $26
-	ld a, $7
-	ld bc, NAME_LENGTH
-	hlcoord 8, 2
-	call ByteFill
-	hlcoord 19, 2
-	ld [hl], $17
-	ld a, [wd003]
-	call Function910b4
-	callba TownMapPals
-	ret
-; 91a53
-
-PlayRadio: ; 91a53
-	ld hl, Options
-	ld a, [hl]
-	push af
-	set 4, [hl]
-	call .PlayStation
-	ld c, 100
-	call DelayFrames
-.loop
-	call JoyTextDelay
-	ld a, [hJoyPressed]
-	and A_BUTTON | B_BUTTON
-	jr nz, .stop
-	ld a, [wc6da]
-	ld l, a
-	ld a, [wc6db]
-	ld h, a
-	ld a, [wc6d9]
-	and a
-	jr z, .zero
-	rst FarCall
-
-.zero
-	call DelayFrame
-	jr .loop
-
-.stop
-	pop af
-	ld [Options], a
-	call Function91492
-	ret
-; 91a87
-
-.PlayStation: ; 91a87
-	ld a, -1
-	ld [EnemyTurnsTaken], a
-	ld hl, .StationPointers
-	ld d, $0
-rept 2
-	add hl, de
-endr
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld de, .jump_return
-	push de
-	jp [hl]
-
-.jump_return
-	push de
-	hlcoord 0, 12
-	lb bc, 4, 18
-	call TextBox
-	hlcoord 1, 14
-	ld [hl], $72
-	pop de
-	hlcoord 2, 14
-	call PlaceString
-	ld h, b
-	ld l, c
-	ld [hl], $73
-	call WaitBGMap
-	ret
-; 91ab9
-
-.StationPointers: ; 91ab9
-	dw .OakOrPnP
-	dw LoadStation_OaksPokemonTalk
-	dw LoadStation_PokedexShow
-	dw LoadStation_PokemonMusic
-	dw LoadStation_LuckyChannel
-	dw LoadStation_UnownRadio
-	dw LoadStation_PlacesAndPeople
-	dw LoadStation_LetsAllSing
-	dw LoadStation_RocketRadio
-; 91acb
-
-.OakOrPnP: ; 91acb
-	call IsInJohto
-	and a
-	jr nz, .kanto
-	call UpdateTime
-	ld a, [TimeOfDay]
-	and a
-	jp z, LoadStation_PokedexShow
-	jp LoadStation_OaksPokemonTalk
-
-.kanto
-	jp LoadStation_PlacesAndPeople
-; 91ae1
--- a/engine/specials.asm
+++ b/engine/specials.asm
@@ -285,7 +285,7 @@
 
 Special_TownMap: ; c2c0
 	call FadeToMenu
-	callba Function9191c
+	callba _TownMap
 	call Function2b4d
 	ret
 ; c2cd
--- a/engine/startmenu.asm
+++ b/engine/startmenu.asm
@@ -494,7 +494,7 @@
 StartMenu_Pokegear: ; 1294c
 
 	call FadeToMenu
-	callba Function90b8d
+	callba PokeGear
 	call Function2b3c
 	ld a, 0
 	ret
--- a/engine/town_map.asm
+++ b/engine/town_map.asm
@@ -1,1068 +1,173 @@
-Function91ae1: ; 91ae1
-	ld a, e
-	and a
-	jr nz, .kanto
-	call Function91ff2
-	call FillJohtoMap
-	ret
 
-.kanto
-	call Function91ff2
-	call FillKantoMap
-	ret
-; 91af3
+_TownMap: ; 9191c
+	ld hl, Options
+	ld a, [hl]
+	push af
+	set NO_TEXT_SCROLL, [hl]
 
-_FlyMap: ; 91af3
+	ld a, [hInMenu]
+	push af
+	ld a, $1
+	ld [hInMenu], a
+
+	ld a, [VramState]
+	push af
+	xor a
+	ld [VramState], a
+
 	call ClearBGPalettes
 	call ClearTileMap
 	call ClearSprites
-	ld hl, hInMenu
-	ld a, [hl]
-	push af
-	ld [hl], $1
+	call DisableLCD
+	call Function90c4e
+	callba Function8cf53
+	ld a, 8
+	call SkipMusic
+	ld a, $e3
+	ld [rLCDC], a
+	call Function90d56
+	ld [wd002], a
+	ld [wd003], a
 	xor a
 	ld [hBGMapMode], a
-	callba Function8cf53
-	call Function91ff2
-	ld de, GFX_922e1
-	ld hl, VTiles2 tile $30
-	lb bc, BANK(GFX_922e1), 6
-	call Request1bpp
-	call FlyMap
-	call Function91c8f
-	ld b, $2
+	call Function91a04
+	call Function3200
+	ld a, [wd002]
+	call Function9106a
+	ld a, [wd003]
+	call Function91098
+	ld a, c
+	ld [wd004], a
+	ld a, b
+	ld [wd005], a
+	ld b, SCGB_02
 	call GetSGBLayout
 	call SetPalettes
-.loop
-	call JoyTextDelay
-	ld hl, hJoyPressed
-	ld a, [hl]
-	and B_BUTTON
-	jr nz, .pressedB
-	ld a, [hl]
-	and A_BUTTON
-	jr nz, .pressedA
-	call FlyMapScroll
-	call GetMapCursorCoordinates
-	callba Function8cf69
+	ld a, [hCGB]
+	and a
+	jr z, .sgb
+	ld a, $e4
+	call Functioncf8
 	call DelayFrame
-	jr .loop
 
-.pressedB
-	ld a, -1
-	jr .exit
-
-.pressedA
+.sgb
 	ld a, [wd002]
-	ld l, a
-	ld h, 0
-	add hl, hl
-	ld de, Flypoints + 1
-	add hl, de
-	ld a, [hl]
+	cp KANTO_LANDMARK
+	jr nc, .kanto
+	ld d, KANTO_LANDMARK - 1
+	ld e, 1
+	call Function919b0
+	jr .resume
 
-.exit
-	ld [wd002], a
+.kanto
+	call Function910e8
+	call Function919b0
+
+.resume
 	pop af
+	ld [VramState], a
+	pop af
 	ld [hInMenu], a
+	pop af
+	ld [Options], a
 	call ClearBGPalettes
-	ld a, $90
-	ld [hWY], a
-	xor a
-	ld [hBGMapAddress], a
-	ld a, VBGMap0 / $100
-	ld [hBGMapAddress + 1], a
-	ld a, [wd002]
-	ld e, a
 	ret
-; 91b73
+; 919b0
 
-FlyMapScroll: ; 91b73
-	ld a, [StartFlypoint]
-	ld e, a
-	ld a, [EndFlypoint]
-	ld d, a
+Function919b0: ; 919b0
+.loop
+	call JoyTextDelay
+	ld hl, hJoyPressed
+	ld a, [hl]
+	and B_BUTTON
+	ret nz
+
 	ld hl, hJoyLast
 	ld a, [hl]
 	and D_UP
-	jr nz, .ScrollNext
+	jr nz, .pressed_up
+
 	ld a, [hl]
 	and D_DOWN
-	jr nz, .ScrollPrev
-	ret
+	jr nz, .pressed_down
+.loop2
+	push de
+	callba Function8cf69
+	pop de
+	call DelayFrame
+	jr .loop
 
-.ScrollNext
-	ld hl, wd002
+.pressed_up
+	ld hl, wd003
 	ld a, [hl]
 	cp d
-	jr nz, .NotAtEndYet
+	jr c, .okay
 	ld a, e
 	dec a
 	ld [hl], a
 
-.NotAtEndYet
+.okay
 	inc [hl]
-	call CheckIfVisitedFlypoint
-	jr z, .ScrollNext
-	jr .Finally
+	jr .next
 
-.ScrollPrev
-	ld hl, wd002
+.pressed_down
+	ld hl, wd003
 	ld a, [hl]
 	cp e
-	jr nz, .NotAtStartYet
+	jr nz, .okay2
 	ld a, d
 	inc a
 	ld [hl], a
 
-.NotAtStartYet
+.okay2
 	dec [hl]
-	call CheckIfVisitedFlypoint
-	jr z, .ScrollPrev
 
-.Finally
-	call TownMapBubble
-	call WaitBGMap
-	xor a
-	ld [hBGMapMode], a
-	ret
-; 91bb5
-
-TownMapBubble: ; 91bb5
-; Draw the bubble containing the location text in the town map HUD
-
-; Top-left corner
-	hlcoord 1, 0
-	ld a, $30
-	ld [hli], a
-
-; Top row
-	ld bc, 16
-	ld a, " "
-	call ByteFill
-
-; Top-right corner
-	ld a, $31
-	ld [hl], a
-	hlcoord 1, 1
-
-
-; Middle row
-	ld bc, 18
-	ld a, " "
-	call ByteFill
-
-
-; Bottom-left corner
-	hlcoord 1, 2
-	ld a, $32
-	ld [hli], a
-
-; Bottom row
-	ld bc, 16
-	ld a, " "
-	call ByteFill
-
-; Bottom-right corner
-	ld a, $33
-	ld [hl], a
-
-
-; Print "Where?"
-	hlcoord 2, 0
-	ld de, .Where
-	call PlaceString
-
-; Print the name of the default flypoint
-	call .Name
-
-; Up/down arrows
-	hlcoord 18, 1
-	ld [hl], $34	
-	ret
-
-.Where
-	db "Where?@"
-
-.Name
-; We need the map location of the default flypoint
-	ld a, [wd002]
-	ld l, a
-	ld h, 0
-	add hl, hl ; two bytes per flypoint
-	ld de, Flypoints
-	add hl, de
-	ld e, [hl]
-
-	callba GetLandmarkName
-
-	hlcoord 2, 1
-	ld de, StringBuffer1
-	call PlaceString
-	ret
-; 91c17
-
-GetMapCursorCoordinates: ; 91c17
-	ld a, [wd002]
-	ld l, a
-	ld h, $0
-	add hl, hl
-	ld de, Flypoints
-	add hl, de
-	ld e, [hl]
-	callba GetLandmarkCoords
+.next
+	push de
 	ld a, [wd003]
-	ld c, a
+	call Function910b4
 	ld a, [wd004]
-	ld b, a
-	ld hl, $4
-	add hl, bc
-	ld [hl], e
-	ld hl, $5
-	add hl, bc
-	ld [hl], d
-	ret
-; 91c3c
-
-CheckIfVisitedFlypoint: ; 91c3c
-; Check if the flypoint loaded in [hl] has been visited yet.
-	push bc
-	push de
-	push hl
-	ld l, [hl]
-	ld h, 0
-	add hl, hl
-	ld de, Flypoints + 1
-	add hl, de
-	ld c, [hl]
-	call HasVisitedSpawn
-	pop hl
-	pop de
-	pop bc
-	and a
-	ret
-; 91c50
-
-HasVisitedSpawn: ; 91c50
-; Check if spawn point c has been visited.
-	ld hl, VisitedSpawns
-	ld b, CHECK_FLAG
-	ld d, 0
-	predef FlagPredef
-	ld a, c
-	ret
-; 91c5e
-
-Flypoints: ; 91c5e
-; landmark, spawn point
-
-	const_def
-
-flypoint: MACRO
-; \1\@FLY   EQUS "FLY_\1"
-; \1\@SPAWN EQUS "SPAWN_\1"
-	; const \1\@FLY
-	; db \2, \1\@SPAWN
-	const FLY_\1
-	db \2, SPAWN_\1
-ENDM
-
-; Johto
-	flypoint NEW_BARK,    NEW_BARK_TOWN
-	flypoint CHERRYGROVE, CHERRYGROVE_CITY
-	flypoint VIOLET,      VIOLET_CITY
-	flypoint AZALEA,      AZALEA_TOWN
-	flypoint GOLDENROD,   GOLDENROD_CITY
-	flypoint ECRUTEAK,    ECRUTEAK_CITY
-	flypoint OLIVINE,     OLIVINE_CITY
-	flypoint CIANWOOD,    CIANWOOD_CITY
-	flypoint MAHOGANY,    MAHOGANY_TOWN
-	flypoint LAKE,        LAKE_OF_RAGE
-	flypoint BLACKTHORN,  BLACKTHORN_CITY
-	flypoint MT_SILVER,   SILVER_CAVE
-
-; Kanto
-KANTO_FLYPOINT EQU const_value
-
-	flypoint PALLET,      PALLET_TOWN
-	flypoint VIRIDIAN,    VIRIDIAN_CITY
-	flypoint PEWTER,      PEWTER_CITY
-	flypoint CERULEAN,    CERULEAN_CITY
-	flypoint VERMILION,   VERMILION_CITY
-	flypoint ROCK_TUNNEL, ROCK_TUNNEL
-	flypoint LAVENDER,    LAVENDER_TOWN
-	flypoint CELADON,     CELADON_CITY
-	flypoint SAFFRON,     SAFFRON_CITY
-	flypoint FUCHSIA,     FUCHSIA_CITY
-	flypoint CINNABAR,    CINNABAR_ISLAND
-	flypoint INDIGO,      INDIGO_PLATEAU
-
-	db -1
-; 91c8f
-
-Function91c8f: ; 91c8f
-	ret
-; 91c90
-
-FlyMap: ; 91c90
-
-	ld a, [MapGroup]
-	ld b, a
-	ld a, [MapNumber]
 	ld c, a
-	call GetWorldMapLocation
-
-; If we're not in a valid location, i.e. Pokecenter floor 2F,
-; the backup map information is used
-
-	cp SPECIAL_MAP
-	jr nz, .CheckRegion
-
-	ld a, [BackupMapGroup]
+	ld a, [wd005]
 	ld b, a
-	ld a, [BackupMapNumber]
-	ld c, a
-	call GetWorldMapLocation
-
-.CheckRegion
-; The first 46 locations are part of Johto. The rest are in Kanto
-	cp KANTO_LANDMARK
-	jr nc, .KantoFlyMap
-
-.JohtoFlyMap
-; Note that .NoKanto should be modified in tandem with this branch
-
-	push af
-
-; Start from New Bark Town
-	ld a, FLY_NEW_BARK
-	ld [wd002], a
-
-; Flypoints begin at New Bark Town...
-	ld [StartFlypoint], a
-; ..and end at Silver Cave
-	ld a, FLY_MT_SILVER
-	ld [EndFlypoint], a
-
-; Fill out the map
-	call FillJohtoMap
-	call .MapHud
-	pop af
-	call TownMapPlayerIcon
-	ret
-
-.KantoFlyMap
-
-; The event that there are no flypoints enabled in a map is not
-; accounted for. As a result, if you attempt to select a flypoint
-; when there are none enabled, the game will crash. Additionally,
-; the flypoint selection has a default starting point that
-; can be flown to even if none are enabled
-
-; To prevent both of these things from happening when the player
-; enters Kanto, fly access is restricted until Indigo Plateau is
-; visited and its flypoint enabled
-
-	push af
-	ld c, SPAWN_INDIGO
-	call HasVisitedSpawn
-	and a
-	jr z, .NoKanto
-
-; Kanto's map is only loaded if we've visited Indigo Plateau
-
-; Flypoints begin at Pallet Town...
-	ld a, FLY_PALLET
-	ld [StartFlypoint], a
-; ...and end at Indigo Plateau
-	ld a, FLY_INDIGO
-	ld [EndFlypoint], a
-
-; Because Indigo Plateau is the first flypoint the player
-; visits, it's made the default flypoint
-	ld [wd002], a
-
-; Fill out the map
-	call FillKantoMap
-	call .MapHud
-	pop af
-	call TownMapPlayerIcon
-	ret
-
-.NoKanto
-; If Indigo Plateau hasn't been visited, we use Johto's map instead
-
-; Start from New Bark Town
-	ld a, FLY_NEW_BARK
-	ld [wd002], a
-
-; Flypoints begin at New Bark Town...
-	ld [StartFlypoint], a
-; ..and end at Silver Cave
-	ld a, FLY_MT_SILVER
-	ld [EndFlypoint], a
-
-	call FillJohtoMap
-
-	pop af
-
-.MapHud
-	call TownMapBubble
-	call TownMapPals
-
-	ld hl, VBGMap0 ; BG Map 0
-	call TownMapBGUpdate
-
-	call TownMapMon
-	ld a, c
-	ld [wd003], a
-	ld a, b
-	ld [wd004], a
-	ret
-; 91d11
-
-Function91d11: ; 91d11
-	ld a, [wd002]
-	push af
 	ld a, [wd003]
-	push af
-	ld a, e
-	ld [wd002], a
-	call ClearSprites
-	xor a
-	ld [hBGMapMode], a
-	ld a, $1
-	ld [hInMenu], a
-
-	ld de, GFX_922d1
-	ld hl, VTiles0 tile $7f
-	lb bc, BANK(GFX_922d1), 1
-	call Request2bpp ; actually 1bpp
-
-	call Function91ed0
-
-	ld hl, VTiles0 tile $78
-	ld c, $4
-	call Request2bpp
-
-	call Function91ff2
-	call FillKantoMap
-	call Function91de9
-	call TownMapPals
-	ld hl, VBGMap1
-	call TownMapBGUpdate
-	call FillJohtoMap
-	call Function91de9
-	call TownMapPals
-	ld hl, VBGMap0
-	call TownMapBGUpdate
-	ld b, $2
-	call GetSGBLayout
-	call SetPalettes
-	xor a
-	ld [hBGMapMode], a
-	xor a
-	call Function91e1e
-.loop
-	call JoyTextDelay
-	ld hl, hJoyPressed
-	ld a, [hl]
-	and A_BUTTON | B_BUTTON
-	jr nz, .a_b
-	ld a, [hJoypadDown]
-	and SELECT
-	jr nz, .select
-	call Function91d9b
-	call Function91dcd
-	jr .next
-
-.select
-	call Function91e5a
-
-.next
-	call DelayFrame
-	jr .loop
-
-.a_b
-	call ClearSprites
-	pop af
-	ld [wd003], a
-	pop af
-	ld [wd002], a
-	ret
-; 91d9b
-
-Function91d9b: ; 91d9b
-	ld a, [hl]
-	and $20
-	jr nz, .asm_91da6
-	ld a, [hl]
-	and $10
-	jr nz, .asm_91db7
-	ret
-
-.asm_91da6
-	ld a, [hWY]
-	cp $90
-	ret z
-	call ClearSprites
-	ld a, $90
-	ld [hWY], a
-	xor a
-	call Function91e1e
-	ret
-
-.asm_91db7
-	ld a, [StatusFlags]
-	bit 6, a ; hall of fame
-	ret z
-	ld a, [hWY]
-	and a
-	ret z
-	call ClearSprites
-	xor a
-	ld [hWY], a
-	ld a, $1
-	call Function91e1e
-	ret
-; 91dcd
-
-Function91dcd: ; 91dcd
-	ld a, [hVBlankCounter]
-	ld e, a
-	and $f
-	ret nz
-	ld a, e
-	and $10
-	jr nz, .asm_91ddc
-	call ClearSprites
-	ret
-
-.asm_91ddc
-	hlcoord 0, 0
-	ld de, Sprites
-	ld bc, $a0
-	call CopyBytes
-	ret
-; 91de9
-
-Function91de9: ; 91de9
-	hlcoord 0, 0
-	ld bc, SCREEN_WIDTH
-	ld a, $7f
-	call ByteFill
-	hlcoord 0, 1
-	ld a, $6
-	ld [hli], a
-	ld bc, SCREEN_HEIGHT
-	ld a, $7
-	call ByteFill
-	ld [hl], $17
-	call GetPokemonName
-	hlcoord 2, 0
-	call PlaceString
-	ld h, b
-	ld l, c
-	ld de, String_91e16
-	call PlaceString
-	ret
-; 91e16
-
-String_91e16:
-	db "'S NEST@"
-; 91e1e
-
-Function91e1e: ; 91e1e
-	ld [wd003], a
-	ld e, a
-	callba Function2a01f
-	decoord 0, 0
-	ld hl, Sprites
-.asm_91e2e
-	ld a, [de]
-	and a
-	jr z, .asm_91e4d
-	push de
-	ld e, a
-	push hl
-	callba GetLandmarkCoords
-	pop hl
-	ld a, d
-	sub $4
-	ld [hli], a
-	ld a, e
-	sub $4
-	ld [hli], a
-	ld a, $7f
-	ld [hli], a
-	xor a
-	ld [hli], a
+	call Function910d4
 	pop de
-	inc de
-	jr .asm_91e2e
+	jr .loop2
+; 91a04
 
-.asm_91e4d
-	ld hl, Sprites
-	decoord 0, 0
-	ld bc, $a0
-	call CopyBytes
-	ret
-; 91e5a
-
-Function91e5a: ; 91e5a
-	call Function91ea9
-	ret c
-
+Function91a04: ; 91a04
 	ld a, [wd002]
-	ld e, a
-	callba GetLandmarkCoords
-	ld c, e
-	ld b, d
-	ld de, Unknown_91e9c
-	ld hl, Sprites
-.asm_91e70
-	ld a, [de]
-	cp $80
-	jr z, .asm_91e91
-
-	add b
-	ld [hli], a
-	inc de
-
-	ld a, [de]
-	add c
-	ld [hli], a
-	inc de
-
-	ld a, [de]
-	add $78
-	ld [hli], a
-	inc de
-
-	push bc
-	ld c, 0
-	ld a, [PlayerGender]
-	bit 0, a
-	jr z, .asm_91e8c
-	inc c
-.asm_91e8c
-	ld a, c
-	ld [hli], a
-	pop bc
-
-	jr .asm_91e70
-
-.asm_91e91
-	ld hl, Sprites + $10
-	ld bc, SpritesEnd - (Sprites + $10)
-	xor a
-	call ByteFill
-	ret
-; 91e9c
-
-Unknown_91e9c: ; 91e9c
-	db -8, -8,  0
-	db -8,  0,  1
-	db  0, -8,  2
-	db  0,  0,  3
-	db $80 ; terminator
-; 91ea9
-
-Function91ea9: ; 91ea9
-	ld a, [wd002]
-	cp FAST_SHIP
-	jr z, .johto
 	cp KANTO_LANDMARK
-	jr c, .johto
+	jr nc, .kanto
+	ld e, $0
+	jr .okay
 
 .kanto
-	ld a, [wd003]
-	and a
-	jr z, .clear
-	jr .ok
+	ld e, $1
 
-.johto
-	ld a, [wd003]
-	and a
-	jr nz, .clear
-
-.ok
-	and a
-	ret
-
-.clear
-	ld hl, Sprites
-	ld bc, SpritesEnd - Sprites
-	xor a
+.okay
+	callba Function91ae1
+	ld a, $7
+	ld bc, 6
+	hlcoord 1, 0
 	call ByteFill
-	scf
-	ret
-; 91ed0
-
-Function91ed0: ; 91ed0
-	ld a, [wd002]
-	cp FAST_SHIP
-	jr z, .asm_91ede
-	callba GetPlayerIcon
-	ret
-
-.asm_91ede
-	ld de, FastShipGFX
-	ld b, BANK(FastShipGFX)
-	ret
-; 91ee4
-
-TownMapBGUpdate: ; 91ee4
-; Update BG Map tiles and attributes
-
-; BG Map address
-	ld a, l
-	ld [hBGMapAddress], a
-	ld a, h
-	ld [hBGMapAddress + 1], a
-
-; Only update palettes on CGB
-	ld a, [hCGB]
-	and a
-	jr z, .tiles
-
-; BG Map mode 2 (palettes)
-	ld a, 2
-	ld [hBGMapMode], a
-
-; The BG Map is updated in thirds, so we wait
-; 3 frames to update the whole screen's palettes.
-	ld c, 3
-	call DelayFrames
-
-.tiles
-; Update BG Map tiles
-	call WaitBGMap
-
-; Turn off BG Map update
-	xor a
-	ld [hBGMapMode], a
-	ret
-; 91eff
-
-FillJohtoMap: ; 91eff
-	ld de, JohtoMap
-	jr FillTownMap
-
-FillKantoMap: ; 91f04
-	ld de, KantoMap
-
-FillTownMap: ; 91f07
 	hlcoord 0, 0
-.loop
-	ld a, [de]
-	cp $ff
-	ret z
-	ld a, [de]
-	ld [hli], a
-	inc de
-	jr .loop
-; 91f13
-
-TownMapPals: ; 91f13
-; Assign palettes based on tile ids
-
-	hlcoord 0, 0
-	decoord 0, 0, AttrMap
-	ld bc, 360
-.loop
-; Current tile
-	ld a, [hli]
-	push hl
-
-; HP/borders use palette 0
-	cp $60
-	jr nc, .pal0
-
-; The palette data is condensed to nybbles,
-; least-significant first.
-	ld hl, TownMapPalMap
-	srl a
-	jr c, .odd
-
-; Even-numbered tile ids take the bottom nybble...
-	add l
-	ld l, a
-	ld a, h
-	adc 0
-	ld h, a
-	ld a, [hl]
-	and %111
-	jr .update
-
-.odd
-; ...and odd ids take the top.
-	add l
-	ld l, a
-	ld a, h
-	adc 0
-	ld h, a
-	ld a, [hl]
-	swap a
-	and %111
-	jr .update
-
-.pal0
-	xor a
-
-.update
-	pop hl
-	ld [de], a
-	inc de
-	dec bc
-	ld a, b
-	or c
-	jr nz, .loop
+	ld [hl], $6
+	hlcoord 7, 0
+	ld [hl], $17
+	hlcoord 7, 1
+	ld [hl], $16
+	hlcoord 7, 2
+	ld [hl], $26
+	ld a, $7
+	ld bc, NAME_LENGTH
+	hlcoord 8, 2
+	call ByteFill
+	hlcoord 19, 2
+	ld [hl], $17
+	ld a, [wd003]
+	call Function910b4
+	callba TownMapPals
 	ret
-
-TownMapPalMap:
-	db $11, $21, $22, $00, $11, $13, $54, $54, $11, $21, $22, $00
-	db $11, $10, $01, $00, $11, $21, $22, $00, $00, $00, $00, $00
-	db $00, $00, $44, $04, $00, $00, $00, $00, $33, $33, $33, $33
-	db $33, $33, $33, $03, $33, $33, $33, $33, $00, $00, $00, $00
-; 91f7b
-
-TownMapMon: ; 91f7b
-; Draw the FlyMon icon at town map location in
-
-; Get FlyMon species
-	ld a, [CurPartyMon]
-	ld hl, PartySpecies
-	ld e, a
-	ld d, $0
-	add hl, de
-	ld a, [hl]
-	ld [wd265], a
-
-; Get FlyMon icon
-	ld e, 8 ; starting tile in VRAM
-	callba GetSpeciesIcon
-
-; Animation/palette
-	ld de, 0
-	ld a, $0
-	call _InitSpriteAnimStruct
-
-	ld hl, 3
-	add hl, bc
-	ld [hl], 8
-	ld hl, 2
-	add hl, bc
-	ld [hl], 0
-	ret
-; 91fa6
-
-TownMapPlayerIcon: ; 91fa6
-; Draw the player icon at town map location in a
-	push af
-
-	callba GetPlayerIcon
-
-; Standing icon
-	ld hl, VTiles0 tile $10
-	ld c, 4 ; # tiles
-	call Request2bpp
-
-; Walking icon
-	ld hl, $c0
-	add hl, de
-	ld d, h
-	ld e, l
-	ld hl, VTiles0 tile $14
-	ld c, 4 ; # tiles
-	ld a, BANK(ChrisSpriteGFX) ; does nothing
-	call Request2bpp
-
-; Animation/palette
-	ld de, 0
-	ld b, $0a ; Male
-	ld a, [PlayerGender]
-	bit 0, a
-	jr z, .asm_91fd3
-	ld b, $1e ; Female
-.asm_91fd3
-	ld a, b
-	call _InitSpriteAnimStruct
-
-	ld hl, $3
-	add hl, bc
-	ld [hl], $10
-
-	pop af
-	ld e, a
-	push bc
-	callba GetLandmarkCoords
-	pop bc
-
-	ld hl, 4
-	add hl, bc
-	ld [hl], e
-	ld hl, 5
-	add hl, bc
-	ld [hl], d
-	ret
-; 0x91ff2
-
-Function91ff2: ; 91ff2
-	ld hl, TownMapGFX
-	ld de, VTiles2
-	lb bc, BANK(TownMapGFX), $30
-	call DecompressRequest2bpp
-	ret
-; 91fff
-
-
-JohtoMap: ; 91fff
-INCBIN "gfx/misc/johto.bin"
-; 92168
-
-KantoMap: ; 92168
-INCBIN "gfx/misc/kanto.bin"
-; 922d1
-
-
-GFX_922d1: ; 922d1
-INCBIN "gfx/unknown/0922d1.2bpp"
-GFX_922e1: ; 922e1
-INCBIN "gfx/unknown/0922e1.2bpp"
-GFX_92301: ; 92301
-INCBIN "gfx/unknown/092301.2bpp"
-Function92311: ; unreferenced
-	xor a
-	ld [wd002], a
-	call ClearBGPalettes
-	call ClearTileMap
-	call ClearSprites
-	ld hl, hInMenu
-	ld a, [hl]
-	push af
-	ld [hl], $1
-	xor a
-	ld [hBGMapMode], a
-	callba Function8cf53
-	call Function91ff2
-	ld de, GFX_922e1
-	ld hl, VTiles2 tile $30
-	lb bc, BANK(GFX_922e1), 6
-	call Request1bpp
-	call FillKantoMap
-	call TownMapBubble
-	call TownMapPals
-	ld hl, VBGMap1
-	call TownMapBGUpdate
-	call FillJohtoMap
-	call TownMapBubble
-	call TownMapPals
-	ld hl, VBGMap0
-	call TownMapBGUpdate
-	call TownMapMon
-	ld a, c
-	ld [wd003], a
-	ld a, b
-	ld [wd004], a
-	ld b, SCGB_02
-	call GetSGBLayout
-	call SetPalettes
-.loop
-	call JoyTextDelay
-	ld hl, hJoyPressed
-	ld a, [hl]
-	and B_BUTTON
-	jr nz, .pressedB
-	ld a, [hl]
-	and A_BUTTON
-	jr nz, .pressedA
-	call Function923b8
-	call GetMapCursorCoordinates
-	callba Function8cf69
-	call DelayFrame
-	jr .loop
-
-.pressedB
-	ld a, -1
-	jr .asm_9239f
-
-.pressedA
-	ld a, [wd002]
-	ld l, a
-	ld h, 0
-	add hl, hl
-	ld de, Flypoints + 1
-	add hl, de
-	ld a, [hl]
-
-.asm_9239f
-	ld [wd002], a
-	pop af
-	ld [hInMenu], a
-	call ClearBGPalettes
-	ld a, $90
-	ld [hWY], a
-	xor a
-	ld [hBGMapAddress], a
-	ld a, VBGMap0 / $100
-	ld [hBGMapAddress + 1], a
-	ld a, [wd002]
-	ld e, a
-	ret
-; 923b8
-
-Function923b8: ; 923b8
-	ld hl, hJoyLast
-	ld a, [hl]
-	and D_DOWN | D_RIGHT
-	jr nz, .asm_923c6
-	ld a, [hl]
-	and D_UP | D_LEFT
-	jr nz, .asm_923d3
-	ret
-
-.asm_923c6
-	ld hl, wd002
-	ld a, [hl]
-	cp FLY_INDIGO
-	jr c, .asm_923d0
-	ld [hl], -1
-.asm_923d0
-	inc [hl]
-	jr .asm_923dd
-
-.asm_923d3
-	ld hl, wd002
-	ld a, [hl]
-	and a
-	jr nz, .asm_923dc
-	ld [hl], FLY_INDIGO + 1
-.asm_923dc
-	dec [hl]
-
-.asm_923dd
-	ld a, [wd002]
-	cp KANTO_FLYPOINT
-	jr c, .johto
-
-	call FillKantoMap
-	xor a
-	ld b, $9c
-	jr .asm_923f3
-
-.johto
-	call FillJohtoMap
-	ld a, $90
-	ld b, $98
-
-.asm_923f3
-	ld [hWY], a
-	ld a, b
-	ld [hBGMapAddress + 1], a
-	call TownMapBubble
-	call WaitBGMap
-	xor a
-	ld [hBGMapMode], a
-	ret
-; 92402
+; 91a53
--- a/home/palettes.asm
+++ b/home/palettes.asm
@@ -289,16 +289,19 @@
 ; d79
 
 
-Functiond79:: ; d79
+ClearVBank1:: ; d79
 	ld a, [hCGB]
 	and a
 	ret z
+
 	ld a, 1
 	ld [rVBK], a
+
 	ld hl, VTiles0
-	ld bc, $2000
+	ld bc, VRAM_End - VTiles0
 	xor a
 	call ByteFill
+
 	ld a, 0
 	ld [rVBK], a
 	ret
--- a/main.asm
+++ b/main.asm
@@ -40323,1430 +40323,8 @@
 	ld a, 12
 	ret
 
-Function90b8d: ; 90b8d (24:4b8d)
-	ld hl, Options
-	ld a, [hl]
-	push af
-	set NO_TEXT_SCROLL, [hl]
-	ld a, [hInMenu]
-	push af
-	ld a, $1
-	ld [hInMenu], a
-	ld a, [VramState]
-	push af
-	xor a
-	ld [VramState], a
-	call Function90bea
-	call DelayFrame
+INCLUDE "engine/pokegear.asm"
 
-.loop
-	call UpdateTime
-	call JoyTextDelay
-	ld a, [wJumptableIndex]
-	bit 7, a
-	jr nz, .done
-	call Function90f04
-	callba Function8cf69
-	call DelayFrame
-	jr .loop
-
-.done
-	ld de, SFX_READ_TEXT_2
-	call PlaySFX
-	call WaitSFX
-	pop af
-	ld [VramState], a
-	pop af
-	ld [hInMenu], a
-	pop af
-	ld [Options], a
-	call ClearBGPalettes
-	xor a
-	ld [hBGMapAddress], a
-	ld a, VBGMap0 / $100
-	ld [hBGMapAddress + 1], a
-	ld a, $90
-	ld [hWY], a
-	call Function91492
-	ret
-
-Function90bea: ; 90bea (24:4bea)
-	call ClearBGPalettes
-	call ClearTileMap
-	call ClearSprites
-	call DisableLCD
-	xor a
-	ld [hSCY], a
-	ld [hSCX], a
-	ld a, $7
-	ld [hWX], a
-	call Function90c4e
-	callba Function8cf53
-	call Function90d32
-	ld a, 8
-	call SkipMusic
-	ld a, $e3
-	ld [rLCDC], a
-	call Function90d70
-	xor a
-	ld [wJumptableIndex], a
-	ld [wcf64], a
-	ld [wcf65], a
-	ld [wcf66], a
-	ld [wc6d2], a
-	ld [wc6d1], a
-	ld [wc6d3], a
-	ld [wc6d9], a
-	ld [wc6da], a
-	ld [wc6db], a
-	call Function90d9e
-	call Function90da8
-	ld b, SCGB_02
-	call GetSGBLayout
-	call SetPalettes
-	ld a, [hCGB]
-	and a
-	ret z
-	ld a, $e4
-	call Functioncf8
-	ret
-
-Function90c4e: ; 90c4e
-	call Functiond79
-	ld hl, TownMapGFX
-	ld de, VTiles2
-	ld a, BANK(TownMapGFX)
-	call FarDecompress
-
-	ld hl, PokegearGFX
-	ld de, VTiles2 + $300
-	ld a, BANK(PokegearGFX)
-	call FarDecompress
-
-	ld hl, PokegearSpritesGFX
-	ld de, VTiles0
-	ld a, BANK(PokegearSpritesGFX)
-	call Decompress
-
-	ld a, [MapGroup]
-	ld b, a
-	ld a, [MapNumber]
-	ld c, a
-	call GetWorldMapLocation
-	cp FAST_SHIP
-	jr z, .ssaqua
-
-	callba GetPlayerIcon
-
-	push de
-	ld h, d
-	ld l, e
-	ld a, b
-
-	push af
-	ld de, VTiles0 tile $10
-	ld bc, $40
-	call FarCopyBytes
-	pop af
-
-	pop hl
-
-	ld de, $c0
-	add hl, de
-	ld de, VTiles0 tile $14
-	ld bc, $40
-	call FarCopyBytes
-	ret
-
-.ssaqua
-	ld hl, FastShipGFX
-	ld de, VTiles0 tile $10
-	ld bc, $80
-	call CopyBytes
-	ret
-; 90cb2
-
-FastShipGFX: ; 90cb2
-INCBIN "gfx/misc/fast_ship.2bpp"
-; 90d32
-
-Function90d32: ; 90d32 (24:4d32)
-	lb de, $24, $10
-	ld a, SPRITE_ANIM_INDEX_0D
-	call _InitSpriteAnimStruct
-	ld hl, $3
-	add hl, bc
-	ld [hl], $0
-	ret
-
-Function90d41: ; 90d41 (24:4d41)
-	ld hl, wcf64
-	ld e, [hl]
-	ld d, 0
-	ld hl, Unknown_90d52
-	add hl, de
-	ld a, [hl]
-	ld hl, $6
-	add hl, bc
-	ld [hl], a
-	ret
-; 90d52 (24:4d52)
-
-Unknown_90d52: ; 90d52
-	db $00, $10, $20, $30
-; 90d56
-
-Function90d56: ; 90d56
-	ld a, [MapGroup]
-	ld b, a
-	ld a, [MapNumber]
-	ld c, a
-	call GetWorldMapLocation
-	cp SPECIAL_MAP
-	ret nz
-	ld a, [BackupMapGroup]
-	ld b, a
-	ld a, [BackupMapNumber]
-	ld c, a
-	call GetWorldMapLocation
-	ret
-; 90d70
-
-
-Function90d70: ; 90d70 (24:4d70)
-	ld a, [MapGroup]
-	ld b, a
-	ld a, [MapNumber]
-	ld c, a
-	call GetWorldMapLocation
-
-	cp FAST_SHIP
-	jr z, .asm_90d95
-
-	cp SPECIAL_MAP
-	jr nz, .asm_90d8e
-
-	ld a, [BackupMapGroup]
-	ld b, a
-	ld a, [BackupMapNumber]
-	ld c, a
-	call GetWorldMapLocation
-
-.asm_90d8e
-	ld [wc6d8], a
-	ld [wc6d7], a
-	ret
-
-.asm_90d95
-	ld [wc6d8], a
-	ld a, NEW_BARK_TOWN
-	ld [wc6d7], a
-	ret
-
-Function90d9e: ; 90d9e (24:4d9e)
-	ld a, $0
-	ld [wJumptableIndex], a
-	xor a
-	ld [wcf64], a
-	ret
-
-Function90da8: ; 90da8 (24:4da8)
-	xor a
-	ld [hBGMapMode], a
-	hlcoord 0, 0
-	ld bc, TileMapEnd - TileMap
-	ld a, $4f
-	call ByteFill
-	ld a, [wcf64]
-	and $3
-	add a
-	ld e, a
-	ld d, 0
-	ld hl, Jumptable_90e12
-	add hl, de
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld de, .asm_90dcb
-	push de
-	jp [hl]
-
-.asm_90dcb
-	call Function90eb0
-	callba TownMapPals
-	ld a, [wcf65]
-	and a
-	jr nz, .asm_90de8
-
-	xor a
-	ld [hBGMapAddress], a
-	ld a, VBGMap0 / $100
-	ld [hBGMapAddress + 1], a
-	call Function90e00
-	ld a, $90
-	jr .asm_90df3
-
-.asm_90de8
-	xor a
-	ld [hBGMapAddress], a
-	ld a, VBGMap1 / $100
-	ld [hBGMapAddress + 1], a
-	call Function90e00
-	xor a
-
-.asm_90df3
-	ld [hWY], a
-	ld a, [wcf65]
-	and 1
-	xor 1
-	ld [wcf65], a
-	ret
-
-Function90e00: ; 90e00 (24:4e00)
-	ld a, [hCGB]
-	and a
-	jr z, .asm_90e0e
-	ld a, $2
-	ld [hBGMapMode], a
-	ld c, 3
-	call DelayFrames
-.asm_90e0e
-	call WaitBGMap
-	ret
-; 90e12 (24:4e12)
-
-Jumptable_90e12: ; 90e12
-	dw Function90e1a
-	dw Function90e3f
-	dw Function90e82
-	dw Function90e72
-; 90e1a
-
-Function90e1a: ; 90e1a
-	ld de, ClockTilemapRLE
-	call Function914bb
-	hlcoord 12, 1
-	ld de, .switch
-	call PlaceString
-	hlcoord 0, 12
-	lb bc, 4, 18
-	call TextBox
-	call Function90f86
-	ret
-; 90e36 (24:4e36)
-
-.switch
-	db " SWITCH▶@"
-; 90e3f
-
-Function90e3f: ; 90e3f
-
-	ld a, [wc6d8]
-	cp FAST_SHIP
-	jr z, .johto
-	cp KANTO_LANDMARK
-	jr nc, .kanto
-.johto
-	ld e, 0
-	jr .ok
-.kanto
-	ld e, 1
-.ok
-	callba Function91ae1
-	ld a, $7
-	ld bc, $12
-	hlcoord 1, 2
-	call ByteFill
-	hlcoord 0, 2
-	ld [hl], $6
-	hlcoord 19, 2
-	ld [hl], $17
-	ld a, [wc6d7]
-	call Function910b4
-	ret
-; 90e72
-
-Function90e72: ; 90e72
-	ld de, RadioTilemapRLE
-	call Function914bb
-	hlcoord 0, 12
-	lb bc, 4, 18
-	call TextBox
-	ret
-; 90e82
-
-Function90e82: ; 90e82
-	ld de, PhoneTilemapRLE
-	call Function914bb
-	hlcoord 0, 12
-	lb bc, 4, 18
-	call TextBox
-	call Function90e98
-	call Function912d8
-	ret
-; 90e98
-
-Function90e98: ; 90e98 (24:4e98)
-	hlcoord 17, 1
-	ld a, $3c
-	ld [hli], a
-	inc a
-	ld [hl], a
-	hlcoord 17, 2
-	inc a
-	ld [hli], a
-	call GetMapHeaderPhoneServiceNybble
-	and a
-	ret nz
-	hlcoord 18, 2
-	ld [hl], $3f
-	ret
-
-Function90eb0: ; 90eb0 (24:4eb0)
-	hlcoord 0, 0
-	ld bc, $8
-	ld a, $4f
-	call ByteFill
-	hlcoord 0, 1
-	ld bc, $8
-	ld a, $4f
-	call ByteFill
-	ld de, wPokegearFlags
-	ld a, [de]
-	bit 0, a
-	call nz, Function90ee4
-	ld a, [de]
-	bit 2, a
-	call nz, Function90eeb
-	ld a, [de]
-	bit 1, a
-	call nz, Function90ef2
-	hlcoord 0, 0
-	ld a, $46
-	call Function90ef7
-	ret
-
-Function90ee4: ; 90ee4 (24:4ee4)
-	hlcoord 2, 0
-	ld a, $40
-	jr Function90ef7
-
-Function90eeb: ; 90eeb (24:4eeb)
-	hlcoord 4, 0
-	ld a, $44
-	jr Function90ef7
-
-Function90ef2: ; 90ef2 (24:4ef2)
-	hlcoord 6, 0
-	ld a, $42
-
-Function90ef7: ; 90ef7 (24:4ef7)
-	ld [hli], a
-	inc a
-	ld [hld], a
-	ld bc, $14
-	add hl, bc
-	add $f
-	ld [hli], a
-	inc a
-	ld [hld], a
-	ret
-
-Function90f04: ; 90f04 (24:4f04)
-	ld a, [wJumptableIndex]
-	ld e, a
-	ld d, 0
-	ld hl, Jumptable_90f13
-rept 2
-	add hl, de
-endr
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	jp [hl]
-
-Jumptable_90f13: ; 90f13 (24:4f13)
-	dw Function90f2d
-	dw Function90f3e
-	dw Function90fb4
-	dw Function90fcd
-	dw Function90fee
-	dw Function90fcd
-	dw Function90fe9
-	dw Function91156
-	dw Function91171
-	dw Function911eb
-	dw Function91256
-	dw Function910f9
-	dw Function91112
-
-
-Function90f2d: ; 90f2d (24:4f2d)
-	call Function90da8
-	ld hl, UnknownText_0x914d3
-	call PrintText
-	ld hl, wJumptableIndex
-	inc [hl]
-	call Function91492
-	ret
-
-Function90f3e: ; 90f3e (24:4f3e)
-	call Function90f7b
-	ld hl, hJoyLast
-
-	ld a, [hl]
-	and A_BUTTON + B_BUTTON + START + SELECT
-	jr nz, .asm_90f75
-
-	ld a, [hl]
-	and D_RIGHT
-	ret z
-
-	ld a, [wPokegearFlags]
-	bit 0, a
-	jr z, .asm_90f5a
-	ld c, $2
-	ld b, $1
-	jr .asm_90f71
-.asm_90f5a
-
-	ld a, [wPokegearFlags]
-	bit 2, a
-	jr z, .asm_90f67
-	ld c, $7
-	ld b, $2
-	jr .asm_90f71
-.asm_90f67
-
-	ld a, [wPokegearFlags]
-	bit 1, a
-	ret z
-
-	ld c, $b
-	ld b, $3
-
-.asm_90f71
-	call Function91480
-	ret
-
-.asm_90f75
-	ld hl, wJumptableIndex
-	set 7, [hl]
-	ret
-
-Function90f7b: ; 90f7b (24:4f7b)
-	xor a
-	ld [hBGMapMode], a
-	call Function90f86
-	ld a, $1
-	ld [hBGMapMode], a
-	ret
-
-Function90f86: ; 90f86 (24:4f86)
-	hlcoord 3, 5
-	lb bc, 5, 14
-	call ClearBox
-	ld a, [hHours]
-	ld b, a
-	ld a, [hMinutes]
-	ld c, a
-	decoord 6, 8
-	callba PrintHoursMins
-	ld hl, UnknownText_0x90faf
-	bccoord 6, 6
-	call PlaceWholeStringInBoxAtOnce
-	ret
-; 90fa8 (24:4fa8)
-
-String_90fa8: db "ごぜん@"
-String_90fac: db "ごご@"
-
-UnknownText_0x90faf: ; 0x90faf
-	text_jump UnknownText_0x1c5821
-	db "@"
-; 0x90fb4
-
-Function90fb4: ; 90fb4 (24:4fb4)
-	ld a, [wc6d8]
-	cp FAST_SHIP
-	jr z, .johto
-	cp KANTO_LANDMARK
-	jr nc, .kanto
-.johto
-	ld a, 3
-	jr .done
-
-	ret
-
-.kanto
-	ld a, 5
-.done
-	ld [wJumptableIndex], a
-	call Function91492
-	ret
-
-Function90fcd: ; 90fcd (24:4fcd)
-	call Function90da8
-	ld a, [wc6d8]
-	call Function9106a
-	ld a, [wc6d7]
-	call Function91098
-	ld a, c
-	ld [wc6d5], a
-	ld a, b
-	ld [wc6d6], a
-	ld hl, wJumptableIndex
-	inc [hl]
-	ret
-
-Function90fe9: ; 90fe9 (24:4fe9)
-	call Function910e8
-	jr Function90ff2
-
-Function90fee: ; 90fee (24:4fee)
-	ld d, $2e
-	ld e, $1
-Function90ff2: ; 90ff2 (24:4ff2)
-	ld hl, hJoyLast
-	ld a, [hl]
-	and B_BUTTON
-	jr nz, .cancel
-	ld a, [hl]
-	and D_RIGHT
-	jr nz, .right
-	ld a, [hl]
-	and D_LEFT
-	jr nz, .left
-	call Function9102f
-	ret
-
-.right
-	ld a, [wPokegearFlags]
-	bit 2, a
-	jr z, .asm_91015
-	ld c, $7
-	ld b, $2
-	jr .done
-
-.asm_91015
-	ld a, [wPokegearFlags]
-	bit 1, a
-	ret z
-	ld c, $b
-	ld b, $3
-	jr .done
-
-.left
-	ld c, $0
-	ld b, $0
-.done
-	call Function91480
-	ret
-.cancel
-	ld hl, wJumptableIndex
-	set 7, [hl]
-	ret
-
-Function9102f: ; 9102f (24:502f)
-	ld hl, hJoyLast
-	ld a, [hl]
-	and D_UP
-	jr nz, .up
-	ld a, [hl]
-	and D_DOWN
-	jr nz, .down
-	ret
-.up
-	ld hl, wc6d7
-	ld a, [hl]
-	cp d
-	jr c, .asm_91047
-	ld a, e
-	dec a
-	ld [hl], a
-.asm_91047
-	inc [hl]
-	jr .done
-
-.down
-	ld hl, wc6d7
-	ld a, [hl]
-	cp e
-	jr nz, .asm_91054
-	ld a, d
-	inc a
-	ld [hl], a
-.asm_91054
-	dec [hl]
-
-.done
-	ld a, [wc6d7]
-	call Function910b4
-	ld a, [wc6d5]
-	ld c, a
-	ld a, [wc6d6]
-	ld b, a
-	ld a, [wc6d7]
-	call Function910d4
-	ret
-
-Function9106a: ; 9106a
-	push af
-	ld de, 0
-	ld b, SPRITE_ANIM_INDEX_0A
-	ld a, [PlayerGender]
-	bit 0, a
-	jr z, .asm_91079
-	ld b, SPRITE_ANIM_INDEX_1E
-
-.asm_91079
-	ld a, b
-	call _InitSpriteAnimStruct
-	ld hl, $3
-	add hl, bc
-	ld [hl], $10
-	pop af
-	ld e, a
-	push bc
-	callba GetLandmarkCoords
-	pop bc
-	ld hl, $4
-	add hl, bc
-	ld [hl], e
-	ld hl, $5
-	add hl, bc
-	ld [hl], d
-	ret
-; 91098
-
-Function91098: ; 91098
-	push af
-	ld de, 0
-	ld a, SPRITE_ANIM_INDEX_0D
-	call _InitSpriteAnimStruct
-	ld hl, $3
-	add hl, bc
-	ld [hl], $4
-	ld hl, $2
-	add hl, bc
-	ld [hl], $0
-	pop af
-	push bc
-	call Function910d4
-	pop bc
-	ret
-; 910b4
-
-Function910b4: ; 910b4
-	push af
-	hlcoord 8, 0
-	lb bc, 2, 12
-	call ClearBox
-	pop af
-	ld e, a
-	push de
-	callba GetLandmarkName
-	pop de
-	callba Function1de2c5
-	hlcoord 8, 0
-	ld [hl], $34
-	ret
-; 910d4
-
-Function910d4: ; 910d4
-	push bc
-	ld e, a
-	callba GetLandmarkCoords
-	pop bc
-	ld hl, $4
-	add hl, bc
-	ld [hl], e
-	ld hl, $5
-	add hl, bc
-	ld [hl], d
-	ret
-; 910e8
-
-Function910e8: ; 910e8
-	ld a, [StatusFlags]
-	bit 6, a
-	jr z, .asm_910f4
-	ld d, $5e
-	ld e, $2f
-	ret
-
-.asm_910f4
-	ld d, $5e
-	ld e, $58
-	ret
-; 910f9
-
-
-Function910f9: ; 910f9 (24:50f9)
-	call Function90da8
-	lb de, $24, $54
-	ld a, SPRITE_ANIM_INDEX_14
-	call _InitSpriteAnimStruct
-	ld hl, $3
-	add hl, bc
-	ld [hl], $8
-	call _UpdateRadioStation
-	ld hl, wJumptableIndex
-	inc [hl]
-	ret
-
-Function91112: ; 91112 (24:5112)
-	ld hl, hJoyLast
-	ld a, [hl]
-	and B_BUTTON
-	jr nz, .cancel
-	ld a, [hl]
-	and D_LEFT
-	jr nz, .left
-	ld a, [wc6da]
-	ld l, a
-	ld a, [wc6db]
-	ld h, a
-	ld a, [wc6d9]
-	and a
-	ret z
-	rst FarCall
-	ret
-
-.left
-	ld a, [wPokegearFlags]
-	bit 2, a
-	jr z, .asm_9113b
-	ld c, $7
-	ld b, $2
-	jr .asm_9114c
-
-.asm_9113b
-	ld a, [wPokegearFlags]
-	bit 0, a
-	jr z, .asm_91148
-	ld c, $2
-	ld b, $1
-	jr .asm_9114c
-
-.asm_91148
-	ld c, $0
-	ld b, $0
-.asm_9114c
-	call Function91480
-	ret
-
-.cancel
-	ld hl, wJumptableIndex
-	set 7, [hl]
-	ret
-
-Function91156: ; 91156 (24:5156)
-	ld hl, wJumptableIndex
-	inc [hl]
-	xor a
-	ld [wc6d2], a
-	ld [wc6d1], a
-	ld [wc6d3], a
-	call Function90da8
-	call Function91492
-	ld hl, UnknownText_0x914ce
-	call PrintText
-	ret
-
-Function91171: ; 91171 (24:5171)
-	ld hl, hJoyPressed
-	ld a, [hl]
-	and B_BUTTON
-	jr nz, .b
-	ld a, [hl]
-	and A_BUTTON
-	jr nz, .a
-	ld hl, hJoyLast
-	ld a, [hl]
-	and D_LEFT
-	jr nz, .left
-	ld a, [hl]
-	and D_RIGHT
-	jr nz, .right
-	call Function9126d
-	ret
-
-.left
-	ld a, [wPokegearFlags]
-	bit 0, a
-	jr z, .asm_9119c
-	ld c, $2
-	ld b, $1
-	jr .asm_911ac
-.asm_9119c
-	ld c, $0
-	ld b, $0
-	jr .asm_911ac
-
-.right
-	ld a, [wPokegearFlags]
-	bit 1, a
-	ret z
-	ld c, $b
-	ld b, $3
-.asm_911ac
-	call Function91480
-	ret
-
-.b
-	ld hl, wJumptableIndex
-	set 7, [hl]
-	ret
-
-.a
-	ld hl, wPhoneList
-	ld a, [wc6d2]
-	ld e, a
-	ld d, 0
-	add hl, de
-	ld a, [wc6d1]
-	ld e, a
-	ld d, 0
-	add hl, de
-	ld a, [hl]
-	and a
-	ret z
-
-	ld [wc6d3], a
-	hlcoord 1, 4
-	ld a, [wc6d1]
-	ld bc, 20 * 2
-	call AddNTimes
-	ld [hl], "▷"
-	call Function91342
-	jr c, .asm_911e5
-
-	ld hl, wJumptableIndex
-	inc [hl]
-	ret
-
-.asm_911e5
-	ld a, $8
-	ld [wJumptableIndex], a
-	ret
-
-Function911eb: ; 911eb (24:51eb)
-	call GetMapHeaderPhoneServiceNybble
-	and a
-	jr nz, .asm_91234
-	ld hl, Options
-	res NO_TEXT_SCROLL, [hl]
-	xor a
-	ld [hInMenu], a
-	ld de, SFX_CALL
-	call PlaySFX
-	ld hl, UnknownText_0x9124c
-	call PrintText
-	call WaitSFX
-	ld de, SFX_CALL
-	call PlaySFX
-	ld hl, UnknownText_0x9124c
-	call PrintText
-	call WaitSFX
-	ld a, [wc6d3]
-	ld b, a
-	call Function90199
-	ld c, 10
-	call DelayFrames
-	ld hl, Options
-	set NO_TEXT_SCROLL, [hl]
-	ld a, $1
-	ld [hInMenu], a
-	call Function912b7
-	ld hl, wJumptableIndex
-	inc [hl]
-	ret
-.asm_91234
-	callba Phone_NoSignal
-	ld hl, OutOfServiceAreaText
-	call PrintText
-	ld a, $8
-	ld [wJumptableIndex], a
-	ld hl, UnknownText_0x914ce
-	call PrintText
-	ret
-; 9124c (24:524c)
-
-UnknownText_0x9124c: ; 0x9124c
-	;
-	text_jump UnknownText_0x1c5824
-	db "@"
-; 0x91251
-
-OutOfServiceAreaText: ; 0x91251
-	; You're out of the service area.
-	text_jump UnknownText_0x1c5827
-	db "@"
-; 0x91256
-
-Function91256: ; 91256 (24:5256)
-	ld a, [hJoyPressed]
-	and A_BUTTON | B_BUTTON
-	ret z
-	callba HangUp
-	ld a, $8
-	ld [wJumptableIndex], a
-	ld hl, UnknownText_0x914ce
-	call PrintText
-	ret
-
-Function9126d: ; 9126d (24:526d)
-	ld hl, hJoyLast
-	ld a, [hl]
-	and D_UP
-	jr nz, .up
-	ld a, [hl]
-	and D_DOWN
-	jr nz, .down
-	ret
-
-.up
-	ld hl, wc6d1
-	ld a, [hl]
-	and a
-	jr z, .asm_91285
-	dec [hl]
-	jr .asm_912a3
-
-.asm_91285
-	ld hl, wc6d2
-	ld a, [hl]
-	and a
-	ret z
-	dec [hl]
-	jr .asm_912ad
-
-.down
-	ld hl, wc6d1
-	ld a, [hl]
-	cp $3
-	jr nc, .asm_91299
-	inc [hl]
-	jr .asm_912a3
-
-.asm_91299
-	ld hl, wc6d2
-	ld a, [hl]
-	cp $6
-	ret nc
-	inc [hl]
-	jr .asm_912ad
-
-.asm_912a3
-	xor a
-	ld [hBGMapMode], a
-	call Function912b7
-	call WaitBGMap
-	ret
-
-.asm_912ad
-	xor a
-	ld [hBGMapMode], a
-	call Function912d8
-	call WaitBGMap
-	ret
-
-Function912b7: ; 912b7 (24:52b7)
-	ld a, " "
-	hlcoord 1, 4
-	ld [hl], a
-	hlcoord 1, 6
-	ld [hl], a
-	hlcoord 1, 8
-	ld [hl], a
-	hlcoord 1, 10
-	ld [hl], a
-	hlcoord 1, 4
-	ld a, [wc6d1]
-	ld bc, $28
-	call AddNTimes
-	ld [hl], "▶"
-	ret
-
-Function912d8: ; 912d8 (24:52d8)
-	hlcoord 1, 3
-	ld b, $9
-	ld a, $7f
-.asm_912df
-	ld c, $12
-.asm_912e1
-	ld [hli], a
-	dec c
-	jr nz, .asm_912e1
-rept 2
-	inc hl
-endr
-	dec b
-	jr nz, .asm_912df
-	ld a, [wc6d2]
-	ld e, a
-	ld d, $0
-	ld hl, wPhoneList
-	add hl, de
-	xor a
-	ld [wc6d0], a
-.asm_912f8
-	ld a, [hli]
-	push hl
-	push af
-	hlcoord 2, 4
-	ld a, [wc6d0]
-	ld bc, $28
-	call AddNTimes
-	ld d, h
-	ld e, l
-	pop af
-	ld b, a
-	call Function90380
-	pop hl
-	ld a, [wc6d0]
-	inc a
-	ld [wc6d0], a
-	cp $4
-	jr c, .asm_912f8
-	call Function912b7
-	ret
-; 9131e (24:531e)
-
-Function9131e: ; 9131e
-	ld hl, wPhoneList
-	ld a, [wc6d2]
-	ld e, a
-	ld d, 0
-	add hl, de
-	ld a, [wc6d1]
-	ld e, a
-	ld d, 0
-	add hl, de
-	ld [hl], 0
-	ld hl, wPhoneList
-	ld c, $a
-.asm_91336
-	ld a, [hli]
-	and a
-	jr nz, .asm_9133e
-	ld a, [hld]
-	ld [hli], a
-	ld [hl], 0
-.asm_9133e
-	dec c
-	jr nz, .asm_91336
-	ret
-; 91342
-
-Function91342: ; 91342 (24:5342)
-	ld hl, wPhoneList
-	ld a, [wc6d2]
-	ld e, a
-	ld d, 0
-	add hl, de
-	ld a, [wc6d1]
-	ld e, a
-	ld d, 0
-	add hl, de
-	ld c, [hl]
-	callba Function9038a
-	ld a, c
-	and a
-	jr z, .asm_91366
-
-	ld hl, Jumptable_91455
-	ld de, Unknown_9143f
-	jr .asm_9136c
-
-.asm_91366
-	ld hl, Jumptable_9146a
-	ld de, Unknown_9145b
-
-.asm_9136c
-	xor a
-	ld [hBGMapMode], a
-	push hl
-	push de
-	ld a, [de]
-	ld l, a
-	inc de
-	ld a, [de]
-	ld h, a
-	inc de
-	push hl
-	ld bc, hBGMapAddress + 1
-	add hl, bc
-	ld a, [de]
-	inc de
-	sla a
-	ld b, a
-	ld c, 8
-	push de
-	call TextBox
-	pop de
-	pop hl
-	inc hl
-	call PlaceString
-	pop de
-	xor a
-	ld [wc6d4], a
-	call Function9141d
-	call WaitBGMap
-
-.asm_91398
-	push de
-	call JoyTextDelay
-	pop de
-	ld hl, hJoyPressed
-	ld a, [hl]
-	and D_UP
-	jr nz, .asm_913b4
-	ld a, [hl]
-	and D_DOWN
-	jr nz, .asm_913c1
-	ld a, [hl]
-	and A_BUTTON | B_BUTTON
-	jr nz, .asm_913d4
-	call DelayFrame
-	jr .asm_91398
-
-.asm_913b4
-	ld hl, wc6d4
-	ld a, [hl]
-	and a
-	jr z, .asm_91398
-	dec [hl]
-	call Function9141d
-	jr .asm_91398
-
-.asm_913c1
-	ld hl, 2
-	add hl, de
-	ld a, [wc6d4]
-	inc a
-	cp [hl]
-	jr nc, .asm_91398
-	ld [wc6d4], a
-	call Function9141d
-	jr .asm_91398
-
-.asm_913d4
-	xor a
-	ld [hBGMapMode], a
-	call Function912d8
-	ld a, $1
-	ld [hBGMapMode], a
-	pop hl
-	ld a, [hJoyPressed]
-	and B_BUTTON
-	jr nz, Function913f1
-
-	ld a, [wc6d4]
-	ld e, a
-	ld d, 0
-rept 2
-	add hl, de
-endr
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	jp [hl]
-
-Function913f1: ; 913f1
-	ld hl, UnknownText_0x914ce
-	call PrintText
-	scf
-	ret
-; 913f9 (24:53f9)
-
-Function913f9: ; 913f9
-	ld hl, UnknownText_0x914d8
-	call MenuTextBox
-	call YesNoBox
-	call ExitMenu
-	jr c, .asm_91419
-	call Function9131e
-	xor a
-	ld [hBGMapMode], a
-	call Function912d8
-	ld hl, UnknownText_0x914ce
-	call PrintText
-	call WaitBGMap
-.asm_91419
-	scf
-	ret
-; 9141b
-
-Function9141b: ; 9141b
-	and a
-	ret
-; 9141d
-
-Function9141d: ; 9141d (24:541d)
-	push de
-	ld a, [de]
-	inc de
-	ld l, a
-	ld a, [de]
-	inc de
-	ld h, a
-	ld a, [de]
-	ld c, a
-	push hl
-	ld a, " "
-	ld de, 20 * 2
-.asm_9142c
-	ld [hl], a
-	add hl, de
-	dec c
-	jr nz, .asm_9142c
-	pop hl
-	ld a, [wc6d4]
-	ld bc, 20 * 2
-	call AddNTimes
-	ld [hl], "▶"
-	pop de
-	ret
-; 9143f (24:543f)
-
-Unknown_9143f: ; 9143f
-	dwcoord 10, 6
-	db 3
-	db   "CALL"
-	next "DELETE"
-	next "CANCEL"
-	db   "@"
-; 91455
-
-Jumptable_91455: ; 91455
-	dw Function9141b
-	dw Function913f9
-	dw Function913f1
-; 9145b
-
-Unknown_9145b: ; 9145b
-	dwcoord 10, 8
-	db 2
-	db   "CALL"
-	next "CANCEL"
-	db   "@"
-; 9146a
-
-Jumptable_9146a: ; 9146a
-	dw Function9141b
-	dw Function913f1
-; 9146e
-
-
-Function9146e: ; 9146e
-	ld a, [hHours]
-	cp 12
-	jr c, .asm_9147b
-	sub 12
-	ld [wd265], a
-	scf
-	ret
-
-.asm_9147b
-	ld [wd265], a
-	and a
-	ret
-; 91480
-
-
-Function91480: ; 91480 (24:5480)
-	ld de, SFX_READ_TEXT_2
-	call PlaySFX
-	ld a, c
-	ld [wJumptableIndex], a
-	ld a, b
-	ld [wcf64], a
-	call DeleteSpriteAnimStruct2ToEnd
-	ret
-
-Function91492: ; 91492
-	ld a, [wc6dc]
-	cp $fe
-	jr z, .asm_914a3
-	cp $ff
-	call z, EnterMapMusic
-	xor a
-	ld [wc6dc], a
-	ret
-
-.asm_914a3
-	call RestartMapMusic
-	xor a
-	ld [wc6dc], a
-	ret
-; 914ab
-
-
-DeleteSpriteAnimStruct2ToEnd: ; 914ab (24:54ab)
-	ld hl, SpriteAnim2
-	ld bc, wSpriteAnimationStructsEnd - SpriteAnim2
-	xor a
-	call ByteFill
-	ld a, 2
-	ld [wSpriteAnimCount], a
-	ret
-
-Function914bb: ; 914bb (24:54bb)
-	hlcoord 0, 0
-.asm_914be
-	ld a, [de]
-	cp $ff
-	ret z
-	ld b, a
-	inc de
-	ld a, [de]
-	ld c, a
-	inc de
-	ld a, b
-.asm_914c8
-	ld [hli], a
-	dec c
-	jr nz, .asm_914c8
-	jr .asm_914be
-; 914ce (24:54ce)
-
-UnknownText_0x914ce: ; 0x914ce
-	; Whom do you want to call?
-	text_jump UnknownText_0x1c5847
-	db "@"
-; 0x914d3
-
-UnknownText_0x914d3: ; 0x914d3
-	; Press any button to exit.
-	text_jump UnknownText_0x1c5862
-	db "@"
-; 0x914d8
-
-UnknownText_0x914d8: ; 0x914d8
-	; Delete this stored phone number?
-	text_jump UnknownText_0x1c587d
-	db "@"
-; 0x914dd
-
-
-PokegearSpritesGFX: ; 914dd
-INCBIN "gfx/misc/pokegear_sprites.2bpp.lz"
-; 9150d
-
-RadioTilemapRLE: ; 9150d
-INCBIN "gfx/unknown/09150d.tilemap.rle"
-
-PhoneTilemapRLE: ; 9158a
-INCBIN "gfx/unknown/09158a.tilemap.rle"
-
-ClockTilemapRLE: ; 915db
-INCBIN "gfx/unknown/0915db.tilemap.rle"
-; 9163e
-
-INCLUDE "engine/radio2.asm"
-INCLUDE "engine/town_map.asm"
 INCLUDE "data/wild/fish.asm"
 INCLUDE "engine/slot_machine.asm"
 
--- a/vram.asm
+++ b/vram.asm
@@ -11,3 +11,4 @@
 VTiles5:: ds $800
 VBGMap2:: ds $400
 VBGMap3:: ds $400
+VRAM_End::