diff options
author | U-Fish-PC\Daniel <corrnondacqb@yahoo.com> | 2014-05-22 18:13:20 -0400 |
---|---|---|
committer | U-Fish-PC\Daniel <corrnondacqb@yahoo.com> | 2014-05-22 18:13:20 -0400 |
commit | 15427f532085846ab6b51719be687951a094cb6c (patch) | |
tree | edea9b189e91641a12dd521756894df84aeeace7 /engine/palettes.asm | |
parent | ea3ba4cde3706b7c77efb705555ec0c86321cbe2 (diff) |
Pull a lot of engine out of main.asm
Diffstat (limited to 'engine/palettes.asm')
-rwxr-xr-x | engine/palettes.asm | 620 |
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" |