mirror of
https://github.com/pret/pokeyellow.git
synced 2026-05-13 22:43:07 -05:00
725 lines
11 KiB
NASM
725 lines
11 KiB
NASM
TextBoxBorder:: ; 16f0 (0:16f0)
|
||
; Draw a cxb text box at hl.
|
||
|
||
; top row
|
||
push hl
|
||
ld a, "┌"
|
||
ld [hli], a
|
||
inc a ; ─
|
||
call NPlaceChar
|
||
inc a ; ┐
|
||
ld [hl], a
|
||
pop hl
|
||
|
||
ld de, 20
|
||
add hl, de
|
||
|
||
; middle rows
|
||
.next
|
||
push hl
|
||
ld a, "│"
|
||
ld [hli], a
|
||
ld a, " "
|
||
call NPlaceChar
|
||
ld [hl], "│"
|
||
pop hl
|
||
|
||
ld de, 20
|
||
add hl, de
|
||
dec b
|
||
jr nz, .next
|
||
|
||
; bottom row
|
||
ld a, "└"
|
||
ld [hli], a
|
||
ld a, "─"
|
||
call NPlaceChar
|
||
ld [hl], "┘"
|
||
ret
|
||
|
||
NPlaceChar:: ; 171d (0:171d)
|
||
; Place char a c times.
|
||
ld d, c
|
||
.loop
|
||
ld [hli], a
|
||
dec d
|
||
jr nz, .loop
|
||
ret
|
||
|
||
PlaceString:: ; 1723 (0:1723)
|
||
push hl
|
||
PlaceNextChar:: ; 1724 (0:1724)
|
||
ld a, [de]
|
||
|
||
cp "@"
|
||
jr nz, Char4ETest
|
||
ld b, h
|
||
ld c, l
|
||
pop hl
|
||
ret
|
||
|
||
Char4ETest:: ; 172d (0:172d)
|
||
cp $4E
|
||
jr nz, .next
|
||
ld bc, $0028
|
||
ld a, [hFlags_0xFFFA]
|
||
bit 2, a
|
||
jr z, .next2
|
||
ld bc, SCREEN_WIDTH
|
||
.next2
|
||
pop hl
|
||
add hl, bc
|
||
push hl
|
||
jp PlaceNextChar_inc ; 17b6
|
||
|
||
.next
|
||
cp $4F
|
||
jr nz, .next3
|
||
pop hl
|
||
coord hl, 1, 16
|
||
push hl
|
||
jp PlaceNextChar_inc
|
||
|
||
.next3 ; Check against a dictionary
|
||
and a
|
||
jp z, Char00
|
||
cp $4C
|
||
jp z, Char4C
|
||
cp $4B
|
||
jp z, Char4B
|
||
cp $51
|
||
jp z, Char51
|
||
cp $49
|
||
jp z, Char49
|
||
cp $52
|
||
jp z, Char52
|
||
cp $53
|
||
jp z, Char53
|
||
cp $54
|
||
jp z, Char54
|
||
cp $5B
|
||
jp z, Char5B
|
||
cp $5E
|
||
jp z, Char5E
|
||
cp $5C
|
||
jp z, Char5C
|
||
cp $5D
|
||
jp z, Char5D
|
||
cp $55
|
||
jp z, Char55
|
||
cp $56
|
||
jp z, Char56
|
||
cp $57
|
||
jp z, Char57
|
||
cp $58
|
||
jp z, Char58
|
||
cp $4A
|
||
jp z, Char4A
|
||
cp $5F
|
||
jp z, Char5F
|
||
cp $59
|
||
jp z, Char59
|
||
cp $5A
|
||
jp z, Char5A
|
||
ld [hli], a
|
||
call PrintLetterDelay
|
||
PlaceNextChar_inc:: ; 17b6 (0:17b6)
|
||
inc de
|
||
jp PlaceNextChar
|
||
|
||
Char00:: ; 17ba (0:17ba)
|
||
ld b, h
|
||
ld c, l
|
||
pop hl
|
||
ld de, Char00Text
|
||
dec de
|
||
ret
|
||
|
||
Char00Text:: ; 17c2 (0:17c2) ; “%d ERROR.”
|
||
TX_FAR _Char00Text ; a0c66 (28:4c66)
|
||
db "@"
|
||
|
||
Char52:: ; 17c7 (0:17c7) ; player’s name
|
||
push de
|
||
ld de, wPlayerName
|
||
jr FinishDTE
|
||
|
||
Char53:: ; 17cd (0:17cd) ; rival’s name
|
||
push de
|
||
ld de, wRivalName
|
||
jr FinishDTE
|
||
|
||
Char5D:: ; 17d3 (0:17d3) ; TRAINER
|
||
push de
|
||
ld de, Char5DText
|
||
jr FinishDTE
|
||
|
||
Char5C:: ; 17d9 (0:17d9) ; TM
|
||
push de
|
||
ld de, Char5CText
|
||
jr FinishDTE
|
||
|
||
Char5B:: ; 17df (0:17df) ; PC
|
||
push de
|
||
ld de, Char5BText
|
||
jr FinishDTE
|
||
|
||
Char5E:: ; 17e5 (0:17e5) ; ROCKET
|
||
push de
|
||
ld de, Char5EText
|
||
jr FinishDTE
|
||
|
||
Char54:: ; 17eb (0:17eb) ; POKé
|
||
push de
|
||
ld de, Char54Text
|
||
jr FinishDTE
|
||
|
||
Char56:: ; 17f1 (0:17f1) ; ……
|
||
push de
|
||
ld de, Char56Text
|
||
jr FinishDTE
|
||
|
||
Char4A:: ; 17f7 (0:17f7) ; PKMN
|
||
push de
|
||
ld de, Char4AText
|
||
jr FinishDTE
|
||
|
||
Char59:: ; 17fb (0:17fb)
|
||
; depending on whose turn it is, print
|
||
; enemy active monster’s name, prefixed with “Enemy ”
|
||
; or
|
||
; player active monster’s name
|
||
; (like Char5A but flipped)
|
||
ld a, [H_WHOSETURN]
|
||
xor 1
|
||
jr MonsterNameCharsCommon
|
||
|
||
Char5A:: ; 1803 (0:1803)
|
||
; depending on whose turn it is, print
|
||
; player active monster’s name
|
||
; or
|
||
; enemy active monster’s name, prefixed with “Enemy ”
|
||
ld a, [H_WHOSETURN]
|
||
MonsterNameCharsCommon:: ; 1a37 (0:1a37)
|
||
push de
|
||
and a
|
||
jr nz, .Enemy
|
||
ld de, wBattleMonNick ; player active monster name
|
||
jr FinishDTE
|
||
|
||
.Enemy
|
||
; print “Enemy ”
|
||
ld de, Char5AText
|
||
call PlaceString
|
||
ld h, b
|
||
ld l, c
|
||
ld de, wEnemyMonNick ; enemy active monster name
|
||
|
||
FinishDTE:: ; 1819 (0:1819)
|
||
call PlaceString
|
||
ld h, b
|
||
ld l, c
|
||
pop de
|
||
inc de
|
||
jp PlaceNextChar
|
||
|
||
Char5CText:: ; 1823 (0:1823)
|
||
db "TM@"
|
||
Char5DText:: ; 1826 (0:1826)
|
||
db "TRAINER@"
|
||
Char5BText:: ; 182e (0:182e)
|
||
db "PC@"
|
||
Char5EText:: ; 1831 (0:1830)
|
||
db "ROCKET@"
|
||
Char54Text:: ; 1838 (0:1838)
|
||
db "POKé@"
|
||
Char56Text:: ; 183d (0:183d)
|
||
db "……@"
|
||
Char5AText:: ; 1840 (0:1840)
|
||
db "Enemy @"
|
||
Char4AText:: ; 1847 (0:1847)
|
||
db $E1, $E2, "@" ; PKMN
|
||
|
||
Char55:: ; 184a (0:184a)
|
||
push de
|
||
ld b, h
|
||
ld c, l
|
||
ld hl, Char55Text
|
||
call TextCommandProcessor ; 1919
|
||
ld h, b
|
||
ld l, c
|
||
pop de
|
||
inc de
|
||
jp PlaceNextChar
|
||
|
||
Char55Text:: ; 185a (0:185a)
|
||
; equivalent to Char4B
|
||
TX_FAR _Char55Text ; a0c73 (28:4c73)
|
||
db "@"
|
||
|
||
Char5F:: ; 185f (0:185f)
|
||
; ends a Pokédex entry
|
||
ld [hl], "."
|
||
pop hl
|
||
ret
|
||
|
||
Char58:: ; 1863 (0:1863)
|
||
ld a, [wLinkState]
|
||
cp LINK_STATE_BATTLING
|
||
jp z, Next1870
|
||
ld a, $EE
|
||
Coorda 18, 16
|
||
Next1870:: ; 1870 (0:1870)
|
||
call ProtectedDelay3 ; 1913
|
||
call ManualTextScroll ; 388e
|
||
ld a, " " ; space
|
||
Coorda 18, 16
|
||
Char57:: ; 1aad (0:1aad)
|
||
pop hl
|
||
ld de, Char58Text
|
||
dec de
|
||
ret
|
||
|
||
Char58Text:: ; 1881 (0:1881)
|
||
db "@"
|
||
|
||
Char51:: ; 1882 (0:1882)
|
||
push de
|
||
ld a, $EE
|
||
Coorda 18, 16
|
||
call ProtectedDelay3
|
||
call ManualTextScroll
|
||
coord hl, 1, 13
|
||
lb bc, 4, 18
|
||
call ClearScreenArea
|
||
ld c, 20
|
||
call DelayFrames
|
||
pop de
|
||
coord hl, 1, 14
|
||
jp PlaceNextChar_inc
|
||
|
||
Char49:: ; 18a3 (0:18a3)
|
||
ld a, [hFlags_0xFFFA]
|
||
bit 3, a
|
||
jr z, .Char49
|
||
ld a, $4e
|
||
jp Char4ETest
|
||
|
||
.Char49
|
||
push de
|
||
ld a, $EE
|
||
Coorda 18, 16
|
||
call ProtectedDelay3
|
||
call ManualTextScroll
|
||
coord hl, 1, 10
|
||
lb bc, 7, 18
|
||
call ClearScreenArea
|
||
ld c, 20
|
||
call DelayFrames
|
||
pop de
|
||
pop hl
|
||
coord hl, 1, 11
|
||
push hl
|
||
jp PlaceNextChar_inc
|
||
|
||
Char4B:: ; 18d1 (0:18d1)
|
||
ld a, $EE
|
||
Coorda 18, 16
|
||
call ProtectedDelay3
|
||
push de
|
||
call ManualTextScroll
|
||
pop de
|
||
ld a, " "
|
||
Coorda 18, 16
|
||
;fall through
|
||
Char4C:: ; 18e3 (0:18e3)
|
||
push de
|
||
call Next18F1 ; 18f1
|
||
call Next18F1
|
||
coord hl, 1, 16
|
||
pop de
|
||
jp PlaceNextChar_inc
|
||
|
||
Next18F1:: ; 18f1 (0:18f1)
|
||
coord hl, 0, 14
|
||
coord de, 0, 13
|
||
ld b, 60
|
||
.next
|
||
ld a, [hli]
|
||
ld [de], a
|
||
inc de
|
||
dec b
|
||
jr nz, .next
|
||
coord hl, 1, 16
|
||
ld a, " "
|
||
ld b, SCREEN_WIDTH - 2
|
||
.next2
|
||
ld [hli], a
|
||
dec b
|
||
jr nz, .next2
|
||
|
||
; wait five frames
|
||
ld b, 5
|
||
.WaitFrame
|
||
call DelayFrame
|
||
dec b
|
||
jr nz, .WaitFrame
|
||
|
||
ret
|
||
|
||
ProtectedDelay3:: ; 1913 (0:1913)
|
||
push bc
|
||
call Delay3
|
||
pop bc
|
||
ret
|
||
|
||
TextCommandProcessor:: ; 1919 (0:1919)
|
||
ld a, [wLetterPrintingDelayFlags]
|
||
push af
|
||
set 1, a
|
||
ld e, a
|
||
ld a, [$fff9]
|
||
xor e
|
||
ld [wLetterPrintingDelayFlags], a
|
||
ld a, c
|
||
ld [wTextDestinationTileAddrBuffer], a
|
||
ld a, b
|
||
ld [wTextDestinationTileAddrBuffer + 1], a
|
||
|
||
NextTextCommand:: ; 192e (0:192e)
|
||
ld a, [hli]
|
||
cp a, "@" ; terminator
|
||
jr nz, .doTextCommand
|
||
pop af
|
||
ld [wLetterPrintingDelayFlags], a
|
||
ret
|
||
.doTextCommand
|
||
push hl
|
||
cp a, $17
|
||
jp z, TextCommand17
|
||
cp a, $0e
|
||
jp nc, TextCommand0B ; if a != 0x17 and a >= 0xE, go to command 0xB
|
||
; if a < 0xE, use a jump table
|
||
ld hl, TextCommandJumpTable
|
||
push bc
|
||
add a
|
||
ld b, $00
|
||
ld c, a
|
||
add hl, bc
|
||
pop bc
|
||
ld a, [hli]
|
||
ld h, [hl]
|
||
ld l, a
|
||
jp [hl]
|
||
|
||
; draw box
|
||
; 04AAAABBCC
|
||
; AAAA = address of upper left corner
|
||
; BB = height
|
||
; CC = width
|
||
TextCommand04:: ; 1951 (0:1951)
|
||
pop hl
|
||
ld a, [hli]
|
||
ld e, a
|
||
ld a, [hli]
|
||
ld d, a
|
||
ld a, [hli]
|
||
ld b, a
|
||
ld a, [hli]
|
||
ld c, a
|
||
push hl
|
||
ld h, d
|
||
ld l, e
|
||
call TextBoxBorder
|
||
pop hl
|
||
jr NextTextCommand
|
||
|
||
; place string inline
|
||
; 00{string}
|
||
TextCommand00:: ; 1963 (0:1963)
|
||
pop hl
|
||
ld d, h
|
||
ld e, l
|
||
ld h, b
|
||
ld l, c
|
||
call PlaceString
|
||
ld h, d
|
||
ld l, e
|
||
inc hl
|
||
jr NextTextCommand
|
||
|
||
; place string from RAM
|
||
; 01AAAA
|
||
; AAAA = address of string
|
||
TextCommand01:: ; 1970 (0:1970)
|
||
pop hl
|
||
ld a, [hli]
|
||
ld e, a
|
||
ld a, [hli]
|
||
ld d, a
|
||
push hl
|
||
ld h, b
|
||
ld l, c
|
||
call PlaceString
|
||
pop hl
|
||
jr NextTextCommand
|
||
|
||
; print BCD number
|
||
; 02AAAABB
|
||
; AAAA = address of BCD number
|
||
; BB
|
||
; bits 0-4 = length in bytes
|
||
; bits 5-7 = unknown flags
|
||
TextCommand02:: ; 197e (0:197e)
|
||
pop hl
|
||
ld a, [hli]
|
||
ld e, a
|
||
ld a, [hli]
|
||
ld d, a
|
||
ld a, [hli]
|
||
push hl
|
||
ld h, b
|
||
ld l, c
|
||
ld c, a
|
||
call PrintBCDNumber
|
||
ld b, h
|
||
ld c, l
|
||
pop hl
|
||
jr NextTextCommand
|
||
|
||
; repoint destination address
|
||
; 03AAAA
|
||
; AAAA = new destination address
|
||
TextCommand03:: ; 1990 (0:1990)
|
||
pop hl
|
||
ld a, [hli]
|
||
ld [wTextDestinationTileAddrBuffer], a
|
||
ld c, a
|
||
ld a, [hli]
|
||
ld [wTextDestinationTileAddrBuffer + 1], a
|
||
ld b, a
|
||
jp NextTextCommand
|
||
|
||
; repoint destination to second line of dialogue text box
|
||
; 05
|
||
; (no arguments)
|
||
TextCommand05:: ; 199e (0:199e)
|
||
pop hl
|
||
coord bc, 1, 16 ; address of second line of dialogue text box
|
||
jp NextTextCommand
|
||
|
||
; blink arrow and wait for A or B to be pressed
|
||
; 06
|
||
; (no arguments)
|
||
TextCommand06:: ; 19a5 (0:19a5)
|
||
ld a, [wLinkState]
|
||
cp a, LINK_STATE_BATTLING
|
||
jp z, TextCommand0D
|
||
ld a, $ee ; down arrow
|
||
Coorda 18, 16 ; place down arrow in lower right corner of dialogue text box
|
||
push bc
|
||
call ManualTextScroll ; blink arrow and wait for A or B to be pressed
|
||
pop bc
|
||
ld a, " "
|
||
Coorda 18, 16 ; overwrite down arrow with blank space
|
||
pop hl
|
||
jp NextTextCommand
|
||
|
||
; scroll text up one line
|
||
; 07
|
||
; (no arguments)
|
||
TextCommand07:: ; 19c0 (0:19c0)
|
||
ld a, " "
|
||
Coorda 18, 16 ; place blank space in lower right corner of dialogue text box
|
||
call Next18F1 ; scroll up text
|
||
call Next18F1
|
||
pop hl
|
||
coord bc, 1, 16 ; address of second line of dialogue text box
|
||
jp NextTextCommand
|
||
|
||
; execute asm inline
|
||
; 08{code}
|
||
TextCommand08:: ; 19d2 (0:19d2)
|
||
pop hl
|
||
ld de, NextTextCommand
|
||
push de ; return address
|
||
jp [hl]
|
||
|
||
; print decimal number (converted from binary number)
|
||
; 09AAAABB
|
||
; AAAA = address of number
|
||
; BB
|
||
; bits 0-3 = how many digits to display
|
||
; bits 4-7 = how long the number is in bytes
|
||
TextCommand09:: ; 19d8 (0:19d8)
|
||
pop hl
|
||
ld a, [hli]
|
||
ld e, a
|
||
ld a, [hli]
|
||
ld d, a
|
||
ld a, [hli]
|
||
push hl
|
||
ld h, b
|
||
ld l, c
|
||
ld b, a
|
||
and a, $0f
|
||
ld c, a
|
||
ld a, b
|
||
and a, $f0
|
||
swap a
|
||
set BIT_LEFT_ALIGN, a
|
||
ld b, a
|
||
call PrintNumber
|
||
ld b, h
|
||
ld c, l
|
||
pop hl
|
||
jp NextTextCommand
|
||
|
||
; wait half a second if the user doesn't hold A or B
|
||
; 0A
|
||
; (no arguments)
|
||
TextCommand0A:: ; 19f6 (0:19f6)
|
||
push bc
|
||
call Joypad
|
||
ld a, [hJoyHeld]
|
||
and a, A_BUTTON | B_BUTTON
|
||
jr nz, .skipDelay
|
||
ld c, 30
|
||
call DelayFrames
|
||
.skipDelay
|
||
pop bc
|
||
pop hl
|
||
jp NextTextCommand
|
||
|
||
; plays sounds
|
||
; this actually handles various command ID's, not just 0B
|
||
; (no arguments)
|
||
TextCommand0B:: ; 1a0a (0:1a0a)
|
||
pop hl
|
||
push bc
|
||
dec hl
|
||
ld a, [hli]
|
||
ld b, a ; b = command number that got us here
|
||
push hl
|
||
ld hl, TextCommandSounds
|
||
.loop
|
||
ld a, [hli]
|
||
cp b
|
||
jr z, .matchFound
|
||
inc hl
|
||
jr .loop
|
||
.matchFound
|
||
cp a, $14
|
||
jr z, .pokemonCry
|
||
cp a, $15
|
||
jr z, .pokemonCry
|
||
cp a, $16
|
||
jr z, .pokemonCry
|
||
ld a, [hl]
|
||
call PlaySound
|
||
call WaitForSoundToFinish
|
||
pop hl
|
||
pop bc
|
||
jp NextTextCommand
|
||
.pokemonCry
|
||
push de
|
||
ld a, [hl]
|
||
call PlayCry
|
||
pop de
|
||
pop hl
|
||
pop bc
|
||
jp NextTextCommand
|
||
|
||
; format: text command ID, sound ID or cry ID
|
||
TextCommandSounds:: ; 1a3d (0:1a3d)
|
||
db $0B, SFX_GET_ITEM_1
|
||
db $12, SFX_TURN_OFF_PC
|
||
db $0E, SFX_POKEDEX_RATING
|
||
db $0F, SFX_GET_ITEM_1
|
||
db $10, SFX_GET_ITEM_2
|
||
db $11, SFX_GET_KEY_ITEM
|
||
db $13, SFX_TRADE_MACHINE
|
||
db $14, PIKACHU ; used in OakSpeech
|
||
db $15, PIDGEOT ; used in SaffronCityText12
|
||
db $16, DEWGONG ; unused?
|
||
|
||
; draw ellipses
|
||
; 0CAA
|
||
; AA = number of ellipses to draw
|
||
TextCommand0C:: ; 1a51 (0:1a51)
|
||
pop hl
|
||
ld a, [hli]
|
||
ld d, a
|
||
push hl
|
||
ld h, b
|
||
ld l, c
|
||
.loop
|
||
ld a, $75 ; ellipsis
|
||
ld [hli], a
|
||
push de
|
||
call Joypad
|
||
pop de
|
||
ld a, [hJoyHeld] ; joypad state
|
||
and a, A_BUTTON | B_BUTTON
|
||
jr nz, .skipDelay ; if so, skip the delay
|
||
ld c, 10
|
||
call DelayFrames
|
||
.skipDelay
|
||
dec d
|
||
jr nz, .loop
|
||
ld b, h
|
||
ld c, l
|
||
pop hl
|
||
jp NextTextCommand
|
||
|
||
; wait for A or B to be pressed
|
||
; 0D
|
||
; (no arguments)
|
||
TextCommand0D:: ; 1a73 (0:1a73)
|
||
push bc
|
||
call ManualTextScroll ; wait for A or B to be pressed
|
||
pop bc
|
||
pop hl
|
||
jp NextTextCommand
|
||
|
||
; process text commands in another ROM bank
|
||
; 17AAAABB
|
||
; AAAA = address of text commands
|
||
; BB = bank
|
||
TextCommand17:: ; 1a7c (0:1a7c)
|
||
pop hl
|
||
ld a, [H_LOADEDROMBANK]
|
||
push af
|
||
ld a, [hli]
|
||
ld e, a
|
||
ld a, [hli]
|
||
ld d, a
|
||
ld a, [hli]
|
||
ld [H_LOADEDROMBANK], a
|
||
ld [MBC1RomBank], a
|
||
push hl
|
||
ld l, e
|
||
ld h, d
|
||
call TextCommandProcessor
|
||
pop hl
|
||
pop af
|
||
ld [H_LOADEDROMBANK], a
|
||
ld [MBC1RomBank], a
|
||
jp NextTextCommand
|
||
|
||
TextCommandJumpTable:: ; 1a9a (0:1a9a)
|
||
dw TextCommand00
|
||
dw TextCommand01
|
||
dw TextCommand02
|
||
dw TextCommand03
|
||
dw TextCommand04
|
||
dw TextCommand05
|
||
dw TextCommand06
|
||
dw TextCommand07
|
||
dw TextCommand08
|
||
dw TextCommand09
|
||
dw TextCommand0A
|
||
dw TextCommand0B
|
||
dw TextCommand0C
|
||
dw TextCommand0D
|