diff options
-rw-r--r-- | constants/misc_constants.asm | 9 | ||||
-rw-r--r-- | data/bg_map_attributes.asm | 26 | ||||
-rwxr-xr-x | data/super_palettes.asm | 2 | ||||
-rw-r--r-- | engine/bg_map_attributes.asm | 26 | ||||
-rw-r--r-- | engine/joypad.asm | 4 | ||||
-rwxr-xr-x | engine/palettes.asm | 786 | ||||
-rw-r--r-- | home.asm | 56 | ||||
-rw-r--r-- | hram.asm | 3 | ||||
-rwxr-xr-x | wram.asm | 12 |
9 files changed, 417 insertions, 507 deletions
diff --git a/constants/misc_constants.asm b/constants/misc_constants.asm index 5bc12b88..e5793239 100644 --- a/constants/misc_constants.asm +++ b/constants/misc_constants.asm @@ -228,3 +228,12 @@ const_value set 1 const PIKAHAPPY_PSNFNT const PIKAHAPPY_CARELESSTRAINER const PIKAHAPPY_TRADE + +; DMGPalToGBCPal +CONVERT_BGP EQU 0 +CONVERT_OBP0 EQU 1 +CONVERT_OBP1 EQU 2 + +NUM_COLORS EQU 4 +PAL_SIZE EQU NUM_COLORS * 2 +NUM_ACTIVE_PALS EQU 4 diff --git a/data/bg_map_attributes.asm b/data/bg_map_attributes.asm index ea7aaa1a..d1bcfb14 100644 --- a/data/bg_map_attributes.asm +++ b/data/bg_map_attributes.asm @@ -1,4 +1,4 @@ -BGMapAttributes1: ; bd000 (2f:5000) +BGMapAttributes_Unknown1: ; bd000 (2f:5000) db $23 dw $000d db $00 @@ -33,7 +33,7 @@ BGMapAttributes1: ; bd000 (2f:5000) db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -BGMapAttributes2: ; bd250 (2f:5250) +BGMapAttributes_Unknown2: ; bd250 (2f:5250) db $23 dw $000d db $00 @@ -68,7 +68,7 @@ BGMapAttributes2: ; bd250 (2f:5250) db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -BGMapAttributes3: ; bd4a0 (2f:54a0) +BGMapAttributes_GameFreakIntro: ; bd4a0 (2f:54a0) db $23 dw $000d db $00 @@ -103,7 +103,7 @@ BGMapAttributes3: ; bd4a0 (2f:54a0) db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -BGMapAttributes4: ; bd6f0 (2f:56f0) +BGMapAttributes_TrainerCard: ; bd6f0 (2f:56f0) db $23 dw $000d db $00 @@ -138,7 +138,7 @@ BGMapAttributes4: ; bd6f0 (2f:56f0) db $00,$00,$00,$02,$02,$00,$00,$03,$03,$00,$00,$02,$02,$00,$00,$01,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -BGMapAttributes5: ; bd940 (2f:5940) +BGMapAttributes_PartyMenu: ; bd940 (2f:5940) db $23 dw $000d db $00 @@ -173,7 +173,7 @@ BGMapAttributes5: ; bd940 (2f:5940) db $01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -BGMapAttributes6: ; bdb90 (2f:5b90) +BGMapAttributes_NidorinoIntro: ; bdb90 (2f:5b90) db $23 dw $000d db $00 @@ -208,7 +208,7 @@ BGMapAttributes6: ; bdb90 (2f:5b90) db $01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -BGMapAttributes7: ; bdde0 (2f:5de0) +BGMapAttributes_TitleScreen: ; bdde0 (2f:5de0) db $23 dw $024d db $00 @@ -262,7 +262,7 @@ BGMapAttributes7: ; bdde0 (2f:5de0) db $02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -BGMapAttributes8: ; be270 (2f:6270) +BGMapAttributes_Slots: ; be270 (2f:6270) db $23 dw $000d db $00 @@ -297,7 +297,7 @@ BGMapAttributes8: ; be270 (2f:6270) db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -BGMapAttributes9: ; be4c0 (2f:64c0) +BGMapAttributes_Pokedex: ; be4c0 (2f:64c0) db $23 dw $000d db $00 @@ -332,7 +332,7 @@ BGMapAttributes9: ; be4c0 (2f:64c0) db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -BGMapAttributes10: ; be710 (2f:6710) +BGMapAttributes_StatusScreen: ; be710 (2f:6710) db $23 dw $000d db $00 @@ -367,7 +367,7 @@ BGMapAttributes10: ; be710 (2f:6710) db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -BGMapAttributes11: ; be960 (2f:6960) +BGMapAttributes_Battle: ; be960 (2f:6960) db $23 dw $000d db $00 @@ -402,7 +402,7 @@ BGMapAttributes11: ; be960 (2f:6960) db $02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -BGMapAttributes12: ; bebb0 (2f:6bb0) +BGMapAttributes_WholeScreen: ; bebb0 (2f:6bb0) db $3f dw $000d db $00 @@ -451,7 +451,7 @@ BGMapAttributes12: ; bebb0 (2f:6bb0) db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -BGMapAttributes13: ; befc0 (2f:6fc0) +BGMapAttributes_Unknown13: ; befc0 (2f:6fc0) db $23 dw $024d db $00 diff --git a/data/super_palettes.asm b/data/super_palettes.asm index dc7b4f74..f5ec3d86 100755 --- a/data/super_palettes.asm +++ b/data/super_palettes.asm @@ -199,7 +199,7 @@ SuperPalettes: RGB 31, 25, 9 RGB 6, 6, 6 -Pointer_72af9: +GBCBasePalettes: RGB 31, 31, 31 RGB 16, 31, 4 RGB 11, 23, 31 diff --git a/engine/bg_map_attributes.asm b/engine/bg_map_attributes.asm index 5adfd038..c8076728 100644 --- a/engine/bg_map_attributes.asm +++ b/engine/bg_map_attributes.asm @@ -106,19 +106,19 @@ LoadBGMapAttributes:: ; bf450 (2f:7450) ret BGMapAttributesPointers: ; bf4de (2f:74de) - dw BGMapAttributes1 - dw BGMapAttributes2 - dw BGMapAttributes3 - dw BGMapAttributes4 - dw BGMapAttributes5 - dw BGMapAttributes6 - dw BGMapAttributes7 - dw BGMapAttributes8 - dw BGMapAttributes9 - dw BGMapAttributes10 - dw BGMapAttributes11 - dw BGMapAttributes12 - dw BGMapAttributes13 + dw BGMapAttributes_Unknown1 + dw BGMapAttributes_Unknown2 + dw BGMapAttributes_GameFreakIntro + dw BGMapAttributes_TrainerCard + dw BGMapAttributes_PartyMenu + dw BGMapAttributes_NidorinoIntro + dw BGMapAttributes_TitleScreen + dw BGMapAttributes_Slots + dw BGMapAttributes_Pokedex + dw BGMapAttributes_StatusScreen + dw BGMapAttributes_Battle + dw BGMapAttributes_WholeScreen + dw BGMapAttributes_Unknown13 HandleBadgeFaceAttributes: ; bf4f8 (2f:74f8) ; zero out the attributes if the player doesn't have the respective badge diff --git a/engine/joypad.asm b/engine/joypad.asm index f73d77b2..2b85cb61 100644 --- a/engine/joypad.asm +++ b/engine/joypad.asm @@ -2,10 +2,10 @@ ReadJoypad_:: ; c000 (3:4000) ; Poll joypad input. ; Unlike the hardware register, button ; presses are indicated by a set bit. - ld a, [hReadJoypad] + ld a, [hDisableJoypadPolling] and a ret nz - + ld a, 1 << 5 ; select direction keys ;ld c, 0 diff --git a/engine/palettes.asm b/engine/palettes.asm index 56b77411..f5a3ed49 100755 --- a/engine/palettes.asm +++ b/engine/palettes.asm @@ -164,9 +164,9 @@ SetPal_Overworld: ; 71fa5 (1c:5fa5) cp BRUNOS_ROOM jr z, .caveOrBruno cp TRADE_CENTER - jr z,.asm_71ffd + jr z, .asm_71ffd cp COLOSSEUM - jr z,.asm_71ffd + jr z, .asm_71ffd .normalDungeonOrBuilding ld a, [wLastMap] ; town or route that current dungeon or building is located .townOrRoute @@ -191,9 +191,9 @@ SetPal_Overworld: ; 71fa5 (1c:5fa5) xor a jr .town .asm_71ffd - ld a,$18 + ld a, $18 jr .town - + ; used when a Pokemon is the only thing on the screen ; such as evolution, trading and the Hall of Fame SetPal_PokemonWholeScreen: ; 72001 (1c:6001) @@ -256,13 +256,13 @@ SetPal_TrainerCard: ; 72025 (1c:6025) ret SendUnknownPalPacket_7205d:: ; 7205d (1c:605d) - ld hl,UnknownPalPacket_72811 - ld de,BlkPacket_WholeScreen + ld hl, UnknownPalPacket_72811 + ld de, BlkPacket_WholeScreen ret - + SendUnknownPalPacket_72064:: ; 72064 (1c:6064) - ld hl,UnknownPalPacket_72821 - ld de,UnknownPacket_72751 + ld hl, UnknownPalPacket_72821 + ld de, UnknownPacket_72751 ret SetPalFunctions: ; 7206b (1c:606b) @@ -314,75 +314,75 @@ DeterminePaletteIDOutOfBattle: ; 72094 (1c:6094) ret Func_720ad:: ; 720ad (1c:60ad) - ld a,e + ld a, e and a - jr nz,Func_720bd - ld hl,PalPacket_Generic - ld a,[hGBC] + jr nz, Func_720bd + ld hl, PalPacket_Generic + ld a, [hGBC] and a - jp z,Func_721b4 + jp z, SendSGBPacket jp InitGBCPalettes Func_720bd:: ; 720bd (1c:60bd) - ld hl,UnknownPalPacket_72811 - ld a,[hGBC] + ld hl, UnknownPalPacket_72811 + ld a, [hGBC] and a - jp z,Func_721b4 + jp z, SendSGBPacket call InitGBCPalettes - ld hl,PalPacket_Generic + ld hl, PalPacket_Generic inc hl - ld a,[hli] - call Func_723fe - ld a,e - ld [wPalDataPointer2],a - ld a,d - ld [wPalDataPointer2+1],a - xor a - call UpdatePalData - ld a,$1 + ld a, [hli] + call GetGBCBasePalAddress + ld a, e + ld [wGBCBasePalPointers + 2], a + ld a, d + ld [wGBCBasePalPointers + 2 + 1], a + xor a ; CONVERT_BGP + call DMGPalToGBCPal + ld a, 1 call TransferCurBGPData ret - + Func_720e3:: ; 720e3 (1c:60e3) - ld hl,PalPacket_Empty - ld de,wPalPacket - ld bc,$10 + ld hl, PalPacket_Empty + ld de, wPalPacket + ld bc, $10 call CopyData call Func_7213b - ld hl,wPartyMenuBlkPacket - ld [hl],a - ld hl,wPartyMenuBlkPacket + 2 - ld a,$26 - ld [hl],a - ld hl,wPalPacket - ld a,[hGBC] + ld hl, wPartyMenuBlkPacket + ld [hl], a + ld hl, wPartyMenuBlkPacket + 2 + ld a, $26 + ld [hl], a + ld hl, wPalPacket + ld a, [hGBC] and a - jr nz,.asm_72109 - call Func_721b4 + jr nz, .asm_72109 + call SendSGBPacket jr .asm_7210c .asm_72109 call InitGBCPalettes .asm_7210c - ld hl,BlkPacket_WholeScreen - ld de,wPalPacket - ld bc,$10 + ld hl, BlkPacket_WholeScreen + ld de, wPalPacket + ld bc, $10 call CopyData - ld hl,wPartyMenuBlkPacket + 2 - ld a,$5 - ld [hli],a - ld a,$7 - ld [hli],a - ld a,$6 - ld [hli],a - ld a,$b - ld [hli],a - ld a,$a - ld [hl],a - ld hl,wPalPacket - ld a,[hGBC] + ld hl, wPartyMenuBlkPacket + 2 + ld a, $5 + ld [hli], a + ld a, $7 + ld [hli], a + ld a, $6 + ld [hli], a + ld a, $b + ld [hli], a + ld a, $a + ld [hl], a + ld hl, wPalPacket + ld a, [hGBC] and a - jr nz,.asm_72137 - call Func_721b4 + jr nz, .asm_72137 + call SendSGBPacket jr .asm_7213a .asm_72137 call InitGBCPalettes @@ -408,9 +408,9 @@ Func_7213b:: ; 7213b (1c:613b) cp BRUNOS_ROOM jr z, .caveOrBruno cp TRADE_CENTER - jr z,.battleOrTradeCenter + jr z, .battleOrTradeCenter cp COLOSSEUM - jr z,.battleOrTradeCenter + jr z, .battleOrTradeCenter .normalDungeonOrBuilding ld a, [wLastMap] ; town or route that current dungeon or building is located .townOrRoute @@ -430,7 +430,7 @@ Func_7213b:: ; 7213b (1c:613b) xor a jr .town .battleOrTradeCenter - ld a,$18 + ld a, $18 jr .town InitPartyMenuBlkPacket: ; 7217f (1c:617f) @@ -467,68 +467,65 @@ UpdatePartyMenuBlkPacket: ; 7218b (1c:618b) ld [hl], e ret -Func_721b4: ; 721b4 (1c:61b4) - ld a,$1 -; 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 [hReadJoypad],a - call SendSGBPacket +SendSGBPacket: ; 721b4 (1c:61b4) + ld a, 1 + ld [hDisableJoypadPolling], a ; don't poll joypad while sending packet + call _SendSGBPacket xor a - ld [hReadJoypad],a + ld [hDisableJoypadPolling], a ret - -SendSGBPacket: ; 71feb (1c:5feb) + +_SendSGBPacket: ; 71feb (1c:5feb) ;check number of packets - ld a,[hl] - and a,$07 + ld a, [hl] + and a, $07 ret z ; store number of packets in B - ld b,a + ld b, a .loop2 ; save B for later use push bc ; send RESET signal (P14=LOW, P15=LOW) xor a - ld [rJOYP],a + ld [rJOYP], a ; set P14=HIGH, P15=HIGH - ld a,$30 - ld [rJOYP],a + ld a, $30 + ld [rJOYP], a ;load length of packets (16 bytes) - ld b,$10 + ld b, $10 .nextByte ;set bit counter (8 bits per byte) - ld e,$08 + ld e, $08 ; get next byte in the packet - ld a,[hli] - ld d,a + 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 + 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 [rJOYP],a -; must set P14=HIGH,P15=HIGH between each "pulse" - ld a,$30 - ld [rJOYP],a + ld [rJOYP], a +; must set P14=HIGH, P15=HIGH between each "pulse" + ld a, $30 + ld [rJOYP], 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) +; "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 + jr nz, .nextBit0 dec b - jr nz,.nextByte + jr nz, .nextByte ; send bit 1 as a "stop bit" (end of parameter data) - ld a,$20 - ld [rJOYP],a -; set P14=HIGH,P15=HIGH - ld a,$30 - ld [rJOYP],a - call Wait7000 + ld a, $20 + ld [rJOYP], a +; set P14=HIGH, P15=HIGH + ld a, $30 + ld [rJOYP], a + call Wait7000 ; wait for about 70000 cycles ; call Wait7000 ; restore (previously pushed) number of packets @@ -574,7 +571,7 @@ LoadSGB: ; 721f8 (1c:61f8) call CopyGfxToSuperNintendoVRAM call ClearVram ld hl, MaskEnCancelPacket - jp Func_721b4 + jp SendSGBPacket PrepareSuperNintendoVRAMTransfer: ; 72247 (1c:6247) ld hl, .packetPointers @@ -585,7 +582,7 @@ PrepareSuperNintendoVRAMTransfer: ; 72247 (1c:6247) push hl ld h, [hl] ld l, a - call Func_721b4 + call SendSGBPacket pop hl inc hl pop bc @@ -607,7 +604,7 @@ PrepareSuperNintendoVRAMTransfer: ; 72247 (1c:6247) CheckSGB: ; 7226d (1c:626d) ld hl, MltReq2Packet - call Func_721b4 + call SendSGBPacket call Wait7000 ld a, [rJOYP] and $3 @@ -654,7 +651,7 @@ CheckSGB: ; 7226d (1c:626d) SendMltReq1Packet: ; 722ce (1c:62ce) ld hl, MltReq1Packet - call Func_721b4 + call SendSGBPacket jp Wait7000 CopyGfxToSuperNintendoVRAM: ; 722d7 (1c:62d7) @@ -662,7 +659,7 @@ CopyGfxToSuperNintendoVRAM: ; 722d7 (1c:62d7) push de call DisableLCD ld a, $e4 - ld [rBGP], a ; $ff47 + ld [rBGP], a call _UpdateGBCPal_BGP_CheckDMG ld de, vChars1 ld a, [wCopyingSGBTileData] @@ -691,9 +688,9 @@ CopyGfxToSuperNintendoVRAM: ; 722d7 (1c:62d7) ld a, $e3 ld [rLCDC], a pop hl - call Func_721b4 + call SendSGBPacket xor a - ld [rBGP], a ; $ff47 + ld [rBGP], a call _UpdateGBCPal_BGP_CheckDMG ei ret @@ -719,434 +716,346 @@ SendSGBPackets: ; 72328 (1c:6328) call InitGBCPalettes pop hl call InitGBCPalettes - ld a,[rLCDC] + ld a, [rLCDC] and rLCDC_ENABLE_MASK ret z call Delay3 ret .notGBC push de - call Func_721b4 + call SendSGBPacket pop hl - jp Func_721b4 + jp SendSGBPacket InitGBCPalettes: ; 72346 (1c:6346) - ld a,[hl] + ld a, [hl] and $f8 cp $20 - jp z,Func_725be - inc hl - ld a,[hli] - inc hl - push hl - call Func_723fe - ld a,e - ld [wPalDataPointer1],a - ld a,d - ld [wPalDataPointer1+1],a - - xor a - call UpdatePalData - ld a,$0 - call TransferCurBGPData - ld a,$1 - call UpdatePalData - ld a,$0 - call TransferCurOBPData - ld a,$2 - call UpdatePalData - ld a,$4 - call TransferCurOBPData - - pop hl - ld a,[hli] - inc hl - push hl - call Func_723fe - ld a,e - ld [wPalDataPointer2],a - ld a,d - ld [wPalDataPointer2+1],a - - xor a - call UpdatePalData - ld a,$1 - call TransferCurBGPData - ld a,$1 - call UpdatePalData - ld a,$1 - call TransferCurOBPData - ld a,$2 - call UpdatePalData - ld a,$5 - call TransferCurOBPData - - pop hl - ld a,[hli] - inc hl - push hl - call Func_723fe - ld a,e - ld [wPalDataPointer3],a - ld a,d - ld [wPalDataPointer3+1],a - - xor a - call UpdatePalData - ld a,$2 - call TransferCurBGPData - ld a,$1 - call UpdatePalData - ld a,$2 - call TransferCurOBPData - ld a,$2 - call UpdatePalData - ld a,$6 - call TransferCurOBPData - - pop hl - ld a,[hli] + jp z, TranslatePalPacketToBGMapAttributes + inc hl - call Func_723fe - ld a,e - ld [wPalDataPointer4],a - ld a,d - ld [wPalDataPointer4+1],a - - xor a - call UpdatePalData - ld a,$3 - call TransferCurBGPData - ld a,$1 - call UpdatePalData - ld a,$3 - call TransferCurOBPData - ld a,$2 - call UpdatePalData - ld a,$7 - call TransferCurOBPData - + +index = 0 + + REPT NUM_ACTIVE_PALS + IF index > 0 + pop hl + ENDC + + ld a, [hli] + inc hl + + IF index < (NUM_ACTIVE_PALS + -1) + push hl + ENDC + + call GetGBCBasePalAddress + ld a, e + ld [wGBCBasePalPointers + index * 2], a + ld a, d + ld [wGBCBasePalPointers + index * 2 + 1], a + + xor a ; CONVERT_BGP + call DMGPalToGBCPal + ld a, index + call TransferCurBGPData + + ld a, CONVERT_OBP0 + call DMGPalToGBCPal + ld a, index + call TransferCurOBPData + + ld a, CONVERT_OBP1 + call DMGPalToGBCPal + ld a, index + 4 + call TransferCurOBPData + +index = index + 1 + ENDR + ret - -Func_723fe:: ; 723fe (1c:63fe) + +GetGBCBasePalAddress:: ; 723fe (1c:63fe) +; Input: a = palette ID +; Output: de = palette address push hl - ld l,a + ld l, a xor a - ld h,a - add hl,hl - add hl,hl - add hl,hl - ld de,Pointer_72af9 ; not exactly sure if actually super palettes - add hl,de - ld a,l - ld e,a - ld a,h - ld d,a + ld h, a + add hl, hl + add hl, hl + add hl, hl + ld de, GBCBasePalettes + add hl, de + ld a, l + ld e, a + ld a, h + ld d, a pop hl ret - -UpdatePalData:: ; 7240f (1c:640f) + +DMGPalToGBCPal:: ; 7240f (1c:640f) +; Populate wGBCPal with colors from a base palette, selected using one of the +; DMG palette registers. +; Input: +; a = which DMG palette register +; de = address of GBC base palette and a - jr nz,.notBGP - ld a,[rBGP] - ld [wLastBGP],a - jr .continue + jr nz, .notBGP + ld a, [rBGP] + ld [wLastBGP], a + jr .convert .notBGP dec a - jr nz,.notOBP0 - ld a,[rOBP0] - ld [wLastOBP0],a - jr .continue + jr nz, .notOBP0 + ld a, [rOBP0] + ld [wLastOBP0], a + jr .convert .notOBP0 - ld a,[rOBP1] - ld [wLastOBP1],a -.continue - ld b,a ; save current GBP shade - and $3 ; get first shade - call GetPaletteShade - ld a,[hli] ; store in palette buffer - ld [wPalDataBuffer1],a - ld a,[hl] - ld [wPalDataBuffer1+1],a - ld a,b ; get second shade - rrca - rrca - ld b,a - and $3 - call GetPaletteShade - ld a,[hli] ; store in second buffer - ld [wPalDataBuffer2],a - ld a,[hl] - ld [wPalDataBuffer2+1],a - ld a,b - rrca - rrca - ld b,a - and $3 - call GetPaletteShade - ld a,[hli] - ld [wPalDataBuffer3],a - ld a,[hl] - ld [wPalDataBuffer3+1],a - ld a,b - rrca - rrca - ld b,a - and $3 - call GetPaletteShade - ld a,[hli] - ld [wPalDataBuffer4],a - ld a,[hl] - ld [wPalDataBuffer4+1],a + ld a, [rOBP1] + ld [wLastOBP1], a +.convert +color_index = 0 + REPT NUM_COLORS + ld b, a + and %11 + call .GetColorAddress + ld a, [hli] + ld [wGBCPal + color_index * 2], a + ld a, [hl] + ld [wGBCPal + color_index * 2 + 1], a + + IF color_index < (NUM_COLORS + -1) + ld a, b + rrca + rrca + ENDC + +color_index = color_index + 1 + ENDR ret - -GetPaletteShade:: ; 7246a (1c:646a) + +.GetColorAddress: ; 7246a (1c:646a) add a - ld l,a + ld l, a xor a - ld h,a - add hl,de + ld h, a + add hl, de ret - + TransferCurBGPData:: ; 72470 (1c:6470) push de add a add a add a - or $80 - ld [rBGPI],a - ld de,rBGPD - ld hl,wPalDataBuffer1 - ld b,%10 ; searching oam STAT mode - ld a,[rLCDC] + or $80 ; auto-increment + ld [rBGPI], a + ld de, rBGPD + ld hl, wGBCPal + ld b, %10 ; mask for non-V-blank/non-H-blank STAT mode + ld a, [rLCDC] and rLCDC_ENABLE_MASK - jr nz,.lcdenabled - rept 4 - call TransferCurPalDataLCDDisabled + jr nz, .lcdEnabled + rept NUM_COLORS + call TransferPalColorLCDDisabled endr jr .done -.lcdenabled - rept 4 - call TransferCurPalDataLCDEnabled +.lcdEnabled + rept NUM_COLORS + call TransferPalColorLCDEnabled endr .done pop de ret -WriteCurBGPDataToMainBuffer:: ; 724a2 (1c:64a2) +BufferBGPPal:: ; 724a2 (1c:64a2) +; Copy wGBCPal to palette a in wBGPPalsBuffer. push de add a add a - add a ; get the ath entry with size of 8 bytes (4 pal entries) - ld l,a + add a + ld l, a xor a - ld h,a - ld de,wStoredBGPPalettes - add hl,de - ld de,wPalDataBuffer1 - ld c,$8 + ld h, a + ld de, wBGPPalsBuffer + add hl, de + ld de, wGBCPal + ld c, PAL_SIZE .loop - ld a,[de] ; copy to main buffer - ld [hli],a + ld a, [de] + ld [hli], a inc de dec c - jr nz,.loop + jr nz, .loop pop de ret -PreparePalDataTransfer:: ; 724ba (1c:64ba) -; wait for vblank period unless LCD is disabled - ld a,[rLCDC] +TransferBGPPals:: ; 724ba (1c:64ba) +; Transfer the buffered BG palettes. + ld a, [rLCDC] and rLCDC_ENABLE_MASK - jr z,.lcddisabled + jr z, .lcdDisabled di -.waitloop - ld a,[rLY] +.waitLoop + ld a, [rLY] cp 144 - jr c,.waitloop -.lcddisabled - call TransferPalData + jr c, .waitLoop +.lcdDisabled + call .DoTransfer ei ret -TransferPalData: ; 724cc (1c:64cc) +.DoTransfer: ; 724cc (1c:64cc) xor a - or $80 + or $80 ; auto-increment ld [rBGPI], a - ld de,rBGPD - ld hl,wStoredBGPPalettes - ld c,$20 + ld de, rBGPD + ld hl, wBGPPalsBuffer + ld c, 4 * PAL_SIZE .loop - ld a,[hli] - ld [de],a + ld a, [hli] + ld [de], a dec c - jr nz,.loop + jr nz, .loop ret - + TransferCurOBPData: ; 724df (1c:64df) push de add a add a add a - or $80 - ld [rOBPI],a - ld de,rOBPD - ld hl,wPalDataBuffer1 - ld b,%10 ; searching oam STAT mode - ld a,[rLCDC] + or $80 ; auto-increment + ld [rOBPI], a + ld de, rOBPD + ld hl, wGBCPal + ld b, %10 ; mask for non-V-blank/non-H-blank STAT mode + ld a, [rLCDC] and rLCDC_ENABLE_MASK - jr nz,.lcdenabled - rept 4 - call TransferCurPalDataLCDDisabled + jr nz, .lcdEnabled + rept NUM_COLORS + call TransferPalColorLCDDisabled endr jr .done -.lcdenabled - rept 4 - call TransferCurPalDataLCDEnabled +.lcdEnabled + rept NUM_COLORS + call TransferPalColorLCDEnabled endr .done pop de ret - -TransferCurPalDataLCDEnabled: ; 72511 (1c:6511) - ld a,[rSTAT] + +TransferPalColorLCDEnabled: ; 72511 (1c:6511) +; Transfer a palette color while the LCD is enabled. + +; In case we're already in H-blank or V-blank, wait for it to end. This is a +; precaution so that the transfer doesn't extend past the blanking period. + ld a, [rSTAT] and b - jr z,TransferCurPalDataLCDEnabled ; wait for non-vblank/hblank period - ; this is a precaution in-case we're nearing the end of vblank/hblank -.notinhblank - ld a,[rSTAT] + jr z, TransferPalColorLCDEnabled + +; Wait for H-blank or V-blank to begin. +.notInBlankingPeriod + ld a, [rSTAT] and b - jr nz,.notinhblank ; wait if transferring oam or data to lcd driver -TransferCurPalDataLCDDisabled: ; 7251b (1c:651b) - ld a,[hli] - ld [de],a - ld a,[hli] - ld [de],a + jr nz, .notInBlankingPeriod +; fall through + +TransferPalColorLCDDisabled: ; 7251b (1c:651b) +; Transfer a palette color while the LCD is disabled. + ld a, [hli] + ld [de], a + ld a, [hli] + ld [de], a ret _UpdateGBCPal_BGP_CheckDMG:: ; 72520 (1c:6520) - ld a,[hGBC] + ld a, [hGBC] and a ret z -; fallthrough +; fall through + _UpdateGBCPal_BGP:: ; 72524 (1c:6524) - ld a,[wPalDataPointer1] - ld e,a - ld a,[wPalDataPointer1+1] - ld d,a - xor a - call UpdatePalData - ld a,$0 - call WriteCurBGPDataToMainBuffer - ld a,[wPalDataPointer2] - ld e,a - ld a,[wPalDataPointer2+1] - ld d,a - xor a - call UpdatePalData - ld a,$1 - call WriteCurBGPDataToMainBuffer - ld a,[wPalDataPointer3] - ld e,a - ld a,[wPalDataPointer3+1] - ld d,a - xor a - call UpdatePalData - ld a,$2 - call WriteCurBGPDataToMainBuffer - ld a,[wPalDataPointer4] - ld e,a - ld a,[wPalDataPointer4+1] - ld d,a - xor a - call UpdatePalData - ld a,$3 - call WriteCurBGPDataToMainBuffer - call PreparePalDataTransfer +index = 0 + + REPT NUM_ACTIVE_PALS + ld a, [wGBCBasePalPointers + index * 2] + ld e, a + ld a, [wGBCBasePalPointers + index * 2 + 1] + ld d, a + xor a ; CONVERT_BGP + call DMGPalToGBCPal + ld a, index + call BufferBGPPal + +index = index + 1 + ENDR + + call TransferBGPPals ret - + _UpdateGBCPal_OBP:: ; 7256c (1c:656c) - ld a,[wPalDataPointer1] - ld e,a - ld a,[wPalDataPointer1+1] - ld d,a - ld a,c - call UpdatePalData - ld a,c - dec a - rlca - rlca - call TransferCurOBPData - ld a,[wPalDataPointer2] - ld e,a - ld a,[wPalDataPointer2+1] - ld d,a - ld a,c - call UpdatePalData - ld a,c - dec a - rlca - rlca - inc a - call TransferCurOBPData - ld a,[wPalDataPointer3] - ld e,a - ld a,[wPalDataPointer3+1] - ld d,a - ld a,c - call UpdatePalData - ld a,c - dec a - rlca - rlca - add $2 - call TransferCurOBPData - ld a,[wPalDataPointer4] - ld e,a - ld a,[wPalDataPointer4+1] - ld d,a - ld a,c - call UpdatePalData - ld a,c - dec a - rlca - rlca - add $3 - call TransferCurOBPData +index = 0 + + REPT NUM_ACTIVE_PALS + ld a, [wGBCBasePalPointers + index * 2] + ld e, a + ld a, [wGBCBasePalPointers + index * 2 + 1] + ld d, a + ld a, c + call DMGPalToGBCPal + ld a, c + dec a + rlca + rlca + + IF index > 0 + IF index == 1 + inc a + ELSE + add index + ENDC + ENDC + + call TransferCurOBPData + +index = index + 1 + ENDR + ret - -Func_725be:: ; 725be (1c:65be) -; translate the sgb pal packets into something usable for the CGB + +TranslatePalPacketToBGMapAttributes:: ; 725be (1c:65be) +; translate the SGB pal packets into something usable for the GBC push hl pop de - ld hl,PalPacketPointers - ld a,[hli] - ld c,a -.asm_725c5 - ld a,e + ld hl, PalPacketPointers + ld a, [hli] + ld c, a .loop + ld a, e +.innerLoop cp [hl] - jr z,.asm_725cf + jr z, .checkHighByte inc hl inc hl dec c - jr nz,.loop + jr nz, .innerLoop ret -.asm_725cf +.checkHighByte +; the low byte of pointer matched, so check the high byte inc hl - ld a,d + ld a, d cp [hl] - jr z,.asm_725d9 + jr z, .foundMatchingPointer inc hl dec c - jr nz,.asm_725c5 + jr nz, .loop ret -.asm_725d9 - callba LoadBGMapAttributes ; 2f:7250 +.foundMatchingPointer + callba LoadBGMapAttributes ret PalPacketPointers:: ; 725e2 (1c:65e2) - db (palPacketPointersEnd - palPacketPointers) / $2 + db (palPacketPointersEnd - palPacketPointers) / 2 palPacketPointers dw BlkPacket_WholeScreen dw BlkPacket_Battle @@ -1161,7 +1070,7 @@ palPacketPointers dw wPalPacket dw UnknownPacket_72751 palPacketPointersEnd - + CopySGBBorderTiles: ; 725fb (1c:65fb) ; SGB tile data is stored in a 4BPP planar format. ; Each tile is 32 bytes. The first 16 bytes contain bit planes 1 and 2, while @@ -1192,7 +1101,6 @@ CopySGBBorderTiles: ; 725fb (1c:65fb) jr nz, .tileLoop ret - ;dr $725e2,$734b9 INCLUDE "data/sgb_packets.asm" INCLUDE "data/mon_palettes.asm" @@ -2326,73 +2326,73 @@ DisplayTextBoxID:: ; 3010 (0:3010) UpdateGBCPal_BGP:: ; 3021 (0:3021) push af - ld a,[hGBC] + ld a, [hGBC] and a - jr z,.notgbc + jr z, .notGBC push bc push de push hl - ld a,[rBGP] - ld b,a - ld a,[wLastBGP] + ld a, [rBGP] + ld b, a + ld a, [wLastBGP] cp b - jr z,.noChangeInBGP - callba _UpdateGBCPal_BGP ; 1c:6524 + jr z, .noChangeInBGP + callba _UpdateGBCPal_BGP .noChangeInBGP pop hl pop de pop bc -.notgbc +.notGBC pop af ret UpdateGBCPal_OBP0:: ; 3040 (0:3040) push af - ld a,[hGBC] + ld a, [hGBC] and a - jr z,.notgbc + jr z, .notGBC push bc push de push hl - ld a,[rOBP0] - ld b,a - ld a,[wLastOBP0] + ld a, [rOBP0] + ld b, a + ld a, [wLastOBP0] cp b - jr z,.noChangeInOBP0 - ld b,BANK(_UpdateGBCPal_OBP) ; 1c:656c - ld hl,_UpdateGBCPal_OBP - ld c,$1 + jr z, .noChangeInOBP0 + ld b, BANK(_UpdateGBCPal_OBP) + ld hl, _UpdateGBCPal_OBP + ld c, CONVERT_OBP0 call Bankswitch .noChangeInOBP0 pop hl pop de pop bc -.notgbc +.notGBC pop af ret UpdateGBCPal_OBP1:: ; 3061 (0:3061) push af - ld a,[hGBC] + ld a, [hGBC] and a - jr z,.notgbc + jr z, .notGBC push bc push de push hl - ld a,[rOBP1] - ld b,a - ld a,[wLastOBP1] + ld a, [rOBP1] + ld b, a + ld a, [wLastOBP1] cp b - jr z,.noChangeInOBP1 - ld b,BANK(_UpdateGBCPal_OBP) - ld hl,_UpdateGBCPal_OBP - ld c,$2 + jr z, .noChangeInOBP1 + ld b, BANK(_UpdateGBCPal_OBP) + ld hl, _UpdateGBCPal_OBP + ld c, CONVERT_OBP1 call Bankswitch .noChangeInOBP1 pop hl pop de pop bc -.notgbc +.notGBC pop af ret @@ -315,8 +315,7 @@ hLCDCPointer EQU $FFF4 hJoyInput EQU $FFF5 -hReadJoypad EQU $FFF8 ; 0 to read joypad, anything else skips joypad check - ; written to in palettes.asm +hDisableJoypadPolling EQU $FFF8 ; non-zero value disables polling of joypad ; bit 0: draw HP fraction to the right of bar instead of below (for party menu) ; bit 1: menu is double spaced @@ -3299,19 +3299,13 @@ wBoxMonNicks:: ds NAME_LENGTH * MONS_PER_BOX ; de06 wBoxMonNicksEnd:: ; dee1 wBoxDataEnd:: -wPalDataPointer1:: ds 2 ; dee1 -wPalDataPointer2:: ds 2 ; dee3 -wPalDataPointer3:: ds 2 ; dee5 -wPalDataPointer4:: ds 2 ; dee7 -wPalDataBuffer1:: ds 2 ; dee9 -wPalDataBuffer2:: ds 2 ; deeb -wPalDataBuffer3:: ds 2 ; deed -wPalDataBuffer4:: ds 2 ; deef +wGBCBasePalPointers:: ds NUM_ACTIVE_PALS * 2 ; dee1 +wGBCPal:: ds PAL_SIZE ; dee9 wLastBGP:: ds 1 ; def1 wLastOBP0:: ds 1 ; def2 wLastOBP1:: ds 1 ; def3 wdef5:: ds 1 ; def4 -wStoredBGPPalettes:: ds 1 ; def5 +wBGPPalsBuffer:: ds NUM_ACTIVE_PALS * PAL_SIZE ; def5 SECTION "Stack", WRAMX[$dfff], BANK[1] wStack:: ; dfff |