shithub: pokecrystal

Download patch

ref: 047effba941ca96bf0b3d16fc2ddef964e4f17d8
parent: 987ed1fafb2ed4920276089f8c93f1be3f31acac
author: PikalaxALT <[email protected]>
date: Sun Dec 20 07:54:08 EST 2015

Menu joy flags; started with link address space

--- a/battle/core.asm
+++ b/battle/core.asm
@@ -5694,7 +5694,7 @@
 
 .okay
 	ld a, b
-	ld [w2DMenuFlags4], a
+	ld [wMenuJoypadFilter], a
 	ld a, c
 	ld [w2DMenuFlags1], a
 	xor a
--- a/constants/pokemon_constants.asm
+++ b/constants/pokemon_constants.asm
@@ -291,6 +291,7 @@
 MON_SDF                  EQUS "(PartyMon1SpclDef - PartyMon1)"
 BOXMON_STRUCT_LENGTH     EQUS "(PartyMon1End - PartyMon1)"
 PARTYMON_STRUCT_LENGTH   EQUS "(PartyMon1StatsEnd - PartyMon1)"
+REDMON_STRUCT_LENGTH EQU 44
 
 const_value SET 1
 	const MONMENU_CUT        ; 1
--- a/engine/learn.asm
+++ b/engine/learn.asm
@@ -158,7 +158,7 @@
 	ld [wMenuCursorY], a
 	ld [wMenuCursorX], a
 	ld a, $3
-	ld [w2DMenuFlags4], a
+	ld [wMenuJoypadFilter], a
 	ld a, $20
 	ld [w2DMenuFlags1], a
 	xor a
--- a/engine/link.asm
+++ b/engine/link.asm
@@ -17,13 +17,13 @@
 	callba Function16d69a
 	call WaitBGMap2
 	hlcoord 3, 8
-	ld b, $2
-	ld c, $c
+	ld b, 2
+	ld c, 12
 	ld d, h
 	ld e, l
 	callba Function4d35b
 	hlcoord 4, 10
-	ld de, String28419
+	ld de, String_PleaseWait
 	call PlaceString
 	call Function28eff
 	call WaitBGMap2
@@ -33,11 +33,11 @@
 	ld [hl], $50
 	ld a, [wLinkMode]
 	cp LINK_TIMECAPSULE
-	jp nz, Function28177
+	jp nz, Gen2ToGen2LinkComms
 
-Function2805d: ; 2805d
-	call Function28426
-	call Function28499
+TimeCapsule: ; 2805d
+	call ClearLinkData
+	call Link_PrepPartyData_Gen1
 	call Function28434
 	xor a
 	ld [wPlayerLinkAction], a
@@ -76,9 +76,9 @@
 	call Function75f
 	ld a, $fe
 	ld [de], a
-	ld hl, OverworldMap
-	ld de, wd26b
-	ld bc, $1a8
+	ld hl, wLinkData
+	ld de, OTPlayerName
+	ld bc, 9 + NAME_LENGTH + 1 + PARTY_LENGTH + 1 + PARTY_LENGTH * REDMON_STRUCT_LENGTH + 2 * (PARTY_LENGTH * NAME_LENGTH) ; $1a8
 	call Function75f
 	ld a, $fe
 	ld [de], a
@@ -102,7 +102,7 @@
 	jp z, Function28b22
 	cp $7
 	jp nc, Function28b22
-	ld de, OverworldMap
+	ld de, wLinkData
 	ld bc, $1a2
 	call Function2879e
 	ld de, wPlayerTrademonSpecies
@@ -135,7 +135,7 @@
 	ld hl, wc90f
 	dec c
 	jr nz, .asm_280fe
-	ld hl, OverworldMap
+	ld hl, wLinkData
 	ld de, wd26b
 	ld bc, NAME_LENGTH
 	call CopyBytes
@@ -177,9 +177,9 @@
 	jp Function287e3
 ; 28177
 
-Function28177: ; 28177
-	call Function28426
-	call Function28595
+Gen2ToGen2LinkComms: ; 28177
+	call ClearLinkData
+	call Link_PrepPartyData_Gen2
 	call Function28434
 	call Function29dba
 	ld a, [ScriptVar]
@@ -187,8 +187,8 @@
 	jp z, Function283b2
 	ld a, [hLinkPlayerNumber]
 	cp $2
-	jr nz, .asm_281ae
-	ld c, $3
+	jr nz, .Player2
+	ld c, 3
 	call DelayFrames
 	xor a
 	ld [hSerialSend], a
@@ -204,10 +204,10 @@
 	ld a, $81
 	ld [rSC], a
 
-.asm_281ae
+.Player2
 	ld de, MUSIC_NONE
 	call PlayMusic
-	ld c, $3
+	ld c, 3
 	call DelayFrames
 	xor a
 	ld [rIF], a
@@ -219,7 +219,7 @@
 	call Function75f
 	ld a, $fe
 	ld [de], a
-	ld hl, OverworldMap
+	ld hl, wLinkData
 	ld de, wd26b
 	ld bc, $1c2
 	call Function75f
@@ -247,7 +247,7 @@
 	call Function287ab
 	ld hl, wd26b
 	call Function287ca
-	ld de, OverworldMap
+	ld de, wLinkData
 	ld bc, $1b9
 	call Function2879e
 	ld de, wPlayerTrademonSpecies
@@ -391,7 +391,7 @@
 	ld [de], a
 
 .asm_282fe
-	ld hl, OverworldMap
+	ld hl, wLinkData
 	ld de, wd26b
 	ld bc, NAME_LENGTH
 	call CopyBytes
@@ -470,13 +470,13 @@
 ; 283b2
 
 Function283b2: ; 283b2
-	ld de, UnknownText_0x283ed
+	ld de, .TooMuchTimeHasElapsed
 	ld b, $a
-.asm_283b7
+.loop
 	call DelayFrame
 	call LinkDataReceived
 	dec b
-	jr nz, .asm_283b7
+	jr nz, .loop
 	xor a
 	ld [hld], a
 	ld [hl], a
@@ -483,8 +483,8 @@
 	ld [hVBlank], a
 	push de
 	hlcoord 0, 12
-	ld b, $4
-	ld c, $12
+	ld b, 4
+	ld c, 18
 	push de
 	ld d, h
 	ld e, l
@@ -501,7 +501,7 @@
 	ret
 ; 283ed
 
-UnknownText_0x283ed: ; 0x283ed
+.TooMuchTimeHasElapsed: ; 0x283ed
 	; Too much time has elapsed. Please try again.
 	text_jump UnknownText_0x1c4183
 	db "@"
@@ -541,20 +541,20 @@
 	ret
 ; 28419
 
-String28419: ; 28419
+String_PleaseWait: ; 28419
 	db "PLEASE WAIT!@"
 ; 28426
 
-Function28426: ; 28426
-	ld hl, OverworldMap
-	lb bc, 5, SCREEN_WIDTH
-.asm_2842c
+ClearLinkData: ; 28426
+	ld hl, wLinkData
+	ld bc, wLinkDataEnd - wLinkData
+.loop
 	xor a
 	ld [hli], a
 	dec bc
 	ld a, b
 	or c
-	jr nz, .asm_2842c
+	jr nz, .loop
 	ret
 ; 28434
 
@@ -633,15 +633,15 @@
 	ret
 ; 28499
 
-Function28499: ; 28499
-	ld de, OverworldMap
+Link_PrepPartyData_Gen1: ; 28499
+	ld de, wLinkData
 	ld a, $fd
 	ld b, $6
-.asm_284a0
+.loop1
 	ld [de], a
 	inc de
 	dec b
-	jr nz, .asm_284a0
+	jr nz, .loop1
 	ld hl, PlayerName
 	ld bc, NAME_LENGTH
 	call CopyBytes
@@ -650,10 +650,10 @@
 	ld a, [hli]
 	ld [de], a
 	inc de
-.asm_284b5
+.loop2
 	ld a, [hli]
-	cp $ff
-	jr z, .asm_284ce
+	cp -1
+	jr z, .done_party
 	ld [wd265], a
 	push hl
 	push de
@@ -663,34 +663,34 @@
 	ld a, [wd265]
 	ld [de], a
 	inc de
-	jr .asm_284b5
+	jr .loop2
 
-.asm_284ce
+.done_party
 	ld [de], a
 	pop de
-	ld hl, $8
+	ld hl, 1 + PARTY_LENGTH + 1
 	add hl, de
 	ld d, h
 	ld e, l
 	ld hl, PartyMon1Species
-	ld c, $6
-.asm_284db
+	ld c, PARTY_LENGTH
+.mon_loop
 	push bc
-	call Function284f6
+	call .ConvertPartyStruct2to1
 	ld bc, PARTYMON_STRUCT_LENGTH
 	add hl, bc
 	pop bc
 	dec c
-	jr nz, .asm_284db
+	jr nz, .mon_loop
 	ld hl, PartyMonOT
-	call .asm_284f0
+	call .copy_ot_nicks
 	ld hl, PartyMonNicknames
-.asm_284f0
-	ld bc, $42
+.copy_ot_nicks
+	ld bc, PARTY_LENGTH * NAME_LENGTH
 	jp CopyBytes
 ; 284f6
 
-Function284f6: ; 284f6
+.ConvertPartyStruct2to1: ; 284f6
 	ld b, h
 	ld c, l
 	push de
@@ -703,7 +703,7 @@
 	ld a, [wd265]
 	ld [de], a
 	inc de
-	ld hl, $22
+	ld hl, MON_HP
 	add hl, bc
 	ld a, [hli]
 	ld [de], a
@@ -714,26 +714,26 @@
 	xor a
 	ld [de], a
 	inc de
-	ld hl, $20
+	ld hl, MON_STATUS
 	add hl, bc
 	ld a, [hl]
 	ld [de], a
 	inc de
 	ld a, [bc]
-	cp $51
-	jr z, .asm_28528
-	cp $52
-	jr nz, .asm_28530
+	cp MAGNEMITE
+	jr z, .steel_type
+	cp MAGNETON
+	jr nz, .skip_steel
 
-.asm_28528
-	ld a, $17
+.steel_type
+	ld a, ELECTRIC
 	ld [de], a
 	inc de
 	ld [de], a
 	inc de
-	jr .asm_28544
+	jr .done_steel
 
-.asm_28530
+.skip_steel
 	push bc
 	dec a
 	ld hl, BaseData + 7 ; type
@@ -744,15 +744,15 @@
 	call FarCopyBytes
 	pop bc
 
-.asm_28544
+.done_steel
 	push bc
-	ld hl, $1
+	ld hl, MON_ITEM
 	add hl, bc
-	ld bc, $1a
+	ld bc, MON_HAPPINESS - MON_ITEM
 	call CopyBytes
 	pop bc
 
-	ld hl, $1f
+	ld hl, MON_LEVEL
 	add hl, bc
 	ld a, [hl]
 	ld [de], a
@@ -760,9 +760,9 @@
 	inc de
 
 	push bc
-	ld hl, $24
+	ld hl, MON_MAXHP
 	add hl, bc
-	ld bc, 8
+	ld bc, MON_SAT - MON_MAXHP
 	call CopyBytes
 	pop bc
 
@@ -781,19 +781,19 @@
 	ld [BaseSpecialAttack], a
 	pop bc
 
-	ld hl, $a
+	ld hl, MON_EXP + 2
 	add hl, bc
-	ld c, $5
-	ld b, $1
+	ld c, STAT_SATK
+	ld b, TRUE
 	predef CalcPkmnStatC
 
 	pop bc
 	pop de
 
-	ld a, [$ffb5]
+	ld a, [hQuotient + 1]
 	ld [de], a
 	inc de
-	ld a, [$ffb6]
+	ld a, [hQuotient + 2]
 	ld [de], a
 	inc de
 	ld h, b
@@ -801,10 +801,10 @@
 	ret
 ; 28595
 
-Function28595: ; 28595
-	ld de, wc800
-	ld a, EGG
-	ld b, PARTY_LENGTH
+Link_PrepPartyData_Gen2: ; 28595
+	ld de, wLinkData
+	ld a, $fd
+	ld b, 6
 .loop1
 	ld [de], a
 	inc de
@@ -966,7 +966,7 @@
 	ld [hli], a
 	ld [hl], b
 	ld hl, OTPartyMon1Species
-	ld c, $6
+	ld c, PARTY_LENGTH
 .loop
 	push bc
 	call Function286ba
@@ -977,10 +977,10 @@
 	lb bc, 1, 8
 	add hl, bc
 	ld de, OTPartyMonOT
-	ld bc, $42
+	ld bc, PARTY_LENGTH * NAME_LENGTH
 	call CopyBytes
 	ld de, OTPartyMonNicknames
-	ld bc, $42
+	ld bc, PARTY_LENGTH * PKMN_NAME_LENGTH
 	jp CopyBytes
 ; 286ba
 
@@ -998,7 +998,7 @@
 	ld a, [wd265]
 	ld [bc], a
 	ld [CurSpecies], a
-	ld hl, $22
+	ld hl, MON_HP
 	add hl, bc
 	ld a, [de]
 	inc de
@@ -1069,27 +1069,27 @@
 	ld e, l
 	ld hl, $a
 	add hl, bc
-	ld c, $5
-	ld b, $1
+	ld c, STAT_SATK
+	ld b, TRUE
 	predef CalcPkmnStatC
 	pop bc
 	pop hl
-	ld a, [$ffb5]
+	ld a, [hQuotient + 1]
 	ld [hli], a
-	ld a, [$ffb6]
+	ld a, [hQuotient + 2]
 	ld [hli], a
 	push hl
 	push bc
 	ld hl, $a
 	add hl, bc
-	ld c, $6
-	ld b, $1
+	ld c, STAT_SDEF
+	ld b, TRUE
 	predef CalcPkmnStatC
 	pop bc
 	pop hl
-	ld a, [$ffb5]
+	ld a, [hQuotient + 1]
 	ld [hli], a
-	ld a, [$ffb6]
+	ld a, [hQuotient + 2]
 	ld [hli], a
 	push hl
 	ld hl, $1b
@@ -1150,16 +1150,16 @@
 ; 2879e
 
 Function2879e: ; 2879e
-.asm_2879e
+.loop
 	ld a, [hli]
 	cp $fe
-	jr z, .asm_2879e
+	jr z, .loop
 	ld [de], a
 	inc de
 	dec bc
 	ld a, b
 	or c
-	jr nz, .asm_2879e
+	jr nz, .loop
 	ret
 ; 287ab
 
@@ -1171,39 +1171,39 @@
 	call Function287d8
 	ld de, LinkBattleRNs
 	ld c, $a
-.asm_287bb
+.loop
 	ld a, [hli]
 	cp $fe
-	jr z, .asm_287bb
+	jr z, .loop
 	cp $fd
-	jr z, .asm_287bb
+	jr z, .loop
 	ld [de], a
 	inc de
 	dec c
-	jr nz, .asm_287bb
+	jr nz, .loop
 	ret
 ; 287ca
 
 Function287ca: ; 287ca
-.asm_287ca
+.loop
 	ld a, [hli]
 	and a
-	jr z, .asm_287ca
+	jr z, .loop
 	cp $fd
-	jr z, .asm_287ca
+	jr z, .loop
 	cp $fe
-	jr z, .asm_287ca
+	jr z, .loop
 	dec hl
 	ret
 ; 287d8
 
 Function287d8: ; 287d8
-.asm_287d8
+.loop
 	ld a, [hli]
 	cp $fd
-	jr z, .asm_287d8
+	jr z, .loop
 	cp $fe
-	jr z, .asm_287d8
+	jr z, .loop
 	dec hl
 	ret
 ; 287e3
@@ -1226,19 +1226,19 @@
 ; 28803
 
 Function28803: ; 28803
-	ld a, $1
+	ld a, OTPARTYMON
 	ld [MonType], a
-	ld a, $c1
-	ld [w2DMenuFlags4], a
+	ld a, A_BUTTON | D_UP | D_DOWN
+	ld [wMenuJoypadFilter], a
 	ld a, [OTPartyCount]
 	ld [w2DMenuNumRows], a
-	ld a, $1
+	ld a, 1
 	ld [w2DMenuNumCols], a
-	ld a, $9
+	ld a, 9
 	ld [w2DMenuCursorInitY], a
-	ld a, $6
+	ld a, 6
 	ld [w2DMenuCursorInitX], a
-	ld a, $1
+	ld a, 1
 	ld [wMenuCursorX], a
 	ld a, $10
 	ld [w2DMenuFlags3], a
@@ -1293,17 +1293,17 @@
 	callba Function49856
 	xor a
 	ld [MonType], a
-	ld a, $c1
-	ld [w2DMenuFlags4], a
+	ld a, A_BUTTON | D_UP | D_DOWN
+	ld [wMenuJoypadFilter], a
 	ld a, [PartyCount]
 	ld [w2DMenuNumRows], a
-	ld a, $1
+	ld a, 1
 	ld [w2DMenuNumCols], a
-	ld a, $1
+	ld a, 1
 	ld [w2DMenuCursorInitY], a
-	ld a, $6
+	ld a, 6
 	ld [w2DMenuCursorInitX], a
-	ld a, $1
+	ld a, 1
 	ld [wMenuCursorX], a
 	ld a, $10
 	ld [w2DMenuFlags3], a
@@ -1376,8 +1376,8 @@
 	ld a, [wMenuCursorY]
 	push af
 	hlcoord 0, 15
-	ld b, $1
-	ld c, $12
+	ld b, 1
+	ld c, 18
 	call Predef_LinkTextbox
 	hlcoord 2, 16
 	ld de, String28ab4
@@ -1385,19 +1385,19 @@
 	callba Function4d354
 
 .asm_28946
-	ld a, $7f
+	ld a, " "
 	ldcoord_a 11, 16
-	ld a, $13
-	ld [w2DMenuFlags4], a
-	ld a, $1
+	ld a, A_BUTTON | B_BUTTON | D_RIGHT
+	ld [wMenuJoypadFilter], a
+	ld a, 1
 	ld [w2DMenuNumRows], a
-	ld a, $1
+	ld a, 1
 	ld [w2DMenuNumCols], a
-	ld a, $10
+	ld a, 16
 	ld [w2DMenuCursorInitY], a
-	ld a, $1
+	ld a, 1
 	ld [w2DMenuCursorInitX], a
-	ld a, $1
+	ld a, 1
 	ld [wMenuCursorY], a
 	ld [wMenuCursorX], a
 	ld a, $20
@@ -1406,9 +1406,9 @@
 	ld [w2DMenuFlags1], a
 	ld [w2DMenuFlags2], a
 	call ScrollingMenuJoypad
-	bit 4, a
+	bit D_RIGHT_F, a
 	jr nz, .asm_2898d
-	bit 1, a
+	bit B_BUTTON_F, a
 	jr z, .asm_289cd
 .asm_28983
 	pop af
@@ -1417,19 +1417,19 @@
 	jp Function2888b
 
 .asm_2898d
-	ld a, $7f
+	ld a, " "
 	ldcoord_a 1, 16
-	ld a, $23
-	ld [w2DMenuFlags4], a
-	ld a, $1
+	ld a, A_BUTTON | B_BUTTON | D_LEFT
+	ld [wMenuJoypadFilter], a
+	ld a, 1
 	ld [w2DMenuNumRows], a
-	ld a, $1
+	ld a, 1
 	ld [w2DMenuNumCols], a
-	ld a, $10
+	ld a, 16
 	ld [w2DMenuCursorInitY], a
-	ld a, $b
+	ld a, 11
 	ld [w2DMenuCursorInitX], a
-	ld a, $1
+	ld a, 1
 	ld [wMenuCursorY], a
 	ld [wMenuCursorX], a
 	ld a, $20
@@ -1438,9 +1438,9 @@
 	ld [w2DMenuFlags1], a
 	ld [w2DMenuFlags2], a
 	call ScrollingMenuJoypad
-	bit 5, a
+	bit D_LEFT_F, a
 	jp nz, .asm_28946
-	bit 1, a
+	bit B_BUTTON_F, a
 	jr nz, .asm_28983
 	jr .asm_289fe
 
@@ -1485,8 +1485,8 @@
 	ld [wcf57], a
 	ld [wOtherPlayerLinkAction], a
 	hlcoord 0, 12
-	ld b, $4
-	ld c, $12
+	ld b, 4
+	ld c, 18
 	call Predef_LinkTextbox
 	callba Function4d354
 	ld hl, UnknownText_0x28aaf
@@ -1517,8 +1517,8 @@
 
 .asm_28a89
 	hlcoord 0, 12
-	ld b, $4
-	ld c, $12
+	ld b, 4
+	ld c, 18
 	call Predef_LinkTextbox
 	hlcoord 1, 14
 	ld de, String28ece
@@ -1526,7 +1526,7 @@
 	ld a, $1
 	ld [wPlayerLinkAction], a
 	callba Function16d6ce
-	ld c, $64
+	ld c, 100
 	call DelayFrames
 	jp Function287e3
 ; 28aaf
@@ -1557,38 +1557,38 @@
 	push bc
 	ld bc, NAME_LENGTH
 	add hl, bc
-	ld [hl], $7f
+	ld [hl], " "
 	pop bc
 	pop hl
 
 Function28ade: ; 28ade
-.asm_28ade
-	ld a, $ed
+.loop1
+	ld a, "▶"
 	ldcoord_a 9, 17
-.asm_28ae3
+.loop2
 	call JoyTextDelay
 	ld a, [hJoyLast]
 	and a
-	jr z, .asm_28ae3
-	bit 0, a
-	jr nz, .asm_28b0b
+	jr z, .loop2
+	bit A_BUTTON_F, a
+	jr nz, .a_button
 	push af
 	ld a, " "
 	ldcoord_a 9, 17
 	pop af
-	bit 6, a
-	jr z, .asm_28b03
+	bit D_UP_F, a
+	jr z, .d_up
 	ld a, [OTPartyCount]
 	ld [wMenuCursorY], a
 	jp Function28803
 
-.asm_28b03
+.d_up
 	ld a, $1
 	ld [wMenuCursorY], a
 	jp Function2888b
 
-.asm_28b0b
-	ld a, $ec
+.a_button
+	ld a, "▷"
 	ldcoord_a 9, 17
 	ld a, $f
 	ld [wPlayerLinkAction], a
@@ -1595,7 +1595,7 @@
 	callba Function16d6ce
 	ld a, [wOtherPlayerLinkMode]
 	cp $f
-	jr nz, .asm_28ade
+	jr nz, .loop1
 
 Function28b22: ; 28b22
 	call RotateThreePalettesRight
@@ -1693,19 +1693,19 @@
 	call PlaceWholeStringInBoxAtOnce
 	call LoadStandardMenuDataHeader
 	hlcoord 10, 7
-	ld b, $3
-	ld c, $7
+	ld b, 3
+	ld c, 7
 	call Predef_LinkTextbox
 	ld de, String28eab
 	hlcoord 12, 8
 	call PlaceString
-	ld a, $8
+	ld a, 8
 	ld [w2DMenuCursorInitY], a
-	ld a, $b
+	ld a, 11
 	ld [w2DMenuCursorInitX], a
-	ld a, $1
+	ld a, 1
 	ld [w2DMenuNumCols], a
-	ld a, $2
+	ld a, 2
 	ld [w2DMenuNumRows], a
 	xor a
 	ld [w2DMenuFlags1], a
@@ -1712,9 +1712,9 @@
 	ld [w2DMenuFlags2], a
 	ld a, $20
 	ld [w2DMenuFlags3], a
-	ld a, $3
-	ld [w2DMenuFlags4], a
-	ld a, $1
+	ld a, A_BUTTON | B_BUTTON
+	ld [wMenuJoypadFilter], a
+	ld a, 1
 	ld [wMenuCursorY], a
 	ld [wMenuCursorX], a
 	callba Function4d354
@@ -1991,8 +1991,8 @@
 	call DelayFrames
 	ld a, [wLinkMode]
 	cp LINK_TIMECAPSULE
-	jp z, Function2805d
-	jp Function28177
+	jp z, TimeCapsule
+	jp Gen2ToGen2LinkComms
 ; 28ea3
 
 Function28ea3: ; 28ea3
@@ -2593,5 +2593,6 @@
 ; 29f54
 
 GFX_29f54: ; 29f54
+; unreferenced
 INCBIN "gfx/unknown/029f54.2bpp"
 ; 29fe4
--- a/engine/main_menu.asm
+++ b/engine/main_menu.asm
@@ -11,17 +11,17 @@
 	call SetPalettes
 	ld hl, GameTimerPause
 	res 0, [hl]
-	call Function49da4
+	call MainMenu_GetWhichMenu
 	ld [wWhichIndexSet], a
-	call Function49e09
-	ld hl, MenuDataHeader_0x49d14
+	call MainMenu_PrintCurrentTimeAndDay
+	ld hl, .MenuDataHeader
 	call LoadMenuDataHeader
-	call Function49de4
+	call MainMenuJoypadLoop
 	call WriteBackup
 	jr c, .quit
 	call ClearTileMap
 	ld a, [MenuSelection]
-	ld hl, Jumptable_49d60
+	ld hl, .Jumptable
 	rst JumpTable
 	jr MainMenu
 
@@ -29,23 +29,23 @@
 	ret
 ; 49d14
 
-MenuDataHeader_0x49d14: ; 49d14
+.MenuDataHeader: ; 49d14
 	db $40 ; flags
 	db 00, 00 ; start coords
 	db 07, 16 ; end coords
-	dw MenuData2_0x49d1c
+	dw .MenuData2
 	db 1 ; default option
 ; 49d1c
 
-MenuData2_0x49d1c: ; 49d1c
+.MenuData2: ; 49d1c
 	db $80 ; flags
 	db 0 ; items
 	dw MainMenuItems
 	dw PlaceMenuStrings
-	dw MainMenuText
+	dw .Strings
 ; 49d20
 
-MainMenuText: ; 49d24
+.Strings: ; 49d24
 	db "CONTINUE@"
 	db "NEW GAME@"
 	db "OPTION@"
@@ -53,13 +53,14 @@
 	db "MOBILE@"
 	db "MOBILE STUDIUM@"
 
-Jumptable_49d60: ; 0x49d60
-	dw MainMenu_Continue
-	dw MainMenu_NewGame
-	dw MainMenu_Options
-	dw MainMenu_MysteryGift
-	dw MainMenu_Mobile
-	dw MainMenu_MobileStudium
+.Jumptable: ; 0x49d60
+	jumptable_start
+	jumptable MainMenu_Continue
+	jumptable MainMenu_NewGame
+	jumptable MainMenu_Options
+	jumptable MainMenu_MysteryGift
+	jumptable MainMenu_Mobile
+	jumptable MainMenu_MobileStudium
 ; 0x49d6c
 
 CONTINUE       EQU 0
@@ -146,7 +147,7 @@
 	db -1
 
 
-Function49da4: ; 49da4
+MainMenu_GetWhichMenu: ; 49da4
 	nop
 	nop
 	nop
@@ -153,7 +154,7 @@
 	ld a, [wSaveFileExists]
 	and a
 	jr nz, .next
-	ld a, $0
+	ld a, $0 ; New Game
 	ret
 
 .next
@@ -164,12 +165,12 @@
 	ld a, BANK(sNumDailyMysteryGiftPartnerIDs)
 	call GetSRAMBank
 	ld a, [sNumDailyMysteryGiftPartnerIDs]
-	cp $ff
+	cp -1
 	call CloseSRAM
-	jr nz, .done
+	jr nz, .mystery_gift
 	ld a, [StatusFlags]
 	bit 7, a
-	ld a, $1
+	ld a, $1 ; Continue
 	jr z, .ok
 	jr .ok
 
@@ -177,10 +178,10 @@
 	jr .ok2
 
 .ok2
-	ld a, $1
+	ld a, $1 ; Continue
 	ret
 
-.done
+.mystery_gift
 	ld a, [StatusFlags]
 	bit 7, a
 	jr z, .ok3
@@ -190,47 +191,47 @@
 	jr .ok4
 
 .ok4
-	ld a, $6
+	ld a, $6 ; Mystery Gift
 	ret
 ; 49de4
 
-Function49de4: ; 49de4
+MainMenuJoypadLoop: ; 49de4
 	call SetUpMenu
-.asm_49de7
-	call Function49e09
+.loop
+	call MainMenu_PrintCurrentTimeAndDay
 	ld a, [w2DMenuFlags1]
 	set 5, a
 	ld [w2DMenuFlags1], a
 	call Function1f1a
 	ld a, [wMenuJoypad]
-	cp $2
-	jr z, .asm_49e07
-	cp $1
-	jr z, .asm_49e02
-	jr .asm_49de7
+	cp B_BUTTON
+	jr z, .b_button
+	cp A_BUTTON
+	jr z, .a_button
+	jr .loop
 
-.asm_49e02
+.a_button
 	call PlayClickSFX
 	and a
 	ret
 
-.asm_49e07
+.b_button
 	scf
 	ret
 ; 49e09
 
-Function49e09: ; 49e09
+MainMenu_PrintCurrentTimeAndDay: ; 49e09
 	ld a, [wSaveFileExists]
 	and a
 	ret z
 	xor a
 	ld [hBGMapMode], a
-	call Function49e27
+	call .PlaceBox
 	ld hl, Options
 	ld a, [hl]
 	push af
-	set 4, [hl]
-	call Function49e3d
+	set NO_TEXT_SCROLL, [hl]
+	call .PlaceTime
 	pop af
 	ld [Options], a
 	ld a, $1
@@ -239,34 +240,34 @@
 ; 49e27
 
 
-Function49e27: ; 49e27
+.PlaceBox: ; 49e27
 	call CheckRTCStatus
 	and $80
-	jr nz, .asm_49e39
+	jr nz, .TimeFail
 	hlcoord 0, 14
-	ld b, $2
-	ld c, $12
+	ld b, 2
+	ld c, 18
 	call TextBox
 	ret
 
-.asm_49e39
+.TimeFail
 	call SpeechTextBox
 	ret
 ; 49e3d
 
 
-Function49e3d: ; 49e3d
+.PlaceTime: ; 49e3d
 	ld a, [wSaveFileExists]
 	and a
 	ret z
 	call CheckRTCStatus
 	and $80
-	jp nz, Function49e75
+	jp nz, .PrintTimeNotSet
 	call UpdateTime
 	call GetWeekday
 	ld b, a
 	decoord 1, 15
-	call Function49e91
+	call .PlaceCurrentDay
 	decoord 4, 16
 	ld a, [hHours]
 	ld c, a
@@ -277,13 +278,13 @@
 	lb bc, PRINTNUM_LEADINGZEROS | 1, 2
 	call PrintNum
 	ret
-; 49e70
 
-; 49e70
+.min
+; unreferenced
 	db "min.@"
 ; 49e75
 
-Function49e75: ; 49e75
+.PrintTimeNotSet: ; 49e75
 	hlcoord 1, 14
 	ld de, .TimeNotSet
 	call PlaceString
@@ -294,12 +295,13 @@
 	db "TIME NOT SET@"
 ; 49e8c
 
-UnknownText_0x49e8c: ; 49e8c
+.UnusedText ; 49e8c
+	; Clock time unknown
 	text_jump UnknownText_0x1c5182
 	db "@"
 ; 49e91
 
-Function49e91: ; 49e91
+.PlaceCurrentDay: ; 49e91
 	push de
 	ld hl, .Days
 	ld a, b
@@ -357,886 +359,3 @@
 	callba MysteryGift
 	ret
 ; 49efc
-
-MainMenu_Mobile: ; 49efc
-	call ClearBGPalettes
-	ld a, MUSIC_MOBILE_ADAPTER_MENU
-	ld [wMapMusic], a
-	ld de, MUSIC_MOBILE_ADAPTER_MENU
-	call Function4a6c5
-Function49f0a: ; 49f0a
-	call ClearBGPalettes
-	call Function4a3a7
-	call Function4a492
-	call ClearBGPalettes
-Function49f16: ; 49f16
-	call MobileMenu_InitMenuBuffers
-	ld c, 12
-	call DelayFrames
-	hlcoord 4, 0
-	ld b, 10
-	ld c, 10
-	call Function48cdc
-	hlcoord 6, 2
-	ld de, MobileString1
-	call PlaceString
-	hlcoord 0, 12
-	ld b, 4
-	ld c, SCREEN_HEIGHT
-	call TextBox
-	xor a
-	ld de, String_0x49fe9
-	hlcoord 1, 14
-	call PlaceString
-	call WaitBGMap2
-	call SetPalettes
-	call StaticMenuJoypad
-	ld hl, wMenuCursorY
-	ld b, [hl]
-	push bc
-	jr .check_buttons
-
-.joy_loop
-	call ScrollingMenuJoypad
-	ld hl, wMenuCursorY
-	ld b, [hl]
-	push bc
-
-.check_buttons
-	bit A_BUTTON_F, a
-	jr nz, .a_button
-	bit B_BUTTON_F, a
-	jr nz, .b_button
-	jr .next
-
-.a_button
-	ld hl, wMenuCursorY
-	ld a, [hl]
-	cp 1
-	jp z, Function4a098
-	cp 2
-	jp z, Function4a0b9
-	cp 3
-	jp z, Function4a0c2
-	cp 4
-	jp z, Function4a100
-	ld a, 1
-	call MenuClickSound
-.b_button
-	pop bc
-	call ClearBGPalettes
-	call ClearTileMap
-	ld a, MUSIC_MAIN_MENU
-	ld [wMapMusic], a
-	ld de, MUSIC_MAIN_MENU
-	call Function4a6c5
-	ret
-
-.next
-	ld hl, wMenuCursorY
-	ld a, [hl]
-	dec a
-	ld hl, MobileStrings2
-	call GetNthString
-	ld d, h
-	ld e, l
-	hlcoord 1, 13
-	ld b, 4
-	ld c, SCREEN_HEIGHT
-	call ClearBox
-	hlcoord 1, 14
-	call PlaceString
-	jp .useless_jump
-
-.useless_jump
-	call MobileMenu_InitMenuBuffers
-	pop bc
-	ld hl, wMenuCursorY
-	ld [hl], b
-	ld b, $a
-	ld c, $1
-	hlcoord 5, 1
-	call ClearBox
-	jp .joy_loop
-; 49fcc
-
-
-MobileString1: ; 49fcc
-	db   "めいしフ,ルダー"
-	next "あいさつ"
-	next "プロフィール"
-	next "せ", $1e, "い"
-	next "もどる"
-	db   "@"
-; 49fe9
-
-
-MobileStrings2:
-
-String_0x49fe9: ; 49fe9
-	db   "めいし¯つくったり"
-	next "ほぞんしておける フ,ルダーです@"
-; 4a004
-
-String_0x4a004: ; 4a004
-	db   "モバイルたいせんや じぶんのめいしで"
-	next "つかう あいさつ¯つくります@"
-; 4a026
-
-String_0x4a026: ; 4a026
-	db   "あなた%じゅうしょや ねんれいの"
-	next "せ", $1e, "い¯かえられます@"
-; 4a042
-
-String_0x4a042: ; 4a042
-	db  "モバイルセンター", $1d, "せつぞくするとき"
-	next "ひつような こと¯きめます@"
-; 4a062
-
-String_0x4a062: ; 4a062
-	db   "まえ%がめん ", $1d, "もどります"
-	next "@"
-; 4a071
-
-MobileMenu_InitMenuBuffers: ; 4a071 (12:6071)
-	ld hl, w2DMenuCursorInitY
-	ld a, 2
-	ld [hli], a
-	ld a, 5 ; w2DMenuCursorInitX
-	ld [hli], a
-	ld a, 5 ; w2DMenuNumRows
-	ld [hli], a
-	ld a, 1 ; w2DMenuNumCols
-	ld [hli], a
-	ld [hl], $0 ; w2DMenuFlags1
-	set 5, [hl]
-	inc hl
-	xor a ; w2DMenuFlags2
-	ld [hli], a
-	ld a, $20 ; w2DMenuFlags3
-	ld [hli], a
-	; this is a stupid way to load $c3
-	ld a, $1
-	add $40
-	add $80
-	add $2
-	ld [hli], a ; w2DMenuFlags4
-	ld a, 1
-rept 2
-	ld [hli], a ; wMenuCursorY, wMenuCursorX
-endr
-	ret
-
-Function4a098: ; 4a098 (12:6098)
-	ld a, 2
-	call MenuClickSound
-	call PlaceHollowCursor
-	call WaitBGMap
-	call LoadStandardMenuDataHeader
-	callba Function89de0
-	call Call_ExitMenu
-	call MG_Mobile_Layout_LoadPals
-	call Function4a485
-	pop bc
-	jp Function49f16
-
-Function4a0b9: ; 4a0b9 (12:60b9)
-	ld a, 2
-	call MenuClickSound
-	pop bc
-	jp Function4a4c4
-
-Function4a0c2: ; 4a0c2 (12:60c2)
-	ld a, 2
-	call MenuClickSound
-	ld a, BANK(sPlayerData)
-	call GetSRAMBank
-	ld hl, sPlayerData + PlayerName - wPlayerData
-	ld de, PlayerName
-	ld bc, 6 ; japanese name length
-	call CopyBytes
-	call CloseSRAM
-	callba _LoadData
-	ld c, 2
-	call DelayFrames
-	ld c, $1
-	call InitMobileProfile
-	push af
-	call ClearBGPalettes
-	pop af
-	and a
-	jr nz, .skip_save
-	callba _SaveData
-.skip_save
-	ld c, 5
-	call DelayFrames
-	jr asm_4a111
-
-Function4a100: ; 4a100 (12:6100)
-	ld a, 2
-	call MenuClickSound
-	call ClearBGPalettes
-	call Function4a13b
-	call ClearBGPalettes
-	call ClearTileMap
-
-asm_4a111: ; 4a111 (12:6111)
-	pop bc
-	call LoadFontsExtra
-	jp Function49f0a
-
-Function4a118: ; 4a118 (12:6118)
-	ld hl, w2DMenuCursorInitY
-	ld a, $1
-	ld [hli], a
-	ld a, $d
-	ld [hli], a
-	ld a, $3
-	ld [hli], a
-	ld a, $1
-	ld [hli], a
-	ld [hl], $0
-	set 5, [hl]
-	inc hl
-	xor a
-	ld [hli], a
-	ld a, $20
-	ld [hli], a
-	ld a, $1
-	add $2
-	ld [hli], a
-	ld a, $1
-rept 2
-	ld [hli], a
-endr
-	ret
-
-Function4a13b: ; 4a13b (12:613b)
-	call Function4a3a7
-	call Function4a492
-	call Function4a373
-	ld c, 10
-	call DelayFrames
-
-Function4a149: ; 4a149 (12:6149)
-	hlcoord 1, 2
-	ld b, $6
-	ld c, $10
-	call Function48cdc
-	hlcoord 3, 4
-	ld de, String_4a1ef
-	call PlaceString
-	hlcoord 0, 12
-	ld b, $4
-	ld c, $12
-	call TextBox
-	ld a, [wMenuCursorY]
-	dec a
-	ld hl, Strings_4a23d
-	call GetNthString
-	ld d, h
-	ld e, l
-	hlcoord 1, 13
-	ld b, $4
-	ld c, $12
-	call ClearBox
-	hlcoord 1, 14
-	call PlaceString
-	callba Function104148
-	call SetPalettes
-	call StaticMenuJoypad
-	ld hl, wMenuCursorY
-	ld b, [hl]
-	push bc
-	jr asm_4a19d
-
-Function4a195: ; 4a195 (12:6195)
-	call ScrollingMenuJoypad
-	ld hl, wMenuCursorY
-	ld b, [hl]
-	push bc
-
-asm_4a19d: ; 4a19d (12:619d)
-	bit 0, a
-	jr nz, .asm_4a1a7
-	bit 1, a
-	jr nz, .asm_4a1ba
-	jr .asm_4a1bc
-.asm_4a1a7
-	ld hl, wMenuCursorY
-	ld a, [hl]
-	cp $1
-	jp z, Function4a20e
-	cp $2
-	jp z, Function4a221
-	ld a, $1
-	call MenuClickSound
-.asm_4a1ba
-	pop bc
-	ret
-.asm_4a1bc
-	ld hl, wMenuCursorY
-	ld a, [hl]
-	dec a
-	ld hl, Strings_4a23d
-	call GetNthString
-	ld d, h
-	ld e, l
-	hlcoord 1, 13
-	ld b, $4
-	ld c, $12
-	call ClearBox
-	hlcoord 1, 14
-	call PlaceString
-	jr .asm_4a1db
-.asm_4a1db
-	call Function4a373
-	pop bc
-	ld hl, wMenuCursorY
-	ld [hl], b
-	lb bc, 6, 1
-	hlcoord 2, 3
-	call ClearBox
-	jp Function4a195
-; 4a1ef (12:61ef)
-
-String_4a1ef: ; 4a1ef
-	db   "モバイルセンター¯えらぶ"
-	next "ログインパスワード¯いれる"
-	next "もどる@"
-; 4a20e
-
-Function4a20e: ; 4a20e (12:620e)
-	ld a, $1
-	call MenuClickSound
-	callba Function1719c8
-	call ClearBGPalettes
-	call DelayFrame
-	jr Function4a239
-
-Function4a221: ; 4a221 (12:6221)
-	ld a, $1
-	call MenuClickSound
-	call Function4a28a
-	jr c, Function4a239
-	call Function4a373
-	ld a, $2
-	ld [wMenuCursorY], a
-	jr .asm_4a235
-.asm_4a235
-	pop bc
-	jp Function4a149
-
-Function4a239: ; 4a239 (12:6239)
-	pop bc
-	jp Function4a13b
-; 4a23d (12:623d)
-
-Strings_4a23d: ; 4a23d
-	db   "いつも せつぞく¯する"
-	next "モバイルセンター¯えらびます@"
-
-	db   "モバイルセンター", $1d, "せつぞくするとき"
-	next "つかうパスワード¯ほぞんできます@"
-
-	db   "まえ%がめん ", $1d, "もどります@"
-
-	db   "@"
-; 4a28a
-
-Function4a28a: ; 4a28a (12:628a)
-	hlcoord 2, 3
-	lb bc, 6, 1
-	ld a, " "
-	call Function4a6d8
-	call PlaceHollowCursor
-	call WaitBGMap
-	call LoadStandardMenuDataHeader
-	ld a, $5
-	call GetSRAMBank
-	ld a, [$aa4b]
-	call CloseSRAM
-	and a
-	jr z, .asm_4a2df
-	hlcoord 12, 0
-	ld b, $5
-	ld c, $6
-	call Function48cdc
-	hlcoord 14, 1
-	ld de, String_4a34b
-	call PlaceString
-	callba Function104148
-	call Function4a118
-	call ScrollingMenuJoypad
-	push af
-	call PlayClickSFX
-	pop af
-	bit 1, a
-	jr nz, .asm_4a33b
-	ld a, [wMenuCursorY]
-	cp $2
-	jr z, .asm_4a2f0
-	cp $3
-	jr z, .asm_4a33b
-.asm_4a2df
-	callba Function11765d
-	call ClearBGPalettes
-	call Call_ExitMenu
-	call LoadFontsExtra
-	scf
-	ret
-.asm_4a2f0
-	call PlaceHollowCursor
-	ld hl, UnknownText_0x4a358
-	call PrintText
-	hlcoord 14, 7
-	ld b, $3
-	ld c, $4
-	call TextBox
-	callba Function104148
-	ld hl, MenuDataHeader_0x4a362
-	call LoadMenuDataHeader
-	call VerticalMenu
-	bit 1, a
-	jr nz, .asm_4a338
-	ld a, [wMenuCursorY]
-	cp $2
-	jr z, .asm_4a338
-	ld a, $5
-	call GetSRAMBank
-	ld hl, $aa4b
-	xor a
-	ld bc, $11
-	call ByteFill
-	call CloseSRAM
-	ld hl, UnknownText_0x4a35d
-	call PrintText
-	call JoyWaitAorB
-.asm_4a338
-	call ExitMenu
-.asm_4a33b
-	call Call_ExitMenu
-	callba Function104148
-	xor a
-	ret
-; 4a346 (12:6346)
-
-MenuDataHeader_0x4a346: ; 0x4a346
-	db $40 ; flags
-	db 00, 12 ; start coords
-	db 06, 19 ; end coords
-
-String_4a34b: ; 4a34b
-	db   "いれなおす"
-	next "けす"
-	next "もどる@"
-; 4a358
-
-UnknownText_0x4a358: ; 0x4a358
-	; Delete the saved LOG-IN PASSWORD?
-	text_jump UnknownText_0x1c5196
-	db "@"
-; 0x4a35d
-
-UnknownText_0x4a35d: ; 0x4a35d
-	; Deleted the LOG-IN PASSWORD.
-	text_jump UnknownText_0x1c51b9
-	db "@"
-; 0x4a362
-
-MenuDataHeader_0x4a362: ; 0x4a362
-	db $40 ; flags
-	db 07, 14 ; start coords
-	db 11, 19 ; end coords
-	dw MenuData2_0x4a36a
-	db 2 ; default option
-; 0x4a36a
-
-MenuData2_0x4a36a: ; 0x4a36a
-	db $e0 ; flags
-	db 2 ; items
-	db "はい@"
-	db "いいえ@"
-; 0x4a373
-
-Function4a373: ; 4a373 (12:6373)
-	ld hl, w2DMenuCursorInitY
-	ld a, $4
-	ld [hli], a
-	ld a, $2
-	ld [hli], a
-	ld a, $3
-	ld [hli], a
-	ld a, $1
-	ld [hli], a
-	ld [hl], $0
-	set 5, [hl]
-	inc hl
-	xor a
-	ld [hli], a
-	ld a, $20
-	ld [hli], a
-	ld a, $1
-	add $40
-	add $80
-	add $2
-	ld [hli], a
-	ld a, $1
-rept 2
-	ld [hli], a
-endr
-	ret
-; 4a39a (12:639a)
-
-Function4a39a: ; 4a39a
-	call Function4a485
-	call Function4a492
-	call Function4a3aa
-	call SetPalettes
-	ret
-; 4a3a7
-
-Function4a3a7: ; 4a3a7 (12:63a7)
-	call Function4a485
-Function4a3aa: ; 4a3aa
-	hlcoord 0, 0
-	lb bc, 3, 1
-	xor a
-	call Function4a6d8
-	lb bc, 1, 1
-	ld a, $1
-	call Function4a6d8
-	lb bc, 1, 1
-	xor a
-	call Function4a6d8
-	lb bc, 1, 1
-	ld a, $1
-	call Function4a6d8
-	lb bc, 4, 1
-	ld a, $2
-	call Function4a6d8
-	lb bc, 1, 1
-	ld a, $3
-	call Function4a6d8
-	lb bc, 1, 1
-	ld a, " "
-	call Function4a6d8
-	hlcoord 1, 0
-	ld a, $1
-	lb bc, 3, 18
-	call Function4a6d8
-	lb bc, 1, 18
-	ld a, $0
-	call Function4a6d8
-	lb bc, 1, 18
-	ld a, $1
-	call Function4a6d8
-	lb bc, 1, 18
-	ld a, $2
-	call Function4a6d8
-	lb bc, 11, 18
-	ld a, " "
-	call Function4a6d8
-	hlcoord 19, 0
-	lb bc, 3, 1
-	ld a, $0
-	call Function4a6d8
-	lb bc, 1, 1
-	ld a, $1
-	call Function4a6d8
-	lb bc, 1, 1
-	xor a
-	call Function4a6d8
-	lb bc, 1, 1
-	ld a, $1
-	call Function4a6d8
-	lb bc, 4, 1
-	ld a, $2
-	call Function4a6d8
-	lb bc, 1, 1
-	ld a, $3
-	call Function4a6d8
-	lb bc, 1, 1
-	ld a, " "
-	call Function4a6d8
-	ret
-; 4a449 (12:6449)
-
-Function4a449: ; 4a449
-	ld bc, 3 * SCREEN_WIDTH
-	ld a, $0
-	hlcoord 0, 0
-	call ByteFill
-	ld bc, 2 * SCREEN_WIDTH
-	ld a, $1
-	call ByteFill
-	ld bc, 2 * SCREEN_WIDTH
-	ld a, $0
-	call ByteFill
-	ld bc, 2 * SCREEN_WIDTH
-	ld a, $1
-	call ByteFill
-	ld bc, SCREEN_WIDTH
-	ld a, $2
-	call ByteFill
-	ld bc, SCREEN_WIDTH
-	ld a, $3
-	call ByteFill
-	ld bc, SCREEN_WIDTH
-	ld a, " "
-	call ByteFill
-	ret
-; 4a485
-
-Function4a485: ; 4a485 (12:6485)
-	ld de, GFX_49c0c
-	ld hl, VTiles2 tile $00
-	lb bc, BANK(GFX_49c0c), 13
-	call Get2bpp
-	ret
-
-Function4a492: ; 4a492 (12:6492)
-	call MG_Mobile_Layout00
-	ret
-
-
-MainMenu_MobileStudium: ; 4a496
-	ld a, [StartDay]
-	ld b, a
-	ld a, [StartHour]
-	ld c, a
-	ld a, [StartMinute]
-	ld d, a
-	ld a, [StartSecond]
-	ld e, a
-	push bc
-	push de
-	callba MobileStudium
-	call ClearBGPalettes
-	pop de
-	pop bc
-	ld a, b
-	ld [StartDay], a
-	ld a, c
-	ld [StartHour], a
-	ld a, d
-	ld [StartMinute], a
-	ld a, e
-	ld [StartSecond], a
-	ret
-; 4a4c4
-
-
-Function4a4c4: ; 4a4c4 (12:64c4)
-	call ClearBGPalettes
-	call Function4a3a7
-	call Function4a492
-	call Function4a680
-	call ClearBGPalettes
-	ld c, 20
-	call DelayFrames
-	hlcoord 2, 0
-	ld b, $a
-	ld c, $e
-	call Function48cdc
-	hlcoord 4, 2
-	ld de, String_4a5c5
-	call PlaceString
-	hlcoord 4, 4
-	ld de, String_4a5cd
-	call PlaceString
-	hlcoord 4, 6
-	ld de, String_4a5da
-	call PlaceString
-	hlcoord 4, 8
-	ld de, String_4a5e6
-	call PlaceString
-	hlcoord 4, 10
-	ld de, String_4a5f2
-	call PlaceString
-	hlcoord 0, 12
-	ld b, $4
-	ld c, $12
-	call TextBox
-	xor a
-	ld hl, Strings_4a5f6
-	ld d, h
-	ld e, l
-	hlcoord 1, 14
-	call PlaceString
-	ld a, $1
-	ld hl, Strings_4a5f6
-	call GetNthString
-	ld d, h
-	ld e, l
-	hlcoord 1, 16
-	call PlaceString
-	call WaitBGMap2
-	call SetPalettes
-	call StaticMenuJoypad
-	ld hl, wMenuCursorY
-	ld b, [hl]
-	push bc
-	jr asm_4a54d
-
-Function4a545: ; 4a545 (12:6545)
-	call ScrollingMenuJoypad
-	ld hl, wMenuCursorY
-	ld b, [hl]
-	push bc
-
-asm_4a54d: ; 4a54d (12:654d)
-	bit 0, a
-	jr nz, .asm_4a557
-	bit 1, a
-	jr nz, .asm_4a574
-	jr .asm_4a57e
-.asm_4a557
-	ld hl, wMenuCursorY
-	ld a, [hl]
-	cp $1
-	jp z, Function4a6ab
-	cp $2
-	jp z, Function4a6ab
-	cp $3
-	jp z, Function4a6ab
-	cp $4
-	jp z, Function4a6ab
-	ld a, $1
-	call MenuClickSound
-.asm_4a574
-	pop bc
-	call ClearBGPalettes
-	call ClearTileMap
-	jp Function49f0a
-.asm_4a57e
-	ld hl, wMenuCursorY
-	ld a, [hl]
-	dec a
-	add a
-	push af
-	ld hl, Strings_4a5f6
-	call GetNthString
-	ld d, h
-	ld e, l
-	hlcoord 1, 13
-	ld b, $4
-	ld c, $12
-	call ClearBox
-	hlcoord 1, 14
-	call PlaceString
-	pop af
-	inc a
-	ld hl, Strings_4a5f6
-	call GetNthString
-	ld d, h
-	ld e, l
-	hlcoord 1, 16
-	call PlaceString
-	jp Function4a5b0
-
-Function4a5b0: ; 4a5b0 (12:65b0)
-	call Function4a680
-	pop bc
-	ld hl, wMenuCursorY
-	ld [hl], b
-	ld b, $a
-	ld c, $1
-	hlcoord 3, 1
-	call ClearBox
-	jp Function4a545
-; 4a5c5 (12:65c5)
-
-String_4a5c5: ; 4a5c5
-	db "じこしょうかい@"
-String_4a5cd: ; 4a5cd
-	db "たいせん ", $4a, "はじまるとき@"
-String_4a5da: ; 4a5da
-	db "たいせん ", $1d, "かったとき@"
-String_4a5e6: ; 4a5e6
-	db "たいせん ", $1d, "まけたとき@"
-String_4a5f2: ; 4a5f2
-	db "もどる@"
-; 4a5f6
-
-Strings_4a5f6: ; 4a5f6
-	db "めいし や ニュース ", $1d, "のせる@"
-	db "あなた%あいさつです@"
-	db "モバイル たいせん", $4a, "はじまるとき@"
-	db "あいて", $1d, "みえる あいさつです@"
-	db "モバイル たいせんで かったとき@"
-	db "あいて", $1d, "みえる あいさつです@"
-	db "モバイル たいせんで まけたとき@"
-	db "あいて", $1d, "みえる あいさつです@"
-	db "まえ%がめん ", $1d, "もどります@"
-	db "@"
-; 4a680
-
-Function4a680: ; 4a680 (12:6680)
-	ld hl, w2DMenuCursorInitY
-	ld a, $2
-	ld [hli], a
-	ld a, $3
-	ld [hli], a
-	ld a, $5
-	ld [hli], a
-	ld a, $1
-	ld [hli], a
-	ld [hl], $0
-	set 5, [hl]
-	inc hl
-	xor a
-	ld [hli], a
-	ld a, $20
-	ld [hli], a
-	ld a, $1
-	add $40
-	add $80
-	add $2
-	ld [hli], a
-	ld a, $1
-rept 2
-	ld [hli], a
-endr
-	xor a
-rept 3
-	ld [hli], a
-endr
-	ret
-
-Function4a6ab: ; 4a6ab (12:66ab)
-	ld a, $2
-	call MenuClickSound
-	call ClearBGPalettes
-	ld b, SCGB_08
-	call GetSGBLayout
-	callba Function11c1ab
-	pop bc
-	call LoadFontsExtra
-	jp Function4a4c4
-
-Function4a6c5: ; 4a6c5 (12:66c5)
-	ld a, $5
-	ld [MusicFade], a
-	ld a, e
-	ld [MusicFadeIDLo], a
-	ld a, d
-	ld [MusicFadeIDHi], a
-	ld c, 22
-	call DelayFrames
-	ret
-
-Function4a6d8: ; 4a6d8 (12:66d8)
-	push bc
-	push hl
-.asm_4a6da
-	ld [hli], a
-	dec c
-	jr nz, .asm_4a6da
-	pop hl
-	ld bc, $14
-	add hl, bc
-	pop bc
-	dec b
-	jr nz, Function4a6d8
-	ret
--- a/engine/menu.asm
+++ b/engine/menu.asm
@@ -42,7 +42,7 @@
 	and a
 	jr nz, .quit
 	call MobileMenuJoypad
-	ld a, [w2DMenuFlags4]
+	ld a, [wMenuJoypadFilter]
 	and c
 	jr z, .loop
 	call Mobile_GetMenuSelection
@@ -246,16 +246,16 @@
 
 .InitFlags_c: ; 24193
 	ld hl, wMenuData2Flags
-	ld a, %001
+	ld a, A_BUTTON
 	bit 0, [hl]
 	jr nz, .skip
-	or %010
+	or B_BUTTON
 .skip
 	bit 1, [hl]
 	jr z, .skip2
-	or %100
+	or SELECT
 .skip2
-	ld [w2DMenuFlags4], a
+	ld [wMenuJoypadFilter], a
 	ret
 ; 241a8
 
@@ -307,7 +307,7 @@
 	jr nz, .done
 	call GetMenuJoypad
 	ld c, a
-	ld a, [w2DMenuFlags4]
+	ld a, [wMenuJoypadFilter]
 	and c
 	jr z, .loop
 
@@ -345,7 +345,7 @@
 	jr nz, .done
 	call GetMenuJoypad
 	ld b, a
-	ld a, [w2DMenuFlags4]
+	ld a, [wMenuJoypadFilter]
 	and b
 	jr z, .loop
 
@@ -812,11 +812,11 @@
 ; w2DMenuFlags3
 	ld a, %00100000
 	ld [hli], a
-; w2DMenuFlags4
-	ld a, %001
+; wMenuJoypadFilter
+	ld a, A_BUTTON
 	bit 0, b
 	jr nz, .skip_bit_1
-	add %010
+	add B_BUTTON
 .skip_bit_1
 	ld [hli], a
 ; wMenuCursorY
--- a/engine/party_menu.asm
+++ b/engine/party_menu.asm
@@ -693,12 +693,12 @@
 	jr c, .done
 
 .skip
-	ld a, $1
+	ld a, 1
 
 .done
 	ld [wMenuCursorY], a
 	ld a, A_BUTTON | B_BUTTON
-	ld [w2DMenuFlags4], a
+	ld [wMenuJoypadFilter], a
 	ret
 ; 5042d
 
@@ -716,11 +716,11 @@
 	cp b
 	jr c, .done
 .skip
-	ld a, $1
+	ld a, 1
 .done
 	ld [wMenuCursorY], a
 	ld a, A_BUTTON | B_BUTTON
-	ld [w2DMenuFlags4], a
+	ld [wMenuJoypadFilter], a
 	ret
 ; 5044f (14:444f)
 
--- a/engine/scrolling_menu.asm
+++ b/engine/scrolling_menu.asm
@@ -279,65 +279,64 @@
 	ld a, [wScrollingMenuListSize]
 	ld b, a
 	ld a, [wMenuBorderTopCoord]
-	add $1
+	add 1
 	ld [w2DMenuCursorInitY], a
 	ld a, [wMenuBorderLeftCoord]
-	add $0
+	add 0
 	ld [w2DMenuCursorInitX], a
 	ld a, [wMenuData2_ScrollingMenuHeight]
 	cp b
-	jr c, .asm_24786
-	jr z, .asm_24786
+	jr c, .no_extra_row
+	jr z, .no_extra_row
 	ld a, b
 	inc a
-
-.asm_24786
+.no_extra_row
 	ld [w2DMenuNumRows], a
-	ld a, $1
+	ld a, 1
 	ld [w2DMenuNumCols], a
 	ld a, $8c
 	bit 2, c
-	jr z, .asm_24796
+	jr z, .skip_set_0
 	set 0, a
 
-.asm_24796
+.skip_set_0
 	bit 3, c
-	jr z, .asm_2479c
+	jr z, .skip_set_1
 	set 1, a
 
-.asm_2479c
+.skip_set_1
 	ld [w2DMenuFlags1], a
 	xor a
 	ld [w2DMenuFlags2], a
 	ld a, $20
 	ld [w2DMenuFlags3], a
-	ld a, $c3
+	ld a, A_BUTTON | B_BUTTON | D_UP | D_DOWN
 	bit 7, c
-	jr z, .asm_247b0
-	add $4
+	jr z, .disallow_select
+	add SELECT
 
-.asm_247b0
+.disallow_select
 	bit 6, c
-	jr z, .asm_247b6
-	add $8
+	jr z, .disallow_start
+	add START
 
-.asm_247b6
-	ld [w2DMenuFlags4], a
+.disallow_start
+	ld [wMenuJoypadFilter], a
 	ld a, [w2DMenuNumRows]
 	ld b, a
 	ld a, [wMenuCursorBuffer]
 	and a
-	jr z, .asm_247c8
+	jr z, .reset_cursor
 	cp b
-	jr z, .asm_247ca
-	jr c, .asm_247ca
+	jr z, .cursor_okay
+	jr c, .cursor_okay
 
-.asm_247c8
-	ld a, $1
+.reset_cursor
+	ld a, 1
 
-.asm_247ca
+.cursor_okay
 	ld [wMenuCursorY], a
-	ld a, $1
+	ld a, 1
 	ld [wMenuCursorX], a
 	xor a
 	ld [wCursorCurrentTile], a
--- a/engine/tmhm2.asm
+++ b/engine/tmhm2.asm
@@ -216,8 +216,8 @@
 	ld [w2DMenuFlags2], a
 	ld a, $20
 	ld [w2DMenuFlags3], a
-	ld a, $f3
-	ld [w2DMenuFlags4], a
+	ld a, A_BUTTON | B_BUTTON | D_UP | D_DOWN | D_LEFT | D_RIGHT
+	ld [wMenuJoypadFilter], a
 	ld a, [wTMHMPocketCursor]
 	inc a
 	ld [wMenuCursorY], a
--- a/home/menu.asm
+++ b/home/menu.asm
@@ -343,20 +343,20 @@
 
 Function1eff:: ; 1eff
 	call InitVerticalMenuCursor
-	ld hl, w2DMenuFlags4
+	ld hl, wMenuJoypadFilter
 	ld a, [wMenuData2Flags]
 	bit 3, a
-	jr z, .skip3
-	set 3, [hl]
+	jr z, .disallow_select
+	set START_F, [hl]
 
-.skip3
+.disallow_select
 	ld a, [wMenuData2Flags]
 	bit 2, a
-	jr z, .skip4_5
-	set 5, [hl]
-	set 4, [hl]
+	jr z, .disallow_left_right
+	set D_LEFT_F, [hl]
+	set D_RIGHT_F, [hl]
 
-.skip4_5
+.disallow_left_right
 	ret
 ; 1f1a
 
@@ -363,7 +363,7 @@
 
 Function1f1a:: ; 1f1a
 	call ScrollingMenuJoypad
-	ld hl, w2DMenuFlags4
+	ld hl, wMenuJoypadFilter
 	and [hl]
 	jr Function1f2a
 ; 1f23
@@ -375,35 +375,35 @@
 ; 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
+	bit A_BUTTON_F, a
+	jr nz, .a_button
+	bit B_BUTTON_F, a
+	jr nz, .b_start
+	bit START_F, a
+	jr nz, .b_start
+	bit D_RIGHT_F, a
+	jr nz, .d_right
+	bit D_LEFT_F, a
+	jr nz, .d_left
 	xor a
 	ld [wMenuJoypad], a
-	jr .asm_1f57
+	jr .done
 
-.asm_1f44
-	ld a, $10
+.d_right
+	ld a, D_RIGHT
 	ld [wMenuJoypad], a
-	jr .asm_1f57
+	jr .done
 
-.asm_1f4b
-	ld a, $20
+.d_left
+	ld a, D_LEFT
 	ld [wMenuJoypad], a
-	jr .asm_1f57
+	jr .done
 
-.asm_1f52
-	ld a, $1
+.a_button
+	ld a, A_BUTTON
 	ld [wMenuJoypad], a
 
-.asm_1f57
+.done
 	call GetMenuIndexSet
 	ld a, [wMenuCursorY]
 	ld l, a
@@ -416,10 +416,10 @@
 	and a
 	ret
 
-.asm_1f6d
-	ld a, $2
+.b_start
+	ld a, B_BUTTON
 	ld [wMenuJoypad], a
-	ld a, $ff
+	ld a, -1
 	ld [MenuSelection], a
 	scf
 	ret
--- a/home/serial.asm
+++ b/home/serial.asm
@@ -92,7 +92,7 @@
 Function75f:: ; 75f
 	ld a, $1
 	ld [hFFCC], a
-.asm_763
+.loop
 	ld a, [hl]
 	ld [hSerialSend], a
 	call Function78a
@@ -100,28 +100,28 @@
 	ld b, a
 	inc hl
 	ld a, $30
-.asm_76e
+.wait
 	dec a
-	jr nz, .asm_76e
+	jr nz, .wait
 	ld a, [hFFCC]
 	and a
 	ld a, b
 	pop bc
-	jr z, .asm_782
+	jr z, .load
 	dec hl
 	cp $fd
-	jr nz, .asm_763
+	jr nz, .loop
 	xor a
 	ld [hFFCC], a
-	jr .asm_763
+	jr .loop
 
-.asm_782
+.load
 	ld [de], a
 	inc de
 	dec bc
 	ld a, b
 	or c
-	jr nz, .asm_763
+	jr nz, .loop
 	ret
 ; 78a
 
--- a/main.asm
+++ b/main.asm
@@ -9805,6 +9805,7 @@
 
 INCLUDE "event/celebi.asm"
 INCLUDE "engine/main_menu.asm"
+INCLUDE "misc/mobile_menu.asm"
 INCLUDE "engine/search.asm"
 INCLUDE "misc/mobile_12_2.asm"
 ; mobile battle selection
@@ -10292,7 +10293,7 @@
 	ld l, e
 	push bc
 	push hl
-	call Function4d37e
+	call .PlaceBorder
 	pop hl
 	pop bc
 	ld de, AttrMap - TileMap
@@ -10320,12 +10321,12 @@
 	ret
 ; 4d37e
 
-Function4d37e: ; 4d37e
+.PlaceBorder: ; 4d37e
 	push hl
 	ld a, $76
 	ld [hli], a
 	inc a
-	call Function4d3ab
+	call .PlaceRow
 	inc a
 	ld [hl], a
 	pop hl
@@ -10336,7 +10337,7 @@
 	ld a, "┌"
 	ld [hli], a
 	ld a, " "
-	call Function4d3ab
+	call .PlaceRow
 	ld [hl], "─"
 	pop hl
 	ld de, SCREEN_WIDTH
@@ -10346,17 +10347,17 @@
 	ld a, "┐"
 	ld [hli], a
 	ld a, "│"
-	call Function4d3ab
+	call .PlaceRow
 	ld [hl], "└"
 	ret
 ; 4d3ab
 
-Function4d3ab: ; 4d3ab
+.PlaceRow: ; 4d3ab
 	ld d, c
-.loop
+.row_loop
 	ld [hli], a
 	dec d
-	jr nz, .loop
+	jr nz, .row_loop
 	ret
 ; 4d3b1
 
--- a/misc/mobile_12_2.asm
+++ b/misc/mobile_12_2.asm
@@ -488,7 +488,7 @@
 Function4ab1a: ; 4ab1a
 .asm_4ab1a
 	ld a, $fb
-	ld [w2DMenuFlags4], a
+	ld [wMenuJoypadFilter], a
 	ld a, $26
 	ld [w2DMenuFlags3], a
 	ld a, $2
--- a/misc/mobile_22.asm
+++ b/misc/mobile_22.asm
@@ -2242,7 +2242,7 @@
 	callba MobileMenuJoypad
 	call Function8923c
 	ld a, c
-	ld hl, w2DMenuFlags4
+	ld hl, wMenuJoypadFilter
 	and [hl]
 	ret z
 	bit 0, a
@@ -3088,7 +3088,7 @@
 Function8a383: ; 8a383 (22:6383)
 	callba MobileMenuJoypad
 	ld a, c
-	ld hl, w2DMenuFlags4
+	ld hl, wMenuJoypadFilter
 	and [hl]
 	ret z
 	bit 0, a
--- a/misc/mobile_40.asm
+++ b/misc/mobile_40.asm
@@ -860,7 +860,7 @@
 Function10054d: ; 10054d
 	callba MobileMenuJoypad
 	ld a, c
-	ld hl, w2DMenuFlags4
+	ld hl, wMenuJoypadFilter
 	and [hl]
 	ret z
 	call MenuClickSound
@@ -1829,7 +1829,7 @@
 	call Function100e2d
 	pop bc
 	jr c, .asm_100b6b
-	ld a, [w2DMenuFlags4]
+	ld a, [wMenuJoypadFilter]
 	and c
 	jr z, .asm_100b48
 	callba Mobile_GetMenuSelection
@@ -1890,7 +1890,7 @@
 	call Function100e2d
 	pop bc
 	jr c, .asm_100c25
-	ld a, [w2DMenuFlags4]
+	ld a, [wMenuJoypadFilter]
 	and c
 	bit 6, a
 	jp nz, .asm_100bff
@@ -2021,7 +2021,7 @@
 	call Function100dfd
 	pop bc
 	jr c, .asm_100d17
-	ld a, [w2DMenuFlags4]
+	ld a, [wMenuJoypadFilter]
 	and c
 	jr z, .asm_100cc0
 	call PlaceHollowCursor
@@ -2075,7 +2075,7 @@
 	call Function100dfd
 	pop bc
 	jr c, .asm_100d54
-	ld a, [w2DMenuFlags4]
+	ld a, [wMenuJoypadFilter]
 	and c
 	jr nz, .asm_100d56
 	jr .asm_100d30
@@ -5722,7 +5722,7 @@
 	callba Function1009f3
 	ret c
 	callba MobileMenuJoypad
-	ld a, [w2DMenuFlags4]
+	ld a, [wMenuJoypadFilter]
 	and c
 	ret z
 	bit 0, c
@@ -5784,7 +5784,7 @@
 	callba Function1009f3
 	ret c
 	callba MobileMenuJoypad
-	ld a, [w2DMenuFlags4]
+	ld a, [wMenuJoypadFilter]
 	and c
 	ret z
 	bit 0, c
@@ -6327,7 +6327,7 @@
 	ret c
 	callba MobileMenuJoypad
 	ld a, c
-	ld hl, w2DMenuFlags4
+	ld hl, wMenuJoypadFilter
 	and [hl]
 	ret z
 	push af
--- a/misc/mobile_5b.asm
+++ b/misc/mobile_5b.asm
@@ -1107,7 +1107,7 @@
 	jr nz, .asm_16d758
 	call Function16d713
 	ld b, a
-	ld a, [w2DMenuFlags4]
+	ld a, [wMenuJoypadFilter]
 	and b
 	jr z, .asm_16d734
 
--- /dev/null
+++ b/misc/mobile_menu.asm
@@ -1,0 +1,882 @@
+MainMenu_Mobile: ; 49efc
+	call ClearBGPalettes
+	ld a, MUSIC_MOBILE_ADAPTER_MENU
+	ld [wMapMusic], a
+	ld de, MUSIC_MOBILE_ADAPTER_MENU
+	call Function4a6c5
+Function49f0a: ; 49f0a
+	call ClearBGPalettes
+	call Function4a3a7
+	call Function4a492
+	call ClearBGPalettes
+Function49f16: ; 49f16
+	call MobileMenu_InitMenuBuffers
+	ld c, 12
+	call DelayFrames
+	hlcoord 4, 0
+	ld b, 10
+	ld c, 10
+	call Function48cdc
+	hlcoord 6, 2
+	ld de, MobileString1
+	call PlaceString
+	hlcoord 0, 12
+	ld b, 4
+	ld c, SCREEN_HEIGHT
+	call TextBox
+	xor a
+	ld de, String_0x49fe9
+	hlcoord 1, 14
+	call PlaceString
+	call WaitBGMap2
+	call SetPalettes
+	call StaticMenuJoypad
+	ld hl, wMenuCursorY
+	ld b, [hl]
+	push bc
+	jr .check_buttons
+
+.joy_loop
+	call ScrollingMenuJoypad
+	ld hl, wMenuCursorY
+	ld b, [hl]
+	push bc
+
+.check_buttons
+	bit A_BUTTON_F, a
+	jr nz, .a_button
+	bit B_BUTTON_F, a
+	jr nz, .b_button
+	jr .next
+
+.a_button
+	ld hl, wMenuCursorY
+	ld a, [hl]
+	cp 1
+	jp z, Function4a098
+	cp 2
+	jp z, Function4a0b9
+	cp 3
+	jp z, Function4a0c2
+	cp 4
+	jp z, Function4a100
+	ld a, 1
+	call MenuClickSound
+.b_button
+	pop bc
+	call ClearBGPalettes
+	call ClearTileMap
+	ld a, MUSIC_MAIN_MENU
+	ld [wMapMusic], a
+	ld de, MUSIC_MAIN_MENU
+	call Function4a6c5
+	ret
+
+.next
+	ld hl, wMenuCursorY
+	ld a, [hl]
+	dec a
+	ld hl, MobileStrings2
+	call GetNthString
+	ld d, h
+	ld e, l
+	hlcoord 1, 13
+	ld b, 4
+	ld c, SCREEN_HEIGHT
+	call ClearBox
+	hlcoord 1, 14
+	call PlaceString
+	jp .useless_jump
+
+.useless_jump
+	call MobileMenu_InitMenuBuffers
+	pop bc
+	ld hl, wMenuCursorY
+	ld [hl], b
+	ld b, $a
+	ld c, $1
+	hlcoord 5, 1
+	call ClearBox
+	jp .joy_loop
+; 49fcc
+
+
+MobileString1: ; 49fcc
+	db   "めいしフ,ルダー"
+	next "あいさつ"
+	next "プロフィール"
+	next "せ", $1e, "い"
+	next "もどる"
+	db   "@"
+; 49fe9
+
+
+MobileStrings2:
+
+String_0x49fe9: ; 49fe9
+	db   "めいし¯つくったり"
+	next "ほぞんしておける フ,ルダーです@"
+; 4a004
+
+String_0x4a004: ; 4a004
+	db   "モバイルたいせんや じぶんのめいしで"
+	next "つかう あいさつ¯つくります@"
+; 4a026
+
+String_0x4a026: ; 4a026
+	db   "あなた%じゅうしょや ねんれいの"
+	next "せ", $1e, "い¯かえられます@"
+; 4a042
+
+String_0x4a042: ; 4a042
+	db  "モバイルセンター", $1d, "せつぞくするとき"
+	next "ひつような こと¯きめます@"
+; 4a062
+
+String_0x4a062: ; 4a062
+	db   "まえ%がめん ", $1d, "もどります"
+	next "@"
+; 4a071
+
+MobileMenu_InitMenuBuffers: ; 4a071 (12:6071)
+	ld hl, w2DMenuCursorInitY
+	ld a, 2
+	ld [hli], a
+	ld a, 5 ; w2DMenuCursorInitX
+	ld [hli], a
+	ld a, 5 ; w2DMenuNumRows
+	ld [hli], a
+	ld a, 1 ; w2DMenuNumCols
+	ld [hli], a
+	ld [hl], $0 ; w2DMenuFlags1
+	set 5, [hl]
+	inc hl
+	xor a ; w2DMenuFlags2
+	ld [hli], a
+	ld a, $20 ; w2DMenuFlags3
+	ld [hli], a
+	; this is a stupid way to load $c3
+	ld a, A_BUTTON
+	add D_UP
+	add D_DOWN
+	add B_BUTTON
+	ld [hli], a ; wMenuJoypadFilter
+	ld a, 1
+rept 2
+	ld [hli], a ; wMenuCursorY, wMenuCursorX
+endr
+	ret
+
+Function4a098: ; 4a098 (12:6098)
+	ld a, 2
+	call MenuClickSound
+	call PlaceHollowCursor
+	call WaitBGMap
+	call LoadStandardMenuDataHeader
+	callba Function89de0
+	call Call_ExitMenu
+	call MG_Mobile_Layout_LoadPals
+	call Function4a485
+	pop bc
+	jp Function49f16
+
+Function4a0b9: ; 4a0b9 (12:60b9)
+	ld a, 2
+	call MenuClickSound
+	pop bc
+	jp Function4a4c4
+
+Function4a0c2: ; 4a0c2 (12:60c2)
+	ld a, 2
+	call MenuClickSound
+	ld a, BANK(sPlayerData)
+	call GetSRAMBank
+	ld hl, sPlayerData + PlayerName - wPlayerData
+	ld de, PlayerName
+	ld bc, 6 ; japanese name length
+	call CopyBytes
+	call CloseSRAM
+	callba _LoadData
+	ld c, 2
+	call DelayFrames
+	ld c, $1
+	call InitMobileProfile
+	push af
+	call ClearBGPalettes
+	pop af
+	and a
+	jr nz, .skip_save
+	callba _SaveData
+.skip_save
+	ld c, 5
+	call DelayFrames
+	jr asm_4a111
+
+Function4a100: ; 4a100 (12:6100)
+	ld a, 2
+	call MenuClickSound
+	call ClearBGPalettes
+	call Function4a13b
+	call ClearBGPalettes
+	call ClearTileMap
+
+asm_4a111: ; 4a111 (12:6111)
+	pop bc
+	call LoadFontsExtra
+	jp Function49f0a
+
+Function4a118: ; 4a118 (12:6118)
+	ld hl, w2DMenuCursorInitY
+	ld a, $1
+	ld [hli], a
+	ld a, $d
+	ld [hli], a
+	ld a, $3
+	ld [hli], a
+	ld a, $1
+	ld [hli], a
+	ld [hl], $0
+	set 5, [hl]
+	inc hl
+	xor a
+	ld [hli], a
+	ld a, $20
+	ld [hli], a
+	ld a, $1
+	add $2
+	ld [hli], a
+	ld a, $1
+rept 2
+	ld [hli], a
+endr
+	ret
+
+Function4a13b: ; 4a13b (12:613b)
+	call Function4a3a7
+	call Function4a492
+	call Function4a373
+	ld c, 10
+	call DelayFrames
+
+Function4a149: ; 4a149 (12:6149)
+	hlcoord 1, 2
+	ld b, $6
+	ld c, $10
+	call Function48cdc
+	hlcoord 3, 4
+	ld de, String_4a1ef
+	call PlaceString
+	hlcoord 0, 12
+	ld b, $4
+	ld c, $12
+	call TextBox
+	ld a, [wMenuCursorY]
+	dec a
+	ld hl, Strings_4a23d
+	call GetNthString
+	ld d, h
+	ld e, l
+	hlcoord 1, 13
+	ld b, $4
+	ld c, $12
+	call ClearBox
+	hlcoord 1, 14
+	call PlaceString
+	callba Function104148
+	call SetPalettes
+	call StaticMenuJoypad
+	ld hl, wMenuCursorY
+	ld b, [hl]
+	push bc
+	jr asm_4a19d
+
+Function4a195: ; 4a195 (12:6195)
+	call ScrollingMenuJoypad
+	ld hl, wMenuCursorY
+	ld b, [hl]
+	push bc
+
+asm_4a19d: ; 4a19d (12:619d)
+	bit 0, a
+	jr nz, .asm_4a1a7
+	bit 1, a
+	jr nz, .asm_4a1ba
+	jr .asm_4a1bc
+.asm_4a1a7
+	ld hl, wMenuCursorY
+	ld a, [hl]
+	cp $1
+	jp z, Function4a20e
+	cp $2
+	jp z, Function4a221
+	ld a, $1
+	call MenuClickSound
+.asm_4a1ba
+	pop bc
+	ret
+.asm_4a1bc
+	ld hl, wMenuCursorY
+	ld a, [hl]
+	dec a
+	ld hl, Strings_4a23d
+	call GetNthString
+	ld d, h
+	ld e, l
+	hlcoord 1, 13
+	ld b, $4
+	ld c, $12
+	call ClearBox
+	hlcoord 1, 14
+	call PlaceString
+	jr .asm_4a1db
+.asm_4a1db
+	call Function4a373
+	pop bc
+	ld hl, wMenuCursorY
+	ld [hl], b
+	lb bc, 6, 1
+	hlcoord 2, 3
+	call ClearBox
+	jp Function4a195
+; 4a1ef (12:61ef)
+
+String_4a1ef: ; 4a1ef
+	db   "モバイルセンター¯えらぶ"
+	next "ログインパスワード¯いれる"
+	next "もどる@"
+; 4a20e
+
+Function4a20e: ; 4a20e (12:620e)
+	ld a, $1
+	call MenuClickSound
+	callba Function1719c8
+	call ClearBGPalettes
+	call DelayFrame
+	jr Function4a239
+
+Function4a221: ; 4a221 (12:6221)
+	ld a, $1
+	call MenuClickSound
+	call Function4a28a
+	jr c, Function4a239
+	call Function4a373
+	ld a, $2
+	ld [wMenuCursorY], a
+	jr .asm_4a235
+.asm_4a235
+	pop bc
+	jp Function4a149
+
+Function4a239: ; 4a239 (12:6239)
+	pop bc
+	jp Function4a13b
+; 4a23d (12:623d)
+
+Strings_4a23d: ; 4a23d
+	db   "いつも せつぞく¯する"
+	next "モバイルセンター¯えらびます@"
+
+	db   "モバイルセンター", $1d, "せつぞくするとき"
+	next "つかうパスワード¯ほぞんできます@"
+
+	db   "まえ%がめん ", $1d, "もどります@"
+
+	db   "@"
+; 4a28a
+
+Function4a28a: ; 4a28a (12:628a)
+	hlcoord 2, 3
+	lb bc, 6, 1
+	ld a, " "
+	call Function4a6d8
+	call PlaceHollowCursor
+	call WaitBGMap
+	call LoadStandardMenuDataHeader
+	ld a, $5
+	call GetSRAMBank
+	ld a, [$aa4b]
+	call CloseSRAM
+	and a
+	jr z, .asm_4a2df
+	hlcoord 12, 0
+	ld b, $5
+	ld c, $6
+	call Function48cdc
+	hlcoord 14, 1
+	ld de, String_4a34b
+	call PlaceString
+	callba Function104148
+	call Function4a118
+	call ScrollingMenuJoypad
+	push af
+	call PlayClickSFX
+	pop af
+	bit 1, a
+	jr nz, .asm_4a33b
+	ld a, [wMenuCursorY]
+	cp $2
+	jr z, .asm_4a2f0
+	cp $3
+	jr z, .asm_4a33b
+.asm_4a2df
+	callba Function11765d
+	call ClearBGPalettes
+	call Call_ExitMenu
+	call LoadFontsExtra
+	scf
+	ret
+.asm_4a2f0
+	call PlaceHollowCursor
+	ld hl, UnknownText_0x4a358
+	call PrintText
+	hlcoord 14, 7
+	ld b, $3
+	ld c, $4
+	call TextBox
+	callba Function104148
+	ld hl, MenuDataHeader_0x4a362
+	call LoadMenuDataHeader
+	call VerticalMenu
+	bit 1, a
+	jr nz, .asm_4a338
+	ld a, [wMenuCursorY]
+	cp $2
+	jr z, .asm_4a338
+	ld a, $5
+	call GetSRAMBank
+	ld hl, $aa4b
+	xor a
+	ld bc, $11
+	call ByteFill
+	call CloseSRAM
+	ld hl, UnknownText_0x4a35d
+	call PrintText
+	call JoyWaitAorB
+.asm_4a338
+	call ExitMenu
+.asm_4a33b
+	call Call_ExitMenu
+	callba Function104148
+	xor a
+	ret
+; 4a346 (12:6346)
+
+MenuDataHeader_0x4a346: ; 0x4a346
+	db $40 ; flags
+	db 00, 12 ; start coords
+	db 06, 19 ; end coords
+
+String_4a34b: ; 4a34b
+	db   "いれなおす"
+	next "けす"
+	next "もどる@"
+; 4a358
+
+UnknownText_0x4a358: ; 0x4a358
+	; Delete the saved LOG-IN PASSWORD?
+	text_jump UnknownText_0x1c5196
+	db "@"
+; 0x4a35d
+
+UnknownText_0x4a35d: ; 0x4a35d
+	; Deleted the LOG-IN PASSWORD.
+	text_jump UnknownText_0x1c51b9
+	db "@"
+; 0x4a362
+
+MenuDataHeader_0x4a362: ; 0x4a362
+	db $40 ; flags
+	db 07, 14 ; start coords
+	db 11, 19 ; end coords
+	dw MenuData2_0x4a36a
+	db 2 ; default option
+; 0x4a36a
+
+MenuData2_0x4a36a: ; 0x4a36a
+	db $e0 ; flags
+	db 2 ; items
+	db "はい@"
+	db "いいえ@"
+; 0x4a373
+
+Function4a373: ; 4a373 (12:6373)
+	ld hl, w2DMenuCursorInitY
+	ld a, $4
+	ld [hli], a
+	ld a, $2
+	ld [hli], a
+	ld a, $3
+	ld [hli], a
+	ld a, $1
+	ld [hli], a
+	ld [hl], $0
+	set 5, [hl]
+	inc hl
+	xor a
+	ld [hli], a
+	ld a, $20
+	ld [hli], a
+	ld a, $1
+	add $40
+	add $80
+	add $2
+	ld [hli], a
+	ld a, $1
+rept 2
+	ld [hli], a
+endr
+	ret
+; 4a39a (12:639a)
+
+Function4a39a: ; 4a39a
+	call Function4a485
+	call Function4a492
+	call Function4a3aa
+	call SetPalettes
+	ret
+; 4a3a7
+
+Function4a3a7: ; 4a3a7 (12:63a7)
+	call Function4a485
+Function4a3aa: ; 4a3aa
+	hlcoord 0, 0
+	lb bc, 3, 1
+	xor a
+	call Function4a6d8
+	lb bc, 1, 1
+	ld a, $1
+	call Function4a6d8
+	lb bc, 1, 1
+	xor a
+	call Function4a6d8
+	lb bc, 1, 1
+	ld a, $1
+	call Function4a6d8
+	lb bc, 4, 1
+	ld a, $2
+	call Function4a6d8
+	lb bc, 1, 1
+	ld a, $3
+	call Function4a6d8
+	lb bc, 1, 1
+	ld a, " "
+	call Function4a6d8
+	hlcoord 1, 0
+	ld a, $1
+	lb bc, 3, 18
+	call Function4a6d8
+	lb bc, 1, 18
+	ld a, $0
+	call Function4a6d8
+	lb bc, 1, 18
+	ld a, $1
+	call Function4a6d8
+	lb bc, 1, 18
+	ld a, $2
+	call Function4a6d8
+	lb bc, 11, 18
+	ld a, " "
+	call Function4a6d8
+	hlcoord 19, 0
+	lb bc, 3, 1
+	ld a, $0
+	call Function4a6d8
+	lb bc, 1, 1
+	ld a, $1
+	call Function4a6d8
+	lb bc, 1, 1
+	xor a
+	call Function4a6d8
+	lb bc, 1, 1
+	ld a, $1
+	call Function4a6d8
+	lb bc, 4, 1
+	ld a, $2
+	call Function4a6d8
+	lb bc, 1, 1
+	ld a, $3
+	call Function4a6d8
+	lb bc, 1, 1
+	ld a, " "
+	call Function4a6d8
+	ret
+; 4a449 (12:6449)
+
+Function4a449: ; 4a449
+	ld bc, 3 * SCREEN_WIDTH
+	ld a, $0
+	hlcoord 0, 0
+	call ByteFill
+	ld bc, 2 * SCREEN_WIDTH
+	ld a, $1
+	call ByteFill
+	ld bc, 2 * SCREEN_WIDTH
+	ld a, $0
+	call ByteFill
+	ld bc, 2 * SCREEN_WIDTH
+	ld a, $1
+	call ByteFill
+	ld bc, SCREEN_WIDTH
+	ld a, $2
+	call ByteFill
+	ld bc, SCREEN_WIDTH
+	ld a, $3
+	call ByteFill
+	ld bc, SCREEN_WIDTH
+	ld a, " "
+	call ByteFill
+	ret
+; 4a485
+
+Function4a485: ; 4a485 (12:6485)
+	ld de, GFX_49c0c
+	ld hl, VTiles2 tile $00
+	lb bc, BANK(GFX_49c0c), 13
+	call Get2bpp
+	ret
+
+Function4a492: ; 4a492 (12:6492)
+	call MG_Mobile_Layout00
+	ret
+
+
+MainMenu_MobileStudium: ; 4a496
+	ld a, [StartDay]
+	ld b, a
+	ld a, [StartHour]
+	ld c, a
+	ld a, [StartMinute]
+	ld d, a
+	ld a, [StartSecond]
+	ld e, a
+	push bc
+	push de
+	callba MobileStudium
+	call ClearBGPalettes
+	pop de
+	pop bc
+	ld a, b
+	ld [StartDay], a
+	ld a, c
+	ld [StartHour], a
+	ld a, d
+	ld [StartMinute], a
+	ld a, e
+	ld [StartSecond], a
+	ret
+; 4a4c4
+
+
+Function4a4c4: ; 4a4c4 (12:64c4)
+	call ClearBGPalettes
+	call Function4a3a7
+	call Function4a492
+	call Function4a680
+	call ClearBGPalettes
+	ld c, 20
+	call DelayFrames
+	hlcoord 2, 0
+	ld b, $a
+	ld c, $e
+	call Function48cdc
+	hlcoord 4, 2
+	ld de, String_4a5c5
+	call PlaceString
+	hlcoord 4, 4
+	ld de, String_4a5cd
+	call PlaceString
+	hlcoord 4, 6
+	ld de, String_4a5da
+	call PlaceString
+	hlcoord 4, 8
+	ld de, String_4a5e6
+	call PlaceString
+	hlcoord 4, 10
+	ld de, String_4a5f2
+	call PlaceString
+	hlcoord 0, 12
+	ld b, $4
+	ld c, $12
+	call TextBox
+	xor a
+	ld hl, Strings_4a5f6
+	ld d, h
+	ld e, l
+	hlcoord 1, 14
+	call PlaceString
+	ld a, $1
+	ld hl, Strings_4a5f6
+	call GetNthString
+	ld d, h
+	ld e, l
+	hlcoord 1, 16
+	call PlaceString
+	call WaitBGMap2
+	call SetPalettes
+	call StaticMenuJoypad
+	ld hl, wMenuCursorY
+	ld b, [hl]
+	push bc
+	jr asm_4a54d
+
+Function4a545: ; 4a545 (12:6545)
+	call ScrollingMenuJoypad
+	ld hl, wMenuCursorY
+	ld b, [hl]
+	push bc
+
+asm_4a54d: ; 4a54d (12:654d)
+	bit 0, a
+	jr nz, .asm_4a557
+	bit 1, a
+	jr nz, .asm_4a574
+	jr .asm_4a57e
+.asm_4a557
+	ld hl, wMenuCursorY
+	ld a, [hl]
+	cp $1
+	jp z, Function4a6ab
+	cp $2
+	jp z, Function4a6ab
+	cp $3
+	jp z, Function4a6ab
+	cp $4
+	jp z, Function4a6ab
+	ld a, $1
+	call MenuClickSound
+.asm_4a574
+	pop bc
+	call ClearBGPalettes
+	call ClearTileMap
+	jp Function49f0a
+.asm_4a57e
+	ld hl, wMenuCursorY
+	ld a, [hl]
+	dec a
+	add a
+	push af
+	ld hl, Strings_4a5f6
+	call GetNthString
+	ld d, h
+	ld e, l
+	hlcoord 1, 13
+	ld b, $4
+	ld c, $12
+	call ClearBox
+	hlcoord 1, 14
+	call PlaceString
+	pop af
+	inc a
+	ld hl, Strings_4a5f6
+	call GetNthString
+	ld d, h
+	ld e, l
+	hlcoord 1, 16
+	call PlaceString
+	jp Function4a5b0
+
+Function4a5b0: ; 4a5b0 (12:65b0)
+	call Function4a680
+	pop bc
+	ld hl, wMenuCursorY
+	ld [hl], b
+	ld b, $a
+	ld c, $1
+	hlcoord 3, 1
+	call ClearBox
+	jp Function4a545
+; 4a5c5 (12:65c5)
+
+String_4a5c5: ; 4a5c5
+	db "じこしょうかい@"
+String_4a5cd: ; 4a5cd
+	db "たいせん ", $4a, "はじまるとき@"
+String_4a5da: ; 4a5da
+	db "たいせん ", $1d, "かったとき@"
+String_4a5e6: ; 4a5e6
+	db "たいせん ", $1d, "まけたとき@"
+String_4a5f2: ; 4a5f2
+	db "もどる@"
+; 4a5f6
+
+Strings_4a5f6: ; 4a5f6
+	db "めいし や ニュース ", $1d, "のせる@"
+	db "あなた%あいさつです@"
+	db "モバイル たいせん", $4a, "はじまるとき@"
+	db "あいて", $1d, "みえる あいさつです@"
+	db "モバイル たいせんで かったとき@"
+	db "あいて", $1d, "みえる あいさつです@"
+	db "モバイル たいせんで まけたとき@"
+	db "あいて", $1d, "みえる あいさつです@"
+	db "まえ%がめん ", $1d, "もどります@"
+	db "@"
+; 4a680
+
+Function4a680: ; 4a680 (12:6680)
+	ld hl, w2DMenuCursorInitY
+	ld a, $2
+	ld [hli], a
+	ld a, $3
+	ld [hli], a
+	ld a, $5
+	ld [hli], a
+	ld a, $1
+	ld [hli], a
+	ld [hl], $0
+	set 5, [hl]
+	inc hl
+	xor a
+	ld [hli], a
+	ld a, $20
+	ld [hli], a
+	ld a, $1
+	add $40
+	add $80
+	add $2
+	ld [hli], a
+	ld a, $1
+rept 2
+	ld [hli], a
+endr
+	xor a
+rept 3
+	ld [hli], a
+endr
+	ret
+
+Function4a6ab: ; 4a6ab (12:66ab)
+	ld a, $2
+	call MenuClickSound
+	call ClearBGPalettes
+	ld b, SCGB_08
+	call GetSGBLayout
+	callba Function11c1ab
+	pop bc
+	call LoadFontsExtra
+	jp Function4a4c4
+
+Function4a6c5: ; 4a6c5 (12:66c5)
+	ld a, $5
+	ld [MusicFade], a
+	ld a, e
+	ld [MusicFadeIDLo], a
+	ld a, d
+	ld [MusicFadeIDHi], a
+	ld c, 22
+	call DelayFrames
+	ret
+
+Function4a6d8: ; 4a6d8 (12:66d8)
+	push bc
+	push hl
+.asm_4a6da
+	ld [hli], a
+	dec c
+	jr nz, .asm_4a6da
+	pop hl
+	ld bc, SCREEN_WIDTH
+	add hl, bc
+	pop bc
+	dec b
+	jr nz, Function4a6d8
+	ret
--- a/wram.asm
+++ b/wram.asm
@@ -44,6 +44,39 @@
 \1StatsEnd::
 ENDM
 
+red_box_struct: MACRO
+\1Species::    db
+\1HP::         dw
+\1BoxLevel::   db
+\1Status::     db
+\1Type::
+\1Type1::      db
+\1Type2::      db
+\1CatchRate::  db
+\1Moves::      ds NUM_MOVES
+\1OTID::       dw
+\1Exp::        ds 3
+\1HPExp::      dw
+\1AttackExp::  dw
+\1DefenseExp:: dw
+\1SpeedExp::   dw
+\1SpecialExp:: dw
+\1DVs::        ds 2
+\1PP::         ds NUM_MOVES
+ENDM
+
+red_party_struct: MACRO
+	red_box_struct \1
+\1Level::      db
+\1Stats::
+\1MaxHP::      dw
+\1Attack::     dw
+\1Defense::    dw
+\1Speed::      dw
+\1Special::    dw
+ENDM
+
+
 battle_struct: MACRO
 \1Species::   db
 \1Item::      db
@@ -1136,6 +1169,40 @@
 wMysteryGiftPartyTemp:: ; ds PARTY_LENGTH * (1 + 1 + NUM_MOVES)
 wMysteryGiftStaging::
 
+wLinkData:: ; ds $514
+	ds 6
+wLinkPlayerName:: ds NAME_LENGTH
+wLinkPartyCount:: ds 1
+wLinkPartySpecies:: ds PARTY_LENGTH
+wLinkPartySpeciesEnd:: ds 1
+
+wTimeCapsulePlayerData::
+wTimeCapsulePartyMon1:: red_party_struct wTimeCapsulePartyMon1
+wTimeCapsulePartyMon2:: red_party_struct wTimeCapsulePartyMon2
+wTimeCapsulePartyMon3:: red_party_struct wTimeCapsulePartyMon3
+wTimeCapsulePartyMon4:: red_party_struct wTimeCapsulePartyMon4
+wTimeCapsulePartyMon5:: red_party_struct wTimeCapsulePartyMon5
+wTimeCapsulePartyMon6:: red_party_struct wTimeCapsulePartyMon6
+wTimeCapsulePartyMonOTNames:: ds PARTY_LENGTH * NAME_LENGTH
+wTimeCapsulePartyMonNicks:: ds PARTY_LENGTH * PKMN_NAME_LENGTH
+wTimeCapsulePlayerDataEnd::
+	ds wTimeCapsulePlayerData - @
+
+wLinkPlayerData::
+wLinkPlayerPartyMon1:: party_struct wLinkPlayerPartyMon1
+wLinkPlayerPartyMon2:: party_struct wLinkPlayerPartyMon2
+wLinkPlayerPartyMon3:: party_struct wLinkPlayerPartyMon3
+wLinkPlayerPartyMon4:: party_struct wLinkPlayerPartyMon4
+wLinkPlayerPartyMon5:: party_struct wLinkPlayerPartyMon5
+wLinkPlayerPartyMon6:: party_struct wLinkPlayerPartyMon6
+wLinkPlayerPartyMonOTNames:: ds PARTY_LENGTH * NAME_LENGTH
+wLinkPlayerPartyMonNicks:: ds PARTY_LENGTH * PKMN_NAME_LENGTH
+
+	ds $357
+
+wLinkDataEnd::
+	ds wLinkData - @
+
 wc800::	ds 1
 wc801:: ds 1
 wc802:: ds 1
@@ -1514,7 +1581,9 @@
 wMenuData2::
 wMenuData2Flags:: ds 1 ; cf91
 ; bit 7: When set, start printing text one tile to the right of the border
+;        In scrolling menus, SELECT is functional
 ; bit 6: When set, start printing text one tile below the border
+;        In scrolling menus, START is functional
 ; bit 5: ????
 ; bit 4: ????
 ; bit 3: ????
@@ -1557,7 +1626,7 @@
 w2DMenuFlags1:: ds 1
 w2DMenuFlags2:: ds 1
 w2DMenuFlags3:: ds 1
-w2DMenuFlags4:: ds 1
+wMenuJoypadFilter:: ds 1
 wMenuData3End::
 
 wMenuCursorY:: ds 1