ref: 07dd7056372288de7bb5b64f9416d741adb3b499
dir: /engine/palettes.asm/
Func_71ddf: ; 71ddf (1c:5ddf) call GetPredefRegisters ld a, b cp $ff jr nz, .asm_71dea ld a, [wcf1c] .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, wcf2d ld bc, $10 call CopyData ld a, [W_PLAYERBATTSTATUS3] ld hl, wBattleMonSpecies call DeterminePaletteID ld b, a ld a, [W_ENEMYBATTSTATUS3] ld hl, wEnemyMonSpecies2 call DeterminePaletteID ld c, a ld hl, wcf2e ld a, [wcf1d] add PAL_GREENBAR ld [hli], a inc hl ld a, [wcf1e] add PAL_GREENBAR ld [hli], a inc hl ld a, b ld [hli], a inc hl ld a, c ld [hl], a ld hl, wcf2d ld de, BlkPacket_Battle ld a, $1 ld [wcf1c], 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, wcf2d ld bc, $10 call CopyData ld a, [wcf91] cp VICTREEBEL + 1 jr c, .pokemon ld a, $1 ; not pokemon .pokemon call DeterminePaletteIDOutOfBattle push af ld hl, wcf2e ld a, [wcf25] add PAL_GREENBAR ld [hli], a inc hl pop af ld [hl], a ld hl, wcf2d ld de, BlkPacket_StatusScreen ret SendPalPacket_PartyMenu: ; 71e7b (1c:5e7b) ld hl, PalPacket_PartyMenu ld de, wcf2e ret SendPalPacket_Pokedex: ; 71e82 (1c:5e82) ld hl, PalPacket_Pokedex ld de, wcf2d ld bc, $10 call CopyData ld a, [wcf91] call DeterminePaletteIDOutOfBattle ld hl, wcf30 ld [hl], a ld hl, wcf2d 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 [wcf1c], a ret ; uses PalPacket_Empty to build a packet based on the current map BuildOverworldPalPacket: ; 71ec7 (1c:5ec7) ld hl, PalPacket_Empty ld de, wcf2d 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, wcf2e ld [hld], a ld de, BlkPacket_WholeScreen ld a, $9 ld [wcf1c], 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, wcf2d ld bc, $10 call CopyData pop bc ld a, c and a ld a, $1e jr nz, .asm_71f31 ld a, [wcf1d] call DeterminePaletteIDOutOfBattle .asm_71f31 ld [wcf2e], a ld hl, wcf2d ld de, BlkPacket_WholeScreen ret BuildTrainerCardPalPacket: ; 71f3b (1c:5f3b) ld hl, BlkPacket_TrainerCard ld de, wcc5b ld bc, $40 call CopyData ld de, LoopCounts_71f8f ld hl, wcc5d 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, wcc5b 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 [wd11e], a and a jr z, .idZero push bc predef IndexToPokedex ; turn Pokemon ID number into Pokedex number pop bc ld a, [wd11e] .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 ld de, wcf2e ld bc, $30 jp CopyData Func_71fc2: ; 71fc2 (1c:5fc2) ld hl, wcf1f ld a, [wcf2d] 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, wcf37 ld bc, $6 ld a, [wcf2d] 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 LoadSGB: ; 7202b (1c:602b) xor a ld [wOnSGB], a call CheckSGB ret nc ld a, $1 ld [wOnSGB], a ld a, [wGBC] and a jr z, .asm_7203f ret .asm_7203f di call Func_72075 ei ld a, $1 ld [wcf2d], a ld de, ChrTrnPacket ld hl, SGBBorderGraphics call Func_7210b xor a ld [wcf2d], a ld de, PctTrnPacket ld hl, BorderPalettes call Func_7210b xor a ld [wcf2d], a ld de, PalTrnPacket ld hl, SuperPalettes call Func_7210b call ClearVram ld hl, MaskEnCancelPacket 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 MaskEnFreezePacket dw DataSnd_72548 dw DataSnd_72558 dw DataSnd_72568 dw DataSnd_72578 dw DataSnd_72588 dw DataSnd_72598 dw DataSnd_725a8 dw DataSnd_725b8 CheckSGB: ; 7209b (1c:609b) ld hl, MltReq2Packet 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, MltReq1Packet call SendSGBPacket jp Wait7000 Func_7210b: ; 7210b (1c:610b) di push de call DisableLCD ld a, $e4 ld [rBGP], a ld de, vChars1 ld a, [wcf2d] and a jr z, .asm_72122 call Func_72188 jr .asm_72128 .asm_72122 ld bc, $1000 call CopyData .asm_72128 ld hl, vBGMap0 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 pop hl call SendSGBPacket xor a ld [rBGP], a ei ret Wait7000: ; 7214a (1c:614a) ; Each loop takes 9 cycles so this routine actually waits 63000 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, [wGBC] 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"