shithub: pokecrystal

Download patch

ref: 40b4c87db7e9472d99186b67bdec3d48a2132e73
parent: 4e36d85ee966f8f22531183679549061263b2166
parent: 60dde1d03ed43de1e7ef777e4198963620c73958
author: Bryan Bishop <[email protected]>
date: Thu Sep 5 07:30:12 EDT 2013

Merge pull request #188 from yenatch/split-common

recomment and split out a ton of common asm (bank 0)

--- a/constants.asm
+++ b/constants.asm
@@ -23,99 +23,7 @@
 Bankswitch EQU $10
 JumpTable  EQU $28
 
-
-dwb: MACRO
-	dw \1
-	db \2
-	ENDM
-
-dbw: MACRO
-	db \1
-	dw \2
-	ENDM
-
-dn: MACRO
-	db \1 << 4 + \2
-	ENDM
-
-dt: MACRO ; three-byte (big-endian)
-	db (\1 >> 16) & $ff
-	db (\1 >> 8) & $ff
-	db \1 & $ff
-	ENDM
-
-bigdw: MACRO ; big-endian word
-	dw ((\1)/$100) + (((\1)&$ff)*$100)
-	ENDM
-
-callab: MACRO ; address, bank
-	ld hl, \1
-	ld a, BANK(\1)
-	rst FarCall
-	ENDM
-
-callba: MACRO ; bank, address
-	ld a, BANK(\1)
-	ld hl, \1
-	rst FarCall
-	ENDM
-
-TX_RAM: MACRO
-	db 1
-	dw \1
-	ENDM
-
-TX_FAR: MACRO
-	db $16
-	dw \1
-	db BANK(\1)
-	ENDM
-
-RGB: MACRO
-	dw ((\3 << 10) | (\2 << 5) | (\1))
-	ENDM
-
-note: MACRO
-	db \1
-	ENDM
-
-; It's better to use *coord than FuncCoord.
-FuncCoord: MACRO
-Coord = $c4a0 + 20 * \2 + \1
-	ENDM
-
-bccoord: MACRO
-	FuncCoord \1, \2
-	ld bc, Coord
-	ENDM
-	
-decoord: MACRO
-	FuncCoord \1, \2
-	ld de, Coord
-	ENDM
-
-hlcoord: MACRO
-	FuncCoord \1, \2
-	ld hl, Coord
-	ENDM
-
-
-; pic animations
-frame: MACRO
-	db \1
-	db \2
-	ENDM
-setrepeat: MACRO
-	db $fe
-	db \1
-	ENDM
-dorepeat: MACRO
-	db $fd
-	db \1
-	ENDM
-endanim: MACRO
-	db $ff
-	ENDM
+INCLUDE "macros.asm"
 
 
 NONE       EQU 0
--- /dev/null
+++ b/engine/delay.asm
@@ -1,0 +1,23 @@
+DelayFrame: ; 45a
+; Wait for one frame
+	ld a, 1
+	ld [VBlankOccurred], a
+
+; Wait for the next VBlank, halting to conserve battery
+.halt
+	halt ; rgbasm adds a nop after this instruction by default
+	ld a, [VBlankOccurred]
+	and a
+	jr nz, .halt
+	ret
+; 468
+
+
+DelayFrames: ; 468
+; Wait c frames
+	call DelayFrame
+	dec c
+	jr nz, DelayFrames
+	ret
+; 46f
+
--- /dev/null
+++ b/engine/farcall.asm
@@ -1,0 +1,55 @@
+FarCall_de: ; 2d54
+; Call a:de.
+; Preserves other registers.
+
+	ld [hBuffer], a
+	ld a, [hROMBank]
+	push af
+	ld a, [hBuffer]
+	rst Bankswitch
+	call .de
+	jr ReturnFarCall
+
+.de
+	push de
+	ret
+; 2d63
+
+
+FarCall_hl: ; 2d63
+; Call a:hl.
+; Preserves other registers.
+
+	ld [hBuffer], a
+	ld a, [hROMBank]
+	push af
+	ld a, [hBuffer]
+	rst Bankswitch
+	call Function2d82
+; 2d6e
+
+ReturnFarCall: ; 2d6e
+; We want to retain the contents of f.
+; To do this, we can pop to bc instead of af.
+	
+	ld a, b
+	ld [$cfb9], a
+	ld a, c
+	ld [$cfba], a
+	
+; Restore the working bank.
+	pop bc
+	ld a, b
+	rst Bankswitch
+	
+	ld a, [$cfb9]
+	ld b, a
+	ld a, [$cfba]
+	ld c, a
+	ret
+; 2d82
+
+Function2d82: ; 2d82
+	jp [hl]
+; 2d83
+
--- /dev/null
+++ b/engine/game_time.asm
@@ -1,0 +1,132 @@
+ResetGameTime: ; 208a
+	xor a
+	ld [GameTimeCap], a
+	ld [GameTimeHours], a
+	ld [GameTimeHours + 1], a
+	ld [GameTimeMinutes], a
+	ld [GameTimeSeconds], a
+	ld [GameTimeFrames], a
+	ret
+; 209e
+
+
+GameTimer: ; 209e
+
+	nop
+
+	ld a, [rSVBK]
+	push af
+	ld a, 1
+	ld [rSVBK], a
+
+	call UpdateGameTimer
+
+	pop af
+	ld [rSVBK], a
+	ret
+; 20ad
+
+
+UpdateGameTimer: ; 20ad
+; Increment the game timer by one frame.
+; The game timer is capped at 999:59:59.00.
+
+
+; Don't update if game logic is paused.
+	ld a, [$c2cd]
+	and a
+	ret nz
+
+; Is the timer paused?
+	ld hl, GameTimerPause
+	bit 0, [hl]
+	ret z
+
+; Is the timer already capped?
+	ld hl, GameTimeCap
+	bit 0, [hl]
+	ret nz
+
+
+; +1 frame
+	ld hl, GameTimeFrames
+	ld a, [hl]
+	inc a
+
+	cp 60 ; frames/second
+	jr nc, .second
+
+	ld [hl], a
+	ret
+
+
+.second
+	xor a
+	ld [hl], a
+
+; +1 second
+	ld hl, GameTimeSeconds
+	ld a, [hl]
+	inc a
+
+	cp 60 ; seconds/minute
+	jr nc, .minute
+
+	ld [hl], a
+	ret
+
+
+.minute
+	xor a
+	ld [hl], a
+
+; +1 minute
+	ld hl, GameTimeMinutes
+	ld a, [hl]
+	inc a
+
+	cp 60 ; minutes/hour
+	jr nc, .hour
+
+	ld [hl], a
+	ret
+
+
+.hour
+	xor a
+	ld [hl], a
+
+; +1 hour
+	ld a, [GameTimeHours]
+	ld h, a
+	ld a, [GameTimeHours + 1]
+	ld l, a
+	inc hl
+
+
+; Cap the timer after 1000 hours.
+	ld a, h
+	cp 1000 / $100
+	jr c, .ok
+
+	ld a, l
+	cp 1000 % $100
+	jr c, .ok
+
+	ld hl, GameTimeCap
+	set 0, [hl]
+
+	ld a, 59 ; 999:59:59.00
+	ld [GameTimeMinutes], a
+	ld [GameTimeSeconds], a
+	ret
+
+
+.ok
+	ld a, h
+	ld [GameTimeHours], a
+	ld a, l
+	ld [GameTimeHours + 1], a
+	ret
+; 210f
+
--- /dev/null
+++ b/engine/map_objects.asm
@@ -1,0 +1,683 @@
+; Functions handling map objects.
+
+
+GetSpritePalette: ; 17ff
+	push hl
+	push de
+	push bc
+	ld c, a
+	callba _GetSpritePalette
+	ld a, c
+	pop bc
+	pop de
+	pop hl
+	ret
+; 180e
+
+
+Function180e: ; 180e
+	push hl
+	push bc
+	ld hl, $d156
+	ld c, $1f
+	ld b, a
+	ld a, [hConnectionStripLength]
+	cp $0
+	jr z, .asm_182b
+	ld a, b
+.asm_181d
+	cp [hl]
+	jr z, .asm_1830
+	inc hl
+	inc hl
+	dec c
+	jr nz, .asm_181d
+	ld a, [$d155]
+	scf
+	jr .asm_1833
+
+.asm_182b
+	ld a, [$d155]
+	jr .asm_1833
+
+.asm_1830
+	inc hl
+	xor a
+	ld a, [hl]
+
+.asm_1833
+	pop bc
+	pop hl
+	ret
+; 1836
+
+Function1836: ; 1836
+	push de
+	push hl
+
+	ld b, a
+	ld a, [hROMBank]
+	push af
+	ld a, BANK(Function142a7)
+	rst Bankswitch
+
+	ld a, b
+	call Function142a7
+	ld c, a
+
+	pop de
+	ld a, d
+	rst Bankswitch
+
+	pop hl
+	pop de
+	ret
+; 184a
+
+
+
+Function184a: ; 184a
+	ld a, [StandingTile]
+	call GetTileCollision
+	ld b, a
+	ret
+; 1852
+
+Function1852: ; 1852
+	ld a, [StandingTile]
+	call GetTileCollision
+	sub 1
+	ret z
+	and a
+	ret
+; 185d
+
+
+GetTileCollision: ; 185d
+; Get the collision type of tile a.
+
+	push de
+	push hl
+
+	ld hl, TileCollisionTable
+	ld e, a
+	ld d, 0
+	add hl, de
+
+	ld a, [hROMBank]
+	push af
+	ld a, BANK(TileCollisionTable)
+	rst Bankswitch
+	ld e, [hl]
+	pop af
+	rst Bankswitch
+
+	ld a, e
+	and $f ; lo nybble only
+
+	pop hl
+	pop de
+	ret
+; 1875
+
+
+Function1875: ; 1875
+	ld d, a
+	and $f0
+	cp $10
+	jr z, .asm_1882
+	cp $20
+	jr z, .asm_1888
+	scf
+	ret
+
+.asm_1882
+	ld a, d
+	and 7
+	ret z
+	scf
+	ret
+
+.asm_1888
+	ld a, d
+	and 7
+	ret z
+	scf
+	ret
+; 188e
+
+Function188e: ; 188e
+	cp $14
+	ret z
+	cp $1c
+	ret
+; 1894
+
+CheckCutTreeTile: ; 1894
+	cp $12
+	ret z
+	cp $1a
+	ret
+; 189a
+
+CheckHeadbuttTreeTile: ; 189a
+	cp $15
+	ret z
+	cp $1d
+	ret
+; 18a0
+
+CheckCounterTile: ; 18a0
+	cp $90
+	ret z
+	cp $98
+	ret
+; 18a6
+
+CheckPitTile: ; 18a6
+	cp $60
+	ret z
+	cp $68
+	ret
+; 18ac
+
+CheckIceTile: ; 18ac
+	cp $23
+	ret z
+	cp $2b
+	ret z
+	scf
+	ret
+; 18b4
+
+CheckWhirlpoolTile: ; 18b4
+	nop
+	cp $24
+	ret z
+	cp $2c
+	ret z
+	scf
+	ret
+; 18bd
+
+CheckWaterfallTile: ; 18bd
+	cp $33
+	ret z
+	cp $3b
+	ret
+; 18c3
+
+CheckStandingOnEntrance: ; 18c3
+	ld a, [StandingTile]
+	cp $71 ; door
+	ret z
+	cp $79
+	ret z
+	cp $7a ; stairs
+	ret z
+	cp $7b ; cave
+	ret
+; 18d2
+
+
+GetMapObject: ; 18d2
+; Return the location of map object a in bc.
+	ld hl, MapObjects
+	ld bc, $10
+	call AddNTimes
+	ld b, h
+	ld c, l
+	ret
+; 18de
+
+
+Function18de: ; 18de
+	ld [hConnectionStripLength], a
+	call GetMapObject
+	ld hl, $0000
+	add hl, bc
+	ld a, [hl]
+	cp $ff
+	jr z, .asm_18f3
+	ld [hConnectedMapWidth], a
+	call Function1ae5
+	and a
+	ret
+
+.asm_18f3
+	scf
+	ret
+; 18f5
+
+Function18f5: ; 18f5
+	ld hl, $0006
+	add hl, bc
+	ld a, [hl]
+	cp $ff
+	jr nz, .asm_1921
+	ld hl, $0007
+	add hl, bc
+	ld a, [hl]
+	cp $ff
+	jr z, .asm_191c
+	ld hl, .data_191e
+	ld a, [TimeOfDay]
+	add l
+	ld l, a
+	jr nc, .asm_1912
+	inc h
+
+.asm_1912
+	ld a, [hl]
+	ld hl, $0007
+	add hl, bc
+	and [hl]
+	jr nz, .asm_191c
+	scf
+	ret
+
+.asm_191c
+	and a
+	ret
+
+.data_191e
+	db $1
+	db $2
+	db $4
+
+.asm_1921
+	ld hl, $0006
+	add hl, bc
+	ld d, [hl]
+	ld hl, $0007
+	add hl, bc
+	ld e, [hl]
+	ld hl, hHours
+	ld a, d
+	cp e
+	jr z, .asm_1949
+	jr c, .asm_193f
+	ld a, [hl]
+	cp d
+	jr nc, .asm_1949
+	cp e
+	jr c, .asm_1949
+	jr z, .asm_1949
+	jr .asm_194b
+
+.asm_193f
+	ld a, e
+	cp [hl]
+	jr c, .asm_194b
+	ld a, [hl]
+	cp d
+	jr nc, .asm_1949
+	jr .asm_194b
+
+.asm_1949
+	and a
+	ret
+
+.asm_194b
+	scf
+	ret
+; 194d
+
+Function194d: ; 194d
+	ld [hConnectionStripLength], a
+	call GetMapObject
+	call $40e7
+	ret
+; 1956
+
+
+
+Function1956: ; 1956
+	ld [hConnectionStripLength], a
+	call Function271e
+	ld a, [hConnectionStripLength]
+	call GetMapObject
+	ld a, $2
+	ld hl, $40e7
+	rst FarCall
+	ret
+; 1967
+
+Function1967: ; 1967
+	ld [hConnectionStripLength], a
+	call GetMapObject
+	ld hl, $0000
+	add hl, bc
+	ld a, [hl]
+	cp $ff
+	ret z
+	ld [hl], $ff
+	push af
+	call Function1985
+	pop af
+	call Function1ae5
+	callba Function4357
+	ret
+; 1985
+
+Function1985: ; 1985
+	ld hl, $d4cd
+	cp [hl]
+	jr z, .asm_1990
+	ld hl, $d4ce
+	cp [hl]
+	ret nz
+
+.asm_1990
+	callba Function581f
+	ld a, $ff
+	ld [$d4cd], a
+	ld [$d4ce], a
+	ret
+; 199f
+
+Function199f: ; 199f
+	call Function1967
+	call Function2712
+	ret
+; 19a6
+
+Function19a6: ; 19a6
+	push hl
+	call GetMapObject
+	ld d, b
+	ld e, c
+	ld a, $ff
+	ld [de], a
+	inc de
+	pop hl
+	ld bc, $000f
+	call CopyBytes
+	ret
+; 19b8
+
+Function19b8: ; 19b8
+	call GetMapObject
+	ld hl, $0000
+	add hl, bc
+	ld a, [hl]
+	push af
+	ld [hl], $ff
+	inc hl
+	ld bc, $000f
+	xor a
+	call ByteFill
+	pop af
+	cp $ff
+	ret z
+	cp $d
+	ret nc
+	ld b, a
+	ld a, [$d4cd]
+	cp b
+	jr nz, .asm_19de
+	ld a, $ff
+	ld [$d4cd], a
+
+.asm_19de
+	ld a, b
+	call Function1ae5
+	callba Function4357
+	ret
+; 19e9
+
+
+
+Function19e9: ; 19e9
+	ld [$c2e2], a
+	ld a, [hROMBank]
+	ld [$c2e3], a
+	ld a, l
+	ld [$c2e4], a
+	ld a, h
+	ld [$c2e5], a
+	ld a, [$c2e2]
+	call Function18de
+	ret c
+	ld hl, $0003
+	add hl, bc
+	ld [hl], $14
+	ld hl, $0009
+	add hl, bc
+	ld [hl], $0
+	ld hl, VramState
+	set 7, [hl]
+	and a
+	ret
+; 1a13
+
+
+
+Function1a13: ; 1a13
+	push bc
+	push de
+	ld hl, $d4d6
+	ld de, $0028
+	ld c, $d
+.asm_1a1d
+	ld a, [hl]
+	and a
+	jr z, .asm_1a28
+	add hl, de
+	dec c
+	jr nz, .asm_1a1d
+	xor a
+	jr .asm_1a2c
+
+.asm_1a28
+	ld a, $d
+	sub c
+	scf
+
+.asm_1a2c
+	pop de
+	pop bc
+	ret
+; 1a2f
+
+
+
+Function1a2f: ; 1a2f
+	ld hl, $0003
+	add hl, bc
+	ld a, [hl]
+	cp $25
+	jr c, .asm_1a39
+	xor a
+
+.asm_1a39
+	ld hl, Data4273
+	ld e, a
+	ld d, 0
+	add hl, de
+	add hl, de
+	add hl, de
+	add hl, de
+	add hl, de
+	add hl, de
+	ld a, [hl]
+	ret
+; 1a47
+
+Function1a47: ; 1a47
+	push bc
+	push de
+	ld e, a
+	ld d, 0
+	ld hl, Data4273 + 1
+	add hl, de
+	add hl, de
+	add hl, de
+	add hl, de
+	add hl, de
+	add hl, de
+	ld a, BANK(Data4273)
+	call GetFarByte
+	add a
+	add a
+	and $c
+	pop de
+	pop bc
+	ret
+; 1a61
+
+
+Function1a61: ; 1a61
+	ld l, a
+	ld a, [hROMBank]
+	push af
+	ld a, BANK(Data4273)
+	rst Bankswitch
+	ld a, l
+	push bc
+
+	call Function1a71
+
+	pop bc
+	pop af
+	rst Bankswitch
+
+	ret
+; 1a71
+
+Function1a71: ; 1a71
+	ld hl, $0003
+	add hl, de
+	ld [hl], a
+	push de
+	ld e, a
+	ld d, 0
+	ld hl, Data4273 + 1
+	add hl, de
+	add hl, de
+	add hl, de
+	add hl, de
+	add hl, de
+	add hl, de
+	ld b, h
+	ld c, l
+	pop de
+	ld a, [bc]
+	inc bc
+	rlca
+	rlca
+	and $c
+	ld hl, $0008
+	add hl, de
+	ld [hl], a
+	ld a, [bc]
+	inc bc
+	ld hl, $000b
+	add hl, de
+	ld [hl], a
+	ld a, [bc]
+	inc bc
+	ld hl, $0004
+	add hl, de
+	ld [hl], a
+	ld a, [bc]
+	inc bc
+	ld hl, $0005
+	add hl, de
+	ld [hl], a
+	ld a, [bc]
+	inc bc
+	ld hl, $0006
+	add hl, de
+	ld [hl], a
+	ret
+; 1aae
+
+Function1aae: ; 1aae
+	ld a, [hROMBank]
+	push af
+	ld a, [hli]
+	rst Bankswitch
+
+	ld a, [hli]
+	ld d, [hl]
+	ld hl, $001b
+	add hl, bc
+	add [hl]
+	ld e, a
+	ld a, d
+	adc $0
+	ld d, a
+	inc [hl]
+	ld a, [de]
+	ld h, a
+	pop af
+	rst Bankswitch
+
+	ld a, h
+	ret
+; 1ac6
+
+Function1ac6: ; 1ac6
+	ld hl, VramState
+	set 0, [hl]
+	ret
+; 1acc
+
+Function1acc: ; 1acc
+	ld hl, VramState
+	res 0, [hl]
+	ret
+; 1ad2
+
+
+Function1ad2: ; 1ad2
+	ld a, [VramState]
+	bit 0, a
+	ret z
+	callba Function55e0
+	callba Function5920
+	ret
+; 1ae5
+
+
+Function1ae5: ; 1ae5
+	ld bc, $0028
+	ld hl, $d4d6
+	call AddNTimes
+	ld b, h
+	ld c, l
+	ret
+; 1af1
+
+Function1af1: ; 1af1
+	ld hl, $0000
+	add hl, bc
+	ld a, [hl]
+	and a
+	ret
+; 1af8
+
+Function1af8: ; 1af8
+	push af
+	ld hl, $0008
+	add hl, bc
+	ld a, [hl]
+	and $f3
+	ld e, a
+	pop af
+	and $c
+	or e
+	ld [hl], a
+	ret
+; 1b07
+
+
+GetSpriteDirection: ; 1b07
+	ld hl, $0008
+	add hl, bc
+	ld a, [hl]
+	and $c
+	ret
+; 1b0f
+
--- /dev/null
+++ b/engine/menu.asm
@@ -1,0 +1,603 @@
+; Functions used in displaying and handling menus.
+
+
+LoadMenuDataHeader: ; 0x1d35
+	call Function1d3c
+	call Function1c00
+	ret
+
+Function1d3c: ; 0x1d3c
+	ld de, $cf81
+	ld bc, $0010
+	call CopyBytes
+	ld a, [hROMBank]
+	ld [$cf8a], a
+	ret
+; 0x1d4b
+
+Function1d4b: ; 1d4b
+	ld [$cf88], a
+	ret
+; 1d4f
+
+
+Function1d4f: ; 1d4f
+	push hl
+	call Function1d58
+	pop hl
+	jp PrintText
+; 1d57
+
+Function1d57: ; 1d57
+	ret
+; 1d58
+
+Function1d58: ; 1d58
+	ld hl, MenuDataHeader_0x1d5f
+	call LoadMenuDataHeader
+	ret
+; 1d5f
+
+MenuDataHeader_0x1d5f: ; 1d5f
+	db $40 ; tile backup
+	db 12, 0 ; start coords
+	db 17, 19 ; end coords
+	dw VTiles0
+	db 0 ; default option
+; 1d67
+
+Function1d67: ; 1d67
+	call Function1d4f
+	call Function1c17
+	ret
+; 1d6e
+
+Function1d6e: ; 1d6e
+	ld hl, MenuDataHeader_0x1d75
+	call LoadMenuDataHeader
+	ret
+; 1d75
+
+MenuDataHeader_0x1d75: ; 1d75
+	db $40 ; tile backup
+	db 0, 0 ; start coords
+	db 17, 19 ; end coords
+	dw $0000
+	db 1 ; default option
+; 1d7d
+
+Function1d7d: ; 1d7d
+	call Function1c07
+	ret
+; 1d81
+
+Function1d81: ; 0x1d81
+	xor a
+	ld [hBGMapMode], a
+	call Function1cbb
+	call Function1ad2
+	call Function1c89
+	call Function321c
+	call Function1c66
+	ld a, [$cf91]
+	bit 7, a
+	jr z, .asm_1da7 ; 0x1d98 $d
+	call Function1c10
+	call Function1bc9
+	call Function1ff8
+	bit 1, a
+	jr z, .asm_1da9 ; 0x1da5 $2
+.asm_1da7
+	scf
+	ret
+.asm_1da9
+	and a
+	ret
+; 0x1dab
+
+Function1dab: ; 1dab
+	call LoadMenuDataHeader
+	call Function1d81
+	call Function1c17
+	ld a, [$cfa9]
+	ret
+; 1db8
+
+Function1db8: ; 0x1db8
+	push hl
+	push bc
+	push af
+	ld hl, $cf86
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	inc hl
+	inc hl
+	pop af
+	call GetNthString
+	ld d, h
+	ld e, l
+	call CopyName1
+	pop bc
+	pop hl
+	ret
+; 0x1dcf
+
+
+Function1dcf: ; 1dcf
+	ld bc, $0e07
+
+Function1dd2: ; 1dd2
+	jr Function1dd9
+
+Function1dd4: ; 1dd4
+	call LoadMenuDataHeader
+	jr Function1dfe
+
+Function1dd9: ; 1dd9
+	push bc
+	ld hl, MenuDataHeader_0x1e1d
+	call Function1d3c
+	pop bc
+	ld a, b
+	cp $e
+	jr nz, .asm_1de9
+	ld a, $e
+	ld b, a
+
+.asm_1de9
+	ld a, b
+	ld [$cf83], a
+	add $5
+	ld [$cf85], a
+	ld a, c
+	ld [$cf82], a
+	add $4
+	ld [$cf84], a
+	call Function1c00
+
+Function1dfe: ; 1dfe
+	call Function1d81
+	push af
+	ld c, $f
+	call DelayFrames
+	call Function1c17
+	pop af
+	jr c, .asm_1e16
+	ld a, [$cfa9]
+	cp $2
+	jr z, .asm_1e16
+	and a
+	ret
+
+.asm_1e16
+	ld a, $2
+	ld [$cfa9], a
+	scf
+	ret
+; 1e1d
+
+MenuDataHeader_0x1e1d: ; 1e1d
+	db $40 ; tile backup
+	db 5, 10 ; start coords
+	db 9, 15 ; end coords
+	dw MenuData2_0x1e25
+	db 1 ; default option
+; 1e25
+
+MenuData2_0x1e25: ; 1e25
+	db $c0 ; flags
+	db 2
+	db "YES@"
+	db "NO@"
+; 1e2e
+
+Function1e2e: ; 1e2e
+	call Function1e35
+	call Function1c00
+	ret
+; 1e35
+
+Function1e35: ; 1e35
+	push de
+	call Function1d3c
+	pop de
+	ld a, [$cf83]
+	ld h, a
+	ld a, [$cf85]
+	sub h
+	ld h, a
+	ld a, d
+	ld [$cf83], a
+	add h
+	ld [$cf85], a
+	ld a, [$cf82]
+	ld l, a
+	ld a, [$cf84]
+	sub l
+	ld l, a
+	ld a, e
+	ld [$cf82], a
+	add l
+	ld [$cf84], a
+	ret
+; 1e5d
+
+Function1e5d: ; 1e5d
+	call MenuFunc_1e7f
+	call MenuWriteText
+	call Function1eff
+	call Function1f23
+	call Function1bdd
+	call Function1ff8
+	ret
+; 1e70
+
+SetUpMenu: ; 1e70
+	call MenuFunc_1e7f ; ???
+	call MenuWriteText
+	call Function1eff ; set up selection pointer
+	ld hl, $cfa5
+	set 7, [hl]
+	ret
+
+MenuFunc_1e7f: ; 0x1e7f
+	call Function1c66
+	call Function1ebd
+	call Function1ea6
+	call Function1cbb
+	ret
+
+MenuWriteText: ; 0x1e8c
+	xor a
+	ld [hBGMapMode], a
+	call Function1ebd ; sort out the text 
+	call Function1eda ; actually write it
+	call Function2e31
+	ld a, [hOAMUpdate]
+	push af
+	ld a, $1
+	ld [hOAMUpdate], a
+	call Function321c
+	pop af
+	ld [hOAMUpdate], a
+	ret
+; 0x1ea6
+
+Function1ea6: ; 1ea6
+	ld a, [$cf83]
+	ld c, a
+	ld a, [$cf85]
+	sub c
+	ld c, a
+	ld a, [$cf92]
+	add a
+	inc a
+	ld b, a
+	ld a, [$cf82]
+	add b
+	ld [$cf84], a
+	ret
+; 1ebd
+
+Function1ebd: ; 1ebd
+	ld hl, $cf93
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld a, [$cf76]
+	and a
+	jr z, .asm_1ed3
+	ld b, a
+	ld c, $ff
+.asm_1ecc
+	ld a, [hli]
+	cp c
+	jr nz, .asm_1ecc
+	dec b
+	jr nz, .asm_1ecc
+
+.asm_1ed3
+	ld d, h
+	ld e, l
+	ld a, [hl]
+	ld [$cf92], a
+	ret
+; 1eda
+
+Function1eda: ; 1eda
+	call Function1cfd
+	ld bc, $002a
+	add hl, bc
+.asm_1ee1
+	inc de
+	ld a, [de]
+	cp $ff
+	ret z
+	ld [MenuSelection], a
+	push de
+	push hl
+	ld d, h
+	ld e, l
+	ld hl, $cf95
+	call Function1efb
+	pop hl
+	ld de, $0028
+	add hl, de
+	pop de
+	jr .asm_1ee1
+; 1efb
+
+Function1efb: ; 1efb
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp [hl]
+; 1eff
+
+Function1eff: ; 1eff
+	call Function1c10
+	ld hl, $cfa8
+	ld a, [$cf91]
+	bit 3, a
+	jr z, .asm_1f0e
+	set 3, [hl]
+
+.asm_1f0e
+	ld a, [$cf91]
+	bit 2, a
+	jr z, .asm_1f19
+	set 5, [hl]
+	set 4, [hl]
+
+.asm_1f19
+	ret
+; 1f1a
+
+
+Function1f1a: ; 1f1a
+	call Function1bd3
+	ld hl, $cfa8
+	and [hl]
+	jr Function1f2a
+; 1f23
+
+Function1f23: ; 1f23
+	xor a
+	ld [$cf73], a
+	call Function1bc9
+; 1f2a
+
+Function1f2a: ; 1f2a
+	bit 0, a
+	jr nz, .asm_1f52
+	bit 1, a
+	jr nz, .asm_1f6d
+	bit 3, a
+	jr nz, .asm_1f6d
+	bit 4, a
+	jr nz, .asm_1f44
+	bit 5, a
+	jr nz, .asm_1f4b
+	xor a
+	ld [$cf73], a
+	jr .asm_1f57
+
+.asm_1f44
+	ld a, $10
+	ld [$cf73], a
+	jr .asm_1f57
+
+.asm_1f4b
+	ld a, $20
+	ld [$cf73], a
+	jr .asm_1f57
+
+.asm_1f52
+	ld a, $1
+	ld [$cf73], a
+
+.asm_1f57
+	call Function1ebd
+	ld a, [$cfa9]
+	ld l, a
+	ld h, $0
+	add hl, de
+	ld a, [hl]
+	ld [MenuSelection], a
+	ld a, [$cfa9]
+	ld [$cf88], a
+	and a
+	ret
+
+.asm_1f6d
+	ld a, $2
+	ld [$cf73], a
+	ld a, $ff
+	ld [MenuSelection], a
+	scf
+	ret
+; 1f79
+
+Function1f79: ; 1f79
+	push de
+	ld hl, $cf97
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld a, [MenuSelection]
+	call GetNthString
+	ld d, h
+	ld e, l
+	pop hl
+	call PlaceString
+	ret
+; 1f8d
+
+Function1f8d: ; 1f8d
+	push de
+	ld a, [MenuSelection]
+	call Function1fb1
+	inc hl
+	inc hl
+	ld a, [hli]
+	ld d, [hl]
+	ld e, a
+	pop hl
+	call PlaceString
+	ret
+; 1f9e
+
+Function1f9e: ; 1f9e
+	call Function1fb1
+	inc hl
+	inc hl
+	ld a, [hli]
+	ld d, [hl]
+	ld e, a
+	ret
+; 1fa7
+
+Function1fa7: ; 1fa7
+	ld a, [MenuSelection]
+	call Function1fb1
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp [hl]
+; 1fb1
+
+Function1fb1: ; 1fb1
+	ld e, a
+	ld d, $0
+	ld hl, $cf97
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	add hl, de
+	add hl, de
+	add hl, de
+	add hl, de
+	ret
+; 1fbf
+
+Function1fbf: ; 1fbf
+	ld hl, $cf71
+	call Function1ff0
+	ld hl, $cf81
+	call Function1ff0
+	ld hl, $cf91
+	call Function1ff0
+	ld hl, $cfa1
+	call Function1ff0
+	ld a, [rSVBK]
+	push af
+	ld a, $7
+	ld [rSVBK], a
+	xor a
+	ld hl, $dfff
+	ld [hld], a
+	ld [hld], a
+	ld a, l
+	ld [$cf71], a
+	ld a, h
+	ld [$cf72], a
+	pop af
+	ld [rSVBK], a
+	ret
+; 1ff0
+
+Function1ff0: ; 1ff0
+	ld bc, $0010
+	xor a
+	call ByteFill
+	ret
+; 1ff8
+
+Function1ff8: ; 1ff8
+	push af
+	and $3
+	jr z, .asm_2007
+	ld hl, $cf81
+	bit 3, [hl]
+	jr nz, .asm_2007
+	call PlayClickSFX
+
+.asm_2007
+	pop af
+	ret
+; 2009
+
+
+PlayClickSFX: ; 2009 
+	push de
+	ld de, SFX_READ_TEXT_2
+	call StartSFX
+	pop de
+	ret
+; 0x2012
+
+Function2012: ; 2012
+	call Function1d4f
+	call Functiona46
+	call Function1c07
+	ret
+; 201c
+
+Function201c: ; 201c
+	ld [hBuffer], a
+	ld a, [hROMBank]
+	push af
+	ld a, [hBuffer]
+	rst Bankswitch
+
+	call PlaceString
+	pop af
+	rst Bankswitch
+
+	ret
+; 202a
+
+Function202a: ; 202a
+	ld a, [hROMBank]
+	ld [$cf94], a
+	ld a, $9
+	ld hl, $400e
+	rst FarCall
+	ld a, [$cf88]
+	ret
+; 2039
+
+Function2039: ; 2039
+	ld a, [hROMBank]
+	ld [$cf94], a
+	ld a, $9
+	ld hl, $4022
+	rst FarCall
+	ld a, [$cf88]
+	ret
+; 2048
+
+Function2048: ; 2048
+	ld a, [hROMBank]
+	ld [$cf94], a
+	ld a, $9
+	ld hl, $403c
+	rst FarCall
+	ld a, [$cf88]
+	ret
+; 2057
+
+Function2057: ; 2057
+	ld a, [hROMBank]
+	push af
+	ld a, $21
+	rst Bankswitch
+
+	call $42db
+	pop af
+	rst Bankswitch
+
+	ret
+; 2063
+
--- /dev/null
+++ b/engine/rtc.asm
@@ -1,0 +1,25 @@
+RTC: ; 46f
+; update time and time-sensitive palettes
+
+; rtc enabled?
+	ld a, [$c2ce]
+	cp 0
+	ret z
+	
+	call UpdateTime
+	
+; obj update on?
+	ld a, [VramState]
+	bit 0, a ; obj update
+	ret z
+
+TimeOfDayPals: ; 47e
+	callab _TimeOfDayPals
+	ret
+; 485
+
+UpdateTimePals: ; 485
+	callab _UpdateTimePals
+	ret
+; 48c
+
--- /dev/null
+++ b/engine/sine.asm
@@ -1,0 +1,22 @@
+Cosine: ; 1b0f
+; Return d * cos(a) in hl
+	add $10 ; 90 degrees
+
+Sine: ; 1b11
+; Return d * sin(a) in hl
+; a is a signed 6-bit value.
+
+	ld e, a
+
+	ld a, [hROMBank]
+	push af
+	ld a, BANK(_Sine)
+	rst Bankswitch
+
+	call _Sine
+
+	pop af
+	rst Bankswitch
+	ret
+; 1b1e
+
--- /dev/null
+++ b/engine/video.asm
@@ -1,0 +1,487 @@
+; Functions dealing with VRAM.
+
+DMATransfer: ; 15d8
+; Return carry if the transfer is completed.
+
+	ld a, [hDMATransfer]
+	and a
+	ret z
+
+; Start transfer
+	ld [rHDMA5], a
+
+; Execution is halted until the transfer is complete.
+
+	xor a
+	ld [hDMATransfer], a
+	scf
+	ret
+; 15e3
+
+
+UpdateBGMapBuffer: ; 15e3
+; Copy [$ffdc] 16x8 tiles from BGMapBuffer
+; to bg map addresses in BGMapBufferPtrs.
+
+; [$ffdc] must be even since this is done in pairs.
+
+; Return carry on success.
+
+	ld a, [hBGMapUpdate]
+	and a
+	ret z
+
+	ld a, [rVBK]
+	push af
+	ld [hSPBuffer], sp
+
+	ld hl, BGMapBufferPtrs
+	ld sp, hl
+
+; We can now pop the addresses of affected spots on the BG Map
+
+	ld hl, BGMapPalBuffer
+	ld de, BGMapBuffer
+
+
+.next
+; Copy a pair of 16x8 blocks (one 16x16 block)
+
+rept 2
+; Get our BG Map address
+	pop bc
+
+; Palettes
+	ld a, 1
+	ld [rVBK], a
+
+	ld a, [hli]
+	ld [bc], a
+	inc c
+	ld a, [hli]
+	ld [bc], a
+	dec c
+
+; Tiles
+	ld a, 0
+	ld [rVBK], a
+
+	ld a, [de]
+	inc de
+	ld [bc], a
+	inc c
+	ld a, [de]
+	inc de
+	ld [bc], a
+endr
+
+; We've done 2 16x8 blocks
+	ld a, [$ffdc]
+	dec a
+	dec a
+	ld [$ffdc], a
+
+	jr nz, .next
+
+
+	ld a, [hSPBuffer]
+	ld l, a
+	ld a, [hSPBuffer + 1]
+	ld h, a
+	ld sp, hl
+
+	pop af
+	ld [rVBK], a
+
+	xor a
+	ld [hBGMapUpdate], a
+	scf
+	ret
+; 163a
+
+
+WaitTop: ; 163a
+; Wait until the top third of the BG Map is being updated.
+
+	ld a, [hBGMapMode]
+	and a
+	ret z
+
+	ld a, [hBGMapThird]
+	and a
+	jr z, .done
+
+	call DelayFrame
+	jr WaitTop
+
+.done
+	xor a
+	ld [hBGMapMode], a
+	ret
+; 164c
+
+
+UpdateBGMap: ; 164c
+; Update the BG Map, in thirds, from TileMap and AttrMap.
+
+	ld a, [hBGMapMode]
+	and a
+	ret z
+
+; BG Map 0
+	dec a ; 1
+	jr z, .Tiles
+	dec a ; 2
+	jr z, .Attr
+
+; BG Map 1
+	dec a
+
+	ld a, [hBGMapAddress]
+	ld l, a
+	ld a, [hBGMapAddress + 1]
+	ld h, a
+	push hl
+
+	xor a
+	ld [hBGMapAddress], a
+	ld a, VBGMap1 >> 8
+	ld [hBGMapAddress + 1], a
+
+	ld a, [hBGMapMode]
+	push af
+	cp 3
+	call z, .Tiles
+	pop af
+	cp 4
+	call z, .Attr
+
+	pop hl
+	ld a, l
+	ld [hBGMapAddress], a
+	ld a, h
+	ld [hBGMapAddress + 1], a
+	ret
+
+
+.Attr
+	ld a, 1
+	ld [rVBK], a
+
+	ld hl, AttrMap
+	call .update
+
+	ld a, 0
+	ld [rVBK], a
+	ret
+
+
+.Tiles
+	ld hl, TileMap
+
+
+.update
+	ld [hSPBuffer], sp
+	
+; Which third?
+	ld a, [hBGMapThird]
+	and a ; 0
+	jr z, .top
+	dec a ; 1
+	jr z, .middle
+	; 2
+
+
+THIRD_HEIGHT EQU SCREEN_HEIGHT / 3
+
+
+.bottom
+	ld de, 2 * THIRD_HEIGHT * SCREEN_WIDTH
+	add hl, de
+	ld sp, hl
+
+	ld a, [hBGMapAddress + 1]
+	ld h, a
+	ld a, [hBGMapAddress]
+	ld l, a
+
+	ld de, 2 * THIRD_HEIGHT * BG_MAP_WIDTH
+	add hl, de
+
+; Next time: top third
+	xor a
+	jr .start
+
+
+.middle
+	ld de, THIRD_HEIGHT * SCREEN_WIDTH
+	add hl, de
+	ld sp, hl
+
+	ld a, [hBGMapAddress + 1]
+	ld h, a
+	ld a, [hBGMapAddress]
+	ld l, a
+
+	ld de, THIRD_HEIGHT * BG_MAP_WIDTH
+	add hl, de
+
+; Next time: bottom third
+	ld a, 2
+	jr .start
+
+
+.top
+	ld sp, hl
+
+	ld a, [hBGMapAddress + 1]
+	ld h, a
+	ld a, [hBGMapAddress]
+	ld l, a
+
+; Next time: middle third
+	ld a, 1
+
+
+.start
+; Which third to update next time
+	ld [hBGMapThird], a
+
+; Rows of tiles in a third
+	ld a, SCREEN_HEIGHT / 3
+
+; Discrepancy between TileMap and BGMap
+	ld bc, BG_MAP_WIDTH - (SCREEN_WIDTH - 1)
+
+
+.row
+; Copy a row of 20 tiles
+rept SCREEN_WIDTH / 2 - 1
+	pop de
+	ld [hl], e
+	inc l
+	ld [hl], d
+	inc l
+endr
+	pop de
+	ld [hl], e
+	inc l
+	ld [hl], d
+
+	add hl, bc
+	dec a
+	jr nz, .row
+
+
+	ld a, [hSPBuffer]
+	ld l, a
+	ld a, [hSPBuffer + 1]
+	ld h, a
+	ld sp, hl
+	ret
+; 170a
+
+
+Serve1bppRequest: ; 170a
+; Only call during the first fifth of VBlank
+
+	ld a, [Requested1bpp]
+	and a
+	ret z
+
+; Back out if we're too far into VBlank
+	ld a, [rLY]
+	cp 144
+	ret c
+	cp 146
+	ret nc
+
+; Copy [Requested1bpp] 1bpp tiles from [Requested1bppSource] to [Requested1bppDest]
+
+	ld [hSPBuffer], sp
+
+; Source
+	ld hl, Requested1bppSource
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld sp, hl
+	
+; Destination
+	ld hl, Requested1bppDest
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	
+; # tiles to copy
+	ld a, [Requested1bpp]
+	ld b, a
+
+	xor a
+	ld [Requested1bpp], a
+
+.next
+
+rept 3
+	pop de
+	ld [hl], e
+	inc l
+	ld [hl], e
+	inc l
+	ld [hl], d
+	inc l
+	ld [hl], d
+	inc l
+endr
+	pop de
+	ld [hl], e
+	inc l
+	ld [hl], e
+	inc l
+	ld [hl], d
+	inc l
+	ld [hl], d
+
+	inc hl
+	dec b
+	jr nz, .next
+
+
+	ld a, l
+	ld [Requested1bppDest], a
+	ld a, h
+	ld [Requested1bppDest + 1], a
+
+	ld [Requested1bppSource], sp
+
+	ld a, [hSPBuffer]
+	ld l, a
+	ld a, [hSPBuffer + 1]
+	ld h, a
+	ld sp, hl
+	ret
+; 1769
+
+
+Serve2bppRequest: ; 1769
+; Only call during the first fifth of VBlank
+
+	ld a, [Requested2bpp]
+	and a
+	ret z
+
+; Back out if we're too far into VBlank
+	ld a, [rLY]
+	cp 144
+	ret c
+	cp 146
+	ret nc
+	jr _Serve2bppRequest
+
+
+Serve2bppRequest@VBlank: ; 1778
+
+	ld a, [Requested2bpp]
+	and a
+	ret z
+
+_Serve2bppRequest: ; 177d
+; Copy [Requested2bpp] 2bpp tiles from [Requested2bppSource] to [Requested2bppDest]
+
+	ld [hSPBuffer], sp
+	
+; Source
+	ld hl, Requested2bppSource
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld sp, hl
+	
+; Destination
+	ld hl, Requested2bppDest
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	
+; # tiles to copy
+	ld a, [Requested2bpp]
+	ld b, a
+
+	xor a
+	ld [Requested2bpp], a
+	
+.next
+
+rept 7
+	pop de
+	ld [hl], e
+	inc l
+	ld [hl], d
+	inc l
+endr
+	pop de
+	ld [hl], e
+	inc l
+	ld [hl], d
+
+	inc hl
+	dec b
+	jr nz, .next
+
+
+	ld a, l
+	ld [Requested2bppDest], a
+	ld a, h
+	ld [Requested2bppDest + 1], a
+
+	ld [Requested2bppSource], sp
+
+	ld a, [hSPBuffer]
+	ld l, a
+	ld a, [hSPBuffer + 1]
+	ld h, a
+	ld sp, hl
+	ret
+; 17d3
+
+
+AnimateTileset: ; 17d3
+; Only call during the first fifth of VBlank
+
+	ld a, [$ffde]
+	and a
+	ret z
+	
+; Back out if we're too far into VBlank
+	ld a, [rLY]
+	cp 144
+	ret c
+	cp 151
+	ret nc
+
+	ld a, [hROMBank]
+	push af
+	ld a, BANK(_AnimateTileset)
+	rst Bankswitch
+
+	ld a, [rSVBK]
+	push af
+	ld a, 1
+	ld [rSVBK], a
+
+	ld a, [rVBK]
+	push af
+	ld a, 0
+	ld [rVBK], a
+
+	call _AnimateTileset
+
+	pop af
+	ld [rVBK], a
+	pop af
+	ld [rSVBK], a
+	pop af
+	rst Bankswitch
+	ret
+; 17ff
+
--- /dev/null
+++ b/interrupts.asm
@@ -1,0 +1,17 @@
+; Game Boy hardware interrupts
+
+SECTION "vblank",ROM0[$40]
+	jp VBlank
+
+SECTION "lcd",ROM0[$48]
+	jp LCD
+
+SECTION "timer",ROM0[$50]
+	jp Timer
+
+SECTION "serial",ROM0[$58]
+	jp Serial
+
+SECTION "joypad",ROM0[$60]
+	jp JoypadInt
+
--- /dev/null
+++ b/items/marts.asm
@@ -1,0 +1,443 @@
+Marts: ; 160a9
+	dw Mart0
+	dw Mart1
+	dw Mart2
+	dw Mart3
+	dw Mart4
+	dw Mart5
+	dw Mart6
+	dw Mart7
+	dw Mart8
+	dw Mart9
+	dw Mart10
+	dw Mart11
+	dw Mart12
+	dw Mart13
+	dw Mart14
+	dw Mart15
+	dw Mart16
+	dw Mart17
+	dw Mart18
+	dw Mart19
+	dw Mart20
+	dw Mart21
+	dw Mart22
+	dw Mart23
+	dw Mart24
+	dw Mart25
+	dw Mart26
+	dw Mart27
+	dw Mart28
+	dw Mart29
+	dw Mart30
+	dw Mart31
+	dw Mart32
+	dw Mart33
+MartsEnd
+; 160ed
+
+
+Mart0: ; 160ed
+	db 4 ; # items
+	db POTION
+	db ANTIDOTE
+	db PARLYZ_HEAL
+	db AWAKENING
+	db $ff
+; 160f3
+
+Mart1: ; 160f3
+	db 5 ; # items
+	db POKE_BALL
+	db POTION
+	db ANTIDOTE
+	db PARLYZ_HEAL
+	db AWAKENING
+	db $ff
+; 160fa
+
+Mart2: ; 160fa
+	db 10 ; # items
+	db POKE_BALL
+	db POTION
+	db ESCAPE_ROPE
+	db ANTIDOTE
+	db PARLYZ_HEAL
+	db AWAKENING
+	db X_DEFEND
+	db X_ATTACK
+	db X_SPEED
+	db FLOWER_MAIL
+	db $ff
+; 16106
+
+Mart3: ; 16106
+	db 9 ; # items
+	db CHARCOAL
+	db POKE_BALL
+	db POTION
+	db SUPER_POTION
+	db ESCAPE_ROPE
+	db REPEL
+	db ANTIDOTE
+	db PARLYZ_HEAL
+	db FLOWER_MAIL
+	db $ff
+; 16111
+
+Mart4: ; 16111
+	db 5 ; # items
+	db POTION
+	db SUPER_POTION
+	db HYPER_POTION
+	db FULL_HEAL
+	db REVIVE
+	db $ff
+; 16118
+
+Mart5: ; 16118
+	db 7 ; # items
+	db POTION
+	db SUPER_POTION
+	db ANTIDOTE
+	db PARLYZ_HEAL
+	db AWAKENING
+	db BURN_HEAL
+	db ICE_HEAL
+	db $ff
+; 16121
+
+Mart6: ; 16121
+	db 8 ; # items
+	db POKE_BALL
+	db GREAT_BALL
+	db ESCAPE_ROPE
+	db REPEL
+	db REVIVE
+	db FULL_HEAL
+	db POKE_DOLL
+	db FLOWER_MAIL
+	db $ff
+; 1612b
+
+Mart7: ; 1612b
+	db 7 ; # items
+	db X_SPEED
+	db X_SPECIAL
+	db X_DEFEND
+	db X_ATTACK
+	db DIRE_HIT
+	db GUARD_SPEC
+	db X_ACCURACY
+	db $ff
+; 16134
+
+Mart8: ; 16134
+	db 5 ; # items
+	db PROTEIN
+	db IRON
+	db CARBOS
+	db CALCIUM
+	db HP_UP
+	db $ff
+; 1613b
+
+Mart9: ; 1613b
+	db 3 ; # items
+	db TM_41
+	db TM_48
+	db TM_33
+	db $ff
+; 16140
+
+Mart10: ; 16140
+	db 4 ; # items
+	db TM_41
+	db TM_48
+	db TM_33
+	db TM_02
+	db $ff
+; 16146
+
+Mart11: ; 16146
+	db 4 ; # items
+	db TM_41
+	db TM_48
+	db TM_33
+	db TM_08
+	db $ff
+; 1614c
+
+Mart12: ; 1614c
+	db 5 ; # items
+	db TM_41
+	db TM_48
+	db TM_33
+	db TM_02
+	db TM_08
+	db $ff
+; 16153
+
+Mart13: ; 16153
+	db 9 ; # items
+	db GREAT_BALL
+	db SUPER_POTION
+	db HYPER_POTION
+	db ANTIDOTE
+	db PARLYZ_HEAL
+	db AWAKENING
+	db ICE_HEAL
+	db SUPER_REPEL
+	db SURF_MAIL
+	db $ff
+; 1615e
+
+Mart14: ; 1615e
+	db 10 ; # items
+	db POKE_BALL
+	db GREAT_BALL
+	db POTION
+	db SUPER_POTION
+	db ANTIDOTE
+	db PARLYZ_HEAL
+	db AWAKENING
+	db BURN_HEAL
+	db ICE_HEAL
+	db REVIVE
+	db $ff
+; 1616a
+
+Mart15: ; 1616a
+	db 4 ; # items
+	db TINYMUSHROOM
+	db SLOWPOKETAIL
+	db POKE_BALL
+	db POTION
+	db $ff
+; 16170
+
+Mart16: ; 16170
+	db 9 ; # items
+	db RAGECANDYBAR
+	db GREAT_BALL
+	db SUPER_POTION
+	db HYPER_POTION
+	db ANTIDOTE
+	db PARLYZ_HEAL
+	db SUPER_REPEL
+	db REVIVE
+	db FLOWER_MAIL
+	db $ff
+; 1617b
+
+Mart17: ; 1617b
+	db 9 ; # items
+	db GREAT_BALL
+	db ULTRA_BALL
+	db HYPER_POTION
+	db MAX_POTION
+	db FULL_HEAL
+	db REVIVE
+	db MAX_REPEL
+	db X_DEFEND
+	db X_ATTACK
+	db $ff
+; 16186
+
+Mart18: ; 16186
+	db 9 ; # items
+	db ULTRA_BALL
+	db HYPER_POTION
+	db FULL_HEAL
+	db REVIVE
+	db ANTIDOTE
+	db PARLYZ_HEAL
+	db AWAKENING
+	db BURN_HEAL
+	db FLOWER_MAIL
+	db $ff
+; 16191
+
+Mart19: ; 16191
+	db 7 ; # items
+	db GREAT_BALL
+	db SUPER_POTION
+	db SUPER_REPEL
+	db ANTIDOTE
+	db PARLYZ_HEAL
+	db AWAKENING
+	db BURN_HEAL
+	db $ff
+; 1619a
+
+Mart20: ; 1619a
+	db 9 ; # items
+	db GREAT_BALL
+	db ULTRA_BALL
+	db SUPER_POTION
+	db SUPER_REPEL
+	db FULL_HEAL
+	db X_DEFEND
+	db X_ATTACK
+	db DIRE_HIT
+	db SURF_MAIL
+	db $ff
+; 161a5
+
+Mart21: ; 161a5
+	db 8 ; # items
+	db GREAT_BALL
+	db POTION
+	db SUPER_POTION
+	db MAX_REPEL
+	db ANTIDOTE
+	db PARLYZ_HEAL
+	db AWAKENING
+	db BURN_HEAL
+	db $ff
+; 161af
+
+Mart22: ; 161af
+	db 8 ; # items
+	db ULTRA_BALL
+	db SUPER_POTION
+	db HYPER_POTION
+	db REVIVE
+	db PARLYZ_HEAL
+	db AWAKENING
+	db BURN_HEAL
+	db LITEBLUEMAIL
+	db $ff
+; 161b9
+
+Mart23: ; 161b9
+	db 7 ; # items
+	db POTION
+	db SUPER_POTION
+	db HYPER_POTION
+	db MAX_POTION
+	db REVIVE
+	db SUPER_REPEL
+	db MAX_REPEL
+	db $ff
+; 161c2
+
+Mart24: ; 161c2
+	db 10 ; # items
+	db POKE_BALL
+	db GREAT_BALL
+	db ULTRA_BALL
+	db ESCAPE_ROPE
+	db FULL_HEAL
+	db ANTIDOTE
+	db BURN_HEAL
+	db ICE_HEAL
+	db AWAKENING
+	db PARLYZ_HEAL
+	db $ff
+; 161ce
+
+Mart25: ; 161ce
+	db 5 ; # items
+	db TM_10
+	db TM_11
+	db TM_17
+	db TM_18
+	db TM_37
+	db $ff
+; 161d5
+
+Mart26: ; 161d5
+	db 3 ; # items
+	db POKE_DOLL
+	db LOVELY_MAIL
+	db SURF_MAIL
+	db $ff
+; 161da
+
+Mart27: ; 161da
+	db 5 ; # items
+	db HP_UP
+	db PROTEIN
+	db IRON
+	db CARBOS
+	db CALCIUM
+	db $ff
+; 161e1
+
+Mart28: ; 161e1
+	db 7 ; # items
+	db X_ACCURACY
+	db GUARD_SPEC
+	db DIRE_HIT
+	db X_ATTACK
+	db X_DEFEND
+	db X_SPEED
+	db X_SPECIAL
+	db $ff
+; 161ea
+
+Mart29: ; 161ea
+	db 7 ; # items
+	db GREAT_BALL
+	db ULTRA_BALL
+	db SUPER_POTION
+	db HYPER_POTION
+	db FULL_HEAL
+	db MAX_REPEL
+	db FLOWER_MAIL
+	db $ff
+; 161f3
+
+Mart30: ; 161f3
+	db 8 ; # items
+	db GREAT_BALL
+	db ULTRA_BALL
+	db HYPER_POTION
+	db MAX_POTION
+	db FULL_HEAL
+	db X_ATTACK
+	db X_DEFEND
+	db FLOWER_MAIL
+	db $ff
+; 161fd
+
+Mart31: ; 161fd
+	db 6 ; # items
+	db POKE_DOLL
+	db FRESH_WATER
+	db SODA_POP
+	db LEMONADE
+	db REPEL
+	db PORTRAITMAIL
+	db $ff
+; 16205
+
+Mart32: ; 16205
+	db 7 ; # items
+	db ULTRA_BALL
+	db MAX_REPEL
+	db HYPER_POTION
+	db MAX_POTION
+	db FULL_RESTORE
+	db REVIVE
+	db FULL_HEAL
+	db $ff
+; 1620e
+
+Mart33: ; 1620e
+	db 4 ; # items
+	db ENERGYPOWDER
+	db ENERGY_ROOT
+	db HEAL_POWDER
+	db REVIVAL_HERB
+	db $ff
+; 16214
+
+DefaultMart: ; 16214
+	db 2 ; # items
+	db POKE_BALL
+	db POTION
+	db $ff
+; 16218
+
--- /dev/null
+++ b/macros.asm
@@ -1,0 +1,95 @@
+; rgbds macros
+
+dwb: MACRO
+	dw \1
+	db \2
+	ENDM
+
+dbw: MACRO
+	db \1
+	dw \2
+	ENDM
+
+dn: MACRO
+	db \1 << 4 + \2
+	ENDM
+
+dt: MACRO ; three-byte (big-endian)
+	db (\1 >> 16) & $ff
+	db (\1 >> 8) & $ff
+	db \1 & $ff
+	ENDM
+
+bigdw: MACRO ; big-endian word
+	dw ((\1)/$100) + (((\1)&$ff)*$100)
+	ENDM
+
+callab: MACRO ; address, bank
+	ld hl, \1
+	ld a, BANK(\1)
+	rst FarCall
+	ENDM
+
+callba: MACRO ; bank, address
+	ld a, BANK(\1)
+	ld hl, \1
+	rst FarCall
+	ENDM
+
+TX_RAM: MACRO
+	db 1
+	dw \1
+	ENDM
+
+TX_FAR: MACRO
+	db $16
+	dw \1
+	db BANK(\1)
+	ENDM
+
+RGB: MACRO
+	dw ((\3 << 10) | (\2 << 5) | (\1))
+	ENDM
+
+note: MACRO
+	db \1
+	ENDM
+
+; It's better to use *coord than FuncCoord.
+FuncCoord: MACRO
+Coord = $c4a0 + 20 * \2 + \1
+	ENDM
+
+bccoord: MACRO
+	FuncCoord \1, \2
+	ld bc, Coord
+	ENDM
+	
+decoord: MACRO
+	FuncCoord \1, \2
+	ld de, Coord
+	ENDM
+
+hlcoord: MACRO
+	FuncCoord \1, \2
+	ld hl, Coord
+	ENDM
+
+
+; pic animations
+frame: MACRO
+	db \1
+	db \2
+	ENDM
+setrepeat: MACRO
+	db $fe
+	db \1
+	ENDM
+dorepeat: MACRO
+	db $fd
+	db \1
+	ENDM
+endanim: MACRO
+	db $ff
+	ENDM
+
--- a/main.asm
+++ b/main.asm
@@ -1,1335 +1,36 @@
 SECTION "bank0",ROM0
-SECTION "rst0",ROM0[$0]
-	di
-	jp Start
 
-SECTION "rst8",ROM0[$8] ; FarCall
-	jp FarCall_hl
+INCLUDE "rst.asm"
 
-SECTION "rst10",ROM0[$10] ; Bankswitch
-	ld [hROMBank], a
-	ld [MBC3RomBank], a
-	ret
+INCLUDE "interrupts.asm"
 
-SECTION "rst18",ROM0[$18] ; Unused
-	rst $38
 
-SECTION "rst20",ROM0[$20] ; Unused
-	rst $38
+SECTION "header",ROM0[$100]
 
-SECTION "rst28",ROM0[$28] ; JumpTable
-	push de
-	ld e, a
-	ld d, 0
-	add hl, de
-	add hl, de
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	pop de
-	jp [hl]
-
-; rst30 is midst rst28
-
-SECTION "rst38",ROM0[$38] ; Unused
-	rst $38
-
-SECTION "vblank",ROM0[$40] ; vblank interrupt
-	jp VBlank
-
-SECTION "lcd",ROM0[$48] ; lcd interrupt
-	jp LCD
-
-SECTION "timer",ROM0[$50] ; timer interrupt
-	jp Timer
-
-SECTION "serial",ROM0[$58] ; serial interrupt
-	jp Serial
-
-SECTION "joypad",ROM0[$60] ; joypad interrupt
-	jp JoypadInt
-
-SECTION "romheader",ROM0[$100]
 Start:
 	nop
 	jp _Start
 
+
 SECTION "start",ROM0[$150]
 
 INCLUDE "engine/init.asm"
-
-
 INCLUDE "engine/vblank.asm"
-
-
-DelayFrame: ; 45a
-; Wait for one frame
-	ld a, 1
-	ld [VBlankOccurred], a
-
-; Wait for the next VBlank, halting to conserve battery
-.halt
-	halt ; rgbasm adds a nop after this instruction by default
-	ld a, [VBlankOccurred]
-	and a
-	jr nz, .halt
-	ret
-; 468
-
-
-DelayFrames: ; 468
-; Wait c frames
-	call DelayFrame
-	dec c
-	jr nz, DelayFrames
-	ret
-; 46f
-
-
-RTC: ; 46f
-; update time and time-sensitive palettes
-
-; rtc enabled?
-	ld a, [$c2ce]
-	cp 0
-	ret z
-	
-	call UpdateTime
-	
-; obj update on?
-	ld a, [VramState]
-	bit 0, a ; obj update
-	ret z
-
-TimeOfDayPals: ; 47e
-	callab _TimeOfDayPals
-	ret
-; 485
-
-
-Function485: ; 485
-	callab UpdateTimePals
-	ret
-; 48c
-
-
+INCLUDE "engine/delay.asm"
+INCLUDE "engine/rtc.asm"
 INCLUDE "engine/fade.asm"
-
-
 INCLUDE "engine/lcd.asm"
-
-
 INCLUDE "engine/time.asm"
-
-
 INCLUDE "engine/serial.asm"
-
-
 INCLUDE "engine/joypad.asm"
-
-
 INCLUDE "engine/decompress.asm"
-
-
 INCLUDE "engine/palettes.asm"
-
-
 INCLUDE "engine/copy.asm"
-
-
 INCLUDE "engine/text.asm"
+INCLUDE "engine/video.asm"
+INCLUDE "engine/map_objects.asm"
+INCLUDE "engine/sine.asm"
 
-
-DMATransfer: ; 15d8
-; Return carry if the transfer is completed.
-
-	ld a, [hDMATransfer]
-	and a
-	ret z
-
-; Start transfer
-	ld [rHDMA5], a
-
-; Execution is halted until the transfer is complete.
-
-	xor a
-	ld [hDMATransfer], a
-	scf
-	ret
-; 15e3
-
-
-UpdateBGMapBuffer: ; 15e3
-; Copy [$ffdc] 16x8 tiles from BGMapBuffer
-; to bg map addresses in BGMapBufferPtrs.
-
-; [$ffdc] must be even since this is done in pairs.
-
-; Return carry on success.
-
-	ld a, [hBGMapUpdate]
-	and a
-	ret z
-
-	ld a, [rVBK]
-	push af
-	ld [hSPBuffer], sp
-
-	ld hl, BGMapBufferPtrs
-	ld sp, hl
-
-; We can now pop the addresses of affected spots on the BG Map
-
-	ld hl, BGMapPalBuffer
-	ld de, BGMapBuffer
-
-
-.next
-; Copy a pair of 16x8 blocks (one 16x16 block)
-
-rept 2
-; Get our BG Map address
-	pop bc
-
-; Palettes
-	ld a, 1
-	ld [rVBK], a
-
-	ld a, [hli]
-	ld [bc], a
-	inc c
-	ld a, [hli]
-	ld [bc], a
-	dec c
-
-; Tiles
-	ld a, 0
-	ld [rVBK], a
-
-	ld a, [de]
-	inc de
-	ld [bc], a
-	inc c
-	ld a, [de]
-	inc de
-	ld [bc], a
-endr
-
-; We've done 2 16x8 blocks
-	ld a, [$ffdc]
-	dec a
-	dec a
-	ld [$ffdc], a
-
-	jr nz, .next
-
-
-	ld a, [hSPBuffer]
-	ld l, a
-	ld a, [hSPBuffer + 1]
-	ld h, a
-	ld sp, hl
-
-	pop af
-	ld [rVBK], a
-
-	xor a
-	ld [hBGMapUpdate], a
-	scf
-	ret
-; 163a
-
-
-WaitTop: ; 163a
-; Wait until the top third of the BG Map is being updated.
-
-	ld a, [hBGMapMode]
-	and a
-	ret z
-
-	ld a, [hBGMapThird]
-	and a
-	jr z, .done
-
-	call DelayFrame
-	jr WaitTop
-
-.done
-	xor a
-	ld [hBGMapMode], a
-	ret
-; 164c
-
-
-UpdateBGMap: ; 164c
-; Update the BG Map, in thirds, from TileMap and AttrMap.
-
-	ld a, [hBGMapMode]
-	and a
-	ret z
-
-; BG Map 0
-	dec a ; 1
-	jr z, .Tiles
-	dec a ; 2
-	jr z, .Attr
-
-; BG Map 1
-	dec a
-
-	ld a, [hBGMapAddress]
-	ld l, a
-	ld a, [hBGMapAddress + 1]
-	ld h, a
-	push hl
-
-	xor a
-	ld [hBGMapAddress], a
-	ld a, VBGMap1 >> 8
-	ld [hBGMapAddress + 1], a
-
-	ld a, [hBGMapMode]
-	push af
-	cp 3
-	call z, .Tiles
-	pop af
-	cp 4
-	call z, .Attr
-
-	pop hl
-	ld a, l
-	ld [hBGMapAddress], a
-	ld a, h
-	ld [hBGMapAddress + 1], a
-	ret
-
-
-.Attr
-	ld a, 1
-	ld [rVBK], a
-
-	ld hl, AttrMap
-	call .update
-
-	ld a, 0
-	ld [rVBK], a
-	ret
-
-
-.Tiles
-	ld hl, TileMap
-
-
-.update
-	ld [hSPBuffer], sp
-	
-; Which third?
-	ld a, [hBGMapThird]
-	and a ; 0
-	jr z, .top
-	dec a ; 1
-	jr z, .middle
-	; 2
-
-
-THIRD_HEIGHT EQU SCREEN_HEIGHT / 3
-
-
-.bottom
-	ld de, 2 * THIRD_HEIGHT * SCREEN_WIDTH
-	add hl, de
-	ld sp, hl
-
-	ld a, [hBGMapAddress + 1]
-	ld h, a
-	ld a, [hBGMapAddress]
-	ld l, a
-
-	ld de, 2 * THIRD_HEIGHT * BG_MAP_WIDTH
-	add hl, de
-
-; Next time: top third
-	xor a
-	jr .start
-
-
-.middle
-	ld de, THIRD_HEIGHT * SCREEN_WIDTH
-	add hl, de
-	ld sp, hl
-
-	ld a, [hBGMapAddress + 1]
-	ld h, a
-	ld a, [hBGMapAddress]
-	ld l, a
-
-	ld de, THIRD_HEIGHT * BG_MAP_WIDTH
-	add hl, de
-
-; Next time: bottom third
-	ld a, 2
-	jr .start
-
-
-.top
-	ld sp, hl
-
-	ld a, [hBGMapAddress + 1]
-	ld h, a
-	ld a, [hBGMapAddress]
-	ld l, a
-
-; Next time: middle third
-	ld a, 1
-
-
-.start
-; Which third to update next time
-	ld [hBGMapThird], a
-
-; Rows of tiles in a third
-	ld a, SCREEN_HEIGHT / 3
-
-; Discrepancy between TileMap and BGMap
-	ld bc, BG_MAP_WIDTH - (SCREEN_WIDTH - 1)
-
-
-.row
-; Copy a row of 20 tiles
-rept SCREEN_WIDTH / 2 - 1
-	pop de
-	ld [hl], e
-	inc l
-	ld [hl], d
-	inc l
-endr
-	pop de
-	ld [hl], e
-	inc l
-	ld [hl], d
-
-	add hl, bc
-	dec a
-	jr nz, .row
-
-
-	ld a, [hSPBuffer]
-	ld l, a
-	ld a, [hSPBuffer + 1]
-	ld h, a
-	ld sp, hl
-	ret
-; 170a
-
-
-Serve1bppRequest: ; 170a
-; Only call during the first fifth of VBlank
-
-	ld a, [Requested1bpp]
-	and a
-	ret z
-
-; Back out if we're too far into VBlank
-	ld a, [rLY]
-	cp 144
-	ret c
-	cp 146
-	ret nc
-
-; Copy [Requested1bpp] 1bpp tiles from [Requested1bppSource] to [Requested1bppDest]
-
-	ld [hSPBuffer], sp
-
-; Source
-	ld hl, Requested1bppSource
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld sp, hl
-	
-; Destination
-	ld hl, Requested1bppDest
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	
-; # tiles to copy
-	ld a, [Requested1bpp]
-	ld b, a
-
-	xor a
-	ld [Requested1bpp], a
-
-.next
-
-rept 3
-	pop de
-	ld [hl], e
-	inc l
-	ld [hl], e
-	inc l
-	ld [hl], d
-	inc l
-	ld [hl], d
-	inc l
-endr
-	pop de
-	ld [hl], e
-	inc l
-	ld [hl], e
-	inc l
-	ld [hl], d
-	inc l
-	ld [hl], d
-
-	inc hl
-	dec b
-	jr nz, .next
-
-
-	ld a, l
-	ld [Requested1bppDest], a
-	ld a, h
-	ld [Requested1bppDest + 1], a
-
-	ld [Requested1bppSource], sp
-
-	ld a, [hSPBuffer]
-	ld l, a
-	ld a, [hSPBuffer + 1]
-	ld h, a
-	ld sp, hl
-	ret
-; 1769
-
-
-Serve2bppRequest: ; 1769
-; Only call during the first fifth of VBlank
-
-	ld a, [Requested2bpp]
-	and a
-	ret z
-
-; Back out if we're too far into VBlank
-	ld a, [rLY]
-	cp 144
-	ret c
-	cp 146
-	ret nc
-	jr _Serve2bppRequest
-
-
-Serve2bppRequest@VBlank: ; 1778
-
-	ld a, [Requested2bpp]
-	and a
-	ret z
-
-_Serve2bppRequest: ; 177d
-; Copy [Requested2bpp] 2bpp tiles from [Requested2bppSource] to [Requested2bppDest]
-
-	ld [hSPBuffer], sp
-	
-; Source
-	ld hl, Requested2bppSource
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld sp, hl
-	
-; Destination
-	ld hl, Requested2bppDest
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	
-; # tiles to copy
-	ld a, [Requested2bpp]
-	ld b, a
-
-	xor a
-	ld [Requested2bpp], a
-	
-.next
-
-rept 7
-	pop de
-	ld [hl], e
-	inc l
-	ld [hl], d
-	inc l
-endr
-	pop de
-	ld [hl], e
-	inc l
-	ld [hl], d
-
-	inc hl
-	dec b
-	jr nz, .next
-
-
-	ld a, l
-	ld [Requested2bppDest], a
-	ld a, h
-	ld [Requested2bppDest + 1], a
-
-	ld [Requested2bppSource], sp
-
-	ld a, [hSPBuffer]
-	ld l, a
-	ld a, [hSPBuffer + 1]
-	ld h, a
-	ld sp, hl
-	ret
-; 17d3
-
-
-AnimateTileset: ; 17d3
-; Only call during the first fifth of VBlank
-
-	ld a, [$ffde]
-	and a
-	ret z
-	
-; Back out if we're too far into VBlank
-	ld a, [rLY]
-	cp 144
-	ret c
-	cp 151
-	ret nc
-
-	ld a, [hROMBank]
-	push af
-	ld a, BANK(_AnimateTileset)
-	rst Bankswitch
-
-	ld a, [rSVBK]
-	push af
-	ld a, 1
-	ld [rSVBK], a
-
-	ld a, [rVBK]
-	push af
-	ld a, 0
-	ld [rVBK], a
-
-	call _AnimateTileset
-
-	pop af
-	ld [rVBK], a
-	pop af
-	ld [rSVBK], a
-	pop af
-	rst Bankswitch
-	ret
-; 17ff
-
-
-GetSpritePalette: ; 17ff
-	push hl
-	push de
-	push bc
-	ld c, a
-	callba _GetSpritePalette
-	ld a, c
-	pop bc
-	pop de
-	pop hl
-	ret
-; 180e
-
-
-Function180e: ; 180e
-	push hl
-	push bc
-	ld hl, $d156
-	ld c, $1f
-	ld b, a
-	ld a, [hConnectionStripLength]
-	cp $0
-	jr z, .asm_182b
-	ld a, b
-.asm_181d
-	cp [hl]
-	jr z, .asm_1830
-	inc hl
-	inc hl
-	dec c
-	jr nz, .asm_181d
-	ld a, [$d155]
-	scf
-	jr .asm_1833
-
-.asm_182b
-	ld a, [$d155]
-	jr .asm_1833
-
-.asm_1830
-	inc hl
-	xor a
-	ld a, [hl]
-
-.asm_1833
-	pop bc
-	pop hl
-	ret
-; 1836
-
-Function1836: ; 1836
-	push de
-	push hl
-
-	ld b, a
-	ld a, [hROMBank]
-	push af
-	ld a, BANK(Function142a7)
-	rst Bankswitch
-
-	ld a, b
-	call Function142a7
-	ld c, a
-
-	pop de
-	ld a, d
-	rst Bankswitch
-
-	pop hl
-	pop de
-	ret
-; 184a
-
-
-
-Function184a: ; 184a
-	ld a, [StandingTile]
-	call GetTileCollision
-	ld b, a
-	ret
-; 1852
-
-Function1852: ; 1852
-	ld a, [StandingTile]
-	call GetTileCollision
-	sub 1
-	ret z
-	and a
-	ret
-; 185d
-
-
-GetTileCollision: ; 185d
-; Get the collision type of tile a.
-
-	push de
-	push hl
-
-	ld hl, TileCollisionTable
-	ld e, a
-	ld d, 0
-	add hl, de
-
-	ld a, [hROMBank]
-	push af
-	ld a, BANK(TileCollisionTable)
-	rst Bankswitch
-	ld e, [hl]
-	pop af
-	rst Bankswitch
-
-	ld a, e
-	and $f ; lo nybble only
-
-	pop hl
-	pop de
-	ret
-; 1875
-
-
-Function1875: ; 1875
-	ld d, a
-	and $f0
-	cp $10
-	jr z, .asm_1882
-	cp $20
-	jr z, .asm_1888
-	scf
-	ret
-
-.asm_1882
-	ld a, d
-	and 7
-	ret z
-	scf
-	ret
-
-.asm_1888
-	ld a, d
-	and 7
-	ret z
-	scf
-	ret
-; 188e
-
-Function188e: ; 188e
-	cp $14
-	ret z
-	cp $1c
-	ret
-; 1894
-
-CheckCutTreeTile: ; 1894
-	cp $12
-	ret z
-	cp $1a
-	ret
-; 189a
-
-CheckHeadbuttTreeTile: ; 189a
-	cp $15
-	ret z
-	cp $1d
-	ret
-; 18a0
-
-CheckCounterTile: ; 18a0
-	cp $90
-	ret z
-	cp $98
-	ret
-; 18a6
-
-CheckPitTile: ; 18a6
-	cp $60
-	ret z
-	cp $68
-	ret
-; 18ac
-
-CheckIceTile: ; 18ac
-	cp $23
-	ret z
-	cp $2b
-	ret z
-	scf
-	ret
-; 18b4
-
-CheckWhirlpoolTile: ; 18b4
-	nop
-	cp $24
-	ret z
-	cp $2c
-	ret z
-	scf
-	ret
-; 18bd
-
-CheckWaterfallTile: ; 18bd
-	cp $33
-	ret z
-	cp $3b
-	ret
-; 18c3
-
-CheckStandingOnEntrance: ; 18c3
-	ld a, [StandingTile]
-	cp $71 ; door
-	ret z
-	cp $79
-	ret z
-	cp $7a ; stairs
-	ret z
-	cp $7b ; cave
-	ret
-; 18d2
-
-
-GetMapObject: ; 18d2
-; Return the location of map object a in bc.
-	ld hl, MapObjects
-	ld bc, $10
-	call AddNTimes
-	ld b, h
-	ld c, l
-	ret
-; 18de
-
-
-Function18de: ; 18de
-	ld [hConnectionStripLength], a
-	call GetMapObject
-	ld hl, $0000
-	add hl, bc
-	ld a, [hl]
-	cp $ff
-	jr z, .asm_18f3
-	ld [hConnectedMapWidth], a
-	call Function1ae5
-	and a
-	ret
-
-.asm_18f3
-	scf
-	ret
-; 18f5
-
-Function18f5: ; 18f5
-	ld hl, $0006
-	add hl, bc
-	ld a, [hl]
-	cp $ff
-	jr nz, .asm_1921
-	ld hl, $0007
-	add hl, bc
-	ld a, [hl]
-	cp $ff
-	jr z, .asm_191c
-	ld hl, .data_191e
-	ld a, [TimeOfDay]
-	add l
-	ld l, a
-	jr nc, .asm_1912
-	inc h
-
-.asm_1912
-	ld a, [hl]
-	ld hl, $0007
-	add hl, bc
-	and [hl]
-	jr nz, .asm_191c
-	scf
-	ret
-
-.asm_191c
-	and a
-	ret
-
-.data_191e
-	db $1
-	db $2
-	db $4
-
-.asm_1921
-	ld hl, $0006
-	add hl, bc
-	ld d, [hl]
-	ld hl, $0007
-	add hl, bc
-	ld e, [hl]
-	ld hl, hHours
-	ld a, d
-	cp e
-	jr z, .asm_1949
-	jr c, .asm_193f
-	ld a, [hl]
-	cp d
-	jr nc, .asm_1949
-	cp e
-	jr c, .asm_1949
-	jr z, .asm_1949
-	jr .asm_194b
-
-.asm_193f
-	ld a, e
-	cp [hl]
-	jr c, .asm_194b
-	ld a, [hl]
-	cp d
-	jr nc, .asm_1949
-	jr .asm_194b
-
-.asm_1949
-	and a
-	ret
-
-.asm_194b
-	scf
-	ret
-; 194d
-
-Function194d: ; 194d
-	ld [hConnectionStripLength], a
-	call GetMapObject
-	call $40e7
-	ret
-; 1956
-
-
-
-Function1956: ; 1956
-	ld [hConnectionStripLength], a
-	call Function271e
-	ld a, [hConnectionStripLength]
-	call GetMapObject
-	ld a, $2
-	ld hl, $40e7
-	rst FarCall
-	ret
-; 1967
-
-Function1967: ; 1967
-	ld [hConnectionStripLength], a
-	call GetMapObject
-	ld hl, $0000
-	add hl, bc
-	ld a, [hl]
-	cp $ff
-	ret z
-	ld [hl], $ff
-	push af
-	call Function1985
-	pop af
-	call Function1ae5
-	callba Function4357
-	ret
-; 1985
-
-Function1985: ; 1985
-	ld hl, $d4cd
-	cp [hl]
-	jr z, .asm_1990
-	ld hl, $d4ce
-	cp [hl]
-	ret nz
-
-.asm_1990
-	callba Function581f
-	ld a, $ff
-	ld [$d4cd], a
-	ld [$d4ce], a
-	ret
-; 199f
-
-Function199f: ; 199f
-	call Function1967
-	call Function2712
-	ret
-; 19a6
-
-Function19a6: ; 19a6
-	push hl
-	call GetMapObject
-	ld d, b
-	ld e, c
-	ld a, $ff
-	ld [de], a
-	inc de
-	pop hl
-	ld bc, $000f
-	call CopyBytes
-	ret
-; 19b8
-
-Function19b8: ; 19b8
-	call GetMapObject
-	ld hl, $0000
-	add hl, bc
-	ld a, [hl]
-	push af
-	ld [hl], $ff
-	inc hl
-	ld bc, $000f
-	xor a
-	call ByteFill
-	pop af
-	cp $ff
-	ret z
-	cp $d
-	ret nc
-	ld b, a
-	ld a, [$d4cd]
-	cp b
-	jr nz, .asm_19de
-	ld a, $ff
-	ld [$d4cd], a
-
-.asm_19de
-	ld a, b
-	call Function1ae5
-	callba Function4357
-	ret
-; 19e9
-
-
-
-Function19e9: ; 19e9
-	ld [$c2e2], a
-	ld a, [hROMBank]
-	ld [$c2e3], a
-	ld a, l
-	ld [$c2e4], a
-	ld a, h
-	ld [$c2e5], a
-	ld a, [$c2e2]
-	call Function18de
-	ret c
-	ld hl, $0003
-	add hl, bc
-	ld [hl], $14
-	ld hl, $0009
-	add hl, bc
-	ld [hl], $0
-	ld hl, VramState
-	set 7, [hl]
-	and a
-	ret
-; 1a13
-
-
-
-Function1a13: ; 1a13
-	push bc
-	push de
-	ld hl, $d4d6
-	ld de, $0028
-	ld c, $d
-.asm_1a1d
-	ld a, [hl]
-	and a
-	jr z, .asm_1a28
-	add hl, de
-	dec c
-	jr nz, .asm_1a1d
-	xor a
-	jr .asm_1a2c
-
-.asm_1a28
-	ld a, $d
-	sub c
-	scf
-
-.asm_1a2c
-	pop de
-	pop bc
-	ret
-; 1a2f
-
-
-
-Function1a2f: ; 1a2f
-	ld hl, $0003
-	add hl, bc
-	ld a, [hl]
-	cp $25
-	jr c, .asm_1a39
-	xor a
-
-.asm_1a39
-	ld hl, Data4273
-	ld e, a
-	ld d, 0
-	add hl, de
-	add hl, de
-	add hl, de
-	add hl, de
-	add hl, de
-	add hl, de
-	ld a, [hl]
-	ret
-; 1a47
-
-Function1a47: ; 1a47
-	push bc
-	push de
-	ld e, a
-	ld d, 0
-	ld hl, Data4273 + 1
-	add hl, de
-	add hl, de
-	add hl, de
-	add hl, de
-	add hl, de
-	add hl, de
-	ld a, BANK(Data4273)
-	call GetFarByte
-	add a
-	add a
-	and $c
-	pop de
-	pop bc
-	ret
-; 1a61
-
-
-Function1a61: ; 1a61
-	ld l, a
-	ld a, [hROMBank]
-	push af
-	ld a, BANK(Data4273)
-	rst Bankswitch
-	ld a, l
-	push bc
-
-	call Function1a71
-
-	pop bc
-	pop af
-	rst Bankswitch
-
-	ret
-; 1a71
-
-Function1a71: ; 1a71
-	ld hl, $0003
-	add hl, de
-	ld [hl], a
-	push de
-	ld e, a
-	ld d, 0
-	ld hl, Data4273 + 1
-	add hl, de
-	add hl, de
-	add hl, de
-	add hl, de
-	add hl, de
-	add hl, de
-	ld b, h
-	ld c, l
-	pop de
-	ld a, [bc]
-	inc bc
-	rlca
-	rlca
-	and $c
-	ld hl, $0008
-	add hl, de
-	ld [hl], a
-	ld a, [bc]
-	inc bc
-	ld hl, $000b
-	add hl, de
-	ld [hl], a
-	ld a, [bc]
-	inc bc
-	ld hl, $0004
-	add hl, de
-	ld [hl], a
-	ld a, [bc]
-	inc bc
-	ld hl, $0005
-	add hl, de
-	ld [hl], a
-	ld a, [bc]
-	inc bc
-	ld hl, $0006
-	add hl, de
-	ld [hl], a
-	ret
-; 1aae
-
-Function1aae: ; 1aae
-	ld a, [hROMBank]
-	push af
-	ld a, [hli]
-	rst Bankswitch
-
-	ld a, [hli]
-	ld d, [hl]
-	ld hl, $001b
-	add hl, bc
-	add [hl]
-	ld e, a
-	ld a, d
-	adc $0
-	ld d, a
-	inc [hl]
-	ld a, [de]
-	ld h, a
-	pop af
-	rst Bankswitch
-
-	ld a, h
-	ret
-; 1ac6
-
-Function1ac6: ; 1ac6
-	ld hl, VramState
-	set 0, [hl]
-	ret
-; 1acc
-
-Function1acc: ; 1acc
-	ld hl, VramState
-	res 0, [hl]
-	ret
-; 1ad2
-
-
-Function1ad2: ; 1ad2
-	ld a, [VramState]
-	bit 0, a
-	ret z
-	callba Function55e0
-	callba Function5920
-	ret
-; 1ae5
-
-
-Function1ae5: ; 1ae5
-	ld bc, $0028
-	ld hl, $d4d6
-	call AddNTimes
-	ld b, h
-	ld c, l
-	ret
-; 1af1
-
-Function1af1: ; 1af1
-	ld hl, $0000
-	add hl, bc
-	ld a, [hl]
-	and a
-	ret
-; 1af8
-
-Function1af8: ; 1af8
-	push af
-	ld hl, $0008
-	add hl, bc
-	ld a, [hl]
-	and $f3
-	ld e, a
-	pop af
-	and $c
-	or e
-	ld [hl], a
-	ret
-; 1b07
-
-
-GetSpriteDirection: ; 1b07
-	ld hl, $0008
-	add hl, bc
-	ld a, [hl]
-	and $c
-	ret
-; 1b0f
-
-
-Cosine: ; 1b0f
-; Return d * cos(a) in hl
-	add $10 ; 90 degrees
-
-Sine: ; 1b11
-; Return d * sin(a) in hl
-; a is a signed 6-bit value.
-
-	ld e, a
-
-	ld a, [hROMBank]
-	push af
-	ld a, BANK(_Sine)
-	rst Bankswitch
-
-	call _Sine
-
-	pop af
-	rst Bankswitch
-	ret
-; 1b1e
-
-
 Function1b1e: ; 1b1e
 	ld [$d003], a
 	xor a
@@ -1772,607 +473,9 @@
 ; 1d35
 
 
-LoadMenuDataHeader: ; 0x1d35
-	call Function1d3c
-	call Function1c00
-	ret
+INCLUDE "engine/menu.asm"
 
-Function1d3c: ; 0x1d3c
-	ld de, $cf81
-	ld bc, $0010
-	call CopyBytes
-	ld a, [hROMBank]
-	ld [$cf8a], a
-	ret
-; 0x1d4b
 
-Function1d4b: ; 1d4b
-	ld [$cf88], a
-	ret
-; 1d4f
-
-
-Function1d4f: ; 1d4f
-	push hl
-	call Function1d58
-	pop hl
-	jp PrintText
-; 1d57
-
-Function1d57: ; 1d57
-	ret
-; 1d58
-
-Function1d58: ; 1d58
-	ld hl, MenuDataHeader_0x1d5f
-	call LoadMenuDataHeader
-	ret
-; 1d5f
-
-MenuDataHeader_0x1d5f: ; 1d5f
-	db $40 ; tile backup
-	db 12, 0 ; start coords
-	db 17, 19 ; end coords
-	dw VTiles0
-	db 0 ; default option
-; 1d67
-
-Function1d67: ; 1d67
-	call Function1d4f
-	call Function1c17
-	ret
-; 1d6e
-
-Function1d6e: ; 1d6e
-	ld hl, MenuDataHeader_0x1d75
-	call LoadMenuDataHeader
-	ret
-; 1d75
-
-MenuDataHeader_0x1d75: ; 1d75
-	db $40 ; tile backup
-	db 0, 0 ; start coords
-	db 17, 19 ; end coords
-	dw $0000
-	db 1 ; default option
-; 1d7d
-
-Function1d7d: ; 1d7d
-	call Function1c07
-	ret
-; 1d81
-
-Function1d81: ; 0x1d81
-	xor a
-	ld [hBGMapMode], a
-	call Function1cbb
-	call Function1ad2
-	call Function1c89
-	call Function321c
-	call Function1c66
-	ld a, [$cf91]
-	bit 7, a
-	jr z, .asm_1da7 ; 0x1d98 $d
-	call Function1c10
-	call Function1bc9
-	call Function1ff8
-	bit 1, a
-	jr z, .asm_1da9 ; 0x1da5 $2
-.asm_1da7
-	scf
-	ret
-.asm_1da9
-	and a
-	ret
-; 0x1dab
-
-Function1dab: ; 1dab
-	call LoadMenuDataHeader
-	call Function1d81
-	call Function1c17
-	ld a, [$cfa9]
-	ret
-; 1db8
-
-Function1db8: ; 0x1db8
-	push hl
-	push bc
-	push af
-	ld hl, $cf86
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	inc hl
-	inc hl
-	pop af
-	call GetNthString
-	ld d, h
-	ld e, l
-	call CopyName1
-	pop bc
-	pop hl
-	ret
-; 0x1dcf
-
-
-Function1dcf: ; 1dcf
-	ld bc, $0e07
-
-Function1dd2: ; 1dd2
-	jr Function1dd9
-
-Function1dd4: ; 1dd4
-	call LoadMenuDataHeader
-	jr Function1dfe
-
-Function1dd9: ; 1dd9
-	push bc
-	ld hl, MenuDataHeader_0x1e1d
-	call Function1d3c
-	pop bc
-	ld a, b
-	cp $e
-	jr nz, .asm_1de9
-	ld a, $e
-	ld b, a
-
-.asm_1de9
-	ld a, b
-	ld [$cf83], a
-	add $5
-	ld [$cf85], a
-	ld a, c
-	ld [$cf82], a
-	add $4
-	ld [$cf84], a
-	call Function1c00
-
-Function1dfe: ; 1dfe
-	call Function1d81
-	push af
-	ld c, $f
-	call DelayFrames
-	call Function1c17
-	pop af
-	jr c, .asm_1e16
-	ld a, [$cfa9]
-	cp $2
-	jr z, .asm_1e16
-	and a
-	ret
-
-.asm_1e16
-	ld a, $2
-	ld [$cfa9], a
-	scf
-	ret
-; 1e1d
-
-MenuDataHeader_0x1e1d: ; 1e1d
-	db $40 ; tile backup
-	db 5, 10 ; start coords
-	db 9, 15 ; end coords
-	dw MenuData2_0x1e25
-	db 1 ; default option
-; 1e25
-
-MenuData2_0x1e25: ; 1e25
-	db $c0 ; flags
-	db 2
-	db "YES@"
-	db "NO@"
-; 1e2e
-
-Function1e2e: ; 1e2e
-	call Function1e35
-	call Function1c00
-	ret
-; 1e35
-
-Function1e35: ; 1e35
-	push de
-	call Function1d3c
-	pop de
-	ld a, [$cf83]
-	ld h, a
-	ld a, [$cf85]
-	sub h
-	ld h, a
-	ld a, d
-	ld [$cf83], a
-	add h
-	ld [$cf85], a
-	ld a, [$cf82]
-	ld l, a
-	ld a, [$cf84]
-	sub l
-	ld l, a
-	ld a, e
-	ld [$cf82], a
-	add l
-	ld [$cf84], a
-	ret
-; 1e5d
-
-Function1e5d: ; 1e5d
-	call MenuFunc_1e7f
-	call MenuWriteText
-	call Function1eff
-	call Function1f23
-	call Function1bdd
-	call Function1ff8
-	ret
-; 1e70
-
-SetUpMenu: ; 1e70
-	call MenuFunc_1e7f ; ???
-	call MenuWriteText
-	call Function1eff ; set up selection pointer
-	ld hl, $cfa5
-	set 7, [hl]
-	ret
-
-MenuFunc_1e7f: ; 0x1e7f
-	call Function1c66
-	call Function1ebd
-	call Function1ea6
-	call Function1cbb
-	ret
-
-MenuWriteText: ; 0x1e8c
-	xor a
-	ld [hBGMapMode], a
-	call Function1ebd ; sort out the text 
-	call Function1eda ; actually write it
-	call Function2e31
-	ld a, [hOAMUpdate]
-	push af
-	ld a, $1
-	ld [hOAMUpdate], a
-	call Function321c
-	pop af
-	ld [hOAMUpdate], a
-	ret
-; 0x1ea6
-
-Function1ea6: ; 1ea6
-	ld a, [$cf83]
-	ld c, a
-	ld a, [$cf85]
-	sub c
-	ld c, a
-	ld a, [$cf92]
-	add a
-	inc a
-	ld b, a
-	ld a, [$cf82]
-	add b
-	ld [$cf84], a
-	ret
-; 1ebd
-
-Function1ebd: ; 1ebd
-	ld hl, $cf93
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld a, [$cf76]
-	and a
-	jr z, .asm_1ed3
-	ld b, a
-	ld c, $ff
-.asm_1ecc
-	ld a, [hli]
-	cp c
-	jr nz, .asm_1ecc
-	dec b
-	jr nz, .asm_1ecc
-
-.asm_1ed3
-	ld d, h
-	ld e, l
-	ld a, [hl]
-	ld [$cf92], a
-	ret
-; 1eda
-
-Function1eda: ; 1eda
-	call Function1cfd
-	ld bc, $002a
-	add hl, bc
-.asm_1ee1
-	inc de
-	ld a, [de]
-	cp $ff
-	ret z
-	ld [MenuSelection], a
-	push de
-	push hl
-	ld d, h
-	ld e, l
-	ld hl, $cf95
-	call Function1efb
-	pop hl
-	ld de, $0028
-	add hl, de
-	pop de
-	jr .asm_1ee1
-; 1efb
-
-Function1efb: ; 1efb
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	jp [hl]
-; 1eff
-
-Function1eff: ; 1eff
-	call Function1c10
-	ld hl, $cfa8
-	ld a, [$cf91]
-	bit 3, a
-	jr z, .asm_1f0e
-	set 3, [hl]
-
-.asm_1f0e
-	ld a, [$cf91]
-	bit 2, a
-	jr z, .asm_1f19
-	set 5, [hl]
-	set 4, [hl]
-
-.asm_1f19
-	ret
-; 1f1a
-
-
-Function1f1a: ; 1f1a
-	call Function1bd3
-	ld hl, $cfa8
-	and [hl]
-	jr Function1f2a
-; 1f23
-
-Function1f23: ; 1f23
-	xor a
-	ld [$cf73], a
-	call Function1bc9
-; 1f2a
-
-Function1f2a: ; 1f2a
-	bit 0, a
-	jr nz, .asm_1f52
-	bit 1, a
-	jr nz, .asm_1f6d
-	bit 3, a
-	jr nz, .asm_1f6d
-	bit 4, a
-	jr nz, .asm_1f44
-	bit 5, a
-	jr nz, .asm_1f4b
-	xor a
-	ld [$cf73], a
-	jr .asm_1f57
-
-.asm_1f44
-	ld a, $10
-	ld [$cf73], a
-	jr .asm_1f57
-
-.asm_1f4b
-	ld a, $20
-	ld [$cf73], a
-	jr .asm_1f57
-
-.asm_1f52
-	ld a, $1
-	ld [$cf73], a
-
-.asm_1f57
-	call Function1ebd
-	ld a, [$cfa9]
-	ld l, a
-	ld h, $0
-	add hl, de
-	ld a, [hl]
-	ld [MenuSelection], a
-	ld a, [$cfa9]
-	ld [$cf88], a
-	and a
-	ret
-
-.asm_1f6d
-	ld a, $2
-	ld [$cf73], a
-	ld a, $ff
-	ld [MenuSelection], a
-	scf
-	ret
-; 1f79
-
-Function1f79: ; 1f79
-	push de
-	ld hl, $cf97
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld a, [MenuSelection]
-	call GetNthString
-	ld d, h
-	ld e, l
-	pop hl
-	call PlaceString
-	ret
-; 1f8d
-
-Function1f8d: ; 1f8d
-	push de
-	ld a, [MenuSelection]
-	call Function1fb1
-	inc hl
-	inc hl
-	ld a, [hli]
-	ld d, [hl]
-	ld e, a
-	pop hl
-	call PlaceString
-	ret
-; 1f9e
-
-Function1f9e: ; 1f9e
-	call Function1fb1
-	inc hl
-	inc hl
-	ld a, [hli]
-	ld d, [hl]
-	ld e, a
-	ret
-; 1fa7
-
-Function1fa7: ; 1fa7
-	ld a, [MenuSelection]
-	call Function1fb1
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	jp [hl]
-; 1fb1
-
-Function1fb1: ; 1fb1
-	ld e, a
-	ld d, $0
-	ld hl, $cf97
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	add hl, de
-	add hl, de
-	add hl, de
-	add hl, de
-	ret
-; 1fbf
-
-Function1fbf: ; 1fbf
-	ld hl, $cf71
-	call Function1ff0
-	ld hl, $cf81
-	call Function1ff0
-	ld hl, $cf91
-	call Function1ff0
-	ld hl, $cfa1
-	call Function1ff0
-	ld a, [rSVBK]
-	push af
-	ld a, $7
-	ld [rSVBK], a
-	xor a
-	ld hl, $dfff
-	ld [hld], a
-	ld [hld], a
-	ld a, l
-	ld [$cf71], a
-	ld a, h
-	ld [$cf72], a
-	pop af
-	ld [rSVBK], a
-	ret
-; 1ff0
-
-Function1ff0: ; 1ff0
-	ld bc, $0010
-	xor a
-	call ByteFill
-	ret
-; 1ff8
-
-Function1ff8: ; 1ff8
-	push af
-	and $3
-	jr z, .asm_2007
-	ld hl, $cf81
-	bit 3, [hl]
-	jr nz, .asm_2007
-	call PlayClickSFX
-
-.asm_2007
-	pop af
-	ret
-; 2009
-
-
-PlayClickSFX: ; 2009 
-	push de
-	ld de, SFX_READ_TEXT_2
-	call StartSFX
-	pop de
-	ret
-; 0x2012
-
-Function2012: ; 2012
-	call Function1d4f
-	call Functiona46
-	call Function1c07
-	ret
-; 201c
-
-Function201c: ; 201c
-	ld [hBuffer], a
-	ld a, [hROMBank]
-	push af
-	ld a, [hBuffer]
-	rst Bankswitch
-
-	call PlaceString
-	pop af
-	rst Bankswitch
-
-	ret
-; 202a
-
-Function202a: ; 202a
-	ld a, [hROMBank]
-	ld [$cf94], a
-	ld a, $9
-	ld hl, $400e
-	rst FarCall
-	ld a, [$cf88]
-	ret
-; 2039
-
-Function2039: ; 2039
-	ld a, [hROMBank]
-	ld [$cf94], a
-	ld a, $9
-	ld hl, $4022
-	rst FarCall
-	ld a, [$cf88]
-	ret
-; 2048
-
-Function2048: ; 2048
-	ld a, [hROMBank]
-	ld [$cf94], a
-	ld a, $9
-	ld hl, $403c
-	rst FarCall
-	ld a, [$cf88]
-	ret
-; 2057
-
-Function2057: ; 2057
-	ld a, [hROMBank]
-	push af
-	ld a, $21
-	rst Bankswitch
-
-	call $42db
-	pop af
-	rst Bankswitch
-
-	ret
-; 2063
-
-
 AskSerial: ; 2063
 ; send out a handshake while serial int is off
 	ld a, [$c2d4]
@@ -2412,147 +515,9 @@
 ; 208a
 
 
-ResetGameTime: ; 208a
-	xor a
-	ld [GameTimeCap], a
-	ld [GameTimeHours], a
-	ld [GameTimeHours + 1], a
-	ld [GameTimeMinutes], a
-	ld [GameTimeSeconds], a
-	ld [GameTimeFrames], a
-	ret
-; 209e
+INCLUDE "engine/game_time.asm"
 
 
-GameTimer: ; 209e
-; precautionary
-	nop
-	
-; save wram bank
-	ld a, [rSVBK]
-	push af
-	
-	ld a, $1
-	ld [rSVBK], a
-	
-	call UpdateGameTimer
-	
-; restore wram bank
-	pop af
-	ld [rSVBK], a
-	ret
-; 20ad
-
-
-UpdateGameTimer: ; 20ad
-; increment the game timer by one frame
-; capped at 999:59:59.00 after exactly 1000 hours
-
-; pause game update?
-	ld a, [$c2cd]
-	and a
-	ret nz
-	
-; game timer paused?
-	ld hl, GameTimerPause
-	bit 0, [hl]
-	ret z
-	
-; reached cap? (999:00:00.00)
-	ld hl, GameTimeCap
-	bit 0, [hl]
-	ret nz
-	
-; increment frame counter
-	ld hl, GameTimeFrames ; frame counter
-	ld a, [hl]
-	inc a
-
-; reached 1 second?
-	cp 60 ; frames/second
-	jr nc, .second ; 20c5 $2
-	
-; update frame counter
-	ld [hl], a
-	ret
-	
-.second
-; reset frame counter
-	xor a
-	ld [hl], a
-	
-; increment second counter
-	ld hl, GameTimeSeconds
-	ld a, [hl]
-	inc a
-	
-; reached 1 minute?
-	cp 60 ; seconds/minute
-	jr nc, .minute
-	
-; update second counter
-	ld [hl], a
-	ret
-	
-.minute
-; reset second counter
-	xor a
-	ld [hl], a
-	
-; increment minute counter
-	ld hl, GameTimeMinutes
-	ld a, [hl]
-	inc a
-	
-; reached 1 hour?
-	cp 60 ; minutes/hour
-	jr nc, .hour
-	
-; update minute counter
-	ld [hl], a
-	ret
-	
-.hour
-; reset minute counter
-	xor a
-	ld [hl], a
-	
-; increment hour counter
-	ld a, [GameTimeHours]
-	ld h, a
-	ld a, [GameTimeHours+1]
-	ld l, a
-	inc hl
-	
-; reached 1000 hours?
-	ld a, h
-	cp $3 ; 1000 / $100
-	jr c, .updatehr
-	
-	ld a, l
-	cp $e8 ; 1000 & $ff
-	jr c, .updatehr
-	
-; cap at 999:59:59.00
-	ld hl, GameTimeCap
-	set 0, [hl] ; stop timer
-	
-	ld a, 59
-	ld [GameTimeMinutes], a
-	ld [GameTimeSeconds], a
-	
-; this will never be run again
-	ret
-	
-.updatehr
-	ld a, h
-	ld [GameTimeHours], a
-	ld a, l
-	ld [GameTimeHours+1], a
-	ret
-; 210f
-
-
 Function210f: ; 210f
 	ld hl, $c7e8
 	ld bc, $0018
@@ -2700,28 +665,11 @@
 	ld a, [TilesetBlocksAddress]
 	add l
 	ld l, a
-	ld a, [$d1de]
+	ld a, [TilesetBlocksAddress + 1]
 	adc h
 	ld h, a
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, e
-	add $14
-	ld e, a
-	jr nc, .asm_21d8
-	inc d
 
-.asm_21d8
+rept 3
 	ld a, [hli]
 	ld [de], a
 	inc de
@@ -2734,32 +682,15 @@
 	ld a, [hli]
 	ld [de], a
 	inc de
-	ld a, e
-	add $14
-	ld e, a
-	jr nc, .asm_21eb
-	inc d
 
-.asm_21eb
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hli]
-	ld [de], a
-	inc de
 	ld a, e
-	add $14
+	add 20
 	ld e, a
-	jr nc, .asm_21fe
+	jr nc, .next\@
 	inc d
+.next\@
+endr
 
-.asm_21fe
 	ld a, [hli]
 	ld [de], a
 	inc de
@@ -2772,6 +703,7 @@
 	ld a, [hli]
 	ld [de], a
 	inc de
+
 	pop hl
 	ld de, $0004
 	add hl, de
@@ -2799,9 +731,7 @@
 Function222a: ; 222a
 	ld a, $fa
 	ld [$ff9f], a
-	ld a, $5
-	ld hl, $5363
-	rst FarCall
+	callba Function15363
 	xor a
 	ld [$ff9f], a
 	ret
@@ -2811,9 +741,7 @@
 	call Function2252
 	ret nc
 	push bc
-	ld a, $5
-	ld hl, $49af
-	rst FarCall
+	callba Function149af
 	pop bc
 	ret nc
 	call Function22a7
@@ -2831,18 +759,18 @@
 ; 2252
 
 Function2252: ; 2252
-	ld a, $5
-	ld hl, $499a
-	rst FarCall
+	callba Function1499a
 	ret nc
+
 	ld a, [hROMBank]
 	push af
+
 	call Function2c52
 	call Function2266
+
 	pop de
 	ld a, d
 	rst Bankswitch
-
 	ret
 ; 2266
 
@@ -2907,11 +835,12 @@
 Function22a7: ; 22a7
 	ld a, [hROMBank]
 	push af
+
 	call Function2c52
 	call Function22b4
+
 	pop af
 	rst Bankswitch
-
 	scf
 	ret
 ; 22b4
@@ -2971,16 +900,16 @@
 	ret
 ; 2300
 
-
 Function2300: ; 2300
-	cp $3
+	cp INDOOR
 	ret z
-	cp $6
+	cp GATE
 	ret z
 	cp $5
 	ret
 ; 2309
 
+
 Function2309: ; 2309
 	call Function2326
 	call Function2c52
@@ -2999,8 +928,6 @@
 	ret
 ; 2326
 
-
-
 Function2326: ; 2326
 	call Function2c3d
 	call Function2c1c
@@ -3056,29 +983,31 @@
 	ld [SouthConnectedMapGroup], a
 	ld [WestConnectedMapGroup], a
 	ld [EastConnectedMapGroup], a
+
 	ld a, [$d1a8]
 	ld b, a
+
 	bit 3, b
 	jr z, .asm_2384
-	ld de, NorthConnectedMapGroup
+	ld de, NorthMapConnection
 	call GetMapConnection
 
 .asm_2384
 	bit 2, b
 	jr z, .asm_238e
-	ld de, SouthConnectedMapGroup
+	ld de, SouthMapConnection
 	call GetMapConnection
 
 .asm_238e
 	bit 1, b
 	jr z, .asm_2398
-	ld de, WestConnectedMapGroup
+	ld de, WestMapConnection
 	call GetMapConnection
 
 .asm_2398
 	bit 0, b
 	jr z, .asm_23a2
-	ld de, EastConnectedMapGroup
+	ld de, EastMapConnection
 	call GetMapConnection
 
 .asm_23a2
@@ -3086,7 +1015,6 @@
 ; 23a3
 
 
-
 GetMapConnection: ; 23a3
 ; Load map connection struct at hl into de.
 	ld c, SouthMapConnection - NorthMapConnection
@@ -3548,6 +1476,7 @@
 	ret
 ; 261f
 
+
 CallScript: ; 261f
 ; Call a script at a:hl.
 
@@ -3556,10 +1485,10 @@
 	ld [ScriptPos], a
 	ld a, h
 	ld [ScriptPos + 1], a
-	
+
 	ld a, $ff
 	ld [ScriptRunning], a
-	
+
 	scf
 	ret
 ; 2631
@@ -3578,7 +1507,8 @@
 	push af
 	call Function2c52
 	call Function2653
-	jr nc, .asm_2650
+	jr nc, .done
+
 	call GetMapEventBank
 	ld b, a
 	ld d, h
@@ -3585,10 +1515,9 @@
 	ld e, l
 	call Function2674
 
-.asm_2650
+.done
 	pop af
 	rst Bankswitch
-
 	ret
 ; 2653
 
@@ -3649,7 +1578,7 @@
 	push hl
 	call SpeechTextBox
 	call Function2e31
-	ld a, $1
+	ld a, 1
 	ld [hOAMUpdate], a
 	call Function321c
 	pop hl
@@ -3663,6 +1592,8 @@
 ; 26b7
 
 Function26b7: ; 26b7
+; Call a:de.
+
 	ld [hBuffer], a
 	ld a, [hROMBank]
 	push af
@@ -3669,14 +1600,13 @@
 	ld a, [hBuffer]
 	rst Bankswitch
 
-	call Function26c5
+	call .de
+
 	pop af
 	rst Bankswitch
-
 	ret
-; 26c5
 
-Function26c5: ; 26c5
+.de
 	push de
 	ret
 ; 26c7
@@ -3689,10 +1619,10 @@
 
 	ld a, c
 	call Function19e9
+
 	pop hl
 	ld a, h
 	rst Bankswitch
-
 	ret
 ; 26d4
 
@@ -3702,10 +1632,8 @@
 
 	push hl
 	push bc
-
 	ld a, [hROMBank]
 	push af
-
 	ld a, [ScriptBank]
 	rst Bankswitch
 
@@ -3725,7 +1653,6 @@
 	pop af
 	rst Bankswitch
 	ld a, b
-
 	pop bc
 	pop hl
 	ret
@@ -4593,7 +2520,7 @@
 	ld b, $9
 	call GetSGBLayout
 	callba Function49409
-	call Function485
+	call UpdateTimePals
 	call DelayFrame
 	ld a, $1
 	ld [$ffde], a
@@ -4979,131 +2906,59 @@
 ; 2d54
 
 
-FarCall_de: ; 2d54
-; Call a:de.
-; Preserves other registers.
+INCLUDE "engine/farcall.asm"
 
-	ld [hBuffer], a
-	ld a, [hROMBank]
-	push af
-	ld a, [hBuffer]
-	rst Bankswitch
-	call .de
-	jr ReturnFarCall
 
-.de
-	push de
-	ret
-; 2d63
+Predef: ; 2d83
+; Call predefined function a.
+; Preserves bc, de, hl and f.
 
-
-FarCall_hl: ; 2d63
-; Call a:hl.
-; Preserves other registers.
-
-	ld [hBuffer], a
+	ld [PredefID], a
 	ld a, [hROMBank]
 	push af
-	ld a, [hBuffer]
+
+	ld a, BANK(GetPredefPointer)
 	rst Bankswitch
-	call Function2d82
-; 2d6e
+	call GetPredefPointer ; stores hl in PredefTemp
 
-ReturnFarCall: ; 2d6e
-; We want to retain the contents of f.
-; To do this, we can pop to bc instead of af.
-	
-	ld a, b
-	ld [$cfb9], a
-	ld a, c
-	ld [$cfba], a
-	
-; Restore the working bank.
-	pop bc
-	ld a, b
+; Switch to the new function's bank
 	rst Bankswitch
-	
-	ld a, [$cfb9]
-	ld b, a
-	ld a, [$cfba]
-	ld c, a
-	ret
-; 2d82
 
-Function2d82: ; 2d82
-	jp [hl]
-; 2d83
+; Instead of directly calling stuff,
+; push it to the stack in reverse.
 
-
-Predef: ; 2d83
-; call a function from given id a
-
-; relies on $cfb4-8
-
-; this function is somewhat unreadable at a glance
-; the execution flow is as follows:
-;	save bank
-;	get function from id
-;	call function
-;	restore bank
-; these are pushed to the stack in reverse
-
-; most of the $cfbx trickery is just juggling hl (which is preserved)
-; this allows hl, de and bc to be passed to the function
-
-; input:
-;	a: id
-;	parameters bc, de, hl
-
-; store id
-	ld [$cfb4], a
-	
-; save bank
-	ld a, [hROMBank] ; current bank
-	push af
-	
-; get Predef function to call
-; GetPredefFn also stores hl in $cfb5-6
-	ld a, BANK(GetPredefFn)
-	rst Bankswitch
-	call GetPredefFn
-; switch bank to Predef function
-	rst Bankswitch
-	
-; clean up after Predef call
-	ld hl, .cleanup
+	ld hl, .Return
 	push hl
 	
-; call Predef function from ret
-	ld a, [$cfb7]
+; Call the Predef function
+	ld a, [PredefAddress]
 	ld h, a
-	ld a, [$cfb8]
+	ld a, [PredefAddress + 1]
 	ld l, a
 	push hl
-	
-; get hl back
-	ld a, [$cfb5]
+
+; Get hl back
+	ld a, [PredefTemp]
 	ld h, a
-	ld a, [$cfb6]
+	ld a, [PredefTemp + 1]
 	ld l, a
 	ret
 
-.cleanup
-; store hl
+.Return
+; Clean up after the Predef call
+
 	ld a, h
-	ld [$cfb5], a
+	ld [PredefTemp], a
 	ld a, l
-	ld [$cfb6], a
-	
-; restore bank
-	pop hl ; popping a pushed af. h = a (old bank)
+	ld [PredefTemp+1], a
+
+	pop hl
 	ld a, h
 	rst Bankswitch
-	
-; get hl back
-	ld a, [$cfb5]
+
+	ld a, [PredefTemp]
 	ld h, a
-	ld a, [$cfb6]
+	ld a, [PredefTemp + 1]
 	ld l, a
 	ret
 ; 2dba
@@ -6887,7 +4742,7 @@
 Function3524: ; 3524
 	ld hl, VramState
 	bit 0, [hl]
-	jp nz, Function485
+	jp nz, UpdateTimePals
 	jp Function32f9
 ; 352f
 
@@ -14163,7 +12018,7 @@
 	ld [hWY], a
 	ld b, $8
 	call GetSGBLayout
-	call Function485
+	call UpdateTimePals
 	ld a, [$cf64]
 	cp $5
 	jr c, .asm_625e
@@ -17095,39 +14950,31 @@
 ; 854b
 
 
-GetPredefFn: ; 854b
-; input:
-;	[$cfb4] id
+GetPredefPointer: ; 854b
+; Return the bank and address of PredefID in a and PredefAddress.
 
-; save hl for later
+; Save hl for later (back in Predef)
 	ld a, h
-	ld [$cfb5], a
+	ld [PredefTemp], a
 	ld a, l
-	ld [$cfb6], a
-	
+	ld [PredefTemp + 1], a
+
 	push de
-	
-; get id
-	ld a, [$cfb4]
+	ld a, [PredefID]
 	ld e, a
-	ld d, $0
+	ld d, 0
 	ld hl, PredefPointers
-; seek
 	add hl, de
 	add hl, de
 	add hl, de
-	
 	pop de
-	
-; store address in [$cfb7-8]
-; addr lo
+
 	ld a, [hli]
-	ld [$cfb8], a
-; addr hi
+	ld [PredefAddress + 1], a
 	ld a, [hli]
-	ld [$cfb7], a
-; get bank
+	ld [PredefAddress], a
 	ld a, [hl]
+
 	ret
 ; 856b
 
@@ -17247,57 +15094,82 @@
 ; 8a68
 
 
-CheckShininess: ; 0x8a68
-; given a pointer to Attack/Defense DV in bc, determine if monster is shiny.
-; if shiny, set carry.
-	ld l,c
-	ld h,b
-	ld a,[hl]
-	and a,%00100000 ; is attack DV xx1x?
-	jr z,.NotShiny
-	ld a,[hli]
-	and a,%1111
-	cp $A ; is defense DV 1010?
-	jr nz,.NotShiny
-	ld a,[hl]
-	and a,%11110000
-	cp $A0 ; is speed DV 1010?
-	jr nz,.NotShiny
-	ld a,[hl]
-	and a,%1111
-	cp $A ; is special DV 1010?
-	jr nz,.NotShiny
+CheckShininess: ; 8a68
+; Check if a mon is shiny by DVs at bc.
+; Return carry if shiny.
+
+	ld l, c
+	ld h, b
+
+; Attack
+	ld a, [hl]
+	and %0010 << 4
+	jr z, .NotShiny
+
+; Defense
+	ld a, [hli]
+	and %1111
+	cp  %1010
+	jr nz, .NotShiny
+
+; Speed
+	ld a, [hl]
+	and %1111 << 4
+	cp  %1010 << 4
+	jr nz, .NotShiny
+
+; Special
+	ld a, [hl]
+	and %1111
+	cp  %1010
+	jr nz, .NotShiny
+
+.Shiny
 	scf
 	ret
+
 .NotShiny
-	and a ; clear carry flag
+	and a
 	ret
 ; 8a88
 
 
 CheckContestMon: ; 8a88
+; Check a mon's DVs at hl in the bug catching contest.
+; Return shiny if its DVs are good enough to place in the contest.
+
+; Attack
 	ld a, [hl]
-	cp $a0
-	jr c, .asm_8aa2
+	cp 10 << 4
+	jr c, .Bad
+
+; Defense
 	ld a, [hli]
 	and $f
-	cp $a
-	jr c, .asm_8aa2
+	cp 10
+	jr c, .Bad
+
+; Speed
 	ld a, [hl]
-	cp $a0
-	jr c, .asm_8aa2
+	cp 10 << 4
+	jr c, .Bad
+
+; Special
 	ld a, [hl]
 	and $f
-	cp $a
-	jr c, .asm_8aa2
+	cp 10
+	jr c, .Bad
+
+.Good
 	scf
 	ret
 
-.asm_8aa2
+.Bad
 	and a
 	ret
 ; 8aa4
 
+
 Function8aa4: ; 8aa4
 	push de
 	push bc
@@ -18251,7 +16123,7 @@
 	dbw $23, $40ab
 	dbw BANK(Functiond91), Functiond91
 	dbw BANK(WhiteBGMap), WhiteBGMap
-	dbw BANK(Function485), Function485
+	dbw BANK(UpdateTimePals), UpdateTimePals
 	dbw BANK(ClearTileMap), ClearTileMap
 	dbw BANK(Function1ad2), Function1ad2
 	dbw BANK(Functione4a), Functione4a
@@ -24018,12 +21890,12 @@
 	call Function2e20
 	callba Function64bf
 	call .DrawBugContestStatus
-	call Function485
+	call UpdateTimePals
 	jr .Select
 
 .Reopen
 	call Function1ad2
-	call Function485
+	call UpdateTimePals
 	call .SetUpMenuItems
 	ld a, [$d0d2]
 	ld [$cf88], a
@@ -24071,7 +21943,7 @@
 	call Function1c07
 .ReturnEnd2
 	call Function2dcf
-	call Function485
+	call UpdateTimePals
 	ret
 
 .GetInput
@@ -28529,9 +26401,22 @@
 	ret
 ; 14fd7
 
-INCBIN "baserom.gbc", $14fd7, $1509a - $14fd7
+INCBIN "baserom.gbc", $14fd7, $1500c - $14fd7
 
+Function1500c: ; 1500c
+	ld a, $1
+	call GetSRAMBank
+	ld hl, $a865
+	ld de, PartyCount
+	ld bc, $031e
+	call CopyBytes
+	call CloseSRAM
+	ret
+; 15021
 
+INCBIN "baserom.gbc", $15021, $1509a - $15021
+
+
 Function1509a: ; 1509a
 	ld a, $1
 	call GetSRAMBank
@@ -29848,14 +27733,26 @@
 Function15ee0: ; 15ee0
 	callba CheckItemMenu
 	ld a, [$d142]
-	ld hl, $5eee
+	ld hl, Table15eee
 	rst JumpTable
 	ret
 ; 15eee
 
-INCBIN "baserom.gbc", $15eee, $15efd - $15eee
+Table15eee: ; 15eee
+	dw Function15efd
+	dw Function15efc
+	dw Function15efc
+	dw Function15efc
+	dw Function15efd
+	dw Function15efd
+	dw Function15efd
+; 15efc
 
+Function15efc: ; 15efc
+	ret
+; 15efd
 
+
 Function15efd: ; 15efd
 	callba _CheckTossableItem
 	ld a, [$d142]
@@ -30156,450 +28053,9 @@
 ; 160a9
 
 
-Marts: ; 160a9
-	dw Mart0
-	dw Mart1
-	dw Mart2
-	dw Mart3
-	dw Mart4
-	dw Mart5
-	dw Mart6
-	dw Mart7
-	dw Mart8
-	dw Mart9
-	dw Mart10
-	dw Mart11
-	dw Mart12
-	dw Mart13
-	dw Mart14
-	dw Mart15
-	dw Mart16
-	dw Mart17
-	dw Mart18
-	dw Mart19
-	dw Mart20
-	dw Mart21
-	dw Mart22
-	dw Mart23
-	dw Mart24
-	dw Mart25
-	dw Mart26
-	dw Mart27
-	dw Mart28
-	dw Mart29
-	dw Mart30
-	dw Mart31
-	dw Mart32
-	dw Mart33
-MartsEnd
-; 160ed
+INCLUDE "items/marts.asm"
 
 
-Mart0: ; 160ed
-	db 4 ; # items
-	db POTION
-	db ANTIDOTE
-	db PARLYZ_HEAL
-	db AWAKENING
-	db $ff
-; 160f3
-
-Mart1: ; 160f3
-	db 5 ; # items
-	db POKE_BALL
-	db POTION
-	db ANTIDOTE
-	db PARLYZ_HEAL
-	db AWAKENING
-	db $ff
-; 160fa
-
-Mart2: ; 160fa
-	db 10 ; # items
-	db POKE_BALL
-	db POTION
-	db ESCAPE_ROPE
-	db ANTIDOTE
-	db PARLYZ_HEAL
-	db AWAKENING
-	db X_DEFEND
-	db X_ATTACK
-	db X_SPEED
-	db FLOWER_MAIL
-	db $ff
-; 16106
-
-Mart3: ; 16106
-	db 9 ; # items
-	db CHARCOAL
-	db POKE_BALL
-	db POTION
-	db SUPER_POTION
-	db ESCAPE_ROPE
-	db REPEL
-	db ANTIDOTE
-	db PARLYZ_HEAL
-	db FLOWER_MAIL
-	db $ff
-; 16111
-
-Mart4: ; 16111
-	db 5 ; # items
-	db POTION
-	db SUPER_POTION
-	db HYPER_POTION
-	db FULL_HEAL
-	db REVIVE
-	db $ff
-; 16118
-
-Mart5: ; 16118
-	db 7 ; # items
-	db POTION
-	db SUPER_POTION
-	db ANTIDOTE
-	db PARLYZ_HEAL
-	db AWAKENING
-	db BURN_HEAL
-	db ICE_HEAL
-	db $ff
-; 16121
-
-Mart6: ; 16121
-	db 8 ; # items
-	db POKE_BALL
-	db GREAT_BALL
-	db ESCAPE_ROPE
-	db REPEL
-	db REVIVE
-	db FULL_HEAL
-	db POKE_DOLL
-	db FLOWER_MAIL
-	db $ff
-; 1612b
-
-Mart7: ; 1612b
-	db 7 ; # items
-	db X_SPEED
-	db X_SPECIAL
-	db X_DEFEND
-	db X_ATTACK
-	db DIRE_HIT
-	db GUARD_SPEC
-	db X_ACCURACY
-	db $ff
-; 16134
-
-Mart8: ; 16134
-	db 5 ; # items
-	db PROTEIN
-	db IRON
-	db CARBOS
-	db CALCIUM
-	db HP_UP
-	db $ff
-; 1613b
-
-Mart9: ; 1613b
-	db 3 ; # items
-	db TM_41
-	db TM_48
-	db TM_33
-	db $ff
-; 16140
-
-Mart10: ; 16140
-	db 4 ; # items
-	db TM_41
-	db TM_48
-	db TM_33
-	db TM_02
-	db $ff
-; 16146
-
-Mart11: ; 16146
-	db 4 ; # items
-	db TM_41
-	db TM_48
-	db TM_33
-	db TM_08
-	db $ff
-; 1614c
-
-Mart12: ; 1614c
-	db 5 ; # items
-	db TM_41
-	db TM_48
-	db TM_33
-	db TM_02
-	db TM_08
-	db $ff
-; 16153
-
-Mart13: ; 16153
-	db 9 ; # items
-	db GREAT_BALL
-	db SUPER_POTION
-	db HYPER_POTION
-	db ANTIDOTE
-	db PARLYZ_HEAL
-	db AWAKENING
-	db ICE_HEAL
-	db SUPER_REPEL
-	db SURF_MAIL
-	db $ff
-; 1615e
-
-Mart14: ; 1615e
-	db 10 ; # items
-	db POKE_BALL
-	db GREAT_BALL
-	db POTION
-	db SUPER_POTION
-	db ANTIDOTE
-	db PARLYZ_HEAL
-	db AWAKENING
-	db BURN_HEAL
-	db ICE_HEAL
-	db REVIVE
-	db $ff
-; 1616a
-
-Mart15: ; 1616a
-	db 4 ; # items
-	db TINYMUSHROOM
-	db SLOWPOKETAIL
-	db POKE_BALL
-	db POTION
-	db $ff
-; 16170
-
-Mart16: ; 16170
-	db 9 ; # items
-	db RAGECANDYBAR
-	db GREAT_BALL
-	db SUPER_POTION
-	db HYPER_POTION
-	db ANTIDOTE
-	db PARLYZ_HEAL
-	db SUPER_REPEL
-	db REVIVE
-	db FLOWER_MAIL
-	db $ff
-; 1617b
-
-Mart17: ; 1617b
-	db 9 ; # items
-	db GREAT_BALL
-	db ULTRA_BALL
-	db HYPER_POTION
-	db MAX_POTION
-	db FULL_HEAL
-	db REVIVE
-	db MAX_REPEL
-	db X_DEFEND
-	db X_ATTACK
-	db $ff
-; 16186
-
-Mart18: ; 16186
-	db 9 ; # items
-	db ULTRA_BALL
-	db HYPER_POTION
-	db FULL_HEAL
-	db REVIVE
-	db ANTIDOTE
-	db PARLYZ_HEAL
-	db AWAKENING
-	db BURN_HEAL
-	db FLOWER_MAIL
-	db $ff
-; 16191
-
-Mart19: ; 16191
-	db 7 ; # items
-	db GREAT_BALL
-	db SUPER_POTION
-	db SUPER_REPEL
-	db ANTIDOTE
-	db PARLYZ_HEAL
-	db AWAKENING
-	db BURN_HEAL
-	db $ff
-; 1619a
-
-Mart20: ; 1619a
-	db 9 ; # items
-	db GREAT_BALL
-	db ULTRA_BALL
-	db SUPER_POTION
-	db SUPER_REPEL
-	db FULL_HEAL
-	db X_DEFEND
-	db X_ATTACK
-	db DIRE_HIT
-	db SURF_MAIL
-	db $ff
-; 161a5
-
-Mart21: ; 161a5
-	db 8 ; # items
-	db GREAT_BALL
-	db POTION
-	db SUPER_POTION
-	db MAX_REPEL
-	db ANTIDOTE
-	db PARLYZ_HEAL
-	db AWAKENING
-	db BURN_HEAL
-	db $ff
-; 161af
-
-Mart22: ; 161af
-	db 8 ; # items
-	db ULTRA_BALL
-	db SUPER_POTION
-	db HYPER_POTION
-	db REVIVE
-	db PARLYZ_HEAL
-	db AWAKENING
-	db BURN_HEAL
-	db LITEBLUEMAIL
-	db $ff
-; 161b9
-
-Mart23: ; 161b9
-	db 7 ; # items
-	db POTION
-	db SUPER_POTION
-	db HYPER_POTION
-	db MAX_POTION
-	db REVIVE
-	db SUPER_REPEL
-	db MAX_REPEL
-	db $ff
-; 161c2
-
-Mart24: ; 161c2
-	db 10 ; # items
-	db POKE_BALL
-	db GREAT_BALL
-	db ULTRA_BALL
-	db ESCAPE_ROPE
-	db FULL_HEAL
-	db ANTIDOTE
-	db BURN_HEAL
-	db ICE_HEAL
-	db AWAKENING
-	db PARLYZ_HEAL
-	db $ff
-; 161ce
-
-Mart25: ; 161ce
-	db 5 ; # items
-	db TM_10
-	db TM_11
-	db TM_17
-	db TM_18
-	db TM_37
-	db $ff
-; 161d5
-
-Mart26: ; 161d5
-	db 3 ; # items
-	db POKE_DOLL
-	db LOVELY_MAIL
-	db SURF_MAIL
-	db $ff
-; 161da
-
-Mart27: ; 161da
-	db 5 ; # items
-	db HP_UP
-	db PROTEIN
-	db IRON
-	db CARBOS
-	db CALCIUM
-	db $ff
-; 161e1
-
-Mart28: ; 161e1
-	db 7 ; # items
-	db X_ACCURACY
-	db GUARD_SPEC
-	db DIRE_HIT
-	db X_ATTACK
-	db X_DEFEND
-	db X_SPEED
-	db X_SPECIAL
-	db $ff
-; 161ea
-
-Mart29: ; 161ea
-	db 7 ; # items
-	db GREAT_BALL
-	db ULTRA_BALL
-	db SUPER_POTION
-	db HYPER_POTION
-	db FULL_HEAL
-	db MAX_REPEL
-	db FLOWER_MAIL
-	db $ff
-; 161f3
-
-Mart30: ; 161f3
-	db 8 ; # items
-	db GREAT_BALL
-	db ULTRA_BALL
-	db HYPER_POTION
-	db MAX_POTION
-	db FULL_HEAL
-	db X_ATTACK
-	db X_DEFEND
-	db FLOWER_MAIL
-	db $ff
-; 161fd
-
-Mart31: ; 161fd
-	db 6 ; # items
-	db POKE_DOLL
-	db FRESH_WATER
-	db SODA_POP
-	db LEMONADE
-	db REPEL
-	db PORTRAITMAIL
-	db $ff
-; 16205
-
-Mart32: ; 16205
-	db 7 ; # items
-	db ULTRA_BALL
-	db MAX_REPEL
-	db HYPER_POTION
-	db MAX_POTION
-	db FULL_RESTORE
-	db REVIVE
-	db FULL_HEAL
-	db $ff
-; 1620e
-
-Mart33: ; 1620e
-	db 4 ; # items
-	db ENERGYPOWDER
-	db ENERGY_ROOT
-	db HEAL_POWDER
-	db REVIVAL_HERB
-	db $ff
-; 16214
-
-DefaultMart: ; 16214
-	db 2 ; # items
-	db POKE_BALL
-	db POTION
-	db $ff
-; 16218
-
-
 INCBIN "baserom.gbc", $16218, $16e1d - $16218
 
 
@@ -33505,21 +30961,58 @@
 	ret
 ; 26a44
 
-INCBIN "baserom.gbc", $26a44, $26c72 - $26a44
+INCBIN "baserom.gbc", $26a44, $26b8d - $26a44
 
 
+DecorationNames: ; 26b8d
+	db "CANCEL@"
+	db "PUT IT AWAY@"
+	db "MAGNAPLANT@"
+	db "TROPICPLANT@"
+	db "JUMBOPLANT@"
+	db "TOWN MAP@"
+	db "NES@"
+	db "SUPER NES@"
+	db "NINTENDO 64@"
+	db "VIRTUAL BOY@"
+	db "GOLD TROPHY@"
+	db "SILVER TROPHY@"
+	db "SURF PIKACHU DOLL@"
+	db " BED@"
+	db " CARPET@"
+	db " POSTER@"
+	db " DOLL@"
+	db "BIG @"
+	db "FEATHERY@"
+	db "PIKACHU@"
+	db "PINK@"
+	db "POLKADOT@"
+	db "RED@"
+	db "BLUE@"
+	db "YELLOW@"
+	db "GREEN@"
+; 26c72
+
 Function26c72: ; 26c72
 	ld a, [hli]
 	ld e, [hl]
 	ld bc, StringBuffer2
 	push bc
-	ld hl, $6c7e
+	ld hl, Table26c7e
 	rst JumpTable
 	pop de
 	ret
 ; 26c7e
 
-INCBIN "baserom.gbc", $26c7e, $26c8c - $26c7e
+Table26c7e: ; 26c7e
+	dw Function26c8c
+	dw Function26c8d
+	dw Function26c90
+	dw Function26c97
+	dw Function26c9e
+	dw Function26ca6
+	dw Function26cae
+; 26c8c
 
 
 Function26c8c: ; 26c8c
@@ -33528,52 +31021,59 @@
 
 Function26c8d: ; 26c8d
 	ld a, e
-	jr .asm_26cca
+	jr Function26cca
 
+Function26c90: ; 26c90
 	call Function26c8d
 	ld a, $d
-	jr .asm_26cca
+	jr Function26cca
 
+Function26c97: ; 26c97
 	call Function26c8d
 	ld a, $e
-	jr .asm_26cca
+	jr Function26cca
 
+Function26c9e: ; 26c9e
 	ld a, e
-	call $6cc0
+	call Function26cc0
 	ld a, $f
-	jr .asm_26cca
+	jr Function26cca
 
+Function26ca6: ; 26ca6
 	ld a, e
-	call $6cc0
+	call Function26cc0
 	ld a, $10
-	jr .asm_26cca
+	jr Function26cca
 
+Function26cae: ; 26cae
 	push de
 	ld a, $11
-	call $6cca
+	call Function26cca
 	pop de
 	ld a, e
-	jr .asm_26cc0
+	jr Function26cc0
 
+Function26cb8: ; 26cb8
 	push de
-	call $6cca
+	call Function26cca
 	pop de
 	ld a, e
-	jr .asm_26cca
+	jr Function26cca
 
-.asm_26cc0
+Function26cc0: ; 26cc0
 	push bc
 	ld [$d265], a
 	call GetPokemonName
 	pop bc
-	jr .asm_26cda
+	jr Function26cda
 
-.asm_26cca
+Function26cca: ; 26cca
 	call $6ccf
-	jr .asm_26cda
+	jr Function26cda
 
+Function26ccf: ; 26ccf
 	push bc
-	ld hl, $6b8d
+	ld hl, DecorationNames
 	call GetNthString
 	ld d, h
 	ld e, l
@@ -33580,7 +31080,7 @@
 	pop bc
 	ret
 
-.asm_26cda
+Function26cda: ; 26cda
 	ld h, b
 	ld l, c
 	call CopyName2
@@ -33640,20 +31140,49 @@
 	ret
 ; 26f5f
 
-INCBIN "baserom.gbc", $26f5f, $26fb9 - $26f5f
+Table26f5f: ; 26f5f
+	dw Function26f69
+	dw Function26fb9
+	dw Function26fbe
+	dw Function26fdd
+	dw Function26fc3
+; 26f69
 
+Function26f69: ; 26f69
+	ld a, [Poster]
+	ld hl, $6f84
+	ld de, $0003
+	call IsInArray
+	jr c, .asm_26f7d
+	ld de, $6fb8
+	ld b, $9
+	ret
 
+.asm_26f7d
+	ld b, $9
+	inc hl
+	ld a, [hli]
+	ld d, [hl]
+	ld e, a
+	ret
+; 26f84
+
+INCBIN "baserom.gbc", $26f84, $26fb9 - $26f84
+
+
 Function26fb9: ; 26fb9
 	ld a, [LeftOrnament]
-	jr .asm_26fc8
+	jr Function26fc8
 
+Function26fbe: ; 26fbe
 	ld a, [RightOrnament]
-	jr .asm_26fc8
+	jr Function26fc8
 
+Function26fc3: ; 26fc3
 	ld a, [Console]
-	jr .asm_26fc8
+	jr Function26fc8
 
-.asm_26fc8
+Function26fc8: ; 26fc8
 	ld c, a
 	ld de, StringBuffer3
 	call Function26eea
@@ -33696,100 +31225,8 @@
 	ret
 ; 270c4
 
+INCLUDE "trainers/dvs.asm"
 
-GetTrainerDVs: ; 270c4
-; get dvs based on trainer class
-; output: bc
-	push hl
-; dec trainer class so there's no filler entry for $00
-	ld a, [OtherTrainerClass]
-	dec a
-	ld c, a
-	ld b, $0
-; seek table
-	ld hl, TrainerClassDVs
-	add hl, bc
-	add hl, bc
-; get dvs
-	ld a, [hli]
-	ld b, a
-	ld c, [hl]
-; we're done
-	pop hl
-	ret
-; 270d6
-
-TrainerClassDVs ; 270d6
-;   AtkDef, SpdSpc
-	db $9A, $77 ; falkner
-	db $88, $88 ; bugsy
-	db $98, $88 ; whitney
-	db $98, $88 ; morty
-	db $98, $88 ; pryce
-	db $98, $88 ; jasmine
-	db $98, $88 ; chuck
-	db $7C, $DD ; clair
-	db $DD, $DD ; rival1
-	db $98, $88 ; pokemon prof
-	db $DC, $DD ; will
-	db $DC, $DD ; cal
-	db $DC, $DD ; bruno
-	db $7F, $DF ; karen
-	db $DC, $DD ; koga
-	db $DC, $DD ; champion
-	db $98, $88 ; brock
-	db $78, $88 ; misty
-	db $98, $88 ; lt surge
-	db $98, $88 ; scientist
-	db $78, $88 ; erika
-	db $98, $88 ; youngster
-	db $98, $88 ; schoolboy
-	db $98, $88 ; bird keeper
-	db $58, $88 ; lass
-	db $98, $88 ; janine
-	db $D8, $C8 ; cooltrainerm
-	db $7C, $C8 ; cooltrainerf
-	db $69, $C8 ; beauty
-	db $98, $88 ; pokemaniac
-	db $D8, $A8 ; gruntm
-	db $98, $88 ; gentleman
-	db $98, $88 ; skier
-	db $68, $88 ; teacher
-	db $7D, $87 ; sabrina
-	db $98, $88 ; bug catcher
-	db $98, $88 ; fisher
-	db $98, $88 ; swimmerm
-	db $78, $88 ; swimmerf
-	db $98, $88 ; sailor
-	db $98, $88 ; super nerd
-	db $98, $88 ; rival2
-	db $98, $88 ; guitarist
-	db $A8, $88 ; hiker
-	db $98, $88 ; biker
-	db $98, $88 ; blaine
-	db $98, $88 ; burglar
-	db $98, $88 ; firebreather
-	db $98, $88 ; juggler
-	db $98, $88 ; blackbelt
-	db $D8, $A8 ; executivem
-	db $98, $88 ; psychic
-	db $6A, $A8 ; picnicker
-	db $98, $88 ; camper
-	db $7E, $A8 ; executivef
-	db $98, $88 ; sage
-	db $78, $88 ; medium
-	db $98, $88 ; boarder
-	db $98, $88 ; pokefanm
-	db $68, $8A ; kimono girl
-	db $68, $A8 ; twins
-	db $6D, $88 ; pokefanf
-	db $FD, $DE ; red
-	db $9D, $DD ; blue
-	db $98, $88 ; officer
-	db $7E, $A8 ; gruntf
-	db $98, $88 ; mysticalman
-; 2715c
-
 Function2715c: ; 2715c
 	call WhiteBGMap
 	call ClearTileMap
@@ -47850,9 +45287,48 @@
 	ret
 ; 4802f
 
-INCBIN "baserom.gbc", $4802f, $48e81 - $4802f
+INCBIN "baserom.gbc", $4802f, $48c63 - $4802f
 
+Function48c63: ; 48c63
+	ld a, $50
+	ld [de], a
+	ld a, c
+	cp $30
+	jr nc, .asm_48c8c
+	and a
+	jr z, .asm_48c8c
+	dec c
+	push de
+	ld h, d
+	ld l, e
+	ld a, $50
+	ld b, $7
+.asm_48c76
+	ld [hli], a
+	dec b
+	jr nz, .asm_48c76
+	ld hl, $455b
+	ld a, c
+	call GetNthString
+.asm_48c81
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hl]
+	cp $50
+	jr nz, .asm_48c81
+	and a
+	pop de
+	ret
 
+.asm_48c8c
+	scf
+	ret
+; 48c8e
+
+INCBIN "baserom.gbc", $48c8e, $48e81 - $48c8e
+
+
 Function48e81: ; 48e81
 	ld hl, $4e93
 	add hl, de
@@ -49832,9 +47308,23 @@
 	ret
 ; 4e554
 
-INCBIN "baserom.gbc", $4e554, $4e5e1 - $4e554
+Function4e554: ; 4e554
+	ld a, [BattleType]
+	dec a
+	ld c, a
+	ld hl, $6564
+	ld b, $0
+	add hl, bc
+	add hl, bc
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp [hl]
+; 4e564
 
+INCBIN "baserom.gbc", $4e564, $4e5e1 - $4e564
 
+
 Function4e5e1: ; 4e5e1
 	push hl
 	push de
@@ -50266,9 +47756,54 @@
 	ret
 ; 4e929
 
-INCBIN "baserom.gbc", $4e929, $4e980 - $4e929
+Function4e929: ; 4e929
+	ld h, b
+	ld l, c
+	call Function4e930
+	ld c, a
+	ret
+; 4e930
 
+Function4e930: ; 4e930
+	ld a, [hli]
+	xor [hl]
+	ld c, a
+	jr z, .asm_4e941
+	srl c
+	srl c
+.asm_4e939
+	srl c
+	ld a, c
+	cp $18
+	jr nc, .asm_4e939
+	inc c
 
+.asm_4e941
+	ld a, [de]
+	cp $1
+	ld hl, $695d
+	jr nz, .asm_4e958
+	ld hl, $6976
+	ld a, c
+	and a
+	jr z, .asm_4e958
+.asm_4e950
+	srl c
+	ld a, c
+	cp $9
+	jr nc, .asm_4e950
+	inc c
+
+.asm_4e958
+	ld b, $0
+	add hl, bc
+	ld a, [hl]
+	ret
+; 4e95d
+
+INCBIN "baserom.gbc", $4e95d, $4e980 - $4e95d
+
+
 Function4e980: ; 4e980
 	ld a, [rSVBK]
 	push af
@@ -50669,9 +48204,53 @@
 	ret
 ; 0x50089
 
-INCBIN "baserom.gbc", $50089, $500cf - $50089
+Table50089: ; 50089
+	dw Function5009b
+	dw Function500cf
+	dw Function50138
+	dw Function50176
+	dw Function501b2
+	dw Function501e0
+	dw Function5022f
+	dw Function502b1
+	dw Function50307
+; 5009b
 
+Function5009b: ; 5009b
+	ld hl, $c4b7
+	ld a, [PartyCount]
+	and a
+	jr z, .asm_500bf
+	ld c, a
+	ld b, $0
+.asm_500a7
+	push bc
+	push hl
+	push hl
+	ld hl, PartyMon1Nickname
+	ld a, b
+	call GetNick
+	pop hl
+	call PlaceString
+	pop hl
+	ld de, $0028
+	add hl, de
+	pop bc
+	inc b
+	dec c
+	jr nz, .asm_500a7
 
+.asm_500bf
+	dec hl
+	dec hl
+	ld de, $40c8
+	call PlaceString
+	ret
+; 500c8
+
+INCBIN "baserom.gbc", $500c8, $500cf - $500c8
+
+
 Function500cf: ; 500cf
 	xor a
 	ld [$cda9], a
@@ -55106,8 +52685,713 @@
 KrisBackpic: ; 88ed6
 
 
-INCBIN "baserom.gbc", $88ed6, $896ff - $88ed6
+INCBIN "baserom.gbc", $88ed6, $89160 - $88ed6
 
+Function89160: ; 89160
+	push af
+	ld a, $4
+	call GetSRAMBank
+	pop af
+	ret
+; 89168
+
+INCBIN "baserom.gbc", $89168, $89193 - $89168
+
+Function89193: ; 89193
+	push de
+	push hl
+.asm_89195
+	ld a, [hli]
+	ld [de], a
+	inc de
+	dec c
+	jr nz, .asm_89195
+	pop hl
+	pop de
+	ret
+; 8919e
+
+INCBIN "baserom.gbc", $8919e, $891ab - $8919e
+
+Function891ab: ; 891ab
+	call Function89240
+	callba Function104061
+	call Function8923c
+	ret
+; 891b8
+
+Function891b8: ; 891b8
+	call Function8923c
+	ld hl, TileMap
+	ld a, $7f
+	ld bc, $0168
+	call ByteFill
+	call DelayFrame
+	ret
+; 891ca
+
+INCBIN "baserom.gbc", $891ca, $891de - $891ca
+
+Function891de: ; 891de
+	call Function8923c
+	call ClearPalettes
+	ld hl, AttrMap
+	ld a, $7
+	ld bc, $0168
+	call ByteFill
+	ld hl, TileMap
+	ld a, $7f
+	ld bc, $0168
+	call ByteFill
+	call Function891ab
+	ret
+; 891fe
+
+Function891fe: ; 891fe
+	push bc
+	call Function891de
+	ld c, $10
+	call DelayFrames
+	pop bc
+	ret
+; 89209
+
+Function89209: ; 89209
+	ld a, $1
+	ld [$c2ce], a
+	ret
+; 8920f
+
+Function8920f: ; 8920f
+	ld a, $0
+	ld [$c2ce], a
+	ret
+; 89215
+
+Function89215: ; 89215
+	push hl
+	push bc
+	ld bc, $0939
+	add hl, bc
+	ld [hl], a
+	pop bc
+	pop hl
+	ret
+; 8921f
+
+INCBIN "baserom.gbc", $8921f, $8923c - $8921f
+
+Function8923c: ; 8923c
+	xor a
+	ld [hBGMapMode], a
+	ret
+; 89240
+
+Function89240: ; 89240
+	ld a, $1
+	ld [hBGMapMode], a
+	ret
+; 89245
+
+INCBIN "baserom.gbc", $89245, $89259 - $89245
+
+Function89259: ; 89259
+	ld bc, $0e07
+	jr Function89261
+
+Function8925e: ; 8925e
+	ld bc, $0e0c
+
+Function89261: ; 89261
+	push af
+	push bc
+	ld hl, $52a3
+	call Function1d3c
+	pop bc
+	ld hl, $cf82
+	ld a, c
+	ld [hli], a
+	ld a, b
+	ld [hli], a
+	ld a, c
+	add $4
+	ld [hli], a
+	ld a, b
+	add $5
+	ld [hl], a
+	pop af
+	ld [$cf88], a
+	call Function1c00
+	call Function8923c
+	call Function89209
+	call Function1d81
+	push af
+	ld c, $a
+	call DelayFrames
+	call Function1c17
+	call Function8920f
+	pop af
+	jr c, .asm_892a1
+	ld a, [$cfa9]
+	cp $2
+	jr z, .asm_892a1
+	and a
+	ret
+
+.asm_892a1
+	scf
+	ret
+; 892a3
+
+INCBIN "baserom.gbc", $892a3, $892b7 - $892a3
+
+Function892b7: ; 892b7
+	ld d, b
+	ld e, c
+	ld hl, $0000
+	add hl, bc
+	ld a, $50
+	ld bc, $0006
+	call ByteFill
+	ld b, d
+	ld c, e
+	ld hl, $0006
+	add hl, bc
+	ld a, $50
+	ld bc, $0006
+	call ByteFill
+	ld b, d
+	ld c, e
+	ld hl, $000c
+	add hl, bc
+	xor a
+	ld [hli], a
+	ld [hl], a
+	ld hl, $000e
+	add hl, bc
+	ld [hli], a
+	ld [hl], a
+	ld hl, $0010
+	add hl, bc
+	ld [hl], a
+	ld hl, $0011
+	add hl, bc
+	ld a, $ff
+	ld bc, $0008
+	call ByteFill
+	ld b, d
+	ld c, e
+	ld e, $6
+	ld hl, $0019
+	add hl, bc
+.asm_892fb
+	ld a, $ff
+	ld [hli], a
+	ld a, $ff
+	ld [hli], a
+	dec e
+	jr nz, .asm_892fb
+	ret
+; 89305
+
+INCBIN "baserom.gbc", $89305, $8931b - $89305
+
+Function8931b: ; 8931b
+	push hl
+	ld hl, $a03b
+	ld a, [MenuSelection]
+	dec a
+	ld bc, $0025
+	call AddNTimes
+	ld b, h
+	ld c, l
+	pop hl
+	ret
+; 8932d
+
+Function8932d: ; 8932d
+	ld hl, $0000
+	add hl, bc
+
+Function89331: ; 89331
+	push bc
+	ld c, $5
+.asm_89334
+	ld a, [hli]
+	cp $50
+	jr z, .asm_89340
+	cp $7f
+	jr nz, .asm_89343
+	dec c
+	jr nz, .asm_89334
+
+.asm_89340
+	scf
+	jr .asm_89344
+
+.asm_89343
+	and a
+
+.asm_89344
+	pop bc
+	ret
+; 89346
+
+INCBIN "baserom.gbc", $89346, $8934a - $89346
+
+Function8934a: ; 8934a
+	ld hl, $0006
+	add hl, bc
+	push bc
+	ld c, $5
+.asm_89351
+	ld a, [hli]
+	cp $50
+	jr z, .asm_8935d
+	cp $7f
+	jr nz, .asm_89360
+	dec c
+	jr nz, .asm_89351
+
+.asm_8935d
+	scf
+	jr .asm_89361
+
+.asm_89360
+	and a
+
+.asm_89361
+	pop bc
+	ret
+; 89363
+
+Function89363: ; 89363
+	ld h, b
+	ld l, c
+	jr .asm_8936b
+
+	ld hl, $0019
+	add hl, bc
+
+.asm_8936b
+	push de
+	ld e, $6
+.asm_8936e
+	ld a, [hli]
+	cp $ff
+	jr nz, .asm_8937e
+	ld a, [hli]
+	cp $ff
+	jr nz, .asm_8937e
+	dec e
+	jr nz, .asm_8936e
+	scf
+	jr .asm_8937f
+
+.asm_8937e
+	and a
+
+.asm_8937f
+	pop de
+	ret
+; 89381
+
+Function89381: ; 89381
+	push bc
+	push de
+	call Function89b45
+	jr c, .asm_89392
+	push hl
+	ld a, $ff
+	ld bc, $0008
+	call ByteFill
+	pop hl
+
+.asm_89392
+	pop de
+	ld c, $8
+	call Function89193
+	pop bc
+	ret
+; 8939a
+
+Function8939a: ; 8939a
+	push bc
+	ld hl, $0000
+	add hl, bc
+	ld de, DefaultFlypoint
+	ld c, $6
+	call Function89193
+	pop bc
+	ld hl, $0011
+	add hl, bc
+	ld de, $d008
+	call Function89381
+	ret
+; 893b3
+
+INCBIN "baserom.gbc", $893b3, $893cc - $893b3
+
+Function893cc: ; 893cc
+	call DisableLCD
+	call ClearSprites
+	call Functione51
+	call Functione5f
+	call Function893ef
+	call Function89464
+	call EnableLCD
+	ret
+; 893e2
+
+INCBIN "baserom.gbc", $893e2, $893ef - $893e2
+
+Function893ef: ; 893ef
+	ld de, VTiles0
+	ld hl, $540b
+	ld bc, $0020
+	ld a, $22
+	call FarCopyBytes
+	ret
+; 893fe
+
+INCBIN "baserom.gbc", $893fe, $89464 - $893fe
+
+Function89464: ; 89464
+	ld hl, $59ef
+	ld de, VTiles2
+	ld bc, $0200
+	ld a, $5e
+	call FarCopyBytes
+	ld hl, $604f
+	ld de, $9200
+	ld bc, $0170
+	ld a, $5e
+	call FarCopyBytes
+	ret
+; 89481
+
+Function89481: ; 89481
+	ld d, $2
+	call Function8934a
+	ret c
+	ld d, $0
+	ld hl, $0010
+	add hl, bc
+	bit 0, [hl]
+	ret z
+	inc d
+	ret
+; 89492
+
+INCBIN "baserom.gbc", $89492, $8949c - $89492
+
+Function8949c: ; 8949c
+	ld a, [rSVBK]
+	push af
+	ld a, $5
+	ld [rSVBK], a
+	ld hl, $54b3
+	ld de, $d038
+	ld bc, $0008
+	call CopyBytes
+	pop af
+	ld [rSVBK], a
+	ret
+; 894b3
+
+INCBIN "baserom.gbc", $894b3, $894bb - $894b3
+
+Function894bb: ; 894bb
+	call Function894dc
+	push bc
+	call Function8956f
+	call Function8949c
+	call Function8a60d
+	pop bc
+	ret
+; 894ca
+
+INCBIN "baserom.gbc", $894ca, $894dc - $894ca
+
+Function894dc: ; 894dc
+	push bc
+	ld a, [rSVBK]
+	push af
+	ld a, $5
+	ld [rSVBK], a
+	ld c, d
+	ld b, $0
+	ld hl, $5509
+	add hl, bc
+	add hl, bc
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld de, Unkn1Pals
+	ld bc, $0018
+	call CopyBytes
+	ld hl, $5557
+	ld de, $d018
+	ld bc, $0018
+	call CopyBytes
+	pop af
+	ld [rSVBK], a
+	pop bc
+	ret
+; 89509
+
+INCBIN "baserom.gbc", $89509, $8956f - $89509
+
+Function8956f: ; 8956f
+	push bc
+	ld hl, $0010
+	add hl, bc
+	ld d, h
+	ld e, l
+	ld hl, $000c
+	add hl, bc
+	ld b, h
+	ld c, l
+	callba Function4e929
+	ld a, c
+	ld [TrainerClass], a
+	ld a, [rSVBK]
+	push af
+	ld a, $5
+	ld [rSVBK], a
+	ld hl, $d030
+	ld a, $ff
+	ld [hli], a
+	ld a, $7f
+	ld [hl], a
+	pop af
+	ld [rSVBK], a
+	ld a, [TrainerClass]
+	ld h, $0
+	ld l, a
+	add hl, hl
+	add hl, hl
+	ld de, $70ce
+	add hl, de
+	ld a, [rSVBK]
+	push af
+	ld a, $5
+	ld [rSVBK], a
+	ld de, $d032
+	ld c, $4
+.asm_895b1
+	ld a, $2
+	call GetFarByte
+	ld [de], a
+	inc de
+	inc hl
+	dec c
+	jr nz, .asm_895b1
+	ld hl, $d036
+	xor a
+	ld [hli], a
+	ld [hl], a
+	pop af
+	ld [rSVBK], a
+	pop bc
+	ret
+; 895c7
+
+INCBIN "baserom.gbc", $895c7, $895f2 - $895c7
+
+Function895f2: ; 895f2
+	push bc
+	xor a
+	ld hl, AttrMap
+	ld bc, $0168
+	call ByteFill
+	call Function89605
+	call Function89655
+	pop bc
+	ret
+; 89605
+
+Function89605: ; 89605
+	ld hl, $ce14
+	ld a, $1
+	ld de, $0014
+	ld c, $e
+.asm_8960f
+	ld [hl], a
+	dec c
+	jr z, .asm_8961b
+	add hl, de
+	inc a
+	ld [hl], a
+	dec a
+	add hl, de
+	dec c
+	jr nz, .asm_8960f
+
+.asm_8961b
+	ld hl, $cf19
+	ld c, $a
+	ld a, $2
+.asm_89622
+	ld [hli], a
+	dec a
+	ld [hli], a
+	inc a
+	dec c
+	jr nz, .asm_89622
+	ld hl, $ceb6
+	ld a, $4
+	ld bc, $0004
+	call ByteFill
+	ld a, $5
+	ld bc, $000e
+	call ByteFill
+	ret
+; 8963d
+
+Function8963d: ; 8963d
+	ld hl, $ce21
+	ld a, $6
+	ld de, $0014
+	ld bc, $0707
+.asm_89648
+	push hl
+	ld c, $7
+.asm_8964b
+	ld [hli], a
+	dec c
+	jr nz, .asm_8964b
+	pop hl
+	add hl, de
+	dec b
+	jr nz, .asm_89648
+	ret
+; 89655
+
+Function89655: ; 89655
+	ld hl, $ceca
+	ld de, $0014
+	ld a, $5
+	ld b, $4
+.asm_8965f
+	ld c, $12
+	push hl
+.asm_89662
+	ld [hli], a
+	dec c
+	jr nz, .asm_89662
+	pop hl
+	add hl, de
+	dec b
+	jr nz, .asm_8965f
+	ret
+; 8966c
+
+Function8966c: ; 8966c
+	push bc
+	call Function89688
+	ld hl, $c4a4
+	ld c, $8
+	call Function896f5
+	pop bc
+	ret
+; 8967a
+
+INCBIN "baserom.gbc", $8967a, $89688 - $8967a
+
+Function89688: ; 89688
+	ld hl, TileMap
+	ld a, $1
+	ld e, $14
+	call Function896e1
+	ld a, $2
+	ld e, $14
+	call Function896eb
+	ld a, $3
+	ld [hli], a
+	ld a, $4
+	ld e, $12
+	call Function896e1
+	ld a, $6
+	ld [hli], a
+	push bc
+	ld c, $d
+.asm_896a9
+	call Function896cb
+	dec c
+	jr z, .asm_896b5
+	call Function896d6
+	dec c
+	jr nz, .asm_896a9
+
+.asm_896b5
+	pop bc
+	ld a, $19
+	ld [hli], a
+	ld a, $1a
+	ld e, $12
+	call Function896e1
+	ld a, $1c
+	ld [hli], a
+	ld a, $2
+	ld e, $14
+	call Function896eb
+	ret
+; 896cb
+
+Function896cb: ; 896cb
+	ld de, $0013
+	ld a, $7
+	ld [hl], a
+	add hl, de
+	ld a, $9
+	ld [hli], a
+	ret
+; 896d6
+
+Function896d6: ; 896d6
+	ld de, $0013
+	ld a, $a
+	ld [hl], a
+	add hl, de
+	ld a, $b
+	ld [hli], a
+	ret
+; 896e1
+
+Function896e1: ; 896e1
+.asm_896e1
+	ld [hli], a
+	inc a
+	dec e
+	ret z
+	ld [hli], a
+	dec a
+	dec e
+	jr nz, .asm_896e1
+	ret
+; 896eb
+
+Function896eb: ; 896eb
+.asm_896eb
+	ld [hli], a
+	dec a
+	dec e
+	ret z
+	ld [hli], a
+	inc a
+	dec e
+	jr nz, .asm_896eb
+	ret
+; 896f5
+
+Function896f5: ; 896f5
+	call Function8971f
+	call Function89736
+	inc hl
+	inc hl
+	ld b, 2
+
 ClearScreenArea: ; 0x896ff
 ; clears an area of the screen
 ; INPUT:
@@ -55145,8 +53429,828 @@
 	ret
 ; 0x8971f
 
-INCBIN "baserom.gbc", $8971f, $8addb - $8971f
+Function8971f: ; 8971f
+	ld a, $2c
+	ld [hli], a
+	ld a, $2d
+	ld [hld], a
+	push hl
+	ld de, $0014
+	add hl, de
+	ld a, $31
+	ld [hli], a
+	ld a, $32
+	ld [hld], a
+	add hl, de
+	ld a, $35
+	ld [hl], a
+	pop hl
+	ret
+; 89736
 
+Function89736: ; 89736
+	push hl
+	inc hl
+	inc hl
+	ld e, c
+	ld d, $0
+	add hl, de
+	ld a, $2f
+	ld [hli], a
+	ld a, $30
+	ld [hld], a
+	ld de, $0014
+	add hl, de
+	ld a, $33
+	ld [hli], a
+	ld a, $34
+	ld [hl], a
+	add hl, de
+	ld a, $1f
+	ld [hl], a
+	pop hl
+	ret
+; 89753
+
+Function89753: ; 89753
+	ld a, $c
+	ld [hl], a
+	xor a
+	call Function89215
+	ret
+; 8975b
+
+Function8975b: ; 8975b
+	ld a, $1d
+	ld [hli], a
+	inc a
+	ld [hli], a
+	ld a, $d
+	ld [hl], a
+	dec hl
+	dec hl
+	ld a, $4
+	ld e, $3
+.asm_89769
+	call Function89215
+	inc hl
+	dec e
+	jr nz, .asm_89769
+	ret
+; 89771
+
+Function89771: ; 89771
+	ld a, $12
+	ld [hl], a
+	ld a, $3
+	call Function89215
+	ret
+; 8977a
+
+Function8977a: ; 8977a
+	ld e, $4
+	ld d, $13
+.asm_8977e
+	ld a, d
+	ld [hl], a
+	ld a, $4
+	call Function89215
+	inc hl
+	inc d
+	dec e
+	jr nz, .asm_8977e
+	ld e, $e
+.asm_8978c
+	ld a, d
+	ld [hl], a
+	xor a
+	call Function89215
+	inc hl
+	dec e
+	jr nz, .asm_8978c
+	ret
+; 89797
+
+Function89797: ; 89797
+	push bc
+	ld a, $e
+	ld [hl], a
+	ld bc, $0014
+	add hl, bc
+	ld a, $11
+	ld [hli], a
+	ld a, $10
+	ld c, $8
+.asm_897a6
+	ld [hli], a
+	dec c
+	jr nz, .asm_897a6
+	ld a, $f
+	ld [hl], a
+	pop bc
+	ret
+; 897af
+
+Function897af: ; 897af
+	push bc
+	ld hl, $0010
+	add hl, bc
+	ld d, h
+	ld e, l
+	ld hl, $000c
+	add hl, bc
+	ld b, h
+	ld c, l
+	callba Function4e929
+	ld a, c
+	ld [TrainerClass], a
+	xor a
+	ld [CurPartySpecies], a
+	ld de, $9370
+	callba Function5120d
+	pop bc
+	ret
+; 897d5
+
+Function897d5: ; 897d5
+	push bc
+	call Function8934a
+	jr nc, .asm_897f3
+	ld hl, $ce21
+	xor a
+	ld de, $0014
+	ld bc, $0707
+.asm_897e5
+	push hl
+	ld c, $7
+.asm_897e8
+	ld [hli], a
+	dec c
+	jr nz, .asm_897e8
+	pop hl
+	add hl, de
+	dec b
+	jr nz, .asm_897e5
+	pop bc
+	ret
+
+.asm_897f3
+	ld a, $37
+	ld [$ffad], a
+	ld hl, $c4e8
+	ld bc, $0707
+	ld a, $13
+	call Predef
+	call Function8963d
+	pop bc
+	ret
+; 89807
+
+INCBIN "baserom.gbc", $89807, $89844 - $89807
+
+Function89844: ; 89844
+	call Function89481
+	call Function894bb
+	call Function897af
+	push bc
+	call Function3200
+	call Function32f9
+	pop bc
+	ret
+; 89856
+
+Function89856: ; 89856
+	push bc
+	call Function891b8
+	pop bc
+	call Function895f2
+	call Function8966c
+	call Function899d3
+	call Function898aa
+	call Function898be
+	call Function898dc
+	call Function898f3
+	push bc
+	ld bc, $d008
+	ld hl, $c56a
+	call Function89975
+	pop bc
+	call Function897d5
+	ret
+; 8987f
+
+INCBIN "baserom.gbc", $8987f, $898aa - $8987f
+
+Function898aa: ; 898aa
+	ld a, [MenuSelection]
+	and a
+	ret z
+	push bc
+	ld hl, $c4ba
+	ld de, MenuSelection
+	ld bc, $8102
+	call PrintNum
+	pop bc
+	ret
+; 898be
+
+Function898be: ; 898be
+	push bc
+	ld de, DefaultFlypoint
+	ld hl, DefaultFlypoint
+	call Function89331
+	jr nc, .asm_898cd
+	ld de, $5116
+
+.asm_898cd
+	ld hl, $c4bd
+	ld a, [MenuSelection]
+	and a
+	jr nz, .asm_898d7
+	dec hl
+
+.asm_898d7
+	call PlaceString
+	pop bc
+	ret
+; 898dc
+
+Function898dc: ; 898dc
+	ld hl, $0006
+	add hl, bc
+	push bc
+	ld d, h
+	ld e, l
+	call Function8934a
+	jr nc, .asm_898eb
+	ld de, $5116
+
+.asm_898eb
+	ld hl, $c4f6
+	call PlaceString
+	pop bc
+	ret
+; 898f3
+
+Function898f3: ; 898f3
+	push bc
+	ld hl, $000c
+	add hl, bc
+	ld d, h
+	ld e, l
+	call Function8934a
+	jr c, .asm_8990a
+	ld hl, $c509
+	ld bc, $8205
+	call PrintNum
+	jr .asm_89913
+
+.asm_8990a
+	ld hl, $c509
+	ld de, $5116
+	call PlaceString
+
+.asm_89913
+	pop bc
+	ret
+; 89915
+
+Function89915: ; 89915
+	push bc
+	push hl
+	ld de, $5942
+	ld c, $8
+.asm_8991c
+	ld a, [de]
+	ld [hl], a
+	ld a, $4
+	call Function89215
+	inc hl
+	inc de
+	dec c
+	jr nz, .asm_8991c
+	pop hl
+	ld b, $4
+	ld c, $2b
+	ld a, $8
+	ld de, $594a
+.asm_89932
+	push af
+	ld a, [de]
+	cp [hl]
+	jr nz, .asm_8993b
+	call Function8994e
+	inc de
+
+.asm_8993b
+	inc hl
+	pop af
+	dec a
+	jr nz, .asm_89932
+	pop bc
+	ret
+; 89942
+
+INCBIN "baserom.gbc", $89942, $8994e - $89942
+
+Function8994e: ; 8994e
+	push hl
+	push de
+	ld de, $0014
+	ld a, l
+	sub e
+	ld l, a
+	ld a, h
+	sbc d
+	ld h, a
+	ld a, c
+	ld [hl], a
+	ld a, b
+	call Function89215
+	pop de
+	pop hl
+	ret
+; 89962
+
+Function89962: ; 89962
+	push bc
+	ld c, $4
+	ld b, $20
+.asm_89967
+	ld a, b
+	ld [hl], a
+	ld a, $4
+	call Function89215
+	inc hl
+	inc b
+	dec c
+	jr nz, .asm_89967
+	pop bc
+	ret
+; 89975
+
+Function89975: ; 89975
+	push bc
+	ld e, $8
+.asm_89978
+	ld a, [bc]
+	ld d, a
+	call Function8998b
+	swap d
+	inc hl
+	ld a, d
+	call Function8998b
+	inc bc
+	inc hl
+	dec e
+	jr nz, .asm_89978
+	pop bc
+	ret
+; 8998b
+
+Function8998b: ; 8998b
+	push bc
+	and $f
+	cp $a
+	jr nc, .asm_89997
+	ld c, $f6
+	add c
+	jr .asm_89999
+
+.asm_89997
+	ld a, $7f
+
+.asm_89999
+	ld [hl], a
+	pop bc
+	ret
+; 8999c
+
+INCBIN "baserom.gbc", $8999c, $899d3 - $8999c
+
+Function899d3: ; 899d3
+	ld hl, $c4f1
+	call Function89753
+	ld hl, $c506
+	call Function8975b
+	ld hl, $c555
+	call Function89771
+	ld hl, $c57d
+	call Function8977a
+	ld hl, $c505
+	call Function89797
+	ld hl, $c4f2
+	call Function89962
+	ld hl, $c556
+	call Function89915
+	ret
+; 899fe
+
+Function899fe: ; 899fe
+	push bc
+	push hl
+	ld hl, $0019
+	add hl, bc
+	ld b, h
+	ld c, l
+	pop hl
+	call Function89a0c
+	pop bc
+	ret
+; 89a0c
+
+Function89a0c: ; 89a0c
+	push hl
+	call Function89363
+	pop hl
+	jr c, .asm_89a1c
+	ld d, h
+	ld e, l
+	callba Function11c08f
+	ret
+
+.asm_89a1c
+	ld de, $5153
+	call PlaceString
+	ret
+; 89a23
+
+INCBIN "baserom.gbc", $89a23, $89a57 - $89a23
+
+Function89a57: ; 89a57
+	call Function354b
+	bit 6, c
+	jr nz, .asm_89a78
+	bit 7, c
+	jr nz, .asm_89a81
+	bit 0, c
+	jr nz, .asm_89a70
+	bit 1, c
+	jr nz, .asm_89a70
+	bit 3, c
+	jr nz, .asm_89a74
+	scf
+	ret
+
+.asm_89a70
+	ld a, $1
+	and a
+	ret
+
+.asm_89a74
+	ld a, $2
+	and a
+	ret
+
+.asm_89a78
+	call Function89a9b
+	call nc, Function89a8a
+	ld a, $0
+	ret
+
+.asm_89a81
+	call Function89a93
+	call nc, Function89a8a
+	ld a, $0
+	ret
+; 89a8a
+
+Function89a8a: ; 89a8a
+	push af
+	ld de, $0062
+	call StartSFX
+	pop af
+	ret
+; 89a93
+
+Function89a93: ; 89a93
+	ld d, $28
+	ld e, $1
+	call Function89aa3
+	ret
+; 89a9b
+
+Function89a9b: ; 89a9b
+	ld d, $1
+	ld e, $ff
+	call Function89aa3
+	ret
+; 89aa3
+
+Function89aa3: ; 89aa3
+	ld a, [MenuSelection]
+	ld c, a
+	push bc
+.asm_89aa8
+	ld a, [MenuSelection]
+	cp d
+	jr z, .asm_89ac0
+	add e
+	jr nz, .asm_89ab2
+	inc a
+
+.asm_89ab2
+	ld [MenuSelection], a
+	call Function89ac7
+	jr nc, .asm_89aa8
+	call Function89ae6
+	pop bc
+	and a
+	ret
+
+.asm_89ac0
+	pop bc
+	ld a, c
+	ld [MenuSelection], a
+	scf
+	ret
+; 89ac7
+
+Function89ac7: ; 89ac7
+	call Function89160
+	call Function8931b
+	call Function89ad4
+	call CloseSRAM
+	ret
+; 89ad4
+
+Function89ad4: ; 89ad4
+	push de
+	call Function8932d
+	jr c, .asm_89ae3
+	ld hl, $0011
+	add hl, bc
+	call Function89b45
+	jr c, .asm_89ae4
+
+.asm_89ae3
+	and a
+
+.asm_89ae4
+	pop de
+	ret
+; 89ae6
+
+Function89ae6: ; 89ae6
+	ld hl, $d031
+	xor a
+	ld [hl], a
+	ld a, [MenuSelection]
+.asm_89aee
+	cp $6
+	jr c, .asm_89afc
+	sub $5
+	ld c, a
+	ld a, [hl]
+	add $5
+	ld [hl], a
+	ld a, c
+	jr .asm_89aee
+
+.asm_89afc
+	ld [$d030], a
+	ret
+; 89b00
+
+INCBIN "baserom.gbc", $89b00, $89b45 - $89b00
+
+Function89b45: ; 89b45
+	push hl
+	push bc
+	ld c, $10
+	ld e, $0
+.asm_89b4b
+	ld a, [hli]
+	ld b, a
+	and $f
+	cp $a
+	jr c, .asm_89b5a
+	ld a, c
+	cp $b
+	jr nc, .asm_89b74
+	jr .asm_89b71
+
+.asm_89b5a
+	dec c
+	swap b
+	inc e
+	ld a, b
+	and $f
+	cp $a
+	jr c, .asm_89b6c
+	ld a, c
+	cp $b
+	jr nc, .asm_89b74
+	jr .asm_89b71
+
+.asm_89b6c
+	inc e
+	dec c
+	jr nz, .asm_89b4b
+	dec e
+
+.asm_89b71
+	scf
+	jr .asm_89b75
+
+.asm_89b74
+	and a
+
+.asm_89b75
+	pop bc
+	pop hl
+	ret
+; 89b78
+
+INCBIN "baserom.gbc", $89b78, $8a60d - $89b78
+
+Function8a60d: ; 8a60d
+	ld a, [rSVBK]
+	push af
+	ld a, $5
+	ld [rSVBK], a
+	ld hl, $6624
+	ld de, Unkn2Pals
+	ld bc, $0008
+	call CopyBytes
+	pop af
+	ld [rSVBK], a
+	ret
+; 8a624
+
+INCBIN "baserom.gbc", $8a624, $8ac4e - $8a624
+
+Function8ac4e: ; 8ac4e
+	xor a
+	ld [MenuSelection], a
+	push de
+	call Function891de
+	call WhiteBGMap
+	call Function893cc
+	pop bc
+	call Function89844
+	call Function8939a
+	call Function89856
+	ld hl, $c5a5
+	call Function899fe
+	call Function891ab
+	ret
+; 8ac70
+
+Function8ac70: ; 8ac70
+	push de
+	ld a, $3
+	call Function8b94a
+
+Function8ac76: ; 8ac76
+	call Function891fe
+	call Function8b677
+
+Function8ac7c: ; 8ac7c
+	call Function8b7bd
+	jr z, .asm_8acf0
+	ld a, c
+	ld [$d02f], a
+	ld [MenuSelection], a
+	call Function89160
+	call Function8931b
+	call Function8932d
+	call CloseSRAM
+	jr nc, .asm_8acb0
+	call Function89160
+	ld hl, $0011
+	add hl, bc
+	call Function89b45
+	call CloseSRAM
+	jr nc, .asm_8accc
+	call Function89160
+	call Function892b7
+	call CloseSRAM
+	jr .asm_8accc
+
+.asm_8acb0
+	call Function8ad0b
+	jr c, Function8ac76
+	and a
+	jr nz, .asm_8accc
+	call Function89160
+	ld h, b
+	ld l, c
+	ld d, $0
+	ld e, $6
+	add hl, de
+	ld d, h
+	ld e, l
+	pop hl
+	ld c, $1f
+	call Function89193
+	jr .asm_8ace4
+
+.asm_8accc
+	pop hl
+	call Function89160
+	ld d, b
+	ld e, c
+	ld c, $6
+	call Function89193
+	ld a, $6
+	add e
+	ld e, a
+	ld a, $0
+	adc d
+	ld d, a
+	ld c, $1f
+	call Function89193
+
+.asm_8ace4
+	call CloseSRAM
+	call Functione51
+	ld a, [$d02f]
+	ld c, a
+	and a
+	ret
+
+.asm_8acf0
+	ld hl, $6d06
+	call PrintText
+	ld a, $2
+	call Function89259
+	jp c, Function8ac7c
+	call Functione51
+	pop de
+	ld c, $0
+	scf
+	ret
+; 8ad06
+
+INCBIN "baserom.gbc", $8ad06, $8ad0b - $8ad06
+
+Function8ad0b: ; 8ad0b
+.asm_8ad0b
+	ld a, [MenuSelection]
+	ld [$d02f], a
+	call Function891de
+	call WhiteBGMap
+	call Function893cc
+	call Function89160
+	call Function8931b
+	push bc
+	call Function89844
+	call Function8939a
+	call Function89856
+	ld hl, $c5a5
+	call Function899fe
+	call CloseSRAM
+	call Function891ab
+	pop bc
+.asm_8ad37
+	push bc
+	call Function89a57
+	pop bc
+	jr c, .asm_8ad37
+	and a
+	jr z, .asm_8ad0b
+	cp $2
+	jr z, .asm_8ad37
+	call Function8923c
+	push bc
+	ld hl, $c590
+	ld b, $4
+	ld c, $12
+	call TextBox
+	ld de, $6d89
+	ld hl, $c5b9
+	call PlaceString
+	ld a, $2
+	call Function8925e
+	jr c, .asm_8ad87
+	call Function8923c
+	ld hl, $c590
+	ld b, $4
+	ld c, $12
+	call TextBox
+	ld de, $6d9c
+	ld hl, $c5b9
+	call PlaceString
+	ld a, $1
+	call Function8925e
+	jr c, .asm_8ad84
+	ld a, $0
+	jr .asm_8ad86
+
+.asm_8ad84
+	ld a, $1
+
+.asm_8ad86
+	and a
+
+.asm_8ad87
+	pop bc
+	ret
+; 8ad89
+
+INCBIN "baserom.gbc", $8ad89, $8addb - $8ad89
+
 SpecialHoOhChamber: ; 0x8addb
 	ld hl, PartySpecies
 	ld a, [hl]
@@ -55384,9 +54488,17 @@
 	ret
 ; 8b354
 
-INCBIN "baserom.gbc", $8b354, $8b35b - $8b354
+Table8b354: ; 8b354
+	dw Function8b35a
+	dw Function8b35b
+	dw Function8b35c
+; 8b35a
 
+Function8b35a: ; 8b35a
+	ret
+; 8b35b
 
+
 Function8b35b: ; 8b35b
 	ret
 ; 8b35c
@@ -55395,9 +54507,338 @@
 	ret
 ; 8b35d
 
-INCBIN "baserom.gbc", $8b35d, $8ba24 - $8b35d
+INCBIN "baserom.gbc", $8b35d, $8b677 - $8b35d
 
+Function8b677: ; 8b677
+	call WhiteBGMap
+	call DisableLCD
+	call Function8b690
+	call Function8b6bb
+	call Function8b6ed
+	call EnableLCD
+	call Function891ab
+	call Function32f9
+	ret
+; 8b690
 
+Function8b690: ; 8b690
+	ld hl, $74b9
+	ld de, VTiles2
+	ld bc, $0160
+	ld a, $5e
+	call FarCopyBytes
+	ld hl, $7609
+	ld de, $9610
+	ld bc, $0010
+	ld a, $5e
+	call FarCopyBytes
+	ld hl, $7619
+	ld de, $8ee0
+	ld bc, $0010
+	ld a, $5e
+	call FarCopyBytes
+	ret
+; 8b6bb
+
+Function8b6bb: ; 8b6bb
+	ld a, [rSVBK]
+	push af
+	ld a, $5
+	ld [rSVBK], a
+	ld hl, $76d5
+	ld de, Unkn1Pals
+	ld bc, $0018
+	call CopyBytes
+	pop af
+	ld [rSVBK], a
+	call Function8949c
+	ret
+; 8b6d5
+
+INCBIN "baserom.gbc", $8b6d5, $8b6ed - $8b6d5
+
+Function8b6ed: ; 8b6ed
+	ld hl, AttrMap
+	ld bc, $012c
+	xor a
+	call ByteFill
+	ld hl, $cef1
+	ld bc, $0050
+	ld a, $7
+	call ByteFill
+	ret
+; 8b703
+
+Function8b703: ; 8b703
+	call Function8923c
+	push hl
+	ld a, $c
+	ld [hli], a
+	inc a
+	call Function8b73e
+	inc a
+	ld [hl], a
+	pop hl
+	push hl
+	push bc
+	ld de, $0014
+	add hl, de
+.asm_8b717
+	push hl
+	ld a, $f
+	ld [hli], a
+	ld a, $7f
+	call Function8b73e
+	ld a, $11
+	ld [hl], a
+	pop hl
+	ld de, $0014
+	add hl, de
+	dec b
+	jr nz, .asm_8b717
+	call Function8b732
+	pop bc
+	pop hl
+	jr Function8b744
+; 8b732
+
+Function8b732: ; 8b732
+	ld a, $12
+	ld [hli], a
+	ld a, $13
+	call Function8b73e
+	ld a, $14
+	ld [hl], a
+	ret
+; 8b73e
+
+Function8b73e: ; 8b73e
+	ld d, c
+.asm_8b73f
+	ld [hli], a
+	dec d
+	jr nz, .asm_8b73f
+	ret
+; 8b744
+
+Function8b744: ; 8b744
+	ld de, $0939
+	add hl, de
+	inc b
+	inc b
+	inc c
+	inc c
+	xor a
+.asm_8b74d
+	push bc
+	push hl
+.asm_8b74f
+	ld [hli], a
+	dec c
+	jr nz, .asm_8b74f
+	pop hl
+	ld de, $0014
+	add hl, de
+	pop bc
+	dec b
+	jr nz, .asm_8b74d
+	ret
+; 8b75d
+
+Function8b75d: ; 8b75d
+	call Function8923c
+	ld hl, TileMap
+	ld a, $1
+	ld bc, $0014
+	call ByteFill
+	ld hl, $c4b4
+	ld a, $2
+	ld [hl], a
+	ld hl, $c4bd
+	ld c, $b
+	call Function8b788
+	ld hl, $c4b5
+	ld a, $4
+	ld e, $8
+.asm_8b780
+	ld [hli], a
+	inc a
+	dec e
+	jr nz, .asm_8b780
+	jr Function8b79e
+; 8b787
+
+Function8b787: ; 8b787
+	ret
+; 8b788
+
+Function8b788: ; 8b788
+.asm_8b788
+	ld a, $2
+	ld [hli], a
+	dec c
+	ret z
+	ld a, $1
+	ld [hli], a
+	dec c
+	ret z
+	ld a, $3
+	ld [hli], a
+	dec c
+	ret z
+	ld a, $1
+	ld [hli], a
+	dec c
+	jr nz, .asm_8b788
+	ret
+; 8b79e
+
+Function8b79e: ; 8b79e
+	ld hl, $cded
+	ld a, $1
+	ld [hli], a
+	ld hl, $cdf6
+	ld e, $b
+.asm_8b7a9
+	ld a, $2
+	ld [hli], a
+	dec e
+	ret z
+	xor a
+	ld [hli], a
+	dec e
+	ret z
+	ld a, $1
+	ld [hli], a
+	dec e
+	ret z
+	xor a
+	ld [hli], a
+	dec e
+	jr nz, .asm_8b7a9
+	ret
+; 8b7bd
+
+Function8b7bd: ; 8b7bd
+	call Function8b855
+	ld hl, $7867
+	call Function1d3c
+	ld a, [$d030]
+	ld [$cf88], a
+	ld a, [$d031]
+	ld [$d0e4], a
+	ld a, [$d032]
+	and a
+	jr z, .asm_8b7e0
+	ld a, [$cf81]
+	set 3, a
+	ld [$cf81], a
+
+.asm_8b7e0
+	ld a, [$d0e3]
+	and a
+	jr z, .asm_8b7ea
+	dec a
+	ld [$cf77], a
+
+.asm_8b7ea
+	ld hl, $c4c8
+	ld b, $b
+	ld c, $12
+	call Function8b703
+	call Function8b75d
+	call Function1ad2
+	call Function89209
+	call Function350c
+	call Function8920f
+	ld a, [$cf73]
+	cp $2
+	jr z, .asm_8b823
+	cp $20
+	jr nz, .asm_8b813
+	call Function8b832
+	jr .asm_8b7ea
+
+.asm_8b813
+	cp $10
+	jr nz, .asm_8b81c
+	call Function8b83e
+	jr .asm_8b7ea
+
+.asm_8b81c
+	ld a, [MenuSelection]
+	cp $ff
+	jr nz, .asm_8b824
+
+.asm_8b823
+	xor a
+
+.asm_8b824
+	ld c, a
+	ld a, [$cfa9]
+	ld [$d030], a
+	ld a, [$d0e4]
+	ld [$d031], a
+	ret
+; 8b832
+
+Function8b832: ; 8b832
+	ld a, [$d0e4]
+	ld hl, $cf92
+	sub [hl]
+	jr nc, Function8b84b
+	xor a
+	jr Function8b84b
+; 8b83e
+
+Function8b83e: ; 8b83e
+	ld a, [$d0e4]
+	ld hl, $cf92
+	add [hl]
+	cp $24
+	jr c, Function8b84b
+	ld a, $24
+
+Function8b84b: ; 8b84b
+	ld [$d0e4], a
+	ld a, [$cfa9]
+	ld [$cf88], a
+	ret
+; 8b855
+
+Function8b855: ; 8b855
+	ld a, $28
+	ld hl, DefaultFlypoint
+	ld [hli], a
+	ld c, $28
+	xor a
+.asm_8b85e
+	inc a
+	ld [hli], a
+	dec c
+	jr nz, .asm_8b85e
+	ld a, $ff
+	ld [hl], a
+	ret
+; 8b867
+
+INCBIN "baserom.gbc", $8b867, $8b94a - $8b867
+
+Function8b94a: ; 8b94a
+	ld [$d033], a
+	xor a
+	ld [$d0e4], a
+	ld [$d032], a
+	ld [$d0e3], a
+	ld [$d031], a
+	ld a, $1
+	ld [$d030], a
+	ret
+; 8b960
+
+INCBIN "baserom.gbc", $8b960, $8ba24 - $8b960
+
+
 SECTION "bank23",ROMX,BANK[$23]
 
 INCBIN "baserom.gbc", $8c000, $8c001 - $8c000
@@ -55500,7 +54941,7 @@
 	ld [rSVBK], a
 	
 ; update palettes
-	call UpdateTimePals
+	call _UpdateTimePals
 	call DelayFrame
 	
 ; successful change
@@ -55514,7 +54955,7 @@
 ; 8c070
 
 
-UpdateTimePals: ; 8c070
+_UpdateTimePals: ; 8c070
 	ld c, $9 ; normal
 	call GetTimePalFade
 	call DmgToCgbTimePals
@@ -57207,9 +56648,21 @@
 
 SECTION "bank24",ROMX,BANK[$24]
 
-INCBIN "baserom.gbc", $90000, $9000f - $90000
+Function90000: ; 90000
+	call Function9001c
+	jr c, .asm_9000d
+	call Function9002d
+	jr nc, .asm_9000d
+	ld [hl], c
+	xor a
+	ret
 
+.asm_9000d
+	scf
+	ret
+; 9000f
 
+
 Function9000f: ; 9000f
 	call Function9001c
 	jr nc, .asm_90017
@@ -57244,9 +56697,60 @@
 	ret
 ; 9002d
 
-INCBIN "baserom.gbc", $9002d, $90069 - $9002d
+Function9002d: ; 9002d
+	call Function90040
+	ld b, a
+	ld hl, $dc7c
+.asm_90034
+	ld a, [hli]
+	and a
+	jr z, .asm_9003d
+	dec b
+	jr nz, .asm_90034
+	xor a
+	ret
 
+.asm_9003d
+	dec hl
+	scf
+	ret
+; 90040
 
+Function90040: ; 90040
+	xor a
+	ld [Buffer1], a
+	ld hl, $4066
+.asm_90047
+	ld a, [hli]
+	cp $ff
+	jr z, .asm_9005f
+	cp c
+	jr z, .asm_9005d
+	push bc
+	push hl
+	ld c, a
+	call Function9001c
+	jr c, .asm_9005b
+	ld hl, Buffer1
+	inc [hl]
+
+.asm_9005b
+	pop hl
+	pop bc
+
+.asm_9005d
+	jr .asm_90047
+
+.asm_9005f
+	ld a, $a
+	ld hl, Buffer1
+	sub [hl]
+	ret
+; 90066
+
+INCBIN "baserom.gbc", $90066, $90069 - $90066
+
+
 Function90069: ; 90069
 	ld a, [hROMBank]
 	push af
@@ -58252,9 +57756,7 @@
 	ld [$d453], a
 	ld [$d454], a
 	call Function968d1
-	ld a, $5
-	ld hl, $5363
-	rst FarCall
+	callba Function15363
 	call Function966cb
 	ld a, [$ff9f]
 	cp $f7
@@ -63361,8 +62863,10 @@
 	ld hl, $9630
 	ld bc, $3e16
 	call Functiondc9
-	jr .asm_fb4cc
+	jr Functionfb4cc
+; fb4b0
 
+Functionfb4b0: ; fb4b0
 	ld de, $5424
 	ld hl, $9610
 	ld b, $3e
@@ -63369,14 +62873,17 @@
 	ld c, $1
 	call Functiondc9
 	ret
+; fb4be
 
+Functionfb4be: ; fb4be
 	ld de, $4600
 	ld hl, $9600
 	ld bc, $3e19
 	call Functiondc9
-	jr .asm_fb4cc
+	jr Functionfb4cc
+; fb4cc
 
-.asm_fb4cc
+Functionfb4cc: ; fb4cc
 	ld a, [TextBoxFrame]
 	and 7
 	ld bc, $0030
@@ -65280,9 +64787,429 @@
 
 SECTION "bank40",ROMX,BANK[$40]
 
-INCBIN "baserom.gbc", $100000, $10032e - $100000
+Function100000: ; 100000
+	ld a, [rSVBK]
+	push af
+	ld a, $1
+	ld [rSVBK], a
+	call Function100022
+	call Function1000ba
+	call Function100675
+	call Function100057
+	call Function10016f
+	call Function100276
+	push bc
+	call Function100301
+	pop bc
+	pop af
+	ld [rSVBK], a
+	ret
+; 100022
 
+Function100022: ; 100022
+	push de
+	push bc
+	call Function100063
+	pop bc
+	pop de
+	ld a, d
+	ld [$cd21], a
+	ld a, e
+	ld [CreditsTimer], a
+	ld a, c
+	ld [$cd23], a
+	ld a, b
+	ld [$cd24], a
+	callba Function10127e
+	callba Function106462
+	callba Function106464
+	callba Function11615a
+	ld hl, VramState
+	set 1, [hl]
+	ret
+; 100057
 
+Function100057: ; 100057
+	call Function1000a4
+	call Function222a
+	ld hl, VramState
+	res 1, [hl]
+	ret
+; 100063
+
+Function100063: ; 100063
+	xor a
+	ld hl, BGMapBuffer
+	ld bc, $0065
+	call ByteFill
+	xor a
+	ld hl, $c300
+	ld bc, Start
+	call ByteFill
+	ld a, [rIE]
+	ld [BGMapBuffer], a
+	xor a
+	ld [$ffde], a
+	ld [hLCDStatCustom], a
+	ret
+; 100082
+
+INCBIN "baserom.gbc", $100082, $1000a4 - $100082
+
+Function1000a4: ; 1000a4
+	di
+	xor a
+	ld [$ffc9], a
+	ld [$ffe9], a
+	xor a
+	ld [$ff9e], a
+	call Function2ff7
+	xor a
+	ld [rIF], a
+	ld a, [BGMapBuffer]
+	ld [rIE], a
+	ei
+	ret
+; 1000ba
+
+Function1000ba: ; 1000ba
+.asm_1000ba
+	ld hl, $cd23
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld a, [$cd25]
+	ld e, a
+	ld d, $0
+	add hl, de
+	add hl, de
+	ld a, [CreditsTimer]
+	call GetFarHalfword
+	ld a, [CreditsTimer]
+	rst FarCall
+	call Function1000e8
+	call Function1000fa
+	call Function100144
+	call Function100163
+	ld a, [$cd2b]
+	and a
+	jr z, .asm_1000ba
+	call DelayFrame
+	ret
+; 1000e8
+
+Function1000e8: ; 1000e8
+	ld hl, $cd29
+	bit 7, [hl]
+	ret z
+	callba Function115dd3
+	ld hl, $cd29
+	set 6, [hl]
+	ret
+; 1000fa
+
+Function1000fa: ; 1000fa
+	ld a, [$c30d]
+	and a
+	ret z
+	ld hl, $cd29
+	bit 4, [hl]
+	ret z
+	ld a, [$cd2b]
+	and a
+	jr nz, .asm_100117
+	callba Function11619d
+	ld hl, $cd29
+	set 6, [hl]
+	ret
+
+.asm_100117
+	di
+	xor a
+	ld [rIF], a
+	ld a, [rIE]
+	and $13
+	ld [rIE], a
+	xor a
+	ld [$ffc9], a
+	ld [$ffe9], a
+	ei
+	ld a, [InLinkBattle]
+	push af
+	xor a
+	ld [InLinkBattle], a
+	ld a, $4
+	ld [$c319], a
+	callba Function11619d
+	ld hl, $cd29
+	set 6, [hl]
+	pop af
+	ld [InLinkBattle], a
+	ret
+; 100144
+
+Function100144: ; 100144
+	ld hl, $cd29
+	bit 5, [hl]
+	jr z, .asm_100155
+	res 5, [hl]
+	res 2, [hl]
+	res 6, [hl]
+	call Function100320
+	ret
+
+.asm_100155
+	bit 2, [hl]
+	ret z
+	res 2, [hl]
+	res 6, [hl]
+	callba Function10402d
+	ret
+; 100163
+
+Function100163: ; 100163
+	ld hl, $cd29
+	bit 6, [hl]
+	ret z
+	res 6, [hl]
+	call DelayFrame
+	ret
+; 10016f
+
+Function10016f: ; 10016f
+	ld a, [$cd2b]
+	cp $1
+	ret z
+	cp $2
+	ret z
+	cp $ff
+	jp z, .asm_1001f5
+	cp $fe
+	jr z, .asm_1001c4
+	cp $f5
+	jr z, .asm_1001e7
+	cp $f6
+	jr z, .asm_1001b6
+	cp $fa
+	jp z, .asm_1001bd
+	cp $f7
+	jp z, .asm_1001ee
+	cp $f4
+	jr z, .asm_1001d2
+	cp $f3
+	jr z, .asm_1001cb
+	cp $f1
+	jr z, .asm_1001c4
+	cp $f2
+	jr z, .asm_1001c4
+	cp $fc
+	jr z, .asm_1001e6
+	cp $fb
+	jr z, .asm_1001af
+	cp $f8
+	ret z
+	ret
+
+.asm_1001af
+	ld a, $d7
+	ld de, $0000
+	jr .asm_1001d7
+
+.asm_1001b6
+	ld a, $d5
+	ld de, $0000
+	jr .asm_1001d7
+
+.asm_1001bd
+	ld a, $d6
+	ld de, $0000
+	jr .asm_1001d7
+
+.asm_1001c4
+	ld a, $d2
+	ld de, $0002
+	jr .asm_1001d7
+
+.asm_1001cb
+	ld a, $d1
+	ld de, $0001
+	jr .asm_1001d7
+
+.asm_1001d2
+	ld a, $d0
+	ld de, $0000
+
+.asm_1001d7
+	ld [$c300], a
+	ld a, d
+	ld [$c302], a
+	ld a, e
+	ld [$c301], a
+	call Function10020b
+	ret
+
+.asm_1001e6
+	ret
+
+.asm_1001e7
+	ld de, String10025e
+	call Function100232
+	ret
+
+.asm_1001ee
+	ld de, String10024d
+	call Function100232
+	ret
+
+.asm_1001f5
+	ld a, [$cd2c]
+	ld [$c300], a
+	ld a, [$cd2d]
+	ld [$c302], a
+	ld a, [$cd2d]
+	ld [$c301], a
+	call Function10020b
+	ret
+; 10020b
+
+Function10020b: ; 10020b
+	xor a
+	ld [$c303], a
+	callba Function8c084
+	callba Function106464
+	call HideSprites
+	call DelayFrame
+	ld a, [rSVBK]
+	push af
+	ld a, $1
+	ld [rSVBK], a
+	callba Function17f555
+	pop af
+	ld [rSVBK], a
+	ret
+; 100232
+
+Function100232: ; 100232
+	push de
+	callba Function106464
+	call Function3f20
+	call Function1ad2
+	hlcoord 1, 2
+	pop de
+	call PlaceString
+	call Function100320
+	call Functiona36
+	ret
+; 10024d
+
+String10024d: ; 10024d
+	db "つうしんを キャンセル しました@"
+; 10025e
+
+String10025e: ; 10025e
+	db "おともだちと えらんだ へやが", $4e
+	db "ちがうようです@"
+; 100276
+
+Function100276: ; 100276
+	ld a, [$cd2b]
+	cp $1
+	jr z, .asm_10029f
+	cp $2
+	jr z, .asm_100296
+	cp $f5
+	jr z, .asm_1002a5
+	cp $f6
+	jr z, .asm_1002a5
+	cp $f7
+	jr z, .asm_100293
+	cp $f8
+	jr z, .asm_1002b1
+	jr .asm_1002c0
+
+.asm_100293
+	ld c, $2
+	ret
+
+.asm_100296
+	callba Script_reloadmappart
+	ld c, $4
+	ret
+
+.asm_10029f
+	call Function1002dc
+	ld c, $0
+	ret
+
+.asm_1002a5
+	callba Script_reloadmappart
+	call Function1002ed
+	ld c, $3
+	ret
+
+.asm_1002b1
+	call Function1002c9
+	call Function1002dc
+	ld de, $424d
+	call Function100232
+	ld c, $2
+	ret
+
+.asm_1002c0
+	call Function1002c9
+	call Function1002dc
+	ld c, $1
+	ret
+; 1002c9
+
+Function1002c9: ; 1002c9
+	ld hl, $cd2a
+	bit 0, [hl]
+	ret z
+	callba Function3f6d0
+	callba Function1500c
+	ret
+; 1002dc
+
+Function1002dc: ; 1002dc
+	ld a, $f8
+	ld [$ff9f], a
+	callba Function15363
+	xor a
+	ld [$ff9f], a
+	call Functione51
+	ret
+; 1002ed
+
+Function1002ed: ; 1002ed
+	callba Function49409
+	callba Function96a4
+	ld a, $1
+	ld [hCGBPalUpdate], a
+	call DelayFrame
+	ret
+; 100301
+
+Function100301: ; 100301
+	ld hl, $cd2a
+	bit 1, [hl]
+	ret z
+	callba Function106464
+	callba Function10202c
+	callba Function115dd3
+	call Function100320
+	call Functiona36
+	ret
+; 100320
+
+Function100320: ; 100320
+	callba Function104099
+	ret
+; 100327
+
+INCBIN "baserom.gbc", $100327, $10032e - $100327
+
+
 Function10032e: ; 10032e
 	call Function10034d
 	ld e, a
@@ -65611,9 +65538,19 @@
 	ret
 ; 100504
 
-INCBIN "baserom.gbc", $100504, $10062d - $100504
+Function100504: ; 100504
+	push de
+	call Function3f20
+	call Function1ad2
+	pop de
+	ld hl, $c4cc
+	call PlaceString
+	ret
+; 100513
 
+INCBIN "baserom.gbc", $100513, $10062d - $100513
 
+
 Function10062d: ; 10062d
 	push bc
 	call Function10064e
@@ -65666,9 +65603,72 @@
 	ret
 ; 100665
 
-INCBIN "baserom.gbc", $100665, $1006dc - $100665
+INCBIN "baserom.gbc", $100665, $100675 - $100665
 
+Function100675: ; 100675
+	ld hl, $cd2a
+	bit 2, [hl]
+	set 2, [hl]
+	ret nz
+	call Function1006d3
+	ret
+; 100681
 
+Function100681: ; 100681
+	push hl
+	ld hl, $cd2a
+	bit 2, [hl]
+	ld hl, $cd2a
+	set 2, [hl]
+	pop hl
+	jr nz, .asm_100694
+	push hl
+	call Function1006d3
+	pop hl
+
+.asm_100694
+	ld de, $cd32
+	ld a, [de]
+	and a
+	jr nz, .asm_1006bb
+	inc de
+	push de
+	call .asm_1006b4
+	ld de, String1006c2
+	call PlaceString
+	ld h, b
+	ld l, c
+	pop de
+	inc de
+	call .asm_1006b4
+	ld de, String1006c6
+	call PlaceString
+	ret
+
+.asm_1006b4
+	ld bc, $8102
+	call PrintNum
+	ret
+
+.asm_1006bb
+	ld de, String1006ca
+	call PlaceString
+	ret
+; 1006c2
+
+String1006c2: ; 1006c2
+	db "ふん @"
+String1006c6: ; 1006c6
+	db "びょう@"
+String1006ca: ; 1006ca
+	db "1じかんいじょう@"
+; 1006d3
+
+Function1006d3: ; 1006d3
+	call UpdateTime
+	ld de, $cd34
+	ld hl, $cd38
+
 Function1006dc: ; 1006dc
 	ld a, [hld]
 	ld c, a
@@ -66673,9 +66673,287 @@
 	ret
 ; 100edf
 
-INCBIN "baserom.gbc", $100edf, $10389d - $100edf
+INCBIN "baserom.gbc", $100edf, $101231 - $100edf
 
+Function101231: ; 101231
+	ld d, $2
+	ld e, $40
+	ld bc, $5297
+	call Function100000
+	jr .asm_10123d
 
+.asm_10123d
+	xor a
+	ld [ScriptVar], a
+	ld a, c
+	ld hl, Table101247
+	rst JumpTable
+	ret
+; 101247
+
+Table101247: ; 101247
+	dw Function101251
+	dw Function10127d
+	dw Function10127c
+	dw Function10126c
+	dw Function101265
+; 101251
+
+Function101251: ; 101251
+	call Function1ad2
+	call ResetWindow
+	ld hl, $61f4
+	call Function1021e0
+	call Function1020ea
+	ret c
+	call Function102142
+	ret
+; 101265
+
+Function101265: ; 101265
+	ld hl, $61ef
+	call Function1021e0
+	ret
+; 10126c
+
+Function10126c: ; 10126c
+	call Function1ad2
+	callba Script_reloadmappart
+	ld hl, $61f4
+	call Function1021e0
+	ret
+; 10127c
+
+Function10127c: ; 10127c
+	ret
+; 10127d
+
+Function10127d: ; 10127d
+	ret
+; 10127e
+
+Function10127e: ; 10127e
+	ld a, [$dc5f]
+	and a
+	jr z, .asm_101290
+	cp $1
+	ld c, $27
+	jr z, .asm_101292
+	cp $2
+	ld c, $37
+	jr z, .asm_101292
+
+.asm_101290
+	ld c, $0
+
+.asm_101292
+	ld a, c
+	ld [$cd25], a
+	ret
+; 101297
+
+INCBIN "baserom.gbc", $101297, $1013aa - $101297
+
+Function1013aa: ; 1013aa
+	call WhiteBGMap
+	call Function1d7d
+	call Function2bae
+	callba Function106464
+	call Function1ad2
+	call Function2b5c
+	ret
+; 1013c0
+
+INCBIN "baserom.gbc", $1013c0, $1013d6 - $1013c0
+
+Function1013d6: ; 1013d6
+	callba Function104000
+	ret
+; 1013dd
+
+INCBIN "baserom.gbc", $1013dd, $10142c - $1013dd
+
+Function10142c: ; 10142c
+	ld a, $1
+	ld [$c305], a
+	callba Function115e18
+	ret
+; 101438
+
+INCBIN "baserom.gbc", $101438, $101ee4 - $101438
+
+Function101ee4: ; 101ee4
+	ld d, $0
+	ld hl, $5ef5
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld d, [hl]
+	ld e, a
+	callba Function100504
+	ret
+; 101ef5
+
+INCBIN "baserom.gbc", $101ef5, $10202c - $101ef5
+
+Function10202c: ; 10202c
+	callba Function115d99
+	ld hl, $cd29
+	set 7, [hl]
+	ld c, $2
+	call Function10142c
+	ld e, $d
+	call Function101ee4
+	ld hl, $c4f4
+	call Function100681
+	ret
+; 102048
+
+INCBIN "baserom.gbc", $102048, $1020ea - $102048
+
+Function1020ea: ; 1020ea
+	ld hl, $dc41
+	bit 4, [hl]
+	jr z, .asm_102110
+	ld hl, $dc41
+	bit 2, [hl]
+	jr nz, .asm_102110
+	call Function10218d
+	ld hl, EnemyMoveAnimation
+	bit 4, [hl]
+	jr z, .asm_102110
+	ld hl, EnemyMoveAnimation
+	bit 2, [hl]
+	jr nz, .asm_102110
+	call Function102112
+	jr z, .asm_102110
+	and a
+	ret
+
+.asm_102110
+	scf
+	ret
+; 102112
+
+Function102112: ; 102112
+	ld a, $4
+	call GetSRAMBank
+	ld hl, $a041
+	ld c, $28
+.asm_10211c
+	push hl
+	ld de, PlayerMoveAnimation
+	ld b, $1f
+.asm_102122
+	ld a, [de]
+	cp [hl]
+	jr nz, .asm_10212f
+	inc de
+	inc hl
+	dec b
+	jr nz, .asm_102122
+	pop hl
+	xor a
+	jr .asm_10213c
+
+.asm_10212f
+	pop hl
+	ld de, $0025
+	add hl, de
+	dec c
+	jr nz, .asm_10211c
+	ld a, $1
+	and a
+	jr .asm_10213c
+
+.asm_10213c
+	push af
+	call CloseSRAM
+	pop af
+	ret
+; 102142
+
+Function102142: ; 102142
+	call Function10218d
+	call Function102180
+	ld hl, $61d1
+	call Function1d4f
+	ld de, $0090
+	call StartSFX
+	call Functiona36
+	call Function1c07
+	call Function10219f
+	ld hl, $61d6
+	call Function1d4f
+	call Function1dcf
+	call Function1c07
+	jr c, .asm_10217c
+	call Function1021b8
+	jr c, .asm_10217c
+	call Function10218d
+	call Function102180
+	ld hl, $61db
+	call PrintText
+
+.asm_10217c
+	call Function1013d6
+	ret
+; 102180
+
+Function102180: ; 102180
+	ld hl, EnemyMoveEffect
+	ld de, StringBuffer2
+	ld bc, $000b
+	call CopyBytes
+	ret
+; 10218d
+
+Function10218d: ; 10218d
+	ld hl, $dc00
+	ld de, EnemyMoveAnimation
+	ld bc, $0026
+	ld a, $5
+	call Function306b
+	ld de, EnemyMoveEffect
+	ret
+; 10219f
+
+Function10219f: ; 10219f
+	call FadeToMenu
+	call Function10218d
+	ld de, EnemyMoveEffect
+	callba Function8ac4e
+	call Functiona36
+	call PlayClickSFX
+	call Function1013aa
+	ret
+; 1021b8
+
+Function1021b8: ; 1021b8
+	call FadeToMenu
+	call Function10218d
+	ld de, PlayerMoveAnimation
+	callba Function8ac70
+	ld a, c
+	ld [StringBuffer1], a
+	push af
+	call Function1013aa
+	pop af
+	ret
+; 1021d1
+
+INCBIN "baserom.gbc", $1021d1, $1021e0 - $1021d1
+
+Function1021e0: ; 1021e0
+	call Function1d4f
+	call Functiona36
+	call Function1c07
+	ret
+; 1021ea
+
+INCBIN "baserom.gbc", $1021ea, $10389d - $1021ea
+
+
 SECTION "bank41",ROMX,BANK[$41]
 
 Function104000: ; 104000
@@ -66699,9 +66977,17 @@
 	jp Function104177
 ; 104067
 
-INCBIN "baserom.gbc", $104067, $104110 - $104067
+INCBIN "baserom.gbc", $104067, $104099 - $104067
 
+Function104099: ; 104099
+	ld hl, Function104061
+	ld hl, $40a2
+	jp Function104177
+; 1040a2
 
+INCBIN "baserom.gbc", $1040a2, $104110 - $1040a2
+
+
 Function104110: ; 104110
 	ld hl, $4116
 	jp Function104177
@@ -67821,9 +68107,39 @@
 	ret
 ; 10630f
 
-INCBIN "baserom.gbc", $10630f, $106594 - $10630f
+INCBIN "baserom.gbc", $10630f, $106462 - $10630f
 
+Function106462: ; 106462
+	ret
+; 106463
 
+INCBIN "baserom.gbc", $106463, $106464 - $106463
+
+Function106464: ; 106464
+	ld de, $5214
+	ld hl, $9600
+	ld bc, $3e01
+	call Get2bpp
+	ld de, $5424
+	ld hl, $9610
+	ld bc, $3e01
+	call Get2bpp
+	ld de, $6514
+	ld hl, $9620
+	ld c, $9
+	ld b, $41
+	call Get2bpp
+	ld de, $40b0
+	ld hl, $96b0
+	ld b, $f
+	call Get2bpp
+	callba Functionfb4cc
+	ret
+; 10649b
+
+INCBIN "baserom.gbc", $10649b, $106594 - $10649b
+
+
 Function106594: ; 106594
 	ld de, $65ad
 	ld hl, VTiles1
@@ -68511,9 +68827,188 @@
 	jp [hl]
 ; 11425c
 
-INCBIN "baserom.gbc", $11425c, $117a7f - $11425c
+INCBIN "baserom.gbc", $11425c, $115d99 - $11425c
 
+Function115d99: ; 115d99
+	ld de, $601a
+	ld hl, $8600
+	ld bc, $4514
+	call Get2bpp
+	xor a
+	ld [$c305], a
+	ld [$c306], a
+	ld [$c309], a
+	ld [$c30a], a
+	ld [$c30b], a
+	ld [$c30c], a
+	ld a, $10
+	ld [$c307], a
+	ld a, $18
+	ld [$c308], a
+	ret
+; 115dc3
 
+INCBIN "baserom.gbc", $115dc3, $115dd3 - $115dc3
+
+Function115dd3: ; 115dd3
+	ld a, [$c305]
+	and a
+	ret z
+	ld a, $a0
+	ld hl, $c47c
+	ld bc, $0020
+	call ByteFill
+	call Function115e22
+	ld a, [$c309]
+	sla a
+	ld c, a
+	ld b, $0
+	ld hl, $5e86
+	add hl, bc
+	ld a, [hli]
+	ld e, a
+	ld a, [hl]
+	ld d, a
+	push de
+	pop hl
+	ld de, $c47c
+	ld a, [$c307]
+	ld c, a
+	ld a, [$c308]
+	ld b, a
+	ld a, [hli]
+.asm_115e04
+	push af
+	ld a, [hli]
+	add b
+	ld [de], a
+	inc de
+	ld a, [hli]
+	add c
+	ld [de], a
+	inc de
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hli]
+	ld [de], a
+	inc de
+	pop af
+	dec a
+	jr nz, .asm_115e04
+	ret
+; 115e18
+
+Function115e18: ; 115e18
+	ld a, c
+	ld [$c30a], a
+	xor a
+	ld [$c30b], a
+	jr Function115e2b
+; 115e22
+
+Function115e22: ; 115e22
+	ld hl, $c30c
+	dec [hl]
+	ret nz
+	ld hl, $c30b
+	inc [hl]
+
+Function115e2b: ; 115e2b
+	ld a, [$c30a]
+	sla a
+	ld c, a
+	ld b, $0
+	ld hl, $5e59
+	add hl, bc
+	ld a, [hli]
+	ld e, a
+	ld a, [hli]
+	ld d, a
+	push de
+	pop hl
+	ld a, [$c30b]
+	sla a
+	ld c, a
+	ld b, $0
+	add hl, bc
+	ld a, [hli]
+	cp $ff
+	jr nz, .asm_115e51
+	xor a
+	ld [$c30b], a
+	jr Function115e2b
+
+.asm_115e51
+	ld [$c309], a
+	ld a, [hl]
+	ld [$c30c], a
+	ret
+; 115e59
+
+INCBIN "baserom.gbc", $115e59, $11615a - $115e59
+
+Function11615a: ; 11615a
+	xor a
+	ld [$c30d], a
+	ld [$c319], a
+	ld [$c310], a
+	ld [$c311], a
+	ld [$c312], a
+	ld [$c313], a
+	ld [$c314], a
+	ld [$c315], a
+	ld [$c318], a
+	ld [$c3f6], a
+	ld [$c3f8], a
+	ld [$c3f2], a
+	ld [$c3f4], a
+	ld a, $24
+	ld [$c3f5], a
+	ld a, $7
+	ld [$c3f7], a
+	ld a, $b0
+	ld [$c30e], a
+	ld [$c3f1], a
+	ld a, $48
+	ld [$c30f], a
+	ld [$c3f3], a
+	ret
+; 11619d
+
+Function11619d: ; 11619d
+	ld a, [$c30d]
+	and a
+	ret z
+	ld a, [$c319]
+	cp $2
+	jr c, .asm_1161b4
+	ld a, $a0
+	ld hl, Sprites
+	ld bc, $0064
+	call ByteFill
+
+.asm_1161b4
+	call Function1161b8
+	ret
+; 1161b8
+
+Function1161b8: ; 1161b8
+	ld a, [$c319]
+	ld e, a
+	ld d, $0
+	ld hl, $61c7
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp [hl]
+; 1161c7
+
+INCBIN "baserom.gbc", $1161c7, $117a7f - $1161c7
+
+
 ; everything from here to the end of the bank is related to the
 ; Mobile Stadium option from the continue/newgame menu.
 ; XXX better function names
@@ -69166,9 +69661,93 @@
 	ret
 ; 11c05d
 
-INCBIN "baserom.gbc", $11c05d, $11c0c6 - $11c05d
+Function11c05d: ; 11c05d
+	ld a, e
+	or d
+	jr z, .asm_11c071
+	ld a, e
+	and d
+	cp $ff
+	jr z, .asm_11c071
+	push hl
+	call Function11c156
+	pop hl
+	call PlaceString
+	and a
+	ret
 
+.asm_11c071
+	ld c, l
+	ld b, h
+	scf
+	ret
+; 11c075
 
+Function11c075: ; 11c075
+	push de
+	ld a, c
+	call Function11c254
+	pop de
+	ld bc, $cd36
+	call Function11c08f
+	ret
+; 11c082
+
+INCBIN "baserom.gbc", $11c082, $11c08f - $11c082
+
+Function11c08f: ; 11c08f
+	ld l, e
+	ld h, d
+	push hl
+	ld a, $3
+.asm_11c094
+	push af
+	ld a, [bc]
+	ld e, a
+	inc bc
+	ld a, [bc]
+	ld d, a
+	inc bc
+	push bc
+	call Function11c05d
+	jr c, .asm_11c0a2
+	inc bc
+
+.asm_11c0a2
+	ld l, c
+	ld h, b
+	pop bc
+	pop af
+	dec a
+	jr nz, .asm_11c094
+	pop hl
+	ld de, $0028
+	add hl, de
+	ld a, $3
+.asm_11c0b0
+	push af
+	ld a, [bc]
+	ld e, a
+	inc bc
+	ld a, [bc]
+	ld d, a
+	inc bc
+	push bc
+	call Function11c05d
+	jr c, .asm_11c0be
+	inc bc
+
+.asm_11c0be
+	ld l, c
+	ld h, b
+	pop bc
+	pop af
+	dec a
+	jr nz, .asm_11c0b0
+	ret
+; 11c0c6
+
+
 Function11c0c6: ; 11c0c6
 	ld a, [$cf63]
 	ld l, a
@@ -69324,9 +69903,32 @@
 	jr .asm_11c18f
 ; 11c1ab
 
-INCBIN "baserom.gbc", $11c1ab, $11f686 - $11c1ab
+INCBIN "baserom.gbc", $11c1ab, $11c254 - $11c1ab
 
+Function11c254: ; 11c254
+	push af
+	ld a, $4
+	call GetSRAMBank
+	ld hl, $a007
+	pop af
+	sla a
+	sla a
+	ld c, a
+	sla a
+	add c
+	ld c, a
+	ld b, $0
+	add hl, bc
+	ld de, $cd36
+	ld bc, $000c
+	call CopyBytes
+	call CloseSRAM
+	ret
+; 11c277
 
+INCBIN "baserom.gbc", $11c277, $11f686 - $11c277
+
+
 SECTION "bank48",ROMX,BANK[$48]
 
 PicPointers:
@@ -70311,8 +70913,8 @@
 	dec a
 	push de
 	ld e, a
-	ld d, $0
-	ld hl, $7061
+	ld d, 0
+	ld hl, Table17f061
 	add hl, de
 	add hl, de
 	ld a, [hli]
@@ -70325,7 +70927,1151 @@
 	ret
 ; 17f061
 
-INCBIN "baserom.gbc", $17f061, $17ff6c - $17f061
+Table17f061: ; 17f061
+	dw Function17f081
+	dw Function17f0f8
+	dw Function17f154
+	dw Function17f181
+	dw Function17f1d0
+	dw Function17f220
+	dw Function17f27b
+	dw Function17f2cb
+	dw Function17f2ff
+	dw Function17f334
+	dw Function17f382
+	dw Function17f3c9
+	dw Function17f3f0
+	dw Function17f41d
+	dw Function17f44f
+	dw Function17f44f
+; 17f081
+
+Function17f081: ; 17f081
+	pop hl
+	call Function17f524
+	jr c, .asm_17f09f
+	ld de, $0004
+	add hl, de
+	ld a, [hli]
+	inc hl
+	inc hl
+	ld e, l
+	ld d, h
+	ld l, c
+	ld h, b
+	ld c, a
+	ld b, $0
+	add hl, bc
+	ld a, [de]
+	cp $50
+	jr z, .asm_17f09d
+	and a
+	ret
+
+.asm_17f09d
+	scf
+	ret
+
+.asm_17f09f
+	push bc
+	ld de, $cd54
+	ld bc, $0007
+	call CopyBytes
+	pop bc
+	push hl
+	push bc
+	call Function17f4f6
+	pop bc
+	ld a, [$cd54]
+	ld e, a
+	ld a, [$cd55]
+	ld d, a
+	add hl, de
+	ld e, l
+	ld d, h
+	ld l, c
+	ld h, b
+	push hl
+	ld a, [$cd56]
+	ld b, a
+	ld a, [$cd57]
+	ld c, a
+	call Function31a4
+	ld a, l
+	ld [$cd52], a
+	ld a, h
+	ld [$cd53], a
+	ld a, [$cd59]
+	and a
+	jr z, .asm_17f0ee
+	ld c, a
+	ld a, [$cd57]
+	inc a
+	ld b, a
+	ld e, l
+	ld d, h
+	dec de
+.asm_17f0e0
+	ld a, c
+	cp b
+	jr z, .asm_17f0ea
+	ld a, [de]
+	dec de
+	ld [hld], a
+	dec b
+	jr .asm_17f0e0
+
+.asm_17f0ea
+	ld a, [$cd5a]
+	ld [hl], a
+
+.asm_17f0ee
+	pop hl
+	ld a, [$cd58]
+	call Function17f50f
+	pop de
+	and a
+	ret
+; 17f0f8
+
+Function17f0f8: ; 17f0f8
+	pop hl
+	call Function17f524
+	jr c, .asm_17f114
+	ld de, $0003
+	add hl, de
+	ld a, [hli]
+	ld e, l
+	ld d, h
+	ld l, c
+	ld h, b
+	ld c, a
+	ld b, $0
+	add hl, bc
+	ld a, [de]
+	cp $50
+	jr z, .asm_17f112
+	and a
+	ret
+
+.asm_17f112
+	scf
+	ret
+
+.asm_17f114
+	push bc
+	ld de, $cd54
+	ld bc, $0004
+	call CopyBytes
+	pop bc
+	push hl
+	push bc
+	call Function17f4f6
+	ld a, [$cd54]
+	ld e, a
+	ld a, [$cd55]
+	ld d, a
+	add hl, de
+	ld de, EnemyMoveAnimation
+	ld a, [$cd56]
+	ld c, a
+	ld b, $0
+	call CopyBytes
+	ld a, $50
+	ld [de], a
+	pop hl
+	ld de, EnemyMoveAnimation
+	call PlaceString
+	ld a, c
+	ld [$cd52], a
+	ld a, b
+	ld [$cd53], a
+	ld a, [$cd57]
+	call Function17f50f
+	pop de
+	and a
+	ret
+; 17f154
+
+Function17f154: ; 17f154
+	pop hl
+	call Function17f524
+	jr c, .asm_17f167
+	inc hl
+	inc hl
+	ld e, l
+	ld d, h
+	ld a, [de]
+	cp $50
+	jr z, .asm_17f165
+	and a
+	ret
+
+.asm_17f165
+	scf
+	ret
+
+.asm_17f167
+	push bc
+	ld a, [hli]
+	ld e, a
+	ld a, [hli]
+	ld d, a
+	pop bc
+	push hl
+	push bc
+	call Function17f4f6
+	add hl, de
+	ld c, l
+	ld b, h
+	pop de
+	callba Function11c08f
+	ld c, l
+	ld b, h
+	pop de
+	and a
+	ret
+; 17f181
+
+Function17f181: ; 17f181
+	pop hl
+	call Function17f524
+	jr c, .asm_17f19d
+	ld de, $0002
+	add hl, de
+	ld a, [hli]
+	ld e, l
+	ld d, h
+	ld l, c
+	ld h, b
+	ld c, a
+	ld b, $0
+	add hl, bc
+	ld a, [de]
+	cp $50
+	jr z, .asm_17f19b
+	and a
+	ret
+
+.asm_17f19b
+	scf
+	ret
+
+.asm_17f19d
+	push bc
+	ld a, [hli]
+	ld e, a
+	ld a, [hli]
+	ld d, a
+	ld a, [hli]
+	ld [$cd54], a
+	pop bc
+	push hl
+	push bc
+	call Function17f4f6
+	add hl, de
+	ld a, [hl]
+	ld c, a
+	ld de, EnemyMoveAnimation
+	callba Function48c63
+	pop hl
+	ld de, EnemyMoveAnimation
+	call PlaceString
+	ld a, c
+	ld [$cd52], a
+	ld a, b
+	ld [$cd53], a
+	ld a, [$cd54]
+	call Function17f50f
+	pop de
+	and a
+	ret
+; 17f1d0
+
+Function17f1d0: ; 17f1d0
+	pop hl
+	call Function17f524
+	jr c, .asm_17f1ec
+	ld de, $0002
+	add hl, de
+	ld a, [hli]
+	ld e, l
+	ld d, h
+	ld l, c
+	ld h, b
+	ld c, a
+	ld b, $0
+	add hl, bc
+	ld a, [de]
+	cp $50
+	jr z, .asm_17f1ea
+	and a
+	ret
+
+.asm_17f1ea
+	scf
+	ret
+
+.asm_17f1ec
+	push bc
+	ld a, [hli]
+	ld e, a
+	ld a, [hli]
+	ld d, a
+	ld a, [hli]
+	ld [$cd54], a
+	pop bc
+	push hl
+	push bc
+	call Function17f4f6
+	add hl, de
+	ld a, [hl]
+	ld a, $1
+	ld [rSVBK], a
+	ld [$d265], a
+	call GetPokemonName
+	pop hl
+	call PlaceString
+	ld a, c
+	ld [$cd52], a
+	ld a, b
+	ld [$cd53], a
+	ld a, $4
+	ld [rSVBK], a
+	ld a, [$cd54]
+	call Function17f50f
+	pop de
+	and a
+	ret
+; 17f220
+
+Function17f220: ; 17f220
+	pop hl
+	call Function17f524
+	jr c, .asm_17f23c
+	ld de, $0002
+	add hl, de
+	ld a, [hli]
+	ld e, l
+	ld d, h
+	ld l, c
+	ld h, b
+	ld c, a
+	ld b, $0
+	add hl, bc
+	ld a, [de]
+	cp $50
+	jr z, .asm_17f23a
+	and a
+	ret
+
+.asm_17f23a
+	scf
+	ret
+
+.asm_17f23c
+	push bc
+	ld a, [hli]
+	ld e, a
+	ld a, [hli]
+	ld d, a
+	ld a, [hli]
+	ld [$cd54], a
+	pop bc
+	push hl
+	push bc
+	call Function17f4f6
+	add hl, de
+	ld a, [hl]
+	ld e, a
+	ld d, $0
+	ld hl, $726e
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld e, a
+	ld a, [hl]
+	ld d, a
+	pop hl
+	call PlaceString
+	ld a, c
+	ld [$cd52], a
+	ld a, b
+	ld [$cd53], a
+	ld a, [$cd54]
+	call Function17f50f
+	pop de
+	and a
+	ret
+; 17f26e
+
+INCBIN "baserom.gbc", $17f26e, $17f27b - $17f26e
+
+Function17f27b: ; 17f27b
+	pop hl
+	call Function17f524
+	jr c, .asm_17f297
+	ld de, $0002
+	add hl, de
+	ld a, [hli]
+	ld e, l
+	ld d, h
+	ld l, c
+	ld h, b
+	ld c, a
+	ld b, $0
+	add hl, bc
+	ld a, [de]
+	cp $50
+	jr z, .asm_17f295
+	and a
+	ret
+
+.asm_17f295
+	scf
+	ret
+
+.asm_17f297
+	push bc
+	ld a, [hli]
+	ld e, a
+	ld a, [hli]
+	ld d, a
+	ld a, [hli]
+	ld [$cd54], a
+	pop bc
+	push hl
+	push bc
+	call Function17f4f6
+	add hl, de
+	ld a, [hl]
+	ld a, $1
+	ld [rSVBK], a
+	ld [$d265], a
+	call GetItemName
+	pop hl
+	call PlaceString
+	ld a, c
+	ld [$cd52], a
+	ld a, b
+	ld [$cd53], a
+	ld a, $4
+	ld [rSVBK], a
+	ld a, [$cd54]
+	call Function17f50f
+	pop de
+	and a
+	ret
+; 17f2cb
+
+Function17f2cb: ; 17f2cb
+	pop hl
+	push bc
+	ld a, [hli]
+	ld [$cd54], a
+	ld a, [hli]
+	ld [$cd55], a
+	ld a, [$cd2e]
+	inc a
+	ld [$cd56], a
+	pop bc
+	push hl
+	ld l, c
+	ld h, b
+	push hl
+	ld de, $cd56
+	ld b, $1
+	ld a, [$cd54]
+	ld c, a
+	call Function31a4
+	ld a, l
+	ld [$cd52], a
+	ld a, h
+	ld [$cd53], a
+	pop hl
+	ld a, [$cd55]
+	call Function17f50f
+	pop de
+	and a
+	ret
+; 17f2ff
+
+Function17f2ff: ; 17f2ff
+	pop hl
+	push bc
+	ld a, [hli]
+	ld [$cd54], a
+	pop bc
+	push hl
+	push bc
+	ld a, $1
+	ld [rSVBK], a
+	ld hl, PlayerName
+	ld de, EnemyMoveAnimation
+	ld bc, $0006
+	call CopyBytes
+	ld a, $4
+	ld [rSVBK], a
+	pop hl
+	ld de, EnemyMoveAnimation
+	call PlaceString
+	ld a, c
+	ld [$cd52], a
+	ld a, b
+	ld [$cd53], a
+	ld a, [$cd54]
+	call Function17f50f
+	pop de
+	and a
+	ret
+; 17f334
+
+Function17f334: ; 17f334
+	pop hl
+	push bc
+	ld a, [hli]
+	ld [$cd55], a
+	and $f
+	ld [$cd54], a
+	pop bc
+	push hl
+	ld l, c
+	ld h, b
+	push hl
+	ld a, [$cd55]
+	bit 7, a
+	jr nz, .asm_17f355
+	ld a, $1
+	call GetSRAMBank
+	ld a, [$be3f]
+	jr .asm_17f35d
+
+.asm_17f355
+	ld a, $5
+	call GetSRAMBank
+	ld a, [$b2f3]
+
+.asm_17f35d
+	ld c, a
+	call CloseSRAM
+	ld de, EnemyMoveAnimation
+	callba Function48c63
+	pop hl
+	ld de, EnemyMoveAnimation
+	call PlaceString
+	ld a, c
+	ld [$cd52], a
+	ld a, b
+	ld [$cd53], a
+	ld a, [$cd54]
+	call Function17f50f
+	pop de
+	and a
+	ret
+; 17f382
+
+Function17f382: ; 17f382
+	pop hl
+	push bc
+	ld a, [hli]
+	ld [$cd55], a
+	and $f
+	ld [$cd54], a
+	pop bc
+	push hl
+	push bc
+	ld l, c
+	ld h, b
+	ld a, [$cd55]
+	bit 7, a
+	jr nz, .asm_17f3a3
+	ld a, $1
+	call GetSRAMBank
+	ld de, $be40
+	jr .asm_17f3ab
+
+.asm_17f3a3
+	ld a, $5
+	call GetSRAMBank
+	ld de, $b2f4
+
+.asm_17f3ab
+	ld a, $82
+	ld b, a
+	ld a, $3
+	ld c, a
+	call PrintNum
+	call CloseSRAM
+	ld a, l
+	ld [$cd52], a
+	ld a, h
+	ld [$cd53], a
+	pop hl
+	ld a, [$cd54]
+	call Function17f50f
+	pop de
+	and a
+	ret
+; 17f3c9
+
+Function17f3c9: ; 17f3c9
+	push bc
+	ld hl, $cd36
+	ld de, $c708
+	ld bc, $000c
+	call CopyBytes
+	pop de
+	ld c, $0
+	callba Function11c075
+	push hl
+	ld hl, $c708
+	ld de, $cd36
+	ld bc, $000c
+	call CopyBytes
+	pop bc
+	pop de
+	and a
+	ret
+; 17f3f0
+
+Function17f3f0: ; 17f3f0
+	pop hl
+	push hl
+	ld a, [hli]
+	push af
+	push bc
+	ld a, [hli]
+	ld e, a
+	ld a, [hli]
+	ld d, a
+	ld a, [de]
+	ld c, a
+	ld b, $0
+	add hl, bc
+	add hl, bc
+	ld a, [hli]
+	ld e, a
+	ld a, [hli]
+	ld d, a
+	ld hl, Unkn1Pals
+	add hl, de
+	ld e, l
+	ld d, h
+	pop hl
+	call PlaceString
+	pop af
+	ld e, a
+	ld d, $0
+	pop hl
+	add hl, de
+	add hl, de
+	inc hl
+	inc hl
+	inc hl
+	ld e, l
+	ld d, h
+	ld l, c
+	ld h, b
+	scf
+	ret
+; 17f41d
+
+Function17f41d: ; 17f41d
+	pop hl
+	ld a, [hli]
+	push hl
+	push af
+	ld l, c
+	ld h, b
+	ld bc, $3b60
+	add hl, bc
+	ld de, $ffec
+	ld c, $1
+.asm_17f42c
+	ld a, h
+	and a
+	jr nz, .asm_17f435
+	ld a, l
+	cp $14
+	jr c, .asm_17f439
+
+.asm_17f435
+	add hl, de
+	inc c
+	jr .asm_17f42c
+
+.asm_17f439
+	ld hl, TileMap
+	ld de, $0014
+	ld a, c
+.asm_17f440
+	and a
+	jr z, .asm_17f447
+	add hl, de
+	dec a
+	jr .asm_17f440
+
+.asm_17f447
+	pop af
+	ld e, a
+	ld d, $0
+	add hl, de
+	pop de
+	and a
+	ret
+; 17f44f
+
+Function17f44f: ; 17f44f
+	pop hl
+	call Function17f524
+	jr c, .asm_17f46d
+	ld de, $0005
+	add hl, de
+	ld a, [hli]
+	inc hl
+	inc hl
+	ld e, l
+	ld d, h
+	ld l, c
+	ld h, b
+	ld c, a
+	ld b, $0
+	add hl, bc
+	ld a, [de]
+	cp $50
+	jr z, .asm_17f46b
+	and a
+	ret
+
+.asm_17f46b
+	scf
+	ret
+
+.asm_17f46d
+	push bc
+	ld de, $cd54
+	ld bc, $0008
+	call CopyBytes
+	pop bc
+	push hl
+	push bc
+	ld a, [$cd56]
+	cp $c0
+	jr c, .asm_17f488
+	ld a, [$cd54]
+	ld [rSVBK], a
+	jr .asm_17f48e
+
+.asm_17f488
+	ld a, [$cd54]
+	call GetSRAMBank
+
+.asm_17f48e
+	ld a, [$cd55]
+	ld l, a
+	ld a, [$cd56]
+	ld h, a
+	ld de, EnemyMoveAnimation
+	ld a, [$cd57]
+	ld c, a
+	ld b, $0
+	call CopyBytes
+	ld a, [$cd56]
+	cp $c0
+	jr c, .asm_17f4af
+	ld a, $4
+	ld [rSVBK], a
+	jr .asm_17f4b7
+
+.asm_17f4af
+	call CloseSRAM
+	ld a, $6
+	call GetSRAMBank
+
+.asm_17f4b7
+	ld de, EnemyMoveAnimation
+	pop hl
+	push hl
+	ld a, [$cd57]
+	ld b, a
+	ld a, [$cd58]
+	ld c, a
+	call Function31a4
+	ld a, l
+	ld [$cd52], a
+	ld a, h
+	ld [$cd53], a
+	ld a, [$cd5a]
+	and a
+	jr z, .asm_17f4ec
+	ld c, a
+	ld a, [$cd58]
+	inc a
+	ld b, a
+	ld e, l
+	ld d, h
+	dec de
+.asm_17f4de
+	ld a, c
+	cp b
+	jr z, .asm_17f4e8
+	ld a, [de]
+	dec de
+	ld [hld], a
+	dec b
+	jr .asm_17f4de
+
+.asm_17f4e8
+	ld a, [$cd5b]
+	ld [hl], a
+
+.asm_17f4ec
+	pop hl
+	ld a, [$cd59]
+	call Function17f50f
+	pop de
+	and a
+	ret
+; 17f4f6
+
+Function17f4f6: ; 17f4f6
+	ld a, [$cd6a]
+	ld l, a
+	ld a, [$cd6b]
+	ld h, a
+	ld a, [$cd47]
+	ld c, a
+	ld a, [BGMapPalBuffer]
+	ld b, a
+	ld a, [$cd2e]
+.asm_17f509
+	and a
+	ret z
+	dec a
+	add hl, bc
+	jr .asm_17f509
+; 17f50f
+
+Function17f50f: ; 17f50f
+	and a
+	jr z, .asm_17f519
+	ld c, a
+	ld b, $0
+	add hl, bc
+	ld c, l
+	ld b, h
+	ret
+
+.asm_17f519
+	ld a, [$cd52]
+	ld c, a
+	ld l, a
+	ld a, [$cd53]
+	ld b, a
+	ld h, a
+	ret
+; 17f524
+
+Function17f524: ; 17f524
+	push hl
+	push bc
+	push de
+	ld a, [$cd42]
+	dec a
+	ld b, a
+	ld a, [$cd2e]
+	cp b
+	jr z, .asm_17f53a
+	ld hl, $cd68
+	cp [hl]
+.asm_17f536
+	pop de
+	pop bc
+	pop hl
+	ret
+
+.asm_17f53a
+	scf
+	jr .asm_17f536
+; 17f53d
+
+INCBIN "baserom.gbc", $17f53d, $17f555 - $17f53d
+
+Function17f555: ; 17f555
+.asm_17f555
+	call Functiona57
+	call Function17f5ae
+	ld a, [$c303]
+	bit 7, a
+	jr nz, .asm_17f56a
+	callba Function104000
+	jr .asm_17f555
+
+.asm_17f56a
+	call Function17f56e
+	ret
+; 17f56e
+
+Function17f56e: ; 17f56e
+	ld a, [$c300]
+	cp $22
+	jr z, .asm_17f597
+	cp $31
+	jr z, .asm_17f58a
+	cp $33
+	ret nz
+	ld a, [$c301]
+	cp $1
+	ret nz
+	ld a, [$c302]
+	cp $2
+	ret nz
+	jr .asm_17f5a1
+
+.asm_17f58a
+	ld a, [$c301]
+	cp $3
+	ret nz
+	ld a, [$c302]
+	and a
+	ret nz
+	jr .asm_17f5a1
+
+.asm_17f597
+	ld a, [$c301]
+	and a
+	ret nz
+	ld a, [$c302]
+	and a
+	ret nz
+
+.asm_17f5a1
+	ld a, $5
+	call GetSRAMBank
+	xor a
+	ld [$aa4b], a
+	call CloseSRAM
+	ret
+; 17f5ae
+
+Function17f5ae: ; 17f5ae
+	ld a, [$c303]
+	ld e, a
+	ld d, 0
+	ld hl, Table17f5bd
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp [hl]
+; 17f5bd
+
+Table17f5bd: ; 17f5bd
+	dw Function17f5c3
+	dw Function17ff23
+	dw Function17f5d2
+; 17f5c3
+
+Function17f5c3: ; 17f5c3
+	call Function17f5e4
+	callba Function2b5c
+	ld a, $1
+	ld [$c303], a
+	ret
+; 17f5d2
+
+Function17f5d2: ; 17f5d2
+	call Function17f5e4
+	callba Function104000
+	call Function32f9
+	ld a, $1
+	ld [$c303], a
+	ret
+; 17f5e4
+
+Function17f5e4: ; 17f5e4
+	ld a, $8
+	ld [MusicFade], a
+	ld de, MUSIC_NONE
+	ld a, e
+	ld [MusicFadeIDLo], a
+	ld a, d
+	ld [MusicFadeIDHi], a
+	ld a, " "
+	ld hl, TileMap
+	ld bc, $0168
+	call ByteFill
+	ld a, $6
+	ld hl, AttrMap
+	ld bc, $0168
+	call ByteFill
+	ld hl, $c4b6
+	ld b, $1
+	ld c, $e
+	call Function3eea
+	ld hl, $c4f1
+	ld b, $c
+	ld c, $10
+	call Function3eea
+	ld hl, $c4cb
+	ld de, $76dc
+	call PlaceString
+	call Function17ff3c
+	jr nc, .asm_17f632
+	ld hl, $c4d3
+	call Function17f6b7
+
+.asm_17f632
+	ld a, [$c300]
+	cp $d0
+	jr nc, .asm_17f684
+	cp $10
+	jr c, .asm_17f679
+	sub $10
+	cp $24
+	jr nc, .asm_17f679
+	ld e, a
+	ld d, $0
+	ld hl, $7706
+	add hl, de
+	add hl, de
+	ld a, [$c301]
+	ld e, a
+	ld a, [$c302]
+	ld d, a
+	ld a, [hli]
+	ld c, a
+	ld a, [hl]
+	ld h, a
+	ld l, c
+	ld a, [hli]
+	and a
+	jr z, .asm_17f679
+	ld c, a
+.asm_17f65d
+	ld a, [hli]
+	ld b, a
+	ld a, [hli]
+	cp $ff
+	jr nz, .asm_17f667
+	cp b
+	jr z, .asm_17f66e
+
+.asm_17f667
+	xor d
+	jr nz, .asm_17f674
+	ld a, b
+	xor e
+	jr nz, .asm_17f674
+
+.asm_17f66e
+	ld a, [hli]
+	ld e, a
+	ld a, [hl]
+	ld d, a
+	jr .asm_17f67d
+
+.asm_17f674
+	inc hl
+	inc hl
+	dec c
+	jr nz, .asm_17f65d
+
+.asm_17f679
+	ld a, $d9
+	jr .asm_17f684
+
+.asm_17f67d
+	ld hl, $c51a
+	call PlaceString
+	ret
+
+.asm_17f684
+	sub $d0
+	ld e, a
+	ld d, $0
+	ld hl, $7699
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld e, a
+	ld a, [hl]
+	ld d, a
+	ld hl, $c51a
+	call PlaceString
+	ret
+; 17f699
+
+INCBIN "baserom.gbc", $17f699, $17f6b7 - $17f699
+
+Function17f6b7: ; 17f6b7
+	ld a, [$c300]
+	call Function17f6cd
+	inc hl
+	ld a, [$c302]
+	and $f
+	call Function17f6d8
+	ld a, [$c301]
+	call Function17f6cd
+	ret
+; 17f6cd
+
+Function17f6cd: ; 17f6cd
+	ld c, a
+	and $f0
+	swap a
+	call Function17f6d8
+	ld a, c
+	and $f
+
+Function17f6d8: ; 17f6d8
+	add $f6
+	ld [hli], a
+	ret
+; 17f6dc
+
+INCBIN "baserom.gbc", $17f6dc, $17ff23 - $17f6dc
+
+Function17ff23: ; 17ff23
+	ld a, [hJoyPressed]
+	and a
+	ret z
+	ld a, $8
+	ld [MusicFade], a
+	ld a, [CurMusic]
+	ld [MusicFadeIDLo], a
+	xor a
+	ld [MusicFadeIDHi], a
+	ld hl, $c303
+	set 7, [hl]
+	ret
+; 17ff3c
+
+Function17ff3c: ; 17ff3c
+	nop
+	ld a, [$c300]
+	cp $d0
+	ret c
+	ld hl, $c4d2
+	ld de, $7f68
+	call PlaceString
+	ld a, [$c300]
+	push af
+	sub $d0
+	inc a
+	ld [$c300], a
+	ld hl, $c4d6
+	ld de, $c300
+	ld bc, $8103
+	call PrintNum
+	pop af
+	ld [$c300], a
+	and a
+	ret
+; 17ff68
+
+INCBIN "baserom.gbc", $17ff68, $17ff6c - $17ff68
 
 
 SECTION "bank60",ROMX,BANK[$60]
--- /dev/null
+++ b/rst.asm
@@ -1,0 +1,38 @@
+; rst vectors
+
+SECTION "rst0",ROM0[0]
+	di
+	jp Start
+
+SECTION "rst8",ROM0[FarCall]
+	jp FarCall_hl
+
+SECTION "rst10",ROM0[Bankswitch]
+	ld [hROMBank], a
+	ld [MBC3RomBank], a
+	ret
+
+SECTION "rst18",ROM0[$18]
+	rst $38
+
+SECTION "rst20",ROM0[$20]
+	rst $38
+
+SECTION "rst28",ROM0[JumpTable]
+	push de
+	ld e, a
+	ld d, 0
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	pop de
+	jp [hl]
+
+; SECTION "rst30",ROM0[$30]
+; rst30 is midst rst28
+
+SECTION "rst38",ROM0[$38]
+	rst $38
+
--- /dev/null
+++ b/trainers/dvs.asm
@@ -1,0 +1,93 @@
+GetTrainerDVs: ; 270c4
+; Return the DVs of OtherTrainerClass in bc
+
+	push hl
+	ld a, [OtherTrainerClass]
+	dec a
+	ld c, a
+	ld b, 0
+
+	ld hl, TrainerClassDVs
+	add hl, bc
+	add hl, bc
+
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+
+	pop hl
+	ret
+; 270d6
+
+TrainerClassDVs: ; 270d6
+	;  Atk  Spd
+	;  Def  Spc
+	db $9A, $77 ; falkner
+	db $88, $88 ; bugsy
+	db $98, $88 ; whitney
+	db $98, $88 ; morty
+	db $98, $88 ; pryce
+	db $98, $88 ; jasmine
+	db $98, $88 ; chuck
+	db $7C, $DD ; clair
+	db $DD, $DD ; rival1
+	db $98, $88 ; pokemon prof
+	db $DC, $DD ; will
+	db $DC, $DD ; cal
+	db $DC, $DD ; bruno
+	db $7F, $DF ; karen
+	db $DC, $DD ; koga
+	db $DC, $DD ; champion
+	db $98, $88 ; brock
+	db $78, $88 ; misty
+	db $98, $88 ; lt surge
+	db $98, $88 ; scientist
+	db $78, $88 ; erika
+	db $98, $88 ; youngster
+	db $98, $88 ; schoolboy
+	db $98, $88 ; bird keeper
+	db $58, $88 ; lass
+	db $98, $88 ; janine
+	db $D8, $C8 ; cooltrainerm
+	db $7C, $C8 ; cooltrainerf
+	db $69, $C8 ; beauty
+	db $98, $88 ; pokemaniac
+	db $D8, $A8 ; gruntm
+	db $98, $88 ; gentleman
+	db $98, $88 ; skier
+	db $68, $88 ; teacher
+	db $7D, $87 ; sabrina
+	db $98, $88 ; bug catcher
+	db $98, $88 ; fisher
+	db $98, $88 ; swimmerm
+	db $78, $88 ; swimmerf
+	db $98, $88 ; sailor
+	db $98, $88 ; super nerd
+	db $98, $88 ; rival2
+	db $98, $88 ; guitarist
+	db $A8, $88 ; hiker
+	db $98, $88 ; biker
+	db $98, $88 ; blaine
+	db $98, $88 ; burglar
+	db $98, $88 ; firebreather
+	db $98, $88 ; juggler
+	db $98, $88 ; blackbelt
+	db $D8, $A8 ; executivem
+	db $98, $88 ; psychic
+	db $6A, $A8 ; picnicker
+	db $98, $88 ; camper
+	db $7E, $A8 ; executivef
+	db $98, $88 ; sage
+	db $78, $88 ; medium
+	db $98, $88 ; boarder
+	db $98, $88 ; pokefanm
+	db $68, $8A ; kimono girl
+	db $68, $A8 ; twins
+	db $6D, $88 ; pokefanf
+	db $FD, $DE ; red
+	db $9D, $DD ; blue
+	db $98, $88 ; officer
+	db $7E, $A8 ; gruntf
+	db $98, $88 ; mysticalman
+; 2715c
+
--- a/wram.asm
+++ b/wram.asm
@@ -860,7 +860,14 @@
 VBlankOccurred: ; cfb3
 	ds 1
 
-	ds 8
+PredefID: ; cfb4
+	ds 1
+PredefTemp: ; cfb5
+	ds 2
+PredefAddress: ; cfb7
+	ds 2
+
+	ds 3
 
 GameTimerPause: ; cfbc
 ; bit 0