summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorxCrystal <rgr.crystal@gmail.com>2019-06-30 18:10:42 +0200
committerGitHub <noreply@github.com>2019-06-30 18:10:42 +0200
commit880d8b42d8013dd2fc1f4a7424f9621c137cee6b (patch)
tree5b9990d43df4387e67ac5fed7f93e7d6022bdeef /src
parentb82a3d3d0fd0cfa8d378883dca582cbee1d0b1f8 (diff)
parenta6329757914a3137a5d71b83d522aaeadaf227e6 (diff)
Merge pull request #51 from jidoc01/master
Disassemble bank 6
Diffstat (limited to 'src')
-rw-r--r--src/constants.asm3
-rw-r--r--src/constants/name_constants.asm6
-rw-r--r--src/engine/bank01.asm9
-rw-r--r--src/engine/bank02.asm31
-rw-r--r--src/engine/bank04.asm51
-rw-r--r--src/engine/bank06.asm2688
-rw-r--r--src/engine/home.asm4
-rw-r--r--src/macros/data.asm2
-rw-r--r--src/sram.asm8
-rw-r--r--src/text/text2.asm6
-rw-r--r--src/text/text_offsets.asm6
-rw-r--r--src/wram.asm70
12 files changed, 2807 insertions, 77 deletions
diff --git a/src/constants.asm b/src/constants.asm
index 926f8d6..cad6cae 100644
--- a/src/constants.asm
+++ b/src/constants.asm
@@ -13,4 +13,5 @@ INCLUDE "constants/npc_constants.asm"
INCLUDE "constants/sgb_constants.asm"
INCLUDE "constants/sprite_constants.asm"
INCLUDE "constants/text_constants.asm"
-INCLUDE "constants/charmaps.asm"
+INCLUDE "constants/name_constants.asm"
+INCLUDE "constants/charmaps.asm" \ No newline at end of file
diff --git a/src/constants/name_constants.asm b/src/constants/name_constants.asm
new file mode 100644
index 0000000..7d4370c
--- /dev/null
+++ b/src/constants/name_constants.asm
@@ -0,0 +1,6 @@
+NAME_BUFFER_LENGTH EQU 16
+
+MAX_PLAYER_NAME_LENGTH EQU 6 * 2
+MAX_DECK_NAME_LENGTH EQU 20 * 1 ; note that its unit is byte!
+
+NAMING_SCREEN_BUFFER_LENGTH EQU 24 \ No newline at end of file
diff --git a/src/engine/bank01.asm b/src/engine/bank01.asm
index 368e578..3c6e3f1 100644
--- a/src/engine/bank01.asm
+++ b/src/engine/bank01.asm
@@ -3695,6 +3695,7 @@ DisplayCardPageOnLeftOrRightPressed: ; 57cd (1:57cd)
ret
; 0x57df
+Func_57df:
INCROM $57df, $5892
; display the previous valid card page
@@ -6111,7 +6112,7 @@ DuelDataToSave: ; 6729 (1:6729)
; dw address, number_of_bytes_to_copy
dw wPlayerDuelVariables, wOpponentDuelVariables - wPlayerDuelVariables
dw wOpponentDuelVariables, wPlayerDeck - wOpponentDuelVariables
- dw wPlayerDeck, wc500 + $10 - wPlayerDeck
+ dw wPlayerDeck, wNameBuffer + $10 - wPlayerDeck
dw wWhoseTurn, wDuelTheme + $1 - wWhoseTurn
dw hWhoseTurn, $1
dw wRNG1, wRNGCounter + $1 - wRNG1
@@ -7748,7 +7749,7 @@ Func_7494: ; 7494 (1:7494)
ld a, $02
ld [wLoadedMoveAnimation], a
.asm_74d1
- farcall $6, $4f9c
+ farcall Func_006_4f9c
pop bc
pop de
pop hl
@@ -7773,12 +7774,12 @@ Func_758f: ; 758f (1:758f)
INCROM $758f, $7594
Func_7594: ; 7594 (1:7594)
- farcall $6, $661f
+ farcall Func_1a61f
ret
; 0x7599
Func_7599: ; 7599 (1:7599)
- farcall $6, $668d
+ farcall Func_006_668d
ret
; 0x759e
diff --git a/src/engine/bank02.asm b/src/engine/bank02.asm
index 509a1e9..232fa98 100644
--- a/src/engine/bank02.asm
+++ b/src/engine/bank02.asm
@@ -254,25 +254,26 @@ Func_8f05: ; 8f05 (2:4f05)
ld a, [wceb1]
or a
jr nz, .asm_8f10
- ld hl, Unknown_a763
+ ; it refers to a data in the other bank without any bank desc.
+ ld hl, Deck1Data
jr .asm_8f23
.asm_8f10
dec a
jr nz, .asm_8f18
- ld hl, Unknown_a76c
+ ld hl, Deck2Data
jr .asm_8f23
.asm_8f18
dec a
jr nz, .asm_8f20
- ld hl, Unknown_a775
+ ld hl, Deck3Data
jr .asm_8f23
.asm_8f20
- ld hl, Unknown_a77e
+ ld hl, Deck4Data
.asm_8f23
- ld a, $14
- ld bc, $0401
+ ld a, MAX_DECK_NAME_LENGTH
+ lb bc, 4, 1
ld de, wcfb9
- farcall Func_1ad89
+ farcall InputDeckName
ld a, [wcfb9]
or a
ret nz
@@ -789,19 +790,7 @@ Func_9e41: ; 9e41 (2:5e41)
INCROM $9e41, $a288
Func_a288: ; a288 (2:6288)
- INCROM $a288, $a763
-
-Unknown_a763: ; a763 (2:6763)
- INCROM $a763, $a76c
-
-Unknown_a76c: ; a76c (2:676c)
- INCROM $a76c, $a775
-
-Unknown_a775: ; a775 (2:6775)
- INCROM $a775, $a77e
-
-Unknown_a77e: ; a77e (2:677e)
- INCROM $a77e, $b177
+ INCROM $a288, $b177
Func_b177: ; b177 (2:7177)
INCROM $b177, $b19d
@@ -935,7 +924,7 @@ Func_ba04: ; ba04 (2:7a04)
ldtx hl, PleaseSelectDeckText
call DrawWideTextBox_PrintText
ld a, $5
- ld [wcea9], a
+ ld [wNamingScreenKeyboardHeight], a
ld hl, $73fe
ld d, h
ld a, l
diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm
index 6d29486..ffbef50 100644
--- a/src/engine/bank04.asm
+++ b/src/engine/bank04.asm
@@ -160,7 +160,7 @@ BoosterPack_1031b: ; 1031b (4:431b)
ld [wVBlankOAMCopyToggle], a
ld a, $4
ld [wTextBoxFrameType], a
- farcall $1, $7599
+ farcall Func_7599
farcall Func_c1a4
call DoFrameIfLCDEnabled
pop af
@@ -1110,7 +1110,7 @@ MainMenuFunctionTable:
MainMenu_NewGame: ; 12704 (4:6704)
farcall Func_c1b1
- call Func_128a9
+ call DisplayPlayerNamingScreen
farcall Func_1996e
call EnableSRAM
ld a, [s0a007]
@@ -1180,8 +1180,51 @@ Func_12871: ; 12871 (4:6871)
Func_1288c: ; 1288c (4:688c)
INCROM $1288c, $128a9
-Func_128a9: ; 128a9 (4:68a9)
- INCROM $128a9, $1296e
+DisplayPlayerNamingScreen:: ; 128a9 (4:68a9)
+ ; clear the name buffer.
+ ld hl, wNameBuffer ; c500: name buffer.
+ ld bc, NAME_BUFFER_LENGTH
+ ld a, TX_END
+ call FillMemoryWithA
+
+ ; get player's name
+ ; from the user into hl.
+ ld hl, wNameBuffer
+ farcall InputPlayerName
+
+ farcall Func_c1a4
+ call DoFrameIfLCDEnabled
+ call DisableLCD
+ ld hl, wNameBuffer
+ ; get the first byte of the name buffer.
+ ld a, [hl]
+ or a
+ ; check if anything typed.
+ jr nz, .no_name
+ ld hl, .data
+.no_name
+ ; set the default name.
+ ld de, sPlayerName
+ ld bc, NAME_BUFFER_LENGTH
+ call EnableSRAM
+ call CopyDataHLtoDE_SaveRegisters
+ ; it seems for integrity checking.
+ call UpdateRNGSources
+ ld [sPlayerName+$e], a
+ call UpdateRNGSources
+ ld [sPlayerName+$f], a
+ call DisableSRAM
+ ret
+.data
+ ; "MARK": default player name.
+ ; last two bytes are reserved for RNG.
+ textfw3 "M", "A", "R", "K"
+rept 6
+ done
+endr
+ db $10, $12
+Unknown_128fb: ; 128fb
+ INCROM $128fb, $1296e
Func_1296e: ; 1296e (4:696e)
INCROM $1296e, $1299f
diff --git a/src/engine/bank06.asm b/src/engine/bank06.asm
index 9cda475..5c61c8d 100644
--- a/src/engine/bank06.asm
+++ b/src/engine/bank06.asm
@@ -148,11 +148,1033 @@ Func_18086: ; 18086 (6:4086)
; 0x180d5
Func_180d5: ; 180d5 (6:40d5)
- INCROM $180d5, $186f7
+ ld a, $05
+ ld [$ce52], a
+.asm_006_40da
+ xor a
+ ld [wcea3], a
+ farcall $2, $42ce
+ call EnableLCD
+ call IsClairvoyanceActive
+ jr c, .asm_006_40ef
+ ld de, $42db
+ jr .asm_006_40f2
+.asm_006_40ef
+ ld de, $434b
+.asm_006_40f2
+ ld hl, $ce53
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld a, [$ce52]
+ call .asm_006_4171
+.asm_006_40fe
+ ld a, $01
+ ld [wVBlankOAMCopyToggle], a
+ call DoFrame
+ ldh a, [hDPadHeld]
+ and $08
+ jr nz, .asm_006_4153
+ ld a, [wce60]
+ or a
+ jr z, .asm_006_4118
+ ldh a, [hDPadHeld]
+ and $04
+ jr nz, .asm_006_4148
+.asm_006_4118
+ ld a, [$ce52]
+ ld [$ce58], a
+ call Func_006_43bb
+ jr c, .asm_006_4139
+ ld a, [$ce52]
+ cp $10
+ jp z, .asm_006_41f8
+ cp $11
+ jp z, .asm_006_4210
+ ld hl, $ce58
+ cp [hl]
+ call nz, .asm_006_4171
+ jr .asm_006_40fe
+.asm_006_4139
+ cp $ff
+ jr nz, .asm_006_4153
+ call Func_006_44bf
+ lb de, $38, $9f
+ call SetupText
+ scf
+ ret
+.asm_006_4148
+ call Func_006_44bf
+ lb de, $38, $9f
+ call SetupText
+ or a
+ ret
+.asm_006_4153
+ call Func_006_44bf
+ lb de, $38, $9f
+ call SetupText
+ ld a, [$ce52]
+ ld [$ce57], a
+ ld hl, .jump_table
+ call JumpToFunctionInTable
+ ld a, [$ce57]
+ ld [$ce52], a
+ jp .asm_006_40da
+.asm_006_4171 ; 18171 (6:4171)
+ push af
+ lb de, 1, 17
+ call InitTextPrinting
+ ldtx hl, Text0251
+ call ProcessTextFromID
+ ld hl, hffb0
+ ld [hl], $01
+ ldtx hl, Text024e
+ call ProcessTextFromID
+ ld hl, hffb0
+ ld [hl], $00
+ lb de, 1, 17
+ call InitTextPrinting
+ pop af
+ ld hl, Data_006_42bb
+ ld b, 0
+ sla a
+ ld c, a
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, h
+ or a
+ jr nz, .asm_006_41e3
+ ld a, l
+ cp $06
+ jr nc, .asm_006_41e3
+ ld a, [$ce52]
+ cp $06
+ jr nc, .asm_006_41c2
+ ld a, l
+ add DUELVARS_ARENA_CARD
+ call GetTurnDuelistVariable
+ cp -1
+ ret z
+ call GetCardIDFromDeckIndex
+ call LoadCardDataToBuffer1_FromCardID
+ jr .asm_006_41d7
+.asm_006_41c2
+ ld a, l
+ add DUELVARS_ARENA_CARD
+ call GetNonTurnDuelistVariable
+ cp -1
+ ret z
+ call SwapTurn
+ call GetCardIDFromDeckIndex
+ call LoadCardDataToBuffer1_FromCardID
+ call SwapTurn
+.asm_006_41d7
+ ld a, 18
+ call CopyCardNameAndLevel
+ ld hl, wDefaultText
+ call ProcessText
+ ret
+.asm_006_41e3
+ ld a, [$ce52]
+ cp $08
+ jr nc, .asm_006_41ee
+ call PrintTextNoDelay
+ ret
+.asm_006_41ee
+ call SwapTurn
+ call PrintTextNoDelay
+ call SwapTurn
+ ret
+.asm_006_41f8
+ lb de, $38, $9f
+ call SetupText
+ ldh a, [hWhoseTurn]
+ push af
+ bank1call OpenPlayAreaScreen
+ pop af
+ ldh [hWhoseTurn], a
+ ld a, [$ce57]
+ ld [$ce52], a
+ jp .asm_006_40da
+.asm_006_4210
+ lb de, $38, $9f
+ call SetupText
+ ldh a, [hWhoseTurn]
+ push af
+ bank1call OpenOpponentPlayAreaScreen
+ pop af
+ ldh [hWhoseTurn], a
+ ld a, [$ce57]
+ ld [$ce52], a
+ jp .asm_006_40da
+.jump_table ; (6:4228)
+ dw Func_006_4248
+ dw Func_006_4248
+ dw Func_006_4248
+ dw Func_006_4248
+ dw Func_006_4248
+ dw Func_006_4248
+ dw Func_006_4293
+ dw Func_006_42a7
+ dw Func_006_426a
+ dw Func_006_429d
+ dw Func_006_42b1
+ dw Func_006_426a
+ dw Func_006_426a
+ dw Func_006_426a
+ dw Func_006_426a
+ dw Func_006_426a
+
+Func_006_4248:
+ ld a, [$ce52]
+ inc a
+ cp $06
+ jr nz, .asm_006_4251
+ xor a
+.asm_006_4251
+ ld [wHUDEnergyAndHPBarsX], a
+ add DUELVARS_ARENA_CARD
+ call GetTurnDuelistVariable
+ cp -1
+ ret z
+ call GetCardIDFromDeckIndex
+ call LoadCardDataToBuffer1_FromCardID
+ xor a
+ ld [wCurPlayAreaY], a
+ bank1call OpenCardPage_FromCheckPlayArea
+ ret
+
+Func_006_426a:
+ ld a, [$ce52]
+ sub $08
+ or a
+ jr z, .asm_006_4274
+ sub $02
+.asm_006_4274
+ ld [wHUDEnergyAndHPBarsX], a
+ add DUELVARS_ARENA_CARD
+ call GetNonTurnDuelistVariable
+ cp -1
+ ret z
+ call SwapTurn
+ call GetCardIDFromDeckIndex
+ call LoadCardDataToBuffer1_FromCardID
+ xor a
+ ld [wCurPlayAreaY], a
+ bank1call OpenCardPage_FromCheckPlayArea
+ call SwapTurn
+ ret
+
+Func_006_4293:
+ ldh a, [hWhoseTurn]
+ push af
+ bank1call Func_434e
+ pop af
+ ldh [hWhoseTurn], a
+ ret
+
+Func_006_429d:
+ ldh a, [hWhoseTurn]
+ push af
+ bank1call Func_4345
+ pop af
+ ldh [hWhoseTurn], a
+ ret
+
+Func_006_42a7:
+ ldh a, [hWhoseTurn]
+ push af
+ bank1call OpenPlayerDiscardPileScreen
+ pop af
+ ldh [hWhoseTurn], a
+ ret
+
+Func_006_42b1:
+ ldh a, [hWhoseTurn]
+ push af
+ bank1call OpenOpponentDiscardPileScreen
+ pop af
+ ldh [hWhoseTurn], a
+ ret
+
+Data_006_42bb:
+ INCROM $182bb, $183bb
+
+Func_006_43bb: ; 183bb (6:43bb)
+ xor a
+ ld [wcfe3], a
+ ld hl, $ce53
+.asm_006_43c2
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld a, [$ce52]
+ ld l, a
+.asm_006_43c9
+ ld h, $07
+ call HtimesL
+ add hl, de
+ ldh a, [hDPadHeld]
+ or a
+ jp z, .asm_006_446b
+ inc hl
+ inc hl
+ inc hl
+ bit D_UP_F, a
+ jr z, .asm_006_43df
+.asm_006_43dc
+ ld a, [hl]
+ jr .asm_006_43f5
+.asm_006_43df
+ inc hl
+ bit D_DOWN_F, a
+ jr z, .asm_006_43e7
+ ld a, [hl]
+ jr .asm_006_43f5
+.asm_006_43e7
+ inc hl
+ bit D_RIGHT_F, a
+ jr z, .asm_006_43ef
+ ld a, [hl]
+ jr .asm_006_43f5
+.asm_006_43ef
+ inc hl
+ bit D_LEFT_F, a
+ jr z, .asm_006_446b
+ ld a, [hl]
+.asm_006_43f5
+ push af
+ ld a, [$ce52]
+ ld [$ce57], a
+ pop af
+ ld [$ce52], a
+ cp $05
+ jr c, .asm_006_440e
+ cp $0b
+ jr c, .asm_006_4462
+ cp $10
+ jr c, .asm_006_4437
+ jr .asm_006_4462
+.asm_006_440e
+ ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
+ call GetTurnDuelistVariable
+ dec a
+ jr nz, .asm_006_441d
+ ld a, $10
+ ld [$ce52], a
+ jr .asm_006_4462
+.asm_006_441d
+ ld b, a
+ ld a, [$ce52]
+ cp b
+ jr c, .asm_006_4462
+ ldh a, [hDPadHeld]
+ bit D_RIGHT_F, a
+ jr z, .asm_006_4430
+ xor a
+ ld [$ce52], a
+ jr .asm_006_4462
+.asm_006_4430:
+ ld a, b
+ dec a
+ ld [$ce52], a
+ jr .asm_006_4462
+.asm_006_4437:
+ ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA
+ call GetNonTurnDuelistVariable
+ dec a
+ jr nz, .asm_006_4446
+ ld a, $11
+ ld [$ce52], a
+ jr .asm_006_4462
+.asm_006_4446
+ ld b, a
+ ld a, [$ce52]
+ sub $0b
+ cp b
+ jr c, .asm_006_4462
+ ldh a, [hDPadHeld]
+ bit D_LEFT_F, a
+ jr z, .asm_006_445c
+ ld a, $0b
+ ld [$ce52], a
+ jr .asm_006_4462
+.asm_006_445c
+ ld a, b
+ add $0a
+ ld [$ce52], a
+.asm_006_4462
+ ld a, $01
+ ld [wcfe3], a
+ xor a
+ ld [wcea3], a
+.asm_006_446b
+ ldh a, [hKeysPressed]
+ and $03
+ jr z, .asm_006_448b
+ and $01
+ jr nz, .asm_006_447d
+ ld a, $ff
+ farcall Func_90fb
+ scf
+ ret
+.asm_006_447d
+ call Func_006_44a0
+ ld a, $01
+ farcall Func_90fb
+ ld a, [$ce52]
+ scf
+ ret
+.asm_006_448b
+ ld a, [wcfe3]
+ or a
+ jr z, .asm_006_4494
+ call PlaySFX
+.asm_006_4494
+ ld hl, wcea3
+ ld a, [hl]
+ inc [hl]
+ and $0f
+ ret nz
+ bit D_RIGHT_F, [hl]
+ jr nz, Func_006_44bf
+Func_006_44a0: ; 184a0 (6:44a0)
+ call ZeroObjectPositions
+ ld hl, $ce53
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld a, [$ce52]
+ ld l, a
+ ld h, $07
+ call HtimesL
+ add hl, de
+ ld d, [hl]
+ inc hl
+ ld e, [hl]
+ inc hl
+ ld b, [hl]
+ ld c, $00
+ call SetOneObjectAttributes
+ or a
+ ret
+
+Func_006_44bf: ; 184bf (6:44bf)
+ call ZeroObjectPositions
+ ld a, $01
+ ld [wVBlankOAMCopyToggle], a
+ ret
+
+ xor a
+ ld [wGlossaryPageNo], a
+ call Func_006_452b
+ xor a
+ ld [$ce52], a
+ ld de, $4c8e
+ ld hl, $ce53
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld a, $ff
+ ld [$ce55], a
+ xor a
+ ld [wcea3], a
+.asm_006_44e5
+ ld a, $01
+ ld [wVBlankOAMCopyToggle], a
+ call DoFrame
+ ldh a, [hKeysPressed]
+ and $04
+ jr nz, .asm_006_4518
+ farcall $2, $49ae
+ jr nc, .asm_006_44e5
+ cp $ff
+ jr nz, .asm_006_4502
+ farcall $2, $4aa1
+ ret
+.asm_006_4502
+ push af
+ farcall $2, $4aa1
+ pop af
+ cp $09
+ jr z, .asm_006_451e
+ call Func_006_4598
+ call Func_006_452b
+ xor a
+ ld [wcea3], a
+ jr .asm_006_44e5
+.asm_006_4518
+ ld a, $01
+ farcall Func_90fb
+.asm_006_451e
+ ld a, [wGlossaryPageNo]
+ xor $01
+ ld [wGlossaryPageNo], a
+ call Func_006_455a
+ jr .asm_006_44e5
+
+Func_006_452b: ; 1852b (6:452b)
+ xor a
+ ld [wTileMapFill], a
+ call ZeroObjectPositions
+ ld a, $01
+ ld [wVBlankOAMCopyToggle], a
+ call DoFrame
+ call EmptyScreen
+ call Set_OBJ_8x8
+ farcall $2, $4992
+ lb de, 5, 0
+ call InitTextPrinting
+ ldtx hl, Text02f6
+ call ProcessTextFromID
+ call Func_006_455a
+ ldtx hl, Text02f9
+ call DrawWideTextBox_PrintText
+ ret
+
+; print glossary
+Func_006_455a: ; 1855a (6:455a)
+ ld hl, wDefaultText
+ ld a, TX_SYMBOL
+ ld [hli], a
+ ld a, [wGlossaryPageNo]
+ add SYM_1
+ ld [hli], a
+ ld a, TX_SYMBOL
+ ld [hli], a
+ ld a, SYM_SLASH
+ ld [hli], a
+ ld a, TX_SYMBOL
+ ld [hli], a
+ ld a, SYM_2
+ ld [hli], a
+ ld [hl], TX_END
+
+ lb de, 16, 1
+ call InitTextPrinting
+ ld hl, wDefaultText
+ call ProcessText
+
+ lb de, 1, 3
+ call InitTextPrinting
+ ld a, [wGlossaryPageNo]
+ or a
+
+ jr nz, .page_two
+ ldtx hl, Text02f7
+ jr .page_one
+.page_two
+ ldtx hl, Text02f8
+.page_one
+ call ProcessTextFromID
+ ret
+
+Func_006_4598: ; 18598 (6:4598)
+ push af
+ xor a
+ ld [wTileMapFill], a
+ call EmptyScreen
+ lb de, 5, 0
+ call InitTextPrinting
+ ldtx hl, Text02f6
+ call ProcessTextFromID
+ ld de, $0004
+ ld bc, $140e
+ call DrawRegularTextBox
+ ld a, [wGlossaryPageNo]
+ or a
+ jr nz, .back_page
+ ld hl, GlossaryData1
+ jr .front_page
+.back_page
+ ld hl, GlossaryData2
+.front_page
+ pop af
+ ; hl += (a + (a << 2)).
+ ; that is,
+ ; hl += (5 * a).
+ ld c, a
+ ld b, 0
+ add hl, bc
+ sla a
+ sla a
+ ld c, a
+ add hl, bc
+ ld a, [hli]
+ push hl
+ ld d, a
+ ld e, $02
+ call InitTextPrinting
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call ProcessTextFromID
+ pop hl
+ lb de, 1, 5
+ call InitTextPrinting
+ inc hl
+ inc hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, $01
+ ld [wLineSeparation], a
+ call ProcessTextFromID
+ xor a
+ ld [wLineSeparation], a
+ call EnableLCD
+.asm_006_45f7
+ call DoFrame
+ ldh a, [hKeysPressed]
+ and B_BUTTON
+ jr z, .asm_006_45f7
+ ld a, $ff
+ farcall Func_90fb
+ ret
+
+; unit: 5 bytes.
+; [structure]
+; horizonal align (1) / text id 1 (2) / text id 2 (2)
+glossary_entry: MACRO
+ db \1
+ tx \2
+ tx \3
+ENDM
+GlossaryData1:
+ glossary_entry 7, Text02fa, Text030c
+ glossary_entry 5, Text02fb, Text030d
+ glossary_entry 7, Text02fc, Text030e
+ glossary_entry 6, Text02fd, Text030f
+ glossary_entry 6, Text02fe, Text0310
+ glossary_entry 4, Text02ff, Text0311
+ glossary_entry 5, Text0300, Text0312
+ glossary_entry 7, Text0301, Text0313
+ glossary_entry 5, Text0302, Text0314
+GlossaryData2:
+ glossary_entry 5, Text0303, Text0315
+ glossary_entry 5, Text0304, Text0316
+ glossary_entry 5, Text0305, Text0317
+ glossary_entry 5, Text0306, Text0318
+ glossary_entry 6, Text0307, Text0319
+ glossary_entry 5, Text0308, Text031a
+ glossary_entry 6, Text0309, Text031b
+ glossary_entry 6, Text030a, Text031c
+ glossary_entry 6, Text030b, Text031d
+
+; (6:4661)
+ xor a
+ ld [wcfe3], a
+ ld a, [wceaf]
+ ld d, a
+ ld a, [wceb0]
+ ld e, a
+ ldh a, [hDPadHeld]
+ or a
+ jr z, .asm_006_46a2
+ bit D_LEFT_F, a
+ jr nz, .asm_006_467a
+ bit D_RIGHT_F, a
+ jr z, .asm_006_4680
+.asm_006_467a
+ ld a, d
+ xor $01
+ ld d, a
+ jr .asm_006_468c
+.asm_006_4680
+ bit D_UP_F, a
+ jr nz, .asm_006_4688
+ bit D_DOWN_F, a
+ jr z, .asm_006_46a2
+.asm_006_4688
+ ld a, e
+ xor $01
+ ld e, a
+.asm_006_468c
+ ld a, $01
+ ld [wcfe3], a
+ push de
+ call .asm_006_46d4
+ pop de
+ ld a, d
+ ld [wceaf], a
+ ld a, e
+ ld [wceb0], a
+ xor a
+ ld [wcea3], a
+.asm_006_46a2
+ ldh a, [hKeysPressed]
+ and $03
+ jr z, .asm_006_46bd
+ and $01
+ jr nz, .asm_006_46b3
+ ld a, $ff
+ call Func_006_50fb
+ scf
+ ret
+.asm_006_46b3
+ call .asm_006_46f3
+ ld a, $01
+ call Func_006_50fb
+ scf
+ ret
+.asm_006_46bd
+ ld a, [wcfe3]
+ or a
+ jr z, .asm_006_46c6
+ call PlaySFX
+.asm_006_46c6
+ ld hl, wcea3
+ ld a, [hl]
+ inc [hl]
+ and $0f
+ ret nz
+ ld a, $0f
+ bit D_RIGHT_F, [hl]
+ jr z, .asm_006_46d6
+.asm_006_46d4 ; 186d4 (6:46d4)
+ ld a, $00
+.asm_006_46d6
+ ld e, a
+ ld a, $0a
+ ld l, a
+ ld a, [wceaf]
+ ld h, a
+ call HtimesL
+ ld a, l
+ add $01
+ ld b, a
+ ld a, [wceb0]
+ sla a
+ add $0e
+ ld c, a
+ ld a, e
+ call WriteByteToBGMap0
+ or a
+ ret
+.asm_006_46f3: ; 186f3 (6:46f3)
+ ld a, $0f
+ jr .asm_006_46d6
+
+; (6:46f7)
INCLUDE "data/effect_commands.asm"
- INCROM $18f9c, $1996e
+Func_006_4f9c: ; 18f9c (6:4f9c)
+ ld a, [wLoadedMoveAnimation]
+ or a
+ ret z
+ ld l, a
+ ld h, 0
+ add hl, hl
+ ld de, $51a4
+.asm_006_4fa8
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ push de
+ ld hl, wce7e
+ ld a, [hl]
+ or a
+ jr nz, .asm_006_4fd3
+ ld [hl], $01
+ call Func_3b21
+ pop de
+ push de
+ ld a, $00
+ ld [wd4ae], a
+ ld a, $01
+ ld [$d4b3], a
+ xor a
+ ld [wd4b0], a
+ ld a, [de]
+ cp $04
+ jr z, .asm_006_4fd3
+ ld a, $96
+ call Func_3b6a
+.asm_006_4fd3
+ pop de
+.asm_006_4fd4
+ ld a, [de]
+ inc de
+ ld hl, PointerTable_006_508f
+ jp JumpToFunctionInTable
+
+Func_006_4fdc:
+ ret
+
+Func_006_4fdd:
+ ldh a, [hWhoseTurn]
+ ld [wd4af], a
+ ld a, [wDuelType]
+ cp $00
+ jr nz, Func_006_5014
+ ld a, $c2
+ ld [wd4af], a
+ jr Func_006_5014
+
+Func_006_4ff0:
+ call SwapTurn
+ ldh a, [hWhoseTurn]
+ ld [wd4af], a
+ call SwapTurn
+ ld a, [wDuelType]
+ cp $00
+ jr nz, Func_006_5014
+ ld a, $c3
+ ld [wd4af], a
+ jr Func_006_5014
+
+Func_006_5009:
+ ld a, [wce82]
+ and $7f
+ ld [wd4b0], a
+ jr Func_006_5014
+
+Func_006_5013:
+ ret
+
+Func_006_5014:
+ ld a, [de]
+ inc de
+ cp $09
+ jr z, .asm_006_502b
+ cp $fa
+ jr z, .asm_006_5057
+ cp $fb
+ jr z, .asm_006_505d
+ cp $fc
+ jr z, .asm_006_5063
+.asm_006_5026
+ call Func_3b6a
+ jr Func_006_4f9c.asm_006_4fd4
+.asm_006_502b
+ ld a, $97
+ call Func_3b6a
+ ld a, [wce81]
+ ld [$d4b3], a
+ push de
+ ld hl, wce7f
+ ld de, $d4b1
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ pop de
+ ld a, $8c
+ call Func_3b6a
+ ld a, [wDuelDisplayedScreen]
+ cp $01
+ jr nz, .asm_006_5054
+ ld a, $98
+ call Func_3b6a
+.asm_006_5054
+ jp Func_006_4f9c.asm_006_4fd4
+.asm_006_5057
+ ld c, $61
+ ld b, $63
+ jr .asm_006_5067
+.asm_006_505d
+ ld c, $62
+ ld b, $64
+ jr .asm_006_5067
+.asm_006_5063
+ ld c, $63
+ ld b, $61
+.asm_006_5067
+ ldh a, [hWhoseTurn]
+ cp $c2
+ ld a, c
+ jr z, .asm_006_5026
+ ld a, [wDuelType]
+ cp $00
+ ld a, c
+ jr z, .asm_006_5026
+ ld a, b
+ jr .asm_006_5026
+
+Func_006_5079:
+ ld a, [de]
+ inc de
+ ld [$d4b3], a
+ ld a, [wce82]
+ ld [wd4b0], a
+ call Func_006_509d
+ ld a, $96
+ call Func_3b6a
+ jp Func_006_4f9c.asm_006_4fd4
+
+PointerTable_006_508f: ; (6:508f)
+ dw Func_006_4fdc
+ dw Func_006_5014
+ dw Func_006_4fdd
+ dw Func_006_4ff0
+ dw Func_006_5079
+ dw Func_006_5009
+ dw Func_006_5013
+
+Func_006_509d: ; 1909d (6:509d)
+ ld a, [$d4b3]
+ cp $04
+ jr z, .asm_006_50ad
+ cp $01
+ ret nz
+ ld a, $00
+ ld [wd4ae], a
+ ret
+.asm_006_50ad
+ ld a, [wd4b0]
+ ld l, a
+ ld a, [wWhoseTurn]
+ ld h, a
+ cp $c2
+ jr z, .asm_006_50cc
+ ld a, [wDuelType]
+ cp $00
+ jr z, .asm_006_50c6
+ bit 7, l
+ jr z, .asm_006_50e2
+ jr .asm_006_50d2
+.asm_006_50c6
+ bit 7, l
+ jr z, .asm_006_50da
+ jr .asm_006_50ea
+.asm_006_50cc
+ bit 7, l
+ jr z, .asm_006_50d2
+ jr .asm_006_50e2
+.asm_006_50d2
+ ld l, $04
+ ld h, $c2
+ ld a, $01
+ jr .asm_006_50f0
+.asm_006_50da
+ ld l, $04
+ ld h, $c3
+ ld a, $01
+ jr .asm_006_50f0
+.asm_006_50e2
+ ld l, $05
+ ld h, $c3
+ ld a, $02
+ jr .asm_006_50f0
+.asm_006_50ea
+ ld l, $05
+ ld h, $c2
+ ld a, $02
+.asm_006_50f0:
+ ld [wd4ae], a
+ ret
+
+; this part is not perfectly analyzed.
+; needs some fix.
+ ld a, [$d4b3]
+ cp $04
+ jr z, Func_006_50fb.asm_006_510f
+Func_006_50fb: ; 190fb (6:50fb)
+ cp $01
+ jr nz, .asm_006_510e
+ ld a, $00
+ ld [wd4ae], a
+ ld a, [wDuelDisplayedScreen]
+ cp $01
+ jr z, .asm_006_510e
+ bank1call DrawDuelMainScene
+.asm_006_510e
+ ret
+.asm_006_510f
+ call Func_006_509d
+ ld a, [wDuelDisplayedScreen]
+ cp l
+ jr z, .asm_006_512e
+ ld a, l
+ push af
+ ld l, $c2
+ ld a, [wDuelType]
+ cp $00
+ jr nz, .asm_006_5127
+ ld a, [wWhoseTurn]
+ ld l, a
+.asm_006_5127
+ call Func_30bc
+ pop af
+ ld [wDuelDisplayedScreen], a
+.asm_006_512e
+ call DrawWideTextBox
+ ret
+
+; needs analyze.
+ push hl
+ push bc
+ push de
+ ld a, [wLoadedMoveAnimation]
+ cp $79
+ jr z, .asm_006_5164
+ cp $86
+ jr z, .asm_006_5164
+ ld a, [wTempNonTurnDuelistCardID]
+ ld e, a
+ ld d, $00
+ call LoadCardDataToBuffer1_FromCardID
+ ld a, $12
+ call CopyCardNameAndLevel
+ ld [hl], $00
+ ld hl, wTxRam2
+ xor a
+ ld [hli], a
+ ld [hl], a
+ ld hl, wce7f
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call Func_006_5168
+ ld a, l
+ or h
+ call nz, DrawWideTextBox_PrintText
+.asm_006_5164
+ pop de
+ pop bc
+ pop hl
+ ret
+
+Func_006_5168: ; 19168 (6:5168)
+ ld a, l
+ or h
+ jr z, .asm_006_5188
+ call LoadTxRam3
+ ld a, [wce81]
+ ld hl, $003a
+ and $06
+ ret z
+ ld hl, $0038
+ cp $06
+ ret z
+ and $02
+ ld hl, $0037
+ ret nz
+ ld hl, $0036
+ ret
+.asm_006_5188
+ call CheckNoDamageOrEffect
+ ret c
+ ld hl, $003b
+ ld a, [wce81]
+ and $04
+ ret z
+ ld hl, $0039
+ ret
+
+; needs analyze.
+ ld a, [wDuelDisplayedScreen]
+ cp $01
+ ret nz
+ bank1call DrawDuelHUDs
+ ret
+
+ INCROM $191a3, $1996e
Func_1996e: ; 1996e (6:596e)
call EnableSRAM
@@ -183,7 +1205,7 @@ Func_1996e: ; 1996e (6:596e)
ld [hl], a
inc l
jr nz, .asm_199a2
- ld hl, $bc00
+ ld hl, sCurrentDuel
xor a
ld [hli], a
ld [hli], a
@@ -266,32 +1288,33 @@ Func_1a61f: ; 1a61f (6:661f)
call SetupText
pop af
or a
- jr nz, .asm_1a640
+ jr nz, .else
ld a, $40
- call $663b
+ call .legendary_card_text
ld a, $5f
- call $663b
+ call .legendary_card_text
ld a, $76
- call $663b
+ call .legendary_card_text
ld a, $c1
+.legendary_card_text
ldtx hl, ReceivedLegendaryCardText
- jr .asm_1a660
-.asm_1a640
+ jr .print_text
+.else
ldtx hl, ReceivedCardText
cp $1e
- jr z, .asm_1a660
+ jr z, .print_text
cp $43
- jr z, .asm_1a660
+ jr z, .print_text
ldtx hl, ReceivedPromotionalFlyingPikachuText
cp $64
- jr z, .asm_1a660
+ jr z, .print_text
ldtx hl, ReceivedPromotionalSurfingPikachuText
cp $65
- jr z, .asm_1a660
+ jr z, .print_text
cp $66
- jr z, .asm_1a660
+ jr z, .print_text
ldtx hl, ReceivedPromotionalCardText
-.asm_1a660
+.print_text
push hl
ld e, a
ld d, $0
@@ -307,23 +1330,1640 @@ Func_1a61f: ; 1a61f (6:661f)
ld a, PLAYER_TURN
ldh [hWhoseTurn], a
pop hl
- bank1call $5e5f
-.asm_1a680
+ bank1call _DisplayCardDetailScreen
+.loop
call AssertSongFinished
or a
- jr nz, .asm_1a680
+ jr nz, .loop
+
call ResumeSong
- bank1call $5773
+ bank1call OpenCardPage_FromHand
ret
; 0x1a68d
- INCROM $1a68d, $1a6cc
+Func_006_668d:
+ ld a, $c2 ; player's turn
+ ldh [hWhoseTurn], a
+ ld h, a
+ ld l, $00
+.asm_006_6694
+ xor a
+ ld [hli], a
+ ld a, l
+ cp $3c
+ jr c, .asm_006_6694
+ xor a
+ ld hl, wBoosterCardsDrawn
+ ld de, wDuelTempList
+ ld c, $00
+.asm_006_66a4
+ ld a, [hli]
+ or a
+ jr z, .asm_006_66ae
+ ld a, c
+ ld [de], a
+ inc de
+ inc c
+ jr .asm_006_66a4
+.asm_006_66ae
+ ld a, $ff
+ ld [de], a
+ lb de, $38, $9f
+ call SetupText
+ bank1call InitAndDrawCardListScreenLayout
+ ld hl, $0056
+ ld de, $0196
+ bank1call SetCardListHeaderText
+ ld a, A_BUTTON | START
+ ld [wNoItemSelectionMenuKeys], a
+ bank1call DisplayCardList
+ ret
CommentedOut_1a6cc: ; 1a6cc (6:66cc)
ret
-; 0x1a6cd
- INCROM $1a6cd, $1ad89
+Func_006_66cd: ; (6:66cd)
+ ldh a, [hBankSRAM]
+ or a
+ ret nz
+ push hl
+ push de
+ push bc
+ ld hl, sCardCollection
+ ld bc, $0250
+ ld a, [s0a000 + $b]
+ ld e, a
+.asm_006_66de
+ ld a, [hli]
+ xor e
+ ld e, a
+ dec bc
+ ld a, c
+ or b
+ jr nz, .asm_006_66de
+ ld a, e
+ pop bc
+ pop de
+ pop hl
+ or a
+ ret z
+ xor a
+ ld [wTileMapFill], a
+ ld hl, wDoFrameFunction
+ ld [hli], a
+ ld [hl], a
+ ldh [hSCX], a
+ ldh [hSCY], a
+ bank1call ZeroObjectPositionsAndToggleOAMCopy
+ call EmptyScreen
+ call LoadSymbolsFont
+ bank1call SetDefaultPalettes
+ ld a, [wConsole]
+ cp $01
+ jr nz, .asm_006_6719
+ ld a, $e4
+ ld [wOBP0], a
+ ld [wBGP], a
+ ld a, $01
+ ld [wFlushPaletteFlags], a
+.asm_006_6719
+ lb de, $38, $9f
+ call SetupText
+ ld hl, $00a3
+ bank1call Func_57df
+ ld a, $0a
+ ld [$0000], a
+ xor a
+ ldh [hBankSRAM], a
+ ld [$4000], a
+ ld [$a000], a
+ ld [$0000], a
+ jp Reset
+ ret
+
+Func_006_673a: ; (6:673a)
+ ldh a, [hBankSRAM]
+ or a
+ ret nz
+ push hl
+ push de
+ push bc
+ ld hl, sCardCollection
+ ld bc, $0250
+ ld e, $00
+.asm_006_6749
+ ld a, [hli]
+ xor e
+ ld e, a
+ dec bc
+ ld a, c
+ or b
+ jr nz, .asm_006_6749
+ ld a, $0a
+ ld [$0000], a
+ ld a, e
+ ld [s0a00b], a
+ pop bc
+ pop de
+ pop hl
+ ret
+
+WhatIsYourNameData: ; (6:675e)
+ textitem 1, 1, WhatIsYourNameText
+ db $ff
+; [Deck1Data ~ Deck4Data]
+; These are directed from around (2:4f05),
+; without any bank description.
+; That is, the developers hard-coded it. -_-;;
+Deck1Data: ; (6:6763)
+ textitem 2, 1, Text022b
+ textitem 14, 1, Text0219
+ db $ff
+Deck2Data: ; (6:676c)
+ textitem 2, 1, Text022c
+ textitem 14, 1, Text0219
+ db $ff
+Deck3Data: ; (6:6775)
+ textitem 2, 1, Text022d
+ textitem 14, 1, Text0219
+ db $ff
+Deck4Data: ; (6:677e)
+ textitem 2, 1, Text022e
+ textitem 14, 1, Text0219
+ db $ff
+
+; set each byte zero from hl for b bytes.
+ClearMemory: ; (6:6787)
+ push af
+ push bc
+ push hl
+ ld b, a
+ xor a
+.loop
+ ld [hli], a
+ dec b
+ jr nz, .loop
+ pop hl
+ pop bc
+ pop af
+ ret
+
+; play different sfx by a.
+; if a is 0xff play sfx with 0x03,
+; else with 0x02.
+PlaySFXByA: ; (6:6794)
+ push af
+ inc a
+ jr z, .on_three
+ ld a, $02
+ jr .on_two
+.on_three
+ ld a, $03
+.on_two
+ call PlaySFX
+ pop af
+ ret
+
+; get player name from the user
+; into hl
+InputPlayerName: ; (6:67a3)
+ ld e, l
+ ld d, h
+ ld a, MAX_PLAYER_NAME_LENGTH
+ ld hl, WhatIsYourNameData
+ lb bc, 12, 1
+ call InitializeInputName
+ call Set_OBJ_8x8
+ xor a
+ ld [wTileMapFill], a
+ call EmptyScreen
+ call ZeroObjectPositions
+ ld a, $01
+ ld [wVBlankOAMCopyToggle], a
+ call LoadSymbolsFont
+ lb de, $38, $bf
+ call SetupText
+ call SetVram0xFF
+ ld a, $02
+ ld [wd009], a
+ call DrawNamingScreenBG
+ xor a
+ ld [wNamingScreenCursorX], a
+ ld [wNamingScreenCursorY], a
+ ld a, $09
+ ld [wd005], a
+ ld a, $06
+ ld [wNamingScreenKeyboardHeight], a
+ ld a, $0f
+ ld [wceaa], a
+ ld a, $00
+ ld [wceab], a
+.loop
+ ld a, $01
+ ld [wVBlankOAMCopyToggle], a
+ call DoFrame
+ call UpdateRNGSources
+ ldh a, [hDPadHeld]
+ and START
+ jr z, .else
+ ; if pressed start button.
+ ld a, $01
+ call PlaySFXByA
+ call Func_006_6a07
+ ld a, 6
+ ld [wNamingScreenCursorX], a
+ ld a, 5
+ ld [wNamingScreenCursorY], a
+ call Func_006_6a23
+ jr .loop
+.else
+ call NamingScreen_CheckButtonState
+ jr nc, .loop ; if not pressed, go back to the loop.
+ cp $ff
+ jr z, .on_b_button
+ ; on A button.
+ call NamingScreen_ProcessInput
+ jr nc, .loop
+ ; if the player selected the end button,
+ ; end its naming.
+ call FinalizeInputName
+ ret
+.on_b_button
+ ld a, [wNamingScreenBufferLength]
+ or a
+ jr z, .loop ; empty string?
+ ; erase one character.
+ ld e, a
+ ld d, 0
+ ld hl, wNamingScreenBuffer
+ add hl, de
+ dec hl
+ dec hl
+ ld [hl], TX_END
+ ld hl, wNamingScreenBufferLength ; note that its unit is byte, not word.
+ dec [hl]
+ dec [hl]
+ call PrintPlayerNameFromInput
+ jr .loop
+
+; it's called when naming(either player's or deck's) starts.
+; a: maximum length of name(depending on whether player's or deck's).
+; bc: position of name.
+; de: dest. pointer.
+; hl: pointer to text item of the question.
+InitializeInputName:
+ ld [wNamingScreenBufferMaxLength], a
+ push hl
+ ld hl, wNamingScreenNamePosition
+ ld [hl], b
+ inc hl
+ ld [hl], c
+ pop hl
+ ld b, h
+ ld c, l
+ ; set the question string.
+ ld hl, wNamingScreenQuestionPointer
+ ld [hl], c
+ inc hl
+ ld [hl], b
+ ; set the destination buffer.
+ ld hl, wNamingScreenDestPointer
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ; clear the name buffer.
+ ld a, NAMING_SCREEN_BUFFER_LENGTH
+ ld hl, wNamingScreenBuffer
+ call ClearMemory
+ ld hl, wNamingScreenBuffer
+ ld a, [wNamingScreenBufferMaxLength]
+ ld b, a
+ inc b
+.loop
+ ; copy data from de to hl
+ ; for b bytes.
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec b
+ jr nz, .loop
+ ld hl, wNamingScreenBuffer
+ call GetTextSizeInTiles
+ ld a, c
+ ld [wNamingScreenBufferLength], a
+ ret
+
+FinalizeInputName:
+ ld hl, wNamingScreenDestPointer
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld l, e
+ ld h, d
+ ld de, wNamingScreenBuffer
+ ld a, [wNamingScreenBufferMaxLength]
+ ld b, a
+ inc b
+ jr InitializeInputName.loop
+
+; draws the keyboard frame
+; and the question if it exists.
+DrawNamingScreenBG:
+ call DrawTextboxForKeyboard
+ call PrintPlayerNameFromInput
+ ld hl, wNamingScreenQuestionPointer
+ ld c, [hl]
+ inc hl
+ ld a, [hl]
+ ld h, a
+ or c
+ jr z, .put_text_end
+ ; print the question string.
+ ; ex) "What is your name?"
+ ld l, c
+ call PlaceTextItems
+.put_text_end
+ ; print "End".
+ ld hl, .data
+ call PlaceTextItems
+ ldtx hl, Text0221
+ lb de, 2, 4
+ call InitTextPrinting
+ call ProcessTextFromID
+ call EnableLCD
+ ret
+.data
+ textitem $0f, $10, EndText ; "End"
+ db $ff
+
+DrawTextboxForKeyboard:
+ lb de, 0, 3 ; x, y
+ lb bc, 20, 15 ; w, h
+ call DrawRegularTextBox
+ ret
+
+PrintPlayerNameFromInput:
+ ld hl, wNamingScreenNamePosition
+ ld d, [hl]
+ inc hl
+ ld e, [hl]
+ push de
+ call InitTextPrinting
+ ld a, [wNamingScreenBufferMaxLength]
+ ld e, a
+ ld a, $14
+ sub e
+ inc a
+ ld e, a
+ ld d, $00
+ ; print the underbars
+ ; before print the input.
+ ld hl, .char_underbar
+ add hl, de
+ call ProcessText
+ pop de
+ call InitTextPrinting
+ ; print the input from the user.
+ ld hl, wNamingScreenBuffer
+ call ProcessText
+ ret
+.char_underbar
+ db $56
+rept 10
+ textfw3 "_"
+endr
+ done
+
+; check if button pressed.
+; if pressed, set the carry bit on.
+NamingScreen_CheckButtonState:
+ xor a
+ ld [wcfe3], a
+ ldh a, [hDPadHeld]
+ or a
+ jp z, .no_press
+ ; detected any button press.
+ ld b, a
+ ld a, [wNamingScreenKeyboardHeight]
+ ld c, a
+ ld a, [wNamingScreenCursorX]
+ ld h, a
+ ld a, [wNamingScreenCursorY]
+ ld l, a
+ bit D_UP_F, b
+ jr z, .asm_006_692c
+ ; up
+ dec a
+ bit D_DOWN_F, a
+ jr z, .asm_006_69a7
+ ld a, c
+ dec a
+ jr .asm_006_69a7
+.asm_006_692c
+ bit D_DOWN_F, b
+ jr z, .asm_006_6937
+ ; down
+ inc a
+ cp c
+ jr c, .asm_006_69a7
+ xor a
+ jr .asm_006_69a7
+.asm_006_6937
+ ld a, [wd005]
+ ld c, a
+ ld a, h
+ bit D_LEFT_F, b
+ jr z, .asm_006_6974
+ ; left
+ ld d, a
+ ld a, $06
+ cp l
+ ld a, d
+ jr nz, .asm_006_696b
+ push hl
+ push bc
+ push af
+ call GetCharInfoFromPos_Player
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ ld a, [hl]
+ dec a
+ ld d, a
+ pop af
+ pop bc
+ pop hl
+ sub d
+ cp $ff
+ jr nz, .asm_006_6962
+ ld a, c
+ sub $02
+ jr .asm_006_69aa
+.asm_006_6962
+ cp $fe
+ jr nz, .asm_006_696b
+ ld a, c
+ sub $03
+ jr .asm_006_69aa
+.asm_006_696b
+ dec a
+ bit D_DOWN_F, a
+ jr z, .asm_006_69aa
+ ld a, c
+ dec a
+ jr .asm_006_69aa
+.asm_006_6974
+ bit D_RIGHT_F, b
+ jr z, .no_press
+ ld d, a
+ ld a, $06
+ cp l
+ ld a, d
+ jr nz, .asm_006_6990
+ push hl
+ push bc
+ push af
+ call GetCharInfoFromPos_Player
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ ld a, [hl]
+ dec a
+ ld d, a
+ pop af
+ pop bc
+ pop hl
+ add d
+.asm_006_6990
+ inc a
+ cp c
+ jr c, .asm_006_69aa
+ inc c
+ cp c
+ jr c, .asm_006_69a4
+ inc c
+ cp c
+ jr c, .asm_006_69a0
+ ld a, $02
+ jr .asm_006_69aa
+.asm_006_69a0
+ ld a, $01
+ jr .asm_006_69aa
+.asm_006_69a4
+ xor a
+ jr .asm_006_69aa
+.asm_006_69a7
+ ld l, a
+ jr .asm_006_69ab
+.asm_006_69aa
+ ld h, a
+.asm_006_69ab
+ push hl
+ call GetCharInfoFromPos_Player
+ inc hl
+ inc hl
+ inc hl
+ ld a, [wd009]
+ cp $02
+ jr nz, .asm_006_69bb
+ inc hl
+ inc hl
+.asm_006_69bb
+ ld d, [hl]
+ push de
+ call Func_006_6a07
+ pop de
+ pop hl
+ ld a, l
+ ld [wNamingScreenCursorY], a
+ ld a, h
+ ld [wNamingScreenCursorX], a
+ xor a
+ ld [wcea3], a
+ ld a, $06
+ cp d
+ jp z, NamingScreen_CheckButtonState
+ ld a, $01
+ ld [wcfe3], a
+.no_press
+ ldh a, [hKeysPressed]
+ and A_BUTTON | B_BUTTON
+ jr z, .asm_006_69ef
+ and A_BUTTON
+ jr nz, .asm_006_69e5
+ ld a, $ff
+.asm_006_69e5
+ call PlaySFXByA
+ push af
+ call Func_006_6a23
+ pop af
+ scf
+ ret
+.asm_006_69ef
+ ld a, [wcfe3]
+ or a
+ jr z, .asm_006_69f8
+ call PlaySFX
+.asm_006_69f8
+ ld hl, wcea3
+ ld a, [hl]
+ inc [hl]
+ and $0f
+ ret nz
+ ld a, [wceaa]
+ bit 4, [hl]
+ jr z, Func_006_6a07.asm_006_6a0a
+
+Func_006_6a07:
+ ld a, [wceab]
+.asm_006_6a0a
+ ld e, a
+ ld a, [wNamingScreenCursorX]
+ ld h, a
+ ld a, [wNamingScreenCursorY]
+ ld l, a
+ call GetCharInfoFromPos_Player
+ ld a, [hli]
+ ld c, a
+ ld b, [hl]
+ dec b
+ ld a, e
+ call Func_006_6a28
+ call WriteByteToBGMap0
+ or a
+ ret
+
+Func_006_6a23:
+ ld a, [wceaa]
+ jr Func_006_6a07.asm_006_6a0a
+
+Func_006_6a28:
+ push af
+ push bc
+ push de
+ push hl
+ push af
+ call ZeroObjectPositions
+ pop af
+ ld b, a
+ ld a, [wceab]
+ cp b
+ jr z, .asm_006_6a60
+ ld a, [wNamingScreenBufferLength]
+ srl a
+ ld d, a
+ ld a, [wNamingScreenBufferMaxLength]
+ srl a
+ ld e, a
+ ld a, d
+ cp e
+ jr nz, .asm_006_6a49
+ dec a
+.asm_006_6a49
+ ld hl, wNamingScreenNamePosition
+ add [hl]
+ ld d, a
+ ld h, $08
+ ld l, d
+ call HtimesL
+ ld a, l
+ add $08
+ ld d, a
+ ld e, $18
+ ld bc, $0000
+ call SetOneObjectAttributes
+.asm_006_6a60
+ pop hl
+ pop de
+ pop bc
+ pop af
+ ret
+
+SetVram0xFF:
+ ld hl, v0Tiles0
+ ld de, .data
+ ld b, 0
+.loop
+ ; copy data from de to hl
+ ; for 0x10 bytes.
+ ; and de has all of 0xff data,
+ ; which means that it puts only 0xff.
+ ld a, $10
+ cp b
+ ret z
+ inc b
+ ld a, [de]
+ inc de
+ ld [hli], a
+ jr .loop
+.data
+rept $10
+ db $ff
+endr
+
+; set the carry bit on,
+; if "End" was selected.
+NamingScreen_ProcessInput:
+ ld a, [wNamingScreenCursorX]
+ ld h, a
+ ld a, [wNamingScreenCursorY]
+ ld l, a
+ call GetCharInfoFromPos_Player
+ inc hl
+ inc hl
+ ; load types into de.
+ ld e, [hl]
+ inc hl
+ ld a, [hli]
+ ld d, a
+ cp $09
+ jp z, .on_end
+ cp $07
+ jr nz, .asm_006_6ab8
+ ld a, [wd009]
+ or a
+ jr nz, .asm_006_6aac
+ ld a, $01
+ jp .asm_006_6ace
+.asm_006_6aac
+ dec a
+ jr nz, .asm_006_6ab4
+ ld a, $02
+ jp .asm_006_6ace
+.asm_006_6ab4
+ xor a
+ jp .asm_006_6ace
+.asm_006_6ab8
+ cp $08
+ jr nz, .asm_006_6ad6
+ ld a, [wd009]
+ or a
+ jr nz, .asm_006_6ac6
+ ld a, $02
+ jr .asm_006_6ace
+.asm_006_6ac6
+ dec a
+ jr nz, .asm_006_6acc
+ xor a
+ jr .asm_006_6ace
+.asm_006_6acc
+ ld a, $01
+.asm_006_6ace
+ ld [wd009], a
+ call DrawNamingScreenBG
+ or a
+ ret
+.asm_006_6ad6
+ ld a, [wd009]
+ cp $02
+ jr z, .read_char
+ ld bc, $0359 ; “
+ ld a, d
+ cp b
+ jr nz, .asm_006_6af4
+ ld a, e
+ cp c
+ jr nz, .asm_006_6af4
+ push hl
+ ld hl, TransitionTable1 ; from 55th.
+ call TransformCharacter
+ pop hl
+ jr c, .nothing
+ jr .asm_006_6b09
+.asm_006_6af4
+ ld bc, $035b ; º
+ ld a, d
+ cp b
+ jr nz, .asm_006_6b1d
+ ld a, e
+ cp c
+ jr nz, .asm_006_6b1d
+ push hl
+ ld hl, TransitionTable2 ; from 72th.
+ call TransformCharacter
+ pop hl
+ jr c, .nothing
+.asm_006_6b09
+ ld a, [wNamingScreenBufferLength]
+ dec a
+ dec a
+ ld [wNamingScreenBufferLength], a
+ ld hl, wNamingScreenBuffer
+ push de
+ ld d, 0
+ ld e, a
+ add hl, de
+ pop de
+ ld a, [hl]
+ jr .asm_006_6b37
+.asm_006_6b1d
+ ld a, d
+ or a
+ jr nz, .asm_006_6b37
+ ld a, [wd009]
+ or a
+ jr nz, .asm_006_6b2b
+ ld a, TX_HIRAGANA
+ jr .asm_006_6b37
+.asm_006_6b2b
+ ld a, TX_KATAKANA
+ jr .asm_006_6b37
+; read character code from info. to register.
+; hl: pointer.
+.read_char
+ ld e, [hl]
+ inc hl
+ ld a, [hl] ; a: first byte of the code.
+ or a
+ ; if 2 bytes code, jump.
+ jr nz, .asm_006_6b37
+ ; if 1 byte code(ascii),
+ ; set first byte to $0e.
+ ld a, $0e
+; on 2 bytes code.
+.asm_006_6b37
+ ld d, a ; de: character code.
+ ld hl, wNamingScreenBufferLength
+ ld a, [hl]
+ ld c, a
+ push hl
+ ld hl, wNamingScreenBufferMaxLength
+ cp [hl]
+ pop hl
+ jr nz, .asm_006_6b4c
+ ; if the buffer is full
+ ; just change the last character of it.
+ ld hl, wNamingScreenBuffer
+ dec hl
+ dec hl
+ jr .asm_006_6b51
+; increase name length before add the character.
+.asm_006_6b4c
+ inc [hl]
+ inc [hl]
+ ld hl, wNamingScreenBuffer
+; write 2 bytes character codes to the name buffer.
+; de: 2 bytes character codes.
+; hl: dest.
+.asm_006_6b51
+ ld b, 0
+ add hl, bc
+ ld [hl], d
+ inc hl
+ ld [hl], e
+ inc hl
+ ld [hl], TX_END ; null terminator.
+ call PrintPlayerNameFromInput
+.nothing
+ or a
+ ret
+.on_end
+ scf
+ ret
+
+; this transforms the last japanese character
+; in the name buffer into its dakuon shape or something.
+; it seems to have been deprecated as the game was translated into english.
+; but it can still be applied to english, such as upper-lower case transition.
+; hl: info. pointer.
+TransformCharacter:
+ ld a, [wNamingScreenBufferLength]
+ or a
+ jr z, .return ; if the length is zero, just return.
+ dec a
+ dec a
+ push hl
+ ld hl, wNamingScreenBuffer
+ ld d, 0
+ ld e, a
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ; de: last character in the buffer,
+ ; but byte-wise swapped.
+ ld a, TX_KATAKANA
+ cp e
+ jr nz, .hiragana
+ ; if it's katakana,
+ ; make it hiragana by decreasing its high byte.
+ dec e
+.hiragana
+ pop hl
+.loop
+ ld a, [hli]
+ or a
+ jr z, .return
+ cp d
+ jr nz, .next
+ ld a, [hl]
+ cp e
+ jr nz, .next
+ inc hl
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ or a
+ ret
+.next
+ inc hl
+ inc hl
+ inc hl
+ jr .loop
+.return
+ scf
+ ret
+
+; given the position of the current cursor,
+; it returns the pointer to the proper information.
+; h: position x.
+; l: position y.
+GetCharInfoFromPos_Player:
+ push de
+ ; (information index) = (x) * (height) + (y)
+ ; (height) = 0x05(Deck) or 0x06(Player)
+ ld e, l
+ ld d, h
+ ld a, [wNamingScreenKeyboardHeight]
+ ld l, a
+ call HtimesL
+ ld a, l
+ add e
+ ld hl, KeyboardData_Player
+ pop de
+ or a
+ ret z
+.loop
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ dec a
+ jr nz, .loop
+ ret
+
+; a set of keyboard datum.
+; unit: 6 bytes.
+; structure:
+; abs. y pos. (1) / abs. x pos. (1) / type 1 (1) / type 2 (1) / char. code (2)
+; - unused data contains its character code as zero.
+kbitem: MACRO
+ db \1, \2, \3, \4
+ dw \5
+ENDM
+KeyboardData_Player: ; (6:6baf)
+ kbitem $04, $02, $11, $00, $0330
+ kbitem $06, $02, $12, $00, $0339
+ kbitem $08, $02, $13, $00, $0342
+ kbitem $0a, $02, $14, $00, $006f
+ kbitem $0c, $02, $15, $00, $0064
+ kbitem $10, $0f, $01, $09, $0000
+ kbitem $04, $04, $16, $00, $0331
+ kbitem $06, $04, $17, $00, $033a
+ kbitem $08, $04, $18, $00, $0343
+ kbitem $0a, $04, $19, $00, $035d
+ kbitem $0c, $04, $1a, $00, $0065
+ kbitem $10, $0f, $01, $09, $0000
+ kbitem $04, $06, $1b, $00, $0332
+ kbitem $06, $06, $1c, $00, $033b
+ kbitem $08, $06, $1d, $00, $0344
+ kbitem $0a, $06, $1e, $00, $006a
+ kbitem $0c, $06, $1f, $00, $0066
+ kbitem $10, $0f, $01, $09, $0000
+ kbitem $04, $08, $20, $00, $0333
+ kbitem $06, $08, $21, $00, $033c
+ kbitem $08, $08, $22, $00, $0345
+ kbitem $0a, $08, $23, $00, $006b
+ kbitem $0c, $08, $24, $00, $0067
+ kbitem $10, $0f, $01, $09, $0000
+ kbitem $04, $0a, $25, $00, $0334
+ kbitem $06, $0a, $26, $00, $033d
+ kbitem $08, $0a, $27, $00, $0346
+ kbitem $0a, $0a, $28, $00, $0077
+ kbitem $0c, $0a, $29, $00, $0068
+ kbitem $10, $0f, $01, $09, $0000
+ kbitem $04, $0c, $2a, $00, $0335
+ kbitem $06, $0c, $2b, $00, $033e
+ kbitem $08, $0c, $2c, $00, $0347
+ kbitem $0a, $0c, $2d, $00, $0060
+ kbitem $0c, $0c, $2e, $00, $0069
+ kbitem $10, $0f, $01, $09, $0000
+ kbitem $04, $0e, $2f, $00, $0336
+ kbitem $06, $0e, $30, $00, $033f
+ kbitem $08, $0e, $31, $00, $0348
+ kbitem $0a, $0e, $32, $00, $0061
+ kbitem $0c, $0e, $33, $00, $0513
+ kbitem $10, $0f, $01, $09, $0000
+ kbitem $04, $10, $34, $00, $0337
+ kbitem $06, $10, $35, $00, $0340
+ kbitem $08, $10, $36, $00, $0349
+ kbitem $0a, $10, $3c, $00, $0062
+ kbitem $0c, $10, $3d, $00, $0511
+ kbitem $10, $0f, $01, $09, $0000
+ kbitem $04, $12, $37, $00, $0338
+ kbitem $06, $12, $38, $00, $0341
+ kbitem $08, $12, $39, $00, $006e
+ kbitem $0a, $12, $3a, $00, $0063
+ kbitem $0c, $12, $3b, $00, $0070
+ kbitem $10, $0f, $01, $09, $0000
+ kbitem $00, $00, $00, $00, $0000
+; a set of transition datum.
+; unit: 4 bytes.
+; structure:
+; previous char. code (2) / translated char. code (2)
+; - the former char. code contains 0x0e in high byte.
+; - the latter char. code contains only low byte.
+TransitionTable1:
+ dw $0e16, $003e
+ dw $0e17, $003f
+ dw $0e18, $0040
+ dw $0e19, $0041
+ dw $0e1a, $0042
+ dw $0e1b, $0043
+ dw $0e1c, $0044
+ dw $0e1d, $0045
+ dw $0e1e, $0046
+ dw $0e1f, $0047
+ dw $0e20, $0048
+ dw $0e21, $0049
+ dw $0e22, $004a
+ dw $0e23, $004b
+ dw $0e24, $004c
+ dw $0e2a, $004d
+ dw $0e2b, $004e
+ dw $0e2c, $004f
+ dw $0e2d, $0050
+ dw $0e2e, $0051
+ dw $0e52, $004d
+ dw $0e53, $004e
+ dw $0e54, $004f
+ dw $0e55, $0050
+ dw $0e56, $0051
+ dw $0000
+TransitionTable2:
+ dw $0e2a, $0052
+ dw $0e2b, $0053
+ dw $0e2c, $0054
+ dw $0e2d, $0055
+ dw $0e2e, $0056
+ dw $0e4d, $0052
+ dw $0e4e, $0053
+ dw $0e4f, $0054
+ dw $0e50, $0055
+ dw $0e51, $0056
+ dw $0000
+
+; get deck name from the user into de.
+; function description is similar to the player's.
+; refer to 'InputPlayerName'.
+InputDeckName: ; 1ad89 (6:6d89)
+ push af
+ ; check if the buffer is empty.
+ ld a, [de]
+ or a
+ jr nz, .not_empty
+ ; this buffer will contain half-width chars.
+ ld a, TX_HALFWIDTH
+ ld [de], a
+.not_empty
+ pop af
+ inc a
+ call InitializeInputName
+ call Set_OBJ_8x8
+
+ xor a
+ ld [wTileMapFill], a
+ call EmptyScreen
+ call ZeroObjectPositions
+
+ ld a, $01
+ ld [wVBlankOAMCopyToggle], a
+ call LoadSymbolsFont
+
+ lb de, $38, $bf
+ call SetupText
+ call FillVramWith0xF0
+
+ xor a
+ ld [wd009], a
+ call Func_006_6e99
+
+ xor a
+ ld [wNamingScreenCursorX], a
+ ld [wNamingScreenCursorY], a
+
+ ld a, $09
+ ld [wd005], a
+ ld a, $07
+ ld [wNamingScreenKeyboardHeight], a
+ ld a, $0f
+ ld [wceaa], a
+ ld a, $00
+ ld [wceab], a
+.loop
+ ld a, $01
+ ld [wVBlankOAMCopyToggle], a
+ call DoFrame
+
+ call UpdateRNGSources
+
+ ldh a, [hDPadHeld]
+ and START
+ jr z, .on_start
+
+ ld a, $01
+ call PlaySFXByA
+ call Func_006_6fa1
+
+ ld a, 6
+ ld [wNamingScreenCursorX], a
+ ld [wNamingScreenCursorY], a
+ call Func_006_6fbd
+
+ jr .loop
+.on_start
+ call Func_006_6efb
+ jr nc, .loop
+
+ cp $ff
+ jr z, .asm_006_6e1c
+
+ call Func_006_6ec3
+ jr nc, .loop
+
+ call FinalizeInputName
+
+ ld hl, wNamingScreenDestPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ inc hl
+
+ ld a, [hl]
+ or a
+ jr nz, .return
+
+ dec hl
+ ld [hl], TX_END
+.return
+ ret
+.asm_006_6e1c
+ ld a, [wNamingScreenBufferLength]
+ cp $02
+ jr c, .loop
+
+ ld e, a
+ ld d, 0
+ ld hl, wNamingScreenBuffer
+ add hl, de
+ dec hl
+ ld [hl], TX_END
+
+ ld hl, wNamingScreenBufferLength
+ dec [hl]
+ call ProcessTextWithUnderbar
+
+ jp .loop
+
+; fill v0Tiles0 for 0x10 tiles
+; with 0xF0.
+FillVramWith0xF0:
+ ld hl, v0Tiles0
+ ld de, .data
+ ld b, 0
+.asm_006_6e3f
+ ld a, $10
+ cp b
+ ret z
+ inc b
+ ld a, [de]
+ inc de
+ ld [hli], a
+ jr .asm_006_6e3f
+.data
+rept $10
+ db $f0
+endr
+
+; it's only for naming the deck.
+ProcessTextWithUnderbar:
+ ld hl, wNamingScreenNamePosition
+ ld d, [hl]
+ inc hl
+ ld e, [hl]
+ call InitTextPrinting
+ ld hl, .underbar_data
+ ld de, wDefaultText
+.loop ; copy the underbar string.
+ ld a, [hli]
+ ld [de], a
+ inc de
+ or a
+ jr nz, .loop
+
+ ld hl, wNamingScreenBuffer
+ ld de, wDefaultText
+.loop2 ; copy the input from the user.
+ ld a, [hli]
+ or a
+ jr z, .print_name
+ ld [de], a
+ inc de
+ jr .loop2
+.print_name
+ ld hl, wDefaultText
+ call ProcessText
+ ret
+.underbar_data
+ db TX_HALFWIDTH
+rept MAX_DECK_NAME_LENGTH
+ db "_"
+endr
+ db TX_END
+
+Func_006_6e99:
+ call DrawTextboxForKeyboard
+ call ProcessTextWithUnderbar
+ ld hl, wNamingScreenQuestionPointer
+ ld c, [hl]
+ inc hl
+ ld a, [hl]
+ ld h, a
+ or c
+ jr z, .print
+ ; print the question string.
+ ld l, c
+ call PlaceTextItems
+.print
+ ; print "End"
+ ld hl, DrawNamingScreenBG.data
+ call PlaceTextItems
+ ; print the keyboard characters.
+ ldtx hl, NamingScreenKeyboardText ; "A B C D..."
+ lb de, 2, 4
+ call InitTextPrinting
+ call ProcessTextFromID
+ call EnableLCD
+ ret
+
+Func_006_6ec3:
+ ld a, [wNamingScreenCursorX]
+ ld h, a
+ ld a, [wNamingScreenCursorY]
+ ld l, a
+ call GetCharInfoFromPos_Deck
+ inc hl
+ inc hl
+ ld a, [hl]
+ cp $01
+ jr nz, .asm_006_6ed7
+ scf
+ ret
+.asm_006_6ed7
+ ld d, a
+ ld hl, wNamingScreenBufferLength
+ ld a, [hl]
+ ld c, a
+ push hl
+ ld hl, wNamingScreenBufferMaxLength
+ cp [hl]
+ pop hl
+ jr nz, .asm_006_6eeb
+ ld hl, wNamingScreenBuffer
+ dec hl
+ jr .asm_006_6eef
+.asm_006_6eeb
+ inc [hl]
+ ld hl, wNamingScreenBuffer
+.asm_006_6eef
+ ld b, 0
+ add hl, bc
+ ld [hl], d
+ inc hl
+ ld [hl], TX_END
+ call ProcessTextWithUnderbar
+ or a
+ ret
+
+Func_006_6efb:
+ xor a
+ ld [wcfe3], a
+ ldh a, [hDPadHeld]
+ or a
+ jp z, .asm_006_6f73
+ ld b, a
+ ld a, [wNamingScreenKeyboardHeight]
+ ld c, a
+ ld a, [wNamingScreenCursorX]
+ ld h, a
+ ld a, [wNamingScreenCursorY]
+ ld l, a
+ bit 6, b
+ jr z, .asm_006_6f1f
+ dec a
+ bit 7, a
+ jr z, .asm_006_6f4b
+ ld a, c
+ dec a
+ jr .asm_006_6f4b
+.asm_006_6f1f
+ bit 7, b
+ jr z, .asm_006_6f2a
+ inc a
+ cp c
+ jr c, .asm_006_6f4b
+ xor a
+ jr .asm_006_6f4b
+.asm_006_6f2a
+ cp $06
+ jr z, .asm_006_6f73
+ ld a, [wd005]
+ ld c, a
+ ld a, h
+ bit 5, b
+ jr z, .asm_006_6f40
+ dec a
+ bit 7, a
+ jr z, .asm_006_6f4e
+ ld a, c
+ dec a
+ jr .asm_006_6f4e
+.asm_006_6f40
+ bit 4, b
+ jr z, .asm_006_6f73
+ inc a
+ cp c
+ jr c, .asm_006_6f4e
+ xor a
+ jr .asm_006_6f4e
+.asm_006_6f4b
+ ld l, a
+ jr .asm_006_6f4f
+.asm_006_6f4e
+ ld h, a
+.asm_006_6f4f
+ push hl
+ call GetCharInfoFromPos_Deck
+ inc hl
+ inc hl
+ ld d, [hl]
+ push de
+ call Func_006_6fa1
+ pop de
+ pop hl
+ ld a, l
+ ld [wNamingScreenCursorY], a
+ ld a, h
+ ld [wNamingScreenCursorX], a
+ xor a
+ ld [wcea3], a
+ ld a, $02
+ cp d
+ jp z, Func_006_6efb
+ ld a, $01
+ ld [wcfe3], a
+.asm_006_6f73
+ ldh a, [hKeysPressed]
+ and $03
+ jr z, .asm_006_6f89
+ and $01
+ jr nz, .asm_006_6f7f
+ ld a, $ff
+.asm_006_6f7f
+ call PlaySFXByA
+ push af
+ call Func_006_6fbd
+ pop af
+ scf
+ ret
+.asm_006_6f89
+ ld a, [wcfe3]
+ or a
+ jr z, .asm_006_6f92
+ call PlaySFX
+.asm_006_6f92
+ ld hl, wcea3
+ ld a, [hl]
+ inc [hl]
+ and $0f
+ ret nz
+ ld a, [wceaa]
+ bit 4, [hl]
+ jr z, Func_006_6fa1.asm_006_6fa4
+
+Func_006_6fa1:
+ ld a, [wceab]
+.asm_006_6fa4
+ ld e, a
+ ld a, [wNamingScreenCursorX]
+ ld h, a
+ ld a, [wNamingScreenCursorY]
+ ld l, a
+ call GetCharInfoFromPos_Deck
+ ld a, [hli]
+ ld c, a
+ ld b, [hl]
+ dec b
+ ld a, e
+ call Func_006_6fc2
+ call WriteByteToBGMap0
+ or a
+ ret
+
+Func_006_6fbd:
+ ld a, [wceaa]
+ jr Func_006_6fa1.asm_006_6fa4
+
+Func_006_6fc2:
+ push af
+ push bc
+ push de
+ push hl
+ push af
+ call ZeroObjectPositions
+ pop af
+ ld b, a
+ ld a, [wceab]
+ cp b
+ jr z, .asm_006_6ffb
+ ld a, [wNamingScreenBufferLength]
+ ld d, a
+ ld a, [wNamingScreenBufferMaxLength]
+ ld e, a
+ ld a, d
+ cp e
+ jr nz, .asm_006_6fdf
+ dec a
+.asm_006_6fdf
+ dec a
+ ld d, a
+ ld hl, wNamingScreenNamePosition
+ ld a, [hl]
+ sla a
+ add d
+ ld d, a
+ ld h, $04
+ ld l, d
+ call HtimesL
+ ld a, l
+ add $08
+ ld d, a
+ ld e, $18
+ ld bc, $0000
+ call SetOneObjectAttributes
+.asm_006_6ffb
+ pop hl
+ pop de
+ pop bc
+ pop af
+ ret
+
+; given the cursor position,
+; returns the character information which the cursor directs.
+; it's similar to "GetCharInfoFromPos_Player",
+; but the data structure is different in its unit size.
+; its unit size is 3, and player's is 6.
+; h: x
+; l: y
+GetCharInfoFromPos_Deck:
+ push de
+ ld e, l
+ ld d, h
+ ld a, [wNamingScreenKeyboardHeight]
+ ld l, a
+ call HtimesL
+ ld a, l
+ add e
+ ; x * h + y
+ ld hl, KeyboardData_Deck
+ pop de
+ or a
+ ret z
+.loop
+ inc hl
+ inc hl
+ inc hl
+ dec a
+ jr nz, .loop
+ ret
+
+; a bunch of data
+KeyboardData_Deck: ; (6:7019)
+ INCROM $1b019, $1b8e8
+ INCROM $1b8e8, $1ba12
+
+Func_006_7a12: ; (6:7a12)
+ push af
+ ld [bc], a
+ call EnableSRAM
+ ld a, [wd0a9]
+ ld l, a
+ ld h, $1e
+ call HtimesL
+ ld bc, $78e8
+ add hl, bc
+ ld b, $00
+.asm_006_7a26
+ call Func_006_7a4c
+ call Func_006_7a5b
+ call Func_006_7a7d
+ push hl
+ ld de, wd0aa
+ ld h, b
+ ld l, $02
+ call HtimesL
+ add hl, de
+ ld d, h
+ ld e, l
+ pop hl
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc b
+ ld a, b
+ cp $05
+ jr nz, .asm_006_7a26
+ call DisableSRAM
+ ret
+
+Func_006_7a4c:
+ push hl
+ ld l, b
+ ld h, $54
+ call HtimesL
+ ld de, s0a350
+ add hl, de
+ ld d, h
+ ld e, l
+ pop hl
+ ret
+
+Func_006_7a5b:
+ push hl
+ push bc
+ push de
+ push de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ pop hl
+ ld bc, $0018
+ add hl, bc
+.asm_006_7a67
+ ld a, [de]
+ inc de
+ ld b, a
+ or a
+ jr z, .asm_006_7a77
+ ld a, [de]
+ inc de
+ ld c, a
+.asm_006_7a70
+ ld [hl], c
+ inc hl
+ dec b
+ jr nz, .asm_006_7a70
+ jr .asm_006_7a67
+.asm_006_7a77
+ pop de
+ pop bc
+ pop hl
+ inc hl
+ inc hl
+ ret
+
+Func_006_7a7d:
+ push hl
+ push bc
+ push de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, wd089
+ call CopyText
+ pop hl
+ ld de, wd089
+.asm_006_7a8d
+ ld a, [de]
+ ld [hli], a
+ or a
+ jr z, .asm_006_7a95
+ inc de
+ jr .asm_006_7a8d
+.asm_006_7a95
+ pop bc
+ pop hl
+ inc hl
+ inc hl
+ ret
+
+; farcall from 0xb87e(2:787d): [EF|06|9A|7A]
+Func_006_7a9a: ; (6:7a9a)
+ xor a
+ ld [wd0a6], a
+ ld a, $01
+.asm_006_7aa0
+ call Func_006_7ae4
+ ret nc
+ sla a
+ cp $10
+ jr z, .asm_006_7aac
+ jr .asm_006_7aa0
+.asm_006_7aac
+ ld a, $03
+ call Func_006_7ae4
+ ret nc
+ ld a, $05
+ call Func_006_7ae4
+ ret nc
+ ld a, $09
+ call Func_006_7ae4
+ ret nc
+ ld a, $06
+ call Func_006_7ae4
+ ret nc
+ ld a, $0a
+ call Func_006_7ae4
+ ret nc
+ ld a, $0c
+ call Func_006_7ae4
+ ret nc
+ ld a, $f7
+.asm_006_7ad2
+ call Func_006_7ae4
+ ret nc
+ sra a
+ cp $ff
+ jr z, .asm_006_7ade
+ jr .asm_006_7ad2
+.asm_006_7ade
+ call Func_006_7ae4
+ ret nc
+ scf
+ ret
+
+Func_006_7ae4:
+ push af
+ ld hl, wd088
+ ld b, [hl]
+ farcall $2, $7625
+ jr c, .asm_006_7af5
+ pop af
+ ld [wd0a6], a
+ or a
+ ret
+.asm_006_7af5
+ pop af
+ scf
+ ret
-Func_1ad89: ; 1ad89 (6:6d89)
- INCROM $1ad89, $1c000
+rept $508
+ db $ff
+endr \ No newline at end of file
diff --git a/src/engine/home.asm b/src/engine/home.asm
index 0046286..cab683d 100644
--- a/src/engine/home.asm
+++ b/src/engine/home.asm
@@ -1704,7 +1704,7 @@ SetManyObjectsAttributes: ; 950 (0:950)
; for the sprite at wOAM + [wOAMOffset] / 4, set its attributes from registers e, d, c, b
; return carry if [wOAMOffset] > 40 * 4 (beyond the end of wOAM)
-SetOneObjectAttributes: ; 97f (0:97f)
+SetOneObjectAttributes: ; 097f (0:097f)
push hl
ld a, [wOAMOffset]
ld l, a
@@ -5351,7 +5351,7 @@ CopyOpponentName: ; 1c8e (0:1c8e)
ld h, a
jp CopyText
.special_name
- ld hl, wc500
+ ld hl, wNameBuffer
ld a, [hl]
or a
jr z, .print_player2
diff --git a/src/macros/data.asm b/src/macros/data.asm
index 53926da..a7ac93d 100644
--- a/src/macros/data.asm
+++ b/src/macros/data.asm
@@ -88,4 +88,4 @@ ENDM
textitem: MACRO
db \1, \2
tx \3
-ENDM
+ENDM \ No newline at end of file
diff --git a/src/sram.asm b/src/sram.asm
index fa58d07..272fbfd 100644
--- a/src/sram.asm
+++ b/src/sram.asm
@@ -19,11 +19,13 @@ s0a009:: ; a009
ds $1
s0a00a:: ; a00a
ds $1
-
- ds $5
+s0a00b:: ; a00b
+ ds $1
+s0a00c:: ; a00c
+ ds $4
sPlayerName:: ; a010
- ds $10
+ ds NAME_BUFFER_LENGTH
ds $e0
diff --git a/src/text/text2.asm b/src/text/text2.asm
index 6a37642..27ccff9 100644
--- a/src/text/text2.asm
+++ b/src/text/text2.asm
@@ -1523,11 +1523,11 @@ Text021c: ; 3b7f9 (e:77f9)
textfw3 "A", "B", "C"
done
-Text021d: ; 3b800 (e:7800)
+EndText: ; 3b800 (e:7800)
text "End"
done
-Text021e: ; 3b805 (e:7805)
+WhatIsYourNameText: ; 3b805 (e:7805)
text "What is your name?"
done
@@ -1580,7 +1580,7 @@ Text0221: ; 3b8f2 (e:78f2)
textfw0 " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "
done
-Text0222: ; 3b97b (e:797b)
+NamingScreenKeyboardText: ; 3b97b (e:797b)
textfw3 "A", " ", "B", " ", "C", " ", "D", " ", "E", " ", "F", " ", "G", " ", "H", " ", "I"
line ""
textfw3 "J", " ", "K", " ", "L", " ", "M", " ", "N", " ", "O", " ", "P", " ", "Q", " ", "R"
diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm
index bd1da35..65dab94 100644
--- a/src/text/text_offsets.asm
+++ b/src/text/text_offsets.asm
@@ -542,12 +542,12 @@ TextOffsets:: ; 34000 (d:4000)
textpointer Text021a ; 0x021a
textpointer Text021b ; 0x021b
textpointer Text021c ; 0x021c
- textpointer Text021d ; 0x021d
- textpointer Text021e ; 0x021e
+ textpointer EndText ; 0x021d
+ textpointer WhatIsYourNameText ; 0x021e
textpointer Text021f ; 0x021f
textpointer Text0220 ; 0x0220
textpointer Text0221 ; 0x0221
- textpointer Text0222 ; 0x0222
+ textpointer NamingScreenKeyboardText ; 0x0222
textpointer NewDeckText ; 0x0223
textpointer PleaseSelectDeckText ; 0x0224
textpointer Text0225 ; 0x0225
diff --git a/src/wram.asm b/src/wram.asm
index 5d22c69..3af5361 100644
--- a/src/wram.asm
+++ b/src/wram.asm
@@ -363,8 +363,9 @@ ENDU
wOpponentDeck:: ; c480
ds $80
-wc500:: ; c500
- ds $10
+; this holds names like player's or opponent's.
+wNameBuffer:: ; c500
+ ds NAME_BUFFER_LENGTH
; this holds an $ff-terminated list of card deck indexes (e.g. cards in hand or in bench)
; or (less often) the attack list of a Pokemon card
@@ -1303,7 +1304,11 @@ wce5e:: ; ce5e
wce60:: ; ce60
ds $1
- ds $2
+wce61:: ; ce61
+ ds $1
+
+wGlossaryPageNo:: ; ce62
+ ds $1
wce63:: ; ce63
ds $1
@@ -1386,12 +1391,20 @@ wcea1:: ; cea1
wcea3:: ; cea3
ds $1
- ds $5
+wNamingScreenCursorY:: ; cea4
+ ds $1
-wcea9:: ; cea9
+wcea5:: ; cea5
+ ds $4
+
+wNamingScreenKeyboardHeight:: ; cea9
ds $1
- ds $5
+wceaa:: ; ceaa
+ ds $1
+
+wceab:: ; ceab
+ ds $4
wceaf:: ; ceaf
ds $1
@@ -1459,13 +1472,40 @@ wcfda:: ; cfda
ds $7
wcfe3:: ; cfe3
- ds $1
+ ds $4
- ds $1c
+; a name buffer in the naming screen.
+wNamingScreenBuffer:: ; cfe7
+ ds NAMING_SCREEN_BUFFER_LENGTH
+
+; current name length in the naming screen.
+wNamingScreenBufferLength:: ; cfff
+ ds $1
SECTION "WRAM1", WRAMX
+wNamingScreenDestPointer:: ; d000
+ ds $2
- ds $d
+wNamingScreenQuestionPointer:: ; d002
+ ds $2
+
+; max length of name buffer.
+; it's given for limiting the player's input.
+wNamingScreenBufferMaxLength:: ; d004
+ ds $1
+
+wd005:: ; d005
+ ds $1
+
+wNamingScreenCursorX:: ; d006
+ ds $1
+
+; the position to display the input on.
+wNamingScreenNamePosition:: ; d007
+ ds $2
+
+wd009:: ; d009
+ ds $4
wd00d:: ; d00d
ds $1
@@ -1481,7 +1521,11 @@ wd087:: ; d087
wd088:: ; d088
ds $1
- ds $19
+wd089:: ; d089
+ ds $1
+
+wd08a:: ; d08a
+ ds $18
wd0a2:: ; d0a2
ds $2
@@ -1492,7 +1536,11 @@ wd0a4:: ; d0a4
wd0a5:: ; d0a5
ds $1
- ds $3
+wd0a6:: ; d0a6
+ ds $1
+
+dw0a7:: ; d0a7
+ ds $2
wd0a9:: ; d0a9
ds $1