summaryrefslogtreecommitdiff
path: root/engine/gfx/sgb_layouts.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/gfx/sgb_layouts.asm')
-rw-r--r--engine/gfx/sgb_layouts.asm897
1 files changed, 897 insertions, 0 deletions
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"
+