summaryrefslogtreecommitdiff
path: root/engine/palettes.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/palettes.asm')
-rwxr-xr-xengine/palettes.asm620
1 files changed, 620 insertions, 0 deletions
diff --git a/engine/palettes.asm b/engine/palettes.asm
new file mode 100755
index 00000000..71f01a97
--- /dev/null
+++ b/engine/palettes.asm
@@ -0,0 +1,620 @@
+Func_71ddf: ; 71ddf (1c:5ddf)
+ call Load16BitRegisters
+ ld a, b
+ cp $ff
+ jr nz, .asm_71dea
+ ld a, [$cf1c]
+.asm_71dea
+ cp $fc
+ jp z, Func_71fc2
+ ld l, a
+ ld h, $0
+ add hl, hl
+ ld de, PointerTable_71f73
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, Func_72156
+ push de
+ jp [hl]
+
+SendPalPacket_Black: ; 71dff (1c:5dff)
+ ld hl, PalPacket_Black
+ ld de, BlkPacket_Battle
+ ret
+
+; uses PalPacket_Empty to build a packet based on mon IDs and health color
+BuildBattlePalPacket: ; 71e06 (1c:5e06)
+ ld hl, PalPacket_Empty
+ ld de, $cf2d
+ ld bc, $10
+ call CopyData
+ ld a, [W_PLAYERBATTSTATUS3]
+ ld hl, W_PLAYERMONID
+ call DeterminePaletteID
+ ld b, a
+ ld a, [W_ENEMYBATTSTATUS3]
+ ld hl, W_ENEMYMONID
+ call DeterminePaletteID
+ ld c, a
+ ld hl, $cf2e
+ ld a, [$cf1d]
+ add PAL_GREENBAR
+ ld [hli], a
+ inc hl
+ ld a, [$cf1e]
+ add PAL_GREENBAR
+ ld [hli], a
+ inc hl
+ ld a, b
+ ld [hli], a
+ inc hl
+ ld a, c
+ ld [hl], a
+ ld hl, $cf2d
+ ld de, BlkPacket_Battle
+ ld a, $1
+ ld [$cf1c], a
+ ret
+
+SendPalPacket_TownMap: ; 71e48 (1c:5e48)
+ ld hl, PalPacket_TownMap
+ ld de, BlkPacket_WholeScreen
+ ret
+
+; uses PalPacket_Empty to build a packet based the mon ID
+BuildStatusScreenPalPacket: ; 71e4f (1c:5e4f)
+ ld hl, PalPacket_Empty
+ ld de, $cf2d
+ ld bc, $10
+ call CopyData
+ ld a, [$cf91]
+ cp VICTREEBEL + 1
+ jr c, .pokemon
+ ld a, $1 ; not pokemon
+.pokemon
+ call DeterminePaletteIDOutOfBattle
+ push af
+ ld hl, $cf2e
+ ld a, [$cf25]
+ add $1f
+ ld [hli], a
+ inc hl
+ pop af
+ ld [hl], a
+ ld hl, $cf2d
+ ld de, BlkPacket_StatusScreen
+ ret
+
+SendPalPacket_PartyMenu: ; 71e7b (1c:5e7b)
+ ld hl, PalPacket_PartyMenu
+ ld de, $cf2e
+ ret
+
+SendPalPacket_Pokedex: ; 71e82 (1c:5e82)
+ ld hl, PalPacket_Pokedex
+ ld de, $cf2d
+ ld bc, $10
+ call CopyData
+ ld a, [$cf91]
+ call DeterminePaletteIDOutOfBattle
+ ld hl, $cf30
+ ld [hl], a
+ ld hl, $cf2d
+ ld de, BlkPacket_Pokedex
+ ret
+
+SendPalPacket_Slots: ; 71e9f (1c:5e9f)
+ ld hl, PalPacket_Slots
+ ld de, BlkPacket_Slots
+ ret
+
+SendPalPacket_Titlescreen: ; 71ea6 (1c:5ea6)
+ ld hl, PalPacket_Titlescreen
+ ld de, BlkPacket_Titlescreen
+ ret
+
+; used mostly for menus and the Oak intro
+SendPalPacket_Generic: ; 71ead (1c:5ead)
+ ld hl, PalPacket_Generic
+ ld de, BlkPacket_WholeScreen
+ ret
+
+SendPalPacket_NidorinoIntro: ; 71eb4 (1c:5eb4)
+ ld hl, PalPacket_NidorinoIntro
+ ld de, BlkPacket_NidorinoIntro
+ ret
+
+SendPalPacket_GameFreakIntro: ; 71ebb (1c:5ebb)
+ ld hl, PalPacket_GameFreakIntro
+ ld de, BlkPacket_GameFreakIntro
+ ld a, $8
+ ld [$cf1c], a
+ ret
+
+; uses PalPacket_Empty to build a packet based on the current map
+BuildOverworldPalPacket: ; 71ec7 (1c:5ec7)
+ ld hl, PalPacket_Empty
+ ld de, $cf2d
+ ld bc, $10
+ call CopyData
+ ld a, [W_CURMAPTILESET]
+ cp CEMETERY
+ jr z, .PokemonTowerOrAgatha
+ cp CAVERN
+ jr z, .caveOrBruno
+ ld a, [W_CURMAP]
+ cp REDS_HOUSE_1F
+ jr c, .townOrRoute
+ cp UNKNOWN_DUNGEON_2
+ jr c, .normalDungeonOrBuilding
+ cp NAME_RATERS_HOUSE
+ jr c, .caveOrBruno
+ cp LORELEIS_ROOM
+ jr z, .Lorelei
+ cp BRUNOS_ROOM
+ jr z, .caveOrBruno
+.normalDungeonOrBuilding
+ ld a, [wLastMap] ; town or route that current dungeon or building is located
+.townOrRoute
+ cp SAFFRON_CITY + 1
+ jr c, .town
+ ld a, PAL_ROUTE - 1
+.town
+ inc a ; a town's pallete ID is its map ID + 1
+ ld hl, $cf2e
+ ld [hld], a
+ ld de, BlkPacket_WholeScreen
+ ld a, $9
+ ld [$cf1c], a
+ ret
+.PokemonTowerOrAgatha
+ ld a, PAL_GREYMON - 1
+ jr .town
+.caveOrBruno
+ ld a, PAL_CAVE - 1
+ jr .town
+.Lorelei
+ xor a
+ jr .town
+
+; used when a Pokemon is the only thing on the screen
+; such as evolution, trading and the Hall of Fame
+SendPokemonPalette_WholeScreen: ; 71f17 (1c:5f17)
+ push bc
+ ld hl, PalPacket_Empty
+ ld de, $cf2d
+ ld bc, $10
+ call CopyData
+ pop bc
+ ld a, c
+ and a
+ ld a, $1e
+ jr nz, .asm_71f31
+ ld a, [$cf1d]
+ call DeterminePaletteIDOutOfBattle
+.asm_71f31
+ ld [$cf2e], a
+ ld hl, $cf2d
+ ld de, BlkPacket_WholeScreen
+ ret
+
+BuildTrainerCardPalPacket: ; 71f3b (1c:5f3b)
+ ld hl, BlkPacket_TrainerCard
+ ld de, $cc5b
+ ld bc, $40
+ call CopyData
+ ld de, LoopCounts_71f8f
+ ld hl, $cc5d
+ ld a, [W_OBTAINEDBADGES]
+ ld c, $8
+.asm_71f52
+ srl a
+ push af
+ jr c, .asm_71f62
+ push bc
+ ld a, [de]
+ ld c, a
+ xor a
+.asm_71f5b
+ ld [hli], a
+ dec c
+ jr nz, .asm_71f5b
+ pop bc
+ jr .asm_71f67
+.asm_71f62
+ ld a, [de]
+.asm_71f63
+ inc hl
+ dec a
+ jr nz, .asm_71f63
+.asm_71f67
+ pop af
+ inc de
+ dec c
+ jr nz, .asm_71f52
+ ld hl, PalPacket_TrainerCard
+ ld de, $cc5b
+ ret
+
+PointerTable_71f73: ; 71f73 (1c:5f73)
+ dw SendPalPacket_Black
+ dw BuildBattlePalPacket
+ dw SendPalPacket_TownMap
+ dw BuildStatusScreenPalPacket
+ dw SendPalPacket_Pokedex
+ dw SendPalPacket_Slots
+ dw SendPalPacket_Titlescreen
+ dw SendPalPacket_NidorinoIntro
+ dw SendPalPacket_Generic
+ dw BuildOverworldPalPacket
+ dw SendPalPacket_PartyMenu
+ dw SendPokemonPalette_WholeScreen
+ dw SendPalPacket_GameFreakIntro
+ dw BuildTrainerCardPalPacket
+
+; each byte is the number of loops to make in .asm_71f5b for each badge
+LoopCounts_71f8f: ; 71f8f (1c:5f8f)
+ db $06,$06,$06,$12,$06,$06,$06,$06
+
+DeterminePaletteID: ; 71f97 (1c:5f97)
+ bit 3, a ; bit 3 of battle status 3, set if current Pokemon is transformed
+ ld a, PAL_GREYMON ; if yes, use Ditto's palette
+ ret nz
+ ld a, [hl]
+DeterminePaletteIDOutOfBattle: ; 71f9d (1c:5f9d)
+ ld [$D11E], a
+ and a
+ jr z, .idZero
+ push bc
+ ld a, $3A
+ call Predef ; turn Pokemon ID number into Pokedex number
+ pop bc
+ ld a, [$D11E]
+.idZero
+ ld e, a
+ ld d, $00
+ ld hl, MonsterPalettes ; not just for Pokemon, Trainers use it too
+ add hl, de
+ ld a, [hl]
+ ret
+
+SendBlkPacket_PartyMenu: ; 71fb6 (1c:5fb6)
+ ld hl, BlkPacket_PartyMenu ; $62f4
+ ld de, $cf2e
+ ld bc, $30
+ jp CopyData
+
+Func_71fc2: ; 71fc2 (1c:5fc2)
+ ld hl, $cf1f
+ ld a, [$cf2d]
+ ld e, a
+ ld d, $0
+ add hl, de
+ ld e, l
+ ld d, h
+ ld a, [de]
+ and a
+ ld e, $5
+ jr z, .asm_71fdb
+ dec a
+ ld e, $a
+ jr z, .asm_71fdb
+ ld e, $f
+.asm_71fdb
+ push de
+ ld hl, $cf37
+ ld bc, $6
+ ld a, [$cf2d]
+ call AddNTimes
+ pop de
+ ld [hl], e
+ ret
+
+SendSGBPacket: ; 71feb (1c:5feb)
+;check number of packets
+ ld a,[hl]
+ and a,$07
+ ret z
+; store number of packets in B
+ ld b,a
+.loop2
+; save B for later use
+ push bc
+; load a non-zero value in $fff9 to disable the routine that checks actual
+; joypad input (said routine, located at $15f, does nothing if $fff9 is not
+; zero)
+ ld a,$01
+ ld [$fff9],a
+; send RESET signal (P14=LOW, P15=LOW)
+ xor a
+ ld [$ff00],a
+; set P14=HIGH, P15=HIGH
+ ld a,$30
+ ld [$ff00],a
+;load length of packets (16 bytes)
+ ld b,$10
+.nextByte
+;set bit counter (8 bits per byte)
+ ld e,$08
+; get next byte in the packet
+ ld a,[hli]
+ ld d,a
+.nextBit0
+ bit 0,d
+; if 0th bit is not zero set P14=HIGH,P15=LOW (send bit 1)
+ ld a,$10
+ jr nz,.next0
+; else (if 0th bit is zero) set P14=LOW,P15=HIGH (send bit 0)
+ ld a,$20
+.next0
+ ld [$ff00],a
+; must set P14=HIGH,P15=HIGH between each "pulse"
+ ld a,$30
+ ld [$ff00],a
+; rotation will put next bit in 0th position (so we can always use command
+; "bit 0,d" to fetch the bit that has to be sent)
+ rr d
+; decrease bit counter so we know when we have sent all 8 bits of current byte
+ dec e
+ jr nz,.nextBit0
+ dec b
+ jr nz,.nextByte
+; send bit 1 as a "stop bit" (end of parameter data)
+ ld a,$20
+ ld [$ff00],a
+; set P14=HIGH,P15=HIGH
+ ld a,$30
+ ld [$ff00],a
+ xor a
+ ld [$fff9],a
+; wait for about 70000 cycles
+ call Wait7000
+; restore (previously pushed) number of packets
+ pop bc
+ dec b
+; return if there are no more packets
+ ret z
+; else send 16 more bytes
+ jr .loop2
+
+LoadSGBBorderAndPalettes: ; 7202b (1c:602b)
+ xor a
+ ld [$cf1b], a
+ call Func_7209b
+ ret nc
+ ld a, $1
+ ld [$cf1b], a
+ ld a, [$cf1a]
+ and a
+ jr z, .asm_7203f
+ ret
+.asm_7203f
+ di
+ call Func_72075
+ ei
+ ld a, $1
+ ld [$cf2d], a
+ ld de, PalPacket_72508
+ ld hl, SGBBorderGraphics
+ call Func_7210b
+ xor a
+ ld [$cf2d], a
+ ld de, PalPacket_72518
+ ld hl, BorderPalettes
+ call Func_7210b
+ xor a
+ ld [$cf2d], a
+ ld de, PalPacket_724d8
+ ld hl, SuperPalettes
+ call Func_7210b
+ call ZeroVram
+ ld hl, PalPacket_72538
+ jp SendSGBPacket
+
+Func_72075: ; 72075 (1c:6075)
+ ld hl, PointerTable_72089
+ ld c, $9
+.asm_7207a
+ push bc
+ ld a, [hli]
+ push hl
+ ld h, [hl]
+ ld l, a
+ call SendSGBPacket
+ pop hl
+ inc hl
+ pop bc
+ dec c
+ jr nz, .asm_7207a
+ ret
+
+PointerTable_72089: ; 72089 (1c:6089)
+ dw PalPacket_72528
+ dw PalPacket_72548
+ dw PalPacket_72558
+ dw PalPacket_72568
+ dw PalPacket_72578
+ dw PalPacket_72588
+ dw PalPacket_72598
+ dw PalPacket_725a8
+ dw PalPacket_725b8
+
+Func_7209b: ; 7209b (1c:609b)
+ ld hl, PalPacket_724f8
+ di
+ call SendSGBPacket
+ ld a, $1
+ ld [$fff9], a
+ ei
+ call Wait7000
+ ld a, [rJOYP] ; $ff0
+ and $3
+ cp $3
+ jr nz, .asm_720fd
+ ld a, $20
+ ld [rJOYP], a ; $ff0
+ ld a, [rJOYP] ; $ff0
+ ld a, [rJOYP] ; $ff0
+ call Wait7000
+ call Wait7000
+ ld a, $30
+ ld [rJOYP], a ; $ff0
+ call Wait7000
+ call Wait7000
+ ld a, $10
+ ld [rJOYP], a ; $ff0
+ ld a, [rJOYP] ; $ff0
+ ld a, [rJOYP] ; $ff0
+ ld a, [rJOYP] ; $ff0
+ ld a, [rJOYP] ; $ff0
+ ld a, [rJOYP] ; $ff0
+ ld a, [rJOYP] ; $ff0
+ call Wait7000
+ call Wait7000
+ ld a, $30
+ ld [rJOYP], a ; $ff0
+ ld a, [rJOYP] ; $ff0
+ ld a, [rJOYP] ; $ff0
+ ld a, [rJOYP] ; $ff0
+ call Wait7000
+ call Wait7000
+ ld a, [rJOYP] ; $ff0
+ and $3
+ cp $3
+ jr nz, .asm_720fd
+ call Func_72102
+ and a
+ ret
+.asm_720fd
+ call Func_72102
+ scf
+ ret
+
+Func_72102: ; 72102 (1c:6102)
+ ld hl, PalPacket_724e8
+ call SendSGBPacket
+ jp Wait7000
+
+Func_7210b: ; 7210b (1c:610b)
+ di
+ push de
+ call DisableLCD
+ ld a, $e4
+ ld [rBGP], a ; $ff47
+ ld de, $8800
+ ld a, [$cf2d]
+ and a
+ jr z, .asm_72122
+ call Func_72188
+ jr .asm_72128
+.asm_72122
+ ld bc, $1000
+ call CopyData
+.asm_72128
+ ld hl, $9800
+ ld de, $c
+ ld a, $80
+ ld c, $d
+.asm_72132
+ ld b, $14
+.asm_72134
+ ld [hli], a
+ inc a
+ dec b
+ jr nz, .asm_72134
+ add hl, de
+ dec c
+ jr nz, .asm_72132
+ ld a, $e3
+ ld [rLCDC], a ; $ff40
+ pop hl
+ call SendSGBPacket
+ xor a
+ ld [rBGP], a ; $ff47
+ ei
+ ret
+
+Wait7000: ; 7214a (1c:614a)
+; each loop takes about 10 cycles so this routine actually loops through 70000
+; cycles.
+ ld de, 7000
+.loop
+ nop
+ nop
+ nop
+ dec de
+ ld a, d
+ or e
+ jr nz, .loop
+ ret
+
+Func_72156: ; 72156 (1c:6156)
+ ld a, [$cf1a]
+ and a
+ jr z, .asm_72165
+ push de
+ call Func_7216d
+ pop hl
+ call Func_72187
+ ret
+.asm_72165
+ push de
+ call SendSGBPacket
+ pop hl
+ jp SendSGBPacket
+
+Func_7216d: ; 7216d (1c:616d)
+ ld a, $80
+ ld [$ff68], a
+ inc hl
+ ld c, $20
+.asm_72174
+ ld a, [hli]
+ inc hl
+ add a
+ add a
+ add a
+ ld de, SuperPalettes
+ add e
+ jr nc, .asm_72180
+ inc d
+.asm_72180
+ ld a, [de]
+ ld [$ff69], a
+ dec c
+ jr nz, .asm_72174
+ ret
+
+Func_72187: ; 72187 (1c:6187)
+ ret
+
+Func_72188: ; 72188 (1c:6188)
+ ld b, $80
+.asm_7218a
+ ld c, $10
+.asm_7218c
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .asm_7218c
+ ld c, $10
+ xor a
+.asm_72195
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .asm_72195
+ dec b
+ jr nz, .asm_7218a
+ ret
+
+INCLUDE "data/sgb_packets.asm"
+
+INCLUDE "data/mon_palettes.asm"
+
+INCLUDE "data/super_palettes.asm"
+
+INCLUDE "data/sgb_border.asm"