summaryrefslogtreecommitdiff
path: root/engine/menu/text_entry.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/menu/text_entry.asm')
-rw-r--r--engine/menu/text_entry.asm1050
1 files changed, 1050 insertions, 0 deletions
diff --git a/engine/menu/text_entry.asm b/engine/menu/text_entry.asm
new file mode 100644
index 0000000..b0eccb1
--- /dev/null
+++ b/engine/menu/text_entry.asm
@@ -0,0 +1,1050 @@
+INCLUDE "constants.asm"
+
+SECTION "engine/menu/text_entry.asm@naming", ROMX
+
+NAMINGSCREEN_UNDERSCORE EQU $F5
+NAMINGSCREEN_HYPHEN EQU $EF
+NAMINGSCREEN_END EQU $F0
+
+NamingScreen: ; 04:53F4
+ ld hl, wNamingScreenDestinationPointer
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, wNamingScreenType
+ ld [hl], b
+ ld hl, wce5f
+ ld a, [hl]
+ push af
+ set 4, [hl]
+ ldh a, [hMapAnims]
+ push af
+ xor a
+ ldh [hMapAnims], a
+ ldh a, [hJoyDebounceSrc]
+ push af
+ ld a, $01
+ ldh [hJoyDebounceSrc], a
+ call .SetUpNamingScreen
+ call DelayFrame
+.loop
+ call NamingScreenJoypadLoop
+ jr nc, .loop
+
+ pop af
+ ldh [hJoyDebounceSrc], a
+ pop af
+ ldh [hMapAnims], a
+ pop af
+ ld [wce5f], a
+ call ClearJoypad
+ ret
+
+.SetUpNamingScreen: ; 04:542B
+ call ClearBGPalettes
+ ld b, SGB_DIPLOMA
+ call GetSGBLayout
+ call DisableLCD
+ call LoadNamingScreenGFX
+ call NamingScreen_InitText
+ ld a, $E3
+ ldh [rLCDC], a
+ call GetNamingScreenSetup
+ call WaitBGMap
+ call WaitForAutoBgMapTransfer
+ ld a, $90
+ ldh [rBGP], a
+ ld a, $D0
+ ldh [rOBP0], a
+ call NamingScreenInitNameEntry
+ ret
+
+GetNamingScreenSetup: ; 04:5455
+; wNamingScreenType selects which entry in the table below to jump to
+ ld a, [wNamingScreenType]
+ and $07
+ ld e, a
+ ld d, 0
+ ld hl, .Jumptable
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.Jumptable: ; 04:5466
+ dw .Pokemon
+ dw .Player
+ dw .Rival
+ dw .Mom
+ dw .Box
+ dw .Pokemon
+ dw .Pokemon
+ dw .Pokemon
+
+.Pokemon: ; 04:5476
+ ld hl, Function8f0e3
+ ld a, BANK(Function8f0e3)
+ ld e, 1
+ call FarCall_hl
+ call GetPokemonName
+ hlcoord 5, 2
+ call PlaceString
+ ld l, c
+ ld h, b
+ ld de, .NicknameText
+ call PlaceString
+ call .StoreSpriteIconParams
+ ret
+
+.NicknameText ; 04:5495
+ db "のニックネームは?@"
+
+.Player: ; 04:549F
+ ld de, GoldSpriteGFX
+ call .LoadSprite
+ hlcoord 5, 2
+ ld de, .NameText
+ call PlaceString
+ call .StoreSpriteIconParams
+ ret
+
+.NameText: ; 04:54B2
+ db "あなた の なまえは?@"
+
+.Rival: ; 04:54BE
+ ld de, SilverSpriteGFX
+ call .LoadSprite
+ hlcoord 5, 2
+ ld de, .RivalText
+ call PlaceString
+ call .StoreSpriteIconParams
+ ret
+
+.RivalText: ; 04:54D1
+; the ret just preceeding this would make the first word Rival.
+ db "ライバル の なまえは?@"
+
+.Mom: ; 04:54DE
+ ld de, MomSpriteGFX
+ call .LoadSprite
+ hlcoord 5, 2
+ ld de, .MomText
+ call PlaceString
+ call .StoreSpriteIconParams
+ ret
+
+.MomText: ; 04:54F1
+ db "ははおや の なまえは?@"
+
+.Box: ; 04:54FE
+ ld de, PokeBallSpriteGFX
+ ld hl, vChars0
+ lb bc, BANK(PokeBallSpriteGFX), $04
+ call Request2bpp
+ ld a, $08
+ ld hl, wTileMapBackup
+ ld [hl+], a
+ ld [hl], $00
+ ld de, $2420
+ ld a, $41
+ call InitSpriteAnimStruct
+ ld hl, $0001
+ add hl, bc
+ ld [hl], $00
+ hlcoord 5, 2
+ ld de, .BoxText
+ call PlaceString
+ call .StoreBoxIconParams
+ ret
+
+.BoxText: ; 04:552D
+ db "バンク の なまえは?@"
+
+.LoadSprite: ; 04:5539
+; copies the sprite at de into the top of VRAM, as well as the sprite $C0 after de
+ push de
+ ld hl, vChars0
+ lb bc, BANK(GoldSpriteGFX), $04
+ call Request2bpp
+ pop de
+ ld hl, $00C0
+ add hl, de
+ ld e, l
+ ld d, h
+ ld hl, vChars0 tile 4
+ lb bc, BANK(GoldSpriteGFX), $04
+ call Request2bpp
+ ld a, $08
+ ld hl, wTileMapBackup
+ ld [hli], a
+ ld [hl], $00
+ ld de, $2420
+ ld a, $41
+ call InitSpriteAnimStruct
+ ret
+
+.StoreSpriteIconParams: ; 04:5564
+ ld a, $05
+ ld [wNamingScreenMaxNameLength], a
+ hlcoord 6, 5
+ ld a, l
+ ld [wNamingScreenStringEntryCoordY], a
+ ld a, h
+ ld [wNamingScreenStringEntryCoordX], a
+ ret
+
+.StoreBoxIconParams: ; 04:5575
+ ld a, $08
+ ld [wNamingScreenMaxNameLength], a
+ hlcoord 5, 5
+ ld a, l
+ ld [wNamingScreenStringEntryCoordY], a
+ ld a, h
+ ld [wNamingScreenStringEntryCoordX], a
+ ret
+
+NamingScreen_InitText: ; 04:5586
+; fills the tilemap with ■, then clears a 12x17 box at 1,1
+; next it places the tiles at 04:58B3 onto the screen at 2,9 (tiles form an 11x8 box)
+ call WaitForAutoBgMapTransfer
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, "■"
+ call ByteFill
+ hlcoord 1, 1
+ lb bc, $07, $12
+ call ClearBox
+ hlcoord 1, 9
+ lb bc, $08, $12
+ call ClearBox
+ hlcoord 2, 9
+ ld de, TextEntryChars
+ ld b, $08
+
+.outerloop
+ ld c, $11
+
+.innerloop
+ ld a, [de]
+ ld [hl+], a
+ inc de
+ dec c
+ jr nz, .innerloop
+
+ inc hl
+ inc hl
+ inc hl
+ dec b
+ jr nz, .outerloop
+ ret
+
+
+NamingScreenJoypadLoop: ; 04:55BD
+ call GetJoypadDebounced
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .leap
+ call .RunJumpTable
+ callba PlaySpriteAnimationsAndDelayFrame
+ call .UpdateStringEntry
+ call DelayFrame
+ and a
+ ret
+
+.leap ; 04:55DA
+; kills sprites and resets screen position
+ callab InitEffectObject
+ call ClearSprites
+ xor a
+ ldh [hSCX], a
+ ldh [hSCY], a
+ scf
+ ret
+
+.UpdateStringEntry: ; 04:55EC
+; sets BGMapMode to 0, then loads a string and coords out of a buffer and displays it.
+; BGMapMode is then set to 1.
+ xor a
+ ldh [hBGMapMode], a
+ hlcoord 1, 3
+ lb bc, $05, $12
+ call ClearBox
+ ld hl, wNamingScreenDestinationPointer
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, wNamingScreenStringEntryCoordY
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call PlaceString
+ ld a, $01
+ ldh [hBGMapMode], a
+ ret
+
+.RunJumpTable: ; 04:560C
+ ld a, [wJumptableIndex]
+ ld e, a
+ ld d, $00
+ ld hl, .JumpTable
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.JumpTable: ; 04:561B
+ dw .InitCursor
+ dw .ReadButtons
+
+.InitCursor: ; 04:561F
+ ld de, $5818
+ ld a, $39
+ call InitSpriteAnimStruct
+ ld a, c
+ ld [wNamingScreenCursorObjectPointer], a
+ ld a, b
+ ld [wNamingScreenCursorObjectPointer + 1], a
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+
+.ReadButtons: ; 04:5634
+; if A or B were pressed, clear hJoypadSum after calling functions; if start, set 7 in the jumptable??
+ ld hl, hJoypadSum
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .jumpa
+ ld a, [hl]
+ and B_BUTTON
+ jr nz, .jumpb
+ ld a, [hl]
+ and START
+ jr nz, .jumpstart
+ ret
+
+.jumpa ; 04:5647
+ call NamingScreenGetLastCharacter
+ cp NAMINGSCREEN_END
+ jr z, .jumpstart
+ call NamingScreenTryAddCharacter
+ xor a
+ ldh [hJoypadSum], a
+ ret
+
+.jumpb ; 04:5655
+ call NamingScreenDeleteCharacter
+ xor a
+ ldh [hJoypadSum], a
+ ret
+
+.jumpstart ; 04:565C
+ call NamingScreenStoreEntry
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+.GetDPad: ; 04:5665
+ ld hl, hJoySum
+ ld a, [hl]
+ and D_UP
+ jr nz, .upjump
+ ld a, [hl]
+ and D_DOWN
+ jr nz, .downjump
+ ld a, [hl]
+ and D_LEFT
+ jr nz, .leftjump
+ ld a, [hl]
+ and D_RIGHT
+ jr nz, .rightjump
+ ret
+
+.rightjump ; 04:567D
+ ld hl, $000C
+ add hl, bc
+ ld a, [hl]
+ cp $0E
+ jr nc, .skip1
+ inc [hl]
+ jr .escape
+
+.skip1
+ ld [hl], $00
+ jr .escape
+
+.leftjump
+ ld hl, $000C
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .skip2
+ dec [hl]
+ jr .escape
+.skip2
+ ld [hl], $0E
+ jr .escape
+
+.downjump
+ ld hl, $000D
+ add hl, bc
+ ld a, [hl]
+ cp $07
+ jr nc, .skip3
+ inc [hl]
+ jr .escape
+.skip3
+ ld [hl], $00
+ jr .escape
+
+.upjump ; 04:56AC :24
+ ld hl, $000D
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .skip4
+ dec [hl]
+ jr .escape
+.skip4
+ ld [hl], $07
+ jr .escape
+.escape
+ ld hl, $000C
+ add hl, bc
+ ld e, [hl]
+ ld d, $00
+ ld hl, LetterOffsetsTable1
+ add hl, de
+ ld a, [hl]
+ ld hl, $0006
+ add hl, bc
+ ld [hl], a
+ ld hl, $000D
+ add hl, bc
+ ld e, [hl]
+ ld d, $00
+ ld hl, LetterOffsetsTable2
+ add hl, de
+ ld a, [hl]
+ ld hl, $0007
+ add hl, bc
+ ld [hl], a
+ ret
+
+LetterOffsetsTable1: ; 04:56DE
+ db $00, $08, $10, $18, $20, $30, $38, $40, $48, $50, $60, $68, $70, $78, $80
+
+LetterOffsetsTable2:; 04:56ED
+ db $00, $08, $10, $18, $20, $28, $30, $38
+
+NamingScreenTryAddCharacter: ; 04:56F5
+ ld a, [wNamingScreenLastCharacter]
+ ld hl, Dakutens
+ cp "゙"
+ jr z, .jump
+ ld hl, Handakutens
+ cp "゚"
+ jr z, .jump
+ ld a, [wNamingScreenMaxNameLength]
+ ld c, a
+ ld a, [wNamingScreenCurNameLength]
+ cp c
+ ret nc
+ ld a, [wNamingScreenLastCharacter]
+ call NamingScreenGetTextCursorPosition
+ ld [hl], a
+ ld hl, wNamingScreenCurNameLength
+ inc [hl]
+ call NamingScreenGetTextCursorPosition
+ ld a, [hl]
+ cp "@"
+ ret z
+ ld [hl], NAMINGSCREEN_UNDERSCORE
+ ret
+
+.jump ; 04:5724
+ ld a, [wNamingScreenCurNameLength]
+ and a
+ ret z
+ push hl
+ ld hl, wNamingScreenCurNameLength
+ dec [hl]
+ call NamingScreenGetTextCursorPosition
+ ld c, [hl]
+ pop hl
+.loop
+ ld a, [hli]
+ cp $FF
+ jr z, .notherjump
+ cp c
+ jr z, .skip
+ inc hl
+ jr .loop
+.skip
+ ld a, [hl]
+ call NamingScreenGetTextCursorPosition
+ ld [hl], a
+.notherjump
+ ld hl, wNamingScreenCurNameLength
+ inc [hl]
+ ret
+
+Dakutens: ; 04:5748
+ db "かがきぎくぐけげこご"
+ db "さざしじすずせぜそぞ"
+ db "ただちぢつづてでとど"
+ db "はばひびふぶへべほぼ"
+ db "カガキギクグケゲコゴ"
+ db "サザシジスズセゼソゾ"
+ db "タダチヂツヅテデトド"
+ db "ハバヒビフブへべホボ"
+ db $FF
+
+Handakutens: ; 04:5799
+ db "はぱひぴふぷへぺほぽ"
+ db "ハパヒピフプへぺホポ"
+ db $FF
+
+NamingScreenDeleteCharacter: ; 04:57AE
+ ld hl, wNamingScreenCurNameLength
+ ld a, [hl]
+ and a
+ ret z
+ dec [hl]
+ call NamingScreenGetTextCursorPosition
+ ld [hl], NAMINGSCREEN_UNDERSCORE
+ inc hl
+ ld a, [hl]
+ cp NAMINGSCREEN_UNDERSCORE
+ ret nz
+ ld [hl], NAMINGSCREEN_HYPHEN
+ ret
+
+NamingScreenGetTextCursorPosition: ; 04:57C2
+ push af
+ ld hl, wNamingScreenDestinationPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wNamingScreenCurNameLength]
+ ld e, a
+ ld d, $00
+ add hl, de
+ pop af
+ ret
+
+NamingScreenInitNameEntry: ; 04:57D2
+ ld hl, wNamingScreenDestinationPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld [hl], NAMINGSCREEN_UNDERSCORE
+ inc hl
+ ld a, [wNamingScreenMaxNameLength]
+ dec a
+ ld c, a
+ ld a, NAMINGSCREEN_HYPHEN
+.loop
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ ld [hl], "@"
+ ret
+
+NamingScreenStoreEntry: ; 04:57E9
+ ld hl, wNamingScreenDestinationPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wNamingScreenMaxNameLength]
+ ld c, a
+.loop
+ ld a, [hl]
+ cp NAMINGSCREEN_HYPHEN
+ jr z, .terminator
+ cp NAMINGSCREEN_UNDERSCORE
+ jr nz, .notterminator
+.terminator
+ ld [hl], "@"
+.notterminator
+ inc hl
+ dec c
+ jr nz, .loop
+ ret
+
+NamingScreenGetLastCharacter: ; 04:5803
+ ld hl, wNamingScreenCursorObjectPointer
+ ld c, [hl]
+ inc hl
+ ld b, [hl]
+ ld hl, $0006
+ add hl, bc
+ ld a, [hl]
+ ld hl, $0004
+ add hl, bc
+ add a, [hl]
+ sub $08
+ srl a
+ srl a
+ srl a
+ ld e, a
+ ld hl, $0007
+ add hl, bc
+ ld a, [hl]
+ ld hl, $0005
+ add hl, bc
+ add a, [hl]
+ sub $10
+ srl a
+ srl a
+ srl a
+ ld d, a
+ hlcoord 0, 0
+ ld bc, $0014
+.loop
+ ld a, d
+ and a
+ jr z, .done
+ add hl, bc
+ dec d
+ jr .loop
+
+.done
+ add hl, de
+ ld a, [hl]
+ ld [wNamingScreenLastCharacter], a
+ ret
+
+LoadNamingScreenGFX: ; 04:5843
+ call ClearSprites
+ callab InitEffectObject
+ call LoadFont
+
+ ld de, TextScreenGFX_End
+ ld hl, vChars1 tile $70
+ lb bc, BANK(TextScreenGFX_End), 1
+ call Get1bpp
+
+ ld de, TextScreenGFX_Hyphen
+ ld hl, vChars1 tile $6F
+ lb bc, BANK(TextScreenGFX_Hyphen), 1
+ call Get1bpp
+
+ ld de, TextScreenGFX_Underscore
+ ld hl, vChars1 tile $75
+ lb bc, BANK(TextScreenGFX_Underscore), 1
+ call Get1bpp
+
+ ld de, vChars2 tile $60
+ ld hl, TrainerCardGFX
+ ld bc, $10
+ ld a, BANK(TrainerCardGFX)
+ call FarCopyData
+
+ ld de, vChars0 tile $7f
+ ld hl, PokedexBorderGFX
+ ld bc, $10
+ ld a, BANK(PokedexBorderGFX)
+ call FarCopyData
+
+ ld a, $26
+ ld hl, wc41a
+ ld [hli], a
+ ld [hl], $7F
+ xor a
+ ldh [hSCY], a
+ ld [wc4c7], a
+ ldh [hSCX], a
+ ld [wc4c8], a
+ ld [wJumptableIndex], a
+ ldh [hBGMapMode], a
+ ld [wNamingScreenCurNameLength], a
+ ldh [hJoypadSum], a
+ ld a, $07
+ ldh [hWX], a
+ ret
+
+SECTION "engine/menu/text_entry.asm@mail", ROMX
+
+ComposeMailMessage: ; 04:59EB
+ ld hl, wNamingScreenDestinationPointer
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ldh a, [hMapAnims]
+ push af
+ xor a
+ ldh [hMapAnims], a
+ ldh a, [hJoyDebounceSrc]
+ push af
+ ld a, 1
+ ldh [hJoyDebounceSrc], a
+ xor a
+ ld [wFlyDestination], a
+.outerloop
+ call .firstruncheck
+ call DelayFrame
+.innerloop
+ call DoMailEntry
+ jr nc, .innerloop
+
+ ld a, [wFlyDestination]
+ bit 7, a
+ jr nz, .outerloop
+
+ pop af
+ ldh [hJoyDebounceSrc], a
+ pop af
+ ldh [hMapAnims], a
+ ret
+
+.firstruncheck; 04:5A1B
+ ld hl, wFlyDestination
+ ld a, [hl]
+ and 1
+ ld [hl], a
+ jr z, .skip
+ call SetupMail
+ ret
+.skip
+ call .InitBlankMail
+ ret
+
+.InitBlankMail: ; 04:5A2C
+ call ClearBGPalettes
+ ld b, 8 ;diploma?
+ call GetSGBLayout
+ call DisableLCD
+ call LoadNamingScreenGFX
+ ld de, vChars0
+ ld hl, MailIconGFX
+ ld bc, $0080
+ ld a, BANK(MailIconGFX)
+ call FarCopyData
+ ld a, 8
+ ld hl, wTileMapBackup
+ ld [hli], a
+ ld [hl], 0
+ ld de, $2420
+ ld a, 8
+ call InitSpriteAnimStruct
+ ld hl, $0002
+ add hl, bc
+ ld [hl], 0
+ ld de, $5818
+ ld a, $39
+ call InitSpriteAnimStruct
+ ld a, c
+ ld [wNamingScreenCursorObjectPointer], a
+ ld a, b
+ ld [wNamingScreenCursorObjectPointer + 1], a
+ call InitCharSet
+ ld a, $E3
+ ldh [rLCDC], a
+ call InitMailText
+ call WaitBGMap
+ call WaitForAutoBgMapTransfer
+ ld a, $90
+ ldh [rBGP], a
+ ld a, $E4
+ ldh [rOBP0], a
+ call NamingScreenInitNameEntry
+ ld hl, wNamingScreenDestinationPointer
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, $0010
+ add hl, de
+ ld [hl], "<NEXT>"
+ ret
+
+InitMailText: ; 04:5A96
+ hlcoord 5, 2
+ ld de, MailPromptText
+ call PlaceString
+ ld a, $21
+ ld [wNamingScreenMaxNameLength], a
+ ret
+
+MailPromptText: ; 04:5AA5
+ db "メールを かいてね@"
+
+InitCharSet: ; 04:5AAF
+ call WaitForAutoBgMapTransfer
+ ld hl, wTileMap
+ lb bc, $01, $68
+ ld a, $60
+ call ByteFill
+ hlcoord 1, 1
+ lb bc, $07, $12
+ call ClearBox
+ hlcoord 1, 9
+ lb bc, $08, $12
+ call ClearBox
+ hlcoord 2, 9
+ ld de, TextEntryChars
+ ld b, $8
+.outerloop
+ ld c, $11
+.innerloop
+ ld a, [de]
+ ld [hli], a
+ inc de
+ dec c
+ jr nz, .innerloop
+ inc hl
+ inc hl
+ inc hl
+ dec b
+ jr nz, .outerloop
+ ret
+
+DoMailEntry: ; 04:5AE6
+ call GetJoypadDebounced
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .exit_mail
+ ld a, [wFlyDestination]
+ bit 7, a
+ jr nz, .exit_mail
+ call .DoJumpTable
+ callba PlaySpriteAnimationsAndDelayFrame
+ call .Update
+ call DelayFrame
+ and a
+ ret
+
+.exit_mail ; 04:5B0A
+ callab InitEffectObject
+ call ClearSprites
+ xor a
+ ldh [hSCX], a
+ ldh [hSCY], a
+ scf
+ ret
+
+.Update: ; 04:5B1C
+ xor a
+ ldh [hBGMapMode], a
+ hlcoord 1, 3
+ lb bc, $04, $12
+ call ClearBox
+ ld hl, wNamingScreenDestinationPointer
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ hlcoord 2, 4
+ call PlaceString
+ ld a, 1
+ ldh [hBGMapMode], a
+ ret
+
+.DoJumpTable: ; 04:5B39
+ ld a, [wJumptableIndex]
+ ld e, a
+ ld d, 0
+ ld hl, .Jumptable
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.Jumptable: ; 04:5B48
+ dw .blinkcursor
+ dw .processjoypad
+
+.blinkcursor ; 04:5B4C
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+
+.processjoypad; 04:5B51
+ ld hl, hJoypadSum
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .ajump
+ ld a, [hl]
+ and B_BUTTON
+ jr nz, .bjump
+ ld a, [hl]
+ and START
+ jr nz, .startjump
+ ld a, [hl]
+ and SELECT
+ jr nz, .selectjump
+ ret
+
+.ajump ; 04:5B69
+ call NamingScreenGetLastCharacter
+ cp "円"
+ jr z, .startjump
+ call NamingScreenTryAddCharacter
+ xor a
+ ldh [hJoypadSum], a
+ ld hl, wNamingScreenCurNameLength
+ ld a, [hl]
+ cp $10 ; mail line length?
+ ret nz
+ inc [hl]
+ call NamingScreenGetTextCursorPosition
+ ld [hl], "♀"
+ dec hl
+ ld [hl], "<NEXT>"
+ ret
+.bjump
+ call NamingScreenDeleteCharacter
+ xor a
+ ldh [hJoypadSum], a
+ ld hl, wNamingScreenCurNameLength
+ ld a, [hl]
+ cp $10
+ ret nz
+ dec [hl]
+ call NamingScreenGetTextCursorPosition
+ ld [hl], "♀"
+ inc hl
+ ld [hl], "<NEXT>"
+ ret
+.startjump
+ call NamingScreenStoreEntry
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+.selectjump
+ ld hl, wFlyDestination
+ ld a, [hl]
+ xor 01
+ ld [hl], a
+ set 7, [hl]
+ ret
+
+SECTION "engine/menu/text_entry.asm@mail2", ROMX
+
+SetupMail: ; 04:5C31
+ call ClearBGPalettes
+ ld b, 8
+ call GetSGBLayout
+ call DisableLCD
+ call LoadNamingScreenGFX
+ ld de, vChars1
+ ld hl, BoldAlphabetGFX
+ ld bc, $2e tiles
+ ld a, BANK(BoldAlphabetGFX)
+ call FarCopyDataDouble
+ ld de, vChars0
+ ld hl, MailIconGFX
+ lb bc, $00, $80
+ ld a, BANK(MailIconGFX)
+ call FarCopyData
+ ld a, 8
+ ld hl, wTileMapBackup
+ ld [hli], a
+ ld [hl], 0
+ ld de, $2420
+ ld a, 8
+ call InitSpriteAnimStruct
+ ld hl, $0002
+ add hl, bc
+ ld [hl], 0
+ ld de, $6018
+ ld a, $40
+ call InitSpriteAnimStruct
+ ld a, c
+ ld [wNamingScreenCursorObjectPointer], a
+ ld a, b
+ ld [wNamingScreenCursorObjectPointer + 1], a
+ call DrawMail
+ ld a, $E3
+ ldh [rLCDC], a
+ call DrawMailLoadedText
+ call WaitBGMap
+ call WaitForAutoBgMapTransfer
+ ld a, $90
+ ldh [rBGP], a
+ ld a, $E4
+ ldh [rOBP0], a
+ call NamingScreenInitNameEntry
+ ld hl, wNamingScreenDestinationPointer
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, $0010
+ add hl, de
+ ld [hl], "<NEXT>"
+ ret
+
+DrawMailLoadedText: ; 04:5CA9
+ hlcoord 5, 2
+ ld de, MailLoadedText
+ call PlaceString
+ ld a, $21
+ ld [wNamingScreenMaxNameLength], a
+ ret
+
+MailLoadedText: ; 04:5CB8
+ db "スアケシ!!!@" ; should be "MAIL!!!" since the bold english font is loaded into vChars1
+
+DrawMail: ; 04:5CC0
+ call WaitForAutoBgMapTransfer
+ hlcoord 0, 0
+ lb bc, $01, $68
+ ld a, "■"
+ call ByteFill
+ hlcoord 1, 1
+ lb bc, $07, $12
+ call ClearBox
+ hlcoord 1, 9
+ lb bc, $08, $12
+ call ClearBox
+ hlcoord 2, 10
+ ld a, $80
+ call DrawMailRow
+ hlcoord 2, 13
+ ld a, $A0
+ call DrawMailRow
+ hlcoord 2, 16
+ ld de, MailTextExtra
+ ld c, $10
+ call DrawMailTextExtra
+ ret
+
+DrawMailRow: ; 04:5CFC
+ ld c, $07
+ call .loop
+ inc hl
+ inc hl
+ ld c, $07
+ call .loop
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ ld c, $07
+ call .loop
+ inc hl
+ inc hl
+ ld c, $05
+
+.loop ; 04:5D15
+ ld [hli], a
+ inc a
+ dec c
+ jr nz, .loop
+ ret
+
+DrawMailTextExtra: ; 04:5D1B
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, DrawMailTextExtra
+ ret
+
+MailTextExtra: ; 04:5D22
+ db "?!12345  67890ー円"
+ \ No newline at end of file