summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
authorZumi Daxuya <daxuya.zumi+code@protonmail.com>2021-05-17 17:59:29 +0700
committerZumi Daxuya <daxuya.zumi+code@protonmail.com>2021-05-17 18:09:43 +0700
commit437e556b3dd0d37609e1a629aed473f88c068be3 (patch)
treec6482d75999eb0a1408605460b12058baf1c95c4 /engine
parent3384ac5d7a7c8118d6701576680ea1e71624983c (diff)
Split GFX routines
Diffstat (limited to 'engine')
-rwxr-xr-xengine/dumps/bank02.asm921
-rw-r--r--engine/gfx/load_gfx.asm (renamed from engine/gfx.asm)2
-rw-r--r--engine/gfx/set_title_decoration.asm33
-rw-r--r--engine/gfx/sgb_layouts.asm897
4 files changed, 931 insertions, 922 deletions
diff --git a/engine/dumps/bank02.asm b/engine/dumps/bank02.asm
index 3afdd61..bb1528c 100755
--- a/engine/dumps/bank02.asm
+++ b/engine/dumps/bank02.asm
@@ -1252,924 +1252,3 @@ Data8a53:
db $3c, $14, $3c, $20, $48, $14, $54, $1c
db $54, $2c, $54, $38, $3c, $44, $48, $2c
-SECTION "engine/dumps/bank02.asm@SetTitleBGDecorationBorder", ROMX
-
-SetTitleBGDecorationBorder:
- ld de, TitleBGDecorationBorder
- ld hl, vChars2 + $500
- lb bc, BANK(TitleBGDecorationBorder), $09
- call Request2bpp
- coord hl, 0, 8
- ld b, $50
- call Function91ef
- coord hl, 0, 16
- ld b, $54
- call Function91ef
- ret
-
-Function91ef:
- xor a
- ld c, $14
-.sub_91f2
- and $03
- or b
- ld [hli], a
- inc a
- dec c
- jr nz, .sub_91f2
- ret
-
-SECTION "engine/dumps/bank02.asm@Function928b", ROMX
-
-LoadSGBLayout:
- ld a, b
- cp $ff
- jr nz, .not_ram
- ld a, [wccd0]
-.not_ram
- cp $fc
- jp z, SGB_ApplyPartyMenuHPPals
- ld l, a
- ld h, 0
- add hl, hl
- ld de, .Jumptable
- add hl, de
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld de, _LoadSGBLayout_ReturnFromJumpTable
- push de
- jp hl
-
-.Jumptable:
- dw SGB_BattleGrayscale
- dw SGB_BattleColors
- dw SGB_TownMap
- dw SGB_StatsScreenHPPals
- dw SGB_Pokedex
- dw SGB_SlotMachine
- dw SGB_TitleScreen
- dw SGB_GSIntro
- dw SGB_Diploma
- dw SGB_MapPals
- dw SGB_PartyMenu
- dw SGB_Evolution
- dw SGB_GFIntro
- dw SGB_TrainerCard
- dw SGB0e
- dw SGB_PikachuMinigame
- dw SGB_PokedexSelection
- dw SGB_Poker
- dw SGB12
- dw SGB_TrainerGear
- dw SGB_TrainerGearMap
- dw SGB_TrainerGearRadio
-
-SGB_BattleGrayscale:
- ld hl, PalPacket_BattleGrayscale
- ld de, BlkPacket_Battle
- ret
-
-SGB_BattleColors:
- ld hl, PalPacket_995c
- ld de, wcce1
- ld bc, PALPACKET_LENGTH
- call CopyBytes
-
- ld a, [wca3f]
- ld hl, wca02
- call Function9567
- jr c, .sub_92f7
-
- ld e, $00
- call Function9599
-.sub_92f7
- ld b, a
- ld a, [wca44]
- ld hl, wcdd7
- call Function9567
- jr c, .sub_9308
- ld e, $01
- call Function9599
-.sub_9308
- ld c, a
- ld hl, wcce2
- ld a, [wccd1]
- add $23
- ld [hli], a
- inc hl
- ld a, [wccd2]
- add $23
- ld [hli], a
- inc hl
- ld a, b
- ld [hli], a
- inc hl
- ld a, c
- ld [hl], a
- ld hl, wcce1
- ld de, BlkPacket_Battle
- ld a, $01
- ld [wccd0], a
- ret
-
-SGB0e:
- ld hl, PalPacket_995c
- ld de, wcce1
- ld bc, PALPACKET_LENGTH
- call CopyBytes
- ld hl, wcce2
- ld [hl], $10
- inc hl
- inc hl
- ld a, [wccd1]
- add $23
- ld [hl], a
- ld hl, wcce1
- ld de, BlkPacket_98bc
- ret
-
-SGB_TownMap:
- ld hl, Data99fc
- ld de, BlkPacket_986c
- ret
-
-SGB_StatsScreenHPPals:
- ld hl, PalPacket_995c
- ld de, wcce1
- ld bc, PALPACKET_LENGTH
- call CopyBytes
- ld a, [wMonDexIndex]
- call Function956d
- call Function957e
- push af
- ld hl, wcce2
- ld a, [wccd9]
- add $23
- ld [hli], a
- inc hl
- pop af
- ld [hl], a
- ld hl, wcce1
- ld de, BlkPacket_StatsScreen
- ret
-
-SGB_PartyMenu:
- ld hl, PalPacket_PartyMenu
- ld de, wcce2
- ret
-
-SGB_Pokedex:
- ld hl, PalPacket_Pokedex
- ld de, wcce1
- ld bc, PALPACKET_LENGTH
- call CopyBytes
- ld a, [wMonDexIndex]
- call Function956d
- ld hl, wcce4
- ld [hl], a
- ld hl, wcce1
- ld de, BlkPacket_Pokedex
- ret
-
-SGB_PokedexSelection:
- ld hl, PalPacket_99bc
- ld de, BlkPacket_986c
- ret
-
-SGB_SlotMachine:
- ld hl, PalPacket_SlotMachine
- ld de, BlkPacket_SlotMachine
- ret
-
-SGB_TitleScreen:
- ld hl, PalPacket_TitleScreen
- ld de, BlkPacket_TitleScreen
- ret
-
-SGB_Diploma:
- ld hl, PalPacket_9a3c
- ld de, BlkPacket_986c
- ret
-
-SGB_GSIntro:
- ld b, 0
- ld hl, .BlkPacketTable
-rept 4
- add hl, bc
-endr
- ld e, [hl]
- inc hl
- ld d, [hl]
- inc hl
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ret
-
-.BlkPacketTable:
- dw BlkPacket_986c, PalPacket_GSIntroShellderLapras
- dw BlkPacket_GSIntroJigglypuffPikachu, PalPacket_GSIntroJigglypuffPikachu
- dw BlkPacket_986c, PalPacket_GSIntroStartersTransition
-
-SGB_GFIntro:
- ld hl, PalPacket_GFIntro
- ld de, BlkPacket_986c
- ld a, $08
- ld [wccd0], a
- ret
-
-SGB_PikachuMinigame:
- ld hl, PalPacket_PikachuMinigame
- ld de, BlkPacket_986c
- ret
-
-SGB_Poker:
- ld hl, BlkPacket_986c
- ld de, wc51a
- ld bc, PALPACKET_LENGTH
- call CopyBytes
- ld hl, PalPacket_Poker
- ld de, BlkPacket_986c
- ret
-
-SGB_MapPals:
- ld hl, PalPacket_995c
- ld de, wcce1
- ld bc, PALPACKET_LENGTH
- call CopyBytes
- call GetMapPalsIndex
- ld hl, wcce2
- ld [hld], a
- ld de, BlkPacket_986c
- ld a, $09
- ld [wccd0], a
- ret
-
-SGB_Evolution:
- push bc
- ld hl, PalPacket_995c
- ld de, wcce1
- ld bc, PALPACKET_LENGTH
- call CopyBytes
- pop bc
- ld a, c
- and a
- ld a, $0e
- jr nz, .sub_9437
- ld a, [wccd1]
- call Function956d
- call Function957e
-.sub_9437
- ld [wcce2], a
- ld hl, wcce1
- ld de, BlkPacket_986c
- ret
-
-SGB_TrainerCard:
- ld hl, PalPacket_9a3c
- ld de, BlkPacket_986c
- ret
-
-SGB12:
- ld hl, PalPacket_995c
- ld de, wcce1
- ld bc, PALPACKET_LENGTH
- call CopyBytes
- ld hl, BlkPacket_986c
- ld de, wccf1
- ld bc, PALPACKET_LENGTH
- call CopyBytes
- call GetMapPalsIndex
- ld hl, wcce2
- ld [hl], a
- ld a, [wMonDexIndex]
- call Function956d
- ld hl, wcce4
- ld [hl], a
- ld hl, wccf4
- ld a, $05
- ld [hli], a
- ld a, [wMenuBorderLeftCoord]
- ld [hli], a
- ld a, [wMenuBorderTopCoord]
- ld [hli], a
- ld a, [wMenuBorderRightCoord]
- ld [hli], a
- ld a, [wMenuBorderBottomCoord]
- ld [hl], a
- ld hl, wcce1
- ld de, wccf1
- ret
-
-SGB_TrainerGear:
- ld hl, PalPacket_995c
- ld de, wcce1
- ld bc, PALPACKET_LENGTH
- call CopyBytes
- ld a, $16
- ld [wcce2], a
- ld a, $30
- ld [wcce4], a
- ld hl, wcce1
- ld de, BlkPacket_TrainerGear
- ret
-
-SGB_TrainerGearMap:
- ld hl, PalPacket_995c
- ld de, wcce1
- ld bc, PALPACKET_LENGTH
- call CopyBytes
- ld a, $16
- ld [wcce2], a
- ld a, $26
- ld [wcce4], a
- ld hl, wcce1
- ld de, BlkPacket_TrainerGear
- ret
-
-SGB_TrainerGearRadio:
- ld hl, PalPacket_995c
- ld de, wcce1
- ld bc, PALPACKET_LENGTH
- call CopyBytes
- ld a, $16
- ld [wcce2], a
- ld a, $39
- ld [wcce4], a
- ld hl, wcce1
- ld de, BlkPacket_TrainerGear
- ret
-
-GetMapPalsIndex:
- ld a, [wMapPermissions]
- cp ROUTE
- jr z, .is_route
- cp CAVE
- jr z, .is_cave
- cp GATE
- jr z, .is_gate
- cp ENVIRONMENT_5
- jr z, .env5
- cp INDOOR
- jr z, .indoors
- call Function9527
- jr c, .sub_9524
- call Function9543
- ret
-
-.indoors
- call Function9536
- jr c, .sub_9524
- call Function9543
- ret
-
-.is_route
- call Function9527
- jr c, .sub_9524
- ld a, $00
- ret
-
-.is_cave
- call Function9527
- jr c, .sub_9524
- ld a, $0c
- ret
-
-.is_gate
- ld a, $03
- ret
-
-.env5
- ld a, $04
- ret
-
-.sub_9524
- ld a, $0d
- ret
-
-Function9527:
- ld a, [wTimeOfDay]
- and $03
- jr z, .sub_9534
- cp $03
- jr z, .sub_9534
- scf
- ret
-.sub_9534
- and a
- ret
-
-Function9536:
- ld a, [wTimeOfDay]
- and $03
- cp $02
- jr nz, .sub_9541
- scf
- ret
-.sub_9541
- and a
- ret
-
-Function9543:
- ld a, [wMapGroup]
- ld e, a
- ld d, $00
- ld hl, Data954f
- add hl, de
- ld a, [hl]
- ret
-
-Data954f:
- db $01, $07, $0c, $03, $08, $06, $0b, $04
- db $05, $0a, $02, $03, $02, $02, $09, $01
-
-_LoadSGBLayout_ReturnFromJumpTable:
- push de
- call PushSGBPals
- pop hl
- jp PushSGBPals
-
-Function9567:
- bit 3, a
- ld a, $18
- ret nz
- ld a, [hl]
-
-Function956d:
- and a
- jr z, .sub_957a
- ld e, a
- ld d, $00
- ld hl, PokemonPalettes
- add hl, de
- ld a, [hl]
- and a
- ret
-.sub_957a
- ld a, $0f
- scf
- ret
-
-Function957e:
- push bc
- push af
- ld hl, wPartyMon1DVs
- ld a, [wWhichPokemon]
- ld bc, $0030
- call AddNTimes
- call Function95b0
- ld b, $00
- jr nc, .sub_9595
- ld b, $0a
-.sub_9595
- pop af
- add b
- pop bc
- ret
-
-Function9599:
- push bc
- push af
- ld a, e
- and a
- ld a, [wcae1]
- jr z, .sub_95a4
- srl a
-.sub_95a4
- srl a
- ld b, $00
- jr nc, .sub_95ac
- ld b, $0a
-.sub_95ac
- pop af
- add b
- pop bc
- ret
-
-Function95b0:
- ld a, [hl]
- cp $a0
- jr c, .sub_95ca
- ld a, [hli]
- and $0f
- cp $0a
- jr c, .sub_95ca
- ld a, [hl]
- cp $a0
- jr c, .sub_95ca
- ld a, [hl]
- and $0f
- cp $0a
- jr c, .sub_95ca
- scf
- ret
-.sub_95ca
- and a
- ret
-
-Function95cc:
- ld hl, wcddf
- ldh a, [hBattleTurn]
- and a
- jr nz, .sub_95d7
- ld hl, wca08
-.sub_95d7
- call Function95b0
- ld hl, wcae1
- jr nc, .sub_95ec
- ldh a, [hBattleTurn]
- and a
- jr nz, .sub_95e8
- set 0, [hl]
- jr .sub_95f7
-.sub_95e8
- set 1, [hl]
- jr .sub_95f7
-.sub_95ec
- ldh a, [hBattleTurn]
- and a
- jr nz, .sub_95f5
- res 0, [hl]
- jr .sub_95f7
-.sub_95f5
- res 1, [hl]
-.sub_95f7
- ret
-
-Function95f8:
- ld hl, BlkPacket_98fc
- ld de, wcce2
- ld bc, $0030
- jp CopyBytes
-
-SGB_ApplyPartyMenuHPPals:
- ld hl, wccd3
- ld a, [wcce1]
- ld e, a
- ld d, $00
- add hl, de
- ld e, l
- ld d, h
- ld a, [de]
- and a
- ld e, $05
- jr z, .sub_961d
- dec a
- ld e, $0a
- jr z, .sub_961d
- ld e, $0f
-.sub_961d
- push de
- ld hl, wcceb
- ld bc, $0006
- ld a, [wcce1]
- call AddNTimes
- pop de
- ld [hl], e
- ret
-
-LoadMagikarpPalettes_Intro:
- ld hl, PalPacket_MagikarpIntro
- jp PushSGBPals
-
-LoadForestPalettes2_Intro:
- ld hl, BlkPacket_986c
- jp PushSGBPals
-
-LoadVenusaurPalettes_Intro:
- ld hl, PalPacket_VenusaurIntro
- jp PushSGBPals
-
-LoadCharizardPalettes_Intro:
- ld hl, PalPacket_99bc
- jp PushSGBPals
-
-Function9645:
- ld hl, wc51a
- jp PushSGBPals
-
-PushSGBPals:
- ld a, [wJoypadFlags]
- push af
- set 7, a
- ld [wJoypadFlags], a
- call _PushSGBPals
- pop af
- ld [wJoypadFlags], a
- ret
-
-_PushSGBPals:
- ld a, [hl]
- and $7
- ret z
- ld b, a
-.loop
- push bc
- xor a
- ldh [rJOYP], a
- ld a, $30
- ldh [rJOYP], a
- ld b, $10
-.loop2
- ld e, $08
- ld a, [hli]
- ld d, a
-.loop3
- bit 0, d
- ld a, $10
- jr nz, .ok
- ld a, $20
-.ok
- ldh [rJOYP], a
- ld a, $30
- ldh [rJOYP], a
- rr d
- dec e
- jr nz, .loop3
- dec b
- jr nz, .loop2
- ld a, $20
- ldh [rJOYP], a
- ld a, $30
- ldh [rJOYP], a
- call SGBDelayCycles
- pop bc
- dec b
- jr nz, .loop
- ret
-
-CheckSGB:
- ld a, [wJoypadFlags]
- push af
- set 7, a
- ld [wJoypadFlags], a
-
- xor a
- ldh [rJOYP], a
- ld [wSGB], a
- call PushSGBBorderPalsAndWait
- jr nc, .skip
- ld a, 1
- ld [wSGB], a
- call _InitSGBBorderPals
- call PushSGBBorder
- call SGBBorder_PushBGPals
- call SGB_ClearVRAM
- ld hl, MaskEnCancelPacket
- call _PushSGBPals
-.skip
- pop af
- ld [wJoypadFlags], a
- ret
-
-_InitSGBBorderPals:
- ld hl, .PacketPointerTable
- ld c, 9
-
-.loop
- push bc
- ld a, [hli]
- push hl
- ld h, [hl]
- ld l, a
- call _PushSGBPals
- pop hl
- inc hl
- pop bc
- dec c
- jr nz, .loop
- ret
-
-.PacketPointerTable:
- dw MaskEnFreezePacket
- dw DataSndPacket1
- dw DataSndPacket2
- dw DataSndPacket3
- dw DataSndPacket4
- dw DataSndPacket5
- dw DataSndPacket6
- dw DataSndPacket7
- dw DataSndPacket8
-
-UpdateSGBBorder:
- ld a, [wSGB]
- ret z
- di
- xor a
- ldh [rJOYP], a
- ld hl, MaskEnFreezePacket
- call _PushSGBPals
- call PushSGBBorder
- ld hl, MaskEnCancelPacket
- call _PushSGBPals
- ei
- ret
-
-PushSGBBorder:
- call .LoadSGBBorderPointers
- push de
- call SGBBorder_YetMorePalPushing
- pop hl
- call SGBBorder_MorePalPushing
- ret
-
-.LoadSGBBorderPointers:
- ld a, [wce5f]
- bit 3, a
- jr nz, .spaceworld_border
-
-; load alternate border
- ld hl, UnusedSGBBorderGFX
- ld de, UnusedSGBBorderTilemap
- ret
-
-.spaceworld_border
- ld hl, SGBBorderGFX
- ld de, SGBBorderTilemap
- ret
-
-SGB_ClearVRAM:
- ld hl, vChars0
- ld bc, $2000
- xor a
- call ByteFill
- ret
-
-PushSGBBorderPalsAndWait:
- ld hl, MltReq2Packet
- call _PushSGBPals
- call SGBDelayCycles
- ldh a, [rJOYP]
- and $3
- cp $3
- jr nz, .carry
- ld a, $20
- ldh [rJOYP], a
- ldh a, [rJOYP]
- ldh a, [rJOYP]
- call SGBDelayCycles
- call SGBDelayCycles
- ld a, $30
- ldh [rJOYP], a
- call SGBDelayCycles
- call SGBDelayCycles
- ld a, $10
- ldh [rJOYP], a
-rept 6
- ldh a, [rJOYP]
-endr
- call SGBDelayCycles
- call SGBDelayCycles
- ld a, $30
- ldh [rJOYP], a
- ldh a, [rJOYP]
- ldh a, [rJOYP]
- ldh a, [rJOYP]
- call SGBDelayCycles
- call SGBDelayCycles
- ldh a, [rJOYP]
- and $3
- cp $3
- jr nz, .carry
- call .FinalPush
- and a
- ret
-
-.carry
- call .FinalPush
- scf
- ret
-
-.FinalPush:
- ld hl, MltReq1Packet
- call _PushSGBPals
- jp SGBDelayCycles
-
-SGBBorder_PushBGPals:
- call DisableLCD
- ld a, %11100100
- ldh [rBGP], a
- ld hl, SuperPalettes
- ld de, vChars1
- ld bc, $1000
- call CopyData
- call DrawDefaultTiles
- ld a, $e3
- ldh [rLCDC], a
- ld hl, PalTrnPacket
- call _PushSGBPals
- xor a
- ldh [rBGP], a
- ret
-
-SGBBorder_MorePalPushing:
- call DisableLCD
- ld a, %11100100
- ldh [rBGP], a
- ld de, vChars1
- ld bc, (6 + SCREEN_WIDTH + 6) * 5 * 2
- call CopyData
- ld b, SCREEN_HEIGHT
-.loop
- push bc
- ld bc, 6 * 2
- call CopyData
- ld bc, SCREEN_WIDTH * 2
- call ClearBytes
- ld bc, 6 * 2
- call CopyData
- pop bc
- dec b
- jr nz, .loop
- ld bc, (6 + SCREEN_WIDTH + 6) * 5 * 2
- call CopyData
- ld bc, $100
- call ClearBytes
- ld bc, $80
- call CopyData
- call DrawDefaultTiles
- ld a, $e3
- ldh [rLCDC], a
- ld hl, PctTrnPacket
- call _PushSGBPals
- xor a
- ldh [rBGP], a
- ret
-
-SGBBorder_YetMorePalPushing:
- call DisableLCD
- ld a, $e4
- ldh [rBGP], a
- ld de, vChars1
- ld b, $80
-.loop
- push bc
- ld bc, $10
- call CopyData
- ld bc, $10
- call ClearBytes
- pop bc
- dec b
- jr nz, .loop
- call DrawDefaultTiles
- ld a, $e3
- ldh [rLCDC], a
- ld hl, ChrTrnPacket
- call _PushSGBPals
- xor a
- ldh [rBGP], a
- ret
-
-CopyData:
- ld a, [hli]
- ld [de], a
- inc de
- dec bc
- ld a, c
- or b
- jr nz, CopyData
- ret
-
-ClearBytes:
- xor a
- ld [de], a
- inc de
- dec bc
- ld a, c
- or b
- jr nz, ClearBytes
- ret
-
-DrawDefaultTiles:
- hlbgcoord 0, 0
- ld de, BG_MAP_WIDTH - SCREEN_WIDTH
- ld a, $80
- ld c, 12 + 1
-.line
- ld b, SCREEN_WIDTH
-.tile
- ld [hli], a
- inc a
- dec b
- jr nz, .tile
- add hl, de
- dec c
- jr nz, .line
- ret
-
-SGBDelayCycles:
- ld de, 7000
-.wait
- nop
- nop
- nop
- dec de
- ld a, d
- or e
- jr nz, .wait
- ret
-
-INCLUDE "data/sgb/blk_packets.inc"
-INCLUDE "data/sgb/pal_packets.inc"
-INCLUDE "data/sgb/ctrl_packets.inc"
diff --git a/engine/gfx.asm b/engine/gfx/load_gfx.asm
index 5700904..c628c67 100644
--- a/engine/gfx.asm
+++ b/engine/gfx/load_gfx.asm
@@ -1,6 +1,6 @@
INCLUDE "constants.asm"
-SECTION "engine/gfx.asm", ROMX
+SECTION "engine/gfx/load_gfx.asm", ROMX
LoadFontGraphics::
ld de, FontGFX
diff --git a/engine/gfx/set_title_decoration.asm b/engine/gfx/set_title_decoration.asm
new file mode 100644
index 0000000..1a4f2fe
--- /dev/null
+++ b/engine/gfx/set_title_decoration.asm
@@ -0,0 +1,33 @@
+INCLUDE "constants.asm"
+
+SECTION "engine/gfx/set_title_decoration.asm", ROMX
+
+SetTitleBGDecorationBorder:
+ ld de, TitleBGDecorationBorder
+ ld hl, vChars2 + $500
+ lb bc, BANK(TitleBGDecorationBorder), 9
+ call Request2bpp
+
+; top row
+ coord hl, 0, 8
+ ld b, $50
+ call .PlaceRow
+
+; bottom row
+ coord hl, 0, 16
+ ld b, $54
+ call .PlaceRow
+ ret
+
+.PlaceRow:
+ xor a
+ ld c, SCREEN_WIDTH
+.loop
+ and $03
+ or b
+ ld [hli], a
+ inc a
+ dec c
+ jr nz, .loop
+ ret
+
diff --git a/engine/gfx/sgb_layouts.asm b/engine/gfx/sgb_layouts.asm
new file mode 100644
index 0000000..f825127
--- /dev/null
+++ b/engine/gfx/sgb_layouts.asm
@@ -0,0 +1,897 @@
+INCLUDE "constants.asm"
+
+SECTION "engine/gfx/sgb_layouts.asm", ROMX
+
+LoadSGBLayout:
+ ld a, b
+ cp $ff
+ jr nz, .not_ram
+ ld a, [wccd0]
+.not_ram
+ cp $fc
+ jp z, SGB_ApplyPartyMenuHPPals
+ ld l, a
+ ld h, 0
+ add hl, hl
+ ld de, .Jumptable
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, _LoadSGBLayout_ReturnFromJumpTable
+ push de
+ jp hl
+
+.Jumptable:
+ dw SGB_BattleGrayscale
+ dw SGB_BattleColors
+ dw SGB_TownMap
+ dw SGB_StatsScreenHPPals
+ dw SGB_Pokedex
+ dw SGB_SlotMachine
+ dw SGB_TitleScreen
+ dw SGB_GSIntro
+ dw SGB_Diploma
+ dw SGB_MapPals
+ dw SGB_PartyMenu
+ dw SGB_Evolution
+ dw SGB_GFIntro
+ dw SGB_TrainerCard
+ dw SGB0e
+ dw SGB_PikachuMinigame
+ dw SGB_PokedexSelection
+ dw SGB_Poker
+ dw SGB12
+ dw SGB_TrainerGear
+ dw SGB_TrainerGearMap
+ dw SGB_TrainerGearRadio
+
+SGB_BattleGrayscale:
+ ld hl, PalPacket_BattleGrayscale
+ ld de, BlkPacket_Battle
+ ret
+
+SGB_BattleColors:
+ ld hl, PalPacket_995c
+ ld de, wcce1
+ ld bc, PALPACKET_LENGTH
+ call CopyBytes
+
+ ld a, [wca3f]
+ ld hl, wca02
+ call Function9567
+ jr c, .sub_92f7
+
+ ld e, $00
+ call Function9599
+.sub_92f7
+ ld b, a
+ ld a, [wca44]
+ ld hl, wcdd7
+ call Function9567
+ jr c, .sub_9308
+ ld e, $01
+ call Function9599
+.sub_9308
+ ld c, a
+ ld hl, wcce2
+ ld a, [wccd1]
+ add $23
+ ld [hli], a
+ inc hl
+ ld a, [wccd2]
+ add $23
+ ld [hli], a
+ inc hl
+ ld a, b
+ ld [hli], a
+ inc hl
+ ld a, c
+ ld [hl], a
+ ld hl, wcce1
+ ld de, BlkPacket_Battle
+ ld a, $01
+ ld [wccd0], a
+ ret
+
+SGB0e:
+ ld hl, PalPacket_995c
+ ld de, wcce1
+ ld bc, PALPACKET_LENGTH
+ call CopyBytes
+ ld hl, wcce2
+ ld [hl], $10
+ inc hl
+ inc hl
+ ld a, [wccd1]
+ add $23
+ ld [hl], a
+ ld hl, wcce1
+ ld de, BlkPacket_98bc
+ ret
+
+SGB_TownMap:
+ ld hl, Data99fc
+ ld de, BlkPacket_986c
+ ret
+
+SGB_StatsScreenHPPals:
+ ld hl, PalPacket_995c
+ ld de, wcce1
+ ld bc, PALPACKET_LENGTH
+ call CopyBytes
+ ld a, [wMonDexIndex]
+ call Function956d
+ call Function957e
+ push af
+ ld hl, wcce2
+ ld a, [wccd9]
+ add $23
+ ld [hli], a
+ inc hl
+ pop af
+ ld [hl], a
+ ld hl, wcce1
+ ld de, BlkPacket_StatsScreen
+ ret
+
+SGB_PartyMenu:
+ ld hl, PalPacket_PartyMenu
+ ld de, wcce2
+ ret
+
+SGB_Pokedex:
+ ld hl, PalPacket_Pokedex
+ ld de, wcce1
+ ld bc, PALPACKET_LENGTH
+ call CopyBytes
+ ld a, [wMonDexIndex]
+ call Function956d
+ ld hl, wcce4
+ ld [hl], a
+ ld hl, wcce1
+ ld de, BlkPacket_Pokedex
+ ret
+
+SGB_PokedexSelection:
+ ld hl, PalPacket_99bc
+ ld de, BlkPacket_986c
+ ret
+
+SGB_SlotMachine:
+ ld hl, PalPacket_SlotMachine
+ ld de, BlkPacket_SlotMachine
+ ret
+
+SGB_TitleScreen:
+ ld hl, PalPacket_TitleScreen
+ ld de, BlkPacket_TitleScreen
+ ret
+
+SGB_Diploma:
+ ld hl, PalPacket_9a3c
+ ld de, BlkPacket_986c
+ ret
+
+SGB_GSIntro:
+ ld b, 0
+ ld hl, .BlkPacketTable
+rept 4
+ add hl, bc
+endr
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+.BlkPacketTable:
+ dw BlkPacket_986c, PalPacket_GSIntroShellderLapras
+ dw BlkPacket_GSIntroJigglypuffPikachu, PalPacket_GSIntroJigglypuffPikachu
+ dw BlkPacket_986c, PalPacket_GSIntroStartersTransition
+
+SGB_GFIntro:
+ ld hl, PalPacket_GFIntro
+ ld de, BlkPacket_986c
+ ld a, $08
+ ld [wccd0], a
+ ret
+
+SGB_PikachuMinigame:
+ ld hl, PalPacket_PikachuMinigame
+ ld de, BlkPacket_986c
+ ret
+
+SGB_Poker:
+ ld hl, BlkPacket_986c
+ ld de, wc51a
+ ld bc, PALPACKET_LENGTH
+ call CopyBytes
+ ld hl, PalPacket_Poker
+ ld de, BlkPacket_986c
+ ret
+
+SGB_MapPals:
+ ld hl, PalPacket_995c
+ ld de, wcce1
+ ld bc, PALPACKET_LENGTH
+ call CopyBytes
+ call GetMapPalsIndex
+ ld hl, wcce2
+ ld [hld], a
+ ld de, BlkPacket_986c
+ ld a, $09
+ ld [wccd0], a
+ ret
+
+SGB_Evolution:
+ push bc
+ ld hl, PalPacket_995c
+ ld de, wcce1
+ ld bc, PALPACKET_LENGTH
+ call CopyBytes
+ pop bc
+ ld a, c
+ and a
+ ld a, $0e
+ jr nz, .sub_9437
+ ld a, [wccd1]
+ call Function956d
+ call Function957e
+.sub_9437
+ ld [wcce2], a
+ ld hl, wcce1
+ ld de, BlkPacket_986c
+ ret
+
+SGB_TrainerCard:
+ ld hl, PalPacket_9a3c
+ ld de, BlkPacket_986c
+ ret
+
+SGB12:
+ ld hl, PalPacket_995c
+ ld de, wcce1
+ ld bc, PALPACKET_LENGTH
+ call CopyBytes
+ ld hl, BlkPacket_986c
+ ld de, wccf1
+ ld bc, PALPACKET_LENGTH
+ call CopyBytes
+ call GetMapPalsIndex
+ ld hl, wcce2
+ ld [hl], a
+ ld a, [wMonDexIndex]
+ call Function956d
+ ld hl, wcce4
+ ld [hl], a
+ ld hl, wccf4
+ ld a, $05
+ ld [hli], a
+ ld a, [wMenuBorderLeftCoord]
+ ld [hli], a
+ ld a, [wMenuBorderTopCoord]
+ ld [hli], a
+ ld a, [wMenuBorderRightCoord]
+ ld [hli], a
+ ld a, [wMenuBorderBottomCoord]
+ ld [hl], a
+ ld hl, wcce1
+ ld de, wccf1
+ ret
+
+SGB_TrainerGear:
+ ld hl, PalPacket_995c
+ ld de, wcce1
+ ld bc, PALPACKET_LENGTH
+ call CopyBytes
+ ld a, $16
+ ld [wcce2], a
+ ld a, $30
+ ld [wcce4], a
+ ld hl, wcce1
+ ld de, BlkPacket_TrainerGear
+ ret
+
+SGB_TrainerGearMap:
+ ld hl, PalPacket_995c
+ ld de, wcce1
+ ld bc, PALPACKET_LENGTH
+ call CopyBytes
+ ld a, $16
+ ld [wcce2], a
+ ld a, $26
+ ld [wcce4], a
+ ld hl, wcce1
+ ld de, BlkPacket_TrainerGear
+ ret
+
+SGB_TrainerGearRadio:
+ ld hl, PalPacket_995c
+ ld de, wcce1
+ ld bc, PALPACKET_LENGTH
+ call CopyBytes
+ ld a, $16
+ ld [wcce2], a
+ ld a, $39
+ ld [wcce4], a
+ ld hl, wcce1
+ ld de, BlkPacket_TrainerGear
+ ret
+
+GetMapPalsIndex:
+ ld a, [wMapPermissions]
+ cp ROUTE
+ jr z, .is_route
+ cp CAVE
+ jr z, .is_cave
+ cp GATE
+ jr z, .is_gate
+ cp ENVIRONMENT_5
+ jr z, .env5
+ cp INDOOR
+ jr z, .indoors
+ call Function9527
+ jr c, .sub_9524
+ call Function9543
+ ret
+
+.indoors
+ call Function9536
+ jr c, .sub_9524
+ call Function9543
+ ret
+
+.is_route
+ call Function9527
+ jr c, .sub_9524
+ ld a, $00
+ ret
+
+.is_cave
+ call Function9527
+ jr c, .sub_9524
+ ld a, $0c
+ ret
+
+.is_gate
+ ld a, $03
+ ret
+
+.env5
+ ld a, $04
+ ret
+
+.sub_9524
+ ld a, $0d
+ ret
+
+Function9527:
+ ld a, [wTimeOfDay]
+ and $03
+ jr z, .sub_9534
+ cp $03
+ jr z, .sub_9534
+ scf
+ ret
+.sub_9534
+ and a
+ ret
+
+Function9536:
+ ld a, [wTimeOfDay]
+ and $03
+ cp $02
+ jr nz, .sub_9541
+ scf
+ ret
+.sub_9541
+ and a
+ ret
+
+Function9543:
+ ld a, [wMapGroup]
+ ld e, a
+ ld d, $00
+ ld hl, Data954f
+ add hl, de
+ ld a, [hl]
+ ret
+
+Data954f:
+ db $01, $07, $0c, $03, $08, $06, $0b, $04
+ db $05, $0a, $02, $03, $02, $02, $09, $01
+
+_LoadSGBLayout_ReturnFromJumpTable:
+ push de
+ call PushSGBPals
+ pop hl
+ jp PushSGBPals
+
+Function9567:
+ bit 3, a
+ ld a, $18
+ ret nz
+ ld a, [hl]
+
+Function956d:
+ and a
+ jr z, .sub_957a
+ ld e, a
+ ld d, $00
+ ld hl, PokemonPalettes
+ add hl, de
+ ld a, [hl]
+ and a
+ ret
+.sub_957a
+ ld a, $0f
+ scf
+ ret
+
+Function957e:
+ push bc
+ push af
+ ld hl, wPartyMon1DVs
+ ld a, [wWhichPokemon]
+ ld bc, $0030
+ call AddNTimes
+ call Function95b0
+ ld b, $00
+ jr nc, .sub_9595
+ ld b, $0a
+.sub_9595
+ pop af
+ add b
+ pop bc
+ ret
+
+Function9599:
+ push bc
+ push af
+ ld a, e
+ and a
+ ld a, [wcae1]
+ jr z, .sub_95a4
+ srl a
+.sub_95a4
+ srl a
+ ld b, $00
+ jr nc, .sub_95ac
+ ld b, $0a
+.sub_95ac
+ pop af
+ add b
+ pop bc
+ ret
+
+Function95b0:
+ ld a, [hl]
+ cp $a0
+ jr c, .sub_95ca
+ ld a, [hli]
+ and $0f
+ cp $0a
+ jr c, .sub_95ca
+ ld a, [hl]
+ cp $a0
+ jr c, .sub_95ca
+ ld a, [hl]
+ and $0f
+ cp $0a
+ jr c, .sub_95ca
+ scf
+ ret
+.sub_95ca
+ and a
+ ret
+
+Function95cc:
+ ld hl, wcddf
+ ldh a, [hBattleTurn]
+ and a
+ jr nz, .sub_95d7
+ ld hl, wca08
+.sub_95d7
+ call Function95b0
+ ld hl, wcae1
+ jr nc, .sub_95ec
+ ldh a, [hBattleTurn]
+ and a
+ jr nz, .sub_95e8
+ set 0, [hl]
+ jr .sub_95f7
+.sub_95e8
+ set 1, [hl]
+ jr .sub_95f7
+.sub_95ec
+ ldh a, [hBattleTurn]
+ and a
+ jr nz, .sub_95f5
+ res 0, [hl]
+ jr .sub_95f7
+.sub_95f5
+ res 1, [hl]
+.sub_95f7
+ ret
+
+Function95f8:
+ ld hl, BlkPacket_98fc
+ ld de, wcce2
+ ld bc, $0030
+ jp CopyBytes
+
+SGB_ApplyPartyMenuHPPals:
+ ld hl, wccd3
+ ld a, [wcce1]
+ ld e, a
+ ld d, $00
+ add hl, de
+ ld e, l
+ ld d, h
+ ld a, [de]
+ and a
+ ld e, $05
+ jr z, .sub_961d
+ dec a
+ ld e, $0a
+ jr z, .sub_961d
+ ld e, $0f
+.sub_961d
+ push de
+ ld hl, wcceb
+ ld bc, $0006
+ ld a, [wcce1]
+ call AddNTimes
+ pop de
+ ld [hl], e
+ ret
+
+LoadMagikarpPalettes_Intro:
+ ld hl, PalPacket_MagikarpIntro
+ jp PushSGBPals
+
+LoadForestPalettes2_Intro:
+ ld hl, BlkPacket_986c
+ jp PushSGBPals
+
+LoadVenusaurPalettes_Intro:
+ ld hl, PalPacket_VenusaurIntro
+ jp PushSGBPals
+
+LoadCharizardPalettes_Intro:
+ ld hl, PalPacket_99bc
+ jp PushSGBPals
+
+Function9645:
+ ld hl, wc51a
+ jp PushSGBPals
+
+PushSGBPals:
+ ld a, [wJoypadFlags]
+ push af
+ set 7, a
+ ld [wJoypadFlags], a
+ call _PushSGBPals
+ pop af
+ ld [wJoypadFlags], a
+ ret
+
+_PushSGBPals:
+ ld a, [hl]
+ and $7
+ ret z
+ ld b, a
+.loop
+ push bc
+ xor a
+ ldh [rJOYP], a
+ ld a, $30
+ ldh [rJOYP], a
+ ld b, $10
+.loop2
+ ld e, $08
+ ld a, [hli]
+ ld d, a
+.loop3
+ bit 0, d
+ ld a, $10
+ jr nz, .ok
+ ld a, $20
+.ok
+ ldh [rJOYP], a
+ ld a, $30
+ ldh [rJOYP], a
+ rr d
+ dec e
+ jr nz, .loop3
+ dec b
+ jr nz, .loop2
+ ld a, $20
+ ldh [rJOYP], a
+ ld a, $30
+ ldh [rJOYP], a
+ call SGBDelayCycles
+ pop bc
+ dec b
+ jr nz, .loop
+ ret
+
+CheckSGB:
+ ld a, [wJoypadFlags]
+ push af
+ set 7, a
+ ld [wJoypadFlags], a
+
+ xor a
+ ldh [rJOYP], a
+ ld [wSGB], a
+ call PushSGBBorderPalsAndWait
+ jr nc, .skip
+ ld a, 1
+ ld [wSGB], a
+ call _InitSGBBorderPals
+ call PushSGBBorder
+ call SGBBorder_PushBGPals
+ call SGB_ClearVRAM
+ ld hl, MaskEnCancelPacket
+ call _PushSGBPals
+.skip
+ pop af
+ ld [wJoypadFlags], a
+ ret
+
+_InitSGBBorderPals:
+ ld hl, .PacketPointerTable
+ ld c, 9
+
+.loop
+ push bc
+ ld a, [hli]
+ push hl
+ ld h, [hl]
+ ld l, a
+ call _PushSGBPals
+ pop hl
+ inc hl
+ pop bc
+ dec c
+ jr nz, .loop
+ ret
+
+.PacketPointerTable:
+ dw MaskEnFreezePacket
+ dw DataSndPacket1
+ dw DataSndPacket2
+ dw DataSndPacket3
+ dw DataSndPacket4
+ dw DataSndPacket5
+ dw DataSndPacket6
+ dw DataSndPacket7
+ dw DataSndPacket8
+
+UpdateSGBBorder:
+ ld a, [wSGB]
+ ret z
+ di
+ xor a
+ ldh [rJOYP], a
+ ld hl, MaskEnFreezePacket
+ call _PushSGBPals
+ call PushSGBBorder
+ ld hl, MaskEnCancelPacket
+ call _PushSGBPals
+ ei
+ ret
+
+PushSGBBorder:
+ call .LoadSGBBorderPointers
+ push de
+ call SGBBorder_YetMorePalPushing
+ pop hl
+ call SGBBorder_MorePalPushing
+ ret
+
+.LoadSGBBorderPointers:
+ ld a, [wce5f]
+ bit 3, a
+ jr nz, .spaceworld_border
+
+; load alternate border
+ ld hl, UnusedSGBBorderGFX
+ ld de, UnusedSGBBorderTilemap
+ ret
+
+.spaceworld_border
+ ld hl, SGBBorderGFX
+ ld de, SGBBorderTilemap
+ ret
+
+SGB_ClearVRAM:
+ ld hl, vChars0
+ ld bc, $2000
+ xor a
+ call ByteFill
+ ret
+
+PushSGBBorderPalsAndWait:
+ ld hl, MltReq2Packet
+ call _PushSGBPals
+ call SGBDelayCycles
+ ldh a, [rJOYP]
+ and $3
+ cp $3
+ jr nz, .carry
+ ld a, $20
+ ldh [rJOYP], a
+ ldh a, [rJOYP]
+ ldh a, [rJOYP]
+ call SGBDelayCycles
+ call SGBDelayCycles
+ ld a, $30
+ ldh [rJOYP], a
+ call SGBDelayCycles
+ call SGBDelayCycles
+ ld a, $10
+ ldh [rJOYP], a
+rept 6
+ ldh a, [rJOYP]
+endr
+ call SGBDelayCycles
+ call SGBDelayCycles
+ ld a, $30
+ ldh [rJOYP], a
+ ldh a, [rJOYP]
+ ldh a, [rJOYP]
+ ldh a, [rJOYP]
+ call SGBDelayCycles
+ call SGBDelayCycles
+ ldh a, [rJOYP]
+ and $3
+ cp $3
+ jr nz, .carry
+ call .FinalPush
+ and a
+ ret
+
+.carry
+ call .FinalPush
+ scf
+ ret
+
+.FinalPush:
+ ld hl, MltReq1Packet
+ call _PushSGBPals
+ jp SGBDelayCycles
+
+SGBBorder_PushBGPals:
+ call DisableLCD
+ ld a, %11100100
+ ldh [rBGP], a
+ ld hl, SuperPalettes
+ ld de, vChars1
+ ld bc, $1000
+ call CopyData
+ call DrawDefaultTiles
+ ld a, $e3
+ ldh [rLCDC], a
+ ld hl, PalTrnPacket
+ call _PushSGBPals
+ xor a
+ ldh [rBGP], a
+ ret
+
+SGBBorder_MorePalPushing:
+ call DisableLCD
+ ld a, %11100100
+ ldh [rBGP], a
+ ld de, vChars1
+ ld bc, (6 + SCREEN_WIDTH + 6) * 5 * 2
+ call CopyData
+ ld b, SCREEN_HEIGHT
+.loop
+ push bc
+ ld bc, 6 * 2
+ call CopyData
+ ld bc, SCREEN_WIDTH * 2
+ call ClearBytes
+ ld bc, 6 * 2
+ call CopyData
+ pop bc
+ dec b
+ jr nz, .loop
+ ld bc, (6 + SCREEN_WIDTH + 6) * 5 * 2
+ call CopyData
+ ld bc, $100
+ call ClearBytes
+ ld bc, $80
+ call CopyData
+ call DrawDefaultTiles
+ ld a, $e3
+ ldh [rLCDC], a
+ ld hl, PctTrnPacket
+ call _PushSGBPals
+ xor a
+ ldh [rBGP], a
+ ret
+
+SGBBorder_YetMorePalPushing:
+ call DisableLCD
+ ld a, $e4
+ ldh [rBGP], a
+ ld de, vChars1
+ ld b, $80
+.loop
+ push bc
+ ld bc, $10
+ call CopyData
+ ld bc, $10
+ call ClearBytes
+ pop bc
+ dec b
+ jr nz, .loop
+ call DrawDefaultTiles
+ ld a, $e3
+ ldh [rLCDC], a
+ ld hl, ChrTrnPacket
+ call _PushSGBPals
+ xor a
+ ldh [rBGP], a
+ ret
+
+CopyData:
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec bc
+ ld a, c
+ or b
+ jr nz, CopyData
+ ret
+
+ClearBytes:
+ xor a
+ ld [de], a
+ inc de
+ dec bc
+ ld a, c
+ or b
+ jr nz, ClearBytes
+ ret
+
+DrawDefaultTiles:
+ hlbgcoord 0, 0
+ ld de, BG_MAP_WIDTH - SCREEN_WIDTH
+ ld a, $80
+ ld c, 12 + 1
+.line
+ ld b, SCREEN_WIDTH
+.tile
+ ld [hli], a
+ inc a
+ dec b
+ jr nz, .tile
+ add hl, de
+ dec c
+ jr nz, .line
+ ret
+
+SGBDelayCycles:
+ ld de, 7000
+.wait
+ nop
+ nop
+ nop
+ dec de
+ ld a, d
+ or e
+ jr nz, .wait
+ ret
+
+INCLUDE "data/sgb/blk_packets.inc"
+INCLUDE "data/sgb/pal_packets.inc"
+INCLUDE "data/sgb/ctrl_packets.inc"
+