shithub: pokecrystal

Download patch

ref: 02d05255fe96e9c06d176c0960395fb5aeb36211
parent: 6eac26732a7d19e08374e7e8e6f122da38b4a395
author: PikalaxALT <[email protected]>
date: Sun Dec 6 17:36:09 EST 2015

A stab at audio engine.

--- a/audio/engine.asm
+++ b/audio/engine.asm
@@ -22,7 +22,7 @@
 	ld [hli], a ; ff26 ; music channels
 
 	ld hl, rNR10 ; sound channel registers
-	ld e, $04 ; number of channels
+	ld e, $4 ; number of channels
 .clearsound
 ;   sound channel   1      2      3      4
 	xor a
@@ -29,7 +29,7 @@
 	ld [hli], a ; rNR10, rNR20, rNR30, rNR40 ; sweep = 0
 
 	ld [hli], a ; rNR11, rNR21, rNR31, rNR41 ; length/wavepattern = 0
-	ld a, $08
+	ld a, $8
 	ld [hli], a ; rNR12, rNR22, rNR32, rNR42 ; envelope = 0
 	xor a
 	ld [hli], a ; rNR13, rNR23, rNR33, rNR43 ; frequency lo = 0
@@ -39,7 +39,7 @@
 	jr nz, .clearsound
 
 	ld hl, Channel1 ; start of channel data
-	ld de, $01bf ; length of area to clear (entire sound wram area)
+	ld de, $1bf ; length of area to clear (entire sound wram area)
 .clearchannels ; clear Channel1-$c2bf
 	xor a
 	ld [hli], a
@@ -72,7 +72,7 @@
 ; e8051
 
 MusicOn: ; e8051
-	ld a, $01
+	ld a, 1
 	ld [MusicPlaying], a
 	ret
 ; e8057
@@ -104,7 +104,7 @@
 	ld hl, Channel1NoteDuration - Channel1
 	add hl, bc
 	ld a, [hl]
-	cp a, $02 ; 1 or 0?
+	cp $2 ; 1 or 0?
 	jr c, .noteover
 	dec [hl]
 	jr .asm_e8093
@@ -147,7 +147,7 @@
 	jr z, .next
 	; are we in a sfx channel right now?
 	ld a, [CurChannel]
-	cp a, $04
+	cp $4
 	jr nc, .next
 	; are any sfx channels active?
 	; if so, mute
@@ -170,9 +170,9 @@
 .next
 	; are we in a sfx channel right now?
 	ld a, [CurChannel]
-	cp a, $04 ; sfx
+	cp $4 ; sfx
 	jr nc, .asm_e80ee
-	ld hl, $00cb
+	ld hl, Channel5Flags - Channel1
 	add hl, bc
 	bit 0, [hl]
 	jr nz, .asm_e80fc
@@ -198,7 +198,7 @@
 	ld a, [CurChannel]
 	inc a
 	ld [CurChannel], a
-	cp a, $08 ; are we done?
+	cp $8 ; are we done?
 	jp nz, .loop ; do it all again
 
 	call PlayDanger
@@ -216,10 +216,10 @@
 UpdateChannels: ; e8125
 	ld hl, .ChannelFnPtrs
 	ld a, [CurChannel]
-	and a, $07
+	and $7
 	add a
 	ld e, a
-	ld d, $00
+	ld d, 0
 	add hl, de
 	ld a, [hli]
 	ld h, [hl]
@@ -271,7 +271,7 @@
 	ld a, [wc292]
 	ld d, a
 	ld a, [rNR11]
-	and a, $3f ; sound length
+	and $3f ; sound length
 	or d
 	ld [rNR11], a
 	ret
@@ -279,7 +279,7 @@
 	ld a, [wc292]
 	ld d, a
 	ld a, [rNR11]
-	and a, $3f ; sound length
+	and $3f ; sound length
 	or d
 	ld [rNR11], a
 	ld a, [wc294]
@@ -287,7 +287,7 @@
 	ret
 .ch1rest
 	ld a, [rNR52]
-	and a, %10001110 ; ch1 off
+	and %10001110 ; ch1 off
 	ld [rNR52], a
 	ld hl, rNR10
 	call ClearChannel
@@ -302,7 +302,7 @@
 	ld a, [wc294]
 	ld [rNR13], a
 	ld a, [wc295]
-	or a, $80
+	or $80
 	ld [rNR14], a
 	ret
 
@@ -321,7 +321,7 @@
 	ld a, [wc292]
 	ld d, a
 	ld a, [rNR21]
-	and a, $3f ; sound length
+	and $3f ; sound length
 	or d
 	ld [rNR21], a
 	ret
@@ -335,7 +335,7 @@
 	ld a, [wc292]
 	ld d, a
 	ld a, [rNR21]
-	and a, $3f ; sound length
+	and $3f ; sound length
 	or d
 	ld [rNR21], a
 	ld a, [wc294]
@@ -343,7 +343,7 @@
 	ret
 .ch2rest
 	ld a, [rNR52]
-	and a, %10001101 ; ch2 off
+	and %10001101 ; ch2 off
 	ld [rNR52], a
 	ld hl, rNR20
 	call ClearChannel
@@ -358,7 +358,7 @@
 	ld a, [wc294]
 	ld [rNR23], a
 	ld a, [wc295]
-	or a, $80 ; initial (restart)
+	or $80 ; initial (restart)
 	ld [rNR24], a
 	ret
 
@@ -385,7 +385,7 @@
 	ret
 .ch3rest
 	ld a, [rNR52]
-	and a, %10001011 ; ch3 off
+	and %10001011 ; ch3 off
 	ld [rNR52], a
 	ld hl, rNR30
 	call ClearChannel
@@ -401,17 +401,17 @@
 	ld a, [wc294]
 	ld [rNR33], a
 	ld a, [wc295]
-	or a, $80
+	or $80
 	ld [rNR34], a
 	ret
 .asm_e8268
 	push hl
 	ld a, [wc293]
-	and a, $0f ; only 0-9 are valid
+	and $f ; only 0-9 are valid
 	ld l, a
-	ld h, $00
+	ld h, 0
 	; hl << 4
-	; each wavepattern is $0f bytes long
+	; each wavepattern is $f bytes long
 	; so seeking is done in $10s
 rept 4
 	add hl, hl
@@ -453,7 +453,7 @@
 	ld [rWave_f], a
 	pop hl
 	ld a, [wc293]
-	and a, $f0
+	and $f0
 	sla a
 	ld [rNR32], a
 	ret
@@ -473,7 +473,7 @@
 	ret
 .ch4rest
 	ld a, [rNR52]
-	and a, %10000111 ; ch4 off
+	and %10000111 ; ch4 off
 	ld [rNR52], a
 	ld hl, rNR40
 	call ClearChannel
@@ -515,13 +515,13 @@
 	ld a, [Danger]
 	bit 7, a
 	ret z
-	and a, $7f
+	and $7f
 	ld d, a
 	call _CheckSFX
 	jr c, .asm_e8335
 	and a
 	jr z, .asm_e8323
-	cp a, 16 ; halfway
+	cp 16 ; halfway
 	jr z, .asm_e831e
 	jr .asm_e8335
 .asm_e831e
@@ -543,19 +543,19 @@
 .asm_e8335
 	ld a, d
 	inc a
-	cp a, 30
+	cp 30
 	jr c, .asm_e833c
 	xor a
 .asm_e833c
-	or a, $80
+	or $80
 	ld [Danger], a
 	; is hw ch1 on?
 	ld a, [SoundOutput]
-	and a, $11
+	and $11
 	ret nz
 	; if not, turn it on
 	ld a, [SoundOutput]
-	or a, $11
+	or $11
 	ld [SoundOutput], a
 	ret
 ; e8350
@@ -562,7 +562,7 @@
 
 Tablee8350: ; e8350
 	db $80 ; duty 50%
-	db $e2 ; volume $e, envelope decrease sweep 2
+	db $e2 ; volume 14, envelope decrease sweep 2
 	db $50 ; frequency: $750
 	db $87 ; restart sound
 ; e8354
@@ -569,7 +569,7 @@
 
 Tablee8354: ; e8354
 	db $80 ; duty 50%
-	db $e2 ; volume $e, envelope decrease sweep 2
+	db $e2 ; volume 14, envelope decrease sweep 2
 	db $ee ; frequency: $6ee
 	db $86 ; restart sound
 ; e8358
@@ -600,11 +600,11 @@
 	ld a, [MusicFade]
 	ld d, a
 	; get new count
-	and a, $3f
+	and $3f
 	ld [MusicFadeCount], a
 	; get SO1 volume
 	ld a, [Volume]
-	and a, $07
+	and $7
 	; which way are we fading?
 	bit 7, d
 	jr nz, .fadein
@@ -620,7 +620,7 @@
 	ld [Volume], a
 	; did we just get on a bike?
 	ld a, [PlayerState]
-	cp a, $01 ; bicycle
+	cp $1 ; bicycle
 	jr z, .bicycle
 	push bc
 	; restart sound
@@ -664,7 +664,7 @@
 
 .fadein
 	; are we done?
-	cp a, $07
+	cp $7
 	jr nc, .maxvolume
 	; inc volume
 	inc a
@@ -696,7 +696,7 @@
 	ld hl, wc297 ; ????
 	sub [hl]
 	jr nc, .ok
-	ld a, $01
+	ld a, 1
 .ok
 	ld [hl], a
 	; get frequency
@@ -706,16 +706,16 @@
 	inc hl
 	ld d, [hl]
 	; ????
-	ld hl, $0021
+	ld hl, Channel1Field0x21 - Channel1
 	add hl, bc
 	ld a, e
 	sub [hl]
 	ld e, a
 	ld a, d
-	sbc a, $00
+	sbc a, 0
 	ld d, a
 	; ????
-	ld hl, $0022
+	ld hl, Channel1Field0x22 - Channel1
 	add hl, bc
 	sub [hl]
 	jr nc, .asm_e8420
@@ -730,16 +730,16 @@
 	inc hl
 	ld d, [hl]
 	; ????
-	ld hl, $0021
+	ld hl, Channel1Field0x21 - Channel1
 	add hl, bc
 	ld a, [hl]
 	sub e
 	ld e, a
 	ld a, d
-	sbc a, $00
+	sbc a, 0
 	ld d, a
 	; ????
-	ld hl, $0022
+	ld hl, Channel1Field0x22 - Channel1
 	add hl, bc
 	ld a, [hl]
 	sub d
@@ -757,16 +757,16 @@
 	inc hl
 	ld d, [hl]
 	; ????
-	ld hl, $0021
+	ld hl, Channel1Field0x21 - Channel1
 	add hl, bc
 	ld a, e
 	sub [hl]
 	ld e, a
 	ld a, d
-	sbc a, $00
+	sbc a, 0
 	ld d, a
 	; ????
-	ld hl, $0022
+	ld hl, Channel1Field0x22 - Channel1
 	add hl, bc
 	sub [hl]
 	ld d, a
@@ -773,7 +773,7 @@
 .asm_e843e
 	push bc
 	ld hl, wc297
-	ld b, $00 ; loop count
+	ld b, 0; loop count
 .loop
 	inc b
 	ld a, e
@@ -791,14 +791,14 @@
 	ld d, b ; loop count
 	; ????
 	pop bc
-	ld hl, $0023
+	ld hl, Channel1Field0x23 - Channel1
 	add hl, bc
 	ld [hl], d
-	ld hl, $0024
+	ld hl, Channel1Field0x24 - Channel1
 	add hl, bc
 	ld [hl], a
 	; clear ????
-	ld hl, $0025
+	ld hl, Channel1Field0x25 - Channel1
 	add hl, bc
 	xor a
 	ld [hl], a
@@ -812,13 +812,13 @@
 	add hl, bc
 	bit 2, [hl]
 	jr z, .next
-	ld hl, $001c
+	ld hl, Channel1Field0x1c - Channel1
 	add hl, bc
 	ld a, [hl]
 	rlca
 	rlca
 	ld [hl], a
-	and a, $c0
+	and $c0
 	ld [wc292], a
 	ld hl, Channel1NoteFlags - Channel1
 	add hl, bc
@@ -869,7 +869,7 @@
 	ld hl, Channel1VibratoRate - Channel1
 	add hl, bc
 	ld a, [hl]
-	and a, $0f ; count
+	and $f ; count
 	jr z, .toggle
 .subexit
 	dec [hl]
@@ -893,13 +893,13 @@
 	res 0, [hl]
 	; get the delay
 	ld a, d
-	and a, $0f ; lo
+	and $f ; lo
 	;
 	ld d, a
 	ld a, e
 	sub d
 	jr nc, .asm_e84ef
-	ld a, $00
+	ld a, 0
 	jr .asm_e84ef
 .down
 	; vibrato up
@@ -906,7 +906,7 @@
 	set 0, [hl]
 	; get the delay
 	ld a, d
-	and a, $f0 ; hi
+	and $f0 ; hi
 	swap a ; move it to lo
 	;
 	add e
@@ -940,36 +940,36 @@
 	bit 1, [hl]
 	jr z, .next
 	;
-	ld hl, $0023
+	ld hl, Channel1Field0x23 - Channel1
 	add hl, bc
 	ld l, [hl]
-	ld h, $00
+	ld h, 0
 	add hl, de
 	ld d, h
 	ld e, l
 	; get ????
-	ld hl, $0024
+	ld hl, Channel1Field0x24 - Channel1
 	add hl, bc
 	ld a, [hl]
 	; add it to ????
-	ld hl, $0025
+	ld hl, Channel1Field0x25 - Channel1
 	add hl, bc
 	add [hl]
 	ld [hl], a
-	ld a, $00
+	ld a, 0
 	adc e
 	ld e, a
-	ld a, $00
+	ld a, 0
 	adc d
 	ld d, a
 	;
-	ld hl, $0022
+	ld hl, Channel1Field0x22 - Channel1
 	add hl, bc
 	ld a, [hl]
 	cp d
 	jp c, .quit1
 	jr nz, .quit2
-	ld hl, $0021
+	ld hl, Channel1Field0x21 - Channel1
 	add hl, bc
 	ld a, [hl]
 	cp e
@@ -977,32 +977,32 @@
 	jr .quit2
 .next
 	ld a, e
-	ld hl, $0023
+	ld hl, Channel1Field0x23 - Channel1
 	add hl, bc
 	ld e, [hl]
 	sub e
 	ld e, a
 	ld a, d
-	sbc a, $00
+	sbc a, 0
 	ld d, a
-	ld hl, $0024
+	ld hl, Channel1Field0x24 - Channel1
 	add hl, bc
 	ld a, [hl]
 	add a
 	ld [hl], a
 	ld a, e
-	sbc a, $00
+	sbc a, 0
 	ld e, a
 	ld a, d
-	sbc a, $00
+	sbc a, 0
 	ld d,a
-	ld hl, $0022
+	ld hl, Channel1Field0x22 - Channel1
 	add hl, bc
 	ld a, d
 	cp [hl]
 	jr c, .quit1
 	jr nz, .quit2
-	ld hl, $0021
+	ld hl, Channel1Field0x21 - Channel1
 	add hl, bc
 	ld a, e
 	cp [hl]
@@ -1108,9 +1108,9 @@
 ParseMusic: ; e85e1
 ; parses until a note is read or the song is ended
 	call GetMusicByte ; store next byte in a
-	cp a, $ff ; is the song over?
+	cp $ff ; is the song over?
 	jr z, .readff
-	cp a, $d0 ; is it a note?
+	cp $d0 ; is it a note?
 	jr c, .readnote
 	; then it's a command
 .readcommand
@@ -1131,13 +1131,13 @@
 ; normal note
 	; set note duration (bottom nybble)
 	ld a, [CurMusicByte]
-	and a, $0f
+	and $f
 	call SetNoteDuration
 	; get note pitch (top nybble)
 	ld a, [CurMusicByte]
 	swap a
-	and a, $0f
-	jr z, .rest ; pitch $0 -> rest
+	and $f
+	jr z, .rest ; pitch 0-> rest
 	; update pitch
 	ld hl, Channel1Pitch - Channel1
 	add hl, bc
@@ -1160,6 +1160,7 @@
 	add hl, bc
 	set 4, [hl]
 	jp LoadNote
+
 .rest
 ; note = rest
 	ld hl, Channel1NoteFlags - Channel1
@@ -1174,14 +1175,14 @@
 	bit 1, [hl] ; in a subroutine?
 	jr nz, .readcommand ; execute
 	ld a, [CurChannel]
-	cp a, $04 ; channels 0-3?
-	jr nc, .asm_e8651
+	cp $4 ; channels 0-3?
+	jr nc, .chan_5to8
 	; ????
-	ld hl, $00cb
+	ld hl, Channel5Flags - Channel1
 	add hl, bc
 	bit 0, [hl]
 	jr nz, .ok
-.asm_e8651
+.chan_5to8
 	ld hl, Channel1Flags - Channel1
 	add hl, bc
 	bit 5, [hl]
@@ -1188,7 +1189,7 @@
 	call nz, RestoreVolume
 	; end music
 	ld a, [CurChannel]
-	cp a, $04 ; channel 5?
+	cp $4 ; channel 5?
 	jr nz, .ok
 	; ????
 	xor a
@@ -1216,7 +1217,7 @@
 RestoreVolume: ; e8679
 	; ch5 only
 	ld a, [CurChannel]
-	cp a, $04
+	cp $4
 	ret nz
 	xor a
 	ld hl, Channel6CryPitch
@@ -1253,8 +1254,8 @@
 	ld [hl], a
 	; are we on the last channel? (noise sampling)
 	ld a, [CurChannel]
-	and a, $03
-	cp a, $03
+	and $3
+	cp $3
 	ret z
 	; update hi frequency from next param
 	call GetMusicByte
@@ -1268,13 +1269,13 @@
 ; load ptr to sample header in NoiseSampleAddress
 	; are we on the last channel?
 	ld a, [CurChannel]
-	and a, $03
-	cp a, $03
+	and $3
+	cp $3
 	; ret if not
 	ret nz
 	; update note duration
 	ld a, [CurMusicByte]
-	and a, $0f
+	and $f
 	call SetNoteDuration
 	; check current channel
 	ld a, [CurChannel]
@@ -1290,7 +1291,7 @@
 .next
 	; load noise sample set id into de
 	ld e, a
-	ld d, $00
+	ld d, 0
 	; load ptr to noise sample set in hl
 	ld hl, Drumkits
 rept 2
@@ -1303,11 +1304,11 @@
 	ld a, [CurMusicByte]
 	swap a
 	; non-rest note?
-	and a, $0f
+	and $f
 	ret z
 	; use 'pitch' to seek noise sample set
 	ld e, a
-	ld d, $00
+	ld d, 0
 rept 2
 	add hl, de
 endr
@@ -1328,7 +1329,7 @@
 	; get command #
 	sub a, $d0 ; first command
 	ld e, a
-	ld d, $00
+	ld d, 0
 	; seek command pointer
 	ld hl, MusicCommands
 rept 2
@@ -1344,39 +1345,39 @@
 MusicCommands: ; e8720
 ; pointer to each command in order
 	; octaves
-	dw MusicD0 ; octave 8
-	dw MusicD1 ; octave 7
-	dw MusicD2 ; octave 6
-	dw MusicD3 ; octave 5
-	dw MusicD4 ; octave 4
-	dw MusicD5 ; octave 3
-	dw MusicD6 ; octave 2
-	dw MusicD7 ; octave 1
-	dw MusicD8 ; note length + intensity
-	dw MusicD9 ; set starting octave
-	dw MusicDA ; tempo
-	dw MusicDB ; duty cycle
-	dw MusicDC ; intensity
-	dw MusicDD ; update sound status
+	dw Music_Octave8 ; octave 8
+	dw Music_Octave7 ; octave 7
+	dw Music_Octave6 ; octave 6
+	dw Music_Octave5 ; octave 5
+	dw Music_Octave4 ; octave 4
+	dw Music_Octave3 ; octave 3
+	dw Music_Octave2 ; octave 2
+	dw Music_Octave1 ; octave 1
+	dw Music_NoteType ; note length + intensity
+	dw Music_ForceOctave ; set starting octave
+	dw Music_Tempo ; tempo
+	dw Music_DutyCycle ; duty cycle
+	dw Music_Intensity ; intensity
+	dw Music_SoundStatus ; update sound status
 	dw MusicDE ; ???? + duty cycle
-	dw MusicDF ;
+	dw Music_ToggleSFX ;
 	dw MusicE0 ;
-	dw MusicE1 ; vibrato
+	dw Music_Vibrato ; vibrato
 	dw MusicE2 ;
-	dw MusicE3 ; music noise sampling
-	dw MusicE4 ; force panning
-	dw MusicE5 ; volume
-	dw MusicE6 ; tune
+	dw Music_ToggleNoise ; music noise sampling
+	dw Music_Panning ; force panning
+	dw Music_Volume ; volume
+	dw Music_Tone ; tune
 	dw MusicE7 ;
 	dw MusicE8 ;
-	dw MusicE9 ; global tempo
-	dw MusicEA ; restart current channel from header
-	dw MusicEB ; new song
-	dw MusicEC ; sfx priority on
-	dw MusicED ; sfx priority off
+	dw Music_GlobalTempo ; global tempo
+	dw Music_RestartChannel ; restart current channel from header
+	dw Music_NewSong ; new song
+	dw Music_SFXPriorityOn ; sfx priority on
+	dw Music_SFXPriorityOff ; sfx priority off
 	dw MusicEE ;
-	dw MusicEF ; stereo panning
-	dw MusicF0 ; sfx noise sampling
+	dw Music_StereoPanning ; stereo panning
+	dw Music_SFXToggleNoise ; sfx noise sampling
 	dw MusicF1 ; nothing
 	dw MusicF2 ; nothing
 	dw MusicF3 ; nothing
@@ -1386,12 +1387,12 @@
 	dw MusicF7 ; nothing
 	dw MusicF8 ; nothing
 	dw MusicF9 ;
-	dw MusicFA ;
-	dw MusicFB ;
-	dw MusicFC ; jump
-	dw MusicFD ; loop
-	dw MusicFE ; call
-	dw MusicFF ; return
+	dw Music_SetCondition ;
+	dw Music_JumpIf ;
+	dw Music_JumpChannel ; jump
+	dw Music_LoopChannel ; loop
+	dw Music_CallChannel ; call
+	dw Music_EndChannel ; return
 ; e8780
 
 MusicF1: ; e8780
@@ -1405,7 +1406,7 @@
 	ret
 ; e8781
 
-MusicFF: ; e8781
+Music_EndChannel: ; e8781
 ; called when $ff is encountered w/ subroutine flag set
 ; end music stream
 ; return to caller of the subroutine
@@ -1427,7 +1428,7 @@
 	ret
 ; e8796
 
-MusicFE: ; e8796
+Music_CallChannel: ; e8796
 ; call music stream (subroutine)
 ; parameters: ll hh ; pointer to subroutine
 	; get pointer from next 2 bytes
@@ -1461,7 +1462,7 @@
 	ret
 ; e87bc
 
-MusicFC: ; e87bc
+Music_JumpChannel: ; e87bc
 ; jump
 ; parameters: ll hh ; pointer
 	; get pointer from next 2 bytes
@@ -1477,7 +1478,7 @@
 	ret
 ; e87cc
 
-MusicFD: ; e87cc
+Music_LoopChannel: ; e87cc
 ; loops xx - 1 times
 ; 	00: infinite
 ; params: 3
@@ -1539,7 +1540,7 @@
 	ret
 ; e880e
 
-MusicFA: ; e880e
+Music_SetCondition: ; e880e
 ; set condition for a jump
 ; used with FB
 ; params: 1
@@ -1553,7 +1554,7 @@
 	ret
 ; e8817
 
-MusicFB: ; e8817
+Music_JumpIf: ; e8817
 ; conditional jump
 ; used with FA
 ; params: 3
@@ -1610,9 +1611,9 @@
 ; if ????, jump
 	; get channel
 	ld a, [CurChannel]
-	and a, $03 ; ch0-3
+	and $3 ; ch0-3
 	ld e, a
-	ld d, $00
+	ld d, 0
 	; hl = wc2b8 + channel id
 	ld hl, wc2b8
 	add hl, de
@@ -1638,7 +1639,7 @@
 	ret
 .jump
 	; reset jump flag
-	ld [hl], $00
+	ld [hl], 0
 	; de = pointer
 	call GetMusicByte
 	ld e, a
@@ -1657,7 +1658,7 @@
 ; sets some flag
 ; seems to be unused
 ; params: 0
-	ld a, $01
+	ld a, 1
 	ld [wc2b5], a
 	ret
 ; e8873
@@ -1666,7 +1667,7 @@
 ; seems to have been dummied out
 ; params: 1
 	call GetMusicByte
-	ld hl, $002c
+	ld hl, Channel1Field0x2c - Channel1
 	add hl, bc
 	ld [hl], a
 	ld hl, Channel1Flags2 - Channel1
@@ -1675,7 +1676,7 @@
 	ret
 ; e8882
 
-MusicE1: ; e8882
+Music_Vibrato: ; e8882
 ; vibrato
 ; params: 2
 ;	1: [xx]
@@ -1710,11 +1711,11 @@
 	add hl, bc
 	ld d, a
 	; get top nybble
-	and a, $f0
+	and $f0
 	swap a
 	srl a ; halve
 	ld e, a
-	adc a, $00 ; round up
+	adc a, 0; round up
 	swap a
 	or e
 	ld [hl], a
@@ -1723,7 +1724,7 @@
 	add hl, bc
 	; get bottom nybble
 	ld a, d
-	and a, $0f
+	and $f
 	ld d, a
 	swap a
 	or d
@@ -1736,19 +1737,21 @@
 ; params: 2
 	call GetMusicByte
 	ld [wc297], a
+
 	call GetMusicByte
 	ld d, a
-	and a, $0f
+	and $f
 	ld e, a
+
 	ld a, d
 	swap a
-	and a, $0f
+	and $f
 	ld d, a
 	call GetFrequency
-	ld hl, $0021
+	ld hl, Channel1Field0x21 - Channel1
 	add hl, bc
 	ld [hl], e
-	ld hl, $0022
+	ld hl, Channel1Field0x22 - Channel1
 	add hl, bc
 	ld [hl], d
 	ld hl, Channel1Flags2 - Channel1
@@ -1757,7 +1760,7 @@
 	ret
 ; e88e4
 
-MusicE6: ; e88e4
+Music_Tone: ; e88e4
 ; tone
 ; params: 2
 	ld hl, Channel1Flags2 - Channel1
@@ -1779,7 +1782,7 @@
 	add hl, bc
 	set 6, [hl]
 	call GetMusicByte
-	ld hl, $0029
+	ld hl, Channel1Field0x29 - Channel1
 	add hl, bc
 	ld [hl], a
 	ret
@@ -1796,11 +1799,11 @@
 	call GetMusicByte
 	rrca
 	rrca
-	ld hl, $001c
+	ld hl, Channel1Field0x1c - Channel1
 	add hl, bc
 	ld [hl], a
 	; update duty cycle
-	and a, $c0 ; only uses top 2 bits
+	and $c0 ; only uses top 2 bits
 	ld hl, Channel1DutyCycle - Channel1
 	add hl, bc
 	ld [hl], a
@@ -1814,13 +1817,13 @@
 	add hl, bc
 	set 5, [hl]
 	call GetMusicByte
-	ld hl, $002a
+	ld hl, Channel1Field0x2a - Channel1
 	add hl, bc
 	ld [hl], a
 	ret
 ; e892d
 
-MusicDF: ; e892d
+Music_ToggleSFX: ; e892d
 ; toggle something
 ; params: none
 	ld hl, Channel1Flags - Channel1
@@ -1834,7 +1837,7 @@
 	ret
 ; e893b
 
-MusicE3: ; e893b
+Music_ToggleNoise: ; e893b
 ; toggle music noise sampling
 ; can't be used as a straight toggle since the param is not read from on->off
 ; params:
@@ -1856,7 +1859,7 @@
 	ret
 ; e894f
 
-MusicF0: ; e894f
+Music_SFXToggleNoise: ; e894f
 ; toggle sfx noise sampling
 ; params:
 ;	on: 1
@@ -1877,26 +1880,26 @@
 	ret
 ; e8963
 
-MusicD8: ; e8963
+Music_NoteType: ; e8963
 ; note length
 ;	# frames per 16th note
-; intensity: see MusicDC
+; intensity: see Music_Intensity
 ; params: 2
 	; note length
 	call GetMusicByte
-	ld hl, $002d
+	ld hl, Channel1NoteLength - Channel1
 	add hl, bc
 	ld [hl], a
 	ld a, [CurChannel]
-	and a, $03
-	cp a, $03
+	and $3
+	cp $3
 	ret z
 	; intensity
-	call MusicDC
+	call Music_Intensity
 	ret
 ; e8977
 
-MusicDD: ; e8977
+Music_SoundStatus: ; e8977
 ; update sound status
 ; params: 1
 	call GetMusicByte
@@ -1907,13 +1910,13 @@
 	ret
 ; e8984
 
-MusicDB: ; e8984
+Music_DutyCycle: ; e8984
 ; duty cycle
 ; params: 1
 	call GetMusicByte
 	rrca
 	rrca
-	and a, $c0
+	and $c0
 	ld hl, Channel1DutyCycle - Channel1
 	add hl, bc
 	ld [hl], a
@@ -1920,7 +1923,7 @@
 	ret
 ; e8991
 
-MusicDC: ; e8991
+Music_Intensity: ; e8991
 ; intensity
 ; params: 1
 ;	hi: pressure
@@ -1932,7 +1935,7 @@
 	ret
 ; e899a
 
-MusicDA: ; e899a
+Music_Tempo: ; e899a
 ; global tempo
 ; params: 2
 ;	de: tempo
@@ -1944,14 +1947,14 @@
 	ret
 ; e89a6
 
-MusicD0: ; e89a6
-MusicD1: ; e89a6
-MusicD2: ; e89a6
-MusicD3: ; e89a6
-MusicD4: ; e89a6
-MusicD5: ; e89a6
-MusicD6: ; e89a6
-MusicD7: ; e89a6
+Music_Octave8: ; e89a6
+Music_Octave7: ; e89a6
+Music_Octave6: ; e89a6
+Music_Octave5: ; e89a6
+Music_Octave4: ; e89a6
+Music_Octave3: ; e89a6
+Music_Octave2: ; e89a6
+Music_Octave1: ; e89a6
 ; set octave based on lo nybble of the command
 	ld hl, Channel1Octave - Channel1
 	add hl, bc
@@ -1961,7 +1964,7 @@
 	ret
 ; e89b1
 
-MusicD9: ; e89b1
+Music_ForceOctave: ; e89b1
 ; set starting octave
 ; this forces all notes up by the starting octave
 ; params: 1
@@ -1972,19 +1975,19 @@
 	ret
 ; e89ba
 
-MusicEF: ; e89ba
+Music_StereoPanning: ; e89ba
 ; stereo panning
 ; params: 1
 	; stereo on?
 	ld a, [Options]
 	bit 5, a ; stereo
-	jr nz, MusicE4
+	jr nz, Music_Panning
 	; skip param
 	call GetMusicByte
 	ret
 ; e89c5
 
-MusicE4: ; e89c5
+Music_Panning: ; e89c5
 ; force panning
 ; params: 1
 	call SetLRTracks
@@ -1996,7 +1999,7 @@
 	ret
 ; e89d2
 
-MusicE5: ; e89d2
+Music_Volume: ; e89d2
 ; set volume
 ; params: 1
 ;	see Volume
@@ -2013,19 +2016,19 @@
 	ret
 ; e89e1
 
-MusicE9: ; e89e1
+Music_GlobalTempo: ; e89e1
 ; set global tempo to current channel tempo +- param
 ; params: 1 signed
 	call GetMusicByte
 	ld e, a
 	; check sign
-	cp a, $80
+	cp $80
 	jr nc, .negative
 ;positive
-	ld d, $00
+	ld d, 0
 	jr .ok
 .negative
-	ld d, $ff
+	ld d, -1
 .ok
 	ld hl, Channel1Tempo - Channel1
 	add hl, bc
@@ -2039,15 +2042,15 @@
 	ret
 ; e89fd
 
-MusicEC: ; e89fd
+Music_SFXPriorityOn: ; e89fd
 ; turn sfx priority on
 ; params: none
-	ld a, $01
+	ld a, 1
 	ld [SFXPriority], a
 	ret
 ; e8a03
 
-MusicED: ; e8a03
+Music_SFXPriorityOff: ; e8a03
 ; turn sfx priority off
 ; params: none
 	xor a
@@ -2055,7 +2058,7 @@
 	ret
 ; e8a08
 
-MusicEA: ; e8a08
+Music_RestartChannel: ; e8a08
 ; restart current channel from channel header (same bank)
 ; params: 2 (5)
 ; ll hh: pointer to new channel header
@@ -2090,7 +2093,7 @@
 	ret
 ; e8a30
 
-MusicEB: ; e8a30
+Music_NewSong: ; e8a30
 ; new song
 ; params: 2
 ;	de: song id
@@ -2151,7 +2154,7 @@
 	add hl, bc
 	ld a, [hl]
 	swap a ; hi nybble
-	and a, $0f
+	and $f
 	; add current octave
 	add d
 	push af ; we'll use this later
@@ -2159,10 +2162,10 @@
 	ld hl, Channel1StartingOctave - Channel1
 	add hl, bc
 	ld a, [hl]
-	and a, $0f ; lo nybble
+	and $f ; lo nybble
 	;
 	ld l, a ; ok
-	ld d, $00
+	ld d, 0
 	ld h, d
 	add hl, de ; add current pitch
 	add hl, hl ; skip 2 bytes for each
@@ -2173,9 +2176,10 @@
 	ld d, [hl]
 	; get our octave
 	pop af
+	; shift right by [7 - octave] bits
 .loop
 	; [7 - octave] loops
-	cp a, $07
+	cp $7
 	jr nc, .ok
 	; sra de
 	sra d
@@ -2184,7 +2188,7 @@
 	jr .loop
 .ok
 	ld a, d
-	and a, $07 ; top 3 bits for frequency (11 total)
+	and $7 ; top 3 bits for frequency (11 total)
 	ld d, a
 	ret
 ; e8a8d
@@ -2194,13 +2198,13 @@
 	; store delay units in de
 	inc a
 	ld e, a
-	ld d, $00
+	ld d, 0
 	; store NoteLength in a
 	ld hl, Channel1NoteLength - Channel1
 	add hl, bc
 	ld a, [hl]
 	; multiply NoteLength by delay units
-	ld l, $00 ; just multiply
+	ld l, 0; just multiply
 	call MultiplySimple
 	ld a, l ; % $100
 	; store Tempo in de
@@ -2210,7 +2214,7 @@
 	inc hl
 	ld d, [hl]
 	; add ???? to the next result
-	ld hl, $0016
+	ld hl, Channel1Field0x16 - Channel1
 	add hl, bc
 	ld l, [hl]
 	; multiply Tempo by last result (NoteLength * delay % $100)
@@ -2219,7 +2223,7 @@
 	ld e, l
 	ld d, h
 	; store result in ????
-	ld hl, $0016
+	ld hl, Channel1Field0x16 - Channel1
 	add hl, bc
 	ld [hl], e
 	; store result in NoteDuration
@@ -2233,7 +2237,7 @@
 ; multiplies a and de
 ; adds the result to l
 ; stores the result in hl
-	ld h, $00
+	ld h, 0
 .loop
 	; halve a
 	srl a
@@ -2255,7 +2259,7 @@
 	push bc ; save current channel
 	; are we dealing with music or sfx?
 	ld a, [CurChannel]
-	cp a, $04
+	cp $4
 	jr nc, .sfxchannels
 	ld bc, Channel1
 	call SetTempo
@@ -2291,7 +2295,7 @@
 	ld [hl], d
 	; clear ????
 	xor a
-	ld hl, $0016
+	ld hl, Channel1Field0x16 - Channel1
 	add hl, bc
 	ld [hl], a
 	ret
@@ -2311,9 +2315,9 @@
 	push de
 	; store current channel in de
 	ld a, [CurChannel]
-	and a, $03
+	and $3
 	ld e, a
-	ld d, $00
+	ld d, 0
 	; get this channel's lr tracks
 	call GetLRTracks
 	add hl, de ; de = channel 0-3
@@ -2332,7 +2336,7 @@
 	ld hl, MusicID
 	ld [hl], e ; song number
 	inc hl
-	ld [hl], d ; MusicIDHi (always $00)
+	ld [hl], d ; MusicIDHi (always $)
 	ld hl, Music
 	add hl, de ; three
 	add hl, de ; byte
@@ -2345,7 +2349,7 @@
 	call LoadMusicByte ; store first byte of music header in a
 	rlca
 	rlca
-	and a, $03 ; get number of channels
+	and $3 ; get number of channels
 	inc a
 .loop
 ; start playing channels
@@ -2400,7 +2404,7 @@
 	; Top 2 bits contain the number of channels
 	rlca
 	rlca
-	and a, 3
+	and 3
 	
 ; For each channel:
 	inc a
@@ -2425,7 +2429,7 @@
 	
 ; No tempo for channel 4
 	ld a, [CurChannel]
-	and a, 3
+	and 3
 	cp 3
 	jr nc, .start
 	
@@ -2454,7 +2458,7 @@
 	add hl, bc
 	ld a, [hl]
 	ld hl, CryTracks
-	and a, [hl]
+	and [hl]
 	ld hl, Channel1Tracks - Channel1
 	add hl, bc
 	ld [hl], a
@@ -2491,7 +2495,7 @@
 	res 0, [hl] ; turn it off
 	xor a
 	ld [rNR11], a ; length/wavepattern = 0
-	ld a, $08
+	ld a, $8
 	ld [rNR12], a ; envelope = 0
 	xor a
 	ld [rNR13], a ; frequency lo = 0
@@ -2507,7 +2511,7 @@
 	res 0, [hl] ; turn it off
 	xor a
 	ld [rNR21], a ; length/wavepattern = 0
-	ld a, $08
+	ld a, $8
 	ld [rNR22], a ; envelope = 0
 	xor a
 	ld [rNR23], a ; frequency lo = 0
@@ -2521,7 +2525,7 @@
 	xor a
 	ld [rNR30], a ; sound mode #3 off
 	ld [rNR31], a ; length/wavepattern = 0
-	ld a, $08
+	ld a, $8
 	ld [rNR32], a ; envelope = 0
 	xor a
 	ld [rNR33], a ; frequency lo = 0
@@ -2534,7 +2538,7 @@
 	res 0, [hl] ; turn it off
 	xor a
 	ld [rNR41], a ; length/wavepattern = 0
-	ld a, $08
+	ld a, $8
 	ld [rNR42], a ; envelope = 0
 	xor a
 	ld [rNR43], a ; frequency lo = 0
@@ -2564,7 +2568,7 @@
 	call LoadMusicByte
 	rlca ; top 2
 	rlca ; bits
-	and a, $03
+	and $3
 	inc a ; # channels -> # loops
 .startchannels
 	push af
@@ -2633,7 +2637,7 @@
 	ld a, [CurChannel]
 	and 3 ; ch1-4
 	ld e, a
-	ld d, $0
+	ld d, 0
 	call GetLRTracks
 	add hl, de
 	ld a, [hl]
@@ -2644,22 +2648,22 @@
 	add hl, bc
 	ld [hl], a
 	
-	ld hl, $0030 ; $c131 - Channel1
+	ld hl, Channel1Field0x30 - Channel1 ; $c131 - Channel1
 	add hl, bc
 	ld [hl], a
 	
 	ld a, [CryTracks]
 	cp 2 ; ch 1-2
-	jr c, .asm_e8d0c
+	jr c, .skip
 	
 ; ch3-4
 	ld a, [wc2be]
 	
-	ld hl, $002e ; $c12f - Channel1
+	ld hl, Channel1Field0x2e - Channel1 ; $c12f - Channel1
 	add hl, bc
 	ld [hl], a
 	
-	ld hl, $002f ; $c130 - Channel1
+	ld hl, Channel1Field0x2f - Channel1 ; $c130 - Channel1
 	add hl, bc
 	ld [hl], a
 	
@@ -2667,7 +2671,7 @@
 	add hl, bc
 	set 7, [hl]
 	
-.asm_e8d0c
+.skip
 	pop de
 	
 ; turn channel on
@@ -2693,10 +2697,10 @@
 	; get pointer to current channel
 	call LoadMusicByte
 	inc de
-	and a, $07 ; bit 0-2 (current channel)
+	and $7 ; bit 0-2 (current channel)
 	ld [CurChannel], a
 	ld c, a
-	ld b, $00
+	ld b, 0
 	ld hl, ChannelPointers
 rept 2
 	add hl, bc
@@ -2755,7 +2759,7 @@
 	ld [hli], a
 	inc a
 	ld [hl], a
-	; set note length to default ($01) (fast)
+	; set note length to default ($1) (fast)
 	ld hl, Channel1NoteLength - Channel1
 	add hl, bc
 	ld [hl], a
@@ -2805,16 +2809,16 @@
 WaveSamples: ; e8db2
 	; these are streams of 32 4-bit values used as wavepatterns
 	; nothing interesting here!
-	db $02, $46, $8a, $ce, $ff, $fe, $ed, $dc, $cb, $a9, $87, $65, $44, $33, $22, $11
-	db $02, $46, $8a, $ce, $ef, $ff, $fe, $ee, $dd, $cb, $a9, $87, $65, $43, $22, $11
-	db $13, $69, $bd, $ee, $ee, $ff, $ff, $ed, $de, $ff, $ff, $ee, $ee, $db, $96, $31
-	db $02, $46, $8a, $cd, $ef, $fe, $de, $ff, $ee, $dc, $ba, $98, $76, $54, $32, $10
-	db $01, $23, $45, $67, $8a, $cd, $ee, $f7, $7f, $ee, $dc, $a8, $76, $54, $32, $10
-	db $00, $11, $22, $33, $44, $33, $22, $11, $ff, $ee, $cc, $aa, $88, $aa, $cc, $ee
-	db $02, $46, $8a, $ce, $cb, $a9, $87, $65, $ff, $fe, $ed, $dc, $44, $33, $22, $11
-	db $c0, $a9, $87, $f5, $ff, $fe, $ed, $dc, $44, $33, $22, $f1, $02, $46, $8a, $ce
-	db $44, $33, $22, $1f, $00, $46, $8a, $ce, $f8, $fe, $ed, $dc, $cb, $a9, $87, $65
-	db $11, $00, $00, $08, $00, $13, $57, $9a, $b4, $ba, $a9, $98, $87, $65, $43, $21
+	dn 0, 2, 4, 6, 8, 10, 12, 14, 15, 15, 15, 14, 14, 13, 13, 12, 12, 11, 10, 9, 8, 7, 6, 5, 4, 4, 3, 3, 2, 2, 1, 1
+	dn 0, 2, 4, 6, 8, 10, 12, 14, 14, 15, 15, 15, 15, 14, 14, 14, 13, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 2, 1, 1
+	dn 1, 3, 6, 9, 11, 13, 14, 14, 14, 14, 15, 15, 15, 15, 14, 13, 13, 14, 15, 15, 15, 15, 14, 14, 14, 14, 13, 11, 9, 6, 3, 1
+	dn 0, 2, 4, 6, 8, 10, 12, 13, 14, 15, 15, 14, 13, 14, 15, 15, 14, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
+	dn 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 14, 15, 7, 7, 15, 14, 14, 13, 12, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0
+	dn 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 15, 15, 14, 14, 12, 12, 10, 10, 8, 8, 10, 10, 12, 12, 14, 14
+	dn 0, 2, 4, 6, 8, 10, 12, 14, 12, 11, 10, 9, 8, 7, 6, 5, 15, 15, 15, 14, 14, 13, 13, 12, 4, 4, 3, 3, 2, 2, 1, 1
+	dn 12, 0, 10, 9, 8, 7, 15, 5, 15, 15, 15, 14, 14, 13, 13, 12, 4, 4, 3, 3, 2, 2, 15, 1, 0, 2, 4, 6, 8, 10, 12, 14
+	dn 4, 4, 3, 3, 2, 2, 1, 15, 0, 0, 4, 6, 8, 10, 12, 14, 15, 8, 15, 14, 14, 13, 13, 12, 12, 11, 10, 9, 8, 7, 6, 5
+	dn 1, 1, 0, 0, 0, 0, 0, 8, 0, 0, 1, 3, 5, 7, 9, 10, 11, 4, 11, 10, 10, 9, 9, 8, 8, 7, 6, 5, 4, 3, 2, 1
 ; e8e52
 
 Drumkits: ; e8e52
@@ -2915,27 +2919,27 @@
 Drum00: ; e8efa
 ; unused
 	noise $20, $11, $00
-	db $ff ; end
+	endchannel
 ; e8efe
 
 Snare1: ; e8efe
 	noise $20, $c1, $33
-	db $ff ; end
+	endchannel
 ; e8f02
 
 Snare2: ; e8f02
 	noise $20, $b1, $33
-	db $ff ; end
+	endchannel
 ; e8f06
 
 Snare3: ; e8f06
 	noise $20, $a1, $33
-	db $ff ; end
+	endchannel
 ; e8f0a
 
 Snare4: ; e8f0a
 	noise $20, $81, $33
-	db $ff ; end
+	endchannel
 ; e8f0e
 
 Drum05: ; e8f0e
@@ -2945,85 +2949,85 @@
 	noise $24, $83, $34
 	noise $23, $82, $33
 	noise $22, $81, $32
-	db $ff ; end
+	endchannel
 ; e8f21
 
 Triangle1: ; e8f21
 	noise $20, $51, $2a
-	db $ff ; end
+	endchannel
 ; e8f25
 
 Triangle2: ; e8f25
 	noise $21, $41, $2b
 	noise $20, $61, $2a
-	db $ff ; end
+	endchannel
 ; e8f2c
 
 HiHat1: ; e8f2c
 	noise $20, $81, $10
-	db $ff ; end
+	endchannel
 ; e8f30
 
 Snare5: ; e8f30
 	noise $20, $82, $23
-	db $ff ; end
+	endchannel
 ; e8f34
 
 Snare6: ; e8f34
 	noise $20, $82, $25
-	db $ff ; end
+	endchannel
 ; e8f38
 
 Snare7: ; e8f38
 	noise $20, $82, $26
-	db $ff ; end
+	endchannel
 ; e8f3c
 
 HiHat2: ; e8f3c
 	noise $20, $a1, $10
-	db $ff ; end
+	endchannel
 ; e8f40
 
 HiHat3: ; e8f40
 	noise $20, $a2, $11
-	db $ff ; end
+	endchannel
 ; e8f44
 
 Snare8: ; e8f44
 	noise $20, $a2, $50
-	db $ff ; end
+	endchannel
 ; e8f48
 
 Triangle3: ; e8f48
 	noise $20, $a1, $18
 	noise $20, $31, $33
-	db $ff ; end
+	endchannel
 ; e8f4f
 
 Triangle4: ; e8f4f
 	noise $22, $91, $28
 	noise $20, $71, $18
-	db $ff ; end
+	endchannel
 ; e8f56
 
 Snare9: ; e8f56
 	noise $20, $91, $22
-	db $ff ; end
+	endchannel
 ; e8f5a
 
 Snare10: ; e8f5a
 	noise $20, $71, $22
-	db $ff ; end
+	endchannel
 ; e8f5e
 
 Snare11: ; e8f5e
 	noise $20, $61, $22
-	db $ff ; end
+	endchannel
 ; e8f62
 
 Drum20: ; e8f62
 	noise $20, $11, $11
-	db $ff ; end
+	endchannel
 ; e8f66
 
 Drum21: ; e8f66
@@ -3032,91 +3036,91 @@
 
 Snare12: ; e8f67
 	noise $20, $91, $33
-	db $ff ; end
+	endchannel
 ; e8f6b
 
 Snare13: ; e8f6b
 	noise $20, $51, $32
-	db $ff ; end
+	endchannel
 ; e8f6f
 
 Snare14: ; e8f6f
 	noise $20, $81, $31
-	db $ff ; end
+	endchannel
 ; e8f73
 
 Kick1: ; e8f73
 	noise $20, $88, $6b
 	noise $20, $71, $00
-	db $ff ; end
+	endchannel
 ; e8f7a
 
 Triangle5: ; e8f7a
 	noise $30, $91, $18
-	db $ff ; end
+	endchannel
 ; e8f7e
 
 Drum27: ; e8f7e
 	noise $27, $92, $10
-	db $ff ; end
+	endchannel
 ; e8f82
 
 Drum28: ; e8f82
 	noise $33, $91, $00
 	noise $33, $11, $00
-	db $ff ; end
+	endchannel
 ; e8f89
 
 Drum29: ; e8f89
 	noise $33, $91, $11
 	noise $33, $11, $00
-	db $ff ; end
+	endchannel
 ; e8f90
 
 Crash1: ; e8f90
 	noise $33, $88, $15
 	noise $20, $65, $12
-	db $ff ; end
+	endchannel
 ; e8f97
 
 Drum31: ; e8f97
 	noise $33, $51, $21
 	noise $33, $11, $11
-	db $ff ; end
+	endchannel
 ; e8f9e
 
 Drum32: ; e8f9e
 	noise $33, $51, $50
 	noise $33, $11, $11
-	db $ff ; end
+	endchannel
 ; e8fa5
 
 Drum33: ; e8fa5
 	noise $20, $a1, $31
-	db $ff ; end
+	endchannel
 ; e8fa9
 
 Crash2: ; e8fa9
 	noise $20, $84, $12
-	db $ff ; end
+	endchannel
 ; e8fad
 
 Drum35: ; e8fad
 	noise $33, $81, $00
 	noise $33, $11, $00
-	db $ff ; end
+	endchannel
 ; e8fb4
 
 Drum36: ; e8fb4
 	noise $33, $81, $21
 	noise $33, $11, $11
-	db $ff ; end
+	endchannel
 ; e8fbb
 
 Kick2: ; e8fbb
 	noise $20, $a8, $6b
 	noise $20, $71, $00
-	db $ff ; end
+	endchannel
 ; e8fc2
 
 GetLRTracks: ; e8fc2
@@ -3170,7 +3174,7 @@
 	ld a, $80
 	ld [hli], a
 	ld hl, rNR10
-	ld e, $04
+	ld e, $4
 .loop
 	call ClearChannel
 	dec e
@@ -3187,7 +3191,7 @@
 	ld [hli], a ; rNR10, rNR20, rNR30, rNR40 ; sweep = 0
 
 	ld [hli], a ; rNR11, rNR21, rNR31, rNR41 ; length/wavepattern = 0
-	ld a, $08
+	ld a, $8
 	ld [hli], a ; rNR12, rNR22, rNR32, rNR42 ; envelope = 0
 	xor a
 	ld [hli], a ; rNR13, rNR23, rNR33, rNR43 ; frequency lo = 0
--- a/audio/music/evolution.asm
+++ b/audio/music/evolution.asm
@@ -13,13 +13,13 @@
 	dutycycle $2
 	notetype $c, $92
 	octave 3
-	unknownmusic0xe0 $0, $4a
+	unknownmusic0xe0 $0, 4, A_
 	note C_, 1
-	unknownmusic0xe0 $0, $4a
+	unknownmusic0xe0 $0, 4, A_
 	note G_, 1
-	unknownmusic0xe0 $0, $4a
+	unknownmusic0xe0 $0, 4, A_
 	note C_, 1
-	unknownmusic0xe0 $0, $4a
+	unknownmusic0xe0 $0, 4, A_
 	note G_, 1
 	note __, 4
 	dutycycle $3
--- a/audio/music/healpokemon.asm
+++ b/audio/music/healpokemon.asm
@@ -11,16 +11,16 @@
 	tone $0001
 	notetype $c, $81
 	note __, 2
-	unknownmusic0xe0 $0, $40
+	unknownmusic0xe0 $0, 4, __
 	note B_, 2
-	unknownmusic0xe0 $0, $55
+	unknownmusic0xe0 $0, 5, E_
 	note B_, 2
-	unknownmusic0xe0 $0, $45
+	unknownmusic0xe0 $0, 4, E_
 	note E_, 2
 	note __, 4
-	unknownmusic0xe0 $0, $30
+	unknownmusic0xe0 $0, 3, __
 	note E_, 4
-	unknownmusic0xe0 $0, $40
+	unknownmusic0xe0 $0, 4, __
 	note B_, 4
 	endchannel
 ; f06c4
--- a/engine/mysterygift.asm
+++ b/engine/mysterygift.asm
@@ -702,22 +702,23 @@
 	ld e, d
 	ld a, $1
 	ld [hPrintNum9], a
-.asm_104de4
+.loop
 	call Function105038
 	ld b, $2
 	ld c, rRP % $100
 	ld a, [hMoneyTemp + 1]
 	bit 1, a
-	jr z, .asm_104df6
+	jr z, .next
 	ld a, $10
 	ld [hPrintNum10], a
 	ret
-.asm_104df6
+
+.next
 	bit 0, a
 	jr nz, asm_104e3a
 	ld a, [$ff00+c]
 	and b
-	jr nz, .asm_104de4
+	jr nz, .loop
 
 Function104dfe: ; 104dfe (41:4dfe)
 	ld c, rRP % $100
@@ -1181,11 +1182,11 @@
 Function1050fb: ; 1050fb (41:50fb)
 	ld hl, wMysteryGiftTrainerData
 	xor a
-	ld b, $26
-.asm_105101
+	ld b, wMysteryGiftTrainerDataEnd - wMysteryGiftTrainerData
+.loop
 	ld [hli], a
 	dec b
-	jr nz, .asm_105101
+	jr nz, .loop
 	ret
 
 
--- /dev/null
+++ b/engine/mysterygift2.asm
@@ -1,0 +1,229 @@
+Function2c642: ; 2c642 (b:4642)
+	ld de, wc800
+	ld a, $1
+	ld [de], a
+	inc de
+	ld a, BANK(sGameData)
+	call GetSRAMBank
+	ld hl, sPlayerData + PlayerID - wPlayerData
+	ld a, [hli]
+	ld [de], a
+	ld b, a
+	inc de
+	ld a, [hl]
+	ld [de], a
+	ld c, a
+	inc de
+	push bc
+	ld hl, sPlayerData + PlayerName - wPlayerData
+	ld bc, NAME_LENGTH
+	call CopyBytes
+	push de
+	ld hl, sPokemonData + PokedexCaught - wPokemonData
+	ld b, (NUM_POKEMON + 7) / 8
+	call CountSetBits
+	pop de
+	pop bc
+	ld a, [wd265]
+	ld [de], a
+	inc de
+	call CloseSRAM
+	call Random
+	and $1
+	ld [de], a
+	inc de
+	call Function2c6ac
+	ld [de], a
+	inc de
+	ld a, c
+	ld c, b
+	ld b, a
+	call Function2c6ac
+	ld [de], a
+	inc de
+	ld a, BANK(sBackupMysteryGiftItem)
+	call GetSRAMBank
+	ld a, [sBackupMysteryGiftItem]
+	ld [de], a
+	inc de
+	ld a, [sBackupMysteryGiftItem + 1]
+	ld [de], a
+	ld a, $14
+	ld [wca00], a
+	call CloseSRAM
+	ld hl, wc800
+	ld de, wc950
+	ld bc, $14
+	jp CopyBytes
+
+Function2c6ac: ; 2c6ac (b:46ac)
+	push de
+	call Random
+	cp $19 ; 10 percent
+	jr c, .tenpercent
+	call Random
+	and $7
+	ld d, a
+	rl d
+	ld e, $80
+.loop
+	rlc e
+	dec a
+	jr nz, .loop
+	ld a, e
+	and c
+	jr z, .skip
+	ld a, $1
+.skip
+	add d
+	jr .done
+
+.tenpercent
+	call Random
+	cp $32 ; 20 percent
+	jr c, .twopercent
+	call Random
+	and $3
+	ld d, a
+	rl d
+	ld e, $80
+.loop2
+	rlc e
+	dec a
+	jr nz, .loop2
+	ld a, e
+	and b
+	jr z, .skip2
+	ld a, $1
+.skip2
+	add d
+	add $10
+	jr .done
+
+.twopercent
+	call Random
+	cp $32 ; 50 ; 20 percent
+	jr c, .pointfourpercent
+	ld a, b
+	swap a
+	and $7
+	add $18
+	jr .done
+
+.pointfourpercent
+	ld a, b
+	and $80
+	ld a, $20
+	jr z, .done
+	ld a, $21
+
+.done
+	pop de
+	ret
+
+MysteryGiftGetItemHeldEffect: ; 2c708 (b:4708)
+	ld a, c
+	cp $25 ; 37
+	jr nc, Function2c722
+	ld hl, Unknown_2c725
+	ld b, 0
+	add hl, bc
+	ld c, [hl]
+	ret
+
+MysteryGiftGetDecoration: ; 2c715 (b:4715)
+	ld a, c
+	cp $25 ; 37
+	jr nc, Function2c722
+	ld hl, Unknown_2c74a
+	ld b, 0
+	add hl, bc
+	ld c, [hl]
+	ret
+
+Function2c722: ; 2c722 (b:4722)
+	ld c, DECO_POLKADOT_BED ; GREAT_BALL
+	ret
+; 2c725 (b:4725)
+
+Unknown_2c725: ; 2c725
+; May or may not be items.
+	db BERRY
+	db PRZCUREBERRY
+	db MINT_BERRY
+	db ICE_BERRY
+	db BURNT_BERRY
+	db PSNCUREBERRY
+	db GUARD_SPEC
+	db X_DEFEND
+	db X_ATTACK
+	db BITTER_BERRY
+	db DIRE_HIT
+	db X_SPECIAL
+	db X_ACCURACY
+	db EON_MAIL
+	db MORPH_MAIL
+	db MUSIC_MAIL
+	db MIRACLEBERRY
+	db GOLD_BERRY
+	db REVIVE
+	db GREAT_BALL
+	db SUPER_REPEL
+	db MAX_REPEL
+	db ELIXER
+	db ETHER
+	db WATER_STONE
+	db FIRE_STONE
+	db LEAF_STONE
+	db THUNDERSTONE
+	db MAX_ETHER
+	db MAX_ELIXER
+	db MAX_REVIVE
+	db SCOPE_LENS
+	db HP_UP
+	db PP_UP
+	db RARE_CANDY
+	db BLUESKY_MAIL
+	db MIRAGE_MAIL
+; 2c74a
+
+Unknown_2c74a: ; 2c74a
+; May or may not be items.
+	db DECO_SNES
+	db DECO_BIG_SNORLAX_DOLL
+	db DECO_BIG_ONIX_DOLL
+	db DECO_BIG_LAPRAS_DOLL
+	db DECO_DOLLS
+	db DECO_PIKACHU_DOLL
+	db DECO_SURF_PIKACHU_DOLL
+	db DECO_CLEFAIRY_DOLL
+	db DECO_JIGGLYPUFF_DOLL
+	db DECO_BULBASAUR_DOLL
+	db DECO_TROPICPLANT
+	db DECO_JUMBOPLANT
+	db DECO_TOWN_MAP
+	db DECO_CHARMANDER_DOLL
+	db DECO_POLIWAG_DOLL
+	db DECO_DIGLETT_DOLL
+	db DECO_BLUE_CARPET
+	db DECO_YELLOW_CARPET
+	db DECO_POSTERS
+	db DECO_PIKACHU_POSTER
+	db DECO_N64
+	db DECO_BIG_DOLLS
+	db DECO_BEDS
+	db DECO_FEATHERY_BED
+	db DECO_POLKADOT_BED
+	db DECO_PIKACHU_BED
+	db DECO_CARPETS
+	db DECO_RED_CARPET
+	db DECO_GREEN_CARPET
+	db DECO_CLEFAIRY_POSTER
+	db DECO_ODDISH_DOLL
+	db DECO_MAGNAPLANT
+	db DECO_GENGAR_DOLL
+	db DECO_CONSOLES
+	db DECO_PINK_BED
+	db DECO_SQUIRTLE_DOLL
+	db DECO_STARMIE_DOLL
+; 2c76f
--- /dev/null
+++ b/engine/search.asm
@@ -1,0 +1,276 @@
+SpecialBeastsCheck: ; 0x4a6e8
+; Check if the player owns all three legendary beasts.
+; They must exist in either party or PC, and have the player's OT and ID.
+; Return the result in ScriptVar.
+
+	ld a, RAIKOU
+	ld [ScriptVar], a
+	call CheckOwnMonAnywhere
+	jr nc, .notexist
+
+	ld a, ENTEI
+	ld [ScriptVar], a
+	call CheckOwnMonAnywhere
+	jr nc, .notexist
+
+	ld a, SUICUNE
+	ld [ScriptVar], a
+	call CheckOwnMonAnywhere
+	jr nc, .notexist
+
+	; they exist
+	ld a, 1
+	ld [ScriptVar], a
+	ret
+
+.notexist
+	xor a
+	ld [ScriptVar], a
+	ret
+
+
+SpecialMonCheck: ; 0x4a711
+; Check if the player owns any monsters of the species in ScriptVar.
+; Return the result in ScriptVar.
+
+	call CheckOwnMonAnywhere
+	jr c, .exists
+
+	; doesn't exist
+	xor a
+	ld [ScriptVar], a
+	ret
+
+.exists
+	ld a, 1
+	ld [ScriptVar], a
+	ret
+
+
+CheckOwnMonAnywhere: ; 0x4a721
+; Check if the player owns any monsters of the species in ScriptVar.
+; It must exist in either party or PC, and have the player's OT and ID.
+
+	; If there are no monsters in the party,
+	; the player must not own any yet.
+	ld a, [PartyCount]
+	and a
+	ret z
+
+	ld d, a
+	ld e, 0
+	ld hl, PartyMon1Species
+	ld bc, PartyMonOT
+
+	; Run CheckOwnMon on each Pokémon in the party.
+.partymon
+	call CheckOwnMon
+	ret c ; found!
+
+	push bc
+	ld bc, PARTYMON_STRUCT_LENGTH
+	add hl, bc
+	pop bc
+	call UpdateOTPointer
+	dec d
+	jr nz, .partymon
+
+	; Run CheckOwnMon on each Pokémon in the PC.
+	ld a, BANK(sBoxCount)
+	call GetSRAMBank
+	ld a, [sBoxCount]
+	and a
+	jr z, .boxes
+
+	ld d, a
+	ld hl, sBoxMon1Species
+	ld bc, sBoxMonOT
+.openboxmon
+	call CheckOwnMon
+	jr nc, .loop
+
+	; found!
+	call CloseSRAM
+	ret
+
+.loop
+	push bc
+	ld bc, BOXMON_STRUCT_LENGTH
+	add hl, bc
+	pop bc
+	call UpdateOTPointer
+	dec d
+	jr nz, .openboxmon
+
+	; Run CheckOwnMon on each monster in the other 13 PC boxes.
+.boxes
+	call CloseSRAM
+
+	ld c, 0
+.box
+	; Don't search the current box again.
+	ld a, [wCurBox]
+	and $f
+	cp c
+	jr z, .loopbox
+
+	; Load the box.
+	ld hl, BoxAddressTable1
+	ld b, 0
+rept 3
+	add hl, bc
+endr
+	ld a, [hli]
+	call GetSRAMBank
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+
+	; Number of monsters in the box
+	ld a, [hl]
+	and a
+	jr z, .loopbox
+
+	push bc
+
+	push hl
+	ld de, sBoxMons - sBoxCount
+	add hl, de
+	ld d, h
+	ld e, l
+	pop hl
+	push de
+	ld de, sBoxMonOT - sBoxCount
+	add hl, de
+	ld b, h
+	ld c, l
+	pop hl
+
+	ld d, a
+
+.boxmon
+	call CheckOwnMon
+	jr nc, .loopboxmon
+
+	; found!
+	pop bc
+	call CloseSRAM
+	ret
+
+.loopboxmon
+	push bc
+	ld bc, BOXMON_STRUCT_LENGTH
+	add hl, bc
+	pop bc
+	call UpdateOTPointer
+	dec d
+	jr nz, .boxmon
+	pop bc
+
+.loopbox
+	inc c
+	ld a, c
+	cp NUM_BOXES
+	jr c, .box
+
+	; not found
+	call CloseSRAM
+	and a
+	ret
+
+
+CheckOwnMon: ; 0x4a7ba
+; Check if a Pokémon belongs to the player and is of a specific species.
+
+; inputs:
+; hl, pointer to PartyMonNSpecies
+; bc, pointer to PartyMonNOT
+; ScriptVar should contain the species we're looking for
+
+; outputs:
+; sets carry if monster matches species, ID, and OT name.
+
+	push bc
+	push hl
+	push de
+	ld d, b
+	ld e, c
+
+; check species
+	ld a, [ScriptVar] ; species we're looking for
+	ld b, [hl] ; species we have
+	cp b
+	jr nz, .notfound ; species doesn't match
+
+; check ID number
+	ld bc, MON_ID
+	add hl, bc ; now hl points to ID number
+	ld a, [PlayerID]
+	cp [hl]
+	jr nz, .notfound ; ID doesn't match
+	inc hl
+	ld a, [PlayerID + 1]
+	cp [hl]
+	jr nz, .notfound ; ID doesn't match
+
+; check OT
+; This only checks five characters, which is fine for the Japanese version,
+; but in the English version the player name is 7 characters, so this is wrong.
+
+	ld hl, PlayerName
+
+	rept 4
+	ld a, [de]
+	cp [hl]
+	jr nz, .notfound
+	cp "@"
+	jr z, .found ; reached end of string
+	inc hl
+	inc de
+	endr
+
+	ld a, [de]
+	cp [hl]
+	jr z, .found
+
+.notfound
+	pop de
+	pop hl
+	pop bc
+	and a
+	ret
+
+.found
+	pop de
+	pop hl
+	pop bc
+	scf
+	ret
+; 0x4a810
+
+BoxAddressTable1: ; 4a810
+	dba sBox1
+	dba sBox2
+	dba sBox3
+	dba sBox4
+	dba sBox5
+	dba sBox6
+	dba sBox7
+	dba sBox8
+	dba sBox9
+	dba sBox10
+	dba sBox11
+	dba sBox12
+	dba sBox13
+	dba sBox14
+; 4a83a
+
+UpdateOTPointer: ; 0x4a83a
+	push hl
+	ld hl, NAME_LENGTH
+	add hl, bc
+	ld b, h
+	ld c, l
+	pop hl
+	ret
+; 0x4a843
--- a/engine/sprite_anims.asm
+++ b/engine/sprite_anims.asm
@@ -16,9 +16,9 @@
 
 .Jumptable: ; 8d25b (23:525b)
 	dw .zero        ; town map
-	dw .one         ; bouncing mon icons
-	dw .two
-	dw .three
+	dw .one         ; bouncing mon icon
+	dw .two         ; bouncing mon icon, selected
+	dw .three       ; bouncing mon icon, menu open
 	dw .four
 	dw .five
 	dw .six         ; Game Freak logo
@@ -46,7 +46,7 @@
 	dw .twentyeight
 	dw .twentynine  ; intro suicune
 	dw .thirty      ; intro pichu wooper
-	dw .thirtyone
+	dw .thirtyone   ; celebi
 	dw .thirtytwo   ; intro unown
 	dw .thirtythree ; intro unown F with suicune leaping up
 	dw .thirtyfour  ; intro suicune facing away from us
@@ -65,7 +65,7 @@
 
 	ld hl, SPRITEANIMSTRUCT_XCOORD
 	add hl, bc
-	ld [hl], $10
+	ld [hl], 8 * 2
 
 	ld hl, SPRITEANIMSTRUCT_YOFFSET
 	add hl, bc
@@ -75,7 +75,7 @@
 .two: ; 8d2b9 (23:52b9)
 	ld hl, SPRITEANIMSTRUCT_XCOORD
 	add hl, bc
-	ld [hl], $18
+	ld [hl], 8 * 3
 
 	ld hl, SPRITEANIMSTRUCT_0C
 	add hl, bc
@@ -93,24 +93,24 @@
 	add hl, bc
 	ld a, d
 	and $10 ; bit 4
-	jr z, .asm_8d2df
+	jr z, .load_zero
 	ld a, e
 	and a
-	jr z, .asm_8d2e6
+	jr z, .load_minus_two
 	cp $1
-	jr z, .asm_8d2e2
-.asm_8d2df
+	jr z, .load_minus_one
+.load_zero
 	xor a
 	ld [hl], a
 	ret
 
-.asm_8d2e2
-	ld a, $ff
+.load_minus_one
+	ld a, -1
 	ld [hl], a
 	ret
 
-.asm_8d2e6
-	ld a, $fe
+.load_minus_two
+	ld a, -2
 	ld [hl], a
 	ret
 
@@ -120,17 +120,17 @@
 	ld hl, SPRITEANIMSTRUCT_INDEX
 	add hl, bc
 	cp [hl]
-	jr z, .asm_8d2fb
+	jr z, .three_offset_right
 
 	ld hl, SPRITEANIMSTRUCT_XCOORD
 	add hl, bc
-	ld [hl], $10
+	ld [hl], 8 * 2
 	ret
 
-.asm_8d2fb
+.three_offset_right
 	ld hl, SPRITEANIMSTRUCT_XCOORD
 	add hl, bc
-	ld [hl], $18
+	ld [hl], 8 * 3
 	ret
 
 .four: ; 8d302 (23:5302)
--- a/event/celebi.asm
+++ b/event/celebi.asm
@@ -76,7 +76,7 @@
 	lb bc, BANK(SpecialCelebiLeafGFX), 4
 	call Request2bpp
 	ld de, SpecialCelebiGFX
-	ld hl, VTiles1 tile $04
+	ld hl, VTiles0 tile $84
 	lb bc, BANK(SpecialCelebiGFX), $10
 	call Request2bpp
 	xor a
@@ -240,12 +240,12 @@
 	add $10
 	and $3f
 	cp $20
-	jr nc, .asm_49b48
+	jr nc, .negative
 	call .SineFunction
 	ld a, h
 	ret
 
-.asm_49b48
+.negative
 	and $1f
 	call .SineFunction
 	ld a, h
--- a/gbhw.asm
+++ b/gbhw.asm
@@ -105,8 +105,10 @@
 rOBP1       EQU $ff49 ; Object Palette 1 Data (R/W) - Non CGB Mode Only
 rWY         EQU $ff4a ; Window Y Position (R/W)
 rWX         EQU $ff4b ; Window X Position minus 7 (R/W)
+rLCDMODE    EQU $ff4c
 rKEY1       EQU $ff4d ; CGB Mode Only - Prepare Speed Switch
 rVBK        EQU $ff4f ; CGB Mode Only - VRAM Bank
+rBLCK       EQU $ff50
 rHDMA1      EQU $ff51 ; CGB Mode Only - New DMA Source, High
 rHDMA2      EQU $ff52 ; CGB Mode Only - New DMA Source, Low
 rHDMA3      EQU $ff53 ; CGB Mode Only - New DMA Destination, High
--- a/macros/sound.asm
+++ b/macros/sound.asm
@@ -29,13 +29,14 @@
 A# EQU 11
 B_ EQU 12
 
-
+	enum_start $d8
+	enum notetype_cmd
 octave: macro
-	db $d8 - (\1)
+	db notetype_cmd - (\1)
 	endm
 
 notetype: macro
-	db $d8
+	db notetype_cmd
 	db \1 ; note_length
 	if _NARG >= 2
 	db \2 ; intensity
@@ -42,188 +43,228 @@
 	endc
 	endm
 
+	enum forceoctave_cmd
 forceoctave: macro
-	db $d9
+	db forceoctave_cmd
 	db \1 ; octave
 	endm
 
+	enum tempo_cmd
 tempo: macro
-	db $da
+	db tempo_cmd
 	bigdw \1 ; tempo
 	endm
 
+	enum dutycycle_cmd
 dutycycle: macro
-	db $db
+	db dutycycle_cmd
 	db \1 ; duty_cycle
 	endm
 
+	enum intensity_cmd
 intensity: macro
-	db $dc
+	db intensity_cmd
 	db \1 ; intensity
 	endm
 
+	enum soundinput_cmd
 soundinput: macro
-	db $dd
+	db soundinput_cmd
 	db \1 ; input
 	endm
 
+	enum unknownmusic0xde_cmd
 unknownmusic0xde: macro
-	db $de
+	db unknownmusic0xde_cmd
 	db \1 ; unknown
 	endm
 
+	enum togglesfx_cmd
 togglesfx: macro
-	db $df
+	db togglesfx_cmd
 	endm
 
+	enum unknownmusic0xe0_cmd
 unknownmusic0xe0: macro
-	db $e0
+	db unknownmusic0xe0_cmd
 	db \1 ; unknown
-	db \2 ; unknown
+	; db \2 ; unknown
+	dn \2, \3 ; octave, pitch
 	endm
 
+	enum vibrato_cmd
 vibrato: macro
-	db $e1
+	db vibrato_cmd
 	db \1 ; delay
 	db \2 ; extent
 	endm
 
+	enum unknownmusic0xe2_cmd
 unknownmusic0xe2: macro
-	db $e2
+	db unknownmusic0xe2_cmd
 	db \1 ; unknown
 	endm
 
+	enum togglenoise_cmd
 togglenoise: macro
-	db $e3
+	db togglenoise_cmd
 	db \1 ; id
 	endm
 
+	enum panning_cmd
 panning: macro
-	db $e4
+	db panning_cmd
 	db \1 ; tracks
 	endm
 
+	enum volume_cmd
 volume: macro
-	db $e5
+	db volume_cmd
 	db \1 ; volume
 	endm
 
+	enum tone_cmd
 tone: macro
-	db $e6
+	db tone_cmd
 	bigdw \1 ; tone
 	endm
 
+	enum unknownmusic0xe7_cmd
 unknownmusic0xe7: macro
-	db $e7
+	db unknownmusic0xe7_cmd
 	db \1 ; unknown
 	endm
 
+	enum unknownmusic0xe8_cmd
 unknownmusic0xe8: macro
-	db $e8
+	db unknownmusic0xe8_cmd
 	db \1 ; unknown
 	endm
 
+	enum globaltempo_cmd
 globaltempo: macro
-	db $e9
+	db globaltempo_cmd
 	bigdw \1 ; value
 	endm
 
+	enum restartchannel_cmd
 restartchannel: macro
-	db $ea
+	db restartchannel_cmd
 	dw \1 ; address
 	endm
 
+	enum newsong_cmd
 newsong: macro
-	db $eb
+	db newsong_cmd
 	bigdw \1 ; id
 	endm
 
+	enum sfxpriorityon_cmd
 sfxpriorityon: macro
-	db $ec
+	db sfxpriorityon_cmd
 	endm
 
+	enum sfxpriorityoff_cmd
 sfxpriorityoff: macro
-	db $ed
+	db sfxpriorityoff_cmd
 	endm
 
+	enum unknownmusic0xee_cmd
 unknownmusic0xee: macro
-	db $ee
+	db unknownmusic0xee_cmd
 	dw \1 ; address
 	endm
 
+	enum stereopanning_cmd
 stereopanning: macro
-	db $ef
+	db stereopanning_cmd
 	db \1 ; tracks
 	endm
 
+	enum sfxtogglenoise_cmd
 sfxtogglenoise: macro
-	db $f0
+	db sfxtogglenoise_cmd
 	db \1 ; id
 	endm
 
+	enum music0xf1_cmd
 music0xf1: macro
-	db $f1
+	db music0xf1_cmd
 	endm
 
+	enum music0xf2_cmd
 music0xf2: macro
-	db $f2
+	db music0xf2_cmd
 	endm
 
+	enum music0xf3_cmd
 music0xf3: macro
-	db $f3
+	db music0xf3_cmd
 	endm
 
+	enum music0xf4_cmd
 music0xf4: macro
-	db $f4
+	db music0xf4_cmd
 	endm
 
+	enum music0xf5_cmd
 music0xf5: macro
-	db $f5
+	db music0xf5_cmd
 	endm
 
+	enum music0xf6_cmd
 music0xf6: macro
-	db $f6
+	db music0xf6_cmd
 	endm
 
+	enum music0xf7_cmd
 music0xf7: macro
-	db $f7
+	db music0xf7_cmd
 	endm
 
+	enum music0xf8_cmd
 music0xf8: macro
-	db $f8
+	db music0xf8_cmd
 	endm
 
+	enum unknownmusic0xf9_cmd
 unknownmusic0xf9: macro
-	db $f9
+	db unknownmusic0xf9_cmd
 	endm
 
+	enum setcondition_cmd
 setcondition: macro
-	db $fa
+	db setcondition_cmd
 	db \1 ; condition
 	endm
 
+	enum jumpif_cmd
 jumpif: macro
-	db $fb
+	db jumpif_cmd
 	db \1 ; condition
 	dw \2 ; address
 	endm
 
+	enum jumpchannel_cmd
 jumpchannel: macro
-	db $fc
+	db jumpchannel_cmd
 	dw \1 ; address
 	endm
 
+	enum loopchannel_cmd
 loopchannel: macro
-	db $fd
+	db loopchannel_cmd
 	db \1 ; count
 	dw \2 ; address
 	endm
 
+	enum callchannel_cmd
 callchannel: macro
-	db $fe
+	db callchannel_cmd
 	dw \1 ; address
 	endm
 
+	enum endchannel_cmd
 endchannel: macro
-	db $ff
+	db endchannel_cmd
 	endm
--- a/main.asm
+++ b/main.asm
@@ -12578,237 +12578,8 @@
 
 INCLUDE "event/move_deleter.asm"
 
+INCLUDE "engine/mysterygift2.asm"
 
-Function2c642: ; 2c642 (b:4642)
-	ld de, OverworldMap
-	ld a, $1
-	ld [de], a
-	inc de
-	ld a, BANK(sGameData)
-	call GetSRAMBank
-	ld hl, sPlayerData + PlayerID - wPlayerData
-	ld a, [hli]
-	ld [de], a
-	ld b, a
-	inc de
-	ld a, [hl]
-	ld [de], a
-	ld c, a
-	inc de
-	push bc
-	ld hl, sPlayerData + PlayerName - wPlayerData
-	ld bc, NAME_LENGTH
-	call CopyBytes
-	push de
-	ld hl, sPokemonData + PokedexCaught - wPokemonData
-	ld b, (NUM_POKEMON + 7) / 8
-	call CountSetBits
-	pop de
-	pop bc
-	ld a, [wd265]
-	ld [de], a
-	inc de
-	call CloseSRAM
-	call Random
-	and $1
-	ld [de], a
-	inc de
-	call Function2c6ac
-	ld [de], a
-	inc de
-	ld a, c
-	ld c, b
-	ld b, a
-	call Function2c6ac
-	ld [de], a
-	inc de
-	ld a, BANK(sBackupMysteryGiftItem)
-	call GetSRAMBank
-	ld a, [sBackupMysteryGiftItem]
-	ld [de], a
-	inc de
-	ld a, [sBackupMysteryGiftItem + 1]
-	ld [de], a
-	ld a, $14
-	ld [wca00], a
-	call CloseSRAM
-	ld hl, OverworldMap
-	ld de, wc950
-	ld bc, SCREEN_WIDTH
-	jp CopyBytes
-
-Function2c6ac: ; 2c6ac (b:46ac)
-	push de
-	call Random
-	cp $19 ; 10 percent
-	jr c, .tenpercent
-	call Random
-	and $7
-	ld d, a
-	rl d
-	ld e, $80
-.loop
-	rlc e
-	dec a
-	jr nz, .loop
-	ld a, e
-	and c
-	jr z, .skip
-	ld a, $1
-.skip
-	add d
-	jr .done
-
-.tenpercent
-	call Random
-	cp $32 ; 20 percent
-	jr c, .twopercent
-	call Random
-	and $3
-	ld d, a
-	rl d
-	ld e, $80
-.loop2
-	rlc e
-	dec a
-	jr nz, .loop2
-	ld a, e
-	and b
-	jr z, .skip2
-	ld a, $1
-.skip2
-	add d
-	add $10
-	jr .done
-
-.twopercent
-	call Random
-	cp $32 ; 50 ; 20 percent
-	jr c, .pointfourpercent
-	ld a, b
-	swap a
-	and $7
-	add $18
-	jr .done
-
-.pointfourpercent
-	ld a, b
-	and $80
-	ld a, $20
-	jr z, .done
-	ld a, $21
-
-.done
-	pop de
-	ret
-
-MysteryGiftGetItemHeldEffect: ; 2c708 (b:4708)
-	ld a, c
-	cp $25 ; 37
-	jr nc, Function2c722
-	ld hl, Unknown_2c725
-	ld b, 0
-	add hl, bc
-	ld c, [hl]
-	ret
-
-MysteryGiftGetDecoration: ; 2c715 (b:4715)
-	ld a, c
-	cp $25 ; 37
-	jr nc, Function2c722
-	ld hl, Unknown_2c74a
-	ld b, 0
-	add hl, bc
-	ld c, [hl]
-	ret
-
-Function2c722: ; 2c722 (b:4722)
-	ld c, DECO_POLKADOT_BED ; GREAT_BALL
-	ret
-; 2c725 (b:4725)
-
-Unknown_2c725: ; 2c725
-; May or may not be items.
-	db BERRY
-	db PRZCUREBERRY
-	db MINT_BERRY
-	db ICE_BERRY
-	db BURNT_BERRY
-	db PSNCUREBERRY
-	db GUARD_SPEC
-	db X_DEFEND
-	db X_ATTACK
-	db BITTER_BERRY
-	db DIRE_HIT
-	db X_SPECIAL
-	db X_ACCURACY
-	db EON_MAIL
-	db MORPH_MAIL
-	db MUSIC_MAIL
-	db MIRACLEBERRY
-	db GOLD_BERRY
-	db REVIVE
-	db GREAT_BALL
-	db SUPER_REPEL
-	db MAX_REPEL
-	db ELIXER
-	db ETHER
-	db WATER_STONE
-	db FIRE_STONE
-	db LEAF_STONE
-	db THUNDERSTONE
-	db MAX_ETHER
-	db MAX_ELIXER
-	db MAX_REVIVE
-	db SCOPE_LENS
-	db HP_UP
-	db PP_UP
-	db RARE_CANDY
-	db BLUESKY_MAIL
-	db MIRAGE_MAIL
-; 2c74a
-
-Unknown_2c74a: ; 2c74a
-; May or may not be items.
-	db DECO_SNES
-	db DECO_BIG_SNORLAX_DOLL
-	db DECO_BIG_ONIX_DOLL
-	db DECO_BIG_LAPRAS_DOLL
-	db DECO_DOLLS
-	db DECO_PIKACHU_DOLL
-	db DECO_SURF_PIKACHU_DOLL
-	db DECO_CLEFAIRY_DOLL
-	db DECO_JIGGLYPUFF_DOLL
-	db DECO_BULBASAUR_DOLL
-	db DECO_TROPICPLANT
-	db DECO_JUMBOPLANT
-	db DECO_TOWN_MAP
-	db DECO_CHARMANDER_DOLL
-	db DECO_POLIWAG_DOLL
-	db DECO_DIGLETT_DOLL
-	db DECO_BLUE_CARPET
-	db DECO_YELLOW_CARPET
-	db DECO_POSTERS
-	db DECO_PIKACHU_POSTER
-	db DECO_N64
-	db DECO_BIG_DOLLS
-	db DECO_BEDS
-	db DECO_FEATHERY_BED
-	db DECO_POLKADOT_BED
-	db DECO_PIKACHU_BED
-	db DECO_CARPETS
-	db DECO_RED_CARPET
-	db DECO_GREEN_CARPET
-	db DECO_CLEFAIRY_POSTER
-	db DECO_ODDISH_DOLL
-	db DECO_MAGNAPLANT
-	db DECO_GENGAR_DOLL
-	db DECO_CONSOLES
-	db DECO_PINK_BED
-	db DECO_SQUIRTLE_DOLL
-	db DECO_STARMIE_DOLL
-; 2c76f
-
 Function2c76f: ; 2c76f (b:476f)
 	ld a, $1
 	ld [hInMenu], a
@@ -15136,1224 +14907,9 @@
 
 INCLUDE "event/celebi.asm"
 INCLUDE "engine/main_menu.asm"
-
-SpecialBeastsCheck: ; 0x4a6e8
-; Check if the player owns all three legendary beasts.
-; They must exist in either party or PC, and have the player's OT and ID.
-; Return the result in ScriptVar.
-
-	ld a, RAIKOU
-	ld [ScriptVar], a
-	call CheckOwnMonAnywhere
-	jr nc, .notexist
-
-	ld a, ENTEI
-	ld [ScriptVar], a
-	call CheckOwnMonAnywhere
-	jr nc, .notexist
-
-	ld a, SUICUNE
-	ld [ScriptVar], a
-	call CheckOwnMonAnywhere
-	jr nc, .notexist
-
-	; they exist
-	ld a, 1
-	ld [ScriptVar], a
-	ret
-
-.notexist
-	xor a
-	ld [ScriptVar], a
-	ret
-
-
-SpecialMonCheck: ; 0x4a711
-; Check if the player owns any monsters of the species in ScriptVar.
-; Return the result in ScriptVar.
-
-	call CheckOwnMonAnywhere
-	jr c, .exists
-
-	; doesn't exist
-	xor a
-	ld [ScriptVar], a
-	ret
-
-.exists
-	ld a, 1
-	ld [ScriptVar], a
-	ret
-
-
-CheckOwnMonAnywhere: ; 0x4a721
-; Check if the player owns any monsters of the species in ScriptVar.
-; It must exist in either party or PC, and have the player's OT and ID.
-
-	; If there are no monsters in the party,
-	; the player must not own any yet.
-	ld a, [PartyCount]
-	and a
-	ret z
-
-	ld d, a
-	ld e, 0
-	ld hl, PartyMon1Species
-	ld bc, PartyMonOT
-
-	; Run CheckOwnMon on each Pokémon in the party.
-.partymon
-	call CheckOwnMon
-	ret c ; found!
-
-	push bc
-	ld bc, PARTYMON_STRUCT_LENGTH
-	add hl, bc
-	pop bc
-	call UpdateOTPointer
-	dec d
-	jr nz, .partymon
-
-	; Run CheckOwnMon on each Pokémon in the PC.
-	ld a, BANK(sBoxCount)
-	call GetSRAMBank
-	ld a, [sBoxCount]
-	and a
-	jr z, .boxes
-
-	ld d, a
-	ld hl, sBoxMon1Species
-	ld bc, sBoxMonOT
-.openboxmon
-	call CheckOwnMon
-	jr nc, .loop
-
-	; found!
-	call CloseSRAM
-	ret
-
-.loop
-	push bc
-	ld bc, BOXMON_STRUCT_LENGTH
-	add hl, bc
-	pop bc
-	call UpdateOTPointer
-	dec d
-	jr nz, .openboxmon
-
-	; Run CheckOwnMon on each monster in the other 13 PC boxes.
-.boxes
-	call CloseSRAM
-
-	ld c, 0
-.box
-	; Don't search the current box again.
-	ld a, [wCurBox]
-	and $f
-	cp c
-	jr z, .loopbox
-
-	; Load the box.
-	ld hl, BoxAddressTable1
-	ld b, 0
-rept 3
-	add hl, bc
-endr
-	ld a, [hli]
-	call GetSRAMBank
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-
-	; Number of monsters in the box
-	ld a, [hl]
-	and a
-	jr z, .loopbox
-
-	push bc
-
-	push hl
-	ld de, sBoxMons - sBoxCount
-	add hl, de
-	ld d, h
-	ld e, l
-	pop hl
-	push de
-	ld de, sBoxMonOT - sBoxCount
-	add hl, de
-	ld b, h
-	ld c, l
-	pop hl
-
-	ld d, a
-
-.boxmon
-	call CheckOwnMon
-	jr nc, .loopboxmon
-
-	; found!
-	pop bc
-	call CloseSRAM
-	ret
-
-.loopboxmon
-	push bc
-	ld bc, BOXMON_STRUCT_LENGTH
-	add hl, bc
-	pop bc
-	call UpdateOTPointer
-	dec d
-	jr nz, .boxmon
-	pop bc
-
-.loopbox
-	inc c
-	ld a, c
-	cp NUM_BOXES
-	jr c, .box
-
-	; not found
-	call CloseSRAM
-	and a
-	ret
-
-
-CheckOwnMon: ; 0x4a7ba
-; Check if a Pokémon belongs to the player and is of a specific species.
-
-; inputs:
-; hl, pointer to PartyMonNSpecies
-; bc, pointer to PartyMonNOT
-; ScriptVar should contain the species we're looking for
-
-; outputs:
-; sets carry if monster matches species, ID, and OT name.
-
-	push bc
-	push hl
-	push de
-	ld d, b
-	ld e, c
-
-; check species
-	ld a, [ScriptVar] ; species we're looking for
-	ld b, [hl] ; species we have
-	cp b
-	jr nz, .notfound ; species doesn't match
-
-; check ID number
-	ld bc, MON_ID
-	add hl, bc ; now hl points to ID number
-	ld a, [PlayerID]
-	cp [hl]
-	jr nz, .notfound ; ID doesn't match
-	inc hl
-	ld a, [PlayerID + 1]
-	cp [hl]
-	jr nz, .notfound ; ID doesn't match
-
-; check OT
-; This only checks five characters, which is fine for the Japanese version,
-; but in the English version the player name is 7 characters, so this is wrong.
-
-	ld hl, PlayerName
-
-	rept 4
-	ld a, [de]
-	cp [hl]
-	jr nz, .notfound
-	cp "@"
-	jr z, .found ; reached end of string
-	inc hl
-	inc de
-	endr
-
-	ld a, [de]
-	cp [hl]
-	jr z, .found
-
-.notfound
-	pop de
-	pop hl
-	pop bc
-	and a
-	ret
-
-.found
-	pop de
-	pop hl
-	pop bc
-	scf
-	ret
-; 0x4a810
-
-BoxAddressTable1: ; 4a810
-	dba sBox1
-	dba sBox2
-	dba sBox3
-	dba sBox4
-	dba sBox5
-	dba sBox6
-	dba sBox7
-	dba sBox8
-	dba sBox9
-	dba sBox10
-	dba sBox11
-	dba sBox12
-	dba sBox13
-	dba sBox14
-; 4a83a
-
-UpdateOTPointer: ; 0x4a83a
-	push hl
-	ld hl, NAME_LENGTH
-	add hl, bc
-	ld b, h
-	ld c, l
-	pop hl
-	ret
-; 0x4a843
-
-
-MobileCheckOwnMonAnywhere: ; 4a843
-; Like CheckOwnMonAnywhere, but only check for species.
-; OT/ID don't matter.
-
-	ld a, [PartyCount]
-	and a
-	ret z
-
-	ld d, a
-	ld e, 0
-	ld hl, PartyMon1Species
-	ld bc, PartyMonOT
-.asm_4a851
-	call .CheckMatch
-	ret c
-	push bc
-	ld bc, PARTYMON_STRUCT_LENGTH
-	add hl, bc
-	pop bc
-	call .CopyName
-	dec d
-	jr nz, .asm_4a851
-	ld a, BANK(sBoxCount)
-	call GetSRAMBank
-	ld a, [sBoxCount]
-	and a
-	jr z, .asm_4a888
-	ld d, a
-	ld hl, sBoxMon1Species
-	ld bc, sBoxMonOT
-.asm_4a873
-	call .CheckMatch
-	jr nc, .asm_4a87c
-	call CloseSRAM
-	ret
-
-.asm_4a87c
-	push bc
-	ld bc, BOXMON_STRUCT_LENGTH
-	add hl, bc
-	pop bc
-	call .CopyName
-	dec d
-	jr nz, .asm_4a873
-
-.asm_4a888
-	call CloseSRAM
-	ld c, 0
-.asm_4a88d
-	ld a, [wCurBox]
-	and $f
-	cp c
-	jr z, .asm_4a8d1
-	ld hl, .BoxAddrs
-	ld b, 0
-rept 3
-	add hl, bc
-endr
-	ld a, [hli]
-	call GetSRAMBank
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld a, [hl]
-	and a
-	jr z, .asm_4a8d1
-	push bc
-	push hl
-	ld de, sBoxMons - sBoxCount
-	add hl, de
-	ld d, h
-	ld e, l
-	pop hl
-	push de
-	ld de, sBoxMonOT - sBoxCount
-	add hl, de
-	ld b, h
-	ld c, l
-	pop hl
-	ld d, a
-.asm_4a8ba
-	call .CheckMatch
-	jr nc, .asm_4a8c4
-	pop bc
-	call CloseSRAM
-	ret
-
-.asm_4a8c4
-	push bc
-	ld bc, BOXMON_STRUCT_LENGTH
-	add hl, bc
-	pop bc
-	call .CopyName
-	dec d
-	jr nz, .asm_4a8ba
-	pop bc
-
-.asm_4a8d1
-	inc c
-	ld a, c
-	cp NUM_BOXES
-	jr c, .asm_4a88d
-	call CloseSRAM
-	and a
-	ret
-; 4a8dc
-
-.CheckMatch: ; 4a8dc
-	push bc
-	push hl
-	push de
-	ld d, b
-	ld e, c
-	ld a, [ScriptVar]
-	ld b, [hl]
-	cp b
-	jr nz, .no_match
-	jr .match
-
-.no_match
-	pop de
-	pop hl
-	pop bc
-	and a
-	ret
-
-.match
-	pop de
-	pop hl
-	pop bc
-	scf
-	ret
-; 4a8f4
-
-.BoxAddrs: ; 4a8f4
-	dba sBox1
-	dba sBox2
-	dba sBox3
-	dba sBox4
-	dba sBox5
-	dba sBox6
-	dba sBox7
-	dba sBox8
-	dba sBox9
-	dba sBox10
-	dba sBox11
-	dba sBox12
-	dba sBox13
-	dba sBox14
-; 4a91e
-
-.CopyName: ; 4a91e
-	push hl
-	ld hl, NAME_LENGTH
-	add hl, bc
-	ld b, h
-	ld c, l
-	pop hl
-	ret
-; 4a927
-
-
-FindItemInPCOrBag: ; 4a927
-	ld a, [ScriptVar]
-	ld [CurItem], a
-	ld hl, PCItems
-	call CheckItem
-	jr c, .found
-
-	ld a, [ScriptVar]
-	ld [CurItem], a
-	ld hl, NumItems
-	call CheckItem
-	jr c, .found
-
-	xor a
-	ld [ScriptVar], a
-	ret
-
-.found
-	ld a, 1
-	ld [ScriptVar], a
-	ret
-; 4a94e
-
+INCLUDE "engine/search.asm"
+INCLUDE "misc/mobile_12_2.asm"
 ; mobile battle selection
-Function4a94e: ; 4a94e
-	call FadeToMenu
-	ld a, -1
-	ld hl, wd002
-	ld bc, 3
-	call ByteFill
-	xor a
-	ld [wd018], a
-	ld [wd019], a
-	ld b, SCGB_14
-	call GetSGBLayout
-	call SetPalettes
-	call Function4aa22
-	jr c, .asm_4a985
-	jr z, .asm_4a9a1
-	jr .asm_4a97b
-
-.asm_4a974
-	call Function4aa25
-	jr c, .asm_4a985
-	jr z, .asm_4a9a1
-
-.asm_4a97b
-	call Function4ac58
-	ld hl, wd019
-	res 1, [hl]
-	jr .asm_4a974
-
-.asm_4a985
-	ld a, [wd018]
-	and a
-	jr nz, .asm_4a990
-	call Function4aba8
-	jr c, .asm_4a974
-
-.asm_4a990
-	call CloseSubmenu
-	ld hl, wd002
-	ld a, -1
-	ld bc, 3
-	call ByteFill
-	scf
-	jr .asm_4a9af
-
-.asm_4a9a1
-	call Function4a9c3
-	jr c, .asm_4a9b0
-	call Function4a9d7
-	jr c, .asm_4a974
-	call CloseSubmenu
-	and a
-
-.asm_4a9af
-	ret
-
-.asm_4a9b0
-	ld de, SFX_WRONG
-	call PlaySFX
-	ld hl, UnknownText_0x4a9be
-	call PrintText
-	jr .asm_4a974
-; 4a9be
-
-UnknownText_0x4a9be: ; 0x4a9be
-	; Pick three #MON for battle.
-	text_jump UnknownText_0x1c51d7
-	db "@"
-; 0x4a9c3
-
-Function4a9c3: ; 4a9c3
-	ld hl, wd002
-	ld a, $ff
-	cp [hl]
-	jr z, .asm_4a9d5
-	inc hl
-	cp [hl]
-	jr z, .asm_4a9d5
-	inc hl
-	cp [hl]
-	jr z, .asm_4a9d5
-	and a
-	ret
-
-.asm_4a9d5
-	scf
-	ret
-; 4a9d7
-
-Function4a9d7: ; 4a9d7
-	ld a, [wd002]
-	ld hl, PartyMonNicknames
-	call GetNick
-	ld h, d
-	ld l, e
-	ld de, EndFlypoint
-	ld bc, 6
-	call CopyBytes
-	ld a, [wd003]
-	ld hl, PartyMonNicknames
-	call GetNick
-	ld h, d
-	ld l, e
-	ld de, wd00c
-	ld bc, 6
-	call CopyBytes
-	ld a, [wd004]
-	ld hl, PartyMonNicknames
-	call GetNick
-	ld h, d
-	ld l, e
-	ld de, wd012
-	ld bc, 6
-	call CopyBytes
-	ld hl, UnknownText_0x4aa1d
-	call PrintText
-	call YesNoBox
-	ret
-; 4aa1d
-
-UnknownText_0x4aa1d: ; 0x4aa1d
-	; , @  and @ . Use these three?
-	text_jump UnknownText_0x1c51f4
-	db "@"
-; 0x4aa22
-
-Function4aa22: ; 4aa22
-	call ClearBGPalettes
-
-Function4aa25: ; 4aa25
-	callba LoadPartyMenuGFX
-	callba InitPartyMenuWithCancel
-	call Function4aad3
-
-Function4aa34: ; 4aa34
-	ld a, $9
-	ld [PartyMenuActionText], a
-	callba WritePartyMenuTilemap
-	xor a
-	ld [PartyMenuActionText], a
-	callba PrintPartyMenuText
-	call Function4aab6
-	call WaitBGMap
-	call SetPalettes
-	call DelayFrame
-	call Function4ab1a
-	jr z, .asm_4aa66
-	push af
-	call Function4aafb
-	jr c, .asm_4aa67
-	call Function4ab06
-	jr c, .asm_4aa67
-	pop af
-
-.asm_4aa66
-	ret
-
-.asm_4aa67
-	ld hl, wd019
-	set 1, [hl]
-	pop af
-	ret
-; 4aa6e
-
-Function4aa6e: ; 4aa6e
-	pop af
-	ld de, SFX_WRONG
-	call PlaySFX
-	call WaitSFX
-	jr Function4aa34
-; 4aa7a
-
-Function4aa7a: ; 4aa7a
-	ld hl, wd002
-	ld d, $3
-.loop
-	ld e, PARTY_LENGTH
-	ld a, [hli]
-	push de
-	push hl
-	cp -1
-	jr z, .done
-	ld hl, wSpriteAnimationStructs
-	inc a
-	ld d, a
-.inner_loop
-	ld a, [hl]
-	and a
-	jr z, .next
-	cp d
-	jr z, .same_as_d
-	jr .next
-
-	ld a, $3
-	jr .proceed
-
-.same_as_d
-	ld a, $2
-
-.proceed
-	push hl
-	ld c, l
-	ld b, h
-	ld hl, $2
-	add hl, bc
-	ld [hl], a
-	pop hl
-
-.next
-	ld bc, $10
-	add hl, bc
-	dec e
-	jr nz, .inner_loop
-	pop hl
-	pop de
-	dec d
-	jr nz, .loop
-	jr .finished
-
-.done
-	pop hl
-	pop de
-
-.finished
-	ret
-; 4aab6
-
-Function4aab6: ; 4aab6
-	ld hl, wd002
-	ld d, $3
-.loop
-	ld a, [hli]
-	cp -1
-	jr z, .done
-	push de
-	push hl
-	hlcoord 0, 1
-	ld bc, $28
-	call AddNTimes
-	ld [hl], $ec
-	pop hl
-	pop de
-	dec d
-	jr nz, .loop
-
-.done
-	ret
-; 4aad3
-
-Function4aad3: ; 4aad3
-	ld hl, PartyCount
-	ld a, [hli]
-	and a
-	ret z ; Nothing in your party
-
-	ld c, a
-	xor a
-	ld [hObjectStructIndexBuffer], a
-.loop
-	push bc
-	push hl
-	ld e, 0
-	callba Function8e83f
-	ld a, [hObjectStructIndexBuffer]
-	inc a
-	ld [hObjectStructIndexBuffer], a
-	pop hl
-	pop bc
-	dec c
-	jr nz, .loop
-
-	call Function4aa7a
-	callba PlaySpriteAnimations
-	ret
-; 4aafb
-
-Function4aafb: ; 4aafb
-	ld a, [CurPartySpecies]
-	cp EGG
-	jr z, .egg
-	and a
-	ret
-
-.egg
-	scf
-	ret
-; 4ab06
-
-Function4ab06: ; 4ab06
-	ld a, [CurPartyMon]
-	ld bc, PARTYMON_STRUCT_LENGTH
-	ld hl, PartyMon1HP
-	call AddNTimes
-	ld a, [hli]
-	ld b, a
-	ld a, [hl]
-	or b
-	jr nz, .NotFainted
-	scf
-
-.NotFainted
-	ret
-; 4ab1a
-
-Function4ab1a: ; 4ab1a
-.asm_4ab1a
-	ld a, $fb
-	ld [wcfa8], a
-	ld a, $26
-	ld [wcfa7], a
-	ld a, $2
-	ld [wcfa4], a
-	call Function4adf7
-	call Function1bc9
-	call Function4abc3
-	jr c, .asm_4ab1a
-	push af
-	call Function4ab99
-	call nc, Function1bee
-	pop af
-	bit 1, a
-	jr nz, .asm_4ab6d
-	ld a, [PartyCount]
-	inc a
-	ld b, a
-	ld a, [MenuSelection2]
-	ld [wd0d8], a
-	cp b
-	jr z, .asm_4ab7e
-	ld a, [MenuSelection2]
-	dec a
-	ld [CurPartyMon], a
-	ld c, a
-	ld b, $0
-	ld hl, PartySpecies
-	add hl, bc
-	ld a, [hl]
-	ld [CurPartySpecies], a
-	ld de, SFX_READ_TEXT_2
-	call PlaySFX
-	call WaitSFX
-	ld a, $1
-	and a
-	ret
-
-.asm_4ab6d
-	ld a, [MenuSelection2]
-	ld [wd0d8], a
-.asm_4ab73
-	ld de, SFX_READ_TEXT_2
-	call PlaySFX
-	call WaitSFX
-	scf
-	ret
-
-.asm_4ab7e
-	ld a, $1
-	ld [wd018], a
-	ld a, [wcfaa]
-	cp $2
-	jr z, .asm_4ab73
-	ld de, SFX_READ_TEXT_2
-	call PlaySFX
-	call WaitSFX
-	xor a
-	ld [wd018], a
-	and a
-	ret
-; 4ab99
-
-Function4ab99: ; 4ab99
-	bit 1, a
-	jr z, .asm_4aba6
-	ld a, [wd002]
-	cp $ff
-	jr z, .asm_4aba6
-	scf
-	ret
-
-.asm_4aba6
-	and a
-	ret
-; 4aba8
-
-Function4aba8: ; 4aba8
-	ld hl, wd004
-	ld a, [hl]
-	cp $ff
-	jr nz, .asm_4abbe
-	dec hl
-	ld a, [hl]
-	cp $ff
-	jr nz, .asm_4abbe
-	dec hl
-	ld a, [hl]
-	cp $ff
-	jr nz, .asm_4abbe
-	and a
-	ret
-
-.asm_4abbe
-	ld a, $ff
-	ld [hl], a
-	scf
-	ret
-; 4abc3
-
-Function4abc3: ; 4abc3
-	bit 3, a
-	jr z, .asm_4abd5
-	ld a, [PartyCount]
-	inc a
-	ld [MenuSelection2], a
-	ld a, $1
-	ld [wcfaa], a
-	jr .asm_4ac29
-
-.asm_4abd5
-	bit 6, a
-	jr z, .asm_4abeb
-	ld a, [MenuSelection2]
-	ld [MenuSelection2], a
-	and a
-	jr nz, .asm_4ac29
-	ld a, [PartyCount]
-	inc a
-	ld [MenuSelection2], a
-	jr .asm_4ac29
-
-.asm_4abeb
-	bit 7, a
-	jr z, .asm_4ac08
-	ld a, [MenuSelection2]
-	ld [MenuSelection2], a
-	ld a, [PartyCount]
-rept 2
-	inc a
-endr
-	ld b, a
-	ld a, [MenuSelection2]
-	cp b
-	jr nz, .asm_4ac29
-	ld a, $1
-	ld [MenuSelection2], a
-	jr .asm_4ac29
-
-.asm_4ac08
-	bit 4, a
-	jr nz, .asm_4ac10
-	bit 5, a
-	jr z, .asm_4ac56
-
-.asm_4ac10
-	ld a, [MenuSelection2]
-	ld b, a
-	ld a, [PartyCount]
-	inc a
-	cp b
-	jr nz, .asm_4ac29
-	ld a, [wcfaa]
-	cp $1
-	jr z, .asm_4ac26
-	ld a, $1
-	jr .asm_4ac29
-
-.asm_4ac26
-	ld [wcfaa], a
-
-.asm_4ac29
-	hlcoord 0, 1
-	lb bc, 13, 1
-	call ClearBox
-	call Function4aab6
-	ld a, [PartyCount]
-	hlcoord 6, 1
-.asm_4ac3b
-	ld bc, $28
-	add hl, bc
-	dec a
-	jr nz, .asm_4ac3b
-	ld [hl], $7f
-	ld a, [MenuSelection2]
-	ld b, a
-	ld a, [PartyCount]
-	inc a
-	cp b
-	jr z, .asm_4ac54
-	ld a, $1
-	ld [wcfaa], a
-
-.asm_4ac54
-	scf
-	ret
-
-.asm_4ac56
-	and a
-	ret
-; 4ac58
-
-Function4ac58: ; 4ac58
-	lb bc, 2, 18
-	hlcoord 1, 15
-	call ClearBox
-	callba FreezeMonIcons
-	ld hl, MenuDataHeader_0x4aca2
-	call LoadMenuDataHeader
-	ld hl, wd019
-	bit 1, [hl]
-	jr z, .asm_4ac89
-	hlcoord 11, 13
-	ld b, $3
-	ld c, $7
-	call TextBox
-	hlcoord 13, 14
-	ld de, String_4ada7
-	call PlaceString
-	jr .asm_4ac96
-
-.asm_4ac89
-	hlcoord 11, 9
-	ld b, $7
-	ld c, $7
-	call TextBox
-	call Function4ad68
-
-.asm_4ac96
-	ld a, $1
-	ld [hBGMapMode], a
-	call Function4acaa
-	call ExitMenu
-	and a
-	ret
-; 4aca2
-
-MenuDataHeader_0x4aca2: ; 0x4aca2
-	db $40 ; flags
-	db 09, 11 ; start coords
-	db 17, 19 ; end coords
-	dw NULL
-	db 1 ; default option
-; 0x4acaa
-
-Function4acaa: ; 4acaa
-.asm_4acaa
-	ld a, $a0
-	ld [wMenuData2Flags], a
-	ld a, [wd019]
-	bit 1, a
-	jr z, .asm_4acc2
-	ld a, $2
-	ld [wMenuData2Items], a
-	ld a, $c
-	ld [wMenuBorderTopCoord], a
-	jr .asm_4accc
-
-.asm_4acc2
-	ld a, $4
-	ld [wMenuData2Items], a
-	ld a, $8
-	ld [wMenuBorderTopCoord], a
-
-.asm_4accc
-	ld a, $b
-	ld [wMenuBorderLeftCoord], a
-	ld a, $1
-	ld [wMenuCursorBuffer], a
-	call Function1c10
-	ld hl, wcfa5
-	set 6, [hl]
-	call Function1bc9
-	ld de, SFX_READ_TEXT_2
-	call PlaySFX
-	ld a, [hJoyPressed]
-	bit 0, a
-	jr nz, .asm_4acf4
-	bit 1, a
-	jr nz, .asm_4acf3
-	jr .asm_4acaa
-
-.asm_4acf3
-	ret
-
-.asm_4acf4
-	ld a, [wd019]
-	bit 1, a
-	jr nz, .asm_4ad0e
-	ld a, [MenuSelection2]
-	cp $1
-	jr z, Function4ad17
-	cp $2
-	jp z, Function4ad56
-	cp $3
-	jp z, Function4ad60
-	jr .asm_4acf3
-
-.asm_4ad0e
-	ld a, [MenuSelection2]
-	cp $1
-	jr z, Function4ad56
-	jr .asm_4acf3
-
-Function4ad17: ; 4ad17
-	call Function4adb2
-	jr z, .asm_4ad4a
-	ld hl, wd002
-	ld a, $ff
-	cp [hl]
-	jr z, .asm_4ad39
-	inc hl
-	cp [hl]
-	jr z, .asm_4ad39
-	inc hl
-	cp [hl]
-	jr z, .asm_4ad39
-	ld de, SFX_WRONG
-	call WaitPlaySFX
-	ld hl, UnknownText_0x4ad51
-	call PrintText
-	ret
-
-.asm_4ad39
-	ld a, [CurPartyMon]
-	ld [hl], a
-	call Function4a9c3
-	ret c
-	ld a, [wd019]
-	set 0, a
-	ld [wd019], a
-	ret
-
-.asm_4ad4a
-	ld a, $ff
-	ld [hl], a
-	call Function4adc2
-	ret
-
-UnknownText_0x4ad51: ; 0x4ad51
-	; Only three #MON may enter.
-	text_jump UnknownText_0x1c521c
-	db "@"
-; 0x4ad56
-
-Function4ad56: ; 4ad56
-	callba OpenPartyStats
-	call Function3200
-	ret
-; 4ad60
-
-Function4ad60: ; 4ad60
-	callba ManagePokemonMoves
-	ret
-; 4ad67
-
-Function4ad67: ; 4ad67
-	ret
-; 4ad68
-
-Function4ad68: ; 4ad68
-	hlcoord 13, 12
-	ld de, String_4ad88
-	call PlaceString
-	call Function4adb2
-	jr c, .asm_4ad7e
-	hlcoord 13, 10
-	ld de, String_4ada0
-	jr .asm_4ad84
-
-.asm_4ad7e
-	hlcoord 13, 10
-	ld de, String_4ad9a
-
-.asm_4ad84
-	call PlaceString
-	ret
-; 4ad88
-
-String_4ad88: ; 4ad88
-	db   "つよさをみる"
-	next "つかえるわざ"
-	next "もどる@"
-; 4ad9a
-
-String_4ad9a: ; 4ad9a
-	db   "さんかする@"
-; 4ada0
-
-String_4ada0: ; 4ada0
-	db   "さんかしない@"
-; 4ada7
-
-String_4ada7: ; 4ada7
-	db   "つよさをみる"
-	next "もどる@" ; BACK
-; 4adb2
-
-Function4adb2: ; 4adb2
-	ld hl, wd002
-	ld a, [CurPartyMon]
-	cp [hl]
-	ret z
-	inc hl
-	cp [hl]
-	ret z
-	inc hl
-	cp [hl]
-	ret z
-	scf
-	ret
-; 4adc2
-
-Function4adc2: ; 4adc2
-	ld a, [wd002]
-	cp $ff
-	jr nz, .skip
-	ld a, [wd003]
-	cp $ff
-	jr nz, .skip2
-	ld a, [wd004]
-	ld [wd002], a
-	ld a, $ff
-	ld [wd004], a
-	jr .skip
-
-.skip2
-	ld [wd002], a
-	ld a, $ff
-	ld [wd003], a
-
-.skip
-	ld a, [wd003]
-	cp $ff
-	ret nz
-	ld b, a
-	ld a, [wd004]
-	ld [wd003], a
-	ld a, b
-	ld [wd004], a
-	ret
-; 4adf7
-
-Function4adf7: ; 4adf7
-	ld a, [wd019]
-	bit 0, a
-	ret z
-	ld a, [PartyCount]
-	inc a
-	ld [MenuSelection2], a
-	ld a, $1
-	ld [wcfaa], a
-	ld a, [wd019]
-	res 0, a
-	ld [wd019], a
-	ret
-; 4ae12
 
 AskRememberPassword: ; 4ae12
 	call .DoMenu
--- a/maps/IlexForest.asm
+++ b/maps/IlexForest.asm
@@ -89,7 +89,7 @@
 	appear ILEXFOREST_BIRD
 	return
 
-YoungsterScript_0x6eb7b:
+IlexForestCharcoalApprenticeScript:
 	faceplayer
 	loadfont
 	checkevent EVENT_HERDED_FARFETCHD
@@ -347,16 +347,16 @@
 	checkcode VAR_FACING
 	end
 
-BlackBeltScript_0x6edae:
+IlexForestCharcoalMasterScript:
 	faceplayer
 	loadfont
 	checkevent EVENT_GOT_HM01_CUT
 	iftrue .AlreadyGotCut
-	writetext UnknownText_0x6f099
+	writetext Text_CharcoalMasterIntro
 	buttonsound
 	verbosegiveitem HM_CUT
 	setevent EVENT_GOT_HM01_CUT
-	writetext UnknownText_0x6f141
+	writetext Text_CharcoalMasterOutro
 	waitbutton
 	closetext
 	setevent EVENT_ILEX_FOREST_FARFETCHD
@@ -368,25 +368,25 @@
 	end
 
 .AlreadyGotCut:
-	writetext UnknownText_0x6f1c0
+	writetext Text_CharcoalMasterTalkAfter
 	waitbutton
 	closetext
 	end
 
-RockerScript_0x6edde:
+IlexForestHeadbuttGuyScript:
 	faceplayer
 	loadfont
 	checkevent EVENT_GOT_TM02_HEADBUTT
-	iftrue UnknownScript_0x6edf3
-	writetext UnknownText_0x6f21b
+	iftrue .AlreadyGotHeadbutt
+	writetext Text_HeadbuttIntro
 	buttonsound
 	verbosegiveitem TM_HEADBUTT
-	iffalse UnknownScript_0x6edf7
+	iffalse .BagFull
 	setevent EVENT_GOT_TM02_HEADBUTT
-UnknownScript_0x6edf3:
-	writetext UnknownText_0x6f26d
+.AlreadyGotHeadbutt:
+	writetext Text_HeadbuttOutro
 	waitbutton
-UnknownScript_0x6edf7:
+.BagFull:
 	closetext
 	end
 
@@ -396,13 +396,13 @@
 Bug_catcherWayneScript:
 	end_if_just_battled
 	loadfont
-	writetext UnknownText_0x6f571
+	writetext Bug_catcherWayneAfterText
 	waitbutton
 	closetext
 	end
 
-LassScript_0x6ee0d:
-	jumptextfaceplayer UnknownText_0x6f2af
+IlexForestLassScript:
+	jumptextfaceplayer Text_IlexForestLass
 
 ItemFragment_0x6ee10:
 	db REVIVE, 1
@@ -432,7 +432,7 @@
 	jumpstd strengthboulder
 
 MapIlexForestSignpost0Script:
-	jumptext UnknownText_0x6f2de
+	jumptext Text_IlexForestSignpost0
 
 MapIlexForestSignpost4Script:
 	checkevent EVENT_FOREST_IS_RESTLESS
@@ -443,11 +443,11 @@
 	checkitem GS_BALL
 	iftrue .AskCelebiEvent
 .DontDoCelebiEvent:
-	jumptext UnknownText_0x6f358
+	jumptext Text_IlexForestShrine
 
 .AskCelebiEvent:
 	loadfont
-	writetext UnknownText_0x6f394
+	writetext Text_ShrineCelebiEvent
 	yesorno
 	iftrue .CelebiEvent
 	closetext
@@ -459,7 +459,7 @@
 	setevent EVENT_AZALEA_TOWN_KURT
 	disappear ILEXFOREST_LASS
 	clearevent EVENT_ROUTE_34_ILEX_FOREST_GATE_LASS
-	writetext UnknownText_0x6f43b
+	writetext Text_InsertGSBall
 	waitbutton
 	closetext
 	pause 20
@@ -480,7 +480,7 @@
 	appear ILEXFOREST_KURT
 	applymovement ILEXFOREST_KURT, MovementData_0x6ef4e
 	loadfont
-	writetext UnknownText_0x6f452
+	writetext Text_KurtCaughtCelebi
 	waitbutton
 	closetext
 	applymovement ILEXFOREST_KURT, MovementData_0x6ef53
@@ -781,7 +781,7 @@
 	text "FARFETCH'D: Kwaa!"
 	done
 
-UnknownText_0x6f099:
+Text_CharcoalMasterIntro:
 	text "Ah! My FARFETCH'D!"
 
 	para "You found it for"
@@ -802,7 +802,7 @@
 	line "this."
 	done
 
-UnknownText_0x6f141:
+Text_CharcoalMasterOutro:
 	text "That's the CUT HM."
 	line "Teach that to a"
 
@@ -816,7 +816,7 @@
 	line "AZALEA to use it."
 	done
 
-UnknownText_0x6f1c0:
+Text_CharcoalMasterTalkAfter:
 	text "Do you want to"
 	line "apprentice as a"
 
@@ -827,7 +827,7 @@
 	line "rate in ten years!"
 	done
 
-UnknownText_0x6f21b:
+Text_HeadbuttIntro:
 	text "What am I doing?"
 
 	para "I'm shaking trees"
@@ -837,7 +837,7 @@
 	line "you try it too!"
 	done
 
-UnknownText_0x6f26d:
+Text_HeadbuttOutro:
 	text "Rattle trees with"
 	line "HEADBUTT. Some-"
 	cont "times, sleeping"
@@ -844,13 +844,13 @@
 	cont "#MON fall out."
 	done
 
-UnknownText_0x6f2af:
+Text_IlexForestLass:
 	text "Did something"
 	line "happen to the"
 	cont "forest's guardian?"
 	done
 
-UnknownText_0x6f2de:
+Text_IlexForestSignpost0:
 	text "ILEX FOREST is"
 	line "so overgrown with"
 
@@ -862,7 +862,7 @@
 	cont "have been dropped."
 	done
 
-UnknownText_0x6f358:
+Text_IlexForestShrine:
 	text "ILEX FOREST"
 	line "SHRINE…"
 
@@ -871,7 +871,7 @@
 	cont "protector…"
 	done
 
-UnknownText_0x6f394:
+Text_ShrineCelebiEvent:
 	text "ILEX FOREST"
 	line "SHRINE…"
 
@@ -891,12 +891,12 @@
 	line "BALL here?"
 	done
 
-UnknownText_0x6f43b:
+Text_InsertGSBall:
 	text "<PLAYER> put in the"
 	line "GS BALL."
 	done
 
-UnknownText_0x6f452:
+Text_KurtCaughtCelebi:
 	text "Whew, wasn't that"
 	line "something!"
 
@@ -929,7 +929,7 @@
 	line "#MON before…"
 	done
 
-UnknownText_0x6f571:
+Bug_catcherWayneAfterText:
 	text "A #MON I've"
 	line "never seen before"
 
@@ -966,12 +966,12 @@
 .PersonEvents:
 	db 11
 	person_event SPRITE_BIRD, 31, 14, SPRITEMOVEDATA_SPINRANDOM_SLOW, 0, 0, -1, -1, (1 << 3) | PAL_OW_BROWN, PERSONTYPE_SCRIPT, 0, IlexForestFarfetchdScript, EVENT_ILEX_FOREST_FARFETCHD
-	person_event SPRITE_YOUNGSTER, 28, 7, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, (1 << 3) | PAL_OW_GREEN, PERSONTYPE_SCRIPT, 0, YoungsterScript_0x6eb7b, EVENT_ILEX_FOREST_APPRENTICE
-	person_event SPRITE_BLACK_BELT, 28, 5, SPRITEMOVEDATA_STANDING_RIGHT, 0, 0, -1, -1, 0, PERSONTYPE_SCRIPT, 0, BlackBeltScript_0x6edae, EVENT_ILEX_FOREST_CHARCOAL_MASTER
-	person_event SPRITE_ROCKER, 14, 15, SPRITEMOVEDATA_STANDING_RIGHT, 0, 0, -1, -1, 0, PERSONTYPE_SCRIPT, 0, RockerScript_0x6edde, -1
+	person_event SPRITE_YOUNGSTER, 28, 7, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, (1 << 3) | PAL_OW_GREEN, PERSONTYPE_SCRIPT, 0, IlexForestCharcoalApprenticeScript, EVENT_ILEX_FOREST_APPRENTICE
+	person_event SPRITE_BLACK_BELT, 28, 5, SPRITEMOVEDATA_STANDING_RIGHT, 0, 0, -1, -1, 0, PERSONTYPE_SCRIPT, 0, IlexForestCharcoalMasterScript, EVENT_ILEX_FOREST_CHARCOAL_MASTER
+	person_event SPRITE_ROCKER, 14, 15, SPRITEMOVEDATA_STANDING_RIGHT, 0, 0, -1, -1, 0, PERSONTYPE_SCRIPT, 0, IlexForestHeadbuttGuyScript, -1
 	person_event SPRITE_POKE_BALL, 32, 20, SPRITEMOVEDATA_ITEM_TREE, 0, 0, -1, -1, 0, PERSONTYPE_ITEMFRAGMENT, 0, ItemFragment_0x6ee10, EVENT_ILEX_FOREST_REVIVE
 	person_event SPRITE_KURT, 29, 8, SPRITEMOVEDATA_STANDING_UP, 0, 0, -1, -1, 0, PERSONTYPE_SCRIPT, 0, ObjectEvent, EVENT_ILEX_FOREST_KURT
-	person_event SPRITE_LASS, 24, 3, SPRITEMOVEDATA_STANDING_RIGHT, 0, 0, -1, -1, (1 << 3) | PAL_OW_GREEN, PERSONTYPE_SCRIPT, 0, LassScript_0x6ee0d, EVENT_ILEX_FOREST_LASS
+	person_event SPRITE_LASS, 24, 3, SPRITEMOVEDATA_STANDING_RIGHT, 0, 0, -1, -1, (1 << 3) | PAL_OW_GREEN, PERSONTYPE_SCRIPT, 0, IlexForestLassScript, EVENT_ILEX_FOREST_LASS
 	person_event SPRITE_YOUNGSTER, 1, 12, SPRITEMOVEDATA_STANDING_UP, 0, 0, -1, -1, (1 << 3) | PAL_OW_GREEN, PERSONTYPE_TRAINER, 0, TrainerBug_catcherWayne, -1
 	person_event SPRITE_POKE_BALL, 17, 9, SPRITEMOVEDATA_ITEM_TREE, 0, 0, -1, -1, 0, PERSONTYPE_ITEMFRAGMENT, 0, ItemFragment_0x6ee12, EVENT_ILEX_FOREST_X_ATTACK
 	person_event SPRITE_POKE_BALL, 7, 17, SPRITEMOVEDATA_ITEM_TREE, 0, 0, -1, -1, 0, PERSONTYPE_ITEMFRAGMENT, 0, ItemFragment_0x6ee14, EVENT_ILEX_FOREST_ANTIDOTE
--- /dev/null
+++ b/misc/mobile_12_2.asm
@@ -1,0 +1,937 @@
+MobileCheckOwnMonAnywhere: ; 4a843
+; Like CheckOwnMonAnywhere, but only check for species.
+; OT/ID don't matter.
+
+	ld a, [PartyCount]
+	and a
+	ret z
+
+	ld d, a
+	ld e, 0
+	ld hl, PartyMon1Species
+	ld bc, PartyMonOT
+.asm_4a851
+	call .CheckMatch
+	ret c
+	push bc
+	ld bc, PARTYMON_STRUCT_LENGTH
+	add hl, bc
+	pop bc
+	call .CopyName
+	dec d
+	jr nz, .asm_4a851
+	ld a, BANK(sBoxCount)
+	call GetSRAMBank
+	ld a, [sBoxCount]
+	and a
+	jr z, .asm_4a888
+	ld d, a
+	ld hl, sBoxMon1Species
+	ld bc, sBoxMonOT
+.asm_4a873
+	call .CheckMatch
+	jr nc, .asm_4a87c
+	call CloseSRAM
+	ret
+
+.asm_4a87c
+	push bc
+	ld bc, BOXMON_STRUCT_LENGTH
+	add hl, bc
+	pop bc
+	call .CopyName
+	dec d
+	jr nz, .asm_4a873
+
+.asm_4a888
+	call CloseSRAM
+	ld c, 0
+.asm_4a88d
+	ld a, [wCurBox]
+	and $f
+	cp c
+	jr z, .asm_4a8d1
+	ld hl, .BoxAddrs
+	ld b, 0
+rept 3
+	add hl, bc
+endr
+	ld a, [hli]
+	call GetSRAMBank
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld a, [hl]
+	and a
+	jr z, .asm_4a8d1
+	push bc
+	push hl
+	ld de, sBoxMons - sBoxCount
+	add hl, de
+	ld d, h
+	ld e, l
+	pop hl
+	push de
+	ld de, sBoxMonOT - sBoxCount
+	add hl, de
+	ld b, h
+	ld c, l
+	pop hl
+	ld d, a
+.asm_4a8ba
+	call .CheckMatch
+	jr nc, .asm_4a8c4
+	pop bc
+	call CloseSRAM
+	ret
+
+.asm_4a8c4
+	push bc
+	ld bc, BOXMON_STRUCT_LENGTH
+	add hl, bc
+	pop bc
+	call .CopyName
+	dec d
+	jr nz, .asm_4a8ba
+	pop bc
+
+.asm_4a8d1
+	inc c
+	ld a, c
+	cp NUM_BOXES
+	jr c, .asm_4a88d
+	call CloseSRAM
+	and a
+	ret
+; 4a8dc
+
+.CheckMatch: ; 4a8dc
+	push bc
+	push hl
+	push de
+	ld d, b
+	ld e, c
+	ld a, [ScriptVar]
+	ld b, [hl]
+	cp b
+	jr nz, .no_match
+	jr .match
+
+.no_match
+	pop de
+	pop hl
+	pop bc
+	and a
+	ret
+
+.match
+	pop de
+	pop hl
+	pop bc
+	scf
+	ret
+; 4a8f4
+
+.BoxAddrs: ; 4a8f4
+	dba sBox1
+	dba sBox2
+	dba sBox3
+	dba sBox4
+	dba sBox5
+	dba sBox6
+	dba sBox7
+	dba sBox8
+	dba sBox9
+	dba sBox10
+	dba sBox11
+	dba sBox12
+	dba sBox13
+	dba sBox14
+; 4a91e
+
+.CopyName: ; 4a91e
+	push hl
+	ld hl, NAME_LENGTH
+	add hl, bc
+	ld b, h
+	ld c, l
+	pop hl
+	ret
+; 4a927
+
+FindItemInPCOrBag: ; 4a927
+	ld a, [ScriptVar]
+	ld [CurItem], a
+	ld hl, PCItems
+	call CheckItem
+	jr c, .found
+
+	ld a, [ScriptVar]
+	ld [CurItem], a
+	ld hl, NumItems
+	call CheckItem
+	jr c, .found
+
+	xor a
+	ld [ScriptVar], a
+	ret
+
+.found
+	ld a, 1
+	ld [ScriptVar], a
+	ret
+; 4a94e
+
+Function4a94e: ; 4a94e
+	call FadeToMenu
+	ld a, -1
+	ld hl, wd002
+	ld bc, 3
+	call ByteFill
+	xor a
+	ld [wd018], a
+	ld [wd019], a
+	ld b, SCGB_14
+	call GetSGBLayout
+	call SetPalettes
+	call Function4aa22
+	jr c, .asm_4a985
+	jr z, .asm_4a9a1
+	jr .asm_4a97b
+
+.asm_4a974
+	call Function4aa25
+	jr c, .asm_4a985
+	jr z, .asm_4a9a1
+
+.asm_4a97b
+	call Function4ac58
+	ld hl, wd019
+	res 1, [hl]
+	jr .asm_4a974
+
+.asm_4a985
+	ld a, [wd018]
+	and a
+	jr nz, .asm_4a990
+	call Function4aba8
+	jr c, .asm_4a974
+
+.asm_4a990
+	call CloseSubmenu
+	ld hl, wd002
+	ld a, -1
+	ld bc, 3
+	call ByteFill
+	scf
+	jr .asm_4a9af
+
+.asm_4a9a1
+	call Function4a9c3
+	jr c, .asm_4a9b0
+	call Function4a9d7
+	jr c, .asm_4a974
+	call CloseSubmenu
+	and a
+
+.asm_4a9af
+	ret
+
+.asm_4a9b0
+	ld de, SFX_WRONG
+	call PlaySFX
+	ld hl, UnknownText_0x4a9be
+	call PrintText
+	jr .asm_4a974
+; 4a9be
+
+UnknownText_0x4a9be: ; 0x4a9be
+	; Pick three #MON for battle.
+	text_jump UnknownText_0x1c51d7
+	db "@"
+; 0x4a9c3
+
+Function4a9c3: ; 4a9c3
+	ld hl, wd002
+	ld a, $ff
+	cp [hl]
+	jr z, .asm_4a9d5
+	inc hl
+	cp [hl]
+	jr z, .asm_4a9d5
+	inc hl
+	cp [hl]
+	jr z, .asm_4a9d5
+	and a
+	ret
+
+.asm_4a9d5
+	scf
+	ret
+; 4a9d7
+
+Function4a9d7: ; 4a9d7
+	ld a, [wd002]
+	ld hl, PartyMonNicknames
+	call GetNick
+	ld h, d
+	ld l, e
+	ld de, EndFlypoint
+	ld bc, 6
+	call CopyBytes
+	ld a, [wd003]
+	ld hl, PartyMonNicknames
+	call GetNick
+	ld h, d
+	ld l, e
+	ld de, wd00c
+	ld bc, 6
+	call CopyBytes
+	ld a, [wd004]
+	ld hl, PartyMonNicknames
+	call GetNick
+	ld h, d
+	ld l, e
+	ld de, wd012
+	ld bc, 6
+	call CopyBytes
+	ld hl, UnknownText_0x4aa1d
+	call PrintText
+	call YesNoBox
+	ret
+; 4aa1d
+
+UnknownText_0x4aa1d: ; 0x4aa1d
+	; , @  and @ . Use these three?
+	text_jump UnknownText_0x1c51f4
+	db "@"
+; 0x4aa22
+
+Function4aa22: ; 4aa22
+	call ClearBGPalettes
+
+Function4aa25: ; 4aa25
+	callba LoadPartyMenuGFX
+	callba InitPartyMenuWithCancel
+	call Function4aad3
+
+Function4aa34: ; 4aa34
+	ld a, $9
+	ld [PartyMenuActionText], a
+	callba WritePartyMenuTilemap
+	xor a
+	ld [PartyMenuActionText], a
+	callba PrintPartyMenuText
+	call Function4aab6
+	call WaitBGMap
+	call SetPalettes
+	call DelayFrame
+	call Function4ab1a
+	jr z, .asm_4aa66
+	push af
+	call Function4aafb
+	jr c, .asm_4aa67
+	call Function4ab06
+	jr c, .asm_4aa67
+	pop af
+
+.asm_4aa66
+	ret
+
+.asm_4aa67
+	ld hl, wd019
+	set 1, [hl]
+	pop af
+	ret
+; 4aa6e
+
+Function4aa6e: ; 4aa6e
+	pop af
+	ld de, SFX_WRONG
+	call PlaySFX
+	call WaitSFX
+	jr Function4aa34
+; 4aa7a
+
+Function4aa7a: ; 4aa7a
+	ld hl, wd002
+	ld d, $3
+.loop
+	ld e, PARTY_LENGTH
+	ld a, [hli]
+	push de
+	push hl
+	cp -1
+	jr z, .done
+	ld hl, wSpriteAnimationStructs
+	inc a
+	ld d, a
+.inner_loop
+	ld a, [hl]
+	and a
+	jr z, .next
+	cp d
+	jr z, .same_as_d
+	jr .next
+
+	ld a, $3
+	jr .proceed
+
+.same_as_d
+	ld a, $2
+
+.proceed
+	push hl
+	ld c, l
+	ld b, h
+	ld hl, $2
+	add hl, bc
+	ld [hl], a
+	pop hl
+
+.next
+	ld bc, $10
+	add hl, bc
+	dec e
+	jr nz, .inner_loop
+	pop hl
+	pop de
+	dec d
+	jr nz, .loop
+	jr .finished
+
+.done
+	pop hl
+	pop de
+
+.finished
+	ret
+; 4aab6
+
+Function4aab6: ; 4aab6
+	ld hl, wd002
+	ld d, $3
+.loop
+	ld a, [hli]
+	cp -1
+	jr z, .done
+	push de
+	push hl
+	hlcoord 0, 1
+	ld bc, $28
+	call AddNTimes
+	ld [hl], $ec
+	pop hl
+	pop de
+	dec d
+	jr nz, .loop
+
+.done
+	ret
+; 4aad3
+
+Function4aad3: ; 4aad3
+	ld hl, PartyCount
+	ld a, [hli]
+	and a
+	ret z ; Nothing in your party
+
+	ld c, a
+	xor a
+	ld [hObjectStructIndexBuffer], a
+.loop
+	push bc
+	push hl
+	ld e, 0
+	callba Function8e83f
+	ld a, [hObjectStructIndexBuffer]
+	inc a
+	ld [hObjectStructIndexBuffer], a
+	pop hl
+	pop bc
+	dec c
+	jr nz, .loop
+
+	call Function4aa7a
+	callba PlaySpriteAnimations
+	ret
+; 4aafb
+
+Function4aafb: ; 4aafb
+	ld a, [CurPartySpecies]
+	cp EGG
+	jr z, .egg
+	and a
+	ret
+
+.egg
+	scf
+	ret
+; 4ab06
+
+Function4ab06: ; 4ab06
+	ld a, [CurPartyMon]
+	ld bc, PARTYMON_STRUCT_LENGTH
+	ld hl, PartyMon1HP
+	call AddNTimes
+	ld a, [hli]
+	ld b, a
+	ld a, [hl]
+	or b
+	jr nz, .NotFainted
+	scf
+
+.NotFainted
+	ret
+; 4ab1a
+
+Function4ab1a: ; 4ab1a
+.asm_4ab1a
+	ld a, $fb
+	ld [wcfa8], a
+	ld a, $26
+	ld [wcfa7], a
+	ld a, $2
+	ld [wcfa4], a
+	call Function4adf7
+	call Function1bc9
+	call Function4abc3
+	jr c, .asm_4ab1a
+	push af
+	call Function4ab99
+	call nc, Function1bee
+	pop af
+	bit 1, a
+	jr nz, .asm_4ab6d
+	ld a, [PartyCount]
+	inc a
+	ld b, a
+	ld a, [MenuSelection2]
+	ld [wd0d8], a
+	cp b
+	jr z, .asm_4ab7e
+	ld a, [MenuSelection2]
+	dec a
+	ld [CurPartyMon], a
+	ld c, a
+	ld b, $0
+	ld hl, PartySpecies
+	add hl, bc
+	ld a, [hl]
+	ld [CurPartySpecies], a
+	ld de, SFX_READ_TEXT_2
+	call PlaySFX
+	call WaitSFX
+	ld a, $1
+	and a
+	ret
+
+.asm_4ab6d
+	ld a, [MenuSelection2]
+	ld [wd0d8], a
+.asm_4ab73
+	ld de, SFX_READ_TEXT_2
+	call PlaySFX
+	call WaitSFX
+	scf
+	ret
+
+.asm_4ab7e
+	ld a, $1
+	ld [wd018], a
+	ld a, [wcfaa]
+	cp $2
+	jr z, .asm_4ab73
+	ld de, SFX_READ_TEXT_2
+	call PlaySFX
+	call WaitSFX
+	xor a
+	ld [wd018], a
+	and a
+	ret
+; 4ab99
+
+Function4ab99: ; 4ab99
+	bit 1, a
+	jr z, .asm_4aba6
+	ld a, [wd002]
+	cp $ff
+	jr z, .asm_4aba6
+	scf
+	ret
+
+.asm_4aba6
+	and a
+	ret
+; 4aba8
+
+Function4aba8: ; 4aba8
+	ld hl, wd004
+	ld a, [hl]
+	cp $ff
+	jr nz, .asm_4abbe
+	dec hl
+	ld a, [hl]
+	cp $ff
+	jr nz, .asm_4abbe
+	dec hl
+	ld a, [hl]
+	cp $ff
+	jr nz, .asm_4abbe
+	and a
+	ret
+
+.asm_4abbe
+	ld a, $ff
+	ld [hl], a
+	scf
+	ret
+; 4abc3
+
+Function4abc3: ; 4abc3
+	bit 3, a
+	jr z, .asm_4abd5
+	ld a, [PartyCount]
+	inc a
+	ld [MenuSelection2], a
+	ld a, $1
+	ld [wcfaa], a
+	jr .asm_4ac29
+
+.asm_4abd5
+	bit 6, a
+	jr z, .asm_4abeb
+	ld a, [MenuSelection2]
+	ld [MenuSelection2], a
+	and a
+	jr nz, .asm_4ac29
+	ld a, [PartyCount]
+	inc a
+	ld [MenuSelection2], a
+	jr .asm_4ac29
+
+.asm_4abeb
+	bit 7, a
+	jr z, .asm_4ac08
+	ld a, [MenuSelection2]
+	ld [MenuSelection2], a
+	ld a, [PartyCount]
+rept 2
+	inc a
+endr
+	ld b, a
+	ld a, [MenuSelection2]
+	cp b
+	jr nz, .asm_4ac29
+	ld a, $1
+	ld [MenuSelection2], a
+	jr .asm_4ac29
+
+.asm_4ac08
+	bit 4, a
+	jr nz, .asm_4ac10
+	bit 5, a
+	jr z, .asm_4ac56
+
+.asm_4ac10
+	ld a, [MenuSelection2]
+	ld b, a
+	ld a, [PartyCount]
+	inc a
+	cp b
+	jr nz, .asm_4ac29
+	ld a, [wcfaa]
+	cp $1
+	jr z, .asm_4ac26
+	ld a, $1
+	jr .asm_4ac29
+
+.asm_4ac26
+	ld [wcfaa], a
+
+.asm_4ac29
+	hlcoord 0, 1
+	lb bc, 13, 1
+	call ClearBox
+	call Function4aab6
+	ld a, [PartyCount]
+	hlcoord 6, 1
+.asm_4ac3b
+	ld bc, $28
+	add hl, bc
+	dec a
+	jr nz, .asm_4ac3b
+	ld [hl], $7f
+	ld a, [MenuSelection2]
+	ld b, a
+	ld a, [PartyCount]
+	inc a
+	cp b
+	jr z, .asm_4ac54
+	ld a, $1
+	ld [wcfaa], a
+
+.asm_4ac54
+	scf
+	ret
+
+.asm_4ac56
+	and a
+	ret
+; 4ac58
+
+Function4ac58: ; 4ac58
+	lb bc, 2, 18
+	hlcoord 1, 15
+	call ClearBox
+	callba FreezeMonIcons
+	ld hl, MenuDataHeader_0x4aca2
+	call LoadMenuDataHeader
+	ld hl, wd019
+	bit 1, [hl]
+	jr z, .asm_4ac89
+	hlcoord 11, 13
+	ld b, $3
+	ld c, $7
+	call TextBox
+	hlcoord 13, 14
+	ld de, String_4ada7
+	call PlaceString
+	jr .asm_4ac96
+
+.asm_4ac89
+	hlcoord 11, 9
+	ld b, $7
+	ld c, $7
+	call TextBox
+	call Function4ad68
+
+.asm_4ac96
+	ld a, $1
+	ld [hBGMapMode], a
+	call Function4acaa
+	call ExitMenu
+	and a
+	ret
+; 4aca2
+
+MenuDataHeader_0x4aca2: ; 0x4aca2
+	db $40 ; flags
+	db 09, 11 ; start coords
+	db 17, 19 ; end coords
+	dw NULL
+	db 1 ; default option
+; 0x4acaa
+
+Function4acaa: ; 4acaa
+.asm_4acaa
+	ld a, $a0
+	ld [wMenuData2Flags], a
+	ld a, [wd019]
+	bit 1, a
+	jr z, .asm_4acc2
+	ld a, $2
+	ld [wMenuData2Items], a
+	ld a, $c
+	ld [wMenuBorderTopCoord], a
+	jr .asm_4accc
+
+.asm_4acc2
+	ld a, $4
+	ld [wMenuData2Items], a
+	ld a, $8
+	ld [wMenuBorderTopCoord], a
+
+.asm_4accc
+	ld a, $b
+	ld [wMenuBorderLeftCoord], a
+	ld a, $1
+	ld [wMenuCursorBuffer], a
+	call Function1c10
+	ld hl, wcfa5
+	set 6, [hl]
+	call Function1bc9
+	ld de, SFX_READ_TEXT_2
+	call PlaySFX
+	ld a, [hJoyPressed]
+	bit 0, a
+	jr nz, .asm_4acf4
+	bit 1, a
+	jr nz, .asm_4acf3
+	jr .asm_4acaa
+
+.asm_4acf3
+	ret
+
+.asm_4acf4
+	ld a, [wd019]
+	bit 1, a
+	jr nz, .asm_4ad0e
+	ld a, [MenuSelection2]
+	cp $1
+	jr z, Function4ad17
+	cp $2
+	jp z, Function4ad56
+	cp $3
+	jp z, Function4ad60
+	jr .asm_4acf3
+
+.asm_4ad0e
+	ld a, [MenuSelection2]
+	cp $1
+	jr z, Function4ad56
+	jr .asm_4acf3
+
+Function4ad17: ; 4ad17
+	call Function4adb2
+	jr z, .asm_4ad4a
+	ld hl, wd002
+	ld a, $ff
+	cp [hl]
+	jr z, .asm_4ad39
+	inc hl
+	cp [hl]
+	jr z, .asm_4ad39
+	inc hl
+	cp [hl]
+	jr z, .asm_4ad39
+	ld de, SFX_WRONG
+	call WaitPlaySFX
+	ld hl, UnknownText_0x4ad51
+	call PrintText
+	ret
+
+.asm_4ad39
+	ld a, [CurPartyMon]
+	ld [hl], a
+	call Function4a9c3
+	ret c
+	ld a, [wd019]
+	set 0, a
+	ld [wd019], a
+	ret
+
+.asm_4ad4a
+	ld a, $ff
+	ld [hl], a
+	call Function4adc2
+	ret
+
+UnknownText_0x4ad51: ; 0x4ad51
+	; Only three #MON may enter.
+	text_jump UnknownText_0x1c521c
+	db "@"
+; 0x4ad56
+
+Function4ad56: ; 4ad56
+	callba OpenPartyStats
+	call Function3200
+	ret
+; 4ad60
+
+Function4ad60: ; 4ad60
+	callba ManagePokemonMoves
+	ret
+; 4ad67
+
+Function4ad67: ; 4ad67
+	ret
+; 4ad68
+
+Function4ad68: ; 4ad68
+	hlcoord 13, 12
+	ld de, String_4ad88
+	call PlaceString
+	call Function4adb2
+	jr c, .asm_4ad7e
+	hlcoord 13, 10
+	ld de, String_4ada0
+	jr .asm_4ad84
+
+.asm_4ad7e
+	hlcoord 13, 10
+	ld de, String_4ad9a
+
+.asm_4ad84
+	call PlaceString
+	ret
+; 4ad88
+
+String_4ad88: ; 4ad88
+	db   "つよさをみる"
+	next "つかえるわざ"
+	next "もどる@"
+; 4ad9a
+
+String_4ad9a: ; 4ad9a
+	db   "さんかする@"
+; 4ada0
+
+String_4ada0: ; 4ada0
+	db   "さんかしない@"
+; 4ada7
+
+String_4ada7: ; 4ada7
+	db   "つよさをみる"
+	next "もどる@" ; BACK
+; 4adb2
+
+Function4adb2: ; 4adb2
+	ld hl, wd002
+	ld a, [CurPartyMon]
+	cp [hl]
+	ret z
+	inc hl
+	cp [hl]
+	ret z
+	inc hl
+	cp [hl]
+	ret z
+	scf
+	ret
+; 4adc2
+
+Function4adc2: ; 4adc2
+	ld a, [wd002]
+	cp $ff
+	jr nz, .skip
+	ld a, [wd003]
+	cp $ff
+	jr nz, .skip2
+	ld a, [wd004]
+	ld [wd002], a
+	ld a, $ff
+	ld [wd004], a
+	jr .skip
+
+.skip2
+	ld [wd002], a
+	ld a, $ff
+	ld [wd003], a
+
+.skip
+	ld a, [wd003]
+	cp $ff
+	ret nz
+	ld b, a
+	ld a, [wd004]
+	ld [wd003], a
+	ld a, b
+	ld [wd004], a
+	ret
+; 4adf7
+
+Function4adf7: ; 4adf7
+	ld a, [wd019]
+	bit 0, a
+	ret z
+	ld a, [PartyCount]
+	inc a
+	ld [MenuSelection2], a
+	ld a, $1
+	ld [wcfaa], a
+	ld a, [wd019]
+	res 0, a
+	ld [wd019], a
+	ret
+; 4ae12
--- a/wram.asm
+++ b/wram.asm
@@ -104,28 +104,30 @@
 \1Octave::            db ; 7-0 (0 is highest)
 \1StartingOctave::    db ; raises existing octaves (to repeat phrases)
 \1NoteDuration::      db ; frames remaining for the current note
-                      ds 1 ; c117
+\1Field0x16::         ds 1 ; c117
                       ds 1 ; c118
 \1LoopCount::         db
 \1Tempo::             dw
 \1Tracks::            db ; hi:left lo:right
-                      ds 1 ; c11d
+\1Field0x1c::         ds 1 ; c11d
 \1VibratoDelayCount:: db ; initialized by \1VibratoDelay
 \1VibratoDelay::      db ; number of frames a note plays until vibrato starts
 \1VibratoExtent::     db
 \1VibratoRate::       db ; hi:frames for each alt lo:frames to the next alt
-                      ds 1 ; c122
-                      ds 1 ; c123
-                      ds 1 ; c124
-                      ds 1 ; c125
-                      ds 1 ; c126
+\1Field0x21::         ds 1 ; c122
+\1Field0x22::         ds 1 ; c123
+\1Field0x23::         ds 1 ; c124
+\1Field0x24::         ds 1 ; c125
+\1Field0x25::         ds 1 ; c126
                       ds 1 ; c127
 \1CryPitch::          dw
-                      ds 4
+\1Field0x29::         ds 1
+\1Field0x2a::         ds 2
+\1Field0x2c::         ds 1
 \1NoteLength::        db ; frames per 16th note
-                      ds 1 ; c12f
-                      ds 1 ; c130
-                      ds 1 ; c131
+\1Field0x2e::         ds 1 ; c12f
+\1Field0x2f::         ds 1 ; c130
+\1Field0x30::         ds 1 ; c131
                       ds 1 ; c132
 ENDM
 
@@ -1065,12 +1067,20 @@
 	ds OverworldMap - @
 
 wc800::	ds 1
+wMysteryGiftPlayerID::
 wc801:: ds 1
 wc802:: ds 1
+wMysteryGiftPlayerName::
 wc803:: ds 4
-wc807:: ds 9
-wc810:: ds 3
-wc813:: ds 5
+wc807:: ds 7
+wMysteryGiftPlayerDexCaught:: ds 1
+wc80f:: ds 1
+wc810:: ds 1
+wc811:: ds 1
+wMysteryGiftPlayerBackupItem::
+wc812:: ds 1
+wc813:: ds 1
+wc814:: ds 4
 wc818:: ds 8
 wc820:: ds 1
 wc821:: ds 15
@@ -1077,6 +1087,7 @@
 wc830:: ds 16
 wc840:: ds 16
 wMysteryGiftTrainerData:: ds (1 + 1 + NUM_MOVES) * PARTY_LENGTH + 2
+wMysteryGiftTrainerDataEnd::
 	ds wMysteryGiftTrainerData - @
 wc850:: ds 16
 wc860:: ds 16
@@ -1102,7 +1113,8 @@
 wc940:: ds 16
 wc950:: ds 16
 wc960:: ds 2
-wc962:: ds 14
+wc962:: ds 2
+wc964:: ds 12
 wc970:: ds 16
 wc980:: ds 16
 wc990:: ds 16