summaryrefslogtreecommitdiff
path: root/main.asm
diff options
context:
space:
mode:
Diffstat (limited to 'main.asm')
-rw-r--r--main.asm3398
1 files changed, 0 insertions, 3398 deletions
diff --git a/main.asm b/main.asm
index 62d450e87..3d7611c63 100644
--- a/main.asm
+++ b/main.asm
@@ -1,3404 +1,6 @@
INCLUDE "includes.asm"
-SECTION "Hardware", ROM0
-
-INCLUDE "rst.asm"
-INCLUDE "interrupts.asm"
-
-
-SECTION "Header", ROM0[$100]
-
-Start:
- nop
- jp _Start
-
-
-SECTION "Home", ROM0[$150]
-
-INCLUDE "home/init.asm"
-INCLUDE "home/vblank.asm"
-INCLUDE "home/delay.asm"
-INCLUDE "home/rtc.asm"
-INCLUDE "home/fade.asm"
-INCLUDE "home/lcd.asm"
-INCLUDE "home/time.asm"
-INCLUDE "home/serial.asm"
-INCLUDE "home/joypad.asm"
-INCLUDE "home/decompress.asm"
-INCLUDE "home/palettes.asm"
-INCLUDE "home/copy.asm"
-INCLUDE "home/text.asm"
-INCLUDE "home/video.asm"
-INCLUDE "home/map_objects.asm"
-INCLUDE "home/sine.asm"
-INCLUDE "home/movement.asm"
-INCLUDE "home/tilemap.asm"
-INCLUDE "home/menu.asm"
-INCLUDE "home/handshake.asm"
-INCLUDE "home/game_time.asm"
-INCLUDE "home/map.asm"
-
-
-Function2d43: ; 2d43
-; Inexplicably empty.
-; Seen in PredefPointers.
- rept 16
- nop
- endr
- ret
-; 2d54
-
-
-INCLUDE "home/farcall.asm"
-INCLUDE "home/predef.asm"
-INCLUDE "home/window.asm"
-
-
-Function2e4e: ; 2e4e
- scf
- ret
-; 2e50
-
-
-INCLUDE "home/flag.asm"
-
-
-Function2ebb: ; 2ebb
- ld a, [$c2cc]
- bit 1, a
- ret z
- ld a, [hJoyDown]
- bit A_BUTTON, a
- ret
-; 2ec6
-
-
-Function2ec6: ; 2ec6
- xor a
- ret
-; 2ec8
-
-Function2ec8: ; 2ec8
- xor a
- dec a
- ret
-; 2ecb
-
-Function2ecb: ; 2ecb
- push hl
- ld hl, $c2cc
- bit 1, [hl]
- pop hl
- ret
-; 2ed3
-
-
-Function2ed3: ; 0x2ed3
-; disables overworld sprite updating?
- xor a
- ld [$ffde], a
- ld a, [VramState]
- res 0, a
- ld [VramState], a
- ld a, $0
- ld [$c2ce], a
- ret
-; 0x2ee4
-
-Function2ee4: ; 2ee4
- ld a, $1
- ld [$c2ce], a
- ld a, [VramState]
- set 0, a
- ld [VramState], a
- ld a, $1
- ld [$ffde], a
- ret
-; 2ef6
-
-
-INCLUDE "home/string.asm"
-
-
-IsInJohto: ; 2f17
-; Return 0 if the player is in Johto, and 1 in Kanto.
-
- ld a, [MapGroup]
- ld b, a
- ld a, [MapNumber]
- ld c, a
- call GetWorldMapLocation
-
- cp FAST_SHIP
- jr z, .Johto
-
- cp SPECIAL_MAP
- jr nz, .CheckRegion
-
- ld a, [BackupMapGroup]
- ld b, a
- ld a, [BackupMapNumber]
- ld c, a
- call GetWorldMapLocation
-
-.CheckRegion
- cp KANTO_LANDMARK
- jr nc, .Kanto
-
-.Johto
- xor a
- ret
-
-.Kanto
- ld a, 1
- ret
-; 2f3e
-
-
-Function2f3e: ; 2f3e
- ret
-; 2f3f
-
-
-INCLUDE "home/item.asm"
-INCLUDE "home/random.asm"
-INCLUDE "home/sram.asm"
-
-
-; Register aliases
-
-_hl_: ; 2fec
- jp [hl]
-; 2fed
-
-_de_: ; 2fed
- push de
- ret
-; 2fef
-
-
-INCLUDE "home/double_speed.asm"
-
-
-ClearSprites: ; 300b
-; Erase OAM data
- ld hl, Sprites
- ld b, SpritesEnd - Sprites
- xor a
-.loop
- ld [hli], a
- dec b
- jr nz, .loop
- ret
-; 3016
-
-HideSprites: ; 3016
-; Set all OAM y-positions to 160 to hide them offscreen
- ld hl, Sprites
- ld de, 4 ; length of an OAM struct
- ld b, (SpritesEnd - Sprites) / 4 ; number of OAM structs
- ld a, 160 ; y
-.loop
- ld [hl], a
- add hl, de
- dec b
- jr nz, .loop
- ret
-; 3026
-
-
-INCLUDE "home/copy2.asm"
-
-
-Function309d: ; 309d
- ld a, [rSVBK]
- push af
- ld a, 2
- ld [rSVBK], a
- ld hl, TileMap
- ld de, $d000
- ld bc, 360
- call CopyBytes
- pop af
- ld [rSVBK], a
- ret
-; 30b4
-
-Function30b4: ; 30b4
- xor a
- ld [hBGMapMode], a
- call Function30bf
- ld a, 1
- ld [hBGMapMode], a
- ret
-; 30bf
-
-Function30bf: ; 30bf
- ld a, [rSVBK]
- push af
- ld a, 2
- ld [rSVBK], a
- ld hl, $d000
- ld de, TileMap
- ld bc, 360
- call CopyBytes
- pop af
- ld [rSVBK], a
- ret
-; 30d6
-
-
-CopyName1: ; 30d6
- ld hl, StringBuffer2
-
-CopyName2: ; 30d9
-.loop
- ld a, [de]
- inc de
- ld [hli], a
- cp "@"
- jr nz, .loop
- ret
-; 30e1
-
-IsInArray: ; 30e1
-; Find value a for every de bytes in array hl.
-; Return index in b and carry if found.
-
- ld b, 0
- ld c, a
-.loop
- ld a, [hl]
- cp $ff
- jr z, .NotInArray
- cp c
- jr z, .InArray
- inc b
- add hl, de
- jr .loop
-
-.NotInArray
- and a
- ret
-
-.InArray
- scf
- ret
-; 30f4
-
-SkipNames: ; 0x30f4
-; skips n names where n = a
- ld bc, $000b ; name length
- and a
- ret z
-.loop
- add hl, bc
- dec a
- jr nz, .loop
- ret
-; 0x30fe
-
-AddNTimes: ; 0x30fe
-; adds bc n times where n = a
- and a
- ret z
-.loop
- add hl, bc
- dec a
- jr nz, .loop
- ret
-; 0x3105
-
-
-INCLUDE "home/math.asm"
-
-
-PrintLetterDelay: ; 313d
-; Wait before printing the next letter.
-
-; The text speed setting in Options is actually a frame count:
-; fast: 1 frame
-; mid: 3 frames
-; slow: 5 frames
-
-; $cfcf[!0] and A or B override text speed with a one-frame delay.
-; Options[4] and $cfcf[!1] disable the delay.
-
-; delay off?
- ld a, [Options]
- bit 4, a
- ret nz
-
-; non-scrolling text?
- ld a, [$cfcf]
- bit 1, a
- ret z
-
- push hl
- push de
- push bc
-
- ld hl, hOAMUpdate
- ld a, [hl]
- push af
-
-; orginally turned oam update off...
-; ld a, 1
- ld [hl], a
-
-; force fast scroll?
- ld a, [$cfcf]
- bit 0, a
- jr z, .fast
-
-; text speed
- ld a, [Options]
- and %111
- jr .updatedelay
-
-.fast
- ld a, 1
-
-.updatedelay
- ld [TextDelayFrames], a
-
-.checkjoypad
- call GetJoypadPublic
-
-; input override
- ld a, [$c2d7]
- and a
- jr nz, .wait
-
-; Wait one frame if holding A or B.
- ld a, [hJoyDown]
- bit 0, a ; A_BUTTON
- jr z, .checkb
- jr .delay
-.checkb
- bit 1, a ; B_BUTTON
- jr z, .wait
-
-.delay
- call DelayFrame
- jr .end
-
-.wait
- ld a, [TextDelayFrames]
- and a
- jr nz, .checkjoypad
-
-.end
- pop af
- ld [hOAMUpdate], a
- pop bc
- pop de
- pop hl
- ret
-; 318c
-
-
-CopyDataUntil: ; 318c
-; Copy [hl .. bc) to [de .. de + bc - hl).
-
-; In other words, the source data is
-; from hl up to but not including bc,
-; and the destination is de.
-
- ld a, [hli]
- ld [de], a
- inc de
- ld a, h
- cp b
- jr nz, CopyDataUntil
- ld a, l
- cp c
- jr nz, CopyDataUntil
- ret
-; 0x3198
-
-
-PrintNum: ; 3198
- ld a, [hROMBank]
- push af
- ld a, BANK(_PrintNum)
- rst Bankswitch
-
- call _PrintNum
-
- pop af
- rst Bankswitch
- ret
-; 31a4
-
-
-Function31a4: ; 31a4
- ld a, [hROMBank]
- push af
- ld a, BANK(Function1061ef)
- rst Bankswitch
-
- call Function1061ef
-
- pop af
- rst Bankswitch
- ret
-; 31b0
-
-
-FarPrintText: ; 31b0
- ld [hBuffer], a
- ld a, [hROMBank]
- push af
- ld a, [hBuffer]
- rst Bankswitch
-
- call PrintText
-
- pop af
- rst Bankswitch
- ret
-; 31be
-
-
-CallPointerAt: ; 31be
- ld a, [hROMBank]
- push af
- ld a, [hli]
- rst Bankswitch
-
- ld a, [hli]
- ld h, [hl]
- ld l, a
-
- call _hl_
-
- pop hl
- ld a, h
- rst Bankswitch
- ret
-; 31cd
-
-
-Function31cd: ; 31cd
-; Push pointer hl in the current bank to $d0e8.
- ld a, [hROMBank]
-
-Function31cf: ; 31cf
-; Push pointer a:hl to $d0e8.
- ld [$d0e8], a
- ld a, l
- ld [$d0e9], a
- ld a, h
- ld [$d0ea], a
- ret
-; 31db
-
-
-StringCmp: ; 31db
-; Compare c bytes at de and hl.
-; Return z if they all match.
- ld a, [de]
- cp [hl]
- ret nz
- inc de
- inc hl
- dec c
- jr nz, StringCmp
- ret
-; 0x31e4
-
-
-CompareLong: ; 31e4
-; Compare bc bytes at de and hl.
-; Return carry if they all match.
-
- ld a, [de]
- cp [hl]
- jr nz, .Diff
-
- inc de
- inc hl
- dec bc
-
- ld a, b
- or c
- jr nz, CompareLong
-
- scf
- ret
-
-.Diff
- and a
- ret
-; 31f3
-
-
-WhiteBGMap: ; 31f3
- call ClearPalettes
-WaitBGMap: ; 31f6
-; Tell VBlank to update BG Map
- ld a, 1 ; BG Map 0 tiles
- ld [hBGMapMode], a
-; Wait for it to do its magic
- ld c, 4
- call DelayFrames
- ret
-; 3200
-
-Function3200: ; 0x3200
- ld a, [hCGB]
- and a
- jr z, .asm_320e
- ld a, 2
- ld [hBGMapMode], a
- ld c, 4
- call DelayFrames
-
-.asm_320e
- ld a, 1
- ld [hBGMapMode], a
- ld c, 4
- call DelayFrames
- ret
-; 0x3218
-
-
-Function3218: ; 3218
- ld a, [hCGB]
- and a
- ret
-; 321c
-
-
-Function321c: ; 321c
- ld a, [hCGB]
- and a
- jr z, .asm_322e
-
- ld a, [$c2ce]
- cp 0
- jr z, .asm_322e
-
- ld a, 1
- ld [hBGMapMode], a
- jr Function323d
-
-.asm_322e
- ld a, 1
- ld [hBGMapMode], a
- ld c, 4
- call DelayFrames
- ret
-; 3238
-
-Function3238: ; 3238
- ld a, [hCGB]
- and a
- jr z, WaitBGMap
-
-Function323d: ; 323d
- jr Function3246
-; 323f
-
-Function323f: ; 323f
- callba Function104000
- ret
-; 3246
-
-Function3246: ; 3246
- ld a, [hBGMapMode]
- push af
- xor a
- ld [hBGMapMode], a
- ld a, [$ffde]
- push af
- xor a
- ld [$ffde], a
-.asm_3252
- ld a, [rLY]
- cp $7f
- jr c, .asm_3252 ; 3256 $fa
- di
- ld a, $1
- ld [rVBK], a
- ld hl, AttrMap
- call Function327b
- ld a, $0
- ld [rVBK], a
- ld hl, TileMap
- call Function327b
-.asm_326d
- ld a, [rLY]
- cp $7f
- jr c, .asm_326d ; 3271 $fa
- ei
- pop af
- ld [$ffde], a
- pop af
- ld [hBGMapMode], a
- ret
-; 327b
-
-Function327b: ; 327b
- ld [hSPBuffer], sp
- ld sp, hl
- ld a, [$ffd7]
- ld h, a
- ld l, $0
- ld a, $12
- ld [$ffd3], a
- ld b, $2
- ld c, $41
-.asm_328c
- pop de
-
-rept 9
-.loop\@
- ld a, [$ff00+c]
- and b
- jr nz, .loop\@
- ld [hl], e
- inc l
- ld [hl], d
- inc l
- pop de
-endr
-
-.asm_32de
- ld a, [$ff00+c]
- and b
- jr nz, .asm_32de
- ld [hl], e
- inc l
- ld [hl], d
- inc l
-
- ld de, $000c
- add hl, de
- ld a, [$ffd3]
- dec a
- ld [$ffd3], a
- jr nz, .asm_328c
- ld a, [hSPBuffer]
- ld l, a
- ld a, [$ffda]
- ld h, a
- ld sp, hl
- ret
-; 32f9
-
-
-
-Function32f9: ; 32f9
- ld a, [hCGB]
- and a
- jr nz, .asm_3309
- ld a, $e4
- ld [rBGP], a
- ld a, $d0
- ld [rOBP0], a
- ld [rOBP1], a
- ret
-
-.asm_3309
- push de
- ld a, $e4
- call DmgToCgbBGPals
- ld de, $e4e4
- call DmgToCgbObjPals
- pop de
- ret
-; 3317
-
-
-ClearPalettes: ; 3317
-; Make all palettes white
-
-; CGB: make all the palette colors white
- ld a, [hCGB]
- and a
- jr nz, .cgb
-
-; DMG: just change palettes to 0 (white)
- xor a
- ld [rBGP], a
- ld [rOBP0], a
- ld [rOBP1], a
- ret
-
-.cgb
- ld a, [rSVBK]
- push af
-
- ld a, 5
- ld [rSVBK], a
-
-; Fill BGPals and OBPals with $ffff (white)
- ld hl, BGPals
- ld bc, $80
- ld a, $ff
- call ByteFill
-
- pop af
- ld [rSVBK], a
-
-; Request palette update
- ld a, 1
- ld [hCGBPalUpdate], a
- ret
-; 333e
-
-
-ClearSGB: ; 333e
- ld b, $ff
-
-GetSGBLayout: ; 3340
-; load sgb packets unless dmg
-
- ld a, [hCGB]
- and a
- jr nz, .dosgb
-
- ld a, [hSGB]
- and a
- ret z
-
-.dosgb
- ld a, $31 ; LoadSGBLayout
- jp Predef
-; 334e
-
-
-SetHPPal: ; 334e
-; Set palette for hp bar pixel length e at hl.
- call GetHPPal
- ld [hl], d
- ret
-; 3353
-
-
-GetHPPal: ; 3353
-; Get palette for hp bar pixel length e in d.
-
- ld d, 0 ; green
- ld a, e
- cp 24
- ret nc
- inc d ; yellow
- cp 10
- ret nc
- inc d ; red
- ret
-; 335f
-
-
-CountSetBits: ; 0x335f
-; Count the number of set bits in b bytes starting from hl.
-; Return in a, c and [$d265].
-
- ld c, 0
-.next
- ld a, [hli]
- ld e, a
- ld d, 8
-
-.count
- srl e
- ld a, 0
- adc c
- ld c, a
- dec d
- jr nz, .count
-
- dec b
- jr nz, .next
-
- ld a, c
- ld [$d265], a
- ret
-; 0x3376
-
-
-GetWeekday: ; 3376
- ld a, [CurDay]
-.mod
- sub 7
- jr nc, .mod
- add 7
- ret
-; 3380
-
-
-INCLUDE "home/pokedex_flags.asm"
-
-
-NamesPointers: ; 33ab
- dbw BANK(PokemonNames), PokemonNames
- dbw BANK(MoveNames), MoveNames
- dbw 0, 0
- dbw BANK(ItemNames), ItemNames
- dbw 0, PartyMonOT
- dbw 0, OTPartyMonOT
- dbw BANK(TrainerClassNames), TrainerClassNames
- dbw $04, $4b52 ; ????
-; 33c3
-
-
-GetName: ; 33c3
-; Return name CurSpecies from name list $cf61 in StringBuffer1.
-
- ld a, [hROMBank]
- push af
- push hl
- push bc
- push de
-
- ld a, [$cf61]
- cp 1 ; Pokemon names
- jr nz, .NotPokeName
-
- ld a, [CurSpecies]
- ld [$d265], a
- call GetPokemonName
- ld hl, 11
- add hl, de
- ld e, l
- ld d, h
- jr .done
-
-.NotPokeName
- ld a, [$cf61]
- dec a
- ld e, a
- ld d, 0
- ld hl, NamesPointers
- add hl, de
- add hl, de
- add hl, de
- ld a, [hli]
- rst Bankswitch
- ld a, [hli]
- ld h, [hl]
- ld l, a
-
- ld a, [CurSpecies]
- dec a
- call GetNthString
-
- ld de, StringBuffer1
- ld bc, $000d
- call CopyBytes
-
-.done
- ld a, e
- ld [$d102], a
- ld a, d
- ld [$d103], a
-
- pop de
- pop bc
- pop hl
- pop af
- rst Bankswitch
- ret
-; 3411
-
-
-GetNthString: ; 3411
-; Return the address of the
-; ath string starting from hl.
-
- and a
- ret z
-
- push bc
- ld b, a
- ld c, "@"
-.readChar
- ld a, [hli]
- cp c
- jr nz, .readChar
- dec b
- jr nz, .readChar
- pop bc
- ret
-; 3420
-
-
-GetBasePokemonName: ; 3420
-; Discards gender (Nidoran).
-
- push hl
- call GetPokemonName
-
- ld hl, StringBuffer1
-.loop
- ld a, [hl]
- cp "@"
- jr z, .quit
- cp "♂"
- jr z, .end
- cp "♀"
- jr z, .end
- inc hl
- jr .loop
-.end
- ld [hl], "@"
-.quit
- pop hl
- ret
-
-; 343b
-
-
-GetPokemonName: ; 343b
-; Get Pokemon name $d265.
-
- ld a, [hROMBank]
- push af
- push hl
- ld a, BANK(PokemonNames)
- rst Bankswitch
-
-; Each name is ten characters
- ld a, [$d265]
- dec a
- ld d, 0
- ld e, a
- ld h, 0
- ld l, a
- add hl, hl
- add hl, hl
- add hl, de
- add hl, hl
- ld de, PokemonNames
- add hl, de
-
-; Terminator
- ld de, StringBuffer1
- push de
- ld bc, PKMN_NAME_LENGTH - 1
- call CopyBytes
- ld hl, StringBuffer1 + PKMN_NAME_LENGTH - 1
- ld [hl], "@"
- pop de
-
- pop hl
- pop af
- rst Bankswitch
- ret
-; 3468
-
-
-GetItemName: ; 3468
-; Get item name $d265.
-
- push hl
- push bc
- ld a, [$d265]
-
- cp TM_01
- jr nc, .TM
-
- ld [CurSpecies], a
- ld a, 4 ; Item names
- ld [$cf61], a
- call GetName
- jr .Copied
-.TM
- call GetTMHMName
-.Copied
- ld de, StringBuffer1
- pop bc
- pop hl
- ret
-; 3487
-
-
-GetTMHMName: ; 3487
-; Get TM/HM name by item id $d265.
-
- push hl
- push de
- push bc
- ld a, [$d265]
- push af
-
-; TM/HM prefix
- cp HM_01
- push af
- jr c, .TM
-
- ld hl, .HMText
- ld bc, .HMTextEnd - .HMText
- jr .asm_34a1
-
-.TM
- ld hl, .TMText
- ld bc, .TMTextEnd - .TMText
-
-.asm_34a1
- ld de, StringBuffer1
- call CopyBytes
-
-; TM/HM number
- push de
- ld a, [$d265]
- ld c, a
- callab GetTMHMNumber
- pop de
-
-; HM numbers start from 51, not 1
- pop af
- ld a, c
- jr c, .asm_34b9
- sub NUM_TMS
-
-; Divide and mod by 10 to get the top and bottom digits respectively
-.asm_34b9
- ld b, "0"
-.mod10
- sub 10
- jr c, .asm_34c2
- inc b
- jr .mod10
-.asm_34c2
- add 10
-
- push af
- ld a, b
- ld [de], a
- inc de
- pop af
-
- ld b, "0"
- add b
- ld [de], a
-
-; End the string
- inc de
- ld a, "@"
- ld [de], a
-
- pop af
- ld [$d265], a
- pop bc
- pop de
- pop hl
- ret
-
-.TMText
- db "TM"
-.TMTextEnd
- db "@"
-
-.HMText
- db "HM"
-.HMTextEnd
- db "@"
-; 34df
-
-
-IsHM: ; 34df
- cp HM_01
- jr c, .NotHM
- scf
- ret
-.NotHM
- and a
- ret
-; 34e7
-
-
-IsHMMove: ; 34e7
- ld hl, .HMMoves
- ld de, 1
- jp IsInArray
-
-.HMMoves
- db CUT
- db FLY
- db SURF
- db STRENGTH
- db FLASH
- db WATERFALL
- db WHIRLPOOL
- db $ff
-; 34f8
-
-
-GetMoveName: ; 34f8
- push hl
-; move name
- ld a, $2 ; move names
- ld [$cf61], a
-; move id
- ld a, [$d265]
- ld [CurSpecies], a
-
- call GetName
- ld de, StringBuffer1
- pop hl
- ret
-; 350c
-
-
-Function350c: ; 350c
- call Function1c66
- ld a, [hROMBank]
- push af
- ld a, $9
- rst Bankswitch
-
- call Function245af
- call Function3524
- call Function245cb
- pop af
- rst Bankswitch
-
- ld a, [$cf73]
- ret
-; 3524
-
-Function3524: ; 3524
- ld hl, VramState
- bit 0, [hl]
- jp nz, UpdateTimePals
- jp Function32f9
-; 352f
-
-Function352f: ; 352f
- ld a, [$cf82]
- dec a
- ld b, a
- ld a, [$cf84]
- sub b
- ld d, a
- ld a, [$cf83]
- dec a
- ld c, a
- ld a, [$cf85]
- sub c
- ld e, a
- push de
- call GetTileCoord
- pop bc
- jp TextBox
-; 354b
-
-Function354b: ; 354b
- call DelayFrame
- ld a, [$ffaa]
- push af
- ld a, $1
- ld [$ffaa], a
- call Functiona57
- pop af
- ld [$ffaa], a
- ld a, [$ffa9]
- and $f0
- ld c, a
- ld a, [hJoyPressed]
- and $f
- or c
- ld c, a
- ret
-; 3567
-
-
-Function3567: ; 3567
- ld a, [hROMBank]
- push af
- call Function2c52
- call Function3574
- pop bc
- ld a, b
- rst Bankswitch
-
- ret
-; 3574
-
-Function3574: ; 3574
- ld hl, $0001
- add hl, de
- ld a, [hl]
- cp $ff
- jr z, .asm_3597
- ld l, a
- push hl
- call Function3599
- pop hl
- jr nc, .asm_3597
- ld d, a
- ld e, l
- call Function35de
- jr nc, .asm_3597
- call Function2631
- callba Function96c56
- scf
- ret
-
-.asm_3597
- and a
- ret
-; 3599
-
-Function3599: ; 3599
- push de
- ld hl, $0010
- add hl, de
- ld a, [hl]
- ld hl, $0011
- add hl, de
- ld e, [hl]
- sub $4
- ld d, a
- ld a, e
- sub $4
- ld e, a
- call Function35b0
- pop de
- ret
-; 35b0
-
-Function35b0: ; 35b0
- ld hl, $dbfc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld a, [$dbfb]
- and a
- jr z, .asm_35d3
-.asm_35bc
- push af
- ld a, [hl]
- cp e
- jr nz, .asm_35c8
- inc hl
- ld a, [hld]
- cp d
- jr nz, .asm_35c8
- jr .asm_35d5
-
-.asm_35c8
- ld a, $5
- add l
- ld l, a
- jr nc, .asm_35cf
- inc h
-
-.asm_35cf
- pop af
- dec a
- jr nz, .asm_35bc
-
-.asm_35d3
- and a
- ret
-
-.asm_35d5
- pop af
- ld d, a
- ld a, [$dbfb]
- sub d
- inc a
- scf
- ret
-; 35de
-
-Function35de: ; 35de
- inc e
- ld hl, $0001
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
-.asm_35e6
- ld a, [hli]
- cp $ff
- jr z, .asm_35fc
- cp d
- jr nz, .asm_35f7
- ld a, [hli]
- cp e
- jr nz, .asm_35f8
- ld a, [hli]
- ld h, [hl]
- ld l, a
- jr .asm_35fe
-
-.asm_35f7
- inc hl
-
-.asm_35f8
- inc hl
- inc hl
- jr .asm_35e6
-
-.asm_35fc
- and a
- ret
-
-.asm_35fe
- scf
- ret
-; 3600
-
-
-CheckTrainerBattle2: ; 3600
-
- ld a, [hROMBank]
- push af
- call Function2c52
-
- call CheckTrainerBattle
-
- pop bc
- ld a, b
- rst Bankswitch
- ret
-; 360d
-
-
-CheckTrainerBattle: ; 360d
-; Check if any trainer on the map sees the player and wants to battle.
-
-; Skip the player object.
- ld a, 1
- ld de, MapObjects + OBJECT_LENGTH
-
-.loop
-
-; Start a battle if the object:
-
- push af
- push de
-
-; Has a sprite
- ld hl, $0001
- add hl, de
- ld a, [hl]
- and a
- jr z, .next
-
-; Is a trainer
- ld hl, $0008
- add hl, de
- ld a, [hl]
- and $f
- cp $2
- jr nz, .next
-
-; Is visible on the map
- ld hl, $0000
- add hl, de
- ld a, [hl]
- cp $ff
- jr z, .next
-
-; Is facing the player...
- call Function1ae5
- call FacingPlayerDistance_bc
- jr nc, .next
-
-; ...within their sight range
- ld hl, $0009
- add hl, de
- ld a, [hl]
- cp b
- jr c, .next
-
-; And hasn't already been beaten
- push bc
- push de
- ld hl, $000a
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld b, CHECK_FLAG
- call EventFlagAction
- ld a, c
- pop de
- pop bc
- and a
- jr z, .asm_3666
-
-.next
- pop de
- ld hl, OBJECT_LENGTH
- add hl, de
- ld d, h
- ld e, l
-
- pop af
- inc a
- cp NUM_OBJECTS
- jr nz, .loop
- xor a
- ret
-
-.asm_3666
- pop de
- pop af
- ld [$ffe0], a
- ld a, b
- ld [$d03f], a
- ld a, c
- ld [MartPointer], a
- jr Function367e
-; 3674
-
-Function3674: ; 3674
- ld a, $1
- ld [$d03f], a
- ld a, $ff
- ld [MartPointer], a
-
-Function367e: ; 367e
- call GetMapScriptHeaderBank
- ld [EngineBuffer1], a
- ld a, [$ffe0]
- call GetMapObject
- ld hl, $000a
- add hl, bc
- ld a, [EngineBuffer1]
- call GetFarHalfword
- ld de, $d041
- ld bc, $000d
- ld a, [EngineBuffer1]
- call FarCopyBytes
- xor a
- ld [$d04d], a
- scf
- ret
-; 36a5
-
-
-FacingPlayerDistance_bc: ; 36a5
-
- push de
- call FacingPlayerDistance
- ld b, d
- ld c, e
- pop de
- ret
-; 36ad
-
-
-FacingPlayerDistance: ; 36ad
-; Return carry if the sprite at bc is facing the player,
-; and its distance in d.
-
- ld hl, $0010 ; x
- add hl, bc
- ld d, [hl]
-
- ld hl, $0011 ; y
- add hl, bc
- ld e, [hl]
-
- ld a, [MapX]
- cp d
- jr z, .CheckY
-
- ld a, [MapY]
- cp e
- jr z, .CheckX
-
- and a
- ret
-
-.CheckY
- ld a, [MapY]
- sub e
- jr z, .NotFacing
- jr nc, .Above
-
-; Below
- cpl
- inc a
- ld d, a
- ld e, UP << 2
- jr .CheckFacing
-
-.Above
- ld d, a
- ld e, DOWN << 2
- jr .CheckFacing
-
-.CheckX
- ld a, [MapX]
- sub d
- jr z, .NotFacing
- jr nc, .Left
-
-; Right
- cpl
- inc a
- ld d, a
- ld e, LEFT << 2
- jr .CheckFacing
-
-.Left
- ld d, a
- ld e, RIGHT << 2
-
-.CheckFacing
- call GetSpriteDirection
- cp e
- jr nz, .NotFacing
- scf
- ret
-
-.NotFacing
- and a
- ret
-; 36f5
-
-
-Function36f5: ; 36f5
- push bc
- ld hl, $0001
- add hl, bc
- ld a, [hl]
- call GetMapObject
- ld hl, $000a
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- call GetMapScriptHeaderBank
- call GetFarHalfword
- ld d, h
- ld e, l
- push de
- ld b, $2
- call EventFlagAction
- pop de
- ld a, c
- and a
- pop bc
- ret
-; 3718
-
-
-Function3718: ; 3718
- ld a, [BattleType]
- cp $1
- jr .asm_3724
-
- ld hl, WalkingTile
- jr .asm_3731
-
-.asm_3724
- ld a, [$d0ee]
- ld hl, WalkingTile
- and $f
- jr z, .asm_3731
- ld hl, $d049
-
-.asm_3731
- ld a, [hli]
- ld h, [hl]
- ld l, a
- call GetMapScriptHeaderBank
- call FarPrintText
- call WaitBGMap
- call Functiona80
- ret
-; 3741
-
-
-
-IsAPokemon: ; 3741
-; Return carry if species a is not a Pokemon.
- and a
- jr z, .NotAPokemon
- cp EGG
- jr z, .Pokemon
- cp NUM_POKEMON + 1
- jr c, .Pokemon
-
-.NotAPokemon
- scf
- ret
-
-.Pokemon
- and a
- ret
-; 3750
-
-
-DrawHPBar: ; 3750
-; Draw an HP bar d tiles long at hl
-; Fill it up to e pixels
-
- push hl
- push de
- push bc
-
-; Place 'HP:'
- ld a, $60
- ld [hli], a
- ld a, $61
- ld [hli], a
-
-; Draw a template
- push hl
- ld a, $62 ; empty bar
-.template
- ld [hli], a
- dec d
- jr nz, .template
- ld a, $6b ; bar end
- add b
- ld [hl], a
- pop hl
-
-; Safety check # pixels
- ld a, e
- and a
- jr nz, .fill
- ld a, c
- and a
- jr z, .done
- ld e, 1
-
-.fill
-; Keep drawing tiles until pixel length is reached
- ld a, e
- sub TILE_WIDTH
- jr c, .lastbar
-
- ld e, a
- ld a, $6a ; full bar
- ld [hli], a
- ld a, e
- and a
- jr z, .done
- jr .fill
-
-.lastbar
- ld a, $62 ; empty bar
- add e ; + e
- ld [hl], a
-
-.done
- pop bc
- pop de
- pop hl
- ret
-; 3786
-
-
-Function3786: ; 3786
- ld a, $1
- ld [$c2c6], a
-
-Function378b: ; 378b
- ld a, [CurPartySpecies]
- call IsAPokemon
- jr c, .asm_37ad
- push hl
- ld de, VTiles2
- ld a, $3c
- call Predef
- pop hl
- xor a
- ld [$ffad], a
- ld bc, $0707
- ld a, $13
- call Predef
- xor a
- ld [$c2c6], a
- ret
-
-.asm_37ad
- xor a
- ld [$c2c6], a
- inc a
- ld [CurPartySpecies], a
- ret
-; 37b6
-
-Function37b6: ; 37b6
- push af
- ld a, $1
- ld [$c2bc], a
- pop af
- call Function37e2
- call WaitSFX
- ret
-; 37c4
-
-Function37c4: ; 37c4
- push af
- ld a, $1
- ld [$c2bc], a
- pop af
- jp Function37e2
-; 37ce
-
-Function37ce: ; 37ce
- call Function37d5
- call WaitSFX
- ret
-; 37d5
-
-Function37d5: ; 37d5
- push af
- xor a
- ld [$c2bc], a
- ld [CryTracks], a
- pop af
- call Function37e2
- ret
-; 37e2
-
-Function37e2: ; 37e2
- push hl
- push de
- push bc
- call Function381e
- jr c, .asm_37ef
- ld e, c
- ld d, b
- call PlayCryHeader
-
-.asm_37ef
- pop bc
- pop de
- pop hl
- ret
-; 37f3
-
-Function37f3: ; 37f3
- call Function381e
- ret c
- ld a, [hROMBank]
- push af
- ld a, $3c
- rst Bankswitch
-
- ld hl, $6787
- add hl, bc
- add hl, bc
- add hl, bc
- add hl, bc
- add hl, bc
- add hl, bc
- ld e, [hl]
- inc hl
- ld d, [hl]
- inc hl
- ld a, [hli]
- ld [CryPitch], a
- ld a, [hli]
- ld [CryEcho], a
- ld a, [hli]
- ld [CryLength], a
- ld a, [hl]
- ld [$c2b3], a
- pop af
- rst Bankswitch
-
- and a
- ret
-; 381e
-
-Function381e: ; 381e
- and a
- jr z, .asm_382b
- cp $fc
- jr nc, .asm_382b
- dec a
- ld c, a
- ld b, $0
- and a
- ret
-
-.asm_382b
- scf
- ret
-; 382d
-
-
-PrintLevel: ; 382d
-; Print TempMonLevel at hl
-
- ld a, [TempMonLevel]
- ld [hl], $6e ; ":L"
- inc hl
-
-; How many digits?
- ld c, 2
- cp 100
- jr c, Function3842
-
-; 3-digit numbers overwrite the :L.
- dec hl
- inc c
- jr Function3842
-; 383d
-
-Function383d: ; 383d
-; Print :L and all 3 digits
- ld [hl], $6e
- inc hl
- ld c, 3
-; 3842
-
-Function3842: ; 3842
- ld [$d265], a
- ld de, $d265
- ld b, %01000001 ; flags
- jp PrintNum
-; 384d
-
-
-Function384d: ; 384d
- ld hl, $d25e
- ld c, a
- ld b, $0
- add hl, bc
- ld a, [hl]
- ret
-; 3856
-
-
-GetBaseData: ; 3856
- push bc
- push de
- push hl
- ld a, [hROMBank]
- push af
- ld a, BANK(BaseData)
- rst Bankswitch
-
-; Egg doesn't have BaseData
- ld a, [CurSpecies]
- cp EGG
- jr z, .egg
-
-; Get BaseData
- dec a
- ld bc, BaseData1 - BaseData0
- ld hl, BaseData
- call AddNTimes
- ld de, CurBaseData
- ld bc, BaseData1 - BaseData0
- call CopyBytes
- jr .end
-
-.egg
-; ????
- ld de, $7d9c
-
-; Sprite dimensions
- ld b, $55 ; 5x5
- ld hl, BasePicSize
- ld [hl], b
-
-; ????
- ld hl, BasePadding
- ld [hl], e
- inc hl
- ld [hl], d
- inc hl
- ld [hl], e
- inc hl
- ld [hl], d
- jr .end
-
-.end
-; Replace Pokedex # with species
- ld a, [CurSpecies]
- ld [BaseDexNo], a
-
- pop af
- rst Bankswitch
- pop hl
- pop de
- pop bc
- ret
-; 389c
-
-
-GetCurNick: ; 389c
- ld a, [CurPartyMon]
- ld hl, PartyMonNicknames
-
-GetNick: ; 38a2
-; Get nickname a from list hl.
-
- push hl
- push bc
-
- call SkipNames
- ld de, StringBuffer1
-
- push de
- ld bc, PKMN_NAME_LENGTH
- call CopyBytes
- pop de
-
- callab CheckNickErrors
-
- pop bc
- pop hl
- ret
-; 38bb
-
-
-PrintBCDNumber: ; 38bb
-; function to print a BCD (Binary-coded decimal) number
-; de = address of BCD number
-; hl = destination address
-; c = flags and length
-; bit 7: if set, do not print leading zeroes
-; if unset, print leading zeroes
-; bit 6: if set, left-align the string (do not pad empty digits with spaces)
-; if unset, right-align the string
-; bit 5: if set, print currency symbol at the beginning of the string
-; if unset, do not print the currency symbol
-; bits 0-4: length of BCD number in bytes
-; Note that bits 5 and 7 are modified during execution. The above reflects
-; their meaning at the beginning of the functions's execution.
- ld b, c ; save flags in b
- res 7, c
- res 6, c
- res 5, c ; c now holds the length
- bit 5, b
- jr z, .loop
- bit 7, b
- jr nz, .loop
- ld [hl], "¥"
- inc hl
-.loop
- ld a, [de]
- swap a
- call PrintBCDDigit ; print upper digit
- ld a, [de]
- call PrintBCDDigit ; print lower digit
- inc de
- dec c
- jr nz, .loop
- bit 7, b ; were any non-zero digits printed?
- jr z, .done ; if so, we are done
-.numberEqualsZero ; if every digit of the BCD number is zero
- bit 6, b ; left or right alignment?
- jr nz, .skipRightAlignmentAdjustment
- dec hl ; if the string is right-aligned, it needs to be moved back one space
-.skipRightAlignmentAdjustment
- bit 5, b
- jr z, .skipCurrencySymbol
- ld [hl], "¥" ; currency symbol
- inc hl
-.skipCurrencySymbol
- ld [hl], "0"
- call PrintLetterDelay
- inc hl
-.done
- ret
-; 0x38f2
-
-PrintBCDDigit: ; 38f2
- and a, %00001111
- and a
- jr z, .zeroDigit
-.nonzeroDigit
- bit 7, b ; have any non-space characters been printed?
- jr z, .outputDigit
-; if bit 7 is set, then no numbers have been printed yet
- bit 5, b ; print the currency symbol?
- jr z, .skipCurrencySymbol
- ld [hl], "¥"
- inc hl
- res 5, b
-.skipCurrencySymbol
- res 7, b ; unset 7 to indicate that a nonzero digit has been reached
-.outputDigit
- add a, "0"
- ld [hli], a
- jp PrintLetterDelay
-.zeroDigit
- bit 7, b ; either printing leading zeroes or already reached a nonzero digit?
- jr z, .outputDigit ; if so, print a zero digit
- bit 6, b ; left or right alignment?
- ret nz
- ld a, " "
- ld [hli], a ; if right-aligned, "print" a space by advancing the pointer
- ret
-; 0x3917
-
-GetPartyParamLocation: ; 3917
-; Get the location of parameter a from CurPartyMon in hl
- push bc
- ld hl, PartyMons
- ld c, a
- ld b, $00
- add hl, bc
- ld a, [CurPartyMon]
- call GetPartyLocation
- pop bc
- ret
-; 3927
-
-GetPartyLocation: ; 3927
-; Add the length of a PartyMon struct to hl a times.
- ld bc, PartyMon2 - PartyMon1
- jp AddNTimes
-; 392d
-
-
-Function392d: ; 392d
- push hl
- ld a, b
- dec a
- ld b, $0
- add hl, bc
- ld hl, $5424
- ld bc, $0020
- call AddNTimes
- ld a, $14
- call GetFarHalfword
- ld b, l
- ld c, h
- pop hl
- ret
-; 3945
-
-
-UserPartyAttr: ; 3945
- push af
- ld a, [hBattleTurn]
- and a
- jr nz, .asm_394e
- pop af
- jr BattlePartyAttr
-.asm_394e
- pop af
- jr OTPartyAttr
-; 3951
-
-
-OpponentPartyAttr: ; 3951
- push af
- ld a, [hBattleTurn]
- and a
- jr z, .asm_395a
- pop af
- jr BattlePartyAttr
-.asm_395a
- pop af
- jr OTPartyAttr
-; 395d
-
-
-BattlePartyAttr: ; 395d
-; Get attribute a from the active BattleMon's party struct.
- push bc
- ld c, a
- ld b, 0
- ld hl, PartyMons
- add hl, bc
- ld a, [CurBattleMon]
- call GetPartyLocation
- pop bc
- ret
-; 396d
-
-
-OTPartyAttr: ; 396d
-; Get attribute a from the active EnemyMon's party struct.
- push bc
- ld c, a
- ld b, 0
- ld hl, OTPartyMon1Species
- add hl, bc
- ld a, [CurOTMon]
- call GetPartyLocation
- pop bc
- ret
-; 397d
-
-
-ResetDamage: ; 397d
- xor a
- ld [CurDamage], a
- ld [CurDamage + 1], a
- ret
-; 3985
-
-SetPlayerTurn: ; 3985
- xor a
- ld [hBattleTurn], a
- ret
-; 3989
-
-SetEnemyTurn: ; 3989
- ld a, 1
- ld [hBattleTurn], a
- ret
-; 398e
-
-
-UpdateOpponentInParty: ; 398e
- ld a, [hBattleTurn]
- and a
- jr z, UpdateEnemyMonInParty
- jr UpdateBattleMonInParty
-; 3995
-
-UpdateUserInParty: ; 3995
- ld a, [hBattleTurn]
- and a
- jr z, UpdateBattleMonInParty
- jr UpdateEnemyMonInParty
-; 399c
-
-UpdateBattleMonInParty: ; 399c
-; Update level, status, current HP
-
- ld a, [CurBattleMon]
-
-Function399f: ; 399f
- ld hl, PartyMon1Level
- call GetPartyLocation
-
- ld d, h
- ld e, l
- ld hl, BattleMonLevel
- ld bc, BattleMonMaxHP - BattleMonLevel
- jp CopyBytes
-; 39b0
-
-UpdateEnemyMonInParty: ; 39b0
-; Update level, status, current HP
-
-; No wildmons.
- ld a, [IsInBattle]
- dec a
- ret z
-
- ld a, [CurOTMon]
- ld hl, OTPartyMon1Level
- call GetPartyLocation
-
- ld d, h
- ld e, l
- ld hl, EnemyMonLevel
- ld bc, EnemyMonMaxHP - EnemyMonLevel
- jp CopyBytes
-; 39c9
-
-
-RefreshBattleHuds: ; 39c9
- call UpdateBattleHuds
- ld c, 3
- call DelayFrames
- jp WaitBGMap
-; 39d4
-
-UpdateBattleHuds: ; 39d4
- callba Function3df48
- callba Function3e036
- ret
-; 39e1
-
-
-GetBattleVar: ; 39e1
-; Preserves hl.
- push hl
- call _GetBattleVar
- pop hl
- ret
-; 39e7
-
-_GetBattleVar: ; 39e7
-; Get variable from pair a, depending on whose turn it is.
-; There are 21 variable pairs.
-
- push bc
-
- ld hl, .battlevarpairs
- ld c, a
- ld b, 0
- add hl, bc
- add hl, bc
-
- ld a, [hli]
- ld h, [hl]
- ld l, a
-
-; Enemy turn uses the second byte instead.
-; This lets battle variable calls be side-neutral.
- ld a, [hBattleTurn]
- and a
- jr z, .getvar
- inc hl
-
-.getvar
-; var id
- ld a, [hl]
- ld c, a
- ld b, 0
-
- ld hl, .vars
- add hl, bc
- add hl, bc
-
- ld a, [hli]
- ld h, [hl]
- ld l, a
-
- ld a, [hl]
-
- pop bc
- ret
-
-
-.battlevarpairs
- dw .substatus1, .substatus2, .substatus3, .substatus4, .substatus5
- dw .substatus1opp, .substatus2opp, .substatus3opp, .substatus4opp, .substatus5opp
- dw .status, .statusopp, .animation, .effect, .power, .type
- dw .curmove, .lastcounter, .lastcounteropp, .lastmove, .lastmoveopp
-
-
- const_def
- const PLAYER_SUBSTATUS_1
- const ENEMY_SUBSTATUS_1
- const PLAYER_SUBSTATUS_2
- const ENEMY_SUBSTATUS_2
- const PLAYER_SUBSTATUS_3
- const ENEMY_SUBSTATUS_3
- const PLAYER_SUBSTATUS_4
- const ENEMY_SUBSTATUS_4
- const PLAYER_SUBSTATUS_5
- const ENEMY_SUBSTATUS_5
- const PLAYER_STATUS
- const ENEMY_STATUS
- const PLAYER_MOVE_ANIMATION
- const ENEMY_MOVE_ANIMATION
- const PLAYER_MOVE_EFFECT
- const ENEMY_MOVE_EFFECT
- const PLAYER_MOVE_POWER
- const ENEMY_MOVE_POWER
- const PLAYER_MOVE_TYPE
- const ENEMY_MOVE_TYPE
- const PLAYER_CUR_MOVE
- const ENEMY_CUR_MOVE
- const PLAYER_COUNTER_MOVE
- const ENEMY_COUNTER_MOVE
- const PLAYER_LAST_MOVE
- const ENEMY_LAST_MOVE
-
-
-; player enemy
-.substatus1 db PLAYER_SUBSTATUS_1, ENEMY_SUBSTATUS_1
-.substatus1opp db ENEMY_SUBSTATUS_1, PLAYER_SUBSTATUS_1
-.substatus2 db PLAYER_SUBSTATUS_2, ENEMY_SUBSTATUS_2
-.substatus2opp db ENEMY_SUBSTATUS_2, PLAYER_SUBSTATUS_2
-.substatus3 db PLAYER_SUBSTATUS_3, ENEMY_SUBSTATUS_3
-.substatus3opp db ENEMY_SUBSTATUS_3, PLAYER_SUBSTATUS_3
-.substatus4 db PLAYER_SUBSTATUS_4, ENEMY_SUBSTATUS_4
-.substatus4opp db ENEMY_SUBSTATUS_4, PLAYER_SUBSTATUS_4
-.substatus5 db PLAYER_SUBSTATUS_5, ENEMY_SUBSTATUS_5
-.substatus5opp db ENEMY_SUBSTATUS_5, PLAYER_SUBSTATUS_5
-.status db PLAYER_STATUS, ENEMY_STATUS
-.statusopp db ENEMY_STATUS, PLAYER_STATUS
-.animation db PLAYER_MOVE_ANIMATION, ENEMY_MOVE_ANIMATION
-.effect db PLAYER_MOVE_EFFECT, ENEMY_MOVE_EFFECT
-.power db PLAYER_MOVE_POWER, ENEMY_MOVE_POWER
-.type db PLAYER_MOVE_TYPE, ENEMY_MOVE_TYPE
-.curmove db PLAYER_CUR_MOVE, ENEMY_CUR_MOVE
-.lastcounter db PLAYER_COUNTER_MOVE, ENEMY_COUNTER_MOVE
-.lastcounteropp db ENEMY_COUNTER_MOVE, PLAYER_COUNTER_MOVE
-.lastmove db PLAYER_LAST_MOVE, ENEMY_LAST_MOVE
-.lastmoveopp db ENEMY_LAST_MOVE, PLAYER_LAST_MOVE
-
-.vars
- dw PlayerSubStatus1, EnemySubStatus1
- dw PlayerSubStatus2, EnemySubStatus2
- dw PlayerSubStatus3, EnemySubStatus3
- dw PlayerSubStatus4, EnemySubStatus4
- dw PlayerSubStatus5, EnemySubStatus5
- dw BattleMonStatus, EnemyMonStatus
- dw PlayerMoveAnimation, EnemyMoveAnimation
- dw PlayerMoveEffect, EnemyMoveEffect
- dw PlayerMovePower, EnemyMovePower
- dw PlayerMoveType, EnemyMoveType
- dw CurPlayerMove, CurEnemyMove
- dw LastEnemyCounterMove, LastPlayerCounterMove
- dw LastPlayerMove, LastEnemyMove
-; 3a90
-
-
-Function3a90: ; 3a90
- inc hl
- ld a, [hROMBank]
- push af
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- ld a, [hli]
- ld [hROMBank], a
- ld [MBC3RomBank], a
- ld a, e
- ld l, a
- ld a, d
- ld h, a
- ld de, $d00c
- ld bc, $0028
- call CopyBytes
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
- ret
-; 3ab2
-
-
-MobileTextBorder: ; 3ab2
-; For mobile link battles only.
- ld a, [InLinkBattle]
- cp 4
- ret c
-; Draw a cell phone icon at the top right corner of the border.
- ld hl, $c5a3 ; TileMap(19,12)
- ld [hl], $5e ; cell phone top
- ld hl, $c5b7 ; TileMap(19,13)
- ld [hl], $5f ; cell phone bottom
- ret
-; 3ac3
-
-
-BattleTextBox: ; 3ac3
-; Open a textbox and print text at hl.
- push hl
- call SpeechTextBox
- call MobileTextBorder
- call Function1ad2
- call Function321c
- pop hl
- call PrintTextBoxText
- ret
-; 3ad5
-
-
-StdBattleTextBox: ; 3ad5
-; Open a textbox and print battle text at 20:hl.
-
- ld a, [hROMBank]
- push af
-
- ld a, BANK(BattleText)
- rst Bankswitch
-
- call BattleTextBox
-
- pop af
- rst Bankswitch
- ret
-; 3ae1
-
-
-Function3ae1: ; 3ae1
- ld a, $32
- rst Bankswitch
-
- ld a, [hli]
- ld [$d410], a
- ld a, [hl]
- ld [$d411], a
- ld a, $33
- rst Bankswitch
-
- ret
-; 3af0
-
-Function3af0: ; 3af0
- push hl
- push de
- ld hl, $d410
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld a, $32
- rst Bankswitch
-
- ld a, [de]
- ld [$d417], a
- inc de
- ld a, $33
- rst Bankswitch
-
- ld [hl], d
- dec hl
- ld [hl], e
- pop de
- pop hl
- ld a, [$d417]
- ret
-; 3b0c
-
-Function3b0c: ; 3b0c
- ld a, [hLCDStatCustom]
- and a
- ret z
-
- ld a, $00
- ld [Requested2bppSource], a
- ld a, $d2
- ld [Requested2bppSource + 1], a
-
- ld a, $00
- ld [Requested2bppDest], a
- ld a, $d1
- ld [Requested2bppDest + 1], a
-
- ld a, $9
- ld [Requested2bpp], a
- ret
-; 3b2a
-
-
-
-Function3b2a: ; 3b2a
- ld [$c3b8], a
- ld a, [hROMBank]
- push af
- ld a, BANK(Function8cfd6)
- rst Bankswitch
-
- ld a, [$c3b8]
- call Function8cfd6
- pop af
- rst Bankswitch
-
- ret
-; 3b3c
-
-
-Function3b3c: ; 3b3c
- ld [$c3b8], a
- ld a, [hROMBank]
- push af
- ld a, BANK(Function8d120)
- rst Bankswitch
-
- ld a, [$c3b8]
- call Function8d120
- pop af
- rst Bankswitch
-
- ret
-; 3b4e
-
-
-SoundRestart: ; 3b4e
-
- push hl
- push de
- push bc
- push af
-
- ld a, [hROMBank]
- push af
- ld a, BANK(_SoundRestart)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- call _SoundRestart
-
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3b6a
-
-
-UpdateSound: ; 3b6a
-
- push hl
- push de
- push bc
- push af
-
- ld a, [hROMBank]
- push af
- ld a, BANK(_UpdateSound)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- call _UpdateSound
-
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3b86
-
-
-_LoadMusicByte: ; 3b86
-; CurMusicByte = [a:de]
-
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- ld a, [de]
- ld [CurMusicByte], a
- ld a, BANK(LoadMusicByte)
-
- ld [hROMBank], a
- ld [MBC3RomBank], a
- ret
-; 3b97
-
-
-PlayMusic: ; 3b97
-; Play music de.
-
- push hl
- push de
- push bc
- push af
-
- ld a, [hROMBank]
- push af
- ld a, BANK(_PlayMusic) ; and BANK(_SoundRestart)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- ld a, e
- and a
- jr z, .nomusic
-
- call _PlayMusic
- jr .end
-
-.nomusic
- call _SoundRestart
-
-.end
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3bbc
-
-
-PlayMusic2: ; 3bbc
-; Stop playing music, then play music de.
-
- push hl
- push de
- push bc
- push af
-
- ld a, [hROMBank]
- push af
- ld a, BANK(_PlayMusic)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- push de
- ld de, MUSIC_NONE
- call _PlayMusic
- call DelayFrame
- pop de
- call _PlayMusic
-
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- pop af
- pop bc
- pop de
- pop hl
- ret
-
-; 3be3
-
-
-PlayCryHeader: ; 3be3
-; Play a cry given parameters in header de
-
- push hl
- push de
- push bc
- push af
-
-; Save current bank
- ld a, [hROMBank]
- push af
-
-; Cry headers are stuck in one bank.
- ld a, BANK(CryHeaders)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
-; Each header is 6 bytes long:
- ld hl, CryHeaders
- add hl, de
- add hl, de
- add hl, de
- add hl, de
- add hl, de
- add hl, de
-
- ld e, [hl]
- inc hl
- ld d, [hl]
- inc hl
-
- ld a, [hli]
- ld [CryPitch], a
- ld a, [hli]
- ld [CryEcho], a
- ld a, [hli]
- ld [CryLength], a
- ld a, [hl]
- ld [CryLength+1], a
-
- ld a, BANK(PlayCry)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- call PlayCry
-
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3c23
-
-
-PlaySFX: ; 3c23
-; Play sound effect de.
-; Sound effects are ordered by priority (lowest to highest)
-
- push hl
- push de
- push bc
- push af
-
-; Is something already playing?
- call CheckSFX
- jr nc, .play
-; Does it have priority?
- ld a, [CurSFX]
- cp e
- jr c, .quit
-
-.play
- ld a, [hROMBank]
- push af
- ld a, BANK(_PlaySFX)
- ld [hROMBank], a
- ld [MBC3RomBank], a ; bankswitch
-
- ld a, e
- ld [CurSFX], a
- call _PlaySFX
-
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a ; bankswitch
-.quit
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3c4e
-
-
-WaitPlaySFX: ; 3c4e
- call WaitSFX
- call PlaySFX
- ret
-; 3c55
-
-
-WaitSFX: ; 3c55
-; infinite loop until sfx is done playing
-
- push hl
-
-.loop
- ; ch5 on?
- ld hl, Channel5 + Channel1Flags - Channel1
- bit 0, [hl]
- jr nz, .loop
- ; ch6 on?
- ld hl, Channel6 + Channel1Flags - Channel1
- bit 0, [hl]
- jr nz, .loop
- ; ch7 on?
- ld hl, Channel7 + Channel1Flags - Channel1
- bit 0, [hl]
- jr nz, .loop
- ; ch8 on?
- ld hl, Channel8 + Channel1Flags - Channel1
- bit 0, [hl]
- jr nz, .loop
-
- pop hl
- ret
-; 3c74
-
-Function3c74: ; 3c74
- push hl
- ld hl, $c1cc
- bit 0, [hl]
- jr nz, .asm_3c94
- ld hl, $c1fe
- bit 0, [hl]
- jr nz, .asm_3c94
- ld hl, $c230
- bit 0, [hl]
- jr nz, .asm_3c94
- ld hl, $c262
- bit 0, [hl]
- jr nz, .asm_3c94
- pop hl
- scf
- ret
-
-.asm_3c94
- pop hl
- and a
- ret
-; 3c97
-
-MaxVolume: ; 3c97
- ld a, $77 ; max
- ld [Volume], a
- ret
-; 3c9d
-
-LowVolume: ; 3c9d
- ld a, $33 ; 40%
- ld [Volume], a
- ret
-; 3ca3
-
-VolumeOff: ; 3ca3
- xor a
- ld [Volume], a
- ret
-; 3ca8
-
-Function3ca8: ; 3ca8
- ld a, $4
- ld [MusicFade], a
- ret
-; 3cae
-
-Function3cae: ; 3cae
- ld a, $84
- ld [MusicFade], a
- ret
-; 3cb4
-
-Function3cb4: ; 3cb4
-.asm_3cb4
- and a
- ret z
- dec a
- call UpdateSound
- jr .asm_3cb4
-; 3cbc
-
-Function3cbc: ; 3cbc
- push hl
- push de
- push bc
- push af
- call Function3d97
- ld a, [CurMusic]
- cp e
- jr z, .asm_3cda
- ld a, $8
- ld [MusicFade], a
- ld a, e
- ld [MusicFadeIDLo], a
- ld a, d
- ld [MusicFadeIDHi], a
- ld a, e
- ld [CurMusic], a
-
-.asm_3cda
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3cdf
-
-Function3cdf: ; 3cdf
- push hl
- push de
- push bc
- push af
- call Function3d97
- ld a, [CurMusic]
- cp e
- jr z, .asm_3cfe
- push de
- ld de, MUSIC_NONE
- call PlayMusic
- call DelayFrame
- pop de
- ld a, e
- ld [CurMusic], a
- call PlayMusic
-
-.asm_3cfe
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3d03
-
-Function3d03: ; 3d03
- push hl
- push de
- push bc
- push af
- xor a
- ld [$c2c1], a
- ld de, MUSIC_BICYCLE
- ld a, [PlayerState]
- cp $1
- jr z, .asm_3d18
- call Function3d97
-.asm_3d18
- push de
- ld de, MUSIC_NONE
- call PlayMusic
- call DelayFrame
- pop de
- ld a, e
- ld [CurMusic], a
- call PlayMusic
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3d2f
-
-Function3d2f: ; 3d2f
- ld a, [$c2c1]
- and a
- jr z, Function3d47
- xor a
- ld [CurMusic], a
- ld de, MUSIC_NONE
- call PlayMusic
- call DelayFrame
- xor a
- ld [$c2c1], a
- ret
-; 3d47
-
-Function3d47: ; 3d47
- push hl
- push de
- push bc
- push af
- ld de, MUSIC_NONE
- call PlayMusic
- call DelayFrame
- ld a, [CurMusic]
- ld e, a
- ld d, 0
- call PlayMusic
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3d62
-
-Function3d62: ; 3d62
- ld a, [PlayerState]
- cp $4
- jr z, .asm_3d7b
- cp $8
- jr z, .asm_3d7b
- ld a, [StatusFlags2]
- bit 2, a
- jr nz, .asm_3d80
-.asm_3d74
- and a
- ret
-
- ld de, $0013
- scf
- ret
-
-.asm_3d7b
- ld de, $0021
- scf
- ret
-
-.asm_3d80
- ld a, [MapGroup]
- cp $a
- jr nz, .asm_3d74
- ld a, [MapNumber]
- cp $f
- jr z, .asm_3d92
- cp $11
- jr nz, .asm_3d74
-
-.asm_3d92
- ld de, $0058
- scf
- ret
-; 3d97
-
-Function3d97: ; 3d97
- call Function3d62
- ret c
- call Function2cbd
- ret
-; 3d9f
-
-Function3d9f: ; 3d9f
- ld a, $20
- ld [$c498], a
- ld [$c49c], a
- ld a, $50
- ld [$c499], a
- ld a, $58
- ld [$c49d], a
- xor a
- ld [$c49b], a
- ld [$c49f], a
- ld a, [$c296]
- cp $64
- jr nc, .asm_3dd5
- add $1
- daa
- ld b, a
- swap a
- and $f
- add $f6
- ld [$c49a], a
- ld a, b
- and $f
- add $f6
- ld [$c49e], a
- ret
-
-.asm_3dd5
- ld a, $ff
- ld [$c49a], a
- ld [$c49e], a
- ret
-; 3dde
-
-CheckSFX: ; 3dde
-; returns carry if sfx channels are active
- ld a, [$c1cc] ; 1
- bit 0, a
- jr nz, .quit
- ld a, [$c1fe] ; 2
- bit 0, a
- jr nz, .quit
- ld a, [$c230] ; 3
- bit 0, a
- jr nz, .quit
- ld a, [$c262] ; 4
- bit 0, a
- jr nz, .quit
- and a
- ret
-.quit
- scf
- ret
-; 3dfe
-
-Function3dfe: ; 3dfe
- xor a
- ld [$c1cc], a
- ld [SoundInput], a
- ld [rNR10], a
- ld [rNR11], a
- ld [rNR12], a
- ld [rNR13], a
- ld [rNR14], a
- ret
-; 3e10
-
-
-ChannelsOff: ; 3e10
-; Quickly turn off music channels
- xor a
- ld [Channel1Flags], a
- ld [$c136], a
- ld [$c168], a
- ld [$c19a], a
- ld [SoundInput], a
- ret
-; 3e21
-
-SFXChannelsOff: ; 3e21
-; Quickly turn off sound effect channels
- xor a
- ld [$c1cc], a
- ld [$c1fe], a
- ld [$c230], a
- ld [$c262], a
- ld [SoundInput], a
- ret
-; 3e32
-
-Function3e32: ; 3e32
- cp $2
- ld [$c988], a
- ld a, l
- ld [$c986], a
- ld a, h
- ld [$c987], a
- jr nz, .asm_3e4f
- ld [$c982], a
- ld a, l
- ld [$c981], a
- ld hl, $c983
- ld a, c
- ld [hli], a
- ld a, b
- ld [hl], a
-
-.asm_3e4f
- ld hl, $c822
- set 6, [hl]
- ld a, [hROMBank]
- push af
- ld a, BANK(Function110030)
- ld [$c981], a
- rst Bankswitch
-
- jp Function110030
-; 3e60
-
-
-Function3e60: ; 3e60
- ld [$c986], a
- ld a, l
- ld [$c987], a
- ld a, h
- ld [$c988], a
- pop bc
- ld a, b
- ld [$c981], a
- rst Bankswitch
-
- ld hl, $c822
- res 6, [hl]
- ld hl, $c987
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld a, [$c986]
- ret
-; 3e80
-
-
-Function3e80: ; 3e80
- ld a, [hROMBank]
- push af
- ld a, BANK(Function1116c5)
- ld [$c981], a
- rst Bankswitch
-
- call Function1116c5
- pop bc
- ld a, b
- ld [$c981], a
- rst Bankswitch
-
- ret
-; 3e93
-
-
-Timer: ; 3e93
- push af
- push bc
- push de
- push hl
-
- ld a, [$ffe9]
- and a
- jr z, .asm_3ed2
-
- xor a
- ld [rTAC], a
-
-; Turn off timer interrupt
- ld a, [rIF]
- and 1 << VBLANK | 1 << LCD_STAT | 1 << SERIAL | 1 << JOYPAD
- ld [rIF], a
-
- ld a, [$c86a]
- or a
- jr z, .asm_3ed2
-
- ld a, [$c822]
- bit 1, a
- jr nz, .asm_3eca
-
- ld a, [rSC]
- and 1 << rSC_ON
- jr nz, .asm_3eca
-
- ld a, [hROMBank]
- push af
- ld a, BANK(Function1118de)
- ld [$c981], a
- rst Bankswitch
-
- call Function1118de
-
- pop bc
- ld a, b
- ld [$c981], a
- rst Bankswitch
-
-.asm_3eca
- ld a, [rTMA]
- ld [rTIMA], a
-
- ld a, 1 << rTAC_ON | rTAC_65536_HZ
- ld [rTAC], a
-
-.asm_3ed2
- pop hl
- pop de
- pop bc
- pop af
- reti
-; 3ed7
-
-Function3ed7: ; 3ed7
- ld [$dc02], a
- ld a, [hROMBank]
- push af
- ld a, BANK(Function114243)
- rst Bankswitch
-
- call Function114243
- pop bc
- ld a, b
- rst Bankswitch
-
- ld a, [$dc02]
- ret
-; 3eea
-
-Function3eea: ; 3eea
- push hl
- push bc
- ld de, $0939
- add hl, de
- inc b
- inc b
- inc c
- inc c
- call Function3f35
- pop bc
- pop hl
- call Function3f47
- ret
-; 3efd
-
-Function3efd: ; 3efd
- push hl
- ld hl, $c590
- ld b, $4
- ld c, $12
- call Function3f0d
- pop hl
- call PrintTextBoxText
- ret
-; 3f0d
-
-Function3f0d: ; 3f0d
- push hl
- push bc
- ld de, $0939
- add hl, de
- inc b
- inc b
- inc c
- inc c
- call Function3f35
- pop bc
- pop hl
- call TextBoxBorder
- ret
-; 3f20
-
-Function3f20: ; 3f20
- ld hl, AttrMap
- ld b, $6
- ld c, $14
- call Function3f35
- ld hl, TileMap
- ld b, $4
- ld c, $12
- call Function3f47
- ret
-; 3f35
-
-Function3f35: ; 3f35
- ld a, $6
- ld de, $0014
-.asm_3f3a
- push bc
- push hl
-.asm_3f3c
- ld [hli], a
- dec c
- jr nz, .asm_3f3c
- pop hl
- add hl, de
- pop bc
- dec b
- jr nz, .asm_3f3a
- ret
-; 3f47
-
-Function3f47: ; 3f47
- push bc
- call Function3f58
- pop bc
-.asm_3f4c
- push bc
- call Function3f68
- pop bc
- dec b
- jr nz, .asm_3f4c
- call Function3f60
- ret
-; 3f58
-
-Function3f58: ; 3f58
- ld a, $63
- ld d, $62
- ld e, $64
- jr Function3f6e
-
-Function3f60: ; 3f60
- ld a, $68
- ld d, $67
- ld e, $69
- jr Function3f6e
-
-Function3f68: ; 3f68
- ld a, $7f
- ld d, $65
- ld e, $66
-
-Function3f6e: ; 3f6e
- push hl
- ld [hl], d
- inc hl
-.asm_3f71
- ld [hli], a
- dec c
- jr nz, .asm_3f71
- ld [hl], e
- pop hl
- ld de, $0014
- add hl, de
- ret
-; 3f7c
-
-Function3f7c: ; 3f7c
- call Function1cfd
- call Function1c53
- dec b
- dec c
- call Function3eea
- ret
-; 3f88
-
-Function3f88: ; 3f88
- ld hl, $d000
- ld b, $0
-.asm_3f8d
- push bc
- ld c, $8
-.asm_3f90
- ld a, [de]
- inc de
- cpl
- ld [hl], $0
- inc hl
- ld [hli], a
- dec c
- jr nz, .asm_3f90
- pop bc
- dec c
- jr nz, .asm_3f8d
- ret
-; 3f9f
-
-Function3f9f: ; 3f9f
- ld hl, $d000
-.asm_3fa2
- push bc
- ld c, $8
-.asm_3fa5
- ld a, [de]
- inc de
- inc de
- cpl
- ld [hl], $0
- inc hl
- ld [hli], a
- dec c
- jr nz, .asm_3fa5
- pop bc
- dec c
- jr nz, .asm_3fa2
- ret
-; 3fb5
-
-
SECTION "bank1", ROMX, BANK[$1]